ZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ5NDA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5Db3B5IG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTNmZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNy4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlUGx1Z2luLnByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSIyLjEiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ci1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTU4ZDA0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0ganN0X2oyZWVfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLC8KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9BZGRSZWxhdGlvbnNoaXAuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMvQWRkUmVsYXRpb25zaGlwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2YTc1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9BZGRSZWxhdGlvbnNoaXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMvUmVsYXRpb25zaGlwcy5naWYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9SZWxhdGlvbnNoaXBzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmNTJlYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9SZWxhdGlvbnNoaXBzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL241cnBkY3N0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvaW1hZ2VzL241cnBkY3N0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiZTE4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy9uNXJwZGNzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy95Y3dpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2ltYWdlcy95Y3dpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWY5Y2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9pbWFnZXMveWN3aW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9qc3RfajJlZV90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGMwNDY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvanN0X2oyZWVfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHRvYyBsYWJlbD0iSjJFRSBhcHBsaWNhdGlvbnMgLSBvcGVuIHNvdXJjZSIgdG9waWM9InRvcGljcy9jamFyY2guaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IkoyRUUgYXBwbGljYXRpb25zIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iSjJFRSBhcmNoaXRlY3R1cmUiIGhyZWY9InRvcGljcy9jamFyY2guaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJKMkVFIHBlcnNwZWN0aXZlIiBocmVmPSJ0b3BpY3MvY2pwZXJzLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGluIHRoZSBKMkVFIHBlcnNwZWN0aXZlIiBocmVmPSJ0b3BpY3MvY2p2aWV3Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2plY3RzIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cyIgaHJlZj0idG9waWNzL2NqZWFycHJvai5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyIgaHJlZj0idG9waWNzL2NqYXBwY2xpcHJvai5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCIgaHJlZj0idG9waWNzL3RqZWFyLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiIGhyZWY9InRvcGljcy90amFwcHByb2ouaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIGNvbm5lY3RvciBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdGpyYXIuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIHRhcmdldCBzZXJ2ZXJzIGZvciBKMkVFIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgcHJvamVjdHMgYW5kIGZpbGVzIj4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdGpleHBhcHAuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlIiBocmVmPSJ0b3BpY3MvdGpleHBlYXIuaHRtbCIvPgotICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIEoyRUUgcHJvamVjdHMgYW5kIGZpbGVzIj4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGUiIGhyZWY9InRvcGljcy90amltcGVhci5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUiIGhyZWY9InRvcGljcy90amltcGFwcC5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkNvcnJlY3RpbmcgY3ljbGljYWwgZGVwZW5kZW5jaWVzIGFmdGVyIGFuIEVBUiBpcyBpbXBvcnRlZCIgaHJlZj0idG9waWNzL3RqY2lyY2xlYi5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkN5Y2xpY2FsIGRlcGVuZGVuY2llcyBiZXR3ZWVuIEoyRUUgbW9kdWxlcyIgaHJlZj0idG9waWNzL2NqY2lyY2xlLmh0bWwiLz4KLSAgICAgICAgIDwvdG9waWM+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiIGhyZWY9InRvcGljcy90anZhbC5odG1sIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnMiIGhyZWY9InRvcGljcy9ydmFsZXJyLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iSjJFRSBWYWxpZGF0b3JzIiBocmVmPSJ0b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFbmFibGluZyBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uIiBocmVmPSJ0b3BpY3MvdGp2YWxhdXRvLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRW5hYmxpbmcgYnVpbGQgdmFsaWRhdGlvbiIgaHJlZj0idG9waWNzL3RqdmFsYnVpbGQuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJEaXNhYmxpbmcgYSB2YWxpZGF0b3IiIGhyZWY9InRvcGljcy90anZhbGRpc2FibGUuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iTWFudWFsbHkgdmFsaWRhdGluZyBjb2RlIiBocmVmPSJ0b3BpY3MvdGp2YWxtYW51YWwuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJTZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzIiBocmVmPSJ0b3BpY3MvdGp2YWxzZWxlY3QuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUmVmZXJlbmNlIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iSjJFRSBWYWxpZGF0b3JzIiBocmVmPSJ0b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDb21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9ucyIgaHJlZj0idG9waWNzL3J2YWxlcnIuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iTGltaXRhdGlvbnMiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJMaW1pdGF0aW9ucyBvZiBKMkVFIGRldmVsb3BtZW50IHRvb2xzIiBocmVmPSJ0b3BpY3MvcmpsaW1pdGN1cnJlbnQuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwMGE5Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUcmFuc2xhdGlvbiBJbnN0cnVjdGlvbjogc2VjdGlvbiB0byBiZSB0cmFuc2xhdGVkCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUGx1Z2luLm5hbWUgPSBKMkVFIENvbm5lY3RvciAoUkFSKSBwcm9qZWN0IGRvY3VtZW50YXRpb24KLVBsdWdpbi5wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViY2MzOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB0aGUgajJlZWFwcC5kb2MgY29tcG9uZW50ICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRGVmaW5lIFRPQ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICAgPHRvYyBmaWxlPSJqc3RfajJlZV90b2MueG1sIiAgcHJpbWFyeT0idHJ1ZSIgLz4KLSAgICAgICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqYXBwY2xpcHJvai5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NGI5ZjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcHBjbGlwcm9qLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjamFwcGNsaXByb2oiPjxhIG5hbWU9ImNqYXBwY2xpcHJvaiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0czwvaDE+Ci08ZGl2PjxwPkFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBjb250YWluIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbgotY2xpZW50IG1vZHVsZXMuIEFuIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgaXMgdXNlZCB0byBjb250YWluIGEgZnVsbC1mdW5jdGlvbgotY2xpZW50IEphdmHihKIgYXBwbGljYXRpb24gKG5vbiBXZWItYmFzZWQpIHRoYXQgY29ubmVjdHMgdG8gYW5kCi11c2VzIHRoZSBKMkVFIHJlc291cmNlcyBkZWZpbmVkIGluIHlvdXIgc2VydmVyLiBXaGVuIHlvdSBwbGFjZSB0aGUgY2xpZW50Ci1jb2RlIGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgaW5zdGVhZCBvZiBhIHNpbXBsZSBKQVIgZmlsZSwgdGhlIGFwcGxpY2F0aW9uCi1jbGllbnQgYmVuZWZpdHMgZnJvbSB0aGUgc2VydmVyJ3MgcmVzb3VyY2VzIChpdCBkb2VzIG5vdCBuZWVkIHRvIHJlLXNwZWNpZnkKLXRoZSBjbGFzcyBwYXRoIHRvIEoyRUUgYW5kIHNlcnZlciBKQVIgZmlsZXMpIGFzIHdlbGwgYXMgZnJvbSBlYXNpZXIgSk5ESSBsb29rdXAKLSh0aGUgY2xpZW50IGNvbnRhaW5lciBmaWxscyBpbiB0aGUgaW5pdGlhbCBjb250ZXh0IGFuZCBvdGhlciBwYXJhbWV0ZXJzKS4KLVRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbGxvd3MgeW91IHRvIHdvcmsgYXMgaWYgeW91IGFyZSBjcmVhdGluZyBhCi1zdGFuZGFsb25lIEphdmEgYXBwbGljYXRpb24gaW4gYSBKYXZhIHByb2plY3QuPC9wPgotPHA+QW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgZW5hYmxlcyB5b3UgdG8gZG8gdGhlIGZvbGxvd2luZyB0aGluZ3M6PC9wPgotPHVsPjxsaT5EZXZlbG9wIHRoZSBKYXZhIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIGNsaWVudCBtb2R1bGU8L2xpPgotPGxpPlNldCB0aGUgYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvcjwvbGk+Ci08bGk+VGVzdCB0aGUgYXBwbGljYXRpb24gY2xpZW50PC9saT4KLTwvdWw+Ci08cD5MaWtlIEphdmEgcHJvamVjdHMsIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cyBjb250YWluIHRoZQotcmVzb3VyY2VzIG5lZWRlZCBmb3IgYXBwbGljYXRpb24gY2xpZW50cywgaW5jbHVkaW5nIEphdmEgY2xhc3MKLWZpbGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QsIHRoZSBlbnZpcm9ubWVudCBpcwotc2V0IHVwIGZvciBKYXZhIGRldmVsb3BtZW50LiBBIEphdmEgPGVtPmJ1aWxkZXI8L2VtPiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi1wcm9qZWN0IHNvIHRoZSBKYXZhIHNvdXJjZSBjYW4gYmUgaW5jcmVtZW50YWxseSBjb21waWxlZCBhcyBpdCBpcyB1cGRhdGVkLgotVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIGhpZXJhcmNoeQotYW5kIEphdmEgZWxlbWVudHMuCi1UaGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgY3VycmVudCBhcyBjaGFuZ2VzIGFyZSBtYWRlLCBhbmQgdGhlIEphdmEgYnVpbGRlcgotd2lsbCBpbmNyZW1lbnRhbGx5IGNvbXBpbGUgdGhlIHJlc291cmNlcyB3aXRoaW4gdGhlc2UgcHJvamVjdHMgYXMgdGhlIHJlc291cmNlcwotYXJlIHVwZGF0ZWQuPC9wPgotPHA+SW4gdGhlIHdvcmtiZW5jaCwgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSBhbHdheXMgcmVmZXJlbmNlZCBieQotZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiAoRUFSKSBwcm9qZWN0cy4gV2hlbiB5b3UgY3JlYXRlIGFuIGFwcGxpY2F0aW9uIGNsaWVudAotcHJvamVjdCwgeW91IHNwZWNpZnkgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB0byB3aGljaCB0aGUgYXBwbGljYXRpb24KLWNsaWVudCBwcm9qZWN0IGJlbG9uZ3MuIEEgbW9kdWxlIGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YXBwbGljYXRpb24ueG1sPC9zYW1wPiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGZvciB0aGUgRUFSIHByb2plY3QuPC9wPgotPHA+QW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgaXMgZGVwbG95ZWQgYXMgYSBKQVIgZmlsZS4gVGhpcyBhcHBsaWNhdGlvbgotY2xpZW50IEpBUiBmaWxlIGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciB0aGUgYXBwbGljYXRpb24sIGluY2x1ZGluZyBKYXZhIGNsYXNzCi1maWxlcywgYW5kIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBhbmQgYW55IG1ldGEtZGF0YSBleHRlbnNpb25zCi1hbmQgYmluZGluZ3MgZmlsZXMuPC9wPgotPHA+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGFyZSB0eXBpY2FsbHkgcnVuIG9uIG5ldHdvcmtlZCBjbGllbnQgc3lzdGVtcwotY29ubmVjdGVkIHRvIEoyRUUgKEVKQikgc2VydmVycy4gVGhlIHBvaW50IG9mIGVudHJ5IGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50Ci1pcyBhIEphdmEgbWFpbi1jbGFzcywKLXdoaWNoIGlzIHNpbXBseSBhIEphdmEgY2xhc3MgdGhhdCBjb250YWlucyBhIHN0YXRpYyBtYWluIG1ldGhvZC4gVGhlIGNsYXNzCi1pcyBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZmlsZSBvZiB0aGUgY2xpZW50IG1vZHVsZS4gPC9wPgotPHA+QSBKMkVFIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBKMkVFIHNlcnZpY2UKLShKTkRJIG5hbWluZyBzZXJ2aWNlcywgZGVwbG95bWVudCBzZXJ2aWNlcywgdHJhbnNhY3Rpb24gc2VydmljZXMsIGFuZCBzZWN1cml0eQotc2VydmljZXMpIGFuZCBjb21tdW5pY2F0aW9ucyBBUElzIChpbnRlcm5ldCBwcm90b2NvbHMsIFJlbW90ZSBNZXRob2QgSW52b2NhdGlvbgotcHJvdG9jb2xzLCBPYmplY3QgTWFuYWdlbWVudCBHcm91cCBwcm90b2NvbHMsIE1lc3NhZ2luZyBwcm90b2NvbHMsIGFuZCBkYXRhCi1mb3JtYXRzKS48L3A+Ci08cD5CeSBkZWZhdWx0LCBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgY29udGFpbiBvbmUgZm9sZGVyIG5hbWVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFwcENsaWVudE1vZHVsZTwvc3Bhbj4sCi13aGljaCBjb250YWlucyBib3RoIEphdmEgc291cmNlIGNvZGUgYW5kIGNvbXBpbGVkIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi5jbGFzczwvc2FtcD4gZmlsZXMsCi1hbG9uZyB3aXRoIGFsbCB0aGUgbWV0YS1kYXRhIGZpbGVzIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NRVRBLUlORjwvc3Bhbj4gc3ViZm9sZGVyLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2Ugc2VydmljZXMuIj5KMkVFIGFyY2hpdGVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBhIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIj5DcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLiI+RXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2phcmNoLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwOTNlMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamFyY2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5KMkVFIGFyY2hpdGVjdHVyZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2phcmNoIj48YSBuYW1lPSJjamFyY2giPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5KMkVFIGFyY2hpdGVjdHVyZTwvaDE+Ci08ZGl2PjxwPlRoZSBKYXZh4oSiIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMKLWEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLjwvcD4KLTxwPlRoZSBlY29ub215IGFuZCB0ZWNobm9sb2d5IG9mIHRvZGF5IGhhdmUgaW50ZW5zaWZpZWQgdGhlIG5lZWQgZm9yIGZhc3RlciwKLW1vcmUgZWZmaWNpZW50LCBhbmQgbGFyZ2VyLXNjYWxlIGluZm9ybWF0aW9uIG1hbmFnZW1lbnQgc29sdXRpb25zLiBUaGUgSjJFRQotc3BlY2lmaWNhdGlvbiBzYXRpc2ZpZXMgdGhlc2UgY2hhbGxlbmdlcyBieSBwcm92aWRpbmcgYSBwcm9ncmFtbWluZyBtb2RlbAotdGhhdCBpbXByb3ZlcyBkZXZlbG9wbWVudCBwcm9kdWN0aXZpdHksIHN0YW5kYXJkaXplcyB0aGUgcGxhdGZvcm0gZm9yIGhvc3RpbmcKLWVudGVycHJpc2UgYXBwbGljYXRpb25zLCBhbmQgZW5zdXJlcyBwb3J0YWJpbGl0eSBvZiBkZXZlbG9wZWQgYXBwbGljYXRpb25zCi13aXRoIGFuIGV4dGVuc2l2ZSB0ZXN0IHN1aXRlLjwvcD4KLTxwPkoyRUUgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCBvZiBtdWx0aS10aWVyIGVudGVycHJpc2UKLWFwcGxpY2F0aW9ucy4gQSBKMkVFIGFwcGxpY2F0aW9uIHN5c3RlbSB0eXBpY2FsbHkgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB0aWVyczo8L3A+Ci08dWw+PGxpPjxzdHJvbmc+Q2xpZW50IHRpZXI8L3N0cm9uZz46IEluIHRoZSBjbGllbnQgdGllciwgV2ViIGNvbXBvbmVudHMsIHN1Y2ggYXMgU2VydmxldHMKLWFuZCBKYXZhU2VydmVyIFBhZ2VzIChKU1BzKSwgb3Igc3RhbmRhbG9uZSBKYXZhIGFwcGxpY2F0aW9ucyBwcm92aWRlIGEgZHluYW1pYyBpbnRlcmZhY2UKLXRvIHRoZSBtaWRkbGUgdGllci48L2xpPgotPGxpPjxzdHJvbmc+TWlkZGxlIHRpZXI8L3N0cm9uZz46IEluIHRoZSBzZXJ2ZXIgdGllciwgb3IgbWlkZGxlIHRpZXIsIGVudGVycHJpc2UgYmVhbnMKLWFuZCBXZWIgU2VydmljZXMgZW5jYXBzdWxhdGUgcmV1c2FibGUsIGRpc3RyaWJ1dGFibGUgYnVzaW5lc3MgbG9naWMgZm9yIHRoZQotYXBwbGljYXRpb24uIFRoZXNlIHNlcnZlci10aWVyIGNvbXBvbmVudHMgYXJlIGNvbnRhaW5lZCBvbiBhIEoyRUUgQXBwbGljYXRpb24KLVNlcnZlciwgd2hpY2ggcHJvdmlkZXMgdGhlIHBsYXRmb3JtIGZvciB0aGVzZSBjb21wb25lbnRzIHRvIHBlcmZvcm0gYWN0aW9ucwotYW5kIHN0b3JlIGRhdGEuPC9saT4KLTxsaT48c3Ryb25nPkVudGVycHJpc2UgZGF0YSB0aWVyPC9zdHJvbmc+OiBJbiB0aGUgZGF0YSB0aWVyLCB0aGUgZW50ZXJwcmlzZSdzIGRhdGEgaXMKLXN0b3JlZCBhbmQgcGVyc2lzdGVkLCB0eXBpY2FsbHkgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLjwvbGk+Ci08L3VsPgotPHA+SjJFRSBhcHBsaWNhdGlvbnMgYXJlIGNvbXByaXNlZCBvZiBjb21wb25lbnRzLCBjb250YWluZXJzLCBhbmQgc2VydmljZXMuCi1Db21wb25lbnRzIGFyZSBhcHBsaWNhdGlvbi1sZXZlbCBjb21wb25lbnRzLiBXZWIgY29tcG9uZW50cywgc3VjaCBhcyBTZXJ2bGV0cwotYW5kIEpTUHMsIHByb3ZpZGUgZHluYW1pYyByZXNwb25zZXMgdG8gcmVxdWVzdHMgZnJvbSBhIFdlYiBwYWdlLiBFSkIgY29tcG9uZW50cwotY29udGFpbiBzZXJ2ZXItc2lkZSBidXNpbmVzcyBsb2dpYyBmb3IgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMuIFdlYiBhbmQgRUpCCi1jb21wb25lbnQgY29udGFpbmVycyBob3N0IHNlcnZpY2VzIHRoYXQgc3VwcG9ydCBXZWIgYW5kIEVKQiBtb2R1bGVzLjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEoyRUUgYXJjaGl0ZWN0dXJlIGFuZCBpdHMgaW1wbGljaXQgdGVjaG5vbG9naWVzLAotZG93bmxvYWQgYW5kIHJlYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kb3dubG9hZC5odG1sI3BsYXRmb3Jtc3BlYyIgdGFyZ2V0PSJfYmxhbmsiPkoyRUUgMS40IFNwZWNpZmljYXRpb248L2E+LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamVhcnByb2ouaHRtbCIgdGl0bGU9IkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjb250YWlucyB0aGUgaGllcmFyY2h5IG9mIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCB0byBkZXBsb3kgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24sIG9mdGVuIHJlZmVycmVkIHRvIGFzIGFuIEVBUiBmaWxlLiI+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqYXBwY2xpcHJvai5odG1sIj5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZWFyLmh0bWwiPkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwZWFyLmh0bWwiIHRpdGxlPSJFbnRlcnByaXNlIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQgaW4gdGhlIGZvcm0gb2YgYW4gRUFSIGZpbGUuIFVzZSB0aGUgRXhwb3J0IHdpemFyZCB0byBleHBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGludG8gYW4gRUFSIGZpbGUgZm9yIGRlcGxveW1lbnQuIj5FeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGphcHBwcm9qLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBhIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIj5DcmVhdGluZyBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLiI+RXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pjaXJjbGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqY2lyY2xlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjlmMDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pjaXJjbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5DeWNsaWNhbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKMkVFIG1vZHVsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNqY2lyY2xlIj48YSBuYW1lPSJjamNpcmNsZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkN5Y2xpY2FsIGRlcGVuZGVuY2llcyBiZXR3ZWVuIEoyRUUgbW9kdWxlczwvaDE+Ci08ZGl2PjxwPkEgY3ljbGljYWwgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotbW9zdCBjb21tb25seSBvY2N1cnMgd2hlbiBwcm9qZWN0cyBhcmUgaW1wb3J0ZWQgZnJvbSBvdXRzaWRlIFdlYlNwaGVyZTxzdXA+wq48L3N1cD4gU3R1ZGlvLgotV2hlbiBhIGN5Y2xlIGV4aXN0cyBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwKLXRoZSBKYXZh4oSiIGJ1aWxkZXIKLWNhbm5vdCBhY2N1cmF0ZWx5IGNvbXB1dGUgdGhlIGJ1aWxkIG9yZGVyIG9mIHRoZSBwcm9qZWN0cy4gRnVsbCBidWlsZHMgZmFpbAotdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgb3IgcmVxdWlyZSBzZXZlcmFsIGludm9jYXRpb25zLjwvcD4KLTxwPlRoZXJlZm9yZSwgdGhlIGJlc3QgcHJhY3RpY2UgaXMgdG8gY29tcG9uZW50aXplIHlvdXIgcHJvamVjdHMgb3IgbW9kdWxlcy4KLVRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIHlvdXIgbW9kdWxlIGRlcGVuZGVuY2llcyBmdW5jdGlvbiBhcyBhIHRyZWUgaW5zdGVhZAotb2YgYSBjeWNsZSBkaWFncmFtLiBUaGlzIHByYWN0aWNlIGhhcyB0aGUgYWRkZWQgYmVuZWZpdCBvZiBwcm9kdWNpbmcgYSBiZXR0ZXIKLWZhY3RvcmVkIGFuZCBsYXllcmVkIGFwcGxpY2F0aW9uLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amNpcmNsZWIuaHRtbCIgdGl0bGU9IllvdSBjYW4gcmVzb2x2ZSBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkLiI+Q29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jamVhcnByb2ouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqZWFycHJvai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDk3M2ZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqZWFycHJvai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNqZWFycHJvaiI+PGEgbmFtZT0iY2plYXJwcm9qIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0czwvaDE+Ci08ZGl2PjxwPkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjb250YWlucyB0aGUgaGllcmFyY2h5IG9mIHJlc291cmNlcwotdGhhdCBhcmUgcmVxdWlyZWQgdG8gZGVwbG95IGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLCBvZnRlbiByZWZlcnJlZAotdG8gYXMgYW4gRUFSIGZpbGUuPC9wPgotPHA+QW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGFsc28gY29udGFpbnMgYSBzZXQgb2YgcmVmZXJlbmNlcyB0bwotb3RoZXIgSjJFRSBtb2R1bGVzIGFuZCBKYXZh4oSiIHByb2plY3RzIHRoYXQgYXJlIGNvbWJpbmVkIHRvIGNvbXBvc2UKLWFuIEVBUiBmaWxlLiBUaGVzZSBwcm9qZWN0cyBjYW4gYmUgV2ViIG1vZHVsZXMsIEVKQiBtb2R1bGVzLCBhcHBsaWNhdGlvbiBjbGllbnQKLW1vZHVsZXMsIGNvbm5lY3RvciBtb2R1bGVzLCBnZW5lcmFsIHV0aWxpdHkgSmF2YSBKQVIgZmlsZXMsIGFuZCBFSkIgY2xpZW50IEpBUiBmaWxlcy4KLUVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgY3JlYXRlZCBpbiB0aGUgd29ya2JlbmNoIGluY2x1ZGUgYSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLCBhcyB3ZWxsIGFzIGZpbGVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgSjJFRSBtb2R1bGVzIHRoYXQgYXJlCi1kZWZpbmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuPC9wPgotPHA+V2hlbiBhIEoyRUUgbW9kdWxlIHByb2plY3QgaXMgY3JlYXRlZCwgaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiBwcm9qZWN0LiBUaGUgcHJvamVjdCB3aXphcmRzIGFpZCB0aGlzIGJ5IGFsbG93aW5nIHlvdSB0byBzcGVjaWZ5Ci1hIG5ldyBvciBleGlzdGluZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIEVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMKLWFyZSBleHBvcnRlZCBhcyBFQVIgKGVudGVycHJpc2UgYXJjaGl2ZSkgZmlsZXMgdGhhdCBpbmNsdWRlIGFsbCBmaWxlcyBkZWZpbmVkCi1pbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IGFzIHdlbGwgYXMgdGhlIGFwcHJvcHJpYXRlIGFyY2hpdmUgZmlsZQotZm9yIGVhY2ggSjJFRSBtb2R1bGUgb3IgdXRpbGl0eSBKQVIgcHJvamVjdCBkZWZpbmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsCi1zdWNoIGFzIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIGFuZCBFSkIgSkFSIGZpbGVzLjwvcD4KLTxwPkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gY2FuIGNvbnRhaW4gdXRpbGl0eSBKQVIgZmlsZXMgdGhhdCBhcmUgdG8gYmUKLXVzZWQgYnkgdGhlIGNvbnRhaW5lZCBtb2R1bGVzLiBUaGlzIGFsbG93cyBzaGFyaW5nIG9mIGNvZGUgYXQgdGhlIGFwcGxpY2F0aW9uCi1sZXZlbCBieSBtdWx0aXBsZSBXZWIsIEVKQiwgb3IgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZXMuIFRoZXNlIEpBUiBmaWxlcwotYXJlIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIDxlbT51dGlsaXR5IEpBUiBmaWxlcy48L2VtPiBUaGUgdXRpbGl0eSBKQVIgZmlsZXMKLWRlZmluZWQgZm9yIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjYW4gYmUgYWN0dWFsIEpBUiBmaWxlcyBpbiB0aGUKLXByb2plY3QsIG9yIHlvdSBjYW4gaW5jbHVkZSB1dGlsaXR5IEphdmEgcHJvamVjdHMgdGhhdCBhcmUgZGVzaWduYXRlZCB0byBiZWNvbWUKLXRoZSB1dGlsaXR5IEpBUiBmaWxlcyBkdXJpbmcgYXNzZW1ibHkgYW5kIGRlcGxveW1lbnQuPC9wPgotPHA+VG8gc3RhcnQgZGV2ZWxvcGluZyBKMkVFIGFwcGxpY2F0aW9ucywgeW91IHR5cGljYWxseSBmaXJzdCBjcmVhdGUgYW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb24gcHJvamVjdCB0byBjb250YWluIHlvdXIgV2ViLCBFSkIsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcy4KLVRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaXMgdXNlZCB0byBjb21wb3NlIGFuIGVudGlyZSBhcHBsaWNhdGlvbgotZnJvbSB0aGUgdmFyaW91cyBtb2R1bGVzLiBTaW5jZSBubyBzb3VyY2UgY29kZSBpcyBidWlsdCBkaXJlY3RseSBpbnRvIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uLCB0aGVzZSBwcm9qZWN0cyBhcmUgbm90IEphdmEgcHJvamVjdHMsIGFuZCBhcmUgbm90IGNvbXBpbGVkIGJ5IHRoZSBKYXZhIGJ1aWxkZXIuPC9wPgotPGRpdiBjbGFzcz0icCI+V2hlbiB5b3UgY3JlYXRlIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB1c2luZyB0aGUgd29ya2JlbmNoLAotdGhlIGZvbGxvd2luZyBrZXkgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZDo8ZGw+PGR0IGNsYXNzPSJkbHRlcm0iPk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbDwvZHQ+Ci08ZGQ+VGhpcyBmaWxlIGlzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLAotYXMgZGVmaW5lZCBpbiB0aGUgSjJFRSBzcGVjaWZpY2F0aW9uLCB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBhc3NvY2lhdGluZwotSjJFRSBtb2R1bGVzIHRvIGEgc3BlY2lmaWMgRUFSIGZpbGUuIEl0IGlzIGNyZWF0ZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1FVEEtSU5GPC9zcGFuPiBmb2xkZXIuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5NRVRBLUlORi8ubW9kdWxlbWFwczwvZHQ+Ci08ZGQ+VGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYXBwaW5ncyB0byB0aGUgY29udGFpbmVkIG1vZHVsZXMgYW5kIHV0aWxpdHkgSkFSCi1wcm9qZWN0cy48L2RkPgotPC9kbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+VGhlIGZvbGxvd2luZyB3b3JrYmVuY2ggYXJ0aWZhY3RzIGFyZSBhbHNvIGNyZWF0ZWQgaW4gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotcHJvamVjdCBidXQgd2lsbCBub3QgYmVjb21lIHBhcnQgb2YgdGhlIEVBUiBmaWxlLCBhbmQgeW91IHNob3VsZCBub3QgZWRpdAotdGhlbSBtYW51YWxseTo8ZGw+PGR0IGNsYXNzPSJkbHRlcm0iPi5qMmVlPC9kdD4KLTxkZD5UaGlzIGlzIGEgd29ya2JlbmNoIGFydGlmYWN0IHRoYXQgaW5jbHVkZXMgdGhlIHByb2R1Y3QgdmVyc2lvbiBhbmQgSjJFRQotc3BlY2lmaWNhdGlvbiBsZXZlbCBmb3IgdGhlIHByb2plY3QuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj4ucHJvamVjdDwvZHQ+Ci08ZGQ+VGhpcyBpcyBhIHdvcmtiZW5jaCBhcnRpZmFjdCwgdGhlIHN0YW5kYXJkIHByb2plY3QgZGVzY3JpcHRpb24KLWZpbGUuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj4ucnVudGltZTwvZHQ+Ci08ZGQ+VGhpcyBpcyBhIHdvcmtiZW5jaCBhcnRpZmFjdCB0aGF0IGNvbnRhaW5zIHRoZSB0YXJnZXQgc2VydmVyIGRlZmluaXRpb24uPC9kZD4KLTwvZGw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2Ugc2VydmljZXMuIj5KMkVFIGFyY2hpdGVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGplYXIuaHRtbCI+Q3JlYXRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZS4gVXNlIHRoZSBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4iPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqcGVycy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pwZXJzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYzAxZmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pwZXJzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+SjJFRSBwZXJzcGVjdGl2ZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2pwZXJzIj48YSBuYW1lPSJjanBlcnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5KMkVFIHBlcnNwZWN0aXZlPC9oMT4KLTxkaXY+PHA+VGhlIEoyRUUgcGVyc3BlY3RpdmUgaW5jbHVkZXMgd29ya2JlbmNoIHZpZXdzIHRoYXQgeW91IGNhbiB1c2UKLXdoZW4gZGV2ZWxvcGluZyByZXNvdXJjZXMgZm9yIGVudGVycHJpc2UgYXBwbGljYXRpb25zLCBFSkIgbW9kdWxlcywgV2ViIG1vZHVsZXMsCi1hcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcywgYW5kIGNvbm5lY3RvciBwcm9qZWN0cyBvciBtb2R1bGVzLjwvcD4KLTxwPllvdSBjYW4gcmVhcnJhbmdlIHRoZSBsb2NhdGlvbiwgdGlsaW5nLCBhbmQgc2l6ZSBvZiB0aGUgdmlld3Mgd2l0aGluIHRoZQotcGVyc3BlY3RpdmUuIFlvdSBjYW4gYWxzbyBhZGQgb3RoZXIgdmlld3MgdG8gdGhlIEoyRUUgcGVyc3BlY3RpdmUgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2hvdyBWaWV3PC9zcGFuPjwvc3Bhbj4gYW5kCi1zZWxlY3RpbmcgdGhlIHZpZXcuPC9wPgotPHA+VGhlIHdvcmtiZW5jaCBwcm92aWRlcyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBkaWZmZXJlbnQgdmlld3MgYW5kIGVkaXRvcnMuCi1UaGlzIGlzIGFsc28gdHJ1ZSBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZS48L3A+Ci08cD5CeSBkZWZhdWx0LCB0aGUgSjJFRSBwZXJzcGVjdGl2ZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHdvcmtiZW5jaCB2aWV3czo8L3A+Ci08ZGw+PGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+PC9kdD4KLTxkZD5UaGUgUHJvamVjdCBFeHBsb3JlciBwcm92aWRlcyBhbiBpbnRlZ3JhdGVkIHZpZXcgb2YgeW91ciBwcm9qZWN0cywgZ3JvdXBlZAotYnkgdHlwZSwgYW5kIHRoZWlyIGFydGlmYWN0cyByZWxhdGVkIHRvIEoyRUUgZGV2ZWxvcG1lbnQuIEl0IGRpc3BsYXlzIG5hdmlnYWJsZQotbW9kZWxzIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycywgSmF2YeKEoiBhcnRpZmFjdHMgKHNvdXJjZSBmb2xkZXJzLCBwYWNrYWdlcywKLWFuZCBjbGFzc2VzKSwgbmF2aWdhYmxlIG1vZGVscyBvZiB0aGUgYXZhaWxhYmxlIFdlYiBzZXJ2aWNlcywgYW5kIHNwZWNpYWxpemVkCi12aWV3cyBvZiBXZWIgbW9kdWxlcyB0byBzaW1wbGlmeSB0aGUgZGV2ZWxvcG1lbnQgb2YgZHluYW1pYyBXZWIgYXBwbGljYXRpb25zLgotSW4gYWRkaXRpb24sIEVKQiBkYXRhYmFzZSBtYXBwaW5nIGFuZCB0aGUgY29uZmlndXJhdGlvbiBvZiBwcm9qZWN0cyBmb3IgYQotSjJFRSBhcHBsaWNhdGlvbiBzZXJ2ZXIgYXJlIG1hZGUgcmVhZGlseSBhdmFpbGFibGUuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj4gT3V0bGluZTwvc3Bhbj48L2R0PgotPGRkPlRoZSBPdXRsaW5lIHZpZXcgaW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUgc2hvd3MgdGhlIG91dGxpbmUgb2YgdGhlIGZpbGUKLXRoYXQgeW91IGFyZSBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB1c2luZyBhIHRhYmJlZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVkaXRvciwgdGhlIE91dGxpbmUgdmlldyBzaG93cyB0aGUgb3V0bGluZSBmb3IgdGhlIHNlbGVjdGVkIHBhZ2UncyBlbGVtZW50cywKLWFuZCBpZiB5b3UgYXJlIGVkaXRpbmcgb24gdGhlIFNvdXJjZSB0YWIsIHRoZSBvdXRsaW5lIGZvciB0aGUgWE1MIHNvdXJjZSBpcwotZGlzcGxheWVkLiBJZiB5b3UgYXJlIGVkaXRpbmcgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBKYXZhIGVkaXRvciwKLXRoZSBPdXRsaW5lIHZpZXcgc2hvd3MgdGhlIG91dGxpbmUgZm9yIHRoZSBKYXZhIGNsYXNzLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFza3M8L3NwYW4+PC9kdD4KLTxkZD5UaGUgVGFza3MgdmlldyBsaXN0cyB0aGUgdG8tZG8gaXRlbXMgdGhhdCB5b3UgaGF2ZSBlbnRlcmVkLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvYmxlbXM8L3NwYW4+PC9kdD4KLTxkZD5UaGUgUHJvYmxlbXMgdmlldyBkaXNwbGF5cyBwcm9ibGVtcywgd2FybmluZ3MsIG9yIGVycm9ycyBhc3NvY2lhdGVkIHdpdGgKLXRoZSBzZWxlY3RlZCBwcm9qZWN0LiBZb3UgY2FuIGRvdWJsZS1jbGljayBvbiBhbiBpdGVtIHRvIGFkZHJlc3MgdGhlIHNwZWNpZmljCi1wcm9ibGVtIGluIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZS48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+PC9kdD4KLTxkZD5UaGUgUHJvcGVydGllcyB2aWV3IHByb3ZpZGVzIGEgdGFidWxhciB2aWV3IG9mIHRoZSBwcm9wZXJ0aWVzIGFuZCBhc3NvY2lhdGVkCi12YWx1ZXMgb2Ygb2JqZWN0cyBpbiBmaWxlcyB5b3UgaGF2ZSBvcGVuIGluIGFuIGVkaXRvci4gRm9yIGV4YW1wbGUsIHlvdSBjYW4KLXNwZWNpZnkgY29udmVydGVycyBpbiB0aGUgUHJvcGVydGllcyB2aWV3IG9mIHRoZSBNYXBwaW5nIGVkaXRvci48L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0YXR1cyBiYXI8L3NwYW4+PC9kdD4KLTxkZD5UaGUgU3RhdHVzIGJhciBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2NhdGlvbiBvZiBzZWxlY3RlZCBvYmplY3RzCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3cyBpbiB0aGUgbGVmdCBzaWRlLiBXaGVuIGZpbGUgYW5kIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLWFyZSBvcGVuLCB0aGUgc3RhdHVzIGJhciBzaG93cyB0aGUgcmVhZC1vbmx5IHN0YXRlIG9mIHRoZSBmaWxlcyBhbmQgdGhlIGxpbmUKLWFuZCBjb2x1bW4gbnVtYmVycyB3aGVuIGFwcGxpY2FibGUuIFNvbWV0aW1lcyB3aGVuIGxvbmcgb3BlcmF0aW9ucyBydW4sIGEKLXN0YXR1cyBtb25pdG9yIHdpbGwgYXBwZWFyIGluIHRoZSBzdGF0dXMgYmFyLCBhbG9uZyB3aXRoIGEgYnV0dG9uIHdpdGggYSBzdG9wCi1zaWduIGljb24uIENsaWNraW5nIHRoZSBzdG9wIHNpZ24gc3RvcHMgdGhlIG9wZXJhdGlvbiB3aGVuIHRoZSBvcGVyYXRpb24gY2FuCi1iZSBjYW5jZWxsZWQuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXJ2ZXJzPC9zcGFuPjwvZHQ+Ci08ZGQ+VGhlIFNlcnZlcnMgdmlldyBzaG93cyBhbGwgdGhlIGNyZWF0ZWQgc2VydmVyIGluc3RhbmNlcy4gWW91IGNhbiBzdGFydAotYW5kIHN0b3AgZWFjaCBzZXJ2ZXIgZnJvbSB0aGlzIHZpZXcsIGFuZCB5b3UgY2FuIGxhdW5jaCB0aGUgdGVzdCBjbGllbnQuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5TbmlwcGV0czwvc3Bhbj48L2R0PgotPGRkPlRoZSBTbmlwcGV0cyB2aWV3IHByb3ZpZGVzIGNhdGVnb3JpemVkIHBpZWNlcyBvZiBjb2RlIHRoYXQKLXlvdSBjYW4gaW5zZXJ0IGludG8gYXBwcm9wcmlhdGUgcGxhY2VzIGluIHlvdXIgc291cmNlIGNvZGUuPC9kZD4KLTwvZGw+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2p2aWV3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwODE3ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9janZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0gPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+UHJvamVjdCBFeHBsb3JlciB2aWV3IGluIHRoZSBKMkVFIHBlcnNwZWN0aXZlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjanZpZXciPjxhIG5hbWU9ImNqdmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByb2plY3QgRXhwbG9yZXIgdmlldyBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZTwvaDE+Ci08ZGl2PjxwPldoaWxlIGRldmVsb3BpbmcgSjJFRSBhcHBsaWNhdGlvbnMgaW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIHRoZQotUHJvamVjdCBFeHBsb3JlciB2aWV3IGlzIHlvdXIgbWFpbiB2aWV3IG9mIHlvdXIgSjJFRSBwcm9qZWN0cyBhbmQgcmVzb3VyY2VzLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyIHZpZXc8L2g0PlRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgcHJvdmlkZXMKLWFuIGludGVncmF0ZWQgdmlldyBvZiBhbGwgcHJvamVjdCByZXNvdXJjZXMsIGluY2x1ZGluZyBtb2RlbHMgb2YgSjJFRSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycywgSmF2YeKEoiBhcnRpZmFjdHMsIHJlc291cmNlcywgV2ViIHNlcnZpY2VzLCBkYXRhYmFzZXMsCi1hbmQgZHluYW1pYyBXZWIgcHJvamVjdCBhcnRpZmFjdHMuPHA+WW91IHNob3VsZCB1c2UgdGhpcyB2aWV3IHRvIHdvcmsgd2l0aAoteW91ciBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kIHRoZWlyIGNvbnRlbnQuIFlvdSBjYW4gZWFzaWx5IHZpZXcgYW4KLWVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBhbmQgc2VlIGFsbCBvZiB0aGUgbW9kdWxlcyBhc3NvY2lhdGVkIHdpdGgKLWl0LiBJbiBhZGRpdGlvbiwgSmF2YSBhbmQgcmVzb3VyY2UgY29udGVudCBpcyBwcm92aWRlZCBmb3IgZWFjaCBKMkVFCi1tb2R1bGUuPC9wPgotPGRsPjxkdCBjbGFzcz0iZGx0ZXJtIj5PdGhlciBQcm9qZWN0czwvZHQ+Ci08ZGQ+U2hvd3MgYW55IG5vbi1KMkVFIG1vZHVsZSBwcm9qZWN0cywgc3VjaCBhcyBKYXZhIHByb2plY3RzLiBUaGVzZSBKYXZhIHByb2plY3RzCi1jYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6IDx1bD48bGk+VXRpbGl0eSBwcm9qZWN0cyBmb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0cyBpbiB5b3VyCi13b3Jrc3BhY2U8L2xpPgotPGxpPkVKQiBDbGllbnQgSkFSIFByb2plY3RzLCB3aGljaCBpbmNsdWRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGNsYXNzZXMgKHJlbW90ZSwKLWhvbWUsIGxvY2FsLCBvciBsb2NhbCBob21lIGludGVyZmFjZXMpIGZvciBiZWFucyBpbiBFSkIgcHJvamVjdHM8L2xpPgotPGxpPkphdmEgcHJvamVjdHMKLXRoYXQgYXJlIGluIHlvdXIgd29ya3NwYWNlIGJ1dCB1bnJlbGF0ZWQgdG8geW91ciBKMkVFIGRldmVsb3BtZW50PC9saT4KLTwvdWw+Ci08L2RkPgotPGR0IGNsYXNzPSJkbHRlcm0iPkFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0czwvZHQ+Ci08ZGQ+U2hvd3MgYSBoaWVyYXJjaGljYWwgbW9kZWwgb2YgYWxsIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGVzLjwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+Q29ubmVjdG9yIFByb2plY3RzPC9kdD4KLTxkZD5TaG93cyBhIGhpZXJhcmNoaWNhbCBtb2RlbCBvZiBhbGwgY29ubmVjdG9yIG1vZHVsZXMuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5EeW5hbWljIFdlYiBQcm9qZWN0czwvZHQ+Ci08ZGQ+U2hvd3MgYSBoaWVyYXJjaGljYWwgbW9kZWwgb2YgYWxsIGR5bmFtaWMgV2ViIG1vZHVsZXMuPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5FamIgUHJvamVjdHM8L2R0PgotPGRkPlNob3dzIGEgaGllcmFyY2hpY2FsIG1vZGVsIG9mIGFsbCBFSkIgcHJvamVjdHMuIEVhY2ggRUpCIHByb2plY3QgY29udGFpbnMKLXRoZSBmb2xsb3dpbmcgc3ViLWZvbGRlcnMgZm9yIG9yZ2FuaXppbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBiZWFucyBhbmQKLXRoZSBtYXBwaW5nczogPHVsPjxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXNzaW9uIEJlYW5zPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW50aXR5IEJlYW5zPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWVzc2FnZS1Ecml2ZW4gQmVhbnM8L3NwYW4+PC9saT4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXBzPC9zcGFuPjwvbGk+Ci08L3VsPgotPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5FbnRlcnByaXNlIEFwcGxpY2F0aW9uczwvZHQ+Ci08ZGQ+U2hvd3MgYSBoaWVyYXJjaGljYWwgbW9kZWwgb2YgYWxsIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMuPC9kZD4KLTwvZGw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9yamxpbWl0Y3VycmVudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcmpsaW1pdGN1cnJlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczOTIyYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9yamxpbWl0Y3VycmVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkxpbWl0YXRpb25zIG9mIEoyRUUgZGV2ZWxvcG1lbnQgdG9vbHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJqbGltaXRjdXJyZW50Ij48YSBuYW1lPSJyamxpbWl0Y3VycmVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpbWl0YXRpb25zIG9mIEoyRUUgZGV2ZWxvcG1lbnQgdG9vbHM8L2gxPgotPGRpdj48cD5UaGlzIHRvcGljIG91dGxpbmVzIGN1cnJlbnQga25vd24gbGltaXRhdGlvbnMgYW5kIHJlc3RyaWN0aW9ucwotZm9yIEoyRUUgdG9vbGluZy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+QWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoYWx0LWRkKSBlbGVtZW50cyBpbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbnM8L2g0PlRoZSB1c2Ugb2YgYWx0LWRkIGVsZW1lbnRzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkCi1pbiB0aGUgd29ya2JlbmNoLiBUaGUgd29ya2Fyb3VuZCBpcyB0byBlZGl0IHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG9mCi10aGUgY29udGFpbmVkIG1vZHVsZXMuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U3BhY2VzIG5vdCBzdXBwb3J0ZWQgaW4gSkFSIFVSSXMgd2l0aGluIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb248L2g0PlNwYWNlcwotYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFVSSSBmb3IgbW9kdWxlcyBvciB1dGlsaXR5IEpBUiBmaWxlcyBpbiBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbi4gVGhlICJDbGFzcy1QYXRoOiIgYXR0cmlidXRlIG9mIGEgTUFOSUZFU1QuTUYgZmlsZSBpbiBhIEpBUiBmaWxlCi1vciBtb2R1bGUgaXMgYSBzcGFjZS1kZWxpbWl0ZWQgbGlzdCBvZiByZWxhdGl2ZSBwYXRocyB3aXRoaW4gYW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb24uIEEgSkFSIGZpbGUgd291bGQgbm90IGJlIGFibGUgdG8gcmVmZXJlbmNlIGFub3RoZXIgSkFSIGZpbGUgaW4KLXRoZSBFQVIgaWYgdGhlIFVSSSBvZiB0aGUgcmVmZXJlbmNlZCBKQVIgZmlsZSBjb250YWluZWQgc3BhY2VzLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBuYW1lcyBzaG91bGQgbm90IGNvbnRhaW4gREJDUwotY2hhcmFjdGVyczwvaDQ+PHAgaWQ9InJqbGltaXRjdXJyZW50X19saW1pdGF0aW9uX2Vhcl9kYmNzIj48YSBuYW1lPSJyamxpbWl0Y3VycmVudF9fbGltaXRhdGlvbl9lYXJfZGJjcyI+PCEtLSAtLT48L2E+V2hlbiB5b3UgY3JlYXRlIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIHByb2plY3QsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGRvIG5vdCBnaXZlIGl0IGEgbmFtZSB0aGF0Ci1jb250YWlucyBkb3VibGUtYnl0ZSBjaGFyYWN0ZXIgc2V0IChEQkNTKSBjaGFyYWN0ZXJzLjwvcD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkphdmHihKIgYnVpbGQgcGF0aCB1cGRhdGVzIHdoZW4gcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kKLW9uIGEgVXRpbGl0eSBKQVIgZmlsZTwvaDQ+V2hlbiByZW1vdmluZyB0aGUgZGVwZW5kZW5jeSBvbiBhIFV0aWxpdHkgSkFSLAotdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBwcm9qZWN0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBKYXZhIGJ1aWxkCi1wYXRoIG9ubHkgaWYgdGhlIGRlcGVuZGVudCBKQVIgaXMgc3RpbGwgcmVmZXJlbmNlZCBieSB0aGUgRUFSIHByb2plY3QuIEZvcgotZXhhbXBsZSwgc3VwcG9zZSB5b3UgY3JlYXRlIGEgSjJFRSAxLjMgV2ViIHByb2plY3QgYW5kIEVBUiBhbG9uZyB3aXRoIHRoZQotSlVuaXQgSmF2YSBFeGFtcGxlCi1wcm9qZWN0LiBOZXh0LCBhZGQgdGhlIEpVbml0IHByb2plY3QgYXMgYSBVdGlsaXR5IEpBUiBpbiB0aGUgRUFSLCB0aGVuIGFkZAotSlVuaXQgYXMgYSBKYXZhIEpBUiBEZXBlbmRlbmN5IG9mIHRoZSBXZWIgcHJvamVjdC4gSWYgeW91IHRoZW4KLXdhbnRlZCB0byByZW1vdmUgdGhlIGRlcGVuZGVuY3kgYmV0d2VlbiBKVW5pdCBhbmQgdGhlIFdlYiBwcm9qZWN0LCByZW1vdmUKLXRoZSBKYXZhIEpBUgotRGVwZW5kZW5jeSBmcm9tIHRoZSBXZWIgcHJvamVjdCBmaXJzdCwgdGhlbiByZW1vdmUgdGhlIFV0aWxpdHkgSkFSIGZyb20gdGhlCi1FQVIuIEZvbGxvdyB0aGlzIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoaXMgd29ya3MgY29ycmVjdGx5LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkphdmEgSkFSIERlcGVuZGVuY2llcyBwYWdlIGZhaWxzIHRvIHVwZGF0ZSBKYXZhIGJ1aWxkCi1wYXRoPC9oND5UaGUgSmF2YSBKQVIgRGVwZW5kZW5jaWVzIHBhZ2UgaXMgbm90IHN5bmNocm9uaXplZCB3aXRoCi10aGUgSmF2YSBidWlsZAotcGF0aCBwYWdlIGluIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgZGlhbG9nLiBUaGVyZWZvcmUsIGEgY2hhbmdlIGFwcGxpZWQgaW4KLW9uZSBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgb3RoZXIgd2l0aGluIHRoZSBzYW1lIGRpYWxvZyBzZXNzaW9uLiBUaGVyZQotYXJlIGFsc28gc29tZSBpbnN0YW5jZXMgd2hlcmUgZmxpcHBpbmcgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgcGFnZXMgd2lsbAotY2F1c2UgdGhlIHVwZGF0ZSBmcm9tIG9uZSB0byBjYW5jZWwgb3V0IHRoZSB1cGRhdGUgZnJvbSBhbm90aGVyIHdoZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBidXR0b24KLWlzIGNsaWNrZWQgb3IgaWYgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiBidXR0b24gaXMgY2xpY2tlZCBwcmlvcgotdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBidXR0b24uIFR5cGljYWxseSB0aGlzIHdpbGwgYXBwZWFyIGFzIGlmCi1hIEpBUiBkZXBlbmRlbmN5IHdhcyBhZGRlZCwgYnV0IHRoZSBwcm9qZWN0IGRpZCBub3QgZ2V0IGFkZGVkIHRvIHRoZSBKYXZhIGJ1aWxkCi1wYXRoLiBUaGUgd29ya2Fyb3VuZCBpcyB0byByZW9wZW4gdGhlIHByb3BlcnRpZXMgZGlhbG9ncywgc3dpdGNoIHRvIHRoZSBKQVIKLWRlcGVuZGVuY3kgcGFnZSwgY2xlYXIgYW5kIHJlLXNlbGVjdCB0aGUgZGVwZW5kZW50IEpBUiBmaWxlcywgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+J0ludmFsaWQgcHJvamVjdCBkZXNjcmlwdGlvbicgZXJyb3Igd2hlbiB1c2luZyBhIG5vbi1kZWZhdWx0Ci1wcm9qZWN0IGxvY2F0aW9uIGZvciBhIG5ldyBKMkVFIHByb2plY3Q8L2g0PldoZW4geW91IGNyZWF0ZSBhIG5ldyBKMkVFCi1wcm9qZWN0IChpbmNsdWRpbmcgSmF2YSwgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwgRHluYW1pYyBXZWIsCi1FSkIsIGFwcGxpY2F0aW9uIGNsaWVudCwgYW5kIGNvbm5lY3RvciBwcm9qZWN0cyksIHlvdSBjYW5ub3QgdXNlIGEgcHJvamVjdAotbG9jYXRpb24gdGhhdCBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBwcm9qZWN0IGluIHRoZSB3b3JrYmVuY2guIElmIHlvdQotY2hvb3NlIGEgcHJvamVjdCBsb2NhdGlvbiB0aGF0IGlzIHVzZWQgYnkgYW5vdGhlciBwcm9qZWN0LCB0aGUgd2l6YXJkIGRpc3BsYXlzCi1hbiAiSW52YWxpZCBwcm9qZWN0IGRlc2NyaXB0aW9uIiBlcnJvciBkaWFsb2cgb3IgbWVzc2FnZS4gSWYgYWZ0ZXIgeW91IHJlY2VpdmUKLXRoaXMgbWVzc2FnZSB5b3UgdGhlbiBzZWxlY3QgYSB2YWxpZCBwcm9qZWN0IGxvY2F0aW9uIGJ5IGNsaWNraW5nIHRoZSBCcm93c2UKLWJ1dHRvbiwgdGhlIHByb2plY3QgY3JlYXRpb24gd2lsbCBzdGlsbCBub3QgZmluaXNoLiBUaGUgd29ya2Fyb3VuZCBpcyB0byBjbGljawotQ2FuY2VsIGFuZCByZW9wZW4gdGhlIHByb2plY3QgY3JlYXRpb24gd2l6YXJkLjwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGVyci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGVyci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODlhN2VlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+Q29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJ2YWxlcnIiPjxhIG5hbWU9InJ2YWxlcnIiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9uczwvaDE+Ci08ZGl2PjxwPllvdSBtYXkgZW5jb3VudGVyIHRoZXNlIGNvbW1vbiBlcnJvciBtZXNzYWdlcyB3aGVuIHlvdSB2YWxpZGF0ZQoteW91ciBwcm9qZWN0cy48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGlkPSJkMGUxNiI+TWVzc2FnZSBwcmVmaXg8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaWQ9ImQwZTE4Ij5NZXNzYWdlPC90aD4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjU1LjQwNTQwNTQwNTQwNTQlIiBpZD0iZDBlMjAiPkV4cGxhbmF0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2IGQwZTE4IGQwZTIwICI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbGljYXRpb24gQ2xpZW50IHZhbGlkYXRvcjwvc3Bhbj48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTE2ICI+Q0hLSjEwMDA8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iZDBlMTggIj5WYWxpZGF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZmlsZQotaXMgbm90IHZhbGlkLiBFbnN1cmUgdGhhdCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIHZhbGlkLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMjAgIj5UaGUgYXBwbGljYXRpb24tY2xpZW50LnhtbCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQuIFRoZQotcHJvamVjdCBtZXRhZGF0YSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgYXBwbGljYXRpb24tY2xpZW50LnhtbCBmaWxlLgotICA8b2w+PGxpPkVuc3VyZSB0aGUgZm9sbG93aW5nOiAgPHVsPjxsaT50aGF0IHRoZSBNRVRBLUlORiBmb2xkZXIgZXhpc3RzIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDwvbGk+Ci08bGk+dGhhdCBNRVRBLUlORiBjb250YWlucyB0aGUgYXBwbGljYXRpb24tY2xpZW50LnhtbCBmaWxlPC9saT4KLTxsaT50aGF0IE1FVEEtSU5GIGlzIGluIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLjwvbGk+Ci08L3VsPgotICA8L2xpPgotPGxpPlZhbGlkYXRlIHRoZSBzeW50YXggb2YgdGhlIGFwcGxpY2F0aW9uLWNsaWVudC54bWwgZmlsZTogaW4gdGhlIE5hdmlnYXRvcgotdmlldywgaGlnaGxpZ2h0IHRoZSBhcHBsaWNhdGlvbi1jbGllbnQueG1sIGZpbGUsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlCi1YTUwgZmlsZTwvc3Bhbj4uPC9saT4KLTxsaT5JZiBib3RoIDEpIGFuZCAyKSBhcmUgb2theSwgY2xvc2UgdGhlIHByb2plY3QsIHJlb3BlbiB0aGUgcHJvamVjdCwgYW5kCi1yZWJ1aWxkIHRoZSBwcm9qZWN0LiBUaGUgcHJvamVjdCBtZXRhZGF0YSB3aWxsIHJlZnJlc2guPC9saT4KLTwvb2w+Ci0gPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiBkMGUxOCBkMGUyMCAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUiB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUxNiAiPkNIS0oxMDAxPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTE4ICI+VGhlIEVBUiBwcm9qZWN0IHswfSBpcyBpbnZhbGlkLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMjAgIj5UaGUgYXBwbGljYXRpb24ueG1sIGZpbGUgY2Fubm90IGJlIGxvYWRlZC4gVGhlIHByb2plY3QKLW1ldGFkYXRhIGNhbm5vdCBiZSBpbml0aWFsaXplZCBmcm9tIHRoZSBhcHBsaWNhdGlvbi54bWwgZmlsZS4gIDxvbD48bGk+RW5zdXJlIHRoZSBmb2xsb3dpbmc6ICA8dWw+PGxpPnRoYXQgdGhlIE1FVEEtSU5GIGZvbGRlciBleGlzdHMgaW4gdGhlIEVBUiBwcm9qZWN0PC9saT4KLTxsaT50aGF0IE1FVEEtSU5GIGNvbnRhaW5zIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFwcGxpY2F0aW9uLnhtbDwvc2FtcD48L2xpPgotPGxpPnRoYXQgTUVUQS1JTkYgaXMgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguPC9saT4KLTwvdWw+Ci0gIDwvbGk+Ci08bGk+VmFsaWRhdGUgdGhlIHN5bnRheCBvZiB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGU6IGluIHRoZSBOYXZpZ2F0b3IgdmlldywKLWhpZ2hsaWdodCB0aGUgYXBwbGljYXRpb24ueG1sIGZpbGUsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlCi1YTUwgZmlsZTwvc3Bhbj4uPC9saT4KLTxsaT5JZiBib3RoIDEpIGFuZCAyKSBhcmUgb2theSwgY2xvc2UgdGhlIHByb2plY3QsIHJlb3BlbiB0aGUgcHJvamVjdCwgYW5kCi1yZWJ1aWxkIHRoZSBwcm9qZWN0LiBUaGUgcHJvamVjdCBtZXRhZGF0YSB3aWxsIHJlZnJlc2guPC9saT4KLTwvb2w+Ci08L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2IGQwZTE4IGQwZTIwICI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUpCIHZhbGlkYXRvcjwvc3Bhbj48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTE2ICI+Q0hLSjIwMTk8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iZDBlMTggIj5UaGUgezB9IGtleSBjbGFzcyBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiA8L3RkPgotPHRkIHJvd3NwYW49IjMiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9ImQwZTIwICI+VGhlIEVKQiBpcyBjb21wbGlhbnQgd2l0aCB0aGUgRUpCIHNwZWNpZmljYXRpb24uIFRoaXMKLW1lc3NhZ2UgaXMgYSB3YXJuaW5nIHRoYXQgcHJvYmxlbXMgbWF5IG9jY3VyLiBUaGUgd2FybmluZyBhcHBlYXJzIHdoZW4gYSB0eXBlCi1uZWVkcyB0byBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSBhbmQgd2hlbiBzZXJpYWxpemFiaWxpdHkgY2Fubm90IGJlIHZlcmlmaWVkCi1hdCBjb21waWxlLXRpbWUuIEEgdHlwZSBpcyBzZXJpYWxpemFibGUgaWYsIGF0IHJ1bnRpbWUsIGl0IGlzIGEgcHJpbWl0aXZlCi10eXBlLCBhIHByaW1pdGl2ZSBhcnJheSwgYSByZW1vdGUgb2JqZWN0LCBvciBpZiBpdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLgotVGhpcyBtZXNzYWdlIGZsYWdzIGphdmEubGFuZy5PYmplY3QgYW5kIGl0IGNhbm5vdCBiZSBkaXNhYmxlZC4gWW91IGNhbiBlaXRoZXIKLW1ha2UgdGhlIG9iamVjdCBzZXJpYWxpemFibGUgYXQgY29tcGlsZS10aW1lIG9yIGlnbm9yZSB0aGUgd2FybmluZy4gPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUxNiAiPkNIS0oyNDEyPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTE4ICI+VGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIDwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iZDBlMTYgIj5DSEtKMjQxMzwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJkMGUxOCAiPkFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS48L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTE2ICI+Q0hLSjIxMDI8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iZDBlMTggIj5FaXRoZXIgYSBmaW5kZXIgZGVzY3JpcHRvciwgb3IgYSBtYXRjaGluZyBjdXN0b20gZmluZGVyIG1ldGhvZCBvbiB0aGUKLXswfSBjbGFzcywgbXVzdCBiZSBkZWZpbmVkLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMjAgIj5BIGZpbmRlciBkZXNjcmlwdG9yIG11c3QgZXhpc3QgZm9yIGV2ZXJ5IGZpbmRlciBtZXRob2QuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUxNiAiPkNIS0oyODczPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTE4ICI+TWlncmF0ZSB0aGlzIGJlYW4ncyBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5Ci1iaW5kaW5nLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMjAgIj4mbmJzcDs8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTE2ICI+Q0hLSjI4NzQ8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iZDBlMTggIj5NaWdyYXRlIHRoaXMgRUpCIG1vZHVsZSdzIGRlZmF1bHQgZGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgZGVmYXVsdCBDTVAKLUNvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMjAgIj4mbmJzcDs8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMC4yNzAyNzAyNzAyNzAyNyUiIGhlYWRlcnM9ImQwZTE2ICI+Q0hLSjI4NzVFICAgICAgIDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJkMGUxOCAiPiZsdDtlamItY2xpZW50LWphciZndDsgezB9IG11c3QgZXhpc3QgaW4gZXZlcnkgRUFSIGZpbGUKLXRoYXQgY29udGFpbnMgdGhpcyBFSkIgbW9kdWxlLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMjAgIj5JZiA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7ZWpiLWNsaWVudC1qYXImZ3Q7PC9zYW1wPiBpcyBzcGVjaWZpZWQKLWluIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+ZWpiLWphci54bWw8L3NwYW4+LCBhIGNvcnJlc3BvbmRpbmcgRUpCIGNsaWVudCBwcm9qZWN0IG11c3QKLWNvbnRhaW4gdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIGFuZCBhbnkgb3RoZXIgdHlwZXMgdGhhdCBhIGNsaWVudCB3aWxsCi1uZWVkLiBJZiB0aGVzZSB0eXBlcyBhcmUgYWxsIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBFSkIgcHJvamVjdCwgZGVsZXRlIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7ZWpiLWNsaWVudC1qYXImZ3Q7PC9zYW1wPiBsaW5lCi1pbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBPdGhlcndpc2UsIGVuc3VyZSB0aGF0IHRoZSBFSkIgY2xpZW50IHByb2plY3QKLWV4aXN0cywgaXMgb3BlbiwgYW5kIGlzIGEgcHJvamVjdCB1dGlsaXR5IEpBUiBpbiBldmVyeSBFQVIgdGhhdCB1c2VzIHRoaXMKLUVKQiBwcm9qZWN0IGFzIGEgbW9kdWxlLjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIwLjI3MDI3MDI3MDI3MDI3JSIgaGVhZGVycz0iZDBlMTYgIj5DSEtKMjkwNTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4zMjQzMjQzMjQzMjQzMjYlIiBoZWFkZXJzPSJkMGUxOCAiPlRoZSBFSkIgdmFsaWRhdG9yIGRpZCBub3QgcnVuIGJlY2F1c2UgZWpiLWphci54bWwgY291bGQgbm90IGJlIGxvYWRlZC4KLVJ1biB0aGUgWE1MIHZhbGlkYXRvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9ImQwZTIwICI+Q0hLSjI5MDUgbWVhbnMgdGhhdCB0aGUgcHJvamVjdCdzIG1ldGFkYXRhIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZAotZnJvbSBlamItamFyLnhtbC4gPG9sPjxsaT5FbnN1cmUgdGhlIGZvbGxvd2luZzogIDx1bD48bGk+dGhhdCB0aGUgTUVUQS1JTkYgZm9sZGVyIGV4aXN0cyBpbiB0aGUgRUpCIHByb2plY3Q8L2xpPgotPGxpPnRoYXQgTUVUQS1JTkYgY29udGFpbnMgZWpiLWphci54bWw8L2xpPgotPGxpPnRoYXQgTUVUQS1JTkYgaXMgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguPC9saT4KLTwvdWw+Ci0gIDwvbGk+Ci08bGk+VmFsaWRhdGUgdGhlIHN5bnRheCBvZiB0aGUgZWpiLWphci54bWwgZmlsZTogaW4gdGhlIE5hdmlnYXRvciB2aWV3LCBoaWdobGlnaHQKLXRoZSBlamItamFyLnhtbCBmaWxlLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZSBYTUwgZmlsZTwvc3Bhbj4uPC9saT4KLTxsaT5JZiBib3RoIDEpIGFuZCAyKSBhcmUgb2theSwgY2xvc2UgdGhlIHByb2plY3QsIHJlb3BlbiB0aGUgcHJvamVjdCwgYW5kCi1yZWJ1aWxkIHRoZSBwcm9qZWN0LiBUaGUgcHJvamVjdCBtZXRhZGF0YSB3aWxsIHJlZnJlc2guPC9saT4KLTwvb2w+Ci08L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2IGQwZTE4IGQwZTIwICI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQIHN5bnRheCB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUxNiAiPklXQVcwNDgyPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTE4ICI+Tm8gdmFsaWQgSnNwVHJhbnNsYXRvcjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMjAgIj5UaGVyZSBpcyBhIHBhdGggcHJvYmxlbSB3aXRoIHRoZSBwcm9qZWN0OyB0aGUgSlNQIFZhbGlkYXRvcgotbmVlZHMgYWNjZXNzIHRvIHRoZSBzZXJ2ZXIgcnVudGltZSBjb2RlLiBJZiBJV0FXMDQ4MkUgYXBwZWFycyBvbiBhbGwgd2ViIHByb2plY3RzLAotY2hlY2sgdGhlIFZhcmlhYmxlIG9yIEpSRSBwYXRoOiAgIDxvbD48bGk+Q2hlY2sgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyAoPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93ICZndDsgUHJlZmVyZW5jZXMgJmd0OyBKYXZhICZndDtJbnN0YWxsZWQKLUpSRXM8L3NwYW4+KSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2F0aW9uIGZvciB0aGUgSlJFIGlzIHBvaW50aW5nCi10byBhIHZhbGlkIEpSRSBkaXJlY3RvcnkuICA8L2xpPgotPGxpPkVuc3VyZSB0aGF0IHRoZSBjbGFzc3BhdGggdmFyaWFibGVzICg8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3cgJmd0OyBQcmVmZXJlbmNlcyAmZ3Q7Ci1KYXZhICZndDsgQnVpbGQgUGF0aCAmZ3Q7IENsYXNzcGF0aCBWYXJpYWJsZXM8L3NwYW4+KSBhcmUgc2V0IGNvcnJlY3RseS4gPC9saT4KLTwvb2w+Ci0gPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiBkMGUxOCBkMGUyMCAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldBUiB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUxNiAiPkNIS0ozMDA4PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjMyNDMyNDMyNDMyNDMyNiUiIGhlYWRlcnM9ImQwZTE4ICI+TWlzc2luZyBvciBpbnZhbGlkIFdBUiBmaWxlLjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NS40MDU0MDU0MDU0MDU0JSIgaGVhZGVycz0iZDBlMjAgIj5UaGUgd2ViLnhtbCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQuIFRoZSBwcm9qZWN0IG1ldGFkYXRhCi1jYW5ub3QgYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgd2ViLnhtbCBmaWxlLiAgIDxvbD48bGk+RW5zdXJlIHRoZSBmb2xsb3dpbmc6ICA8dWw+PGxpPnRoYXQgdGhlIFdFQi1JTkYgZm9sZGVyIGV4aXN0cyBpbiB0aGUgd2ViIHByb2plY3Q8L2xpPgotPGxpPnRoYXQgV0VCLUlORiBjb250YWlucyB0aGUgd2ViLnhtbCBmaWxlPC9saT4KLTxsaT50aGF0IFdFQi1JTkYgaXMgaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguPC9saT4KLTwvdWw+Ci0gIDwvbGk+Ci08bGk+VmFsaWRhdGUgdGhlIHN5bnRheCBvZiB0aGUgd2ViLnhtbCBmaWxlOiBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsIGhpZ2hsaWdodAotdGhlIHdlYi54bWwgZmlsZSwgcmlnaHQtY2xpY2ssIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGUgWE1MIGZpbGU8L3NwYW4+LjwvbGk+Ci08bGk+SWYgYm90aCAxKSBhbmQgMikgYXJlIG9rYXksIGNsb3NlIHRoZSBwcm9qZWN0LCByZW9wZW4gdGhlIHByb2plY3QsIGFuZAotcmVidWlsZCB0aGUgcHJvamVjdC4gVGhlIHByb2plY3QgbWV0YWRhdGEgd2lsbCByZWZyZXNoLjwvbGk+Ci08L29sPgotPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiBkMGUxOCBkMGUyMCAiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCB2YWxpZGF0b3I8L3NwYW4+PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAuMjcwMjcwMjcwMjcwMjclIiBoZWFkZXJzPSJkMGUxNiAiPiA8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMzI0MzI0MzI0MzI0MzI2JSIgaGVhZGVycz0iZDBlMTggIj5UaGUgY29udGVudCBvZiBlbGVtZW50IHR5cGUgImVqYi1qYXIiIGlzIGluY29tcGxldGUsIGl0IG11c3QgbWF0Y2gKLSIoZGVzY3JpcHRpb24/LGRpc3BsYXktbmFtZT8sc21hbGwtaWNvbj8sbGFyZ2UtaWNvbj8sZW50ZXJwcmlzZS1iZWFucyxhc3NlbWJseS1kZXNjcmlwdG9yPyxlamItY2xpZW50LWphcj8pIi48L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTUuNDA1NDA1NDA1NDA1NCUiIGhlYWRlcnM9ImQwZTIwICI+VGhlIEVKQiAxLjEgYW5kIDIuMCBzcGVjaWZpY2F0aW9ucyBtYW5kYXRlIHRoYXQgYXQgbGVhc3Qgb25lIGVudGVycHJpc2UKLWJlYW4gbXVzdCBleGlzdCBpbiBhbiBFSkIgLmphciBmaWxlLiBUaGlzIGVycm9yIG1lc3NhZ2UgaXMgbm9ybWFsIGR1cmluZyBkZXZlbG9wbWVudAotb2YgRUpCIC5qYXIgZmlsZXMgYW5kIGNhbiBiZSBpZ25vcmVkIHVudGlsIHlvdSBwZXJmb3JtIGEgcHJvZHVjdGlvbiBhY3Rpb24sCi1zdWNoIGFzIGV4cG9ydGluZyBvciBkZXBsb3lpbmcgY29kZS4gRGVmaW5lIGF0IGxlYXN0IG9uZSBlbnRlcnByaXNlIGJlYW4gaW4KLXRoZSBwcm9qZWN0LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGUgZGlmZmVyZW50IHByb2plY3QgdHlwZXMgYW5kIGdpdmVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaCB2YWxpZGF0b3IuIj5KMkVFIFZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxpZGF0b3JzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydmFsaWRhdG9ycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFjMGEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxpZGF0b3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+SjJFRSBWYWxpZGF0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJydmFsaWRhdG9ycyI+PGEgbmFtZT0icnZhbGlkYXRvcnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5KMkVFIFZhbGlkYXRvcnM8L2gxPgotPGRpdj48cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGRpZmZlcmVudAotcHJvamVjdCB0eXBlcyBhbmQgZ2l2ZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBlYWNoIHZhbGlkYXRvci48L3A+Ci0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj48dGhlYWQgYWxpZ249ImxlZnQiPjx0cj48dGggdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGlkPSJkMGUxNSI+VmFsaWRhdG9yIG5hbWU8L3RoPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBpZD0iZDBlMTciPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5Pjx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNSAiPkFwcGxpY2F0aW9uIENsaWVudCBWYWxpZGF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMTcgIj5UaGUgQXBwbGljYXRpb24gQ2xpZW50IFZhbGlkYXRvciB2YWxpZGF0ZXMKLXRoZSBmb2xsb3dpbmcgQXBwbGljYXRpb24gQ2xpZW50IHByb2plY3QgcmVzb3VyY2VzOiAgIDx1bD48bGk+RGVwbG95bWVudCBkZXNjcmlwdG9yIChhcHBsaWNhdGlvbi1jbGllbnQueG1sKTwvbGk+Ci08bGk+RUpCIHJlZmVyZW5jZXM8L2xpPgotPGxpPlJlc291cmNlIHJlZmVyZW5jZXM8L2xpPgotPC91bD4KLTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTE1ICI+RFREIFZhbGlkYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNyAiPlRoZSBEVEQgdmFsaWRhdG9yIGRldGVybWluZXMgd2hldGhlciB0aGUKLWN1cnJlbnQgc3RhdGUgb2YgYSBEVEQgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBYTUwgZmlsZXMgYXJlIHZhbGlkYXRlZCBhY2NvcmRpbmcKLXRvIHRoZSB0aGUgWE1MIHNwZWNpZmljYXRpb24gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2IiB0YXJnZXQ9Il9ibGFuayI+IEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMDwvYT4gZnJvbSB0aGUgVzNDCi1XZWIgc2l0ZS4gQXMgd2VsbCwgdGhlIERURCB2YWxpZGF0b3IgY2hlY2tzIGZvciBlcnJvcnMgc3VjaCBhcyByZWZlcmVuY2VzCi10byBlbnRpdGllcyBhbmQgZWxlbWVudHMgdGhhdCBkbyBub3QgZXhpc3QuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMTUgIj5FQVIgVmFsaWRhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTE3ICI+VGhlIEVBUiBWYWxpZGF0b3IgdmFsaWRhdGVzIHRoZSBmb2xsb3dpbmc6Ci0gPHVsPjxsaT5FQVIgZGVwbG95bWVudCBkZXNjcmlwdG9yIChhcHBsaWNhdGlvbi54bWwpPC9saT4KLTxsaT5FSkIgcmVmZXJlbmNlcyBvZiBhbGwgbW9kdWxlIHByb2plY3RzIGluIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2xpPgotPGxpPlNlY3VyaXR5IHJvbGVzPC9saT4KLTxsaT5SZXNvdXJjZSByZWZlcmVuY2VzPC9saT4KLTxsaT5NYW5pZmVzdCBmaWxlcyBmb3IgYWxsIGNvbnRhaW5lZCBvciByZWZlcmVuY2VkIG1vZHVsZXMgYW5kIHV0aWxpdHkgSkFSCi1maWxlczwvbGk+Ci08bGk+VGFyZ2V0IHNlcnZlciBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYW5kCi1hbnkgdXRpbGl0eSBhbmQgbW9kdWxlIHByb2plY3RzPC9saT4KLTxsaT5FeGlzdGVuY2Ugb2YgcHJvamVjdHMgZm9yIGVhY2ggbW9kdWxlIGRlZmluZWQgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbjwvbGk+Ci08L3VsPgotICA8cD5Ob3RlIHRoYXQgdGhlIEVBUiBWYWxpZGF0b3Igb25seSBlbnN1cmVzIHRoZSB2YWxpZGl0eSBhbmQgZGVwZW5kZW5jeQotb2YgdGhlIG1vZHVsZSBwcm9qZWN0cyB3aXRoIHJlc3BlY3QgdG8gdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC48L3A+Ci08L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNSAiPkVKQiBWYWxpZGF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMTcgIj5UaGUgRUpCIFZhbGlkYXRvciB2ZXJpZmllcyB0aGF0IGVudGVycHJpc2UKLWJlYW5zIGNvbnRhaW5lZCBpbiBhbiBFSkIgcHJvamVjdCBjb21wbHkgd2l0aCB0aGUgU3VuIEVudGVycHJpc2UgSmF2YUJlYW5z4oSiIFNwZWNpZmljYXRpb25zCi0oMS4xLCAyLjAsIGFuZCAyLjEpLCBkZXBlbmRpbmcgb24gdGhlIGxldmVsIG9mIHRoZSBiZWFuLiBDb2RlIHZhbGlkYXRpb24gZm9yCi10aGUgRUpCIDEuMCBzcGVjaWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICAgPHA+U3BlY2lmaWNhbGx5LCB0aGUgRUpCIFZhbGlkYXRvcgotdmFsaWRhdGVzIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2VzOiA8L3A+Ci0gIDx1bD48bGk+SmF2YeKEoiAuY2xhc3MKLWZpbGVzIHRoYXQgYXJlIG1lbWJlcnMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIChob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwKLWVudGVycHJpc2UgYmVhbiBjbGFzcywgYW5kLCBpZiB0aGUgYmVhbiBpcyBhbiBlbnRpdHkgYmVhbiwgdGhlIGtleSBjbGFzcyk8L2xpPgotPGxpPmVqYi1qYXIueG1sPC9saT4KLTxsaT5pYm0tZWpiLWphci1leHQueG1pIDwvbGk+Ci08L3VsPgotIDwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMTUgIj5Db25uZWN0b3IgVmFsaWRhdG9yPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMTcgIj5UaGUgQ29ubmVjdG9yIHZhbGlkYXRvciBjaGVja3MgZm9yIGludmFsaWQgSjJFRSBzcGVjaWZpY2F0aW9uCi1sZXZlbHMgaW4gY29ubmVjdG9yIHByb2plY3RzLjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTE1ICI+SFRNTCBTeW50YXggVmFsaWRhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTE3ICI+VGhlIEhUTUwgU3ludGF4IFZhbGlkYXRvciB2YWxpZGF0ZXMgSFRNTAotYmFzaWMgc3ludGF4IGFuZCBIVE1MIERURCBjb21wbGlhbmNlIGluIHRoZSBmb2xsb3dpbmcgV2ViIHByb2plY3QgcmVzb3VyY2VzOgotIDx1bD48bGk+SFRNTCBmaWxlczwvbGk+Ci08bGk+SlNQIGZpbGVzPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNSAiPkpTUCBTeW50YXggVmFsaWRhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTE3ICI+VGhlIEpTUCBTeW50YXggVmFsaWRhdG9yIHZhbGlkYXRlcwotSlNQIGZpbGVzIGluIGEgcHJvamVjdCBieSB0cmFuc2xhdGluZyB0aGVtIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBjb2RlCi1hbmQgdGhlbiBjaGVja2luZyB0aGUgSmF2YSBjb2RlIGZvciBjb21waWxlIGVycm9ycy48L3RkPgotPC90cj4KLTx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNSAiPldBUiBWYWxpZGF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMTcgIj5UaGUgV0FSIFZhbGlkYXRvciB2YWxpZGF0ZXMgdGhlIGZvbGxvd2luZwotd2ViIHByb2plY3QgcmVzb3VyY2VzOiAgIDx1bD48bGk+RGVwbG95bWVudCBkZXNjcmlwdG9yICh3ZWIueG1sKTwvbGk+Ci08bGk+U2VydmxldHM8L2xpPgotPGxpPlNlY3VyaXR5IHJvbGVzPC9saT4KLTxsaT5TZXJ2bGV0ICZhbXA7IHNlcnZsZXQgbWFwcGluZ3M8L2xpPgotPGxpPkVKQiByZWZlcmVuY2VzPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTE1ICI+V1NETCBWYWxpZGF0b3I8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNyAiPlRoZSBXU0RMIHZhbGlkYXRvciBjaGVja3MgdGhlIGZvbGxvd2luZyBpbiBXU0RMIGZpbGVzOiA8dWw+PGxpPlhNTCBzeW50YXg8L2xpPgotPGxpPlhNTCBTY2hlbWEgdHlwZXMgaW4gdGhlICZsdDt0eXBlcyZndDsgc2VjdGlvbjwvbGk+Ci08bGk+UmVmZXJlbnRpYWwgaW50ZWdyaXR5IG9mIHRoZSB2YXJpb3VzIGNvbnN0cnVjdHMgaW4gV1NETCA8L2xpPgotPC91bD4KLVRoZSB2YWxpZGF0b3IgYWxzbyBpbmNsdWRlcyBhbiBleHRlbnNpb24gcG9pbnQgdG8gYWxsb3cgb3RoZXIgdmFsaWRhdG9ycwotdG8gYmUgcGx1Z2dlZCBpbnRvIHRoZSBXU0RMIHZhbGlkYXRpb24gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbgotb2YgdGhlIFdTREwgZmlsZS4gVGhyb3VnaCB0aGlzIG1lY2hhbmlzbSwgaW50ZXJvcGVyYWJpbGl0eSBpcyBjaGVja2VkIGJ5IHZhbGlkYXRpbmcKLWEgV1NETCBmaWxlIGFnYWluc3QgV1MtSSBQcm9maWxlcy4gPHA+VGhpcyB2YWxpZGF0b3IgaXMgbm90IGF2YWlsYWJsZSBpbiBXZWJTcGhlcmU8c3VwPsKuPC9zdXA+IFN0dWRpbwotU2l0ZSBEZXZlbG9wZXIuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNSAiPldTLUkgTWVzc2FnZSBWYWxpZGF0b3I8L3RkPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNyAiPldTLUkgTWVzc2FnZSB2YWxpZGF0b3IgY2hlY2tzIFNPQVAgbWVzc2FnZXMgYWdhaW5zdAotV1MtSSBQcm9maWxlcy4gQSB1c2VyIGNhbiBjYXB0dXJlIGFuZCB2ZXJpZnkgU09BUCBtZXNzYWdlcyB1c2luZyB0aGUgVENQL0lQCi1Nb25pdG9yLiBUaGUgdmFsaWRhdG9yIGNoZWNrcyBhIG1lc3NhZ2UgbG9nIHRoYXQgaXMgc2F2ZWQgYXMgYSBwcm9qZWN0IHJlc291cmNlCi0oLndzaW1zZykuIFRoZSBsb2cgY29uZm9ybXMgdG8gYSBmb3JtYXQgYXMgc3BlY2lmaWVkIGJ5IFdTLUkuPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgd2lkdGg9IjUwJSIgaGVhZGVycz0iZDBlMTUgIj5YTUwgU2NoZW1hIFZhbGlkYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNyAiPlRoZSBYTUwgc2NoZW1hIHZhbGlkYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIKLXRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIFhNTCBzY2hlbWFzCi1hcmUgdmFsaWRhdGVkIGFjY29yZGluZyB0byB0aGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyI+IFhNTCBTY2hlbWEgUGFydCAxOgotU3RydWN0dXJlczwvYT4gZnJvbSB0aGUgVzNDIFdlYiBzaXRlLjwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIHdpZHRoPSI1MCUiIGhlYWRlcnM9ImQwZTE1ICI+WE1MIFZhbGlkYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiB3aWR0aD0iNTAlIiBoZWFkZXJzPSJkMGUxNyAiPlRoZSBYTUwgdmFsaWRhdG9yIGVuc3VyZXMgdGhhdCBhbiBYTUwgZmlsZQotaXMgd2VsbC1mb3JtZWQuIEl0IGFsc28gdmVyaWZpZXMgaWYgYW4gWE1MIGZpbGUgaXMgdmFsaWQgLSB0aGF0IGlzLCBpdCBmb2xsb3dzCi10aGUgY29uc3RyYWludHMgZXN0YWJsaXNoZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkCi13aXRoLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnZhbGVyci5odG1sIiB0aXRsZT0iWW91IG1heSBlbmNvdW50ZXIgdGhlc2UgY29tbW9uIGVycm9yIG1lc3NhZ2VzIHdoZW4geW91IHZhbGlkYXRlIHlvdXIgcHJvamVjdHMuIj5Db21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGphcHBwcm9qLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amFwcHByb2ouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0NTYxYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amFwcHByb2ouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amFwcHByb2oiPjxhIG5hbWU9InRqYXBwcHJvaiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9oMT4KLTxkaXY+PHA+WW91IGNhbiB1c2UgYSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ci1hbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGNvbnRhaW4gdGhlIHJlc291cmNlcyBuZWVkZWQgZm9yCi1hcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcy4gQXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIGNvbnRhaW4gcHJvZ3JhbXMgdGhhdAotcnVuIG9uIG5ldHdvcmtlZCBjbGllbnQgc3lzdGVtcy4gQW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgaXMgZGVwbG95ZWQKLWFzIGEgSkFSIGZpbGUuPC9wPgotPHA+VG8gY3JlYXRlIGEgSjJFRSBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdDo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBKMkVFIHBlcnNwZWN0aXZlLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgYSBuYW1lIGZvciB0aGUgYXBwbGljYXRpb24KLWNsaWVudCBwcm9qZWN0LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gY2hhbmdlIHRoZSBkZWZhdWx0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2plY3QgbG9jYXRpb248L3NwYW4+LAotY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gYnV0dG9uIHRvIHNlbGVjdCBhIG5ldyBsb2NhdGlvbi4gSWYKLXlvdSBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgcHJvamVjdCBsb2NhdGlvbiB0aGF0IGlzIGFscmVhZHkgYmVpbmcgdXNlZCBieSBhbm90aGVyCi1wcm9qZWN0LCB0aGUgcHJvamVjdCBjcmVhdGlvbiB3aWxsIGZhaWwuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cgQWR2YW5jZWQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0IHNlcnZlcjwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZSBhcHBsaWNhdGlvbgotc2VydmVyIHRoYXQgeW91IHdhbnQgdG8gdGFyZ2V0IGZvciB5b3VyIGRldmVsb3BtZW50LiBUaGlzIHNlbGVjdGlvbiBhZmZlY3RzCi10aGUgcnVuIHRpbWUgc2V0dGluZ3MgYnkgbW9kaWZ5aW5nIHRoZSBjbGFzcyBwYXRoIGVudHJpZXMgZm9yIHRoZSBwcm9qZWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TW9kdWxlIHZlcnNpb248L3NwYW4+IGxpc3QsIHNlbGVjdAotdGhlIEoyRUUgc3BlY2lmaWNhdGlvbiBsZXZlbCB0byB3aGljaCB5b3Ugd2FudCB5b3VyIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ci10byBhZGhlcmUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGFkZCB0aGUgbmV3IG1vZHVsZSB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uCi0oRUFSKSBwcm9qZWN0LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBtb2R1bGUgdG8gYW4gRUFSIGFwcGxpY2F0aW9uPC9zcGFuPiBjaGVjawotYm94Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIGFwcGxpY2F0aW9uPC9zcGFuPiBsaXN0LCB0eXBlIGEgbmV3Ci1wcm9qZWN0IG5hbWUgb3Igc2VsZWN0IGFuIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gT3IsIGNsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBidXR0b24gdG8gbGF1bmNoIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbgotUHJvamVjdCB3aXphcmQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOiA8L3NwYW4+SWYgeW91IHR5cGUgYSBuZXcgRUFSIHByb2plY3QgbmFtZSwgdGhlIEVBUgotcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24gd2l0aCB0aGUgbG93ZXN0IGNvbXBhdGlibGUKLUoyRUUgdmVyc2lvbiBiYXNlZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBiZWluZyBjcmVhdGVkLiBJZiB5b3Ugd2FudAotdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50IGxvY2F0aW9uIGZvciB0aGUgZW50ZXJwcmlzZQotYXBwbGljYXRpb24sIHlvdSBtdXN0IHVzZSB0aGUgTmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCB3aXphcmQuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2Ugc2VydmljZXMuIj5KMkVFIGFyY2hpdGVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqYXBwY2xpcHJvai5odG1sIj5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqZXhwYXBwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLiI+RXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpjaXJjbGViLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amNpcmNsZWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0NWVjZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amNpcmNsZWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5Db3JyZWN0aW5nIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY2lyY2xlYiI+PGEgbmFtZT0idGpjaXJjbGViIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29ycmVjdGluZyBjeWNsaWNhbCBkZXBlbmRlbmNpZXMgYWZ0ZXIgYW4gRUFSIGlzIGltcG9ydGVkPC9oMT4KLTxkaXY+PHA+WW91IGNhbiByZXNvbHZlIGN5Y2xpY2FsIGRlcGVuZGVuY2llcyBhZnRlciBhbiBFQVIgaXMgaW1wb3J0ZWQuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+QSBjeWNsaWNhbCBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIG9yIG1vcmUgbW9kdWxlcyBpbiBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiBtb3N0IGNvbW1vbmx5IG9jY3VycyB3aGVuIHByb2plY3RzIGFyZSBpbXBvcnRlZCBmcm9tIG91dHNpZGUgdGhlCi13b3JrYmVuY2guIFdoZW4gYSBjeWNsZSBleGlzdHMgYmV0d2VlbiB0d28gb3IgbW9yZSBtb2R1bGVzIGluIGFuIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uLCB0aGUgSmF2YeKEoiBidWlsZGVyIGNhbm5vdCBhY2N1cmF0ZWx5IGNvbXB1dGUgdGhlIGJ1aWxkIG9yZGVyCi1vZiB0aGUgcHJvamVjdHMuIEZ1bGwgYnVpbGRzIGZhaWwgdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgb3IgcmVxdWlyZSBzZXZlcmFsCi1pbnZvY2F0aW9ucy48cD5UaGVyZWZvcmUsIHRoZSBiZXN0IHByYWN0aWNlIGlzIHRvIG9yZ2FuaXplIHlvdXIgcHJvamVjdHMgb3IKLW1vZHVsZXMgaW50byBjb21wb25lbnRzLiBUaGlzIGFsbG93cyB5b3VyIG1vZHVsZSBkZXBlbmRlbmNpZXMgdG8gZnVuY3Rpb24KLWFzIGEgdHJlZSBpbnN0ZWFkIG9mIGEgY3ljbGUgZGlhZ3JhbS4gVGhpcyBwcmFjdGljZSBoYXMgdGhlIGFkZGVkIGJlbmVmaXQKLW9mIHByb2R1Y2luZyBhIGJldHRlciBmYWN0b3JlZCBhbmQgbGF5ZXJlZCBhcHBsaWNhdGlvbi48L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+SWRlbnRpZnkgYWxsIHRoZSBjbGFzc2VzIHdpdGhpbiB0aGUgSkFSIGZpbGVzIHRoYXQgaGF2ZSBjeWNsaWNhbAotZGVwZW5kZW5jaWVzLCB0aGVuIG1vdmUgdGhvc2UgY2xhc3NlcyBpbnRvIGEgY29tbW9uIEphdmEgcHJvamVjdAotb3IgSkFSIGZpbGUuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+TWFwIHV0aWxpdHkgSkFSIGZpbGVzIHRvIHRoZSBjb21tb24gcHJvamVjdHMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+U2V0IGRlcGVuZGVuY2llcyBvbmx5IHRvIHRoZSBKQVIgZmlsZXMgdGhhdCBhcmUgdHJ1bHkgcmVxdWlyZWQuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqY2lyY2xlLmh0bWwiPkN5Y2xpY2FsIGRlcGVuZGVuY2llcyBiZXR3ZWVuIEoyRUUgbW9kdWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGplYXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZWFyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTgxOWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGplYXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqZWFyIj48YSBuYW1lPSJ0amVhciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgcmVzb3VyY2VzCi1uZWVkZWQgZm9yIGVudGVycHJpc2UgYXBwbGljYXRpb25zIGFuZCBjYW4gY29udGFpbiBhIGNvbWJpbmF0aW9uIG9mIFdlYiBtb2R1bGVzLAotSkFSIGZpbGVzLCBjb25uZWN0b3IgbW9kdWxlcywgRUpCIG1vZHVsZXMsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcy4KLUFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBpcyBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZSwKLWFuZCBpcyB0aGVyZWZvcmUgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGFuIEVBUiBwcm9qZWN0LiBUaGUgbW9kdWxlcyBpbiBhbgotZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGFyZSBtYXBwZWQgdG8gb3RoZXIgSjJFRSBwcm9qZWN0cy4gVGhlIG1hcHBpbmcKLWluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBtZXRhZGF0YSBmaWxlcyB3aXRoaW4gdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24KLXByb2plY3QuIFRoZSBtZXRhZGF0YSBmaWxlcyBhcmUgdXNlZCBmb3IgZXhwb3J0aW5nIHRoZSBwcm9qZWN0IHRvIGFuIEVBUiBmaWxlCi1hbmQgZm9yIHJ1bm5pbmcgdGhlIHByb2plY3Qgb24gdGhlIHNlcnZlci48L3A+Ci08cD5XaGVuIHlvdSBjcmVhdGUgYW4gZW50ZXJwcmlzZQotYXBwbGljYXRpb24gcHJvamVjdCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgZG8gbm90IGdpdmUgaXQgYSBuYW1lIHRoYXQKLWNvbnRhaW5zIGRvdWJsZS1ieXRlIGNoYXJhY3RlciBzZXQgKERCQ1MpIGNoYXJhY3RlcnMuPC9wPgotPHA+VG8KLWNyZWF0ZSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgYSBuYW1lIGZvciB0aGUgbmV3Ci1lbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIFRvIGNoYW5nZSB0aGUgZGVmYXVsdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0IGxvY2F0aW9uPC9zcGFuPiwKLWNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGJ1dHRvbiB0byBzZWxlY3QgYSBuZXcgbG9jYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cgQWR2YW5jZWQ8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIHRhcmdldAotc2VydmVyIGFuZCBtb2R1bGUgdmVyc2lvbiBmb3IgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgc2VydmVyPC9zcGFuPiBsaXN0LCBzZWxlY3QKLXRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGhhdCB5b3Ugd2FudCB0byB0YXJnZXQgZm9yIHlvdXIgZGV2ZWxvcG1lbnQuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TW9kdWxlIHZlcnNpb248L3NwYW4+IGxpc3QsIHNwZWNpZnkKLXRoZSBKMkVFIHNwZWNpZmljYXRpb24gbGV2ZWwgdGhhdCB5b3Ugd2FudCB0byB1c2UgZm9yIHRoaXMgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBKMkVFIE1vZHVsZXMgdG8gQWRkIHRvIHRoZSBFQVIgcGFnZSwgc2VsZWN0IHRoZSBleGlzdGluZwotbW9kdWxlcyB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB0aGUgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gQ2xpY2sKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgTW9kdWxlPC9zcGFuPiBidXR0b24gdG8gb3BlbiBhbm90aGVyIHdpemFyZCB0aGF0IGNhbgotY3JlYXRlIG5ldyBtb2R1bGVzIGZvciB0aGlzIGVudGVycHJpc2UgYXBwbGljYXRpb24uIEluIHRoZSBOZXcKLU1vZHVsZSB3aXphcmQsIGlmIHlvdSBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBkZWZhdWx0IG1vZHVsZSBwcm9qZWN0czwvc3Bhbj4gY2hlY2sKLWJveCwgeW91IGNhbiBjaG9vc2UgdG8gY3JlYXRlIGRlZmF1bHQgdmVyc2lvbnMgb2YgdGhlIGZvbGxvd2luZyBtb2R1bGVzIHdoaWNoCi13aWxsIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBKMkVFIHZlcnNpb246PC9zcGFuPjx1bD48bGk+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2xpPgotPGxpPkVKQiBwcm9qZWN0PC9saT4KLTxsaT5XZWIgcHJvamVjdDwvbGk+Ci08bGk+Q29ubmVjdG9yIHByb2plY3Q8L2xpPgotPC91bD4KLSBUaGUgd2l6YXJkIHByb3ZpZGVzIGRlZmF1bHQgcHJvamVjdCBuYW1lcyBmb3IgdGhlIG1vZHVsZXMsIGJ1dCB5b3UgY2FuCi1zcGVjaWZ5IGRpZmZlcmVudCBwcm9qZWN0IG5hbWVzLiBUaGUgZGVmYXVsdCBtb2R1bGVzIHRoYXQgYXJlIGNyZWF0ZWQgd2lsbAotaGF2ZSB0aGUgc2FtZSBzZXJ2ZXIgdGFyZ2V0IGFzIHRoZSBuZXcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi48cD5JZiB5b3UgY2xlYXIKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgZGVmYXVsdCBtb2R1bGUgcHJvamVjdHM8L3NwYW4+IGNoZWNrIGJveCwgeW91IGNhbgotc2VsZWN0IGEgc2luZ2xlIG1vZHVsZSB0eXBlIGFuZCBwcm9jZWVkIHdpdGggdGhlIHByb3BlciB3aXphcmQgZm9yIHRoYXQgcHJvamVjdAotdHlwZS48L3A+Ci08cD5JZiB5b3UgY3JlYXRlIG5ldyBtb2R1bGVzIGF0IHRoaXMgdGltZSwgdGhleSBhcmUgYWRkZWQgdG8gdGhlCi1saXN0IG9mIGF2YWlsYWJsZSBtb2R1bGVzIGluIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0IHdpemFyZCwKLWlmIHRoZSBtb2R1bGUgdmVyc2lvbnMgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24KLXlvdSBhcmUgY3JlYXRpbmcuPC9wPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamVhcnByb2ouaHRtbCIgdGl0bGU9IkFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjb250YWlucyB0aGUgaGllcmFyY2h5IG9mIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCB0byBkZXBsb3kgYSBKMkVFIGVudGVycHJpc2UgYXBwbGljYXRpb24sIG9mdGVuIHJlZmVycmVkIHRvIGFzIGFuIEVBUiBmaWxlLiI+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBlYXIuaHRtbCIgdGl0bGU9IkVudGVycHJpc2UgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZCBpbiB0aGUgZm9ybSBvZiBhbiBFQVIgZmlsZS4gVXNlIHRoZSBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4iPkV4cG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGludG8gYW4gRUFSIGZpbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwYXBwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amV4cGFwcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTdlOTYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwYXBwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+RXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amV4cGFwcCI+PGEgbmFtZT0idGpleHBhcHAiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2gxPgotPGRpdj48cD5Zb3UgY2FuIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhcyBhIEpBUiBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGV4cG9ydCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBmcm9tIHRoZSB3b3JrYmVuY2g6PC9wPgotPC9kaXY+Ci08b2w+PGxpPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgb2YgdGhlIEoyRUUgcGVyc3BlY3RpdmUsIHJpZ2h0LWNsaWNrCi10aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QgdGhhdCB5b3Ugd2FudCB0byBleHBvcnQuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQ8L3NwYW4+PC9zcGFuPi4KLVRoZSBFeHBvcnQgd2l6YXJkIG9wZW5zLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNlbGVjdCBhbiBleHBvcnQgZGVzdGluYXRpb248L3NwYW4+LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHAKLUNsaWVudCBKQVIgZmlsZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0PC9zcGFuPiBsaXN0LAotc2VsZWN0IHRoZSBwcm9qZWN0IHRvIGV4cG9ydC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzdGluYXRpb248L3NwYW4+IGZpZWxkLCBlbnRlciB0aGUgZnVsbAotcGF0aCBhbmQgSkFSIGZpbGUgbmFtZSB3aGVyZSB5b3Ugd2FudCB0byBleHBvcnQgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0Ci10aGF0IGlzIHNlbGVjdGVkIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdDwvc3Bhbj4gbGlzdC48L3NwYW4+PC9saT4KLTxsaT48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyBleHBvcnQgc291cmNlIGZpbGVzLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cG9ydAotc291cmNlIGZpbGVzPC9zcGFuPiBjaGVjayBib3guPC9zcGFuPjwvbGk+Ci08bGk+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+SWYgeW91IGFyZSBleHBvcnRpbmcgdG8gYW4gZXhpc3RpbmcgSkFSIGZpbGUKLWFuZCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgd2FybmVkIGFib3V0IG92ZXJ3cml0aW5nIGl0LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcndyaXRlCi1leGlzdGluZyBmaWxlcyB3aXRob3V0IHdhcm5pbmc8L3NwYW4+PC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amFwcHByb2ouaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4iPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGppbXBhcHAuaHRtbCI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBlYXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqZXhwZWFyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODJkNzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGpleHBlYXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5FeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amV4cGVhciI+PGEgbmFtZT0idGpleHBlYXIiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlPC9oMT4KLTxkaXY+PHA+RW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgYXJlIGRlcGxveWVkIGluIHRoZSBmb3JtIG9mIGFuIEVBUiBmaWxlLgotVXNlIHRoZSBFeHBvcnQgd2l6YXJkIHRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbgotRUFSIGZpbGUgZm9yIGRlcGxveW1lbnQuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRvIGV4cG9ydCBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgaW50byBhbiBFQVIgZmlsZTo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBvZiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSwgcmlnaHQtY2xpY2sKLXRoZSBwcm9qZWN0IHRoYXQgeW91IHdhbnQgdG8gZXhwb3J0Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhwb3J0PC9zcGFuPjwvc3Bhbj4uCi1UaGUgRXhwb3J0IHdpemFyZCBvcGVucy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5VbmRlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgYW4gZXhwb3J0IGRlc3RpbmF0aW9uPC9zcGFuPiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSCi1maWxlPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIEFwcGxpY2F0aW9uPC9zcGFuPiBsaXN0LCBzZWxlY3QgdGhlCi1wcm9qZWN0IHRvIGV4cG9ydC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzdGluYXRpb248L3NwYW4+IGZpZWxkLCBlbnRlciB0aGUgZnVsbAotcGF0aCBhbmQgRUFSIGZpbGUgbmFtZSB3aGVyZSB5b3Ugd2FudCB0byBleHBvcnQgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24KLXByb2plY3QgdGhhdCBpcyBzZWxlY3RlZCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIEFwcGxpY2F0aW9uPC9zcGFuPiBmaWVsZC48L3NwYW4+PC9saT4KLTxsaT48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyBleHBvcnQgc291cmNlIGZpbGVzLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cG9ydAotc291cmNlIGZpbGVzPC9zcGFuPiBjaGVjayBib3guPC9zcGFuPjwvbGk+Ci08bGk+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+SWYgeW91IGFyZSBleHBvcnRpbmcgdG8gYW4gZXhpc3RpbmcgRUFSIGZpbGUKLWFuZCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgd2FybmVkIGFib3V0IG92ZXJ3cml0aW5nIGl0LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcndyaXRlCi1leGlzdGluZyBmaWxlcyB3aXRob3V0IHdhcm5pbmc8L3NwYW4+PC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgd2l6YXJkIGV4cG9ydHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBFQVIgcHJvamVjdCB0byB0aGUgc3BlY2lmaWVkCi1FQVIgZmlsZS4gQWRkaXRpb25hbGx5LCBmb3IgZWFjaCBwcm9qZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBtb2R1bGUgb3IgdXRpbGl0eQotSkFSIGluIHRoZSBhcHBsaWNhdGlvbiwgdGhlIHByb2plY3QgY29udGVudHMgYXJlIGV4cG9ydGVkIGludG8gYSBuZXN0ZWQgbW9kdWxlCi1vciBKQVIgZmlsZSBpbiB0aGUgRUFSIGZpbGUuIElmIGFueSB1bnNhdmVkIGNoYW5nZXMgZXhpc3Qgb24gYW55IG9mIHRoZSBmaWxlcwotaW4gYW55IG9mIHRoZSByZWZlcmVuY2VkIHByb2plY3RzLCB5b3UgYXJlIHByb21wdGVkIHRvIHNhdmUgdGhlc2UgZmlsZXMgcHJpb3IKLXRvIGV4cG9ydC48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFyY2guaHRtbCIgdGl0bGU9IlRoZSBKYXZhIDIgUGxhdGZvcm0sIEVudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgcHJvdmlkZXMgYSBzdGFuZGFyZCBmb3IgZGV2ZWxvcGluZyBtdWx0aXRpZXIsIGVudGVycHJpc2Ugc2VydmljZXMuIj5KMkVFIGFyY2hpdGVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NqZWFycHJvai5odG1sIiB0aXRsZT0iQW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGNvbnRhaW5zIHRoZSBoaWVyYXJjaHkgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGRlcGxveSBhIEoyRUUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYW4gRUFSIGZpbGUuIj5FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amVhci5odG1sIj5DcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wYXBwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGFwcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmM0M2FlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wYXBwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGppbXBhcHAiPjxhIG5hbWU9InRqaW1wYXBwIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5BcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdHMgYXJlIGRlcGxveWVkIGFzIEpBUiBmaWxlcy4gWW91IGNhbgotaW1wb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHRoYXQgaGFzIGJlZW4gZGVwbG95ZWQgaW50byBhIEpBUiBmaWxlCi1ieSB1c2luZyB0aGUgSW1wb3J0IHdpemFyZC48L3A+Ci08cD5UbyBpbXBvcnQgYW4gYXBwbGljYXRpb24gY2xpZW50IEpBUiBmaWxlCi11c2luZyB0aGUgd2l6YXJkOjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEoyRUUgcGVyc3BlY3RpdmUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+PC9zcGFuPi4gVGhlIEltcG9ydCB3aXphcmQgb3BlbnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNlbGVjdCBhbiBpbXBvcnQgc291cmNlPC9zcGFuPiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwCi1DbGllbnQgSkFSIGZpbGU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGxpY2F0aW9uIENsaWVudCBmaWxlPC9zcGFuPiBjb21iaW5hdGlvbgotYm94LCBlbnRlciB0aGUgbG9jYXRpb24gYW5kIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZSB0aGF0IHlvdQotd2FudCB0byBpbXBvcnQuIENsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGJ1dHRvbiB0byBzZWxlY3QgdGhlCi1KQVIgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0PC9zcGFuPiBjb21iaW5hdGlvbgotYm94LCB0eXBlIGEgbmFtZSBmb3IgYSBuZXcgcHJvamVjdCBvciBzZWxlY3QgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QKLWZyb20gdGhlIGxpc3QuIE9yLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBidXR0b24gdG8KLWxhdW5jaCB0aGUgTmV3IEFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0IHdpemFyZC4gSWYgeW91IHR5cGUgYSBuZXcgbmFtZSBpbgotdGhpcyBmaWVsZCwgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBiYXNlZCBvbiB0aGUgdmVyc2lvbgotb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZSwgYW5kIGl0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGxvY2F0aW9uLgotVXNlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IGJ1dHRvbiB0byBjaGFuZ2UgdGhlIEoyRUUgdmVyc2lvbiBhbmQgdGhlCi1sb2NhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldCBzZXJ2ZXI8L3NwYW4+IGxpc3QsIHNlbGVjdAotdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHlvdSB3YW50IHRvIHRhcmdldCBmb3IgeW91ciBkZXZlbG9wbWVudC4gVGhpcwotc2VsZWN0aW9uIGFmZmVjdHMgdGhlIHJ1biB0aW1lIHNldHRpbmdzIGJ5IG1vZGlmeWluZyB0aGUgY2xhc3MgcGF0aCBlbnRyaWVzCi1mb3IgdGhlIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGFkZCB0aGUgaW1wb3J0ZWQgcHJvamVjdCB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uCi0oRUFSKSBwcm9qZWN0LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBtb2R1bGUgdG8gYW4gRUFSIGFwcGxpY2F0aW9uPC9zcGFuPiBjaGVjawotYm94Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIGFwcGxpY2F0aW9uPC9zcGFuPiBsaXN0LCB0eXBlIGEgbmV3Ci1wcm9qZWN0IG5hbWUgb3Igc2VsZWN0IGFuIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gT3IsIGNsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBidXR0b24gdG8gbGF1bmNoIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbgotUHJvamVjdCB3aXphcmQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOiA8L3NwYW4+SWYgeW91IHR5cGUgYSBuZXcgRUFSIHByb2plY3QgbmFtZSwgdGhlIEVBUgotcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24gd2l0aCB0aGUgbG93ZXN0IGNvbXBhdGlibGUKLUoyRUUgdmVyc2lvbiBiYXNlZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBiZWluZyBjcmVhdGVkLiBJZiB5b3Ugd2FudAotdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50IGxvY2F0aW9uIGZvciB0aGUgZW50ZXJwcmlzZQotYXBwbGljYXRpb24sIHlvdSBtdXN0IHVzZSB0aGUgTmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCB3aXphcmQuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+IHRvIGltcG9ydCB0aGUgYXBwbGljYXRpb24gY2xpZW50Ci1KQVIgZmlsZS48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jamFwcGNsaXByb2ouaHRtbCI+QXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90amFwcHByb2ouaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4iPkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpleHBhcHAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGFzIGEgSkFSIGZpbGUuIj5FeHBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wZWFyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90amltcGVhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzdkOWMzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqaW1wZWFyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqaW1wZWFyIj48YSBuYW1lPSJ0amltcGVhciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdHMgYXJlIGRlcGxveWVkIGludG8gRUFSIGZpbGVzLgotWW91IGNhbiBpbXBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGJ5IGltcG9ydGluZyBpdCBmcm9tIGEgZGVwbG95ZWQKLUVBUiBmaWxlLjwvcD4KLTxwPllvdSBjYW4gYWxzbyBjaG9vc2UgdG8gaW1wb3J0IHV0aWxpdHkgSkFSIGZpbGVzIGFzIHV0aWxpdHkgSmF2YeKEoiBwcm9qZWN0cy4KLVlvdSBjYW4gYWxzbyB1c2UgdGhlIHdpemFyZCB0byBjaGFuZ2UgdGhlIG5ldyBwcm9qZWN0IG5hbWVzIGZvciB0aGUgRUFSIGZpbGUKLWFuZCBtb2R1bGVzIHRoYXQgd2lsbCBiZSBpbXBvcnRlZC48L3A+Ci08cD5UbyBpbXBvcnQgYW4gRUFSIGZpbGUgdXNpbmcgdGhlIHdpemFyZDo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBKMkVFIHBlcnNwZWN0aXZlLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW1wb3J0PC9zcGFuPjwvc3Bhbj4uIFRoZSBJbXBvcnQgd2l6YXJkIG9wZW5zLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5VbmRlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgYW4gaW1wb3J0IHNvdXJjZTwvc3Bhbj4sIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVBUgotZmlsZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSBmb2xsb3dpbmcgZ2VuZXJhbCBvcHRpb25zIGZvciB0aGUgRUFSIGltcG9ydDo8L3NwYW4+IDxvbCB0eXBlPSJhIj48bGk+PHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIGZpbGU8L3NwYW4+OiBFbnRlciB0aGUgZnVsbCBwYXRoIGZvciB0aGUKLUVBUiBmaWxlIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0LiBZb3UgY2FuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gdG8KLXNlbGVjdCB0aGUgRUFSIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIHByb2plY3Q8L3NwYW4+OiB0eXBlIGEgbmFtZSBmb3IgdGhlIGVudGVycHJpc2UKLWFwcGxpY2F0aW9uIHByb2plY3QgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgd2hlbiB5b3UgaW1wb3J0IHRoZSBFQVIgZmlsZS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgc2VydmVyPC9zcGFuPjogU2VsZWN0IHRoZSBhcHBsaWNhdGlvbgotc2VydmVyIHRoYXQgeW91IHdhbnQgdG8gdGFyZ2V0IGZvciB5b3VyIGRldmVsb3BtZW50LiBUaGlzIHNlbGVjdGlvbiBhZmZlY3RzCi10aGUgcnVudGltZSBzZXR0aW5ncyBieSBtb2RpZnlpbmcgdGhlIGNsYXNzIHBhdGggZW50cmllcyBmb3IgdGhlIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIEltcG9ydCBwYWdlLCBzZWxlY3QgYW55IHV0aWxpdHkgSkFSCi1maWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IGFzIHV0aWxpdHkgcHJvamVjdHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Nb2R1bGUgUm9vdCBMb2NhdGlvbjwvc3Bhbj4gZmllbGQsIHNwZWNpZnkKLXRoZSByb290IGRpcmVjdG9yeSBmb3IgYWxsIG9mIHRoZSBwcm9qZWN0cyB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQgb3IgY3JlYXRlZAotZHVyaW5nIGltcG9ydC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBFQVIgTW9kdWxlIGFuZCBVdGlsaXR5IEpBUiBQcm9qZWN0cyBwYWdlIG9mIHRoZSB3aXphcmQsCi1zZWxlY3QgdGhlIHByb2plY3RzIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IHdpdGggdGhlIEVBUiBmaWxlLiBBbHNvLCB5b3UgY2FuCi1lZGl0IHRoZSBuZXcgcHJvamVjdCBuYW1lIGZvciBlYWNoIG1vZHVsZSBhbmQgdXRpbGl0eSBwcm9qZWN0IHRvIGJlIGltcG9ydGVkLjwvc3Bhbj4gPGRpdiBjbGFzcz0idGlwIj48c3BhbiBjbGFzcz0idGlwdGl0bGUiPlRpcDogPC9zcGFuPlRoZSBzZWxlY3Rpb24gYnV0dG9ucyBvbiB0aGlzIHBhZ2UgY2FuIGhlbHAgeW91IHNlbGVjdAotdGhlIHByb2plY3RzIHRvIGltcG9ydCB3aGVuIHlvdSBhcmUgaW1wb3J0aW5nIGZvciBwYXJ0aWFsIEVBUiBkZXZlbG9wbWVudC4KLUZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGltcG9ydGluZyB0byBhIHdvcmtzcGFjZSB3aGVyZSBzb21lIHByb2plY3RzIGFyZSBhdHRhY2hlZAotdG8gYSByZXBvc2l0b3J5IGFuZCBvdGhlciBwcm9qZWN0cyBhcmUgaW4gYmluYXJ5IGZvcm0sIHRoZXNlIGJ1dHRvbnMgaGVscAoteW91IG1ha2UgdGhlIHByb3BlciBzZWxlY3Rpb25zIGZvciB3aGljaCBwcm9qZWN0cyB0byBpbXBvcnQ6PHVsPjxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgTmV3PC9zcGFuPjogU2VsZWN0cyB0aGUgcHJvamVjdHMgdGhhdCBhcmUgY3VycmVudGx5Ci1ub3QgaW4geW91ciB3b3Jrc3BhY2UuPC9saT4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgQmluYXJ5PC9zcGFuPjogU2VsZWN0cyB0aGUgbW9kdWxlcyBhbmQgcHJvamVjdHMKLXRoYXQgY3VycmVudGx5IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UgaW4gYmluYXJ5IGZvcm0uIFRoaXMgY2FuIGhlbHAgeW91IGF2b2lkCi1vdmVyd3JpdGluZyB5b3VyIG5vbi1iaW5hcnkgcHJvamVjdHMgdGhhdCBhcmUgYXR0YWNoZWQgdG8gYSByZXBvc2l0b3J5LjwvbGk+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VsZWN0IEFsbDwvc3Bhbj46IFNlbGVjdHMgYWxsIHByb2plY3RzIGZvciBpbXBvcnQuPC9saT4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNlbGVjdCBBbGw8L3NwYW4+OiBDbGVhcnMgYWxsIG1vZHVsZSBhbmQgdXRpbGl0eSBwcm9qZWN0cwotZm9yIGltcG9ydC48L2xpPgotPC91bD4KLTwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPiB0byBpbXBvcnQgdGhlIGNvbnRlbnRzIG9mIHRoZQotRUFSIGZpbGUuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqcmFyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anJhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTY2NTQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqcmFyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpyYXIiPjxhIG5hbWU9InRqcmFyIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5BIGNvbm5lY3RvciBpcyBhIEoyRUUgc3RhbmRhcmQgZXh0ZW5zaW9uIG1lY2hhbmlzbSBmb3IgY29udGFpbmVycwotdG8gcHJvdmlkZSBjb25uZWN0aXZpdHkgdG8gZW50ZXJwcmlzZSBpbmZvcm1hdGlvbiBzeXN0ZW1zIChFSVNzKS4gQSBjb25uZWN0b3IKLWlzIHNwZWNpZmljIHRvIGFuIEVJUyBhbmQgY29uc2lzdHMgb2YgYSByZXNvdXJjZSBhZGFwdGVyIGFuZCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudAotdG9vbHMuIEEgcmVzb3VyY2UgYWRhcHRlciBpcyBhIHN5c3RlbS1sZXZlbCBzb2Z0d2FyZSBkcml2ZXIgdGhhdCBpcyB1c2VkIGJ5Ci1hbiBFSkIgY29udGFpbmVyIG9yIGFuIGFwcGxpY2F0aW9uIGNsaWVudCB0byBjb25uZWN0IHRvIGFuIEVJUy4gQ29ubmVjdG9ycwotY29tcGx5IHdpdGggdGhlIEoyRUUgQ29ubmVjdG9yIGFyY2hpdGVjdHVyZSAoSkNBKS48L3A+Ci08ZGl2IGNsYXNzPSJyZXN0cmljdGlvbiI+PHNwYW4gY2xhc3M9InJlc3RyaWN0aW9udGl0bGUiPlJlc3RyaWN0aW9uOiA8L3NwYW4+SjJFRQotMS4yIHNwZWNpZmljYXRpb24gbGV2ZWwgZG9lcyBub3QgaW5jbHVkZSBjb25uZWN0b3IgY2FwYWJpbGl0eS48L2Rpdj4KLTxwPlRvCi1jcmVhdGUgYSBuZXcgY29ubmVjdG9yIHByb2plY3Q6PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29ubmVjdG9yIFByb2plY3Q8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIGEgbmFtZSBmb3IgdGhlIGNvbm5lY3RvcgotcHJvamVjdC4gVG8gY2hhbmdlIHRoZSBkZWZhdWx0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2plY3QgbG9jYXRpb248L3NwYW4+LCBjbGljawotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gYnV0dG9uIHRvIHNlbGVjdCBhIG5ldyBsb2NhdGlvbi48L3NwYW4+IElmCi15b3Ugc3BlY2lmeSBhIG5vbi1kZWZhdWx0IHByb2plY3QgbG9jYXRpb24gdGhhdCBpcyBhbHJlYWR5IGJlaW5nIHVzZWQgYnkgYW5vdGhlcgotcHJvamVjdCwgdGhlIHByb2plY3QgY3JlYXRpb24gd2lsbCBmYWlsLjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNob3cgQWR2YW5jZWQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0IHNlcnZlcjwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZSBhcHBsaWNhdGlvbgotc2VydmVyIHRoYXQgeW91IHdhbnQgdG8gdGFyZ2V0IGZvciB5b3VyIGRldmVsb3BtZW50LiBUaGlzIHNlbGVjdGlvbiBhZmZlY3RzCi10aGUgcnVuIHRpbWUgc2V0dGluZ3MgYnkgbW9kaWZ5aW5nIHRoZSBjbGFzcyBwYXRoIGVudHJpZXMgZm9yIHRoZSBwcm9qZWN0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SkNBIHZlcnNpb248L3NwYW4+IGxpc3QsIHNlbGVjdCB0aGUgc3BlY2lmaWNhdGlvbgotdmVyc2lvbiB0byB3aGljaCB5b3Ugd2FudCB5b3VyIGNvbm5lY3RvciBwcm9qZWN0IHRvIGFkaGVyZS48L3NwYW4+IDwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGFkZCB0aGUgbmV3IG1vZHVsZSB0byBhbiBlbnRlcnByaXNlCi1hcHBsaWNhdGlvbiAoRUFSKSBwcm9qZWN0LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBtb2R1bGUgdG8gYW4gRUFSIGFwcGxpY2F0aW9uPC9zcGFuPiBjaGVjawotYm94Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RUFSIGFwcGxpY2F0aW9uPC9zcGFuPiBsaXN0LCB0eXBlIGEgbmV3Ci1wcm9qZWN0IG5hbWUgb3Igc2VsZWN0IGFuIGV4aXN0aW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdC4gT3IsIGNsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBidXR0b24gdG8gbGF1bmNoIHRoZSBOZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbgotUHJvamVjdCB3aXphcmQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOiA8L3NwYW4+SWYgeW91IHR5cGUgYSBuZXcgRUFSIHByb2plY3QgbmFtZSwgdGhlIEVBUgotcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24gd2l0aCB0aGUgbG93ZXN0IGNvbXBhdGlibGUKLUoyRUUgdmVyc2lvbiBiYXNlZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBiZWluZyBjcmVhdGVkLiBJZiB5b3Ugd2FudAotdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50IGxvY2F0aW9uIGZvciB0aGUgZW50ZXJwcmlzZQotYXBwbGljYXRpb24sIHlvdSBtdXN0IHVzZSB0aGUgTmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdCB3aXphcmQuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anRhcmdldHNlcnZlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp0YXJnZXRzZXJ2ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjYjJkMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anRhcmdldHNlcnZlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPlNwZWNpZnlpbmcgdGFyZ2V0IHNlcnZlcnMgZm9yIEoyRUUgcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqdGFyZ2V0c2VydmVyIj48YSBuYW1lPSJ0anRhcmdldHNlcnZlciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNwZWNpZnlpbmcgdGFyZ2V0IHNlcnZlcnMgZm9yIEoyRUUgcHJvamVjdHM8L2gxPgotPGRpdj48cD5XaGVuIHlvdSBkZXZlbG9wIEoyRUUgYXBwbGljYXRpb25zLCB0aGUgd29ya2JlbmNoIHJlcXVpcmVzIHRoYXQKLXlvdSBzcGVjaWZ5IHRoZSBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudHMgZm9yIHlvdXIgSjJFRSBwcm9qZWN0cy4gVGhlIHRhcmdldAotc2VydmVyIGlzIHNwZWNpZmllZCBkdXJpbmcgcHJvamVjdCBjcmVhdGlvbiBhbmQgaW1wb3J0LCBhbmQgaXQgY2FuIGJlIGNoYW5nZWQKLWluIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMuIFRoZSB0YXJnZXQgc2VydmVyIHNldHRpbmcgaXMgdGhlIGRlZmF1bHQgbWVjaGFuaXNtCi1mb3Igc2V0dGluZyB0aGUgY2xhc3MgcGF0aCBmb3IgSjJFRSBwcm9qZWN0cy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5JbiBvcmRlciB0byBzdXBwb3J0IGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHRoYXQgdXNlIGRpZmZlcmVudAotSkRLIGxldmVscyBmb3IgdGhlaXIgSmF2YeKEoiBSdW50aW1lIEVudmlyb25tZW50IChKUkUpLCB0aGUgd29ya2JlbmNoCi1yZXF1aXJlcyB0aGF0IHByb2plY3RzIGluY2x1ZGUgYSB0YXJnZXQgc2VydmVyIHNldHRpbmcuIEZvciBleGFtcGxlLCBpZiB5b3UKLXdhbnQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZlYXR1cmVzIG9mIEpESyAxLjQuMiwgeW91ciBhcHBsaWNhdGlvbnMgcmVxdWlyZQotZGlmZmVyZW50IGNsYXNzIHBhdGggZW50cmllcyB0aGFuIHRob3NlIHRoYXQgd2VyZSB1c2VkIGluIHByZXZpb3VzIHZlcnNpb25zCi1vZiB0aGUgd29ya2JlbmNoLiBCeSByZXF1aXJpbmcgdGhhdCB5b3Ugc3BlY2lmeSBhIHRhcmdldCBzZXJ2ZXIsIHRoZSB3b3JrYmVuY2gKLWVuZm9yY2VzIHRoYXQgcHJvcGVyIGVudHJpZXMgYXJlIGFwcHJvcHJpYXRlbHkgYWRkZWQgZm9yIHJ1bm5pbmcgb24gdGhlIHNlcnZlcgoteW91IGNob29zZS48L3A+Ci08cD5XaGVuIHRoZSBwcm9qZWN0IGlzIGNyZWF0ZWQsIHRoZSBjbGFzcyBwYXRoIG9mIHRoZSBwcm9qZWN0Ci1pcyB1cGRhdGVkIHdpdGggdHdvIGNsYXNzIHBhdGggY29udGFpbmVycy4gT25lIGNvbnRhaW5lciBpcyB0aGUgSkRLIGNvbnRhaW5lcgotYW5kIHRoZSBvdGhlciBpcyB0aGUgc2VydmVyIGNvbnRhaW5lci4gVGhlIEpESyBjb250YWluZXIgcG9pbnRzIHRvIHRoZSBkaXJlY3RvcnkKLXRoYXQgY29udGFpbnMgdGhlIEpBUiBmaWxlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGUgSkRLIHZlcnNpb24uCi1UaGUgc2VydmVyIGNvbnRhaW5lciBwb2ludHMgdG8gdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBtdWx0aXBsZSBwdWJsaWMKLUpBUiBmaWxlcyBhdmFpbGFibGUgaW4gdGhlIHNlbGVjdGVkIHNlcnZlci4gVGhlIHByb2plY3QgdGhlbiBjb21waWxlcyBiYXNlZAotb24gdGhlIHJlcXVpcmVkIEpBUiBmaWxlcyBsb2NhdGVkIGluIHRoZXNlIGZvbGRlcnMsIGFuZCB5b3UgZG8gbm90IG5lZWQgdG8KLXdvcnJ5IGFib3V0IGFkZGluZyBhZGRpdGlvbmFsIEpBUiBmaWxlcyBmcm9tIHRoZSBzZXJ2ZXIgZHVyaW5nIGRldmVsb3BtZW50LgotV2hlbiB0aGUgcHJvamVjdCBpcyBjb21waWxlZCwgdGhlIEpBUiBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIHBhdGguCi1Zb3UgY2FuIHN0aWxsIGFkZCB5b3VyIG93biBKQVIgZmlsZXMgdG8gdGhlIGNsYXNzIHBhdGguPC9wPgotPHA+VGhlIHRhcmdldCBydW50aW1lCi1lbnZpcm9ubWVudCBpcyBzcGVjaWZpZWQgaW4gdGhlIC5ydW50aW1lIGZpbGUgaW4gdGhlIHByb2plY3QncyByZXNvdXJjZXMuCi1Zb3Ugc2hvdWxkIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseS48L3A+Ci08cD5BbGwgSjJFRSBwcm9qZWN0IGNyZWF0aW9uIGFuZAotaW1wb3J0IHdpemFyZHMgcmVxdWlyZSB5b3UgdG8gc3BlY2lmeSB0aGUgdGFyZ2V0IHNlcnZlciBmb3IgdGhlIHJlc3VsdGluZwotcHJvamVjdHMuIFRoZSBsaXN0IG9mIHRhcmdldCBzZXJ2ZXJzIHRoYXQgeW91IGNhbiBjaG9vc2UgZnJvbSBpcyBmaWx0ZXJlZAotYmFzZWQgb24gaW5zdGFsbGVkIHJ1bnRpbWVzLCB0aGUgSjJFRSBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24sIGFuZCB0aGUgSjJFRQotbW9kdWxlIHR5cGUuIEZvciBleGFtcGxlLCBmb3IgRUpCIHByb2plY3RzIG9ubHkgYXBwbGljYXRpb24gc2VydmVycyB0aGF0IHN1cHBvcnQKLUVudGVycHJpc2UgSmF2YUJlYW5z4oSiIGFyZSBkaXNwbGF5ZWQuIEFsbCBwcm9qZWN0cyBpbnNpZGUgYQotc2luZ2xlIEVBUiBmaWxlIG11c3QgYmUgdGFyZ2V0ZWQgdG8gdGhlIHNhbWUgc2VydmVyLiBJZiB5b3UgY3JlYXRlIGEgbmV3IHByb2plY3QKLWFuZCBhZGQgaXQgdG8gYW4gZXhpc3RpbmcgRUFSIHByb2plY3QgZHVyaW5nIGNyZWF0aW9uLCB0aGUgcHJvamVjdCBpbmhlcml0cwotdGhlIHRhcmdldCBzZXJ2ZXIgc2V0dGluZyBvZiB0aGUgRUFSIHByb2plY3QuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTogPC9zcGFuPlV0aWxpdHkgSmF2YSBwcm9qZWN0cwotdGhhdCBhcmUgYWRkZWQgdG8gYW4gYXBwbGljYXRpb24gYXJlIHRhcmdldGVkIHRvIHRoZSBzYW1lIHRhcmdldCBzZXJ2ZXIgYXMKLXRoZSBhcHBsaWNhdGlvbi4gV2ViIGxpYnJhcnkgcHJvamVjdHMgdGhhdCBhcmUgYWRkZWQgdG8gYSBXZWIgcHJvamVjdCBhcmUKLXRhcmdldGVkIHRvIHRoZSBzYW1lIHRhcmdldCBzZXJ2ZXIgYXMgdGhlIFdlYiBwcm9qZWN0LjwvZGl2PgotPHA+VG8gbW9kaWZ5Ci10aGUgdGFyZ2V0IHJ1bnRpbWUgYW5kIGRlZmF1bHQgc2VydmVyIGZvciBhbiBleGlzdGluZyBwcm9qZWN0OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBvZiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSwgcmlnaHQtY2xpY2sKLXRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIG9yIG1vZHVsZSBwcm9qZWN0LCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+IGZyb20KLXRoZSBwb3AtdXAgbWVudS48L3NwYW4+IFRoZSBQcm9wZXJ0aWVzIGRpYWxvZyBmb3IgdGhlIHByb2plY3Qgb3BlbnMuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXJ2ZXI8L3NwYW4+IHBhZ2Ugb24gdGhlIFByb3BlcnRpZXMKLWRpYWxvZy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldCBydW50aW1lPC9zcGFuPiBsaXN0LCBzZWxlY3QKLXRoZSBzZXJ2ZXIgcnVudGltZSB0aGF0IHlvdSB3YW50IHlvdXIgcHJvamVjdCB0byBiZSBkZXZlbG9wZWQgZm9yLiBUaGlzIHNlbGVjdGlvbgotaW1wYWN0cyB0aGUgcnVudGltZSBsaWJyYXJpZXMgdGhhdCBhcmUgYWRkZWQgdG8geW91ciBwcm9qZWN0IGNsYXNzIHBhdGguIFlvdQotY2FuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gdG8gZGVmaW5lIGEgbmV3IHJ1bnRpbWUgZW52aXJvbm1lbnQgdGhhdAoteW91IGhhdmUgaW5zdGFsbGVkLiBUaGUgbGlzdCBvZiBydW50aW1lIGVudmlyb25tZW50cyBhcmUgZGVmaW5lZCBpbiB5b3VyIHdvcmtiZW5jaAotcHJlZmVyZW5jZXMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPkVudGVycHJpc2UgYXBwbGljYXRpb25zIG9ubHk6IFdoZW4gbW9kaWZ5aW5nCi10aGUgdGFyZ2V0IHNlcnZlciBmb3IgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiwgeW91IGNhbiBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluY2x1ZGUKLWNoaWxkIHByb2plY3RzPC9zcGFuPiBjaGVjayBib3ggdG8gYXBwbHkgeW91ciBjaGFuZ2VzIHRvIGFueSBjaGlsZHJlbgotbW9kdWxlcy48L3NwYW4+IFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QKLWFuZCBhbGwgb2YgaXRzIG1vZHVsZSBwcm9qZWN0cywgdXRpbGl0eSBwcm9qZWN0cywgYW5kIFdlYiBhcHBsaWNhdGlvbiBsaWJyYXJ5Ci1wcm9qZWN0cyBoYXZlIHRoZSBzYW1lIHRhcmdldCBzZXJ2ZXIuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlZmF1bHQgc2VydmVyPC9zcGFuPiBmaWVsZCwKLXNlbGVjdCBhIGRlZmF1bHQgc2VydmVyIHRvIHVzZSB3aGVuIGRlcGxveWluZyB0aGUgcHJvamVjdC4gQWx0aG91Z2ggeW91IHdvdWxkCi10eXBpY2FsbHkgc2V0IHRoaXMgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHRhcmdldCBydW50aW1lLCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVmYXVsdAotc2VydmVyPC9zcGFuPiBzZWxlY3Rpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldCBydW50aW1lPC9zcGFuPiBzZWxlY3Rpb24uCi1UaGUgZGVmYXVsdCBzZXJ2ZXIgc2ltcGx5IHNwZWNpZmllcyBhIHByb2plY3QgcHJlZmVyZW5jZSBzbyB5b3UgYXJlIG5vdCBwcm9tcHRlZAotZm9yIGF2YWlsYWJsZSBydW50aW1lIGVudmlyb25tZW50cyB3aGVuIHlvdSBkZXBsb3kgdGhlIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2phcmNoLmh0bWwiIHRpdGxlPSJUaGUgSmF2YSAyIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHByb3ZpZGVzIGEgc3RhbmRhcmQgZm9yIGRldmVsb3BpbmcgbXVsdGl0aWVyLCBlbnRlcnByaXNlIHNlcnZpY2VzLiI+SjJFRSBhcmNoaXRlY3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGZiNThiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbCI+PGEgbmFtZT0idGp2YWwiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VGhlIHdvcmtiZW5jaCBwcm92aWRlcyBtYW51YWwgY29kZSB2YWxpZGF0aW9uLCBjb2RlIHZhbGlkYXRpb24KLWR1cmluZyBhIGJ1aWxkLCBhbmQgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbiBvZiBwcm9qZWN0IHJlc291cmNlcy4gTWFudWFsCi1jb2RlIHZhbGlkYXRpb24gaXMgZXhwbGljaXRseSBpbnZva2VkIGJ5IHRoZSB1c2VyLCBhbmQgaXQgaW1tZWRpYXRlbHkgdmFsaWRhdGVzCi10aGUgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiBhIHNlbGVjdGVkIHByb2plY3QuIEJ1aWxkIHZhbGlkYXRpb24gb2NjdXJzIHdoZW4KLXlvdSBtYW51YWxseSBpbnZva2UgYSBidWlsZC4gQXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbiBvY2N1cnMgd2hlbmV2ZXIgYW4KLWF1dG9tYXRpYyBpbmNyZW1lbnRhbCBidWlsZCBvY2N1cnMgYXMgYSByZXN1bHQgb2YgYSByZXNvdXJjZSBjaGFuZ2UsIHN1Y2gKLWFzIHdoZW4gYSBwcm9qZWN0IGlzIGNyZWF0ZWQsIGEgLmphdmEgZmlsZSBpcyBlZGl0ZWQsIG9yIGEgbW9kZWwgZmlsZSAoc3VjaAotYXMgZWpiLWphci54bWwsIC5tYXB4bWksIG9yIC5yZGJ4bWkpIGlzIGNoYW5nZWQgb3Igc2F2ZWQuIEJ5Ci1kZWZhdWx0LCBtYW51YWwgY29kZSB2YWxpZGF0aW9uIGFuZCBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uIGFyZSBlbmFibGVkCi1pbiB0aGUgcHJlZmVyZW5jZXMuPC9wPgotPHA+T24gdGhlIFByb3BlcnRpZXMgcGFnZSBmb3IgZWFjaCBlbnRlcnByaXNlIGFwcGxpY2F0aW9uCi1tb2R1bGUgcHJvamVjdCwgeW91IHdpbGwgZmluZCBhIGxpc3Qgb2YgdmFsaWRhdG9ycyB0aGF0IHlvdSBjYW4gcnVuIGFnYWluc3QKLWEgc2VsZWN0ZWQgcHJvamVjdC4gVGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyBpcyBkaWZmZXJlbnQgZm9yIGVhY2ggdHlwZSBvZiBwcm9qZWN0LjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3J2YWxlcnIuaHRtbCI+Q29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Zb3UgbWF5IGVuY291bnRlciB0aGVzZSBjb21tb24gZXJyb3IgbWVzc2FnZXMgd2hlbiB5b3UgdmFsaWRhdGUgeW91ciBwcm9qZWN0cy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcnZhbGlkYXRvcnMuaHRtbCI+SjJFRSBWYWxpZGF0b3JzPC9hPjwvc3Ryb25nPjxiciAvPgotVGhpcyB0YWJsZSBsaXN0cyB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoZSBkaWZmZXJlbnQgcHJvamVjdCB0eXBlcyBhbmQgZ2l2ZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBlYWNoIHZhbGlkYXRvci48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxhdXRvLmh0bWwiPkVuYWJsaW5nIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb248L2E+PC9zdHJvbmc+PGJyIC8+Ci1JZiB5b3Ugd2FudCB2YWxpZGF0aW9uIHRvIG9jY3VyIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGFuIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBidWlsZCB0aGF0IG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHJlc291cmNlIGNoYW5nZSwgeW91IGNhbiBlbmFibGUgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxidWlsZC5odG1sIj5FbmFibGluZyBidWlsZCB2YWxpZGF0aW9uPC9hPjwvc3Ryb25nPjxiciAvPgotWW91IGNhbiBlbmFibGUgdmFsaWRhdGlvbiB0byBvY2N1ciBkdXJpbmcgYSBidWlsZCBvZiBhIHByb2plY3QuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIj5EaXNhYmxpbmcgYSB2YWxpZGF0b3I8L2E+PC9zdHJvbmc+PGJyIC8+Ci1Zb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBmb3IgYSBwcm9qZWN0LjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbCI+T3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYT48L3N0cm9uZz48YnIgLz4KLUZvciBhIGdpdmVuIHByb2plY3QsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbG1hbnVhbC5odG1sIj5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L2E+PC9zdHJvbmc+PGJyIC8+Ci1XaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIHdpdGggdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgc2VsZWN0ZWQgb24gdGhlIFZhbGlkYXRpb24gcGFnZSBvZiB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbCI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvYT48L3N0cm9uZz48YnIgLz4KLVlvdSBjYW4gc2VsZWN0IHNwZWNpZmljIHZhbGlkYXRvcnMgdG8gcnVuIGZvciBhIHByb2plY3QgZHVyaW5nIG1hbnVhbCBhbmQgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnZhbGVyci5odG1sIiB0aXRsZT0iWW91IG1heSBlbmNvdW50ZXIgdGhlc2UgY29tbW9uIGVycm9yIG1lc3NhZ2VzIHdoZW4geW91IHZhbGlkYXRlIHlvdXIgcHJvamVjdHMuIj5Db21tb24gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHNvbHV0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3J2YWxpZGF0b3JzLmh0bWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGRpZmZlcmVudCBwcm9qZWN0IHR5cGVzIGFuZCBnaXZlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGVhY2ggdmFsaWRhdG9yLiI+SjJFRSBWYWxpZGF0b3JzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGF1dG8uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsYXV0by5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU2ODQ1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsYXV0by5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkVuYWJsaW5nIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqdmFsYXV0byI+PGEgbmFtZT0idGp2YWxhdXRvIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RW5hYmxpbmcgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbjwvaDE+Ci08ZGl2PjxwPklmIHlvdSB3YW50IHZhbGlkYXRpb24gdG8gb2NjdXIgYXV0b21hdGljYWxseSBkdXJpbmcgYW4gYXV0b21hdGljCi1pbmNyZW1lbnRhbCBidWlsZCB0aGF0IG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHJlc291cmNlIGNoYW5nZSwgeW91IGNhbiBlbmFibGUKLWF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPklmIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBidWlsZHMgYXJlIGRpc2FibGVkLCBhdXRvbWF0aWMgY29kZQotdmFsaWRhdGlvbiBjYW5ub3QgYmUgZW5hYmxlZC48L3A+Ci08cD5UbyBlbmFibGUgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSB3b3JrYmVuY2ggbWVudSBiYXIsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBsZWZ0IGZyYW1lIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5CdWlsZCBhdXRvbWF0aWNhbGx5PC9zcGFuPiBjaGVjayBib3guPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgcmlnaHQtY2xpY2sgeW91ciBwcm9qZWN0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T24gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+IHBhZ2UsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcnJpZGUKLXZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L3NwYW4+IGNoZWNrIGJveCB0byBvdmVycmlkZSBnbG9iYWwgcHJlZmVyZW5jZXMKLWZvciB0aGlzIHByb2plY3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVuc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IHdhbnQgdG8gcnVuIGFyZSBzZWxlY3RlZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SdW4gdmFsaWRhdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUKLWNoYW5nZXMgdG8gPHZhciBjbGFzcz0idmFybmFtZSI+Jmx0O3Byb2plY3RfbmFtZSZndDs8L3Zhcj4gcmVzb3VyY2VzPC9zcGFuPiBjaGVjawotYm94LiBUaGlzIGNoZWNrIGJveCBpcyBvbmx5IGVuYWJsZWQgd2hlbiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDo8L3NwYW4+IDx1bD48bGk+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJ1aWxkIGF1dG9tYXRpY2FsbHk8L3NwYW4+IGNoZWNrIGJveCBpcyBzZWxlY3RlZCBpbgotdGhlIHdvcmtiZW5jaCBQcmVmZXJlbmNlcyBkaWFsb2c8L2xpPgotPGxpPlRoZSBzZWxlY3RlZCBwcm9qZWN0IHN1cHBvcnRzIGF1dG9tYXRpYyB2YWxpZGF0aW9uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPklmIGFueSBlcnJvcnMgYXJlIGRldGVjdGVkLCBhbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UgaXMgbG9nZ2VkCi1pbiB0aGUgUHJvYmxlbXMgdmlldy4gVGhlc2UgbWVzc2FnZXMgY2Fubm90IGJlIHJlbW92ZWQgbWFudWFsbHkuIE9uY2UgdGhlCi1wcm9ibGVtIGlzIGZpeGVkIHRoYXQgY2F1c2VkIHRoZSBtZXNzYWdlcyB0byBiZSBnZW5lcmF0ZWQsIHRoZSBtZXNzYWdlcyBhcmUKLWF1dG9tYXRpY2FsbHkgcmVtb3ZlZC4gWW91IGNhbiwgaG93ZXZlciwgdXNlIHRoZSBGaWx0ZXIgVGFza3Mgd2l6YXJkIHRvIHRlbXBvcmFyaWx5Ci1maWx0ZXIgb3V0IGFueSBtZXNzYWdlcyBpbiB0aGUgUHJvYmxlbXMgdmlldyB1bnRpbCB5b3UgY2FuIGZpeCB0aGUgYXNzb2NpYXRlZAotcHJvYmxlbXMuIFRvIG9wZW4gdGhlIEZpbHRlciBUYXNrcyB3aXphcmQsIGNsaWNrIHRoZSBGaWx0ZXJzIGljb24gaW4gdGhlIHRpdGxlCi1iYXIgb2YgdGhlIFByb2JsZW1zIHZpZXcuIEFsdGVybmF0aXZlbHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzZWUgYW55IHByb2JsZW1zCi1kZXRlY3RlZCBieSBhIHBhcnRpY3VsYXIgdmFsaWRhdG9yLCBvbiBhIHBhcnRpY3VsYXIgcHJvamVjdCwgeW91IGNhbiBkaXNhYmxlCi10aGUgdmFsaWRhdG9yIGluIHRoZSBwcm9qZWN0J3MgUHJvcGVydGllcyBwYWdlLiBXaGVuIGEgdmFsaWRhdG9yIGlzIGRpc2FibGVkLAotYWxsIG1lc3NhZ2VzIGZyb20gdGhhdCB2YWxpZGF0b3IgYXJlIHJlbW92ZWQuPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsLmh0bWwiPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxidWlsZC5odG1sIiB0aXRsZT0iWW91IGNhbiBlbmFibGUgdmFsaWRhdGlvbiB0byBvY2N1ciBkdXJpbmcgYSBidWlsZCBvZiBhIHByb2plY3QuIj5FbmFibGluZyBidWlsZCB2YWxpZGF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGRpc2FibGUgb25lIG9yIG1vcmUgdmFsaWRhdG9ycyBmb3IgYSBwcm9qZWN0LiI+RGlzYWJsaW5nIGEgdmFsaWRhdG9yPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIHRpdGxlPSJGb3IgYSBnaXZlbiBwcm9qZWN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4iPk92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbG1hbnVhbC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgcnVuIGEgbWFudWFsIHZhbGlkYXRpb24sIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGVkIHByb2plY3QgYXJlIHZhbGlkYXRlZCB3aXRoIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIHNlbGVjdGVkIG9uIHRoZSBWYWxpZGF0aW9uIHBhZ2Ugb2YgdGhlIHByb2plY3QgUHJvcGVydGllcyBkaWFsb2cuIj5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbHNlbGVjdC5odG1sIiB0aXRsZT0iWW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgdmFsaWRhdG9ycyB0byBydW4gZm9yIGEgcHJvamVjdCBkdXJpbmcgbWFudWFsIGFuZCBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLiI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxidWlsZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxidWlsZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTZmYjE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsYnVpbGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5FbmFibGluZyBidWlsZCB2YWxpZGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbGJ1aWxkIj48YSBuYW1lPSJ0anZhbGJ1aWxkIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RW5hYmxpbmcgYnVpbGQgdmFsaWRhdGlvbjwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gZW5hYmxlIHZhbGlkYXRpb24gdG8gb2NjdXIgZHVyaW5nIGEgYnVpbGQgb2YgYSBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5CdWlsZCB2YWxpZGF0aW9uIG9jY3VycyB3aGVuIHlvdSBzZWxlY3QgZWl0aGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJ1aWxkCi1Qcm9qZWN0PC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnVpbGQgQWxsPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVidWlsZAotUHJvamVjdDwvc3Bhbj4sIG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlYnVpbGQgQWxsPC9zcGFuPi4gVGhlc2UgYnVpbGQgb3B0aW9ucwotYXBwZWFyIGluIGEgcG9wLXVwIG1lbnUgb25seSBpZiBhdXRvbWF0aWMgYnVpbGRzIGFyZSBkaXNhYmxlZC4gRWFjaCBvZiB0aGUKLWJ1aWxkIGNvbW1hbmRzIHN0YXJ0cyBhbiBpbmNyZW1lbnRhbCBidWlsZCBvZiB0aGUgcHJvamVjdCBvciB3b3Jrc3BhY2UuIFRoZQotaW5jcmVtZW50YWwgYnVpbGQgdmFsaWRhdGVzIHRoZSBwcm9qZWN0IHVzaW5nIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGVuYWJsZWQKLWZvciB0aGUgcHJvamVjdC4gVGhlIGluY3JlbWVudGFsIGJ1aWxkIGFsc28gdmFsaWRhdGVzIGFueSBwcm9qZWN0cyB0aGF0IGFyZQotcmVmZXJlbmNlZCBieSB0aGUgcHJvamVjdCBiZWluZyB2YWxpZGF0ZWQsIHVzaW5nIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGVuYWJsZWQKLWZvciBlYWNoIHJlc3BlY3RpdmUgcHJvamVjdC4gVGhlIHJlYnVpbGQgY29tbWFuZHMgc3RhcnQgYSBmdWxsIGJ1aWxkIChhbGwKLXByZXZpb3VzIGJ1aWxkIG91dHB1dCBpcyBkZWxldGVkIGFuZCBldmVyeXRoaW5nIGlzIHJlY3JlYXRlZCkuPC9wPgotPHA+VG8gZW5hYmxlCi1idWlsZCB2YWxpZGF0aW9uOiA8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgcmlnaHQtY2xpY2sgeW91ciBwcm9qZWN0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5PbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4gcGFnZSwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVycmlkZQotdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvc3Bhbj4gY2hlY2sgYm94IHRvIG92ZXJyaWRlIGdsb2JhbCBwcmVmZXJlbmNlcwotZm9yIHRoaXMgcHJvamVjdC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5FbnN1cmUgdGhhdCB0aGUgdmFsaWRhdG9ycyB0aGF0IHlvdSB3YW50IHRvIHJ1biBhcmUgc2VsZWN0ZWQuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SdW4gdmFsaWRhdGlvbiB3aGVuIHlvdSBtYW51YWxseSBidWlsZCA8dmFyIGNsYXNzPSJ2YXJuYW1lIj4mbHQ7cHJvamVjdF9uYW1lJmd0OzwvdmFyPjwvc3Bhbj4gY2hlY2sKLWJveC4gPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGF1dG8uaHRtbCIgdGl0bGU9IklmIHlvdSB3YW50IHZhbGlkYXRpb24gdG8gb2NjdXIgYXV0b21hdGljYWxseSBkdXJpbmcgYW4gYXV0b21hdGljIGluY3JlbWVudGFsIGJ1aWxkIHRoYXQgb2NjdXJzIGFzIGEgcmVzdWx0IG9mIGEgcmVzb3VyY2UgY2hhbmdlLCB5b3UgY2FuIGVuYWJsZSBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLiI+RW5hYmxpbmcgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIiB0aXRsZT0iWW91IGNhbiBkaXNhYmxlIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgZm9yIGEgcHJvamVjdC4iPkRpc2FibGluZyBhIHZhbGlkYXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sIiB0aXRsZT0iRm9yIGEgZ2l2ZW4gcHJvamVjdCwgeW91IGNhbiBvdmVycmlkZSB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMuIj5PdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxtYW51YWwuaHRtbCIgdGl0bGU9IldoZW4geW91IHJ1biBhIG1hbnVhbCB2YWxpZGF0aW9uLCBhbGwgcmVzb3VyY2VzIGluIHRoZSBzZWxlY3RlZCBwcm9qZWN0IGFyZSB2YWxpZGF0ZWQgd2l0aCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBzZWxlY3RlZCBvbiB0aGUgVmFsaWRhdGlvbiBwYWdlIG9mIHRoZSBwcm9qZWN0IFByb3BlcnRpZXMgZGlhbG9nLiI+TWFudWFsbHkgdmFsaWRhdGluZyBjb2RlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gc2VsZWN0IHNwZWNpZmljIHZhbGlkYXRvcnMgdG8gcnVuIGZvciBhIHByb2plY3QgZHVyaW5nIG1hbnVhbCBhbmQgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi4iPlNlbGVjdGluZyBjb2RlIHZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTFmZDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxkaXNhYmxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+RGlzYWJsaW5nIGEgdmFsaWRhdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbGRpc2FibGUiPjxhIG5hbWU9InRqdmFsZGlzYWJsZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRpc2FibGluZyBhIHZhbGlkYXRvcjwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gZGlzYWJsZSBvbmUgb3IgbW9yZSB2YWxpZGF0b3JzIGZvciBhIHByb2plY3QuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkVycm9ycyBhbmQgd2FybmluZyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3Ci13aGVuIHZhbGlkYXRpb24gaXMgcnVuLiBUbyBkaXNhYmxlIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgZm9yIGEgcHJvamVjdDo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgcmlnaHQtY2xpY2sgeW91ciBwcm9qZWN0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5PbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4gcGFnZSwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVycmlkZQotdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvc3Bhbj4gY2hlY2sgYm94IHRvIG92ZXJyaWRlIGdsb2JhbCBwcmVmZXJlbmNlcwotZm9yIHRoaXMgcHJvamVjdC48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGVhciB0aGUgY2hlY2sgYm94IG5leHQgdG8gdGhlIHZhbGlkYXRvcnMgdGhhdCB5b3Ugd2FudCB0byBkaXNhYmxlLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Pbmx5IHRob3NlIHZhbGlkYXRvcnMgdGhhdCBhcmUgc2VsZWN0ZWQgb24gdGhlIFByb3BlcnRpZXMgcGFnZSB3aWxsCi1ydW4gYXV0b21hdGljYWxseSwgbWFudWFsbHksIG9yIGR1cmluZyBhIGJ1aWxkLjwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsYXV0by5odG1sIiB0aXRsZT0iSWYgeW91IHdhbnQgdmFsaWRhdGlvbiB0byBvY2N1ciBhdXRvbWF0aWNhbGx5IGR1cmluZyBhbiBhdXRvbWF0aWMgaW5jcmVtZW50YWwgYnVpbGQgdGhhdCBvY2N1cnMgYXMgYSByZXN1bHQgb2YgYSByZXNvdXJjZSBjaGFuZ2UsIHlvdSBjYW4gZW5hYmxlIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uIj5FbmFibGluZyBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxidWlsZC5odG1sIiB0aXRsZT0iWW91IGNhbiBlbmFibGUgdmFsaWRhdGlvbiB0byBvY2N1ciBkdXJpbmcgYSBidWlsZCBvZiBhIHByb2plY3QuIj5FbmFibGluZyBidWlsZCB2YWxpZGF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIHRpdGxlPSJGb3IgYSBnaXZlbiBwcm9qZWN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4iPk92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbG1hbnVhbC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgcnVuIGEgbWFudWFsIHZhbGlkYXRpb24sIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGVkIHByb2plY3QgYXJlIHZhbGlkYXRlZCB3aXRoIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIHNlbGVjdGVkIG9uIHRoZSBWYWxpZGF0aW9uIHBhZ2Ugb2YgdGhlIHByb2plY3QgUHJvcGVydGllcyBkaWFsb2cuIj5NYW51YWxseSB2YWxpZGF0aW5nIGNvZGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbHNlbGVjdC5odG1sIiB0aXRsZT0iWW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgdmFsaWRhdG9ycyB0byBydW4gZm9yIGEgcHJvamVjdCBkdXJpbmcgbWFudWFsIGFuZCBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLiI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1NTEyNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbGdsb2JhbHByZWYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5PdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0anZhbGdsb2JhbHByZWYiPjxhIG5hbWU9InRqdmFsZ2xvYmFscHJlZiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk92ZXJyaWRpbmcgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2gxPgotPGRpdj48cD5Gb3IgYSBnaXZlbiBwcm9qZWN0LCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBhcmUgc3BlY2lmaWVkIGdsb2JhbGx5IG9uCi10aGUgVmFsaWRhdGlvbiBwYWdlIG9mIHRoZSBQcmVmZXJlbmNlcyBkaWFsb2cuIFRvIGFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlCi10aGVzZSBkZWZhdWx0IHZhbGlkYXRpb24gcHJlZmVyZW5jZXM6PC9wPgotPC9kaXY+Ci08b2w+PGxpPjxzcGFuPk9uIHRoZSB3b3JrYmVuY2ggbWVudSwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5PbiB0aGUgVmFsaWRhdGlvbiBwYWdlIG9mIHRoZSBQcmVmZXJlbmNlcyBkaWFsb2csIG1ha2Ugc3VyZSB0aGF0Ci10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvc3Bhbj4gaXMKLXNlbGVjdGVkLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGF1dG8uaHRtbCIgdGl0bGU9IklmIHlvdSB3YW50IHZhbGlkYXRpb24gdG8gb2NjdXIgYXV0b21hdGljYWxseSBkdXJpbmcgYW4gYXV0b21hdGljIGluY3JlbWVudGFsIGJ1aWxkIHRoYXQgb2NjdXJzIGFzIGEgcmVzdWx0IG9mIGEgcmVzb3VyY2UgY2hhbmdlLCB5b3UgY2FuIGVuYWJsZSBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLiI+RW5hYmxpbmcgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsYnVpbGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZW5hYmxlIHZhbGlkYXRpb24gdG8gb2NjdXIgZHVyaW5nIGEgYnVpbGQgb2YgYSBwcm9qZWN0LiI+RW5hYmxpbmcgYnVpbGQgdmFsaWRhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIiB0aXRsZT0iWW91IGNhbiBkaXNhYmxlIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgZm9yIGEgcHJvamVjdC4iPkRpc2FibGluZyBhIHZhbGlkYXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsbWFudWFsLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBydW4gYSBtYW51YWwgdmFsaWRhdGlvbiwgYWxsIHJlc291cmNlcyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBhcmUgdmFsaWRhdGVkIHdpdGggdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgc2VsZWN0ZWQgb24gdGhlIFZhbGlkYXRpb24gcGFnZSBvZiB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZy4iPk1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNlbGVjdCBzcGVjaWZpYyB2YWxpZGF0b3JzIHRvIHJ1biBmb3IgYSBwcm9qZWN0IGR1cmluZyBtYW51YWwgYW5kIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uIj5TZWxlY3RpbmcgY29kZSB2YWxpZGF0b3JzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbG1hbnVhbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxtYW51YWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxMzIyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbG1hbnVhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPk1hbnVhbGx5IHZhbGlkYXRpbmcgY29kZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGp2YWxtYW51YWwiPjxhIG5hbWU9InRqdmFsbWFudWFsIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWFudWFsbHkgdmFsaWRhdGluZyBjb2RlPC9oMT4KLTxkaXY+PHA+V2hlbiB5b3UgcnVuIGEgbWFudWFsIHZhbGlkYXRpb24sIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNlbGVjdGVkCi1wcm9qZWN0IGFyZSB2YWxpZGF0ZWQgd2l0aCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBzZWxlY3RlZCBvbiB0aGUgVmFsaWRhdGlvbgotcGFnZSBvZiB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZy48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBtYW51YWxseSBpbnZva2UgYW4gaW1tZWRpYXRlIGNvZGUgdmFsaWRhdGlvbjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCB0aGF0IHlvdSB3YW50IHRvIHZhbGlkYXRlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodC1jbGljayB0aGUgcHJvamVjdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuIFZhbGlkYXRpb248L3NwYW4+Ljwvc3Bhbj4gSWYgbm8gdmFsaWRhdG9ycyB3ZXJlIHNlbGVjdGVkLCBhIG1lc3NhZ2UgYm94IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0Ci1ob3cgdG8gc2VsZWN0IGEgdmFsaWRhdG9yLjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIHNlbGVjdGVkIHZhbGlkYXRvcnMKLWZvciB0aGUgcHJvamVjdC48L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGF1dG8uaHRtbCIgdGl0bGU9IklmIHlvdSB3YW50IHZhbGlkYXRpb24gdG8gb2NjdXIgYXV0b21hdGljYWxseSBkdXJpbmcgYW4gYXV0b21hdGljIGluY3JlbWVudGFsIGJ1aWxkIHRoYXQgb2NjdXJzIGFzIGEgcmVzdWx0IG9mIGEgcmVzb3VyY2UgY2hhbmdlLCB5b3UgY2FuIGVuYWJsZSBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLiI+RW5hYmxpbmcgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsYnVpbGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZW5hYmxlIHZhbGlkYXRpb24gdG8gb2NjdXIgZHVyaW5nIGEgYnVpbGQgb2YgYSBwcm9qZWN0LiI+RW5hYmxpbmcgYnVpbGQgdmFsaWRhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIiB0aXRsZT0iWW91IGNhbiBkaXNhYmxlIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgZm9yIGEgcHJvamVjdC4iPkRpc2FibGluZyBhIHZhbGlkYXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sIiB0aXRsZT0iRm9yIGEgZ2l2ZW4gcHJvamVjdCwgeW91IGNhbiBvdmVycmlkZSB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMuIj5PdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxzZWxlY3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gc2VsZWN0IHNwZWNpZmljIHZhbGlkYXRvcnMgdG8gcnVuIGZvciBhIHByb2plY3QgZHVyaW5nIG1hbnVhbCBhbmQgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbi4iPlNlbGVjdGluZyBjb2RlIHZhbGlkYXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbHNlbGVjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjU5OTY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsc2VsZWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGp2YWxzZWxlY3QiPjxhIG5hbWU9InRqdmFsc2VsZWN0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2VsZWN0aW5nIGNvZGUgdmFsaWRhdG9yczwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gc2VsZWN0IHNwZWNpZmljIHZhbGlkYXRvcnMgdG8gcnVuIGZvciBhIHByb2plY3QgZHVyaW5nCi1tYW51YWwgYW5kIGF1dG9tYXRpYyBjb2RlIHZhbGlkYXRpb24uPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gY2hvb3NlIHRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IHdhbnQgdG8gdXNlIGZvciBhIHByb2plY3Q6PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCByaWdodC1jbGljayB5b3VyIHByb2plY3QgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4gcGFnZSwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVycmlkZQotdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvc3Bhbj4gY2hlY2sgYm94IHRvIG92ZXJyaWRlIGdsb2JhbCBwcmVmZXJlbmNlcwotZm9yIHRoaXMgcHJvamVjdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IHdhbnQgdG8gcnVuLiA8L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6IDwvc3Bhbj5JZgoteW91IGRlc2VsZWN0IGFueSB2YWxpZGF0b3IgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIGFueSBtZXNzYWdlcyBhc3NvY2lhdGVkCi13aXRoIHRoZSBkZXNlbGVjdGVkIHZhbGlkYXRvciB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgdGFzayBsaXN0LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90anZhbGF1dG8uaHRtbCIgdGl0bGU9IklmIHlvdSB3YW50IHZhbGlkYXRpb24gdG8gb2NjdXIgYXV0b21hdGljYWxseSBkdXJpbmcgYW4gYXV0b21hdGljIGluY3JlbWVudGFsIGJ1aWxkIHRoYXQgb2NjdXJzIGFzIGEgcmVzdWx0IG9mIGEgcmVzb3VyY2UgY2hhbmdlLCB5b3UgY2FuIGVuYWJsZSBhdXRvbWF0aWMgY29kZSB2YWxpZGF0aW9uLiI+RW5hYmxpbmcgYXV0b21hdGljIGNvZGUgdmFsaWRhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsYnVpbGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZW5hYmxlIHZhbGlkYXRpb24gdG8gb2NjdXIgZHVyaW5nIGEgYnVpbGQgb2YgYSBwcm9qZWN0LiI+RW5hYmxpbmcgYnVpbGQgdmFsaWRhdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZGlzYWJsZS5odG1sIiB0aXRsZT0iWW91IGNhbiBkaXNhYmxlIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgZm9yIGEgcHJvamVjdC4iPkRpc2FibGluZyBhIHZhbGlkYXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sIiB0aXRsZT0iRm9yIGEgZ2l2ZW4gcHJvamVjdCwgeW91IGNhbiBvdmVycmlkZSB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMuIj5PdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGp2YWxtYW51YWwuaHRtbCIgdGl0bGU9IldoZW4geW91IHJ1biBhIG1hbnVhbCB2YWxpZGF0aW9uLCBhbGwgcmVzb3VyY2VzIGluIHRoZSBzZWxlY3RlZCBwcm9qZWN0IGFyZSB2YWxpZGF0ZWQgd2l0aCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBzZWxlY3RlZCBvbiB0aGUgVmFsaWRhdGlvbiBwYWdlIG9mIHRoZSBwcm9qZWN0IFByb3BlcnRpZXMgZGlhbG9nLiI+TWFudWFsbHkgdmFsaWRhdGluZyBjb2RlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZWI4YzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9EZWxldGVCZWFuX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvRGVsZXRlQmVhbl9IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ1NWE3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9EZWxldGVCZWFuX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNvbS5pYm0ud3RwLmdlbmVyaWMuRGVsZXRlIj4KLSAgICA8IS0tIGZ1bmN0aW9uIHNjaGVkdWxlZCBmb3IgV1RQIDEuMCAtLT4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgYm94IHRvIHNwZWNpZnkgdGhlIGRlbGV0aW9uIG9wdGlvbnMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW46Ci0KLS0gIDxiPkRlbGV0ZSBkZXBsb3llZCBjb2RlOjwvYj4gU2VsZWN0IHRvIGRlbGV0ZSB0aGUgZ2VuZXJhdGVkIGRlcGxveW1lbnQgY29kZSBmb3IgdGhlIGVudGVycHJpc2UgYmVhbi4KLS0gIDxiPkRlbGV0ZSBnZW5lcmF0ZWQgQWNjZXNzQmVhbjo8L2I+IFNlbGVjdCB0byBkZWxldGUgdGhlIGFjY2VzcyBiZWFucyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGVycHJpc2UgYmVhbi4KLS0gIDxiPkRlbGV0ZSBCZWFuIGZyb20gRGVwbG95bWVudCBEZXNjcmlwdG9yOjwvYj4gU2VsZWN0IHRvIGRlbGV0ZSB0aGUgYmVhbiBlbnRyeSBmcm9tIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGJ1dCBkbyBub3QgZGVsZXRlIHRoZSBiZWFuLgotLSAgPGI+RGVsZXRlIEJlYW4gQ2xhc3Nlczo8L2I+IFNlbGVjdCB0byBkZWxldGUgdGhlIGNsYXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmVhbi4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9FSkJDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9FSkJDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMzIwZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvRUpCQ3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotCi08IS0tIFBhZ2UgMSwgQ3JlYXRlIGFuIEVudGVycHJpc2UgQmVhbiAgLS0+Ci08Y29udGV4dCBpZD0iYW50ZWpiMTAwMCI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGVudGVycHJpc2UgYmVhbiB0eXBlOiBzZXNzaW9uIGJlYW4gb3IgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQkKLVlvdSBtdXN0IGluc3RhbGwgYW5kIGVuYWJsZSBYRG9jbGV0IGJlZm9yZSBjcmVhdGluZyBhIHNlc3Npb24gb3IgbWVzc2FnZS1kcml2ZW4gYmVhbi4gRm9sbG93IHRoZXNlIHN0ZXBzOgotCTEgLSBGaXJzdCwgZG93bmxvYWQgYW5kIGluc3RhbGwgWERvY2xldCBmcm9tIGh0dHA6Ly94ZG9jbGV0LnNvdXJjZWZvcmdlLm5ldC94ZG9jbGV0L2luc3RhbGwuaHRtbAotCTIgLSBOZXh0LCBjbGljayB0aGUgPGI+cHJlZmVyZW5jZXM8L2I+IGxpbmsgdG8gY29uZmlndXJlIHRoZSBYRG9jbGV0IFJ1bnRpbWUgUHJlZmVyZW5jZXMuIEFub3RoZXIgd2F5IHRvIGdldCB0byB0aGUgWERvY2xldCBSdW50aW1lIFByZWZlcmVuY2VzIHBhZ2UgaXMgZnJvbSA8Yj5XaW5kb3cgPiBQcmVmZXJlbmNlcyA+IEoyRUUgQW5ub3RhdGlvbnMgPiBYRG9jbGV0PC9iPi4KLQkzIC0gQ2hlY2sgdGhlIDxiPkVuYWJsZSBYRG9jbGV0IEJ1aWxkZXI8L2I+IGNoZWNrIGJveC4KLQk0IC0gU2VsZWN0IHRoZSBWZXJzaW9uIG9mIFhEb2NsZXQgdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQuCi0JNSAtIFVzZSB0aGUgQnJvd3NlIGJ1dHRvbiB0byBsb2NhdGUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIFhEb2NsZXQgKDxiPlhEb2NsZXQgSG9tZTwvYj4pLgotCTYgLSBDbGljayA8Yj5PSzwvYj4gdG8gc2F2ZSB0aGUgcHJlZmVyZW5jZXMuCi0JCi1BZnRlciBpbnN0YWxsaW5nIGFuZCBjb25maWd1cmluZyBYRG9jbGV0LCBzZWxlY3QgdGhlIGJlYW4gdHlwZSB5b3Ugd2FudCB0byBjcmVhdGUgYW5kIGNsaWNrIDxiPk5leHQ8L2I+LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZW50ZXJwcmlzZSBiZWFucyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRlLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRUpCIGFyY2hpdGVjdHVyZSIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvY2VhcmNoLmh0bWwiLz4KLTwhLS0gbGluayB0byBvcmcuZWNsaXBzZS5qc3QuYW5ub3RhdGlvbi51c2VyLmRvYyAgYW5ub3RhdGlvbiB0YWdnaW5nIC0tPgotPC9jb250ZXh0PgotCi08IS0tIFBhZ2UgMiwgRW50ZXJwcmlzZSBCZWFuIGNsYXNzIGZpbGUgZGVmaW5pdGlvbiAtLT4KLTxjb250ZXh0IGlkPSJhbnRlamIxMTAwIj4KLTxkZXNjcmlwdGlvbj5FbnRlciB0aGUgPGI+UHJvamVjdDwvYj4sIDxiPk1vZHVsZSBOYW1lPC9iPiwgYW5kIHdvcmtzcGFjZSA8Yj5Gb2xkZXI8L2I+IGZvciB0aGUgbmV3IGVudGVycHJpc2UgYmVhbi4KLQotRW50ZXIgdGhlIDxiPkphdmEgcGFja2FnZTwvYj4gYW5kIDxiPkNsYXNzIG5hbWU8L2I+IGZvciB0aGUgbmV3IGVudGVycHJpc2UgYmVhbi4gCi1DaGFuZ2UgdGhlIDxiPlN1cGVyY2xhc3M8L2I+IGlmIHlvdXIgY2xhc3Mgd2lsbCBvdmVycmlkZSBhIGNsYXNzIG90aGVyIHRoYW4gamF2YS5sYW5nLk9iamVjdC4KLQotU2VsZWN0IHRoZSA8Yj5HZW5lcmF0ZSBhbiBhbm5vdGF0ZWQgYmVhbiBjbGFzczwvYj4gY2hlY2sgYm94IHRvIGFkZCBKMkVFIGFubm90YXRpb25zIHRvIHRoZSBzb3VyY2UgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGVudGVycHJpc2UgYmVhbnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlY3J0ZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIEVKQiBwcm9qZWN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL3RvcGljcy90ZWNydHByby5odG1sIi8+Ci08IS0tIGxpbmsgdG8gb3JnLmVjbGlwc2UuanN0LmFubm90YXRpb24udXNlci5kb2MgIGFubm90YXRpb24gdGFnZ2luZyAtLT4KLTwvY29udGV4dD4KLQotPCEtLSBQYWdlIDMsIEVudGVycHJpc2UgQmVhbiBkZXRhaWxzIC0tPgotPGNvbnRleHQgaWQ9ImFudGVqYjEyMDAiPgotPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIEVKQiwgSk5ESSBhbmQgRGlzcGxheSBuYW1lcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbi4gCi0JVGhlIDxiPkVKQiBuYW1lPC9iPiBpcyB0aGUgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzLgotCVRoZSA8Yj5KTkRJIG5hbWU8L2I+IGlzIGEgbG9naWNhbCBuYW1lIHVzZWQgYnkgdGhlIHNlcnZlciB0byBsb2NhdGUgYW4gZW50ZXJwcmlzZSBiZWFuIGF0IHJ1bnRpbWUuCi0JVGhlIDxiPkRpc3BsYXkgbmFtZTwvYj4gaXMgYSBzaG9ydCBuYW1lIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuIHRoYXQgaXMgdXNlZCBieSB0b29scy4JCi0KLU9wdGlvbmFsbHksIHByb3ZpZGUgYSB0ZXh0IDxiPkRlc2NyaXB0aW9uPC9iPiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzLgotCi1TZWxlY3QgdGhlIDxiPlN0YXRlIFR5cGU8L2I+IChzdGF0ZWxlc3Mgb3Igc3RhdGVmdWwpIGlmIHlvdSBhcmUgY3JlYXRpbmcgYSBzZXNzaW9uIGJlYW4uCi1BIHN0YXRlZnVsIHNlc3Npb24gYmVhbiBtYWludGFpbnMgY2xpZW50LXNwZWNpZmljIHNlc3Npb24gaW5mb3JtYXRpb24sIG9yIGNvbnZlcnNhdGlvbmFsIHN0YXRlLCBhY3Jvc3MgbXVsdGlwbGUgbWV0aG9kIGNhbGxzIGFuZCB0cmFuc2FjdGlvbnMuCi1BIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gZG9lcyBub3QgbWFpbnRhaW4gY29udmVyc2F0aW9uYWwgc3RhdGUuCi0KLVNlbGVjdCB0aGUgPGI+VHJhbnNhY3Rpb24gVHlwZTwvYj4gKGNvbnRhaW5lciBvciBiZWFuKSBmb3IgdGhlIGVudGVycHJpc2UgYmVhbi4gVGhpcyBzcGVjaWZpZXMgd2hldGhlciB0aGUgY29udGFpbmVyIG9yIHRoZSBiZWFuIHdpbGwgaGFuZGxlIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZW50ZXJwcmlzZSBiZWFucyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRlLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gRUpCIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlY3J0cHJvLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPCEtLSBQYWdlIDQsIEVudGVycHJpc2UgQmVhbiBtb2RpZmllcnMsIGludGVyZmFjZXMgYW5kIG1ldGhvZCBzdHVicyAtLT4KLTxjb250ZXh0IGlkPSJhbnRlamIxMzAwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIHR5cGUgb2YgPGI+TW9kaWZpZXJzPC9iPiBmb3IgdGhlIGJlYW4gY2xhc3MuCi0JCi1TZWxlY3QgdGhlIDxiPkludGVyZmFjZXM8L2I+IHRoYXQgeW91ciBiZWFuIGNsYXNzIHdpbGwgaW1wbGVtZW50LiBVc2UgdGhlIDxiPkFkZDwvYj4gYW5kIDxiPlJlbW92ZTwvYj4gYnV0dG9ucyB0byBjcmVhdGUgdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcy4KLQotU2VsZWN0IHdoaWNoIG1ldGhvZCBzdHVicyB0aGF0IHlvdSB3YW50IGNyZWF0ZWQgaW4gdGhlIGJlYW4gY2xhc3MuPGI+PC9iPgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZW50ZXJwcmlzZSBiZWFucyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci90b3BpY3MvdGVjcnRlLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gRUpCIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5lamIuZG9jLnVzZXIvdG9waWNzL3RlY3J0cHJvLmh0bWwiLz4KLTwvY29udGV4dD4KLQotCi0KLSAKLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0V4cG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0V4cG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWIyNTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9FeHBvcnRXaXphcmRfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iQVBQQ0xJRU5UX0VYUE9SVF9BUFBDTElFTlRfV0laQVJEX1BBR0UxIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB3aXphcmQgdG8gZXhwb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGludG8gYSBKQVIgZmlsZS4gIFNlbGVjdCB0aGUgYXBwbGljYXRpb24gcHJvamVjdCB0byBleHBvcnQsIGFuZCBwcm92aWRlIGEgZGlyZWN0b3J5IGFuZCBmaWxlbmFtZSBmb3IgdGhlIGV4cG9ydGVkIEpBUiBmaWxlLgotCi1TZWxlY3QgPGI+RXhwb3J0IHNvdXJjZSBmaWxlczwvYj4gdG8gaW5jbHVkZSBzb3VyY2UgZmlsZXMgaW4gdGhlIEpBUiBmaWxlLiAKLQotU2VsZWN0IDxiPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlPC9iPiB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGUuIAotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iRXhwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGpleHBhcHAuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGphcHBwcm9qLmh0bWwiLy0tPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IkVBUl9FWFBPUlRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBleHBvcnQgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IGludG8gYW4gRUFSIGZpbGUuIFNlbGVjdCB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHRvIGV4cG9ydCwgYW5kIHByb3ZpZGUgYSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGZvciB0aGUgZXhwb3J0ZWQgRUFSIGZpbGUuCi0KLVNlbGVjdCA8Yj5FeHBvcnQgc291cmNlIGZpbGVzPC9iPiB0byBpbmNsdWRlIHNvdXJjZSBmaWxlcyBpbiB0aGUgRUFSIGZpbGUuIAotCi1TZWxlY3QgPGI+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGU8L2I+IHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4gCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBpbnRvIGFuIEVBUiBmaWxlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGpleHBlYXIuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL3RqZWFyLmh0bWwiLy0tPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IkVKQl9FWFBPUlRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBleHBvcnQgYW4gRUpCIG1vZHVsZSBpbnRvIGEgSkFSIGZpbGUuIFNlbGVjdCB0aGUgRUpCIG1vZHVsZSB0byBleHBvcnQsIGFuZCBwcm92aWRlIGEgZGlyZWN0b3J5IGFuZCBmaWxlbmFtZSBmb3IgdGhlIGV4cG9ydGVkIEpBUiBmaWxlLgotCi1TZWxlY3QgPGI+RXhwb3J0IHNvdXJjZSBmaWxlczwvYj4gdG8gaW5jbHVkZSBzb3VyY2UgZmlsZXMgaW4gdGhlIEpBUiBmaWxlLiAKLQotU2VsZWN0IDxiPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlPC9iPiB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGUuIDwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkV4cG9ydGluZyBhbiBFSkIgSkFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmVqYi5hc3NlbWJseS5kb2MvdG9waWNzL3RlZXhwLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYW4gRUpCIEpBUiBmaWxlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5lamIuYXNzZW1ibHkuZG9jL3RvcGljcy90ZWltcC5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkVYUE9SVF9SQVJfV0laQVJEX1BBR0UiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBleHBvcnQgYSBjb25uZWN0b3IgcHJvamVjdCBpbnRvIGEgUkFSIGZpbGUuICBTZWxlY3QgdGhlIGNvbm5lY3RvciBwcm9qZWN0IHRvIGV4cG9ydCwgYW5kIHByb3ZpZGUgYSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGZvciB0aGUgZXhwb3J0ZWQgUkFSIGZpbGUuCi0KLVNlbGVjdCA8Yj5FeHBvcnQgc291cmNlIGZpbGVzPC9iPiB0byBpbmNsdWRlIHNvdXJjZSBmaWxlcyBpbiB0aGUgUkFSIGZpbGUuIAotCi1TZWxlY3QgPGI+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGU8L2I+IHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4gCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCB0byBhIFJBUiBmaWxlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlLmRvYy90b3BpY3MvdGpleHByYXIuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgY29ubmVjdG9yIHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWUuZG9jL3RvcGljcy90anJhci5odG1sIi8tLT4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0ltcG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL0ltcG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjUzYjNiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9JbXBvcnRXaXphcmRfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iQVBQQ0xJRU5UX0lNUE9SVF9BUFBDTElFTlRfV0laQVJEX1BBR0UxIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB3aXphcmQgdG8gaW1wb3J0IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBKQVIgZmlsZS4gTG9jYXRlIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgSkFSIGZpbGUgb24geW91ciBmaWxlIHN5c3RlbSB1c2luZyB0aGUgPGI+QnJvd3NlPC9iPiBidXR0b24uIE9wdGlvbmFsbHksIG1vZGlmeSB0aGUgcHJvamVjdCBuYW1lIHByb3ZpZGVkLgotCi1Vc2UgdGhlIDxiPlRhcmdldCBzZXJ2ZXI8L2I+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHRoZSBpbXBvcnRlZCBwcm9qZWN0IHdpbGwgYmUgZGV2ZWxvcGVkIGZvci4gCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRvIGFkZCB0aGUgaW1wb3J0ZWQgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuIENob29zZSBhbiBleGlzdGluZyBwcm9qZWN0IG9yIHVzZSB0aGUgPGI+TmV3PC9iPiBidXR0b24gdG8gY3JlYXRlIGEgbmV3IHByb2plY3QuCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJJbXBvcnRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amltcGFwcC5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYW4gYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amFwcHByb2ouaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJFQVJfSU1QT1JUX0VBUl9XSVpBUkRfUEFHRTEiPgotICAgIDwhLS0gd2l6YXJkIGJyb2tlbiBhdCB0aW1lIG9mIHRoaXMgd3JpdGluZyAtLT4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB3aXphcmQgdG8gaW1wb3J0IGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGUuICBMb2NhdGUgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gRUFSIGZpbGUgb24geW91ciBmaWxlIHN5c3RlbSB1c2luZyB0aGUgPGI+QnJvd3NlPC9iPiBidXR0b24uIE9wdGlvbmFsbHksIG1vZGlmeSB0aGUgcHJvamVjdCBuYW1lIHByb3ZpZGVkLgotCi1Vc2UgdGhlIDxiPlRhcmdldCBzZXJ2ZXI8L2I+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciB0aGF0IHRoZSByZXN1bHRpbmcgcHJvamVjdHMgd2lsbCBiZSBkZXZlbG9wZWQgZm9yLiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkltcG9ydGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIEVBUiBmaWxlIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGppbXBlYXIuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL3RqZWFyLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi0KLTxjb250ZXh0IGlkPSJFSkJfSU1QT1JUX0VKQl9XSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBpbXBvcnQgYW4gRUpCIEpBUiBmaWxlLiBMb2NhdGUgdGhlIEVKQiBKQVIgZmlsZSBvbiB5b3VyIGZpbGUgc3lzdGVtIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gT3B0aW9uYWxseSwgbW9kaWZ5IHRoZSBtb2R1bGUgbmFtZSBwcm92aWRlZC4KLQotVXNlIHRoZSA8Yj5UYXJnZXQgc2VydmVyPC9iPiBmaWVsZCB0byBzcGVjaWZ5IHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGhhdCB0aGUgaW1wb3J0ZWQgcHJvamVjdCB3aWxsIGJlIGRldmVsb3BlZCBmb3IuIAotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0byBhZGQgdGhlIGltcG9ydGVkIEVKQiBtb2R1bGUgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiBDaG9vc2UgYW4gZXhpc3RpbmcgcHJvamVjdCBvciB1c2UgdGhlIDxiPk5ldzwvYj4gYnV0dG9uIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0LgotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGFuIEVKQiBKQVIgZmlsZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuZWpiLmFzc2VtYmx5LmRvYy90b3BpY3MvdGVpbXAuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIEVKQiBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5lamIuYXNzZW1ibHkuZG9jL3RvcGljcy90ZWNydHByby5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IklNUE9SVF9SQVJfV0laQVJEX1BBR0UiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBpbXBvcnQgYSBKQ0EgQ29ubmVjdG9yIFJBUiBmaWxlLiBMb2NhdGUgdGhlIENvbm5lY3RvciBSQVIgZmlsZSBvbiB5b3VyIGZpbGUgc3lzdGVtIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gT3B0aW9uYWxseSwgbW9kaWZ5IHRoZSBtb2R1bGUgbmFtZSBwcm92aWRlZC4KLQotVXNlIHRoZSA8Yj5UYXJnZXQgc2VydmVyPC9iPiBmaWVsZCB0byBzcGVjaWZ5IHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGhhdCB0aGUgaW1wb3J0ZWQgcHJvamVjdCB3aWxsIGJlIGRldmVsb3BlZCBmb3IuIAotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0byBhZGQgdGhlIGltcG9ydGVkIGNvbm5lY3RvciBtb2R1bGUgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LiBDaG9vc2UgYW4gZXhpc3RpbmcgcHJvamVjdCBvciB1c2UgdGhlIDxiPk5ldzwvYj4gYnV0dG9uIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0LgotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGEgY29ubmVjdG9yIHByb2plY3QgUkFSIGZpbGUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWUuZG9jL3RvcGljcy90amltcHJhci5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBjb25uZWN0b3IgcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZS5kb2MvaG10bC90anJhci5odG1sIi8tLT4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvSjJFRUdlbmVyYWxfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9KMkVFR2VuZXJhbF9IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJkNTMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9KMkVFR2VuZXJhbF9IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJjb20uaWJtLnd0cC51aS5Qcm9qZWN0TmF2aWdhdG9yIj4KLTxkZXNjcmlwdGlvbj5UaGUgSjJFRSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgcHJvdmlkZXMgYSBoaWVyYXJjaGljYWwgdmlldyBvZiB0aGUgY29udGVudCBtb2RlbHMgZm9yIHJlc291cmNlcyBpbiB0aGUgd29ya2JlbmNoLiBGcm9tIHRoaXMgdmlldywgeW91IGNhbiBvcGVuIHRoZSB2YXJpb3VzIHByb2plY3QgZmlsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIGVkaXRvci4gCi0KLUJ5IHJpZ2h0LWNsaWNraW5nIG9uIG1vZHVsZXMsIHlvdSBjYW4gYWNjZXNzIHRoZSBwb3AtdXAgY29udGV4dCBtZW51IGZvciBhZGRpdGlvbmFsIGRldmVsb3BtZW50IG9wdGlvbnMuCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJKMkVFIEhpZXJhcmNoeSBhbmQgUHJvamVjdCBOYXZpZ2F0b3Igdmlld3MiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy9janZpZXcuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkoyRUUgcGVyc3BlY3RpdmUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy9janBlcnMuaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci0KLQotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYTJkMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjcuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5jb21wYXRpYmlsaXR5LlBsdWdpbkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iMi4xIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9QcmVmZXJlbmNlc19IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1ByZWZlcmVuY2VzX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YjZlNDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1ByZWZlcmVuY2VzX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPCEtLUVjbGlwc2UgcHJlZmVyZW5jZXMgLS0+Ci0KLTxjb250ZXh0IGlkPSJGbGV4aWJsZVByb2plY3QiPgotCTwhLS0gRmxleGlibGUgSmF2YSBQcm9qZWN0ICBwcmVmZXJlbmNlcy0tPgotPGRlc2NyaXB0aW9uPlNlbGVjdCA8Yj5BbGxvdyBNdWx0aXBsZSBtb2R1bGVzIHBlciBwcm9qZWN0PC9iPiB0byBhbGxvdyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QgdG8gY29udGFpbiBtb3JlIHRoYW4gb25lIG1vZHVsZQotb2YgYSBwYXJ0aWN1bGFyIHR5cGUuIEZvciBpbnN0YW5jZSwgbW9yZSB0aGFuIG9uZSBBcHBsaWNhdGlvbiBDbGllbnQgbW9kdWxlLiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tIGxpbmtzIHRvIEZsZXhpYmxlIGphdmEgcHJvamVjdCBzdHVmZi0tPgotPCEtLXRvcGljIGxhYmVsPSIiIGhyZWY9IiIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkoyRUVBbm5vdGF0aW9uc19QQUdFMSI+Ci0JPCEtLSBKMkVFIEFubm90YXRpb25zICBwcmVmZXJlbmNlcyBtYWluLS0+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSBKMkVFIEFubm90YXRpb24gUHJvdmlkZXIgIHRvIHVzZS4gCi0KLUoyRUUgQW5ub3RhdGlvbnMgYWxsb3cgcHJvZ3JhbW1lcnMgdG8gYWRkIHNwZWNpYWxpemVkIEphdmFkb2MgdGFncyB0byB0aGVpciBzb3VyY2UgY29kZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSBhcnRpZmFjdHMgZnJvbSB0ZW1wbGF0ZXMuCi08L2Rlc2NyaXB0aW9uPgotPCEtLSBsaW5rcyB0byBhbm5vdGF0aW9uIHN0dWZmIChYRG9jbGV0IGFuZCBlamJkb2NsZXQsIGFuZCBnZW5lcmljIGluZm8pIC0tPgotPCEtLSBodHRwOi8veGRvY2xldC5zb3VyY2Vmb3JnZS5uZXQveGRvY2xldC9pbmRleC5odG1sIC0tPgotPCEtLXRvcGljIGxhYmVsPSIiIGhyZWY9IiIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkoyRUVBbm5vdGF0aW9uc19QQUdFMiI+Ci0JPCEtLSBKMkVFIEFubm90YXRpb25zICBwcmVmZXJlbmNlcyBYRG9jbGV0LS0+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZXQgdGhlIFhEb2NsZXQgcnVudGltZSBwcmVmZXJlbmNlcy4gWERvY2xldCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgbG9jYWwgc3lzdGVtIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLgotCi1TZWxlY3QgPGI+RW5hYmxlIFhEb2NsZXQgQnVpbGRlcjwvYj4gdG8gdHVybiBvbiBhbm5vdGF0aW9uLWJhc2VkIGFydGlmYWN0IGNyZWF0aW9uLgotCi1TZWxlY3QgdGhlIDxiPlZlcnNpb248L2I+IG9mIFhEb2NsZXQuIFN1cHBvcnRlZCB2ZXJzaW9ucyBpbmNsdWRlIDEuMi4xLCAxLjIuMiwgMS4yLjM7IFhEb2NsZXQgdmVyc2lvbiAxLjEuMiBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgotCi1Qcm92aWRlIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICg8Yj5YRG9jbGV0IEhvbWU8L2I+KSBmb3IgWERvY2xldCBvbiB0aGUgbG9jYWwgc3lzdGVtLgotPC9kZXNjcmlwdGlvbj4KLTwhLS0gbGlua3MgdG8gYW5ub3RhdGlvbiBzdHVmZiAoWERvY2xldCBhbmQgZWpiZG9jbGV0LCBhbmQgZ2VuZXJpYyBpbmZvKSAtLT4KLTwhLS0gaHR0cDovL3hkb2NsZXQuc291cmNlZm9yZ2UubmV0L3hkb2NsZXQvaW5kZXguaHRtbCAtLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPCEtLXRvcGljIGxhYmVsPSIiIGhyZWY9IiIvLS0+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJKMkVFQW5ub3RhdGlvbnNfUEFHRTMiPgotCTwhLS0gSjJFRSBBbm5vdGF0aW9ucyAgcHJlZmVyZW5jZXMgZWpiZG9jbGV0LS0+Ci08ZGVzY3JpcHRpb24+RWpiZG9jbGV0IGlzIGEgc3Vic2V0IG9mIHRoZSBYRG9jbGV0IHNwZWNpZmljYXRpb24gdGhhdCBzcGVjaWZpZXMgZGV0YWlscyBvbiBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLVRoZSBzeW50YXggb2YgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBkaWZmZXJzLCBkZXBlbmRpbmcgb24gdGhlIHZlbmRvciBvZiAgdGhlIEFwcGxpY2F0aW9uIFNlcnZlciBiZWluZyB1c2VkLiAKLQotVXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgd2hpY2ggQXBwbGljYXRpb24gU2VydmVyIHZlbmRvcnMgdG8gc3VwcG9ydC4gWW91IGNhbiBzZWxlY3Qgb25lIG9yIG1vcmUgQXBwbGljYXRpb24gU2VydmVyCi12ZW5kb3JzLCBpbmNsdWRpbmcgSkJvc3MsIEpPbkFTLCBXZWJMb2dpYywgYW5kIFdlYlNwaGVyZS4gQWxzbyBzZWxlY3QgdGhlIHZlcnNpb24gb2YgdGhlIEFwcGxpY2F0aW9uIFNlcnZlciB0byBzdXBwb3J0LgotPC9kZXNjcmlwdGlvbj4KLTwhLS0gbGlua3MgdG8gYW5ub3RhdGlvbiBzdHVmZiAoWERvY2xldCBhbmQgZWpiZG9jbGV0LCBhbmQgZ2VuZXJpYyBpbmZvKSAtLT4KLTwhLS1odHRwOi8veGRvY2xldC5zb3VyY2Vmb3JnZS5uZXQveGRvY2xldC9hbnQveGRvY2xldC9tb2R1bGVzL2VqYi9FamJEb2NsZXRUYXNrLmh0bWwgLS0+Ci08IS0tIGh0dHA6Ly93d3cuamJvc3Mub3JnLS0+Ci08IS0tIGh0dHA6Ly9qb25hcy5vYmplY3R3ZWIub3JnLy0tPgotPCEtLSBodHRwOi93d3cuYmVhLmNvbS0tPgotPCEtLSBodHRwOi8vd3d3LmlibS5jb20vc29mdHdhcmUvd2Vic3BoZXJlLy0tPgotPCEtLXRvcGljIGxhYmVsPSIiIGhyZWY9IiIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwvY29udGV4dD4KLQotCi0KLTwvY29udGV4dHM+Ci0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0Q3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvUHJvamVjdENyZWF0ZVdpemFyZF9IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTNiMTFlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0Q3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJBUFBDTElFTlRfTkVXX0FQUENMSUVOVF9XSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gQ2xpZW50IHByb2plY3QuIAotCi1PbiB0aGlzIHBhZ2UsIG5hbWUgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0LCBhbmQgc2VsZWN0IHRoZSB3b3Jrc3BhY2UgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHByb2plY3QgZmlsZXMuICAKLQotU2VsZWN0IHRoZSA8Yj5TaG93IEFkdmFuY2VkPC9iPiBidXR0b24gdG8gc3BlY2lmeSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKLTx1bD4KLSAgICA8bGk+VGhlIDxiPlRhcmdldCBzZXJ2ZXI8L2I+LjwvbGk+Ci0gICAgPGxpPlRoZSA8Yj5Nb2R1bGUgVmVyc2lvbiAoSjJFRSBzcGVjaWZpY2F0aW9uIGxldmVsKTwvYj4uPC9saT4KLSAgICA8bGk+QXV0b21hdGljYWxseSBhZGQgdGhlIEFwcGxpY2F0aW9uIENsaWVudCAgcHJvamVjdCB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuPC9saT4KLSAgICA8L3VsPiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGphcHBwcm9qLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJKMkVFIGFyY2hpdGVjdHVyZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL2NqYXJjaC5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IkVBUl9ORVdfRUFSX1dJWkFSRF9QQUdFMSI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgd2l6YXJkIHRvIGNyZWF0ZSBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QuIEFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBjYW4gY29udGFpbiBvbmUgb3IgbW9yZSBKMkVFIG1vZHVsZXMsIGluY2x1ZGluZyBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcywgRUpCIG1vZHVsZXMsIENvbm5lY3RvciBtb2R1bGVzLCBvciBXZWIgbW9kdWxlLiAKLQotT24gdGhpcyBwYWdlLCBuYW1lIHRoZSBFQVIgYXBwbGljYXRpb24gcHJvamVjdCwgYW5kIHNlbGVjdCB0aGUgd29ya3NwYWNlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBwcm9qZWN0IGZpbGVzLiAgCi0KLVNlbGVjdCB0aGUgPGI+U2hvdyBBZHZhbmNlZDwvYj4gYnV0dG9uIHRvIHNlbGVjdCBhIDxiPlRhcmdldCBzZXJ2ZXI8L2I+IG9yIHRoZSA8Yj5Nb2R1bGUgVmVyc2lvbjwvYj4gKEoyRUUgc3BlY2lmaWNhdGlvbiBsZXZlbCkgdGhhdCB5b3Ugd2FudCB0byB1c2UgZm9yIHRoZSBuZXcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LgotCi1UbyBhZGQgSjJFRSBtb2R1bGVzIHRvIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QsIGNsaWNrIDxiPk5leHQ8L2I+LiAgSWYgeW91IGRvIG5vdCB3YW50IHRvIGFkZCBKMkVFIG1vZHVsZXMgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LCBjbGljayA8Yj5GaW5pc2g8L2I+LgotSjJFRSBtb2R1bGVzIGNhbiBiZSBhZGRlZCB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYXQgYW55IHRpbWUuIE9uY2UgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBoYXMgYmVlbiBjcmVhdGVkLCByaWdodC1jbGljayBhbmQgc2VsZWN0IDxiPlByb3BlcnRpZXMgPiBFQVIgbW9kdWxlczwvYj4gdG8KLWFkZCBvciBkZWxldGUgRUFSIG1vZHVsZXMgZnJvbSB0aGUgcHJvamVjdC4gCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy90amVhci5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iSjJFRSBhcmNoaXRlY3R1cmUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy9jamFyY2guaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJORVdfRUFSX0FERF9NT0RVTEVTX1BBR0UiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IGF2YWlsYWJsZSBKMkVFIG1vZHVsZXMgdG8gYWRkIHRvIHRoZSBuZXcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4gQ2xpY2sgdGhlIDxiPk5ldyBNb2R1bGU8L2I+IGJ1dHRvbiAgdG8gY3JlYXRlIG5ldyBtb2R1bGVzLiAKLQotSjJFRSBtb2R1bGVzIGNhbiBiZSBhZGRlZCB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgYXQgYW55IHRpbWUuIE9uY2UgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBoYXMgYmVlbiBjcmVhdGVkLCByaWdodC1jbGljayBhbmQgc2VsZWN0IDxiPlByb3BlcnRpZXMgPiBFQVIgbW9kdWxlczwvYj4gdG8KLWFkZCBvciBkZWxldGUgRUFSIG1vZHVsZXMgZnJvbSB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCIgaHJlZj0iLi4vL3RvcGljcy90amVhci5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iSjJFRSBhcmNoaXRlY3R1cmUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmoyZWVhcHAuZG9jL3RvcGljcy9jamFyY2guaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJFQVJfTkVXX01PRFVMRV9QUk9KRUNUU19QQUdFIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIGNyZWF0ZSBuZXcgSjJFRSBtb2R1bGVzIHRvIGFkZCB0byB0aGUgbmV3IGVudGVycHJpc2UgYXBwbGljYXRpb24uIFRoZSB3aXphcmQgY2FuIGdlbmVyYXRlIGEgc2V0IG9mIGRlZmF1bHQgSjJFRSBtb2R1bGVzIG9yIGluZGl2aWR1YWwgY3VzdG9taXplZCBKMkVFIG1vZHVsZXMuCi08L2Rlc2NyaXB0aW9uPgotPCEtLXRvcGljbGFiZWw9IkNyZWF0aW5nIGFuIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL3RqZWFyLmh0bWwiLy0tPgotPCEtLXRvcGljIGxhYmVsPSJKMkVFIGFyY2hpdGVjdHVyZSIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuajJlZWFwcC5kb2MvdG9waWNzL2NqYXJjaC5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotCi08Y29udGV4dCBpZD0iRUpCX05FV19FSkJfV0laQVJEX1BBR0UxIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEVKQiBwcm9qZWN0LiBBbiBFSkIgcHJvamVjdCBwcm92aWRlcyBhIGxvZ2ljYWwgZ3JvdXAgdG8gb3JnYW5pemUgZW50ZXJwcmlzZSBiZWFucy4gCi0KLU9uIHRoaXMgcGFnZSwgbmFtZSB0aGUgRUpCIHByb2plY3QsIGFuZCBzZWxlY3QgdGhlIHdvcmtzcGFjZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgcHJvamVjdCBmaWxlcy4gIAotCi1TZWxlY3QgdGhlIDxiPlNob3cgQWR2YW5jZWQ8L2I+IGJ1dHRvbiB0byBzcGVjaWZ5IGFueSBvZiB0aGUgZm9sbG93aW5nOgotPHVsPgotICAgIDxsaT5UaGUgPGI+VGFyZ2V0IHNlcnZlcjwvYj4uPC9saT4KLSAgICA8bGk+VGhlIDxiPkVKQiB2ZXJzaW9uPC9iPi48L2xpPgotICAgIDxsaT5BdXRvbWF0aWNhbGx5IGFkZCB0aGUgRUpCIHByb2plY3QgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0LjwvbGk+Ci0gICAgPGxpPkNyZWF0ZSBhbiBFSkIgQ2xpZW50IEpBUiBtb2R1bGUgdG8gaG9sZCByZW1vdGUgYW5kIGxvY2FsIGhvbWUgaW50ZXJmYWNlcyBhbmQgY2xhc3Nlcy4gPC9saT4KLSAgICA8bGk+QWRkIHN1cHBvcnQgZm9yIGFubm90YXRlZCBKYXZhIGNsYXNzZXMuPC9saT4KLSAgICA8L3VsPiAKLQotSWYgeW91IHNlbGVjdGVkIHRoZSA8Yj5DcmVhdGUgYW4gRUpCIENsaWVudCBKQVIgbW9kdWxlIHRvIGhvbGQgdGhlIGNsaWVudCBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzPC9iPiwgY2xpY2sgPGI+TmV4dDwvYj4gdG8gZGVmaW5lIHRoZSBFSkIgQ2xpZW50IEpBUiBtb2R1bGUgbmFtZS4gCi1PdGhlcndpc2UsIGNsaWNrIDxiPkZpbmlzaDwvYj4uCi08L2Rlc2NyaXB0aW9uPgotPCEtLSBhZGQgbGluayBmb3IgYW5ub3RhdGVkIEphdmEgY2xhc3Nlcy0tPgotPCEtLXRvcGljIGxhYmVsPSJDcmVhdGluZyBhbiBFSkIgcHJvamVjdCIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuZWpiLmFzc2VtYmx5LmRvYy90b3BpY3MvdGVjcnRwcm8uaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkVKQiBhcmNoaXRlY3R1cmUiIGhyZWY9Ii4uL2NvbS5pYm0uZXRvb2xzLmVqYi5kb2MvdG9waWNzL2NlYXJjaC5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iRUpCIGNsaWVudCBwcm9qZWN0cyIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuZWpiLmFzc2VtYmx5LmRvYy90b3BpY3MvY2VjbGllbnRqYXJzLmh0bWwiLy0tPgotCi08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJFSkJfTkVXX0VKQl9XSVpBUkRfUEFHRTIiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgRUpCIGNsaWVudCBKQVIgbW9kdWxlLCBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBKQVIgZmlsZSAoPGI+Q2xpZW50IEpBUiBVUkk8L2I+KS4KLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuIEVKQiBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5lamIuYXNzZW1ibHkuZG9jL3RvcGljcy90ZWNydHByby5odG1sIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iRUpCIGNsaWVudCBwcm9qZWN0cyIgaHJlZj0iLi4vY29tLmlibS5ldG9vbHMuZWpiLmFzc2VtYmx5LmRvYy90b3BpY3MvY2VjbGllbnRqYXJzLmh0bWwiLy0tPgotPC9jb250ZXh0PgotCi0KLTxjb250ZXh0IGlkPSJKQ0FfTkVXSVpBUkRfUEFHRTEiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHdpemFyZCB0byBjcmVhdGUgYSBDb25uZWN0b3IgcHJvamVjdC4gVGhlIEoyRUUgQ29ubmVjdG9yIEFyY2hpdGVjdHVyZSAoSkNBKSBzcGVjaWZpZXMgaG93IGEgSjJFRSBhcHBsaWNhdGlvbiBjb21wb25lbnQgYWNjZXNzZXMgYSBjb25uZWN0aW9uLWJhc2VkIHJlc291cmNlLiAKLQotT24gdGhpcyBwYWdlLCBuYW1lIHRoZSBDb25uZWN0b3IgcHJvamVjdCwgYW5kIHNlbGVjdCB0aGUgd29ya3NwYWNlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBwcm9qZWN0IGZpbGVzLiAgCi0KLVNlbGVjdCB0aGUgPGI+U2hvdyBBZHZhbmNlZDwvYj4gYnV0dG9uIHRvIHNwZWNpZnkgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci08dWw+Ci0gICAgPGxpPlRoZSA8Yj5UYXJnZXQgc2VydmVyPC9iPi48L2xpPgotICAgIDxsaT5UaGUgPGI+SkNBIHZlcnNpb248L2I+LjwvbGk+Ci0gICAgPGxpPkF1dG9tYXRpY2FsbHkgYWRkIHRoZSBDb25uZWN0b3IgcHJvamVjdCB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QuPC9saT4KLSAgICA8L3VsPiAKLTwvZGVzY3JpcHRpb24+Ci08IS0tIGxpbmsgdG8gJ0Nvbm5lY3RvciBwcm9qZWN0cycgdG9waWMgaW4gY29tLmlibS5ldG9vbHMucmFkLm1pZ3JhdGlvbi5kb2MvdG9waWNzL3J2NmNvbm5lY3RqY2EuaHRtbC0tPgotPCEtLXRvcGljIGxhYmVsPSJDcmVhdGluZyBhIGNvbm5lY3RvciBwcm9qZWN0IiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlLmRvYy90b3BpY3MvdGpyYXIuaHRtbCIvLS0+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0UHJlZnNfSGVscENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9Qcm9qZWN0UHJlZnNfSGVscENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkM2EwMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvUHJvamVjdFByZWZzX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPCEtLSBwcm9qZWN0IHByZWZlcmVuY2VzIC0tPgotCi08Y29udGV4dCBpZD0iSkFSZGVwIj4KLQkJPCEtLSBKQVIgZGVwZW5kZW5jaWVzIHByZWZlcmVuY2VzLS0+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzcGVjaWZ5IGRlcGVuZGVudCBKQVIgZmlsZXMgZm9yIG1vZHVsZXMgd2l0aGluIHRoZSBhc3NvY2lhdGVkIHByb2plY3QuCi0KLVNlbGVjdCA8Yj5Vc2UgRUpCIEpBUnM8L2I+LCA8Yj5Vc2UgRUpCIGNsaWVudCBKQVJzPC9iPiwgb3IgPGI+QWxsb3cgYm90aDwvYj4gdG8gY29udHJvbCB3aGljaCBKQVIgZmlsZXMgYXJlIGxpc3RlZC4gIFRoZW4sIHNlbGVjdCB0aGUgSkFSIGZpbGVzIGZyb20gdGhlIGxpc3QuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIHJ1bi10aW1lIGNsYXNzIHBhdGggYW5kIEphdmEgcHJvamVjdCBidWlsZCBwYXRoIHdpdGggdGhlIGFwcHJvcHJpYXRlIEpBUiBmaWxlcy4KLQotVGhlIDxiPk1hbmlmZXN0IENsYXNzLVBhdGg8L2I+IGZpZWxkIGRpc3BsYXlzIHRoZSBtYW5pZmVzdCBjbGFzcy1wYXRoIGNoYW5nZXMgYmFzZWQgb24gdGhlIEpBUiBmaWxlcyBzZWxlY3RlZC4gVGhpcyBmaWVsZCBpcyBkaXNwbGF5IG9ubHkgYW5kIHNob3dzIHlvdSB0aGUgY2xhc3MgcGF0aCBmb3IgeW91ciBtb2R1bGUgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08IS0tIG5lZWQgbGlua3MgdG8gRUpCIGJhc2UgaW5mbywgRUpCIENsaWVudCBpbmZvLCBwcm9qZWN0IGNsYXNzIHBhdGhzLS0+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iRUFSbW9kIj4KLQk8IS0tIEVBUiBtb2R1bGVzIHByZWZlcmVuY2VzLS0+Ci08ZGVzY3JpcHRpb24+PCEtLSBwYWdlIGlzIGJsYW5rIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyAtLT4KLTwvZGVzY3JpcHRpb24+Ci08IS0tdG9waWMgbGFiZWw9IiIgaHJlZj0iIi8tLT4KLTwhLS10b3BpYyBsYWJlbD0iIiBocmVmPSIiLy0tPgotPC9jb250ZXh0PgotCi0KLQotPC9jb250ZXh0cz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1ZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1ZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGRlODI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW5mb3BvcC9WYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci0JPCEtLSBFY2xpcHNlIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMgLS0+Ci08Y29udGV4dCBpZD0ianZncDAwMDAiPgotPGRlc2NyaXB0aW9uPiBUaGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBwYWdlIGFsbG93cyB5b3UgdG8gdmlldyBvciBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3IgYWxsIHdvcmtiZW5jaCBwcm9qZWN0cy4gQSB2YWxpZGF0b3IgaXMgYSB0b29sIHRoYXQgY2hlY2tzIHRoYXQgcmVzb3VyY2VzIGNvbmZvcm0gdG8gYSBzcGVjaWZpY2F0aW9uLCBEVEQsIG9yIHNvbWUgb3RoZXIgc2V0IG9mIHJ1bGVzLgotCi1TZWxlY3QgdGhlIDxiPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L2I+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0byBhbGxvdyBpbmRpdmlkdWFsIHByb2plY3RzIHRvIHNldCB0aGVpciBvd24gdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4KLVRvIGNvbmZpZ3VyZSBuZXcgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3IgYW4gaW5kaXZpZHVhbCBwcm9qZWN0LCBzZWxlY3QgdGhlIHByb2plY3QgaW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayBhbmQgc2VsZWN0IDxiPlByb3BlcnRpZXMgPiBWYWxpZGF0aW9uPC9iPi4KLQotU2VsZWN0IHRoZSA8Yj5SdW4gdmFsaWRhdGlvbiB3aGVuIHlvdSBtYW51YWxseSBidWlsZCBhIHByb2plY3Q8L2I+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0aGUgc2VsZWN0ZWQgdmFsaWRhdG9ycyB0byBydW4gd2hlbmV2ZXIgeW91IGJ1aWxkIHlvdXIgcHJvamVjdHMuCi1UbyBlbmFibGUgdGhlIDxiPlJ1biB2YWxpZGF0aW9uIHdoZW4geW91IG1hbnVhbGx5IGJ1aWxkIGEgcHJvamVjdDwvYj4gY2hlY2sgYm94LCBzZWxlY3QgYXQgbGVhc3Qgb25lIHZhbGlkYXRvciBpbiB0aGUgbGlzdC4KLQotU2VsZWN0ICB0aGUgPGI+UnVuIHZhbGlkYXRpb24gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlIGNoYW5nZXMgdG8gYSByZXNvdXJjZTwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRoZSBzZWxlY3RlZCB2YWxpZGF0b3JzIHRvIGF1dG9tYXRpY2FsbHkgcnVuIHdoZW5ldmVyIHlvdSBzYXZlIGNoYW5nZXMgdG8gYW55IHByb2plY3QgcmVzb3VyY2VzLgotVG8gZW5hYmxlIHRoZSA8Yj5SdW4gdmFsaWRhdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUgY2hhbmdlcyB0byBhIHJlc291cmNlPC9iPiBjaGVjayBib3gsIHNlbGVjdCBhdCBsZWFzdCBvbmUgdmFsaWRhdG9yIGluIHRoZSBsaXN0LiAKLQotVXNlIHRoZSA8Yj5NYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzPC9iPiBmaWVsZCB0byBkZWZpbmUgdGhlIG1heGltdW0gYWxsb3dhYmxlIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIHRoZSBwcm9qZWN0LgotSWYgdGhlIG51bWJlciBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzIHJlcG9ydGVkIGluIHRoZSB0YXNrIGxpc3QgZXhjZWVkcyB0aGUgbnVtYmVyIHNldCBpbiB0aGlzIGZpZWxkLCB2YWxpZGF0aW9uIHdpbGwgdGVybWluYXRlLgotPC9kZXNjcmlwdGlvbj4KLTwhLS10b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvdGp2YWwuaHRtbCIvLS0+Ci08IS0tdG9waWMgbGFiZWw9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIiBocmVmPSIuLi9jb20uaWJtLmV0b29scy5qMmVlYXBwLmRvYy90b3BpY3MvcnZhbGVyci5odG1sIi8tLT4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL1ZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkODkwNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQk8IS0tIFZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIHByb2plY3QgLS0+Ci0KLTxjb250ZXh0IGlkPSJqdnBwMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIHByb2plY3QgdmFsaWRhdGlvbiBwYWdlIGFsbG93cyB5b3UgdG8gdmlldyBvciBjaGFuZ2UgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgZm9yIGEgcHJvamVjdC4gQSB2YWxpZGF0b3IgaXMgYSB0b29sIHRoYXQgY2hlY2tzIHRoYXQgcmVzb3VyY2VzIGNvbmZvcm0gdG8gYSBzcGVjaWZpY2F0aW9uLCBEVEQsIG9yIHNvbWUgb3RoZXIgc2V0IG9mIHJ1bGVzLgotCi1TZWxlY3QgdGhlIDxiPk92ZXJyaWRlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2I+IGNoZWNrIGJveC4gU2VsZWN0IHRoaXMgY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgc2V0IGluIHRoZSB3b3JrYmVuY2ggUHJlZmVyZW5jZXMgcGFnZS4KLUlmIHRoZSA8Yj5PdmVycmlkZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzPC9iPiBjaGVjayBib3ggaXMgbm90IGVuYWJsZWQsIGdvIHRvIDxiPldpbmRvdyA+IFByZWZlcmVuY2VzID4gVmFsaWRhdGlvbjwvYj4gYW5kIHNlbGVjdCB0aGUgPGI+QWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUgdGhlc2UgcHJlZmVyZW5jZSBzZXR0aW5nczwvYj4gY2hlY2sgYm94LgotCi1TZWxlY3QgdGhlIDxiPlJ1biB2YWxpZGF0aW9uIHdoZW4geW91IG1hbnVhbGx5IGJ1aWxkPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdGhlIHNlbGVjdGVkIHZhbGlkYXRvcnMgdG8gcnVuIHdoZW5ldmVyIHlvdSBidWlsZCB5b3VyIHByb2plY3QuCi1UbyBlbmFibGUgdGhlIDxiPlJ1biB2YWxpZGF0aW9uIHdoZW4geW91IG1hbnVhbGx5IGJ1aWxkPC9iPiBjaGVjayBib3gsIHNlbGVjdCBhdCBsZWFzdCBvbmUgdmFsaWRhdG9yIGluIHRoZSBsaXN0LgotCi1TZWxlY3QgIHRoZSA8Yj5SdW4gdmFsaWRhdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUgY2hhbmdlcyB0byByZXNvdXJjZXM8L2I+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0aGUgc2VsZWN0ZWQgdmFsaWRhdG9ycyB0byBhdXRvbWF0aWNhbGx5IHJ1biB3aGVuZXZlciB5b3Ugc2F2ZSBjaGFuZ2VzIHRvIHlvdXIgcHJvamVjdCByZXNvdXJjZXMuCi1UbyBlbmFibGUgdGhlIDxiPlJ1biB2YWxpZGF0aW9uIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZSBjaGFuZ2VzIHRvIHJlc291cmNlczwvYj4gY2hlY2sgYm94LCBzZWxlY3QgYXQgbGVhc3Qgb25lIHZhbGlkYXRvciBpbiB0aGUgbGlzdC4gCi0KLVVzZSB0aGUgPGI+TWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdGlvbiBtZXNzYWdlczwvYj4gZmllbGQgdG8gZGVmaW5lIHRoZSBtYXhpbXVtIGFsbG93YWJsZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgcHJvamVjdC4KLUlmIHRoZSBudW1iZXIgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcyByZXBvcnRlZCBpbiB0aGUgdGFzayBsaXN0IGV4Y2VlZHMgdGhlIG51bWJlciBzZXQgaW4gdGhpcyBmaWVsZCwgdmFsaWRhdGlvbiB3aWxsIHRlcm1pbmF0ZS4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxMWQwZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IERlbGV0ZUJlYW5fSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBFSkJDcmVhdGVXaXphcmRfSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBFeHBvcnRXaXphcmRfSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBJbXBvcnRXaXphcmRfSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBKMkVFR2VuZXJhbF9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFByZWZlcmVuY2VzX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgUHJvamVjdENyZWF0ZVdpemFyZF9IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFByb2plY3RQcmVmc19IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFZhbGlkYXRpb25Qcm9qUHJlZnNfSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjhmMjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVHJhbnNsYXRpb24gSW5zdHJ1Y3Rpb246IHNlY3Rpb24gdG8gYmUgdHJhbnNsYXRlZAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBsdWdpbi5uYW1lID0gSjJFRSB0b29scyBpbmZvcG9wcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwMDljNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLQk8Y29udGV4dHMgZmlsZT0iRXhwb3J0V2l6YXJkX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IkltcG9ydFdpemFyZF9IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiAvPgotCTxjb250ZXh0cyBmaWxlPSJKMkVFR2VuZXJhbF9IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiAvPgotCTxjb250ZXh0cyBmaWxlPSJQcm9qZWN0Q3JlYXRlV2l6YXJkX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IkVKQkNyZWF0ZVdpemFyZF9IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiAvPgotICAgCTwhLS08Y29udGV4dHMgZmlsZT0iRGVsZXRlQmVhbl9IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiAvPiAtLT4KLQk8Y29udGV4dHMgZmlsZT0iVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiAvPgotCTxjb250ZXh0cyBmaWxlPSJWYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgLz4KLQk8Y29udGV4dHMgZmlsZT0iUHJvamVjdFByZWZzX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIC8+Ci0JPGNvbnRleHRzIGZpbGU9IlByZWZlcmVuY2VzX0hlbHBDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIC8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUwNzFmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjYzcwZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvLmNsYXNzcGF0aCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTliOWQxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0icnVudGltZS9ldmVudC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50Ly5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzgxMDdmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGI0NjYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHJ1bnRpbWUvZXZlbnQuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50L3BsdWdpbi54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmZjA2OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luCi0gICBpZD0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50IgotICAgbmFtZT0iRXZlbnQgTW9kZWwiCi0gICB2ZXJzaW9uPSIzLjAuMC4xIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL2V2ZW50LmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gYnVpbGQtbGV2ZWwgPSAiMjAwMzA4MDZfMTcxM1NMIiAqKiogV2l0aCBmaXggMTAwMjggbWVyZ2VkIGluLiAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiIHZlcnNpb249IjIuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgPC9yZXF1aXJlcz4KLQotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImV2ZW50LnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQuaW1wbC5FdmVudFBhY2thZ2VJbXBsIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ydW50aW1lL2V2ZW50LmphciBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2NvbS5pYm0uZXRvb2xzLmVtZi5ldmVudC9ydW50aW1lL2V2ZW50LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0MTMwYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9jb20uaWJtLmV0b29scy5lbWYuZXZlbnQvcnVudGltZS9ldmVudC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNzc5MWUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9BdHRpYy9mZWF0dXJlLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIzOjAyOjE0ICQKLSMKLQotCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SmF2YSBFTUYgTW9kZWwKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVZpc3VhbCBFZGl0b3IgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUphdmEgRU1GIE1vZGVsLCBpbmNsdWRpbmcgQmVhbkluZm8sIEphdmEgTW9kZWwsIFByb3h5IHN1cHBvcnQgKHdpdGggcmVtb3RlIHZtIGFuZCBJREUgdm0gc3VwcG9ydCkuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSmFudWFyeSAyOCwgMjAwNFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjk2M2QuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0iCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3Rvb2xzL3ZlL3VwZGF0ZXMvMS4wLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdG9vbHMvdmUvdXBkYXRlcy8xLjAvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZHQiIHZlcnNpb249IjMuMS4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZiIgdmVyc2lvbj0iMi4xLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAuMSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTlmYjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KYW51YXJ5IDI4LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQ0YmI4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuamVtLnNvdXJjZT1vcmcuZWNsaXBzZS5qZW0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTU1Mjc3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9BdHRpYy9mZWF0dXJlLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIzOjAyOjE0ICQKLSMKLQotCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SmF2YSBFTUYgTW9kZWwgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1WaXN1YWwgRWRpdG9yIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1CaW5hcmllcyBhbmQgQVBJIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSB6aXBzIGZvciB0aGUgVmlzdWFsIEVkaXRvci4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KYW51YXJ5IDI4LCAyMDA0XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2I2NTllLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS5zZGsiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3Rvb2xzL3ZlL3VwZGF0ZXMvMS4wLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdG9vbHMvdmUvdXBkYXRlcy8xLjAvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0uc2RrIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU5ZmI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGstZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkphbnVhcnkgMjgsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjIzMmQzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0uc2RrPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzhmOTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS5zZGsKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFhM2VjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiMzljMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9BdHRpYy9hYm91dC5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMzowMjoxNCAkCi0jCi0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9SmF2YSBFTUYgTW9kZWwgU0RLXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLiAyMDAwLCAyMDA0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdmVwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzNhMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9lY2xpcHNlMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9vcmcuZWNsaXBzZS5qZW0uc2RrL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjliMThmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL29yZy5lY2xpcHNlLmplbS5zZGsvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvb3JnLmVjbGlwc2UuamVtLnNkay9BdHRpYy9wbHVnaW4ucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjM6MDI6MTQgJAotIwotCi0KLXBsdWdpbk5hbWU9SmF2YSBFTUYgTW9kZWwgU0RLCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjYzcwZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjQ0ODIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL0F0dGljL2ZlYXR1cmUucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjM6MDI6MTQgJAotIwotCi0KLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KYXZhIEVNRiBNb2RlbCBTb3VyY2UKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVZpc3VhbCBFZGl0b3IgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFQSSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgemlwcyBmb3IgdGhlIEphdmEgRU1GIE1vZGVsLgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUphbnVhcnkgMjgsIDIwMDRcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1OWZiOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KYW51YXJ5IDI4LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlNDEzYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWEzZWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGZhMjc5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vQXR0aWMvYWJvdXQucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjM6MDI6MTQgJAotIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1KYXZhIEVNRiBNb2RlbCBTREtcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuIDIwMDAsIDIwMDQuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy92ZXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjEwMjg3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0tZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2Q5MTU1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL0F0dGljL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMzowMjoxNCAkCi0jCi0KLQotcGx1Z2luTmFtZSA9IEphdmEgRU1GIE1vZGVsIFNvdXJjZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjA2NmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuZG9jLmlzdi5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5M2M2NzkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRjOWE3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1kZXNjcmlwdGlvbj1KMkVFIFN0YW5kYXJkIFRvb2xzIERvY3VtZW50YXRpb24KLQotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUphbnVhcnkgMjgsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLVRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLVN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotRmVhdHVyZSBkaXJlY3RvcmllcyBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLUFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi1Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQwZjRhNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi0gLS0+Ci0KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmRvYy51c2VyLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iSjJFRSBTdGFuZGFyZCBUb29scyBEb2MgRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjAuNy4wIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0gICA8aW5zdGFsbC1oYW5kbGVyLz4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuNy4wIgotICAgICAgICAgbmFtZT0iV1NUIFN0YW5kYXJkIFRvb2xzIERvYyBGZWF0dXJlIi8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwIi8+Ci0gICA8L3JlcXVpcmVzPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0Lmdlcm9uaW1vLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24uaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5kb2MudXNlci5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZG9jLnVzZXIuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk4ZDU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCi0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby51aS9PQlNPTEVURS1tb3ZlZCB0byBvcmcuZWNsaXBzZS5qZW0udWkgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby51aS9PQlNPTEVURS1tb3ZlZCB0byBvcmcuZWNsaXBzZS5qZW0udWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udWkvT0JTT0xFVEUtbW92ZWQgdG8gb3JnLmVjbGlwc2UuamVtLnVpCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTdhMmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJlYW5pbmZvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0iYmluX2JlYW5pbmZvY29tbW9uIiBraW5kPSJzcmMiIHBhdGg9ImJlYW5pbmZvQ29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0iYmluX3ZtX2JlYW5pbmZvdm0iIGtpbmQ9InNyYyIgcGF0aD0idm1fYmVhbmluZm92bSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4MTcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotYmluX2JlYW5pbmZvY29tbW9uCi1iaW5fdm1fYmVhbmluZm92bQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNDY1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZWZpbGU9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ2xldmVsPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MzgwNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm88L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+Y29tLmlibS5ldG9vbHMuZW1mLmV2ZW50PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuYXBhY2hlLnhlcmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29tcGFyZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5lbWYuZWNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZW08L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmplbS5wcm94eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uub3NnaTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPmNvbS5pYm0ucnRwLnRvb2xzLnJvc2UuYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+cm9zZTwva2V5PgotCQkJCQk8dmFsdWU+PC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5jb20uaWJtLnJ0cC50b29scy5yb3NlLnRvb2xuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0YjdmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTWF5IDE4IDE2OjQzOjI3IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXM9ODg1OV8xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhN2M3YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLSNUaHUgSnVuIDE2IDEyOjQ1OjQ0IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2ZmNjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNXZWQgTWF5IDExIDE2OjIwOjE1IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZGMxNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEp1biAxNiAxMTowOTowOCBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmluX3ZtX2JlYW5pbmZvdm0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NmI1NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMAotQnVuZGxlLUNsYXNzUGF0aDogYmVhbmluZm8uamFyLAotIGJlYW5pbmZvY29tbW9uLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8sCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24sCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtLnByb3h5LAotIGNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5vc2dpLAotIG9yZy5lY2xpcHNlLnVpO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vQmVhbkRlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5EZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3YjViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vQmVhbkRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbkRlY29yYXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOCAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJlYW4gRGVjb3JhdG9yPC9iPjwvZW0+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+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRFdmVudE5hbWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBVUkwgb2YgYSAxNngxNiBDb2xvciBpY29uCi0JICovCi0JVVJMIGdldEljb25VUkwoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiZGFmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vQmVhbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5FdmVudC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI4ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CZWFuIEV2ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXZlbnQgZnJvbSBJbnRyb3NwZWN0aW9uL1JlZmxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSBCZWFuRXZlbnQgd2lsbCBiZSB1bmRlciB0aGUgSmF2YUNsYXNzJyBldmVudHMgYW5kIGFsbEV2ZW50cyBmZWF0dXJlLiBFYWNoIEJlYW5FdmVudCB3aWxsIGJlIGRlY29yYXRlZCBieSBhbiBFdmVudFNldERlY29yYXRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEJlYW5FdmVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5FdmVudCBleHRlbmRzIEphdmFFdmVudHsKLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5pbmZvRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5pbmZvRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ3YjUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuaW5mb0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvRmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI4ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5pbmZvRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmVhbmluZm9GYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuaW5mb0ZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZlYXR1cmUgRGVjb3JhdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GZWF0dXJlIERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZURlY29yYXRvciBjcmVhdGVGZWF0dXJlRGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV2ZW50U2V0RGVjb3JhdG9yIGNyZWF0ZUV2ZW50U2V0RGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQcm94eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFByb3h5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQcm94eSBjcmVhdGVNZXRob2RQcm94eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5IERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvcGVydHlEZWNvcmF0b3IgY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5kZXhlZCBQcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluZGV4ZWQgUHJvcGVydHkgRGVjb3JhdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgY3JlYXRlSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gRGVjb3JhdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CZWFuIERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmVhbkRlY29yYXRvciBjcmVhdGVCZWFuRGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBEZWNvcmF0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBEZWNvcmF0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZERlY29yYXRvciBjcmVhdGVNZXRob2REZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW1ldGVyIERlY29yYXRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW1ldGVyIERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFyYW1ldGVyRGVjb3JhdG9yIGNyZWF0ZVBhcmFtZXRlckRlY29yYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCZWFuaW5mb1BhY2thZ2UgZ2V0QmVhbmluZm9QYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gRXZlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gRXZlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJlYW5FdmVudCBjcmVhdGVCZWFuRXZlbnQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5pbmZvUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0JlYW5pbmZvUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQ1OTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9CZWFuaW5mb1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb1BhY2thZ2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjA6MDk6NTIgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+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+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUFOTk9UQVRJT05fRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RmVhdHVyZSBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQU5OT1RBVElPTl9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fU09VUkNFID0gRkVBVFVSRV9ERUNPUkFUT1JfX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXRhaWxzPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0RFVEFJTFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTW9kZWwgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19DT05URU5UUyA9IEZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fUkVGRVJFTkNFUyA9IEZFQVRVUkVfREVDT1JBVE9SX19SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19ESVNQTEFZX05BTUUgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaG9ydCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTiA9IEZFQVRVUkVfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fQ0FURUdPUlkgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cGVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19FWFBFUlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRVhQRVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpZGRlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19ISURERU4gPSBGRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZlcnJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19QUkVGRVJSRUQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lcmdlIEludHJvc3BlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTiA9IEZFQVRVUkVfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFkgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdGx5IFNldCBCaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRyA9IEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9QUk9QRVJUSUVTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lcmdlIFN1cGVyIE1ldGhvZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfTUVUSE9EUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lcmdlIFN1cGVyIEV2ZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50cm9zcGVjdCBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfUFJPUEVSVElFUyA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRyb3NwZWN0IE1ldGhvZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9NRVRIT0RTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50cm9zcGVjdCBFdmVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9FVkVOVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG8gQmVhbmluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9fRE9fQkVBTklORk8gPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90IEluaGVyaXRlZCBQcm9wZXJ0eSBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfUFJPUEVSVFlfTkFNRVMgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3QgSW5oZXJpdGVkIE1ldGhvZCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfTUVUSE9EX05BTUVTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90IEluaGVyaXRlZCBFdmVudCBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfRVZFTlRfTkFNRVMgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9ERUNPUkFUT1JfX0NVU1RPTUlaRVJfQ0xBU1MgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CZWFuIERlY29yYXRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19TT1VSQ0UgPSBGRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRldGFpbHM8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19ERVRBSUxTID0gRkVBVFVSRV9ERUNPUkFUT1JfX0RFVEFJTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU1vZGVsIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0NPTlRFTlRTID0gRkVBVFVSRV9ERUNPUkFUT1JfX0NPTlRFTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFRkVSRU5DRVMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19ESVNQTEFZX05BTUUgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaG9ydCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OID0gRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0NBVEVHT1JZID0gRkVBVFVSRV9ERUNPUkFUT1JfX0NBVEVHT1JZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19FWFBFUlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRVhQRVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpZGRlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0hJRERFTiA9IEZFQVRVUkVfREVDT1JBVE9SX19ISURERU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZmVycmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fUFJFRkVSUkVEID0gRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXJnZSBJbnRyb3NwZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTiA9IEZFQVRVUkVfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWSA9IEZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0bHkgU2V0IEJpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTID0gRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXQgRGVjb3JhdG9yIEZsYWc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRyA9IEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFUyA9IEZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbiBEZWZhdWx0IEV2ZW50IFNldDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VUID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pY2FzdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX1VOSUNBU1QgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBNZXRob2RzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWSA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRXZlbnRJbXBsIDxlbT5CZWFuIEV2ZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkV2ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbmluZm9QYWNrYWdlSW1wbCNnZXRCZWFuRXZlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVCA9IDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZCBMaXN0ZW5lciBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19BRERfTElTVEVORVJfTUVUSE9EID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyIE1ldGhvZHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXIgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX1RZUEUgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0QgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXZlbnQgQWRhcHRlciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVWRU5UX1NFVF9ERUNPUkFUT1JfX0VWRU5UX0FEQVBURVJfQ0xBU1MgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXIgTGlzdCBNdGhkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVZFTlRfU0VUX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+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+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1ldGhvZCBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19FQU5OT1RBVElPTlMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX1NPVVJDRSA9IEZFQVRVUkVfREVDT1JBVE9SX19TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGV0YWlsczwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0RFVEFJTFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTW9kZWwgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCA9IEZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ09OVEVOVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQ09OVEVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fUkVGRVJFTkNFUyA9IEZFQVRVUkVfREVDT1JBVE9SX19SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRSA9IEZFQVRVUkVfREVDT1JBVE9SX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNob3J0IERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT04gPSBGRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ0FURUdPUlkgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cGVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0VYUEVSVCA9IEZFQVRVUkVfREVDT1JBVE9SX19FWFBFUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGlkZGVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1FVEVSX0RFQ09SQVRPUl9fSElEREVOID0gRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmZXJyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19QUkVGRVJSRUQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lcmdlIEludHJvc3BlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OID0gRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXMgRXhwbGljaXQgRW1wdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZID0gRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXRseSBTZXQgQml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHID0gRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTID0gRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX19OQU1FID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNRVRFUl9ERUNPUkFUT1JfX1BBUkFNRVRFUiA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UGFyYW1ldGVyIERlY29yYXRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTUVURVJfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TID0gRkVBVFVSRV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRSA9IEZFQVRVUkVfREVDT1JBVE9SX19TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGV0YWlsczwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUyA9IEZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNb2RlbCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFMgPSBGRUFUVVJFX0RFQ09SQVRPUl9fQ09OVEVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTID0gRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19ESVNQTEFZX05BTUUgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaG9ydCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT04gPSBGRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19DQVRFR09SWSA9IEZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19FWFBFUlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9fRVhQRVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpZGRlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOID0gRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmZXJyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRCA9IEZFQVRVUkVfREVDT1JBVE9SX19QUkVGRVJSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVyZ2UgSW50cm9zcGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTiA9IEZFQVRVUkVfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZID0gRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGljaXRseSBTZXQgQml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUyA9IEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRyA9IEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTID0gRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cmFpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2lnbiBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRSA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsd2F5cyBJbmNvbXBhdGlibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEUgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgRmxhZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIFJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19QUk9QRVJUWV9FRElUT1JfQ0xBU1MgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldyaXRlIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EID0gRkVBVFVSRV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRCA9IEZFQVRVUkVfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSBGRUFUVVJFX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+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+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRCA9IFBST1BFUlRZX0RFQ09SQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkluZGV4ZWQgUHJvcGVydHkgRGVjb3JhdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX0ZFQVRVUkVfQ09VTlQgPSBQUk9QRVJUWV9ERUNPUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QUk9YWV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QUk9YWV9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QUk9YWV9fTUFOWSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QUk9YWV9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNvbnRhaW5pbmcgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19FUEFSQU1FVEVSUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXhjZXB0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BST1hZX19FRVhDRVBUSU9OUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FRVhDRVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUFJPWFlfX01FVEhPRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWV0aG9kIFByb3h5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QUk9YWV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19FQU5OT1RBVElPTlMgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX05BTUUgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fT1JERVJFRCA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fVU5JUVVFID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fTE9XRVJfQk9VTkQgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX1VQUEVSX0JPVU5EID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX01BTlkgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fUkVRVUlSRUQgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX0VUWVBFID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX0NIQU5HRUFCTEUgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19DSEFOR0VBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fVk9MQVRJTEUgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19WT0xBVElMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19UUkFOU0lFTlQgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19UUkFOU0lFTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCRUFOX0VWRU5UX19ERUZBVUxUX1ZBTFVFID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbnNldHRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9fVU5TRVRUQUJMRSA9IEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOU0VUVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVyaXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX0RFUklWRUQgPSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERVJJVkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJFQU5fRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJlYW4gRXZlbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkVBTl9FVkVOVF9GRUFUVVJFX0NPVU5UID0gSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsIDxlbT5GZWF0dXJlIEF0dHJpYnV0ZSBNYXAgRW50cnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5GZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuaW5mb1BhY2thZ2VJbXBsI2dldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUlkgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fS0VZID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5GZWF0dXJlIEF0dHJpYnV0ZSBNYXAgRW50cnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW0gPGVtPkltcGxpY2l0IEl0ZW08L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5pbmZvUGFja2FnZUltcGwjZ2V0SW1wbGljaXRJdGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNUExJQ0lUX0lURU0gPSAxMDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yIDxlbT5GZWF0dXJlIERlY29yYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GZWF0dXJlIERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRGZWF0dXJlRGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9EaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRTaG9ydERlc2NyaXB0aW9uIDxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNob3J0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9TaG9ydERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNFeHBlcnQgPGVtPkV4cGVydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4cGVydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzRXhwZXJ0KCkKLQkgKiBAc2VlICNnZXRGZWF0dXJlRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0V4cGVydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0hpZGRlbiA8ZW0+SGlkZGVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGlkZGVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNIaWRkZW4oKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfSGlkZGVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzUHJlZmVycmVkIDxlbT5QcmVmZXJyZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVmZXJyZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc1ByZWZlcnJlZCgpCi0JICogQHNlZSAjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9QcmVmZXJyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNNZXJnZUludHJvc3BlY3Rpb24gPGVtPk1lcmdlIEludHJvc3BlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXJnZSBJbnRyb3NwZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNNZXJnZUludHJvc3BlY3Rpb24oKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfTWVyZ2VJbnRyb3NwZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkgPGVtPkF0dHJpYnV0ZXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpCi0JICogQHNlZSAjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRJbXBsaWNpdGx5U2V0Qml0cyA8ZW0+SW1wbGljaXRseSBTZXQgQml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGxpY2l0bHkgU2V0IEJpdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRJbXBsaWNpdGx5U2V0Qml0cygpCi0JICogQHNlZSAjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9JbXBsaWNpdGx5U2V0Qml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRJbXBsaWNpdERlY29yYXRvckZsYWcgPGVtPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wbGljaXQgRGVjb3JhdG9yIEZsYWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKQotCSAqIEBzZWUgI2dldEZlYXR1cmVEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfSW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0QXR0cmlidXRlcygpCi0JICogQHNlZSAjZ2V0RmVhdHVyZURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IgPGVtPkV2ZW50IFNldCBEZWNvcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXZlbnQgU2V0IERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXZlbnRTZXREZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzSW5EZWZhdWx0RXZlbnRTZXQgPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjZ2V0RXZlbnRTZXREZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0luRGVmYXVsdEV2ZW50U2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc1VuaWNhc3QgPGVtPlVuaWNhc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmljYXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzVW5pY2FzdCgpCi0JICogQHNlZSAjZ2V0RXZlbnRTZXREZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV2ZW50U2V0RGVjb3JhdG9yX1VuaWNhc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSA8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAc2VlICNnZXRFdmVudFNldERlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0QWRkTGlzdGVuZXJNZXRob2QgPGVtPkFkZCBMaXN0ZW5lciBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldEFkZExpc3RlbmVyTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRFdmVudFNldERlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfQWRkTGlzdGVuZXJNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0TGlzdGVuZXJNZXRob2RzIDxlbT5MaXN0ZW5lciBNZXRob2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5MaXN0ZW5lciBNZXRob2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldExpc3RlbmVyTWV0aG9kcygpCi0JICogQHNlZSAjZ2V0RXZlbnRTZXREZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0TGlzdGVuZXJUeXBlIDxlbT5MaXN0ZW5lciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRMaXN0ZW5lclR5cGUoKQotCSAqIEBzZWUgI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldFJlbW92ZUxpc3RlbmVyTWV0aG9kIDxlbT5SZW1vdmUgTGlzdGVuZXIgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpCi0JICogQHNlZSAjZ2V0RXZlbnRTZXREZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX1JlbW92ZUxpc3RlbmVyTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRFdmVudEFkYXB0ZXJDbGFzcyA8ZW0+RXZlbnQgQWRhcHRlciBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0RXZlbnRBZGFwdGVyQ2xhc3MoKQotCSAqIEBzZWUgI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9FdmVudEFkYXB0ZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRTZXJMaXN0TXRoZCA8ZW0+U2VyIExpc3QgTXRoZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VyIExpc3QgTXRoZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRTZXJMaXN0TXRoZCgpCi0JICogQHNlZSAjZ2V0RXZlbnRTZXREZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX1Nlckxpc3RNdGhkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHkgPGVtPk1ldGhvZCBQcm94eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUHJveHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFByb3h5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eSNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eSNnZXRNZXRob2QoKQotCSAqIEBzZWUgI2dldE1ldGhvZFByb3h5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQcm94eV9NZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciA8ZW0+UHJvcGVydHkgRGVjb3JhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb3BlcnR5IERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHlEZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQm91bmQgPGVtPkJvdW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm91bmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNCb3VuZCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0JvdW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0NvbnN0cmFpbmVkIDxlbT5Db25zdHJhaW5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnN0cmFpbmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQ29uc3RyYWluZWQoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9Db25zdHJhaW5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNEZXNpZ25UaW1lIDxlbT5EZXNpZ24gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2lnbiBUaW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzRGVzaWduVGltZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0Rlc2lnblRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQWx3YXlzSW5jb21wYXRpYmxlIDxlbT5BbHdheXMgSW5jb21wYXRpYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx3YXlzIEluY29tcGF0aWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0Fsd2F5c0luY29tcGF0aWJsZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0Fsd2F5c0luY29tcGF0aWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRGaWx0ZXJGbGFncyA8ZW0+RmlsdGVyIEZsYWdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5GaWx0ZXIgRmxhZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0RmlsdGVyRmxhZ3MoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWx0ZXJGbGFncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNGaWVsZFJlYWRPbmx5IDxlbT5GaWVsZCBSZWFkIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBSZWFkIE9ubHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNGaWVsZFJlYWRPbmx5KCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGRSZWFkT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0UHJvcGVydHlFZGl0b3JDbGFzcyA8ZW0+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJvcGVydHkgRWRpdG9yIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFByb3BlcnR5RWRpdG9yQ2xhc3MoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9Qcm9wZXJ0eUVkaXRvckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRSZWFkTWV0aG9kIDxlbT5SZWFkIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJlYWQgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9SZWFkTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRXcml0ZU1ldGhvZCA8ZW0+V3JpdGUgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+V3JpdGUgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFdyaXRlTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvcGVydHlEZWNvcmF0b3JfV3JpdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkZpZWxkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldEZpZWxkKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eURlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgPGVtPkluZGV4ZWQgUHJvcGVydHkgRGVjb3JhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluZGV4ZWQgUHJvcGVydHkgRGVjb3JhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFJlYWRNZXRob2QgPGVtPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5JbmRleGVkIFJlYWQgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciNnZXRJbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JfSW5kZXhlZFJlYWRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciNnZXRJbmRleGVkV3JpdGVNZXRob2QgPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yI2dldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JfSW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciA8ZW0+QmVhbiBEZWNvcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmVhbiBEZWNvcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QmVhbkRlY29yYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzIDxlbT5NZXJnZSBTdXBlciBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWVyZ2UgU3VwZXIgUHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldEJlYW5EZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlclByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyTWV0aG9kcyA8ZW0+TWVyZ2UgU3VwZXIgTWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1lcmdlIFN1cGVyIE1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc01lcmdlU3VwZXJNZXRob2RzKCkKLQkgKiBAc2VlICNnZXRCZWFuRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzTWVyZ2VTdXBlckV2ZW50cyA8ZW0+TWVyZ2UgU3VwZXIgRXZlbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWVyZ2UgU3VwZXIgRXZlbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNNZXJnZVN1cGVyRXZlbnRzKCkKLQkgKiBAc2VlICNnZXRCZWFuRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJFdmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNJbnRyb3NwZWN0UHJvcGVydGllcyA8ZW0+SW50cm9zcGVjdCBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW50cm9zcGVjdCBQcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjaXNJbnRyb3NwZWN0UHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0UHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc0ludHJvc3BlY3RNZXRob2RzIDxlbT5JbnRyb3NwZWN0IE1ldGhvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnRyb3NwZWN0IE1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNpc0ludHJvc3BlY3RNZXRob2RzKCkKLQkgKiBAc2VlICNnZXRCZWFuRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzSW50cm9zcGVjdEV2ZW50cyA8ZW0+SW50cm9zcGVjdCBFdmVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnRyb3NwZWN0IEV2ZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzSW50cm9zcGVjdEV2ZW50cygpCi0JICogQHNlZSAjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0RXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2dldEN1c3RvbWl6ZXJDbGFzcyA8ZW0+Q3VzdG9taXplciBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkN1c3RvbWl6ZXIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNnZXRDdXN0b21pemVyQ2xhc3MoKQotCSAqIEBzZWUgI2dldEJlYW5EZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJlYW5EZWNvcmF0b3JfQ3VzdG9taXplckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yIDxlbT5NZXRob2QgRGVjb3JhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBEZWNvcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2REZWNvcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNpc1Bhcm1zRXhwbGljaXRFbXB0eSA8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJtcyBFeHBsaWNpdCBFbXB0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3IjaXNQYXJtc0V4cGxpY2l0RW1wdHkoKQotCSAqIEBzZWUgI2dldE1ldGhvZERlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRGVjb3JhdG9yX1Bhcm1zRXhwbGljaXRFbXB0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3IjZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMgPGVtPlBhcmFtZXRlciBEZXNjcmlwdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFyYW1ldGVyIERlc2NyaXB0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpCi0JICogQHNlZSAjZ2V0TWV0aG9kRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2REZWNvcmF0b3JfUGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yI2dldFNlclBhcm1EZXNjIDxlbT5TZXIgUGFybSBEZXNjPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXIgUGFybSBEZXNjPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNnZXRTZXJQYXJtRGVzYygpCi0JICogQHNlZSAjZ2V0TWV0aG9kRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2REZWNvcmF0b3JfU2VyUGFybURlc2MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3IgPGVtPlBhcmFtZXRlciBEZWNvcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFyYW1ldGVyIERlY29yYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBhcmFtZXRlckRlY29yYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvciNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBhcmFtZXRlckRlY29yYXRvcl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWUgPGVtPkZlYXR1cmUgQXR0cmlidXRlIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GZWF0dXJlIEF0dHJpYnV0ZSBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RmVhdHVyZUF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCZWFuaW5mb0ZhY3RvcnkgZ2V0QmVhbmluZm9GYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzRG9CZWFuaW5mbyA8ZW0+RG8gQmVhbmluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EbyBCZWFuaW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2lzRG9CZWFuaW5mbygpCi0JICogQHNlZSAjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9Eb0JlYW5pbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5EZWNvcmF0b3IjZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyA8ZW0+Tm90IEluaGVyaXRlZCBQcm9wZXJ0eSBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Tm90IEluaGVyaXRlZCBQcm9wZXJ0eSBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2dldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKQotCSAqIEBzZWUgI2dldEJlYW5EZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2dldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzIDxlbT5Ob3QgSW5oZXJpdGVkIE1ldGhvZCBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Tm90IEluaGVyaXRlZCBNZXRob2QgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcygpCi0JICogQHNlZSAjZ2V0QmVhbkRlY29yYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRNZXRob2ROYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRGVjb3JhdG9yI2dldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMgPGVtPk5vdCBJbmhlcml0ZWQgRXZlbnQgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk5vdCBJbmhlcml0ZWQgRXZlbnQgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvciNnZXROb3RJbmhlcml0ZWRFdmVudE5hbWVzKCkKLQkgKiBAc2VlICNnZXRCZWFuRGVjb3JhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZEV2ZW50TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvciNnZXRQYXJhbWV0ZXIgPGVtPlBhcmFtZXRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBhcmFtZXRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3IjZ2V0UGFyYW1ldGVyKCkKLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBhcmFtZXRlckRlY29yYXRvcl9QYXJhbWV0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRXZlbnQgPGVtPkJlYW4gRXZlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmVhbiBFdmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuRXZlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJlYW5FdmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeSA8ZW0+RmVhdHVyZSBBdHRyaWJ1dGUgTWFwIEVudHJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZlYXR1cmUgQXR0cmlidXRlIE1hcCBFbnRyeTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5NYXAuRW50cnkKLQkgKiBAbW9kZWwga2V5VHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgdmFsdWVUeXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIgdmFsdWVEYXRhVHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBqYXZhLnV0aWwuTWFwLkVudHJ5IDxlbT5LZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXk8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwLkVudHJ5Ci0JICogQHNlZSAjZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlfS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnkgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwLkVudHJ5Ci0JICogQHNlZSAjZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbSA8ZW0+SW1wbGljaXQgSXRlbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkltcGxpY2l0IEl0ZW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldEltcGxpY2l0SXRlbSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vRXZlbnRTZXREZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9FdmVudFNldERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWZjMjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9FdmVudFNldERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogRXZlbnRTZXREZWNvcmF0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOCAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FdmVudCBTZXQgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXF1aXZhbGVudCB0byBFdmVudFNldERlY29yYXRvciBpbiBqYXZhLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0luRGVmYXVsdEV2ZW50U2V0IDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzVW5pY2FzdCA8ZW0+VW5pY2FzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSA8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldEFkZExpc3RlbmVyTWV0aG9kIDxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0TGlzdGVuZXJNZXRob2RzIDxlbT5MaXN0ZW5lciBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0TGlzdGVuZXJUeXBlIDxlbT5MaXN0ZW5lciBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QgPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRFdmVudEFkYXB0ZXJDbGFzcyA8ZW0+RXZlbnQgQWRhcHRlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldFNlckxpc3RNdGhkIDxlbT5TZXIgTGlzdCBNdGhkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEV2ZW50U2V0RGVjb3JhdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGludGVyZmFjZSBFdmVudFNldERlY29yYXRvciBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3J7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRBREFQVEVSQ0xBU1MgPSAiZXZlbnRBZGFwdGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEluRGVmYXVsdEV2ZW50U2V0KCkKLQkgKiBAc2VlICN1bnNldEluRGVmYXVsdEV2ZW50U2V0KCkKLQkgKiBAc2VlICNzZXRJbkRlZmF1bHRFdmVudFNldChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcl9JbkRlZmF1bHRFdmVudFNldCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJbkRlZmF1bHRFdmVudFNldCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzSW5EZWZhdWx0RXZlbnRTZXQgPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjdW5zZXRJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjaXNJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5EZWZhdWx0RXZlbnRTZXQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0luRGVmYXVsdEV2ZW50U2V0IDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjaXNJbkRlZmF1bHRFdmVudFNldCgpCi0JICogQHNlZSAjc2V0SW5EZWZhdWx0RXZlbnRTZXQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEluRGVmYXVsdEV2ZW50U2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNpc0luRGVmYXVsdEV2ZW50U2V0IDxlbT5JbiBEZWZhdWx0IEV2ZW50IFNldDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEluRGVmYXVsdEV2ZW50U2V0KCkKLQkgKiBAc2VlICNpc0luRGVmYXVsdEV2ZW50U2V0KCkKLQkgKiBAc2VlICNzZXRJbkRlZmF1bHRFdmVudFNldChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SW5EZWZhdWx0RXZlbnRTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaWNhc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaWNhc3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pY2FzdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRVbmljYXN0KCkKLQkgKiBAc2VlICN1bnNldFVuaWNhc3QoKQotCSAqIEBzZWUgI3NldFVuaWNhc3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RXZlbnRTZXREZWNvcmF0b3JfVW5pY2FzdCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNVbmljYXN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNVbmljYXN0IDxlbT5VbmljYXN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmljYXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVuaWNhc3QoKQotCSAqIEBzZWUgI3Vuc2V0VW5pY2FzdCgpCi0JICogQHNlZSAjaXNVbmljYXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbmljYXN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNVbmljYXN0IDxlbT5VbmljYXN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFVuaWNhc3QoKQotCSAqIEBzZWUgI2lzVW5pY2FzdCgpCi0JICogQHNlZSAjc2V0VW5pY2FzdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VW5pY2FzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjaXNVbmljYXN0IDxlbT5VbmljYXN0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmljYXN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVbmljYXN0KCkKLQkgKiBAc2VlICNpc1VuaWNhc3QoKQotCSAqIEBzZWUgI3NldFVuaWNhc3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFVuaWNhc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNldCB0cnVlIGlmIHRoZSBsaXN0ZW5lck1ldGhvZHMgZmVhdHVyZSBpcyBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgaXMgbm90IHRvIGhhdmUgbGlzdGVuZXIgbWV0aG9kcyBtZXJnZWQgaW4gZnJvbSBCZWFuSW5mbyBvciByZWZsZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaXN0ZW5lciBNZXRob2RzIEV4cGxpY2l0IEVtcHR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSA8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkIExpc3RlbmVyIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkIExpc3RlbmVyIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBZGRMaXN0ZW5lck1ldGhvZChNZXRob2QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZCBnZXRBZGRMaXN0ZW5lck1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldEFkZExpc3RlbmVyTWV0aG9kIDxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBZGRMaXN0ZW5lck1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWRkTGlzdGVuZXJNZXRob2QoTWV0aG9kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpc3RlbmVyIE1ldGhvZHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGlzdGVuZXIgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIGxpc3RlbmVyIG1ldGhvZHMuIElmIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGUgbGlzdCBiZSBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mbyBzZXQgaXQsIHRoZW4gc2V0IGxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgdG8gdHJ1ZS4KLQkgKiA8cD4KLQkgKiBMaXN0ZW5lck1ldGhvZHMgd2lsbCBiZSBkZWNvcmF0ZWQgd2l0aCBNZXRob2REZWNvcmF0b3JzLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgYSBkZXJpdmVkIHNldHRpbmcsIHdoaWNoIG1lYW5zIGl0IHdpbGwgbm90IG5vdGlmeSBvdXQgY2hhbmdlcyB0byBpdC4gVG8gaGVyZSBjaGFuZ2VzIHRvIGl0LCBsaXN0ZW4gb24gInNlckxpc3RNdGhkIiBub3RpZmljYXRpb25zIGluc3RlYWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpc3RlbmVyIE1ldGhvZHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eSIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldExpc3RlbmVyTWV0aG9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGlzdGVuZXIgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaXN0ZW5lciBUeXBlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRMaXN0ZW5lclR5cGUoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lclR5cGUoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldExpc3RlbmVyVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yI2dldExpc3RlbmVyVHlwZSA8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGlzdGVuZXIgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TGlzdGVuZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaXN0ZW5lclR5cGUoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoTWV0aG9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRFdmVudFNldERlY29yYXRvcl9SZW1vdmVMaXN0ZW5lck1ldGhvZCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2QgZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5FdmVudFNldERlY29yYXRvciNnZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCA8ZW0+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbW92ZUxpc3RlbmVyTWV0aG9kKE1ldGhvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FdmVudCBBZGFwdGVyIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBGb3Igc29tZSBsaXN0ZW5lciBpbnRlcmZhY2VzIGFuIGFkYXB0ZXIgY2xhc3MgaXMgcHJvdmlkZWQgdGhhdCBpbXBsZW1lbnRzIGRlZmF1bHQgbm8tb3AgbWV0aG9kcywgZS5nLiBqYXZhLmF3dC5ldmVudC5Gb2N1c0V2ZW50IHdoaWNoIGhhcyBqYXZhLmF3dC5ldmVudC5Gb2N1c0FkYXB0ZXIuIFRoZSBBZGFwdGVyIGNsYXNzIGlzIHByb3ZpZGVkIGluIGEga2V5L3ZhbHVlIHBhaXIgb24gdGhlIGphdmEuYmVhbnMuRXZlbnRTZXREZXNjcmlwdG9yIHdpdGggYSBrZXkgZGVmaW5lZCBpbiBhIHN0YXRpYyBmaW5hbCBjb25zdGFudHMgRVZFTlRBREFQVEVSQ0xBU1MgPSAiZXZlbnRBZGFwdGVyQ2xhc3MiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FdmVudCBBZGFwdGVyIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFdmVudEFkYXB0ZXJDbGFzcyhKYXZhQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEV2ZW50U2V0RGVjb3JhdG9yX0V2ZW50QWRhcHRlckNsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldEV2ZW50QWRhcHRlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3IjZ2V0RXZlbnRBZGFwdGVyQ2xhc3MgPGVtPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV2ZW50IEFkYXB0ZXIgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV2ZW50QWRhcHRlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFdmVudEFkYXB0ZXJDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VyIExpc3QgTXRoZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIGEgcHJpdmF0ZSBmZWF0dXJlLiBJdCBpcyB1c2VkIGludGVybmFsbHkgb25seS4gCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlciBMaXN0IE10aGQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEV2ZW50U2V0RGVjb3JhdG9yX1Nlckxpc3RNdGhkKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5IiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFNlckxpc3RNdGhkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9GZWF0dXJlRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vRmVhdHVyZURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDIyYWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9GZWF0dXJlRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBGZWF0dXJlRGVjb3JhdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjA6MDk6NTEgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmVhdHVyZSBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBFcXVpdmFsZW50IHRvIEZlYXR1cmVEZXNjcmlwdG9yIGluIGphdmEuCi0gKiA8cD4KLSAqIE5vdGU6IElmIGFueSBhdHRyaWJ1dGUgaXMgZXhwbGljaXRseSBzZXQgdGhlbiB0aGUgQmVhbkluZm8vUmVmbGVjdGlvbiB3aWxsIG5vdCBiZSBtZXJnZWQgaW50byB0aGUgZGVjb3JhdG9yLiBUaGlzIHByb3ZpZGVzIGEgd2F5IG9mIG92ZXJyaWRpbmcgdGhlIEJlYW5JbmZvcy4gQWxzbyBmb3IgYW55IG1hbnktdmFsdWVkIGF0dHJpYnV0ZSwgaWYgaXQgaXMgZGVzaXJlZCB0byBoYXZlIGl0IGV4cGxpY2l0bHkgZW1wdHkgYW5kIG5vdCBoYXZlIEJlYW5JbmZvIGZpbGwgaXQgaW4sIHRoZXJlIHdpbGwgYmUgYW5vdGhlciBhdHRyaWJ1dGUgbmFtZWQgb2YgdGhlIGZvcm0gImF0dGlidXR1ZUV4cGxpY2l0RW1wdHkiIElmIHRoaXMgaXMgdHJ1ZSB0aGVuIHRoZSBCZWFuSW5mbyB3aWxsIG5vdCBtZXJnZSBpbiBhbmQgd2lsbCBsZWF2ZSBpdCBlbXB0eS4KLSAqIDxwPgotICogVGhlc2UgY29tbWVudHMgYWJvdXQgbWVyZ2luZyBhcHBseSB0byBhbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGRlY29yYXRvciB0b28uIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldFNob3J0RGVzY3JpcHRpb24gPGVtPlNob3J0IERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzRXhwZXJ0IDxlbT5FeHBlcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzSGlkZGVuIDxlbT5IaWRkZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzUHJlZmVycmVkIDxlbT5QcmVmZXJyZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzTWVyZ2VJbnRyb3NwZWN0aW9uIDxlbT5NZXJnZSBJbnRyb3NwZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5IDxlbT5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRJbXBsaWNpdGx5U2V0Qml0cyA8ZW0+SW1wbGljaXRseSBTZXQgQml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnIDxlbT5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0QXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRGZWF0dXJlRGVjb3JhdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGludGVyZmFjZSBGZWF0dXJlRGVjb3JhdG9yIGV4dGVuZHMgRUFubm90YXRpb257Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjdW5zZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjc2V0RGlzcGxheU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRGZWF0dXJlRGVjb3JhdG9yX0Rpc3BsYXlOYW1lKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI3Vuc2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldERpc3BsYXlOYW1lKCkKLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjc2V0RGlzcGxheU5hbWUoU3RyaW5nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lKFN0cmluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaG9ydCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjdW5zZXRTaG9ydERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNzZXRTaG9ydERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9TaG9ydERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldFNob3J0RGVzY3JpcHRpb24gPGVtPlNob3J0IERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTaG9ydERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICN1bnNldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFNob3J0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNob3J0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0U2hvcnREZXNjcmlwdGlvbiA8ZW0+U2hvcnQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjc2V0U2hvcnREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2dldFNob3J0RGVzY3JpcHRpb24gPGVtPlNob3J0IERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaG9ydCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0U2hvcnREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjc2V0U2hvcnREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGVnb3J5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9DYXRlZ29yeSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhdGVnb3J5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHBlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4cGVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXhwZXJ0KCkKLQkgKiBAc2VlICN1bnNldEV4cGVydCgpCi0JICogQHNlZSAjc2V0RXhwZXJ0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEZlYXR1cmVEZWNvcmF0b3JfRXhwZXJ0KCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0V4cGVydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNFeHBlcnQgPGVtPkV4cGVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhwZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEV4cGVydCgpCi0JICogQHNlZSAjdW5zZXRFeHBlcnQoKQotCSAqIEBzZWUgI2lzRXhwZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHBlcnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzRXhwZXJ0IDxlbT5FeHBlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXhwZXJ0KCkKLQkgKiBAc2VlICNpc0V4cGVydCgpCi0JICogQHNlZSAjc2V0RXhwZXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFeHBlcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNFeHBlcnQgPGVtPkV4cGVydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFeHBlcnQoKQotCSAqIEBzZWUgI2lzRXhwZXJ0KCkKLQkgKiBAc2VlICNzZXRFeHBlcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEV4cGVydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGlkZGVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IaWRkZW48L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGlkZGVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhpZGRlbigpCi0JICogQHNlZSAjdW5zZXRIaWRkZW4oKQotCSAqIEBzZWUgI3NldEhpZGRlbihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRGZWF0dXJlRGVjb3JhdG9yX0hpZGRlbigpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIaWRkZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzSGlkZGVuIDxlbT5IaWRkZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhpZGRlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIaWRkZW4oKQotCSAqIEBzZWUgI3Vuc2V0SGlkZGVuKCkKLQkgKiBAc2VlICNpc0hpZGRlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGlkZGVuKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0hpZGRlbiA8ZW0+SGlkZGVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEhpZGRlbigpCi0JICogQHNlZSAjaXNIaWRkZW4oKQotCSAqIEBzZWUgI3NldEhpZGRlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SGlkZGVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yI2lzSGlkZGVuIDxlbT5IaWRkZW48L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpZGRlbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SGlkZGVuKCkKLQkgKiBAc2VlICNpc0hpZGRlbigpCi0JICogQHNlZSAjc2V0SGlkZGVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRIaWRkZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWZlcnJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZmVycmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZlcnJlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRQcmVmZXJyZWQoKQotCSAqIEBzZWUgI3Vuc2V0UHJlZmVycmVkKCkKLQkgKiBAc2VlICNzZXRQcmVmZXJyZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9QcmVmZXJyZWQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUHJlZmVycmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc1ByZWZlcnJlZCA8ZW0+UHJlZmVycmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmZXJyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UHJlZmVycmVkKCkKLQkgKiBAc2VlICN1bnNldFByZWZlcnJlZCgpCi0JICogQHNlZSAjaXNQcmVmZXJyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZlcnJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjaXNQcmVmZXJyZWQgPGVtPlByZWZlcnJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRQcmVmZXJyZWQoKQotCSAqIEBzZWUgI2lzUHJlZmVycmVkKCkKLQkgKiBAc2VlICNzZXRQcmVmZXJyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFByZWZlcnJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc1ByZWZlcnJlZCA8ZW0+UHJlZmVycmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmZXJyZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFByZWZlcnJlZCgpCi0JICogQHNlZSAjaXNQcmVmZXJyZWQoKQotCSAqIEBzZWUgI3NldFByZWZlcnJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UHJlZmVycmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXJnZSBJbnRyb3NwZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lcmdlIEludHJvc3BlY3Rpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2hvdWxkIHRoZSBpbnRyb3NwZWN0aW9uIHJlc3VsdHMgYmUgbWVyZ2VkIGludG8gdGhpcyBkZWNvcmF0b3IuIElmIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHRoZSBpbnRyb3NwZWN0aW9uIHJlc3VsdHMgYXJlIGlnbm9yZWQgZm9yIHRoaXMgcGFydGljdWxhciBkZWNvcmF0b3IuIFRoaXMgaXMgYW4gaW50ZXJuYWwgZmVhdHVyZSBzaW1wbHkgdG8gYWxsb3cgZGVzaXJlZCBvdmVycmlkZSBjYXBhYmlsaXRpZXMuIEN1c3RvbWVycyB3b3VsZCB1c2UgaXQgdG8gcHJldmVudCBBTlkgaW50cm9zcGVjdGlvbi9yZWZsZWN0aW9uIGZyb20gb2NjdXJyaW5nLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXJnZSBJbnRyb3NwZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXJnZUludHJvc3BlY3Rpb24oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9NZXJnZUludHJvc3BlY3Rpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWVyZ2VJbnRyb3NwZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc01lcmdlSW50cm9zcGVjdGlvbiA8ZW0+TWVyZ2UgSW50cm9zcGVjdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVyZ2UgSW50cm9zcGVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNNZXJnZUludHJvc3BlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lcmdlSW50cm9zcGVjdGlvbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXMgRXhwbGljaXQgRW1wdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhdHRyaWJ1dGVzIGFyZSBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgbm90IHJldHJpZXZlZCBmcm9tIHRoZSBiZWFuaW5mby9yZWZsZWN0aW9uLiBDdXN0b21lcnMgc2hvdWxkIHNldCB0aGlzIGlmIHRoZXkgd2FudCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIGJlIGVtcHR5IGFuZCBub3QgbWVyZ2VkIHdpdGggdGhlIEJlYW5JbmZvIHJlc3VsdHMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRGZWF0dXJlRGVjb3JhdG9yX0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5IDxlbT5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzIEV4cGxpY2l0IEVtcHR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGxpY2l0bHkgU2V0IEJpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgYml0ZmxhZyBmb3Igd2hpY2ggYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0IGJ5IEJlYW5JbmZvL1JlZmxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBpcyBhbiBpbnRlcm5hbCBhdHRyaWJ1dGUgdGhhdCBpcyB1c2VkIGJ5IHRoZSBCZWFuSW5mbyBtYWludGFuYW5jZS4gSXQgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBsaWNpdGx5IFNldCBCaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbXBsaWNpdGx5U2V0Qml0cyhsb25nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0bHlTZXRCaXRzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JbG9uZyBnZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3IjZ2V0SW1wbGljaXRseVNldEJpdHMgPGVtPkltcGxpY2l0bHkgU2V0IEJpdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkltcGxpY2l0bHkgU2V0IEJpdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEltcGxpY2l0bHlTZXRCaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbXBsaWNpdGx5U2V0Qml0cyhsb25nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJcyB0aGlzIGRlY29yYXRvci9mZWF0dXJlIGltcGxpY2l0LiBUaGlzIG1lYW5zIGNyZWF0ZWQgYnkgSW50cm9zcGVjdGlvbi9SZWZsZWN0aW9uIGFuZCBub3QgYnkgY3VzdG9tZXIuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhbiBpbnRlcm5hbCBhdHRyaWJ1dGUgdGhhdCBpcyB1c2VkIGJ5IHRoZSBCZWFuSW5mbyBtYWludGFuYW5jZS4gSXQgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtCi0JICogQHNlZSAjc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKEltcGxpY2l0SXRlbSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0RmVhdHVyZURlY29yYXRvcl9JbXBsaWNpdERlY29yYXRvckZsYWcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbXBsaWNpdEl0ZW0gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZURlY29yYXRvciNnZXRJbXBsaWNpdERlY29yYXRvckZsYWcgPGVtPkltcGxpY2l0IERlY29yYXRvciBGbGFnPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBsaWNpdCBEZWNvcmF0b3IgRmxhZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW1wbGljaXRJdGVtCi0JICogQHNlZSAjZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSW1wbGljaXRJdGVtIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWV9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEZlYXR1cmUgYXR0cmlidXRlcy4gS2V5L3ZhbHVlIHBhaXJzLiBJZiBpdCBpcyBkZXNpcmVkIHRoYXQgdGhlIGZlYXR1cmUgYXR0cmlidXRlcyBpcyBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mby9yZWZsZWN0aW9uIHNldCBpdCwgc2V0IGF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5IHRvIHRydWUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRGZWF0dXJlRGVjb3JhdG9yX0F0dHJpYnV0ZXMoKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5IiBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZVR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwIGdldEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIGtpbmQ9Im9wZXJhdGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0ltcGxpY2l0SXRlbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0ltcGxpY2l0SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU1YjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9JbXBsaWNpdEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+SW1wbGljaXQgSXRlbTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGVudW0gaXMgYW4gaW50ZXJuYWwgZW51bS4gSXQgaXMgdXNlZCBieSBCZWFuSW5mbyBmb3IgY2FjaGUgbWFpbnRlbmFuY2UuCi0gKiA8cD4KLSAqIFRoaXMgZW51bSBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjbGllbnRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEltcGxpY2l0SXRlbSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEltcGxpY2l0SXRlbSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UIElNUExJQ0lUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTWVhbnMgdGhpcyBkZWNvcmF0b3IgaXMgbm90IGltcGxpY2l0LiBUaGF0IGlzIGl0IHdhcyBjcmVhdGVkIGJ5IGN1c3RvbWVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNOT1RfSU1QTElDSVRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9JTVBMSUNJVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTVBMSUNJVCBERUNPUkFUT1I8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY29yYXRvciBpcyBpbXBsaWNpdC4gVGhhdCBpcyBpdCB3YXMgbm90IGNyZWF0ZWQgYnkgdGhlIGN1c3RvbWVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNJTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUExJQ0lUX0RFQ09SQVRPUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTVBMSUNJVCBERUNPUkFUT1IgQU5EIEZFQVRVUkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIG1lYW5zIHRoZSBkZWNvcmF0b3IgYW5kIHRoZSBmZWF0dXJlIHdoZXJlIGltcGxpY2l0LiBUaGF0IGlzIHRoZXkgd2VyZSBub3QgY3JlYXRlZCBieSB0aGUgY3VzdG9tZXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0lNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVCBJTVBMSUNJVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT1RfSU1QTElDSVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltcGxpY2l0SXRlbSBOT1RfSU1QTElDSVRfTElURVJBTCA9IG5ldyBJbXBsaWNpdEl0ZW0oTk9UX0lNUExJQ0lULCAiTk9UX0lNUExJQ0lUIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTVBMSUNJVCBERUNPUkFUT1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU1QTElDSVRfREVDT1JBVE9SCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbXBsaWNpdEl0ZW0gSU1QTElDSVRfREVDT1JBVE9SX0xJVEVSQUwgPSBuZXcgSW1wbGljaXRJdGVtKElNUExJQ0lUX0RFQ09SQVRPUiwgIklNUExJQ0lUX0RFQ09SQVRPUiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU1QTElDSVQgREVDT1JBVE9SIEFORCBGRUFUVVJFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1wbGljaXRJdGVtIElNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMID0gbmV3IEltcGxpY2l0SXRlbShJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkUsICJJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkUiKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5JbXBsaWNpdCBJdGVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbXBsaWNpdEl0ZW1bXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSW1wbGljaXRJdGVtW10gewotCQkJTk9UX0lNUExJQ0lUX0xJVEVSQUwsCi0JCQlJTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCwKLQkJCUlNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkltcGxpY2l0IEl0ZW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkltcGxpY2l0IEl0ZW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBsaWNpdEl0ZW0gZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlJbXBsaWNpdEl0ZW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5JbXBsaWNpdCBJdGVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltcGxpY2l0SXRlbSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9UX0lNUExJQ0lUOiByZXR1cm4gTk9UX0lNUExJQ0lUX0xJVEVSQUw7Ci0JCQljYXNlIElNUExJQ0lUX0RFQ09SQVRPUjogcmV0dXJuIElNUExJQ0lUX0RFQ09SQVRPUl9MSVRFUkFMOwotCQkJY2FzZSBJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkU6IHJldHVybiBJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSW1wbGljaXRJdGVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0ltcGxpY2l0SXRlbQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0luZGV4ZWRQcm9wZXJ0eURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL0luZGV4ZWRQcm9wZXJ0eURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWEyM2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI4ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5kZXhlZCBQcm9wZXJ0eSBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBFcXVpdmFsZW50IHRvIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFJlYWRNZXRob2QgPGVtPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kIDxlbT5JbmRleGVkIFdyaXRlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciBleHRlbmRzIFByb3BlcnR5RGVjb3JhdG9yewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjaXNTZXRJbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRJbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQHNlZSAjc2V0SW5kZXhlZFJlYWRNZXRob2QoTWV0aG9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JfSW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2QgZ2V0SW5kZXhlZFJlYWRNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFJlYWRNZXRob2QgPGVtPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4ZWQgUmVhZCBNZXRob2Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2lzU2V0SW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI3Vuc2V0SW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI2dldEluZGV4ZWRSZWFkTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmRleGVkUmVhZE1ldGhvZChNZXRob2QgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yI2dldEluZGV4ZWRSZWFkTWV0aG9kIDxlbT5JbmRleGVkIFJlYWQgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEluZGV4ZWRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRJbmRleGVkUmVhZE1ldGhvZCgpCi0JICogQHNlZSAjc2V0SW5kZXhlZFJlYWRNZXRob2QoTWV0aG9kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SW5kZXhlZFJlYWRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciNnZXRJbmRleGVkUmVhZE1ldGhvZCA8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI2dldEluZGV4ZWRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRJbmRleGVkUmVhZE1ldGhvZChNZXRob2QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNpc1NldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRJbmRleGVkV3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI3NldEluZGV4ZWRXcml0ZU1ldGhvZChNZXRob2QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkV3JpdGVNZXRob2QoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2QgZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yI2dldEluZGV4ZWRXcml0ZU1ldGhvZCA8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNpc1NldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRJbmRleGVkV3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI2dldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5kZXhlZFdyaXRlTWV0aG9kKE1ldGhvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3IjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kIDxlbT5JbmRleGVkIFdyaXRlIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbmRleGVkV3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI2dldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjc2V0SW5kZXhlZFdyaXRlTWV0aG9kKE1ldGhvZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yI2dldEluZGV4ZWRXcml0ZU1ldGhvZCA8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4ZWQgV3JpdGUgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJbmRleGVkV3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI2dldEluZGV4ZWRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjc2V0SW5kZXhlZFdyaXRlTWV0aG9kKE1ldGhvZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vTWV0aG9kRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vTWV0aG9kRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTQ3ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL01ldGhvZERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogTWV0aG9kRGVjb3JhdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjggJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRXF1aXZhbGVudCB0byBNZXRob2REZWNvcmF0b3IgaW4gamF2YS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yI2lzUGFybXNFeHBsaWNpdEVtcHR5IDxlbT5QYXJtcyBFeHBsaWNpdCBFbXB0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycyA8ZW0+UGFyYW1ldGVyIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yI2dldFNlclBhcm1EZXNjIDxlbT5TZXIgUGFybSBEZXNjPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldE1ldGhvZERlY29yYXRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRGVjb3JhdG9yIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvcnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJtcyBFeHBsaWNpdCBFbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2V0IHRydWUgaWYgdGhlIHBhcm1zIGZlYXR1cmUgaXMgZXhwbGljaXRseSBzZXQgYXMgZW1wdHkgYW5kIGlzIG5vdCB0byBoYXZlIHBhcmFtZXRlcnMgbWVyZ2VkIGluIGZyb20gQmVhbkluZm8gb3IgcmVmbGVjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcm1zRXhwbGljaXRFbXB0eShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRNZXRob2REZWNvcmF0b3JfUGFybXNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Bhcm1zRXhwbGljaXRFbXB0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZERlY29yYXRvciNpc1Bhcm1zRXhwbGljaXRFbXB0eSA8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcm1zIEV4cGxpY2l0IEVtcHR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1Bhcm1zRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFybXNFeHBsaWNpdEVtcHR5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW1ldGVyIERlc2NyaXB0b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRGVzY3JpcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMgbGlzdC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIGlzIGEgZGVyaXZlZCBzZXR0aW5nLCB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBub3RpZnkgb3V0IGNoYW5nZXMgdG8gaXQuIFRvIGhlcmUgY2hhbmdlcyB0byBpdCwgbGlzdGVuIG9uICJzZXJQYXJtRGVzYyIgbm90aWZpY2F0aW9ucyBpbnN0ZWFkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRGVzY3JpcHRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldE1ldGhvZERlY29yYXRvcl9QYXJhbWV0ZXJEZXNjcmlwdG9ycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3IiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXIgUGFybSBEZXNjPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlBhcmFtZXRlckRlY29yYXRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXIgUGFybSBEZXNjPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyBhIHByaXZhdGUgZmVhdHVyZS4gSXQgaXMgdXNlZCBpbnRlcm5hbGx5IG9ubHkuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXIgUGFybSBEZXNjPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRNZXRob2REZWNvcmF0b3JfU2VyUGFybURlc2MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U2VyUGFybURlc2MoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL01ldGhvZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vTWV0aG9kUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0M2EyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vTWV0aG9kUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogTWV0aG9kUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOCAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUHJveHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIG9mIGEgamF2YSBNZXRob2QuIEl0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIG1ldGhvZCBidXQgZG9lc24ndCBkdXBsaWNhdGUgdGhlIGludGVyZmFjZSBmb3IgaXQuCi0gKiA8cD4KLSAqIE1ldGhvZFByb3hpZXMgd2lsbCBiZSBpbiB0aGUgZUJlaGF2aW9ycyBzZXR0aW5nIGZvciBhbnkgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgSmF2YUNsYXNzIG1ldGhvZHMgc2V0dGluZyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBkdXBsaWNhdGVkLgotICogPHA+Ci0gKiBNZXRob2RQcm94aWVzIHdvdWxkIGFsc28gaGF2ZSBNZXRob2REZWNvcmF0b3JzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eSNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRNZXRob2RQcm94eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kUHJveHkgZXh0ZW5kcyBFT3BlcmF0aW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kKE1ldGhvZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0TWV0aG9kUHJveHlfTWV0aG9kKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZCBnZXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eSNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZChNZXRob2QgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vUGFyYW1ldGVyRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vUGFyYW1ldGVyRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGU4YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL1BhcmFtZXRlckRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBQYXJhbWV0ZXJEZWNvcmF0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOCAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+UGFyYW1ldGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmFtZXRlcihKYXZhUGFyYW1ldGVyIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL1Byb3BlcnR5RGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vUHJvcGVydHlEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmYTg0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vUHJvcGVydHlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IFByb3BlcnR5RGVjb3JhdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEwICQgICREYXRlOiAyMDA1LzA5LzE1IDIwOjA5OjUxICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBFcXVpdmFsZW50IHRvIFByb3BlcnR5RGVjb3JhdG9yIGluIGphdmEuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQm91bmQgPGVtPkJvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNDb25zdHJhaW5lZCA8ZW0+Q29uc3RyYWluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0Rlc2lnblRpbWUgPGVtPkRlc2lnbiBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNBbHdheXNJbmNvbXBhdGlibGUgPGVtPkFsd2F5cyBJbmNvbXBhdGlibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRGaWx0ZXJGbGFncyA8ZW0+RmlsdGVyIEZsYWdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNGaWVsZFJlYWRPbmx5IDxlbT5GaWVsZCBSZWFkIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRQcm9wZXJ0eUVkaXRvckNsYXNzIDxlbT5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRSZWFkTWV0aG9kIDxlbT5SZWFkIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFdyaXRlTWV0aG9kIDxlbT5Xcml0ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRGaWVsZCA8ZW0+RmllbGQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0UHJvcGVydHlEZWNvcmF0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5RGVjb3JhdG9yIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvcnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Qm91bmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Qm91bmQoKQotCSAqIEBzZWUgI3Vuc2V0Qm91bmQoKQotCSAqIEBzZWUgI3NldEJvdW5kKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldFByb3BlcnR5RGVjb3JhdG9yX0JvdW5kKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0JvdW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNCb3VuZCA8ZW0+Qm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJvdW5kKCkKLQkgKiBAc2VlICN1bnNldEJvdW5kKCkKLQkgKiBAc2VlICNpc0JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb3VuZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQm91bmQgPGVtPkJvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJvdW5kKCkKLQkgKiBAc2VlICNpc0JvdW5kKCkKLQkgKiBAc2VlICNzZXRCb3VuZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Qm91bmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQm91bmQgPGVtPkJvdW5kPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3VuZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Qm91bmQoKQotCSAqIEBzZWUgI2lzQm91bmQoKQotCSAqIEBzZWUgI3NldEJvdW5kKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCb3VuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uc3RyYWluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnN0cmFpbmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbnN0cmFpbmVkKCkKLQkgKiBAc2VlICN1bnNldENvbnN0cmFpbmVkKCkKLQkgKiBAc2VlICNzZXRDb25zdHJhaW5lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQcm9wZXJ0eURlY29yYXRvcl9Db25zdHJhaW5lZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDb25zdHJhaW5lZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQ29uc3RyYWluZWQgPGVtPkNvbnN0cmFpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJhaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb25zdHJhaW5lZCgpCi0JICogQHNlZSAjdW5zZXRDb25zdHJhaW5lZCgpCi0JICogQHNlZSAjaXNDb25zdHJhaW5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uc3RyYWluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0NvbnN0cmFpbmVkIDxlbT5Db25zdHJhaW5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb25zdHJhaW5lZCgpCi0JICogQHNlZSAjaXNDb25zdHJhaW5lZCgpCi0JICogQHNlZSAjc2V0Q29uc3RyYWluZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENvbnN0cmFpbmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0NvbnN0cmFpbmVkIDxlbT5Db25zdHJhaW5lZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWluZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvbnN0cmFpbmVkKCkKLQkgKiBAc2VlICNpc0NvbnN0cmFpbmVkKCkKLQkgKiBAc2VlICNzZXRDb25zdHJhaW5lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29uc3RyYWluZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2lnbiBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNpZ24gVGltZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiBub3Qgc2V0LCB0aGVuIG5vcm1hbCBkZWZhdWx0IHByb2Nlc3NpbmcuCi0JICogCi0JICogSWYgc2V0IHRydWUsIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBhIGRlc2lnbiB0aW1lIHByb3BlcnR5LiBUaGlzIG1lYW5zIGl0IHdpbGwgc2hvdyB1cCBpbiB0aGUgcHJvcGVydHkgc2hlZXQsIGJ1dCBpdCB3b24ndCBiZSBhYmxlIHRvIGJlIGNvbm5lY3RlZCB0byBhdCBydW50aW1lLiBJdCBtYXkgbm90IGV2ZW4gYmUgYSB0cnVlIGJlYW4gcHJvcGVydHkgYnV0IGluc3RlYWQgdGhlIGJ1aWxkZXIgd2lsbCBrbm93IGhvdyB0byBoYW5kbGUgaXQuCi0JICogCi0JICogSWYgc2V0IGZhbHNlLCB0aGVuIHRoaXMgcHJvcGVydHkgd2lsbCBub3Qgc2hvdyB1cCBvbiB0aGUgcHJvcGVydHkgc2hlZXQsIGJ1dCB3aWxsIGJlIGFibGUgdG8gYmUgY29ubmVjdGVkIHRvIGZvciBydW50aW1lLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNpZ24gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZXNpZ25UaW1lKCkKLQkgKiBAc2VlICN1bnNldERlc2lnblRpbWUoKQotCSAqIEBzZWUgI3NldERlc2lnblRpbWUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0UHJvcGVydHlEZWNvcmF0b3JfRGVzaWduVGltZSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNEZXNpZ25UaW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNEZXNpZ25UaW1lIDxlbT5EZXNpZ24gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzaWduIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVzaWduVGltZSgpCi0JICogQHNlZSAjdW5zZXREZXNpZ25UaW1lKCkKLQkgKiBAc2VlICNpc0Rlc2lnblRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2lnblRpbWUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0Rlc2lnblRpbWUgPGVtPkRlc2lnbiBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldERlc2lnblRpbWUoKQotCSAqIEBzZWUgI2lzRGVzaWduVGltZSgpCi0JICogQHNlZSAjc2V0RGVzaWduVGltZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVzaWduVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNEZXNpZ25UaW1lIDxlbT5EZXNpZ24gVGltZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzaWduIFRpbWU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERlc2lnblRpbWUoKQotCSAqIEBzZWUgI2lzRGVzaWduVGltZSgpCi0JICogQHNlZSAjc2V0RGVzaWduVGltZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVzaWduVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx3YXlzIEluY29tcGF0aWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWx3YXlzIEluY29tcGF0aWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiBzZXQgdHJ1ZSwgdGhlbiB3aGVuIG11bHRpcGxlIG9iamVjdHMgYXJlIHNlbGVjdGVkLCB0aGlzIHByb3BlcnR5IGlzIGFsd2F5cyBpbmNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyLiBTbyBpbiB0aGlzIGNhc2UgdGhlIHByb3BlcnR5IHdpbGwgbm90IHNob3cgdXAgb24gdGhlIHByb3BlcnR5IHNoZWV0IGlmIG1vcmUgdGhhbiBvbmUgb2JqZWN0IGhhcyBiZWVuIHNlbGVjdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHdheXMgSW5jb21wYXRpYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHdheXNJbmNvbXBhdGlibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UjZ2V0UHJvcGVydHlEZWNvcmF0b3JfQWx3YXlzSW5jb21wYXRpYmxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Fsd2F5c0luY29tcGF0aWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2lzQWx3YXlzSW5jb21wYXRpYmxlIDxlbT5BbHdheXMgSW5jb21wYXRpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbHdheXMgSW5jb21wYXRpYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Fsd2F5c0luY29tcGF0aWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWx3YXlzSW5jb21wYXRpYmxlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsdGVyIEZsYWdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaWx0ZXIgRmxhZ3M8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWx0ZXIgRmxhZ3M8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldFByb3BlcnR5RGVjb3JhdG9yX0ZpbHRlckZsYWdzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RmlsdGVyRmxhZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIFJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSXMgdGhpcyBmaWVsZCByZWFkLW9ubHkgKGkuZS4gaXMgYSAiZmluYWwiIGZpZWxkKS4gVGhpcyBpcyBvbmx5IHJlZmVyZW5jZWQgaWYgdGhlIGZpZWxkIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRSZWFkT25seShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZFJlYWRPbmx5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0ZpZWxkUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc0ZpZWxkUmVhZE9ubHkgPGVtPkZpZWxkIFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgUmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZpZWxkUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkUmVhZE9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnR5IEVkaXRvciBDbGFzczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb3BlcnR5RWRpdG9yQ2xhc3MoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQcm9wZXJ0eURlY29yYXRvcl9Qcm9wZXJ0eUVkaXRvckNsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRQcm9wZXJ0eUVkaXRvckNsYXNzIDxlbT5Qcm9wZXJ0eSBFZGl0b3IgQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnR5IEVkaXRvciBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvcGVydHlFZGl0b3JDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBNZXRob2Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNpc1NldFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI3Vuc2V0UmVhZE1ldGhvZCgpCi0JICogQHNlZSAjc2V0UmVhZE1ldGhvZChNZXRob2QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlI2dldFByb3BlcnR5RGVjb3JhdG9yX1JlYWRNZXRob2QoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2QgZ2V0UmVhZE1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFJlYWRNZXRob2QgPGVtPlJlYWQgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjaXNTZXRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICN1bnNldFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI2dldFJlYWRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlYWRNZXRob2QoTWV0aG9kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFJlYWRNZXRob2QgPGVtPlJlYWQgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI2dldFJlYWRNZXRob2QoKQotCSAqIEBzZWUgI3NldFJlYWRNZXRob2QoTWV0aG9kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVhZE1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0UmVhZE1ldGhvZCA8ZW0+UmVhZCBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRSZWFkTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRSZWFkTWV0aG9kKE1ldGhvZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlYWRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldyaXRlIE1ldGhvZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3JpdGUgTWV0aG9kPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldyaXRlIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjaXNTZXRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjc2V0V3JpdGVNZXRob2QoTWV0aG9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQcm9wZXJ0eURlY29yYXRvcl9Xcml0ZU1ldGhvZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZCBnZXRXcml0ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFdyaXRlTWV0aG9kIDxlbT5Xcml0ZSBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldyaXRlIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjaXNTZXRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0V3JpdGVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdyaXRlTWV0aG9kKE1ldGhvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNnZXRXcml0ZU1ldGhvZCA8ZW0+V3JpdGUgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFdyaXRlTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRXcml0ZU1ldGhvZCgpCi0JICogQHNlZSAjc2V0V3JpdGVNZXRob2QoTWV0aG9kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0V3JpdGVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldFdyaXRlTWV0aG9kIDxlbT5Xcml0ZSBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldyaXRlIE1ldGhvZDwvZW0+JyByZWZlcmVuY2UgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V3JpdGVNZXRob2QoKQotCSAqIEBzZWUgI2dldFdyaXRlTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRXcml0ZU1ldGhvZChNZXRob2QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRXcml0ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIHRoaXMgaXMgc2V0LCB0aGVuIHRoaXMgcHJvcGVydHkgaXMgYSBmaWVsZCBhbmQgbm90IGEgZ2V0dGVyL3NldHRlciBwcm9wZXJ0eS4gVGhpcyBpcyBhbiBleHRlbnNpb24gdGhhdCB0aGUgVmlzdWFsIEVkaXRvciB1c2VzIHRvIHRoZSBCZWFuSW5mbyBtb2RlbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2lzU2V0RmllbGQoKQotCSAqIEBzZWUgI3Vuc2V0RmllbGQoKQotCSAqIEBzZWUgI3NldEZpZWxkKEZpZWxkKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZpZWxkIGdldEZpZWxkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjaXNTZXRGaWVsZCgpCi0JICogQHNlZSAjdW5zZXRGaWVsZCgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkKEZpZWxkIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaWVsZCgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBzZWUgI3NldEZpZWxkKEZpZWxkKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fScgcmVmZXJlbmNlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQ8L2VtPicgcmVmZXJlbmNlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEZpZWxkKCkKLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQHNlZSAjc2V0RmllbGQoRmllbGQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRGaWVsZCgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHZXQgdGhlIHByb3BlcnR5IHR5cGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzc2lmaWVyIGdldFByb3BlcnR5VHlwZSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIHByb3BlcnR5IHR5cGUgaXMgbm90IHBlcnNpc3RlZCBpZiB0aGlzIGNsYXNzIGlzIHNlcmlhbGl6ZWQgaW50byBhbiBYTUkgZmlsZS4gTm9yIGlzIAotCSAqIGl0IGEgcHJvcGVydHkgdGhhdCBjYW4gYmUgc2V0IGZyb20gYW4gWE1JIGZpbGUuIEl0IGlzIGFuIG9wZXJhdGlvbi4gSXQgaXMgdXNlZCBieQotCSAqIGNsaWVudHMgd2hpY2ggd2FudCBhIFByb3BlcnR5RGVjb3JhdG9yIHRoYXQgaXMgbm90IHBhcnQgb2YgYSBCZWFuSW5mbyBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTZXQgdGhlIHByb3BlcnR5IHR5cGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb3BlcnR5VHlwZShFQ2xhc3NpZmllciBwcm9wZXJ0eVR5cGUpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuIGZvciB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgd3JpdGVhYmxlIG9yIG5vdAotCSAqIEl0IGNvdWxkIGhhdmUgYSB3cml0ZSBtZXRob2Qgb3IgaXQgY291bGQgaGF2ZSBhIGZpZWxkIChlLmcuIGphdmEuYXd0Lkluc2V0cy50b3ApCi0JICovCi0JYm9vbGVhbiBpc1dyaXRlYWJsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuIGZvciB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgcmVhZGFibGUgb3Igbm90Ci0JICogSXQgY291bGQgaGF2ZSBhIHJlYWQgbWV0aG9kIG9yIGl0IGNvdWxkIGhhdmUgYSBmaWVsZCAoZS5nLiBqYXZhLmF3dC5JbnNldHMudG9wKQotCSAqLwotCWJvb2xlYW4gaXNSZWFkYWJsZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ5NzExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlRST1NQRUNUX0ZBSUxFRF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvQ2xhc3NBZGFwdGVyX0NsYXNzTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9OYXR1cmVfSW52YWxpZFByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXJfU3RhcnRCZWFuaW5mb1JlZ2lzdHJ5OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMThjY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDUvMTEgMjI6NDE6MTcgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuQmVhbmluZm9QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBoYW5kbGluZyB0aGUgQmVhbkluZm8gZGVjb3JhdG9ycyB3aXRoIHJlc3BlY3QgdG8gdGhlIG92ZXJyaWRlcyAoZXhwbGljaXQgc2V0dGluZ3MpIHZzLiBpbnRyb3NwZWN0ZWQvcmVmbGVjdGVkIChpbXBsaWNpdAotICogc2V0dGluZ3MpIEl0IGhhbmRsZXMgdGhlIHRyYW5zbWlzc2lvbiBvZiBkYXRhIGZyb20gdGhlIFZNIGZvciBpbnRyb3NwZWN0aW9uLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eSB7Ci0KLQkvKioKLQkgKiBDbGVhciBvdXQgdGhlIGltcGxpY2l0IHNldHRpbmdzIGZvciBGZWF0dXJlRGVjb3JhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihGZWF0dXJlRGVjb3JhdG9yIGRlY29yKSB7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfRElTUExBWU5BTUVfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldERpc3BsYXlOYW1lKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfU0hPUlRERVNDX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfQ0FURUdPUllfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0NhdGVnb3J5KCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0VYUEVSVF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0RXhwZXJ0KCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfSElEREVOX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRIaWRkZW4oKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9QUkVGRVJSRURfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldFByZWZlcnJlZCgpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0FUVFJJQlVURVNfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0F0dHJpYnV0ZXMoKSk7Ci0JCWRlY29yCi0JCQkJLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MKLQkJCQkJCSYgfihGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0RJU1BMQVlOQU1FX0lNUExJQ0lUIHwgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9TSE9SVERFU0NfSU1QTElDSVQKLQkJCQkJCQkJfCBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0NBVEVHT1JZX0lNUExJQ0lUIHwgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9FWFBFUlRfSU1QTElDSVQKLQkJCQkJCQkJfCBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0hJRERFTl9JTVBMSUNJVCB8IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfUFJFRkVSUkVEX0lNUExJQ0lUIHwgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9BVFRSSUJVVEVTX0lNUExJQ0lUKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSBpbXBsaWNpdCBzZXR0aW5ncyBmb3IgQmVhbkRlY29yYXRvcgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihCZWFuRGVjb3JhdG9yIGRlY29yKSB7Ci0JCWNsZWFyKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEJlYW5EZWNvcmF0b3JJbXBsLkJFQU5fQ1VTVE9NSVpFUl9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfQ3VzdG9taXplckNsYXNzKCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9QUk9QRVJUSUVTX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRNZXJnZVN1cGVyUHJvcGVydGllcygpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9PUEVSQVRJT05TX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRNZXJnZVN1cGVyTWV0aG9kcygpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9FVkVOVFNfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldE1lcmdlU3VwZXJFdmVudHMoKTsKLQkJaWYgKGRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpKSkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpKTsgLy8gSnVzdCBjbGVhciB0aGVtLiBUaGlzIGlzIG91ciBhdHRyaWJ1dGUuIEl0IHNob3VsZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBub3QgYmUgc2V0IG92ZXJyaWRlcy4KLQkJaWYgKGRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKSkpCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkpOyAvLyBKdXN0IGNsZWFyIHRoZW0uIFRoaXMgaXMgb3VyIGF0dHJpYnV0ZS4gSXQgc2hvdWxkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIG5vdCBiZSBzZXQgb3ZlcnJpZGVzLgotCQlpZiAoZGVjb3IuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRFdmVudE5hbWVzKCkpKQotCQkJZGVjb3IuZVVuc2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRFdmVudE5hbWVzKCkpOyAvLyBKdXN0IGNsZWFyIHRoZW0uIFRoaXMgaXMgb3VyIGF0dHJpYnV0ZS4gSXQgc2hvdWxkIG5vdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZSBzZXQgb3ZlcnJpZGVzLgotCi0JCWRlY29yLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MKLQkJCQkmIH4oQmVhbkRlY29yYXRvckltcGwuQkVBTl9DVVNUT01JWkVSX0lNUExJQ0lUIHwgQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfUFJPUEVSVElFU19JTVBMSUNJVAotCQkJCQkJfCBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9PUEVSQVRJT05TX0lNUExJQ0lUIHwgQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfRVZFTlRTX0lNUExJQ0lUKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSBpbXBsaWNpdCBzZXR0aW5ncyBvZiB0aGUgUHJvcGVydHlEZWNvcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGRlY29yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKFByb3BlcnR5RGVjb3JhdG9yIGRlY29yKSB7Ci0JCWNsZWFyKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9FRElUT1JfQ0xBU1NfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9Qcm9wZXJ0eUVkaXRvckNsYXNzKCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfUkVBRE1FVEhPRF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0UmVhZE1ldGhvZCgpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfV1JJVEVNRVRIT0RfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldFdyaXRlTWV0aG9kKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9GSUVMRF9JTVBMSUNJVCkgIT0gMCkgewotCQkJZGVjb3IudW5zZXRGaWVsZCgpOwkJCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZCgpKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfQk9VTkRfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldEJvdW5kKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9DT05TVFJBSU5FRF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0Q29uc3RyYWluZWQoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0RFU0lHTlRJTUVfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldERlc2lnblRpbWUoKTsKLQkJZGVjb3Iuc2V0SW1wbGljaXRseVNldEJpdHMoaW1wbGljaXRTZXR0aW5ncwotCQkJCSYgfihQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfRURJVE9SX0NMQVNTX0lNUExJQ0lUIHwgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX1JFQURNRVRIT0RfSU1QTElDSVQKLQkJCQkJCXwgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX1dSSVRFTUVUSE9EX0lNUExJQ0lUIHwgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0JPVU5EX0lNUExJQ0lUCi0JCQkJCQl8IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9DT05TVFJBSU5FRF9JTVBMSUNJVCB8IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9ERVNJR05USU1FX0lNUExJQ0lUKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSBpbXBsaWNpdCBzZXR0aW5ncyBvZiB0aGUgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgZGVjb3IpIHsKLQkJY2xlYXIoKFByb3BlcnR5RGVjb3JhdG9yKSBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuSU5ERVhFRF9SRUFETUVUSE9EX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IudW5zZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsLklOREVYRURfV1JJVEVNRVRIT0RfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzCi0JCQkJJiB+KEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuSU5ERVhFRF9SRUFETUVUSE9EX0lNUExJQ0lUIHwgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5JTkRFWEVEX1dSSVRFTUVUSE9EX0lNUExJQ0lUKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG1ldGhvZCBkZWNvcmF0b3Igb2YgYW55IGltcGxpY2l0IHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihNZXRob2REZWNvcmF0b3IgZGVjb3IpIHsKLQkJY2xlYXIoKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yKTsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJLy8gRm9yIGVhY2ggc2V0dGluZywgc2VlIGlmIGl0IHdhcyBpbXBsaWNpdGx5IHNldCwgYW5kIGlmIGl0IHdhcywgdGhlbiB1bnNldCBpdC4KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgKE1ldGhvZERlY29yYXRvckltcGwuTUVUSE9EX1BBUkFNRVRFUlNfSU1QTElDSVQgfCBNZXRob2REZWNvcmF0b3JJbXBsLk1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQpKSAhPSAwKQotCQkJZGVjb3IuZVVuc2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRGVjb3JhdG9yX1NlclBhcm1EZXNjKCkpOwotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzCi0JCQkJJiB+KE1ldGhvZERlY29yYXRvckltcGwuTUVUSE9EX1BBUkFNRVRFUlNfSU1QTElDSVQgfCBNZXRob2REZWNvcmF0b3JJbXBsLk1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgZXZlbnQgc2V0IGRlY29yYXRvciBvZiBhbnkgaW1wbGljaXQgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIGRlY29yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKEV2ZW50U2V0RGVjb3JhdG9yIGRlY29yKSB7Ci0JCWNsZWFyKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCS8vIEZvciBlYWNoIHNldHRpbmcsIHNlZSBpZiBpdCB3YXMgaW1wbGljaXRseSBzZXQsIGFuZCBpZiBpdCB3YXMsIHRoZW4gdW5zZXQgaXQuCi0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BRERMSVNURU5FUk1FVEhPRF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfQURBUFRFUkNMQVNTX0lNUExJQ0lUKSAhPSAwKQotCQkJZGVjb3IuZVVuc2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfRXZlbnRBZGFwdGVyQ2xhc3MoKSk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIChFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfTElTVEVORVJNRVRIT0RTX0lNUExJQ0lUIHwgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSTUVUSE9EU19ERUZBVUxUKSkgIT0gMCkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX1Nlckxpc3RNdGhkKCkpOwotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci5lVW5zZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9SZW1vdmVMaXN0ZW5lck1ldGhvZCgpKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0RFRkFVTFRFVkVOVFNFVF9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLnVuc2V0SW5EZWZhdWx0RXZlbnRTZXQoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX1VOSUNBU1RfSU1QTElDSVQpICE9IDApCi0JCQlkZWNvci51bnNldFVuaWNhc3QoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVCkgIT0gMCkKLQkJCWRlY29yLmVVbnNldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyVHlwZSgpKTsKLQotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzCi0JCQkJJiB+KEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BRERMSVNURU5FUk1FVEhPRF9JTVBMSUNJVCB8IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BREFQVEVSQ0xBU1NfSU1QTElDSVQKLQkJCQkJCXwgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSTUVUSE9EU19JTVBMSUNJVCB8IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9MSVNURU5FUk1FVEhPRFNfREVGQVVMVAotCQkJCQkJfCBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQgfCBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfREVGQVVMVEVWRU5UU0VUX0lNUExJQ0lUCi0JCQkJCQl8IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9VTklDQVNUX0lNUExJQ0lUIHwgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVCkpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGludHJvc3BlY3QoSUJlYW5Qcm94eSBtb2RlbEJlYW5pbmZvUHJveHksIEludHJvc3BlY3RDYWxsQmFjayBjYWxsYmFjaykgewotCQlQcm94eUludHJvc3BlY3RDYWxsQmFjayBjYiA9IG5ldyBQcm94eUludHJvc3BlY3RDYWxsQmFjayhjYWxsYmFjayk7Ci0JCW1vZGVsQmVhbmluZm9Qcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldENhbGxiYWNrUmVnaXN0cnkoKS5yZWdpc3RlckNhbGxiYWNrKG1vZGVsQmVhbmluZm9Qcm94eSwgY2IpOwotCQl0cnkgewotCQkJQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMobW9kZWxCZWFuaW5mb1Byb3h5LmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkpLmdldFNlbmRCZWFuSW5mb1Byb3h5KCkKLQkJCQkJLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhtb2RlbEJlYW5pbmZvUHJveHkpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWxCZWFuaW5mb1Byb3h5LmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpLmRlcmVnaXN0ZXJDYWxsYmFjayhtb2RlbEJlYW5pbmZvUHJveHkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNhbGwgYmFjayBpcyBmb3IgZWFjaCByZXF1ZXN0ZWQgdHlwZSBvZiByZWNvcmQuIEl0IGFsbG93cyB0aGUgY2FsbGVlIHRvIHByb2Nlc3MgdGhpcyByZWNvcmQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJbnRyb3NwZWN0Q2FsbEJhY2sgewotCi0JCS8qKgotCQkgKiBQcm9jZXNzIHRoZSBCZWFuRGVjb3JhdG9yUmVjb3JkLiBUaGUgY2FsbGVlIGNhbiBkZWNpZGUgd2hhdCBuZWVkcyB0byBiZSBkb25lIHdpdGggdGhpcyByZWNvcmQuIEl0IHdvdWxkIHJldHVybiB0aGUgQmVhbmREZWNvcmF0b3IgdGhhdCBuZWVkcwotCQkgKiB0byBoYXZlIHRoZSByZWNvcmQgYXBwbGllZCB0by4gSWYgaXQgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSByZWNvcmQgd2lsbCBiZSBpZ25vcmVkLgotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gQmVhbkRlY29yYXRvciB0byBiZSBhcHBsaWVkIHRvLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiByZWNvcmQgaXMgdG8gYmUgaWdub3JlZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIEJlYW5EZWNvcmF0b3IgcHJvY2VzcyhCZWFuUmVjb3JkIHJlY29yZCk7Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIFByb3BlcnR5UmVjb3JkLiBUaGUgY2FsbGVlIGNhbiBkZWNpZGUgd2hhdCBuZWVkcyB0byBiZSBkb25lIHdpdGggdGhpcyByZWNvcmQuIEl0IHdvdWxkIHJldHVybiB0aGUgUHJvcGVydHlEZWNvcmF0b3IgdGhhdCBuZWVkcwotCQkgKiB0byBoYXZlIHRoZSByZWNvcmQgYXBwbGllZCB0by4gSWYgaXQgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSByZWNvcmQgd2lsbCBiZSBpZ25vcmVkLgotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gUHJvcGVydHlEZWNvcmF0b3IgdG8gYmUgYXBwbGllZCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVjb3JkIGlzIHRvIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBQcm9wZXJ0eURlY29yYXRvciBwcm9jZXNzKFByb3BlcnR5UmVjb3JkIHJlY29yZCk7Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIEluZGV4ZWRQcm9wZXJ0eVJlY29yZC4gVGhlIGNhbGxlZSBjYW4gZGVjaWRlIHdoYXQgbmVlZHMgdG8gYmUgZG9uZSB3aXRoIHRoaXMgcmVjb3JkLiBJdCB3b3VsZCByZXR1cm4gdGhlCi0JCSAqIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciB0aGF0IG5lZWRzIHRvIGhhdmUgdGhlIHJlY29yZCBhcHBsaWVkIHRvLiBJZiBpdCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHJlY29yZCB3aWxsIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gUHJvcGVydHlEZWNvcmF0b3IgdG8gYmUgYXBwbGllZCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVjb3JkIGlzIHRvIGJlIGlnbm9yZWQuIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHN0cmFpZ2h0Ci0JCSAqICAgICAgICAgUHJvcGVydHlEZWNvcmF0b3IgY2FuIGJlIHJldHVybmVkIGluc3RlYWQgKGluIHRoZSBjYXNlIHRoYXQgaXQgd2FzIGV4cGxpY3RseSBzZXQgYnkgb3ZlcnJpZGVzIGFzIGEgcHJvcGVydHkgYnV0IGJlYW5pbmZvIHRoaW5rcyBpdAotCQkgKiAgICAgICAgIGlzIGFuIGluZGV4LiBUaGlzIGNhbiBiZSBoYW5kbGVkIGJ5IGl0IHdpbGwgb25seSBzZXQgdGhlIFByb3BlcnR5UmVjb3JkIHBhcnQuIEl0IG5vcm1hbGx5IHNob3VsZCBiZSBhbiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IKLQkJICogICAgICAgICByZXR1cm5lZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIFByb3BlcnR5RGVjb3JhdG9yIHByb2Nlc3MoSW5kZXhlZFByb3BlcnR5UmVjb3JkIHJlY29yZCk7Ci0KLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIE1ldGhvZFJlY29yZC4gVGhlIGNhbGxlZSBjYW4gZGVjaWRlIHdoYXQgbmVlZHMgdG8gYmUgZG9uZSB3aXRoIHRoaXMgcmVjb3JkLiBJdCB3b3VsZCByZXR1cm4gdGhlIE1ldGhvZERlY29yYXRvciB0aGF0IG5lZWRzIHRvCi0JCSAqIGhhdmUgdGhlIHJlY29yZCBhcHBsaWVkIHRvLiBJZiBpdCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHJlY29yZCB3aWxsIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gTWV0aG9kRGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgdG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHJlY29yZCBpcyB0byBiZSBpZ25vcmVkLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCi0JCXB1YmxpYyBNZXRob2REZWNvcmF0b3IgcHJvY2VzcyhNZXRob2RSZWNvcmQgcmVjb3JkKTsKLQotCQkvKioKLQkJICogUHJvY2VzcyB0aGUgRXZlbnRSZWNvcmQuIFRoZSBjYWxsZWUgY2FuIGRlY2lkZSB3aGF0IG5lZWRzIHRvIGJlIGRvbmUgd2l0aCB0aGlzIHJlY29yZC4gSXQgd291bGQgcmV0dXJuIHRoZSBFdmVudFNldERlY29yYXRvciB0aGF0IG5lZWRzIHRvCi0JCSAqIGhhdmUgdGhlIHJlY29yZCBhcHBsaWVkIHRvLiBJZiBpdCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHJlY29yZCB3aWxsIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiA8cD4KLQkJICogTm90ZTogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBmcm9tIHRoYXQgd2hpY2ggaW5pdGlhdGVkIHRoZSByZXF1ZXN0LiBUaGVyZWZvciBiZSBjYXJlZnVsIHdpdGggYW55IGxvY2tzIGJlY2F1c2UgeW91IG1heQotCQkgKiBoYXZlIHRoZW0gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVjb3JkCi0JCSAqIEByZXR1cm4gRXZlbnRTZXREZWNvcmF0b3IgdG8gYmUgYXBwbGllZCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVjb3JkIGlzIHRvIGJlIGlnbm9yZWQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0KLQkJcHVibGljIEV2ZW50U2V0RGVjb3JhdG9yIHByb2Nlc3MoRXZlbnRTZXRSZWNvcmQgcmVjb3JkKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eUludHJvc3BlY3RDYWxsQmFjayBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0KLQkJcHJpdmF0ZSBJbnRyb3NwZWN0Q2FsbEJhY2sgaW50cm9zcGVjdENhbGxiYWNrOwotCi0JCXB1YmxpYyBQcm94eUludHJvc3BlY3RDYWxsQmFjayhJbnRyb3NwZWN0Q2FsbEJhY2sgaW50cm9zcGVjdENhbGxiYWNrKSB7Ci0JCQl0aGlzLmludHJvc3BlY3RDYWxsYmFjayA9IGludHJvc3BlY3RDYWxsYmFjazsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2soaW50LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgSUJlYW5Qcm94eSBwYXJtKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTm90IHVzZWQuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrKGludCwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIE9iamVjdCBwYXJtKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTm90IHVzZWQuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrKGludCwgamF2YS5sYW5nLk9iamVjdFtdKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0W10gcGFybXMpIHsKLQkJCXJldHVybiBudWxsOyAvLyBOb3QgdXNlZC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBqYXZhLmlvLklucHV0U3RyZWFtKQotCQkgKi8KLQkJcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGlzKSB7Ci0JCQlPYmplY3RJbnB1dFN0cmVhbSBvaXM7Ci0JCQl0cnkgewotCQkJCW9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpcyk7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJaW50IGNtZElkID0gb2lzLnJlYWRJbnQoKTsKLQkJCQkJc3dpdGNoIChjbWRJZCkgewotCQkJCQkJY2FzZSBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkJFQU5fREVDT1JBVE9SX1NFTlQ6Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJQmVhblJlY29yZCBiciA9IChCZWFuUmVjb3JkKSBvaXMucmVhZE9iamVjdCgpOwotCQkJCQkJCQlCZWFuRGVjb3JhdG9yIGJkID0gaW50cm9zcGVjdENhbGxiYWNrLnByb2Nlc3MoYnIpOwotCQkJCQkJCQlpZiAoYmQgIT0gbnVsbCkgewotCQkJCQkJCQkJY2xlYXIoYmQpOwotCQkJCQkJCQkJYXBwbHlSZWNvcmQoYmQsIGJyKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5QUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQ6Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW50IHByb3BDb3VudCA9IG9pcy5yZWFkSW50KCk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcENvdW50OyBpKyspIHsKLQkJCQkJCQkJCVByb3BlcnR5UmVjb3JkIHByID0gKFByb3BlcnR5UmVjb3JkKSBvaXMucmVhZE9iamVjdCgpOwotCQkJCQkJCQkJaWYgKHByLmdldENsYXNzKCkgPT0gSW5kZXhlZFByb3BlcnR5UmVjb3JkLmNsYXNzKSB7Ci0JCQkJCQkJCQkJSW5kZXhlZFByb3BlcnR5UmVjb3JkIGlwciA9IChJbmRleGVkUHJvcGVydHlSZWNvcmQpIHByOwotCQkJCQkJCQkJCVByb3BlcnR5RGVjb3JhdG9yIGlwID0gaW50cm9zcGVjdENhbGxiYWNrLnByb2Nlc3MoaXByKTsKLQkJCQkJCQkJCQlpZiAoaXAgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkvLyBJdCBhY3R1YWxseSBjb3VsZCBiZSBlaXRoZXIgYSBwcm9wZXJ0eSBkZWNvcmF0b3Igb3IgYW4gaW5kZXhlZCBwcm9wZXJ0eSBkZWNvcmF0b3IuIFRoaXMgY291bGQgaGFwcGVuCi0JCQkJCQkJCQkJCS8vIGJlY2F1c2UgdGhlIG92ZXJyaWRlcyBmaWxlIGhhcyBleHBsaWNpdGx5IGRlY2xhcmVkIGEgUHJvcGVydHlEZWNvcmF0b3IsIHNvIHdlIGNhbid0IGNoYW5nZSBpdCB0byBhbgotCQkJCQkJCQkJCQkvLyBJbmRleGVkLgotCQkJCQkJCQkJCQkvLyBTbyBpbiB0aGF0IGNhc2Ugd2UgY2FuIG9ubHkgZmlsbCB0aGUgcHJvcGVydHkgcGFydC4KLQkJCQkJCQkJCQkJaWYgKGlwLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUikKLQkJCQkJCQkJCQkJCWFwcGx5UmVjb3JkKChJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpIGlwLCBpcHIpOwotCQkJCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJCQlhcHBseVJlY29yZChpcCwgcHIpOyAvLyBJdCB3YXMgZm9yY2VkIHRvIGJlIGEgcHJvcGVydHkgYW5kIG5vdCBpbmRleGVkLgotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJUHJvcGVydHlEZWNvcmF0b3IgcCA9IGludHJvc3BlY3RDYWxsYmFjay5wcm9jZXNzKHByKTsKLQkJCQkJCQkJCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCS8vIEl0IGFjdHVhbGx5IGNvdWxkIGJlIGVpdGhlciBhIHByb3BlcnR5IGRlY29yYXRvciBvciBhbiBpbmRleGVkIHByb3BlcnR5IGRlY29yYXRvci4gVGhpcyBjb3VsZCBoYXBwZW4KLQkJCQkJCQkJCQkJLy8gYmVjYXVzZSB0aGUgb3ZlcnJpZGVzIGZpbGUgaGFzIGV4cGxpY2l0bHkgZGVjbGFyZWQgYW4gSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLCBzbyB3ZSBjYW4ndCBjaGFuZ2UgaXQKLQkJCQkJCQkJCQkJLy8gdG8gYW4KLQkJCQkJCQkJCQkJLy8gUHJvcGVydHkuCi0JCQkJCQkJCQkJCS8vIFNvIGluIHRoYXQgY2FzZSB3ZSBjYW4gb25seSBmaWxsIHRoZSBwcm9wZXJ0eSBwYXJ0LgotCQkJCQkJCQkJCQlhcHBseVJlY29yZChwLCBwcik7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBJbiBjYXNlIHdlIGdvdCBiYWQgZGF0YSBzZW50IGluLgotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCWNhc2UgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5NRVRIT0RfREVDT1JBVE9SU19TRU5UOgotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWludCBvcENvdW50ID0gb2lzLnJlYWRJbnQoKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcENvdW50OyBpKyspIHsKLQkJCQkJCQkJCU1ldGhvZFJlY29yZCBtciA9IChNZXRob2RSZWNvcmQpIG9pcy5yZWFkT2JqZWN0KCk7Ci0JCQkJCQkJCQlNZXRob2REZWNvcmF0b3IgbSA9IGludHJvc3BlY3RDYWxsYmFjay5wcm9jZXNzKG1yKTsKLQkJCQkJCQkJCWlmIChtICE9IG51bGwpCi0JCQkJCQkJCQkJYXBwbHlSZWNvcmQobSwgbXIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBJbiBjYXNlIHdlIGdvdCBiYWQgZGF0YSBzZW50IGluLgotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCi0JCQkJCQljYXNlIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRVZFTlRfREVDT1JBVE9SU19TRU5UOgotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWludCBvcENvdW50ID0gb2lzLnJlYWRJbnQoKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcENvdW50OyBpKyspIHsKLQkJCQkJCQkJCUV2ZW50U2V0UmVjb3JkIGV2ciA9IChFdmVudFNldFJlY29yZCkgb2lzLnJlYWRPYmplY3QoKTsKLQkJCQkJCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGUgPSBpbnRyb3NwZWN0Q2FsbGJhY2sucHJvY2VzcyhldnIpOwotCQkJCQkJCQkJaWYgKGUgIT0gbnVsbCkKLQkJCQkJCQkJCQlhcHBseVJlY29yZChlLCBldnIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBJbiBjYXNlIHdlIGdvdCBiYWQgZGF0YSBzZW50IGluLgotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCi0JCQkJCQljYXNlIElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9ORToKLQkJCQkJCQlyZXR1cm47CS8vIEdvb2QuIFRoaXMgaXMgYSBnb29kIHN0b3AuCi0JCQkJCQkJCi0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCXJldHVybjsJLy8gVGhpcyBpcyBpbnZhbGlkLiBTaG91bGQgb2YgZ290dG9uIHNvbWV0aGluZy4KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBseSB0aGUgZmVhdHVyZSByZWNvcmQgdG8gdGhlIGZlYXR1cmUgZGVjb3JhdG9yLiBUaGlzIGlzIHByb3RlY3RlZCBiZWNhdXNlIHRoaXMgaXMgYW4gYWJzdHJhY3QgYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnkgaXRzZWxmLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBkZWNvcgotCSAqIEBwYXJhbSByZWNvcmQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXBwbHlSZWNvcmQoRmVhdHVyZURlY29yYXRvciBkZWNvciwgRmVhdHVyZVJlY29yZCByZWNvcmQpIHsKLQkJLy8gU3ViY2xhc3NlcyB3aWxsIGNsZWFyIHRoZWlyIGRlY29yLCB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgY2xlYXIgdGhlIEZlYXR1cmVEZWNvciBwYXJ0IGZvciB1cy4KLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKHJlY29yZC5kaXNwbGF5TmFtZSAhPSBudWxsICYmICFkZWNvci5pc1NldERpc3BsYXlOYW1lKCkpIHsKLQkJCWRlY29yLnNldERpc3BsYXlOYW1lKHJlY29yZC5kaXNwbGF5TmFtZSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfRElTUExBWU5BTUVfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC5zaG9ydERlc2NyaXB0aW9uICE9IG51bGwgJiYgIWRlY29yLmlzU2V0U2hvcnREZXNjcmlwdGlvbigpKSB7Ci0JCQlkZWNvci5zZXRTaG9ydERlc2NyaXB0aW9uKHJlY29yZC5zaG9ydERlc2NyaXB0aW9uKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9TSE9SVERFU0NfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC5jYXRlZ29yeSAhPSBudWxsICYmICFkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0NhdGVnb3J5KCkpKSB7Ci0JCQlkZWNvci5zZXRDYXRlZ29yeShyZWNvcmQuY2F0ZWdvcnkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0NBVEVHT1JZX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRFeHBlcnQoKSkgewotCQkJaWYgKGRlY29yLmlzRXhwZXJ0KCkgIT0gcmVjb3JkLmV4cGVydCkKLQkJCQlkZWNvci5zZXRFeHBlcnQocmVjb3JkLmV4cGVydCk7IC8vIERvbid0IHdhbnQgdG8gZXhwbGljaXRseSBzZXQgaXQgaWYgaXQgaXMgZXF1YWwgdG8gZGVmYXVsdCAodGhpcyB3aWxsIHB1dCBsZXNzIG91dCB0byB0aGUgY2FjaGUgZmlsZQotCQkJCQkJCQkJCQkJLy8gYW5kIHNvIHdpbGwgcGFyc2UgYW5kIGFwcGx5IGZhc3RlcikuCi0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfRVhQRVJUX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRIaWRkZW4oKSkgewotCQkJaWYgKGRlY29yLmlzSGlkZGVuKCkgIT0gcmVjb3JkLmhpZGRlbikKLQkJCQlkZWNvci5zZXRIaWRkZW4ocmVjb3JkLmhpZGRlbik7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfSElEREVOX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRQcmVmZXJyZWQoKSkgewotCQkJaWYgKGRlY29yLmlzUHJlZmVycmVkKCkgIT0gcmVjb3JkLnByZWZlcnJlZCkKLQkJCQlkZWNvci5zZXRQcmVmZXJyZWQocmVjb3JkLnByZWZlcnJlZCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfUFJFRkVSUkVEX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQuYXR0cmlidXRlTmFtZXMgIT0gbnVsbCAmJiAhZGVjb3IuaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpCi0JCQkJJiYgIWRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfQXR0cmlidXRlcygpKSkgewotCQkJLy8gVGhpcyBpcyBhIGxpc3QsIHNvIHdlIG5lZWQgdG8gcmVhZCBhbiBmaWxsIGluLgotCQkJRU1hcCBhdHRycyA9IGRlY29yLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3JkLmF0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCBlbnRyeSA9IChGZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsKSAoKEJlYW5pbmZvRmFjdG9yeUltcGwpIEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UpCi0JCQkJCQkuY3JlYXRlRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCk7Ci0JCQkJZW50cnkuc2V0VHlwZWRLZXkocmVjb3JkLmF0dHJpYnV0ZU5hbWVzW2ldKTsKLQkJCQllbnRyeS5zZXRUeXBlZFZhbHVlKHJlY29yZC5hdHRyaWJ1dGVWYWx1ZXNbaV0pOwotCQkJCWF0dHJzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfQVRUUklCVVRFU19JTVBMSUNJVDsKLQkJfQotCi0JCWRlY29yLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MpOyAvLyBOb3cgc2F2ZSB3YXMgaW1wbGljaXRseSBzZXQuCi0JfQotCi0JLyoqCi0JICogQXBwbHkgdGhlIGJlYW4gcmVjb3JkIHRvIHRoZSBiZWFuIGRlY29yYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3IKLQkgKiBAcGFyYW0gcmVjb3JkCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5UmVjb3JkKEJlYW5EZWNvcmF0b3IgZGVjb3IsIEJlYW5SZWNvcmQgcmVjb3JkKSB7Ci0JCWFwcGx5UmVjb3JkKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvciwgcmVjb3JkKTsKLQotCQlsb25nIGltcGxpY2l0U2V0dGluZ3MgPSBkZWNvci5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQlpZiAocmVjb3JkLmN1c3RvbWl6ZXJDbGFzc05hbWUgIT0gbnVsbCAmJiAhZGVjb3IuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9DdXN0b21pemVyQ2xhc3MoKSkpIHsKLQkJCWRlY29yLnNldEN1c3RvbWl6ZXJDbGFzcyhjcmVhdGVKYXZhQ2xhc3NQcm94eShyZWNvcmQuY3VzdG9taXplckNsYXNzTmFtZSkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX0NVU1RPTUlaRVJfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKCFkZWNvci5pc1NldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKCkpIHsKLQkJCWlmIChkZWNvci5pc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkgIT0gcmVjb3JkLm1lcmdlSW5oZXJpdGVkUHJvcGVydGllcykKLQkJCQlkZWNvci5zZXRNZXJnZVN1cGVyUHJvcGVydGllcyhyZWNvcmQubWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfUFJPUEVSVElFU19JTVBMSUNJVDsKLQkJfQotCQlpZiAoIWRlY29yLmlzU2V0TWVyZ2VTdXBlck1ldGhvZHMoKSkgewotCQkJaWYgKGRlY29yLmlzTWVyZ2VTdXBlck1ldGhvZHMoKSAhPSByZWNvcmQubWVyZ2VJbmhlcml0ZWRPcGVyYXRpb25zKQotCQkJCWRlY29yLnNldE1lcmdlU3VwZXJNZXRob2RzKHJlY29yZC5tZXJnZUluaGVyaXRlZE9wZXJhdGlvbnMpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9PUEVSQVRJT05TX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRNZXJnZVN1cGVyRXZlbnRzKCkpIHsKLQkJCWlmIChkZWNvci5pc01lcmdlU3VwZXJFdmVudHMoKSAhPSByZWNvcmQubWVyZ2VJbmhlcml0ZWRFdmVudHMpCi0JCQkJZGVjb3Iuc2V0TWVyZ2VTdXBlckV2ZW50cyhyZWNvcmQubWVyZ2VJbmhlcml0ZWRFdmVudHMpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9FVkVOVFNfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC5ub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzICE9IG51bGwpIHsKLQkJCS8vIFRoaXMgaXMgYWx3YXlzIGFwcGxpZWQuIFRoaXMgaXNuJ3QgYSBjbGllbnQgb3ZlcnJpZGUgc28gd2UgY2FuIGp1c3Qgc2xhbSBpdC4KLQkJCWRlY29yLmdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZWNvcmQubm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcykpOwotCQl9Ci0JCWlmIChyZWNvcmQubm90SW5oZXJpdGVkT3BlcmF0aW9uTmFtZXMgIT0gbnVsbCkgewotCQkJLy8gVGhpcyBpcyBhbHdheXMgYXBwbGllZC4gVGhpcyBpc24ndCBhIGNsaWVudCBvdmVycmlkZSBzbyB3ZSBjYW4ganVzdCBzbGFtIGl0LgotCQkJZGVjb3IuZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZWNvcmQubm90SW5oZXJpdGVkT3BlcmF0aW9uTmFtZXMpKTsKLQkJfQotCQlpZiAocmVjb3JkLm5vdEluaGVyaXRlZEV2ZW50TmFtZXMgIT0gbnVsbCkgewotCQkJLy8gVGhpcyBpcyBhbHdheXMgYXBwbGllZC4gVGhpcyBpc24ndCBhIGNsaWVudCBvdmVycmlkZSBzbyB3ZSBjYW4ganVzdCBzbGFtIGl0LgotCQkJZGVjb3IuZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpLmFkZEFsbChBcnJheXMuYXNMaXN0KHJlY29yZC5ub3RJbmhlcml0ZWRFdmVudE5hbWVzKSk7Ci0JCX0KLQotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzKTsgLy8gTm93IHNhdmUgd2FzIGltcGxpY2l0bHkgc2V0LgotCX0KLQotCS8qKgotCSAqIEFwcGx5IHRoZSBQcm9wZXJ0eVJlY29yZCB0byB0aGUgUHJvcGVydHlEZWNvcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGRlY29yCi0JICogQHBhcmFtIHJlY29yZAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVJlY29yZChQcm9wZXJ0eURlY29yYXRvciBkZWNvciwgUHJvcGVydHlSZWNvcmQgcmVjb3JkKSB7Ci0JCWFwcGx5UmVjb3JkKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvciwgcmVjb3JkKTsKLQotCQlhcHBseU9ubHkoZGVjb3IsIHJlY29yZCk7Ci0JfQotCi0JLyoKLQkgKiBBcHBseSBvbmx5IHRvIHByb3BlcnR5IGRlY29yYXRvciBwYXJ0LiBBbGxvd3MgSW5kZXhlZFByb3BlcnR5IHRvIGFwcGx5IGp1c3QgdGhlIFByb3BlcnR5IHBhcnQgYW5kIG5vdCBkbyBkdXBsaWNhdGUgd29yawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwbHlPbmx5KFByb3BlcnR5RGVjb3JhdG9yIGRlY29yLCBQcm9wZXJ0eVJlY29yZCByZWNvcmQpIHsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKHJlY29yZC5wcm9wZXJ0eUVkaXRvckNsYXNzTmFtZSAhPSBudWxsICYmICFkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9Qcm9wZXJ0eUVkaXRvckNsYXNzKCkpKSB7Ci0JCQlkZWNvci5zZXRQcm9wZXJ0eUVkaXRvckNsYXNzKGNyZWF0ZUphdmFDbGFzc1Byb3h5KHJlY29yZC5wcm9wZXJ0eUVkaXRvckNsYXNzTmFtZSkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfRURJVE9SX0NMQVNTX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQucmVhZE1ldGhvZCAhPSBudWxsICYmICFkZWNvci5pc1NldFJlYWRNZXRob2QoKSkgewotCQkJZGVjb3Iuc2V0UmVhZE1ldGhvZChjcmVhdGVKYXZhTWV0aG9kUHJveHkocmVjb3JkLnJlYWRNZXRob2QpKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX1JFQURNRVRIT0RfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC53cml0ZU1ldGhvZCAhPSBudWxsICYmICFkZWNvci5pc1NldFdyaXRlTWV0aG9kKCkpIHsKLQkJCWRlY29yLnNldFdyaXRlTWV0aG9kKGNyZWF0ZUphdmFNZXRob2RQcm94eShyZWNvcmQud3JpdGVNZXRob2QpKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX1dSSVRFTUVUSE9EX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQuZmllbGQgIT0gbnVsbCAmJiAhZGVjb3IuaXNTZXRGaWVsZCgpKSB7Ci0JCQlkZWNvci5zZXRGaWVsZChjcmVhdGVKYXZhRmllbGRQcm94eShyZWNvcmQuZmllbGQpKTsKLQkJCWlmIChkZWNvci5pc0ZpZWxkUmVhZE9ubHkoKSAhPSByZWNvcmQuZmllbGQucmVhZE9ubHkpCi0JCQkJZGVjb3Iuc2V0RmllbGRSZWFkT25seShyZWNvcmQuZmllbGQucmVhZE9ubHkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfRklFTERfSU1QTElDSVQ7Ci0JCX0JCQotCQlpZiAoIWRlY29yLmlzU2V0Qm91bmQoKSkgewotCQkJaWYgKGRlY29yLmlzQm91bmQoKSAhPSByZWNvcmQuYm91bmQpCi0JCQkJZGVjb3Iuc2V0Qm91bmQocmVjb3JkLmJvdW5kKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0JPVU5EX0lNUExJQ0lUOwotCQl9Ci0JCWlmICghZGVjb3IuaXNTZXRDb25zdHJhaW5lZCgpKSB7Ci0JCQlpZiAoZGVjb3IuaXNDb25zdHJhaW5lZCgpICE9IHJlY29yZC5jb25zdHJhaW5lZCkKLQkJCQlkZWNvci5zZXRDb25zdHJhaW5lZChyZWNvcmQuY29uc3RyYWluZWQpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfQ09OU1RSQUlORURfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC5kZXNpZ25UaW1lICE9IG51bGwgJiYgIWRlY29yLmlzU2V0RGVzaWduVGltZSgpKSB7Ci0JCQkvLyBEZXNpZ24gdGltZSBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiB0aGUgb3RoZXIgYm9vbGVhbnMgYmVjYXVzZQotCQkJLy8gZXhwbGljaXRseSBzZXQgdG8gdHJ1ZS9mYWxzZSBpcyBpbXBvcnRhbnQgdmVyc3VzIG5vdCBleHBsaWNpdGx5IHNldCBhdCBhbGwgKHdoaWNoIGlzIGZhbHNlKS4KLQkJCWRlY29yLnNldERlc2lnblRpbWUocmVjb3JkLmRlc2lnblRpbWUuYm9vbGVhblZhbHVlKCkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfREVTSUdOVElNRV9JTVBMSUNJVDsKLQkJfQotCi0JCWRlY29yLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MpOyAvLyBOb3cgc2F2ZSB3YXMgaW1wbGljaXRseSBzZXQuCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlSZWNvcmQoSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIGRlY29yLCBJbmRleGVkUHJvcGVydHlSZWNvcmQgcmVjb3JkKSB7Ci0JCWFwcGx5UmVjb3JkKChGZWF0dXJlRGVjb3JhdG9yKSBkZWNvciwgcmVjb3JkKTsKLQkJYXBwbHlPbmx5KGRlY29yLCByZWNvcmQpOwotCi0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCWlmIChyZWNvcmQuaW5kZXhlZFJlYWRNZXRob2QgIT0gbnVsbCAmJiAhZGVjb3IuaXNTZXRJbmRleGVkUmVhZE1ldGhvZCgpKSB7Ci0JCQlkZWNvci5zZXRJbmRleGVkUmVhZE1ldGhvZChjcmVhdGVKYXZhTWV0aG9kUHJveHkocmVjb3JkLmluZGV4ZWRSZWFkTWV0aG9kKSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuSU5ERVhFRF9SRUFETUVUSE9EX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQuaW5kZXhlZFdyaXRlTWV0aG9kICE9IG51bGwgJiYgIWRlY29yLmlzU2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkpIHsKLQkJCWRlY29yLnNldEluZGV4ZWRXcml0ZU1ldGhvZChjcmVhdGVKYXZhTWV0aG9kUHJveHkocmVjb3JkLmluZGV4ZWRXcml0ZU1ldGhvZCkpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsLklOREVYRURfV1JJVEVNRVRIT0RfSU1QTElDSVQ7Ci0JCX0KLQkJZGVjb3Iuc2V0SW1wbGljaXRseVNldEJpdHMoaW1wbGljaXRTZXR0aW5ncyk7IC8vIE5vdyBzYXZlIHdhcyBpbXBsaWNpdGx5IHNldC4KLQl9Ci0KLQkvKioKLQkgKiBBcHBseSB0aGUgbWV0aG9kIHJlY29yZCB0byB0aGUgbWV0aG9kIGRlY29yYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3IKLQkgKiBAcGFyYW0gcmVjb3JkCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5UmVjb3JkKE1ldGhvZERlY29yYXRvciBkZWNvciwgTWV0aG9kUmVjb3JkIHJlY29yZCkgewotCQlhcHBseVJlY29yZCgoRmVhdHVyZURlY29yYXRvcikgZGVjb3IsIHJlY29yZCk7Ci0KLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKHJlY29yZC5wYXJhbWV0ZXJzICE9IG51bGwgJiYgIWRlY29yLmlzUGFybXNFeHBsaWNpdEVtcHR5KCkKLQkJCQkmJiAhZGVjb3IuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRGVjb3JhdG9yX1BhcmFtZXRlckRlc2NyaXB0b3JzKCkpKSB7Ci0JCQkvLyBUaGlzIGlzIGEgbGlzdCwgc28gd2UgbmVlZCB0byByZWFkIGFuIGZpbGwgaW4uCi0JCQlMaXN0IHBhcm1zID0gZGVjb3IuZ2V0U2VyUGFybURlc2MoKTsgLy8gU28gYXMgbm90IHRvIGhhdmUgaXQgaW1wbGljaXRseSBmaWxsIGl0IGluLCB3aGljaCBpdCB3b3VsZCBpZiB3ZSBjYWxsZWQgZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZC5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUGFyYW1ldGVyRGVjb3JhdG9yIHBhcm0gPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtZXRlckRlY29yYXRvcigpOwotCQkJCWFwcGx5UmVjb3JkKHBhcm0sIHJlY29yZC5wYXJhbWV0ZXJzW2ldKTsKLQkJCQlwYXJtcy5hZGQocGFybSk7Ci0JCQl9Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IE1ldGhvZERlY29yYXRvckltcGwuTUVUSE9EX1BBUkFNRVRFUlNfSU1QTElDSVQ7Ci0JCQlpbXBsaWNpdFNldHRpbmdzICY9IH5NZXRob2REZWNvcmF0b3JJbXBsLk1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQ7IC8vIFNob3VsZCBvZiBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgYnV0IGJlIHNhZmUuCi0JCX0KLQotCQlkZWNvci5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzKTsgLy8gTm93IHNhdmUgd2FzIGltcGxpY2l0bHkgc2V0LgotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseVJlY29yZChQYXJhbWV0ZXJEZWNvcmF0b3IgZGVjb3IsIFBhcmFtZXRlclJlY29yZCByZWNvcmQpIHsKLQkJYXBwbHlSZWNvcmQoKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yLCByZWNvcmQpOwotCi0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCWlmIChyZWNvcmQubmFtZSAhPSBudWxsICYmICFkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbWV0ZXJEZWNvcmF0b3JfTmFtZSgpKSkgewotCQkJZGVjb3Iuc2V0TmFtZShyZWNvcmQubmFtZSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IFBhcmFtZXRlckRlY29yYXRvckltcGwuUEFSQU1FVEVSX05BTUVfSU1QTElDSVQ7Ci0JCX0KLQkJZGVjb3Iuc2V0SW1wbGljaXRseVNldEJpdHMoaW1wbGljaXRTZXR0aW5ncyk7IC8vIE5vdyBzYXZlIHdhcyBpbXBsaWNpdGx5IHNldC4KLQl9Ci0KLQkvKioKLQkgKiBBcHBseSB0aGUgZXZlbnQgc2V0IHJlY29yZCB0byB0aGUgZXZlbnQgc2V0IGRlY29yYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjb3IKLQkgKiBAcGFyYW0gcmVjb3JkCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5UmVjb3JkKEV2ZW50U2V0RGVjb3JhdG9yIGRlY29yLCBFdmVudFNldFJlY29yZCByZWNvcmQpIHsKLQkJYXBwbHlSZWNvcmQoKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yLCByZWNvcmQpOwotCi0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCWlmIChyZWNvcmQuYWRkTGlzdGVuZXJNZXRob2QgIT0gbnVsbCAmJiAhZGVjb3IuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfQWRkTGlzdGVuZXJNZXRob2QoKSkpIHsKLQkJCWRlY29yLnNldEFkZExpc3RlbmVyTWV0aG9kKGNyZWF0ZUphdmFNZXRob2RQcm94eShyZWNvcmQuYWRkTGlzdGVuZXJNZXRob2QpKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0FERExJU1RFTkVSTUVUSE9EX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZWNvcmQuZXZlbnRBZGFwdGVyQ2xhc3NOYW1lICE9IG51bGwgJiYgIWRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0V2ZW50QWRhcHRlckNsYXNzKCkpKSB7Ci0JCQlkZWNvci5zZXRFdmVudEFkYXB0ZXJDbGFzcyhjcmVhdGVKYXZhQ2xhc3NQcm94eShyZWNvcmQuZXZlbnRBZGFwdGVyQ2xhc3NOYW1lKSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9BREFQVEVSQ0xBU1NfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKHJlY29yZC5saXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzICE9IG51bGwgJiYgIWRlY29yLmlzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpCi0JCQkJJiYgIWRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kcygpKSkgewotCQkJTGlzdCBtZXRob2RzID0gZGVjb3IuZ2V0U2VyTGlzdE10aGQoKTsgLy8gU28gYXMgbm90IHRvIGhhdmUgaXQgaW1wbGljaXRseSBmaWxsIGl0IGluLCB3aGljaCBpdCB3b3VsZCBpZiB3ZSBjYWxsZWQgZ2V0TGlzdGVuZXJNZXRob2RzLgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmQubGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUJlYW5pbmZvRmFjdG9yeSBiZmFjdCA9IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQkJTWV0aG9kUmVjb3JkIG1yID0gcmVjb3JkLmxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnNbaV07Ci0JCQkJTWV0aG9kIG1ldGhvZCA9IGNyZWF0ZUphdmFNZXRob2RQcm94eShtci5tZXRob2RGb3JEZXNjcmlwdG9yKTsKLQkJCQkvLyBXZSBuZWVkIGEgbWV0aG9kIHByb3h5LCBhbmQgYSBtZXRob2QgZGVjb3JhdG9yLgotCQkJCU1ldGhvZFByb3h5IG1wcm94eSA9IGJmYWN0LmNyZWF0ZU1ldGhvZFByb3h5KCk7Ci0JCQkJbXByb3h5LnNldE1ldGhvZChtZXRob2QpOwotCQkJCW1wcm94eS5zZXROYW1lKG1yLm5hbWUpOwotCQkJCU1ldGhvZERlY29yYXRvciBtZCA9IGJmYWN0LmNyZWF0ZU1ldGhvZERlY29yYXRvcigpOwotCQkJCWFwcGx5UmVjb3JkKG1kLCBtcik7Ci0JCQkJbXByb3h5LmdldEVBbm5vdGF0aW9ucygpLmFkZChtZCk7Ci0JCQkJbWV0aG9kcy5hZGQobXByb3h5KTsKLQkJCX0KLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSTUVUSE9EU19JTVBMSUNJVDsKLQkJCWltcGxpY2l0U2V0dGluZ3MgJj0gfkV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9MSVNURU5FUk1FVEhPRFNfREVGQVVMVDsgLy8gU2hvdWxkIG9mIGFscmVhZHkgYmVlbiBjbGVhcmVkLCBidXQgYmUgc2FmZS4KLQkJfQotCQlpZiAocmVjb3JkLmxpc3RlbmVyVHlwZU5hbWUgIT0gbnVsbCAmJiAhZGVjb3IuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJUeXBlKCkpKSB7Ci0JCQlkZWNvci5zZXRMaXN0ZW5lclR5cGUoY3JlYXRlSmF2YUNsYXNzUHJveHkocmVjb3JkLmxpc3RlbmVyVHlwZU5hbWUpKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVDsKLQkJfQotCQlpZiAocmVjb3JkLnJlbW92ZUxpc3RlbmVyTWV0aG9kICE9IG51bGwgJiYgIWRlY29yLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX1JlbW92ZUxpc3RlbmVyTWV0aG9kKCkpKSB7Ci0JCQlkZWNvci5zZXRSZW1vdmVMaXN0ZW5lck1ldGhvZChjcmVhdGVKYXZhTWV0aG9kUHJveHkocmVjb3JkLnJlbW92ZUxpc3RlbmVyTWV0aG9kKSk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9SRU1PVkVMSVNURU5FUk1FVEhPRF9JTVBMSUNJVDsKLQkJfQotCQlpZiAoIWRlY29yLmlzU2V0SW5EZWZhdWx0RXZlbnRTZXQoKSkgewotCQkJaWYgKHJlY29yZC5pbkRlZmF1bHRFdmVudFNldCAhPSBkZWNvci5pc0luRGVmYXVsdEV2ZW50U2V0KCkpCi0JCQkJZGVjb3Iuc2V0SW5EZWZhdWx0RXZlbnRTZXQocmVjb3JkLmluRGVmYXVsdEV2ZW50U2V0KTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0RFRkFVTFRFVkVOVFNFVF9JTVBMSUNJVDsKLQkJfQotCQlpZiAoIWRlY29yLmlzU2V0VW5pY2FzdCgpKSB7Ci0JCQlpZiAocmVjb3JkLnVuaWNhc3QgIT0gZGVjb3IuaXNVbmljYXN0KCkpCi0JCQkJZGVjb3Iuc2V0VW5pY2FzdChyZWNvcmQudW5pY2FzdCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9VTklDQVNUX0lNUExJQ0lUOwotCQl9Ci0KLQkJZGVjb3Iuc2V0SW1wbGljaXRseVNldEJpdHMoaW1wbGljaXRTZXR0aW5ncyk7IC8vIE5vdyBzYXZlIHdhcyBpbXBsaWNpdGx5IHNldC4KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBqYXZhIGNsYXNzIHByb3h5IGZvciB0aGUgZ2l2ZW4gbmFtZS4gQnkgYmVpbmcgYSBwcm94eSB3ZSBkb24ndCBuZWVkIHRvIGFjdHVhbGx5IGhhdmUgdGhlIHJlc291cmNlIHNldC4gTm9yIGRvIHdlIG5lZWQgdG8gZmx1ZmYgb25lIHVwCi0JICogdW50aWwgc29tZW9uZSBhY3R1YWxseSBhc2tzIGZvciBpdC4KLQkgKiA8cD4KLQkgKiBUaGUgam5pTmFtZSBtdXN0IHJlZmVyIHRvIGEgSmF2YUNsYXNzIG9yIGVycm9ycyBjb3VsZCBvY2N1ciBsYXRlciBvbi4KLQkgKiAKLQkgKiBAcGFyYW0gam5pTmFtZQotCSAqICAgICAgICAgICAgY2xhc3NuYW1lIGluIEpOSSBmb3JtYXQuCi0JICogQHJldHVybiBKYXZhQ2xhc3MgcHJveHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgamF2YSBjbGFzcyAoaXQgbWF5IGJlIGEgdHlwZSkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzUHJveHkoU3RyaW5nIGpuaU5hbWUpIHsKLQkJSmF2YUhlbHBlcnMgamggPSBjcmVhdGVKYXZhVHlwZVByb3h5KGpuaU5hbWUpOwotCQlyZXR1cm4gamggaW5zdGFuY2VvZiBKYXZhQ2xhc3MgPyAoSmF2YUNsYXNzKSBqaCA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgSmF2YUhlbHBlcnMgcHJveHkgZm9yIHRoZSBnaXZlbiBuYW1lLiBCeSBiZWluZyBhIHByb3h5IHdlIGRvbid0IG5lZWQgdG8gYWN0dWFsbHkgaGF2ZSB0aGUgcmVzb3VyY2Ugc2V0LiBOb3IgZG8gd2UgbmVlZCB0byBmbHVmZiBvbmUgdXAKLQkgKiB1bnRpbCBzb21lb25lIGFjdHVhbGx5IGFza3MgZm9yIGl0LgotCSAqIAotCSAqIEBwYXJhbSBqbmlOYW1lCi0JICogICAgICAgICAgICB0eXBlbmFtZSBpbiBKTkkgZm9ybWF0LgotCSAqIEByZXR1cm4gSmF2YUhlbHBlciBwcm94eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFIZWxwZXJzIGNyZWF0ZUphdmFUeXBlUHJveHkoU3RyaW5nIGpuaU5hbWUpIHsKLQkJU3RyaW5nIGZvcm1hbE5hbWUgPSBNYXBKTklUeXBlcy5nZXRGb3JtYWxUeXBlTmFtZShqbmlOYW1lKTsKLQotCQlVUkkgdXJpID0gVXRpbGl0aWVzLmdldEphdmFDbGFzc1VSSShmb3JtYWxOYW1lKTsKLQkJSmF2YUhlbHBlcnMgamggPSBudWxsOwotCQlpZiAoTWFwSk5JVHlwZXMuaXNGb3JtYWxUeXBlUHJpbWl0aXZlKGZvcm1hbE5hbWUpKQotCQkJamggPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YURhdGFUeXBlKCk7Ci0JCWVsc2UKLQkJCWpoID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFDbGFzcygpOwotCQkoKEludGVybmFsRU9iamVjdCkgamgpLmVTZXRQcm94eVVSSSh1cmkpOwotCQlyZXR1cm4gamg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZFByb3h5KFJlZmxlY3RNZXRob2RSZWNvcmQgbWV0aG9kKSB7Ci0JCVN0cmluZ1tdIHBhcm1UeXBlcyA9IG1ldGhvZC5wYXJhbWV0ZXJUeXBlTmFtZXMgIT0gbnVsbCA/IG5ldyBTdHJpbmdbbWV0aG9kLnBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGhdIDogbnVsbDsKLQkJaWYgKHBhcm1UeXBlcyAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2QucGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFybVR5cGVzW2ldID0gTWFwSk5JVHlwZXMuZ2V0Rm9ybWFsVHlwZU5hbWUobWV0aG9kLnBhcmFtZXRlclR5cGVOYW1lc1tpXSk7Ci0JCQl9Ci0JCVVSSSB1cmkgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kVVJJKE1hcEpOSVR5cGVzLmdldEZvcm1hbFR5cGVOYW1lKG1ldGhvZC5jbGFzc05hbWUpLCBtZXRob2QubWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQkJTWV0aG9kIG1ldGhvZEVNRiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2QoKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpIG1ldGhvZEVNRikuZVNldFByb3h5VVJJKHVyaSk7Ci0JCXJldHVybiBtZXRob2RFTUY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRmllbGQgY3JlYXRlSmF2YUZpZWxkUHJveHkoUmVmbGVjdEZpZWxkUmVjb3JkIGZpZWxkKSB7Ci0JCVVSSSB1cmkgPSBVdGlsaXRpZXMuZ2V0RmllbGRVUkkoTWFwSk5JVHlwZXMuZ2V0Rm9ybWFsVHlwZU5hbWUoZmllbGQuY2xhc3NOYW1lKSwgZmllbGQuZmllbGROYW1lKTsKLQkJRmllbGQgZmllbGRFTUYgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmllbGQoKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpIGZpZWxkRU1GKS5lU2V0UHJveHlVUkkodXJpKTsKLQkJcmV0dXJuIGZpZWxkRU1GOwotCX0JCi0KLQkvKioKLQkgKiBTZXQgdGhlIHByb3BlcnRpZXMgb24gdGhlIFByb3BlcnR5RGVjb3JhdG9yLiBUaGVzZSBjb21lIGZyb20gcmVmbGVjdGlvbi4gU2luY2UgdGhpcyBpcyBhIHByaXZhdGUgaW50ZXJmYWNlIGJldHdlZW4gQmVhbmluZm9DbGFzc0FkYXB0ZXIgYW5kCi0JICogdGhpcyBjbGFzcywgbm90IGFsbCBwb3NzaWJsZSBzZXR0aW5ncyBuZWVkIHRvIGJlIG1lbnRpb25lZC4gT25seSB0aGUgb25lcyB0aGF0IGNhbiBiZSBzZXQgYnkgcmVmbGVjdGlvbi4gSXQgaXMgYXNzdW1lZCB0aGF0IGNsZWFyIGhhcyBhbHJlYWR5Ci0JICogYmVlbiBkb25lIHNvIHRoYXQgdGhlcmUgYXJlIG5vIG9sZCBpbXBsaWNpdCBzZXR0aW5ncy4gSXQgd2lsbCBjaGVjayBpZiBwcm9wZXJ0aWVzIGFyZSBzZXQgYWxyZWFkeSBiZWZvcmUgc2V0dGluZyBzbyB0aGF0IGRvbid0IHdpcGUgb3V0Ci0JICogZXhwbGljaXQgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHByb3AKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiBAcGFyYW0gY29uc3RyYWluZWQKLQkgKiBAcGFyYW0gZ2V0dGVyCi0JICogQHBhcmFtIHNldHRlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFByb3BlcnR5RGVjb3JhdG9yIHByb3AsIGJvb2xlYW4gYm91bmQsIGJvb2xlYW4gY29uc3RyYWluZWQsIE1ldGhvZCBnZXR0ZXIsIE1ldGhvZCBzZXR0ZXIpIHsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gcHJvcC5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQlpZiAoZ2V0dGVyICE9IG51bGwgJiYgIXByb3AuaXNTZXRSZWFkTWV0aG9kKCkpIHsKLQkJCXByb3Auc2V0UmVhZE1ldGhvZChnZXR0ZXIpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfUkVBRE1FVEhPRF9JTVBMSUNJVDsKLQkJfQotCQlpZiAoc2V0dGVyICE9IG51bGwgJiYgIXByb3AuaXNTZXRXcml0ZU1ldGhvZCgpKSB7Ci0JCQlwcm9wLnNldFdyaXRlTWV0aG9kKHNldHRlcik7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9XUklURU1FVEhPRF9JTVBMSUNJVDsKLQkJfQotCQlpZiAoIXByb3AuaXNTZXRCb3VuZCgpKSB7Ci0JCQlpZiAocHJvcC5pc0JvdW5kKCkgIT0gYm91bmQpCi0JCQkJcHJvcC5zZXRCb3VuZChib3VuZCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9CT1VORF9JTVBMSUNJVDsKLQkJfQotCQlpZiAoIXByb3AuaXNTZXRDb25zdHJhaW5lZCgpKSB7Ci0JCQlpZiAocHJvcC5pc0NvbnN0cmFpbmVkKCkgIT0gY29uc3RyYWluZWQpCi0JCQkJcHJvcC5zZXRDb25zdHJhaW5lZChjb25zdHJhaW5lZCk7Ci0JCQlpbXBsaWNpdFNldHRpbmdzIHw9IFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9DT05TVFJBSU5FRF9JTVBMSUNJVDsKLQkJfQotCQlwcm9wLnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MpOyAvLyBOb3cgc2F2ZSB3YXMgaW1wbGljaXRseSBzZXQuCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuIFRoZXNlIGNvbWUgZnJvbSByZWZsZWN0aW9uLiBJdCBpcyBvbmx5IHRoZSBpbmRleGVkIHBvcnRpb24uIFRoZSBiYXNlIHByb3BlcnR5IHBvcnRpb24KLQkgKiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0LiBTaW5jZSB0aGlzIGlzIGEgcHJpdmF0ZSBpbnRlcmZhY2UgYmV0d2VlbiBCZWFuaW5mb0NsYXNzQWRhcHRlciBhbmQgdGhpcyBjbGFzcywgbm90IGFsbCBwb3NzaWJsZSBzZXR0aW5ncyBuZWVkIHRvCi0JICogYmUgbWVudGlvbmVkLiBPbmx5IHRoZSBvbmVzIHRoYXQgY2FuIGJlIHNldCBieSByZWZsZWN0aW9uLiBJdCBpcyBhc3N1bWVkIHRoYXQgY2xlYXIgaGFzIGFscmVhZHkgYmVlbiBkb25lIHNvIHRoYXQgdGhlcmUgYXJlIG5vIG9sZCBpbXBsaWNpdAotCSAqIHNldHRpbmdzLiBJdCB3aWxsIGNoZWNrIGlmIHByb3BlcnRpZXMgYXJlIHNldCBhbHJlYWR5IGJlZm9yZSBzZXR0aW5nIHNvIHRoYXQgZG9uJ3Qgd2lwZSBvdXQgZXhwbGljaXQgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHByb3AKLQkgKiBAcGFyYW0gaW5kZXhlZEdldHRlcgotCSAqIEBwYXJhbSBpbmRleGVkU2V0dGVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnRpZXMoSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIHByb3AsIE1ldGhvZCBpbmRleGVkR2V0dGVyLCBNZXRob2QgaW5kZXhlZFNldHRlcikgewotCQlsb25nIGltcGxpY2l0U2V0dGluZ3MgPSBwcm9wLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCWlmIChpbmRleGVkR2V0dGVyICE9IG51bGwgJiYgIXByb3AuaXNTZXRJbmRleGVkUmVhZE1ldGhvZCgpKSB7Ci0JCQlwcm9wLnNldEluZGV4ZWRSZWFkTWV0aG9kKGluZGV4ZWRHZXR0ZXIpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsLklOREVYRURfUkVBRE1FVEhPRF9JTVBMSUNJVDsKLQkJfQotCQlpZiAoaW5kZXhlZFNldHRlciAhPSBudWxsICYmICFwcm9wLmlzU2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkpIHsKLQkJCXByb3Auc2V0SW5kZXhlZFdyaXRlTWV0aG9kKGluZGV4ZWRTZXR0ZXIpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsLklOREVYRURfV1JJVEVNRVRIT0RfSU1QTElDSVQ7Ci0JCX0KLQkJcHJvcC5zZXRJbXBsaWNpdGx5U2V0Qml0cyhpbXBsaWNpdFNldHRpbmdzKTsgLy8gTm93IHNhdmUgd2FzIGltcGxpY2l0bHkgc2V0LgotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcHJvcGVydGllcyBvbiB0aGUgRXZlbnRTZXREZWNvcmF0b3IuIFRoZXNlIGNvbWUgZnJvbSByZWZsZWN0aW9uLiBTaW5jZSB0aGlzIGlzIGEgcHJpdmF0ZSBpbnRlcmZhY2UgYmV0d2VlbiBCZWFuaW5mb0NsYXNzQWRhcHRlciBhbmQKLQkgKiB0aGlzIGNsYXNzLCBub3QgYWxsIHBvc3NpYmxlIHNldHRpbmdzIG5lZWQgdG8gYmUgbWVudGlvbmVkLiBPbmx5IHRoZSBvbmVzIHRoYXQgY2FuIGJlIHNldCBieSByZWZsZWN0aW9uLiBJdCBpcyBhc3N1bWVkIHRoYXQgY2xlYXIgaGFzIGFscmVhZHkKLQkgKiBiZWVuIGRvbmUgc28gdGhhdCB0aGVyZSBhcmUgbm8gb2xkIGltcGxpY2l0IHNldHRpbmdzLiBJdCB3aWxsIGNoZWNrIGlmIHByb3BlcnRpZXMgYXJlIHNldCBhbHJlYWR5IGJlZm9yZSBzZXR0aW5nIHNvIHRoYXQgZG9uJ3Qgd2lwZSBvdXQKLQkgKiBleHBsaWNpdCBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiBAcGFyYW0gY29uc3RyYWluZWQKLQkgKiBAcGFyYW0gZ2V0dGVyCi0JICogQHBhcmFtIHNldHRlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0aWVzKEV2ZW50U2V0RGVjb3JhdG9yIGV2ZW50LCBNZXRob2QgYWRkTGlzdGVuZXJNZXRob2QsIE1ldGhvZCByZW1vdmVMaXN0ZW5lck1ldGhvZCwgYm9vbGVhbiB1bmljYXN0LAotCQkJSmF2YUNsYXNzIGxpc3RlbmVyVHlwZSkgewotCQlsb25nIGltcGxpY2l0U2V0dGluZ3MgPSBldmVudC5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQlpZiAoYWRkTGlzdGVuZXJNZXRob2QgIT0gbnVsbCAmJiAhZXZlbnQuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfQWRkTGlzdGVuZXJNZXRob2QoKSkpIHsKLQkJCWV2ZW50LnNldEFkZExpc3RlbmVyTWV0aG9kKGFkZExpc3RlbmVyTWV0aG9kKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0FERExJU1RFTkVSTUVUSE9EX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChyZW1vdmVMaXN0ZW5lck1ldGhvZCAhPSBudWxsICYmICFldmVudC5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9SZW1vdmVMaXN0ZW5lck1ldGhvZCgpKSkgewotCQkJZXZlbnQuc2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QocmVtb3ZlTGlzdGVuZXJNZXRob2QpOwotCQkJaW1wbGljaXRTZXR0aW5ncyB8PSBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQ7Ci0JCX0KLQkJaWYgKCFldmVudC5pc1NldFVuaWNhc3QoKSkgewotCQkJaWYgKGV2ZW50LmlzVW5pY2FzdCgpICE9IHVuaWNhc3QpCi0JCQkJZXZlbnQuc2V0VW5pY2FzdCh1bmljYXN0KTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0JPVU5EX0lNUExJQ0lUOwotCQl9Ci0JCWlmIChsaXN0ZW5lclR5cGUgIT0gbnVsbCAmJiAhZXZlbnQuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJUeXBlKCkpKSB7Ci0JCQlldmVudC5zZXRMaXN0ZW5lclR5cGUobGlzdGVuZXJUeXBlKTsKLQkJCWltcGxpY2l0U2V0dGluZ3MgfD0gRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVDsKLQkJfQotCi0JCWV2ZW50LnNldEltcGxpY2l0bHlTZXRCaXRzKGltcGxpY2l0U2V0dGluZ3MpOyAvLyBOb3cgc2F2ZSB3YXMgaW1wbGljaXRseSBzZXQuCi0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSByZWNvcmQgZm9yIHRoZSBiZWFuIGRlY29yYXRvci4gRWl0aGVyIGl0IGlzIGFuIGFkZCBvZiBhIG5ldyBiZWFuIGRlY29yYXRvciBvciBpdCBpcyB0aGUgc2V0dGluZyBvZiB0aGUgaW1wbGljaXQKLQkgKiBzZXR0aW5ncyBvbiBhbiBub24taW1wbGljaXQgYmVhbiBkZWNvcmF0b3IuCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGJkCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkQ2hhbmdlKENoYW5nZURlc2NyaXB0aW9uIGNkLCBCZWFuRGVjb3JhdG9yIGJkKSB7Ci0JCS8vIE9ubHkgZG8gYW55dGhpbmcgaWYgbWVyZ2UgaW50cm9zcGVjdGlvbi4gSWYgbm8gbWVyZ2UgaW50cm9zcGVjdGlvbiwgdGhlbiB0aGVyZSBpcyBubyBjaGFuZ2UgbmVlZGVkLgotCQlpZiAoYmQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkgewotCQkJaWYgKGJkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpICE9IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCkgewotCQkJCS8vIEl0IGlzIGltcGxpY2l0LCBzbyBkbyBhbiBhZGQgdG8gZW5kLCBuZXcgdmFsdWUuCi0JCQkJZG9BZGRUb0VuZChjZCwgZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIGJkLmdldEVNb2RlbEVsZW1lbnQoKSksIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSwgYmQsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBKdXN0IGRvIHNldHMgb24gaW1wbGljaXQgY2hhbmdlZCBvbmVzCi0JCQkJYnVpbGROb25JbXBsaWNpdENoYW5nZShjZCwgZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIGJkKSwgYmQpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIHJlY29yZCBmb3IgdGhlIHByb3BlcnR5IGRlY29yYXRvci4gRWl0aGVyIGl0IGlzIGFuIGFkZCBvZiBhIG5ldyBwcm9wZXJ0eSBkZWNvcmF0b3Igb3IgaXQgaXMgdGhlIHNldHRpbmcgb2YgdGhlIGltcGxpY2l0Ci0JICogc2V0dGluZ3Mgb24gYW4gbm9uLWltcGxpY2l0IHByb3BlcnR5IGRlY29yYXRvci4gVGhlIHNhbWUgaXMgdHJ1ZSBvZiB0aGUgZmVhdHVyZSB0aGF0IGl0IGRlY29yYXRlcy4gSXQgbWF5IGJlIG5ldyBvciBpdCBtYXkgYmUgYW4gZXhpc3Rpbmcgb25lLgotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBwZAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgUHJvcGVydHlEZWNvcmF0b3IgcGQpIHsKLQkJLy8gT25seSBkbyBjaGFuZ2VzIGlmIG1lcmdlIGludHJvc3BlY3Rpb24uIElmIG5vdCBtZXJnaW5nLCB0aGVuIHRoZXJlIGFyZSBubyBjaGFuZ2VzLgotCQlpZiAocGQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkgewotCQkJYm9vbGVhbiBpbmRleGVkID0gcGQuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwZC5nZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQlzd2l0Y2ggKHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpLmdldFZhbHVlKCkpIHsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1I6Ci0JCQkJCS8vIFRoZSBkZWNvcmF0b3IgaXMgaW1wbGljaXQsIHNvIGNsb25lIGl0LCBhbmQgYXBwbHkgdG8gZmVhdHVyZSwgYW5kIHRoZW4gZG8gdGhlIHN0YW5kYXJkIHByb3BlcnR5IGFwcGxpZXMgdG8gdGhlIGZlYXR1cmUuCi0JCQkJCUxpc3QgZmNzID0gZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIGZlYXR1cmUpOwotCQkJCQlkb0FkZFRvRW5kKGNkLCBmY3MsIHBkLmVDb250YWluaW5nRmVhdHVyZSgpLCBwZCwgdHJ1ZSk7Ci0JCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgZmVhdHVyZSwgaW5kZXhlZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRToKLQkJCQkJLy8gVGhlIGRlY29yYXRvciBBTkQgZmVhdHVyZSBhcmUgaW1wbGljaXQuIEp1c3QgY2xvbmUgdGhlbSBhbmQgYWRkIHRvIHRoZSBjbGFzcy4KLQkJCQkJZG9BZGRUb0VuZChjZCwgZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIGZlYXR1cmUuZUNvbnRhaW5lcigpKSwgZmVhdHVyZS5lQ29udGFpbmluZ0ZlYXR1cmUoKSwgZmVhdHVyZSwgdHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVDoKLQkJCQkJLy8gTmVpdGhlciB0aGUgZmVhdHVyZSBub3IgdGhlIGRlY29yYXRvciBhcmUgaW1wbGljaXQuIFNvIG5lZWQgdG8gZG8gYXBwbGllcyBhZ2FpbnN0IHRoZW0uCi0JCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBwZCksIHBkLCBpbmRleGVkKTsKLQkJCQkJYnVpbGROb25JbXBsaWNpdENoYW5nZShjZCwgZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIGZlYXR1cmUpLCBmZWF0dXJlLCBpbmRleGVkKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSByZWNvcmQgZm9yIHRoZSBldmVudCBzZXQgZGVjb3JhdG9yLiBFaXRoZXIgaXQgaXMgYW4gYWRkIG9mIGEgbmV3IGV2ZW50IHNldCBkZWNvcmF0b3Igb3IgaXQgaXMgdGhlIHNldHRpbmcgb2YgdGhlIGltcGxpY2l0Ci0JICogc2V0dGluZ3Mgb24gYW4gbm9uLWltcGxpY2l0IGV2ZW50IHNldCBkZWNvcmF0b3IuIFRoZSBzYW1lIGlzIHRydWUgb2YgdGhlIGZlYXR1cmUgdGhhdCBpdCBkZWNvcmF0ZXMuIEl0IG1heSBiZSBuZXcgb3IgaXQgbWF5IGJlIGFuIGV4aXN0aW5nIG9uZS4KLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gZWQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnVpbGRDaGFuZ2UoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIEV2ZW50U2V0RGVjb3JhdG9yIGVkKSB7Ci0JCS8vIE9ubHkgYnVpbGQgY2hhbmdlcyBpZiBtZXJnZSBpbnRyb3NwZWN0aW9uLiBJZiBub3QgbWVyZ2UgdGhlbiB0aGVyZSBhcmUgbm8gY2hhbmdlcy4KLQkJaWYgKGVkLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpIHsKLQkJCUphdmFFdmVudCBldmVudCA9IChKYXZhRXZlbnQpIGVkLmdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCXN3aXRjaCAoZWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkuZ2V0VmFsdWUoKSkgewotCQkJCWNhc2UgSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUjoKLQkJCQkJLy8gVGhlIGRlY29yYXRvciBpcyBpbXBsaWNpdCwgc28gY2xvbmUgaXQsIGFuZCBhcHBseSB0byBmZWF0dXJlLCBhbmQgdGhlbiBkbyB0aGUgc3RhbmRhcmQgcHJvcGVydHkgYXBwbGllcyB0byB0aGUgZmVhdHVyZS4KLQkJCQkJTGlzdCBmY3MgPSBnZXRGZWF0dXJlQ2hhbmdlTGlzdChjZCwgZXZlbnQpOwotCQkJCQlkb0FkZFRvRW5kKGNkLCBmY3MsIGVkLmVDb250YWluaW5nRmVhdHVyZSgpLCBlZCwgdHJ1ZSk7Ci0JCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgZXZlbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkU6Ci0JCQkJCS8vIFRoZSBkZWNvcmF0b3IgQU5EIGZlYXR1cmUgYXJlIGltcGxpY2l0LiBKdXN0IGNsb25lIHRoZW0gYW5kIGFkZCB0byB0aGUgY2xhc3MuCi0JCQkJCWRvQWRkVG9FbmQoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBldmVudC5lQ29udGFpbmVyKCkpLCBldmVudC5lQ29udGFpbmluZ0ZlYXR1cmUoKSwgZXZlbnQsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVQ6Ci0JCQkJCS8vIE5laXRoZXIgdGhlIGZlYXR1cmUgbm9yIHRoZSBkZWNvcmF0b3IgYXJlIGltcGxpY2l0LiBTbyBuZWVkIHRvIGRvIGFwcGxpZXMgYWdhaW5zdCB0aGVtLgotCQkJCQlidWlsZE5vbkltcGxpY2l0Q2hhbmdlKGNkLCBnZXRGZWF0dXJlQ2hhbmdlTGlzdChjZCwgZWQpLCBlZCk7Ci0JCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBldmVudCksIGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIHJlY29yZCBmb3IgdGhlIG1ldGhvZCBkZWNvcmF0b3IuIEVpdGhlciBpdCBpcyBhbiBhZGQgb2YgYSBuZXcgbWV0aG9kIGRlY29yYXRvciBvciBpdCBpcyB0aGUgc2V0dGluZyBvZiB0aGUgaW1wbGljaXQKLQkgKiBzZXR0aW5ncyBvbiBhbiBub24taW1wbGljaXQgbWV0aG9kIGRlY29yYXRvci4gVGhlIHNhbWUgaXMgdHJ1ZSBvZiB0aGUgb3BlcmF0aW9uIHRoYXQgaXQgZGVjb3JhdGVzLiBJdCBtYXkgYmUgbmV3IG9yIGl0IG1heSBiZSBhbiBleGlzdGluZyBvbmUuCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIG1kCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkQ2hhbmdlKENoYW5nZURlc2NyaXB0aW9uIGNkLCBNZXRob2REZWNvcmF0b3IgbWQpIHsKLQkJLy8gT25seSBkbyBhbnkgYnVpbGRzIGlmIG1lcmdlIGludHJvc3BlY3Rpb24uIElmIG5vdCBtZXJnZSBpbnRyb3NwZWN0aW9uIHRoZW4gbm90aGluZyBzaG91bGQgYmUgY2hhbmdlZC4KLQkJaWYgKG1kLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpIHsKLQkJCUVPcGVyYXRpb24gb3BlciA9IChFT3BlcmF0aW9uKSBtZC5nZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQlzd2l0Y2ggKG1kLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpLmdldFZhbHVlKCkpIHsKLQkJCQljYXNlIEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1I6Ci0JCQkJCS8vIFRoZSBkZWNvcmF0b3IgaXMgaW1wbGljaXQsIHNvIGNsb25lIGl0LCBhbmQgYXBwbHkgdG8gZmVhdHVyZSwgYW5kIHRoZW4gZG8gdGhlIHN0YW5kYXJkIHByb3BlcnR5IGFwcGxpZXMgdG8gdGhlIGZlYXR1cmUuCi0JCQkJCUxpc3QgZmNzID0gZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIG9wZXIpOwotCQkJCQlkb0FkZFRvRW5kKGNkLCBmY3MsIG1kLmVDb250YWluaW5nRmVhdHVyZSgpLCBtZCwgdHJ1ZSk7Ci0JCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgb3Blcik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRToKLQkJCQkJLy8gVGhlIGRlY29yYXRvciBBTkQgZmVhdHVyZSBhcmUgaW1wbGljaXQuIEp1c3QgY2xvbmUgdGhlbSBhbmQgYWRkIHRvIHRoZSBjbGFzcy4KLQkJCQkJZG9BZGRUb0VuZChjZCwgZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIG9wZXIuZUNvbnRhaW5lcigpKSwgb3Blci5lQ29udGFpbmluZ0ZlYXR1cmUoKSwgb3BlciwgdHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVDoKLQkJCQkJLy8gTmVpdGhlciB0aGUgZmVhdHVyZSBub3IgdGhlIGRlY29yYXRvciBhcmUgaW1wbGljaXQuIFNvIG5lZWQgdG8gZG8gYXBwbGllcyBhZ2FpbnN0IHRoZW0uCi0JCQkJCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGdldEZlYXR1cmVDaGFuZ2VMaXN0KGNkLCBtZCksIG1kKTsKLQkJCQkJYnVpbGROb25JbXBsaWNpdENoYW5nZShjZCwgZ2V0RmVhdHVyZUNoYW5nZUxpc3QoY2QsIG9wZXIpLCBvcGVyKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlciBaRVJPID0gbmV3IEludGVnZXIoMCk7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlciBPTkUgPSBuZXcgSW50ZWdlcigxKTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIE1JTlVTX09ORSA9IG5ldyBJbnRlZ2VyKC0xKTsKLQkKLQkvKioKLQkgKiBCdWlsZCB0aGUgbm9uLWltcGxpY2l0IGNoYW5nZXMgaW50byB0aGUgZmVhdHVyZS4gVGhpcyBjcmVhdGVzIGNoYW5nZXMgZm9yIHRoZSBpbXBsaWNpdCBzZXR0aW5ncwotCSAqIHRoYXQgYWx3YXlzIG9jY3VyIGZvciBhIHByb3BlcnR5IGRlY29yYXRvci4KLQkgKiAgCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGZjcyBGZWF0dXJlQ2hhbmdlcyBsaXN0IGZvciB0aGUgZmVhdHVyZS4KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleGVkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgZm9yIGFuIGluZGV4ZWQgZmVhdHVyZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYnVpbGROb25JbXBsaWNpdENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTGlzdCBmY3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBib29sZWFuIGluZGV4ZWQpIHsKLQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSwgZmVhdHVyZS5nZXROYW1lKCksIGZhbHNlKTsKLQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RydWN0dXJhbEZlYXR1cmVfVHJhbnNpZW50KCksIEJvb2xlYW4uRkFMU0UsIGZhbHNlKTsKLQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RydWN0dXJhbEZlYXR1cmVfVm9sYXRpbGUoKSwgQm9vbGVhbi5GQUxTRSwgZmFsc2UpOwotCQlkb1NldChjZCwgZmNzLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZV9DaGFuZ2VhYmxlKCksIEJvb2xlYW4udmFsdWVPZihmZWF0dXJlLmlzQ2hhbmdlYWJsZSgpKSwgZmFsc2UpOwotCQlkb1NldChjZCwgZmNzLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVUeXBlZEVsZW1lbnRfRVR5cGUoKSwgZmVhdHVyZS5nZXRFVHlwZSgpLCBmYWxzZSk7Ci0JCWlmICghaW5kZXhlZCkgewotCQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFVHlwZWRFbGVtZW50X0xvd2VyQm91bmQoKSwgWkVSTywgZmFsc2UpOwotCQkJZG9TZXQoY2QsIGZjcywgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFVHlwZWRFbGVtZW50X1VwcGVyQm91bmQoKSwgT05FLCBmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkb1NldChjZCwgZmNzLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVUeXBlZEVsZW1lbnRfTG93ZXJCb3VuZCgpLCBaRVJPLCBmYWxzZSk7Ci0JCQlkb1NldChjZCwgZmNzLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVUeXBlZEVsZW1lbnRfVXBwZXJCb3VuZCgpLCBNSU5VU19PTkUsIGZhbHNlKTsKLQkJCWRvU2V0KGNkLCBmY3MsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVR5cGVkRWxlbWVudF9VbmlxdWUoKSwgQm9vbGVhbi5UUlVFLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgbm9uLWltcGxpY2l0IGNoYW5nZXMgaW50byB0aGUgZXZlbnQuIFRoaXMgY3JlYXRlcyBjaGFuZ2VzIGZvciB0aGUgaW1wbGljaXQgc2V0dGluZ3MKLQkgKiB0aGF0IGFsd2F5cyBvY2N1ciBmb3IgYW4gZXZlbnQgc2V0IGRlY29yYXRvci4KLQkgKiAgCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGZjcyBGZWF0dXJlQ2hhbmdlcyBsaXN0IGZvciB0aGUgZmVhdHVyZS4KLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYnVpbGROb25JbXBsaWNpdENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTGlzdCBmY3MsIEphdmFFdmVudCBldmVudCkgewotCQlkb1NldChjZCwgZmNzLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpLCBldmVudC5nZXROYW1lKCksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgbm9uLWltcGxpY2l0IGNoYW5nZXMgaW50byB0aGUgb3BlcmF0aW9uLiBUaGlzIGNyZWF0ZXMgY2hhbmdlcyBmb3IgdGhlIGltcGxpY2l0IHNldHRpbmdzCi0JICogdGhhdCBhbHdheXMgb2NjdXIgZm9yIGFuIG1ldGhvZCBkZWNvcmF0b3IuCi0JICogIAotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBmY3MgRmVhdHVyZUNoYW5nZXMgbGlzdCBmb3IgdGhlIGZlYXR1cmUuCi0JICogQHBhcmFtIG9wZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYnVpbGROb25JbXBsaWNpdENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTGlzdCBmY3MsIEVPcGVyYXRpb24gb3BlcikgewotCQlkb1NldChjZCwgZmNzLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpLCBvcGVyLmdldE5hbWUoKSwgZmFsc2UpOwotCQl0cnkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQcm94eV9NZXRob2QoKSwgKChNZXRob2RQcm94eSkgb3BlcikuZ2V0TWV0aG9kKCksIGZhbHNlKTsJLy8gVGhpcyBpcyBhIG1ldGhvZCB0aGF0IGlzIG5vdCBpbiB0aGlzIHJlc291cmNlLCBzbyBubyBjbG9uZS4KLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIEl0IHdpbGwgYmUgYSBNZXRob2RQcm94eSA5OS45JSBvZiB0aGUgdGltZSwgc28gc2F2ZSBieSBub3QgZG9pbmcgaW5zdGFuY2VvZi4KLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHVwIHRoZSBjaGFuZ2VzIGZvciBhIG5vbi1pbXBsaWNpdCBmZWF0dXJlIGRlY29yYXRvci4gVGhpcyBtZWFucyBjcmVhdGUgY2hhbmdlcyBmb3IgaW1wbGljaXQgc2V0IGZlYXR1cmVzLgotCSAqIAotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBmY3MKLQkgKiAgICAgICAgICAgIHRoZSBGZWF0dXJlQ2hhbmdlcyBsaXN0IGZvciB0aGUgZ2l2ZW4gZGVjb3JhdG9yLgotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBidWlsZE5vbkltcGxpY2l0Q2hhbmdlKENoYW5nZURlc2NyaXB0aW9uIGNkLCBMaXN0IGZjcywgRmVhdHVyZURlY29yYXRvciBkZWNvcikgewotCQlsb25nIGltcGxpY2l0U2V0dGluZ3MgPSBkZWNvci5nZXRJbXBsaWNpdGx5U2V0Qml0cygpOwotCQlpZiAoaW1wbGljaXRTZXR0aW5ncyAhPSAwKQotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0bHlTZXRCaXRzKCksIG5ldyBMb25nKGltcGxpY2l0U2V0dGluZ3MpLCBmYWxzZSk7Ci0JCQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0RJU1BMQVlOQU1FX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfRGlzcGxheU5hbWUoKSwgZGVjb3IuZ2V0RGlzcGxheU5hbWUoKSwgZmFsc2UpOwotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfU0hPUlRERVNDX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfU2hvcnREZXNjcmlwdGlvbigpLCBkZWNvci5nZXRTaG9ydERlc2NyaXB0aW9uKCksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX0NBVEVHT1JZX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfQ2F0ZWdvcnkoKSwgZGVjb3IuZ2V0Q2F0ZWdvcnkoKSwgZmFsc2UpOwotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfRVhQRVJUX0lNUExJQ0lUKSAhPSAwICYmIGRlY29yLmlzU2V0RXhwZXJ0KCkpIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmVhdHVyZURlY29yYXRvcl9FeHBlcnQoKSwgQm9vbGVhbi52YWx1ZU9mKGRlY29yLmlzRXhwZXJ0KCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRmVhdHVyZURlY29yYXRvckltcGwuRkVBVFVSRV9ISURERU5fSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRIaWRkZW4oKSkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRGZWF0dXJlRGVjb3JhdG9yX0hpZGRlbigpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNIaWRkZW4oKSksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5GRUFUVVJFX1BSRUZFUlJFRF9JTVBMSUNJVCkgIT0gMCAmJiBkZWNvci5pc1NldFByZWZlcnJlZCgpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfUHJlZmVycmVkKCksIEJvb2xlYW4udmFsdWVPZihkZWNvci5pc1ByZWZlcnJlZCgpKSwgZmFsc2UpOwotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEZlYXR1cmVEZWNvcmF0b3JJbXBsLkZFQVRVUkVfQVRUUklCVVRFU19JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9BZGRBbGxUb0VuZChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEZlYXR1cmVEZWNvcmF0b3JfQXR0cmlidXRlcygpLCBkZWNvci5nZXRBdHRyaWJ1dGVzKCksIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdXAgdGhlIGNoYW5nZXMgZm9yIGEgbm9uLWltcGxpY2l0IGJlYW4gZGVjb3JhdG9yLiBUaGlzIG1lYW5zIGNyZWF0ZSBjaGFuZ2VzIGZvciBpbXBsaWNpdCBzZXQgZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGZjcwotCSAqICAgICAgICAgICAgdGhlIEZlYXR1cmVDaGFuZ2VzIGxpc3QgZm9yIHRoZSBnaXZlbiBkZWNvcmF0b3IuCi0JICogQHBhcmFtIGRlY29yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoQ2hhbmdlRGVzY3JpcHRpb24gY2QsIExpc3QgZmNzLCBCZWFuRGVjb3JhdG9yIGRlY29yKSB7Ci0JCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yKTsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgQmVhbkRlY29yYXRvckltcGwuQkVBTl9DVVNUT01JWkVSX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfQ3VzdG9taXplckNsYXNzKCksIGRlY29yLmdldEN1c3RvbWl6ZXJDbGFzcygpLCBmYWxzZSk7IC8vIEN1c3RvbWl6ZXIgY2xhc3MgaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgLy8gbm90IGluIHRoaXMgcmVzb3VyY2UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIC8vIHNvIHdlIGRvbid0IGNsb25lIGl0LgotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEJlYW5EZWNvcmF0b3JJbXBsLkJFQU5fTUVSR0VfSU5IRVJJVEVEX1BST1BFUlRJRVNfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRNZXJnZVN1cGVyUHJvcGVydGllcygpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlclByb3BlcnRpZXMoKSwgQm9vbGVhbi52YWx1ZU9mKGRlY29yLmlzTWVyZ2VTdXBlclByb3BlcnRpZXMoKSksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBCZWFuRGVjb3JhdG9ySW1wbC5CRUFOX01FUkdFX0lOSEVSSVRFRF9PUEVSQVRJT05TX0lNUExJQ0lUKSAhPSAwICYmIGRlY29yLmlzU2V0TWVyZ2VTdXBlck1ldGhvZHMoKSkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJNZXRob2RzKCksIEJvb2xlYW4udmFsdWVPZihkZWNvci5pc01lcmdlU3VwZXJNZXRob2RzKCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgQmVhbkRlY29yYXRvckltcGwuQkVBTl9NRVJHRV9JTkhFUklURURfRVZFTlRTX0lNUExJQ0lUKSAhPSAwICYmIGRlY29yLmlzU2V0TWVyZ2VTdXBlckV2ZW50cygpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlckV2ZW50cygpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNNZXJnZVN1cGVyRXZlbnRzKCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKCFkZWNvci5nZXROb3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCkuaXNFbXB0eSgpKSB7Ci0JCQlkb0FkZEFsbFRvRW5kKGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCksIGRlY29yLmdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSwgZmFsc2UpOwotCQl9Ci0JCWlmICghZGVjb3IuZ2V0Tm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKS5pc0VtcHR5KCkpIHsKLQkJCWRvQWRkQWxsVG9FbmQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCksIGRlY29yLmdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCksIGZhbHNlKTsKLQkJfQotCQlpZiAoIWRlY29yLmdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKS5pc0VtcHR5KCkpIHsKLQkJCWRvQWRkQWxsVG9FbmQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSwgZGVjb3IuZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB1cCB0aGUgY2hhbmdlcyBmb3IgYSBub24taW1wbGljaXQgcHJvcGVydHkgZGVjb3JhdG9yLiBUaGlzIG1lYW5zIGNyZWF0ZSBjaGFuZ2VzIGZvciBpbXBsaWNpdCBzZXQgZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGZjcwotCSAqICAgICAgICAgICAgdGhlIEZlYXR1cmVDaGFuZ2VzIGxpc3QgZm9yIHRoZSBnaXZlbiBkZWNvcmF0b3IuCi0JICogQHBhcmFtIGRlY29yCi0JICogQHBhcmFtIGluZGV4ZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhbiBpbmRleGVkIHByb3BlcnR5IGRlY29yYXRvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYnVpbGROb25JbXBsaWNpdENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTGlzdCBmY3MsIFByb3BlcnR5RGVjb3JhdG9yIGRlY29yLCBib29sZWFuIGluZGV4ZWQpIHsKLQkJYnVpbGROb25JbXBsaWNpdENoYW5nZShjZCwgZmNzLCBkZWNvcik7Ci0JCWxvbmcgaW1wbGljaXRTZXR0aW5ncyA9IGRlY29yLmdldEltcGxpY2l0bHlTZXRCaXRzKCk7Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9FRElUT1JfQ0xBU1NfSU1QTElDSVQpICE9IDApIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfUHJvcGVydHlFZGl0b3JDbGFzcygpLCBkZWNvci5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCksIGZhbHNlKTsgLy8gUHJvcGVydHkgRWRpdG9yIGNsYXNzIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIC8vIG5vdCBpbiB0aGlzIHJlc291cmNlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAvLyBzbyB3ZSBkb24ndCBjbG9uZSBpdC4KLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfUkVBRE1FVEhPRF9JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9SZWFkTWV0aG9kKCksIGRlY29yLmdldFJlYWRNZXRob2QoKSwgZmFsc2UpOyAKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfV1JJVEVNRVRIT0RfSU1QTElDSVQpICE9IDApIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfV3JpdGVNZXRob2QoKSwgZGVjb3IuZ2V0V3JpdGVNZXRob2QoKSwgZmFsc2UpOyAKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfRklFTERfSU1QTElDSVQpICE9IDApIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGQoKSwgZGVjb3IuZ2V0RmllbGQoKSwgZmFsc2UpOyAKLQkJCWlmIChkZWNvci5lSXNTZXQoQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZFJlYWRPbmx5KCkpKQotCQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGRSZWFkT25seSgpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNGaWVsZFJlYWRPbmx5KCkpLCBmYWxzZSk7Ci0JCX0JCQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBQcm9wZXJ0eURlY29yYXRvckltcGwuUFJPUEVSVFlfQk9VTkRfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRCb3VuZCgpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yX0JvdW5kKCksIEJvb2xlYW4udmFsdWVPZihkZWNvci5pc0JvdW5kKCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgUHJvcGVydHlEZWNvcmF0b3JJbXBsLlBST1BFUlRZX0NPTlNUUkFJTkVEX0lNUExJQ0lUKSAhPSAwICYmIGRlY29yLmlzU2V0Q29uc3RyYWluZWQoKSkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eURlY29yYXRvcl9Db25zdHJhaW5lZCgpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNDb25zdHJhaW5lZCgpKSwgZmFsc2UpOwotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIFByb3BlcnR5RGVjb3JhdG9ySW1wbC5QUk9QRVJUWV9ERVNJR05USU1FX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldFByb3BlcnR5RGVjb3JhdG9yX0Rlc2lnblRpbWUoKSwgQm9vbGVhbi52YWx1ZU9mKGRlY29yLmlzRGVzaWduVGltZSgpKSwgZmFsc2UpOwotCQl9Ci0JCQotCQlpZiAoaW5kZXhlZCkgewotCQkJSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIGlwZCA9IChJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpIGRlY29yOwotCQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbC5JTkRFWEVEX1JFQURNRVRIT0RfSU1QTElDSVQpICE9IDApIHsKLQkJCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkUmVhZE1ldGhvZCgpLCBpcGQuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSwgZmFsc2UpOyAKLQkJCX0KLQkJCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuSU5ERVhFRF9XUklURU1FVEhPRF9JTVBMSUNJVCkgIT0gMCkgewotCQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRXcml0ZU1ldGhvZCgpLCBpcGQuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCksIGZhbHNlKTsgCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgdXAgdGhlIGNoYW5nZXMgZm9yIGEgbm9uLWltcGxpY2l0IGV2ZW50IHNldCBkZWNvcmF0b3IuIFRoaXMgbWVhbnMgY3JlYXRlIGNoYW5nZXMgZm9yIGltcGxpY2l0IHNldCBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gZmNzCi0JICogICAgICAgICAgICB0aGUgRmVhdHVyZUNoYW5nZXMgbGlzdCBmb3IgdGhlIGdpdmVuIGRlY29yYXRvci4KLQkgKiBAcGFyYW0gZGVjb3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYnVpbGROb25JbXBsaWNpdENoYW5nZShDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgTGlzdCBmY3MsIEV2ZW50U2V0RGVjb3JhdG9yIGRlY29yKSB7Ci0JCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yKTsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0FERExJU1RFTkVSTUVUSE9EX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0FkZExpc3RlbmVyTWV0aG9kKCksIGRlY29yLmdldEFkZExpc3RlbmVyTWV0aG9kKCksIGZhbHNlKTsgLy8gbGlzdGVuZXIgbWV0aG9kIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIC8vIG5vdCBpbiB0aGlzIHJlc291cmNlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAvLyBzbyB3ZSBkb24ndCBjbG9uZSBpdC4KLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfQURBUFRFUkNMQVNTX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0V2ZW50QWRhcHRlckNsYXNzKCksIGRlY29yLmdldEV2ZW50QWRhcHRlckNsYXNzKCksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfTElTVEVORVJNRVRIT0RTX0lNUExJQ0lUKSAhPSAwKSB7Ci0JCQlkb0FkZEFsbFRvRW5kKGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfU2VyTGlzdE10aGQoKSwgZGVjb3IuZ2V0U2VyTGlzdE10aGQoKSwgdHJ1ZSk7CS8vIFRoZXNlIG5lZWQgdG8gYmUgY2xvbmVkIGJlY2F1c2UgdGhleSBhcmUgY29udGFpbmVkIGhlcmUuCi0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9TZXQoY2QsIGZjcywgQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lclR5cGUoKSwgZGVjb3IuZ2V0TGlzdGVuZXJUeXBlKCksIGZhbHNlKTsKLQkJfQotCQlpZiAoKGltcGxpY2l0U2V0dGluZ3MgJiBFdmVudFNldERlY29yYXRvckltcGwuRVZFTlRfUkVNT1ZFTElTVEVORVJNRVRIT0RfSU1QTElDSVQpICE9IDApIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfUmVtb3ZlTGlzdGVuZXJNZXRob2QoKSwgZGVjb3IuZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKSwgZmFsc2UpOwotCQl9Ci0JCWlmICgoaW1wbGljaXRTZXR0aW5ncyAmIEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5FVkVOVF9ERUZBVUxURVZFTlRTRVRfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRJbkRlZmF1bHRFdmVudFNldCgpKSB7Ci0JCQlkb1NldChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX0luRGVmYXVsdEV2ZW50U2V0KCksIEJvb2xlYW4udmFsdWVPZihkZWNvci5pc0luRGVmYXVsdEV2ZW50U2V0KCkpLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgRXZlbnRTZXREZWNvcmF0b3JJbXBsLkVWRU5UX1VOSUNBU1RfSU1QTElDSVQpICE9IDAgJiYgZGVjb3IuaXNTZXRVbmljYXN0KCkpIHsKLQkJCWRvU2V0KGNkLCBmY3MsIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXZlbnRTZXREZWNvcmF0b3JfVW5pY2FzdCgpLCBCb29sZWFuLnZhbHVlT2YoZGVjb3IuaXNVbmljYXN0KCkpLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB1cCB0aGUgY2hhbmdlcyBmb3IgYSBub24taW1wbGljaXQgbWV0aG9kIGRlY29yYXRvci4gVGhpcyBtZWFucyBjcmVhdGUgY2hhbmdlcyBmb3IgaW1wbGljaXQgc2V0IGZlYXR1cmVzLgotCSAqIAotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBmY3MKLQkgKiAgICAgICAgICAgIHRoZSBGZWF0dXJlQ2hhbmdlcyBsaXN0IGZvciB0aGUgZ2l2ZW4gZGVjb3JhdG9yLgotCSAqIEBwYXJhbSBkZWNvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBidWlsZE5vbkltcGxpY2l0Q2hhbmdlKENoYW5nZURlc2NyaXB0aW9uIGNkLCBMaXN0IGZjcywgTWV0aG9kRGVjb3JhdG9yIGRlY29yKSB7Ci0JCWJ1aWxkTm9uSW1wbGljaXRDaGFuZ2UoY2QsIGZjcywgKEZlYXR1cmVEZWNvcmF0b3IpIGRlY29yKTsKLQkJbG9uZyBpbXBsaWNpdFNldHRpbmdzID0gZGVjb3IuZ2V0SW1wbGljaXRseVNldEJpdHMoKTsKLQkJaWYgKChpbXBsaWNpdFNldHRpbmdzICYgTWV0aG9kRGVjb3JhdG9ySW1wbC5NRVRIT0RfUEFSQU1FVEVSU19JTVBMSUNJVCkgIT0gMCkgewotCQkJZG9BZGRBbGxUb0VuZChjZCwgZmNzLCBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZERlY29yYXRvcl9TZXJQYXJtRGVzYygpLCBkZWNvci5nZXRTZXJQYXJtRGVzYygpLCB0cnVlKTsgCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgZmVhdHVyZSBjaGFuZ2UgbGlzdCBmb3IgYW4gb2JqZWN0LiBDcmVhdGUgaXQgb25lIGlmIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBmZWF0dXJlIGNoYW5nZSBsaXN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRGZWF0dXJlQ2hhbmdlTGlzdChDaGFuZ2VEZXNjcmlwdGlvbiBjZCwgRU9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBmY3MgPSAoTGlzdCkgY2QuZ2V0T2JqZWN0Q2hhbmdlcygpLmdldChvYmplY3QpOyAvLyBHZXQgdGhlIGZlYXR1cmUgY2hhbmdlcyBpZiBhbnkuCi0JCWlmIChmY3MgPT0gbnVsbCkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gQ2hhbmdlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRU9iamVjdFRvQ2hhbmdlc01hcEVudHJ5KG9iamVjdCk7Ci0JCQljZC5nZXRPYmplY3RDaGFuZ2VzKCkuYWRkKGVudHJ5KTsKLQkJCWZjcyA9IChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmY3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBGZWF0dXJlQ2hhbmdlIHJlY29yZCBmb3IgYSBmZWF0dXJlIHdydC9vYmplY3QuIENyZWF0ZSBvbmUgaWYgbmVjZXNzYXJ5LiBJZiBpdCBjcmVhdGVzIGl0LCBpdCB3aWxsIG1hcmsgaXQgYXMgInNldCIuIEFsbCBvZiBvdXIKLQkgKiBjaGFuZ2VzIGhlcmUgYXJlIHNldCBraW5kIG9mIGNoYW5nZXMsIG5vdCB1bnNldCBraW5kLgotCSAqIAotCSAqIEBwYXJhbSBmY3MKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgY2hhbmdlIGxpc3QgZnJvbSB0aGUgQ2hhbmdlRGVzY3JpcGlvbi5nZXRPYmplY3RDaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybiBmZWF0dXJlIGNoYW5nZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRmVhdHVyZUNoYW5nZSBnZXRGZWF0dXJlQ2hhbmdlKExpc3QgZmNzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoIWZjcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmNzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRmVhdHVyZUNoYW5nZSBmYyA9IChGZWF0dXJlQ2hhbmdlKSBmY3MuZ2V0KGkpOwotCQkJCWlmIChmYy5nZXRGZWF0dXJlKCkgPT0gZmVhdHVyZSkKLQkJCQkJcmV0dXJuIGZjOwotCQkJfQotCQl9Ci0KLQkJLy8gRWl0aGVyIG5ldyBvYmplY3QgY2hhbmdlcyBvciBubyBmZWF0dXJlIGNoYW5nZSBmb3VuZC4gQ3JlYXRlIG9uZS4KLQkJRmVhdHVyZUNoYW5nZSBmYyA9IENoYW5nZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZlYXR1cmVDaGFuZ2UoZmVhdHVyZSwgbnVsbCwgdHJ1ZSk7Ci0JCWZjcy5hZGQoZmMpOwotCQlyZXR1cm4gZmM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY2hhbmdlIGZvciBhZGQgdG8gZW5kIG9mIHRoZSBnaXZlbiBmZWF0dXJlIChtdXN0IGJlIGlzTWFueSgpKS4gSWYgbmV3T2JqZWN0IGlzIHRydWUsIHRoZW4gdGhpcyBtZWFucyB0aGlzIGlzIG5vdCBhIHBvaW50ZXIgdG8gYW4KLQkgKiBleGlzdGluZyBvYmplY3QgYW5kIHNvIGl0IG11c3QgYmUgY2xvbmVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBmdXJ0aGVyIGNoYW5nZXMgdG8gdGhpcyBvYmplY3QgYmVjYXVzZSB0aG9zZSB3aWxsIG5vdCBiZSBrbm93bgotCSAqIGFib3V0LgotCSAqIAotCSAqIEBwYXJhbSBjZAotCSAqIEBwYXJhbSBmY3MKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgY2hhbmdlIGxpc3QgZnJvbSB0aGUgQ2hhbmdlRGVzY3JpcGlvbi5nZXRPYmplY3RDaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSBiZWluZyBhZGRlZCB0by4KLQkgKiBAcGFyYW0gYWRkZWRWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIGJlaW5nIGFkZGVkLgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbmV3IG9iamVjdCBpbiB0aGUgcmVzb3VyY2UsIGEgY2xvbmUgd2lsbCBiZSBtYWRlLiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYW4gZXhpc3Rpbmcgb2JqZWN0LiBNdXN0IGJlIGFuCi0JICogICAgICAgICAgICBFT2JqZWN0IGZvciBjbG9uaW5nLiBCZXN0IGlmIG5vdCB0cnVlIGZvciBub24tZW9iamVjdHMuCi0JICogQHJldHVybiB0aGUgYWRkZWRWYWx1ZSBvciB0aGUgY2xvbmUgaWYgaXQgd2FzIGNsb25lZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBkb0FkZFRvRW5kKENoYW5nZURlc2NyaXB0aW9uIGNkLCBMaXN0IGZjcywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBhZGRlZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCUZlYXR1cmVDaGFuZ2UgZmMgPSBnZXRGZWF0dXJlQ2hhbmdlKGZjcywgZmVhdHVyZSk7Ci0JCWlmIChuZXdWYWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlhZGRlZFZhbHVlID0gRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIGFkZGVkVmFsdWUpOwotCQkJCWNkLmdldE9iamVjdHNUb0F0dGFjaCgpLmFkZChhZGRlZFZhbHVlKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gTm9ybWFsbHkgc2hvdWxkIG5vdCBvY2N1ciwgYnV0IGlmIGl0IGRvZXMsIGl0IG1lYW5zIHdlIGNhbid0IGNsb25lLCBzbyBkb24ndCBjbG9uZS4KLQkJCX0KLQkJfQotCQlMaXN0IGxjcyA9IGZjLmdldExpc3RDaGFuZ2VzKCk7Ci0JCS8vIEZpbmQgdGhlIG9uZSB3aXRoIGFkZCBhbmQgLTEsIGkuZS4gYWRkIHRvIGVuZC4gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lLgotCQlMaXN0Q2hhbmdlIGxjID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsY3Muc2l6ZSgpOyBpKyspIHsKLQkJCUxpc3RDaGFuZ2UgbGNhID0gKExpc3RDaGFuZ2UpIGxjcy5nZXQoaSk7Ci0JCQlpZiAobGNhLmdldEtpbmQoKSA9PSBDaGFuZ2VLaW5kLkFERF9MSVRFUkFMICYmIGxjYS5nZXRJbmRleCgpID09IC0xKSB7Ci0JCQkJbGMgPSBsY2E7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxjID09IG51bGwpIHsKLQkJCWxjID0gQ2hhbmdlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGlzdENoYW5nZSgpOwotCQkJbGNzLmFkZChsYyk7Ci0JCX0KLQotCQlsYy5nZXRWYWx1ZXMoKS5hZGQoYWRkZWRWYWx1ZSk7Ci0JCXJldHVybiBhZGRlZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGNoYW5nZSBmb3IgYWRkIGFsbCB0byBlbmQgb2YgdGhlIGdpdmVuIGZlYXR1cmUgKG11c3QgYmUgaXNNYW55KCkpLiBJZiBuZXdWYWx1ZSBpcyB0cnVlLCB0aGVuIHRoaXMgbWVhbnMgdGhpcyBpcyBub3QgYSBwb2ludGVyIHRvCi0JICogZXhpc3Rpbmcgb2JqZWN0cyBhbmQgc28gaXQgbXVzdCBiZSBjbG9uZWQuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSB3aWxsIGJlIG5vIGZ1cnRoZXIgY2hhbmdlcyB0byB0aGlzIG9iamVjdCBiZWNhdXNlIHRob3NlIHdpbGwgbm90IGJlIGtub3duCi0JICogYWJvdXQuCi0JICogCi0JICogQHBhcmFtIGNkCi0JICogQHBhcmFtIGZjcwotCSAqICAgICAgICAgICAgZmVhdHVyZSBjaGFuZ2UgbGlzdCBmcm9tIHRoZSBDaGFuZ2VEZXNjcmlwaW9uLmdldE9iamVjdENoYW5nZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIGJlaW5nIGFkZGVkIHRvLgotCSAqIEBwYXJhbSBhZGRlZFZhbHVlcwotCSAqICAgICAgICAgICAgdGhlIHZhbHVlcyBiZWluZyBhZGRlZC4KLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5ldyBvYmplY3RzIGluIHRoZSByZXNvdXJjZSwgY2xvbmVzIHdpbGwgYmUgbWFkZS4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGFuIGV4aXN0aW5nIG9iamVjdC4gTXVzdCBiZSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmb3IgY2xvbmluZy4gQmVzdCBpZiBub3QgdHJ1ZSBmb3Igbm9uLWVvYmplY3RzLgotCSAqIEByZXR1cm4gdGhlIGFkZGVkVmFsdWVzIG9yIHRoZSBjbG9uZXMgaWYgaXQgd2FzIGNsb25lZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBkb0FkZEFsbFRvRW5kKENoYW5nZURlc2NyaXB0aW9uIGNkLCBMaXN0IGZjcywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gYWRkZWRWYWx1ZXMsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJRmVhdHVyZUNoYW5nZSBmYyA9IGdldEZlYXR1cmVDaGFuZ2UoZmNzLCBmZWF0dXJlKTsKLQkJaWYgKG5ld1ZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCWFkZGVkVmFsdWVzID0gRWNvcmVVdGlsLmNvcHlBbGwoYWRkZWRWYWx1ZXMpOwotCQkJCWNkLmdldE9iamVjdHNUb0F0dGFjaCgpLmFkZEFsbChhZGRlZFZhbHVlcyk7Ci0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCS8vIE5vcm1hbGx5IHNob3VsZCBub3Qgb2NjdXIsIGJ1dCBpZiBpdCBkb2VzLCBpdCBtZWFucyB3ZSBjYW4ndCBjbG9uZSwgc28gZG9uJ3QgY2xvbmUuCi0JCQl9Ci0JCX0KLQkJTGlzdCBsY3MgPSBmYy5nZXRMaXN0Q2hhbmdlcygpOwotCQkvLyBGaW5kIHRoZSBvbmUgd2l0aCBhZGQgYW5kIC0xLCBpLmUuIGFkZCB0byBlbmQuIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZS4KLQkJTGlzdENoYW5nZSBsYyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGNzLnNpemUoKTsgaSsrKSB7Ci0JCQlMaXN0Q2hhbmdlIGxjYSA9IChMaXN0Q2hhbmdlKSBsY3MuZ2V0KGkpOwotCQkJaWYgKGxjYS5nZXRLaW5kKCkgPT0gQ2hhbmdlS2luZC5BRERfTElURVJBTCAmJiBsY2EuZ2V0SW5kZXgoKSA9PSAtMSkgewotCQkJCWxjID0gbGNhOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChsYyA9PSBudWxsKSB7Ci0JCQlsYyA9IENoYW5nZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpc3RDaGFuZ2UoKTsKLQkJCWxjcy5hZGQobGMpOwotCQl9Ci0KLQkJbGMuZ2V0VmFsdWVzKCkuYWRkQWxsKGFkZGVkVmFsdWVzKTsKLQkJcmV0dXJuIGFkZGVkVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGNoYW5nZSBmb3Igc2V0IGEgZ2l2ZW4gZmVhdHVyZSAobXVzdCBiZSAhaXNNYW55KCkpLiBJZiBuZXdWYWx1ZSBpcyB0cnVlLCB0aGVuIHRoaXMgbWVhbnMgdGhpcyBpcyBub3QgYSBwb2ludGVyIHRvIGFuIGV4aXN0aW5nIG9iamVjdAotCSAqIGFuZCBzbyBpdCBtdXN0IGJlIGNsb25lZC4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gZnVydGhlciBjaGFuZ2VzIHRvIHRoaXMgb2JqZWN0IGJlY2F1c2UgdGhvc2Ugd2lsbCBub3QgYmUga25vd24gYWJvdXQuCi0JICogPHA+Ci0JICogQW55IGZ1cnRoZXIgc2V0cyB0byB0aGlzIGZlYXR1cmUgd2lsbCByZXN1bHQgaW4gdGhlIHByZXZpb3VzIHNldHRpbmcgYmVpbmcgbG9zdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2QKLQkgKiBAcGFyYW0gZmNzCi0JICogICAgICAgICAgICBmZWF0dXJlIGNoYW5nZSBsaXN0IGZyb20gdGhlIENoYW5nZURlc2NyaXBpb24uZ2V0T2JqZWN0Q2hhbmdlcyBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgYmVpbmcgc2V0IHRvLgotCSAqIEBwYXJhbSBzZXRWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIGJlaW5nIHNldC4KLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5ldyBvYmplY3QgaW4gdGhlIHJlc291cmNlLCBhIGNsb25lIHdpbGwgYmUgbWFkZS4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGFuIGV4aXN0aW5nIG9iamVjdC4gTXVzdCBiZSBhbgotCSAqICAgICAgICAgICAgRU9iamVjdCBmb3IgY2xvbmluZy4gQmVzdCBpZiBub3QgdHJ1ZSBmb3Igbm9uLWVvYmplY3RzLgotCSAqIEByZXR1cm4gdGhlIHNldFZhbHVlIG9yIHRoZSBjbG9uZSBpZiBpdCB3YXMgY2xvbmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGRvU2V0KENoYW5nZURlc2NyaXB0aW9uIGNkLCBMaXN0IGZjcywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBzZXRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCi0JCUZlYXR1cmVDaGFuZ2UgZmMgPSBnZXRGZWF0dXJlQ2hhbmdlKGZjcywgZmVhdHVyZSk7Ci0JCWlmIChuZXdWYWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlzZXRWYWx1ZSA9IEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBzZXRWYWx1ZSk7Ci0JCQkJY2QuZ2V0T2JqZWN0c1RvQXR0YWNoKCkuYWRkKHNldFZhbHVlKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gTm9ybWFsbHkgc2hvdWxkIG5vdCBvY2N1ciwgYnV0IGlmIGl0IGRvZXMsIGl0IG1lYW5zIHdlIGNhbid0IGNsb25lLCBzbyBkb24ndCBjbG9uZS4KLQkJCX0KLQkJfQotCi0JCWlmIChzZXRWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlmYy5zZXRSZWZlcmVuY2VWYWx1ZSgoRU9iamVjdCkgc2V0VmFsdWUpOwotCQllbHNlCi0JCQlmYy5zZXREYXRhVmFsdWUoRWNvcmVVdGlsLmNvbnZlcnRUb1N0cmluZygoRURhdGFUeXBlKSBmZWF0dXJlLmdldEVUeXBlKCksIHNldFZhbHVlKSk7Ci0JCXJldHVybiBzZXRWYWx1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzRiOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8wOS8xMyAyMDozMDo0NyAkIAotICovCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLS8qKgotICogQmVhbmluZm9BZGFwdGVyRmFjdG9yeSAtIHRoZSBmYWN0b3J5IGZvciAKLSAqIGJlYW5pbmZvIGludHJvc3BlY3Rpb24gdG8gcG9wdWxhdGUgdGhlIEphdmEgTW9kZWwuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMS8yMDAwIDExOjUyOjU1IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJvdGVjdGVkIElCZWFuaW5mb1N1cHBsaWVyIGZJbmZvU3VwcGxpZXI7Ci0KLQkvLyBNYWludGFpbiBhIG1hcHBpbmcgb2YgdGhlIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBhZGFwdG9ycyB3aGljaCBoYXZlCi0JLy8gaW50cm9zcGVjdGVkIGZyb20gdGhlbS4gIFRoaXMgYWxsb3dzIGEgY2xvc2Ugb3BlcmF0aW9uIHRvIGZvcmNlIHRob3NlCi0JLy8gYWRhcHRlcnMgdG8gY2xlYXIgb3V0IHRoZSBkYXRhLiBJdCBhbHNvIGFsbG93cyBmb3IgbWFya2luZyBhbiBhZGFwdGVyIGFzIHN0YWxlCi0JLy8gc28gdGhhdCBuZXh0IHRpbWUgaXQgaW50cm9zcGVjdHMgaXQgd2lsbCByZS1nZXQgdGhlIGRhdGEuCi0JLy8gCi0JLy8gVGhpcyBpcyBhIFdlYWtSZWZlcmVuY2Ugc28gdGhhdCB3ZSBkb24ndCBob2xkIG9udG8gYWRhcHRlcnMgdGhhdCB3ZXJlCi0JLy8gZXhwbGljaXRseSByZW1vdmVkIGluIG90aGVyIHdheXMuCi0JcHJpdmF0ZSBNYXAgZkludHJvc3BlY3RlZCA9IG5ldyBIYXNoTWFwKCk7CS8vIE5PVEU6IFRoaXMgaXMgdG8gYmUgYWNjZXNzZWQgb25seSB1bmRlciBzeW5jKHRoaXMpIQotCXByaXZhdGUgUmVmZXJlbmNlUXVldWUgZlJlZlEgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXZWFrVmFsdWUgZXh0ZW5kcyBXZWFrUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBPYmplY3Qga2V5OwotCQlwdWJsaWMgV2Vha1ZhbHVlKE9iamVjdCBhS2V5LCBPYmplY3QgdmFsdWUsIFJlZmVyZW5jZVF1ZXVlIHF1ZSkgewotCQkJc3VwZXIodmFsdWUsIHF1ZSk7Ci0JCQlrZXkgPSBhS2V5OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfTsKLQotCXB1YmxpYyBCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5KElCZWFuaW5mb1N1cHBsaWVyIHN1cHBsaWVyKSB7Ci0JCWZJbmZvU3VwcGxpZXIgPSBzdXBwbGllcjsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IElJbnRyb3NwZWN0aW9uQWRhcHRlci5BREFQVEVSX0tFWSkgewotCQkJcmV0dXJuICEodGFyZ2V0IGluc3RhbmNlb2YgQXJyYXlUeXBlKSA/IG5ldyBCZWFuaW5mb0NsYXNzQWRhcHRlcih0aGlzKSA6IG51bGw7CS8vIEFycmF5IHR5cGVzIGRvbid0IGhhdmUgYmVhbmluZm8gYWRhcHRlcnMuCi0JCX0gZWxzZQotCQkJcmV0dXJuIG5ldyBCZWFuaW5mb1N1cGVyQWRhcHRlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIElJbnRyb3NwZWN0aW9uQWRhcHRlci5BREFQVEVSX0tFWSA9PSB0eXBlIHx8IEJlYW5pbmZvU3VwZXJBZGFwdGVyLkFEQVBURVJfS0VZID09IHR5cGU7Ci0JfQkKLQotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZJbmZvU3VwcGxpZXIuZ2V0UmVnaXN0cnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWdpc3RyeUNyZWF0ZWQoKSB7Ci0JCXJldHVybiBmSW5mb1N1cHBsaWVyLmlzUmVnaXN0cnlDcmVhdGVkKCk7Ci0JfQotCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlY3ljbGVSZWdpc3RyeSgpIHsKLQkJbWFya0FsbFN0YWxlKCk7IC8vIEF0IHRoaXMgcG9pbnQgaW4gdGltZSB3ZSBuZWVkIHRvIG1hcmsgdGhlbSBhbGwgc3RhbGUgYmVjYXVzZSB3ZSBhcmUgcmVjeWNsaW5nLiBNYXJrQWxsU3RhbGUgYWxzbyBjbG9zZXMgdGhlIHJlZ2lzdHJ5LgotCQlyZXR1cm4gZ2V0UmVnaXN0cnkoKTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBmSW5mb1N1cHBsaWVyLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldCBnZXROZXdSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIGZJbmZvU3VwcGxpZXIuZ2V0TmV3UmVzb3VyY2VTZXQoKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlU2V0IGdldFByb2plY3RSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIGZJbmZvU3VwcGxpZXIuZ2V0UHJvamVjdFJlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgQUxMIGFkYXB0ZXJzLiBBbHNvIHJlbW92ZSB0aGUgYWRhcHRlcnMgc28gdGhhdCB0aGV5Ci0JICogYXJlIG5vdCBiZWluZyBoZWxkIG9udG8uIFRoaXMgbWVhbnMgd2UgYXJlIGNsb3NpbmcgdGhlIHByb2plY3Qgb3IgcmVtb3ZpbmcgdGhlIG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUFsbChib29sZWFuIGNsZWFyUmVzdWx0cykgewotCQlwcm9jZXNzUXVldWUoKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBXZSBhcmUgZ29pbmcgdG8gYmUgcmVtb3ZpbmcgYWxsIG9mIHRoZW0sIHNvIGp1c3Qgc2V0IGludHJvc3BlY3RlZCB0byBhbiBlbXB0eSBvbmUKLQkJCS8vIGFuZCB1c2UgdGhlIHJlYWwgb25lLiBUaGlzIHdheSB3ZSB3b24ndCBnZXQgY29uY3VycmVudCBtb2RpZmljYXRpb25zIGFzIHdlIHJlbW92ZQotCQkJLy8gaXQgZnJvbSB0aGUgbm90aWZpZXIgcmVtb3ZlQWRhcHRlci4KLQkJCU1hcCBpbnRyID0gZkludHJvc3BlY3RlZDsKLQkJCWZJbnRyb3NwZWN0ZWQgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CS8vIFNpbmNlIHdlIGFyZSBjbG9zaW5nIHdlIGNhbiBrZWVwIHRoZSB1bm1vZGlmaWFibGUgb25lIGhlcmUuCi0JCQlJdGVyYXRvciBpID0gaW50ci52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQmVhbmluZm9DbGFzc0FkYXB0ZXIgYSA9IChCZWFuaW5mb0NsYXNzQWRhcHRlcikgKChXZWFrVmFsdWUpIGkubmV4dCgpKS5nZXQoKTsKLQkJCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQkJCWlmIChjbGVhclJlc3VsdHMpCi0JCQkJCQlhLmNsZWFySW50cm9zcGVjdGlvbigpOwotCQkJCQlOb3RpZmllciBub3RpZmllciA9IGEuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChub3RpZmllciAhPSBudWxsKQotCQkJCQkJbm90aWZpZXIuZUFkYXB0ZXJzKCkucmVtb3ZlKGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNYXJrIGFsbCBzdGFsZSwgYnV0IGxlYXZlIHRoZSBvdmVycmlkZXMgYWxvbmUuIFRoZSBvdmVycmlkZXMgYXJlbid0IHN0YWxlLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHVibGljIHZvaWQgbWFya0FsbFN0YWxlKCkgewotCQltYXJrQWxsU3RhbGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgQUxMIGFkYXB0ZXJzIGFzIHN0YWxlLiBUaGlzIG9jY3VycyBiZWNhdXNlIHdlJ3ZlIHJlY3ljbGVkIHRoZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gY2xlYXJPdmVycmlkZXMgY2xlYXIgdGhlIG92ZXJyaWRlcyB0b28uIFRoaXMgaXMgZnVsbC1mbGVkZ2VkIHN0YWxlLiBUaGUgb3ZlcnJpZGVzIGFyZSBzdGFsZSB0b28uCi0JICovCi0JcHVibGljIHZvaWQgbWFya0FsbFN0YWxlKGJvb2xlYW4gY2xlYXJPdmVycmlkZXMpIHsKLQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgZmFjdCA9IGlzUmVnaXN0cnlDcmVhdGVkKCkgPyBnZXRSZWdpc3RyeSgpIDogbnVsbDsKLQkJcHJvY2Vzc1F1ZXVlKCk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJSXRlcmF0b3IgaSA9IGZJbnRyb3NwZWN0ZWQudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGEgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpICgoV2Vha1ZhbHVlKSBpLm5leHQoKSkuZ2V0KCk7Ci0JCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQkJYS5tYXJrU3RhbGVGYWN0b3J5KGZhY3QsIGNsZWFyT3ZlcnJpZGVzKTsKLQkJCX0KLQkJCWZJbmZvU3VwcGxpZXIuY2xvc2VSZWdpc3RyeSgpOwkvLyBHZXQgcmlkIG9mIHRoZSByZWdpc3RyeSBub3cgc2luY2UgaXQgaXMgbm90IG5lZWRlZC4gVGhpcyB3YXkgd2Ugd29uJ3QgYWNjaWRlbnRpbHkgaG9sZCBvbnRvIGl0IHdoZW4gbm90IG5lZWRlZC4KLQkJfQotCX0KLQkvKioKLQkgKiBNYXJrIHRoZSBpbnRyb3NwZWN0aW9uIGFzIHN0YWxlIGZvciBhIHNvdXJjZSBvYmplY3QuIEFsc28gY2xlYXIgcmVzdWx0cyBpZiB0b2xkIHRvLgotCSAqIEBwYXJhbSBzb3VyY2VOYW1lIEZ1bGx5IHF1YWxpZmllZCBzb3VyY2UgbmFtZSwgdXNlIHR5cGUgZm9yIHJlZmxlY3Rpb24sIGkuZS4gImEuYi5jLkNsYXNzMSRJbm5lckNsYXNzIgotCSAqIEBwYXJhbSBjbGVhclJlc3VsdHMgY2xlYXIgb3V0IHRoZSByZXN1bHRzLiBJZiBmYWxzZSwgdGhleSB3aWxsIGJlIHJldXNlZCBpZiBwb3NzaWJsZSBvbiByZWN5Y2xlLgotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtTdGFsZUludHJvc3BlY3Rpb24oU3RyaW5nIHNvdXJjZU5hbWUsIGJvb2xlYW4gY2xlYXJSZXN1bHRzKSB7Ci0JCXByb2Nlc3NRdWV1ZSgpOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVdlYWtWYWx1ZSByZWYgPSAoV2Vha1ZhbHVlKSBmSW50cm9zcGVjdGVkLmdldChzb3VyY2VOYW1lKTsKLQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGEgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpIHJlZi5nZXQoKTsKLQkJCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQkJCWlmIChjbGVhclJlc3VsdHMpCi0JCQkJCQlhLmNsZWFySW50cm9zcGVjdGlvbigpOwotCQkJCQlhLm1hcmtTdGFsZUZhY3RvcnkoaXNSZWdpc3RyeUNyZWF0ZWQoKSA/IGdldFJlZ2lzdHJ5KCkgOiBudWxsKTsgLy8gTWFyayBpdCBzdGFsZSB3aXRoIHRoZSBjdXJyZW50IHJlZ2lzdHJ5LgotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYXJrU3RhbGVJbnRyb3NwZWN0aW9uUGx1c0lubmVyKFN0cmluZyBzb3VyY2VOYW1lLCBib29sZWFuIGNsZWFyUmVzdWx0cykgewotCQlwcm9jZXNzUXVldWUoKTsKLQkJU3RyaW5nIHNvdXJjZU5hbWVGb3JJbm5lciA9IHNvdXJjZU5hbWUgKyAnJCc7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJSXRlcmF0b3IgaXRyID0gZkludHJvc3BlY3RlZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGVudHJ5TmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCWlmIChlbnRyeU5hbWUuZXF1YWxzKHNvdXJjZU5hbWUpIHx8IGVudHJ5TmFtZS5zdGFydHNXaXRoKHNvdXJjZU5hbWVGb3JJbm5lcikpIHsKLQkJCQkJLy8gSXQgaXMgdGhlIGl0ZW0gb3Igb25lIG9mIGl0cyBpbm5lciBjbGFzc2VzLgotCQkJCQlXZWFrVmFsdWUgcmVmID0gKFdlYWtWYWx1ZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJQmVhbmluZm9DbGFzc0FkYXB0ZXIgYSA9IChCZWFuaW5mb0NsYXNzQWRhcHRlcikgcmVmLmdldCgpOwkJCQkJCi0JCQkJCWlmIChhICE9IG51bGwpIHsKLQkJCQkJCWlmIChjbGVhclJlc3VsdHMpCi0JCQkJCQkJYS5jbGVhckludHJvc3BlY3Rpb24oKTsKLQkJCQkJCWEubWFya1N0YWxlRmFjdG9yeShpc1JlZ2lzdHJ5Q3JlYXRlZCgpID8gZ2V0UmVnaXN0cnkoKSA6IG51bGwpOyAvLyBNYXJrIGl0IHN0YWxlIHdpdGggdGhlIGN1cnJlbnQgcmVnaXN0cnkuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYW4gYWRhcHRlciBmb3IgaW50cm9zcGVjdGlvbi4KLQkgKiBAcGFyYW0gc291cmNlTmFtZSBGdWxseSBxdWFsaWZpZWQgc291cmNlIG5hbWUsIHVzZSB0eXBlIGZvciByZWZsZWN0aW9uLCBpLmUuICJhLmIuYy5DbGFzczEkSW5uZXJDbGFzcyIKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGUgYWRhcHRlciB0byByZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVySW50cm9zcGVjdGlvbihTdHJpbmcgc291cmNlTmFtZSwgQmVhbmluZm9DbGFzc0FkYXB0ZXIgYWRhcHRlcikgewotCQkvLyBDcmVhdGUgaXQgYXMgYSB3ZWFrIHJlZmVyZW5jZSBzbyB0aGF0IGl0IGRvZXNuJ3QgaG9sZCBvbnRvIHRoZSBhZGFwdGVyIGlmIGl0IGlzIGV2ZXIgcmVtb3ZlZAotCQkvLyBhbmQgdGhyb3duIGF3YXkgKG9yIHRoZSBNT0YgcmVzb3VyY2UgaXRzZWxmIGlzIHRocm93biBhd2F5KS4KLQkJcHJvY2Vzc1F1ZXVlKCk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJZkludHJvc3BlY3RlZC5wdXQoc291cmNlTmFtZSwgbmV3IFdlYWtWYWx1ZShzb3VyY2VOYW1lLCBhZGFwdGVyLCBmUmVmUSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhZGFwdGVyLiBUaGlzIGhhcHBlbnMgaW4gdGhlIGNhc2UgdGhhdCBhZGFwdGVyIGlzIGJlaW5nIHJlbW92ZWQgYW5kCi0JICogd2Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSBvdXIgbGlzdC4gVGhpcyBpcyBhbiBpbnRlcm5hbCBBUEkgb25seSBmb3IgdXNlIGJ5Ci0JICogdGhlIGFkYXB0ZXIgaXRzZWxmLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBZGFwdGVyKEJlYW5pbmZvQ2xhc3NBZGFwdGVyIGEpIHsKLQkJZkludHJvc3BlY3RlZC5yZW1vdmUoYS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3NRdWV1ZSgpIHsKLQkJV2Vha1ZhbHVlIHd2OwotCQl3aGlsZSAoKHd2ID0gKFdlYWtWYWx1ZSkgZlJlZlEucG9sbCgpKSAhPSBudWxsKSB7Ci0JCQlmSW50cm9zcGVjdGVkLnJlbW92ZSh3di5nZXRLZXkoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9DbGFzc0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0NsYXNzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzMwMzhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0NsYXNzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvQ2xhc3NBZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQ2ICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjM4ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN1cGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLkNsYXNzRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi1pbXBvcnQgY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LkV2ZW50RmFjdG9yeTsKLWltcG9ydCBjb20uaWJtLmV0b29scy5lbWYuZXZlbnQuRXZlbnRVdGlsOwotCi0vKioKLSAqIEJlYW5pbmZvIGFkYXB0ZXIgZm9yIGRvaW5nIGludHJvc3BlY3Rpb24gb24gYSBKYXZhIE1vZGVsIGNsYXNzLgotICogPHA+Ci0gKiBUaGUgZmlyc3QgdGltZSBhIGludHJvc3BlY3QgcmVxdWVzdCBpcyBtYWRlLCBpdCB3aWxsIHVzZSB0aGUgQ2xhc3NFbnRyeSBmcm9tIHRoZSBjYWNoZSBjb250cm9sbGVyIHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgbG9hZCBmcm9tIHRoZQotICogY2FjaGUgb3IgZG8gYSBjb21wbGV0ZSBpbnRyb3NwZWN0aW9uLiBBZnRlciB0aGF0IGl0IHdpbGwgYWx3YXlzIGRvIGEgY29tcGxldGUgaW50cm9zcGVjdGlvbiB3aGVuIGl0IGlzIG1hcmtlZCBhcyBuZWVkaW5nIGludHJvc3BlY3Rpb24uCi0gKiBUaGlzIGlzIGJlY2F1c2UgdGhlIGNhY2hlIGlzIHVzZWxlc3MgdG8gdXMgdGhlbi4gQXQgdGhhdCBwb2ludCBpbiB0aW1lIHdlIGFscmVhZHkga25vdyB0aGF0IHdlIG9yIG9uZSBvZiBvdXIgc3VwZXJjbGFzc2VzIG9yIG9uZSBvZiAKLSAqIG91dGVyIGNsYXNzZXMgaGFzIGNoYW5nZWQsIHRoZXJlYnkgcmVxdWlyaW5nIHVzIHRvIHJlaW50cm9zcGVjdCwgdGhlIGNhY2hlIGlzIGludmFsaWQgYXQgdGhhdCBwb2ludC4gQWxzbyBvbmNlIHdlIGRpZCBhbiBpbnRyb3NwZWN0aW9uIHdlCi0gKiBkb24ndCB3YW50IHRvIGRvIGEgbG9hZCBmcm9tIGNhY2hlIGJ1dCBpbnN0ZWFkIGRvIGEgbWVyZ2UgYmVjYXVzZSBzb21lb25lIG1heSBvZiBiZWVuIGhvbGRpbmcgb250byB0aGUgZmVhdHVyZXMgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAqIHRocm93IHRoZW0gYXdheSB1bm5lY2Vzc2FyaWx5LgotICogPHA+IAotICogVE9ETyBOZWVkIHRvIHJlLWxvb2sgaW50byB0aGlzIHRvIHNlZSBpZiB3ZSBjYW4gZG8gYSBtZXJnZSB3aXRoIHRoZSBjYWNoZSBmaWxlIGJlY2F1c2UgaWYgaXQgd2FzIGFuIGV4dGVybmFsIGphciBhbmQgaXQgaGFzIG5vdyBnb25lCi0gKiB2YWxpZCwgd2h5IHdhc3RlIHRpbWUgcmVpbnRyb3NwZWN0aW5nLiBCdXQgdGhpcyBuZWVkcyB0byBiZSBjYXJlZnVsbHkgdGhvdWdodCBhYm91dC4gCi0gKiA8cD4gCi0gKiBUaGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyCi0gKiB3aWxsIGF1dG9tYXRpY2FsbHkgbWFyayBhbnkgc3ViY2xhc3NlcyAoYm90aCB0aGUgQmVhbmluZm9DbGFzc0FkYXB0ZXIgYW5kIHRoZSBDbGFzc0VudHJ5KSBhcyBiZWluZyBzdGFsZSBmb3IgdXMuIFRoYXQgd2F5IHdlIGRvbid0IG5lZWQKLSAqIHRvIHdhc3RlIHRpbWUgY2hlY2tpbmcgdGhlIGNlIGFuZCBzdXBlcmNsYXNzZXMgZXZlcnl0aW1lLiBXZSB3aWxsIGtlZXAgdGhlIENsYXNzRW50cnkgYXJvdW5kIHNpbXBseSB0byBtYWtlIHRoZSBtYXJraW5nIG9mIGl0IGFzIHN0YWxlIGVhc2llciBmb3IgdGhlCi0gKiByZXNvdXJjZSBsaXN0ZW5lci4gRmluZGluZyB0aGUgY2UgZXZlcnl0aW1lIHdvdWxkIGJlIGV4cGVuc2l2ZS4KLSAqIDxwPiAKLSAqIFRoaXMgaXMgdGhlIHByb2Nlc3MgZm9yIGRldGVybWluaW5nIGlmIGludHJvc3BlY3Rpb24gcmVxdWlyZWQ6Ci0gKiA8b2w+Ci0gKiA8bGk+SWYgbmVlZHNJbnRyb3NwZWN0aW9uIGZsYWcgaXMgZmFsc2UsIHRoZW4gZG8gbm90aGluZy4gRG9lc24ndCBuZWVkIGludHJvc3BlY3Rpb24uCi0gKiA8bGk+SWYgY2xhc3MgaXMgdW5kZWZpbmVkLCB0aGVuIGp1c3Qgc2V0IHVwIGZvciBhbiB1bmRlZmluZWQgY2xhc3MgYW5kIHJldHVybi4gKEluIHRoaXMgY2FzZSB0aGUgQ0Ugc2hvdWxkIGJlIHRocm93biBhd2F5LCBpdCBzaG91bGQgb2YgYmVlbiBkZWxldGVkKS4KLSAqIDxsaT5JZiBuZXZlciBpbnRyb3NwZWN0ZWQgKG5vdCBSRVRSSUVWRURfRlVMTF9ET0NVTUVOVCksIGdldCB0aGUgQ0UsIGdldCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIGFuZCBjYWxsIGlzU3RhbGVTdGFtcC4gVGhpcyBkZXRlcm1pbmVzIGlmIHRoaXMKLSAqIHN0YW1wIG9yIGFueSBzdXBlciBjbGFzcyBzdGFtcCBpcyBzdGFsZSB3cnQgdG8gY3VycmVudCBzdGFtcC4gSWYgaXQgaXMgbm90IHN0YWxlLCB0aGVuIGxvYWQgZnJvbSBjYWNoZSBiZWNhdXNlIHRoZSBjYWNoZSBpcyBnb29kLiAKLSAqIDxsaT5JZiBubyBjYWNoZSBvciBjYWNoZSBpcyBzdGFsZSBvciBoYXMgaW50cm9zcGVjdGVkIG9uY2UsIHRoZW4gaW50cm9zcGVjdCBhbmQgcmVwbGFjZSBjYWNoZS4KLSAqIDwvb2w+Ci0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9DbGFzc0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElJbnRyb3NwZWN0aW9uQWRhcHRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9QUk9QRVJUSUVTID0gIlJlZmxlY3QgcHJvcGVydGllcyI7CS8vIFJlZmxlY3QgcHJvcGVydGllcyBpbiBJREUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExZX0VYVEVOU0lPTlMgPSAiQXBwbHkgT3ZlcnJpZGVzIjsJLy8gQXBwbHkgb3ZlcnJpZGUgZmlsZXMgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9JTlRST1NQRUNUID0gIlJlbW90ZSBJbnRyb3NwZWN0IjsJLy8gSW50cm9zcGVjdCBvbiByZW1vdGUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVFJPU1BFQ1QgPSAiSW50cm9zcGVjdCI7CS8vIFN0cmFpZ2h0IGludHJvc3BlY3Rpb24sIHdoZXRoZXIgbG9hZCBmcm9tIGNhY2hlIG9yIGludHJvc3BlY3QuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0ZST01fQ0FDSEUgPSAiTG9hZCBmcm9tIENhY2hlIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9DbGFzc0FkYXB0ZXIgZ2V0QmVhbmluZm9DbGFzc0FkYXB0ZXIoRU9iamVjdCBqYykgewotCQlyZXR1cm4gKEJlYW5pbmZvQ2xhc3NBZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGpjLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhciBvdXQgdGhlIGludHJvc3BlY3Rpb24gYmVjYXVzZSBpbnRyb3NwZWN0aW9uIGlzIGJlaW5nIGNsb3NlZCBvciByZW1vdmVkIGZyb20gdGhlIHByb2plY3QuCi0JICogRG9uJ3Qgd2FudCBhbnl0aGluZyBoYW5naW5nIGFyb3VuZCB0aGF0IHdlIGhhZCBkb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFySW50cm9zcGVjdGlvbigpIHsKLQkJLy8gQ2xlYXIgb3V0IHRoZSBiZWFuZGVjb3JhdG9yIGlmIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3IgYmVhbkl0ciA9IGdldEphdmFDbGFzcygpLmdldEVBbm5vdGF0aW9uc0ludGVybmFsKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJlYW5JdHIuaGFzTmV4dCgpKSB7Ci0JCQlFQW5ub3RhdGlvbiBkZWMgPSAoRUFubm90YXRpb24pIGJlYW5JdHIubmV4dCgpOwotCQkJaWYgKGRlYyBpbnN0YW5jZW9mIEJlYW5EZWNvcmF0b3IpIHsKLQkJCQlCZWFuRGVjb3JhdG9yIGRlY29yID0gKEJlYW5EZWNvcmF0b3IpIGRlYzsKLQkJCQlpZiAoZGVjb3IuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9MSVRFUkFMKSB7Ci0JCQkJCWJlYW5JdHIucmVtb3ZlKCk7Ci0JCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBkZWNvcikuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCX0gZWxzZSB7Ci0JCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcigoQmVhbkRlY29yYXRvcikgZGVjKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gQ2xlYXIgb3V0IHRoZSBmZWF0dXJlcyB0aGF0IHdlIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3IgcHJvcEl0ciA9IGdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChwcm9wSXRyLmhhc05leHQoKSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHByb3AgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wSXRyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIHBkSXRyID0gcHJvcC5nZXRFQW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHBkSXRyLmhhc05leHQoKSkgewotCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgcGRJdHIubmV4dCgpOwotCQkJCWlmIChkZWMgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY29yYXRvcikgewotCQkJCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IChQcm9wZXJ0eURlY29yYXRvcikgZGVjOwotCQkJCQlpZiAocGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKHBkKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlwZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIHByb3BlcnR5LgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIHBkKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7IC8vIE1hcmsgaXQgYXMgYmFkIHByb3h5IHNvIHdlIGtub3cgaXQgaXMgbm8gbG9uZ2VyIGFueSB1c2UuCi0JCQkJCX0KLQkJCQkJaWYgKHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJcHJvcEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIHRoZSBmZWF0dXJlIGl0c2VsZgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIHByb3ApLmVTZXRQcm94eVVSSShCQURfVVJJKTsgLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIENsZWFyIG91dCB0aGUgb3BlcmF0aW9ucyB0aGF0IHdlIGltcGxpY2l0bHkgY3JlYXRlZC4KLQkJSXRlcmF0b3Igb3Blckl0ciA9IGdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAob3Blckl0ci5oYXNOZXh0KCkpIHsKLQkJCUVPcGVyYXRpb24gb3BlciA9IChFT3BlcmF0aW9uKSBvcGVySXRyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIG1kSXRyID0gb3Blci5nZXRFQW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG1kSXRyLmhhc05leHQoKSkgewotCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgbWRJdHIubmV4dCgpOwotCQkJCWlmIChkZWMgaW5zdGFuY2VvZiBNZXRob2REZWNvcmF0b3IpIHsKLQkJCQkJTWV0aG9kRGVjb3JhdG9yIG1kID0gKE1ldGhvZERlY29yYXRvcikgZGVjOwotCQkJCQlpZiAobWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKG1kKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQltZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIG9wZXJhdGlvbi4KLQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBtZCkuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQl9Ci0JCQkJCWlmIChtZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSA9PSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUwpIHsKLQkJCQkJCW9wZXJJdHIucmVtb3ZlKCk7IC8vIFJlbW92ZSB0aGUgb2VwcmF0aW9uIGl0c2VsZgotCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIG9wZXIpLmVTZXRQcm94eVVSSShCQURfVVJJKTsgLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIENsZWFyIG91dCB0aGUgZXZlbnRzIHRoYXQgd2UgaW1wbGljaXRseSBjcmVhdGVkLgotCQkJSXRlcmF0b3IgZXZ0SXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChldnRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUV2ZW50IGV2dCA9IChKYXZhRXZlbnQpIGV2dEl0ci5uZXh0KCk7Ci0JCQkJSXRlcmF0b3IgZWRJdHIgPSBldnQuZ2V0RUFubm90YXRpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZWRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVBbm5vdGF0aW9uIGRlYyA9IChFQW5ub3RhdGlvbikgZWRJdHIubmV4dCgpOwotCQkJCQlpZiAoZGVjIGluc3RhbmNlb2YgRXZlbnRTZXREZWNvcmF0b3IpIHsKLQkJCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gKEV2ZW50U2V0RGVjb3JhdG9yKSBkZWM7Ci0JCQkJCQlpZiAoZWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKQotCQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcihlZCk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllZEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGV2ZW50LgotCQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBlZCkuZVNldFByb3h5VVJJKEJBRF9VUkkpOyAvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQkJfQotCQkJCQkJaWYgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJCWV2dEl0ci5yZW1vdmUoKTsgLy8gUmVtb3ZlIHRoZSBldmVudCBpdHNlbGYKLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgZXZ0KS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7IC8vIE1hcmsgaXQgYXMgYmFkIHByb3h5IHNvIHdlIGtub3cgaXQgaXMgbm8gbG9uZ2VyIGFueSB1c2UuCi0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkJCi0JCX0KLQotCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJbmVlZHNJbnRyb3NwZWN0aW9uID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJBbGwoKSB7Ci0JCWNsZWFySW50cm9zcGVjdGlvbigpOwkvLyBGaXJzdCBnZXQgcmlkIG9mIHRoZSBvbmVzIHdlIGRpZCBzbyB0aGF0IHRoZXkgYXJlIG1hcmtlZCBhcyBwcm94aWVzLgotCQkKLQkJLy8gQ2xlYXIgb3V0IHRoZSBhbm5vdGF0aW9ucy4KLQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RUFubm90YXRpb25zSW50ZXJuYWwoKS5jbGVhcigpOwotCQkvLyBDbGVhciBvdXQgdGhlIGF0dHJpYnV0ZXMuCi0JCWdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpLmNsZWFyKCk7CQotCQkvLyBDbGVhciBvdXQgdGhlIG9wZXJhdGlvbnMuCi0JCWdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKS5jbGVhcigpOwotCQkvLyBDbGVhciBvdXQgdGhlIGV2ZW50cy4KLQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCkuY2xlYXIoKTsKLQkJCi0JCXJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID0gTkVWRVJfUkVUUklFVkVEX0VYVEVOU0lPTl9ET0NVTUVOVDsJLy8gU2luY2Ugd2UgY2xlYXJlZCBldmVyeXRoaW5nLCBnbyBiYWNrIHRvIG5vIGRvYyBhcHBsaWVkLgotCX0KLQkKLQotCS8qKgotCSAqIEB2ZXJzaW9uIAkxLjAKLQkgKiBAYXV0aG9yCi0JICovCi0KLQkvLyBBIFVSSSB0aGF0IHdpbGwgbmV2ZXIgcmVzb2x2ZS4gVXNlZCB0byBtYXJrIGFuIG9iamVjdCBhcyBubyBsb25nZXIgdmFsaWQuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgQkFEX1VSSSA9IFVSSS5jcmVhdGVVUkkoImJhZHVyaSIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc0ludHJvc3BlY3Rpb24gPSB0cnVlOwotCQotCXByb3RlY3RlZCBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5IGNsYXNzRW50cnk7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRyb3NwZWN0aW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2luZ0FsbFByb3BlcnRpZXM7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RvaW5nQWxsT3BlcmF0aW9uczsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRG9pbmdBbGxFdmVudHM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludAotCQlORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UID0gMCwKLQkJUkVUUklFVkVEX1JPT1RfT05MWSA9IDEsCi0JCVJFVFJJRVZFRF9GVUxMX0RPQ1VNRU5UID0gMiwKLQkJQ0xFQVJfRVhURU5TSU9OUyA9IDM7Ci0JcHJvdGVjdGVkIGludCByZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9IE5FVkVSX1JFVFJJRVZFRF9FWFRFTlNJT05fRE9DVU1FTlQ7Ci0KLQlwcm90ZWN0ZWQgQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBzdGFsZUZhY3Rvcnk7IC8vIFdoZW4gcmVmZXJlbmNlIG5vdCBudWxsLCB0aGVuIHRoaXMgZmFjdG9yeSBpcyBhIHN0YWxlIGZhY3RvcnkgYW5kIAotCS8vIGEgbmV3IG9uZSBpcyBuZWVkZWQgd2hlbiB0aGUgZmFjdG9yeSByZXR1cm5lZCA9PSB0aGlzIG9uZS4KLQkvLyBJdCBpcyBhIFdlYWtSZWYgc28gdGhhdCBpZiB0aGUgZmFjdG9yeSBnb2VzIGF3YXkgb24gaXRzIG93bgotCS8vIHRoYXQgd2UgZG9uJ3QgaG9sZCBvbnRvIGl0LgotCi0JLy8gQSB0ZW1wb3JhcnkgaGFzaHNldCBvZiB0aGUgbG9jYWwgcHJvcGVydGllcy4gVXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3Ci0JLy8gcHJvcGVydHkgdG8gdXNlIHRoZSBvbGQgb25lLiBJdCBpcyBjbGVhcmVkIG91dCBhdCB0aGUgZW5kIG9mIGF0dHJpYnV0ZSBpbnRyb3NwZWN0aW9uLgotCS8vIEl0IGlzIG9ubHkgYnVpbHQgb25jZSBkdXJpbmcgYXR0cmlidXRlIGludHJvc3BlY3Rpb24gc28gdGhhdCB3ZSBoYXZlIHRoZSBzbmFwc2hvdAotCS8vIG9mIGJlZm9yZSB0aGUgaW50cm9zcGVjdGlvbiAoaS5lLiB0aGUgb25lcyB0aGF0IHdlcmUgc3BlY2lmaWNhbGx5IGFkZGVkIGJ5IHVzZXJzCi0JLy8gYW5kIG5vdCB0aHJvdWdoIGludHJvc3BlY3Rpb24pLiBUaGUgb25lcyB0aGF0IHdlIGFyZSBhZGRpbmcgZG8gbm90IG5lZWQgdG8gYmUgY2hlY2tlZAotCS8vIGFnYWluc3QgZWFjaCBvdGhlciBiZWNhdXNlIHRoZXJlIHdpbGwgbm90IGJlIGNvbmZsaWN0cy4KLQkvLwotCS8vIEFsc28gYXQgdGhlIGVuZCwgd2Ugd2lsbCBnbyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZWUgaWYgaXQgZXhpc3RzIGluIHRoZSBmUHJvcGVydGllc01hcCBhbmQKLQkvLyBpdCBpcyBub3QgdGhlIHZhbHVlIEJvb2xlYW4uRkFMU0UgaW4gdGhlIG1hcCwgYW5kIHRoZSBlbnRyeSBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQuIFRoaXMgbWVhbnMgdGhpcwotCS8vIHdhcyBhbiBpbXBsaWNpdCBlbnRyeSBmcm9tIHRoZSBwcmV2aW91cyBpbnRyb3NwZWN0aW9uIGFuZCB3YXMgbm90IHJlLWNyZWF0ZWQgaW4gdGhpcyBpbnRyb3NwZWN0aW9uLgotCXByaXZhdGUgSGFzaE1hcCBwcm9wZXJ0aWVzTWFwOwotCXByaXZhdGUgTGlzdCBmZWF0dXJlc1JlYWxMaXN0OyAvLyBUZW1wIHBvaW50ZXIgdG8gdGhlIHJlYWwgbGlzdCB3ZSBhcmUgYnVpbGRpbmcuIEl0IGlzIHRoZSB0cnVlIGxpc3QgaW4gamF2YSBjbGFzcy4KLQkKLQkvLyBBIHRlbXBvcmFyeSBoYXNobWFwIG9mIHRoZSBsb2NhbCBvcGVyYXRpb25zLiBVc2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcKLQkvLyBvcGVyYXRpb24gdG8gcmV1c2UgdGhlIG9sZCBvbmUuIEl0IGlzIGNsZWFyZWQgb3V0IGF0IHRoZSBlbmQgb2Ygb3BlcmF0aW9uIGludHJvc3BlY3Rpb24uCi0JLy8gSXQgaXMgb25seSBidWlsdCBvbmNlIGR1cmluZyBvcGVyYXRpb24gaW50cm9zcGVjdGlvbiBzbyB0aGF0IHdlIGhhdmUgdGhlIHNuYXBzaG90Ci0JLy8gb2YgYmVmb3JlIHRoZSBpbnRyb3NwZWN0aW9uLgotCXByaXZhdGUgSGFzaE1hcCBvcGVyYXRpb25zTWFwOwotCXByaXZhdGUgRUxpc3Qgb3BlcmF0aW9uc1JlYWxMaXN0OyAvLyBUZW1wIHBvaW50ZXIgdG8gdGhlIHJlYWwgbGlzdCB3ZSBhcmUgYnVpbGRpbmcuIEl0IGlzIHRoZSB0cnVlIGxpc3QgaW4gamF2YSBjbGFzcy4KLQkvLyBBIHNldCBvZiBvcGVyYXRpb25zIGFzIHdlIGNyZWF0ZSB0aGVtIHNvIHRoYXQgd2Ugd2hpY2ggb25lcyB3ZSBhZGRlZC9rZXB0IGFuZCB3aGljaCBhcmUgbm8gbG9uZ2VyIGluIHVzZSBhbmQgY2FuIGJlIHJlbW92ZWQuCQotCS8vIElmIHRoZXkgYXJlbid0IGluIHRoaXMgc2V0IGF0IHRoZSBlbmQsIHRoZW4gd2Uga25vdyBpdCBzaG91bGQgYmUgcmVtb3ZlZCBpZiBpdCBpcyBvbmUgd2UgaGFkIGNyZWF0ZWQgaW4gdGhlIHBhc3QuCi0JcHJpdmF0ZSBIYXNoU2V0IG5ld29wZXJhdGlvbnM7IAotCi0JLy8gQSB0ZW1wb3JhcnkgaGFzaHNldCBvZiB0aGUgbG9jYWwgZXZlbnRzLiBVc2VkIHdoZW4gY3JlYXRpbmcgYSBuZXcKLQkvLyBldmVudCB0byB1c2UgdGhlIG9sZCBvbmUuIEl0IGlzIGNsZWFyZWQgb3V0IGF0IHRoZSBlbmQgb2YgZXZlbnQgaW50cm9zcGVjdGlvbi4KLQkvLyBJdCBpcyBvbmx5IGJ1aWx0IG9uY2UgZHVyaW5nIGV2ZW50IGludHJvc3BlY3Rpb24gc28gdGhhdCB3ZSBoYXZlIHRoZSBzbmFwc2hvdAotCS8vIG9mIGJlZm9yZSB0aGUgaW50cm9zcGVjdGlvbiAoaS5lLiB0aGUgb25lcyB0aGF0IHdlcmUgc3BlY2lmaWNhbGx5IGFkZGVkIGJ5IHVzZXJzCi0JLy8gYW5kIG5vdCB0aHJvdWdoIGludHJvc3BlY3Rpb24pLiBUaGUgb25lcyB0aGF0IHdlIGFyZSBhZGRpbmcgZG8gbm90IG5lZWQgdG8gYmUgY2hlY2tlZAotCS8vIGFnYWluc3QgZWFjaCBvdGhlciBiZWNhdXNlIHRoZXJlIHdpbGwgbm90IGJlIGNvbmZsaWN0cy4KLQkvLwotCS8vIEFsc28gYXQgdGhlIGVuZCwgd2Ugd2lsbCBnbyB0aHJvdWdoIHRoZSBldmVudHMgYW5kIHNlZSBpZiBpdCBleGlzdHMgaW4gdGhlIGZFdmVudHNNYXAgYW5kCi0JLy8gaXQgaXMgbm90IHRoZSB2YWx1ZSBCb29sZWFuLkZBTFNFIGluIHRoZSBtYXAsIGFuZCB0aGUgZW50cnkgaXMgaW1wbGljaXRseSBjcmVhdGVkLiBUaGlzIG1lYW5zIHRoaXMKLQkvLyB3YXMgYW4gaW1wbGljaXQgZW50cnkgZnJvbSB0aGUgcHJldmlvdXMgaW50cm9zcGVjdGlvbiBhbmQgd2FzIG5vdCByZS1jcmVhdGVkIGluIHRoaXMgaW50cm9zcGVjdGlvbi4KLQlwcml2YXRlIEhhc2hNYXAgZXZlbnRzTWFwOwotCXByaXZhdGUgRUxpc3QgZXZlbnRzUmVhbExpc3Q7IC8vIFRlbXAgcG9pbnRlciB0byB0aGUgcmVhbCBsaXN0IHdlIGFyZSBidWlsZGluZy4gSXQgaXMgdGhlIHRydWUgbGlzdCBpbiBqYXZhIGNsYXNzLgotCi0JcHJpdmF0ZSBCb29sZWFuIGRlZmF1bHRCb3VuZDsKLQkvLyBXaGV0aGVyIHRoaXMgY2xhc3MgaXMgZGVmYXVsdCBib3VuZCBvciBub3QgKGkuZS4gZG9lcyB0aGlzIGNsYXNzIGltcGxlbWVudCBhZGQvcmVtb3ZlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lci4gSWYgbnVsbCwgdGhlbiBub3QgeWV0IHF1ZXJpZWQuCi0KLQlwdWJsaWMgQmVhbmluZm9DbGFzc0FkYXB0ZXIoQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgamF2YSBjbGFzcyBpcyBzdGlsbCBjb25uZWN0ZWQgdG8gYSBsaXZlIHJlc291cmNlLiBJdCBoYXBwZW5zIGR1cmluZyB1bmxvYWRpbmcKLQkgKiB0aGF0IHdlIGFyZSBubyBsb25nZXIgY29ubmVjdGVkIHRvIGEgcmVzb3VyY2UgKGJlY2F1c2UgdGhlIGphdmFwYWNrYWdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZAotCSAqIHVubG9hZGVkKSBvciB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgdW5sb2FkZWQsIGJ1dCB0aGUgdW5sb2FkaW5nIHByb2Nlc3Mgd2lsbCBzdGlsbCAKLQkgKiBjYWxsIGFjY2Vzc29ycyBvbiB0aGlzIGphdmEgY2xhc3MsIHdoaWNoIHdpbGwgY29tZSBvdmVyIGhlcmUuIEluIHRob3NlIGNhc2VzIHdlIHNob3VsZCB0cmVhdCBhcwotCSAqIGludHJvc3BlY3Rpb24gY29tcGxldGVkIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNvdXJjZUNvbm5lY3RlZCgpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0SmF2YUNsYXNzKCkuZVJlc291cmNlKCk7Ci0JCXJldHVybiByZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeS5nZXRSZWdpc3RyeSgpOwotCQlpZiAoc3RhbGVGYWN0b3J5ICE9IG51bGwgJiYgZmFjdG9yeSA9PSBzdGFsZUZhY3RvcnkuZ2V0KCkpIHsKLQkJCS8vIFdlIG5lZWQgdG8gcmVjeWNsZSB0aGUgZmFjdG9yeS4gVGhlIHJldHVybmVkIGZhY3RvcnkgaXMgdGhlIHNhbWUgZmFjdG9yeSB3aGVuIGl0IHdlbnQgc3RhbGUuCi0JCQlmYWN0b3J5ID0gYWRhcHRlckZhY3RvcnkucmVjeWNsZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJc3RhbGVGYWN0b3J5ID0gbnVsbDsgLy8gV2hldGhlciB3ZSByZWN5Y2xlZCBvciBub3QsIGl0IGlzIG5vIGxvbmdlciBzdGFsZS4KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBhZGFwdGVyIGhhcyBiZWVuIG1hcmtlZCBhcyBzdGFsZS4gTmVlZGVkCi0JICogYnkgdGhlIHVzZXJzIHNvIHRoYXQgdGhleSBjYW4gcmVjeWNsZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpIHsKLQkJcmV0dXJuIHN0YWxlRmFjdG9yeSAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkuZXF1YWxzKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtYXAgaXMga2V5ZWQgYnkgbmFtZS4gSXQgaXMgYSBzbmFwc2hvdCBvZiB0aGUgcHJvcGVydGllcyBhdCB0aGUKLQkgKiB0aW1lIHRoZSBpbnRyb3NwZWN0aW9uL3JlZmxlY3Rpb24gb2YgcHJvcGVydGllcyB3YXMgc3RhcnRlZC4gSXQgaXMgdXNlZAotCSAqIGZvciBxdWljayBsb29rdXAuCi0JICoKLQkgKiBPbmNlIGEgcHJvcGVydHkgaXMgdXNlZCwgdGhlIGVudHJ5IGlzIHJlcGxhY2VkIHdpdGggYSBCb29sZWFuLkZBTFNFLiBUaGlzCi0JICogaXMgc28gd2Uga25vdyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIGFuZCBhdCB0aGUgZW5kLCB3aGljaCBuZWVkCi0JICogdG8gYmUgZGVsZXRlZCBzaW5jZSB0aGV5IHdlcmVuJ3QgdXNlZCAoaS5lLiB0aGUgb25lcyB0aGF0IGFyZW4ndCBGQUxTRSkuCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0UHJvcGVydGllc01hcCgpIHsKLQkJaWYgKHByb3BlcnRpZXNNYXAgPT0gbnVsbCkgewotCQkJTGlzdCBsb2NhbEZlYXR1cmVzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlc0ludGVybmFsKCk7Ci0JCQlwcm9wZXJ0aWVzTWFwID0gbmV3IEhhc2hNYXAobG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQkJSXRlcmF0b3IgaXRyID0gbG9jYWxGZWF0dXJlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQkJcHJvcGVydGllc01hcC5wdXQoZmVhdHVyZS5nZXROYW1lKCksIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzTWFwOwotCX0KLQotCS8qKgotCSAqIEdldCBpdCBvbmNlIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGdldHRpbmcgaXQgb3ZlciBhbmQgb3Zlci4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGZWF0dXJlc0xpc3QoKSB7Ci0JCWlmIChmZWF0dXJlc1JlYWxMaXN0ID09IG51bGwpCi0JCQlmZWF0dXJlc1JlYWxMaXN0ID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlc0ludGVybmFsKCk7Ci0JCXJldHVybiBmZWF0dXJlc1JlYWxMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoZSBtYXAgaXMga2V5ZWQgYnkgbG9uZ05hbWUuIElmIGEgTWV0aG9kIGlzIHBhc3NlZCBpbiwgdGhlbiB0aGUKLQkgKiBpZCBvZiB0aGUgbWV0aG9kIGlzIHVzZWQgKHRoaXMgaXMgaW4gcmVmbGVjdGlvbiksIGlmIGFuIElCZWFuUHJveHkKLQkgKiBpcyBwYXNzZWQgaW4sIHRoZW4gYW4gaWQgaXMgY3JlYXRlZCBhbmQgbG9va2VkIHVwICh0aGlzIGlzIGluIGludHJvc3BlY3Rpb24pLgotCSAqIFRoZSBtYXAgaXMgdXNlZCBmb3IgYSBxdWljayBsb29rdXAgb2YgYmVoYXZpb3JzIGF0IHRoZSB0aW1lIGludHJvc3BlY3Rpb24KLQkgKiBvZiBiZWhhdmlvcnMgc3RhcnRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaE1hcCBnZXRPcGVyYXRpb25zTWFwKCkgewotCQlpZiAob3BlcmF0aW9uc01hcCA9PSBudWxsKSB7Ci0JCQlMaXN0IGxvY2FscyA9IGdldEphdmFDbGFzcygpLmdldEVPcGVyYXRpb25zSW50ZXJuYWwoKTsKLQkJCWludCBsID0gbG9jYWxzLnNpemUoKTsKLQkJCW9wZXJhdGlvbnNNYXAgPSBuZXcgSGFzaE1hcChsKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0JCQkJRU9wZXJhdGlvbiBvcCA9IChFT3BlcmF0aW9uKSBsb2NhbHMuZ2V0KGkpOwotCQkJCW9wZXJhdGlvbnNNYXAucHV0KGZvcm1Mb25nTmFtZShvcCksIG9wKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3BlcmF0aW9uc01hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaXQgb25jZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8ga2VlcCBnZXR0aW5nIGl0IG92ZXIgYW5kIG92ZXIuCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGdldE9wZXJhdGlvbnNMaXN0KCkgewotCQlpZiAob3BlcmF0aW9uc1JlYWxMaXN0ID09IG51bGwpCi0JCQlvcGVyYXRpb25zUmVhbExpc3QgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFT3BlcmF0aW9uc0ludGVybmFsKCk7Ci0JCXJldHVybiBvcGVyYXRpb25zUmVhbExpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1hcCBpcyBrZXllZCBieSBuYW1lLgotCSAqIFRoZSBtYXAgaXMgdXNlZCBmb3IgYSBxdWljayBsb29rdXAgb2YgZXZlbnRzIGF0IHRoZSB0aW1lIGludHJvc3BlY3Rpb24KLQkgKiBvZiBldmVudHMgc3RhcnRlZC4KLQkgKgotCSAqIE9uY2UgYW4gZXZlbnQgaXMgdXNlZCwgdGhlIGVudHJ5IGlzIHJlcGxhY2VkIHdpdGggYSBCb29sZWFuLkZBTFNFLiBUaGlzCi0JICogaXMgc28gd2Uga25vdyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIGFuZCBhdCB0aGUgZW5kLCB3aGljaCBuZWVkCi0JICogdG8gYmUgZGVsZXRlZCBzaW5jZSB0aGV5IHdlcmVuJ3QgdXNlZCAoaS5lLiB0aGUgb25lcyB0aGF0IGFyZW4ndCBGQUxTRSkuCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0RXZlbnRzTWFwKCkgewotCQlpZiAoZXZlbnRzTWFwID09IG51bGwpIHsKLQkJCUxpc3QgbG9jYWxzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzR2VuKCk7Ci0JCQlldmVudHNNYXAgPSBuZXcgSGFzaE1hcChsb2NhbHMuc2l6ZSgpKTsKLQkJCUl0ZXJhdG9yIGl0ciA9IGxvY2Fscy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhRXZlbnQgZXZlbnQgPSAoSmF2YUV2ZW50KSBpdHIubmV4dCgpOwotCQkJCWV2ZW50c01hcC5wdXQoZXZlbnQuZ2V0TmFtZSgpLCBldmVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV2ZW50c01hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaXQgb25jZSBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8ga2VlcCBnZXR0aW5nIGl0IG92ZXIgYW5kIG92ZXIuCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGdldEV2ZW50c0xpc3QoKSB7Ci0JCWlmIChldmVudHNSZWFsTGlzdCA9PSBudWxsKQotCQkJZXZlbnRzUmVhbExpc3QgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFdmVudHNHZW4oKTsKLQkJcmV0dXJuIGV2ZW50c1JlYWxMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGludHJvc3BlY3RJZk5lY2Vzc2FyeSgpIHsKLQkJaW50cm9zcGVjdElmTmVjZXNzYXJ5KGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW50cm9zcGVjdElmTmVjZXNzYXJ5KGJvb2xlYW4gZG9PcGVyYXRpb25zKSB7Ci0JCWJvb2xlYW4gZG9JbnRyb3NwZWN0aW9uID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJZG9JbnRyb3NwZWN0aW9uID0gbmVlZHNJbnRyb3NwZWN0aW9uICYmICFpc0ludHJvc3BlY3Rpbmc7IAotCQkJaWYgKGRvSW50cm9zcGVjdGlvbikKLQkJCQlpc0ludHJvc3BlY3RpbmcgPSB0cnVlOwotCQl9Ci0JCWlmIChkb0ludHJvc3BlY3Rpb24pIHsKLQkJCWJvb2xlYW4gZGlkSW50cm9zcGVjdGlvbiA9IGZhbHNlOwotCQkJdHJ5IHsJCQkJCi0JCQkJaW50cm9zcGVjdChkb09wZXJhdGlvbnMpOwotCQkJCWRpZEludHJvc3BlY3Rpb24gPSB0cnVlOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCTAsCi0JCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5JTlRST1NQRUNUX0ZBSUxFRF9FWENfLCAKLQkJCQkJCQluZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLCAiIn0pLCAvLyROT04tTkxTLTEkCi0JCQkJCQllKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlpc0ludHJvc3BlY3RpbmcgPSBmYWxzZTsKLQkJCQkJbmVlZHNJbnRyb3NwZWN0aW9uID0gIWRpZEludHJvc3BlY3Rpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyBlbnRyeS4gCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5IGdldENsYXNzRW50cnkoKSB7Ci0JCXJldHVybiBjbGFzc0VudHJ5OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuVXNlQ2FjaGUoKSB7Ci0JCS8vIFdlIGNoZWNrIG91ciBsZXZlbCwgd2UgYXNzdW1lIG5vdCBzdGFsZSB1bmxlc3MgQ0Ugc2F5cyBzdGFsZS4KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBXZSBtYXkgYWxyZWFkeSBoYXZlIGEgY2xhc3MgZW50cnkgZHVlIHRvIGEgc3ViY2xhc3MgZG9pbmcgYSBjaGVjaywgc28gaWYgd2UgZG8sIHdlJ2xsIHVzZSBpdC4gRWxzZSB3ZSdsbCBnZXQgdGhlIGxhdGVzdCBvbmUuCi0JCQlpZiAoY2xhc3NFbnRyeSA9PSBudWxsKQotCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCWlmIChjbGFzc0VudHJ5ICE9IG51bGwpIHsKLQkJCQkvLyBXZSBoYXZlIGEgY2FjaGUgdG8gY2hlY2suCi0JCQkJbG9uZyBtb2RTdGFtcCA9IGNsYXNzRW50cnkuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkvLyBBIHNhbml0eSBjaGVjaywgaWYgdGhpcyB3YXMgYW4gb2xkLCBidXQgbm93IGRlbGV0ZWQgb25lIHdlIHdhbnQgdG8gdGhyb3cgaXQgYXdheSBhbmQgZ2V0IGl0IGFnYWluLiBJdCBtYXkgbm93IGJlIHZhbGlkLgotCQkJCWlmIChtb2RTdGFtcCA9PSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5LkRFTEVURURfTU9ESUZJQ0FUSU9OX1NUQU1QKSB7Ci0JCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkKLQkJCQkJCW1vZFN0YW1wID0gY2xhc3NFbnRyeS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCQlpZiAobW9kU3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVAgfHwgbW9kU3RhbXAgPT0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuQ2xhc3NFbnRyeS5ERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBhcmUgc3RhbGUuCi0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCB3aGljaCBtZWFucyBhcmUgZGVsZXRlZCwgb3IgbmV2ZXIgY2FjaGVkLgotCQl9Ci0JCQotCQkvLyBOb3cgdHJ5IHRoZSBzdXBlcnMgdG8gc2VlIGlmIHdlIGFyZSBvdXQgb2YgZGF0ZSB0byB0aGVtLgotCQkvLyBOb3RlOiBPbmx5IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlIGNvdWxkIHRoZXJlIGJlIG1vcmUgdGhhbiBvbmUgZVN1cGVyVHlwZS4KLQkJTGlzdCBzdXBlcnMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQlpZiAoIXN1cGVycy5pc0VtcHR5KCkpIHsKLQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGJjYSA9IGdldEJlYW5pbmZvQ2xhc3NBZGFwdGVyKChFT2JqZWN0KSBzdXBlcnMuZ2V0KDApKTsKLQkJCUNsYXNzRW50cnkgc3VwZXJDRSA9IGJjYS5nZXRDbGFzc0VudHJ5KCk7Ci0JCQkvLyBJZiBzdXBlciBpcyBkZWZpbmVkIGFuZCBvdXQgb2YgZGF0ZSBkb24ndCB1c2UgY2FjaGUuIElmIHN1cGVyIGlzIHVuZGVmaW5lZCBhbmQgc3VwZXIgbW9kaWZpY2F0aW9uIHN0YW1wIGlzIG5vdCBzdXBlcl91bmRlZmluZWQsCi0JCQkvLyB0aGVuIHRoYXQgbWVhbnMgaXQgd2FzIGRlZmluZWQgYXQgdGltZSBvZiBjYWNoZSBhbmQgbm93IG5vdCBkZWZpbmVkLCBzbyBkb24ndCB1c2UgY2FjaGUuCi0JCQlpZiAoc3VwZXJDRSAhPSBudWxsKSB7Ci0JCQkJaWYgKHN1cGVyQ0UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSAhPSBjbGFzc0VudHJ5LmdldFN1cGVyTW9kaWZpY2F0aW9uU3RhbXAoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBPdXQtb2YtZGF0ZSB3cnQvc3VwZXIuCi0JCQl9IGVsc2UgaWYgKGNsYXNzRW50cnkuZ2V0U3VwZXJNb2RpZmljYXRpb25TdGFtcCgpICE9IENsYXNzRW50cnkuU1VQRVJfVU5ERUZJTkVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIHdhcyBwcmV2aW91c2x5IGRlZmluZWQsIGFuZCBub3cgdW5kZWZpbmVkLCBzbyBvdXQgb2YgZGF0ZS4KLQkJCVN0cmluZ1tdIGlOYW1lcyA9IGNsYXNzRW50cnkuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKLQkJCWlmIChpTmFtZXMgIT0gbnVsbCkgewotCQkJCWlmIChpTmFtZXMubGVuZ3RoICE9IHN1cGVycy5zaXplKCkgLSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIFdlIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHN1cGVycywgc28gc3RhbGUuCi0JCQkJLy8gTm93IHRoZSBpbnRlcmZhY2VzIG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIsIGJ1dCB0aGVyZSBzaG91bGRuJ3QgYmUgdG9vIG1hbnksIHNvIHdlJ2xsIHVzZSBPKG4yKSBsb29rdXAuIFdlJ2xsIHRyeSBzdGFydGluZyBhdAotCQkJCS8vIHRoZSBzYW1lIGluZGV4IGp1c3QgaW4gY2FzZS4gVGhhdCB3YXkgaWYgdGhleSBhcmUgdGhlIHNhbWUgb3JkZXIgaXQgd2lsbCBiZSBsaW5lYXIgaW5zdGVhZC4gTW9zdCBsaWtlbHkgd2lsbCBiZSBzYW1lIG9yZGVyLgotCQkJCWxvbmdbXSBpU3RhbXAgPSBjbGFzc0VudHJ5LmdldEludGVyZmFjZU1vZGlmaWNhdGlvblN0YW1wcygpOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IGlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgc3VwZXJzLmdldChpKTsKLQkJCQkJU3RyaW5nIGludE5hbWUgPSAoamF2YUNsYXNzKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJCQkvLyBGaW5kIGl0IGluIHRoZSBuYW1lcyBsaXN0LgotCQkJCQlpbnQgc3RvcCA9IGktMTsKLQkJCQkJaW50IGluZHggPSBzdG9wOwkvLyBTdGFydCBhdCB0aGUgc3RvcCwgd2hlbiB3ZSBoaXQgaXQgYWdhaW4gd2Ugd2lsbCBiZSBkb25lLgotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWRvIHsKLQkJCQkJCWlmIChpTmFtZXNbaW5keF0uZXF1YWxzKGludE5hbWUpKSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IHdoaWxlICgoKytpbmR4KSVpTmFtZXMubGVuZ3RoICE9IHN0b3ApOwotCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBDb3VsZG4ndCBmaW5kIGl0LCBzbyB3ZSBhcmUgc3RhbGUuXQotCQkJCQkKLQkJCQkJc3VwZXJDRSA9IGdldEJlYW5pbmZvQ2xhc3NBZGFwdGVyKGphdmFDbGFzcykuZ2V0Q2xhc3NFbnRyeSgpOwotCQkJCQlpZiAoc3VwZXJDRSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoc3VwZXJDRS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICE9IGlTdGFtcFtpbmR4XSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIE91dC1vZi1kYXRlIHdydC9pbnRlcmZhY2UuCi0JCQkJCX0gZWxzZSBpZiAoaVN0YW1wW2luZHhdICE9IENsYXNzRW50cnkuU1VQRVJfVU5ERUZJTkVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJCXJldHVybiBmYWxzZTsJLy8gd2FzIHByZXZpb3VzbHkgZGVmaW5lZCwgYW5kIG5vdyB1bmRlZmluZWQsIHNvIG91dCBvZiBkYXRlLgotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWYgd2UgZ290IGhlcmUgZXZlcnl0aGluZyBpcyBvay4KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuVXNlT3ZlcnJpZGVDYWNoZSgpIHsKLQkJLy8gV2UgY2hlY2sgb3VyIGNvbmZpZyBzdGFtcC4KLQkJLy8gVE9ETyBpbiBmdXR1cmUgY2FuIHdlIGxpc3RlbiBmb3IgY29uZmlnIGNoYW5nZXMgYW5kIG1hcmsgY2xhc3NlcyBzdGFsZSBpZiB0aGUgY29uZmlnIGNoYW5nZXM/Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gV2UgbWF5IGFscmVhZHkgaGF2ZSBhIGNsYXNzIGVudHJ5IGR1ZSB0byBhIHN1YmNsYXNzIGRvaW5nIGEgY2hlY2ssIHNvIGlmIHdlIGRvLCB3ZSdsbCB1c2UgaXQuIEVsc2Ugd2UnbGwgZ2V0IHRoZSBsYXRlc3Qgb25lLgotCQkJaWYgKGNsYXNzRW50cnkgPT0gbnVsbCkKLQkJCQljbGFzc0VudHJ5ID0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuSU5TVEFOQ0UuZ2V0Q2xhc3NFbnRyeShnZXRKYXZhQ2xhc3MoKSk7Ci0JCQlpZiAoY2xhc3NFbnRyeSAhPSBudWxsKSB7Ci0JCQkJLy8gV2UgaGF2ZSBhIGNhY2hlIHRvIGNoZWNrLgotCQkJCS8vIEEgc2FuaXR5IGNoZWNrLCBpZiB0aGlzIHdhcyBhbiBvbGQsIGJ1dCBub3cgZGVsZXRlZCBvbmUgd2Ugd2FudCB0byB0aHJvdyBpdCBhd2F5IGFuZCBnZXQgaXQgYWdhaW4uIEl0IG1heSBub3cgYmUgdmFsaWQuCi0JCQkJaWYgKGNsYXNzRW50cnkuaXNEZWxldGVkKCkpIHsKLQkJCQkJY2xhc3NFbnRyeSA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENsYXNzRW50cnkoZ2V0SmF2YUNsYXNzKCkpOwotCQkJCQlpZiAoY2xhc3NFbnRyeSAhPSBudWxsKQotCQkJCQkJaWYgKGNsYXNzRW50cnkuaXNEZWxldGVkKCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBoYXZlIGJlZW4gZGVsZXRlZC4gUHJvYmFibHkgc2hvdWxkbid0IG9mIGdvdHRvbiBoZXJlIGluIHRoaXMgY2FzZS4KLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCB3aGljaCBtZWFucyBhcmUgZGVsZXRlZCwgb3IgbmV2ZXIgY2FjaGVkLgotCQkJcmV0dXJuIGNsYXNzRW50cnkuZ2V0Q29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKCkgPT0gUGxhdGZvcm0uZ2V0UGxhdGZvcm1BZG1pbigpLmdldFN0YXRlKGZhbHNlKS5nZXRUaW1lU3RhbXAoKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgY2FjaGUgZm9yIHRoaXMgZW50cnkgaXMgc3RhbGUgY29tcGFyZWQgdG8gdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCwgb3IgaWYgdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBpdHNlbGYgaXMgc3RhbGUsIG1lYW5pbmcKLQkgKiBzdWJjbGFzcyB3YXMgc3RhbGUgYWxyZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdFN0YW1wIHRoZSB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0LiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHdlIGNhbiB1c2UgdGhlIGluY29taW5nIGNhY2hlIHN0YW1wLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblVzZUNhY2hlKGxvbmcgcmVxdWVzdFN0YW1wKSB7Ci0JCWxvbmcgbW9kU3RhbXA7Ci0JCS8vIE5vdyBnZXQgdGhlIGN1cnJlbnQgbW9kIHN0YW1wIGZvciB0aGlzIGNsYXNzIHNvIHdlIGNhbiBjb21wYXJlIGl0LgotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFdlIG1heSBhbHJlYWR5IGhhdmUgYSBjbGFzcyBlbnRyeSBkdWUgdG8gYSBzdWJjbGFzcyBkb2luZyBhIGNoZWNrLCBzbyBpZiB3ZSBkbywgd2UnbGwgdXNlIGl0LiBFbHNlIHdlJ2xsIGdldCB0aGUgbGF0ZXN0IG9uZS4KLQkJCWlmIChjbGFzc0VudHJ5ID09IG51bGwpCi0JCQkJY2xhc3NFbnRyeSA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENsYXNzRW50cnkoZ2V0SmF2YUNsYXNzKCkpOwotCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkgewotCQkJCS8vIFdlIGhhdmUgYSBjYWNoZSB0byBjaGVjay4KLQkJCQltb2RTdGFtcCA9IGNsYXNzRW50cnkuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkvLyBBIHNhbml0eSBjaGVjaywgaWYgdGhpcyB3YXMgYW4gb2xkLCBidXQgbm93IGRlbGV0ZWQgb25lIHdlIHdhbnQgdG8gdGhyb3cgaXQgYXdheSBhbmQgZ2V0IGl0IGFnYWluLiBJdCBtYXkgbm93IGJlIHZhbGlkLgotCQkJCWlmIChtb2RTdGFtcCA9PSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5DbGFzc0VudHJ5LkRFTEVURURfTU9ESUZJQ0FUSU9OX1NUQU1QKSB7Ci0JCQkJCWNsYXNzRW50cnkgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDbGFzc0VudHJ5KGdldEphdmFDbGFzcygpKTsKLQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkKLQkJCQkJCW1vZFN0YW1wID0gY2xhc3NFbnRyeS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCQlpZiAobW9kU3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgbW9kU3RhbXAgPT0gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuQ2xhc3NFbnRyeS5ERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBTaW5jZSB3ZSBhcmUgc3RhbGUsIGNoaWxkIGFza2luZyBxdWVzdGlvbiBtdXN0IGFsc28gYmUgc3RhbGUgYW5kIGNhbid0IHVzZSB0aGUgY2FjaGUuCi0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGRvbid0IGhhdmUgYSBjYWNoZSBlbnRyeSB0byBjaGVjayBhZ2FpbnN0LCBzbyBjaGlsZCBtdXN0IGJlIHN0YWxlIHRvby4KLQkJfQotCQkvLyBJZiB0aGUgcmVxdWVzdGVkIHN0YW1wIGlzIG5vdCB0aGUgc2FtZSBhcyBvdXJzLCB0aGVuIGl0IGlzIG91dCBvZiBkYXRlIChpdCBjb3VsZG4ndCBiZSBuZXdlciBidXQgaXQgY291bGQgYmUgb2xkZXIpLgotCQlyZXR1cm4gcmVxdWVzdFN0YW1wID09IG1vZFN0YW1wOwotCX0KLQkJCi0JLyoKLQkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0aHJvdWdoIGludHJvc3BlY3RJZk5lY2Vzc2FyeSBzbyB0aGF0IGZsYWdzIGFyZSBzZXQgY29ycmVjdGx5LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRyb3NwZWN0KGJvb2xlYW4gZG9PcGVyYXRpb25zKSB7Ci0JCUlCZWFuUHJveHkgYmVhbmluZm8gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzUmVzb3VyY2VDb25uZWN0ZWQoKSkgewotCQkJCS8vIFNlZSBpZiBhcmUgdmFsaWQga2luZCBvZiBjbGFzcy4KLQkJCQlpZiAoZ2V0SmF2YUNsYXNzKCkuZ2V0S2luZCgpID09IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKSB7Ci0JCQkJCS8vIE5vdCB2YWxpZCwgZG9uJ3QgbGV0IGFueSBmdXJ0aGVyIGludHJvc3BlY3Rpb24gb2NjdXIuCi0JCQkJCS8vIE1hcmsgdGhhdCB3ZSd2ZSBkb25lIGFsbCBpbnRyb3NwZWN0aW9ucyBzbyBhcyBub3QgdG8gd2FzdGUgdGltZSB1bnRpbCB3ZSBnZXQgbm90aWZpZWQgdGhhdCBpdCBoYXMgYmVlbiBhZGRlZAotCQkJCQkvLyBiYWNrIGluLgotCQkJCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkgewotCQkJCQkJCWNsYXNzRW50cnkubWFya0RlbGV0ZWQoKTsJLy8gbWFyayBpdCBkZWxldGVkIGluIGNhc2Ugc3RpbGwgc2l0dGluZyBpbiBjYWNoZSAobWF5YmUgYmVjYXVzZSBpdCB3YXMgaW4gYW4gZXh0ZXJuYWwgamFyLCB3ZSBjYW4ndCBrbm93IGlmIGRlbGV0ZWQgd2hlbiBqYXIgY2hhbmdlZCkuCi0JCQkJCQkJY2xhc3NFbnRyeSA9IG51bGw7CS8vIEdldCByaWQgb2YgaXQgc2luY2Ugbm93IGRlbGV0ZWQuCi0JCQkJCQl9Ci0JCQkJCQluZWVkc0ludHJvc3BlY3Rpb24gPSBmYWxzZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IFJFVFJJRVZFRF9GVUxMX0RPQ1VNRU5UIHx8IHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IENMRUFSX0VYVEVOU0lPTlMpIHsKLQkJCQkJCS8vIFdlJ3ZlIGJlZW4gZGVmaW5lZCBhdCBvbmUgcG9pbnQuIE5lZWQgdG8gY2xlYXIgZXZlcnl0aGluZyBhbmQgc3RlcCBiYWNrCi0JCQkJCQkvLyB0byBuZXZlciByZXRyaWV2ZWQgc28gdGhhdCB3ZSBub3cgZ2V0IHRoZSByb290IGFkZGVkIGluLiBJZiB3ZSBoYWQgYmVlbgotCQkJCQkJLy8gcHJldmlvdXNseSBkZWZpbmVkLCB0aGVuIHdlIGRpZG4ndCBoYXZlIHJvb3QuIFdlIHdpbGwgaGF2ZSB0byBsb3NlCi0JCQkJCQkvLyBhbGwgb3RoZXIgdXBkYXRlcyB0b28uIEJ1dCB0aGV5IGNhbiBjb21lIGJhY2sgd2hlbiB3ZSdyZSBkZWZpbmVkLgotCQkJCQkJLy8gT3Igd2UndmUgYmVlbiBhc2tlZCB0byBjbGVhciBhbGwuCi0JCQkJCQljbGVhckFsbCgpOwotCQkJCQkJcmV0cmlldmVkRXh0ZW5zaW9uRG9jdW1lbnQgPSBORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UOwotCQkJCQl9Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9PSBORVZFUl9SRVRSSUVWRURfRVhURU5TSU9OX0RPQ1VNRU5UKQotCQkJCQkJYXBwbHlFeHRlbnNpb25Eb2N1bWVudCh0cnVlKTsJLy8gQWRkIGluIFJvb3Qgc3R1ZmYgc28gdGhhdCBpdCB3aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gdGhvdWdoIHVuZGVmaW5lZC4KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUT0RPIEZvciBub3cgY2F1c2UgcmVjeWNsZSBvZiB2bSBpZiBhbnkgc3VwZXIgdHlwZSBpcyBzdGFsZSBzbyB0aGF0IGlmIHJlZ2lzdHJ5IGlzIHN0YWxlIGZvciB0aGUgc3VwZXIgdHlwZSBpdCB3aWxsIGJlCi0JCQkJCS8vIHJlY3JlYXRlZC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSByZWZsZWN0aW9uIHJlcXVpcmVzIHN1cGVyUHJvcGVydGllcywgZXRjLiBhbmQgcmVjcmVhdGluZyB0aGUgcmVnaXN0cnkKLQkJCQkJLy8gY3VycmVudGx5IHJlLW1hcmtzIGV2ZXJ5b25lIGFzIHN0YWxlLCBpbmNsdWRpbmcgdGhpcyBzdWJjbGFzcy4gVGhpcyB3b3VsZCBtZWFuIHRoYXQKLQkJCQkJLy8gcmUtaW50cm9zcGVjdGlvbiB3b3VsZCBuZWVkIHRvIGJlIGRvbmUsIGV2ZW4gdGhvdWdoIHdlIGp1c3QgZGlkIGl0LiBUaGUgc3RhbGUgcmVnaXN0cnkgYnVzaW5lc3MgbmVlZHMgdG8gYmUgcmUtYWRkcmVzc2VkIHNvIHRoYXQgaXQgaXMKLQkJCQkJLy8gYSBsb3Qgc21hcnRlci4gCi0JCQkJCUxpc3Qgc3VwZXJzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGJjYSA9IChCZWFuaW5mb0NsYXNzQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcigoRU9iamVjdCkgc3VwZXJzLmdldChpKSwKLQkJCQkJCQkJSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQkJCWlmIChiY2EgIT0gbnVsbCAmJiBiY2EuaXNTdGFsZSgpKQotCQkJCQkJCWJjYS5nZXRSZWdpc3RyeSgpOwotCQkJCQl9Ci0JCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIGZvcmNlIGludHJvc3BlY3Rpb24sIGlmIG5lZWRlZCwgb2YgYWxsIHBhcmVudHMgYmVjYXVzZSB3ZSBuZWVkIHRoZW0gdG8gYmUgdXAtdG8tZGF0ZSBmb3IgdGhlCi0JCQkJCS8vIGNsYXNzIGVudHJ5LgotCQkJCQkvLyBUT0RPIHNlZSBpZiB3ZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIHdheSB0aGF0IHdlIEtOT1cgdGhlIENFIGlzIGNvcnJlY3QsIGV2ZW4gaWYgYW55IHN1cGVycyBhcmUgc3RhbGUuCi0JCQkJCXN1cGVycyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlCZWFuaW5mb0NsYXNzQWRhcHRlciBiY2EgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcigoRU9iamVjdCkgc3VwZXJzLmdldChpKSwKLQkJCQkJCQkJSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQkJCWJjYS5pbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsKLQkJCQkJfQotCi0JCQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoSU5UUk9TUEVDVCk7Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9PSBSRVRSSUVWRURfUk9PVF9PTkxZIHx8IHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IENMRUFSX0VYVEVOU0lPTlMpIHsKLQkJCQkJCS8vIFdlIG5lZWQgdG8gY2xlYXIgb3V0IEVWRVJZVEhJTkcgYmVjYXVzZSB3ZSBhcmUgY29taW5nIGZyb20gYW4gdW5kZWZpbmVkIHRvIGEgZGVmaW5lZC4KLQkJCQkJCS8vIE5vdGhpbmcgcHJldmlvdXMgaXMgbm93IHZhbGlkLiAoUGFydGljdWxhcmx5IHRoZSByb290IHN0dWZmKS4KLQkJCQkJCS8vIE9yIHdlIGhhZCBhIENsZWFuIHJlcXVlc3RlZCBhbmQgbmVlZCB0byBjbGVhciB0aGUgZXh0ZW5zaW9ucyB0b28uCi0JCQkJCQljbGVhckFsbCgpOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gZmlyc3RUaW1lID0gZmFsc2U7Ci0JCQkJCWlmIChyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCAhPSBSRVRSSUVWRURfRlVMTF9ET0NVTUVOVCkgewotCQkJCQkJZmlyc3RUaW1lID0gdHJ1ZTsJLy8gSWYgd2UgbmVlZCB0byBhcHBseSB0aGUgZXh0ZW5zaW9uIGRvYywgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLgotCQkJCQkJYXBwbHlFeHRlbnNpb25Eb2N1bWVudChmYWxzZSk7IC8vIEFwcGx5IHRoZSBleHRlbnNpb24gZG9jIGJlZm9yZSB3ZSBkbyBhbnl0aGluZy4KLQkJCQkJfQotCi0JCQkJCS8vIE5vdyBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSB0aGUgY2FjaGUuCi0JCQkJCWJvb2xlYW4gZG9JbnRyb3NwZWN0aW9uID0gdHJ1ZTsKLQkJCQkJaWYgKGZpcnN0VGltZSkgewotCQkJCQkJLy8gQ2hlY2sgaWYgd2UgY2FuIHVzZSB0aGUgY2FjaGUuIFVzZSBNYXggdmFsdWUgc28gdGhhdCBmaXJzdCBsZXZlbCB0ZXN0IChvdXJzZWxmKSB3aWxsIGFsd2F5cyBwYXNzIGFuZCBnbyBvbiB0byB0aGUgc3VwZXJzLgotCQkJCQkJaWYgKGNhblVzZUNhY2hlKCkpIHsKLQkJCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKExPQURfRlJPTV9DQUNIRSk7Ci0JCQkJCQkJLy8gV2UgY2FuIHVzZSB0aGUgY2FjaGUuCi0JCQkJCQkJUmVzb3VyY2UgY3JlcyA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENhY2hlKGdldEphdmFDbGFzcygpLCBjbGFzc0VudHJ5LCB0cnVlKTsKLQkJCQkJCQlpZiAoY3JlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkvLyBHb3QgYSBjYWNoZSB0byB1c2UsIG5vdyBhcHBseSBpdC4KLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgY2RzID0gY3Jlcy5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGNkcy5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJQ2hhbmdlRGVzY3JpcHRpb24gY2FjaGVDRCA9IChDaGFuZ2VEZXNjcmlwdGlvbikgY2RzLm5leHQoKTsKLQkJCQkJCQkJCQljYWNoZUNELmFwcGx5KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkvLyBXZSBuZWVkIHRvIHdhbGsgdGhyb3VnaCBhbmQgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBJRCdzIGZvciBldmVudHMvYWN0aW9ucy9wcm9wZXJ0aWVzIGJlY2F1c2UgYnkKLQkJCQkJCQkJCS8vIGRlZmF1bHQgZnJvbSB0aGUgY2hhbmdlIGRlc2NyaXB0aW9ucyB0aGVzZSBkb24ndCBnZXQgcmVmbGVjdGVkIGJhY2suIEFuZCBpZiBzb21lIG9uZSBkb2Vzbid0Ci0JCQkJCQkJCQkvLyB1c2UgYW4gSUQgdG8gZ2V0IHRoZW0sIHRoZXkgd29uJ3QgaGF2ZSBhbiBpZCBzZXQuCi0JCQkJCQkJCQlkb0lEcygpOwotCQkJCQkJCQkJZG9JbnRyb3NwZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJCQkJQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuSU5UUk9TUEVDVF9GQUlMRURfRVhDXywgCi0JCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLCAiIn0pLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJTGV2ZWwuV0FSTklORyk7Ci0JCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQkvLyBSZW1vdmUgdGhlIGNyZXMgc2luY2UgaXQgaXMgbm93IGludmFsaWQuIFRoZSBhcHBsaWVzIGNhdXNlIHRoZW0gdG8gYmUgaW52YWxpZC4KLQkJCQkJCQkJCWNyZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoY3Jlcyk7Ci0JCQkJCQkJCQlpZiAoZG9JbnRyb3NwZWN0aW9uKSB7Ci0JCQkJCQkJCQkJLy8gQXBwbHkgaGFkIGZhaWxlZC4gV2UgZG9uJ3Qga25vdyBob3cgZmFyIGl0IHdlbnQuIFdlIG5lZWQgdG8gd2lwZSBvdXQgYW5kIHJlZ2V0IEVWRVJZVEhJTkcuCi0JCQkJCQkJCQkJY2xlYXJBbGwoKTsKLQkJCQkJCQkJCQlhcHBseUV4dGVuc2lvbkRvY3VtZW50KGZhbHNlKTsgLy8gUmUtYXBwbHkgdGhlIGV4dGVuc2lvbiBkb2MgYmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2UuCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKExPQURfRlJPTV9DQUNIRSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChkb0ludHJvc3BlY3Rpb24pIHsKLQkJCQkJCS8vIEZpbmFsbHkgd2UgY2FuIGdldCB0byBoYW5kbGluZyBvdXJzZWx2ZXMuCi0JCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFTU9URV9JTlRST1NQRUNUKTsKLQkJCQkJCUJlYW5EZWNvcmF0b3IgZGVjb3IgPSBVdGlsaXRpZXMuZ2V0QmVhbkRlY29yYXRvcihnZXRKYXZhQ2xhc3MoKSk7Ci0JCQkJCQlpZiAoZGVjb3IgPT0gbnVsbCkgewotCQkJCQkJCWRlY29yID0gQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCZWFuRGVjb3JhdG9yKCk7Ci0JCQkJCQkJZGVjb3Iuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCk7Ci0JCQkJCQkJZ2V0SmF2YUNsYXNzKCkuZ2V0RUFubm90YXRpb25zKCkuYWRkKGRlY29yKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcihkZWNvcik7CS8vIENsZWFyIG91dCBwcmV2aW91cyByZXN1bHRzLgotCQkJCQkJCi0JCQkJCQlib29sZWFuIGRvUmVmbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQlpZiAoZG9PcGVyYXRpb25zKQotCQkJCQkJCW5ld29wZXJhdGlvbnMgPSBuZXcgSGFzaFNldCg1MCk7Ci0JCQkJCQlpZiAoZGVjb3IuaXNEb0JlYW5pbmZvKCkpIHsKLQkJCQkJCQlpbnQgZG9GbGFncyA9IDA7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQkJCQkJZG9GbGFncyB8PSBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX0JFQU5fREVDT1I7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNJbnRyb3NwZWN0RXZlbnRzKCkpCi0JCQkJCQkJCWRvRmxhZ3MgfD0gSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19FVkVOVFM7Ci0JCQkJCQkJaWYgKGRlY29yID09IG51bGwgfHwgZGVjb3IuaXNJbnRyb3NwZWN0UHJvcGVydGllcygpKQotCQkJCQkJCQlkb0ZsYWdzIHw9IElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRE9fUFJPUEVSVElFUzsKLQkJCQkJCQlpZiAoZG9PcGVyYXRpb25zICYmIChkZWNvciA9PSBudWxsIHx8IGRlY29yLmlzSW50cm9zcGVjdE1ldGhvZHMoKSkpCi0JCQkJCQkJCWRvRmxhZ3MgfD0gSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19NRVRIT0RTOwotCQkJCQkJCQotCQkJCQkJCWlmIChkb0ZsYWdzICE9IDApIHsKLQkJCQkJCQkJLy8gVGhlcmUgd2FzIHNvbWV0aGluZyByZW1vdGUgdG8gZG8uCi0JCQkJCQkJCUlCZWFuVHlwZVByb3h5IHRhcmdldFR5cGUgPSBudWxsOwotCQkJCQkJCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7Ci0JCQkJCQkJCWlmIChyZWdpc3RyeSAhPSBudWxsICYmIHJlZ2lzdHJ5LmlzVmFsaWQoKSkKLQkJCQkJCQkJCXRhcmdldFR5cGUgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSk7Ci0JCQkJCQkJCWlmICh0YXJnZXRUeXBlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICh0YXJnZXRUeXBlLmdldEluaXRpYWxpemF0aW9uRXJyb3IoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdHJlYXQgdGhpcyBhcyBubyBwcm94eSwgaG93ZXZlciBsb2cgaXQgYmVjYXVzZSB3ZQotCQkJCQkJCQkJCS8vIHNob3VsZG4ndCBoYXZlIGV4Y2VwdGlvbnMgZHVyaW5nIGludHJvc3BlY3Rpb24sIGJ1dCBpZiB3ZSBkbyBpdCBzaG91bGQgYmUgbG9nZ2VkCi0JCQkJCQkJCQkJLy8gc28gaXQgY2FuIGJlIGNvcnJlY3RlZC4KLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQliZWFuaW5mbyA9IGdldFByb3h5Q29uc3RhbnRzKCkuZ2V0SW50cm9zcGVjdFByb3h5KCkuaW52b2tlKG51bGwsCi0JCQkJCQkJCQkJCQkJbmV3IElCZWFuUHJveHlbXSB7IHRhcmdldFR5cGUsIGdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpLCBnZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGRvRmxhZ3MpfSk7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuSU5UUk9TUEVDVF9GQUlMRURfRVhDXywgbmV3IE9iamVjdFtdIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCQlnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLCAiIn0pLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJCWUpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCS8vIFRoZSBjbGFzcyBpdHNlbGYgY291bGRuJ3QgYmUgaW5pdGlhbGl6ZWQuIEp1c3QgbG9nIGl0LCBidXQgdHJlYXQgYXMgbm8gcHJveHkuCi0JCQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nKAotCQkJCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChCZWFuSW5mb0FkYXB0ZXJNZXNzYWdlcy5JTlRST1NQRUNUX0ZBSUxFRF9FWENfLCBuZXcgT2JqZWN0W10geyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKSwgdGFyZ2V0VHlwZS5nZXRJbml0aWFsaXphdGlvbkVycm9yKCl9KSwgbnVsbCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gVGhlIGNsYXNzIGl0c2VsZiBjb3VsZCBub3QgYmUgZm91bmQuIEp1c3QgbG9nIGl0LCBidXQgdHJlYXQgYXMgbm8gcHJveHkuCi0JCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuSU5UUk9TUEVDVF9GQUlMRURfRVhDXywgbmV3IE9iamVjdFtdIHsgCi0JCQkJCQkJCQkJCQkJCQlnZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpLAotCQkJCQkJCQkJCQkJCQkJQmVhbkluZm9BZGFwdGVyTWVzc2FnZXMuQmVhbmluZm9DbGFzc0FkYXB0ZXJfQ2xhc3NOb3RGb3VuZH0pLCAKLQkJCQkJCQkJCQkJCQkJCW51bGwpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJaWYgKGJlYW5pbmZvICE9IG51bGwpIHsKLQkJCQkJCQkJCWRvUmVmbGVjdGlvbiA9IGZhbHNlOwkvLyBXZSBoYXZlIGEgYmVhbmluZm8sIHNvIHdlIGFyZSBkb2luZyBpbnRyb3NwZWN0aW9uLgotCQkJCQkJCQkJZmluYWwgQmVhbkRlY29yYXRvciBiZGVjb3IgPSBkZWNvcjsKLQkJCQkJCQkJCS8vIFdlIGhhdmUgYSBiZWFuaW5mbyB0byBwcm9jZXNzLgotCQkJCQkJCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmludHJvc3BlY3QoYmVhbmluZm8sIG5ldyBCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuSW50cm9zcGVjdENhbGxCYWNrKCkgewotCi0JCQkJCQkJCQkJLyo7IChub24tSmF2YWRvYykKLQkJCQkJCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuSW50cm9zcGVjdENhbGxCYWNrI3Byb2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5CZWFuUmVjb3JkKQotCQkJCQkJCQkJCSAqLwotCQkJCQkJCQkJCXB1YmxpYyBCZWFuRGVjb3JhdG9yIHByb2Nlc3MoQmVhblJlY29yZCByZWNvcmQpIHsKLQkJCQkJCQkJCQkJcmV0dXJuIGJkZWNvcjsKLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LkludHJvc3BlY3RDYWxsQmFjayNwcm9jZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uUHJvcGVydHlSZWNvcmQpCi0JCQkJCQkJCQkJICovCi0JCQkJCQkJCQkJcHVibGljIFByb3BlcnR5RGVjb3JhdG9yIHByb2Nlc3MoUHJvcGVydHlSZWNvcmQgcmVjb3JkKSB7Ci0JCQkJCQkJCQkJCXJldHVybiBjYWxjdWxhdGVQcm9wZXJ0eShyZWNvcmQsIGZhbHNlKTsKLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LkludHJvc3BlY3RDYWxsQmFjayNwcm9jZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uSW5kZXhlZFByb3BlcnR5UmVjb3JkKQotCQkJCQkJCQkJCSAqLwotCQkJCQkJCQkJCXB1YmxpYyBQcm9wZXJ0eURlY29yYXRvciBwcm9jZXNzKEluZGV4ZWRQcm9wZXJ0eVJlY29yZCByZWNvcmQpIHsKLQkJCQkJCQkJCQkJcmV0dXJuIGNhbGN1bGF0ZVByb3BlcnR5KHJlY29yZCwgdHJ1ZSk7Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5JbnRyb3NwZWN0Q2FsbEJhY2sjcHJvY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLk1ldGhvZFJlY29yZCkKLQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQlwdWJsaWMgTWV0aG9kRGVjb3JhdG9yIHByb2Nlc3MoTWV0aG9kUmVjb3JkIHJlY29yZCkgewotCQkJCQkJCQkJCQlyZXR1cm4gY2FsY3VsYXRlT3BlcmF0aW9uKHJlY29yZCk7Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5JbnRyb3NwZWN0Q2FsbEJhY2sjcHJvY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkV2ZW50U2V0UmVjb3JkKQotCQkJCQkJCQkJCSAqLwotCQkJCQkJCQkJCXB1YmxpYyBFdmVudFNldERlY29yYXRvciBwcm9jZXNzKEV2ZW50U2V0UmVjb3JkIHJlY29yZCkgewotCQkJCQkJCQkJCQlyZXR1cm4gY2FsY3VsYXRlRXZlbnQocmVjb3JkKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9KTsKLQkJCQkJCQkJfSAKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmIChkb1JlZmxlY3Rpb24pIHsKLQkJCQkJCQkvLyBOZWVkIHRvIGRvIHJlZmxlY3Rpb24gc3R1ZmYuCi0JCQkJCQkJaWYgKGRlY29yLmlzSW50cm9zcGVjdFByb3BlcnRpZXMoKSkKLQkJCQkJCQkJcmVmbGVjdFByb3BlcnRpZXMoKTsKLQkJCQkJCQlpZiAoZG9PcGVyYXRpb25zICYmIGRlY29yLmlzSW50cm9zcGVjdE1ldGhvZHMoKSkKLQkJCQkJCQkJcmVmbGVjdE9wZXJhdGlvbnMoKTsKLQkJCQkJCQlpZiAoZGVjb3IuaXNJbnRyb3NwZWN0RXZlbnRzKCkpCi0JCQkJCQkJCXJlZmxlY3RFdmVudHMoKTsKLQkJCQkJCX0KLQkJCQkJCUNoYW5nZURlc2NyaXB0aW9uIGNkID0gQ2hhbmdlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hhbmdlRGVzY3JpcHRpb24oKTsJCQkJCQkKLQkJCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5idWlsZENoYW5nZShjZCwgZGVjb3IpOwotCQkJCQkJZmluYWxpemVQcm9wZXJ0aWVzKGNkKTsKLQkJCQkJCWlmIChkb09wZXJhdGlvbnMpCi0JCQkJCQkJZmluYWxpemVPcGVyYXRpb25zKGNkKTsKLQkJCQkJCWZpbmFsaXplRXZlbnRzKGNkKTsKLQotCQkJCQkJY2xhc3NFbnRyeSA9IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLm5ld0NhY2hlKGdldEphdmFDbGFzcygpLCBjZCwgZG9PcGVyYXRpb25zID8gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuUkVGTEVDVElPTl9PUEVSQVRJT05TX0NBQ0hFIDogQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuUkVGTEVDVElPTl9DQUNIRSk7Ci0JCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVNT1RFX0lOVFJPU1BFQ1QpOyAKLQkJCQkJfQotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoSU5UUk9TUEVDVCk7Ci0JCQkJfQotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkucmVnaXN0ZXJJbnRyb3NwZWN0aW9uKGdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCksIHRoaXMpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGJlYW5pbmZvICE9IG51bGwpIHsKLQkJCQliZWFuaW5mby5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLnJlbGVhc2VQcm94eShiZWFuaW5mbyk7IC8vIERpc3Bvc2Ugb2YgdGhlIGJlYW5pbmZvIHNpbmNlIHdlIG5vdyBoYXZlIGV2ZXJ5dGhpbmcuCi0JCQl9Ci0JCQlldmVudHNNYXAgPSBudWxsOyAvLyBDbGVhciBvdXQgdGhlIHRlbXAgbGlzdHMuCi0JCQlldmVudHNSZWFsTGlzdCA9IG51bGw7Ci0JCQlvcGVyYXRpb25zTWFwID0gbnVsbDsgLy8gQ2xlYXIgb3V0IHRoZSB0ZW1wIGxpc3RzLgotCQkJb3BlcmF0aW9uc1JlYWxMaXN0ID0gbnVsbDsKLQkJCW5ld29wZXJhdGlvbnMgPSBudWxsOwotCQkJcHJvcGVydGllc01hcCA9IG51bGw7IC8vIEdldCByaWQgb2YgYWNjdW11bGF0ZWQgbWFwLgotCQkJZmVhdHVyZXNSZWFsTGlzdCA9IG51bGw7IC8vIFJlbGVhc2UgdGhlIHJlYWwgbGlzdC4KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0lEcygpIHsKLQkJLy8gRG8gcHJvcGVydGllcy4KLQkJaWYgKGdldEphdmFDbGFzcygpLmVJc1NldChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FU3RydWN0dXJhbEZlYXR1cmVzKCkpKSB7Ci0JCQlMaXN0IGZlYXR1cmVzID0gZ2V0RmVhdHVyZXNMaXN0KCk7Ci0JCQlpbnQgbGVuID0gZmVhdHVyZXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKGYpOwotCQkJCWlmIChwZCA9PSBudWxsIHx8ICFwZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKQotCQkJCQljb250aW51ZTsgLy8gTm90IGEgcHJvcGVydHkgZm9yIHVzIHRvIGdpdmUgYW4gSUQgdG8uCi0JCQkJc2V0UHJvcGVydHlJRChmLmdldE5hbWUoKSwgZik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIERvIGV2ZW50cy4KLQkJaWYgKGdldEphdmFDbGFzcygpLmVJc1NldChKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0V2ZW50cygpKSkgewotCQkJTGlzdCBldmVudHMgPSBnZXRFdmVudHNMaXN0KCk7Ci0JCQlpbnQgbGVuID0gZXZlbnRzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlCZWFuRXZlbnQgZSA9IChCZWFuRXZlbnQpIGV2ZW50cy5nZXQoaSk7Ci0JCQkJRXZlbnRTZXREZWNvcmF0b3IgZWQgPSBVdGlsaXRpZXMuZ2V0RXZlbnRTZXREZWNvcmF0b3IoZSk7Ci0JCQkJaWYgKGVkID09IG51bGwgfHwgIWVkLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpCi0JCQkJCWNvbnRpbnVlOyAvLyBOb3QgYW4gZXZlbnQgZm9yIHVzIHRvIGdpdmUgYW4gSUQgdG8uCi0JCQkJc2V0RXZlbnRJRChlLmdldE5hbWUoKSwgZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBEbyBPcGVyYXRpb25zLgotCQlpZiAoZ2V0SmF2YUNsYXNzKCkuZUlzU2V0KEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VPcGVyYXRpb25zKCkpKSB7Ci0JCQlMaXN0IG9wcyA9IGdldE9wZXJhdGlvbnNMaXN0KCk7Ci0JCQlpbnQgbGVuID0gb3BzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlFT3BlcmF0aW9uIG8gPSAoRU9wZXJhdGlvbikgb3BzLmdldChpKTsKLQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKG8pOwotCQkJCWlmIChtZCA9PSBudWxsIHx8ICFtZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKQotCQkJCQljb250aW51ZTsgLy8gTm90IGFuIGV2ZW50IGZvciB1cyB0byBnaXZlIGFuIElEIHRvLgotCQkJCXNldE1ldGhvZElEKG8uZ2V0TmFtZSgpLCBvKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX09WRVJSSURFID0gQmVhbmluZm9QbHVnaW4uUk9PVCsnLicrQmVhbmluZm9QbHVnaW4uT1ZFUlJJREVfRVhURU5TSU9OOwkgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCB2b2lkIGFwcGx5RXh0ZW5zaW9uRG9jdW1lbnQoYm9vbGVhbiByb290T25seSkgewotCQl0cnkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChBUFBMWV9FWFRFTlNJT05TKTsKLQkJCWJvb2xlYW4gY2FuVXNlQ2FjaGUgPSAhcm9vdE9ubHkgJiYgY2FuVXNlT3ZlcnJpZGVDYWNoZSgpOwotCQkJYm9vbGVhbiBhbHJlYWR5UmV0cmlldmVkUm9vdCA9IHJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID09IFJFVFJJRVZFRF9ST09UX09OTFk7Ci0JCQlyZXRyaWV2ZWRFeHRlbnNpb25Eb2N1bWVudCA9IHJvb3RPbmx5ID8gUkVUUklFVkVEX1JPT1RfT05MWSA6IFJFVFJJRVZFRF9GVUxMX0RPQ1VNRU5UOwotCQkJSmF2YUNsYXNzIGpjID0gZ2V0SmF2YUNsYXNzKCk7Ci0JCQlSZXNvdXJjZSBtZXJnZUludG9SZXNvdXJjZSA9IGpjLmVSZXNvdXJjZSgpOwotCQkJUmVzb3VyY2VTZXQgcnNldCA9IG1lcmdlSW50b1Jlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gamMuZ2V0TmFtZSgpOwotCQkJaWYgKGNhblVzZUNhY2hlKSB7Ci0JCQkJLy8gV2UgY2FuIHVzZSB0aGUgY2FjaGUsIHNlZSBpZiB3ZSBhY3R1YWxseSBoYXZlIG9uZS4KLQkJCQlpZiAoZ2V0Q2xhc3NFbnRyeSgpLm92ZXJyaWRlQ2FjaGVFeGlzdHMoKSkgewotCQkJCQkvLyBHZXQgdGhlIGNhY2hlIGFuZCBhcHBseSBpdCBiZWZvcmUgYW55dGhpbmcgZWxzZS4KLQkJCQkJUmVzb3VyY2UgY2FjaGVSZXMgPSBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS5nZXRDYWNoZShqYywgZ2V0Q2xhc3NFbnRyeSgpLCBmYWxzZSk7Ci0JCQkJCWlmIChjYWNoZVJlcyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5ldyBFeHRlbnNpb25Eb2NBcHBsaWVzKG51bGwsIHJzZXQsIGpjLCBudWxsKS5ydW4oY2FjaGVSZXMpOwotCQkJCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklELCAwLAotCQkJCQkJCQkJCQkiRXJyb3IgcHJvY2Vzc2luZyBmaWxlXCIiICsgY2FjaGVSZXMuZ2V0VVJJKCkgKyAiXCIiLCBlLmV4Y2VwdGlvbigpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkJCQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQljYWNoZVJlcy5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZShjYWNoZVJlcyk7IC8vIFdlIGRvbid0IG5lZWQgaXQgYXJvdW5kIG9uY2Ugd2UgZG8gdGhlIG1lcmdlLiBOb3JtYWwgbWVyZ2Ugd291bGQgb2YgZ290dG9uIHJpZCBvZiBpdCwgYnV0IGluIGNhc2Ugb2YgZXJyb3Igd2UgZG8gaXQgaGVyZS4KLQkJCQkJCX0KLQkJCQkJfSBlbHNlCi0JCQkJCQljYW5Vc2VDYWNoZSA9IGZhbHNlOyAvLyBOZWVkIHRvIHJlYnVpbGQgdGhlIGNhY2hlLgotCQkJCX0KLQkJCX0KLQkJCUxpc3Qgb3ZlcnJpZGVDYWNoZSA9IG51bGw7Ci0JCQlpZiAoIWFscmVhZHlSZXRyaWV2ZWRSb290ICYmIChyb290T25seSB8fCBqYy5nZXRTdXBlcnR5cGUoKSA9PSBudWxsKSkgewotCQkJCS8vIEl0IGlzIGEgcm9vdCBjbGFzcy4gTmVlZCB0byBtZXJnZSBpbiByb290IHN0dWZmLgotCQkJCWlmICghY2FuVXNlQ2FjaGUpIHsKLQkJCQkJb3ZlcnJpZGVDYWNoZSA9IGNyZWF0ZU92ZXJyaWRlQ2FjaGUob3ZlcnJpZGVDYWNoZSwgZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRQcm9qZWN0KCksIEJlYW5pbmZvUGx1Z2luLlJPT1QsIFJPT1RfT1ZFUlJJREUsIHJzZXQsIGpjKTsKLQkJCQl9Ci0JCQkJYXBwbHlFeHRlbnNpb25Eb2NUbyhyc2V0LCBqYywgUk9PVF9PVkVSUklERSwgQmVhbmluZm9QbHVnaW4uUk9PVCwgQmVhbmluZm9QbHVnaW4uUk9PVCk7Ci0JCQkJaWYgKHJvb3RPbmx5KQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyBiYXNlT3ZlcnJpZGVmaWxlID0gY2xhc3NOYW1lICsgJy4nICsgQmVhbmluZm9QbHVnaW4uT1ZFUlJJREVfRVhURU5TSU9OOyAvLyBnZXROYW1lKCkgcmV0dXJucyBpbm5lciBjbGFzc2VzIHdpdGggIiQiIG5vdGF0aW9uLCB3aGljaCBpcyBnb29kLiAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBqYy5nZXRKYXZhUGFja2FnZSgpLmdldFBhY2thZ2VOYW1lKCk7Ci0JCQlpZiAoIWNhblVzZUNhY2hlKSB7Ci0JCQkJb3ZlcnJpZGVDYWNoZSA9IGNyZWF0ZU92ZXJyaWRlQ2FjaGUob3ZlcnJpZGVDYWNoZSwgZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRQcm9qZWN0KCksIHBhY2thZ2VOYW1lLCBiYXNlT3ZlcnJpZGVmaWxlLCByc2V0LCBqYyk7Ci0JCQl9Ci0JCQlhcHBseUV4dGVuc2lvbkRvY1RvKHJzZXQsIGpjLCBiYXNlT3ZlcnJpZGVmaWxlLCBwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKTsKLQkJCQotCQkJaWYgKCFjYW5Vc2VDYWNoZSkgewotCQkJCS8vIFdlIGhhdmUgYW4gb3ZlcnJpZGUgY2FjaGUgdG8gc3RvcmUuIElmIHRoZSBjYWNoZSBpcyBudWxsLCB0aGlzIHdpbGwgZmxhZyB0aGF0IHRoZXJlIGlzIG5vIG92ZXJyaWRlIGNhY2hlIGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBUaGF0IHdheSB3ZSB3b24ndCBib3RoZXIgdHJ5aW5nIGFnYWluIHVudGlsIGNvbmZpZyBjaGFuZ2VzLgotCQkJCUJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLm5ld0NhY2hlKGpjLCBvdmVycmlkZUNhY2hlLCBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5PVkVSUklERVNfQ0FDSEUpOwotCQkJfQotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoQVBQTFlfRVhURU5TSU9OUyk7CQotCQl9Ci0JfQotCQotCS8qCi0JICogQnVpbGQgdXAgdGhlIGZpeGVkIG92ZXJyaWRlcyBpbnRvIHRoZSBjYWNoZSwgYW5kIGFwcGx5IGFzIHdlIGdhdGhlciB0aGVtLgotCSAqIFJldHVybiB0aGUgY2FjaGUgb3IgbnVsbCBpZiB0aGUgY2FjaGUgaXMgZW1wdHkgYXQgdGhlIGVuZC4KLQkgKi8KLQlwcml2YXRlIExpc3QgY3JlYXRlT3ZlcnJpZGVDYWNoZShMaXN0IGNhY2hlLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBvdmVycmlkZUZpbGUsIFJlc291cmNlU2V0IHJzZXQsIEphdmFDbGFzcyBtZXJnZUludG9KYXZhQ2xhc3MpIHsKLQkJLy8gTm93IGdldCB0aGUgb3ZlcnJpZGVzIHBhdGhzCi0JCVN0cmluZ1tdIHBhdGhzID0gQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0T3ZlcnJpZGVQYXRocyhwcm9qZWN0LCBwYWNrYWdlTmFtZSk7Ci0JCWlmIChwYXRocy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBjYWNoZTsKLQkJCi0JCS8vIE5vdyBhcHBseSB0aGUgb3ZlcnJpZGVzLgotCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCWNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQlCZWFuaW5mb1BsdWdpbi5JT3ZlcnJpZGVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBFeHRlbnNpb25Eb2NBcHBsaWVzKG92ZXJyaWRlRmlsZSwgcnNldCwgbWVyZ2VJbnRvSmF2YUNsYXNzLCBjYWNoZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCXJ1bm5hYmxlLnJ1bihwYXRoc1tpXSk7Ci0JCX0KLQkJcmV0dXJuICFjYWNoZS5pc0VtcHR5KCkgPyBjYWNoZSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBST09UX1VSSSA9IFVSSS5jcmVhdGVHZW5lcmljVVJJKEJlYW5pbmZvUGx1Z2luLlJPT1RfU0NIRU1BLCBCZWFuaW5mb1BsdWdpbi5ST09UX09QQVFVRSwgbnVsbCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRlJBR01FTlQgPSAiLy9Acm9vdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGUkFHTUVOVF9TUExJVFRFUiA9IFBhdHRlcm4uY29tcGlsZSgiLyIpOwotCQotCXByaXZhdGUgY2xhc3MgRXh0ZW5zaW9uRG9jQXBwbGllcyBpbXBsZW1lbnRzIEJlYW5pbmZvUGx1Z2luLklPdmVycmlkZVJ1bm5hYmxlIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIG92ZXJyaWRlRmlsZTsKLQkJcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZVNldCByc2V0OwotCQlwcml2YXRlIGZpbmFsIEphdmFDbGFzcyBtZXJnZUludG9KYXZhQ2xhc3M7Ci0JCXByaXZhdGUgZmluYWwgTGlzdCBvdmVycmlkZXNDYWNoZTsKLQotCQlwdWJsaWMgRXh0ZW5zaW9uRG9jQXBwbGllcyhTdHJpbmcgb3ZlcnJpZGVGaWxlLCBSZXNvdXJjZVNldCByc2V0LCBKYXZhQ2xhc3MgbWVyZ2VJbnRvSmF2YUNsYXNzLCBMaXN0IG92ZXJyaWRlc0NhY2hlKSB7Ci0JCQl0aGlzLm92ZXJyaWRlRmlsZSA9IG92ZXJyaWRlRmlsZTsKLQkJCXRoaXMucnNldCA9IHJzZXQ7Ci0JCQl0aGlzLm1lcmdlSW50b0phdmFDbGFzcyA9IG1lcmdlSW50b0phdmFDbGFzczsKLQkJCXRoaXMub3ZlcnJpZGVzQ2FjaGUgPSBvdmVycmlkZXNDYWNoZTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luLklPdmVycmlkZVJ1bm5hYmxlI3J1bihqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFN0cmluZyBvdmVycmlkZVBhdGgpIHsKLQkJCVJlc291cmNlIG92ZXJyaWRlUmVzID0gbnVsbDsKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKG92ZXJyaWRlUGF0aCtvdmVycmlkZUZpbGUpOwotCQkJdHJ5IHsKLQkJCQlvdmVycmlkZVJlcyA9IHJzZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQlydW4ob3ZlcnJpZGVSZXMpOwotCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlzIG9rCi0JCQkJaWYgKCEoZS5leGNlcHRpb24oKSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikpIHsKLQkJCQkJaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uCi0JCQkJCQkmJiAoKENvcmVFeGNlcHRpb24pIGUuZXhjZXB0aW9uKCkpLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EKSB7Ci0JCQkJCQkvLyBUaGlzIGlzIG9rLiBNZWFucyB1cmlfbWFwcGluZyBub3Qgc2V0IHNvIGNvdWxkbid0IGZpbmQgaW4gV29ya3NwYWNlLCBhbHNvIG9rLgotCQkJCQl9IGVsc2UgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIGxvYWRpbmcgZmlsZVwiIiArIHVyaSArICJcIiIsIGUuZXhjZXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSW4gY2FzZSBpdCBoYXBwZW5lZCBhZnRlciBjcmVhdGluZyByZXNvdXJjZSBidXQgZHVyaW5nIGxvYWQuIE5lZWQgdG8gZ2V0IHJpZCBvZiBpdCBpbiB0aGUgZmluYWxseS4JCi0JCQkJb3ZlcnJpZGVSZXMgPSByc2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwkJCQkKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gQ291bGRuJ3QgbG9hZCBpdCBmb3Igc29tZSByZWFzb24uCi0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIGxvYWRpbmcgZmlsZVwiIiArIHVyaSArICJcIiIsIGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJb3ZlcnJpZGVSZXMgPSByc2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOyAvLyBJbiBjYXNlIGl0IGhhcHBlbmVkIGFmdGVyIGNyZWF0aW5nIHJlc291cmNlIGJ1dCBkdXJpbmcgbG9hZCBzbyB0aGF0IHdlIGNhbiBnZXQgcmlkIG9mIGl0LgotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAob3ZlcnJpZGVSZXMgIT0gbnVsbCkKLQkJCQkJcnNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUob3ZlcnJpZGVSZXMpOyAvLyBXZSBkb24ndCBuZWVkIGl0IGFyb3VuZCBvbmNlIHdlIGRvIHRoZSBtZXJnZS4gTm9ybWFsIG1lcmdlIHdvdWxkIG9mIGdvdHRvbiByaWQgb2YgaXQsIGJ1dCBpbiBjYXNlIG9mIGVycm9yIHdlIGRvIGl0IGhlcmUuCi0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb1BsdWdpbi5JT3ZlcnJpZGVSdW5uYWJsZSNydW4ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFJlc291cmNlIG92ZXJyaWRlUmVzKSB7Ci0JCQl0cnkgewotCQkJCUVMaXN0IGNvbnRlbnRzID0gb3ZlcnJpZGVSZXMuZ2V0Q29udGVudHMoKTsKLQkJCQlpZiAob3ZlcnJpZGVzQ2FjaGUgIT0gbnVsbCkgewotCQkJCQkvLyBUT0RPIFVudGlsIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkxNjkgaXMgZml4ZWQsIHdlIG5lZWQgb3VyIG93biBDb3BpZXIuCi0JCQkJCUVjb3JlVXRpbC5Db3BpZXIgY29waWVyID0gbmV3IEVjb3JlVXRpbC5Db3BpZXIoKSB7Ci0KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgRU9iamVjdCBlT2JqZWN0LCBFT2JqZWN0IGNvcHlFT2JqZWN0KSB7Ci0JCQkJCQkJaWYgKGVPYmplY3QuZUlzU2V0KGVSZWZlcmVuY2UpKSB7Ci0JCQkJCQkJCWlmIChlUmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQlMaXN0IHNvdXJjZSA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZVJlZmVyZW5jZSk7Ci0JCQkJCQkJCQlJbnRlcm5hbEVMaXN0IHRhcmdldCA9IChJbnRlcm5hbEVMaXN0KSBjb3B5RU9iamVjdC5lR2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSk7Ci0JCQkJCQkJCQlpZiAoc291cmNlLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCXRhcmdldC5jbGVhcigpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlib29sZWFuIGlzQmlkaXJlY3Rpb25hbCA9IGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbDsKLQkJCQkJCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgayA9ICgoRWNvcmVFTGlzdCkgc291cmNlKS5iYXNpY0l0ZXJhdG9yKCk7IGsuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCQlPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSBrLm5leHQoKTsKLQkJCQkJCQkJCQkJT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCWlmIChjb3B5UmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCQkJCQkJaWYgKCFpc0JpZGlyZWN0aW9uYWwpIHsKLQkJCQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LCByZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCQkJKytpbmRleDsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCWlmIChpc0JpZGlyZWN0aW9uYWwpIHsKLQkJCQkJCQkJCQkJCQlpbnQgcG9zaXRpb24gPSB0YXJnZXQuaW5kZXhPZihjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCQkJCWlmIChwb3NpdGlvbiA9PSAtMSkgewotCQkJCQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LCBjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCQkJCX0gZWxzZSBpZiAoaW5kZXggIT0gcG9zaXRpb24pIHsKLQkJCQkJCQkJCQkJCQkJdGFyZ2V0Lm1vdmUoaW5kZXgsIGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LCBjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJKytpbmRleDsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCU9iamVjdCByZWZlcmVuY2VkRU9iamVjdCA9IGVPYmplY3QuZUdldChlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCQkJCQkJCQlpZiAocmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCBudWxsKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCWlmIChlUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpID09IG51bGwpIHsKLQkJCQkJCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCByZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwgY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCQotCQkJCQkvLyBXZSBmaXh1cCB0aGUgQ0QgZmlyc3Qgc28gdGhhdCB3aGVuIHNlcmlhbGl6ZWQgaXQgd2lsbCBiZSB0byB0aGUgY29ycmVjdCBvYmplY3QgYWxyZWFkeS4gU2ltcGxpZmllcyBhcHBseSBsYXRlci4KLQkJCQkJSXRlcmF0b3IgaXRyID0gY29udGVudHMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgQ2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJCQkJCQlmaXh1cENEKChDaGFuZ2VEZXNjcmlwdGlvbikgbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCSAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IGNvcGllci5jb3B5QWxsKGNvbnRlbnRzKTsKLQkJCQkgICAgY29waWVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0JCQkJCW92ZXJyaWRlc0NhY2hlLmFkZEFsbChyZXN1bHQpOwkvLyBNYWtlIGEgY29weSBmb3IgdGhlIG92ZXJyaWRlIGNhY2hlIHRvIGJlIHVzZWQgbmV4dCB0aW1lIG5lZWRlZC4KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCFjb250ZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gVE9ETyBJdCBjb3VsZCBiZSBlaXRoZXIgdGhlIG9sZCBldmVudCBtb2RlbCBvciB0aGUgbmV3IENoYW5nZURlc2NyaXB0aW9uLiBXaGVuIHdlIHJlbW92ZSBFdmVudCBNb2RlbCB3ZSBuZWVkIHRvIHJlbW92ZQotCQkJCQkvLyB0aGUgdGVzdC4gVGhpcyBjb3VsZCBiZSB0aGUgb3ZlcnJpZGUgY2FjaGUgdG9vLCBzbyB3ZSBtdXN0IGFwcGx5IHRoZSBjb250ZW50cyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgaW4gdGhlIHJlc291cmNlLgotCQkJCQl0cnkgewotCQkJCQkJTGlzdCBldmVudHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJCQkJZXZlbnRzLmFkZChudWxsKTsJLy8gRXZlbnRVdGlsIG5lZWRzIGEgbGlzdCwgYnV0IHdlIHdpbGwgYmUgY2FsbGluZyBvbmUgYnkgb25lLiBTbyBqdXN0IHJldXNlIHRoaXMgbGlzdC4KLQkJCQkJCUl0ZXJhdG9yIGl0ciA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIENoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJCUNoYW5nZURlc2NyaXB0aW9uIGNkID0gKENoYW5nZURlc2NyaXB0aW9uKSBvOwotCQkJCQkJCQlmaXh1cENEKGNkKTsKLQkJCQkJCQkJY2QuYXBwbHkoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJdCBpcyB0aGUgb2xkIGZvcm1hdC4KLQkJCQkJCQkJZXZlbnRzLnNldCgwLCBvKTsKLQkJCQkJCQkJRXZlbnRVdGlsIHV0aWwgPSBFdmVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV2ZW50VXRpbChtZXJnZUludG9KYXZhQ2xhc3MsIHJzZXQpOwotCQkJCQkJCQl1dGlsLmRvRm9yd2FyZEV2ZW50cyhldmVudHMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXVuaW5zdGFsbFJvb3RSZXNvdXJjZSgpOwotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIHByb2Nlc3NpbmcgZmlsZVwiIiArIG92ZXJyaWRlUmVzLmdldFVSSSgpICsgIlwiIiwgZS5leGNlcHRpb24oKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogZml4IGl0IHVwIHNvIHRoYXQgcmVmZXJlbmNlcyB0byAiWDpST09UIy8vQHJvb3QiIGFyZSByZXBsYWNlZCB3aXRoIHJlZmVyZW5jZSB0byB0aGUgamF2YWNsYXNzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGZpeHVwQ0QoQ2hhbmdlRGVzY3JpcHRpb24gY2QpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBrZXlGZWF0dXJlID0gQ2hhbmdlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU9iamVjdFRvQ2hhbmdlc01hcEVudHJ5X0tleSgpOwotCQkJSXRlcmF0b3IgY2hhbmdlcyA9IGNkLmdldE9iamVjdENoYW5nZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGNoYW5nZXMuaGFzTmV4dCgpKSB7Ci0JCQkJRU9iamVjdCBlbnRyeSA9IChFT2JqZWN0KSBjaGFuZ2VzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGtleSA9IChFT2JqZWN0KSBlbnRyeS5lR2V0KGtleUZlYXR1cmUsIGZhbHNlKTsKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVJc1Byb3h5KCkpIHsKLQkJCQkJLy8gU2VlIGlmIGl0IGlzIG91ciBzcGVjaWFsLgotCQkJCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIGtleSkuZVByb3h5VVJJKCk7Ci0JCQkJCVN0cmluZyByb290RnJhZyA9IHVyaS5mcmFnbWVudCgpOwotCQkJCQlpZiAoQmVhbmluZm9QbHVnaW4uUk9PVF9TQ0hFTUEuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgQmVhbmluZm9QbHVnaW4uUk9PVF9PUEFRVUUuZXF1YWxzKHVyaS5vcGFxdWVQYXJ0KCkpICYmIChyb290RnJhZyAhPSBudWxsICYmIHJvb3RGcmFnLnN0YXJ0c1dpdGgoUk9PVF9GUkFHTUVOVCkpKSB7Ci0JCQkJCQkvLyBJdCBpcyBvbmUgb2Ygb3Vycy4gR2V0IHRoZSBmcmFnbWVudCwgcmVtb3ZlIHRoZSBsZWFkaW5nIC8vcm9vdCBhbmQgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlCi0JCQkJCQkvLyB1cmkgZnJvbSB0aGUgamF2YSBjbGFzcyBpdHNlbGYuCi0JCQkJCQlpZiAocm9vdEZyYWcubGVuZ3RoKCkgPD0gUk9PVF9GUkFHTUVOVC5sZW5ndGgoKSkKLQkJCQkJCQllbnRyeS5lU2V0KGtleUZlYXR1cmUsIG1lcmdlSW50b0phdmFDbGFzcyk7CS8vIE5vIHN1Yi1wYXRoLCBzbyBqdXN0IHRoZSBqYXZhIGNsYXNzLgotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gVGhlcmUgaXMgYSBzdWItcGF0aCBiZWxvdyB0aGUgamF2YSBjbGFzcyB0aGF0IGlzIG5lZWRlZC4gTmVlZCB0byB3YWxrIGRvd24gdGhlIHBhdGguCi0JCQkJCQkJU3RyaW5nW10gcGF0aCA9IEZSQUdNRU5UX1NQTElUVEVSLnNwbGl0KHJvb3RGcmFnLnN1YnN0cmluZyhST09UX0ZSQUdNRU5ULmxlbmd0aCgpKzEpKTsKLQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3S2V5ID0gKEludGVybmFsRU9iamVjdCkgbWVyZ2VJbnRvSmF2YUNsYXNzOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBuZXdLZXkgIT0gbnVsbCAmJiBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewotCQkJCQkJCQluZXdLZXkgPSAoSW50ZXJuYWxFT2JqZWN0KSBuZXdLZXkuZU9iamVjdEZvclVSSUZyYWdtZW50U2VnbWVudChwYXRoW2ldKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG5ld0tleSAhPSBudWxsKQotCQkJCQkJCQllbnRyeS5lU2V0KGtleUZlYXR1cmUsIG5ld0tleSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFVuaW5zdGFsbCB0aGUgZmFrZSByb290IHJlc291cmNlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGluc3RhbGxSb290UmVzb3VyY2UgaGFzIGJlZW4gY2FsbGVkLiBTbyBtdXN0IHVzZSB0cnkvZmluYWxseS4gCi0JCSAqIAotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdW5pbnN0YWxsUm9vdFJlc291cmNlKCkgewotCQkJUmVzb3VyY2Ugcm9vdCA9IHJzZXQuZ2V0UmVzb3VyY2UoUk9PVF9VUkksIGZhbHNlKTsKLQkJCWlmIChyb290ICE9IG51bGwpCi0JCQkJcnNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocm9vdCk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYXBwbHlFeHRlbnNpb25Eb2NUbyhSZXNvdXJjZVNldCByc2V0LCBKYXZhQ2xhc3MgbWVyZ2VJbnRvSmF2YUNsYXNzLCBTdHJpbmcgb3ZlcnJpZGVGaWxlLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuYXBwbHlPdmVycmlkZXMoZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRQcm9qZWN0KCksIHBhY2thZ2VOYW1lLCBjbGFzc05hbWUsIG1lcmdlSW50b0phdmFDbGFzcywgcnNldCwgCi0JCQluZXcgRXh0ZW5zaW9uRG9jQXBwbGllcyhvdmVycmlkZUZpbGUsIHJzZXQsIG1lcmdlSW50b0phdmFDbGFzcywgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFyZ2V0IGFzIGEgSmF2YUNsYXNzIAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3NJbXBsIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGJlYW5pbmZvIGNvbnN0YW50cyByZWNvcmQKLQkgKi8KLQlwcm90ZWN0ZWQgQmVhbmluZm9Qcm94eUNvbnN0YW50cyBnZXRQcm94eUNvbnN0YW50cygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGdldFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkgewotCQlpbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsKLQkJcmV0dXJuIGdldEphdmFDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXNJbnRlcm5hbCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlciNnZXRBbGxQcm9wZXJ0aWVzKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGFsbFByb3BlcnRpZXMoKTsKLQl9CQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEVPcGVyYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKSB7Ci0JCWlmIChnZXRDbGFzc0VudHJ5KCkgIT0gbnVsbCAmJiBnZXRDbGFzc0VudHJ5KCkuaXNPcGVyYXRpb25zU3RvcmVkKCkpCi0JCQlpbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsJLy8gQWxyZWFkeSBzdG9yZWQsIGp1c3QgZG8gaWYgbmVjZXNzYXJ5LgotCQllbHNlIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCW5lZWRzSW50cm9zcGVjdGlvbiA9IHRydWU7CS8vIEZvcmNlIHJlaW50cm9zcGVjdGlvbiBiZWNhdXNlIHdlIGVpdGhlciBhcmVuJ3Qgc3RvcmluZyBvcGVyYXRpb25zLCBvciBoYXZlIG5ldmVyIGxvYWRlZC4KLQkJCX0KLQkJCWludHJvc3BlY3RJZk5lY2Vzc2FyeSh0cnVlKTsJLy8gQnV0IGZvcmNlIHRoZSBvcGVyYXRpb25zIG5vdy4KLQkJfQotCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCkuZ2V0RU9wZXJhdGlvbnNJbnRlcm5hbCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlciNnZXRFQWxsT3BlcmF0aW9ucygpCi0JICovCi0JcHVibGljIEJhc2ljRUxpc3QgZ2V0RUFsbE9wZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBhbGxPcGVyYXRpb25zKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyI2dldEV2ZW50cygpCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV2ZW50cygpIHsKLQkJaW50cm9zcGVjdElmTmVjZXNzYXJ5KCk7Ci0JCXJldHVybiBnZXRKYXZhQ2xhc3MoKS5nZXRFdmVudHNHZW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5iZWFuaW5mby5JSW50cm9zcGVjdGlvbkFkYXB0ZXIjZ2V0QWxsRXZlbnRzKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzKCkgewotCQlyZXR1cm4gYWxsRXZlbnRzKCk7Ci0JfQkJCQkJCi0KLQlwcml2YXRlIHZvaWQgZmluYWxpemVQcm9wZXJ0aWVzKENoYW5nZURlc2NyaXB0aW9uIGNkKSB7Ci0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBsaXN0IGFuZCByZW1vdmUgdGhvc2UgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCwgYW5kIHNldCB0aGUgZXR5cGUgZm9yIHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSBpdCBzZXQuCi0JCU1hcCBvbGRMb2NhbHMgPSBnZXRQcm9wZXJ0aWVzTWFwKCk7Ci0JCUl0ZXJhdG9yIGl0ciA9IGdldEZlYXR1cmVzTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQlQcm9wZXJ0eURlY29yYXRvciBwID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKGEpOwotCQkJT2JqZWN0IGFPbGQgPSBvbGRMb2NhbHMuZ2V0KGEuZ2V0TmFtZSgpKTsKLQkJCWlmIChhT2xkICE9IG51bGwgJiYgYU9sZCAhPSBCb29sZWFuLkZBTFNFKSB7Ci0JCQkJLy8gQSBjYW5kaWRhdGUgZm9yIHJlbW92YWwuIEl0IHdhcyBpbiB0aGUgb2xkIGxpc3QgYW5kIGl0IHdhcyBub3QgcHJvY2Vzc2VkLgotCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gcC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCQkJaWYgKGltcGxpY2l0ICE9IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCkgewotCQkJCQkJcC5zZXRFTW9kZWxFbGVtZW50KG51bGwpOyAvLyBSZW1vdmUgZnJvbSB0aGUgZmVhdHVyZTsKLQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBwKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQkvLyBNYXJrIGl0IGFzIGJhZCBwcm94eSBzbyB3ZSBrbm93IGl0IGlzIG5vIGxvbmdlciBhbnkgdXNlLgotCQkJCQkJcCA9IG51bGw7Ci0JCQkJCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQkJCQkJaXRyLnJlbW92ZSgpOyAvLyBSZW1vdmUgaXQsIHRoaXMgd2FzIGltcGxpY2l0bHkgY3JlYXRlZCBhbmQgbm90IHByb2Nlc3NlZCB0aGlzIHRpbWUuCi0JCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIGEpLmVTZXRQcm94eVVSSShCQURfVVJJKTsJLy8gTWFyayBpdCBhcyBiYWQgcHJveHkgc28gd2Uga25vdyBpdCBpcyBubyBsb25nZXIgYW55IHVzZS4KLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCS8vIE5lZWQgdG8gZ28gb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBlVHlwZSB0byBtYWtlIHN1cmUgaXQgaXMgc2V0LiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm8gZGVjb3JhdG9yIGJ1dCB3ZSBzdGlsbCBoYXZlIGEgZmVhdHVyZS4KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gWzc5MDgzXSBBbHNvIGNoZWNrIGZvciBlVHlwZSBub3Qgc2V0LCBhbmQgaWYgaXQgaXMsIHNldCBpdCB0byBFT2JqZWN0IHR5cGUuIFRoYXQgd2F5IGl0IHdpbGwgYmUgdmFsaWQsIGJ1dCBub3QgdmFsaWQgYXMgCi0JCQkvLyBhIGJlYW4gc2V0dGluZy4KLQkJCWlmIChhLmdldEVUeXBlKCkgPT0gbnVsbCkgewotCQkJCS8vIFNldCBpdCB0byBFT2JqZWN0IHR5cGUuIElmIGl0IGJlY29tZXMgdmFsaWQgbGF0ZXIgKHRocm91Z2ggdGhlIGNsYXNzIGJlaW5nIGNoYW5nZWQpLCB0aGVuIHRoZSBpbnRyb3NwZWN0L3JlZmxlY3QKLQkJCQkvLyB3aWxsIHNldCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLgotCQkJCWEuc2V0RVR5cGUoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFT2JqZWN0KCkpOwotCQkJCUxvZ2dlciBsb2dnZXIgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKQotCQkJCQlsb2dnZXIubG9nV2FybmluZygiRmVhdHVyZSBcIiIrZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKyItPiIrYS5nZXROYW1lKCkrIlwiIGRpZCBub3QgaGF2ZSBhIHR5cGUgc2V0LiBUeXBpY2FsbHkgZHVlIHRvIG92ZXJyaWRlIGZpbGUgY3JlYXRpbmcgZmVhdHVyZSBidXQgcHJvcGVydHkgbm90IGZvdW5kIG9uIGludHJvc3BlY3Rpb24vcmVmbGVjdGlvbi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCQotCQkJaWYgKHAgIT0gbnVsbCAmJiBjZCAhPSBudWxsKSB7Ci0JCQkJLy8gTm93IGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY2FjaGUgZW50cnkgZm9yIHRoaXMgcHJvcGVydHkuCi0JCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmJ1aWxkQ2hhbmdlKGNkLCBwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIG1lcmdlIGFsbCAgdGhlIFByb3BlcnRpZXMgKGkuZS4gc3VwZXJ0eXBlcykgKHByb3BlcnRpZXMpCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFsbFByb3BlcnRpZXMoKSB7Ci0JCQotCQlFTGlzdCBqY0FsbFByb3BlcnRpZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRBbGxQcm9wZXJ0aWVzR2VuKCk7Ci0JCUJlYW5pbmZvU3VwZXJBZGFwdGVyIHN1cGVyQWRhcHRlciA9Ci0JCQkoQmVhbmluZm9TdXBlckFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihnZXRKYXZhQ2xhc3MoKSwgQmVhbmluZm9TdXBlckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoamNBbGxQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIFNlZSBpZiBuZXcgb25lIHJlcXVpcmVkLgotCQkJaWYgKHN1cGVyQWRhcHRlciA9PSBudWxsIHx8ICFzdXBlckFkYXB0ZXIuaXNBbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsUHJvcGVydGllczsKLQkJCS8vIENhbid0IGdldCBzdXBlcmFkYXB0ZXIsIHNvIG11c3Qgbm90IGJlIGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHJldHVybiBjdXJyZW50IGxpc3QuIE9yIG5vIGNoYW5nZSByZXF1aXJlZC4gICAgICAgCQkKLQkJfQotCQkKLQkJVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUgYWxsUHJvcGVydGllcyA9IG5ldyBVbmlxdWVFTGlzdC5GYXN0Q29tcGFyZSgpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqIAotCQkJICogQHNpbmNlIDEuMS4wCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlwcm90ZWN0ZWQgT2JqZWN0W10gbmV3RGF0YShpbnQgY2FwYWNpdHkpIHsKLQkJCQlyZXR1cm4gbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtjYXBhY2l0eV07Ci0JCQl9Ci0JCX07Ci0JCWJvb2xlYW4gZG9BbGxQcm9wZXJ0aWVzID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkvLyBJZiB3ZSBhcmUgaW50cm9zcGVjdGluZywgZG9uJ3QgZG8gYWxsIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGxpc3QuIEp1c3QgcmV0dXJuIGVtcHR5IHdpdGhvdXQgcmVzZXRpbmcgdGhlIGFsbCBtb2RpZmllZCBmbGFnLgotCQkJZG9BbGxQcm9wZXJ0aWVzID0gIWlzRG9pbmdBbGxQcm9wZXJ0aWVzICYmICFpc0ludHJvc3BlY3RpbmcgJiYgaXNSZXNvdXJjZUNvbm5lY3RlZCgpOwotCQkJaWYgKGRvQWxsUHJvcGVydGllcykKLQkJCQlpc0RvaW5nQWxsUHJvcGVydGllcyA9IHRydWU7Ci0JCX0KLQkJaWYgKGRvQWxsUHJvcGVydGllcykgewotCQkJdHJ5IHsKLQkJCQlFTGlzdCBsb2NhbFByb3BlcnRpZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJCQkvLyB0aGUgdHJ1dGggaXMgbW9zdCBwZW9wbGUgd2FudCB0aGVzZS4gU28gd2Ugd2lsbCBhZGQgdGhlbSBpbi4gQnV0IHNpbmNlIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgaXQKLQkJCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzIGFuZCBzdGlsbCBrZWVwIG9yZGVyLgotCQkJCS8vCi0JCQkJLy8gU3VwZXJ0eXBlcyB3aWxsIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUgZW50cnkgZm9yIGNsYXNzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJlIDAsIDEsIDIgb3IgbW9yZSBmb3IgaW50ZXJmYWNlcy4KLQkJCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJCWlmICghc3VwZXJUeXBlcy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gTm93IHdlIG5lZWQgdG8gbWVyZ2UgaW4gdGhlIHN1cGVycy4KLQkJCQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJCQkJLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgc3VwZXJ0eXBlLCB3ZSBjYW4gYWRkIHRvIHRoZSBhY3R1YWwgZXZlbnRzLCBlbHNlIHdlIHdpbGwgdXNlIHRoZSBsaW5rZWQgaGFzaHNldCBzbyB0aGF0Ci0JCQkJCS8vIHdlIGRvbid0IGFkZCBwb3NzaWJsZSBkdXBsaWNhdGVzIChlLmcuIElBIGV4dGVuZHMgSUIsSUMgYW5kIElCIGV4dGVuZHMgSUMuIEluIHRoaXMgY2FzZSB0aGVyZSB3b3VsZCBiZSBkdXBzCi0JCQkJCS8vIGJlY2F1c2UgSUIgd291bGQgY29udHJpYnV0ZSBJQydzIHRvbykuCi0JCQkJCUNvbGxlY3Rpb24gd29ya2luZ0FsbFByb3BlcnRpZXMgPSBzdXBlclR5cGVzLnNpemUoKSA9PSAxID8gKENvbGxlY3Rpb24pIGFsbFByb3BlcnRpZXMgOiBuZXcgTGlua2VkSGFzaFNldCgpOyAKLQkJCQkJLy8gV2Ugd2lsbCBub3cgbWVyZ2UgYXMgZGlyZWN0ZWQuCi0JCQkJCWJvb2xlYW4gbWVyZ2VBbGwgPSBiZCA9PSBudWxsIHx8IGJkLmlzTWVyZ2VTdXBlclByb3BlcnRpZXMoKTsKLQkJCQkJaWYgKCFtZXJnZUFsbCkgewotCQkJCQkJLy8gd2UgZG9uJ3QgdG8gd2FudCB0byBtZXJnZSBzdXBlciBwcm9wZXJ0aWVzLCBidXQgd2Ugc3RpbGwgbmVlZCBzdXBlciBub24tcHJvcGVydGllcyBvciBleHBsaWN0IG9uZXMuCi0JCQkJCQlpbnQgbGVuU1QgPSBzdXBlclR5cGVzLnNpemUoKTsKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJCQkJCQlpbnQgbGVuID0gc3VwZXJzLnNpemUoKTsKLQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgc3VwZXJzLmdldChpMSk7Ci0JCQkJCQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKHApOwotCQkJCQkJCQlpZiAoIHBkID09IG51bGwgfHwgKHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhcGQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQl3b3JraW5nQWxsUHJvcGVydGllcy5hZGQocCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gV2Ugd2FudCB0byBtZXJnZSBhbGwuCQkJCQkKLQkJCQkJCS8vIEJlYW5JbmZvIGNvdWxkIG9mIGdpdmVuIHVzIHRoZSBub3QgbWVyZ2UgbGlzdC4gSWYgdGhlIGxpc3QgaXMgZW1wdHksIHRoZW4gd2UgYWNjZXB0IGFsbC4KLQkJCQkJCWlmIChiZCAhPSBudWxsICYmIGJkLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gTm93IHdhbGsgYW5kIGFkZCBpbiBub24tYmVhbiBwcm9wZXJ0aWVzIChhbmQgYmVhbiBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBleHBsaWNpdGx5IGFkZGVkIGFuZCBub3QgbWVyZ2VhYmxlIChpLmUuIGRpZG4ndCBjb21lIHRocnUgYmVhbmluZm8pKSAKLQkJCQkJCQkvLyBhbmQgYWRkIHRob3NlIG5vdCBzcGVjaWZpY2FsbHkgY2FsbGVkIG91dCBieSBCZWFuSW5mbyBpbiB0aGUgbm90IGluaGVyaXRlZCBsaXN0LgotCQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJCUxpc3Qgc3VwZXJzID0gKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IocCk7Ci0JCQkJCQkJCQlpZiAocGQgPT0gbnVsbCB8fCAocGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMICYmICFwZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSB8fCAhc3VwZXJTZXQuY29udGFpbnMocGQuZ2V0TmFtZSgpKSkKLQkJCQkJCQkJCQl3b3JraW5nQWxsUHJvcGVydGllcy5hZGQocCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEJlYW5JbmZvIChvciByZWZsZWN0aW9uIGFsd2F5cyBkb2VzIHRoaXMpIGNhbGxlZCBvdXQgdGhhdCBhbGwgc3VwZXIgcHJvcGVydGllcyBhcmUgZ29vZAotCQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCQkJCXdvcmtpbmdBbGxQcm9wZXJ0aWVzLmFkZEFsbCgoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsUHJvcGVydGllcyAhPSBhbGxQcm9wZXJ0aWVzKQotCQkJCQkJYWxsUHJvcGVydGllcy5hZGRBbGwod29ya2luZ0FsbFByb3BlcnRpZXMpOwkvLyBOb3cgY29weSBvdmVyIHRoZSBvcmRlcmVkIHN1cGVyIHByb3BlcnRpZXMuCi0JCQkJfQotCQkJCWFsbFByb3BlcnRpZXMuYWRkQWxsKGxvY2FsUHJvcGVydGllcyk7CQkJCQotCQkJCXN1cGVyQWRhcHRlci5zZXRBbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKGZhbHNlKTsgLy8gTm93IGJ1aWx0LCBzbyByZXNldCB0byBub3QgY2hhbmdlZC4KLQkJCX0gZmluYWxseSB7Ci0JCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQkJaXNEb2luZ0FsbFByb3BlcnRpZXMgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFsbFByb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0JCQlhbGxQcm9wZXJ0aWVzLnNocmluaygpOwotCQkJcmV0dXJuIG5ldyBFY29yZUVMaXN0LlVubW9kaWZpYWJsZUVMaXN0LkZhc3RDb21wYXJlKAotCQkJCWdldEphdmFDbGFzcygpLAotCQkJCW51bGwsCi0JCQkJYWxsUHJvcGVydGllcy5zaXplKCksCi0JCQkJYWxsUHJvcGVydGllcy5kYXRhKCkpOwotCQl9IGVsc2UKLQkJCXJldHVybiBFQ29sbGVjdGlvbnMuRU1QVFlfRUxJU1Q7Ci0JfQotCi0JLyoKLQkgKiBGaWxsIGluIHRoZSBwcm9wZXJ0eSB1c2luZyB0aGUgcHJvcCByZWNvcmQuIElmIHRoaXMgb25lIHRoYXQgc2hvdWxkIGhhdmUgbWVyZ2luZyBkb25lLCB0aGVuCi0JICogcmV0dXJuIHRoZSBQcm9wZXJ0eURlY29yYXRvciBzbyB0aGF0IGl0IGNhbiBoYXZlIHRoZSBQcm9wZXJ0eVJlY29yZCBtZXJnZWQgaW50byBpdC4gRWxzZQotCSAqIHJldHVybiBudWxsIGlmIG5vIG1lcmdpbmcuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5RGVjb3JhdG9yIGNhbGN1bGF0ZVByb3BlcnR5KFByb3BlcnR5UmVjb3JkIHByLCBib29sZWFuIGluZGV4ZWQpIHsKLQkJLy8gSWYgdGhpcyBpcyBhbiBpbmRleGVkIHByb3BlcnR5LCB0aGVuIGEgZmV3IGZpZWxkcyB3aWxsIG5vdCBiZSBzZXQgaW4gaGVyZSwgYnV0Ci0JCS8vIHdpbGwgaW5zdGVhZCBiZSBzZXQgYnkgdGhlIGNhbGN1bGF0ZUluZGV4ZWRQcm9wZXJ0eSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQuCi0JCWJvb2xlYW4gY2hhbmdlYWJsZSA9IHByLndyaXRlTWV0aG9kICE9IG51bGwgfHwgKHByLmZpZWxkICE9IG51bGwgJiYgIXByLmZpZWxkLnJlYWRPbmx5KTsKLQkJSmF2YUhlbHBlcnMgdHlwZSA9IHByLnByb3BlcnR5VHlwZU5hbWUgIT0gbnVsbCA/IFV0aWxpdGllcy5nZXRKYXZhVHlwZShNYXBKTklUeXBlcy5nZXRGb3JtYWxUeXBlTmFtZShwci5wcm9wZXJ0eVR5cGVOYW1lKSwgZ2V0SmF2YUNsYXNzKCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkgOiBudWxsOwotCi0JCWlmIChpbmRleGVkKSB7Ci0JCQkvLyBJZiBubyBhcnJheSB3cml0ZSBtZXRob2QgZm91bmQsIHRoZW4gc2VlIGlmIHRoZXJlIGlzIGFuIGluZGV4ZWQgd3JpdGUgbWV0aG9kLiBJZiB0aGVyZSBpcywgdGhlbiBpdCBpcyBjaGFuZ2FibGUuCi0JCQlpZiAoIWNoYW5nZWFibGUpCi0JCQkJY2hhbmdlYWJsZSA9ICgoSW5kZXhlZFByb3BlcnR5UmVjb3JkKSBwcikuaW5kZXhlZFdyaXRlTWV0aG9kICE9IG51bGw7Ci0JCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJLy8gSWYgbm8gYXJyYXkgdHlwZSBmcm9tIGFib3ZlLCBjcmVhdGUgb25lIGZyb20gdGhlIGluZGV4ZWQgdHlwZSBwcm94eS4gQWRkICdbXScgdG8gdHVybiBpdCBpbnRvIGFuIGFycmF5LgotCQkJCXR5cGUgPSBVdGlsaXRpZXMuZ2V0SmF2YVR5cGUoTWFwSk5JVHlwZXMuZ2V0Rm9ybWFsVHlwZU5hbWUoKChJbmRleGVkUHJvcGVydHlSZWNvcmQpIHByKS5pbmRleGVkUHJvcGVydHlUeXBlTmFtZSkrIltdIiwgZ2V0SmF2YUNsYXNzKCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlyZXR1cm4gY3JlYXRlUHJvcGVydHkocHIubmFtZSwgaW5kZXhlZCwgY2hhbmdlYWJsZSwgdHlwZSk7IC8vIEEgdmFsaWQgcHJvcGVydHkgZGVzY3JpcHRvci4KLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgcHJvcGVydHkgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIHBhc3NlZCBpbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlEZWNvcmF0b3IgY3JlYXRlUHJvcGVydHkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaW5kZXhlZCwgYm9vbGVhbiBjaGFuZ2VhYmxlLCBFQ2xhc3NpZmllciB0eXBlKSB7Ci0JCS8vIEZpcnN0IGZpbmQgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHByb3BlcnR5IG9mIHRoaXMgbmFtZSwgYW5kIGlmIHRoZXJlIGlzLCBpcyB0aGUgUHJvcGVydHlEZWNvcmF0b3IKLQkJLy8gbWFya2VkIHRvIG5vdCBhbGxvdyBtZXJnaW5nIGluIG9mIGludHJvc3BlY3Rpb24gcmVzdWx0cy4JCQotCQlIYXNoTWFwIGV4aXN0aW5nTG9jYWxzID0gZ2V0UHJvcGVydGllc01hcCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgcHJvcCA9IG51bGw7Ci0JCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gbnVsbDsKLQkJT2JqZWN0IHAgPSBleGlzdGluZ0xvY2Fscy5nZXQobmFtZSk7Ci0JCWlmIChCb29sZWFuLkZBTFNFID09IHApCi0JCQlyZXR1cm4gbnVsbDsgLy8gV2UndmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBuYW1lLCBjYW4ndCBwcm9jZXNzIGl0IGFnYWluLgotCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkvLyBXZSd2ZSBmb3VuZCBvbmUgb2YgdGhlIHNhbWUgbmFtZS4gV2hldGhlciB3ZSBtb2RpZnkgaXQgb3IgdXNlIGl0IGFzIGlzLCB3ZSBwdXQgaW4gYQotCQkJLy8gc3BlY2lhbCBkdW1teSBpbiBpdHMgcGxhY2UuIFRoYXQgbWFya3MgdGhhdCB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCBhbmQgYWNjZXB0ZWQgaXQuCi0JCQlleGlzdGluZ0xvY2Fscy5wdXQobmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJCS8vIElmIHRoZSBkZWNvcmF0b3IgZm9yIHRoaXMgZW50cnkgc2F5cyBub3QgdG8gbWVyZ2UgdGhlbiByZXR1cm4uCi0JCQkvLyBJZiB0aGVyZSBpcyBubyBQcm9wZXJ0eURlY29yYXRvciwgdGhlbiB3ZSB3aWxsIG1lcmdlLiBJZiB0aGV5Ci0JCQkvLyBkaWRuJ3Qgd2FudCB0byBtZXJnZSB0aGVuIHNob3VsZCBvZiBjcmVhdGVkIG9mIHByb3BlcnR5IGRlY29yYXRvciBhbmQgc2FpZCBubyBtZXJnZS4KLQkJCXBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKChFU3RydWN0dXJhbEZlYXR1cmUpIHApOwotCQkJaWYgKHBkICE9IG51bGwgJiYgIXBkLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlwcm9wID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcDsKLQkJfQotCi0JCS8vIE5lZWQgdG8gdGVzdCBpZiB0aGlzIGlzIGFuIGltcGxpY2l0IGRlY29yYXRvciBhbmQgaXQgaXMgbm90IG9mIHRoZSAKLQkJLy8gc2FtZSB0eXBlIChpLmUuIGlzIGluZGV4ZWQgbm93IGJ1dCB3YXNuJ3Qgb3IgdmlzYS12ZXJzYSwgdGhlbiB3ZSBuZWVkCi0JCS8vIHRvIGdldCByaWQgb2YgdGhlIGRlY29yYXRvciBhbmQgcmVjcmVhdGUgaXQuIElmIGl0IGlzIG5vdCBpbXBsaWNpdCwgdGhlbgotCQkvLyB3ZSBoYXZlIHRvIHVzZSBpdCBhcyBpcyBiZWNhdXNlIHRoZSB1c2VyIHNwZWNpZmllZCwgc28gaXQgd29uJ3QgYmVjb21lCi0JCS8vIGFuIGluZGV4ZWQgaWYgdGhlIHVzZXIgZGlkIG5vdCBjcmVhdGVkIGl0IGFzIGFuIGluZGV4LCBhbmQgdmlzYS12ZXJzYS4KLQkJLy8gQWxzbyBpZiBpdCBpcyBpbXBsaWNpdCwgdGhlbiB3ZSBuZWVkIHRvIHVuc2V0IGNlcnRhaW4gZmVhdHVyZXMgdGhhdCBtYXkgb2YKLQkJLy8gYmVlbiBzZXQgYnkgYSBwcmV2aW91cyByZWZsZWN0aW9uIHdoaWNoIGhhcyBub3cgYmVjb21lIGludHJvc3BlY3RlZC4KLQkJLy8gV2hlbiByZWZsZWN0ZWQgd2Ugc2V0IHRoZSBhY3R1YWwgZmllbGRzIGluc3RlYWQgb2YgdGhlIGxldHRpbmcgcHJveHkgZGV0ZXJtaW5lIHRoZW0uCi0JCWlmIChwZCAhPSBudWxsKSB7Ci0JCQlpZiAocGQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMKSB7Ci0JCQkJLy8gV2UgY2FuJ3QgY2hhbmdlIHRoZSB0eXBlIGZvciBleHBsaWNpdC4KLQkJCQlpbmRleGVkID0gcGQgaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3I7Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoaW5kZXhlZCAmJiAhKHBkIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKSkgfHwgKCFpbmRleGVkICYmIHBkIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKSkgewotCQkJCQkvLyBJdCBpcyBpbXBsaWNpdCBhbmQgb2YgYSBkaWZmZXJlbnQgdHlwZSwgc28ganVzdCBnZXQgcmlkIG9mIGl0IGFuZCBsZXQgaXQgYmUgcmVjcmVhdGVkIGNvcnJlY3RseS4KLQkJCQkJcHJvcC5nZXRFQW5ub3RhdGlvbnMoKS5yZW1vdmUocGQpOwotCQkJCQlwZCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBkICE9IG51bGwpCi0JCQkJaWYgKGluZGV4ZWQpCi0JCQkJCUJlYW5JbmZvRGVjb3JhdG9yVXRpbGl0eS5jbGVhcigoSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKSBwZCk7Ci0JCQkJZWxzZQotCQkJCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuY2xlYXIocGQpOwotCQl9Ci0KLQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gcGQgPT0gbnVsbCA/IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCA6IHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCQlpZiAocHJvcCA9PSBudWxsKSB7Ci0JCQkvLyBXZSB3aWxsIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eS4KLQkJCS8vIFdlIGNhbid0IGhhdmUgYW4gaW1wbGljaXQgZmVhdHVyZSwgYnV0IGFuIGV4cGxpY2l0IGRlY29yYXRvci4KLQkJCWdldEZlYXR1cmVzTGlzdCgpLmFkZChwcm9wID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFUmVmZXJlbmNlKCkpOwotCQkJaW1wbGljaXQgPSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUw7Ci0JCX0KLQotCQlzZXRQcm9wZXJ0eUlEKG5hbWUsIHByb3ApOwotCQlwcm9wLnNldE5hbWUobmFtZSk7Ci0JCXByb3Auc2V0VHJhbnNpZW50KGZhbHNlKTsKLQkJcHJvcC5zZXRWb2xhdGlsZShmYWxzZSk7Ci0JCXByb3Auc2V0Q2hhbmdlYWJsZShjaGFuZ2VhYmxlKTsKLQotCQkvLyBDb250YWlubWVudCBhbmQgVW5zZXR0YWJsZSBpcyB0cmlja3kgZm9yIEVSZWZlcmVuY2VzLiBUaGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLCBvciBpdCBkZWZhdWx0ZWQgdG8KLQkJLy8gZmFsc2UgYmVjYXVzZSBFQ29yZSBoYXMgbm90IG1hZGUgY29udGFpbm1lbnQvdW5zZXR0YWJsZSBhbiB1bnNldHRhYmxlIGZlYXR1cmUuIFNvIHdlIG5lZWQgdG8gaW5zdGVhZCB1c2UgdGhlIGFsZ29yaXRobSBvZiBpZiB3ZSBoZXJlIAotCQkvLyBjcmVhdGVkIHRoZSBmZWF0dXJlLCB0aGVuIHdlIHdpbGwgYnkgZGVmYXVsdCBzZXQgaXQgdG8gY29udGFpbm1lbnQvdW5zZXR0YWJsZS4gSWYgaXQgd2FzIGNyZWF0ZWQgdGhyb3VnaCBkaWZmIG1lcmdlLCB0aGVuCi0JCS8vIHdlIHdpbGwgbGVhdmUgaXQgYWxvbmUuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgbWVyZ2UgZmlsZSB3cml0ZXIgdG8gc2V0IGNvbnRhaW5tZW50L3Vuc2V0dGFibGUgY29ycmVjdGx5LgotCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQlwcm9wLnNldFVuc2V0dGFibGUodHJ1ZSk7Ci0JCX0KLQkJcHJvcC5zZXRFVHlwZSh0eXBlKTsKLQkJaWYgKCFpbmRleGVkKSB7Ci0JCQlwcm9wLnNldExvd2VyQm91bmQoMCk7Ci0JCQlwcm9wLnNldFVwcGVyQm91bmQoMSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9wLnNldExvd2VyQm91bmQoMCk7Ci0JCQlwcm9wLnNldFVwcGVyQm91bmQoLTEpOwotCQkJcHJvcC5zZXRVbmlxdWUodHJ1ZSk7Ci0JCX0KLQotCQkvLyBOb3cgY3JlYXRlL2ZpbGwgaW4gdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIGl0LgotCQkvLyBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSB0aGVuIHdlCi0JCS8vIHdpbGwgdXNlIGl0LiBUaGlzIGFsbG93cyBtZXJnaW5nIHdpdGggYmVhbmZpbmZvLgkJCi0JCWlmIChwZCA9PSBudWxsKSB7Ci0JCQlwZCA9Ci0JCQkJKCFpbmRleGVkKQotCQkJCQk/IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoKQotCQkJCQk6IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCk7Ci0JCQlwZC5zZXRJbXBsaWNpdERlY29yYXRvckZsYWcoaW1wbGljaXQpOwotCQkJcHJvcC5nZXRFQW5ub3RhdGlvbnMoKS5hZGQocGQpOwotCQl9Ci0JCXJldHVybiBwZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBwcm9wCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5SUQoU3RyaW5nIG5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwcm9wKSB7Ci0JCS8vIE5vdyBmaWxsIGl0IGluLiBOb3JtYWwgaWQgZm9yIGFuIGF0dHJpYnV0ZSBpcyAiY2xhc3NuYW1lLmF0dHJpYnV0ZW5hbWUiIGJ1dCB3ZSBjYW4ndCB1c2UgdGhhdAotCQkvLyBmb3IgdXMgYmVjYXVzZSB0aGF0IGZvcm1hdCBpcyB1c2VkIGJ5IEphdmEgQ29yZSBmb3IgYSBmaWVsZCBhbmQgdGhlcmUgd291bGQgYmUgY29uZnVzaW9uLgotCQkvLyBTbyB3ZSB3aWxsIHVzZSAnLycgaW5zdGVhZC4KLQkJKChYTUlSZXNvdXJjZSkgcHJvcC5lUmVzb3VyY2UoKSkuc2V0SUQocHJvcCwgZ2V0SmF2YUNsYXNzKCkuZ2V0TmFtZSgpICsgQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5GRUFUVVJFICsgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBSZWZsZWN0IHRoZSBwcm9wZXJ0aWVzLiBUaGlzIHJlcXVpcmVzIGdvaW5nIHRocm91Z2ggbG9jYWwgbWV0aG9kcyBhbmQgbWF0Y2hpbmcgdGhlbSB1cCB0bwotCSAqIHNlZSBpZiB0aGV5IGFyZSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWZsZWN0UHJvcGVydGllcygpIHsKLQkJLy8gSWYgd2UgYXJlIHNldCB0byBtZXJnZVN1cGVyVHlwZVByb3BlcnRpZXMsIHRoZW4gd2UgbmVlZCB0byBnZXQgdGhlIHN1cGVyIHByb3BlcnRpZXMuCi0JCS8vIFRoaXMgaXMgc28gdGhhdCBkdXBsaWNhdGUgYW55IGZyb20gc3VwZXIgdGhhdCB3ZSBmaW5kIGhlcmUuIFdoZW4gcmVmbGVjdGluZyB3ZSBkb24ndAotCQkvLyBhbGxvdyBkaXNjb3ZlcmVkIGR1cGxpY2F0ZXMgdW5sZXNzIHRoZXkgYXJlIGRpZmZlcmVudCB0eXBlcy4KLQkJLy8KLQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJLy8gSW50ZXJmYWNlcyBjYW4gaGF2ZSBtdWx0aXBsZSBleHRlbmRzLCB3aGlsZSB0aGUgSW50cm9zcGVjdG9yIGlnbm9yZXMgdGhlc2UgZm9yIHJlZmxlY3Rpb24sCi0JCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzLgotCQkvLwotCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfUFJPUEVSVElFUyk7CQkKLQkJU2V0IHN1cGVycyA9IG5ldyBIYXNoU2V0KDUwKTsKLQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJaWYgKGJkID09IG51bGwgfHwgYmQuaXNNZXJnZVN1cGVyUHJvcGVydGllcygpKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCUxpc3Qgc3VwZXJBbGwgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJCQkJaW50IGxlbiA9IHN1cGVyQWxsLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaTE9MDsgaTE8bGVuOyBpMSsrKSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBzdXBlckFsbC5nZXQoaTEpOwotCQkJCQkJc3VwZXJzLmFkZChzZi5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gSWYgYW55IG9mIHRoZSBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkgYXJlIGJvdW5kLCB0aGVuIGFsbCByZWZsZWN0ZWQgcHJvcGVydGllcyBhcmUgY29uc2lkZXJlZCBib3VuZC4KLQkJYm9vbGVhbiBpc0JvdW5kID0gaXNEZWZhdWx0Qm91bmQoKTsKLQkJaWYgKCFpc0JvdW5kKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJLy8gU3RhcnQgZnJvbSBlbmQgYmVjYXVzZSB0aGF0IHdpbGwgYmUgZmlyc3QgY2xhc3MgYWJvdmUgdGhlIHRoaXMgb25lLgotCQkJZm9yIChpbnQgaT1zdXBlclR5cGVzLnNpemUoKS0xOyAhaXNCb3VuZCAmJiBpPj0wOyBpLS0pIHsKLQkJCQlKYXZhQ2xhc3Mgc3ByID0gKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSk7Ci0JCQkJQmVhbmluZm9DbGFzc0FkYXB0ZXIgYmkgPSAoQmVhbmluZm9DbGFzc0FkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoc3ByLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpOwotCQkJCS8vIFRoZXkgc2hvdWxkIGFsbCBiZSByZWZsZWN0ZWQsIGJ1dCBiZSBvbiBzYWZlIHNpZGUsIGNoZWNrIGlmIG51bGwuCi0JCQkJaWYgKGJpICE9IG51bGwpCi0JCQkJCWlzQm91bmQgPSBiaS5pc0RlZmF1bHRCb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJSGFzaE1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBhcyBwcm9wZXJ0aWVzCi0JCQlpZiAobXRoZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBuYW1lID0gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG10aGQuZ2V0TmFtZSgpLnN1YnN0cmluZygzKSk7Ci0JCQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCB8fCBzdXBlcnMuY29udGFpbnMobmFtZSkpCi0JCQkJCWNvbnRpbnVlOwkvLyBIYWQgZ2V0KC4uLikgYW5kIG5vdCBnZXRYWFgoLi4uKSBzbyBub3QgYSBnZXR0ZXIuIE9yIHRoaXMgaXMgdGhlIHNhbWUgbmFtZSBhcyBhIHN1cGVyLCBlaXRoZXIgd2F5IGlnbm9yZSBpdC4KLQkJCQlQcm9wZXJ0eUluZm8gcHJvcEluZm8gPSAoUHJvcGVydHlJbmZvKSBwcm9wcy5nZXQobmFtZSk7Ci0JCQkJaWYgKHByb3BJbmZvID09IG51bGwpIHsKLQkJCQkJcHJvcEluZm8gPSBuZXcgUHJvcGVydHlJbmZvKCk7Ci0JCQkJCWlmIChwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgZmFsc2UpKQotCQkJCQkJcHJvcHMucHV0KG5hbWUsIHByb3BJbmZvKTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJvcEluZm8uc2V0R2V0dGVyKG10aGQsIGZhbHNlKTsKLQkJCX0gZWxzZSBpZiAobXRoZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiaXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG5hbWUgPSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobXRoZC5nZXROYW1lKCkuc3Vic3RyaW5nKDIpKTsKLQkJCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwIHx8IHN1cGVycy5jb250YWlucyhuYW1lKSkKLQkJCQkJY29udGludWU7CS8vIEhhZCBpcyguLi4pIGFuZCBub3QgaXNYWFgoLi4uKSBzbyBub3QgYSBnZXR0ZXIuIE9yIHRoaXMgaXMgdGhlIHNhbWUgbmFtZSBhcyBhIHN1cGVyLCBlaXRoZXIgd2F5IGlnbm9yZSBpdC4KLQkJCQlQcm9wZXJ0eUluZm8gcHJvcEluZm8gPSAoUHJvcGVydHlJbmZvKSBwcm9wcy5nZXQobmFtZSk7Ci0JCQkJaWYgKHByb3BJbmZvID09IG51bGwpIHsKLQkJCQkJcHJvcEluZm8gPSBuZXcgUHJvcGVydHlJbmZvKCk7Ci0JCQkJCWlmIChwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgdHJ1ZSkpCi0JCQkJCQlwcm9wcy5wdXQobmFtZSwgcHJvcEluZm8pOwotCQkJCX0gZWxzZQotCQkJCQlwcm9wSW5mby5zZXRHZXR0ZXIobXRoZCwgdHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKG10aGQuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbmFtZSA9IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShtdGhkLmdldE5hbWUoKS5zdWJzdHJpbmcoMykpOwotCQkJCWlmIChuYW1lLmxlbmd0aCgpID09IDAgfHwgc3VwZXJzLmNvbnRhaW5zKG5hbWUpKQotCQkJCQljb250aW51ZTsJLy8gSGFkIHNldCguLi4pIGFuZCBub3Qgc2V0WFhYKC4uLikgc28gbm90IGEgc2V0dGVyLiBPciB0aGlzIGlzIHRoZSBzYW1lIG5hbWUgYXMgYSBzdXBlciwgZWl0aGVyIHdheSBpZ25vcmUgaXQuCQkJCQotCQkJCVByb3BlcnR5SW5mbyBwcm9wSW5mbyA9IChQcm9wZXJ0eUluZm8pIHByb3BzLmdldChuYW1lKTsKLQkJCQlpZiAocHJvcEluZm8gPT0gbnVsbCkgewotCQkJCQlwcm9wSW5mbyA9IG5ldyBQcm9wZXJ0eUluZm8oKTsKLQkJCQkJaWYgKHByb3BJbmZvLnNldFNldHRlcihtdGhkKSkKLQkJCQkJCXByb3BzLnB1dChuYW1lLCBwcm9wSW5mbyk7Ci0JCQkJfSBlbHNlCi0JCQkJCXByb3BJbmZvLnNldFNldHRlcihtdGhkKTsKLQkJCX0KLQkJfQotCi0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBoYXNoIG1hcCBhbmQgY3JlYXRlIHRoZSBwcm9wZXJ0aWVzLgotCQlpdHIgPSBwcm9wcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIubmV4dCgpOwotCQkJKChQcm9wZXJ0eUluZm8pIGVudHJ5LmdldFZhbHVlKCkpLmNyZWF0ZVByb3BlcnR5KChTdHJpbmcpIGVudHJ5LmdldEtleSgpLCBpc0JvdW5kKTsKLQkJfQotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9QUk9QRVJUSUVTKTsJCQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlJbmZvIHsKLQkJCi0JCXB1YmxpYyBFQ2xhc3NpZmllciB0eXBlLCBpbmRleGVkVHlwZTsKLQkJcHVibGljIGJvb2xlYW4gY29uc3RyYWluZWQ7Ci0JCXB1YmxpYyBNZXRob2QgZ2V0dGVyLCBzZXR0ZXIsIGluZGV4ZWRHZXR0ZXIsIGluZGV4ZWRTZXR0ZXI7Ci0KLQkJcHVibGljIGJvb2xlYW4gc2V0R2V0dGVyKE1ldGhvZCBnZXQsIGJvb2xlYW4gbXVzdEJlQm9vbGVhbikgewotCQkJTGlzdCBwYXJtcyA9IGdldC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQlpZiAocGFybXMuc2l6ZSgpID4gMSkKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbXByb3BlciBudW1iZXIgb2YgcGFybXMuCi0JCQlib29sZWFuIGluZGV4ZWQgPSBwYXJtcy5zaXplKCkgPT0gMTsKLQkJCWlmIChpbmRleGVkICYmICEoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJpbnQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIGEgcGFybSB0aGF0IGlzIG5vdCBhbiBpbnQgaXMgaW52YWxpZCBmb3IgaW5kZXhlZC4KLQkJCUVDbGFzc2lmaWVyIHJldFR5cGUgPSBnZXQuZ2V0UmV0dXJuVHlwZSgpOwotCQkJaWYgKHJldFR5cGUgPT0gbnVsbCB8fCByZXRUeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JCQlpZiAobXVzdEJlQm9vbGVhbiAmJiAhcmV0VHlwZS5nZXROYW1lKCkuZXF1YWxzKCJib29sZWFuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpdCBtdXN0IGJlIGEgYm9vbGVhbi4KLQkJCWlmIChpbmRleGVkKSB7Ci0JCQkJaWYgKGluZGV4ZWRUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKGluZGV4ZWRUeXBlICE9IHJldFR5cGUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIGluZm8uCi0JCQkJfQotCQkJCWlmICh0eXBlICE9IG51bGwgJiYgISgoKEphdmFIZWxwZXJzKSB0eXBlKS5pc0FycmF5KCkgJiYgKChBcnJheVR5cGUpIHR5cGUpLmdldENvbXBvbmVudFR5cGUoKSA9PSByZXRUeXBlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gaW5kZXhlZCB0eXBlIGRvZXNuJ3QgbWF0Y2ggY29tcG9uZW50IHR5cGUgb2YgYmFzZSB0eXBlLgotCQkJfSBlbHNlIHsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0eXBlICE9IHJldFR5cGUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIGluZm8uCi0JCQkJfQotCQkJCWlmIChpbmRleGVkVHlwZSAhPSBudWxsICYmICEoKChKYXZhSGVscGVycykgcmV0VHlwZSkuaXNBcnJheSgpICYmICgoQXJyYXlUeXBlKSByZXRUeXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gaW5kZXhlZFR5cGUpKQotCQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBXZSBoYWQgYSBwb3RlbnRpYWwgaW5kZXhlZCBhbmQgaGFkIG5vdCB5ZXQgZm91bmQgdGhlIHJlZ3VsYXIgdHlwZS4gV2UndmUgbm93IGZvdW5kCi0JCQkJCQkvLyB0aGUgcmVndWxhciB0eXBlLCBhbmQgaXQgaXMgbm90IGluZGV4ZWQuIFNvIGl0IHRha2VzIHByaW9yaXR5IGFuZCB3aWxsIHdpcGUgb3V0Ci0JCQkJCQkvLyB0aGUgaW5kZXhlZCB0eXBlLgotCQkJCQkJaW5kZXhlZEdldHRlciA9IG51bGw7Ci0JCQkJCQlpbmRleGVkU2V0dGVyID0gbnVsbDsKLQkJCQkJCWluZGV4ZWRUeXBlID0gbnVsbDsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbmRleGVkIHR5cGUgZG9lc24ndCBtYXRjaCBjb21wb25lbnQgdHlwZSBvZiBiYXNlIHR5cGUgd2UgYWxyZWFkeSBoYXZlCi0JCQl9Ci0KLQkJCWlmIChpbmRleGVkKSB7Ci0JCQkJaWYgKGluZGV4ZWRHZXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGhhdmUgYW4gaW5kZXhlZCBnZXR0ZXIuCi0JCQkJaW5kZXhlZEdldHRlciA9IGdldDsKLQkJCQlpbmRleGVkVHlwZSA9IHJldFR5cGU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChnZXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGhhdmUgYSBnZXR0ZXIKLQkJCQlnZXR0ZXIgPSBnZXQ7Ci0JCQkJdHlwZSA9IHJldFR5cGU7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNldFNldHRlcihNZXRob2Qgc2V0KSB7Ci0JCQlMaXN0IHBhcm1zID0gc2V0LmdldFBhcmFtZXRlcnMoKTsKLQkJCWlmIChwYXJtcy5zaXplKCkgPiAyIHx8IHBhcm1zLnNpemUoKSA8IDEpCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gaW1wcm9wZXIgbnVtYmVyIG9mIHBhcm1zLgotCQkJYm9vbGVhbiBpbmRleGVkID0gcGFybXMuc2l6ZSgpID09IDI7Ci0JCQlpZiAoaW5kZXhlZCAmJiAhKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCkpLmdldEVUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiaW50IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBhIHBhcm0gdGhhdCBpcyBub3QgYW4gaW50IGlzIGludmFsaWQgZm9yIGluZGV4ZWQuCi0JCQlFQ2xhc3NpZmllciByZXRUeXBlID0gc2V0LmdldFJldHVyblR5cGUoKTsKLQkJCWlmIChyZXRUeXBlICE9IG51bGwgJiYgIXJldFR5cGUuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gbXVzdCBub3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JCQlFQ2xhc3NpZmllciBwcm9wVHlwZSA9IG51bGw7Ci0JCQlpZiAoaW5kZXhlZCkgewotCQkJCXByb3BUeXBlID0gKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMSkpLmdldEVUeXBlKCk7Ci0JCQkJaWYgKGluZGV4ZWRUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKGluZGV4ZWRUeXBlICE9IHByb3BUeXBlKQotCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBpbmZvLgotCQkJCX0KLQkJCQlpZiAodHlwZSAhPSBudWxsICYmICEoKChKYXZhSGVscGVycykgdHlwZSkuaXNBcnJheSgpICYmICgoQXJyYXlUeXBlKSB0eXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gcHJvcFR5cGUpKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEludmFsaWQgLSBpbmRleGVkIHR5cGUgZG9lc24ndCBtYXRjaCBjb21wb25lbnQgdHlwZSBvZiBiYXNlIHR5cGUsIG9yIGJhc2UgdHlwZSBub3QgYW4gYXJyYXkKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvcFR5cGUgPSAoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0eXBlICE9IHByb3BUeXBlKQotCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBJbnZhbGlkIC0gdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBpbmZvLgotCQkJCX0KLQkJCQlpZiAoaW5kZXhlZFR5cGUgIT0gbnVsbAotCQkJCQkmJiAhKCgoSmF2YUhlbHBlcnMpIHByb3BUeXBlKS5pc0FycmF5KCkgJiYgKChBcnJheVR5cGUpIHByb3BUeXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gaW5kZXhlZFR5cGUpKQotCQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBXZSBoYWQgYSBwb3RlbnRpYWwgaW5kZXhlZCBhbmQgaGFkIG5vdCB5ZXQgZm91bmQgdGhlIHJlZ3VsYXIgdHlwZS4gV2UndmUgbm93IGZvdW5kCi0JCQkJCQkvLyB0aGUgcmVndWxhciB0eXBlLCBhbmQgaXQgaXMgbm90IGluZGV4ZWQgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU28gaXQgdGFrZXMgcHJpb3JpdHkgYW5kIHdpbGwgd2lwZSBvdXQKLQkJCQkJCS8vIHRoZSBpbmRleGVkIHR5cGUuCi0JCQkJCQlpbmRleGVkR2V0dGVyID0gbnVsbDsKLQkJCQkJCWluZGV4ZWRTZXR0ZXIgPSBudWxsOwotCQkJCQkJaW5kZXhlZFR5cGUgPSBudWxsOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsgLy8gSW52YWxpZCAtIGluZGV4ZWQgdHlwZSBkb2Vzbid0IG1hdGNoIGNvbXBvbmVudCB0eXBlIG9mIGJhc2UgdHlwZSBmcm9tIHRoaXMgc2V0dGVyLgotCQkJfQotCi0JCQlpZiAoaW5kZXhlZCkgewotCQkJCWlmIChpbmRleGVkU2V0dGVyICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gQWxyZWFkeSBoYXZlIGFuIGluZGV4ZWQgZ2V0dGVyLgotCQkJCWluZGV4ZWRTZXR0ZXIgPSBzZXQ7Ci0JCQkJaW5kZXhlZFR5cGUgPSBwcm9wVHlwZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHNldHRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIEFscmVhZHkgaGF2ZSBhIGdldHRlcgotCQkJCXNldHRlciA9IHNldDsKLQkJCQl0eXBlID0gcHJvcFR5cGU7Ci0JCQl9Ci0KLQkJCWlmIChzZXQuZ2V0SmF2YUV4Y2VwdGlvbnMoKS5jb250YWlucyhVdGlsaXRpZXMuZ2V0SmF2YUNsYXNzKCJqYXZhLmJlYW5zLlByb3BlcnR5VmV0b0V4Y2VwdGlvbiIsIGdldEphdmFDbGFzcygpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnN0cmFpbmVkID0gdHJ1ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlUHJvcGVydHkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNCb3VuZCkgewotCQkJYm9vbGVhbiBpbmRleGVkID0gaW5kZXhlZFR5cGUgIT0gbnVsbDsKLQkJCWlmIChpbmRleGVkICYmIHR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIEEgcG90ZW50aWFsIGluZGV4ZWQsIGJ1dCBuZXZlciBmb3VuZCB0aGUgZ2V0dGVyL3NldHRlciBvZiB0aGUgcmVndWxhciB0eXBlLgotCi0JCQlQcm9wZXJ0eURlY29yYXRvciBwcm9wID0KLQkJCQlCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLmNyZWF0ZVByb3BlcnR5KAotCQkJCQluYW1lLAotCQkJCQlpbmRleGVkLAotCQkJCQkoIWluZGV4ZWQpID8gKHNldHRlciAhPSBudWxsKSA6IChzZXR0ZXIgIT0gbnVsbCB8fCBpbmRleGVkU2V0dGVyICE9IG51bGwpLAotCQkJCQl0eXBlKTsKLQkJCWlmIChwcm9wID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBSZWZsZWN0aW9uIG5vdCB3YW50ZWQuCi0KLQkJCWluZGV4ZWQgPSBwcm9wIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yOyAvLyBJdCBjb3VsZCBvZiBiZWVuIGZvcmNlZCBiYWNrIHRvIG5vdCBpbmRleGVkIGlmIGV4cGxpY2l0bHkgc2V0LgotCi0JCQkvLyBBdCB0aGlzIHBvaW50IGluIHRpbWUgYWxsIGltcGxpY2l0IHNldHRpbmdzIGhhdmUgYmVlbiBjbGVhcmVkLiBUaGlzIGlzIGRvbmUgYmFjayBpbiBjcmVhdGVQcm9wZXJ0eSgpIG1ldGhvZCBhYm92ZS4KLQkJCS8vIFNvIG5vdyBhcHBseSByZWZsZWN0ZWQgc2V0dGluZ3Mgb24gdGhlIHByb3BlcnR5IGRlY29yYXRvci4gCi0JCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuc2V0UHJvcGVydGllcyhwcm9wLCBpc0JvdW5kLCBjb25zdHJhaW5lZCwgZ2V0dGVyLCBzZXR0ZXIpOwotCQkJaWYgKGluZGV4ZWQpCi0JCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LnNldFByb3BlcnRpZXMoKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcikgcHJvcCwgaW5kZXhlZEdldHRlciwgaW5kZXhlZFNldHRlcik7Ci0KLQkJfQotCX07Ci0KLQkvKgotCSAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGludHJvc3BlY3Qgc28gdGhhdCBmbGFncyBhcmUgY29ycmVjdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmluYWxpemVPcGVyYXRpb25zKENoYW5nZURlc2NyaXB0aW9uIGNkKSB7Ci0JCS8vIE5vdyBnbyB0aHJvdWdoIHRoZSBsaXN0IGFuZCByZW1vdmUgdGhvc2UgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4KLQkJSXRlcmF0b3IgaXRyID0gZ2V0T3BlcmF0aW9uc0xpc3QoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJRU9wZXJhdGlvbiBhID0gKEVPcGVyYXRpb24pIGl0ci5uZXh0KCk7Ci0JCQlNZXRob2REZWNvcmF0b3IgbSA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoYSk7Ci0JCQlpZiAoIW5ld29wZXJhdGlvbnMuY29udGFpbnMoYSkpIHsKLQkJCQkvLyBBIGNhbmRpZGF0ZSBmb3IgcmVtb3ZhbC4gSXQgaXMgaW4gdGhlIGxpc3QgYnV0IHdlIGRpZG4ndCBhZGQgaXQuIENoZWNrIHRvIHNlZSBpZiBpdCBvbmUgd2UgaGFkIGNyZWF0ZWQgaW4gdGhlIHBhc3QuCi0JCQkJLy8gSWYgbm8gbWV0aG9kZGVjb3JhdG9yLCB0aGVuIGtlZXAgaXQsIG5vdCBvbmUgb3Vycy4KLQkJCQlpZiAobSAhPSBudWxsKSB7Ci0JCQkJCUltcGxpY2l0SXRlbSBpbXBsaWNpdCA9IG0uZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQkJCWlmIChpbXBsaWNpdCAhPSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUwpIHsKLQkJCQkJCW0uc2V0RU1vZGVsRWxlbWVudChudWxsKTsgLy8gUmVtb3ZlIGl0IGJlY2F1c2UgaXQgd2FzIGltcGxpY2l0LgotCQkJCQkJICgoSW50ZXJuYWxFT2JqZWN0KSBtKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQlpZiAoaW1wbGljaXQgPT0gSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9BTkRfRkVBVFVSRV9MSVRFUkFMKSB7Ci0JCQkJCQkJaXRyLnJlbW92ZSgpOyAvLyBUaGUgb3BlcmF0aW9uIHdhcyBpbXBsaWNpdCB0b28uCi0JCQkJCQkJICgoSW50ZXJuYWxFT2JqZWN0KSBhKS5lU2V0UHJveHlVUkkoQkFEX1VSSSk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsJLy8gQXQgdGhpcyBwb2ludCB3ZSBubyBsb25nZXIgaGF2ZSBhIG1ldGhvZCBkZWNvcmF0b3IsIHNvIGdvIHRvIG5leHQuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChtICE9IG51bGwgJiYgY2QgIT0gbnVsbCkgewotCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGNhY2hlIGVudHJ5IGZvciB0aGlzIG1ldGhvZC4KLQkJCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuYnVpbGRDaGFuZ2UoY2QsIG0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgYmVoYXZpb3IgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIG10aGREZXNjLgotCSAqLwotCXByb3RlY3RlZCBNZXRob2REZWNvcmF0b3IgY2FsY3VsYXRlT3BlcmF0aW9uKE1ldGhvZFJlY29yZCByZWNvcmQpIHsKLQkJcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbihyZWNvcmQubmFtZSwgZm9ybUxvbmdOYW1lKHJlY29yZCksIG51bGwsIHJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgYmVoYXZpb3IgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIHBhc3NlZCBpbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRGVjb3JhdG9yIGNyZWF0ZU9wZXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGxvbmdOYW1lLCBNZXRob2QgbWV0aG9kLCBNZXRob2RSZWNvcmQgcmVjb3JkKSB7Ci0JCS8vIEZpcnN0IGZpbmQgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGJlaGF2aW9yIG9mIHRoaXMgbmFtZSBhbmQgbWV0aG9kIHNpZ25hdHVyZSAsIGFuZCBpZiB0aGVyZSBpcywgaXMgdGhlIE1ldGhvZERlY29yYXRvcgotCQkvLyBtYXJrZWQgdG8gbm90IGFsbG93IG1lcmdpbmcgaW4gb2YgaW50cm9zcGVjdGlvbiByZXN1bHRzLgotCQlIYXNoTWFwIGV4aXN0aW5nTG9jYWxzID0gZ2V0T3BlcmF0aW9uc01hcCgpOwotCQlFT3BlcmF0aW9uIG9wZXIgPSBudWxsOwotCQlNZXRob2REZWNvcmF0b3IgbWQgPSBudWxsOwotCQlPYmplY3QgYiA9IG51bGw7Ci0JCWlmIChuYW1lICE9IG51bGwpCi0JCQliID0gZXhpc3RpbmdMb2NhbHMuZ2V0KGxvbmdOYW1lKTsKLQkJZWxzZQotCQkJYiA9IGV4aXN0aW5nTG9jYWxzLmdldChsb25nTmFtZSk7Ci0JCQkKLQkJaWYgKGIgIT0gbnVsbCkgewotCQkJLy8gSWYgdGhlIGRlY29yYXRvciBmb3IgdGhpcyBlbnRyeSBzYXlzIG5vdCB0byBtZXJnZSB0aGVuIHJldHVybi4KLQkJCS8vIElmIHRoZXJlIGlzIG5vIGRlY29yYXRvciwgdGhlbiB3ZSB3aWxsIG1lcmdlLiBJZiB0aGV5IGRpZG4ndCB3YW50IHRvCi0JCQkvLyBtZXJnZSwgdGhlbiB0aGV5IHNob3VsZCBvZiBjcmVhdGVkIGEgZGVjb3JhdG9yIHdpdGggbm8gbWVyZ2Ugb24gaXQuCi0JCQltZCA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoKEVPcGVyYXRpb24pIGIpOwotCQkJaWYgKG1kICE9IG51bGwgJiYgIW1kLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlvcGVyID0gKEVPcGVyYXRpb24pIGI7Ci0JCX0KLQotCQkvLyBOZWVkIHRvIGZpbmQgdGhlIG1ldGhvZCBhbmQgbWV0aG9kIGlkLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCS8vIE5vIG1ldGhvZCBzZW50LCBjcmVhdGUgYSBwcm94eSB0byBpdCBmcm9tIHRoZSByZWNvcmQuCi0JCQltZXRob2QgPSBCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuY3JlYXRlSmF2YU1ldGhvZFByb3h5KHJlY29yZC5tZXRob2RGb3JEZXNjcmlwdG9yKTsKLQkJfQotCi0JCUltcGxpY2l0SXRlbSBpbXBsaWNpdCA9IG1kID09IG51bGwgPyBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0xJVEVSQUwgOiBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUw7Ci0JCWlmIChvcGVyID09IG51bGwpIHsKLQkJCS8vIFdlIHdpbGwgY3JlYXRlIGEgbmV3IE1ldGhvZFByb3h5LgotCQkJb3BlciA9IEJlYW5pbmZvRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUHJveHkoKTsKLQkJCWdldE9wZXJhdGlvbnNMaXN0KCkuYWRkKG9wZXIpOwotCQkJaW1wbGljaXQgPSBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUw7IAotCQl9CQkKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwkJCi0KLQkJLy8gTm93IGZpbGwgaXQgaW4uCi0JCWlmIChvcGVyIGluc3RhbmNlb2YgTWV0aG9kUHJveHkpCi0JCQkgKChNZXRob2RQcm94eSkgb3Blcikuc2V0TWV0aG9kKG1ldGhvZCk7Ci0JCXNldE1ldGhvZElEKG5hbWUsIG9wZXIpOwotCQlvcGVyLnNldE5hbWUobmFtZSk7Ci0JCW5ld29wZXJhdGlvbnMuYWRkKG9wZXIpOwotCi0JCS8vIE5vdyBjcmVhdGUvZmlsbCBpbiB0aGUgbWV0aG9kIGRlY29yYXRvciBmb3IgaXQuCi0JCS8vIElmIHRoZXJlIGFscmVhZHkgaXMgb25lIHRoZW4gd2UKLQkJLy8gd2lsbCB1c2UgaXQuIFRoaXMgYWxsb3dzIG1lcmdpbmcgd2l0aCBiZWFuaW5mby4JCQotCQlpZiAobWQgPT0gbnVsbCkgewotCQkJbWQgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZERlY29yYXRvcigpOwotCQkJbWQuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKGltcGxpY2l0KTsKLQkJCW9wZXIuZ2V0RUFubm90YXRpb25zKCkuYWRkKG1kKTsKLQkJfSBlbHNlCi0JCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuY2xlYXIobWQpOwotCQlyZXR1cm4gbWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gb3BlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RJRChTdHJpbmcgbmFtZSwgRU9wZXJhdGlvbiBvcGVyKSB7Ci0JCSgoWE1JUmVzb3VyY2UpIG9wZXIuZVJlc291cmNlKCkpLnNldElEKG9wZXIsIGdldEphdmFDbGFzcygpLmdldE5hbWUoKSArIEJlYW5pbmZvSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uQkVIQVZJT1IgKyBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmbGVjdE9wZXJhdGlvbnMoKSB7Ci0JCS8vIElmIHdlIGFyZSBzZXQgdG8gbWVyZ2VTdXBlclR5cGVCZWhhdmlvcnMsIHRoZW4gd2UgbmVlZCB0byBnZXQgdGhlIHN1cGVyIGJlaGF2aW9ycy4KLQkJLy8gVGhpcyBpcyBzbyB0aGF0IGR1cGxpY2F0ZSBhbnkgZnJvbSBzdXBlciB0aGF0IHdlIGZpbmQgaGVyZS4gV2hlbiByZWZsZWN0aW5nIHdlIGRvbid0Ci0JCS8vIGFsbG93IGRpc2NvdmVyZWQgZHVwbGljYXRlcyB1bmxlc3MgdGhleSBhcmUgZGlmZmVyZW50IHNpZ25hdHVyZXMuIFNvIGFsbCBzdXBlciBvcGVyYXRpb25zCi0JCS8vIHdpbGwgYmUgYWxsb3dlZCBhbmQgd2Ugd2lsbCBub3Qgb3ZlcnJpZGUgdGhlbS4KLQkJLy8KLQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJLy8gSW50ZXJmYWNlcyBjYW4gaGF2ZSBtdWx0aXBsZSBleHRlbmRzLCB3aGlsZSB0aGUgSW50cm9zcGVjdG9yIGlnbm9yZXMgdGhlc2UgZm9yIHJlZmxlY3Rpb24sCi0JCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzLgotCQkvLwotCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQlTZXQgc3VwZXJzID0gbmV3IEhhc2hTZXQoNTApOwotCQlCZWFuRGVjb3JhdG9yIGJkID0gVXRpbGl0aWVzLmdldEJlYW5EZWNvcmF0b3IoZ2V0SmF2YUNsYXNzKCkpOwotCQlpZiAoYmQgPT0gbnVsbCB8fCBiZC5pc01lcmdlU3VwZXJNZXRob2RzKCkpIHsKLQkJCUxpc3Qgc3VwZXJUeXBlcyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlpZiAoIXN1cGVyVHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJTGlzdCBzdXBlckFsbCA9ICgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCQkJaW50IGxlbiA9IHN1cGVyQWxsLnNpemUoKTsKLQkJCQkJZm9yIChpbnQgaTE9MDsgaTE8bGVuOyBpMSsrKSB7Ci0JCQkJCQlFT3BlcmF0aW9uIG9wID0gKEVPcGVyYXRpb24pIHN1cGVyQWxsLmdldChpMSk7Ci0JCQkJCQlzdXBlcnMuYWRkKGZvcm1Mb25nTmFtZShvcCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBhcyBiZWhhdmlvcnMJCi0JCQlTdHJpbmcgbG9uZ05hbWUgPSBmb3JtTG9uZ05hbWUobXRoZCk7Ci0JCQkvLyBBZGQgaWYgc3VwZXIgbm90IGFscmVhZHkgY29udGFpbiBpdC4KLQkJCWlmICghc3VwZXJzLmNvbnRhaW5zKGxvbmdOYW1lKSkKLQkJCQljcmVhdGVPcGVyYXRpb24obnVsbCwgbG9uZ05hbWUsIG10aGQsIG51bGwpOwkvLyBEb24ndCBwYXNzIGEgbmFtZSwgdHJ5IHRvIGNyZWF0ZSBpdCBieSBuYW1lLCBvbmx5IHVzZSBJRCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG9mIHRoZSBzYW1lIG5hbWUuCi0JCX0KLQl9Ci0KLQkvKgotCSAqIG1lcmdlIGFsbCAgdGhlIEJlaGF2aW9ycyhpLmUuIHN1cGVydHlwZXMpCi0JICovCi0JcHJvdGVjdGVkIEJhc2ljRUxpc3QgYWxsT3BlcmF0aW9ucygpIHsKLQkJQmFzaWNFTGlzdCBqY0FsbE9wZXJhdGlvbnMgPSAoQmFzaWNFTGlzdCkgZ2V0SmF2YUNsYXNzKCkucHJpbUdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCUJlYW5pbmZvU3VwZXJBZGFwdGVyIHN1cGVyQWRhcHRlciA9Ci0JCQkoQmVhbmluZm9TdXBlckFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihnZXRKYXZhQ2xhc3MoKSwgQmVhbmluZm9TdXBlckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoamNBbGxPcGVyYXRpb25zICE9IG51bGwpIHsKLQkJCS8vIFNlZSBpZiBuZXcgb25lIHJlcXVpcmVkLgotCQkJaWYgKHN1cGVyQWRhcHRlciA9PSBudWxsIHx8ICFzdXBlckFkYXB0ZXIuaXNBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsT3BlcmF0aW9uczsKLQkJCS8vIENhbid0IGdldCBzdXBlcmFkYXB0ZXIsIHNvIG11c3Qgbm90IGJlIGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHJldHVybiBjdXJyZW50IGxpc3QuIE9yIG5vIGNoYW5nZSByZXF1aXJlZC4gICAgICAgCQkKLQkJfQotCi0JCVVuaXF1ZUVMaXN0LkZhc3RDb21wYXJlIGFsbE9wZXJhdGlvbnMgPSBuZXcgVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUoKSB7Ci0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKiAKLQkJCSAqIEBzaW5jZSAxLjEuMAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIE9iamVjdFtdIG5ld0RhdGEoaW50IGNhcGFjaXR5KSB7Ci0JCQkJcmV0dXJuIG5ldyBFT3BlcmF0aW9uW2NhcGFjaXR5XTsKLQkJCX0KLQkJfTsKLQkJYm9vbGVhbiBkb0FsbE9wZXJhdGlvbnMgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCS8vIElmIHdlIGFyZSBpbnRyb3NwZWN0aW5nLCBkb24ndCBkbyBhbGwgb3BlcmF0b2lucyBiZWNhdXNlIGl0IGlzIGFuIGludmFsaWQgbGlzdC4gSnVzdCByZXR1cm4gZW1wdHkgd2l0aG91dCByZXNldGluZyB0aGUgYWxsIG1vZGlmaWVkIGZsYWcuCi0JCQlkb0FsbE9wZXJhdGlvbnMgPSAhaXNEb2luZ0FsbE9wZXJhdGlvbnMgJiYgIWlzSW50cm9zcGVjdGluZyAmJiBpc1Jlc291cmNlQ29ubmVjdGVkKCk7Ci0JCQlpZiAoZG9BbGxPcGVyYXRpb25zKQotCQkJCWlzRG9pbmdBbGxPcGVyYXRpb25zID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChkb0FsbE9wZXJhdGlvbnMpIHsKLQkJCXRyeSB7Ci0JCQkJRUxpc3QgbG9jYWxPcGVyYXRpb25zID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJCQkvLyBLbHVkZ2U6IEJlYW5JbmZvIHNwZWMgZG9lc24ndCBhZGRyZXNzIEludGVyZmFjZXMsIGJ1dCBzb21lIHBlb3BsZSB3YW50IHRvIHVzZSB0aGVtLgotCQkJCS8vIEludGVyZmFjZXMgY2FuIGhhdmUgbXVsdGlwbGUgZXh0ZW5kcywgd2hpbGUgdGhlIEludHJvc3BlY3RvciBpZ25vcmVzIHRoZXNlIGZvciByZWZsZWN0aW9uLAotCQkJCS8vIHRoZSB0cnV0aCBpcyBtb3N0IHBlb3BsZSB3YW50IHRoZXNlLiBTbyB3ZSB3aWxsIGFkZCB0aGVtIGluLiBCdXQgc2luY2UgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBpdAotCQkJCS8vIGdldHMgY29uZnVzaW5nLiBXZSBuZWVkIHRvIGxvb2sgZm9yIGR1cHMgZnJvbSB0aGUgc3VwZXIgdHlwZXMgYW5kIHN0aWxsIGtlZXAgb3JkZXIuCi0JCQkJLy8KLQkJCQkvLyBTdXBlcnR5cGVzIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBmb3IgY2xhc3NlcywgaXQgaXMgcG9zc2libGUgdG8gYmUgMCwgMSwgMiBvciBtb3JlIGZvciBpbnRlcmZhY2VzLgotCQkJCUxpc3Qgc3VwZXJUeXBlcyA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlclR5cGVzKCk7Ci0JCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBOb3cgd2UgbmVlZCB0byBtZXJnZSBpbiB0aGUgc3VwZXJzLgotCQkJCQlCZWFuRGVjb3JhdG9yIGJkID0gVXRpbGl0aWVzLmdldEJlYW5EZWNvcmF0b3IoZ2V0SmF2YUNsYXNzKCkpOwotCQkJCQkvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBzdXBlcnR5cGUsIHdlIGNhbiBhZGQgdG8gdGhlIGFjdHVhbCBldmVudHMsIGVsc2Ugd2Ugd2lsbCB1c2UgdGhlIGxpbmtlZCBoYXNoc2V0IHNvIHRoYXQKLQkJCQkJLy8gd2UgZG9uJ3QgYWRkIHBvc3NpYmxlIGR1cGxpY2F0ZXMgKGUuZy4gSUEgZXh0ZW5kcyBJQixJQyBhbmQgSUIgZXh0ZW5kcyBJQy4gSW4gdGhpcyBjYXNlIHRoZXJlIHdvdWxkIGJlIGR1cHMKLQkJCQkJLy8gYmVjYXVzZSBJQiB3b3VsZCBjb250cmlidXRlIElDJ3MgdG9vKS4KLQkJCQkJQ29sbGVjdGlvbiB3b3JraW5nQWxsT3BlcmF0aW9ucyA9IHN1cGVyVHlwZXMuc2l6ZSgpID09IDEgPyAoQ29sbGVjdGlvbikgYWxsT3BlcmF0aW9ucyA6IG5ldyBMaW5rZWRIYXNoU2V0KCk7IAotCQkJCQkvLyBXZSB3aWxsIG5vdyBtZXJnZSBhcyBkaXJlY3RlZC4KLQkJCQkJYm9vbGVhbiBtZXJnZUFsbCA9IGJkID09IG51bGwgfHwgYmQuaXNNZXJnZVN1cGVyTWV0aG9kcygpOwotCQkJCQlpZiAoIW1lcmdlQWxsKSB7Ci0JCQkJCQkvLyB3ZSBkb24ndCB0byB3YW50IHRvIG1lcmdlIHN1cGVyIG9wZXJhdGlvbnMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHN1cGVyIG5vbi1vcGVyYXRpb25zLgotCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQlmb3IgKGludCBpPTA7IGk8bGVuU1Q7IGkrKykgewotCQkJCQkJCUxpc3Qgc3VwZXJzID0gKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRFQWxsT3BlcmF0aW9ucygpOwotCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCWZvciAoaW50IGkxID0gMDsgaTEgPCBsZW47IGkxKyspIHsKLQkJCQkJCQkJRU9wZXJhdGlvbiBvID0gKEVPcGVyYXRpb24pIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKG8pOwotCQkJCQkJCQlpZiAobWQgPT0gbnVsbCB8fCAobWQuZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCkgPT0gSW1wbGljaXRJdGVtLk5PVF9JTVBMSUNJVF9MSVRFUkFMICYmICFtZC5pc01lcmdlSW50cm9zcGVjdGlvbigpKSkKLQkJCQkJCQkJCXdvcmtpbmdBbGxPcGVyYXRpb25zLmFkZChvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSB3YW50IHRvIG1lcmdlIGFsbC4KLQkJCQkJCS8vIEJlYW5JbmZvIGNvdWxkIG9mIGdpdmVuIHVzIHRoZSBkb24ndCBtZXJnZSBsaXN0LiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgdGhlbiB3ZSBhY2NlcHQgYWxsLgotCQkJCQkJaWYgKGJkICE9IG51bGwgJiYgYmQuZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRNZXRob2ROYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkpOwotCQkJCQkJCQotCQkJCQkJCS8vIE5vdyB3YWxrIGFuZCBhZGQgaW4gbm9uLWJlYW4gb3BlcmF0aW9ucyAoYW5kIGJlYW4gb3BlcmF0aW9ucyB0aGF0IHdlcmUgZXhwbGljaXRseSBhZGRlZCBhbmQgbm90IG1lcmdlYWJsZSAoaS5lLiBkaWRuJ3QgY29tZSB0aHJ1IGJlYW5pbmZvKSkgCi0JCQkJCQkJLy8gYW5kIGFkZCB0aG9zZSBub3Qgc3BlY2lmaWNhbGx5IGNhbGxlZCBvdXQgYnkgQmVhbkluZm8gbm90IG1lcmdlIGxpc3QuCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQkJCQkJCWludCBsZW4gPSBzdXBlcnMuc2l6ZSgpOwotCQkJCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgbGVuOyBpMSsrKSB7Ci0JCQkJCQkJCQlFT3BlcmF0aW9uIG8gPSAoRU9wZXJhdGlvbikgc3VwZXJzLmdldChpMSk7Ci0JCQkJCQkJCQlNZXRob2REZWNvcmF0b3IgbWQgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKG8pOwotCQkJCQkJCQkJaWYgKG1kID09IG51bGwgfHwgKG1kLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhbWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQkJd29ya2luZ0FsbE9wZXJhdGlvbnMuYWRkKG8pOwotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJU3RyaW5nIGxvbmdOYW1lID0gZm9ybUxvbmdOYW1lKG8pOwotCQkJCQkJCQkJCWlmIChsb25nTmFtZSA9PSBudWxsIHx8ICFzdXBlclNldC5jb250YWlucyhsb25nTmFtZSkpCi0JCQkJCQkJCQkJCXdvcmtpbmdBbGxPcGVyYXRpb25zLmFkZChvKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJd29ya2luZ0FsbE9wZXJhdGlvbnMuYWRkQWxsKCgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0RUFsbE9wZXJhdGlvbnMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsT3BlcmF0aW9ucyAhPSBhbGxPcGVyYXRpb25zKQotCQkJCQkJYWxsT3BlcmF0aW9ucy5hZGRBbGwod29ya2luZ0FsbE9wZXJhdGlvbnMpOwkvLyBOb3cgY29weSBvdmVyIHRoZSBvcmRlcmVkIHN1cGVyIG9wZXJhdGlvbnMuCQkJCQkKLQkJCQl9Ci0JCQkJYWxsT3BlcmF0aW9ucy5hZGRBbGwobG9jYWxPcGVyYXRpb25zKTsJCQkJCi0JCQkJRVN1cGVyQWRhcHRlciBzYSA9IGdldEphdmFDbGFzcygpLmdldEVTdXBlckFkYXB0ZXIoKTsKLQkJCQlzYS5zZXRBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKGZhbHNlKTsgLy8gTm93IGJ1aWx0LCBzbyByZXNldCB0byBub3QgY2hhbmdlZC4KLQkJCX0gZmluYWxseSB7Ci0JCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQkJaXNEb2luZ0FsbFByb3BlcnRpZXMgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlhbGxPcGVyYXRpb25zLnNocmluaygpOwotCQlyZXR1cm4gbmV3IEVjb3JlRUxpc3QuVW5tb2RpZmlhYmxlRUxpc3QuRmFzdENvbXBhcmUoCi0JCQlnZXRKYXZhQ2xhc3MoKSwKLQkJCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VBbGxPcGVyYXRpb25zKCksCi0JCQlhbGxPcGVyYXRpb25zLnNpemUoKSwKLQkJCWFsbE9wZXJhdGlvbnMuZGF0YSgpKTsKLQotCX0KLQotCS8qCi0JICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gaW50cm9zcGVjdCBzbyB0aGF0IGZsYWdzIGFyZSBjb3JyZWN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBmaW5hbGl6ZUV2ZW50cyhDaGFuZ2VEZXNjcmlwdGlvbiBjZCkgewotCQkvLyBOb3cgZ28gdGhyb3VnaCB0aGUgbGlzdCBhbmQgcmVtb3ZlIHRob3NlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQuCi0JCU1hcCBvbGRMb2NhbHMgPSBnZXRFdmVudHNNYXAoKTsKLQkJSXRlcmF0b3IgaXRyID0gZ2V0RXZlbnRzTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhRXZlbnQgYSA9IChKYXZhRXZlbnQpIGl0ci5uZXh0KCk7Ci0JCQlFdmVudFNldERlY29yYXRvciBlID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGEpOwotCQkJT2JqZWN0IGFPbGQgPSBvbGRMb2NhbHMuZ2V0KGEuZ2V0TmFtZSgpKTsKLQkJCWlmIChhT2xkICE9IG51bGwgJiYgYU9sZCAhPSBCb29sZWFuLkZBTFNFKSB7Ci0JCQkJLy8gQSBjYW5kaWRhdGUgZm9yIHJlbW92YWwuIEl0IHdhcyBpbiB0aGUgb2xkIGxpc3QgYW5kIGl0IHdhcyBub3QgcHJvY2Vzc2VkLgotCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gZS5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCQkJaWYgKGltcGxpY2l0ICE9IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCkgewotCQkJCQkJZS5zZXRFTW9kZWxFbGVtZW50KG51bGwpOyAvLyBSZW1vdmUgaXQgYmVjYXVzZSBpdCB3YXMgaW1wbGljaXQuCi0JCQkJCQkoKEludGVybmFsRU9iamVjdCkgZSkuZVNldFByb3h5VVJJKEJBRF9VUkkpOwotCQkJCQkJaWYgKGltcGxpY2l0ID09IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTCkgewotCQkJCQkJCWl0ci5yZW1vdmUoKTsgLy8gVGhlIGZlYXR1cmUgd2FzIGltcGxpY2l0IHRvby4KLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgYSkuZVNldFByb3h5VVJJKEJBRF9VUkkpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7CS8vIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3QgaGF2ZSBhIGRlY29yYXRvciBhbnkgbW9yZSwgc28gZG9uJ3QgYm90aGVyIGdvaW5nIG9uLgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZSAhPSBudWxsICYmIGNkICE9IG51bGwpIHsKLQkJCQkvLyBOb3cgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjYWNoZSBlbnRyeSBmb3IgdGhpcyBldmVudC4KLQkJCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuYnVpbGRDaGFuZ2UoY2QsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgZXZlbnQgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIGV2ZW50RGVzYy4KLQkgKi8KLQlwcm90ZWN0ZWQgRXZlbnRTZXREZWNvcmF0b3IgY2FsY3VsYXRlRXZlbnQoRXZlbnRTZXRSZWNvcmQgcmVjb3JkKSB7Ci0JCXJldHVybiBjcmVhdGVFdmVudChyZWNvcmQubmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRmlsbCBpbiB0aGUgZXZlbnQgYW5kIGl0cyBkZWNvcmF0b3IgdXNpbmcgdGhlIHBhc3NlZCBpbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRXZlbnRTZXREZWNvcmF0b3IgY3JlYXRlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQkJLy8gRmlyc3QgZmluZCBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGV2ZW50IG9mIHRoaXMgbmFtZSwgYW5kIGlmIHRoZXJlIGlzLCBpcyB0aGUgRXZlbnRTZXREZWNvcmF0b3IKLQkJLy8gbWFya2VkIHRvIG5vdCBhbGxvdyBtZXJnaW5nIGluIG9mIGludHJvc3BlY3Rpb24gcmVzdWx0cy4KLQkJSGFzaE1hcCBleGlzdGluZ0xvY2FscyA9IGdldEV2ZW50c01hcCgpOwotCQlKYXZhRXZlbnQgZXZlbnQgPSBudWxsOwotCQlFdmVudFNldERlY29yYXRvciBlZCA9IG51bGw7Ci0JCU9iamVjdCBiID0gZXhpc3RpbmdMb2NhbHMuZ2V0KG5hbWUpOwotCQlpZiAoQm9vbGVhbi5GQUxTRSA9PSBiKQotCQkJcmV0dXJuIG51bGw7IC8vIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZXZlbnQsIGNhbid0IHByb2Nlc3MgaXQgYWdhaW4uCQkJCi0JCWlmIChiICE9IG51bGwpIHsKLQkJCS8vIFdlJ3ZlIGZvdW5kIG9uZSBvZiB0aGUgc2FtZSBldmVudC4gV2hldGhlciB3ZSBtb2RpZnkgaXQgb3IgdXNlIGl0IGFzIGlzLCB3ZSBwdXQgaW4gYQotCQkJLy8gc3BlY2lhbCBkdW1teSBpbiBpdHMgcGxhY2UuIFRoYXQgbWFya3MgdGhhdCB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCBhbmQgYWNjZXB0ZWQgaXQuCi0JCQlleGlzdGluZ0xvY2Fscy5wdXQobmFtZSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJCS8vIElmIHRoZSBkZWNvcmF0b3IgZm9yIHRoaXMgZW50cnkgc2F5cyBub3QgdG8gbWVyZ2UgdGhlbiByZXR1cm4uCi0JCQkvLyBJZiB0aGVyZSBpcyBubyBkZWNvcmF0b3IsIHRoZW4gd2Ugd2lsbCBtZXJnZS4gSWYgdGhleSBkaWRuJ3Qgd2FudCB0bwotCQkJLy8gbWVyZ2UsIHRoZW4gdGhleSBzaG91bGQgb2YgY3JlYXRlZCBhIGRlY29yYXRvciB3aXRoIG5vIG1lcmdlIG9uIGl0LgotCQkJZWQgPSBVdGlsaXRpZXMuZ2V0RXZlbnRTZXREZWNvcmF0b3IoKEphdmFFdmVudCkgYik7Ci0JCQlpZiAoZWQgIT0gbnVsbCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWV2ZW50ID0gKEphdmFFdmVudCkgYjsKLQkJfQotCQkKLQkJSW1wbGljaXRJdGVtIGltcGxpY2l0ID0gZWQgPT0gbnVsbCA/IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfTElURVJBTCA6IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTDsKLQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCS8vIFdlIHdpbGwgY3JlYXRlIGEgbmV3IEV2ZW50LgotCQkJZXZlbnQgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJlYW5FdmVudCgpOwotCQkJZ2V0RXZlbnRzTGlzdCgpLmFkZChldmVudCk7Ci0JCQlpbXBsaWNpdCA9IEltcGxpY2l0SXRlbS5JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkVfTElURVJBTDsgLy8gQ2FuJ3QgaGF2ZSBhbiBpbXBsaWNpdCBmZWF0dXJlIGJ1dCBleHBsaWNpdCBkZWNvcmF0b3IuCi0JCX0KLQotCQlzZXRFdmVudElEKG5hbWUsIGV2ZW50KTsKLQkJZXZlbnQuc2V0TmFtZShuYW1lKTsKLQotCQkvLyBOb3cgY3JlYXRlIGluIHRoZSBldmVudCBkZWNvcmF0b3IgZm9yIGl0LgotCQkvLyBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSB0aGVuIHdlCi0JCS8vIHdpbGwgdXNlIGl0LiBUaGlzIGFsbG93cyBtZXJnaW5nIHdpdGggYmVhbmluZm8uCQkKLQkJaWYgKGVkID09IG51bGwpIHsKLQkJCWVkID0gQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFdmVudFNldERlY29yYXRvcigpOwotCQkJZWQuc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKGltcGxpY2l0KTsKLQkJCWV2ZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlZCk7Ci0JCX0gZWxzZQotCQkJQmVhbkluZm9EZWNvcmF0b3JVdGlsaXR5LmNsZWFyKGVkKTsKLQkJcmV0dXJuIGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGV2ZW50Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEV2ZW50SUQoU3RyaW5nIG5hbWUsIEphdmFFdmVudCBldmVudCkgewotCQkvLyBOb3cgZmlsbCBpdCBpbi4KLQkJKChYTUlSZXNvdXJjZSkgZXZlbnQuZVJlc291cmNlKCkpLnNldElEKGV2ZW50LCBnZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCkgKyBCZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLkVWRU5UICsgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVmbGVjdCB0aGUgZXZlbnRzLiBUaGlzIHJlcXVpcmVzIGdvaW5nIHRocm91Z2ggbG9jYWwgcHVibGljIG1ldGhvZHMgYW5kIGNyZWF0aW5nIGFuIAotCSAqIGV2ZW50IGZvciB0aGUgZGlzY292ZXJlZCBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEV2ZW50cygpIHsKLQkJLy8gSWYgd2UgYXJlIHNldCB0byBtZXJnZVN1cGVyVHlwZUV2ZW50cywgdGhlbiB3ZSBuZWVkIHRvIGdldCB0aGUgc3VwZXIgZXZlbnRzLgotCQkvLyBUaGlzIGlzIHNvIHRoYXQgZHVwbGljYXRlIGFueSBmcm9tIHN1cGVyIHRoYXQgd2UgZmluZCBoZXJlLiBXaGVuIHJlZmxlY3Rpbmcgd2UgZG9uJ3QKLQkJLy8gYWxsb3cgZGlzY292ZXJlZCBkdXBsaWNhdGVzLgotCQkvLwotCQkvLyBLbHVkZ2U6IEJlYW5JbmZvIHNwZWMgZG9lc24ndCBhZGRyZXNzIEludGVyZmFjZXMsIGJ1dCBzb21lIHBlb3BsZSB3YW50IHRvIHVzZSB0aGVtLgotCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJLy8gdGhlIHRydXRoIGlzIG1vc3QgcGVvcGxlIHdhbnQgdGhlc2UuIFNvIHdlIHdpbGwgYWRkIHRoZW0gaW4uIEJ1dCBzaW5jZSB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIGl0Ci0JCS8vIGdldHMgY29uZnVzaW5nLiBXZSBuZWVkIHRvIGxvb2sgZm9yIGR1cHMgZnJvbSB0aGUgc3VwZXIgdHlwZXMuCi0JCS8vCi0JCS8vIFN1cGVydHlwZXMgd2lsbCBuZXZlciBiZSBtb3JlIHRoYW4gb25lIGVudHJ5IGZvciBjbGFzc2VzLCBpdCBpcyBwb3NzaWJsZSB0byBiZSAwLCAxLCAyIG9yIG1vcmUgZm9yIGludGVyZmFjZXMuCi0JCVNldCBzdXBlcnMgPSBuZXcgSGFzaFNldCg1MCk7Ci0JCUJlYW5EZWNvcmF0b3IgYmQgPSBVdGlsaXRpZXMuZ2V0QmVhbkRlY29yYXRvcihnZXRKYXZhQ2xhc3MoKSk7Ci0JCWlmIChiZCA9PSBudWxsIHx8IGJkLmlzTWVyZ2VTdXBlckV2ZW50cygpKSB7Ci0JCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJaWYgKCFzdXBlclR5cGVzLmlzRW1wdHkoKSkgewotCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxsZW5TVDsgaSsrKSB7Ci0JCQkJCUxpc3Qgc3VwZXJBbGwgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbEV2ZW50cygpOwotCQkJCQlpbnQgbGVuID0gc3VwZXJBbGwuc2l6ZSgpOwotCQkJCQlmb3IgKGludCBpMT0wOyBpMTxsZW47IGkxKyspIHsKLQkJCQkJCUphdmFFdmVudCBzZSA9IChKYXZhRXZlbnQpIHN1cGVyQWxsLmdldChpMSk7Ci0JCQkJCQlzdXBlcnMuYWRkKHNlLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlIYXNoTWFwIGV2ZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWV2ZW50TGlzdGVuZXJDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YS51dGlsLkV2ZW50TGlzdGVuZXIiLCBnZXRKYXZhQ2xhc3MoKSk7IC8vIEluaXRpYWxpemUsIG5lZWRlZCBmb3IgYnVpbGRpbmcgZXZlbnRpbmZvcy4gLy8kTk9OLU5MUy0xJAotCQl0b29NYW55RXhjZXB0aW9uQ2xhc3MgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmEudXRpbC5Ub29NYW55TGlzdGVuZXJzRXhjZXB0aW9uIiwgZ2V0SmF2YUNsYXNzKCkpOyAvLyBJbml0aWFsaXplLCBuZWVkZWQgZm9yIGJ1aWxkaW5nIGV2ZW50aW5mb3MuIC8vJE5PTi1OTFMtMSQKLQkJSXRlcmF0b3IgaXRyID0gZ2V0SmF2YUNsYXNzKCkuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlNZXRob2QgbXRoZCA9IChNZXRob2QpIGl0ci5uZXh0KCk7Ci0JCQlpZiAobXRoZC5pc1N0YXRpYygpIHx8IG10aGQuaXNDb25zdHJ1Y3RvcigpKQotCQkJCWNvbnRpbnVlOyAvLyBTdGF0aWNzL2NvbnN0cnVjdG9ycyBkb24ndCBwYXJ0aWNpcGF0ZSBpbiBldmVudHMuCi0JCQlTdHJpbmcga2V5ID0gdmFsaWRFdmVudEFkZGVyKG10aGQpOwotCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJRXZlbnRJbmZvIGV2ZW50SW5mbyA9IChFdmVudEluZm8pIGV2ZW50cy5nZXQoa2V5KTsKLQkJCQlpZiAoZXZlbnRJbmZvID09IG51bGwpIHsKLQkJCQkJZXZlbnRJbmZvID0gbmV3IEV2ZW50SW5mbygpOwotCQkJCQlldmVudEluZm8uc2V0QWRkZXIobXRoZCk7Ci0JCQkJCWV2ZW50cy5wdXQoa2V5LCBldmVudEluZm8pOwotCQkJCX0gZWxzZQotCQkJCQlldmVudEluZm8uc2V0QWRkZXIobXRoZCk7Ci0JCQl9IGVsc2UgewotCQkJCWtleSA9IHZhbGlkRXZlbnRSZW1vdmUobXRoZCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJCUV2ZW50SW5mbyBldmVudEluZm8gPSAoRXZlbnRJbmZvKSBldmVudHMuZ2V0KGtleSk7Ci0JCQkJCWlmIChldmVudEluZm8gPT0gbnVsbCkgewotCQkJCQkJZXZlbnRJbmZvID0gbmV3IEV2ZW50SW5mbygpOwotCQkJCQkJZXZlbnRJbmZvLnNldFJlbW92ZXIobXRoZCk7Ci0JCQkJCQlldmVudHMucHV0KGtleSwgZXZlbnRJbmZvKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlldmVudEluZm8uc2V0UmVtb3ZlcihtdGhkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlldmVudExpc3RlbmVyQ2xhc3MgPSBudWxsOyAvLyBObyBsb25nZXIgbmVlZCBpdC4KLQotCQkvLyBOb3cgYWN0dWFsbHkgY3JlYXRlIHRoZSBldmVudHMuCi0JCUhhc2hTZXQgZXZlbnROYW1lcyA9IG5ldyBIYXNoU2V0KGV2ZW50cy5zaXplKCkpOyAvLyBTZXQgb2YgZm91bmQgZXZlbnQgbmFtZXMsIHRvIHByZXZlbnQgZHVwbGljYXRlcwotCQlJdGVyYXRvciBldnRJdHIgPSBldmVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZXZ0SXRyLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGV2ZW50TWFwID0gKE1hcC5FbnRyeSkgZXZ0SXRyLm5leHQoKTsKLQkJCUV2ZW50SW5mbyBlaSA9IChFdmVudEluZm8pIGV2ZW50TWFwLmdldFZhbHVlKCk7Ci0JCQlpZiAoZWkuaXNWYWxpZEluZm8oKSkgewotCQkJCVN0cmluZyBldmVudE5hbWUgPSBnZXRFdmVudE5hbWUoKFN0cmluZykgZXZlbnRNYXAuZ2V0S2V5KCkpOwotCQkJCWlmIChldmVudE5hbWVzLmNvbnRhaW5zKGV2ZW50TmFtZSkpCi0JCQkJCWNvbnRpbnVlOwkvLyBBbGVhZHkgY3JlYXRlZCBpdC4gKE5vdGU6IEludHJvc3BlY3RvciBhY3R1YWxseSB0YWtlcyBsYXN0IG9uZSBvdmVyIHByZXZpb3VzIGR1cHMsIGJ1dCB0aGUgb3JkZXIgaXMgdG90YWxseSB1bmRlZmluZWQsIHNvIGNob29zaW5nIGZpcnN0IGlzIGp1c3QgYXMgZ29vZCBvciBiYWQuCi0KLQkJCQlpZiAoc3VwZXJzLmNvbnRhaW5zKGV2ZW50TmFtZSkpCi0JCQkJCWNvbnRpbnVlOyAvLyBEb24ndCBvdmVycmlkZSBhIHN1cGVyIGV2ZW50LgotCi0JCQkJaWYgKGVpLmNyZWF0ZUV2ZW50KGV2ZW50TmFtZSkpCi0JCQkJCWV2ZW50TmFtZXMuYWRkKGV2ZW50TmFtZSk7IC8vIEl0IHdhcyB2YWxpZGx5IGNyZWF0ZWQuCi0JCQl9Ci0JCX0KLQotCQl0b29NYW55RXhjZXB0aW9uQ2xhc3MgPSBudWxsOyAvLyBObyBsb25nZXIgbmVlZCBpdC4KLQl9Ci0KLQkvKioKLQkgKiBtZXJnZSBhbGwgdGhlIEV2ZW50cyAoaS5lLiBzdXBlcnR5cGVzKQotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhbGxFdmVudHMoKSB7Ci0KLQkJRUxpc3QgamNBbGxFdmVudHMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRBbGxFdmVudHNHZW4oKTsKLQkJQmVhbmluZm9TdXBlckFkYXB0ZXIgc3VwZXJBZGFwdGVyID0KLQkJCShCZWFuaW5mb1N1cGVyQWRhcHRlcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKGdldEphdmFDbGFzcygpLCBCZWFuaW5mb1N1cGVyQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChqY0FsbEV2ZW50cyAhPSBudWxsKSB7Ci0JCQkvLyBTZWUgaWYgbmV3IG9uZSByZXF1aXJlZC4KLQkJCWlmIChzdXBlckFkYXB0ZXIgPT0gbnVsbCB8fCAhc3VwZXJBZGFwdGVyLmlzQWxsRXZlbnRzQ29sbGVjdGlvbk1vZGlmaWVkKCkpCi0JCQkJcmV0dXJuIGpjQWxsRXZlbnRzOwotCQkJLy8gQ2FuJ3QgZ2V0IHN1cGVyYWRhcHRlciwgc28gbXVzdCBub3QgYmUgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgc28gcmV0dXJuIGN1cnJlbnQgbGlzdC4gT3Igbm8gY2hhbmdlIHJlcXVpcmVkLiAgICAgICAJCQotCQl9Ci0KLQkJVW5pcXVlRUxpc3QuRmFzdENvbXBhcmUgYWxsRXZlbnRzID0gbmV3IFVuaXF1ZUVMaXN0LkZhc3RDb21wYXJlKCkgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICogCi0JCQkgKiBAc2luY2UgMS4xLjAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBPYmplY3RbXSBuZXdEYXRhKGludCBjYXBhY2l0eSkgewotCQkJCXJldHVybiBuZXcgSmF2YUV2ZW50W2NhcGFjaXR5XTsKLQkJCX0KLQkJfTsKLQkJCi0JCWJvb2xlYW4gZG9BbGxFdmVudHMgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCS8vIElmIHdlIGFyZSBpbnRyb3NwZWN0aW5nLCBkb24ndCBkbyBhbGwgcHJvcGVydGllcyBiZWNhdXNlIGl0IGlzIGFuIGludmFsaWQgbGlzdC4gSnVzdCByZXR1cm4gZW1wdHkgd2l0aG91dCByZXNldGluZyB0aGUgYWxsIG1vZGlmaWVkIGZsYWcuCi0JCQlkb0FsbEV2ZW50cyA9ICFpc0RvaW5nQWxsRXZlbnRzICYmICFpc0ludHJvc3BlY3RpbmcgJiYgaXNSZXNvdXJjZUNvbm5lY3RlZCgpOwotCQkJaWYgKGRvQWxsRXZlbnRzKQotCQkJCWlzRG9pbmdBbGxFdmVudHMgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGRvQWxsRXZlbnRzKSB7Ci0JCQl0cnkgewotCQkJCUVMaXN0IGxvY2FsRXZlbnRzID0gZ2V0SmF2YUNsYXNzKCkuZ2V0RXZlbnRzKCk7Ci0JCQkJLy8gS2x1ZGdlOiBCZWFuSW5mbyBzcGVjIGRvZXNuJ3QgYWRkcmVzcyBJbnRlcmZhY2VzLCBidXQgc29tZSBwZW9wbGUgd2FudCB0byB1c2UgdGhlbS4KLQkJCQkvLyBJbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuZHMsIHdoaWxlIHRoZSBJbnRyb3NwZWN0b3IgaWdub3JlcyB0aGVzZSBmb3IgcmVmbGVjdGlvbiwKLQkJCQkvLyB0aGUgdHJ1dGggaXMgbW9zdCBwZW9wbGUgd2FudCB0aGVzZS4gU28gd2Ugd2lsbCBhZGQgdGhlbSBpbi4gQnV0IHNpbmNlIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgaXQKLQkJCQkvLyBnZXRzIGNvbmZ1c2luZy4gV2UgbmVlZCB0byBsb29rIGZvciBkdXBzIGZyb20gdGhlIHN1cGVyIHR5cGVzIGFuZCBzdGlsbCBrZWVwIG9yZGVyLgotCQkJCS8vCi0JCQkJLy8gU3VwZXJ0eXBlcyB3aWxsIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUgZW50cnkgZm9yIGNsYXNzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJlIDAsIDEsIDIgb3IgbW9yZSBmb3IgaW50ZXJmYWNlcy4KLQkJCQlMaXN0IHN1cGVyVHlwZXMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRFU3VwZXJUeXBlcygpOwotCQkJCWlmICghc3VwZXJUeXBlcy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gTm93IHdlIG5lZWQgdG8gbWVyZ2UgaW4gdGhlIHN1cGVycy4KLQkJCQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKGdldEphdmFDbGFzcygpKTsKLQkJCQkJLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgc3VwZXJ0eXBlLCB3ZSBjYW4gYWRkIHRvIHRoZSBhY3R1YWwgZXZlbnRzLCBlbHNlIHdlIHdpbGwgdXNlIHRoZSBsaW5rZWQgaGFzaHNldCBzbyB0aGF0Ci0JCQkJCS8vIHdlIGRvbid0IGFkZCBwb3NzaWJsZSBkdXBsaWNhdGVzIChlLmcuIElBIGV4dGVuZHMgSUIsSUMgYW5kIElCIGV4dGVuZHMgSUMuIEluIHRoaXMgY2FzZSB0aGVyZSB3b3VsZCBiZSBkdXBzCi0JCQkJCS8vIGJlY2F1c2UgSUIgd291bGQgY29udHJpYnV0ZSBJQydzIHRvbykuCi0JCQkJCUNvbGxlY3Rpb24gd29ya2luZ0FsbEV2ZW50cyA9IHN1cGVyVHlwZXMuc2l6ZSgpID09IDEgPyAoQ29sbGVjdGlvbikgYWxsRXZlbnRzIDogbmV3IExpbmtlZEhhc2hTZXQoKTsgCi0JCQkJCS8vIFdlIHdpbGwgbm93IG1lcmdlIGFzIGRpcmVjdGVkLgotCQkJCQlib29sZWFuIG1lcmdlQWxsID0gYmQgPT0gbnVsbCB8fCBiZC5pc01lcmdlU3VwZXJFdmVudHMoKTsKLQkJCQkJaWYgKCFtZXJnZUFsbCkgewotCQkJCQkJLy8gd2UgZG9uJ3QgdG8gd2FudCB0byBtZXJnZSBzdXBlciBldmVudHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHN1cGVyIG5vbi1ldmVudHMgb3IgZXhwbGljaXQgb25lcy4KLQkJCQkJCWludCBsZW5TVCA9IHN1cGVyVHlwZXMuc2l6ZSgpOwotCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQlMaXN0IHN1cGVycyA9ICgoSmF2YUNsYXNzKSBzdXBlclR5cGVzLmdldChpKSkuZ2V0QWxsRXZlbnRzKCk7Ci0JCQkJCQkJaW50IGxlbiA9IHN1cGVycy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGxlbjsgaTErKykgewotCQkJCQkJCQlKYXZhRXZlbnQgZSA9IChKYXZhRXZlbnQpIHN1cGVycy5nZXQoaTEpOwotCQkJCQkJCQlFdmVudFNldERlY29yYXRvciBlZCA9IFV0aWxpdGllcy5nZXRFdmVudFNldERlY29yYXRvcihlKTsKLQkJCQkJCQkJaWYgKGVkID09IG51bGwgfHwgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJCQkJCQl3b3JraW5nQWxsRXZlbnRzLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSB3YW50IHRvIG1lcmdlIGFsbC4JCQkJCQotCQkJCQkJLy8gQmVhbkluZm8gaGFzIGdpdmVuIHVzIHRoZSBub3QgbWVyZ2UgbGlzdC4gSWYgdGhlIGxpc3QgaXMgZW1wdHksIHRoZW4gd2UgYWNjZXB0IGFsbC4KLQkJCQkJCWlmIChiZCAhPSBudWxsICYmIGJkLmVJc1NldChCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkRXZlbnROYW1lcygpKSkgewotCQkJCQkJCS8vIFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzLgotCQkJCQkJCS8vIEdldCB0aGUgbmFtZXMgaW50byBhIHNldCB0byBjcmVhdGUgYSBxdWljayBsb29rdXAuCi0JCQkJCQkJSGFzaFNldCBzdXBlclNldCA9IG5ldyBIYXNoU2V0KGJkLmdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gTm93IHdhbGsgYW5kIGFkZCBpbiBub24tYmVhbiBldmVudHMgKGFuZCBiZWFuIGV2ZW50cyB0aGF0IHdlcmUgZXhwbGljaXRseSBhZGRlZCBhbmQgbm90IG1lcmdlYWJsZSAoaS5lLiBkaWRuJ3QgY29tZSB0aHJ1IGJlYW5pbmZvKSkgCi0JCQkJCQkJLy8gYW5kIGFkZCB0aG9zZSBub3Qgc3BlY2lmaWNhbGx5IGNhbGxlZCBvdXQgYnkgQmVhbkluZm8uCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJTGlzdCBzdXBlcnMgPSAoKEphdmFDbGFzcykgc3VwZXJUeXBlcy5nZXQoaSkpLmdldEFsbEV2ZW50cygpOwotCQkJCQkJCQlpbnQgbGVuID0gc3VwZXJzLnNpemUoKTsKLQkJCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGxlbjsgaTErKykgewotCQkJCQkJCQkJSmF2YUV2ZW50IGUgPSAoSmF2YUV2ZW50KSBzdXBlcnMuZ2V0KGkxKTsKLQkJCQkJCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGUpOwotCQkJCQkJCQkJaWYgKGVkID09IG51bGwgfHwgKGVkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhZWQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkgfHwgIXN1cGVyU2V0LmNvbnRhaW5zKGVkLmdldE5hbWUoKSkpCi0JCQkJCQkJCQkJd29ya2luZ0FsbEV2ZW50cy5hZGQoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEJlYW5JbmZvIGNhbGxlZCBvdXQgdGhhdCBhbGwgc3VwZXIgZXZlbnRzIHNob3VsZCBiZSBhZGRlZCwgb3Igbm8gYmVhbmluZm8uCi0JCQkJCQkJaW50IGxlblNUID0gc3VwZXJUeXBlcy5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaT0wOyBpPGxlblNUOyBpKyspIHsKLQkJCQkJCQkJd29ya2luZ0FsbEV2ZW50cy5hZGRBbGwoKChKYXZhQ2xhc3MpIHN1cGVyVHlwZXMuZ2V0KGkpKS5nZXRBbGxFdmVudHMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3b3JraW5nQWxsRXZlbnRzICE9IGFsbEV2ZW50cykKLQkJCQkJCWFsbEV2ZW50cy5hZGRBbGwod29ya2luZ0FsbEV2ZW50cyk7CS8vIE5vdyBjb3B5IG92ZXIgdGhlIG9yZGVyZWQgc3VwZXIgZXZlbnRzLgotCQkJCX0KLQkJCQlhbGxFdmVudHMuYWRkQWxsKGxvY2FsRXZlbnRzKTsJCQkJCi0JCQkJc3VwZXJBZGFwdGVyLnNldEFsbEV2ZW50c0NvbGxlY3Rpb25Nb2RpZmllZChmYWxzZSk7IC8vIE5vdyBidWlsdCwgc28gcmVzZXQgdG8gbm90IGNoYW5nZWQuCi0JCQl9IGZpbmFsbHkgewotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlpc0RvaW5nQWxsRXZlbnRzID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGFsbEV2ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gRUNvbGxlY3Rpb25zLkVNUFRZX0VMSVNUOwotCQllbHNlIHsKLQkJCWFsbEV2ZW50cy5zaHJpbmsoKTsKLQkJCXJldHVybiBuZXcgRWNvcmVFTGlzdC5Vbm1vZGlmaWFibGVFTGlzdC5GYXN0Q29tcGFyZSgKLQkJCQlnZXRKYXZhQ2xhc3MoKSwKLQkJCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpLAotCQkJCWFsbEV2ZW50cy5zaXplKCksCi0JCQkJYWxsRXZlbnRzLmRhdGEoKSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgSmF2YUNsYXNzIGV2ZW50TGlzdGVuZXJDbGFzcywgLy8gRXZlbnQgTGlzdGVuZXIgY2xhc3MuIE5lZWRlZCBmb3IgdmFsaWRhdGlvbi4KLQl0b29NYW55RXhjZXB0aW9uQ2xhc3M7IC8vIFRvbyBtYW55IGxpc3RlbmVycyBleGNlcHRpb24uCi0KLQkvKgotCSAqIFBhc3MgaW4gdGhlIGtleSwgaXQgd2lsbCBiZSB1c2VkIHRvIGZvcm0gdGhlIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFdmVudE5hbWUoU3RyaW5nIGtleSkgewotCQlyZXR1cm4ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignOicpKTsKLQl9Ci0KLQkvKgkKLQkgKiBBbnN3ZXJzIGV2ZW50IGtleSBpZiB2YWxpZCwgbnVsbCBpZiBub3QgdmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZEV2ZW50QWRkZXIoTWV0aG9kIG1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JCWlmICghbmFtZS5zdGFydHNXaXRoKCJhZGQiKSB8fCAhbmFtZS5lbmRzV2l0aCgiTGlzdGVuZXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gbnVsbDsgLy8gTm90IHZhbGlkIGZvcm1hdCBmb3IgYW4gYWRkIGxpc3RlbmVyIG5hbWUuCi0KLQkJTGlzdCBwYXJtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWlmIChwYXJtcy5zaXplKCkgIT0gMSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnZhbGlkIC0gaW1wcm9wZXIgbnVtYmVyIG9mIHBhcm1zLgotCi0JCUVDbGFzc2lmaWVyIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlpZiAocmV0dXJuVHlwZSA9PSBudWxsIHx8ICFyZXR1cm5UeXBlLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7IC8vIEludmFsaWQgLSBtdXN0IGJlIHZvaWQgcmV0dXJuIHR5cGUuCi0KLQkJRUNsYXNzaWZpZXIgcGFybVR5cGUgPSAoKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldCgwKSkuZ2V0RVR5cGUoKTsKLQkJaWYgKCFCZWFuaW5mb0NsYXNzQWRhcHRlci50aGlzLmV2ZW50TGlzdGVuZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcm1UeXBlKSkKLQkJCXJldHVybiBudWxsOyAvLyBQYXJtIG11c3QgYmUgaW5oZXJpdCBmcm9tIEV2ZW50TGlzdGVuZXIKLQotCQkvLyBUaGlzIGlzIGEgdW5pcXVlIGNvbnRhaW5pbmcgZXZlbnQgbmFtZSBhbmQgbGlzdGVuZXIgdHlwZQotCQkvLyBUaGlzIGlzIHNvIHdlIGNhbiBoYXZlIGEgdW5pcXVlIGtleSBmb3IgdHdvIGV2ZW50cyB3aXRoIHRoZSBzYW1lCi0JCS8vIG5hbWUgYnV0IGRpZmZlcmVudCBsaXN0ZW5lciB0eXBlLiAoVGhpcyBtYXRjaGVzIEludHJvc3BlY3RvciBzbyB0aGF0IHdlIGFyZW4ndAotCQkvLyBjb21pbmcgdXAgd2l0aCBkaWZmZXJlbnQgcmVzdWx0cy4KLQkJcmV0dXJuIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygzLCBuYW1lLmxlbmd0aCgpIC0gOCkpCi0JCQkrICc6JwotCQkJKyAoKEphdmFIZWxwZXJzKSBwYXJtVHlwZSkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qCi0JICogQW5zd2VycyBldmVudCBrZXkgaWYgdmFsaWQsIG51bGwgaWYgbm90IHZhbGlkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRFdmVudFJlbW92ZShNZXRob2QgbWV0aG9kKSB7Ci0JCVN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQkJaWYgKCFuYW1lLnN0YXJ0c1dpdGgoInJlbW92ZSIpIHx8ICFuYW1lLmVuZHNXaXRoKCJMaXN0ZW5lciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBudWxsOyAvLyBOb3QgdmFsaWQgZm9ybWF0IGZvciBhIHJlbW92ZSBsaXN0ZW5lciBuYW1lLgotCi0JCUxpc3QgcGFybXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQlpZiAocGFybXMuc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm4gbnVsbDsgLy8gSW52YWxpZCAtIGltcHJvcGVyIG51bWJlciBvZiBwYXJtcy4KLQotCQlFQ2xhc3NpZmllciByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJaWYgKHJldHVyblR5cGUgPT0gbnVsbCB8fCAhcmV0dXJuVHlwZS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOyAvLyBJbnZhbGlkIC0gbXVzdCBiZSB2b2lkIHJldHVybiB0eXBlLgotCi0JCUVDbGFzc2lmaWVyIHBhcm1UeXBlID0gKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCkpLmdldEVUeXBlKCk7Ci0JCWlmICghQmVhbmluZm9DbGFzc0FkYXB0ZXIudGhpcy5ldmVudExpc3RlbmVyQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJtVHlwZSkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gUGFybSBtdXN0IGJlIGluaGVyaXQgZnJvbSBFdmVudExpc3RlbmVyCi0KLQkJLy8gVGhpcyBpcyBhIHVuaXF1ZSBjb250YWluaW5nIGV2ZW50IG5hbWUgYW5kIGxpc3RlbmVyIHR5cGUKLQkJLy8gVGhpcyBpcyBzbyB3ZSBjYW4gaGF2ZSBhIHVuaXF1ZSBrZXkgZm9yIHR3byBldmVudHMgd2l0aCB0aGUgc2FtZQotCQkvLyBuYW1lIGJ1dCBkaWZmZXJlbnQgbGlzdGVuZXIgdHlwZS4gKFRoaXMgbWF0Y2hlcyBJbnRyb3NwZWN0b3Igc28gdGhhdCB3ZSBhcmVuJ3QKLQkJLy8gY29taW5nIHVwIHdpdGggZGlmZmVyZW50IHJlc3VsdHMpLgotCQlyZXR1cm4gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDYsIG5hbWUubGVuZ3RoKCkgLSA4KSkKLQkJCSsgJzonCi0JCQkrICgoSmF2YUhlbHBlcnMpIHBhcm1UeXBlKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Qm91bmQoKSB7Ci0JCWlmIChkZWZhdWx0Qm91bmQgPT0gbnVsbCkgewotCQkJLy8gSGF2ZW4ndCB5ZXQgZGVjaWRlZCBvbiBpdC4KLQkJCUl0ZXJhdG9yIG1ldGhvZHMgPSBnZXRKYXZhQ2xhc3MoKS5nZXRQdWJsaWNNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJCWJvb2xlYW4gZm91bmRBZGQgPSBmYWxzZSwgZm91bmRSZW1vdmUgPSBmYWxzZTsKLQkJCXdoaWxlIChtZXRob2RzLmhhc05leHQoKSAmJiAoIWZvdW5kQWRkIHx8ICFmb3VuZFJlbW92ZSkpIHsKLQkJCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5uZXh0KCk7Ci0JCQkJaWYgKCJhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIi5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlMaXN0IHBhcm1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJCQkJaWYgKHBhcm1zLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSAoSmF2YVBhcmFtZXRlcikgcGFybXMuZ2V0KDApOwotCQkJCQkJaWYgKCJqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLmVxdWFscygoKEphdmFIZWxwZXJzKSBwYXJtLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWZvdW5kQWRkID0gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoInJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUxpc3QgcGFybXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQkJCQlpZiAocGFybXMuc2l6ZSgpID09IDEpIHsKLQkJCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCk7Ci0JCQkJCQlpZiAoImphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciIuZXF1YWxzKCgoSmF2YUhlbHBlcnMpIHBhcm0uZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZm91bmRSZW1vdmUgPSB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlkZWZhdWx0Qm91bmQgPSAoZm91bmRBZGQgJiYgZm91bmRSZW1vdmUpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEJvdW5kLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRXZlbnRJbmZvIHsKLQkJCi0JCXB1YmxpYyBNZXRob2QgYWRkTGlzdGVuZXJNZXRob2Q7Ci0JCXB1YmxpYyBNZXRob2QgcmVtb3ZlTGlzdGVuZXJNZXRob2Q7Ci0KLQkJcHVibGljIHZvaWQgc2V0QWRkZXIoTWV0aG9kIGFkZE1ldGhvZCkgewotCQkJYWRkTGlzdGVuZXJNZXRob2QgPSBhZGRNZXRob2Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRSZW1vdmVyKE1ldGhvZCByZW1vdmVNZXRob2QpIHsKLQkJCXJlbW92ZUxpc3RlbmVyTWV0aG9kID0gcmVtb3ZlTWV0aG9kOwotCQl9Ci0KLQkJLy8gQW5zd2VyIHdoZXRoZXIgdGhpcyBpcyBhIHZhbGlkIGV2ZW50IGluZm8uCi0JCXB1YmxpYyBib29sZWFuIGlzVmFsaWRJbmZvKCkgewotCQkJcmV0dXJuIChhZGRMaXN0ZW5lck1ldGhvZCAhPSBudWxsICYmIHJlbW92ZUxpc3RlbmVyTWV0aG9kICE9IG51bGwpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY3JlYXRlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkID0gQmVhbmluZm9DbGFzc0FkYXB0ZXIudGhpcy5jcmVhdGVFdmVudChuYW1lKTsKLQkJCWlmIChlZCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gUmVmbGVjdGlvbiBub3Qgd2FudGVkLgotCi0KLQkJCS8vIFNlZSBpZiB1bmljYXN0LgotCQkJYm9vbGVhbiB1bmljYXN0ID0gZmFsc2U7Ci0JCQlMaXN0IGV4Y2VwdGlvbnMgPSBhZGRMaXN0ZW5lck1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQkJaW50IGxlbiA9IGV4Y2VwdGlvbnMuc2l6ZSgpOwotCQkJZm9yKGludCBpPTA7IGk8bGVuOyBpKyspIHsKLQkJCQlpZiAoZXhjZXB0aW9ucy5nZXQoaSkgPT0gQmVhbmluZm9DbGFzc0FkYXB0ZXIudGhpcy50b29NYW55RXhjZXB0aW9uQ2xhc3MpIHsKLQkJCQkJdW5pY2FzdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vIFdlJ2xsIGxldCBsaXN0ZW5lciBtZXRob2RzIGdldCByZXRyaWV2ZWQgZHluYW1pY2FsbHkgd2hlbiBuZWVkZWQuCi0JCQlCZWFuSW5mb0RlY29yYXRvclV0aWxpdHkuc2V0UHJvcGVydGllcyhlZCwgYWRkTGlzdGVuZXJNZXRob2QsIHJlbW92ZUxpc3RlbmVyTWV0aG9kLCB1bmljYXN0LCAoSmF2YUNsYXNzKSAoKEphdmFQYXJhbWV0ZXIpIGFkZExpc3RlbmVyTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpLmdldEVUeXBlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE1hcmggdGhlIGZhY3RvcnkgYXMgc3RhbGUsIGJ1dCBsZWF2ZSB0aGUgb3ZlcnJpZGVzIGFsb25lLiBUaGV5IGFyZSBub3Qgc3RhbGUuCi0JICogQHBhcmFtIHN0YWxlCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrU3RhbGVGYWN0b3J5KFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YWxlKSB7Ci0JCW1hcmtTdGFsZUZhY3Rvcnkoc3RhbGUsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogTWFyayB0aGlzIGZhY3RvcnkgYXMgdGhlIHN0YWxlIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGNsZWFyT3ZlcnJpZGRlcyBjbGVhciB0aGUgb3ZlcnJpZGVzIHRvby4gVGhleSBhcmUgc3RhbGUuCi0JICovCi0JcHVibGljIHZvaWQgbWFya1N0YWxlRmFjdG9yeShQcm94eUZhY3RvcnlSZWdpc3RyeSBzdGFsZSwgYm9vbGVhbiBjbGVhck92ZXJyaWRkZXMpIHsKLQkJaWYgKHN0YWxlRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkvLyBJdCdzIG5vdCBzdGFsZSBzbyBtYWtlIGl0IHN0YWxlLgotCQkJLy8gU28gdGhhdCBuZXh0IGFjY2VzcyB3aWxsIHJlLWludHJvc3BlY3QKLQkJCWRlZmF1bHRCb3VuZCA9IG51bGw7IC8vIFNvIHF1ZXJ5IG9uIG5leHQgcmVxdWVzdC4KLQkJCXN0YWxlRmFjdG9yeSA9IG5ldyBXZWFrUmVmZXJlbmNlKHN0YWxlKTsKLQotCQkJLy8gTmVlZCB0byBtYXJrIHRoZSBlc3VwZXJhZGFwdGVyIHRoYXQgdGhpbmdzIGhhdmUgY2hhbmdlZCBzbyB0aGF0IGFueSAKLQkJCS8vIHN1YnR5cGUgd2lsbCBrbm93IHRvIHJldXNlIHRoZSBwYXJlbnQgZm9yIGFueXRoaW5nIHRoYXQgcmVxdWlyZXMga25vd2luZyBwYXJlbnQgaW5mby4KLQkJCUFkYXB0ZXIgYSA9IEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZ2V0VGFyZ2V0KCksIEVTdXBlckFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gU2ltdWxhdGUgdGhhdCB0aGlzIG9iamVjdHMgc3VwZXIgaGFzIGNoYW5nZWQuIFRoaXMgd2lsbCBtYWtlIGFsbCBzdWJjbGFzc2VzCi0JCQkvLyB0aGluayBhYm91dCB0aGUgc3VwZXIgaGFzIGNoYW5nZWQgYW5kIG5leHQgcmV0cmlldmluZyBhbnl0aGluZyB0aGF0IGludm9sdmVzIHRoZQotCQkJLy8gc3VwZXIgd2lsbCBjYXVzZSBhIHJlYnVpbGQgdG8gb2NjdXIuCi0JCQlOb3RpZmljYXRpb24gbm90ZSA9Ci0JCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIGdldFRhcmdldCgpLCBOb3RpZmljYXRpb24uU0VULCBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1VQRVJfVFlQRVMsIG51bGwsIG51bGwpOwotCQkJaWYgKGEgIT0gbnVsbCkKLQkJCQlhLm5vdGlmeUNoYW5nZWQobm90ZSk7Ci0JCQkvLyBEbyB0aGUgc2FtZSB3aXRoIEJlYW5pbmZvU3VwZXJBZGFwdGVyIHNvIHRoYXQgZXZlbnRzIGFsc28gd2lsbCBiZSByZWJ1aWx0LgotCQkJYSA9IEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZ2V0VGFyZ2V0KCksIEJlYW5pbmZvU3VwZXJBZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCWlmIChhICE9IG51bGwpCi0JCQkJYS5ub3RpZnlDaGFuZ2VkKG5vdGUpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJbmVlZHNJbnRyb3NwZWN0aW9uID0gdHJ1ZTsKLQkJCQlpZiAoY2xlYXJPdmVycmlkZGVzKSB7Ci0JCQkJCXJldHJpZXZlZEV4dGVuc2lvbkRvY3VtZW50ID0gQ0xFQVJfRVhURU5TSU9OUzsKLQkJCQkJaWYgKGNsYXNzRW50cnkgIT0gbnVsbCkgewotCQkJCQkJY2xhc3NFbnRyeS5tYXJrRGVsZXRlZCgpOwotCQkJCQkJY2xhc3NFbnRyeSA9IG51bGw7IC8vIEdldCBhIG5ldyBvbmUgbmV4dCB0aW1lLgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9ybSBhIGxvbmduYW1lIGZvciB0aGUgYWRka2V5IGZ1bmN0aW9uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZvcm1Mb25nTmFtZShFT3BlcmF0aW9uIGZlYXR1cmUpIHsKLQkJTWV0aG9kIG10aGQgPSBudWxsOwotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE1ldGhvZCkKLQkJCW10aGQgPSAoTWV0aG9kKSBmZWF0dXJlOwotCQllbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWV0aG9kUHJveHkpCi0JCQltdGhkID0gKChNZXRob2RQcm94eSkgZmVhdHVyZSkuZ2V0TWV0aG9kKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOyAvLyBEb24ndCBrbm93IHdoYXQgaXQgaXMuCi0KLQkJU3RyaW5nQnVmZmVyIGxvbmdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQlsb25nTmFtZS5hcHBlbmQoZmVhdHVyZS5nZXROYW1lKCkpOyAvLyBGZWF0dXJlIE5hbWUKLQkJbG9uZ05hbWUuYXBwZW5kKCc6Jyk7Ci0JCWxvbmdOYW1lLmFwcGVuZChtdGhkLmdldE5hbWUoKSk7IC8vIE1ldGhvZCBOYW1lCi0JCWxvbmdOYW1lLmFwcGVuZCgnKCcpOwotCQlMaXN0IHAgPSBtdGhkLmdldFBhcmFtZXRlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwLnNpemUoKTsgaSsrKSB7Ci0JCQlKYXZhUGFyYW1ldGVyIHBhcm0gPSAoSmF2YVBhcmFtZXRlcikgcC5nZXQoaSk7Ci0JCQlpZiAoaT4wKQotCQkJCWxvbmdOYW1lLmFwcGVuZCgnLCcpOwotCQkJbG9uZ05hbWUuYXBwZW5kKHBhcm0uZ2V0SmF2YVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGxvbmdOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogTW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gY2FuIGhhdmUgdGhlIHNhbWUgbmFtZS4gVG8gaWRlbnRpZnkgdGhlbSB1bmlxdWVseSwgdGhlIGxvbmcgbmFtZSBpcyBjcmVhdGVkLAotCSAqIHdoaWNoIGlzIGZvcm1lZCBmcm9tIHRoZSBuYW1lIGFuZCB0aGUgbWV0aG9kIHNpZ25hdHVyZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtTG9uZ05hbWUoTWV0aG9kUmVjb3JkIHJlY29yZCkgewotCQlTdHJpbmdCdWZmZXIgbG9uZ05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCWxvbmdOYW1lLmFwcGVuZChyZWNvcmQubmFtZSk7IC8vIEZlYXR1cmUgTmFtZQotCQlsb25nTmFtZS5hcHBlbmQoJzonKTsKLQkJbG9uZ05hbWUuYXBwZW5kKHJlY29yZC5tZXRob2RGb3JEZXNjcmlwdG9yLm1ldGhvZE5hbWUpOyAvLyBNZXRob2QgTmFtZQotCQlsb25nTmFtZS5hcHBlbmQoJygnKTsKLQkJU3RyaW5nW10gcCA9IHJlY29yZC5tZXRob2RGb3JEZXNjcmlwdG9yLnBhcmFtZXRlclR5cGVOYW1lczsKLQkJaWYgKHAgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpPjApCi0JCQkJCWxvbmdOYW1lLmFwcGVuZCgnLCcpOwotCQkJCWxvbmdOYW1lLmFwcGVuZChNYXBKTklUeXBlcy5nZXRGb3JtYWxUeXBlTmFtZShwW2ldKSk7Ci0JCQl9Ci0KLQkJcmV0dXJuIGxvbmdOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gSW4gY2FzZSBvZiByZW1vdmluZyBhZGFwdGVyLCBtYWtlIHN1cmUgd2UgYXJlIGZpcnN0IHJlbW92ZWQgZnJvbSB0aGUgZmFjdG9yeSBzbyBpdCBkb2Vzbid0IGtub3cgYWJvdXQgdXMgYW55bW9yZS4KLQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUikKLQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkucmVtb3ZlQWRhcHRlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpICsgJygnICsgKGdldEphdmFDbGFzcygpICE9IG51bGwgPyBnZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkgOiAiPyIpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzNiOTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzggJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb247Ci0KLS8qKgotICogSmF2YSBSZWZsZWN0aW9uIEtleSBleHRlbnNpb24gdG8gcmV0cmlldmUga2V5cyBmb3IgYmVhbmluZm8gY3JlYXRpb25zLgotICogCi0gKiBIYW5kbGVzIGF0dHJpYnV0ZXMgYW5kIGJlaGF2aW9ycy4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvciBSLiBMLiBLdWxwICAKLSAqLwotcHVibGljIGNsYXNzIEJlYW5pbmZvSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gaW1wbGVtZW50cyBJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gewotCQotCS8vIFRoZSBmb3JtYXQgb2YgdGhlIGtleXMgYXJlOgotCS8vIGJlaGF2aW9yczogICJjbGFzc25hbWUvYmVoYXZpb3IvYmVoYXZpb3JuYW1lIgotCS8vIHN0cnVjdHVyYWwgZmVhdHVyZXM6ICJjbGFzc25hbWUvZmVhdHVyZW5hbWUiCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgCi0JCUJFSEFWSU9SID0gIi9vcGVyYXRpb24vIiwJLy8gUGllY2UgaW4ga2V5IHRoYXQgaW5kaWNhdGVzIHRoaXMgaXMgYSBiZWhhdmlvci4gLy8kTk9OLU5MUy0xJAotCQlFVkVOVCA9ICIvZXZlbnQvIiwJCS8vIFBpZWNlIGluIGtleSB0aGF0IGluZGljYXRlcyB0aGlzIGlzIGFuIGV2ZW50LiAvLyROT04tTkxTLTEkCi0JCUZFQVRVUkUgPSAiLyI7CQkJLy8gUGllY2UgaW4ga2V5IHRoYXQgaW5kaWNhdGVzIHRoaXMgaXMgYW4gYXR0cmlidXRlLiAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgZm9yIHRoaXMga2V5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBrZXksIElKYXZhUmVmbGVjdGlvbktleSByZWZsZWN0aW9uS2V5KSB7Ci0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJaW50IGliZWhhdmUgPSBrZXkuaW5kZXhPZihCRUhBVklPUik7Ci0JCQlpZiAoaWJlaGF2ZSA+IC0xKSB7Ci0JCQkJLy8gV2UgaGF2ZSBhIHBvc3NpYmxlIGJlaGF2aW9yLgotCQkJCVN0cmluZyBjbGFzc25hbWUgPSBrZXkuc3Vic3RyaW5nKDAsIGliZWhhdmUpOwotCQkJCWludCBpYmVoYXZlTmFtZSA9IGliZWhhdmUrQkVIQVZJT1IubGVuZ3RoKCk7Ci0JCQkJaWYgKGliZWhhdmVOYW1lIDwga2V5Lmxlbmd0aCgpKSB7Ci0JCQkJCUphdmFDbGFzcyBqYXZhY2xhc3MgPSBnZXRKYXZhQ2xhc3MocmVmbGVjdGlvbktleSwgY2xhc3NuYW1lKTsKLQkJCQkJaWYgKGphdmFjbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQlqYXZhY2xhc3MuZ2V0RU9wZXJhdGlvbnMoKTsJLy8gR2V0IHRoZSBsaXN0IGludHJvc3BlY3RlZCBhbmQgcG9wdWxhdGVkIGlmIG5vdCBhbHJlYWR5LgotCQkJCQkJcmV0dXJuIHJlZmxlY3Rpb25LZXkucHJpbUdldChrZXkpOwkvLyBJdCBzaG91bGQgbm93IGJlIHRoZXJlLCAKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGlldmVudCA9IGtleS5pbmRleE9mKEVWRU5UKTsKLQkJCQlpZiAoaWV2ZW50ID4gLTEpIHsKLQkJCQkJLy8gV2UgaGF2ZSBhIHBvc3NpYmxlIGV2ZW50LgotCQkJCQlTdHJpbmcgY2xhc3NuYW1lID0ga2V5LnN1YnN0cmluZygwLCBpZXZlbnQpOwotCQkJCQlpbnQgaWV2ZW50TmFtZSA9IGlldmVudCtFVkVOVC5sZW5ndGgoKTsKLQkJCQkJaWYgKGlldmVudE5hbWUgPCBrZXkubGVuZ3RoKCkpIHsKLQkJCQkJCUphdmFDbGFzcyBqYXZhY2xhc3MgPSBnZXRKYXZhQ2xhc3MocmVmbGVjdGlvbktleSwgY2xhc3NuYW1lKTsKLQkJCQkJCWlmIChqYXZhY2xhc3MgIT0gbnVsbCkgewotCQkJCQkJCWphdmFjbGFzcy5nZXRFdmVudHMoKTsJLy8gR2V0IHRoZSBsaXN0IGludHJvc3BlY3RlZCBhbmQgcG9wdWxhdGVkIGlmIG5vdCBhbHJlYWR5LgotCQkJCQkJCXJldHVybiByZWZsZWN0aW9uS2V5LnByaW1HZXQoa2V5KTsJLy8gSXQgc2hvdWxkIG5vdyBiZSB0aGVyZSwgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgaWZlYXR1cmUgPSBrZXkuaW5kZXhPZihGRUFUVVJFKTsKLQkJCQkJaWYgKGlmZWF0dXJlID4gLTEpIHsKLQkJCQkJCS8vIFdlIGhhdmUgYSBwb3NzaWJsZSBmZWF0dXJlLgotCQkJCQkJU3RyaW5nIGNsYXNzbmFtZSA9IGtleS5zdWJzdHJpbmcoMCwgaWZlYXR1cmUpOwotCQkJCQkJaW50IGlmZWF0dXJlTmFtZSA9IGlmZWF0dXJlK0ZFQVRVUkUubGVuZ3RoKCk7Ci0JCQkJCQlpZiAoaWZlYXR1cmVOYW1lIDwga2V5Lmxlbmd0aCgpKSB7Ci0JCQkJCQkJU3RyaW5nIGZlYXR1cmUgPSBrZXkuc3Vic3RyaW5nKGlmZWF0dXJlTmFtZSk7Ci0JCQkJCQkJSmF2YUNsYXNzIGphdmFjbGFzcyA9IGdldEphdmFDbGFzcyhyZWZsZWN0aW9uS2V5LCBjbGFzc25hbWUpOwotCQkJCQkJCWlmIChqYXZhY2xhc3MgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBUaGlzIGlzIGp1c3QgYSBoYWNrIHVudGlsIHdlIGNhbiBnZXQgSUQgc2l0dWF0aW9uIHN0cmFpZ2h0ZW5lZCBvdXQuCi0JCQkJCQkJCS8vIE5lZWQgdG8gY2F1c2UgaW50cm9zcGVjdGlvbiBvZiB0aGUgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcy4KLQkJCQkJCQkJamF2YWNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCQkJCQkJT2JqZWN0IHJlc3VsdCA9IHJlZmxlY3Rpb25LZXkucHJpbUdldChrZXkpOwkvLyBTZWUgaWYgaXQgbm93IGdvdCBhZGRlZCBhcyBhbiBpZC4KLQkJCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkvLyBXZWxsLCBpdCBjb3VsZCBvZiBiZWVuIGFkZGVkIGJ5IHRoZSBkaWZmIG1lcmdlLCB3aGljaCBhcyBvZiBub3cgY2FuJ3QgaGFuZGxlIGlkcy4KLQkJCQkJCQkJCS8vIFNvIHdlIHdpbGwgZmluZCBpdCB3aXRoaW4gdGhlIGF0dHJpYnV0ZXMvcmVmZXJlbmNlcy4KLQkJCQkJCQkJCXJlc3VsdCA9IGZpbmRGZWF0dXJlKGZlYXR1cmUsIGphdmFjbGFzcy5nZXRFUmVmZXJlbmNlcygpKTsKLQkJCQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCQkJCQlyZXN1bHQgPSBmaW5kRmVhdHVyZShmZWF0dXJlLCBqYXZhY2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKSk7CQkJCQkJCQkJCi0JCQkJCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQkJCQkJCQkJLy8gTmVlZCB0byBhZGQgaXQgYXMgYW4gaWQgc28gbmV4dCB0aW1lIHdvbid0IGNvbWUgdGhyb3VnaCBoZXJlLgotCQkJCQkJCQkJCSgoWE1JUmVzb3VyY2UpIGphdmFjbGFzcy5lUmVzb3VyY2UoKSkuc2V0SUQoKEVPYmplY3QpIHJlc3VsdCwga2V5KTsJLy8gU28gbmV4dCB0aW1lIGl0IHdpbGwgZmluZCBpdCBkaXJlY3RseS4KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZpbmRGZWF0dXJlKFN0cmluZyBmZWF0dXJlTmFtZSwgTGlzdCBmZWF0dXJlTGlzdCkgewotCQlJdGVyYXRvciBpdHIgPSBmZWF0dXJlTGlzdC5pdGVyYXRvcigpOwkJCi0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZU5hbWUuZXF1YWxzKGZlYXR1cmUuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiBmZWF0dXJlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKElKYXZhUmVmbGVjdGlvbktleSByZWZsZWN0aW9uS2V5LCBTdHJpbmcgY2xhc3NuYW1lKSB7Ci0JCU9iamVjdCBlY2xhc3MgPSByZWZsZWN0aW9uS2V5LnByaW1HZXQoY2xhc3NuYW1lKTsKLQkJaWYgKGVjbGFzcyA9PSBudWxsKSAKLQkJCWVjbGFzcyA9IHJlZmxlY3Rpb25LZXkuZ2V0SmF2YVR5cGUoY2xhc3NuYW1lKTsJLy8gTGV0IGl0IGNyZWF0ZSBpdC4KLQkJaWYgKGVjbGFzcyBpbnN0YW5jZW9mIEphdmFDbGFzcykKLQkJCXJldHVybiAoSmF2YUNsYXNzKSBlY2xhc3M7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb01vZGVsU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNjc4NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyOwotLyoqCi0gKiBUaGlzIGNsYXNzIGxpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIGphdmEgbW9kZWwgYW5kIGZsdXNocyB0aGUKLSAqIGFwcHJvcHJpYXRlIGNsYXNzIGludHJvc3BlY3Rpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIgZXh0ZW5kcyBKYXZhTW9kZWxMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgZkFkYXB0ZXJGYWN0b3J5OwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZlByb2plY3Q7IC8vIFRoZSBwcm9qZWN0IHRoaXMgbGlzdGVuZXIgaXMgb3BlbmVkIG9uLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIEJFQU5JTkZPQ09ORklHX1BBVEggPSBuZXcgUGF0aChCZWFuaW5mb05hdHVyZS5QX0JFQU5JTkZPX1NFQVJDSF9QQVRIKTsJLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBCZWFuaW5mb01vZGVsU3luY2hyb25pemVyKEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgYUZhY3RvcnksIElKYXZhUHJvamVjdCBhUHJvamVjdCkgewotCQlzdXBlcihFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJZkFkYXB0ZXJGYWN0b3J5ID0gYUZhY3Rvcnk7Ci0JCWZQcm9qZWN0ID0gYVByb2plY3Q7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBmUHJvamVjdDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fsc29DbGFzc3BhdGhDaGFuZ2UoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gcGF0aC5lcXVhbHMoQkVBTklORk9DT05GSUdfUEFUSCk7Ci0JfQotCQotCS8qKgotCSAqIFN0b3AgdGhlIHN5bmNocm9uaXplciBmcm9tIGxpc3RlbmluZyB0byBhbnkgbW9yZSBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BTeW5jaHJvbml6ZXIoYm9vbGVhbiBjbGVhclJlc3VsdHMpIHsKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5jbG9zZUFsbChjbGVhclJlc3VsdHMpOwotCX0KLQotCXB1YmxpYyBCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZkFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFQcm9qZWN0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChpc0luQ2xhc3NwYXRoKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgfHwgZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBmb3IgZGVsZXRlL2Nsb3NlL2FkZC9vcGVuIG9mIG1haW4gcHJvamVjdCBiZWNhdXNlIHRoZXJlIGlzIG11Y2ggbW9yZSB0aGF0IG5lZWRzIHRvCi0JCQkJLy8gYmUgZG9uZSBieSBCZWFuaW5mb05hdHVyZSBvbiBwcm9qZWN0IGNsb3NlL2RlbGV0ZSwgc28gbmF0dXJlIGxpc3RlbnMgZm9yIHRoaXMgYW5kIGRvZXMgdGhlIGFwcHJvcHJpYXRlIGNsZWFudXAuCQkJCi0JCQkJaWYgKCFlbGVtZW50LmVxdWFscyhmUHJvamVjdCkpIHsKLQkJCQkJLy8gSG93ZXZlciwgYWxsIG90aGVyIHByb2plY3RzIGFyZSByZXF1aXJlZCBwcm9qZWN0cyBhbmQgaWYgdGhleSBhcmUgZGVsZXRlZC9jbG9zZWQvYWRkZWQvb3BlbmVkIHdoZW4gbmVlZCB0byBkbwotCQkJCQkvLyBhIGZ1bGwgZmx1c2ggYmVjYXVzZSB3ZSBkb24ndCBrbm93IGFueSBvZiB0aGUgc3RhdGUsIHdoZXRoZXIgdGhleSBhcmUgc3RpbGwgdGhlcmUgb3Igbm90LgotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtBbGxTdGFsZSgpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKGlzQ2xhc3NwYXRoUmVzb3VyY2VDaGFuZ2UoZGVsdGEpKSB7Ci0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5tYXJrQWxsU3RhbGUoKTsgLy8gVGhlIC5jbGFzc3BhdGggZmlsZSAob3IgLmJlYW5pbmZvY29uZmlnKSBpdHNlbGYgaW4gU09NRSBERVBFTkRFTlQgUFJPSkVDVCBoYXMgY2hhbmdlZC4gCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKiBJZiBhIHdvcmtpbmcgY29weSwgdGhlbiBpZ25vcmUgaXQgYmVjYXVzZSB3ZSBkb24ndCBjYXJlIGFib3V0IGNoYW5nZXMgdW50aWwKLQkgKiB0aGV5IGFyZSBjb21taXR0ZWQuIEVsc2UsIGlmIHRoZSBDVSBoYXMgY2hhbmdlZCBjb250ZW50IHRoZW4gbWFyayBhbGwgb2YgdGhlCi0JICogdHlwZXMgaW4gdGhpcyBDVSAoc3VjaCBhcyBpbm5lciBjbGFzc2VzKSBhcyBzdGFsZS4KLQkgKiBJZiBpdCBpcyBub3QgYSBjb250ZW50IGNoYW5nZSB0aGVuIHByb2Nlc3MgdGhlIGNoaWxkcmVuLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEIDoKLQkJCQkvLyBBIGZpbGUgc2F2ZSBoYWQgb2NjdXJyZWQuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIGN1cnJlbnRseSB3b3JraW5nIGNvcHkgb3Igbm90LgotCQkJCS8vIEl0IG1lYW5zIHNvbWV0aGluZyBoYXMgY2hhbmdlZCB0byB0aGUgZmlsZSBvbiBkaXNrLCBidXQgZG9uJ3Qga25vdyB3aGF0LgotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9SRVNPVVJDRSkgIT0gMCkgewotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSwgZmFsc2UpOwkvLyBGbHVzaCBldmVyeXRoaW5nLCBpbmNsdWRpbmcgaW5uZXIgY2xhc3Nlcy4KLQkJCQl9CQkJCQkJCi0JCQkJCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEOgotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEOgotCQkJCS8vIE5lZWQgdG8ga25vdyBmb3IgYWRkIGJlY2F1c2Ugd2Ugb3B0aW1pemUgdGhlIGJlYW5pbmZvIHN1Y2ggdGhhdCBvbmNlIGZvdW5kIGFzIHVuZGVmaW5lZCwgaXQgd29uJ3QKLQkJCQkvLyBpbnRyb3NwZWN0IGFnYWluIHVudGlsIHdlIG1hcmsgaXQgc3RhbGUuIFNvIHdlIG5lZWQgdG8gbWFyayBpdCBzdGFsZSB0byByZWZyZXNoIGl0LgotCQkJCQotCQkJCS8vIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRvdGFsbHkgcmVtb3ZlZCBvciBqdXN0IG1vdmVkIHNvbWV3aGVyZSBlbHNlLCB3ZSB3aWxsIGNsZWFyIG91dAotCQkJCS8vIGFkYXB0ZXIgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIHJlbmFtZSB3aGljaCB3b3VsZCBiZSBhIGRpZmZlcmVudCBjbGFzcy4KLQkJCQkvLyBDdXJyZW50bHkgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBkZWxldGVkIG9yIGFkZGVkIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gZmluZCB0aGUgdHlwZXMgaW4gdGhlIHVuaXQgdG8gZmx1c2guCi0JCQkJLy8gU28gaW5zdGVhZCB3ZSBhc2sgZmFjdG9yeSB0byBmbHVzaCBhbGwgaXQgYW55IHRoYXQgc3RhcnQgd2l0aCBpdCBwbHVzIGZvciBpbm5lciBjbGFzc2VzLgkJCQkKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChlbGVtZW50KSwgdHJ1ZSk7CS8vIEZsdXNoIGV2ZXJ5dGhpbmcsIGluY2x1ZGluZyBpbm5lciBjbGFzc2VzLgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDbGFzc0ZpbGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7Ci0JCQkvLyBJdCBkb2Vzbid0IG1hdHRlciBpZiB0b3RhbGx5IHJlbW92ZWQgb3IganVzdCBtb3ZlZCBzb21ld2hlcmUgZWxzZSwgd2Ugd2lsbCBjbGVhciBvdXQgYW5kIHJlbW92ZSB0aGUKLQkJCS8vIGFkYXB0ZXIgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIHJlbmFtZSB3aGljaCB3b3VsZCBiZSBhIGRpZmZlcmVudCBjbGFzcy4KLQkJCS8vIEN1cnJlbnRseSB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGRlbGV0ZWQgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBmaW5kIHRoZSB0eXBlcyBpbiB0aGUgdW5pdCB0byByZW1vdmUuCi0JCQkvLyBTbyBpbnN0ZWFkIHdlIGFzayBmYWN0b3J5IHRvIHJlbW92ZSBhbGwgaXQgYW55IHRoYXQgc3RhcnQgd2l0aCBpdCBwbHVzIGZvciBpbm5lciBjbGFzc2VzLgotCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5tYXJrU3RhbGVJbnRyb3NwZWN0aW9uUGx1c0lubmVyKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCksIHRydWUpOwotCQkJcmV0dXJuOyAvLyBTaW5jZSB0aGUgY2xhc3NmaWxlIHdhcyByZW1vdmVkIHdlIGRvbid0IG5lZWQgdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW4gKGFjdHVhbGx5IHRoZSBjaGlsZHJlbiBsaXN0IHdpbGwgYmUgZW1wdHkKLQkJfQotCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7Ci0JCQlwcm9jZXNzRGVsdGEoY2hpbGRyZW5baWldKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbE5hbWVGcm9tRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsJCQotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUNsYXNzRmlsZSkpCi0JCQlyZXR1cm4gbmFtZTsJLy8gU2hvdWxkbid0IGJlIGhlcmUKLQkJCi0JCS8vIHJlbW92ZSBleHRlbnNpb24uCi0JCWludCBwZXJpb2ROZHggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChwZXJpb2ROZHggPT0gLTEpCi0JCQlyZXR1cm4gbmFtZTsJLy8gU2hvdWxkbid0IGJlIGhlcmUuIFRoZXJlIHNob3VsZCBiZSBhbiBleHRlbnNpb24KLQkJCQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCVN0cmluZyBwYXJlbnROYW1lID0gZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlpZiAocGFyZW50TmFtZSA9PSBudWxsIHx8IHBhcmVudE5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXR5cGVOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgcGVyaW9kTmR4KTsgLy8gSW4gZGVmYXVsdCBwYWNrYWdlCi0JCWVsc2UKLQkJCXR5cGVOYW1lID0gcGFyZW50TmFtZSArICIuIiArIG5hbWUuc3Vic3RyaW5nKDAsIHBlcmlvZE5keCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCi0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICogSWYgdGhlIGNsYXNzcGF0aCBoYXMgY2hhbmdlZCwgbWFyayBhbGwgYXMgc3RhbGUgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQKLQkgKiBoYXMgY2hhbmdlZC4gVGhpbmdzIHRoYXQgd2VyZSBpbiB0aGUgcGF0aCBtYXkgbm8gbG9uZ2VyIGJlIGluIHRoZSBwYXRoLCBvcgotCSAqIHRoZSBvcmRlciB3YXMgY2hhbmdlZCwgd2hpY2ggY291bGQgYWZmZWN0IHRoZSBpbnRyb3NwZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudFJvb3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGlzQ2xhc3NQYXRoQ2hhbmdlKGRlbHRhKSkKLQkJCWZBZGFwdGVyRmFjdG9yeS5tYXJrQWxsU3RhbGUoKTsKLQkJZWxzZQotCQkJc3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChlbGVtZW50LCBkZWx0YSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDoKLQkJCQlicmVhazsJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBvbiBhIG5ldyBwYWNrYWdlLiBJZiB0aGlzIHdhcyBmcm9tIGEgbmV3IGZyYWdyb290LCB3ZSB3b3VsZCByZWN5Y2xlIGFscmVhZHkuIE90aGVyd2lzZSwgaXQgd2lsbCBmaW5kIHRoaXMgcGFja2FnZSBvbiB0aGUgZmlyc3QgdXNlLgotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEOgotCQkJCWlmIChkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID09IDApCi0JCQkJCWZBZGFwdGVyRmFjdG9yeS5tYXJrQWxsU3RhbGUoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoZWxlbWVudCwgZGVsdGEpOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqIFNvbWV0aGluZyBhYm91dCB0aGUgdHlwZSBoYXMgY2hhbmdlZC4gSWYgaXQgd2FzIHJlbW92ZWQgKG5vdCBhIG1vdmUpLCB0aGVuIGNsb3NlIHRoZQotCSAqIGFkYXB0ZXIgdG9vLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVR5cGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7Ci0JCQkvLyBDbG9zZSBpdCBvdXQuIERvZXNuJ3QgbWF0dGVyIGlmIG1vdmVkX3RvLCB0aGF0IHdvdWxkIGJlIGEgcmVuYW1lIHdoaWNoIHJlcXVpcmVzIGJyYW5kIG5ldyBjbGFzcy4KLQkJCS8vIFdlIGNhbid0IGFjdHVhbGx5IGdldCByaWQgb2YgdGhlIGJlYW5pbmZvIGFkYXB0ZXIgYmVjYXVzZSBpdCBtYXkgYmUgYXNrZWQgZm9yIGFnYWluCi0JCQkvLyBqdXN0IHRvIHNlZSBpZiBub3QgZGVmaW5lZC4gSXQgbWF5IGFsc28gY29tZSBiYWNrIGxhdGVyIGFuZCB3ZSB3YW50IHRvIGtub3cgYWJvdXQKLQkJCS8vIGl0IHRvIHJlY3ljbGUgdGhlIHZtLgotCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5tYXJrU3RhbGVJbnRyb3NwZWN0aW9uKGVsZW1lbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHRydWUpOwkKLQkJfSBlbHNlCi0JCQlnZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtTdGFsZUludHJvc3BlY3Rpb24oZWxlbWVudC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgZmFsc2UpOyAvLyBKdXN0IG1hcmsgaXQgc3RhbGUKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiICIrZlByb2plY3QuZ2V0RWxlbWVudE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb05hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NTg3NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuaW5mb05hdHVyZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zNyAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozOCAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQuSmF2YUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YVhNSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBUaGUgYmVhbmluZm8gbmF0dXJlLiBJdCBpcyBjcmVhdGVkIGZvciBhIHByb2plY3QgYW5kIGhvbGRzIHRoZQotICogbmVjZXNzYXJ5IGluZm8gZm9yIGJlYW5pbmZvIHRvIGJlIHBlcmZvcm1lZCBvbiBhIHByb2plY3QuCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEID0gQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQgKyAiLkJlYW5JbmZvTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQkVBTklORk9fU0VBUkNIX1BBVEggPSAiLmJlYW5pbmZvQ29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBDT05GSUdfSU5GT19TRVNTSU9OX0tFWSA9IG5ldyBRdWFsaWZpZWROYW1lKEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklELCAiQ09ORklHX0lORk8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBCRUFOSU5GT19DT05UUklCVVRPUlNfU0VTU0lPTl9LRVkgPSBuZXcgUXVhbGlmaWVkTmFtZShCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgIkJFQU5JTkZPX0NPTlRSSUJVVE9SUyIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByb3h5RmFjdG9yeVJlZ2lzdHJ5LklSZWdpc3RyeUxpc3RlbmVyIHJlZ2lzdHJ5TGlzdGVuZXIgPSBuZXcgUHJveHlGYWN0b3J5UmVnaXN0cnkuSVJlZ2lzdHJ5TGlzdGVuZXIoKSB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5RmFjdG9yeVJlZ2lzdHJ5LklSZWdpc3RyeUxpc3RlbmVyI3JlZ2lzdHJ5VGVybWluYXRlZChQcm94eUZhY3RvcnlSZWdpc3RyeSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lzdHJ5VGVybWluYXRlZChQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJbWFya0FsbFN0YWxlKCk7Ci0JCX07Ci0JfTsKLQotCS8qKgotCSAqIEdldCB0aGUgcnVudGltZSBuYXR1cmUgZm9yIHRoZSBwcm9qZWN0LCBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9OYXR1cmUgZ2V0UnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShwcm9qZWN0KTsJLy8gTXVzdCBmb3JjZSBKQVZBRU1GTmF0dXJlIGNyZWF0aW9uIGZpcnN0IGJlZm9yZSB3ZSB0cnkgdG8gZ2V0IG91cnMuIFRoZXJlIGlzIGEgY2hpY2tlbi9lZ2cgcHJvYmxlbSBpZiB3ZSBsZXQgb3VyIG5hdHVyZSB0cnkgdG8gZ2V0IEphdmFFTUZOYXR1cmUgZHVyaW5nIHNldFByb2plY3QuCi0JCWlmIChwcm9qZWN0Lmhhc05hdHVyZShOQVRVUkVfSUQpKQotCQkJcmV0dXJuIChCZWFuaW5mb05hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUoTkFUVVJFX0lEKTsKLQkJZWxzZQotCQkJcmV0dXJuIGNyZWF0ZVJ1bnRpbWUocHJvamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgcHJvamVjdCBoYXMgYSBCZWFuSW5mbyBydW50aW1lIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaGFzIHRoZSBhIEJlYW5JbmZvIHJ1bnRpbWUuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoTkFUVVJFX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGlmIHRoaXMgaXMgYSB2YWxpZCBwcm9qZWN0IGZvciBhIEJlYW5pbmZvIE5hdHVyZS4gSXQgbXVzdCBiZQotCSAqIGEgSmF2YVByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcnVudGltZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBCZWFuaW5mb05hdHVyZSBjcmVhdGVSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkUHJvamVjdChwcm9qZWN0KSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCUJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklELAotCQkJCQkwLAotCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLklOVFJPU1BFQ1RfRkFJTEVEX0VYQ18sIAotCQkJCQkJbmV3IE9iamVjdFtdIHsgcHJvamVjdC5nZXROYW1lKCksIEJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLkJlYW5pbmZvTmF0dXJlX0ludmFsaWRQcm9qZWN0fSksIAotCQkJCQludWxsKSk7Ci0KLQkJYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2plY3QsIE5BVFVSRV9JRCk7Ci0JCXJldHVybiAoQmVhbmluZm9OYXR1cmUpIHByb2plY3QuZ2V0TmF0dXJlKE5BVFVSRV9JRCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCXByb3RlY3RlZCBQcm94eUZhY3RvcnlSZWdpc3RyeSBmUmVnaXN0cnk7Ci0JcHJvdGVjdGVkIFJlc291cmNlU2V0IGphdmFSU2V0OwotCXByb3RlY3RlZCBCZWFuaW5mb01vZGVsU3luY2hyb25pemVyIGZTeW5jaHJvbml6ZXI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBCZWFuaW5mb0phdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGZSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uOwotCi0JLyoqIAotCSAqIENvbmZpZ3VyZXMgdGhlIHByb2plY3Qgd2l0aCB0aGlzIG5hdHVyZS4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSA8Y29kZT5JUHJvamVjdC5nZXROYXR1cmU8L2NvZGU+IGFuZCBzaG91bGQgbm90Ci0JICogYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0JICogVGhlIG5hdHVyZSBleHRlbnNpb24gaWQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgbmF0dXJlcyBvbiB0aGUgcHJvamVjdCBieQotCSAqIDxjb2RlPklQcm9qZWN0LmdldE5hdHVyZTwvY29kZT4sIGFuZCBuZWVkIG5vdCBiZSBhZGRlZCBoZXJlLgotCSAqCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGZhaWxzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKiogCi0JICogUmVtb3ZlcyB0aGlzIG5hdHVyZSBmcm9tIHRoZSBwcm9qZWN0LCBwZXJmb3JtaW5nIGFueSByZXF1aXJlZCBkZWNvbmZpZ3VyYXRpb24uCi0JICogVGhpcyBpcyBjYWxsZWQgYnkgPGNvZGU+SVByb2plY3QucmVtb3ZlTmF0dXJlPC9jb2RlPiBhbmQgc2hvdWxkIG5vdAotCSAqIGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLgotCSAqIFRoZSBuYXR1cmUgaWQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIG5hdHVyZXMgb24gdGhlIHByb2plY3QgYnkKLQkgKiA8Y29kZT5JUHJvamVjdC5yZW1vdmVOYXR1cmU8L2NvZGU+LCBhbmQgbmVlZCBub3QgYmUgcmVtb3ZlZCBoZXJlLgotCSAqCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGZhaWxzLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlU2hhcmVkUHJvcGVydHkoUF9CRUFOSU5GT19TRUFSQ0hfUEFUSCwgbnVsbCk7Ci0JCWNsZWFudXAodHJ1ZSwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNodXRkb3duIHRoZSBuYXR1cmUuIENhbGxlZCBieSBCZWFuSW5mb1BsdWdpbiB0byB0ZWxsIHRoZSBuYXR1cmUgdGhhdCB0aGUgcGx1Z2luIGlzIGJlaW5nIHNodXRkb3duLgotCSAqIEl0IG5lZWRzIHRvIGNsZWFudXAuCi0JICogVE9ETyA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSBCZWFuSW5mb1BsdWdpbiBzaG91bGQgY2FsbCBpdC4gKHB1YmxpYyBmb3Igbm93IGJ1dCB3aGVuIHdlIG1ha2UKLQkgKiBCZWFuSW5mb05hdHVyZSBhbiBBUEkgaXQgd2lsbCBiZSBtb3ZlZCBpbnRvIHRoZSBzYW1lIHBhY2thZ2UgYXMgQmVhbkluZm9QbHVnaW4pLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQljbGVhbnVwKHRydWUsIGZhbHNlKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBSZXNvdXJjZVNldCB0aGF0IGlzIGxpbmtlZCBjb3JyZWN0bHkgdG8gdGhpcyBCZWFuaW5mbyBOYXR1cmUuCi0JICogPHA+Ci0JICogVGhpcyBsaW5rcyB1cCBhIFJlc291cmNlU2V0IHNvIHRoYXQgaXQgd2lsbCB3b3JrIGNvcnJlY3RseSB3aXRoIHRoaXMgbmF0dXJlLgotCSAqIEl0IG1ha2VzIHN1cmUgdGhhdCBnb2luZyB0aHJvdWdoIHRoZSBSZXNvdXJjZVNldCB0aGF0IGFueSAiamF2YTovLi4uIgotCSAqIGNsYXNzZXMgY2FuIGJlIGZvdW5kIGFuZCBpdCBtYWtlcyBzdXJlIHRoYXQgYW55IG5ldyBjbGFzc2VzIGFyZSBwbGFjZWQgaW50byB0aGUKLQkgKiBuYXR1cmUncyByZXNvdXJjZSBzZXQgYW5kIG5vdCByZXNvdXJjZSBzZXQgZG9pbmcgdGhlIGNhbGxpbmcuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgYmUgdXNlZCBhbnkgdGltZSBhIHJlc291cmNlIHNldCBpcyBuZWVkZWQgdGhhdCBpcyBub3QgdGhlCi0JICogcHJvamVjdCB3aWRlIHJlc291cmNlIHNldCBhc3NvY2lhdGVkIHdpdGggYmVhbmluZm9zLCBidXQgd2lsbCByZWZlcmVuY2UKLQkgKiBKYXZhIE1vZGVsIGNsYXNzZXMgb3IgaW5zdGFudGlhdGUuCi0JICogPHA+Ci0JICogQW4gYWRkaXRpb25hbCBjaGFuZ2UgaXMgbWFkZSB0b28uIFRoZSBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSdzIGV4dGVuc2lvblRvUmVzb3VyY2VGYWN0b3J5IG1hcCBpcyBtb2RpZmllZAotCSAqIHRvIGhhdmUgYW4gImphdmEiLT5YTUlSZXNvdXJjZUZhY3RvcnkgZW50cnkgYWRkZWQgdG8gaXQgaWYgRU1GIEV4YW1wbGVzIGlzIGxvYWRlZC4gRU1GIEV4YW1wbGVzIGFkZAotCSAqIHRoZSAiamF2YSIgZXh0ZW5zaW9uIGFuZCBzZXRzIGl0IHRvIHRoZWlyIG93biBzcGVjaWFsIEphdmFSZXNvdXJjZUZhY3RvcnkuIAotCSAqIElmIEVNRiBFeGFtcGxlcyBpcyBub3QgbG9hZGVkLCB0aGVuIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQgIioiIG1hcHBpbmcsIHdoaWNoIGlzIHRvIFhNSVJlc291cmNlRmFjdG9yeS4KLQkgKiBUaGlzIG5vcm1hbGx5IGNhdXNlcyBwcm9ibGVtcyBmb3IgbWFueQotCSAqIGN1c3RvbWVycy4gSWYgdXNlcnMgb2YgdGhpcyByZXNvdXJjZSBzZXQgcmVhbGx5IHdhbnQgdGhlIEVNRiBleGFtcGxlcyBlbnRyeSBpbnN0ZWFkLCBhZnRlciB0aGV5IHJldHJpZXZlIHRoZQotCSAqIG5ldyByZXNvdXJjZSBzZXQgdGhleSBjYW4gZG8gdGhpczoKLQkgKiA8cD4KLQkgKiA8cHJlPjxjb2RlPgotCSAqIAlyc2V0ID0gYmVhbmluZm9OYXR1cmUubmV3UmVzb3VyY2VTZXQoKTsKLQkgKiAJcnNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnJlbW92ZSgiamF2YSIpOwotCSAqIDwvY29kZT48L3ByZT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgUmVzb3VyY2VTZXQgdGhhdCBpcyBzcGVjaWFsbHkgY29ubmVjdGVkIHRvIHRoZSBKRU0gamF2YSBtb2RlbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0IG5ld1Jlc291cmNlU2V0KCkgewotCQlTcGVjaWFsUmVzb3VyY2VTZXQgcnNldCA9IG5ldyBTcGVjaWFsUmVzb3VyY2VTZXQoKTsKLQkJcnNldC5hZGQobmV3IFJlc291cmNlSGFuZGxlcigpIHsKLQkJCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3RGYWlsZWQoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJCQlyZXR1cm4gbnVsbDsgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkgc3BlY2lhbCB0aGluZ3Mgd2UgY2FuIGRvIGluIHRoaXMgY2FzZS4KLQkJCX0KLQotCQkJcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJCQkvLyBBbHdheXMgdHJ5IHRvIGdldCBpdCBvdXQgb2YgdGhlIG5hdHVyZSdzIHJlc291cmNlIHNldCBiZWNhdXNlIGl0IG1heSBvZiBiZWVuIGxvYWRlZCB0aGVyZSBlaXRoZXIgYXMgCi0JCQkJLy8gdGhlICJqYXZhOi4uLiIgdHlwZSBvciBpdCBjb3VsZCBvZiBiZWVuIGFuIG92ZXJyaWRlIGV4dHJhIGZpbGUgKHN1Y2ggYXMgYW4gb3ZlcnJpZGUgRU1GIHBhY2thZ2UsIGZvcgotCQkJCS8vIGV4YW1wbGUgamNmIGhhcyBhIHNpZGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBuZXcgYXR0cmlidXRlIHR5cGUuIFRoYXQgZmlsZQotCQkJCS8vIHdpbGwgYWxzbyBiZSBsb2FkZWQgaW50byB0aGlzIHJlc291cmNlc2V0LiBTbyB0byBmaW5kIGl0IHdlIG5lZWQgdG8gZ28gaW4gaGVyZSBhbmQgdHJ5LgotCQkJCS8vCi0JCQkJLy8gSG93ZXZlciwgaWYgbm90IGZvdW5kIHdlIHdvbid0IGdvIGFuZCB0cnkgdG8gbG9hZCB0aGUgcmVzb3VyY2UuIFRoYXQgY291bGQgbG9hZCBpbiB0aGUgd3JvbmcgcGxhY2UuCi0JCQkJLy8gS2x1ZGdlOiBCZWNhdXNlIG9mIGEgYnVnIChmZWF0dXJlIDotKSkgaW4gWE1MSGFuZGxlci5nZXRQYWNrYWdlRnJvbVVSSSgpLCBpdCBkb2Vzbid0IHVzZSBnZXRSZXNvdXJjZSguLi4sdHJ1ZSkgYW5kIGl0IHRyaWVzIGluc3RlYWQKLQkJCQkvLyB0byB1c2UgdXJpIGlucHV0c3RyZWFtIHRvIGxvYWQgdGhlIHBhY2thZ2Ugd2hlbiBub3QgZm91bmQuIFRoaXMgYnlwYXNzZXMgb3VyIHNwZWNpYWwgY3JlYXRlIHJlc291cmNlIGFuZCBzbwotCQkJCS8vIHBhY2thZ2VzIGFyZSBub3QgYXV0b21hdGljYWxseSBjcmVhdGVkLiBTbyB3ZSBuZWVkIHRvIGRvIGxvYWQgb24gZGVtYW5kIGhlcmUgaW5zdGVhZCBpZiBpdCBpcyBhIGphdmEgcHJvdG9jb2wuCi0JCQkJLy8gRU1GIHdpbGwgbm90IGJlIGZpeGluZyB0aGlzLiBJdCBpcyB3b3JraW5nIGFzIGRlc2lnbmVkLgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHVyaSwgSmF2YVhNSUZhY3RvcnkuU0NIRU1FLmVxdWFscyh1cmkuc2NoZW1lKCkpKTsKLQkJCX0KLQotCQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJCQkvLyBUaGlzIGlzIHRoZSBvbmUuIEl0IGhhcyBnb3QgaGVyZSBiZWNhdXNlIGl0IGNvdWxkbid0IGZpbmQgYSByZXNvdXJjZSBhbHJlYWR5IGxvYWRlZC4KLQkJCQkvLyBJZiBpdCBpcyBhICJqYXZhOi8uLi4iIHByb3RvY29sIHJlc291cmNlLCB0aGVuIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGlzIGxvYWRlZCBhdCB0aGUgQmVhbmluZm9OYXR1cmUgY29udGV4dAotCQkJCS8vIGluc3RlYWQgb2YgdGhlIGxvd2VyIG9uZS4KLQkJCQlpZiAoSmF2YVhNSUZhY3RvcnkuU0NIRU1FLmVxdWFscyh1cmkuc2NoZW1lKCkpKQotCQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0pOwotCQkvLyBbNzE0NzNdIFJlc3RvcmUgIiouamF2YSIgdG8gYmUgYW4gWE1JUmVzb3VyY2UuIElmIEVNRiBFeGFtcGxlcyBhcmUgbG9hZGVkIHRoZXkgb3ZlcmxvYWQgdGhpcyBhbmQgbG9hZCB0aGVpciBzcGVjaWFsIHJlc291cmNlIGZvciAiKi5qYXZhIiB3aGljaCB3ZSBkb24ndCB3YW50LgotCQkvLyBJZiBzb21lIHVzZXIgcmVhbGx5IHdhbnRzIHRoYXQsIHRoZXkgZ3JhYiB0aGUgcmVzb3VyY2UgcmVzb3VyY2Ugc2V0IGFuZCByZW1vdmUgb3VyIG92ZXJyaWRlLgotCQlpZiAoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5jb250YWluc0tleSgiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIE5lZWQgdG8gYWRkIGFuIG92ZXJyaWRlIHRvIGdvIHRvIFhNSSBpbnN0ZWFkLgotCQkJcnNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiamF2YSIsIG5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJzZXQ7Ci0JfQotCS8qKgotCSAqIENsZWFuIHVwLCB0aGlzIG1lYW5zIGVpdGhlciB0aGUgcHJvamVjdCBpcyBiZWluZyBjbG9zZWQsIGRlbGV0ZWQsIG9yIGl0IG1lYW5zIHRoYXQKLQkgKiB0aGUgbmF0dXJlIGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdC4gRWl0aGVyIHdheSB0aGF0IG1lYW5zIHRvCi0JICogdGVybWluYXRlIHRoZSBWTSBhbmQgcmVtb3ZlIHdoYXQgd2UgYWRkZWQgdG8gdGhlIGNvbnRleHQgaWYgdGhlIGZsYWcgc2F5cyBjbGVhciBpdC4KLQkgKiA8cD4KLQkgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgT05MWSB3aGVuIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIG5hdHVyZSBpcyBubyBsb25nZXIgbmVlZGVkLiBJdAotCSAqIHdpbGwgYmUgcmVjcmVhdGVkIGZvciBhbnkgbmV3IHVzZXMuIFRoYXQgaXMgYmVjYXVzZSB3ZSB3aWxsIGJlIHJlbW92aW5nIG91cnNlbHZlcwotCSAqIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIG5hdHVyZXMgaW4gdGhlIEJlYW5JbmZvUGx1Z2luLgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLiBJdCBrbm93cyB3aGVuIHRoZSBwcm9qZWN0IGlzCi0JICogYmVpbmcgY2xvc2VkIG9yIGRlbGV0ZWQuCi0JICogCi0JICogQHBhcmFtIGNsZWFyUmVzdWx0cyBjbGVhciB0aGUgcmVzdWx0cyBzdWNoIHRoYXQgYW55IEpFTSBtb2RlbCBvYmplY3RzIGhhdmUgbm8gQmVhbkluZm8KLQkgKiBhZGFwdGVycyBhdHRhY2hlZCB0byB0aGVtLiBUaGlzIGFsbG93cyBCZWFuSW5mbyB0byBiZSBHQydkIHdpdGhvdXQgYmVpbmcgaHVuZyBvbnRvLgotCSAqICAKLQkgKiBAcGFyYW0gZGVyZWdpc3RlciBEZXJlZ2lzdGVyIGZyb20gdGhlIEJlYW5JbmZvUGx1Z2luLiBOb3JtYWxseSB0aGlzIHdpbGwgYWx3YXlzIGJlIHRydWUsIGJ1dCBpdAotCSAqIHdpbGwgYmUgY2FsbGVkIHdpdGggZmFsc2Ugd2hlbiBCZWFuSW5mb1BsdWdpbiBpcyBjYWxsaW5nIGJhY2sgdG8gc2h1dGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cChib29sZWFuIGNsZWFyUmVzdWx0cywgYm9vbGVhbiBkZXJlZ2lzdGVyKSB7Ci0JCWlmIChkZXJlZ2lzdGVyKQotCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkucmVtb3ZlQmVhbkluZm9OYXR1cmUodGhpcyk7Ci0JCWZTeW5jaHJvbml6ZXIuc3RvcFN5bmNocm9uaXplcihjbGVhclJlc3VsdHMpOwotCQlJbml0LmNsZWFudXAoamF2YVJTZXQsIGNsZWFyUmVzdWx0cyk7Ci0JCWlmIChmUmVnaXN0cnkgIT0gbnVsbCkKLQkJCWZSZWdpc3RyeS50ZXJtaW5hdGVSZWdpc3RyeSh0cnVlKTsKLQotCQlqYXZhUlNldCA9IG51bGw7Ci0JCWZSZWdpc3RyeSA9IG51bGw7Ci0JCWZQcm9qZWN0ID0gbnVsbDsKLQkJZlN5bmNocm9uaXplciA9IG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIFJldHVybnMgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBwcm9qZWN0IG5hdHVyZSBhcHBsaWVzLgotCSAqCi0JICogQHJldHVybiB0aGUgcHJvamVjdCBoYW5kbGUKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBuYXR1cmUgYXBwbGllcy4KLQkgKiBVc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIHByb2plY3QgbmF0dXJlIHJ1bnRpbWUuCi0JICogVGhpcyBpcyBjYWxsZWQgYnkgPGNvZGU+SVByb2plY3QuYWRkTmF0dXJlPC9jb2RlPgotCSAqIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLgotCSAqCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBuYXR1cmUgYXBwbGllcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotLy8JCUJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFLmdldENsYXNzKCk7CS8vIEluc3RhbnRpYXRlcyB0aGUgY29udHJvbGxlciBpZiBub3QgYWxyZWFkeSBzdGFydGVkLgotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmFkZEJlYW5JbmZvTmF0dXJlKHRoaXMpOwotCi0JCXRyeSB7Ci0JCQkvLyBUaGUgbmF0dXJlIGhhcyBiZWVuIHN0YXJ0ZWQgZm9yIHRoaXMgcHJvamVjdCwgbmVlZCB0byBzZXR1cCB0aGUgaW50cm9zcGVjdGlvbiBwcm9jZXNzIG5vdy4KLQkJCUphdmFFTUZOYXR1cmUgamF2YU5hdHVyZSA9IEphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShmUHJvamVjdCk7Ci0JCQlKYXZhSW5pdC5pbml0KCk7Ci0JCQlpZiAoZlJlZmxlY3Rpb25LZXlFeHRlbnNpb24gPT0gbnVsbCkgewotCQkJCS8vIFJlZ2lzdGVyIHRoZSByZWZsZWN0aW9uIGtleSBleHRlbnNpb24uCi0JCQkJZlJlZmxlY3Rpb25LZXlFeHRlbnNpb24gPSBuZXcgQmVhbmluZm9KYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbigpOwotCQkJCUphdmFYTUlGYWN0b3J5LklOU1RBTkNFLnJlZ2lzdGVyUmVmbGVjdGlvbktleUV4dGVuc2lvbihmUmVmbGVjdGlvbktleUV4dGVuc2lvbik7Ci0JCQl9Ci0KLQkJCWphdmFSU2V0ID0gamF2YU5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJSW5pdC5pbml0aWFsaXplKGphdmFSU2V0LCBuZXcgSUJlYW5pbmZvU3VwcGxpZXIoKSB7Ci0JCQkJcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgewotCQkJCQlyZXR1cm4gQmVhbmluZm9OYXR1cmUudGhpcy5nZXRSZWdpc3RyeSgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0cnlDcmVhdGVkKCkgewotCQkJCQlyZXR1cm4gQmVhbmluZm9OYXR1cmUudGhpcy5pc1JlZ2lzdHJ5Q3JlYXRlZCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBjbG9zZVJlZ2lzdHJ5KCkgewotCQkJCQlCZWFuaW5mb05hdHVyZS50aGlzLmNsb3NlUmVnaXN0cnkoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQkJCXJldHVybiBCZWFuaW5mb05hdHVyZS50aGlzLmdldFByb2plY3QoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0IGdldE5ld1Jlc291cmNlU2V0KCkgewotCQkJCQlyZXR1cm4gQmVhbmluZm9OYXR1cmUudGhpcy5uZXdSZXNvdXJjZVNldCgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRQcm9qZWN0UmVzb3VyY2VTZXQoKSB7Ci0JCQkJCXJldHVybiBnZXRSZXNvdXJjZVNldCgpOwotCQkJCX0KLQkJCX0pOwotCQkJZlN5bmNocm9uaXplciA9Ci0JCQkJbmV3IEJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIoCi0JCQkJCShCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5KSBFY29yZVV0aWwuZ2V0QWRhcHRlckZhY3RvcnkoamF2YVJTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLCBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuQURBUFRFUl9LRVkpLAotCQkJCQlKYXZhQ29yZS5jcmVhdGUoamF2YU5hdHVyZS5nZXRQcm9qZWN0KCkpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSB0aGUgcmVnaXN0cnkuIEl0IG5lZWRzIHRvIGJlIHJlY3ljbGVkIGJlY2F1c2UgYSBjbGFzcyBoYXMgY2hhbmdlZAotCSAqIGFuZCBub3cgdGhlIG5ldyBjbGFzcyBuZWVkcyB0byBiZSBhY2Nlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVJlZ2lzdHJ5KCkgewotCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWcgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXJlZyA9IGZSZWdpc3RyeTsKLQkJCWZSZWdpc3RyeSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIFdpcGUgb3V0IHRoZSBTZXNzaW9uIHByb3BlcnRpZXMgc28gdGhhdCB0aGV5IGFyZSByZWNvbXB1dGVkLgotCQkJCWdldFByb2plY3QoKS5zZXRTZXNzaW9uUHJvcGVydHkoQ09ORklHX0lORk9fU0VTU0lPTl9LRVksIG51bGwpOwotCQkJCWdldFByb2plY3QoKS5zZXRTZXNzaW9uUHJvcGVydHkoQkVBTklORk9fQ09OVFJJQlVUT1JTX1NFU1NJT05fS0VZLCBudWxsKTsJCQkKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5JTkZPKTsKLQkJCX0KLQkJfQotCQlpZiAocmVnICE9IG51bGwpIHsKLQkJCXJlZy5yZW1vdmVSZWdpc3RyeUxpc3RlbmVyKHJlZ2lzdHJ5TGlzdGVuZXIpOwotCQkJcmVnLnRlcm1pbmF0ZVJlZ2lzdHJ5KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVXNpbmcgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gaW5mbywgY29tcHV0ZSB0aGUgQmVhbkluZm8gY29uZmlnIGluZm8gbmVlZGVkLiBUaGlzIHNldHMgdGhlCi0JICogc2Vzc2lvbiBwcm9wZXJ0aWVzIEJFQU5JTkZPX0NPTlRSSUJVVE9SU19TRVNTSU9OX0tFWSBhbmQgQ09ORklHX0lORk9fU0VTU0lPTl9LRVkuCi0JICogCi0JICogQHBhcmFtIGluZm8KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHV0ZUJlYW5JbmZvQ29uZmlnSW5mbyhJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBGaXJzdCB0aW1lIGZvciB0aGlzIG5hdHVyZSwgb3IgZmlyc3QgdGltZSBhZnRlciByZWdpc3RyeSByZXNldC4gTmVlZCB0byBjb21wdXRlIHRoZSBpbmZvLgotCQkvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBjYWxsZWQgQkVGT1JFIHRoZSBmaXJzdCB1c2FnZSBvZiBCZWFuSW5mby4gVGhlIGVkaXRvciB1c3VhbGx5Ci0JCS8vIGJyaW5ncyB1cCB0aGUgZWRpdG9yJ3MgcmVnaXN0cnkgYmVmb3JlIGl0IGdldHMgYW55dGhpbmcgZnJvbSBCZWFuSW5mby4KLQkJTGlzdCBjb250cmlidXRvcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgxMCk7Ci0JCWlmICghaW5mby5nZXRDb250YWluZXJJZHMoKS5pc0VtcHR5KCkpIHsKLQkJCS8vIFJ1biB0aHJvdWdoIGFsbCBvZiB0aGUgdmlzaWJsZSBjb250YWluZXIgaWRzIHRoYXQgYXJlIGFwcGxpY2FibGUgYW5kIGdldCBCZWFuSW5mbyBjb250cmlidXRvcnMuCi0JCQlJdGVyYXRvciBjb250YWluZXJJZEl0ciA9IGluZm8uZ2V0Q29udGFpbmVySWRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGNvbnRhaW5lcklkSXRyLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGNvbnRhaW5lcklkSXRyLm5leHQoKTsKLQkJCQlpZiAoKChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250cmlidXRvcnMgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRDb250YWluZXJJZENvbnRyaWJ1dG9ycygKLQkJCQkJCQkoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCWlmIChjb250cmlidXRvcnMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlPYmplY3QgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQSV9DTEFTUyk7Ci0JCQkJCQkJCWlmIChjb250cmlidXRvciBpbnN0YW5jZW9mIElCZWFuSW5mb0NvbnRyaWJ1dG9yKQotCQkJCQkJCQkJY29udHJpYnV0b3JzTGlzdC5hZGQoY29udHJpYnV0b3IpOwotCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQkJCQotCQl9Ci0JCQotCQlpZiAoIWluZm8uZ2V0UGx1Z2luSWRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkvLyBSdW4gdGhyb3VnaCBhbGwgb2YgdGhlIHZpc2libGUgcGx1Z2luIGlkcyB0aGF0IGFyZSBhcHBsaWNhYmxlIGFuZCBnZXQgQmVhbkluZm8gY29udHJpYnV0b3JzLgotCQkJCUl0ZXJhdG9yIHBsdWdpbklkSXRyID0gaW5mby5nZXRQbHVnaW5JZHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHBsdWdpbklkSXRyLmhhc05leHQoKSkgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwbHVnaW5JZEl0ci5uZXh0KCk7Ci0JCQkJCWlmICgoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb250cmlidXRvcnMgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5Db250cmlidXRvcnMoCi0JCQkJCQkJCShTdHJpbmcpIGVudHJ5LmdldEtleSgpKTsKLQkJCQkJCWlmIChjb250cmlidXRvcnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJT2JqZWN0IGNvbnRyaWJ1dG9yID0gY29udHJpYnV0b3JzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUElfQ0xBU1MpOwotCQkJCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQmVhbkluZm9Db250cmlidXRvcikKLQkJCQkJCQkJCWNvbnRyaWJ1dG9yc0xpc3QuYWRkKGNvbnRyaWJ1dG9yKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCi0JCQkvLyBTYXZlIGl0IGZvciBhbGwgYmVhbmluZm8gcHJvY2Vzc2luZyAoYW5kIGNvbmZpZ3VyYXRpb24gcHJvY2Vzc2luZyBpZiB0aGV5IGltcGxlbWVudCBwcm94eSBjb25maWd1cmF0aW9uIGNvbnRyaWJ1dG9yKS4KLQkJSUJlYW5JbmZvQ29udHJpYnV0b3JbXSBleHBsaWNpdENvbnRyaWJ1dG9ycyA9IChJQmVhbkluZm9Db250cmlidXRvcltdKSBjb250cmlidXRvcnNMaXN0LnRvQXJyYXkobmV3IElCZWFuSW5mb0NvbnRyaWJ1dG9yW2NvbnRyaWJ1dG9yc0xpc3Quc2l6ZSgpXSk7Ci0JCWluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuc2V0U2Vzc2lvblByb3BlcnR5KEJFQU5JTkZPX0NPTlRSSUJVVE9SU19TRVNTSU9OX0tFWSwgZXhwbGljaXRDb250cmlidXRvcnMpOwotCQkvLyBTYXZlIGl0IGZvciBvdmVycmlkZSBwcm9jZXNzaW5nLiBUaGF0IGhhcHBlbnMgb3ZlciBhbmQgb3ZlciBsYXRlciBhZnRlciBhbGwgY29uZmlnIHByb2Nlc3NpbmcgaXMgZG9uZS4KLQkJLy8gRG8gaXQgbGFzdCBzbyB0aGF0IGlmIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24sIHNpbmNlIHRoaXMgcHJvcGVydHkgaXMgYSBmbGFnIHRvIGluZGljYXRlIHdlIGhhdmUgZGF0YSwKLQkJLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIEJlYW5pbmZvIGRhdGEgaXMgYWxyZWFkeSBzZXQgYXQgdGhlIHBvaW50IHdlIHNldCB0aGlzLgotCQkvLyBXZSBjb3VsZCBhY3R1YWxseSBzZXQgaXQgdHdpY2UgYmVjYXVzZSBvZiB0aGlzLCBidXQgaXQgaXMgdGhlIHNhbWUgZGF0YSwgc28sIHNvIHdoYXQuCi0JCWluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuc2V0U2Vzc2lvblByb3BlcnR5KENPTkZJR19JTkZPX1NFU1NJT05fS0VZLCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcmVnaXN0cnksIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4KLQkgKiBAcmV0dXJuIHRoZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGZSZWdpc3RyeSAhPSBudWxsKQotCQkJCXJldHVybiBmUmVnaXN0cnk7Ci0JCX0KLQkJLy8gTm93IG5lZWQgdG8gc3RhcnQgdGhlIGFwcHJvcHJpYXRlIGpvYi4gSW4gYW5vdGhlciBjbGFzcyBzbyB0aGF0IGl0IGNhbiBoYW5kbGUgZHluYW1pY2FsbHkgY2hlY2tpbmcgaWYgCi0JCS8vIFVJIGlzIGF2YWlsYWJsZSB0byBldmVuIGRvIHRoaXMgKGl0IG1heWJlIG5vdCBpbiBhIFVJIG1vZGUsIHNvIHRoZW4ganVzdCBkbyBpdC4KLQkJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyLmNyZWF0ZVJlZ2lzdHJ5KHRoaXMpOwotCQlyZXR1cm4gZlJlZ2lzdHJ5OwotCX0KLQkKLQkvKgotCSAqIFRoaXMgaXMgPHBhY2thZ2UtcHJvdGVjdGVkPiBzbyB0aGF0IG9ubHkgdGhlIGFwcHJvcHJpYXRlIGNyZWF0ZSBqb2IgaW4gdGhpcwotCSAqIHBhY2thZ2UgY2FuIGNhbGwgaXQuIFRoaXMgaXMgYmVjYXVzZSB0aGlzIG11c3QgYmUgY29udHJvbGxlZCB0byBvbmx5IGJlCi0JICogZG9uZSB3aGVuIGJ1aWxkIG5vdCBpbiBwcm9ncmVzcyBhbmQgc2VyaWFsIGFjY2Vzcy4KLQkgKi8KLQl2b2lkIGNyZWF0ZVJlZ2lzdHJ5KElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJcG0uYmVnaW5UYXNrKEJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLlVJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyX1N0YXJ0QmVhbmluZm9SZWdpc3RyeSwgMTAwKTsgCi0JCWlmIChpc1JlZ2lzdHJ5Q3JlYXRlZCgpKSB7Ci0JCQlwbS5kb25lKCk7Ci0JCQlyZXR1cm47IC8vIEl0IGhhZCBhbHJlYWR5IGJlZW4gY3JlYXRlZC4gQ291bGQgb2YgYmVlbiBiZWNhdXNlIHRocmVhZHMgd2VyZSByYWNpbmcgdG8gZG8gdGhlIGNyZWF0aW9uLCBhbmQgb25lIGdvdCB0aGVyZSBmaXJzdC4KLQkJfQotCi0JCXRyeSB7Ci0JCQlDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgY29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yID0gKENvbmZpZ3VyYXRpb25Db250cmlidXRvcikgZ2V0Q29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKCk7Ci0JCQljb25maWd1cmF0aW9uQ29udHJpYnV0b3Iuc2V0TmF0dXJlKHRoaXMpOwotCQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBQcm94eUxhdW5jaFN1cHBvcnQuc3RhcnRJbXBsZW1lbnRhdGlvbihmUHJvamVjdCwgIkJlYW5pbmZvIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIHsgY29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yfSwgZmFsc2UsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwotCQkJcmVnaXN0cnkuYWRkUmVnaXN0cnlMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyKTsKLQkJCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkJZlJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQl9IGZpbmFsbHkgewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1JlZ2lzdHJ5Q3JlYXRlZCgpIHsKLQkJcmV0dXJuIGZSZWdpc3RyeSAhPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIG5hdHVyZSBpcyBzdGlsbCB2YWxpZC4gSWYgdGhlIHByb2plY3QgaGFzIGJlZW4KLQkgKiByZW5hbWVkLCB0aGUgbmF0dXJlIGlzIHN0aWxsIGFyb3VuZCwgYnV0IHRoZSBwcm9qZWN0IGhhcyBiZWVuIGNsb3NlZC4KLQkgKiBTbyB0aGUgbmF0dXJlIGlzIG5vdyBpbnZhbGlkLgotCSAqIAotCSAqIEByZXR1cm4gSXMgdGhpcyBhIHZhbGlkIG5hdHVyZS4gSS5lLiBpcyB0aGUgcHJvamVjdCBzdGlsbCBvcGVuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWROYXR1cmUoKSB7Ci0JCXJldHVybiBmUHJvamVjdCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2VhcmNoIHBhdGggb250byB0aGUgcmVnaXN0cnkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJveHlTZWFyY2hQYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBMaXN0IHNlYXJjaFBhdGhzKSB7Ci0JCWlmIChzZWFyY2hQYXRocyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzdHJpbmdTZWFyY2hQYXRoID0gKFN0cmluZ1tdKSBzZWFyY2hQYXRocy50b0FycmF5KG5ldyBTdHJpbmdbc2VhcmNoUGF0aHMuc2l6ZSgpXSk7Ci0JCQlVdGlsaXRpZXMuc2V0QmVhbkluZm9TZWFyY2hQYXRoKHJlZ2lzdHJ5LCBzdHJpbmdTZWFyY2hQYXRoKTsKLQkJfSBlbHNlCi0JCQlVdGlsaXRpZXMuc2V0QmVhbkluZm9TZWFyY2hQYXRoKHJlZ2lzdHJ5LCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBzQmVhbmluZm9zID0gImJlYW5pbmZvcyI7IC8vIFJvb3QgZWxlbWVudCBuYW1lIC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBHZXQgdGhlIHBlcnNpc3RlbnQgc2VhcmNoIHBhdGguIEl0IGlzIGNvcHkuCi0JICovCi0JcHVibGljIEJlYW5pbmZvc0RvYyBnZXRTZWFyY2hQYXRoKCkgewotCQlCZWFuaW5mb3NEb2MgYmRvYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBwcm9wZXJ0eSA9IGdldFNoYXJlZFByb3BlcnR5KFBfQkVBTklORk9fU0VBUkNIX1BBVEgpOwotCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBOZWVkIHRvIHJlY29uc3RydWN0IGZyb20gdGhlIFhNTCBmb3JtYXQuCi0JCQkJCURvY3VtZW50IGRvYyA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IElucHV0U3RyZWFtUmVhZGVyKHByb3BlcnR5LCBFTkNPRElORykpKTsKLQkJCQkJRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQlpZiAocm9vdCAhPSBudWxsICYmIHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHNCZWFuaW5mb3MpKSB7Ci0JCQkJCQliZG9jID0gQmVhbmluZm9zRG9jLnJlYWRFbnRyeShuZXcgRE9NUmVhZGVyKCksIHJvb3QsIGdldFByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJcHJvcGVydHkuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQsIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYmRvYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHBlcnNpc3RlbnQgc2VhcmNoIHBhdGguIE5vIHByb2dyZXNzIG1vbml0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoUGF0aChCZWFuaW5mb3NEb2Mgc2VhcmNoUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXRTZWFyY2hQYXRoKHNlYXJjaFBhdGgsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcGVyc2lzdGVudCBzZWFyY2ggcGF0aCB3aXRoIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlYXJjaFBhdGgoQmVhbmluZm9zRG9jIHNlYXJjaFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgcHJvcGVydHkgPSBudWxsOwotCQlpZiAoc2VhcmNoUGF0aCAhPSBudWxsICYmIHNlYXJjaFBhdGguZ2V0U2VhcmNocGF0aCgpLmxlbmd0aCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQkJRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoc0JlYW5pbmZvcyk7IC8vIENyZWF0ZSBSb290IEVsZW1lbnQKLQkJCQlJQmVhbmluZm9zRG9jRW50cnlbXSBlbnRyaWVzID0gc2VhcmNoUGF0aC5nZXRTZWFyY2hwYXRoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQkJCQlyb290LmFwcGVuZENoaWxkKGVudHJpZXNbaV0ud3JpdGVFbnRyeShkb2MsIGdldFByb2plY3QoKSkpOyAvLyBBZGQgdG8gdGhlIHNlYXJjaCBwYXRoCi0JCQkJZG9jLmFwcGVuZENoaWxkKHJvb3QpOyAvLyBBZGQgUm9vdCB0byBEb2N1bWVudAotCQkJCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLQkJCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChzdHJXcml0ZXIpOwotCQkJCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0JCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQkJCQlwcm9wZXJ0eSA9IHN0cldyaXRlci50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCS8vIElmIGl0IGhhc24ndCBjaGFuZ2VkLCBkb24ndCB3cml0ZSBpdCBiYWNrIG91dC4gVGhpcyBpcyBzbyB0aGF0IGlmIHRoZSBmaWxlIGhhc24ndAotCQkJLy8gYmVlbiBjaGVja2VkIG91dCBhbmQgaXQgaXMgdGhlIHNhbWUsIHdlIGRvbid0IHdhbnQgdG8gYm90aGVyIHRoZSB1c2VyLiBUaGlzIGlzIGJlY2F1c2UKLQkJCS8vIHdlIGRvbid0IGtub3cgaWYgdGhlIHVzZXIgaGFkIHNpbXBseSBicm93c2VkIHRoZSBzZWFyY2ggcGF0aCBvciBoYWQgYWN0dWFsbHkgY2hhbmdlZCBhbmQKLQkJCS8vIHNldCBpdCBiYWNrIHRvIHdoYXQgaXQgd2FzLiBJbiBlaXRoZXIgb2YgdGhvc2UgY2FzZXMgaXQgd291bGQgYmUgYSBib3RoZXIgdG8gYXNrIHRoZQotCQkJLy8gdXNlciB0byBjaGVja291dCB0aGUgZmlsZS4KLQkJCUlucHV0U3RyZWFtIGlzID0gZ2V0U2hhcmVkUHJvcGVydHkoUF9CRUFOSU5GT19TRUFSQ0hfUEFUSCk7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIEVOQ09ESU5HKTsKLQkJCQkJCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEwMDBdOwotCQkJCQkJU3RyaW5nQnVmZmVyIG9sZFByb3BlcnR5ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDAwKTsKLQkJCQkJCWludCByZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotCQkJCQkJd2hpbGUgKHJlYWQgIT0gLTEpIHsKLQkJCQkJCQlvbGRQcm9wZXJ0eS5hcHBlbmQoY2hhcnMsIDAsIHJlYWQpOwotCQkJCQkJCXJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob2xkUHJvcGVydHkudG9TdHJpbmcoKS5lcXVhbHMocHJvcGVydHkpKQotCQkJCQkJCXJldHVybjsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9IC8vIERpZG4ndCBjaGFuZ2UuCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNldFNoYXJlZFByb3BlcnR5KFBfQkVBTklORk9fU0VBUkNIX1BBVEgsIHByb3BlcnR5LCBtb25pdG9yKTsKLQkJfSBlbHNlCi0JCQlyZW1vdmVTaGFyZWRQcm9wZXJ0eShQX0JFQU5JTkZPX1NFQVJDSF9QQVRILCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHNldCBmb3IgYWxsIGphdmEgcGFja2FnZXMgaW4gdGhpcyBuYXR1cmUuCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gamF2YVJTZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWFya0FsbFN0YWxlKCkgewotCQkvLyBNYXJrIGFsbCBzdGFsZSBzbyB0aGF0IHRoZSByZWdpc3RyeSB3aWxsIGJlIHJlY3ljbGVkLgotCQlpZiAoZlJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCS8vIFdlIGhhdmUgYSByZWdpc3RyeSBydW5uaW5nLCB3ZSBuZWVkIHRvIGluZGljYXRlIHJlY3ljbGUgaXMgbmVlZGVkLgotCQkJZlN5bmNocm9uaXplci5nZXRBZGFwdGVyRmFjdG9yeSgpLm1hcmtBbGxTdGFsZSgpOwotCQkJLy8gTWFyayBhbGwgc3RhbGUuIE5leHQgdGltZSB3ZSBuZWVkIGFueXRoaW5nIGl0IHdpbGwgYmUgcmVjeWNsZWQuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlIHRoZSBmaWxlIG5hbWUgdG8gdXNlIGZvciBhIGdpdmVuIHNoYXJlZCBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVNoYXJlZFByb3BlcnR5RmlsZU5hbWUoUXVhbGlmaWVkTmFtZSBxTmFtZSkgewotCQlyZXR1cm4gcU5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgYSBzaGFyZWQgcHJvcGVydHkgb24gYSBwcm9qZWN0LiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIGFuc3dlcnMgbnVsbC4KLQkgKiBOb3RlIHRoYXQgaXQgaXMgb3J0aG9nb25hbCB0byBJUmVzb3VyY2UgcGVyc2lzdGVudCBwcm9wZXJ0aWVzLCBhbmQgY2xpZW50IGNvZGUgaGFzIHRvIGRlY2lkZQotCSAqIHdoaWNoIGZvcm0gb2Ygc3RvcmFnZSB0byB1c2UgYXBwcm9wcmlhdGVseS4gU2hhcmVkIHByb3BlcnRpZXMgcHJvZHVjZSByZWFsIHJlc291cmNlIGZpbGVzIHdoaWNoCi0JICogY2FuIGJlIHNoYXJlZCB0aHJvdWdoIGEgVkNNIG9udG8gYSBzZXJ2ZXIuIFBlcnNpc3RlbnQgcHJvcGVydGllcyBhcmUgbm90IHNoYXJlYWJsZS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRTaGFyZWRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmlsZSByc2NGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUocHJvcGVydHlGaWxlTmFtZSk7Ci0JCWlmIChyc2NGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIHJzY0ZpbGUuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlY29yZCBhIHNoYXJlZCBwZXJzaXN0ZW50IHByb3BlcnR5IG9udG8gYSBwcm9qZWN0LgotCSAqIE5vdGUgdGhhdCBpdCBpcyBvcnRob2dvbmFsIHRvIElSZXNvdXJjZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMsIGFuZCBjbGllbnQgY29kZSBoYXMgdG8gZGVjaWRlCi0JICogd2hpY2ggZm9ybSBvZiBzdG9yYWdlIHRvIHVzZSBhcHByb3ByaWF0ZWx5LiBTaGFyZWQgcHJvcGVydGllcyBwcm9kdWNlIHJlYWwgcmVzb3VyY2UgZmlsZXMgd2hpY2gKLQkgKiBjYW4gYmUgc2hhcmVkIHRocm91Z2ggYSBWQ00gb250byBhIHNlcnZlci4gUGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSBub3Qgc2hhcmVhYmxlLgotCSAqIAotCSAqIHNoYXJlZCBwcm9wZXJ0aWVzIGVuZCB1cCBpbiByZXNvdXJjZSBmaWxlcywgYW5kIHRodXMgY2Fubm90IGJlIG1vZGlmaWVkIGR1cmluZwotCSAqIGRlbHRhIG5vdGlmaWNhdGlvbnMgKGEgQ29yZUV4Y2VwdGlvbiB3b3VsZCB0aGVuIGJlIHRocm93bikuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2hhcmVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJSUZpbGUgcnNjRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKHByb3BlcnR5TmFtZSk7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2YWx1ZS5nZXRCeXRlcyhFTkNPRElORykpOwotCQkJLy8gdXBkYXRlIHRoZSByZXNvdXJjZSBjb250ZW50Ci0JCQlpZiAocnNjRmlsZS5leGlzdHMoKSkgewotCQkJCXJzY0ZpbGUuc2V0Q29udGVudHMoaW5wdXQsIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnNjRmlsZS5jcmVhdGUoaW5wdXQsIHRydWUsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHNoYXJlZCBwZXJzaXN0ZW50IHByb3BlcnR5IG9udG8gYSBwcm9qZWN0LgotCSAqIE5vdGUgdGhhdCBpdCBpcyBvcnRob2dvbmFsIHRvIElSZXNvdXJjZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMsIGFuZCBjbGllbnQgY29kZSBoYXMgdG8gZGVjaWRlCi0JICogd2hpY2ggZm9ybSBvZiBzdG9yYWdlIHRvIHVzZSBhcHByb3ByaWF0ZWx5LiBTaGFyZWQgcHJvcGVydGllcyBwcm9kdWNlIHJlYWwgcmVzb3VyY2UgZmlsZXMgd2hpY2gKLQkgKiBjYW4gYmUgc2hhcmVkIHRocm91Z2ggYSBWQ00gb250byBhIHNlcnZlci4gUGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSBub3Qgc2hhcmVhYmxlLgotCSAqIAotCSAqIHNoYXJlZCBwcm9wZXJ0aWVzIGVuZCB1cCBpbiByZXNvdXJjZSBmaWxlcywgYW5kIHRodXMgY2Fubm90IGJlIG1vZGlmaWVkIGR1cmluZwotCSAqIGRlbHRhIG5vdGlmaWNhdGlvbnMgKGEgQ29yZUV4Y2VwdGlvbiB3b3VsZCB0aGVuIGJlIHRocm93bikuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2hhcmVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSUZpbGUgcnNjRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKHByb3BlcnR5TmFtZSk7Ci0JCXJzY0ZpbGUuZGVsZXRlKHRydWUsIHRydWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbmZpZ3VyYXRpb24gY29udHJpYnV0b3IgdGhhdCBzZXRzIHVwIGEgdm0gdG8gYWxsb3cKLQkgKiBpbnRyb3NwZWN0aW9uLiBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoZSBhcHByb3ByaWF0ZSBwYXRocwotCSAqIGFyZSBpbiB0aGUgY2xhc3NwYXRoIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgYmVhbmluZm9zLCBhbmQKLQkgKiBpdCB3aWxsIHNldHVwIHRoZSBiZWFuaW5mbyBzZWFyY2ggcGF0aCBmb3IgdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIGdldENvbmZpZ3VyYXRpb25Db250cmlidXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3IoZ2V0U2VhcmNoUGF0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3IgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyIHsKLQotCQlwcml2YXRlIEJlYW5pbmZvc0RvYyBkb2M7Ci0JCUxpc3QgY29tcHV0ZWRTZWFyY2hQYXRoOwotCQkJCQotCQkvLyBUaGUgbmF0dXJlLiBJZiB0aGUgbmF0dXJlIGlzIG5vdCBzZXQgdGhlbiB0aGlzIGNvbnRyaWJ1dG9yIGlzIG9uZQotCQkvLyB1c2VkIGJ5IHNvbWUgb3RoZXIgbGF0ZXIgcHJveHkgcmVnaXN0cnkgdG8gZ2V0IHRoZSBiZWFuaW5mbyBjbGFzc2VzIGludG8gdGhlaXIgcGF0aHMuIEluIHRoYXQgY2FzZQotCQkvLyB3ZSBjYW4gZXhwZWN0IHRoZSBjb25maWcgaW5mbyB0byBiZSBpbiB0aGUgc2Vzc2lvbiB2YXJpYWJsZSBmb3Igb3VyIHVzZS4gT3RoZXJ3aXNlIHdlIHdpbGwgbmVlZCB0bwotCQkvLyBhZGQgaXQgaGVyZS4gQWxzbyBkb24ndCBzZXQgc2VhcmNocGF0aCBzdHVmZiBpZiBub3QgbmF0dXJlIGJlY2F1c2Ugb25seSB0aGUgYmVhbmluZm8gb25lIHdpbGwgZG8gaW50cm9zcGVjdGlvbi4KLQkJcHJpdmF0ZSBCZWFuaW5mb05hdHVyZSBuYXR1cmU7CQotCQkKLQkJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbzsKLQkJcHJpdmF0ZSBJQmVhbkluZm9Db250cmlidXRvcltdIGV4cGxpY2l0Q29udHJpYnV0b3JzOwotCi0JCXB1YmxpYyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3IoQmVhbmluZm9zRG9jIGRvYykgewotCQkJdGhpcy5kb2MgPSBkb2M7Ci0JCX0KLQotCQkvKgotCQkgKiBTZXQgdGhhdCB0aGlzIGlzIHRoZSBuYXR1cmUgY29udHJpYnV0b3IuIE5vdCBudWxsLCBtZWFucyB0aGF0IHRoaXMgaXMgdGhlIGNvbnRyaWJ1dG9yIGJlaW5nCi0JCSAqIHVzZWQgdG8gc2V0dXAgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvamVjdCdzIGJlYW5pbmZvIG5hdHVyZS4gbnVsbCAoZGVmYXVsdCkgbWVhbnMgdGhhdCB0aGlzCi0JCSAqIGlzIG9uZSBjcmVhdGVkIHRvIGFkZCB0byBzb21lIGVkaXRvcidzIHJlZ2lzdHJ5LgotCQkgKiAKLQkJICogTm90ZTogVGhpcyBNVVNUIGJlIHNldCBiZWZvcmUgaW5pdGlhbGl6ZSBpcyBjYWxsZWQgb3IgaXQgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuIElmIG5vdCBzZXQsIGl0IAotCQkgKiB3aWxsIGJlIGNvbnNpZGVyZWQgbm90IGZvciBCZWFuSW5mbyBuYXR1cmUgZGlyZWN0bHkuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXROYXR1cmUoQmVhbmluZm9OYXR1cmUgbmF0dXJlKSB7Ci0JCQl0aGlzLm5hdHVyZSA9IG5hdHVyZTsKLQkJCWlmIChuYXR1cmUgIT0gbnVsbCkKLQkJCQljb21wdXRlZFNlYXJjaFBhdGggPSBuZXcgQXJyYXlMaXN0KDMpOwkvLyBXZSB3aWxsIGJlIGdhdGhlcmluZyB0aGlzIGluZm8uCi0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2luaXRpYWxpemUob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbykgewotCQkJdGhpcy5pbmZvID0gaW5mbzsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0U2Vzc2lvblByb3BlcnR5KENPTkZJR19JTkZPX1NFU1NJT05fS0VZKSA9PSBudWxsKSB7Ci0JCQkJCS8vIFRPRE8gRm9yIG5vdyB3ZSB3aWxsIHJlYnVpbGQgZm9yIGVhY2ggdGltZSB3ZSBvcGVuIGEgcmVnaXN0cnksIGJ1dCBpdCBhY3R1YWxseSBpcyBvbmx5IG5lZWRlZCBpZiBhIGNsYXNzcGF0aAotCQkJCQkvLyBjaGFuZ2VzIGZvciBzb21lIHJlYXNvbi4gQXQgdGhhdCBwb2ludCB3ZSBjYW4gZ2V0IGl0IG91dCBvZiBoZXJlLgotCQkJCQkKLQkJCQkJY29tcHV0ZUJlYW5JbmZvQ29uZmlnSW5mbyhpbmZvKTsJCQkJCQotCQkJCX0gCi0JCQkJZXhwbGljaXRDb250cmlidXRvcnMgPSAoSUJlYW5JbmZvQ29udHJpYnV0b3JbXSkgaW5mby5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRTZXNzaW9uUHJvcGVydHkoQkVBTklORk9fQ09OVFJJQlVUT1JTX1NFU1NJT05fS0VZKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aHMoZmluYWwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCS8vIENvbnRyaWJ1dGUgZm9yIHRoaXMgcHJvamVjdAotCQkJY29udHJpYnV0ZUNsYXNzcGF0aHNGb3JQcm9qZWN0KGNvbnRyb2xsZXIsIGluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCksIGRvYywgdHJ1ZSk7Ci0JCQkJCQkKLQkJCWlmICghaW5mby5nZXRQcm9qZWN0UGF0aHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkvLyBSdW4gdGhyb3VnaCBhbGwgb2YgdGhlIHZpc2libGUgcHJvamVjdHMgYW5kIGNvbnRyaWJ1dGUgdGhlIGNsYXNzcGF0aHMgKHdoaWNoIGNvbWUgZnJvbSB0aGUgQmVhbkluZm8gZG9jcywgaWYgdGhleSBoYXZlIGFueSkuCi0JCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IGluZm8uZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCUl0ZXJhdG9yIHByb2pJdGVyID0gaW5mby5nZXRQcm9qZWN0UGF0aHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHByb2pJdGVyLmhhc05leHQoKSkgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwcm9qSXRlci5uZXh0KCk7Ci0JCQkJCWlmICgoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzID0gcm9vdC5maW5kTWVtYmVyKChJUGF0aCkgZW50cnkuZ2V0S2V5KCkpOwotCQkJCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICgoSVByb2plY3QpIHJlcykuaXNPcGVuKCkgJiYgQmVhbmluZm9OYXR1cmUuaGFzUnVudGltZSgoSVByb2plY3QpIHJlcykpCi0JCQkJCQkJY29udHJpYnV0ZUNsYXNzcGF0aHNGb3JQcm9qZWN0KGNvbnRyb2xsZXIsIChJUHJvamVjdCkgcmVzLCBCZWFuaW5mb05hdHVyZS5nZXRSdW50aW1lKChJUHJvamVjdCkgcmVzKQotCQkJCQkJCQkJLmdldFNlYXJjaFBhdGgoKSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQotCQkJCi0JCQlpZiAoIWluZm8uZ2V0Q29udGFpbmVySWRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gUnVuIHRocm91Z2ggYWxsIG9mIHRoZSB2aXNpYmxlIGNvbnRhaW5lciBpZHMgdGhhdCBhcmUgYXBwbGljYWJsZS4KLQkJCQlJdGVyYXRvciBjb250YWluZXJJZEl0ciA9IGluZm8uZ2V0Q29udGFpbmVySWRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChjb250YWluZXJJZEl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgY29udGFpbmVySWRJdHIubmV4dCgpOwotCQkJCQlpZiAoKChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJcHJvY2Vzc0JlYW5pbmZvRW50cmllcyhCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRDb250YWluZXJJZEJlYW5JbmZvcygoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKSksCi0JCQkJCQkJCWNvbnRyb2xsZXIsIGluZm8uZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICghaW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkvLyBSdW4gdGhyb3VnaCBhbGwgb2YgdGhlIHZpc2libGUgcGx1Z2luIGlkcyB0aGF0IGFyZSBhcHBsaWNhYmxlLgotCQkJCUl0ZXJhdG9yIHBsdWdpbklkSXRyID0gaW5mby5nZXRQbHVnaW5JZHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHBsdWdpbklkSXRyLmhhc05leHQoKSkgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBwbHVnaW5JZEl0ci5uZXh0KCk7Ci0JCQkJCWlmICgoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlwcm9jZXNzQmVhbmluZm9FbnRyaWVzKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbkJlYW5JbmZvcygoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKSksIGNvbnRyb2xsZXIsIGluZm8uZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICghaW5mby5nZXRDb250YWluZXJzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gUnVuIHRocm91Z2ggYWxsIG9mIHRoZSB2aXNpYmxlIGNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IgYW5kIGFzayB0aGVtIGZvciB0aGUgY29udHJpYnV0aW9ucy4KLQkJCQlJdGVyYXRvciBjb250YWluZXJJdHIgPSBpbmZvLmdldENvbnRhaW5lcnMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGNvbnRhaW5lckl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgY29udGFpbmVySXRyLm5leHQoKTsKLQkJCQkJaWYgKCgoQm9vbGVhbikgZW50cnkuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlmIChlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIElCZWFuSW5mb0NvbnRyaWJ1dG9yKQotCQkJCQkJCXByb2Nlc3NCZWFuaW5mb0VudHJpZXMoKChJQmVhbkluZm9Db250cmlidXRvcikgZW50cnkuZ2V0S2V5KCkpLmdldEJlYW5JbmZvRW50cnlDb250cmlidXRpb25zKGluZm8pLAotCQkJCQkJCQkJY29udHJvbGxlciwgaW5mby5nZXRKYXZhUHJvamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0JCQkKLQkJCQkKLQkJCS8vIEFuZCBmaW5hbGx5IHJ1biB0aHJvdWdoIHRoZSBleHBsaWNpdCBjb250cmlidXRvcnMuCQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBsaWNpdENvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIElCZWFuSW5mb0NvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZXhwbGljaXRDb250cmlidXRvcnNbaV07Ci0JCQkJcHJvY2Vzc0JlYW5pbmZvRW50cmllcyhjb250cmlidXRvci5nZXRCZWFuSW5mb0VudHJ5Q29udHJpYnV0aW9ucyhpbmZvKSwgY29udHJvbGxlciwgaW5mby5nZXRKYXZhUHJvamVjdCgpKTsKLQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKSB7Ci0JCQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkJLy8gZG8gbm90aGluZy4gYnkgZGVmYXVsdCBwbGF0Zm9ybSBsb2dzLgotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHs7Ci0JCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkJKChJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKSBjb250cmlidXRvcikuY29udHJpYnV0ZUNsYXNzcGF0aHMoY29udHJvbGxlcik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gQWRkIHRoZSBjb21tb24gYW5kIGJlYW5pbmZvdm0uamFyIGFuZCBhbnkgbmxzIHRvIHRoZSBlbmQgb2YgdGhlIGNsYXNzcGF0aC4KLQkJCWNvbnRyb2xsZXIuY29udHJpYnV0ZUNsYXNzcGF0aChCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKSwgImJlYW5pbmZvY29tbW9uLmphciIsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIEFkZCB0aGUgYmVhbmluZm92bS5qYXIgYW5kIGFueSBubHMgdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoLgotCQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAidm0vYmVhbmluZm92bS5qYXIiLCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuQVBQRU5EX1VTRVJfQ0xBU1NQQVRILCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgZ2V0KElDbGFzc3BhdGhFbnRyeVtdIGFycmF5LCBTZWFyY2hwYXRoRW50cnkgc2UpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoYXJyYXlbaV0uZ2V0RW50cnlLaW5kKCkgPT0gc2UuZ2V0S2luZCgpICYmIGFycmF5W2ldLmdldFBhdGgoKS5lcXVhbHMoc2UuZ2V0UGF0aCgpKSkKLQkJCQkJcmV0dXJuIGFycmF5W2ldOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQmVhbmluZm9zRG9jRW50cnlbXSBFTVBUWV9FTlRSSUVTID0gbmV3IElCZWFuaW5mb3NEb2NFbnRyeVswXTsKLQkJCi0JCS8qCi0JCSAqIENvbnRyaWJ1dGUgY2xhc3NwYXRocyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LiBJZiBkb2MgaXMgcGFzc2VkIGluLCB0aGVuIHRoaXMgaXMgdGhlIHRvcCBsZXZlbCBhbmQKLQkJICogYWxsIHNob3VsZCBiZSBhZGRlZC4gSWYgbm8gZG9jLCB0aGVuIHRoaXMgaXMgcHJlLXJlcSdkIHByb2plY3QsIGFuZCB0aGVuIHdlIHdpbGwgaGFuZGxlIGV4cG9ydGVkIGVudHJpZXMgb25seS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGhzRm9yUHJvamVjdCgKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyLAotCQkJSVByb2plY3QgcHJvamVjdCwKLQkJCUJlYW5pbmZvc0RvYyBkb2MsCi0JCQlib29sZWFuIHRvcGxldmVsUHJvamVjdCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gcmF3UGF0aCA9IGpQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCi0JCQkvLyBTZWFyY2ggcGF0aCBvZiB0aGlzIHByb2plY3QKLQkJCUlCZWFuaW5mb3NEb2NFbnRyeVtdIGVudHJpZXMgPSAoZG9jICE9IG51bGwpID8gZG9jLmdldFNlYXJjaHBhdGgoKSA6IEVNUFRZX0VOVFJJRVM7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCUlCZWFuaW5mb3NEb2NFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJaWYgKGVudHJ5IGluc3RhbmNlb2YgQmVhbmluZm9FbnRyeSkgewotCQkJCQlCZWFuaW5mb0VudHJ5IGJlID0gKEJlYW5pbmZvRW50cnkpIGVudHJ5OwotCQkJCQlpZiAodG9wbGV2ZWxQcm9qZWN0IHx8IGJlLmlzRXhwb3J0ZWQoKSkgewotCQkJCQkJLy8gRmlyc3QgcHJvamVjdCBvciB0aGlzIGlzIGFuIGV4cG9ydGVkIGJlYW5pbmZvLCBzbyB3ZSBwcm9jZXNzIGl0LgotCQkJCQkJcHJvY2Vzc0JlYW5pbmZvRW50cnkoYmUsIGNvbnRyb2xsZXIsIGpQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAobmF0dXJlICE9IG51bGwpewotCQkJCQkvLyBKdXN0IGEgc2VhcmNoIHBhdGggZW50cnkuIFRoZXJlIGlzIG5vIGJlYW5pbmZvIGphciB0byBwaWNrIHVwLgotCQkJCQkvLyBXZSBoYXZlIGEgbmF0dXJlLCBzbyB3ZSBwcm9jZXNzIHNlYXJjaCBwYXRoLgotCQkJCQlTZWFyY2hwYXRoRW50cnkgc2UgPSAoU2VhcmNocGF0aEVudHJ5KSBlbnRyeTsKLQkJCQkJaWYgKCF0b3BsZXZlbFByb2plY3QpIHsKLQkJCQkJCS8vIFdlIGFyZSBpbiBhIG5lc3RlZCBwcm9qZWN0LCBmaW5kIHRoZSByYXcgY2xhc3NwYXRoIGVudHJ5IHRvIHNlZQotCQkJCQkJLy8gaWYgdGhpcyBlbnRyeSBpcyBleHBvcnRlZC4gT25seSBkbyBpdCBpZiBleHBvcnRlZC4gKE5vdGU6IGV4cG9ydGVkIGlzIG9ubHkgdXNlZCBvbiBub24tc291cmNlLiBTb3VyY2UgYXJlIGFsd2F5cyBleHBvcnRlZCkuCi0JCQkJCQlJQ2xhc3NwYXRoRW50cnkgY3BlID0gZ2V0KHJhd1BhdGgsIHNlKTsKLQkJCQkJCWlmIChjcGUgPT0gbnVsbCB8fCAoY3BlLmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFICYmICFjcGUuaXNFeHBvcnRlZCgpKSkgewotCQkJCQkJCWNvbnRpbnVlOyAvLyBOb3QgZXhpc3Qgb3Igbm90IGV4cG9ydGVkLCBzbyB3ZSBkb24ndCB3YW50IGl0IGhlcmUgZWl0aGVyLgotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIHBrZyA9IHNlLmdldFBhY2thZ2UoKTsKLQkJCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCQkvLyBFeHBsaWNpdCBzZWFyY2ggcGF0aAotCQkJCQkJaWYgKCFjb21wdXRlZFNlYXJjaFBhdGguY29udGFpbnMocGtnKSkKLQkJCQkJCQljb21wdXRlZFNlYXJjaFBhdGguYWRkKHBrZyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBXZSBubyBsb25nZXIgYWxsb3cgdGhpcywgYnV0IGp1c3QgdG8gYmUgb24gc2FmZSBzaWRlIHdlIHRlc3QgZm9yIGl0LgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0JlYW5pbmZvRW50cmllcygKLQkJCUJlYW5pbmZvRW50cnlbXSBlbnRyaWVzLAotCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIsCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAoZW50cmllcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQkJCQlwcm9jZXNzQmVhbmluZm9FbnRyeShlbnRyaWVzW2ldLCBjb250cm9sbGVyLCBqYXZhUHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQmVhbmluZm9FbnRyeSgKLQkJCUJlYW5pbmZvRW50cnkgZW50cnksCi0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIgY29udHJvbGxlciwKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCU9iamVjdFtdIGNwcyA9IGVudHJ5LmdldENsYXNzcGF0aChqYXZhUHJvamVjdCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNwcy5sZW5ndGg7IGorKykgewotCQkJCU9iamVjdCBjcCA9IGNwc1tqXTsKLQkJCQlpZiAoY3AgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQkJY29udHJvbGxlci5jb250cmlidXRlUHJvamVjdCgoSVByb2plY3QpIGNwKTsKLQkJCQllbHNlIGlmIChjcCBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aFRvVVJMKChTdHJpbmcpIGNwKSwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9VU0VSX0NMQVNTUEFUSCk7Ci0JCQkJZWxzZSBpZiAoY3AgaW5zdGFuY2VvZiBJUGF0aCkgewotCQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBjcDsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwYXRoLnNlZ21lbnQoMCkpOwotCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgoYnVuZGxlLCBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSksIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgsIHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG5hdHVyZSAhPSBudWxsKSB7Ci0JCQkJLy8gTm93IGFkZCBpbiB0aGUgcGFja2FnZSBuYW1lcy4KLQkJCQlTZWFyY2hwYXRoRW50cnlbXSBzZWVzID0gZW50cnkuZ2V0U2VhcmNoUGF0aHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJU2VhcmNocGF0aEVudHJ5IHNlYXJjaHBhdGhFbnRyeSA9IHNlZXNbal07Ci0JCQkJCWlmICghY29tcHV0ZWRTZWFyY2hQYXRoLmNvbnRhaW5zKHNlYXJjaHBhdGhFbnRyeS5nZXRQYWNrYWdlKCkpKQotCQkJCQkJY29tcHV0ZWRTZWFyY2hQYXRoLmFkZChzZWFyY2hwYXRoRW50cnkuZ2V0UGFja2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db25maWd1cmF0aW9uKGZpbmFsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGxpY2l0Q29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyBkbyBub3RoaW5nLiBieSBkZWZhdWx0IHBsYXRmb3JtIGxvZ3MuCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCUlCZWFuSW5mb0NvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZXhwbGljaXRDb250cmlidXRvcnNbaWldOwotCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkoKElDb25maWd1cmF0aW9uQ29udHJpYnV0b3IpIGNvbnRyaWJ1dG9yKS5jb250cmlidXRlVG9Db25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1JlZ2lzdHJ5KGZpbmFsIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlpZiAobmF0dXJlICE9IG51bGwpCi0JCQkJbmF0dXJlLnNldFByb3h5U2VhcmNoUGF0aChyZWdpc3RyeSwgY29tcHV0ZWRTZWFyY2hQYXRoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwbGljaXRDb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCS8vIGRvIG5vdGhpbmcuIGJ5IGRlZmF1bHQgcGxhdGZvcm0gbG9ncy4KLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJSUJlYW5JbmZvQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBleHBsaWNpdENvbnRyaWJ1dG9yc1tpaV07Ci0JCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKQotCQkJCQkJCSgoSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikgY29udHJpYnV0b3IpLmNvbnRyaWJ1dGVUb1JlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQkJCQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb1Byb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9Qcm94eUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY4MmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9CZWFuaW5mb1Byb3h5Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQmVhbmluZm9Qcm94eUNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGhvbGRzIHRoZSBwcm94eSBjb25zdGFudHMgZm9yIGFjY2VzcyBpbiBiZWFuaW5mby4gSXQgaXMgY3JlYXRlZCBvbiBhIHBlci1yZWdpc3RyeSBiYXNpcyBhbmQgc3RvcmVkIGluIHRoZSBjb25zdGFudHMgc2VjdGlvbiBvZiB0aGUgcmVnaXN0cnkgc28KLSAqIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYXMgbmVlZGVkLgotICogPHA+Ci0gKiBUbyBnYWluIGFjY2VzcyB0byB0aGVzZSBjb25zdGFudHMsIHVzZSB0aGUgc3RhdGljIGFjY2Vzc29yIG1ldGhvZCAiZ2V0Q29uc3RhbnRzKCkiIHNvIHRoYXQgdGhlIGluc3RhbmNlIGlzIG5vdCBjcmVhdGVkIHVudGlsIGFjdHVhbGx5IG5lZWRlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdJU1RSWV9LRVkgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwcml2YXRlIGZpbmFsIElNZXRob2RQcm94eSBpbnRyb3NwZWN0UHJveHk7Ci0KLQlwcml2YXRlIGZpbmFsIElNZXRob2RQcm94eSBnZXRCZWFuSW5mb1NlYXJjaFBhdGhQcm94eTsKLQotCXByaXZhdGUgZmluYWwgSU1ldGhvZFByb3h5IHNldEJlYW5JbmZvU2VhcmNoUGF0aFByb3h5OwotCi0JcHJpdmF0ZSBmaW5hbCBJTWV0aG9kUHJveHkgc2VuZEJlYW5JbmZvUHJveHk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbnN0YW50cyBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvUHJveHlDb25zdGFudHMgZ2V0Q29uc3RhbnRzKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCUJlYW5pbmZvUHJveHlDb25zdGFudHMgY29uc3RhbnRzID0gKEJlYW5pbmZvUHJveHlDb25zdGFudHMpIHJlZ2lzdHJ5LmdldENvbnN0YW50cyhSRUdJU1RSWV9LRVkpOwotCQlpZiAoY29uc3RhbnRzID09IG51bGwpCi0JCQlyZWdpc3RyeS5yZWdpc3RlckNvbnN0YW50cyhSRUdJU1RSWV9LRVksIGNvbnN0YW50cyA9IG5ldyBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzKHJlZ2lzdHJ5KSk7Ci0JCXJldHVybiBjb25zdGFudHM7Ci0JfQotCi0JcHJpdmF0ZSBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0KLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCi0JCUlCZWFuVHlwZVByb3h5IGludHJvc3BlY3RvciA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYmVhbnMuSW50cm9zcGVjdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkgPSBpbnRyb3NwZWN0b3IuZ2V0TWV0aG9kUHJveHkoImdldEJlYW5JbmZvU2VhcmNoUGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCXNldEJlYW5JbmZvU2VhcmNoUGF0aFByb3h5ID0gaW50cm9zcGVjdG9yLmdldE1ldGhvZFByb3h5KCJzZXRCZWFuSW5mb1NlYXJjaFBhdGgiLCAiW0xqYXZhLmxhbmcuU3RyaW5nOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlJQmVhblR5cGVQcm94eSBtb2RlbGluZ0JlYW5pbmZvID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtLk1vZGVsaW5nQmVhbkluZm8iKTsvLyROT04tTkxTLTEkCi0JCWludHJvc3BlY3RQcm94eSA9IG1vZGVsaW5nQmVhbmluZm8uZ2V0TWV0aG9kUHJveHkoImludHJvc3BlY3QiLCBuZXcgU3RyaW5nW10geyAiamF2YS5sYW5nLkNsYXNzIiwgImJvb2xlYW4iLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0KLQkJc2VuZEJlYW5JbmZvUHJveHkgPSBtb2RlbGluZ0JlYW5pbmZvLmdldE1ldGhvZFByb3h5KCJzZW5kIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2VuZEJlYW5EZWNvcmF0b3IgbWV0aG9kIHByb3h5IGZyb20gTW9kZWxpbmdCZWFuSW5mby4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRTZW5kQmVhbkluZm9Qcm94eSgpIHsKLQkJcmV0dXJuIHNlbmRCZWFuSW5mb1Byb3h5OwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGdldEJlYW5JbmZvU2VhcmNoUGF0aCBtZXRob2QgcHJveHkgZnJvbSBJbnRyb3NwZWN0b3IuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0R2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKSB7Ci0JCXJldHVybiBnZXRCZWFuSW5mb1NlYXJjaFBhdGhQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNldEJlYW5JbmZvU2VhcmNoUGF0aCBtZXRob2QgcHJveHkgZnJvbSBJbnRyb3NwZWN0b3IuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKSB7Ci0JCXJldHVybiBzZXRCZWFuSW5mb1NlYXJjaFBhdGhQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGludHJvc3BlY3QgbWV0aG9kIHByb3h5IGZyb20gTW9kZWxpbmdCZWFuSW5mby4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRJbnRyb3NwZWN0UHJveHkoKSB7Ci0JCXJldHVybiBpbnRyb3NwZWN0UHJveHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0JlYW5pbmZvU3VwZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9TdXBlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyZDhiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQmVhbmluZm9TdXBlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvU3VwZXJBZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzggJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN1cGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotCi0vKioKLSAqIFVzZWQgdG8ga25vdyB3aGVuIGV2ZW50cyBvciBhbnkgb2YgdGhlIHN1cGVyIGNsYXNzZXMgY2hhbmdlIHNvCi0gKiB0aGF0IHdlIGNhbiByZS1jb25zdHJ1Y3Qgb3VyIGFsbCBldmVudHMgbGlzdCBuZXh0IHRpbWUgd2UgbmVlZCBpdC4KLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEJlYW5pbmZvU3VwZXJBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX0tFWSA9IEJlYW5pbmZvU3VwZXJBZGFwdGVyLmNsYXNzOwotCi0JcHJpdmF0ZSBib29sZWFuIGFsbEV2ZW50c0NvbGxlY3Rpb25Nb2RpZmllZCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGFsbFByb3BlcnRpZXNDb2xsZWN0aW9uTW9kaWZpZWQgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBhbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkID0gdHJ1ZTsKLQotCXB1YmxpYyBCZWFuaW5mb1N1cGVyQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUikKLQkJCXNldEZsYWdzKG1zZy5nZXRGZWF0dXJlSUQoSmF2YUNsYXNzLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBbGxFdmVudHNDb2xsZWN0aW9uTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBhbGxFdmVudHNDb2xsZWN0aW9uTW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxsRXZlbnRzQ29sbGVjdGlvbk1vZGlmaWVkKGJvb2xlYW4gbmV3RXZlbnRzTW9kaWZpZWQpIHsKLQkJYWxsRXZlbnRzQ29sbGVjdGlvbk1vZGlmaWVkID0gbmV3RXZlbnRzTW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKCkgewotCQlyZXR1cm4gYWxsT3BlcmF0aW9uc0NvbGxlY3Rpb25Nb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKGJvb2xlYW4gbmV3T3BlcmF0aW9uc01vZGlmaWVkKSB7Ci0JCWFsbE9wZXJhdGlvbnNDb2xsZWN0aW9uTW9kaWZpZWQgPSBuZXdPcGVyYXRpb25zTW9kaWZpZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFsbFByb3BlcnRpZXNDb2xsZWN0aW9uTW9kaWZpZWQoYm9vbGVhbiBhbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKSB7Ci0JCXRoaXMuYWxsUHJvcGVydGllc0NvbGxlY3Rpb25Nb2RpZmllZCA9IGFsbFByb3BlcnRpZXNDb2xsZWN0aW9uTW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBbGxQcm9wZXJ0aWVzQ29sbGVjdGlvbk1vZGlmaWVkKCkgewotCQlyZXR1cm4gYWxsUHJvcGVydGllc0NvbGxlY3Rpb25Nb2RpZmllZDsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U3ViY2xhc3NlcygpIHsKLQkJLy8gR2V0IHRoZW0gZnJvbSB0aGUgRVN1cGVyQWRhcHRlci4gRWFzaWVzdCB0byBkby4KLQkJRVN1cGVyQWRhcHRlciBlYSA9ICgoSmF2YUNsYXNzSW1wbCkgZ2V0VGFyZ2V0KCkpLmdldEVTdXBlckFkYXB0ZXIoKTsKLQkJcmV0dXJuIGVhLmdldFN1YmNsYXNzZXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX0tFWS5lcXVhbHModHlwZSk7Ci0JfQotCi0Jdm9pZCBzZXRGbGFncyhpbnQgZmVhdHVyZUlkKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlkKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUyA6Ci0JCQkJc2V0QWxsRXZlbnRzQ29sbGVjdGlvbk1vZGlmaWVkKHRydWUpOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FT1BFUkFUSU9OUzoKLQkJCQlzZXRBbGxPcGVyYXRpb25zQ29sbGVjdGlvbk1vZGlmaWVkKHRydWUpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VTVVBFUl9UWVBFUzoKLQkJCQlzZXRBbGxFdmVudHNDb2xsZWN0aW9uTW9kaWZpZWQodHJ1ZSk7Ci0JCQkJc2V0QWxsUHJvcGVydGllc0NvbGxlY3Rpb25Nb2RpZmllZCh0cnVlKTsKLQkJCQlicmVhazsJCQkJCi0JCQkJCi0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCXNldEFsbFByb3BlcnRpZXNDb2xsZWN0aW9uTW9kaWZpZWQodHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlJdGVyYXRvciBpID0gZ2V0U3ViY2xhc3NlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJTm90aWZpZXIgbiA9IChOb3RpZmllcikgaS5uZXh0KCk7Ci0JCQlCZWFuaW5mb1N1cGVyQWRhcHRlciBhID0gKEJlYW5pbmZvU3VwZXJBZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKG4sIEFEQVBURVJfS0VZKTsKLQkJCWlmIChhICE9IG51bGwpCi0JCQkJYS5zZXRGbGFncyhmZWF0dXJlSWQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NzYxMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0NyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IENyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0gCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IEJlYW5pbmZvTmF0dXJlIHRvIGhhbmRsZSB0aGUgY3JlYXRpb24gb2YgdGhlIHJlZ2lzdHJ5LAotICogVGhpcyBjbGFzcyB3aWxsIGJlIGEgc2luZ2xldG9uLiBJdCBpcyBuZWVkZWQgdG8gaGFuZGxlIGlmIFVJIGFjdGl2ZSB3aXRob3V0Ci0gKiByZXF1aXJpbmcgVUkgcGx1Z2luLiAoU28gaGVhZGxlc3Mgd2lsbCB3b3JrIHRvbykuIFRoZSBzdWJjbGFzcyA8Y29kZT5VSUNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlcjwvY29kZT4KLSAqIHdpbGwgYmUgaW5zdGFudGlhdGVkIGluIGNhc2Ugb2YgVUkgYWN0aXZlLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLWNsYXNzIENyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyIGpvYkhhbmRsZXIgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVSZWdpc3RyeShCZWFuaW5mb05hdHVyZSBuYXR1cmUpIHsKLQkJc3luY2hyb25pemVkIChDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIuY2xhc3MpIHsKLQkJCWlmIChqb2JIYW5kbGVyID09IG51bGwpIHsKLQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51aSIpICE9IG51bGwpIHsJLy8kTk9OLU5MUy0xJAotCQkJCQl0cnkgewotCQkJCQkJLy8gVGhlcmUgaXMgYSBVSSwgaXQgbWF5IG5vdCBiZSBhY3RpdmUsIGJ1dCBicmluZyBpbiBVSUNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlciB0byBkbyB0aGUKLQkJCQkJCS8vIGFjdHVhbCB3b3JrIHNpbmNlIGl0IGNhbiByZWZlcmVuY2UgdGhlIFVJLgotCQkJCQkJam9iSGFuZGxlciA9IChDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIpIENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5VSUNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlciIpLm5ld0luc3RhbmNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlqb2JIYW5kbGVyID0gbmV3IENyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlcigpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWpvYkhhbmRsZXIgPSBuZXcgQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyKCk7Ci0JCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJam9iSGFuZGxlciA9IG5ldyBDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gU2VlIGlmIEF1dG9idWlsZCBzbGVlcGluZyBvciB3YWl0aW5nLiBUaGlzIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gZm9yIHVzLiBXZSBjYW4ndCB3YWl0IGZvciBpdAotCQkvLyBiZWNhdXNlIHdlIG1heSBhbHJlYWR5IGhhdmUgdGhlIGJ1aWxkIHJ1bGUgbG9ja2VkIGJ5IG91ciB0aHJlYWQuIE5vIHdheSBvZiB0ZXN0aW5nIHRoaXMgaWYgYmVnaW5SdWxlIHdhcyB1c2VkLgotCQkvLyBXZSBjYW4gdGVzdCBpZiB3ZSBhcmUgYSBidWlsZCBqb2IgKG5vdCBhbiBpbmxpbmUgYnVpbGQpLCBhbmQgaWYgc28sIGp1c3QgZ28gb24uCi0JCS8vIE1heWJlIHdlIGNhbiBmaWd1cmUgb3V0IGluIGZ1dHVyZSBpZiB3ZSBmaW5kIHJhY2UgY29uZGl0aW9uIGhhcHBlbnMgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUuCi0JCUlKb2JNYW5hZ2VyIGpvYk1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCk7Ci0JCUpvYiBjdXJyZW50Sm9iID0gam9iTWFuYWdlci5jdXJyZW50Sm9iKCk7Ci0JCWlmIChjdXJyZW50Sm9iID09IG51bGwgfHwgKCFjdXJyZW50Sm9iLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQpICYmICFjdXJyZW50Sm9iLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCkpKSB7Ci0JCQkvLyBTZWUgaWYgYXV0b2pvYiBpcyB3YWl0aW5nIG9yIHNsZWVwaW5nLgotCQkJLy8gR2l2ZSBpdCB1cCB0byBhIHNlY29uZCBhdCAuMiBzZWNvbmQgaW50ZXJ2YWxzIHRvIHRyeSAoaS5lLiA1IHRyaWVzKQotCQkJaW50IHRyaWVzID0gNTsKLQkJCXdoaWxlIChpc0F1dG9XYWl0aW5nKCkgJiYgLS10cmllcz4wKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDIwMCk7CS8vIFdhaXQganVzdCAuMiBzZWNvbmRzIHRvIGdpdmUgYnVpbGQgYSBjaGFuY2UgdG8gc3RhcnQuIElmIGl0IGlzIHN0aWxsIG5vdCBzdGFydGVkLCB0aGVuIGp1c3QgZ28gb24uCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWlmICh0cmllcz09MCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKQotCQkJCQlsb2dnZXIubG9nKCJCdWlsZCBqb2Igd2FpdGluZyB3aGVuIHRyeWluZyB0byBzdGFydCBiZWFuaW5mbyByZWdpc3RyeS4gUG9zc2libGUgcmFjZS4iLCBMZXZlbC5XQVJOSU5HKTsJLy8gJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlqb2JIYW5kbGVyLnByb2Nlc3NDcmVhdGVSZWdpc3RyeShuYXR1cmUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdXRvV2FpdGluZygpIHsKLQkJSm9iW10gYXV0b2pvYnMgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuZmluZChSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF1dG9qb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgc3RhdGUgPSBhdXRvam9ic1tpXS5nZXRTdGF0ZSgpOwotCQkJaWYgKHN0YXRlID09IEpvYi5XQUlUSU5HIHx8IHN0YXRlID09IEpvYi5TTEVFUElORykgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGNyZWF0ZSBvZiB0aGUgcmVnaXN0cnkuIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8KLQkgKiBkbyB3aGF0IHRoZSBVSSBuZWVkcy4gVGhlIFVJIGltcGxpbWVudGF0aW9uIHNob3VsZCBjYWxsIGRvQ3JlYXRlUmVnaXN0cnkgYXQgdGhlCi0JICogYXBwcm9wcmlhdGUgdGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmF0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NyZWF0ZVJlZ2lzdHJ5KGZpbmFsIEJlYW5pbmZvTmF0dXJlIG5hdHVyZSkgewotCQlJSm9iTWFuYWdlciBqb2JNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpOwotCQlJU2NoZWR1bGluZ1J1bGUgYnVpbGRSdWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuYnVpbGRSdWxlKCk7Ci0JCWJvb2xlYW4gZ290UnVsZUxvY2FsbHkgPSB0cnVlOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlqb2JNYW5hZ2VyLmJlZ2luUnVsZShidWlsZFJ1bGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQlnb3RSdWxlTG9jYWxseSA9IGZhbHNlOwkvLyBUaGlzIHRocmVhZCBhbHJlYWR5IGhhZCBhIHJ1bGUsIGFuZCBpdCBjb25mbGljdGVkIHdpdGggdGhlIGJ1aWxkIHJ1bGUsIHNvIHdlIG5lZWQgdG8gc3Bhd24gb2ZmLgotCQkJfQotCQkJaWYgKGdvdFJ1bGVMb2NhbGx5KQotCQkJCWRvQ3JlYXRlUmVnaXN0cnkobmF0dXJlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWpvYk1hbmFnZXIuZW5kUnVsZShidWlsZFJ1bGUpOwkvLyBXaGV0aGVyIHdlIGdvdCB0aGUgcnVsZSBvciBub3QsIHdlIG11c3QgZG8gZW5kcnVsZS4KLQkJfQotCQkKLQkJaWYgKCFnb3RSdWxlTG9jYWxseSkgewotCQkJLy8gU3Bhd24gb2ZmIHRvIGEgam9iIGFuZCB3YWl0IGZvciBpdC4gSG9wZWZ1bGx5IHdlIGRvbid0IGhhdmUgYSBkZWFkbG9jayBzb21ld2hlcmUuCi0JCQlKb2IgZG9DcmVhdGVKb2IgPSBuZXcgSm9iKEJlYW5JbmZvQWRhcHRlck1lc3NhZ2VzLlVJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyX1N0YXJ0QmVhbmluZm9SZWdpc3RyeSkgeyAKLQotCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJZG9DcmVhdGVSZWdpc3RyeShuYXR1cmUsIG1vbml0b3IpOwotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OwotCQkJZG9DcmVhdGVKb2Iuc2NoZWR1bGUoKTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZG9DcmVhdGVKb2Iuam9pbigpOwotCQkJCQlicmVhazsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQkKLQkvKgotCSAqIERvIHRoZSBjcmVhdGlvbi4gSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgYnVpbGQgcnVsZSBoYXMgYWxyZWFkeSBiZWVuIGdpdmVuIHRvIHRoaXMgdGhyZWFkLgotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBidWlsZCBydWxlIGJlIGdpdmVuIHRvIHRoaXMgdGhyZWFkLiBUaGlzIGlzIHNvIHRoYXQgYSBidWlsZCB3b24ndAotCSAqIHN0YXJ0IHRyeWluZyB0byBjcmVhdGUgdGhlIHNhbWUgcmVnaXN0cnkgKHdoaWNoIGhhcyBoYXBwZW5lZCBpbiB0aGUgcGFzdCkgYXQgdGhlIHNhbWUgdGltZQotCSAqIGEgZGlmZmVyZW50IHRocmVhZCB3YXMgdHJ5aW5nIHRvIHN0YXJ0IHRoZSByZWdpc3RyeS4gWW91IHdvdWxkIGVpdGhlciBoYXZlIGEgZGVhZGxvY2ssIG9yIAotCSAqIGEgcmFjZSBhbmQgZ2V0IHR3byBkaWZmZXJlbnQgcmVnaXN0cmllcyBzdGFydGVkLgotCSAqIAotCSAqIFRoZSBidWlsZCBydWxlIGFsc28gbWVhbnMgdGhhdCBhbGwgYmVhbmluZm8gcmVnaXN0cnkgY3JlYXRpb25zIHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgaGF2ZQotCSAqIGEgcmFjZSBjb25kaXRpb24uIFRoZSB1bmZvcnR1bmF0ZSBwYXJ0IGlzIHRoYXQgdHdvIGluZGVwZW5kZW50IHByb2plY3QncyByZWdpc3RyaWVzIGNhbid0IGJlCi0JICogY3JlYXRlZCBhdCBzYW1lIHRpbWUuIEJ1dCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdGhlIGJ1aWxkIHJ1bGUuIFdlIGNhbid0IGFsbG93IHRoZSBidWlsZHMsIHNvCi0JICogd2UgbmVlZCB0byBzdG9wIGFsbCBwYXJhbGxlbCBiZWFuaW5mbyByZWdpc3RyeSBjcmVhdGlvbnMuCi0JICogCi0JICogQHBhcmFtIG5hdHVyZQotCSAqIEBwYXJhbSBwbQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGRvQ3JlYXRlUmVnaXN0cnkoQmVhbmluZm9OYXR1cmUgbmF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCXBtLmJlZ2luVGFzaygiIiwgMTAwKTsJLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJbmF0dXJlLmNyZWF0ZVJlZ2lzdHJ5KG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwkKLQkJfSBmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0RPTVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0RPTVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjg3NzUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9ET01SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzOwotLyoKLSAqICAkUkNTZmlsZTogRE9NUmVhZGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLQotLyoqCi0gKiBUaGUgaW50ZXJuYWwgY2xhc3MgZm9yIHJlYWRpbmcgZG9tIGVsZW1lbnRzLgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1jbGFzcyBET01SZWFkZXIgaW1wbGVtZW50cyBJUmVhZGVyIHsKLQkKLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZHJlbihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBOb2RlKSA/ICgoTm9kZSkgbm9kZSkuZ2V0Q2hpbGROb2RlcygpIDogbnVsbDsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0TGVuZ3RoKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aChPYmplY3Qgbm9kZUxpc3QpIHsKLQkJcmV0dXJuIChub2RlTGlzdCBpbnN0YW5jZW9mIE5vZGVMaXN0KSA/ICgoTm9kZUxpc3QpIG5vZGVMaXN0KS5nZXRMZW5ndGgoKSA6IDA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0SXRlbShPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEl0ZW0oT2JqZWN0IG5vZGVMaXN0LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChub2RlTGlzdCBpbnN0YW5jZW9mIE5vZGVMaXN0KSA/ICgoTm9kZUxpc3QpIG5vZGVMaXN0KS5pdGVtKGluZGV4KSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjaXNOb2RlVHlwZUVsZW1lbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9kZVR5cGVFbGVtZW50KE9iamVjdCBub2RlKSB7Ci0JCXJldHVybiAobm9kZSBpbnN0YW5jZW9mIE5vZGUpID8gKChOb2RlKSBub2RlKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFIDogZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0Tm9kZU5hbWUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoT2JqZWN0IG5vZGUpIHsKLQkJcmV0dXJuIChub2RlIGluc3RhbmNlb2YgTm9kZSkgPyAoKE5vZGUpIG5vZGUpLmdldE5vZGVOYW1lKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogQHNlZSBJUmVhZGVyI2dldEF0dHJpYnV0ZShPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgJiYgKChFbGVtZW50KSBlbGVtZW50KS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPyAoKEVsZW1lbnQpIGVsZW1lbnQpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvSVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL0lSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2YmY2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvSVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnM7Ci0vKgotICogICRSQ1NmaWxlOiBJUmVhZGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotLyoqCi0gKiBUaGlzIGlzIGludGVybmFsIGludGVyZmFjZSBmb3IgcmVhZGluZyBiZWFuaW5mb0NvbmZpZyBlaXRoZXIgdGhyb3VnaCBJQ29uZmlndXJhdGlvbkVsZW1lbnRzIG9yCi0gKiB3My5kb20uTm9kZXMuIFRoaXMgaXMgYmVjYXVzZSB3aGVuIHJlYWRpbmcgdGhlIC5iZWFuaW5mb0NvbmZpZyB3ZSB3aWxsIGJlIHVzaW5nIE5vZGVzLCBidXQKLSAqIHdoZW4gcmVhZGluZyBjb25maWdzIGZyb20gcmVnaXN0ZXJlZCBleHRlbnNpb25zIHRoZXkgd2lsbCBiZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRzLgotICogQHZlcnNpb24gCTEuMAotICogVE9ETyBOZWVkIHRvIG1vdmUgdG8gY29yZSB3aGVuIHdlIG1ha2UgdGhpbmdzIEFQSS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVhZGVyIHsKLQkKLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkcmVuKE9iamVjdCBub2RlKTsKLQlwdWJsaWMgaW50IGdldExlbmd0aChPYmplY3Qgbm9kZUxpc3QpOwotCXB1YmxpYyBPYmplY3QgZ2V0SXRlbShPYmplY3Qgbm9kZUxpc3QsIGludCBpbmRleCk7Ci0JcHVibGljIGJvb2xlYW4gaXNOb2RlVHlwZUVsZW1lbnQoT2JqZWN0IG5vZGUpOwkvLyBJcyB0aGlzIGFuIGVsZW1lbnQgdHlwZSBub2RlCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZShPYmplY3Qgbm9kZSk7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL1NwZWNpYWxSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL1NwZWNpYWxSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjI5MWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9hZGFwdGVycy9TcGVjaWFsUmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzOwotLyoKLSAqICAkUkNTZmlsZTogU3BlY2lhbFJlc291cmNlU2V0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogQSBTcGVjaWFsIHJlc291cmNlIHNldCB0aGF0IGlzIHVzZWQgdG8gbGluayB0b2dldGhlciB0byB0aGUgYmVhbmluZm8KLSAqIG5hdHVyZSdzIHJlc291cmNlIHNldCBhbmQgbWFrZXMgc3VyZSB0aGF0IGFueSByZXF1ZXN0IGZvciBhIG5ldyAiamF2YTovLi4uIgotICogSmF2YUNsYXNzIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIGJlYW5pbmZvIG5hdHVyZSdzIHJlc291cmNlIHNldC4gT3RoZXJ3aXNlCi0gKiB0aGUgY2xhc3NlcyB3aWxsIGJlIGFsbCBvdmVyIHRoZSBwbGFjZSBhbmQgbm90IGFsbCBnYXRoZXJlZCBpbiBvbmUgcGxhY2UuCi0gKiAKLSAqICpwYWNrYWdlKiBwcm90ZWN0ZWQgYmVjYXVzZSBubyBvbmUgc2hvdWxkIGNyZWF0ZSBvbmUgb2YgdGhlc2UuIFRoZXkgYXJlCi0gKiByZXR1cm5lZCBieSB0aGUgQmVhbmluZm9OYXR1cmUubmV3UmVzb3VyY2VTZXQoKSByZXF1ZXN0LgotICogCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLWNsYXNzIFNwZWNpYWxSZXNvdXJjZVNldCBleHRlbmRzIFByb2plY3RSZXNvdXJjZVNldEltcGwgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFNwZWNpYWxSZXNvdXJjZVNldC4KLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwdWJsaWMgU3BlY2lhbFJlc291cmNlU2V0KCkgewotCQlzdXBlcihudWxsKTsKLQkJSkVNVXRpbFBsdWdpbi5nZXRTaGFyZWRDYWNoZSgpLnN0b3BMaXN0ZW5pbmcodGhpcyk7CS8vIFdlIGRvbid0IGNhcmUgYWJvdXQgbGlzdGVuaW5nLgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL1VJQ3JlYXRlUmVnaXN0cnlKb2JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvVUlDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxNTQ4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvVUlDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBVSUNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHZlcnNpb24gd2hpY2ggY2FuIGFjdHVhbGx5IHJlZmVyZW5jZSBhbmQgdXNlIHRoZSBVSSBjbGFzc2VzLiBJdCB3b24ndCBiZQotICogbG9hZGVkIGV4Y2VwdCBpZiB1aSBwbHVnaW4gaXMgYXZhaWxhYmxlLgotICogCi0gKiBJdCB3aWxsIGNoZWNrIHRvIHNlZSBpZiBVSSBpcyBydW5uaW5nLCBhbmQgaWYgaXQgaXMgbm90LCB0aGVuIGxldCBzdXBlciBjbGFzcyBoYW5kbGUuCi0gKiBJZiBpdCBpcyBydW5uaW5nLCB0aGVuIGlmIHRoaXMgaXMgdGhlIFVJIHRocmVhZCwgZG8gc3BlY2lhbCBidXQgcnVuIGluIHVpLCBlbHNlIGlmIG5vdCB0aGVuCi0gKiBsZXQgc3VwZXIgaGFuZGxlIGl0IG5vcm1hbGx5LgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotY2xhc3MgVUlDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIgZXh0ZW5kcyBDcmVhdGVSZWdpc3RyeUpvYkhhbmRsZXIgewotCQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlciNwcm9jZXNzQ3JlYXRlUmVnaXN0cnkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvTmF0dXJlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDcmVhdGVSZWdpc3RyeShmaW5hbCBCZWFuaW5mb05hdHVyZSBuYXR1cmUpIHsKLQkJaWYgKFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKQotCQkJCXN1cGVyLnByb2Nlc3NDcmVhdGVSZWdpc3RyeShuYXR1cmUpOwkvLyBXZSBhcmUgbm90IGluIHRoZSBVSSB0aHJlYWQuIERvIG5vcm1hbC4KLQkJCWVsc2UgewotCQkJCS8vIFdlIGFyZSBpbiB0aGUgVUksIHNvIHRyeSB0byBydW4gaW4gVUkuIFJlYWxseSBkb24ndCB3YW50IHRvIGRvIHRoaXMsIGJ1dCB3ZSBuZWVkIHRvCi0JCQkJLy8gZ2V0IHRoZSBidWlsZCBydWxlLCBhbmQgbm8gd2F5IHRvIGtub3cgaWYgdGhlIFVJIHRocmVhZCBhbHJlYWR5IGhhcyB0aGUgYnVpbGQgcnVsZS4KLQkJCQkvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIHNwYXduIG9mZiB0aHJlYWQgdG8gZG8gaXQsIGJ1dCBpZiB3ZSBoYWQgdGhlIGJ1aWxkIHJ1bGUgd2UgY291bGRuJ3QKLQkJCQkvLyBnZXQgaXQgZm9yIHRoZSBzcGF3bmVkIHRocmVhZC4gU28gaG9wZWZ1bGx5IGl0IHdvbid0IGJlIGxvbmcuCi0JCQkJSVByb2dyZXNzU2VydmljZSBwcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7CQkJCQotCQkJCWZpbmFsIElTY2hlZHVsaW5nUnVsZSBidWlsZFJ1bGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5idWlsZFJ1bGUoKTsKLQotLy8gVE9ETyBOb3RlOiBGb3Igbm93LCBydW5JblVJIGlzIGp1c3Qgd2F5IHRvbyBhbm5veWluZy4gSXQgYWx3YXlzIGZsYXNoZXMgdXAuIEl0IGlzIHN1cHBvc2VkIHRvIG9ubHkgZmxhc2ggdXAKLS8vIHdoZW4gaXQgaXMgYmxvY2tlZCBieSB0aGUgcnVsZS4gSSd2ZSBvcGVuZWQgNjY2ODMgdG8gYWRkcmVzcyB0aGlzLiBJJ3ZlIGFsc28gb3BlbmVkIDY2NjkwIHRvIGJlIGFibGUKLS8vIHRvIHRlc3QgaWYgdGhlIHRocmVhZCBoYXMgdGhlIHJ1bGUgc28gdGhhdCBydW5JblVJIHdpbGwgb25seSBiZSB1c2VkIGlmIFVJIHRocmVhZCBoYWQgdGhlIHJ1bGUuCi0vLyBGb3Igbm93IHRha2UgdGhlIHJpc2sgdGhhdCB0aGUgVUkgdGhyZWFkIHdvbid0IGV2ZXIgaGF2ZSB0aGUgcnVsZS4gVGhpcyBpcyBwcmV0dHkgbGlrZWx5IHRvIGJlIHRydWUuCi0vLwkJCQlmaW5hbCBib29sZWFuW10gZ290UnVsZUxvY2FsbHkgPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07CQkJCQotLy8JCQkJdHJ5IHsKLS8vCQkJCQlwcy5ydW5JblVJKHBzLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotLy8KLS8vCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vCQkJCQkJCWdvdFJ1bGVMb2NhbGx5WzBdID0gdHJ1ZTsKLS8vCQkJCQkJCWRvQ3JlYXRlUmVnaXN0cnkobmF0dXJlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0sIGJ1aWxkUnVsZSk7Ci0vLwkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLS8vCQkJCQlpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICYmICFnb3RSdWxlTG9jYWxseVswXSkgeyAKLS8vCQkJCQkJLy8gRXJyb3Igd2FzIGJlY2F1c2UgcnVsZSBjb25mbGljdGVkIHdpdGggY3VycmVjdCBydWxlcyBmb3IgdGhpcyB0aHJlYWQuIFNvIGRvIGluIHNlcGFyYXRlIHRocmVhZCwgc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHJ1bGUgdGhlcmUuCi0JCQkJCQl0cnkgewotCQkJCQkJCXBzLmJ1c3lDdXJzb3JXaGlsZShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQlJSm9iTWFuYWdlciBqbSA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkJCQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDApOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWptLmJlZ2luUnVsZShidWlsZFJ1bGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKSk7Ci0JCQkJCQkJCQkJZG9DcmVhdGVSZWdpc3RyeShuYXR1cmUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKSk7Ci0JCQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQkJCWptLmVuZFJ1bGUoYnVpbGRSdWxlKTsKLQkJCQkJCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZTIuZ2V0Q2F1c2UoKSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJCQl9Ci0vLwkJCQkJfSBlbHNlCi0vLwkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLmdldENhdXNlKCksIExldmVsLldBUk5JTkcpOwkJCQkJCQotLy8JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8JCQkJfQotCQkJfQotCQl9IGVsc2UKLQkJCXN1cGVyLnByb2Nlc3NDcmVhdGVSZWdpc3RyeShuYXR1cmUpOwkvLyBXb3JrYmVuY2ggbm90IHJ1bm5pbmcsIGRvIGRlZmF1bHQuCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2FkYXB0ZXJzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmZjY0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYWRhcHRlcnMvbWVzc2FnZXMucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJAotIwotCi1JTlRST1NQRUNUX0ZBSUxFRF9FWENfICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE1NUUgSW50cm9zcGVjdGlvbiBmYWlsZWQgb24gY2xhc3MgInswfS4iIG1zZz0iezF9LiIKLUJlYW5pbmZvQ2xhc3NBZGFwdGVyX0NsYXNzTm90Rm91bmQgICAgICAgICAgICAgICA9IENsYXNzIG5vdCBmb3VuZAotQmVhbmluZm9OYXR1cmVfSW52YWxpZFByb2plY3QgICAgICAgICAgICAgICAgICAgID0gSW52YWxpZCBwcm9qZWN0Ci1VSUNyZWF0ZVJlZ2lzdHJ5Sm9iSGFuZGxlcl9TdGFydEJlYW5pbmZvUmVnaXN0cnkgPSBTdGFydCBCZWFuaW5mbyByZWdpc3RyeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5JbmZvQ2FjaGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDI5YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE2ICQgICREYXRlOiAyMDA1LzA5LzEzIDIwOjMwOjQ2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLkNoYW5nZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UuaW1wbC5FT2JqZWN0VG9DaGFuZ2VzTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvLklJbnRyb3NwZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbi5DbGVhblJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogQ29udHJvbGxlciBvZiB0aGUgQmVhbkluZm8gY2FjaGUuIFRoZXJlIGlzIG9uZSBwZXIgd29ya3NwYWNlIChpdCBpcyBhIHN0YXRpYykuCi0gKiAKLSAqIFRoZSBjYWNoZSBpcyBzdG9yZWQgb24gYSBwZXIgSVBhY2thZ2VGcmFnbWVudFJvb3QgYmFzaXMuIEVhY2ggcGFja2FnZSBmcmFnbWVudCByb290IHdpbGwgYmU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiAKLSAqICByb290ezk5OX0vY2xhc3NuYW1lLnhtaQotICogIAotICogPC9wcmU+Ci0gKiAKLSAqICJyb290ezk5OX0iIHdpbGwgYmUgYSB1bmlndWUgbmFtZSAocm9vdCBhcHBlbmRlZCB3aXRoIGEgbnVtYmVyfSwgb25lIGZvciBlYWNoIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4gVGhlICJjbGFzc25hbWUueG1pIiB3aWxsIGJlIHRoZSBCZWFuSW5mbyBjYWNoZQotICogZm9yIGEgY2xhc3MgaW4gdGhlIHJvb3QuIEEgcm9vdCBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgY2xhc3Mgd2l0aCB0aGUgc2FtZSBuYW1lLCBzbyB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IGNvbGxpc2lvbnMuCi0gKiA8cD4KLSAqIE5vdyByb290cyBjYW4gZWl0aGVyIGJlIGluIGEgcHJvamVjdCwgb3IgdGhleSBjYW4gYmUgYW4gZXh0ZXJuYWwgamFyICh3aGljaCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gcHJvamVjdHMpLgotICogPHA+Ci0gKiBOb3cgYWxsIHJvb3RzIGZvciBhIHByb2plY3Qgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHByb2plY3QncyB3b3JraW5nIGxvY2F0aW9uCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QjZ2V0V29ya2luZ0xvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcpfXVuZGVyIHRoZSAiLmNhY2hlIiBkaXJlY3RvcnkuIEl0IHdpbGwgYmUgdGhpcyBmb3JtYXQgaW4gZWFjaAotICogcHJvamVjdCBsb2NhdGlvbiAodW5kZXIgdGhlIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyBkaXJlY3RvcnkpOgotICogCi0gKiA8cHJlPgotICogCi0gKiAgLmluZGV4Ci0gKiAgcm9vdHs5OTl9Ly4uLgotICogIAotICogPC9wcmU+Ci0gKiAKLSAqIFRoZSAiLmluZGV4IiBmaWxlIHdpbGwgYmUgc3RvcmVkL2xvYWRlZCB0aHJvdWdoIGFuIE9iamVjdFN0cmVhbS4gSXQgd2lsbCBiZSBhIHtAbGluayBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JbmRleH0uIEl0IGlzIHRoZSBpbmRleCB0byBhbGwgb2YgdGhlCi0gKiByb290J3MgaW4gdGhlIGRpcmVjdG9yeS4KLSAqIDxwPgotICogQWxsIG9mIHRoZSBleHRlcm5hbCBqYXIgcm9vdHMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyBwbHVnaW4ncyBzdGF0ZSBsb2NhdGlvbgotICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybSNnZXRTdGF0ZUxvY2F0aW9uKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUpfXVuZGVyIHRoZSAiLmNhY2hlIiBkaXJlY3RvcnkuIFRoZSBmb3JtYXQgb2YgdGhpcyBkaXJlY3RvcnkKLSAqIHdpbGwgYmUgdGhlIHNhbWUgYXMgZm9yIGVhY2ggcHJvamVjdC4gQW5kIHRoZSByb290cyB3aWxsIGJlIGZvciBlYWNoIHVuaXF1ZSBzaGFyZWQgZXh0ZXJuYWwgamFyIChzdWNoIGFzIHRoZSBkaWZmZXJudCBqcmUncyBydC5qYXJzKS4KLSAqIDxwPgotICogTm90ZTogVGhlcmUgYXJlIHNvIG1hbnkgcGxhY2VzIHdoZXJlIHN5bmNocm9uaXphdGlvbiBpcyBuZWVkZWQsIHNvIGl0IGlzIGRlY2lkZWQgdG8gc3luY2hyb25pemUgb25seSBvbiBCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRS4gSXQgd291bGQKLSAqIGJlIHRvbyBlYXN5IHRvIGdldCBhIGRlYWQtbG9jayBiZWNhdXNlIHRoZSBvcmRlciBvZiBzeW5jaHJvbml6YXRpb25zIGNhbid0IGJlIGVhc2lseSBjb250cm9sbGVkLiBTaW5jZSBlYWNoIHBpZWNlIG9mIHN5bmMgY29udHJvbCBpcyB2ZXJ5IHNob3J0Ci0gKiAoZXhjZXB0IGZvciBzYXZlIG9mIHRoZSBpbmRpY2VzLCBidXQgdGhhdCBpcyBvayBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlbSBjaGFuZ2luZyB3aGlsZSBzYXZpbmcpIGl0IHNob3VsZG4ndCBibG9jayBhIGxvdC4gVGhlcmUgaXMgb25lIHBsYWNlIHdlCi0gKiB2aW9sYXRlIHRoaXMgYW5kIHRoYXQgaXMgd2UgZG8gYSBzeW5jIG9uIENsYXNzRW50cnkgaW5zdGFuY2Ugd2hlbiB3b3JraW5nIHdpdGggdGhlIHBlbmRpbmcuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgY2FjaGUgd3JpdGUKLSAqIGpvYiB0byBob2xkIHVwIGV2ZXJ5dGhpbmcgd2hpbGUgd3JpdGluZywgc28gd2Ugc3luYyBvbiB0aGUgZW50cnkgYmVpbmcgd3JpdHRlbiBpbnN0ZWFkLiBUaGVyZSB3ZSBtdXN0IGJlIHZlcnkgY2FyZWZ1bCB0aGF0IHdlIG5ldmVyIHRvCi0gKiBCZWFuSW5mb0NhY2hlQ29udHJvbGVyLklOU1RBTkNFIHN5bmMgYW5kIHRoZW4gYSBDbGFzc0VudHJ5IHN5bmMgYmVjYXVzZSB3ZSBjb3VsZCBkZWFkbG9jay4gVGhlIENFIGFjY2VzcyB1bmRlciB0aGUgY292ZXJzIG1heSBkbyBhIENFIHN5bmMgYW5kIHRoZW4KLSAqIGEgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuSU5TVEFOQ0Ugc3luYy4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuSW5mb0NhY2hlQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gY2FjaGUgY29udHJvbGxlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyIElOU1RBTkNFID0gbmV3IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyKCk7Ci0KLQlwcml2YXRlIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyKCkgewotCQkvLyBTdGFydCB1cCBzYXZlIHBhcnRpY2lwZW50LiBUaGlzIG9ubHkgaXMgdXNlZCBmb3Igc2F2aW5nIGluZGV4ZXMgYW5kIHNodXRkb3duLiBDdXJyZW50bHkgdGhlIHNhdmVkIHN0YXRlIGRlbHRhCi0JCS8vIGlzIG9mIG5vIGludGVyZXN0LiBJZiBhIHByb2plY3QgaXMgZGVsZXRlZCB3aGlsZSB3ZSB3ZXJlIG5vdCB1cCwgdGhlbiB0aGUgcHJvamVjdCBpbmRleCB3b3VsZCBiZSBnb25lLCBzbwotCQkvLyBvdXIgZGF0YSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZ29uZSBmb3IgdGhlIHByb2plY3QuIAotCQkvLyBJZiBhIGNsYXNzIHdhcyBkZWxldGVkIHdoaWxlIHRoZSBwcm9qZWN0J3MgYmVhbmluZm8gd2FzIG5vdCBhY3RpdmUsIHRoZSBjYWNoZSB3aWxsIHN0aWxsIGNvbnRhaW4gaXQuIElmIHRoZSBjbGFzcyBldmVyIGNhbWUgYmFjayBpdAotCQkvLyB3b3VsZCBiZSBzdGFsZSBhbmQgc28gcmVjcmVhdGVkLiBJZiBpdCBuZXZlciBjb21lcyBiYWNrLCB1bnRpbCBhIGNsZWFuIGlzIGRvbmUsIGl0IHdvdWxkIGp1c3QgaGFuZyBhcm91bmQuCi0JCS8vIFRoZSBwcm9ibGVtIHdpdGggZGVsZXRlIGlzIGl0IGlzIGhhcmQgdG8gZGV0ZXJtaW5lIHRoYXQgdGhlIGZpbGUgaXMgYWN0dWFsbHkgYSBjbGFzcyBvZiBpbnRlcmVzdC4gVGhlIGphdmFtb2RlbAotCQkvLyBoYW5kbGVzIHRoYXQgZm9yIHVzIGJ1dCB3ZSB3b24ndCBoYXZlIGEgamF2YW1vZGVsIHRvIGhhbmRsZSB0aGlzIG9uIHN0YXJ0IHVwIHRvIHRlbGwgdXMgdGhlIGZpbGUgd2FzIGEgY2xhc3Mgb2YgaW50ZXJlc3QuIFNvCi0JCS8vIHdlJ2xsIHRha2UgdGhlIGhpdCBvZiBwb3NzaWJsZSBjYWNoZSBmb3Igbm9uLWV4aXN0YW50IGNsYXNzZXMuIEEgY2xlYW4gd2lsbCB0YWtlIGNhcmUgb2YgdGhpcy4KLQkJc2F2ZVBhcnRpY2lwYW50ID0gbmV3IFNhdmVQYXJ0aWNpcGFudCgpOwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFNhdmVQYXJ0aWNpcGFudChCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKSwgc2F2ZVBhcnRpY2lwYW50KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBhIGNsZWFudXAgbGlzdGVuZXIgdG8gaGFuZGxlIGNsZWFuIHJlcXVlc3RzIGFuZCBwcm9qZWN0IGRlbGV0ZXMuIFdlIG5lZWQgdG8ga25vdyBhYm91dCBwcm9qZWN0IGRlbGV0ZXMgd2hpbGUKLQkJLy8gYWN0aXZlIGJlY2F1c2Ugd2UgbWF5IGhhdmUgYSBwcm9qZWN0IGluZGV4IGluIG1lbW9yeSBhbmQgdGhhdCBuZWVkcyB0byBiZSB0aHJvd24gYXdheS4KLQkJSkVNVXRpbFBsdWdpbi5hZGRDbGVhblJlc291cmNlQ2hhbmdlTGlzdGVuZXIobmV3IENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCi0JCQlwcm90ZWN0ZWQgdm9pZCBjbGVhblByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQkJCS8vIEdldCByaWQgb2YgdGhlIHByb2plY3QgaW5kZXggYW5kIHRoZSBkYXRhIGZvciB0aGUgcHJvamVjdC4KLQkJCQlzeW5jaHJvbml6ZWQgKEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLnRoaXMpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUluZGV4IHByb2plY3RJbmRleCA9IChJbmRleCkgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVkpOwotCQkJCQkJaWYgKHByb2plY3RJbmRleCAhPSBudWxsKSB7Ci0JCQkJCQkJcHJvamVjdC5zZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVksIG51bGwpOwotCQkJCQkJCXByb2plY3RJbmRleC5tYXJrRGVhZCgpOwotCQkJCQkJCWNsZWFuRGlyZWN0b3J5KGdldENhY2hlRGlyKHByb2plY3QpLnRvRmlsZSgpLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCUJlYW5pbmZvTmF0dXJlIG5hdHVyZSA9IEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldE5hdHVyZShwcm9qZWN0KTsKLQkJCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJCQkJCUJlYW5pbmZvQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoQmVhbmluZm9BZGFwdGVyRmFjdG9yeSkgRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpLmdldEFkYXB0ZXJGYWN0b3JpZXMoKSwgSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJCQlhZGFwdGVyRmFjdG9yeS5tYXJrQWxsU3RhbGUodHJ1ZSk7CS8vIEFsc28gY2xlYXIgdGhlIG92ZXJyaWRlcy4KLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gU2hvdWxkbid0IG9jY3VyLiAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIHZvaWQgY2xlYW5BbGwoKSB7Ci0JCQkJc3luY2hyb25pemVkKEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLnRoaXMpIHsKLQkJCQkJLy8gR2V0IE1BSU5fSU5ERVgsIG1hcmsgaXQgZGVhZCwgYW5kIHRoZW4gZGVsZXRlIGV2ZXJ5dGhpbmcgdW5kZXIgaXQuCi0JCQkJCWlmIChNQUlOX0lOREVYICE9IG51bGwpIHsKLQkJCQkJCU1BSU5fSU5ERVgubWFya0RlYWQoKTsKLQkJCQkJCU1BSU5fSU5ERVggPSBudWxsOwotCQkJCQkJY2xlYW5EaXJlY3RvcnkoZ2V0Q2FjaGVEaXIobnVsbCkudG9GaWxlKCksIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN1cGVyLmNsZWFuQWxsKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCS8vIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIFBSRV9DTE9TRSBiZWNhdXNlIFNhdmVQYXJ0aWNpcGVudCBwcm9qZWN0IHNhdmUgd2lsbCBoYW5kbGUgY2xvc2luZy4KLQkJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEU6Ci0JCQkJCQkvLyBEb24ndCBuZWVkIHRvIGNsZWFyIHRoZSBjYWNoZSBkaXJlY3RvcnkgYmVjYXVzZSBFY2xpcHNlIHdpbGwgZ2V0IHJpZCBvZiBpdC4KLQkJCQkJCXN5bmNocm9uaXplZCAoQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIudGhpcykgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUluZGV4IHByb2plY3RJbmRleCA9IChJbmRleCkgZXZlbnQuZ2V0UmVzb3VyY2UoKS5nZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVkpOwotCQkJCQkJCQlpZiAocHJvamVjdEluZGV4ICE9IG51bGwpIHsKLQkJCQkJCQkJCS8vIE5vIG5lZWQgdG8gcmVtb3ZlIGZyb20gdGhlIHByb2plY3QgYmVjYXVzZSB0aGUgcHJvamVjdCBpcyBnb2luZyBhd2F5IGFuZCB3aWxsIGNsZWFuIGl0c2VsZiB1cC4KLQkJCQkJCQkJCXByb2plY3RJbmRleC5tYXJrRGVhZCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIFNob3VsZG4ndCBvY2N1ci4KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBGbG93IGludG8gUFJFX0NMT1NFIHRvIHJlbGVhc2UgdGhlIG5hdHVyZS4KLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0U6Ci0JCQkJCQkvLyBBYm91dCB0byBjbG9zZSBvciBkZWxldGUsIHNvIHJlbGVhc2UgdGhlIG5hdHVyZSwgaWYgYW55LgotCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCUJlYW5pbmZvTmF0dXJlIG5hdHVyZSA9IEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldE5hdHVyZShwcm9qZWN0KTsKLQkJCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJCQkJCW5hdHVyZS5jbGVhbnVwKGZhbHNlLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJc3VwZXIucmVzb3VyY2VDaGFuZ2VkKGV2ZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCi0JCX0sIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UpOwotCX0KLQotCXByb3RlY3RlZCBTYXZlUGFydGljaXBhbnQgc2F2ZVBhcnRpY2lwYW50OwotCi0JLyoqCi0JICogQW4gaW5kZXggc3RydWN0dXJlIGZvciB0aGUgTWFpbiBhbmQgUHJvamVjdCBpbmRleGVzLiBBY2Nlc3MgdG8gdGhlIGluZGV4IGNvbnRlbnRzIGFuZCBtZXRob2RzIHNob3VsZCBzeW5jaHJvbml6ZSBvbiB0aGUgaW5kZXggaXRzZWxmLgotCSAqIDxwPgotCSAqIEdldHRpbmcgdG8gdGhlIGluZGV4IGluc3RhbmNlIHNob3VsZCBvbmx5IGJlIHRocm91Z2ggdGhlIDxjb2RlPmdldE1haW5JbmRleCgpPC9jb2RlPiBhbmQgPGNvZGU+Z2V0UHJvamVjdEluZGV4KElQcm9qZWN0KTwvY29kZT4gYWNjZXNzb3JzCi0JICogc28gdGhhdCBzeW5jaHJvbml6YXRpb24gYW5kIHNlcmlhbGl6YXRpb24gaXMgY29udHJvbGxlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEluZGV4IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA2ODY0NDI1NDIzTDsKLQotCQkvKgotCQkgKiBJcyB0aGlzIGEgZGlydHkgaW5kZXgsIGkuZS4gaXQgaGFzIGJlZW4gY2hhbmdlZCBhbmQgbmVlZHMgdG8gYmUgc2F2ZWQuCi0JCSAqLwotCQl0cmFuc2llbnQgcHJpdmF0ZSBib29sZWFuIGRpcnR5OwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUFEID0gLTE7CS8vIFVzZWQgaW4gaGlnaFJvb3ROdW1iZXIgdG8gaW5kaWNhdGUgdGhlIGluZGV4IGlzIGRlYWQuCi0JCS8qKgotCQkgKiBUaGUgaGlnaGVzdCByb290IG51bWJlciB1c2VkLiBJdCBpcyBpbmNyZW1lbnRlZCBldmVyeXRpbWUgb25lIGlzIG5lZWRlZC4gSXQgZG9lc24ndCBldmVyIGRlY3JlYXNlIHRvIHJlY292ZXIgcmVtb3ZlZCByb290cy4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGludCBoaWdoUm9vdE51bWJlcjsKLQotCQkvKioKLQkJICogTWFwIG9mIHJvb3QgbmFtZXMgdG8gdGhlIHJvb3QgSW5kZXguIFRoZSBrZXkgaXMgYSB7QGxpbmsgSVBhdGh9LiBUaGUgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2UgaWYgYSBwcm9qZWN0IHJvb3QsIG9yIGFuCi0JCSAqIGFic29sdXRlIGxvY2FsIHBhdGggdG8gdGhlIGFyY2hpdmUgaWYgaXQgaXMgYW4gZXh0ZXJuYWwgYXJjaGl2ZS4gSXQgaXMgdGhlIElQYXRoIHRvIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAoZWl0aGVyIGEgZm9sZGVyIG9yIGEgamFyIGZpbGUpLgotCQkgKiA8cD4KLQkJICogVGhlIHZhbHVlIHdpbGwgYmUgYSB7QGxpbmsgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIuUm9vdEluZGV4fS4gVGhpcyBpcyB0aGUgaW5kZXggZm9yIHRoZSBjb250ZW50cyBvZiB0aGF0IHJvb3QuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXRyYW5zaWVudCBwdWJsaWMgTWFwIHJvb3RUb1Jvb3RJbmRleDsKLQotCQkvKioKLQkJICogQHBhcmFtIGRpcnR5Ci0JCSAqICAgICAgICAgICAgVGhlIGRpcnR5IHRvIHNldC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCQkJc3luY2hyb25pemVkIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRSkgewotCQkJCXRoaXMuZGlydHkgPSBkaXJ0eTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRpcnR5LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQkJc3luY2hyb25pemVkIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRSkgewotCQkJCXJldHVybiBkaXJ0eTsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFuc3dlciBpZiB0aGlzIGluZGV4IGlzIGRlYWQuIEl0IGlzIGRlYWQgaWYgYSBjbGVhbiBoYXMgb2NjdXJyZWQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgc29tZSBDbGFzc0VudHJ5J3Mgc3RpbGwKLQkJICogYXJvdW5kIChzdWNoIGFzIGluIHRoZSBwZW5kaW5nIHdyaXRlIHF1ZXVlKSB0aGF0IGFyZSBmb3IgY2xlYW5lZCByb290cy4gVGhpcyBpcyB1c2VkIHRvIHRlc3QgaWYgaXQgaGFzIGJlZW4gY2xlYW5lZC4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0RlYWQoKSB7Ci0JCQlyZXR1cm4gaGlnaFJvb3ROdW1iZXIgPT0gREVBRDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIE1hcmsgdGhlIGluZGV4IGFzIGRlYWQuCi0JCSAqIAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIG1hcmtEZWFkKCkgewotCQkJaGlnaFJvb3ROdW1iZXIgPSBERUFEOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCW9zLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQkJLy8gTm93IHdyaXRlIG91dCB0aGUgcm9vdCB0byByb290IGluZGV4IG1hcC4gV2UgYXJlIG5vdCBzZXJpYWxpemluZyB0aGUgTWFwIGRpcmVjdGx5IHVzaW5nIG5vcm1hbCBNYXAgc2VyaWFsaXphdGlvbiBiZWNhdXNlCi0JCQkvLyB0aGUga2V5IG9mIHRoZSBtYXAgaXMgYW4gSVBhdGggKHdoaWNoIGlzIGEgUGF0aCB1bmRlciB0aGUgY292ZXJzKSBhbmQgUGF0aCBpcyBub3Qgc2VyaWFsaXphYmxlLgotCQkJb3Mud3JpdGVJbnQocm9vdFRvUm9vdEluZGV4LnNpemUoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIG1hcEl0ciA9IHJvb3RUb1Jvb3RJbmRleC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IG1hcEl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgbWFwSXRyLm5leHQoKTsKLQkJCQlvcy53cml0ZVVURigoKElQYXRoKSBlbnRyeS5nZXRLZXkoKSkudG9TdHJpbmcoKSk7Ci0JCQkJb3Mud3JpdGVPYmplY3QoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCWlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCQlpbnQgc2l6ZSA9IGlzLnJlYWRJbnQoKTsKLQkJCXJvb3RUb1Jvb3RJbmRleCA9IG5ldyBIYXNoTWFwKHNpemUgPCAxMDAgPyAxMDAgOiBzaXplKTsKLQkJCXdoaWxlIChzaXplLS0gPiAwKSB7Ci0JCQkJcm9vdFRvUm9vdEluZGV4LnB1dChuZXcgUGF0aChpcy5yZWFkVVRGKCkpLCBpcy5yZWFkT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gaW5kZXggZm9yIGEgcm9vdC4gSXQgaGFzIGFuIGVudHJ5IGZvciBlYWNoIGNsYXNzIGluIHRoaXMgcm9vdC4gVGhlIGNsYXNzIGNhY2hlIGVudHJ5IGRlc2NyaWJlcyB0aGUgY2FjaGUsIHdoZXRoZXIgaXQgaXMgc3RhbGUsIHdoYXQgdGhlCi0JICogY3VycmVudCBtb2Qgc3RhbXAgaXMsIGV0Yy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJvb3RJbmRleCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNjg2ODY3NDg2N0w7Ci0KLQkJdHJhbnNpZW50IHByaXZhdGUgSVBhdGggY2FjaGVQYXRoOyAvLyBBYnNvbHV0ZSBsb2NhbCBmaWxlc3lzdGVtIElQYXRoIHRvIHRoZSByb290IGNhY2hlIGRpcmVjdG9yeS4gQ29tcHV0ZWQgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBjaGFuZ2UKLQkJCQkJCQkJCQkgICAvLyBpZiB3b3Jrc3BhY2UgcmVsb2NhdGVkLgotCi0JCXByb3RlY3RlZCBNYXAgY2xhc3NOYW1lVG9DbGFzc0VudHJ5OyAvLyBNYXAgb2YgY2xhc3MgbmFtZXMgdG8gY2xhc3MgZW50cmllcy4KLQotCQlwcml2YXRlIFN0cmluZyByb290TmFtZTsgLy8gTmFtZSBvZiB0aGUgcm9vdCBkaXJlY3RvcnkgaW4gdGhlIGNhY2hlIChlLmcuICJyb290MSIpLgotCi0JCXByb3RlY3RlZCBJbmRleCBpbmRleDsgLy8gSW5kZXggY29udGFpbmluZyB0aGlzIHJvb3QgaW5kZXguCi0KLQkJcHJvdGVjdGVkIFJvb3RJbmRleCgpIHsKLQkJfQotCi0JCXB1YmxpYyBSb290SW5kZXgoU3RyaW5nIHJvb3ROYW1lLCBJbmRleCBpbmRleCkgewotCQkJdGhpcy5yb290TmFtZSA9IHJvb3ROYW1lOwotCQkJY2xhc3NOYW1lVG9DbGFzc0VudHJ5ID0gbmV3IEhhc2hNYXAoMTAwKTsgLy8gV2hlbiBjcmVhdGVkIGJyYW5kIG5ldywgcHV0IGluIGEgbWFwLiBPdGhlcndpc2Ugb2JqZWN0IHN0cmVhbSB3aWxsIGNyZWF0ZSB0aGUgbWFwLgotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IHRoZSBpbmRleCB0aGF0IHBvaW50cyB0byB0aGlzIHJvb3QuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJSW5kZXggZ2V0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gaW5kZXg7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSByb290IGRpcmVjdG9yeSBuYW1lCi0JCSAqIAotCQkgKiBAcmV0dXJuIHJvb3RuYW1lCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdE5hbWUoKSB7Ci0JCQlyZXR1cm4gcm9vdE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0IHRoaXMgUm9vdEluZGV4IChhbmQgdGhlIGNvbnRhaW5pbmcgSW5kZXgpIGFzIGJlaW5nIGRpcnR5IGFuZCBpbiBuZWVkIG9mIHNhdmluZy4KLQkJICogCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldERpcnR5KCkgewotCQkJaW5kZXguc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQotCQkvKgotCQkgKiBTZXR1cCBmb3IgaW5kZXguIEl0IHdpbGwgaW5pdGlhbGl6ZSB0aGUgcGF0aC4gT25jZSBzZXQgaXQgd29uJ3Qgc2V0IGl0IGFnYWluLiBUaGlzIHdpbGwgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIGNhY2hlIGNvbnRyb2xsZXIKLQkJICogYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyBpZiBpdCB3YXMgbGF6aWx5IGNyZWF0ZWQgb3Igd2FzIGJyb3VnaHQgaW4gZnJvbSBmaWxlLiBXaGVuIGJyb3VnaHQgaW4gZnJvbSBmaWxlIHRoZSBwYXRoIGlzIG5vdCBzZXQgYmVjYXVzZQotCQkgKiBpdCBzaG91bGQgYmUgcmVsb2NhdGFibGUgYW5kIHdlIGRvbid0IHdhbnQgYWJzb2x1dGUgcGF0aHMgb3V0IG9uIHRoZSBkaXNrIGNhY2hlcywgYW5kIHdlIGRvbid0IHdhbnQgdG8gd2FzdGUgdGltZSBjcmVhdGluZyB0aGUgcGF0aCBhdCBsb2FkCi0JCSAqIHRpbWUgYmVjYXVzZSBpdCBtYXkgbm90IGJlIG5lZWRlZCBmb3IgYSB3aGlsZS4gU28gaXQgd2lsbCBiZSBsYXppbHkgY3JlYXRlZC4gPHA+IElmIHRoZSBwcm9qZWN0IGlzIHNldCwgdGhlbiB0aGUgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvCi0JCSAqIHRoZSBwcm9qZWN0J3Mgd29ya2luZyBsb2NhdGlvbi4gSWYgcHJvamVjdCBpcyA8Y29kZT4gbnVsbCA8L2NvZGU+IHRoZW4gaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgQmVhbkluZm8gcGx1Z2luJ3Mgc3RhdGUgbG9jYXRpb24uIDxwPgotCQkgKiBUaGlzIGlzIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjcmVhdG9yIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlciBjbGFzcykgc2hvdWxkIHNldCB0aGlzIHVwLgotCQkgKiAKLQkJICogQHBhcmFtIHByb2plY3QKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXR1cEluZGV4KElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWlmIChnZXRDYWNoZVBhdGgoKSA9PSBudWxsKQotCQkJCWNhY2hlUGF0aCA9IGdldENhY2hlRGlyKHByb2plY3QpLmFwcGVuZChyb290TmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBjYWNoZSBkaXJlY3RvcnkgZm9yIHRoZSByb290LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgSVBhdGggZ2V0Q2FjaGVQYXRoKCkgewotCQkJcmV0dXJuIGNhY2hlUGF0aDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgcm9vdCBmb3IgYSBhcmNoaXZlIG9yIGEgZm9sZGVyLgotCQkgKiAKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhcmNoaXZlIGZvciBhIHJvb3QuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhcmNoaXZlIGZvciBhIGZvbGRlci4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBcmNoaXZlUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIEEgcm9vdCBpbmRleCB0aGF0IGlzIGZvciBhbiBhcmNoaXZlLCBlaXRoZXIgaW50ZXJuYWwgb3IgZXh0ZXJuYWwuIEl0IGNvbnRhaW5zIHRoZSBhcmNoaXZlJ3MgbW9kaWZpY2F0aW9uIHN0YW1wLiBFYWNoIGNsYXNzIGNhY2hlIGVudHJ5IHdpbGwKLQkgKiBoYXZlIHRoaXMgc2FtZSBtb2RpZmljYXRpb24gc3RhbXAuIElmIHRoZSBhcmNoaXZlIGlzIGNoYW5nZWQgdGhlbiBhbGwgb2YgdGhlIGNsYXNzIGNhY2hlIGVudHJpZXMgd2lsbCBiZSByZW1vdmVkIGJlY2F1c2UgdGhleSBhcmUgYWxsIHBvc3NpYmx5Ci0JICogc3RhbGUuIE5vIHdheSB0byBrbm93IHdoaWNoIG1heSBiZSBzdGFsZSBhbmQgd2hpY2ggbm90LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQXJjaGl2ZVJvb3RJbmRleCBleHRlbmRzIFJvb3RJbmRleCB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNjg2ODY3NDU2TDsKLQotCQlwcml2YXRlIGxvbmcgYXJjaGl2ZU1vZGlmaWNhdGlvblN0YW1wOwotCi0JCS8qCi0JCSAqIEZvciBzZXJpYWxpemVyIHRvIGNhbGwuCi0JCSAqLwotCQlwcm90ZWN0ZWQgQXJjaGl2ZVJvb3RJbmRleCgpIHsKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlUm9vdEluZGV4KFN0cmluZyByb290TmFtZSwgbG9uZyBhcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAsIEluZGV4IGluZGV4KSB7Ci0JCQlzdXBlcihyb290TmFtZSwgaW5kZXgpOwotCQkJdGhpcy5hcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAgPSBhcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLlJvb3RJbmRleCNpc0FyY2hpdmVSb290KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZVJvb3QoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIFNldCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wLiA8cD4gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgdGhlIGNhY2hlIGNvbnRyb2xsZXIgc2hvdWxkIGNoYW5nZSBpdC4KLQkJICogCi0JCSAqIEBwYXJhbSBhcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAgVGhlIGFyY2hpdmVNb2RpZmljYXRpb25TdGFtcCB0byBzZXQuCi0JCSAqIAotCQkgKiBAc2VlIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyI01PRElGSUNBVElPTl9TVEFNUF9TVEFMRQotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0QXJjaGl2ZU1vZGlmaWNhdGlvblN0YW1wKGxvbmcgYXJjaGl2ZU1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQl0aGlzLmFyY2hpdmVNb2RpZmljYXRpb25TdGFtcCA9IGFyY2hpdmVNb2RpZmljYXRpb25TdGFtcDsKLQkJCXNldERpcnR5KCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wLgotCQkgKiAKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBhcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAuCi0JCSAqIEBzZWUgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIjTU9ESUZJQ0FUSU9OX1NUQU1QX1NUQUxFCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0QXJjaGl2ZU1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIGFyY2hpdmVNb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSByb290IGluZGV4IGZvciBhIGZvbGRlciAod2hpY2ggd2lsbCBiZSBpbiB0aGUgd29ya3NwYWNlKS4gRWFjaCBjbGFzcyBjYWNoZSBlbnRyeSBjYW4gaGF2ZSBhIGRpZmZlcmVudCBtb2RpZmljYXRpb24gc3RhbXAgd2l0aCBhCi0JICogZm9sZGVyIHJvb3QgaW5kZXguCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGb2xkZXJSb290SW5kZXggZXh0ZW5kcyBSb290SW5kZXggewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDY4Njg2NzQ4MzRMOwotCi0JCS8qCi0JCSAqIEZvciBzZXJpYWxpemF0aW9uLgotCQkgKi8KLQkJcHJvdGVjdGVkIEZvbGRlclJvb3RJbmRleCgpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcm9vdE5hbWUKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIEZvbGRlclJvb3RJbmRleChTdHJpbmcgcm9vdE5hbWUsIEluZGV4IGluZGV4KSB7Ci0JCQlzdXBlcihyb290TmFtZSwgaW5kZXgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuSW5mb0NhY2hlQ29udHJvbGxlci5Sb290SW5kZXgjaXNBcmNoaXZlUm9vdCgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FyY2hpdmVSb290KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gaW5kaXZpZHVhbCBjbGFzcyBlbnRyeSBmcm9tIHRoZSBjYWNoZS4gSXQgaGFzIGFuIGVudHJ5IGZvciBlYWNoIGNsYXNzIGluIHRoZSByb290LiBUaGUgY2xhc3MgY2FjaGUgZW50cnkgZGVzY3JpYmVzIHRoZSBjYWNoZSwgd2hldGhlciBpdCBpcwotCSAqIHN0YWxlLCB3aGF0IHRoZSBjdXJyZW50IG1vZCBzdGFtcCBpcywgZXRjLgotCSAqIDxwPgotCSAqIFRoZXJlIGlzIGEgbWV0aG9kIHRvIGNhbGwgdG8gc2VlIGlmIGRlbGV0ZWQuIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGVudHJ5IGlzIGJlaW5nIGhlbGQgb24gdG8gYmVjYXVzZQotCSAqIDxjb2RlPmdldENsYXNzRW50cnkoSmF2YUNsYXNzKTwvY29kZT4gd2lsbCBuZXZlciByZXR1cm4gYSBkZWxldGVkIGVudHJ5LiBUaGVyZSBpcyBhIG1ldGhvZCB0byBnZXQgdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgY3VycmVudCBjYWNoZQotCSAqIGVudHJ5LiBUaGlzIGlzIHRoZSB0aW1lIHN0YW1wIG9mIHRoZSBjb29yZXNwb25kaW5nIGNsYXNzIHJlc291cmNlIChvciBhcmNoaXZlIGZpbGUpIHRoYXQgdGhlIGNhY2hlIGZpbGUgd2FzIGNyZWF0ZWQgZnJvbS4gSWYgdGhlIHZhbHVlIGlzCi0JICogPGNvZGU+SVJlc291cmNlLk5VTExfU1RBTVA8L2NvZGU+LCB0aGVuIHRoZSBjYWNoZSBmaWxlIGlzIGtub3duIHRvIGJlIHN0YWxlLiBPdGhlcndpc2UgaWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiBhIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiBhCi0JICogc3VwZXIgY2xhc3MgdGhlbiB0aGUgY2FjaGUgZmlsZSBpcyBzdGFsZS4KLQkgKiAKLQkgKiBAc2VlIENsYXNzRW50cnkjaXNEZWxldGVkKCkKLQkgKiBAc2VlIENsYXNzRW50cnkjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQotCSAqIEBzZWUgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIjZ2V0Q2xhc3NFbnRyeShKYXZhQ2xhc3MpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc0VudHJ5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA2ODY4Njc0NjY2TDsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVMRVRFRF9NT0RJRklDQVRJT05fU1RBTVAgPSBMb25nLk1JTl9WQUxVRTsgLy8gVGhpcyBmbGFnIHdvbid0IGJlIHNlZW4gZXh0ZXJuYWxseS4gSXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW50cnkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGhhcyBiZWVuIGRlbGV0ZWQgZm9yIHRob3NlIHRoYXQgaGF2ZSBiZWVuIGhvbGRpbmcgYSBDRS4KLQkJCi0JCS8qKgotCQkgKiBDaGVjayBhZ2FpbnN0IHRoZSBzdXBlciBtb2RpZmljYXRpb24gc3RhbXAgYW5kIHRoZSBpbnRlcmZhY2Ugc3RhbXBzIHRvIHNlZSBpZiB0aGV5IHdlcmUgc2V0Ci0JCSAqIGJ5IHVuZGVmaW5lZCBzdXBlciBjbGFzcyBvciBpbnRlcmZhY2UgYXQgY2FjaGUgY3JlYXRpb24gdGltZS4gCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTVVBFUl9VTkRFRklORURfTU9ESUZJQ0FUSU9OX1NUQU1QID0gTG9uZy5NSU5fVkFMVUUrMTsJCi0KLQkJcHJpdmF0ZSBsb25nIG1vZGlmaWNhdGlvblN0YW1wOwotCQlwcml2YXRlIGxvbmcgc3VwZXJNb2RpZmljYXRpb25TdGFtcDsJLy8gU3RhbXAgb2Ygc3VwZXJjbGFzcywgaWYgYW55LCBhdCB0aW1lIG9mIGNhY2hlIGNyZWF0aW9uLgotCQlwcml2YXRlIFN0cmluZ1tdIGludGVyZmFjZU5hbWVzOwkvLyBJbnRlcmZhY2VzIG5hbWVzIChudWxsIGlmIG5vIGludGVyZmFjZXMpCi0JCXByaXZhdGUgbG9uZ1tdIGludGVyZmFjZU1vZGljYXRpb25TdGFtcHM7CS8vIE1vZGlmaWNhdGlvbiBzdGFtcHMgb2YgaW50ZXJmYWNlcywgaWYgYW55LiAobnVsbCBpZiBubyBpbnRlcmZhY2VzKS4KLQkJcHJpdmF0ZSB0cmFuc2llbnQgUmVzb3VyY2UgcGVuZGluZ1Jlc291cmNlOwkvLyBSZXNvdXJjZSBpcyB3YWl0aW5nIHRvIGJlIHNhdmVkLCBidXQgdGhlIHRpbWVzdGFtcHMgYXJlIGZvciB0aGlzIHBlbmRpbmcgcmVzb3VyY2Ugc28gdGhhdCB3ZSBrbm93IHdoYXQgaXQgd2lsbCBiZSBhaGVhZCBvZiB0aW1lLiBBdCB0aGlzIHBvaW50IHRoZSBjbGFzcyB3aWxsIGJlIGludHJvc3BlY3RlZC4gCi0KLQkJcHJpdmF0ZSBSb290SW5kZXggcm9vdEluZGV4OyAvLyBUaGUgcm9vdCBpbmRleCB0aGlzIGNsYXNzIGVudHJ5IGlzIGluLCBzbyB0aGF0IGFueSBjaGFuZ2VzIGNhbiBtYXJrIHRoZSBlbnRyeSBhcyBkaXJ0eS4KLQotCQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7IC8vIFRoZSBjbGFzc25hbWUgZm9yIHRoaXMgZW50cnkuCi0JCQotCQlwcml2YXRlIGJvb2xlYW4gc2F2ZU9wZXJhdGlvbnM7CS8vIEZsYWcgZm9yIHNhdmluZyBvcGVyYXRpb25zLiBPbmNlIHRoaXMgaXMgc2V0LCBpdCB3aWxsIGNvbnRpbnVlIHRvIHNhdmUgb3BlcmF0aW9ucyBpbiB0aGUgY2FjaGUgaW4gYWRkaXRpb24gdG8gZXZlcnl0aGluZyBlbHNlLgotCi0JCXByaXZhdGUgbG9uZyBjb25maWd1cmF0aW9uTW9kaWZpY2F0aW9uU3RhbXA7CS8vIE1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgRWNsaXBzZSBjb25maWd1cmF0aW9uLiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgY2FjaGUgb2Ygb3ZlcnJpZGUgZmlsZXMgaXMgb3V0IG9mIGRhdGUgZHVlIHRvIGEgY29uZmlnIGNoYW5nZS4KLQkJcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRlQ2FjaGVFeGlzdHM7CS8vIEZsYWcgdGhhdCB0aGVyZSBpcyBhbiBvdmVycmlkZSBjYWNoZSB0byBsb2FkLiBUaGlzIGlzIG9ydGhvZ29uYWwgdG8gdGhlIGNvbmZpZyBtb2Qgc3RhbXAgYmVjYXVzZSBpdCBzaW1wbHkgbWVhbnMgdGhhdCBvbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRoZXJlIGlzIG5vIG92ZXJyaWRlIGNhY2hlLgotCQlwcml2YXRlIHRyYW5zaWVudCBSZXNvdXJjZSBwZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZTsJLy8gT3ZlcnJpZGUgcmVzb3VyY2UgaXMgd2FpdGluZyB0byBiZSBzYXZlZC4KLQkJCi0JCXByb3RlY3RlZCBDbGFzc0VudHJ5KCkgewotCQl9Ci0KLQkJQ2xhc3NFbnRyeShSb290SW5kZXggcm9vdEluZGV4LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQl0aGlzLnNldFJvb3RJbmRleChyb290SW5kZXgpOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCQltb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQkJcm9vdEluZGV4LmNsYXNzTmFtZVRvQ2xhc3NFbnRyeS5wdXQoY2xhc3NOYW1lLCB0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQuIFRoaXMgd2lsbCBuZXZlciBiZSBzZWVuIGluIGFuIGVudHJ5IHRoYXQgaXMgc3RpbGwgaW4gYW4gaW5kZXguIEl0IGlzIHVzZWQgZm9yIGVudHJpZXMgdGhhdCBoYXZlCi0JCSAqIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBpbmRleC4gSXQgaXMgZm9yIGNsYXNzZXMgKHN1Y2ggYXMgdGhlIEJlYW5JbmZvQ2xhc3NBZGFwdGVyKSB3aGljaCBhcmUgaG9sZGluZyBvbnRvIGEgY29weSBvZiBlbnRyeSB0byBsZXQgdGhlbSBrbm93LgotCQkgKiA8cD4KLQkJICogSG9sZGVycyBvZiBlbnRyaWVzIHNob3VsZCBjYWxsIGlzRGVsZXRlZCBpZiB0aGV5IGRvbid0IG5lZWQgdG8gZnVydGhlciBjaGVjayB0aGUgbW9kIHN0YW1wLiBFbHNlIHRoZXkgc2hvdWxkIGNhbGwgZ2V0TW9kaWZpY2F0aW9uU3RhbXAgYW5kCi0JCSAqIGNoZWNrIG9mIGRlbGV0ZWQsIHN0YWxlLCBvciBtb2Qgc3RhbXAuIFRoYXQgd291bGQgc2F2ZSBleHRyYSBzeW5jaHJvbml6YXRpb25zLiBJZiBlbnRyeSBpcyBkZWxldGVkIHRoZW4gaXQgc2hvdWxkIHRocm93IHRoZSBlbnRyeSBhd2F5LgotCQkgKiAKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW50cnkgaGFzIGJlZW4gZGVsZXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHN0aWxsIHZhbGlkLgotCQkgKiAKLQkJICogQHNlZSBDbGFzc0VudHJ5I2dldE1vZGlmaWNhdGlvblN0YW1wKCkKLQkJICogQHNlZSBDbGFzc0VudHJ5I2lzU3RhbGUoKQotCQkgKiBAc2VlIENsYXNzRW50cnkjREVMRVRFRF9NT0RJRklDQVRJT05fU1RBTVAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSA9PSBERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUDsKLQkJfQotCi0JCS8qKgotCQkgKiBNYXJrIHRoZSBlbnRyeSBhcyBkZWxldGVkLiBJdCB3aWxsIGFsc28gYmUgcmVtb3ZlZCBmcm9tIHJvb3QgaW5kZXggaW4gdGhhdCBjYXNlLgotCQkgKiA8cD4KLQkJICogTm90ZTogSXQgaXMgcHVibGljIG9ubHkgc28gdGhhdCBCZWFuSW5mb0NsYXNzQWRhcHRlciBjYW4gYWNjZXNzIGl0LiBJdCBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBhbnlvbmUgZWxzZSBvdXRzaWRlIG9mIEJlYW5JbmZvLgotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmtEZWxldGVkKCkgewotCQkJaWYgKCFpc0RlbGV0ZWQoKSkgewotCQkJCWdldFJvb3RJbmRleCgpLmNsYXNzTmFtZVRvQ2xhc3NFbnRyeS5yZW1vdmUoY2xhc3NOYW1lKTsKLQkJCQlzZXRNb2RpZmljYXRpb25TdGFtcChERUxFVEVEX01PRElGSUNBVElPTl9TVEFNUCk7IC8vIEFsc28gbWFya3MgaW5kZXggYXMgZGlydHkuCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGlzIHN0YWxlIG9yIG5vdC4gVGhpcyBvcnRob2dhbmFsIHRvIGlzRGVsZXRlZC4gaXNEZWxldGVkIHdpbGwgbm90IGJlIHRydWUgaWYgaXNTdGFsZSBhbmQgaXNTdGFsZSB3aWxsIG5vdCBiZSB0cnVlCi0JCSAqIGlmIGlzRGVsZXRlZC4gTm9ybWFsbHkgeW91IHNob3VsZCB1c2UgZ2V0TW9kaWZpY2F0aW9uU3RhbXAgYW5kIGNoZWNrIHRoZSB2YWx1ZSBmb3IgSVJlc291cmNlLk5VTExfU1RBTVAgYW5kIG90aGVyIHZhbHVlcyB0byBicmluZyBpdCBkb3duCi0JCSAqIHRvIG9ubHkgb25lIHN5bmNocm9uaXplZCBjYWxsIHRvIENFLCBidXQgaWYgb25seSBuZWVkaW5nIHRvIGtub3cgaWYgc3RhbGUsIHlvdSBjYW4gdXNlIHRoaXMuCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICogQHNlZSBJUmVzb3VyY2UjTlVMTF9TVEFNUAotCQkgKiBAc2VlIENsYXNzRW50cnkjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQotCQkgKiBAc2VlIENsYXNzRW50cnkjaXNEZWxldGVkKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU3RhbGUoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG1vZGlmaWNhdGlvbiBzdGFtcC4gRm9yIHRob3NlIGhvbGRpbmcgb250byBhbiBlbnRyeSwgYW5kIHRoZXkgbmVlZCB0byBrbm93IG1vcmUgdGhhbiBpZiBqdXN0IGRlbGV0ZWQsIHRoZW4gdGhleSBzaG91bGQganVzdCB0aGUKLQkJICogcmV0dXJuIHZhbHVlIGZyb20gZ2V0TW9kaWZpY2F0aW9uU3RhbXAuIEVsc2UgdGhleSBzaG91bGQgdXNlIGlzRGVsZXRlZCBvciBpc1N0YWxlLgotCQkgKiAKLQkJICogQHJldHVybiBtb2RpZmljYXRpb24gc3RhbXAsIG9yIHtAbGluayBJUmVzb3VyY2UjTlVMTF9TVEFNUH1pZiBzdGFsZSBvciBub3QgeWV0IGNyZWF0ZWQsIG9yIHtAbGluayBDbGFzc0VudHJ5I0RFTEVURURfTU9ESUZJQ0FUSU9OX1NUQU1QfQotCQkgKiAgICAgICAgIGlmIGRlbGV0ZWQuCi0JCSAqIAotCQkgKiBAc2VlIENsYXNzRW50cnkjaXNEZWxldGVkKCkKLQkJICogQHNlZSBDbGFzc0VudHJ5I2lzU3RhbGUoKQotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3VwZXIgbW9kaWZpY2F0aW9uIHN0YW1wLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRTdXBlck1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIHN1cGVyTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGludGVyZmFjZSBuYW1lcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbnRlcmZhY2UgbmFtZXMuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXRJbnRlcmZhY2VOYW1lcygpIHsKLQkJCXJldHVybiBpbnRlcmZhY2VOYW1lczsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGludGVyZmFjZSBtb2RpZmljYXRpb24gc3RhbXBzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGludGVyZmFjZXMuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBsb25nW10gZ2V0SW50ZXJmYWNlTW9kaWZpY2F0aW9uU3RhbXBzKCkgewotCQkJcmV0dXJuIGludGVyZmFjZU1vZGljYXRpb25TdGFtcHM7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFNldCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wLiA8cD4gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgdGhlIGNhY2hlIGNvbnRyb2xsZXIgc2hvdWxkIHNldCBpdC4gQHBhcmFtIG1vZGlmaWNhdGlvblN0YW1wCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkJaWYgKHRoaXMubW9kaWZpY2F0aW9uU3RhbXAgIT0gbW9kaWZpY2F0aW9uU3RhbXApIHsKLQkJCQl0aGlzLm1vZGlmaWNhdGlvblN0YW1wID0gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCQkJZ2V0Um9vdEluZGV4KCkuc2V0RGlydHkoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBBbnN3ZXIgd2hldGhlciBvcGVyYXRpb25zIGFyZSBhbHNvIHN0b3JlZCBpbiB0aGUgY2FjaGUgZm9yIHRoaXMgY2xhc3MuIEJ5IGRlZmF1bHQgdGhleSBhcmUgbm90LiBPbmNlIHR1cm5lZCBvbiB0aGV5Ci0JCSAqIHdpbGwgYWx3YXlzIGJlIHN0b3JlZCBmb3IgdGhpcyBjbGFzcyB1bnRpbCB0aGUgY2xhc3MgaXMgZGVsZXRlZC4KLQkJICogCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb3BlcmF0aW9ucyBhcmUgY2FjaGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBhcmUgbm90IGNhY2hlZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzT3BlcmF0aW9uc1N0b3JlZCgpIHsKLQkJCXJldHVybiBzYXZlT3BlcmF0aW9uczsKLQkJfQotCQkKLQkJLyoKLQkJICogU2V0IHRoZSBvcGVyYXRpb25zIHN0b3JlZCBmbGFnLgotCQkgKiBAcGFyYW0gc3RvcmVPcGVyYXRpb25zCi0JCSAqIAotCQkgKiBAc2VlIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLkNsYXNzRW50cnkjaXNPcGVyYXRpb25zU3RvcmVkKCkKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldE9wZXJhdGlvbnNTdG9yZWQoYm9vbGVhbiBzdG9yZU9wZXJhdGlvbnMpIHsKLQkJCXNhdmVPcGVyYXRpb25zID0gc3RvcmVPcGVyYXRpb25zOwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IHRoZSBjb25maWd1cmF0aW9uIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgbGFzdCBzYXZlZCBvdmVycmlkZSBjYWNoZS4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldENvbmZpZ3VyYXRpb25Nb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBjb25maWd1cmF0aW9uTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKiAKLQkJICogU2V0IHRoZSBjb25maWd1cmF0aW9uIG1vZGlmaWNhdGlvbiBzdGFtcC4KLQkJICogPHA+IDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjYWNoZSBjb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0Q29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKGxvbmcgY29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyYXRpb25Nb2RpZmljYXRpb25TdGFtcCA9IGNvbmZpZ3VyYXRpb25Nb2RpZmljYXRpb25TdGFtcDsKLQkJCWdldFJvb3RJbmRleCgpLnNldERpcnR5KCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBBbnN3ZXIgd2hldGhlciB0aGVyZSBpcyBhbiBvdmVycmlkZSBjYWNoZSBhdmFpbGFibGUuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG92ZXJyaWRlQ2FjaGVFeGlzdHMoKSB7Ci0JCQlyZXR1cm4gb3ZlcnJpZGVDYWNoZUV4aXN0czsKLQkJfQotCQkKLQkJLyoKLQkJICogU2V0IHRoZSBvdmVycmlkZSBjYWNoZSBleGlzdHMgZmxhZy4KLQkJICogPHA+IDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjYWNoZSBjb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuCi0JCSAqIEBwYXJhbSBvdmVycmlkZUNhY2hlRXhpc3RzCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0T3ZlcnJpZGVDYWNoZUV4aXN0cyhib29sZWFuIG92ZXJyaWRlQ2FjaGVFeGlzdHMpIHsKLQkJCXRoaXMub3ZlcnJpZGVDYWNoZUV4aXN0cyA9IG92ZXJyaWRlQ2FjaGVFeGlzdHM7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIHBlbmRpbmcgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHBlbmRpbmcuCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRoZSBwZW5kaW5nIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBwZW5kaW5nLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIFJlc291cmNlIGdldFBlbmRpbmdSZXNvdXJjZSgpIHsKLQkJCXJldHVybiBwZW5kaW5nUmVzb3VyY2U7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIFNldCB0aGUgZW50cnkuIFRoZSBzZXF1ZW5jZSBnZXQsZG8gc29tZXRoaW5nLHNldCBtdXN0IGJlIGdyb3VwZWQgd2l0aGluIGEgc3luY2hyb25pemVkKENsYXNzRW50cnkpLiAKLQkJICogPHA+IDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjYWNoZSBjb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuIAotCQkgKiBAcGFyYW0gY2FjaGVSZXNvdXJjZSBUaGUgY2FjaGVSZXNvdXJjZSB0byBzZXQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0UGVuZGluZ1Jlc291cmNlKFJlc291cmNlIHBlbmRpbmdSZXNvdXJjZSkgewotCQkJdGhpcy5wZW5kaW5nUmVzb3VyY2UgPSBwZW5kaW5nUmVzb3VyY2U7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0IHRoZSBwZW5kaW5nIG92ZXJyaWRlIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBwZW5kaW5nLgotCQkgKiAKLQkJICogQHJldHVybiB0aGUgcGVuZGluZyBvdmVycmlkZSByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgcGVuZGluZy4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN5bmNocm9uaXplZCBSZXNvdXJjZSBnZXRQZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZSgpIHsKLQkJCXJldHVybiBwZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZTsKLQkJfQotCQkKLQkJLyoKLQkJICogU2V0IHRoZSBlbnRyeS4gVGhlIHNlcXVlbmNlIGdldCxkbyBzb21ldGhpbmcsc2V0IG11c3QgYmUgZ3JvdXBlZCB3aXRoaW4gYSBzeW5jaHJvbml6ZWQoQ2xhc3NFbnRyeSkuIAotCQkgKiA8cD4gPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgdGhlIGNhY2hlIGNvbnRyb2xsZXIgc2hvdWxkIGFjY2VzcyBpdC4gCi0JCSAqIEBwYXJhbSBjYWNoZVJlc291cmNlIFRoZSBjYWNoZVJlc291cmNlIHRvIHNldC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRQZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZShSZXNvdXJjZSBwZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZSkgewotCQkJdGhpcy5wZW5kaW5nT3ZlcnJpZGVSZXNvdXJjZSA9IHBlbmRpbmdPdmVycmlkZVJlc291cmNlOwotCQl9Ci0KLQkJLyoKLQkJICogPHBhY2thZ2UtcHJvdGVjdGVkPiBiZWNhdXNlIG9ubHkgdGhlIGNhY2hlIGNvbnRyb2xsZXIgc2hvdWxkIGFjY2VzcyBpdC4gQHBhcmFtIHJvb3RJbmRleCBUaGUgcm9vdEluZGV4IHRvIHNldC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRSb290SW5kZXgoUm9vdEluZGV4IHJvb3RJbmRleCkgewotCQkJdGhpcy5yb290SW5kZXggPSByb290SW5kZXg7Ci0JCX0KLQotCQkvKgotCQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSB0aGUgY2FjaGUgY29udHJvbGxlciBzaG91bGQgYWNjZXNzIGl0LiBAcmV0dXJuIFJldHVybnMgdGhlIHJvb3RJbmRleC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJUm9vdEluZGV4IGdldFJvb3RJbmRleCgpIHsKLQkJCXJldHVybiByb290SW5kZXg7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IHRoZSBjYWNoZSBjb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0U3VwZXJNb2RpZmljYXRpb25TdGFtcChsb25nIHN1cGVyTW9kaWZpY2F0aW9uU3RhbXApIHsKLQkJCXRoaXMuc3VwZXJNb2RpZmljYXRpb25TdGFtcCA9IHN1cGVyTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKgotCQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSB0aGUgY2FjaGUgY29udHJvbGxlciBzaG91bGQgYWNjZXNzIGl0LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldEludGVyZmFjZU5hbWVzKFN0cmluZ1tdIGludGVyZmFjZU5hbWVzKSB7Ci0JCQl0aGlzLmludGVyZmFjZU5hbWVzID0gaW50ZXJmYWNlTmFtZXM7Ci0JCX0KLQotCQkvKgotCQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSB0aGUgY2FjaGUgY29udHJvbGxlciBzaG91bGQgYWNjZXNzIGl0LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldEludGVyZmFjZU1vZGlmaWNhdGlvblN0YW1wcyhsb25nW10gaW50ZXJmYWNlTW9kaWZpY2F0aW9uU3RhbXBzKSB7Ci0JCQl0aGlzLmludGVyZmFjZU1vZGljYXRpb25TdGFtcHMgPSBpbnRlcmZhY2VNb2RpZmljYXRpb25TdGFtcHM7Ci0JCX0KLQkJCi0JfQotCi0JLyoKLQkgKiBNYWluIGluZGV4IGZvciB0aGUgZXh0ZXJuYWwgamFycy4gVGhpcyB2YXJpYWJsZSBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgZXhjZXB0IHRocm91Z2ggdGhlIGdldE1haW5JbmRleCgpIGFjY2Vzc29yLiBUaGF0IGNvbnRyb2xzCi0JICogc3luY2hyb25pemF0aW9uIGFuZCByZXN0b3JhdGlvbiBhcyBuZWVkZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXggTUFJTl9JTkRFWDsKLQotCS8qCi0JICogS2V5IGludG8gdGhlIFByb2plY3QncyBzZXNzaW9uIGRhdGEgZm9yIHRoZSBwcm9qZWN0IGluZGV4LiBUaGUgUHJvamVjdCBpbmRleCBpcyBzdG9yZWQgaW4gdGhlIHByb2plY3QncyBzZXNzaW9uIGRhdGEuIFRoYXQKLQkgKiB3YXkgd2hlbiB0aGUgcHJvamVjdCBpcyBjbG9zZWQgb3IgZGVsZXRlZCBpdCB3aWxsIGdvIGF3YXkuIAotCSAqIAotCSAqIFRoZSBwcm9qZWN0IGluZGV4ZXMgd2lsbCBiZSByZWFkIGluIGFzIG5lZWRlZCBvbiBhIHBlci1wcm9qZWN0IGJhc2lzLiBUaGlzIHZhcmlhYmxlIHNob3VsZCBub3QgYmUKLQkgKiByZWZlcmVuY2VkIGRpcmVjdGx5IGV4Y2VwdCB0aHJvdWdoIHRoZSBnZXRQcm9qZWN0SW5kZXgoSVByb2plY3QpIGFjY2Vzc29yLiBUaGF0IGNvbnRyb2xzIHN5bmNocm9uaXphdGlvbiBhbmQgcmVzdG9yYXRpb24gYXMgbmVlZGVkLgotCSAqIE9ubHkgZHVyaW5nIGNsZWFudXAgYW5kIHN1Y2ggd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeW91IG11c3QgdXNlIHN5bmModGhpcykuIEJlIGNhcmVmdWwgdG8ga2VlcCAKLQkgKiB0aGUgc3luYyBzbWFsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST0pFQ1RfSU5ERVhfS0VZID0gbmV3IFF1YWxpZmllZE5hbWUoQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQsICJwcm9qZWN0X2luZGV4Iik7CS8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogU3VmZml4IGZvciBjbGFzcyBjYWNoZSBmaWxlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQ0FDSEVfU1VGRklYID0gIi54bWkiOyAvLyROT04tTkxTLTEkCi0JLyoKLQkgKiBTdWZmaWMgZm9yIGNsYXNzIG92ZXJyaWRlIGNhY2hlIGZpbGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSUklERV9DQUNIRV9TVUZGSVggPSAiLm92ZXJyaWRlLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBjbGFzcyBlbnRyeSBmb3IgdGhlIEphdmFDbGFzcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY3VycmVudCBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gamNsYXNzCi0JICogQHJldHVybiBjbGFzcyBlbnRyeSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjdXJyZW50IGVudHJ5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBDbGFzc0VudHJ5IGdldENsYXNzRW50cnkoSmF2YUNsYXNzIGpjbGFzcykgewotCQlJVHlwZSB0eXBlID0gKElUeXBlKSBqY2xhc3MuZ2V0UmVmbGVjdGlvblR5cGUoKTsKLQkJUm9vdEluZGV4IHJvb3RJbmRleCA9IGdldFJvb3RJbmRleCh0eXBlKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGpjbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gZ2V0Q2xhc3NFbnRyeShyb290SW5kZXgsIGNsYXNzTmFtZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEVudW1lcmF0aW9uIGZvciBuZXdDYWNoZTogU2lnbmFscyB0aGF0IHRoaXMgY2FjaGUgaXMgdGhlIFJlZmxlY3Rpb24gQ2FjaGUgd2l0aCBubyBvcGVyYXRpb25zIGluIGl0LgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFRkxFQ1RJT05fQ0FDSEUgPSAxOwotCS8qKgotCSAqIEVudW1lcmF0aW9uIGZvciBuZXdDYWNoZTogU2lnbmFscyB0aGF0IHRoaXMgY2FjaGUgaXMgdGhlIFJlZmxlY3Rpb24gQ2FjaGUgd2l0aCBvcGVyYXRpb25zIGluIGl0LgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFRkxFQ1RJT05fT1BFUkFUSU9OU19DQUNIRSA9IDI7Ci0JLyoqCi0JICogRW51bWVyYXRpb24gZm9yIG5ld0NhY2hlOiBTaWduYWxzIHRoYXQgdGhpcyBjYWNoZSBpcyB0aGUgT3ZlcnJpZGVzIGNhY2hlLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE9WRVJSSURFU19DQUNIRSA9IDM7Ci0JLyoqCi0JICogQSBuZXcgY2FjaGUgZW50cnkgZm9yIHRoZSBnaXZlbiBjbGFzcyBoYXMgYmVlbiBjcmVhdGVkLiBOZWVkIHRvIHdyaXRlIGl0IG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gamNsYXNzCi0JICogICAgICAgICAgICB0aGUgSmF2YUNsYXNzIHRoZSBjYWNoZSBpcyBmb3IuCi0JICogQHBhcmFtIGNhY2hlCi0JICogICAgICAgICAgICB0aGUgQ2hhbmdlRGVzY3JpcHRpb24gdG8gcHV0IG91dCBpZiBjYWNoZVR5cGUgaXMgUmVmbGVjdGlvbiB0eXBlcywgYSBMaXN0IGlmIG92ZXJyaWRlIGNhY2hlIHR5cGUuCi0JICogQHBhcmFtIGNhY2hlVHlwZQotCSAqICAgICAgICAgICAge0BsaW5rIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLkNsYXNzRW50cnkjUkVGTEVDVElPTl9DQUNIRX0gZm9yIHRoZSBlbnVtIHZhbHVlcy4KLQkgKiBAcmV0dXJuIG5ldyBjbGFzcyBlbnRyeSAob3Igb2xkIG9uZSBpZiBzYW1lIG9uZSkuIFNob3VsZCBhbHdheXMgcmVwbGFjZSBvbmUgYmVpbmcgaGVsZCBieSB0aGlzIG9uZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgY2FjaGUgY291bGQgbm90IGJlCi0JICogICAgICAgICB1cGRhdGVkIGZvciBzb21lIHJlYXNvbi4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgQ2xhc3NFbnRyeSBuZXdDYWNoZShKYXZhQ2xhc3MgamNsYXNzLCBPYmplY3QgY2FjaGUsIGludCBjYWNoZVR5cGUpIHsKLQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpOwotCQkJU3RyaW5nIHR5cGUgPSBjYWNoZVR5cGUhPU9WRVJSSURFU19DQUNIRT8iQ2xhc3MiOiJPdmVycmlkZXMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChjYWNoZVR5cGUgPT0gT1ZFUlJJREVTX0NBQ0hFICYmIGNhY2hlID09IG51bGwpCi0JCQkJdHlwZSs9IiAgZW1wdHkiOyAvLyROT04tTkxTLTEkCi0JCQlsb2dnZXIubG9nKCJDcmVhdGluZyBjYWNoZSBmb3IgY2xhc3MgIitqY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSsiIGNhY2hlIHR5cGU9Iit0eXBlLCBMZXZlbC5GSU5FUik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCUNoYW5nZURlc2NyaXB0aW9uIGNkID0gbnVsbDsKLQkJaWYgKGNhY2hlVHlwZSAhPSBPVkVSUklERVNfQ0FDSEUpIHsKLQkJCS8vIEZpcnN0IGdvIHRocm91Z2ggdGhlIGNkIGFuZCByZW1vdmUgYW55IGVtcHR5IGNoYW5nZXMuIFRoaXMgaXMgYmVjYXVzZSB3ZSBjcmVhdGVkIHRoZSBmZWF0dXJlIGNoYW5nZSBiZWZvcmUgd2Uga25ldyB3aGF0IHdlbnQgaW50bwotCQkJLy8gaXQsIGFuZCBhdCB0aW1lcyBub3RoaW5nIGdvZXMgaW50byBpdC4KLQkJCWNkID0gKENoYW5nZURlc2NyaXB0aW9uKSBjYWNoZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNkLmdldE9iamVjdENoYW5nZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0VG9DaGFuZ2VzTWFwRW50cnlJbXBsIGZjRW50cnkgPSAoRU9iamVjdFRvQ2hhbmdlc01hcEVudHJ5SW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCgoTGlzdCkgZmNFbnRyeS5nZXRWYWx1ZSgpKS5pc0VtcHR5KCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7IC8vIEVtcHR5IGNoYW5nZXMsIHJlbW92ZSBpdC4KLQkJCX0KLQkJfQotCQlJVHlwZSB0eXBlID0gKElUeXBlKSBqY2xhc3MuZ2V0UmVmbGVjdGlvblR5cGUoKTsKLQkJUm9vdEluZGV4IHJvb3RJbmRleCA9IGdldFJvb3RJbmRleCh0eXBlKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGpjbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlDbGFzc0VudHJ5IGNlID0gZ2V0Q2xhc3NFbnRyeShyb290SW5kZXgsIGNsYXNzTmFtZSwgdHJ1ZSk7IC8vIENyZWF0ZSBpdCBpZiBub3QgZXhpc3RpbmcuCi0JCS8vIFN5bmMgb24gY2Ugc28gdGhhdCBvbmx5IGNhbiBjcmVhdGUgYSBjYWNoZSBmb3IgYSBjbGFzcyBhdCBhIHRpbWUgYW5kIHNvIHRoYXQgd3JpdGluZyAoaWYgb2NjdXJyaW5nIGF0IHRoZSBzYW1lIHRpbWUgZm9yIHRoZSBjbGFzcykgY2FuIGJlCi0JCS8vIGhlbGQgdXAuCi0JCS8vIHRoaXMgaXMgYSB2aW9sYXRpb24gb2YgdGhlIGFncmVlbWVudCB0byBvbmx5IHN5bmMgb24gVEhJUywgYnV0IGl0IGlzIG5lY2Vzc2FyeSBvciBlbHNlIHRoZSB3cml0ZSBqb2Igd291bGQgbG9jayBldmVyeXRoaW5nIG91dCB3aGlsZSBpdCBpcwotCQkvLyB3cml0aW5nLiBUaGlzIHdheSBpdCBvbmx5IGxvY2tzIG91dCBvbmUgY2xhc3MsIGlmIHRoZSBjbGFzcyBpcyBhdCB0aGUgc2FtZSB0aW1lLgotCQkvLyBXZSBzaG91bGRuJ3QgaGF2ZSBkZWFkbG9jayBiZWNhdXNlIGhlcmUgd2UgbG9jayBjZSBhbmQgdGhlbiBUSElTIChtYXliZSkuIFRoZSB3cml0ZSBqb2Igd2lsbCBsb2NrIGNlLCBhbmQgdGhlbiBsb2NrIFRISVMuIEV2ZXJ5d2hlcmUgZWxzZQotCQkvLyB3ZSBtdXN0Ci0JCS8vIGFsc28gZG8gbG9jayBjZSB0aGVuIFRISVMuIE11c3RuJ3QgZG8gb3RoZXIgd2F5IGFyb3VuZCBvciBwb3NzaWJpbGl0eSBvZiBkZWFkbG9jay4gQmUgY2FyZWZ1bCB0aGF0IGFueSBzeW5jaHJvbml6ZWQgbWV0aG9kcyBpbiB0aGlzIGNsYXNzCi0JCS8vIGRvCi0JCS8vIG5vdCBsb2NrIGFuIGV4aXN0aW5nIGNlLgotCQlSZXNvdXJjZVNldCBjYWNoZVJzZXQgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGNlKSB7Ci0JCQlSZXNvdXJjZSBjcmVzOwotCQkJaWYgKGNhY2hlVHlwZSAhPSBPVkVSUklERVNfQ0FDSEUpIHsKLQkJCQljcmVzID0gY2UuZ2V0UGVuZGluZ1Jlc291cmNlKCk7Ci0JCQkJaWYgKGNyZXMgIT0gbnVsbCkgewotCQkJCQkvLyBXZSBoYXZlIGEgcGVuZGluZywgc28gY2xlYXIgYW5kIHJldXNlIHRoZSByZXNvdXJjZS4KLQkJCQkJY3Jlcy5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gTm90IGN1cnJlbnRseSB3cml0aW5nIG9yIHdhaXRpbmcgdG8gd3JpdGUsIHNvIGNyZWF0ZSBhIG5ldyByZXNvdXJjZS4KLQkJCQkJY3JlcyA9IGpjbGFzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKAotCQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKHJvb3RJbmRleC5nZXRDYWNoZVBhdGgoKS5hcHBlbmQoY2xhc3NOYW1lICsgQ0xBU1NfQ0FDSEVfU1VGRklYKS50b1N0cmluZygpKSk7Ci0JCQkJfQotCQkJCWNhY2hlUnNldCA9IGNyZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQljZS5zZXRPcGVyYXRpb25zU3RvcmVkKGNhY2hlVHlwZSA9PSBSRUZMRUNUSU9OX09QRVJBVElPTlNfQ0FDSEUpOwotCQkJCWNlLnNldFBlbmRpbmdSZXNvdXJjZShjcmVzKTsKLQkJCQljcmVzLmdldENvbnRlbnRzKCkuYWRkKGNkKTsKLQkJCQkvLyBBcmNoaXZlcyB1c2Ugc2FtZSBtb2QgYXMgYXJjaGl2ZSAocmV0cmlldmUgZnJvbSByb290aW5kZXgpLCB3aGlsZSBub24tYXJjaGl2ZSB1c2UgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UncyBtb2Qgc3RhbXAuCi0JCQkJaWYgKHJvb3RJbmRleC5pc0FyY2hpdmVSb290KCkpCi0JCQkJCWNlLnNldE1vZGlmaWNhdGlvblN0YW1wKCgoQXJjaGl2ZVJvb3RJbmRleCkgcm9vdEluZGV4KS5nZXRBcmNoaXZlTW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljZS5zZXRNb2RpZmljYXRpb25TdGFtcCh0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQkJY2UubWFya0RlbGV0ZWQoKTsgLy8gTWFyayBhcyBkZWxldGVkIGluIGNhc2UgdGhpcyB3YXMgYW4gZXhpc3RpbmcgdGhhdCBzb21lb25lIGlzIGhvbGRpbmcuCi0JCQkJCQlyZXR1cm4gbnVsbDsgLy8gQ291bGRuJ3QgZG8gaXQsIHRocm93IGNhY2hlIGVudHJ5IGF3YXkuIFRoaXMgYWN0dWFsbHkgc2hvdWxkIG5ldmVyIG9jY3VyLgotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIE5lZWQgdG8gZ2V0IHRoZSBzdXBlcnMgaW5mby4gCi0JCQkJTGlzdCBzdXBlcnMgPSBqY2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCQlpZiAoIXN1cGVycy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gV2UgYXNzdW1lIHRoYXQgdGhleSBhbGwgaGF2ZSBiZWVuIGludHJvc3BlY3RlZC4gVGhpcyB3YXMgZG9uZSBiYWNrIGluIG1haW4gaW50cm9zcGVjdGlvbi4gSWYgdGhleSBhcmUgaW50cm9zcGVjdGVkIHRoZXkgd2lsbCBoYXZlIGEgY2xhc3MgZW50cnkuCi0JCQkJCUJlYW5pbmZvQ2xhc3NBZGFwdGVyIGJjYSA9IEJlYW5pbmZvQ2xhc3NBZGFwdGVyLmdldEJlYW5pbmZvQ2xhc3NBZGFwdGVyKChFT2JqZWN0KSBzdXBlcnMuZ2V0KDApKTsKLQkJCQkJQ2xhc3NFbnRyeSBzdXBlckNFID0gYmNhLmdldENsYXNzRW50cnkoKTsKLQkJCQkJaWYgKHN1cGVyQ0UgIT0gbnVsbCkKLQkJCQkJCWNlLnNldFN1cGVyTW9kaWZpY2F0aW9uU3RhbXAoc3VwZXJDRS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKTsKLQkJCQkJZWxzZQotCQkJCQkJY2Uuc2V0U3VwZXJNb2RpZmljYXRpb25TdGFtcChDbGFzc0VudHJ5LlNVUEVSX1VOREVGSU5FRF9NT0RJRklDQVRJT05fU1RBTVApOwkvLyBObyBjbGFzc2VudHJ5IG1lYW5zIHVuZGVmaW5lZC4gU28gcHV0IHNvbWV0aGluZyBpbiBzbyB0aGF0IHdoZW4gaXQgYmVjb21lcyBkZWZpbmVkIHdlIHdpbGwga25vdy4KLQkJCQkJaWYoc3VwZXJzLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQljZS5zZXRJbnRlcmZhY2VOYW1lcyhudWxsKTsKLQkJCQkJCWNlLnNldEludGVyZmFjZU1vZGlmaWNhdGlvblN0YW1wcyhudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ1tdIGludGVyTmFtZXMgPSBuZXcgU3RyaW5nW3N1cGVycy5zaXplKCktMV07Ci0JCQkJCQlsb25nW10gaW50ZXJNb2RzID0gbmV3IGxvbmdbaW50ZXJOYW1lcy5sZW5ndGhdOwotCQkJCQkJZm9yIChpbnQgaSA9IDEsIGluZHggPSAwOyBpIDwgaW50ZXJOYW1lcy5sZW5ndGg7IGkrKywgaW5keCsrKSB7Ci0JCQkJCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIHN1cGVycy5nZXQoaSk7Ci0JCQkJCQkJYmNhID0gQmVhbmluZm9DbGFzc0FkYXB0ZXIuZ2V0QmVhbmluZm9DbGFzc0FkYXB0ZXIoamF2YUNsYXNzKTsKLQkJCQkJCQliY2EuaW50cm9zcGVjdElmTmVjZXNzYXJ5KCk7CS8vIEZvcmNlIGludHJvc3BlY3Rpb24gdG8gZ2V0IGEgdmFsaWQgc3VwZXIgbW9kIHN0YW1wLgotCQkJCQkJCXN1cGVyQ0UgPSBiY2EuZ2V0Q2xhc3NFbnRyeSgpOwotCQkJCQkJCWludGVyTmFtZXNbaW5keF0gPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoc3VwZXJDRSAhPSBudWxsKQotCQkJCQkJCQlpbnRlck1vZHNbaW5keF0gPSBzdXBlckNFLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlpbnRlck1vZHNbaW5keF0gPSBDbGFzc0VudHJ5LlNVUEVSX1VOREVGSU5FRF9NT0RJRklDQVRJT05fU1RBTVA7CS8vIE5vIGNsYXNzZW50cnkgbWVhbnMgdW5kZWZpbmVkLiBTbyBwdXQgc29tZXRoaW5nIGluIHNvIHRoYXQgd2hlbiBpdCBiZWNvbWVzIGRlZmluZWQgd2Ugd2lsbCBrbm93LgotCQkJCQkJfQotCQkJCQkJY2Uuc2V0SW50ZXJmYWNlTmFtZXMoaW50ZXJOYW1lcyk7Ci0JCQkJCQljZS5zZXRJbnRlcmZhY2VNb2RpZmljYXRpb25TdGFtcHMoaW50ZXJNb2RzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNlLnNldFN1cGVyTW9kaWZpY2F0aW9uU3RhbXAoSVJlc291cmNlLk5VTExfU1RBTVApOwotCQkJCQljZS5zZXRJbnRlcmZhY2VOYW1lcyhudWxsKTsKLQkJCQkJY2Uuc2V0SW50ZXJmYWNlTW9kaWZpY2F0aW9uU3RhbXBzKG51bGwpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gV2UgYXJlIGFuIG92ZXJyaWRlIGNhY2hlLgotCQkJCWlmIChjYWNoZSAhPSBudWxsKSB7IAotCQkJCQljcmVzID0gY2UuZ2V0UGVuZGluZ092ZXJyaWRlUmVzb3VyY2UoKTsKLQkJCQkJaWYgKGNyZXMgIT0gbnVsbCkgewotCQkJCQkJLy8gV2UgaGF2ZSBhIHBlbmRpbmcsIHNvIGNsZWFyIGFuZCByZXVzZSB0aGUgcmVzb3VyY2UuCi0JCQkJCQljcmVzLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIE5vdCBjdXJyZW50bHkgd3JpdGluZyBvciB3YWl0aW5nIHRvIHdyaXRlLCBzbyBjcmVhdGUgYSBuZXcgcmVzb3VyY2UuCi0JCQkJCQljcmVzID0gamNsYXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoCi0JCQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKHJvb3RJbmRleC5nZXRDYWNoZVBhdGgoKS5hcHBlbmQoY2xhc3NOYW1lICsgT1ZFUlJJREVfQ0FDSEVfU1VGRklYKS50b1N0cmluZygpKSk7Ci0JCQkJCX0KLQkJCQkJY2FjaGVSc2V0ID0gY3Jlcy5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQljcmVzLmdldENvbnRlbnRzKCkuYWRkQWxsKChMaXN0KSBjYWNoZSk7Ci0JCQkJCWNlLnNldFBlbmRpbmdPdmVycmlkZVJlc291cmNlKGNyZXMpOwotCQkJCQljZS5zZXRPdmVycmlkZUNhY2hlRXhpc3RzKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNlLnNldFBlbmRpbmdPdmVycmlkZVJlc291cmNlKG51bGwpOwotCQkJCQljZS5zZXRPdmVycmlkZUNhY2hlRXhpc3RzKGZhbHNlKTsKLQkJCQl9Ci0JCQkJY2Uuc2V0Q29uZmlndXJhdGlvbk1vZGlmaWNhdGlvblN0YW1wKFBsYXRmb3JtLmdldFBsYXRmb3JtQWRtaW4oKS5nZXRTdGF0ZShmYWxzZSkuZ2V0VGltZVN0YW1wKCkpOwotCQkJfQotCQl9Ci0JCXF1ZXVlQ2xhc3NFbnRyeShjZSwgY2FjaGVSc2V0KTsgLy8gTm93IHF1ZXVlIGl0IHVwLgotCQlyZXR1cm4gY2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjYWNoZSByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGphdmEgY2xhc3MuCi0JICogPHA+Ci0JICogTk9URTogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gQUxXQVlTIHJlbW92ZSB0aGUgUmVzb3VyY2UgZnJvbSBpdHMgcmVzb3VyY2Ugc2V0IHdoZW4gZG9uZSB3aXRoIGl0LgotCSAqIAotCSAqIEBwYXJhbSBqY2xhc3MKLQkgKiBAcGFyYW0gY2UgdGhlIGNsYXNzIGVudHJ5IGZvciB0aGUgamNsYXNzCi0JICogQHBhcmFtIHJlZmxlY3RDYWNoZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHRoZSByZWZsZWN0aW9uL2ludHJvc3BlY3Rpb24gY2FjaGUgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgaXMgdGhlIG92ZXJyaWRlIGNhY2hlLgotCSAqIEByZXR1cm4gdGhlIGxvYWRlZCBjYWNoZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHRoZXJlIChmb3Igc29tZSByZWFzb24pIG9yIGFuIGVycm9yIHRyeWluZyB0byBsb2FkIGl0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRDYWNoZShKYXZhQ2xhc3MgamNsYXNzLCBDbGFzc0VudHJ5IGNlLCBib29sZWFuIHJlZmxlY3RDYWNoZSkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gamNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCWlmIChCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVmbGVjdENhY2hlPyJDbGFzcyI6Ik92ZXJyaWRlcyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nZ2VyLmxvZygiTG9hZGluZyBjYWNoZSBmb3IgY2xhc3MgIitjbGFzc05hbWUrIiBjYWNoZSB0eXBlPSIrdHlwZSwgTGV2ZWwuRklORVIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChyZWZsZWN0Q2FjaGUpIHsKLQkJCWJvb2xlYW4gd2FpdEZvckpvYiA9IGZhbHNlOwotCQkJc3luY2hyb25pemVkIChjZSkgewotCQkJCWlmIChjZS5nZXRQZW5kaW5nUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCS8vIFdlIGhhdmUgb25lIHBlbmRpbmcuIFNvIHdhaXQgdW50aWwgd3JpdGUgY2FjaGUgam9iIGlzIGRvbmUsIGFuZCB0aGVuIGxvYWQgaXQgaW4uCi0JCQkJCS8vIE5vdGU6IENhbid0IGp1c3QgY29weSB0aGUgcGVuZGluZyByZXNvdXJjZSBiZWNhdXNlIGl0IGhhcyByZWZlcmVuY2VzIHRvIEphdmFDbGFzc2VzCi0JCQkJCS8vIGFuZCB0aGVzZSBjb3VsZCBiZSBpbiBhIGRpZmZlcmVudCBwcm9qZWN0IChzaW5jZSB0aGlzIGNvdWxkIGJlIGEgd29ya3NwYWNlIHdpZGUgY2xhc3MpLgotCQkJCQkvLyBXZSB3b3VsZCBnZXQgdGhlIHdyb25nIGphdmEgY2xhc3NlcyB0aGVuIHdoZW4gd2UgYXBwbHkgaXQuIAotCQkJCQl3YWl0Rm9ySm9iID0gdHJ1ZTsKLQkJCQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygiVXNpbmcgcGVuZGluZyBjbGFzcyBjYWNoZS4iLCBMZXZlbC5GSU5FUik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAod2FpdEZvckpvYikKLQkJCQl3YWl0Rm9yQ2FjaGVTYXZlSm9iKCk7CQotCi0JCQl0cnkgewotCQkJCXJldHVybiBqY2xhc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSgKLQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKGNlLmdldFJvb3RJbmRleCgpLmdldENhY2hlUGF0aCgpLmFwcGVuZCgKLQkJCQkJCQkJY2xhc3NOYW1lICsgQ0xBU1NfQ0FDSEVfU1VGRklYKS50b1N0cmluZygpKSwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIFNvbWV0aGluZyBoYXBwZW5lZCBhbmQgY291bGRuJ3QgbG9hZCBpdC4KLQkJCQkvLyBUT0RPIC0gbmVlZCB0byByZW1vdmUgdGhlIExldmVsLklORk8gYXJnIHdoZW4gdGhlIGJlYW5pbmZvIGNhY2hlIGlzIHdvcmtpbmcgZHluYW1pY2FsbHkKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIHdhaXRGb3JKb2IgPSBmYWxzZTsKLQkJCXN5bmNocm9uaXplZCAoY2UpIHsKLQkJCQlpZiAoY2UuZ2V0UGVuZGluZ092ZXJyaWRlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCS8vIFdlIGhhdmUgb25lIHBlbmRpbmcuIFNvIHdhaXQgdW50aWwgd3JpdGUgY2FjaGUgam9iIGlzIGRvbmUsIGFuZCB0aGVuIGxvYWQgaXQgaW4uCi0JCQkJCS8vIE5vdGU6IENhbid0IGp1c3QgY29weSB0aGUgcGVuZGluZyByZXNvdXJjZSBiZWNhdXNlIGl0IGhhcyByZWZlcmVuY2VzIHRvIEphdmFDbGFzc2VzCi0JCQkJCS8vIGFuZCB0aGVzZSBjb3VsZCBiZSBpbiBhIGRpZmZlcmVudCBwcm9qZWN0IChzaW5jZSB0aGlzIGNvdWxkIGJlIGEgd29ya3NwYWNlIHdpZGUgY2xhc3MpLgotCQkJCQkvLyBXZSB3b3VsZCBnZXQgdGhlIHdyb25nIGphdmEgY2xhc3NlcyB0aGVuIHdoZW4gd2UgYXBwbHkgaXQuIAotCQkJCQl3YWl0Rm9ySm9iID0gdHJ1ZTsKLQkJCQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygiVXNpbmcgcGVuZGluZyBvdmVycmlkZSBjYWNoZS4iLCBMZXZlbC5GSU5FUik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAod2FpdEZvckpvYikKLQkJCQl3YWl0Rm9yQ2FjaGVTYXZlSm9iKCk7CQotCi0JCQl0cnkgewotCQkJCXJldHVybiBqY2xhc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSgKLQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKGNlLmdldFJvb3RJbmRleCgpLmdldENhY2hlUGF0aCgpLmFwcGVuZCgKLQkJCQkJCQkJY2xhc3NOYW1lICsgT1ZFUlJJREVfQ0FDSEVfU1VGRklYKS50b1N0cmluZygpKSwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIFNvbWV0aGluZyBoYXBwZW5lZCBhbmQgY291bGRuJ3QgbG9hZCBpdC4KLQkJCQkvLyBUT0RPIC0gbmVlZCB0byByZW1vdmUgdGhlIExldmVsLklORk8gYXJnIHdoZW4gdGhlIGJlYW5pbmZvIGNhY2hlIGlzIHdvcmtpbmcgZHluYW1pY2FsbHkKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBDbGFzc0VudHJ5IGdldENsYXNzRW50cnkoUm9vdEluZGV4IHJvb3RJbmRleCwgU3RyaW5nIGNsYXNzTmFtZSwgYm9vbGVhbiBjcmVhdGVFbnRyeSkgewotCQlDbGFzc0VudHJ5IGNlID0gKENsYXNzRW50cnkpIHJvb3RJbmRleC5jbGFzc05hbWVUb0NsYXNzRW50cnkuZ2V0KGNsYXNzTmFtZSk7Ci0JCWlmIChjcmVhdGVFbnRyeSAmJiBjZSA9PSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGNyZWF0ZSBvbmUuCi0JCQljZSA9IG5ldyBDbGFzc0VudHJ5KHJvb3RJbmRleCwgY2xhc3NOYW1lKTsKLQkJCS8vIERvbid0IGFjdHVhbGx5IG1hcmsgdGhlIHJvb3RJbmRleCBkaXJ0eSB1bnRpbCB0aGUgY2FjaGUgZm9yIGl0IGlzIGFjdHVhbGx5IHNhdmVkIG91dC4KLQkJfQotCQlyZXR1cm4gY2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUFJFRklYID0gInJvb3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIEdldCB0aGUgcm9vdCBpbmRleCBmb3IgdGhlIGFwcHJvcHJpYXRlIGNhY2hlIGZvciB0aGUgZ2l2ZW4gamF2YSBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIFJvb3RJbmRleCBnZXRSb290SW5kZXgoSVR5cGUgdHlwZSkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSB0eXBlLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQlpZiAoIXJvb3QuaXNFeHRlcm5hbCgpKSB7Ci0JCQkvLyBTbyBpdCBpcyBpbiBhIHByb2plY3QuIEdldCB0aGUgcHJvamVjdCBpbmRleC4KLQkJCXJldHVybiBnZXRSb290SW5kZXgocm9vdCwgcm9vdC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdCBpcyBhbiBleHRlcm5hbCBqYXIgKGFyY2hpdmUpLCBzbyBuZWVkcyB0byBjb21lIGZyb20gbWFpbiBpbmRleCwgbm8gcHJvamVjdC4KLQkJCXJldHVybiBnZXRSb290SW5kZXgocm9vdCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgcm9vdCBpbmRleCBmb3IgdGhlIGdpdmVuIHJvb3QuIEEgUHJvamVjdCBpbmRleCBpZiBwcm9qZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIFJvb3RJbmRleCBnZXRSb290SW5kZXgoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgSVByb2plY3QgcHJvamVjdCkgewotCQlJbmRleCBpbmRleCA9IHByb2plY3QgIT0gbnVsbCA/IGdldFByb2plY3RJbmRleChwcm9qZWN0KSA6IGdldE1haW5JbmRleCgpOwotCQlJUGF0aCByb290UGF0aCA9IHJvb3QuZ2V0UGF0aCgpOwotCQlSb290SW5kZXggcm9vdEluZGV4ID0gKFJvb3RJbmRleCkgaW5kZXgucm9vdFRvUm9vdEluZGV4LmdldChyb290UGF0aCk7Ci0JCWlmIChyb290SW5kZXggPT0gbnVsbCkgewotCQkJLy8gTmVlZCB0byBkbyBhIG5ldyByb290IHBhdGguCi0JCQlTdHJpbmcgcm9vdE5hbWUgPSBST09UX1BSRUZJWCArICgrK2luZGV4LmhpZ2hSb290TnVtYmVyKTsKLQkJCXJvb3RJbmRleCA9IHJvb3QuaXNBcmNoaXZlKCkgPyBjcmVhdGVBcmNoaXZlUm9vdEluZGV4KHJvb3QsIHJvb3ROYW1lLCBpbmRleCkgOiBuZXcgRm9sZGVyUm9vdEluZGV4KHJvb3ROYW1lLCBpbmRleCk7Ci0JCQlpbmRleC5yb290VG9Sb290SW5kZXgucHV0KHJvb3RQYXRoLCByb290SW5kZXgpOwotCQkJLy8gRG9uJ3Qgc2V0IGluZGV4IGRpcnR5IHVudGlsIHdlIGFjdHVhbGx5IHNhdmUgYSBjbGFzcyBjYWNoZSBmaWxlLiBVbnRpbCB0aGVuIGl0IG9ubHkgbmVlZHMgdG8gYmUgaW4gbWVtb3J5LgotCQl9Ci0JCXJvb3RJbmRleC5zZXR1cEluZGV4KHByb2plY3QpOyAvLyBTZXQgaXQgdXAsIG9yIG1heSBhbHJlYWR5IGJlIHNldCwgc28gaXQgd2lsbCBkbyBub3RoaW5nIGluIHRoYXQgY2FzZS4KLQkJcmV0dXJuIHJvb3RJbmRleDsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBhbiBhcmNoaXZlIHJvb3Qgd2l0aCB0aGUgZ2l2ZW4gcm9vdCBudW1iZXIgYW5kIHJvb3QuCi0JICovCi0JcHJpdmF0ZSBSb290SW5kZXggY3JlYXRlQXJjaGl2ZVJvb3RJbmRleChJUGFja2FnZUZyYWdtZW50Um9vdCByb290QXJjaGl2ZSwgU3RyaW5nIHJvb3ROYW1lLCBJbmRleCBpbmRleCkgewotCQlsb25nIG1vZFN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCWlmIChyb290QXJjaGl2ZS5pc0V4dGVybmFsKCkpIHsKLQkJCW1vZFN0YW1wID0gcm9vdEFyY2hpdmUuZ2V0UGF0aCgpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQltb2RTdGFtcCA9IHJvb3RBcmNoaXZlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IEFyY2hpdmVSb290SW5kZXgocm9vdE5hbWUsIG1vZFN0YW1wLCBpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYRklMRU5BTUUgPSAiLmluZGV4IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFRElSID0gIi5jYWNoZSI7IC8vIENhY2hlIGRpcmVjdG9yeSAoc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggYW55IGZ1dHVyZSBCZWFuSW5mbyBQbHVnaW4gc3BlY2lmaWMgZGF0YSBmaWxlcy4gLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBHZXQgdGhlIGNhY2hlIGRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QgKG9yIGlmIHByb2plY3QgaXMgbnVsbCwgdGhlIG1haW4gcGx1Z2luIGNhY2hlIGRpcmVjdG9yeSkuCi0JICovCi0JLy8gVE9ETzogbWFrZSB0aGlzIG9uZSBwcml2YXRlCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDYWNoZURpcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvamVjdC5nZXRXb3JraW5nTG9jYXRpb24oQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpLmFwcGVuZChDQUNIRURJUik7Ci0JCWVsc2UKLQkJCXJldHVybiBCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKENBQ0hFRElSKTsKLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgcHJvamVjdCBpbmRleC4gU3luY2hyb25pemVkIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkgYW5kIG5vdCBnZXQgcmFjZSBjb25kaXRpb25zLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIEluZGV4IGdldFByb2plY3RJbmRleChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJbmRleCBpbmRleCA9IChJbmRleCkgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVkpOwotCQkJaWYgKGluZGV4ID09IG51bGwpIHsKLQkJCQkvLyBSZWFkIHRoZSBpbmRleCBpbi4KLQkJCQlGaWxlIGluZGV4RGlyRmlsZSA9IGdldENhY2hlRGlyKHByb2plY3QpLmFwcGVuZChJTkRFWEZJTEVOQU1FKS50b0ZpbGUoKTsKLQkJCQlpZiAoaW5kZXhEaXJGaWxlLmNhblJlYWQoKSkgewotCQkJCQlPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5kZXhEaXJGaWxlKSkpOwotCQkJCQkJaW5kZXggPSAoSW5kZXgpIG9pcy5yZWFkT2JqZWN0KCk7Ci0JCQkJCX0gY2F0Y2ggKEludmFsaWRDbGFzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUaGlzIGlzIG9rLiBJdCBzaW1wbHkgbWVhbnMgdGhlIGNhY2hlIGluZGV4IGlzIGF0IGEgZG93bmxldmVsIGZvcm1hdCBhbmQgbmVlZHMgdG8gYmUgcmVjb25zdHJ1Y3RlZC4KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChvaXMgIT0gbnVsbCkKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlvaXMuY2xvc2UoKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaW5kZXggPT0gbnVsbCkgewotCQkJCQkvLyBEb2Vzbid0IHlldCBleGlzdCBvciBpdCBjb3VsZG4ndCBiZSByZWFkIGZvciBzb21lIHJlYXNvbiwgb3IgaXQgd2FzIGRvd25sZXZlbCBjYWNoZSBpbiB3aGljaCBjYXNlIHdlIGp1c3QgdGhyb3cgaXQgYXdheSBhbmQgY3JlYXRlCi0JCQkJCS8vIG5ldykuCi0JCQkJCWluZGV4ID0gbmV3IEluZGV4KCk7Ci0JCQkJCWluZGV4LmhpZ2hSb290TnVtYmVyID0gMDsKLQkJCQkJaW5kZXgucm9vdFRvUm9vdEluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQkJCQl9Ci0KLQkJCQlwcm9qZWN0LnNldFNlc3Npb25Qcm9wZXJ0eShQUk9KRUNUX0lOREVYX0tFWSwgaW5kZXgpOyAvLyBXZSBlaXRoZXIgY3JlYXRlZCBhIG5ldyBvbmUsIG9yIHdlIHdlcmUgYWJsZSB0byBsb2FkIGl0LgotCQkJfQotCQkJcmV0dXJuIGluZGV4OwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNob3VsZG4ndCBvY2N1ciwKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIG1haW4gaW5kZXguIFN5bmNocm9uaXplZCBzbyB0aGF0IHdlIGNhbiBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5IGFuZCBub3QgZ2V0IHJhY2UgY29uZGl0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJbmRleCBnZXRNYWluSW5kZXgoKSB7Ci0JCWlmIChNQUlOX0lOREVYID09IG51bGwpIHsKLQkJCS8vIFJlYWQgdGhlIGluZGV4IGluLgotCQkJRmlsZSBpbmRleERpckZpbGUgPSBnZXRDYWNoZURpcihudWxsKS5hcHBlbmQoSU5ERVhGSUxFTkFNRSkudG9GaWxlKCk7Ci0JCQlpZiAoaW5kZXhEaXJGaWxlLmNhblJlYWQoKSkgewotCQkJCU9iamVjdElucHV0U3RyZWFtIG9pcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5kZXhEaXJGaWxlKSkpOwotCQkJCQlNQUlOX0lOREVYID0gKEluZGV4KSBvaXMucmVhZE9iamVjdCgpOwotCQkJCX0gY2F0Y2ggKEludmFsaWRDbGFzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRoaXMgaXMgb2suIEl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgY2FjaGUgaW5kZXggaXMgYXQgYSBkb3dubGV2ZWwgZm9ybWF0IGFuZCBuZWVkcyB0byBiZSByZWNvbnN0cnVjdGVkLgotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKG9pcyAhPSBudWxsKQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlvaXMuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoTUFJTl9JTkRFWCA9PSBudWxsKSB7Ci0JCQkJLy8gRG9lc24ndCB5ZXQgZXhpc3Qgb3IgaXQgY291bGRuJ3QgYmUgcmVhZCBmb3Igc29tZSByZWFzb24sIG9yIGl0IHdhcyBkb3dubGV2ZWwgY2FjaGUgaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IHRocm93IGl0IGF3YXkgYW5kIGNyZWF0ZQotCQkJCS8vIG5ldykuCi0JCQkJTUFJTl9JTkRFWCA9IG5ldyBJbmRleCgpOwotCQkJCU1BSU5fSU5ERVguaGlnaFJvb3ROdW1iZXIgPSAwOwotCQkJCU1BSU5fSU5ERVgucm9vdFRvUm9vdEluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBNQUlOX0lOREVYOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tIFNhdmUgUGFydGljaXBhbnQgY29kZSAtLS0tLS0tLS0tLS0tLS0tLQotCi0JcHJvdGVjdGVkIGNsYXNzIFNhdmVQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElTYXZlUGFydGljaXBhbnQgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVQYXJ0aWNpcGFudCNkb25lU2F2aW5nKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlQ29udGV4dCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvbmVTYXZpbmcoSVNhdmVDb250ZXh0IGNvbnRleHQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVQYXJ0aWNpcGFudCNwcmVwYXJlVG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTYXZlQ29udGV4dCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByZXBhcmVUb1NhdmUoSVNhdmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVNhdmVQYXJ0aWNpcGFudCNyb2xsYmFjayhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZUNvbnRleHQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByb2xsYmFjayhJU2F2ZUNvbnRleHQgY29udGV4dCkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZVBhcnRpY2lwYW50I3NhdmluZyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU2F2ZUNvbnRleHQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzYXZpbmcoSVNhdmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWJvb2xlYW4gZnVsbHNhdmUgPSBmYWxzZTsKLQkJCXN3aXRjaCAoY29udGV4dC5nZXRLaW5kKCkpIHsKLQkJCQljYXNlIElTYXZlQ29udGV4dC5QUk9KRUNUX1NBVkU6Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBjb250ZXh0LmdldFByb2plY3QoKTsKLQkJCQkJc3luY2hyb25pemVkIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5JTlNUQU5DRSkgewotCQkJCQkJLy8gV3JpdGUgdGhlIGluZGV4LiBUaGUgY2FjaGUgc2F2ZSBqb2Igd2lsbCBldmVudHVhbGx5IHJ1biBhbmQgYXQgdGhhdCBwb2ludCB3cml0ZSBvdXQgdGhlIHBlbmRpbmcgY2FjaGUgZmlsZXMgdG9vLgotCQkJCQkJLy8gVGhleSBkb24ndCBuZWVkIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBwcm9qZWN0IHNhdmUgaXMgY29tcGxldGUuCi0JCQkJCQlJbmRleCBwcm9qZWN0SW5kZXggPSAoSW5kZXgpIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KFBST0pFQ1RfSU5ERVhfS0VZKTsKLQkJCQkJCWlmIChwcm9qZWN0SW5kZXggIT0gbnVsbCAmJiBwcm9qZWN0SW5kZXguaXNEaXJ0eSgpKQotCQkJCQkJCWlmIChyZWNvbmNpbGVJbmRleERpcmVjdG9yeShwcm9qZWN0LCBwcm9qZWN0SW5kZXgpKQotCQkJCQkJCQl3cml0ZUluZGV4KHByb2plY3QsIHByb2plY3RJbmRleCk7Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIEl0IHdhcyBlbXB0eSwganVzdCBnZXQgcmlkIG9mIHRoZSBpbmRleC4gVGhlIGRpcmVjdG9yaWVzIGhhdmUgYWxyZWFkeSBiZWVuIGNsZWFyZWQuCi0JCQkJCQkJCXByb2plY3RJbmRleC5tYXJrRGVhZCgpOwotCQkJCQkJCQlwcm9qZWN0LnNldFNlc3Npb25Qcm9wZXJ0eShQUk9KRUNUX0lOREVYX0tFWSwgbnVsbCk7Ci0JCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVNhdmVDb250ZXh0LkZVTExfU0FWRToKLQkJCQkJZnVsbHNhdmUgPSB0cnVlOwotCQkJCQl3YWl0Rm9yQ2FjaGVTYXZlSm9iKCk7Ci0JCQkJLy8gTm93IGZsb3cgaW50byB0aGUgc25hcHNob3Qgc2F2ZSB0byBjb21wbGV0ZSB0aGUgZnVsbHNhdmUuCi0JCQkJY2FzZSBJU2F2ZUNvbnRleHQuU05BUFNIT1Q6Ci0JCQkJCS8vIEZvciBhIHNuYXBzaG90LCBqdXN0IHRoZSBkaXJ0eSBpbmRleGVzLCBubyBjbGVhbiB1cC4gSWYgZnVsbHNhdmUsIGNsZWFudXAgdGhlIGluZGV4ZXMsIGJ1dCBvbmx5IHNhdmUgdGhlIGRpcnR5LgotCQkJCQlzeW5jaHJvbml6ZWQgKEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLklOU1RBTkNFKSB7Ci0JCQkJCQlpZiAoTUFJTl9JTkRFWCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGZ1bGxzYXZlKSB7Ci0JCQkJCQkJCWlmIChyZWNvbmNpbGVJbmRleERpcmVjdG9yeShudWxsLCBNQUlOX0lOREVYKSkgewotCQkJCQkJCQkJaWYgKE1BSU5fSU5ERVguaXNEaXJ0eSgpKQotCQkJCQkJCQkJCXdyaXRlSW5kZXgobnVsbCwgTUFJTl9JTkRFWCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBJdCB3YXMgZW1wdHksIGp1c3QgZ2V0IHJpZCBvZiB0aGUgaW5kZXguIFRoZSBkaXJlY3RvcmllcyBoYXZlIGFscmVhZHkgYmVlbiBjbGVhcmVkLgotCQkJCQkJCQkJTUFJTl9JTkRFWC5tYXJrRGVhZCgpOwotCQkJCQkJCQkJTUFJTl9JTkRFWCA9IG51bGw7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgaWYgKE1BSU5fSU5ERVguaXNEaXJ0eSgpKQotCQkJCQkJCQl3cml0ZUluZGV4KG51bGwsIE1BSU5fSU5ERVgpOwotCQkJCQkJfQotCQkJCQkJLy8gTm93IGRvIHRoZSBwcm9qZWN0IGluZGV4ZXMuIFdlIGhhdmUgdG8gd2FsayBhbGwgb3BlbiBwcm9qZWN0cyB0byBzZWUgd2hpY2ggaGF2ZSBhbiBpbmRleC4gU2luY2Ugd2UgYXJlCi0JCQkJCQkvLyBkb2luZyBhIG1ham9yIHNhdmUsIHRoZSBoaXQgd2lsbCBvawotCQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotCQkJCQkJCQlJbmRleCBpbmRleCA9IChJbmRleCkgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoUFJPSkVDVF9JTkRFWF9LRVkpOwotCQkJCQkJCQlpZiAoaW5kZXggIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKGZ1bGxzYXZlKSB7Ci0JCQkJCQkJCQkJaWYgKHJlY29uY2lsZUluZGV4RGlyZWN0b3J5KHByb2plY3QsIGluZGV4KSkgewotCQkJCQkJCQkJCQlpZiAoaW5kZXguaXNEaXJ0eSgpKQotCQkJCQkJCQkJCQkJd3JpdGVJbmRleChwcm9qZWN0LCBpbmRleCk7Ci0JCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJLy8gSXQgd2FzIGVtcHR5LCBqdXN0IGdldCByaWQgb2YgdGhlIGluZGV4IGZyb20gbWVtb3J5LiBJdCBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgZnJvbSBkaXNrLgotCQkJCQkJCQkJCQlpbmRleC5tYXJrRGVhZCgpOwotCQkJCQkJCQkJCQlwcm9qZWN0LnNldFNlc3Npb25Qcm9wZXJ0eShQUk9KRUNUX0lOREVYX0tFWSwgbnVsbCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIGlmIChpbmRleC5pc0RpcnR5KCkpCi0JCQkJCQkJCQkJd3JpdGVJbmRleChwcm9qZWN0LCBpbmRleCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFdyaXRlIGFuIGluZGV4LiBQcm9qZWN0IGlmIG5vdCBudWxsIGluZGljYXRlcyBhIHByb2plY3QgaW5kZXguCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgd3JpdGVJbmRleChJUHJvamVjdCBwcm9qZWN0LCBJbmRleCBpbmRleCkgewotCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUZpbGUgaW5kZXhEaXJGaWxlID0gZ2V0Q2FjaGVEaXIocHJvamVjdCkudG9GaWxlKCk7Ci0JCQkJaW5kZXhEaXJGaWxlLm1rZGlycygpOwotCQkJCUZpbGUgaW5kZXhGaWxlID0gbmV3IEZpbGUoaW5kZXhEaXJGaWxlLCBJTkRFWEZJTEVOQU1FKTsKLQkJCQlvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShpbmRleEZpbGUpKSk7Ci0JCQkJb29zLndyaXRlT2JqZWN0KGluZGV4KTsKLQkJCQlpbmRleC5zZXREaXJ0eShmYWxzZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAob29zICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlvb3MuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBSZWNvbmNpbGUgdGhlIGluZGV4IGRpcmVjdG9yeSBvZiB1bnVzZWQgKGVtcHR5KSByb290IGRpcmVjdG9yaWVzLiBJZiBhZnRlciByZWNvbmNpbGluZyB0aGUgaW5kZXggaXMgZW1wdHksIHRoZW4gaXQgd2lsbCBkZWxldGUgdGhlIGluZGV4IGZpbGUgdG9vLiBAcmV0dXJuCi0JCSAqIHRydWUgaWYgaW5kZXggbm90IGVtcHR5LCBmYWxzZSBpZiBpbmRleCB3YXMgZW1wdHkgYW5kIHdhcyBlcmFzZWQgdG9vLgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHJlY29uY2lsZUluZGV4RGlyZWN0b3J5KElQcm9qZWN0IHByb2plY3QsIEluZGV4IGluZGV4KSB7Ci0JCQkvLyBjbGVhbiBvdXQgdW51c2VkIHJvb3RJbmRleGVzCi0JCQlGaWxlIGluZGV4RGlyID0gZ2V0Q2FjaGVEaXIocHJvamVjdCkudG9GaWxlKCk7Ci0JCQlpZiAoaW5kZXhEaXIuY2FuV3JpdGUoKSkgewotCQkJCS8vIENyZWF0ZSBhIHNldCBvZiBhbGwgcm9vdCBuYW1lcyBmb3IgcXVpY2sgbG9vayB1cC4KLQkJCQlpZiAoaW5kZXgucm9vdFRvUm9vdEluZGV4LmlzRW1wdHkoKSkgewotCQkJCQkvLyBJdCBpcyBlbXB0eSwgY2xlYXIgZXZlcnl0aGluZywgaW5jbHVkaW5nIGluZGV4IGZpbGUuCi0JCQkJCWNsZWFuRGlyZWN0b3J5KGluZGV4RGlyLCBmYWxzZSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBOZWVkIGEgc2V0IG9mIHRoZSB2YWxpZCByb290bmFtZXMgZm9yIHF1aWNrIGxvb2t1cCBvZiBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IGxpc3QuCi0JCQkJCS8vIEFuZCB3aGlsZSBhY2N1bXVsYXRpbmcgdGhpcyBsaXN0LCBjbGVhbiBvdXQgdGhlIHJvb3QgaW5kZXhlcyBjYWNoZSB0b28gKGkuZS4gdGhlIGNsYXNzIGNhY2hlIGZpbGVzKS4KLQkJCQkJZmluYWwgU2V0IHZhbGlkRmlsZXMgPSBuZXcgSGFzaFNldChpbmRleC5yb290VG9Sb290SW5kZXguc2l6ZSgpKTsKLQkJCQkJdmFsaWRGaWxlcy5hZGQoSU5ERVhGSUxFTkFNRSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRyID0gaW5kZXgucm9vdFRvUm9vdEluZGV4LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSb290SW5kZXggcm9vdEluZGV4ID0gKFJvb3RJbmRleCkgaXRyLm5leHQoKTsKLQkJCQkJCWlmIChyZWNvbmNpbGVDbGFzc0NhY2hlRGlyZWN0b3J5KHJvb3RJbmRleCwgcHJvamVjdCkpIHsKLQkJCQkJCQkvLyBUaGUgY2xhc3MgY2FjaGUgaGFzIGJlZW4gcmVjb25jaWxlZCwgYW5kIHRoZXJlIGFyZSBzdGlsbCBzb21lIGNsYXNzZXMgbGVmdCwgc28ga2VlcCB0aGUgcm9vdCBpbmRleC4KLQkJCQkJCQl2YWxpZEZpbGVzLmFkZChyb290SW5kZXguZ2V0Um9vdE5hbWUoKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWl0ci5yZW1vdmUoKTsgLy8gVGhlIHJvb3QgaW5kZXggaXMgZW1wdHksIHNvIGdldCByaWQgb2YgaXQuIFNpbmNlIG5vdCBhIHZhbGlkIG5hbWUsIGl0IHdpbGwgYmUgZGVsZXRlZCBpbiBuZXh0IHN0ZXAuCi0JCQkJCQkJaW5kZXguc2V0RGlydHkodHJ1ZSk7IC8vIEFsc28gc2V0IGl0IGRpcnR5IGluIGNhc2UgaXQgd2Fzbid0IGJlY2F1c2Ugd2UgbmVlZCB0byB3cml0ZSBvdXQgdGhlIGNvbnRhaW5lciBJbmRleCBzaW5jZSBpdCB3YXMKLQkJCQkJCQkvLyBjaGFuZ2VkLgotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIEdldCBsaXN0IG9mIGZpbGVzIGFuZCBkZWxldGUgdGhvc2UgdGhhdCBhcmUgbm90IGEgdmFsaWQgbmFtZSAodXNlZCByb290IG5hbWUsIG9yIGluZGV4IGZpbGUpCi0JCQkJCVN0cmluZ1tdIGZpbGVOYW1lcyA9IGluZGV4RGlyLmxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICghdmFsaWRGaWxlcy5jb250YWlucyhmaWxlTmFtZXNbaV0pKSB7Ci0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5kZXhEaXIsIGZpbGVOYW1lc1tpXSk7Ci0JCQkJCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCQkJCQkJY2xlYW5EaXJlY3RvcnkoZmlsZSwgdHJ1ZSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gCi0JCQl9IGVsc2UgCi0JCQkJcmV0dXJuIHRydWU7CS8vIENhbid0IHdyaXRlLCBzbyB0cmVhdCBhcyBsZWF2ZSBhbG9uZS4KLQkJfQotCi0JCS8qCi0JCSAqIFJlY29uY2lsZSB0aGUgY2xhc3MgY2FjaGUgZGlyZWN0b3J5IGZvciB0aGUgcm9vdCBpbmRleC4gUmV0dXJuIHRydWUgaWYgcmVjb25jaWxlZCBnb29kIGJ1dCBub3QgZW1wdHkuIFJldHVybiBmYWxzZSBpZiB0aGUgY2xhc3MgY2FjaGUKLQkJICogZGlyZWN0b3J5IGlzIG5vdyBlbXB0eS4gSW4gdGhpcyBjYXNlIHdlIHNob3VsZCBhY3R1YWxseSBnZXQgcmlkIG9mIHRoZSBlbnRpcmUgcm9vdCBpbmRleC4gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBtYXRjaGVzCi0JCSAqIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kZXggYnkgcmVtb3ZpbmcgYW55IGZpbGUgbm90IGZvdW5kIGluIHRoZSBpbmRleC4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiByZWNvbmNpbGVDbGFzc0NhY2hlRGlyZWN0b3J5KFJvb3RJbmRleCByb290SW5kZXgsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWlmIChyb290SW5kZXguY2xhc3NOYW1lVG9DbGFzc0VudHJ5LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIFRoZXJlIGFyZSBubyBjbGFzc2VzLCBzbyBnZXQgcmlkIHRoZSBlbnRpcmUgcm9vdCBpbmRleC4KLQkJCWVsc2UgewotCQkJCWZpbmFsIFNldCB2YWxpZEZpbGVzID0gcm9vdEluZGV4LmNsYXNzTmFtZVRvQ2xhc3NFbnRyeS5rZXlTZXQoKTsgLy8gVGhlIGtleXMgKGNsYXNzbmFtZXMpIGFyZSB0aGUgZmlsZW5hbWVzICh3aXRob3V0IGV4dGVuc2lvbikKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoYXQKLQkJCQkvLyBzaG91bGQgYmUga2VwdC4KLQkJCQlGaWxlIGluZGV4RGlyID0gZ2V0Q2FjaGVEaXIocHJvamVjdCkuYXBwZW5kKHJvb3RJbmRleC5nZXRSb290TmFtZSgpKS50b0ZpbGUoKTsKLQkJCQkvLyBHZXQgbGlzdCBvZiBmaWxlcyB0aGF0IGFyZSBub3QgYSB2YWxpZCBuYW1lICh1c2VkIGNsYXNzbmFtZSkKLQkJCQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBpbmRleERpci5saXN0KCk7Ci0JCQkJaWYgKGZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlTmFtZXNbaV07Ci0JCQkJCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoT1ZFUlJJREVfQ0FDSEVfU1VGRklYKSkgewotCQkJCQkJCS8vIEVuZHMgd2l0aCBvdXQgY2xhc3MgY2FjaGUgZXh0ZW5zaW9uLCBzZWUgaWYgdmFsaWQgY2xhc3NuYW1lLgotCQkJCQkJCVN0cmluZyBjbGFzc25hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSBPVkVSUklERV9DQUNIRV9TVUZGSVgubGVuZ3RoKCkpOwotCQkJCQkJCUNsYXNzRW50cnkgY2UgPSAoQ2xhc3NFbnRyeSkgcm9vdEluZGV4LmNsYXNzTmFtZVRvQ2xhc3NFbnRyeS5nZXQoY2xhc3NuYW1lKTsKLQkJCQkJCQlpZiAoY2UgIT0gbnVsbCAmJiBjZS5vdmVycmlkZUNhY2hlRXhpc3RzKCkpCi0JCQkJCQkJCWNvbnRpbnVlOyAvLyBJdCBpcyBvbmUgb2Ygb3Vycy4gS2VlcCBpdC4KLQkJCQkJCX0gZWxzZSBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoQ0xBU1NfQ0FDSEVfU1VGRklYKSkgewotCQkJCQkJCS8vIEVuZHMgd2l0aCBvdXQgY2xhc3MgY2FjaGUgZXh0ZW5zaW9uLCBzZWUgaWYgdmFsaWQgY2xhc3NuYW1lLgotCQkJCQkJCWlmICh2YWxpZEZpbGVzLmNvbnRhaW5zKGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtIENMQVNTX0NBQ0hFX1NVRkZJWC5sZW5ndGgoKSkpKSAvLyBTdHJpcCBkb3duIHRvIGp1c3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2xhc3MgYW5kIHNlZSBpZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvbmUgb2Ygb3Vycy4KLQkJCQkJCQkJY29udGludWU7IC8vIEl0IGlzIG9uZSBvZiBvdXJzLiBLZWVwIGl0LgotCQkJCQkJfQotCQkJCQkJLy8gTm90IHZhbGlkLCBnZXQgcmlkIG9mIGl0LgotCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5kZXhEaXIsIGZpbGVOYW1lKTsKLQkJCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQkJCQkJY2xlYW5EaXJlY3RvcnkoZmlsZSwgdHJ1ZSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZmlsZS5kZWxldGUoKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5EaXJlY3RvcnkoRmlsZSBkaXIsIGJvb2xlYW4gZXJhc2VEaXIpIHsKLQkJaWYgKGRpci5jYW5Xcml0ZSgpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCQkJCWNsZWFuRGlyZWN0b3J5KGZpbGVzW2ldLCB0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJfQotCQkJaWYgKGVyYXNlRGlyKQotCQkJCWRpci5kZWxldGUoKTsKLQkJfQotCX0JCi0KLQkvLy0tLS0tLS0tLS0tLS0tIFNhdmUgQ2xhc3MgQ2FjaGUgRW50cnkgSm9iIC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBUaGlzIGlzIHdyaXRlIHF1ZXVlIGZvciBjbGFzcyBjYWNoZXMuIEl0IGlzIGEgRklGTyBxdWV1ZS4gSXQgaXMgc3ljaHJvbml6ZWQgc28gdGhhdCBhZGRzL3JlbW92ZXMgYXJlIGNvbnRyb2xsZWQuCi0JLy8gRW50cmllcyBhcmUgQ2xhc3NFbnRyeSdzLiBUaGUgY2xhc3MgZW50cnkgaGFzIHRoZSByZXNvdXJjZSB0aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4gb3V0LiBJdCB3aWxsIGJlIHNldCB0byBudWxsCi0JLy8gYnkgdGhlIGpvYiB3aGVuIGl0IGlzIHdyaXR0ZW4uIFRoZSBqb2Igd2lsbCBoYXZlIGEgQ2xhc3NFbnRyeSBsb2NrZWQgd2hpbGUgaXQgaXMgcmV0cmlldmluZyBhbmQgcmVzZXR0aW5nIHRoZSByZXNvdXJjZQotCS8vIGZpZWxkIGluIHRoZSBlbnRyeS4KLQkvLwotCS8vIFRoZSBwcm9jZXNzIGlzIHRoZSBuZXcgY2FjaGUgd2lsbCBsb2NrLCBjcmVhdGUgcmVzb3VyY2UsIHNldCByZXNvdXJjZSBpbnRvIHRoZSBDRSBhbmQgcmVsZWFzZSBsb2NrLiBUaGVuIGFkZCB0aGUgQ0UgdG8gdGhlIHF1ZXVlCi0JLy8gYW5kIHNjaGVkdWxlIHRoZSBqb2IgKGluIGNhc2Ugam9iIGlzIG5vdCBydW5uaW5nKS4KLQkvLwotCS8vIFRoZSBqb2Igd2lsbCBsb2NrIHRoZSBDRSwgZ2V0IHJlc291cmNlIGZyb20gdGhlIENFLCB3cml0ZSBpdCBvdXQsIHNldCBpdCBiYWNrIHRvIG51bGwsIHJlbGVhc2UgdGhlIENFKS4gSWYgdGhlIHJlc291cmNlIGlzIG51bGwsCi0JLy8gdGhlbiBpdCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgKHRoaXMgY291bGQgaGFwcGVuIGlmIHRoZSBqb2IgZGlkbid0IGdldCBhIGNoYW5jZSB0byBzYXZlIGl0IGJlZm9yZSBhbm90aGVyIGVudHJ5IHdhcyBwb3N0ZWQKLQkvLyBhbmQgdGhpcyBpcyB0aGUgc2Vjb25kIHJlcXVlc3QgYW5kIGl0IHdhcyBhY3R1YWxseSBwcm9jZXNzZWQgYnkgdGhlIGZpcnN0IHJlcXVlc3QpLgotCS8vIElFOgotCS8vIDEpIHJlc291cmNlIGNyZWF0ZWQsIHF1ZXVlIGVudHJ5IGFkZGVkCi0JLy8gMikgMm5kIHJlcSwgam9iIG5vdCBwcm9jZXNzZWQgeWV0LCByZXNvdXJjZSByZWNyZWF0ZWQgYW5kIHB1dCBiYWNrIGludG8gQ0UsIG5ldyBxdWV1ZSBlbnRyeS4KLQkvLyAzKSBqb2IgcHVsbHMgZnJvbSBxdWV1ZSwgbG9ja3MgY2UsIGdyYWJzIHJlc291cmNlLCB3cml0ZXMgb3V0IHRoZSByZXNvdXJjZSwgc2V0cyBiYWNrIHRvIG51bGwsIHJlbGVhc2UgY2UuCi0JLy8gNCkgam9iIHB1bGxzIGZyb20gcXVldWUuIFRoaXMgdGltZSB0aGUgcmVzb3VyZSBpcyBudWxsIHNvIGl0IHNraXBzIGl0LgotCS8vCi0JLy8gTmVlZCB0byBsb2NrIENlIGR1cmluZyBlbnRpcmUgY3JlYXRlIGFuZCB3cml0ZSBiZWNhdXNlIHRoZSByZXNvdXJjZSBzZXQgaXMgbm90IHJlZW50cmFudCBzbyBjYW4ndCBiZSB3cml0aW5nIGl0IHdoaWxlIGNyZWF0aW5nIGl0LgotCi0JcHJpdmF0ZSBMaXN0IGNhY2hlV3JpdGVRdWV1ZSA9IG51bGw7Ci0KLQl2b2lkIHdhaXRGb3JDYWNoZVNhdmVKb2IoKSB7Ci0JCS8vIEZvciBhIGZ1bGwgc2F2ZSB3ZSB3YW50IHRvIGdldCB0aGUgY2xhc3MgY2FjaGUgZmlsZXMgd3JpdHRlbiB0b28sIHNvIHdlIG5lZWQgdG8gbWFuaXB1bGF0ZSB0aGUgam9iIHRvIGdldCBpdCB0byBmaW5pc2ggQVNBUC4KLQkJaWYgKGNhY2hlV3JpdGVKb2IgIT0gbnVsbCkgewotCQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkKLQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coIkZvcmNpbmcgYSBjYWNoZSBzYXZlIGpvYiB0byBzdGFydCBlYXJseS4iLCBMZXZlbC5GSU5FUik7IC8vJE5PTi1OTFMtMSQKLQkJCXN3aXRjaCAoY2FjaGVXcml0ZUpvYi5nZXRTdGF0ZSgpKSB7Ci0JCQkJY2FzZSBKb2IuU0xFRVBJTkc6Ci0JCQkJCS8vIEl0IGNvdWxkIGJlIHdhaXRpbmcgYSBsb25nIHRpbWUsIHNvIHdlIG5lZWQgdG8gd2FrZSBpdCB1cCBhdCBhIGhpZ2ggcHJpb3JpdHkgdG8gZ2V0IGl0IHJ1bm5pbmcgQVNBUC4KLQkJCQkJY2FjaGVXcml0ZUpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOyAvLyBOZWVkIHRvIGdldCBpdCBnb2luZyByaWdodCBhd2F5Ci0JCQkJCWNhY2hlV3JpdGVKb2Iud2FrZVVwKCk7Ci0JCQkJCS8vIE5vdyBkcm9wIGludG8gdGhlIHdhaXQuCi0JCQkJZGVmYXVsdDoKLQkJCQkJLy8gTm93IHdhaXQgZm9yIGl0IChpZiBub3QgcnVubmluZyB0aGlzIHdpbGwgcmV0dXJuIHJpZ2h0IGF3YXkpLgotCQkJCQl0cnkgewotCQkJCQkJY2FjaGVXcml0ZUpvYi5qb2luKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIE1hcCBTQVZFX0NBQ0hFX09QVElPTlM7Ci0Jc3RhdGljIHsKLQkJU0FWRV9DQUNIRV9PUFRJT05TID0gbmV3IEhhc2hNYXAoMyk7Ci0JCVNBVkVfQ0FDSEVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NBVkVfVFlQRV9JTkZPUk1BVElPTiwgQm9vbGVhbi5UUlVFKTsKLQkJU0FWRV9DQUNIRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBTQVZFX0NBQ0hFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSm9iIGNhY2hlV3JpdGVKb2IgPSBudWxsOwotCXByb3RlY3RlZCBBZGFwdGVyIHByb2plY3RSZWxlYXNlQWRhcHRlciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiB0eXBlID09IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyLnRoaXM7CS8vIFdlJ3JlIG1ha2luZyB0aGUgQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIudGhpcyBiZSB0aGUgYWRhcHRlciB0eXBlLgotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gUHJvamVjdFJlc291cmNlU2V0LlNQRUNJQUxfTk9USUZJQ0FUSU9OX1RZUEUgJiYgbXNnLmdldEZlYXR1cmVJRChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci5jbGFzcykgPT0gUHJvamVjdFJlc291cmNlU2V0LlBST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEKSB7Ci0JCQkJLy8gVGhpcyBpcyBhbiBhYm91dCB0byBiZSBjbG9zZWQuIElmIHdlIGhhdmUgYW4gYWN0aXZlIHdyaXRlIGpvYiwgYnJpbmcgaXQgdXAgdG8gdG9wIHByaW9yaXR5IGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2guCi0JCQkJLy8gVGhpcyB3aWxsIG1ha2Ugc3VyZSBhbnkgcmVzb3VyY2VzIGluIHRoZSBwcm9qZWN0IGFyZSB3cml0dGVuLiBUaGVyZSBtYXkgbm90IGJlIGFueSB3YWl0aW5nLCBidXQgdGhpcyBpcyBkb2luZyBhIGNsb3NlCi0JCQkJLy8gcHJvamVjdCwgd2hpY2ggaXMgc2xvdyBhbHJlYWR5IHJlbGF0aXZlbHkgc3BlYWtpbmcsIHRoYXQgd2FpdGluZyBmb3IgdGhlIGNhY2hlIHdyaXRlIGpvYiB0byBmaW5pc2ggaXMgbm90IGJhZC4KLQkJCQl3YWl0Rm9yQ2FjaGVTYXZlSm9iKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSB2b2lkIHF1ZXVlQ2xhc3NFbnRyeShDbGFzc0VudHJ5IGNlLCBSZXNvdXJjZVNldCByc2V0KSB7Ci0JCWlmIChjYWNoZVdyaXRlUXVldWUgPT0gbnVsbCkgewotCQkJY2FjaGVXcml0ZVF1ZXVlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgTGlua2VkTGlzdCgpKTsKLQkJCWNhY2hlV3JpdGVKb2IgPSBuZXcgSm9iKEJlYW5pbmZvQ29yZU1lc3NhZ2VzLkJlYW5JbmZvQ2FjaGVDb250cm9sbGVyX0pvYl9Xcml0ZUJlYW5pbmZvQ2FjaGVfVGl0bGUpIHsgCi0KLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBjYWNoZVdyaXRlUXVldWUuc2l6ZSgpICsgMTApOyAvLyBUaGlzIGlzIGFjdHVhbGx5IGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBydW4sIHNvIHdlIGFkZCAxMCBmb3IgdGhlIGhlY2sgb2YgaXQuIC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKEJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkKLQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygiU3RhcnRpbmcgd3JpdGUgQmVhbkluZm8gQ2FjaGUgZmlsZXMuIiwgTGV2ZWwuRklORVIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXdoaWxlICghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgIWNhY2hlV3JpdGVRdWV1ZS5pc0VtcHR5KCkpIHsKLQkJCQkJCUNsYXNzRW50cnkgY2UgPSAoQ2xhc3NFbnRyeSkgY2FjaGVXcml0ZVF1ZXVlLnJlbW92ZSgwKTsgLy8gR2V0IGZpcnN0IG9uZS4KLQkJCQkJCWJvb2xlYW4gZGVhZCA9IGZhbHNlOwotCQkJCQkJc3luY2hyb25pemVkIChCZWFuSW5mb0NhY2hlQ29udHJvbGxlci50aGlzKSB7Ci0JCQkJCQkJaWYgKGNlLmdldFJvb3RJbmRleCgpLmdldEluZGV4KCkuaXNEZWFkKCkpIHsKLQkJCQkJCQkJZGVhZCA9IHRydWU7CS8vIFRoZSBpbmRleCBpcyBkZWFkLCBzbyBkb24ndCB3cml0ZSBpdC4gV2Ugc3RpbGwgbmVlZCB0byBnbyB0aHJvdWdoIGFuZCBnZXQgdGhlIHBlbmRpbmcgcmVzb3VyY2Ugb3V0IG9mIGl0cyByZXNvdXJjZSBzZXQgc28gdGhhdCBpdCBnb2VzIGF3YXkuCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc3luY2hyb25pemVkIChjZSkgewotCQkJCQkJCVJlc291cmNlIGNyZXMgPSBjZS5nZXRQZW5kaW5nUmVzb3VyY2UoKTsKLQkJCQkJCQlpZiAoY3JlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoIWRlYWQpCi0JCQkJCQkJCQkJY3Jlcy5zYXZlKFNBVkVfQ0FDSEVfT1BUSU9OUyk7Ci0JCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCS8vIFJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSByZXNvdXJjZSBzZXQsIGNsZWFyIG91dCB0aGUgcGVuZGluZy4KLQkJCQkJCQkJCWNyZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoY3Jlcyk7Ci0JCQkJCQkJCQljZS5zZXRQZW5kaW5nUmVzb3VyY2UobnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY3JlcyA9IGNlLmdldFBlbmRpbmdPdmVycmlkZVJlc291cmNlKCk7Ci0JCQkJCQkJaWYgKGNyZXMgIT0gbnVsbCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaWYgKCFkZWFkKQotCQkJCQkJCQkJCWNyZXMuc2F2ZShTQVZFX0NBQ0hFX09QVElPTlMpOwotCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQkvLyBSZW1vdmUgdGhlIHJlc291cmNlIGZyb20gcmVzb3VyY2Ugc2V0LCBjbGVhciBvdXQgdGhlIHBlbmRpbmcuCi0JCQkJCQkJCQljcmVzLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGNyZXMpOwotCQkJCQkJCQkJY2Uuc2V0UGVuZGluZ092ZXJyaWRlUmVzb3VyY2UobnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCWlmIChCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpCi0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coIkZpbmlzaGVkIHdyaXRlIEJlYW5JbmZvIENhY2hlIGZpbGVzLiIsIExldmVsLkZJTkVSKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OwotCQkJY2FjaGVXcml0ZUpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJY2FjaGVXcml0ZUpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCX0KLQkJaWYgKHJzZXQgIT0gbnVsbCAmJiBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHJzZXQsIHRoaXMpID09IG51bGwpIHsKLQkJCS8vIElmIGl0IGlzIGEgcHJvamVjdCByZXNvdXJjZSBzZXQsIHRoZW4gYWRkIG91cnNlbHZlcyBhcyBsaXN0ZW5lcnMgc28gd2Uga25vdyB3aGVuIHJlbGVhc2VkLgotCQkJaWYgKHJzZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCi0JCQkJcnNldC5lQWRhcHRlcnMoKS5hZGQocHJvamVjdFJlbGVhc2VBZGFwdGVyKTsKLQkJfQotCQljYWNoZVdyaXRlUXVldWUuYWRkKGNlKTsKLQkJY2FjaGVXcml0ZUpvYi5zY2hlZHVsZSg2MCAqIDEwMDBMKTsgLy8gUHV0IG9mZiBmb3IgMSBtaW51dGUgdG8gbGV0IG90aGVyIHN0dWZmIGdvIG9uLiBOb3QgaW1wb3J0YW50IHRoYXQgaXQgaGFwcGVucyBpbW1lZGlhdGVseS4KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbkluZm9Db250cmlidXRvckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5JbmZvQ29udHJpYnV0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTQxNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbkluZm9Db250cmlidXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBCZWFuSW5mb0NvbnRyaWJ1dG9yQWRhcHRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI4ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvUGx1Z2luLklDb250cmlidXRvck92ZXJyaWRlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotIAotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSUJlYW5JbmZvQ29udHJpYnV0b3IgZm9yIHVzZXJzIHRvIHN1YmNsYXNzLiBEZWZhdWx0IGRvZXMgbm90aGluZy4KLSAqIDxwPgotICogQnV0IHRoaXMgZG9lcyBzdXBwbHkgc2V2ZXJhbCB2ZXJ5IHVzZWZ1bCB1dGlsaXR5IG1ldGhvZHMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQmVhbkluZm9Db250cmlidXRvckFkYXB0ZXIgaW1wbGVtZW50cyBJQmVhbkluZm9Db250cmlidXRvciB7Ci0JCi0JLyoqCi0JICogQW4gZW1wdHkgYXJyYXkgb2YgQmVhbmluZm9FbnRyeS4gQXZhaWxhYmxlIGZvciBzdWJjbGFzc2VzIHRvIHJldHVybiBpZiB0aGV5Ci0JICogZGVjaWRlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQmVhbmluZm9FbnRyeVtdIEVNUFRZX0JFQU5JTkZPX0VOVFJJRVMgPSBuZXcgQmVhbmluZm9FbnRyeVswXTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgcGFydCBvZiB0aGUgcGFja2FnZS4gVXNlZCBieSBzdWJjbGFzc2VzIHRvIGRldGVybWluZQotCSAqIGlmIGEgb3ZlcnJpZGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZnJhZ21lbnQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBwYWNrYWdlLgotCSAqIDxwPgotCSAqIEluIG90aGVyIHdvcmRzLCA8Y29kZT5vcmcuZWNsaXBzZTwvY29kZT4gYXMgYSBmcmFnbWVudCBhbmQgYW5kIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmU8L2NvZGU+IGFzCi0JICogYSBwYWNrYWdlUGF0aCB3aWxsIGFuc3dlciB0cnVlLCBidXQgaWYgeW91IHN3YXBwZWQgdGhlbSBpdCB3aWxsIGFuc3dlciBmYWxzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZnJhZ21lbnQKLQkgKiBAcGFyYW0gcGFja2FnZVBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmcmFnbWVudCBpcyBhIGxlYWRpbmcgcGFydCBvZiB0aGUgcGFja2FnZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZyYWdtZW50KElQYXRoIGZyYWdtZW50LCBJUGF0aCBwYWNrYWdlUGF0aCkgewotCQlyZXR1cm4gZnJhZ21lbnQuaXNQcmVmaXhPZihwYWNrYWdlUGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5tYXRjaGVkIHBvcnRpb24gb2YgdGhlIHBhY2thZ2UgcGF0aCBmcm9tIGEgZnJhZ21lbnQuIFVzZWQgYnkgc3ViY2xhc3NlcwotCSAqIHRvIGdldCB0aGUgcGFydCBvZiB0aGUgcGFja2FnZSBwYXRoIHRoYXQgaXMgYWZ0ZXIgdGhlIGZyYWdtZW50LiBUaGlzIGlzIHRoZW4gdXNlZCB0bwotCSAqIGFwcGVuZCB0byB0aGUgcGF0aCBmcm9tIHRoZSBvdmVycmlkZSB0byBnZXQgdGhlIGZ1bGwgcGF0aCB0byBvdmVycmlkZSBmaWxlcyBmb3IgdGhpcwotCSAqIHBhY2thZ2UuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIHJldHVybiB0aGUgcGFydCBvZiB0aGUgcGFja2FnZVBhdGggdGhhdCBpcyBub3QgbWF0Y2hlZCBieSB0aGUgZnJhZ21lbnQuIAotCSAqIDxwPgotCSAqIE5vdGU6IEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBmcmFnbWVudCBhbmQgcGFja2FnZVBhdGggaGF2ZSBmaXJzdCBiZWVuIHRlc3RlZCB0aHJvdWdoCi0JICogaXNGcmFnbWVudC4gT3RoZXJ3aXNlIGFuIGludmFsaWQgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGZyYWdtZW50Ci0JICogQHBhcmFtIHBhY2thZ2VQYXRoCi0JICogQHJldHVybiB0aGUgcGFydCBvZiB0aGUgcGFja2FnZSBwYXRoIG5vdCBtYXRjaGVkLgotCSAqIAotCSAqIEBzZWUgQmVhbkluZm9Db250cmlidXRvckFkYXB0ZXIjaXNGcmFnbWVudChJUGF0aCwgSVBhdGgpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbm1hdGNoZWRQYXRoKElQYXRoIGZyYWdtZW50LCBJUGF0aCBwYWNrYWdlUGF0aCkgewotCQlyZXR1cm4gZnJhZ21lbnQucmVtb3ZlRmlyc3RTZWdtZW50cyhwYWNrYWdlUGF0aC5zZWdtZW50Q291bnQoKSkudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBjYW4gdXNlIHRoaXMgaGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIG92ZXJyaWRlIHJlc291cmNlIGZyb20gdGhlIGdpdmVuIChwbHVnaW4pIGJ1bmRsZS4gCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZSB0aGUgYnVuZGxlIHRvIHVzZS4KLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoIHBhdGggb2YgZmlsZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLgotCSAqIEBwYXJhbSByZXNvdXJjZSBzZXQgdG8gbG9hZCBpbnRvLgotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgcnVubmFibGUgdGhhdCBpcyBiZWluZyB1c2VkIGZvciB0aGUgb3ZlcnJpZGUuIEl0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHJlc291cmNlIGFscmVhZHkgdXNlZCBvbmNlLgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGNvdWxkbid0IGJlIGxvYWRlZCBvciBpZiBpdCB3YXMgYWxyZWFkeSB1c2VkIG9uY2UuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGxvYWRPdmVycmlkZVJlc291cmNlKEJ1bmRsZSBidW5kbGUsIFN0cmluZyByZWxhdGl2ZVBhdGgsIFJlc291cmNlU2V0IHJzZXQsIEJlYW5pbmZvUGx1Z2luLklDb250cmlidXRvck92ZXJyaWRlUnVubmFibGUgcnVubmFibGUpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTCsiOi8iK0pFTVV0aWxQbHVnaW4uUExBVEZPUk1fUExVR0lOKycvJytidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkrJy8nK3JlbGF0aXZlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJ1bm5hYmxlLnJlc291cmNlQ29udHJpYnV0ZWQodXJpKSkKLQkJCXJldHVybiBudWxsOwkvLyBBbHJlYWR5IGNvbnRyaWJ1dGVkIG9uY2UuCi0JCVJlc291cmNlIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSByc2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJLy8gRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlzIG9rCi0JCQlpZiAoIShlLmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSkgewotCQkJCWlmIChlLmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbgotCQkJCQkmJiAoKENvcmVFeGNlcHRpb24pIGUuZXhjZXB0aW9uKCkpLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EKSB7Ci0JCQkJCS8vIFRoaXMgaXMgb2suIE1lYW5zIHVyaV9tYXBwaW5nIG5vdCBzZXQgc28gY291bGRuJ3QgZmluZCBpbiBXb3Jrc3BhY2UsIGFsc28gb2suCi0JCQkJfSBlbHNlIHsKLQkJCQkJQmVhbmluZm9QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBCZWFuaW5mb1BsdWdpbi5QSV9CRUFOSU5GT19QTFVHSU5JRCwgMCwgIkVycm9yIGxvYWRpbmcgZmlsZVwiIiArIHVyaSArICJcIiIsIGUuZXhjZXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCi0JCQkJfQotCQkJfQotCQkJLy8gSW4gY2FzZSBpdCBoYXBwZW5lZCBhZnRlciBjcmVhdGluZyByZXNvdXJjZSBidXQgZHVyaW5nIGxvYWQuIE5lZWQgdG8gZ2V0IHJpZCBvZiBpdCBpbiB0aGUgZmluYWxseS4KLQkJCXJlc3VsdCA9IG51bGw7Ci0JCQlSZXNvdXJjZSByZXMgPSByc2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCXJzZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDb3VsZG4ndCBsb2FkIGl0IGZvciBzb21lIHJlYXNvbi4KLQkJCUJlYW5pbmZvUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQsIDAsICJFcnJvciBsb2FkaW5nIGZpbGVcIiIgKyB1cmkgKyAiXCIiLCBlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy8gSW4gY2FzZSBpdCBoYXBwZW5lZCBhZnRlciBjcmVhdGluZyByZXNvdXJjZSBidXQgZHVyaW5nIGxvYWQuIE5lZWQgdG8gZ2V0IHJpZCBvZiBpdCBpbiB0aGUgZmluYWxseS4KLQkJCXJlc3VsdCA9IG51bGw7Ci0JCQlSZXNvdXJjZSByZXMgPSByc2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCXJzZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlcyk7Ci0JCX07Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLklCZWFuSW5mb0NvbnRyaWJ1dG9yI2dldEJlYW5JbmZvRW50cnlDb250cmlidXRpb25zKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbykKLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9FbnRyeVtdIGdldEJlYW5JbmZvRW50cnlDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvKSB7Ci0JCXJldHVybiBFTVBUWV9CRUFOSU5GT19FTlRSSUVTOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLklCZWFuSW5mb0NvbnRyaWJ1dG9yI3J1bk92ZXJyaWRlcyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb1BsdWdpbi5JQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bk92ZXJyaWRlcyhJUGF0aCBwYWNrYWdlUGF0aCwgU3RyaW5nIGNsYXNzTmFtZSwgSmF2YUNsYXNzIGphdmFDbGFzcywgUmVzb3VyY2VTZXQgcnNldCwgSUNvbnRyaWJ1dG9yT3ZlcnJpZGVSdW5uYWJsZSBydW5uYWJsZSkgewotCQkvLyBEZWZhdWx0IGlzIGRvIG5vdGhpbmcKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9Db3JlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDU2NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9Db3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCZWFuaW5mb0NvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQmVhbmluZm9Db3JlTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyX0pvYl9Xcml0ZUJlYW5pbmZvQ2FjaGVfVGl0bGU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCZWFuaW5mb0NvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhYzk5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuaW5mb0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvRW50cnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOCAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuKjsKLQotLyoqCi0gKiBCZWFuaW5mbyBlbnRyeS4gTG9jYXRpb24gb2YgdGhlIGJlYW5pbmZvcy4gTXVjaCBsaWtlIGEgc3RhbmRhcmQgY2xhc3NwYXRoIGVudHJ5LgotICogVGhlIEJlYW5JbmZvcyBhcmUgZWl0aGVyIGluIGEgamFyIG9yIGFub3RoZXIgcHJvamVjdC4gVGhleSBjYW4gYmUgc3VwcGxpZWQgYXMKLSAqIGEgbG9jYWwgZmlsZSBpbiB0aGUgcHJvamVjdCwgb3IgYXMgYW4gZXh0ZXJuYWwgamFyLCBvciBhcyBleHRlcm5hbCBqYXIgdGhyb3VnaCBhCi0gKiB2YXJpYWJsZSwgb3IgYW4gZXh0ZXJuYWwgamFyIHRocm91Z2ggYSBwbHVnaW4uCi0gKiA8cD4KLSAqIEFuIGV4dGVybmFsIGphciB0aHJvdWdoIGNvbnRhaW5lcnMgaXMgbm90IHZhbGlkIGJlY2F1c2UgY29udGFpbmVyIGFyZSBhdHRhY2hlZCB0bwotICogcHJvamVjdHMuIHRoZXkgYXJlbid0IHN0YW5kYWxvbmUuCi0gKiAKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEJlYW5pbmZvRW50cnkgaW1wbGVtZW50cyBJQmVhbmluZm9zRG9jRW50cnkgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBzQmVhbmluZm8gPSAiYmVhbmluZm8iOyAvLyBCZWFuaW5mbyBlbnRyeSwgc2hhcmVkIHdpdGggQmVhbmluZm9zRG9jLiAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklFX1BMVUdJTiA9IDEwMDsJLy8gQmVhbmluZm8gamFyIGNhbiBiZSBmb3VuZCBpbiBhIHBsdWdpbi4KLQotCXN0YXRpYyBpbnQga2luZEZyb21TdHJpbmcoU3RyaW5nIGtpbmRTdHIpIHsKLQkJaWYgKGtpbmRTdHIgPT0gbnVsbCB8fCBraW5kU3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gQklFX1BMVUdJTjsJLy8gRGVmYXVsdCB0byBwbHVnaW4uIElmIGNvbWluZyBmcm9tIGJlYW5pbmZvY29uZmlnLCB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGtpbmQuIEJ1dCBpZiBjb21pbmcgZnJvbSBwbHVnaW4ueG1sIHRoZXJlIHNob3VsZG4ndCBiZSBvbmUuCi0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoImNvbiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI7Ci0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInZhciIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRTsKLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgic3JjIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRTsKLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgibGliIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk7Ci0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInBsdWdpbiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gQklFX1BMVUdJTjsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXN0YXRpYyBTdHJpbmcga2luZFRvU3RyaW5nKGludCBraW5kKSB7Ci0KLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJcmV0dXJuICJzcmMiOyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCXJldHVybiAic3JjIjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCXJldHVybiAibGliIjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQlyZXR1cm4gInZhciI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJcmV0dXJuICJjb24iOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIEJJRV9QTFVHSU46Ci0JCQkJcmV0dXJuICJwbHVnaW4iOwkvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gInVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGtpbmQgb2YgZW50cnkgd2hlbiB3ZSBrbm93IGl0IGlzIGEgY2xhc3NwYXRoIGVudHJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IGNyZWF0ZUVudHJ5KGludCBraW5kLCBJUGF0aCBwYXRoLCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzRXhwb3J0ZWQpIHsKLQkJc3dpdGNoIChraW5kKSB7Ci0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpCi0JCQkJCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgbnVsbCwgbnVsbCwgaXNFeHBvcnRlZCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCQkvLyBtdXN0IGJlIGFuIGVudHJ5IGluIHRoaXMgcHJvamVjdCBvciBzcGVjaWZ5IGFub3RoZXIgcHJvamVjdAotCQkJCQlTdHJpbmcgcHJvalNlZ21lbnQgPSBwYXRoLnNlZ21lbnQoMCk7Ci0JCQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvalNlZ21lbnQgIT0gbnVsbCAmJiBwcm9qU2VnbWVudC5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkvLyB0aGlzIHByb2plY3QKLQkJCQkJCXJldHVybiBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGFub3RoZXIgcHJvamVjdAotCQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwYXRoLCBpc0V4cG9ydGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShwYXRoLCBudWxsLCBudWxsLCBpc0V4cG9ydGVkKTsKLQkJCQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkocGF0aCwgaXNFeHBvcnRlZCk7Ci0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBSZWFkIHRoZSBlbnRyeSBpbiBmcm9tIHRoZSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9FbnRyeSByZWFkRW50cnkoSVJlYWRlciByZWFkZXIsIE9iamVjdCBlbGVtZW50LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBlbGVtZW50S2luZCA9IHJlYWRlci5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgQmVhbmluZm9zRG9jLnNLaW5kKTsKLQkJU3RyaW5nIHBhdGhTdHIgPSByZWFkZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIEJlYW5pbmZvc0RvYy5zUGF0aCk7Ci0JCS8vIGVuc3VyZSBwYXRoIGlzIGFic29sdXRlCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChwYXRoU3RyKTsKLQkJaW50IGtpbmQgPSBraW5kRnJvbVN0cmluZyhlbGVtZW50S2luZCk7Ci0JCWlmIChraW5kICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgJiYga2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiAmJiBraW5kICE9IEJJRV9QTFVHSU4gJiYgIXBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlwYXRoID0gcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChwYXRoKSA6IHBhdGgubWFrZUFic29sdXRlKCk7IC8vIFNvbWUgZm9sZGVyL2phciB3aXRoaW4gdGhpcyBwcm9qZWN0Ci0JCX0KLQotCQkvLyBleHBvcnRlZCBmbGFnCi0JCVN0cmluZyBleHBvcnRlZFN0cmluZyA9IHJlYWRlci5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgQmVhbmluZm9zRG9jLnNFeHBvcnRlZCk7Ci0JCWJvb2xlYW4gaXNFeHBvcnRlZCA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGV4cG9ydGVkU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkCi0KLQkJLy8gcmVjcmVhdGUgdGhlIGVudHJ5Ci0JCUlDbGFzc3BhdGhFbnRyeSBjcEVudHJ5ID0gbnVsbDsKLQkJSVBhdGggcGx1Z2luUGF0aCA9IG51bGw7Ci0JCWlmIChraW5kICE9IEJJRV9QTFVHSU4pIHsKLQkJCWNwRW50cnkgPSBjcmVhdGVFbnRyeShraW5kLCBwYXRoLCBwcm9qZWN0LCBpc0V4cG9ydGVkKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCQlwbHVnaW5QYXRoID0gcGF0aDsKLQkJCWVsc2UgewotCQkJCS8vIEtsdWRnZSBUaGlzIHNob3VsZCBvbmx5IGJlIGEgcGx1Z2luIHR5cGUgaWYgZnJvbSBjb25maWd1cmF0aW9uIGVsZW1lbnQuIFNvIHdlIHdpbGwgY2FzdCB0byB0aGF0Ci0JCQkJLy8gYW5kIGdldCB0aGUgcGx1Z2luIGlkIHRvIGNyZWF0ZSBhbiBhYnNvbHV0ZSBwbHVnaW4gcGF0aC4KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkgewotCQkJCQlwbHVnaW5QYXRoID0gbmV3IFBhdGgoJy8nKygoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50KS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSkuYXBwZW5kKHBhdGgpOwotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm4gbnVsbDsJLy8gTm90IHZhbGlkIGJlY2F1c2UgY2FuJ3QgaGF2ZSBwbHVnaW4gZnJvbSAuYmVhbmluZm9jb25maWcgZmlsZS4KLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCBzZWFyY2hwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IGNoaWxkcmVuID0gcmVhZGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlpbnQgY2hpbGRyZW5MZW5ndGggPSByZWFkZXIuZ2V0TGVuZ3RoKGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSByZWFkZXIuZ2V0SXRlbShjaGlsZHJlbiwgaSk7Ci0JCQlpZiAocmVhZGVyLmlzTm9kZVR5cGVFbGVtZW50KGNoaWxkKSkgewotCQkJCU9iamVjdCBlbnRyeSA9IG51bGw7Ci0JCQkJaWYgKHJlYWRlci5nZXROb2RlTmFtZShjaGlsZCkuZXF1YWxzSWdub3JlQ2FzZShTZWFyY2hwYXRoRW50cnkuc1NlYXJjaHBhdGgpKSB7Ci0JCQkJCWVudHJ5ID0gU2VhcmNocGF0aEVudHJ5LnJlYWRFbnRyeShyZWFkZXIsIGNoaWxkLCBwcm9qZWN0LCB0cnVlKTsKLQkJCQl9Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpCi0JCQkJCXNlYXJjaHBhdGhzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3BFbnRyeSAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBCZWFuaW5mb0VudHJ5KAotCQkJCWNwRW50cnksCi0JCQkJKFNlYXJjaHBhdGhFbnRyeVtdKSBzZWFyY2hwYXRocy50b0FycmF5KG5ldyBTZWFyY2hwYXRoRW50cnlbc2VhcmNocGF0aHMuc2l6ZSgpXSksCi0JCQkJaXNFeHBvcnRlZCk7Ci0JCWVsc2UgcmV0dXJuIG5ldyBCZWFuaW5mb0VudHJ5KAotCQkJCXBsdWdpblBhdGgsCi0JCQkJKFNlYXJjaHBhdGhFbnRyeVtdKSBzZWFyY2hwYXRocy50b0FycmF5KG5ldyBTZWFyY2hwYXRoRW50cnlbc2VhcmNocGF0aHMuc2l6ZSgpXSksCi0JCQkJaXNFeHBvcnRlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeSBlbnRyeTsgLy8gU3RvcmUgaXQgYXMgYSBjbGFzc3BhdGggZW50cnkgZm9yIGNvbnZpZW5lbmNlLiBJdCBpcyB0aGUgUkFXIGNsYXNzcGF0aCBlbnRyeS4gVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiBwb2ludGluZyB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIHBsdWdpbi4KLQlwcm90ZWN0ZWQgSVBhdGggcGx1Z2luUGF0aDsJLy8gV2hlbiBzdG9yZWQgaW4gYSBwbHVnaW4sIHRoaXMgd2lsbCBiZSBzZXQgaW5zdGVhZC4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cG9ydGVkOwotCXByb3RlY3RlZCBTZWFyY2hwYXRoRW50cnlbXSBzZWFyY2hwYXRoczsKLQkKLQkvKioKLQkgKiBVc2VkIHdoZW4gdGhlIGJlYW5pbmZvIGphciBpcyB3aXRoaW4gYSBwbHVnaW4uIEluIHRoYXQgY2FzZSwgdGhlIGZpcnN0IHNlZ21lbnQKLQkgKiBvZiB0aGUgcGF0aCBpcyB0aGUgcGx1Z2luIGRlc2NyaXB0b3IsIGFuZCB0aGUgcmVzdCBpcyB0aGUgcGF0aCBmcm9tIHRoZSBwbHVnaW4KLQkgKiBkaXJlY3RvcnkgdG8gdGhlIGphci4KLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9FbnRyeShJUGF0aCBwbHVnaW5QYXRoLCBTZWFyY2hwYXRoRW50cnlbXSBzZWFyY2hwYXRocywgYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCXRoaXMoc2VhcmNocGF0aHMsIGlzRXhwb3J0ZWQpOwotCQl0aGlzLnBsdWdpblBhdGggPSBwbHVnaW5QYXRoOwotCX0KLQotCS8qKgotCSAqIFVzZWQgd2hlbiB0aGUgYmVhbmluZm8gamFyL2ZvbGRlciBpcyBlaXRoZXIgYW4gZXh0ZXJuYWwgamFyL2ZvbGRlciBvciBpcyBzb21ld2hlcmUgZWxzZQotCSAqIGluIHRoZSB3b3Jrc3BhY2UuIEluIHRoYXQgY2FzZSB0aGUgZW50cnkgaXMgdGhlIFJBVyBjbGFzc3BhdGggZW50cnkgdG8gdGhhdCBjb2RlLgotCSAqLwotCXB1YmxpYyBCZWFuaW5mb0VudHJ5KElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgU2VhcmNocGF0aEVudHJ5W10gc2VhcmNocGF0aHMsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQl0aGlzKHNlYXJjaHBhdGhzLCBpc0V4cG9ydGVkKTsKLQkJdGhpcy5lbnRyeSA9IGVudHJ5OwotCX0KLQkKLQlwcm90ZWN0ZWQgQmVhbmluZm9FbnRyeShTZWFyY2hwYXRoRW50cnlbXSBzZWFyY2hwYXRocywgYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCXRoaXMuaXNFeHBvcnRlZCA9IGlzRXhwb3J0ZWQ7Ci0JCXRoaXMuc2VhcmNocGF0aHMgPSBzZWFyY2hwYXRocyAhPSBudWxsID8gc2VhcmNocGF0aHMgOiBuZXcgU2VhcmNocGF0aEVudHJ5WzBdOwotCX0KLQkKLQlwdWJsaWMgU2VhcmNocGF0aEVudHJ5W10gZ2V0U2VhcmNoUGF0aHMoKSB7Ci0JCXJldHVybiBzZWFyY2hwYXRoczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoUGF0aHMoU2VhcmNocGF0aEVudHJ5W10gc2VhcmNocGF0aHMpIHsKLQkJdGhpcy5zZWFyY2hwYXRocyA9IHNlYXJjaHBhdGhzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydGVkKCkgewotCQlyZXR1cm4gaXNFeHBvcnRlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SXNFeHBvcnRlZChib29sZWFuIGlzRXhwb3J0ZWQpIHsKLQkJdGhpcy5pc0V4cG9ydGVkID0gaXNFeHBvcnRlZDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSB3cml0ZUVudHJ5KERvY3VtZW50IGRvYywgSVByb2plY3QgcHJvamVjdCkgewotCi0JCUVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KHNCZWFuaW5mbyk7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoQmVhbmluZm9zRG9jLnNLaW5kLCBraW5kVG9TdHJpbmcoZW50cnkuZ2V0RW50cnlLaW5kKCkpKTsKLQkJCXBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSAmJiBlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgewotCQkJCS8vIHRyYW5zbGF0ZSB0byBwcm9qZWN0IHJlbGF0aXZlIGZyb20gYWJzb2x1dGUgKHVubGVzcyBhIGRldmljZSBwYXRoKQotCQkJCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCQlpZiAocGF0aC5zZWdtZW50KDApLmVxdWFscyhwcm9qZWN0LmdldEZ1bGxQYXRoKCkuc2VnbWVudCgwKSkpIHsKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCQlwYXRoID0gcGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGggPSBwYXRoLm1ha2VBYnNvbHV0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoQmVhbmluZm9zRG9jLnNLaW5kLCBraW5kVG9TdHJpbmcoQklFX1BMVUdJTikpOwotCQkJcGF0aCA9IHBsdWdpblBhdGg7Ci0JCX0KLQotCQllbGVtZW50LnNldEF0dHJpYnV0ZShCZWFuaW5mb3NEb2Muc1BhdGgsIHBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzRXhwb3J0ZWQoKSkgewotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoQmVhbmluZm9zRG9jLnNFeHBvcnRlZCwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hwYXRocy5sZW5ndGg7IGkrKykgewotCQkJU2VhcmNocGF0aEVudHJ5IHNwZSA9IHNlYXJjaHBhdGhzW2ldOwotCQkJZWxlbWVudC5hcHBlbmRDaGlsZChzcGUud3JpdGVFbnRyeShkb2MsIHByb2plY3QpKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGlzIGlzIG5vdCBhIHBsdWdpbiBpbmZvLCB0aGVuIHJldHVybiB0aGUgY2xhc3NwYXRoIGVudHJ5LgotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0Q2xhc3NwYXRoRW50cnkoKSB7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc29sdmVkIGNsYXNzcGF0aHMuIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IHdpbGwgYmUgZWl0aGVyOgotCSAqIDEpIElQcm9qZWN0IC0gSWYgaXQgaXMgYSBwcm9qZWN0IHR5cGUgZW50cnkuIFdhbnQgdGhlIHdob2xlIHByb2plY3QKLQkgKiAyKSBTdHJpbmcgLSBhbiBhYnNvbHV0ZSBleHRlcm5hbCBwYXRoIHRvIGEgamFyCi0JICogMykgSVBhdGggLSBhIHBhdGggdG8gYSBwbHVnaW4gamFyLiBUaGUgZmlyc3Qgc2VnbWVudCBpcyB0aGUgcGx1Z2luIGlkLCB0aGUgcmVzdCBpcyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGF0IHBsdWdpbi4KLQkgKiAgICAgICAgICAgIAotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEByZXR1cm4gVGhlIGFycmF5IG9mIHBhdGhzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXRocy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJLy8gSXQgaXMgYSBzdGFuZGFyZCBDUEUgRW50cnkuCi0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUxpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KTsKLQkJCXJlc29sdmVFbnRyeShyb290LCBwYXRocywgcmVzb2x2ZWRFbnRyeSwgamF2YVByb2plY3QpOwotCQkJcmV0dXJuIHBhdGhzLnRvQXJyYXkoKTsKLQkJfSBlbHNlIGlmIChwbHVnaW5QYXRoICE9IG51bGwpIAotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7cGx1Z2luUGF0aH07Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVzb2x2ZUVudHJ5KElXb3Jrc3BhY2VSb290IHJvb3QsIExpc3QgcGF0aHMsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKLQkJCQlJUHJvamVjdCByZXFQcm9qZWN0ID0gKElQcm9qZWN0KSByb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpOwotCQkJCS8vIFByb2plY3QgZW50cmllcyBvbmx5IGhhdmUgb25lIHNlZ21lbnQuCi0JCQkJaWYgKHJlcVByb2plY3QgIT0gbnVsbCAmJiByZXFQcm9qZWN0LmlzT3BlbigpKQotCQkJCQlwYXRocy5hZGQocmVxUHJvamVjdCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCXJlcVByb2plY3QgPSAoSVByb2plY3QpIHJvb3QuZmluZE1lbWJlcihlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJLy8gRmluZCBwcm9qZWN0IGZyb20gdGhlIGZpcnN0IHNlZ21lbnQuCi0JCQkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHJlcVByb2plY3QpOwotCQkJCWlmIChqUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IGpQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmZpbmRNZW1iZXIob3V0cHV0TG9jYXRpb24pOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlwYXRocy5hZGQocmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJSVJlc291cmNlIGxpYnJhcnkgPSByb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQkvLyBjYW4gYmUgZXh0ZXJuYWwgb3IgaW4gd29ya3NwYWNlCi0JCQkJcGF0aHMuYWRkKChsaWJyYXJ5ICE9IG51bGwpID8gbGlicmFyeS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgOiBlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCXRyeSB7Ci0JCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKGVudHJ5LmdldFBhdGgoKSwgamF2YVByb2plY3QpOwotCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJcmVzb2x2ZUVudHJ5KHJvb3QsIHBhdGhzLCBlbnRyaWVzW2ldLCBqYXZhUHJvamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJfQkJCQotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldEVudHJ5S2luZCgpIDogQklFX1BMVUdJTjsKLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0UGF0aCgpIDogcGx1Z2luUGF0aDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAodGhpcyA9PSBvdGhlcikKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgQmVhbmluZm9FbnRyeSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gUmV0dXJuIGVxdWFsIGlmIHRoZSBjbGFzc3BhdGggZW50cnkgaXMgdGhlIHNhbWUgY2xhc3NwYXRoIGVudHJ5IG9yIHBsdWdpbiBwYXRoIGVudHJ5LgotCQkvLyBUaGUgc2VhcmNoIHBhdGggZG9lc24ndCBoYXZlIGFueSBhZmZlY3Qgb24gdGhlIHNlbWFudGljIGVxdWFsaXR5LgotCQlCZWFuaW5mb0VudHJ5IG90aGVyRW50cnkgPSAoQmVhbmluZm9FbnRyeSkgb3RoZXI7Ci0JCWlmIChpc0V4cG9ydGVkICE9IG90aGVyRW50cnkuaXNFeHBvcnRlZCkKLQkJCXJldHVybiBmYWxzZTsJCi0JCWlmIChlbnRyeSAhPSBudWxsKQotCQkJcmV0dXJuIGVudHJ5LmVxdWFscyhvdGhlckVudHJ5LmVudHJ5KTsKLQkJCi0JCXJldHVybiBwbHVnaW5QYXRoLmVxdWFscyhvdGhlckVudHJ5LnBsdWdpblBhdGgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoZW50cnkgIT0gbnVsbCkKLQkJCXJldHVybiBlbnRyeS5oYXNoQ29kZSgpIF4gKGlzRXhwb3J0ZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gcGx1Z2luUGF0aC5oYXNoQ29kZSgpIF4gKGlzRXhwb3J0ZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDE1MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbmluZm9QbHVnaW4uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTggJCAgJERhdGU6IDIwMDUvMDkvMTMgMjA6MzA6NDYgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbi5Db250cmlidXRvckV4dGVuc2lvblBvaW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRWNsaXBzZUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIFRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZSBwbHVnaW4uCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9CRUFOSU5GT19QTFVHSU5JRCA9ICJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iOwkvLyBQbHVnaW4gSUQsIHVzZWQgZm9yIFF1YWxpZmllZE5hbWUuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9CRUFOSU5GT19PVkVSUklERVMgPSAib3ZlcnJpZGVzIjsJLy8gSUQgb2YgdGhlIG92ZXJyaWRlcyBleHRlbnNpb24gcG9pbnQuIC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBCZWFuaW5mb1BsdWdpbiBCRUFOSU5GT19QTFVHSU4gPSBudWxsOwotCQkKLQlwdWJsaWMgQmVhbmluZm9QbHVnaW4oKSB7CQotCQlCRUFOSU5GT19QTFVHSU4gPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBBY2Nlc3NvciBtZXRob2QgdG8gZ2V0IHRoZSBzaW5nbGV0b24gcGx1Z2luLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9QbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gQkVBTklORk9fUExVR0lOOwotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsIE92ZXJyaWRlIGZpbGUgbmFtZSB1c2VkIHdoZW4gbmVlZCB0byBhcHBseSBhbiBvdmVycmlkZSB0byBhIGNsYXNzIHRoYXQgaXMgYXQgdGhlIHJvb3QuCi0JICogQSByb290IGlzIG9uZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHN1cGVyIHR5cGUuIFRoZXNlIGFyZSA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiwgaW50ZXJmYWNlcywgYW5kIGFueQotCSAqIHVuZGVmaW5lZCBjbGFzc2VzIChpLmUuIGNsYXNzZXMgdGhhdCBkb24ndCBhY3R1YWxseSBleGlzdCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9ICIuLlJPT1QuLiI7IC8vJE5PTi1OTFMtMSQKLQkKLQotCS8qKgotCSAqIFNwZWNpYWwgb3ZlcnJpZGUgc2NoZW1lIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGphdmEgY2xhc3MuIChBcyBpbiAiWDpST09UIy8vQHJvb3QiKS4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1NDSEVNQSA9ICJYIjsKLQkKLQkvKioKLQkgKiBTcGVjaWFsIG92ZXJyaWRlIG9wYXF1ZSBwYXJ0IHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGphdmEgY2xhc3MuIChBcyBpbiAiWDpST09UIy8vQHJvb3QiKS4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX09QQVFVRSA9ICJST09UIjsKLQkKLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHVzZWQgb24gYW55IG92ZXJyaWRlIGZpbGUgd2hlbiB5b3UgcGFzcyBpbiBhIHBhdGggdGhyb3VnaCB0aGUgbWV0aG9kIHRoYXQgdGFrZXMgYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUlJJREVfRVhURU5TSU9OID0gIm92ZXJyaWRlIjsJLy8kTk9OLU5MUy0xJAotCQkKLQkKLQkvKgotCSAqIE1hcCBvZiBvcGVuIG5hdHVyZXMuIFRoaXMgbWFwIGlzIG5lZWRlZCBiZWNhdXNlIG9uIHNodXRkb3duIG9mIGJlYW5pbmZvIHBsdWdpbiB3ZSBuZWVkCi0JICogdG8gc2h1dGRvd24gdGhlIG5hdHVyZXMuIElmIHdlIGRvbid0IGRvIHRoYXQgdGhlcmUgaXMgYSBzbGlnaHQgcG9zc2liaWxpdHkgb2YgYW4gZXJyb3IKLQkgKiBiZWNhdXNlIHByb3h5IHBsdWdpbiB3aWxsIHNodXRkb3duIGFuZCB0aGlzIGNhbiBjYXVzZSBhIGNhbGxiYWNrIGludG8gYmVhbmluZm8gd2hpY2ggaGFzCi0JICogYWxyZWFkeSBiZWVuIHNodXRkb3duLiBJdCBjYWxscyBiYWNrIHRocm91Z2ggdGhlIHJlZ2lzdHJ5IGxpc3RlbmVyIHRoYXQgQmVhbmluZm9OYXR1cmUKLQkgKiBhZGRlZCB0byB0aGUgcmVnaXN0cnkgdG8gbm90aWZ5IHRoYXQgdGhlIHJlZ2lzdHJ5IGlzIGJlaW5nIHNodXRkb3duLgotCSAqIAotCSAqIEFsc28gQmVhbkluZm9DYWNoZUNvbnRyb2xsZXIgbmVlZHMgdG8ga25vdyBzbyB0aGF0IGl0IGNhbiB0ZWxsIGl0IHRoZSBwcm9qZWN0IGlzIGNsb3Npbmcgb3IKLQkgKiBiZWluZyBkZWxldGVkIG9yIHRoYXQgaXQgbmVlZHMgdG8gYmUgY2xlYXJlZCBkdWUgdG8gYSBjbGVhciByZXF1ZXN0LgotCSAqLwotCXByaXZhdGUgTWFwIG9wZW5OYXR1cmVzOwotCQotCXByaXZhdGUgTWFwIGNvbnRhaW5lcklkc1RvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnM7Ci0JcHJpdmF0ZSBNYXAgcGx1Z2luVG9CZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9uczsKLQlwcml2YXRlIE1hcCBjb250YWluZXJJZHNUb0NvbnRyaWJ1dG9yczsKLQlwcml2YXRlIE1hcCBwbHVnaW5Ub0NvbnRyaWJ1dG9yczsKLQkvKgotCSAqIE92ZXJyaWRlIGNvbnRyaWJ1dGlvbnMgZnJvbSBleHRlbnNpb24gcG9pbnQuCi0JICogb2NGcmFnbWVudHM6IEFycmF5IG9mIGZyYWdtZW50cyBwYXRocy4gV2hlbiBhIG1hdGNoIGlzIGZvdW5kIGZvciBhIHBhdGgsIHRoZSBpbmRleAotCSAqIAkJaXMgdGhlIGluZGV4IGludG8gdGhlIG9jQ29udGFpbmVySWRzIGFuZCBvY1BsdWdpbklkcyBhcnJheSBmb3IgdGhlIGNvbnRyaWJ1dGlvbnMuCi0JICogb2NDb250YWluZXJJZHM6IFRoZSBmaXJzdCBkaW1lbnNpb24gaXMgdGhlIGluZGV4IG9mIHRoZSBmcmFnbWVudCB0aGF0IHRoZSBsaXN0IG9mIE92ZXJyaWRlQ29udHJpYnV0aW9ucyBpcyBmb3IuCi0JICogCQlUaGUgc2Vjb25kIGRpbWVuc2lvbiBpcyB0aGUgYXJyYXkgb2YgY29udHJpYnV0aW9ucyBmb3IgdGhhdCBmcmFnbWVudCwgb25lIHBlciBjb250YWluZXIgaWQuCi0JICogb2NQbHVnaW5JZHM6IFRoZSBmaXJzdCBkaW1lbnNpb24gaXMgdGhlIGluZGV4IG9mIHRoZSBmcmFnbWVudCB0aGF0IHRoZSBsaXN0IG9mIE92ZXJyaWRlQ29udHJpYnV0aW9ucyBpcyBmb3IuCi0JICogCQlUaGUgc2Vjb25kIGRpbWVuc2lvbiBpcyB0aGUgYXJyYXkgb2YgY29udHJpYnV0aW9ucyBmb3IgdGhhdCBmcmFnbWVudCwgb25lIHBlciBwbHVnaW4gaWQuCi0JICogCi0JICogSWYgYSBwYXJ0aWN1bGFyIGZyYWdtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZW50cmllcyBvZiBjb250YWluZXIgYW5kL29yIHBsdWdpbiwgdGhlbiBFTVBUWV9PQyBpcyB1c2VkIGZvciB0aGF0Ci0JICogZW50cnkgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBudWxsLgotCSAqIAotCSAqIEhvdyB0aGlzIGlzIHVzZWQgaXMgZm9yIGEgcGFydGljdWxhciBwYXRoIHJlcXVlc3RlZCwgdGhlIG9jRnJhZ21lbnRzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIHRoZSBmcmFnbWVudHMgdGhhdAotCSAqIGFyZSBhcHByb3ByaWF0ZSwgdGhlbiB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGlzIHVzZWQgdG8gd2FsayB0aHJvdWdoIHRoZSBPQ1tdIGFycmF5IHJldHVybmVkIGZyb20gdGhlIG9jQ29udGFpbmVySWRzCi0JICogb3Igb2NQbHVnaW5JZHMuIEVhY2ggY29udHJpYnV0aW9uIHdvdWxkIGJlIGNoZWNrZWQgdG8gc2VlIGlmIHRoZSBjb250YWluZXIgaWQvcGx1Z2luIGlkIGlzIGluIHRoZSB2aXNpYmxlIGNsYXNzcGF0aCAodGhyb3VnaCAKLQkgKiB0aGUgaW5mbyBkYXRhIHN0b3JlZCBpbiB0aGUgcGVyc2lzdGVudCBwcm9wZXJ0eSkuIElmIGl0IGlzLCB0aGVuIHRoZSBvdmVycmlkZXMgZnJvbSB0aGF0IGNvbnRyaWJ1dGlvbiB3aWxsIGJlIHVzZWQuCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBvY0ZyYWdtZW50c1tdOwotCXByaXZhdGUgT3ZlcnJpZGVDb250cmlidXRpb25bXVtdIG9jQ29udGFpbmVySWRzOwotCXByaXZhdGUgT3ZlcnJpZGVDb250cmlidXRpb25bXVtdIG9jUGx1Z2luSWRzOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE92ZXJyaWRlQ29udHJpYnV0aW9uW10gRU1QVFlfT0MgPSBuZXcgT3ZlcnJpZGVDb250cmlidXRpb25bMF07CS8vIFVzZWQgZm9yIGFuIGVtcHR5IGNvbnRyaWJ1dGlvbiBsaXN0IGZvciBhIGZyYWdtZW50LgotCi0JcHVibGljIHN5bmNocm9uaXplZCBCZWFuaW5mb0VudHJ5W10gZ2V0Q29udGFpbmVySWRCZWFuSW5mb3MoU3RyaW5nIGNvbnRhaW5lcklEKSB7Ci0JCWlmIChjb250YWluZXJJZHNUb0JlYW5pbmZvRW50cnlDb250cmlidXRpb25zID09IG51bGwpCi0JCQlwcm9jZXNzQmVhbkluZm9Db250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKEJlYW5pbmZvRW50cnlbXSkgY29udGFpbmVySWRzVG9CZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9ucy5nZXQoY29udGFpbmVySUQpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIEJlYW5pbmZvRW50cnlbXSBnZXRQbHVnaW5CZWFuSW5mb3MoU3RyaW5nIHBsdWdpbmlkKSB7Ci0JCWlmIChwbHVnaW5Ub0JlYW5pbmZvRW50cnlDb250cmlidXRpb25zID09IG51bGwpCi0JCQlwcm9jZXNzQmVhbkluZm9Db250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKEJlYW5pbmZvRW50cnlbXSkgcGx1Z2luVG9CZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9ucy5nZXQocGx1Z2luaWQpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldFBsdWdpbkNvbnRyaWJ1dG9ycyhTdHJpbmcgcGx1Z2luaWQpIHsKLQkJaWYgKHBsdWdpblRvQ29udHJpYnV0b3JzID09IG51bGwpCi0JCQlwcm9jZXNzQmVhbkluZm9Db250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBwbHVnaW5Ub0NvbnRyaWJ1dG9ycy5nZXQocGx1Z2luaWQpOwotCX0JCi0JCi0JcHVibGljIHN5bmNocm9uaXplZCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb250YWluZXJJZENvbnRyaWJ1dG9ycyhTdHJpbmcgY29udGFpbmVySUQpIHsKLQkJaWYgKGNvbnRhaW5lcklkc1RvQ29udHJpYnV0b3JzID09IG51bGwpCi0JCQlwcm9jZXNzQmVhbkluZm9Db250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBjb250YWluZXJJZHNUb0NvbnRyaWJ1dG9ycy5nZXQoY29udGFpbmVySUQpOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQkVBTklORk9fQ09OVFJJQlVUSU9OX0VYVEVOU0lPTl9QT0lOVCA9IFBJX0JFQU5JTkZPX1BMVUdJTklEKyIucmVnaXN0cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9SRUdJU1RSQVRJT04gPSAicmVnaXN0cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0JFQU5JTkZPID0gImJlYW5pbmZvIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9PVkVSUklERSA9ICJvdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DT05UUklCVVRPUiA9ICJjb250cmlidXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9QQUNLQUdFID0gInBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzQmVhbkluZm9Db250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpIHsKLQkJQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8gaW5mbyA9IFByb3h5UGx1Z2luLnByb2Nlc3NDb250cmlidXRpb25FeHRlbnNpb25Qb2ludChQSV9CRUFOSU5GT19DT05UUklCVVRJT05fRVhURU5TSU9OX1BPSU5UKTsKLQkJQ29uZmlndXJhdGlvbkVsZW1lbnRSZWFkZXIgcmVhZGVyID0gbmV3IENvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyKCk7Ci0JCS8vIFByb2Nlc3MgdGhlIGNvbnRhaW5lciBJRHMgZmlyc3QuCi0JCWNvbnRhaW5lcklkc1RvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnMgPSBuZXcgSGFzaE1hcChpbmZvLmNvbnRhaW5lclRvQ29udHJpYnV0aW9ucy5zaXplKCkpOwotCQlNYXAgZnJhZ21lbnRzVG9JZHMgPSBuZXcgSGFzaE1hcChpbmZvLmNvbnRhaW5lclRvQ29udHJpYnV0aW9ucy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmZvLmNvbnRhaW5lclRvQ29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5PSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBjb250YWluZXJpZCA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBjb25maWdFbGVtZW50c1tpXTsKLQkJCQlpZiAoUElfUkVHSVNUUkFUSU9OLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuW2pdOwotCQkJCQkJaWYgKFBJX0JFQU5JTkZPLmVxdWFscyhjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJLy8gVGhpcyBpcyBhIGJlYW5pbmZvIGVudHJ5Ci0JCQkJCQkJQmVhbmluZm9FbnRyeSBiZSA9IEJlYW5pbmZvRW50cnkucmVhZEVudHJ5KHJlYWRlciwgY2hpbGQsIG51bGwpOwotCQkJCQkJCWlmIChiZSAhPSBudWxsKQotCQkJCQkJCQlhZGRFbnRyeShjb250YWluZXJJZHNUb0JlYW5pbmZvRW50cnlDb250cmlidXRpb25zLCBjb250YWluZXJpZCwgYmUpOwotCQkJCQkJfSBlbHNlIGlmIChQSV9PVkVSUklERS5lcXVhbHMoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCQkJCWFkZE92ZXJyaWRlRW50cnkoZnJhZ21lbnRzVG9JZHMsIHRydWUsIGNvbnRhaW5lcmlkLCBjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFBJX0NPTlRSSUJVVE9SLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJCWlmIChjb250YWluZXJJZHNUb0NvbnRyaWJ1dG9ycyA9PSBudWxsKQotCQkJCQkJCWNvbnRhaW5lcklkc1RvQ29udHJpYnV0b3JzID0gbmV3IEhhc2hNYXAoNSk7CS8vIFRoZXNlIGFyZSByYXJlLCBkb24ndCBjcmVhdGUgdW50aWwgbmVjZXNzYXJ5LgotCQkJCQkJYWRkRW50cnkoY29udGFpbmVySWRzVG9Db250cmlidXRvcnMsIGNvbnRhaW5lcmlkLCBlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkvLyBOb3cgZ28gdGhyb3VnaCBhbmQgdHVybiBhbGwgb2YgdGhlIGNvbnRyaWJ1dGlvbiBsaXN0cyBpbnRvIGFycmF5cy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVySWRzVG9CZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQllbnRyeS5zZXRWYWx1ZSgoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnRvQXJyYXkobmV3IEJlYW5pbmZvRW50cnlbKChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpKS5zaXplKCldKSk7Ci0JCX0KLQkJCi0JCWlmIChjb250YWluZXJJZHNUb0NvbnRyaWJ1dG9ycyA9PSBudWxsKQotCQkJY29udGFpbmVySWRzVG9Db250cmlidXRvcnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CS8vIFNpbmNlIHdlIGRvbid0IGhhdmUgYW55LgotCQllbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lcklkc1RvQ29udHJpYnV0b3JzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJZW50cnkuc2V0VmFsdWUoKChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpKS50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbKChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpKS5zaXplKCldKSk7Ci0JCQl9CQkJCi0JCX0KLQkJCQkKLQkJLy8gTm93IHByb2Nlc3MgdGhlIHBsdWdpbiBJRHMuCi0JCXBsdWdpblRvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnMgPSBuZXcgSGFzaE1hcChpbmZvLnBsdWdpblRvQ29udHJpYnV0aW9ucy5zaXplKCkpOwkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluZm8ucGx1Z2luVG9Db250cmlidXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnk9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHBsdWdpbklkID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2ldOwotCQkJCWlmIChQSV9SRUdJU1RSQVRJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bal07Ci0JCQkJCQlpZiAoUElfQkVBTklORk8uZXF1YWxzKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkJCQkvLyBUaGlzIGlzIGEgYmVhbmluZm8gZW50cnkKLQkJCQkJCQlCZWFuaW5mb0VudHJ5IGJlID0gQmVhbmluZm9FbnRyeS5yZWFkRW50cnkocmVhZGVyLCBjaGlsZCwgbnVsbCk7Ci0JCQkJCQkJaWYgKGJlICE9IG51bGwpCi0JCQkJCQkJCWFkZEVudHJ5KHBsdWdpblRvQmVhbmluZm9FbnRyeUNvbnRyaWJ1dGlvbnMsIHBsdWdpbklkLCBiZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKFBJX09WRVJSSURFLmVxdWFscyhjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJYWRkT3ZlcnJpZGVFbnRyeShmcmFnbWVudHNUb0lkcywgZmFsc2UsIHBsdWdpbklkLCBjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFBJX0NPTlRSSUJVVE9SLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJCWlmIChwbHVnaW5Ub0NvbnRyaWJ1dG9ycyA9PSBudWxsKQotCQkJCQkJCXBsdWdpblRvQ29udHJpYnV0b3JzID0gbmV3IEhhc2hNYXAoNSk7CS8vIFRoZXNlIGFyZSByYXJlLCBkb24ndCBjcmVhdGUgdW50aWwgbmVjZXNzYXJ5LgotCQkJCQkJYWRkRW50cnkocGx1Z2luVG9Db250cmlidXRvcnMsIHBsdWdpbklkLCBlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkvLyBOb3cgZ28gdGhyb3VnaCBhbmQgdHVybiBhbGwgb2YgdGhlIGNvbnRyaWJ1dGlvbiBsaXN0cyBpbnRvIGFycmF5cy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luVG9CZWFuaW5mb0VudHJ5Q29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQllbnRyeS5zZXRWYWx1ZSgoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnRvQXJyYXkobmV3IEJlYW5pbmZvRW50cnlbKChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpKS5zaXplKCldKSk7Ci0JCX0KLQkJCi0JCWlmIChwbHVnaW5Ub0NvbnRyaWJ1dG9ycyA9PSBudWxsKQotCQkJCXBsdWdpblRvQ29udHJpYnV0b3JzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwkvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGFueS4KLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW5Ub0NvbnRyaWJ1dG9ycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCWVudHJ5LnNldFZhbHVlKCgoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WygoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkuc2l6ZSgpXSkpOwotCQkJfQkJCQotCQl9Ci0JCQotCQkvLyBOb3cgaGFuZGxlIHRoZSBlbnRpcmUgbGlzdCBvZiBmcmFnbWVudHMuCi0JCW9jRnJhZ21lbnRzID0gbmV3IElQYXRoW2ZyYWdtZW50c1RvSWRzLnNpemUoKV07Ci0JCW9jQ29udGFpbmVySWRzID0gbmV3IE92ZXJyaWRlQ29udHJpYnV0aW9uW29jRnJhZ21lbnRzLmxlbmd0aF1bXTsKLQkJb2NQbHVnaW5JZHMgPSBuZXcgT3ZlcnJpZGVDb250cmlidXRpb25bb2NGcmFnbWVudHMubGVuZ3RoXVtdOwotCQlJdGVyYXRvciBpdGVyOwotCQlpbnQgZnJhZ0luZGV4OwotCQlmb3IgKGl0ZXIgPSBmcmFnbWVudHNUb0lkcy5lbnRyeVNldCgpLml0ZXJhdG9yKCksIGZyYWdJbmRleD0wOyBpdGVyLmhhc05leHQoKTsgZnJhZ0luZGV4KyspIHsKLQkJCU1hcC5FbnRyeSBtYXBFbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJb2NGcmFnbWVudHNbZnJhZ0luZGV4XSA9IChJUGF0aCkgbWFwRW50cnkuZ2V0S2V5KCk7Ci0JCQlNYXBbXSBtYXBWYWx1ZSA9IChNYXBbXSkgbWFwRW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChtYXBWYWx1ZVswXSA9PSBudWxsKQotCQkJCW9jQ29udGFpbmVySWRzW2ZyYWdJbmRleF0gPSBFTVBUWV9PQzsKLQkJCWVsc2UgewotCQkJCU1hcCBjb250YWluZXJzID0gbWFwVmFsdWVbMF07Ci0JCQkJT3ZlcnJpZGVDb250cmlidXRpb25bXSBvY0NvbnRyaWJ1dGlvbiA9IG9jQ29udGFpbmVySWRzW2ZyYWdJbmRleF0gPSBuZXcgT3ZlcnJpZGVDb250cmlidXRpb25bY29udGFpbmVycy5zaXplKCldOwotCQkJCWludCBvY0luZGV4OwotCQkJCUl0ZXJhdG9yIG9jSXRlcmF0b3I7Ci0JCQkJZm9yIChvY0l0ZXJhdG9yID0gY29udGFpbmVycy5lbnRyeVNldCgpLml0ZXJhdG9yKCksIG9jSW5kZXg9MDsgb2NJdGVyYXRvci5oYXNOZXh0KCk7IG9jSW5kZXgrKykgewotCQkJCQlNYXAuRW50cnkgY29udGFpbmVyRW50cnkgPSAoTWFwLkVudHJ5KSBvY0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJT3ZlcnJpZGVDb250cmlidXRpb24gb2MgPSBvY0NvbnRyaWJ1dGlvbltvY0luZGV4XSA9IG5ldyBPdmVycmlkZUNvbnRyaWJ1dGlvbigpOwotCQkJCQlvYy5pZCA9IChTdHJpbmcpIGNvbnRhaW5lckVudHJ5LmdldEtleSgpOwotCQkJCQlMaXN0W10gb2NMaXN0cyA9IChMaXN0W10pIGNvbnRhaW5lckVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCW9jLnBsdWdpbklkcyA9IChTdHJpbmdbXSkgb2NMaXN0c1swXS50b0FycmF5KG5ldyBTdHJpbmdbb2NMaXN0c1swXS5zaXplKCldKTsKLQkJCQkJb2MucGF0aHMgPSAoU3RyaW5nW10pIG9jTGlzdHNbMV0udG9BcnJheShuZXcgU3RyaW5nW29jTGlzdHNbMV0uc2l6ZSgpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1hcFZhbHVlWzFdID09IG51bGwpCi0JCQkJb2NQbHVnaW5JZHNbZnJhZ0luZGV4XSA9IEVNUFRZX09DOwotCQkJZWxzZSB7Ci0JCQkJTWFwIHBsdWdpbnMgPSBtYXBWYWx1ZVsxXTsKLQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbltdIG9jQ29udHJpYnV0aW9uID0gb2NQbHVnaW5JZHNbZnJhZ0luZGV4XSA9IG5ldyBPdmVycmlkZUNvbnRyaWJ1dGlvbltwbHVnaW5zLnNpemUoKV07Ci0JCQkJaW50IG9jSW5kZXg7Ci0JCQkJSXRlcmF0b3Igb2NJdGVyYXRvcjsKLQkJCQlmb3IgKG9jSXRlcmF0b3IgPSBwbHVnaW5zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKSwgb2NJbmRleD0wOyBvY0l0ZXJhdG9yLmhhc05leHQoKTsgb2NJbmRleCsrKSB7Ci0JCQkJCU1hcC5FbnRyeSBwbHVnaW5FbnRyeSA9IChNYXAuRW50cnkpIG9jSXRlcmF0b3IubmV4dCgpOwotCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBvYyA9IG9jQ29udHJpYnV0aW9uW29jSW5kZXhdID0gbmV3IE92ZXJyaWRlQ29udHJpYnV0aW9uKCk7Ci0JCQkJCW9jLmlkID0gKFN0cmluZykgcGx1Z2luRW50cnkuZ2V0S2V5KCk7Ci0JCQkJCUxpc3RbXSBvY0xpc3RzID0gKExpc3RbXSkgcGx1Z2luRW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJb2MucGx1Z2luSWRzID0gKFN0cmluZ1tdKSBvY0xpc3RzWzBdLnRvQXJyYXkobmV3IFN0cmluZ1tvY0xpc3RzWzBdLnNpemUoKV0pOwotCQkJCQlvYy5wYXRocyA9IChTdHJpbmdbXSkgb2NMaXN0c1sxXS50b0FycmF5KG5ldyBTdHJpbmdbb2NMaXN0c1sxXS5zaXplKCldKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBBZGQgYW4gZW50cnkgdG8gdGhlIG1hcC4gSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYW4gZW50cnkgYXMgYW4gYXJyYXkuIFRoZW4gYWRkIHRoZSBlbnRyeSB0byBhcnJheS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRW50cnkoTWFwIG1hcCwgT2JqZWN0IGtleSwgT2JqZWN0IGVudHJ5KSB7Ci0JCUxpc3QgbWFwRW50cnkgPSAoTGlzdCkgbWFwLmdldChrZXkpOwotCQlpZiAobWFwRW50cnkgPT0gbnVsbCkgewotCQkJbWFwRW50cnkgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJbWFwLnB1dChrZXksIG1hcEVudHJ5KTsKLQkJfQotCQltYXBFbnRyeS5hZGQoZW50cnkpOwotCX0KLQkKLQkvKgotCSAqIEFkZCBhbiBlbnRyeSB0byB0aGUgbWFwLgotCSAqIGlkIGlzIHRoZSBjb250YWluZXIvcGx1Z2luIGlkLgotCSAqIAotCSAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1hcCBpczoKLQkgKiAJa2V5OiBmcmFnbWVudCBuYW1lCi0JICogCXZhbHVlOiBNYXBbMl0sIHdoZXJlIFswXSBpcyBmb3IgY29udGFpbmVyIGlkcywgYW5kIFsxXSBpcyBmb3IgcGx1Z2luIGlkcy4KLQkgKiAJCU1hcFt4XToKLQkgKiAJCQlrZXk6IGNvbnRhaW5lci9wbHVnaW4gaWQKLQkgKiAJCQl2YWx1ZTogTGlzdFsyXSwgd2hlcmUgWzBdIGlzIGxpc3Qgb2YgcGx1Z2luIGlkcyBmb3IgdGhlIG92ZXJyaWRlLCBhbmQgWzFdIGlzIGxpc3Qgb2YgcGF0aHMgZm9yIHRoZSBvdmVycmlkZSBmaWxlcyByZWxhdGl2ZSB0byB0aGF0IHBsdWdpbiBpZC4KLQkgKiAKLQkgKiBBZnRlciBhbGwgZG9uZSB0aGVzZSBtYXBzL2xpc3Qgd2lsbCBiZSBib2lsZWQgZG93biB0byB0aGUgYXJyYXlzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBsb29rdXAuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE92ZXJyaWRlRW50cnkoTWFwIG1hcCwgYm9vbGVhbiBjb250YWluZXIsIE9iamVjdCBpZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVudHJ5KSB7Ci0JCQotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBlbnRyeS5nZXRBdHRyaWJ1dGVBc0lzKFBJX1BBQ0tBR0UpOwotCQlTdHJpbmcgcGx1Z2luID0gbnVsbDsKLQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBlbnRyeS5nZXRBdHRyaWJ1dGVBc0lzKFBJX1BBVEgpOwotCQlJUGF0aCBmcmFnbWVudCA9IG51bGw7IAotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDAgJiYgcGF0aFN0cmluZyAhPSBudWxsICYmIHBhdGhTdHJpbmcubGVuZ3RoKCkgPiAwKSB7IAotCQkJZnJhZ21lbnQgPSBuZXcgUGF0aChwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgJy8nKSk7Ci0JCQlpZiAocGF0aFN0cmluZy5jaGFyQXQocGF0aFN0cmluZy5sZW5ndGgoKS0xKSAhPSAnLycpCi0JCQkJcGF0aFN0cmluZyArPSAnLyc7Ci0JCQlpZiAocGF0aFN0cmluZy5jaGFyQXQoMCkgIT0gJy8nKQotCQkJCXBsdWdpbiA9IGVudHJ5LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKHBhdGhTdHJpbmcubGVuZ3RoKCkgPiA0KSB7Ci0JCQkJCWludCBwZW5kID0gcGF0aFN0cmluZy5pbmRleE9mKCcvJywgMSk7Ci0JCQkJCWlmIChwZW5kID09IC0xIHx8IHBlbmQgPj0gcGF0aFN0cmluZy5sZW5ndGgoKS0xKQotCQkJCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0JCQkJCXBsdWdpbiA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKDEsIHBlbmQpOwotCQkJCQlwYXRoU3RyaW5nID0gcGF0aFN0cmluZy5zdWJzdHJpbmcocGVuZCsxKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0JCQl9Ci0JCX0KLQkJaWYgKHBhdGhTdHJpbmcubGVuZ3RoKCkgPCAyKQotCQkJcmV0dXJuOwkvLyBpbnZhbGlkCi0KLQkJTWFwW10gbWFwRW50cnkgPSAoTWFwW10pIG1hcC5nZXQoZnJhZ21lbnQpOwotCQlpZiAobWFwRW50cnkgPT0gbnVsbCkgewotCQkJbWFwRW50cnkgPSBuZXcgSGFzaE1hcFsyXTsKLQkJCW1hcC5wdXQoZnJhZ21lbnQsIG1hcEVudHJ5KTsKLQkJfQotCQkKLQkJaWYgKGNvbnRhaW5lcikgewotCQkJaWYgKG1hcEVudHJ5WzBdID09IG51bGwpCi0JCQkJbWFwRW50cnlbMF0gPSBuZXcgSGFzaE1hcCgyKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtYXBFbnRyeVsxXSA9PSBudWxsKQotCQkJCW1hcEVudHJ5WzFdID0gbmV3IEhhc2hNYXAoMik7CQkJCi0JCX0KLQkJCi0JCUxpc3RbXSBpZEVudHJ5ID0gKExpc3RbXSkgbWFwRW50cnlbY29udGFpbmVyID8gMCA6IDFdLmdldChpZCk7Ci0JCWlmIChpZEVudHJ5ID09IG51bGwpIHsKLQkJCWlkRW50cnkgPSBuZXcgTGlzdFtdIHtuZXcgQXJyYXlMaXN0KDEpLCBuZXcgQXJyYXlMaXN0KDEpfTsKLQkJCW1hcEVudHJ5W2NvbnRhaW5lciA/IDAgOiAxXS5wdXQoaWQsIGlkRW50cnkpOwotCQl9Ci0KLQkJaWRFbnRyeVswXS5hZGQocGx1Z2luKTsKLQkJaWRFbnRyeVsxXS5hZGQocGF0aFN0cmluZyk7Ci0JfQkKLQkJCQotCS8qCi0JICogVGhpcyBpcyBhbiBsaXN0IG9mIG92ZXJyaWRlcyB0aGF0IGFyZSBhdmFpbGFibGUgYXMgYSBjb250cmlidXRpb24gZm9yIGEgc3BlY2lmaWMgZnJhZ21lbnQuCi0JICogPHVsPgotCSAqIDxsaT5UaGUgaWQgb2YgdGhpcyBjb250cmlidXRpb24uIEVpdGhlciBjb250YWluZXIgb3IgcGx1Z2luIGlkIGRlcGVuZGluZyBvbiB3aGljaCBsaXN0IGl0IHdhcyBpbi4uCi0JICogPGxpPlRoZSBwbHVnaW5zIGFycmF5IGxpc3RzIHRoZSBwbHVnaW4gaWRzIGZvciBhbGwgb2YgdGhlIHBhdGhzIGluIHRoaXMgY29udHJpYnV0aW9uLgotCSAqIDxsaT5UaGUgcGF0aHMgYXJyYXkgbGlzdHMgdGhlIGZvbGRlciBwYXRoIHVuZGVyIHRoYXQgY29ycmVzcG9uZGluZyBwbHVnaW4gZnJvbSAicGx1Z2luSWRzIi4KLQkgKiA8L3VsPiAKLQkgKiA8cD4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPdmVycmlkZUNvbnRyaWJ1dGlvbiB7Ci0JCXB1YmxpYyBTdHJpbmcgaWQ7Ci0JCXB1YmxpYyBTdHJpbmdbXSBwbHVnaW5JZHM7Ci0JCXB1YmxpYyBTdHJpbmdbXSBwYXRoczsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHJ1bm5hYmxlIGlzIHRvIHVzZWQgdG8gYXBwbHkgb3ZlcnJpZGUuIAotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gc2VxdWVuY2UgZm9yIGVhY2ggb3ZlcnJpZGUgcGF0aCBmb3VuZC4gSXQgaXMgc2VuZCBpbiBvbiB0aGUgYXBwbHkgb3ZlcnJpZGVzIGNhbGwuIFRoaXMKLQkgKiBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gaXMgcHJpdmF0ZS4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIChpbXBsZW1lbnRlcnMgb2YgdGhlIElCZWFuSW5mb0NvbnRyaWJ1dG9yKSB3aWxsIGJlIHBhc3NlZCBpbiB0aGUgc3ViaW50ZXJmYWNlIDxjb2RlPklDb250cmlidXRvck92ZXJyaWRlUnVubmFibGU8L2NvZGU+IHdoaWNoCi0JICogaW5oZXJpdHMgZnJvbSB0aGlzIGludGVyZmFjZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogQHNlZSBCZWFuaW5mb1BsdWdpbiNhcHBseU92ZXJyaWRlcyhJUHJvamVjdCwgU3RyaW5nLCBTdHJpbmcsIFJlc291cmNlU2V0LCBJT3ZlcnJpZGVSdW5uYWJsZSkKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElPdmVycmlkZVJ1bm5hYmxlIHsKLQkJLyoqCi0JCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZGlyZWN0b3J5IHBhdGggdG8gdXNlLiBJdCB3aWxsIGJlIGNhbGxlZCBvdmVyIGFuZCBvdmVyIGZvciBldmVyeQotCQkgKiBvdmVycmlkZSBwYXRoIGZvdW5kIGZvciBhIHBhY2thZ2UuIFRoZSBwYXRoIHdpbGwgYmUgY29tcGxldGUsIGluY2x1ZGluZyB0cmFpbGluZyAnLycuCi0JCSAqIEl0IHdpbGwgYmUgaW4gYSBVUkkgZm9ybWF0IGZvciBhIGRpcmVjdG9yeS4gVGhlIG92ZXJyaWRlcnVubmFibGUgaW1wbGVtZW50YXRpb24gd2lsbCB0aGVuIGFwcGVuZCB0aGUgZmlsZW5hbWUgY2FsbCAoaS5lLiBjbGFzc2JlaW5naW50cm9zcGVjdGVkLm92ZXJyaWRlKSB0byBnZXQgYSBjb21wbGV0ZSBwYXRoLgotCQkgKiA8cD4KLQkJICogQ2xpZW50cyAoSUJlYW5JbmZvQ29udHJpYnV0b3IgaW1wbGVtZW50ZXJzKSBjYW4gY2FsbCB0aGlzIHRvIGFwcGx5IGEgc3BlY2lmaWMgb3ZlcnJpZGUgZmlsZSB0byB0aGUgY3VycmVudAotCQkgKiBjbGFzcyBiZWluZyBwcm9jZXNzZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gb3ZlcnJpZGVQYXRoIHRoZSBwYXRoIHdpbGwgYmUgY29tcGxldGUsIGluY2x1ZGluZyB0cmFpbGluZyAnLycuIEl0IHdpbGwgYmUgaW4gYSBVUkkgZm9ybWF0IGZvciBhIGRpcmVjdG9yeS4gVGhlIG92ZXJyaWRlIGZpbGUgbmFtZSAoY2xhc3NuYW1lLm92ZXJyaWRlKSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgYW5kIHJldHJpZXZlZCBhbmQgYXBwbGllZC4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFN0cmluZyBvdmVycmlkZVBhdGgpOwotCQkKLQkJLyoqCi0JCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgYWN0dWFsIHJlc291cmNlIHRvIHVzZS4gVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBzcGVjaWFsIGNvbnRyaWJ1dG9ycyB0aGF0IHdhbnQKLQkJICogYSBzcGVjaWFsIGV4cGxpY2l0IG92ZXJyaWRlIHJlc291cmNlIHRvIGJlIHVzZWQuCi0JCSAqIDxwPgotCQkgKiBDb250cmlidXRvcnMgc2hvdWxkIHVzZSB0aGUgUmVzb3VyY2VTZXQgdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlbS4gVGhpcyBpcyBzbyB0aGF0IGFueXRoaW5nIGphdmEgY2xhc3MgdGhhdAotCQkgKiB0aGUgb3ZlcnJpZGUgcmVzb3VyY2UgcG9pbnRzIHRvIHdpbGwgYmUgZm91bmQuCi0JCSAqIDxwPgotCQkgKiBUaGlzIHJlc291cmNlIHdpbGwgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIGJ5IEJlYW5JbmZvIGFmdGVyIGJlaW5nIGFwcGxpZWQuIEl0IG11c3Qgbm90IGJlIGxlZnQgYXJvdW5kIGJlY2F1c2UKLQkJICogaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgYXBwbGllZCBpdCB3aWxsIGJlIG1vZGlmaWVkLCBzbyBpdCBjb3VsZCBub3QgYmUgcmV1c2VkLiAKLQkJICogIAotCQkgKiBAcGFyYW0gb3ZlcnJpZGVSZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gYXBwbHkgdG8gdGhlIGN1cnJlbnQgY2xhc3MuIE5PVEU6IFRoaXMgcmVzb3VyY2UgV0lMTCBiZSByZW1vdmVkIGZyb20KLQkJICogdGhlIHJlc291cmNlIHNldCBpdCBpcyBpbiBhdXRvbWF0aWNhbGx5IGJ5IHRoaXMgY2FsbC4gSXQgd29uJ3QgYmUgbGVmdCBhcm91bmQgYmVjYXVzZSB0aGUgYWN0aW9uIG9mIGFwcGx5Ci0JCSAqIHdpbGwgYWN0dWFsbHkgbW9kaWZ5IHRoZSByZXNvdXJjZS4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKFJlc291cmNlIG92ZXJyaWRlUmVzKTsKLQl9Ci0JCi0JLyoqCi0JICogSUJlYW5JbmZvQ29udHJpYnV0b3IgcnVubmFibGUgdG8gdXNlIHRvIGFwcGx5IG92ZXJyaWRlcy4KLQkgKiA8cD4KLQkgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHdpbGwgYmUgcGFzc2VkIGluIHRvIElCZWFuSW5mb0NvbnRyaWJ1dG9yJ3Mgc28gdGhhdCB0aGV5IGNhbiBjYWxsIGJhY2sgdG8gYXBwbHkgdGhlIG92ZXJyaWRlcy4gVGhleQotCSAqIHNob3VsZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBydW4gbWV0aG9kIG9uY2UgZm9yIGVhY2ggb3ZlcnJpZGUgdG8gYmUgYXBwbGllZC4gVGhlIHJ1biBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZyb20gZWFjaCBJQmVhbkluZm9Db250cmlidXRvci4KLQkgKiA8cD4KLQkgKiBJdCBpbmhlcml0cyBmcm9tIDxjb2RlPklPdmVycmlkZVJ1bm5hYmxlPC9jb2RlPiwgc28gc2VlIHRoYXQgZm9yIG1vcmUgbWV0aG9kcyB0byBjYWxsLgotCSAqIDxwPgotCSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotCSAqIAotCSAqIEBzZWUgQmVhbmluZm9QbHVnaW4uSU92ZXJyaWRlUnVubmFibGUgZm9yIG1vcmUgbWV0aG9kcyB0aGF0IGNhbiBiZSBjYWxsZWQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlIGV4dGVuZHMgSU92ZXJyaWRlUnVubmFibGUgewotCQkKLQkJLyoqCi0JCSAqIFRlc3RzIGlmIHBhdGggaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGUgY3VycmVudCBjbGFzcy4KLQkJICogPHA+Ci0JCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBieSB0aGUgSUJlYW5JbmZvQ29udHJpYnV0b3IgZm9yIG92ZXJyaWRlcyB0byB0ZXN0IGlmIHRoZSBwYXRoIChzYW1lIHBhdGggYXMgZm9yIHRoZSBJT3ZlcnJpZGVSdW5uYWJsZS5ydW4oU3RyaW5nKSBtZXRob2QpCi0JCSAqIGhhcyBhbHJlYWR5IGJlZW4gY29udHJpYnV0ZWQgb25jZSBmb3IgdGhpcyBjbGFzcy4gSXQgY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aW1lLiBIb3dldmVyIGl0IGlzIG5vdCBuZWNlc3NhcnkgYmVjYXVzZQotCQkgKiBCZWFuSW5mbyB3aWxsIG5vdCBwZXJtaXQgaXQgdG8gYmUgY29udHJpYnV0ZWQgbW9yZSB0aGFuIG9uY2UgZm9yIGEgY2xhc3MuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGF0aAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVzZWQgYWxyZWFkeS4KLQkJICogCi0JCSAqIEBzZWUgSU92ZXJyaWRlUnVubmFibGUjcnVuKFN0cmluZykKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBwYXRoQ29udHJpYnV0ZWQoU3RyaW5nIHBhdGgpOwotCQkKLQkJLyoqCi0JCSAqIFRlc3RzIGlmIHRoZSBVUkkgaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGUgY3VycmVudCBjbGFzcy4KLQkJICogPHA+Ci0JCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBieSBhbiBJQmVhbkluZm9Db250cmlidXRvciBmb3Igb3ZlcnJpZGVzIHRvIHNlZSBpZiB0aGUgVVJJIChzYW1lIHBhdGggYXMgdGhlIFVSSSBmcm9tIHRoZSBJT3ZlcnJpZGVSdW5uYWJsZS5ydW4oUmVzb3VyY2UpIG1ldGhvZCkKLQkJICogaGFzIGFscmVhZHkgYmVlbiBjb250cmlidXRlZCBvbmNlIGZvciB0aGlzIGNsYXNzLiBJdCBjYW4gYmUgdXNlZCB0byBzYXZlIHRpbWUuIEhvd2V2ZXIsIG5vdCBuZWNlc3NhcnkgYmVjYXVzZQotCQkgKiBCZWFuSW5mbyB3aWxsIG5vdCBwZXJtaXQgdGhlIFVSSSB0byBiZSBjb250cmlidXRlZCBtb3JlIHRoYW4gb25jZSBmb3IgYSBjbGFzcy4KLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZVVSSQotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVzZWQgYWxyZWFkeS4KLQkJICogCi0JCSAqIEBzZWUgSU92ZXJyaWRlUnVubmFibGUjcnVuKFJlc291cmNlKQotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlc291cmNlQ29udHJpYnV0ZWQoVVJJIHJlc291cmNlVVJJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fUEFUSFMgPSBuZXcgU3RyaW5nWzBdOwotCQotCS8qKgotCSAqIFJldHVybiBqdXN0IHRoZSBjb250cmlidXRlZCBvdmVycmlkZSBwYXRocyAodGhyb3VnaCB0aGUgQmVhbkluZm8gcmVnaXN0cmF0aW9ucykuIERvZXMgbm90IGluY2x1ZGUgYW55IHBhdGhzIHRoYXQgYXJlIGNvbnRyaWJ1dGVkIGZyb20KLQkgKiBJQmVhbkluZm9Db250cmlidXRvcidzLiBUaGlzIGlzIHVzZWQgYnkgdGhlIEJlYW5JbmZvQ2xhc3NBZGFwdGVyIHRvIGxvYWQgdGhlIG92ZXJyaWRlcyBmaWxlcyBpbnRvIG9uZSBjYWNoZSBmaWxlIHNvIHRoYXQgaXQgY2FuCi0JICogYmUgZG9uZSBhdCBvbmUgdGltZSB0aGUgbmV4dCB0aW1lIGl0IGlzIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZQotCSAqIEByZXR1cm4gYXJyYXkgb2YgcGF0aCBzdHJpbmdzIHRvIHRoZSBvdmVycmlkZS4gVGhlIGZpbGVzIG1heSBub3QgZXhpc3QsIHRoZXkgaXMganVzdCBwb3NzaWJsZSBvdmVycmlkZXMuIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRPdmVycmlkZVBhdGhzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlmaW5hbCBJUGF0aCBwYWNrYWdlUGF0aCA9IG5ldyBQYXRoKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpKycvJyk7Ci0JCUxpc3Qgb3ZlcnJpZGVQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBpbmZvID0gKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbykgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoQmVhbmluZm9OYXR1cmUuQ09ORklHX0lORk9fU0VTU0lPTl9LRVkpOwotCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCS8vIEl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvdXIgb3duIGludGVybmFsIHZlcnNpb24gaGVyZS4KLQkJCQlpbmZvID0gUHJveHlMYXVuY2hTdXBwb3J0LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyhKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwkJCQkJCi0JCQkJQmVhbmluZm9OYXR1cmUuY29tcHV0ZUJlYW5JbmZvQ29uZmlnSW5mbyhpbmZvKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvY0ZyYWdtZW50cyA9PSBudWxsKQotCQkJCQlwcm9jZXNzQmVhbkluZm9Db250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOyAvLyBXZSBoYXZlbid0IHByb2Nlc3NlZCB0aGVtIHlldC4KLQkJCX0KLQkJCWZvciAoaW50IGZyYWdtZW50SW5kZXggPSAwOyBmcmFnbWVudEluZGV4IDwgb2NGcmFnbWVudHMubGVuZ3RoOyBmcmFnbWVudEluZGV4KyspIHsKLQkJCQlpZiAob2NGcmFnbWVudHNbZnJhZ21lbnRJbmRleF0uaXNQcmVmaXhPZihwYWNrYWdlUGF0aCkpIHsKLQkJCQkJU3RyaW5nIGxlZnRPdmVyID0gbnVsbDsJLy8gVGhlIGxlZnQgb3ZlciBwb3J0aW9uIG9mIHRoZSBwYWNrYWdlLiBUaGlzIHdpbGwgYmUgc2V0IGZpcnN0IHRpbWUgbmVlZGVkLiAKLQkJCQkJT3ZlcnJpZGVDb250cmlidXRpb25bXSBjbnRyQ29udHJpYnV0aW9ucyA9IG9jQ29udGFpbmVySWRzW2ZyYWdtZW50SW5kZXhdOwotCQkJCQlmb3IgKGludCBvY2luZGV4ID0gMDsgb2NpbmRleCA8IGNudHJDb250cmlidXRpb25zLmxlbmd0aDsgb2NpbmRleCsrKSB7Ci0JCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSBjbnRyQ29udHJpYnV0aW9uc1tvY2luZGV4XTsKLQkJCQkJCUJvb2xlYW4gdmlzaWJsZSA9IChCb29sZWFuKSBpbmZvLmdldENvbnRhaW5lcklkcygpLmdldChjb250cmlidXRpb24uaWQpOwotCQkJCQkJaWYgKHZpc2libGUgIT0gbnVsbCAmJiB2aXNpYmxlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJZm9yIChpbnQgY2luZGV4ID0gMDsgY2luZGV4IDwgY29udHJpYnV0aW9uLnBsdWdpbklkcy5sZW5ndGg7IGNpbmRleCsrKSB7Ci0JCQkJCQkJCS8vIEJlY2F1c2Ugb2YgVVJJQ29udmVydGVycyBhbmQgbm9ybWFsaXphdGlvbiBpbiBvcmcuZWNsaXBzZS5qZW0udXRpbCBzdHVmZiwgd2UKLQkJCQkJCQkJLy8gbmVlZCB0byBoYXZlIHBsdWdpbiB1cmkncyBpbiB0aGUgZm9ybSAicGxhdGZvcm06L3BsdWdpbi9wbHVnaW5uYW1lIi4KLQkJCQkJCQkJLy8gQnVuZGxlJ3MgZG9uJ3QgcmV0dXJuIHRoaXMgZm9ybWF0LiBUaGV5IHJldHVybiBidW5kbGU6L3N0dWZmCi0JCQkJCQkJCS8vIFNvIHdlIHdpbGwgc2ltcGxlIGNyZWF0ZSBpdCBvZiB0aGUgcGxhdGZvcm06L3BsdWdpbiBmb3JtYXQuCi0JCQkJCQkJCS8vIFRvIHNhdmUgdGltZSwgd2Ugd2lsbCBmaXJzdCBzZWUgaWYgd2UgaGF2ZSB0aGUgYnVuZGxlLgotCQkJCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGNvbnRyaWJ1dGlvbi5wbHVnaW5JZHNbY2luZGV4XSk7Ci0JCQkJCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKGxlZnRPdmVyID09IG51bGwpCi0JCQkJCQkJCQkJbGVmdE92ZXIgPSBnZXRMZWZ0T3ZlcihvY0ZyYWdtZW50c1tmcmFnbWVudEluZGV4XSwgcGFja2FnZVBhdGgpOwotCQkJCQkJCQkJb3ZlcnJpZGVQYXRocy5hZGQoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTCsiOi8iK0pFTVV0aWxQbHVnaW4uUExBVEZPUk1fUExVR0lOKycvJytidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkrJy8nK2NvbnRyaWJ1dGlvbi5wYXRoc1tjaW5kZXhdK2xlZnRPdmVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbltdIHBsdWdpbkNvbnRyaWJ1dGlvbnMgPSBvY1BsdWdpbklkc1tmcmFnbWVudEluZGV4XTsKLQkJCQkJZm9yIChpbnQgb2NpbmRleCA9IDA7IG9jaW5kZXggPCBwbHVnaW5Db250cmlidXRpb25zLmxlbmd0aDsgb2NpbmRleCsrKSB7Ci0JCQkJCQlPdmVycmlkZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSBwbHVnaW5Db250cmlidXRpb25zW29jaW5kZXhdOwotCQkJCQkJQm9vbGVhbiB2aXNpYmxlID0gKEJvb2xlYW4pIGluZm8uZ2V0UGx1Z2luSWRzKCkuZ2V0KGNvbnRyaWJ1dGlvbi5pZCk7Ci0JCQkJCQlpZiAodmlzaWJsZSAhPSBudWxsICYmIHZpc2libGUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQlmb3IgKGludCBjaW5kZXggPSAwOyBjaW5kZXggPCBjb250cmlidXRpb24ucGx1Z2luSWRzLmxlbmd0aDsgY2luZGV4KyspIHsKLQkJCQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShjb250cmlidXRpb24ucGx1Z2luSWRzW2NpbmRleF0pOwotCQkJCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChsZWZ0T3ZlciA9PSBudWxsKQotCQkJCQkJCQkJCWxlZnRPdmVyID0gZ2V0TGVmdE92ZXIob2NGcmFnbWVudHNbZnJhZ21lbnRJbmRleF0sIHBhY2thZ2VQYXRoKTsKLQkJCQkJCQkJCW92ZXJyaWRlUGF0aHMuYWRkKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUFJPVE9DT0wrIjovIitKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BMVUdJTisnLycrYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKycvJytjb250cmlidXRpb24ucGF0aHNbY2luZGV4XStsZWZ0T3Zlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCX0KLQkJcmV0dXJuIG92ZXJyaWRlUGF0aHMuaXNFbXB0eSgpID8gTk9fUEFUSFMgOiAoU3RyaW5nW10pIG92ZXJyaWRlUGF0aHMudG9BcnJheShuZXcgU3RyaW5nW292ZXJyaWRlUGF0aHMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEFwcGx5IHRoZSBydW5uYWJsZSB0byBhbGwgb2YgdGhlIG92ZXJyaWRlIHBhdGhzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIAotCSAqIGdpdmVuIHBhY2thZ2UgbmFtZS4gSXQgd2lsbCBydW4gdGhyb3VnaCB0aGUgZXhwbGljaXQgY29udHJpYnV0b3JzIGFuZCB0aGUgSUNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUJlYW5JbmZvQ29udHJpYnV0b3IuCi0JICogPHA+Ci0JICogVGhlIHBhY2thZ2UgbmFtZSB1c2VzICcuJyB0byBkZWxpbmVhdGUgdGhlIGZyYWdtZW50cyBvZiB0aGUgbmFtZSwKLQkgKiBpLmUuIHVzZSAiPGNvZGU+amF2YS5sYW5nPC9jb2RlPiIgYXMgYSBwYWNrYWdlIG5hbWUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuIEl0IGlzIHB1YmxpYyBvbmx5IGJlY2F1c2UgYW4gaW50ZXJuYWwgY2xhc3MgaW4gYW5vdGhlciBwYWNrYWdlIG5lZWRzIHRvIGNhbGwgaXQuCi0JICogVE9ETyBUaGlzIHNob3VsZCBiZSBwYWNrYWdlLXByb3RlY3RlZC4gTGF0ZXIgdGhlIG90aGVyIGNsYXNzIHdpbGwgYmUgbW92ZWQgaW50byB0aGlzIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gcnVuIGFnYWluc3QuCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lCi0JICogQHBhcmFtIGNsYXNzTmFtZSBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGlzIGJlaW5nIG92ZXJyaWRkZW4uCi0JICogQHBhcmFtIGphdmFDbGFzcyB0aGUgamF2YSBjbGFzcyB0aGUgb3ZlcnJpZGVzIHdpbGwgYmUgYXBwbGllZCB0by4KLQkgKiBAcGFyYW0gcmVzb3VyY2Ugc2V0IHRoYXQgY29udHJpYnV0b3JzIGNhbiB1c2UgdG8gdGVtcG9yYXJpbHkgbG9hZCBkeW5hbWljIG92ZXJyaWRlIGZpbGVzLgotCSAqIEBwYXJhbSBydW5uYWJsZSB1c2UgdGhpcyBydW5uYWJsZSB0byBhY3R1YWxseSBhcHBseSBvdmVycmlkZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlPdmVycmlkZXMoZmluYWwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBKYXZhQ2xhc3MgamF2YUNsYXNzLCBmaW5hbCBSZXNvdXJjZVNldCByc2V0LCBmaW5hbCBJT3ZlcnJpZGVSdW5uYWJsZSBydW5uYWJsZSkgewotCQlmaW5hbCBJUGF0aCBwYWNrYWdlUGF0aCA9IG5ldyBQYXRoKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpKycvJyk7Ci0JCXRyeSB7Ci0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbyA9IChJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8pIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KEJlYW5pbmZvTmF0dXJlLkNPTkZJR19JTkZPX1NFU1NJT05fS0VZKTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCwgc28gd2UgbmVlZCB0byBjcmVhdGUgb3VyIG93biBpbnRlcm5hbCB2ZXJzaW9uIGhlcmUuCi0JCQkJaW5mbyA9IFByb3h5TGF1bmNoU3VwcG9ydC5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8oSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsJCQkJCQotCQkJCUJlYW5pbmZvTmF0dXJlLmNvbXB1dGVCZWFuSW5mb0NvbmZpZ0luZm8oaW5mbyk7Ci0JCQl9Ci0JCQlmaW5hbCBJQmVhbkluZm9Db250cmlidXRvcltdIGV4cGxpY2l0Q29udHJpYnV0b3JzID0gKElCZWFuSW5mb0NvbnRyaWJ1dG9yW10pIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KEJlYW5pbmZvTmF0dXJlLkJFQU5JTkZPX0NPTlRSSUJVVE9SU19TRVNTSU9OX0tFWSk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAob2NGcmFnbWVudHMgPT0gbnVsbCkKLQkJCQkJcHJvY2Vzc0JlYW5JbmZvQ29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsgLy8gV2UgaGF2ZW4ndCBwcm9jZXNzZWQgdGhlbSB5ZXQuCi0JCQl9Ci0KLQkJCWZpbmFsIFNldCB1c2VkUGF0aHMgPSBuZXcgSGFzaFNldCgxMCk7CS8vIFNldCBvZiB1c2VkIHBhdGhzLiBTbyB0aGF0IHRoZSBjb250cmlidXRvcnMgZG9uJ3Qgc3VwcGx5IGEgcGF0aCBhbHJlYWR5IHVzZWQuIFRoaXMgY291bGQgY2F1c2UgcHJvYmxlbXMgaWYgdGhleSBkaWQuCi0JCQlmaW5hbCBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlIGNvbnRyaWJSdW5uYWJsZSA9IG5ldyBJQ29udHJpYnV0b3JPdmVycmlkZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgb3ZlcnJpZGVQYXRoKSB7Ci0JCQkJCWlmICghdXNlZFBhdGhzLmNvbnRhaW5zKG92ZXJyaWRlUGF0aCkpIHsKLQkJCQkJCXVzZWRQYXRocy5hZGQob3ZlcnJpZGVQYXRoKTsKLQkJCQkJCXJ1bm5hYmxlLnJ1bihvdmVycmlkZVBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHJ1bihSZXNvdXJjZSBvdmVycmlkZVJlcykgewotCQkJCQlpZiAoIXVzZWRQYXRocy5jb250YWlucyhvdmVycmlkZVJlcy5nZXRVUkkoKSkpIHsKLQkJCQkJCXVzZWRQYXRocy5hZGQob3ZlcnJpZGVSZXMuZ2V0VVJJKCkpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlydW5uYWJsZS5ydW4ob3ZlcnJpZGVSZXMpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlvdmVycmlkZVJlcy5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZShvdmVycmlkZVJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIGJvb2xlYW4gcGF0aENvbnRyaWJ1dGVkKFN0cmluZyBwYXRoKSB7Ci0JCQkJCXJldHVybiB1c2VkUGF0aHMuY29udGFpbnMocGF0aCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBib29sZWFuIHJlc291cmNlQ29udHJpYnV0ZWQoVVJJIHJlc291cmNlVVJJKSB7Ci0JCQkJCXJldHVybiB1c2VkUGF0aHMuY29udGFpbnMocmVzb3VyY2VVUkkpOwotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCS8vIFJ1biB0aHJvdWdoIHRoZSBjb250YWluZXJzIHRoYXQgaW1wbGVtZW50IElCZWFuSW5mb0NvbnRyaWJ1dG9yLgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5mby5nZXRDb250YWluZXJzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgbWFwRW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKSBtYXBFbnRyeS5nZXRLZXkoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUJlYW5JbmZvQ29udHJpYnV0b3IgJiYgKChCb29sZWFuKSBtYXBFbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJCS8vIFN0YW5kYXJkIHJ1biBsb2dzIHRvIC5sb2cKLQkJCQkJCX0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCSgoSUJlYW5JbmZvQ29udHJpYnV0b3IpIGNvbnRhaW5lcikucnVuT3ZlcnJpZGVzKHBhY2thZ2VQYXRoLCBjbGFzc05hbWUsIGphdmFDbGFzcywgcnNldCwgY29udHJpYlJ1bm5hYmxlKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBSdW4gdGhyb3VnaCB0aGUgZXhwbGljaXQgY29udHJpYnV0b3JzLgotCQkJZm9yIChpbnQgaT0wOyBpPGV4cGxpY2l0Q29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyBTdGFuZGFyZCBydW4gbG9ncyB0byAubG9nCi0JCQkJCX0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQlleHBsaWNpdENvbnRyaWJ1dG9yc1tpaV0ucnVuT3ZlcnJpZGVzKHBhY2thZ2VQYXRoLCBjbGFzc05hbWUsIGphdmFDbGFzcywgcnNldCwgY29udHJpYlJ1bm5hYmxlKTsJCQkJCQkKLQkJCQkJfQotCQkJCX0pOwotCQkJfQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5JTkZPKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRMZWZ0T3ZlcihJUGF0aCBmcmFnbWVudCwgSVBhdGggcGFja2FnZVBhdGgpIHsKLQkJcmV0dXJuIHBhY2thZ2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoZnJhZ21lbnQuc2VnbWVudENvdW50KCkpLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKQotCQkJbG9nZ2VyID0gRWNsaXBzZUxvZ2dlci5nZXRFY2xpcHNlTG9nZ2VyKHRoaXMpOwotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhhdCBhIEJlYW5JbmZvIG5hdHVyZSBpcyBhY3RpdmUuIFRoaXMgaXMgdXNlZCB0byB0ZWxsIGl0IHRvIHNodXRkb3duIHdoZW4gYmVhbmluZm8gc2h1dHMgZG93bi4KLQkgKiBUT0RPIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IEJlYW5JbmZvTmF0dXJlIHNob3VsZCBjYWxsIGl0LiAocHVibGljIGZvciBub3cgYnV0IHdoZW4gd2UgbWFrZQotCSAqIEJlYW5JbmZvTmF0dXJlIGFuIEFQSSBpdCB3aWxsIGJlIG1vdmVkIGludG8gdGhlIHNhbWUgcGFja2FnZSBhcyBCZWFuSW5mb1BsdWdpbikuCi0JICogCi0JICogQHBhcmFtIG5hdHVyZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEJlYW5JbmZvTmF0dXJlKEJlYW5pbmZvTmF0dXJlIG5hdHVyZSkgewotCQlpZiAob3Blbk5hdHVyZXMgPT0gbnVsbCkKLQkJCW9wZW5OYXR1cmVzID0gbmV3IEhhc2hNYXAoKTsKLQkJb3Blbk5hdHVyZXMucHV0KG5hdHVyZS5nZXRQcm9qZWN0KCksIG5hdHVyZSk7Ci0JfQotCQotCS8qKgotCSAqIE1hcmsgdGhhdCBhIEJlYW5JbmZvIG5hdHVyZSBpcyBub3QgYWN0aXZlLiBUaGlzIGlzIHVzZWQgdG8gdGVsbCBpdCB0byBzaHV0ZG93biB3aGVuIGJlYW5pbmZvIHNodXRzIGRvd24uCi0JICogVE9ETyA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugb25seSBCZWFuSW5mb05hdHVyZSBzaG91bGQgY2FsbCBpdC4gKHB1YmxpYyBmb3Igbm93IGJ1dCB3aGVuIHdlIG1ha2UKLQkgKiBCZWFuSW5mb05hdHVyZSBhbiBBUEkgaXQgd2lsbCBiZSBtb3ZlZCBpbnRvIHRoZSBzYW1lIHBhY2thZ2UgYXMgQmVhbkluZm9QbHVnaW4pLgotCSAqIAotCSAqIEBwYXJhbSBuYXR1cmUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVCZWFuSW5mb05hdHVyZShCZWFuaW5mb05hdHVyZSBuYXR1cmUpIHsKLQkJaWYgKG9wZW5OYXR1cmVzICE9IG51bGwpCi0JCQlvcGVuTmF0dXJlcy5yZW1vdmUobmF0dXJlLmdldFByb2plY3QoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCBuYXR1cmUsIGlmIGFueSwgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIHdpbGwgbm90IGNhdXNlIHRoZQotCSAqIG5hdHVyZSB0byBiZSBjcmVhdGVkLgotCSAqIDxwPgotCSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IEJlYW5JbmZvQ2FjaGVDb250cm9sbGVyIHNob3VsZCBhY2Nlc3MgaXQuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIG5hdHVyZSBmb3IgcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlCZWFuaW5mb05hdHVyZSBnZXROYXR1cmUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKEJlYW5pbmZvTmF0dXJlKSBvcGVuTmF0dXJlcy5nZXQocHJvamVjdCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcGVuTmF0dXJlcyAhPSBudWxsICYmICFvcGVuTmF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgbmF0dXJlSXRyID0gb3Blbk5hdHVyZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgbmF0dXJlSXRyLmhhc05leHQoKTspIHsKLQkJCQlCZWFuaW5mb05hdHVyZSBuYXR1cmUgPSAoQmVhbmluZm9OYXR1cmUpIG5hdHVyZUl0ci5uZXh0KCk7Ci0JCQkJbmF0dXJlLnNodXRkb3duKCk7Ci0JCQl9Ci0JCX0KLQkJCQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuaW5mb1JlZ2lzdHJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9SZWdpc3RyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNTBjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9CZWFuaW5mb1JlZ2lzdHJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvUmVnaXN0cmF0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIHJlZ2lzdGVyZWQgYmVhbmluZm9zIGluIHRoZSBCZWFuaW5mb1BsdWdpbi4KLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEJlYW5pbmZvUmVnaXN0cmF0aW9uIHsKLQkKLQlwcm90ZWN0ZWQgQmVhbmluZm9zRG9jIGRvYzsKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhcmlhYmxlRWxlbWVudDsJLy8gVGhpcyBpcyB1c2VkIHRvIGdldCBjb250cmlidXRvciBlbGVtZW50LiBJZiBudWxsLCB0aGVuIG5vIGNvbnRyaWJ1dG9yLgotCQotCXB1YmxpYyBCZWFuaW5mb1JlZ2lzdHJhdGlvbigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBCZWFuaW5mb3NEb2MKLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9SZWdpc3RyYXRpb24oQmVhbmluZm9zRG9jIGRvYykgewotCQl0aGlzLmRvYyA9IGRvYzsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBCZWFuaW5mb3NEb2MgYW5kIHZhcmlhYmxlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIEJlYW5pbmZvUmVnaXN0cmF0aW9uKEJlYW5pbmZvc0RvYyBkb2MsIElDb25maWd1cmF0aW9uRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQpIHsKLQkJdGhpcy5kb2MgPSBkb2M7Ci0JCXRoaXMudmFyaWFibGVFbGVtZW50ID0gdmFyaWFibGVFbGVtZW50OwotCX0JCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb2MuCi0JICogQHJldHVybiBSZXR1cm5zIGEgQmVhbmluZm9zRG9jCi0JICovCi0JcHVibGljIEJlYW5pbmZvc0RvYyBnZXREb2MoKSB7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jLgotCSAqIEBwYXJhbSBkb2MgVGhlIGRvYyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2MoQmVhbmluZm9zRG9jIGRvYykgewotCQl0aGlzLmRvYyA9IGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YXJpYWJsZUVsZW1lbnQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRWYXJpYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFyaWFibGVFbGVtZW50LgotCSAqIEBwYXJhbSB2YXJpYWJsZUVsZW1lbnQgVGhlIHZhcmlhYmxlRWxlbWVudCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHZhcmlhYmxlRWxlbWVudCkgewotCQl0aGlzLnZhcmlhYmxlRWxlbWVudCA9IHZhcmlhYmxlRWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0JlYW5pbmZvc0RvYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9zRG9jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjI5OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQmVhbmluZm9zRG9jLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbmluZm9zRG9jLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotLyoqCi0gKiBCZWFuaW5mb3MgZG9jdW1lbnQgaW4tbWVtb3J5IGZvcm1hdC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9zRG9jIGltcGxlbWVudHMgSUJlYW5pbmZvc0RvY0VudHJ5IHsKLQotCXByb3RlY3RlZCBJQmVhbmluZm9zRG9jRW50cnlbXSBzZWFyY2hwYXRoOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBzRXhwb3J0ZWQgPSAiZXhwb3J0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIHNLaW5kID0gImtpbmQiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIHNQYXRoID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQmVhbmluZm9zRG9jKCkgewotCX0KLQotCXB1YmxpYyBCZWFuaW5mb3NEb2MoSUJlYW5pbmZvc0RvY0VudHJ5W10gc2VhcmNocGF0aCkgewotCQl0aGlzLnNlYXJjaHBhdGggPSBzZWFyY2hwYXRoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIC0xOwkvLyBOLkEuCi0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gbnVsbDsJLy8gTi5BLgotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvc0RvYyByZWFkRW50cnkoSVJlYWRlciByZWFkZXIsIE9iamVjdCByb290LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFycmF5TGlzdCBwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IGNoaWxkcmVuID0gcmVhZGVyLmdldENoaWxkcmVuKHJvb3QpOwotCQlpbnQgY2hpbGRyZW5MZW5ndGggPSByZWFkZXIuZ2V0TGVuZ3RoKGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSByZWFkZXIuZ2V0SXRlbShjaGlsZHJlbiwgaSk7Ci0JCQlpZiAocmVhZGVyLmlzTm9kZVR5cGVFbGVtZW50KGNoaWxkKSkgewotCQkJCU9iamVjdCBlbnRyeSA9IG51bGw7Ci0JCQkJaWYgKHJlYWRlci5nZXROb2RlTmFtZShjaGlsZCkuZXF1YWxzSWdub3JlQ2FzZShCZWFuaW5mb0VudHJ5LnNCZWFuaW5mbykpIHsKLQkJCQkJZW50cnkgPSBCZWFuaW5mb0VudHJ5LnJlYWRFbnRyeShyZWFkZXIsIGNoaWxkLCBwcm9qZWN0KTsKLQkJCQl9IGVsc2UgaWYgKHJlYWRlci5nZXROb2RlTmFtZShjaGlsZCkuZXF1YWxzSWdub3JlQ2FzZShTZWFyY2hwYXRoRW50cnkuc1NlYXJjaHBhdGgpKSB7Ci0JCQkJCWVudHJ5ID0gU2VhcmNocGF0aEVudHJ5LnJlYWRFbnRyeShyZWFkZXIsIGNoaWxkLCBwcm9qZWN0LCBmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChlbnRyeSAhPSBudWxsKQotCQkJCQlwYXRocy5hZGQoZW50cnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgQmVhbmluZm9zRG9jKChJQmVhbmluZm9zRG9jRW50cnlbXSkgcGF0aHMudG9BcnJheShuZXcgSUJlYW5pbmZvc0RvY0VudHJ5W3BhdGhzLnNpemUoKV0pKTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5pbmZvc0RvY0VudHJ5W10gZ2V0U2VhcmNocGF0aCgpIHsKLQkJcmV0dXJuIHNlYXJjaHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VhcmNocGF0aChJQmVhbmluZm9zRG9jRW50cnlbXSBzZWFyY2hwYXRoKSB7Ci0JCXRoaXMuc2VhcmNocGF0aCA9IHNlYXJjaHBhdGg7Ci0JfQotCi0JcHVibGljIE5vZGUgd3JpdGVFbnRyeShEb2N1bWVudCBkb2MsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoU2VhcmNocGF0aEVudHJ5LnNTZWFyY2hwYXRoKTsgLy8gQ3JlYXRlIFJvb3QgRWxlbWVudAotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXJvb3QuYXBwZW5kQ2hpbGQoc2VhcmNocGF0aFtpXS53cml0ZUVudHJ5KGRvYywgcHJvamVjdCkpOyAvLyBBZGQgdG8gdGhlIGRvY3VtZW50Ci0JCX0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQ29uZmlndXJhdGlvbkVsZW1lbnRSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0NvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDBiZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvQ29uZmlndXJhdGlvbkVsZW1lbnRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBDb25maWd1cmF0aW9uRWxlbWVudFJlYWRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotCi0KLS8qKgotICogRm9yIHJlYWRpbmcgZnJvbSBJQ29uZmlndXJhdGlvbkVsZW1lbnRzCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLWNsYXNzIENvbmZpZ3VyYXRpb25FbGVtZW50UmVhZGVyIGltcGxlbWVudHMgSVJlYWRlciB7Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZHJlbihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG5vZGUpLmdldENoaWxkcmVuKCkgOiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVhZGVyI2dldExlbmd0aChPYmplY3QpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoT2JqZWN0IG5vZGVMaXN0KSB7Ci0JCXJldHVybiAobm9kZUxpc3QgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgPyBBcnJheS5nZXRMZW5ndGgobm9kZUxpc3QpIDogMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXRJdGVtKE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SXRlbShPYmplY3Qgbm9kZUxpc3QsIGludCBpbmRleCkgewotCQlyZXR1cm4gKG5vZGVMaXN0IGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pID8gQXJyYXkuZ2V0KG5vZGVMaXN0LCBpbmRleCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVhZGVyI2lzTm9kZVR5cGVFbGVtZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vZGVUeXBlRWxlbWVudChPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlYWRlciNnZXROb2RlTmFtZShPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZShPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG5vZGUpLmdldE5hbWUoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWFkZXIjZ2V0QXR0cmlidXRlKE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpID8gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQpLmdldEF0dHJpYnV0ZUFzSXMoYXR0cmlidXRlTmFtZSkgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5JbmZvQ29udHJpYnV0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuSW5mb0NvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjk5NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5JbmZvQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElCZWFuSW5mb0NvbnRyaWJ1dG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjggJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotIAotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIEJlYW5JbmZvIGNvbnRyaWJ1dG9ycy4gU3VwcGxpZWQgZWl0aGVyIGFzIGFkZGl0aW9uYWwgaW50ZXJmYWNlIG9uIGEgSUNsYXNzcGF0aENvbnRhaW5lciwgb3IgYXMKLSAqIGFuIGV4cGxpY2l0IGNvbnRyaWJ1dG9yIGZvciBCZWFuSW5mb3MgZnJvbSB0aGUgbWFuaWZlc3QgZmlsZXMuCi0gKiA8cD4KLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhbGxvd3MgYSBkeW5hbWljIHN1cHBseSBvZiBCZWFuSW5mbyBjb250cmlidXRpb25zIChiZWFuaW5mbyBqYXJzIGFuZCBzZWFyY2ggcGF0aHMpCi0gKiBhbmQgb3ZlcnJpZGUgZmlsZXMuIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBkZWZhdWx0IHBsdWdpbiBleHRlbnNpb24gbWVjaGFuaXNtIGlzIHRvbyBzdGF0aWMgZm9yIHRoZSByZXF1aXJlbWVudHMuIAotICogPHA+Ci0gKiBUaGVyZSBpcyBhIHZlcnkgdXNlZnVsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKDxjb2RlPkJlYW5JbmZvQ29udHJpYnV0b3JBZGFwdGVyPC9jb2RlPikgdGhhdCBjYW4gYmUgc3ViY2xhc3NlZC4gVGhlCi0gKiBkZWZhdWx0IGRvZXNuJ3QgZG8gYW55dGhpbmcgb24gaXRzIG93bi4gQnV0IGl0IGRvZXMgaGF2ZSBhIHZlcnkgdXNlZnVsIHV0aWxpdHkgbWV0aG9kIGZvciBsb2FkaW5nIHJlc291cmNlcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuSW5mb0NvbnRyaWJ1dG9yQWRhcHRlcgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5JbmZvQ29udHJpYnV0b3IgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgQmVhbkluZm9FbnRyeSBjb250cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IEJlYW5JbmZvIHdoZW4gaXQgZGV0ZXJtaW5lcyB0aGF0IHRoaXMgY29udHJpYnV0b3IgaXMgYXBwbGljYWJsZSAKLQkgKiBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCBiZWluZyBwcm9jZXNzZWQuIEJlYW5pbmZvRW50cnkncyBkZWZpbmUgdGhlIEJlYW5JbmZvIGphcnMgYW5kIHNlYXJjaCBwYXRocyB0byB1c2UuCi0JICogCi0JICogQHBhcmFtIGluZm8KLQkgKiBAcmV0dXJuIEJlYW5JbmZvIGNvbnRyaWJ1dGlvbnMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB0byBjb250cmlidXRlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBCZWFuaW5mb0VudHJ5W10gZ2V0QmVhbkluZm9FbnRyeUNvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGluZm8pOwotCQotCS8qKgotCSAqIEZvciB0aGUgZ2l2ZW4gcGFja2FnZSBwYXRoIHJ1biB0aGUgb3ZlcnJpZGUgY29udHJpYnV0aW9ucyB0aHJvdWdoIHRoZSBydW5uYWJsZS4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IEJlYW5JbmZvIHdoZW4gaXQgZGV0ZXJtaW5lcyB0aGF0IHRoaXMKLQkgKiBjb250cmlidXRvciBpcyBhcHBsaWNhYmxlIGZvciB0aGUgY3VycmVudCBwcm9qZWN0IGJlaW5nIHByb2Nlc3NlZC4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBjYWxsIHRoZSBydW5uYWJsZSAodGhlIGFyZ3VtZW50IDxjb2RlPnJ1bm5hYmxlPC9jb2RlPikgZm9yIGVhY2ggb3ZlcnJpZGUgZmlsZSB0aGF0IGlzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGluY29taW5nIGNsYXNzLgotCSAqIFlvdSBjYW4gZWl0aGVyIGNhbGwgdGhlIHJ1biBtZXRob2QgdGhhdCBwYXNzZXMgaW4gYSBzdHJpbmcgcG9pbnRpbmcgdG8gYSBkaXJlY3Rvcnkgd2hlcmUgeW91ciBvdmVycmlkZSBmaWxlIGlzCi0JICogbG9jYXRlZCAoaS5lLiA8Y29kZT5vdmVycmlkZUZpbGVOYW1lLm92ZXJyaWRlPC9jb2RlPiB3aGVyZSAib3ZlcnJpZGVGaWxlTmFtZSIgaXMgdGhlIG5hbWUgcGFzc2VkLiBPciB5b3UgY2FuIGNhbGwgdGhlIHJ1biBtZXRob2QgdGhhdCAKLQkgKiB0YWtlcyBhIFJlc291cmNlIHRoYXQgaXMgYWxyZWFkeSBsb2FkZWQgKGFuZCBtYXliZSBtb2RpZmllZCBvciBjcmVhdGVkIGxvY2FsbHkpLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrYWdlUGF0aAotCSAqIEBwYXJhbSBvdmVycmlkZUZpbGVOYW1lIHRoZSBvdmVycmlkZUZpbGVOYW1lIHRoYXQgdGhlIG92ZXJyaWRlcyBpcyBmb3IuIFRoaXMgY2FuIGJlIHVzZWQgaW4gdmVyeSBzcGVjaWFsIGNhc2VzIHRvIHByb3ZpZGUgCi0JICogZXhhY3Qgb3ZlcnJpZGUgZmlsZXMgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBwYXRoIGJlIHNlYXJjaGVkLiBBbiBleGFtcGxlIHdvdWxkIGJlIGZvciBwcm92aWRpbmcgYSBmaWxlIHRoYXQgaXNuJ3QgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MuCi0JICogQSB2ZXJ5IHNwZWNpYWwgY2FzZSBpcyA8Y29kZT5ST09UPC9jb2RlPi4gVGhpcyBpcyB1c2VkIHdoZW4gYXNraW5nIHRvIGFwcGx5IHJvb3Qgb3ZlcnJpZGVzIHRvIGNsYXNzZXMgdGhhdCBoYXZlIG5vIAotCSAqIHN1cGVyIHR5cGUuIAotCSAqIEBwYXJhbSBqYXZhQ2xhc3MgdGhlIGphdmEgY2xhc3MgdGhhdCB0aGUgb3ZlcnJpZGVzIHdpbGwgYmUgYXBwbGllZCB0by4gTm90ZTogRG8gbm90IGNhbGwgYW55IHByb3BlcnR5LCBmZWF0dXJlcywgZXZlbnRzLCBvciBvcGVyYXRpb25zIGNhbGxzCi0JICogb3IgYW55IHByb3BlcnR5LCBldmVudHMsIG9yIG9wZXJhdGlvbnMgVXRpbGl0aWVzIGFnYWluc3QgdGhpcyBjbGFzcy4gVGhhdCBpcyBiZWNhdXNlIHRoaXMgY2xhc3MgaXMgYmVpbmcgaW50cm9zcGVjdGVkIGF0IHRoaXMgdGltZQotCSAqIGFuZCB0aG9zZSBjYWxscyB3aWxsIHJldHVybiBpbnZhbGlkIHZhbHVlcyBpZiBjYWxsZWQgYXQgdGhpcyBwb2ludCBzaW5jZSBpbnRyb3NwZWN0aW9uIGlzIG5vdCB5ZXQgY29tcGxldGUuIAotCSAqIEBwYXJhbSByZXNvdXJjZSBzZXQgdGhhdCBjb250cmlidXRvcnMgY2FuIHVzZSB0byB0ZW1wb3JhcmlseSBsb2FkIGR5bmFtaWMgb3ZlcnJpZGUgZmlsZXMuCi0JICogQHBhcmFtIHJ1bm5hYmxlIHRoZSBydW5uYWJsZSB0aGF0IHlvdSBjYWxsIHRvIGFjdHVhbGx5IGFwcGx5IHRoZSBvdmVycmlkZSBmaWxlcy4KLQkgKiAKLQkgKiBAc2VlIEJlYW5pbmZvUGx1Z2luI1JPT1QKLQkgKiBAc2VlIEJlYW5pbmZvUGx1Z2luI09WRVJSSURFX0VYVEVOU0lPTgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bk92ZXJyaWRlcyhJUGF0aCBwYWNrYWdlUGF0aCwgU3RyaW5nIG92ZXJyaWRlRmlsZU5hbWUsIEphdmFDbGFzcyBqYXZhQ2xhc3MsIFJlc291cmNlU2V0IHJzZXQsIEJlYW5pbmZvUGx1Z2luLklDb250cmlidXRvck92ZXJyaWRlUnVubmFibGUgcnVubmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvU3VwcGxpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuaW5mb1N1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDY5ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvU3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJQmVhbmluZm9TdXBwbGllci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA5LzEzIDIwOjMwOjQ2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci0vKioKLSAqIEludGVyZmFjZSB0byBzdXBwbHkgaW5mb3JtYXRpb24gZm9yIGJlYW5pbmZvIHRvIGRlY291cGxlCi0gKiB0aGUgaW50cm9zcGVjdGlvbiBmcm9tIHRoZSBkZXNrdG9wLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5pbmZvU3VwcGxpZXIgewotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJuIHRoZSByZWdpc3RyeSB0byB1c2UuIEluaXRpYWxpemUgaXQgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7Ci0JCi0JLyoqCi0JICogVXNlZCB0byBrbm93IGlmIHdlIGN1cnJlbnRseSBoYXZlIGEgcmVnaXN0cnkgY3JlYXRlZCBpbiB0aGUgc3VwcGxpZXIuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVnaXN0cnkgY3VycmVudGx5IGluIHRoZSBzdXBwbGllci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdHJ5Q3JlYXRlZCgpOwotCQotCS8qKgotCSAqIENsb3NlIHRoZSByZWdpc3RyeS4gVGhpcyB0ZWxscyB0aGUgcmVnaXN0cnkgdG8gY2xvc2UuIFRoaXMgaXMgbmVjZXNzYXJ5Ci0JICogYXQgdGltZXMgYmVjYXVzZSBvZiBjaGFuZ2VzIHRvIGNsYXNzZXMgcmVxdWlyZSB0aGUgcmVnaXN0cnkgdG8gYmUKLQkgKiByZWNvbnN0cnVjdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlUmVnaXN0cnkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2plY3QgdGhhdCB0aGlzIHN1cHBsaWVyIGlzIGZvci4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVzb3VyY2Ugc2V0IGJhc2VkIHVwb24gdGhlIGN1cnJlbnQgcHJvamVjdC4gVGhpcyByZXNvdXJjZSBzZXQgaXMgaG9va2VkIGludG8gdGhlCi0JICogcHJvamVjdCdzIHJlc291cmNlIHNldCBzbyB0aGF0IGFueSBzZWFyY2hlcyBmb3IgamF2YSBjbGFzc2VzLgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgcmVzb3VyY2Ugc2V0IHRoYXQgaXMgaG9va2VkIGludG8gdGhlIHByb2plY3QncyBqYXZhIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0IGdldE5ld1Jlc291cmNlU2V0KCk7Ci0JCi0JLyoqCi0JICogVGhlIHByb2plY3QgcmVzb3VyY2Ugc2V0IGZvciB0aGlzIHN1cHBsaWVyLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UHJvamVjdFJlc291cmNlU2V0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0lCZWFuaW5mb3NEb2NFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvc0RvY0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWRhZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSUJlYW5pbmZvc0RvY0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUJlYW5pbmZvc0RvY0VudHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjggJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBET00gRG9jIHdyaXRhYmxlIGVudHJpZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmVhbmluZm9zRG9jRW50cnkgewotCXB1YmxpYyBOb2RlIHdyaXRlRW50cnkoRG9jdW1lbnQgZG9jLCBJUHJvamVjdCBwcm9qZWN0KTsKLQkKLQlwdWJsaWMgaW50IGdldEtpbmQoKTsKLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM5M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL0luaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJbml0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjggJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mby5JSW50cm9zcGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLS8qKgotICogU3RhdGljIGluaXRpYWxpemVyIGNsYXNzIHRvIGluaXRpYWxpemUgdGhlIGJlYW5pbmZvIHN0dWZmLgotICogSXQgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGRlc2t0b3AgYW5kIHNvIGRvZXNuJ3QgcmVxdWlyZSBpdC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSW5pdCB7Ci0JCi0JLy8gU28gaXQgY2FuJ3QgYmUgaW5zdGFudGlhdGVkLgotCXByaXZhdGUgSW5pdCgpIHsKLQl9OwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCB3aXRoIGFuIElCZWFuaW5mb1N1cHBsaWVyLCB1c2VkIHRvIHNldCB1cCB0aGUKLQkgKiBpbnRyb3NwZWN0aW9uIHByb2Nlc3MuIAotCSAqCi0JICogVGhlIGJlYW5pbmZvIHN1cHBsaWVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRoZSBiZWFuIGluZm8gc2VhcmNoIHBhdGgsCi0JICogaW5jbHVkaW5nIHJlbW92aW5nIHRoZSBzdW4gYmVhbmluZm9zLCBpZiBkZXNpcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKFJlc291cmNlU2V0IHJzZXQsIGZpbmFsIElCZWFuaW5mb1N1cHBsaWVyIHN1cHBsaWVyKSB7Ci0JCXJzZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgQmVhbmluZm9BZGFwdGVyRmFjdG9yeShzdXBwbGllcikpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHJlZ2lzdHJ5IG5vdyB0aGF0IGl0IGlzIGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkvLyBSZW1vdmUgdGhlICJzdW4uYmVhbnMuaW5mbyIgZnJvbSB0aGUgYmVhbmluZm8gc2VhcmNoIHBhdGggYmVjYXVzZQotCQkvLyB3ZSBjb21wbGV0ZWx5IG92ZXJyaWRlIHRoZSBzdW4gYmVhbiBpbmZvcy4KLQkJVXRpbGl0aWVzLnJlbW92ZUJlYW5JbmZvUGF0aChyZWdpc3RyeSwgInN1bi5iZWFucy5pbmZvcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2xlYW51cCBmcm9tIHRoZSBjb250ZXh0IGJlY2F1c2Ugd2UgYXJlIGJlaW5nIHJlbW92ZWQuCi0JICogSWYgY2xlYXJSZXN1bHRzIGlzIHRydWUsIHRoZW4gdGhlIGZhY3Rvcnkgc2hvdWxkIGNsZWFyIHRoZSByZXN1bHRzIG9mIGludHJvc3BlY3Rpb24KLQkgKiBmcm9tIHRoZSBldmVyeXRoaW5nIGJlY2F1c2UgdGhlIGNvbnRleHQgd2lsbCBzdGlsbCBiZSBhcm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoUmVzb3VyY2VTZXQgcnNldCwgYm9vbGVhbiBjbGVhclJlc3VsdHMpIHsKLQkJQmVhbmluZm9BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0KLQkJCShCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5KSBFY29yZVV0aWwuZ2V0QWRhcHRlckZhY3RvcnkocnNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCksIElJbnRyb3NwZWN0aW9uQWRhcHRlci5BREFQVEVSX0tFWSk7Ci0JCXJzZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLnJlbW92ZShmYWN0b3J5KTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCWZhY3RvcnkuY2xvc2VBbGwoY2xlYXJSZXN1bHRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL1NlYXJjaHBhdGhFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvU2VhcmNocGF0aEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODBlMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvU2VhcmNocGF0aEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFNlYXJjaHBhdGhFbnRyeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy4qOwotCi0vKioKLSAqIFNlYXJjaHBhdGggZW50cnkuIEJlYW5pbmZvIHNlYXJjaHBhdGggZW50cnkgKGkuZS4gcGFja2FnZSBuYW1lKS4gQ2FuIGluY2x1ZGUKLSAqIGtpbmQvcGF0aC9leHBvcnRlZCBpZiBub3QgYSBjaGlsZCBvZiB0aGUgQmVhbmluZm9FbnRyeS4KLSAqIAotICogTm90ZTogaWYgbm90IGEgY2hpbGQgb2YgYSBCZWFuSW5mb0VudHJ5LCB0aGVuIHRoZSBwYXRoIHJlZmVycyB0byBhIHBhY2thZ2UKLSAqIGluIHRoZSBjbGFzc3BhdGgsIHNvIGNvbnRhaW5lciBpcyBzdXBwb3J0ZWQgaGVyZS4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNocGF0aEVudHJ5IGltcGxlbWVudHMgSUJlYW5pbmZvc0RvY0VudHJ5IHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgc1NlYXJjaHBhdGggPSAic2VhcmNocGF0aCI7IC8vIFNlYXJjaHBhdGggZW50cnksIHNoYXJlZCB3aXRoIEJlYW5pbmZvc0RvYy4gLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgc1BhY2thZ2UgPSAicGFja2FnZSI7IC8vIFBhY2thZ2UgbmFtZS4gLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVhZCB0aGUgZW50cnkgaW4gZnJvbSB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaHBhdGhFbnRyeSByZWFkRW50cnkoSVJlYWRlciByZWFkZXIsIE9iamVjdCBlbGVtZW50LCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGJlYW5pbmZvQ2hpbGQpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LCBzUGFja2FnZSk7Ci0JCWlmIChiZWFuaW5mb0NoaWxkKQotCQkJcmV0dXJuIG5ldyBTZWFyY2hwYXRoRW50cnkocGFja2FnZU5hbWUpOyAvLyBLaW5kL3BhdGggYXJlbid0IHZhbGlkIG9uIGJlYW5pbmZvIGNoaWxkcmVuLgotCi0JCVN0cmluZyBlbGVtZW50S2luZCA9IHJlYWRlci5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgQmVhbmluZm9zRG9jLnNLaW5kKTsKLQkJU3RyaW5nIHBhdGhTdHIgPSByZWFkZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIEJlYW5pbmZvc0RvYy5zUGF0aCk7Ci0JCWludCBraW5kID0gQmVhbmluZm9FbnRyeS5raW5kRnJvbVN0cmluZyhlbGVtZW50S2luZCk7CQkKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWlmIChwYXRoU3RyICE9IG51bGwpIHsKLQkJCS8vIGVuc3VyZSBwYXRoIGlzIGFic29sdXRlCi0JCQlwYXRoID0gbmV3IFBhdGgocGF0aFN0cik7Ci0JCQlpZiAoa2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIGtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYgIXBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJcGF0aCA9IHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocGF0aCkgOiBwYXRoLm1ha2VBYnNvbHV0ZSgpOyAvLyBTb21lIGZvbGRlci9qYXIgd2l0aGluIHRoaXMgcHJvamVjdAotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBlbnRyeQotCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQkJc3dpdGNoIChraW5kKSB7Ci0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQl2YWxpZCA9IHBhdGggIT0gbnVsbCAmJiBwYXRoLmlzQWJzb2x1dGUoKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkJdmFsaWQgPSBmYWxzZTsKLQkJCQllbHNlIGlmIChwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCQkvLyBtdXN0IGJlIGFuIGVudHJ5IGluIHRoaXMgcHJvamVjdCBvciBzcGVjaWZ5IGFub3RoZXIgcHJvamVjdAotCQkJCQlTdHJpbmcgcHJvalNlZ21lbnQgPSBwYXRoLnNlZ21lbnQoMCk7Ci0JCQkJCWlmIChwcm9qZWN0ID09IG51bGwgfHwgcHJvalNlZ21lbnQgPT0gbnVsbCB8fCAhcHJvalNlZ21lbnQuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkgewotCQkJCQkJLy8gYW5vdGhlciBwcm9qZWN0Ci0JCQkJCQlraW5kID0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoJCQkJCi0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCXZhbGlkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodmFsaWQpCi0JCQlyZXR1cm4gbmV3IFNlYXJjaHBhdGhFbnRyeShraW5kLCBwYXRoLCBwYWNrYWdlTmFtZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJvdGVjdGVkIGludCBraW5kID0gLTE7IC8vIFVuZGVyIEJlYW5pbmZvIGVudHJ5LCB0aGVzZSBkb24ndCBoYXZlIGtpbmQvcGF0aCdzLgotCXByb3RlY3RlZCBJUGF0aCBwYXRoOwkvLyBQYXRoIGNhbiBiZSBudWxsIGlmIHVuZGVyIGJlYW5pbmZvIGVudHJ5Ci0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlTmFtZTsJLy8gUGFja2FnZW5hbWUgY2FuIGJlIG51bGwgaWYga2luZC9wYXRoIHJlZmVyIHRvIGEgcHJvamVjdCBvciByZWdpc3RlcmVkIHZhcmlhYmxlLgotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwb3J0ZWQ7Ci0KLQlwdWJsaWMgU2VhcmNocGF0aEVudHJ5KGludCBraW5kLCBJUGF0aCBwYXRoLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJdGhpcy5raW5kID0ga2luZDsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCX0KLQotCXB1YmxpYyBTZWFyY2hwYXRoRW50cnkoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gcGFja2FnZU5hbWU7Ci0JfQotCi0JcHVibGljIE5vZGUgd3JpdGVFbnRyeShEb2N1bWVudCBkb2MsIElQcm9qZWN0IHByb2plY3QpIHsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChzU2VhcmNocGF0aCk7Ci0JCWlmIChraW5kICE9IC0xKSB7Ci0JCQkvLyBBIG5vbi1iZWFuaW5mbyBjaGlsZAotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoQmVhbmluZm9zRG9jLnNLaW5kLCBCZWFuaW5mb0VudHJ5LmtpbmRUb1N0cmluZyhraW5kKSk7Ci0JCQlJUGF0aCB0UGF0aCA9IHBhdGg7Ci0JCQlpZiAoa2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIGtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQkvLyB0cmFuc2xhdGUgdG8gcHJvamVjdCByZWxhdGl2ZSBmcm9tIGFic29sdXRlICh1bmxlc3MgYSBkZXZpY2UgcGF0aCkKLQkJCQlpZiAodFBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCWlmICh0UGF0aC5zZWdtZW50KDApLmVxdWFscyhwcm9qZWN0LmdldEZ1bGxQYXRoKCkuc2VnbWVudCgwKSkpIHsKLQkJCQkJCXRQYXRoID0gdFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJCXRQYXRoID0gdFBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0UGF0aCA9IHRQYXRoLm1ha2VBYnNvbHV0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQllbGVtZW50LnNldEF0dHJpYnV0ZShCZWFuaW5mb3NEb2Muc1BhdGgsIHRQYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsKQotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoc1BhY2thZ2UsIHBhY2thZ2VOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlYXJjaHBhdGhFbnRyeSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCi0JCVNlYXJjaHBhdGhFbnRyeSBvdGhlckVudHJ5ID0gKFNlYXJjaHBhdGhFbnRyeSkgb3RoZXI7Ci0JCWlmIChraW5kICE9IG90aGVyRW50cnkua2luZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJaWYgKG90aGVyRW50cnkucGF0aCAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQk7Ci0JCWVsc2UgaWYgKCFwYXRoLmVxdWFscyhvdGhlckVudHJ5LnBhdGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKQotCQkJaWYgKG90aGVyRW50cnkucGFja2FnZU5hbWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJOwotCQllbHNlIGlmICghcGFja2FnZU5hbWUuZXF1YWxzKG90aGVyRW50cnkucGFja2FnZU5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaENvZGUgPSBraW5kOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQkJaGFzaENvZGUgXj0gcGF0aC5oYXNoQ29kZSgpOwotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkKLQkJCWhhc2hDb2RlIF49IHBhY2thZ2VOYW1lLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBoYXNoQ29kZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL1V0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjY0M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvcmUvVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFV0aWxpdGllcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI4ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvUHJveHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIEJlYW5pbmZvIChpbnRyb3NwZWN0aW9uKSB1dGlsaXRpZXMgbWV0aG9kcwotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsaXRpZXMgewotCQotCXByaXZhdGUgVXRpbGl0aWVzKCkgewotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0dXJuIHRoZSBjbGFzcyBhcyBhIEphdmFDbGFzcy4gSWYgaXQgYWN0dWFsbHkgaXMgYSBKYXZhVHlwZSB0aGlzIHdpbGwKLQkgKiBmYWlsIHdpdGggYSBDbGFzc0Nhc3RFeGNlcHRpb24uCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSByc2V0Ci0JICogQHJldHVybiBqYXZhIGNsYXNzCi0JICogCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgbm90IGEgamF2YSBjbGFzcywgYnV0IGluc3RlYWQgYSBqYXZhIHByaW1pdGl2ZS4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgUmVzb3VyY2VTZXQgcnNldCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgZ2V0SmF2YVR5cGUoY2xhc3NOYW1lLCByc2V0KTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXR1cm4gdGhlIGNsYXNzIGFzIGEgSmF2YUhlbHBlcnMuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSByc2V0Ci0JICogQHJldHVybiBqYXZhIGhlbHBlcnMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRKYXZhVHlwZShTdHJpbmcgY2xhc3NOYW1lLCBSZXNvdXJjZVNldCByc2V0KSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIHJzZXQuZ2V0RU9iamVjdChnZXRKYXZhQ2xhc3NVUkkoY2xhc3NOYW1lKSwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIFVSSSB0byB0aGUgZ2l2ZW4gY2xhc3NuYW1lLgotCSAqIDxwPgotCSAqIE5vdGU6IEl0IG11c3QgYmUgaW4gbm9ybWFsIGZvcm0sIGkuZS4gZnVsbHktcXVhbGlmaWVkLCBpZiBwcmltaXRpdmUgc3BlbGxlZCBvdXQgKGUuZy4gImludCIgbm90IEkpLCBhbmQgaWYKLQkgKiBhcnJheXMgaXQgbXVzdCByZWFkYWJsZSBmb3JtIChlLmcuICJuZXcgamF2YS5sYW5nLlN0cmluZ1tdIiBhbmQgbm90ICJbTGphdmEubGFuZy5TdHJpbmc7IikuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRKYXZhQ2xhc3NVUkkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgobmV3IEphdmFVUkwoY2xhc3NOYW1lKSkuZ2V0RnVsbFN0cmluZygpKTsKLQl9Ci0KLQkvKiogCi0JICogVXRpbGl0eSB0byByZXR1cm4gdGhlIEVDbGFzc2lmaWVyIGZyb20gdGhlIGdpdmVuIElCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUNsYXNzaWZpZXIgZ2V0SmF2YUNsYXNzKElCZWFuVHlwZVByb3h5IHR5cGUsIFJlc291cmNlU2V0IHJzZXQpIHsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEphdmFUeXBlKHR5cGUuZ2V0Rm9ybWFsVHlwZU5hbWUoKSwgcnNldCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXR1cm4gdGhlIE1ldGhvZCBmcm9tIHRoZSBnaXZlbiBJTWV0aG9kUHJveHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKElNZXRob2RQcm94eSBtZXRob2QsIFJlc291cmNlU2V0IHJzZXQpIHsKLQkJcmV0dXJuIG1ldGhvZCAhPSBudWxsID8gKE1ldGhvZCkgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoZ2V0TWV0aG9kVVJMKG1ldGhvZCkpLCB0cnVlKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBVUkwgU3RyaW5nIGZvciBNZXRob2QgZnJvbSB0aGUgZ2l2ZW4gSU1ldGhvZFByb3h5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0aG9kVVJMKElNZXRob2RQcm94eSBtZXRob2QpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGhvZC5nZXRDbGFzc1R5cGUoKS5nZXRUeXBlTmFtZSgpOwotCQlJQmVhblR5cGVQcm94eVtdIHBhcm1zID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCVN0cmluZ1tdIHBhcm1UeXBlcyA9IHBhcm1zLmxlbmd0aCA+IDAgPyBuZXcgU3RyaW5nW3Bhcm1zLmxlbmd0aF0gOiBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXJtVHlwZXNbaV0gPSBwYXJtc1tpXS5nZXRGb3JtYWxUeXBlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBjb21wdXRlTWV0aG9kVVJMKGNsYXNzTmFtZSwgbWV0aG9kLmdldE5hbWUoKSwgcGFybVR5cGVzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZFVSTChTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtVHlwZXMpIHsKLQkJaW50IGNsYXNzU3RhcnQgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcig1MCk7Ci0JCXVybC5hcHBlbmQoImphdmE6LyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjbGFzc1N0YXJ0ID4gLTEpCi0JCQl1cmwuYXBwZW5kKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc1N0YXJ0KSk7Ci0JCXVybC5hcHBlbmQoJyMnKTsKLQkJdXJsLmFwcGVuZChjb21wdXRlTWV0aG9kSUQoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzU3RhcnQgKyAxKSwgbWV0aG9kTmFtZSwgcGFybVR5cGVzKSk7Ci0JCXJldHVybiB1cmwudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29tcHV0ZUZpZWxkVVJMKFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlpbnQgY2xhc3NTdGFydCA9IGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCVN0cmluZ0J1ZmZlciB1cmwgPSBuZXcgU3RyaW5nQnVmZmVyKDUwKTsKLQkJdXJsLmFwcGVuZCgiamF2YTovIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNsYXNzU3RhcnQgPiAtMSkKLQkJCXVybC5hcHBlbmQoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzU3RhcnQpKTsKLQkJdXJsLmFwcGVuZCgnIycpOwotCQl1cmwuYXBwZW5kKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc1N0YXJ0ICsgMSkpOwotCQl1cmwuYXBwZW5kKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCXVybC5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmV0dXJuIHVybC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpZWxkIHVyaSBmb3IgdGhlIGdpdmVuIGNsYXNzbmFtZSwgZmllbGRuYW1lLgotCSAqIEBwYXJhbSBmdWxseVF1YWxpZmllZENsYXNzTmFtZQotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0RmllbGRVUkkoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGNvbXB1dGVGaWVsZFVSTChmdWxseVF1YWxpZmllZENsYXNzTmFtZSwgZmllbGROYW1lKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHVyaSBmb3IgdGhlIGdpdmVuIGNsYXNzbmFtZSwgbWV0aG9kbmFtZSwgcGFybSB0eXBlcy4KLQkgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJtVHlwZXMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIHBhcm1zLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRNZXRob2RVUkkoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFybVR5cGVzKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGNvbXB1dGVNZXRob2RVUkwoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUsIG1ldGhvZE5hbWUsIHBhcm1UeXBlcykpOwotCX0KLQotCS8qKgotCSAqIFR1cm4gaXQgaW50byBhbiBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0TWV0aG9kVVJJKElNZXRob2RQcm94eSBtZXRob2QpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoZ2V0TWV0aG9kVVJMKG1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY29tcHV0ZSB0aGUgSmF2YSBNb2RlbGluZyBNRVRIT0RJRCBmcm9tIG1ldGhvZCBkZWNsYXJpbmcgY2xhc3MgbmFtZSwKLQkgKiBtZXRob2QgbmFtZSwgYW5kIHBhcmFtZXRlciBjbGFzcyBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWV0aG9kSUQoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDUwKTsKLQkJb3V0LmFwcGVuZChjbGFzc05hbWUpOwotCQlvdXQuYXBwZW5kKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCW91dC5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCW91dC5hcHBlbmQoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIpOwotCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvdXQuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCQlpZiAoaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDEpCi0JCQkJCW91dC5hcHBlbmQoUmVmbGVjdGlvbkFkYXB0b3IuQ19QQVJNX1BBUk1fREVMSU1JVEVSKTsKLQkJCX0KLQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMobWV0aG9kTmFtZSkpCi0JCQlvdXQuYXBwZW5kKFJlZmxlY3Rpb25BZGFwdG9yLlNfQ09OU1RSVUNUT1JfVE9LRU4pOyAvL0l0J3MgYSBjb25zdHJ1Y3RvcgotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXRyaWV2ZSB0aGUgQmVhbkRlY29yYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5EZWNvcmF0b3IgZ2V0QmVhbkRlY29yYXRvcihFTW9kZWxFbGVtZW50IG1vZGVsKSB7Ci0JCXJldHVybiAoQmVhbkRlY29yYXRvcikgZ2V0RGVjb3JhdG9yKG1vZGVsLCBCZWFuRGVjb3JhdG9yLmNsYXNzKTsKLQl9Ci0JLyoqCi0JICogVXRpbGl0eSB0byByZXRyaWV2ZSBhIGRlY29yYXRvciBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUFubm90YXRpb24gZ2V0RGVjb3JhdG9yKEVNb2RlbEVsZW1lbnQgbW9kZWwsIENsYXNzIGRlY29yYXRvckNsYXNzKSB7Ci0JCUl0ZXJhdG9yIGl0ciA9IG1vZGVsLmdldEVBbm5vdGF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFQW5ub3RhdGlvbiBkZWNyID0gKEVBbm5vdGF0aW9uKSBpdHIubmV4dCgpOwotCQkJaWYgKGRlY29yYXRvckNsYXNzLmlzSW5zdGFuY2UoZGVjcikpCi0JCQkJcmV0dXJuIGRlY3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXRyaWV2ZSB0aGUgRXZlbnRTZXREZWNvcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBFdmVudFNldERlY29yYXRvciBnZXRFdmVudFNldERlY29yYXRvcihFTW9kZWxFbGVtZW50IG1vZGVsKSB7Ci0JCXJldHVybiAoRXZlbnRTZXREZWNvcmF0b3IpIGdldERlY29yYXRvcihtb2RlbCwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0cmlldmUgdGhlIE1ldGhvZERlY29yYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZERlY29yYXRvciBnZXRNZXRob2REZWNvcmF0b3IoRU1vZGVsRWxlbWVudCBtb2RlbCkgewotCQlyZXR1cm4gKE1ldGhvZERlY29yYXRvcikgZ2V0RGVjb3JhdG9yKG1vZGVsLCBNZXRob2REZWNvcmF0b3IuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0cmlldmUgdGhlIFByb3BlcnR5RGVjb3JhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZWNvcmF0b3IgZ2V0UHJvcGVydHlEZWNvcmF0b3IoRU1vZGVsRWxlbWVudCBtb2RlbCkgewotCQlyZXR1cm4gKFByb3BlcnR5RGVjb3JhdG9yKSBnZXREZWNvcmF0b3IobW9kZWwsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIHJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgbGlzdCB3aGljaCB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgZGVjb3JhdG9ycwotCSAqIG9mIG9ubHkgdGhlIHByb3BlcnRpZXMgaW4gdGhlIEVMaXN0IHBhc3NlZCBpbi4gSWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYQotCSAqIHByb3BlcnR5IGRlY29yYXRvciwgdGhlbiBpdCBpcyBub3QgYSBiZWFuaW5mbyBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldFByb3BlcnRpZXNJdGVyYXRvcihmaW5hbCBFTGlzdCBwcm9wZXJ0aWVzKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQlwcml2YXRlIEl0ZXJhdG9yIGl0ciA9IHByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLQkJCXByaXZhdGUgYm9vbGVhbiBoYXNOZXh0ID0gdHJ1ZTsKLQkJCXByaXZhdGUgUHJvcGVydHlEZWNvcmF0b3IgbmV4dDsKLQkJCXsKLQkJCQlmaW5kTmV4dCgpOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQlyZXR1cm4gaGFzTmV4dDsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCVByb3BlcnR5RGVjb3JhdG9yIHRlbXAgPSBuZXh0OwotCQkJCWZpbmROZXh0KCk7Ci0JCQkJcmV0dXJuIHRlbXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIGZpbmROZXh0KCkgewotCQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVNb2RlbEVsZW1lbnQgbmV4dE9uZSA9IChFTW9kZWxFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJCQluZXh0ID0gZ2V0UHJvcGVydHlEZWNvcmF0b3IobmV4dE9uZSk7Ci0JCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQloYXNOZXh0ID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byByZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgd2hpY2ggd2lsbCByZXR1cm4gdGhlIEV2ZW50U2V0IGRlY29yYXRvcnMKLQkgKiBvZiBvbmx5IHRoZSBCZWFuRXZlbnRzIGluIHRoZSBFTGlzdCBwYXNzZWQgaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRFdmVudFNldHNJdGVyYXRvcihmaW5hbCBFTGlzdCBldmVudHMpIHsKLQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCXByaXZhdGUgSXRlcmF0b3IgaXRyID0gZXZlbnRzLml0ZXJhdG9yKCk7Ci0JCQlwcml2YXRlIGJvb2xlYW4gaGFzTmV4dCA9IHRydWU7Ci0JCQlwcml2YXRlIEV2ZW50U2V0RGVjb3JhdG9yIG5leHQ7Ci0JCQl7Ci0JCQkJZmluZE5leHQoKTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJcmV0dXJuIGhhc05leHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQlFdmVudFNldERlY29yYXRvciB0ZW1wID0gbmV4dDsKLQkJCQlmaW5kTmV4dCgpOwotCQkJCXJldHVybiB0ZW1wOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBmaW5kTmV4dCgpIHsKLQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQlFTW9kZWxFbGVtZW50IG5leHRPbmUgPSAoRU1vZGVsRWxlbWVudCkgaXRyLm5leHQoKTsKLQkJCQkJbmV4dCA9IGdldEV2ZW50U2V0RGVjb3JhdG9yKG5leHRPbmUpOwotCQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaGFzTmV4dCA9IGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBsaXN0IHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBNZXRob2QgZGVjb3JhdG9ycwotCSAqIG9mIG9ubHkgdGhlIE1ldGhvZHMgaW4gdGhlIEVMaXN0IHBhc3NlZCBpbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldE1ldGhvZHNJdGVyYXRvcihmaW5hbCBFTGlzdCBtZXRob2RzKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQlwcml2YXRlIEl0ZXJhdG9yIGl0ciA9IG1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJCXByaXZhdGUgYm9vbGVhbiBoYXNOZXh0ID0gdHJ1ZTsKLQkJCXByaXZhdGUgTWV0aG9kRGVjb3JhdG9yIG5leHQ7Ci0JCQl7Ci0JCQkJZmluZE5leHQoKTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJcmV0dXJuIGhhc05leHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQlNZXRob2REZWNvcmF0b3IgdGVtcCA9IG5leHQ7Ci0JCQkJZmluZE5leHQoKTsKLQkJCQlyZXR1cm4gdGVtcDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgZmluZE5leHQoKSB7Ci0JCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJRU1vZGVsRWxlbWVudCBuZXh0T25lID0gKEVNb2RlbEVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0JCQkJCW5leHQgPSBnZXRNZXRob2REZWNvcmF0b3IobmV4dE9uZSk7Ci0JCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQloYXNOZXh0ID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzZWFyY2ggcGF0aCBmcm9tIHRoZSByZW1vdGUgdm0uIAotCSAqIAotCSAqIE5vdGU6IFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggYSBCZWFuaW5mb05hdHVyZS4gVXNlIHRoZQotCSAqIGFjY2Vzc29ycyB0YWtpbmcgdGhlIG5hdHVyZSAgaW5zdGVhZC4gT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgaW5jb25zaXN0ZW5jaWVzIHNpbmNlIHRoZSBzZWFyY2ggcGF0aCB3b24ndCBiZQotCSAqIHNhdmVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiB0aGUgd29ya3NwYWNlIGlmIGl0IGlzIG5vdCB1cGRhdGVkIHRocm91Z2ggdGhlIG5hdHVyZSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXJyYXlCZWFuUHJveHkgZ2V0QmVhbkluZm9TZWFyY2hQYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXJldHVybiAoSUFycmF5QmVhblByb3h5KSBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzCi0JCQkuZ2V0Q29uc3RhbnRzKHJlZ2lzdHJ5KQotCQkJLmdldEdldEJlYW5JbmZvU2VhcmNoUGF0aFByb3h5KCkKLQkJCS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoCi0JCQludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlYXJjaCBwYXRoIHRvIHRoZSBhcnJheSBvZiBzdHJpbmdzIHBhc3NlZCBpbiBvbiB0aGUgcmVtb3RlIHZtLgotCSAqCi0JICogTm90ZTogVGhpcyBzaG91bGRuJ3QgYmUgdXNlZCB3aGVuIHdvcmtpbmcgd2l0aCBhIEJlYW5pbmZvTmF0dXJlLiBVc2UgdGhlCi0JICogYWNjZXNzb3JzIHRha2luZyB0aGUgbmF0dXJlICBpbnN0ZWFkLiBPdGhlcndpc2UgdGhlcmUgd2lsbCBiZSBpbmNvbnNpc3RlbmNpZXMgc2luY2UgdGhlIHNlYXJjaCBwYXRoIHdvbid0IGJlCi0JICogc2F2ZWQgYWNyb3NzIGludm9jYXRpb25zIG9mIHRoZSB3b3Jrc3BhY2UgaWYgaXQgaXMgbm90IHVwZGF0ZWQgdGhyb3VnaCB0aGUgbmF0dXJlKS4JIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCZWFuSW5mb1NlYXJjaFBhdGgoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZ1tdIHBhdGhzKSB7Ci0KLQkJdHJ5IHsKLQkJCUJlYW5pbmZvUHJveHlDb25zdGFudHMgYmlDb25zdGFudHMgPSBCZWFuaW5mb1Byb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhyZWdpc3RyeSk7Ci0JCQlKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgakNvbnN0YW50cyA9IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JCQlJQXJyYXlCZWFuUHJveHkgbmV3UGF0aCA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGpDb25zdGFudHMuZ2V0U3RyaW5nVHlwZSgpLCBwYXRocyAhPSBudWxsID8gcGF0aHMubGVuZ3RoIDogMCk7Ci0JCQlpZiAocGF0aHMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKQotCQkJCQluZXdQYXRoLnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwYXRoc1tpXSksIGkpOwotCQkJYmlDb25zdGFudHMuZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCwgbmV3UGF0aCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZyb20gdGhlIEJlYW5pbmZvIE5hdHVyZSwgaW5zZXJ0IGEgcGF0aCB0byB0aGUgYmVhbmluZm8gcGF0aCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIC0xIG1lYW5zIGF0IHRoZSBlbmQuCi0JICogSWYgaW5kZXggaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgcGF0aCwgaXQgd2lsbCBhbHNvIGFkZCBhdCB0aGUgZW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRCZWFuSW5mb1NlYXJjaFBhdGgoQmVhbmluZm9OYXR1cmUgbmF0dXJlLCBJQmVhbmluZm9zRG9jRW50cnkgcGF0aCwgaW50IGluZGV4KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUJlYW5pbmZvc0RvYyBpbmZvUGF0aCA9IG5hdHVyZS5nZXRTZWFyY2hQYXRoKCk7Ci0JCUlCZWFuaW5mb3NEb2NFbnRyeVtdIG9sZFBhdGggPSBpbmZvUGF0aC5nZXRTZWFyY2hwYXRoKCk7Ci0KLQkJSUJlYW5pbmZvc0RvY0VudHJ5W10gbmV3UGF0aCA9IG5ldyBJQmVhbmluZm9zRG9jRW50cnlbb2xkUGF0aC5sZW5ndGggKyAxXTsKLQotCQlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gb2xkUGF0aC5sZW5ndGgpIHsKLQkJCS8vIEF0IHRoZSBlbmQgb3IgcGFzdCBlbmQKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkUGF0aCwgMCwgbmV3UGF0aCwgMCwgb2xkUGF0aC5sZW5ndGgpOwotCQkJbmV3UGF0aFtvbGRQYXRoLmxlbmd0aF0gPSBwYXRoOwotCQl9IGVsc2UgewotCQkJLy8gSW4gdGhlIG1pZGRsZQotCQkJU3lzdGVtLmFycmF5Y29weShvbGRQYXRoLCAwLCBuZXdQYXRoLCAwLCBpbmRleCk7Ci0JCQluZXdQYXRoW2luZGV4XSA9IHBhdGg7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFBhdGgsIGluZGV4LCBuZXdQYXRoLCBpbmRleCArIDEsIG9sZFBhdGgubGVuZ3RoIC0gaW5kZXgpOwotCQl9Ci0KLQkJaW5mb1BhdGguc2V0U2VhcmNocGF0aChuZXdQYXRoKTsKLQkJbmF0dXJlLnNldFNlYXJjaFBhdGgoaW5mb1BhdGgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBhIHBhdGggdG8gdGhlIGJlYW5pbmZvIHBhdGggYXQgdGhlIGdpdmVuIGluZGV4LCAtMSBtZWFucyBhdCB0aGUgZW5kLgotCSAqIElmIGluZGV4IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHBhdGgsIGl0IHdpbGwgYWxzbyBhZGQgYXQgdGhlIGVuZC4KLQkgKgotCSAqIE5vdGU6IFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggYSBCZWFuaW5mb05hdHVyZS4gVXNlIHRoZQotCSAqIGFjY2Vzc29ycyB0YWtpbmcgdGhlIG5hdHVyZSAgaW5zdGVhZC4gT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgaW5jb25zaXN0ZW5jaWVzIHNpbmNlIHRoZSBzZWFyY2ggcGF0aCB3b24ndCBiZQotCSAqIHNhdmVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiB0aGUgd29ya3NwYWNlIGlmIGl0IGlzIG5vdCB1cGRhdGVkIHRocm91Z2ggdGhlIG5hdHVyZSkuCSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0QmVhbkluZm9TZWFyY2hQYXRoKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGF0aCwgaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIGJpQ29uc3RhbnRzID0gQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJSUFycmF5QmVhblByb3h5IGluZm9QYXRoID0gKElBcnJheUJlYW5Qcm94eSkgYmlDb25zdGFudHMuZ2V0R2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCk7Ci0JCQlpbnQgcGF0aExlbmd0aCA9IGluZm9QYXRoLmdldExlbmd0aCgpOwotCi0JCQlJU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQotCQkJSUFycmF5QmVhblByb3h5IG5ld1BhdGggPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChpbmZvUGF0aC5nZXRUeXBlUHJveHkoKSwgcGF0aExlbmd0aCArIDEpOwotCQkJSUJlYW5Qcm94eSBzdHJpbmdQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHBhdGgpOwotCi0JCQlKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMgY29uc3RhbnRzID0gSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhyZWdpc3RyeSk7Ci0JCQlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gcGF0aExlbmd0aCkgewotCQkJCS8vIEF0IHRoZSBlbmQgb3IgcGFzdCBlbmQKLQkJCQljb25zdGFudHMuYXJyYXljb3B5KGluZm9QYXRoLCAwLCBuZXdQYXRoLCAwLCBpbmZvUGF0aC5nZXRMZW5ndGgoKSk7Ci0JCQkJbmV3UGF0aC5zZXQoc3RyaW5nUHJveHksIHBhdGhMZW5ndGgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJbiB0aGUgbWlkZGxlCi0JCQkJY29uc3RhbnRzLmFycmF5Y29weShpbmZvUGF0aCwgMCwgbmV3UGF0aCwgMCwgaW5kZXgpOwotCQkJCW5ld1BhdGguc2V0KHN0cmluZ1Byb3h5LCBpbmRleCk7Ci0JCQkJY29uc3RhbnRzLmFycmF5Y29weShpbmZvUGF0aCwgaW5kZXgsIG5ld1BhdGgsIGluZGV4ICsgMSwgcGF0aExlbmd0aCAtIGluZGV4KTsKLQkJCX0KLQotCQkJYmlDb25zdGFudHMuZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCwgbmV3UGF0aCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZyb20gdGhlIEJlYW5pbmZvIE5hdHVyZSwgcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGF0aCBmcm9tIHRoZSBiZWFuaW5mbyBzZWFyY2ggcGF0aC4KLQkgKiBOb3QgYW4gZXJyb3IgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVCZWFuSW5mb1BhdGgoQmVhbmluZm9OYXR1cmUgbmF0dXJlLCBJQmVhbmluZm9zRG9jRW50cnkgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlCZWFuaW5mb3NEb2MgaW5mb1BhdGggPSBuYXR1cmUuZ2V0U2VhcmNoUGF0aCgpOwotCQlJQmVhbmluZm9zRG9jRW50cnlbXSBvbGRQYXRoID0gaW5mb1BhdGguZ2V0U2VhcmNocGF0aCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkUGF0aC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhdGguZXF1YWxzKG9sZFBhdGhbaV0pKSB7Ci0JCQkJLy8gV2UgZm91bmQgaXQsIHNvIHJlbW92ZSBpdC4KLQkJCQlJQmVhbmluZm9zRG9jRW50cnlbXSBuZXdQYXRoID0gbmV3IElCZWFuaW5mb3NEb2NFbnRyeVtvbGRQYXRoLmxlbmd0aCAtIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkUGF0aCwgMCwgbmV3UGF0aCwgMCwgaSk7Ci0JCQkJaWYgKGkgPCBvbGRQYXRoLmxlbmd0aCAtIDEpCi0JCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkUGF0aCwgaSArIDEsIG5ld1BhdGgsIGksIG9sZFBhdGgubGVuZ3RoIC0gaSAtIDEpOwotCQkJCWluZm9QYXRoLnNldFNlYXJjaHBhdGgobmV3UGF0aCk7Ci0JCQkJbmF0dXJlLnNldFNlYXJjaFBhdGgoaW5mb1BhdGgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgYmVhbmluZm8gc2VhcmNoIHBhdGguCi0JICogTm90IGFuIGVycm9yIGlmIG5vdCBmb3VuZC4KLQkgKgotCSAqIE5vdGU6IFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggYSBCZWFuaW5mb05hdHVyZS4gVXNlIHRoZQotCSAqIGFjY2Vzc29ycyB0YWtpbmcgdGhlIG5hdHVyZSAgaW5zdGVhZC4gT3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgaW5jb25zaXN0ZW5jaWVzIHNpbmNlIHRoZSBzZWFyY2ggcGF0aCB3b24ndCBiZQotCSAqIHNhdmVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiB0aGUgd29ya3NwYWNlIGlmIGl0IGlzIG5vdCB1cGRhdGVkIHRocm91Z2ggdGhlIG5hdHVyZSkuCSAJIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVCZWFuSW5mb1BhdGgoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlCZWFuaW5mb1Byb3h5Q29uc3RhbnRzIGJpQ29uc3RhbnRzID0gQmVhbmluZm9Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMocmVnaXN0cnkpOwotCQkJSUFycmF5QmVhblByb3h5IGluZm9QYXRoID0gKElBcnJheUJlYW5Qcm94eSkgYmlDb25zdGFudHMuZ2V0R2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCk7Ci0JCQlpbnQgcGF0aExlbmd0aCA9IGluZm9QYXRoLmdldExlbmd0aCgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhMZW5ndGg7IGkrKykgewotCQkJCUlTdHJpbmdCZWFuUHJveHkgYVBhdGggPSAoSVN0cmluZ0JlYW5Qcm94eSkgaW5mb1BhdGguZ2V0KGkpOwotCQkJCWlmIChwYXRoLmVxdWFscyhhUGF0aC5zdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkvLyBXZSBmb3VuZCBpdCwgc28gcmVtb3ZlIGl0LgotCQkJCQlJQXJyYXlCZWFuUHJveHkgbmV3UGF0aCA9IHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGluZm9QYXRoLmdldFR5cGVQcm94eSgpLCBwYXRoTGVuZ3RoIC0gMSk7Ci0JCQkJCUphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBjb25zdGFudHMgPSBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKHJlZ2lzdHJ5KTsKLQkJCQkJY29uc3RhbnRzLmFycmF5Y29weShpbmZvUGF0aCwgMCwgbmV3UGF0aCwgMCwgaSk7Ci0JCQkJCWlmIChpIDwgcGF0aExlbmd0aCAtIDEpCi0JCQkJCQljb25zdGFudHMuYXJyYXljb3B5KGluZm9QYXRoLCBpICsgMSwgbmV3UGF0aCwgaSwgcGF0aExlbmd0aCAtIGkgLSAxKTsKLQkJCQkJYmlDb25zdGFudHMuZ2V0U2V0QmVhbkluZm9TZWFyY2hQYXRoUHJveHkoKS5pbnZva2UobnVsbCwgbmV3UGF0aCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM0MTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotQmVhbkluZm9DYWNoZUNvbnRyb2xsZXJfSm9iX1dyaXRlQmVhbmluZm9DYWNoZV9UaXRsZT1Xcml0ZSBCZWFuSW5mbyBjYWNoZSBmaWxlcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbkRlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5EZWNvcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2I2MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbkRlY29yYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5EZWNvcmF0b3JJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIwICQgICREYXRlOiAyMDA1LzA5LzE5IDE1OjQzOjAyICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJlYW4gRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzIDxlbT5NZXJnZSBTdXBlciBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNpc01lcmdlU3VwZXJNZXRob2RzIDxlbT5NZXJnZSBTdXBlciBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNpc01lcmdlU3VwZXJFdmVudHMgPGVtPk1lcmdlIFN1cGVyIEV2ZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjaXNJbnRyb3NwZWN0UHJvcGVydGllcyA8ZW0+SW50cm9zcGVjdCBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5CZWFuRGVjb3JhdG9ySW1wbCNpc0ludHJvc3BlY3RNZXRob2RzIDxlbT5JbnRyb3NwZWN0IE1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2lzSW50cm9zcGVjdEV2ZW50cyA8ZW0+SW50cm9zcGVjdCBFdmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2lzRG9CZWFuaW5mbyA8ZW0+RG8gQmVhbmluZm88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2dldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMgPGVtPk5vdCBJbmhlcml0ZWQgUHJvcGVydHkgTmFtZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkJlYW5EZWNvcmF0b3JJbXBsI2dldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzIDxlbT5Ob3QgSW5oZXJpdGVkIE1ldGhvZCBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcyA8ZW0+Tm90IEluaGVyaXRlZCBFdmVudCBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuQmVhbkRlY29yYXRvckltcGwjZ2V0Q3VzdG9taXplckNsYXNzIDxlbT5DdXN0b21pemVyIENsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi0KLQotcHVibGljIGNsYXNzIEJlYW5EZWNvcmF0b3JJbXBsIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvckltcGwgaW1wbGVtZW50cyBCZWFuRGVjb3JhdG9yewotCQotCS8qKgotCSAqIEJpdHMgZm9yIGltcGxpY2l0bHkgc2V0IGZlYXR1cmVzLiBUaGlzIGlzIGludGVybmFsLCBub3QgbWVhbnQgZm9yIGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJFQU5fQ1VTVE9NSVpFUl9JTVBMSUNJVCA9IDB4MUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJFQU5fTUVSR0VfSU5IRVJJVEVEX1BST1BFUlRJRVNfSU1QTElDSVQgPSAweDJMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBCRUFOX01FUkdFX0lOSEVSSVRFRF9PUEVSQVRJT05TX0lNUExJQ0lUID0gMHg0TDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQkVBTl9NRVJHRV9JTkhFUklURURfRVZFTlRTX0lNUExJQ0lUID0gMHg4TDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkgPGVtPk1lcmdlIFN1cGVyIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VERUZBVUxUID0gdHJ1ZTsKLQkKLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkgPGVtPk1lcmdlIFN1cGVyIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWVyZ2VTdXBlclByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUcgPSAxIDw8IDE4OwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIE1lcmdlIFN1cGVyIFByb3BlcnRpZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRVNFVEZMQUcgPSAxIDw8IDE5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWVyZ2VTdXBlck1ldGhvZHMoKSA8ZW0+TWVyZ2UgU3VwZXIgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXJnZVN1cGVyTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1FUkdFX1NVUEVSX01FVEhPRFNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXJnZVN1cGVyTWV0aG9kcygpIDxlbT5NZXJnZSBTdXBlciBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01lcmdlU3VwZXJNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHID0gMSA8PCAyMDsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBNZXJnZSBTdXBlciBNZXRob2RzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVJHRV9TVVBFUl9NRVRIT0RTX0VTRVRGTEFHID0gMSA8PCAyMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01lcmdlU3VwZXJFdmVudHMoKSA8ZW0+TWVyZ2UgU3VwZXIgRXZlbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01lcmdlU3VwZXJFdmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNRVJHRV9TVVBFUl9FVkVOVFNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNZXJnZVN1cGVyRXZlbnRzKCkgPGVtPk1lcmdlIFN1cGVyIEV2ZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNZXJnZVN1cGVyRXZlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUcgPSAxIDw8IDIyOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIE1lcmdlIFN1cGVyIEV2ZW50cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VfU1VQRVJfRVZFTlRTX0VTRVRGTEFHID0gMSA8PCAyMzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkgPGVtPkludHJvc3BlY3QgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnRyb3NwZWN0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVFJPU1BFQ1RfUFJPUEVSVElFU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkgPGVtPkludHJvc3BlY3QgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnRyb3NwZWN0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VGTEFHID0gMSA8PCAyNDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ludHJvc3BlY3RNZXRob2RzKCkgPGVtPkludHJvc3BlY3QgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnRyb3NwZWN0TWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVFJPU1BFQ1RfTUVUSE9EU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ludHJvc3BlY3RNZXRob2RzKCkgPGVtPkludHJvc3BlY3QgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnRyb3NwZWN0TWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5UUk9TUEVDVF9NRVRIT0RTX0VGTEFHID0gMSA8PCAyNTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ludHJvc3BlY3RFdmVudHMoKSA8ZW0+SW50cm9zcGVjdCBFdmVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50cm9zcGVjdEV2ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVFJPU1BFQ1RfRVZFTlRTX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50cm9zcGVjdEV2ZW50cygpIDxlbT5JbnRyb3NwZWN0IEV2ZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnRyb3NwZWN0RXZlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTlRST1NQRUNUX0VWRU5UU19FRkxBRyA9IDEgPDwgMjY7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEb0JlYW5pbmZvKCkgPGVtPkRvIEJlYW5pbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RvQmVhbmluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBET19CRUFOSU5GT19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RvQmVhbmluZm8oKSA8ZW0+RG8gQmVhbmluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRG9CZWFuaW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRE9fQkVBTklORk9fRUZMQUcgPSAxIDw8IDI3OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpIDxlbT5Ob3QgSW5oZXJpdGVkIFByb3BlcnR5IE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkgPGVtPk5vdCBJbmhlcml0ZWQgTWV0aG9kIE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgbm90SW5oZXJpdGVkTWV0aG9kTmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpIDxlbT5Ob3QgSW5oZXJpdGVkIEV2ZW50IE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBub3RJbmhlcml0ZWRFdmVudE5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXJDbGFzcygpIDxlbT5DdXN0b21pemVyIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgY3VzdG9taXplckNsYXNzID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8JCi0JcHJvdGVjdGVkIEJlYW5EZWNvcmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCQllRmxhZ3MgfD0gTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRzsKLQkJZUZsYWdzIHw9IE1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUc7Ci0JCWVGbGFncyB8PSBNRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUc7Ci0JCWVGbGFncyB8PSBJTlRST1NQRUNUX1BST1BFUlRJRVNfRUZMQUc7Ci0JCWVGbGFncyB8PSBJTlRST1NQRUNUX01FVEhPRFNfRUZMQUc7Ci0JCWVGbGFncyB8PSBJTlRST1NQRUNUX0VWRU5UU19FRkxBRzsKLQkJZUZsYWdzIHw9IERPX0JFQU5JTkZPX0VGTEFHOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRCZWFuRGVjb3JhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZVN1cGVyUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKGJvb2xlYW4gbmV3TWVyZ2VTdXBlclByb3BlcnRpZXMpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyUHJvcGVydGllcyA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3TWVyZ2VTdXBlclByb3BlcnRpZXMpIGVGbGFncyB8PSBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TUVSR0VfU1VQRVJfUFJPUEVSVElFU19FRkxBRzsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyUHJvcGVydGllc0VTZXQgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfUFJPUEVSVElFUywgb2xkTWVyZ2VTdXBlclByb3BlcnRpZXMsIG5ld01lcmdlU3VwZXJQcm9wZXJ0aWVzLCAhb2xkTWVyZ2VTdXBlclByb3BlcnRpZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNZXJnZVN1cGVyUHJvcGVydGllcygpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyUHJvcGVydGllcyA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJQcm9wZXJ0aWVzRVNldCA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FREVGQVVMVCkgZUZsYWdzIHw9IE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VGTEFHOwotCQllRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9QUk9QRVJUSUVTLCBvbGRNZXJnZVN1cGVyUHJvcGVydGllcywgTUVSR0VfU1VQRVJfUFJPUEVSVElFU19FREVGQVVMVCwgb2xkTWVyZ2VTdXBlclByb3BlcnRpZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNZXJnZVN1cGVyUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9QUk9QRVJUSUVTX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VTdXBlck1ldGhvZHMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXJnZVN1cGVyTWV0aG9kcyhib29sZWFuIG5ld01lcmdlU3VwZXJNZXRob2RzKSB7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlck1ldGhvZHMgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld01lcmdlU3VwZXJNZXRob2RzKSBlRmxhZ3MgfD0gTUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfk1FUkdFX1NVUEVSX01FVEhPRFNfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlck1ldGhvZHNFU2V0ID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX01FVEhPRFNfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBNRVJHRV9TVVBFUl9NRVRIT0RTX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX01FVEhPRFMsIG9sZE1lcmdlU3VwZXJNZXRob2RzLCBuZXdNZXJnZVN1cGVyTWV0aG9kcywgIW9sZE1lcmdlU3VwZXJNZXRob2RzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWVyZ2VTdXBlck1ldGhvZHMoKSB7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlck1ldGhvZHMgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyTWV0aG9kc0VTZXQgPSAoZUZsYWdzICYgTUVSR0VfU1VQRVJfTUVUSE9EU19FU0VURkxBRykgIT0gMDsKLQkJaWYgKE1FUkdFX1NVUEVSX01FVEhPRFNfRURFRkFVTFQpIGVGbGFncyB8PSBNRVJHRV9TVVBFUl9NRVRIT0RTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRzsKLQkJZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9NRVRIT0RTX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfTUVUSE9EUywgb2xkTWVyZ2VTdXBlck1ldGhvZHMsIE1FUkdFX1NVUEVSX01FVEhPRFNfRURFRkFVTFQsIG9sZE1lcmdlU3VwZXJNZXRob2RzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWVyZ2VTdXBlck1ldGhvZHMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTUVSR0VfU1VQRVJfTUVUSE9EU19FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01lcmdlU3VwZXJFdmVudHMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lcmdlU3VwZXJFdmVudHMoYm9vbGVhbiBuZXdNZXJnZVN1cGVyRXZlbnRzKSB7Ci0JCWJvb2xlYW4gb2xkTWVyZ2VTdXBlckV2ZW50cyA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdNZXJnZVN1cGVyRXZlbnRzKSBlRmxhZ3MgfD0gTUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHOwotCQlib29sZWFuIG9sZE1lcmdlU3VwZXJFdmVudHNFU2V0ID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX0VWRU5UU19FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IE1FUkdFX1NVUEVSX0VWRU5UU19FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFMsIG9sZE1lcmdlU3VwZXJFdmVudHMsIG5ld01lcmdlU3VwZXJFdmVudHMsICFvbGRNZXJnZVN1cGVyRXZlbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWVyZ2VTdXBlckV2ZW50cygpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyRXZlbnRzID0gKGVGbGFncyAmIE1FUkdFX1NVUEVSX0VWRU5UU19FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRNZXJnZVN1cGVyRXZlbnRzRVNldCA9IChlRmxhZ3MgJiBNRVJHRV9TVVBFUl9FVkVOVFNfRVNFVEZMQUcpICE9IDA7Ci0JCWlmIChNRVJHRV9TVVBFUl9FVkVOVFNfRURFRkFVTFQpIGVGbGFncyB8PSBNRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5NRVJHRV9TVVBFUl9FVkVOVFNfRUZMQUc7Ci0JCWVGbGFncyAmPSB+TUVSR0VfU1VQRVJfRVZFTlRTX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfRVZFTlRTLCBvbGRNZXJnZVN1cGVyRXZlbnRzLCBNRVJHRV9TVVBFUl9FVkVOVFNfRURFRkFVTFQsIG9sZE1lcmdlU3VwZXJFdmVudHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNZXJnZVN1cGVyRXZlbnRzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIE1FUkdFX1NVUEVSX0VWRU5UU19FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIElOVFJPU1BFQ1RfUFJPUEVSVElFU19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRyb3NwZWN0UHJvcGVydGllcyhib29sZWFuIG5ld0ludHJvc3BlY3RQcm9wZXJ0aWVzKSB7Ci0JCWJvb2xlYW4gb2xkSW50cm9zcGVjdFByb3BlcnRpZXMgPSAoZUZsYWdzICYgSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3SW50cm9zcGVjdFByb3BlcnRpZXMpIGVGbGFncyB8PSBJTlRST1NQRUNUX1BST1BFUlRJRVNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5JTlRST1NQRUNUX1BST1BFUlRJRVNfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9QUk9QRVJUSUVTLCBvbGRJbnRyb3NwZWN0UHJvcGVydGllcywgbmV3SW50cm9zcGVjdFByb3BlcnRpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludHJvc3BlY3RNZXRob2RzKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIElOVFJPU1BFQ1RfTUVUSE9EU19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRyb3NwZWN0TWV0aG9kcyhib29sZWFuIG5ld0ludHJvc3BlY3RNZXRob2RzKSB7Ci0JCWJvb2xlYW4gb2xkSW50cm9zcGVjdE1ldGhvZHMgPSAoZUZsYWdzICYgSU5UUk9TUEVDVF9NRVRIT0RTX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3SW50cm9zcGVjdE1ldGhvZHMpIGVGbGFncyB8PSBJTlRST1NQRUNUX01FVEhPRFNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5JTlRST1NQRUNUX01FVEhPRFNfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9NRVRIT0RTLCBvbGRJbnRyb3NwZWN0TWV0aG9kcywgbmV3SW50cm9zcGVjdE1ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludHJvc3BlY3RFdmVudHMoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSU5UUk9TUEVDVF9FVkVOVFNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50cm9zcGVjdEV2ZW50cyhib29sZWFuIG5ld0ludHJvc3BlY3RFdmVudHMpIHsKLQkJYm9vbGVhbiBvbGRJbnRyb3NwZWN0RXZlbnRzID0gKGVGbGFncyAmIElOVFJPU1BFQ1RfRVZFTlRTX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3SW50cm9zcGVjdEV2ZW50cykgZUZsYWdzIHw9IElOVFJPU1BFQ1RfRVZFTlRTX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+SU5UUk9TUEVDVF9FVkVOVFNfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9FVkVOVFMsIG9sZEludHJvc3BlY3RFdmVudHMsIG5ld0ludHJvc3BlY3RFdmVudHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVyQ2xhc3MoSmF2YUNsYXNzIG5ld0N1c3RvbWl6ZXJDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkQ3VzdG9taXplckNsYXNzID0gY3VzdG9taXplckNsYXNzOwotCQljdXN0b21pemVyQ2xhc3MgPSBuZXdDdXN0b21pemVyQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ1VTVE9NSVpFUl9DTEFTUywgb2xkQ3VzdG9taXplckNsYXNzLCBjdXN0b21pemVyQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERldGFpbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FTU9ERUxfRUxFTUVOVF9fRUFOTk9UQVRJT05TLCBFTW9kZWxFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZ2V0RGV0YWlscygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRDYXRlZ29yeSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNFeHBlcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc0hpZGRlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuIGlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0SW1wbGljaXRseVNldEJpdHMoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc01lcmdlU3VwZXJQcm9wZXJ0aWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGlzTWVyZ2VTdXBlck1ldGhvZHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfRVZFTlRTOgotCQkJCXJldHVybiBpc01lcmdlU3VwZXJFdmVudHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc0ludHJvc3BlY3RQcm9wZXJ0aWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfTUVUSE9EUzoKLQkJCQlyZXR1cm4gaXNJbnRyb3NwZWN0TWV0aG9kcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX0VWRU5UUzoKLQkJCQlyZXR1cm4gaXNJbnRyb3NwZWN0RXZlbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RPX0JFQU5JTkZPOgotCQkJCXJldHVybiBpc0RvQmVhbmluZm8oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9QUk9QRVJUWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfTUVUSE9EX05BTUVTOgotCQkJCXJldHVybiBnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfRVZFTlRfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DVVNUT01JWkVSX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0Q3VzdG9taXplckNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0Q3VzdG9taXplckNsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGV0YWlscygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXNldFNob3J0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJc2V0RXhwZXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ISURERU46Ci0JCQkJc2V0SGlkZGVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJc2V0UHJlZmVycmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cygoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKChJbXBsaWNpdEl0ZW0pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9QUk9QRVJUSUVTOgotCQkJCXNldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9NRVRIT0RTOgotCQkJCXNldE1lcmdlU3VwZXJNZXRob2RzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFM6Ci0JCQkJc2V0TWVyZ2VTdXBlckV2ZW50cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9QUk9QRVJUSUVTOgotCQkJCXNldEludHJvc3BlY3RQcm9wZXJ0aWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX01FVEhPRFM6Ci0JCQkJc2V0SW50cm9zcGVjdE1ldGhvZHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfRVZFTlRTOgotCQkJCXNldEludHJvc3BlY3RFdmVudHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RPX0JFQU5JTkZPOgotCQkJCXNldERvQmVhbmluZm8oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfUFJPUEVSVFlfTkFNRVM6Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfTUVUSE9EX05BTUVTOgotCQkJCWdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfRVZFTlRfTkFNRVM6Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NVU1RPTUlaRVJfQ0xBU1M6Ci0JCQkJc2V0Q3VzdG9taXplckNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJdW5zZXREaXNwbGF5TmFtZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQl1bnNldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJdW5zZXRFeHBlcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXVuc2V0SGlkZGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQl1bnNldFByZWZlcnJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbihNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eShBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfUFJPUEVSVElFUzoKLQkJCQl1bnNldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX01FVEhPRFM6Ci0JCQkJdW5zZXRNZXJnZVN1cGVyTWV0aG9kcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFM6Ci0JCQkJdW5zZXRNZXJnZVN1cGVyRXZlbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfUFJPUEVSVElFUzoKLQkJCQlzZXRJbnRyb3NwZWN0UHJvcGVydGllcyhJTlRST1NQRUNUX1BST1BFUlRJRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX01FVEhPRFM6Ci0JCQkJc2V0SW50cm9zcGVjdE1ldGhvZHMoSU5UUk9TUEVDVF9NRVRIT0RTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9FVkVOVFM6Ci0JCQkJc2V0SW50cm9zcGVjdEV2ZW50cyhJTlRST1NQRUNUX0VWRU5UU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RPX0JFQU5JTkZPOgotCQkJCXNldERvQmVhbmluZm8oRE9fQkVBTklORk9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX1BST1BFUlRZX05BTUVTOgotCQkJCWdldE5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX01FVEhPRF9OQU1FUzoKLQkJCQlnZXROb3RJbmhlcml0ZWRNZXRob2ROYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfRVZFTlRfTkFNRVM6Ci0JCQkJZ2V0Tm90SW5oZXJpdGVkRXZlbnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NVU1RPTUlaRVJfQ0xBU1M6Ci0JCQkJc2V0Q3VzdG9taXplckNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0I2VJc1NldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBpc1NvdXJjZVNldCgpOwkvLyBPdmVycmlkZSBzbyB0aGF0IGlmIHNldCB0byB0aGUgc2FtZSBhcyBjbGFzc25hbWUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBub3Qgc2V0LgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldEdlbihFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlICE9IG51bGwgOiAhU09VUkNFX0VERUZBVUxULmVxdWFscyhzb3VyY2UpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGRldGFpbHMgIT0gbnVsbCAmJiAhZGV0YWlscy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBjb250ZW50cyAhPSBudWxsICYmICFjb250ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGlzU2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gaXNTZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc1NldEV4cGVydCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNTZXRIaWRkZW4oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UHJlZmVycmVkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHKSAhPSAwKSAhPSBNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCkgIT0gQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBpbXBsaWNpdGx5U2V0Qml0cyAhPSBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBpbXBsaWNpdERlY29yYXRvckZsYWcgIT0gSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc1NldE1lcmdlU3VwZXJQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfTUVUSE9EUzoKLQkJCQlyZXR1cm4gaXNTZXRNZXJnZVN1cGVyTWV0aG9kcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX0VWRU5UUzoKLQkJCQlyZXR1cm4gaXNTZXRNZXJnZVN1cGVyRXZlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fSU5UUk9TUEVDVF9QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElOVFJPU1BFQ1RfUFJPUEVSVElFU19FRkxBRykgIT0gMCkgIT0gSU5UUk9TUEVDVF9QUk9QRVJUSUVTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0lOVFJPU1BFQ1RfTUVUSE9EUzoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRST1NQRUNUX01FVEhPRFNfRUZMQUcpICE9IDApICE9IElOVFJPU1BFQ1RfTUVUSE9EU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX0VWRU5UUzoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRST1NQRUNUX0VWRU5UU19FRkxBRykgIT0gMCkgIT0gSU5UUk9TUEVDVF9FVkVOVFNfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRE9fQkVBTklORk86Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRE9fQkVBTklORk9fRUZMQUcpICE9IDApICE9IERPX0JFQU5JTkZPX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfUFJPUEVSVFlfTkFNRVM6Ci0JCQkJcmV0dXJuIG5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMgIT0gbnVsbCAmJiAhbm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9NRVRIT0RfTkFNRVM6Ci0JCQkJcmV0dXJuIG5vdEluaGVyaXRlZE1ldGhvZE5hbWVzICE9IG51bGwgJiYgIW5vdEluaGVyaXRlZE1ldGhvZE5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fREVDT1JBVE9SX19OT1RfSU5IRVJJVEVEX0VWRU5UX05BTUVTOgotCQkJCXJldHVybiBub3RJbmhlcml0ZWRFdmVudE5hbWVzICE9IG51bGwgJiYgIW5vdEluaGVyaXRlZEV2ZW50TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NVU1RPTUlaRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWVyZ2VTdXBlclByb3BlcnRpZXM6ICIpOwotCQlpZiAoKGVGbGFncyAmIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIE1FUkdFX1NVUEVSX1BST1BFUlRJRVNfRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXJnZVN1cGVyTWV0aG9kczogIik7Ci0JCWlmICgoZUZsYWdzICYgTUVSR0VfU1VQRVJfTUVUSE9EU19FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgTUVSR0VfU1VQRVJfTUVUSE9EU19FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1lcmdlU3VwZXJFdmVudHM6ICIpOwotCQlpZiAoKGVGbGFncyAmIE1FUkdFX1NVUEVSX0VWRU5UU19FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgTUVSR0VfU1VQRVJfRVZFTlRTX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW50cm9zcGVjdFByb3BlcnRpZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBJTlRST1NQRUNUX1BST1BFUlRJRVNfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludHJvc3BlY3RNZXRob2RzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgSU5UUk9TUEVDVF9NRVRIT0RTX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnRyb3NwZWN0RXZlbnRzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgSU5UUk9TUEVDVF9FVkVOVFNfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRvQmVhbmluZm86ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBET19CRUFOSU5GT19FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90SW5oZXJpdGVkUHJvcGVydHlOYW1lczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90SW5oZXJpdGVkTWV0aG9kTmFtZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RJbmhlcml0ZWRFdmVudE5hbWVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3RJbmhlcml0ZWRFdmVudE5hbWVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvQmVhbmluZm8oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRE9fQkVBTklORk9fRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9CZWFuaW5mbyhib29sZWFuIG5ld0RvQmVhbmluZm8pIHsKLQkJYm9vbGVhbiBvbGREb0JlYW5pbmZvID0gKGVGbGFncyAmIERPX0JFQU5JTkZPX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RG9CZWFuaW5mbykgZUZsYWdzIHw9IERPX0JFQU5JTkZPX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RE9fQkVBTklORk9fRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fRE9fQkVBTklORk8sIG9sZERvQmVhbmluZm8sIG5ld0RvQmVhbmluZm8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpIHsKLQkJaWYgKG5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMgPT0gbnVsbCkgewotCQkJbm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9QUk9QRVJUWV9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIG5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE5vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkgewotCQlpZiAobm90SW5oZXJpdGVkTWV0aG9kTmFtZXMgPT0gbnVsbCkgewotCQkJbm90SW5oZXJpdGVkTWV0aG9kTmFtZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfTUVUSE9EX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gbm90SW5oZXJpdGVkTWV0aG9kTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE5vdEluaGVyaXRlZEV2ZW50TmFtZXMoKSB7Ci0JCWlmIChub3RJbmhlcml0ZWRFdmVudE5hbWVzID09IG51bGwpIHsKLQkJCW5vdEluaGVyaXRlZEV2ZW50TmFtZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfRVZFTlRfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBub3RJbmhlcml0ZWRFdmVudE5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0Q3VzdG9taXplckNsYXNzKCkgewotCQlpZiAoY3VzdG9taXplckNsYXNzICE9IG51bGwgJiYgY3VzdG9taXplckNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRDdXN0b21pemVyQ2xhc3MgPSBjdXN0b21pemVyQ2xhc3M7Ci0JCQljdXN0b21pemVyQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCljdXN0b21pemVyQ2xhc3MpOwotCQkJaWYgKGN1c3RvbWl6ZXJDbGFzcyAhPSBvbGRDdXN0b21pemVyQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1JfX0NVU1RPTUlaRVJfQ0xBU1MsIG9sZEN1c3RvbWl6ZXJDbGFzcywgY3VzdG9taXplckNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGN1c3RvbWl6ZXJDbGFzczsKLQl9Ci0KLQlwcml2YXRlIFVSTCBpY29uVVJMOwotCXByaXZhdGUgYm9vbGVhbiBoYXNRdWVyaWVkSWNvblVSTDsKLQkKLQlwdWJsaWMgVVJMIGdldEljb25VUkwoKXsKLQkJaWYgKCFoYXNRdWVyaWVkSWNvblVSTCl7Ci0JCQlGZWF0dXJlQXR0cmlidXRlVmFsdWUgdmFsdWUgPSAoRmVhdHVyZUF0dHJpYnV0ZVZhbHVlKSBnZXRBdHRyaWJ1dGVzKCkuZ2V0KCJJQ09OX0NPTE9SXzE2eDE2X1VSTCIpOwkvLyROT04tTkxTLTEkCi0JCQlpZiAodmFsdWUgIT0gbnVsbCkgeyAKLQkJCQkvLyBHZXQgdGhlIHZhbHVlCi0JCQkJT2JqZWN0IGF0dHIgPSB2YWx1ZS5nZXRWYWx1ZSgpOwotCQkJCWlmIChhdHRyIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQloYXNRdWVyaWVkSWNvblVSTCA9IHRydWU7Ci0JCQkJCQlpY29uVVJMID0gbmV3IFVSTCgoU3RyaW5nKSBhdHRyKTsKLQkJCQkJfSBjYXRjaCAoIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKSB7Ci0JCQkJCQlCZWFuaW5mb1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZXhjLCBMZXZlbC5JTkZPKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gaWNvblVSTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuRXZlbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzRjNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbkV2ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuRXZlbnRJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzggJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUV2ZW50SW1wbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmVhbiBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi1wdWJsaWMgY2xhc3MgQmVhbkV2ZW50SW1wbCBleHRlbmRzIEphdmFFdmVudEltcGwgaW1wbGVtZW50cyBCZWFuRXZlbnR7Ci0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmVhbkV2ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmVhbkV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUywgRUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19PUkRFUkVEOgotCQkJCXJldHVybiBpc09yZGVyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VTklRVUU6Ci0JCQkJcmV0dXJuIGlzVW5pcXVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fTE9XRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldExvd2VyQm91bmQoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VUFBFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VXBwZXJCb3VuZCgpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX01BTlk6Ci0JCQkJcmV0dXJuIGlzTWFueSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRVRZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVUeXBlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19DSEFOR0VBQkxFOgotCQkJCXJldHVybiBpc0NoYW5nZWFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19WT0xBVElMRToKLQkJCQlyZXR1cm4gaXNWb2xhdGlsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gaXNUcmFuc2llbnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0RFRkFVTFRfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVU5TRVRUQUJMRToKLQkJCQlyZXR1cm4gaXNVbnNldHRhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVSSVZFRDoKLQkJCQlyZXR1cm4gaXNEZXJpdmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVVBQRVJfQk9VTkQ6Ci0JCQkJc2V0VXBwZXJCb3VuZCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fQ0hBTkdFQUJMRToKLQkJCQlzZXRDaGFuZ2VhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1ZPTEFUSUxFOgotCQkJCXNldFZvbGF0aWxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1RSQU5TSUVOVDoKLQkJCQlzZXRUcmFuc2llbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVU5TRVRUQUJMRToKLQkJCQlzZXRVbnNldHRhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0RFUklWRUQ6Ci0JCQkJc2V0RGVyaXZlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZChPUkRFUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKFVOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fTE9XRVJfQk9VTkQ6Ci0JCQkJc2V0TG93ZXJCb3VuZChMT1dFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVVBQRVJfQk9VTkQ6Ci0JCQkJc2V0VXBwZXJCb3VuZChVUFBFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRVRZUEU6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0NIQU5HRUFCTEU6Ci0JCQkJc2V0Q2hhbmdlYWJsZShDSEFOR0VBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19WT0xBVElMRToKLQkJCQlzZXRWb2xhdGlsZShWT0xBVElMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVFJBTlNJRU5UOgotCQkJCXNldFRyYW5zaWVudChUUkFOU0lFTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0RFRkFVTFRfVkFMVUVfTElURVJBTDoKLQkJCQlzZXREZWZhdWx0VmFsdWVMaXRlcmFsKERFRkFVTFRfVkFMVUVfTElURVJBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVU5TRVRUQUJMRToKLQkJCQlzZXRVbnNldHRhYmxlKFVOU0VUVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0RFUklWRUQ6Ci0JCQkJc2V0RGVyaXZlZChERVJJVkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19PUkRFUkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE9SREVSRURfRUZMQUcpICE9IDApICE9IE9SREVSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19VTklRVUU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVU5JUVVFX0VGTEFHKSAhPSAwKSAhPSBVTklRVUVfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbG93ZXJCb3VuZCAhPSBMT1dFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1VQUEVSX0JPVU5EOgotCQkJCXJldHVybiB1cHBlckJvdW5kICE9IFVQUEVSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgIT0gTUFOWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5CRUFOX0VWRU5UX19FVFlQRToKLQkJCQlyZXR1cm4gZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0NIQU5HRUFCTEU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQ0hBTkdFQUJMRV9FRkxBRykgIT0gMCkgIT0gQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1ZPTEFUSUxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwKSAhPSBWT0xBVElMRV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDApICE9IFRSQU5TSUVOVF9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0RFRkFVTFRfVkFMVUVfTElURVJBTDoKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0VmFsdWVMaXRlcmFsICE9IG51bGwgOiAhREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxULmVxdWFscyhkZWZhdWx0VmFsdWVMaXRlcmFsKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlRfX0RFRkFVTFRfVkFMVUU6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwgOiAhREVGQVVMVF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fVU5TRVRUQUJMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTlNFVFRBQkxFX0VGTEFHKSAhPSAwKSAhPSBVTlNFVFRBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fREVSSVZFRDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBERVJJVkVEX0VGTEFHKSAhPSAwKSAhPSBERVJJVkVEX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVDb250YWluaW5nQ2xhc3MoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5pbmZvRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5pbmZvRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkMjg1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9CZWFuaW5mb0ZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvRmFjdG9yeUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8wOS8xOSAxNTo0MzowMiAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBCZWFuaW5mb0ZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQmVhbmluZm9GYWN0b3J5ewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8JCi0JcHVibGljIEJlYW5pbmZvRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SOiByZXR1cm4gY3JlYXRlRmVhdHVyZURlY29yYXRvcigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuQkVBTl9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVCZWFuRGVjb3JhdG9yKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SOiByZXR1cm4gY3JlYXRlRXZlbnRTZXREZWNvcmF0b3IoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVNZXRob2REZWNvcmF0b3IoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1I6IHJldHVybiBjcmVhdGVQYXJhbWV0ZXJEZWNvcmF0b3IoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUjogcmV0dXJuIGNyZWF0ZUluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZOiByZXR1cm4gY3JlYXRlTWV0aG9kUHJveHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkJFQU5fRVZFTlQ6IHJldHVybiBjcmVhdGVCZWFuRXZlbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklNUExJQ0lUX0lURU06IHsKLQkJCQlJbXBsaWNpdEl0ZW0gcmVzdWx0ID0gSW1wbGljaXRJdGVtLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9WQUxVRToKLQkJCQlyZXR1cm4gY3JlYXRlRmVhdHVyZUF0dHJpYnV0ZVZhbHVlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU1QTElDSVRfSVRFTToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX1ZBTFVFOgotCQkJCXJldHVybiBjb252ZXJ0RmVhdHVyZUF0dHJpYnV0ZVZhbHVlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEZlYXR1cmVEZWNvcmF0b3IgY3JlYXRlRmVhdHVyZURlY29yYXRvcigpIHsKLQkJRmVhdHVyZURlY29yYXRvckltcGwgZmVhdHVyZURlY29yYXRvciA9IG5ldyBGZWF0dXJlRGVjb3JhdG9ySW1wbCgpOwotCQlmZWF0dXJlRGVjb3JhdG9yLnNldFNvdXJjZShGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmZWF0dXJlRGVjb3JhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIEV2ZW50U2V0RGVjb3JhdG9yIGNyZWF0ZUV2ZW50U2V0RGVjb3JhdG9yKCkgewotCQlFdmVudFNldERlY29yYXRvckltcGwgZXZlbnRTZXREZWNvcmF0b3IgPSBuZXcgRXZlbnRTZXREZWNvcmF0b3JJbXBsKCk7Ci0JCWV2ZW50U2V0RGVjb3JhdG9yLnNldFNvdXJjZShFdmVudFNldERlY29yYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gZXZlbnRTZXREZWNvcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFByb3h5IGNyZWF0ZU1ldGhvZFByb3h5KCkgewotCQlNZXRob2RQcm94eUltcGwgbWV0aG9kUHJveHkgPSBuZXcgTWV0aG9kUHJveHlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eURlY29yYXRvciBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcigpIHsKLQkJUHJvcGVydHlEZWNvcmF0b3JJbXBsIHByb3BlcnR5RGVjb3JhdG9yID0gbmV3IFByb3BlcnR5RGVjb3JhdG9ySW1wbCgpOwotCQlwcm9wZXJ0eURlY29yYXRvci5zZXRTb3VyY2UoUGFyYW1ldGVyRGVjb3JhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBwcm9wZXJ0eURlY29yYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgY3JlYXRlSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCkgewotCQlJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsIGluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciA9IG5ldyBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsKCk7Ci0JCWluZGV4ZWRQcm9wZXJ0eURlY29yYXRvci5zZXRTb3VyY2UoSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBpbmRleGVkUHJvcGVydHlEZWNvcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgQmVhbkRlY29yYXRvciBjcmVhdGVCZWFuRGVjb3JhdG9yKCkgewotCQlCZWFuRGVjb3JhdG9ySW1wbCBiZWFuRGVjb3JhdG9yID0gbmV3IEJlYW5EZWNvcmF0b3JJbXBsKCk7Ci0JCWJlYW5EZWNvcmF0b3Iuc2V0U291cmNlKEJlYW5EZWNvcmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGJlYW5EZWNvcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRGVjb3JhdG9yIGNyZWF0ZU1ldGhvZERlY29yYXRvcigpIHsKLQkJTWV0aG9kRGVjb3JhdG9ySW1wbCBtZXRob2REZWNvcmF0b3IgPSBuZXcgTWV0aG9kRGVjb3JhdG9ySW1wbCgpOwotCQltZXRob2REZWNvcmF0b3Iuc2V0U291cmNlKE1ldGhvZERlY29yYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gbWV0aG9kRGVjb3JhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFBhcmFtZXRlckRlY29yYXRvciBjcmVhdGVQYXJhbWV0ZXJEZWNvcmF0b3IoKSB7Ci0JCVBhcmFtZXRlckRlY29yYXRvckltcGwgcGFyYW1ldGVyRGVjb3JhdG9yID0gbmV3IFBhcmFtZXRlckRlY29yYXRvckltcGwoKTsKLQkJcGFyYW1ldGVyRGVjb3JhdG9yLnNldFNvdXJjZShQYXJhbWV0ZXJEZWNvcmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHBhcmFtZXRlckRlY29yYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmVhbmluZm9QYWNrYWdlIGdldEJlYW5pbmZvUGFja2FnZSgpIHsKLQkJcmV0dXJuIChCZWFuaW5mb1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmVhbmluZm9QYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCZWFuRXZlbnQgY3JlYXRlQmVhbkV2ZW50KCkgewotCQlCZWFuRXZlbnRJbXBsIGJlYW5FdmVudCA9IG5ldyBCZWFuRXZlbnRJbXBsKCk7Ci0JCXJldHVybiBiZWFuRXZlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcC5FbnRyeSBjcmVhdGVGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKSB7Ci0JCUZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwgZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5ID0gbmV3IEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwoKTsKLQkJcmV0dXJuIGZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBGZWF0dXJlQXR0cmlidXRlVmFsdWUgY3JlYXRlRmVhdHVyZUF0dHJpYnV0ZVZhbHVlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiBuZXcgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlKGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGZWF0dXJlQXR0cmlidXRlVmFsdWVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbmluZm9QYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvQmVhbmluZm9QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWViZjM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0JlYW5pbmZvUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvUGFja2FnZUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjA6MDk6NTEgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uRXZlbnRTZXREZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkZlYXR1cmVEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5QYXJhbWV0ZXJEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotcHVibGljIGNsYXNzIEJlYW5pbmZvUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBCZWFuaW5mb1BhY2thZ2V7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmVhdHVyZURlY29yYXRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiZWFuRGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZERlY29yYXRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFByb3h5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJlYW5FdmVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBpbXBsaWNpdEl0ZW1FRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBmZWF0dXJlQXR0cmlidXRlVmFsdWVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQmVhbmluZm9QYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJlYW5pbmZvUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQmVhbmluZm9QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEJlYW5pbmZvUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUJlYW5pbmZvUGFja2FnZUltcGwgdGhlQmVhbmluZm9QYWNrYWdlID0gKEJlYW5pbmZvUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQmVhbmluZm9QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEJlYW5pbmZvUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2VJbXBsLmluaXQoKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVCZWFuaW5mb1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVCZWFuaW5mb1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQmVhbmluZm9QYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVCZWFuaW5mb1BhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGZWF0dXJlRGVjb3JhdG9yKCkgewotCQlyZXR1cm4gZmVhdHVyZURlY29yYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0Rpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfU2hvcnREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0NhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfRXhwZXJ0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfSGlkZGVuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfUHJlZmVycmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfTWVyZ2VJbnRyb3NwZWN0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmVhdHVyZURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVEZWNvcmF0b3JfQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZURlY29yYXRvcl9JbXBsaWNpdGx5U2V0Qml0cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0RGVjb3JhdG9yRmxhZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGZWF0dXJlRGVjb3JhdG9yX0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXZlbnRTZXREZWNvcmF0b3IoKSB7Ci0JCXJldHVybiBldmVudFNldERlY29yYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFdmVudFNldERlY29yYXRvcl9JbkRlZmF1bHRFdmVudFNldCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXZlbnRTZXREZWNvcmF0b3JfVW5pY2FzdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfQWRkTGlzdGVuZXJNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX0xpc3RlbmVyTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFdmVudFNldERlY29yYXRvcl9SZW1vdmVMaXN0ZW5lck1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXZlbnRTZXREZWNvcmF0b3JfRXZlbnRBZGFwdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlldmVudFNldERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV2ZW50U2V0RGVjb3JhdG9yX1Nlckxpc3RNdGhkKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFByb3h5KCkgewotCQlyZXR1cm4gbWV0aG9kUHJveHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUHJveHlfTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUHJveHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnR5RGVjb3JhdG9yKCkgewotCQlyZXR1cm4gcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlEZWNvcmF0b3JfQm91bmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0NvbnN0cmFpbmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9EZXNpZ25UaW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9BbHdheXNJbmNvbXBhdGlibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5RGVjb3JhdG9yX0ZpbHRlckZsYWdzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9GaWVsZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9Qcm9wZXJ0eUVkaXRvckNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9SZWFkTWV0aG9kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9wZXJ0eURlY29yYXRvcl9Xcml0ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKCkgewotCQlyZXR1cm4gaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkUmVhZE1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcl9JbmRleGVkV3JpdGVNZXRob2QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbmRleGVkUHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJlYW5EZWNvcmF0b3IoKSB7Ci0JCXJldHVybiBiZWFuRGVjb3JhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlclByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJFdmVudHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RNZXRob2RzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdEV2ZW50cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCZWFuRGVjb3JhdG9yX0N1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2REZWNvcmF0b3IoKSB7Ci0JCXJldHVybiBtZXRob2REZWNvcmF0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRGVjb3JhdG9yX1Bhcm1zRXhwbGljaXRFbXB0eSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZERlY29yYXRvcl9QYXJhbWV0ZXJEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZERlY29yYXRvcl9TZXJQYXJtRGVzYygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZERlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyYW1ldGVyRGVjb3JhdG9yKCkgewotCQlyZXR1cm4gcGFyYW1ldGVyRGVjb3JhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhcmFtZXRlckRlY29yYXRvcl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFyYW1ldGVyRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRGZWF0dXJlQXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBmZWF0dXJlQXR0cmlidXRlVmFsdWVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJlYW5pbmZvRmFjdG9yeSBnZXRCZWFuaW5mb0ZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQmVhbmluZm9GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRkVBVFVSRV9ERUNPUkFUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19ESVNQTEFZX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX0NBVEVHT1JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fRVhQRVJUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZURlY29yYXRvckVDbGFzcywgRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBGRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTKTsKLQotCQliZWFuRGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJFQU5fREVDT1JBVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fTUVSR0VfU1VQRVJfUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX01FUkdFX1NVUEVSX01FVEhPRFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19NRVJHRV9TVVBFUl9FVkVOVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX1BST1BFUlRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX01FVEhPRFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJlYW5EZWNvcmF0b3JFQ2xhc3MsIEJFQU5fREVDT1JBVE9SX19JTlRST1NQRUNUX0VWRU5UUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX0RPX0JFQU5JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9QUk9QRVJUWV9OQU1FUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX05PVF9JTkhFUklURURfTUVUSE9EX05BTUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShiZWFuRGVjb3JhdG9yRUNsYXNzLCBCRUFOX0RFQ09SQVRPUl9fTk9UX0lOSEVSSVRFRF9FVkVOVF9OQU1FUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYmVhbkRlY29yYXRvckVDbGFzcywgQkVBTl9ERUNPUkFUT1JfX0NVU1RPTUlaRVJfQ0xBU1MpOwotCi0JCWV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVWRU5UX1NFVF9ERUNPUkFUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19JTl9ERUZBVUxUX0VWRU5UX1NFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX1VOSUNBU1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShldmVudFNldERlY29yYXRvckVDbGFzcywgRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVNT1ZFX0xJU1RFTkVSX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MsIEVWRU5UX1NFVF9ERUNPUkFUT1JfX0VWRU5UX0FEQVBURVJfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV2ZW50U2V0RGVjb3JhdG9yRUNsYXNzLCBFVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEKTsKLQotCQltZXRob2REZWNvcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0RFQ09SQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRGVjb3JhdG9yRUNsYXNzLCBNRVRIT0RfREVDT1JBVE9SX19QQVJNU19FWFBMSUNJVF9FTVBUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRGVjb3JhdG9yRUNsYXNzLCBNRVRIT0RfREVDT1JBVE9SX19QQVJBTUVURVJfREVTQ1JJUFRPUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZERlY29yYXRvckVDbGFzcywgTUVUSE9EX0RFQ09SQVRPUl9fU0VSX1BBUk1fREVTQyk7Ci0KLQkJcGFyYW1ldGVyRGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUkFNRVRFUl9ERUNPUkFUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHBhcmFtZXRlckRlY29yYXRvckVDbGFzcywgUEFSQU1FVEVSX0RFQ09SQVRPUl9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocGFyYW1ldGVyRGVjb3JhdG9yRUNsYXNzLCBQQVJBTUVURVJfREVDT1JBVE9SX19QQVJBTUVURVIpOwotCi0JCXByb3BlcnR5RGVjb3JhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST1BFUlRZX0RFQ09SQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fQUxXQVlTX0lOQ09NUEFUSUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eURlY29yYXRvckVDbGFzcywgUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIFBST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQpOwotCi0JCWluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9SRUFEX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBJTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0QpOwotCi0JCW1ldGhvZFByb3h5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QUk9YWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUHJveHlFQ2xhc3MsIE1FVEhPRF9QUk9YWV9fTUVUSE9EKTsKLQotCQliZWFuRXZlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQkVBTl9FVkVOVCk7Ci0KLQkJZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5RUNsYXNzLCBGRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX0tFWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5RUNsYXNzLCBGRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX1ZBTFVFKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJaW1wbGljaXRJdGVtRUVudW0gPSBjcmVhdGVFRW51bShJTVBMSUNJVF9JVEVNKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlmZWF0dXJlQXR0cmlidXRlVmFsdWVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRkVBVFVSRV9BVFRSSUJVVEVfVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVBbm5vdGF0aW9uKCkpOwotCQliZWFuRGVjb3JhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmVhdHVyZURlY29yYXRvcigpKTsKLQkJZXZlbnRTZXREZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlRGVjb3JhdG9yKCkpOwotCQltZXRob2REZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlRGVjb3JhdG9yKCkpOwotCQlwYXJhbWV0ZXJEZWNvcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlRGVjb3JhdG9yKCkpOwotCQlwcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZlYXR1cmVEZWNvcmF0b3IoKSk7Ci0JCWluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb3BlcnR5RGVjb3JhdG9yKCkpOwotCQltZXRob2RQcm94eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RU9wZXJhdGlvbigpKTsKLQkJYmVhbkV2ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFFdmVudCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGZlYXR1cmVEZWNvcmF0b3JFQ2xhc3MsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICJGZWF0dXJlRGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0Rpc3BsYXlOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNwbGF5TmFtZSIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZURlY29yYXRvcl9TaG9ydERlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzaG9ydERlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0NhdGVnb3J5KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjYXRlZ29yeSIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfRXhwZXJ0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZXhwZXJ0IiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0hpZGRlbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImhpZGRlbiIsIG51bGwsIDAsIDEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZURlY29yYXRvcl9QcmVmZXJyZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcmVmZXJyZWQiLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVEZWNvcmF0b3JfTWVyZ2VJbnRyb3NwZWN0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibWVyZ2VJbnRyb3NwZWN0aW9uIiwgInRydWUiLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkiLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0bHlTZXRCaXRzKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAiaW1wbGljaXRseVNldEJpdHMiLCBudWxsLCAwLCAxLCBGZWF0dXJlRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGZWF0dXJlRGVjb3JhdG9yX0ltcGxpY2l0RGVjb3JhdG9yRmxhZygpLCB0aGlzLmdldEltcGxpY2l0SXRlbSgpLCAiaW1wbGljaXREZWNvcmF0b3JGbGFnIiwgbnVsbCwgMCwgMSwgRmVhdHVyZURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmVhdHVyZURlY29yYXRvcl9BdHRyaWJ1dGVzKCksIHRoaXMuZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCksIG51bGwsICJhdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIEZlYXR1cmVEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihmZWF0dXJlRGVjb3JhdG9yRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0TmFtZSIpOwotCi0JCWluaXRFQ2xhc3MoYmVhbkRlY29yYXRvckVDbGFzcywgQmVhbkRlY29yYXRvci5jbGFzcywgIkJlYW5EZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfTWVyZ2VTdXBlclByb3BlcnRpZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJtZXJnZVN1cGVyUHJvcGVydGllcyIsICJ0cnVlIiwgMCwgMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX01lcmdlU3VwZXJNZXRob2RzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibWVyZ2VTdXBlck1ldGhvZHMiLCAidHJ1ZSIsIDAsIDEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9NZXJnZVN1cGVyRXZlbnRzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibWVyZ2VTdXBlckV2ZW50cyIsICJ0cnVlIiwgMCwgMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCZWFuRGVjb3JhdG9yX0ludHJvc3BlY3RQcm9wZXJ0aWVzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW50cm9zcGVjdFByb3BlcnRpZXMiLCAidHJ1ZSIsIDAsIDEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfSW50cm9zcGVjdE1ldGhvZHMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpbnRyb3NwZWN0TWV0aG9kcyIsICJ0cnVlIiwgMCwgMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9JbnRyb3NwZWN0RXZlbnRzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW50cm9zcGVjdEV2ZW50cyIsICJ0cnVlIiwgMCwgMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9Eb0JlYW5pbmZvKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZG9CZWFuaW5mbyIsICJ0cnVlIiwgMCwgMSwgQmVhbkRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmVhbkRlY29yYXRvcl9Ob3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzIiwgbnVsbCwgMCwgLTEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkTWV0aG9kTmFtZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5vdEluaGVyaXRlZE1ldGhvZE5hbWVzIiwgbnVsbCwgMCwgLTEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkRXZlbnROYW1lcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibm90SW5oZXJpdGVkRXZlbnROYW1lcyIsIG51bGwsIDAsIC0xLCBCZWFuRGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRCZWFuRGVjb3JhdG9yX0N1c3RvbWl6ZXJDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImN1c3RvbWl6ZXJDbGFzcyIsIG51bGwsIDAsIDEsIEJlYW5EZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhldmVudFNldERlY29yYXRvckVDbGFzcywgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICJFdmVudFNldERlY29yYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXZlbnRTZXREZWNvcmF0b3JfSW5EZWZhdWx0RXZlbnRTZXQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpbkRlZmF1bHRFdmVudFNldCIsIG51bGwsIDAsIDEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV2ZW50U2V0RGVjb3JhdG9yX1VuaWNhc3QoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ1bmljYXN0IiwgbnVsbCwgMCwgMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXZlbnRTZXREZWNvcmF0b3JfTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkiLCBudWxsLCAwLCAxLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXZlbnRTZXREZWNvcmF0b3JfQWRkTGlzdGVuZXJNZXRob2QoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0TWV0aG9kKCksIG51bGwsICJhZGRMaXN0ZW5lck1ldGhvZCIsIG51bGwsIDEsIDEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lck1ldGhvZHMoKSwgdGhpcy5nZXRNZXRob2RQcm94eSgpLCBudWxsLCAibGlzdGVuZXJNZXRob2RzIiwgbnVsbCwgMSwgLTEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFdmVudFNldERlY29yYXRvcl9MaXN0ZW5lclR5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsaXN0ZW5lclR5cGUiLCBudWxsLCAxLCAxLCBFdmVudFNldERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXZlbnRTZXREZWNvcmF0b3JfUmVtb3ZlTGlzdGVuZXJNZXRob2QoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0TWV0aG9kKCksIG51bGwsICJyZW1vdmVMaXN0ZW5lck1ldGhvZCIsIG51bGwsIDEsIDEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFdmVudFNldERlY29yYXRvcl9FdmVudEFkYXB0ZXJDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImV2ZW50QWRhcHRlckNsYXNzIiwgbnVsbCwgMCwgMSwgRXZlbnRTZXREZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV2ZW50U2V0RGVjb3JhdG9yX1Nlckxpc3RNdGhkKCksIHRoaXMuZ2V0TWV0aG9kUHJveHkoKSwgbnVsbCwgInNlckxpc3RNdGhkIiwgbnVsbCwgMSwgLTEsIEV2ZW50U2V0RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kRGVjb3JhdG9yRUNsYXNzLCBNZXRob2REZWNvcmF0b3IuY2xhc3MsICJNZXRob2REZWNvcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZERlY29yYXRvcl9QYXJtc0V4cGxpY2l0RW1wdHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwYXJtc0V4cGxpY2l0RW1wdHkiLCBudWxsLCAwLCAxLCBNZXRob2REZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZERlY29yYXRvcl9QYXJhbWV0ZXJEZXNjcmlwdG9ycygpLCB0aGlzLmdldFBhcmFtZXRlckRlY29yYXRvcigpLCBudWxsLCAicGFyYW1ldGVyRGVzY3JpcHRvcnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kRGVjb3JhdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2REZWNvcmF0b3JfU2VyUGFybURlc2MoKSwgdGhpcy5nZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKSwgbnVsbCwgInNlclBhcm1EZXNjIiwgbnVsbCwgMCwgLTEsIE1ldGhvZERlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBhcmFtZXRlckRlY29yYXRvckVDbGFzcywgUGFyYW1ldGVyRGVjb3JhdG9yLmNsYXNzLCAiUGFyYW1ldGVyRGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbWV0ZXJEZWNvcmF0b3JfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFBhcmFtZXRlckRlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYW1ldGVyRGVjb3JhdG9yX1BhcmFtZXRlcigpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhUGFyYW1ldGVyKCksIG51bGwsICJwYXJhbWV0ZXIiLCBudWxsLCAwLCAxLCBQYXJhbWV0ZXJEZWNvcmF0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIlByb3BlcnR5RGVjb3JhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eURlY29yYXRvcl9Cb3VuZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImJvdW5kIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlEZWNvcmF0b3JfQ29uc3RyYWluZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJjb25zdHJhaW5lZCIsIG51bGwsIDAsIDEsIFByb3BlcnR5RGVjb3JhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5RGVjb3JhdG9yX0Rlc2lnblRpbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkZXNpZ25UaW1lIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlEZWNvcmF0b3JfQWx3YXlzSW5jb21wYXRpYmxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYWx3YXlzSW5jb21wYXRpYmxlIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5RGVjb3JhdG9yX0ZpbHRlckZsYWdzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmaWx0ZXJGbGFncyIsIG51bGwsIDAsIC0xLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGRSZWFkT25seSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpZWxkUmVhZE9ubHkiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvcGVydHlEZWNvcmF0b3JfUHJvcGVydHlFZGl0b3JDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInByb3BlcnR5RWRpdG9yQ2xhc3MiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvcGVydHlEZWNvcmF0b3JfUmVhZE1ldGhvZCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRNZXRob2QoKSwgbnVsbCwgInJlYWRNZXRob2QiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsIElTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9wZXJ0eURlY29yYXRvcl9Xcml0ZU1ldGhvZCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRNZXRob2QoKSwgbnVsbCwgIndyaXRlTWV0aG9kIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCBJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvcGVydHlEZWNvcmF0b3JfRmllbGQoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0RmllbGQoKSwgbnVsbCwgImZpZWxkIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCBJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlhZGRFT3BlcmF0aW9uKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoKSwgImdldFByb3BlcnR5VHlwZSIpOwotCi0JCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKHByb3BlcnR5RGVjb3JhdG9yRUNsYXNzLCBudWxsLCAic2V0UHJvcGVydHlUeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3NpZmllcigpLCAicHJvcGVydHlUeXBlIik7Ci0KLQkJaW5pdEVDbGFzcyhpbmRleGVkUHJvcGVydHlEZWNvcmF0b3JFQ2xhc3MsIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRSZWFkTWV0aG9kKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldE1ldGhvZCgpLCBudWxsLCAiaW5kZXhlZFJlYWRNZXRob2QiLCBudWxsLCAwLCAxLCBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCBJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yX0luZGV4ZWRXcml0ZU1ldGhvZCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRNZXRob2QoKSwgbnVsbCwgImluZGV4ZWRXcml0ZU1ldGhvZCIsIG51bGwsIDAsIDEsIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsIElTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kUHJveHlFQ2xhc3MsIE1ldGhvZFByb3h5LmNsYXNzLCAiTWV0aG9kUHJveHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFByb3h5X01ldGhvZCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRNZXRob2QoKSwgbnVsbCwgIm1ldGhvZCIsIG51bGwsIDEsIDEsIE1ldGhvZFByb3h5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYmVhbkV2ZW50RUNsYXNzLCBCZWFuRXZlbnQuY2xhc3MsICJCZWFuRXZlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3MsIE1hcC5FbnRyeS5jbGFzcywgIkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeV9LZXkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImtleSIsIG51bGwsIDAsIDEsIE1hcC5FbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5X1ZhbHVlKCksIHRoaXMuZ2V0RmVhdHVyZUF0dHJpYnV0ZVZhbHVlKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIE1hcC5FbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oaW1wbGljaXRJdGVtRUVudW0sIEltcGxpY2l0SXRlbS5jbGFzcywgIkltcGxpY2l0SXRlbSIpOwotCQlhZGRFRW51bUxpdGVyYWwoaW1wbGljaXRJdGVtRUVudW0sIEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChpbXBsaWNpdEl0ZW1FRW51bSwgSW1wbGljaXRJdGVtLklNUExJQ0lUX0RFQ09SQVRPUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGltcGxpY2l0SXRlbUVFbnVtLCBJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUwpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGZlYXR1cmVBdHRyaWJ1dGVWYWx1ZUVEYXRhVHlwZSwgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlLmNsYXNzLCAiRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmVhbkRlY29yYXRvcl9Eb0JlYW5pbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCZWFuRGVjb3JhdG9yX05vdEluaGVyaXRlZE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmVhbkRlY29yYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJlYW5EZWNvcmF0b3JfTm90SW5oZXJpdGVkRXZlbnROYW1lcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJlYW5EZWNvcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJhbWV0ZXJEZWNvcmF0b3JfUGFyYW1ldGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGFyYW1ldGVyRGVjb3JhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCZWFuRXZlbnQoKSB7Ci0JCXJldHVybiBiZWFuRXZlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkoKSB7Ci0JCXJldHVybiBmZWF0dXJlQXR0cmlidXRlTWFwRW50cnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5X0tleSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRJbXBsaWNpdEl0ZW0oKSB7Ci0JCXJldHVybiBpbXBsaWNpdEl0ZW1FRW51bTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0V2ZW50U2V0RGVjb3JhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvRXZlbnRTZXREZWNvcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjM0MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvRXZlbnRTZXREZWNvcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEV2ZW50U2V0RGVjb3JhdG9ySW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNSAkICAkRGF0ZTogMjAwNS8wOS8xOSAxNTo0MzowMiAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkV2ZW50U2V0RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXZlbnQgU2V0IERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2lzSW5EZWZhdWx0RXZlbnRTZXQgPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjaXNVbmljYXN0IDxlbT5VbmljYXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5IDxlbT5MaXN0ZW5lciBNZXRob2RzIEV4cGxpY2l0IEVtcHR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjZ2V0QWRkTGlzdGVuZXJNZXRob2QgPGVtPkFkZCBMaXN0ZW5lciBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNnZXRMaXN0ZW5lck1ldGhvZHMgPGVtPkxpc3RlbmVyIE1ldGhvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNnZXRMaXN0ZW5lclR5cGUgPGVtPkxpc3RlbmVyIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkV2ZW50U2V0RGVjb3JhdG9ySW1wbCNnZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCA8ZW0+UmVtb3ZlIExpc3RlbmVyIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRXZlbnRTZXREZWNvcmF0b3JJbXBsI2dldEV2ZW50QWRhcHRlckNsYXNzIDxlbT5FdmVudCBBZGFwdGVyIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5FdmVudFNldERlY29yYXRvckltcGwjZ2V0U2VyTGlzdE10aGQgPGVtPlNlciBMaXN0IE10aGQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgRXZlbnRTZXREZWNvcmF0b3JJbXBsIGV4dGVuZHMgRmVhdHVyZURlY29yYXRvckltcGwgaW1wbGVtZW50cyBFdmVudFNldERlY29yYXRvcnsKLQkKLQkvKioKLQkgKiBCaXRzIGZvciBpbXBsaWNpdGx5IHNldCBmZWF0dXJlcy4gVGhpcyBpcyBpbnRlcm5hbCwgbm90IG1lYW50IGZvciBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFVkVOVF9BRERMSVNURU5FUk1FVEhPRF9JTVBMSUNJVCA9IDB4MUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVWRU5UX0FEQVBURVJDTEFTU19JTVBMSUNJVCA9IDB4Mkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVWRU5UX0xJU1RFTkVSTUVUSE9EU19JTVBMSUNJVCA9IDB4NEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVWRU5UX0xJU1RFTkVSVFlQRV9JTVBMSUNJVCA9IDB4OEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVWRU5UX1JFTU9WRUxJU1RFTkVSTUVUSE9EX0lNUExJQ0lUID0gMHgxMEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVWRU5UX0RFRkFVTFRFVkVOVFNFVF9JTVBMSUNJVCA9IDB4MjBMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFVkVOVF9VTklDQVNUX0lNUExJQ0lUID0gMHg0MEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVWRU5UX0xJU1RFTkVSTUVUSE9EU19ERUZBVUxUID0gMHg4MEw7Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luRGVmYXVsdEV2ZW50U2V0KCkgPGVtPkluIERlZmF1bHQgRXZlbnQgU2V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0luRGVmYXVsdEV2ZW50U2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5fREVGQVVMVF9FVkVOVF9TRVRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW5EZWZhdWx0RXZlbnRTZXQoKSA8ZW0+SW4gRGVmYXVsdCBFdmVudCBTZXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW5EZWZhdWx0RXZlbnRTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHID0gMSA8PCAxODsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBJbiBEZWZhdWx0IEV2ZW50IFNldCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5fREVGQVVMVF9FVkVOVF9TRVRfRVNFVEZMQUcgPSAxIDw8IDE5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5pY2FzdCgpIDxlbT5VbmljYXN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VuaWNhc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTklDQVNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuaWNhc3QoKSA8ZW0+VW5pY2FzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVbmljYXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBVTklDQVNUX0VGTEFHID0gMSA8PCAyMDsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBVbmljYXN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBVTklDQVNUX0VTRVRGTEFHID0gMSA8PCAyMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKSA8ZW0+TGlzdGVuZXIgTWV0aG9kcyBFeHBsaWNpdCBFbXB0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkgPGVtPkxpc3RlbmVyIE1ldGhvZHMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FRkxBRyA9IDEgPDwgMjI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRMaXN0ZW5lck1ldGhvZCgpIDxlbT5BZGQgTGlzdGVuZXIgTWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRMaXN0ZW5lck1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZCBhZGRMaXN0ZW5lck1ldGhvZCA9IG51bGw7Ci0JCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlzdGVuZXJUeXBlKCkgPGVtPkxpc3RlbmVyIFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpc3RlbmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBsaXN0ZW5lclR5cGUgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkgPGVtPlJlbW92ZSBMaXN0ZW5lciBNZXRob2Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIHJlbW92ZUxpc3RlbmVyTWV0aG9kID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFdmVudEFkYXB0ZXJDbGFzcygpIDxlbT5FdmVudCBBZGFwdGVyIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFdmVudEFkYXB0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBldmVudEFkYXB0ZXJDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJMaXN0TXRoZCgpIDxlbT5TZXIgTGlzdCBNdGhkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlckxpc3RNdGhkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VyTGlzdE10aGQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCQotCXByb3RlY3RlZCBFdmVudFNldERlY29yYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbkRlZmF1bHRFdmVudFNldCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbkRlZmF1bHRFdmVudFNldChib29sZWFuIG5ld0luRGVmYXVsdEV2ZW50U2V0KSB7Ci0JCWJvb2xlYW4gb2xkSW5EZWZhdWx0RXZlbnRTZXQgPSAoZUZsYWdzICYgSU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdJbkRlZmF1bHRFdmVudFNldCkgZUZsYWdzIHw9IElOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+SU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkSW5EZWZhdWx0RXZlbnRTZXRFU2V0ID0gKGVGbGFncyAmIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gSU5fREVGQVVMVF9FVkVOVF9TRVRfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTl9ERUZBVUxUX0VWRU5UX1NFVCwgb2xkSW5EZWZhdWx0RXZlbnRTZXQsIG5ld0luRGVmYXVsdEV2ZW50U2V0LCAhb2xkSW5EZWZhdWx0RXZlbnRTZXRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbkRlZmF1bHRFdmVudFNldCgpIHsKLQkJYm9vbGVhbiBvbGRJbkRlZmF1bHRFdmVudFNldCA9IChlRmxhZ3MgJiBJTl9ERUZBVUxUX0VWRU5UX1NFVF9FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRJbkRlZmF1bHRFdmVudFNldEVTZXQgPSAoZUZsYWdzICYgSU5fREVGQVVMVF9FVkVOVF9TRVRfRVNFVEZMQUcpICE9IDA7Ci0JCWlmIChJTl9ERUZBVUxUX0VWRU5UX1NFVF9FREVGQVVMVCkgZUZsYWdzIHw9IElOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+SU5fREVGQVVMVF9FVkVOVF9TRVRfRUZMQUc7Ci0JCWVGbGFncyAmPSB+SU5fREVGQVVMVF9FVkVOVF9TRVRfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VULCBvbGRJbkRlZmF1bHRFdmVudFNldCwgSU5fREVGQVVMVF9FVkVOVF9TRVRfRURFRkFVTFQsIG9sZEluRGVmYXVsdEV2ZW50U2V0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW5EZWZhdWx0RXZlbnRTZXQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgSU5fREVGQVVMVF9FVkVOVF9TRVRfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbmljYXN0KCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFVOSUNBU1RfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pY2FzdChib29sZWFuIG5ld1VuaWNhc3QpIHsKLQkJYm9vbGVhbiBvbGRVbmljYXN0ID0gKGVGbGFncyAmIFVOSUNBU1RfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdVbmljYXN0KSBlRmxhZ3MgfD0gVU5JQ0FTVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflVOSUNBU1RfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkVW5pY2FzdEVTZXQgPSAoZUZsYWdzICYgVU5JQ0FTVF9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IFVOSUNBU1RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19VTklDQVNULCBvbGRVbmljYXN0LCBuZXdVbmljYXN0LCAhb2xkVW5pY2FzdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVuaWNhc3QoKSB7Ci0JCWJvb2xlYW4gb2xkVW5pY2FzdCA9IChlRmxhZ3MgJiBVTklDQVNUX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZFVuaWNhc3RFU2V0ID0gKGVGbGFncyAmIFVOSUNBU1RfRVNFVEZMQUcpICE9IDA7Ci0JCWlmIChVTklDQVNUX0VERUZBVUxUKSBlRmxhZ3MgfD0gVU5JQ0FTVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflVOSUNBU1RfRUZMQUc7Ci0JCWVGbGFncyAmPSB+VU5JQ0FTVF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fVU5JQ0FTVCwgb2xkVW5pY2FzdCwgVU5JQ0FTVF9FREVGQVVMVCwgb2xkVW5pY2FzdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVuaWNhc3QoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgVU5JQ0FTVF9FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KGJvb2xlYW4gbmV3TGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSkgewotCQlib29sZWFuIG9sZExpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgPSAoZUZsYWdzICYgTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkpIGVGbGFncyB8PSBMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+TElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFksIG9sZExpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHksIG5ld0xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldEFkZExpc3RlbmVyTWV0aG9kKCkgewotCQlpZiAoYWRkTGlzdGVuZXJNZXRob2QgIT0gbnVsbCAmJiBhZGRMaXN0ZW5lck1ldGhvZC5lSXNQcm94eSgpKSB7Ci0JCQlNZXRob2Qgb2xkQWRkTGlzdGVuZXJNZXRob2QgPSBhZGRMaXN0ZW5lck1ldGhvZDsKLQkJCWFkZExpc3RlbmVyTWV0aG9kID0gKE1ldGhvZCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpYWRkTGlzdGVuZXJNZXRob2QpOwotCQkJaWYgKGFkZExpc3RlbmVyTWV0aG9kICE9IG9sZEFkZExpc3RlbmVyTWV0aG9kKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FERF9MSVNURU5FUl9NRVRIT0QsIG9sZEFkZExpc3RlbmVyTWV0aG9kLCBhZGRMaXN0ZW5lck1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGRMaXN0ZW5lck1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0QWRkTGlzdGVuZXJNZXRob2QoKSB7Ci0JCXJldHVybiBhZGRMaXN0ZW5lck1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRMaXN0ZW5lck1ldGhvZChNZXRob2QgbmV3QWRkTGlzdGVuZXJNZXRob2QpIHsKLQkJTWV0aG9kIG9sZEFkZExpc3RlbmVyTWV0aG9kID0gYWRkTGlzdGVuZXJNZXRob2Q7Ci0JCWFkZExpc3RlbmVyTWV0aG9kID0gbmV3QWRkTGlzdGVuZXJNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BRERfTElTVEVORVJfTUVUSE9ELCBvbGRBZGRMaXN0ZW5lck1ldGhvZCwgYWRkTGlzdGVuZXJNZXRob2QpKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0TGlzdGVuZXJNZXRob2RzKCkgewotCQlpZiAoIWlzTGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgpICYmIGdldFNlckxpc3RNdGhkKCkuaXNFbXB0eSgpICYmIChnZXRJbXBsaWNpdGx5U2V0Qml0cygpJihFVkVOVF9MSVNURU5FUk1FVEhPRFNfSU1QTElDSVQgfCBFVkVOVF9MSVNURU5FUk1FVEhPRFNfREVGQVVMVCkpID09IDApIHsKLQkJCS8vIE5vdCBleHBsaWNpdGx5IGVtcHR5LCBpdCBpcyBlbXB0eSwgYW5kIHdlIGhhdmUgbm90IGltcGxpY2l0bHkgb3IgYnkgZGVmYXVsdHMgbWFkZSBpdCBlbXB0eSwgdGhlbiBjcmVhdGUgdGhlIGRlZmF1bHRzLgotCQkJY3JlYXRlRGVmYXVsdExpc3RlbmVyTWV0aG9kc0xpc3QoKTsKLQkJfQotCQlyZXR1cm4gZ2V0U2VyTGlzdE10aGQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TGlzdGVuZXJNZXRob2RzR2VuKCkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnTGlzdGVuZXIgTWV0aG9kcycgcmVmZXJlbmNlIGxpc3QKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRMaXN0ZW5lclR5cGUoKSB7Ci0JCWlmIChsaXN0ZW5lclR5cGUgIT0gbnVsbCAmJiBsaXN0ZW5lclR5cGUuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZExpc3RlbmVyVHlwZSA9IGxpc3RlbmVyVHlwZTsKLQkJCWxpc3RlbmVyVHlwZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWxpc3RlbmVyVHlwZSk7Ci0JCQlpZiAobGlzdGVuZXJUeXBlICE9IG9sZExpc3RlbmVyVHlwZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFLCBvbGRMaXN0ZW5lclR5cGUsIGxpc3RlbmVyVHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0ZW5lclR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgaWYgbWV0aG9kIGxpc3RlbmVycyBsaXN0IG5vdCBleHBsaWNpdGx5IHNldCBhbmQgdGhlcmUgaXMgbm8gZmVhdHVyZSBwcm94eSBvcgotCSAqIHRoZXJlIGlzIGEgZmVhdHVyZSBwcm94eSBhbmQgdGhlIHByb3h5IGhhcyBub3RoaW5nIGRlZmluZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCBieSBCZWFuSW5mbyBjbGFzc2VzLiBJdCBpcyBub3QgdG8gYmUgdXNlZCBieSBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBFTGlzdCBjcmVhdGVEZWZhdWx0TGlzdGVuZXJNZXRob2RzTGlzdCgpIHsKLQkJaWYgKCFlSXNTZXQoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQW5ub3RhdGlvbl9FTW9kZWxFbGVtZW50KCkpKQotCQkJcmV0dXJuIHRoaXMuZ2V0U2VyTGlzdE10aGQoKTsJLy8gV2UgYXJlIG5vdCBhdHRhY2hlZCwgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBsaXN0IHlldC4KLQkJRUxpc3QgbXRoZHNMaXN0ID0gdGhpcy5nZXRTZXJMaXN0TXRoZCgpOwkJCi0JCQkKLQkJSmF2YUNsYXNzIGV2ZW50T2JqZWN0Q2xhc3MgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmEudXRpbC5FdmVudE9iamVjdCIsIGdldEVNb2RlbEVsZW1lbnQoKS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbXRoZHNMaXN0LmNsZWFyKCk7Ci0JCQotCQkvLyBUaGlzIGlzIGEgbGl0dGxlIHRyaWNreS4gTmVlZCB0byBnZXQgdGhlIG1ldGhvZHMgZm9yIHRoZSBsaXN0ZW5lciB0eXBlLCBhbmQKLQkJLy8gdGhlbiBnbyB0aHJvdWdoIHRoZSBtZXRob2RzIGFuZCBmaWx0ZXIgb3V0IHRoZSBub24tZXZlbnQgb25lcy4KLQkJSmF2YUNsYXNzIGx0ID0gZ2V0TGlzdGVuZXJUeXBlKCk7Ci0JCWlmIChsdCA9PSBudWxsKQotCQkJcmV0dXJuIG10aGRzTGlzdDsJLy8gQ291bGRuJ3QgZ2V0IHRoZSBsaXN0ZW5lciB0eXBlIGZvciBzb21lIHJlYXNvbiwgc28gbGVhdmUgYXMgaXMuCi0JCXNldEltcGxpY2l0bHlTZXRCaXRzKGdldEltcGxpY2l0bHlTZXRCaXRzKCl8RVZFTlRfTElTVEVORVJNRVRIT0RTX0RFRkFVTFQpOwkvLyBNYXJrIGFzIHdlIGltcGxpY2l0bHkgZmlsbGVkIGl0IGluLgotCQkKLQkJQmVhbmluZm9GYWN0b3J5IGJmYWN0ID0gQmVhbmluZm9GYWN0b3J5LmVJTlNUQU5DRTsKLQkJTGlzdCBtcyA9IGx0LmdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCgpOwotCQlpbnQgbXNpemUgPSBtcy5zaXplKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxtc2l6ZTsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgbXMuZ2V0KGkpOwotCQkJTGlzdCBwYXJtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCQlpZiAocGFybXMuc2l6ZSgpICE9IDEpCi0JCQkJY29udGludWU7CS8vIE11c3QgaGF2ZSBvbmx5IG9uZSBwYXJtLgotCQkJaWYgKCFldmVudE9iamVjdENsYXNzLmlzQXNzaWduYWJsZUZyb20oKChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoMCkpLmdldEVUeXBlKCkpKQotCQkJCWNvbnRpbnVlOwkvLyBQYXJtIGRvZXMgbm90IGluaGVyaXQgZnJvbSBqYXZhLnV0aWwuRXZlbnRPYmplY3QKLQkJCQkKLQkJCS8vIFdlIG5lZWQgYSBtZXRob2QgcHJveHksIGFuZCBhIG1ldGhvZCBkZWNvcmF0b3IuCi0JCQlNZXRob2RQcm94eSBtcHJveHkgPSBiZmFjdC5jcmVhdGVNZXRob2RQcm94eSgpOwotCQkJbXByb3h5LnNldE1ldGhvZChtZXRob2QpOwotCQkJbXByb3h5LnNldE5hbWUobWV0aG9kLmdldE5hbWUoKSk7CQkJCi0JCQlNZXRob2REZWNvcmF0b3IgbWQgPSBiZmFjdC5jcmVhdGVNZXRob2REZWNvcmF0b3IoKTsKLQkJCW1kLnNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJbXBsaWNpdEl0ZW0uSU1QTElDSVRfREVDT1JBVE9SX0FORF9GRUFUVVJFX0xJVEVSQUwpOwotCQkJbWQuc2V0RU1vZGVsRWxlbWVudChtcHJveHkpOwkJCQotCQkJbXRoZHNMaXN0LmFkZChtcHJveHkpOwotCQl9Ci0JCXJldHVybiBtdGhkc0xpc3Q7Ci0JfQkKLQkKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBsaXN0ZW5lclR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJUeXBlKEphdmFDbGFzcyBuZXdMaXN0ZW5lclR5cGUpIHsKLQkJSmF2YUNsYXNzIG9sZExpc3RlbmVyVHlwZSA9IGxpc3RlbmVyVHlwZTsKLQkJbGlzdGVuZXJUeXBlID0gbmV3TGlzdGVuZXJUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfVFlQRSwgb2xkTGlzdGVuZXJUeXBlLCBsaXN0ZW5lclR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkgewotCQlpZiAocmVtb3ZlTGlzdGVuZXJNZXRob2QgIT0gbnVsbCAmJiByZW1vdmVMaXN0ZW5lck1ldGhvZC5lSXNQcm94eSgpKSB7Ci0JCQlNZXRob2Qgb2xkUmVtb3ZlTGlzdGVuZXJNZXRob2QgPSByZW1vdmVMaXN0ZW5lck1ldGhvZDsKLQkJCXJlbW92ZUxpc3RlbmVyTWV0aG9kID0gKE1ldGhvZCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcmVtb3ZlTGlzdGVuZXJNZXRob2QpOwotCQkJaWYgKHJlbW92ZUxpc3RlbmVyTWV0aG9kICE9IG9sZFJlbW92ZUxpc3RlbmVyTWV0aG9kKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0QsIG9sZFJlbW92ZUxpc3RlbmVyTWV0aG9kLCByZW1vdmVMaXN0ZW5lck1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZW1vdmVMaXN0ZW5lck1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKSB7Ci0JCXJldHVybiByZW1vdmVMaXN0ZW5lck1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdmVMaXN0ZW5lck1ldGhvZChNZXRob2QgbmV3UmVtb3ZlTGlzdGVuZXJNZXRob2QpIHsKLQkJTWV0aG9kIG9sZFJlbW92ZUxpc3RlbmVyTWV0aG9kID0gcmVtb3ZlTGlzdGVuZXJNZXRob2Q7Ci0JCXJlbW92ZUxpc3RlbmVyTWV0aG9kID0gbmV3UmVtb3ZlTGlzdGVuZXJNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRU1PVkVfTElTVEVORVJfTUVUSE9ELCBvbGRSZW1vdmVMaXN0ZW5lck1ldGhvZCwgcmVtb3ZlTGlzdGVuZXJNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEV2ZW50QWRhcHRlckNsYXNzKCkgewotCQlpZiAoZXZlbnRBZGFwdGVyQ2xhc3MgIT0gbnVsbCAmJiBldmVudEFkYXB0ZXJDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkRXZlbnRBZGFwdGVyQ2xhc3MgPSBldmVudEFkYXB0ZXJDbGFzczsKLQkJCWV2ZW50QWRhcHRlckNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZXZlbnRBZGFwdGVyQ2xhc3MpOwotCQkJaWYgKGV2ZW50QWRhcHRlckNsYXNzICE9IG9sZEV2ZW50QWRhcHRlckNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VWRU5UX0FEQVBURVJfQ0xBU1MsIG9sZEV2ZW50QWRhcHRlckNsYXNzLCBldmVudEFkYXB0ZXJDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBldmVudEFkYXB0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0RXZlbnRBZGFwdGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBldmVudEFkYXB0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFdmVudEFkYXB0ZXJDbGFzcyhKYXZhQ2xhc3MgbmV3RXZlbnRBZGFwdGVyQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEV2ZW50QWRhcHRlckNsYXNzID0gZXZlbnRBZGFwdGVyQ2xhc3M7Ci0JCWV2ZW50QWRhcHRlckNsYXNzID0gbmV3RXZlbnRBZGFwdGVyQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTLCBvbGRFdmVudEFkYXB0ZXJDbGFzcywgZXZlbnRBZGFwdGVyQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VyTGlzdE10aGQoKSB7Ci0JCWlmIChzZXJMaXN0TXRoZCA9PSBudWxsKSB7Ci0JCQlzZXJMaXN0TXRoZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RQcm94eS5jbGFzcywgdGhpcywgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NFUl9MSVNUX01USEQpOwotCQl9Ci0JCXJldHVybiBzZXJMaXN0TXRoZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXRhaWxzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NFUl9MSVNUX01USEQ6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VyTGlzdE10aGQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVNT0RFTF9FTEVNRU5UX19FQU5OT1RBVElPTlMsIEVNb2RlbEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBnZXREZXRhaWxzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzRXhwZXJ0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc0hpZGRlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNQcmVmZXJyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiBpc01lcmdlSW50cm9zcGVjdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuIGlzQXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBnZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lOX0RFRkFVTFRfRVZFTlRfU0VUOgotCQkJCXJldHVybiBpc0luRGVmYXVsdEV2ZW50U2V0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fVU5JQ0FTVDoKLQkJCQlyZXR1cm4gaXNVbmljYXN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gaXNMaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEFkZExpc3RlbmVyTWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0QWRkTGlzdGVuZXJNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldExpc3RlbmVyTWV0aG9kcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExpc3RlbmVyVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldExpc3RlbmVyVHlwZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVNT1ZFX0xJU1RFTkVSX01FVEhPRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VWRU5UX0FEQVBURVJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFdmVudEFkYXB0ZXJDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldEV2ZW50QWRhcHRlckNsYXNzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEOgotCQkJCXJldHVybiBnZXRTZXJMaXN0TXRoZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJc2V0RXhwZXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlzZXRIaWRkZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKChJbXBsaWNpdEl0ZW0pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU5fREVGQVVMVF9FVkVOVF9TRVQ6Ci0JCQkJc2V0SW5EZWZhdWx0RXZlbnRTZXQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fVU5JQ0FTVDoKLQkJCQlzZXRVbmljYXN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0TGlzdGVuZXJNZXRob2RzRXhwbGljaXRFbXB0eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BRERfTElTVEVORVJfTUVUSE9EOgotCQkJCXNldEFkZExpc3RlbmVyTWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFM6Ci0JCQkJZ2V0TGlzdGVuZXJNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRMaXN0ZW5lck1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX1RZUEU6Ci0JCQkJc2V0TGlzdGVuZXJUeXBlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0Q6Ci0JCQkJc2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVZFTlRfQURBUFRFUl9DTEFTUzoKLQkJCQlzZXRFdmVudEFkYXB0ZXJDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEOgotCQkJCWdldFNlckxpc3RNdGhkKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJMaXN0TXRoZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXVuc2V0RGlzcGxheU5hbWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQl1bnNldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeShDQVRFR09SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXVuc2V0RXhwZXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXVuc2V0SGlkZGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXVuc2V0UHJlZmVycmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eShBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTl9ERUZBVUxUX0VWRU5UX1NFVDoKLQkJCQl1bnNldEluRGVmYXVsdEV2ZW50U2V0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fVU5JQ0FTVDoKLQkJCQl1bnNldFVuaWNhc3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldExpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkoTElTVEVORVJfTUVUSE9EU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQUREX0xJU1RFTkVSX01FVEhPRDoKLQkJCQlzZXRBZGRMaXN0ZW5lck1ldGhvZCgoTWV0aG9kKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFM6Ci0JCQkJZ2V0TGlzdGVuZXJNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9UWVBFOgotCQkJCXNldExpc3RlbmVyVHlwZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1JFTU9WRV9MSVNURU5FUl9NRVRIT0Q6Ci0JCQkJc2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKE1ldGhvZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FVkVOVF9BREFQVEVSX0NMQVNTOgotCQkJCXNldEV2ZW50QWRhcHRlckNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0VSX0xJU1RfTVRIRDoKLQkJCQlnZXRTZXJMaXN0TXRoZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogVGhpcyBpcyBvdmVycmlkZGVuIHNvIHRoYXQgd2UgY2FuIGRvIHNwZWNpYWwgaXMgc2V0IHRlc3RzOgotCSAqIDEpIHBhcmFtZXRlciBkZXNjcmlwdG9yczogY2hlY2sgaWYgc2VyUGFybURlc2MgZXhpc3RzIGFuZCBub3QgZW1wdHksIHNpbmNlIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBpcyBkZXJpdmVkLgotCSAqIDIpIHNlclBhcm1EZXNjOiBpZiBmbGFnIHNldCB0byBkZWZhdWx0IHBhcm0gZGVzYywgdGhlbiBhbnN3ZXIgbm90IHNldCwgZWxzZSBkbyBub3JtYWwgaXNTZXQgdGVzdC4gVGhhdCB3YXkgaWYgc2V0IGJ5IGRlZmF1bHQgaXQgd29uJ3Qgc2VyaWFsaXplCi0JICogICAgb3V0IHRoZSB1bm5lZWRlZCBkZWZhdWx0IHBhcm1zLiBUaGV5IGNhbiBiZSByZWNvbnN0cnVjdGVkIHF1aWNrbHkgd2hlbiBuZWVkZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNTb3VyY2VTZXQoKTsJLy8gT3ZlcnJpZGUgc28gdGhhdCBpZiBzZXQgdG8gdGhlIHNhbWUgYXMgY2xhc3NuYW1lLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgbm90IHNldC4KLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGVJc1NldEdlbihCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50U2V0RGVjb3JhdG9yX1Nlckxpc3RNdGhkKCkpOwkvLyBMZXQgZGVmYXVsdCBzZXJMaXN0TXRoZCBpcyBzZXQgd29yay4KLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX1NFUl9MSVNUX01USEQ6Ci0JCQkJaWYgKChnZXRJbXBsaWNpdGx5U2V0Qml0cygpICYgRVZFTlRfTElTVEVORVJNRVRIT0RTX0RFRkFVTFQpICE9IDApCi0JCQkJCXJldHVybiBmYWxzZTsJLy8gTm90IGNvbnNpZGVyZWQgc2V0IGlmIGluaXRpYWxpemVkIGJ5IGRlZmF1bHQuCi0JCQkJZWxzZQotCQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsJLy8gTm90IHNldCBieSBkZWZhdWx0LCBzbyBjaGVjayB0cnVlIHNldHRpbmcuCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwkvLyBFdmVyeXRoaW5nIGVsc2UgdXNlIHRoZSBnZW4gbWV0aG9kLgotCQl9Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldEdlbihFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGRldGFpbHMgIT0gbnVsbCAmJiAhZGV0YWlscy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gaXNTZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGlzU2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXhwZXJ0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzU2V0SGlkZGVuKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UHJlZmVycmVkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDApICE9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBpbXBsaWNpdGx5U2V0Qml0cyAhPSBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGltcGxpY2l0RGVjb3JhdG9yRmxhZyAhPSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19JTl9ERUZBVUxUX0VWRU5UX1NFVDoKLQkJCQlyZXR1cm4gaXNTZXRJbkRlZmF1bHRFdmVudFNldCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fVU5JQ0FTVDoKLQkJCQlyZXR1cm4gaXNTZXRVbmljYXN0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19MSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IExJU1RFTkVSX01FVEhPRFNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19BRERfTElTVEVORVJfTUVUSE9EOgotCQkJCXJldHVybiBhZGRMaXN0ZW5lck1ldGhvZCAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fTElTVEVORVJfTUVUSE9EUzoKLQkJCQlyZXR1cm4gIWdldExpc3RlbmVyTWV0aG9kcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0xJU1RFTkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGxpc3RlbmVyVHlwZSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRVZFTlRfU0VUX0RFQ09SQVRPUl9fUkVNT1ZFX0xJU1RFTkVSX01FVEhPRDoKLQkJCQlyZXR1cm4gcmVtb3ZlTGlzdGVuZXJNZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkVWRU5UX1NFVF9ERUNPUkFUT1JfX0VWRU5UX0FEQVBURVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGV2ZW50QWRhcHRlckNsYXNzICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5FVkVOVF9TRVRfREVDT1JBVE9SX19TRVJfTElTVF9NVEhEOgotCQkJCXJldHVybiBzZXJMaXN0TXRoZCAhPSBudWxsICYmICFzZXJMaXN0TXRoZC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbkRlZmF1bHRFdmVudFNldDogIik7Ci0JCWlmICgoZUZsYWdzICYgSU5fREVGQVVMVF9FVkVOVF9TRVRfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIElOX0RFRkFVTFRfRVZFTlRfU0VUX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdW5pY2FzdDogIik7Ci0JCWlmICgoZUZsYWdzICYgVU5JQ0FTVF9FU0VURkxBRykgIT0gMCkgcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgVU5JQ0FTVF9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBMSVNURU5FUl9NRVRIT0RTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9GZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9GZWF0dXJlQXR0cmlidXRlTWFwRW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzQ3ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbi5GZWF0dXJlQXR0cmlidXRlVmFsdWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GZWF0dXJlIEF0dHJpYnV0ZSBNYXAgRW50cnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwjZ2V0VHlwZWRLZXkgPGVtPktleTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGwuRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCNnZXRUeXBlZFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEJhc2ljRU1hcC5FbnRyeSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVkS2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZWRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVkS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleSA9IEtFWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlZFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlZEtleSgpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlZEtleShTdHJpbmcgbmV3S2V5KSB7Ci0JCVN0cmluZyBvbGRLZXkgPSBrZXk7Ci0JCWtleSA9IG5ld0tleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fS0VZLCBvbGRLZXksIGtleSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlQXR0cmlidXRlVmFsdWUgZ2V0VHlwZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVkVmFsdWUoRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIG5ld1ZhbHVlKSB7Ci0JCUZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19LRVk6Ci0JCQkJcmV0dXJuIGdldFR5cGVkS2V5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRUeXBlZFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19LRVk6Ci0JCQkJc2V0VHlwZWRLZXkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9BVFRSSUJVVEVfTUFQX0VOVFJZX19WQUxVRToKLQkJCQlzZXRUeXBlZFZhbHVlKChGZWF0dXJlQXR0cmlidXRlVmFsdWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX0tFWToKLQkJCQlzZXRUeXBlZEtleShLRVlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfQVRUUklCVVRFX01BUF9FTlRSWV9fVkFMVUU6Ci0JCQkJc2V0VHlwZWRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX0tFWToKLQkJCQlyZXR1cm4gS0VZX0VERUZBVUxUID09IG51bGwgPyBrZXkgIT0gbnVsbCA6ICFLRVlfRURFRkFVTFQuZXF1YWxzKGtleSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0FUVFJJQlVURV9NQVBfRU5UUllfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2V5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChrZXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaGFzaCA9IC0xOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRIYXNoKCkgewotCQlpZiAoaGFzaCA9PSAtMSkgewotCQkJT2JqZWN0IHRoZUtleSA9IGdldEtleSgpOwotCQkJaGFzaCA9ICh0aGVLZXkgPT0gbnVsbCA/IDAgOiB0aGVLZXkuaGFzaENvZGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaChpbnQgaGFzaCkgewotCQl0aGlzLmhhc2ggPSBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4gZ2V0VHlwZWRLZXkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoT2JqZWN0IGtleSkgewotCQlzZXRUeXBlZEtleSgoU3RyaW5nKWtleSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSBnZXRWYWx1ZSgpOwotCQlzZXRUeXBlZFZhbHVlKChGZWF0dXJlQXR0cmlidXRlVmFsdWUpdmFsdWUpOwotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0RU1hcCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBlQ29udGFpbmVyKCk7Ci0JCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiAoRU1hcCljb250YWluZXIuZUdldChlQ29udGFpbm1lbnRGZWF0dXJlKCkpOwotCX0KLQotfSAvL0ZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0ZlYXR1cmVEZWNvcmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9GZWF0dXJlRGVjb3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjBkNTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0ZlYXR1cmVEZWNvcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBGZWF0dXJlRGVjb3JhdG9ySW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMSAkICAkRGF0ZTogMjAwNS8wOS8xOSAxNTo0MzowMiAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQW5ub3RhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5GZWF0dXJlRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW07Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GZWF0dXJlIERlY29yYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+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+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXRhaWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlzZXRFeHBlcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlzZXRIaWRkZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlzZXRQcmVmZXJyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKEltcGxpY2l0SXRlbSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQl1bnNldERpc3BsYXlOYW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeShDQVRFR09SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQl1bnNldEV4cGVydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXVuc2V0UHJlZmVycmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgb3ZlcnJpZGVzIHRvIGVJc1NldCB0byB0ZXN0IGlmIHNvdXJjZSBpcyBzZXQuIFRoaXMgaXMgYmVjYXVzZSBmb3IgdGhlIAotCSAqIEZlYXR1cmVEZWNvcmF0b3IgYW5kIHN1YmNsYXNzZXMsIHNldHRpbmcgc291cmNlIHRvIHRoZSBjbGFzc25hbWUgaXMgY29uc2lkZXJlZAotCSAqIHRvIGJlIG5vdCBzZXQgc2luY2UgdGhhdCBpcyB0aGUgbmV3IGRlZmF1bHQgZm9yIGVhY2ggY2xhc3MgbGV2ZWwuIEJ5IGRvaW5nIHRoaXMKLQkgKiB3aGVuIHNlcmlhbGl6aW5nIGl0IHdvbid0IHdhc3RlIHNwYWNlIGFuZCB0aW1lIGFkZGluZyBhIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJpbmcKLQkgKiB0byB0aGUgc2VyaWFsaXplZCBvdXRwdXQgYW5kIHRoZW4gY3JlYXRpbmcgYSBORVcgY29weSBvbiBlYWNoIGRlY29yYXRvciBsb2FkZWQKLQkgKiBmcm9tIGFuIFhNSSBmaWxlLiAKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNvdXJjZSBpcyBub3QgbnVsbCBhbmQgbm90IGVxdWFsIHRvIGNsYXNzIG5hbWUuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBzb3VyY2UgIT0gbnVsbCAmJiAhZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0I2VJc1NldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBpc1NvdXJjZVNldCgpOwkvLyBPdmVycmlkZSBzbyB0aGF0IGlmIHNldCB0byB0aGUgc2FtZSBhcyBjbGFzc25hbWUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBub3Qgc2V0LgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0R2VuKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZGV0YWlscyAhPSBudWxsICYmICFkZXRhaWxzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiByZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gaXNTZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlyZXR1cm4gQ0FURUdPUllfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGVnb3J5ICE9IG51bGwgOiAhQ0FURUdPUllfRURFRkFVTFQuZXF1YWxzKGNhdGVnb3J5KTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXhwZXJ0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcmVmZXJyZWQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDApICE9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuRkVBVFVSRV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJcmV0dXJuIGltcGxpY2l0bHlTZXRCaXRzICE9IElNUExJQ0lUTFlfU0VUX0JJVFNfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5GRUFUVVJFX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGltcGxpY2l0RGVjb3JhdG9yRmxhZyAhPSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLkZFQVRVUkVfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0luZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL0luZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkNzJhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9JbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDkvMTkgMTU6NDM6MDIgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluZGV4ZWQgUHJvcGVydHkgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsI2dldEluZGV4ZWRSZWFkTWV0aG9kIDxlbT5JbmRleGVkIFJlYWQgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5JbmRleGVkUHJvcGVydHlEZWNvcmF0b3JJbXBsI2dldEluZGV4ZWRXcml0ZU1ldGhvZCA8ZW0+SW5kZXhlZCBXcml0ZSBNZXRob2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9ySW1wbCBleHRlbmRzIFByb3BlcnR5RGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcnsKLQkKLQkvKioKLQkgKiBCaXRzIGZvciBpbXBsaWNpdGx5IHNldCBmZWF0dXJlcy4gVGhpcyBpcyBpbnRlcm5hbCwgbm90IG1lYW50IGZvciBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBJTkRFWEVEX1JFQURNRVRIT0RfSU1QTElDSVQgPSAweDEwMDAwMEw7CS8vIFN0YXJ0IGtpbmQgb2YgaGlnaCBzbyBhcyB0byBhbGxvdyBQcm9wZXJ0eURlY29yYXRvciB0byBpbmNyZWFzZSB3aXRob3V0IGNvbmZsaWcuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElOREVYRURfV1JJVEVNRVRIT0RfSU1QTElDSVQgPSAweDIwMDAwMEw7Ci0JCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSA8ZW0+SW5kZXhlZCBSZWFkIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXhlZFJlYWRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgaW5kZXhlZFJlYWRNZXRob2QgPSBudWxsOwotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBJbmRleGVkIFJlYWQgTWV0aG9kIHJlZmVyZW5jZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTkRFWEVEX1JFQURfTUVUSE9EX0VTRVRGTEFHID0gMSA8PCAyOTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4ZWRXcml0ZU1ldGhvZCgpIDxlbT5JbmRleGVkIFdyaXRlIE1ldGhvZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGluZGV4ZWRXcml0ZU1ldGhvZCA9IG51bGw7Ci0JCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIEluZGV4ZWQgV3JpdGUgTWV0aG9kIHJlZmVyZW5jZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTkRFWEVEX1dSSVRFX01FVEhPRF9FU0VURkxBRyA9IDEgPDwgMzA7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8JCi0JcHJvdGVjdGVkIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBCZWFuaW5mb1BhY2thZ2UuZUlOU1RBTkNFLmdldEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSB7Ci0JCWlmIChpbmRleGVkUmVhZE1ldGhvZCAhPSBudWxsICYmIGluZGV4ZWRSZWFkTWV0aG9kLmVJc1Byb3h5KCkpIHsKLQkJCU1ldGhvZCBvbGRJbmRleGVkUmVhZE1ldGhvZCA9IGluZGV4ZWRSZWFkTWV0aG9kOwotCQkJaW5kZXhlZFJlYWRNZXRob2QgPSAoTWV0aG9kKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClpbmRleGVkUmVhZE1ldGhvZCk7Ci0JCQlpZiAoaW5kZXhlZFJlYWRNZXRob2QgIT0gb2xkSW5kZXhlZFJlYWRNZXRob2QpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfUkVBRF9NRVRIT0QsIG9sZEluZGV4ZWRSZWFkTWV0aG9kLCBpbmRleGVkUmVhZE1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleGVkUmVhZE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleGVkUmVhZE1ldGhvZChNZXRob2QgbmV3SW5kZXhlZFJlYWRNZXRob2QpIHsKLQkJTWV0aG9kIG9sZEluZGV4ZWRSZWFkTWV0aG9kID0gaW5kZXhlZFJlYWRNZXRob2Q7Ci0JCWluZGV4ZWRSZWFkTWV0aG9kID0gbmV3SW5kZXhlZFJlYWRNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkSW5kZXhlZFJlYWRNZXRob2RFU2V0ID0gKGVGbGFncyAmIElOREVYRURfUkVBRF9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBJTkRFWEVEX1JFQURfTUVUSE9EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfUkVBRF9NRVRIT0QsIG9sZEluZGV4ZWRSZWFkTWV0aG9kLCBpbmRleGVkUmVhZE1ldGhvZCwgIW9sZEluZGV4ZWRSZWFkTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SW5kZXhlZFJlYWRNZXRob2QoKSB7Ci0JCU1ldGhvZCBvbGRJbmRleGVkUmVhZE1ldGhvZCA9IGluZGV4ZWRSZWFkTWV0aG9kOwotCQlib29sZWFuIG9sZEluZGV4ZWRSZWFkTWV0aG9kRVNldCA9IChlRmxhZ3MgJiBJTkRFWEVEX1JFQURfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQlpbmRleGVkUmVhZE1ldGhvZCA9IG51bGw7Ci0JCWVGbGFncyAmPSB+SU5ERVhFRF9SRUFEX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfUkVBRF9NRVRIT0QsIG9sZEluZGV4ZWRSZWFkTWV0aG9kLCBudWxsLCBvbGRJbmRleGVkUmVhZE1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEluZGV4ZWRSZWFkTWV0aG9kKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIElOREVYRURfUkVBRF9NRVRIT0RfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRJbmRleGVkV3JpdGVNZXRob2QoKSB7Ci0JCWlmIChpbmRleGVkV3JpdGVNZXRob2QgIT0gbnVsbCAmJiBpbmRleGVkV3JpdGVNZXRob2QuZUlzUHJveHkoKSkgewotCQkJTWV0aG9kIG9sZEluZGV4ZWRXcml0ZU1ldGhvZCA9IGluZGV4ZWRXcml0ZU1ldGhvZDsKLQkJCWluZGV4ZWRXcml0ZU1ldGhvZCA9IChNZXRob2QpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWluZGV4ZWRXcml0ZU1ldGhvZCk7Ci0JCQlpZiAoaW5kZXhlZFdyaXRlTWV0aG9kICE9IG9sZEluZGV4ZWRXcml0ZU1ldGhvZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0QsIG9sZEluZGV4ZWRXcml0ZU1ldGhvZCwgaW5kZXhlZFdyaXRlTWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGV4ZWRXcml0ZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleGVkV3JpdGVNZXRob2QoTWV0aG9kIG5ld0luZGV4ZWRXcml0ZU1ldGhvZCkgewotCQlNZXRob2Qgb2xkSW5kZXhlZFdyaXRlTWV0aG9kID0gaW5kZXhlZFdyaXRlTWV0aG9kOwotCQlpbmRleGVkV3JpdGVNZXRob2QgPSBuZXdJbmRleGVkV3JpdGVNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkSW5kZXhlZFdyaXRlTWV0aG9kRVNldCA9IChlRmxhZ3MgJiBJTkRFWEVEX1dSSVRFX01FVEhPRF9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IElOREVYRURfV1JJVEVfTUVUSE9EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfV1JJVEVfTUVUSE9ELCBvbGRJbmRleGVkV3JpdGVNZXRob2QsIGluZGV4ZWRXcml0ZU1ldGhvZCwgIW9sZEluZGV4ZWRXcml0ZU1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEluZGV4ZWRXcml0ZU1ldGhvZCgpIHsKLQkJTWV0aG9kIG9sZEluZGV4ZWRXcml0ZU1ldGhvZCA9IGluZGV4ZWRXcml0ZU1ldGhvZDsKLQkJYm9vbGVhbiBvbGRJbmRleGVkV3JpdGVNZXRob2RFU2V0ID0gKGVGbGFncyAmIElOREVYRURfV1JJVEVfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQlpbmRleGVkV3JpdGVNZXRob2QgPSBudWxsOwotCQllRmxhZ3MgJj0gfklOREVYRURfV1JJVEVfTUVUSE9EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU5ERVhFRF9XUklURV9NRVRIT0QsIG9sZEluZGV4ZWRXcml0ZU1ldGhvZCwgbnVsbCwgb2xkSW5kZXhlZFdyaXRlTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIElOREVYRURfV1JJVEVfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVNT0RFTF9FTEVNRU5UX19FQU5OT1RBVElPTlMsIEVNb2RlbEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBnZXREZXRhaWxzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudHMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzSGlkZGVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNQcmVmZXJyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gaXNBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EOgotCQkJCXJldHVybiBpc0JvdW5kKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEOgotCQkJCXJldHVybiBpc0NvbnN0cmFpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FOgotCQkJCXJldHVybiBpc0Rlc2lnblRpbWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQUxXQVlTX0lOQ09NUEFUSUJMRToKLQkJCQlyZXR1cm4gaXNBbHdheXNJbmNvbXBhdGlibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTOgotCQkJCXJldHVybiBnZXRGaWx0ZXJGbGFncygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWToKLQkJCQlyZXR1cm4gaXNGaWVsZFJlYWRPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZWFkTWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UmVhZE1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFdyaXRlTWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0V3JpdGVNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEZpZWxkKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RmllbGQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1JFQURfTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SW5kZXhlZFJlYWRNZXRob2QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfV1JJVEVfTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGV0YWlscygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCWdldFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXNldFNob3J0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJc2V0RXhwZXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU46Ci0JCQkJc2V0SGlkZGVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJc2V0UHJlZmVycmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlzZXRJbXBsaWNpdGx5U2V0Qml0cygoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKChJbXBsaWNpdEl0ZW0pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORDoKLQkJCQlzZXRCb3VuZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQ6Ci0JCQkJc2V0Q29uc3RyYWluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FOgotCQkJCXNldERlc2lnblRpbWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FMV0FZU19JTkNPTVBBVElCTEU6Ci0JCQkJc2V0QWx3YXlzSW5jb21wYXRpYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1M6Ci0JCQkJZ2V0RmlsdGVyRmxhZ3MoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlckZsYWdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZOgotCQkJCXNldEZpZWxkUmVhZE9ubHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUzoKLQkJCQlzZXRQcm9wZXJ0eUVkaXRvckNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRDoKLQkJCQlzZXRSZWFkTWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0Q6Ci0JCQkJc2V0V3JpdGVNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEOgotCQkJCXNldEZpZWxkKChGaWVsZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfUkVBRF9NRVRIT0Q6Ci0JCQkJc2V0SW5kZXhlZFJlYWRNZXRob2QoKE1ldGhvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfV1JJVEVfTUVUSE9EOgotCQkJCXNldEluZGV4ZWRXcml0ZU1ldGhvZCgoTWV0aG9kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKFNPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXVuc2V0RGlzcGxheU5hbWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJdW5zZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXVuc2V0RXhwZXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQl1bnNldEhpZGRlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJdW5zZXRQcmVmZXJyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZyhJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EOgotCQkJCXVuc2V0Qm91bmQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQ6Ci0JCQkJdW5zZXRDb25zdHJhaW5lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQl1bnNldERlc2lnblRpbWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQUxXQVlTX0lOQ09NUEFUSUJMRToKLQkJCQlzZXRBbHdheXNJbmNvbXBhdGlibGUoQUxXQVlTX0lOQ09NUEFUSUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlnZXRGaWx0ZXJGbGFncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWToKLQkJCQlzZXRGaWVsZFJlYWRPbmx5KEZJRUxEX1JFQURfT05MWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUzoKLQkJCQlzZXRQcm9wZXJ0eUVkaXRvckNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXVuc2V0UmVhZE1ldGhvZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0Q6Ci0JCQkJdW5zZXRXcml0ZU1ldGhvZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQl1bnNldEZpZWxkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfUkVBRF9NRVRIT0Q6Ci0JCQkJdW5zZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRDoKLQkJCQl1bnNldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCNlSXNTZXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNTb3VyY2VTZXQoKTsJLy8gT3ZlcnJpZGUgc28gdGhhdCBpZiBzZXQgdG8gdGhlIHNhbWUgYXMgY2xhc3NuYW1lLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgbm90IHNldC4KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBpc1NldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGlzU2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNTZXRFeHBlcnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzU2V0SGlkZGVuKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgTUVSR0VfSU5UUk9TUEVDVElPTl9FRkxBRykgIT0gMCkgIT0gTUVSR0VfSU5UUk9TUEVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gaW1wbGljaXREZWNvcmF0b3JGbGFnICE9IElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJcmV0dXJuIGlzU2V0Qm91bmQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQlyZXR1cm4gaXNTZXRDb25zdHJhaW5lZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FOgotCQkJCXJldHVybiBpc1NldERlc2lnblRpbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFMV0FZU19JTkNPTVBBVElCTEVfRUZMQUcpICE9IDApICE9IEFMV0FZU19JTkNPTVBBVElCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTOgotCQkJCXJldHVybiBmaWx0ZXJGbGFncyAhPSBudWxsICYmICFmaWx0ZXJGbGFncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5JTkRFWEVEX1BST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEZJRUxEX1JFQURfT05MWV9FRkxBRykgIT0gMCkgIT0gRklFTERfUkVBRF9PTkxZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUzoKLQkJCQlyZXR1cm4gcHJvcGVydHlFZGl0b3JDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCXJldHVybiBpc1NldFJlYWRNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGlzU2V0V3JpdGVNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQlyZXR1cm4gaXNTZXRGaWVsZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuSU5ERVhFRF9QUk9QRVJUWV9ERUNPUkFUT1JfX0lOREVYRURfUkVBRF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGlzU2V0SW5kZXhlZFJlYWRNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLklOREVYRURfUFJPUEVSVFlfREVDT1JBVE9SX19JTkRFWEVEX1dSSVRFX01FVEhPRDoKLQkJCQlyZXR1cm4gaXNTZXRJbmRleGVkV3JpdGVNZXRob2QoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBiYXNpY0dldEluZGV4ZWRSZWFkTWV0aG9kKCkgewotCQlyZXR1cm4gaW5kZXhlZFJlYWRNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBiYXNpY0dldEluZGV4ZWRXcml0ZU1ldGhvZCgpIHsKLQkJcmV0dXJuIGluZGV4ZWRXcml0ZU1ldGhvZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL01ldGhvZERlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL01ldGhvZERlY29yYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhMmFlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9NZXRob2REZWNvcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IE1ldGhvZERlY29yYXRvckltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTEgJCAgJERhdGU6IDIwMDUvMDkvMTkgMTU6NDM6MDIgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uQmVhbmluZm9GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2RQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBEZWNvcmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLk1ldGhvZERlY29yYXRvckltcGwjaXNQYXJtc0V4cGxpY2l0RW1wdHkgPGVtPlBhcm1zIEV4cGxpY2l0IEVtcHR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5NZXRob2REZWNvcmF0b3JJbXBsI2dldFBhcmFtZXRlckRlc2NyaXB0b3JzIDxlbT5QYXJhbWV0ZXIgRGVzY3JpcHRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLk1ldGhvZERlY29yYXRvckltcGwjZ2V0U2VyUGFybURlc2MgPGVtPlNlciBQYXJtIERlc2M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRGVjb3JhdG9ySW1wbCBleHRlbmRzIEZlYXR1cmVEZWNvcmF0b3JJbXBsIGltcGxlbWVudHMgTWV0aG9kRGVjb3JhdG9yewotCQotCS8qKgotCSAqIEJpdHMgZm9yIGltcGxpY2l0bHkgc2V0IGZlYXR1cmVzLiBUaGlzIGlzIGludGVybmFsLCBub3QgbWVhbnQgZm9yIGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1FVEhPRF9QQVJBTUVURVJTX0lNUExJQ0lUID0gMHgxTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTUVUSE9EX1BBUkFNRVRFUlNfREVGQVVMVCA9IDAyTDsJLy8gU3BlY2lhbCwgbWVhbnMgd2VyZSBjcmVhdGVkIGJ5IGRlZmF1bHQgYW5kIG5vdCBieSBpbXBsaWNpdCAoZnJvbSBiZWFuaW5mbykuCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJtc0V4cGxpY2l0RW1wdHkoKSA8ZW0+UGFybXMgRXhwbGljaXQgRW1wdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUGFybXNFeHBsaWNpdEVtcHR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUEFSTVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFybXNFeHBsaWNpdEVtcHR5KCkgPGVtPlBhcm1zIEV4cGxpY2l0IEVtcHR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Bhcm1zRXhwbGljaXRFbXB0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUcgPSAxIDw8IDE4OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VyUGFybURlc2MoKSA8ZW0+U2VyIFBhcm0gRGVzYzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJQYXJtRGVzYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlclBhcm1EZXNjID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwkKLQlwcm90ZWN0ZWQgTWV0aG9kRGVjb3JhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRGVjb3JhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJtc0V4cGxpY2l0RW1wdHkoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFybXNFeHBsaWNpdEVtcHR5KGJvb2xlYW4gbmV3UGFybXNFeHBsaWNpdEVtcHR5KSB7Ci0JCWJvb2xlYW4gb2xkUGFybXNFeHBsaWNpdEVtcHR5ID0gKGVGbGFncyAmIFBBUk1TX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3UGFybXNFeHBsaWNpdEVtcHR5KSBlRmxhZ3MgfD0gUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5QQVJNU19FWFBMSUNJVF9FTVBUWV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUk1TX0VYUExJQ0lUX0VNUFRZLCBvbGRQYXJtc0V4cGxpY2l0RW1wdHksIG5ld1Bhcm1zRXhwbGljaXRFbXB0eSkpOwotCX0KLQotCS8qCi0JICogVGhpcyBpcyBjYWxsZWQgaWYgcGFybXMgbGlzdCBub3QgZXhwbGljaXRseSBzZXQgYW5kIGl0IHdhcyBlbXB0eSBmcm9tIEJlYW5JbmZvIG9yCi0JICogdGhpcyBpcyBmcm9tIHJlZmxlY3Rpb24uIFRoaXMgYmVjb21lcyB0aGUgZGVmYXVsdCBsaXN0IGJhc2VkIHVwb24gdGhlIG1ldGhvZAotCSAqIHdlIGFyZSBhdHRhY2hlZCB0by4KLQkgKi8KLQlwcml2YXRlIEVMaXN0IGNyZWF0ZURlZmF1bHRQYXJtc0xpc3QoKSB7Ci0JCUVMaXN0IHBhcm1zTGlzdCA9IHRoaXMuZ2V0U2VyUGFybURlc2MoKTsKLQkJcGFybXNMaXN0LmNsZWFyKCk7Ci0JCQotCQlzZXRJbXBsaWNpdGx5U2V0Qml0cyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpfE1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQpOwkvLyBNYXJrIGFzIHdlIGltcGxpY2l0bHkgZmlsbGVkIGl0IGluLgotCQlMaXN0IHAgPSBnZXRNZXRob2RQYXJhbWV0ZXJzKCk7Ci0JCWlmIChwID09IG51bGwpCi0JCQlyZXR1cm4gcGFybXNMaXN0OwkvLyBDb3VsZG4ndCBnZXQgdGhlIGxpc3QgZm9yIHNvbWUgcmVhc29uLCBzbyBsZWF2ZSBhcyBpcy4KLQkJaW50IHBzaXplID0gcC5zaXplKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxwc2l6ZTsgaSsrKSB7Ci0JCQlQYXJhbWV0ZXJEZWNvcmF0b3IgcGQgPSBCZWFuaW5mb0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtZXRlckRlY29yYXRvcigpOwotCQkJSmF2YVBhcmFtZXRlciBqcCA9IChKYXZhUGFyYW1ldGVyKSBwLmdldChpKTsKLQkJCXBkLnNldE5hbWUoanAuZ2V0TmFtZSgpKTsKLQkJCXBkLnNldEltcGxpY2l0bHlTZXRCaXRzKFBhcmFtZXRlckRlY29yYXRvckltcGwuUEFSQU1FVEVSX05BTUVfSU1QTElDSVQpOwotCQkJcGQuc2V0UGFyYW1ldGVyKGpwKTsKLQkJCXBhcm1zTGlzdC5hZGQocGQpOwotCQl9Ci0JCXJldHVybiBwYXJtc0xpc3Q7Ci0JfQotCQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgUGFyYW1ldGVyRGVjb3JhdG9ycyB0byBob29rIHVwIHRoZSBKYXZhUGFyYW1ldGVyIHRoZXkgYXJlIGRlc2NyaWJpbmcuCi0JICogVGhpcyBpcyBjYWxsZWQgZnJvbSBQYXJhbWV0ZXJEZWNvcmF0b3Igd2hlbiBpdCBmaW5kcyB0aGF0IGl0cyBKYXZhUGFyYW1ldGVyIGhhcyBub3QgYmVlbiBzZXQuCi0JICogVGhpcyBtZWFucyB0aGF0IGl0IHdhcyBleHBsaWNpdGx5IGFkZGVkIGFuZCB3ZSBuZWVkIHRvIHNldHVwIHRoZSBwYXJtcy4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoaXMgYW4gaW50ZXJuYWwgbWV0aG9kIGZvciBCZWFuSW5mby4gSXQgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZVBhcmFtZXRlcnMoKSB7Ci0JCWlmICh0aGlzLnNlclBhcm1EZXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3QgbXAgPSBnZXRNZXRob2RQYXJhbWV0ZXJzKCk7Ci0JCWlmIChtcC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47CS8vIE5vdGhpbmcgdGhhdCBjYW4gYmUgZGVzY3JpYmVkLgotCQlpbnQgcHNpemUgPSBNYXRoLm1pbih0aGlzLnNlclBhcm1EZXNjLnNpemUoKSwgbXAuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgcHNpemU7IGkrKykKLQkJCSgoUGFyYW1ldGVyRGVjb3JhdG9yKSB0aGlzLnNlclBhcm1EZXNjLmdldChpKSkuc2V0UGFyYW1ldGVyKChKYXZhUGFyYW1ldGVyKSBtcC5nZXQoaSkpOwotCX0KLQotCi0JLyoKLQkgKiBHZXQgdGhlIGplbSBwYXJhbWV0ZXJzIGZyb20gdGhlIG1ldGhvZCAoamVtIG1ldGhvZCkKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0TWV0aG9kUGFyYW1ldGVycygpIHsKLQkJLy8gR2V0IHRoZSBtZXRob2QKLQkJTWV0aG9kIG0gPSBudWxsOwotCQlPYmplY3QgZCA9IGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJaWYgKGQgaW5zdGFuY2VvZiBNZXRob2QpCi0JCQltID0gKE1ldGhvZCkgZDsKLQkJZWxzZSAKLQkJCWlmIChkIGluc3RhbmNlb2YgTWV0aG9kUHJveHkpCi0JCQkJbSA9ICgoTWV0aG9kUHJveHkpIGQpLmdldE1ldGhvZCgpOwotCQkJZWxzZQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwkvLyBOb3QgZGVjb3JhdGluZyBjb3JyZWN0IG9iamVjdC4KLQkJaWYgKG0gPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwkvLyBDb3VsZG4ndCBmaW5kIHRoZSBtZXRob2QuCi0JCUxpc3QgcCA9IG0uZ2V0UGFyYW1ldGVycygpOwotCQlyZXR1cm4gcDsKLQl9Ci0JCQkKLQkJCQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJtc0V4cGxpY2l0RW1wdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBQQVJNU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5NZXRob2REZWNvcmF0b3IjZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpIHsKLQkJaWYgKCFpc1Bhcm1zRXhwbGljaXRFbXB0eSgpICYmIGdldFNlclBhcm1EZXNjKCkuaXNFbXB0eSgpICYmIChnZXRJbXBsaWNpdGx5U2V0Qml0cygpJihNRVRIT0RfUEFSQU1FVEVSU19JTVBMSUNJVCB8IE1FVEhPRF9QQVJBTUVURVJTX0RFRkFVTFQpKSA9PSAwKSB7Ci0JCQkvLyBOb3QgZXhwbGljaXRseSBlbXB0eSwgaXQgaXMgZW1wdHksIGFuZCB3ZSBoYXZlIG5vdCBpbXBsaWNpdGx5IG9yIGJ5IGRlZmF1bHRzIG1hZGUgaXQgZW1wdHksIHRoZW4gY3JlYXRlIHRoZSBkZWZhdWx0cy4KLQkJCWNyZWF0ZURlZmF1bHRQYXJtc0xpc3QoKTsKLQkJfQotCQlyZXR1cm4gZ2V0U2VyUGFybURlc2MoKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBhcmFtZXRlckRlc2NyaXB0b3JzR2VuKCkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnUGFyYW1ldGVyIERlc2NyaXB0b3JzJyByZWZlcmVuY2UgbGlzdAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VyUGFybURlc2MoKSB7Ci0JCWlmIChzZXJQYXJtRGVzYyA9PSBudWxsKSB7Ci0JCQlzZXJQYXJtRGVzYyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbWV0ZXJEZWNvcmF0b3IuY2xhc3MsIHRoaXMsIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDKTsKLQkJfQotCQlyZXR1cm4gc2VyUGFybURlc2M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlclBhcm1EZXNjKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FTU9ERUxfRUxFTUVOVF9fRUFOTk9UQVRJT05TLCBFTW9kZWxFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZ2V0RGV0YWlscygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRDYXRlZ29yeSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0SW1wbGljaXRseVNldEJpdHMoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QQVJNU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gaXNQYXJtc0V4cGxpY2l0RW1wdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QQVJBTUVURVJfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuIGdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDOgotCQkJCXJldHVybiBnZXRTZXJQYXJtRGVzYygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCWdldERldGFpbHMoKS5jbGVhcigpOwotCQkJCWdldERldGFpbHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJc2V0RXhwZXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlzZXRIaWRkZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXNldFByZWZlcnJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKChJbXBsaWNpdEl0ZW0pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSTVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0UGFybXNFeHBsaWNpdEVtcHR5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUkFNRVRFUl9ERVNDUklQVE9SUzoKLQkJCQlnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0M6Ci0JCQkJZ2V0U2VyUGFybURlc2MoKS5jbGVhcigpOwotCQkJCWdldFNlclBhcm1EZXNjKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJdW5zZXREaXNwbGF5TmFtZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJdW5zZXRFeHBlcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJdW5zZXRQcmVmZXJyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbihNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUk1TX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldFBhcm1zRXhwbGljaXRFbXB0eShQQVJNU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSQU1FVEVSX0RFU0NSSVBUT1JTOgotCQkJCWdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDOgotCQkJCWdldFNlclBhcm1EZXNjKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIG92ZXJyaWRkZW4gc28gdGhhdCB3ZSBjYW4gZG8gc3BlY2lhbCBpcyBzZXQgdGVzdHM6Ci0JICogMSkgcGFyYW1ldGVyIGRlc2NyaXB0b3JzOiBjaGVjayBpZiBzZXJQYXJtRGVzYyBleGlzdHMgYW5kIG5vdCBlbXB0eSwgc2luY2UgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIGlzIGRlcml2ZWQuCi0JICogMikgc2VyUGFybURlc2M6IGlmIGZsYWcgc2V0IHRvIGRlZmF1bHQgcGFybSBkZXNjLCB0aGVuIGFuc3dlciBub3Qgc2V0LCBlbHNlIGRvIG5vcm1hbCBpc1NldCB0ZXN0LiBUaGF0IHdheSBpZiBzZXQgYnkgZGVmYXVsdCBpdCB3b24ndCBzZXJpYWxpemUKLQkgKiAgICBvdXQgdGhlIHVubmVlZGVkIGRlZmF1bHQgcGFybXMuIFRoZXkgY2FuIGJlIHJlY29uc3RydWN0ZWQgcXVpY2tseSB3aGVuIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCQlyZXR1cm4gaXNTb3VyY2VTZXQoKTsJLy8gT3ZlcnJpZGUgc28gdGhhdCBpZiBzZXQgdG8gdGhlIHNhbWUgYXMgY2xhc3NuYW1lLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgbm90IHNldC4KLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1BBUkFNRVRFUl9ERVNDUklQVE9SUzoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRGVjb3JhdG9yX1NlclBhcm1EZXNjKCkpOwkvLyBMZXQgZGVmYXVsdCBzZXJQYXJtRGVzYyBpcyBzZXQgd29yay4KLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NFUl9QQVJNX0RFU0M6Ci0JCQkJaWYgKChnZXRJbXBsaWNpdGx5U2V0Qml0cygpICYgTUVUSE9EX1BBUkFNRVRFUlNfREVGQVVMVCkgIT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwkvLyBOb3QgY29uc2lkZXJlZCBzZXQgaWYgaW5pdGlhbGl6ZWQgYnkgZGVmYXVsdC4KLQkJCQllbHNlCi0JCQkJCXJldHVybiBlSXNTZXRHZW4oZUZlYXR1cmUpOwkvLyBOb3Qgc2V0IGJ5IGRlZmF1bHQsIHNvIGNoZWNrIHRydWUgc2V0dGluZy4KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7CS8vIEV2ZXJ5dGhpbmcgZWxzZSB1c2UgdGhlIGdlbiBtZXRob2QuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGlzU2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBpc1NldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc1NldEV4cGVydCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXJldHVybiBpc1NldEhpZGRlbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBNRVJHRV9JTlRST1NQRUNUSU9OX0VGTEFHKSAhPSAwKSAhPSBNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VGTEFHKSAhPSAwKSAhPSBBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXJldHVybiBpbXBsaWNpdERlY29yYXRvckZsYWcgIT0gSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSTVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgUEFSTVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IFBBUk1TX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX0RFQ09SQVRPUl9fUEFSQU1FVEVSX0RFU0NSSVBUT1JTOgotCQkJCXJldHVybiAhZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfREVDT1JBVE9SX19TRVJfUEFSTV9ERVNDOgotCQkJCXJldHVybiBzZXJQYXJtRGVzYyAhPSBudWxsICYmICFzZXJQYXJtRGVzYy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvTWV0aG9kUHJveHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9NZXRob2RQcm94eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkZTc4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9NZXRob2RQcm94eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogTWV0aG9kUHJveHlJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkJlYW5pbmZvUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uTWV0aG9kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUHJveHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLk1ldGhvZFByb3h5SW1wbCNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBNZXRob2RQcm94eUltcGwgZXh0ZW5kcyBFT3BlcmF0aW9uSW1wbCBpbXBsZW1lbnRzIE1ldGhvZFByb3h5IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2QoKSA8ZW0+TWV0aG9kPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8JCi0JcHJvdGVjdGVkIE1ldGhvZFByb3h5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1ldGhvZCgpIHsKLQkJaWYgKG1ldGhvZCAhPSBudWxsICYmIG1ldGhvZC5lSXNQcm94eSgpKSB7Ci0JCQlNZXRob2Qgb2xkTWV0aG9kID0gbWV0aG9kOwotCQkJbWV0aG9kID0gKE1ldGhvZCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpbWV0aG9kKTsKLQkJCWlmIChtZXRob2QgIT0gb2xkTWV0aG9kKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTUVUSE9ELCBvbGRNZXRob2QsIG1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBiYXNpY0dldE1ldGhvZCgpIHsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2QoTWV0aG9kIG5ld01ldGhvZCkgewotCQlNZXRob2Qgb2xkTWV0aG9kID0gbWV0aG9kOwotCQltZXRob2QgPSBuZXdNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX01FVEhPRCwgb2xkTWV0aG9kLCBtZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUNPTlRBSU5JTkdfQ0xBU1MsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRVBBUkFNRVRFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVBhcmFtZXRlcnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VDT05UQUlOSU5HX0NMQVNTLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VQQVJBTUVURVJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVQYXJhbWV0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlMsIEVDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fT1JERVJFRDoKLQkJCQlyZXR1cm4gaXNPcmRlcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19VTklRVUU6Ci0JCQkJcmV0dXJuIGlzVW5pcXVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFVwcGVyQm91bmQoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX01BTlk6Ci0JCQkJcmV0dXJuIGlzTWFueSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VUWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFVHlwZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZ2V0RVBhcmFtZXRlcnMoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUVYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVFeGNlcHRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX01FVEhPRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldE1ldGhvZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRVBBUkFNRVRFUlM6Ci0JCQkJZ2V0RVBhcmFtZXRlcnMoKS5jbGVhcigpOwotCQkJCWdldEVQYXJhbWV0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VFWENFUFRJT05TOgotCQkJCWdldEVFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFRXhjZXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19NRVRIT0Q6Ci0JCQkJc2V0TWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKE9SREVSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZShVTklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTE9XRVJfQk9VTkQ6Ci0JCQkJc2V0TG93ZXJCb3VuZChMT1dFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VQQVJBTUVURVJTOgotCQkJCWdldEVQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX0VFWENFUFRJT05TOgotCQkJCWdldEVFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX01FVEhPRDoKLQkJCQlzZXRNZXRob2QoKE1ldGhvZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19PUkRFUkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE9SREVSRURfRUZMQUcpICE9IDApICE9IE9SREVSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX1VOSVFVRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fTE9XRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIGxvd2VyQm91bmQgIT0gTE9XRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5NRVRIT0RfUFJPWFlfX1VQUEVSX0JPVU5EOgotCQkJCXJldHVybiB1cHBlckJvdW5kICE9IFVQUEVSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSAhPSBNQU5ZX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FVFlQRToKLQkJCQlyZXR1cm4gZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLk1FVEhPRF9QUk9YWV9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVDb250YWluaW5nQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZVBhcmFtZXRlcnMgIT0gbnVsbCAmJiAhZVBhcmFtZXRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19FRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gZUV4Y2VwdGlvbnMgIT0gbnVsbCAmJiAhZUV4Y2VwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuTUVUSE9EX1BST1hZX19NRVRIT0Q6Ci0JCQkJcmV0dXJuIG1ldGhvZCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL1BhcmFtZXRlckRlY29yYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL1BhcmFtZXRlckRlY29yYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzMzcxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mby9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vaW1wbC9QYXJhbWV0ZXJEZWNvcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUGFyYW1ldGVyRGVjb3JhdG9ySW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMSAkICAkRGF0ZTogMjAwNS8wOS8xOSAxNTo0MzowMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUGFyYW1ldGVyRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRGVjb3JhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uaW1wbC5QYXJhbWV0ZXJEZWNvcmF0b3JJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5pbXBsLlBhcmFtZXRlckRlY29yYXRvckltcGwjZ2V0UGFyYW1ldGVyIDxlbT5QYXJhbWV0ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckRlY29yYXRvckltcGwgZXh0ZW5kcyBGZWF0dXJlRGVjb3JhdG9ySW1wbCBpbXBsZW1lbnRzIFBhcmFtZXRlckRlY29yYXRvcnsKLQkKLQkvKioKLQkgKiBCaXRzIGZvciBpbXBsaWNpdGx5IHNldCBmZWF0dXJlcy4gVGhpcyBpcyBpbnRlcm5hbCwgbm90IG1lYW50IGZvciBjbGllbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQQVJBTUVURVJfTkFNRV9JTVBMSUNJVCA9IDB4MUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJhbWV0ZXJEZWNvcmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbWV0ZXJEZWNvcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXIoKSA8ZW0+UGFyYW1ldGVyPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhUGFyYW1ldGVyIHBhcmFtZXRlciA9IG51bGw7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBGbGFnIGZvciBpZiB3ZSB0cmllZCB0byBsaW5rIHVwIHRoaXMgcGFyYW1ldGVyIHRvIGphdmEgcGFybS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdHJpZWRPbmNlOwotCQotCS8qKgotCSAqIFRoZSBKYXZhUGFyYW1ldGVyIHRoYXQgdGhpcyBQYXJhbWV0ZXJEZWNvcmF0b3IgaXMgZGVjb3JhdGluZy4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoKSB7Ci0JCWlmICghZUlzU2V0KEJlYW5pbmZvUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYW1ldGVyRGVjb3JhdG9yX1BhcmFtZXRlcigpKSAmJiAhdHJpZWRPbmNlKSB7Ci0JCQkvLyBOZWVkIHRvIHRyeSB0byBmaWxsIGluIHRoZSBwYXJhbWV0ZXIgc2V0dGluZy4KLQkJCXRyaWVkT25jZSA9IHRydWU7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9IGVDb250YWluZXIoKTsJLy8gU2VlIGlmIHdlIGFyZSBpbiBhIE1ldGhvZERlY29yYXRvci4KLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2REZWNvcmF0b3JJbXBsKQotCQkJCSgoTWV0aG9kRGVjb3JhdG9ySW1wbCkgY29udGFpbmVyKS5pbml0aWFsaXplUGFyYW1ldGVycygpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0UGFyYW1ldGVyR2VuKCk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyIGdldFBhcmFtZXRlckdlbigpIHsKLQkJaWYgKHBhcmFtZXRlciAhPSBudWxsICYmIHBhcmFtZXRlci5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhUGFyYW1ldGVyIG9sZFBhcmFtZXRlciA9IHBhcmFtZXRlcjsKLQkJCXBhcmFtZXRlciA9IChKYXZhUGFyYW1ldGVyKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClwYXJhbWV0ZXIpOwotCQkJaWYgKHBhcmFtZXRlciAhPSBvbGRQYXJhbWV0ZXIpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUEFSQU1FVEVSLCBvbGRQYXJhbWV0ZXIsIHBhcmFtZXRlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFQYXJhbWV0ZXIgYmFzaWNHZXRQYXJhbWV0ZXIoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKEphdmFQYXJhbWV0ZXIgbmV3UGFyYW1ldGVyKSB7Ci0JCWlmIChuZXdQYXJhbWV0ZXIgPT0gbnVsbCkKLQkJCXRyaWVkT25jZSA9IGZhbHNlOwotCQlzZXRQYXJhbWV0ZXJHZW4obmV3UGFyYW1ldGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyR2VuKEphdmFQYXJhbWV0ZXIgbmV3UGFyYW1ldGVyKSB7Ci0JCUphdmFQYXJhbWV0ZXIgb2xkUGFyYW1ldGVyID0gcGFyYW1ldGVyOwotCQlwYXJhbWV0ZXIgPSBuZXdQYXJhbWV0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QQVJBTUVURVIsIG9sZFBhcmFtZXRlciwgcGFyYW1ldGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGV0YWlscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FTU9ERUxfRUxFTUVOVF9fRUFOTk9UQVRJT05TLCBFTW9kZWxFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlyZXR1cm4gZ2V0RGV0YWlscygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVNb2RlbEVsZW1lbnQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRDYXRlZ29yeSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXJldHVybiBpc0V4cGVydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlyZXR1cm4gaXNNZXJnZUludHJvc3BlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0SW1wbGljaXRseVNldEJpdHMoKSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QQVJBTUVURVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQYXJhbWV0ZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQYXJhbWV0ZXIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXRhaWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXNldFNob3J0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRVhQRVJUOgotCQkJCXNldEV4cGVydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ISURERU46Ci0JCQkJc2V0SGlkZGVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlzZXRQcmVmZXJyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fTUVSR0VfSU5UUk9TUEVDVElPTjoKLQkJCQlzZXRNZXJnZUludHJvc3BlY3Rpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUX0RFQ09SQVRPUl9GTEFHOgotCQkJCXNldEltcGxpY2l0RGVjb3JhdG9yRmxhZygoSW1wbGljaXRJdGVtKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QQVJBTUVURVI6Ci0JCQkJc2V0UGFyYW1ldGVyKChKYXZhUGFyYW1ldGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJc2V0RU1vZGVsRWxlbWVudCgoRU1vZGVsRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJdW5zZXREaXNwbGF5TmFtZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX1NIT1JUX0RFU0NSSVBUSU9OOgotCQkJCXVuc2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJdW5zZXRFeHBlcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ISURERU46Ci0JCQkJdW5zZXRIaWRkZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJdW5zZXRQcmVmZXJyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbihNRVJHRV9JTlRST1NQRUNUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXNldEF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKElNUExJQ0lUX0RFQ09SQVRPUl9GTEFHX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QQVJBTUVURVI6Ci0JCQkJc2V0UGFyYW1ldGVyKChKYXZhUGFyYW1ldGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCNlSXNTZXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBpc1NvdXJjZVNldCgpOwkvLyBPdmVycmlkZSBzbyB0aGF0IGlmIHNldCB0byB0aGUgc2FtZSBhcyBjbGFzc25hbWUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBub3Qgc2V0LgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUlzU2V0R2VuKGVGZWF0dXJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldEdlbihFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJcmV0dXJuIGRldGFpbHMgIT0gbnVsbCAmJiAhZGV0YWlscy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gaXNTZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGlzU2V0U2hvcnREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXhwZXJ0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19ISURERU46Ci0JCQkJcmV0dXJuIGlzU2V0SGlkZGVuKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UHJlZmVycmVkKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDApICE9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRUZMQUcpICE9IDApICE9IEFUVFJJQlVURVNfRVhQTElDSVRfRU1QVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBpbXBsaWNpdGx5U2V0Qml0cyAhPSBJTVBMSUNJVExZX1NFVF9CSVRTX0VERUZBVUxUOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUEFSQU1FVEVSX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGltcGxpY2l0RGVjb3JhdG9yRmxhZyAhPSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBBUkFNRVRFUl9ERUNPUkFUT1JfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QQVJBTUVURVJfREVDT1JBVE9SX19QQVJBTUVURVI6Ci0JCQkJcmV0dXJuIHBhcmFtZXRlciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9pbXBsL1Byb3BlcnR5RGVjb3JhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvUHJvcGVydHlEZWNvcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTMwYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2ltcGwvUHJvcGVydHlEZWNvcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQcm9wZXJ0eURlY29yYXRvckltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTggJCAgJERhdGU6IDIwMDUvMDkvMTkgMTU6NDM6MDIgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eSBEZWNvcmF0b3I8L2I+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/IGZlYXR1cmUuZ2V0RVR5cGUoKSA6IG51bGw7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHByb3BlcnR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVR5cGUoRUNsYXNzaWZpZXIgcHJvcGVydHlUeXBlKSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3VuZChib29sZWFuIG5ld0JvdW5kKSB7Ci0JCWJvb2xlYW4gb2xkQm91bmQgPSAoZUZsYWdzICYgQk9VTkRfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdCb3VuZCkgZUZsYWdzIHw9IEJPVU5EX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Qk9VTkRfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkQm91bmRFU2V0ID0gKGVGbGFncyAmIEJPVU5EX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gQk9VTkRfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5ELCBvbGRCb3VuZCwgbmV3Qm91bmQsICFvbGRCb3VuZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJvdW5kKCkgewotCQlib29sZWFuIG9sZEJvdW5kID0gKGVGbGFncyAmIEJPVU5EX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZEJvdW5kRVNldCA9IChlRmxhZ3MgJiBCT1VORF9FU0VURkxBRykgIT0gMDsKLQkJaWYgKEJPVU5EX0VERUZBVUxUKSBlRmxhZ3MgfD0gQk9VTkRfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5CT1VORF9FRkxBRzsKLQkJZUZsYWdzICY9IH5CT1VORF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19CT1VORCwgb2xkQm91bmQsIEJPVU5EX0VERUZBVUxULCBvbGRCb3VuZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJvdW5kKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEJPVU5EX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RyYWluZWQoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQ09OU1RSQUlORURfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uc3RyYWluZWQoYm9vbGVhbiBuZXdDb25zdHJhaW5lZCkgewotCQlib29sZWFuIG9sZENvbnN0cmFpbmVkID0gKGVGbGFncyAmIENPTlNUUkFJTkVEX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3Q29uc3RyYWluZWQpIGVGbGFncyB8PSBDT05TVFJBSU5FRF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkNPTlNUUkFJTkVEX0VGTEFHOwotCQlib29sZWFuIG9sZENvbnN0cmFpbmVkRVNldCA9IChlRmxhZ3MgJiBDT05TVFJBSU5FRF9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IENPTlNUUkFJTkVEX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRCwgb2xkQ29uc3RyYWluZWQsIG5ld0NvbnN0cmFpbmVkLCAhb2xkQ29uc3RyYWluZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDb25zdHJhaW5lZCgpIHsKLQkJYm9vbGVhbiBvbGRDb25zdHJhaW5lZCA9IChlRmxhZ3MgJiBDT05TVFJBSU5FRF9FRkxBRykgIT0gMDsKLQkJYm9vbGVhbiBvbGRDb25zdHJhaW5lZEVTZXQgPSAoZUZsYWdzICYgQ09OU1RSQUlORURfRVNFVEZMQUcpICE9IDA7Ci0JCWlmIChDT05TVFJBSU5FRF9FREVGQVVMVCkgZUZsYWdzIHw9IENPTlNUUkFJTkVEX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Q09OU1RSQUlORURfRUZMQUc7Ci0JCWVGbGFncyAmPSB+Q09OU1RSQUlORURfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQsIG9sZENvbnN0cmFpbmVkLCBDT05TVFJBSU5FRF9FREVGQVVMVCwgb2xkQ29uc3RyYWluZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb25zdHJhaW5lZCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBDT05TVFJBSU5FRF9FU0VURkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rlc2lnblRpbWUoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgREVTSUdOX1RJTUVfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzaWduVGltZShib29sZWFuIG5ld0Rlc2lnblRpbWUpIHsKLQkJYm9vbGVhbiBvbGREZXNpZ25UaW1lID0gKGVGbGFncyAmIERFU0lHTl9USU1FX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RGVzaWduVGltZSkgZUZsYWdzIHw9IERFU0lHTl9USU1FX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+REVTSUdOX1RJTUVfRUZMQUc7Ci0JCWJvb2xlYW4gb2xkRGVzaWduVGltZUVTZXQgPSAoZUZsYWdzICYgREVTSUdOX1RJTUVfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBERVNJR05fVElNRV9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUUsIG9sZERlc2lnblRpbWUsIG5ld0Rlc2lnblRpbWUsICFvbGREZXNpZ25UaW1lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RGVzaWduVGltZSgpIHsKLQkJYm9vbGVhbiBvbGREZXNpZ25UaW1lID0gKGVGbGFncyAmIERFU0lHTl9USU1FX0VGTEFHKSAhPSAwOwotCQlib29sZWFuIG9sZERlc2lnblRpbWVFU2V0ID0gKGVGbGFncyAmIERFU0lHTl9USU1FX0VTRVRGTEFHKSAhPSAwOwotCQlpZiAoREVTSUdOX1RJTUVfRURFRkFVTFQpIGVGbGFncyB8PSBERVNJR05fVElNRV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkRFU0lHTl9USU1FX0VGTEFHOwotCQllRmxhZ3MgJj0gfkRFU0lHTl9USU1FX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FLCBvbGREZXNpZ25UaW1lLCBERVNJR05fVElNRV9FREVGQVVMVCwgb2xkRGVzaWduVGltZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlc2lnblRpbWUoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgREVTSUdOX1RJTUVfRVNFVEZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbHdheXNJbmNvbXBhdGlibGUoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHdheXNJbmNvbXBhdGlibGUoYm9vbGVhbiBuZXdBbHdheXNJbmNvbXBhdGlibGUpIHsKLQkJYm9vbGVhbiBvbGRBbHdheXNJbmNvbXBhdGlibGUgPSAoZUZsYWdzICYgQUxXQVlTX0lOQ09NUEFUSUJMRV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0Fsd2F5c0luY29tcGF0aWJsZSkgZUZsYWdzIHw9IEFMV0FZU19JTkNPTVBBVElCTEVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5BTFdBWVNfSU5DT01QQVRJQkxFX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFLCBvbGRBbHdheXNJbmNvbXBhdGlibGUsIG5ld0Fsd2F5c0luY29tcGF0aWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWx0ZXJGbGFncygpIHsKLQkJaWYgKGZpbHRlckZsYWdzID09IG51bGwpIHsKLQkJCWZpbHRlckZsYWdzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklMVEVSX0ZMQUdTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyRmxhZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEZJRUxEX1JFQURfT05MWV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZFJlYWRPbmx5KGJvb2xlYW4gbmV3RmllbGRSZWFkT25seSkgewotCQlib29sZWFuIG9sZEZpZWxkUmVhZE9ubHkgPSAoZUZsYWdzICYgRklFTERfUkVBRF9PTkxZX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RmllbGRSZWFkT25seSkgZUZsYWdzIHw9IEZJRUxEX1JFQURfT05MWV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkZJRUxEX1JFQURfT05MWV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZLCBvbGRGaWVsZFJlYWRPbmx5LCBuZXdGaWVsZFJlYWRPbmx5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkgewotCQlpZiAocHJvcGVydHlFZGl0b3JDbGFzcyAhPSBudWxsICYmIHByb3BlcnR5RWRpdG9yQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZFByb3BlcnR5RWRpdG9yQ2xhc3MgPSBwcm9wZXJ0eUVkaXRvckNsYXNzOwotCQkJcHJvcGVydHlFZGl0b3JDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXByb3BlcnR5RWRpdG9yQ2xhc3MpOwotCQkJaWYgKHByb3BlcnR5RWRpdG9yQ2xhc3MgIT0gb2xkUHJvcGVydHlFZGl0b3JDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUywgb2xkUHJvcGVydHlFZGl0b3JDbGFzcywgcHJvcGVydHlFZGl0b3JDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eUVkaXRvckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5RWRpdG9yQ2xhc3MoSmF2YUNsYXNzIG5ld1Byb3BlcnR5RWRpdG9yQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZFByb3BlcnR5RWRpdG9yQ2xhc3MgPSBwcm9wZXJ0eUVkaXRvckNsYXNzOwotCQlwcm9wZXJ0eUVkaXRvckNsYXNzID0gbmV3UHJvcGVydHlFZGl0b3JDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTLCBvbGRQcm9wZXJ0eUVkaXRvckNsYXNzLCBwcm9wZXJ0eUVkaXRvckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRSZWFkTWV0aG9kKCkgewotCQlpZiAocmVhZE1ldGhvZCAhPSBudWxsICYmIHJlYWRNZXRob2QuZUlzUHJveHkoKSkgewotCQkJTWV0aG9kIG9sZFJlYWRNZXRob2QgPSByZWFkTWV0aG9kOwotCQkJcmVhZE1ldGhvZCA9IChNZXRob2QpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXJlYWRNZXRob2QpOwotCQkJaWYgKHJlYWRNZXRob2QgIT0gb2xkUmVhZE1ldGhvZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9ELCBvbGRSZWFkTWV0aG9kLCByZWFkTWV0aG9kKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWRNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE1ldGhvZChNZXRob2QgbmV3UmVhZE1ldGhvZCkgewotCQlNZXRob2Qgb2xkUmVhZE1ldGhvZCA9IHJlYWRNZXRob2Q7Ci0JCXJlYWRNZXRob2QgPSBuZXdSZWFkTWV0aG9kOwotCQlib29sZWFuIG9sZFJlYWRNZXRob2RFU2V0ID0gKGVGbGFncyAmIFJFQURfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQllRmxhZ3MgfD0gUkVBRF9NRVRIT0RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9ELCBvbGRSZWFkTWV0aG9kLCByZWFkTWV0aG9kLCAhb2xkUmVhZE1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlYWRNZXRob2QoKSB7Ci0JCU1ldGhvZCBvbGRSZWFkTWV0aG9kID0gcmVhZE1ldGhvZDsKLQkJYm9vbGVhbiBvbGRSZWFkTWV0aG9kRVNldCA9IChlRmxhZ3MgJiBSRUFEX01FVEhPRF9FU0VURkxBRykgIT0gMDsKLQkJcmVhZE1ldGhvZCA9IG51bGw7Ci0JCWVGbGFncyAmPSB+UkVBRF9NRVRIT0RfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVBRF9NRVRIT0QsIG9sZFJlYWRNZXRob2QsIG51bGwsIG9sZFJlYWRNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZWFkTWV0aG9kKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFJFQURfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0V3JpdGVNZXRob2QoKSB7Ci0JCWlmICh3cml0ZU1ldGhvZCAhPSBudWxsICYmIHdyaXRlTWV0aG9kLmVJc1Byb3h5KCkpIHsKLQkJCU1ldGhvZCBvbGRXcml0ZU1ldGhvZCA9IHdyaXRlTWV0aG9kOwotCQkJd3JpdGVNZXRob2QgPSAoTWV0aG9kKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCl3cml0ZU1ldGhvZCk7Ci0JCQlpZiAod3JpdGVNZXRob2QgIT0gb2xkV3JpdGVNZXRob2QpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19XUklURV9NRVRIT0QsIG9sZFdyaXRlTWV0aG9kLCB3cml0ZU1ldGhvZCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3cml0ZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXcml0ZU1ldGhvZChNZXRob2QgbmV3V3JpdGVNZXRob2QpIHsKLQkJTWV0aG9kIG9sZFdyaXRlTWV0aG9kID0gd3JpdGVNZXRob2Q7Ci0JCXdyaXRlTWV0aG9kID0gbmV3V3JpdGVNZXRob2Q7Ci0JCWJvb2xlYW4gb2xkV3JpdGVNZXRob2RFU2V0ID0gKGVGbGFncyAmIFdSSVRFX01FVEhPRF9FU0VURkxBRykgIT0gMDsKLQkJZUZsYWdzIHw9IFdSSVRFX01FVEhPRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9ELCBvbGRXcml0ZU1ldGhvZCwgd3JpdGVNZXRob2QsICFvbGRXcml0ZU1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdyaXRlTWV0aG9kKCkgewotCQlNZXRob2Qgb2xkV3JpdGVNZXRob2QgPSB3cml0ZU1ldGhvZDsKLQkJYm9vbGVhbiBvbGRXcml0ZU1ldGhvZEVTZXQgPSAoZUZsYWdzICYgV1JJVEVfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCQl3cml0ZU1ldGhvZCA9IG51bGw7Ci0JCWVGbGFncyAmPSB+V1JJVEVfTUVUSE9EX0VTRVRGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRCwgb2xkV3JpdGVNZXRob2QsIG51bGwsIG9sZFdyaXRlTWV0aG9kRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0V3JpdGVNZXRob2QoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgV1JJVEVfTUVUSE9EX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGaWVsZCBnZXRGaWVsZCgpIHsKLQkJaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuZUlzUHJveHkoKSkgewotCQkJRmllbGQgb2xkRmllbGQgPSBmaWVsZDsKLQkJCWZpZWxkID0gKEZpZWxkKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClmaWVsZCk7Ci0JCQlpZiAoZmllbGQgIT0gb2xkRmllbGQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRCwgb2xkRmllbGQsIGZpZWxkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGaWVsZCBiYXNpY0dldEZpZWxkKCkgewotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGQoRmllbGQgbmV3RmllbGQpIHsKLQkJRmllbGQgb2xkRmllbGQgPSBmaWVsZDsKLQkJZmllbGQgPSBuZXdGaWVsZDsKLQkJYm9vbGVhbiBvbGRGaWVsZEVTZXQgPSAoZUZsYWdzICYgRklFTERfRVNFVEZMQUcpICE9IDA7Ci0JCWVGbGFncyB8PSBGSUVMRF9FU0VURkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQsIG9sZEZpZWxkLCBmaWVsZCwgIW9sZEZpZWxkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RmllbGQoKSB7Ci0JCUZpZWxkIG9sZEZpZWxkID0gZmllbGQ7Ci0JCWJvb2xlYW4gb2xkRmllbGRFU2V0ID0gKGVGbGFncyAmIEZJRUxEX0VTRVRGTEFHKSAhPSAwOwotCQlmaWVsZCA9IG51bGw7Ci0JCWVGbGFncyAmPSB+RklFTERfRVNFVEZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQsIG9sZEZpZWxkLCBudWxsLCBvbGRGaWVsZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpZWxkKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEZJRUxEX0VTRVRGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChib3VuZDogIik7Ci0JCWlmICgoZUZsYWdzICYgQk9VTkRfRVNFVEZMQUcpICE9IDApIHJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEJPVU5EX0VGTEFHKSAhPSAwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RyYWluZWQ6ICIpOwotCQlpZiAoKGVGbGFncyAmIENPTlNUUkFJTkVEX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBDT05TVFJBSU5FRF9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2lnblRpbWU6ICIpOwotCQlpZiAoKGVGbGFncyAmIERFU0lHTl9USU1FX0VTRVRGTEFHKSAhPSAwKSByZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBERVNJR05fVElNRV9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsd2F5c0luY29tcGF0aWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEFMV0FZU19JTkNPTVBBVElCTEVfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbHRlckZsYWdzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWx0ZXJGbGFncyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRSZWFkT25seTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJRUxEX1JFQURfT05MWV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkgewotCQlyZXR1cm4gcHJvcGVydHlFZGl0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGJhc2ljR2V0UmVhZE1ldGhvZCgpIHsKLQkJcmV0dXJuIHJlYWRNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZCBiYXNpY0dldFdyaXRlTWV0aG9kKCkgewotCQlyZXR1cm4gd3JpdGVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERldGFpbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRU1PREVMX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVNT0RFTF9FTEVNRU5UX19FQU5OT1RBVElPTlMsIEVNb2RlbEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBnZXREZXRhaWxzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFTW9kZWxFbGVtZW50KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fU0hPUlRfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQlyZXR1cm4gaXNFeHBlcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlyZXR1cm4gaXNQcmVmZXJyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJcmV0dXJuIGlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZOgotCQkJCXJldHVybiBpc0F0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRJbXBsaWNpdGx5U2V0Qml0cygpKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EOgotCQkJCXJldHVybiBpc0JvdW5kKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19DT05TVFJBSU5FRDoKLQkJCQlyZXR1cm4gaXNDb25zdHJhaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUU6Ci0JCQkJcmV0dXJuIGlzRGVzaWduVGltZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQUxXQVlTX0lOQ09NUEFUSUJMRToKLQkJCQlyZXR1cm4gaXNBbHdheXNJbmNvbXBhdGlibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyRmxhZ3MoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZOgotCQkJCXJldHVybiBpc0ZpZWxkUmVhZE9ubHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFQURfTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVhZE1ldGhvZCgpOwotCQkJCXJldHVybiBiYXNpY0dldFJlYWRNZXRob2QoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0V3JpdGVNZXRob2QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRXcml0ZU1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEZpZWxkKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVUQUlMUzoKLQkJCQlnZXREZXRhaWxzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXRhaWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VNT0RFTF9FTEVNRU5UOgotCQkJCXNldEVNb2RlbEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlzZXRTaG9ydERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJc2V0RXhwZXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXNldEhpZGRlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1BSRUZFUlJFRDoKLQkJCQlzZXRQcmVmZXJyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXNldE1lcmdlSW50cm9zcGVjdGlvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJc2V0QXR0cmlidXRlc0V4cGxpY2l0RW1wdHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVExZX1NFVF9CSVRTOgotCQkJCXNldEltcGxpY2l0bHlTZXRCaXRzKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJc2V0SW1wbGljaXREZWNvcmF0b3JGbGFnKChJbXBsaWNpdEl0ZW0pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EOgotCQkJCXNldEJvdW5kKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQ6Ci0JCQkJc2V0Q29uc3RyYWluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVNJR05fVElNRToKLQkJCQlzZXREZXNpZ25UaW1lKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQUxXQVlTX0lOQ09NUEFUSUJMRToKLQkJCQlzZXRBbHdheXNJbmNvbXBhdGlibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1M6Ci0JCQkJZ2V0RmlsdGVyRmxhZ3MoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlckZsYWdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJRUxEX1JFQURfT05MWToKLQkJCQlzZXRGaWVsZFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJPUEVSVFlfRURJVE9SX0NMQVNTOgotCQkJCXNldFByb3BlcnR5RWRpdG9yQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRDoKLQkJCQlzZXRSZWFkTWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fV1JJVEVfTUVUSE9EOgotCQkJCXNldFdyaXRlTWV0aG9kKChNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklFTEQ6Ci0JCQkJc2V0RmllbGQoKEZpZWxkKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFVEFJTFM6Ci0JCQkJZ2V0RGV0YWlscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlzZXRFTW9kZWxFbGVtZW50KChFTW9kZWxFbGVtZW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUkVGRVJFTkNFUzoKLQkJCQlnZXRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQl1bnNldERpc3BsYXlOYW1lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQl1bnNldFNob3J0RGVzY3JpcHRpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0VYUEVSVDoKLQkJCQl1bnNldEV4cGVydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSElEREVOOgotCQkJCXVuc2V0SGlkZGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19QUkVGRVJSRUQ6Ci0JCQkJdW5zZXRQcmVmZXJyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX01FUkdFX0lOVFJPU1BFQ1RJT046Ci0JCQkJc2V0TWVyZ2VJbnRyb3NwZWN0aW9uKE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWToKLQkJCQlzZXRBdHRyaWJ1dGVzRXhwbGljaXRFbXB0eShBVFRSSUJVVEVTX0VYUExJQ0lUX0VNUFRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0lNUExJQ0lUTFlfU0VUX0JJVFM6Ci0JCQkJc2V0SW1wbGljaXRseVNldEJpdHMoSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19JTVBMSUNJVF9ERUNPUkFUT1JfRkxBRzoKLQkJCQlzZXRJbXBsaWNpdERlY29yYXRvckZsYWcoSU1QTElDSVRfREVDT1JBVE9SX0ZMQUdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0JPVU5EOgotCQkJCXVuc2V0Qm91bmQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlNUUkFJTkVEOgotCQkJCXVuc2V0Q29uc3RyYWluZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RFU0lHTl9USU1FOgotCQkJCXVuc2V0RGVzaWduVGltZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQUxXQVlTX0lOQ09NUEFUSUJMRToKLQkJCQlzZXRBbHdheXNJbmNvbXBhdGlibGUoQUxXQVlTX0lOQ09NUEFUSUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUxURVJfRkxBR1M6Ci0JCQkJZ2V0RmlsdGVyRmxhZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fRklFTERfUkVBRF9PTkxZOgotCQkJCXNldEZpZWxkUmVhZE9ubHkoRklFTERfUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUzoKLQkJCQlzZXRQcm9wZXJ0eUVkaXRvckNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRDoKLQkJCQl1bnNldFJlYWRNZXRob2QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRDoKLQkJCQl1bnNldFdyaXRlTWV0aG9kKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQl1bnNldEZpZWxkKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0I2VJc1NldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNTb3VyY2VTZXQoKTsJLy8gT3ZlcnJpZGUgc28gdGhhdCBpZiBzZXQgdG8gdGhlIHNhbWUgYXMgY2xhc3NuYW1lLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgbm90IHNldC4KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVJc1NldEdlbihlRmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXRHZW4oRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlICE9IG51bGwgOiAhU09VUkNFX0VERUZBVUxULmVxdWFscyhzb3VyY2UpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19ERVRBSUxTOgotCQkJCXJldHVybiBkZXRhaWxzICE9IG51bGwgJiYgIWRldGFpbHMuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FTU9ERUxfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RU1vZGVsRWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NPTlRFTlRTOgotCQkJCXJldHVybiBjb250ZW50cyAhPSBudWxsICYmICFjb250ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gaXNTZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19TSE9SVF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gaXNTZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19FWFBFUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXhwZXJ0KCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0hJRERFTjoKLQkJCQlyZXR1cm4gaXNTZXRIaWRkZW4oKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fUFJFRkVSUkVEOgotCQkJCXJldHVybiBpc1NldFByZWZlcnJlZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19NRVJHRV9JTlRST1NQRUNUSU9OOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE1FUkdFX0lOVFJPU1BFQ1RJT05fRUZMQUcpICE9IDApICE9IE1FUkdFX0lOVFJPU1BFQ1RJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0FUVFJJQlVURVNfRVhQTElDSVRfRU1QVFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FRkxBRykgIT0gMCkgIT0gQVRUUklCVVRFU19FWFBMSUNJVF9FTVBUWV9FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRMWV9TRVRfQklUUzoKLQkJCQlyZXR1cm4gaW1wbGljaXRseVNldEJpdHMgIT0gSU1QTElDSVRMWV9TRVRfQklUU19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fSU1QTElDSVRfREVDT1JBVE9SX0ZMQUc6Ci0JCQkJcmV0dXJuIGltcGxpY2l0RGVjb3JhdG9yRmxhZyAhPSBJTVBMSUNJVF9ERUNPUkFUT1JfRkxBR19FREVGQVVMVDsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQk9VTkQ6Ci0JCQkJcmV0dXJuIGlzU2V0Qm91bmQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fQ09OU1RSQUlORUQ6Ci0JCQkJcmV0dXJuIGlzU2V0Q29uc3RyYWluZWQoKTsKLQkJCWNhc2UgQmVhbmluZm9QYWNrYWdlLlBST1BFUlRZX0RFQ09SQVRPUl9fREVTSUdOX1RJTUU6Ci0JCQkJcmV0dXJuIGlzU2V0RGVzaWduVGltZSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19BTFdBWVNfSU5DT01QQVRJQkxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFMV0FZU19JTkNPTVBBVElCTEVfRUZMQUcpICE9IDApICE9IEFMV0FZU19JTkNPTVBBVElCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX0ZJTFRFUl9GTEFHUzoKLQkJCQlyZXR1cm4gZmlsdGVyRmxhZ3MgIT0gbnVsbCAmJiAhZmlsdGVyRmxhZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRF9SRUFEX09OTFk6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklFTERfUkVBRF9PTkxZX0VGTEFHKSAhPSAwKSAhPSBGSUVMRF9SRUFEX09OTFlfRURFRkFVTFQ7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1BST1BFUlRZX0VESVRPUl9DTEFTUzoKLQkJCQlyZXR1cm4gcHJvcGVydHlFZGl0b3JDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19SRUFEX01FVEhPRDoKLQkJCQlyZXR1cm4gaXNTZXRSZWFkTWV0aG9kKCk7Ci0JCQljYXNlIEJlYW5pbmZvUGFja2FnZS5QUk9QRVJUWV9ERUNPUkFUT1JfX1dSSVRFX01FVEhPRDoKLQkJCQlyZXR1cm4gaXNTZXRXcml0ZU1ldGhvZCgpOwotCQkJY2FzZSBCZWFuaW5mb1BhY2thZ2UuUFJPUEVSVFlfREVDT1JBVE9SX19GSUVMRDoKLQkJCQlyZXR1cm4gaXNTZXRGaWVsZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3IjaXNXcml0ZWFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKCkgewotCQlyZXR1cm4gZ2V0V3JpdGVNZXRob2QoKSAhPSBudWxsIHx8IChnZXRGaWVsZCgpICE9IG51bGwgJiYgIWlzRmllbGRSZWFkT25seSgpKTsgCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvciNpc1JlYWRhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UmVhZE1ldGhvZCgpICE9IG51bGwgfHwgZ2V0RmllbGQoKSAhPSBudWxsOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9CZWFuUmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0JlYW5SZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlYjVjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0JlYW5SZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBCZWFuUmVjb3JkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6NDQ6NTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBCZWFuRGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEJlYW5EZXNjcmlwdG9yLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgQmVhblJlY29yZCBleHRlbmRzIEZlYXR1cmVSZWNvcmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk3OTkyMDY2NEw7Ci0JCi0JcHVibGljIFN0cmluZyBjdXN0b21pemVyQ2xhc3NOYW1lOwotCXB1YmxpYyBib29sZWFuIG1lcmdlSW5oZXJpdGVkUHJvcGVydGllczsKLQlwdWJsaWMgYm9vbGVhbiBtZXJnZUluaGVyaXRlZE9wZXJhdGlvbnM7Ci0JcHVibGljIGJvb2xlYW4gbWVyZ2VJbmhlcml0ZWRFdmVudHM7Ci0JLyoqCi0JICogTmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGFyZSB0byBub3QgYmUgaW5oZXJpdGVkIGluIGdldEFsbFByb3BlcnRpZXMoKS4gSXQgaXMgc2V0IG9ubHkKLQkgKiBpZiB0aGUgbGlzdCBpcyBub3QgdGhlIGZ1bGwgbGlzdCBvZiBpbmhlcml0ZWQgcHJvcGVydGllcy4KLQkgKiBJZiBhbGwgaW5oZXJpdGVkIG9yIG1lcmdlSW5oZXJpdGVkUHJvcGVydGllcyBpcyBmYWxzZSwgdGhlbiB0aGUgZmllbGQgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gU2F2ZSBzcGFjZSB0aGF0IHdheS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gbm90SW5oZXJpdGVkUHJvcGVydHlOYW1lczsKLQkvKioKLQkgKiBOYW1lcyBvZiBvcGVyYXRpb25zIHRoYXQgYXJlIHRvIG5vdCBiZSBpbmhlcml0ZWQgaW4gZ2V0RUFsbE9wZXJhdGlvbnMoKS4gSXQgaXMgc2V0IG9ubHkKLQkgKiBpZiB0aGUgbGlzdCBpcyBub3QgdGhlIGZ1bGwgbGlzdCBvZiBpbmhlcml0ZWQgb3BlcmF0aW9ucy4gCi0JICogSWYgYWxsIGFyZSBpbmhlcml0ZWQgb3IgaWYgbWVyZ2VJbmhlcml0ZWRPcGVyYXRpb25zIGlzIGZhbHNlLCB0aGVuIHRoZSBmaWVsZCB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBTYXZlIHNwYWNlIHRoYXQgd2F5LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBub3RJbmhlcml0ZWRPcGVyYXRpb25OYW1lczsKLQkvKioKLQkgKiBOYW1lcyBvZiBldmVudHMgdGhhdCBhcmUgdG8gbm90IGJlIGluaGVyaXRlZCBpbiBnZXRBbGxFdmVudHMoKS4gSXQgaXMgc2V0IG9ubHkKLQkgKiBpZiB0aGUgbGlzdCBpcyBub3QgdGhlIGZ1bGwgbGlzdCBvZiBpbmhlcml0ZWQgZXZlbnRzLgotCSAqIElmIGFsbCBhcmUgaW5oZXJpdGVkIG9yIGlmIG1lcmdlSW5oZXJpdGVkRXZlbnRzIGlzIGZhbHNlLCB0aGVuIHRoZSBmaWVsZCB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBTYXZlIHNwYWNlIHRoYXQgd2F5LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBub3RJbmhlcml0ZWRFdmVudE5hbWVzOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0V2ZW50U2V0UmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0V2ZW50U2V0UmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjQ3ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9FdmVudFNldFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEV2ZW50U2V0UmVjb3JkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6NDQ6NTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBFdmVudFNldERlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFdmVudFNldERlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudFNldFJlY29yZCBleHRlbmRzIEZlYXR1cmVSZWNvcmQgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODA3NzM0MjBMOwotCQotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIGFkZExpc3RlbmVyTWV0aG9kOwotCXB1YmxpYyBTdHJpbmcgZXZlbnRBZGFwdGVyQ2xhc3NOYW1lOwotCXB1YmxpYyBNZXRob2RSZWNvcmRbXSBsaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzOwotCXB1YmxpYyBTdHJpbmcgbGlzdGVuZXJUeXBlTmFtZTsKLQlwdWJsaWMgUmVmbGVjdE1ldGhvZFJlY29yZCByZW1vdmVMaXN0ZW5lck1ldGhvZDsKLQlwdWJsaWMgYm9vbGVhbiBpbkRlZmF1bHRFdmVudFNldDsKLQlwdWJsaWMgYm9vbGVhbiB1bmljYXN0OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9GZWF0dXJlQXR0cmlidXRlVmFsdWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vRmVhdHVyZUF0dHJpYnV0ZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMGUzMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9GZWF0dXJlQXR0cmlidXRlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRmVhdHVyZUF0dHJpYnV0ZVZhbHVlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDYvMzAgMTM6NDc6MjYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWFwVHlwZXM7Ci0KLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSB2YWx1ZSBmb3IgYSBGZWF0dXJlQXR0cmlidXRlLiBJdCB3cmFwcGVycyB0aGUgdHJ1ZSBqYXZhIG9iamVjdC4KLSAqIFVzZSB0aGUgZ2V0T2JqZWN0IG1ldGhvZCB0byBnZXQgdGhlIGphdmEgdmFsdWUuCi0gKiA8cD4KLSAqIFdlIGNhbiBvbmx5IHJlcHJlc2VudCBTdHJpbmdzLCBwcmltaXRpdmVzLCBhbmQgYXJyYXlzLiAoUHJpbWl0aXZlcyB3aWxsIGNvbnZlcnRlZAotICogdG8gdGhlaXIgd3JhcHBlciBjbGFzcyAoZS5nLiBMb25nKSwgYW5kIGJ5dGUsIHNob3J0LCBhbmQgaW50IHdpbGwgbW92ZSB1cCB0byBMb25nLAotICogYW5kIGZsb2F0IHdpbGwgbW92ZSB1cCB0byBEb3VibGUpLiAgQW5kIGFueSBraW5kIG9mIHZhbGlkIGFycmF5IG9uIHRoZSBqYXZhIEJlYW5JbmZvIHNpZGUKLSAqIHdpbGwgYmUgY29udmVydGVkIHRvIGFuIE9iamVjdCBhcnJheSBvbiB0aGUgSURFIHNpZGUuIFdlIGRvbid0IGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gYWxsb3cgbW9yZSBjb21wbGV4IG9iamVjdHMgCi0gKiBiZWNhdXNlIHRoZSBJREUgbWF5IG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkgY2xhc3NlcyBhdmFpbGFibGUgdG8gaXQgdGhhdCAKLSAqIHRoZSBCZWFuSW5mbyBtYXkgb2YgaGFkIGF2YWlsYWJsZSB0byBpdC4gSW52YWxpZCBvYmplY3RzIHdpbGwgYmUgcmVwcmVzZW50ZWQKLSAqIGJ5IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uSW52YWxpZE9iamVjdH0uCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPgotICogQ2xhc3Mgb2JqZWN0cyB0aGF0IGFyZSB2YWx1ZXMgb2YgRmVhdHVyZSBhdHRyaWJ1dGVzIG9uIHRoZSBqYXZhIEJlYW5JbmZvIHNpZGUgd2lsbCBiZQotICogY29udmVydGVkIHRvIHNpbXBsZSBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGNsYXNzbmFtZSB3aGVuIG1vdmVkIHRvIHRoZSBjbGllbnQgKElERSkgc2lkZS4KLSAqIFRoYXQgaXMgYmVjYXVzZSB0aGUgY2xhc3NlcyBwcm9iYWJseSB3aWxsIG5vdCBiZSBhdmFpbGFibGUgb24gdGhlIElERSBzaWRlLCBidXQgY2FuIGJlCi0gKiB1c2VkIHRvIHJlY29uc3RydWN0IHRoZSBjbGFzcyB3aGVuIHVzZWQgYmFjayBvbiB0aGUgamF2YSB2bSBzaWRlLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkKLQlwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgdmFsdWU7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgT2JqZWN0IGludGVybmFsVmFsdWU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTcxNzYzNDg0NEw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBpbml0IHN0cmluZy4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGNsaWVudHMuCi0JICogQHBhcmFtIGluaXRTdHJpbmcKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlKFN0cmluZyBpbml0U3RyaW5nKSB7Ci0JCS8vIFVzZSB0aGUgaW5pdCBzdHJpbmcgdG8gY3JlYXRlIHRoZSB2YWx1ZS4gVGhpcyBpcyBvdXIKLQkJLy8gb3duIHNob3J0LWhhbmQgZm9yIHRoaXMuCi0JCXZhbHVlID0gcGFyc2VTdHJpbmcoaW5pdFN0cmluZyk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIGN1c3RvbWVyIHdhbnRzIHRvIGZsdWZmIG9uZSB1cC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlKCkgewotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgdmFsdWUuCi0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5zZXRJbnRlcm5hbFZhbHVlKG51bGwpOwotCX0KLQkJCi0JLyoqCi0JICogU2V0IHRoZSBpbnRlcm5hbCB2YWx1ZS4KLQkgKiBAcGFyYW0gaW50ZXJuYWxWYWx1ZSBUaGUgaW50ZXJuYWxWYWx1ZSB0byBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxWYWx1ZShPYmplY3QgaW50ZXJuYWxWYWx1ZSkgewotCQl0aGlzLmludGVybmFsVmFsdWUgPSBpbnRlcm5hbFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGludGVybmFsIHZhbHVlLiBJdCBpcyB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IG1hc3NhZ2VkIGludG8gYW4gZWFzaWVyIHRvIHVzZSBmb3JtCi0JICogaW4gdGhlIElERS4gSXQgd2lsbCBub3QgYmUgc2VyaWFsaXplZCBvdXQuIEl0IHdpbGwgbm90IGJlIHJlY29uc3RydWN0ZWQgZnJvbSBhbiBpbml0IHN0cmluZy4KLQkgKiA8cD4gCi0JICogSXQgZG9lcyBub3QgbmVlZCB0byBiZSB1c2VkLiBJdCB3aWxsIGJlIGNsZWFyZWQgaWYKLQkgKiBhIG5ldyB2YWx1ZSBpcyBzZXQuIEZvciBleGFtcGxlLCBpZiB0aGUgdmFsdWUgaXMgYSBjb21wbGljYXRlZCBhcnJheSAoYmVjYXVzZSB5b3UgY2FuJ3QgaGF2ZQotCSAqIHNwZWNpYWwgY2xhc3NlcyBpbiB0aGUgYXR0cmlidXRlIHZhbHVlIG9uIHRoZSBCZWFuSW5mbyBzaWRlKSB0aGUgZmlyc3QgdXNhZ2Ugb2YgdGhpcyB2YWx1ZSBjYW4KLQkgKiBiZSB0cmFuc2xhdGVkIGludG8gYW4gZWFzaWVyIGZvcm0gdG8gdXNlLCBzdWNoIGFzIGEgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW50ZXJuYWxWYWx1ZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEludGVybmFsVmFsdWUoKSB7Ci0JCXJldHVybiBpbnRlcm5hbFZhbHVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBtYWtlU3RyaW5nKHZhbHVlKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIHRha2UgdGhlIG9iamVjdCBhbmQgdHVybiBpdCBpbnRvIHRoZQotCSAqIHN0cmluZyBmb3JtIHRoYXQgaXMgcmVxdWlyZWQgZm9yIEVNRiBzZXJpYWxpemF0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5LiBJdCBjYW4gYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgCi0JICogcHVycG9zZXMgYnkgY2xpZW50cywgYnV0IHRoZXkgd291bGQgbm90IGhhdmUgYW55IHJlYWwKLQkgKiBydW50aW1lIG5lZWQgZm9yIHRoaXMuCi0JICogPHA+Ci0JICogT3V0cHV0IGZvcm1hdCB3b3VsZCBiZSAodGhlcmUgd29uJ3QgYmUgYW55IG5ld2xpbmVzIGluIHRoZSBhY3R1YWwgc3RyaW5nKQotCSAqIDxwcmU+Ci0JICogICBTdHJpbmc6ICJ6eHZ6eHYiCi0JICogICBOdW1iZXI6IG51bWJlcgotCSAqICAgQm9vbGVhbjogdHJ1ZSBvciBmYWxzZQotCSAqICAgQ2hhcmFjdGVyOiAnYycKLQkgKiAgIG51bGw6IG51bGwKLQkgKiAKLQkgKiAgIEFycmF5OiAoYWxsIGFycmF5cyB3aWxsIGJlIHR1cm5lZCBpbnRvIE9iamVjdFtdKQotCSAqICAgICBbZGltXXtlMSwgZTJ9Ci0JICogICAgIFtkaW0xXVtkaW0yXXtbZGltMWFde2UxLCBlMn0sIFtkaW0yYV17ZTMsIGU0fX0KLQkgKiAgIHdoZXJlIGVuIGFyZSBvYmplY3RzIHRoYXQgZm9sbG93IHRoZSBwYXR0ZXJuIGZvciBzaW5nbGUgb3V0cHV0IGFib3ZlLgotCSAqIAotCSAqICAgQW55IGludmFsaWQgb2JqZWN0IChpLmUuIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgaGFuZGxlKSB3aWxsIGJlOgotCSAqICAgICBJTlYKLQkgKiAKLQkgKiAgIEFycmF5cyBvZiBpbnZhbGlkIHR5cGVzIChub3QgT2JqZWN0LCBTdHJpbmcsIE51bWJlciwgQm9vbGVhbiwgQ2hhcmFjdGVyLAotCSAqICAgICBvciBwcmltaXRpdmVzKSB3aWxsIGJlIG1hcmtlZCBhcyBJTlYuCi0JICogPC9wcmU+Ci0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBzZXJpYWxpemVkIGZvcm0gYXMgYSBzdHJpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVN0cmluZyhPYmplY3QgdmFsdWUpIHsKLQkJU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJbWFrZVN0cmluZyh2YWx1ZSwgb3V0KTsKLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFFVT1RFID0gUGF0dGVybi5jb21waWxlKCJcIiIpOwkvLyBQYXR0ZXJuIGZvciBzZWFyY2hpbmcgZm9yIGRvdWJsZS1xdW90ZS4gTWFrZSBpdCBzdGF0aWMgc28gZG9uJ3Qgd2FzdGUgdGltZSBjb21waWxpbmcgZWFjaCB0aW1lLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTEwgPSAibnVsbCI7CS8vIE91dHB1dCBzdHJpbmcgZm9yIG51bGwgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEID0gIklOViI7CS8vIEludmFsaWQgb2JqZWN0IGZsYWcuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIFVzZWQgZm9yIHJlY3Vyc2l2ZSBidWlsZGluZyBvZiB0aGUgc3RyaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbWFrZVN0cmluZyhPYmplY3QgdmFsdWUsIFN0cmluZ0J1ZmZlciBvdXQpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlvdXQuYXBwZW5kKE5VTEwpOwotCQllbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIENsYXNzKSB7Ci0JCQkvLyBTdHJpbmc6ICJzdHJpbmciIG9yICJzdHJpbmdcInN0cmluZ2VuZCIgaWYgc3RyIGluY2x1ZGVkIGEgZG91YmxlLXF1b3RlLgotCQkJb3V0LmFwcGVuZCgnIicpOwotCQkJLy8gSWYgY2xhc3MsIHR1cm4gdmFsdWUgaW50byB0aGUgY2xhc3NuYW1lLgotCQkJU3RyaW5nIHN0ciA9IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nID8gKFN0cmluZykgdmFsdWUgOiAoKENsYXNzKSB2YWx1ZSkuZ2V0TmFtZSgpOwotCQkJaWYgKHN0ci5pbmRleE9mKCciJykgIT0gLTEpIHsKLQkJCQkvLyBSZXBsYWNlIGRvdWJsZS1xdW90ZSB3aXRoIGVzY2FwZSBkb3VibGUtcXVvdGUgc28gd2UgY2FuIGRpc3RpbnF1aXNoIGl0IGZyb20gdGhlIHRlcm1pbmF0aW5nIGRvdWJsZS1xdW90ZS4KLQkJCQlvdXQuYXBwZW5kKFFVT1RFLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCJcXFxcXCIiKSk7CS8vIERvbid0IGtub3cgd2h5IHdlIG5lZWQgdGhlIGJhY2stc2xhc2ggdG8gYmUgZG91YmxlZCBmb3IgcmVwbGFjZWFsbCwgYnV0IGl0IGRvZXNuJ3Qgd29yayBvdGhlcndpc2UuIC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZQotCQkJCW91dC5hcHBlbmQoc3RyKTsKLQkJCW91dC5hcHBlbmQoJ1wiJyk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCS8vIFdpbGwgZ28gb3V0IGFzIGVpdGhlciBhIGludGVnZXIgbnVtYmVyIG9yIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAKLQkJCS8vIFdoZW4gcmVhZCBiYWNrIGluIGl0IHdpbGwgYmUgZWl0aGVyIGEgTG9uZyBvciBhIERvdWJsZS4KLQkJCW91dC5hcHBlbmQodmFsdWUpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJLy8gSXQgd2lsbCBnbyBvdXQgYXMgZWl0aGVyIHRydWUgb3IgZmFsc2UuCi0JCQlvdXQuYXBwZW5kKHZhbHVlKTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJLy8gQ2hhcmFjdGVyOiAnYycgb3IgJ1wnJyBpZiBjaGFyIHdhcyBhIHF1b3RlLgotCQkJb3V0LmFwcGVuZCgnXCcnKTsKLQkJCUNoYXJhY3RlciBjID0gKENoYXJhY3RlcikgdmFsdWU7Ci0JCQlpZiAoYy5jaGFyVmFsdWUoKSAhPSAnXCcnKQotCQkJCW91dC5hcHBlbmQoYy5jaGFyVmFsdWUoKSk7Ci0JCQllbHNlCi0JCQkJb3V0LmFwcGVuZCgiXFwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC5hcHBlbmQoJ1wnJyk7Ci0JCX0gZWxzZSBpZiAodmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCS8vIEhhbmRsZSBhcnJheSBmb3JtYXQuCi0JCQlDbGFzcyB0eXBlID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLQkJCS8vIFNlZSBpZiBmaW5hbCB0eXBlIGlzIGEgdmFsaWQgdHlwZS4KLQkJCUNsYXNzIGZ0ID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQlpbnQgZGltcyA9IDE7Ci0JCQl3aGlsZSAoZnQuaXNBcnJheSgpKSB7Ci0JCQkJZGltcysrOwotCQkJCWZ0ID0gZnQuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJfQotCQkJaWYgKGZ0ID09IE9iamVjdC5jbGFzcyB8fCBmdCA9PSBTdHJpbmcuY2xhc3MgfHwgZnQgPT0gQm9vbGVhbi5jbGFzcyB8fCBmdCA9PSBDaGFyYWN0ZXIuY2xhc3MgfHwgZnQuaXNQcmltaXRpdmUoKSB8fCBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmdCkpIHsKLQkJCQkvLyBbbGVuZ3RoXVtdW10gey4uLi59Ci0JCQkJb3V0LmFwcGVuZCgnWycpOwotCQkJCWludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgodmFsdWUpOyAKLQkJCQlvdXQuYXBwZW5kKGxlbmd0aCk7Ci0JCQkJb3V0LmFwcGVuZCgnXScpOwotCQkJCXdoaWxlKC0tZGltcyA+IDApIHsKLQkJCQkJb3V0LmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlvdXQuYXBwZW5kKCd7Jyk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCW91dC5hcHBlbmQoJywnKTsKLQkJCQkJbWFrZVN0cmluZyhBcnJheS5nZXQodmFsdWUsIGkpLCBvdXQpOwotCQkJCX0KLQkJCQlvdXQuYXBwZW5kKCd9Jyk7Ci0JCQl9IGVsc2UKLQkJCQlvdXQuYXBwZW5kKElOVkFMSUQpOwkvLyBBbnkgb3RoZXIga2luZCBvZiBhcnJheSBpcyBpbnZhbGlkLgotCQl9IGVsc2UgewotCQkJb3V0LmFwcGVuZChJTlZBTElEKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIHRha2UgdGhlIHN0cmluZyBpbnB1dCBmcm9tIEVNRiBzZXJpYWxpemF0aW9uIGFuZCB0dXJuIGl0Ci0JICogaW50byBhbiBPYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkuIEl0IGNhbiBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCAKLQkgKiBwdXJwb3NlcyBieSBjbGllbnRzLCBidXQgdGhleSB3b3VsZCBub3QgaGF2ZSBhbnkgcmVhbAotCSAqIHJ1bnRpbWUgbmVlZCBmb3IgdGhpcy4KLQkgKiA8cD4KLQkgKiBUaGUgb2JqZWN0IHdpbGwgYmUgYW4gb2JqZWN0LCBudWxsLCBvciBhbiBPYmplY3QgYXJyYXkuIEFueSB2YWx1ZQotCSAqIHRoYXQgaXMgaW52YWxpZCB3aWxsIGJlIHNldCB0byB0aGUge0BsaW5rIEludmFsaWRPYmplY3QjSU5TVEFOQ0V9IHN0YXRpYwotCSAqIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4gb2JqZWN0IGRlY29kZWQgZnJvbSB0aGUgaW5wdXQuCi0JICogCi0JICogQHNlZSAjbWFrZVN0cmluZyhPYmplY3QpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgcGFyc2VTdHJpbmcoU3RyaW5nIGlucHV0KSB7Ci0JCXJldHVybiBwYXJzZVN0cmluZyhuZXcgU3RyaW5nUGFyc2VyKGlucHV0KSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ1BhcnNlciB7Ci0JCXByaXZhdGUgaW50IG5leHQ9MDsKLQkJcHJpdmF0ZSBpbnQgbGVuZ3RoOwotCQlwcml2YXRlIFN0cmluZyBpbnB1dDsKLQkJCi0JCXB1YmxpYyBTdHJpbmdQYXJzZXIoU3RyaW5nIGlucHV0KSB7Ci0JCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCQl0aGlzLmxlbmd0aCA9IGlucHV0Lmxlbmd0aCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTdHJpbmdQYXJzZXI6IFwiIitpbnB1dCsnIic7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNraXBXaGl0ZXNwYWNlKCkgewotCQkJd2hpbGUobmV4dCA8IGxlbmd0aCkgewotCQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShpbnB1dC5jaGFyQXQobmV4dCsrKSkpIHsKLQkJCQkJbmV4dC0tOwkvLyBQdXQgaXQgYmFjayBhcyBub3QgeWV0IHJlYWQgc2luY2UgaXQgaXMgbm90IHdoaXRlc3BhY2UuCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmV4dCBpbmRleAotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQKLQkJICogQHJldHVybiBpbnB1dCBsZW5ndGgKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gbGVuZ3RoOwotCQl9Ci0JCQotCQkKLQkJLyoqCi0JCSAqIFJlYWQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGFuZCBnbyB0byBuZXh0LgotCQkgKiBAcmV0dXJuIGN1cnJlbnQgY2hhcmFjdGVyCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBjaGFyIHJlYWQoKSB7Ci0JCQlyZXR1cm4gbmV4dDxsZW5ndGggPyBpbnB1dC5jaGFyQXQobmV4dCsrKSA6IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBCYWNrdXAgdGhlIHBhcnNlciBvbmUgY2hhcmFjdGVyLgotCQkgKiAKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgYmFja3VwKCkgewotCQkJaWYgKC0tbmV4dCA8IDApCi0JCQkJbmV4dCA9IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBQZWVrIGF0IHRoZSBjaGFyIGF0IHRoZSBuZXh0IGluZGV4LCBidXQgZG9uJ3QgaW5jcmVtZW50IGFmdGVyd2FyZHMuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGNoYXIgcGVlaygpIHsKLQkJCXJldHVybiBuZXh0PGxlbmd0aCA/IGlucHV0LmNoYXJBdChuZXh0KSA6IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBIYXZlIHdlIHJlYWQgdGhlIGxhc3QgY2hhci4KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWFkIGxhc3QgY2hhci4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYXRFbmQoKSB7Ci0JCQlyZXR1cm4gbmV4dD49bGVuZ3RoOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmVzZXQgdG8gdGhlIGdpdmVuIG5leHQgaW5kZXguCi0JCSAqIEBwYXJhbSBuZXh0SW5kZXggdGhlIG5leHQgaW5kZXggdG8gZG8gYSByZWFkIGF0LgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNldChpbnQgbmV4dEluZGV4KSB7Ci0JCQlpZiAobmV4dEluZGV4PD1sZW5ndGgpCi0JCQkJbmV4dCA9IG5leHRJbmRleDsKLQkJCWVsc2UKLQkJCQluZXh0ID0gbGVuZ3RoOwotCQl9Ci0JCQotCQkvKioKLQkJICogU2tpcCB0aGUgbmV4dCBudW1iZXIgb2YgY2hhcnMuCi0JCSAqIEBwYXJhbSBza2lwIG51bWJlciBvZiBjaGFycyB0byBza2lwLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBza2lwKGludCBza2lwKSB7Ci0JCQlpZiAoKG5leHQrPXNraXApID4gbGVuZ3RoKQotCQkJCW5leHQgPSBsZW5ndGg7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHN0cmluZyBpbnB1dC4KLQkJICogQHJldHVybiB0aGUgc3RyaW5nIGlucHV0Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXQoKSB7Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX0KLQkJCQkKLQl9Ci0JCi0JLyoKLQkgKiBTdGFydGluZyBhIHBhcnNlIGZvciBhbiBvYmplY3QgYXQgdGhlIGdpdmVuIGluZGV4LgotCSAqIFJldHVybiB0aGUgcGFyc2VkIG9iamVjdCBvciBJbnZhbGlkT2JqZWN0IGlmIG5vCi0JICogb2JqZWN0IG9yIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE9iamVjdCBwYXJzZVN0cmluZyhTdHJpbmdQYXJzZXIgcGFyc2VyKSB7Ci0JCXBhcnNlci5za2lwV2hpdGVzcGFjZSgpOwotCQlpZiAoIXBhcnNlci5hdEVuZCgpKSB7Ci0JCQljaGFyIGMgPSBwYXJzZXIucmVhZCgpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJCS8vIFN0YXJ0IG9mIGEgcXVvdGVkIHN0cmluZy4gU2NhbiBmb3IgY2xvc2luZyBxdW90ZSwgaWdub3JpbmcgZXNjYXBlZCBxdW90ZXMuCi0JCQkJCWludCBzdGFydCA9IHBhcnNlci5uZXh0SW5kZXgoKTsJLy8gSW5kZXggb2YgZmlyc3QgY2hhciBhZnRlciAnIicKLQkJCQkJY2hhcltdIGRlcXVvdGVkID0gbnVsbDsJLy8gVXNlZCBpZiB0aGVyZSBpcyBhbiBlc2NhcGVkIHF1b3RlLiBUaGF0IGlzIHRoZSBvbmx5IHRoaW5nIHdlIHN1cHBvcnQgZXNjYXBlIG9uLCBxdW90ZXMuCi0JCQkJCWludCBkZXF1b3RlSW5kZXggPSAwOwotCQkJCQl3aGlsZSAoIXBhcnNlci5hdEVuZCgpKSB7Ci0JCQkJCQljaGFyIGNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCWlmIChjYyA9PSAnIicpIHsKLQkJCQkJCQkvLyBJZiB3ZSBkaWRuJ3QgZGVxdW90ZSwgdGhlbiBqdXN0IGRvIHN1YnN0cmluZy4KLQkJCQkJCQlpZiAoZGVxdW90ZWQgPT0gbnVsbCkKLQkJCQkJCQkJcmV0dXJuIHBhcnNlci5nZXRJbnB1dCgpLnN1YnN0cmluZyhzdGFydCwgcGFyc2VyLm5leHRJbmRleCgpLTEpOwkvLyBuZXh0IGlzIGNoYXIgYWZ0ZXIgJyInLCBzbyBlbmQgb2Ygc3RyaW5nIGluZGV4IGlzIGluZGV4IG9mICciJwotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBXZSBoYXZlIGEgZGVxdW90ZWQgc3RyaW5nLiBTbyB0dXJuIGludG8gYSBzdHJpbmcuCi0JCQkJCQkJCS8vIEdhdGhlciB0aGUgbGFzdCBncm91cAotCQkJCQkJCQlpbnQgZW5kTmR4ID0gcGFyc2VyLm5leHRJbmRleCgpLTE7Ci0JCQkJCQkJCXBhcnNlci5nZXRJbnB1dCgpLmdldENoYXJzKHN0YXJ0LCBlbmROZHgsIGRlcXVvdGVkLCBkZXF1b3RlSW5kZXgpOwotCQkJCQkJCQlkZXF1b3RlSW5kZXgrPSAoZW5kTmR4LXN0YXJ0KTsKLQkJCQkJCQkJcmV0dXJuIG5ldyBTdHJpbmcoZGVxdW90ZWQsIDAsIGRlcXVvdGVJbmRleCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChjYyA9PSAnXFwnKSB7Ci0JCQkJCQkJLy8gV2UgaGFkIGFuIGVzY2FwZSwgc2VlIGlmIG5leHQgaXMgYSBxdW90ZS4gSWYgaXQgaXMgd2UgbmVlZCB0byBzdHJpcCBvdXQgdGhlICdcJy4KLQkJCQkJCQlpZiAocGFyc2VyLnBlZWsoKSA9PSAnIicpIHsKLQkJCQkJCQkJaWYgKGRlcXVvdGVkID09IG51bGwpIHsKLQkJCQkJCQkJCWRlcXVvdGVkID0gbmV3IGNoYXJbcGFyc2VyLmdldExlbmd0aCgpXTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpbnQgZW5kTmR4ID0gcGFyc2VyLm5leHRJbmRleCgpLTE7Ci0JCQkJCQkJCXBhcnNlci5nZXRJbnB1dCgpLmdldENoYXJzKHN0YXJ0LCBlbmROZHgsIGRlcXVvdGVkLCBkZXF1b3RlSW5kZXgpOwkvLyBHZXQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nICdcJwotCQkJCQkJCQlkZXF1b3RlSW5kZXgrPSAoZW5kTmR4LXN0YXJ0KTsKLQkJCQkJCQkJLy8gTm93IGFsc28gYWRkIGluIHRoZSBlc2NhcGVkIHF1b3RlLgotCQkJCQkJCQlkZXF1b3RlZFtkZXF1b3RlSW5kZXgrK10gPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJCQlzdGFydCA9IHBhcnNlci5uZXh0SW5kZXgoKTsJLy8gTmV4dCBncm91cCBpcyBmcm9tIG5leHQgaW5kZXguCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwkvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAnLSc6Ci0JCQkJY2FzZSAnMCc6Ci0JCQkJY2FzZSAnMSc6Ci0JCQkJY2FzZSAnMic6Ci0JCQkJY2FzZSAnMyc6Ci0JCQkJY2FzZSAnNCc6Ci0JCQkJY2FzZSAnNSc6Ci0JCQkJY2FzZSAnNic6Ci0JCQkJY2FzZSAnNyc6Ci0JCQkJY2FzZSAnOCc6Ci0JCQkJY2FzZSAnOSc6Ci0JCQkJCS8vIFBvc3NpYmxlIG51bWJlci4KLQkJCQkJLy8gU2NhbiB0byBuZXh0IG5vbi1kaWdpdCwgb3Igbm90IHBhcnQgb2YgdmFsaWQgbnVtYmVyLgotCQkJCQlib29sZWFuIG51bWJlckNvbXBsZXRlID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gZmxvYXRUeXBlID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gZm91bmRFID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gZm91bmRFU2lnbiA9IGZhbHNlOwotCQkJCQlzdGFydCA9IHBhcnNlci5uZXh0SW5kZXgoKS0xOwkvLyBXZSB3YW50IHRvIGluY2x1ZGUgdGhlIHNpZ24gb3IgZmlyc3QgZGlnaXQgaW4gdGhlIG51bWJlci4KLQkJCQkJd2hpbGUgKCFwYXJzZXIuYXRFbmQoKSAmJiAhbnVtYmVyQ29tcGxldGUpIHsKLQkJCQkJCWNoYXIgY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJc3dpdGNoIChjYykgewotCQkJCQkJCWNhc2UgJzAnOgotCQkJCQkJCWNhc2UgJzEnOgotCQkJCQkJCWNhc2UgJzInOgotCQkJCQkJCWNhc2UgJzMnOgotCQkJCQkJCWNhc2UgJzQnOgotCQkJCQkJCWNhc2UgJzUnOgotCQkJCQkJCWNhc2UgJzYnOgotCQkJCQkJCWNhc2UgJzcnOgotCQkJCQkJCWNhc2UgJzgnOgotCQkJCQkJCWNhc2UgJzknOgotCQkJCQkJCQlicmVhazsJLy8gVGhpcyBpcyBnb29kLCBnbyBvbi4KLQkJCQkJCQljYXNlICcuJzoKLQkJCQkJCQkJaWYgKGZsb2F0VHlwZSkKLQkJCQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwkvLyBXZSBhbHJlYWR5IGZvdW5kIGEgJy4nLCB0d28gYXJlIGludmFsaWQuCi0JCQkJCQkJCWZsb2F0VHlwZSA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgJ2UnOgotCQkJCQkJCWNhc2UgJ0UnOgotCQkJCQkJCQlpZiAoZm91bmRFKQotCQkJCQkJCQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7CS8vIFdlIGFscmVhZHkgZm91bmQgYSAnZScsIHR3byBhcmUgaW52YWxpZC4KLQkJCQkJCQkJZm91bmRFID0gdHJ1ZTsKLQkJCQkJCQkJZmxvYXRUeXBlID0gdHJ1ZTsJLy8gQW4gJ2UnIG1ha2VzIGl0IGEgZmxvYXQsIGlmIG5vdCBhbHJlYWR5LgotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlICcrJzoKLQkJCQkJCQljYXNlICctJzoKLQkJCQkJCQkJaWYgKCFmb3VuZEUgfHwgZm91bmRFU2lnbikgCi0JCQkJCQkJCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsJLy8gQSArLy0gd2l0aCBubyAnZScgZmlyc3QgaXMgaW52YWxpZC4gT3IgbW9yZSB0aGFuIG9uZSBzaWduLgotCQkJCQkJCQlmb3VuZEVTaWduID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJLy8gQW55dGhpbmcgZWxzZSBpcyBlbmQgb2YgbnVtYmVyLgotCQkJCQkJCQlwYXJzZXIuYmFja3VwKCk7CS8vIEJhY2sgaXQgdXAgc28gdGhhdCBuZXh0IHBhcnNlIHdpbGwgc3RhcnQgd2l0aCB0aGlzIGNoYXIuCi0JCQkJCQkJCW51bWJlckNvbXBsZXRlID0gdHJ1ZTsJLy8gU28gd2Ugc3RvcCBzY2FubmluZwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJaWYgKCFmbG9hdFR5cGUpCi0JCQkJCQkJcmV0dXJuIExvbmcudmFsdWVPZihwYXJzZXIuZ2V0SW5wdXQoKS5zdWJzdHJpbmcoc3RhcnQsIHBhcnNlci5uZXh0SW5kZXgoKSkpOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBEb3VibGUudmFsdWVPZihwYXJzZXIuZ2V0SW5wdXQoKS5zdWJzdHJpbmcoc3RhcnQsIHBhcnNlci5uZXh0SW5kZXgoKSkpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAndCc6Ci0JCQkJY2FzZSAnVCc6Ci0JCQkJY2FzZSAnZic6Ci0JCQkJY2FzZSAnRic6Ci0JCQkJCS8vIFBvc3NpYmxlIGJvb2xlYW4uCi0JCQkJCWlmIChwYXJzZXIuZ2V0SW5wdXQoKS5yZWdpb25NYXRjaGVzKHRydWUsIHBhcnNlci5uZXh0SW5kZXgoKS0xLCAidHJ1ZSIsIDAsIDQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhcnNlci5za2lwKDMpOwkvLyBTa2lwIG92ZXIgcmVzdCBvZiBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJCQl9IGVsc2UgaWYgKHBhcnNlci5nZXRJbnB1dCgpLnJlZ2lvbk1hdGNoZXModHJ1ZSwgcGFyc2VyLm5leHRJbmRleCgpLTEsICJmYWxzZSIsIDAsIDUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhcnNlci5za2lwKDQpOwkvLyBTa2lwIG92ZXIgcmVzdCBvZiBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsJCQkJCQkKLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQkJCQotCQkJCWNhc2UgJ1wnJzoKLQkJCQkJLy8gUG9zc2libGUgY2hhcmFjdGVyCi0JCQkJCWNoYXIgY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkvLyBXZSByZWFsbHkgb25seSBzdXBwb3J0ICdcXCcgYW5kICdcJycgYW55dGhpbmcgZWxzZSB3aWxsIGJlIHRyZWF0ZWQgYXMgaWdub3JlICdcJyBiZWNhdXNlIHdlIGRvbid0IGtub3cgaGFuZGxlIGZ1bGwgZXNjYXBlcy4KLQkJCQkJaWYgKGNjID09ICdcXCcpCi0JCQkJCQljYyA9IHBhcnNlci5yZWFkKCk7CS8vIEdldCB3aGF0J3MgYWZ0ZXIgaXQuCi0JCQkJCWVsc2UgaWYgKGNjID09ICdcJycpCi0JCQkJCQlicmVhazsJLy8gJycgaXMgaW52YWxpZC4KLQkJCQkJaWYgKHBhcnNlci5wZWVrKCkgPT0gJ1wnJykgewotCQkJCQkJLy8gU28gbmV4dCBjaGFyIGFmdGVyICJjaGFyYWN0ZXIiIGlzIGlzIGEgcXVvdGUuIFRoaXMgaXMgZ29vZC4KLQkJCQkJCXBhcnNlci5yZWFkKCk7CS8vIE5vdyBjb25zdW1lIHRoZSBxdW90ZQotCQkJCQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoY2MpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAnbic6Ci0JCQkJCS8vIFBvc3NpYmxlIG51bGwuCi0JCQkJCWlmIChwYXJzZXIuZ2V0SW5wdXQoKS5yZWdpb25NYXRjaGVzKHBhcnNlci5uZXh0SW5kZXgoKS0xLCAibnVsbCIsIDAsIDQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhcnNlci5za2lwKDMpOwkvLyBTa2lwIG92ZXIgcmVzdCBvZiBzdHJpbmcuCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQkJCQotCQkJCWNhc2UgJ0knOgotCQkJCQkvLyBQb3NzaWJsZSBpbnZhbGlkIHZhbHVlLgotCQkJCQlpZiAocGFyc2VyLmdldElucHV0KCkucmVnaW9uTWF0Y2hlcyhwYXJzZXIubmV4dEluZGV4KCktMSwgSU5WQUxJRCwgMCwgSU5WQUxJRC5sZW5ndGgoKSkpIHsKLQkJCQkJCXBhcnNlci5za2lwKElOVkFMSUQubGVuZ3RoKCktMSk7CS8vIFNraXAgb3ZlciByZXN0IG9mIHN0cmluZy4KLQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgaW52YWxpZC4KLQkJCQkJCi0JCQkJY2FzZSAnWyc6Ci0JCQkJCS8vIFBvc3NpYmxlIGFycmF5LgotCQkJCQkvLyBUaGUgbmV4dCBmaWVsZCBzaG91bGQgYmUgYSBudW1iZXIsIHNvIHdlJ2xsIHVzZSBwYXJzZVN0cmluZyB0byBnZXQgdGhlIG51bWJlci4gCi0JCQkJCU9iamVjdCBzaXplID0gcGFyc2VTdHJpbmcocGFyc2VyKTsKLQkJCQkJaWYgKHNpemUgaW5zdGFuY2VvZiBMb25nKSB7Ci0JCQkJCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJCQkJCWNjID0gcGFyc2VyLnJlYWQoKTsJLy8gU2UgaWYgbmV4dCBpcyAnXScKLQkJCQkJCWlmIChjYyA9PSAnXScpIHsKLQkJCQkJCQkvLyBHb29kLCB3ZWxsLWZvcm1lZCBmaXJzdCBkaW1lbnNpb24KLQkJCQkJCQlpbnQgZGltID0gMTsKLQkJCQkJCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQkJCQkJCQkvLyBTZWUgaWYgdGhlcmUgYXJlIG1vcmUgb2YganVzdCAiW10iLiB0aGUgbnVtYmVyIG9mIHRoZW0gaXMgdGhlIGRpbS4KLQkJCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJCQkJCQkJY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJCQlpZiAoY2MgPT0gJ1snKSB7Ci0JCQkJCQkJCQlwYXJzZXIuc2tpcFdoaXRlc3BhY2UoKTsKLQkJCQkJCQkJCWNjID0gcGFyc2VyLnJlYWQoKTsKLQkJCQkJCQkJCWlmIChjYyA9PSAnXScpCi0JCQkJCQkJCQkJZGltKys7Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkvLyBUaGlzIGlzIGludmFsaWQuCi0JCQkJCQkJCQkJdmFsaWQgPSBmYWxzZTsKLQkJCQkJCQkJCQlwYXJzZXIuYmFja3VwKCk7Ci0JCQkJCQkJCQkJYnJlYWs7CS8vIE5vIG1vcmUgZGltcy4KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXBhcnNlci5iYWNrdXAoKTsKLQkJCQkJCQkJCWJyZWFrOwkvLyBObyBtb3JlIGRpbXMuCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHZhbGlkKSB7Ci0JCQkJCQkJCXBhcnNlci5za2lwV2hpdGVzcGFjZSgpOwotCQkJCQkJCQljYyA9IHBhcnNlci5yZWFkKCk7Ci0JCQkJCQkJCWlmIChjYyA9PSAneycpIHsKLQkJCQkJCQkJCS8vIEdvb2QsIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gY29kZS4KLQkJCQkJCQkJCWludFtdIGRpbXMgPSBuZXcgaW50W2RpbV07Ci0JCQkJCQkJCQlpbnQgbGVuID0gKChMb25nKSBzaXplKS5pbnRWYWx1ZSgpOwotCQkJCQkJCQkJZGltc1swXSA9IGxlbjsKLQkJCQkJCQkJCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKE9iamVjdC5jbGFzcywgZGltcyk7Ci0JCQkJCQkJCQlBcnJheXMuZmlsbCgoT2JqZWN0W10pIGFycmF5LCBudWxsKTsJLy8gQmVjYXVzZSBuZXdJbnN0YW5jZSB1c2VkIGFib3ZlIGZpbGxzIHRoZSBhcnJheSBjcmVhdGVkIHdpdGggZW1wdHkgYXJyYXlzIHdoZW4gYSBkaW0+MS4KLQkJCQkJCQkJCQotCQkJCQkJCQkJLy8gTm93IHdlIHN0YXJ0IGZpbGxpbmcgaXQgaW4uCi0JCQkJCQkJCQlPYmplY3QgaW52U2V0dGluZyA9IG51bGw7CS8vIFdoYXQgd2Ugd2lsbCB1c2UgZm9yIHRoZSBpbnZhbGlkIHNldHRpbmcuIElmIHRoaXMgaXMgYSBtdWx0aWRpbSwgdGhpcyBuZWVkcyB0byBiZSBhbiBhcnJheS4gV2lsbCBub3QgY3JlYXRlIGl0IHVudGlsIG5lZWRlZC4KLQkJCQkJCQkJCU9iamVjdCBlbnRyeSA9IHBhcnNlU3RyaW5nKHBhcnNlcik7CS8vIEdldCB0aGUgZmlyc3QgZW50cnkKLQkJCQkJCQkJCUNsYXNzIGNvbXBUeXBlID0gYXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJCQkJCQlpbnQgaSA9IC0xOwotCQkJCQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCQkJCQlpZiAoKytpIDwgbGVuKSB7Ci0JCQkJCQkJCQkJCWlmIChjb21wVHlwZS5pc0luc3RhbmNlKGVudHJ5KSkgewotCQkJCQkJCQkJCQkJLy8gR29vZCwgaXQgY2FuIGJlIGFzc2lnbmVkLgotCQkJCQkJCQkJCQkJQXJyYXkuc2V0KGFycmF5LCBpLCBlbnRyeSk7Ci0JCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCQkvLyBCYWQuIE5lZWQgdG8gc2V0IGludmFsaWQuCi0JCQkJCQkJCQkJCQlpZiAoaW52U2V0dGluZyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCQkJLy8gV2UgaGF2ZW4ndCBjcmVhdGVkIGl0IHlldC4KLQkJCQkJCQkJCQkJCQlpZiAoZGltID09IDEpCi0JCQkJCQkJCQkJCQkJCWludlNldHRpbmcgPSBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOyAvLyBHcmVhdCwgb25lIGRpbWVuc2lvbmFsLCB3ZSBjYW4gdXNlIGludmFsaWQgZGlyZWN0bHkKLQkJCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCQkJLy8gTXVsdGktZGltLiBOZWVkIHRvIGNyZWF0ZSBhIHZhbGlkIGFycmF5IHRoYXQgd2UgY2FuIHNldC4KLQkJCQkJCQkJCQkJCQkJaW50W10gaW52RGltcyA9IG5ldyBpbnRbZGltIC0gMV07Ci0JCQkJCQkJCQkJCQkJCUFycmF5cy5maWxsKGludkRpbXMsIDEpOyAvLyBMZW5ndGggb25lIGFsbCBvZiB0aGUgd2F5IHNvIHRoYXQgdGhlIGZpbmFsIGNvbXBvbmVudCBjYW4gYmUgaW52YWxpZCBvYmplY3QKLQkJCQkJCQkJCQkJCQkJaW52U2V0dGluZyA9IEFycmF5Lm5ld0luc3RhbmNlKE9iamVjdC5jbGFzcywgaW52RGltcyk7Ci0JCQkJCQkJCQkJCQkJCU9iamVjdCBmaW5hbEVudHJ5ID0gaW52U2V0dGluZzsgLy8gRmluYWwgYXJyYXkgKHdpdGggY29tcG9uZW50IHR5cGUgb2YganVzdCBPYmplY3QpLiBTdGFydCB3aXRoIHRoZSBmdWxsIGFycmF5IGFuZCB3b3JrIGRvd24uCi0JCQkJCQkJCQkJCQkJCWZvciAoaW50IGogPSBpbnZEaW1zLmxlbmd0aCAtIDE7IGogPiAwOyBqLS0pIHsKLQkJCQkJCQkJCQkJCQkJCWZpbmFsRW50cnkgPSBBcnJheS5nZXQoZmluYWxFbnRyeSwgMCk7Ci0JCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJQXJyYXkuc2V0KGZpbmFsRW50cnksIDAsIEludmFsaWRPYmplY3QuSU5TVEFOQ0UpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCUFycmF5LnNldChhcnJheSwgaSwgaW52U2V0dGluZyk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCi0JCQkJCQkJCQkJcGFyc2VyLnNraXBXaGl0ZXNwYWNlKCk7Ci0JCQkJCQkJCQkJY2MgPSBwYXJzZXIucmVhZCgpOwotCQkJCQkJCQkJCWlmIChjYyA9PSAnLCcpIHsKLQkJCQkJCQkJCQkJLy8gR29vZCwgZ2V0IG5leHQKLQkJCQkJCQkJCQkJZW50cnkgPSBwYXJzZVN0cmluZyhwYXJzZXIpOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoY2MgPT0gJ30nKSB7Ci0JCQkJCQkJCQkJCS8vIEdvb2QsIHJlYWNoZWQgdGhlIGVuZC4KLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJaWYgKCFwYXJzZXIuYXRFbmQoKSkgewotCQkJCQkJCQkJCQkJcGFyc2VyLmJhY2t1cCgpOwotCQkJCQkJCQkJCQkJZW50cnkgPSBwYXJzZVN0cmluZyhwYXJzZXIpOyAvLyBUZWNobmljYWxseSB0aGlzIHNob3VsZCBiZSBpbnZhbGlkLCBidXQgd2UnbGwgbGV0IGEgd2hpdGVzcGFjZSBhbHNvIGRlbm90ZSBuZXh0IGVudHJ5LgotCQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQkJLy8gSXQncyByZWFsbHkgc2NyZXdlZCB1cC4gVGhlIHN0cmluZyBqdXN0IGVuZGVkLiBMb2cgaXQuCi0JCQkJCQkJCQkJCQlFeGNlcHRpb24gZSA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ocGFyc2VyLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCQkvLyBTZWUgaWYgQmVhbmluZm8gcGx1Z2luIGlzIGF2YWlsYWJsZSAod2UgYXJlIHJ1bm5pbmcgdW5kZXIgZWNsaXBzZSkuIElmIHNvLCB1c2UgaXQsIGVsc2UganVzdCBwcmludCB0byBlcnJvci4KLQkJCQkJCQkJCQkJCQkvLyBXZSBtYXkgYmUgaW4gdGhlIHJlbW90ZSB2bSBhbmQgc28gaXQgd29uJ3QgYmUgYXZhaWxhYmxlLgotCQkJCQkJCQkJCQkJCUNsYXNzIGJpUGx1Z2luQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb1BsdWdpbiIpOwotCQkJCQkJCQkJCQkJCU1ldGhvZCBnZXRQbHVnaW4gPSBiaVBsdWdpbkNsYXNzLmdldE1ldGhvZCgiZ2V0UGx1Z2luIiwgbnVsbCk7Ci0JCQkJCQkJCQkJCQkJTWV0aG9kIGdldExvZ2dlciA9IGJpUGx1Z2luQ2xhc3MuZ2V0TWV0aG9kKCJnZXRMb2dnZXIiLCBudWxsKTsKLQkJCQkJCQkJCQkJCQlNZXRob2QgbG9nID0gZ2V0TG9nZ2VyLmdldFJldHVyblR5cGUoKS5nZXRNZXRob2QoImxvZyIsIG5ldyBDbGFzc1tdIHtUaHJvd2FibGUuY2xhc3MsIExldmVsLmNsYXNzfSk7Ci0JCQkJCQkJCQkJCQkJT2JqZWN0IGJpUGx1Z2luID0gZ2V0UGx1Z2luLmludm9rZShudWxsLCBudWxsKTsKLQkJCQkJCQkJCQkJCQlPYmplY3QgbG9nZ2VyID0gZ2V0TG9nZ2VyLmludm9rZShiaVBsdWdpbiwgbnVsbCk7Ci0JCQkJCQkJCQkJCQkJbG9nLmludm9rZShsb2dnZXIsIG5ldyBPYmplY3RbXSB7ZSwgTGV2ZWwuV0FSTklOR30pOwotCQkJCQkJCQkJCQkJCXJldHVybiBJbnZhbGlkT2JqZWN0LklOU1RBTkNFOwotCQkJCQkJCQkJCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsJLy8gTm90IGluIGVjbGlwc2UsIHNvIGp1c3QgcHJpbnQgc3RhY2sgdHJhY2UuCi0JCQkJCQkJCQkJCQlyZXR1cm4gSW52YWxpZE9iamVjdC5JTlNUQU5DRTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQkJcmV0dXJuIGFycmF5OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsgLy8gSWYgd2UgZ290IGhlcmUsIGl0IGlzIGludmFsaWQuCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIEludmFsaWRPYmplY3QuSU5TVEFOQ0U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBXcml0ZSBvdXQgYW55IGhpZGRlbiBzdHVmZgotCQlvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCXdyaXRlT2JqZWN0KHZhbHVlLCBvdXQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0IHZhbHVlLCBPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCW91dC53cml0ZU9iamVjdCh2YWx1ZSk7Ci0JCWVsc2UgewotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpCi0JCQkJb3V0LndyaXRlT2JqZWN0KCgoQ2xhc3MpIHZhbHVlKS5nZXROYW1lKCkpOwotCQkJZWxzZSBpZiAoIXZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8IHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiB8fCB2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCQkJb3V0LndyaXRlT2JqZWN0KHZhbHVlKTsKLQkJCQllbHNlCi0JCQkJCW91dC53cml0ZU9iamVjdChJbnZhbGlkT2JqZWN0LklOU1RBTkNFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQXJyYXkgaXMgdHJpY2t5LiBTZWUgaWYgaXQgaXMgb25lIHdlIGNhbiBoYW5kbGUsIGlmIG5vdCB0aGVuIGludmFsaWQuIAotCQkJCS8vIFRvIGluZGljYXRlIGFycmF5LCB3ZSB3aWxsIGZpcnN0IHdyaXRlIG91dCB0aGUgQ2xhc3Mgb2YgdGhlIENvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheSAoaXQgd2lsbAotCQkJCS8vIGJlIGNvbnZlcnRlZCB0byBiZSBPYmplY3Qgb3IgT2JqZWN0W10uLi4pLgotCQkJCS8vIFRoaXMgd2lsbCBiZSB0aGUgY2x1ZSB0aGF0IGFuIGFycmF5IGlzIGNvbWluZy4gQ2xhc3MgdmFsdWVzIHdpbGwgbmV2ZXIKLQkJCQkvLyBiZSByZXR1cm5lZCwgc28gdGhhdCBpcyBob3cgd2UgY2FuIHRlbGwgaXQgaXMgYW4gYXJyYXkuCi0JCQkJLy8gTm90ZTogVGhlIHJlYXNvbiB3ZSBhcmUgdXNpbmcgdGhlIGNvbXBvbmVudCB0eXBlIChjb252ZXJ0ZWQgdG8gT2JqZWN0KSBpcyBiZWNhdXNlIHRvIHJlY29uc3RydWN0IG9uIHRoZSBvdGhlciBzaWRlIHdlIG5lZWQKLQkJCQkvLyB0byB1c2UgdGhlIGNvbXBvbmVudCB0eXBlIHBsdXMgbGVuZ3RoIG9mIHRoZSBhcnJheSdzIGZpcnN0IGRpbWVuc2lvbi4KLQkJCQkvLyAKLQkJCQkvLyBXZSBjYW4gbm90IGp1c3Qgc2VyaWFsaXplIHRoZSBhcnJheSBpbiB0aGUgbm9ybWFsIHdheSBiZWNhdXNlIGl0IG1heSBjb250YWluIGludmFsaWQgdmFsdWVzLCBhbmQgd2UgbmVlZCB0byAKLQkJCQkvLyBoYW5kbGUgdGhhdC4gQWxzbywgaWYgaXQgd2Fzbid0IGFuIE9iamVjdCBhcnJheSwgd2UgbmVlZCB0byB0dXJuIGl0IGludG8gYW4gb2JqZWN0IGFycmF5LiBXZSBuZWVkIGNvbnNpc3RlbmN5Ci0JCQkJLy8gaW4gdGhhdCBpdCBzaG91bGQgYWx3YXlzIGJlIGFuIE9iamVjdCBhcnJheS4KLQkJCQkvLyBTbyBvdXRwdXQgZm9ybWF0IHdpbGwgYmU6Ci0JCQkJLy8gQ2xhc3MoY29tcG9uZW50IHR5cGUpCi0JCQkJLy8gaW50KHNpemUgb2YgZmlyc3QgZGltZW5zaW9uKQotCQkJCS8vIE9iamVjdCh2YWx1ZSBvZiBmaXJzdCBlbnRyeSkgLSBBY3R1YWxseSB1c2Ugb3V0IHdyaXRlT2JqZWN0KCkgZm9ybWF0IHRvIGFsbG93IG5lc3Rpbmcgb2YgYXJyYXlzLgotCQkJCS8vIE9iamVjdCh2YWx1ZSBvZiBzZWNvbmQgZW50cnkpCi0JCQkJLy8gLi4uIHVwIHRvIHNpemUgb2YgZGltZW5zaW9uLgotCQkJCUNsYXNzIHR5cGUgPSB2YWx1ZS5nZXRDbGFzcygpOwotCQkJCS8vIFNlZSBpZiBmaW5hbCB0eXBlIGlzIGEgdmFsaWQgdHlwZS4KLQkJCQlDbGFzcyBmdCA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCWludCBkaW1zID0gMTsKLQkJCQl3aGlsZSAoZnQuaXNBcnJheSgpKSB7Ci0JCQkJCWRpbXMrKzsKLQkJCQkJZnQgPSBmdC5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJfQotCQkJCWlmIChmdCA9PSBPYmplY3QuY2xhc3MgfHwgZnQgPT0gU3RyaW5nLmNsYXNzIHx8IGZ0ID09IEJvb2xlYW4uY2xhc3MgfHwgZnQgPT0gQ2hhcmFjdGVyLmNsYXNzIHx8IGZ0LmlzUHJpbWl0aXZlKCkgfHwgZnQgPT0gQ2xhc3MuY2xhc3MgfHwgTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZnQpKSB7Ci0JCQkJCVN0cmluZyBqbmlUeXBlID0gZGltcyA9PSAxID8gImphdmEubGFuZy5PYmplY3QiIDogTWFwVHlwZXMuZ2V0Sk5JVHlwZU5hbWUoImphdmEubGFuZy5PYmplY3QiLCBkaW1zLTEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNvbXBvbmVudFR5cGUgPSBDbGFzcy5mb3JOYW1lKGpuaVR5cGUpOwotCQkJCQkJb3V0LndyaXRlT2JqZWN0KGNvbXBvbmVudFR5cGUpOwotCQkJCQkJaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aCh2YWx1ZSk7Ci0JCQkJCQlvdXQud3JpdGVJbnQobGVuZ3RoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCQl3cml0ZU9iamVjdChBcnJheS5nZXQodmFsdWUsIGkpLCBvdXQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gT2JqZWN0IGFycmF5cyBhcmUgYWx3YXlzIGF2YWlsYWJsZS4KLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlvdXQud3JpdGVPYmplY3QoSW52YWxpZE9iamVjdC5JTlNUQU5DRSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIFJlYWQgaW4gYW55IGhpZGRlbiBzdHVmZgotCQlpbi5kZWZhdWx0UmVhZE9iamVjdCgpOwotCQkKLQkJdmFsdWUgPSByZWFkQWN0dWFsT2JqZWN0KGluKTsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgcmVhZEFjdHVhbE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJT2JqZWN0IHZhbCA9IGluLnJlYWRPYmplY3QoKTsKLQkJaWYgKHZhbCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0JCQkvLyBJdCBtdXN0IGJlIGFuIGFycmF5LiBPbmx5IENsYXNzIG9iamVjdHMgdGhhdCBjb21lIGluIGFyZSBBcnJheXMgb2YgT2JqZWN0LgotCQkJaW50IGxlbmd0aCA9IGluLnJlYWRJbnQoKTsKLQkJCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKChDbGFzcykgdmFsLCBsZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUFycmF5LnNldChhcnJheSwgaSwgcmVhZEFjdHVhbE9iamVjdChpbikpOwotCQkJfQotCQkJcmV0dXJuIGFycmF5OwotCQl9IGVsc2UKLQkJCXJldHVybiB2YWw7CS8vIEl0IGlzIHRoZSB2YWx1ZSBpdHNlbGYuCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9GZWF0dXJlUmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3M2YyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ZlYXR1cmVSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBGZWF0dXJlUmVjb3JkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6NDQ6NTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIEZlYXR1cmVEZXNjcmlwdG9yIGluZm8gZnJvbQotICogdGhlIEJlYW5JbmZvIHZtIHRvIHRoZSBJREUgdm0uIEl0IGlzIHNlcmlhbGl6YWJsZSBzbyB0aGF0IGl0IGNhbgotICogYmUgc2VyaWFsaXplZCBmb3IgdHJhbnNtaXNzaW9uLgotICogPHA+Ci0gKiBJdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiB0aGUgRmVhdHVyZURlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUmVjb3JkIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5NzkyNzY2NDhMOwotCQotCXB1YmxpYyBTdHJpbmcgbmFtZTsJLy8gU29tZSBkZWNvcmF0b3JzIHVzZSB0aGlzIGFuZCBvdGhlcnMgZG9uJ3QuIEVhY2ggZGVjb3JhdG9yIHR5cGUgd2lsbCBkZWNpZGUgd2hldGhlciB0aGlzIGlzIG9mIGltcG9ydGFuY2UuCi0JcHVibGljIFN0cmluZyBkaXNwbGF5TmFtZTsKLQlwdWJsaWMgU3RyaW5nIHNob3J0RGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyBjYXRlZ29yeTsKLQlwdWJsaWMgYm9vbGVhbiBleHBlcnQ7Ci0JcHVibGljIGJvb2xlYW4gaGlkZGVuOwotCXB1YmxpYyBib29sZWFuIHByZWZlcnJlZDsKLQlwdWJsaWMgU3RyaW5nW10gYXR0cmlidXRlTmFtZXM7Ci0JcHVibGljIEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZVtdIGF0dHJpYnV0ZVZhbHVlczsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTg3M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMjo0NDo1MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhlc2UgYXJlIGNvbnN0YW50cyBuZWVkZWQgZm9yIHRyYW5zZmVycmluZyBCZWFuSW5mbyByZXN1bHRzIGZyb20gdGhlIEJlYW5JbmZvIFZNLgotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cyB7Ci0JCi0JLyoqCi0JICogSW50cm9zcGVjdGlvbiBiaXQgZmxhZyBpbmRpY2F0aW5nIGRvIHRoZSBCZWFuRGVjb3JhdG9yLiBTZW50IHRvIE1vZGVsaW5nQmVhbkluZm8uaW50cm9zcGVjdCBtZXRob2QuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9fQkVBTl9ERUNPUiA9IDB4MTsKLQkKLQkvKioKLQkgKiBJbnRyb3NwZWN0aW9uIGJpdCBmbGFnIGluZGljYXRpbmcgZG8gdGhlIFByb3BlcnRpZXMuIFNlbnQgdG8gTW9kZWxpbmdCZWFuSW5mby5pbnRyb3NwZWN0IG1ldGhvZC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19QUk9QRVJUSUVTID0gMHgyOwotCi0JLyoqCi0JICogSW50cm9zcGVjdGlvbiBiaXQgZmxhZyBpbmRpY2F0aW5nIGRvIHRoZSBNZXRob2RzLiBTZW50IHRvIE1vZGVsaW5nQmVhbkluZm8uaW50cm9zcGVjdCBtZXRob2QuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9fTUVUSE9EUyA9IDB4NDsKLQotCS8qKgotCSAqIEludHJvc3BlY3Rpb24gYml0IGZsYWcgaW5kaWNhdGluZyBkbyB0aGUgRXZlbnRzLiBTZW50IHRvIE1vZGVsaW5nQmVhbkluZm8uaW50cm9zcGVjdCBtZXRob2QuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9fRVZFTlRTID0gMHg4OwotCi0JLyoqCi0JICogQmVhbkRlY29yYXRvciB3YXMgc2VudCBjb21tYW5kIGlkLiAKLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgc2VudCB0byBjYWxsQmFjayhpbnQgaWQsIElucHV0U3RyZWFtIGlzKS4gVGhlIElucHV0U3RyZWFtIHdpbGwgYmUgT2JqZWN0cyAodXNlIE9iamVjdElucHV0U3RyZWFtKS4gCi0JICogVGhlIHN0cmVhbSB3aWxsIGJlIGJyb2tlbiBpbnRvIHNlY3Rpb25zLgotCSAqIEVhY2ggc2VjdGlvbiB3aWxsIGJlIGhlYWRlZCBieSB0aGUgY29tbWFuZCBpZCBvZiB0aGF0IHNlY3Rpb24gKGUuZy4gQkVBTl9ERUNPUkFUT1JfU0VOVCBvciBQUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQpLgotCSAqIEZvbGxvd2luZyB0aGUgY29tbWFuZCBpZCB3aWxsIGJlIHRoZSB0eXBlIG9mIGlucHV0IHNwZWNpZmljIGRhdGEuIAotCSAqIDxwPgotCSAqIFRoZSBkYXRhIGZvbGxvd2luZyB0aGUgY29tbWFuZCBpZCB3aWxsIGJlIGEgQmVhblJlY29yZCBmcm9tIHRoZSBPYmplY3RJbnB1dFN0cmVhbS4KLQkgKiAKLQkgKiBAc2VlIEJlYW5SZWNvcmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrU3RyZWFtKGludCwgSW5wdXRTdHJlYW0pCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVBTl9ERUNPUkFUT1JfU0VOVCA9IDE7Ci0KLQkvKioKLQkgKiBQcm9wZXJ0eURlY29yYXRvcnMgc2VuZCBjb21tYW5kIGlkLgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBiZSBzZW50IHRvIGNhbGxCYWNrKGludCBpZCwgSW5wdXRTdHJlYW0gaXMpLiBUaGUgSW5wdXRTdHJlYW0gd2lsbCBiZSBPYmplY3RzICh1c2UgT2JqZWN0SW5wdXRTdHJlYW0pLiAKLQkgKiBUaGUgc3RyZWFtIHdpbGwgYmUgYnJva2VuIGludG8gc2VjdGlvbnMuCi0JICogRWFjaCBzZWN0aW9uIHdpbGwgYmUgaGVhZGVkIGJ5IHRoZSBjb21tYW5kIGlkIG9mIHRoYXQgc2VjdGlvbiAoZS5nLiBCRUFOX0RFQ09SQVRPUl9TRU5UIG9yIFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCkuCi0JICogRm9sbG93aW5nIHRoZSBjb21tYW5kIGlkIHdpbGwgYmUgdGhlIHR5cGUgb2YgaW5wdXQgc3BlY2lmaWMgZGF0YS4gCi0JICogPHA+Ci0JICogVGhlIGZpcnN0IG9iamVjdCB3aWxsIGJlICBhbiBpbnQgYW5kIHdpbGwgYmUgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFuZCBlYWNoIG9iamVjdCBhZnRlciB0aGF0Ci0JICogd2lsbCBiZSBhIFByb3BlcnR5UmVjb3JkL0luZGV4ZWRQcm9wZXJ0eVJlY29yZC4gCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2sjY2FsbGVkQmFja1N0cmVhbShpbnQsIElucHV0U3RyZWFtKQotCSAqIEBzZWUgUHJvcGVydHlSZWNvcmQKLQkgKiBAc2VlIEluZGV4ZWRQcm9wZXJ0eVJlY29yZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RFQ09SQVRPUlNfU0VOVCA9IDI7Ci0KLQkvKioKLQkgKiBNZXRob2REZWNvcmF0b3JzIHNlbmQgY29tbWFuZCBpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgc2VudCB0byBjYWxsQmFjayhpbnQgaWQsIElucHV0U3RyZWFtIGlzKS4gVGhlIElucHV0U3RyZWFtIHdpbGwgYmUgT2JqZWN0cyAodXNlIE9iamVjdElucHV0U3RyZWFtKS4gCi0JICogVGhlIHN0cmVhbSB3aWxsIGJlIGJyb2tlbiBpbnRvIHNlY3Rpb25zLgotCSAqIEVhY2ggc2VjdGlvbiB3aWxsIGJlIGhlYWRlZCBieSB0aGUgY29tbWFuZCBpZCBvZiB0aGF0IHNlY3Rpb24gKGUuZy4gQkVBTl9ERUNPUkFUT1JfU0VOVCBvciBQUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQpLgotCSAqIEZvbGxvd2luZyB0aGUgY29tbWFuZCBpZCB3aWxsIGJlIHRoZSB0eXBlIG9mIGlucHV0IHNwZWNpZmljIGRhdGEuIAotCSAqIDxwPgotCSAqIFRoZSBJbnB1dFN0cmVhbSB3aWxsIGJlIE9iamVjdHMgKHVzZSBPYmplY3RJbnB1dFN0cmVhbSkuCi0JICogVGhlIGZpcnN0IG9iamVjdCB3aWxsIGJlICBhbiBpbnQgYW5kIHdpbGwgYmUgdGhlIG51bWJlciBvZiBtZXRob2RzIGFuZCBlYWNoIG9iamVjdCBhZnRlciB0aGF0Ci0JICogd2lsbCBiZSBhIE1ldGhvZFJlY29yZC4gCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2sjY2FsbGVkQmFja1N0cmVhbShpbnQsIElucHV0U3RyZWFtKQotCSAqIEBzZWUgTWV0aG9kUmVjb3JkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0RFQ09SQVRPUlNfU0VOVCA9IDM7Ci0JCi0JLyoqCi0JICogRXZlbnRTZXREZWNvcmF0b3JzIHNlbmQgY29tbWFuZCBpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIHdpbGwgYmUgc2VudCB0byBjYWxsQmFjayhpbnQgaWQsIElucHV0U3RyZWFtIGlzKS4gVGhlIElucHV0U3RyZWFtIHdpbGwgYmUgT2JqZWN0cyAodXNlIE9iamVjdElucHV0U3RyZWFtKS4gCi0JICogVGhlIHN0cmVhbSB3aWxsIGJlIGJyb2tlbiBpbnRvIHNlY3Rpb25zLgotCSAqIEVhY2ggc2VjdGlvbiB3aWxsIGJlIGhlYWRlZCBieSB0aGUgY29tbWFuZCBpZCBvZiB0aGF0IHNlY3Rpb24gKGUuZy4gQkVBTl9ERUNPUkFUT1JfU0VOVCBvciBQUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQpLgotCSAqIEZvbGxvd2luZyB0aGUgY29tbWFuZCBpZCB3aWxsIGJlIHRoZSB0eXBlIG9mIGlucHV0IHNwZWNpZmljIGRhdGEuIAotCSAqIDxwPgotCSAqIFRoZSBmaXJzdCBvYmplY3Qgd2lsbCBiZSAgYW4gaW50IGFuZCB3aWxsIGJlIHRoZSBudW1iZXIgb2YgZXZlbnRzIGFuZCBlYWNoIG9iamVjdCBhZnRlciB0aGF0Ci0JICogd2lsbCBiZSBhIEV2ZW50U2V0UmVjb3JkLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjayNjYWxsZWRCYWNrU3RyZWFtKGludCwgSW5wdXRTdHJlYW0pCi0JICogQHNlZSBNZXRob2RSZWNvcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ERUNPUkFUT1JTX1NFTlQgPSA0OwotCi0JLyoqCi0JICogRG9uZSBzZW5kIGNvbW1hbmQgaWQuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGJlIHNlbnQgdG8gY2FsbEJhY2soaW50IGlkLCBJbnB1dFN0cmVhbSBpcykuIFRoZSBJbnB1dFN0cmVhbSB3aWxsIGJlIE9iamVjdHMgKHVzZSBPYmplY3RJbnB1dFN0cmVhbSkuIAotCSAqIFRoZSBzdHJlYW0gd2lsbCBiZSBicm9rZW4gaW50byBzZWN0aW9ucy4KLQkgKiBFYWNoIHNlY3Rpb24gd2lsbCBiZSBoZWFkZWQgYnkgdGhlIGNvbW1hbmQgaWQgb2YgdGhhdCBzZWN0aW9uIChlLmcuIEJFQU5fREVDT1JBVE9SX1NFTlQgb3IgUFJPUEVSVFlfREVDT1JBVE9SU19TRU5UKS4KLQkgKiBGb2xsb3dpbmcgdGhlIGNvbW1hbmQgaWQgd2lsbCBiZSB0aGUgdHlwZSBvZiBpbnB1dCBzcGVjaWZpYyBkYXRhLiAKLQkgKiA8cD4KLQkgKiBUaGlzIGNvbW1hbmQgaWQgbWVhbnMgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGFuZCBpdCBzaG91bGQgcmV0dXJuLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2tTdHJlYW0oaW50LCBJbnB1dFN0cmVhbSkKLQkgKiBAc2VlIE1ldGhvZFJlY29yZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPTkUgPSA1OwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JbmRleGVkUHJvcGVydHlSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vSW5kZXhlZFByb3BlcnR5UmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTYzOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JbmRleGVkUHJvcGVydHlSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbmRleGVkUHJvcGVydHlSZWNvcmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMjo0NDo1MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhlZFByb3BlcnR5UmVjb3JkIGV4dGVuZHMgUHJvcGVydHlSZWNvcmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU5ODMyMjc5OTBMOwotCQotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIGluZGV4ZWRSZWFkTWV0aG9kOwotCXB1YmxpYyBSZWZsZWN0TWV0aG9kUmVjb3JkIGluZGV4ZWRXcml0ZU1ldGhvZDsKLQlwdWJsaWMgU3RyaW5nIGluZGV4ZWRQcm9wZXJ0eVR5cGVOYW1lOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9JbnZhbGlkT2JqZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ludmFsaWRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5YzdlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL0ludmFsaWRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbnZhbGlkT2JqZWN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6NDQ6NTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0gCi0KLS8qKgotICogQW4gaW5kaWNhdG9yIG9iamVjdCBmb3IgaW52YWxpZCBvYmplY3QgdHlwZS4gVGhpcyBpcyB1c2VkIHdpdGggZmVhdHVyZSBhdHRyaWJ1dGUKLSAqIHZhbHVlcyBmcm9tIHRoZSBCZWFuSW5mbyBjbGFzc2VzLiBXZSBjYW4gb25seSBoYW5kbGUgY2VydGFpbiB0eXBlcyB3aGVuIHdlCi0gKiBicmluZyB0aGVtIG92ZXIgZnJvbSB0aGUgQmVhbkluZm8gVk0uIFRoYXQgaXMgYmVjYXVzZSB0aGUgY2xhc3NlcyBpbnN0YW50aWF0ZWQKLSAqIGluIHRoZSBCZWFuSW5mbyBjbGFzcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgSURFLiAgU28gYW55IGludmFsaWQgdmFsdWUKLSAqIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhpcyBjbGFzcyBpbnN0YW5jZS4KLSAqIDxwPgotICogVGhpcyBpcyBhIHNpbmdsZXRvbiBjbGFzcy4KLSAqIFRoZXJlIHdpbGwgYmUgb25lIGluc3RhbmNlIChJbnZhbGlkT2JqZWN0LklOU1RBTkNFKSBpbiB0aGUgc3lzdGVtLiBUaGF0IHdheQotICogIj09IiBjYW4gYmUgdXNlZCB0byB0ZXN0IGZvciBpdC4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkT2JqZWN0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkKLQkvKioKLQkgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgSW52YWxpZE9iamVjdC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludmFsaWRPYmplY3QgSU5TVEFOQ0UgPSBuZXcgSW52YWxpZE9iamVjdCgpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMDU2NDM4MDQzNzBMOwotCQotCS8qCi0JICogTm9ib2R5IGVsc2Ugc2hvdWxkIGNyZWF0ZSBvbmUgb2YgdGhlc2UuCi0JICovCi0JcHJpdmF0ZSBJbnZhbGlkT2JqZWN0KCkgewotCX0KLQotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL01ldGhvZFJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9NZXRob2RSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1YTY5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL01ldGhvZFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IE1ldGhvZFJlY29yZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzAyLzE1IDIyOjQ0OjUyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3Igc2VuZGluZyB0aGUgTWV0aG9kRGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIE1ldGhvZERlc2NyaXB0b3IuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSZWNvcmQgZXh0ZW5kcyBGZWF0dXJlUmVjb3JkIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1OTgyMjEzMTEwTDsKLQkKLQkvKioKLQkgKiBNZXRob2Qgc2lnbmF0dXJlIGZvciB0aGUgbWV0aG9kIHRoaXMgcmVjb3JkIGRlc2NyaWJlcy4KLQkgKi8KLQlwdWJsaWMgUmVmbGVjdE1ldGhvZFJlY29yZCBtZXRob2RGb3JEZXNjcmlwdG9yOwotCS8qKgotCSAqIFBhcmFtZXRlciByZWNvcmRzIGFycmF5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlbid0IGFueS4KLQkgKi8KLQlwdWJsaWMgUGFyYW1ldGVyUmVjb3JkW10gcGFyYW1ldGVyczsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUGFyYW1ldGVyUmVjb3JkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1BhcmFtZXRlclJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFjNjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUGFyYW1ldGVyUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUGFyYW1ldGVyUmVjb3JkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjI6NDQ6NTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBQYXJhbWV0ZXJEZXNjcmlwdG9yIGluZm8gZnJvbQotICogdGhlIEJlYW5JbmZvIHZtIHRvIHRoZSBJREUgdm0uIEl0IGlzIHNlcmlhbGl6YWJsZSBzbyB0aGF0IGl0IGNhbgotICogYmUgc2VyaWFsaXplZCBmb3IgdHJhbnNtaXNzaW9uLgotICogPHA+Ci0gKiBJdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiB0aGUgUGFyYW1ldGVyRGVzY3JpcHRvci4KLSAqIDxwPgotICogVGhlIG9ubHkgZmllbGQgb2YgaW1wb3J0YW5jZSBpcyB0aGUgbmFtZSwgYW5kIHRoYXQgY29tZXMgZnJvbSBGZWF0dXJlUmVjb3JkLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyUmVjb3JkIGV4dGVuZHMgRmVhdHVyZVJlY29yZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1OTgyNDM4OTU1TDsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUHJvcGVydHlSZWNvcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUHJvcGVydHlSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NjRkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1Byb3BlcnR5UmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUHJvcGVydHlSZWNvcmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMjo0NDo1MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgdGhlIFByb3BlcnR5RGVzY3JpcHRvciBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFByb3BlcnR5RGVzY3JpcHRvci4gCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5UmVjb3JkIGV4dGVuZHMgRmVhdHVyZVJlY29yZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNTk3OTI3NjY0OEw7Ci0JCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUVkaXRvckNsYXNzTmFtZTsKLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5VHlwZU5hbWU7Ci0JcHVibGljIFJlZmxlY3RNZXRob2RSZWNvcmQgcmVhZE1ldGhvZDsKLQlwdWJsaWMgUmVmbGVjdE1ldGhvZFJlY29yZCB3cml0ZU1ldGhvZDsKLQlwdWJsaWMgUmVmbGVjdEZpZWxkUmVjb3JkIGZpZWxkOwotCXB1YmxpYyBib29sZWFuIGJvdW5kOwotCXB1YmxpYyBib29sZWFuIGNvbnN0cmFpbmVkOwotCXB1YmxpYyBCb29sZWFuIGRlc2lnblRpbWU7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RGaWVsZFJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0RmllbGRSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5NTcwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iZWFuaW5mb0NvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vY29tbW9uL1JlZmxlY3RGaWVsZFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFJlZmxlY3RGaWVsZFJlY29yZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzAyLzE1IDIyOjQ0OjUyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBpbmZvIGZyb20KLSAqIHRoZSBCZWFuSW5mbyB2bSB0byB0aGUgSURFIHZtLiBJdCBpcyBzZXJpYWxpemFibGUgc28gdGhhdCBpdCBjYW4KLSAqIGJlIHNlcmlhbGl6ZWQgZm9yIHRyYW5zbWlzc2lvbi4KLSAqIDxwPgotICogSXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmbGVjdEZpZWxkUmVjb3JkIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1OTgxNTEyNDUzTDsKLQkKLQlwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZTsKLQlwdWJsaWMgU3RyaW5nIGZpZWxkTmFtZTsKLQlwdWJsaWMgYm9vbGVhbiByZWFkT25seTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2JlYW5pbmZvQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby9jb21tb24vUmVmbGVjdE1ldGhvZFJlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0TWV0aG9kUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZmYyYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm9Db21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL2NvbW1vbi9SZWZsZWN0TWV0aG9kUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUmVmbGVjdE1ldGhvZFJlY29yZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzAyLzE1IDIyOjQ0OjUyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotIAotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciBzZW5kaW5nIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgaW5mbyBmcm9tCi0gKiB0aGUgQmVhbkluZm8gdm0gdG8gdGhlIElERSB2bS4gSXQgaXMgc2VyaWFsaXphYmxlIHNvIHRoYXQgaXQgY2FuCi0gKiBiZSBzZXJpYWxpemVkIGZvciB0cmFuc21pc3Npb24uCi0gKiA8cD4KLSAqIEl0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZsZWN0TWV0aG9kUmVjb3JkIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTA1OTgxNTEyNzczTDsKLQkKLQlwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZTsKLQlwdWJsaWMgU3RyaW5nIG1ldGhvZE5hbWU7Ci0JcHVibGljIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lczsJLy8gTWF5YmUgbnVsbCBpZiBubyBwYXJhbWV0ZXJzLgotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZGM1NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zcmMuZXhjbHVkZXMgPSAqKi8uY3ZzaWdub3JlCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGJlYW5pbmZvLmphcixcCi0gICAgICAgICAgICAgICB2bS9iZWFuaW5mb3ZtLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGJlYW5pbmZvY29tbW9uLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLWphcnMuY29tcGlsZS5vcmRlciA9IGJlYW5pbmZvY29tbW9uLmphcixcCi0gICAgICAgICAgICAgICAgICAgICB2bS9iZWFuaW5mb3ZtLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBiZWFuaW5mby5qYXIKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgbW9kZWwvLFwKLSAgICAgICAgICAgICAgIHJvc2UvLFwKLSAgICAgICAgICAgICAgIHByb3h5LmphcnMsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotc291cmNlLmJlYW5pbmZvLmphciA9IGJlYW5pbmZvLwotc291cmNlLnZtL2JlYW5pbmZvdm0uamFyID0gdm1fYmVhbmluZm92bS8KLXNvdXJjZS5iZWFuaW5mb2NvbW1vbi5qYXIgPSBiZWFuaW5mb0NvbW1vbi8KLW91dHB1dC52bS9iZWFuaW5mb3ZtLmphciA9IGJpbl92bV9iZWFuaW5mb3ZtLwotb3V0cHV0LmJlYW5pbmZvY29tbW9uLmphciA9IGJpbl9iZWFuaW5mb2NvbW1vbi8KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vbW9kZWwvYmVhbmluZm8uZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9tb2RlbC9iZWFuaW5mby5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5MjU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9tb2RlbC9iZWFuaW5mby5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJiZWFuaW5mbyIKLSAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYmVhbmluZm8uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYmVhbmluZm8iPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZlYXR1cmVEZWNvcmF0b3IiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQW5ub3RhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXF1aXZhbGVudCB0byBGZWF0dXJlRGVzY3JpcHRvciBpbiBqYXZhLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7Tm90ZTogSWYgYW55IGF0dHJpYnV0ZSBpcyBleHBsaWNpdGx5IHNldCB0aGVuIHRoZSBCZWFuSW5mby9SZWZsZWN0aW9uIHdpbGwgbm90IGJlIG1lcmdlZCBpbnRvIHRoZSBkZWNvcmF0b3IuIFRoaXMgcHJvdmlkZXMgYSB3YXkgb2Ygb3ZlcnJpZGluZyB0aGUgQmVhbkluZm9zLiBBbHNvIGZvciBhbnkgbWFueS12YWx1ZWQgYXR0cmlidXRlLCBpZiBpdCBpcyBkZXNpcmVkIHRvIGhhdmUgaXQgZXhwbGljaXRseSBlbXB0eSBhbmQgbm90IGhhdmUgQmVhbkluZm8gZmlsbCBpdCBpbiwgdGhlcmUgd2lsbCBiZSBhbm90aGVyIGF0dHJpYnV0ZSBuYW1lZCBvZiB0aGUgZm9ybSAmcXVvdDthdHRpYnV0dWVFeHBsaWNpdEVtcHR5JnF1b3Q7IElmIHRoaXMgaXMgdHJ1ZSB0aGVuIHRoZSBCZWFuSW5mbyB3aWxsIG5vdCBtZXJnZSBpbiBhbmQgd2lsbCBsZWF2ZSBpdCBlbXB0eS4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO1RoZXNlIGNvbW1lbnRzIGFib3V0IG1lcmdpbmcgYXBwbHkgdG8gYWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBkZWNvcmF0b3IgdG9vLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNwbGF5TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaG9ydERlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGVnb3J5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4cGVydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGlkZGVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmZXJyZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1lcmdlSW50cm9zcGVjdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIGludHJvc3BlY3Rpb24gcmVzdWx0cyBiZSBtZXJnZWQgaW50byB0aGlzIGRlY29yYXRvci4gSWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gdGhlIGludHJvc3BlY3Rpb24gcmVzdWx0cyBhcmUgaWdub3JlZCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGRlY29yYXRvci4gVGhpcyBpcyBhbiBpbnRlcm5hbCBmZWF0dXJlIHNpbXBseSB0byBhbGxvdyBkZXNpcmVkIG92ZXJyaWRlIGNhcGFiaWxpdGllcy4gQ3VzdG9tZXJzIHdvdWxkIHVzZSBpdCB0byBwcmV2ZW50IEFOWSBpbnRyb3NwZWN0aW9uL3JlZmxlY3Rpb24gZnJvbSBvY2N1cnJpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhdHRyaWJ1dGVzIGFyZSBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgbm90IHJldHJpZXZlZCBmcm9tIHRoZSBiZWFuaW5mby9yZWZsZWN0aW9uLiBDdXN0b21lcnMgc2hvdWxkIHNldCB0aGlzIGlmIHRoZXkgd2FudCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIGJlIGVtcHR5IGFuZCBub3QgbWVyZ2VkIHdpdGggdGhlIEJlYW5JbmZvIHJlc3VsdHMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBsaWNpdGx5U2V0Qml0cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUxvbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGJpdGZsYWcgZm9yIHdoaWNoIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldCBieSBCZWFuSW5mby9SZWZsZWN0aW9uLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhpcyBpcyBhbiBpbnRlcm5hbCBhdHRyaWJ1dGUgdGhhdCBpcyB1c2VkIGJ5IHRoZSBCZWFuSW5mbyBtYWludGFuYW5jZS4gSXQgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBsaWNpdERlY29yYXRvckZsYWciCi0gICAgICAgIGVUeXBlPSIjLy9JbXBsaWNpdEl0ZW0iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGRlY29yYXRvci9mZWF0dXJlIGltcGxpY2l0LiBUaGlzIG1lYW5zIGNyZWF0ZWQgYnkgSW50cm9zcGVjdGlvbi9SZWZsZWN0aW9uIGFuZCBub3QgYnkgY3VzdG9tZXIuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtUaGlzIGlzIGFuIGludGVybmFsIGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgYnkgdGhlIEJlYW5JbmZvIG1haW50YW5hbmNlLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5IiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZlYXR1cmUgYXR0cmlidXRlcy4gS2V5L3ZhbHVlIHBhaXJzLiBJZiBpdCBpcyBkZXNpcmVkIHRoYXQgdGhlIGZlYXR1cmUgYXR0cmlidXRlcyBpcyBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mby9yZWZsZWN0aW9uIHNldCBpdCwgc2V0IGF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5IHRvIHRydWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJlYW5EZWNvcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9GZWF0dXJlRGVjb3JhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFcXVpdmFsZW50IHRvIEJlYW5EZWNvcmF0b3IgaW4gamF2YS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVyZ2VTdXBlclByb3BlcnRpZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2hvdWxkIHRoZSBwcm9wZXJ0aWVzIG9mIHN1cGVyIHR5cGVzIGJlIG1lcmdlZCB3aGVuIGFza2luZyBmb3IgZUFsbEF0dHJpYnV0ZXMvZUFsbFJlZmVyZW5jZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1lcmdlU3VwZXJNZXRob2RzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNob3VsZCB0aGUgbWV0aG9kcyBvZiBzdXBlciB0eXBlcyBiZSBtZXJnZWQgd2hlbiBhc2tpbmcgZm9yIGVBbGxCZWhhdmlvcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1lcmdlU3VwZXJFdmVudHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2hvdWxkIHRoZSBldmVudHMgb2Ygc3VwZXIgdHlwZXMgYmUgbWVyZ2VkIHdoZW4gYXNraW5nIGZvciBlQWxsRXZlbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnRyb3NwZWN0UHJvcGVydGllcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTaG91bGQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIHByb3BlcnRpZXMgdG8gbm90IGJlIGludHJvc3BlY3RlZCBhbmQgdG8gdXNlIG9ubHkgd2hhdCBpcyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlIEphdmFDbGFzcyB4bWkgZmlsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50cm9zcGVjdE1ldGhvZHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2hvdWxkIHRoZSBtZXRob2RzIGZyb20gdGhlIGludHJvc3BlY3Rpb24gYmUgYWRkZWQgdG8gdGhlIGNsYXNzLiBUaGlzIGFsbG93cyBtZXRob2RzIHRvIG5vdCBiZSBpbnRyb3NwZWN0ZWQgYW5kIHRvIHVzZSBvbmx5IHdoYXQgaXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSBKYXZhQ2xhc3MgeG1pIGZpbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImludHJvc3BlY3RFdmVudHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2hvdWxkIHRoZSBldmVudHMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIGV2ZW50cyB0byBub3QgYmUgaW50cm9zcGVjdGVkIGFuZCB0byB1c2Ugb25seSB3aGF0IGlzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGUgSmF2YUNsYXNzIHhtaSBmaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkb0JlYW5pbmZvIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgbWVhbnMgZG8gd2UgZ28gYW5kIGdldCB0aGUgYmVhbmluZm8gZnJvbSB0aGUgcmVtb3RlIHZtLiBJZiBmYWxzZSwgdGhlbiBpdCB3aWxsIG5vdCB0cnkgdG8gZ2V0IHRoZSBiZWFuaW5mby4gVGhpcyBkb2Vzbid0IHByZXZlbnQgaW50cm9zcGVjdGlvbiB0aHJvdWdoIHJlZmxlY3Rpb24uIFRoYXQgaXMgY29udHJvbGVkIGJ5IHRoZSBzZXBhcmF0ZSBpbnRyb3NwZWN0Li4uIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdEluaGVyaXRlZFByb3BlcnR5TmFtZXMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMgdG8gbm90IHVzZSBpbiBnZXRBbGxQcm9wZXJ0aWVzKCkuIFRoZXNlIG5hbWVzIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIHByb3BlcnR5IGlzIG5vdCBvbiB0aGUgbGlzdCB0aGVuIGl0IHdpbGwgc2hvdyBpbiBnZXRBbGxQcm9wZXJ0aWVzKCkuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtUaGlzIGxpc3Qgd2lsbCBiZSBlbXB0eSBpZiBhbGwgcHJvcGVydGllcyBhcmUgaW5oZXJpdGVkIG9yIGlmIHRoZSBtZXJnZVN1cGVyUHJvcGVydGllcyBmbGFnIGlzIGZhbHNlLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7Tm90ZTogVGhpcyBhdHRyaWJ1dGUgaXMgbm90IG1lYW50IHRvIGJlIGNoYW5nZWQgYnkgY2xpZW50cy4gSXQgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RJbmhlcml0ZWRNZXRob2ROYW1lcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBtZXRob2QgbmFtZXMgdG8gbm90IHVzZSBpbiBlQWxsT3BlcmF0aW9ucygpLiBUaGVzZSBuYW1lcyBhcmUgb3BlcmF0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgaW5oZXJpdGVkIGFuZCBzaG91bGQgbm90IHNob3cgdGhyb3VnaC4gSWYgdGhlIGluaGVyaXRlZCBvcGVyYXRpb24gaXMgbm90IG9uIHRoZSBsaXN0IHRoZW4gaXQgd2lsbCBzaG93IGluIGdldEFsbE9wZXJhdGlvbnMoKS4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO1RoaXMgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIGFsbCBvcGVyYXRpb25zIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJCZWhhdmlvcnMgZmxhZyBpcyBmYWxzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90SW5oZXJpdGVkRXZlbnROYW1lcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBldmVudCBuYW1lcyB0byBub3QgdXNlIGluIGdldEFsbEV2ZW50cygpLiBUaGVzZSBuYW1lcyBhcmUgZXZlbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmhlcml0ZWQgYW5kIHNob3VsZCBub3Qgc2hvdyB0aHJvdWdoLiBJZiB0aGUgaW5oZXJpdGVkIGV2ZW50IGlzIG5vdCBvbiB0aGUgbGlzdCB0aGVuIGl0IHdpbGwgc2hvdyBpbiBnZXRBbGxFdmVudHMoKS4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO1RoaXMgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIGFsbCBldmVudHMgYXJlIGluaGVyaXRlZCBvciBpZiB0aGUgbWVyZ2VTdXBlckV2ZW50cyBmbGFnIGlzIGZhbHNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjdXN0b21pemVyQ2xhc3MiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXZlbnRTZXREZWNvcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9GZWF0dXJlRGVjb3JhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFcXVpdmFsZW50IHRvIEV2ZW50U2V0RGVjb3JhdG9yIGluIGphdmEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluRGVmYXVsdEV2ZW50U2V0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bmljYXN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0cnVlIGlmIHRoZSBsaXN0ZW5lck1ldGhvZHMgZmVhdHVyZSBpcyBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgaXMgbm90IHRvIGhhdmUgbGlzdGVuZXIgbWV0aG9kcyBtZXJnZWQgaW4gZnJvbSBCZWFuSW5mbyBvciByZWZsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRMaXN0ZW5lck1ldGhvZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL01ldGhvZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaXN0ZW5lck1ldGhvZHMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUHJveHkiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJsaXN0ZW5lciBtZXRob2RzLiBJZiBpdCBpcyBkZXNpcmVkIHRoYXQgdGhlIGxpc3QgYmUgZXhwbGljaXRseSBlbXB0eSBhbmQgbm90IGhhdmUgQmVhbkluZm8gc2V0IGl0LCB0aGVuIHNldCBsaXN0ZW5lck1ldGhvZHNFeHBsaWNpdEVtcHR5IHRvIHRydWUuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtMaXN0ZW5lck1ldGhvZHMgd2lsbCBiZSBkZWNvcmF0ZWQgd2l0aCBNZXRob2REZWNvcmF0b3JzLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7Tm90ZTogVGhpcyBpcyBhIGRlcml2ZWQgc2V0dGluZywgd2hpY2ggbWVhbnMgaXQgd2lsbCBub3Qgbm90aWZ5IG91dCBjaGFuZ2VzIHRvIGl0LiBUbyBoZXJlIGNoYW5nZXMgdG8gaXQsIGxpc3RlbiBvbiAmcXVvdDtzZXJMaXN0TXRoZCZxdW90OyBub3RpZmljYXRpb25zIGluc3RlYWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxpc3RlbmVyVHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZW1vdmVMaXN0ZW5lck1ldGhvZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL01ldGhvZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJldmVudEFkYXB0ZXJDbGFzcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZvciBzb21lIGxpc3RlbmVyIGludGVyZmFjZXMgYW4gYWRhcHRlciBjbGFzcyBpcyBwcm92aWRlZCB0aGF0IGltcGxlbWVudHMgZGVmYXVsdCBuby1vcCBtZXRob2RzLCBlLmcuIGphdmEuYXd0LmV2ZW50LkZvY3VzRXZlbnQgd2hpY2ggaGFzIGphdmEuYXd0LmV2ZW50LkZvY3VzQWRhcHRlci4gVGhlIEFkYXB0ZXIgY2xhc3MgaXMgcHJvdmlkZWQgaW4gYSBrZXkvdmFsdWUgcGFpciBvbiB0aGUgamF2YS5iZWFucy5FdmVudFNldERlc2NyaXB0b3Igd2l0aCBhIGtleSBkZWZpbmVkIGluIGEgc3RhdGljIGZpbmFsIGNvbnN0YW50cyBFVkVOVEFEQVBURVJDTEFTUyA9ICZxdW90O2V2ZW50QWRhcHRlckNsYXNzJnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJMaXN0TXRoZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQcm94eSIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIGEgcHJpdmF0ZSBmZWF0dXJlLiBJdCBpcyB1c2VkIGludGVybmFsbHkgb25seS4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZERlY29yYXRvciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVEZWNvcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVxdWl2YWxlbnQgdG8gTWV0aG9kRGVjb3JhdG9yIGluIGphdmEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcm1zRXhwbGljaXRFbXB0eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXQgdHJ1ZSBpZiB0aGUgcGFybXMgZmVhdHVyZSBpcyBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgaXMgbm90IHRvIGhhdmUgcGFyYW1ldGVycyBtZXJnZWQgaW4gZnJvbSBCZWFuSW5mbyBvciByZWZsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJhbWV0ZXJEZXNjcmlwdG9ycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QYXJhbWV0ZXJEZWNvcmF0b3IiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMgbGlzdC4mI3hEOyYjeEE7Jmx0O3A+JiN4RDsmI3hBO05vdGU6IFRoaXMgaXMgYSBkZXJpdmVkIHNldHRpbmcsIHdoaWNoIG1lYW5zIGl0IHdpbGwgbm90IG5vdGlmeSBvdXQgY2hhbmdlcyB0byBpdC4gVG8gaGVyZSBjaGFuZ2VzIHRvIGl0LCBsaXN0ZW4gb24gJnF1b3Q7c2VyUGFybURlc2MmcXVvdDsgbm90aWZpY2F0aW9ucyBpbnN0ZWFkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJQYXJtRGVzYyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QYXJhbWV0ZXJEZWNvcmF0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyBhIHByaXZhdGUgZmVhdHVyZS4gSXQgaXMgdXNlZCBpbnRlcm5hbGx5IG9ubHkuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYXJhbWV0ZXJEZWNvcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9GZWF0dXJlRGVjb3JhdG9yIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIGlzIGV4cGxpY2l0IGhlcmUgYmVjYXVzZSB1bmxpa2UgdGhlIG90aGVyIGZlYXR1cmUgZGVjb3JhdG9ycywgdGhlIG5hbWUgZG9lcyBub3QgY29tZSBmcm9tIHRoZSBvYmplY3QgYmVpbmcgZGVjb3JhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJhbWV0ZXIiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSmF2YVBhcmFtZXRlciB0aGF0IHRoaXMgUGFyYW1ldGVyRGVjb3JhdG9yIGlzIGRlY29yYXRpbmcuIENhbid0IHVzZSBlRGVjb3JhdGVzIGluIHRoaXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb3BlcnR5RGVjb3JhdG9yIiBlU3VwZXJUeXBlcz0iIy8vRmVhdHVyZURlY29yYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXF1aXZhbGVudCB0byBQcm9wZXJ0eURlY29yYXRvciBpbiBqYXZhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQcm9wZXJ0eVR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUNsYXNzaWZpZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIHByb3BlcnR5IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRQcm9wZXJ0eVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXQgdGhlIHByb3BlcnR5IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwcm9wZXJ0eVR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUNsYXNzaWZpZXIiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib3VuZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWluZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2lnblRpbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgbm90IHNldCwgdGhlbiBub3JtYWwgZGVmYXVsdCBwcm9jZXNzaW5nLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SWYgc2V0IHRydWUsIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBhIGRlc2lnbiB0aW1lIHByb3BlcnR5LiBUaGlzIG1lYW5zIGl0IHdpbGwgc2hvdyB1cCBpbiB0aGUgcHJvcGVydHkgc2hlZXQsIGJ1dCBpdCB3b24ndCBiZSBhYmxlIHRvIGJlIGNvbm5lY3RlZCB0byBhdCBydW50aW1lLiBJdCBtYXkgbm90IGV2ZW4gYmUgYSB0cnVlIGJlYW4gcHJvcGVydHkgYnV0IGluc3RlYWQgdGhlIGJ1aWxkZXIgd2lsbCBrbm93IGhvdyB0byBoYW5kbGUgaXQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtJZiBzZXQgZmFsc2UsIHRoZW4gdGhpcyBwcm9wZXJ0eSB3aWxsIG5vdCBzaG93IHVwIG9uIHRoZSBwcm9wZXJ0eSBzaGVldCwgYnV0IHdpbGwgYmUgYWJsZSB0byBiZSBjb25uZWN0ZWQgdG8gZm9yIHJ1bnRpbWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsd2F5c0luY29tcGF0aWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBzZXQgdHJ1ZSwgdGhlbiB3aGVuIG11bHRpcGxlIG9iamVjdHMgYXJlIHNlbGVjdGVkLCB0aGlzIHByb3BlcnR5IGlzIGFsd2F5cyBpbmNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyLiBTbyBpbiB0aGlzIGNhc2UgdGhlIHByb3BlcnR5IHdpbGwgbm90IHNob3cgdXAgb24gdGhlIHByb3BlcnR5IHNoZWV0IGlmIG1vcmUgdGhhbiBvbmUgb2JqZWN0IGhhcyBiZWVuIHNlbGVjdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWx0ZXJGbGFncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRSZWFkT25seSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGZpZWxkIHJlYWQtb25seSAoaS5lLiBpcyBhICZxdW90O2ZpbmFsJnF1b3Q7IGZpZWxkKS4gVGhpcyBpcyBvbmx5IHJlZmVyZW5jZWQgaWYgdGhlIGZpZWxkIHJlZmVyZW5jZSBpcyBzZXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5RWRpdG9yQ2xhc3MiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVhZE1ldGhvZCIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL01ldGhvZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3cml0ZU1ldGhvZCIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL01ldGhvZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWVsZCIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0ZpZWxkIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgdGhpcyBpcyBzZXQsIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBhIGZpZWxkIGFuZCBub3QgYSBnZXR0ZXIvc2V0dGVyIHByb3BlcnR5LiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0aGF0IHRoZSBWaXN1YWwgRWRpdG9yIHVzZXMgdG8gdGhlIEJlYW5JbmZvIG1vZGVsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9Qcm9wZXJ0eURlY29yYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXF1aXZhbGVudCB0byBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5kZXhlZFJlYWRNZXRob2QiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9NZXRob2QiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5kZXhlZFdyaXRlTWV0aG9kIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vTWV0aG9kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFByb3h5IiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU9wZXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyBqdXN0IGEgd3JhcHBlciBvZiBhIGphdmEgTWV0aG9kLiBJdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBtZXRob2QgYnV0IGRvZXNuJ3QgZHVwbGljYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGl0LiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7TWV0aG9kUHJveGllcyB3aWxsIGJlIGluIHRoZSBlQmVoYXZpb3JzIHNldHRpbmcgZm9yIGFueSBtZXRob2RzIHRoYXQgYXJlIGluIHRoZSBKYXZhQ2xhc3MgbWV0aG9kcyBzZXR0aW5nIHNvIHRoYXQgdGhleSBhcmUgbm90IGR1cGxpY2F0ZWQuJiN4RDsmI3hBOyZsdDtwPiYjeEQ7JiN4QTtNZXRob2RQcm94aWVzIHdvdWxkIGFsc28gaGF2ZSBNZXRob2REZWNvcmF0b3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2QiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9NZXRob2QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmVhbkV2ZW50IiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhRXZlbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZW50IGZyb20gSW50cm9zcGVjdGlvbi9SZWZsZWN0aW9uLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhlIEJlYW5FdmVudCB3aWxsIGJlIHVuZGVyIHRoZSBKYXZhQ2xhc3MnIGV2ZW50cyBhbmQgYWxsRXZlbnRzIGZlYXR1cmUuIEVhY2ggQmVhbkV2ZW50IHdpbGwgYmUgZGVjb3JhdGVkIGJ5IGFuIEV2ZW50U2V0RGVjb3JhdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTWFwJEVudHJ5Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGZlYXR1cmUgYXR0cmlidXRlLiBJdCBjYW4gb25seSByZXByZXNlbnQgdGhlIGZvbGxvd2luZzomI3hEOyYjeEE7JiN4RDsmI3hBOy0gU3RyaW5nJiN4RDsmI3hBOy0gcHJpbWl0aXZlcyYjeEQ7JiN4QTstIGFycmF5ICh0eXBlIE9iamVjdCkgY29udGFpbmluZyBtaXh0dXJlIG9mIFN0cmluZ3MgYW5kIHByaW1pdGl2ZXMgKGFzIHRoZSBvYmplY3QgdHlwZXMpJiN4RDsmI3hBOy0gYXJyYXkgKHR5cGUgU3RyaW5nKSYjeEQ7JiN4QTstIGFycmF5ICh0eXBlIHByaW1pdGl2ZSkmI3hEOyYjeEE7JiN4RDsmI3hBO0FueXRoaW5nIGVsc2UgY2Fubm90IGJlIHJlcHJlc2VudGVkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkltcGxpY2l0SXRlbSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBlbnVtIGlzIGFuIGludGVybmFsIGVudW0uIEl0IGlzIHVzZWQgYnkgQmVhbkluZm8gZm9yIGNhY2hlIG1haW50ZW5hbmNlLiYjeEQ7JiN4QTsmbHQ7cD4mI3hEOyYjeEE7VGhpcyBlbnVtIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGNsaWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT1RfSU1QTElDSVQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZWFucyB0aGlzIGRlY29yYXRvciBpcyBub3QgaW1wbGljaXQuIFRoYXQgaXMgaXQgd2FzIGNyZWF0ZWQgYnkgY3VzdG9tZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklNUExJQ0lUX0RFQ09SQVRPUiIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY29yYXRvciBpcyBpbXBsaWNpdC4gVGhhdCBpcyBpdCB3YXMgbm90IGNyZWF0ZWQgYnkgdGhlIGN1c3RvbWVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkUiIHZhbHVlPSIyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBtZWFucyB0aGUgZGVjb3JhdG9yIGFuZCB0aGUgZmVhdHVyZSB3aGVyZSBpbXBsaWNpdC4gVGhhdCBpcyB0aGV5IHdlcmUgbm90IGNyZWF0ZWQgYnkgdGhlIGN1c3RvbWVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL21vZGVsL2ludHJvc3BlY3QuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9tb2RlbC9pbnRyb3NwZWN0Lmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjYxNmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL21vZGVsL2ludHJvc3BlY3QuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vYmVhbmluZm8iCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iIiBtb2RlbE5hbWU9IkJlYW5pbmZvIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5wcm92aWRlci5CZWFuaW5mb0VkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5wcmVzZW50YXRpb24uQmVhbmluZm9FZGl0b3JQbHVnaW4iCi0gICAgdXBkYXRlQ2xhc3NwYXRoPSJmYWxzZSIgYm9vbGVhbkZsYWdzRmllbGQ9ImVGbGFncyIgYm9vbGVhbkZsYWdzUmVzZXJ2ZWRCaXRzPSI4IgotICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5yb3NlIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwjLy9qYXZhIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXGludHJvc3BlY3QubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V29ya3NwYWNlUm9vdDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkJlYW5pbmZvIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiCi0gICAgICBlY29yZVBhY2thZ2U9ImJlYW5pbmZvLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImJlYW5pbmZvLmVjb3JlIy8vSW1wbGljaXRJdGVtIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iYmVhbmluZm8uZWNvcmUjLy9JbXBsaWNpdEl0ZW0vTk9UX0lNUExJQ0lUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImJlYW5pbmZvLmVjb3JlIy8vSW1wbGljaXRJdGVtL0lNUExJQ0lUX0RFQ09SQVRPUiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJiZWFuaW5mby5lY29yZSMvL0ltcGxpY2l0SXRlbS9JTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlQXR0cmlidXRlVmFsdWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9kaXNwbGF5TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9zaG9ydERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2NhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2V4cGVydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9oaWRkZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvcHJlZmVycmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL21lcmdlSW50cm9zcGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9hdHRyaWJ1dGVzRXhwbGljaXRFbXB0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9pbXBsaWNpdGx5U2V0Qml0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZURlY29yYXRvci9pbXBsaWNpdERlY29yYXRvckZsYWciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlRGVjb3JhdG9yL2F0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVEZWNvcmF0b3IvZ2V0TmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvci9tZXJnZVN1cGVyUHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvci9tZXJnZVN1cGVyTWV0aG9kcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvci9tZXJnZVN1cGVyRXZlbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL2ludHJvc3BlY3RQcm9wZXJ0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL2ludHJvc3BlY3RNZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL2ludHJvc3BlY3RFdmVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IvZG9CZWFuaW5mbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vQmVhbkRlY29yYXRvci9ub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL25vdEluaGVyaXRlZE1ldGhvZE5hbWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9CZWFuRGVjb3JhdG9yL25vdEluaGVyaXRlZEV2ZW50TmFtZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0JlYW5EZWNvcmF0b3IvY3VzdG9taXplckNsYXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvaW5EZWZhdWx0RXZlbnRTZXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL3VuaWNhc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL2xpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL2FkZExpc3RlbmVyTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vRXZlbnRTZXREZWNvcmF0b3IvbGlzdGVuZXJNZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9FdmVudFNldERlY29yYXRvci9saXN0ZW5lclR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL3JlbW92ZUxpc3RlbmVyTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9FdmVudFNldERlY29yYXRvci9ldmVudEFkYXB0ZXJDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0V2ZW50U2V0RGVjb3JhdG9yL3Nlckxpc3RNdGhkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vTWV0aG9kRGVjb3JhdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL01ldGhvZERlY29yYXRvci9wYXJtc0V4cGxpY2l0RW1wdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9NZXRob2REZWNvcmF0b3IvcGFyYW1ldGVyRGVzY3JpcHRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9NZXRob2REZWNvcmF0b3Ivc2VyUGFybURlc2MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9QYXJhbWV0ZXJEZWNvcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUGFyYW1ldGVyRGVjb3JhdG9yL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL1BhcmFtZXRlckRlY29yYXRvci9wYXJhbWV0ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9ib3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvY29uc3RyYWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL2Rlc2lnblRpbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL2Fsd2F5c0luY29tcGF0aWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvZmlsdGVyRmxhZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL2ZpZWxkUmVhZE9ubHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL3Byb3BlcnR5RWRpdG9yQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL3JlYWRNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL1Byb3BlcnR5RGVjb3JhdG9yL3dyaXRlTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9maWVsZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImJlYW5pbmZvLmVjb3JlIy8vUHJvcGVydHlEZWNvcmF0b3IvZ2V0UHJvcGVydHlUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9zZXRQcm9wZXJ0eVR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iYmVhbmluZm8uZWNvcmUjLy9Qcm9wZXJ0eURlY29yYXRvci9zZXRQcm9wZXJ0eVR5cGUvcHJvcGVydHlUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL0luZGV4ZWRQcm9wZXJ0eURlY29yYXRvci9pbmRleGVkUmVhZE1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGJlYW5pbmZvLmVjb3JlIy8vSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yL2luZGV4ZWRXcml0ZU1ldGhvZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJiZWFuaW5mby5lY29yZSMvL01ldGhvZFByb3h5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBiZWFuaW5mby5lY29yZSMvL01ldGhvZFByb3h5L21ldGhvZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJiZWFuaW5mby5lY29yZSMvL0JlYW5FdmVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImJlYW5pbmZvLmVjb3JlIy8vRmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBiZWFuaW5mby5lY29yZSMvL0ZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeS9rZXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYmVhbmluZm8uZWNvcmUjLy9GZWF0dXJlQXR0cmlidXRlTWFwRW50cnkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmNTVhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9wbHVnaW4ucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJAotIwotCi0KLXBsdWdpbk5hbWU9SmF2YSBFTUYgTW9kZWwgQmVhbkluZm8gKEludHJvc3BlY3Rpb24pIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1iZWFuaW5mb05hdHVyZU5hbWU9SmF2YSBNb2RlbCBCZWFuSW5mbyBOYXR1cmUKLXJlZ2lzdHJhdGlvbnMuZXh0ZW5zaW9ucG9pbnQubmFtZT1CZWFuSW5mbyBleHRlbnNpb24gcmVnaXN0cmF0aW9ucwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWRjZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlZ2lzdHJhdGlvbnMiIG5hbWU9IiVyZWdpc3RyYXRpb25zLmV4dGVuc2lvbnBvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL3JlZ2lzdHJhdGlvbnMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iQmVhbkluZm9OYXR1cmUiCi0gICAgICAgICBuYW1lPSIlYmVhbmluZm9OYXR1cmVOYW1lIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hdHVyZXMiPgotICAgICAgPHJ1bnRpbWU+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvTmF0dXJlIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9ydW50aW1lPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvLmVjb3JlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5CZWFuaW5mb1BhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgICAgZXh0ZW5zaW9uPSJiZWFuaW5mb0NvbmZpZyI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICAgICBleHRlbnNpb249Im92ZXJyaWRlIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcHJveHkuamFycyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Byb3h5LmphcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjgyMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcHJveHkuamFycworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotdm0vYmVhbmluZm92bS5qYXI9L29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9iaW5fdm1fYmVhbmluZm92bS8KLWJlYW5pbmZvY29tbW9uLmphcj0vb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2Jpbl9iZWFuaW5mb2NvbW1vbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTNhMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLm1kfgotKi5jYX4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9yb3NlL2JlYW5pbmZvLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvYmVhbmluZm8uY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDIyN2NlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvYmVhbmluZm8uY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMzMwMSArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiYmVhbmluZm8iCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8iKSkpCi0gICAgcXVpZCAgICAgICAJIjNBNzk5QUJCMDM1MyIKLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIgotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzcyAiRmVhdHVyZURlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzk5QjNFMDFFOSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18RXF1aXZhbGVudCB0byBGZWF0dXJlRGVzY3JpcHRvciBpbiBqYXZhLgotfDxwPgotfE5vdGU6IElmIGFueSBhdHRyaWJ1dGUgaXMgZXhwbGljaXRseSBzZXQgdGhlbiB0aGUgQmVhbkluZm8vUmVmbGVjdGlvbiB3aWxsIG5vdCBiZSBtZXJnZWQgaW50byB0aGUgZGVjb3JhdG9yLiBUaGlzIHByb3ZpZGVzIGEgd2F5IG9mIG92ZXJyaWRpbmcgdGhlIEJlYW5JbmZvcy4gQWxzbyBmb3IgYW55IG1hbnktdmFsdWVkIGF0dHJpYnV0ZSwgaWYgaXQgaXMgZGVzaXJlZCB0byBoYXZlIGl0IGV4cGxpY2l0bHkgZW1wdHkgYW5kIG5vdCBoYXZlIEJlYW5JbmZvIGZpbGwgaXQgaW4sIHRoZXJlIHdpbGwgYmUgYW5vdGhlciBhdHRyaWJ1dGUgbmFtZWQgb2YgdGhlIGZvcm0gImF0dGlidXR1ZUV4cGxpY2l0RW1wdHkiIElmIHRoaXMgaXMgdHJ1ZSB0aGVuIHRoZSBCZWFuSW5mbyB3aWxsIG5vdCBtZXJnZSBpbiBhbmQgd2lsbCBsZWF2ZSBpdCBlbXB0eS4KLXw8cD4KLXxUaGVzZSBjb21tZW50cyBhYm91dCBtZXJnaW5nIGFwcGx5IHRvIGFsbCBzdWJjbGFzc2VzIG9mIHRoaXMgZGVjb3JhdG9yIHRvby4gCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0RGQTE4NTkwMERDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVBbm5vdGF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNEOThBMUM3MDFBQiIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCODY3RDBEMDE4NCIKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzcGxheU5hbWUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlDRkNDMDEzMSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2hvcnREZXNjcmlwdGlvbiIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUNGRDUwMUU4IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjYXRlZ29yeSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCSAgICBxdWlkICAgICAgIAkiM0JBMjc5NzEwMkRDIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHBlcnQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlDRkU3MDBGRSIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImhpZGRlbiIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQwMDUwMzI4IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZmVycmVkIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDAyNDAzMTgiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXJnZUludHJvc3BlY3Rpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0E4MkMwQTYwMzg5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNob3VsZCB0aGUgaW50cm9zcGVjdGlvbiByZXN1bHRzIGJlIG1lcmdlZCBpbnRvIHRoaXMgZGVjb3JhdG9yLiBJZiB0aGlzIGlzIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgaW50cm9zcGVjdGlvbiByZXN1bHRzIGFyZSBpZ25vcmVkIGZvciB0aGlzIHBhcnRpY3VsYXIgZGVjb3JhdG9yLiBUaGlzIGlzIGFuIGludGVybmFsIGZlYXR1cmUgc2ltcGx5IHRvIGFsbG93IGRlc2lyZWQgb3ZlcnJpZGUgY2FwYWJpbGl0aWVzLiBDdXN0b21lcnMgd291bGQgdXNlIGl0IHRvIHByZXZlbnQgQU5ZIGludHJvc3BlY3Rpb24vcmVmbGVjdGlvbiBmcm9tIG9jY3VycmluZy4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGluaXR2ICAgICAgCSJ0cnVlIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlc0V4cGxpY2l0RW1wdHkiCi0JCSAgICBxdWlkICAgICAgIAkiM0M5QjQ5MzIwMjY1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhdHRyaWJ1dGVzIGFyZSBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgbm90IHJldHJpZXZlZCBmcm9tIHRoZSBiZWFuaW5mby9yZWZsZWN0aW9uLiBDdXN0b21lcnMgc2hvdWxkIHNldCB0aGlzIGlmIHRoZXkgd2FudCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIGJlIGVtcHR5IGFuZCBub3QgbWVyZ2VkIHdpdGggdGhlIEJlYW5JbmZvIHJlc3VsdHMuICIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW1wbGljaXRseVNldEJpdHMiCi0JCSAgICBxdWlkICAgICAgIAkiNDFFNTgxNUQwMkI5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18QSBiaXRmbGFnIGZvciB3aGljaCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQgYnkgQmVhbkluZm8vUmVmbGVjdGlvbi4KLXw8cD4KLXxUaGlzIGlzIGFuIGludGVybmFsIGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgYnkgdGhlIEJlYW5JbmZvIG1haW50YW5hbmNlLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJsb25nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW1wbGljaXREZWNvcmF0b3JGbGFnIgotCQkgICAgcXVpZCAgICAgICAJIjQxRTVBMDVEMDIxQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfElzIHRoaXMgZGVjb3JhdG9yL2ZlYXR1cmUgaW1wbGljaXQuIFRoaXMgbWVhbnMgY3JlYXRlZCBieSBJbnRyb3NwZWN0aW9uL1JlZmxlY3Rpb24gYW5kIG5vdCBieSBjdXN0b21lci4KLXw8cD4KLXxUaGlzIGlzIGFuIGludGVybmFsIGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgYnkgdGhlIEJlYW5JbmZvIG1haW50YW5hbmNlLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBjdXN0b21lcnMuCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJJbXBsaWNpdEl0ZW0iCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFNTlFNUQwMjk2IikpKQotCShvYmplY3QgQ2xhc3MgIkJlYW5EZWNvcmF0b3IiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5RDBERjAyRDEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJFcXVpdmFsZW50IHRvIEJlYW5EZWNvcmF0b3IgaW4gamF2YS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REU4RTAwN0YiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVyZ2VTdXBlclByb3BlcnRpZXMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBODJCNzNFMDIwMCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIHByb3BlcnRpZXMgb2Ygc3VwZXIgdHlwZXMgYmUgbWVyZ2VkIHdoZW4gYXNraW5nIGZvciBlQWxsQXR0cmlidXRlcy9lQWxsUmVmZXJlbmNlcy4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGluaXR2ICAgICAgCSJ0cnVlIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVyZ2VTdXBlck1ldGhvZHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBODJCOTk0MDAxNSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIG1ldGhvZHMgb2Ygc3VwZXIgdHlwZXMgYmUgbWVyZ2VkIHdoZW4gYXNraW5nIGZvciBlQWxsQmVoYXZpb3JzLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXJnZVN1cGVyRXZlbnRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTgyQjk5RjAxNjUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2hvdWxkIHRoZSBldmVudHMgb2Ygc3VwZXIgdHlwZXMgYmUgbWVyZ2VkIHdoZW4gYXNraW5nIGZvciBlQWxsRXZlbnRzLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbnRyb3NwZWN0UHJvcGVydGllcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTg0MjdFQzAwQTYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2hvdWxkIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGludHJvc3BlY3Rpb24gYmUgYWRkZWQgdG8gdGhlIGNsYXNzLiBUaGlzIGFsbG93cyBwcm9wZXJ0aWVzIHRvIG5vdCBiZSBpbnRyb3NwZWN0ZWQgYW5kIHRvIHVzZSBvbmx5IHdoYXQgaXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSBKYXZhQ2xhc3MgeG1pIGZpbGUuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBpbml0diAgICAgIAkidHJ1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImludHJvc3BlY3RNZXRob2RzIgotCQkgICAgcXVpZCAgICAgICAJIjNBODQyODc1MDFCMSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTaG91bGQgdGhlIG1ldGhvZHMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIG1ldGhvZHMgdG8gbm90IGJlIGludHJvc3BlY3RlZCBhbmQgdG8gdXNlIG9ubHkgd2hhdCBpcyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlIEphdmFDbGFzcyB4bWkgZmlsZS4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGluaXR2ICAgICAgCSJ0cnVlIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW50cm9zcGVjdEV2ZW50cyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTg0Mjg3NzAwMEYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2hvdWxkIHRoZSBldmVudHMgZnJvbSB0aGUgaW50cm9zcGVjdGlvbiBiZSBhZGRlZCB0byB0aGUgY2xhc3MuIFRoaXMgYWxsb3dzIGV2ZW50cyB0byBub3QgYmUgaW50cm9zcGVjdGVkIGFuZCB0byB1c2Ugb25seSB3aGF0IGlzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGUgSmF2YUNsYXNzIHhtaSBmaWxlLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb0JlYW5pbmZvIgotCQkgICAgcXVpZCAgICAgICAJIjNDOUE0NkZDMDI3QyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIG1lYW5zIGRvIHdlIGdvIGFuZCBnZXQgdGhlIGJlYW5pbmZvIGZyb20gdGhlIHJlbW90ZSB2bS4gSWYgZmFsc2UsIHRoZW4gaXQgd2lsbCBub3QgdHJ5IHRvIGdldCB0aGUgYmVhbmluZm8uIFRoaXMgZG9lc24ndCBwcmV2ZW50IGludHJvc3BlY3Rpb24gdGhyb3VnaCByZWZsZWN0aW9uLiBUaGF0IGlzIGNvbnRyb2xlZCBieSB0aGUgc2VwYXJhdGUgaW50cm9zcGVjdC4uLiBhdHRyaWJ1dGVzLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgaW5pdHYgICAgICAJInRydWUiCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzIgotCQkgICAgcXVpZCAgICAgICAJIjQxRUVENTBCMDE4NSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMgdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzIHRvIG5vdCB1c2UgaW4gZ2V0QWxsUHJvcGVydGllcygpLiBUaGVzZSBuYW1lcyBhcmUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBub3QgYmUgaW5oZXJpdGVkIGFuZCBzaG91bGQgbm90IHNob3cgdGhyb3VnaC4gSWYgdGhlIGluaGVyaXRlZCBwcm9wZXJ0eSBpcyBub3Qgb24gdGhlIGxpc3QgdGhlbiBpdCB3aWxsIHNob3cgaW4gZ2V0QWxsUHJvcGVydGllcygpLgotfDxwPgotfFRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIGFsbCBwcm9wZXJ0aWVzIGFyZSBpbmhlcml0ZWQgb3IgaWYgdGhlIG1lcmdlU3VwZXJQcm9wZXJ0aWVzIGZsYWcgaXMgZmFsc2UuCi18PHA+Ci18Tm90ZTogVGhpcyBhdHRyaWJ1dGUgaXMgbm90IG1lYW50IHRvIGJlIGNoYW5nZWQgYnkgY2xpZW50cy4gSXQgaXMgYW4gaW50ZXJuYWwgYXR0cmlidXRlLgotCQkgICAgCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJub3RJbmhlcml0ZWRNZXRob2ROYW1lcyIKLQkJICAgIHF1aWQgICAgICAgCSI0MUYwMkM1RjAzOTkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGlzIHRoZSBsaXN0IG9mIGluaGVyaXRlZCBtZXRob2QgbmFtZXMgdG8gbm90IHVzZSBpbiBlQWxsT3BlcmF0aW9ucygpLiBUaGVzZSBuYW1lcyBhcmUgb3BlcmF0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgaW5oZXJpdGVkIGFuZCBzaG91bGQgbm90IHNob3cgdGhyb3VnaC4gSWYgdGhlIGluaGVyaXRlZCBvcGVyYXRpb24gaXMgbm90IG9uIHRoZSBsaXN0IHRoZW4gaXQgd2lsbCBzaG93IGluIGdldEFsbE9wZXJhdGlvbnMoKS4KLXw8cD4KLXxUaGlzIGxpc3Qgd2lsbCBiZSBlbXB0eSBpZiBhbGwgb3BlcmF0aW9ucyBhcmUgaW5oZXJpdGVkIG9yIGlmIHRoZSBtZXJnZVN1cGVyQmVoYXZpb3JzIGZsYWcgaXMgZmFsc2UuCi0JCSAgICAKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdEluaGVyaXRlZEV2ZW50TmFtZXMiCi0JCSAgICBxdWlkICAgICAgIAkiNDFGMDJEMEEwMzEyIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgZXZlbnQgbmFtZXMgdG8gbm90IHVzZSBpbiBnZXRBbGxFdmVudHMoKS4gVGhlc2UgbmFtZXMgYXJlIGV2ZW50cyB0aGF0IHNob3VsZCBub3QgYmUgaW5oZXJpdGVkIGFuZCBzaG91bGQgbm90IHNob3cgdGhyb3VnaC4gSWYgdGhlIGluaGVyaXRlZCBldmVudCBpcyBub3Qgb24gdGhlIGxpc3QgdGhlbiBpdCB3aWxsIHNob3cgaW4gZ2V0QWxsRXZlbnRzKCkuCi18PHA+Ci18VGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkgaWYgYWxsIGV2ZW50cyBhcmUgaW5oZXJpdGVkIG9yIGlmIHRoZSBtZXJnZVN1cGVyRXZlbnRzIGZsYWcgaXMgZmFsc2UuCi0JCSAgICAKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKSkKLQkob2JqZWN0IENsYXNzICJFdmVudFNldERlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEMUQyMDA0RiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVxdWl2YWxlbnQgdG8gRXZlbnRTZXREZWNvcmF0b3IgaW4gamF2YS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REVBMjAwRUMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5EZWZhdWx0RXZlbnRTZXQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEOTRGMDA0QyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaWNhc3QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEOTU4MDE2NyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkiCi0JCSAgICBxdWlkICAgICAgIAkiM0NCMUFGN0QwMjg2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0cnVlIGlmIHRoZSBsaXN0ZW5lck1ldGhvZHMgZmVhdHVyZSBpcyBleHBsaWNpdGx5IHNldCBhcyBlbXB0eSBhbmQgaXMgbm90IHRvIGhhdmUgbGlzdGVuZXIgbWV0aG9kcyBtZXJnZWQgaW4gZnJvbSBCZWFuSW5mbyBvciByZWZsZWN0aW9uLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIkltcGxlbWVudGF0aW9uIikpKQotCShvYmplY3QgQ2xhc3MgIk1ldGhvZERlY29yYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEMzVFMDAyNyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkVxdWl2YWxlbnQgdG8gTWV0aG9kRGVjb3JhdG9yIGluIGphdmEuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURFQTYwM0UxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkZlYXR1cmVEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OTlCM0UwMUU5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcm1zRXhwbGljaXRFbXB0eSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg2QUJFODAwOTIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRydWUgaWYgdGhlIHBhcm1zIGZlYXR1cmUgaXMgZXhwbGljaXRseSBzZXQgYXMgZW1wdHkgYW5kIGlzIG5vdCB0byBoYXZlIHBhcmFtZXRlcnMgbWVyZ2VkIGluIGZyb20gQmVhbkluZm8gb3IgcmVmbGVjdGlvbi4iCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJJbXBsZW1lbnRhdGlvbiIpKSkKLQkob2JqZWN0IENsYXNzICJQYXJhbWV0ZXJEZWNvcmF0b3IiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5RDlDMjAzMDQiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REVCQjAxQzQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg2QTY3MDAwOTkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG5hbWUgaXMgZXhwbGljaXQgaGVyZSBiZWNhdXNlIHVubGlrZSB0aGUgb3RoZXIgZmVhdHVyZSBkZWNvcmF0b3JzLCB0aGUgbmFtZSBkb2VzIG5vdCBjb21lIGZyb20gdGhlIG9iamVjdCBiZWluZyBkZWNvcmF0ZWQuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUHJvcGVydHlEZWNvcmF0b3IiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5REE2ODAxMEUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJFcXVpdmFsZW50IHRvIFByb3BlcnR5RGVjb3JhdG9yIGluIGphdmEuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURFOTcwMkJEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkZlYXR1cmVEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OTlCM0UwMUU5IikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFByb3BlcnR5VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhDRjUyNjAzOUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiR2V0IHRoZSBwcm9wZXJ0eSB0eXBlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJFQ2xhc3NpZmllciIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQUNFNEZFRTAzNzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0UHJvcGVydHlUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjQzMjlEMUNFMDMwRSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdGhlIHByb3BlcnR5IHR5cGUuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInByb3BlcnR5VHlwZSIKLQkJCSAgICBxdWlkICAgICAgIAkiNDMyOUQxRTIwMTY4IgotCQkJICAgIHR5cGUgICAgICAgCSJFQ2xhc3NpZmllciIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FDRTRGRUUwMzcxIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYm91bmQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQzI1MDMwMyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbmVkIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REMyQzAwQTAiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNpZ25UaW1lIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQkEyNzQ1NTAxOUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxJZiBub3Qgc2V0LCB0aGVuIG5vcm1hbCBkZWZhdWx0IHByb2Nlc3NpbmcuCi18Ci18SWYgc2V0IHRydWUsIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBhIGRlc2lnbiB0aW1lIHByb3BlcnR5LiBUaGlzIG1lYW5zIGl0IHdpbGwgc2hvdyB1cCBpbiB0aGUgcHJvcGVydHkgc2hlZXQsIGJ1dCBpdCB3b24ndCBiZSBhYmxlIHRvIGJlIGNvbm5lY3RlZCB0byBhdCBydW50aW1lLiBJdCBtYXkgbm90IGV2ZW4gYmUgYSB0cnVlIGJlYW4gcHJvcGVydHkgYnV0IGluc3RlYWQgdGhlIGJ1aWxkZXIgd2lsbCBrbm93IGhvdyB0byBoYW5kbGUgaXQuCi18Ci18SWYgc2V0IGZhbHNlLCB0aGVuIHRoaXMgcHJvcGVydHkgd2lsbCBub3Qgc2hvdyB1cCBvbiB0aGUgcHJvcGVydHkgc2hlZXQsIGJ1dCB3aWxsIGJlIGFibGUgdG8gYmUgY29ubmVjdGVkIHRvIGZvciBydW50aW1lLgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbHdheXNJbmNvbXBhdGlibGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0JBMjdBMTcwMEJFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklmIHNldCB0cnVlLCB0aGVuIHdoZW4gbXVsdGlwbGUgb2JqZWN0cyBhcmUgc2VsZWN0ZWQsIHRoaXMgcHJvcGVydHkgaXMgYWx3YXlzIGluY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIuIFNvIGluIHRoaXMgY2FzZSB0aGUgcHJvcGVydHkgd2lsbCBub3Qgc2hvdyB1cCBvbiB0aGUgcHJvcGVydHkgc2hlZXQgaWYgbW9yZSB0aGFuIG9uZSBvYmplY3QgaGFzIGJlZW4gc2VsZWN0ZWQuIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmlsdGVyRmxhZ3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0JBM0IxOEYwMDM2IgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkUmVhZE9ubHkiCi0JCSAgICBxdWlkICAgICAgIAkiNDIwN0UxMDEwMThFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18SXMgdGhpcyBmaWVsZCByZWFkLW9ubHkgKGkuZS4gaXMgYSAiZmluYWwiIGZpZWxkKS4gVGhpcyBpcyBvbmx5IHJlZmVyZW5jZWQgaWYgdGhlIGZpZWxkIHJlZmVyZW5jZSBpcyBzZXQuCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5REM0NTAzMDkiCi0JICAgIGRvY3VtZW50YXRpb24gCSJFcXVpdmFsZW50IHRvIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBNzlERTg0MDM4OCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQcm9wZXJ0eURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REE2ODAxMEUiKSkpCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kUHJveHkiCi0JICAgIHF1aWQgICAgICAgCSIzQTg5ODRDOTAxQzMiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMganVzdCBhIHdyYXBwZXIgb2YgYSBqYXZhIE1ldGhvZC4gSXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgbWV0aG9kIGJ1dCBkb2Vzbid0IGR1cGxpY2F0ZSB0aGUgaW50ZXJmYWNlIGZvciBpdC4KLXw8cD4KLXxNZXRob2RQcm94aWVzIHdpbGwgYmUgaW4gdGhlIGVCZWhhdmlvcnMgc2V0dGluZyBmb3IgYW55IG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIEphdmFDbGFzcyBtZXRob2RzIHNldHRpbmcgc28gdGhhdCB0aGV5IGFyZSBub3QgZHVwbGljYXRlZC4KLXw8cD4KLXxNZXRob2RQcm94aWVzIHdvdWxkIGFsc28gaGF2ZSBNZXRob2REZWNvcmF0b3JzLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNERkExOUI2MDBERSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT3BlcmF0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDREQUEyMDBBMCIpKSkKLQkob2JqZWN0IENsYXNzICJCZWFuRXZlbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQ0IwOUNBOTAyMTIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfEV2ZW50IGZyb20gSW50cm9zcGVjdGlvbi9SZWZsZWN0aW9uLgotfDxwPgotfFRoZSBCZWFuRXZlbnQgd2lsbCBiZSB1bmRlciB0aGUgSmF2YUNsYXNzJyBldmVudHMgYW5kIGFsbEV2ZW50cyBmZWF0dXJlLiBFYWNoIEJlYW5FdmVudCB3aWxsIGJlIGRlY29yYXRlZCBieSBhbiBFdmVudFNldERlY29yYXRvci4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQ0IwOUNCNjAzOEQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhRXZlbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZBRjEwM0M4IikpKQotCShvYmplY3QgQ2xhc3MgIkZlYXR1cmVBdHRyaWJ1dGVNYXBFbnRyeSIKLQkgICAgcXVpZCAgICAgICAJIjQwNENDODU1MDFGNSIKLQkgICAgc3RlcmVvdHlwZSAJIk1hcEVudHJ5IgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXkiCi0JCSAgICBxdWlkICAgICAgIAkiNDA0Q0M4QjcwMzA0IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCSAgICBxdWlkICAgICAgIAkiNDFFNTg0MTQwMTBBIgotCQkgICAgdHlwZSAgICAgICAJIkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIKLQkJICAgIHF1aWR1ICAgICAgCSI0MUU1ODJGODAwQkIiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSIKLQkgICAgcXVpZCAgICAgICAJIjQxRTU4MkY4MDBCQiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgYXR0cmlidXRlIHZhbHVlIGZvciBmZWF0dXJlIGF0dHJpYnV0ZS4gSXQgY2FuIG9ubHkgcmVwcmVzZW50IHRoZSBmb2xsb3dpbmc6Ci18Ci18LSBTdHJpbmcKLXwtIHByaW1pdGl2ZXMKLXwtIGFycmF5ICh0eXBlIE9iamVjdCkgY29udGFpbmluZyBtaXh0dXJlIG9mIFN0cmluZ3MgYW5kIHByaW1pdGl2ZXMgKGFzIHRoZSBvYmplY3QgdHlwZXMpCi18LSBhcnJheSAodHlwZSBTdHJpbmcpCi18LSBhcnJheSAodHlwZSBwcmltaXRpdmUpCi18Ci18QW55dGhpbmcgZWxzZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQuCi0JICAgIAotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb21tb24uRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIgotCQkgICAgcXVpZCAgICAgICAJIjQxRTU4M0I1MDNDQSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSW1wbGljaXRJdGVtIgotCSAgICBxdWlkICAgICAgIAkiNDFFNTlFNUQwMjk2IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIGVudW0gaXMgYW4gaW50ZXJuYWwgZW51bS4gSXQgaXMgdXNlZCBieSBCZWFuSW5mbyBmb3IgY2FjaGUgbWFpbnRlbmFuY2UuCi18PHA+Ci18VGhpcyBlbnVtIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGNsaWVudHMuCi0JICAgIAotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGV4cG9ydENvbnRyb2wgCSJQcm90ZWN0ZWQiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk5PVF9JTVBMSUNJVCIKLQkJICAgIHF1aWQgICAgICAgCSI0MUU1OUYyQTAwRUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiTWVhbnMgdGhpcyBkZWNvcmF0b3IgaXMgbm90IGltcGxpY2l0LiBUaGF0IGlzIGl0IHdhcyBjcmVhdGVkIGJ5IGN1c3RvbWVyLiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklNUExJQ0lUX0RFQ09SQVRPUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MUU1OUY3MjAwQjQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNvcmF0b3IgaXMgaW1wbGljaXQuIFRoYXQgaXMgaXQgd2FzIG5vdCBjcmVhdGVkIGJ5IHRoZSBjdXN0b21lci4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJJTVBMSUNJVF9ERUNPUkFUT1JfQU5EX0ZFQVRVUkUiCi0JCSAgICBxdWlkICAgICAgIAkiNDFFNTlGQTMwM0I3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgbWVhbnMgdGhlIGRlY29yYXRvciBhbmQgdGhlIGZlYXR1cmUgd2hlcmUgaW1wbGljaXQuIFRoYXQgaXMgdGhleSB3ZXJlIG5vdCBjcmVhdGVkIGJ5IHRoZSBjdXN0b21lci4iKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlDRjZDMDM3OCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUNGNkUwMEJFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkZlYXR1cmUgYXR0cmlidXRlcy4gS2V5L3ZhbHVlIHBhaXJzLiBJZiBpdCBpcyBkZXNpcmVkIHRoYXQgdGhlIGZlYXR1cmUgYXR0cmlidXRlcyBpcyBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mby9yZWZsZWN0aW9uIHNldCBpdCwgc2V0IGF0dHJpYnV0ZXNFeHBsaWNpdEVtcHR5IHRvIHRydWUuIgotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5IgotCQkgICAgcXVpZHUgICAgICAJIjQwNENDODU1MDFGNSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5Q0Y2RTAwQzgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5OUIzRTAxRTkiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQxMzUwMjQ4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJjdXN0b21pemVyQ2xhc3MiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEMTM2MDFEMiIKLQkJICAgIGxhYmVsICAgICAgCSJjdXN0b21pemVyQ2xhc3MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDEzNjAxRTYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6QmVhbkRlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDBERjAyRDEiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEMzA4MDEyOCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiYWRkTGlzdGVuZXJNZXRob2QiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQzMDkwMzQ2IgotCQkgICAgbGFiZWwgICAgICAJImFkZExpc3RlbmVyTWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQzMDkwMzVBIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkV2ZW50U2V0RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMUQyMDA0RiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2IgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQzRTEwMzY0IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJsaXN0ZW5lck1ldGhvZHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEM0U2MDA3RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfGxpc3RlbmVyIG1ldGhvZHMuIElmIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGUgbGlzdCBiZSBleHBsaWNpdGx5IGVtcHR5IGFuZCBub3QgaGF2ZSBCZWFuSW5mbyBzZXQgaXQsIHRoZW4gc2V0IGxpc3RlbmVyTWV0aG9kc0V4cGxpY2l0RW1wdHkgdG8gdHJ1ZS4KLXw8cD4KLXxMaXN0ZW5lck1ldGhvZHMgd2lsbCBiZSBkZWNvcmF0ZWQgd2l0aCBNZXRob2REZWNvcmF0b3JzLgotfDxwPgotfE5vdGU6IFRoaXMgaXMgYSBkZXJpdmVkIHNldHRpbmcsIHdoaWNoIG1lYW5zIGl0IHdpbGwgbm90IG5vdGlmeSBvdXQgY2hhbmdlcyB0byBpdC4gVG8gaGVyZSBjaGFuZ2VzIHRvIGl0LCBsaXN0ZW4gb24gInNlckxpc3RNdGhkIiBub3RpZmljYXRpb25zIGluc3RlYWQuCi0JCSAgICAKLQkJICAgIGxhYmVsICAgICAgCSJsaXN0ZW5lck1ldGhvZHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6TWV0aG9kUHJveHkiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E4OTg0QzkwMUMzIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDNFNjAwOTEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIikpCi0JICAgIGRlcml2ZWQgICAgCVRSVUUpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOCIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlENEE4MDE1OCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAibGlzdGVuZXJUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlENEFBMDM4QiIKLQkJICAgIGxhYmVsICAgICAgCSJsaXN0ZW5lclR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDRBQTAzQjQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwIgotCSAgICBxdWlkICAgICAgIAkiM0E3OUQ0REYwMjBCIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJyZW1vdmVMaXN0ZW5lck1ldGhvZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5RDRFMTAzOTUiCi0JCSAgICBsYWJlbCAgICAgIAkicmVtb3ZlTGlzdGVuZXJNZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OUQ0RTEwM0E5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkV2ZW50U2V0RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMUQyMDA0RiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMiIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEQTFBMDJGNyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFyYW1ldGVyRGVzY3JpcHRvcnMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQTFDMDIzMSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFRoaXMgaXMgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBsaXN0LgotfDxwPgotfE5vdGU6IFRoaXMgaXMgYSBkZXJpdmVkIHNldHRpbmcsIHdoaWNoIG1lYW5zIGl0IHdpbGwgbm90IG5vdGlmeSBvdXQgY2hhbmdlcyB0byBpdC4gVG8gaGVyZSBjaGFuZ2VzIHRvIGl0LCBsaXN0ZW4gb24gInNlclBhcm1EZXNjIiBub3RpZmljYXRpb25zIGluc3RlYWQuCi0JCSAgICAKLQkJICAgIGxhYmVsICAgICAgCSJwYXJhbWV0ZXJEZXNjcmlwdG9ycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQYXJhbWV0ZXJEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQ5QzIwMzA0IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURBMUMwMjMyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZERlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDM1RTAwMjciKSkKLQkgICAgZGVyaXZlZCAgICAJVFJVRSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCIKLQkgICAgcXVpZCAgICAgICAJIjNBNzlEQjBCMDMzOSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicHJvcGVydHlFZGl0b3JDbGFzcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REIwRTAxM0YiCi0JCSAgICBsYWJlbCAgICAgIAkicHJvcGVydHlFZGl0b3JDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REIwRTAxNzEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6UHJvcGVydHlEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURBNjgwMTBFIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2IgotCSAgICBxdWlkICAgICAgIAkiM0E3OURCQkQwMDAwIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJyZWFkTWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REJCRjAwNzEiCi0JCSAgICBsYWJlbCAgICAgIAkicmVhZE1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REJCRjAwODUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6UHJvcGVydHlEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURBNjgwMTBFIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4IgotCSAgICBxdWlkICAgICAgIAkiM0E3OURCREYwMkQwIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJ3cml0ZU1ldGhvZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURCRTEwMUY3IgotCQkgICAgbGFiZWwgICAgICAJIndyaXRlTWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5IgotCQkgICAgcXVpZCAgICAgICAJIjNBNzlEQkUxMDIwQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQcm9wZXJ0eURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REE2ODAxMEUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5REUzNDAzNkYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImluZGV4ZWRSZWFkTWV0aG9kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REUzNTAzQ0EiCi0JCSAgICBsYWJlbCAgICAgIAkiaW5kZXhlZFJlYWRNZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEiCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURFMzUwM0RFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REM0NTAzMDkiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIiCi0JICAgIHF1aWQgICAgICAgCSIzQTc5REU1NDAxODAiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImluZGV4ZWRXcml0ZU1ldGhvZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E3OURFNTUwM0QwIgotCQkgICAgbGFiZWwgICAgICAJImluZGV4ZWRXcml0ZU1ldGhvZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMyIKLQkJICAgIHF1aWQgICAgICAgCSIzQTc5REU1NTAzRTQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQzQ1MDMwOSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNCIKLQkgICAgcXVpZCAgICAgICAJIjNBODk4NjVCMDFENSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAibWV0aG9kIgotCQkgICAgcXVpZCAgICAgICAJIjNBODk4NjVDMDFBRSIKLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUiCi0JCSAgICBxdWlkICAgICAgIAkiM0E4OTg2NUMwMUNDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZFByb3h5IgotCQkgICAgcXVpZHUgICAgICAJIjNBODk4NEM5MDFDMyIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNiIKLQkgICAgcXVpZCAgICAgICAJIjNDOUE2RUREMDJDMiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFyYW1ldGVyIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNDOUE2RURFMDFGQiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgSmF2YVBhcmFtZXRlciB0aGF0IHRoaXMgUGFyYW1ldGVyRGVjb3JhdG9yIGlzIGRlY29yYXRpbmcuIENhbid0IHVzZSBlRGVjb3JhdGVzIGluIHRoaXMuIgotCQkgICAgbGFiZWwgICAgICAJInBhcmFtZXRlciIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3IgotCQkgICAgcXVpZCAgICAgICAJIjNDOUE2RURFMDIwNSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQYXJhbWV0ZXJEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQ5QzIwMzA0IikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4IgotCSAgICBxdWlkICAgICAgIAkiNDFGMDE2RTcwMDJFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzZXJQYXJtRGVzYyIKLQkJICAgIHF1aWQgICAgICAgCSI0MUYwMTZFODAyQTciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyBhIHByaXZhdGUgZmVhdHVyZS4gSXQgaXMgdXNlZCBpbnRlcm5hbGx5IG9ubHkuICIKLQkJICAgIGxhYmVsICAgICAgCSJzZXJQYXJtRGVzYyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpQYXJhbWV0ZXJEZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQ5QzIwMzA0IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQcml2YXRlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5IgotCQkgICAgcXVpZCAgICAgICAJIjQxRjAxNkU4MDJCMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpNZXRob2REZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQzNUUwMDI3IgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAiCi0JICAgIHF1aWQgICAgICAgCSI0MUYxMUU3MTAzODciCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImV2ZW50QWRhcHRlckNsYXNzIgotCQkgICAgcXVpZCAgICAgICAJIjQxRjExRTczMDI0OSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfEZvciBzb21lIGxpc3RlbmVyIGludGVyZmFjZXMgYW4gYWRhcHRlciBjbGFzcyBpcyBwcm92aWRlZCB0aGF0IGltcGxlbWVudHMgZGVmYXVsdCBuby1vcCBtZXRob2RzLCBlLmcuIGphdmEuYXd0LmV2ZW50LkZvY3VzRXZlbnQgd2hpY2ggaGFzIGphdmEuYXd0LmV2ZW50LkZvY3VzQWRhcHRlci4gVGhlIEFkYXB0ZXIgY2xhc3MgaXMgcHJvdmlkZWQgaW4gYSBrZXkvdmFsdWUgcGFpciBvbiB0aGUgamF2YS5iZWFucy5FdmVudFNldERlc2NyaXB0b3Igd2l0aCBhIGtleSBkZWZpbmVkIGluIGEgc3RhdGljIGZpbmFsIGNvbnN0YW50cyBFVkVOVEFEQVBURVJDTEFTUyA9ICJldmVudEFkYXB0ZXJDbGFzcyIuCi0JCSAgICAKLQkJICAgIGxhYmVsICAgICAgCSJldmVudEFkYXB0ZXJDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMSIKLQkJICAgIHF1aWQgICAgICAgCSI0MUYxMUU3MzAyNUQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxRDIwMDRGIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMyIgotCSAgICBxdWlkICAgICAgIAkiNDFGMTI3OEEwMUE1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzZXJMaXN0TXRoZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MUYxMjc4QjAyMUYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyBhIHByaXZhdGUgZmVhdHVyZS4gSXQgaXMgdXNlZCBpbnRlcm5hbGx5IG9ubHkuICIKLQkJICAgIGxhYmVsICAgICAgCSJzZXJMaXN0TXRoZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpNZXRob2RQcm94eSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODRDOTAxQzMiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlByaXZhdGUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzMiCi0JCSAgICBxdWlkICAgICAgIAkiNDFGMTI3OEIwMjI5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkV2ZW50U2V0RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMUQyMDA0RiIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM0IgotCSAgICBxdWlkICAgICAgIAkiNDIwN0Q4M0YwMURBIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJmaWVsZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpCi0JCSAgICBxdWlkICAgICAgIAkiNDIwN0Q4NDAwMjkwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklmIHRoaXMgaXMgc2V0LCB0aGVuIHRoaXMgcHJvcGVydHkgaXMgYSBmaWVsZCBhbmQgbm90IGEgZ2V0dGVyL3NldHRlciBwcm9wZXJ0eS4gVGhpcyBpcyBhbiBleHRlbnNpb24gdGhhdCB0aGUgVmlzdWFsIEVkaXRvciB1c2VzIHRvIHRoZSBCZWFuSW5mbyBtb2RlbC4iCi0JCSAgICBsYWJlbCAgICAgIAkiZmllbGQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzUiCi0JCSAgICBxdWlkICAgICAgIAkiNDIwN0Q4NDAwMjkyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlByb3BlcnR5RGVjb3JhdG9yIgotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTY4MDEwRSIpKSkpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JICAgIHF1aWQgICAgICAgCSIzQTc5OUFDODAzOEUiCi0JICAgIHRpdGxlICAgICAgCSJNYWluIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAk5NAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IE5vdGVWaWV3IEAxCi0JCSAgICBsb2NhdGlvbiAgIAkoMzIzMiwgMTcxMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDI5NTAsIDE2MjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNTI4Ci0JCQlsYWJlbCAgICAgIAkiTGlzdGVuZXJNZXRob2RzIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggTWV0aG9kRGVjb3JhdG9ycy4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTU4OAotCQkgICAgaGVpZ2h0ICAgICAJMTg4KQotCQkob2JqZWN0IE5vdGVWaWV3IEAyCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM5MiwgMjc4NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDMwNzYsIDI1NjgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJOAotCQkJbWF4X3dpZHRoICAJNTk2Ci0JCQlsYWJlbCAgICAgIAkKLXxNZXRob2RQcm94aWVzIHdpbGwgYmUgaW4gdGhlIGVCZWhhdmlvcnMgc2V0dGluZyBmb3IgYW55IG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIEphdmFDbGFzcyBtZXRob2RzIHNldHRpbmcgc28gdGhhdCB0aGV5IGFyZSBub3QgZHVwbGljYXRlZC4KLXwKLXxNZXRob2RQcm94aWVzIHdvdWxkIGFsc28gaGF2ZSBNZXRob2REZWNvcmF0b3JzLgotCQkJKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTY1NgotCQkgICAgaGVpZ2h0ICAgICAJNDQ0KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIgQDMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0OCwgMjY4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQlsb2NhdGlvbiAgIAkoMTExNCwgMjYxNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhRXZlbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQUYxMDNDOCIKLQkJICAgIHdpZHRoICAgICAgCTI4NgotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpCZWFuRXZlbnQiIEA0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDI5OTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQKLQkJCWxvY2F0aW9uICAgCSgxMDk2LCAyOTQxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJlYW5FdmVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0NCMDlDQTkwMjEyIgotCQkgICAgd2lkdGggICAgICAJMjkwCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0IwOUNCNjAzOEQiCi0JCSAgICBjbGllbnQgICAgIAlANAotCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgTm90ZVZpZXcgQDYKLQkJICAgIGxvY2F0aW9uICAgCSgxODU2LCAyOTQ0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2Ci0JCQlsb2NhdGlvbiAgIAkoMTU2MSwgMjgxNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk1Ci0JCQltYXhfd2lkdGggIAk1NTUKLQkJCWxhYmVsICAgICAgCSJUaGUgQmVhbkV2ZW50IHdpbGwgYmUgdW5kZXIgdGhlIEphdmFDbGFzcycgZXZlbnRzIGFuZCBhbGxFdmVudHMgZmVhdHVyZS4gRWFjaCBCZWFuRXZlbnQgd2lsbCBiZSBkZWNvcmF0ZWQgYnkgYW4gRXZlbnRTZXREZWNvcmF0b3IuIikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICB3aWR0aCAgICAgIAk2MTUKLQkJICAgIGhlaWdodCAgICAgCTI3MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUFubm90YXRpb24iIEA3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNTYsIDEyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDkwNiwgNTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRUFubm90YXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkgICAgcXVpZHUgICAgICAJIjNEOThBMUM3MDFBQiIKLQkJICAgIHdpZHRoICAgICAgCTMxOAotCQkgICAgaGVpZ2h0ICAgICAJMTcyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT3BlcmF0aW9uIiBAOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyODQ4LCAyMjcyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4Ci0JCQlsb2NhdGlvbiAgIAkoMjcwMiwgMjE5OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzY5NjAKLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0REFBMjAwQTAiCi0JCSAgICB3aWR0aCAgICAgIAkzMTAKLQkJICAgIGhlaWdodCAgICAgCTE3MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZUF0dHJpYnV0ZU1hcEVudHJ5IiBAOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMjI0LCAxNzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDkKLQkJCWxvY2F0aW9uICAgCSgxODg3LCA5MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2NzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGZWF0dXJlQXR0cmlidXRlTWFwRW50cnkiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOQotCQkJbG9jYXRpb24gICAJKDE4ODcsIDQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2NzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PE1hcEVudHJ5Pj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwNENDODU1MDFGNSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDkKLQkJCWxvY2F0aW9uICAgCSgxODg3LCAxNTMpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJNTgxKQotCQkgICAgd2lkdGggICAgICAJNjkyCi0JCSAgICBoZWlnaHQgICAgIAkyOTIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkZlYXR1cmVEZWNvcmF0b3IiIEAxMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDcyLCA2NTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwCi0JCQlsb2NhdGlvbiAgIAkoNjY1LCAzMjUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODE0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmVhdHVyZURlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OTlCM0UwMUU5IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCWxvY2F0aW9uICAgCSg2NjUsIDM4NikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkxMgotCQkJbWF4X3dpZHRoICAJNzAwKQotCQkgICAgd2lkdGggICAgICAJODMyCi0JCSAgICBoZWlnaHQgICAgIAk2ODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMQotCQkgICAgbG9jYXRpb24gICAJKDEwNzIsIDExMDUpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMDcyLCAxMTA1KQotCQkJKDEwNzIsIDk5OSkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNERkExODU5MDBEQyIKLQkJICAgIGNsaWVudCAgICAgCUAxMAotCQkgICAgc3VwcGxpZXIgICAJQDcKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTMKLQkJICAgIGxvY2F0aW9uICAgCSgxNjgyLCA0MDEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5Q0Y2QzAzNzgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZXMiIEAxNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjI2LCAtNjMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQotCQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTc0NywgMzA5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMDcKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVzIgotCQkJCXBjdERpc3QgICAgCTAuNDU3MDEyCi0JCQkJaGVpZ2h0ICAgICAJNjIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5Q0Y2RTAwQkUiCi0JCQkgICAgY2xpZW50ICAgICAJQDEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYKLQkJCQlQYXJlbnRfVmlldyAJQDE0Ci0JCQkJbG9jYXRpb24gICAJKDE4MTIsIDM5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC41ODQ2NTMKLQkJCQloZWlnaHQgICAgIAk0NQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAxNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjI2LCAtNjMpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUNGNkUwMEM4IgotCQkJICAgIGNsaWVudCAgICAgCUAxMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMAotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RmVhdHVyZUF0dHJpYnV0ZVZhbHVlIiBAMTgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzQ1NiwgMTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxOAotCQkJbG9jYXRpb24gICAJKDI2ODMsIDExNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxNTQ2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmVhdHVyZUF0dHJpYnV0ZVZhbHVlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQlsb2NhdGlvbiAgIAkoMjY4MywgNjcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE1NDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQxRTU4MkY4MDBCQiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQlsb2NhdGlvbiAgIAkoMjY4MywgMTc4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTE0OTMpCi0JCSAgICB3aWR0aCAgICAgIAkxNTY0Ci0JCSAgICBoZWlnaHQgICAgIAkyNDIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OkltcGxpY2l0SXRlbSIgQDE5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyODgsIDY1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCWxvY2F0aW9uICAgCSgxODE1LCA1NDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJOTQ2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW1wbGljaXRJdGVtIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE5Ci0JCQlsb2NhdGlvbiAgIAkoMTgxNSwgNDk3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk5NDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYxNTkzNQotCQkgICAgcXVpZHUgICAgICAJIjQxRTU5RTVEMDI5NiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE5Ci0JCQlsb2NhdGlvbiAgIAkoMTgxNSwgNjA4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTgxMikKLQkJICAgIHdpZHRoICAgICAgCTk2NAotCQkgICAgaGVpZ2h0ICAgICAJMzQyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXIiIEAyMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0MzA0LCAxNzkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMAotCQkJbG9jYXRpb24gICAJKDQxMjUsIDE3MTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzU4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhcmFtZXRlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIgotCQkgICAgd2lkdGggICAgICAJMzc2Ci0JCSAgICBoZWlnaHQgICAgIAkxNzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86OlBhcmFtZXRlckRlY29yYXRvciIgQDIxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ4NjQsIDEzNjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIxCi0JCQlsb2NhdGlvbiAgIAkoNDYzMSwgMTI3OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQYXJhbWV0ZXJEZWNvcmF0b3IiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEOUMyMDMwNCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDIxCi0JCQlsb2NhdGlvbiAgIAkoNDYzMSwgMTM0MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkyOTQpCi0JCSAgICB3aWR0aCAgICAgIAk0ODQKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2IiBAMjIKLQkJICAgIGxvY2F0aW9uICAgCSg0NTc4LCAxNTc5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M5QTZFREQwMkMyIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJhbWV0ZXIiIEAyMwotCQkJICAgIFBhcmVudF9WaWV3IAlAMjIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2NiwgLTIxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQKLQkJCQlQYXJlbnRfVmlldyAJQDIzCi0JCQkJbG9jYXRpb24gICAJKDQ1NDAsIDE2NTkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcmFtZXRlciIKLQkJCQlwY3REaXN0ICAgIAkwLjM4NjU5OAotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M5QTZFREUwMUZCIgotCQkJICAgIGNsaWVudCAgICAgCUAyMgotCQkJICAgIHN1cHBsaWVyICAgCUAyMAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNQotCQkJCVBhcmVudF9WaWV3IAlAMjMKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4MCwgMTU4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC40MTIzNzEKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3IiBAMjYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIyCi0JCQkgICAgbG9jYXRpb24gICAJKDE2NjYsIC0yMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzlBNkVERTAyMDUiCi0JCQkgICAgY2xpZW50ICAgICAJQDIyCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlERUJCMDFDNCIKLQkJICAgIGNsaWVudCAgICAgCUAyMQotCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ2NTgsIDEyNjcpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDY1OCwgMTEwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDExKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpNZXRob2REZWNvcmF0b3IiIEAyOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzNzEyLCAxMzYwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyOAotCQkJbG9jYXRpb24gICAJKDMzNjIsIDEyNzkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNzAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kRGVjb3JhdG9yIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDM1RTAwMjciCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAyOAotCQkJbG9jYXRpb24gICAJKDMzNjIsIDEzNDApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTk0KQotCQkgICAgd2lkdGggICAgICAJNzE4Ci0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFQTYwM0UxIgotCQkgICAgY2xpZW50ICAgICAJQDI4Ci0JCSAgICBzdXBwbGllciAgIAlAMTAKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzY5NCwgMTI2NykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjk0LCAxMTA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTEpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDMwCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMxNCwgMTQ5MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQTFBMDJGNyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicGFyYW1ldGVyRGVzY3JpcHRvcnMiIEAzMQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjg0MiwgNTk0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIKLQkJCQlQYXJlbnRfVmlldyAJQDMxCi0JCQkJbG9jYXRpb24gICAJKDQzODksIDE0MjcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQyNwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcmFtZXRlckRlc2NyaXB0b3JzIgotCQkJCXBjdERpc3QgICAgCTAuMzA4MjYyCi0JCQkJaGVpZ2h0ICAgICAJNjkKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REExQzAyMzEiCi0JCQkgICAgY2xpZW50ICAgICAJQDMwCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDQzMTQsIDE0OTApCi0JCQkJKDQzNzMsIDE1MDMpCi0JCQkJKDQ2MjEsIDE0MjkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMwotCQkJCVBhcmVudF9WaWV3IAlAMzEKLQkJCQlsb2NhdGlvbiAgIAkoNDU1NSwgMTQ5MSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC43NDU5NzcKLQkJCQloZWlnaHQgICAgIAk0MQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzIiBAMzQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwCi0JCQkgICAgbG9jYXRpb24gICAJKDI4NDIsIDU5NCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REExQzAyMzIiCi0JCQkgICAgY2xpZW50ICAgICAJQDMwCi0JCQkgICAgc3VwcGxpZXIgICAJQDI4Ci0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgiIEAzNQotCQkgICAgbG9jYXRpb24gICAJKDQzODUsIDEyNzMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MUYwMTZFNzAwMkUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInNlclBhcm1EZXNjIiBAMzYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ci0JCQkgICAgbG9jYXRpb24gICAJKDEyNjUsIC03MSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNgotCQkJCWxvY2F0aW9uICAgCSg0NTM0LCAxMjUyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyODUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIi1zZXJQYXJtRGVzYyIKLQkJCQlwY3REaXN0ICAgIAkwLjU5NTg5MwotCQkJCWhlaWdodCAgICAgCTQ4Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDFGMDE2RTgwMkE3IgotCQkJICAgIGNsaWVudCAgICAgCUAzNQotCQkJICAgIHN1cHBsaWVyICAgCUAyMQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOAotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoNDU5MCwgMTM2NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDQzODYKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5IiBAMzkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ci0JCQkgICAgbG9jYXRpb24gICAJKDEyNjUsIC03MSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUYwMTZFODAyQjEiCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI4Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDQzODUsIDEyNzMpCi0JCQkJKDQzMjYsIDEyNjMpCi0JCQkJKDQwNzEsIDEzMDIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiIEA0MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU5MiwgMzI2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDAKLQkJCWxvY2F0aW9uICAgCSgyNDkyLCAzMTkwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgd2lkdGggICAgICAJMjE4Ci0JCSAgICBoZWlnaHQgICAgIAkxNzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6YmVhbmluZm86Ok1ldGhvZFByb3h5IiBANDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2MCwgMjc2OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDEKLQkJCWxvY2F0aW9uICAgCSgyMzk4LCAyNzE3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZFByb3h5IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODRDOTAxQzMiCi0JCSAgICB3aWR0aCAgICAgIAkzNDIKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEA0MgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDIKLQkJICAgIHN1cHBsaWVyICAgCUA0MQotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0IiBANDMKLQkJICAgIGxvY2F0aW9uICAgCSgyNTc1LCAzMDA0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E4OTg2NUIwMUQ1IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2QiIEA0NAotCQkJICAgIFBhcmVudF9WaWV3IAlANDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcxLCAxMDg0KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUKLQkJCQlQYXJlbnRfVmlldyAJQDQ0Ci0JCQkJbG9jYXRpb24gICAJKDI1MzksIDMwNzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK21ldGhvZCIKLQkJCQlwY3REaXN0ICAgIAkwLjM3NjA2OAotCQkJCWhlaWdodCAgICAgCTQxCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E4OTg2NUMwMUFFIgotCQkJICAgIGNsaWVudCAgICAgCUA0MwotCQkJICAgIHN1cHBsaWVyICAgCUA0MAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NgotCQkJCVBhcmVudF9WaWV3IAlANDQKLQkJCQlsb2NhdGlvbiAgIAkoMjYzOSwgMzE1OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1IiBANDcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQzCi0JCQkgICAgbG9jYXRpb24gICAJKDI3MSwgMTA4NCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTg5ODY1QzAxQ0MiCi0JCQkgICAgY2xpZW50ICAgICAJQDQzCi0JCQkgICAgc3VwcGxpZXIgICAJQDQxCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0OAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNERkExOUI2MDBERSIKLQkJICAgIGNsaWVudCAgICAgCUA0MQotCQkgICAgc3VwcGxpZXIgICAJQDgKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANDkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUA2Ci0JCSAgICBzdXBwbGllciAgIAlANAotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6SW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIiBANTAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNzUyLCAyMjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1MAotCQkJbG9jYXRpb24gICAJKDQ2MCwgMjIzNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1ODQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEQzQ1MDMwOSIKLQkJICAgIHdpZHRoICAgICAgCTYwMgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmJlYW5pbmZvOjpCZWFuRGVjb3JhdG9yIiBANTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTEyLCAxNDU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1MQotCQkJbG9jYXRpb24gICAJKDcsIDExNTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTAxMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJlYW5EZWNvcmF0b3IiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMERGMDJEMSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDUxCi0JCQlsb2NhdGlvbiAgIAkoNywgMTIxMSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkxMQotCQkJbWF4X3dpZHRoICAJODY4KQotCQkgICAgd2lkdGggICAgICAJMTAyOAotCQkgICAgaGVpZ2h0ICAgICAJNjM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1MgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlERThFMDA3RiIKLQkJICAgIGNsaWVudCAgICAgCUA1MQotCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM4MSwgMTEzNykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODEsIDExMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6RXZlbnRTZXREZWNvcmF0b3IiIEA1MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyODQ4LCAxNDI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1MwotCQkJbG9jYXRpb24gICAJKDIzOTUsIDEyNjgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJOTA2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRXZlbnRTZXREZWNvcmF0b3IiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMUQyMDA0RiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDUzCi0JCQlsb2NhdGlvbiAgIAkoMjM5NSwgMTMyOSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk0Ci0JCQltYXhfd2lkdGggIAk3NzgpCi0JCSAgICB3aWR0aCAgICAgIAk5MjQKLQkJICAgIGhlaWdodCAgICAgCTMzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REVBMjAwRUMiCi0JCSAgICBjbGllbnQgICAgIAlANTMKLQkJICAgIHN1cHBsaWVyICAgCUAxMAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyODMxLCAxMjU1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI4MzEsIDExMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA1NQotCQkgICAgbG9jYXRpb24gICAJKDI2OTIsIDIxNDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDNFMTAzNjQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImxpc3RlbmVyTWV0aG9kcyIgQDU2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NQotCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMjUyKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcKLQkJCQlQYXJlbnRfVmlldyAJQDU2Ci0JCQkJbG9jYXRpb24gICAJKDI1ODAsIDI1ODUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMyNAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2xpc3RlbmVyTWV0aG9kcyIKLQkJCQlwY3REaXN0ICAgIAkwLjc5MDUwMwotCQkJCWhlaWdodCAgICAgCTE5Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUQzRTYwMDdEIgotCQkJICAgIGNsaWVudCAgICAgCUA1NQotCQkJICAgIHN1cHBsaWVyICAgCUA0MQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OAotCQkJCVBhcmVudF9WaWV3IAlANTYKLQkJCQlsb2NhdGlvbiAgIAkoMjU5OCwgMjUyMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC42NzY5NjEKLQkJCQloZWlnaHQgICAgIAkxNAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEA1OQotCQkJICAgIFBhcmVudF9WaWV3IAlANTUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTI1MikKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDNFNjAwOTEiCi0JCQkgICAgY2xpZW50ICAgICAJQDU1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDYwCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlAMQotCQkgICAgc3VwcGxpZXIgICAJQDU1Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzIiIEA2MQotCQkgICAgbG9jYXRpb24gICAJKDI1MjUsIDIyMjEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MUYxMjc4QTAxQTUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInNlckxpc3RNdGhkIiBANjIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYxCi0JCQkgICAgbG9jYXRpb24gICAJKDI2OSwgODEzKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjMKLQkJCQlQYXJlbnRfVmlldyAJQDYyCi0JCQkJbG9jYXRpb24gICAJKDIyOTYsIDI2ODgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIyOQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiLXNlckxpc3RNdGhkIgotCQkJCXBjdERpc3QgICAgCTAuNzY1MDEyCi0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUYxMjc4QjAyMUYiCi0JCQkgICAgY2xpZW50ICAgICAJQDYxCi0JCQkgICAgc3VwcGxpZXIgICAJQDQxCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDI1MjUsIDIyMjEpCi0JCQkJKDIzMDMsIDI3NzEpCi0JCQkJKDIzODgsIDI3NjkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NAotCQkJCVBhcmVudF9WaWV3IAlANjIKLQkJCQlsb2NhdGlvbiAgIAkoMjIzOSwgMjU4NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC42NTc2OTIKLQkJCQloZWlnaHQgICAgIAkxMjkKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMyIgQDY1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MQotCQkJICAgIGxvY2F0aW9uICAgCSgyNjksIDgxMykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUYxMjc4QjAyMjkiCi0JCQkgICAgY2xpZW50ICAgICAJQDYxCi0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDY2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlANgotCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxODc4LCAyODA4KQotCQkJKDIwMTYsIDIwMjEpCi0JCQkoMjYxMiwgMTU5MikpCi0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDY3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNjY0LCAyMDk2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2NwotCQkJbG9jYXRpb24gICAJKDE1NjQsIDIwMjIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzY5NjAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiCi0JCSAgICB3aWR0aCAgICAgIAkyMTgKLQkJICAgIGhlaWdodCAgICAgCTE3MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwIiBANjgKLQkJICAgIGxvY2F0aW9uICAgCSgxMzE1LCAyMjg5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFMzQwMzZGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbmRleGVkUmVhZE1ldGhvZCIgQDY5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDQwMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwCi0JCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCWxvY2F0aW9uICAgCSgxNDIxLCAyMjc1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0MDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbmRleGVkUmVhZE1ldGhvZCIKLQkJCQlwY3REaXN0ICAgIAkwLjM4NTI0OAotCQkJCWhlaWdodCAgICAgCTE0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OURFMzUwM0NBIgotCQkJICAgIGNsaWVudCAgICAgCUA2OAotCQkJICAgIHN1cHBsaWVyICAgCUA2NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMzE1LCAyMjg5KQotCQkJCSgxMzc1LCAyMjg5KQotCQkJCSgxNTU0LCAyMTY4KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEKLQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJbG9jYXRpb24gICAJKDEyNDksIDIyMzgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCS0wLjI0MDc3NQotCQkJCWhlaWdodCAgICAgCTUyCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEiIEA3MgotCQkJICAgIFBhcmVudF9WaWV3IAlANjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTYzLCA0MDEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OURFMzUwM0RFIgotCQkJICAgIGNsaWVudCAgICAgCUA2OAotCQkJICAgIHN1cHBsaWVyICAgCUA1MAotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyIiBANzMKLQkJICAgIGxvY2F0aW9uICAgCSgxNDQyLCAyMzYxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFNTQwMTgwIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbmRleGVkV3JpdGVNZXRob2QiIEA3NAotCQkJICAgIFBhcmVudF9WaWV3IAlANzMKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA0NzMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NQotCQkJCVBhcmVudF9WaWV3IAlANzQKLQkJCQlsb2NhdGlvbiAgIAkoMTU5NywgMjM3NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDA5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW5kZXhlZFdyaXRlTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuNTAxMTc3Ci0JCQkJaGVpZ2h0ICAgICAJMzcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REU1NTAzRDAiCi0JCQkgICAgY2xpZW50ICAgICAJQDczCi0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE0NDIsIDIzNjEpCi0JCQkJKDE2MzIsIDIzODIpCi0JCQkJKDE2NTQsIDIxODIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NgotCQkJCVBhcmVudF9WaWV3IAlANzQKLQkJCQlsb2NhdGlvbiAgIAkoMTYzOSwgMjMwNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42ODE5NzIKLQkJCQloZWlnaHQgICAgIAkyCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMiIEA3NwotCQkJICAgIFBhcmVudF9WaWV3IAlANzMKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA0NzMpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OURFNTUwM0U0IgotCQkJICAgIGNsaWVudCAgICAgCUA3MwotCQkJICAgIHN1cHBsaWVyICAgCUA1MAotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEA3OAotCQkgICAgbG9jYXRpb24gICAJKDE4OTgsIDE2OTEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDMwODAxMjgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImFkZExpc3RlbmVyTWV0aG9kIiBANzkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Ci0JCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDc5NSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwCi0JCQkJUGFyZW50X1ZpZXcgCUA3OQotCQkJCWxvY2F0aW9uICAgCSgxNTYxLCAxODI0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzODUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIithZGRMaXN0ZW5lck1ldGhvZCIKLQkJCQlwY3REaXN0ICAgIAkwLjYyNzM4NgotCQkJCWhlaWdodCAgICAgCTkwCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUQzMDkwMzQ2IgotCQkJICAgIGNsaWVudCAgICAgCUA3OAotCQkJICAgIHN1cHBsaWVyICAgCUA2NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxODk4LCAxNjkxKQotCQkJCSgxNjQ3LCAxNzYzKQotCQkJCSgxNjU4LCAyMDA5KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEKLQkJCQlQYXJlbnRfVmlldyAJQDc5Ci0JCQkJbG9jYXRpb24gICAJKDE2OTksIDE4NTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNjk0MDY4Ci0JCQkJaGVpZ2h0ICAgICAJNDgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAODIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Ci0JCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDc5NSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDMwOTAzNUEiCi0JCQkgICAgY2xpZW50ICAgICAJQDc4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEA4MwotCQkgICAgbG9jYXRpb24gICAJKDIxNjIsIDE4MTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDRERjAyMEIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInJlbW92ZUxpc3RlbmVyTWV0aG9kIiBAODQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDgzCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOTgsIDkxNikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1Ci0JCQkJUGFyZW50X1ZpZXcgCUA4NAotCQkJCWxvY2F0aW9uICAgCSgyMTE1LCAxODQ2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NDgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIityZW1vdmVMaXN0ZW5lck1ldGhvZCIKLQkJCQlwY3REaXN0ICAgIAkwLjEyOTA1OAotCQkJCWhlaWdodCAgICAgCTYKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDRFMTAzOTUiCi0JCQkgICAgY2xpZW50ICAgICAJQDgzCi0JCQkgICAgc3VwcGxpZXIgICAJQDY3Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2Ci0JCQkJUGFyZW50X1ZpZXcgCUA4NAotCQkJCWxvY2F0aW9uICAgCSgxODM5LCAyMDU4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEiIEA4NwotCQkJICAgIFBhcmVudF9WaWV3IAlAODMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgOTE2KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlENEUxMDNBOSIKLQkJCSAgICBjbGllbnQgICAgIAlAODMKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAODgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI0MCwgMjE5MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODgKLQkJCWxvY2F0aW9uICAgCSgxMDYsIDIxMTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjY4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzY5NjAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICB3aWR0aCAgICAgIAkyODYKLQkJICAgIGhlaWdodCAgICAgCTE3MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA4OQotCQkgICAgbG9jYXRpb24gICAJKDMzMiwgMTkzOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMTM1MDI0OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiY3VzdG9taXplckNsYXNzIiBAOTAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDg5Ci0JCQkgICAgbG9jYXRpb24gICAJKDkyLCAxMDQzKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTEKLQkJCQlQYXJlbnRfVmlldyAJQDkwCi0JCQkJbG9jYXRpb24gICAJKDI5OCwgMjA0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzI4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrY3VzdG9taXplckNsYXNzIgotCQkJCXBjdERpc3QgICAgCTAuNjMxNjc0Ci0JCQkJaGVpZ2h0ICAgICAJNAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBNzlEMTM2MDFEMiIKLQkJCSAgICBjbGllbnQgICAgIAlAODkKLQkJCSAgICBzdXBwbGllciAgIAlAODgKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIKLQkJCQlQYXJlbnRfVmlldyAJQDkwCi0JCQkJbG9jYXRpb24gICAJKDMyNiwgMTk4OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC4yODQxODgKLQkJCQloZWlnaHQgICAgIAkxMgotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEA5MwotCQkJICAgIFBhcmVudF9WaWV3IAlAODkKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTIsIDEwNDMpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUQxMzYwMUU2IgotCQkJICAgIGNsaWVudCAgICAgCUA4OQotCQkJICAgIHN1cHBsaWVyICAgCUA1MQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEA5NAotCQkgICAgbG9jYXRpb24gICAJKDEzODQsIDE4NTQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDRBODAxNTgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImxpc3RlbmVyVHlwZSIgQDk1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NAotCQkJICAgIGxvY2F0aW9uICAgCSg1MjAsIDk1OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NQotCQkJCWxvY2F0aW9uICAgCSg3ODIsIDIwNjYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI1OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2xpc3RlbmVyVHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjYxMDY3NwotCQkJCWhlaWdodCAgICAgCTMzCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OUQ0QUEwMzhCIgotCQkJICAgIGNsaWVudCAgICAgCUA5NAotCQkJICAgIHN1cHBsaWVyICAgCUA4OAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NwotCQkJCVBhcmVudF9WaWV3IAlAOTUKLQkJCQlsb2NhdGlvbiAgIAkoOTc3LCAyMDYxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjQyOTU5MAotCQkJCWhlaWdodCAgICAgCTgzCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOSIgQDk4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NAotCQkJICAgIGxvY2F0aW9uICAgCSg1MjAsIDk1OCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5RDRBQTAzQjQiCi0JCQkgICAgY2xpZW50ICAgICAJQDk0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAiIEA5OQotCQkgICAgbG9jYXRpb24gICAJKDEzOTIsIDE5MTMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MUYxMUU3MTAzODciCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImV2ZW50QWRhcHRlckNsYXNzIiBAMTAwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5OQotCQkJICAgIGxvY2F0aW9uICAgCSgtODY0LCA1MDUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDEKLQkJCQlQYXJlbnRfVmlldyAJQDEwMAotCQkJCWxvY2F0aW9uICAgCSg3NzEsIDIxMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTM2NwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2V2ZW50QWRhcHRlckNsYXNzIgotCQkJCXBjdERpc3QgICAgCTAuNjI5NzAyCi0JCQkJaGVpZ2h0ICAgICAJMTAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUYxMUU3MzAyNDkiCi0JCQkgICAgY2xpZW50ICAgICAJQDk5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDg4Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEzOTIsIDE5MTMpCi0JCQkJKDc2NiwgMjEyNCkKLQkJCQkoMzgzLCAyMTcyKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDAKLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAyMTk3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg5ODI1NwotCQkJCWhlaWdodCAgICAgCTM4Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEiIEAxMDMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ci0JCQkgICAgbG9jYXRpb24gICAJKC04NjQsIDUwNSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUYxMUU3MzAyNUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDk5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIiBAMTA0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgMjY3MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA0Ci0JCQlsb2NhdGlvbiAgIAkoNzIwLCAyNTk3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkZpZWxkIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICB3aWR0aCAgICAgIAkyMTAKLQkJICAgIGhlaWdodCAgICAgCTE3NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbzo6UHJvcGVydHlEZWNvcmF0b3IiIEAxMDUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMTQ1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA1Ci0JCQlsb2NhdGlvbiAgIAkoMTMxNiwgMTIwMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk5ODQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQcm9wZXJ0eURlY29yYXRvciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURBNjgwMTBFIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTA1Ci0JCQlsb2NhdGlvbiAgIAkoMTMxNiwgMTI2MSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk5Ci0JCQltYXhfd2lkdGggIAk4MzgpCi0JCSAgICB3aWR0aCAgICAgIAkxMDAyCi0JCSAgICBoZWlnaHQgICAgIAk1MzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwNgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBNzlERTg0MDM4OCIKLQkJICAgIGNsaWVudCAgICAgCUA1MAotCQkgICAgc3VwcGxpZXIgICAJQDEwNQotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURFOTcwMkJEIgotCQkgICAgY2xpZW50ICAgICAJQDEwNQotCQkgICAgc3VwcGxpZXIgICAJQDEwCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDExODgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3MiwgMTEwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDExKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYiIEAxMDgKLQkJICAgIGxvY2F0aW9uICAgCSgxMDAzLCAxOTY4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURCQkQwMDAwIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWFkTWV0aG9kIiBAMTA5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjM1LCAxMDcyKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDkKLQkJCQlsb2NhdGlvbiAgIAkoMTMwOCwgMjAzMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjU0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcmVhZE1ldGhvZCIKLQkJCQlwY3REaXN0ICAgIAkwLjU1MzcxNAotCQkJCWhlaWdodCAgICAgCTcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJCRjAwNzEiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOAotCQkJICAgIHN1cHBsaWVyICAgCUA2NwotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEKLQkJCQlQYXJlbnRfVmlldyAJQDEwOQotCQkJCWxvY2F0aW9uICAgCSgxNDcxLCAyMTMxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg3MzM2NQotCQkJCWhlaWdodCAgICAgCTcyCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEAxMTIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOAotCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDEwNzIpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OURCQkYwMDg1IgotCQkJICAgIGNsaWVudCAgICAgCUAxMDgKLQkJCSAgICBzdXBwbGllciAgIAlAMTA1Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwMDMsIDE5NjgpCi0JCQkJKDkwOSwgMTk1MCkKLQkJCQkoMTMxNiwgMTcyNCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEAxMTMKLQkJICAgIGxvY2F0aW9uICAgCSgxMDM1LCAyMTA2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E3OURCREYwMkQwIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3cml0ZU1ldGhvZCIgQDExNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIxMCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQotCQkJCVBhcmVudF9WaWV3IAlAMTE0Ci0JCQkJbG9jYXRpb24gICAJKDEzMjUsIDIwOTApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI1NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3dyaXRlTWV0aG9kIgotCQkJCXBjdERpc3QgICAgCTAuNTYwOTMwCi0JCQkJaGVpZ2h0ICAgICAJMTIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REJFMTAxRjciCi0JCQkgICAgY2xpZW50ICAgICAJQDExMwotCQkJICAgIHN1cHBsaWVyICAgCUA2NwotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYKLQkJCQlQYXJlbnRfVmlldyAJQDExNAotCQkJCWxvY2F0aW9uICAgCSgxNTAzLCAyMDU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMTYzMgotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEAxMTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDEyMTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OURCRTEwMjBCIgotCQkJICAgIGNsaWVudCAgICAgCUAxMTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTA1Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwMzUsIDIxMDYpCi0JCQkJKDk3NSwgMjEwNykKLQkJCQkoMTQ2MiwgMTcyNCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQiIEAxMTgKLQkJICAgIGxvY2F0aW9uICAgCSg4NDQsIDE5MDcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REIwQjAzMzkiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInByb3BlcnR5RWRpdG9yQ2xhc3MiIEAxMTkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExOAotCQkJICAgIGxvY2F0aW9uICAgCSg3NiwgMTAxMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMAotCQkJCVBhcmVudF9WaWV3IAlAMTE5Ci0JCQkJbG9jYXRpb24gICAJKDc3OCwgMTk2NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzkyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcHJvcGVydHlFZGl0b3JDbGFzcyIKLQkJCQlwY3REaXN0ICAgIAkwLjE2NjQzMAotCQkJCWhlaWdodCAgICAgCTI2Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0E3OURCMEUwMTNGIgotCQkJICAgIGNsaWVudCAgICAgCUAxMTgKLQkJCSAgICBzdXBwbGllciAgIAlAODgKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTkKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMywgMTkxNSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJLTAuNDkwMTgyCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUiIEAxMjIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExOAotCQkJICAgIGxvY2F0aW9uICAgCSg3NiwgMTAxMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTc5REIwRTAxNzEiCi0JCQkgICAgY2xpZW50ICAgICAJQDExOAotCQkJICAgIHN1cHBsaWVyICAgCUAxMDUKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNCIgQDEyMwotCQkgICAgbG9jYXRpb24gICAJKDEyOTYsIDIxODYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MjA3RDgzRjAxREEiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImZpZWxkIiBAMTI0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTExMiwgNzc4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjQKLQkJCQlsb2NhdGlvbiAgIAkoOTM4LCAyNTEzKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxMTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitmaWVsZCIKLQkJCQlwY3REaXN0ICAgIAkwLjg5MjUxNQotCQkJCWhlaWdodCAgICAgCTU3Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDIwN0Q4NDAwMjkwIgotCQkJICAgIGNsaWVudCAgICAgCUAxMjMKLQkJCSAgICBzdXBwbGllciAgIAlAMTA0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEyOTYsIDIxODYpCi0JCQkJKDExMDMsIDI0NjMpCi0JCQkJKDkyMSwgMjU5MykpCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNgotCQkJCVBhcmVudF9WaWV3IAlAMTI0Ci0JCQkJbG9jYXRpb24gICAJKDEwNDYsIDI1NTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNzgwOTg2Ci0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNSIgQDEyNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMTIsIDc3OCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSI0MjA3RDg0MDAyOTIiCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMDUKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS9pbnRyb3NwZWN0Lm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3Jvc2UvaW50cm9zcGVjdC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2E5ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vcm9zZS9pbnRyb3NwZWN0Lm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIklERSIKLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyIKLQkgICAgdmFsdWUgICAgICAJIiIpKQotICAgIHF1aWQgICAgICAgCSIzQTc5RUJBNTAzMzEiCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJVFJVRQotCWdyaWRYICAgICAgCTE2Ci0JZ3JpZFkgICAgICAJMTYKLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250Ci0JICAgIHNpemUgICAgICAgCTEwCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkgICAgY29sb3IgICAgICAJMAotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCXNob3dNZXNzYWdlTnVtIAkxCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUKLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDI5NyIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBNzk5OUI3MDJGNiIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3IgotCXF1aWQgICAgICAgCSIzQTc5OTlBRDAyOEUiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3IgotCXF1aWR1ICAgICAgCSIzQTc5OTlBRDAyQTEiCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWNvcmUiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRWNvcmUuY2F0IgotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamF2YSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmplbVxccm9zZVxcZWRvY2phdmEyLmNhdCIKLQkJcXVpZCAgICAgICAJIjM2NTQ5RjJDMDA0RSIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImJlYW5pbmZvIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvXFxyb3NlXFxiZWFuaW5mby5jYXQiCi0JCXF1aWQgICAgICAgCSIzQTc5OUFCQjAzNTMiKSkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQTc5OTlCNzAzMDkiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpiZWFuaW5mbyIgQDEKLQkJCWxvY2F0aW9uICAgCSgyNzIsIDIyNCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDE0MCkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImJlYW5pbmZvIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQTc5OUFCQjAzNTMiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiRGVwZW5kZW5jaWVzIChEb24ndCBlZGl0KSIKLQkJcXVpZCAgICAgICAJIjNCODY5QzkxMDJFNCIKLQkJdGl0bGUgICAgICAJIkRlcGVuZGVuY2llcyAoRG9uJ3QgZWRpdCkiCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMgotCQkJbG9jYXRpb24gICAJKDI1NiwgMjQwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkgICAgbG9jYXRpb24gICAJKDExMiwgMTU2KQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiZWNvcmUiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkJcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6amF2YSIgQDMKLQkJCWxvY2F0aW9uICAgCSg4OTYsIDI1NikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJICAgIGxvY2F0aW9uICAgCSg3NDksIDIyMikKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyOTQKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImphdmEiKQotCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ5LCAxNzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCSAgICBtYXhfd2lkdGggIAkyOTQKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJIjw8bWV0YW1vZGVsPj4iKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxNjc3Njk2MAotCQkJcXVpZHUgICAgICAJIjM2NTQ5RjJDMDA0RSIKLQkJCXdpZHRoICAgICAgCTMwNgotCQkJaGVpZ2h0ICAgICAJMTgwKQotCQkgICAgKG9iamVjdCBOb3RlVmlldyBANAotCQkJbG9jYXRpb24gICAJKDY4OCwgNjg4KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Ci0JCQkgICAgbG9jYXRpb24gICAJKDI4MCwgNTMyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJNwotCQkJICAgIG1heF93aWR0aCAgCTc4MAotCQkJICAgIGxhYmVsICAgICAgCSJUaGVzZSBhcmUgcGFja2FnZXMgKGNhdCBmaWxlcykgdGhhdCB0aGlzIG1vZGVsIGRlcGVuZHMgb24uIFRoZXkgbXVzdCBub3QgYmUgZWRpdGVkIGluIGhlcmUuIFRoZXkgYXJlIG9ubHkgYmUgZWRpdGVkIGJ5IHRoZSBtb2RlbCB0aGF0IG93bnMgdGhlbS4iKQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTY3NDQ3MDMKLQkJCXdpZHRoICAgICAgCTg0MAotCQkJaGVpZ2h0ICAgICAJMzI1KSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzQTc5OTlBRDAyQTEiCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBNzk5OUI3MDJGNSIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDJBMiIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMkE0IgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2OSIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiY29uc3RyYWludHMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29udGVudEtpbmQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJDb250ZW50S2luZCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiVW5zcGVjaWZpZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRW1wdHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk1peGVkIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnRPbmx5IgotCQkJCXZhbHVlICAgICAgCTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNJRCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJyZWZlcmVuY2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkpCi0JcXVpZCAgICAgICAJIjNBNzk5OUFEMDJBMyIpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vc2NoZW1hL3JlZ2lzdHJhdGlvbnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3NjaGVtYS9yZWdpc3RyYXRpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MzgxNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vc2NoZW1hL3JlZ2lzdHJhdGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyIgaWQ9InJlZ2lzdHJhdGlvbnMiIG5hbWU9IkJlYW5JbmZvIEV4dGVuc2lvbiBSZWdpc3RyYXRpb25zIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcmVnaXN0ZXIgY29udHJpYnV0b3JzLCBiZWFuaW5mbywgYW5kIG92ZXJyaWRlcyBmb3IgQmVhbkluZm8gY29udHJpYnV0aW9ucy4KLSZsdDtwJmd0O0FuIGltcG9ydGFudCBjb25jZXB0IGlzIHZpc2liaWxpdHkgb2YgYSBjb250YWluZXIsIHBsdWdpbiwgb3IgcHJvamVjdCB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuIFRoZSB0b3AtbGV2ZWwgcHJvamVjdCBpcyB0aGUgcHJvamVjdCBiZWluZyBpbnRyb3NwZWN0ZWQuIEZvciBhIGNvbnRhaW5lciwgcGx1Z2luLCBvciBwcm9qZWN0IHRvIGJlIHZpc2libGUgdG8gdGhhdCBwcm9qZWN0LCB0aGUgY29udGFpbmVyLCBwbHVnaW4sIG9yIHByb2plY3QgbXVzdCBiZSBpbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSB0b3AtbGV2ZWwgcHJvamVjdCwgb3IgaXQgbXVzdCBiZSBleHBvcnRlZCBmcm9tIGEgdmlzaWJsZSBwcm9qZWN0IG9yIHBsdWdpbi4gT25jZSBhIG5vbi12aXNpYmxlIHByb2plY3QvcGx1Z2luIGlzIHJlYWNoZWQsIGFueSBwcm9qZWN0cywgY29udGFpbmVycywgb3IgcGx1Z2lucyB0aGF0IGl0IG1heSBjb250YWluIGFyZSBub3QgY29uc2lkZXJlZCB0byBiZSB2aXNpYmxlLgotJmx0O3AmZ3Q7VGhlIHJlZ2lzdHJhdGlvbnMgYXJlIGlkZW50aWZpZWQgd2l0aCB0aGUgY29udGFpbmVyIGlkIGFuZC9vciBwbHVnaW4gaWQuIElmIHRoYXQgY29udGFpbmVyIG9yIHBsdWdpbiBpcyB2aXNpYmxlLCB0aGVuIHRoYXQgcmVnaXN0cmF0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkIGZvciB0aGUgdG9wLWxldmVsIHByb2plY3QuIElmIHRoZSBjb250YWluZXIvcGx1Z2luIGlzIGZvdW5kIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBidWlsZCBwYXRoIG9mIHRoZSB0b3AtbGV2ZWwgcHJvamVjdCwgaXQgd2lsbCBvbmx5IGJlIHByb2Nlc3NlZCBvbmNlLgotJmx0O3AmZ3Q7VGhlcmUgYXJlIHRocmVlIGZvcm1zIG9mIHJlZ2lzdHJhdGlvbnMuCi0mbHQ7dWwmZ3Q7Ci0mbHQ7bGkmZ3Q7QmVhbkluZm8gcmVnaXN0cmF0aW9ucy4gVGhlc2Ugc3VwcGx5IHN0YW5kYXJkIEJlYW5JbmZvIGFuZCBvdmVycmlkZXMuCi0mbHQ7bGkmZ3Q7Jmx0O3NhbXAmZ3Q7SUNsYXNzcGF0aENvbnRhaW5lciZsdDsvc2FtcCZndDsgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O0lCZWFuSW5mb0NvbnRyaWJ1dG9yJmx0Oy9zYW1wJmd0Oy4KLSZsdDtsaSZndDtBbiBleHBsaWNpdCBjb250cmlidXRvciB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7SUJlYW5JbmZvQ29udHJpYnV0b3ImbHQ7L3NhbXAmZ3Q7LgotJmx0Oy91bCZndDsKLSZsdDtwJmd0O0l0IHJ1bnMgdGhyb3VnaCB0aGUgdmlzaWJsZSBCZWFuSW5mbyByZWdpc3RyYXRpb25zLiAKLSZsdDtwJmd0OwotVGhlIElDbGFzc3BhdGhDb250YWluZXIgcmVnaXN0cmF0aW9uIGlzbiZhcG9zO3Qgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuIEZvciBhbGwgdmlzaWJsZSBjb250YWluZXJzLCBpZiB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciAoZnJvbSBKRFQpIGFsc28gaW1wbGVtZW50cyBJQmVhbkluZm9Db250cmlidXRvciwgdGhlbiBpdCB3aWxsIGJlIGNhbGxlZCB0byBjb250cmlidXRlIHRvIHRoZSBCZWFuSW5mby4KLSZsdDtwJmd0O1RoZW4gaXQgcnVucyB0aHJvdWdoIHRoZSB2aXNpYmxlIGV4cGxpY2l0IGNvbnRyaWJ1dG9ycy4gTm90ZSB0aGF0IGlmIHRoZSBleHBsaWNpdCBjb250cmlidXRvciBhbHNvIGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciZsdDsvc2FtcCZndDsgaXQgd2lsbCBhbHNvIGJlIGNhbGxlZCBmb3IgcHJveHkgY29udHJpYnV0aW9ucy4gVGhpcyBhbGxvd3MgZm9yIHNwZWNpYWwgc2V0dXAgcmVxdWlyZWQgYnkgYW55IGNvbnRyaWJ1dGVkIEJlYW5JbmZvIGZvciB0aGUgbGF1bmNoZWQgcHJveHkgcmVnaXN0cnkuIFRoaXMgc2hvdWxkbiZhcG9zO3Qgbm9ybWFsbHkgYmUgbmVjZXNzYXJ5IGJlY2F1c2Ugbm9ybWFsIGNsYXNzcGF0aCB1cGRhdGVzIHRvIGluY2x1ZGUgdGhlIEJlYW5JbmZvIGphciB3aWxsIGJlIGRvbmUgYnkgdGhlIElCZWFuSW5mb0NvbnRyaWJ1dG9yIGl0c2VsZiB0aHJvdWdoIHRoZSBCZWFuSW5mbyByZWdpc3RyYXRpb24gY2FsbGJhY2suCi0mbHQ7cCZndDtUaGUgb3JkZXIgb2YgcHJvY2Vzc2luZyBmb3IgdGhlIG92ZXJyaWRlcyB3aWxsIGJlIHRvIGZpcnN0IHJ1biB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3ZlcnJpZGVzICh0aHJvdWdoIEJlYW5pbmZvIHJlZ2lzdHJhdGlvbnMpLiBUaGVuIGl0IHJ1bnMgdGhyb3VnaCB0aGUgdmlzaWJsZSBjb250YWluZXJzIHRoYXQgaW1wbGVtZW50IElCZWFuSW5mb0NvbnRyaWJ1dG9yLCBhbmQgdGhlbiBmaW5hbGx5IGl0IHJ1bnMgdGhyb3VnaCB0aGUgZXhwbGljaXQgSUJlYW5JbmZvQ29udHJpYnV0b3JzLiBUaGlzIG9yZGVyIGlzIGNob3NlbiBiZWNhdXNlIHRoZSBvdmVycmlkZXMgZmlsZXMgYXJlIG5vdCBkeW5hbWljIHNvIHRoZXkgbmVlZCB0byBiZSBhcHBsaWVkIGluIGEgY29uc2lzdGVudCB3YXkuIFRoZSBjb250cmlidXRvcnMgYXJlIGR5bmFtaWMgYW5kIGNhbiBoYW5kbGUgY2hhbmdlLgotJmx0O3AmZ3Q7VGhlIG9ubHkgb3JkZXIgZ3VhcmFudGVlIGlzIHRoYXQgY29udHJpYnV0aW9ucyBmcm9tIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHdpbGwgYmUgcHJvY2Vzc2VkIGluIHBsdWdpbiBvcmRlciBvZiB3aGVyZSB0aGUgZXh0ZW5zaW9uIHdhcyBkZWNsYXJlZC4gRm9yIGV4YW1wbGUgaWYgdGhlcmUgd2FzIGFuIGV4dGVuc2lvbiBkZWNsYXJlZCBpbiBwbHVnaW4gQSBhbmQgaW4gcGx1Z2luIEIsIGFuZCBwbHVnaW4gQiByZXF1aXJlcyBwbHVnaW4gQSwgdGhlbiB0aGUgZXh0ZW5zaW9ucyBkZWNsYXJhdGlvbnMgaW4gcGx1Z2luIEEgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBleHRlbnNpb24gZGVjbGFyYXRpb25zIGluIHBsdWdpbiBCLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZWdpc3RyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udHJpYnV0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZWdpc3RyYXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgaXMgYSByZWdpc3RyYXRpb24gZm9yIGEgY29udGFpbmVyIG9yIHBsdWdpbi4gSXQgc3VwcGxpZXMgdGhlIEJlYW5JbmZvIGFuZCB0aGUgb3ZlcnJpZGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJiZWFuaW5mbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGNvbnRyaWJ1dG9yIGlzIGZvciBhIGNvbnRhaW5lci4gVGhlIHZhbHVlIGlzIHRoZSBjb250YWluZXIgaWQgKGUuZy4gJnF1b3Q7SlJFX0NPTlRBSU5FUiZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGx1Z2luIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGNvbnRyaWJ1dG9yIGlzIGZvciBhIHBsdWdpbi4gVGhlIHZhbHVlIGlzIHRoZSBwbHVnaW4gaWQgKGUuZy4gJnF1b3Q7b3JnLmVjbGlwc2Uuc3d0JnF1b3Q7KS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udHJpYnV0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgaXMgYSBjb250cmlidXRvciBmb3IgdGhlIHZpc2libGUgY29udGFpbmVyL3BsdWdpbiBkZWZpbmVkIGJ5IGNvbnRhaW5lciBhbmQgcGx1Z2luIGF0dHJpYnV0ZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBjb250YWluZXIuIFRoZSB2YWx1ZSBpcyB0aGUgY29udGFpbmVyIGlkIChlLmcuICZxdW90O0pSRV9DT05UQUlORVImcXVvdDspLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+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+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL0Jhc2VCZWFuSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vQmFzZUJlYW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzU1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vQmFzZUJlYW5JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8udm07Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEJhc2VCZWFuSW5mby5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI4ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LkltYWdlOwotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi0vKioKLSAqIEEgQmFzZUJlYW5JbmZvIHRoYXQgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIEJlYW5JbmZvcyB3aXRoaW4gdGhlIEpFTSBlbnZpcm9ubWVudC4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQmVhbkluZm8gZXh0ZW5kcyBTaW1wbGVCZWFuSW5mbyB7Ci0KLQkvLyBDb25zdGFudHMgdG8gdXNlIHRvIGNyZWF0ZSBhbGwgZGVzY3JpcHRvcnMgZXRjLgotCXByb3RlY3RlZCBzdGF0aWMgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIFJFU0JVTkRMRSA9IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby52bS5iZWFuaW5mbyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCb3VuZCBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT1VORCA9ICJib3VuZCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RyYWluZWQgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlORUQgPSAiY29uc3RyYWluZWQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByb3BlcnR5IGVkaXRvciBjbGFzcyBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWUVESVRPUkNMQVNTID0gInByb3BlcnR5RWRpdG9yQ2xhc3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlYWQgTWV0aG9kIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURNRVRIT0QgPSAicmVhZE1ldGhvZCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogV3JpdGUgbWV0aG9kIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFTUVUSE9EID0gIndyaXRlTWV0aG9kIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEaXNwbGF5bmFtZSBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZTkFNRSA9ICJkaXNwbGF5TmFtZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEluZGljYXRvciB1c2VkIHRvIGRlc2NyaWJlIGEgZmFjdG9yeSBpbnN0YW50aWF0aW9uIHBhdHRlcm4uICBOb3QgQVBJIGFzIHdpbGwgY2hhbmdlIHRvIGJlY29tZSBtb3JlIGV4dGVuc2libGUgCi0JICogdmlhIC5vdmVycmlkZSBtZWNoYW5pc20gaW4gZnV0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NSRUFUSU9OID0gIkZBQ1RPUllfQ1JFQVRJT04iOy8vJE5PTi1OTFMtMSQJCi0KLQkvKioKLQkgKiBFeHBlcnQgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRVJUID0gImV4cGVydCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSGlkZGVuIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJRERFTiA9ICJoaWRkZW4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcnJlZCBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJSRUQgPSAicHJlZmVycmVkIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG9ydCBkZXNjcmlwdGlvbiBpbmRpY2F0b3IgZm9yIGFwcGx5IHByb3BlcnR5IGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVERFU0NSSVBUSU9OID0gInNob3J0RGVzY3JpcHRpb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEN1c3RvbWl6ZXIgY2xhc3MgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUkNMQVNTID0gImN1c3RvbWl6ZXJDbGFzcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2F0ZWdvcnkgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIENhdGVnb3J5IGlzIGEgcHJlLWRlZmluZWQgYXR0cmlidXRlIG5hbWUgdG9vLiBUaGF0IGlzIHdoZXJlIHRoZSBjYXRlZ29yeSBpcyBzdG9yZWQgaW4gYQotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbiBEZWZhdWx0IGV2ZW50c2V0IGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVGQVVMVEVWRU5UU0VUID0gImluRGVmYXVsdEV2ZW50U2V0IjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhpcyBpcyBhIEZlYXR1cmUgQXR0cmlidXRlIEtleS4gV2hlbiB0aGlzIGtleSBleGlzdHMsIHRoZSB2YWx1ZSBpcyBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLiBJdCBtZWFucyB0aGlzIHByb3BlcnR5Ci0JICogaXMgYSBmaWVsZCBhbmQgbm90IGEgZ2V0dGVyL3NldHRlci4gVGhlIGdldHRlci9zZXR0ZXIgd2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgcHJvcGVydHkgdHlwZSB3aWxsIGJlIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KLQkgKiA8cD4KLQkgKiBBdCB0aGlzIHRpbWUsIGRvIG5vdCB1c2UgZmllbGQgb24gYW4gaW5kZXhlZCBwcm9wZXJ0eS4gVGhpcyBpcyBjdXJyZW50bHkgYW4gaW5kZWZpbmVkIHNpdHVhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRFBST1BFUlRZID0gImZpZWxkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRW51bWVyYXRpb24gdmFsdWVzIGluZGljYXRvciBmb3IgYXBwbHkgcHJvcGVydHkgYXJndW1lbnRzLiBFbnVtZXJhdGlvbiB2YWx1ZXMgaXMgYSBwcmUtZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZSB0b28uIFRoYXQgaXMgd2hlcmUgdGhlCi0JICogZW51bWVyYXRpb24gdmFsdWVzIGFyZSBzdG9yZWQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTUVSQVRJT05WQUxVRVMgPSAiZW51bWVyYXRpb25WYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9ic2N1cmUgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIE9ic3VyZSBpcyBhIHByZS1kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lIHRvby4gVGhhdCBpcyB3aGVyZSB0aGUgb2JzY3VyZSBzZXR0aW5nIGlzIHN0b3JlZC4KLQkgKiA8cD4KLQkgKiBPYnN1cmUgbWVhbnMgbW9zdCB1c2VycyBkb24ndCBuZWVkIGl0LiBJbiB0aGUgZnV0dXJlIHN1Y2ggZmVhdHVyZXMgd29uJ3QgZXZlbiBiZSBjYWNoZWQgc28gYXMgdG8gcmVkdWNlIHRoZSBpbi1tZW1vcnkgY29zdHMuIEN1cnJlbnRseSB0aGlzCi0JICogZmxhZyBpcyBpZ25vcmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CU0NVUkUgPSAiaXZqT2JzY3VyZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGVzaWduIHRpbWUgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIERlc2lnbiB0aW1lIGlzIGEgcHJlLWRlZmluZWQgYXR0cmlidXRlIG5hbWUgdG9vLiBUaGF0IGlzIHdoZXJlIHRoZSBkZXNpZ24gdGltZSBzZXR0aW5nIGlzCi0JICogc3RvcmVkLgotCSAqIDxwPgotCSAqIERlc2lnbiB0aW1lIG1lYW5zOgotCSAqIDx1bD4KLQkgKiA8bGk+Tm90IHNldDogV2lsbCBiZSBhIHByb3BlcnR5IHRoYXQgY2FuIGJlIGNvbm5lY3RlZCB0bywgYW5kIHNob3dzIG9uIHByb3BlcnR5IHNoZWV0IChpZiBub3QgaGlkZGVuKS4KLQkgKiA8bGk+PGNvZGU+dHJ1ZTwvY29kZT46IFNwZWNpYWwgcHJvcGVydHkgKGl0IHdpbGwgc2hvdyBvbiBwcm9wZXJ0eSBzaGVldCBpZiBub3QgaGlkZGVuKSwgYnV0IGl0IGNhbid0IGJlIGNvbm5lY3RlZCB0by4gVXN1YWxseSB0aGlzIGlzIGEKLQkgKiBwcm9wZXJ0eSB0aGF0IGlzIGZsdWZmZWQgdXAgZm9yIHRoZSBJREUgcHVycG9zZXMgYnV0IGRvZXNuJ3QgaGF2ZSBhIGdldC9zZXQgbWV0aG9kLiBUaGlzIG1lYW5zIGl0IGlzIGEgcHJvcGVydHkgZm9yIGRlc2lnbiB0aW1lIGFuZCBub3QgZm9yCi0JICogcnVudGltZS4KLQkgKiA8bGk+PGNvZGU+ZmFsc2U8L2NvZGU+OiBUaGlzIHByb3BlcnR5IHdpbGwgbm90IHNob3cgdXAgb24gcHJvcGVydHkgc2hlZXQgYnV0IGl0IGNhbiBiZSBjb25uZWN0ZWQgdG8uCi0JICogPC91bD4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNJR05USU1FUFJPUEVSVFkgPSAiaXZqRGVzaWduVGltZVByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRXZlbnRBZGFwdGVyQ2xhc3MgaW5kaWNhdG9yIGZvciBhcHBseSBwcm9wZXJ0eSBhcmd1bWVudHMuIEV2ZW50IGFkYXB0ZXIgY2xhc3MgaXMgYSBwcmUtZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZSB0b28uIFRoYXQgaXMgd2hlcmUgdGhlIGV2ZW50Ci0JICogYWRhcHRlciBpcyBzdG9yZWQuCi0JICogPHA+Ci0JICogQWRhcHRlciBjbGFzcyBmb3IgZXZlbnRTZXREZXNjcmlwdG9ycyB0aGF0IHByb3ZpZGUgZGVmYXVsdCBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIG1ldGhvZHMuIEZvciBleGFtcGxlCi0JICogPGNvZGU+amF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI8L2NvZGU+IGhhcyBhbiBhZGFwdGVyIG9mIDxjb2RlPmphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI8L2NvZGU+LiBXaGF0IGlzIHN0b3JlZCBpcyBhY3R1YWxseSB0aGUKLQkgKiBjbGFzcyBuYW1lLCBub3QgdGhlIGNsYXNzIGl0c2VsZi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVEFEQVBURVJDTEFTUyA9ICJldmVudEFkYXB0ZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBrZXlzIGZvciBpY29uIGZpbGUgbmFtZXMsIE5PVCBUSEUgamF2YS5hd3QuaWNvbiBrZXkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTkNPTE9SMTZYMTZVUkwgPSAiSUNPTl9DT0xPUl8xNngxNl9VUkwiOyAvLyROT04tTkxTLTEkCS8vIE5vdCB1c2VkLgotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTkNPTE9SMzJYMzJVUkwgPSAiSUNPTl9DT0xPUl8zMngzMl9VUkwiOyAvLyROT04tTkxTLTEkICAgICAJLy8gTm90IHVzZWQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05NT05PMTZYMTZVUkwgPSAiSUNPTl9NT05PXzE2eDE2X1VSTCI7IC8vJE5PTi1OTFMtMSQgICAgICAgIAkvLyBOb3QgdXNlZAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTk1PTk8zMlgzMlVSTCA9ICJJQ09OX01PTk9fMzJ4MzJfVVJMIjsgLy8kTk9OLU5MUy0xJAkJCS8vIE5vdCB1c2VkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gSlZNXzFfMyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwgIiIpLnN0YXJ0c1dpdGgoIjEuMyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgIC8vJE5PTi1OTFMtMyQKLQkKLQkvKioKLQkgKiBFbXB0eSBhcmdzIGxpc3QgZm9yIHRob3NlIGRlc2NyaXB0b3JzIHRoYXQgZG9uJ3QgaGF2ZSBhcmd1bWVudHMuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUkdTID0gbmV3IE9iamVjdFswXTsKLQotCS8qKgotCSAqIENhcGl0YWxpemUgdGhlIHN0cmluZy4gVGhpcyB1cHBlcmNhc2VzIG9ubHkgdGhlIGZpcnN0IGNoYXJhY3Rlci4gU28gaWYgeW91IGhhdmUgcHJvcGVydHkgbmFtZSBvZiAiYWJjIiBpdCB3aWxsIGJlY29tZSAiQWJjIi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEByZXR1cm4gc3RyaW5nIHdpdGggZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGl0YWxpemUoU3RyaW5nIHMpIHsKLQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgeyByZXR1cm4gczsgfQotCQljaGFyIGNoYXJzW10gPSBzLnRvQ2hhckFycmF5KCk7Ci0JCWNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJzWzBdKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIEJlYW5EZXNjcmlwdG9yIG9iamVjdCBnaXZlbiBhbiBhcnJheSBvZiBrZXl3b3JkL3ZhbHVlIGFyZ3VtZW50cy4gVXNlIHRoZSBrZXl3b3JkcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MsIGUuZy4gQk9VTkQsIEVYUEVSVCwgZXRjLgotCSAqIAotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIGJlYW4gZm9yIHdoaWNoIHRoZSBiZWFuIGRlc2NyaXB0b3IgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgYXJnIHBhaXJzLCBbMF0ga2V5d29yZCwgWzFdIHZhbHVlLCBbMl0ga2V5d29yZCwgWzNdIHZhbHVlLCBldGMuCi0JICogQHJldHVybiBuZXcgYmVhbiBkZXNjcmlwdG9yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBCZWFuRGVzY3JpcHRvciBjcmVhdGVCZWFuRGVzY3JpcHRvcihDbGFzcyBjbHMsIE9iamVjdFtdIGFyZ3MpIHsKLQkJQ2xhc3MgY3VzdG9taXplckNsYXNzID0gbnVsbDsKLQotCQkvKiBGaW5kIHRoZSBzcGVjaWZpZWQgY3VzdG9taXplckNsYXNzICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikgewotCQkJaWYgKENVU1RPTUlaRVJDTEFTUy5lcXVhbHMoYXJnc1tpXSkpIHsKLQkJCQljdXN0b21pemVyQ2xhc3MgPSAoQ2xhc3MpIGFyZ3NbaSArIDFdOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJQmVhbkRlc2NyaXB0b3IgYmQgPSBuZXcgQmVhbkRlc2NyaXB0b3IoY2xzLCBjdXN0b21pemVyQ2xhc3MpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQlPYmplY3QgdmFsdWUgPSBhcmdzW2kgKyAxXTsKLQkJCXNldEZlYXR1cmVEZXNjcmlwdG9yVmFsdWUoYmQsIGtleSwgdmFsdWUpOwotCQl9Ci0KLQkJcmV0dXJuIGJkOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlYW5zIEV2ZW50U2V0RGVzY3JpcHRvciBnaXZlbiB0aGUgZm9sbG93aW5nOgotCSAqIAotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIFRoZSBiZWFuIGNsYXNzCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgZXZlbnQgc2V0Ci0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGFyZyBwYWlycywgWzBdIGtleXdvcmQsIFsxXSB2YWx1ZSwgWzJdIGtleXdvcmQsIFszXSB2YWx1ZSwgZXRjLgotCSAqIEBwYXJhbSBsbWRzCi0JICogICAgICAgICAgICBhcnJheSBvZiBNZXRob2REZXNjcmlwdG9ycyBkZWZpbmluZyB0aGUgbGlzdGVuZXIgbWV0aG9kcwotCSAqIEBwYXJhbSBsaXN0ZW5lclR5cGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgbGlzdGVuZXIKLQkgKiBAcGFyYW0gYWRkTGlzdGVuZXJOYW1lCi0JICogICAgICAgICAgICBhZGQgbGlzdGVuZXIgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gcmVtb3ZlTGlzdGVuZXJOYW1lcmVtb3ZlCi0JICogICAgICAgICAgICBsaXN0ZW5lciBtZXRob2QgbmFtZQotCSAqIEByZXR1cm4gbmV3IGV2ZW50IHNldCBkZXNjcmlwdG9yCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBFdmVudFNldERlc2NyaXB0b3IgY3JlYXRlRXZlbnRTZXREZXNjcmlwdG9yKENsYXNzIGNscywgU3RyaW5nIG5hbWUsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZERlc2NyaXB0b3JbXSBsbWRzLCBDbGFzcyBsaXN0ZW5lclR5cGUsCi0JCQlTdHJpbmcgYWRkTGlzdGVuZXJOYW1lLCBTdHJpbmcgcmVtb3ZlTGlzdGVuZXJOYW1lKSB7Ci0JCUV2ZW50U2V0RGVzY3JpcHRvciBlc2QgPSBudWxsOwotCQlDbGFzc1tdIHBhcmFtVHlwZXMgPSB7IGxpc3RlbmVyVHlwZX07Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgYWRkTWV0aG9kID0gbnVsbDsKLQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCByZW1vdmVNZXRob2QgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvKiBnZXQgYWRkTGlzdGVuZXJNZXRob2Qgd2l0aCBwYXJhbWV0ZXIgdHlwZXMuICovCi0JCQkJYWRkTWV0aG9kID0gY2xzLmdldE1ldGhvZChhZGRMaXN0ZW5lck5hbWUsIHBhcmFtVHlwZXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGllKSB7Ci0JCQkJdGhyb3dFcnJvcihpZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9nZXRfdGhlX21ldGgxX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbmV3IE9iamVjdFtdIHsgYWRkTGlzdGVuZXJOYW1lfSkpOwotCQkJfQotCQkJOwotCQkJdHJ5IHsKLQkJCQkvKiBnZXQgcmVtb3ZlTGlzdGVuZXJNZXRob2Qgd2l0aCBwYXJhbWV0ZXIgdHlwZXMuICovCi0JCQkJcmVtb3ZlTWV0aG9kID0gY2xzLmdldE1ldGhvZChyZW1vdmVMaXN0ZW5lck5hbWUsIHBhcmFtVHlwZXMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGllKSB7Ci0JCQkJdGhyb3dFcnJvcihpZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9nZXRfdGhlX21ldGgxX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVtb3ZlTGlzdGVuZXJOYW1lfSkpOwotCQkJfQotCQkJOwotCi0JCQllc2QgPSBuZXcgRXZlbnRTZXREZXNjcmlwdG9yKG5hbWUsIGxpc3RlbmVyVHlwZSwgbG1kcywgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gaWUpIHsKLQkJCXRocm93RXJyb3IoaWUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX3RoZV9FMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsKLQkJfQotCQk7Ci0JCS8vIHNldCB0aGUgZXZlbnQgc2V0IGRlc2NyaXB0b3IgcHJvcGVydGllcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDIpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhcmdzW2ldOwotCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0JCQlpZiAoSU5ERUZBVUxURVZFTlRTRVQuZXF1YWxzKGtleSkpIHsKLQkJCQllc2Quc2V0SW5EZWZhdWx0RXZlbnRTZXQoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfSBlbHNlCi0JCQkJc2V0RmVhdHVyZURlc2NyaXB0b3JWYWx1ZShlc2QsIGtleSwgdmFsdWUpOwotCQl9Ci0KLQkJcmV0dXJuIGVzZDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBiZWFuJ3MgTWV0aG9kRGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY2xzCi0JICogICAgICAgICAgICBjbGFzcyBvZiB0aGUgbWV0aG9kLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBtZXRob2QuCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGFyZyBwYWlycywgWzBdIGtleXdvcmQsIFsxXSB2YWx1ZSwgWzJdIGtleXdvcmQsIFszXSB2YWx1ZSwgZXRjLgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMuCi0JICogQHBhcmFtIHBhcmFtVHlwZXMKLQkgKiAgICAgICAgICAgIHBhcmFtZXRlciB0eXBlcwotCSAqIEByZXR1cm4gbmV3IG1ldGhvZCBkZXNjcmlwdG9yCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2REZXNjcmlwdG9yIGNyZWF0ZU1ldGhvZERlc2NyaXB0b3IoQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSwgT2JqZWN0W10gYXJncywgUGFyYW1ldGVyRGVzY3JpcHRvcltdIHBhcmFtcywgQ2xhc3NbXSBwYXJhbVR5cGVzKSB7Ci0JCU1ldGhvZERlc2NyaXB0b3IgbWQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGFNZXRob2QgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvKiBnZXRNZXRob2Qgd2l0aCBwYXJhbWV0ZXIgdHlwZXMuICovCi0JCQkJYU1ldGhvZCA9IGNscy5nZXRNZXRob2QobmFtZSwgcGFyYW1UeXBlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gaWUpIHsKLQkJCQl0aHJvd0Vycm9yKGllLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2dldF90aGVfbWV0aDFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQluZXcgT2JqZWN0W10geyBuYW1lfSkpOwotCQkJfQotCQkJOwotCQkJaWYgKHBhcmFtcyAhPSBudWxsICYmIHBhcmFtcy5sZW5ndGggPiAwKQotCQkJCW1kID0gbmV3IE1ldGhvZERlc2NyaXB0b3IoYU1ldGhvZCwgcGFyYW1zKTsKLQkJCWVsc2UKLQkJCQltZCA9IG5ldyBNZXRob2REZXNjcmlwdG9yKGFNZXRob2QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gaWUpIHsKLQkJCXRocm93RXJyb3IoaWUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX01ldGhvZF9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsKLQkJfQotCQk7Ci0JCS8vIHNldCB0aGUgbWV0aG9kIHByb3BlcnRpZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgYXJnc1tpXTsKLQkJCU9iamVjdCB2YWx1ZSA9IGFyZ3NbaSArIDFdOwotCQkJc2V0RmVhdHVyZURlc2NyaXB0b3JWYWx1ZShtZCwga2V5LCB2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG1kOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVPdGhlclByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgQ2xhc3MgY2xzKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCByZWFkTWV0aG9kID0gbnVsbDsKLQkJTWV0aG9kIHdyaXRlTWV0aG9kID0gbnVsbDsKLQkJU3RyaW5nIGJhc2UgPSBjYXBpdGFsaXplKG5hbWUpOwotCQlDbGFzc1tdIHBhcmFtZXRlcnMgPSBuZXcgQ2xhc3NbMF07Ci0KLQkJLy8gRmlyc3Qgd2UgdHJ5IGJvb2xlYW4gYWNjZXNzb3IgcGF0dGVybgotCQl0cnkgewotCQkJcmVhZE1ldGhvZCA9IGNscy5nZXRNZXRob2QoImlzIiArIGJhc2UsIHBhcmFtZXRlcnMpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MSkgewotCQl9Ci0JCWlmIChyZWFkTWV0aG9kID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gRWxzZSB3ZSB0cnkgdGhlIGdldCBhY2Nlc3NvciBwYXR0ZXJuLgotCQkJCXJlYWRNZXRob2QgPSBjbHMuZ2V0TWV0aG9kKCJnZXQiICsgYmFzZSwgcGFyYW1ldGVycyk7Ly8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotCQkJCS8vIEZpbmQgYnkgbWF0Y2hpbmcgbWV0aG9kcyBvZiB0aGUgY2xhc3MKLQkJCQlyZWFkTWV0aG9kID0gZmluZE1ldGhvZChjbHMsICJnZXQiICsgYmFzZSwgMCk7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKHJlYWRNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gRm9yIHdyaXRlLW9ubHkgcHJvcGVydGllcywgZmluZCB0aGUgd3JpdGUgbWV0aG9kCi0JCQl3cml0ZU1ldGhvZCA9IGZpbmRNZXRob2QoY2xzLCAic2V0IiArIGJhc2UsIDEpOy8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCS8vIEluIFN1bidzIGNvZGUsIHJlZmxlY3Rpb24gZmFpbHMgaWYgdGhlcmUgYXJlIHR3bwotCQkJLy8gc2V0dGVycyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHRoZSBmaXJzdCBzZXR0ZXIgbG9jYXRlZAotCQkJLy8gZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSByZXR1cm4gdHlwZSBvZiB0aGUgZ2V0dGVyLgotCQkJLy8gVGhpcyBmaXhlcyB0aGF0LgotCQkJcGFyYW1ldGVycyA9IG5ldyBDbGFzc1sxXTsKLQkJCXBhcmFtZXRlcnNbMF0gPSByZWFkTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCXRyeSB7Ci0JCQkJd3JpdGVNZXRob2QgPSBjbHMuZ2V0TWV0aG9kKCJzZXQiICsgYmFzZSwgcGFyYW1ldGVycyk7Ly8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MykgewotCQkJfQotCQl9Ci0JCS8vIGNyZWF0ZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgotCQlpZiAoKHJlYWRNZXRob2QgIT0gbnVsbCkgfHwgKHdyaXRlTWV0aG9kICE9IG51bGwpKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCByZWFkTWV0aG9kLCB3cml0ZU1ldGhvZCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbihqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2ZpbmRfdGhlX2FjYzFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IG5hbWV9KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBiZWFucyBwYXJhbWV0ZXIgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiBwYXJhbWV0ZXIKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgYXJnIHBhaXJzLCBbMF0ga2V5d29yZCwgWzFdIHZhbHVlLCBbMl0ga2V5d29yZCwgWzNdIHZhbHVlLCBldGMuCi0JICogQHJldHVybiBuZXcgcGFyYW1ldGVyIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhcmFtZXRlckRlc2NyaXB0b3IgY3JlYXRlUGFyYW1ldGVyRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgT2JqZWN0W10gYXJncykgewotCQlQYXJhbWV0ZXJEZXNjcmlwdG9yIHBkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBkID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0b3IoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGllKSB7Ci0JCQl0aHJvd0Vycm9yKGllLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiQ2Fubm90X2NyZWF0ZV9QYXJhbTFfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IG5hbWV9KSk7Ci0JCX0KLQkJOwotCQkvLyBzZXQgdGhlIG5hbWUKLQkJcGQuc2V0TmFtZShuYW1lKTsKLQkJLy8gc2V0IHRoZSBtZXRob2QgcHJvcGVydGllcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDIpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhcmdzW2ldOwotCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0JCQlzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKHBkLCBrZXksIHZhbHVlKTsKLQkJfQotCi0JCXJldHVybiBwZDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIEdFVENMQVNTOyAKLQkKLQlzdGF0aWMgewotCQl0cnkgewotCQkJR0VUQ0xBU1MgPSBPYmplY3QuY2xhc3MuZ2V0TWV0aG9kKCJnZXRDbGFzcyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGRlc2NyaWJpbmcgYSBmaWVsZCBwcm9wZXJ0eS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIGlzIG5vbi1zdGFuZGFyZC4gVGhlIFZFIGtub3dzIGhvdyB0byBoYW5kbGUgdGhpcywgYnV0IGFueSBvbmUgZWxzZSB1c2luZyBCZWFuSW5mbyB3aWxsIHNlZSB0aGlzIGFzIGEgcHJvcGVydHkgd2l0aAotCSAqIG5vIGdldHRlciBvciBzZXR0ZXIuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZmllbGQKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVGaWVsZFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgRmllbGQgZmllbGQsIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbnVsbCwgbnVsbCk7Ci0JCQlwZC5zZXRWYWx1ZShGSUVMRFBST1BFUlRZLCBmaWVsZCk7CS8vIFNldCB0aGUgZmllbGQgcHJvcGVydHkgc28gd2Uga25vdyBpdCBpcyBhIGZpZWxkLgotCQkJYXBwbHlGaWVsZEFyZ3VtZW50cyhwZCwgYXJncyk7Ci0JCQkvLyBOZWVkIHRvIHNldCBpbiBhIHBob255IHJlYWQgbWV0aG9kIGJlY2F1c2UgSW50cm9zcGVjdG9yIHdpbGwgdGhyb3cgaXQgYXdheSBvdGhlcndpc2UuIFdlIGp1c3QgdXNlIE9iamVjdC5nZXRDbGFzcyBmb3IgdGhpcy4KLQkJCS8vIFdlIHdpbGwgaWdub3JlIHRoZSBwcm9wZXJ0eSB0eXBlIGZvciBmaWVsZHMuIElmIHVzZWQgb3V0c2lkZSBvZiBWRSB0aGVuIGl0IHdpbGwgbG9vayBsaWtlIGEgY2xhc3MgcHJvcGVydHkuCi0JCQlwZC5zZXRSZWFkTWV0aG9kKEdFVENMQVNTKTsKLQkJCXJldHVybiBwZDsKLQkJfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd0Vycm9yKGUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX3RoZV9QMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgYmVhbidzIHByb3BlcnR5IGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgY2xhc3Mgb2Ygd2hvIG93bnMgdGhlIHByb3BlcnR5ICh1c3VhbGx5IHRoZSBiZWFuKS4gSXQgaXMgdXNlZCB0byBsb29rIHVwIGdldC9zZXQgbWV0aG9kcyBmb3IgdGhlIHByb3BlcnR5LgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gSXQgd2lsbCB1c2UgZ2V0e05hbWV9IGFuZCBzZXR7TmFtZX0gdG8gZmluZCBnZXQvc2V0IG1ldGhvZHMuCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGFyZyBwYWlycywgWzBdIGtleXdvcmQsIFsxXSB2YWx1ZSwgWzJdIGtleXdvcmQsIFszXSB2YWx1ZSwgZXRjLgotCSAqIEByZXR1cm4gbmV3IHByb3BlcnR5IGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoQ2xhc3MgY2xzLCBTdHJpbmcgbmFtZSwgT2JqZWN0W10gYXJncykgewotCQlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gQ3JlYXRlIGFzc3VtaW5nIHRoYXQgdGhlIGdldHRlci9zZXR0ZXIgZm9sbG93cyByZWZsZWN0aW9uIHBhdHRlcm5zCi0JCQlwZCA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgY2xzKTsKLQkJfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUcnkgY3JlYXRpbmcgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciByZWFkLW9ubHksIHdyaXRlLW9ubHkKLQkJCS8vIG9yIGlmIFN1bidzIHJlZmxlY3Rpb24gZmFpbHMKLQkJCXRyeSB7Ci0JCQkJcGQgPSBjcmVhdGVPdGhlclByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBjbHMpOwotCQkJfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBpZSkgewotCQkJCXRocm93RXJyb3IoaWUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX3RoZV9QMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5hbWV9KSk7Ci0JCQl9Ci0JCX0KLQotCQlhcHBseVByb3BlcnR5QXJndW1lbnRzKHBkLCBhcmdzLCBjbHMpOwotCi0JCXJldHVybiBwZDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yIGJhc2VkIHVwb24gdGhlIFBEIHNlbnQgaW4uIEl0IHdpbGwgY2xvbmUgdGhlIHNlbnQgaW4gb25lLCBhbmQgYXBwbHkgdGhlIGFyZ3MgdG8gb3ZlcnJpZGUgYW55IHNwZWNpZmljIHNldHRpbmcuCi0JICogQ2xhc3MgY2xzIGlzIHVzZWQgZm9yIGZpbmRpbmcgcmVhZC93cml0ZSBtZXRob2RzLCBpZiBhbnkuCi0JICogCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gd2FudGluZyB0byBvdmVycmlkZSBvbmx5IGEgZmV3IHNwZWNpZmljIHNldHRpbmdzIGZyb20gYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZyb20gdGhlIHN1cGVyIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBmcm9tUERTCi0JICogICAgICAgICAgICBUaGUgUHJvcGVydHlEZXNjcmlwdG9yIGFycmF5IHRvIGZpbmQgdGhlIGVudHJ5IHRvIGNsb25lLiBJdCB3aWxsIGJlIGNoYW5nZWQgaW4gcGxhY2UgaW4gdGhlIGFycmF5LgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZmluZCBhbmQgY2xvbmUgYW5kIG92ZXJyaWRlLgotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIFRoZSBjbGFzcyB0byB1c2UgdG8gZmluZCByZWFkL3dyaXRlIG1ldGhvZHMgaW4gYXJncy4gSWYgbm8gcmVhZC93cml0ZSBtZXRob2RzIHNwZWNpZmllZCwgdGhlbiB0aGlzIG1heSBiZSBudWxsLgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBUaGUgYXJndW1lbnRzIHRvIG92ZXJyaWRlIGZyb20gZnJvbVBELiBhcmcgcGFpcnMsIFswXSBrZXl3b3JkLCBbMV0gdmFsdWUsIFsyXSBrZXl3b3JkLCBbM10gdmFsdWUsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlUHJvcGVydHlEZXNjcmlwdG9yKFByb3BlcnR5RGVzY3JpcHRvcltdIHBkcywgU3RyaW5nIG5hbWUsIENsYXNzIGNscywgT2JqZWN0W10gYXJncykgewotCQlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBudWxsOwotCQlpbnQgaVBEID0gZmluZFByb3BlcnR5RGVzY3JpcHRvcihwZHMsIG5hbWUpOwotCQlpZiAoaVBEID09IC0xKQotCQkJcmV0dXJuOwotCQlQcm9wZXJ0eURlc2NyaXB0b3IgZnJvbVBEID0gcGRzW2lQRF07Ci0JCXRyeSB7Ci0KLQkJCXBkID0gcGRzW2lQRF0gPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yKGZyb21QRC5nZXROYW1lKCksIG51bGwsIG51bGwpOwotCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93RXJyb3IoZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoIkNhbm5vdF9jcmVhdGVfdGhlX1AxX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBmcm9tUEQuZ2V0TmFtZSgpfSkpOwotCQl9Ci0KLQkJLy8gTm93IGNvcHkgb3ZlciB0aGUgY29udGVudHMgb2YgZnJvbVBELgotCQljbG9uZVByb3BlcnR5U2V0dGluZ3MoZnJvbVBELCBwZCk7Ci0KLQkJLy8gTm93IGFwcGx5IHRoZSBvdmVycmlkZXMKLQkJYXBwbHlQcm9wZXJ0eUFyZ3VtZW50cyhwZCwgYXJncywgY2xzKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9uZVByb3BlcnR5U2V0dGluZ3MoUHJvcGVydHlEZXNjcmlwdG9yIGZyb21QRCwgUHJvcGVydHlEZXNjcmlwdG9yIHBkKSB7Ci0JCXRyeSB7Ci0JCQlwZC5zZXRSZWFkTWV0aG9kKGZyb21QRC5nZXRSZWFkTWV0aG9kKCkpOwotCQkJcGQuc2V0V3JpdGVNZXRob2QoZnJvbVBELmdldFdyaXRlTWV0aG9kKCkpOwotCQkJcGQuc2V0UHJvcGVydHlFZGl0b3JDbGFzcyhmcm9tUEQuZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpKTsKLQkJCXBkLnNldEJvdW5kKGZyb21QRC5pc0JvdW5kKCkpOwotCQkJcGQuc2V0Q29uc3RyYWluZWQoZnJvbVBELmlzQ29uc3RyYWluZWQoKSk7Ci0JCQljbG9uZUZlYXR1cmVTZXR0aW5ncyhmcm9tUEQsIHBkKTsKLQkJfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd0Vycm9yKGUsIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChSRVNCVU5ETEUuZ2V0U3RyaW5nKCJDYW5ub3RfY3JlYXRlX3RoZV9QMV9FWENfIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZnJvbVBELmdldE5hbWUoKX0pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9uZUZlYXR1cmVTZXR0aW5ncyhGZWF0dXJlRGVzY3JpcHRvciBmcm9tRkQsIEZlYXR1cmVEZXNjcmlwdG9yIGZkKSB7Ci0JCWZkLnNldEV4cGVydChmcm9tRkQuaXNFeHBlcnQoKSk7Ci0JCWZkLnNldEhpZGRlbihmcm9tRkQuaXNIaWRkZW4oKSk7Ci0JCWZkLnNldFByZWZlcnJlZChmcm9tRkQuaXNQcmVmZXJyZWQoKSk7Ci0JCWZkLnNldFNob3J0RGVzY3JpcHRpb24oZnJvbUZELmdldFNob3J0RGVzY3JpcHRpb24oKSk7Ci0JCWZkLnNldERpc3BsYXlOYW1lKGZyb21GRC5nZXREaXNwbGF5TmFtZSgpKTsKLQotCQlqYXZhLnV0aWwuRW51bWVyYXRpb24ga2V5cyA9IGZyb21GRC5hdHRyaWJ1dGVOYW1lcygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGZyb21GRC5nZXRWYWx1ZShrZXkpOwotCQkJZmQuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBjb21tb24gcHJvcGVydHkgYXJndW1lbnRzIGJldHdlZW4gZmllbGQgYW5kIHN0YW5kYXJkIHByb3BlcnRpZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcHBseUNvbW1vblByb3BlcnR5QXJndW1lbnRzKFByb3BlcnR5RGVzY3JpcHRvciBwZCwgU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChCT1VORC5lcXVhbHMoa2V5KSkgewotCQkJcGQuc2V0Qm91bmQoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9IGVsc2UgaWYgKENPTlNUUkFJTkVELmVxdWFscyhrZXkpKSB7Ci0JCQlwZC5zZXRDb25zdHJhaW5lZCgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0gZWxzZSBpZiAoUFJPUEVSVFlFRElUT1JDTEFTUy5lcXVhbHMoa2V5KSkgewotCQkJcGQuc2V0UHJvcGVydHlFZGl0b3JDbGFzcygoQ2xhc3MpIHZhbHVlKTsKLQkJfSBlbHNlIGlmIChGSUVMRFBST1BFUlRZLmVxdWFscyhrZXkpKQotCQkJcmV0dXJuIHRydWU7CS8vIFRoaXMgc2hvdWxkIG5vdCBiZSBhcHBsaWVkIGV4Y2VwdCB0aHJvdWdoIGNyZWF0ZUZpZWxkUHJvcGVydHkuCi0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JCi0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwbHlQcm9wZXJ0eUFyZ3VtZW50cyhQcm9wZXJ0eURlc2NyaXB0b3IgcGQsIE9iamVjdFtdIGFyZ3MsIENsYXNzIGNscykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDIpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhcmdzW2ldOwotCQkJT2JqZWN0IHZhbHVlID0gYXJnc1tpICsgMV07Ci0KLQkJCWlmICghYXBwbHlDb21tb25Qcm9wZXJ0eUFyZ3VtZW50cyhwZCwga2V5LCB2YWx1ZSkpIHsKLQkJCQlpZiAoUkVBRE1FVEhPRC5lcXVhbHMoa2V5KSkgewotCQkJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlNZXRob2QgbWV0aG9kOwotCQkJCQl0cnkgewotCQkJCQkJbWV0aG9kID0gY2xzLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgQ2xhc3NbMF0pOwotCQkJCQkJcGQuc2V0UmVhZE1ldGhvZChtZXRob2QpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3dFcnJvcihlLCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVTQlVORExFLmdldFN0cmluZygiezB9X25vX3JlYWRfbWV0aG9kX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQluZXcgT2JqZWN0W10geyBjbHMsIG1ldGhvZE5hbWV9KSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFdSSVRFTUVUSE9ELmVxdWFscyhrZXkpKSB7Ci0JCQkJCVN0cmluZyBtZXRob2ROYW1lID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJcGQuc2V0V3JpdGVNZXRob2QobnVsbCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCU1ldGhvZCBtZXRob2Q7Ci0JCQkJCQkJQ2xhc3MgdHlwZSA9IHBkLmdldFByb3BlcnR5VHlwZSgpOwotCQkJCQkJCW1ldGhvZCA9IGNscy5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IENsYXNzW10geyB0eXBlfSk7Ci0JCQkJCQkJcGQuc2V0V3JpdGVNZXRob2QobWV0aG9kKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93RXJyb3IoZSwgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJFU0JVTkRMRS5nZXRTdHJpbmcoInswfV9ub193cml0ZV9tZXRob2RfRVhDXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW5ldyBPYmplY3RbXSB7IGNscywgbWV0aG9kTmFtZX0pKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFyYml0cmFyeSB2YWx1ZQotCQkJCQlzZXRGZWF0dXJlRGVzY3JpcHRvclZhbHVlKHBkLCBrZXksIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5RmllbGRBcmd1bWVudHMoUHJvcGVydHlEZXNjcmlwdG9yIHBkLCBPYmplY3RbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFyZ3NbaV07Ci0JCQlPYmplY3QgdmFsdWUgPSBhcmdzW2kgKyAxXTsKLQotCQkJaWYgKCFhcHBseUNvbW1vblByb3BlcnR5QXJndW1lbnRzKHBkLCBrZXksIHZhbHVlKSkgewotCQkJCWlmIChSRUFETUVUSE9ELmVxdWFscyhrZXkpKSB7Ci0JCQkJCS8vIGlnbm9yZWQgZm9yIGZpZWxkLgotCQkJCX0gZWxzZSBpZiAoV1JJVEVNRVRIT0QuZXF1YWxzKGtleSkpIHsKLQkJCQkJLy8gaWdub3JlZCBmb3IgZmllbGQuCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYXJiaXRyYXJ5IHZhbHVlCi0JCQkJCXNldEZlYXR1cmVEZXNjcmlwdG9yVmFsdWUocGQsIGtleSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIG1ldGhvZCBieSBjb21wYXJpbmcgKG5hbWUgJiBwYXJhbWV0ZXIgc2l6ZSkgYWdhaW5zdCB0aGUgbWV0aG9kcyBpbiB0aGUgY2xhc3MuIFRoaXMgaXMgYW4gZXhwZW5zaXZlIGNhbGwgYW5kIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYKLQkgKiBnZXRNZXRob2Qgd2l0aCBzcGVjaWZpYyBwYXJhbWV0ZXIgdHlwZXMgY2FuJ3QgZmluZCBtZXRob2QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QKLQkgKiBAcGFyYW0gYUNsYXNzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXJhbWV0ZXJDb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZmluZE1ldGhvZChqYXZhLmxhbmcuQ2xhc3MgYUNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nIG1ldGhvZE5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCkgewotCQl0cnkgewotCQkJLyoKLQkJCSAqIFNpbmNlIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGZpbmQgYSBtZXRob2QgYnkgZ2V0dGluZyBhbGwgbWV0aG9kcyBmcm9tIHRoZSBjbGFzcywgdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGdldE1ldGhvZAotCQkJICogY2Fubm90IGZpbmQgdGhlIG1ldGhvZC4KLQkJCSAqLwotCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZHNbXSA9IGFDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWV0aG9kcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpbmRleF07Ci0JCQkJaWYgKChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gcGFyYW1ldGVyQ291bnQpICYmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkpIHsgcmV0dXJuIG1ldGhvZDsgfQotCQkJCTsKLQkJCX0KLQkJCTsKLQkJfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhIHByb3BlcnR5IGRlc2NyaXB0b3Igb2YgYSBnaXZlbiBuYW1lIGluIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBwZHMKLQkgKiAgICAgICAgICAgIFRoZSBhcnJheSBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyB0byBzZWFyY2gsIG1heSBiZSBudWxsLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSB0byBzZWFyY2ggZm9yLgotCSAqIEByZXR1cm4gVGhlIGZvdW5kIHByb3BlcnR5IGRlc2NyaXB0b3IgaW5kZXgsIG9yIC0xIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBmaW5kUHJvcGVydHlEZXNjcmlwdG9yKFByb3BlcnR5RGVzY3JpcHRvcltdIHBkcywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChuYW1lLmVxdWFscyhwZHNbaV0uZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmJlYW5zLkJlYW5JbmZvI2dldERlZmF1bHRFdmVudEluZGV4KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHRFdmVudEluZGV4KCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmJlYW5zLkJlYW5JbmZvI2dldERlZmF1bHRQcm9wZXJ0eUluZGV4KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHRQcm9wZXJ0eUluZGV4KCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEuYmVhbnMuU2ltcGxlQmVhbkluZm8jZ2V0QmVhbkRlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBCZWFuRGVzY3JpcHRvciBnZXRCZWFuRGVzY3JpcHRvcigpIHsKLQkJLy8gRGVmYXVsdCBpcyB0byBjcmVhdGUgYW4gZW1wdHkgb25lLgotCQlyZXR1cm4gY3JlYXRlQmVhbkRlc2NyaXB0b3IoZ2V0QmVhbkNsYXNzKCksIEVNUFRZX0FSR1MpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIGZvciBCZWFuSW5mby4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIHJldHVybiB0aGUgQmVhbkluZm8gb2YgdGhlIHN1cGVyY2xhc3MuCi0JICogCi0JICogQHNlZSBCZWFuSW5mbyNnZXRBZGRpdGlvbmFsQmVhbkluZm8oKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBCZWFuSW5mb1tdIGdldEFkZGl0aW9uYWxCZWFuSW5mbygpIHsKLQkJdHJ5IHsKLQkJCUJlYW5JbmZvW10gcmVzdWx0ID0gbmV3IEJlYW5JbmZvW10geyBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oZ2V0QmVhbkNsYXNzKCkuZ2V0U3VwZXJjbGFzcygpKX07Ci0JCQlQcm9wZXJ0eURlc2NyaXB0b3JbXSBvUERzID0gcmVzdWx0WzBdLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJCVByb3BlcnR5RGVzY3JpcHRvcltdIG5QRHMgPSBvdmVycmlkZVByb3BlcnR5RGVzY3JpcHRvcnMob1BEcyk7Ci0JCQlpZiAob1BEcyAhPSBuUERzKQotCQkJCXJlc3VsdFswXSA9IG5ldyBPdmVycmlkZVBEQmVhbkluZm8ocmVzdWx0WzBdLCBuUERzKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBCZWFuSW5mb1swXTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE92ZXJyaWRlUERCZWFuSW5mbyBpbXBsZW1lbnRzIEJlYW5JbmZvIHsKLQotCQlwcml2YXRlIEJlYW5JbmZvIG9yaWdpbmFsQmVhbkluZm87Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eURlc2NyaXB0b3JbXSBvdmVycmlkZVBEczsKLQotCQlwdWJsaWMgT3ZlcnJpZGVQREJlYW5JbmZvKEJlYW5JbmZvIGJpLCBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMpIHsKLQkJCW9yaWdpbmFsQmVhbkluZm8gPSBiaTsKLQkJCW92ZXJyaWRlUERzID0gcGRzOwotCQl9Ci0KLQkJcHVibGljIEJlYW5JbmZvW10gZ2V0QWRkaXRpb25hbEJlYW5JbmZvKCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0QWRkaXRpb25hbEJlYW5JbmZvKCk7Ci0JCX0KLQotCQlwdWJsaWMgQmVhbkRlc2NyaXB0b3IgZ2V0QmVhbkRlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gb3JpZ2luYWxCZWFuSW5mby5nZXRCZWFuRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXREZWZhdWx0RXZlbnRJbmRleCgpIHsKLQkJCXJldHVybiBvcmlnaW5hbEJlYW5JbmZvLmdldERlZmF1bHRFdmVudEluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERlZmF1bHRQcm9wZXJ0eUluZGV4KCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0RGVmYXVsdFByb3BlcnR5SW5kZXgoKTsKLQkJfQotCi0JCXB1YmxpYyBFdmVudFNldERlc2NyaXB0b3JbXSBnZXRFdmVudFNldERlc2NyaXB0b3JzKCkgewotCQkJcmV0dXJuIG9yaWdpbmFsQmVhbkluZm8uZ2V0RXZlbnRTZXREZXNjcmlwdG9ycygpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEljb24oaW50IGljb25LaW5kKSB7Ci0JCQlyZXR1cm4gb3JpZ2luYWxCZWFuSW5mby5nZXRJY29uKGljb25LaW5kKTsKLQkJfQotCi0JCXB1YmxpYyBNZXRob2REZXNjcmlwdG9yW10gZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKSB7Ci0JCQlyZXR1cm4gb3JpZ2luYWxCZWFuSW5mby5nZXRNZXRob2REZXNjcmlwdG9ycygpOwotCQl9Ci0KLQkJcHVibGljIFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCQlyZXR1cm4gb3ZlcnJpZGVQRHM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyBvdmVycmlkZXMgdG8gcGFyZW50IGJlYW5pbmZvLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IHdpc2ggdG8gb3ZlcnJpZGUgYW5kIGNoYW5nZSBhbnkgaW5oZXJpdGVkIHByb3BlcnRpZXMuIFRoaXMKLQkgKiBhbGxvd3MgcmVtb3ZhbCBvZiBpbmhlcml0ZWQgcHJvcGVydGllcyBvciBjaGFuZ2VzIG9mIHNwZWNpZmljIHByb3BlcnRpZXMgKHN1Y2ggYXMgY2hhbmdlIGZyb20gaGlkZGVuIHRvIG5vdCBoaWRkZW4pLgotCSAqIAotCSAqIE5vdGU6IElmIHRoZXJlIGFueSBjaGFuZ2VzLCB0aGlzIG11c3QgcmV0dXJuIGEgRElGRkVSRU5UIGFycmF5LiBJZiBpdCByZXR1cm5zIHRoZSBzYW1lIGFycmF5LCB0aGVuIHRoZSBjaGFuZ2VzIHdpbGwgbm90IGJlIGFjY2VwdGVkLiBJZiBqdXN0Ci0JICogb3ZlcnJpZGluZywgc2hvdWxkIHVzZSBwZHMuY2xvbmUoKSB0byBnZXQgdGhlIG5ldyBhcnJheSBhbmQgdGhlbiBjaGFuZ2UgdGhlIHNwZWNpZmljIGVudHJpZXMuCi0JICogCi0JICogQHBhcmFtIHBkcwotCSAqIEByZXR1cm4gVGhlIG5ldyBjaGFuZ2VkIGFycmF5IG9yIHRoZSBzYW1lIGFycmF5IGlmIG5vIGNoYW5nZXMuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5RGVzY3JpcHRvcltdIG92ZXJyaWRlUHJvcGVydHlEZXNjcmlwdG9ycyhQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMpIHsKLQkJcmV0dXJuIHBkczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJlYW4gY2xhc3MgdGhpcyBiZWFuaW5mbyBpcyBmb3IuIFVzZWQgYnkgc3ViY2xhc3NlcyB0byBxdWlja2x5IGdldCB0aGUgYmVhbiBjbGFzcyB3aXRob3V0IGhhdmluZyB0byBjb2RlIGl0IG92ZXIgYW5kIG92ZXIuCi0JICogCi0JICogQHJldHVybiBiZWFuIGNsYXNzIGZvciB0aGlzIGJlYW5pbmZvLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDbGFzcyBnZXRCZWFuQ2xhc3MoKTsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuZXZlciB0aGUgYmVhbiBpbmZvcm1hdGlvbiBjbGFzcyB0aHJvd3MgYW4gZXhjZXB0aW9uLiBCeSBkZWZhdWx0IGl0IHByaW50cyBhIG1lc3NhZ2UgYW5kIHRoZW4gYSBzdGFja3RyYWNlIHRvIHN5cyBlcnIuCi0JICogCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbihSRVNCVU5ETEUuZ2V0U3RyaW5nKCJVTkNBVUdIVF9FWENfIikpOyAvLyROT04tTkxTLTEkCi0JCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEZlYXR1cmVEZXNjcmlwdG9yVmFsdWUoRmVhdHVyZURlc2NyaXB0b3IgZmQsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoRElTUExBWU5BTUUuZXF1YWxzKGtleSkpIHsKLQkJCWZkLnNldERpc3BsYXlOYW1lKChTdHJpbmcpIHZhbHVlKTsKLQkJfSBlbHNlIGlmIChFWFBFUlQuZXF1YWxzKGtleSkpIHsKLQkJCWZkLnNldEV4cGVydCgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0gZWxzZSBpZiAoSElEREVOLmVxdWFscyhrZXkpKSB7Ci0JCQlmZC5zZXRIaWRkZW4oKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9IGVsc2UgaWYgKFBSRUZFUlJFRC5lcXVhbHMoa2V5KSkgewotCQkJZmQuc2V0UHJlZmVycmVkKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCWlmIChKVk1fMV8zKSB7Ci0JCQkJLy8gQnVnIGluIDEuMyBkb2Vzbid0IHByZXNlcnZlIHRoZSBwcmVmZXJyZWQgZmxhZywgc28gd2Ugd2lsbCBwdXQgaXQgaW50byB0aGUgYXR0cmlidXRlcyB0b28uCi0JCQkJZmQuc2V0VmFsdWUoUFJFRkVSUkVELCB2YWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoU0hPUlRERVNDUklQVElPTi5lcXVhbHMoa2V5KSkgewotCQkJZmQuc2V0U2hvcnREZXNjcmlwdGlvbigoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0KLQkJLy8gT3RoZXJ3aXNlIGFzc3VtZSBhbiBhcmJpdHJhcnktbmFtZWQgdmFsdWUKLQkJLy8gQXNzdW1lIHRoYXQgdGhlIEZlYXR1cmVEZXNjcmlwdG9yIHByaXZhdGUgaGFzaFRhYmxlXAotCQkvLyBjb250YWlucyBvbmx5IGFyYml0cmFyeS1uYW1lZCBhdHRyaWJ1dGVzCi0JCWVsc2UgewotCQkJZmQuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGYXRhbCBlcnJvcnMgYXJlIGhhbmRsZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZC4gQnkgZGVmYXVsdCBpdCB0aHJvd3MgYW4gRXJyb3IgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBleGNlcHRpb24gZXhjZXB0aW9uIG1lc3NhZ2UgcGxhY2VkIGludG8gdGhlIG5ldyBFcnJvciB0aHJvd24uCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgYWRkZWQgdG8gZXhjZXB0aW9uIG1lc3NhZ2UuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGhpbmcgdG8gYWRkLgotCSAqIAotCSAqIEB0aHJvd3MgRXJyb3IKLQkgKiAgICAgICAgICAgICB0dXJucyBleGNlcHRpb24gaW50byBhbiBFcnJvci4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdGhyb3dFcnJvcihFeGNlcHRpb24gZSwgU3RyaW5nIHMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKGUudG9TdHJpbmcoKSArICIgIiArIHMpOy8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iYXNlYmVhbmluZm9ubHMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL2Jhc2ViZWFuaW5mb25scy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhmYjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL2Jhc2ViZWFuaW5mb25scy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL0F0dGljL2Jhc2ViZWFuaW5mb25scy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOCAkCi0jCi0KLQotIwotIyBQcm9wZXJ0aWVzIGZvciB0aGUgSXZqQmVhbkluZm8KLSMKLQotIwotIyBJdmpCZWFuSW5mbyBTdHJpbmdzCi0jCi1DYW5ub3RfZ2V0X3RoZV9tZXRoMV9FWENfID0gSVdBVjAwMTFFIENhbm5vdCBnZXQgdGhlIG1ldGhvZCB7MH0uCi1DYW5ub3RfY3JlYXRlX3RoZV9FMV9FWENfID0gSVdBVjAwMTJFIENhbm5vdCBjcmVhdGUgdGhlIEV2ZW50U2V0RGVzY3JpcHRvciBmb3IgezB9LgotQ2Fubm90X2NyZWF0ZV9NZXRob2RfRVhDXyA9IElXQVYwMDEzRSBDYW5ub3QgY3JlYXRlIHRoZSBNZXRob2REZXNjcmlwdG9yIGZvciB7MH0uCi1DYW5ub3RfZmluZF90aGVfYWNjMV9FWENfID0gSVdBVjAwMTRFIENhbm5vdCBmaW5kIGF0IGxlYXN0IHRoZSB3cml0ZSBvciByZWFkIGFjY2Vzc29yIGZvciBwcm9wZXJ0eSB7MH0uCi1DYW5ub3RfY3JlYXRlX1BhcmFtMV9FWENfID0gSVdBVjAwMTVFIENhbm5vdCBjcmVhdGUgdGhlIFBhcmFtZXRlckRlc2NyaXB0b3IgZm9yIHswfS4KLUNhbm5vdF9jcmVhdGVfdGhlX1AxICAgICAgPSBDYW5ub3QgY3JlYXRlIHRoZSBQcm9wZXJ0eURlc2NyaXB0b3IgZm9yIHswfS4KLXswfV9ub19yZWFkX21ldGhvZF9FWENfICAgPSBJV0FWMDAxNkUgQ2xhc3MgezB9IGRvZXNuJyd0IGhhdmUgdGhlIHJlcXVlc3RlZCByZWFkIGFjY2Vzc29yIHsxfS4KLXswfV9ub193cml0ZV9tZXRob2RfRVhDXyAgPSBJV0FWMDAxN0UgQ2xhc3MgezB9IGRvZXNuJyd0IGhhdmUgdGhlIHJlcXVlc3RlZCB3cml0ZSBhY2Nlc3NvciB7MX0uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iZWFuaW5mby5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vYmVhbmluZm8vdm0vYmVhbmluZm8ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmZGRjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9iZWFuaW5mby92bS9iZWFuaW5mby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2JlYW5pbmZvL3ZtL0F0dGljL2JlYW5pbmZvLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI4ICQKLSMKLQotCi0jCi0jIFByb3BlcnRpZXMgZm9yIHRoZSBWQ0UgQmVhbmluZm8KLSMKLQotIwotIyBJdmpCZWFuSW5mbyBTdHJpbmdzCi0jCi1DYW5ub3RfZ2V0X3RoZV9tZXRoMV9FWENfID0gSVdBVjAwMDdFIENhbm5vdCBnZXQgdGhlIG1ldGhvZCB7MH0uCi1DYW5ub3RfY3JlYXRlX3RoZV9FMV9FWENfID0gSVdBVjAwMDhFIENhbm5vdCBjcmVhdGUgdGhlIEV2ZW50U2V0RGVzY3JpcHRvciBmb3IgezB9LgotQ2Fubm90X2NyZWF0ZV9NZXRob2RfRVhDXyA9IElXQVYwMDA5RSBDYW5ub3QgY3JlYXRlIHRoZSBNZXRob2REZXNjcmlwdG9yIGZvciB7MH0uCi1DYW5ub3RfZmluZF90aGVfYWNjMV9FWENfID0gSVdBVjAwMTBFIENhbm5vdCBmaW5kIGF0IGxlYXN0IHRoZSB3cml0ZSBvciByZWFkIGFjY2Vzc29yIGZvciBwcm9wZXJ0eSB7MH0uCi1DYW5ub3RfY3JlYXRlX1BhcmFtMV9FWENfID0gSVdBVjAxNDZFIENhbm5vdCBjcmVhdGUgdGhlIFBhcmFtZXRlckRlc2NyaXB0b3IgZm9yIHswfS4KLUNhbm5vdF9jcmVhdGVfdGhlX1AxX0VYQ18gPSBJV0FWMDE0N0UgQ2Fubm90IGNyZWF0ZSB0aGUgUHJvcGVydHlEZXNjcmlwdG9yIGZvciB7MH0uCi17MH1fbm9fcmVhZF9tZXRob2RfRVhDXyAgID0gSVdBVjAxNDhFIENsYXNzIHswfSBkb2VzbicndCBoYXZlIHRoZSByZXF1ZXN0ZWQgcmVhZCBhY2Nlc3NvciB7MX0uCi17MH1fbm9fd3JpdGVfbWV0aG9kX0VYQ18gID0gSVdBVjAxNDlFIENsYXNzIHswfSBkb2VzbicndCBoYXZlIHRoZSByZXF1ZXN0ZWQgd3JpdGUgYWNjZXNzb3IgezF9LgotVU5DQVVHSFRfRVhDXyAgICAgICAgICAgICA9IElXQVYwMTIzRSAtLS0tLS0tLS0gVU5DQVVHSFQgRVhDRVBUSU9OIC0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vQmVhbkRlc2NyaXB0b3JFcXVhbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vQmVhbkRlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWYwYjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0JlYW5EZXNjcmlwdG9yRXF1YWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbkRlc2NyaXB0b3JFcXVhbGl0eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLS8qKgotICogRXF1YWxpdHkgdGVzdGVyIGZvciBCZWFuRGVzY3JpcHRvcnMKLSAqLwotcHVibGljIGNsYXNzIEJlYW5EZXNjcmlwdG9yRXF1YWxpdHkgZXh0ZW5kcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsKLQlzdGF0aWMgdm9pZCBJTklUKCkgewotCQl0cnkgewotCQkJTUFQX0VRVUFMSVRZLnB1dChCZWFuRGVzY3JpcHRvci5jbGFzcywgKEJlYW5EZXNjcmlwdG9yRXF1YWxpdHkuY2xhc3MpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtCZWFuRGVzY3JpcHRvci5jbGFzc30pKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQmVhbkRlc2NyaXB0b3JFcXVhbGl0eS4KLQkgKi8KLQlwdWJsaWMgQmVhbkRlc2NyaXB0b3JFcXVhbGl0eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBCZWFuRGVzY3JpcHRvckVxdWFsaXR5KEJlYW5EZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXN1cGVyKGRlc2NyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBoYXNoY29kZSBmb3IgdGhlIGN1cnJlbnQgZmVhdHVyZSwgYWRkIHRoaXMKLQkgKiB0byB0aGUgaGFzaGNvZGUgcmVjZWl2ZWQgZnJvbSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZQotCSAqIGFuZCByZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKgotCSAqIE5PVEU6IGZvciBzdWJjbGFzc2VzLCBpdCBpcyBNQU5ESVRPUlkgdGhhdCB0aGUgZmlyc3QgbGluZSBiZToKLQkgKiAgICAgICAgIGludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JICogICAgICAgYW5kIHRoZSBsYXN0IGxpbmUgYmU6Ci0JICogICAgICAgICByZXR1cm4gaGFzaGNvZGUqMzEgKyAoeW91ciBjYWxjdWxhdGVkIGhhc2hjb2RlIGZvciBqdXN0IHRoaXMgc3ViY2xhc3MpOwotCSAqLwotCXByb3RlY3RlZCBpbnQgY2FsY3VsYXRlSGFzaENvZGUoKSB7Ci0JCWludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JCUJlYW5EZXNjcmlwdG9yIGJkID0gKEJlYW5EZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJaW50IGhjID0gYmQuZ2V0QmVhbkNsYXNzKCkuaGFzaENvZGUoKTsKLQkJaWYgKGJkLmdldEN1c3RvbWl6ZXJDbGFzcygpICE9IG51bGwpCi0JCQloYyArPSBiZC5nZXRDdXN0b21pemVyQ2xhc3MoKS5oYXNoQ29kZSgpOwotCQkJCi0JCXJldHVybiBoYXNoY29kZSozMSArIGhjOwotCX0KLQkgCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKGlkZW50aXR5VGVzdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0gCQotCQlCZWFuRGVzY3JpcHRvciBvYiA9IChCZWFuRGVzY3JpcHRvcikgKChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSBvYmopLmZGZWF0dXJlOwotCQlCZWFuRGVzY3JpcHRvciBmYiA9IChCZWFuRGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0gCQkKLQkJaWYgKG9iLmdldEJlYW5DbGFzcygpICE9IGZiLmdldEJlYW5DbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob2IuZ2V0Q3VzdG9taXplckNsYXNzKCkgIT0gZmIuZ2V0Q3VzdG9taXplckNsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0gCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0V2ZW50U2V0RGVzY3JpcHRvckVxdWFsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9FdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2IxYzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0V2ZW50U2V0RGVzY3JpcHRvckVxdWFsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotICogICRSQ1NmaWxlOiBFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0vKioKLSAqIEVxdWFsaXR5IHRlc3RlciBmb3IgRXZlbnRTZXREZXNjcmlwdG9ycwotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRTZXREZXNjcmlwdG9yRXF1YWxpdHkgZXh0ZW5kcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsKLQkKLQlzdGF0aWMgdm9pZCBJTklUKCkgewotCQl0cnkgewotCQkJTUFQX0VRVUFMSVRZLnB1dChFdmVudFNldERlc2NyaXB0b3IuY2xhc3MsIChFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge0V2ZW50U2V0RGVzY3JpcHRvci5jbGFzc30pKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEFycmF5TGlzdCBmTGlzdGVuZXJNZXRob2REZXNjcmlwdG9yczsJLy8gQXJyYXkgb2YgTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5J3MuCi0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEV2ZW50U2V0RGVzY3JpcHRvckVxdWFsaXR5LgotCSAqLwotCXB1YmxpYyBFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eShFdmVudFNldERlc2NyaXB0b3IgZGVzY3IpIHsKLQkJc3VwZXIoZGVzY3IpOwotCX0KLQkKLQkvKioKLQkgKiBBIG5ldyBmZWF0dXJlIGlzIGJlaW5nIHNldCBpbnRvIHRoaXMgb2JqZWN0LAotCSAqIGNsZWFyIGFueSBjYWNoZSBtZW1iZXJzIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVjb25zdHJ1Y3RlZC4KLQkgKgotCSAqIE5PVEU6IFN1YmNsYXNzZXMgLSByZW1lbWJlciB0byBjYWxsIHN1cGVyLmNsZWFyRmVhdHVyZSgpOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyRmVhdHVyZSgpIHsKLQkJc3VwZXIuY2xlYXJGZWF0dXJlKCk7Ci0JCWZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzID0gbnVsbDsKLQl9Ci0JCQotCXByb3RlY3RlZCBBcnJheUxpc3QgbGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycygpIHsKLQkJaWYgKGZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCU1ldGhvZERlc2NyaXB0b3JbXSBtZHMgPSAoKEV2ZW50U2V0RGVzY3JpcHRvcikgZkZlYXR1cmUpLmdldExpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKTsKLQkJCWZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdChtZHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtZHMubGVuZ3RoOyBpKyspCi0JCQkJZkxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMuYWRkKG5ldyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkobWRzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIGZMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzOwotCX0JCi0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBoYXNoY29kZSBmb3IgdGhlIGN1cnJlbnQgZmVhdHVyZSwgYWRkIHRoaXMKLQkgKiB0byB0aGUgaGFzaGNvZGUgcmVjZWl2ZWQgZnJvbSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZQotCSAqIGFuZCByZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKgotCSAqIE5PVEU6IGZvciBzdWJjbGFzc2VzLCBpdCBpcyBNQU5ESVRPUlkgdGhhdCB0aGUgZmlyc3QgbGluZSBiZToKLQkgKiAgICAgICAgIGludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JICogICAgICAgYW5kIHRoZSBsYXN0IGxpbmUgYmU6Ci0JICogICAgICAgICByZXR1cm4gaGFzaGNvZGUqMzEgKyAoeW91ciBjYWxjdWxhdGVkIGhhc2hjb2RlIGZvciBqdXN0IHRoaXMgc3ViY2xhc3MpOwotCSAqLwotCXByb3RlY3RlZCBpbnQgY2FsY3VsYXRlSGFzaENvZGUoKSB7Ci0JCWludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JCUV2ZW50U2V0RGVzY3JpcHRvciBiZCA9IChFdmVudFNldERlc2NyaXB0b3IpIGZGZWF0dXJlOwotCQlpbnQgaGMgPSBiZC5nZXRBZGRMaXN0ZW5lck1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBiZC5nZXRMaXN0ZW5lck1ldGhvZHMoKTsKLQkJaW50IG1oYyA9IDA7Ci0JCWZvciAoaW50IGk9MDsgaTxtZXRob2RzLmxlbmd0aDsgaSsrKQotCQkJbWhjID0gbWhjKjMxICsgbWV0aG9kc1tpXS5oYXNoQ29kZSgpOwotCQloYyArPSBtaGM7Ci0JCWhjICs9IGxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKS5oYXNoQ29kZSgpOwotCQloYyArPSBiZC5nZXRMaXN0ZW5lclR5cGUoKS5oYXNoQ29kZSgpOwotCQloYyArPSBiZC5nZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCWhjICs9IChiZC5pc0luRGVmYXVsdEV2ZW50U2V0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQloYyArPSAoYmQuaXNVbmljYXN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwkJCi0KLQkJcmV0dXJuIGhhc2hjb2RlKjMxICsgaGM7Ci0JfQotCi0JIAotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0gCQkJcmV0dXJuIGZhbHNlOwotIAkKLQkJRXZlbnRTZXREZXNjcmlwdG9yIG9lID0gKEV2ZW50U2V0RGVzY3JpcHRvcikgKChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSBvYmopLmZGZWF0dXJlOwotCQlFdmVudFNldERlc2NyaXB0b3IgZmUgPSAoRXZlbnRTZXREZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJCi0JCUV2ZW50U2V0RGVzY3JpcHRvckVxdWFsaXR5IG9lZSA9IChFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eSkgb2JqOwotIAkJCi0JCWlmICghb2UuZ2V0QWRkTGlzdGVuZXJNZXRob2QoKS5lcXVhbHMoZmUuZ2V0QWRkTGlzdGVuZXJNZXRob2QoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghamF2YS51dGlsLkFycmF5cy5lcXVhbHMob2UuZ2V0TGlzdGVuZXJNZXRob2RzKCksIGZlLmdldExpc3RlbmVyTWV0aG9kcygpKSkKLQkJCXJldHVybiBmYWxzZTsJCi0JCWlmIChvZS5nZXRMaXN0ZW5lclR5cGUoKSAhPSBmZS5nZXRMaXN0ZW5lclR5cGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9lLmdldFJlbW92ZUxpc3RlbmVyTWV0aG9kKCkgIT0gZmUuZ2V0UmVtb3ZlTGlzdGVuZXJNZXRob2QoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9lLmlzSW5EZWZhdWx0RXZlbnRTZXQoKSAhPSBmZS5pc0luRGVmYXVsdEV2ZW50U2V0KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvZS5pc1VuaWNhc3QoKSAhPSBvZS5pc1VuaWNhc3QoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChmTGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyAhPSBudWxsIHx8IG9lZS5mTGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkvLyBXZSBhcmUgaW4gYSBNYXAgbG9va3VwIHNpdHVhdGlvbiwgc28gb25lIHNpZGUgaGFzIGxpc3RlbmVyIG1ldGhvZCBlcXVhbGl0aWVzLCBzbyB3ZSB3aWxsIGNvbXBhcmUgdGhhdCB3YXkuCi0JCQlpZiAoIW9lZS5saXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzKCkuZXF1YWxzKGxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKSkpCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJLy8gV2UgYXJlIGluIHRoZSBidWlsZGluZyB0aGUgbGlzdCBwaGFzZXMsIGRvbid0IHdhc3RlIHNwYWNlIGJ1aWxkaW5nIGVudGlyZSBsaXN0LgotCQkJTWV0aG9kRGVzY3JpcHRvcltdIG91cnMgPSBmZS5nZXRMaXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzKCk7Ci0JCQlNZXRob2REZXNjcmlwdG9yW10gdGhlaXJzID0gb2UuZ2V0TGlzdGVuZXJNZXRob2REZXNjcmlwdG9ycygpOwotCQkJaWYgKG91cnMubGVuZ3RoICE9IHRoZWlycy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG91cnMubGVuZ3RoID4gMCkgewotCQkJCU1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSB3b3JraW5nT3VycyA9IG5ldyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkoKTsKLQkJCQlNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkgd29ya2luZ1RoaWVycyA9IG5ldyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG91cnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJd29ya2luZ091cnMuc2V0RmVhdHVyZShvdXJzW2ldKTsKLQkJCQkJd29ya2luZ1RoaWVycy5zZXRGZWF0dXJlKHRoZWlyc1tpXSk7Ci0JCQkJCWlmICghd29ya2luZ091cnMuZXF1YWxzKHdvcmtpbmdUaGllcnMpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQkJCi0JCXJldHVybiB0cnVlOwkJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0ZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0ZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2Y2MwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9GZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotICogICRSQ1NmaWxlOiBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MzE6MjkgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0vKioKLSAqIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gdGVzdCBmb3Igc2VtYW50aWMgZXF1YWxpdHkgKGVxdWFscygpKQotICogYmV0d2VlbiBmZWF0dXJlIG9iamVjdHMuIEl0IGlzIG5lZWRlZCBiZWNhdXNlIEZlYXR1cmUncyBkb24ndAotICogcHJvdmlkZSBhIHNlbWFudGljIGVxdWFsaXR5LCBvbmx5IGFuIGlkZW50aXR5IGVxdWFsaXR5LiBOZWVkCi0gKiBzZW1hbnRpYyBlcXVhbGl0eSBzbyB0aGF0IGtleXMgaW4gbWFwIGNhbiBiZSBmb3VuZCBlcXVhbAotICogc2VtYW50aWNhbGx5LgotICovCi0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsKLQlwcm90ZWN0ZWQgRmVhdHVyZURlc2NyaXB0b3IgZkZlYXR1cmU7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGZWYWx1ZXM7CS8vIFRoZSBrZXkvdmFsdWVzIGZvciB0aGlzIGZlYXR1cmUuIFdlIGdyYWIgdGhlbSBvdXQKLQkJCQkJCQkJLy8gc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgcmUtZ2V0dGluZyB0aGVtIGZvciBlcXVhbGl0eQotCQkJCQkJCQkvLyBjb21wYXJlcy4gVGhpcyBpcyBkb25lIHRoZSBmaXJzdCB0aW1lIG5lZWRlZCBpbiB0aGUgZXF1YWxzCi0JCQkJCQkJCS8vIHN0YXRlbWVudC4KLQkJCQkJCQkJCi0JcHJpdmF0ZSBpbnQgZkhhc2hDb2RlID0gMDsJLy8gSGFzaGNvZGUgb2YgdGhpcyBlcXVhbGl0eSBvYmplY3QuIFRoZSBoYXNoY29kZSBmb3IgdGhlIGZlYXR1cmUgaXMgZXhwZW5zaXZlCi0JCQkJCS8vIHNvIHdlIHdpbGwgY2FsY3VsYXRlIGl0IG9uY2UgKHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQKLQkJCQkJLy8gZmVhdHVyZXMgb25jZSBjcmVhdGVkIGFyZW4ndCBjaGFuZ2VkLCB3aGljaCBmb3Igb3VyCi0JCQkJCS8vIHB1cnBvc2VzIGhlcmUgaW4gYmVhbmluZm8gbGFuZCBpcyBnb29kKS4KLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIE1BUF9FUVVBTElUWSA9IG5ldyBIYXNoTWFwKDEwKTsJLy8gTWFwIGZyb20gZGVzY3JpcHRvciB0byBlcXVhbGl0eSB0eXBlLgotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlNQVBfRVFVQUxJVFkucHV0KEZlYXR1cmVEZXNjcmlwdG9yLmNsYXNzLCAoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5jbGFzcykuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge0ZlYXR1cmVEZXNjcmlwdG9yLmNsYXNzfSkpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JCS8vIE5lZWQgdG8gc2V0IHVwIHRoZSBvdGhlcnMuCi0JCUJlYW5EZXNjcmlwdG9yRXF1YWxpdHkuSU5JVCgpOwotCQlFdmVudFNldERlc2NyaXB0b3JFcXVhbGl0eS5JTklUKCk7CQkKLQkJSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LklOSVQoKTsKLQkJTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5LklOSVQoKTsJCQotCQlQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkuSU5JVCgpOwotCX0KLQkJCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgZGVzY3JpcHRvciBlcXVhbGl0eSBmb3IgdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IGNyZWF0ZUVxdWFsaXR5KEZlYXR1cmVEZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkpICgoQ29uc3RydWN0b3IpIE1BUF9FUVVBTElUWS5nZXQoZGVzY3IuZ2V0Q2xhc3MoKSkpLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7ZGVzY3J9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSgpIHsKLQl9Ci0JCi0JLyoqCi0JICogTk9URTogRXZlcnkgc3ViY2xhc3MgbmVlZHMgdG8gaW1wbGVtZW50IGFuIG92ZXJyaWRlIGZvciB0aGUgbWV0aG9kczoKLQkgKiAgICAgICBjYWxjdWxhdGVIYXNoQ29kZQotCSAqICAgICAgIGVxdWFscwotCSAqICAgICAgIGNsZWFyRmVhdHVyZSAtIGlmIGl0IGhhcyBhbnkgY2FjaGUgdmFsdWVzCi0JICovCi0JCQkJCQotCXB1YmxpYyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KEZlYXR1cmVEZXNjcmlwdG9yIGZlYXR1cmUpIHsKLQkJc2V0RmVhdHVyZShmZWF0dXJlKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0RmVhdHVyZShGZWF0dXJlRGVzY3JpcHRvciBmZWF0dXJlKSB7Ci0JCWNsZWFyRmVhdHVyZSgpOwotCQlmRmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCQotCS8qKgotCSAqIEEgbmV3IGZlYXR1cmUgaXMgYmVpbmcgc2V0IGludG8gdGhpcyBvYmplY3QsCi0JICogY2xlYXIgYW55IGNhY2hlIG1lbWJlcnMgc28gdGhhdCB0aGV5IGNhbiBiZSByZWNvbnN0cnVjdGVkLgotCSAqCi0JICogTk9URTogU3ViY2xhc3NlcyAtIHJlbWVtYmVyIHRvIGNhbGwgc3VwZXIuY2xlYXJGZWF0dXJlKCk7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJGZWF0dXJlKCkgewotCQlmVmFsdWVzID0gbnVsbDsKLQkJZkhhc2hDb2RlID0gMDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKGZIYXNoQ29kZSA9PSAwKQotCQkJZkhhc2hDb2RlID0gY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkJcmV0dXJuIGZIYXNoQ29kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcCB2YWx1ZXMoKSB7Ci0JCWlmIChmVmFsdWVzID09IG51bGwpIHsKLQkJCWZWYWx1ZXMgPSBuZXcgSGFzaE1hcCg1KTsKLQkJCQotCQkJRW51bWVyYXRpb24ga2V5cyA9IGZGZWF0dXJlLmF0dHJpYnV0ZU5hbWVzKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQkJZlZhbHVlcy5wdXQoa2V5LCBmRmVhdHVyZS5nZXRWYWx1ZShrZXkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlZhbHVlczsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBoYXNoY29kZSBmb3IgdGhlIGN1cnJlbnQgZmVhdHVyZSwgYWRkIHRoaXMKLQkgKiB0byB0aGUgaGFzaGNvZGUgcmVjZWl2ZWQgZnJvbSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZQotCSAqIGFuZCByZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKgotCSAqIE5PVEU6IGZvciBzdWJjbGFzc2VzLCBpdCBpcyBNQU5ESVRPUlkgdGhhdCB0aGUgZmlyc3QgbGluZSBiZToKLQkgKiAgICAgICAgIGludCBoYXNoY29kZSA9IHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlKCk7Ci0JICogICAgICAgYW5kIHRoZSBsYXN0IGxpbmUgYmU6Ci0JICogICAgICAgICByZXR1cm4gaGFzaGNvZGUqMzEgKyAoeW91ciBjYWxjdWxhdGVkIGhhc2hjb2RlIGZvciBqdXN0IHRoaXMgc3ViY2xhc3MpOwotCSAqLwotCXByb3RlY3RlZCBpbnQgY2FsY3VsYXRlSGFzaENvZGUoKSB7Ci0JCWludCBoYXNoY29kZSA9IDA7Ci0JCWlmIChmRmVhdHVyZS5nZXROYW1lKCkgIT0gbnVsbCkKLQkJCWhhc2hjb2RlICs9IGZGZWF0dXJlLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCQkJCi0JCWlmIChmRmVhdHVyZS5nZXREaXNwbGF5TmFtZSgpICE9IGZGZWF0dXJlLmdldE5hbWUoKSkKLQkJCWhhc2hjb2RlICs9IGZGZWF0dXJlLmdldERpc3BsYXlOYW1lKCkuaGFzaENvZGUoKTsKLQkJaWYgKGZGZWF0dXJlLmdldFNob3J0RGVzY3JpcHRpb24oKSAhPSBmRmVhdHVyZS5nZXREaXNwbGF5TmFtZSgpKQotCQkJaGFzaGNvZGUgKz0gZkZlYXR1cmUuZ2V0U2hvcnREZXNjcmlwdGlvbigpLmhhc2hDb2RlKCk7CQkJCi0JCQkKLQkJaGFzaGNvZGUgKz0gKGZGZWF0dXJlLmlzRXhwZXJ0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQloYXNoY29kZSArPSAoZkZlYXR1cmUuaXNIaWRkZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpLmhhc2hDb2RlKCk7CQkKLQkJaGFzaGNvZGUgKz0gKGZGZWF0dXJlLmlzUHJlZmVycmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwotCQkKLQkJaGFzaGNvZGUgKz0gdmFsdWVzKCkuaGFzaENvZGUoKTsKLQkJcmV0dXJuIGhhc2hjb2RlOwotCX0KLQkKLQkvKioKLQkgKiBlcXVhbHM6IFNlZSBpZiB0aGlzIGlzIGVxdWFsIHNlbWFudGljYWxseS4KLQkgKgotCSAqIE5PVEU6IEV2ZXJ5IHN1YmNsYXNzIG5lZWRzIHRvIGltcGxlbWVudCB0aGlzIGFuZAotCSAqICAgICAgIHRoZSBmaXJzdCBmZXcgbGluZXMgc2hvdWxkIGJlOgotCSAqICAgICAgICAgaWYgKGlkZW50aXR5VGVzdCgpKQotCSAqICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQkgKiAgICAgICAgIGlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0JICogICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgKi8KLQkgCi0JIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChpZGVudGl0eVRlc3Qob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IG9mZSA9IChGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSBvYmo7CSAJCQotCSAJRmVhdHVyZURlc2NyaXB0b3Igb2YgPSBvZmUuZkZlYXR1cmU7Ci0JIAkJCi0JIAlpZiAoZkZlYXR1cmUuZ2V0Q2xhc3MoKSAhPSBvZi5nZXRDbGFzcygpKQotCSAJCXJldHVybiBmYWxzZTsKLQkgCQkKLQkgCWlmICghZkZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscyhvZi5nZXROYW1lKCkpKQotCSAJCXJldHVybiBmYWxzZTsKLQkgCWlmICghZkZlYXR1cmUuZ2V0RGlzcGxheU5hbWUoKS5lcXVhbHMob2YuZ2V0RGlzcGxheU5hbWUoKSkpCi0JIAkJcmV0dXJuIGZhbHNlOwotCSAJaWYgKCFmRmVhdHVyZS5nZXRTaG9ydERlc2NyaXB0aW9uKCkuZXF1YWxzKG9mLmdldFNob3J0RGVzY3JpcHRpb24oKSkpCi0JIAkJcmV0dXJuIGZhbHNlOwkgCi0JIAlpZiAoZkZlYXR1cmUuaXNFeHBlcnQoKSAhPSBvZi5pc0V4cGVydCgpIHx8Ci0JCSAJCWZGZWF0dXJlLmlzSGlkZGVuKCkgIT0gb2YuaXNIaWRkZW4oKSB8fAotCQkgCQlmRmVhdHVyZS5pc1ByZWZlcnJlZCgpICE9IG9mLmlzUHJlZmVycmVkKCkpCi0JIAkJcmV0dXJuIGZhbHNlOwotCSAJCi0JCWlmICghdmFsdWVzKCkuZXF1YWxzKG9mZS52YWx1ZXMoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCSB9Ci0JIAotCSAvKgotCSAgKiBJZGVudGl0eSB0ZXN0OiBUZXN0cyBmb3IgcXVpY2sgaWRlbnRpdHkgb2YKLQkgICogZGVzY3JpcHRvcnMuIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGVuIAotCSAgKiBubyBvdGhlciB0ZXN0cyByZXF1aXJlZC4KLQkgICovCi0JIHByb3RlY3RlZCBib29sZWFuIGlkZW50aXR5VGVzdChPYmplY3Qgb2JqKSB7Ci0JIAlpZiAoIShvYmogaW5zdGFuY2VvZiBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSkKLQkgCQlyZXR1cm4gZmFsc2U7Ci0JIAlpZiAodGhpcyA9PSBvYmopCi0JIAkJcmV0dXJuIHRydWU7Ci0KLQkgCWlmICgoKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkpIG9iaikuZkZlYXR1cmUgPT0gZkZlYXR1cmUpCi0JIAkJcmV0dXJuIHRydWU7Ci0JIAkJCi0JIAlyZXR1cm4gZmFsc2U7CSAJCi0JIH0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9JbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0luZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTg0OTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL0luZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotICogICRSQ1NmaWxlOiBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLio7Ci0vKioKLSAqIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IgZXF1YWxpdHkgdGVzdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkgZXh0ZW5kcyBQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eSB7Ci0KLQlzdGF0aWMgdm9pZCBJTklUKCkgewotCQl0cnkgewotCQkJTUFQX0VRVUFMSVRZLnB1dChJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yLmNsYXNzLCAoSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5LmNsYXNzKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7UHJvcGVydHlEZXNjcmlwdG9yLmNsYXNzfSkpOwotCQkJTUFQX0VRVUFMSVRZLnB1dChQcm9wZXJ0eURlc2NyaXB0b3IuY2xhc3MsIChJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuY2xhc3MpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtQcm9wZXJ0eURlc2NyaXB0b3IuY2xhc3N9KSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkoKSB7Ci0JfQotCQotCXB1YmxpYyBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkoUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXN1cGVyKGRlc2NyKTsKLQl9CQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgaGFzaGNvZGUgZm9yIHRoZSBjdXJyZW50IGZlYXR1cmUsIGFkZCB0aGlzCi0JICogdG8gdGhlIGhhc2hjb2RlIHJlY2VpdmVkIGZyb20gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUKLQkgKiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBOT1RFOiBmb3Igc3ViY2xhc3NlcywgaXQgaXMgTUFORElUT1JZIHRoYXQgdGhlIGZpcnN0IGxpbmUgYmU6Ci0JICogICAgICAgICBpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCSAqICAgICAgIGFuZCB0aGUgbGFzdCBsaW5lIGJlOgotCSAqICAgICAgICAgcmV0dXJuIGhhc2hjb2RlKjMxICsgKHlvdXIgY2FsY3VsYXRlZCBoYXNoY29kZSBmb3IganVzdCB0aGlzIHN1YmNsYXNzKTsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgewotCQlpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCQlpZiAoZkZlYXR1cmUgaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQlJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gKEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIGZGZWF0dXJlOwotCQkJCi0JCQlpbnQgaGMgPSBwZC5nZXRJbmRleGVkUHJvcGVydHlUeXBlKCkuaGFzaENvZGUoKTsKLQkKLQkJCWlmIChwZC5nZXRJbmRleGVkUmVhZE1ldGhvZCgpICE9IG51bGwpCi0JCQkJaGMgKz0gcGQuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKS5oYXNoQ29kZSgpOwotCQkJaWYgKHBkLmdldEluZGV4ZWRXcml0ZU1ldGhvZCgpICE9IG51bGwpCi0JCQkJaGMgKz0gcGQuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCkuaGFzaENvZGUoKTsKLQkJCXJldHVybiBoYXNoY29kZSozMSArIGhjOwotCQl9IGVsc2UKLQkJCXJldHVybiBoYXNoY29kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlkZW50aXR5VGVzdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmRmVhdHVyZS5nZXRDbGFzcygpICE9ICgoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkgb2JqKS5mRmVhdHVyZS5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwkvLyBJZiB0aGV5IGFyZW4ndCBib3RoIFByb3BlcnR5RGVzY2lwdG9ycyBvciBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9ycywgdGhlbiB0aGV5IGRvbid0IG1hdGNoLgotCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotIAkKLQkJaWYgKGZGZWF0dXJlIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcikgewotCQkJSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvciBvcCA9IChJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSAoKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkpIG9iaikuZkZlYXR1cmU7Ci0JCQlJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yIGZwID0gKEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIGZGZWF0dXJlOwotCi0JCQlpZiAob3AuZ2V0SW5kZXhlZFByb3BlcnR5VHlwZSgpICE9IGZwLmdldEluZGV4ZWRQcm9wZXJ0eVR5cGUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob3AuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSAhPSBmcC5nZXRJbmRleGVkUmVhZE1ldGhvZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvcC5nZXRJbmRleGVkV3JpdGVNZXRob2QoKSAhPSBmcC5nZXRJbmRleGVkV3JpdGVNZXRob2QoKSkKLQkJCQlyZXR1cm4gZmFsc2U7IAotCQl9CQkJCQkJCQkJCQkJCQotCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01ldGhvZERlc2NyaXB0b3JFcXVhbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzMxOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotICogICRSQ1NmaWxlOiBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0vKioKLSAqIEVxdWFsaXR5IHRlc3RlciBmb3IgTWV0aG9kRGVzY3JpcHRvcnMKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSBleHRlbmRzIEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkgewotCQotCXN0YXRpYyB2b2lkIElOSVQoKSB7Ci0JCXRyeSB7Ci0JCQlNQVBfRVFVQUxJVFkucHV0KE1ldGhvZERlc2NyaXB0b3IuY2xhc3MsIChNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkuY2xhc3MpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtNZXRob2REZXNjcmlwdG9yLmNsYXNzfSkpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIEFycmF5TGlzdCBmUGFyYW1ldGVyRGVzY3JpcHRvcnM7CS8vIEFycmF5IG9mIFBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eSdzLgotCQotCXB1YmxpYyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkoKSB7Ci0JfQotCQotCXB1YmxpYyBNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkoTWV0aG9kRGVzY3JpcHRvciBkZXNjcikgewotCQlzdXBlcihkZXNjcik7Ci0JfQotCQotCS8qKgotCSAqIEEgbmV3IGZlYXR1cmUgaXMgYmVpbmcgc2V0IGludG8gdGhpcyBvYmplY3QsCi0JICogY2xlYXIgYW55IGNhY2hlIG1lbWJlcnMgc28gdGhhdCB0aGV5IGNhbiBiZSByZWNvbnN0cnVjdGVkLgotCSAqCi0JICogTk9URTogU3ViY2xhc3NlcyAtIHJlbWVtYmVyIHRvIGNhbGwgc3VwZXIuY2xlYXJGZWF0dXJlKCk7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJGZWF0dXJlKCkgewotCQlzdXBlci5jbGVhckZlYXR1cmUoKTsKLQkJZlBhcmFtZXRlckRlc2NyaXB0b3JzID0gbnVsbDsKLQl9CQotCQotCXByb3RlY3RlZCBBcnJheUxpc3QgcGFyYW1ldGVyRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChmUGFyYW1ldGVyRGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJUGFyYW1ldGVyRGVzY3JpcHRvcltdIHBkcyA9ICgoTWV0aG9kRGVzY3JpcHRvcikgZkZlYXR1cmUpLmdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0JCQlpZiAocGRzICE9IG51bGwpIHsJCQkKLQkJCQlmUGFyYW1ldGVyRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KHBkcy5sZW5ndGgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxwZHMubGVuZ3RoOyBpKyspCi0JCQkJCWZQYXJhbWV0ZXJEZXNjcmlwdG9ycy5hZGQobmV3IFBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eShwZHNbaV0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhcmFtZXRlckRlc2NyaXB0b3JzOwotCX0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGhhc2hjb2RlIGZvciB0aGUgY3VycmVudCBmZWF0dXJlLCBhZGQgdGhpcwotCSAqIHRvIHRoZSBoYXNoY29kZSByZWNlaXZlZCBmcm9tIHN1cGVyLmNhbGN1bGF0ZUhhc2hDb2RlCi0JICogYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqCi0JICogTk9URTogZm9yIHN1YmNsYXNzZXMsIGl0IGlzIE1BTkRJVE9SWSB0aGF0IHRoZSBmaXJzdCBsaW5lIGJlOgotCSAqICAgICAgICAgaW50IGhhc2hjb2RlID0gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkgKiAgICAgICBhbmQgdGhlIGxhc3QgbGluZSBiZToKLQkgKiAgICAgICAgIHJldHVybiBoYXNoY29kZSozMSArICh5b3VyIGNhbGN1bGF0ZWQgaGFzaGNvZGUgZm9yIGp1c3QgdGhpcyBzdWJjbGFzcyk7Ci0JICovCi0JcHJvdGVjdGVkIGludCBjYWxjdWxhdGVIYXNoQ29kZSgpIHsKLQkJaW50IGhhc2hjb2RlID0gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUoKTsKLQkJTWV0aG9kRGVzY3JpcHRvciBiZCA9IChNZXRob2REZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJaW50IGhjID0gYmQuZ2V0TWV0aG9kKCkuaGFzaENvZGUoKTsKLQkJaWYgKHBhcmFtZXRlckRlc2NyaXB0b3JzKCkgIT0gbnVsbCkKLQkJCWhjICs9IHBhcmFtZXRlckRlc2NyaXB0b3JzKCkuaGFzaENvZGUoKTsgCi0KLQkJcmV0dXJuIGhhc2hjb2RlKjMxICsgaGM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKGlkZW50aXR5VGVzdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkgb2VtID0gKE1ldGhvZERlc2NyaXB0b3JFcXVhbGl0eSkgb2JqOwotCQlNZXRob2REZXNjcmlwdG9yIG9tID0gKE1ldGhvZERlc2NyaXB0b3IpIG9lbS5mRmVhdHVyZTsKLQkJTWV0aG9kRGVzY3JpcHRvciBmbSA9IChNZXRob2REZXNjcmlwdG9yKSBmRmVhdHVyZTsKLSAJCQotCQlpZiAoZm0uZ2V0TWV0aG9kKCkgIT0gb20uZ2V0TWV0aG9kKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCi0JCWlmIChmUGFyYW1ldGVyRGVzY3JpcHRvcnMgIT0gbnVsbCB8fCBvZW0uZlBhcmFtZXRlckRlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCS8vIFdlIGFyZSBpbiBhIE1hcCBsb29rdXAgc2l0dWF0aW9uLCBzbyBvbmUgc2lkZSBoYXMgbGlzdGVuZXIgbWV0aG9kIGVxdWFsaXRpZXMsIHNvIHdlIHdpbGwgY29tcGFyZSB0aGF0IHdheS4KLQkJCWlmIChwYXJhbWV0ZXJEZXNjcmlwdG9ycygpID09IG51bGwpCi0JCQkJaWYgKCgoTWV0aG9kRGVzY3JpcHRvckVxdWFsaXR5KSBvYmopLnBhcmFtZXRlckRlc2NyaXB0b3JzKCkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UgOwotCQkJZWxzZQotCQkJCWlmICghcGFyYW1ldGVyRGVzY3JpcHRvcnMoKS5lcXVhbHMoKChNZXRob2REZXNjcmlwdG9yRXF1YWxpdHkpIG9iaikucGFyYW1ldGVyRGVzY3JpcHRvcnMoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCS8vIFdlIGFyZSBpbiB0aGUgYnVpbGRpbmcgdGhlIGxpc3QgcGhhc2VzLCBkb24ndCB3YXN0ZSBzcGFjZSBidWlsZGluZyBlbnRpcmUgbGlzdC4KLQkJCVBhcmFtZXRlckRlc2NyaXB0b3JbXSBvdXJzID0gZm0uZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJCVBhcmFtZXRlckRlc2NyaXB0b3JbXSB0aGVpcnMgPSBvbS5nZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpOwotCQkJaWYgKG91cnMgPT0gdGhlaXJzKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZSBpZiAob3VycyA9PSBudWxsKQotCQkJCWlmICh0aGVpcnMgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJOwotCQkJZWxzZSBpZiAodGhlaXJzID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZSBpZiAob3Vycy5sZW5ndGggIT0gdGhlaXJzLmxlbmd0aCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlIGlmIChvdXJzLmxlbmd0aCA+IDApIHsKLQkJCQlQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkgd29ya2luZ091cnMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5KCk7Ci0JCQkJUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5IHdvcmtpbmdUaGllcnMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXdvcmtpbmdPdXJzLnNldEZlYXR1cmUob3Vyc1tpXSk7Ci0JCQkJCXdvcmtpbmdUaGllcnMuc2V0RmVhdHVyZSh0aGVpcnNbaV0pOwotCQkJCQlpZiAoIXdvcmtpbmdPdXJzLmVxdWFscyh3b3JraW5nVGhpZXJzKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJCQkKLSAJCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTW9kZWxpbmdCZWFuSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vTW9kZWxpbmdCZWFuSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc4MDBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01vZGVsaW5nQmVhbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby52bTsKLQotLyoKLSAqICAkUkNTZmlsZTogTW9kZWxpbmdCZWFuSW5mby5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLnZtLkJhc2VCZWFuSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29tbW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGJlYW5pbmZvIGNsYXNzIHRoYXQgaXMgY3JlYXRlZCB3aGVuIGJlYW5pbmZvIG1vZGVsaW5nIGludHJvc3BlY3RzIGEgYmVhbi4gSXRzIHB1cnBvc2UgaXMgdG8gZ2F0aGVyIHRvZ2V0aGVyIGFuZCBhbmFseXplIHRoZQotICogYmVhbmluZm8uIEZvciBleGFtcGxlLCBpdCBjaGVja3Mgd2l0aCB0aGUgc3VwZXJ0eXBlIGJlYW5pbmZvIHRvIHNlZSBpZiBhbGwgb2YgdGhlIHN1cGVydHlwZSdzIGRlc2NyaXB0b3JzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuIElmIHRoZXkgYXJlLAotICogdGhlbiBpdCBrbm93cyB0aGF0IGl0IGRvZXMgYSBzdHJhaWdodCBpbmhlcml0YW5jZSBvZiB0aGUgc3VwZXJ0eXBlJ3MgZGVzY3JpcHRvcnMsIGFuZCB0aG9zZSBkZXNjcmlwdG9ycyBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBUaGlzIG1ha2VzIGl0Ci0gKiBlYXNpZXIgb24gdGhlIG1vZGVsIHNpZGUgc28gdGhhdCB0aGVyZSBpc24ndCBhIGdyZWF0IHByb2xpZmVyYXRpb24gb2YgZGVzY3JpcHRvcnMgYWxsIGRlc2NyaWJpbmcgdGhlIHNhbWUgcHJvcGVydGllcy4gSW4gdGhhdCBjYXNlIHRoZXkgY2FuIGJlCi0gKiBtZXJnZWQgZnJvbSB0aGUgc3VwZXJ0eXBlIG1vZGVsLiBJZiBzb21lIGFyZSBub3QgZm91bmQsIHRoZW4gdGhhdCBtZWFucyB0aGlzIGJlYW5pbmZvIGlzIHRyeWluZyB0byBoaWRlIHNvbWUgb2YgdGhlbSwgYW5kIGluIHRoYXQgY2FzZSB0aGlzIGlzIHRoZQotICogZGVmaW5pdGl2ZSBsaXN0IGFuZCBpbmhlcml0YW5jZSBzaG91bGRuJ3QgYmUgdXNlZCBvbiB0aGUgbW9kZWwgc2lkZS4gSG93ZXZlciwgZm9yIHRob3NlIGZlYXR1cmVzIHdoaWNoIGFyZSBlc3NlbnRpYWxseSB0aGUgaW5oZXJpdGVkIGZlYXR1cmUgKGkuZS4KLSAqIHRoZSBCZWFuSW5mbyBzaW1wbHkgZmlsdGVyZWQgb3V0IHNvbWUgaW5oZXJpdGVkIGJ1dCBub3QgYWxsKSwgdGhleSB3aWxsIGJlIHJldHVybmFibGUgKGJ5IG5hbWUpLiBUaGUgSURFIHNpZGUgd2lsbCB0YWtlIHRoZXNlIHRoYXQgYXJlICJpbmhlcml0ZWQiCi0gKiBhbmQgd2lsbCByZXR1cm4gdGhlIGFjdHVhbCBzdHJ1Y3R1cmVkIGZlYXR1cmUgZnJvbSB0aGUgaW5oZXJpdGVkIGNsYXNzLgotICogCi0gKiBUaGUgdGVzdCBmb3Igc2VlaW5nIGlmIHRoZSBzdXBlciBmZWF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBiZWFuaW5mbyBpcyBmaXJzdCB0byBzZWUgaWYgdGhlIHRoZSBmZWF0dXJlIGlzIGluIHRoZSBiZWFuaW5mbyBieSBuYW1lLCBpZiBpdCBpcyB0aGVuCi0gKiBpdCBpcyBtYXJrZWQgYXMgaW5jbHVkZWQuIFRoZW4gYSBjaGVjayBpcyBtYWRlIG9uIGVxdWFsaXR5LCBpZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiB0aGUgZmVhdHVyZSBpcyByZW1vdmVkIGZyb20gdGhlIGJlYW5pbmZvIGxpc3QsIGJ1dCB0aGUgbWVyZ2UKLSAqIGZsYWcgaXMgc3RpbGwgbGVmdCBvbiwgYW5kIHJlbW92ZWQgaW5oZXJpdGVkIGZlYXR1cmUgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaW5oZXJpdGVkIGZlYXR1cmVzLiBJZiBhbGwgaW5oZXJpdGVkIGZlYXR1cmVzIGFyZSBmb3VuZCwgdGhpcyBsaXN0IGlzCi0gKiBjbGVhcmVkIGFuZCBmbGFnIGlzIHNldCB3aGljaCBzaW1wbHkgc2F5cyBtZXJnZSBhbGwgaW5oZXJpdGVkLiBUaGlzIGFsbG93cyBtZXJnaW5nIHRvIG9jY3VyIGJ1dCBpdCBhbHNvIGFsbG93cyBvdmVycmlkZXMgdG8gb2NjdXIuCi0gKiAKLSAqIE5vdGU6IFRlc3QgZm9yIGlkZW50aXR5IGlzIGRpZmZlcmVudCBiZXR3ZWVuIEpESyAxLjUgYW5kIGFib3ZlIGFuZCBiZWxvdy4gMS41IGFuZCBhYm92ZSwgd2UgY2FuIHVzZSBhY3R1YWwgZXF1YWxzKCkgYmVjYXVzZSB0aGUgc2FtZSBkZXNjcmlwdG9yIGlzCi0gKiByZXR1cm5lZCBmcm9tIGluaGVyaXRlZCBmZWF0dXJlcy4gSW4gMS4zLCBjbG9uZXMgd2VyZSBhbHdheXMgcmV0dXJuZWQgYW5kIGVxdWFscygpIHdvdWxkIGFuc3dlciBmYWxzZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgYSBzcGVjaWFsIGVxdWFsaXR5Ci0gKiBkZXNjcmlwdG9yIHdoaWNoIHR1cm5zIHRoZSBlcXVhbHMoKSBpbnRvIG9uZSB0aGF0IGNhbiB0ZXN0IGNsb25lcyBmb3Igc2VtYW50aWMgZXF1YWxpdHkuIFNlZSBKYXZhIEJ1ZyBJRCM0OTk2NjczIFRoZSBwcm9ibGVtIHdhcyBzdXBwb3NlZCB0byBiZQotICogZml4ZWQgaW4gMS40IGJ1dCBpdCB3YXMgbm90IGZpeGVkLiBPcmlnaW5hbGx5IGEgbmV3IGNsb25lIHdhcyBjcmVhdGVkIGVhY2ggdGltZSBhIGJlYW5pbmZvIHdhcyByZXF1ZXN0ZWQuIFRoYXQgaXMgbm8gbG9uZ2VyIGRvbmUgaW4gMS40LCBidXQgdGhlCi0gKiBwcm9jZXNzaW5nIHRvIGNyZWF0ZSB0aGUgb3JpZ2luYWwgYmVhbmluZm8gZG9lcyBhIGNsb25lIGFjY2lkZW50bHkgdW5kZXIgdGhlIGNvdmVycy4gTG9va2luZyBhdCAxLjUgaXQgbG9va3MgdGhpcyB3YXMgZml4ZWQsIGJ1dCBpdCBoYXNuJ3QgYmVlbgotICogdGVzdGVkIGhlcmUgeWV0LgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2RlbGluZ0JlYW5JbmZvIGltcGxlbWVudHMgSUNhbGxiYWNrIHsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gUFJFMTU7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVBSRTE1ID0gdmVyc2lvbi5zdGFydHNXaXRoKCIxLiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChQUkUxNSkgewotCQkJLy8gQ29udGludWUgdG8gY2hlY2ssIGdldCB0aGUgcmV2aXNpb24uCi0JCQlpbnQgcmV2aXNpb24gPSAwOwotCQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPiAyKSB7Ci0JCQkJaW50IHJldkVuZCA9IHZlcnNpb24uaW5kZXhPZignLicsIDIpOwotCQkJCXJldmlzaW9uID0gdmVyc2lvbi5sZW5ndGgoKSA+IDIgPyBJbnRlZ2VyLnBhcnNlSW50KHJldkVuZCAhPSAtMSA/IHZlcnNpb24uc3Vic3RyaW5nKDIsIHJldkVuZCkgOiB2ZXJzaW9uLnN1YnN0cmluZygyKSkgOiAwOwotCQkJCVBSRTE1ID0gcmV2aXNpb24gPCA1OwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZlYXR1cmVFcXVhbGl0eVNldCBleHRlbmRzIEhhc2hTZXQgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzc0NDc3Njc0MDYwNDMyODMyNEw7Ci0JCXByaXZhdGUgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB3b3JraW5nS2V5OwotCi0JCXB1YmxpYyBGZWF0dXJlRXF1YWxpdHlTZXQoTGlzdCBmZWF0dXJlcykgewotCQkJc3VwZXIoZmVhdHVyZXMuc2l6ZSgpKTsKLQkJCS8vIEdldCBmaXJzdCBmZWF0dXJlIHRvIGZpcXVyZSBvdXQgdHlwZSBvZiB3b3JraW5nIGtleS4gVGhpcyB3aWxsIG5vdCBiZSByZWVudHJhbnQuCi0JCQl3b3JraW5nS2V5ID0gRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5jcmVhdGVFcXVhbGl0eSgoRmVhdHVyZURlc2NyaXB0b3IpIGZlYXR1cmVzLmdldCgwKSk7Ci0JCQl0aGlzLmFkZEFsbChmZWF0dXJlcyk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGQoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWRkKEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkuY3JlYXRlRXF1YWxpdHkoKEZlYXR1cmVEZXNjcmlwdG9yKSBvKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNjb250YWlucyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQkJd29ya2luZ0tleS5zZXRGZWF0dXJlKChGZWF0dXJlRGVzY3JpcHRvcikgbyk7Ci0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnMod29ya2luZ0tleSk7Ci0JCX0KLQotCX0KLQotCS8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGluZGljYXRlIGlmIHRoZSBzdXBlciBpbmZvIHNob3VsZCBiZSBtZXJnZWQKLQkvLyBpbiBvbiB0aGUgbW9kZWwgc2lkZS4gbm8gbWVyZ2UgbWVhbnMgdGhlcmUgd2VyZSBubyBpbmhlcml0ZWQgbWV0aG9kcyBhdCBhbGwuIFNvIHRoZQotCS8vIGJlYW5pbmZvIHByZXNlbnRlZCBpcyBkZWZpbml0aXZlLiBJZiBtZXJnZSwgdGhlbiBnZXQuLi5EZXNjcmlwdG9ycyB3aWxsIHJldHVybiBqdXN0Ci0JLy8gdGhlIG9uZXMgZm9yIHRoaXMgbGV2ZWwsIGFuZCBnZXRTdXBlci4uLkRlc2NyaXB0b3JzIHdpbGwgcmV0dXJuIHRoZSBpbmhlcml0ZWQgb25lcy4KLQkvLyBUaG91Z2ggaW4gdGhpcyBjYXNlLCBpZiB0aGUgcmV0dXJuZWQgc3VwZXIgbGlzdCBpcyBudWxsLCB0aGVuIHRoYXQgbWVhbnMgdXNlIEFMTCBvZgotCS8vIHRoZSBpbmhlcml0ZWQgb25lcy4KLQkvLyBUaGUgc3VwZXIgbGlzdCByZXR1cm5zIHNpbXBseSB0aGUgbmFtZXMsIGRvbid0IG5lZWQgdG8gaGF2ZSB0aGUgZnVsbCBkZXNjcmlwdG9ycyBpbiB0aGF0IGNhc2UuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZk1lcmdlSW5oZXJpdGVkRXZlbnRzID0gZmFsc2UsIGZNZXJnZUluaGVyaXRlZE1ldGhvZHMgPSBmYWxzZSwgZk1lcmdlSW5oZXJpdGVkUHJvcGVydGllcyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGZpbmFsIEJlYW5JbmZvIGZUYXJnZXRCZWFuSW5mbzsgLy8gVGhlIGJlYW5pbmZvIGJlaW5nIG1vZGVsZWQuCi0KLQkvLyBMb2NhbCBkZXNjcmlwdG9ycwotCXByb3RlY3RlZCBFdmVudFNldERlc2NyaXB0b3JbXSBmRXZlbnRTZXRzOwotCi0JcHJvdGVjdGVkIE1ldGhvZERlc2NyaXB0b3JbXSBmTWV0aG9kczsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eURlc2NyaXB0b3JbXSBmUHJvcGVydGllczsKLQotCS8vIE5vdCBpbmhlcml0ZWQgZGVzY3JpcHRvciBuYW1lcywgd2lsbCBiZSBudWxsIGlmIG5vIG1lcmdlIG9yIGlmIG1lcmdlIGFsbC4gVGhpcyBpcyBsaXN0IG9mIG5hbWVzIHRvIE5PVCBtZXJnZS4gSXQgaXMgdXN1YWxseSBzaG9ydGVyIHRoYW4gdGhlIGxpc3QgdG8gbWVyZ2UgZnJvbSBzdXBlci4KLQotCS8vIE1ldGhvZHMgYXJlIHNwZWNpYWwuIFlvdSBjYW4gaGF2ZSBkdXBsaWNhdGVzLCBzbyBuYW1lIGlzIG5vdCBzdWZmaWNpZW50LgotCS8vIFNvIGZvciBtZXRob2RzLAotCS8vIHdpbGwgdXNlIGFuIGFycmF5IG9mIFN0cmluZ3Mgd2hlcmU6Ci0JLy8gICBGb3IgZWFjaCBvbmUgdGhlIGZ1bGwgc2lnbmF0dXJlCi0JLy8gICB3aWxsIGJlIGluIHRoZSBsaXN0LCBlLmcuICJuYW1lOm1ldGhvZE5hbWUoYXJndHlwZSwuLi4iIHdoZXJlIGFyZ3R5cGUgaXMgdGhlIGZ1bGx5cXVhbGlmaWVkCi0JLy8gICBjbGFzc25hbWUgKHVzaW5nICIuIiBub3RhdGlvbiBmb3IgaW5uZXIgY2xhc3NlcyksIGFuZCB1c2luZyBmb3JtYXQgImphdmEubGFuZy5TdHJpbmdbXSIgZm9yCi0JLy8gICBhcnJheXMuCi0JLy8KLQkvLyBUaGlzIGlzIGJlY2F1c2UgZXZlbiBpZiB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcywgaXQgd2lsbCB0YWtlIGxlc3MgdGltZS9zcGFjZSB0byBzaW1wbHkgY3JlYXRlIHRoZSBlbnRyaWVzCi0JLy8gdGhlbiBpdCB3b3VsZCB0byBjcmVhdGUgYSBzZXQgdG8gc2VlIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGFuZCB0aGVuIGNyZWF0ZSB0aGUgZmluYWwgYXJyYXkuCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGZOb3RJbmhlcml0ZWRFdmVudFNldHM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZk5vdEluaGVyaXRlZE1ldGhvZHM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZk5vdEluaGVyaXRlZFByb3BlcnRpZXM7Ci0JCi0JcHJvdGVjdGVkIGludCBkb0ZsYWdzOwotCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgdG8gZG8gaW50cm9zcGVjdGlvbiBhbmQgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBNb2RlbGluZ0JlYW5JbmZvCi0JICogCi0JICogVGhpcyB3aWxsIGFsd2F5cyBpbnRyb3NwZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxpbmdCZWFuSW5mbyBpbnRyb3NwZWN0KENsYXNzIGludHJvc3BlY3RDbGFzcywgaW50IGRvRmxhZ3MpIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGludHJvc3BlY3QoaW50cm9zcGVjdENsYXNzLCB0cnVlLCBkb0ZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCB0byBkbyBpbnRyb3NwZWN0aW9uIGFuZCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIE1vZGVsaW5nQmVhbkluZm8KLQkgKiAKLQkgKiBpbnRyb3NwZWN0SWZOb0JlYW5JbmZvOiBJZiB0aGlzIGlzIHRydWUsIHRoZW4gaWYgbm8gZXhwbGljaXQgYmVhbmluZm8gd2FzIGZvdW5kIGZvciB0aGlzIGNsYXNzLCB0aGVuIGludHJvc3BlY3Rpb24gd2lsbCBiZSBkb25lIGFueXdheS4gVGhlCi0JICogSW50cm9zcGVjdG9yIHdpbGwgdXNlIHJlZmxlY3Rpb24gZm9yIGxvY2FsIG1ldGhvZHMvZXZlbnRzL3Byb3BlcnRpZXMgb2YgdGhpcyBjbGFzcyBhbmQgdGhlbiBhZGQgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHN1cGVyY2xhc3MgaW50cm9zcGVjdGlvbi4KLQkgKiBJZiB0aGlzIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhlbiBpZiB0aGUgZXhwbGljaXQgYmVhbmluZm8gaXMgbm90IGZvdW5kLCB0aGVuIG5vIGludHJvc3BlY3Rpb24gd2lsbCBiZSBkb25lIGFuZCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbGluZ0JlYW5JbmZvIGludHJvc3BlY3QoQ2xhc3MgaW50cm9zcGVjdENsYXNzLCBib29sZWFuIGludHJvc3BlY3RJZk5vQmVhbkluZm8sIGludCBkb0ZsYWdzKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghQmVhbnMuaXNEZXNpZ25UaW1lKCkpCi0JCQlCZWFucy5zZXREZXNpZ25UaW1lKHRydWUpOwkvLyBTaW5jZSB0aGlzIGEgamVtIGJlYW5pbmZvIHNwZWNpZmljIHZtLCB3ZSBzaG91bGQgYWxzbyBiZSBjb25zaWRlcmVkIGRlc2lnbiB0aW1lLgotCQlpZiAoIWludHJvc3BlY3RJZk5vQmVhbkluZm8pIHsKLQkJCS8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIGJlYW5pbmZvIGlzIGV4cGxpY2l0bHkgc3VwcGxpZWQuCi0JCQkvLyBJZiBub3QsIHRoZW4gd2UgcmV0dXJuIG51bGwuCi0JCQkvLyBUaGUgY2hlY2tzIHdpbGwgYmUgdGhlIHNhbWUgdGhhdCBJbnRyb3NwZWN0b3Igd2lsbCB1c2UuCi0KLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCS8vIDEuIElzIHRoZXJlIGEgQmVhbkluZm8gY2xhc3MgaW4gdGhlIHNhbWUgcGFja2FnZQotCQkJaWYgKCFjbGFzc0V4aXN0cyhpbnRyb3NwZWN0Q2xhc3MuZ2V0TmFtZSgpICsgIkJlYW5JbmZvIiwgaW50cm9zcGVjdENsYXNzKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gMi4gSXMgdGhpcyBjbGFzcyBhIEJlYW5JbmZvIGNsYXNzIGZvciBpdHNlbGYuCi0JCQkJaWYgKCEoQmVhbkluZm8uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20oaW50cm9zcGVjdENsYXNzKSkgewotCQkJCQkvLyAzLiBDYW4gdGhpcyBjbGFzcyBiZSBmb3VuZCBpbiB0aGUgQmVhbmluZm8gc2VhcmNocGF0aC4KLQkJCQkJU3RyaW5nW10gc2VhcmNoUGF0aCA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mb1NlYXJjaFBhdGgoKTsKLQkJCQkJaW50IHN0YXJ0Q2xhc3NuYW1lID0gaW50cm9zcGVjdENsYXNzLmdldE5hbWUoKS5sYXN0SW5kZXhPZigiLiIpICsgMTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgYmlOYW1lID0gIi4iICsgaW50cm9zcGVjdENsYXNzLmdldE5hbWUoKS5zdWJzdHJpbmcoc3RhcnRDbGFzc25hbWUpICsgIkJlYW5JbmZvIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGNsYXNzRXhpc3RzKHNlYXJjaFBhdGhbaV0gKyBiaU5hbWUsIGludHJvc3BlY3RDbGFzcykpIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJfSBlbHNlCi0JCQkJZm91bmQgPSB0cnVlOwotCi0JCQlpZiAoIWZvdW5kKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQmVhbkluZm8gYkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oaW50cm9zcGVjdENsYXNzKTsKLQkJQ2xhc3Mgc3VwZXJDbGFzcyA9IGludHJvc3BlY3RDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0KLQkJaWYgKHN1cGVyQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBQUkUxNSA/IChNb2RlbGluZ0JlYW5JbmZvKSBuZXcgTW9kZWxpbmdCZWFuSW5mb1ByZTE1KGJJbmZvLCBkb0ZsYWdzKSA6IG5ldyBNb2RlbGluZ0JlYW5JbmZvMTUoYkluZm8sIGRvRmxhZ3MpOwotCQllbHNlCi0JCQlyZXR1cm4gUFJFMTUgPyAoTW9kZWxpbmdCZWFuSW5mbykgbmV3IE1vZGVsaW5nQmVhbkluZm9QcmUxNShiSW5mbywgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHN1cGVyQ2xhc3MpLCBkb0ZsYWdzKSA6IG5ldyBNb2RlbGluZ0JlYW5JbmZvMTUoYkluZm8sCi0JCQkJCUludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhzdXBlckNsYXNzKSwgZG9GbGFncyk7Ci0JfQotCi0JLyoqCi0JICogU2VlIGlmIHRoaXMgY2xhc3MgZXhpc3RzLCBmaXJzdCBpbiB0aGUgY2xhc3MgbG9hZGVyIG9mIHRoZSBzZW50IGNsYXNzLCB0aGVuIGluIHRoZSBzeXN0ZW0gbG9hZGVyLCB0aGVuIHRoZSBib290c3RyYXAgbG9hZGVyLCBhbmQgZmluYWxseSB0aGUKLQkgKiBjdXJyZW50IHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY2xhc3NFeGlzdHMoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3MgZnJvbUNsYXNzKSB7Ci0JCWlmIChmcm9tQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlmcm9tQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJfQotCQlpZiAoQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCXRyeSB7Ci0JCQlDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gVXNlIHRoZSBjbGFzc2xvYWRlciBmcm9tIHRoZSBjdXJyZW50IFRocmVhZC4KLQkJCUNsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJCWNsLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogVXNlZCBvbmx5IGZvciBPYmplY3Qgc2luY2UgdGhhdCBpcyB0aGUgb25seSBiZWFuIHRoYXQgZG9lc24ndCBoYXZlIGEgc3VwZXJjbGFzcy4gU3VwZXJjbGFzcyBiZWFuaW5mbyByZXF1aXJlZCBmb3IgYWxsIG90aGVyIGNsYXNzZXMuIElmIHRoaXMgaXMKLQkgKiBjb25zdHJ1Y3RlZCB0aGVuIHRoaXMgbWVhbnMgbm8gbWVyZ2UgYW5kIHRoZSBsaXN0IGlzIGRlZmluaXRpdmUuCi0JICovCi0JcHJvdGVjdGVkIE1vZGVsaW5nQmVhbkluZm8oQmVhbkluZm8gYmVhbkluZm8sIGludCBkb0ZsYWdzKSB7Ci0JCWZUYXJnZXRCZWFuSW5mbyA9IGJlYW5JbmZvOwotCQl0aGlzLmRvRmxhZ3MgPSBkb0ZsYWdzOwotCX0KLQotCXByb3RlY3RlZCBNb2RlbGluZ0JlYW5JbmZvKEJlYW5JbmZvIGJlYW5JbmZvLCBCZWFuSW5mbyBzdXBlckJlYW5JbmZvLCBpbnQgZG9GbGFncykgewotCQl0aGlzKGJlYW5JbmZvLCBkb0ZsYWdzKTsKLQotCQkvLyBOb3cgZ28gdGhyb3VnaCB0aGUgYmVhbmluZm8gdG8gZGV0ZXJtaW5lIHRoZSBtZXJnZSBzdGF0ZS4KLQkJLy8gVGhlIGRlZmF1bHQgaXMgbm8gbWVyZ2UuCi0KLQkJaWYgKChkb0ZsYWdzICYgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19FVkVOVFMpICE9IDApIHsKLQkJCUxpc3QgZnVsbCA9IGFkZEFsbChiZWFuSW5mby5nZXRFdmVudFNldERlc2NyaXB0b3JzKCkpOwotCQkJTGlzdCBpbmhlcml0ZWQgPSBhZGRBbGwoc3VwZXJCZWFuSW5mby5nZXRFdmVudFNldERlc2NyaXB0b3JzKCkpOwotCi0JCQlmTWVyZ2VJbmhlcml0ZWRFdmVudHMgPSBzdHJpcExpc3QoZnVsbCwgaW5oZXJpdGVkKTsKLQkJCWlmIChmTWVyZ2VJbmhlcml0ZWRFdmVudHMpIHsKLQkJCQlpZiAoIWZ1bGwuaXNFbXB0eSgpKQotCQkJCQlmRXZlbnRTZXRzID0gKEV2ZW50U2V0RGVzY3JpcHRvcltdKSBmdWxsLnRvQXJyYXkobmV3IEV2ZW50U2V0RGVzY3JpcHRvcltmdWxsLnNpemUoKV0pOwotCQkJCWlmICghaW5oZXJpdGVkLmlzRW1wdHkoKSkKLQkJCQkJY3JlYXRlRXZlbnRBcnJheShpbmhlcml0ZWQpOyAvLyBUaGlzIGlzIGFjdHVhbGx5IGEgbGlzdCBvZiB0aG9zZSBOT1QgaW5oZXJpdGVkLgotCQkJfQotCQl9Ci0KLQkJaWYgKChkb0ZsYWdzICYgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19NRVRIT0RTKSAhPSAwKSB7Ci0JCQlMaXN0IGZ1bGwgPSBhZGRBbGwoYmVhbkluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKSk7Ci0JCQlMaXN0IGluaGVyaXRlZCA9IGFkZEFsbChzdXBlckJlYW5JbmZvLmdldE1ldGhvZERlc2NyaXB0b3JzKCkpOwotCi0JCQlmTWVyZ2VJbmhlcml0ZWRNZXRob2RzID0gc3RyaXBMaXN0KGZ1bGwsIGluaGVyaXRlZCk7Ci0JCQlpZiAoZk1lcmdlSW5oZXJpdGVkTWV0aG9kcykgewotCQkJCWlmICghZnVsbC5pc0VtcHR5KCkpCi0JCQkJCWZNZXRob2RzID0gKE1ldGhvZERlc2NyaXB0b3JbXSkgZnVsbC50b0FycmF5KG5ldyBNZXRob2REZXNjcmlwdG9yW2Z1bGwuc2l6ZSgpXSk7Ci0JCQkJaWYgKCFpbmhlcml0ZWQuaXNFbXB0eSgpKQotCQkJCQljcmVhdGVNZXRob2RFbnRyaWVzKGluaGVyaXRlZCk7IC8vIFRoaXMgaXMgYWN0dWFsbHkgYSBsaXN0IG9mIHRob3NlIE5PVCBpbmhlcml0ZWQuCi0JCQl9Ci0JCX0KLQotCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX1BST1BFUlRJRVMpICE9IDApIHsKLQkJCUxpc3QgZnVsbCA9IGFkZEFsbChiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkpOwotCQkJTGlzdCBpbmhlcml0ZWQgPSBhZGRBbGwoc3VwZXJCZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkpOwotCi0JCQlmTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzID0gc3RyaXBMaXN0KGZ1bGwsIGluaGVyaXRlZCk7Ci0JCQlpZiAoZk1lcmdlSW5oZXJpdGVkUHJvcGVydGllcykgewotCQkJCWlmICghZnVsbC5pc0VtcHR5KCkpCi0JCQkJCWZQcm9wZXJ0aWVzID0gKFByb3BlcnR5RGVzY3JpcHRvcltdKSBmdWxsLnRvQXJyYXkobmV3IFByb3BlcnR5RGVzY3JpcHRvcltmdWxsLnNpemUoKV0pOwotCQkJCWlmICghaW5oZXJpdGVkLmlzRW1wdHkoKSkKLQkJCQkJY3JlYXRlUHJvcGVydHlBcnJheShpbmhlcml0ZWQpOyAvLyBUaGlzIGlzIGFjdHVhbGx5IGEgbGlzdCBvZiB0aG9zZSBOT1QgaW5oZXJpdGVkLgotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXZlbnRBcnJheShMaXN0IGZlYXR1cmVzKSB7Ci0JCWZOb3RJbmhlcml0ZWRFdmVudFNldHMgPSBjcmVhdGVEZXNjcmlwdG9yTmFtZXMoZmVhdHVyZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1ldGhvZEVudHJpZXMoTGlzdCBmZWF0dXJlcykgewotCQlpbnQgcyA9IGZlYXR1cmVzLnNpemUoKTsKLQkJZk5vdEluaGVyaXRlZE1ldGhvZHMgPSBuZXcgU3RyaW5nW3NdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJZk5vdEluaGVyaXRlZE1ldGhvZHNbaV0gPSBsb25nTmFtZSgoTWV0aG9kRGVzY3JpcHRvcikgZmVhdHVyZXMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbG9uZ05hbWUoTWV0aG9kRGVzY3JpcHRvciBtZCkgewotCQlTdHJpbmcgbiA9IG1kLmdldE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihuLmxlbmd0aCgpICsgMjApOwotCQlzYi5hcHBlbmQobik7Ci0JCXNiLmFwcGVuZCgnOicpOwotCQlNZXRob2QgbSA9IG1kLmdldE1ldGhvZCgpOwotCQlzYi5hcHBlbmQobS5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJQ2xhc3NbXSBwYXJtcyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtcy5sZW5ndGg7IGorKykgewotCQkJaWYgKGogPiAwKQotCQkJCXNiLmFwcGVuZCgnLCcpOwotCQkJaWYgKCFwYXJtc1tqXS5pc0FycmF5KCkpCi0JCQkJc2IuYXBwZW5kKHBhcm1zW2pdLmdldE5hbWUoKS5yZXBsYWNlKCckJywgJy4nKSk7Ci0JCQllbHNlIHsKLQkJCQlDbGFzcyBmaW5hbFR5cGUgPSBwYXJtc1tqXS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJaW50IGluc3J0ID0gc2IubGVuZ3RoKCk7Ci0JCQkJd2hpbGUgKGZpbmFsVHlwZS5pc0FycmF5KCkpIHsKLQkJCQkJc2IuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZpbmFsVHlwZSA9IGZpbmFsVHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJfQotCQkJCXNiLmluc2VydChpbnNydCwgZmluYWxUeXBlLmdldE5hbWUoKS5yZXBsYWNlKCckJywgJy4nKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvcGVydHlBcnJheShMaXN0IGZlYXR1cmVzKSB7Ci0JCWZOb3RJbmhlcml0ZWRQcm9wZXJ0aWVzID0gY3JlYXRlRGVzY3JpcHRvck5hbWVzKGZlYXR1cmVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY3JlYXRlRGVzY3JpcHRvck5hbWVzKExpc3QgZmVhdHVyZXMpIHsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tmZWF0dXJlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gKChGZWF0dXJlRGVzY3JpcHRvcikgZmVhdHVyZXMuZ2V0KGkpKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBhZGRBbGwoT2JqZWN0W10gc2V0KSB7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KHNldC5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHsKLQkJCQlsLmFkZChzZXRbaV0pOwotCQkJfQotCQkJcmV0dXJuIGw7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZW4gYWxsIG9mIHRoZSBzdXBlciBjbGFzcydzIGV2ZW50cyBzaG91bGQgYmUgbWVyZ2VkIGluLiBJZiBpdCByZXR1cm5zIGZhbHNlLCB0aGVuIHRoZSBldmVudHMgcmV0dXJuZWQgYXJlIGl0LCB0aGVyZSBhcmUKLQkgKiBubyBvdGhlcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZUluaGVyaXRlZEV2ZW50cygpIHsKLQkJcmV0dXJuIGZNZXJnZUluaGVyaXRlZEV2ZW50czsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlbiBhbGwgb2YgdGhlIHN1cGVyIGNsYXNzJ3MgbWV0aG9kcyBzaG91bGQgYmUgbWVyZ2VkIGluLiBJZiBpdCByZXR1cm5zIGZhbHNlLCB0aGVuIHRoZSBtZXRob2RzIHJldHVybmVkIGFyZSBpdCwgdGhlcmUKLQkgKiBhcmUgbm8gb3RoZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VJbmhlcml0ZWRNZXRob2RzKCkgewotCQlyZXR1cm4gZk1lcmdlSW5oZXJpdGVkTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlbiBhbGwgb2YgdGhlIHN1cGVyIGNsYXNzJ3MgcHJvcGVydGllcyBzaG91bGQgYmUgbWVyZ2VkIGluLiBJZiBpdCByZXR1cm5zIGZhbHNlLCB0aGVuIHRoZSBwcm9wZXJ0aWVzIHJldHVybmVkIGFyZSBpdCwKLQkgKiB0aGVyZSBhcmUgbm8gb3RoZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZk1lcmdlSW5oZXJpdGVkUHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgQmVhbkluZm9bXSBnZXRBZGRpdGlvbmFsQmVhbkluZm8oKSB7Ci0JCXJldHVybiBmVGFyZ2V0QmVhbkluZm8uZ2V0QWRkaXRpb25hbEJlYW5JbmZvKCk7Ci0JfQotCi0JcHVibGljIEJlYW5EZXNjcmlwdG9yIGdldEJlYW5EZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZlRhcmdldEJlYW5JbmZvLmdldEJlYW5EZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIEV2ZW50U2V0RGVzY3JpcHRvcltdIGdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBmTWVyZ2VJbmhlcml0ZWRFdmVudHMgPyBmRXZlbnRTZXRzIDogZlRhcmdldEJlYW5JbmZvLmdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKTsKLQl9Ci0KLQlwdWJsaWMgamF2YS5hd3QuSW1hZ2UgZ2V0SWNvbihpbnQgaWNvbktpbmQpIHsKLQkJcmV0dXJuIGZUYXJnZXRCZWFuSW5mby5nZXRJY29uKGljb25LaW5kKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRGVzY3JpcHRvcltdIGdldE1ldGhvZERlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZk1lcmdlSW5oZXJpdGVkTWV0aG9kcyA/IGZNZXRob2RzIDogZlRhcmdldEJlYW5JbmZvLmdldE1ldGhvZERlc2NyaXB0b3JzKCk7Ci0JfQotCi0JcHVibGljIFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBmTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzID8gZlByb3BlcnRpZXMgOiBmVGFyZ2V0QmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmhlcml0ZWRFdmVudFNldERlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZk5vdEluaGVyaXRlZEV2ZW50U2V0czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Tm90SW5oZXJpdGVkTWV0aG9kRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBmTm90SW5oZXJpdGVkTWV0aG9kczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGZOb3RJbmhlcml0ZWRQcm9wZXJ0aWVzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUtleShGZWF0dXJlRGVzY3JpcHRvciBmZWF0dXJlKSB7Ci0JCXJldHVybiBmZWF0dXJlIGluc3RhbmNlb2YgTWV0aG9kRGVzY3JpcHRvciA/IGxvbmdOYW1lKChNZXRob2REZXNjcmlwdG9yKSBmZWF0dXJlKSA6IGZlYXR1cmUuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogU3RyaXAgdGhlIGxpc3QgZG93biB1c2luZyB0aGUgRXF1YWxpdHkgb2JqZWN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpcExpc3QoTGlzdCBmdWxsTGlzdCwgTGlzdCBpbmhlcml0ZWRMaXN0KSB7Ci0JCS8vIFRoZSBwcm9jZXNzIGlzIHRvIGNyZWF0ZSBhIGJvb2xlYW4gbGlzdCBtaXJyb3JpbmcgdGhlIGluaGVyaXRlZExpc3QuCi0JCS8vIFRoaXMgYm9vbGVhbiBsaXN0IGluZGljYXRlcyBpZiB0aGUgY29ycmVzcG9uZGluZyAoYnkgaW5kZXgpCi0JCS8vIGVudHJ5IGZyb20gdGhlIGluaGVyaXRlZExpc3QgaXMgdG8gYmUgcmV0YWluZWQgaW4gdGhlIGZpbmFsIGNvbXB1dGVkCi0JCS8vIGxpc3QuCi0JCS8vCi0JCS8vIEEgSGFzaG1hcCBpcyBjcmVhdGVkIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGNvbXB1dGVkS2V5IGZyb20gdGhlIGluaGVyaXRlZExpc3QKLQkJLy8gYW5kIHRoZSB2YWx1ZSBpcyB0aGUgaW5kZXggaW50byB0aGUgaW5oZXJpdGVkTGlzdC4gVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiBxdWlja2x5IGRldGVybWluZSBpZiB0aGUKLQkJLy8gZW50cnkgaXMgbWF0Y2hpbmcuCi0JCS8vCi0JCS8vIFRoZW4gdGhlIGZ1bGxMaXN0IHdpbGwgYmUgc3RlcHBlZCB0aHJvdWdoIGFuZCBzZWUgaWYgdGhlcmUgaXMKLQkJLy8gYW4gZW50cnkgaW4gdGhlIEhhc2htYXAgZm9yIGl0LiBJZiB0aGVyZSBpcyBhbiBlbnRyeSwgdGhlbgotCQkvLyB0aGUgZW50cnkgaXMgY2hlY2tlZCB0byBzZWUgaWYgaXQgaXMgc2VtYW50aWNhbGx5IGVxdWFsLgotCQkvLyBJZiBpdCBpcywgdGhlbiB0aGUgYm9vbGVhbiBsaXN0IGVudHJ5IGlzIG1hcmtlZCBzbyB0aGF0Ci0JCS8vIHRoZSBpbmhlcml0ZWRMaXN0IGVudHJ5IHdpbGwgYmUgcmV0YWluZWQsIHRoZSBmdWxsTGlzdCBlbnRyeSByZW1vdmVkIGFuZCB0aGUgY291bnRlcgotCQkvLyBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGluaGVyaXRlZExpc3QgY29weSBpcyBpbmNyZW1lbnRlZC4KLQkJLy8gSWYgdGhleSBhcmVuJ3Qgc2VtYW50aWNhbGx5IGVxdWFsLCB0aGVuIHdlIGtub3cgdGhhdCB0aGlzIGlzCi0JCS8vIGFuIG92ZXJyaWRlLiBJbiB0aGF0IGNhc2UsIHRoZSBmdWxsTGlzdCBlbnRyeSBpcyBrZXB0LCB0aGUgaW5oZXJpdGVkTGlzdAotCQkvLyBlbnRyeSBpcyBub3QgcmV0YWluZWQsIGJ1dCB3ZSBkb24ndCBwcmV2ZW50IG1lcmdlIGxhdGVyLgotCQkvLwotCQkvLyBJZiB0aGUgZnVsbExpc3QgZW50cnkgaXMgbm90IGZvdW5kIGluIHRoZSBIYXNoTWFwLCB0aGVuIHdlIGtub3cgaXQgaXMgbm90Ci0JCS8vIGZyb20gdGhlIGluaGVyaXRlZExpc3QsIHNvIGl0IHdpbGwgYmUgcmV0YWluZWQgaW4gdGhlIGZ1bGxMaXN0LgotCQkvLwotCQkvLyBJZiB3ZSBnZXQgYWxsIG9mIHRoZSB3YXkgdGhyb3VnaCwgdGhlbiB3ZSBrbm93IHRoYXQgd2hhdCBpcyBsZWZ0Ci0JCS8vIGluIGZ1bGxMaXN0IGlzIGp1c3QgdGhpcyBsZXZlbC4KLQkJLy8KLQkJLy8gV2hlbiB3ZSByZXR1cm4gd2Uga25vdyB0aGF0Ci0JCS8vICAgYSkgZnVsbExpc3QgaGFzIG9ubHkgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGZvdW5kIGF0IHRoZSBsb2NhbCBsZXZlbAotCQkvLyAgIGIpIGluaGVyaXRlZExpc3QgaWYgbm90IGVtcHR5IGNvbnRhaW5zIHRoZSBvbmVzIGZyb20gc3VwZXIgdGhhdCBTSE9VTEQgTk9UIGJlIGluaGVyaXRlZC4KLQkJLy8gICAgICBJZiBpdCBpcyBlbXB0eSwgdGhlbiBpZiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUsIHRoZW4gQUxMIHNob3VsZCBiZSBpbmhlcml0ZWQsCi0JCS8vICAgICAgb3IgaWYgdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSwgdGhlbiBpdCBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIHdlIGFyZW4ndCBtZXJnaW5nIGFueS4KLQkJLy8KLQkJLy8gQWxsIG9mIHRoaXMgaXMgYmFzZWQgdXBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBsaXN0IGNhbgotCQkvLyBnZXQgcXVpdGUgbGFyZ2UgKHdoaWNoIGl0IGRvZXMgZm9yIGphdmF4LnN3aW5nKSBhbmQgdGhhdAotCQkvLyBhIHNpbXBsZSBuLXNxdWFyZWQgb3JkZXIgc2VhcmNoIHdvdWxkIGJlIHRvbyBzbG93LgotCi0JCWlmIChmdWxsTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsgLy8gVGhlcmUgYXJlIG5vbmUgaW4gdGhlIGZ1bGwgbGlzdCwgc28gdGhlcmUgc2hvdWxkIGJlIG5vbmUsIGFuZCBkb24ndCBtZXJnZS4KLQkJfSBlbHNlIGlmIChpbmhlcml0ZWRMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsgLy8gVGhlcmUgYXJlIG5vIGluaGVyaXRlZExpc3QgZmVhdHVyZXMsIHNvIHRyZWF0IGFzIG5vIG1lcmdlLgotCi0JCS8vIFdlIGhhdmUgc29tZSBmZWF0dXJlcyBhbmQgc29tZSBpbmhlcml0ZWRMaXN0IGZlYXR1cmVzLCBzbyB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGxpc3RzLgotCi0JCS8vIENyZWF0ZSBhIHdvcmtpbmcgY29weSBvZiB0aGUgRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSBmb3IgZnVsbExpc3QgYW5kIHN0cmlwTGlzdCBhbmQganVzdCByZXVzZSB0aGVtCi0JCUZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkgd29ya2luZ1N0cmlwID0gRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eS5jcmVhdGVFcXVhbGl0eSgoRmVhdHVyZURlc2NyaXB0b3IpIGluaGVyaXRlZExpc3QuZ2V0KDApKTsKLQkJRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSB3b3JraW5nRnVsbCA9IEZlYXR1cmVEZXNjcmlwdG9yRXF1YWxpdHkuY3JlYXRlRXF1YWxpdHkoKEZlYXR1cmVEZXNjcmlwdG9yKSBmdWxsTGlzdC5nZXQoMCkpOwotCi0JCWludCBpbmhlcml0ZWRTaXplID0gaW5oZXJpdGVkTGlzdC5zaXplKCk7Ci0JCWJvb2xlYW5bXSBjb3B5ID0gbmV3IGJvb2xlYW5baW5oZXJpdGVkU2l6ZV07Ci0KLQkJSGFzaE1hcCBpbmhlcml0ZWRNYXAgPSBuZXcgSGFzaE1hcChpbmhlcml0ZWRTaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmhlcml0ZWRTaXplOyBpKyspIHsKLQkJCUZlYXR1cmVEZXNjcmlwdG9yIGYgPSAoRmVhdHVyZURlc2NyaXB0b3IpIGluaGVyaXRlZExpc3QuZ2V0KGkpOwotCQkJU3RyaW5nIGtleSA9IGNvbXB1dGVLZXkoZik7Ci0JCQlPYmplY3QgdmFsdWUgPSBpbmhlcml0ZWRNYXAuZ2V0KGtleSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQlpbmhlcml0ZWRNYXAucHV0KGtleSwgbmV3IEludGVnZXIoaSkpOwotCQkJZWxzZSB7Ci0JCQkJLy8gU2hvdWxkbid0IG9jY3VyLgotCQkJfQotCi0JCX0KLQotCQkvLyBXaGVuIHdlIGFyZSBkb25lIHdpdGggdGhpcyBwcm9jZXNzaW5nLCBpbmhlcml0ZWRMaXN0IHdpbGwgY29udGFpbiB0aGUgc3VwZXIgdGhhdCBzaG91bGQgbm90IGJlIHVzZWQsIGFuZCBmdWxsIGxpc3Qgd2lsbCBjb250YWluIG9ubHkgdGhlIGxvY2FscwotCQkvLyAodGhvc2UgZGVmaW5lZCBhdCB0aGlzIGNsYXNzIGxldmVsKS47Ci0JCWludCBpbmhlcml0ZWRSZXRhaW5lZCA9IDA7Ci0JCUl0ZXJhdG9yIGZ1bGxJdHIgPSBmdWxsTGlzdC5pdGVyYXRvcigpOwotCQkvLyBDb250aW51ZSB3aGlsZSB3ZSd2ZSByZXRhaW5lZCBsZXNzIHRoYW4gdGhlIGZ1bGwgc3VwZXIgYW1vdW50LiBJZiB3ZSd2ZSByZXRhaW5lZCBhbGwgb2YgdGhlIGluaGVyaXRlZExpc3QsIHRoZXJlIGlzIG5vCi0JCS8vIG5lZWQgdG8gY29udGludWUgcHJvY2Vzc2luZyB0aGUgZnVsbExpc3QgYmVjYXVzZSB0aGVyZSBjYW4ndCBwb3NzaWJseSBiZSBhbnkgaW5oZXJpdGVkTGlzdCBlbnRyaWVzIGxlZnQgdG8gZmluZC4KLQkJd2hpbGUgKGluaGVyaXRlZFJldGFpbmVkIDwgaW5oZXJpdGVkU2l6ZSAmJiBmdWxsSXRyLmhhc05leHQoKSkgewotCQkJRmVhdHVyZURlc2NyaXB0b3IgZiA9IChGZWF0dXJlRGVzY3JpcHRvcikgZnVsbEl0ci5uZXh0KCk7Ci0JCQlib29sZWFuIGZvdW5kRnVsbCA9IGZhbHNlOwotCQkJT2JqZWN0IGluZGV4ID0gaW5oZXJpdGVkTWFwLmdldChjb21wdXRlS2V5KGYpKTsKLQkJCWlmIChpbmRleCAhPSBudWxsKSB7Ci0JCQkJd29ya2luZ0Z1bGwuc2V0RmVhdHVyZShmKTsKLQkJCQlpbnQgbmR4ID0gKChJbnRlZ2VyKSBpbmRleCkuaW50VmFsdWUoKTsKLQkJCQl3b3JraW5nU3RyaXAuc2V0RmVhdHVyZSgoRmVhdHVyZURlc2NyaXB0b3IpIGluaGVyaXRlZExpc3QuZ2V0KG5keCkpOwotCQkJCWlmICh3b3JraW5nRnVsbC5lcXVhbHMod29ya2luZ1N0cmlwKSkgewotCQkJCQkvLyBUaGV5IGFyZSBzZW1hbnRpY2FsbHkgaWRlbnRpY2FsLCBzbyByZXRhaW4gaW4gdGhlIGluaGVyaXRlZExpc3QuCi0JCQkJCWNvcHlbbmR4XSA9IHRydWU7Ci0JCQkJCWZvdW5kRnVsbCA9IHRydWU7Ci0JCQkJCWluaGVyaXRlZFJldGFpbmVkKys7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZm91bmRGdWxsKSB7Ci0JCQkJLy8gV2UgZm91bmQgdGhlIGluaGVyaXRlZExpc3QgZW50cnkgc2VtYW50aWNhbGx5IGVxdWFsIGluIHRoZSBmdWxsIGxpc3Qgc29tZXdoZXJlLCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZnVsbCBlbnRyeS4KLQkJCQlmdWxsSXRyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGluaGVyaXRlZFJldGFpbmVkID09IGluaGVyaXRlZFNpemUpIHsKLQkJCWluaGVyaXRlZExpc3QuY2xlYXIoKTsgLy8gQWxsIHdlcmUgZm91bmQgaW4gaW5oZXJpdGVkTGlzdCwgc28ganVzdCBjbGVhciB0aGUgaW5oZXJpdGVkTGlzdCBhbmQgcmV0dXJuIGp1c3Qgd2hhdCB3YXMgbGVmdCBpbiB0aGUgZm91bmQuCi0JCQkJCQkJCSAgIC8vIFRob3NlIGluIGZ1bGwgZm91bmQgaW4gc3VwZXIgaGFkIGJlZW4gcmVtb3ZlZCBmcm9tIGZ1bGwgZHVyaW5nIHRoZSBwcm9jZXNzaW5nLgotCQkJcmV0dXJuIHRydWU7IC8vIFdlIG1lcmdlIHdpdGggYWxsIGluaGVyaXRlZC4gCi0JCX0gZWxzZQlpZiAoaW5oZXJpdGVkUmV0YWluZWQgIT0gMCkgewotCQkJLy8gU29tZSB3ZXJlIHJldGFpbmVkLCB0YWtlIG91dCBvZiB0aGUgbGlzdCB0aG9zZSB0aGF0IHdlcmUgcmV0YWluZWQuCi0JCQkvLyBXaGVuIGRvbmUgdGhlIGxpc3Qgd2lsbCBjb250YWluIHRob3NlIHRoYXQgc2hvdWxkIGJlIGRyb3BwZWQgZnJvbSB0aGUgaW5oZXJpdGVkIGxpc3QuCi0JCQkvLyBXZSBzdGFydCBmcm9tIGVuZCBiZWNhdXNlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIG1vdmVkIG92ZXJhbGwgd2lsbCBiZSBsZXNzIHRoYW4gaWYgd2Ugc3RhcnRlZCBmcm9tIHRoZSBmcm9udC4KLQkJCWZvciAoTGlzdEl0ZXJhdG9yIGl0ciA9IGluaGVyaXRlZExpc3QubGlzdEl0ZXJhdG9yKGluaGVyaXRlZExpc3Quc2l6ZSgpKTsgaXRyLmhhc1ByZXZpb3VzKCk7KSB7Ci0JCQkJaW50IGkgPSBpdHIucHJldmlvdXNJbmRleCgpOwotCQkJCWl0ci5wcmV2aW91cygpOwkvLyBUbyBiYWNrIHVwIHRoZSBpdHIgc28gdGhhdCByZW1vdmUgY2FuIHJlbW92ZSBpdC4gV2UgYWN0dWFsbHkgZG9uJ3QgY2FyZSB3aGF0IHRoZSB2YWx1ZSBpcy4KLQkJCQlpZiAoY29weVtpXSkKLQkJCQkJaXRyLnJlbW92ZSgpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7CS8vIFdlIG1lcmdlLCBhbmQgdGhlIGxpc3QgaXMgbm90IGVtcHR5IGJ1dCBpdCBkaWQgaGF2ZSBzb21lIHJlbW92ZWQsIHNvIHdlIGxlYXZlIHRoZSBsaXN0IGFsb25lLiBUaG9zZSBhcmUgbm90IGluaGVyaXRlZC4KLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7CS8vIEFsbCB3ZXJlIHJlbW92ZWQgKHJldGFpbmVkID09IDApLiBOb25lIHdlcmUgcmV0YWluZWQuIFNvIHdlIGp1c3QgZG9uJ3QgZG8gYSBtZXJnZS4gVGhlIGxpc3Qgd2lsbCBiZSBpZ25vcmVkLgotCX0KLQotCS8vIFRoZSBtb2RlbGluZyBiZWFuaW5mbyBpcyBhbHNvIHVzZWQgdG8gc2VuZCBpdHNlbGYgYmFjayBpbiBzZXJpYWxpemVkIG1vZGUgYXMgYSBjYWxsYmFjay4KLQotCXByaXZhdGUgSVZNQ2FsbGJhY2tTZXJ2ZXIgdm1TZXJ2ZXI7Ci0KLQlwcml2YXRlIGludCBjYWxsYmFja0lEOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLklDYWxsYmFjayNpbml0aWFsaXplQ2FsbGJhY2sob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1TZXJ2ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQ2FsbGJhY2soSVZNQ2FsbGJhY2tTZXJ2ZXIgdm1TZXJ2ZXIsIGludCBjYWxsYmFja0lEKSB7Ci0JCXRoaXMudm1TZXJ2ZXIgPSB2bVNlcnZlcjsKLQkJdGhpcy5jYWxsYmFja0lEID0gY2FsbGJhY2tJRDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChkb0ZsYWdzICE9IDApIHsKLQkJCU9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKHZtU2VydmVyLnJlcXVlc3RTdHJlYW0oY2FsbGJhY2tJRCwgMCkpOwotCQkJaWYgKChkb0ZsYWdzICYgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19CRUFOX0RFQ09SKSAhPSAwKQotCQkJCXNlbmRCZWFuRGVjb3JhdG9yKHN0cmVhbSk7Ci0JCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX1BST1BFUlRJRVMpICE9IDApCi0JCQkJc2VuZFByb3BlcnR5RGVjb3JhdG9ycyhzdHJlYW0pOwotCQkJaWYgKChkb0ZsYWdzICYgSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET19NRVRIT0RTKSAhPSAwKQotCQkJCXNlbmRNZXRob2REZWNvcmF0b3JzKHN0cmVhbSk7Ci0JCQlpZiAoKGRvRmxhZ3MgJiBJQmVhbkluZm9JbnRyb3NwZWN0aW9uQ29uc3RhbnRzLkRPX0VWRU5UUykgIT0gMCkKLQkJCQlzZW5kRXZlbnREZWNvcmF0b3JzKHN0cmVhbSk7Ci0JCQlzdHJlYW0ud3JpdGVJbnQoSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5ET05FKTsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IElERSB0byBzZW5kIHRoZSBiZWFuIGRlY29yYXRvciBpbmZvcm1hdGlvbiBiYWNrIHRocm91Z2ggdGhlIGNhbGxiYWNrLgotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kQmVhbkRlY29yYXRvcihPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbW1hbmRFeGNlcHRpb24gewotCQlCZWFuUmVjb3JkIGJyID0gbmV3IEJlYW5SZWNvcmQoKTsKLQkJQmVhbkRlc2NyaXB0b3IgYmQgPSBnZXRCZWFuRGVzY3JpcHRvcigpOwotCi0JCWlmIChiZCAhPSBudWxsKSB7Ci0JCQlici5jdXN0b21pemVyQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKGJkLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCWJyLm1lcmdlSW5oZXJpdGVkUHJvcGVydGllcyA9IGlzTWVyZ2VJbmhlcml0ZWRQcm9wZXJ0aWVzKCk7Ci0JCQlici5tZXJnZUluaGVyaXRlZE9wZXJhdGlvbnMgPSBpc01lcmdlSW5oZXJpdGVkTWV0aG9kcygpOwotCQkJYnIubWVyZ2VJbmhlcml0ZWRFdmVudHMgPSBpc01lcmdlSW5oZXJpdGVkRXZlbnRzKCk7Ci0JCQlici5ub3RJbmhlcml0ZWRQcm9wZXJ0eU5hbWVzID0gZ2V0Tm90SW5oZXJpdGVkUHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQkJYnIubm90SW5oZXJpdGVkT3BlcmF0aW9uTmFtZXMgPSBnZXROb3RJbmhlcml0ZWRNZXRob2REZXNjcmlwdG9ycygpOwotCQkJYnIubm90SW5oZXJpdGVkRXZlbnROYW1lcyA9IGdldE5vdEluaGVyaXRlZEV2ZW50U2V0RGVzY3JpcHRvcnMoKTsKLQkJCWZpbGwoYmQsIGJyLCBCRUFOX1JFQ09SRF9UWVBFKTsKLQkJfQotCQlzdHJlYW0ud3JpdGVJbnQoSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5CRUFOX0RFQ09SQVRPUl9TRU5UKTsKLQkJc3RyZWFtLndyaXRlT2JqZWN0KGJyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgSURFIHRvIHNlbmQgdGhlIHByb3BlcnR5IGRlY29yYXRvcnMgaW5mb3JtYXRpb24gYmFjayB0aHJvdWdoIHRoZSBjYWxsYmFjay4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2VuZFByb3BlcnR5RGVjb3JhdG9ycyhPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbW1hbmRFeGNlcHRpb24gewotCQlQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMubGVuZ3RoID4gMCkgewotCQkJLy8gTm93IHN0YXJ0IHdyaXRpbmcgdGhlIHJlY29yZHMuCi0JCQlzdHJlYW0ud3JpdGVJbnQoSUJlYW5JbmZvSW50cm9zcGVjdGlvbkNvbnN0YW50cy5QUk9QRVJUWV9ERUNPUkFUT1JTX1NFTlQpOwotCQkJc3RyZWFtLndyaXRlSW50KHByb3BlcnRpZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotCQkJCVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IHByb3BlcnRpZXNbaV07Ci0JCQkJLy8gTXVjaCBvZiB0aGUgdHdvIHR5cGVzIGFyZSBjb21tb24sIHNvIGlmIGluZGV4ZWQsIGZpbGwgaW4gdGhlIGluZGV4IHBhcnQgYW5kIHRoZW4gcGFzcyBvbiB0byBwcm9wZXJ0eSBwYXJ0LgotCQkJCVByb3BlcnR5UmVjb3JkIHVzZXByID0gbnVsbDsKLQkJCQlpbnQgdXNlVHlwZSA9IDA7Ci0JCQkJaWYgKHBkLmdldENsYXNzKCkgPT0gSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvci5jbGFzcykgewotCQkJCQlJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yIGlwZCA9IChJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSBwZDsKLQkJCQkJSW5kZXhlZFByb3BlcnR5UmVjb3JkIGlwciA9IG5ldyBJbmRleGVkUHJvcGVydHlSZWNvcmQoKTsKLQkJCQkJdXNlcHIgPSBpcHI7Ci0JCQkJCXVzZVR5cGUgPSBJTkRFWEVEUFJPUEVSVFlfUkVDT1JEX1RZUEU7Ci0JCQkJCWlwci5pbmRleGVkUmVhZE1ldGhvZCA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZChpcGQuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKSk7Ci0JCQkJCWlwci5pbmRleGVkV3JpdGVNZXRob2QgPSBnZXRSZWZsZWN0ZWRNZXRob2RSZWNvcmQoaXBkLmdldEluZGV4ZWRXcml0ZU1ldGhvZCgpKTsKLQkJCQkJaXByLmluZGV4ZWRQcm9wZXJ0eVR5cGVOYW1lID0gZ2V0Q2xhc3NOYW1lKGlwZC5nZXRJbmRleGVkUHJvcGVydHlUeXBlKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVzZXByID0gbmV3IFByb3BlcnR5UmVjb3JkKCk7Ci0JCQkJCXVzZVR5cGUgPSBQUk9QRVJUWV9SRUNPUkRfVFlQRTsKLQkJCQl9Ci0JCQkJdXNlcHIucHJvcGVydHlFZGl0b3JDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocGQuZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpKTsKLQkJCQl1c2Vwci5wcm9wZXJ0eVR5cGVOYW1lID0gZ2V0Q2xhc3NOYW1lKHBkLmdldFByb3BlcnR5VHlwZSgpKTsKLQkJCQl1c2Vwci5yZWFkTWV0aG9kID0gZ2V0UmVmbGVjdGVkTWV0aG9kUmVjb3JkKHBkLmdldFJlYWRNZXRob2QoKSk7Ci0JCQkJdXNlcHIud3JpdGVNZXRob2QgPSBnZXRSZWZsZWN0ZWRNZXRob2RSZWNvcmQoKHBkLmdldFdyaXRlTWV0aG9kKCkpKTsKLQkJCQl1c2Vwci5ib3VuZCA9IHBkLmlzQm91bmQoKTsKLQkJCQl1c2Vwci5jb25zdHJhaW5lZCA9IHBkLmlzQ29uc3RyYWluZWQoKTsKLQkJCQl1c2Vwci5kZXNpZ25UaW1lID0gbnVsbDsKLQkJCQl1c2Vwci5maWVsZCA9IG51bGw7Ci0JCQkJZmlsbChwZCwgdXNlcHIsIHVzZVR5cGUpOwotCQkJCXN0cmVhbS53cml0ZU9iamVjdCh1c2Vwcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgSURFIHRvIHNlbmQgdGhlIG1ldGhvZCBkZWNvcmF0b3JzIGluZm9ybWF0aW9uIGJhY2sgdGhyb3VnaCB0aGUgY2FsbGJhY2suCi0JICogCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRNZXRob2REZWNvcmF0b3JzKE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZERlc2NyaXB0b3JbXSBtZXRob2RzID0gZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKTsKLQkJaWYgKG1ldGhvZHMgIT0gbnVsbCAmJiBtZXRob2RzLmxlbmd0aCA+IDApIHsKLQkJCS8vIE5vdyBzdGFydCB3cml0aW5nIHRoZSByZWNvcmRzLgotCQkJc3RyZWFtLndyaXRlSW50KElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuTUVUSE9EX0RFQ09SQVRPUlNfU0VOVCk7Ci0JCQlzdHJlYW0ud3JpdGVJbnQobWV0aG9kcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTWV0aG9kUmVjb3JkIG1yID0gbmV3IE1ldGhvZFJlY29yZCgpOwotCQkJCWZpbGwobXIsIG1ldGhvZHNbaV0pOwotCQkJCXN0cmVhbS53cml0ZU9iamVjdChtcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaWxsIGluIGEgTWV0aG9kUmVjb3JkIGZyb20gdGhlIE1ldGhvZERlc2NyaXB0b3IuCi0JICogQHBhcmFtIG1yCi0JICogQHBhcmFtIG1kCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbChNZXRob2RSZWNvcmQgbXIsIE1ldGhvZERlc2NyaXB0b3IgbWQpIHsKLQkJbXIubWV0aG9kRm9yRGVzY3JpcHRvciA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZChtZC5nZXRNZXRob2QoKSk7Ci0JCVBhcmFtZXRlckRlc2NyaXB0b3JbXSBwYXJtcyA9IG1kLmdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0JCWlmIChwYXJtcyA9PSBudWxsKQotCQkJbXIucGFyYW1ldGVycyA9IG51bGw7Ci0JCWVsc2UgewotCQkJbXIucGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJSZWNvcmRbcGFybXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFybXMubGVuZ3RoOyBqKyspIHsKLQkJCQlQYXJhbWV0ZXJSZWNvcmQgcHIgPSBuZXcgUGFyYW1ldGVyUmVjb3JkKCk7Ci0JCQkJZmlsbChwYXJtc1tqXSwgcHIsIFBBUkFNRVRFUl9SRUNPUkRfVFlQRSk7Ci0JCQkJbXIucGFyYW1ldGVyc1tqXSA9IHByOwotCQkJfQotCQl9Ci0JCWZpbGwobWQsIG1yLCBNRVRIT0RfUkVDT1JEX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBJREUgdG8gc2VuZCB0aGUgZXZlbnQgc2V0IGRlY29yYXRvcnMgaW5mb3JtYXRpb24gYmFjayB0aHJvdWdoIHRoZSBjYWxsYmFjay4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgc2VuZEV2ZW50RGVjb3JhdG9ycyhPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtICkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJRXZlbnRTZXREZXNjcmlwdG9yW10gZXZlbnRzID0gZ2V0RXZlbnRTZXREZXNjcmlwdG9ycygpOwotCQlpZiAoZXZlbnRzICE9IG51bGwgJiYgZXZlbnRzLmxlbmd0aCA+IDApIHsKLQkJCS8vIE5vdyBzdGFydCB3cml0aW5nIHRoZSByZWNvcmRzLgotCQkJc3RyZWFtLndyaXRlSW50KElCZWFuSW5mb0ludHJvc3BlY3Rpb25Db25zdGFudHMuRVZFTlRfREVDT1JBVE9SU19TRU5UKTsKLQkJCXN0cmVhbS53cml0ZUludChldmVudHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRXZlbnRTZXREZXNjcmlwdG9yIGVkID0gZXZlbnRzW2ldOwotCQkJCUV2ZW50U2V0UmVjb3JkIGVyID0gbmV3IEV2ZW50U2V0UmVjb3JkKCk7Ci0JCQkJZXIuYWRkTGlzdGVuZXJNZXRob2QgPSBnZXRSZWZsZWN0ZWRNZXRob2RSZWNvcmQoZWQuZ2V0QWRkTGlzdGVuZXJNZXRob2QoKSk7Ci0JCQkJTWV0aG9kRGVzY3JpcHRvcltdIG1kcyA9IGVkLmdldExpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMoKTsKLQkJCQlpZiAobWRzID09IG51bGwpCi0JCQkJCWVyLmxpc3RlbmVyTWV0aG9kRGVzY3JpcHRvcnMgPSBudWxsOwotCQkJCWVsc2UgewotCQkJCQllci5saXN0ZW5lck1ldGhvZERlc2NyaXB0b3JzID0gbmV3IE1ldGhvZFJlY29yZFttZHMubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWZpbGwoZXIubGlzdGVuZXJNZXRob2REZXNjcmlwdG9yc1tqXSA9IG5ldyBNZXRob2RSZWNvcmQoKSwgbWRzW2pdKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllci5saXN0ZW5lclR5cGVOYW1lID0gZ2V0Q2xhc3NOYW1lKGVkLmdldExpc3RlbmVyVHlwZSgpKTsKLQkJCQllci5yZW1vdmVMaXN0ZW5lck1ldGhvZCA9IGdldFJlZmxlY3RlZE1ldGhvZFJlY29yZChlZC5nZXRSZW1vdmVMaXN0ZW5lck1ldGhvZCgpKTsKLQkJCQllci5pbkRlZmF1bHRFdmVudFNldCA9IGVkLmlzSW5EZWZhdWx0RXZlbnRTZXQoKTsKLQkJCQllci51bmljYXN0ID0gZWQuaXNVbmljYXN0KCk7Ci0JCQkJZXIuZXZlbnRBZGFwdGVyQ2xhc3NOYW1lID0gbnVsbDsKLQkJCQlmaWxsKGVkLCBlciwgRVZFTlRTRVRfUkVDT1JEX1RZUEUpOwotCQkJCXN0cmVhbS53cml0ZU9iamVjdChlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBCRUFOX1JFQ09SRF9UWVBFID0gMDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFQ09SRF9UWVBFID0gMTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOREVYRURQUk9QRVJUWV9SRUNPUkRfVFlQRSA9IDI7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX1JFQ09SRF9UWVBFID0gMzsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQQVJBTUVURVJfUkVDT1JEX1RZUEUgPSA0OwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UU0VUX1JFQ09SRF9UWVBFID0gNTsKLQotCS8qKgotCSAqIEZpbGwgaW4gdGhlIHNwZWNpYWwgYXR0ci92YWx1ZXMgZm9yIHRoZSBnaXZlbiByZWNvcmQgdHlwZS4gVGhlIGRlZmF1bHQgaGFuZGxlcyB0aGUgc3RhbmRhcmQgb25lcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVjb3JkCi0JICogQHBhcmFtIGRlc2NyCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiBAcGFyYW0gcmVjb3JkVHlwZQotCSAqICAgICAgICAgICAgdHlwZSBvZiByZWNvcmQgdWx0aW1hdGVseSBiZWluZyBwcm9jZXNzZWQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBhIHNwZWNpYWwgb25lIGFuZCBwcm9jZXNzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3Qgc3BlY2lhbCBhbmQgc2hvdWxkIGJlIGFkZGVkIHRvCi0JICogICAgICAgICBhdHRyaWJ1dGVzIGxpc3QgdHJhbnNmZXJyZWQgdG8gSURFLgotCSAqIAotCSAqIEBzZWUgTW9kZWxpbmdCZWFuSW5mbyNQUk9QRVJUWV9SRUNPUkRfVFlQRQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZpbGxGcm9tQXR0cmlidXRlcyhGZWF0dXJlUmVjb3JkIHJlY29yZCwgRmVhdHVyZURlc2NyaXB0b3IgZGVzY3IsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgcmVjb3JkVHlwZSkgewotCQlzd2l0Y2ggKHJlY29yZFR5cGUpIHsKLQkJCWNhc2UgSU5ERVhFRFBST1BFUlRZX1JFQ09SRF9UWVBFOgotCQkJY2FzZSBQUk9QRVJUWV9SRUNPUkRfVFlQRToKLQkJCQlpZiAoQmFzZUJlYW5JbmZvLkRFU0lHTlRJTUVQUk9QRVJUWS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpIHsKLQkJCQkJKChQcm9wZXJ0eVJlY29yZCkgcmVjb3JkKS5kZXNpZ25UaW1lID0gKEJvb2xlYW4pIGRlc2NyLmdldFZhbHVlKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKEJhc2VCZWFuSW5mby5GSUVMRFBST1BFUlRZLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkgewotCQkJCQlGaWVsZCBmID0gKEZpZWxkKSBkZXNjci5nZXRWYWx1ZShhdHRyaWJ1dGVOYW1lKTsKLQkJCQkJLy8gV2UgaGF2ZSBhIGZpZWxkLCBzZXQgdGhlIHByb3BlcnR5IHR5cGUgdG8gdGhpcyBzaW5jZSB3ZSBjb3VsZG4ndCBjb3JyZWN0bHkgY3JlYXRlIHRoaXMgb3RoZXJ3aXNlLgotCQkJCQlQcm9wZXJ0eVJlY29yZCBwciA9IChQcm9wZXJ0eVJlY29yZCkgcmVjb3JkOwotCQkJCQlwci5wcm9wZXJ0eVR5cGVOYW1lID0gZ2V0Q2xhc3NOYW1lKGYuZ2V0VHlwZSgpKTsKLQkJCQkJcHIuZmllbGQgPSBnZXRSZWZsZWN0ZWRGaWVsZFJlY29yZChmKTsKLQkJCQkJcHIucmVhZE1ldGhvZCA9IG51bGw7CS8vIE5lZWQgdG8gd2lwZSBvdXQgb3VyIGR1bW15LgotCQkJCQlwci53cml0ZU1ldGhvZCA9IG51bGw7CS8vIE9yIGlmIGl0IHNldCwgbm90IHZhbGlkIGZvciBhIGZpZWxkLgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVWRU5UU0VUX1JFQ09SRF9UWVBFOgotCQkJCWlmIChCYXNlQmVhbkluZm8uRVZFTlRBREFQVEVSQ0xBU1MuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7Ci0JCQkJCSgoRXZlbnRTZXRSZWNvcmQpIHJlY29yZCkuZXZlbnRBZGFwdGVyQ2xhc3NOYW1lID0gKFN0cmluZykgZGVzY3IuZ2V0VmFsdWUoYXR0cmlidXRlTmFtZSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7IC8vIERpZG4ndCBoYW5kbGUgaXQuCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpbGwgaW4gdGhlIGZlYXR1cmUgcG9ydGlvbiBvZiB0aGUgRGVzY3JpcHRvciBpbnRvIHRoZSByZWNvcmQuIFdlIGNhbiBiZSByZXVzaW5nIHNvbWUgcmVjb3JkcyAoc28gd2UgZG9uJ3Qga2VlcCBhbGxvY2F0aW5nIHdoZW4gbm90IG5lZWRlZCksIHNvCi0JICogd2Ugd2lsbCBudWxsIG91dCB1bnNldCBmaWVsZHMuCi0JICogCi0JICogQHBhcmFtIGRlc2NyCi0JICogQHBhcmFtIHJlY29yZAotCSAqIEBwYXJhbSByZWNvcmRUeXBlCi0JICogICAgICAgICAgICB0eXBlIG9mIHJlY29yZCB1bHRpbWF0ZWx5IGJlaW5nIHByb2Nlc3NlZC4gVXNlZCBmb3IgZmlsbEZyb21BdHRyaWJ1dGVzLgotCSAqIAotCSAqIEBzZWUgTW9kZWxpbmdCZWFuSW5mbyNQUk9QRVJUWV9SRUNPUkRfVFlQRQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGwoRmVhdHVyZURlc2NyaXB0b3IgZGVzY3IsIEZlYXR1cmVSZWNvcmQgcmVjb3JkLCBpbnQgcmVjb3JkVHlwZSkgewotCQlyZWNvcmQubmFtZSA9IGRlc2NyLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRuID0gZGVzY3IuZ2V0RGlzcGxheU5hbWUoKTsKLQkJaWYgKCFyZWNvcmQubmFtZS5lcXVhbHMoZG4pKQotCQkJcmVjb3JkLmRpc3BsYXlOYW1lID0gZG47IC8vIGRpc3BsYXkgbmFtZSByZXR1cm5zIG5hbWUgaWYgZGlzcGxheSBuYW1lIG5vdCBzZXQuIFdlIGRvbid0IHdhbnQgdG8gc2VuZCBpdCBpZiBpZGVudGljYWwuIChOb3RlIHNvbWUgQmVhbmluZm9zIGFyZSBzZXR0aW5nIGRpc3BsYXluYW1lIHRoZSBzYW1lIHRleHQgYnV0IG5vdCBzYW1lIHN0cmluZykuCi0JCWVsc2UKLQkJCXJlY29yZC5kaXNwbGF5TmFtZSA9IG51bGw7Ci0JCVN0cmluZyBzaGQgPSBkZXNjci5nZXRTaG9ydERlc2NyaXB0aW9uKCk7Ci0JCWlmICghZG4uZXF1YWxzKHNoZCkpCi0JCQlyZWNvcmQuc2hvcnREZXNjcmlwdGlvbiA9IHNoZDsgLy8gc2hvcnQgZGVzY3JpcHRpb24gcmV0dXJucyBkaXNwbGF5bmFtZSBpZiBzaG9ydCBkZXNjcmlwdGlvbiBub3Qgc2V0LiBXZSBkb24ndCB3YW50IHRvIHNlbmQgaXQgaWYKLQkJCQkJCQkJCQkgICAvLyBpZGVudGljYWwuCi0JCWVsc2UKLQkJCXJlY29yZC5zaG9ydERlc2NyaXB0aW9uID0gbnVsbDsKLQkJcmVjb3JkLmV4cGVydCA9IGRlc2NyLmlzRXhwZXJ0KCk7Ci0JCXJlY29yZC5oaWRkZW4gPSBkZXNjci5pc0hpZGRlbigpOwotCQlyZWNvcmQucHJlZmVycmVkID0gZGVzY3IuaXNQcmVmZXJyZWQoKTsKLQkJcmVjb3JkLmNhdGVnb3J5ID0gbnVsbDsgLy8gQ2xlYXIgb3V0IGluIGNhc2Ugbm90IHNldC4KLQkJRW51bWVyYXRpb24gYXR0cnMgPSBkZXNjci5hdHRyaWJ1dGVOYW1lcygpOwotCQlpZiAoYXR0cnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCS8vIFdlIGRvbid0IGhhdmUgYSB3YXkgb2Yga25vd2luZyBob3cgbWFueSB0aGVyZSBhcmUgYWhlYWQgb2YgdGltZSwgc28gd2Ugd2lsbCBidWlsZCBpbnRvIGxpc3RzIGFuZCB0aGVuIHR1cm4gaW50byBhcnJheXMgYXQgdGhlIGVuZC4KLQkJCUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIGF0dHJzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGF0dHJOYW1lLmVxdWFscyhCYXNlQmVhbkluZm8uQ0FURUdPUlkpKQotCQkJCQlyZWNvcmQuY2F0ZWdvcnkgPSAoU3RyaW5nKSBkZXNjci5nZXRWYWx1ZShCYXNlQmVhbkluZm8uQ0FURUdPUlkpOwotCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscyhCYXNlQmVhbkluZm8uUFJFRkVSUkVEKSkgewotCQkJCQkvLyBBIGJ1ZyBpbiBKYXZhIDEuMywgZG9pbmcgc2V0UHJlZmVycmVkIHdhcyBsb3N0LiBTbyBmb3IgdGhvc2UgYWxzbyBzdG9yZWQgaXQgaW4gYXR0cmlidXRlcy4gU28gaWYgc2V0IGhlcmUsIHRoZW4gdXNlIGl0LgotCQkJCQlyZWNvcmQucHJlZmVycmVkID0gKChCb29sZWFuKSBkZXNjci5nZXRWYWx1ZShCYXNlQmVhbkluZm8uUFJFRkVSUkVEKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfSBlbHNlIGlmICghZmlsbEZyb21BdHRyaWJ1dGVzKHJlY29yZCwgZGVzY3IsIGF0dHJOYW1lLCByZWNvcmRUeXBlKSkgewotCQkJCQkvLyBKdXN0IGNvcHkgYWNjcm9zcy4gRmlsbGZyb21BdHRyaWJ1dGVzIGRpZG4ndCBoYW5kbGUgaXQuCi0JCQkJCUZlYXR1cmVBdHRyaWJ1dGVWYWx1ZSBmdiA9IG5ldyBGZWF0dXJlQXR0cmlidXRlVmFsdWUoKTsKLQkJCQkJZnYuc2V0VmFsdWUoZGVzY3IuZ2V0VmFsdWUoYXR0ck5hbWUpKTsKLQkJCQkJbmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJdmFsdWVzLmFkZChmdik7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFuYW1lcy5pc0VtcHR5KCkpIHsKLQkJCQlyZWNvcmQuYXR0cmlidXRlTmFtZXMgPSAoU3RyaW5nW10pIG5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lcy5zaXplKCldKTsKLQkJCQlyZWNvcmQuYXR0cmlidXRlVmFsdWVzID0gKEZlYXR1cmVBdHRyaWJ1dGVWYWx1ZVtdKSB2YWx1ZXMudG9BcnJheShuZXcgRmVhdHVyZUF0dHJpYnV0ZVZhbHVlW3ZhbHVlcy5zaXplKCldKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVjb3JkLmF0dHJpYnV0ZU5hbWVzID0gbnVsbDsKLQkJCQlyZWNvcmQuYXR0cmlidXRlVmFsdWVzID0gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlY29yZC5hdHRyaWJ1dGVOYW1lcyA9IG51bGw7Ci0JCQlyZWNvcmQuYXR0cmlidXRlVmFsdWVzID0gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIGNsYXNzbmFtZSBmcm9tIHRoZSBjbGFzcy4gSWYgY2xhc3NzIGlzIG51bGwsIHRoZW4gdGhpcyByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3MgY2xhc3NzKSB7Ci0JCXJldHVybiBjbGFzc3MgIT0gbnVsbCA/IGNsYXNzcy5nZXROYW1lKCkgOiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVmbGVjdE1ldGhvZFJlY29yZCBnZXRSZWZsZWN0ZWRNZXRob2RSZWNvcmQoTWV0aG9kIG1ldGhvZCkgewotCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCVJlZmxlY3RNZXRob2RSZWNvcmQgcm1yID0gbmV3IFJlZmxlY3RNZXRob2RSZWNvcmQoKTsKLQkJCXJtci5jbGFzc05hbWUgPSBnZXRDbGFzc05hbWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCQkJcm1yLm1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCQkJQ2xhc3NbXSBwYXJtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWlmIChwYXJtVHlwZXMubGVuZ3RoID4gMCkgewotCQkJCXJtci5wYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgU3RyaW5nW3Bhcm1UeXBlcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXJtci5wYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSBnZXRDbGFzc05hbWUocGFybVR5cGVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcm1yOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFJlZmxlY3RGaWVsZFJlY29yZCBnZXRSZWZsZWN0ZWRGaWVsZFJlY29yZChGaWVsZCBmaWVsZCkgewotCQlpZiAoZmllbGQgIT0gbnVsbCkgewotCQkJUmVmbGVjdEZpZWxkUmVjb3JkIHJmID0gbmV3IFJlZmxlY3RGaWVsZFJlY29yZCgpOwotCQkJcmYuY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCQkJcmYuZmllbGROYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotCQkJcmYucmVhZE9ubHkgPSBNb2RpZmllci5pc0ZpbmFsKGZpZWxkLmdldE1vZGlmaWVycygpKTsKLQkJCXJldHVybiByZjsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvMTUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01vZGVsaW5nQmVhbkluZm8xNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjU5NTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01vZGVsaW5nQmVhbkluZm8xNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotICogICRSQ1NmaWxlOiBNb2RlbGluZ0JlYW5JbmZvMTUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotCi0vKioKLSAqIFRoaXMgd2FzIHN1cHBvc2VkIHRvIGZvciAxLjQgb3IgYWJvdmUgd2hlcmUgaXQgY2FuIHVzZSBpZGVudGl0eQotICogdG8gdGVzdCBmb3IgaW5oZXJpdGVkIGZlYXR1cmVzLCBidXQgaXQgc3RpbGwgaXMgbm90IGNvcnJlY3QKLSAqIGluIDEuNC4gU2VlIHRoZSBoZWFkZXIgY29tbWVudHMgaW4gTW9kZWxpbmdCZWFuSW5mby4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnZtLk1vZGVsaW5nQmVhbkluZm8KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsaW5nQmVhbkluZm8xNSBleHRlbmRzIE1vZGVsaW5nQmVhbkluZm8gewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsaW5nQmVhbkluZm8xNS4KLQkgKiBAcGFyYW0gYmVhbkluZm8KLQkgKi8KLQlwdWJsaWMgTW9kZWxpbmdCZWFuSW5mbzE1KEJlYW5JbmZvIGJlYW5JbmZvLCBpbnQgZG9GbGFncykgewotCQlzdXBlcihiZWFuSW5mbywgZG9GbGFncyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsaW5nQmVhbkluZm8xNS4KLQkgKiBAcGFyYW0gYmVhbkluZm8KLQkgKiBAcGFyYW0gc3VwZXJCZWFuSW5mbwotCSAqLwotCXB1YmxpYyBNb2RlbGluZ0JlYW5JbmZvMTUoQmVhbkluZm8gYmVhbkluZm8sIEJlYW5JbmZvIHN1cGVyQmVhbkluZm8sIGludCBkb0ZsYWdzKSB7Ci0JCXN1cGVyKGJlYW5JbmZvLCBzdXBlckJlYW5JbmZvLCBkb0ZsYWdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Nb2RlbGluZ0JlYW5JbmZvUHJlMTUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01vZGVsaW5nQmVhbkluZm9QcmUxNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY1NTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL01vZGVsaW5nQmVhbkluZm9QcmUxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotICogICRSQ1NmaWxlOiBNb2RlbGluZ0JlYW5JbmZvUHJlMTUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1vZGVsaW5nIEJlYW5JbmZvIGZvciBQcmUtSkRLIDEuNC4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsaW5nQmVhbkluZm9QcmUxNSBleHRlbmRzIE1vZGVsaW5nQmVhbkluZm8gewotCi0JcHVibGljIE1vZGVsaW5nQmVhbkluZm9QcmUxNShCZWFuSW5mbyBiZWFuSW5mbywgaW50IGRvRmxhZ3MpIHsKLQkJc3VwZXIoYmVhbkluZm8sIGRvRmxhZ3MpOwotCX0KLQotCXB1YmxpYyBNb2RlbGluZ0JlYW5JbmZvUHJlMTUoQmVhbkluZm8gYmVhbkluZm8sIEJlYW5JbmZvIHN1cGVyQmVhbkluZm8sIGludCBkb0ZsYWdzKSB7Ci0JCXN1cGVyKGJlYW5JbmZvLCBzdXBlckJlYW5JbmZvLCBkb0ZsYWdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9QYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL1BhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA2ZGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL3ZtX2JlYW5pbmZvdm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3ZtL1BhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotICogICRSQ1NmaWxlOiBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozMToyOSAkIAotICovCi0KLWltcG9ydCBqYXZhLmJlYW5zLio7Ci0vKioKLSAqIFBhcmFtZXRlckRlc2NyaXB0b3IgZXF1YWxpdHkgdGVzdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJEZXNjcmlwdG9yRXF1YWxpdHkgZXh0ZW5kcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsKLQkKLQlzdGF0aWMgdm9pZCBJTklUKCkgewotCQl0cnkgewotCQkJTUFQX0VRVUFMSVRZLnB1dChQYXJhbWV0ZXJEZXNjcmlwdG9yLmNsYXNzLCAoUGFyYW1ldGVyRGVzY3JpcHRvckVxdWFsaXR5LmNsYXNzKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7UGFyYW1ldGVyRGVzY3JpcHRvci5jbGFzc30pKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0JCi0JCi0JcHVibGljIFBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eSgpIHsKLQl9Ci0JCi0JcHVibGljIFBhcmFtZXRlckRlc2NyaXB0b3JFcXVhbGl0eShQYXJhbWV0ZXJEZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXN1cGVyKGRlc2NyKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Qcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vdm1fYmVhbmluZm92bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdm0vUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxYzFkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5iZWFuaW5mby92bV9iZWFuaW5mb3ZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby92bS9Qcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udm07Ci0vKgotICogICRSQ1NmaWxlOiBQcm9wZXJ0eURlc2NyaXB0b3JFcXVhbGl0eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjMxOjI5ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLS8qKgotICogUHJvcGVydHlEZXNjcmlwdG9yIGVxdWFsaXR5IHRlc3RlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkgZXh0ZW5kcyBGZWF0dXJlRGVzY3JpcHRvckVxdWFsaXR5IHsJCi0JCi0JcHVibGljIFByb3BlcnR5RGVzY3JpcHRvckVxdWFsaXR5KCkgewotCX0KLQkKLQlwdWJsaWMgUHJvcGVydHlEZXNjcmlwdG9yRXF1YWxpdHkoUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyKSB7Ci0JCXN1cGVyKGRlc2NyKTsKLQl9CQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgaGFzaGNvZGUgZm9yIHRoZSBjdXJyZW50IGZlYXR1cmUsIGFkZCB0aGlzCi0JICogdG8gdGhlIGhhc2hjb2RlIHJlY2VpdmVkIGZyb20gc3VwZXIuY2FsY3VsYXRlSGFzaENvZGUKLQkgKiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBOT1RFOiBmb3Igc3ViY2xhc3NlcywgaXQgaXMgTUFORElUT1JZIHRoYXQgdGhlIGZpcnN0IGxpbmUgYmU6Ci0JICogICAgICAgICBpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCSAqICAgICAgIGFuZCB0aGUgbGFzdCBsaW5lIGJlOgotCSAqICAgICAgICAgcmV0dXJuIGhhc2hjb2RlKjMxICsgKHlvdXIgY2FsY3VsYXRlZCBoYXNoY29kZSBmb3IganVzdCB0aGlzIHN1YmNsYXNzKTsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgewotCQlpbnQgaGFzaGNvZGUgPSBzdXBlci5jYWxjdWxhdGVIYXNoQ29kZSgpOwotCQlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSAoUHJvcGVydHlEZXNjcmlwdG9yKSBmRmVhdHVyZTsKLQkJaW50IGhjID0gMDsKLQkJaWYgKHBkLmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSAhPSBudWxsKQotCQkJaGMgKz0gcGQuZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpLmhhc2hDb2RlKCk7Ci0JCWlmIChwZC5nZXRQcm9wZXJ0eVR5cGUoKSAhPSBudWxsKQotCQkJaGMgKz0gcGQuZ2V0UHJvcGVydHlUeXBlKCkuaGFzaENvZGUoKTsKLQkJaWYgKHBkLmdldFJlYWRNZXRob2QoKSAhPSBudWxsKQotCQkJaGMgKz0gcGQuZ2V0UmVhZE1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCWlmIChwZC5nZXRXcml0ZU1ldGhvZCgpICE9IG51bGwpCi0JCQloYyArPSBwZC5nZXRXcml0ZU1ldGhvZCgpLmhhc2hDb2RlKCk7Ci0JCQkKLQkJaGMgKz0gKHBkLmlzQm91bmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpLmhhc2hDb2RlKCk7Ci0JCWhjICs9IChwZC5pc0NvbnN0cmFpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKS5oYXNoQ29kZSgpOwkJCi0JCQkJCQkKLQkJcmV0dXJuIGhhc2hjb2RlKjMxICsgaGM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKGlkZW50aXR5VGVzdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLSAJCi0JCVByb3BlcnR5RGVzY3JpcHRvciBvcCA9IChQcm9wZXJ0eURlc2NyaXB0b3IpICgoRmVhdHVyZURlc2NyaXB0b3JFcXVhbGl0eSkgb2JqKS5mRmVhdHVyZTsKLQkJUHJvcGVydHlEZXNjcmlwdG9yIGZwID0gKFByb3BlcnR5RGVzY3JpcHRvcikgZkZlYXR1cmU7Ci0gCQkKLQkJaWYgKG9wLmdldFByb3BlcnR5RWRpdG9yQ2xhc3MoKSAhPSBmcC5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvcC5nZXRSZWFkTWV0aG9kKCkgIT0gZnAuZ2V0UmVhZE1ldGhvZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob3AuZ2V0V3JpdGVNZXRob2QoKSAhPSBmcC5nZXRXcml0ZU1ldGhvZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob3AuaXNCb3VuZCgpICE9IGZwLmlzQm91bmQoKSkKLQkJCXJldHVybiBmYWxzZTsJCQkJCi0JCWlmIChvcC5pc0NvbnN0cmFpbmVkKCkgIT0gZnAuaXNDb25zdHJhaW5lZCgpKQotCQkJcmV0dXJuIGZhbHNlOwkJCQkJCQkJCQkJCQkJCi0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2MyNGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgb3V0cHV0PSJjb21tb25fYmluIiBraW5kPSJzcmMiIHBhdGg9InByb3h5Q29tbW9uIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBvdXRwdXQ9ImNvbW1vbl9iaW4iIGtpbmQ9InNyYyIgcGF0aD0iaW5pdFBhcnNlciI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkgb3V0cHV0PSJjb21tb25fYmluIiBraW5kPSJzcmMiIHBhdGg9InJlbW90ZUNvbW1vbiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkgb3V0cHV0PSJ2bV9iaW4iIGtpbmQ9InNyYyIgcGF0aD0idm1fcmVtb3Rldm0iPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJveHkiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJveHlSZW1vdGUiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJveHlpZGUiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZmIxY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWNvbW1vbl9iaW4KLXZtX2JpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjMDgwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9kZWJ1Z3ZtPWZhbHNlCi1vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL2lvY29uc29sZT1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy92bXRyYWNlb3V0PWZhbHNlCi1vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL25vdGltZW91dHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy90cmFjZWV4cHJlc3Npb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvdHJhY2VleHByZXNzaW9uc3RpbWV0aHJlc2hvbGQ9MTAwCi1vcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlZmlsZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9nbGV2ZWw9ZGVmYXVsdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjAwNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0ucHJveHk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZzwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UucGRlLmNvcmU8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3MWFkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotI1RodSBKdW4gMTYgMTI6NTE6MDEgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZmY2MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI1dlZCBNYXkgMTEgMTY6MjA6MTUgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlYWNlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgSnVuIDE2IDExOjA4OjEzIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotc2VsZmhvc3RpbmcuYmluRXhjbHVkZXM9L29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzZkNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLnByb3h5OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC4xCi1CdW5kbGUtQ2xhc3NQYXRoOiBwcm94eS5qYXIsCi0gcHJveHljb21tb24uamFyLAotIGluaXRwYXJzZXIuamFyLAotIHByb3h5cmVtb3RlLmphciwKLSByZW1vdGVjb21tb24uamFyLAotIHByb3h5aWRlLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5hd3QsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0LAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dCwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLnBkZS5jb3JlO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aTtyZXNvbHV0aW9uOj1vcHRpb25hbAotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWMwY2JiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnByb3h5aWRlLmphciA9IHByb3h5aWRlLwotc291cmNlLnByb3h5Y29tbW9uLmphciA9IHByb3h5Q29tbW9uLwotb3V0cHV0LnByb3h5Y29tbW9uLmphciA9IGNvbW1vbl9iaW4vCi1zb3VyY2UucHJveHkuamFyID0gcHJveHkvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHByb3h5Y29tbW9uLmphcixcCi0gICAgICAgICAgICAgICBwcm94eS5qYXIsXAotICAgICAgICAgICAgICAgcmVtb3RlY29tbW9uLmphcixcCi0gICAgICAgICAgICAgICBwcm94eXJlbW90ZS5qYXIsXAotICAgICAgICAgICAgICAgaW5pdHBhcnNlci5qYXIsXAotICAgICAgICAgICAgICAgdm0vcmVtb3Rldm0uamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcHJveHlpZGUuamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHByb3h5LmphcnMKLXNvdXJjZS5wcm94eXJlbW90ZS5qYXIgPSBwcm94eVJlbW90ZS8KLXNvdXJjZS5pbml0cGFyc2VyLmphciA9IGluaXRQYXJzZXIvCi1vdXRwdXQuaW5pdHBhcnNlci5qYXIgPSBjb21tb25fYmluLwotc291cmNlLnJlbW90ZWNvbW1vbi5qYXIgPSByZW1vdGVDb21tb24vCi1vdXRwdXQucmVtb3RlY29tbW9uLmphciA9IGNvbW1vbl9iaW4vCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBwcm94eWNvbW1vbi5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgaW5pdHBhcnNlci5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgcmVtb3RlY29tbW9uLmphcixcCi0gICAgICAgICAgICAgICAgICAgICB2bS9yZW1vdGV2bS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgcHJveHkuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIHByb3h5cmVtb3RlLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBwcm94eWlkZS5qYXIKLXNvdXJjZS52bS9yZW1vdGV2bS5qYXIgPSB2bV9yZW1vdGV2bS8KLW91dHB1dC52bS9yZW1vdGV2bS5qYXIgPSB2bV9iaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0FycmF5QXJndW1lbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0FycmF5QXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjNmNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9BcnJheUFyZ3VtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBBcnJheUFyZ3VtZW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC4qOwotLyoqCi0gKiBUaGlzIHJlcHJlc2VudHMgdGhlIGFyZ3VtZW50cyBpbiBhIG11bHRpIGRpbWVuc2lvbmFsIGFycmF5IHdpdGggY29uc3RydWN0aW9uIHBhcmFtZXRlcnMsIGUuZy4KLSAqIG5ldyBpbnRbXVtdIHsgeyAyICwzIH0gLCB7IDQgLDUgfX0KLSAqIHRoZSBhcmd1bWVudHMgb2YgdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgaW5zdGFuY2Ugb2YgQXJyYXlBcmd1bWVudHMgCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUFyZ3VtZW50cyBleHRlbmRzIEV4cHJlc3Npb24gewotCQotCVN0YXRpYyBmVHlwZTsKLQlMaXN0IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JYm9vbGVhbiBhcmdzQ2xvc2VkOwotCWJvb2xlYW4gaW5zaWRlQXJnc09wZW5lZFBhcmVuOwotCWJvb2xlYW4gaW5zaWRlQXJnc0Nsb3NlZFBhcmVuOwotCQotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4sIGNoYXIgdG9rZW5EZWxpbWl0ZXIpIHsKLQkKLQkvLyBJZiB0aGUgYXJncyBhcmUgb3BlbmVkIGFuZCBhIHRva2VuIHdhcyBzdXBwbGllZCB0aGVuIGl0IG11c3QgYmUgYW4gYXJndW1lbnQKLQkvL2lmICggYXJnc09wZW5lZCAmJiAoIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEgfHwgCi0JLy90b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJTcGFjZSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QpKSB7Ci0JaWYgKCFhcmdzQ2xvc2VkKXsJCi0JCWlmICggYXJndW1lbnRzLnNpemUoKSA+IDAgKXsKLQkJCUV4cHJlc3Npb24gb3BlbkFyZ3VtZW50ID0gKEV4cHJlc3Npb24pYXJndW1lbnRzLmdldChhcmd1bWVudHMuc2l6ZSgpLTEpOwotCQkJaWYgKCAhb3BlbkFyZ3VtZW50LmlzQ29tcGxldGUoKSApIHsKLQkJCQlvcGVuQXJndW1lbnQucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQkJLy8gSWYgdGhlIGFyZ3VtZW50IGlzIGNvbXBsZXRlIGFuZCB3ZSByZWNlaXZlZCBhICkgdGhlbiB0aGUgbWVzc2FnZSBpcyBjb21wbGV0ZQotCQkJCWlmICggb3BlbkFyZ3VtZW50LmlzQ29tcGxldGUoKSAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZUVsaXBzZSl7Ci0JCQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQkJfQkKLQkJCi0JCS8vIFdlIG11c3QgaGF2ZSBhIG5ldyBhcmd1bWVudCAtIHByb2Nlc3MgYWNjb3JkaW5nbHkJCi0JCUV4cHJlc3Npb24gbmV3QXJndW1lbnQgPSBudWxsOwotCQlpZiAoIWluc2lkZUFyZ3NPcGVuZWRQYXJlbiAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pewotCQkJaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gdHJ1ZTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgTWVzc2FnZUFyZ3VtZW50KG5ld0FyZ3VtZW50KTsKLQkJCWFyZ3VtZW50cy5hZGQobmV3QXJndW1lbnQpOwotCi0JCX0KLQkJaWYgKCB0b2tlbi5sZW5ndGggPiAwIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlIHx8IHRva2VuRGVsaW1pdGVyID09IE9wZXJNaW51cyApIHsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgTWVzc2FnZUFyZ3VtZW50KG5ld0FyZ3VtZW50KTsKLQkJCWFyZ3VtZW50cy5hZGQobmV3QXJndW1lbnQpOwotCQl9Ci0JCS8vIElmIHRoZSB0b2tlbiBhZnRlciB0aGUgYXJndW1lbnQgaXMgYSApIHRoZW4gdGhlIG1lc3NhZ2UgaXMgYmVpbmcgY2xvc2VkCi0JCWlmICggIWluc2lkZUFyZ3NPcGVuZWRQYXJlbiAgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VFbGlwc2UgKSB7Ci0JCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmICggaW5zaWRlQXJnc09wZW5lZFBhcmVuICAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZUVsaXBzZSApIHsKLQkJCWluc2lkZUFyZ3NDbG9zZWRQYXJlbiAgPSB0cnVlOwotCQkJYXJnc0Nsb3NlZCA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0KLQlyZXR1cm4gdGhpczsKLX0KLS8qKgotICogSW4gdGhlIGNhc2Ugb2YgdGhlIGV4cHJlc3Npb24gbmV3IGludFtdW10geyB7MiwzfSAsIHs0LDV9IH0gdGhlbiB3ZSBhcmUgdGhlIDIsMyBvciB0aGUgNCw1Ci0gKiB0byBldmFsdWF0ZSB3ZSBtdXN0IHJldHVybiBhbiBhcnJheSBvZiBpbnRzIGJhc2VkIG9uIG91ciBzaXplLiAgVGhlIHR5cGUgd2UgcmV0dXJuIGlzIGRldGVybWluZWQgYnkgdGhlIGluaXRpYWwgCi0gKiBjb25zdHJ1Y3RvciB3aG8gd2lsbCBoYXZlIGdpdmVuIHRoaXMgdG8gdXMgYXMgb3VyIGZUeXBlCi0gKi8JCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQlPYmplY3QgcmVzdWx0ID0gQXJyYXkubmV3SW5zdGFuY2UoZlR5cGUuZ2V0UHJpbWl0aXZlVHlwZUNsYXNzKCksYXJndW1lbnRzLnNpemUoKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJT2JqZWN0IGFyZ3VtZW50VmFsdWUgPSAoKEV4cHJlc3Npb24pYXJndW1lbnRzLmdldChpKSkuZXZhbHVhdGUoKTsKLQkJQXJyYXkuc2V0KHJlc3VsdCxpLGFyZ3VtZW50VmFsdWUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JcmV0dXJuIGFyZ3NDbG9zZWQ7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIHZvaWQgc2V0VHlwZShTdGF0aWMgdHlwZSkgewotCWZUeXBlID0gdHlwZTsKLX0KLXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVBcmd1bWVudE51bWJlcihMaXN0IGFyZ3VtZW50TnVtYmVyTGlzdCl7Ci0JCi0JLy8gQWRkIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHdlIGhhdmUgdG8gdGhlIGxpc3QKLQlhcmd1bWVudE51bWJlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKGFyZ3VtZW50cy5zaXplKCkpKTsKLQkvLyBJZiBvdXIgYXJndW1lbnRzIGFyZSB0aGVtc2VsdmVzIGFycmF5IGFyZ3VtZW50cyAoIHdoaWNoIHdpbGwgb2NjdXIgaW4gYW4gYXJyYXkgb2YgMyBvciBtb3JlIGRpbWVuc2lvbnMgKQotCS8vIHRoZW4gd2Ugc2hvdWxkIGNhc2NhZGUgdGhpcyBtZXNzYWdlIHRvIG91ciBhcmd1bWVudCBzbyB0aGF0IHRoZSB0b3RhbCBhcnJheSBkZXB0aCBpcyBrbm93bgotCWlmICggYXJndW1lbnRzLnNpemUoKSA+IDAgKSB7Ci0JCU9iamVjdCBmaXJzdEFyZ3VtZW50ID0gYXJndW1lbnRzLmdldCgwKTsKLQkJaWYgKCBmaXJzdEFyZ3VtZW50IGluc3RhbmNlb2YgQXJyYXlBcmd1bWVudHMgKSB7Ci0vLwkJCSgoQXJyYXlBcmd1bWVudHMpZmlyc3RBcmd1bWVudCljb250cmlidXRlQXJndW1lbnROdW1iZXIoYXJndW1lbnROdW1iZXJMaXN0KTsKLQkJfQotCX0KLQkKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCXdyaXRlci53cml0ZSgiQXJncygiKTsgLy8kTk9OLU5MUy0xJAotCXdyaXRlci53cml0ZShuZXcgSW50ZWdlcihhcmd1bWVudHMuc2l6ZSgpKS50b1N0cmluZygpKTsKLQl3cml0ZXIud3JpdGUoIiktIik7IC8vJE5PTi1OTFMtMSQKLQl3cml0ZXIud3JpdGUoYXJndW1lbnRzLnRvU3RyaW5nKCkpOwotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5pbml0UGFyc2VyLkV4cHJlc3Npb24jZ2V0VHlwZUNsYXNzTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gIiI7CS8vIE5vdCBhcHBsaWNhYmxlIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQmxvY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzMGYyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJsb2NrLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklzQ2xvc2VkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZklzQ29tcGxldGUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTWVzc2FnZU9yRmllbGQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgQmxvY2soRXhwcmVzc2lvbiBhbkV4cHJlc3Npb24pewotCQljdXJyZW50RXhwcmVzc2lvbiA9IGFuRXhwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgQmxvY2soQ2xhc3NMb2FkZXIgZkNsYXNzTG9hZGVyKXsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gZklzQ29tcGxldGU7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCk7Ci0JfQotCi0KLQlwdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiwgY2hhciB0b2tlbkRlbGltaXRlcikgewotCQkJCi0JCS8vIElmIHdlIGFyZSBjbG9zZWQgKGkuZS4gY29tcGxldGVkIHdpdGggYSApKSBhbmQgd2UgZ2V0IGEgKSBvciAsIHRoZW4gd2UgYXJlIGFsbCBmaW5pc2hlZCB1cAotCQkvLyBXZSBzaG91bGQgbm90IGZvcndhcmQgdGhpcyB0b2tlbiB0byB0aGUgZXhwcmVzc2lvbiwgYXMgaXQgaXNDb21wbGV0ZQotCQlpZiAoKGZJc0Nsb3NlZCB8fCBjdXJyZW50RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCkpICYmICh0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hKSl7Ci0JCQlmSXNDb21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQkKLQkJLy8gSWYgd2UgYXJlIGEgbWVzc2FnZSBvZiBmaWVsZCBhbmQgd2UgZ2V0IGEgKCB3ZSBhcmUgbWVzc2FnZSBvciBhIGZpZWxkIG90aGVyd2lzZQotCQlpZiAoZk1lc3NhZ2VPckZpZWxkKXsKLQkJCWZNZXNzYWdlT3JGaWVsZCA9IGZhbHNlOwotCQkJLy8gVGhlIHByb2JsZW0gbm93IGlzIHRoYXQgd2UgYXJlIGEgYmxvY2sgb2YgYW4gZXhwcmVzc2lvbiBhbmQgd2UgbmVlZCB0byBjcmVhdGUgYSBtZXNzYWdlCi0JCQkvLyB3aGVyZSB3ZSBhcmUgdGhlIHJlY2VpdmVyLiAgSG93ZXZlciB3ZSBhcmUgb24gdGhlIHN0YWNrIGFuZCBnb2luZyB0byBiZSBwb3BwZWQgd2hlbiB0aGUgbWVzc2FnZSBmaW5pc2hlcwotCQkJLy8gc28gd2UgbXVzdCBhbHRlciBvdXJzZWxmIHRvIGJlIGEgYmxvY2sgd2hvc2UgY3VycmVudCBleHByZXNzaW9uIGlzIG1lc3NhZ2Ugd2hvc2UgYXJndW1lbnQKLQkJCS8vIGlzIGEgY29weSBvZiB1cwotCQkJaWYgKCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKGN1cnJlbnRFeHByZXNzaW9uLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JCQkJY3VycmVudEV4cHJlc3Npb24gPSBtZXNzYWdlOwotCQkJCXJldHVybiBtZXNzYWdlOwotCQkJfSBlbHNlIHsKLQkJCQlGaWVsZCBmaWVsZCA9IG5ldyBGaWVsZChjdXJyZW50RXhwcmVzc2lvbix0b2tlbixmQ2xhc3NMb2FkZXIpOwotCQkJCWN1cnJlbnRFeHByZXNzaW9uID0gZmllbGQ7Ci0JCQkJcmV0dXJuIGZpZWxkOwotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiB3ZSBhcmUgY2xvc2VkIGFuZCB3ZSBnZXQgYSAuIHRoZW4gd2UgbXVzdCBiZWdpbiBhIG1lc3NhZ2Ugb3IgZmllbGQgZXhwcmVzc2lvbgotCQlpZiAoY3VycmVudEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCApewotCQkJZk1lc3NhZ2VPckZpZWxkID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCQotCQlFeHByZXNzaW9uIHJlc3VsdCA9IGN1cnJlbnRFeHByZXNzaW9uLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkvLyBJZiB0aGUgcmVzdWx0IGlmIGEgcHVzaCB0aGVuIHB1c2ggdGhlIHN0YWNrCi0JCWlmICggcmVzdWx0ICE9IGN1cnJlbnRFeHByZXNzaW9uICkgewotCQkJcHVzaEV4cHJlc3Npb25TdGFjayhyZXN1bHQpOwkKLQkJfQotCQkvLyBJZiBvdXIgY3VycmVudCBleHByZXNzaW9uIGlzIGNvbXBsZXRlIGFuZCB3ZSBhcmUgcmVjZWl2aW5nIGEgY2xvc2UgcGFyZW50IHRoZW4gd2UgYXJlIGNsb3NlZAotCQlpZiAoY3VycmVudEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4pewotCQkJZklzQ2xvc2VkID0gdHJ1ZTsKLQotCQl9Ci0JCS8vIElmIHdlIGFyZSBoZXJlIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgc3RpbGwgcHJvY2Vzc2luZyB0b2tlbnMgc28gd2Ugc2hvdWxkIHJldHVybiBpdAotCQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIkJsb2NrKCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoY3VycmVudEV4cHJlc3Npb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuaW5pdFBhcnNlci5FeHByZXNzaW9uI2dldFR5cGVDbGFzc05hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzc05hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQm9vbGVhbkxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQm9vbGVhbkxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyMDRmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Jvb2xlYW5MaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQm9vbGVhbkxpdGVyYWwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotcHVibGljIGNsYXNzIEJvb2xlYW5MaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHVibGljIGJvb2xlYW4gdmFsdWU7Ci1wdWJsaWMgQm9vbGVhbkxpdGVyYWwoYm9vbGVhbiBhVmFsdWUpewotCi0JdmFsdWUgPSBhVmFsdWU7Ci0KLX0KLQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBldmFsdWF0ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHsKLQlyZXR1cm4gbmV3IEJvb2xlYW4odmFsdWUpOwotfQotLyoqCi0gKiBldmFsdWF0ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpewotCXJldHVybiBCb29sZWFuLlRZUEU7Ci19Ci0vKioKLSAqIHRydWUgb3IgZmFsc2UgY2Fubm90IGNvbnN1bWUgYW55IGtpbmQgb2YgZXhwcmVzc2lvbiBzbyB3ZSBtdXN0IHJldHVybiBudWxsCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCi0JcmV0dXJuIG51bGw7CQotCi19Ci0KLS8qKgotICogVGhpcyBpcyBwcmltaXRpdmUKLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuaW5pdFBhcnNlci5FeHByZXNzaW9uI2dldFR5cGVDbGFzc05hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIEJvb2xlYW4uVFlQRS5nZXROYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhbm5vdFByb2Nlc3NBcnJheVR5cGVzRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhbm5vdFByb2Nlc3NBcnJheVR5cGVzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MmQ4MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DYW5ub3RQcm9jZXNzQXJyYXlUeXBlc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IENhbm5vdFByb2Nlc3NBcnJheVR5cGVzRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbml0U3RyaW5nUGFyc2VyIGNhbid0IGRlYWwgd2l0aCBhcnJheXMgcmlnaHQgbm93Ci0gKi8KLXB1YmxpYyBjbGFzcyBDYW5ub3RQcm9jZXNzQXJyYXlUeXBlc0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDI0NTk4NDAyMDA2NTc2MTYzNEw7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhbm5vdFByb2Nlc3NJbm5lckNsYXNzZXNFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2Fubm90UHJvY2Vzc0lubmVyQ2xhc3Nlc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzM5MGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2Fubm90UHJvY2Vzc0lubmVyQ2xhc3Nlc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IENhbm5vdFByb2Nlc3NJbm5lckNsYXNzZXNFeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLS8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHRvIGluZGljYXRlIHRoYXQgaW5uZXIgY2xhc3NlcyBjYW5ub3QgYmUgcHJvY2Vzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYW5ub3RQcm9jZXNzSW5uZXJDbGFzc2VzRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgyOTA1MDQ1ODA3Mzg0OTk0NDVMOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0Nhc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2FzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTFkNTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvQ2FzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBDYXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIENhc3QgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBCWVRFX1RZUEUgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNIT1JUX1RZUEUgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOVF9UWVBFID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBMT05HX1RZUEUgPSAzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZMT0FUX1RZUEUgPSA0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERPVUJMRV9UWVBFID0gNTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEhhc2hNYXAgc1R5cGVMb29rdXA7Ci0Jc3RhdGljIHsKLQkJc1R5cGVMb29rdXAgPSBuZXcgSGFzaE1hcCg2KTsKLQkJc1R5cGVMb29rdXAucHV0KEJ5dGUuVFlQRSwgbmV3IEludGVnZXIoQllURV9UWVBFKSk7Ci0JCXNUeXBlTG9va3VwLnB1dChTaG9ydC5UWVBFLCBuZXcgSW50ZWdlcihTSE9SVF9UWVBFKSk7Ci0JCXNUeXBlTG9va3VwLnB1dChJbnRlZ2VyLlRZUEUsIG5ldyBJbnRlZ2VyKElOVF9UWVBFKSk7Ci0JCXNUeXBlTG9va3VwLnB1dChMb25nLlRZUEUsIG5ldyBJbnRlZ2VyKExPTkdfVFlQRSkpOwotCQlzVHlwZUxvb2t1cC5wdXQoRmxvYXQuVFlQRSwgbmV3IEludGVnZXIoRkxPQVRfVFlQRSkpOwotCQlzVHlwZUxvb2t1cC5wdXQoRG91YmxlLlRZUEUsIG5ldyBJbnRlZ2VyKERPVUJMRV9UWVBFKSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgU3RhdGljIGZDYXN0VHlwZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSXNDbG9zZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgQ2FzdChTdGF0aWMgY2FzdFR5cGUsIENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcikgewotCQlmQ2FzdFR5cGUgPSBjYXN0VHlwZTsKLQkJZkNsYXNzTG9hZGVyID0gYUNsYXNzTG9hZGVyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHlwZUNsYXNzKCkuaXNQcmltaXRpdmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgYSBDYXN0IGV4cHJlc3Npb24gaXMgdGhlIHR5cGUgb2YgdGhlIGNhc3QgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBmQ2FzdFR5cGUuZ2V0VHlwZUNsYXNzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsICYmIGN1cnJlbnRFeHByZXNzaW9uLmlzQ29tcGxldGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHR5cGUgaXMgcHJpbWl0aXZlLCB0aGVuIHdlIG5lZWQgdG8KLQkgKiBjb252ZXJ0IHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3QgcGFzcwotCSAqIHRoZSB2YWx1ZSBvbi4KLQkgKgotCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBwcmltaXRpdmVzIGJlY2F1c2UgaWYgeW91cgotCSAqIGVudGlyZSBpbml0aWFsaXphdGlvbiBzdHJpbmcgd2FzIHNpbXBseSAiKHNob3J0KSAzIgotCSAqIHRoZW4gYSBTaG9ydCB2YWx1ZSBtdXN0IGJlIHJldHVybmVkIHNvIHRoYXQgdGhlCi0JICogY29ycmVjdCBraW5kIG9mIHByaW1pdGl2ZSBwcm94eSBpcyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGdldFR5cGVDbGFzcygpID09IGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpKQotCQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uLmV2YWx1YXRlKCk7CS8vIFRoZXkncmUgdGhlIHNhbWUsIHNvIGp1c3QgcmV0dXJuIGl0LgotCQlpZiAoZ2V0VHlwZUNsYXNzKCkuaXNQcmltaXRpdmUoKSkgewotCQkJLy8gQ2FuIG9ubHkgY2FzdCBhIHByaW1pdGl2ZSB0byBhIHByaW1pdGl2ZSwgZXhjZXB0IG51bGwgY2FuJ3QgYmUgY2FzdCB0byBhIHByaW1pdGl2ZS4KLQkJCWlmICghY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCkuaXNQcmltaXRpdmUoKSB8fCBjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKSA9PSBWb2lkLlRZUEUpCi0JCQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24obmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihjdXJyZW50RXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKS5nZXROYW1lKCkpKTsJCQkKLQkJCS8vIGJvb2xlYW4gb25seSBhbGxvd3MgYm9vbGVhbiBjYXN0LgotCQkJaWYgKGZDYXN0VHlwZS5nZXRUeXBlQ2xhc3MoKSA9PSBCb29sZWFuLlRZUEUgfHwgY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCkgPT0gQm9vbGVhbi5UWVBFKQotCQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCQlpZiAoZkNhc3RUeXBlLmdldFR5cGVDbGFzcygpID09IENoYXJhY3Rlci5UWVBFKSB7Ci0JCQkJLy8gU28gd2UgaGF2ZSBlaXRoZXIgYSBDaGFyYWN0ZXIgb3IgYSBudW1iZXIgYXMgdGhlIHZhbHVlLiBDYXN0IHRoYXQuCQkJCQotCQkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKChjaGFyKSAoKE51bWJlcikgY3VycmVudEV4cHJlc3Npb24uZXZhbHVhdGUoKSkuaW50VmFsdWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCU51bWJlciB2YWx1ZSA9IG51bGw7Ci0JCQkJLy8gU2VlIGlmIHRoZSB2YWx1ZSBpcyBjaGFyYWN0ZXIgb3IgYSBudW1iZXIuCi0JCQkJaWYgKGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpID09IENoYXJhY3Rlci5UWVBFKQotCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKCgoQ2hhcmFjdGVyKSBjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpKS5jaGFyVmFsdWUoKSk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IChOdW1iZXIpIGN1cnJlbnRFeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JCQkJc3dpdGNoICgoKEludGVnZXIpIHNUeXBlTG9va3VwLmdldChmQ2FzdFR5cGUuZ2V0VHlwZUNsYXNzKCkpKS5pbnRWYWx1ZSgpKSB7Ci0JCQkJCWNhc2UgQllURV9UWVBFOgotCQkJCQkJcmV0dXJuIG5ldyBCeXRlKHZhbHVlLmJ5dGVWYWx1ZSgpKTsKLQkJCQkJY2FzZSBTSE9SVF9UWVBFOgotCQkJCQkJcmV0dXJuIG5ldyBTaG9ydCh2YWx1ZS5zaG9ydFZhbHVlKCkpOwotCQkJCQljYXNlIElOVF9UWVBFOgotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHZhbHVlLmludFZhbHVlKCkpOwotCQkJCQljYXNlIExPTkdfVFlQRToKLQkJCQkJCXJldHVybiBuZXcgTG9uZyh2YWx1ZS5sb25nVmFsdWUoKSk7Ci0JCQkJCWNhc2UgRkxPQVRfVFlQRToKLQkJCQkJCXJldHVybiBuZXcgRmxvYXQodmFsdWUuZmxvYXRWYWx1ZSgpKTsKLQkJCQkJY2FzZSBET1VCTEVfVFlQRToKLQkJCQkJCXJldHVybiBuZXcgRG91YmxlKHZhbHVlLmRvdWJsZVZhbHVlKCkpOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIG51bGw7CS8vIFNob3VsZG4ndCBvY2N1ci4gSnVzdCBzYXRpc2lmaWVzIGNvbXBpbGVyLgotCQkJCX0KLQkJCX0KLQkJCQotCQl9IGVsc2UKLQkJCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCX0KLQkvKioKLQkgKiBBIGNhc3QgZXhwcmVzc2lvbiBhbHdheXMgcHVzaGVzIG9udG8gdGhlIGNhc3QgdmFsdWUKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiAsIGNoYXIgdG9rZW5EZWxpbWl0ZXIpIHsKLQkJLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNsYXNzIHlldCB0aGVuIHdlIGFyZSB3aXRoaW4gdGhlIHN0YXRlbWVudCB0byB0cnkgYW5kIGRldGVyaW5lIHRoZSB0eXBlIGJlaW5nIGNhc3QgdG8KLQkJaWYoZkNhc3RUeXBlLmdldFByaW1pdGl2ZVR5cGVDbGFzcygpID09IG51bGwgJiYgIWZJc0Nsb3NlZCl7Ci0JCQlmQ2FzdFR5cGUucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQkvLyBJZiB0aGUgdHlwZSB3YXMgY29tcGxldGVkIGFuZCB3ZSBoYXZlIGEgKSB0aGVuIGNsb3NlIHVzCi0JCQlpZihmQ2FzdFR5cGUuZ2V0UHJpbWl0aXZlVHlwZUNsYXNzKCkgIT0gbnVsbCAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuKXsKLQkJCQlmSXNDbG9zZWQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHRoaXM7CQkJCi0JCX0KLQkJCi0JCWlmICghZklzQ2xvc2VkKSB7Ci0JCQkvLyBUaGUgY2FzdCBpcyBub3QgY2xvc2VkLCBidXQgd2UgaGF2ZSBhIHN0YXRpYyBjbGFzcy4gIFRoaXMgY2xhc3MgbXVzdCB0aGVyZWZvcmUga2VlcCBwcm9jZXNzaW5nIHRoZSB0b2tlbnMgYXMgaXQgY291bGQgYmUgYSBtZXRob2Qgb3IgbWVzc2FnZSBzZW5kCi0JCQlFeHByZXNzaW9uIHJlc3VsdCA9ICBmQ2FzdFR5cGUucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQlyZXN1bHQucGFyZW50aGVzaXNMZXZlbCsrOwotCQkJcmV0dXJuIHJlc3VsdDsgCi0JCX0KLQkJCi0JCS8vIElmIHdlIGhhdmUgbm8gZXhwcmVzc2lvbiBwdXNoIG9udG8gdGhlIGNhc3QgdmFsdWUJCQotCQlpZihjdXJyZW50RXhwcmVzc2lvbiA9PSBudWxsKXsKLQkJCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpOwotCQkJY3VycmVudEV4cHJlc3Npb24gPSBjdXJyZW50RXhwcmVzc2lvbi5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCXJldHVybiB0aGlzOwotCQl9IAotCQlFeHByZXNzaW9uIHJlc3VsdCA9IGN1cnJlbnRFeHByZXNzaW9uLnB1c2godG9rZW4sIHRva2VuRGVsaW1pdGVyKTsKLQkJLy8gSWYgdGhlIHJlc3VsdCBpZiBhIHB1c2ggdGhlbiBwdXNoIHRoZSBzdGFjawotCQlpZiAoIHJlc3VsdC5pc0NvbXBsZXRlKCkgKSB7Ci0JCQlwb3BFeHByZXNzaW9uU3RhY2soKTsKLQkJfSBlbHNlIGlmICggcmVzdWx0ICE9IGN1cnJlbnRFeHByZXNzaW9uICkgewotCQkJcHVzaEV4cHJlc3Npb25TdGFjayhyZXN1bHQpOwotCQl9CQkKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiQ2FzdCgiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZkNhc3RUeXBlICE9IG51bGwpewotCQkJYnVmZmVyLmFwcGVuZChmQ2FzdFR5cGUudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI/Pz8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIikgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsKXsKLQkJCWJ1ZmZlci5hcHBlbmQoY3VycmVudEV4cHJlc3Npb24udG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI/Pz8iKTsJCQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuaW5pdFBhcnNlci5FeHByZXNzaW9uI2dldFR5cGVDbGFzc05hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGZDYXN0VHlwZS5nZXRUeXBlQ2xhc3NOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0NoYXJMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0NoYXJMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGQ0ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9DaGFyTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBDaGFyTGl0ZXJhbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0KLQotcHVibGljIGNsYXNzIENoYXJMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZTsKLQlwdWJsaWMgY2hhciB2YWx1ZTsKLQlwdWJsaWMgU3RyaW5nQnVmZmVyIHZhbHVlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXByb3RlY3RlZCBib29sZWFuIGlzRXNjYXBlZCA9IGZhbHNlOwotCi0vKioKLSAqIGNvbnN0cnVjdG9yCi0gKi8KLXB1YmxpYyBDaGFyTGl0ZXJhbCgpewotfQotCQotLyoqCi0gKiBldmFsdWF0ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWlmICh2YWx1ZUJ1ZmZlci5sZW5ndGgoKSA9PSAxKQotCQlyZXR1cm4gbmV3IENoYXJhY3Rlcih2YWx1ZUJ1ZmZlci5jaGFyQXQoMCkpOwotCWVsc2UKLQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oCi0JCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLmdldFN0cmluZygiQ2hhclRvb0NvbXBsaWNhdGVkX0VYQ18iKSwgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBPYmplY3RbXSB7dmFsdWVCdWZmZXIudG9TdHJpbmcoKX0pKSk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gaXNDb21wbGV0ZTsKLX0KLS8qKgotICogV2UgbXVzdCBldmFsdWF0ZSBvdXJzZWxmIGFuZCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHJlc3VsdAotICovCi0gCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgewotCXJldHVybiBDaGFyYWN0ZXIuVFlQRTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiBDaGFyYWN0ZXIuVFlQRS5nZXROYW1lKCk7Ci19Ci0vKioKLSAqVGhpcyBzdHJpbmcgbWlnaHQgYmUgYnJva2VuIGludG8gYSBmZXcgdG9rZW5zCi0gKnNvIHdlIG5lZWQgYSBTdHJpbmdCdWZmZXIgCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCQotCWlmIChpc0VzY2FwZWQpIHsKLQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCWlmICh0b2tlbi5sZW5ndGggIT0gMCkgewotCQkJLy8gSGFkIGFuIGVzY2FwZSBmb2xsb3dlZCBieSBzdHVmZiwgc28gbm90IGEgdHJ1ZSBlc2MgZm9yIG91ciBjdXJyZW50IGRlZmluaXRpb24KLQkJCXZhbHVlQnVmZmVyLmFwcGVuZChEZWxpbWl0ZXJFc2NhcGUpOwotCQl9IGVsc2UgewotCQkJaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJTaW5nbGVRdW90ZSB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyRXNjYXBlKQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwkvLyBJdCB3YXMgYSB0cnVlIGVzY2FwZS4KLQkJCWVsc2UgewotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChEZWxpbWl0ZXJFc2NhcGUpOwkvLyBJZiB3YXNuJ3QgYSB0cnVlIGVzY2FwZQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChkZWxpbWl0ZXIpOwotCQkJfQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9Ci0JCi0JdmFsdWVCdWZmZXIuYXBwZW5kKHRva2VuKTsKLQkKLQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlKXsJCQotCQlpc0NvbXBsZXRlID10cnVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JLy8gSWYgdGhlIGRlbGltaXRlciBpcyBhbiBlc2NhcGUgY2hhcmFjdGVyIHJlbWVtYmVyIGl0IHNvIHdlIGNhbiBlc2NhcGUKLQkvLyB0aGUgbmV4dCB0b2tlbiwgb3RoZXJ3aXNlIHRyZWF0IGl0IGFzIGEgbGl0ZXJhbAotCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyRXNjYXBlICl7Ci0JCWlzRXNjYXBlZCA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJdmFsdWVCdWZmZXIuYXBwZW5kKGRlbGltaXRlcik7Ci0JfQotCXJldHVybiB0aGlzOwotfQotCi0vKioKLSAqIGNoYXJzIGFyZSBwcmltaXRpdmVzLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQoIkNoYXIoJyIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCB2YWx1ZUJ1ZmZlciAhPSBudWxsICkgewotCQlidWZmZXIuYXBwZW5kKHZhbHVlQnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0NvbnN0cnVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0NvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODg1MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Db25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBDb25zdHJ1Y3Rvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1ldGhvZEhlbHBlcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wMS8wMCA4OjUyOjM2IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RydWN0b3IgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwdWJsaWMgYm9vbGVhbiBhcmdzT3BlbmVkID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gYXJnc0Nsb3NlZCA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIHRyYWlsaW5nUGVyaW9kID0gZmFsc2U7Ci0JcHVibGljIEFycmF5TGlzdCBhcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCXB1YmxpYyBTdGF0aWMgdHlwZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSXNDb21wbGV0ZTsKLQlwdWJsaWMgYm9vbGVhbiBpbnNpZGVBcmdzT3BlbmVkUGFyZW4gPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiBpbnNpZGVBcmdzQ2xvc2VkUGFyZW4gPSBmYWxzZTsKLQlwdWJsaWMgYm9vbGVhbiBpc1N0cmluZyA9IGZhbHNlOwotCXB1YmxpYyBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjdG9yOwotLyoqCi0gKiBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgQ29uc3RydWN0b3IoQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKSB7Ci0Jc3VwZXIoKTsKLQlmQ2xhc3NMb2FkZXIgPSBhQ2xhc3NMb2FkZXI7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gZklzQ29tcGxldGU7Ci19Ci0KLS8qKgotICogSW52b2tlIHRoZSBjb25zdHJ1dG9yCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCWlmICggdHlwZS5pc0FycmF5KCkgKSB7Ci0JCS8vIEZvciBhcnJheXMgd2UgZ2V0IHRoZSBhcnJheSB0aGF0IGlzIGFjdHVhbGx5IGhlbGQgaW5zaWRlIHRoZSBzdGF0aWMKLQkJLy8gVG8gaW5zdGFudGlhdGUgdGhlIGFycmF5IGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHN0YXRpYyBrbm93cyB0aGUgYXJyYXkgc2l6ZSwgZS5nLiBuZXcgaW50WzJdCi0JCS8vIG9yIGVsc2UgaXQgbXVzdCBiZSBnaXZlbiB0aGlzIGZyb20gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgd2UgaGF2ZSwgZS5nLiBuZXcgaW50W10geyAyICwgMyB9Ci0JCWlmICggYXJndW1lbnRzLnNpemUoKSA+IDAgKSB7Ci0JCQl0eXBlLnNldEFycmF5QXJndW1lbnRzKGFyZ3VtZW50cyk7Ci0JCX0KLQkJT2JqZWN0IHJlc3VsdCA9IHR5cGUuZXZhbHVhdGUoKTsKLQkJLy8gRGVhbCB3aXRoIGFycmF5IGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cwotCQlyZXR1cm4gcmVzdWx0OwotCX0gZWxzZSB7Ci0JCS8vIEZvciBub24gYXJyYXlzIHdlIGZpbmQgdGhlIG1ldGhvZCBhbmQgaW52b2tlIGl0IG9uIHRoZSB0eXBlCi0JCWNhY2hlQ3RvcigpOwotCQkvLyBHZXQgdGhlIGFycmF5IG9mIGFyZ3VtZW50cwotCQlPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFthcmd1bWVudHMuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaXRyID0gYXJndW1lbnRzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLnNpemUoKSA7IGkrKyl7Ci0JCQlFeHByZXNzaW9uIGFuRXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKWl0ci5uZXh0KCk7Ci0JCQlhcmdzW2ldID0gYW5FeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JCX0KLQkKLQkJdHJ5IHsKLQkJCXJldHVybiBjdG9yLm5ld0luc3RhbmNlKGFyZ3MpOwkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciwgdGhlbiB3ZSBoYXZlIGEgdmFsaWQgcGFyc2UsIHNvIGFueXRoaW5nIGlzIGFuIGV2YWx1YXRpb24gZXhjZXB0aW9uLgotCQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19Ci0vKiogQSBjb25zdHJ1Y3RvciBjYW4gb25seSByZXR1cm4gdGhlIGNsYXNzIG9mIGl0cyB0eXBlCi0gKi8KLXB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlpZiAoIHR5cGUuaXNBcnJheSgpICkgewotCQkvLyBGb3IgYXJyYXlzIHdlIGdldCB0aGUgYXJyYXkgdGhhdCBpcyBhY3R1YWxseSBoZWxkIGluc2lkZSB0aGUgc3RhdGljCi0JCS8vIFRvIGluc3RhbnRpYXRlIHRoZSBhcnJheSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzdGF0aWMga25vd3MgdGhlIGFycmF5IHNpemUsIGUuZy4gbmV3IGludFsyXQotCQkvLyBvciBlbHNlIGl0IG11c3QgYmUgZ2l2ZW4gdGhpcyBmcm9tIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHdlIGhhdmUsIGUuZy4gbmV3IGludFtdIHsgMiAsIDMgfQotCQlpZiAoIGFyZ3VtZW50cy5zaXplKCkgPiAwICkgewotCQkJdHlwZS5zZXRBcnJheUFyZ3VtZW50cyhhcmd1bWVudHMpOwotCQl9Ci0JfQotCXJldHVybiB0eXBlLmdldFR5cGVDbGFzcygpOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JcmV0dXJuIHR5cGUuZ2V0VHlwZUNsYXNzTmFtZSgpOwotfQotCi1wcml2YXRlIHZvaWQgY2FjaGVDdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JaWYgKGN0b3IgPT0gbnVsbCkgewotCQlDbGFzc1tdIGFyZ1R5cGVzID0gbmV3IENsYXNzW2FyZ3VtZW50cy5zaXplKCldOwotCQlJdGVyYXRvciBpdHIgPSBhcmd1bWVudHMuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGFyZ1R5cGVzLmxlbmd0aDsgaSsrKQotCQkJYXJnVHlwZXNbaV0gPSBnZXRFdmFsdWF0aW9uVHlwZUNsYXNzKChFeHByZXNzaW9uKSBpdHIubmV4dCgpKTsKLQkJCQotCQl0cnkgewotCQkJY3RvciA9IE1ldGhvZEhlbHBlci5maW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yKGdldEV2YWx1YXRpb25UeXBlQ2xhc3ModGhpcyksIGFyZ1R5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGltaXRlck9wZW5lZChjaGFyIHRva2VuKXsKLQlyZXR1cm4gdHlwZS5pc0FycmF5KCkgPyB0b2tlbiA9PSBEZWxpbWl0ZXJPcGVuRWxpcHNlIDogdG9rZW4gPT0gRGVsaW1pdGVyT3BlblBhcmVuOwkKLX0KLXByb3RlY3RlZCBib29sZWFuIGlzRGVsaW1pdGVyQ2xvc2VkKGNoYXIgdG9rZW4pewotCXJldHVybiB0eXBlLmlzQXJyYXkoKSA/IHRva2VuID09IERlbGltaXRlckNsb3NlRWxpcHNlIDogdG9rZW4gPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbjsKLX0KLS8qKgotICogcHVzaCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4sIGNoYXIgdG9rZW5EZWxpbWl0ZXIpIHsKLQotCS8vIElmIHdlIGFyZSBjbG9zZWQgYW5kIHdlIHJlY2VpdmUgYSAuIHdpdGggbm8gdG9rZW4gdGhlbiByZW1lbWJlciB0aGlzCi0JaWYgKCBhcmdzQ2xvc2VkICYmICF0cmFpbGluZ1BlcmlvZCAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QgJiYgdG9rZW4ubGVuZ3RoID09IDAgKSB7Ci0JCXRyYWlsaW5nUGVyaW9kID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCS8vIElmIHdlIGhhdmUgYmVlbiBjbG9zZWQgd2l0aCBhIC4gYW5kIHdlIHJlY2VpdmUgYSAuIHRoZW4gd2UgYXJlIGEgZmllbGQKLQlpZiAoIHRyYWlsaW5nUGVyaW9kICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCApIHsKLQkJcmV0dXJuIG5ldyBGaWVsZCh0aGlzLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JfQotCS8vIElmIHdlIGhhdmUgYmVlbiBjbG9zZWQgd2l0aCBhIC4gYW5kIHdlIHJlY2VpdmUgYSAoIHdlIGFyZSBhIG1lc3NhZ2UKLQlpZiAoIHRyYWlsaW5nUGVyaW9kICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbiApIHsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlKHRoaXMsdG9rZW4sZkNsYXNzTG9hZGVyKTsKLQl9Ci0JCi0JLy8gTGF6eSBpbml0aWFsaXplIHRoZSB0eXBlIGlmIHJlcXVpcmVkCi0JaWYgKCB0eXBlID09IG51bGwgKSB7Ci0JCXN3aXRjaCAoIHRva2VuRGVsaW1pdGVyICkgewotCQkJY2FzZSBEZWxpbWl0ZXJQZXJpb2Q6IHsKLQkJCQl0eXBlID0gbmV3IFN0YXRpYyh0b2tlbix0b2tlbkRlbGltaXRlcixmQ2xhc3NMb2FkZXIpOwotCQkJCXR5cGUuc2V0Q2xhc3NMb2FkZXIoZkNsYXNzTG9hZGVyKTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyT3BlblBhcmVuOiB7Ci0JCQkJdHlwZSA9IG5ldyBTdGF0aWModG9rZW4sdG9rZW5EZWxpbWl0ZXIsZkNsYXNzTG9hZGVyKTsKLQkJCQl0eXBlLnNldENsYXNzTG9hZGVyKGZDbGFzc0xvYWRlcik7Ci0JCQkJYXJnc09wZW5lZCA9IHRydWU7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9IAotCQkJY2FzZSBEZWxpbWl0ZXJPcGVuU3F1YXJlQnJhY2U6IHsgCi0vLwkJCQl0aHJvdyBuZXcgQ2Fubm90UHJvY2Vzc0FycmF5VHlwZXNFeGNlcHRpb24oKTsKLQkJCQkvLyBBcnJheSBkaW1lbmlvbnMgYXJlIGNyZWF0ZWQgYXMgc3RhZW1lbnRzIGluIHRoZSBhcnJheURpbWVuc2lvbnMKLQkJCQkvLyBUaGlzIGlzIGZvciBleHByZXNzaW9ucyBsaWtlIG5ldyBTdHJpbmdbXSBvciBuZXcgU3RyaW5nWzNdLCB3aGVyZSB0aGUgU3RhdGVtZW50IHJlcHJlc2VudHMgdGhlIDMsIGkuZS4KLQkJCQkvLyB0aGUgY29kZSB0aGF0IGRlY2xhcmVzIHRoZSBzaXplIG9mIHRoZSBhcnJheQotCQkJCXR5cGUgPSBuZXcgU3RhdGljKHRva2VuLHRva2VuRGVsaW1pdGVyLGZDbGFzc0xvYWRlcix0cnVlKTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQkJCS8vIElmIHdlIGdldCBhIHsgYW5kIG91ciBzdGF0aWMgaXMgYW4gYXJyYXkgdGhlbiB0aGlzIGlzIHRoZSBhcnJheSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCi0JCQljYXNlIERlbGltaXRlck9wZW5FbGlwc2U6IHsgCi0JCQkJaWYgKCB0eXBlICE9IG51bGwgJiYgdHlwZS5pc0FycmF5KCkgKSB7Ci0JCQkJCWFyZ3NPcGVuZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWRlZmF1bHQ6IHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyBJZiB3ZSBoYXZlIGEgc3RhdGljIHRoYXQgaXMgYW4gYXJyYXkgdGhlbiBpdCBjb25zdW1lcyB0b2tlbiB1bnRpbCBpdCBpcyBjb21wbGV0ZQotCWlmICggdHlwZSAhPSBudWxsICYmIHR5cGUuaXNBcnJheSgpICkgewotCQkvLyBUaGUgdHlwZSBjb25zdW1lcyB0b2tlbiBhcyBsb25nIGFzIGl0IGlzIHN0aWxsIGluIHRoZSBhcnJheSBkZWNsYXJhdGlvbiBzZWN0aW9uCi0JCWlmICggdHlwZS5pc1Byb2Nlc3NpbmdBcnJheURpbWVuc2lvbiB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuU3F1YXJlQnJhY2UgKSB7Ci0JCQl0eXBlLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9Ci0JCQotCS8vIElmIHRoZSB0eXBlIGlzIGluY29tcGxldGUgYW5kIHRoZSB0b2tlbiBpcyBhIC4gKCBmb3IgYW5vdGhlciBjbGFzcyApIG9yIGEgWyBmb3IgYW4gYXJyYXkgdGhlbiBwdXNoIGl0IG9udG8gdGhlIHR5cGUKLQlpZiAoIXR5cGUuaXNBcnJheSgpICYmIHR5cGUuZ2V0VHlwZUNsYXNzKCkgPT0gbnVsbCAmJiAodG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5TcXVhcmVCcmFjZSkpIHsKLQkJdHlwZS5wdXNoKHRva2VuICwgdG9rZW5EZWxpbWl0ZXIpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JLy8gSWYgdGhlIHR5cGUgaXMgaW5jb21wbGV0ZSBhbmQgdGhlIHRva2VuIGlzIGEgKCB0aGVuIHB1c2ggaXQgb250byB0aGUgdHlwZSBhbmQgb3BlbiB0aGUgcGFyZW5zCi0JaWYgKCF0eXBlLmlzQXJyYXkoKSl7Ci0JCWlmICh0eXBlLmdldFR5cGVDbGFzcygpID09IG51bGwgJiYgIWFyZ3NPcGVuZWQgJiYgaXNEZWxpbWl0ZXJPcGVuZWQodG9rZW5EZWxpbWl0ZXIpKSB7Ci0JCQlhcmdzT3BlbmVkID0gdHJ1ZTsKLQkJCWluc2lkZUFyZ3NPcGVuZWRQYXJlbiA9IHRydWU7Ci0JCQl0eXBlLnB1c2godG9rZW4gLCBEZWxpbWl0ZXJTcGFjZSApOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9IGVsc2UgeyAKLQkJaWYgKCAhYXJnc09wZW5lZCAmJiBpc0RlbGltaXRlck9wZW5lZCh0b2tlbkRlbGltaXRlcikpIHsKLQkJCWFyZ3NPcGVuZWQgPSB0cnVlOwotCQkJaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwkJCQotCQl9Ci0JfQotCQotCS8vIElmIHRoZSBhcmdzIGFyZSBhbHJlYWR5IGNsb3NlZCBhbmQgd2UgZ2V0IGFub3RoZXIgY2xvc2UgZXhwcmVzc2lvbiwgdGhlbiBqdXN0IHJldHVybiBvdXJzZWx2ZXMKLQkvLyBUaGlzIG9jY3VycyBpbiB0aGUgY2FzZSBvZiBuZXN0ZWQgYXJyYXkgYXJndW1lbnRzIHdpdGhpbiBjb25zdHJ1Y3RvcnMKLQlpZiAoIGFyZ3NDbG9zZWQgJiYgKHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4pKXsKLQkJZklzQ29tcGxldGUgPSB0cnVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JLy8gSWYgdGhlIGFyZ3VtZW50cyBhcmUgY2xvc2VkIGFuZCB3ZSByZWNlaXZlIGEgeyB0aGVuIHRoaXMgaXMgYW4gaW5uZXIgY2xhc3MgZGVjbGFyYXRpb24sIGUuZy4KLQkvLyBuZXcgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlTW9kZWwoKXt9Ci0JLy8gVGhpcyBjYW4ndCBiZSBwcm9jZXNzZWQgYnkgdXMgc28gd2UgbmVlZCB0byB0aHJvdyBhbiBleGNlcHRpb24KLQlpZiAoYXJnc0Nsb3NlZCAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuRWxpcHNlICkgewotCQl0aHJvdyBuZXcgQ2Fubm90UHJvY2Vzc0lubmVyQ2xhc3Nlc0V4Y2VwdGlvbigpOwotCX0KLQotCS8vIElmIHRoZSBhcmdzIGFyZSBvcGVuZWQgYW5kIGEgdG9rZW4gd2FzIHN1cHBsaWVkIHRoZW4gaXQgbXVzdCBiZSBhbiBhcmd1bWVudAotCWlmIChhcmdzT3BlbmVkKXsKLQkJLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGFuIGluY29tcGxldGUgYXJndW1lbnQgdGhlbiB0aGlzIG1heSBiZSBhIGNvbnN0cnVjdG9yLCBhIHN0YXRpYyByZWZlcmVuY2UsIGV0Yy4uLgotCQkvLyBhbmQgd2Ugc2hvdWxkIGZvcndhcmQgdGhlIHJlcXVlc3QgdG8gdGhlIGFyZ3VtZW50Ci0JCUV4cHJlc3Npb24gb3BlbkFyZ3VtZW50ID0gbnVsbDsKLQkJaWYgKCBhcmd1bWVudHMuc2l6ZSgpID4gMCApewotCQkJb3BlbkFyZ3VtZW50ID0gKEV4cHJlc3Npb24pYXJndW1lbnRzLmdldChhcmd1bWVudHMuc2l6ZSgpLTEpOwotCQkJaWYgKCAhb3BlbkFyZ3VtZW50LmlzQ29tcGxldGUoKSApIHsKLQkJCQlvcGVuQXJndW1lbnQucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQkJLy8gSWYgdGhlIGFyZ3VtZW50IGlzIGNvbXBsZXRlIGFuZCB3ZSByZWNlaXZlZCBhICkgdGhlbiB0aGUgY29uc3RydWN0b3IgaXMgY29tcGxldGUKLQkJCQkvLyBvciBpZiB3ZSByZWNlaXZlIGEgfSBhbmQgYXJlIGFuIGFycmF5IHdlIGFyZSBjb21wbGV0ZQotCQkJCWlmICggb3BlbkFyZ3VtZW50LmlzQ29tcGxldGUoKSAmJiBpc0RlbGltaXRlckNsb3NlZCh0b2tlbkRlbGltaXRlcikgKXsKLQkJCQkJYXJnc0Nsb3NlZCA9IHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzOwotCQkJfSAKLQkJfQotCQkJCi0JCUV4cHJlc3Npb24gbmV3QXJndW1lbnQgPSBudWxsOwotCQkvLyBJZiB3ZSBhcmUgbm90IGFscmVhZHkgaW5zaWRlIHRoZSBvcGVuIGFyZyBhbmQgd2UgZ2V0IGFub3RoZXIgb3BlbiBwYXJlbiB0aGlzIGlzIHByb2JhYmx5IGEgY2FzdAotCQkvLyBvciBzb21lIGtpbmQgb2Ygc3RhdGVtZW50LCBhbmQgT3Blck1pbnVzIGlzIHByb2JhYmx5IHRoZSBzdGFydCBvZiBhIG51bWJlcgotCQkvLyBJZiB0aGUgYXJncyBhcmUgbm90IGFscmVhZHkgb3BlbiB3ZSBtdXN0IGJlIG9wZW5lZCB3aXRoIGVpdGhlciBhIHsgb3IgYSAoIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGFyZSBhbiBhcnJheSBvciBub3QKLQkJLy8gaG93ZXZlciBpZiB0aGUgYXJncyBhcmUgb3BlbmVkIGFscmVhZHkgYW5kIHdlIHJlY2VpdmUgYSAoIHRoZW4gdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXcgc3RhdGVtZW50Ci0vLwkJaWYgKCghaW5zaWRlQXJnc09wZW5lZFBhcmVuICYmIGlzRGVsaW1pdGVyT3BlbmVkKHRva2VuRGVsaW1pdGVyKSkgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuKXsKLQkJaWYgKHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5FbGlwc2UgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuKXsKLQkJCWluc2lkZUFyZ3NPcGVuZWRQYXJlbiA9IHRydWU7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCWlmICggbmV3QXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheUFyZ3VtZW50cyApIHsKLQkJCQkoKEFycmF5QXJndW1lbnRzKW5ld0FyZ3VtZW50KS5zZXRUeXBlKHR5cGUpOwotCQkJfQotCQkJbmV3QXJndW1lbnQgPSBuZXcgTWVzc2FnZUFyZ3VtZW50KG5ld0FyZ3VtZW50KTsKLQkJCWFyZ3VtZW50cy5hZGQobmV3QXJndW1lbnQpOwotCi0JCX0KLQkJCi0JCS8vIFN0YXJ0IG9mIGEgcG9zc2libGUgc3RyaW5nIG9yIG51bWJlciBvciBjaGFyYWN0ZXIKLQkJaWYgKCAoIHRva2VuLmxlbmd0aCA+IDAgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU2luZ2xlUXVvdGUpIHx8IHRva2VuRGVsaW1pdGVyID09IE9wZXJNaW51cyApewotCQkJbmV3QXJndW1lbnQgPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcikucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBNZXNzYWdlQXJndW1lbnQobmV3QXJndW1lbnQpOwotCQkJYXJndW1lbnRzLmFkZChuZXdBcmd1bWVudCk7Ci0JCX0KLQkJLy8gSWYgdGhlIHRva2VuIGFmdGVyIHRoZSBhcmd1bWVudCBpcyBhICkgdGhlbiB0aGUgbWVzc2FnZSBpcyBiZWluZyBjbG9zZWQKLQkJaWYgKCAhaW5zaWRlQXJnc09wZW5lZFBhcmVuIHx8IGFyZ3VtZW50c0FyZUNvbXBsZXRlKCkgJiYgaXNEZWxpbWl0ZXJDbG9zZWQodG9rZW5EZWxpbWl0ZXIpICkgewotCQkJYXJnc0Nsb3NlZCA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlpZiAoIGluc2lkZUFyZ3NPcGVuZWRQYXJlbiAmJiBpc0RlbGltaXRlckNsb3NlZCh0b2tlbkRlbGltaXRlcikgKSB7Ci0JCQlpbnNpZGVBcmdzQ2xvc2VkUGFyZW4gID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0KLQkJLy8gSWYgdGhlIHRva2VuIGFmdGVyIHRoZSBhcmd1bWVudCBpcyBhICwgb3IgYSAnICcgdGhlbiB0aGUgYXJndW1lbnQgaXMgYmVpbmcgY2xvc2VkCi0JCWlmICggdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU3BhY2UgKSB7Ci0JCQkvLyBJZiBvdXIgYXJndW1lbnRzIGFyZSBjbG9zZWQgdGhlbiB3ZSBtdXN0IGJlIGNvbXBsZXRlLiAgV2UgbmVlZCB0byBzaWduYWwgdGhlIGZhY3Qgd2UgYXJlIGNsb3NlZAotCQkJLy8gb3RoZXJ3aXNlIHdlIHdpbGwgbm90IGJlIHByb2Nlc3NlZCBjb3JyZWN0bHkgaWYgd2UgYXJlIHBhcnQgb2YgYSBzdGFjayAKLQkJCWlmICggYXJnc0Nsb3NlZCApIHsKLQkJCQlmSXNDb21wbGV0ZSA9IHRydWU7Ci0JCQl9CQkJCi0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQkKLQkJLy8gSWYgd2UgcmVjZWl2ZSBhIGNsb3NlIGJyYWNrZXQgdGhlbiB3ZSBhcmUgY2xvc2VkIGFzIGxvbmcgYXMgdGhlIGxhc3QgYXJndW1lbnQgaXMgY2xvc2VkCi0JCWlmKGFyZ3NPcGVuZWQgJiYgIGlzRGVsaW1pdGVyQ2xvc2VkKHRva2VuRGVsaW1pdGVyKSl7Ci0JCQkvLyBObyBwYXJtcyAtIHdlIGFyZSBhIGNsb3NlZCBjb25zdHJ1Y3RvcgotCQkJaWYoYXJndW1lbnRzLnNpemUoKSA9PSAwKXsKLQkJCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0gCi0JCX0KLQkJCi0JCS8vIElmIG91ciBsYXN0IGFyZ3VtZW50IGlzIGNsb3NlZCBhbmQgcmVjZWl2ZSBhICkgYW5kIHdlIGhhdmUgbm8gbmV3IGFyZ3VtZW50IHRoZW4gd2UgYXJlIGNsb3NlZAotCQlpZiAodG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbiAmJiBuZXdBcmd1bWVudCA9PSBudWxsKXsKLQkJCUV4cHJlc3Npb24gbGFzdEFyZ3VtZW50ID0gKEV4cHJlc3Npb24pYXJndW1lbnRzLmdldChhcmd1bWVudHMuc2l6ZSgpLTEpOwotCQkJaWYgKCBsYXN0QXJndW1lbnQuaXNDb21wbGV0ZSgpICkgewotCQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQl9CQkJCi0JCQkJCi0JCS8vIE90aGVyd2lzZSB0aGUgbmV3IGFyZ3VtZW50IGlzIHN0aWwgcHJvY2Vzc2luZy4gIFJldHVybiBpdAotCQlyZXR1cm4gbmV3QXJndW1lbnQ7Ci0JfQotCi0JcmV0dXJuIHRoaXM7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBhcmd1bWVudHNBcmVDb21wbGV0ZSgpewotCWlmICggYXJndW1lbnRzLnNpemUoKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gKChFeHByZXNzaW9uKWFyZ3VtZW50cy5nZXQoYXJndW1lbnRzLnNpemUoKS0xKSkuaXNDb21wbGV0ZSgpOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCi0JamF2YS5pby5TdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJDb25zdHJ1Y3RvciBcIiIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCB0eXBlICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZSh0eXBlLnR5cGVXcml0ZXIudG9TdHJpbmcoKSk7Ci0JfSBlbHNlIHsKLQkJd3JpdGVyLndyaXRlKCJVTlRZUEVEIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMuc2l6ZSgpIDsgaSsrKXsKLQkJd3JpdGVyLndyaXRlKCIgQXJnKCIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZSgiIiArIChpKzEpKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIikgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoYXJndW1lbnRzLmdldChpKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotCi19Ci0KLS8qKgotICogVGhpcyBpcyBuZXZlciBwcmltaXRpdmUKLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9FdmFsdWF0aW9uRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0V2YWx1YXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5N2NkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0V2YWx1YXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBFdmFsdWF0aW9uRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIGFuIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiwgYnV0Ci0gKiBpbiBhZGRpdGlvbiwgdGhlIGV4Y2VwdGlvbiB0aGF0IGl0IHdyYXBwZXJzIGlzIHdoYXQgc2hvdWxkIGJlCi0gKiByZXR1cm5lZC4gVGhpcyBtZWFucyBpdCB3YXMgYSB2YWxpZCBleGNlcHRpb24sIHBhcnNpbmcgaGFkCi0gKiBnb25lIGZpbmUsIGJ1dCBpdCB3YXMgYW4gZXZhbHVhdGlvbiB0aGF0IG9jY3VyZWQuIFRoaXMgaXMKLSAqIGRpc3Rpbmd1aXNoZWQgZnJvbSB0aGUgc3RyYWlnaHQgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uLAotICogd2hpY2ggbWVhbnMgc29tZSBlcnJvciBkdXJpbmcgcGFyc2luZyBhbmQgZXZhbHVhdGlvbi4KLSAqIAotICogTm90ZTogSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbnMgd2lsbCBiZSB1bndyYXBwZXJlZCB0byB0aGUgdHJ1ZSBleGNlcHRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmFsdWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY5OTcyMzkwMjE4ODUzMTA5ODZMOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJldHVybmFibGVFeGNlcHRpb24uCi0JICogQHBhcmFtIGV4YwotCSAqLwotCXB1YmxpYyBFdmFsdWF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBleGMpIHsKLQkJc3VwZXIoZXhjIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiA/ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZXhjKS5nZXRUYXJnZXRFeGNlcHRpb24oKSA6IGV4Yyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL0V4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdlYzM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBFeHByZXNzaW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wMS8wMCA4OjQ2OjQ0IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIElQYXJzZXJDb25zdGFudHMgewotCXByb3RlY3RlZCBFeHByZXNzaW9uIGN1cnJlbnRFeHByZXNzaW9uOwotCXByb3RlY3RlZCBMaXN0IGZFeHByZXNzaW9uU3RhY2s7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGZDbGFzc0xvYWRlcjsKLQlwdWJsaWMgaW50IHBhcmVudGhlc2lzTGV2ZWwgPSAwOwotLyoqIENvbXBhcmUgdGhlIHR3byBjaGFyIGFycmF5cwotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZShjaGFyW10gZnJvbSAsIGNoYXJbXSB0byl7Ci0KLQlyZXR1cm4gQXJyYXlzLmVxdWFscyhmcm9tLCB0byk7Ci19Ci0vKioKLSAqIEV4cHJlc3Npb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqIE5vdGU6IElmIGFueSBleGNlcHRpb25zIHRoYXQgYXJlIGR1ZSB0byBldmFsdWF0aW9uLCBhbmQgbm90IGR1ZSB0byBzb21lCi0gKiBpbnZhbGlkIHN0YXRlLCB0aGVuIHRoZSBleGNlcHRpb24gc2hvdWxkIGJlIHdyYXBwZXJlZCBpbiBhbiBFdmFsdWF0aW9uRXhjZXB0aW9uLAotICogYW5kIHRoZSBFdmFsdWF0aW9uRXhjZXB0aW9uIHRocm93biBpbnN0ZWFkLiBUaGlzIHdheSB3ZSBjYW4gZGlzdGlucXVpc2ggYmV0d2VlbgotICogdmFsaWQgZXhjZXB0aW9ucyB0aGF0IHJlc3VsdCBldmFsdWF0aW9ucyAoc3VjaCBhcyBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucykgZnJvbQotICogcGFyc2VyIGVycm9ycyBkdWUgdG8gc3RyaW5nIGlzIHRvbyBjb21wbGljYXRlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29tcGxldGUoKTsKLS8qKgotICogUmV0dXJuIGEgY2xhc3MgdHlwZSB0aGF0IHRoZSBleHByZXNzaW9uIHN5bnRhY3RpY2FsbHkgd291bGQgcHJvZHVjZS4KLSAqIEZvciBleGFtcGxlLCBpZiBhIGZpZWxkIGlzIG9mIHR5cGUgWFlaLCByZXR1cm4gWFlaLCBldmVuIHRob3VnaAotICogdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBtYXkgYmUgU3ViWFlaIHdoZXJlIFN1YlhZWiBpcyBhIHN1YmNsYXNzIG9mIFhZWi4KLSAqLwotcHVibGljIGFic3RyYWN0IENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb247Ci0vKioKLSAqIEluIGV2YWx1YXRpb24gcGhhc2UsIGdldCB0aGUgdHlwZSBjbGFzcyBmcm9tIHRoZSBleHByZXNzaW9uLgotICogSWYgdHlwZWNsYXNzIG5vdCBmb3VuZCwgdGhlbiBhIENsYXNzQ2FzdEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKiBAcGFyYW0gZXhwIFRvIGdldFR5cGVDbGFzcyBmcm9tCi0gKiBAcmV0dXJuIHR5cGUgY2xhc3MuCi0gKiBAdGhyb3dzIEV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHR5cGUgbm90IGZvdW5kLgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0RXZhbHVhdGlvblR5cGVDbGFzcyhFeHByZXNzaW9uIGV4cCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JQ2xhc3MgY2xzID0gZXhwLmdldFR5cGVDbGFzcygpOwotCWlmIChjbHMgPT0gbnVsbCkKLQkJdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24obmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oZXhwLmdldFR5cGVDbGFzc05hbWUoKSkpOwotCXJldHVybiBjbHM7Ci19Ci0KLS8qKgotICogQHJldHVybiBUeXBlIG5hbWUgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGV4cHJlc3Npb24uCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpOwotCi1wdWJsaWMgYm9vbGVhbiBpc051bWJlcihjaGFyW10gdG9rZW4pewotCi0JaWYgKCB0b2tlbi5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOwotCS8vIFNlZSB3aGV0aGVyIHRoZSB0b2tlbiBpcyBhIG51bWJlcgotCWludCBwYXJzZVBvc2l0aW9uID0gMDsKLQkvLyBUYWtlIGludG8gYWNjb3VudCBpdCBtYXkgc3RhcnQgd2l0aCBhIC0gc2lnbiwgZS5nLiAtMQotCWlmICggdG9rZW5bMF0gPT0gJy0nICkgcGFyc2VQb3NpdGlvbiA9IDE7Ci0JZm9yIChpbnQgaSA9IHBhcnNlUG9zaXRpb247IGkgPCB0b2tlbi5sZW5ndGggOyBpKyspewotCQkvLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGRpZ2l0IHJldHVybiB0cnVlCi0JCS8vIE90aGVyIHRoaW5ncyBsaWtlIGRlY2ltYWxzIG9yIHByaW1pdGl2ZSB0eXBlcywgZS5nLiAyLjIgb3IgMi4yZiBhcmUgCi0JCS8vIGhhbmRsZWQgYnkgTnVtYmVyTGl0ZXJhbAotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzRGlnaXQodG9rZW5baV0pOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzUG9wKCl7Ci0JcmV0dXJuIGZhbHNlOwotfQotcHJvdGVjdGVkIHZvaWQgcG9wRXhwcmVzc2lvblN0YWNrKCl7Ci0KLQlpZiAoIGZFeHByZXNzaW9uU3RhY2sgIT0gbnVsbCAmJiBmRXhwcmVzc2lvblN0YWNrLnNpemUoKSA+IDAgKSB7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gKEV4cHJlc3Npb24pIGZFeHByZXNzaW9uU3RhY2sucmVtb3ZlKGZFeHByZXNzaW9uU3RhY2suc2l6ZSgpLTEpOwotCX0JCi19Ci1wcm90ZWN0ZWQgdm9pZCBwdXNoRXhwcmVzc2lvblN0YWNrKEV4cHJlc3Npb24gYW5FeHByZXNzaW9uKXsKLQotCWlmICggZkV4cHJlc3Npb25TdGFjayA9PSBudWxsICkgZkV4cHJlc3Npb25TdGFjayA9IG5ldyBBcnJheUxpc3QoMik7Ci0JLy8gVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBzaG91bGQgZ28gb250byB0aGUgc3RhY2sKLQlmRXhwcmVzc2lvblN0YWNrLmFkZChjdXJyZW50RXhwcmVzc2lvbik7Ci0JLy8gVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyByZXBsYWNlZCB3aXRoIHRoZSBhcmd1bWVudAotCWN1cnJlbnRFeHByZXNzaW9uID0gYW5FeHByZXNzaW9uOwotCQotfQkKLQotdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotfQotCi0vKioKLSAqIFB1c2ggYW4gZXhwcmVzc2lvbiBvbnRvIHVzCi0gKiBSZXR1cm4gdGhlIG5ldyBleHByZXNzaW9uIG9udG8gd2hpY2ggc3Vic2VxdWVudCB0b2tlbiBzaG91bGQgYmUgcHVzaGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciB0b2tlbkRlbGltaXRlcik7Ci0KLS8qKgotICogQW5zd2VyIGlmIHRoaXMgZXhwcmVzc2lvbiByZXN1bHRzIGluIGEgcHJpbWl0aXZlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb247Ci0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IGRlcHRoLCBib29sZWFuIGFCcmVhayl7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlpZiAoIGFCcmVhayApIHsKLQkJYnVmZmVyLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoIlN5c3RlbS5saW5lU2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCWZvcihpbnQgaT0wO2k8ZGVwdGg7aSsrKXsKLQkJYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JfQotCWJ1ZmZlci5hcHBlbmQodG9TdHJpbmcoKSk7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9GaWVsZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9GaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWU4NDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogRmllbGQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzA1LzAwIDEwOjM5OjI4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRmllbGQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlOwotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmRmllbGQ7Ci0JcHVibGljIEV4cHJlc3Npb24gcmVjZWl2ZXI7Ci0JcHVibGljIFN0cmluZyBmaWVsZE5hbWU7Ci0JcHJvdGVjdGVkIENsYXNzIGZSZXN1bHRUeXBlOwotCQotcHVibGljIEZpZWxkKEV4cHJlc3Npb24gYVJlY2VpdmVyICwgY2hhcltdIHRva2VuICwgQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKXsKLQotCXJlY2VpdmVyID0gYVJlY2VpdmVyOwotCWlmICggdG9rZW4ubGVuZ3RoID4gMCApewotCQlmaWVsZE5hbWUgPSBuZXcgU3RyaW5nKHRva2VuKTsKLQl9Ci0KLX0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gaXNDb21wbGV0ZTsKLX0KLQotLyoqCi0gKiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSByZWNlaXZlcgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JT2JqZWN0IHJlY2VpdmVyVmFsdWUgPSByZWNlaXZlci5ldmFsdWF0ZSgpOwkvLyBTbyBpZiBpdCBmYWlscywgd2UgZ2V0IGFuIGV2YWx1YXRpb24gZXhjZXB0aW9uIGdvaW5nIG9uIHVwLgotCXRyeSB7Ci0JCWNhY2hlRmllbGQoKTsJCQotCQlyZXR1cm4gZkZpZWxkLmdldChyZWNlaXZlclZhbHVlKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsJLy8gQW55IGV4Y2VwdGlvbiBhdCB0aGlzIHBvaW50IGlzIGFuIGV2YWx1YXRpb24gZXhjZXB0aW9uLgotCX0KLX0KLQotLyoqCi0gKiBHZXQgdGhlIGZpZWxkIGZyb20gcmVmbGVjdGlvbi4KLSAqLwotcHJvdGVjdGVkIHZvaWQgY2FjaGVGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCWlmIChmRmllbGQgPT0gbnVsbCkgewotCQlDbGFzcyBhUmVjZWl2ZXJDbGFzcyA9IGdldEV2YWx1YXRpb25UeXBlQ2xhc3MocmVjZWl2ZXIpOwotCQlmRmllbGQgPSBhUmVjZWl2ZXJDbGFzcy5nZXRGaWVsZChmaWVsZE5hbWUpOwotCQlmUmVzdWx0VHlwZSA9IGZGaWVsZC5nZXRUeXBlKCk7CQkKLQl9Ci19Ci0KLS8qKgotICogVGhlIHJlc3VsdCB0eXBlIGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KLSAqLwotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCWlmICggZlJlc3VsdFR5cGUgPT0gbnVsbCApIHsKLQkJY2FjaGVGaWVsZCgpOwotCX0KLQlyZXR1cm4gZlJlc3VsdFR5cGU7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gIiI7CS8vIElmIHdlIGdvdCB0aGlzIGZhciwgd2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzLiAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIHB1c2ggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0KLQkvLyBJZiB0aGUgZGVsaW1pdGVyIGlzIGEgKCB0aGVuIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZQotCWlmICggdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuICkgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2UodGhpcyAsIHRva2VuICwgZkNsYXNzTG9hZGVyKTsKLQl9Ci0KLQkvLyBJZiB0aGUgZGVsaW1pdGVyIGlzIGEgLiB0aGVuIHRoaXMgaXMgYSBmaWVsZAotCWlmICh0b2tlbi5sZW5ndGggPiAwICAmJiAoIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCB8fCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJTcGFjZQotCXx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hKSkgewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIG5ldyBGaWVsZCh0aGlzICwgdG9rZW4gLCBmQ2xhc3NMb2FkZXIpOwotCQkKLQl9Ci0JCi0JaWYoZmllbGROYW1lICE9IG51bGwgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEpewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8vIElmIHdlIGhhdmUgbm8gZGVsaW1pdGVyIG9yIGEgY2xvc2UgcGFyZW4gdGhlbiB3ZSBoYXZlIGp1c3QgcmVjZWl2ZWQgdGhlIGZpZWxkIG5hbWUKLQlpZiAoIWlzQ29tcGxldGUgJiYgZmllbGROYW1lID09IG51bGwpIHsKLQkJZmllbGROYW1lID0gbmV3IFN0cmluZyh0b2tlbik7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlpZih0b2tlbkRlbGltaXRlciA9PSBCaXRPUiB8fCB0b2tlbkRlbGltaXRlciA9PSBCaXRBTkQpewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJUHJpbWl0aXZlT3BlcmF0aW9uIHJlc3VsdCA9IG5ldyBQcmltaXRpdmVPcGVyYXRpb24odGhpcyx0b2tlbkRlbGltaXRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8vIElnbm9yZSBzcGFjZXMgYXMgdGhpcyBtYXliZSBwYWRkaW5nIGJldHdlZW4gdGhlIGZpZWxkIGFuZCB0aGUgbmV4dCB2YWxpZCB0b2tlbgotCWlmKHRva2VuLmxlbmd0aCA9PSAwICYmIHRva2VuRGVsaW1pdGVyID09ICcgJykgcmV0dXJuIHRoaXM7Ci0KLQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuZ2V0U3RyaW5nKFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLlVORVhQRUNURURfVE9LRU4pLCBuZXcgT2JqZWN0W10ge25ldyBTdHJpbmdCdWZmZXIodG9rZW4ubGVuZ3RoKzEpLmFwcGVuZCh0b2tlbikuYXBwZW5kKHRva2VuRGVsaW1pdGVyKS50b1N0cmluZygpfSkpOwotCQotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCi0JamF2YS5pby5TdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJGaWVsZCBOYW1lPVwiIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIGZpZWxkTmFtZSAhPSBudWxsICkgewotCQl3cml0ZXIud3JpdGUoZmllbGROYW1lKTsKLQl9IGVsc2UgewotCQl3cml0ZXIud3JpdGUoIlVOTkFNRUQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQl3cml0ZXIud3JpdGUoIlwiIFJlY2VpdmVyPSIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCByZWNlaXZlciAhPSBudWxsICl7Ci0JCXdyaXRlci53cml0ZShyZWNlaXZlci50b1N0cmluZygpKTsKLQl9IGVsc2UgewotCQl3cml0ZXIud3JpdGUoIk5PTkUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0KLX0KLQotLyoqCi0gKiBUZXN0IHRoZSBmaWVsZCB0eXBlIHRvIGRldGVybWluZSBpZiBwcmltaXRpdmUgb3Igbm90LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWNhY2hlRmllbGQoKTsKLQlyZXR1cm4gZ2V0VHlwZUNsYXNzKCkuaXNQcmltaXRpdmUoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvSVBhcnNlckNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9JUGFyc2VyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMGMyMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9JUGFyc2VyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogSVBhcnNlckNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgdGhlIHBhcnNlci4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNS8wMCA5OjM3OjQ1IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJzZXJDb25zdGFudHMgewotCS8vIERlZmluZSB0aGUgZGVsaW1pdGVycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJTcGFjZSA9ICcgJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyUGVyaW9kID0gJy4nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJPcGVuUGFyZW4gPSAnKCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlckNsb3NlUGFyZW4gPSAnKSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlckNvbW1hID0gJywnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJRdW90ZSA9ICciJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyRXNjYXBlID0gJ1xcJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyU2luZ2xlUXVvdGUgPSAnXCcnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJPcGVuRWxpcHNlID0gJ3snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEZWxpbWl0ZXJDbG9zZUVsaXBzZSA9ICd9JzsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERlbGltaXRlck9wZW5TcXVhcmVCcmFjZSA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRGVsaW1pdGVyQ2xvc2VTcXVhcmVCcmFjZSA9ICddJzsKLQkvLyBEZWZpbmUgdGhlIG1hdGggZnVuY3Rpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9wZXJQbHVzID0gJysnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPcGVyTWludXMgPSAnLSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9wZXJNdWx0aXBseSA9ICcqJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT3BlckRpdmlkZSA9ICcvJzsKLQkvLyBEZWZpbmUgdGhlIHByaW1pdGl2ZSBmdW5jdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQml0T1IgPSAnfCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJpdEFORCA9ICcmJzsKLQkKLQkvLyBEZWZpbmUgY29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ29uc3RhbnROZXcgPSBuZXcgY2hhcltdIHsgJ24nICwgJ2UnICwgJ3cnIH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ29uc3RhbnRUcnVlID0gbmV3IGNoYXJbXSB7ICd0JyAsICdyJyAsICd1JyAsICdlJyB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIENvbnN0YW50RmFsc2UgPSBuZXcgY2hhcltdIHsgJ2YnICwgJ2EnICwgJ2wnICwgJ3MnICwgJ2UnIH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ29uc3RhbnROdWxsID0gbmV3IGNoYXJbXSB7ICduJyAsICd1JyAsICdsJyAsICdsJyB9OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Jbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjNjYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Jbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotCi1wdWJsaWMgY2xhc3MgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkKLQkKLS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg2MzMzOTA5MjYyMTAyNzY3MjdMOwotcHVibGljIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgZXhjKXsKLQlzdXBlcihleGMpOwotfQotcHVibGljIFRocm93YWJsZSBnZXRPcmlnaW5hbEV4Y2VwdGlvbigpewotCXJldHVybiBnZXRDYXVzZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Jbml0aWFsaXphdGlvblN0cmluZ1BhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9Jbml0aWFsaXphdGlvblN0cmluZ1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTNjZTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDEvMDAgODo1Mzo0NSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIGltcGxlbWVudHMgSVBhcnNlckNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGZDbGFzc0xvYWRlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBsZXRlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBmSW5pdFN0cmluZzsKLQlwcm90ZWN0ZWQgaW50IGZTb3VyY2VMZW5ndGg7Ci0JcHJvdGVjdGVkIGNoYXJbXSBmU291cmNlOwotCXByb3RlY3RlZCBpbnQgZlNvdXJjZVBvc2l0aW9uID0gLTE7Ci0JcHJpdmF0ZSBjaGFyW10gZkN1cnJlbnRUb2tlbjsKLQlwcml2YXRlIGNoYXIgZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IDA7Ci0JcHJvdGVjdGVkIEFycmF5TGlzdCBmRXhwcmVzc2lvblN0YWNrID0gbmV3IEFycmF5TGlzdCg0KTsKLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBmRXhwcmVzc2lvbjsKLS8qKgotICogSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyKFN0cmluZyBpbml0U3RyaW5nKXsKLQotCWZJbml0U3RyaW5nID0gaW5pdFN0cmluZzsKLQlmU291cmNlID0gaW5pdFN0cmluZy50b0NoYXJBcnJheSgpOwotCWZTb3VyY2VMZW5ndGggPSBmU291cmNlLmxlbmd0aDsKLQotfQotLyoqIExvb2sgZm9yIGEga25vd24gdG9rZW4KLSAqLwotcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmV4dFRva2VuKCl7Ci0KLQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gMDsKLQlpZiAoIGZTb3VyY2VQb3NpdGlvbiA+PSBmU291cmNlTGVuZ3RoIC0gMSApIHsKLQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCXJldHVybjsKLQl9Ci0KLQlmU291cmNlUG9zaXRpb24rKzsKLQkvLyBJZiB3ZSBhcmUgbm90IGluIGEgdG9rZW4gdGhlbiBsb29rIGZvciAiICIgb3IgZWxzZSBmb3IgYSBwZXJpb2QKLQljaGFyW10gZkN1cnJlbnRUb2tlblNvdXJjZSA9IG5ldyBjaGFyW2ZTb3VyY2VMZW5ndGhdOwotCWludCBpID0gMDsKLQlzY2FubmVyIDogZm9yICggOyBmU291cmNlUG9zaXRpb24gPCBmU291cmNlTGVuZ3RoIDsgZlNvdXJjZVBvc2l0aW9uKysgLCBpKysgKXsKLQkJLy8gQWR2YW5jZSB0aGUgc291cmNlIHBvc2l0aW9uIHNvIHdoZW4gZmluZGluZyB0aGUgbmV4dCB0b2tlbiB3ZSBza2lwIG92ZXIgdGhlICcuJyBvciAnICcKLQkJLy8gUmVjb3JkIHRoZSBkZWxpbWl0ZXIgdGhhdCB3YXMgZm91bmQKLQkJc3dpdGNoICggZlNvdXJjZVtmU291cmNlUG9zaXRpb25dICkgewotCQkJY2FzZSBEZWxpbWl0ZXJQZXJpb2Q6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyUGVyaW9kOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlck9wZW5QYXJlbjogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJPcGVuUGFyZW47Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyQ2xvc2VQYXJlbjogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJDbG9zZVBhcmVuOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlckNvbW1hOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlckNvbW1hOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlclNwYWNlOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlclNwYWNlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlclF1b3RlOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlclF1b3RlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlclNpbmdsZVF1b3RlOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlclNpbmdsZVF1b3RlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9CQkJCi0JCQljYXNlIERlbGltaXRlckVzY2FwZTogewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJFc2NhcGU7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyT3BlbkVsaXBzZTp7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IERlbGltaXRlck9wZW5FbGlwc2U7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlOnsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIERlbGltaXRlckNsb3NlU3F1YXJlQnJhY2U6ewotCQkJCWZDdXJyZW50VG9rZW5EZWxpbWl0ZXIgPSBEZWxpbWl0ZXJDbG9zZVNxdWFyZUJyYWNlOwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9CQkJCi0JCQljYXNlIERlbGltaXRlckNsb3NlRWxpcHNlOnsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gRGVsaW1pdGVyQ2xvc2VFbGlwc2U7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0JCQkJCi0JCQkvLyBEbyB0aGUgbWF0aCBmdW5jdGlvbnMKLQkJCWNhc2UgT3BlclBsdXM6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gT3BlclBsdXM7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgT3Blck1pbnVzOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IE9wZXJNaW51czsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJY2FzZSBPcGVyTXVsdGlwbHk6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gT3Blck11bHRpcGx5OwotCQkJCWJyZWFrIHNjYW5uZXI7Ci0JCQl9Ci0JCQljYXNlIE9wZXJEaXZpZGU6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gT3BlckRpdmlkZTsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQotCQkJLy8gRG8gdGhlIHByaW1pdGl2ZSBCaXRXaXNlIG9wZXJhdGlvbnMKLQkJCWNhc2UgQml0T1I6IHsKLQkJCQlmQ3VycmVudFRva2VuRGVsaW1pdGVyID0gQml0T1I7Ci0JCQkJYnJlYWsgc2Nhbm5lcjsKLQkJCX0KLQkJCWNhc2UgQml0QU5EOiB7Ci0JCQkJZkN1cnJlbnRUb2tlbkRlbGltaXRlciA9IEJpdEFORDsKLQkJCQlicmVhayBzY2FubmVyOwotCQkJfQkJCQotCQkJZGVmYXVsdDogewotCQkJCWZDdXJyZW50VG9rZW5Tb3VyY2VbaV0gPSBmU291cmNlW2ZTb3VyY2VQb3NpdGlvbl07Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBQdXNoIHRoZSB0b2tlbiBvbnRvIHRoZSBzdGFjayBmb3IgbGF0ZXIgZGVjb2RpbmcKLQlpZiAoIGkgPj0gMSApIHsKLQkJZkN1cnJlbnRUb2tlbiA9IG5ldyBjaGFyW2ldOwotCQlTeXN0ZW0uYXJyYXljb3B5KCBmQ3VycmVudFRva2VuU291cmNlICwgMCAsIGZDdXJyZW50VG9rZW4gLCAwICwgaSApOwotCX0gZWxzZSB7Ci0JCWZDdXJyZW50VG9rZW4gPSBuZXcgY2hhclswXTsKLQl9Ci0KLX0KLS8qKiBBbnN3ZXIgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIHsKLQotCXRyeSB7Ci0JCXJldHVybiBmRXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQl9IGNhdGNoIChFdmFsdWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgZTsJLy8gRG9uJ3QgbG9vc2UgdGhlc2UKLQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQl0aHJvdyBuZXcgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCX0KLQotfQotcHVibGljIHN0YXRpYyBPYmplY3QgZXZhbHVhdGUoU3RyaW5nIGluaXRTdHJpbmcpIHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gewotCi0JcmV0dXJuIGV2YWx1YXRlKGluaXRTdHJpbmcsbnVsbCk7Ci0KLX0KLXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV2YWx1YXRlKFN0cmluZyBpbml0U3RyaW5nLENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcikgdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0KLQlJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBwYXJzZXIgPSBudWxsOzsKLQl0cnkgewotCQlwYXJzZXIgPSBuZXcgSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIoaW5pdFN0cmluZyk7Ci0JCXBhcnNlci5zZXRDbGFzc0xvYWRlcihhQ2xhc3NMb2FkZXIpOwotCQlwYXJzZXIucGFyc2UoKTsKLQl9IGNhdGNoICggVGhyb3dhYmxlIGV4YyApIHsKLQkJdGhyb3cgbmV3IEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbihleGMpOwotCX0JCQotCXJldHVybiBwYXJzZXIuZXZhbHVhdGUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gYSBwYXJzZXIgYWxyZWFkeSBwYXJzZWQuIFVzZSB0aGUgZGVmYXVsdCBjbGFzc2xvYWRlciAoaS5lLiBjbGFzc2xvYWRlciB0aGF0IGxvYWRlZCBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcikuCi0gKiAKLSAqIEBwYXJhbSBpbml0U3RyaW5nCi0gKiBAcmV0dXJuIFRoZSBwYXJzZXIsIGFscmVhZHkgcGFyc2VkLgotICogQHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24KLSAqLwotCi1wdWJsaWMgc3RhdGljIEluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIGNyZWF0ZVBhcnNlcihTdHJpbmcgaW5pdFN0cmluZykgdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGNyZWF0ZVBhcnNlcihpbml0U3RyaW5nLCBudWxsKTsKLX0KLSAKLS8qKgotICogUmV0dXJuIGEgcGFyc2VyIGFscmVhZHkgcGFyc2VkLiBVc2UgdGhlIGdpdmVuIGNsYXNzbG9hZGVyLgotICogCi0gKiBAcGFyYW0gaW5pdFN0cmluZwotICogQHBhcmFtIGNsYXNzTG9hZGVyCi0gKiBAcmV0dXJuIFRoZSBwYXJzZXIsIGFscmVhZHkgcGFyc2VkLgotICogQHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24KLSAqLwotcHVibGljIHN0YXRpYyBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBjcmVhdGVQYXJzZXIoU3RyaW5nIGluaXRTdHJpbmcsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIHsKLQotCXRyeSB7Ci0JCUluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIHBhcnNlciA9IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcihpbml0U3RyaW5nKTsKLQkJcGFyc2VyLnNldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLQkJcGFyc2VyLnBhcnNlKCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfSBjYXRjaCAoIFRocm93YWJsZSBleGMgKSB7Ci0JCXRocm93IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24oZXhjKTsKLQl9Ci0KLX0KLQotLyoqIEFuYWx5emUgdGhlIHN0cmluZwotICovCi1wdWJsaWMgdm9pZCBwYXJzZSgpewotCQotCWNyZWF0ZUZpcnN0RXhwcmVzc2lvbigpOwotCWludCBpID0xOwotCXdoaWxlICggdHJ1ZSApewotCQljcmVhdGVOZXh0VG9rZW4oKTsKLQkJaWYgKCBpc0NvbXBsZXRlICkgewotCQkJLy8gSWYgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBpbmNvbXBsZXRlIGl0IG11c3QgYmUgY29tcGxldGVkIAotCQkJLy8gYnkgdGhlIGVuZCwgd2hpY2ggaXMgYmFzaWNhbGx5IHRoZSBlcXVpYXZsZW50IG9mIGE7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSAgewotCQkJaSsrOwotCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBmRXhwcmVzc2lvbi5wdXNoKCBmQ3VycmVudFRva2VuICwgZkN1cnJlbnRUb2tlbkRlbGltaXRlciApOwotCQkJLy8gSWYgdGhlIHJlc3VsdCBpZiBhIHB1c2ggdGhlbiBwdXNoIHRoZSBzdGFjawotCQkJaWYgKCByZXN1bHQuaXNDb21wbGV0ZSgpICkgewotCQkJCXBvcEV4cHJlc3Npb25TdGFjaygpOwotCQkJfSBlbHNlIGlmICggcmVzdWx0ICE9IGZFeHByZXNzaW9uICkgewotCQkJCXB1c2hFeHByZXNzaW9uU3RhY2socmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqCi0gKiBBbnN3ZXIgaWYgdGhlIHN0cmluZyByZXN1bHRzIGluIGEgcHJpbWl0aXZlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHRocm93cyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gewotCXRyeSB7Ci0JCXJldHVybiBmRXhwcmVzc2lvbi5pc1ByaW1pdGl2ZSgpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JfQotfQotCi1wdWJsaWMgQ2xhc3MgZ2V0RXhwZWN0ZWRUeXBlKCkgdGhyb3dzIEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJcmV0dXJuIGZFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24oZSk7Ci0JfQotfQotCi0vKiBQb3AgdGhlIHRvcCBleHByZXNzaW9uIG9mZiB0aGUgc3RhY2sKLSAqLwotcHJvdGVjdGVkIHZvaWQgcG9wRXhwcmVzc2lvblN0YWNrKCl7Ci0KLQlpZiAoIGZFeHByZXNzaW9uU3RhY2suc2l6ZSgpID4gMCApIHsKLQkJZkV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgZkV4cHJlc3Npb25TdGFjay5yZW1vdmUoZkV4cHJlc3Npb25TdGFjay5zaXplKCktMSk7Ci0JfQkKLX0KLS8qIFB1c2ggdGhlIGV4cHJlc3Npb24gb250byB0aGUgc3RhY2sKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHVzaEV4cHJlc3Npb25TdGFjayhFeHByZXNzaW9uIGFuRXhwcmVzc2lvbil7Ci0KLQkvLyBUaGUgY3VycmVudCBleHByZXNzaW9uIHNob3VsZCBnbyBvbnRvIHRoZSBzdGFjawotCWZFeHByZXNzaW9uU3RhY2suYWRkKGZFeHByZXNzaW9uKTsKLQkvLyBUaGUgY3VycmVudCBleHByZXNzaW9uIGlzIHJlcGxhY2VkIHdpdGggdGhlIGFyZ3VtZW50Ci0JZkV4cHJlc3Npb24gPSBhbkV4cHJlc3Npb247Ci0JCi19Ci1wcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaXJzdEV4cHJlc3Npb24oKXsKLQlpZiAoIGZFeHByZXNzaW9uID09IG51bGwgKSB7Ci0JCWZFeHByZXNzaW9uID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpOwotCX07Ci19Ci1wdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpewotCWZDbGFzc0xvYWRlciA9IGFDbGFzc0xvYWRlcjsJCi19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JU3RyaW5nQnVmZmVyIHdyaXRlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl3cml0ZXIuYXBwZW5kKCJQYXJzZXIuIHRva2VuPVwiIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIGZDdXJyZW50VG9rZW4gIT0gbnVsbCApIHsKLQkJd3JpdGVyLmFwcGVuZChmQ3VycmVudFRva2VuKTsKLQl9IAotCXdyaXRlci5hcHBlbmQoIlwiLCBkZWxpbT1cIiIpOyAvLyROT04tTkxTLTEkCi0Jd3JpdGVyLmFwcGVuZChmQ3VycmVudFRva2VuRGVsaW1pdGVyKTsKLQl3cml0ZXIuYXBwZW5kKCJcIiwgaW5pdFN0cmluZz1cIiIpOyAvLyROT04tTkxTLTEkCi0Jd3JpdGVyLmFwcGVuZChmSW5pdFN0cmluZyk7Ci0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwkKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMWUwNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE1lc3NhZ2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZSBleHRlbmRzIEV4cHJlc3Npb24gewotCXByb3RlY3RlZCBib29sZWFuIHRyYWlsaW5nUGVyaW9kID0gZmFsc2U7Ci0JcHJvdGVjdGVkIE1ldGhvZCBmTWV0aG9kOwotCXB1YmxpYyBFeHByZXNzaW9uIHJlY2VpdmVyOwotCXB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKLQlwdWJsaWMgYm9vbGVhbiBhcmdzQ2xvc2VkID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gZmFsc2U7Ci0JcHVibGljIGJvb2xlYW4gaW5zaWRlQXJnc0Nsb3NlZFBhcmVuID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZSA9IGZhbHNlOwotCXB1YmxpYyBBcnJheUxpc3QgYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkKLXB1YmxpYyBNZXNzYWdlKEV4cHJlc3Npb24gYVJlY2VpdmVyICwgY2hhcltdIHRva2VuICwgQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKXsKLQlyZWNlaXZlciA9IGFSZWNlaXZlcjsKLQltZXNzYWdlID0gbmV3IFN0cmluZyh0b2tlbik7Ci0JZkNsYXNzTG9hZGVyID0gYUNsYXNzTG9hZGVyOwotfQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiBpc0NvbXBsZXRlOwotfQotCi0vKioKLSAqIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHJlY2VpdmVyCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQljYWNoZU1ldGhvZCgpOwotCQotCS8vIEdldCB0aGUgYXJyYXkgb2YgYXJndW1lbnRzCi0JT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbYXJndW1lbnRzLnNpemUoKV07Ci0JSXRlcmF0b3IgaXRyID0gYXJndW1lbnRzLml0ZXJhdG9yKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMuc2l6ZSgpIDsgaSsrKXsKLQkJRXhwcmVzc2lvbiBhbkV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbilpdHIubmV4dCgpOwotCQlhcmdzW2ldID0gYW5FeHByZXNzaW9uLmV2YWx1YXRlKCk7Ci0JfQotCQotCU9iamVjdCByZWNlaXZlclZhbHVlID0gcmVjZWl2ZXIuZXZhbHVhdGUoKTsJLy8gU28gaWYgZXZhbHVhdGlvbiBleGNlcHRpb24gdGhyb3duLCB3ZSBkb24ndCB3cmFwcGVyIGFnYWluLgotCQotCXRyeSB7Ci0JCXJldHVybiBmTWV0aG9kLmludm9rZShyZWNlaXZlclZhbHVlLCBhcmdzKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQl9Ci19Ci0KLS8qKgotICogQ2FjaGUgdGhlIG1lc3NhZ2UKLSAqLwotcHJvdGVjdGVkIHZvaWQgY2FjaGVNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlpZiAoZk1ldGhvZCA9PSBudWxsKSB7Ci0JCUNsYXNzW10gYXJnVHlwZXMgPSBuZXcgQ2xhc3NbYXJndW1lbnRzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ciA9IGFyZ3VtZW50cy5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpPTA7IGk8YXJnVHlwZXMubGVuZ3RoOyBpKyspCi0JCQlhcmdUeXBlc1tpXSA9IGdldEV2YWx1YXRpb25UeXBlQ2xhc3MoKEV4cHJlc3Npb24pIGl0ci5uZXh0KCkpOwotCQkJCi0JCXRyeSB7Ci0JCQlmTWV0aG9kID0gTWV0aG9kSGVscGVyLmZpbmRDb21wYXRpYmxlTWV0aG9kKGdldEV2YWx1YXRpb25UeXBlQ2xhc3MocmVjZWl2ZXIpLCBtZXNzYWdlLCBhcmdUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQotCi0KLS8qKgotICogZ2V0VHlwZUNsYXNzIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JY2FjaGVNZXRob2QoKTsKLQlyZXR1cm4gZk1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gIiI7CS8vIElmIHdlIGdvdCB0aGlzIGZhciwgd2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzLiAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIHB1c2ggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuLCBjaGFyIHRva2VuRGVsaW1pdGVyKSB7Ci0JCi0JLy8gSWYgd2UgYXJlIGNsb3NlZCBhbmQgd2UgcmVjZWl2ZSBhIC4gd2l0aCBubyB0b2tlbiB0aGVuIHJlbWVtYmVyIHRoaXMKLQlpZiAoIGFyZ3NDbG9zZWQgJiYgIXRyYWlsaW5nUGVyaW9kICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCAmJiB0b2tlbi5sZW5ndGggPT0gMCApIHsKLQkJdHJhaWxpbmdQZXJpb2QgPSB0cnVlOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0JLy8gSWYgd2UgaGF2ZSBiZWVuIGNsb3NlZCB3aXRoIGEgLiBhbmQgd2UgcmVjZWl2ZSBhIC4gdGhlbiB3ZSBhcmUgYSBmaWVsZAotCWlmICggdHJhaWxpbmdQZXJpb2QgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICkgewotCQlyZXR1cm4gbmV3IEZpZWxkKHRoaXMsdG9rZW4sZkNsYXNzTG9hZGVyKTsKLQl9Ci0JLy8gSWYgd2UgaGF2ZSBiZWVuIGNsb3NlZCB3aXRoIGEgLiBhbmQgd2UgcmVjZWl2ZSBhICggd2UgYXJlIGEgbWVzc2FnZQotCWlmICggdHJhaWxpbmdQZXJpb2QgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuICkgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2UodGhpcyx0b2tlbixmQ2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvLyBJZiB3ZSBoYXZlIGJlZW4gY2xvc2VkIGFuZCB3ZSByZWNlaXZlIGEgLCBvciBhICkgd2UgYXJlIGNvbXBsZXRlIC0gdGhpcyBpcyBhIHN0cnVjdHVyYWwgdG9rZW4gaW50ZW5kZWQgZm9yIHNvbWVvbmUgZWxzZSwKLQkvLyBwcm9iYWJseSBhIG1lc3NhZ2UgYXJndW1lbnQgbG93ZXIgZG93biB0aGUgc3RhY2sKLQlpZiAoYXJnc0Nsb3NlZCAmJiAodG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ29tbWEgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbikpewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCi0JLy8gSWYgdGhlIGFyZ3MgYXJlIG9wZW5lZCBhbmQgYSB0b2tlbiB3YXMgc3VwcGxpZWQgdGhlbiBpdCBtdXN0IGJlIGFuIGFyZ3VtZW50Ci0JLy9pZiAoIGFyZ3NPcGVuZWQgJiYgKCB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hIHx8IAotCS8vdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU3BhY2UgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUgfHwgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kKSkgewotCWlmICghYXJnc0Nsb3NlZCl7CQotCQlpZiAoIGFyZ3VtZW50cy5zaXplKCkgPiAwICl7Ci0JCQlFeHByZXNzaW9uIG9wZW5Bcmd1bWVudCA9IChFeHByZXNzaW9uKWFyZ3VtZW50cy5nZXQoYXJndW1lbnRzLnNpemUoKS0xKTsKLQkJCWlmICggIW9wZW5Bcmd1bWVudC5pc0NvbXBsZXRlKCkgKSB7Ci0JCQkJb3BlbkFyZ3VtZW50LnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJCS8vIElmIHRoZSBhcmd1bWVudCBpcyBjb21wbGV0ZSBhbmQgd2UgcmVjZWl2ZWQgYSApIHRoZW4gdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUKLQkJCQlpZiAoIG9wZW5Bcmd1bWVudC5pc0NvbXBsZXRlKCkgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbil7Ci0JCQkJCWFyZ3NDbG9zZWQgPSB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQkJfQkKLQkJCi0JCS8vIFdlIG11c3QgaGF2ZSBhIG5ldyBhcmd1bWVudCAtIHByb2Nlc3MgYWNjb3JkaW5nbHkJCi0JCUV4cHJlc3Npb24gbmV3QXJndW1lbnQgPSBudWxsOwotCQlpZiAoIWluc2lkZUFyZ3NPcGVuZWRQYXJlbiAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pewotCQkJaW5zaWRlQXJnc09wZW5lZFBhcmVuID0gdHJ1ZTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IFN0YXRlbWVudChmQ2xhc3NMb2FkZXIpLnB1c2godG9rZW4sdG9rZW5EZWxpbWl0ZXIpOwotCQkJbmV3QXJndW1lbnQgPSBuZXcgTWVzc2FnZUFyZ3VtZW50KG5ld0FyZ3VtZW50KTsKLQkJCWFyZ3VtZW50cy5hZGQobmV3QXJndW1lbnQpOwotCi0JCX0KLQkJaWYgKCBuZXdBcmd1bWVudCA9PSBudWxsICYmICh0b2tlbi5sZW5ndGggPiAwIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbiApKSB7Ci0JCQluZXdBcmd1bWVudCA9IG5ldyBTdGF0ZW1lbnQoZkNsYXNzTG9hZGVyKS5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCW5ld0FyZ3VtZW50ID0gbmV3IE1lc3NhZ2VBcmd1bWVudChuZXdBcmd1bWVudCk7Ci0JCQlhcmd1bWVudHMuYWRkKG5ld0FyZ3VtZW50KTsKLQkJfQotCQkvLyBJZiB0aGUgdG9rZW4gYWZ0ZXIgdGhlIGFyZ3VtZW50IGlzIGEgKSB0aGVuIHRoZSBtZXNzYWdlIGlzIGJlaW5nIGNsb3NlZAotCQlpZiAoICFpbnNpZGVBcmdzT3BlbmVkUGFyZW4gICYmIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gKSB7Ci0JCQlhcmdzQ2xvc2VkID0gdHJ1ZTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmICggaW5zaWRlQXJnc09wZW5lZFBhcmVuICAmJiB0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuICkgewotCQkJaW5zaWRlQXJnc0Nsb3NlZFBhcmVuICA9IHRydWU7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8vIElmIHRoZSB0b2tlbiBhZnRlciB0aGUgYXJndW1lbnQgaXMgYSAsIG9yIGEgJyAnIHRoZW4gdGhlIGFyZ3VtZW50IGlzIGJlaW5nIGNsb3NlZAotCQlpZiAoIHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hIHx8IHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlclNwYWNlICkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJCi0JCS8vIE90aGVyd2lzZSB0aGUgbmV3IGFyZ3VtZW50IGlzIHN0aWwgcHJvY2Vzc2luZy4gIFJldHVybiBpdAotLy8JCXJldHVybiBuZXdBcmd1bWVudDsKLQl9Ci0JCi0JLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIG1lc3NhZ2UgeWV0LCB0aGVuIGNvbnN1bWUgdGhpcyBvbmUKLQlpZiAoIG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCApIHsKLQkJbWVzc2FnZSA9IG5ldyBTdHJpbmcodG9rZW4pOwotCQlyZXR1cm4gdGhpczsKLQl9CQotCi0JcmV0dXJuIHRoaXM7CQotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCi0JamF2YS5pby5TdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJNc2cgTmFtZT1cIiIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCBtZXNzYWdlICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZShtZXNzYWdlKTsKLQl9IGVsc2UgewotCQl3cml0ZXIud3JpdGUoIlVOTkFNRUQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQl3cml0ZXIud3JpdGUoIlwiIFJjdj0oIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIHJlY2VpdmVyICE9IG51bGwgKXsKLQkJd3JpdGVyLndyaXRlKHJlY2VpdmVyLnRvU3RyaW5nKCkpOwotCX0gZWxzZSB7Ci0JCXdyaXRlci53cml0ZSgiTk9ORSIpOyAvLyROT04tTkxTLTEkCi0JfQotCXdyaXRlci53cml0ZSgnKScpOwotCWlmICggYXJndW1lbnRzICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZSgiQXJncygiKTsJCSAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ZXIgPSBhcmd1bWVudHMuaXRlcmF0b3IoKTsKLQkJaW50IGk9MTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpewotCQkJd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKGkpLnRvU3RyaW5nKCkpOwotCQkJd3JpdGVyLndyaXRlKCcoJyk7Ci0JCQl3cml0ZXIud3JpdGUoaXRlci5uZXh0KCkudG9TdHJpbmcoKSk7Ci0JCQl3cml0ZXIud3JpdGUoIiksIik7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCQl3cml0ZXIud3JpdGUoJyknKTsJCQkJCi0JfQotCQotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQotfQotCi0vKioKLSAqIElzIHRoZSBtZXNzYWdlIHJlc3VsdCBhIHByaW1pdGl2ZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQljYWNoZU1ldGhvZCgpOwotCXJldHVybiBmTWV0aG9kLmdldFJldHVyblR5cGUoKS5pc1ByaW1pdGl2ZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlQXJndW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTWVzc2FnZUFyZ3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Zjg1ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9NZXNzYWdlQXJndW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTWVzc2FnZUFyZ3VtZW50LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VBcmd1bWVudCBleHRlbmRzIEV4cHJlc3Npb24gewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZSA9IGZhbHNlOwotCUV4cHJlc3Npb24gZkV4cHJlc3Npb247Ci0JQXJyYXlMaXN0IGZFeHByZXNzaW9uU3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLXB1YmxpYyBNZXNzYWdlQXJndW1lbnQoRXhwcmVzc2lvbiBhbkV4cHJlc3Npb24pewotCWZFeHByZXNzaW9uID0gYW5FeHByZXNzaW9uOwotfQotCQotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQotCXJldHVybiBmRXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCQotfQkKLQotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQotCXJldHVybiBmRXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3MoKTsKLQkKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiBmRXhwcmVzc2lvbi5nZXRUeXBlQ2xhc3NOYW1lKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGlzQ29tcGxldGUgfHwgZkV4cHJlc3Npb24uaXNDb21wbGV0ZSgpOwotfQotCQotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIGRlbGltaXRlcil7Ci0KLQkvLyBFdmVuIGlmIG91ciBleHByZXNzaW9uIGlzIGNvbXBsZXRlIGFuZCB3ZSByZWNlaXZlIGFueXRoaW5nIG90aGVyIHRoYW4gYSAsIHRoZW4gdGhlIGV4cHJlc3Npb24gbXVzdCBwcm9jZXNzIGl0IGFzIHRoaXMgbWF5IGJlIGEgZmllbGQgb3IgbWVzc2FnZQotCS8vIHRoYXQgaXMgYmVpbmcgc2VudCB0byB0aGUgZXhwcmVzc2lvbiB0byBtYWtlIHVwIGEgY29tcGxleCBhcmd1bWVudAkKLQlFeHByZXNzaW9uIHJlc3VsdCA9IGZFeHByZXNzaW9uLnB1c2godG9rZW4sZGVsaW1pdGVyKTsKLQkvLyBJZiB0aGUgcmVzdWx0IGlmIGEgcHVzaCB0aGVuIHB1c2ggdGhlIHN0YWNrCi0JaWYgKCByZXN1bHQgIT0gZkV4cHJlc3Npb24gKSB7Ci0JCXB1c2hFeHByZXNzaW9uU3RhY2socmVzdWx0KTsKLQl9IGVsc2UgaWYgKHJlc3VsdC5pc0NvbXBsZXRlKCkpewotCQkvLyBJZiBvdXIgZXhwcmVzc2lvbiBpcyBjb21wbGV0ZSwgd2UgYXJlIGNvbXBsZXRlZCB3aXRoIGEgKSBwb3AgdGhlIHN0YWNrIHNvIHRoZSBwcmV2aW91cyBleHByZXNzaW9uIGNhbiBwcm9jZXNzIHVzCi0JCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbiApIHsKLQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJcG9wRXhwcmVzc2lvblN0YWNrKCk7Ci0JCX0gZWxzZSBpZiAoZGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSApIHsKLQkJCS8vIElmIHdlIHJlY2VpdmUgYSBjb21tYSB3ZSBwb3AgdGhlIHN0YWNrIHNvIHRoZSBwcmV2aW91cyBleHByZXNzaW9uIGNhbiBwcm9jZXNzIHVzIGJ1dCB3ZSBkb24ndCBmbGFnIHVzIGFzIGNvbXBsZXRlCi0JCQlwb3BFeHByZXNzaW9uU3RhY2soKTsKLQkJCS8vIHVubGVzcyBvdXIgZXhwcmVzc2lvbiBpcyBzb21lIGFycmF5IGFyZ3VtZW50IEFORCBpdCBpcyBjb21wbGV0ZSBBTkQgd2UgaGF2ZSBhIGNsb3NlIGVsaXBzZSB9Ci0JCX0gZWxzZSBpZiAoIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZUVsaXBzZSApIHsKLQkJCXBvcEV4cHJlc3Npb25TdGFjaygpOwotCQkJaWYgKCBmRXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5QXJndW1lbnRzICkgewotCQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiB0aGlzOwotfQkKLQkKLS8qIFBvcCB0aGUgdG9wIGV4cHJlc3Npb24gb2ZmIHRoZSBzdGFjawotICovCi1wcm90ZWN0ZWQgdm9pZCBwb3BFeHByZXNzaW9uU3RhY2soKXsKLQotCWlmICggZkV4cHJlc3Npb25TdGFjay5zaXplKCkgPiAwICkgewotCQlFeHByZXNzaW9uIGxhc3RFeHByZXNzaW9uID0gKEV4cHJlc3Npb24pZkV4cHJlc3Npb25TdGFjay5nZXQoZkV4cHJlc3Npb25TdGFjay5zaXplKCkgLSAxKTsKLQkJaWYgKCAhbGFzdEV4cHJlc3Npb24uaXNDb21wbGV0ZSgpICkgewotCQkJZkV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgZkV4cHJlc3Npb25TdGFjay5yZW1vdmUoZkV4cHJlc3Npb25TdGFjay5zaXplKCkgLSAxKTsKLQkJfSBlbHNlIHsgCi0JCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJfSAKLQl9IGVsc2UgewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQl9Ci19Ci0KLS8qIFB1c2ggdGhlIGV4cHJlc3Npb24gb250byB0aGUgc3RhY2sKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHVzaEV4cHJlc3Npb25TdGFjayhFeHByZXNzaW9uIGFuRXhwcmVzc2lvbil7Ci0KLQkvLyBUaGUgY3VycmVudCBleHByZXNzaW9uIHNob3VsZCBnbyBvbnRvIHRoZSBzdGFjawotCWZFeHByZXNzaW9uU3RhY2suYWRkKGZFeHByZXNzaW9uKTsKLQkvLyBUaGUgY3VycmVudCBleHByZXNzaW9uIGlzIHJlcGxhY2VkIHdpdGggdGhlIGFyZ3VtZW50Ci0JZkV4cHJlc3Npb24gPSBhbkV4cHJlc3Npb247Ci0JCi19Ci0KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCl7Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJBcmcoIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIGZFeHByZXNzaW9uICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZShmRXhwcmVzc2lvbi50b1N0cmluZygpKTsKLQl9Ci0Jd3JpdGVyLndyaXRlKCIpIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci19Ci1wdWJsaWMgdm9pZCBjb250cmlidXRlQXJndW1lbnROdW1iZXIoTGlzdCBhcmd1bWVudE51bWJlckxpc3QpewotCi0JaWYgKCBmRXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5QXJndW1lbnRzICkgewotCQkoKEFycmF5QXJndW1lbnRzKWZFeHByZXNzaW9uKS5jb250cmlidXRlQXJndW1lbnROdW1iZXIoYXJndW1lbnROdW1iZXJMaXN0KTsKLQl9CQotCQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9OdWxsTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9OdWxsTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTIwMTc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTnVsbExpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1ldGhvZEhlbHBlcjsKLQotLyoKLSAqICAkUkNTZmlsZTogTnVsbExpdGVyYWwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotcHVibGljIGNsYXNzIE51bGxMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci1wdWJsaWMgTnVsbExpdGVyYWwoKXsKLX0KLS8qKgotICogZXZhbHVhdGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCl7Ci0JcmV0dXJuIE1ldGhvZEhlbHBlci5OVUxMX1RZUEU7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gTWV0aG9kSGVscGVyLk5VTExfVFlQRS5nZXROYW1lKCk7Ci19Ci0vKioKLSAqIHRydWUgb3IgZmFsc2UgY2Fubm90IGNvbnN1bWUgYW55IGtpbmQgb2YgZXhwcmVzc2lvbiBzbyB3ZSBtdXN0IHJldHVybiBudWxsCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCXJldHVybiBudWxsOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogTnVsbCBpcyBub3QgcHJpbWl0aXZlCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL051bWJlckxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTnVtYmVyTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWUwZTgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvTnVtYmVyTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBOdW1iZXJMaXRlcmFsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBOdW1iZXJMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBudW1iZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcGxldGUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgQ2xhc3MgbnVtYmVyQ2xhc3MgPSBJbnRlZ2VyLlRZUEU7Ci0JcHJvdGVjdGVkIGludCBleHBvbmVudEZsYWcgPSBOT19FWFBPTkVOVDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludAotCQlOT19FWFBPTkVOVCA9IDAsCi0JCUhBU19FWFBPTkVOVCA9IDEsCi0JCUhBU19FWFBPTkVOVF9NSU5VUyA9IDI7Ci0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyTGl0ZXJhbCgpewotfQotLyoqCi0gKiBldmFsdWF0ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXRyeSB7Ci0JCS8vIFJldHVybiBhIG51bWJlciBvZiB0aGUgY29ycmVjdCBpbnN0YW5jZQotCQlpZiAobnVtYmVyQ2xhc3MgPT0gRmxvYXQuVFlQRSl7Ci0JCQlyZXR1cm4gbmV3IEZsb2F0KEZsb2F0LnBhcnNlRmxvYXQobnVtYmVyU3RyaW5nKSk7Ci0JCX0gZWxzZSBpZiAobnVtYmVyQ2xhc3MgPT0gTG9uZy5UWVBFICkgewotCQkJcmV0dXJuIExvbmcuZGVjb2RlKG51bWJlclN0cmluZyk7Ci0JCX0gZWxzZSBpZiAobnVtYmVyQ2xhc3MgPT0gRG91YmxlLlRZUEUgKXsKLQkJCXJldHVybiBuZXcgRG91YmxlKERvdWJsZS5wYXJzZURvdWJsZShudW1iZXJTdHJpbmcpKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gSW50ZWdlci5kZWNvZGUobnVtYmVyU3RyaW5nKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbihlKTsKLQl9Ci0JCi19Ci1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGlzQ29tcGxldGU7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSB0eXBlIG9mIG51bWJlciB0aGF0IHdlIGFyZS4KLSAqLwotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpewotCXJldHVybiBudW1iZXJDbGFzczsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ2xhc3NOYW1lKCkgewotCXJldHVybiBudW1iZXJDbGFzcyAhPSBudWxsID8gbnVtYmVyQ2xhc3MuZ2V0TmFtZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogSWYgdGhlIGRlbGltaXRlciBpcyBhbiBvcGVyYXRpb24gc3VjaCBhcyBhICssLSwvLCogdGhlbiB3ZSBjYW4gY29uc3VtZSBpdAotICogSWYgdGhlIGRlbGltaXRlciBpcyBwZXJpb2QgYW5kIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUgdGhlbiBpdCBpcyB0aGUgZGVjaW1hbCBwb3J0aW9uIG9mIHVzCi0gKi8KLXB1YmxpYyBFeHByZXNzaW9uIHB1c2goY2hhcltdIHRva2VuICwgY2hhciBkZWxpbWl0ZXIpewotCQkKLQkvLyBDbG9zZSBicmFja2V0cyBjb21wbGV0ZSB1c2UJCQotCWlmKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDb21tYSB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VFbGlwc2UpewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQl9Ci0JCi0JaWYgKGRlbGltaXRlciA9PSBPcGVyTWludXMgJiYgbnVtYmVyU3RyaW5nLmxlbmd0aCgpID09IDApCi0JCW51bWJlclN0cmluZys9T3Blck1pbnVzOwkvLyBObyBkaWdpdHMgeWV0LCBidXQgd2UgaGF2ZSBhIG1pbnVzIHNpZ24sIHNvIGFkZCB0byBhY2N1bXVsYXRpbmcgbnVtYmVyLgotCQkKLQludW1iZXJTdHJpbmcgKz0gcHJvY2Vzc051bWJlclRva2VuKHRva2VuKTsJCi0JCi0JLy8gSWYgd2UgaGF2ZSBwYXJ0IG9mIGEgbnVtYmVyIGFuZCBhcmUgYXNrZWQgdG8gZG8gc29tZSBhcml0aG1ldGljIHRocm93IGFuIAotCS8vIGVycm9yIHRoYXQgdGhpcyBoYXMgbm90IGJlZW4gY29kZWQgeWV0LCBleGNlcHQgbWludXMgY291bGQgYmUgcGFydCBvZiBhbiBleHBvbmVudC4KLQlpZihudW1iZXJTdHJpbmcubGVuZ3RoKCkgPiAwICYmIHRva2VuLmxlbmd0aCA+IDEpIHsKLQkJc3dpdGNoKGRlbGltaXRlcil7Ci0JCQljYXNlIE9wZXJNaW51czoKLQkJCQlpZiAoZXhwb25lbnRGbGFnID09IEhBU19FWFBPTkVOVCkgewotCQkJCQlleHBvbmVudEZsYWcgPSBIQVNfRVhQT05FTlRfTUlOVVM7Ci0JCQkJCW51bWJlclN0cmluZyArPSBPcGVyTWludXM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWNhc2UgT3BlclBsdXM6CQkJCi0JCQljYXNlIE9wZXJNdWx0aXBseToKLQkJCWNhc2UgT3BlckRpdmlkZToKLQkJCXsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgZG8gYXJpdGhtZXRpYyB5ZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kKXsKLQkJbnVtYmVyQ2xhc3MgPSBEb3VibGUuVFlQRTsJLy8gQSBkZWNpbWFsIG1ha2VzIGl0IGRvdWJsZS4KLQkJbnVtYmVyU3RyaW5nICs9IERlbGltaXRlclBlcmlvZDsKLQl9CQotCi0JaWYoZGVsaW1pdGVyID09IEJpdE9SIHx8IGRlbGltaXRlciA9PSBCaXRBTkQpewotCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgUHJpbWl0aXZlT3BlcmF0aW9uKHRoaXMsZGVsaW1pdGVyKTsKLQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlyZXR1cm4gdGhpczsKLQkKLX0KLXByb3RlY3RlZCBTdHJpbmcgcHJvY2Vzc051bWJlclRva2VuKGNoYXJbXSB0b2tlbil7Ci0JCi0JZm9yIChpbnQgaT0wOyBpPHRva2VuLmxlbmd0aDsgaSsrKQotCQlpZiAodG9rZW5baV0gPT0gJ0UnIHx8IHRva2VuW2ldID09ICdlJykgewotCQkJbnVtYmVyQ2xhc3MgPSBEb3VibGUuVFlQRTsJLy8gRGVmaW5pdGVseSBhIGZsb2F0aW5nIGJlY2F1c2Ugb2YgdGhpcy4KLQkJCWV4cG9uZW50RmxhZyA9IEhBU19FWFBPTkVOVDsKLQkJCWJyZWFrOwotCQl9Ci0JCQkKLQkvLyBUaGUgdG9rZW4gY291bGQgYmUgYSBudW1iZXIsIGUuZy4gMTAgb3IgNSBvciBjb3VsZCBiZSBxdWFsaWZpZWQgd2l0aCBhIHByaW1pdGl2ZQotCS8vIHN1ZmZpeCwgZS5nLiAxMGwgb3IgNWYKLQljaGFyW10gbnVtYmVyVG9rZW4gPSB0b2tlbjsKLQlpZiAoIHRva2VuLmxlbmd0aCA+IDAgKSB7Ci0JCXN3aXRjaCh0b2tlblt0b2tlbi5sZW5ndGggLSAxXSl7Ci0JCQljYXNlICdGJzogCQkJCi0JCQljYXNlICdmJzoKLQkJCQludW1iZXJDbGFzcyA9IEZsb2F0LlRZUEU7Ci0JCQkJbnVtYmVyVG9rZW4gPSBuZXcgY2hhclt0b2tlbi5sZW5ndGggLSAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRva2VuLDAsbnVtYmVyVG9rZW4sMCxudW1iZXJUb2tlbi5sZW5ndGgpOwotCQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnTCc6CQkJCi0JCQljYXNlICdsJzoKLQkJCQludW1iZXJDbGFzcyA9IExvbmcuVFlQRTsKLQkJCQludW1iZXJUb2tlbiA9IG5ldyBjaGFyW3Rva2VuLmxlbmd0aCAtIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodG9rZW4sMCxudW1iZXJUb2tlbiwwLG51bWJlclRva2VuLmxlbmd0aCk7CQkJCQotCQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnRCc6CQkJCi0JCQljYXNlICdkJzoKLQkJCQludW1iZXJDbGFzcyA9IERvdWJsZS5UWVBFOwotCQkJCW51bWJlclRva2VuID0gbmV3IGNoYXJbdG9rZW4ubGVuZ3RoIC0gMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weSh0b2tlbiwwLG51bWJlclRva2VuLDAsbnVtYmVyVG9rZW4ubGVuZ3RoKTsJCQkJCi0JCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCQkKLQlyZXR1cm4gbmV3IFN0cmluZyhudW1iZXJUb2tlbik7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0KLQlqYXZhLmlvLlN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIk51bWJlciBcIiIpOyAvLyROT04tTkxTLTEkCi0Jd3JpdGVyLndyaXRlKG51bWJlclN0cmluZyk7Ci0Jd3JpdGVyLndyaXRlKCJcIiIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotCi19Ci0KLS8qKgotICogTnVtYmVyIGxpdGVyYWxzIGFyZSBwcmltaXRpdmUKLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1ByaW1pdGl2ZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9QcmltaXRpdmVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlMjU0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1ByaW1pdGl2ZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBUaGlzIGlzIGZvciBwcmltaXRpdmUgZXhwcmVzc2lvbnMgdGhhdCBhcmUgb3B0aW1pemVkIG91dCB0aGUgY29tcGlsZXIgc3VjaCBhcyBiaXQgb3IsIGJpdCBhbmQsIGV0Yy4uCi0gICAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKgotICogICRSQ1NmaWxlOiBQcmltaXRpdmVPcGVyYXRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVPcGVyYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQkKLQlwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbjsJCQkJLy8gVGhpcyBjYW4gYmUgQml0T1Igb3IgQml0QU5ECi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gcmVjZWl2ZXI7CS8vIFRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcGxldGUgPSBmYWxzZTsKLQkKLQlwdWJsaWMgUHJpbWl0aXZlT3BlcmF0aW9uKEV4cHJlc3Npb24gYVJlY2VpdmVyLCBpbnQgYW5PcGVyYXRpb24pewotCQlyZWNlaXZlciA9IGFSZWNlaXZlcjsKLQkJb3BlcmF0aW9uID0gYW5PcGVyYXRpb247Ci0JfQotCi0JcHVibGljIE9iamVjdCBldmFsdWF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgbGVmdEhhbmRTaWRlID0gcmVjZWl2ZXIuZXZhbHVhdGUoKTsKLQkJT2JqZWN0IHJpZ2h0SGFuZFNpZGUgPSBjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCQlpZiAobGVmdEhhbmRTaWRlIGluc3RhbmNlb2YgSW50ZWdlciAmJiByaWdodEhhbmRTaWRlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJaWYob3BlcmF0aW9uID09IEJpdE9SKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKCgoSW50ZWdlcilsZWZ0SGFuZFNpZGUpLmludFZhbHVlKCkgfCAoKEludGVnZXIpcmlnaHRIYW5kU2lkZSkuaW50VmFsdWUoKSk7CQkJCQotCQkJfSBlbHNlIGlmKG9wZXJhdGlvbiA9PSBCaXRBTkQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChJbnRlZ2VyKWxlZnRIYW5kU2lkZSkuaW50VmFsdWUoKSAmICgoSW50ZWdlcilyaWdodEhhbmRTaWRlKS5pbnRWYWx1ZSgpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcmltaXRpdmVPcGVyYXRpb24uRXZhbHVhdGUuSW52YWxpZE9wZXJhdG9yX0VYQ18iKSwgbmV3IE9iamVjdFtde2dldE9wZXJEZXNjcmlwdGlvbigpLCBsZWZ0SGFuZFNpZGUsIHJpZ2h0SGFuZFNpZGV9KSk7CQkgLy8kTk9OLU5MUy0xJAotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJEZXNjcmlwdGlvbigpewotCQlpZihvcGVyYXRpb24gPT0gQml0T1IpIHJldHVybiAifCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9wZXJhdGlvbiA9PSBCaXRBTkQpIHJldHVybiAiJiI7CQkJIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICI/Pz8iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGlzQ29tcGxldGU7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gSW50ZWdlci5UWVBFOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIEludGVnZXIuVFlQRS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4sIGNoYXIgdG9rZW5EZWxpbWl0ZXIpIHsKLQkKLQkJLy8gQ3JlYXRlIGEgbmV3IHN0YXRlbWVudCBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbCAoIHdlIGFyZSBhbHdheXMgY3JlYXRlZCB3aXRoIGEgcmVjZWl2ZXIgKQotCQlpZihjdXJyZW50RXhwcmVzc2lvbiA9PSBudWxsICYmIHRva2VuLmxlbmd0aCA+IDApewotCQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcikucHVzaCh0b2tlbix0b2tlbkRlbGltaXRlcik7Ci0JCQlwdXNoRXhwcmVzc2lvblN0YWNrKGN1cnJlbnRFeHByZXNzaW9uKTsKLQkJCXJldHVybiB0aGlzOwotCQl9IAotCQkKLQkJLy8gSWdub3JlIHdoaXRlc3BhY2UKLQkJaWYodG9rZW4ubGVuZ3RoID09IDAgJiYgdG9rZW5EZWxpbWl0ZXIgPT0gJyAnKSByZXR1cm4gdGhpczsKLQkJCi0JCS8vIElmIHdlIGhhdmUgYW4gYXJndW1lbnQgd2UganVzdCBrZWVwIHB1c2hpbmcgdGhlIGV4cHJlc3Npb24gb250byB0aGlzCi0JCWlmKGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwpewotCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBjdXJyZW50RXhwcmVzc2lvbi5wdXNoKHRva2VuLHRva2VuRGVsaW1pdGVyKTsKLQkJCWlmKHJlc3VsdCAhPSBjdXJyZW50RXhwcmVzc2lvbil7Ci0JCQkJcHVzaEV4cHJlc3Npb25TdGFjayhyZXN1bHQpOwotCQkJfQotCQl9Ci0JCQotCQlpZihjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsICYmIGN1cnJlbnRFeHByZXNzaW9uLmlzQ29tcGxldGUoKSl7Ci0JCQlpZih0b2tlbkRlbGltaXRlciA9PSBEZWxpbWl0ZXJDb21tYSl7Ci0JCQkJaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9IGVsc2UgaWYgKHRva2VuRGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4pewotCQkJCWlmKHJlY2VpdmVyLnBhcmVudGhlc2lzTGV2ZWwgPiAwKXsKLQkJCQkJcmVjZWl2ZXIucGFyZW50aGVzaXNMZXZlbC0tOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlzQ29tcGxldGUgPSB0cnVlOwkJCQotCQkJCQlyZXR1cm4gdGhpczsJCQotCQkJCX0KLQkJCX0KLQkJfQkJCQkKLQkKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHJlY2VpdmVyICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQocmVjZWl2ZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0T3BlckRlc2NyaXB0aW9uKCkpOwotCQlpZiAoY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChjdXJyZW50RXhwcmVzc2lvbi50b1N0cmluZygpKTsgCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2ZGY1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1Byb3h5SW5pdFBhcnNlck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogUHJveHlJbml0UGFyc2VyTWVzc2FnZXMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotLyoqCi0gKiBHZW5lcmFsIFByb3h5IE5MUyBDb25zdGFudHMKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzEzLzAwIDEwOjQ2OjU4IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUHJveHlJbml0UGFyc2VyTWVzc2FnZXMgewotCS8vIFJlc291cmNlIEJ1bmRsZSB0byB1c2UgZm9yIGJhc2ljIFByb3h5IE5MUyByZXNvdXJjZXMuCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5tZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBLZXlzIGZvciBtZXNzYWdlcy9zdHJpbmdzIHdpdGhpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nCi0JCVVORVhQRUNURURfVE9LRU4gPSAiVW5leHBlY3RlZFRva2VuX0VYQ18iLCAvLyROT04tTkxTLTEkCi0JCVNUQVRFTUVOVF9VTkVYUEVDVEVEX0VYRUNVVElPTiA9ICJTdGF0ZW1lbnQuVW5leHBlY3RlZEV4ZWN1dGlvbl9FWENfIiwgLy8kTk9OLU5MUy0xJAotCQlTVEFURU1FTlRfVU5FWFBFQ1RFRF9FVkFMVUFUSU9OID0gIlN0YXRlbWVudC5VbmV4cGVjdGVkRXZhbHVhdGlvbl9FWENfIgkJOyAvLyROT04tTkxTLTEkCi0JCQotCXByaXZhdGUgUHJveHlJbml0UGFyc2VyTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RhdGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI0YTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFN0YXRlbWVudC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi0KLXB1YmxpYyBjbGFzcyBTdGF0ZW1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKLQlwdWJsaWMgYm9vbGVhbiBpc1N0cmluZ09iamVjdCA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIGlzQ2FzdCA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIG1lc3NhZ2VPckZpZWxkU3RhcnRlZDsKLQkKLS8qKgotICogU3RhdGVtZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBTdGF0ZW1lbnQoQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKSB7Ci0Jc3VwZXIoKTsKLQlmQ2xhc3NMb2FkZXIgPSBhQ2xhc3NMb2FkZXI7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKXsKLQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCAmJiBjdXJyZW50RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCk7Ci19Ci0KLS8qKiBEZWZlciB0aGlzIHRvIHRoZSBleHByZXNzaW9uCi0gKi8KLXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlpZiAoIGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwgKSB7Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCX0gZWxzZSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLmdldFN0cmluZyhQcm94eUluaXRQYXJzZXJNZXNzYWdlcy5TVEFURU1FTlRfVU5FWFBFQ1RFRF9FWEVDVVRJT04pKTsJLy8gVGhpcyBpcyBub3QgYW4gZXZhbHVhdGlvbiBlcnJvciwgaXQgc2hvdWxkbid0IG9mIG9jY3VyZWQsIHNvIGl0IGlzIGEgcGFyc2VyIGVycm9yLgotCX0KLX0KLS8qKgotICovCi1wdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uLmdldFR5cGVDbGFzcygpOwotCS8vdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oUHJveHlCYXNlVk1OTFMuUkVTQlVORExFLmdldFN0cmluZyhQcm94eUJhc2VWTU5MUy5TVEFURU1FTlRfVU5FWFBFQ1RFRF9FVkFMVUFUSU9OKSk7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNsYXNzTmFtZSgpIHsKLQlyZXR1cm4gY3VycmVudEV4cHJlc3Npb24uZ2V0VHlwZUNsYXNzTmFtZSgpOwotfQotLyoqIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIHRva2VuIHRoYXQgY2FuIGJlZ2luIGEgc3RhdGVtZW50LgotICogIG5ldyAsICcgJwkJCQkJCS0JQ3JlYXRlIGEgY29uc3RydWN0b3IKLSAqCTEtMTAsIHRydWUsIGZhbHNlLCBldGMuLi4JCS0JQ3JlYXRlIGEgbGl0ZXJhbAotICogIEZvbywgICcuJwkJCQkJCS0JQ3JlYXRlIGEgVHlwZQotICovCi1wdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiAsIGNoYXIgZGVsaW1pdGVyKXsKLQkKLQkvLyBJZiBtZXNzYWdlT3JGaWVsZFN0YXJ0IGlzIHRydWUgdGhlbiBvdXIgZXhwcmVzc2lvbiBpcyBjb21wbGV0ZSBhbmQgZWl0aGVyIGEgbWVzc2FnZSBvciBmaWVsZCBpcyBiZWluZyBjcmVhdGVkCi0JLy8gU2VlIHdoaWNoIGl0IGlzIGFuZCBjcmVhdGUgdGhlIGNvcnJlY3QgZXhwcmVzc2lvbgotCWlmIChtZXNzYWdlT3JGaWVsZFN0YXJ0ZWQpewotCQltZXNzYWdlT3JGaWVsZFN0YXJ0ZWQgPSBmYWxzZTsKLQkJaWYgKCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuKXsKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKGN1cnJlbnRFeHByZXNzaW9uLHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JCQljdXJyZW50RXhwcmVzc2lvbiA9IG1lc3NhZ2U7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfSBlbHNlIHsgCi0JCQlGaWVsZCBmaWVsZCA9IG5ldyBGaWVsZChjdXJyZW50RXhwcmVzc2lvbix0b2tlbixmQ2xhc3NMb2FkZXIpOwotCQkJY3VycmVudEV4cHJlc3Npb24gPSBmaWVsZDsKLQkJCXJldHVybiBmaWVsZDsKLQkJfQotCX0JCi0JCi0JLy8gTG9vayBmb3IgIm5ldyAiIGZvciBhIGNvbnN0cnVjdG9yIgotCWlmICggZGVsaW1pdGVyID09IERlbGltaXRlclNwYWNlICYmIGNvbXBhcmUoIHRva2VuICwgQ29uc3RhbnROZXcgKSApIHsKLQkJLy8gSWYgd2UgdGhvdWdodCB3ZSB3ZXJlIGEgcG9zc2libGUgY2FzdCBhbmQgd2Ugbm93IGFyZW4ndCB0aGVuIHdlIG11c3QgYmUgYSBibG9jayBleHByZXNzaW9uCi0JCWlmICggaXNDYXN0ICkgewotCQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgQmxvY2sobmV3IENvbnN0cnVjdG9yKGZDbGFzc0xvYWRlcikpOwotCQl9IGVsc2UgewotCQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgQ29uc3RydWN0b3IoZkNsYXNzTG9hZGVyKTsKLQkJfQotCQlpc0Nhc3QgPSBmYWxzZTsJLy8gQ2FuJ3QgYmUgYSBjYXN0IG5vdwkJCi0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsKLQl9Ci0JCi0JLy8gTG9vayBmb3IgIm51bGwiIAotCWlmICggY29tcGFyZSggdG9rZW4gLCBDb25zdGFudE51bGwgKSApIHsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgTnVsbExpdGVyYWwoKTsKLQkJaXNDYXN0ID0gZmFsc2U7CS8vIENhbid0IGJlIGEgY2FzdCBub3cJCQotCQkvLyBOdWxsIGNhbm5vdCBwcm9jZXNzIGFueXRoaW5nIHNvIHdlIHJldHVybiB0aGUgc3RhdGVtZW50Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8vIExvb2sgZm9yIGEgbnVtYmVyCi0JaWYgKCBpc051bWJlciggdG9rZW4gKSB8fCBkZWxpbWl0ZXIgPT0gT3Blck1pbnVzICkgewotCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBOdW1iZXJMaXRlcmFsKCk7Ci0JCWN1cnJlbnRFeHByZXNzaW9uID0gY3VycmVudEV4cHJlc3Npb24ucHVzaCh0b2tlbixkZWxpbWl0ZXIpOwotCQlpc0Nhc3QgPSBmYWxzZTsJLy8gQ2FuJ3QgYmUgYSBjYXN0IG5vdwkJCi0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsKLQl9Ci0KLQlpZiAoIGNvbXBhcmUoIHRva2VuICwgQ29uc3RhbnRUcnVlICkgKSB7Ci0JCWN1cnJlbnRFeHByZXNzaW9uICA9IG5ldyBCb29sZWFuTGl0ZXJhbCh0cnVlKTsKLQkJLy8gdHJ1ZSBjYW5ub3QgcHJvY2VzcyBhbnl0aGluZyBzbyB3ZSByZXR1cm4gdGhlIHN0YXRlbWVudAotCQlpc0Nhc3QgPSBmYWxzZTsJLy8gQ2FuJ3QgYmUgYSBjYXN0IG5vdwkJCi0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsKLS8vCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlpZiAoIGNvbXBhcmUoIHRva2VuICwgQ29uc3RhbnRGYWxzZSApICkgewotCQkvLyBmYWxzZSBjYW5ub3QgcHJvY2VzcyBhbnl0aGluZyBzbyB3ZSByZXR1cm4gdGhlIHN0YXRlbWVudAotCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBCb29sZWFuTGl0ZXJhbChmYWxzZSk7Ci0JCWlzQ2FzdCA9IGZhbHNlOwkvLyBDYW4ndCBiZSBhIGNhc3Qgbm93CQkKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCWlmICggZGVsaW1pdGVyID09IERlbGltaXRlclF1b3RlICkgewotCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBTdHJpbmdMaXRlcmFsKCk7Ci0JCWlzQ2FzdCA9IGZhbHNlOwkvLyBDYW4ndCBiZSBhIGNhc3Qgbm93CQkKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uOwkJCi0JfQotCQotCWlmICggZGVsaW1pdGVyID09IERlbGltaXRlclNpbmdsZVF1b3RlICkgewotCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBDaGFyTGl0ZXJhbCgpOwotCQlpc0Nhc3QgPSBmYWxzZTsJLy8gQ2FuJ3QgYmUgYSBjYXN0IG5vdwkJCi0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsJCQotCX0JCi0JCi0JaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJQZXJpb2QgJiYgdG9rZW4ubGVuZ3RoID09IDAgJiYgY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCl7Ci0JCWlmIChjdXJyZW50RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpewotCQkJLy9TdHJpbmcgcyA9ICJcIiIgKyAoU3RyaW5nKShjdXJyZW50RXhwcmVzc2lvbi5ldmFsdWF0ZSgpKSArICJcIiIgOwotCQkJLy9yZXR1cm4gbmV3IENvbnN0cnVjdG9yKHMpOwotCQkJaXNTdHJpbmdPYmplY3QgPSB0cnVlOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQl9Ci0JCi0JaWYgKGlzU3RyaW5nT2JqZWN0ICYmICh0b2tlbi5sZW5ndGggPiAwKSAmJiAoZGVsaW1pdGVyID09IERlbGltaXRlck9wZW5QYXJlbikpewotCQlyZXR1cm4gbmV3IE1lc3NhZ2UoY3VycmVudEV4cHJlc3Npb24sIHRva2VuLGZDbGFzc0xvYWRlcik7Ci0JfQotCQotCS8vaGFuZGxlIHR5cGUgY2FzdGluZwotCWlmICgodG9rZW4ubGVuZ3RoID09IDApICYmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblBhcmVuKSl7Ci0JCS8vIElmIHdlIGFyZSBhIGFscmVhZHkgYSBjYXN0IHRoZW4gd2UgbXVzdCBiZSBhIGJsb2NrLgotCQlpZiAoIGlzQ2FzdCApIHsKLQkJCWN1cnJlbnRFeHByZXNzaW9uID0gbmV3IEJsb2NrKGZDbGFzc0xvYWRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlpc0Nhc3QgPSB0cnVlOwkvLyBQb3NzaWJseSBhIGNhc3QKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9CQotCWlmIChpc0Nhc3QgJiYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVBhcmVuIHx8IHRva2VuLmxlbmd0aCAhPSAwKSl7Ci0JCVN0YXRpYyBhU3RhdGljID0gbmV3IFN0YXRpYyhmQ2xhc3NMb2FkZXIpOwotCQlDYXN0IGFDYXN0ID0gbmV3IENhc3QoYVN0YXRpYyxmQ2xhc3NMb2FkZXIpOwotCQljdXJyZW50RXhwcmVzc2lvbiA9IGFDYXN0LnB1c2godG9rZW4sZGVsaW1pdGVyKTsKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uOwotCX0KLQkKLQlpZiAoIHRva2VuLmxlbmd0aCAhPSAwICkgewotCQljdXJyZW50RXhwcmVzc2lvbiA9IG5ldyBTdGF0aWMoZkNsYXNzTG9hZGVyKS5wdXNoKHRva2VuLGRlbGltaXRlcik7Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbjsKLQl9Ci0JCi0JLy8gSWYgd2UgZ2V0IGEgeyB0aGVuIHdlIGFyZSBwYXJ0IG9mIGFuIGFycmF5IGFyZ3VtZW50Ci0JaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuRWxpcHNlKXsKLQkJY3VycmVudEV4cHJlc3Npb24gPSBuZXcgQXJyYXlBcmd1bWVudHMoKTsKLQkJcmV0dXJuIGN1cnJlbnRFeHByZXNzaW9uOwotCX0KLQkKLQkvLyBJZiBvdXIgZXhwcmVzc2lvbiBpcyBjbG9zZWQgYW5kIHdlIHJlY2VpdmUgYSAuIHdlIGFyZSBlaXRoZXIgYSBtZXNzYWdlIG9yIGEgZmllbGQuICBXZSB3b24ndCBrbm93IHRoaXMgdW50aWwKLQkvLyB0aGUgbmV4dCB0b2tlbiB3ZSByZWNlaXZlLCB3aGljaCB3aWxsIGJlIGVpdGhlciBiZSBkZWxpbWl0ZWQgYnkgYSAoIGluIHdoaWNoIGNhc2UgaXQgaXMgYSBtZXNzYWdlLCBlbHNlIGl0IGlzIGEgZmllbGQKLQlpZiAoY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCAmJiBjdXJyZW50RXhwcmVzc2lvbi5pc0NvbXBsZXRlKCkgJiYgZGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCl7Ci0JCW1lc3NhZ2VPckZpZWxkU3RhcnRlZCA9IHRydWU7Ci0JfQotCQkKLQlyZXR1cm4gdGhpczsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZCgiU3RhdGVtZW50eyIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCBjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsICkgewotCQlidWZmZXIuYXBwZW5kKGN1cnJlbnRFeHByZXNzaW9uLnRvU3RyaW5nKCkpOwotCX0KLQlidWZmZXIuYXBwZW5kKCd9Jyk7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotLyoqCi0gKiBJcyB0aGlzIHN0YXRlbWVudCBhIHByaW1pdGl2ZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlpZiAoIGN1cnJlbnRFeHByZXNzaW9uICE9IG51bGwgKSB7Ci0JCXJldHVybiBjdXJyZW50RXhwcmVzc2lvbi5pc1ByaW1pdGl2ZSgpOwotCX0gZWxzZSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFByb3h5SW5pdFBhcnNlck1lc3NhZ2VzLmdldFN0cmluZyhQcm94eUluaXRQYXJzZXJNZXNzYWdlcy5TVEFURU1FTlRfVU5FWFBFQ1RFRF9FWEVDVVRJT04pKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0YXRpYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdGF0aWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlNDVhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL1N0YXRpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBTdGF0aWMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFN0YXRpYyBleHRlbmRzIEV4cHJlc3Npb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSGFzaE1hcCBzUHJpbWl0aXZlVHlwZXM7Ci0JCi0Jc3RhdGljIHsKLQkJc1ByaW1pdGl2ZVR5cGVzID0gbmV3IEhhc2hNYXAoMTApOwotCQlzUHJpbWl0aXZlVHlwZXMucHV0KCJieXRlIiwgQnl0ZS5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzUHJpbWl0aXZlVHlwZXMucHV0KCJjaGFyIiwgQ2hhcmFjdGVyLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXNQcmltaXRpdmVUeXBlcy5wdXQoInNob3J0IiwgU2hvcnQuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJc1ByaW1pdGl2ZVR5cGVzLnB1dCgiaW50IiwgSW50ZWdlci5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzUHJpbWl0aXZlVHlwZXMucHV0KCJsb25nIiwgTG9uZy5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzUHJpbWl0aXZlVHlwZXMucHV0KCJmbG9hdCIsIEZsb2F0LlRZUEUpOwkJIC8vJE5PTi1OTFMtMSQKLQkJc1ByaW1pdGl2ZVR5cGVzLnB1dCgiZG91YmxlIiwgRG91YmxlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBhcnJheURpbWVuc2lvbnM7Ci0JcHJvdGVjdGVkIExpc3QgZkFycmF5QXJndW1lbnRzOwotCXByb3RlY3RlZCBTdHJpbmdXcml0ZXIgdHlwZVdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wbGV0ZWRXaXRoUGVyaW9kID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGNoYXJbXSBjb21wbGV0aW9uVG9rZW47Ci0JcHVibGljIENsYXNzIHR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wbGV0ZTsKLQotCXB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2luZ0FycmF5RGltZW5zaW9uOwotLyoqCi0gKiBDcmVhdGUgYW4gdW5rbm93biBleHByZXNzaW9uCi0gKi8KLXB1YmxpYyBTdGF0aWMoQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKXsKLQlmQ2xhc3NMb2FkZXIgPSBhQ2xhc3NMb2FkZXI7Ci19Ci1wdWJsaWMgU3RhdGljKGNoYXJbXSBhVG9rZW4sY2hhciBkZWxpbWl0ZXIsQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKXsKLQkKLQlmQ2xhc3NMb2FkZXIgPSBhQ2xhc3NMb2FkZXI7Ci0JdHJ5IHsgCi0JCXR5cGVXcml0ZXIud3JpdGUoYVRva2VuKTsKLQl9IGNhdGNoICggSU9FeGNlcHRpb24gZXhjICkge307Ci0JY2hlY2tGb3JWYWxpZFR5cGUoKTsKLQlpZiAoIHR5cGUgPT0gbnVsbCAmJiBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUGVyaW9kICl7Ci0JCXR5cGVXcml0ZXIud3JpdGUoRGVsaW1pdGVyUGVyaW9kKTsKLQl9Ci0JCQotfQotcHVibGljIFN0YXRpYyhjaGFyW10gYVRva2VuLGNoYXIgZGVsaW1pdGVyLENsYXNzTG9hZGVyIGFDbGFzc0xvYWRlcixib29sZWFuIGlzQXJyYXkpewotCXRoaXMoYVRva2VuLGRlbGltaXRlcixhQ2xhc3NMb2FkZXIpOwotCWlzUHJvY2Vzc2luZ0FycmF5RGltZW5zaW9uID0gdHJ1ZTsKLQlhcnJheURpbWVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCWFycmF5RGltZW5zaW9ucy5hZGQobmV3IFN0YXRlbWVudChhQ2xhc3NMb2FkZXIpKTsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpewotCXJldHVybiBpc0NvbXBsZXRlOwotfQotcHVibGljIGJvb2xlYW4gaXNBcnJheSgpewotCXJldHVybiBhcnJheURpbWVuc2lvbnMgIT0gbnVsbDsKLX0KLS8qKgotICogU2VlIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYSB2YWxpZCB0eXBlCi0gKiBUaGlzIHVzZXMgdGhlIGNsYXNzIGxvYWRlciBnaXZlbiB0byB1cyBpZiBvbmUgc3BlY2lmaWVkLiAgVGhlIHJlYXNvbiBmb3IgdGhpcwotICogaXMgdGhhdCBFY2xpcHNlIHVzZXMgYSBzcGVjaWFsIHBsdWdpbiBjbGFzcyBsb2FkZXIgYW5kIHdoZW4gd2UgYXJlIHJ1bm5pbmcKLSAqIGluIGEgVk0gaW5zaWRlIGVjbGlwc2UgKCBlLmcuIGZvciBJREVWTSBwcm94eSBzdHVmZiApIHdlIG11c3QgaGF2ZQotICogcmVmZXJlbmNlIHRvIHRoZSBwbHVnaW4gdGhhdCBpcyB1c2luZyB1cyBvdGhlcndpc2Ugd2UgY2FuJ3QgbG9hZCBpdHMgY2xhc3NlcwotICovCi1wcm90ZWN0ZWQgdm9pZCBjaGVja0ZvclZhbGlkVHlwZSgpewotCi0JdHlwZSA9IChDbGFzcykgc1ByaW1pdGl2ZVR5cGVzLmdldCh0eXBlV3JpdGVyLnRvU3RyaW5nKCkpOwotCWlmICh0eXBlID09IG51bGwpCi0JCXRyeSB7Ci0JCQlpZiAoIGZDbGFzc0xvYWRlciA9PSBudWxsICkgewotCQkJCXR5cGUgPSBDbGFzcy5mb3JOYW1lKHR5cGVXcml0ZXIudG9TdHJpbmcoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXR5cGUgPSBmQ2xhc3NMb2FkZXIubG9hZENsYXNzKHR5cGVXcml0ZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4YyApIHsKLQkJCXRyeSB7Ci0JCQkJdHlwZSA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy4iICsgdHlwZVdyaXRlci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJd3JpdGVyLndyaXRlKHR5cGUuZ2V0TmFtZSgpKTsKLQkJCQl0eXBlV3JpdGVyID0gd3JpdGVyOwotCQkJfSBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXhjMSApIHt9Ci0JCX0gY2F0Y2ggKCBOb0NsYXNzRGVmRm91bmRFcnJvciBleGMgKSB7Ci0JCQkvLyBBIG1pc21hdGNoIGluIHNvbWUgd2F5LiBGb3VuZCBhIGNsYXNzLCBwcm9iYWJseSBkaWZmZXJlbnQgY2FzZS4gT25lIHBvc3NpYmlsaXR5Ci0JCQkvLyBpcyBmb3VuZCBhIGNsYXNzLCBidXQgdGhpcyB3YXMgcmVhbGx5IGEgcGFja2FnZS4gU28gY2xhc3MgYW5kIHBhY2thZ2Ugd2l0aCBzYW1lIG5hbWUKLQkJCS8vIGJ1dCBkaWZmZXJlbnQgY2FzZSBjYXVzZWQgdGhpcyB0byBvY2N1ci4gWzQ2Mzc2XS4KLQkJfQotCQotfQotLyoqCi0gKiBJZiB3ZSBoYXZlIGFueSBzdGF0aWMgbWV0aG9kcyByZXR1cm4gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZW0gYWdhaW5zdCB0aGUgdHlwZQotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgewotCi0JLy8gSWYgd2UgYXJlIGFuIGFycmF5IGJ1dCBoYXZlbid0IGNyZWF0ZWQgaXQgZG8gc28KLQlpZiAoIGlzQXJyYXkoKSApIHsKLQkJaWYgKCBhcnJheSA9PSBudWxsICkgewotCQkJZXZhbHVhdGVBcnJheSgpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9IGVsc2UgewotCQlpZiAoIHR5cGUgIT0gbnVsbCApIHsgCi0JCQlyZXR1cm4gdHlwZTsKLQkJfSBlbHNlIHsgCi0JCQkvLyBJZiB3ZSBoYXZlIG5vIHR5cGUgdGhlbiB3ZSBhcmUgc29tZSBraW5kIGluY29tcGxldGUgZXhwcmVzc2lvbiB0aGF0IGNhbm5vdCBiZSBldmFsdXRlZAotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJfQotCX0KLX0KLS8qKgotICogVGhlIHR5cGUgb2YgdXMgaXMgZWl0aGVyIHNpbXBseSB0aGUgY2xhc3MsIG9yIGlmIHdlIGFyZSBhbiBhcnJheSB0aGVuIHdlIG11c3QgY3JlYXRlIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheQotICogdXNpbmcgdGhlIHJlZmxlY3RpdmUgQVBJcwotICovCi1wcm90ZWN0ZWQgT2JqZWN0IGFycmF5OwotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHsKLQotCWlmICggaXNBcnJheSgpICkgewotCQlpZiAoIGFycmF5ID09IG51bGwgKSB7Ci0JCQkvLyBEbyBub3QgZXZhbHVhdGUgdGhlIGFycmF5IGFuZCByZXR1cm4gaXRzIGNsYXNzLiAgSW5zdGVhZCBqdXN0IHdvcmsgb3V0IHRoZSBjbGFzcyBieSBvdXIgdHlwZQotCQkJLy8gYW5kIG51bWJlciBvZiBkaW1lbnNpb25zCi0JCQlPYmplY3QgcmVzdWx0ID0gQXJyYXkubmV3SW5zdGFuY2UodHlwZSxnZXROdW1iZXJPZkRpbWVuc2lvbnMoKSk7Ci0JCQlyZXR1cm4gcmVzdWx0LmdldENsYXNzKCk7Ci0JCX0gZWxzZSB7IAotCQkJcmV0dXJuIGFycmF5LmdldENsYXNzKCk7Ci0JCX0KLQl9IGVsc2UgeyAKLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JcmV0dXJuIHR5cGVXcml0ZXIudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyBDbGFzcyBnZXRQcmltaXRpdmVUeXBlQ2xhc3MoKXsKLQlyZXR1cm4gdHlwZTsKLX0KLXByb3RlY3RlZCBpbnRbXSBnZXROdW1iZXJPZkRpbWVuc2lvbnMoKXsKLQlMaXN0IGRpbWVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCWRpbWVuc2lvbnMuYWRkKG5ldyBJbnRlZ2VyKGZBcnJheUFyZ3VtZW50cy5zaXplKCkpKTsKLQkoKE1lc3NhZ2VBcmd1bWVudClmQXJyYXlBcmd1bWVudHMuZ2V0KDApKS5jb250cmlidXRlQXJndW1lbnROdW1iZXIoZGltZW5zaW9ucyk7Ci0JLy8gVGhlIHRvdGFsIG51bWJlciBvZiBhcmd1bWVudHMgaXMgYSBzZXQgb2YgSW50ZWdlciBvYmplY3RzIGluIHRoZSBkaW1lbnNpb25zIGxpc3QKLQkvLyBjb252ZXJ0IHRoaXMgdG8gYW4gaW50W10KLQlpbnRbXSBpbnREaW1lbnNpb25zID0gbmV3IGludFtkaW1lbnNpb25zLnNpemUoKV07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zLnNpemUoKTsgaSsrKSB7Ci0JCWludERpbWVuc2lvbnNbaV0gPSAoKEludGVnZXIpZGltZW5zaW9ucy5nZXQoaSkpLmludFZhbHVlKCk7Ci0JfQotCXJldHVybiBpbnREaW1lbnNpb25zOwotfQotLyoqCi0gKiBFdmFsdWF0ZSB0aGUgYXJyYXkKLSAqLwotcHJvdGVjdGVkIHZvaWQgZXZhbHVhdGVBcnJheSgpewotCWlmICggZkFycmF5QXJndW1lbnRzICE9IG51bGwgKSB7IAotCQkvLyBJZiB0aGUgYXJyYXkgaXNuJ3QgZGVjbGFyZWQgd2l0aCBhIHNpemUgYnV0IHRoaXMgaXMgc3VwcGxpZWQgd2l0aCBhcmd1bWVudCB0aGVzZSB3aWxsIGJlIGluIHRoZSBmQXJyYXlBcmd1bWVudHMKLQkJLy8gbmV3IGludFtdIHsgMiAsMyB9IHdpbGwgaGF2ZSB0aGUgY29uc3RydWN0b3IgYXJndW1lbnRzIHN1cHBsaWVkIGFzIHR3byBtZXNzYWdlIGFyZ3VtZW50cyB3aXRoIAotCQlpZiAoIGFycmF5ID09IG51bGwgKSB7Ci0JCQkvLyBUaGUgc2l6ZSBvZiB0aGUgYXJyYXkgYXJndW1lbnRzIGlzIG91ciBhcnJheSBzaXplLCBob3dldmVyIGZvciBhIG11bHRpIGFyZyBhcnJheSB3ZSBuZWVkCi0JCQkvLyB0byBmaW5kIHRoZSBzaXplIG9mIGFueSBuZXN0ZWQgYXJyYXlzIHdpdGhpbiBhcmd1bWVudHMgdGhlbXNlbHZlcywgZS5nLiAKLQkJCS8vIG5ldyBpbnRbXVtdIHsgezIsM30gLCB7Myw0fSB9IHRoZW4gd2UgaGF2ZSB0d28gYXJyYXkgYXJndW1lbnRzLCBlYWNoIG9mIHdoaWNoIGlzIGEgTWVzc2FnZUFyZ3VtZW50Ci0JCQkvLyB3aG9zZSBzdGF0ZW1lbnQgaXMgYW4gQXJyYXlBcmd1bWVudHMgdGhhdCBoYXMgdHdvIGFyZ3VtZW50cywgZXRjLi4uCi0JCQkvLyBUbyBmaW5kIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHdlIGNyZWF0ZSBhIGxpc3QgdGhhdCB3ZSBhZGQgb3VyIG51bWJlciBvZiBhcmd1bWVudHMgdG8sIGFuZCB0aGVuCi0JCQkvLyBwYXNzIHRoaXMgYWxsIHRoZSB3YXkgdXAgdGhlIGFyZ3VtZW50cyBjaGFpbiB1c2luZyBjb250cmlidXRlQXJndW1lbnROdW1iZXIoTGlzdCkgc28gdGhhdCBlYWNoIGVsZW1lbnQKLQkJCS8vIGNhbiBhZGQgdG8gdGhlIGxpc3QgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKCBpZiBhbnkgKSB0aGF0IHRoZXkgaGF2ZS4gIAotCQkJYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZSh0eXBlLGdldE51bWJlck9mRGltZW5zaW9ucygpKTsKLQkJCS8vIFNldCB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IHRvIGJlIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgY29uc3RydWN0b3IgYXJndW1lbnRzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZBcnJheUFyZ3VtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKWZBcnJheUFyZ3VtZW50cy5nZXQoaSk7Ci0JCQkJdHJ5IHsJCi0JCQkJCU9iamVjdCBlbGVtZW50ID0gZXhwcmVzc2lvbi5ldmFsdWF0ZSgpOwotCQkJCQlBcnJheS5zZXQoYXJyYXksaSxlbGVtZW50KTsKLQkJCQl9IGNhdGNoICggRXhjZXB0aW9uIGV4YyApIHsKLQkJCQkJLy8gQW55IGV2YWx1YXRpb24gZXhjZXB0aW9ucyBzaG91bGQgYmUgdGhyb3duIGJhY2sKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKCBhcnJheURpbWVuc2lvbnMgIT0gbnVsbCApIHsKLQkJLy8gVG8gZ2V0IHRoZSBjbGFzcyBvZiBhIHJlZmxlY3RpdmUgYXJyYXkgd2UgbXVzdCBhY3R1YWxseSBmaXJzdCBjcmVhdGUgaXQgYW5kIHRoZW4gYXNrIGl0IGZvciBpdHMgY2xhc3MKLQkJLy8gVGhlIGFycmF5IERpbWVuc2lvbnMgYXJlIHByZXNlbnQgaWYgdGhlIGFycmF5IHdhcyBleHBsaWNpdGx5IGRlY2xhcmVkIHdpdGggYSBzaXplLCBlLmcuIG5ldyBpbnRbMl1bM10KLQkJLy8gd2lsbCBoYXZlIHRvIGFycmF5RGltZW5zaW9ucyB0aGF0IHJlcHJlc2VudCB0aGUgZXhwcmVzc2lvbnMgMiBhbmQgMyAoIGFzIE51bWJlckxpdGVyYWwgaW5zdGFuY2VzICkKLQkJaWYgKCBhcnJheSA9PSBudWxsICkgewotCQkJLy8gRXZhbHVhdGUgYWxsIG9mIHRoZSBhcnJheURpbWVuc2lvbnMuICBUaGVzZSBzaG91bGQgYmUgaW50ZWdlcnMKLQkJCWludFtdIGRpbWVuc2lvblNpemVzID0gbmV3IGludFthcnJheURpbWVuc2lvbnMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uU2l6ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgeyAKLQkJCQkJSW50ZWdlciBkaW1lbnNpb25TaXplID0gKEludGVnZXIpICgoRXhwcmVzc2lvbilhcnJheURpbWVuc2lvbnMuZ2V0KGkpKS5ldmFsdWF0ZSgpOwotCQkJCQlkaW1lbnNpb25TaXplc1tpXSA9IGRpbWVuc2lvblNpemUuaW50VmFsdWUoKTsKLQkJCQl9IGNhdGNoICggRXhjZXB0aW9uIGV4YyApIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBGb3IgYSBtdWx0aSBhcmcgYXJyYXkgd2UgbmVlZCB0byBjcmVhdGUgdXNpbmcgdGhlIHN0YXRpYyBtZXRob2Qgb24gYXJyYXkgdGhhdCB0YWtlcyBhbiBpbnRbXSB0aGF0IHJlcHJlc2VudHMKLQkJCS8vIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucywgZS5nLiBmb3IgbmV3IFN0cmluZ1syXVszXSB3ZSBkbyBBcnJheS5uZXdJbnN0YW5jZShTdHJpbmcuY2xhc3MsbmV3IGludFtdIHsgMiAsIDMgfTsKLQkJCWFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UodHlwZSxkaW1lbnNpb25TaXplcyk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIElmIHRoZSB0b2tlbiBpcyBhIHBlcmlvZCB0aGVuIGl0IGNvdWxkIGVpdGhlciBiZSBwYXJ0IG9mIHRoZSB0eXBlIG9yIGVsc2UgYSBzdGF0aWMgbWV0aG9kIGNhbGwKLSAqLwotcHVibGljIEV4cHJlc3Npb24gcHVzaChjaGFyW10gdG9rZW4gLCBjaGFyIGRlbGltaXRlciApIHsKLQotCS8vIElmIHdlIGRvbid0IHlldCBoYXZlIGEgdmFsaWQgdHlwZSB0aGVuIHNlZSBpZiB3ZSBub3cgZG8KLQlpZiAodHlwZSA9PSBudWxsKXsKLQkJdHJ5IHsgCi0JCQl0eXBlV3JpdGVyLndyaXRlKHRva2VuKTsKLQkJfSBjYXRjaCAoIElPRXhjZXB0aW9uIGV4YyApIHt9OwotCQljaGVja0ZvclZhbGlkVHlwZSgpOwotCQkvLyBJZiB3ZSBnb3QgYSB2YWxpZCB0eXBlIGFuZCBhIHBlcmlvZCB0aGVuIHJlbWVtYmVyIGl0Ci0JCWlmICggZGVsaW1pdGVyID09IERlbGltaXRlclBlcmlvZCApIHsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQljb21wbGV0ZWRXaXRoUGVyaW9kID0gdHJ1ZTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQkJfQkJCi0JfQotCQotCWlmICggYXJyYXlEaW1lbnNpb25zICE9IG51bGwgJiYgaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb24gKSB7Ci0JCUV4cHJlc3Npb24gbGFzdEFycmF5RGltZW5zaW9uID0gKEV4cHJlc3Npb24pYXJyYXlEaW1lbnNpb25zLmdldChhcnJheURpbWVuc2lvbnMuc2l6ZSgpLTEpOwotCQlsYXN0QXJyYXlEaW1lbnNpb24ucHVzaCh0b2tlbixkZWxpbWl0ZXIpOwotCQlpZiAoIGRlbGltaXRlciA9PSBEZWxpbWl0ZXJDbG9zZVNxdWFyZUJyYWNlICYmIGlzUHJvY2Vzc2luZ0FycmF5RGltZW5zaW9uICkgewotCQkJaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb24gPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JaWYgKCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyT3BlblNxdWFyZUJyYWNlICYmICFpc1Byb2Nlc3NpbmdBcnJheURpbWVuc2lvbiApIHsKLQkJaWYgKCBhcnJheURpbWVuc2lvbnMgPT0gbnVsbCApIGFycmF5RGltZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgU3RhdGVtZW50KGZDbGFzc0xvYWRlcik7Ci0JCWFycmF5RGltZW5zaW9ucy5hZGQoc3RhdGVtZW50KTsKLQkJaXNQcm9jZXNzaW5nQXJyYXlEaW1lbnNpb24gPSB0cnVlOwotCQlyZXR1cm4gdGhpczsJCQotCX0KLQkKLQkvLyBJZiB3ZSBoYXZlIGEgdHlwZSBhbmQgdGhlIGRlbGltaXRlciBpcyBhICggdGhlbiBpdCBtdXN0IGJlIGEgbWVzc2FnZSBiZWdpbm5pbmcKLQlpZiAoIHR5cGUgIT0gbnVsbCApIHsKLQkJaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJPcGVuUGFyZW4pIHsKLQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuIG5ldyBNZXNzYWdlKCB0aGlzICwgdG9rZW4gLCBmQ2xhc3NMb2FkZXIgKTsKLQkJfSBlbHNlIGlmIChjb21wbGV0ZWRXaXRoUGVyaW9kKXsKLQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJRmllbGQgZmllbGQgPSBuZXcgRmllbGQodGhpcyx0b2tlbixmQ2xhc3NMb2FkZXIpOwotCQkJLy8gSWYgb3VyIHRva2VuIGlzIGEgKSwgJyAnIG9yICwgdGhlbiB0aGUgZmllbGQgaXMgY29tcGxldGVkLAotCQkJLy8gb3RoZXJ3aXNlIGxlYXZlIGl0IG9wZW4gc28gaXQgd2lsbCBwcm9jZXNzIHRoZSByZW1haW5pbmcgdG9rZW5zCi0vLwkJCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyQ2xvc2VQYXJlbiB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyU3BhY2UgfHwgZGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hKSB7Ci0JCQlpZiAoZGVsaW1pdGVyID09IERlbGltaXRlckNsb3NlUGFyZW4gfHwgZGVsaW1pdGVyID09IERlbGltaXRlckNvbW1hKSB7Ci0JCQkJZmllbGQuaXNDb21wbGV0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmllbGQ7Ci0JCX0KLQl9Ci0JCQkKLQkvLyBXZSBhcmUgc3RpbGwgbG9va2luZyBmb3IgYSB0eXBlIHNvIGFwcGVuZCBhIC4KLQlpZiAoIHR5cGUgPT0gbnVsbCApIHsKLQkJdHlwZVdyaXRlci53cml0ZSgnLicpOwotCX0KLQlyZXR1cm4gdGhpczsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQotCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0Jd3JpdGVyLndyaXRlKCJTdGF0aWMgIik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIHR5cGUgPT0gbnVsbCApIHsgCi0JCXdyaXRlci53cml0ZSgiKEluY29tcGxldGUpIHsiKTsgLy8kTk9OLU5MUy0xJAotCX0gZWxzZSB7Ci0JCXdyaXRlci53cml0ZSgiKENvbXBsZXRlKSB7Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0Jd3JpdGVyLndyaXRlKHR5cGVXcml0ZXIudG9TdHJpbmcoKSk7Ci0Jd3JpdGVyLndyaXRlKCJ9Iik7IC8vJE5PTi1OTFMtMSQKLQlpZiAoIGFycmF5RGltZW5zaW9ucyAhPSBudWxsICkgewotCQl3cml0ZXIud3JpdGUoIiBhcnJheSBkaW1lbnNpb25zPSIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZShuZXcgSW50ZWdlcihhcnJheURpbWVuc2lvbnMuc2l6ZSgpKS50b1N0cmluZygpKTsKLQl9Ci0JaWYgKCBmQXJyYXlBcmd1bWVudHMgIT0gbnVsbCApIHsJCi0JCXdyaXRlci53cml0ZSgiIGFycmF5IGRpbWVuc2lvbnM9Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKGZBcnJheUFyZ3VtZW50cy5zaXplKCkpLnRvU3RyaW5nKCkpOwotCX0KLQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0KLX0KLQotcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JcmV0dXJuIGdldFR5cGVDbGFzcygpLmlzUHJpbWl0aXZlKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRBcnJheUFyZ3VtZW50cyhMaXN0IGFyZ3VtZW50cykgewotCWZBcnJheUFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvU3RyaW5nTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdHJpbmdMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTVhODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9TdHJpbmdMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFN0cmluZ0xpdGVyYWwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotCi1wdWJsaWMgY2xhc3MgU3RyaW5nTGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcGxldGU7Ci0JcHVibGljIFN0cmluZyB2YWx1ZTsKLQlwdWJsaWMgU3RyaW5nQnVmZmVyIHZhbHVlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXByb3RlY3RlZCBib29sZWFuIGlzRXNjYXBlZCA9IGZhbHNlOwotCi0vKioKLSAqIGNvbnN0cnVjdG9yCi0gKi8KLXB1YmxpYyBTdHJpbmdMaXRlcmFsKCl7Ci19Ci0JCi0vKioKLSAqIGV2YWx1YXRlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgT2JqZWN0IGV2YWx1YXRlKCkgewotCXJldHVybiB2YWx1ZUJ1ZmZlci50b1N0cmluZygpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0JcmV0dXJuIGlzQ29tcGxldGU7Ci19Ci0vKioKLSAqIFdlIG11c3QgZXZhbHVhdGUgb3Vyc2VsZiBhbmQgcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQKLSAqLwotIAotcHVibGljIENsYXNzIGdldFR5cGVDbGFzcygpIHsKLQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVDbGFzc05hbWUoKSB7Ci0JcmV0dXJuIFN0cmluZy5jbGFzcy5nZXROYW1lKCk7Ci19Ci0KLS8qKgotICpUaGlzIHN0cmluZyBtaWdodCBiZSBicm9rZW4gaW50byBhIGZldyB0b2tlbnMKLSAqc28gd2UgbmVlZCBhIFN0cmluZ0J1ZmZlci4KLSAqIAotICovCi1wdWJsaWMgRXhwcmVzc2lvbiBwdXNoKGNoYXJbXSB0b2tlbiAsIGNoYXIgZGVsaW1pdGVyKXsKLQlpbnQgYXBwZW5kVG9rZW5TdGFydCA9IDA7Ci0JaW50IGFwcGVuZFRva2VuTGVuZ3RoID0gdG9rZW4ubGVuZ3RoOwotCWlmIChpc0VzY2FwZWQpIHsKLQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCWlmICh0b2tlbi5sZW5ndGggIT0gMCkgewotCQkJY2hhciBjID0gdG9rZW5bMF07Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdiJzoKLQkJCQkJdmFsdWVCdWZmZXIuYXBwZW5kKCdcYicpOwotCQkJCQlhcHBlbmRUb2tlblN0YXJ0ID0gMTsKLQkJCQkJYXBwZW5kVG9rZW5MZW5ndGgtLTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAndCc6Ci0JCQkJCXZhbHVlQnVmZmVyLmFwcGVuZCgnXHQnKTsKLQkJCQkJYXBwZW5kVG9rZW5TdGFydCA9IDE7Ci0JCQkJCWFwcGVuZFRva2VuTGVuZ3RoLS07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ24nOgotCQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoJ1xuJyk7Ci0JCQkJCWFwcGVuZFRva2VuU3RhcnQgPSAxOwotCQkJCQlhcHBlbmRUb2tlbkxlbmd0aC0tOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdyJzoKLQkJCQkJdmFsdWVCdWZmZXIuYXBwZW5kKCdccicpOwotCQkJCQlhcHBlbmRUb2tlblN0YXJ0ID0gMTsKLQkJCQkJYXBwZW5kVG9rZW5MZW5ndGgtLTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAndSc6Ci0JCQkJCS8vIFVuaWNvZGUsIG5leHQgZm91ciBnYXRoZXIgZm9yIHRleHQ7Ci0JCQkJCWlmIChhcHBlbmRUb2tlbkxlbmd0aD49NSkgewotCQkJCQkJdmFsdWVCdWZmZXIuYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KG5ldyBTdHJpbmcodG9rZW4sIDEsIDQpLCAxNikpOwotCQkJCQkJYXBwZW5kVG9rZW5TdGFydD01OwotCQkJCQkJYXBwZW5kVG9rZW5MZW5ndGgtPTU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBJZiB3ZSBkaWRuJ3QgYXBwZW5kIGFueXRoaW5nLCB0aGVuIG5vdCBhIHRydWUgZXNjYXBlLCBzbyBwdXQgdGhlIGVzY2FwZSBvbi4KLQkJCWlmIChhcHBlbmRUb2tlblN0YXJ0PT0wKQotCQkJCXZhbHVlQnVmZmVyLmFwcGVuZChEZWxpbWl0ZXJFc2NhcGUpOwotCQl9IGVsc2UgewotCQkJaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJRdW90ZSB8fCBkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyRXNjYXBlIHx8IGRlbGltaXRlciA9PSBEZWxpbWl0ZXJTaW5nbGVRdW90ZSkKLQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsJLy8gSXQgd2FzIGEgdHJ1ZSBlc2NhcGUuCi0JCQllbHNlIHsKLQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoRGVsaW1pdGVyRXNjYXBlKTsJLy8gSWYgd2Fzbid0IGEgdHJ1ZSBlc2NhcGUKLQkJCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JfQotCQotCWlmIChhcHBlbmRUb2tlbkxlbmd0aCA+IDApCi0JCXZhbHVlQnVmZmVyLmFwcGVuZCh0b2tlbiwgYXBwZW5kVG9rZW5TdGFydCwgYXBwZW5kVG9rZW5MZW5ndGgpOwotCQotCWlmIChkZWxpbWl0ZXIgPT0gRGVsaW1pdGVyUXVvdGUpewkJCi0JCWlzQ29tcGxldGUgPXRydWU7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvLyBJZiB0aGUgZGVsaW1pdGVyIGlzIGFuIGVzY2FwZSBjaGFyYWN0ZXIgcmVtZW1iZXIgaXQgc28gd2UgY2FuIGVzY2FwZQotCS8vIHRoZSBuZXh0IHRva2VuLCBvdGhlcndpc2UgdHJlYXQgaXQgYXMgYSBsaXRlcmFsCi0JaWYgKGRlbGltaXRlciA9PSBEZWxpbWl0ZXJFc2NhcGUgKXsKLQkJaXNFc2NhcGVkID0gdHJ1ZTsKLQl9IGVsc2UgewotCQl2YWx1ZUJ1ZmZlci5hcHBlbmQoZGVsaW1pdGVyKTsKLQl9Ci0JcmV0dXJuIHRoaXM7Ci19Ci0KLS8qKgotICogU3RyaW5ncyBhcmUgbm90IHByaW1pdGl2ZXMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQoIlN0cmluZyhcIiIpOyAvLyROT04tTkxTLTEkCi0JaWYgKCB2YWx1ZUJ1ZmZlciAhPSBudWxsICkgewotCQlidWZmZXIuYXBwZW5kKHZhbHVlQnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQlidWZmZXIuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWE2OTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL21lc3NhZ2VzLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQKLSMKLQotCi0jCi0jIFByb3BlcnRpZXMgZm9yIHRoZSBQcm94eSBCYXNlIFZNIFN1cHBvcnQKLSMKLVVuZXhwZWN0ZWRUb2tlbl9FWENfICAgICAgICAgICAgICAgID0gSVdBVjAxMjdFIFVuZXhwZWN0ZWQgVG9rZW4gInswfSIuCi1TdGF0ZW1lbnQuVW5leHBlY3RlZEV4ZWN1dGlvbl9FWENfICA9IElXQVYwMTI4RSBTdGF0ZW1lbnQgd2FzIGV4ZWN1dGVkIHVuZXhwZWN0ZWRseS4KLVN0YXRlbWVudC5VbmV4cGVjdGVkRXZhbHVhdGlvbl9FWENfID0gSVdBVjAxMjlFIFN0YXRlbWVudHMgc2hvdWxkIG5vdCBiZSBldmFsdWF0ZWQuCi1DaGFyVG9vQ29tcGxpY2F0ZWRfRVhDXyAgICAgICAgICAgICA9IElXQVYwMTMwRSBJbnB1dCB0ZXh0IG5vdCBhIGNoYXIgdGhhdCBjYW4gYmUgZXZhbHVhdGVkLiBUb28gY29tcGxpY2F0ZWQuIFwiezB9IgotUHJpbWl0aXZlT3BlcmF0aW9uLkV2YWx1YXRlLkludmFsaWRPcGVyYXRvcl9FWENfPUludmFsaWQgb3BlcmF0b3IgezB9IGJldHdlZW4gezF9IGFuZCB7Mn0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BYnN0cmFjdEVudW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BYnN0cmFjdEVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwYjBiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvQWJzdHJhY3RFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQWJzdHJhY3RFbnVtLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIEJhc2UgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVudW0uCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW51bSBpbXBsZW1lbnRzIEVudW0gewotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbml0aWFsaXplZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZW51bWVyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIGZpbmFsIGludCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRW51bS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0VudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyZmIzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEVudW0uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wNS8xMSAxOTowMToxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLS8qKgotICogVHlwZVNhZmUgZW51bWVyYXRpb25zIGZvciB0aGUgSUV4cHJlc3Npb24gcHJvY2Vzc2luZy4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW51bSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnVtZXJhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUuCi0JICovCi0JaW50IGdldFZhbHVlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0V4cHJlc3Npb25Qcm9jZXNzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9FeHByZXNzaW9uUHJvY2Vzc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjM5NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0V4cHJlc3Npb25Qcm9jZXNzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogRXhwcmVzc2lvblByb2Nlc3Nlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yMSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIuSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLkluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyOwotIAotLyoqCi0gKiBFeHByZXNzaW9uIHByb2Nlc3NpbmcuIFRoaXMgZG9lcyB0aGUgYWN0dWFsIGV4cHJlc3Npb24gcHJvY2Vzc2luZyB3aXRoIHRoZSBsaXZlIG9iamVjdHMuCi0gKiBJdCBpcyBtZWFudCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGV4cHJlc3Npb24gdHlwZXMuIEFsbCBvZiB0aGUKLSAqIGN1cnJlbnQgZXhwcmVzc2lvbnMgY2Fubm90IGJlIG92ZXJyaWRkZW4uIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3RhY2sgaXMgdmVyeSBzZW5zaXRpdmUgdG8gCi0gKiBjYWxsIG9yZGVyLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25Qcm9jZXNzZXIgewotCi0JLyoqCi0JICogQSB2YXJpYWJsZSByZWZlcmVuY2UgZm9yIGEgZmllbGQgYWNjZXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRmllbGRBY2Nlc3NSZWZlcmVuY2UgZXh0ZW5kcyBWYXJpYWJsZVJlZmVyZW5jZSB7Ci0JCQotCQlwcml2YXRlIGZpbmFsIEZpZWxkIGZpZWxkOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCByZWNlaXZlcjsKLQotCQkvKioKLQkJICogVXNlIHRoaXMgdG8gY29uc3RydWN0IGEgRmllbGRBY2Nlc3NSZWZlcmVuY2UuIFRoaXMgd2lsbCBkbyBjaGVja3MgdG8gbWFrZSBzdXJlCi0JCSAqIGl0IGlzIHZhbGlkIHNvIHRoYXQgZXhjZXB0aW9ucyB3b24ndCBiZSB0aHJvd24gbGF0ZXIgd2hlbiBhY3R1YWxseSBkZXJlZmVyZW5jZWQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZmllbGQKLQkJICogQHBhcmFtIHJlY2VpdmVyCi0JCSAqIEByZXR1cm4KLQkJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBGaWVsZEFjY2Vzc1JlZmVyZW5jZSBjcmVhdGVGaWVsZEFjY2Vzc1JlZmVyZW5jZShGaWVsZCBmaWVsZCwgT2JqZWN0IHJlY2VpdmVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCS8vIElmIHN0YXRpYywgdGhlbiByZWNlaXZlciBpcyBpZ25vcmVkLgotCQkJaWYgKCFNb2RpZmllci5pc1N0YXRpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQlpZiAoIWZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkuaXNJbnN0YW5jZShyZWNlaXZlcikpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuQ3JlYXRlRmllbGRBY2Nlc3NSZWZlcmVuY2UuRmllbGRzVHlwZXNOb3RNYXRjaGluZ19FWENfIiksIG5ldyBPYmplY3RbXXtmaWVsZC5nZXRUeXBlKCksIChyZWNlaXZlciE9bnVsbCA/IHJlY2VpdmVyLmdldENsYXNzKCkgOiBudWxsKX0pKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsJLy8gTWFrZSBpdCBhbHdheXMgYWNjZXNzaWJsZS4gVHJ1c3QgaXQuIAotCQkJcmV0dXJuIG5ldyBGaWVsZEFjY2Vzc1JlZmVyZW5jZShmaWVsZCwgcmVjZWl2ZXIpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgRmllbGRBY2Nlc3NSZWZlcmVuY2UoRmllbGQgZmllbGQsIE9iamVjdCByZWNlaXZlcikgewotCQkJdGhpcy5maWVsZCA9IGZpZWxkOwotCQkJdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRXhwcmVzc2lvblByb2Nlc3Nlci5WYXJpYWJsZVJlZmVyZW5jZSNkZXJlZmVyZW5jZSgpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGRlcmVmZXJlbmNlKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmllbGQuZ2V0KHJlY2VpdmVyKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2hvdWxkbid0IG9jY3VyLiBBbHJlYWR5IHRlc3RlZCBmb3IgdGhpcy4KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2hvdWxkbid0IG9jY3VyLiBBbHJlYWR5IHRlc3RlZCBmb3IgdGhpcy4KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5FeHByZXNzaW9uUHJvY2Vzc2VyLlZhcmlhYmxlUmVmZXJlbmNlI3NldChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IHNldChPYmplY3QgdmFsdWUsIENsYXNzIHR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCQkJZmllbGQuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7Ci0JCQlyZXR1cm4gZmllbGQuZ2V0KHJlY2VpdmVyKTsJLy8gSnVzdCBpbiBjYXNlIHNvbWUgY29udmVyc2lvbiBoYXBwZW5lZC4gVGVjaG5pY2FsbHkgaXQgaXMgbm90IHRoZSB2YWx1ZSBzZXQgYnV0IHRoZSByZXRyaWV2ZWQgd2hlbiBpbiBhbiBhc3NpZ25tZW50LgotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRmllbGRBY2Nlc3N7IitmaWVsZC50b1N0cmluZygpKyJ9IG9uICIrKHJlY2VpdmVyICE9IG51bGwgPyByZWNlaXZlci50b1N0cmluZygpIDogIjxzdGF0aWMgYWNjZXNzPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEEgdmFyaWFibGUgcmVmZXJlbmNlIGZvciBhbiBBcnJheSBhY2Nlc3MuIEl0IHdpbGwgcmVmZXJlbmNlIG9ubHkgdGhlIGxhc3QgaW5kZXhlZCBlbnRyeSBvZiB0aGUgYXJyYXkuCi0JICogRm9yIGV4YW1wbGUgaWYgPGNvZGU+eFszXVs0XTwvY29kZT4gaXMgdGhlIGFjY2VzcywgdGhlbiB3aGF0IHdpbGwgYmUgZ2l2ZW4gdG8gdGhpcyByZWZlcmVuY2Ugd2lsbCBiZQotCSAqIHRoZSBhcnJheSBlbnRyeSBhdCB4WzNdWzRdLCBub3QgdGhlIHggYXJyYXkgaXRzZWxmLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQXJyYXlBY2Nlc3NSZWZlcmVuY2UgZXh0ZW5kcyBWYXJpYWJsZVJlZmVyZW5jZSB7Ci0JCQotCQkKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgYXJyYXk7Ci0JCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0JCS8qKgotCQkgKiBVc2UgdGhpcyB0byBjb25zdHJ1Y3QgYW4gYXJyYXkgYWNjZXNzIHJlZmVyZW5jZS4gVGhpcyB3aWxsIGRvIGNoZWNrcyB0byBtYWtlIHN1cmUKLQkJICogaXQgaXMgdmFsaWQgc28gdGhhdCBleGNlcHRpb25zIHdvbid0IGJlIHRocm93biBsYXRlciB3aGVuIGFjdHVhbGx5IGRlcmVmZXJlbmNlZC4KLQkJICogCi0JCSAqIEBwYXJhbSBhcnJheQotCQkgKiBAcGFyYW0gaW5kZXgKLQkJICogQHJldHVybgotCQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFycmF5QWNjZXNzUmVmZXJlbmNlIGNyZWF0ZUFycmF5QWNjZXNzUmVmZXJlbmNlKE9iamVjdCBhcnJheSwgaW50IGluZGV4KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gewotCQkJaW50IGxlbiA9IEFycmF5LmdldExlbmd0aChhcnJheSk7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGxlbiA8PSBpbmRleCkKLQkJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkNyZWF0ZUFycmF5QWNjZXNzUmVmZXJlbmNlLk91dE9mQm91bmRzX0VYQ18iKSwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKGluZGV4KSwgbmV3IEludGVnZXIobGVuKX0pKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBBcnJheUFjY2Vzc1JlZmVyZW5jZShhcnJheSwgaW5kZXgpOwotCQl9Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3QgdGhlIHJlZmVyZW5jZSB3aXRoIHRoZSBhcnJheSBhbmQgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBiZWluZyByZWZlcmVuY2VkLgotCQkgKiBAcGFyYW0gYXJyYXkKLQkJICogQHBhcmFtIGluZGV4Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByb3RlY3RlZCBBcnJheUFjY2Vzc1JlZmVyZW5jZShPYmplY3QgYXJyYXksIGludCBpbmRleCkgewotCQkJdGhpcy5hcnJheSA9IGFycmF5OwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuVmFyaWFibGVSZWZlcmVuY2UjZGVyZWZlcmVuY2UoKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBkZXJlZmVyZW5jZSgpIHsKLQkJCXJldHVybiBBcnJheS5nZXQoYXJyYXksIGluZGV4KTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLlZhcmlhYmxlUmVmZXJlbmNlI3NldChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IHNldChPYmplY3QgdmFsdWUsIENsYXNzIHR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkJQXJyYXkuc2V0KGFycmF5LCBpbmRleCwgdmFsdWUpOwotCQkJcmV0dXJuIEFycmF5LmdldChhcnJheSwgaW5kZXgpOwkvLyBJbiBjYXNlIHRoZXJlIHdhcyBzb21lIGNvbnZlcnNpb24gYXBwbGllZC4gVGVjaG5pY2FsbHkgaXQgaXMgbm90IHRoZSB2YWx1ZSBzZXQgYnV0IHRoZSByZXRyaWV2ZWQgd2hlbiBpbiBhbiBhc3NpZ25tZW50LgotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQXJyYXlBY2Nlc3NbIitpbmRleCsiXTogIithcnJheS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgZXhwcmVzc2lvbiByZXN1bHQgc3RhY2sgYW5kIHRoZSBleHByZXNzaW9uIHJlc3VsdCB0eXBlIHN0YWNrLgotCSAqIFRoZSB0eXBlIHN0YWNrIGlzIHVzZWQgdG8gYmUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZwotCSAqIGV4cHJlc3Npb24gcmVzdWx0LiBUaGlzIGlzIG5lZWRlZCBmb3IgY29udmVydGluZyB0byBwcmltaXRpdmVzCi0JICogYW5kIGZvciBmaW5kaW5nIGNvcnJlY3QgbWV0aG9kIGNhbGwgZnJvbSB0aGUgYXJndW1lbnQgdHlwZXMuIEluCi0JICogdGhpcyBjYXNlLCBpdCBpcyBub3QgdGhlIHRydWUgdmFsdWUsIGJ1dCB0aGUgdmFsdWUgZXhwZWN0ZWQsIGUuZy4KLQkgKiA8Y29kZT5PYmplY3QgZ2V0T2JqZWN0KCk8L2NvZGU+IHJldHVybnMgc29tZXRoaW5nIG9mIHR5cGUgT2JqZWN0LgotCSAqIFRoaXMgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCBzbyB0aGF0IGlmIGl0IGdvZXMgaW50byBhbm90aGVyIG1ldGhvZAotCSAqIHdlIGRvbid0IGFjY2lkZW50bHkgcmV0dXJuIGEgbW9yZSBzcGVjaWZpYyBtZXRob2QgaW5zdGVhZCBvZiB0aGUKLQkgKiBvbmUgdGhhdCB0YWtlcyBPYmplY3QgYXMgYW4gYXJndW1lbnQuIAotCSAqIAotCSAqIGV4cHJlc3Npb25TdGFjayBoYXMgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uLgotCSAqIGV4cHJlc3Npb25UeXBlU3RhY2sgaGFzIHRoZSBjb21wdXRlZCB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGkuZS4KLQkgKiB0aGUgdHlwZSB0aGF0IHRoZSBleHByZXNzaW9uIHJldHVybnMsIG5vdCB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuCi0JICogVGhlc2UgY2FuIGJlIGRpZmZlcmVudCBiZWNhdXNlIHRoZSBleHByZXNzaW9uIChlLmcuIG1ldGhvZCkgbWF5Ci0JICogcmV0dXJuIGFuIE9iamVjdCwgYnV0IHRoZSBleHByZXNzaW9uIHZhbHVlIHdpbGwgYmUgc29tZSBzcGVjaWZpYwotCSAqIHN1YmNsYXNzLiBTbyB0aGUgZXhwcmVzc2lvblR5cGVTdGFjayB3b3VsZCBoYXZlIGEgPGNvZGU+amF2YS5sYW5nLk9iamVjdC5jbGFzczwvY29kZT4KLQkgKiBvbiBpdCBpbiB0aGF0IGNhc2UuCi0JICogTm90ZTogaWYgdGhlIGV4cHJlc3Npb25TdGFjayBoYXMgYSA8Y29kZT5udWxsPC9jb2RlPiBvbiBpdCwgdGhlbiB0aGUgdHlwZSBzdGFjawotCSAqIG1heSBlaXRoZXIgaGF2ZSBhIHNwZWNpZmljIHR5cGUgaW4gaXQsIG9yIGl0IG1heSBiZSA8Y29kZT5NZXRob2RIZWxwZXIuTlVMTF9UWVBFPC9jb2RlPi4gSXQKLQkgKiB3b3VsZCBiZSB0aGlzIGlmIGl0IHdhcyBleHBsaWNpdGx5IHB1c2hlZCBpbiBhbmQgbm90IGFzIHRoZQotCSAqIHJlc3VsdCBvZiBhIGNvbXB1dGF0aW9uLiBJZiB0aGUgcmVzdWx0IG9mIGEgY29tcHV0YXRpb24sIGl0IHdvdWxkIGhhdmUgdGhlCi0JICogdHJ1ZSB2YWx1ZS4KLQkgKiBOb3RlOiBpZiB0aGUgZXhwcmVzc2lvblN0YWNrIGhhcyBhIDxjb2RlPlZvaWQudHlwZTwvY29kZT4gb24gaXQsIHRoZW4gdGhhdAotCSAqIG1lYW5zIHRoZSBwcmV2aW91cyBleHByZXNzaW9uIGhhZCBubyByZXN1bHQuIFRoaXMgaXMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvCi0JICogdXNlIHRoZSBleHByZXNzaW9uIGluIGFub3RoZXIgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLk1ldGhvZEhlbHBlciNOVUxMX1RZUEUKLQkgKi8KLQlwcml2YXRlIExpc3QgZXhwcmVzc2lvblN0YWNrID0gbmV3IEFycmF5TGlzdCgxMCk7Ci0JcHJpdmF0ZSBMaXN0IGV4cHJlc3Npb25UeXBlU3RhY2sgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkKLQkvKioKLQkgKiBMaXN0IG9mIHRoZSBleHByZXNzaW9uIHByb3hpZXMuIFRoZSBpbmRleCBpbnRvIHRoZSBsaXN0IGlzIHRoZQotCSAqIHNhbWUgYXMgdGhlIGV4cHJlc3Npb24gcHJveHkgaWQuIAotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IGV4cHJlc3Npb25Qcm94aWVzOwkvLyBJdCBpcyBhcnJheSBsaXN0IGJlY2F1c2Ugd2Ugd2FudCB0byBjYWxsIGVuc3VyZUNhcGFjaXR5IGFuZCB0aGF0IGlzIG5vdCBhdmFpbGFibGUgb24gTGlzdC4KLQkKLQkvKioKLQkgKiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIEF0IHRoaXMgcG9pbnQgYWxsIHN1YmNvbW1hbmRzIHdpbGwgc2ltcGx5IG1ha2Ugc3VyZSB0aGV5IGZsdXNoIHRoZSBpbnB1dCBzdHJlYW0KLQkgKiBjb3JyZWN0bHksIGJ1dCB0aGV5IGRvIG5vdCBwcm9jZXNzIGl0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBlcnJvck9jY3VycmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIG5vdmFsdWVFeGNlcHRpb24gPSBmYWxzZTsKLQkKLQlwcml2YXRlIFRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOwkvLyBXYXMgdGhlcmUgYW5vdGhlciBraW5kIG9mIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQuCi0JCi0JLyoqCi0JICogUHJvY2VzcyBhbGwgb3RoZXIgZXhjZXB0aW9ucyB0aGVuIHRoZSBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbi4gVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdXNhZ2UgY29kZSBzbyB0aGF0IGlmIHRoZXJlIHdhcyBhbiBlcnJvcgotCSAqIGluIHNldHRpbmcgdXAgZm9yIGEgY2FsbCB0byB0aGUgcHJvY2Vzc2VyIGl0IGNhbiBiZSBsb2dnZWQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwcm9jZXNzRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCS8vIFByb2Nlc3MgYWxsIG90aGVyIGV4Y2VwdGlvbnMuCi0JCW5vdmFsdWVFeGNlcHRpb24gPSBmYWxzZTsKLQkJd2hpbGUgKGUuZ2V0Q2F1c2UoKSAhPSBudWxsKQotCQkJZSA9IGUuZ2V0Q2F1c2UoKTsKLQkJaWYgKHRyYWNlT24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJU3lzdGVtLm91dC5wcmludCgiKioqKiogPj4+XHRFeGNlcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQkJdGhyb3dFeGNlcHRpb24oZSk7CS8vIFRyZWF0IGFzIGEgdGhyb3cgdG8gbGV0IHRyeS9jYXRjaGVzIGV4cHJlc3Npb25zIGhhbmRsZSBpdC4KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyBhIHN5bnRheCBleGNlcHRpb24uIFRoaXMgbWVhbnMgZGF0YSBjb21pbmcgYWNyb3NzIGlzIGNvcnJ1cHRlZCBpbgotCSAqIHNvbWUgd2F5IHNvIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyBzaG91bGQgb2NjdXIuIAotCSAqIEBwYXJhbSBlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQllcnJvck9jY3VycmVkID0gdHJ1ZTsKLQkJbm92YWx1ZUV4Y2VwdGlvbiA9IGZhbHNlOwotCQlleGNlcHRpb24gPSBlOwkJCi0JfQotCQkKLQkvKioKLQkgKiBQcm9jZXNzIGEgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24uIERvbid0IHdyYXBwZXIgdGhlc2UuCi0JICogQHBhcmFtIGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzU3ludGF4RXhjZXB0aW9uKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJaWYgKHRyYWNlT24pIHsKLQkJCS8vIFRoaXMgY2FuIGhhcHBlbiBhdCBhbnkgdGltZSwgc28gbWFrZSBzdXJlIHdlIGFyZSBvbiBhIG5ldyBsaW5lLgotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlwcmludFRyYWNlKCJFeHByZXNzaW9uIGhhcyBubyB2YWx1ZSIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQllcnJvck9jY3VycmVkID0gdHJ1ZTsKLQkJCW5vdmFsdWVFeGNlcHRpb24gPSB0cnVlOwotCQkJZXhjZXB0aW9uID0gZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5vIGVycm9ycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBub0Vycm9ycygpIHsKLQkJcmV0dXJuICFlcnJvck9jY3VycmVkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZXJyb3IgaXMgYSBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBvciBub3QuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9FeHByZXNzaW9uVmFsdWUoKSB7Ci0JCXJldHVybiBub3ZhbHVlRXhjZXB0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRocm93YWJsZSBpZiBhIFRocm93YWJsZSB3YXMgY2F1Z2h0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHRocm93YWJsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldEVycm9yVGhyb3dhYmxlKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFB1c2ggdGhlIGV4cHJlc3Npb24gdmFsdWUgYW5kIGl0cyBleHBlY3RlZCB0eXBlLgotCSAqIEBwYXJhbSBvCi0JICogQHBhcmFtIHR5cGUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwdXNoRXhwcmVzc2lvblZhbHVlKE9iamVjdCBvLCBDbGFzcyB0eXBlKSB7Ci0JCWV4cHJlc3Npb25TdGFjay5hZGQobyk7Ci0JCWV4cHJlc3Npb25UeXBlU3RhY2suYWRkKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFBvcCBqdXN0IHRoZSBleHByZXNzaW9uIHZhbHVlLiBJdCBpcyBpbXBlcml0aXZlIHRoYXQgdGhlIGV4cHJlc3Npb24gdHlwZQotCSAqIGlzIHBvcHBlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcuIFNlcGFyYXRlZCB0aGUgbWV0aG9kcyBzbyB0aGF0IHdlCi0JICogZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gYXJyYXkgdG8gcmV0dXJuIHR3byB2YWx1ZXMuIFRoaXMgd2lsbCBkZXJlZmVyZW5jZQotCSAqIGFueSB2YXJpYWJsZSByZWZlcmVuY2VzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlLgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHBvcEV4cHJlc3Npb24oKSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlyZXR1cm4gcG9wRXhwcmVzc2lvbih0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogUG9wIGp1c3QgdGhlIGV4cHJlc3Npb24gdmFsdWUuIEl0IGlzIGltcGVyaXRpdmUgdGhhdCB0aGUgZXhwcmVzc2lvbiB0eXBlCi0JICogaXMgcG9wcGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZy4gU2VwYXJhdGVkIHRoZSBtZXRob2RzIHNvIHRoYXQgd2UKLQkgKiBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSB0byByZXR1cm4gdHdvIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVSZWZlcmVuY2UgSWYgdGhlIHRvcCBleHByZXNzaW9uIGlzIGEgUmVmZXJlbmNlLCB0aGVuIGRlcmVmZXJlbmNlIGl0LgotCSAqIEByZXR1cm4gVGhlIHZhbHVlLgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHBvcEV4cHJlc3Npb24oYm9vbGVhbiBkZVJlZmVyZW5jZSkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vIERvIG5vdCBwb3AgYWJvdmUgdGhlIGN1cnJlbnQgc3ViZXhwcmVzc2lvbiBwb3MsIGlmIGFueS4KLQkJCWlmICh0b3BTdWJleHByZXNzaW9uICE9IC0xKQotCQkJCWlmIChleHByZXNzaW9uU3RhY2suc2l6ZSgpID09IHN1YmV4cHJlc3Npb25TdGFja1Bvc1t0b3BTdWJleHByZXNzaW9uXSkKLQkJCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7Ci0JCQkKLQkJCU9iamVjdCByZXN1bHQgPSBleHByZXNzaW9uU3RhY2sucmVtb3ZlKGV4cHJlc3Npb25TdGFjay5zaXplKCktMSk7Ci0JCQlpZiAoZGVSZWZlcmVuY2UgJiYgcmVzdWx0IGluc3RhbmNlb2YgVmFyaWFibGVSZWZlcmVuY2UpCi0JCQkJcmVzdWx0ID0gKChWYXJpYWJsZVJlZmVyZW5jZSkgcmVzdWx0KS5kZXJlZmVyZW5jZSgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZXhwcmVzc2lvbiBhdCA8Y29kZT5mcm9tVG9wPC9jb2RlPiBkb3duIGZyb20gdGhlIHRvcC4gVGhpcyBpcwotCSAqIG5lZWQgZm9yIHdoZW4gbXVsdGktb3BlcmF0b3JzIGhhcHBlbiBhbmQgdGhleSBhcmUgc3RvcmVkIGluIHJldmVyc2Ugb2YgCi0JICogd2hhdCBpcyBuZWVkZWQuIFRoZXkgd291bGQgbm9ybWFsbHkgYmUgc3RvcmVkIGxlZnQgdG8gcmlnaHQsIHdpdGggdGhlCi0JICogcmlnaHRtb3N0IG9uZSBvbiB0b3AuIEJ1dCB0aGV5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGxlZnQgdG8gcmlnaHQsIHNvCi0JICogdG8gZ2V0IHRoZSBsZWZ0IG1vc3Qgb25lIHJlcXVpcmVzIGRpZ2dpbmcgZG93biBpbiB0aGUgc3RhY2suCi0JICogPHA+Ci0JICogV2hlbiBkb25lLCA8Y29kZT5wb3BFeHByZXNzaW9ucyhpbnQgY291bnQpPC9jb2RlPiBtdXN0IGJlIGNhbGxlZCB0bwotCSAqIGNsZWFuIHRoZW0gb3V0IHNpbmNlIHRoZXkgd2VyZSBwcm9jZXNzZWQuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIG5vdCBkZXJlZmVyZW5jZSB0aGUgZXhwcmVzc2lvbi4gSXQgaXMgdGhlIGpvYiBvZiB0aGUgY2FsbGVyIHRvIGRvIHRoaXMuIAotCSAqICAKLQkgKiBAcGFyYW0gZnJvbVRvcCA8Y29kZT4xPC9jb2RlPiBpcyB0aGUgdG9wIG9uZSwgPGNvZGU+MjwvY29kZT4gaXMgdGhlIG5leHQgb25lIGRvd24uCi0JICogQHJldHVybiBUaGUgZW50cnkgZnJvbSB0aGUgdG9wIHRoYXQgd2FzIHJlcXVlc3RlZC4KLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBJREVFeHByZXNzaW9uI3BvcEV4cHJlc3Npb25zKGludCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGdldEV4cHJlc3Npb24oaW50IGZyb21Ub3ApIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBEbyBub3QgcHVsbCBhYm92ZSB0aGUgY3VycmVudCBzdWJleHByZXNzaW9uIHBvcywgaWYgYW55LgkJCQotCQkJaWYgKHRvcFN1YmV4cHJlc3Npb24gIT0gLTEpCi0JCQkJaWYgKGV4cHJlc3Npb25TdGFjay5zaXplKCktZnJvbVRvcCA8IHN1YmV4cHJlc3Npb25TdGFja1Bvc1t0b3BTdWJleHByZXNzaW9uXSkKLQkJCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7Ci0JCQkKLQkJCXJldHVybiBleHByZXNzaW9uU3RhY2suZ2V0KGV4cHJlc3Npb25TdGFjay5zaXplKCktZnJvbVRvcCk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB0b3AgPGNvZGU+Y291bnQ8L2NvZGU+IGl0ZW1zLiBUaGlzIHdpbGwgbm90IGNhdXNlIGRlcmVmZXJlbmNpbmcgdG8gb2NjdXIuIEl0Ci0JICogcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyB0eXBlIHN0YWNrIGVudHJpZXMuCi0JICogCi0JICogQHBhcmFtIGNvdW50Ci0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHBvcEV4cHJlc3Npb25zKGludCBjb3VudCkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vIERvIG5vdCBwb3AgYWJvdmUgdGhlIGN1cnJlbnQgc3ViZXhwcmVzc2lvbiBwb3MsIGlmIGFueS4KLQkJCWludCBzdG9wID0gdG9wU3ViZXhwcmVzc2lvbiAhPSAtMSA/IHN1YmV4cHJlc3Npb25TdGFja1Bvc1t0b3BTdWJleHByZXNzaW9uXSA6IC0xOwotCQkJaW50IHJlbW92ZSA9IGV4cHJlc3Npb25TdGFjay5zaXplKCktMTsKLQkJCXdoaWxlIChjb3VudC0tID4gMCkgewotCQkJCWlmIChleHByZXNzaW9uU3RhY2suc2l6ZSgpIDw9IHN0b3ApCi0JCQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwkvLyBUcnkgdG8gZ28gYWJvdmUgdGhlIGN1cnJlbnQgc3ViZXhwcmVzc2lvbi4KLQkJCQlleHByZXNzaW9uU3RhY2sucmVtb3ZlKHJlbW92ZSk7Ci0JCQkJZXhwcmVzc2lvblR5cGVTdGFjay5yZW1vdmUocmVtb3ZlLS0pOwotCQkJfQotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFBvcCBqdXN0IHRoZSBleHByZXNzaW9uIHR5cGUuIEl0IGlzIGltcGVyaXRpdmUgdGhhdCB0aGUgZXhwcmVzc2lvbiB0eXBlCi0JICogaXMgcG9wcGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBwb3BFeHByZXNzaW9uLiBTZXBhcmF0ZWQgdGhlIG1ldGhvZHMgc28gdGhhdCB3ZQotCSAqIGRvbid0IG5lZWQgdG8gY3JlYXRlIGFuIGFycmF5IHRvIHJldHVybiB0d28gdmFsdWVzLgotCSAqIDxwPgotCSAqIElmIHRoZSBhbGxvd1ZvaWQgaXMgZmFsc2UgYW5kIHR5cGUgaXMgdm9pZCwgdGhlbiBhIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqIFRoaXMgaXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBleHByZXNzaW9uIHdhcyB0cnlpbmcgdG8gYmUgdXNlZCBpbiBhIGRpZmZlcmVudAotCSAqIGV4cHJlc3Npb24uIFRoaXMgd2lsbCBiZSBzZXQgdG8gdm9pZCBvbmx5IG9uIGV4cHJlc3Npb25zIHRoYXQgcmV0dXJuIG5vIHZhbHVlIChvbmx5Ci0JICogbWV0aG9kJ3MgZG8gdGhpcyBmb3Igbm93KS4KLQkgKiAKLQkgKiBAcGFyYW0gYWxsb3dWb2lkIEFsbG93IHZvaWQgdHlwZXMgaWYgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlLgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2xhc3MgcG9wRXhwcmVzc2lvblR5cGUoYm9vbGVhbiBhbGxvd1ZvaWQpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlDbGFzcyByZXN1bHQgPSAoQ2xhc3MpIGV4cHJlc3Npb25UeXBlU3RhY2sucmVtb3ZlKGV4cHJlc3Npb25UeXBlU3RhY2suc2l6ZSgpLTEpOwotCQkJaWYgKCFhbGxvd1ZvaWQgJiYgcmVzdWx0ID09IFZvaWQuVFlQRSkKLQkJCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUG9wRXhwcmVzc2lvblR5cGUuRXhwcmVzc2lvblZvaWRfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZXhwcmVzc2lvbiB0eXBlIGF0IDxjb2RlPmZyb21Ub3A8L2NvZGU+IGRvd24gZnJvbSB0aGUgdG9wLiBUaGlzIGlzCi0JICogbmVlZCBmb3Igd2hlbiBtdWx0aS1vcGVyYXRvcnMgaGFwcGVuIGFuZCB0aGV5IGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSBvZiAKLQkgKiB3aGF0IGlzIG5lZWRlZC4gVGhleSB3b3VsZCBub3JtYWxseSBiZSBzdG9yZWQgbGVmdCB0byByaWdodCwgd2l0aCB0aGUKLQkgKiByaWdodG1vc3Qgb25lIG9uIHRvcC4gQnV0IHRoZXkgbmVlZCB0byBiZSBwcm9jZXNzZWQgbGVmdCB0byByaWdodCwgc28KLQkgKiB0byBnZXQgdGhlIGxlZnQgbW9zdCBvbmUgcmVxdWlyZXMgZGlnZ2luZyBkb3duIGluIHRoZSBzdGFjay4KLQkgKiA8cD4KLQkgKiBXaGVuIGRvbmUsIDxjb2RlPnBvcEV4cHJlc3Npb25UeXBlcyhpbnQgY291bnQpPC9jb2RlPiBtdXN0IGJlIGNhbGxlZCB0bwotCSAqIGNsZWFuIHRoZW0gb3V0IHNpbmNlIHRoZXkgd2VyZSBwcm9jZXNzZWQuCi0KLQkgKiBAcGFyYW0gZnJvbVRvcCA8Y29kZT4xPC9jb2RlPiBpcyB0aGUgdG9wIG9uZSwgPGNvZGU+MjwvY29kZT4gaXMgdGhlIG5leHQgb25lIGRvd24uCi0JICogQHBhcmFtIGFsbG93Vm9pZCBBbGxvdyB2b2lkIHR5cGVzIGlmIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogQHJldHVybiBUaGUgdHlwZSBmcm9tIHRoZSB0b3AgdGhhdCB3YXMgcmVxdWVzdGVkLgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBJREVFeHByZXNzaW9uI3BvcEV4cHJlc3Npb25UeXBlcyhpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENsYXNzIGdldEV4cHJlc3Npb25UeXBlKGludCBmcm9tVG9wLCBib29sZWFuIGFsbG93Vm9pZCkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUNsYXNzIHJlc3VsdCA9IChDbGFzcykgZXhwcmVzc2lvblR5cGVTdGFjay5nZXQoZXhwcmVzc2lvblR5cGVTdGFjay5zaXplKCktZnJvbVRvcCk7Ci0JCQlpZiAoIWFsbG93Vm9pZCAmJiByZXN1bHQgPT0gVm9pZC5UWVBFKQotCQkJCXRocm93IG5ldyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbigpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBGbGFnIGluZGljYXRpbmcgZXhwcmVzc2lvbiBzaG91bGQgYmUgaWdub3JlZCBhbmQgbm90IHByb2Nlc3NlZC4KLQkgKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBvZiBmZXcgY2FzZXMsIGxpa2UgY29uZGl0aW9uYWwgYW5kLCB0aGF0Ci0JICogaWYgb25lIHJldHVybnMgZmFsc2UsIHRoZSByZXN0IG9mIHRoZSBleHByZXNzaW9ucyBpbiB0aGF0IGNvbmRpdGlvbmFsIGFuZAotCSAqIGV4cHJlc3Npb24gc2hvdWxkIGJlIGlnbm9yZWQgYW5kIG5vdCBwcm9jZXNzZWQuCi0JICogPHA+Ci0JICogSXQgaXMgYW4gT2JqZWN0IHRoYXQgYWN0cyBhcyBhbiBlbnVtIGZvciB0aGUgdHlwZSBvZiBleHByZXNzaW9uIHRoYXQgaW5pdGlhdGVkIHRoZSBpZ25vcmUuIAotCSAqIElmIGl0IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gbm8gb25lIGlzIGlnbm9yaW5nLiAKLQkgKiA8cD4KLQkgKiBBbGwgb2YgdGhlIHB1c2hUby4uLlByb3h5IG1ldGhvZHMgbXVzdCB0ZXN0IHRoaXMgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHkuCi0JICogRWFjaCBleHByZXNzaW9uIGhhcyBzb21lIHdheSBvZiB0ZXN0aW5nIHRoYXQgdGhlaXIgcGFydGljdWxhciBuZXN0aW5nIG9mIAotCSAqIGV4cHJlc3Npb25zIGlzIGNvbXBsZXRlIGFuZCB0aGV5IGNhbiB0dXJuIG9mZiB0aGUgaWdub3JlIGZsYWcuCi0JICogPHA+Ci0JICogT25seSBvbmUgdHlwZSBvZiBpZ25vcmUgY2FuIGV4aXN0IGF0IGEgdGltZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwkKLQkKLQkKLQlwcml2YXRlIExpc3Qgc2F2ZVN0YXRlczsKLQkKLQkvKioKLQkgKiBBcmUgd2UgdHJhY2luZyBvciBub3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdHJhY2VPbjsKLQlwcml2YXRlIGZpbmFsIGxvbmcgdGhyZXNob2xkVGltZTsKLQlwcml2YXRlIGxvbmcgc3RhcnRFeHByZXNzaW9uU3RlcFRpbWU7Ci0JcHJpdmF0ZSBsb25nIHN0YXJ0RXhwcmVzc2lvblRpbWU7Ci0JcHJpdmF0ZSBsb25nIGxhc3RFeHByZXNzaW9uRW5kVGltZTsKLQkKLQkvKioKLQkgKiBUcmFjZSBoZWFkIG9mIHRoaXMgZXhwcmVzc2lvbi4gU28gdGhhdCB0cmFjZXMgZnJvbSBkaWZmZXJlbnQgZXhwcmVzc2lvbnMgY2FuIGJlIGRpc3RpbnF1aXNoZWQuCi0JICogSXQgaXMgc2ltcGx5IGFuIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBjb3VudGVyLiBJdCBpcyB0aGUgaGVhZGVyIHN0cmluZyBmb3IgYW55IHRyYWNlIG91dHB1dC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHRyYWNlSGVhZGVyOwotCQotCXByaXZhdGUgaW50IGluZGVudCA9IDA7CS8vIEluZGVudGVkIGZvciBjZXJ0YWluIGJsb2NrIGV4cHJlc3Npb25zLgotCQotCS8qCi0JICogVHJhY2UgY291bnRlci4gSXQgaXMgaW5jcmVtZW50ZWQgb25jZSBmb3IgZWFjaCBleHByZXNzaW9uIGFuZCBhc3NpZ25lZCB0byB0aGUgdHJhY2VJZCBvZiB0aGUgZXhwcmVzc2lvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgVFJBQ0VfQ09VTlRFUjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIEV4cHJlc3Npb24gd2l0aG91dCB0cmFjaW5nLgotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJvY2Vzc2VyKCkgewotCQl0aGlzKGZhbHNlLCAtMSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhwcmVzc2lvbiwgYW5kIHNldCB0aGUgdHJhY2luZyBtb2RlIGFuZCB0aHJlc2hvbGQgdGltZS4gVXNlIC0xCi0JICogZm9yIGRlZmF1bHQgdGltZSBvZiAxMDBtcy4KLQkgKiBAcGFyYW0gdHJhY2VPbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJvY2Vzc2VyKGJvb2xlYW4gdHJhY2VPbiwgbG9uZyB0aHJlc2hvbGQpIHsKLQkJdGhpcy50cmFjZU9uID0gdHJhY2VPbjsKLQkJaWYgKHRyYWNlT24pIHsKLQkJCXRyYWNlSGVhZGVyID0gIioqIisoKytUUkFDRV9DT1VOVEVSKSsnOic7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnQodHJhY2VIZWFkZXIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgU3RhcnQgZXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnRocmVzaG9sZFRpbWUgPSB0aHJlc2hvbGQgIT0gLTEgPyB0aHJlc2hvbGQgOiAxMDA7Ci0JCQlsYXN0RXhwcmVzc2lvbkVuZFRpbWUgPSBzdGFydEV4cHJlc3Npb25UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cmFjZUhlYWRlciA9IG51bGw7Ci0JCQl0aHJlc2hvbGRUaW1lID0gMTAwOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRyYWNlIG1zZyBoZWxwZXIuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0cmFjZU9uIGlzIHRydWUuIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB0byBzdGFydCBhIG5ldyB0cmFjZSBtZXNzYWdlLgotCSAqIFRoZSBjYWxsZXIgaXMgbXVzdCBjYWxsIHByaW50VHJhY2VFbmQgYXQgdGhlIGVuZC4KLQkgKiAgCi0JICogQHBhcmFtIG1zZyBtZXNzYWdlIHRvIHByaW50Ci0JICogQHBhcmFtIGlnbm9yZSBhcmUgd2UgaWdub3JpbmcgdGhlIGV4cHJlc3Npb24sIG9yIGlzIGl0IGJlaW5nIHByb2Nlc3NlZCAodGhpcyBqdXN0IGFsdGVycyB0aGUgdHJhY2Ugb3V0cHV0IHNsaWdodGx5KS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFRyYWNlKFN0cmluZyBtc2csIGJvb2xlYW4gaWdub3JlKSB7Ci0JCXN0YXJ0RXhwcmVzc2lvblN0ZXBUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWxvbmcgc2luY2VMYXN0RXhwcmVzc2lvbiA9IHN0YXJ0RXhwcmVzc2lvblN0ZXBUaW1lIC0gbGFzdEV4cHJlc3Npb25FbmRUaW1lOwotCQlTeXN0ZW0ub3V0LnByaW50KHRyYWNlSGVhZGVyKTsKLQkJaWYgKHNpbmNlTGFzdEV4cHJlc3Npb24gPiAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCcoJyk7Ci0JCQlpZiAoc2luY2VMYXN0RXhwcmVzc2lvbiA+IHRocmVzaG9sZFRpbWUpCi0JCQkJU3lzdGVtLm91dC5wcmludCgiKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnQoc2luY2VMYXN0RXhwcmVzc2lvbik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJtcykiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnQoJ1x0Jyk7Ci0JCWlmICghaWdub3JlKQotCQkJU3lzdGVtLm91dC5wcmludCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50KCIjI1x0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXByaW50SW5kZW50KCk7Ci0JCVN5c3RlbS5vdXQucHJpbnQobXNnKTsKLQl9Ci0JCi0JLyoqCi0JICogcHJpbnQgdGhlIGluZGVudC4gSXQgd2lsbCBub3QgZG8gYSBuZXcgbGluZSBiZWZvcmUgbm9yIGFmdGVyLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50SW5kZW50KCkgewotCQlmb3IoaW50IGk9aW5kZW50OyBpPjA7IGktLSkgewotCQkJU3lzdGVtLm91dC5wcmludCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRUcmFjZUVuZCgpIHsKLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnRFeHByZXNzaW9uU3RlcFRpbWU7Ci0JCWlmIChzdG9wID4gMCkgewotCQkJU3lzdGVtLm91dC5wcmludCgiICgiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHN0b3AgPiB0aHJlc2hvbGRUaW1lKQotCQkJCVN5c3RlbS5vdXQucHJpbnQoIioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50KHN0b3ApOwotCQkJU3lzdGVtLm91dC5wcmludCgibXMpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJbGFzdEV4cHJlc3Npb25FbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JfQotCQotCS8qKgotCSAqIERvIGFuIGluZGVudCAodW5kZW50KSBhY2NvcmRpbmcgdG8gaW5kZW50IGZsYWcuCi0JICogQHBhcmFtIGluZGVudCA8Y29kZT50cnVlPC9jb2RlPiB0byBpbmNyZW1lbnQgaW5kZW50LCBvciBvdGhlcndpc2UgZGVjcmVtZW50LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluZGVudChib29sZWFuIGluZGVudCkgewotCQl0aGlzLmluZGVudCArPSAoaW5kZW50ID8gMSA6IC0xKTsKLQkJaWYgKHRoaXMuaW5kZW50IDwgMCkKLQkJCXRoaXMuaW5kZW50ID0gMDsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgdGhlIG9iamVjdCBhbmQgdHlwZS4gSXQgd2lsbCBub3QgZW5kIHdpdGggYSBuZXdsaW5lIGNoYXIsIHNvIG9uZSB3aWxsIGJlIG5lZWRlZCBhZnRlcndhcmRzLgotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogQHBhcmFtIHQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludE9iamVjdEFuZFR5cGUoT2JqZWN0IG8sIENsYXNzIHQpIHsKLQkJU3lzdGVtLm91dC5wcmludCgnICcpOwotCQlTeXN0ZW0ub3V0LnByaW50KCJPYmplY3QtIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludChvKTsKLQkJU3lzdGVtLm91dC5wcmludCgiIFR5cGUtIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludCh0KTsKLQkJU3lzdGVtLm91dC5wcmludCgnICcpOwotCX0KLQkKLQkvKioKLQkgKiBDbG9zZSB0aGUgZXhjZXB0aW9uIHByb2Nlc3NpbmcKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjbG9zZSgpIHsKLQkJYm9vbGVhbiBmaXJzdENsb3NlID0gZXhwcmVzc2lvblN0YWNrICE9IG51bGw7Ci0JCWlmIChmaXJzdENsb3NlICYmIHRyYWNlT24pIHsKLQkJCXByaW50VHJhY2UoIkVuZCBleHByZXNzaW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlsb25nIHRvdGFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0RXhwcmVzc2lvblRpbWU7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgVG90YWwgZXhwcmVzc2lvbiBldmFsdWF0aW9uIHRpbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50KHRvdGFsVGltZSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJtcy4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlleHByZXNzaW9uU3RhY2sgPSBudWxsOwotCQkJZXhwcmVzc2lvblR5cGVTdGFjayA9IG51bGw7Ci0JCQlleHByZXNzaW9uUHJveGllcyA9IG51bGw7Ci0JCQlleGNlcHRpb24gPSBudWxsOwotCQkJY2F0Y2hUaHJvd2FibGUgPSBudWxsOwotCQkJc2F2ZVN0YXRlcyA9IG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZmlyc3RDbG9zZSAmJiB0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1bGwgdGhlIHZhbHVlLiBUaGUgdmFsdWUgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgYXJyYXkgcGFzc2VkIGluLgotCSAqIEl0IHdpbGwgYmUgc3RvcmVkIGFzIHZhbHVlWzBdID0gdmFsdWUgdmFsdWVbMV0gPSB2YWx1ZXR5cGUoQ2xhc3MpLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgYXJyYXkgdG8gc3RvcmUgdGhlIHZhbHVlIGFuZCB0eXBlIGludG8uCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1bGxWYWx1ZShPYmplY3RbXSB2YWx1ZSkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJQdWxsIHZhbHVlOiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJdmFsdWVbMF0gPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQl2YWx1ZVsxXSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJcHJpbnRPYmplY3RBbmRUeXBlKHZhbHVlWzBdLCAoQ2xhc3MpIHZhbHVlWzFdKTsKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCQl9Ci0JCX0KLQkJY2xvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUHVsbCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gcHJveHksIGRlcmVmZXJlbmNpbmcgaXQgaWYgbmVjZXNzYXJ5LiBUaGlzIGlzIGZvciByZXNvbHV0aW9uIG9ubHkgcHVycG9zZXMgYXQgdGhlCi0JICogZW5kIG9mIHRoZSBleHByZXNzaW9uIGJlaW5nIHByb2Nlc3NlZC4gTm90IG1lYW50IGZvciBnZW5lcmFsIGFjY2VzcyB0byB0aGUgdmFsdWUgb2YgZXhwcmVzc2lvbiBwcm94eS4gVXNlIAotCSAqIHtAbGluayBFeHByZXNzaW9uUHJvY2Vzc2VyI2dldEV4cHJlc3Npb25Qcm94eVZhbHVlKGludCwgT2JqZWN0W10pfSBpbnN0ZWFkIGZvciBnZW5lcmFsIGFjY2VzcyB0byB0aGUgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHByb3h5aWQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVsbEV4cHJlc3Npb25Qcm94eVZhbHVlKGludCBwcm94eWlkLCBPYmplY3RbXSB2YWx1ZSkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJZ2V0RXhwcmVzc2lvblByb3h5VmFsdWUocHJveHlpZCwgdmFsdWUsIHRydWUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGV4cHJlc3Npb24gcHJveHkgdmFsdWUuIElmIHRoZSBleHByZXNzaW9uIGhhcyBub3QgeWV0IGJlZW4gZXZhbHVhdGVkIGl0IHdpbGwKLQkgKiByZXR1cm4gZmFsc2UuIElmIGl0IGhhcyBpdCB3aWxsIHJldHVybiB0cnVlLgotCSAqIEBwYXJhbSBwcm94eWlkCi0JICogQHBhcmFtIHZhbHVlIHB1dCB2YWx1ZSBpbnRvIHZhbHVlWzBdIGFuZCB0aGUgdHlwZSBpbnRvIHZhbHVlWzFdLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzc2Z1bCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBleHByZXNzaW9uIHByb3h5IHdhcyBuZXZlciByZXNvbHZlZCBvciBkb2Vzbid0IGV4aXN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEV4cHJlc3Npb25Qcm94eVZhbHVlKGludCBwcm94eWlkLCBPYmplY3RbXSB2YWx1ZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEV4cHJlc3Npb25Qcm94eVZhbHVlKHByb3h5aWQsIHZhbHVlLCB0cnVlLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGV4cHJlc3Npb24gcHJveHkgdmFsdWUsIG9yIHRoZSBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBpZiBub3QgcmVzb2x2ZWQuIFRoaXMKLQkgKiBpcyB1c2VmdWwgZm9yIGNhbGxlcnMgdGhhdCBuZWVkIHRvIGhhbmRsZSB0aGUgcHJveHkgaXRzZWxmIGZvciBmYWlsZWQgY2FsbHMuCi0JICogCi0JICogQHBhcmFtIHByb3h5aWQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBPYmplY3RbXSB2YWx1ZSkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJZ2V0RXhwcmVzc2lvblByb3h5VmFsdWUocHJveHlpZCwgdmFsdWUsIHRydWUsIGZhbHNlKTsKLQl9Ci0JCi0JLyoKLQkgKiBJbnRlcm5hbCBtZXRob2QgdXNlIHRvIGFjdHVhbGx5IGdldCB0aGUgdmFsdWUsIGJ1dCB0byBkaXN0aW5xdWlzaCBiZXR3ZWVuIHB1bGwgYW5kIGdldCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KLQkgKiBHZXQgd2lsbCBwcm9jZXNzIHRoZSBlcnJvcnMgYXMgbm9ybWFsIGV4ZWN1dGlvbiBlcnJvcnMsIHdoaWxlIHB1bGwgd2lsbCB0aHJvdyB0aGUgZXJyb3JzLiBmaW5hbFRyYWNlIGlzIHdoZW4KLQkgKiB0aGlzIGlzIHRoZSBmaW5hbCBjYWxsIHRvIHJldHVybiB0aGUgdmFsdWVzIHRvIHRoZSBjbGllbnQuIFdlIHdpbGwgdHJhY2UgdGhlIHJlc3VsdHMgaW4gdGhhdCBjYXNlLgotCSAqIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldEV4cHJlc3Npb25Qcm94eVZhbHVlKGludCBwcm94eWlkLCBPYmplY3RbXSB2YWx1ZSwgYm9vbGVhbiBwdWxsLCBib29sZWFuIGZpbmFsVHJhY2UpIHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGU6IFRoaXMgd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9ucyByaWdodCBhd2F5IHNpbmNlIHRoaXMgaXMgY2FsbGVkIGZyb20gb3V0c2lkZSB0byBmaWxsIGluIHRoZSB2YWx1ZSBhbmQKLQkJLy8gc28gd2UgYXJlIGhvbGRpbmcgc3VjaCBleGNlcHRpb25zLgotCQlib29sZWFuIGRvVHJhY2UgPSBmaW5hbFRyYWNlICYmIHRyYWNlT247Ci0JCXRyeSB7Ci0JCQlpZiAoZXhwcmVzc2lvblByb3hpZXMgIT0gbnVsbCAmJiBleHByZXNzaW9uUHJveGllcy5zaXplKCkgPiBwcm94eWlkKSB7Ci0JCQkJSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgcHJveHkgPSAoSW50ZXJuYWxFeHByZXNzaW9uUHJveHkpIGV4cHJlc3Npb25Qcm94aWVzLmdldChwcm94eWlkKTsKLQkJCQlpZiAocHJveHkgIT0gbnVsbCAmJiBwcm94eS5pc1NldCgpKSB7Ci0JCQkJCXZhbHVlWzBdID0gcHJveHkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlWzBdIGluc3RhbmNlb2YgVmFyaWFibGVSZWZlcmVuY2UpCi0JCQkJCQl2YWx1ZVswXSA9ICgoVmFyaWFibGVSZWZlcmVuY2UpIHZhbHVlWzBdKS5kZXJlZmVyZW5jZSgpOyAvLyBIZXJlIHdlIHdhbnQgdGhlIGZpbmFsIGN1cnJlbnQgdmFsdWUuCi0JCQkJCXZhbHVlWzFdID0gcHJveHkuZ2V0VHlwZSgpOwotCQkJCQlpZiAoZG9UcmFjZSkKLQkJCQkJCWlmICh2YWx1ZVsxXSAhPSBWb2lkLlRZUEUpIHsKLQkJCQkJCQlwcmludFRyYWNlKCJSZXR1cm4gUHJveHkgIyIgKyBwcm94eWlkICsgIiBSZXNvbHZlZCB0byIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKHZhbHVlWzBdLCAoQ2xhc3MpIHZhbHVlWzFdKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXByaW50VHJhY2UoIlJldHVybiBQcm94eSAjIiArIHByb3h5aWQgKyAiIFJlc29sdmVkIHRvIHZvaWQuIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZG9UcmFjZSkKLQkJCQkJCXByaW50VHJhY2UoIlJldHVybiBQcm94eSAjIiArIHByb3h5aWQgKyAiOiBOb3QgcmVzb2x2ZWQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlID0gbmV3IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkdldEV4cHJlc3Npb25Qcm94eVZhbHVlLkV4cHJlc3Npb25Qcm94eU5vdFNldF9FWENfIiksIHByb3h5KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAocHVsbCkKLQkJCQkJCXRocm93IGU7Ci0JCQkJCWVsc2UKLQkJCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkb1RyYWNlKQotCQkJCQlwcmludFRyYWNlKCJSZXR1cm4gUHJveHkgIyIgKyBwcm94eWlkICsgIjogTmV2ZXIgY3JlYXRlZC4iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCU5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUgPSBuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuR2V0RXhwcmVzc2lvblByb3h5VmFsdWUuRXhwcmVzc2lvblByb3h5RG9lc250RXhpc3RfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwdWxsKQotCQkJCQl0aHJvdyBlOwotCQkJCWVsc2UKLQkJCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZG9UcmFjZSkKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgZXhwcmVzc2lvbiAoanVzdCBhIHZhbHVlKSBvbnRvIHRoZSBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSB0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEV4cHJlc3Npb24oT2JqZWN0IG8sIENsYXNzIHQpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQlpZiAodHJhY2VPbikgewotCQkJcHJpbnRUcmFjZSgiUHVzaDogIiwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJpbnRPYmplY3RBbmRUeXBlKG8sIHQpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCXB1c2hFeHByZXNzaW9uVmFsdWUobywgdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBwcm94eSAoZnJvbSBwcm94eSBpZCksIGFuZCBwdXNoIHRoZSB2YWx1ZSBvbnRvIHRoZSBzdGFjay4KLQkgKiAgCi0JICogQHBhcmFtIHByb3h5aWQgVGhlIHByb3h5IGlkIG9mIHRoZSBFeHByZXNzaW9uUHJveHkgdG8gcHVzaCBhcyBhIHZhbHVlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPShpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiUHVzaCBFeHByZXNzaW9uIFByb3h5ICMiK3Byb3h5aWQsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmUpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGV4cHJlc3Npb25Qcm94aWVzICE9IG51bGwgJiYgZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpID4gcHJveHlpZCkgewotCQkJCUludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5ID0gKEludGVybmFsRXhwcmVzc2lvblByb3h5KSBleHByZXNzaW9uUHJveGllcy5nZXQocHJveHlpZCk7Ci0JCQkJaWYgKHByb3h5ICE9IG51bGwgJiYgcHJveHkuaXNTZXQoKSkgewotCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCXByaW50T2JqZWN0QW5kVHlwZShwcm94eS5nZXRWYWx1ZSgpLCBwcm94eS5nZXRUeXBlKCkpOwotCQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKHByb3h5LmdldFZhbHVlKCksIHByb3h5LmdldFR5cGUoKSk7CS8vIENhbiBwdXNoIGEgVmFyaWFibGVSZWZlcmVuY2UuIFRoaXMgaXMgb2suIFdoZW4gdXNlZCBpdCB3aWxsIHRoZW4gZGVyZWYgd2l0aCB0aGUgY3VycmVudCB2YWx1ZS4KLQkJCQl9IGVsc2UKLQkJCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oIlByb3h5IGlkOiAiK3Byb3h5aWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlCi0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oIlByb3h5IGlkOiAiK3Byb3h5aWQpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYSBjYXN0IG9udG8gc3RhY2suIFRoZSB0eXBlIHBhc3NlZCBpbiBpcyBlaXRoZXIgYSBTdHJpbmcgKHdpdGggY2xhc3NuYW1lIHRvIGNhc3QgdG8pIG9yIHRoZQotCSAqIHR5cGUgdG8gY2FzdCB0by4KLQkgKiBAcGFyYW0gdHlwZSBUbyBjYXN0IHRvLiBJZiA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoZW4gY29udmVydCB0byB0eXBlICh1c2luZyBzb21ldGhpbmcgbGlrZSA8Y29kZT5DbGFzcy5mb3JOYW1lKCk8L2NvZGU+KSBvciBpdCBpcyBhIENsYXNzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaENhc3QoQ2xhc3MgdHlwZSkgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiQ2FzdCB0bzogIit0eXBlLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCQotCQkJdHJ5IHsKLQkJCQlPYmplY3QgZXhwID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCUNsYXNzIGV4cHR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJCi0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShjYXN0QmVhbih0eXBlLCBleHAsIGV4cHR5cGUpLCB0eXBlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCQkJCi0JfQotCQotCS8qKgotCSAqIENhc3QgYSBiZWFuIGludG8gdGhlIHJldHVybiB0eXBlLiBJZiB0aGUgcmV0dXJuIHR5cGUgaXMgbm90IHByaW1pdGl2ZSwgdGhlbgotCSAqIHRoZSBiZWFuIGlzIGxlZnQgYWxvbmUsIGhvd2V2ZXIgaXQgaXMgY2hlY2tlZCB0byBiZSBhbiBpbnN0YW5jZSBvZgotCSAqIHRoZSByZXR1cm4gdHlwZS4gSWYgdGhlIHJldHVybiB0eXBlIGlzIHByaW1pdGl2ZSwgdGhlbiB0aGUKLQkgKiBjb3JyZWN0IHByaW1pdGl2ZSB3cmFwcGVyIGlzIGNyZWF0ZWQgZnJvbSB0aGUgYmVhbiAoYmVhbiBtdXN0IGJlIGEgbnVtYmVyIG9yIGNoYXJhY3RlciBvciBib29sZWFuIHByaW1pdHZlIHNvCi0JICogdGhhdCBjYXN0IHdpbGwgd29yaykuCi0JICogPHA+Ci0JICogSG93ZXZlciBpZiBjYW4ndCBiZSBjYXN0IGZvciBwcmltaXRpdmUgb3IgaWYgbm90IGFuIGluc3RhbmNlIG9mIHRoZQotCSAqIHJldHVybnR5cGUgZm9yIG9iamVjdHMsIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBleHByZXNzaW9uIHByb2Nlc3NlciB0byBjYXN0IGEgYmVhbi4gU2luY2UgaXQgaXMgYSBoZWxwZXIgbWV0aG9kIGl0IGRvZXNuJ3QKLQkgKiBjaGVjayBub3IgcHJvY2VzcyB0aGUgZXhjZXB0aW9uLiBJdCB0aHJvd3MgaXQuIENhbGxlcnMgbXVzdCBoYW5kbGUgaXQgYXMgdGhleSBzZWUgZml0LgotCSAqIAotCSAqIEBwYXJhbSByZXR1cm5UeXBlCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gYmVhblR5cGUgVGhlIHR5cGUgdGhhdCBiZWFuIGlzIHN1cHBvc2VkIHRvIGJlIChlLmcuIGV2ZW4gdGhvdWdoIGl0IGlzIGEgTnVtYmVyLCBpdCBhY3R1YWxseSByZXByZXNlbnRzIGEgcHJpbWl0aXZlKS4KLQkgKiBAcmV0dXJuIFRoZSBjYXN0IGJlYW4gKGVpdGhlciB0byB0aGUgYXBwcm9wcmlhdGUgcHJpbWl0aXZlIHdyYXBwZXIgdHlwZSBvciBiZWFuKQotCSAqIAotCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBjYXN0QmVhbihDbGFzcyByZXR1cm5UeXBlLCBPYmplY3QgYmVhbiwgQ2xhc3MgYmVhblR5cGUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gewotCQkvLyBDYXN0IHVzZXMgdHJ1ZSB2YWx1ZSBhbmQgdHJ1ZSBjbGFzcyBvZiBiZWFuLCBub3QgZXhwZWN0ZWQgdHlwZSAoaS5lLiBub3QgYmVhblR5cGUpLgotCQlpZiAoYmVhbiA9PSBudWxsKQotCQkJaWYgKCFyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpCi0JCQkJcmV0dXJuIGJlYW47CS8vIGJlYW4gaXMgbnVsbCwgYW5kIHJldHVybiB0eXBlIGlzIG5vdCBwcmltaXRpdmUsIHNvIHRoaXMgaXMgYSB2YWxpZCBjYXN0LgotCQkJZWxzZSAKLQkJCQl0aHJvd0NsYXNzQ2FzdChyZXR1cm5UeXBlLCBiZWFuKTsKLQkJZWxzZSBpZiAocmV0dXJuVHlwZS5lcXVhbHMoYmVhbi5nZXRDbGFzcygpKSkKLQkJCXJldHVybiBiZWFuOwkvLyBUaGV5IGFyZSBhbHJlYWR5IHRoZSBzYW1lLgotCQllbHNlIGlmICghcmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlpZiAoIWJlYW5UeXBlLmlzUHJpbWl0aXZlKCkgJiYgcmV0dXJuVHlwZS5pc0luc3RhbmNlKGJlYW4pKQotCQkJCXJldHVybiBiZWFuOwotCQkJZWxzZQotCQkJCXRocm93Q2xhc3NDYXN0KHJldHVyblR5cGUsIGJlYW4pOwkvLyBFaXRoZXIgYmVhbiB0eXBlIHdhcyB3cmFwcGVyaW5nIHByaW1pdGl2ZSBvciBub3QgaW5zdGFuY2VvZiByZXR1cm50eXBlLgotCQl9IGVsc2UgewotCQkJaWYgKCFiZWFuVHlwZS5pc1ByaW1pdGl2ZSgpKQotCQkJCXRocm93Q2xhc3NDYXN0KHJldHVyblR5cGUsIGJlYW4pOwkvLyBiZWFuIHR5cGUgd2FzIG5vdCB3cmFwcGVyaW5nIGEgcHJpbWl0aXZlLiBDYW4ndCBjYXN0IHRvIHByaW1pdGl2ZS4KLQkJCS8vIEl0IGlzIHJldHVybiB0eXBlIG9mIHByaW1pdGl2ZS4gTm93IGNvbnZlcnQgdG8gY29ycmVjdCBwcmltaXRpdmUuCi0JCQlpZiAocmV0dXJuVHlwZSA9PSBCb29sZWFuLlRZUEUpCi0JCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBCb29sZWFuKQotCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQllbHNlCi0JCQkJCXRocm93Q2xhc3NDYXN0KHJldHVyblR5cGUsIGJlYW4pOwotCQkJZWxzZSB7Ci0JCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJaWYgKHJldHVyblR5cGUgPT0gSW50ZWdlci5UWVBFKQotCQkJCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJCQkJCXJldHVybiBiZWFuOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKE51bWJlcikgYmVhbikuaW50VmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gQnl0ZS5UWVBFKQotCQkJCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBCeXRlKQotCQkJCQkJCXJldHVybiBiZWFuOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBuZXcgQnl0ZSgoKE51bWJlcikgYmVhbikuYnl0ZVZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IENoYXJhY3Rlci5UWVBFKQotCQkJCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoKGNoYXIpICgoTnVtYmVyKSBiZWFuKS5pbnRWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBEb3VibGUuVFlQRSkKLQkJCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgRG91YmxlKQotCQkJCQkJCXJldHVybiBiZWFuOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBuZXcgRG91YmxlKCgoTnVtYmVyKSBiZWFuKS5kb3VibGVWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBGbG9hdC5UWVBFKQotCQkJCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBGbG9hdCkKLQkJCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IEZsb2F0KCgoTnVtYmVyKSBiZWFuKS5mbG9hdFZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IExvbmcuVFlQRSkKLQkJCQkJCWlmIChiZWFuIGluc3RhbmNlb2YgTG9uZykKLQkJCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IExvbmcoKChOdW1iZXIpIGJlYW4pLmxvbmdWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBTaG9ydC5UWVBFKQotCQkJCQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBTaG9ydCkKLQkJCQkJCQlyZXR1cm4gYmVhbjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gbmV3IFNob3J0KCgoTnVtYmVyKSBiZWFuKS5zaG9ydFZhbHVlKCkpOwkKLQkJCQkJZWxzZQotCQkJCQkJdGhyb3dDbGFzc0Nhc3QocmV0dXJuVHlwZSwgYmVhbik7Ci0JCQkJfSBlbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCWlmIChyZXR1cm5UeXBlID09IENoYXJhY3Rlci5UWVBFKQotCQkJCQkJcmV0dXJuIGJlYW47Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gSW50ZWdlci5UWVBFKQotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKCgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKSk7Ci0JCQkJCWVsc2UgaWYgKHJldHVyblR5cGUgPT0gQnl0ZS5UWVBFKQotCQkJCQkJcmV0dXJuIG5ldyBCeXRlKChieXRlKSAoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IERvdWJsZS5UWVBFKQotCQkJCQkJcmV0dXJuIG5ldyBEb3VibGUoKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpKTsKLQkJCQkJZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBGbG9hdC5UWVBFKQotCQkJCQkJcmV0dXJuIG5ldyBGbG9hdCgoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IExvbmcuVFlQRSkKLQkJCQkJCXJldHVybiBuZXcgTG9uZygoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCkpOwotCQkJCQllbHNlIGlmIChyZXR1cm5UeXBlID09IFNob3J0LlRZUEUpCi0JCQkJCQlyZXR1cm4gbmV3IFNob3J0KChzaG9ydCkgKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpKTsJCi0JCQkJCWVsc2UKLQkJCQkJCXRocm93Q2xhc3NDYXN0KHJldHVyblR5cGUsIGJlYW4pOwotCQkJCX0gZWxzZQotCQkJCQl0aHJvd0NsYXNzQ2FzdChyZXR1cm5UeXBlLCBiZWFuKTsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwkvLyBJdCBzaG91bGQgbmV2ZXIgZ2V0IGhlcmU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0aHJvd0NsYXNzQ2FzdChDbGFzcyByZXR1cm5UeXBlLCBPYmplY3QgYmVhbikgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuQ2Fubm90Q2FzdFhUb1lfRVhDXyIpLCBuZXcgT2JqZWN0W10ge2JlYW4gIT0gbnVsbCA/IGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgOiBudWxsLCByZXR1cm5UeXBlLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIHR5cGUgdGhhdCB0aGUgd3JhcHBlciBiZWFuIHJlcHJlc2VudHMgKGkuZS4gQm9vbGVhbiBpbnN0YW5jZSByZXR1cm5zIEJvb2xlYW4uVFlQRSkgCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2VyIHRvIGdldCB0aGUgcHJpbWl0aXZlIHR5cGUuIFNpbmNlIGl0IGlzIGEgaGVscGVyIG1ldGhvZCBpdCBkb2Vzbid0Ci0JICogY2hlY2sgbm9yIHByb2Nlc3MgdGhlIGV4Y2VwdGlvbi4gSXQgdGhyb3dzIGl0LiBDYWxsZXJzIG11c3QgaGFuZGxlIGl0IGFzIHRoZXkgc2VlIGZpdC4KLQotCSAqIEBwYXJhbSBiZWFuCi0JICogQHJldHVybiB0aGUgcHJpbWl0aXZlIHR5cGUgY2xhc3Mgb2YgdGhlIGdpdmVuIGJlYW4uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmVhbiBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBub3Qgb2YgdGhlIHR5cGUgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEgcHJpbWl0aXZlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDbGFzcyBnZXRQcmltaXRpdmVUeXBlKE9iamVjdCBiZWFuKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBCb29sZWFuKQotCQkJcmV0dXJuIEJvb2xlYW4uVFlQRTsKLQkJZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlyZXR1cm4gSW50ZWdlci5UWVBFOwotCQllbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgQnl0ZSkKLQkJCXJldHVybiBCeXRlLlRZUEU7Ci0JCWVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQlyZXR1cm4gQ2hhcmFjdGVyLlRZUEU7Ci0JCWVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBEb3VibGUpCi0JCQlyZXR1cm4gRG91YmxlLlRZUEU7Ci0JCWVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBGbG9hdCkKLQkJCXJldHVybiBGbG9hdC5UWVBFOwotCQllbHNlIGlmIChiZWFuIGluc3RhbmNlb2YgTG9uZykKLQkJCXJldHVybiBMb25nLlRZUEU7Ci0JCWVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBTaG9ydCkKLQkJCXJldHVybiBTaG9ydC5UWVBFOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGJlYW4gIT0gbnVsbCA/IGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgOiAibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRkVMU0VfSUdOT1JFID0gIklGL0VMU0UgSUdOT1JFIjsJLy8gRmxhZyBmb3IgaWYvZWxzZSBpbiBpbmdvcmUgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgaW50IGlmRWxzZU5lc3RpbmcgPSAwOwkvLyBOZXN0aW5nIG9mIGlmL2Vsc2UgZXhwcmVzc2lvbnMuCi0JcHJpdmF0ZSBpbnQgaWZFbHNlSWdub3JlTmVzdENvdW50ID0gMDsJLy8gV2hlbiBpZ25vcmluZyBpZi9lbHNlIGV4cHJlc3Npb25zLCBpZ25vcmUgdW50aWwgdGhpcyBuZXN0IGNvdW50LgotCXByaXZhdGUgYm9vbGVhbiBpZkVsc2VTa2lwVHJ1ZVBhcnQ7Ci0KLQkKLQkvKioKLQkgKiBQdXNoIGFuIGlmIHRlc3QgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gaGFzRWxzZUNsYXVzZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hJZkVsc2UoKSB7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGlnbm9yZSA9IHRydWU7Ci0JCQl0cnkgewotCQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gU2xpZ2h0bHkgZGlmZmVyZW50IGhlcmUgaW4gdGhhdCBpZiBhbiBpZ25vcmluZyBvY2N1cnJlZCB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgYXQgbGVhc3QgcGFydCBvZiBpdCBzbyB0aGF0Ci0JCQkJLy8gd2UgY2FuIGdldCB0aGUgZXhwcmVzc2lvbiBncm91cGluZyBjb3JyZWN0LgotCQkJCWlmRWxzZU5lc3RpbmcrKzsJLy8gV2UgaGF2ZSB0aGUgdGVzdC4KLQkKLQkJCQlpZiAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJJZiB0ZXN0IGNvbmRpdGlvbiIsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQkJCi0JCQl0cnkgewotCQkJCU9iamVjdCBjb25kaXRpb24gPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJQ2xhc3MgdHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQlpZiAodHlwZSAhPSBCb29sZWFuLlRZUEUpCi0JCQkJCXRocm93Q2xhc3NDYXN0KEJvb2xlYW4uVFlQRSwgY29uZGl0aW9uKTsKLQkJCQlpZiAodHJhY2VPbikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgVGVzdCBSZXN1bHQ9Iitjb25kaXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJCQkJaW5kZW50KHRydWUpOwotCQkJCQlwcmludFRyYWNlKCJCZWdpbiBUcnVlIEV4cHJlc3Npb24uIiwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCQkJCWluZGVudCh0cnVlKTsKLQkJCQl9CQkJCQotCQkJCWlmICgoKEJvb2xlYW4pIGNvbmRpdGlvbikuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJLy8gQ29uZGl0aW9uIHdhcyB0cnVlLgotCQkJCQkvLyBEbyBub3RoaW5nLiBMZXQgdHJ1ZSBjb25kaXRpb24gYmUgcHJvY2Vzc2VkLgotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENvbmRpdGlvbiB3YXMgZmFsc2UuCi0JCQkJCWlmRWxzZVNraXBUcnVlUGFydCA9IHRydWU7CS8vIFRlbGwgdGhlIHRydWUgY29uZGl0aW9uIHNob3VsZCBiZSBpZ25vcmVkLgotCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gSUZFTFNFX0lHTk9SRTsKLQkJCQkJaWZFbHNlSWdub3JlTmVzdENvdW50ID0gaWZFbHNlTmVzdGluZzsKLQkJCQl9Ci0JCQkJLy8gV2UgZG9uJ3QgcHV0IGFueXRoaW5nIGJhY2sgb24gdGhlIHN0YWNrIGJlY2F1c2UgdGhlIGNvbmRpdGlvbiB0ZXN0IGlzIG5vdCBldmVyIHJldHVybmVkLgotCQkJCS8vIFRoZSBhcHByb3ByaWF0ZSB0cnVlIG9yIGZhbHNlIGNvbmRpdGlvbiBldmFsdWF0aW9uIHdpbGwgYmUgbGVmdCBvbiB0aGUgc3RhY2suCi0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQdXNoIGFuIGlmL2Vsc2UgY2xhdXNlLiBJdCBjYW4gYmUgYW55IGNsYXVzZSBvZiB0aGUgaWYgKHRydWUsIG9yIGZhbHNlIGNsYXVzZSkuCi0JICogQHBhcmFtIGNsYXVzZVR5cGUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoSWZFbHNlKEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUgY2xhdXNlVHlwZSkgewotCQl0cnkgewotCQkJYm9vbGVhbiBpZ25vcmUgPSB0cnVlOwotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gU2xpZ2h0bHkgZGlmZmVyZW50IGhlcmUgaW4gdGhhdCBpZiBhbiBpZ25vcmluZyBvY2N1cnJlZCB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgYXQgbGVhc3QgcGFydCBvZiBpdCBzbyB0aGF0Ci0JCQkvLyB3ZSBjYW4gZ2V0IHRoZSBleHByZXNzaW9uIGdyb3VwaW5nIGNvcnJlY3QuCi0JCQlzd2l0Y2ggKGNsYXVzZVR5cGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlLlRSVUVfQ0xBVVNFX1ZBTFVFOgotCQkJCQlpZiAodHJhY2VPbikgewotCQkJCQkJaW5kZW50KGZhbHNlKTsKLQkJCQkJCXByaW50VHJhY2UoIkJlZ2luIEZhbHNlIEV4cHJlc3Npb24uIiwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcHJpbnRUcmFjZUVuZCgpOwotCQkJCQkJaW5kZW50KHRydWUpOwotCQkJCQl9Ci0JCQkJCWlmIChpZkVsc2VTa2lwVHJ1ZVBhcnQgJiYgaWdub3JlRXhwcmVzc2lvbiA9PSBJRkVMU0VfSUdOT1JFICYmIGlmRWxzZUlnbm9yZU5lc3RDb3VudCA9PSBpZkVsc2VOZXN0aW5nKSB7Ci0JCQkJCQkvLyBzdG9wIGlnbm9yaW5nLCB3ZSd2ZSBpZ25vcmVkIHRoZSB0cnVlIGNvbmRpdGlvbiBvZiBpbnRlcmVzdC4KLQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCQkJcmV0dXJuOyAvLyBIb3dldmVyLCBsZWF2ZSBiZWNhdXNlIHNpbmNlIHRoaXMgY29uZGl0aW9uIHdhcyBpZ25vcmVkLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5FTFNFX0NMQVVTRV9WQUxVRToKLQkJCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJCWluZGVudChmYWxzZSk7Ci0JCQkJCQlpbmRlbnQoZmFsc2UpOwotCQkJCQkJcHJpbnRUcmFjZSgiRW5kIElGL0VMU0UgRXhwcmVzc2lvbi4iLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCQkJCX0JCQkJCQotCQkJCQlpbnQgY3VycmVudE5lc3RpbmcgPSBpZkVsc2VOZXN0aW5nLS07Ci0JCQkJCWlmIChpZ25vcmVFeHByZXNzaW9uID09IElGRUxTRV9JR05PUkUgJiYgaWZFbHNlSWdub3JlTmVzdENvdW50ID09IGN1cnJlbnROZXN0aW5nKSB7Ci0JCQkJCQkvLyBzdG9wIGlnbm9yaW5nLCB3ZSd2ZSBpZ25vcmVkIHRoZSBmYWxzZSBjb25kaXRpb24gb2YgaW50ZXJlc3QuCi0JCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gbnVsbDsKLQkJCQkJCXJldHVybjsgLy8gSG93ZXZlciwgbGVhdmUgYmVjYXVzZSBzaW5jZSB0aGlzIGNvbmRpdGlvbiB3YXMgaWdub3JlZC4KLQkJCQkJfQotCQkJfQotCQotCQkJCWlmIChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZ25vcmUgPSBmYWxzZTsKLQotCQkJCQkKLQkJCXRyeSB7Ci0JCQkJc3dpdGNoIChjbGF1c2VUeXBlLmdldFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlLlRSVUVfQ0xBVVNFX1ZBTFVFOgotCQkJCQkJaWZFbHNlU2tpcFRydWVQYXJ0ID0gZmFsc2U7CS8vIFRlbGwgdGhlIGZhbHNlIGNvbmRpdGlvbiBzaG91bGQgYmUgaWdub3JlZC4KLQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBJRkVMU0VfSUdOT1JFOwotCQkJCQkJaWZFbHNlSWdub3JlTmVzdENvdW50ID0gaWZFbHNlTmVzdGluZzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuRUxTRV9DTEFVU0VfVkFMVUU6Ci0JCQkJCQkvLyBUaGVyZSdzIG5vdGhpbmcgdG8gZG8sIGlmIGl0IHdhcyBpZ25vcmVkIGR1ZSB0byB0cnVlLCB3ZSB3b3VsZG4ndCBvZiBnb3R0b24gaGVyZS4KLQkJCQkJCS8vIElmIGl0IHdhc24ndCBpZ25vcmVkLCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIGZhbHNlIGV4cHJlc3Npb24gaXMgb24gdGhlIHN0YWNrLCB3aGljaCBpcyB3aGF0IGl0IHNob3VsZCBiZS4KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBpbnN0YW5jZW9mIGV4cHJlc3Npb24uICBUaGUgdHlwZSBwYXNzZWQgaW4gaXMgZWl0aGVyIGEgU3RyaW5nICh3aXRoIGNsYXNzbmFtZSB0byB0ZXN0IGFnYWluc3QpIG9yIHRoZQotCSAqIHR5cGUgdG8gdGVzdCBhZ2FpbnN0LgotCSAqIEBwYXJhbSB0eXBlIFRvIHRlc3QgYWdhaW5zdC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoSW5zdGFuY2VvZihDbGFzcyB0eXBlKSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJJbnN0YW5jZW9mIHR5cGU6ICIrdHlwZSwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IGV4cCA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlDbGFzcyBleHB0eXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUoQm9vbGVhbi52YWx1ZU9mKGlzSW5zdGFuY2UodHlwZSwgZXhwLCBleHB0eXBlKSksIEJvb2xlYW4uVFlQRSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBpZiBpbnN0YW5jZSBvZi4gSXQgd2lsbCBtYWtlIHN1cmUgdGhhdCBwcmltaXRpdmUgdG8gbm9uLXByaW1pdGl2ZSBpcyBub3QgcGVybWl0dGVkLgotCSAqIFRoaXMgaXMgYSB0cnVlIGluc3RhbmNlIG9mLCB3aGljaCBtZWFucyBudWxsIElTIE5PVCBBTiBpbnN0YW5jZSBvZiBhbnkgdHlwZS4gVGhpcyBpcwotCSAqIGRpZmZlcmVudCB0aGVuIGFzc2lnbmFibGUgZnJvbSwgaW4gdGhhdCBjYXNlIG51bGwgY2FuIGJlIGFzc2lnbmVkIHRvIGFueSBjbGFzcyB0eXBlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBleHByZXNzaW9uIHByb2Nlc3NlciB0byBkbyBpc0luc3RhbmNlLiBTaW5jZSBpdCBpcyBhIGhlbHBlciBtZXRob2QgaXQgZG9lc24ndAotCSAqIGNoZWNrIG5vciBwcm9jZXNzIGV4Y2VwdGlvbnMuCi0KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGJlYW5UeXBlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzSW5zdGFuY2UoQ2xhc3MgdHlwZSwgT2JqZWN0IGJlYW4sIENsYXNzIGJlYW5UeXBlKSB7Ci0JCWlmICh0eXBlLmlzUHJpbWl0aXZlKCkpCi0JCQlyZXR1cm4gYmVhblR5cGUuaXNQcmltaXRpdmUoKSAmJiB0eXBlID09IGJlYW5UeXBlOwkvLyBDYW4ndCB1c2UgaXNJbnN0YW5jZSBiZWNhdXNlIGZvciBhIHByaW1pdGl2ZSB0eXBlIGlzSW5zdGFuY2UgcmV0dXJucyBmYWxzZS4KLQkJZWxzZSAKLQkJCXJldHVybiB0eXBlLmlzSW5zdGFuY2UoYmVhbik7Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggbmV3IGluc3RhbmNlIGZyb20gc3RyaW5nLgotCSAqIEBwYXJhbSBpbml0aWFsaXphdGlvblN0cmluZwotCSAqIEBwYXJhbSByZXN1bHRUeXBlIGV4cGVjdGVkIHJlc3VsdCB0eXBlLiBJZiBpdCBpc24ndCBvZiB0aGF0IHR5cGUsIGEgY2xhc3NjYXN0IHdpbGwgYmUgcHJvY2Vzc2VkLiAKLQkgKiBAcGFyYW0gY2xhc3Nsb2FkZXIgY2xhc3Nsb2FkZXIgdG8gdXNlIGZvciBmaW5kaW5nIGNsYXNzZXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSBjbGFzc2xvYWRlciBvZiBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlci5jbGFzcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoTmV3SW5zdGFuY2VGcm9tU3RyaW5nKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZywgQ2xhc3MgcmVzdWx0VHlwZSwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIk5ldyBpbnN0YW5jZSBmcm9tIHN0cmluZzogXCIiK2luaXRpYWxpemF0aW9uU3RyaW5nKyJcIiBUeXBlPSIrcmVzdWx0VHlwZSwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCQotCQkJdHJ5IHsKLQkJCQlJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBwYXJzZXIgPSBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlci5jcmVhdGVQYXJzZXIoaW5pdGlhbGl6YXRpb25TdHJpbmcsIGNsYXNzbG9hZGVyKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSBwYXJzZXIuZXZhbHVhdGUoKTsKLQkJCQluZXdWYWx1ZSA9IGNhc3RCZWFuKHJlc3VsdFR5cGUsIG5ld1ZhbHVlLCBwYXJzZXIuZ2V0RXhwZWN0ZWRUeXBlKCkpOwotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUobmV3VmFsdWUsIHJlc3VsdFR5cGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUHVzaCBwcmVmaXggZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gb3BlcmF0b3IgCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFByZWZpeChQcmVmaXhPcGVyYXRvciBvcGVyYXRvcikgewotCQl0cnkgewotCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKSB7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50VHJhY2UoIlByZWZpeDogXCciK29wZXJhdG9yKyJcJyIsIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlmIChvcGVyYXRvciA9PSBQcmVmaXhPcGVyYXRvci5QUkVfUExVUykKLQkJCQlyZXR1cm47CS8vIERvIG5vdGhpbmcuICIrIiBkb2Vzbid0IGFmZmVjdCB0aGUgcmVzdWx0IG9mIHRoZSBjdXJyZW50IHRvcCBleHByZXNzaW9uLgotCQotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZSgiUHJlZml4OiBcJyIrb3BlcmF0b3IrIlwnICIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCi0JCQl0cnkgewotCQkJCU9iamVjdCBleHAgPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJQ2xhc3MgZXhwdHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQlpZiAoIWV4cHR5cGUuaXNQcmltaXRpdmUoKSkKLQkJCQkJdGhyb3dJbnZhbGlkUHJlZml4KG9wZXJhdG9yLCBleHApOwotCQkJCQotCQkJCWludCBwcmltVHlwZUVudW0gPSBnZXRFbnVtRm9yUHJpbWl0aXZlKGV4cHR5cGUpOwotCQkJCXN3aXRjaCAob3BlcmF0b3IuZ2V0VmFsdWUoKSkgewotCQkJCQljYXNlIFByZWZpeE9wZXJhdG9yLlBSRV9NSU5VU19WQUxVRToKLQkJCQkJCXN3aXRjaCAocHJpbVR5cGVFbnVtKSB7Ci0JCQkJCQkJY2FzZSBCT09MRUFOOgotCQkJCQkJCQl0aHJvd0ludmFsaWRQcmVmaXgob3BlcmF0b3IsIGV4cCk7CQkJCQkJCi0JCQkJCQkJY2FzZSBCWVRFOgotCQkJCQkJCQlleHAgPSBuZXcgSW50ZWdlcigtKChOdW1iZXIpIGV4cCkuYnl0ZVZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIENIQVI6Ci0JCQkJCQkJCWV4cCA9IG5ldyBJbnRlZ2VyKC0oKENoYXJhY3RlcikgZXhwKS5jaGFyVmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgRE9VQkxFOgotCQkJCQkJCQlleHAgPSBuZXcgRG91YmxlKC0oKE51bWJlcikgZXhwKS5kb3VibGVWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBGTE9BVDoKLQkJCQkJCQkJZXhwID0gbmV3IEZsb2F0KC0oKE51bWJlcikgZXhwKS5mbG9hdFZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElOVDoKLQkJCQkJCQkJZXhwID0gbmV3IEludGVnZXIoLSgoTnVtYmVyKSBleHApLmludFZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIExPTkc6Ci0JCQkJCQkJCWV4cCA9IG5ldyBMb25nKC0oKE51bWJlcikgZXhwKS5sb25nVmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgU0hPUlQ6Ci0JCQkJCQkJCWV4cCA9IG5ldyBJbnRlZ2VyKC0oKE51bWJlcikgZXhwKS5zaG9ydFZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWV4cHR5cGUgPSBnZXRQcmltaXRpdmVUeXBlKGV4cCk7CS8vIEl0IGNhbiBhY3R1YWxseSBjaGFuZ2UgdGhlIHR5cGUuCQkJCQotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBQcmVmaXhPcGVyYXRvci5QUkVfQ09NUExFTUVOVF9WQUxVRToKLQkJCQkJCXN3aXRjaCAocHJpbVR5cGVFbnVtKSB7Ci0JCQkJCQkJY2FzZSBCT09MRUFOOgotCQkJCQkJCWNhc2UgRE9VQkxFOgotCQkJCQkJCWNhc2UgRkxPQVQ6Ci0JCQkJCQkJCXRocm93SW52YWxpZFByZWZpeChvcGVyYXRvciwgZXhwKTsJCQkJCQkKLQkJCQkJCQljYXNlIEJZVEU6Ci0JCQkJCQkJCWV4cCA9IG5ldyBJbnRlZ2VyKH4oKE51bWJlcikgZXhwKS5ieXRlVmFsdWUoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgQ0hBUjoKLQkJCQkJCQkJZXhwID0gbmV3IEludGVnZXIofigoQ2hhcmFjdGVyKSBleHApLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBJTlQ6Ci0JCQkJCQkJCWV4cCA9IG5ldyBJbnRlZ2VyKH4oKE51bWJlcikgZXhwKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBMT05HOgotCQkJCQkJCQlleHAgPSBuZXcgTG9uZyh+KChOdW1iZXIpIGV4cCkubG9uZ1ZhbHVlKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFNIT1JUOgotCQkJCQkJCQlleHAgPSBuZXcgSW50ZWdlcih+KChOdW1iZXIpIGV4cCkuc2hvcnRWYWx1ZSgpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlleHB0eXBlID0gZ2V0UHJpbWl0aXZlVHlwZShleHApOwkvLyBJdCBjYW4gYWN0dWFsbHkgY2hhbmdlIHRoZSB0eXBlLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgUHJlZml4T3BlcmF0b3IuUFJFX05PVF9WQUxVRToKLQkJCQkJCXN3aXRjaCAocHJpbVR5cGVFbnVtKSB7Ci0JCQkJCQkJY2FzZSBCT09MRUFOOgotCQkJCQkJCQlleHAgPSAhKChCb29sZWFuKSBleHApLmJvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBCWVRFOgotCQkJCQkJCWNhc2UgQ0hBUjoKLQkJCQkJCQljYXNlIERPVUJMRToKLQkJCQkJCQljYXNlIEZMT0FUOgotCQkJCQkJCWNhc2UgSU5UOgotCQkJCQkJCWNhc2UgTE9ORzoKLQkJCQkJCQljYXNlIFNIT1JUOgotCQkJCQkJCQl0aHJvd0ludmFsaWRQcmVmaXgob3BlcmF0b3IsIGV4cCk7CQkJCQkJCi0JCQkJCQl9CQkJCQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKGV4cCwgZXhwdHlwZSk7Ci0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShleHAsIGV4cHR5cGUpOwkvLyBQdXNoIHRoZSByZXN1bHQgYmFjayBvbiB0aGUgc3RhY2suCi0JCi0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IAotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0JCi0JLyoqCi0JICogQXNzaWduIHRoZSByaWdodCBleHByZXNzaW9uIHRvIHRoZSBsZWZ0IGV4cHJlc3Npb24uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEFzc2lnbm1lbnQoKSB7Ci0JCWlmIChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlwcmludFRyYWNlKCJBc3NpZ25tZW50IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBLTFVER0U6IFRoZSBvbmx5IHJlYXNvbiBsZWZ0VmFsdWUvcmVmVHlwZSBhcmUgb3V0c2lkZSBvZiB0cnkvZmluYWxseSBpcyBiZWNhdXNlCi0JCQkvLyBvZiB0cmFjaW5nLiBwdXNoRXhwcmVzc2lvbigpIGRvZXMgaXRzIG93biB0cmFjZSBzdGF0ZW1lbnRzLCBzbyB3ZSBuZWVkIHRvIGVuZAotCQkJLy8gb3VyIHRyYWNlIGJlZm9yZSBjYWxsaW5nIHB1c2hFeHByZXNzaW9uLiAKLQkJCU9iamVjdCBsZWZ0VmFsdWU7Ci0JCQlDbGFzcyByZWZUeXBlOwotCQkJdHJ5IHsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRUcmFjZSgiQXNzaWdubWVudDogIiwgZmFsc2UpOwkJCSAvLyROT04tTkxTLTEkCQotCQkJCS8vIFRoZSBvcmRlciBvbiB0aGUgc3RhY2sgaXMgcmlnaHQgdGhlbiBsZWZ0IG9wZXJhbmQuCi0JCQkJLy8gRmlyc3QgdGhlIHJpZ2h0IG9wZXJhbmQKLQkJCQlPYmplY3QgdmFsdWUgPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJQ2xhc3MgdHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQotCQkJCS8vIE5leHQgdGhlIGxlZnQgb3BlcmFuZCwgc2hvdWxkIGJlIGEgcmVmZXJlbmNlLgotCQkJCVZhcmlhYmxlUmVmZXJlbmNlIGxlZnQgPSAoVmFyaWFibGVSZWZlcmVuY2UpIHBvcEV4cHJlc3Npb24oZmFsc2UpOyAvLyBEb24ndCBkZXJlZmVyZW5jZSBpdC4KLQkJCQlyZWZUeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCi0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50T2JqZWN0QW5kVHlwZShsZWZ0LCByZWZUeXBlKTsKLQotCQkJCWxlZnRWYWx1ZSA9IGxlZnQuc2V0KHZhbHVlLCB0eXBlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJCX0KLQkJCQotCQkJLy8gTm93IGRvIGFzc2lnbm1lbnQgYW5kIHJldHVybiB0aGUgdmFsdWUgdG8gdGhlIHN0YWNrLgotCQkJcHVzaEV4cHJlc3Npb24obGVmdFZhbHVlLCByZWZUeXBlKTsJLy8gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBpcyB0aGUgdHlwZSBvZiB0aGUgcmVmZXJlbmNlLgotCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCQkJCi0JfQotCQotCS8qKgotCSAqIEFzc2lnbiB0aGUgZXhwcmVzc2lvbiBwcm94eSB0byB0aGUgdG9wIGV4cHJlc3Npb24gdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEFzc2lnbm1lbnQoSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgcHJveHkpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlwcmludFRyYWNlKCJBc3NpZ24gdG8gUHJveHkgIyIrcHJveHkuZ2V0UHJveHlJRCgpLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCQotCQkJdHJ5IHsKLQkJCQlhc3NpZ25Ub0V4cHJlc3Npb25Qcm94eUZyb21Ub3BTdGFja0VudHJ5KHByb3h5KTsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRPYmplY3RBbmRUeXBlKHByb3h5LmdldFZhbHVlKCksIHByb3h5LmdldFR5cGUoKSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFzc2lnbiB0aGUgdG9wIHN0YWNrIGVudHJ5IHRvIHRoZSBuZXcgZXhwcmVzc2lvbiBwcm94eSBhbmQgYWxsb2NhdGUgaXQgZm9yIGNhbGxiYWNrIGxhdGVyLgotCSAqIEBwYXJhbSBwcm94eQotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhc3NpZ25Ub0V4cHJlc3Npb25Qcm94eUZyb21Ub3BTdGFja0VudHJ5KEludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5KSB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlPYmplY3QgdmFsdWUgPSBnZXRFeHByZXNzaW9uKDEpOwotCQlDbGFzcyB0eXBlID0gZ2V0RXhwcmVzc2lvblR5cGUoMSwgdHJ1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFZhcmlhYmxlUmVmZXJlbmNlKQotCQkJdmFsdWUgPSAoKFZhcmlhYmxlUmVmZXJlbmNlKSB2YWx1ZSkuZGVyZWZlcmVuY2UoKTsJLy8gSGVyZSB3ZSB3YW50IHRoZSBmaW5hbCBjdXJyZW50IHZhbHVlLgotCi0JCXByb3h5LnNldFByb3h5KHZhbHVlLCB0eXBlKTsKLQkJYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocHJveHkpOwotCX0KLQotCS8qKgotCSAqIEFsbG9jYXRlIGFuIGV4cHJlc3Npb24gcHJveHkuIFRoaXMgaXMgdXNlZCB0byBtYWtlIGFuIGV4cHJlc3Npb24gcHJveHkga25vd24gdG8gdGhlIHByb2Nlc3Nvci4gVGhlIGV4cHJlc3Npb24gcHJveHkgbXVzdAotCSAqIGhhdmUgYmVlbiBzZXRQcm94eSgpIGF0IHRoaXMgcG9pbnQuIFRoaXMgaXMgdXNlZCB0byBhc3NpZ24gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayBvciB0byBhZGQgZnJvbSBvdXRzaWRlIGFuIGV2YWx1YXRlZCBwcm94eQotCSAqIHRvIGJlIHVzZWQgbGF0ZXIgYnkgb3RoZXJzLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFsbG9jYXRlRXhwcmVzc2lvblByb3h5KEludGVybmFsRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCWludCBtaW5TaXplID0gcHJveHkuZ2V0UHJveHlJRCgpKzE7Ci0JCWlmIChleHByZXNzaW9uUHJveGllcyA9PSBudWxsKQotCQkJZXhwcmVzc2lvblByb3hpZXMgPSBuZXcgQXJyYXlMaXN0KG1pblNpemUrMTApOwkvLyBBbGxvdyByb29tIHRvIGdyb3cgdGVuIG1vcmUuCi0JCWVsc2UgaWYgKGV4cHJlc3Npb25Qcm94aWVzLnNpemUoKSA8IG1pblNpemUpCi0JCQlleHByZXNzaW9uUHJveGllcy5lbnN1cmVDYXBhY2l0eShtaW5TaXplKzEwKTsJLy8gQWxsb3cgcm9vbSB0byBncm93IHRlbiBtb3JlLgotCQlpbnQgZmlsbCA9IG1pblNpemUtZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpOwkvLyBOdW1iZXIgb2YgIm51bGwiIGZpbGwgZW50cmllcyBuZWVkZWQuIFByb2JhYmx5IHNob3VsZG4ndCBvY2N1ciwgYnV0IHRvIGJlIHNhZmUuCi0JCWlmIChmaWxsID4gMCkgewotCQkJd2hpbGUgKC0tZmlsbCA+IDApCi0JCQkJZXhwcmVzc2lvblByb3hpZXMuYWRkKG51bGwpOwotCQkJZXhwcmVzc2lvblByb3hpZXMuYWRkKHByb3h5KTsKLQkJfSBlbHNlCi0JCQlleHByZXNzaW9uUHJveGllcy5zZXQocHJveHkuZ2V0UHJveHlJRCgpLCBwcm94eSk7CS8vIEFscmVhZHkgbGFyZ2UgZW5vdWdoLCByZXBsYWNlIGVudHJ5LgotCi0JfQotCi0JLyoqCi0JICogVGhlIHByaW1pdGl2ZSBlbnVtcy4gCi0JICogTk9URTogVGhlaXIgb3JkZXIgbXVzdCBub3QgY2hhbmdlZC4gVGhleSBhcmUgaW4gb3JkZXIgb2YgcGVybWl0dGVkIHdpZGVuaW5nLgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50Ci0JCUJPT0xFQU4gPSAwLAotCQlCWVRFID0gMSwKLQkJU0hPUlQgPSAyLAkKLQkJQ0hBUiA9IDMsCi0JCUlOVCA9IDQsCi0JCUxPTkcgPSA1LAotCQlGTE9BVCA9IDYsCi0JCURPVUJMRSA9IDc7Ci0JCQotCQkKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGVudW0gY29uc3RhbnQgZm9yIHRoZSB0eXBlIG9mIHByaW1pdGl2ZSBwYXNzZWQgaW4uCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2VyIHRvIGdldCB0aGUgZW51bSBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlLiBTaW5jZSBpdCBpcyBhIGhlbHBlciBtZXRob2QgaXQgZG9lc24ndAotCSAqIGNoZWNrIG5vciBwcm9jZXNzIHRoZSBleGNlcHRpb24uIEl0IHRocm93cyBpdC4gQ2FsbGVycyBtdXN0IGhhbmRsZSBpdCBhcyB0aGV5IHNlZSBmaXQuCi0KLQkgKiBAcGFyYW0gcHJpbWl0aXZlVHlwZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0eXBlIGlzIG5vdCBhIHByaW1pdGl2ZS4KLQkgKiAKLQkgKiBAc2VlIEV4cHJlc3Npb25Qcm9jZXNzZXIjQk9PTEVBTgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0RW51bUZvclByaW1pdGl2ZShDbGFzcyBwcmltaXRpdmVUeXBlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaWYgKHByaW1pdGl2ZVR5cGUgPT0gQm9vbGVhbi5UWVBFKQotCQkJcmV0dXJuIEJPT0xFQU47Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gSW50ZWdlci5UWVBFKQotCQkJcmV0dXJuIElOVDsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBCeXRlLlRZUEUpCi0JCQlyZXR1cm4gQllURTsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBDaGFyYWN0ZXIuVFlQRSkKLQkJCXJldHVybiBDSEFSOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IERvdWJsZS5UWVBFKQotCQkJcmV0dXJuIERPVUJMRTsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBGbG9hdC5UWVBFKQotCQkJcmV0dXJuIEZMT0FUOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IExvbmcuVFlQRSkKLQkJCXJldHVybiBMT05HOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IFNob3J0LlRZUEUpCi0JCQlyZXR1cm4gU0hPUlQ7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocHJpbWl0aXZlVHlwZSAhPSBudWxsID8gcHJpbWl0aXZlVHlwZS5nZXROYW1lKCkgOiAibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgdm9pZCB0aHJvd0ludmFsaWRQcmVmaXgoUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IsIE9iamVjdCBleHApIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkludmFsaWRPcGVyYW5kT2ZQcmVmaXhPcGVyYXRvcl9FWENfIiksIG5ldyBPYmplY3RbXSB7ZXhwICE9IG51bGwgPyBleHAudG9TdHJpbmcoKSA6IG51bGwsIG9wZXJhdG9yLnRvU3RyaW5nKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQl9CQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSU5GSVhfSUdOT1JFID0gIklORklYIElHTk9SRSI7CS8vIEZsYWcgZm9yIGluZml4IGluIGluZ29yZSAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBpbnQgaW5maXhOZXN0aW5nID0gMDsJLy8gTmVzdGluZyBvZiBpbmZpeCBleHByZXNzaW9ucy4KLQlwcml2YXRlIGludCBpbmZpeElnbm9yZU5lc3RDb3VudCA9IDA7CS8vIFdoZW4gaWdub3JpbmcgaW5maXggZXhwcmVzc2lvbnMsIGlnbm9yZSB1bnRpbCB0aGlzIG5lc3QgY291bnQuCi0JLyoqCi0JICogUHVzaCB0aGUgaW5maXggZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4KLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcGFyYW0gb3BlcmFuZFR5cGUgVGhlIG9wZXJhdG9yIHR5cGUuIExlZnQsIHJpZ2h0LCBvdGhlci4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoSW5maXgoSW5maXhPcGVyYXRvciBvcGVyYXRvciwgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIG9wZXJhbmRUeXBlKSB7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGlnbm9yZSA9IHRydWU7Ci0JCQl0cnkgewotCQkJCWlmIChlcnJvck9jY3VycmVkKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLy8gU2xpZ2h0bHkgZGlmZmVyZW50IGhlcmUgaW4gdGhhdCBpZiBhbiBpZ25vcmVkIG9jY3VycmVkIHdlIHN0aWxsIG5lZWQgdG8gcHJvY2VzcyBhdCBsZWFzdCBwYXJ0IG9mIGl0IHNvIHRoYXQKLQkJCQkvLyB3ZSBjYW4gZ2V0IHRoZSBleHByZXNzaW9uIGdyb3VwaW5nIGNvcnJlY3QuCi0JCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCWluZml4TmVzdGluZysrOwotCQkJCWVsc2UgaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MQVNUX09QRVJBTkQpIHsKLQkJCQkJaW50IGN1cnJlbnROZXN0ID0gaW5maXhOZXN0aW5nLS07Ci0JCQkJCWlmIChpZ25vcmVFeHByZXNzaW9uID09IElORklYX0lHTk9SRSAmJiBjdXJyZW50TmVzdCA9PSBpbmZpeElnbm9yZU5lc3RDb3VudCkgewotCQkJCQkJLy8gV2Ugd2VyZSBpZ25vcmluZywgYW5kIGl0IHdhcyB0aGlzIGV4cHJlc3Npb24gdGhhdCB3YXMgYmVpbmcgaWdub3JlLgotCQkJCQkJLy8gV2UgaGF2ZSByZWNlaXZlZCB0aGUgbGFzdCBvcGVyYW5kIG9mIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiB0aGF0IHdhcyBiZWluZyBpZ25vcmVkLAotCQkJCQkJLy8gc28gd2UgY2FuIHN0b3AgaWdub3JpbmcuIEJ1dCB3ZSBzdGlsbCBsZWF2ZSBzaW5jZSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgb24gdGhlCi0JCQkJCQkvLyB0b3Agb2YgdGhlIHN0YWNrLgotCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCi0JCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRUcmFjZSgiSW5maXg6ICIrb3BlcmF0b3IsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlPYmplY3QgcmlnaHQgPSBudWxsOwotCQkJCUNsYXNzIHJpZ2h0VHlwZSA9IG51bGw7Ci0JCQkJaWYgKG9wZXJhbmRUeXBlICE9IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpIHsKLQkJCQkJLy8gV2UgYXJlIG5vdCB0aGUgbGVmdCBvcGVyYW5kLCBzbyB0aGUgc3RhY2sgaGFzIHRoZSByaWdodCBvbiB0aGUgdG9wLCBmb2xsb3dlZCBieSB0aGUgbGVmdC4KLQkJCQkJcmlnaHQgPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJCXJpZ2h0VHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQl9IAotCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlDbGFzcyB2YWx1ZVR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCi0JCQkJc3dpdGNoIChvcGVyYXRvci5nZXRWYWx1ZSgpKSB7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9BTkRfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQml0VHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fQU5EKTsKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0FORCk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSAmIGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgaXMgaW50LiAoZXZlbiB0d28gc2hvcnRzIHRvZ2V0aGVyIHByb2R1Y2UgYW4gaW50KS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgJiBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX0FORF9WQUxVRToKLQkJCQkJCS8vIFRoaXMgaXMgdHJpY2t5LgotCQkJCQkJLy8gRmlyc3QgaWYgdGhpcyBpcyBsZWZ0IHR5cGUsIHRoZW4ganVzdCBjb250aW51ZS4KLQkJCQkJCS8vIEVsc2UgaWYgdGhpcyBvdGhlciBvciBsYXN0LCB0aGVuIG5lZWQgdG8gbWFrZSBpdCB0aGUgbmV3IHZhbHVlLgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlICE9IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpIHsKLQkJCQkJCQl2YWx1ZSA9IHJpZ2h0OwotCQkJCQkJCXZhbHVlVHlwZSA9IHJpZ2h0VHlwZTsKLQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCS8vSWYgdGhlIHZhbHVlIGlzIG5vdyBmYWxzZSwgd2UgbmVlZCB0byBpZ25vcmUgdGhlIHJlc3QuCi0JCQkJCQlpZiAodmFsdWVUeXBlICE9IEJvb2xlYW4uVFlQRSkKLQkJCQkJCQl0aHJvd0ludmFsaWRJbmZpeChvcGVyYXRvciwgdmFsdWUpOwotCQkJCQkJaWYgKCEoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSAmJiBvcGVyYW5kVHlwZSAhPSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEFTVF9PUEVSQU5EKQotCQkJCQkJCXN0YXJ0SW5maXhJZ25vcmUoKTsJLy8gU3RhcnQgaWdub3JpbmcgYmVjYXVzZSB3ZSBrbm93IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBhdCB0aGlzIHBvaW50LiBJdCBpcyBmYWxzZS4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfT1JfVkFMVUU6Ci0JCQkJCQkvLyBUaGlzIGlzIHRyaWNreS4KLQkJCQkJCS8vIEZpcnN0IGlmIHRoaXMgaXMgbGVmdCB0eXBlLCB0aGVuIGp1c3QgY29udGludWUuCi0JCQkJCQkvLyBFbHNlIGlmIHRoaXMgb3RoZXIgb3IgbGFzdCwgdGhlbiBuZWVkIHRvIG1ha2UgaXQgdGhlIG5ldyB2YWx1ZS4KLQkJCQkJCWlmIChvcGVyYW5kVHlwZSAhPSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKSB7Ci0JCQkJCQkJdmFsdWUgPSByaWdodDsKLQkJCQkJCQl2YWx1ZVR5cGUgPSByaWdodFR5cGU7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vSWYgdGhlIHZhbHVlIGlzIG5vdyB0cnVlLCB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUgcmVzdC4KLQkJCQkJCWlmICh2YWx1ZVR5cGUgIT0gQm9vbGVhbi5UWVBFKQotCQkJCQkJCXRocm93SW52YWxpZEluZml4KG9wZXJhdG9yLCB2YWx1ZSk7Ci0JCQkJCQlpZiAoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgJiYgb3BlcmFuZFR5cGUgIT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xBU1RfT1BFUkFORCkKLQkJCQkJCQlzdGFydEluZml4SWdub3JlKCk7IC8vIFN0YXJ0IGlnbm9yaW5nIGJlY2F1c2Ugd2Uga25vdyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gYXQgdGhpcyBwb2ludC4gSXQgaXMgdHJ1ZS4KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fRElWSURFX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9ESVZJREUpOwotCQkJCQkJdGVzdFZhbGlkQXJpdGhtZXRpY1R5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX0RJVklERSk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IERvdWJsZS5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgdGhlIHJlc3VsdCB3aWxsIGJlIGRvdWJsZS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoZ2V0RG91YmxlKHZhbHVlKSAvIGdldERvdWJsZShyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IERvdWJsZS5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCB0aGUgcmVzdWx0IHdpbGwgYmUgZmxvYXQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoZ2V0RmxvYXQodmFsdWUpIC8gZ2V0RmxvYXQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBGbG9hdC5UWVBFOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpIC8gZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCB3aWxsIHJlc3VsdCBpbiBhbiBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpIC8gZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9FUVVBTFNfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCS8vIFdlIHNob3VsZCBuZXZlciBnZXQgZXh0ZW5kZWQgb3BlcmF0b3IgZm9yIHRoaXMsIGJ1dCB3ZSdsbCBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5LgotCQkJCQkJaWYgKHZhbHVlVHlwZS5pc1ByaW1pdGl2ZSgpICYmIHJpZ2h0VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCQkJLy8gUHJpbWl0aXZlcyByZXF1aXJlIG1vcmUgdGVzdGluZyB0aGFuIGp1c3QgPT0uIGJvb2xlYW4gcHJpbWl0aXZlcyAKLQkJCQkJCQlpZiAodmFsdWVUeXBlID09IEJvb2xlYW4uVFlQRSB8fCByaWdodFR5cGUgPT0gQm9vbGVhbi5UWVBFKSB7Ci0JCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGEgYm9vbGVhbiwgdGhlbiB0aGUgb3RoZXIgc2lkZSBuZWVkcyB0byBiZSBib29sZWFuIGZvciBpdCB0byBldmVuIHRyeSB0byBiZSB0cnVlLgotCQkJCQkJCQlpZiAodmFsdWVUeXBlICE9IEJvb2xlYW4uVFlQRSB8fCB2YWx1ZVR5cGUgIT0gQm9vbGVhbi5UWVBFKQotCQkJCQkJCQkJdmFsdWUgPSBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQl2YWx1ZSA9ICgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSA9PSAoKEJvb2xlYW4pIHJpZ2h0KS5ib29sZWFuVmFsdWUoKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIE5vdyBkbyBudW1iZXIgdGVzdHMgc2luY2Ugbm90IGJvb2xlYW4gcHJpbWl0aXZlLCBvbmx5IG51bWJlcnMgYXJlIGxlZnQKLQkJCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGRvdWJsZSwgY29tcGFyZSBhcyBkb3VibGUuCi0JCQkJCQkJCQl2YWx1ZSA9IChnZXREb3VibGUodmFsdWUpID09IGdldERvdWJsZShyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRmxvYXQuVFlQRSB8fCByaWdodFR5cGUgPT0gRmxvYXQuVFlQRSkgewotCQkJCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIGNvbXBhcmUgYXMgZmxvYXQuCi0JCQkJCQkJCQl2YWx1ZSA9IChnZXRGbG9hdCh2YWx1ZSkgPT0gZ2V0RmxvYXQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgY29tcGFyZSBhcyBsb25nLgotCQkJCQkJCQkJdmFsdWUgPSAoZ2V0TG9uZyh2YWx1ZSkgPT0gZ2V0TG9uZyhyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCS8vIEVsc2UgaXQgd2lsbCBjb21wYXJlIGFzIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQkJCXZhbHVlID0gKGdldEludCh2YWx1ZSkgPT0gZ2V0SW50KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUuaXNQcmltaXRpdmUoKSB8fCByaWdodFR5cGUuaXNQcmltaXRpdmUoKSkKLQkJCQkJCQl2YWx1ZSA9IEJvb2xlYW4uRkFMU0U7CS8vIENhbid0IGJlIHRydWUgaWYgb25lIHNpZGUgcHJpbSBhbmQgdGhlIG90aGVyIGlzbid0Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBKdXN0IGRvIG9iamVjdCA9PQotCQkJCQkJCXZhbHVlID0gKHZhbHVlID09IHJpZ2h0KSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZVR5cGUgPSBCb29sZWFuLlRZUEU7CS8vIFdlIGtub3cgcmVzdWx0IHdpbGwgYmUgYSBib29sZWFuLgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSKTsKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCBjb21wYXJlIHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gKGdldERvdWJsZSh2YWx1ZSkgPiBnZXREb3VibGUocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIGNvbXBhcmUgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IChnZXRGbG9hdCh2YWx1ZSkgPiBnZXRGbG9hdChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgY29tcGFyZSB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0TG9uZyh2YWx1ZSkgPiBnZXRMb25nKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGNvbXBhcmUgd2lsbCBiZSBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0SW50KHZhbHVlKSA+IGdldEludChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0KLQkJCQkJCXZhbHVlVHlwZSA9IEJvb2xlYW4uVFlQRTsJLy8gV2Uga25vdyByZXN1bHQgd2lsbCBiZSBhIGJvb2xlYW4uCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVJfRVFVQUxTX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSX0VRVUFMUyk7Ci0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fR1JFQVRFUl9FUVVBTFMpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIGNvbXBhcmUgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0RG91YmxlKHZhbHVlKSA+PSBnZXREb3VibGUocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIGNvbXBhcmUgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IChnZXRGbG9hdCh2YWx1ZSkgPj0gZ2V0RmxvYXQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIGNvbXBhcmUgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gKGdldExvbmcodmFsdWUpID49IGdldExvbmcocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgY29tcGFyZSB3aWxsIGJlIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IChnZXRJbnQodmFsdWUpID49IGdldEludChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0KLQkJCQkJCXZhbHVlVHlwZSA9IEJvb2xlYW4uVFlQRTsJLy8gV2Uga25vdyByZXN1bHQgd2lsbCBiZSBhIGJvb2xlYW4uCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0xFRlRfU0hJRlRfVkFMVUU6Ci0JCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCkKLQkJCQkJCQlicmVhazsJLy8gRG8gbm90aGluZyB3aXRoIGZpcnN0IG9wZXJhbmQKLQkJCQkJCQotCQkJCQkJdGVzdFZhbGlkQml0VHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVCk7Ci0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9MRUZUX1NISUZUKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpIDw8IGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgaXMgaW50LiAoZXZlbiB0d28gc2hvcnRzIHRvZ2V0aGVyIHByb2R1Y2UgYW4gaW50KS4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgPDwgZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW5maXhPcGVyYXRvci5JTl9MRVNTX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9MRVNTKTsKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9MRVNTKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCBjb21wYXJlIHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gKGdldERvdWJsZSh2YWx1ZSkgPCBnZXREb3VibGUocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIGNvbXBhcmUgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IChnZXRGbG9hdCh2YWx1ZSkgPCBnZXRGbG9hdChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgY29tcGFyZSB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0TG9uZyh2YWx1ZSkgPCBnZXRMb25nKHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGNvbXBhcmUgd2lsbCBiZSBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0SW50KHZhbHVlKSA8IGdldEludChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0KLQkJCQkJCXZhbHVlVHlwZSA9IEJvb2xlYW4uVFlQRTsJLy8gV2Uga25vdyByZXN1bHQgd2lsbCBiZSBhIGJvb2xlYW4uCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX0xFU1NfRVFVQUxTX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9MRVNTX0VRVUFMUyk7Ci0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fTEVTU19FUVVBTFMpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIGNvbXBhcmUgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSAoZ2V0RG91YmxlKHZhbHVlKSA8PSBnZXREb3VibGUocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIGNvbXBhcmUgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IChnZXRGbG9hdCh2YWx1ZSkgPD0gZ2V0RmxvYXQocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIGNvbXBhcmUgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gKGdldExvbmcodmFsdWUpIDw9IGdldExvbmcocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgY29tcGFyZSB3aWxsIGJlIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IChnZXRJbnQodmFsdWUpIDw9IGdldEludChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0KLQkJCQkJCXZhbHVlVHlwZSA9IEJvb2xlYW4uVFlQRTsJLy8gV2Uga25vdyByZXN1bHQgd2lsbCBiZSBhIGJvb2xlYW4uCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX01JTlVTX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUyk7Ci0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIHRoZSByZXN1bHQgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKGdldERvdWJsZSh2YWx1ZSkgLSBnZXREb3VibGUocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBEb3VibGUuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgdGhlIHJlc3VsdCB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gbmV3IEZsb2F0KGdldEZsb2F0KHZhbHVlKSAtIGdldEZsb2F0KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRmxvYXQuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSAtIGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgd2lsbCByZXN1bHQgaW4gYW4gaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSAtIGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fTk9UX0VRVUFMU19WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJLy8gV2Ugc2hvdWxkIG5ldmVyIGdldCBleHRlbmRlZCBvcGVyYXRvciBmb3IgdGhpcywgYnV0IHdlJ2xsIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkuCi0JCQkJCQlpZiAodmFsdWVUeXBlLmlzUHJpbWl0aXZlKCkgJiYgcmlnaHRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQkvLyBQcmltaXRpdmVzIHJlcXVpcmUgbW9yZSB0ZXN0aW5nIHRoYW4ganVzdCA9PS4gYm9vbGVhbiBwcmltaXRpdmVzIAotCQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gQm9vbGVhbi5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBCb29sZWFuLlRZUEUpIHsKLQkJCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgYSBib29sZWFuLCB0aGVuIHRoZSBvdGhlciBzaWRlIG5lZWRzIHRvIGJlIGJvb2xlYW4gZm9yIGl0IHRvIGV2ZW4gdHJ5IHRvIGJlIHRydWUuCi0JCQkJCQkJCWlmICh2YWx1ZVR5cGUgIT0gQm9vbGVhbi5UWVBFIHx8IHZhbHVlVHlwZSAhPSBCb29sZWFuLlRZUEUpCi0JCQkJCQkJCQl2YWx1ZSA9IEJvb2xlYW4uVFJVRTsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJdmFsdWUgPSAoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgIT0gKChCb29sZWFuKSByaWdodCkuYm9vbGVhblZhbHVlKCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBOb3cgZG8gbnVtYmVyIHRlc3RzIHNpbmNlIG5vdCBib29sZWFuIHByaW1pdGl2ZSwgb25seSBudW1iZXJzIGFyZSBsZWZ0Ci0JCQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIGNvbXBhcmUgYXMgZG91YmxlLgotCQkJCQkJCQkJdmFsdWUgPSAoZ2V0RG91YmxlKHZhbHVlKSAhPSBnZXREb3VibGUocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGZsb2F0LCBjb21wYXJlIGFzIGZsb2F0LgotCQkJCQkJCQkJdmFsdWUgPSAoZ2V0RmxvYXQodmFsdWUpICE9IGdldEZsb2F0KHJpZ2h0KSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIGNvbXBhcmUgYXMgbG9uZy4KLQkJCQkJCQkJCXZhbHVlID0gKGdldExvbmcodmFsdWUpICE9IGdldExvbmcocmlnaHQpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBFbHNlIGl0IHdpbGwgY29tcGFyZSBhcyBpbnQsIGV2ZW4gaWYgYm90aCBzaWRlcyBhcmUgc2hvcnQuCi0JCQkJCQkJCQl2YWx1ZSA9IChnZXRJbnQodmFsdWUpICE9IGdldEludChyaWdodCkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlLmlzUHJpbWl0aXZlKCkgfHwgcmlnaHRUeXBlLmlzUHJpbWl0aXZlKCkpCi0JCQkJCQkJdmFsdWUgPSBCb29sZWFuLlRSVUU7CS8vIE11c3QgYmUgdHJ1ZSBpZiBvbmUgc2lkZSBwcmltIGFuZCB0aGUgb3RoZXIgaXNuJ3QKLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIEp1c3QgZG8gb2JqZWN0ICE9Ci0JCQkJCQkJdmFsdWUgPSAodmFsdWUgIT0gcmlnaHQpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCQkJCX0KLQkJCQkJCXZhbHVlVHlwZSA9IEJvb2xlYW4uVFlQRTsJLy8gV2Uga25vdyByZXN1bHQgd2lsbCBiZSBhIGJvb2xlYW4uCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX09SX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX09SKTsKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX09SKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpIHwgZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCBpcyBpbnQuIChldmVuIHR3byBzaG9ydHMgdG9nZXRoZXIgcHJvZHVjZSBhbiBpbnQpLgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSB8IGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fUExVU19WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKSB7Ci0JCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKLQkJCQkJCQkJLy8gU3BlY2lhbC4gbGVmdCBhcmd1bWVudCBpcyBhIHN0cmluZywgc28gd2Ugd2FudCB0byBzdG9yZSBhIHN0cmluZyBidWZmZXIgaW5zdGVhZAotCQkJCQkJCQkvLyBzaW5jZSB3ZSBrbm93IHdlIHdpbGwgYmUgYXBwZW5kaW5nIHRvIGl0LiAKLQkJCQkJCQkJdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKChTdHJpbmcpIHZhbHVlKTsKLQkJCQkJCQl9CQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRQbHVzVHlwZSh2YWx1ZVR5cGUsIHJpZ2h0VHlwZSk7Ci0JCQkJCQlpZiAodmFsdWVUeXBlID09IFN0cmluZy5jbGFzcyB8fCByaWdodFR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7Ci0JCQkJCQkJLy8gU3BlY2lhbCB3ZSBoYXZlIGEgc3RyaW5nIG9uIG9uZSBzaWRlLiBOZWVkIHRvIGRvIGl0IGFzIHN0cmluZ3MgaW5zdGVhZC4KLQkJCQkJCQkvLyBXZSBhcmUgZ29pbmcgdG8gYmUgdHJpY2t5IGluIHRoYXQgd2Ugd2lsbCBzdG9yZSBhIFN0cmluZ0J1ZmZlciBvbiB0aGUgc3RhY2sgKGlmIG5vdCBsYXN0IG9wZXJhbmQpCi0JCQkJCQkJLy8gYnV0IGNhbGwgaXQgYSBzdHJpbmcuCi0JCQkJCQkJU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKLQkJCQkJCQlpZiAodmFsdWVUeXBlID09IFN0cmluZy5jbGFzcykgewotCQkJCQkJCQlzYiA9IChTdHJpbmdCdWZmZXIpIHZhbHVlOwkvLyBXZSBrbm93IHRoYXQgaWYgdGhlIHZhbHVlIChsZWZ0KSBpcyBzdHJpbmcgdHlwZSwgd2UndmUgYWxyZWFkeSBjb252ZXJ0ZWQgaXQgdG8gYnVmZmVyLgotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIFRoZSByaWdodCBpcyB0aGUgb25lIHRoYXQgaW50cm9kdWNlcyB0aGUgc3RyaW5nLCBzbyB3ZSBjaGFuZ2UgdGhlIHZhbHVlIG92ZXIgdG8gYSBzdHJpbmcgYnVmZmVyLgotCQkJCQkJCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKChTdHJpbmcpIHJpZ2h0KS5sZW5ndGgoKSsxNik7CS8vIFdlIGNhbid0IHB1dCB0aGUgdmFsdWUgaW4geWV0LCBuZWVkIHRvIGdldCBsZWZ0IGludG8gaXQuCi0JCQkJCQkJCWFwcGVuZFRvQnVmZmVyKHNiLCB2YWx1ZSwgdmFsdWVUeXBlKTsJLy8gUHV0IHRoZSBsZWZ0IHZhbHVlIGluIG5vdwotCQkJCQkJCQl2YWx1ZSA9IHNiOwotCQkJCQkJCQl2YWx1ZVR5cGUgPSBTdHJpbmcuY2xhc3M7CS8vIE1ha2UgaXQgYSBzdHJpbmcgY2xhc3MKLQkJCQkJCQl9Ci0JCQkJCQkJYXBwZW5kVG9CdWZmZXIoc2IsIHJpZ2h0LCByaWdodFR5cGUpOwotCQkJCQkJCS8vIE5vdyBpZiB3ZSBhcmUgdGhlIGxhc3Qgb3BlcmFuZCwgd2Ugc2hvdWxkIGdldCByaWQgb2YgdGhlIGJ1ZmZlciBhbmQgcHV0IGEgdHJ1ZSBzdHJpbmcgYmFjayBpbi4KLQkJCQkJCQlpZiAob3BlcmFuZFR5cGUgPT0gSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xBU1RfT1BFUkFORCkKLQkJCQkJCQkJdmFsdWUgPSBzYi50b1N0cmluZygpOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gRG91YmxlLlRZUEUgfHwgcmlnaHRUeXBlID09IERvdWJsZS5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZG91YmxlLCB0aGUgcmVzdWx0IHdpbGwgYmUgZG91YmxlLgotCQkJCQkJCXZhbHVlID0gbmV3IERvdWJsZShnZXREb3VibGUodmFsdWUpICsgZ2V0RG91YmxlKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRG91YmxlLlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBGbG9hdC5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBGbG9hdC5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgZmxvYXQsIHRoZSByZXN1bHQgd2lsbCBiZSBmbG9hdC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdChnZXRGbG9hdCh2YWx1ZSkgKyBnZXRGbG9hdChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEZsb2F0LlRZUEU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgKyBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IHdpbGwgcmVzdWx0IGluIGFuIGludCwgZXZlbiBpZiBib3RoIHNpZGVzIGFyZSBzaG9ydC4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKGdldEludCh2YWx1ZSkgKyBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX1JFTUFJTkRFUl9WQUxVRToKLQkJCQkJCWlmIChvcGVyYW5kVHlwZSA9PSBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfTEVGVF9PUEVSQU5EKQotCQkJCQkJCWJyZWFrOwkvLyBEbyBub3RoaW5nIHdpdGggZmlyc3Qgb3BlcmFuZAotCQkJCQkJCi0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZSh2YWx1ZVR5cGUsIEluZml4T3BlcmF0b3IuSU5fUkVNQUlOREVSKTsKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVIpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIHRoZSByZXN1bHQgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKGdldERvdWJsZSh2YWx1ZSkgJSBnZXREb3VibGUocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBEb3VibGUuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgdGhlIHJlc3VsdCB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gbmV3IEZsb2F0KGdldEZsb2F0KHZhbHVlKSAlIGdldEZsb2F0KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRmxvYXQuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSAlIGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgd2lsbCByZXN1bHQgaW4gYW4gaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSAlIGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVEX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1NJR05FRCk7Ci0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9TSUdORUQpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgPj4gZ2V0TG9uZyhyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IExvbmcuVFlQRTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRWxzZSBpdCBpcyBpbnQuIChldmVuIHR3byBzaG9ydHMgdG9nZXRoZXIgcHJvZHVjZSBhbiBpbnQpLgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSA+PiBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1VOU0lHTkVEX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1VOU0lHTkVEKTsKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUocmlnaHRUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1VOU0lHTkVEKTsKLQkJCQkJCWlmICh2YWx1ZVR5cGUgPT0gTG9uZy5UWVBFIHx8IHJpZ2h0VHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBsb25nLCB0aGUgcmVzdWx0IHdpbGwgYmUgbG9uZy4KLQkJCQkJCQl2YWx1ZSA9IG5ldyBMb25nKGdldExvbmcodmFsdWUpID4+PiBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IGlzIGludC4gKGV2ZW4gdHdvIHNob3J0cyB0b2dldGhlciBwcm9kdWNlIGFuIGludCkuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpID4+PiBnZXRJbnQocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBJbnRlZ2VyLlRZUEU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbmZpeE9wZXJhdG9yLklOX1RJTUVTX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHZhbHVlVHlwZSwgSW5maXhPcGVyYXRvci5JTl9USU1FUyk7Ci0JCQkJCQl0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShyaWdodFR5cGUsIEluZml4T3BlcmF0b3IuSU5fVElNRVMpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBEb3VibGUuVFlQRSB8fCByaWdodFR5cGUgPT0gRG91YmxlLlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBkb3VibGUsIHRoZSByZXN1bHQgd2lsbCBiZSBkb3VibGUuCi0JCQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKGdldERvdWJsZSh2YWx1ZSkgKiBnZXREb3VibGUocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBEb3VibGUuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IEZsb2F0LlRZUEUgfHwgcmlnaHRUeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJCQkJCQkvLyBJZiBlaXRoZXIgc2lkZSBpcyBmbG9hdCwgdGhlIHJlc3VsdCB3aWxsIGJlIGZsb2F0LgotCQkJCQkJCXZhbHVlID0gbmV3IEZsb2F0KGdldEZsb2F0KHZhbHVlKSAqIGdldEZsb2F0KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gRmxvYXQuVFlQRTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IExvbmcuVFlQRSB8fCByaWdodFR5cGUgPT0gTG9uZy5UWVBFKSB7Ci0JCQkJCQkJLy8gSWYgZWl0aGVyIHNpZGUgaXMgbG9uZywgdGhlIHJlc3VsdCB3aWxsIGJlIGxvbmcuCi0JCQkJCQkJdmFsdWUgPSBuZXcgTG9uZyhnZXRMb25nKHZhbHVlKSAqIGdldExvbmcocmlnaHQpKTsKLQkJCQkJCQl2YWx1ZVR5cGUgPSBMb25nLlRZUEU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEVsc2UgaXQgd2lsbCByZXN1bHQgaW4gYW4gaW50LCBldmVuIGlmIGJvdGggc2lkZXMgYXJlIHNob3J0LgotCQkJCQkJCXZhbHVlID0gbmV3IEludGVnZXIoZ2V0SW50KHZhbHVlKSAqIGdldEludChyaWdodCkpOwotCQkJCQkJCXZhbHVlVHlwZSA9IEludGVnZXIuVFlQRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEluZml4T3BlcmF0b3IuSU5fWE9SX1ZBTFVFOgotCQkJCQkJaWYgKG9wZXJhbmRUeXBlID09IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MRUZUX09QRVJBTkQpCi0JCQkJCQkJYnJlYWs7CS8vIERvIG5vdGhpbmcgd2l0aCBmaXJzdCBvcGVyYW5kCi0JCQkJCQkKLQkJCQkJCXRlc3RWYWxpZEJpdFR5cGUodmFsdWVUeXBlLCBJbmZpeE9wZXJhdG9yLklOX1hPUik7Ci0JCQkJCQl0ZXN0VmFsaWRCaXRUeXBlKHJpZ2h0VHlwZSwgSW5maXhPcGVyYXRvci5JTl9YT1IpOwotCQkJCQkJaWYgKHZhbHVlVHlwZSA9PSBMb25nLlRZUEUgfHwgcmlnaHRUeXBlID09IExvbmcuVFlQRSkgewotCQkJCQkJCS8vIElmIGVpdGhlciBzaWRlIGlzIGxvbmcsIHRoZSByZXN1bHQgd2lsbCBiZSBsb25nLgotCQkJCQkJCXZhbHVlID0gbmV3IExvbmcoZ2V0TG9uZyh2YWx1ZSkgXiBnZXRMb25nKHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gTG9uZy5UWVBFOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFbHNlIGl0IGlzIGludC4gKGV2ZW4gdHdvIHNob3J0cyB0b2dldGhlciBwcm9kdWNlIGFuIGludCkuCi0JCQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcihnZXRJbnQodmFsdWUpIF4gZ2V0SW50KHJpZ2h0KSk7Ci0JCQkJCQkJdmFsdWVUeXBlID0gSW50ZWdlci5UWVBFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gCi0JCQkJCi0JCQkJaWYgKHRyYWNlT24pCi0JCQkJCXByaW50T2JqZWN0QW5kVHlwZSh2YWx1ZSwgdmFsdWVUeXBlKTsKLQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKHZhbHVlLCB2YWx1ZVR5cGUpOwkvLyBQdXNoIHRoZSByZXN1bHQgYmFjayBvbiB0aGUgc3RhY2suCi0JCi0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQkJCQotCX0KLQotCS8qKgotCSAqIFN0YXJ0IGlnbm9yaW5nIHJlc3Qgb2YgdGhlIGN1cnJlbnQgaW5maXggZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RhcnRJbmZpeElnbm9yZSgpIHsKLQkJaWdub3JlRXhwcmVzc2lvbiA9IElORklYX0lHTk9SRTsKLQkJaW5maXhJZ25vcmVOZXN0Q291bnQgPSBpbmZpeE5lc3Rpbmc7CS8vIElnbm9yZSB1bnRpbCB3ZSBnZXQgYmFjayB0byB0aGUgY3VycmVudCBuZXN0aW5nLgotCi0JfQotCi0JLyoqCi0JICogR2V0IGludCB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgYmVhbiBwYXNzZWQgaW4gKG11c3QgYmUgZWl0aGVyIGEgPGNvZGU+TnVtYmVyL2NvZGU+IG9yIDxjb2RlPkNoYXJhY3RlcjwvY29kZT4uCi0JICogQW55dGhpbmcgZWxzZSB3aWxsIGNhdXNlIGEgY2xhc3MgY2FzdCBlcnJvci4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgZXhwcmVzc2lvbiBwcm9jZXNzZXIgdG8gZ2V0IHRoZSBpbnQgdmFsdWUgb2YgdGhlIG9iamVjdC4gU2luY2UgaXQgaXMgYSBoZWxwZXIgbWV0aG9kIGl0IGRvZXNuJ3QKLQkgKiBjaGVjayBub3IgcHJvY2VzcyB0aGUgZXhjZXB0aW9uLiBJdCB0aHJvd3MgaXQuIENhbGxlcnMgbXVzdCBoYW5kbGUgaXQgYXMgdGhleSBzZWUgZml0LgotCSAqIEBwYXJhbSBiZWFuCi0JICogQHJldHVybiB0aGUgaW50IHZhbHVlIG9mIHRoZSBudW1iZXIvY2hhcmFjdGVyCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEludChPYmplY3QgYmVhbikgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoYmVhbiBpbnN0YW5jZW9mIE51bWJlcikgPyAoKE51bWJlcikgYmVhbikuaW50VmFsdWUoKSA6ICgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGZsb2F0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciBiZWFuIHBhc3NlZCBpbiAobXVzdCBiZSBlaXRoZXIgYSA8Y29kZT5OdW1iZXIvY29kZT4gb3IgPGNvZGU+Q2hhcmFjdGVyPC9jb2RlPi4KLQkgKiBBbnl0aGluZyBlbHNlIHdpbGwgY2F1c2UgYSBjbGFzcyBjYXN0IGVycm9yLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBleHByZXNzaW9uIHByb2Nlc3NlciB0byBnZXQgdGhlIGZsb2F0IHZhbHVlIG9mIHRoZSBvYmplY3QuIFNpbmNlIGl0IGlzIGEgaGVscGVyIG1ldGhvZCBpdCBkb2Vzbid0Ci0JICogY2hlY2sgbm9yIHByb2Nlc3MgdGhlIGV4Y2VwdGlvbi4gSXQgdGhyb3dzIGl0LiBDYWxsZXJzIG11c3QgaGFuZGxlIGl0IGFzIHRoZXkgc2VlIGZpdC4KLQkgKiBAcGFyYW0gYmVhbiAKLQkgKiBAcmV0dXJuIGZsb2F0IHZhbHVlIG9mIHRoZSBOdW1iZXIvY2hhcmFjdGVyCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgZmxvYXQgZ2V0RmxvYXQoT2JqZWN0IGJlYW4pIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gewotCQlyZXR1cm4gKGJlYW4gaW5zdGFuY2VvZiBOdW1iZXIpID8gKChOdW1iZXIpIGJlYW4pLmZsb2F0VmFsdWUoKSA6ICgoQ2hhcmFjdGVyKSBiZWFuKS5jaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZG91YmxlIHZhbHVlIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciBiZWFuIHBhc3NlZCBpbiAobXVzdCBiZSBlaXRoZXIgYSA8Y29kZT5OdW1iZXIvY29kZT4gb3IgPGNvZGU+Q2hhcmFjdGVyPC9jb2RlPi4KLQkgKiBBbnl0aGluZyBlbHNlIHdpbGwgY2F1c2UgYSBjbGFzcyBjYXN0IGVycm9yLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBleHByZXNzaW9uIHByb2Nlc3NlciB0byBnZXQgdGhlIGZsb2F0IHZhbHVlIG9mIHRoZSBvYmplY3QuIFNpbmNlIGl0IGlzIGEgaGVscGVyIG1ldGhvZCBpdCBkb2Vzbid0Ci0JICogY2hlY2sgbm9yIHByb2Nlc3MgdGhlIGV4Y2VwdGlvbi4gSXQgdGhyb3dzIGl0LiBDYWxsZXJzIG11c3QgaGFuZGxlIGl0IGFzIHRoZXkgc2VlIGZpdC4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEByZXR1cm4gZG91YmxlIHZhbHVlIG9mIHRoZSBOdW1iZXIvQ2hhcmFjdGVyLgotCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IGJlYW4pIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gewotCQlyZXR1cm4gKGJlYW4gaW5zdGFuY2VvZiBOdW1iZXIpID8gKChOdW1iZXIpIGJlYW4pLmRvdWJsZVZhbHVlKCkgOiAoKENoYXJhY3RlcikgYmVhbikuY2hhclZhbHVlKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBsb25nIHZhbHVlIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciBiZWFuIHBhc3NlZCBpbiAobXVzdCBiZSBlaXRoZXIgYSA8Y29kZT5OdW1iZXIvY29kZT4gb3IgPGNvZGU+Q2hhcmFjdGVyPC9jb2RlPi4KLQkgKiBBbnl0aGluZyBlbHNlIHdpbGwgY2F1c2UgYSBjbGFzcyBjYXN0IGVycm9yLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciBleHByZXNzaW9uIHByb2Nlc3NlciB0byBnZXQgdGhlIGZsb2F0IHZhbHVlIG9mIHRoZSBvYmplY3QuIFNpbmNlIGl0IGlzIGEgaGVscGVyIG1ldGhvZCBpdCBkb2Vzbid0Ci0JICogY2hlY2sgbm9yIHByb2Nlc3MgdGhlIGV4Y2VwdGlvbi4gSXQgdGhyb3dzIGl0LiBDYWxsZXJzIG11c3QgaGFuZGxlIGl0IGFzIHRoZXkgc2VlIGZpdC4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBsb25nIGdldExvbmcoT2JqZWN0IGJlYW4pIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gewotCQlyZXR1cm4gKGJlYW4gaW5zdGFuY2VvZiBOdW1iZXIpID8gKChOdW1iZXIpIGJlYW4pLmxvbmdWYWx1ZSgpIDogKChDaGFyYWN0ZXIpIGJlYW4pLmNoYXJWYWx1ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGhyb3dJbnZhbGlkSW5maXgoSW5maXhPcGVyYXRvciBvcGVyYXRvciwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5JbnZhbGlkT3BlcmFuZE9mT3BlcmF0b3JfRVhDXyIpLCBuZXcgT2JqZWN0W10ge3ZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbCwgb3BlcmF0b3IudG9TdHJpbmcoKX0pKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGVzdFZhbGlkQml0VHlwZShDbGFzcyB0eXBlLCBJbmZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCWlmICghdHlwZS5pc1ByaW1pdGl2ZSgpIHx8IHR5cGUgPT0gQm9vbGVhbi5UWVBFIHx8IHR5cGUgPT0gRG91YmxlLlRZUEV8fCB0eXBlID09IEZsb2F0LlRZUEUpCi0JCQl0aHJvd0ludmFsaWRJbmZpeChvcGVyYXRvciwgdHlwZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0ZXN0VmFsaWRBcml0aG1ldGljVHlwZShDbGFzcyB0eXBlLCBJbmZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCWlmICghdHlwZS5pc1ByaW1pdGl2ZSgpIHx8IHR5cGUgPT0gQm9vbGVhbi5UWVBFKQotCQkJdGhyb3dJbnZhbGlkSW5maXgob3BlcmF0b3IsIHR5cGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0VmFsaWRQbHVzVHlwZShDbGFzcyBsZWZ0LCBDbGFzcyByaWdodCkgewotCQkvLyBQbHVzIGlzIHNwZWNpYWwgaW4gdGhhdCBzdHJpbmcgb2JqZWN0cyBhcmUgYWxzbyB2YWxpZC4KLQkJaWYgKGxlZnQgPT0gU3RyaW5nLmNsYXNzIHx8IHJpZ2h0ID09IFN0cmluZy5jbGFzcykKLQkJCXJldHVybjsJLy8gQXMgbG9uZyBhcyBvbmUgc2lkZSBpcyBzdHJpbmcuIEFueXRoaW5nIGlzIHZhbGlkLgotCQkvLyBJZiBuZWl0aGVyIGlzIHN0cmluZywgdGhlbiBzdGFuZGFyZCBhcml0aG1ldGljIHRlc3QuCi0JCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKGxlZnQsIEluZml4T3BlcmF0b3IuSU5fUExVUyk7Ci0JCXRlc3RWYWxpZEFyaXRobWV0aWNUeXBlKHJpZ2h0LCBJbmZpeE9wZXJhdG9yLklOX1BMVVMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nQnVmZmVyIHNiLCBPYmplY3QgdmFsdWUsIENsYXNzIHZhbHVlVHlwZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXNiLmFwcGVuZCgoT2JqZWN0KW51bGwpOwotCQllbHNlIGlmICh2YWx1ZVR5cGUgPT0gU3RyaW5nLmNsYXNzKQotCQkJc2IuYXBwZW5kKChTdHJpbmcpIHZhbHVlKTsKLQkJZWxzZSBpZiAodmFsdWVUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXN3aXRjaCAoZ2V0RW51bUZvclByaW1pdGl2ZSh2YWx1ZVR5cGUpKSB7Ci0JCQkJY2FzZSBCT09MRUFOOgotCQkJCQlzYi5hcHBlbmQoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJZVEU6Ci0JCQkJCXNiLmFwcGVuZCgoKE51bWJlcikgdmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDSEFSOgotCQkJCQlzYi5hcHBlbmQoKChDaGFyYWN0ZXIpIHZhbHVlKS5jaGFyVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRE9VQkxFOgotCQkJCQlzYi5hcHBlbmQoKChOdW1iZXIpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBGTE9BVDoKLQkJCQkJc2IuYXBwZW5kKCgoTnVtYmVyKSB2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTlQ6Ci0JCQkJCXNiLmFwcGVuZCgoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExPTkc6Ci0JCQkJCXNiLmFwcGVuZCgoKE51bWJlcikgdmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTSE9SVDoKLQkJCQkJc2IuYXBwZW5kKCgoTnVtYmVyKSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7CQkKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIEp1c3QgYW4gb2JqZWN0LgotCQkJc2IuYXBwZW5kKHZhbHVlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBhcnJheSBhY2Nlc3MgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhDb3VudCBOdW1iZXIgb2YgZGltZW5zaW9ucyBiZWluZyBhY2Nlc3NlZAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hBcnJheUFjY2VzcyhpbnQgaW5kZXhDb3VudCkgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCQotCQlpZiAodHJhY2VPbikgewotCQkJcHJpbnRUcmFjZSgiQXJyYXkgQWNjZXNzWyIraW5kZXhDb3VudCsnXScsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJLy8gV2UgbmVlZCB0byBwb3Agb2ZmIHRoZSBhcmdzLiBUaGUgdG9wbW9zdCB3aWxsIGJlIHRoZSByaWdodG1vc3QgaW5kZXgsIGFuZCB0aGUgYm90dG9tIG1vc3Qgd2lsbCBiZSB0aGUgYXJyYXkgaXRzZWxmLgotCQkJCWludFtdIGFyZ3VtZW50cyA9IG5ldyBpbnRbaW5kZXhDb3VudF07Ci0JCQkJLy8gRmlsbCB0aGUgYXJnIGFycmF5IGluIHJldmVyc2Ugb3JkZXIuCi0JCQkJZm9yKGludCBpPWluZGV4Q291bnQtMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJT2JqZWN0IGluZGV4ID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQlDbGFzcyBpbmRleFR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJCWlmIChpbmRleFR5cGUuaXNQcmltaXRpdmUoKSAmJiAoaW5kZXhUeXBlID09IEludGVnZXIuVFlQRSB8fCBpbmRleFR5cGUgPT0gU2hvcnQuVFlQRSB8fCBpbmRleFR5cGUgPT0gQ2hhcmFjdGVyLlRZUEUgfHwgaW5kZXhUeXBlID09IEJ5dGUuVFlQRSkpIHsKLQkJCQkJCWFyZ3VtZW50c1tpXSA9IGdldEludChpbmRleCk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJdGhyb3dDbGFzc0Nhc3QoSW50ZWdlci5UWVBFLCBpbmRleCk7Ci0JCQkJfQotCQkJCQotCQkJCU9iamVjdCBhcnJheSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQlDbGFzcyBhcnJheVR5cGUgPSBwb3BFeHByZXNzaW9uVHlwZShmYWxzZSk7Ci0JCQkJaWYgKGFycmF5VHlwZS5pc0FycmF5KCkpIHsKLQkJCQkJLy8gRmlyc3QgZmlndXJlIG91dCBob3cgbWFueSBkaW1lbnNpb25zIGFyZSBhdmFpbGFibGUuIFN0b3Agd2hlbiB3ZSBoaXQgaW5kZXhjb3VudCBiZWNhdXNlIHdlIHdvbid0IGJlIGdvaW5nIGZ1cnRoZXIuCi0JCQkJCWludCBkaW1jb3VudCA9IDA7Ci0JCQkJCUNsYXNzW10gY29tcG9uZW50VHlwZXMgPSBuZXcgQ2xhc3NbaW5kZXhDb3VudF07CS8vIAotCQkJCQlDbGFzcyBjb21wb25lbnRUeXBlID0gYXJyYXlUeXBlOwotCQkJCQl3aGlsZSAoZGltY291bnQgPCBpbmRleENvdW50ICYmIGNvbXBvbmVudFR5cGUuaXNBcnJheSgpKSB7Ci0JCQkJCQljb21wb25lbnRUeXBlc1tkaW1jb3VudCsrXSA9IGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKGRpbWNvdW50IDwgaW5kZXhDb3VudCkKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuWElzR3JlYXRlclRoYW5OdW1iZXJPZkRpbWVuc2lvbnNJbkFycmF5X0VYQ18iKSwgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbmRleENvdW50KSwgbmV3IEludGVnZXIoZGltY291bnQpfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCQkvLyBOb3cgc3RhcnQgYWNjZXNzaW5nIG9uZSBpbmRleCBhdCBhIHRpbWUsIHN0b3AganVzdCBiZWZvcmUgdGhlIGxhc3Qgb25lLiBUaGUgbGFzdCBvbmUgd2lsbCBiZSB0dXJuZWQgaW50byBhbiBBcnJheUFjY2Vzc1JlZmVyZW5jZS4KLQkJCQkJT2JqZWN0IHZhbHVlID0gYXJyYXk7CS8vIEZpbmFsIHZhbHVlLCBzdGFydCB3aXRoIGZ1bGwgYXJyYXkuCi0JCQkJCWludCBwdWxsQ291bnQgPSBpbmRleENvdW50LTE7Ci0JCQkJCWZvcihpbnQgaT0wOyBpPHB1bGxDb3VudDsgaSsrKSB7Ci0JCQkJCQl2YWx1ZSA9IEFycmF5LmdldCh2YWx1ZSwgYXJndW1lbnRzW2ldKTsKLQkJCQkJfQotCQkJCQlBcnJheUFjY2Vzc1JlZmVyZW5jZSBhcnJheVZhbHVlID0gQXJyYXlBY2Nlc3NSZWZlcmVuY2UuY3JlYXRlQXJyYXlBY2Nlc3NSZWZlcmVuY2UodmFsdWUsIGFyZ3VtZW50c1twdWxsQ291bnRdKTsKLQkJCQkJaWYgKHRyYWNlT24pCi0JCQkJCQlwcmludE9iamVjdEFuZFR5cGUoYXJyYXlWYWx1ZSwgY29tcG9uZW50VHlwZXNbcHVsbENvdW50XSk7Ci0JCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUoYXJyYXlWYWx1ZSwgY29tcG9uZW50VHlwZXNbcHVsbENvdW50XSk7Ci0JCQkJfSAgZWxzZQotCQkJCQkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5Ob3RBbkFycmF5X0VYQ18iKSwgbmV3IE9iamVjdFtdIHthcnJheVR5cGV9KSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBhcnJheSBjcmVhdGlvbiByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBhcnJheVR5cGUgVGhlIHR5cGUgb2YgdGhlIGFycmF5Ci0JICogQHBhcmFtIGRpbWVuc2lvbkNvdW50IFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBiZWluZyBpbml0aWFsaXplZC4gWmVybyBpZiB1c2luZyBhbiBpbml0aWFsaXplci4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQXJyYXlDcmVhdGlvbihDbGFzcyBhcnJheVR5cGUsIGludCBkaW1lbnNpb25Db3VudCkgewotCQlib29sZWFuIGlnbm9yZSA9IChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCk7Ci0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiQXJyYXkgQ3JlYXRpb246ICIrYXJyYXlUeXBlLmdldE5hbWUoKSsnWycrZGltZW5zaW9uQ291bnQrJ10nLCBpZ25vcmUpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0cnkgewotCQkJaWYgKGlnbm9yZSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJaWYgKGRpbWVuc2lvbkNvdW50ID09IDApIHsKLQkJCQkJLy8gVGhlIHRvcCB2YWx1ZSBpcyB0aGUgYXJyYXkgaXRzZWxmLCBmcm9tIHRoZSBhcnJheSBpbml0aWFsaXplci4KLQkJCQkJLy8gU28gd2UgZG8gbm90aGluZy4KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBTdHJpcCBvZmYgZGltZW5zaW9uQ291bnRzIGZyb20gdGhlIGFycmF5IHR5cGUsIGUuZy4KLQkJCQkJLy8gQXJyYXlUeXBlIGlzIGludFtdW11bXQotCQkJCQkvLyBEaW1lbnNpb25jb3VudCBpcyAyCi0JCQkJCS8vIFRoZW4gd2UgbmVlZCB0byBzdHJpcCB0d28gY29tcG9uZW50dHlwZXMgb2ZmIG9mIHRoZSBhcnJheSB0eXBlCi0JCQkJCS8vIHdpbmQgdXAgd2l0aCBpbnRbXQotCQkJCQkvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEFycmF5Lm5ldyB3aWxsIGFkZCB0aG9zZSBkaW1lbnNpb25zIGJhY2sKLQkJCQkJLy8gb24gdGhyb3VnaCB0aGUgZGltZW5zaW9uIGNvdW50LgotCQkJCQlDbGFzcyBjb21wb25lbnRUeXBlID0gYXJyYXlUeXBlOwotCQkJCQlmb3IoaW50IGk9MDsgaSA8IGRpbWVuc2lvbkNvdW50ICYmIGNvbXBvbmVudFR5cGUgIT0gbnVsbDsgaSsrKQotCQkJCQkJY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCQlpZiAoY29tcG9uZW50VHlwZSA9PSBudWxsKQotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5BcnJheXR5cGVIYXNGZXdlckRpbWVuc2lvbnNUaGFuUmVxdWVzdGVkX0VYQ18iKSwgbmV3IE9iamVjdFtdIHthcnJheVR5cGUsIG5ldyBJbnRlZ2VyKGRpbWVuc2lvbkNvdW50KX0pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQkJLy8gV2UgbmVlZCB0byBwdWxsIGluIHRoZSBkaW1lbnNpb24gaW5pdGlhbGl6ZXJzLiBUaGV5IGFyZSBzdGFja2VkIGluIHJldmVyc2Ugb3JkZXIuCi0JCQkJCWludFtdIGRpbUluaXQgPSBuZXcgaW50W2RpbWVuc2lvbkNvdW50XTsKLQkJCQkJZm9yKGludCBpPWRpbWVuc2lvbkNvdW50LTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCQlPYmplY3QgaW5kZXggPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJCQlDbGFzcyBkaW1UeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCQkJaWYgKGRpbVR5cGUuaXNQcmltaXRpdmUoKSAmJiAoZGltVHlwZSA9PSBJbnRlZ2VyLlRZUEUgfHwgZGltVHlwZSA9PSBTaG9ydC5UWVBFIHx8IGRpbVR5cGUgPT0gQ2hhcmFjdGVyLlRZUEUgfHwgZGltVHlwZSA9PSBCeXRlLlRZUEUpKSB7Ci0JCQkJCQkJZGltSW5pdFtpXSA9IGdldEludChpbmRleCk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChJbnRlZ2VyLlRZUEUsIGluZGV4KTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gRmluYWxseSBjcmVhdGUgdGhlIGFycmF5LgotCQkJCQlPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBkaW1Jbml0KTsKLQkJCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShhcnJheSwgYXJyYXlUeXBlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0KLQkJCQotCX0KLQotCS8qKgotCSAqIFB1c2ggdGhlIGFycmF5IGluaXRpYWxpemVyIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIGFycmF5VHlwZSBUaGUgb3JpZ2luYWwgdHlwZSBvZiB0aGUgYXJyYXkgdG8gY3JlYXRlLgotCSAqIEBwYXJhbSBzdHJpcENvdW50IHRoZSBjb3VudCBvZiBob3cgbWFueSBkaW1lbnNpb25zIHRvIHN0cmlwIHRvIGdldCB0aGUgdHlwZSBuZWVkZWQgZm9yIHRoaXMgaW5pdGlhbGl6ZXIuCi0JICogQHBhcmFtIGV4cHJlc3Npb25Db3VudAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hBcnJheUluaXRpYWxpemVyKENsYXNzIGFycmF5VHlwZSwgaW50IHN0cmlwQ291bnQsIGludCBleHByZXNzaW9uQ291bnQpIHsKLQkJYm9vbGVhbiBpZ25vcmUgPSAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpOwotCQkKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJJbml0aWFsaXplIEFycmF5OiAiK2FycmF5VHlwZS5nZXROYW1lKCkrJ3snK2V4cHJlc3Npb25Db3VudCsnfScsIGlnbm9yZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkKLQkJCXRyeSB7Ci0JCQkJaWYgKCFhcnJheVR5cGUuaXNBcnJheSgpKSB7Ci0JCQkJCS8vIEl0IGlzIG5vdCBhbiBhcnJheSB0eXBlLgotCQkJCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLkNhbm5vdENhc3RYVG9ZX0VYQ18iKSwgbmV3IE9iamVjdFtdIHthcnJheVR5cGUsICJhcnJheSJ9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0gCi0JCQkJLy8gU3RyaXAgb2ZmIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQuCi0JCQkJd2hpbGUoc3RyaXBDb3VudC0tPjApIHsKLQkJCQkJYXJyYXlUeXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJT2JqZWN0W10gZGltVmFsdWVzID0gbnVsbDsKLQkJCQlpZiAoZXhwcmVzc2lvbkNvdW50ID4gMCkgewotCQkJCQkvLyBXZSBuZWVkIHRvIHB1bGwgaW4gdGhlIGluaXRpYWxpemVycy4gVGhleSBhcmUgc3RhY2tlZCBpbiByZXZlcnNlIG9yZGVyLgotCQkJCQlkaW1WYWx1ZXMgPSBuZXcgT2JqZWN0W2V4cHJlc3Npb25Db3VudF07Ci0JCQkJCWZvciAoaW50IGkgPSBleHByZXNzaW9uQ291bnQgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJT2JqZWN0IGRpbVZhbHVlID0gZGltVmFsdWVzW2ldID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQkJQ2xhc3MgZGltVHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQkJCWlmIChhcnJheVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJCQkJCWlmIChkaW1WYWx1ZSA9PSBudWxsIHx8ICFkaW1UeXBlLmlzUHJpbWl0aXZlKCkpCi0JCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQkJLy8gQSBsaXR0bGUgdHJpY2tpZXIuIENhbiBhc3NpZ24gc2hvcnQgdG8gYW4gaW50LCBidXQgY2FuJ3QgYXNzaWduIGxvbmcgdG8gYW4gaW50LiBXaWRlbmluZyBpcyBwZXJtaXR0ZWQuCi0JCQkJCQkJaWYgKGFycmF5VHlwZSAhPSBkaW1UeXBlKSB7Ci0JCQkJCQkJCWludCBjb21wRW51bSA9IGdldEVudW1Gb3JQcmltaXRpdmUoYXJyYXlUeXBlKTsKLQkJCQkJCQkJaW50IGRpbUVudW0gPSBnZXRFbnVtRm9yUHJpbWl0aXZlKGRpbVR5cGUpOwotCQkJCQkJCQlpZiAoY29tcEVudW0gPT0gQk9PTEVBTiB8fCBkaW1FbnVtID09IEJPT0xFQU4pCi0JCQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJCQlpbnQgZGltVmFsdWVBc0ludCA9IGdldEludChkaW1WYWx1ZSk7Ci0JCQkJCQkJCXN3aXRjaCAoY29tcEVudW0pIHsKLQkJCQkJCQkJCWNhc2UgQllURSA6Ci0JCQkJCQkJCQkJLy8gQ2FuIGFjY2VwdCBieXRlLCBzaG9ydCwgY2hhciwgb3IgaW50IGFzIGxvbmcgYXMgdmFsdWUgaXMgPD0gYnl0ZSBtYXguIENhbid0IGFjY2VwdCBsb25nLCBkb3VibGUsIGZsb2F0IGF0IGFsbC4KLQkJCQkJCQkJCQkvLyBOb3RlOiBUaGlzIGlzbid0IGFjdHVhbGx5IHRydWUuIFRoZSBtYXgvbWluIHRlc3QgaXMgb25seSB2YWxpZCBpZiB0aGUgdmFsdWUgaXMgYSBsaXRlcmFsLCBub3QgYW4gZXhwcmVzc2lvbiwKLQkJCQkJCQkJCQkvLyBob3dldmVyLCBhdCB0aGlzIHBvaW50IGluIHRpbWUgd2Ugbm8gbG9uZ2VyIGtub3cgdGhpcy4gU28gd2Ugd2lsbCBzaW1wbHkgYWxsb3cgaXQuCi0JCQkJCQkJCQkJaWYgKGRpbUVudW0gPiBJTlQgfHwgZGltVmFsdWVBc0ludCA+IEJ5dGUuTUFYX1ZBTFVFIHx8IGRpbVZhbHVlQXNJbnQgPCBCeXRlLk1JTl9WQUxVRSkKLQkJCQkJCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCQkJCQkvLyBCdXQgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBhcnJheS5zZXQgdG8gd29yay4JCQkJCQkJCQkKLQkJCQkJCQkJCQlkaW1WYWx1ZXNbaV0gPSBuZXcgQnl0ZSgoYnl0ZSlkaW1WYWx1ZUFzSW50KTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgU0hPUlQgOgkJCQkJCQkJCi0JCQkJCQkJCQkJLy8gQ2FuIGFjY2VwdCBieXRlLCBzaG9ydCwgY2hhciwgb3IgaW50IGFzIGxvbmcgYXMgdmFsdWUgaXMgPD0gYnl0ZSBtYXguIENhbid0IGFjY2VwdCBsb25nLCBkb3VibGUsIGZsb2F0IGF0IGFsbC4KLQkJCQkJCQkJCQkvLyBOb3RlOiBUaGlzIGlzbid0IGFjdHVhbGx5IHRydWUuIFRoZSBtYXgvbWluIHRlc3QgaXMgb25seSB2YWxpZCBpZiB0aGUgdmFsdWUgaXMgYSBsaXRlcmFsLCBub3QgYW4gZXhwcmVzc2lvbiwKLQkJCQkJCQkJCQkvLyBob3dldmVyLCBhdCB0aGlzIHBvaW50IGluIHRpbWUgd2Ugbm8gbG9uZ2VyIGtub3cgdGhpcy4gU28gd2Ugd2lsbCBzaW1wbHkgYWxsb3cgaXQuCi0JCQkJCQkJCQkJaWYgKGRpbUVudW0gPiBJTlQgfHwgZGltVmFsdWVBc0ludCA+IFNob3J0Lk1BWF9WQUxVRSB8fCBkaW1WYWx1ZUFzSW50IDwgU2hvcnQuTUlOX1ZBTFVFKQotCQkJCQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJCQkJCS8vIEJ1dCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIGFycmF5LnNldCB0byB3b3JrLgkJCQkJCQkJCQotCQkJCQkJCQkJCWRpbVZhbHVlc1tpXSA9IG5ldyBTaG9ydCgoc2hvcnQpZGltVmFsdWVBc0ludCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIENIQVIgOgotCQkJCQkJCQkJCS8vIENhbiBhY2NlcHQgYnl0ZSwgc2hvcnQsIGNoYXIsIG9yIGludCBhcyBsb25nIGFzIHZhbHVlIGlzIDw9IGJ5dGUgbWF4LiBDYW4ndCBhY2NlcHQgbG9uZywgZG91YmxlLCBmbG9hdCBhdCBhbGwuCi0JCQkJCQkJCQkJLy8gTm90ZTogVGhpcyBpc24ndCBhY3R1YWxseSB0cnVlLiBUaGUgbWF4L21pbiB0ZXN0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIHZhbHVlIGlzIGEgbGl0ZXJhbCwgbm90IGFuIGV4cHJlc3Npb24sCi0JCQkJCQkJCQkJLy8gaG93ZXZlciwgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHdlIG5vIGxvbmdlciBrbm93IHRoaXMuIFNvIHdlIHdpbGwgc2ltcGx5IGFsbG93IGl0LgotCQkJCQkJCQkJCWlmIChkaW1FbnVtID4gSU5UIHx8IGRpbVZhbHVlQXNJbnQgPiBDaGFyYWN0ZXIuTUFYX1ZBTFVFIHx8IGRpbVZhbHVlQXNJbnQgPCBDaGFyYWN0ZXIuTUlOX1ZBTFVFKQotCQkJCQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJCQkJCS8vIEJ1dCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIGFycmF5LnNldCB0byB3b3JrLgkJCQkJCQkJCQotCQkJCQkJCQkJCWRpbVZhbHVlc1tpXSA9IG5ldyBDaGFyYWN0ZXIoKGNoYXIpZGltVmFsdWVBc0ludCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIElOVCA6Ci0JCQkJCQkJCQkJLy8gQ2FuIGFjY2VwdCBieXRlLCBzaG9ydCwgY2hhciwgb3IgaW50LiBDYW4ndCBhY2NlcHQgbG9uZywgZG91YmxlLCBmbG9hdCBhdCBhbGwuCi0JCQkJCQkJCQkJaWYgKGRpbUVudW0gPiBJTlQpCi0JCQkJCQkJCQkJCXRocm93Q2xhc3NDYXN0KGFycmF5VHlwZSwgZGltVHlwZSk7Ci0JCQkJCQkJCQkJLy8gQnV0IG5lZWQgdG8gYmUgY2hhbmdlZCB0byBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgYXJyYXkuc2V0IHRvIHdvcmsuCQkJCQkJCQkJCi0JCQkJCQkJCQkJZGltVmFsdWVzW2ldID0gbmV3IEludGVnZXIoZGltVmFsdWVBc0ludCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIExPTkcgOgotCQkJCQkJCQkJCS8vIENhbiBhY2NlcHQgYnl0ZSwgc2hvcnQsIGNoYXIsIGludCwgb3IgbG9uZy4gQ2FuJ3QgYWNjZXB0IGRvdWJsZSwgZmxvYXQgYXQgYWxsLgotCQkJCQkJCQkJCWlmIChkaW1FbnVtID4gTE9ORykKLQkJCQkJCQkJCQkJdGhyb3dDbGFzc0Nhc3QoYXJyYXlUeXBlLCBkaW1UeXBlKTsKLQkJCQkJCQkJCQkvLyBCdXQgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBhcnJheS5zZXQgdG8gd29yay4JCQkJCQkJCQkKLQkJCQkJCQkJCQlkaW1WYWx1ZXNbaV0gPSBuZXcgTG9uZyhnZXRMb25nKGRpbVZhbHVlKSk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIEZMT0FUIDoKLQkJCQkJCQkJCQkvLyBDYW4gYWNjZXB0IGJ5dGUsIHNob3J0LCBjaGFyLCBpbnQsIGxvbmcsIG9yIGZsb2F0LiBDYW4ndCBhY2NlcHQgZG91YmxlIGF0IGFsbC4KLQkJCQkJCQkJCQlpZiAoZGltRW51bSA+IEZMT0FUKQotCQkJCQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJCQkJCS8vIEJ1dCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIGFycmF5LnNldCB0byB3b3JrLgkJCQkJCQkJCQotCQkJCQkJCQkJCWRpbVZhbHVlc1tpXSA9IG5ldyBGbG9hdChnZXRGbG9hdChkaW1WYWx1ZSkpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBET1VCTEUgOgotCQkJCQkJCQkJCS8vIEJ1dCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIGFycmF5LnNldCB0byB3b3JrLgkJCQkJCQkJCQotCQkJCQkJCQkJCWRpbVZhbHVlc1tpXSA9IG5ldyBEb3VibGUoZ2V0RG91YmxlKGRpbVZhbHVlKSk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJLy8gQ29tcGF0aWJsZSwgc28gb2suCi0JCQkJCQl9IGVsc2UgaWYgKGRpbVR5cGUgIT0gTWV0aG9kSGVscGVyLk5VTExfVFlQRSAmJiAhYXJyYXlUeXBlLmlzQXNzaWduYWJsZUZyb20oZGltVHlwZSkpIHsKLQkJCQkJCQkvLyBJZiBpdCBpcyBOVUxMX1RZUEUsIHRoZW4gdGhpcyBpcyBhIHB1c2hlZCBudWxsLiBUaGlzIGlzIGFsd2F5cyBhc3NpZ25hYmxlIHRvIGEgbm9uLXByaW1pdGl2ZS4KLQkJCQkJCQkvLyBTbyB3ZSBkb24ndCBlbnRlciBoZXJlIGluIHRoYXQgY2FzZS4gSG93ZXZlciwgYSBudWxsIHRoYXQgd2FzIHJldHVybmVkIGZyb20gc29tZSBleHByZXNzaW9uCi0JCQkJCQkJLy8gd29uJ3QgaGF2ZSBhIE5VTExfVFlQRSwgaXQgd2lsbCBpbnN0ZWFkIGhhdmUgdGhlIGV4cGVjdGVkIHJldHVybiB0eXBlLiBUaGF0IG11c3QgYmUgdXNlZAotCQkJCQkJCS8vIGluIHRoZSBhc3NpZ25tZW50IGluc3RlYWQuIFRoYXQgaXMgYmVjYXVzZSBpbiBqYXZhIGl0IHVzZXMgdGhlIGV4cGVjdGVkIHR5cGUgdG8gZGV0ZXJtaW5lCi0JCQkJCQkJLy8gY29tcGF0aWJpbGl0eSwgbm90IHRoZSBhY3R1YWwgdHlwZS4KLQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChhcnJheVR5cGUsIGRpbVR5cGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCQkKLQkJCQkvLyBOb3cgd2UgZmluYWxseSBjcmVhdGUgdGhlIGFycmF5LgotCQkJCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKGFycmF5VHlwZSwgbmV3IGludFtdIHtleHByZXNzaW9uQ291bnR9KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cHJlc3Npb25Db3VudDsgaSsrKSB7Ci0JCQkJCUFycmF5LnNldChhcnJheSwgaSwgZGltVmFsdWVzW2ldKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVzaEV4cHJlc3Npb25WYWx1ZShhcnJheSwgYXJyYXkuZ2V0Q2xhc3MoKSk7CS8vIEFkanVzdCB0byB0cnVlIGFycmF5IHR5cGUsIG5vdCB0aGUgaW5jb21pbmcgdHlwZSAod2hpY2ggaXMgb25lIGRpbWVuc2lvbiB0b28gc21hbGwpLgotCQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JCQkKLQl9Ci0KLQkvKioKLQkgKiBQdXNoIHRoZSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZgotCSAqIEBwYXJhbSBhcmd1bWVudENvdW50IFRoZSBudW1iZXIgb2YgYXJndW1lbnRzICh3aGljaCBhcmUgc3RvcmVkIG9uIHRoZSBzdGFjaykuCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKENsYXNzIHR5cGUsIGludCBhcmd1bWVudENvdW50KSB7Ci0JCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJCi0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZSgiQ3JlYXRlIENsYXNzOiAiK3R5cGUrIiAoIiwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkJCQkJCQotCQkJdHJ5IHsKLQkJCQkvLyBXZSBuZWVkIHRvIHB1bGwgaW4gdGhlIGFyZ3VtZW50cy4gVGhleSBhcmUgc3RhY2tlZCBpbiByZXZlcnNlIG9yZGVyLgotCQkJCU9iamVjdCB2YWx1ZSA9IG51bGw7CS8vIFRoZSBuZXcgaW5zdGFuY2UuCi0JCQkJaWYgKGFyZ3VtZW50Q291bnQgPiAwKSB7Ci0JCQkJCU9iamVjdFtdICBhcmdzID0gbmV3IE9iamVjdFthcmd1bWVudENvdW50XTsKLQkJCQkJQ2xhc3NbXSBhcmdUeXBlcyA9IG5ldyBDbGFzc1thcmd1bWVudENvdW50XTsKLQkJCQkJZm9yIChpbnQgaSA9IGFyZ3VtZW50Q291bnQgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJYXJnc1tpXSA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJCWFyZ1R5cGVzW2ldID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBOb3cgd2UgbmVlZCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3Rvci4KLQkJCQkJQ29uc3RydWN0b3IgY3RvcjsKLQkJCQkJY3RvciA9IE1ldGhvZEhlbHBlci5maW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yKHR5cGUsIGFyZ1R5cGVzKTsKLQkJCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoY3Rvcik7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCcpJyk7Ci0JCQkJCX0KLQkJCQkJdmFsdWUgPSBjdG9yLm5ld0luc3RhbmNlKGFyZ3MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIE5vIGFyZ3MsIGp1c3QgZG8gZGVmYXVsdCBjdG9yLgotCQkJCQlpZiAodHJhY2VPbikgewotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiRGVmYXVsdCBjdG9yKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJdmFsdWUgPSB0eXBlLm5ld0luc3RhbmNlKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUodmFsdWUsIHR5cGUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJCWlmIChlLmdldENsYXNzKCkgPT0gRXJyb3IuY2xhc3MpIHsKLQkJCQkJLy8gSWYgZXhhY3RseSBFcnJvci5jbGFzcywgdGhlbiBwcm9jZXNzIGl0LiBUaGlzIGlzIGhvcGVmdWxseSBqdXN0IGEgInVucmVzb2x2ZWQgY29tcGlsYXRpb24gZXJyb3IiLgotCQkJCQlwcm9jZXNzRXhjZXB0aW9uKG5ldyBVbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvcihlKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXRocm93IGU7CS8vIEFsbCBzdWJjbGFzc2VzIHdlIHRocm93IG9uIG91dC4KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCQkJCi0JfQotCi0JLyoqCi0JICogUHVzaCB0aGUgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24uCi0JICogQHBhcmFtIGZpZWxkIFN0cmluZyBmb3IgZmllbGRuYW1lLCBvciBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLgotCSAqIEBwYXJhbSBmaWVsZElzU3RyaW5nIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpZWxkIGlzIGEgc3RyaW5nIG5hbWUsIGFuZCBub3QgYSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC4KLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoRmllbGRBY2Nlc3MoT2JqZWN0IGZpZWxkLCBib29sZWFuIGZpZWxkSXNTdHJpbmcsIGJvb2xlYW4gaGFzUmVjZWl2ZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChpZ25vcmVFeHByZXNzaW9uICE9IG51bGwgfHwgZXJyb3JPY2N1cnJlZCkgewotCQkJCWlmICh0cmFjZU9uKQotCQkJCQlwcmludFRyYWNlKCJGaWVsZCBBY2Nlc3MiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCi0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlKCJGaWVsZCBBY2Nlc3M6ICIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQkvLyBHZXQgdGhlIHJlY2VpdmVyIG9mZiBvZiB0aGUgc3RhY2suCi0JCQkJT2JqZWN0IHJlY2VpdmVyID0gbnVsbDsKLQkJCQlDbGFzcyByZWNlaXZlclR5cGUgPSBudWxsOwotCQkJCWlmIChoYXNSZWNlaXZlcikgewotCQkJCQlyZWNlaXZlciA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJcmVjZWl2ZXJUeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBGaW5kIHRoZSBmaWVsZC4KLQkJCQlGaWVsZCByZWZsZWN0RmllbGQgPSBmaWVsZElzU3RyaW5nID8gcmVjZWl2ZXJUeXBlLmdldEZpZWxkKChTdHJpbmcpIGZpZWxkKSA6IChGaWVsZCkgZmllbGQ7Ci0JCQkJLy8gQWNjZXNzIHRoZSBmaWVsZC4KLQkJCQlPYmplY3QgdmFsdWUgPSBGaWVsZEFjY2Vzc1JlZmVyZW5jZS5jcmVhdGVGaWVsZEFjY2Vzc1JlZmVyZW5jZShyZWZsZWN0RmllbGQsIHJlY2VpdmVyKTsKLQkJCQlDbGFzcyB2YWx1ZVR5cGUgPSByZWZsZWN0RmllbGQuZ2V0VHlwZSgpOwotCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQoIkZpZWxkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZmllbGRJc1N0cmluZykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIihsb29rZWQgdXApICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnQocmVmbGVjdEZpZWxkKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludCgiPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByaW50T2JqZWN0QW5kVHlwZSh2YWx1ZSwgdmFsdWVUeXBlKTsKLQkJCQl9Ci0JCQkJCQotCQkJCXB1c2hFeHByZXNzaW9uVmFsdWUodmFsdWUsIHZhbHVlVHlwZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCQkJCi0JfQotCi0JLyoqCi0JICogUHVzaCB0aGUgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogQHBhcmFtIG1ldGhvZElzU3RyaW5nIDxjb2RlPnRydWU8L2NvZGU+IGlmIG1ldGhvZCBpcyBhIHN0cmluZyAoc28gc3RyaW5nIG5hbWUpIG9yIGVsc2UgaXQgaXMgYSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuCi0JICogQHBhcmFtIGhhc1JlY2VpdmVyCi0JICogQHBhcmFtIGFyZ0NvdW50Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaE1ldGhvZEludm9jYXRpb24oT2JqZWN0IG1ldGhvZCwgYm9vbGVhbiBtZXRob2RJc1N0cmluZywgYm9vbGVhbiBoYXNSZWNlaXZlciwgaW50IGFyZ0NvdW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsIHx8IGVycm9yT2NjdXJyZWQpIHsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRUcmFjZSgiSW52b2tlIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2UoIkludm9rZTogIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCU1ldGhvZCByZWZsZWN0TWV0aG9kID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gV2UgbmVlZCB0byBwdWxsIGluIHRoZSBhcmd1bWVudHMuIFRoZXkgYXJlIHN0YWNrZWQgaW4gcmV2ZXJzZSBvcmRlci4KLQkJCQlPYmplY3RbXSAgYXJncyA9IG5ldyBPYmplY3RbYXJnQ291bnRdOwotCQkJCUNsYXNzW10gYXJnVHlwZXMgPSBuZXcgQ2xhc3NbYXJnQ291bnRdOwotCQkJCWZvciAoaW50IGkgPSBhcmdDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCWFyZ3NbaV0gPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJCWFyZ1R5cGVzW2ldID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBOb3cgZ2V0IHJlY2VpdmVyCi0JCQkJT2JqZWN0IHJlY2VpdmVyID0gbnVsbDsKLQkJCQlDbGFzcyByZWNlaXZlclR5cGUgPSBudWxsOwotCQkJCWlmIChoYXNSZWNlaXZlcikgewotCQkJCQlyZWNlaXZlciA9IHBvcEV4cHJlc3Npb24oKTsKLQkJCQkJcmVjZWl2ZXJUeXBlID0gcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBOb3cgd2UgbmVlZCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QuIElmIGl0IGlzIGEgc3RyaW5nIHRoZW4gdGhlcmUgbXVzdCBiZSBhIHJlY2VpdmVyLCBvdGhlcndpc2Ugbm8gd2F5IHRvIGtub3cuCi0JCQkJaWYgKG1ldGhvZElzU3RyaW5nKSB7Ci0JCQkJCXJlZmxlY3RNZXRob2QgPSBNZXRob2RIZWxwZXIuZmluZENvbXBhdGlibGVNZXRob2QocmVjZWl2ZXJUeXBlLCAoU3RyaW5nKSBtZXRob2QsIGFyZ1R5cGVzKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmVmbGVjdE1ldGhvZCA9IChNZXRob2QpIG1ldGhvZDsKLQkJCQkKLQkJCQlpZiAodHJhY2VPbiAmJiByZWZsZWN0TWV0aG9kICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludCgiTWV0aG9kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAobWV0aG9kSXNTdHJpbmcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIobG9va2VkIHVwKSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50KHJlZmxlY3RNZXRob2QpOwkJCQkJCi0JCQkJfQotCQkJCQotCQkJCWlmICghTW9kaWZpZXIuaXNTdGF0aWMocmVmbGVjdE1ldGhvZC5nZXRNb2RpZmllcnMoKSkgJiYgcmVjZWl2ZXIgPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJObyByZWNlaXZlciBmb3Igbm9uLXN0YXRpYyBtZXRob2Q6ICIrcmVmbGVjdE1ldGhvZC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQlPYmplY3QgdmFsdWUgPSByZWZsZWN0TWV0aG9kLmludm9rZShyZWNlaXZlciwgYXJncyk7Ci0JCQkJCi0JCQkJaWYgKHRyYWNlT24pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludCgiIHJldHVybnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByaW50T2JqZWN0QW5kVHlwZSh2YWx1ZSwgcmVmbGVjdE1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpOwotCQkJCX0KLQkJCQlwdXNoRXhwcmVzc2lvblZhbHVlKHZhbHVlLCByZWZsZWN0TWV0aG9kLmdldFJldHVyblR5cGUoKSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGZpeFVwTWV0aG9kRXhjZXB0aW9uKGUsIHJlZmxlY3RNZXRob2QpKTsKLQkJCX0gY2F0Y2ggKE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9jZXNzRXhjZXB0aW9uKGZpeFVwTWV0aG9kRXhjZXB0aW9uKGUsIHJlZmxlY3RNZXRob2QpKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZml4VXBNZXRob2RFeGNlcHRpb24oZSwgcmVmbGVjdE1ldGhvZCkpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihmaXhVcE1ldGhvZEV4Y2VwdGlvbihlLmdldENhdXNlKCksIHJlZmxlY3RNZXRob2QpKTsKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCQkJCi0JfQotCQotCS8qCi0JICogTWFueSBvZiB0aGUgZXhjZXB0aW9ucyBkb24ndCBhZGQgaW4gd2hhdCBtZXRob2QgaGFkIHRoZSBlcnJvciwgc28gd2UKLQkgKiB3aWxsIGRvIHRoYXQgaGVyZS4KLQkgKi8KLQlwcml2YXRlIFRocm93YWJsZSBmaXhVcE1ldGhvZEV4Y2VwdGlvbihUaHJvd2FibGUgZSwgTWV0aG9kIG1ldGhvZCkgewotCQlpZiAobWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm4gZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCUNvbnN0cnVjdG9yIGVXaXRoU3RyaW5nQ3RvciA9IGUuZ2V0Q2xhc3MoKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSk7Ci0JCQlTdHJpbmcgbmV3TXNnOwotCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJbmV3TXNnID0gbWV0aG9kLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCW5ld01zZyA9IG1ldGhvZC50b1N0cmluZygpKyI6IFwiIittc2crJ1wiJzsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJRXhjZXB0aW9uIGZpeGVkdXBFID0gKEV4Y2VwdGlvbikgZVdpdGhTdHJpbmdDdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7bmV3TXNnfSk7Ci0JCQlmaXhlZHVwRS5zZXRTdGFja1RyYWNlKGUuZ2V0U3RhY2tUcmFjZSgpKTsKLQkJCXJldHVybiBmaXhlZHVwRTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQlyZXR1cm4gZTsKLQkJfQotICAKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgQ09ORElUSU9OQUxfSUdOT1JFID0gIkNPTkRJVElPTkFMIElHTk9SRSI7CS8vIEZsYWcgZm9yIGNvbmRpdGlvbmFsIGluIGluZ29yZSAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBpbnQgY29uZGl0aW9uYWxOZXN0aW5nID0gMDsJLy8gTmVzdGluZyBvZiBjb25kaXRpb25hbCBleHByZXNzaW9ucy4KLQlwcml2YXRlIGludCBjb25kaXRpb25hbElnbm9yZU5lc3RDb3VudCA9IDA7CS8vIFdoZW4gaWdub3JpbmcgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMsIGlnbm9yZSB1bnRpbCB0aGlzIG5lc3QgY291bnQuCi0JcHJpdmF0ZSBib29sZWFuIHNraXBUcnVlUGFydDsKLQotCS8qKgotCSAqIFB1c2ggYSBjb25kaXRpb25hbCBleHByZXNzaW9uLiBJdCBjYW4gYmUgYW55IGNsYXVzZSBvZiB0aGUgY29uZGl0aW9uYWwgKHRlc3QsIHRydWUsIG9yIGZhbHNlIGNsYXVzZSkuCi0JICogQHBhcmFtIGV4cHJlc3Npb25UeXBlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaENvbmRpdGlvbmFsKEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBleHByZXNzaW9uVHlwZSkgewotCQl0cnkgewotCQkJYm9vbGVhbiBpZ25vcmUgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vIFNsaWdodGx5IGRpZmZlcmVudCBoZXJlIGluIHRoYXQgaWYgYW4gaWdub3Jpbmcgb2NjdXJyZWQgd2Ugc3RpbGwgbmVlZCB0byBwcm9jZXNzIGF0IGxlYXN0IHBhcnQgb2YgaXQgc28gdGhhdAotCQkJCS8vIHdlIGNhbiBnZXQgdGhlIGV4cHJlc3Npb24gZ3JvdXBpbmcgY29ycmVjdC4KLQkJCQlzd2l0Y2ggKGV4cHJlc3Npb25UeXBlLmdldFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfVEVTVF9WQUxVRToKLQkJCQkJCWNvbmRpdGlvbmFsTmVzdGluZysrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLkNPTkRJVElPTkFMX1RSVUVfVkFMVUU6Ci0JCQkJCQlpZiAoc2tpcFRydWVQYXJ0ICYmIGlnbm9yZUV4cHJlc3Npb24gPT0gQ09ORElUSU9OQUxfSUdOT1JFICYmIGNvbmRpdGlvbmFsSWdub3JlTmVzdENvdW50ID09IGNvbmRpdGlvbmFsTmVzdGluZykgewotCQkJCQkJCS8vIHN0b3AgaWdub3JpbmcsIHdlJ3ZlIGlnbm9yZWQgdGhlIHRydWUgY29uZGl0aW9uIG9mIGludGVyZXN0LgotCQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCQkJCXJldHVybjsgLy8gSG93ZXZlciwgbGVhdmUgYmVjYXVzZSBzaW5jZSB0aGlzIGNvbmRpdGlvbiB3YXMgaWdub3JlZC4KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5DT05ESVRJT05BTF9GQUxTRV9WQUxVRToKLQkJCQkJCWludCBjdXJyZW50TmVzdGluZyA9IGNvbmRpdGlvbmFsTmVzdGluZy0tOwotCQkJCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gQ09ORElUSU9OQUxfSUdOT1JFICYmIGNvbmRpdGlvbmFsSWdub3JlTmVzdENvdW50ID09IGN1cnJlbnROZXN0aW5nKSB7Ci0JCQkJCQkJLy8gc3RvcCBpZ25vcmluZywgd2UndmUgaWdub3JlZCB0aGUgZmFsc2UgY29uZGl0aW9uIG9mIGludGVyZXN0LgotCQkJCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCQkJCXJldHVybjsgLy8gSG93ZXZlciwgbGVhdmUgYmVjYXVzZSBzaW5jZSB0aGlzIGNvbmRpdGlvbiB3YXMgaWdub3JlZC4KLQkJCQkJCX0KLQkJCQl9Ci0JCi0JCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAodHJhY2VPbikKLQkJCQkJcHJpbnRUcmFjZSgiQ29uZGl0aW9uYWwgIitleHByZXNzaW9uVHlwZSwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCQkKLQkJCXRyeSB7Ci0JCQkJc3dpdGNoIChleHByZXNzaW9uVHlwZS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCWNhc2UgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLkNPTkRJVElPTkFMX1RFU1RfVkFMVUU6Ci0JCQkJCQlPYmplY3QgY29uZGl0aW9uID0gcG9wRXhwcmVzc2lvbigpOwotCQkJCQkJQ2xhc3MgdHlwZSA9IHBvcEV4cHJlc3Npb25UeXBlKGZhbHNlKTsKLQkJCQkJCWlmICh0eXBlICE9IEJvb2xlYW4uVFlQRSkKLQkJCQkJCQl0aHJvd0NsYXNzQ2FzdChCb29sZWFuLlRZUEUsIGNvbmRpdGlvbik7Ci0JCQkJCQlpZiAoKChCb29sZWFuKSBjb25kaXRpb24pLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJLy8gQ29uZGl0aW9uIHdhcyB0cnVlLgotCQkJCQkJCS8vIERvIG5vdGhpbmcuIExldCB0cnVlIGNvbmRpdGlvbiBiZSBwcm9jZXNzZWQuCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIENvbmRpdGlvbiB3YXMgZmFsc2UuCi0JCQkJCQkJc2tpcFRydWVQYXJ0ID0gdHJ1ZTsJLy8gVGVsbCB0aGUgdHJ1ZSBjb25kaXRpb24gc2hvdWxkIGJlIGlnbm9yZWQuCi0JCQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IENPTkRJVElPTkFMX0lHTk9SRTsKLQkJCQkJCQljb25kaXRpb25hbElnbm9yZU5lc3RDb3VudCA9IGNvbmRpdGlvbmFsTmVzdGluZzsKLQkJCQkJCX0KLQkJCQkJCS8vIFdlIGRvbid0IHB1dCBhbnl0aGluZyBiYWNrIG9uIHRoZSBzdGFjayBiZWNhdXNlIHRoZSBjb25kaXRpb24gdGVzdCBpcyBub3QgZXZlciByZXR1cm5lZC4KLQkJCQkJCS8vIFRoZSBhcHByb3ByaWF0ZSB0cnVlIG9yIGZhbHNlIGNvbmRpdGlvbiBldmFsdWF0aW9uIHdpbGwgYmUgbGVmdCBvbiB0aGUgc3RhY2suCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfVFJVRV9WQUxVRToKLQkJCQkJCXNraXBUcnVlUGFydCA9IGZhbHNlOwkvLyBUZWxsIHRoZSBmYWxzZSBjb25kaXRpb24gc2hvdWxkIGJlIGlnbm9yZWQuCi0JCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gQ09ORElUSU9OQUxfSUdOT1JFOwotCQkJCQkJY29uZGl0aW9uYWxJZ25vcmVOZXN0Q291bnQgPSBjb25kaXRpb25hbE5lc3Rpbmc7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfRkFMU0VfVkFMVUU6Ci0JCQkJCQkvLyBUaGVyZSdzIG5vdGhpbmcgdG8gZG8sIGlmIGl0IHdhcyBpZ25vcmVkIGR1ZSB0byB0cnVlLCB3ZSB3b3VsZG4ndCBvZiBnb3R0b24gaGVyZS4KLQkJCQkJCS8vIElmIGl0IHdhc24ndCBpZ25vcmVkLCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIGZhbHNlIGV4cHJlc3Npb24gaXMgb24gdGhlIHN0YWNrLCB3aGljaCBpcyB3aGF0IGl0IHNob3VsZCBiZS4KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgQkxPQ0tfSUdOT1JFID0gIkJMT0NLIElHTk9SRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludFtdIGJsb2NrczsJLy8gU3RhY2sgb2YgYmxvY2sgbnVtYmVycyBjdXJyZW50bHkgZXZhbHVhdGluZy4KLQlwcml2YXRlIGludCB0b3BCbG9jayA9IC0xOwkvLyBUb3AgYmxvY2sgaW5kZXguCi0JcHJpdmF0ZSBpbnQgYnJlYWtCbG9jayA9IC0xOwkvLyBCbG9jayBudW1iZXIgd2UgYXJlIGJyZWFraW5nIHRvLgotCQotCS8qKgotCSAqIFB1c2ggYSBiZWdpbiBibG9jay4KLQkgKiBAcGFyYW0gYmxvY2tOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoQmxvY2tCZWdpbihpbnQgYmxvY2tOdW1iZXIpIHsKLQkJaWYgKHRyYWNlT24pIHsKLQkJCXByaW50VHJhY2UoIkJlZ2luIEJsb2NrICMiK2Jsb2NrTnVtYmVyLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5kZW50KHRydWUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBXZSBhcmUgbm90IGNoZWNraW5nIGlnbm9yZSBiZWNhdXNlIHRoaXMgaXMgYSBzdHJ1Y3R1cmFsIGNvbmNlcHQgaW5zdGVhZCBvZiBleGVjdXRhYmxlIGV4cHJlc3Npb25zLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlc2UuCi0JCQlpZiAoYmxvY2tzID09IG51bGwpCi0JCQkJYmxvY2tzID0gbmV3IGludFsxMF07Ci0JCQlpZiAoKyt0b3BCbG9jayA+PSBibG9ja3MubGVuZ3RoKSB7Ci0JCQkJaW50W10gbmV3TGlzdCA9IG5ldyBpbnRbYmxvY2tzLmxlbmd0aCoyXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJsb2NrcywgMCwgbmV3TGlzdCwgMCwgYmxvY2tzLmxlbmd0aCk7Ci0JCQkJYmxvY2tzID0gbmV3TGlzdDsKLQkJCX0KLQkJCWJsb2Nrc1t0b3BCbG9ja10gPSBibG9ja051bWJlcjsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQdXNoIGEgYmxvY2sgZW5kLiBUaGUgY3VycmVudCBibG9jayBtdXN0IGJlIHRoZSBnaXZlbiBudW1iZXIsIG9yIGl0IGlzIGFuIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSBibG9ja051bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hCbG9ja0VuZChpbnQgYmxvY2tOdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJaW5kZW50KGZhbHNlKTsKLQkJCQlwcmludFRyYWNlKCJFbmQgQmxvY2sgIyIrYmxvY2tOdW1iZXIsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBXZSBhcmUgbm90IGNoZWNraW5nIGlnbm9yZSBiZWNhdXNlIHRoaXMgaXMgYSBzdHJ1Y3R1cmFsIGNvbmNlcHQgaW5zdGVhZCBvZiBleGVjdXRhYmxlIGV4cHJlc3Npb25zLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlc2UuCi0JCQlpZiAoYmxvY2tzID09IG51bGwgfHwgdG9wQmxvY2sgPCAwIHx8IGJsb2Nrc1t0b3BCbG9ja10gIT0gYmxvY2tOdW1iZXIpIHsKLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaEJsb2NrRW5kLlJlY2VpdmVkRW5kQmxvY2tzT3V0T2ZPcmRlcl9FWENfIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0b3BCbG9jay0tOwotCQkJCWlmIChpZ25vcmVFeHByZXNzaW9uID09IEJMT0NLX0lHTk9SRSAmJiBibG9ja051bWJlciA9PSBicmVha0Jsb2NrKSB7Ci0JCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQkJCQotCX0KLQkKLQkvKioKLQkgKiBTa2lwIGFsbCBmb2xsb3dpbmcgdW50aWwgd2UgaGl0IHRoZSByZXF1ZXN0ZWQgYmxvY2sgbnVtYmVyLgotCSAqIEBwYXJhbSBibG9ja051bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hCbG9ja0JyZWFrKGludCBibG9ja051bWJlcikgewotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZSgiQnJlYWsgQmxvY2sgIyIrYmxvY2tOdW1iZXIsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJaWdub3JlRXhwcmVzc2lvbiA9IEJMT0NLX0lHTk9SRTsJLy8gU3RhcnQgaWdub3JpbmcgZXhwcmVzc2lvbnMgdW50aWwgd2UgaGl0IHRoZSBibG9jayBudW1iZXIgZW5kIGJsb2NrLgotCQkJCWJyZWFrQmxvY2sgPSBibG9ja051bWJlcjsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgVFJZX1RIUk9XX0lHTk9SRSA9ICJUUlkgVEhST1cgSUdOT1JFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBUUllfRklOQUxfSUdOT1JFID0gIlRSWSBGSU5BTCBJR05PUkUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBpbnRbXSB0cnlzOwkvLyBTdGFjayBvZiB0cnkgbnVtYmVycyBjdXJyZW50bHkgZXZhbHVhdGluZy4KLQkvLyBTdGFjayBvZiB0cnlzIGluIGNhdGNoIGNsYXVzZSAoaS5lLiBzdGFydGluZyBleGVjdXRpbmcgYSBjYXRjaC9maW5hbCBjbGF1c2UgZm9yIHRoZSB0cnkpLiBDb3JyZXNwb25kcyB3aXRoIHRyeSBmcm9tIHNhbWUgaW5kZXggaW4gdHJ5cy4gQ29udGFpbnMgdGhlIHRocm93YWJsZSBmb3IgdGhlIGNhdGNoLgotCS8vIFRoaXMgaXMgdXNlZCB0byBrbm93IHdlIGFyZSBleGVjdXRpbmcgYSBjYXRjaCAoZW50cnkgbm90IG51bGwpIGFuZCBmb3IgdGhlIHJldGhyb3cgc2hvcnQtaGFuZCB0byByZXRocm93IHRoZSBzYW1lIGV4Y2VwdGlvbiB3aXRoaW4gdGhlIGNhdGNoLgotCXByaXZhdGUgVGhyb3dhYmxlW10gdHJ5c0luQ2F0Y2g7CQotCXByaXZhdGUgaW50IHRvcFRyeSA9IC0xOwkvLyBUb3AgdHJ5IGluZGV4LgotCXByaXZhdGUgaW50IGJyZWFrVHJ5ID0gLTE7CS8vIFRyeSBudW1iZXIgd2UgYXJlIGJyZWFraW5nIHRvLgotCXByaXZhdGUgVGhyb3dhYmxlIGNhdGNoVGhyb3dhYmxlOwkvLyBUaGUgdGhyb3dhYmxlIHRvIGNoZWNrIGNhdGNoZXMgYWdhaW5zdC4KLQkKLQkvKioKLQkgKiBQdXNoIGEgdHJ5IHN0YXRlbWVudC4KLQkgKiBAcGFyYW0gdHJ5TnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRyeUJlZ2luKGludCB0cnlOdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJcHJpbnRUcmFjZSgiQmVnaW4gVHJ5ICMiK3RyeU51bWJlciwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRlbnQodHJ1ZSk7Ci0JCQl9Ci0JCi0JCQlpZiAoZXJyb3JPY2N1cnJlZCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBXZSBhcmUgbm90IGNoZWNraW5nIGlnbm9yZSBiZWNhdXNlIHRoaXMgaXMgYSBzdHJ1Y3R1cmFsIGNvbmNlcHQgaW5zdGVhZCBvZiBleGVjdXRhYmxlIGV4cHJlc3Npb25zLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlc2UuCi0JCQlpZiAodHJ5cyA9PSBudWxsKSB7Ci0JCQkJdHJ5cyA9IG5ldyBpbnRbMTBdOwotCQkJCXRyeXNJbkNhdGNoID0gbmV3IFRocm93YWJsZVsxMF07Ci0JCQl9Ci0JCQlpZiAoKyt0b3BUcnkgPj0gdHJ5cy5sZW5ndGgpIHsKLQkJCQlpbnRbXSBuZXdMaXN0ID0gbmV3IGludFt0cnlzLmxlbmd0aCoyXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRyeXMsIDAsIG5ld0xpc3QsIDAsIHRyeXMubGVuZ3RoKTsKLQkJCQl0cnlzID0gbmV3TGlzdDsKLQkJCQlUaHJvd2FibGVbXSBuZXdDYXRjaGVzID0gbmV3IFRocm93YWJsZVt0cnlzLmxlbmd0aF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weSh0cnlzSW5DYXRjaCwgMCwgbmV3Q2F0Y2hlcywgMCwgdHJ5c0luQ2F0Y2gubGVuZ3RoKTsKLQkJCQl0cnlzSW5DYXRjaCA9IG5ld0NhdGNoZXM7Ci0JCQl9Ci0JCQl0cnlzW3RvcFRyeV0gPSB0cnlOdW1iZXI7Ci0JCQl0cnlzSW5DYXRjaFt0b3BUcnldID0gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRocm93IHRoZSB0b3Agc3RhY2sgZW50cnkuIEl0IG11c3QgYmUgYW4gZXhjZXB0aW9uLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hUaHJvd0V4Y2VwdGlvbigpIHsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gaWdub3JlID0gKGlnbm9yZUV4cHJlc3Npb24gIT0gbnVsbCB8fCBlcnJvck9jY3VycmVkKTsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2UoIlRocm93IGV4Y2VwdGlvbjogIiwgaWdub3JlKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpZiAoaWdub3JlKQotCQkJCXJldHVybjsKLQkKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IHQgPSBwb3BFeHByZXNzaW9uKCk7Ci0JCQkJcG9wRXhwcmVzc2lvblR5cGUoZmFsc2UpOwotCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQodCk7Ci0JCQkJfQotCQkJCXRocm93RXhjZXB0aW9uKChUaHJvd2FibGUpIHQpOwotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodHJhY2VPbikKLQkJCQlwcmludFRyYWNlRW5kKCk7Ci0JCX0JCQkKLQl9Ci0JCi0JLyoqCi0JICogVGhyb3cgdGhpcyBleGNlcHRpb24gKG1lYW5zIHRocm93IHRocm91Z2ggdGhlIGV4cHJlc3Npb24gYmVpbmcgcHJvY2Vzc2VkLCBub3QgdGhyb3cgZm9yIHRoaXMgdGhyZWFkKS4KLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdGhyb3dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAodG9wVHJ5ID09IC0xKSB7Ci0JCQkvLyBUaGVyZSBhcmUgbm8gdHJpZXMsIHNvIHRyZWF0IHRoaXMgYXMgYSBzeW50YXggZXJyb3IuCi0JCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0gZWxzZSBpZiAodHJ5c0luQ2F0Y2hbdG9wVHJ5XSA9PSBudWxsKSB7Ci0JCQkvLyBXZSBhcmUgbm90IGluIGEgY2F0Y2ggY2xhdXNlIG9mIHRoZSB0b3AgdHJ5LiBTbyBkbyBhIHRocm93IGlnbm9yZSBmb3IgdG9wdHJ5LgotCQkJaWdub3JlRXhwcmVzc2lvbiA9IFRSWV9USFJPV19JR05PUkU7Ci0JCQlicmVha1RyeSA9IHRyeXNbdG9wVHJ5XTsKLQkJCWNhdGNoVGhyb3dhYmxlID0gZXhjZXB0aW9uOwotCQl9IGVsc2UgewotCQkJLy8gV2UgYXJlIGluIGEgY2F0Y2ggb2YgdGhlIHRvcCB0cnkuIFNvIGRvIGEgdGhyb3cgdG8gZmluYWxseSBpbnN0ZWFkLgotCQkJaWdub3JlRXhwcmVzc2lvbiA9IFRSWV9GSU5BTF9JR05PUkU7Ci0JCQl0cnlzSW5DYXRjaFt0b3BUcnldID0gRklOQUxfQ0FUQ0g7Ci0JCQlicmVha1RyeSA9IHRyeXNbdG9wVHJ5XTsKLQkJCWNhdGNoVGhyb3dhYmxlID0gZXhjZXB0aW9uOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYSBjYXRjaCBjbGF1c2UKLQkgKiBAcGFyYW0gdHJ5TnVtYmVyCi0JICogQHBhcmFtIGV4Y2VwdGlvblR5cGUKLQkgKiBAcGFyYW0gZXhwcmVzc2lvblByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRyeUNhdGNoQ2xhdXNlKGludCB0cnlOdW1iZXIsIENsYXNzIGV4Y2VwdGlvblR5cGUsIEludGVybmFsRXhwcmVzc2lvblByb3h5IGV4cHJlc3Npb25Qcm94eSkgewotCQl0cnkgewotCQkJaWYgKHRyYWNlT24pIHsKLQkJCQlpbmRlbnQoZmFsc2UpOwotCQkJCWlmIChleHByZXNzaW9uUHJveHkgPT0gbnVsbCkKLQkJCQkJcHJpbnRUcmFjZSgiQ2F0Y2ggVHJ5ICMiK3RyeU51bWJlcisiICgiK2V4Y2VwdGlvblR5cGUrJyknLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZWxzZQotCQkJCQlwcmludFRyYWNlKCJDYXRjaCBUcnkgIyIrdHJ5TnVtYmVyKyIgKCIrZXhjZXB0aW9uVHlwZSsiKSBSZXR1cm4gZXhjZXB0aW9uIGluIHByb3h5ICMiK2V4cHJlc3Npb25Qcm94eS5nZXRQcm94eUlEKCksIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWluZGVudCh0cnVlKTsKLQkJCX0KLQkJCQotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQkvLyBXZSBhcmUgbm90IGNoZWNraW5nIGlnbm9yZSBiZWNhdXNlIHRoaXMgaXMgYSBzdHJ1Y3R1cmFsIGNvbmNlcHQgaW5zdGVhZCBvZiBleGVjdXRhYmxlIGV4cHJlc3Npb25zLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlc2UuCi0JCQlpZiAodHJ5cyA9PSBudWxsIHx8IHRvcFRyeSA8IDAgfHwgdHJ5c1t0b3BUcnldICE9IHRyeU51bWJlcikgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoVHJ5Q2F0Y2hDbGF1c2UuQ2F0Y2hSZWNlaXZlZE91dE9mT3JkZXJfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gbnVsbCkgewotCQkJCQkvLyBOb3JtYWwgZmxvdywgbm8gdGhyb3cgaW4gcHJvZ3Jlc3MsIHNvIGp1c3QgaWdub3JlIG5vdyB1bnRpbCB0aGUgZmluYWxseSBvciBlbmQgdHJ5IHJlYWNoZWQuCi0JCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBUUllfRklOQUxfSUdOT1JFOwotCQkJCQlicmVha1RyeSA9IHRyeU51bWJlcjsKLQkJCQl9IGVsc2UgaWYgKGlnbm9yZUV4cHJlc3Npb24gPT0gVFJZX1RIUk9XX0lHTk9SRSAmJiB0cnlOdW1iZXIgPT0gYnJlYWtUcnkpIHsKLQkJCQkJLy8gV2UgYXJlIGhlcmUgZHVlIHRvIGEgdGhyb3cgb2NjdXJpbmcgaW4gdGhpcyB0cnkgYmxvY2ssIHNlZSBpZiBmb3IgdXMsIGFuZCBpZiBpdCBpcywgc3RvcCBpZ25vcmluZy4KLQkJCQkJLy8gRWxzZSBqdXN0IGNvbnRpbnVlIGlnbm9yaW5nLgotCQkJCQlpZiAoZXhjZXB0aW9uVHlwZS5pc0luc3RhbmNlKGNhdGNoVGhyb3dhYmxlKSkgewotCQkJCQkJLy8gRm9yIHVzLCBzbyBqdXN0IHR1cm4gZXZlcnl0aGluZyBiYWNrIG9uLCBleGNlcHQgbWFyayB0aGF0IHdlIGFyZSBpbiB0aGUgY2F0Y2ggcGhhc2UuCi0JCQkJCQlpZ25vcmVFeHByZXNzaW9uID0gbnVsbDsKLQkJCQkJCXRyeXNJbkNhdGNoW3RvcFRyeV0gPSBjYXRjaFRocm93YWJsZTsgLy8gVGhpcyBpcyBzbyB0aGF0IHdlIGtub3cgaWYgd2UgdGhyb3cgYWdhaW4gdGhhdCB3ZSBzaG91bGQgbm90IGNhdGNoIGFueXRoaW5nLgotCQkJCQkJYnJlYWtUcnkgPSAtMTsKLQkJCQkJCWlmIChleHByZXNzaW9uUHJveHkgIT0gbnVsbCkgewotCQkJCQkJCWV4cHJlc3Npb25Qcm94eS5zZXRQcm94eShjYXRjaFRocm93YWJsZSwgY2F0Y2hUaHJvd2FibGUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQkJYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoZXhwcmVzc2lvblByb3h5KTsKLQkJCQkJCX0KLQkJCQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludCgiIENhdWdodDogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KGNhdGNoVGhyb3dhYmxlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoVGhyb3dhYmxlID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQkJCQotCX0KLQkKLQkvLyBUaGlzIGlzIHVzZWQgb25seSBzbyB0aGF0IGZpbmFsbHkgY2xhdXNlIGNhbiBpbmRpY2F0ZSBpdCB3YXMgZXhlY3V0aW5nIHNvIHRoYXQgZW5kIGV4cHJlc3Npb24ga25vd3MgdGhpcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJvd2FibGUgRklOQUxfQ0FUQ0ggPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCi0JLyoqCi0JICogUHVzaCB0aGUgdHJ5IGZpbmFsbHkgY2xhdXNlLgotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXNoVHJ5RmluYWxseUNsYXVzZShpbnQgdHJ5TnVtYmVyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHJhY2VPbikgewotCQkJCWluZGVudChmYWxzZSk7Ci0JCQkJcHJpbnRUcmFjZSgiRmluYWxseSBUcnkgIyIrdHJ5TnVtYmVyLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGVudCh0cnVlKTsKLQkJCX0KLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmICh0cnlzID09IG51bGwgfHwgdG9wVHJ5IDwgMCB8fCB0cnlzW3RvcFRyeV0gIT0gdHJ5TnVtYmVyKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlGaW5hbGx5Q2xhdXNlLkZpbmFsbHlSZWNlaXZlZE91dE9mT3JkZXJfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRyeU51bWJlciA9PSBicmVha1RyeSAmJiAoaWdub3JlRXhwcmVzc2lvbiA9PSBUUllfVEhST1dfSUdOT1JFIHx8IGlnbm9yZUV4cHJlc3Npb24gPT0gVFJZX0ZJTkFMX0lHTk9SRSkpIHsKLQkJCQkJLy8gV2UgYXJlIGhlcmUgZHVlIHRvIGEgdGhyb3cgb2NjdXJpbmcgaW4gdGhpcyB0cnkgYmxvY2sgb3IgYSBjYXRjaCB3YXMgcmVhY2hlZCAoaW4gd2hpY2ggY2FzZSBhbGwgaW50ZXJ2ZW5pbmcgY2F0Y2gncyB3ZXJlIGlnbm9yZWQpLgotCQkJCQkvLyBOb3cgZG8gYSBub3JtYWwgZXhlY3V0aW9uLiBJZiB3ZSBhcmUgaGVyZSBkdWUgdG8gYSB0aHJvdyB0aGF0IHdhc24ndCBjbGVhcmVkIChlaXRoZXIgbm8gY2F0Y2ggb3IgYW5vdGhlciB0aHJvdyBvY2N1cmVkIHdpdGhpbiB0aGUgY2F0Y2gpCi0JCQkJCS8vIHRoZW4gd2UgbGVhdmUgaXQgdW5jbGVhcmVkIHNvIHRoYXQgdHJ5L2VuZCBtYXkgcmV0aHJvdyBpdC4KLQkJCQkJaWdub3JlRXhwcmVzc2lvbiA9IG51bGw7Ci0JCQkJCXRyeXNJbkNhdGNoW3RvcFRyeV0gPSBGSU5BTF9DQVRDSDsgLy8gV2UgYXJlIGluIHRoZSBmaW5hbGx5IGNsYXVzZSBvZiBhIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24gd2l0aGluIHRoaXMgdHJ5LgotCQkJCQlicmVha1RyeSA9IC0xOwotCQkJCQlpZiAodHJhY2VPbikKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiBFeGVjdXRpbmcgZmluYWxseS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0cmFjZU9uKQotCQkJCXByaW50VHJhY2VFbmQoKTsKLQkJfQkJCQotCX0KLQkKLQkvKioKLQkgKiBSZXRocm93IHRoZSBjYXVnaHQgZXhjZXB0aW9uLiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yOgotCSAqIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICogICAuLi4gZG8gc3R1ZmYgLi4uCi0JICogICB0aHJvdyBlOwotCSAqIH0KLQkgKiBAcGFyYW0gdHJ5TnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRyeVJldGhyb3coaW50IHRyeU51bWJlcikgewotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIlJldGhyb3cgVHJ5ICMiK3RyeU51bWJlciwgZXJyb3JPY2N1cnJlZCAgfHwgaWdub3JlRXhwcmVzc2lvbiAhPSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdHJ5IHsKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBpcyBub3QgY2FsbGVkIG91dCBvZiBvcmRlci4KLQkJCWlmICh0cnlzID09IG51bGwgfHwgdG9wVHJ5IDwgMCB8fCB0cnlzW3RvcFRyeV0gIT0gdHJ5TnVtYmVyKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlSZXRocm93LlJldGhyb3dSZWNlaXZlZE91dE9mT3JkZXJfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoaWdub3JlRXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJaWYgKHRyeXNJbkNhdGNoW3RvcFRyeV0gPT0gbnVsbCB8fCB0cnlzSW5DYXRjaFt0b3BUcnldID09IEZJTkFMX0NBVENIKQotCQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeVJldGhyb3cuUmV0cnlSZWNlaXZlZE91dE9mRXhlY3V0aW5nQ2F0Y2hDbGF1c2VfRVhDXyIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIHsKLQkJCQkJdGhyb3dFeGNlcHRpb24odHJ5c0luQ2F0Y2hbdG9wVHJ5XSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFRyeUVuZChpbnQgdHJ5TnVtYmVyKSB7Ci0JCWlmICh0cmFjZU9uKSB7Ci0JCQlpbmRlbnQoZmFsc2UpOwotCQkJcHJpbnRUcmFjZSgiRW5kIFRyeSAjIit0cnlOdW1iZXIsIGVycm9yT2NjdXJyZWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChlcnJvck9jY3VycmVkKQotCQkJCXJldHVybjsKLQkJCS8vIFdlIGFyZSBub3QgY2hlY2tpbmcgaWdub3JlIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgY29uY2VwdCBpbnN0ZWFkIG9mIGV4ZWN1dGFibGUgZXhwcmVzc2lvbnMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGVzZS4KLQkJCWlmICh0cnlzID09IG51bGwgfHwgdG9wVHJ5IDwgMCB8fCB0cnlzW3RvcFRyeV0gIT0gdHJ5TnVtYmVyKSB7Ci0JCQkJcHJvY2Vzc1N5bnRheEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuZ2V0U3RyaW5nKCJFeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlFbmQuVHJ5RW5kUmVjZWl2ZWRPdXRPZk9yZGVyX0VYQ18iKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWJvb2xlYW4gaW5DYXRjaCA9IHRyeXNJbkNhdGNoW3RvcFRyeV0gIT0gbnVsbDsKLQkJCQl0cnlzSW5DYXRjaFt0b3BUcnldID0gbnVsbDsKLQkJCQl0b3BUcnktLTsKLQkJCQlpZiAoaW5DYXRjaCB8fCAodHJ5TnVtYmVyID09IGJyZWFrVHJ5ICYmIChpZ25vcmVFeHByZXNzaW9uID09IFRSWV9USFJPV19JR05PUkUgfHwgaWdub3JlRXhwcmVzc2lvbiA9PSBUUllfRklOQUxfSUdOT1JFKSkpIHsKLQkJCQkJLy8gV2UgYXJlIGhlcmUgZHVlIHRvIGEgdGhyb3cgb3Igbm9ybWFsIGZsb3cgdGhyb3VnaCBhIGNhdGNoLiBFaXRoZXIgd2F5IGlmIHRoZXJlIGlzIGEgdGhyb3dhYmxlIHN0aWxsIHBlbmRpbmcsIHdlIHJldGhyb3cuCi0JCQkJCWlnbm9yZUV4cHJlc3Npb24gPSBudWxsOwotCQkJCQlicmVha1RyeSA9IC0xOwotCQkJCQlpZiAoY2F0Y2hUaHJvd2FibGUgIT0gbnVsbCkKLQkJCQkJCXRocm93RXhjZXB0aW9uKGNhdGNoVGhyb3dhYmxlKTsKLQkJCQl9IAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkJCi0JfQotCQotCS8qKgotCSAqIENsYXNzIHVzZWQgdG8gc2F2ZSB0aGUgc3RhdGUgYXQgdGltZSBvZiBtYXJrLiBJdCB3aWxsCi0JICogYmUgdXNlZCB0byByZXN0b3JlIHN0YXRlIGlmIGVycm9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTYXZlU3RhdGUgewotCQlwdWJsaWMgaW50IG1hcmtJRDsKLQkJCi0JCS8vIEJsb2NrIHN0YXRlCi0JCXB1YmxpYyBpbnQgdG9wQmxvY2s7Ci0JCXB1YmxpYyBpbnQgYnJlYWtCbG9jazsKLQotCQkvLyBTdWJleHByZXNzaW9uIHN0YXRlCi0JCXB1YmxpYyBpbnQgdG9wU3ViZXhwcmVzc2lvbjsKLQotCQkvLyBUcnkgc3RhdGUKLQkJcHVibGljIGludCB0b3BUcnk7Ci0JCXB1YmxpYyBpbnQgYnJlYWtUcnk7Ci0JCXB1YmxpYyBUaHJvd2FibGUgY2F0Y2hUaHJvd2FibGU7Ci0JCQotCQkvLyBFcnJvciBzdGF0ZQotCQlwdWJsaWMgYm9vbGVhbiBlcnJvck9jY3VycmVkOwotCQlwdWJsaWMgYm9vbGVhbiBub3ZhbHVlRXhjZXB0aW9uOwotCQlwdWJsaWMgVGhyb3dhYmxlIGV4Y2VwdGlvbjsKLQkJcHVibGljIE9iamVjdCBpZ25vcmVFeHByZXNzaW9uOwotCQkKLQkJLy8gRXhwcmVzc2lvbiBzdGFjayBzdGF0ZQotCQlwdWJsaWMgaW50IGV4cHJlc3Npb25TdGFja1BvczsKLQkJCi0JCS8vIElmL2Vsc2Ugc3RhdGUKLQkJcHVibGljIGludCBpZkVsc2VOZXN0aW5nOwotCQlwdWJsaWMgaW50IGlmRWxzZUlnbm9yZU5lc3RDb3VudDsKLQkJcHVibGljIGJvb2xlYW4gaWZFbHNlU2tpcFRydWVQYXJ0OwotCQkKLQkJLy8gT3RoZXIKLQkJcHVibGljIGludCBpbmRlbnQ7Ci0JCXB1YmxpYyBpbnQgZXhwcmVzc2lvblByb3h5UG9zOwotCQkKLQkJLyoqCi0JCSAqIENvbnN0cnVjdCBhbmQgc2F2ZSB0aGUgc3RhdGUuCi0JCSAqIAotCQkgKiBAcGFyYW0gbWFya051bWJlcgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgU2F2ZVN0YXRlKGludCBtYXJrSUQpIHsKLQkJCXRoaXMubWFya0lEID0gbWFya0lEOwotCQkJCi0JCQlFeHByZXNzaW9uUHJvY2Vzc2VyIGVwID0gRXhwcmVzc2lvblByb2Nlc3Nlci50aGlzOwotCQkJdGhpcy50b3BCbG9jayA9IGVwLnRvcEJsb2NrOwotCQkJdGhpcy5icmVha0Jsb2NrID0gZXAuYnJlYWtCbG9jazsKLQkJCQotCQkJdGhpcy50b3BTdWJleHByZXNzaW9uID0gZXAudG9wU3ViZXhwcmVzc2lvbjsKLQkJCQotCQkJdGhpcy50b3BUcnkgPSBlcC50b3BUcnk7Ci0JCQl0aGlzLmJyZWFrVHJ5ID0gZXAuYnJlYWtUcnk7Ci0JCQl0aGlzLmNhdGNoVGhyb3dhYmxlID0gZXAuY2F0Y2hUaHJvd2FibGU7Ci0JCQkKLQkJCXRoaXMuZXJyb3JPY2N1cnJlZCA9IGVwLmVycm9yT2NjdXJyZWQ7Ci0JCQl0aGlzLm5vdmFsdWVFeGNlcHRpb24gPSBlcC5ub3ZhbHVlRXhjZXB0aW9uOwotCQkJdGhpcy5leGNlcHRpb24gPSBlcC5leGNlcHRpb247Ci0JCQl0aGlzLmlnbm9yZUV4cHJlc3Npb24gPSBlcC5pZ25vcmVFeHByZXNzaW9uOwotCQkJCi0JCQl0aGlzLmV4cHJlc3Npb25TdGFja1BvcyA9IGV4cHJlc3Npb25TdGFjay5zaXplKCktMTsKLQkJCQotCQkJdGhpcy5pZkVsc2VOZXN0aW5nID0gZXAuaWZFbHNlTmVzdGluZzsKLQkJCXRoaXMuaWZFbHNlSWdub3JlTmVzdENvdW50ID0gZXAuaWZFbHNlSWdub3JlTmVzdENvdW50OwotCQkJdGhpcy5pZkVsc2VTa2lwVHJ1ZVBhcnQgPSBlcC5pZkVsc2VTa2lwVHJ1ZVBhcnQ7Ci0JCQkKLQkJCXRoaXMuaW5kZW50ID0gZXAuaW5kZW50OwotCQkJdGhpcy5leHByZXNzaW9uUHJveHlQb3MgPSBleHByZXNzaW9uUHJveGllcyAhPSBudWxsID8gZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpLTEgOiAtMTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJlc3RvcmUgdGhlIHN0YXRlLgotCQkgKiAKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKCkgewotCQkJRXhwcmVzc2lvblByb2Nlc3NlciBlcCA9IEV4cHJlc3Npb25Qcm9jZXNzZXIudGhpczsKLQkJCWVwLnRvcEJsb2NrID0gdGhpcy50b3BCbG9jazsKLQkJCWVwLmJyZWFrQmxvY2sgPSB0aGlzLmJyZWFrQmxvY2s7Ci0KLQkJCWVwLnRvcFN1YmV4cHJlc3Npb24gPSB0aGlzLnRvcFN1YmV4cHJlc3Npb247Ci0JCQkKLQkJCWVwLnRvcFRyeSA9IHRoaXMudG9wVHJ5OwotCQkJZXAuYnJlYWtUcnkgPSB0aGlzLmJyZWFrVHJ5OwotCQkJZXAuY2F0Y2hUaHJvd2FibGUgPSB0aGlzLmNhdGNoVGhyb3dhYmxlOwotCQkJaWYgKHRyeXNJbkNhdGNoICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gdG9wVHJ5ICsgMTsgaSA8IGVwLnRyeXNJbkNhdGNoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWVwLnRyeXNJbkNhdGNoW2ldID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWVwLmVycm9yT2NjdXJyZWQgPSB0aGlzLmVycm9yT2NjdXJyZWQ7Ci0JCQllcC5ub3ZhbHVlRXhjZXB0aW9uID0gZXAubm92YWx1ZUV4Y2VwdGlvbjsKLQkJCWVwLmV4Y2VwdGlvbiA9IHRoaXMuZXhjZXB0aW9uOwotCQkJZXAuaWdub3JlRXhwcmVzc2lvbiA9IHRoaXMuaWdub3JlRXhwcmVzc2lvbjsKLQkJCQotCQkJLy8gUG9wIHN0YWNrIGRvd24gdG8gc2F2ZWQgc3RhdGUuCi0JCQlmb3IgKGludCBpID0gZXhwcmVzc2lvblN0YWNrLnNpemUoKS0xOyBpID4gdGhpcy5leHByZXNzaW9uU3RhY2tQb3M7IGktLSkgewotCQkJCWV4cHJlc3Npb25TdGFjay5yZW1vdmUoaSk7Ci0JCQkJZXhwcmVzc2lvblR5cGVTdGFjay5yZW1vdmUoaSk7Ci0JCQl9Ci0JCQkKLQkJCWVwLmlmRWxzZU5lc3RpbmcgPSB0aGlzLmlmRWxzZU5lc3Rpbmc7Ci0JCQllcC5pZkVsc2VJZ25vcmVOZXN0Q291bnQgPSB0aGlzLmlmRWxzZUlnbm9yZU5lc3RDb3VudDsKLQkJCWVwLmlmRWxzZVNraXBUcnVlUGFydCA9IHRoaXMuaWZFbHNlU2tpcFRydWVQYXJ0OwotCQkJCi0JCQllcC5pbmRlbnQgPSB0aGlzLmluZGVudDsKLQkJCQotCQkJaWYgKGV4cHJlc3Npb25Qcm94aWVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpIC0gMTsgaSA+IHRoaXMuZXhwcmVzc2lvblByb3h5UG9zOyBpLS0pIHsKLQkJCQkJZXhwcmVzc2lvblByb3hpZXMucmVtb3ZlKGkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gVGhlc2Ugc2V0dGluZ3MgY2FuJ3QgY3Jvc3MgbWFyayBib3VuZGFyaWVzLCBzbyByZXNldCB0aGVtIHRvIG5vdCBzZXQuIFRoaXMgaXMgaW4gY2FzZSB3ZSB3ZXJlIGluIHRoaXMgc3RhdGUgc29tZXdoZXJlCi0JCQkvLyBpbiB0aGUgbWFyayB3aGVuIHRoZSByZXN0b3JlIG9jY3VycmVkLgotCQkJZXAuY29uZGl0aW9uYWxJZ25vcmVOZXN0Q291bnQgPSAwOwotCQkJZXAuY29uZGl0aW9uYWxOZXN0aW5nID0gMDsKLQkJCWVwLnNraXBUcnVlUGFydCA9IGZhbHNlOwotCQkJCi0JCQllcC5pbmZpeElnbm9yZU5lc3RDb3VudCA9IDA7Ci0JCQllcC5pbmZpeE5lc3RpbmcgPSAwOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgc2F2ZSBzdGF0ZSB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiBAcGFyYW0gbWFya0lECi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RhdGUgY3JlYXRlU2F2ZVN0YXRlKGludCBtYXJrSUQpIHsKLQkJcmV0dXJuIG5ldyBTYXZlU3RhdGUobWFya0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgc3RhcnQgb2YgYSBtYXJrLgotCSAqIEBwYXJhbSBtYXJrTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaE1hcmsoaW50IG1hcmtOdW1iZXIpIHsKLQkJaWYgKHRyYWNlT24pCi0JCQlwcmludFRyYWNlKCJNYXJrIyIrbWFya051bWJlciwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoc2F2ZVN0YXRlcyA9PSBudWxsKQotCQkJc2F2ZVN0YXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2F2ZVN0YXRlcy5hZGQoY3JlYXRlU2F2ZVN0YXRlKG1hcmtOdW1iZXIpKTsKLQkJCi0JCWlmICh0cmFjZU9uKQotCQkJcHJpbnRUcmFjZUVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBlbmQgbWFyay4gSWYgdGhlcmUgaXMgbm8gZXJyb3IsIGl0IHdpbGwgc2ltcGx5Ci0JICogcmVtb3ZlIGl0IGFuZCBhbGwgc2F2ZSBzdGF0ZXMgaW4gdGhlIG1hcCBhZnRlciBpdC4gSWYgdGhlcmUKLQkgKiBpcyBhbiBlcnJvciBpdCB3aWxsIGRvIHRoaXMgcGx1cyBpdCB3aWxsIHJlc3RvcmUgdGhlIHN0YXRlLgotCSAqIDxwPgotCSAqIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgY2FsbHMgYXJlIGNvbWluZyBpbiBjb3JyZWN0IG9yZGVyIGZyb20KLQkgKiB0aGUgc2VydmVyIHNvIHdlIHdvbid0IGNoZWNrIHZhbGlkaXR5LgotCSAqIAotCSAqIEBwYXJhbSBtYXJrSUQKLQkgKiBAcGFyYW0gcmVzdG9yZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hFbmRtYXJrKGludCBtYXJrSUQsIGJvb2xlYW4gcmVzdG9yZSkgewotCQlpZiAodHJhY2VPbikKLQkJCXByaW50VHJhY2UoIkVuZCBNYXJrIyIrbWFya0lEKyIgUmVzdG9yZWQ9IityZXN0b3JlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJdHJ5IHsKLQkJCWlmIChzYXZlU3RhdGVzICE9IG51bGwpIHsKLQkJCQkvLyBTdGFydCBmcm9tIHRoZSBlbmQgKHNpbmNlIHRoYXQgaXMgd2hlcmUgaXQgbW9zdCBsaWtlbHkgd2lsbCBiZSkgYW5kIHN0YXJ0Ci0JCQkJLy8gc2VhcmNoLCByZW1vdmluZyB0aGUgZW5kIG9uZSB1bnRpbCB3ZSByZWFjaCB0aGUgbWFya0lELgotCQkJCWZvciAoaW50IGkgPSBzYXZlU3RhdGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCVNhdmVTdGF0ZSBzdGF0ZSA9IChTYXZlU3RhdGUpIHNhdmVTdGF0ZXMucmVtb3ZlKGkpOwotCQkJCQlpZiAoc3RhdGUubWFya0lEID09IG1hcmtJRCkgewotCQkJCQkJLy8gV2UgZm91bmQgaXQuCi0JCQkJCQlpZiAocmVzdG9yZSkKLQkJCQkJCQlzdGF0ZS5yZXN0b3JlU3RhdGUoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBCdXQgdG8gYmUgc2FmZSwgaWYgd2UgZ290IGhlcmUsIHRoaXMgaXMgYmFkLiBXZSB0cmllZCByZXN0b3JlIGEgbWFyayB3ZSBkaWRuJ3QgaGF2ZS4KLQkJCQlwcm9jZXNzU3ludGF4RXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW5pdHBhcnNlclRyZWVNZXNzYWdlcy5nZXRTdHJpbmcoIkV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaEVuZG1hcmsuRW5kTWFya09uTm9uRXhpc3RpbmdJRF9FWENfIiksIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihtYXJrSUQpfSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgaW50W10gc3ViZXhwcmVzc2lvbnM7CS8vIFN0YWNrIG9mIHN1YmV4cHJlc3Npb24gbnVtYmVycyBjdXJyZW50bHkgZXZhbHVhdGluZy4KLQlwcml2YXRlIGludFtdIHN1YmV4cHJlc3Npb25TdGFja1BvczsJLy8gU3RhY2sgb2YgdGhlIGV4cHJlc3Npb24gc3RhY2sgcG9zaXRpb25zIChuZXh0IGVudHJ5IGluZGV4KSBmb3IgY3VycmVudGx5IGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMuIFRoZSBldmFsdWF0aW9uIHN0YWNrIGNhbm5vdCBiZSBwb3BwZWQgYmV5b25kIHRoZSBjdXJyZW50IHRvcC4gQW5kIGF0IGVuZCBpdCB3aWxsIGJlIGNsZWFuZWQgdXAgdG8gdGhlIHBvc2l0aW9uLgotCXByaXZhdGUgaW50IHRvcFN1YmV4cHJlc3Npb24gPSAtMTsJLy8gVG9wIHN1YmV4cHJlc3Npb24gaW5kZXguCi0KLQkKLQkvKioKLQkgKiBQdXNoIGEgYmVnaW4gc3ViZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gc3ViZXhwcmVzc2lvbk51bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hTdWJleHByZXNzaW9uQmVnaW4oaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJaWYgKHRyYWNlT24pIHsKLQkJCXByaW50VHJhY2UoIkJlZ2luIFN1YmV4cHJlc3Npb24gIyIrc3ViZXhwcmVzc2lvbk51bWJlciwgZXJyb3JPY2N1cnJlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCWluZGVudCh0cnVlKTsKLQkJfQotCQl0cnkgewotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gV2UgYXJlIG5vdCBjaGVja2luZyBpZ25vcmUgYmVjYXVzZSB0aGlzIGlzIGEgc3RydWN0dXJhbCBjb25jZXB0IGluc3RlYWQgb2YgZXhlY3V0YWJsZSBleHByZXNzaW9ucywgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZXNlLgotCQkJaWYgKHN1YmV4cHJlc3Npb25zID09IG51bGwpIHsKLQkJCQlzdWJleHByZXNzaW9ucyA9IG5ldyBpbnRbMTBdOwotCQkJCXN1YmV4cHJlc3Npb25TdGFja1BvcyA9IG5ldyBpbnRbMTBdOwotCQkJfQotCQkJaWYgKCsrdG9wU3ViZXhwcmVzc2lvbiA+PSBzdWJleHByZXNzaW9ucy5sZW5ndGgpIHsKLQkJCQlpbnRbXSBuZXdMaXN0ID0gbmV3IGludFtzdWJleHByZXNzaW9ucy5sZW5ndGgqMl07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShzdWJleHByZXNzaW9ucywgMCwgbmV3TGlzdCwgMCwgc3ViZXhwcmVzc2lvbnMubGVuZ3RoKTsKLQkJCQlzdWJleHByZXNzaW9ucyA9IG5ld0xpc3Q7Ci0JCQkJbmV3TGlzdCA9IG5ldyBpbnRbc3ViZXhwcmVzc2lvblN0YWNrUG9zLmxlbmd0aCoyXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHN1YmV4cHJlc3Npb25TdGFja1BvcywgMCwgbmV3TGlzdCwgMCwgc3ViZXhwcmVzc2lvblN0YWNrUG9zLmxlbmd0aCk7Ci0JCQkJc3ViZXhwcmVzc2lvblN0YWNrUG9zID0gbmV3TGlzdDsJCQkJCi0JCQl9Ci0JCQlzdWJleHByZXNzaW9uc1t0b3BTdWJleHByZXNzaW9uXSA9IHN1YmV4cHJlc3Npb25OdW1iZXI7Ci0JCQlzdWJleHByZXNzaW9uU3RhY2tQb3NbdG9wU3ViZXhwcmVzc2lvbl0gPSBleHByZXNzaW9uU3RhY2suc2l6ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYSBzdWJleHByZXNzaW9uIGVuZC4gVGhlIGN1cnJlbnQgc3ViZXhwcmVzc2lvbiBtdXN0IGJlIHRoZSBnaXZlbiBudW1iZXIsIG9yIGl0IGlzIGFuIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSBzdWJleHByZXNzaW9uTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaFN1YmV4cHJlc3Npb25FbmQoaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCWlmICh0cmFjZU9uKSB7Ci0JCQkJaW5kZW50KGZhbHNlKTsKLQkJCQlwcmludFRyYWNlKCJFbmQgU3ViZXhwcmVzc2lvbiAjIitzdWJleHByZXNzaW9uTnVtYmVyLCBlcnJvck9jY3VycmVkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGVycm9yT2NjdXJyZWQpCi0JCQkJcmV0dXJuOwotCQkJLy8gV2UgYXJlIG5vdCBjaGVja2luZyBpZ25vcmUgYmVjYXVzZSB0aGlzIGlzIGEgc3RydWN0dXJhbCBjb25jZXB0IGluc3RlYWQgb2YgZXhlY3V0YWJsZSBleHByZXNzaW9ucywgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZXNlLgotCQkJaWYgKHN1YmV4cHJlc3Npb25zID09IG51bGwgfHwgdG9wU3ViZXhwcmVzc2lvbiA8IDAgfHwgc3ViZXhwcmVzc2lvbnNbdG9wU3ViZXhwcmVzc2lvbl0gIT0gc3ViZXhwcmVzc2lvbk51bWJlcikgewotCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmdldFN0cmluZygiRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoU3ViZXhwcmVzc2lvbkVuZC5SZWNlaXZlZEVuZFN1YmV4cHJlc3Npb25zT3V0T2ZPcmRlcl9FWENfIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlwb3BFeHByZXNzaW9ucyhleHByZXNzaW9uU3RhY2suc2l6ZSgpLXN1YmV4cHJlc3Npb25TdGFja1Bvc1t0b3BTdWJleHByZXNzaW9uXSk7Ci0JCQkJCXRvcFN1YmV4cHJlc3Npb24tLTsKLQkJCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXByb2Nlc3NTeW50YXhFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRyYWNlT24pCi0JCQkJcHJpbnRUcmFjZUVuZCgpOwotCQl9CQkJCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Gb3JFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvRm9yRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjM0NmZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Gb3JFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEZvckV4cHJlc3Npb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wNS8xOCAyMzoxMToyNiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLS8qKgotICogRW51bSBmb3IgdGhlIGZvckV4cHJlc3Npb24gcGFyYW1ldGVycy4KLSAqIDxwPgotICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBieSBjdXN0b21lcnMuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEZvckV4cHJlc3Npb24gZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYSByb290IGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST09URVhQUkVTU0lPTl9WQUxVRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gUk9PVEVYUFJFU1NJT04gPSBuZXcgRm9yRXhwcmVzc2lvbihST09URVhQUkVTU0lPTl9WQUxVRSwgIlJvb3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIGFycmF5IGV4cHJlc3Npb24gZm9yIGFuIGFycmF5IGFjY2VzcyAoaS5lLiB0aGUgYXJyYXkgdG8gYWNjZXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZQUNDRVNTX0FSUkFZX1ZBTFVFID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWUFDQ0VTU19BUlJBWSA9IG5ldyBGb3JFeHByZXNzaW9uKEFSUkFZQUNDRVNTX0FSUkFZX1ZBTFVFLCAiQXJyYXkgQWNjZXNzOiBBcnJheSBPcGVyYW5kIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIGFuIGluZGV4IGV4cHJlc3Npb24gZm9yIGFuIGFycmF5IGFjY2VzcyAoaS5lLiBvbmUgb2YgdGhlIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgPGNvZGU+W108L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWUFDQ0VTU19JTkRFWF9WQUxVRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gQVJSQVlBQ0NFU1NfSU5ERVggPSBuZXcgRm9yRXhwcmVzc2lvbihBUlJBWUFDQ0VTU19JTkRFWF9WQUxVRSwgIkFycmF5IEFjY2VzczogSW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYW4gZGltZW5zaW9uIGV4cHJlc3Npb24gZm9yIGFuIGFycmF5IGNyZWF0aW9uIChpLmUuIG9uZSBvZiB0aGUgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSA8Y29kZT5bXTwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZQ1JFQVRJT05fRElNRU5TSU9OX1ZBTFVFID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiA9IG5ldyBGb3JFeHByZXNzaW9uKEFSUkFZQ1JFQVRJT05fRElNRU5TSU9OX1ZBTFVFLCAiQXJyYXkgQWNjZXNzOiBEaW1lbnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgKGkuZS4gb25lIG9mIHRoZSBleHByZXNzaW9ucyB3aXRoIHRoZSA8Y29kZT57fTwvY29kZT4pLiBTcGVjaWFsIGNhc2UgaXMgdGhhdAotCSAqIGFycmF5IGluaXRpYWxpemVycyBhcmUgdmFsaWQgYXMgYW4gZXhwcmVzc2lvbiB3aXRoaW4gYW4gYXJyYXkgaW5pdGlhbGl6ZXIgYW5kIGl0IGRvZXNuJ3QgdXNlIGEgZm9yIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OX1ZBTFVFID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04gPSBuZXcgRm9yRXhwcmVzc2lvbihBUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUUsICJBcnJheSBJbml0aWFsaXplciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGNhc3QgKGkuZS4gdGhlIGV4cHJlc2lvbiBhZnRlciB0aGUgPGNvZGU+KHR5cGUpPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTVF9FWFBSRVNTSU9OX1ZBTFVFID0gNTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBDQVNUX0VYUFJFU1NJT04gPSBuZXcgRm9yRXhwcmVzc2lvbihDQVNUX0VYUFJFU1NJT05fVkFMVUUsICJDYXN0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBhcmd1bWVudCBleHByZXNzaW9uIGZvciB0aGUgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVF9WQUxVRSA9IDY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UID0gbmV3IEZvckV4cHJlc3Npb24oQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UX1ZBTFVFLAotCQkJIkNsYXNzIEluc3RhbmNlIENyZWF0aW9uOiBBcmd1bWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgY29uZGl0aW9uIGZvciBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OQUxfQ09ORElUSU9OX1ZBTFVFID0gNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBDT05ESVRJT05BTF9DT05ESVRJT04gPSBuZXcgRm9yRXhwcmVzc2lvbihDT05ESVRJT05BTF9DT05ESVRJT05fVkFMVUUsICJDb25kaXRpb25hbDogQ29uZGl0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSB0cnVlICh0aGVuKSBleHByZXNzaW9uIGZvciBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OQUxfVFJVRV9WQUxVRSA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gQ09ORElUSU9OQUxfVFJVRSA9IG5ldyBGb3JFeHByZXNzaW9uKENPTkRJVElPTkFMX1RSVUVfVkFMVUUsICJDb25kaXRpb25hbDogVHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgZmFsc2UgKGVsc2UpIGNvbmRpdGlvbiBmb3IgYSBjb25kaXRpb25hbCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFID0gOTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBDT05ESVRJT05BTF9GQUxTRSA9IG5ldyBGb3JFeHByZXNzaW9uKENPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFLCAiQ29uZGl0aW9uYWw6IEZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSByZWNlaXZlciBmb3IgYSBmaWVsZCBhY2Nlc3MgKGkuZS4gdGhlIGV4cHJlc3Npb24gYmVmb3JlIHRoZSAiLiIpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfUkVDRUlWRVJfVkFMVUUgPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBGSUVMRF9SRUNFSVZFUiA9IG5ldyBGb3JFeHByZXNzaW9uKEZJRUxEX1JFQ0VJVkVSX1ZBTFVFLCAiRmllbGQgQWNjZXNzOiBSZWNlaXZlciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgbGVmdCBvcGVyYW5kIG9mIGFuIGluZml4IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GSVhfTEVGVF9WQUxVRSA9IDExOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElORklYX0xFRlQgPSBuZXcgRm9yRXhwcmVzc2lvbihJTkZJWF9MRUZUX1ZBTFVFLCAiSW5maXg6IExlZnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIHJpZ2h0IG9wZXJhbmQgb2YgYW4gaW5maXggZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZJWF9SSUdIVF9WQUxVRSA9IDEyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElORklYX1JJR0hUID0gbmV3IEZvckV4cHJlc3Npb24oSU5GSVhfUklHSFRfVkFMVUUsICJJbmZpeDogUmlnaHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYW4gZXh0ZW5kZWQgb3BlcmFuZCBvZiBhbiBpbmZpeCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklYX0VYVEVOREVEX1ZBTFVFID0gMTM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gSU5GSVhfRVhURU5ERUQgPSBuZXcgRm9yRXhwcmVzc2lvbihJTkZJWF9FWFRFTkRFRF9WQUxVRSwgIkluZml4OiBFeHRlbmRlZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgdmFsdWUgZXhwcmVzc2lvbiBvZiBhbiBpbnN0YW5jZW9mLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTkNFT0ZfVkFMVUVfVkFMVUUgPSAxNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBJTlNUQU5DRU9GX1ZBTFVFID0gbmV3IEZvckV4cHJlc3Npb24oSU5TVEFOQ0VPRl9WQUxVRV9WQUxVRSwgIkluc3RhbmNlb2YiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgYSByZWNlaXZlciBleHByZXNzaW9uIGZvciBhIG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9SRUNFSVZFUl9WQUxVRSA9IDE1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIE1FVEhPRF9SRUNFSVZFUiA9IG5ldyBGb3JFeHByZXNzaW9uKE1FVEhPRF9SRUNFSVZFUl9WQUxVRSwgIk1ldGhvZCBJbnZva2U6IFJlY2VpdmVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIGFuIGFyZ3VtZW50IGZvciBhIG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9BUkdVTUVOVF9WQUxVRSA9IDE2OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIE1FVEhPRF9BUkdVTUVOVCA9IG5ldyBGb3JFeHByZXNzaW9uKE1FVEhPRF9BUkdVTUVOVF9WQUxVRSwgIk1ldGhvZCBJbnZva2U6IEFyZ3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBvcGVyYW5kIGV4cHJlc3Npb24gZm9yIGEgcHJlZml4IG9wZXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9PUEVSQU5EX1ZBTFVFID0gMTc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gUFJFRklYX09QRVJBTkQgPSBuZXcgRm9yRXhwcmVzc2lvbihQUkVGSVhfT1BFUkFORF9WQUxVRSwgIlByZWZpeDogT3BlcmFuZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgcmlnaHQgb3BlcmFuZCBvZiBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU0lHTk1FTlRfUklHSFRfVkFMVUUgPSAxODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBU1NJR05NRU5UX1JJR0hUID0gbmV3IEZvckV4cHJlc3Npb24oQVNTSUdOTUVOVF9SSUdIVF9WQUxVRSwgIkFzc2lnbm1lbnQ6IFJpZ2h0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBsZWZ0IG9wZXJhbmQgb2YgYW4gYXNzaWdubWVudCBvcGVyYXRvci4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgbGVmdCBleHByZXNzaW9uIGNhbiBvbmx5IGJlIGEgRmllbGRBY2Nlc3Mgb3IgQXJyYXlBY2Nlc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTSUdOTUVOVF9MRUZUX1ZBTFVFID0gMTk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gQVNTSUdOTUVOVF9MRUZUID0gbmV3IEZvckV4cHJlc3Npb24oQVNTSUdOTUVOVF9MRUZUX1ZBTFVFLCAiQXNzaWdubWVudDogTGVmdCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgdGhyb3cgb3BlcmFuZCBvZiB0aGUgdGhyb3cgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJPV19PUEVSQU5EX1ZBTFVFID0gMjA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gVEhST1dfT1BFUkFORCA9IG5ldyBGb3JFeHByZXNzaW9uKFRIUk9XX09QRVJBTkRfVkFMVUUsICJUaHJvdyBvcGVyYW5kIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGZvckV4cHJlc3Npb246IENyZWF0aW5nIHRoZSBpZiBjb25kaXRpb25hbCBvcGVyYW5kIG9mIHRoZSBpZiBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElGX0NPTkRJVElPTl9WQUxVRSA9IDIxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElGX0NPTkRJVElPTiA9IG5ldyBGb3JFeHByZXNzaW9uKElGX0NPTkRJVElPTl9WQUxVRSwgIklmIGNvbmRpdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBmb3JFeHByZXNzaW9uOiBDcmVhdGluZyB0aGUgaWYgdHJ1ZSBjbGF1c2Ugb2YgdGhlIGlmIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUZfVFJVRV9WQUxVRSA9IDIyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIElGX1RSVUUgPSBuZXcgRm9yRXhwcmVzc2lvbihJRl9UUlVFX1ZBTFVFLCAiSWYgdHJ1ZSBjbGF1c2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogZm9yRXhwcmVzc2lvbjogQ3JlYXRpbmcgdGhlIGlmIGVsc2UgY2xhdXNlIG9mIHRoZSBpZiBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElGX0VMU0VfVkFMVUUgPSAyMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBJRl9FTFNFID0gbmV3IEZvckV4cHJlc3Npb24oSUZfRUxTRV9WQUxVRSwgIklmIGVsc2UgY2xhdXNlIik7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIFRoaXMgaXMgbm90IHByaXZhdGUsIGJ1dCBwcm90ZWN0ZWQgb25seSBzbyB0aGF0IHByb3h5IGNvcmUgY2FuIGFkZCBhbiBpbnRlcm5hbCBGb3JFeHByZXNzaW9uIGVudW0uCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBieSBjdXN0b21lcnMuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRm9yRXhwcmVzc2lvbihpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSUV4cHJlc3Npb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JRXhwcmVzc2lvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWVkZDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JRXhwcmVzc2lvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUV4cHJlc3Npb25Db25zdGFudHMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0gCi0vKioKLSAqIFRoZXNlIGFyZSBjb25zdGFudHMgbmVlZGVkIGJ5IElFeHByZXNzaW9uIHRoYXQgd2lsbCBiZSBjb21tb24gYmV0d2VlbgotICogdGhlIHZtIGFuZCB0aGUgSURFLiBUaGV5IGFyZSBhbHNvIGF2YWlsYWJsZSB0byB1c2VycyBvZiB0aGUgSUV4cHJlc3Npb24KLSAqIGludGVyZmFjZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4cHJlc3Npb25Db25zdGFudHMgewotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0luZml4T3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbmZpeE9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYmUwMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0luZml4T3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSW5maXhPcGVyYXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA1LzE4IDIzOjExOjI2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotLyoqCi0gKiBFbnVtIGZvciBJbmZpeCBvcGVyYXRvcgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEluZml4T3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogSW5maXggdGltZXMgIioiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fVElNRVNfVkFMVUUgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX1RJTUVTID0gbmV3IEluZml4T3BlcmF0b3IoSU5fVElNRVNfVkFMVUUsICJJbmZpeCAqIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGRpdmlkZSAiLyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9ESVZJREVfVkFMVUUgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0RJVklERSA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0RJVklERV9WQUxVRSwgIkluZml4IC8iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggcmVtYWluZGVyICIlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX1JFTUFJTkRFUl9WQUxVRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fUkVNQUlOREVSID0gbmV3IEluZml4T3BlcmF0b3IoSU5fUkVNQUlOREVSX1ZBTFVFLCAiSW5maXggJSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBwbHVzICIrIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX1BMVVNfVkFMVUUgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX1BMVVMgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9QTFVTX1ZBTFVFLCAiSW5maXggKyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBtaW51cyAiLSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9NSU5VU19WQUxVRSA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fTUlOVVMgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9NSU5VU19WQUxVRSwgIkluZml4IC0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggbGVmdCBzaGlmdCAiIDwgPCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9MRUZUX1NISUZUX1ZBTFVFID0gNTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9MRUZUX1NISUZUID0gbmV3IEluZml4T3BlcmF0b3IoSU5fTEVGVF9TSElGVF9WQUxVRSwgIkluZml4IDw8Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IHJpZ2h0IHNoaWZ0IHNpZ25lZCAiPj4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fUklHSFRfU0hJRlRfU0lHTkVEX1ZBTFVFID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9SSUdIVF9TSElGVF9TSUdORUQgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9SSUdIVF9TSElGVF9TSUdORURfVkFMVUUsICJJbmZpeCA+PiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCByaWdodCBzaGlmdCB1bnNpZ25lZCAiPj4+IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX1JJR0hUX1NISUZUX1VOU0lHTkVEX1ZBTFVFID0gNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9SSUdIVF9TSElGVF9VTlNJR05FRCA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX1JJR0hUX1NISUZUX1VOU0lHTkVEX1ZBTFVFLCAiSW5maXggPj4+Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGxlc3MgIiA8IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0xFU1NfVkFMVUUgPSA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0xFU1MgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9MRVNTX1ZBTFVFLCAiSW5maXggPCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBncmVhdGVyICI+IgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0dSRUFURVJfVkFMVUUgPSA5OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbmZpeE9wZXJhdG9yIElOX0dSRUFURVIgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9HUkVBVEVSX1ZBTFVFLCAiSW5maXggPiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBsZXNzIHRoYW4gb3IgZXF1YWxzICIgPD0iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fTEVTU19FUVVBTFNfVkFMVUUgPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9MRVNTX0VRVUFMUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0xFU1NfRVFVQUxTX1ZBTFVFLCAiSW5maXggPD0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggR3JlYXRlciB0aGFuIG9yIGVxdWxhcyAiPj0iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fR1JFQVRFUl9FUVVBTFNfVkFMVUUgPSAxMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9HUkVBVEVSX0VRVUFMUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0dSRUFURVJfRVFVQUxTX1ZBTFVFLCAiSW5maXggPj0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggZXF1YWxzICI9PSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9FUVVBTFNfVkFMVUUgPSAxMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9FUVVBTFMgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9FUVVBTFNfVkFMVUUsICJJbmZpeCA9PSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBub3QgZXF1YWxzICIhPSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9OT1RfRVFVQUxTX1ZBTFVFID0gMTM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fTk9UX0VRVUFMUyA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX05PVF9FUVVBTFNfVkFMVUUsICJJbmZpeCAhPSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBleGNsdXNpdmUgb3IgIl4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fWE9SX1ZBTFVFID0gMTQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fWE9SID0gbmV3IEluZml4T3BlcmF0b3IoSU5fWE9SX1ZBTFVFLCAiSW5maXggXiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBiaXR3aXNlIGFuZCAiJiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9BTkRfVkFMVUUgPSAxNTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9BTkQgPSBuZXcgSW5maXhPcGVyYXRvcihJTl9BTkRfVkFMVUUsICJJbmZpeCAmIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZml4IGJpdHdpc2Ugb3IgInwiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fT1JfVkFMVUUgPSAxNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9PUiA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX09SX1ZBTFVFLCAiSW5maXggfCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBDb25kaXRpb25hbCBsb2dpY2FsIGFuZCAiJiYiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fQ09ORElUSU9OQUxfQU5EX1ZBTFVFID0gMTc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluZml4T3BlcmF0b3IgSU5fQ09ORElUSU9OQUxfQU5EID0gbmV3IEluZml4T3BlcmF0b3IoSU5fQ09ORElUSU9OQUxfQU5EX1ZBTFVFLCAiSW5maXggJiYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5maXggQ29uZGl0aW9uYWwgbG9naWNhbCBvciAifHwiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fQ09ORElUSU9OQUxfT1JfVkFMVUUgPSAxODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvciBJTl9DT05ESVRJT05BTF9PUiA9IG5ldyBJbmZpeE9wZXJhdG9yKElOX0NPTkRJVElPTkFMX09SX1ZBTFVFLCAiSWZuaXggfHwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmZpeCBvcGVyYXRvciBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWUuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5maXhPcGVyYXRvciBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSU5fVElNRVNfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1RJTUVTOwotCQkJY2FzZSBJTl9ESVZJREVfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX0RJVklERTsKLQkJCWNhc2UgSU5fUkVNQUlOREVSX1ZBTFVFOgotCQkJCXJldHVybiBJTl9SRU1BSU5ERVI7Ci0JCQljYXNlIElOX1BMVVNfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1BMVVM7Ci0JCQljYXNlIElOX01JTlVTX1ZBTFVFOgotCQkJCXJldHVybiBJTl9NSU5VUzsKLQkJCWNhc2UgSU5fTEVGVF9TSElGVF9WQUxVRToKLQkJCQlyZXR1cm4gSU5fTEVGVF9TSElGVDsKLQkJCWNhc2UgSU5fUklHSFRfU0hJRlRfU0lHTkVEX1ZBTFVFOgotCQkJCXJldHVybiBJTl9SSUdIVF9TSElGVF9TSUdORUQ7Ci0JCQljYXNlIElOX1JJR0hUX1NISUZUX1VOU0lHTkVEX1ZBTFVFOgotCQkJCXJldHVybiBJTl9SSUdIVF9TSElGVF9VTlNJR05FRDsKLQkJCWNhc2UgSU5fTEVTU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fTEVTUzsKLQkJCWNhc2UgSU5fR1JFQVRFUl9WQUxVRToKLQkJCQlyZXR1cm4gSU5fR1JFQVRFUjsKLQkJCWNhc2UgSU5fTEVTU19FUVVBTFNfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX0xFU1NfRVFVQUxTOwotCQkJY2FzZSBJTl9HUkVBVEVSX0VRVUFMU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fR1JFQVRFUl9FUVVBTFM7Ci0JCQljYXNlIElOX0VRVUFMU19WQUxVRToKLQkJCQlyZXR1cm4gSU5fRVFVQUxTOwotCQkJY2FzZSBJTl9OT1RfRVFVQUxTX1ZBTFVFOgotCQkJCXJldHVybiBJTl9OT1RfRVFVQUxTOwotCQkJY2FzZSBJTl9YT1JfVkFMVUU6Ci0JCQkJcmV0dXJuIElOX1hPUjsKLQkJCWNhc2UgSU5fQU5EX1ZBTFVFOgotCQkJCXJldHVybiBJTl9BTkQ7Ci0JCQljYXNlIElOX09SX1ZBTFVFOgotCQkJCXJldHVybiBJTl9PUjsKLQkJCWNhc2UgSU5fQ09ORElUSU9OQUxfQU5EX1ZBTFVFOgotCQkJCXJldHVybiBJTl9DT05ESVRJT05BTF9BTkQ7Ci0JCQljYXNlIElOX0NPTkRJVElPTkFMX09SX1ZBTFVFOgotCQkJCXJldHVybiBJTl9DT05ESVRJT05BTF9PUjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEluZml4T3BlcmF0b3IoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0luaXRwYXJzZXJUcmVlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Jbml0cGFyc2VyVHJlZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YzMwYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0luaXRwYXJzZXJUcmVlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEluaXRwYXJzZXJUcmVlTWVzc2FnZXMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNyaQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEluaXRwYXJzZXJUcmVlTWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEluaXRwYXJzZXJUcmVlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNmEyMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA1LzE4IDIzOjExOjI2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcyBmb3IgdGhlIENvbmRpdGlvbmFsIG9wZXJhbmQgdHlwZS4gTm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bSB7Ci0KLQkvKioKLQkgKiBVc2VkIGluIENvbmRpdGlvbmFsIHByb2Nlc3NpbmcuIEZhbHNlIG9wZXJhbmQgb24gZXhwcmVzc2lvbiBzdGFjawotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTkRJVElPTkFMX0ZBTFNFX1ZBTFVFID0gMDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIENPTkRJVElPTkFMX0ZBTFNFID0gbmV3IEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZShDT05ESVRJT05BTF9GQUxTRV9WQUxVRSwKLQkJCSJDb25kaXRpb25hbCBGYWxzZSBPcGVyYW5kIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVXNlZCBpbiBDb25kaXRpb25hbCBwcm9jZXNzaW5nLiBUcnVlIG9wZXJhbmQgb24gZXhwcmVzc2lvbiBzdGFjawotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTkRJVElPTkFMX1RSVUVfVkFMVUUgPSAxOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUgQ09ORElUSU9OQUxfVFJVRSA9IG5ldyBJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUoQ09ORElUSU9OQUxfVFJVRV9WQUxVRSwKLQkJCSJDb25kaXRpb25hbCBUcnVlIE9wZXJhbmQgRmxhZyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVc2VkIGluIENvbmRpdGlvbmFsIHByb2Nlc3NpbmcuIFRlc3Qgb3BlcmFuZCBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ORElUSU9OQUxfVEVTVF9WQUxVRSA9IDI7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBDT05ESVRJT05BTF9URVNUID0gbmV3IEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZShDT05ESVRJT05BTF9URVNUX1ZBTFVFLAotCQkJIkNvbmRpdGlvbmFsIFRlc3QgT3BlcmFuZCBGbGFnIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW51bSBmb3IgdGhlIGdpdmVuIHZhbHVlLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ09ORElUSU9OQUxfRkFMU0VfVkFMVUU6Ci0JCQkJcmV0dXJuIENPTkRJVElPTkFMX0ZBTFNFOwotCQkJY2FzZSBDT05ESVRJT05BTF9UUlVFX1ZBTFVFOgotCQkJCXJldHVybiBDT05ESVRJT05BTF9UUlVFOwotCQkJY2FzZSBDT05ESVRJT05BTF9URVNUX1ZBTFVFOgotCQkJCXJldHVybiBDT05ESVRJT05BTF9URVNUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxFeHByZXNzaW9uUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdkM2Y2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSW50ZXJuYWxFeHByZXNzaW9uUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0gCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgZXhwcmVzc2lvbiBwcm94aWVzIGluIHRoZSBldmFsdWF0aW9uIHNpZGUgKGluIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkV4cHJlc3Npb25Qcm9jZXNzZXJ9KS4KLSAqIDxwPgotICogSXQgaXMgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgb25seSBieSB1c2VycyBvZiB0aGUgRXhwcmVzc2lvblByb2Nlc3Nvci4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgewotCQotCS8qKgotCSAqIEdldCB0aGUgaWQgb2YgdGhlIHByb3h5LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByb3h5SUQoKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgYnkgRXhwcmVzc2lvblByb2Nlc3NlciB0byBnaXZlIHRoZSBleHByZXNzaW9uIHByb3h5IGl0cyB2YWx1ZSBhbmQgdHlwZSwgaS5lLiBpdCBoYXMgYmVlbiBldmFsdWF0ZWQuCi0JICogPHA+Ci0JICogVGhlIHR5cGUgbWF5IG5vdCBiZSB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIHZhbHVlLCBpdCBtYXkgYmUgYSBzdXBlcmNsYXNzIG9mIGl0LiBJdCBpcyB0aGUgdHlwZSB0aGF0IHRoZSBwcm94eQotCSAqIHJlcHJlc2VudHMgZnJvbSB0aGUgcmV0dXJuIG9mIHRoZSBleHByZXNzaW9uLiBGb3IgaW5zdGFuY2UgaXQgbWF5IG9mIHJldHVybmVkIG51bGwgYnV0IGl0IGlzIHN1cHBvc2VkIHRvIGJlCi0JICogamF2YS5sYW5nLlN0cmluZy4gT3IgaXQgaXMgc3VwcG9zZWQgdG8gYmUgYSBwcmltaXRpdmUgaW50LCBzaW5jZSB3ZSBjYW4ndCBzdG9yZSB0aGF0LCB3ZSBuZWVkIHRvIHN0b3JlCi0JICogYW4gSW50ZWdlciB2YWx1ZSB3aXRoIHRoZSB0eXBlIGluZGljYXRpbmcgaXQgaXMgSW50ZXJnZXIuVFlQRS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gdHlwZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3h5KE9iamVjdCB2YWx1ZSwgQ2xhc3MgdHlwZSk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJveHkuIAotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB2YWx1ZSBtYXkgYmUgYSB7QGxpbmsgVmFyaWFibGVSZWZlcmVuY2V9LCBpbiB3aGljaAotCSAqIGNhc2UgZnVydGhlciBkZXJlZmVyZW5jaW5nIG1heSBiZSB3aXRoIHRoZSByZXR1cm5lZCB2YWx1ZS4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJveHksIGl0IG1heSBiZSBhbiBFeHByZXNzaW9uUHJvY2Vzc2VyLlZhcmlhYmxlUmVmZXJlbmNlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHR5cGUgb2YgdGhlIHByb3h5LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2VlIEludGVybmFsRXhwcmVzc2lvblByb3h5I3NldFByb3h5KE9iamVjdCwgQ2xhc3MpIGZvciB3aGF0IHR5cGUgbWVhbnMuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIENsYXNzIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm94eSBoYXMgaGFkIGEgdmFsdWUvY2xhc3Mgc2V0IGludG8gaXQgeWV0LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaGFzIGJlZW4gc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWEzNWVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotLyoqCi0gKiBUaGVzZSBjb25zdGFudHMgYXJlIGZvciBjb21tdW5pY2F0aW5nIGJldHdlZW4gdGhlIElERSBhbmQgdGhlIHByb3h5IHNpZGUgZm9yIGV4cHJlc3Npb24gZXZhbHVhdGlvbi4gSXQgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgYnkgY3VzdG9tZXJzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsRXhwcmVzc2lvblR5cGVzIGV4dGVuZHMgQWJzdHJhY3RFbnVtIHsKLQotCS8qKgotCSAqIEFSUkFZIEFDQ0VTUyBFeHByZXNzaW9uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVJSQVlfQUNDRVNTX0VYUFJFU1NJT05fVkFMVUUgPSAxOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBBUlJBWV9BQ0NFU1NfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhBUlJBWV9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJBcnJheSBBY2Nlc3MgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBUlJBWSBDUkVBVElPTiBFeHByZXNzaW9uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVJSQVlfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRSA9IDI7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEFSUkFZX0NSRUFUSU9OX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQVJSQVlfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJBcnJheSBDcmVhdGlvbiBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFSUkFZIElOSVRJQUxJWkVSIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBUlJBWV9JTklUSUFMSVpFUl9FWFBSRVNTSU9OX1ZBTFVFID0gMzsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgQVJSQVlfSU5JVElBTElaRVJfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhBUlJBWV9JTklUSUFMSVpFUl9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkFycmF5IEluaXRpYWxpemVyIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ0FTVCBFeHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENBU1RfRVhQUkVTU0lPTl9WQUxVRSA9IDQ7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIENBU1RfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhDQVNUX0VYUFJFU1NJT05fVkFMVUUsICJDYXN0IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ09ORElUSU9OQUwgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTkRJVElPTkFMX0VYUFJFU1NJT05fVkFMVUUgPSA1OwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBDT05ESVRJT05BTF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKENPTkRJVElPTkFMX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQ29uZGl0aW9uYWwgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDTEFTUyBJTlNUQU5DRSBDUkVBVElPTiBleHByZXNzaW9uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRSA9IDY7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIENMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoCi0JCQlDTEFTU19JTlNUQU5DRV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFLCAiQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb24gRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGSUVMRCBBQ0NFU1MgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGSUVMRF9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRSA9IDc7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIEZJRUxEX0FDQ0VTU19FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEZJRUxEX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkZpZWxkIEFjY2VzcyBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElOU1RBTkNFT0YgRXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTlNUQU5DRU9GX0VYUFJFU1NJT05fVkFMVUUgPSA4OwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBJTlNUQU5DRU9GX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoSU5TVEFOQ0VPRl9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkluc3RhbmNlb2YgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmZpeCBleHByZXNzaW9uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5GSVhfRVhQUkVTU0lPTl9WQUxVRSA9IDk7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIElORklYX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoSU5GSVhfRVhQUkVTU0lPTl9WQUxVRSwgIkluZml4IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWV0aG9kIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUVUSE9EX0VYUFJFU1NJT05fVkFMVUUgPSAxMDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgTUVUSE9EX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoTUVUSE9EX0VYUFJFU1NJT05fVkFMVUUsICJNZXRob2QgSW52b2tlIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZml4IGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQUkVGSVhfRVhQUkVTU0lPTl9WQUxVRSA9IDExOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQUkVGSVhfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhQUkVGSVhfRVhQUkVTU0lPTl9WQUxVRSwgIlByZWZpeCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQVVNIX1RPX1BST1hZX0VYUFJFU1NJT05fVkFMVUUgPSAxMjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgUFVTSF9UT19QUk9YWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFBVU0hfVE9fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJQdXNoIHRvIFByb3h5IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHVzaCBCZWFuVHlwZSBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUFVTSF9CRUFOVFlQRV9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSA9IDEzOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgUFVTSF9CRUFOVFlQRV9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhQVVNIX0JFQU5UWVBFX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggQmVhblR5cGUgRXhwcmVzc2lvblByb3h5IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCi0JLyoqCi0JICogVHlwZSByZWNlaXZlciBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRZUEVSRUNFSVZFUl9FWFBSRVNTSU9OX1ZBTFVFID0gMTQ7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRZUEVSRUNFSVZFUl9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFRZUEVSRUNFSVZFUl9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlR5cGUgUmVjZWl2ZXIgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBc3NpZ25tZW50IHRvIGFuIEV4cHJlc3Npb25Qcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFTU0lHTk1FTlRfUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSA9IDE1OwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBBU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQVNTSUdOTUVOVF9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkFzc2lnbm1lbnQgdG8gUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIGV4cHJlc3Npb24gcHJveHkgdmFsdWUgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQVVNIX1RPX0VYUFJFU1NJT05fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSA9IDE2OwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQVVNIX1RPX0VYUFJFU1NJT05fUFJPWFlfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcygKLQkJCVBVU0hfVE9fRVhQUkVTU0lPTl9QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFLCAiUHVzaCB0byBFeHByZXNzaW9uIFByb3h5IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQXNzaWdubWVudCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFTU0lHTk1FTlRfRVhQUkVTU0lPTl9WQUxVRSA9IDE3OwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBBU1NJR05NRU5UX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQVNTSUdOTUVOVF9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkFzc2lnbm1lbnQgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCbG9jayBFbmQgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCTE9DS19CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFID0gMTg7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBCTE9DS19CRUdJTl9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEJMT0NLX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQmVnaW4gYmxvY2sgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCbG9jayBFbmQgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCTE9DS19CUkVBS19FWFBSRVNTSU9OX1ZBTFVFID0gMTk7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBCTE9DS19CUkVBS19FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKEJMT0NLX0JSRUFLX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiQnJlYWsgYmxvY2sgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCbG9jayBFbmQgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCTE9DS19FTkRfRVhQUkVTU0lPTl9WQUxVRSA9IDIwOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgQkxPQ0tfRU5EX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoQkxPQ0tfRU5EX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiRW5kIGJsb2NrIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVHJ5IEJlZ2luIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFJZX0JFR0lOX0VYUFJFU1NJT05fVkFMVUUgPSAyMTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIFRSWV9CRUdJTl9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFRSWV9CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkJlZ2luIHRyeSBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRyeSBDYXRjaCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRSWV9DQVRDSF9FWFBSRVNTSU9OX1ZBTFVFID0gMjI7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBUUllfQ0FUQ0hfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhUUllfQ0FUQ0hfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJUcnkgY2F0Y2ggRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVHJ5IEZpbmFsbHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBUUllfRklOQUxMWV9FWFBSRVNTSU9OX1ZBTFVFID0gMjM7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBUUllfRklOQUxMWV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFRSWV9GSU5BTExZX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiVHJ5IGZpbmFsbHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUcnkgRW5kIGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVFJZX0VORF9FWFBSRVNTSU9OX1ZBTFVFID0gMjQ7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBUUllfRU5EX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoVFJZX0VORF9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIkVuZCB0cnkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhyb3cgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBUSFJPV19FWFBSRVNTSU9OX1ZBTFVFID0gMjU7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBUSFJPV19FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFRIUk9XX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiVGhyb3cgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXRocm93IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVUSFJPV19FWFBSRVNTSU9OX1ZBTFVFID0gMjY7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBSRVRIUk9XX0VYUFJFU1NJT04gPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoUkVUSFJPV19FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlJldGhyb3cgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIE1ldGhvZCBMb29rdXAgZXhwcmVzc2lvbiBwcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBVU0hfTUVUSE9EX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFID0gMjc7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBQVVNIX01FVEhPRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhQVVNIX01FVEhPRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJQdXNoIE1ldGhvZCBFeHByZXNzaW9uUHJveHkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIEZpZWxkIExvb2t1cCBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUFVTSF9GSUVMRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSA9IDI4OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgUFVTSF9GSUVMRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTiA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhQVVNIX0ZJRUxEX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFLAotCQkJIlB1c2ggRmllbGQgRXhwcmVzc2lvblByb3h5IEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHVzaCBJZi9lbHNlICh0aGUgY2xhdXNlcykgZXhwcmVzc2lvbiBwcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElGX0VMU0VfRVhQUkVTU0lPTl9WQUxVRSA9IDI5OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgSUZfRUxTRV9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKElGX0VMU0VfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJQdXNoIElmL2Vsc2UgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIElmL2Vsc2UgY29uZGl0aW9uIHRlc3QgZXhwcmVzc2lvbiBwcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElGX1RFU1RfRVhQUkVTU0lPTl9WQUxVRSA9IDMwOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgSUZfVEVTVF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKElGX1RFU1RfRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJQdXNoIElmIFRlc3QgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFB1c2ggbmV3IGluc3RhbmNlIGZyb20gaW5pdCBzdHJpbmcgcHJveHkgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBORVdfSU5TVEFOQ0VfVkFMVUUgPSAzMTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIE5FV19JTlNUQU5DRSA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhORVdfSU5TVEFOQ0VfVkFMVUUsCi0JCQkiUHVzaCBOZXcgSW5zdGFuY2UgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFB1c2ggbWFyayBwcm94eSBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1BUktfVkFMVUUgPSAzMjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsRXhwcmVzc2lvblR5cGVzIE1BUksgPSBuZXcgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMoTUFSS19WQUxVRSwKLQkJCSJQdXNoIE1hcmsgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQdXNoIGVuZCBtYXJrIHByb3h5IGV4cHJlc3Npb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5ETUFSS19WQUxVRSA9IDMzOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgRU5ETUFSSyA9IG5ldyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhFTkRNQVJLX1ZBTFVFLAotCQkJIlB1c2ggRW5kIE1hcmsgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdWJleHByZXNzaW9uIEVuZCBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNVQkVYUFJFU1NJT05fQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSA9IDM0OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMgU1VCRVhQUkVTU0lPTl9CRUdJTl9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFNVQkVYUFJFU1NJT05fQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSwKLQkJCSJCZWdpbiBTdWJleHByZXNzaW9uIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3ViZXhwcmVzc2lvbiBFbmQgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVUJFWFBSRVNTSU9OX0VORF9FWFBSRVNTSU9OX1ZBTFVFID0gMzU7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyBTVUJFWFBSRVNTSU9OX0VORF9FWFBSRVNTSU9OID0gbmV3IEludGVybmFsRXhwcmVzc2lvblR5cGVzKFNVQkVYUFJFU1NJT05fRU5EX0VYUFJFU1NJT05fVkFMVUUsCi0JCQkiRW5kIFN1YmV4cHJlc3Npb24gRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJpdmF0ZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcyhpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9JbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNDhhNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDUvMTggMjM6MTE6MjYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi0vKioKLSAqIEludGVybmFsIGNsYXNzIGZvciB0aGUgSWYvZWxzZSBvcGVyYW5kIHR5cGUuIE5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtIHsKLQotCS8qKgotCSAqIFVzZWQgaW4gSWYvZWxzZSBwcm9jZXNzaW5nLiBGYWxzZSBjbGF1c2Ugb24gZXhwcmVzc2lvbiBzdGFjawotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVMU0VfQ0xBVVNFX1ZBTFVFID0gMDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSBFTFNFX0NMQVVTRSA9IG5ldyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlKEVMU0VfQ0xBVVNFX1ZBTFVFLAotCQkJIkVsc2UgQ2xhdXNlIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVXNlZCBpbiBJZi9lbHNlIHByb2Nlc3NpbmcuIElmIG9wZXJhbmQgb24gZXhwcmVzc2lvbiBzdGFjawotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRSVUVfQ0xBVVNFX1ZBTFVFID0gMTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSBUUlVFX0NMQVVTRSA9IG5ldyBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlKFRSVUVfQ0xBVVNFX1ZBTFVFLAotCQkJIklmIFRydWUgQ2xhdXNlIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnVtIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgRUxTRV9DTEFVU0VfVkFMVUU6Ci0JCQkJcmV0dXJuIEVMU0VfQ0xBVVNFOwotCQkJY2FzZSBUUlVFX0NMQVVTRV9WQUxVRToKLQkJCQlyZXR1cm4gVFJVRV9DTEFVU0U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjIwZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL0ludGVybmFsSW5maXhPcGVyYW5kVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA1LzE4IDIzOjExOjI2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcyBmb3IgdGhlIFByZWZpeCBvcGVyYW5kIHR5cGUuIE5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtIHsKLQotCS8qKgotCSAqIFVzZWQgaW4gSW5maXggcHJvY2Vzc2luZy4gTGVmdCBvcGVyYW5kIG9uIGV4cHJlc3Npb24gc3RhY2sKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZJWF9MRUZUX09QRVJBTkRfVkFMVUUgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlIElORklYX0xFRlRfT1BFUkFORCA9IG5ldyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUoSU5GSVhfTEVGVF9PUEVSQU5EX1ZBTFVFLCAiSW5maXggTGVmdCBPcGVyYW5kIEZsYWciKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFVzZWQgaW4gSW5maXggcHJvY2Vzc2luZy4gT3RoZXIgb3BlcmFuZCAoYnV0IG5vdCBsYXN0KSBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5GSVhfT1RIRVJfT1BFUkFORF9WQUxVRSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUgSU5GSVhfT1RIRVJfT1BFUkFORCA9IG5ldyBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUoSU5GSVhfT1RIRVJfT1BFUkFORF9WQUxVRSwKLQkiSW5maXggT3RoZXIgT3BlcmFuZCBGbGFnIik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBVc2VkIGluIEluZml4IHByb2Nlc3NpbmcuIFJpZ2h0bW9zdCAobGFzdCkgb3BlcmFuZCBvbiBleHByZXNzaW9uIHN0YWNrCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5GSVhfTEFTVF9PUEVSQU5EX1ZBTFVFID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIEludGVybmFsSW5maXhPcGVyYW5kVHlwZSBJTkZJWF9MQVNUX09QRVJBTkQgPSBuZXcgSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlKElORklYX0xBU1RfT1BFUkFORF9WQUxVRSwgIkluZml4IExhc3QgT3BlcmFuZCBGbGFnIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW51bSBmb3IgdGhlIGdpdmVuIHZhbHVlLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVybmFsSW5maXhPcGVyYW5kVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSU5GSVhfTEFTVF9PUEVSQU5EX1ZBTFVFOgotCQkJCXJldHVybiBJTkZJWF9MQVNUX09QRVJBTkQ7Ci0JCQljYXNlIElORklYX0xFRlRfT1BFUkFORF9WQUxVRToKLQkJCQlyZXR1cm4gSU5GSVhfTEVGVF9PUEVSQU5EOwotCQkJY2FzZSBJTkZJWF9PVEhFUl9PUEVSQU5EX1ZBTFVFOgotCQkJCXJldHVybiBJTkZJWF9PVEhFUl9PUEVSQU5EOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEludGVybmFsSW5maXhPcGVyYW5kVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWU2YTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDcvMjAgMTk6Mjc6MjUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlOwotIAotCi0vKioKLSAqIFRoZSBleHByZXNzaW9uIChvciBzb21lIG5lc3RlZCBleHByZXNzaW9uKSBkaWQgbm90IHJldHVybiBhIHZhbHVlLiBJLmUuIGl0IHdhcyA8Y29kZT52b2lkPC9jb2RlPi4KLSAqIFRoaXMgd291bGQgb2NjdXIgb25seSBpZiB0aGUgdmFsdWUgb2YgZXhwcmVzc2lvbiB3YXMgYmVpbmcgcmV0cmlldmVkIHRocm91Z2ggZ2V0RXhwcmVzc2lvblZhbHVlLAotICogb3IgaWYgYSBuZXN0ZWQgZXhwcmVzc2lvbiB3YXMgdXNlZCwgc2luY2UgaW4gdGhhdCBjYXNlIHRoZSB2YWx1ZSB3b3VsZCBvZiBiZWVuIHVzZWQgYXMgYW4KLSAqIGFyZ3VtZW50IG9yIHJlY2VpdmVyIHRvIGFub3RoZXIgZXhwcmVzc2lvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzk1MzEwMTg2Nzc4MjQxNzk2NEw7Ci0JCi0JcHJpdmF0ZSBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBwcm94eTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIG5vIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJdGhpcyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBtZXNzYWdlIGFuZCBhIHByb3h5LiBUaGlzIGlzIG9ubHkgdXNlZCBmcm9tIHtAbGluayBFeHByZXNzaW9uUHJvY2Vzc2VyI2dldEV4cHJlc3Npb25Qcm94eVZhbHVlKGludCwgT2JqZWN0W10pfSB3aGVuCi0JICogdGhlIHByb3h5IGV4aXN0ZWQgYnV0IGl0IHdhcyBub3Qgc2V0LgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIHByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSBwcm94eSkgewotCQlzdXBlciAobWVzc2FnZSk7Ci0JCXRoaXMucHJveHkgPSBwcm94eTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBwcm94eSBpZiB0aGVyZSBpcyBvbmUuIEl0IHdpbGwgYmUgYSBwcm94eSBpZiB7QGxpbmsgRXhwcmVzc2lvblByb2Nlc3NlciNnZXRFeHByZXNzaW9uUHJveHlWYWx1ZShpbnQsIE9iamVjdFtdKX0KLQkgKiB3YXMgZm9yIGFuIGV4aXN0aW5nIHByb3h5IGJ1dCB0aGF0IHByb3h5IHdhcyBub3Qgc2V0LiBPdGhlcndpc2UgaXQgd2lsbCBiZSBudWxsLiBUaGlzIGlzIGhlcmUgZm9yIGNhbGxlcnMgdG8KLQkgKiBwdXQgc3BlY2lhbCBpbmZvIGluIHRoZSBwcm94eSBmb3IgdGhlIG5vdCBzZXQgY29uZGl0aW9uIGFuZCByZXBvcnQgYmV0dGVyIGluZm8uCi0JICogCi0JICogQHJldHVybiB0aGUgcHJveHkgKGlmIG5vdCBzZXQpIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb3h5IGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgZ2V0UHJveHkoKSB7Ci0JCXJldHVybiBwcm94eTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL1ByZWZpeE9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvUHJlZml4T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMGEzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvUHJlZml4T3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQcmVmaXhPcGVyYXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA1LzE4IDIzOjExOjI2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotLyoqCi0gKiBFbnVtIGZvciBwcmVmaXggb3BlcmF0b3IuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZml4T3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVudW0gewotCi0JLyoqCi0JICogUHJlZml4IHBsdXMgIisiCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1BMVVNfVkFMVUUgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVmaXhPcGVyYXRvciBQUkVfUExVUyA9IG5ldyBQcmVmaXhPcGVyYXRvcihQUkVfUExVU19WQUxVRSwgIlByZWZpeCArIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZpeCBtaW51cyAiLSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfTUlOVVNfVkFMVUUgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVmaXhPcGVyYXRvciBQUkVfTUlOVVMgPSBuZXcgUHJlZml4T3BlcmF0b3IoUFJFX01JTlVTX1ZBTFVFLCAiUHJlZml4IC0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZml4IGJpdHdpc2UgY29tcGxlbWVudCAifiIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfQ09NUExFTUVOVF9WQUxVRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZpeE9wZXJhdG9yIFBSRV9DT01QTEVNRU5UID0gbmV3IFByZWZpeE9wZXJhdG9yKFBSRV9DT01QTEVNRU5UX1ZBTFVFLCAiUHJlZml4IH4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZml4IGxvZ2ljYWwgbm90ICIhIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9OT1RfVkFMVUUgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVmaXhPcGVyYXRvciBQUkVfTk9UID0gbmV3IFByZWZpeE9wZXJhdG9yKFBSRV9OT1RfVkFMVUUsICJQcmVmaXggISIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByZWZpeCBvcGVyYXRvciBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWUuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJlZml4T3BlcmF0b3IgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFBSRV9QTFVTX1ZBTFVFOgotCQkJCXJldHVybiBQUkVfUExVUzsKLQkJCWNhc2UgUFJFX01JTlVTX1ZBTFVFOgotCQkJCXJldHVybiBQUkVfTUlOVVM7Ci0JCQljYXNlIFBSRV9DT01QTEVNRU5UX1ZBTFVFOgotCQkJCXJldHVybiBQUkVfQ09NUExFTUVOVDsKLQkJCWNhc2UgUFJFX05PVF9WQUxVRToKLQkJCQlyZXR1cm4gUFJFX05PVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFByZWZpeE9wZXJhdG9yKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9WYXJpYWJsZVJlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL1ZhcmlhYmxlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWYyYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvaW5pdFBhcnNlci9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaW5pdFBhcnNlci90cmVlL1ZhcmlhYmxlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBWYXJpYWJsZVJlZmVyZW5jZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLQotLyoqCi0gKiBUaGlzIHJlcHJlc2VudHMgYSBWYXJpYWJsZSBSZWZlcmVuY2UgdmFsdWUuIEEgdmFyaWFibGUgcmVmZXJlbmNlIHZhbHVlIGNhbiBiZSBvbiB0aGUgbGVmdAotICogc2lkZSBvZiBhbiBhc3NpZ25tZW50IChlLmcuIGZpZWxkIG9yIGFycmF5IGFjY2Vzcykgb3Igb24gYW55IHNpZGUKLSAqIG9mIGFueSBleHByZXNzaW9uLiBXaGVuIG9uIHRoZSBsZWZ0IHNpZGUgb2YgYW4gYXNzaWdubWVudCwgdGhlbiB0aGUKLSAqIHZhbHVlIGNhbiBhc3NpZ25lZCB0by4gU3VjaCBhcyA8Y29kZT54WzNdID0gNDwvY29kZT4uIE9yIGl0IGlzIHZhbHVlCi0gKiB0aGF0IGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zLCBzdWNoIGFzIDxjb2RlPnhbM10gKyAyPC9jb2RlPi4KLSAqIDxwPgotICogV2hlbiBkZXJlZmVyZW5jZWQsIHRoZSB2YWx1ZSBpcyBnaXZlbiAoc2VlIHtAbGluayBWYXJpYWJsZVJlZmVyZW5jZSNkZXJlZmVyZW5jZSgpfSkgYXMKLSAqIHRoZSByZXN1bHQgb3IgaXQgaXMgc2V0IHdpdGggYSB2YWx1ZSBhbmQgdGhlbiBkZWZlcmVuY2VkIChzZWUge0BsaW5rIFZhcmlhYmxlUmVmZXJlbmNlI3NldChPYmplY3QsIENsYXNzKX0pLgotICogPHA+Ci0gKiBUaGUgdHlwZSBvZiB0aGUgcmVmZXJlbmNlIGlzIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uVHlwZVN0YWNrIGVudHJ5LiBUaGlzIGlzIHRoZSB0eXBlCi0gKiBmb3IgYXNzaWdubWVudCwgYW5kIHRoZSB0eXBlIGZvciBkZXJlZmVyZW5jZWQuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlUmVmZXJlbmNlIHsKLQotCS8qKgotCSAqIERlcmVmZXJlbmNlIHRoZSB2YWx1ZS4gCi0JICogQHJldHVybiB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlLiBTdWNoIGFzIHRoZSByZXN1bHQgb2YgPGNvZGU+eFszXTwvY29kZT4uIFRoZSB0eXBlIG9mIHRoZSByZWZlcmVuY2UgCi0JICogaXMgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25UeXBlU3RhY2sgZW50cnkgZm9yIHRoaXMgcmVmZXJlbmNlLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBkZXJlZmVyZW5jZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgaW50byB0aGUgdmFyaWFibGUgYW5kIGRlcmVmZXJlbmNlIGl0LiBPbmNlIGl0IGlzIHNldCBpdCBpcwotCSAqIG5vIGxvbmdlciBhIHJlZmVyZW5jZSBhbmQgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCi0JICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHNldCB0by4KLQkgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBzZXQuIEl0IG1heSBiZSBvZiB1c2UgdG8gdGhlIHJlZmVyZW5jZSBvciBtYXliZSBub3QuCi0JICogQHJldHVybiB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlIGFmdGVyIGJlaW5nIHNldC4gVGhlIHR5cGUgb2YgdGhlIGRlcmVmZXJlbmNlZCB2YWx1ZSAKLQkgKiBpcyB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblR5cGVTdGFjayBlbnRyeSBmb3IgdGhpcyByZWZlcmVuY2UuCi0JICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHNldChPYmplY3QgdmFsdWUsIENsYXNzIHR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9pbml0UGFyc2VyL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pbml0UGFyc2VyL3RyZWUvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTY4NDBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L2luaXRQYXJzZXIvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUV4cHJlc3Npb25Qcm9jZXNzZXIuQ2Fubm90Q2FzdFhUb1lfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNTZFIENhbm5vdCBjYXN0ICJ7MH0iIHRvIGJlICJ7MX0iLgotRXhwcmVzc2lvblByb2Nlc3Nlci5JbnZhbGlkT3BlcmFuZE9mUHJlZml4T3BlcmF0b3JfRVhDXyAgICAgICAgICAgPSBJV0FWMDE1N0UgezB9IG5vdCB2YWxpZCBhcyB0aGUgb3BlcmFuZCBvZiBwcmVmaXggb3BlcmF0b3IgInsxfSIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlBvcEV4cHJlc3Npb25UeXBlLkV4cHJlc3Npb25Wb2lkX0VYQ189RXhwcmVzc2lvbiB3YXMgdm9pZC4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuSW52YWxpZE9wZXJhbmRPZk9wZXJhdG9yX0VYQ18gICAgICAgICAgICAgICAgID0gSVdBVjAxNThFIHswfSBub3QgdmFsaWQgYXMgdGhlIG9wZXJhbmQgb2Ygb3BlcmF0b3IgInsxfSIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlhJc0dyZWF0ZXJUaGFuTnVtYmVyT2ZEaW1lbnNpb25zSW5BcnJheV9FWENfICA9IElXQVYwMTU5RSB7MH0gaXMgZ3JlYXRlciB0aGVuIG51bWJlciBvZiBkaW1lbnNpb25zICh7MX0pIGluIHRoZSBhcnJheQotRXhwcmVzc2lvblByb2Nlc3Nlci5DcmVhdGVBcnJheUFjY2Vzc1JlZmVyZW5jZS5PdXRPZkJvdW5kc19FWENfPUluZGV4OiB7MH0gc2l6ZTp7MX0KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeUVuZC5UcnlFbmRSZWNlaXZlZE91dE9mT3JkZXJfRVhDXz1UcnkvZW5kIHJlY2VpdmVkIG91dCBvZiBvcmRlci4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaEVuZG1hcmsuRW5kTWFya09uTm9uRXhpc3RpbmdJRF9FWENfPVRyaWVkIHRvIGRvIGFuIGVuZCBtYXJrIG9uIGEgbm9uLWV4aXN0aW5nIG1hcmtJRCAoezB9KQotRXhwcmVzc2lvblByb2Nlc3Nlci5Ob3RBbkFycmF5X0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE2MEUgInswfSIgaXMgbm90IGFuIGFycmF5LgotRXhwcmVzc2lvblByb2Nlc3Nlci5BcnJheXR5cGVIYXNGZXdlckRpbWVuc2lvbnNUaGFuUmVxdWVzdGVkX0VYQ18gPSBJV0FWMDE2MUUgQXJyYXl0eXBlICJ7MH0iIGhhcyBmZXdlciBkaW1lbnNpb25zIHRoYW4gY3JlYXRpb24gcmVxdWVzdGVkICh7MX0pLgotRXhwcmVzc2lvblByb2Nlc3Nlci5DcmVhdGVGaWVsZEFjY2Vzc1JlZmVyZW5jZS5GaWVsZHNUeXBlc05vdE1hdGNoaW5nX0VYQ189RmllbGQgcmVjZWl2ZXIgZG9lcyBub3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGZpZWxkOiBGaWVsZDogezB9IHJlY2VpdmVyOiB7MX0KLUV4cHJlc3Npb25Qcm9jZXNzZXIuR2V0RXhwcmVzc2lvblByb3h5VmFsdWUuRXhwcmVzc2lvblByb3h5Tm90U2V0X0VYQ189RXhwcmVzc2lvbiBQcm94eSBuZXZlciBzZXQuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLkdldEV4cHJlc3Npb25Qcm94eVZhbHVlLkV4cHJlc3Npb25Qcm94eURvZXNudEV4aXN0X0VYQ189RXhwcmVzc2lvbiBwcm94eSBkb2Vzbid0IGV4aXN0LgotRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoQmxvY2tFbmQuUmVjZWl2ZWRFbmRCbG9ja3NPdXRPZk9yZGVyX0VYQ189RW5kIEJsb2NrcyByZWNlaXZlZCBvdXQgb2Ygb3JkZXIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlDYXRjaENsYXVzZS5DYXRjaFJlY2VpdmVkT3V0T2ZPcmRlcl9FWENfPUNhdGNoIHJlY2VpdmVkIG91dCBvZiBvcmRlci4KLUV4cHJlc3Npb25Qcm9jZXNzZXIuUHVzaFRyeUZpbmFsbHlDbGF1c2UuRmluYWxseVJlY2VpdmVkT3V0T2ZPcmRlcl9FWENfPUZpbmFsbHkgcmVjZWl2ZWQgb3V0IG9mIG9yZGVyLgotRXhwcmVzc2lvblByb2Nlc3Nlci5QdXNoVHJ5UmV0aHJvdy5SZXRocm93UmVjZWl2ZWRPdXRPZk9yZGVyX0VYQ189UmV0aHJvdyByZWNlaXZlZCBvdXQgb2Ygb3JkZXIuCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hUcnlSZXRocm93LlJldHJ5UmVjZWl2ZWRPdXRPZkV4ZWN1dGluZ0NhdGNoQ2xhdXNlX0VYQ189UmV0cnkgcmVjZWl2ZWQgb3V0c2lkZSBvZiBhbiBleGVjdXRpbmcgY2F0Y2ggY2xhdXNlCi1FeHByZXNzaW9uUHJvY2Vzc2VyLlB1c2hTdWJleHByZXNzaW9uRW5kLlJlY2VpdmVkRW5kU3ViZXhwcmVzc2lvbnNPdXRPZk9yZGVyX0VYQ189RW5kIFN1YmV4cHJlc3Npb25zIHJlY2VpdmVkIG91dCBvZiBvcmRlci4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwN2RmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQKLSMKLQotCi1wbHVnaW5OYW1lPUphdmEgRU1GIE1vZGVsIFByb3h5IFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1jb250cmlidXRvcnMuZXh0ZW5zaW9ucG9pbnQubmFtZT1Qcm94eSBjb25maWd1cmF0aW9uIGNvbnRyaWJ1dG9ycwotZXh0ZW5zaW9ucy5leHRlbnNpb25wb2ludC5uYW1lPVByb3h5IGNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMKLUxhdW5jaC5sb2NhbFByb3h5PUxvY2FsIFByb3h5IEFwcGxpY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3NGI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29udHJpYnV0b3JzIiBuYW1lPSIlY29udHJpYnV0b3JzLmV4dGVuc2lvbnBvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NvbnRyaWJ1dG9ycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbnNpb25zIiBuYW1lPSIlZXh0ZW5zaW9ucy5leHRlbnNpb25wb2ludC5uYW1lIiBzY2hlbWE9InNjaGVtYS9leHRlbnNpb25zLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZQotICAgICAgICAgICAgbmFtZT0iJUxhdW5jaC5sb2NhbFByb3h5IgotICAgICAgICAgICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIKLSAgICAgICAgICAgIG1vZGVzPSJydW4iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnByb3h5LkxvY2FsUHJveHlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgICAgIHNvdXJjZUxvY2F0b3JJZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5zb3VyY2VMb2NhdG9yLkphdmFTb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgICAgIHNvdXJjZVBhdGhDb21wdXRlcklkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnNvdXJjZUxvb2t1cC5qYXZhU291cmNlUGF0aENvbXB1dGVyIj4KLSAgICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS5qYXJzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkuamFycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZWRlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS5qYXJzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wcm94eWNvbW1vbi5qYXI9L29yZy5lY2xpcHNlLmplbS5wcm94eS9jb21tb25fYmluLwotaW5pdHBhcnNlci5qYXI9L29yZy5lY2xpcHNlLmplbS5wcm94eS9jb21tb25fYmluLwotcmVtb3RlY29tbW9uLmphcj0vb3JnLmVjbGlwc2UuamVtLnByb3h5L2NvbW1vbl9iaW4vCi12bS9yZW1vdGV2bS5qYXI9L29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9iaW4vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2F3dC9JU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvYXd0L0lTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlMDNmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvYXd0L0lTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IElTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eUZhY3Rvcnk7Ci0vKioKLSAqIFRoZSBTdGFuZGFyZCBhd3QgYmVhbiBwcm94eSBmYWN0b3J5LgotICogVGhpcyBpcyB0aGUgSW50ZXJmYWNlIHRoYXQgdGhlIGRlc2t0b3Agd2lsbCB0YWxrCi0gKiB0by4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjA5IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5IGV4dGVuZHMgSUJlYW5Qcm94eUZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0lTVFJZX0tFWSA9ICJzdGFuZGFyZC1qYXZhLmF3dCI7IC8vJE5PTi1OTFMtMSQKLQotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIGRpbWVuc2lvbiBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJRGltZW5zaW9uQmVhblByb3h5IGNyZWF0ZURpbWVuc2lvbkJlYW5Qcm94eVdpdGgoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBwb2ludCBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJUG9pbnRCZWFuUHJveHkgY3JlYXRlUG9pbnRCZWFuUHJveHlXaXRoKGludCB4LCBpbnQgeSk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcmVjdGFuZ2xlIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElSZWN0YW5nbGVCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvYXd0L0phdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9hd3QvSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTJmMmEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9hd3QvSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogU3RhbmRhcmQgQVdUIENvbnN0YW50cwotICoKLSAqIFVzZSB0aGUgc3RhdGljIGFjY2Vzc29yIG1ldGhvZCAoZ2V0Q29uc3RhbnRzKCkpIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgCi0gKiBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSByZWdpc3RyeS4gVGhpcyBpcyBkb25lIHNvIHRoYXQgdW50aWwgdGhlCi0gKiB0aGUgY29uc3RhbnRzIGFyZSBuZWVkZWQsIHRoZXkgYXJlbid0IHJlZ2lzdGVyZWQuCi0gKgotICogTk9URTogU2luY2UgZXZlcnl0aGluZyBpbiBoZXJlIGp1c3QgcHJveGllcywgdGhlcmUgaXMKLSAqICAgICAgIG5vIG5lZWQgdG8gaGF2ZSB0aGVtIHNlcGFyYXRlZCBieSBWTS4gVGhhdCBpcyB3aHkKLSAqICAgICAgIHRoaXMgaW4gdGhlIFByb3h5IHBhY2thZ2UuCi0gKgotICogVGhpcyBpcyBmaW5hbCBiZWNhdXNlIHRoaXMgY2FuJ3QgYmUgZXh0ZW5kZWQuIFRoaXMgc3BlY2lmaWMgb25lCi0gKiB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhpcyBrZXkuIEFueSBleHRlbnNpb25zCi0gKiBtdXN0IGJlIGRvbmUgaW4gdGhlaXIgb3duIGNvbnN0YW50cyBhbmQgcmVnaXN0cnkga2V5LgotICoKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzcvMDAgNDo0Nzo0OCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMgewotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdJU1RSWV9LRVkgPSBuZXcgT2JqZWN0KCk7Ci0JCQkKLQlmaW5hbCBib29sZWFuIEFXVExvYWRlZDsJLy8gQVdUIG1heSBub3QgYmUgYXZhaWxhYmxlLiBTbyBub24tdWkgSlZNJ3MgZG9uJ3QgaGF2ZSBBV1QuCi0JZmluYWwgYm9vbGVhbiBBV1RSZWdpc3RlcmVkOwkvLyBBV1Qgd2FzIHJlZ2lzdGVyZWQgdG8gYmUgdXNlZCBpbiB0aGlzIFZNLiBJdCBtYXkgYmUgcmVnaXN0ZXJlZCwgYnV0IHN0aWxsIG5vdCBhdmFpbGFibGUuCi0JCQotCWZpbmFsIElGaWVsZFByb3h5IGRpbWVuc2lvbkhlaWdodFByb3h5OwotCWZpbmFsIElGaWVsZFByb3h5IGRpbWVuc2lvbldpZHRoUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldERpbWVuc2lvblNpemVIV1Byb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXREaW1lbnNpb25TaXplRFByb3h5OwotCQotCWZpbmFsIElGaWVsZFByb3h5IHBvaW50WFByb3h5OwotCWZpbmFsIElGaWVsZFByb3h5IHBvaW50WVByb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRQb2ludExvY2F0aW9uWFlQcm94eTsKLQlmaW5hbCBJTWV0aG9kUHJveHkgc2V0UG9pbnRMb2NhdGlvblBQcm94eTsKLQkKLQlmaW5hbCBJRmllbGRQcm94eSByZWN0YW5nbGVIZWlnaHRQcm94eTsKLQlmaW5hbCBJRmllbGRQcm94eSByZWN0YW5nbGVXaWR0aFByb3h5OwotCWZpbmFsIElGaWVsZFByb3h5IHJlY3RhbmdsZVhQcm94eTsKLQlmaW5hbCBJRmllbGRQcm94eSByZWN0YW5nbGVZUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZVNpemVIV1Byb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRSZWN0YW5nbGVTaXplRFByb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRSZWN0YW5nbGVMb2NhdGlvblhZUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZUxvY2F0aW9uUFByb3h5OwotCWZpbmFsIElNZXRob2RQcm94eSBzZXRSZWN0YW5nbGVCb3VuZHNYWUhXUHJveHk7Ci0JZmluYWwgSU1ldGhvZFByb3h5IHNldFJlY3RhbmdsZUJvdW5kc1JQcm94eTsKLQkKLS8qKgotICogR2V0IHRoZSBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cyBnZXRDb25zdGFudHMoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzIGNvbnN0YW50cyA9IChKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzKSByZWdpc3RyeS5nZXRDb25zdGFudHMoUkVHSVNUUllfS0VZKTsKLQlpZiAoY29uc3RhbnRzID09IG51bGwpCi0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RhbnRzKFJFR0lTVFJZX0tFWSwgY29uc3RhbnRzID0gbmV3IEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMocmVnaXN0cnksIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnlFeHRlbnNpb24oSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5SRUdJU1RSWV9LRVkpICE9IG51bGwpKTsKLQlyZXR1cm4gY29uc3RhbnRzOwotfQotCQkKLQotcHVibGljIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnksIGJvb2xlYW4gaXNSZWdpc3RlcmVkKSB7Ci0Jc3VwZXIoKTsKLQkKLQlBV1RSZWdpc3RlcmVkID0gaXNSZWdpc3RlcmVkOwotCWlmICghQVdUUmVnaXN0ZXJlZCkgewotCQlBV1RMb2FkZWQgPSBmYWxzZTsKLQkJZGltZW5zaW9uSGVpZ2h0UHJveHkgPSBkaW1lbnNpb25XaWR0aFByb3h5ID0gcG9pbnRYUHJveHkgPSBwb2ludFlQcm94eSA9IHJlY3RhbmdsZUhlaWdodFByb3h5ID0gcmVjdGFuZ2xlV2lkdGhQcm94eSA9IHJlY3RhbmdsZVhQcm94eSA9IHJlY3RhbmdsZVlQcm94eSA9IG51bGw7Ci0JCXNldERpbWVuc2lvblNpemVIV1Byb3h5ID0gc2V0RGltZW5zaW9uU2l6ZURQcm94eSA9IHNldFBvaW50TG9jYXRpb25YWVByb3h5ID0gc2V0UG9pbnRMb2NhdGlvblBQcm94eSA9IHNldFJlY3RhbmdsZVNpemVIV1Byb3h5ID0gc2V0UmVjdGFuZ2xlU2l6ZURQcm94eSA9IHNldFJlY3RhbmdsZUxvY2F0aW9uWFlQcm94eSA9IHNldFJlY3RhbmdsZUxvY2F0aW9uUFByb3h5ID0gc2V0UmVjdGFuZ2xlQm91bmRzWFlIV1Byb3h5ID0gc2V0UmVjdGFuZ2xlQm91bmRzUlByb3h5ID0gbnVsbDsJCQotCQlyZXR1cm47Ci0JfQotCQotCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkKLQlJQmVhblR5cGVQcm94eSBkaW1lbnNpb25UeXBlUHJveHkgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5EaW1lbnNpb24iKTsvLyROT04tTkxTLTEkCi0JaWYgKGRpbWVuc2lvblR5cGVQcm94eSAhPSBudWxsKSB7Ci0JCS8vIEFXVCBpcyBhdmFpbGFibGUuCi0JCUFXVExvYWRlZCA9IHRydWU7Ci0JCUlCZWFuVHlwZVByb3h5IGludFR5cGVQcm94eSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImludCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlkaW1lbnNpb25IZWlnaHRQcm94eSA9IGRpbWVuc2lvblR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJoZWlnaHQiKTsvLyROT04tTkxTLTEkCi0JCWRpbWVuc2lvbldpZHRoUHJveHkgPSBkaW1lbnNpb25UeXBlUHJveHkuZ2V0RmllbGRQcm94eSgid2lkdGgiKTsvLyROT04tTkxTLTEkCi0JCXNldERpbWVuc2lvblNpemVIV1Byb3h5ID0gZGltZW5zaW9uVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRTaXplIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2ludFR5cGVQcm94eSwgaW50VHlwZVByb3h5fSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGltZW5zaW9uU2l6ZURQcm94eSA9IGRpbWVuc2lvblR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0U2l6ZSIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtkaW1lbnNpb25UeXBlUHJveHl9KTsgLy8kTk9OLU5MUy0xJAotCQotCQlJQmVhblR5cGVQcm94eSBwb2ludFR5cGVQcm94eSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50Iik7Ly8kTk9OLU5MUy0xJAotCQlwb2ludFhQcm94eSA9IHBvaW50VHlwZVByb3h5LmdldEZpZWxkUHJveHkoIngiKTsvLyROT04tTkxTLTEkCi0JCXBvaW50WVByb3h5ID0gcG9pbnRUeXBlUHJveHkuZ2V0RmllbGRQcm94eSgieSIpOwkvLyROT04tTkxTLTEkCi0JCXNldFBvaW50TG9jYXRpb25YWVByb3h5ID0gcG9pbnRUeXBlUHJveHkuZ2V0TWV0aG9kUHJveHkoInNldExvY2F0aW9uIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2ludFR5cGVQcm94eSwgaW50VHlwZVByb3h5fSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UG9pbnRMb2NhdGlvblBQcm94eSA9IHBvaW50VHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRMb2NhdGlvbiIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtwb2ludFR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCQotCQkKLQkJSUJlYW5UeXBlUHJveHkgcmVjdGFuZ2xlVHlwZVByb3h5ID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUmVjdGFuZ2xlIik7Ly8kTk9OLU5MUy0xJAotCQlyZWN0YW5nbGVIZWlnaHRQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJoZWlnaHQiKTsvLyROT04tTkxTLTEkCi0JCXJlY3RhbmdsZVdpZHRoUHJveHkgPSByZWN0YW5nbGVUeXBlUHJveHkuZ2V0RmllbGRQcm94eSgid2lkdGgiKTsvLyROT04tTkxTLTEkCi0JCXJlY3RhbmdsZVhQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRGaWVsZFByb3h5KCJ4Iik7Ly8kTk9OLU5MUy0xJAotCQlyZWN0YW5nbGVZUHJveHkgPSByZWN0YW5nbGVUeXBlUHJveHkuZ2V0RmllbGRQcm94eSgieSIpOy8vJE5PTi1OTFMtMSQKLQkJc2V0UmVjdGFuZ2xlU2l6ZUhXUHJveHkgPSByZWN0YW5nbGVUeXBlUHJveHkuZ2V0TWV0aG9kUHJveHkoInNldFNpemUiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHl9KTsgLy8kTk9OLU5MUy0xJAotCQlzZXRSZWN0YW5nbGVTaXplRFByb3h5ID0gcmVjdGFuZ2xlVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJzZXRTaXplIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2RpbWVuc2lvblR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCXNldFJlY3RhbmdsZUxvY2F0aW9uWFlQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0TG9jYXRpb24iLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHl9KTsgLy8kTk9OLU5MUy0xJAotCQlzZXRSZWN0YW5nbGVMb2NhdGlvblBQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0TG9jYXRpb24iLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7cG9pbnRUeXBlUHJveHl9KTsJCSAvLyROT04tTkxTLTEkCi0JCXNldFJlY3RhbmdsZUJvdW5kc1hZSFdQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0Qm91bmRzIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge2ludFR5cGVQcm94eSwgaW50VHlwZVByb3h5LCBpbnRUeXBlUHJveHksIGludFR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JCXNldFJlY3RhbmdsZUJvdW5kc1JQcm94eSA9IHJlY3RhbmdsZVR5cGVQcm94eS5nZXRNZXRob2RQcm94eSgic2V0Qm91bmRzIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge3JlY3RhbmdsZVR5cGVQcm94eX0pOyAvLyROT04tTkxTLTEkCi0JfSBlbHNlIHsKLQkJQVdUTG9hZGVkID0gZmFsc2U7Ci0JCWRpbWVuc2lvbkhlaWdodFByb3h5ID0gZGltZW5zaW9uV2lkdGhQcm94eSA9IHBvaW50WFByb3h5ID0gcG9pbnRZUHJveHkgPSByZWN0YW5nbGVIZWlnaHRQcm94eSA9IHJlY3RhbmdsZVdpZHRoUHJveHkgPSByZWN0YW5nbGVYUHJveHkgPSByZWN0YW5nbGVZUHJveHkgPSBudWxsOwotCQlzZXREaW1lbnNpb25TaXplSFdQcm94eSA9IHNldERpbWVuc2lvblNpemVEUHJveHkgPSBzZXRQb2ludExvY2F0aW9uWFlQcm94eSA9IHNldFBvaW50TG9jYXRpb25QUHJveHkgPSBzZXRSZWN0YW5nbGVTaXplSFdQcm94eSA9IHNldFJlY3RhbmdsZVNpemVEUHJveHkgPSBzZXRSZWN0YW5nbGVMb2NhdGlvblhZUHJveHkgPSBzZXRSZWN0YW5nbGVMb2NhdGlvblBQcm94eSA9IHNldFJlY3RhbmdsZUJvdW5kc1hZSFdQcm94eSA9IHNldFJlY3RhbmdsZUJvdW5kc1JQcm94eSA9IG51bGw7Ci0JfQotfQotCi0vKioKLSAqIEFuc3dlciBpZiBBV1QgaXMgYXZhaWxhYmxlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FXVEF2YWlsYWJsZSgpIHsKLQlyZXR1cm4gQVdUTG9hZGVkOwotfQotCi0vKioKLSAqIEFuc3dlciBpZiBBV1Qgd2FzIHJlZ2lzdGVyZWQgdG8gYmUgYXZhaWxhYmxlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FXVFJlZ2lzdGVyZWQoKSB7Ci0JcmV0dXJuIEFXVFJlZ2lzdGVyZWQ7Ci19Ci0KLQotCi0vKioKLSAqIGdldERpbWVuc2lvbkhlaWdodEZpZWxkUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJRmllbGRQcm94eSBnZXREaW1lbnNpb25IZWlnaHRGaWVsZFByb3h5KCkgewotCXJldHVybiBkaW1lbnNpb25IZWlnaHRQcm94eTsKLX0KLS8qKgotICogZ2V0RGltZW5zaW9uV2lkdGhQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldERpbWVuc2lvbldpZHRoRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gZGltZW5zaW9uV2lkdGhQcm94eTsKLX0KLS8qKgotICogZ2V0RGltZW5zaW9uU2V0U2l6ZVdIUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGltZW5zaW9uU2V0U2l6ZUhXUHJveHkoKSB7Ci0JcmV0dXJuIHNldERpbWVuc2lvblNpemVIV1Byb3h5OwotfQotLyoqCi0gKiBnZXREaW1lbnNpb25TZXRTaXplRFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldERpbWVuc2lvblNldFNpemVEUHJveHkoKSB7Ci0JcmV0dXJuIHNldERpbWVuc2lvblNpemVEUHJveHk7Ci19Ci0KLS8qKgotICogZ2V0UG9pbnRYRmllbGRQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldFBvaW50WEZpZWxkUHJveHkoKSB7Ci0JcmV0dXJuIHBvaW50WFByb3h5OwotfQotLyoqCi0gKiBnZXRQb2ludFlGaWVsZFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUZpZWxkUHJveHkgZ2V0UG9pbnRZRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcG9pbnRZUHJveHk7Ci19Ci0vKioKLSAqIGdldFBvaW50U2V0TG9jYXRpb25YWVByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFBvaW50U2V0TG9jYXRpb25YWVByb3h5KCkgewotCXJldHVybiBzZXRQb2ludExvY2F0aW9uWFlQcm94eTsKLX0KLS8qKgotICogZ2V0UG9pbnRTZXRMb2NhdGlvblBQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRQb2ludFNldExvY2F0aW9uUFByb3h5KCkgewotCXJldHVybiBzZXRQb2ludExvY2F0aW9uUFByb3h5OwotfQotLyoqCi0gKiBnZXRSZWN0YW5nbGVIZWlnaHRGaWVsZFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUZpZWxkUHJveHkgZ2V0UmVjdGFuZ2xlSGVpZ2h0RmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcmVjdGFuZ2xlSGVpZ2h0UHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVdpZHRoRmllbGRQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldFJlY3RhbmdsZVdpZHRoRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcmVjdGFuZ2xlV2lkdGhQcm94eTsKLX0KLS8qKgotICogZ2V0UmVjdGFuZ2xlWEZpZWxkUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJRmllbGRQcm94eSBnZXRSZWN0YW5nbGVYRmllbGRQcm94eSgpIHsKLQlyZXR1cm4gcmVjdGFuZ2xlWFByb3h5OwotfQotLyoqCi0gKiBnZXRSZWN0YW5nbGVZRmllbGRQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElGaWVsZFByb3h5IGdldFJlY3RhbmdsZVlGaWVsZFByb3h5KCkgewotCXJldHVybiByZWN0YW5nbGVZUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVNldFNpemVXSFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFJlY3RhbmdsZVNldFNpemVIV1Byb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVTaXplSFdQcm94eTsKLX0KLS8qKgotICogZ2V0UmVjdGFuZ2xlU2V0U2l6ZURQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRSZWN0YW5nbGVTZXRTaXplRFByb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVTaXplRFByb3h5OwotfQotLyoqCi0gKiBnZXRSZWN0YW5nbGVTZXRMb2NhdGlvblhZUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0UmVjdGFuZ2xlU2V0TG9jYXRpb25YWVByb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVMb2NhdGlvblhZUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVNldExvY2F0aW9uUFByb3h5IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFJlY3RhbmdsZVNldExvY2F0aW9uUFByb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVMb2NhdGlvblBQcm94eTsKLX0KLQotLyoqCi0gKiBnZXRSZWN0YW5nbGVTZXRCb3VuZHNYWUhXUHJveHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0UmVjdGFuZ2xlU2V0Qm91bmRzWFlIV1Byb3h5KCkgewotCXJldHVybiBzZXRSZWN0YW5nbGVCb3VuZHNYWUhXUHJveHk7Ci19Ci0vKioKLSAqIGdldFJlY3RhbmdsZVNldEJvdW5kc1JQcm94eSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRSZWN0YW5nbGVTZXRCb3VuZHNSUHJveHkoKSB7Ci0JcmV0dXJuIHNldFJlY3RhbmdsZUJvdW5kc1JQcm94eTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9CYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0Jhc2VQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFmMTc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0Jhc2VQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEJhc2VQcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA2LzE1IDIwOjE5OjExICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0gCi0vKioKLSAqIFRoaXMgaXMgdGhlIEJhc2UgUmVnaXN0cnkgdGhhdCBhbGwgaW1wbGVtZW50YXRpb25zIHNob3VsZCBzdWJjbGFzcy4gCi0gKiA8cD4KLSAqIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IGN1c3RvbWVycy4gSXQgcHJvdmlkZXMgcHVibGljIGZ1bmN0aW9ucyBvbmx5IGZvciBhY2Nlc3Mgb2YgaW5kaXZpZHVhbCBpbXBsZW1lbnRhdGlvbnMuCi0gKiBDdXN0b21lcnMgc2hvdWxkIG9ubHkgYWNjZXNzIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eUZhY3RvcnlSZWdpc3RyeX0uCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgUHJveHlGYWN0b3J5UmVnaXN0cnkgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVnaXN0cnlUeXBlSUQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCByZWdpc3RyeSB0eXBlIElELiBUaGUgdHlwZSBpZCBzaG91bGQgYmUgcHJvdmlkZWQgYnkKLQkgKiBlYWNoIGltcGxlbWVudGF0aW9uLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBwcm92aWRlIHNwZWNpZmljIHR5cGUKLQkgKiByZWdpc3RyYXRpb25zIHRocm91Z2ggY29udHJpYnV0aW9ucy4KLQkgKiAgCi0JICogQHBhcmFtIHJlZ2lzdHJ5VHlwZUlECi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIEJhc2VQcm94eUZhY3RvcnlSZWdpc3RyeShTdHJpbmcgcmVnaXN0cnlUeXBlSUQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWdpc3RyeVR5cGVJRCA9IHJlZ2lzdHJ5VHlwZUlEOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlcWlzdHJ5IHR5cGUgaWQuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cnlUeXBlSUQoKSB7Ci0JCXJldHVybiByZWdpc3RyeVR5cGVJRDsKLQl9Ci0KLQkvKioKLQkgUmVnaXN0ZXIgdGhlIGN1cnJlbnQgcmVnaXN0ZXJlZCBiZWFuIHByb3h5IGZhY3RvcnkgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgSUJlYW5Qcm94eSBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckJlYW5Qcm94eUZhY3RvcnkoSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBhU3RhbmRhcmRGYWN0b3J5KSB7Ci0JCWZDdXJyZW50U3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5ID0gYVN0YW5kYXJkRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgUmVnaXN0ZXIgYSBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJCZWFuUHJveHlGYWN0b3J5KFN0cmluZyBwYWNrYWdlTmFtZSwgSUJlYW5Qcm94eUZhY3RvcnkgYUZhY3RvcnkpIHsKLQkJZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuUHJveHlGYWN0b3JpZXMucHV0KHBhY2thZ2VOYW1lLCBhRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JIFJlZ2lzdGVyIHRoZSBjdXJyZW50IHJlZ2lzdGVyZWQgYmVhbiB0eXBlIHByb3h5IGZhY3RvcnkgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgSUJlYW5UeXBlUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5RmFjdG9yeShJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBhU3RhbmRhcmRGYWN0b3J5KSB7Ci0JCWZDdXJyZW50U3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSA9IGFTdGFuZGFyZEZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JIFJlZ2lzdGVyIGEgZmFjdG9yeSB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBJQmVhblR5cGVQcm94eSBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckJlYW5UeXBlUHJveHlGYWN0b3J5KFN0cmluZyBwYWNrYWdlTmFtZSwgSUJlYW5UeXBlUHJveHlGYWN0b3J5IGFGYWN0b3J5KSB7Ci0JCWZSZWdpc3RlcmVkRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3Rvcmllcy5wdXQocGFja2FnZU5hbWUsIGFGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIE1ldGhvZCBQcm94eSBGYWN0b3J5IGZvciB0aGlzIFZNLgotCSAqIENyZWF0aW9uIGRhdGU6ICgzLzEzLzAwIDEwOjU4OjE5IEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyTWV0aG9kUHJveHlGYWN0b3J5KElNZXRob2RQcm94eUZhY3RvcnkgbmV3TWV0aG9kUHJveHlGYWN0b3J5KSB7Ci0JCWZNZXRob2RQcm94eUZhY3RvcnkgPSBuZXdNZXRob2RQcm94eUZhY3Rvcnk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db2xsZWN0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhODFmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db2xsZWN0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gamF2YS51dGlsLkNvbGxlY3Rpb24gcHJveHkuCi0gKiBJdCBwcm92aWRlcyB0aGUgY29sbGVjdGlvbiBtZXRob2RzIHRvIGludGVyZmFjZSB0bwotICogdGhlIHByb3h5LgotICovCi0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIElCZWFuUHJveHkgZkNvbGxlY3Rpb247Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBmQ29uc3RhbnRzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlcihJQmVhblByb3h5IGFDb2xsZWN0aW9uUHJveHkpIHsKLQkJaWYgKCFhQ29sbGVjdGlvblByb3h5LmdldFR5cGVQcm94eSgpLmlzS2luZE9mKGFDb2xsZWN0aW9uUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5Db2xsZWN0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eU1lc3NhZ2VzLkNsYXNzQ2FzdF9FWENfX0luY29ycmVjdFR5cGUsIG5ldyBPYmplY3RbXSB7YUNvbGxlY3Rpb25Qcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCAiamF2YS51dGlsLkNvbGxlY3Rpb24ifSkpOyAKLQkJZWxzZQotCQkJZkNvbGxlY3Rpb24gPSBhQ29sbGVjdGlvblByb3h5OwotCQkJCi0JCWZDb25zdGFudHMgPSBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGFDb2xsZWN0aW9uUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgY29sbGVjdGlvbiBwcm94eSB0aGF0IHRoaXMgaXMgd3JhcHBlcmluZy4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRCZWFuUHJveHkoKSB7Ci0JCXJldHVybiBmQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBlcXVhbHMgLSBQYXNzIGl0IG9uIHRvIHRoZSBwcm94eSB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZkNvbGxlY3Rpb24uZXF1YWxzKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIGhhc2hDb2RlIC0gUGFzcyBpdCBvbiB0byB0aGUgcHJveHkgdG8gaGFuZGxlIHRoaXMuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZDb2xsZWN0aW9uLmhhc2hDb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbGxlY3Rpb24gYWNjZXNzb3JzCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKElCZWFuUHJveHkgb2JqZWN0KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uQWRkKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gYWRkQWxsKElCZWFuUHJveHkgY29sbGVjdGlvbikgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbkFkZEFsbCgpLmludm9rZShmQ29sbGVjdGlvbiwgY29sbGVjdGlvbikpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbkNsZWFyKCkuaW52b2tlKGZDb2xsZWN0aW9uKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSUJlYW5Qcm94eSBvYmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25Db250YWlucygpLmludm9rZShmQ29sbGVjdGlvbiwgb2JqZWN0KSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChJQmVhblByb3h5IGNvbGxlY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25Db250YWluc0FsbCgpLmludm9rZShmQ29sbGVjdGlvbiwgY29sbGVjdGlvbikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCQkKLQl9CQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvbklzRW1wdHkoKS5pbnZva2UoZkNvbGxlY3Rpb24pKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQkKLQl9CQkKLQlwdWJsaWMgSXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyIGl0ZXJhdG9yKCkgewotCQl0cnkgewotCQkJSUJlYW5Qcm94eSBpdHIgPSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25JdGVyYXRvcigpLmludm9rZShmQ29sbGVjdGlvbik7Ci0JCQlpZiAoaXRyICE9IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIoaXRyKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKElCZWFuUHJveHkgb2JqZWN0KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uUmVtb3ZlKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKElCZWFuUHJveHkgY29sbGVjdGlvbikgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvblJlbW92ZUFsbCgpLmludm9rZShmQ29sbGVjdGlvbiwgY29sbGVjdGlvbikpLmJvb2xlYW5WYWx1ZSgpOwotCX0JCQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChJQmVhblByb3h5IGNvbGxlY3Rpb24pIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKElCb29sZWFuQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldENvbGxlY3Rpb25SZXRhaW5BbGwoKS5pbnZva2UoZkNvbGxlY3Rpb24sIGNvbGxlY3Rpb24pKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIGludCBzaXplKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUludGVnZXJCZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvblNpemUoKS5pbnZva2UoZkNvbGxlY3Rpb24pKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gMDsKLQkJfQkJCQotCX0JCi0JcHVibGljIElBcnJheUJlYW5Qcm94eSB0b0FycmF5KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIChJQXJyYXlCZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0Q29sbGVjdGlvblRvQXJyYXkoKS5pbnZva2UoZkNvbGxlY3Rpb24pOwotCX0KLQlwdWJsaWMgSUFycmF5QmVhblByb3h5IHRvQXJyYXkoSUFycmF5QmVhblByb3h5IGFycmF5KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKElBcnJheUJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRDb2xsZWN0aW9uVG9BcnJheVdpdGhBcnJheSgpLmludm9rZShmQ29sbGVjdGlvbiwgYXJyYXkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Db25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjQyZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQWRhcHRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci0gCi0vKioKLSAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciB0aGF0IGRvZXMgbm90aGluZy4gSXQKLSAqIGNhbiBiZSBzdWJjbGFzc2VkIHRvIHByb3ZpZGUgc3BlY2lmaWMgb3ZlcnJpZGVzLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciB7Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yI2luaXRpYWxpemUob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGluZm8pIHsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciNjb250cmlidXRlQ2xhc3NwYXRocyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aHMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciNjb250cmlidXRlVG9Db25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvUmVnaXN0cnkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnkpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUmVnaXN0cnkoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FbnVtZXJhdGlvbkJlYW5Qcm94eVdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0VudW1lcmF0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjlkYTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0VudW1lcmF0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEVudW1lcmF0aW9uQmVhblByb3h5V3JhcHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhbiBqYXZhLnV0aWwuRW51bWVyYXRpb24gcHJveHkuCi0gKiBJdCBwcm92aWRlcyB0aGUgRW51bWVyYXRpb24gbWV0aG9kcyB0byBpbnRlcmZhY2UgdG8KLSAqIHRoZSBwcm94eS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25CZWFuUHJveHlXcmFwcGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgSUJlYW5Qcm94eSBmRW51bWVyYXRpb247Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBmQ29uc3RhbnRzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbkJlYW5Qcm94eVdyYXBwZXIoSUJlYW5Qcm94eSBhbkVudW1lcmF0aW9uUHJveHkpIHsKLQkJCi0JCWZFbnVtZXJhdGlvbiA9IGFuRW51bWVyYXRpb25Qcm94eTsKLQkJCQotCQlmQ29uc3RhbnRzID0gSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhhbkVudW1lcmF0aW9uUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgaXRlcmF0b3IgcHJveHkgdGhhdCB0aGlzIGlzIHdyYXBwZXJpbmcuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0QmVhblByb3h5KCkgewotCQlyZXR1cm4gZkVudW1lcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIGVxdWFscyAtIFBhc3MgaXQgb24gdG8gdGhlIHByb3h5IHRvIGhhbmRsZSB0aGlzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmRW51bWVyYXRpb24uZXF1YWxzKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIGhhc2hDb2RlIC0gUGFzcyBpdCBvbiB0byB0aGUgcHJveHkgdG8gaGFuZGxlIHRoaXMuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZFbnVtZXJhdGlvbi5oYXNoQ29kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBFbnVtZXJhdGlvbiBhY2Nlc3NvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRFbnVtZXJhdGlvbkhhc01vcmVFbGVtZW50cygpLmludm9rZShmRW51bWVyYXRpb24pKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQkJCi0JfQotCXB1YmxpYyBJQmVhblByb3h5IG5leHRFbGVtZW50KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGZDb25zdGFudHMuZ2V0RW51bWVyYXRpb25OZXh0RWxlbWVudCgpLmludm9rZShmRW51bWVyYXRpb24pOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGVmYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBFeHByZXNzaW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE0ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLSAKLS8qKgotICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiBJRXhwcmVzc2lvbi4gSXQgZW5jYXBzdWxhdGVzIG11Y2ggb2YgdGhlIHByb2Nlc3NpbmcgcmVxdWlyZWQKLSAqIGludG8gYSBjb21tb24gZm9ybSB0aGF0IHdpbGwgYmUgdHVybmVkIGludG8gc2ltcGxlIHB1c2gvcG9wL2V2YWx1YXRlIHR5cGUgb2YgaW50ZXJhY3Rpb24gd2l0aCB0aGUKLSAqIGFjdHVhbCBvdGhlciBzaWRlLiBBbGwgcmVnaXN0cnkgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mIElFeHByZXNzaW9uIG11c3Qgc3ViY2xhc3MgdGhpcyBjbGFzcy4KLSAqIDxwPgotICogSXQgd2lsbCBtYWludGFpbiBhIHN0YWNrIG9mIHRoZSBleHByZXNzaW9ucy4gQXMgdGhlIGV4cHJlc3Npb25zIGNvbWUgaW4gdGhleSB3aWxsIGJlIHN0YWNrZWQgaWYgbm90Ci0gKiBhYmxlIHRvIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LiBUaGUgZXhwcmVzc2lvbnMgY29tZSB0byB0aGlzIGNsYXNzIGluIGFuICBvdXRzaWRlIHRvIGluc2lkZSBvcmRlciwKLSAqIGJ1dCB0aGV5IG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGluIGFuIGluc2lkZS1vdXQgb3JkZXIgaW5zdGVhZC4gCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgd2lsbCBiZSB1c2VkIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHByb3h5IGludGVyZmFjZXMuIFRoZSBhYnN0cmFjdCBtZXRob2RzIHdpbGwKLSAqIHRoZW4gYmUgdGhlIHNpbXBsZSBpbnRlcmZhY2UuIAotICogPHA+Ci0gKiBJdCBpcyBub3QgbWVhbnQgZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhlIGFjdHVhbCBjcmVhdGUgZXhwcmVzc2lvbiBtZXRob2RzIGJlY2F1c2UgdGhlIHByb2Nlc3NpbmcgdGhlIHN0YWNrCi0gKiBpcyB2ZXJ5IHNlbnNpdGl2ZSBhbmQgbXVzdCBleGVjdXRlIGluIHRoZSBwcm9wZXIgc2VxdWVuY2UuIFNvIHRoZSBjcmVhdGUgbWV0aG9kcyBhcmUgZmluYWwgZm9yIHRoaXMgcmVhc29uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBhbHNvIGhhcyBBUEkgb2YgaXRzIG93biBhbmQgY2FuIGJlIHVzZWQgYnkgY3VzdG9tZXJzIGZvciBhZHZhbmNlZCB1c2FnZS4gVGhvc2UgYWR2YW5jZWQgQVBJIGFyZQotICogbGlzdGVkIG9uIGVhY2ggbWV0aG9kIGFzIHRvIHdoZXRoZXIgaXQgaXMgY3VzdG9tZXIgQVBJIG9yIGltcGxlbWVudGVycyBBUEkgKGkuZS4gQVBJIGZvciBpbXBsZW1lbnRlcnMgb2YKLSAqIGV4cHJlc3Npb24gc3ViY2xhc3NlcyB0byB1c2UpLiAKLSAqIAotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBJRXhwcmVzc2lvbiB7Ci0KLQkvKgotCSAqIFdlIGhhdmUgc3RhY2sgaGVyZSwgYnV0IHJhdGhlciB0aGFuIGNyZWF0ZSBhIGNsYXNzIHRoYXQgZG9lcyB0aGUKLQkgKiBzdGFjayBwcm90b2NvbCwgd2lsbCBzaW1wbHkgaGF2ZSBzb21lIHByaXZhdGUgbWV0aG9kcyB0byBkbwotCSAqIHRoZSBzYW1lIHRoaW5nIGZvciB0aGUgc3RhY2suIChOb3RlOiBDYW4ndCB1c2UgamF2YS51dGlsLlN0YWNrCi0JICogYmVjYXVzZSB0aGF0IGlzIGEgc3luY2hyb25pemVkIGNsYXNzLCBhbmQgZG9uJ3Qgd2FudCB0aGUgb3ZlcmhlYWQpLiAKLQkgKiAKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGUgc3RhY2sgaXMgdG8gc3RhY2sgdXAgZXhwcmVzc2lvbnMgdGhhdCBoYXZlIG5vdCB5ZXQKLQkgKiBiZWVuIGV2YWx1YXRlZC4gCi0JICogCi0JICogRWFjaCBleHByZXNzaW9uIHR5cGUgd2lsbCBjb250cm9sIHRoZSBjb250ZW50IG9mIHdoYXQgaXQgcHVzaGVzIGFuZCBwb3BzLgotCSAqIFRoZSBleHByZXNzaW9uIHR5cGUgd2lsbCBiZSB0aGUgbGFzdCB0aGluZyBpdCBwdXNoZXMgc28gdGhhdCBvbiBwb3BwaW5nCi0JICogd2Uga25vdyB3aGF0IGtpbmQgb2YgZXhwcmVzc2lvbiBpcyBub3cgY29tcGxldGVkIGFuZCByZWFkeSBmb3IgZXZhbHVhdGlvbi4KLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBjb250cm9sU3RhY2sgPSBuZXcgQXJyYXlMaXN0KDMwKTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0JcHJvdGVjdGVkIGZpbmFsIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgYmVhblByb3h5RmFjdG9yeTsKLQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFjZUZsYWc7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdHJhY2UgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQuCi0JICogVGhpcyBpcyBub3QgaW4gdGhlIElFeHByZXNzaW9uIGludGVyZmFjZSBiZWNhdXNlIGl0IGlzIGZvciBhZHZhbmNlZCB1c2Vycy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmFjZVNldCgpIHsKLQkJcmV0dXJuIHRyYWNlRmxhZyAhPSBudWxsOyAKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGlmIHRyYWNlIGlzIG9uLiBJZiBub3QgZXhwbGljaXRseSBzZXQgdGhpcyB3aWxsIGFuc3dlciBmYWxzZS4KLQkgKiBVc2Uge0BsaW5rIEV4cHJlc3Npb24jaXNUcmFjZVNldCgpfSBmaXJzdCB0byBkZXRlcm1pbmUgaWYgdGhpcwotCSAqIHNob3VsZCBiZSBjYWxsZWQgb3Igbm90LgotCSAqIFRoaXMgaXMgbm90IGluIHRoZSBJRXhwcmVzc2lvbiBpbnRlcmZhY2UgYmVjYXVzZSBpdCBpcyBmb3IgYWR2YW5jZWQgdXNlcnMuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJhY2UoKSB7Ci0JCXJldHVybiB0cmFjZUZsYWcgIT0gbnVsbCA/IHRyYWNlRmxhZy5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBFeHBsaWNpdGx5IHNldCB0aGUgdHJhY2UgZmxhZy4gVGhpcyB3aWxsIG9ubHkgYmUgaG9ub3VyZWQgYmVmb3JlIGFueQotCSAqIGV4cHJlc3Npb25zIGhhdmUgYmVlbiBjcmVhdGVkLiBBZnRlciB0aGF0IHRoaXMgd2lsbCBiZSBpZ25vcmVkLgotCSAqIFRoZSB0cmFjZSBpcyBpbml0aWFsbHkgc2V0IHRvIHVzZSBkZWZhdWx0LiBPbmNlIHNldCBpdCBjYW5ub3QgYmUgdW5zZXQuCi0JICogVGhpcyBpcyBub3QgaW4gdGhlIElFeHByZXNzaW9uIGludGVyZmFjZSBiZWNhdXNlIGl0IGlzIGZvciBhZHZhbmNlZCB1c2Vycy4KLQkgKiBAcGFyYW0gdHJhY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZShib29sZWFuIHRyYWNlKSB7Ci0JCXRyYWNlRmxhZyA9IEJvb2xlYW4udmFsdWVPZih0cmFjZSk7Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYW4gb2JqZWN0IG9udG8gdGhlIGNvbnRyb2wgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwdXNoKE9iamVjdCBvKSB7Ci0JCWNvbnRyb2xTdGFjay5hZGQobyk7Ci0JfQotCQotCS8qKgotCSAqIFBvcCBhbiBvYmplY3Qgb2ZmIG9mIHRoZSBjb250cm9sIHN0YWNrCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgcG9wKCkgewotCQlyZXR1cm4gY29udHJvbFN0YWNrLnJlbW92ZShjb250cm9sU3RhY2suc2l6ZSgpLTEpOwotCX0KLQkKLQkvKioKLQkgKiBQZWVrIGF0IGFuIG9iamVjdCBmcm9tIHRoZSBjb250cm9sIHN0YWNrLiA8Y29kZT5mcm9tVG9wPC9jb2RlPiBpcyBob3cgZmFyIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgdG8gbG9vay4KLQkgKiBJZiBpdCBvbmUsIHRoZW4gaXQgaXMgdGhlIHRvcCBlbnRyeSwgdHdvIGlzIHRoZSBuZXh0IG9uZSBkb3duLiBaZXJvIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIuCi0JICogQHBhcmFtIGZyb21Ub3AgSG93IGZhciBmcm9tIHRoZSB0b3AgdG8gcGVlay4gPGNvZGU+MTwvY29kZT4gaXMgdGhlIHRvcCwgbm90IHplcm8uCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgcGVlayhpbnQgZnJvbVRvcCkgewotCQkvLyAxIG1lYW5zIHRoZSB0b3AsIDIgaXMgdGhlIG5leHQgb25lIGRvd24uCi0JCXJldHVybiBjb250cm9sU3RhY2suZ2V0KGNvbnRyb2xTdGFjay5zaXplKCktZnJvbVRvcCk7Ci0JfQotCQotCS8qCi0JICogRXhwcmVzc2lvbiB0eXBlIGNvbnN0YW50cy4KLQkgKi8KLQkKLQkvKgotCSAqIEFSUkFZIEFDQ0VTUyBleHByZXNzaW9uLgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJSUV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVkKLQkgKiAJSUV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVggKGZvciAxIHRvIG4gdGltZXMgZGVwZW5kaW5nIG9uIGluZGV4IGNvdW50KQotCSAqIAlQUk9DRVNTX0VYUFJFU1NJT04KLQkgKiAKLQkgKiBUaGUgdmFsdWUgc3RhY2sgd2lsbCBoYXZlCi0JICogCUFSUkFZQUNDRVNTCi0JICogCUludGVnZXIoaW5kZXggY291bnQpIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgQVJSQVlBQ0NFU1NfSU5ERVhfMSA9IG5ldyBJbnRlZ2VyKDEpOwkvLyBVc2UgaW4gbm9ybWFsIGNhc2Ugb2Ygb25lIGluZGV4IGNvdW50LiBTYXZlcyBvYmplY3QgY3JlYXRpb24uCi0JCi0JLyoKLQkgKiBBUlJBWSBDUkVBVElPTiBleHByZXNzaW9uLgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJQVJSQVlDUkVBVElPTl9JTklUSUFMSVpFUiAtIGlmIGhhc0luaXRpYWxpemVyCi0JICogIElFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OIChmb3IgMCB0byBuIHRpbWVzIGRlcGVuZGluZyBvbiBkaW1lbnNpb24gY291bnQpCi0JICogIFBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmUKLQkgKiAgQVJSQVlDUkVBVElPTgotCSAqICB0eXBlIChlaXRoZXIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0eXBlLCBvciBhbiBJQmVhblByb3h5VHlwZSByZXByZXNlbnRpbmcgdGhlIHR5cGUpLgotCSAqICBJbnRlZ2VyKGRpbWVuc2lvbiBjb3VudCkgKGlmIHplcm8gdGhlbiB0aGVyZSBpcyBhbiBpbml0aWFsaXplcikgCi0JICogCi0JICogCi0JICogTm90ZTogQXJyYXkgSW5pdGlhbGl6ZXIgd29ya3Mgd2l0aCB0aGlzIGluIHRoYXQgaXQgd2lsbCBwZWVrIGludG8gdGhlIHZhbHVlIHN0YWNrIHR3byBlbnRyaWVzIGRvd24KLQkgKiB0byBmaW5kIHRoZSB0eXBlIG9mIGFycmF5IGl0IHNob3VsZCBiZSBjcmVhdGluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEFSUkFZX0NSRUFUSU9OX0RJTUVOU0lPTl8xID0gbmV3IEludGVnZXIoMSk7CS8vIFVzZSBpbiBub3JtYWwgY2FzZSBvZiBvbmUgZGltZW5zaW9uLiBTYXZlIG9iamVjdCBjcmVhdGlvbi4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEFSUkFZX0NSRUFUSU9OX0RJTUVOU0lPTl8wID0gbmV3IEludGVnZXIoMCk7CS8vIFVzZSBpbiBub3JtYWwgY2FzZSBvZiBpbml0aWFsaXplci4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBBUlJBWV9JTklUSUFMSVpFUiA9IG5ldyBFeHByZXNzaW9uRW51bShJbnRlZ2VyLk1JTl9WQUxVRSsxLCAiQXJyYXkgSW5pdGlhbGl6ZXIgSW50ZXJuYWwiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogQVJSQVkgSU5JVElBTElaRVIgZXhwcmVzc2lvbgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJSUV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OIChmb3IgbiB0aW1lcyBkZXBlbmRpbmcgb24gbnVtYmVyIG9mIGV4cHJlc3Npb25zIGNvdW50KQotCSAqIAlQUk9DRVNTX0VYUFJFU1NJT04KLQkgKiAKLQkgKiBUaGUgdmFsdWUgc3RhY2sgd2lsbCBoYXZlCi0JICogCUFSUkFZSU5JVElBTElaRVIKLQkgKiAgdHlwZSAoZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSwgb3IgYW4gSUJlYW5Qcm94eVR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlKS4KLQkgKiAJCUkuZS4gaWYgYXJyYXkgYmVpbmcgY3JlYXRlZCBpcyBpbnRbXVtdLCB0aGUgdmFsdWUgcHVzaGVkIGhlcmUgd2lsbCBiZSBpbnRbXS4gVGhpcyBpcyBiZWNhdXNlIHdoZW4gY3JlYXRlZAotCSAqIAkJdGhlIGFycmF5IHdpbGwgd2luZCB1cCB3aXRoIGludFtleHByZXNzaW9uY291bnRdW10gaW4gdGhlIGVuZC4KLQkgKiAJSW50ZWdlciAoZXhwcmVzc2lvbiBjb3VudCkKLQkgKiAKLQkgKiBOb3RlOiBJbWJlZGRlZCBBcnJheSBJbml0aWFsaXplcnMgd29ya3Mgd2l0aCB0aGlzIGluIHRoYXQgaXQgd2lsbCBwZWVrIGludG8gdGhlIHZhbHVlIHN0YWNrIHR3byBlbnRyaWVzIGRvd24KLQkgKiB0byBmaW5kIHRoZSB0eXBlIG9mIGFycmF5IGl0IHNob3VsZCBiZSBjcmVhdGluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEFSUkFZSU5JVElBTElaRVJfQ09VTlRfMCA9IG5ldyBJbnRlZ2VyKDApOwkvLyBVc2UgaW4gbm9ybWFsIGNhc2Ugb2YgZW1wdHkgYXJyYXkuIFNhdmUgb2JqZWN0IGNyZWF0aW9uLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgQVJSQVlJTklUSUFMSVpFUl9DT1VOVF8xID0gbmV3IEludGVnZXIoMSk7CS8vIFVzZSBpbiBub3JtYWwgY2FzZSBvZiBvbmUgZWxlbWVudCBhcnJheS4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBBUlJBWUlOSVRJQUxJWkVSX0NPVU5UXzIgPSBuZXcgSW50ZWdlcigyKTsJLy8gVXNlIGluIG5vcm1hbCBjYXNlIG9mIHR3byBlbGVtZW50IGFycmF5LiBTYXZlIG9iamVjdCBjcmVhdGlvbi4JCi0JCi0JLyoKLQkgKiBDQVNUIGV4cHJlc3Npb24uCi0JICogVGhlIGV4cHJlc3Npb24gc3RhY2sgd2lsbCBoYXZlOgotCSAqIAlJRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04KLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJQ0FTVAotCSAqIAl0eXBlIChlaXRoZXIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0eXBlLCBvciBhbiBJQmVhblByb3h5VHlwZSByZXByZXNlbnRpbmcgdGhlIHR5cGUpLgotCSAqLwotCi0JLyoKLQkgKiBDTEFTUyBJTlNUQU5DRSBDUkVBVElPTiBleHByZXNzaW9uLgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAgSUV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UIChmb3IgMCB0byBuIHRpbWVzIGRlcGVuZGluZyBvbiBhcmd1bWVudCBjb3VudCkKLQkgKiAgUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZQotCSAqICBDTEFTU0lOU1RBTkNFQ1JFQVRJT04KLQkgKiAgdHlwZSAoZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSwgb3IgYW4gSUJlYW5Qcm94eVR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlKS4KLQkgKiAgSW50ZWdlcihhcmd1bWVudCBjb3VudCkgCi0JICogCi0JICogCi0JICogTm90ZTogQXJyYXkgSW5pdGlhbGl6ZXIgd29ya3Mgd2l0aCB0aGlzIGluIHRoYXQgaXQgd2lsbCBwZWVrIGludG8gdGhlIHZhbHVlIHN0YWNrIHR3byBlbnRyaWVzIGRvd24KLQkgKiB0byBmaW5kIHRoZSB0eXBlIG9mIGFycmF5IGl0IHNob3VsZCBiZSBjcmVhdGluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX0FSR1VNRU5UU18xID0gbmV3IEludGVnZXIoMSk7CS8vIFVzZSBpbiBub3JtYWwgY2FzZSBvZiBvbmUgYXJndW1lbnQuIFNhdmUgb2JqZWN0IGNyZWF0aW9uLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fQVJHVU1FTlRTXzAgPSBuZXcgSW50ZWdlcigwKTsJLy8gVXNlIGluIG5vcm1hbCBjYXNlIG9mIG5vIGFyZ3VtZW50cyAoZGVmYXVsdCBjdG9yKS4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0KLQkvKgotCSAqIENPTkRJVElPTkFMIGV4cHJlc3Npb24uCi0JICogU2luY2UgdGhpcyBjYW4gY2F1c2Ugc2tpcHBpbmcgb2YgZXhwcmVzc2lvbnMgKGUuZy4gaWYgY29uZGl0aW9uIGlzIGZhbHNlLCB0aGVuIHRoZSB0cnVlIGNvbmRpdGlvbiBzaG91bGQgbm90IGJlIGV2YWx1YXRlZCksCi0JICogd2UgbmVlZCB0byBoYXZlIGEgcHJvY2VzcyBleHByZXNzaW9uIGFuZCBwcm9jZXNzIGNhbGwgdG8gdGhlIG90aGVyIHNpZGUgZm9yIGVhY2ggZXhwcmVzc2lvbiBzbyB0aGF0IGl0IGNhbgotCSAqIGRldGVybWluZSBpZiBpdCBzaG91bGQgYmUgaWdub3JlZCBvciBub3QuCi0JICogCi0JICogVGhlIGV4cHJlc3Npb24gc3RhY2sgd2lsbCBoYXZlOgotCSAqIAlJRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04KLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCUlFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUKLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCUlFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFCi0JICogCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUNPTkRJVElPTkFMCi0JICogCUNPTkRJVElPTkFMX0NPTkRJVElPTgotCSAqIAlDT05ESVRJT05BTAotCSAqIAlDT05ESVRJT05BTF9UUlVFCi0JICogCUNPTkRJVElPTkFMCi0JICogCUNPTkRJVElPTkFMX0ZBTFNFCi0JICogCi0JICovCi0JCi0JLyoKLQkgKiBQUkVGSVggZXhwcmVzc2lvbi4KLQkgKiBUaGUgZXhwcmVzc2lvbiBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ECi0JICogCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCVBSRUZJWAotCSAqIAlvcGVyYXRvciAodXNpbmcgSW50ZWdlciBwcmVmaXggb3BlcmF0b3IgY29uc3RhbnRzIGRlZmluZWQgaGVyZSkgCi0JICovCi0JCi0JLyoKLQkgKiBJTkZJWCBleHByZXNzaW9uLgotCSAqIFNpbmNlIHR3byB0eXBlcyBvZiBpbmZpeCBvcGVyYXRvcnMgKGNvbmRpdGlvbmFsIGFuZCBBTkQgb3IpIGNhbiBjYXVzZSBza2lwcGluZyBvZiBleHByZXNzaW9ucyAoZS5nLiBvbmNlCi0JICogY29uZGl0aW9uYWwgYW5kIHNlZXMgYSBmYWxzZSBleHByZXNzaW9uLCB0aGUgcmVzdCBvZiB0aGUgZXhwcmVzc2lvbnMgYXJlIHNraXBwZWQgYW5kIHNob3VsZCBub3QgYmUgZXZhbHVhdGVkKSwKLQkgKiB3ZSBuZWVkIHRvIGhhdmUgYSBwcm9jZXNzIGV4cHJlc3Npb24gYW5kIHByb2Nlc3MgY2FsbCB0byB0aGUgb3RoZXIgc2lkZSBmb3IgZWFjaCBleHByZXNzaW9uIHNvIHRoYXQgaXQgY2FuCi0JICogZGV0ZXJtaW5lIGlmIGl0IHNob3VsZCBiZSBpZ25vcmVkIG9yIG5vdC4KLQkgKiAKLQkgKiBUaGUgZXhwcmVzc2lvbiBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlFeHByZXNzaW9uLklORklYX0xFRlQKLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCUlFeHByZXNzaW9uLklORklYX1JJR0hUCi0JICogIFBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAkJKGZvciAwIHRvIG4gdGltZXMgZGVwZW5kaW5nIHVwb24gZXh0ZW5kZWQgY291bnQpCi0JICogCQlJRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCAKLQkgKiAJCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlORklYCi0JICogCW9wZXJhdG9yICh1c2luZyBJbnRlZ2VyIGluZml4IG9wZXJhdG9yIGNvbnN0YW50cyBkZWZpbmVkIGhlcmUpCi0JICogIElOX0xFRlQKLQkgKiAJCShmb3IgKGV4dGVuZGVkQ291bnQpIHRpbWVzKSBUaGlzIHdpbGwgY292ZXIgdGhlIHJpZ2h0IG9uZSBhbmQgYWxsIGJ1dCBsYXN0IGV4dGVuZGVkCi0JICogCQlJTkZJWAotCSAqIAkJb3BlcmF0b3IgKHVzaW5nIEludGVnZXIgaW5maXggb3BlcmF0b3IgY29uc3RhbnRzIGRlZmluZWQgaGVyZSkKLQkgKiAgCUlOX09USEVSCi0JICogSU5GSVgKLQkgKiAJb3BlcmF0b3IgKHVzaW5nIEludGVnZXIgaW5maXggb3BlcmF0b3IgY29uc3RhbnRzIGRlZmluZWQgaGVyZSkKLQkgKiAgSU5fTEFTVCAodGhpcyBpcyBjb3ZlcnMgZWl0aGVyIHRoZSByaWdodCBvbmUgaWYgbm8gZXh0ZW5kZWQsIG9yIHRoZSBsYXN0IGV4dGVuZGVkKQotCSAqLwotCQotCS8qCi0JICogSU5TVEFOQ0VPRiBleHByZXNzaW9uLgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJSUV4cHJlc3Npb24uSU5TVEFOQ0VPRl9FWFBSRVNTSU9OCi0JICogCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlOU1RBTkNFT0YKLQkgKiAJdHlwZSAoZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSwgb3IgYW4gSUJlYW5Qcm94eVR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlKS4KLQkgKi8KLQotCS8qCi0JICogRmllbGQgYWNjZXNzIGV4cHJlc3Npb24uCi0JICogVGhlIGV4cHJlc3Npb24gc3RhY2sgd2lsbCBoYXZlOgotCSAqIAlJRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiAoaWYgaGFzUmVjZWl2ZXIgaXMgdHJ1ZSkKLQkgKiAJUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAJRklFTERBQ0NFU1MKLQkgKiAJbmFtZSAodGhlIG5hbWUgb2YgdGhlIGZpZWxkKQotCSAqICBCb29sZWFuICh0cnVlIGlmIGhhcyByZWNlaXZlcikKLQkgKi8KLQotCS8qCi0JICogTWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbi4KLQkgKiBUaGUgZXhwcmVzc2lvbiBzdGFjayB3aWxsIGhhdmU6Ci0JICogCUlFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUiAoaWYgaGFzUmVjZWl2ZXIgaXMgdHJ1ZSkKLQkgKiAJSUV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5UICgwIHRvIG4gdGltZXMgZm9yIGhvdyBtYW55IGFyZ3VtZW50cykuCi0JICogCVBST0NFU1NfRVhQUkVTU0lPTgotCSAqIAotCSAqIFRoZSB2YWx1ZSBzdGFjayB3aWxsIGhhdmU6Ci0JICogCU1FVEhPRElOVk9DQVRJT04KLQkgKiAJbmFtZSAodGhlIG5hbWUgb2YgdGhlIG1ldGhvZCkKLQkgKiAgQm9vbGVhbiAodHJ1ZSBpZiBoYXMgcmVjZWl2ZXIpCi0JICogIGFyZ0NvdW50ICh0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cykuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBNRVRIT0RfQVJHVU1FTlRTXzEgPSBuZXcgSW50ZWdlcigxKTsJLy8gVXNlIGluIG5vcm1hbCBjYXNlIG9mIG9uZSBhcmd1bWVudC4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBNRVRIT0RfQVJHVU1FTlRTXzAgPSBuZXcgSW50ZWdlcigwKTsJLy8gVXNlIGluIG5vcm1hbCBjYXNlIG9mIG5vIGFyZ3VtZW50cy4gU2F2ZSBvYmplY3QgY3JlYXRpb24uCi0JCi0KLQkvKgotCSAqIEFzc2lnbm1lbnQgZXhwcmVzc2lvbgotCSAqIFRoZSBleHByZXNzaW9uIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAgSUV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVAotCSAqICBJRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQKLQkgKiAgUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAgQVNTSUdOTUVOVAotCSAqICBsZWZ0IGV4cHJlc3Npb24gKHZhcmlhYmxlIHJlZmVyZW5jZSkKLQkgKiAgcmlnaHQgZXhwcmVzc2lvbgotCSAqLwotCi0JLyoKLQkgKiBBc3NpZ25tZW50IHByb3h5IGV4cHJlc3Npb24KLQkgKiBUaGUgZXhwcmVzc2lvbiBzdGFjayB3aWxsIGhhdmU6Ci0JICogIElFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQKLQkgKiAgUFJPQ0VTU19FWFBSRVNTSU9OCi0JICogCi0JICogVGhlIHZhbHVlIHN0YWNrIHdpbGwgaGF2ZToKLQkgKiAgQVNTSUdOTUVOVF9QUk9YWQotCSAqICBleHByZXNzaW9uIHByb3h5IChhbiBleHByZXNzaW9uIHByb3h5KQotCSAqLwotCQotCS8qCi0JICogTmV4dCB2YWxpZCBmb3IgZXhwcmVzc2lvbiBzdGFjay4gVGhpcyBpcyBrZXB0IGFzIGEgc3RhY2sgYWxzby4KLQkgKiBBcyB0aGUgZXhwcmVzc2lvbnMgY29tZSBpbiwgdGhlIGFwcHJvcHJpYXRlIG9yZGVyIChpbiByZXZlcnNlKQotCSAqIG9mIGV4cHJlc3Npb24gdHlwZXMgd2lsbCBiZSBwdXNoZWQsIGFuZCB0aGVuIHBvcHBlZCBhcyB0aGV5IAotCSAqIGNvbWUgaW4uCi0JICogCi0JICogU2luY2Ugd2UgY2FuJ3QgaGF2ZSBhbiBhcnJheSBsaXN0IG9mIGludHMsIHdpbGwgc2ltdWxhdGUgdGhlCi0JICogc3RhY2sgaGVyZS4KLQkgKi8KLQlwcml2YXRlIEZvckV4cHJlc3Npb25bXSBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrID0gbmV3IEZvckV4cHJlc3Npb25bMzBdOwotCXByaXZhdGUgaW50IG5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MgPSAtMTsJLy8gUG9zaXRpb24gb2YgdG9wIGVudHJ5IGluIHN0YWNrLgotCXByaXZhdGUgYm9vbGVhbiBleHByZXNzaW9uVmFsaWQgPSB0cnVlOwkvLyBJcyB0aGUgZXhwcmVzc2lvbiBjdXJyZW50bHkgdmFsaWQuCi0JcHJpdmF0ZSBTdHJpbmcgaW52YWxpZE1zZyA9IG51bGw7CS8vIE1zZyBmb3IgYmVpbmcgaW52YWxpZCBpZiBkZWZhdWx0IG1zZyBub3Qgc3VmZmljaWVudC4KLQlwcml2YXRlIExpc3QgZXhwcmVzc2lvblByb3hpZXM7CS8vIExpc3Qgb2YgZXhwcmVzc2lvbiBwcm94aWVzLiBUaGUgaW5kZXggb2YgdGhlIHByb3h5IGlzIGl0cyBpZC4gVGhpcyBsaXN0IG11c3QgbmV2ZXIgc2hyaW5rIGluIHNpemUuCi0KLQkvLyBBIE1hcmtFbnRyeS4gVG8gYWxsb3cgcmVzdG9yZSBpbiBjYXNlIG9mIGVycm9yLgotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtFbnRyeSB7Ci0JCXB1YmxpYyBpbnQgbWFya0lEOwotCQlwdWJsaWMgaW50IGNvbnRyb2xTdGFja1BvczsJLy8gUG9zaXRpb24gb2YgY29udHJvbCBzdGFjayBhdCB0aW1lIG9mIG1hcmsuCi0JCXB1YmxpYyBpbnQgbmV4dEV4cHJlc3Npb25TdGFja1BvczsJLy8gUG9zaXRpb24gb2YgbmV4dEZvckV4cHJlc3Npb24gc3RhY2sgYXQgdGltZSBvZiBtYXJrLgotCQlwdWJsaWMgaW50IGV4cHJlc3Npb25Qcm94aWVzUG9zOwkvLyBQb3NpdGlvbiBvZiBleHByZXNzaW9uUHJveGllcyBsaXN0IGF0IHRpbWUgb2YgbWFyay4KLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgaGlnaGVzdE1hcmtJRCA9IDA7CS8vIE5leHQgbWFyayBpZC4gJzAnIGlzIGludmFsaWQsIGFzIGluIG5vIG1hcmtzLiBUaGlzIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIG5ldyBtYXJrLiBOZXZlciBkZWNyZW1lbnRlZC4KLQlwcml2YXRlIE1hcmtFbnRyeSBjdXJyZW50TWFya0VudHJ5OwkvLyBKdXN0IGEgY29udmllbmVuY2UgdG8gdGhlIGN1cnJlbnQgbWFyayBlbnRyeSBzbyBubyBuZWVkIHRvIGxvb2sgaW50byB0aGUgbGlzdCBldmVyeSB0aW1lLgotCXByaXZhdGUgTGlzdCBtYXJrRW50cmllczsJLy8gU3RhY2sgb2YgbWFyayBlbnRyaWVzLgotCQotCS8vIFRoaXMgY2xhc3MgaXMgaGVyZSBzbyB3ZSBjYW4gYWRkIG91ciBzcGVjaWFsIGludGVybmFsIEZvckV4cHJlc3Npb246IFBST0NFU1NfRVhQUkVTU0lPTi4gVGhlc2UgYXJlIG5ldmVyIHVzZWQgb3V0c2lkZSBFeHByZXNzaW9uLgotCXByaXZhdGUgc3RhdGljIGNsYXNzIEV4cHJlc3Npb25FbnVtIGV4dGVuZHMgRm9yRXhwcmVzc2lvbiB7Ci0KLQkJcHVibGljIEV4cHJlc3Npb25FbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQkJfQotCQkKLQl9Ci0JCi0JLy8gVGhpcyBpcyBwdXNoZWQgb250byB0aGUgbmV4dCBleHByZXNzaW9uIHN0YWNrLCBhbmQgd2hlbiBpdCBpcyBwb3BwZWQsIHRoZW4gdGhlIGV4cHJlc3Npb24gaXMgY29tcGxldGUgYW5kIHJlYWR5IHRvIGJlIHB1c2hlZCB0byB0aGUgcHJveHkgc2lkZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIFBST0NFU1NfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShJbnRlZ2VyLk1JTl9WQUxVRSwgIlByb2Nlc3MgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gVGhpcyBpcyBwdXNoZWQgb250byB0aGUgbmV4dCBleHByZXNzaW9uIHN0YWNrIGZvciBlbmQgYmxvY2sgYW5kIHdpbGwgdGVzdCBpZiB0aGlzIHRoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIGJlaW5nIGNhbGxlZCBjb3JyZWN0bHkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBCTE9DS0VORF9FWFBSRVNTSU9OID0gbmV3IEV4cHJlc3Npb25FbnVtKFBST0NFU1NfRVhQUkVTU0lPTi5nZXRWYWx1ZSgpLTIsICJFbmQgQmxvY2sgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGlzIGlzIHB1c2hlZCBvbnRvIHRoZSBuZXh0IGV4cHJlc3Npb24gc3RhY2sgZm9yIGVuZCB0cnkgYW5kIHdpbGwgdGVzdCBpZiB0aGlzIHRoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIGJlaW5nIGNhbGxlZCBjb3JyZWN0bHkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9yRXhwcmVzc2lvbiBUUllFTkRfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShCTE9DS0VORF9FWFBSRVNTSU9OLmdldFZhbHVlKCktMSwgIkVuZCBUcnkgRXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGlzIGlzIHB1c2hlZCBvbnRvIHRoZSBuZXh0IGV4cHJlc3Npb24gc3RhY2sgZm9yIGNhdGNoIGFuZCB3aWxsIHRlc3QgaWYgdGhpcyB0aGVyZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBiZWluZyBjYWxsZWQgY29ycmVjdGx5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gVFJZQ0FUQ0hfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShUUllFTkRfRVhQUkVTU0lPTi5nZXRWYWx1ZSgpLTEsICJDYXRjaCBFeHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQotCS8vIFRoaXMgaXMgcHVzaGVkIG9udG8gdGhlIG5leHQgZXhwcmVzc2lvbiBzdGFjayBmb3IgYmVnaW4gdGhyZWFkIHRyYW5zZmVyIGFuZCB3aWxsIHRlc3QgaWYgdGhpcyB0aGVyZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBiZWluZyBjYWxsZWQgY29ycmVjdGx5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvckV4cHJlc3Npb24gVEhSRUFEVFJBTlNGRVJfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShUUllDQVRDSF9FWFBSRVNTSU9OLmdldFZhbHVlKCktMSwgIkNhdGNoIEV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhpcyBpcyBwdXNoZWQgb250byB0aGUgbmV4dCBleHByZXNzaW9uIHN0YWNrIGZvciBlbmQgc3ViZXhwcmVzc2lvbiBhbmQgd2lsbCB0ZXN0IGlmIHRoaXMgdGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgYmVpbmcgY2FsbGVkIGNvcnJlY3RseS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb3JFeHByZXNzaW9uIFNVQkVYUFJFU1NJT05FTkRfRVhQUkVTU0lPTiA9IG5ldyBFeHByZXNzaW9uRW51bShUSFJFQURUUkFOU0ZFUl9FWFBSRVNTSU9OLmdldFZhbHVlKCktMiwgIkVuZCBTdWJleHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENoZWNrIHRoZSBmb3IgZXhwcmVzc2lvbiwgYW5kIGlmIGxlZ2FsLCBzZXQgdG8gdGhlIG5leHQgdmFsaWQgZm9yIGV4cHJlc3Npb24gdHlwZSwKLQkgKiBpZiBpdCBjYW4uIElmIHRoZSBzdGFjayBlbnRyeSBpcyBST09URVhQUkVTU0lPTiwgYW5kIHRoZSBmb3JFeHByZXNzaW9uIGlzIFJPT1RFWFBSRVNTSU9OLAotCSAqIHRoZW4gdGhlIGV4cHJlc3Npb24gaXMgYWxsb3dlZCwgYnV0IGl0IGlzIG5vdCBwb3BwZWQuIEl0IG11c3QgYmUgcG9wcGVkIGxhdGVyIHdoZW4gYXBwcm9wcmlhdGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBmb3IgImJsb2NrIiBleHByZXNzaW9ucy4gV2UgZG9uJ3Qgd2FudCB0byBwb3AgZG93biB0aGUgc3RhY2sgcGFzc2VkIHRoZSBST09URVhQUkVTU0lPTgotCSAqIHRoYXQgZ290IGFkZGVkIGJ5IHRoZSBjcmVhdGUgYmxvY2sgdW50aWwgd2UgZ2V0IGFuIGVuZCBibG9jay4gVGhhdCBhbGxvd3Mgcm9vdCBleHByZXNzaW9ucyB0bwotCSAqIGJlIGFkZGVkIHRvIHRoZSBibG9jayB3aXRob3V0IHRoZSBzdGFjayBwb3BwaW5nIHVwIHBhc3QgdGhlIGJsb2NrIHN0YXJ0IGluIHRoZSBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCWlmIChleHByZXNzaW9uVmFsaWQpIHsKLQkJCWlmIChuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID09IC0xKQotCQkJCWlmIChmb3JFeHByZXNzaW9uID09IEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pCi0JCQkJCXJldHVybjsJLy8gdmFsaWQuIFdlIGFyZSBhdCB0aGUgcm9vdCAoaS5lLiBub3RoaW5nIGlzIHdhaXRpbmcpLgotCQkJCWVsc2UKLQkJCQkJOwkvLyBpbnZhbGlkLiBkcm9wIHRocm91Z2gKLQkJCWVsc2UgaWYgKG5leHRGb3JFeHByZXNzaW9uU3RhY2tbbmV4dEZvckV4cHJlc3Npb25TdGFja1Bvc10gPT0gZm9yRXhwcmVzc2lvbikgewotCQkJCS8vIFZhbGlkLCBlaXRoZXIgdGhlIHJvb3QgZXhwcmVzc2lvbiBtYXRjaGVkIChXZSBkb24ndCBpbXBsaWNpdGx5IHBvcCB0aG9zZS4gVGhhdCBuZWVkcyB0byBiZSBkb25lIGV4cGxpY2l0bHkpLiAKLQkJCQkvLyBPciB3ZSBtYXRjaGVkIG5vbi1yb290LCB0aG9zZSB3aWxsIGJlIHBvcHBlZC4KLQkJCQlpZiAoZm9yRXhwcmVzc2lvbiAhPSBGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKSB7Ci0JCQkJCXBvcEZvckV4cHJlc3Npb24oKTsJLy8gUG9wIHRoZSBzdGFjayBzaW5jZSBzdGFjayBub3QgYSByb290IGV4cHJlc3Npb24uCi0JCQkJfQotCQkJCXJldHVybjsJCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgZXhwTXNnID0gaW52YWxpZE1zZyAhPSBudWxsID8gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5FeHByZXNzaW9uX0luSW52YWxpZFN0YXRlRHVlVG9fRVhDXywgbmV3IE9iamVjdFtdIHtpbnZhbGlkTXNnfSkgOiBQcm94eU1lc3NhZ2VzLkV4cHJlc3Npb25fSW5JbnZhbGlkU3RhdGVfRVhDXzsgCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4cE1zZyk7Ci0JCX0KLQkJCi0JCS8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIGludmFsaWQuCi0JCUZvckV4cHJlc3Npb24gZXhwZWN0ZWQgPSBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrW25leHRGb3JFeHByZXNzaW9uU3RhY2tQb3NdOwotCQlleHByZXNzaW9uVmFsaWQgPSBmYWxzZTsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eU1lc3NhZ2VzLkV4cHJlc3Npb25fVHlwZVNlbnRJbkludmFsaWRPcmRlcl9FWENfLCBuZXcgT2JqZWN0W10ge2ZvckV4cHJlc3Npb24sIGV4cGVjdGVkfSkpOyAKLQl9Ci0JCi0JLyoqCi0JICogUG9wIHRoZSB0b3AgZm9yIGV4cHJlc3Npb24sIHdoYXRldmVyIGl0IGlzLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0cnkgdG8gcG9wIHRocm91Z2ggdGhyb3VnaCB0aGUgY3VycmVudCBtYXJrIGVudHJ5LiBUaGUgZW5kTWFyayBpcyB0aGUgb25seSBvbmUgd2hvIGNhbiBkbyB0aGlzLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHBvcEZvckV4cHJlc3Npb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJaWYgKGV4cHJlc3Npb25WYWxpZCAmJiBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID49IDApIHsKLQkJCW5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MtLTsKLQkJCWlmIChjdXJyZW50TWFya0VudHJ5ICE9IG51bGwgJiYgbmV4dEZvckV4cHJlc3Npb25TdGFja1BvcyA8IGN1cnJlbnRNYXJrRW50cnkubmV4dEV4cHJlc3Npb25TdGFja1BvcykgewotCQkJCW5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MrKzsJLy8gUmVzdG9yZSB0byB3aGF0IGl0IHdhcwotCQkJCXRocm93SW52YWxpZE1hcmtOZXN0aW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRocm93SW52YWxpZE1hcmtOZXN0aW5nKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCWV4cHJlc3Npb25WYWxpZCA9IGZhbHNlOwotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5TWVzc2FnZXMuRXhwcmVzc2lvbl9JbnZhbGlkTWFya05lc3RpbmcsIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoY3VycmVudE1hcmtFbnRyeSAhPSBudWxsID8gY3VycmVudE1hcmtFbnRyeS5tYXJrSUQgOiAwKX0pKTsgCi0JfQotCQotCS8qKgotCSAqIFBlZWsgaW50byB0aGUgZm9yIGV4cHJlc3Npb24gc3RhY2sgdG8gc2VlIGlmIHRoZSB0b3AgZW50cnkgaXMgdGhlIHBhc3NlZCBpbiB2YWx1ZS4gSXQgd2lsbAotCSAqIG5vdCBwb3AgdGhlIHN0YWNrIG5vciB0aHJvdyBhbnkgZXhjZXB0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbiBUaGUgdG9wIGV4cHJlc3Npb24gZmxhZyB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhpcyB2YWx1ZS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0b3AgZXhwcmVzc2lvbiBlcXVhbHMgdGhlIHBhcmFtZXRlciBwYXNzZWQgaW4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcGVla0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uVmFsaWQpIHsKLQkJCWlmIChuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zID09IC0xKQotCQkJCWlmIChmb3JFeHByZXNzaW9uID09IEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pCi0JCQkJCXJldHVybiB0cnVlOwkvLyB2YWxpZC4gV2UgYXJlIGF0IHRoZSByb290IChpLmUuIG5vdGhpbmcgaXMgd2FpdGluZykuCi0JCQkJZWxzZQotCQkJCQk7CS8vIGludmFsaWQuIGRyb3AgdGhyb3VnaAotCQkJZWxzZSBpZiAobmV4dEZvckV4cHJlc3Npb25TdGFja1tuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zXSA9PSBmb3JFeHByZXNzaW9uKQotCQkJCXJldHVybiB0cnVlOwkvLyBWYWxpZCwgdGhlIHRvcCBleHByZXNzaW9uIG1hdGNoZWQuCi0JCX0gCi0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCS8qKgotCSAqIE1hcmsgdGhpcyBleHByZXNzaW9uIGFzIG5vdyBpbnZhbGlkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIG1hcmtJbnZhbGlkKCkgewotCQlleHByZXNzaW9uVmFsaWQgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogTWFyayB0aGlzIGV4cHJlc3Npb24gYXMgbm93IGludmFsaWQsIGJ1dCBzdXBwbHkgYSBtZXNzYWdlIHRvIGdvIHdpdGggaXQuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIG1hcmtJbnZhbGlkKFN0cmluZyBtc2cpIHsKLQkJaW52YWxpZE1zZyA9IG1zZzsKLQkJbWFya0ludmFsaWQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCW5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MgPSAtMTsKLQkJY29udHJvbFN0YWNrLmNsZWFyKCk7Ci0JCWlmIChleHByZXNzaW9uUHJveGllcyAhPSBudWxsKQotCQkJbWFya0FsbFByb3hpZXNOb3RSZXNvbHZlZChleHByZXNzaW9uUHJveGllcyk7CS8vIFRoZXkgd2VyZW4ndCBwcm9jZXNzZWQsIGNsb3NlIG11c3Qgb2YgYmVlbiBjYWxsZWQgZWFybHkuCi0JCWV4cHJlc3Npb25Qcm94aWVzID0gbnVsbDsKLQkJbWFya0VudHJpZXMgPSBudWxsOwotCQlleHByZXNzaW9uVmFsaWQgPSBmYWxzZTsKLQkJY2xvc2VQcm94eSgpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNpc1ZhbGlkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvblZhbGlkOwotCX0KLQkKLQkvKgotCSAqIENoZWNrIGlmIHRoZSBwZW5kaW5nIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIGV2YWx1YXRpb24uCi0JICogSXQgaXMgY29tcGxldGUgaWYgdGhlIG5leHQgZW50cnkgb24gdGhlIHN0YWNrIGlzIGEgUFJPQ0VTU19FWFBSRVNTSU9OCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4cHJlc3Npb25SZWFkeSgpIHsKLQkJaWYgKG5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MgPj0gMCAmJiBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrW25leHRGb3JFeHByZXNzaW9uU3RhY2tQb3NdID09IFBST0NFU1NfRVhQUkVTU0lPTikgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7CS8vIHBvcCBpdAotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIFB1c2ggdGhlIG5leHQgZXhwcmVzc2lvbiB0eXBlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIG5leHRFeHByZXNzaW9uKSB7Ci0JCWlmICgrK25leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MgPj0gbmV4dEZvckV4cHJlc3Npb25TdGFjay5sZW5ndGgpIHsKLQkJCS8vIEluY3JlYXNlIHN0YWNrIHNpemUuCi0JCQlGb3JFeHByZXNzaW9uW10gbmV3U3RhY2sgPSBuZXcgRm9yRXhwcmVzc2lvbltuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zKjJdOwkvLyBTbyByb29tIHRvIGdyb3cgd2l0aG91dCBleGNlc3NpdmUgYWxsb2NhdGlvbnMuCi0JCQlTeXN0ZW0uYXJyYXljb3B5KG5leHRGb3JFeHByZXNzaW9uU3RhY2ssIDAsIG5ld1N0YWNrLCAwLCBuZXh0Rm9yRXhwcmVzc2lvblN0YWNrLmxlbmd0aCk7Ci0JCQluZXh0Rm9yRXhwcmVzc2lvblN0YWNrID0gbmV3U3RhY2s7Ci0JCX0KLQkJbmV4dEZvckV4cHJlc3Npb25TdGFja1tuZXh0Rm9yRXhwcmVzc2lvblN0YWNrUG9zXSA9IG5leHRFeHByZXNzaW9uOwotCX0KLQkKLQkvKgotCSAqIENoZWNrIGlmIGV4cHJlc3Npb24gaXMgY29tcGxldGUsIGFuZCBpZiBpdCBpcywgcHJvY2VzcyBpdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0V4cHJlc3Npb24oKSB7Ci0JCXdoaWxlIChleHByZXNzaW9uUmVhZHkoKSkgewotCQkJdHJ5IHsKLQkJCQkvLyBXZSd2ZSByZWNlaXZlZCBhbGwgb2YgdGhlIGV4cHJlc3Npb25zIGZvciB0aGUgZXhwcmVzc2lvbiwgc28gcHJvY2VzcyBpdC4KLQkJCQlpbnQgZXhwVHlwZSA9ICgoSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMpIHBvcCgpKS5nZXRWYWx1ZSgpOwotCQkJCXN3aXRjaCAoZXhwVHlwZSkgewotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNBU1RfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hDYXN0VG9Qcm94eSgoSVByb3h5QmVhblR5cGUpIHBvcCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLklOU1RBTkNFT0ZfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hJbnN0YW5jZW9mVG9Qcm94eSgoSVByb3h5QmVhblR5cGUpIHBvcCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlBSRUZJWF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaFByZWZpeFRvUHJveHkoKFByZWZpeE9wZXJhdG9yKXBvcCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLklORklYX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoSW5maXhUb1Byb3h5KChJbmZpeE9wZXJhdG9yKSBwb3AoKSwgKEludGVybmFsSW5maXhPcGVyYW5kVHlwZSkgcG9wKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfQUNDRVNTX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoQXJyYXlBY2Nlc3NUb1Byb3h5KCgoSW50ZWdlcikgcG9wKCkpLmludFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hBcnJheUNyZWF0aW9uVG9Qcm94eSgoSVByb3h5QmVhblR5cGUpIHBvcCgpLCAoKEludGVnZXIpIHBvcCgpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0lOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoQXJyYXlJbml0aWFsaXplclRvUHJveHkoKElQcm94eUJlYW5UeXBlKSBwb3AoKSwgKChJbnRlZ2VyKSBwb3AoKSkuaW50VmFsdWUoKSwgKChJbnRlZ2VyKSBwb3AoKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvblRvUHJveHkoKElQcm94eUJlYW5UeXBlKSBwb3AoKSwgKChJbnRlZ2VyKSBwb3AoKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5GSUVMRF9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hGaWVsZEFjY2Vzc1RvUHJveHkocG9wKCksICgoQm9vbGVhbikgcG9wKCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLk1FVEhPRF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaE1ldGhvZEludm9jYXRpb25Ub1Byb3h5KHBvcCgpLCAoKEJvb2xlYW4pIHBvcCgpKS5ib29sZWFuVmFsdWUoKSwgKChJbnRlZ2VyKSBwb3AoKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DT05ESVRJT05BTF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaENvbmRpdGlvbmFsVG9Qcm94eSgoSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlKSBwb3AoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoQXNzaWdubWVudFRvUHJveHkoKEV4cHJlc3Npb25Qcm94eSkgcG9wKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVNTSUdOTUVOVF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaEFzc2lnbm1lbnRUb1Byb3h5KCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5CTE9DS19FTkRfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJCXB1c2hCbG9ja0VuZFRvUHJveHkoKChJbnRlZ2VyKSBwb3AoKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfRU5EX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoVHJ5RW5kVG9Qcm94eSgoKEludGVnZXIpIHBvcCgpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlRIUk9XX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoVGhyb3dUb1Byb3h5KCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9URVNUX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCQlwdXNoSWZUZXN0VG9Qcm94eSgpOwotCQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCi0JCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSUZfRUxTRV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaElmRWxzZVRvUHJveHkoKEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUpIHBvcCgpKTsKLQkJCQkJCWJyZWFrOwkKLQkJCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5TVUJFWFBSRVNTSU9OX0VORF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkJcHVzaFN1YmV4cHJlc3Npb25FbmRUb1Byb3h5KCgoSW50ZWdlcikgcG9wKCkpLmludFZhbHVlKCkpOwotCQkJCQkJYnJlYWs7CQkJCQkJCi0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlpbnRlcm5hbFByb2Nlc3NVbmtub3duRXhwcmVzc2lvblR5cGUoZXhwVHlwZSk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQltYXJrSW52YWxpZCgpOwotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxQcm9jZXNzVW5rbm93bkV4cHJlc3Npb25UeXBlKGludCBleHByZXNzaW9uVHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmICghcHJvY2Vzc1Vua25vd25FeHByZXNzaW9uVHlwZShleHByZXNzaW9uVHlwZSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQW4gdW5rbm93biBleHByZXNzaW9uIHR5cGUgd2FzIGZvdW5kIGluIHRoZSBwcm9jZXNzaW5nIG9mIGV4cHJlc3Npb24gc3RhY2suIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0JICogdG8gcHJvY2VzcyBuZXcgdHlwZXMgb2YgZXhwcmVzc2lvbnMuIAotCSAqIDxwPgotCSAqIE92ZXJyaWRlcyBtdXN0IHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGV5IHByb2Nlc3NlZCB0aGUgZXhwcmVzc2lvbiB0eXBlLiBJZiB0aGV5IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpdCBtZWFucyB0aGV5IGRpZG4ndCB1bmRlcnN0YW5kIGl0IGVpdGhlciBhbmQgd2Ugc2hvdWxkIGRvIGRlZmF1bHQgcHJvY2Vzc2luZyBmb3IgdW5rbm93IHR5cGUuCi0JICogQHBhcmFtIGV4cHJlc3Npb25UeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0eXBlIHdhcyBwcm9jZXNzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3Qga25vd24gYnkgc3ViY2xhc3MgZWl0aGVyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NVbmtub3duRXhwcmVzc2lvblR5cGUoaW50IGV4cHJlc3Npb25UeXBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24oUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl0aGlzLmJlYW5Qcm94eUZhY3RvcnkgPSB0aGlzLnJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jZ2V0UmVnaXN0cnkoKQotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNpbnZva2VFeHByZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnZva2VFeHByZXNzaW9uKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsgLy8gV2UgYXJlIGF0IHRoZSByb290LgotCQkJcG9wRm9yRXhwcmVzc2lvbigpOwkvLyBHZXQgcmlkIG9mIGFueSBpbnRlcm1lZGlhdGUgcm9vdHMuCi0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7CS8vIFdlIHNob3VsZCBiZSBhdCB0cnVlIHJvb3Qgbm93LiBXZSBkb24ndCBoYXZlIG1vcmUgdGhhbiBvbmUgaW50ZXJtZWRpYXRlIHJvb3QgcHVzaGVkIGluIHNlcXVlbmNlLgotCQkJTGlzdCBwcm94aWVzID0gZXhwcmVzc2lvblByb3hpZXM7Ci0JCQlleHByZXNzaW9uUHJveGllcyA9IG51bGw7Ci0JCQlwdXNoSW52b2tlKHByb2Nlc3NFeHByZXNzaW9uUHJveHlDYWxsYmFja3MocHJveGllcyksIHByb3hpZXMpOwotCQl9IGZpbmFsbHkgewotCQkJbWFya0ludmFsaWQoKTsgLy8gTWFyayBpbnZhbGlkIHNvIGFueSBuZXcgY2FsbHMgYWZ0ZXIgdGhpcyB3aWxsIGZhaWwuCi0JCQljbG9zZSgpOwotCQl9Ci0JfQotCQkKLQkvKgotCSAqIFByb2Nlc3MgdGhlIGV4cHJlc3Npb24gcHJveHkgY2FsbGJhY2tzLCBpZiBhbnkuCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHByb3hpZXMgdGhhdCBoYXZlIGNhbGxiYWNrcy4KLQkgKi8KLQlwcml2YXRlIGludCBwcm9jZXNzRXhwcmVzc2lvblByb3h5Q2FsbGJhY2tzKExpc3QgcHJveGllcykgewotCQlpZiAocHJveGllcyAhPSBudWxsKSB7Ci0JCQkvLyBTdHJpcCBsaXN0IGRvd24gdG8gb25seSB0aG9zZSB3aXRoIGNhbGxiYWNrcyBhbmQgc2VuZCBvbi4KLQkJCWludCBwcm94aWVzV2l0aENhbGxiYWNrcyA9IDA7Ci0JCQlmb3IgKExpc3RJdGVyYXRvciBlcHMgPSBwcm94aWVzLmxpc3RJdGVyYXRvcigpOyBlcHMuaGFzTmV4dCgpOykgewotCQkJCUV4cHJlc3Npb25Qcm94eSBwcm94eSA9IChFeHByZXNzaW9uUHJveHkpIGVwcy5uZXh0KCk7Ci0JCQkJaWYgKCFwcm94eS5oYXNMaXN0ZW5lcnMoKSkKLQkJCQkJZXBzLnNldChudWxsKTsJLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QuIE5vIG9uZSBjYXJlcy4KLQkJCQllbHNlCi0JCQkJCXByb3hpZXNXaXRoQ2FsbGJhY2tzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gcHJveGllc1dpdGhDYWxsYmFja3M7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB0byB2YWxpZGF0ZSB0aGlzIGlzIGEgdmFsaWQgcHJveHkgZm9yIHRoaXMgZXhwcmVzc2lvbi4gVGhpcyBjb3VsZCBoYXBwZW4KLQkgKiBpZiBhIHByb3h5IGZyb20gYW5vdGhlciBleHByZXNzaW9uIGlzIHNlbnQgdG8gdGhpcyBleHByZXNzaW9uLiBJZiB0aGUgcHJveHkKLQkgKiBpcyBhIGJlYW4gcHJveHkgb3IgaXMgYW4gZXhwcmVzc2lvbiBwcm94eSBmb3IgdGhpcyBleHByZXNzaW9uLCB0aGVuIHRoaXMKLQkgKiBqdXN0IHJldHVybnMuIEVsc2UgaXQgd2lsbCB0aHJvdyB0aGUge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0uIAotCSAqIEBwYXJhbSBwcm94eQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcm94eSBpcyBhbiBleHByZXNzaW9uIHByb3h5IGZvciBhbm90aGVyIGV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm94eShJUHJveHkgcHJveHkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlpZiAocHJveHkgIT0gbnVsbCAmJiAocHJveHkuaXNFeHByZXNzaW9uUHJveHkoKSAmJiAoKEV4cHJlc3Npb25Qcm94eSkgcHJveHkpLmdldEV4cHJlc3Npb24oKSAhPSB0aGlzKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUHJveHlNZXNzYWdlcy5FeHByZXNzaW9uX0ludmFsaWRQcm94eSk7Ci0JfQotCQkKLQkvKioKLQkgKiBDYWxsZWQgYnkgc3ViY2xhc3MgdG8gZmlsbCBpbiB0aGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBwcm94eS4gU2VlIHtAbGluayBFeHByZXNzaW9uI3B1bGxQcm94eVZhbHVlKGludCwgTGlzdCkpfSBmb3IgYW4gZXhhbXBsZSBvZiB3aG8gd291bGQgY2FsbCBpdC4KLQkgKiBAcGFyYW0gZXAKLQkgKiBAcGFyYW0gYmVhbnByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3h5UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5IGVwLCBJQmVhblByb3h5IGJlYW5wcm94eSkgewotCQllcC5maXJlUmVzb2x2ZWQoYmVhbnByb3h5KTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHN1YmNsYXNzIHRvIGZpcmUgcHJveHkgd2FzIG5vdCByZXNvbHZlZC4gU2VlIHtAbGluayBFeHByZXNzaW9uI3B1bGxQcm94eVZhbHVlKGludCwgTGlzdCkpfSBmb3IgYW4gZXhhbXBsZSBvZiB3aG8gd291bGQgY2FsbCBpdC4KLQkgKiBAcGFyYW0gZXAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlOb3RSZXNvbHZlZChFeHByZXNzaW9uUHJveHkgZXApIHsKLQkJZXAuZmlyZU5vdFJlc29sdmVkKCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBieSBzdWJjbGFzcyB0byBmaXJlIHByb3h5IHJlc29sdmVkIHRvIGEgdm9pZCByZXR1cm4gdHlwZS4gU2VlIHtAbGluayBFeHByZXNzaW9uI3B1bGxQcm94eVZhbHVlKGludCwgTGlzdCkpfSBmb3IgYW4gZXhhbXBsZSBvZiB3aG8gd291bGQgY2FsbCBpdC4KLQkgKiBAcGFyYW0gZXAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJveHlWb2lkKEV4cHJlc3Npb25Qcm94eSBlcCkgewotCQllcC5maXJlVm9pZFJlc29sdmVkKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvblZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgSUJlYW5Qcm94eSBnZXRFeHByZXNzaW9uVmFsdWUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOyAvLyBXZSBhcmUgYXQgdGhlIHJvb3QuCi0JCQlwb3BGb3JFeHByZXNzaW9uKCk7CS8vIEdldCByaWQgb2YgYW55IGludGVybWVkaWF0ZSByb290cy4KLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsJLy8gV2Ugc2hvdWxkIGJlIGF0IHRydWUgcm9vdCBub3cuIFdlIGRvbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBpbnRlcm1lZGlhdGUgcm9vdCBwdXNoZWQgaW4gc2VxdWVuY2UuCi0JCQlMaXN0IHByb3hpZXMgPSBleHByZXNzaW9uUHJveGllczsKLQkJCWV4cHJlc3Npb25Qcm94aWVzID0gbnVsbDsKLQkJCXJldHVybiBwdWxsUHJveHlWYWx1ZShwcm9jZXNzRXhwcmVzc2lvblByb3h5Q2FsbGJhY2tzKHByb3hpZXMpLCBwcm94aWVzKTsgLy8gR2V0IHRoZSB0b3AgdmFsdWUuCi0JCX0gZmluYWxseSB7Ci0JCQltYXJrSW52YWxpZCgpOwkvLyBNYXJrIGludmFsaWQgc28gYW55IG5ldyBjYWxscyBhZnRlciB0aGlzIHdpbGwgZmFpbC4gCi0JCQljbG9zZSgpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogTWFyayB0aGUgbGlzdCBvZiBwcm94aWVzIGFzIG5vdCByZXNvbHZlZC4gCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFya0FsbFByb3hpZXNOb3RSZXNvbHZlZChMaXN0IHByb3hpZXMpIHsKLQkJaWYgKHByb3hpZXMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0SXRlcmF0b3IgZXBzID0gcHJveGllcy5saXN0SXRlcmF0b3IoKTsgZXBzLmhhc05leHQoKTspIHsKLQkJCQlFeHByZXNzaW9uUHJveHkgcHJveHkgPSAoRXhwcmVzc2lvblByb3h5KSBlcHMubmV4dCgpOwotCQkJCWlmIChwcm94eSAhPSBudWxsICYmIHByb3h5Lmhhc0xpc3RlbmVycygpKQotCQkJCQlmaXJlUHJveHlOb3RSZXNvbHZlZChwcm94eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBibG9ja051bWJlciA9IC0xOwkvLyBDdXJyZW50IGJsb2NrIG51bWJlci4gVGhpcyBpcyBhbHdheXMgaW5jcmVtZW50aW5nLgotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUJsb2NrQmVnaW4oKQotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgY3JlYXRlQmxvY2tCZWdpbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gQmxvY2tzIGFyZSBzcGVjaWFsLCB0aGV5IGNhbiBiZSBhbnl3aGVyZSBhdCByb290LCBvZiBjb3VsZCBiZSB0aGUgdHJ1ZSBvciBlbHNlIGNsYXVzZSBvZiBhbiBpZi9lbHNlLgotCQkJaWYgKHBlZWtGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pKQotCQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWVsc2UgaWYgKHBlZWtGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfVFJVRSkpCi0JCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfVFJVRSk7Ci0JCQllbHNlCi0JCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfRUxTRSk7Ci0JCQkKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihCTE9DS0VORF9FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCi0JCQlwdXNoQmxvY2tCZWdpblRvUHJveHkoKytibG9ja051bWJlcik7Ci0JCQlwdXNoKG5ldyBJbnRlZ2VyKGJsb2NrTnVtYmVyKSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkJMT0NLX0VORF9FWFBSRVNTSU9OKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCQlyZXR1cm4gYmxvY2tOdW1iZXI7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlQmxvY2tCcmVhayhpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQmxvY2tCcmVhayhpbnQgYmxvY2tOdW1iZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJcHVzaEJsb2NrQnJlYWtUb1Byb3h5KGJsb2NrTnVtYmVyKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVCbG9ja0VuZCgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQmxvY2tFbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXBvcEZvckV4cHJlc3Npb24oKTsgLy8gUmVtb3ZlIHRoZSByb290IGV4cHJlc3Npb24gc2luY2UgYmxvY2sgaXMgZG9uZS4KLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihCTE9DS0VORF9FWFBSRVNTSU9OKTsgLy8gVGhpcyBuZWVkcyB0byBiZSBuZXh0IGZvciBpdCB0byBiZSB2YWxpZC4KLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IC8vIE5vdyBsZXQgaXQgaGFuZGxlIHRoZSBwcmV2aW91c2x5IHB1c2hlZCBlbmQgYmxvY2ssIGNvbnRhaW5pbmcgdGhlIGJsb2NrIG51bWJlciBiZWluZyBlbmRlZC4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUFycmF5QWNjZXNzKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUFycmF5QWNjZXNzKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgaW50IGluZGV4Q291bnQpIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlpbnQgaSA9IGluZGV4Q291bnQ7Ci0JCQl3aGlsZSAoaS0tID4gMCkKLQkJCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVkpOwotCi0JCQlwdXNoKGluZGV4Q291bnQgPT0gMSA/IEFSUkFZQUNDRVNTX0lOREVYXzEgOiBuZXcgSW50ZWdlcihpbmRleENvdW50KSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0FDQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IC8vIFNlZSBpZiBwcmV2aW91cyBleHByZXNzaW9uIGlzIHJlYWR5IGZvciBwcm9jZXNzaW5nLgotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlQXJyYXlDcmVhdGlvbihpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHR5cGUsIGludCBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQpCi0JCXRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlwdXNoQXJyYXlDcmVhdGlvbihmb3JFeHByZXNzaW9uLCBnZXRQcm94eUJlYW5UeXBlKHR5cGUpLCBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUFycmF5Q3JlYXRpb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50KQotCQl0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlwdXNoQXJyYXlDcmVhdGlvbihmb3JFeHByZXNzaW9uLCB0eXBlLCBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwdXNoQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQl2YWxpZGF0ZVByb3h5KHR5cGUpOwotCQkJc3dpdGNoIChkaW1lbnNpb25FeHByZXNzaW9uQ291bnQpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCXB1c2goQVJSQVlfQ1JFQVRJT05fRElNRU5TSU9OXzApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCXB1c2goQVJSQVlfQ1JFQVRJT05fRElNRU5TSU9OXzEpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwdXNoKG5ldyBJbnRlZ2VyKGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCXB1c2godHlwZSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0NSRUFUSU9OX0VYUFJFU1NJT04pOwotCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJaWYgKGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCA9PSAwKQotCQkJCXB1c2hGb3JFeHByZXNzaW9uKEFSUkFZX0lOSVRJQUxJWkVSKTsKLQkJCWVsc2UgewotCQkJCXdoaWxlIChkaW1lbnNpb25FeHByZXNzaW9uQ291bnQtLSA+IDApCi0JCQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04pOwotCQkJfQotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsgLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVBcnJheUluaXRpYWxpemVyKGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVBcnJheUluaXRpYWxpemVyKGludCBleHByZXNzaW9uQ291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gVGhpcyBpcyBzcGVjaWFsLCB3ZSBjb3VsZCBiZSB3YWl0aW5nIGZvciBhbiBhcnJheSBpbml0aWFsaXplciBvciBhbiBhcnJheSBpbml0aWFsaXplciBleHByZXNzaW9uLgotCQkJLy8gV2Ugd2lsbCBwZWVrIHRvIHNlZSB3aGF0IGl0IGlzIGFuZCBoYW5kbGUgaXQuCi0JCQlpZiAocGVla0ZvckV4cHJlc3Npb24oQVJSQVlfSU5JVElBTElaRVIpKQotCQkJCWNoZWNrRm9yRXhwcmVzc2lvbihBUlJBWV9JTklUSUFMSVpFUik7Ci0JCQllbHNlCi0JCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OKTsKLQotCQkJLy8gQXQgdGhpcyBwb2ludCBpbiB0aW1lIHRoYXQgc3RhY2sgbWF5IGVpdGhlciBoYXZlOgotCQkJLy8gYXJyYXlfdHlwZSwgYXJyYXlfY3JlYXRpb24KLQkJCS8vIHN0cmlwX2NvdW50LCBhcnJheV90eXBlLCBhcnJheV9pbml0aWFsaXplcgotCQkJLy8gU28gd2UgY2FuIGdldCB0aGUgYXJyYXkgdHlwZSBmcm9tIHBlZWsoMiksIGFuZCBnZXQgdGhlIGNvbW1hbmQgdHlwZSBmcm9tIHBlZWsoMSkuCi0JCQkvLyBUaGVuIGlmIHRoZSBjb21tYW5kIHR5cGUgaXMgYXJyYXlfY3JlYXRpb24sIHN0cmlwX2NvdW50IHdpbGwgYmUgaW5pdGVkIHRvIDAsIHdoaWxlCi0JCQkvLyBlbHNlIGl0IHdpbGwgYmUgaW5pdGVkIHRvIHBlZWsoMykuIEZyb20gdGhhdCB3ZSBjYW4gaW5jcmVtZW50IHRoZSBzdHJpcF9jb3VudCB0bwotCQkJLy8gdXNlIGZvciB0aGlzIGluaXRpYWxpemVyLgotCQkJLy8KLQkJCS8vIFdlIG5lZWQgdG8gcGVlayBoZXJlIGJlY2F1c2Ugd2Ugd2lsbCBiZSBhZGRpbmcgdmFyaW91cyBwdXNoZXMgdG8gdGhlIHN0YWNrIGFuZCB3ZQotCQkJLy8gbmVlZCB0byBnZXQgdGhlIGluZm8gd2hpbGUgaXQgaXMgc3RpbGwgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JCQlPYmplY3QgYXJyYXlUeXBlID0gcGVlaygyKTsgCi0JCQlpbnQgc3RyaXBDb3VudCA9IDA7Ci0JCQlpZiAocGVlaygxKSA9PSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9JTklUSUFMSVpFUl9FWFBSRVNTSU9OKQotCQkJCXN0cmlwQ291bnQgPSAoKEludGVnZXIpIHBlZWsoMykpLmludFZhbHVlKCk7Ci0KLQkJCXN3aXRjaCAoZXhwcmVzc2lvbkNvdW50KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlwdXNoKEFSUkFZSU5JVElBTElaRVJfQ09VTlRfMCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJcHVzaChBUlJBWUlOSVRJQUxJWkVSX0NPVU5UXzEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCXB1c2goQVJSQVlJTklUSUFMSVpFUl9DT1VOVF8yKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcHVzaChuZXcgSW50ZWdlcihleHByZXNzaW9uQ291bnQpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChhcnJheVR5cGUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlTdHJpbmcgYXQgPSAoU3RyaW5nKSBhcnJheVR5cGU7Ci0JCQkJaW50IGkgPSBhdC5sYXN0SW5kZXhPZigiW10iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpID09IC0xKQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCVByb3h5TWVzc2FnZXMuRXhwcmVzc2lvbl9BcnJheVR5cGVOb3RBbkFycmF5X0VYQ18sIG5ldyBPYmplY3RbXSB7IGFycmF5VHlwZX0pKTsgCi0JCQkJYXJyYXlUeXBlID0gZ2V0UHJveHlCZWFuVHlwZShhdCk7Ci0JCQl9IGVsc2UgaWYgKCEoYXJyYXlUeXBlIGluc3RhbmNlb2YgSVByb3h5QmVhblR5cGUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCVByb3h5TWVzc2FnZXMuRXhwcmVzc2lvbl9BcnJheVR5cGVOb3RBbkFycmF5X0VYQ18sIG5ldyBPYmplY3RbXSB7IGFycmF5VHlwZX0pKTsgCi0JCQl9Ci0JCQlwdXNoKG5ldyBJbnRlZ2VyKCsrc3RyaXBDb3VudCkpOwotCQkJcHVzaChhcnJheVR5cGUpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9JTklUSUFMSVpFUl9FWFBSRVNTSU9OKTsKLQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXdoaWxlIChleHByZXNzaW9uQ291bnQtLSA+IDApCi0JCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04pOwotCi0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLSAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVDYXN0RXhwcmVzc2lvbihpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICogQSBjYXN0IGV4cHJlc3Npb24gaGFzIG9uZSBuZXN0ZWQgZXhwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJcHVzaENhc3QoZm9yRXhwcmVzc2lvbiwgZ2V0UHJveHlCZWFuVHlwZSh0eXBlKSk7IC8vIFB1c2ggdGhpcyBvbnRvIHRoZSBsb2NhbCBzdGFjayB0byB3YWl0IGZvciBjb21wbGV0aW9uLgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUNhc3RFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlwdXNoQ2FzdChmb3JFeHByZXNzaW9uLCB0eXBlKTsgLy8gUHVzaCB0aGlzIG9udG8gdGhlIGxvY2FsIHN0YWNrIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCi0JfQotCQotCS8qCi0JICogUHVzaCBmb3IgYSBjYXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBwdXNoQ2FzdChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQl2YWxpZGF0ZVByb3h5KHR5cGUpOwotCQkJcHVzaCh0eXBlKTsKLQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ0FTVF9FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNBU1RfRVhQUkVTU0lPTik7IC8vIFRoZSBuZXh0IGV4cHJlc3Npb24gbXVzdCBiZSBmb3IgdGhlIGNhc3QgZXhwcmVzc2lvbi4KLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSwgaW50IGFyZ3VtZW50Q291bnQpCi0JCXRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlwdXNoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKGZvckV4cHJlc3Npb24sIGdldFByb3h5QmVhblR5cGUodHlwZSksIGFyZ3VtZW50Q291bnQpOwkvLyBQdXNoIHRoaXMgb250byB0aGUgbG9jYWwgc3RhY2sgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBhcmd1bWVudENvdW50KQotCQl0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlwdXNoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKGZvckV4cHJlc3Npb24sIHR5cGUsIGFyZ3VtZW50Q291bnQpOwkvLyBQdXNoIHRoaXMgb250byB0aGUgbG9jYWwgc3RhY2sgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KLQl9Ci0KLQkvKgotCSAqIFB1c2ggZm9yIGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBhcmd1bWVudENvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJdmFsaWRhdGVQcm94eSh0eXBlKTsKLQkJCXN3aXRjaCAoYXJndW1lbnRDb3VudCkgewotCQkJCWNhc2UgMDoKLQkJCQkJcHVzaChDTEFTU19JTlNUQU5DRV9DUkVBVElPTl9BUkdVTUVOVFNfMCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJcHVzaChDTEFTU19JTlNUQU5DRV9DUkVBVElPTl9BUkdVTUVOVFNfMSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXB1c2gobmV3IEludGVnZXIoYXJndW1lbnRDb3VudCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCXB1c2godHlwZSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX0VYUFJFU1NJT04pOwotCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJd2hpbGUgKGFyZ3VtZW50Q291bnQtLSA+IDApCi0JCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsgLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCQkJCQkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24pIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfRkFMU0UpOwotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSk7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04pOwotCi0JCQlwdXNoKEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5DT05ESVRJT05BTF9GQUxTRSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNPTkRJVElPTkFMX0VYUFJFU1NJT04pOwotCQkJcHVzaChJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfVFJVRSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNPTkRJVElPTkFMX0VYUFJFU1NJT04pOwotCQkJcHVzaChJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUuQ09ORElUSU9OQUxfVEVTVCk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNPTkRJVElPTkFMX0VYUFJFU1NJT04pOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUZpZWxkQWNjZXNzKGludCwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUsIGJvb2xlYW4gaGFzUmVjZWl2ZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBPbmx5IGZvciBzdHJpbmcgZmllbGRuYW1lcyBpcyB0aGlzIGludmFsaWQgd2hlbiBubyByZWNlaXZlciBiZWNhdXNlIG5vIHdheSB0byBkZXRlcm1pbmUgcmVjZWl2ZXIuIChEb24ndCBoYW5kbGUgaW1wbGljaXQgInRoaXMiIHlldCBmb3IgZmllbGRzKS4gCi0JCQkvLyBGb3IgdGhlIGFjY2Vzc29yIHRoYXQgdGFrZXMgYSBJRmllbGRQcm94eSB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBubyByZWNlaXZlciBiZWNhdXNlIHRoZSBmaWVsZCBwcm94eSBjYW4gZGV0ZXJtaW5lIGlmIHN0YXRpYyBvciBub3QsIGFuZCBpZiBub3QKLQkJCS8vIHN0YXRpYyBpdCB3aWxsIGZhaWwgYXQgZXZhbHVhdGlvbiB0aW1lLgotCQkJaWYgKCFoYXNSZWNlaXZlcikKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJUHJveHlNZXNzYWdlcy5FeHByZXNzaW9uX0Nhbm5vdEhhbmRsZU5vUmVjZWl2ZU9uRmllbGRBY2Nlc3NfRVhDXywgbmV3IE9iamVjdFtdIHsgZmllbGROYW1lfSkpOyAKLQkJCXB1c2hGaWVsZEFjY2Vzcyhmb3JFeHByZXNzaW9uLCBmaWVsZE5hbWUsIGhhc1JlY2VpdmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVJZkVsc2UoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVJZkVsc2UoYm9vbGVhbiBoYXNFbHNlQ2xhdXNlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCWlmIChoYXNFbHNlQ2xhdXNlKSB7Ci0JCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9FTFNFKTsKLQkJCX0KLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpOwotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfQ09ORElUSU9OKTsKLQotCQkJLy8gV2Ugc3RpbGwgcHVzaCBhbiBlbHNlIGNsYXVzZSBzbyB0aGF0IHdlIGtub3cgd2hlbiBmaW5pc2hlZC4gV2UgZG9uJ3QgaGF2ZSBhIHB1c2hGb3JFeHByZXNzaW9uIGZvciBpdCBiZWNhdXNlIHRoZXJlCi0JCQkvLyB3b24ndCBiZSBhbnkuIEJ1dCB0aGUgZWxzZSBjbGF1c2UgcHJvY2Vzc2luZyB3aWxsIGJlIG9uIHRoZSBwdXNoIHN0YWNrIHNvIHRoYXQgd2UgY2FuIGNsZWFuIHVwIHdoZW4gZW5kIG9mIGlmIHN0bXQgb2NjdXJzLgotCQkJcHVzaChJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlLkVMU0VfQ0xBVVNFKTsJCi0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLklGX0VMU0VfRVhQUkVTU0lPTik7Ci0JCQkKLQkJCXB1c2goSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZS5UUlVFX0NMQVVTRSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLklGX0VMU0VfRVhQUkVTU0lPTik7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLklGX1RFU1RfRVhQUkVTU0lPTik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQdXNoIHRoZSBmaWVsZCBhY2Nlc3MuCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZmllbGQgU3RyaW5nIGlmIGZpZWxkIG5hbWUsIG9yIElQcm94eUZpZWxkLgotCSAqIEBwYXJhbSBoYXNSZWNlaXZlcgotCSAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgdm9pZCBwdXNoRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBPYmplY3QgZmllbGQsIGJvb2xlYW4gaGFzUmVjZWl2ZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaChoYXNSZWNlaXZlciA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOyAvLyBXZSBoYXZlIGEgcmVjZWl2ZXIKLQkJCXB1c2goZmllbGQpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5GSUVMRF9BQ0NFU1NfRVhQUkVTU0lPTik7Ci0KLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlpZiAoaGFzUmVjZWl2ZXIpCi0JCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUluZml4RXhwcmVzc2lvbihpbnQsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIEluZml4T3BlcmF0b3Igb3BlcmF0b3IsIGludCBleHRlbmRlZE9wZXJhbmRDb3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoKEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5JTkZJWF9MQVNUX09QRVJBTkQpOwotCQkJcHVzaChvcGVyYXRvcik7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLklORklYX0VYUFJFU1NJT04pOwotCQkJaW50IGkgPSBleHRlbmRlZE9wZXJhbmRDb3VudDsKLQkJCXdoaWxlIChpLS0gPiAwKSB7Ci0JCQkJcHVzaChJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUuSU5GSVhfT1RIRVJfT1BFUkFORCk7Ci0JCQkJcHVzaChvcGVyYXRvcik7Ci0JCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTkZJWF9FWFBSRVNTSU9OKTsKLQkJCX0KLQkJCXB1c2goSW50ZXJuYWxJbmZpeE9wZXJhbmRUeXBlLklORklYX0xFRlRfT1BFUkFORCk7Ci0JCQlwdXNoKG9wZXJhdG9yKTsKLQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSU5GSVhfRVhQUkVTU0lPTik7Ci0KLQkJCWkgPSBleHRlbmRlZE9wZXJhbmRDb3VudDsKLQkJCXdoaWxlIChpLS0gPiAwKSB7Ci0JCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVEKTsKLQkJCX0KLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX1JJR0hUKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFBST0NFU1NfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsgLy8gU2VlIGlmIHByZXZpb3VzIGV4cHJlc3Npb24gaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcuCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlSW5zdGFuY2VvZkV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXB1c2hJbnN0YW5jZW9mKGZvckV4cHJlc3Npb24sIGdldFByb3h5QmVhblR5cGUodHlwZSkpOwkvLyBQdXNoIHRoaXMgb250byB0aGUgbG9jYWwgc3RhY2sgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJcHVzaEluc3RhbmNlb2YoZm9yRXhwcmVzc2lvbiwgdHlwZSk7CS8vIFB1c2ggdGhpcyBvbnRvIHRoZSBsb2NhbCBzdGFjayB0byB3YWl0IGZvciBjb21wbGV0aW9uLgotCX0KLQkKLQkvKgotCSAqIFB1c2ggZm9yIGEgY2FzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVzaEluc3RhbmNlb2YoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJdmFsaWRhdGVQcm94eSh0eXBlKTsKLQkJCXB1c2godHlwZSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLklOU1RBTkNFT0ZfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTlNUQU5DRU9GX1ZBTFVFKTsgLy8gVGhlIG5leHQgZXhwcmVzc2lvbiBtdXN0IGJlIGZvciB0aGUgaW5zdGFuY2Ugb2YgZXhwcmVzc2lvbi4KLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlTWV0aG9kSW52b2NhdGlvbihpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaGFzUmVjZWl2ZXIsIGludCBhcmd1bWVudENvdW50KQotCQl0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gT25seSBmb3Igc3RyaW5nIG1ldGhvZG5hbWVzIGlzIHRoaXMgaW52YWxpZCB3aGVuIG5vIHJlY2VpdmVyIGJlY2F1c2Ugbm8gd2F5IHRvIGRldGVybWluZSByZWNlaXZlci4gKERvbid0IGhhbmRsZSBpbXBsaWNpdCAidGhpcyIgeWV0IGZvciBtZXRob2RzKS4gCi0JCQkvLyBGb3IgdGhlIGFjY2Vzc29yIHRoYXQgdGFrZXMgYSBJRmllbGRQcm94eSB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBubyByZWNlaXZlciBiZWNhdXNlIHRoZSBmaWVsZCBwcm94eSBjYW4gZGV0ZXJtaW5lIGlmIHN0YXRpYyBvciBub3QsIGFuZCBpZiBub3QKLQkJCS8vIHN0YXRpYyBpdCB3aWxsIGZhaWwgYXQgZXZhbHVhdGlvbiB0aW1lLgotCQkJaWYgKCFoYXNSZWNlaXZlcikKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJUHJveHlNZXNzYWdlcy5FeHByZXNzaW9uX01ldGhvZHNOZWVkUmVjZWl2ZXJfRVhDXywgbmV3IE9iamVjdFtdIHsgbmFtZX0pKTsgCi0KLQkJCXB1c2hNZXRob2RJbnZvY2F0aW9uKGZvckV4cHJlc3Npb24sIG5hbWUsIGhhc1JlY2VpdmVyLCBhcmd1bWVudENvdW50KTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBtZXRob2QgU3RyaW5nIGZvciBtZXRob2QgbmFtZSwgSU1ldGhvZFByb3h5IG90aGVyd2lzZS4KLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIgCi0JICogQHBhcmFtIGFyZ3VtZW50Q291bnQKLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgdm9pZCBwdXNoTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIE9iamVjdCBtZXRob2QsIGJvb2xlYW4gaGFzUmVjZWl2ZXIsIGludCBhcmd1bWVudENvdW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJc3dpdGNoIChhcmd1bWVudENvdW50KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlwdXNoKE1FVEhPRF9BUkdVTUVOVFNfMCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJcHVzaChNRVRIT0RfQVJHVU1FTlRTXzEpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwdXNoKG5ldyBJbnRlZ2VyKGFyZ3VtZW50Q291bnQpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwdXNoKGhhc1JlY2VpdmVyID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0JCQlwdXNoKG1ldGhvZCk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLk1FVEhPRF9FWFBSRVNTSU9OKTsKLQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXdoaWxlIChhcmd1bWVudENvdW50LS0gPiAwKQotCQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5UKTsKLQkJCWlmIChoYXNSZWNlaXZlcikKLQkJCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOyAvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVByZWZpeEV4cHJlc3Npb24oaW50LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLlByZWZpeE9wZXJhdG9yKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBQcmVmaXhPcGVyYXRvciBvcGVyYXRvcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoKG9wZXJhdG9yKTsKLQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFJFRklYX0VYUFJFU1NJT04pOwotCQkJCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwkvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgdXNpbmcgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZy4gVGhlIHJlc3VsdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKLQkgKiBnaXZlbiB0eXBlLiBUaGlzIGlzIG5vdCBvbiB0aGUgSUV4cHJlc3Npb24gaW50ZXJmYWNlIGJlY2F1c2UgaXQgaXMgbm90IGZvciB1c2Ugb2YgcmVndWxhcgotCSAqIGN1c3RvbWVycy4gSXQgaXMgaGVyZSBmb3IgdGhlIGFsbG9jYXRpb24gcHJvY2Vzc2VyIHRvIGNyZWF0ZSBlbnRyaWVzIHRoYXQgYXJlIGp1c3Qgc3RyaW5ncy4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBjdXN0b21lciBhZHZhbmNlZCBBUEkuIFRoaXMgQVBJIGZvciB0aGUgaW1wbGVtZW50ZXJzIG9mIHJlZ2lzdHJpZXMgYW5kIGV4cHJlc3Npb24gc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBpbml0aWFsaXphdGlvblN0cmluZwotCSAqIEBwYXJhbSB0eXBlCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nLCBJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb257Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQl2YWxpZGF0ZVByb3h5KHR5cGUpOwotCQkJcHVzaE5ld0luc3RhbmNlVG9Qcm94eShpbml0aWFsaXphdGlvblN0cmluZywgdHlwZSk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlTnVsbChpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlTnVsbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24pIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaFRvUHJveHkobnVsbCk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwkvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVR5cGVMaXRlcmFsKGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJY3JlYXRlUHJveHlFeHByZXNzaW9uKGZvckV4cHJlc3Npb24sIGdldFByb3h5QmVhblR5cGUodHlwZSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVR5cGVSZWNlaXZlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVR5cGVSZWNlaXZlcihTdHJpbmcgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXB1c2hUeXBlUmVjZWl2ZXIoZ2V0UHJveHlCZWFuVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlVHlwZVJlY2VpdmVyKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVR5cGVSZWNlaXZlcihJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl2YWxpZGF0ZVByb3h5KHR5cGUpOwotCQlwdXNoVHlwZVJlY2VpdmVyKHR5cGUpOwotCX0KLQotCS8qCi0JICogUHVzaCBmb3IgYSB0eXBlIHJlY2VpdmVyLgotCSAqIEBwYXJhbSB0eXBlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1c2hUeXBlUmVjZWl2ZXIoSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBUaGlzIGlzIHNwZWNpYWwgYmVjYXVzZSB0eXBlIHJlY2VpdmVycyBhcmUgb25seSB2YWxpZCBhcyB0aGUgcmVjZWl2ZXIgZm9yIGEgZmllbGQgYWNjZXNzIG9yIGEgbWV0aG9kIGFjY2Vzcy4KLQkJCS8vIFNpbmNlIGVhY2ggaGFzIGEgZGlmZmVyZW50IGZvckV4cHJlc3Npb24gd2UgbmVlZCB0byB0ZXN0IGZvciBvbmUgb3IgdGhlIG90aGVyLiBJdCBkb2Vzbid0IG1ha2UgYW55IGRpZmZlcmVuY2UKLQkJCS8vIHdoaWNoIG9uZSBpdCBpcywgYnV0IGl0IG11c3QgYmUgb25lIG9yIHRoZSBvdGhlci4KLQkJCWlmIChwZWVrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkZJRUxEX1JFQ0VJVkVSKSkKLQkJCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUik7Ci0JCQllbHNlCi0JCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSKTsKLQkJCQotCQkJcHVzaFR5cGVSZWNlaXZlclRvUHJveHkodHlwZSk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwkvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQkJCQotCX0KLQkKLQkvKgotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcyB3ZSB3aWxsIGJlIGNyZWF0aW5nIGEgSUJlYW5Qcm94eSBmb3IgdGhlbS4gVGhhdCBpcyBiZWNhdXNlIHRoYXQKLQkgKiB3b3VsZCBiZSB0aGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uLCBhbmQgbm8gbmVlZCB0byBnZXQgdGhlIG90aGVyIHNpZGUgaW52b2x2ZWQuCi0JICovCi0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hUb1Byb3h5KGJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh2YWx1ZSkpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBjaGFyIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hUb1Byb3h5KGJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh2YWx1ZSkpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoaW50LCBieXRlKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBieXRlIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hUb1Byb3h5KGJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh2YWx1ZSkpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoaW50LCBkb3VibGUpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoVG9Qcm94eShiZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodmFsdWUpKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmltaXRpdmVMaXRlcmFsKGludCwgZmxvYXQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGZsb2F0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hUb1Byb3h5KGJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh2YWx1ZSkpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGludCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoVG9Qcm94eShiZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodmFsdWUpKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmltaXRpdmVMaXRlcmFsKGludCwgbG9uZykKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgbG9uZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlwdXNoVG9Qcm94eShiZWFuUHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodmFsdWUpKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVQcmltaXRpdmVMaXRlcmFsKGludCwgc2hvcnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIHNob3J0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2hUb1Byb3h5KGJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh2YWx1ZSkpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVN0cmluZ0xpdGVyYWwoaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVN0cmluZ0xpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKGZvckV4cHJlc3Npb24pOwotCQkJcHVzaFRvUHJveHkoYmVhblByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHZhbHVlKSk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlUHJveHlFeHByZXNzaW9uKGludCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eSBwcm94eSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXZhbGlkYXRlUHJveHkocHJveHkpOwotCQkJcHVzaFRvUHJveHkocHJveHkpOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVBc3NpZ25tZW50RXhwcmVzc2lvbihpbnQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCXB1c2goSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVNTSUdOTUVOVF9FWFBSRVNTSU9OKTsKLQkJCQotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCk7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfTEVGVCk7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwkvLyBTZWUgaWYgcHJldmlvdXMgZXhwcmVzc2lvbiBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZy4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKGludCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCUV4cHJlc3Npb25Qcm94eSBwcm94eSA9IGFsbG9jYXRlRXhwcmVzc2lvblByb3h5KE5PUk1BTF9FWFBSRVNTSU9OX1BST1hZKTsKLQkJCXB1c2gocHJveHkpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT04pOwotCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hUKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IC8vIFNlZSBpZiBwcmV2aW91cyBleHByZXNzaW9uIGlzIHJlYWR5IGZvciBwcm9jZXNzaW5nLgotCQkJcmV0dXJuIHByb3h5OwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBieSByZWdpc3RyaWVzIHRvIGNyZWF0ZSBhbiBleHByZXNzaW9uIHByb3h5IGZvciBhIGJlYW4gdHlwZS4gSXQgaXMgbm90IGluIHRoZSBpbnRlcmZhY2UgYmVjYXVzZSBpdCBzaG91bGQKLQkgKiBvbmx5IGJlIGNhbGxlZCBieSB0aGUgcHJveHkgcmVnaXN0cnkgdG8gY3JlYXRlIGFuIGV4cHJlc3Npb24gcHJveHkuIEl0IHNob3VsZG4ndCBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUgcmVnaXN0cmllcwotCSAqIGJlY2F1c2UgdGhlcmUgbWF5IGFscmVhZHkgZXhpc3QgaW4gdGhlIHJlZ2lzdHJ5IHRoZSB0cnVlIElCZWFuVHlwZVByb3h5LCBhbmQgdGhhdCBvbmUgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBjdXN0b21lciBhZHZhbmNlZCBBUEkuIFRoaXMgQVBJIGZvciB0aGUgaW1wbGVtZW50ZXJzIG9mIHJlZ2lzdHJpZXMgYW5kIGV4cHJlc3Npb24gc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiBAcmV0dXJuIGV4cHJlc3Npb24gcHJveHkgdGhhdCBpcyBob29rZWQgdXAgYW5kIHdpbGwgbm90aWZ5IHdoZW4gcmVzb2x2ZWQuIEl0IGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuIFRoZSByZXNvbHV0aW9uIHdpbGwgb2NjdXIgYXQgdGhpcyBwb2ludCBpbiB0aGUKLQkgKiBleGVjdXRpb24gc3RhY2ssIGJ1dCBzaW5jZSBpdCB3aWxsIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgc3RhY2sgdGhpcyBpcyBPSywgb3RoZXIgdGhhbiBpdCBjb3VsZCB0aHJvdyBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24gb24gdGhlCi0JICogZXhlY3V0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJveHlCZWFuVHlwZSBjcmVhdGVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IHByb3h5ID0gKElCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSkgYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoQkVBTlRZUEVfRVhQUkVTU0lPTl9QUk9YWSk7Ci0JCXByb3h5LnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKLQkJLy8gVGhpcyBjYW4gYmUgc2VudCBhdCBhbnkgdGltZS4gSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCBpcyBvbiB0aGUgZXhwcmVzc2lvbiBzdGFjay4gSXQgd2lsbCBiZSBzZW50IHRvIGJlIHJlc29sdmVkIGltbWVkaWF0ZWx5LgotCQlwdXNoQmVhblR5cGVUb1Byb3h5KHByb3h5KTsKLQkJcmV0dXJuIHByb3h5OwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSByZWdpc3RyaWVzIHRvIGNyZWF0ZSBhbiBleHByZXNzaW9uIHByb3h5IGZvciBhIG1ldGhvZC4gSXQgaXMgbm90IGluIHRoZSBpbnRlcmZhY2UgYmVjYXVzZSBpdCBzaG91bGQKLQkgKiBvbmx5IGJlIGNhbGxlZCBieSB0aGUgcHJveHkgcmVnaXN0cnkgdG8gY3JlYXRlIGFuIGV4cHJlc3Npb24gcHJveHkuIEl0IHNob3VsZG4ndCBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUgcmVnaXN0cmllcwotCSAqIGJlY2F1c2UgdGhlcmUgbWF5IGFscmVhZHkgZXhpc3QgaW4gdGhlIHJlZ2lzdHJ5IHRoZSB0cnVlIElNZXRob2RQcm94eSwgYW5kIHRoYXQgb25lIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgY3VzdG9tZXIgYWR2YW5jZWQgQVBJLiBUaGlzIEFQSSBmb3IgdGhlIGltcGxlbWVudGVycyBvZiByZWdpc3RyaWVzIGFuZCBleHByZXNzaW9uIHN1YmNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyBwYXJhbWV0ZXIgdHlwZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVyIHR5cGVzLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJveHlNZXRob2QgY3JlYXRlTWV0aG9kRXhwcmVzc2lvblByb3h5KElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uewotCQl2YWxpZGF0ZVByb3h5KGRlY2xhcmluZ1R5cGUpOwotCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdmFsaWRhdGVQcm94eShwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJRXhwcmVzc2lvblByb3h5IHByb3h5ID0gYWxsb2NhdGVFeHByZXNzaW9uUHJveHkoTUVUSE9EX0VYUFJFU1NJT05fUFJPWFkpOwotCQkvLyBUaGlzIGNhbiBiZSBzZW50IGF0IGFueSB0aW1lLiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IGlzIG9uIHRoZSBleHByZXNzaW9uIHN0YWNrLiBJdCB3aWxsIGJlIHNlbnQgdG8gYmUgcmVzb2x2ZWQgaW1tZWRpYXRlbHkuCi0JCXB1c2hNZXRob2RUb1Byb3h5KHByb3h5LCBkZWNsYXJpbmdUeXBlLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCXJldHVybiAoSVByb3h5TWV0aG9kKSBwcm94eTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHJlZ2lzdHJpZXMgdG8gY3JlYXRlIGFuIGV4cHJlc3Npb24gcHJveHkgZm9yIGEgZmllbGQuIEl0IGlzIG5vdCBpbiB0aGUgaW50ZXJmYWNlIGJlY2F1c2UgaXQgc2hvdWxkCi0JICogb25seSBiZSBjYWxsZWQgYnkgdGhlIHByb3h5IHJlZ2lzdHJ5IHRvIGNyZWF0ZSBhbiBleHByZXNzaW9uIHByb3h5LiBJdCBzaG91bGRuJ3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIHJlZ2lzdHJpZXMKLQkgKiBiZWNhdXNlIHRoZXJlIG1heSBhbHJlYWR5IGV4aXN0IGluIHRoZSByZWdpc3RyeSB0aGUgdHJ1ZSBJRmllbGRQcm94eSwgYW5kIHRoYXQgb25lIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgY3VzdG9tZXIgYWR2YW5jZWQgQVBJLiBUaGlzIEFQSSBmb3IgdGhlIGltcGxlbWVudGVycyBvZiByZWdpc3RyaWVzIGFuZCBleHByZXNzaW9uIHN1YmNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUKLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIElQcm94eUZpZWxkIGNyZWF0ZUZpZWxkRXhwcmVzc2lvblByb3h5KElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl2YWxpZGF0ZVByb3h5KGRlY2xhcmluZ1R5cGUpOwotCQlFeHByZXNzaW9uUHJveHkgcHJveHkgPSBhbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShGSUVMRF9FWFBSRVNTSU9OX1BST1hZKTsKLQkJLy8gVGhpcyBjYW4gYmUgc2VudCBhdCBhbnkgdGltZS4gSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCBpcyBvbiB0aGUgZXhwcmVzc2lvbiBzdGFjay4gSXQgd2lsbCBiZSBzZW50IHRvIGJlIHJlc29sdmVkIGltbWVkaWF0ZWx5LgotCQlwdXNoRmllbGRUb1Byb3h5KHByb3h5LCBkZWNsYXJpbmdUeXBlLCBmaWVsZE5hbWUpOwotCQlyZXR1cm4gKElQcm94eUZpZWxkKSBwcm94eTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlUHJveHlSZWFzc2lnbm1lbnRFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIEV4cHJlc3Npb25Qcm94eSBwcm94eSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihmb3JFeHByZXNzaW9uKTsKLQkJCWlmICghcHJveHkuaXNWYWxpZEZvclJlYXNzaWdubWVudCgpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5FeHByZXNzaW9uX0NyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbl9JbnZhbGlkRm9yUmVhc3NpZ25tZW50X0VYQ18sIG5ldyBPYmplY3RbXXtwcm94eS50b1N0cmluZygpfSkpOyAKLQkJCXB1c2gocHJveHkpOwotCQkJcHVzaChJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT04pOwotCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hUKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7IC8vIFNlZSBpZiBwcmV2aW91cyBleHByZXNzaW9uIGlzIHJlYWR5IGZvciBwcm9jZXNzaW5nLgotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfRVhQUkVTU0lPTl9QUk9YWSA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQkVBTlRZUEVfRVhQUkVTU0lPTl9QUk9YWSA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0VYUFJFU1NJT05fUFJPWFkgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0VYUFJFU1NJT05fUFJPWFkgPSAzOwotCS8qKgotCSAqIEFsbG9jYXRlIGEgbmV3IEV4cHJlc3Npb25Qcm94eQotCSAqIEByZXR1cm4gbmV3IEV4cHJlc3Npb25Qcm94eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRXhwcmVzc2lvblByb3h5IGFsbG9jYXRlRXhwcmVzc2lvblByb3h5KGludCBwcm94eVR5cGUpIHsKLQkJaWYgKGV4cHJlc3Npb25Qcm94aWVzID09IG51bGwpCi0JCQlleHByZXNzaW9uUHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGlzIGFsd2F5cyBjcmVhdGVzIGEgcHJveHkgaWQgdGhhdCBpcyBncmVhdGVyIHRoYW4gYWxsIHByZXZpb3VzLiBUaGlzIGlzCi0JCS8vIHNvIHRoYXQgaXQgY2FuIGJlIGFzc3VyZWQgdGhhdCBwcm94aWVzIHdpbGwgYmUgcmVzb2x2ZWQgaW4gb3JkZXIgb2YgY3JlYXRpb24uCi0JCS8vIEN1cnJlbnRseSB0aGlzIGlzIGRvbmUgaGVyZSBieSB1c2luZyBleHByZXNzaW9uUHJveGllcy5zaXplKCkuCi0JCUV4cHJlc3Npb25Qcm94eSBwcm94eSA9IGNyZWF0ZUV4cHJlc3Npb25Qcm94eShwcm94eVR5cGUsIGV4cHJlc3Npb25Qcm94aWVzLnNpemUoKSk7Ci0JCWV4cHJlc3Npb25Qcm94aWVzLmFkZChwcm94eSk7Ci0JCXJldHVybiBwcm94eTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVGaWVsZEFjY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUZpZWxkLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5RmllbGQgZmllbGRQcm94eSwgYm9vbGVhbiBoYXNSZWNlaXZlcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVQcm94eShmaWVsZFByb3h5KTsKLQkJcHVzaEZpZWxkQWNjZXNzKGZvckV4cHJlc3Npb24sIGZpZWxkUHJveHksIGhhc1JlY2VpdmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlTWV0aG9kSW52b2NhdGlvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eU1ldGhvZCwgYm9vbGVhbiwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlNZXRob2QgbWV0aG9kUHJveHksIGJvb2xlYW4gaGFzUmVjZWl2ZXIsIGludCBhcmd1bWVudENvdW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAotCQkJSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVQcm94eShtZXRob2RQcm94eSk7Ci0JCXB1c2hNZXRob2RJbnZvY2F0aW9uKGZvckV4cHJlc3Npb24sIG1ldGhvZFByb3h5LCBoYXNSZWNlaXZlciwgYXJndW1lbnRDb3VudCk7Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVNpbXBsZUZpZWxkQWNjZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUZpZWxkLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkpCi0JICovCi0JcHVibGljIGZpbmFsIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVTaW1wbGVGaWVsZEFjY2VzcyhJUHJveHlGaWVsZCBmaWVsZCwgSVByb3h5IHJlY2VpdmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl2YWxpZGF0ZVByb3h5KGZpZWxkKTsKLQkJdmFsaWRhdGVQcm94eShyZWNlaXZlcik7Ci0JCUV4cHJlc3Npb25Qcm94eSByZXN1bHQgPSBjcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQljcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIGZpZWxkLCByZWNlaXZlciAhPSBudWxsKTsKLQkJaWYgKHJlY2VpdmVyICE9IG51bGwpCi0JCQljcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiwgcmVjZWl2ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVTaW1wbGVGaWVsZFNldChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlGaWVsZCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHksIGJvb2xlYW4pCi0JICovCi0JcHVibGljIGZpbmFsIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVTaW1wbGVGaWVsZFNldChJUHJveHlGaWVsZCBmaWVsZCwgSVByb3h5IHJlY2VpdmVyLCBJUHJveHkgdmFsdWUsIGJvb2xlYW4gd2FudFJlc3VsdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVQcm94eShmaWVsZCk7Ci0JCXZhbGlkYXRlUHJveHkocmVjZWl2ZXIpOwotCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gbnVsbDsKLQkJRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uID0gRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTjsKLQkJaWYgKHdhbnRSZXN1bHQpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCQlmb3JFeHByZXNzaW9uID0gRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hUOwkJCQotCQl9CQkKLQkJY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb24oZm9yRXhwcmVzc2lvbik7Ci0JCWNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9MRUZULCBmaWVsZCwgcmVjZWl2ZXIgIT0gbnVsbCk7Ci0JCWlmIChyZWNlaXZlciAhPSBudWxsKQotCQkJY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsIHJlY2VpdmVyKTsKLQkJY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgdmFsdWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVTaW1wbGVNZXRob2RJbnZva2Uob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eVtdLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBmaW5hbCBFeHByZXNzaW9uUHJveHkgY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKElQcm94eU1ldGhvZCBtZXRob2QsIElQcm94eSByZWNlaXZlciwgSVByb3h5W10gYXJndW1lbnRzLCBib29sZWFuIHdhbnRSZXN1bHQpCi0JCQl0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl2YWxpZGF0ZVByb3h5KG1ldGhvZCk7Ci0JCXZhbGlkYXRlUHJveHkocmVjZWl2ZXIpOwotCQlpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdmFsaWRhdGVQcm94eShhcmd1bWVudHNbaV0pOwotCQkJfQotCQl9Ci0JCUZvckV4cHJlc3Npb24gbmV4dEV4cHJlc3Npb24gPSBGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OOwotCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHdhbnRSZXN1bHQpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24obmV4dEV4cHJlc3Npb24pOwotCQkJbmV4dEV4cHJlc3Npb24gPSBGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQ7Ci0JCX0KLQkJY3JlYXRlTWV0aG9kSW52b2NhdGlvbihuZXh0RXhwcmVzc2lvbiwgbWV0aG9kLCByZWNlaXZlciAhPSBudWxsLCBhcmd1bWVudHMgIT0gbnVsbCA/IGFyZ3VtZW50cy5sZW5ndGggOiAwKTsKLQkJaWYgKHJlY2VpdmVyICE9IG51bGwpCi0JCQljcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIsIHJlY2VpdmVyKTsKLQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCwgYXJndW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIGludCBzdWJleHByZXNzaW9uTnVtYmVyID0gLTE7CS8vIEN1cnJlbnQgc3ViZXhwcmVzc2lvbiBudW1iZXIuIFRoaXMgaXMgYWx3YXlzIGluY3JlbWVudGluZy4KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVTdWJleHByZXNzaW9uKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBTdWJleHByZXNzaW9ucyBhcmUgc3BlY2lhbCwgdGhleSBjYW4gYmUgYW55d2hlcmUuCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihQUk9DRVNTX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oU1VCRVhQUkVTU0lPTkVORF9FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCi0JCQlwdXNoU3ViZXhwcmVzc2lvbkJlZ2luVG9Qcm94eSgrK3N1YmV4cHJlc3Npb25OdW1iZXIpOwotCQkJcHVzaChuZXcgSW50ZWdlcihzdWJleHByZXNzaW9uTnVtYmVyKSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLlNVQkVYUFJFU1NJT05fRU5EX0VYUFJFU1NJT04pOwotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVN1YmV4cHJlc3Npb25FbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXBvcEZvckV4cHJlc3Npb24oKTsgLy8gUmVtb3ZlIHRoZSByb290IGV4cHJlc3Npb24gc2luY2UgYmxvY2sgaXMgZG9uZS4KLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihTVUJFWFBSRVNTSU9ORU5EX0VYUFJFU1NJT04pOyAvLyBUaGlzIG5lZWRzIHRvIGJlIG5leHQgZm9yIGl0IHRvIGJlIHZhbGlkLgotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsgLy8gTm93IGxldCBpdCBoYW5kbGUgdGhlIHByZXZpb3VzbHkgcHVzaGVkIGVuZCBzdWJleHByZXNzaW9uLCBjb250YWluaW5nIHRoZSBzdWJleHByZXNzaW9uIG51bWJlciBiZWluZyBlbmRlZC4KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQltYXJrSW52YWxpZCgpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCQotCXByaXZhdGUgaW50IHRyeU51bWJlciA9IC0xOwkvLyBDdXJyZW50IHRyeSBudW1iZXIuIFRoaXMgaXMgYWx3YXlzIGluY3JlbWVudGluZy4KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVUcnkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVRyeSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsgLy8gU2V0IHVwIHNvIHRoYXQgd2hlbiByZWFjaGVkIHdlIGNhbiBwcm9jZXNzIHRoZSBUUllfRU5EIHRoYXQgd2UndmUgcHVzaGVkIGRhdGEgZm9yIGxhdGVyIGluIHRoaXMgbWV0aG9kLgotCQkJcHVzaEZvckV4cHJlc3Npb24oVFJZRU5EX0VYUFJFU1NJT04pOyAvLyBNdXN0IGdldCBhIHRyeSBlbmQgYmVmb3JlIHdlIGNhbiBwcm9jZXNzIGl0LgotCQkJcHVzaEZvckV4cHJlc3Npb24oVFJZQ0FUQ0hfRVhQUkVTU0lPTik7IC8vIE11c3QgZ2V0IGEgY2F0Y2gvZmluYWxseSBjbGF1c2UgKG9yIHRyeSBlbmQsIHdoaWNoIGtub3dzIGhvdyB0byBoYW5kbGUgdGhpcykuCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsgLy8gRXhwZWN0aW5nIHJvb3QgZXhwcmVzc2lvbnMgZm9yIHRoZSB0cnkgY2xhdXNlLgotCi0JCQlwdXNoVHJ5QmVnaW5Ub1Byb3h5KCsrdHJ5TnVtYmVyKTsKLQkJCXB1c2gobmV3IEludGVnZXIodHJ5TnVtYmVyKSk7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLlRSWV9FTkRfRVhQUkVTU0lPTik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlVHJ5Q2F0Y2hDbGF1c2Uob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIGZpbmFsIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVUcnlDYXRjaENsYXVzZShJUHJveHlCZWFuVHlwZSBleGNlcHRpb25UeXBlLCBib29sZWFuIHdhbnRFeGNlcHRpb25SZXR1cm5lZCkKLQkJCXRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlUHJveHkoZXhjZXB0aW9uVHlwZSk7Ci0JCXJldHVybiBwdXNoVHJ5Q2F0Y2goZXhjZXB0aW9uVHlwZSwgd2FudEV4Y2VwdGlvblJldHVybmVkKTsKLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgZmluYWwgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVRyeUNhdGNoQ2xhdXNlKFN0cmluZyBleGNlcHRpb25UeXBlLCBib29sZWFuIHdhbnRFeGNlcHRpb25SZXR1cm5lZCkKLQkJdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwdXNoVHJ5Q2F0Y2goZ2V0UHJveHlCZWFuVHlwZShleGNlcHRpb25UeXBlKSwgd2FudEV4Y2VwdGlvblJldHVybmVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZQotCSAqIEBwYXJhbSB3YW50RXhjZXB0aW9uUmV0dXJuZWQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIEV4cHJlc3Npb25Qcm94eSBwdXNoVHJ5Q2F0Y2goSVByb3h5QmVhblR5cGUgZXhjZXB0aW9uVHlwZSwgYm9vbGVhbiB3YW50RXhjZXB0aW9uUmV0dXJuZWQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJcG9wRm9yRXhwcmVzc2lvbigpOyAvLyBSZW1vdmUgdGhlIHJvb3QgZXhwcmVzc2lvbiBzaW5jZSB0cnkgb3IgcHJldmlvdXMgY2F0Y2ggY2xhdXNlIGlzIGRvbmUuCi0JCQljaGVja0ZvckV4cHJlc3Npb24oVFJZQ0FUQ0hfRVhQUkVTU0lPTik7IC8vIFRoaXMgbmVlZHMgdG8gYmUgbmV4dCBmb3IgaXQgdG8gYmUgdmFsaWQuCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihUUllDQVRDSF9FWFBSRVNTSU9OKTsgLy8gU2V0IHVwIGZvciBhIGZvbGxvd2luZyBjYXRjaC9maW5hbGx5IGNsYXVzZS4KLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOyAvLyBSb290IGV4cHJlc3Npb25zIGFyZSBuZXh0IGZvciB0aGUgY2F0Y2ggY2xhdXNlLgotCi0JCQlpbnQgdHJ5TnVtYmVyID0gKChJbnRlZ2VyKSBwZWVrKDIpKS5pbnRWYWx1ZSgpOyAvLyBHZXQgdGhlIHRyeSMuIEl0IHNob3VsZCBiZSBpbiB0aGlzIHBsYWNlIG9uIHRoZSBzdGFjay4KLQotCQkJRXhwcmVzc2lvblByb3h5IGVwID0gbnVsbDsKLQkJCWlmICh3YW50RXhjZXB0aW9uUmV0dXJuZWQpCi0JCQkJZXAgPSBhbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShOT1JNQUxfRVhQUkVTU0lPTl9QUk9YWSk7Ci0JCQlwdXNoVHJ5Q2F0Y2hDbGF1c2VUb1Byb3h5KHRyeU51bWJlciwgZXhjZXB0aW9uVHlwZSwgZXApOwotCi0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQkJcmV0dXJuIGVwOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlVHJ5RW5kKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVUcnlFbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXBvcEZvckV4cHJlc3Npb24oKTsgLy8gUmVtb3ZlIHRoZSByb290IGV4cHJlc3Npb24gc2luY2UgdHJ5IG9yIHByZXZpb3VzIGNhdGNoIGNsYXVzZSBpcyBkb25lLgotCQkJaWYgKHBlZWtGb3JFeHByZXNzaW9uKFRSWUNBVENIX0VYUFJFU1NJT04pKQotCQkJCWNoZWNrRm9yRXhwcmVzc2lvbihUUllDQVRDSF9FWFBSRVNTSU9OKTsgLy8gVGhpcyBtYXkgb2YgYmVlbiBuZXh0IGlmIG5vIGZpbmFsbHkgY2xhdXNlIHdhcyBhZGRlZC4gSWYgYSBmaW5hbGx5IGNsYXVzZSB3YXMgYWRkZWQgdGhpcyB3b3VsZCBub3QgYmUgaGVyZS4KLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihUUllFTkRfRVhQUkVTU0lPTik7IC8vIEFuZCB0aGlzIG5lZWRzIHRvIGJlIGFmdGVyIHRoYXQgdG8gYmUgdmFsaWQuCi0KLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlVHJ5RmluYWxseUNsYXVzZSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlVHJ5RmluYWxseUNsYXVzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJcG9wRm9yRXhwcmVzc2lvbigpOyAvLyBSZW1vdmUgdGhlIHJvb3QgZXhwcmVzc2lvbiBzaW5jZSB0cnkgb3IgcHJldmlvdXMgY2F0Y2ggY2xhdXNlIGlzIGRvbmUuCi0JCQljaGVja0ZvckV4cHJlc3Npb24oVFJZQ0FUQ0hfRVhQUkVTU0lPTik7IC8vIFRoaXMgbmVlZHMgdG8gYmUgbmV4dCBmb3IgaXQgdG8gYmUgdmFsaWQuCi0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsgLy8gUm9vdCBleHByZXNzaW9ucyBhcmUgbmV4dCBmb3IgdGhlIGZpbmFsbHkgY2xhdXNlLgotCi0JCQlpbnQgdHJ5TnVtYmVyID0gKChJbnRlZ2VyKSBwZWVrKDIpKS5pbnRWYWx1ZSgpOyAvLyBHZXQgdGhlIHRyeSMuIEl0IHNob3VsZCBiZSBpbiB0aGlzIHBsYWNlIG9uIHRoZSBzdGFjay4KLQotCQkJcHVzaFRyeUZpbmFsbHlDbGF1c2VUb1Byb3h5KHRyeU51bWJlcik7Ci0JCQlwcm9jZXNzRXhwcmVzc2lvbigpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uI2NyZWF0ZVJldGhyb3coKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVJldGhyb3coKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNoZWNrRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXBvcEZvckV4cHJlc3Npb24oKTsgLy8gUmVtb3ZlIHRoZSByb290IGV4cHJlc3Npb24gc2luY2UgdHJ5IG9yIHByZXZpb3VzIGNhdGNoIGNsYXVzZSBpcyBkb25lLgotCQkJY2hlY2tGb3JFeHByZXNzaW9uKFRSWUNBVENIX0VYUFJFU1NJT04pOyAvLyBUaGlzIG5lZWRzIHRvIGJlIG5leHQgZm9yIGl0IHRvIGJlIHZhbGlkLgotCQkJLy8gSXQgaXMgaW4gYSB2YWxpZCBzdGF0ZSwgc28gcHV0IHRoZSBjYXRjaCBhbmQgcm9vdCBiYWNrIG9uIHNvIHRoYXQgdGhpbmdzIHdvcmsgY29ycmVjdGx5LgotCQkJcHVzaEZvckV4cHJlc3Npb24oVFJZQ0FUQ0hfRVhQUkVTU0lPTik7Ci0JCQlwdXNoRm9yRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsgCi0KLQkJCWludCB0cnlOdW1iZXIgPSAoKEludGVnZXIpIHBlZWsoMikpLmludFZhbHVlKCk7IC8vIEdldCB0aGUgdHJ5Iy4gSXQgc2hvdWxkIGJlIGluIHRoaXMgcGxhY2Ugb24gdGhlIHN0YWNrLgotCi0JCQlwdXNoUmV0aHJvd1RvUHJveHkodHJ5TnVtYmVyKTsKLQkJCXByb2Nlc3NFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24jY3JlYXRlVGhyb3coKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVRocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlwdXNoKEludGVybmFsRXhwcmVzc2lvblR5cGVzLlRIUk9XX0VYUFJFU1NJT04pOwotCQkJcHVzaEZvckV4cHJlc3Npb24oUFJPQ0VTU19FWFBSRVNTSU9OKTsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uVEhST1dfT1BFUkFORCk7IC8vIFRoZSBuZXh0IGV4cHJlc3Npb24gbXVzdCBiZSBmb3IgdGhlIHRocm93IHZhbHVlLgotCQkJcHJvY2Vzc0V4cHJlc3Npb24oKTsgCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGZpbmFsIGludCBtYXJrKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQkrK2hpZ2hlc3RNYXJrSUQ7Ci0JCQljdXJyZW50TWFya0VudHJ5ID0gbmV3IE1hcmtFbnRyeSgpOwotCQkJY3VycmVudE1hcmtFbnRyeS5tYXJrSUQgPSBoaWdoZXN0TWFya0lEOwotCQkJY3VycmVudE1hcmtFbnRyeS5jb250cm9sU3RhY2tQb3MgPSBjb250cm9sU3RhY2suc2l6ZSgpIC0gMTsKLQkJCWN1cnJlbnRNYXJrRW50cnkubmV4dEV4cHJlc3Npb25TdGFja1BvcyA9IG5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3M7Ci0JCQljdXJyZW50TWFya0VudHJ5LmV4cHJlc3Npb25Qcm94aWVzUG9zID0gZXhwcmVzc2lvblByb3hpZXMgIT0gbnVsbCA/IGV4cHJlc3Npb25Qcm94aWVzLnNpemUoKSAtIDEgOiAtMTsKLQkJCWlmIChtYXJrRW50cmllcyA9PSBudWxsKQotCQkJCW1hcmtFbnRyaWVzID0gbmV3IEFycmF5TGlzdCg1KTsKLQkJCW1hcmtFbnRyaWVzLmFkZChjdXJyZW50TWFya0VudHJ5KTsKLQkJCXB1c2hNYXJrVG9Qcm94eShoaWdoZXN0TWFya0lEKTsKLQkJCXJldHVybiBoaWdoZXN0TWFya0lEOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCW1hcmtJbnZhbGlkKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVuZE1hcmsoaW50IG1hcmtOdW1iZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlpZiAoaXNWYWxpZCgpKSB7Ci0JCQkvLyBDYW4gb25seSBkbyBhIHZhbGlkIGVuZCBtYXJrIGlmIHdlIGFyZSBhdCByb290LiBJZiBub3QgYXQgcm9vdCwgd2UgZmFsbCB0aHJvdWdoIGFuZCB0cmVhdCBhcyBpbnZhbGlkLgotCQkJaWYgKHBlZWtGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pKSB7Ci0JCQkJY2hlY2tGb3JFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwkvLyBOb3cgcmVtb3ZlIGl0IGlmIGl0IHNob3VsZCBiZSByZW1vdmVkLiAKLQkJCQkvLyBJZiB0aGUgY3VycmVudCBtYXJrIG51bWJlciBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGluY29taW5nIG1hcmsgbnVtYmVyLCB3ZSBoYXZlIGltcHJvcGVyIG5lc3RpbmcuCi0JCQkJaWYgKGN1cnJlbnRNYXJrRW50cnkgPT0gbnVsbCB8fCBjdXJyZW50TWFya0VudHJ5Lm1hcmtJRCAhPSBtYXJrTnVtYmVyKQotCQkJCQl0aHJvd0ludmFsaWRNYXJrTmVzdGluZygpOwkvLyBXZSBoYXZlIGltcHJvcGVyIG5lc3RpbmcuCi0JCQkJLy8gV2UgYXJlIHBvcHBpbmcgdGhlIGN1cnJlbnQgbWFyay4gU2luY2Ugd2UgYXJlIHZhbGlkLCBqdXN0IG1vdmUgdXAgb25lIGluIHRoZSBtYXJrIHN0YWNrLgotCQkJCU1hcmtFbnRyeSBtZSA9IChNYXJrRW50cnkpIG1hcmtFbnRyaWVzLnJlbW92ZShtYXJrRW50cmllcy5zaXplKCktMSk7Ci0JCQkJaWYgKCFtYXJrRW50cmllcy5pc0VtcHR5KCkpCi0JCQkJCWN1cnJlbnRNYXJrRW50cnkgPSAoTWFya0VudHJ5KSBtYXJrRW50cmllcy5nZXQobWFya0VudHJpZXMuc2l6ZSgpLTEpOwotCQkJCWVsc2UKLQkJCQkJY3VycmVudE1hcmtFbnRyeSA9IG51bGw7Ci0JCQkJcHVzaEVuZG1hcmtUb1Byb3h5KG1hcmtOdW1iZXIsIGZhbHNlKTsKLQkJCQlpZiAobWUuY29udHJvbFN0YWNrUG9zICE9IGNvbnRyb2xTdGFjay5zaXplKCktMSB8fCBtZS5uZXh0RXhwcmVzc2lvblN0YWNrUG9zICE9IG5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MpCi0JCQkJCXRocm93SW52YWxpZE1hcmtOZXN0aW5nKCk7CS8vIFRoZSBzdGFja3Mgc2hvdWxkIGJlIGJhY2sgdG8gdGhlIHNhbWUgc2l6ZSBhdCB0aGlzIHBvaW50IGZvciBhIHZhbGlkIGVuZCBtYXJrLgotCQkJCXJldHVybjsKLQkJCX0KLQkJfSAKLQkJCi0JCS8vIEl0IHdhcyBpbnZhbGlkLCBvciBiZWNhbWUgaW52YWxpZC4KLQkJaWYgKG1hcmtFbnRyaWVzID09IG51bGwpCi0JCQl0aHJvd0ludmFsaWRNYXJrTmVzdGluZygpOwkvLyBXZSBoYXZlIG5vIG1hcmtzLCBzbyB0aGlzIGlzIGFuIGludmFsaWQgZW5kIG1hcmsuCi0JCQotCQkvLyBXZSBhcmUgaW52YWxpZCwgbmVlZCB0byBwb3AgdG8gdGhlIGdpdmVuIG1hcmtOdW1iZXIuCi0JCS8vIFN0YXJ0aW5nIGZyb20gdGhlIGVuZCB3ZSBzZWFyY2ggYmFjayB0byBmaW5kIHRoZSBlbnRyeSBmb3IgdGhlIGdpdmVuIG1hcmsgbnVtYmVyLiBXZSBkbyBpdAotCQkvLyBmcm9tIHRoZSBlbmQgYmVjYXVzZSBpdCBpcyBtb3JlIGxpa2VseSB0byBiZSBjbG9zZXIgdG8gdGhlIGVuZCB0aGFuIHRvIHRoZSBiZWdpbm5pbmcuCi0JCWZvciAoaW50IGkgPSBtYXJrRW50cmllcy5zaXplKCktMTsgaSA+PTA7IGktLSkgewotCQkJTWFya0VudHJ5IG1lID0gKE1hcmtFbnRyeSkgbWFya0VudHJpZXMuZ2V0KGkpOwotCQkJaWYgKG1lLm1hcmtJRCA9PSBtYXJrTnVtYmVyKSB7Ci0JCQkJLy8gRm91bmQgaXQuCi0JCQkJLy8gVHJpbSB0aGUgY29udHJvbCBzdGFjayBkb3duIHRvIHRoZSBzaXplIGF0IHRpbWUgb2YgbWFyay4gKE5vIGVhc3kgd2F5IHRvIGRvIHRoaXMgb3RoZXIgdGhhbiByZXBlYXRlZCByZW1vdmUncy4KLQkJCQkvLyBXZSBkbyBpdCBiYWNrd2FyZHMgdG8gZWxpbWluYXRlIHJlcGVhdGVkIHNodWZmbGluZyBvZiBlbnRyaWVzLgotCQkJCWZvciAoaW50IGogPSBjb250cm9sU3RhY2suc2l6ZSgpLTE7IGogPiBtZS5jb250cm9sU3RhY2tQb3M7IGotLSkgewotCQkJCQljb250cm9sU3RhY2sucmVtb3ZlKGopOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBUcmltIHRoZSBleHByZXNzaW9uIHN0YWNrLiBUaGlzIGlzIHNpbXBsZSwganVzdCByZXNldCB0aGUgbmV4dCBlbnRyeSBwb2ludGVyLgotCQkJCW5leHRGb3JFeHByZXNzaW9uU3RhY2tQb3MgPSBtZS5uZXh0RXhwcmVzc2lvblN0YWNrUG9zOwotCQkJCQotCQkJCWlmIChleHByZXNzaW9uUHJveGllcyAhPSBudWxsKSB7Ci0JCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIG1hcmsgYWxsIG9mIHRoZSBleHByZXNzaW9uIHByb3hpZXMgdGhhdCBvY2N1cmVkIGFmdGVyIHRoZSBtYXJrIGFzCi0JCQkJCS8vIG5vdCByZXNvbHZlZCAoc2luY2Ugc29tZW9uZSBtYXkgYmUgbGlzdGVuaW5nKSwgYW5kIHJlbW92ZSB0aGVtLCBhbmQgcmV1c2UgdGhlIHByb3hpZXMuCi0JCQkJCWZvciAoaW50IGogPSBleHByZXNzaW9uUHJveGllcy5zaXplKCktMTsgaiA+IG1lLmV4cHJlc3Npb25Qcm94aWVzUG9zOyBqLS0pIHsKLQkJCQkJCUV4cHJlc3Npb25Qcm94eSBwcm94eSA9IChFeHByZXNzaW9uUHJveHkpIGV4cHJlc3Npb25Qcm94aWVzLnJlbW92ZShqKTsKLQkJCQkJCWlmIChwcm94eSAhPSBudWxsICYmIHByb3h5Lmhhc0xpc3RlbmVycygpKQotCQkJCQkJCWZpcmVQcm94eU5vdFJlc29sdmVkKHByb3h5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBOb3cgdGhhdCB3ZSBrbm93IGl0IGlzIHZhbGlkLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIG1hcmsgZW50cmllcyBhYm92ZSBpdCBpbiB0aGUgc3RhY2sKLQkJCQkvLyBzaW5jZSB0aG9zZSBhcmUgbm93IGludmFsaWQuIFdlIGNvdWxkbid0IHJlbW92ZSB0aGVtIGFzIHdlIHdlcmUgc2VhcmNoaW5nIGZvciB0aGUgZW50cnkgYmVjYXVzZQotCQkJCS8vIGlmIHRoZSBlbnRyeSB3YXNuJ3QgZm91bmQgd2UgZGlkbid0IHdhbnQgdG8gd2lwZSBvdXQgdGhlIHByb2JhYmx5IHZhbGlkIG9uZXMuCi0JCQkJZm9yIChpbnQgaiA9IG1hcmtFbnRyaWVzLnNpemUoKS0xOyBqID49IGk7IGotLSkgewotCQkJCQltYXJrRW50cmllcy5yZW1vdmUoaik7Ci0JCQkJfQotCQkJCQotCQkJCWlmICghbWFya0VudHJpZXMuaXNFbXB0eSgpKQotCQkJCQljdXJyZW50TWFya0VudHJ5ID0gKE1hcmtFbnRyeSkgbWFya0VudHJpZXMuZ2V0KG1hcmtFbnRyaWVzLnNpemUoKS0xKTsKLQkJCQllbHNlCi0JCQkJCWN1cnJlbnRNYXJrRW50cnkgPSBudWxsOwkJCQkJCi0JCQkJcHVzaEVuZG1hcmtUb1Byb3h5KG1hcmtOdW1iZXIsIHRydWUpOwotCQkJCWV4cHJlc3Npb25WYWxpZCA9IHRydWU7Ci0JCQkJcmV0dXJuOwotCQkJfSAKLQkJfQotCQl0aHJvd0ludmFsaWRNYXJrTmVzdGluZygpOwkvLyBUaGUgbWFyayBudW1iZXIgd2Fzbid0IGZvdW5kLCBzbyB0aGlzIGlzIGFuIGludmFsaWQgZW5kIG1hcmsuCi0JfQotCQotCS8qKgotCSAqIEJlZ2luIHRoZSB0cmFuc2ZlciBvZiB0aGUgZXhwcmVzc2lvbiB0byBhbm90aGVyIHRocmVhZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgZXhwcmVzc2lvbiBuZWVkcyB0byBjb250aW51ZSB0byBiZSBidWlsdCB1cCwgYnV0IGl0IG5lZWRzCi0JICogdG8gYmUgZG9uZSBvbiBhIGRpZmZlcmVudCB0aHJlYWQuIFRoZSByZWFzb24gZm9yIGRvaW5nIHNvbWV0aGluZyBzcGVjaWFsIG90aGVyCi0JICogdGhhbiBqdXN0IHVzaW5nIGl0IG9uIHRoZSBvdGhlciB0aHJlYWQgaXMgdGhhdCBzb21lIHByb3h5IHJlZ2lzdHJpZXMgY29ubmVjdGlvbnMgYXJlCi0JICogdGllZCB0aHJvdWdoIHRoZSB0aHJlYWQuIElmIHlvdSBzd2l0Y2hlZCB0byBhbm90aGVyIHRocmVhZCB0aGUgY29ubmVjdGlvbnMgd291bGQgbm90Ci0JICogYmUgcHJvcGVybHkgc2V0IHVwLgotCSAqIFRoaXMgaXMgbm90IG9uIHRoZSBJRXhwcmVzc2lvbiBpbnRlcmZhY2UgYmVjYXVzZSBldmVuIHRob3VnaCBpdCBpcyBBUEksIGl0IGlzIHRyaWNreQotCSAqIHRvIHVzZSBhbmQgc28gbm90IGV4cG9zZWQgdG8gZXZlcnlvbmUuIFVzZXJzIGNhbiBsZWdpdGltYXRlbHkgY2FzdCB0byBFeHByZXNzaW9uIGFuZCAKLQkgKiB1c2UgdGhpcyBhcyBBUEkgZm9yIGFkdmFuY2VkIHVzZS4gCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIHRvIGJlZ2luIHRoZSB0cmFuc2Zlci4gSXQgcHV0cyBpdCBpbnRvIGEgc3RhdGUgcmVhZHkgZm9yIHRoZSB0cmFuc2Zlci4gQ2FsbGluZyB0aGlzCi0JICogbWV0aG9kIHdpbGwgY2F1c2UgYSBzeW5jaHJvbml6YXRpb24gb2YgdGhlIGV4cHJlc3Npb24gdXAgdG8gdGhlIGN1cnJlbnQgbGV2ZWwuIFRoaXMgbWVhbnMKLQkgKiB0aGF0IGl0IHdpbGwgbm90IHJldHVybiB1bnRpbCB0aGUgZXhwcmVzc2lvbiBoYXMgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCBpbiB0aGUgcHJveHkgcmVnaXN0cnkKLQkgKiB1cCB0byB0aGlzIHBvaW50LiBUeXBpY2FsbHkgdGhlIGNvbm5lY3Rpb24gaXMgYSBwaXBlIHdoZXJlIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGp1c3QgcHVzaGVkIG9udG8KLQkgKiBpdCBhbmQgdGhlIGNhbGxlciBpcyBub3QgaGVsZCB1cCB3YWl0aW5nIGZvciB0aGUgcmVnaXN0cnkgdG8gcHJvY2VzcyBpdC4gCi0JICogPHA+Ci0JICogVGhlbiB3aGVuIHRoZSBvdGhlciB0aHJlYWQgaXMgZG9uZSwgaXQgd2lsbCBjYWxsIGJlZ2luVHJhbnNmZXJUaHJlYWQgaXRzZWxmIHRvIHNpZ25hbCB0aGF0IGl0IGlzIGRvbmUKLQkgKiBhbmQgdGhhdCB0aGUgb2xkIHRocmVhZCBjYW4gcGljayBpdCB1cC4gVGhlbiB0aGUgb2xkIHRocmVhZCB3aWxsIGNhbGwgdHJhbnNmZXJUaHJlYWQgdG8gcGljayB1cCBwcm9jZXNzaW5nLgotCSAqIDxwPgotCSAqIEl0IHdpbGwgYmU6Ci0JICogPHByZT48Y29kZT4KLQkgKiAgIC4uLiBleHByZXNzaW9uIHN0dWZmIC4uLgotCSAqICAgZXhwcmVzc2lvbi5iZWdpblRyYW5zZmVyVGhyZWFkKCkKLQkgKiAgIC4uLiBkbyB3aGF0IGlzIG5lY2Vzc2FyeSB0byBnZXQgdG8gdGhlIG90aGVyIHRocmVhZCAuLi4KLQkgKiAgIC4uLiBvbiBvdGhlciB0aHJlYWQ6Ci0JICogICBleHByZXNzaW9uLnRyYW5zZmVyVGhyZWFkKCk7Ci0JICogICB0cnkgewotCSAqICAgICAuLi4gZG8geW91ciBleHByZXNzaW9uIHN0dWZmIG9uIHRoaXMgdGhyZWFkIC4uLgotCSAqICAgfSBmaW5hbGx5IHsKLQkgKiAgICAgZXhwcmVzc2lvbi5iZWdpblRyYW5zZmVyVGhyZWFkKCk7IC8vIFRoaXMgaXMgdG8gcmV0dXJuIGl0IHRvIG9sZCB0aHJlYWQuCi0JICogICB9Ci0JICogICAuLi4gdGVsbCBvbGQgdGhyZWFkIHRvIHBpY2sgdXAgLi4uCi0JICogICAuLi4gYmFjayBvbiBvbGQgdGhyZWFkOgotCSAqICAgZXhwcmVzc2lvbi50cmFuc2ZlclRocmVhZCgpOwotCSAqICAgLi4uIGRvIG1vcmUgZXhwcmVzc2lvbiBzdHVmZiAuLi4KLQkgKiAgIGV4cHJlc3Npb24uaW52b2tlRXhwcmVzc2lvbigpOwotCSAqIDwvY29kZT48L3ByZT4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkgVGhyb3duIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gd2l0aCB0aGUgcmVtb3RlIHZtIGR1cmluZyB0aGlzIHJlcXVlc3QuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5UcmFuc2ZlclRocmVhZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5IHsKLQkJdHJ5IHsKLQkJCXB1c2hGb3JFeHByZXNzaW9uKFRIUkVBRFRSQU5TRkVSX0VYUFJFU1NJT04pOwotCQkJcHVzaEJlZ2luVHJhbnNmZXJUaHJlYWRUb1Byb3h5KCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0JCQotCS8qKgotCSAqIFRyYW5zZmVyIHRoZSBleHByZXNzaW9uIHRvIHRoZSBjdXJyZW50IHRocmVhZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGNhbGxlZCB0byBhY3R1YWxseSB0cmFuc2ZlciB0byB0aGUgY3VycmVudCB0aHJlYWQuIEl0IG11c3QgYmUgdGhlIG5leHQgY2FsbCBhZ2FpbnN0Ci0JICogdGhlIGV4cHJlc3Npb24gYWZ0ZXIgdGhlIGJlZ2luVHJhbnNmZXJUaHJlYWQsIGJ1dCBvbiB0aGUgbmV3IHRocmVhZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG5vdCBvbiB0aGUgSUV4cHJlc3Npb24gaW50ZXJmYWNlIGJlY2F1c2UgZXZlbiB0aG91Z2ggaXQgaXMgQVBJLCBpdCBpcyB0cmlja3kKLQkgKiB0byB1c2UgYW5kIHNvIG5vdCBleHBvc2VkIHRvIGV2ZXJ5b25lLiBVc2VycyBjYW4gbGVnaXRpbWF0ZWx5IGNhc3QgdG8gRXhwcmVzc2lvbiBhbmQgCi0JICogdXNlIHRoaXMgYXMgQVBJIGZvciBhZHZhbmNlZCB1c2UuIAotCSAqIEBzZWUgRXhwcmVzc2lvbiNiZWdpblRyYW5zZmVyVGhyZWFkKCkgZm9yIGEgZnVsbCBleHBsYW5hdGlvbi4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRyYW5zZmVyVGhyZWFkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQljaGVja0ZvckV4cHJlc3Npb24oVEhSRUFEVFJBTlNGRVJfRVhQUkVTU0lPTik7Ci0JCQlwdXNoVHJhbnNmZXJUaHJlYWRUb1Byb3h5KCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbWFya0ludmFsaWQoKTsKLQkJCXRocm93IGU7Ci0JCX0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBHZXQgdGhlIElQcm94eUJlYW5UeXBlIGZvciB0aGUgdHlwZSBzdHJpbmcgc2VudCBpbi4KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb3h5QmVhblR5cGUgZ2V0UHJveHlCZWFuVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gZ2V0UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkodGhpcywgdHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhwcmVzc2lvbiBwcm94eSBzdWJjbGFzcyB0aGF0IGlzIGFwcGxpY2FibGUgZm9yIHRoaXMga2luZCBvZiBwcm9jZXNzb3IuIAotCSAqIEBwYXJhbSBwcm94eVR5cGUgdHlwZSBvZiBwcm94eS4ge0BsaW5rIEV4cHJlc3Npb24jTk9STUFMX0VYUFJFU1NJT05fUFJPWFkKLQkgKiBAcGFyYW0gcHJveHlJRCB0aGUgaWQgb2YgdGhlIG5ldyBleHByZXNzaW9uIHByb3h5LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRXhwcmVzc2lvblByb3h5IGNyZWF0ZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlUeXBlLCBpbnQgcHJveHlJRCk7Ci0JCi0JLyoqCi0JICogUHVzaCB0aGlzIHByb3h5IHRvIHRoZSBvdGhlciBzaWRlLiBJdCB3aWxsIHNpbXBseSB0YWtlIHRoZSBwcm94eSBhbmQgcHVzaCBpdCBvbnRvCi0JICogaXRzIGV2YWx1YXRpb24gc3RhY2suIEl0IHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24uIEl0J3MganVzdCAKLQkgKiB0aGF0IHRoZSBleHByZXNzaW9uIHdhcyBldmFsdWF0YWJsZSBvbiB0aGlzIHNpZGUgKHNpbmNlIGl0IGlzIGFscmVhZHkgYSBwcm94eSkuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaFRvUHJveHkoSVByb3h5IHByb3h5KTsKLQotCS8qKgotCSAqIFRlbGwgdGhlIG90aGVyIHNpZGUgd2UgYXJlIGNvbXBsZXRlLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBhZnRlciBleHByZXNzaW9uIGV2YWx1YXRpb24sIG9yCi0JICogaWYgZXhwcmVzc2lvbiB3YXMgcHJlbWF0dXJlbHkgY2xvc2VkLgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGUgaW1wbGVtZW50YXRpb24gbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSBtdWx0aXBsZSBpbnZvY2F0aW9ucywgd2hlcmUgdGhlIGZpcnN0IGNhbGwgaXMgYSB2YWxpZCBjbG9zZSBhbmQgYW55Ci0JICogc3Vic2VxdWVudCBjYWxsIHNob3VsZCBiZSBpZ25vcmVkLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjbG9zZVByb3h5KCk7Ci0JCi0JLyoqCi0JICogRG8gaW52b2tlLiBUaGlzIHNob3VsZCBzaW1wbHkgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgZG9uZSBhbmQgdGhyb3cgYW55IHBlbmRpbmcgZXJyb3JzLgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGUgZXhwcmVzc2lvbiBwcm94aWVzIE1VU1QgYmUgcmVzb2x2ZWQgKGNhbGxiYWNrcyBjYWxsZWQpIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgZXhwcmVzc2lvblByb3hpZXMgbGlzdC4gVGhpcwotCSAqIGlzIHNvIHRoYXQgdGhlIGNvbnRyYWN0IGlzIGZvbGxvd2VkIHRoYXQgcmVzb2x1dGlvbiBub3RpZmljYXRpb25zIHdpbGwgb2NjdXIgaW4gdGhlIG9yZGVyIG9mIGNyZWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eWNvdW50IE51bWJlciBvZiBFeHByZXNzaW9uIFByb3hpZXMgdGhhdCBuZWVkIGEgY2FsbGJhY2suCi0JICogQHBhcmFtIGxpc3Qgb2YgZXhwcmVzc2lvbiBwcm94aWVzLiBJZiBwcm94eWNvdW50ID4gMCwgdGhlbiBwcm9jZXNzIHRoZSBub24tbnVsbCBlbnRyaWVzIGluIHRoZSBsaXN0LiBUaGV5IHdpbGwgYmUgb2YgdHlwZSBFeHByZXNzaW9uUHJveHkuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hJbnZva2UoaW50IHByb3h5Y291bnQsIExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUHVsbCB0aGUgdG9wIGV4cHJlc3Npb24gdmFsdWUgZnJvbSB0aGUgZXZhbHVhdGlvbiBzdGFjay4gSXQgd2lsbCBhbHNvIHVuZGVyCi0JICogdGhlIGNvdmVycyBjYWxsIGNsb3NlUHJveHkuICBJdCBhbHNvIG11c3QgcHJvY2VzcyB0aGUgZXhwcmVzc2lvbiBwcm94eSBjYWxsYmFja3MuIEl0IG11c3QgZG8gdGhlIGV4cHJlc3Npb24gcHJveHkgY2FsbGJhY2tzIGZpcnN0LCBhbmQgdGhlbgotCSAqIHByb2Nlc3MgdGhlIHJlc3VsdCB2YWx1ZS4gSWYgYW4gZXJyb3IgaGFkIG9jY3VyZWQgc29tZXRpbWUgZHVyaW5nIHByb2Nlc3NpbmcsIGl0IHNob3VsZCBzdGlsbCBwcm9jZXNzIHRoZSBwcm94eSBjYWxsYmFja3MgYmVmb3JlIHRocm93aW5nCi0JICogYW4gZXhjZXB0aW9uLgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGUgZXhwcmVzc2lvbiBwcm94aWVzIE1VU1QgYmUgcmVzb2x2ZWQgKGNhbGxiYWNrcyBjYWxsZWQpIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgZXhwcmVzc2lvblByb3hpZXMgbGlzdC4gVGhpcwotCSAqIGlzIHNvIHRoYXQgdGhlIGNvbnRyYWN0IGlzIGZvbGxvd2VkIHRoYXQgcmVzb2x1dGlvbiBub3RpZmljYXRpb25zIHdpbGwgb2NjdXIgaW4gdGhlIG9yZGVyIG9mIGNyZWF0aW9uLiBBbHNvIDxiPlJFUVVJUkVEPC9iPiBpcyB0aGF0Ci0JICogdGhlIGVudGlyZSBsaXN0IG11c3QgYmUgcHJvY2Vzc2VkIG9mIHByb3hpZXMgbXVzdCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBjYWxsLiBJdCBjYW5ub3QgZG8gc29tZSBvciBub25lLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eWNvdW50IE51bWJlciBvZiBFeHByZXNzaW9uIFByb3hpZXMgdGhhdCBuZWVkIGEgY2FsbGJhY2suCi0JICogQHBhcmFtIGxpc3Qgb2YgZXhwcmVzc2lvbiBwcm94aWVzLiBJZiBwcm94eWNvdW50ID4gMCwgdGhlbiBwcm9jZXNzIHRoZSBub24tbnVsbCBlbnRyaWVzIGluIHRoZSBsaXN0LiBUaGV5IHdpbGwgYmUgb2YgdHlwZSBFeHByZXNzaW9uUHJveHkuCi0JICogQHJldHVybiBUaGUgdG9wIGxldmVsIGV2YWx1YXRpb24gc3RhY2sgdmFsdWUuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUJlYW5Qcm94eSBwdWxsUHJveHlWYWx1ZShpbnQgcHJveHljb3VudCwgTGlzdCBleHByZXNzaW9uUHJveGllcykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBjYXN0IGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIHRvIHVzZSB3aWxsIGJlIG9uIHRoZSB0b3Agb2YgaXRzIGV2YWx1YXRpb24gc3RhY2suCi0JICogVGhlIHJlc3VsdCBvZiB0aGUgY2FzdCBleHByZXNzaW9uIHdpbGwgYmUgcGxhY2VkIG9udG8gdGhlIGV2YWx1YXRpb24gc3RhY2suCi0JICogIAotCSAqIEBwYXJhbSB0eXBlIENhc3QgdHlwZS4gCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaENhc3RUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpOwotCi0JLyoqCi0JICogUHVzaCB0byBwcm94eSB0aGUgaW5zdGFuY2VvZiBleHByZXNzaW9uLiBUaGUgZXhwcmVzc2lvbiB0byB1c2Ugd2lsbCBiZSBvbiB0aGUgdG9wIG9mIGl0cyBldmFsdWF0aW9uIHN0YWNrLgotCSAqIFRoZSByZXN1bHQgb2YgdGhlIGluc3RhbmNlb2YgZXhwcmVzc2lvbiB3aWxsIGJlIHBsYWNlZCBvbnRvIHRoZSBldmFsdWF0aW9uIHN0YWNrLgotCSAqICAKLQkgKiBAcGFyYW0gdHlwZSBJbnN0YW5jZW9mIHR5cGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEluc3RhbmNlb2ZUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIGluZml4IG9wZXJhdGlvbi4gVGhpcyBpcyBjYWxsZWQgb24gdGhlIGNvbXBsZXRpb24gb2YgZWFjaCBvcGVyYW5kIG9mIHRoZSBleHByZXNzaW9uLgotCSAqIFNvIGl0IHdpbGwgYmUgY2FsbGVkIGEgbWluaW11bSBvZiB0d28gdGltZXMuCi0JICogCi0JICogQHBhcmFtIG9wZXJhdG9yIFRoZSBvcGVyYXRvci4KLQkgKiBAcGFyYW0gb3BlcmFuZFR5cGUgVGhlIG9wZXJhbmQgdHlwZS4gbGVmdCwgb3RoZXIsIG9yIGxhc3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEluZml4VG9Qcm94eShJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLCBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUgb3BlcmFuZFR5cGUpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIHByZWZpeCBleHByZXNzaW9uLiBUaGUgZXhwcmVzc2lvbiB0byB1c2Ugd2lsbCBiZSBvbiB0b3Agb2YgaXRzIGV2YWx1YXRpb24gc3RhY2suCi0JICogVGhlIHJlc3VsdCBvZiB0aGUgcHJlZml4IG9wZXJhdGlvbiB3aWxsIGJlIHBsYWNlZCBvbnRvIHRoZSBldmFsdWF0aW9uIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRvciAKLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uQ29uc3RhbnRzI1BSRV9NSU5VUwotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hQcmVmaXhUb1Byb3h5KFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yKTsJCi0KLQkKLQkvKioKLQkgKiBQdXNoIHRvIHByb3h5IHRoZSBhcnJheSBhY2Nlc3MuIFRoZSByZXN1bHQgd2lsbCBiZSBwbGFjZWQgb250byB0aGUgZXZhbHVhdGlvbiBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhDb3VudAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hBcnJheUFjY2Vzc1RvUHJveHkoaW50IGluZGV4Q291bnQpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIGFycmF5IGNyZWF0aW9uLiBUaGUgcmVzdWx0IHdpbGwgYmUgcGxhY2VkIG9udG8gdGhlIGV2YWx1YXRpb24gc3RhY2suCi0JICogQHBhcmFtIHR5cGUgVGhlIGFycmF5IHR5cGUuIAotCSAqIEBwYXJhbSBkaW1lbnNpb25Db3VudAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hBcnJheUNyZWF0aW9uVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgZGltZW5zaW9uQ291bnQpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIGFycmF5IGluaXRpYWxpemVyLiBUaGUgcmVzdWx0aW5nIGFycmF5IHdpbGwgYmUgcGxhY2VkIG9udG8gdGhlIGV2YWx1YXRpb24gc3RhY2suCi0JICogQHBhcmFtIHR5cGUgVGhlIGFycmF5IHR5cGUuIChtdXN0IGJlIGFuIGFycmF5IHR5cGUpLgotCSAqIEBwYXJhbSBzdHJpcERpbUNvdW50IHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyB0aGF0IG11c3QgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYXJyYXkgdHlwZS4gVGhpcyBpcyBuZWVkZWQKLQkgKiBiZWNhdXNlIHRoZSBmaXJzdCBhcnJheSBpbml0aWFsaXplciBuZWVkcyB0byBiZSBmb3IgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheSAoYXJyYXkgbWludXMgb25lIGRpbWVuc2lvbiksIGFuZAotCSAqIGVhY2ggaW5pdGlhbGl6ZXIgYWZ0ZXIgdGhhdCBuZWVkcyBvbmUgbW9yZSBkaW1lbnNpb24gc3RyaXBwZWQgb2ZmLiBCdXQgc2luY2Ugd2UgYXJlIHdvcmtpbmcgd2l0aCBwb3NzaWJsZSBleHByZXNzaW9uCi0JICogcHJveGllcyBmb3IgInR5cGUiLCB3ZSBjYW4ndCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudCB0eXBlcyBvZiB0aGUgYXJyYXkuIFNvIHdlIG5lZWQgdG8gdGVsbCB0aGUKLQkgKiBwcm9jZXNzb3IgaG93IG1hbnkgZGltcyB0byBzdHJpcCBmcm9tIHRoZSBvcmlnaW5hbCB0eXBlICh3aGljaCBpcyB3aGF0IGlzIHNlbnQgaW4gb24gZXZlcnkgaW5pdGlhbGl6ZXIgcHVzaCwgdGhlIG9yaWdpbmFsIHR5cGUpLgotCSAqIEBwYXJhbSBleHByZXNzaW9uQ291bnQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQXJyYXlJbml0aWFsaXplclRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IHN0cmlwRGltQ291bnQsIGludCBleHByZXNzaW9uQ291bnQpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uLiBUaGUgcmVzdWx0aW5nIGNsYXNzIGluc3RhbmNlIHdpbGwgYmUgcGxhY2VkIG9udG8gdGhlIGV2YWx1YXRpb24gc3RhY2suCi0JICogCi0JICogQHBhcmFtIHR5cGUgQ2xhc3MgdHlwZS4gCi0JICogQHBhcmFtIGFyZ3VtZW50Q291bnQgVGhlIG51bWJlciBvZiBhcmd1bWVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvblRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGFyZ3VtZW50Q291bnQpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIHR5cGUgcmVjZWl2ZXIuIFRoZSByZXN1bHRpbmcgY2xhc3Mgd2lsbCBiZSBwbGFjZWQgb250byB0aGUgZXZhbHVhdGlvbiBzdGFjaywgYWxvbmcgd2l0aCBpdCBhbHNvCi0JICogYmVpbmcgdGhlIGV4cHJlc3Npb24gdHlwZS4KLQkgKiBAcGFyYW0gdHlwZSBDbGFzcyB0eXBlLiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoVHlwZVJlY2VpdmVyVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIGZpZWxkIGFjY2Vzcy4gVGhlIHJlc3VsdCB2YWx1ZSB3aWxsIGJlIHBsYWNlZCBvbnRvIHRoZSBldmFsdWF0aW9uIHN0YWNrLgotCSAqIEBwYXJhbSBmaWVsZCBUaGUgbmFtZSBvZiB0aGUgZmllbGQgaWYgc3RyaW5nLCBvciBhbiBJRmllbGRQcm94eS4KLQkgKiBAcGFyYW0gaGFzUmVjZWl2ZXIgSGFzIHJlY2VpdmVyIGZsYWcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEZpZWxkQWNjZXNzVG9Qcm94eShPYmplY3QgZmllbGQsIGJvb2xlYW4gaGFzUmVjZWl2ZXIpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIG1ldGhvZCBpbnZvY2F0aW9uLiBUaGUgcmVzdWx0IHZhbHVlIHdpbGwgYmUgcGxhY2VkIG9udG8gdGhlIGV2YWx1YXRpb24gc3RhY2suCi0JICogCi0JICogQHBhcmFtIG1ldGhvZCBTdHJpbmcgZm9yIG1ldGhvZCBuYW1lIG9yIElQcm94eU1ldGhvZAotCSAqIEBwYXJhbSBoYXNSZWNlaXZlcgotCSAqIEBwYXJhbSBhcmdDb3VudAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hNZXRob2RJbnZvY2F0aW9uVG9Qcm94eShPYmplY3QgbWV0aG9kLCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJnQ291bnQpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBwYXJ0IG9mIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIHR5cGUKLQkgKiB3aWxsIGJlIHRoZSBjdXJyZW50IHBhcnQgKGUuZy4gdGVzdCwgdHJ1ZSwgZmFsc2UpLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uVHlwZSBUaGUgZXhwcmVzc2lvbiB0eXBlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hDb25kaXRpb25hbFRvUHJveHkoSW50ZXJuYWxDb25kaXRpb25hbE9wZXJhbmRUeXBlIGV4cHJlc3Npb25UeXBlKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRvIHRoZSBwcm94eSB0aGUgZXhwcmVzc2lvbiBwcm94eS4gV2hhdGV2ZXIgdGhlIGxhc3QgZXhwcmVzc2lvbiB2YWx1ZSBpcyB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBFeHByZXNzaW9uUHJveHkuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEFzc2lnbm1lbnRUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSk7Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLiBUaGUgb3BlcmFuZHMgYXJlIGFscmVhZHkgb24gdGhlIHN0YWNrLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hBc3NpZ25tZW50VG9Qcm94eSgpOwotCi0JCi0JLyoqCi0JICogUHVzaCB0aGUgYmVnaW4gYmxvY2sgZXhwcmVzc2lvbi4gCi0JICogQHBhcmFtIGJsb2NrTnVtYmVyIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hCbG9ja0JlZ2luVG9Qcm94eShpbnQgYmxvY2tOdW1iZXIpOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIGVuZCBibG9jayBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBibG9ja051bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hCbG9ja0VuZFRvUHJveHkoaW50IGJsb2NrTnVtYmVyKTsKLQotCS8qKgotCSAqIFB1c2ggdGhlIGJyZWFrIGJsb2NrIGV4cHJlc3Npb24uCi0JICogQHBhcmFtIGJsb2NrTnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQmxvY2tCcmVha1RvUHJveHkoaW50IGJsb2NrTnVtYmVyKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBiZWdpbiB0cnkgZXhwcmVzc2lvbi4gCi0JICogQHBhcmFtIHRyeU51bWJlciAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoVHJ5QmVnaW5Ub1Byb3h5KGludCB0cnlOdW1iZXIpOwotCi0JLyoqCi0JICogUHVzaCB0aGUgY2F0Y2ggY2xhdXNlIHRvIHByb3h5LgotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZSAKLQkgKiBAcGFyYW0gZXAgRXhwcmVzc2lvblByb3h5IHRvIGJlIGFzc2lnbmVkIHdpdGggdGhlIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBleGNlcHRpb24gaXMgbm90IHRvIGJlIGFzc2lnbmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hUcnlDYXRjaENsYXVzZVRvUHJveHkoaW50IHRyeU51bWJlciwgSVByb3h5QmVhblR5cGUgZXhjZXB0aW9uVHlwZSwgRXhwcmVzc2lvblByb3h5IGVwKTsKLQotCS8qKgotCSAqIFB1c2ggdGhlIGZpbmFsbHkgY2xhdXNlIHRvIHByb3h5LgotCSAqIEBwYXJhbSB0cnlOdW1iZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoVHJ5RmluYWxseUNsYXVzZVRvUHJveHkoaW50IHRyeU51bWJlcik7Ci0KLQkvKioKLQkgKiBQdXNoIHRyeSBlbmQgdG8gcHJveHkuCi0JICogQHBhcmFtIHRyeU51bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hUcnlFbmRUb1Byb3h5KGludCB0cnlOdW1iZXIpOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIHRocm93IG9mIHRoZSBleGNlcHRpb24gdG8gcHJveHkuCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hUaHJvd1RvUHJveHkoKTsKLQkKLQkvKioKLQkgKiBQdXNoIGEgcmV0aHJvdyB0byBwcm94eS4KLQkgKiBAcGFyYW0gdHJ5TnVtYmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaFJldGhyb3dUb1Byb3h5KGludCB0cnlOdW1iZXIpOwotCi0JLyoqCi0JICogUHVzaCB0aGUgQmVhblR5cGUgRXhwcmVzc2lvbiBwcm94eSB0byBiZSByZXNvbHZlZCBvbiB0aGUgZXhlY3V0aW9uIHNpZGUuCi0JICogQHBhcmFtIHByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEJlYW5UeXBlVG9Qcm94eShJQmVhblR5cGVFeHByZXNzaW9uUHJveHkgcHJveHkpOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIE1ldGhvZCBFeHByZXNzaW9uIHByb3h5IHRvIGJlIHJlc29sdmVkIG9uIHRoZSBleGVjdXRpb24gc2lkZS4KLQkgKiBAcGFyYW0gcHJveHkKLQkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIHBhcmFtZXRlciB0eXBlcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJhbWV0ZXJzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hNZXRob2RUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSwgSVByb3h5QmVhblR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogUHVzaCB0aGUgRmllbGQgRXhwcmVzc2lvbiBQcm94eSB0byBiZSByZXNvbHZlZCBvbiB0aGUgZXhlY3V0aW9uIHNpZGUuCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUKLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaEZpZWxkVG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHksIElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBmaWVsZE5hbWUpOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIElmIHRlc3QgY29uZGl0aW9uIHRvIHByb3h5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hJZlRlc3RUb1Byb3h5KCk7Ci0JCi0JLyoqCi0JICogUHVzaCBhIHRydWUgb3IgZWxzZSBjbGF1c2UgdG8gcHJveHkuCi0JICogQHBhcmFtIGNsYXVzZVR5cGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoSWZFbHNlVG9Qcm94eShJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIGNsYXVzZVR5cGUpOwotCQotCS8qKgotCSAqIFB1c2ggdG8gcHJveHkgYSBuZXcgaW5zdGFuY2UgdXNpbmcgYW4gaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotCSAqIEBwYXJhbSBpbml0aWFsaXphdGlvblN0cmluZwotCSAqIEBwYXJhbSByZXN1bHRUeXBlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHVzaE5ld0luc3RhbmNlVG9Qcm94eShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcsIElQcm94eUJlYW5UeXBlIHJlc3VsdFR5cGUpOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIG1hcmsgaWQgdG8gcHJveHkuCi0JICogCi0JICogQHBhcmFtIG1hcmtJRAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hNYXJrVG9Qcm94eShpbnQgbWFya0lEKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBlbmQgbWFyayBpZCB0byBwcm94eS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFya0lECi0JICogQHBhcmFtIHJlc3RvcmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHJlc3RvcmUgZHVlIHRvIGVycm9yLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBpcyBqdXN0IGEgbm9ybWFsIGVuZCBtYXJrLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hFbmRtYXJrVG9Qcm94eShpbnQgbWFya0lELCBib29sZWFuIHJlc3RvcmUpOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIGJlZ2luIHRyYW5zZmVyIHRocmVhZCB0byBwcm94eS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoQmVnaW5UcmFuc2ZlclRocmVhZFRvUHJveHkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgYWN0dWFsIHRyYW5zZmVyIHRvIHRoZSBjdXJyZW50IHRocmVhZCB0byBwcm94eS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXNoVHJhbnNmZXJUaHJlYWRUb1Byb3h5KCk7Ci0JCi0JLyoqCi0JICogUHVzaCB0aGUgc3ViZXhwcmVzc2lvbiBiZWdpbiB0byBwcm94eS4KLQkgKiBAcGFyYW0gc3ViZXhwcmVzc2lvbk51bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hTdWJleHByZXNzaW9uQmVnaW5Ub1Byb3h5KGludCBzdWJleHByZXNzaW9uTnVtYmVyKTsKLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBzdWJleHByZXNzaW9uIGVuZCB0byBwcm94eS4KLQkgKiBAcGFyYW0gc3ViZXhwcmVzc2lvbk51bWJlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1c2hTdWJleHByZXNzaW9uRW5kVG9Qcm94eShpbnQgc3ViZXhwcmVzc2lvbk51bWJlcik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9FeHByZXNzaW9uUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0V4cHJlc3Npb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGVhMjhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0V4cHJlc3Npb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEV4cHJlc3Npb25Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0gCi0KLS8qKgotICogVGhpcyBpcyBhIHByb3h5IGZvciBhbiBJRXhwcmVzc2lvbiBldmFsdWF0aW9uIHZhbHVlLiBJdCBpcyB1c2VkIGFzIGEgcGxhY2UgaG9sZGVyIHByb3h5IHZhbHVlIGZvciByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiwgYW5kCi0gKiB0aGVuIHRoZSB2YWx1ZSBjYW4gYmUgdXNlZCBpbiBhIGxhdGVyIGV4cHJlc3Npb24sIG9yIGF0IHRoZSBlbmQsIGl0IGNhbiBjYWxsYmFjayBhbmQgcmV0dXJuIGEgcHJveHkgaW4gdGhlIElERSAKLSAqIHNpZGUgaW4gYSBjYWxsYmFjayBmb3IgdXNhZ2UgbGF0ZXIgb24gb3V0c2lkZSBvZiB0aGUgSUV4cHJlc3Npb24uCi0gKiA8cD4KLSAqIEFmdGVyIHJlY2VpdmluZyB0aGUgcmVzb2x2ZWQgZXZlbnQsIGxpc3RlbmVycyBzaG91bGQgbm90IGhvbGQgb250byB0aGUgRXhwcmVzc2lvblByb3h5IGJlY2F1c2UgaXQgd291bGQgdGhlbiBiZSBpbnZhbGlkLiBBdCB0aGF0Ci0gKiBwb2ludCB0aGV5IHNob3VsZCBpbnN0ZWFkIGhvbGQgb250byB0aGUgcmVzb2x2ZWQgYmVhbiBwcm94eS4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNhc3NpZ25FeHByZXNzaW9uUHJveHkoKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiNjcmVhdGVFeHByZXNzaW9uUHJveHlFeHByZXNzaW9uKGludCwgRXhwcmVzc2lvblByb3h5KQotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJUHJveHkgewotCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpLmdldFJlZ2lzdHJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBldmVudCBvYmplY3QgZm9yIHRoZSByZXNvbHZlZCBldmVudCBvZiB0aGUgcHJveHkgbGlzdGVuZXIuCi0JICogPHA+Ci0JICogVGhlIHNvdXJjZSB3aWxsIGJlIHRoZSBFeHByZXNzaW9uUHJveHkgdGhhdCBpcyBiZWluZyByZXNvbHZlZC4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3h5RXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIzMDU3ODE2NjI0NjUxMDczNzdMOwotCQlwcml2YXRlIGZpbmFsIElCZWFuUHJveHkgcHJveHk7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBzb3VyY2UgdGhlIGV4cHJlc3Npb24gcHJveHkgZm9yIHRoZSBldmVudC4KLQkJICogQHBhcmFtIHByb3h5IHRoZSBiZWFuIHByb3h5IHRoZSBleHByZXNzaW9uIHByb3h5IChzb3VyY2UpIHJlc29sdmVkIHRvLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgUHJveHlFdmVudChFeHByZXNzaW9uUHJveHkgc291cmNlLCBJQmVhblByb3h5IHByb3h5KSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJdGhpcy5wcm94eSA9IHByb3h5OwotCQl9Ci0JCQotCQkvKioKLQkJICogQ29uc3RydWN0IHRoZSBldmVudCB3aXRoIG5vIHByb3h5LiBVc2VkIGZvciBub3QgcmVzb2x2ZWQgYW5kIHZvaWQuCi0JCSAqIEBwYXJhbSBzb3VyY2UKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIFByb3h5RXZlbnQoRXhwcmVzc2lvblByb3h5IHNvdXJjZSkgewotCQkJdGhpcyhzb3VyY2UsIG51bGwpOwotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IHRoZSBwcm94eSB2YWx1ZSB0aGF0IHRoZSBleHByZXNzaW9uIHByb3h5IChzb3VyY2UpIHJlc29sdmVkIHRvLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBJQmVhblByb3h5IGdldFByb3h5KCkgewotCQkJcmV0dXJuIHByb3h5OwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExpc3RlbmVyIGZvciBleHByZXNzaW9uIHByb3h5IGV2ZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFByb3h5TGlzdGVuZXIgewotCQkvKioKLQkJICogVGhlIGV4cHJlc3Npb24gcHJveHkgaGFzIGJlZW4gcmVzb2x2ZWQuIFRoZSBldmVudCBjb250YWlucyB0aGUgcmVzb2x2ZWQgcHJveHkuCi0JCSAqIEF0IHRoaXMgcG9pbnQsIGFueSBsaXN0ZW5lcnMgc2hvdWxkIG5vIGxvbmdlciBob2xkIG9udG8gdGhlIEV4cHJlc3Npb25Qcm94eQotCQkgKiBiZWNhdXNlIGl0IGlzIG5vdyBpbnZhbGlkLiBUaGV5IHNob3VsZCBob2xkIG9udG8gdGhlIHJlc29sdmVkIGJlYW4gcHJveHkgaW5zdGVhZC4KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpOwotCQkKLQkJLyoqCi0JCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBFeHByZXNzaW9uUHJveGllcyB0aGF0IGhhdmUgYSBjYWxsYmFjayBsaXN0ZW5lciwgYnV0IHRoZSBwcm94eSAKLQkJICogd2FzIG5ldmVyIHJlc29sdmVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gdGhhdCBhc3NpZ25zIHRvIHRoZSBwcm94eSB3YXMKLQkJICogbm90IGV4ZWN1dGVkLiBJbiB0aGlzIGNhc2UgdGhlIGV2ZW50IGRvZXMgbm90IGhhdmUgYSBiZWFuIHByb3h5IGluIGl0LgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCk7Ci0JCQotCQkvKioKLQkJICogVGhpcyBpcyBjYWxsZWQgZm9yIEV4cHJlc3Npb25Qcm94aWVzIHRoYXQgd2VyZSBhc3NpZ25lZCB0byBhbiBleHByZXNzaW9uIHRoYXQKLQkJICogaGFkIGEgPGNvZGU+Vk9JRDwvY29kZT4gcmV0dXJuIHR5cGUuIFRoaXMgaXMgdXN1YWxseSBmb3IgbWV0aG9kIGludm9jYXRpb25zIHRoYXQKLQkJICogaGF2ZSBhIHZvaWQgcmV0dXJuIHR5cGUuIEluIHRoaXMgY2FzZSB0aGUgZXZlbnQgZG9lcyBub3QgaGF2ZSBhIGJlYW4gcHJveHkgaW4gaXQuCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eVZvaWQoUHJveHlFdmVudCBldmVudCk7Ci0JfQotCQotCS8qKgotCSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFByb3h5TGlzdGVuZXIgdGhhdCBkb2VzIG5vdGhpbmcuIEl0IGNhbiBiZQotCSAqIHVzZWQgYXMgYSBzdXBlcmNsYXNzIGZvciBpbmRpdmlkdWFsIGxpc3RlbmVycyB0aGF0IGFyZSBvbmx5IGludGVyZXN0ZWQKLQkgKiBpbiBzb21lIG9mIHRoZSBldmVudHMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcm94eUFkYXB0ZXIgaW1wbGVtZW50cyBQcm94eUxpc3RlbmVyIHsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eU5vdFJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVZvaWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eVZvaWQoUHJveHlFdmVudCBldmVudCkgewotCQl9Ci0JfQotCQotCWZpbmFsIHByaXZhdGUgaW50IHByb3h5SUQ7Ci0JZmluYWwgcHJpdmF0ZSBpbnQgcHJveHlUeXBlOwotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdDsKLQlwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgd2l0aCB0aGUgZ2l2ZW4gcHJveHkgaWQuCi0JICogQHBhcmFtIHByb3h5aWQKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBpbnQgcHJveHlUeXBlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJdGhpcy5wcm94eUlEID0gcHJveHlpZDsKLQkJdGhpcy5wcm94eVR5cGUgPSBwcm94eVR5cGU7Ci0JCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgZXhwcmVzc2lvbiB0aGlzIHByb3h5IGlzIGZvci4gCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgaW4gZXhwcmVzc2lvbiB0byBnZXQgdGhlIHByb3h5IHR5cGUuIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldFByb3h5VHlwZSgpIHsKLQkJcmV0dXJuIHByb3h5VHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm94eSBpZC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGZpbmFsIGludCBnZXRQcm94eUlEKCkgewotCQlyZXR1cm4gcHJveHlJRDsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIuIElmIGxpc3RlbmVyIGFscmVhZHkgYWRkZWQsIGl0IGhhcyBubyBlZmZlY3QuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJveHlMaXN0ZW5lcihQcm94eUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkKLQkJCWxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyLiBJZiBsaXN0ZW5lciBub3QgYWxyZWFkeSBhZGRlZCwgdGhlbiBubyBlcnJvci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm94eUxpc3RlbmVyKFByb3h5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyTGlzdCAhPSBudWxsKQotCQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgYnkgaW50ZXJuYWwgc3ViY2xhc3NlcyBvciBFeHByZXNzaW9uIHRvIGtub3cgaWYgYW55b25lIGlzIGxpc3RlbmluZy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJMaXN0ICE9IG51bGwgJiYgIWxpc3RlbmVyTGlzdC5pc0VtcHR5KCk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBwcm94eSBoYXMgYmVlbiBmaXJlZCAob25lIG9mIHRoZSBldmVudHMgaGFzIG9jY3VycmVkKS4gU3ViY2xhc3NlcyBzaG91bGQgY2xlYW4KLQkgKiB1cCBhbmQgbm90IGhvbGQgb250byBhbnl0aGluZyB0aGF0IHdvdWxkIGJlIGV4cGVuc2l2ZSBpbiBjYXNlIHRoZSBwcm94eSBpcyBzdGlsbAotCSAqIGhlbGQgb250byBiZSBzb21lb25lLiBGb3IgZXhhbXBsZSB0aGUgZGVmYXVsdCBjbGVhcnMgdGhlIGxpc3RlbmVyIGxpc3QuCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFN1YmNsYXNzZXMgbXVzdCBjYWxsIHN1cGVyLmRpc3Bvc2UoKS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlsaXN0ZW5lckxpc3QgPSBudWxsOwotCQlleHByZXNzaW9uID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVXNlZCBieSBpbnRlcm5hbCBzdWJjbGFzc2VzICBvciBieSBFeHByZXNzaW9uIHRvIGZpcmUgdGhlIHJlc29sdmVkIGV2ZW50LiBPbmNlIGZpcmVkIGFsbCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQuCi0JICogVGhpcyBpcyBiZWNhdXNlIG9ubHkgb25lIGtpbmQgb2YgZmlyaW5nIGNhbiBiZSBkb25lIGZvciBhIGV4cHJlc3Npb24gcHJveHkgYW5kIHRoZW4gdGhlIHByb3h5IGlzIGRlYWQuIFRoaXMKLQkgKiBwcmV2ZW50cyBsaXN0ZW5lcnMgZnJvbSBiZWluZyBoZWxkIG9uIHRvIGlmIGFueSBvbmUgYWNjaWRlbnRseSBzdGlsbCBob2xkcyB0aGUgcHJveHkuCi0JICogQHBhcmFtIHByb3h5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJlc29sdmVkKElCZWFuUHJveHkgcHJveHkpIHsKLQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQlQcm94eUV2ZW50IGV2ZW50ID0gbmV3IFByb3h5RXZlbnQodGhpcywgcHJveHkpOwotCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQkoKFByb3h5TGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkucHJveHlSZXNvbHZlZChldmVudCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGJ5IGludGVybmFsIHN1YmNsYXNzZXMgb3IgYnkgRXhwcmVzc2lvbiB0byBmaXJlIHRoZSBub3QgcmVzb2x2ZWQgZXZlbnQuIE9uY2UgZmlyZWQgYWxsIGxpc3RlbmVycyBhcmUgcmVtb3ZlZC4KLQkgKiBUaGlzIGlzIGJlY2F1c2Ugb25seSBvbmUga2luZCBvZiBmaXJpbmcgY2FuIGJlIGRvbmUgZm9yIGEgZXhwcmVzc2lvbiBwcm94eSBhbmQgdGhlbiB0aGUgcHJveHkgaXMgZGVhZC4gVGhpcwotCSAqIHByZXZlbnRzIGxpc3RlbmVycyBmcm9tIGJlaW5nIGhlbGQgb24gdG8gaWYgYW55IG9uZSBhY2NpZGVudGx5IHN0aWxsIGhvbGRzIHRoZSBwcm94eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTm90UmVzb2x2ZWQoKSB7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJUHJveHlFdmVudCBldmVudCA9IG5ldyBQcm94eUV2ZW50KHRoaXMpOwotCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQkoKFByb3h5TGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkucHJveHlOb3RSZXNvbHZlZChldmVudCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGJ5IGludGVybmFsIHN1YmNsYXNzZXMgb3IgYnkgRXhwcmVzc2lvbiB0byBmaXJlIHRoZSB2b2lkIHJlc29sdmVkIGV2ZW50LiBPbmNlIGZpcmVkIGFsbCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQuCi0JICogVGhpcyBpcyBiZWNhdXNlIG9ubHkgb25lIGtpbmQgb2YgZmlyaW5nIGNhbiBiZSBkb25lIGZvciBhIGV4cHJlc3Npb24gcHJveHkgYW5kIHRoZW4gdGhlIHByb3h5IGlzIGRlYWQuIFRoaXMKLQkgKiBwcmV2ZW50cyBsaXN0ZW5lcnMgZnJvbSBiZWluZyBoZWxkIG9uIHRvIGlmIGFueSBvbmUgYWNjaWRlbnRseSBzdGlsbCBob2xkcyB0aGUgcHJveHkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVZvaWRSZXNvbHZlZCgpIHsKLQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQlQcm94eUV2ZW50IGV2ZW50ID0gbmV3IFByb3h5RXZlbnQodGhpcyk7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCSgoUHJveHlMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5wcm94eVZvaWQoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCWRpc3Bvc2UoKTsKLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzQmVhblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNFeHByZXNzaW9uUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogSXMgdGhpcyBwcm94eSB2YWxpZCBmb3IgcmVhc3NpZ25tZW50LiBCeSBkZWZhdWx0IG9ubHkgaWYgdGhlIHR5cGUgaXMgTk9STUFMX0VYUFJFU1NJT05fUFJPWFkuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgYW5kIHJldHVybiB0cnVlIGluIHRoZWlyIGNhc2VzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRm9yUmVhc3NpZ25tZW50KCkgewotCQlyZXR1cm4gZ2V0UHJveHlUeXBlKCkgPT0gRXhwcmVzc2lvbi5OT1JNQUxfRVhQUkVTU0lPTl9QUk9YWTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkrIjogIitnZXRQcm94eUlEKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTg3YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElBY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLS8qKgotICogUHJveHkgZm9yIGFuIEFjY2Vzc2libGVPYmplY3QuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMCAKLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgSUFjY2Vzc2libGVPYmplY3RQcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotCQotCS8qKgotCSAqIElzIHRoZSBwcm94eSBhY2Nlc3NpYmxlIG9yIG5vdD8KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NpYmxlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCQotCS8qKgotCSAqIFNldCB0aGUgYWNjZXNzaWJsZSBmbGFnIG9uIHRoZSBwcm94eS4KLQkgKiAKLQkgKiBAcGFyYW0gZmxhZyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhY2Nlc3NpYmxlLgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NpYmxlKGJvb2xlYW4gZmxhZykgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQXJyYXlCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lBcnJheUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjUxYzAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lBcnJheUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElBcnJheUJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIFByb3h5IHdyYXBwZXJpbmcgYW4gYXJyYXkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFycmF5QmVhblByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSB7Ci0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlJQmVhblByb3h5IGdldChpbnQgaW5kZXgpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotCUlCZWFuUHJveHkgZ2V0Q2F0Y2hUaHJvd2FibGVFeGNlcHRpb24oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG11bHRpLWRpbWVuc2lvbmFsIGluZGV4LgotCSAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQsCi0JICogYW5kIGVhY2ggaW5kZXggYWxvbmcgdGhlIHdheSBtdXN0IGV4aXN0LgotCSAqIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBjYW4ndCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgotCSAqIG9mIGRpbWVuc2lvbnMgb2YgdGhlIHJlYWwgb2JqZWN0LgotCSAqLwotCUlCZWFuUHJveHkgZ2V0KGludCBbXSBpbmRleGVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7IAotCQotCS8qKgotCSAqIEdldCBhIHNuYXBzaG90IG9mIHRoZSBhcnJheS4gSXQgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgcHJveGllcyBvZiB0aGUKLQkgKiBjb21wbGV0ZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGFycmF5LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgbmVlZAotCSAqIHRvIGJlIHdvcmtpbmcgd2l0aCBtb3JlIHRoYW4gb25lIGVudHJ5IG9mIHRoZSBhcnJheS4gWW91IGNhbiBzYXZlCi0JICogYWNjZXNzZXMgdG8gdGhlIHZtIGJ5IGRvaW5nIHRoaXMuIAotCSAqIDxwPgotCSAqIE5PVEU6IFRoaXMgaXMgYSBzbmFwc2hvdC4gSXQgd2lsbCBub3Qgc2VlIGNoYW5nZXMgdG8gdGhlIGFycmF5LgotCSAqIElmIGFuIGVudHJ5IGlzIHNldCBpbnRvIHRoZSByZXR1cm5lZCBhcnJheSBvZiBwcm94aWVzLCB0aGlzIHdpbGwKLQkgKiBub3QgYmUgcmVmbGVjdGVkIGludG8gdGhlIHJlYWwgYXJyYXkuIEFsc28gYW55IGNoYW5nZXMgaW4gdGhlCi0JICogY29udGVudHMgb2YgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgcmVhbCBhcnJheSB3aWxsIG5vdAotCSAqIGJlIHJlZmxlY3RlZCBpbnRvIHRoaXMgcmV0dXJuZWQgYXJyYXkgb2YgcHJveGllcy4gVGhlIHByb3hpZXMKLQkgKiByZXR1cm5lZCBhcmUgcmVhbCBwcm94aWVzLCBzbyBhbnkgY2hhbmdlcyB0byB0aGVtIHdpbGwgYmUgcmVmbGVjdGVkCi0JICogYmFjayBhbmQgZm9ydGguIFRyZWF0IHRoaXMgYXMgYW4gYXJyYXkgY29weSB0byBhIG5ldyBhcnJheS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIHByb3hpZXMgb2YgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCUlCZWFuUHJveHlbXSBnZXRTbmFwc2hvdCgpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXZvaWQgc2V0KElCZWFuUHJveHkgdmFsdWUsIGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCQotCS8qKgotCSAqIFNldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbXVsdGktZGltZW5zaW9uYWwgaW5kZXguCi0JICogVGhlIGFycmF5IG11c3QgYmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHNwZWNpZmllZCwKLQkgKiBhbmQgZWFjaCBpbmRleCBhbG9uZyB0aGUgd2F5IG11c3QgZXhpc3QuCi0JICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCi0JICogb2YgZGltZW5zaW9ucyBvZiB0aGUgcmVhbCBvYmplY3QuCi0JICovCi0Jdm9pZCBzZXQoSUJlYW5Qcm94eSB2YWx1ZSwgaW50IFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eTsJIAotCQotCS8qKgotCSAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhpcyBhcnJheS4KLQkgKiBJZiB0aGVyZSBhcmUgbXVsdGktZGltZW5zaW9ucywgeW91IG11c3QgZ2V0IHRoZSBhcHByb3ByaWF0ZQotCSAqIGRpbWVuc2lvbiBmcm9tIHRoZSBnZXQgbWV0aG9kIHRvIHNlZSB0aGUgc2l6ZSBvZiB0aGF0IGRpbWVuc2lvbi4KLQkgKgotCSAqIGUuZy4KLQkgKiAgICBpbnQgWzNdIHJldHVybnMgMwotCSAqICAgIGludCBbM11bMl0gcmV0dXJucyAzCi0JICoKLQkgKiAgICAoKElBcnJheUJlYW5Qcm94eSkgZ2V0KDEpKS5nZXRMZW5ndGgoKSByZXR1cm5zIDIKLQkgKiAgICBTaW5jZSBhcnJheXMgZG8gbm90IGhhdmUgdG8gYmUgaG9tb2dlbm91cywgdGhlcmUgY291bGQKLQkgKiAgICBiZSBhIGRpZmZlcmVudCBsZW5ndGggYXJyYXkgZm9yIGVhY2ggb2YgdGhlIGFycmF5cyAKLQkgKiAgICByZXR1cm5lZCBmcm9tIHRoZSBmaXJzdCBkaW1lbnNpb24sIHRoZSByZXR1cm5lZCBsZW5ndGgKLQkgKiAgICBmcm9tIGdldCgyKSBhbmQgZ2V0KDMpIGNvdWxkIHJlc3VsdCBpbiBhIGRpZmZlcmVudCB2YWx1ZQotCSAqICAgIGZyb20gZ2V0KDEpLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUFycmF5QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUFycmF5QmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmFlNjMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lBcnJheUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJQXJyYXlCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLS8qKgotICogQSBQcm94eSBmb3IgYW4gYXJyYXkgdHlwZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElBcnJheUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJQmVhblR5cGVQcm94eSB7Ci0JLyoqCi0JICogZ2V0Q29tcG9uZW50VHlwZTogR2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LgotCSAqIGUuZy4gKG5ldyBPYmplY3RbM10pLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpIHdpbGwKLQkgKiByZXR1cm4gImphdmEubGFuZy5PYmplY3QiLgotCSAqIGFuZCAobmV3IE9iamVjdFszXVsyXVsxXSkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkgd2lsbAotCSAqIHJldHVybiAiT2JqZWN0W11bXSI7Ci0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldENvbXBvbmVudFR5cGUoKTsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHR5cGUsIGkuZS4gdGhlIGZpbmFsIG5vbi1hcnJheSB0eXBlLgotCSAqIGkuZS4gaW50W11bXSB3aWxsIHJldHVybiBpbnQuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciB0aGlzIHR5cGUuCi0JICogaS5lLiBpbnQgW11bXSB3aWxsIHJldHVybiAyLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGltZW5zaW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGY0NmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLS8qKgotICogQmVhbiBQcm94eSBpbnRlcmZhY2UuIFRoaXMgaXMgdGhlCi0gKiByb290IGludGVyZmFjZSBmb3IgYW55IGJlYW4gcHJveHkgaW5zdGFuY2UuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzowMSBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5Qcm94eSBleHRlbmRzIElQcm94eSB7Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KTsKLQotLyoqCi0gKiBUZXN0IGZvciBpZGVudGl0eSBhbW9uZyB0aGlzIGJlYW4gcHJveHkgYW5kIHRoZSBvdGhlciBiZWFuIHByb3h5LgotICogRm9yIHNvbWUgcHJveHkgc3lzdGVtcywgdGhpcyBtYXkgYmUgcmVkdW5kZW50IGFuZCB5b3UgY2FuIGJlIGFzc3VyZWQKLSAqIHRoYXQgaWYgdGhlIG9iamVjdHMgYmVpbmcgcHJveGllZCBhcmUgaWRlbnRpY2FsIHlvdSB3aWxsIHJlY2VpdmUgdGhlCi0gKiBzYW1lIHByb3h5IGZvciBib3RoLiBIb3dldmVyLCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBoYXZlIHRoaXMKLSAqIGNvbmRpdGlvbi4gVGhlcmVmb3IgdGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQuCi0gKiAKLSAqIFRoZXJlIGlzIG9uZSByZXN0cmljdGlvbiwgY29uc3RhbnRzIG1heSBub3QgbmVjZXNzYXJpbHkgYmUgaWRlbnRpY2FsLgotICogRm9yIGluc3RhbmNlLCBpbiBzb21lIGltcGxlbWVudGF0aW9ucywgdGhlIEJvb2xlYW4gcHJveHkgKGkuZS4gYW4gaW5zdGFuY2Ugb2YgY2xhc3MgQm9vbGVhbikgaXMgYSBjb25zdGFudCwgaS5lLiAKLSAqIGl0IGNhbm5vdCBiZSBjaGFuZ2VkLiBJbiB0aG9zZSBjYXNlcyBhIG5ldyBwcm94eSBtYXkgYmUgY3JlYXRlZCBmb3IgZWFjaAotICogYWNjZXNzIGFuZCBzbyB0aGV5IHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgaWRlbnRpY2FsLiBJbiB0aG9zZSBjYXNlcyBmYWxzZSB3aWxsIGJlIHJldHVybmVkLgotICogQnV0IGluIG90aGVyIGltcGxlbWVudGF0aW9ucyBhIG5ldyBwcm94eSB3aWxsIG5vdCBiZSBjcmVhdGVkIGFuZCBzbyBzYW1lQXMgd2lsbCByZXR1cm4gdHJ1ZS4gCi0gKiAKLSAqIFByaW1pdGl2ZXMgd2lsbCByZXR1cm4gdHJ1ZSBpZiBqdXN0IGVxdWFsIGJlY2F1c2UgaW4gSmF2YSBwcmltaXRpdmVzIGFyZSBpZGVudGljYWwgaWYgdGhlIHNhbWUgdmFsdWUuCi0gKiAKLSAqIEBwYXJhbSBhQmVhblByb3h5Ci0gKiBAcmV0dXJuIHRydWUgaWYgdGhleSBhcmUgaWRlbnRpY2FsIChpLmUuID09KSBhbmQgbm90IGp1c3QgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KTsKLSAgCi0vKioKLSAqIFJldHVybiB0aGUgcmVnaXN0cnkgdGhpcyBwcm94eSB3YXMgY3JlYXRlZCB3aXRoLgotICovCi1wdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKTsKLS8qKgotICogUmV0dXJuIHRoZSBwcm94aWVkIGNsYXNzIG9mIHRoZSBiZWFuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzowMSBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKTsKLQotLyoqCi0gKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJlYW4gaXRzZWxmCi0gKiBUaGlzIGNvdWxkIGJlIGRvbmUgYnkgZmluZGluZyB0aGUgdG9TdHJpbmcoKSBtZXRob2QgYnkgYSBmaW5kTWV0aG9kKCkKLSAqIG9uIHRoZSB0eXBlIHByb3h5LCBldGMuLi4gYnV0IHRvU3RyaW5nKCkgaXMgc28gdWJpcXVpdG91cyB0aGF0IGl0IGlzCi0gKiBleHBsaWNpdGx5IGRlY2xhcmVkIG9uIHRoZSBJQmVhblByb3h5IGludGVyZmFjZQotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MDEgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpOwotLyoqCi0gKiBJcyB0aGlzIGJlYW4gc3RpbGwgdmFsaWQ/IEl0IGNvdWxkIGJlIGludmFsaWQgYmVjYXVzZSBpdAotICogd2FzIHNwZWNpZmljYWxseSByZWxlYXNlZCBidXQgc29tZW9uZSBpcyBzdGlsbCBob2xkaW5nIG9udG8gaXQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmJhYTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUJlYW5Qcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotLyoqCi0gKiBCZWFuIFByb3h5IEZhY3RvcnkgZm9yIGNyZWF0aW5nIGJlYW4gcHJveGllcy4KLSAqIENyZWF0aW9uIG1ldGhvZHMgYXJlIGFjdHVhbGx5IHBhY2thZ2UgcHJvdGVjdGVkLgotICogQWxsIGNyZWF0aW9uIGlzIGRvbmUgdGhyb3VnaCB0aGUgSUJlYW5UeXBlUHJveHkuCi0gKiBTcGVjaWZpYyBmYWN0b3JpZXMgbWF5IGhhdmUgaGVscGVyIG1ldGhvZHMgdGhhdAotICogYWxsb3cgY3JlYXRpb24gb2Ygc3BlY2lmaWMgdHlwZXMsIHN1Y2ggYXMgdGhlCi0gKiBzdGFuZGFyZCBmYWN0b3J5IGFsbG93cyBjcmVhdGlvbiBvZiBCb29sZWFuLCBpbnQncywgZXRjLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MDkgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuUHJveHlGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgZmFjdG9yeSBpcyBiZWluZyB0ZXJtaW5hdGVkLgotCSAqIDxwPgotCSAqIEl0IHNob3VsZCBjbGVhbiB1cCBpdHMgcmVzb3VyY2VzLgotCSAqIEl0IHNob3VsZCBub3QgcmVmZXJlbmNlIGFueSBvdGhlciBmYWN0b3J5IGJlY2F1c2UgdGhleSBjb3VsZCBvZgotCSAqIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBpZiBpdCBpcyBob2xkaW5nIG9udG8gSVJFTUJlYW5Qcm94eSdzLCBpdCBkb2Vzbid0Ci0JICogbmVlZCB0byBjYWxsIHJlbGVhc2Ugb24gdGhlbSBleGNlcHQgaWYgdGhleSBhcmUgY29uc3RhbnRzIGJlY2F1c2UKLQkgKiB0aGUgQmVhblByb3h5RmFjdG9yeSBoYXMgYWxsIG5vbi1jb25zdGFudCBiZWFuIHByb3hpZXMgcmVnaXN0ZXJlZAotCSAqIGFuZCB3aWxsIGNhbGwgdGhlIHJlbGVhc2UgaXRzZWxmLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSB1c2Vycy4gSXQgd2lsbCBiZSBjYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgcHJveHkgcmVnaXN0cnkgd2hlbiBuZWNlc3NhcnkuCi0JICogCi0JICogQHBhcmFtIHdhaXQgPGNvZGU+dHJ1ZTwvY29kZT4gc2hvdWxkIHdhaXQgZm9yIGNvbXBsZXRpb24sIDxjb2RlPmZhbHNlPC9jb2RlPiBkb24ndCBuZWNlc3NhcmlseSB3YWl0LiBGYWxzZSBpcyBqdXN0Ci0JICogYSBzdWdnZXN0aW9uLiBUaGUgZmFjdG9yeSBtYXkgbm90IHBlcm1pdCBub3Qgd2FpdGluZy4gVHJ1ZSBtdXN0IGJlIGhvbm91cmVkIGFuZCBpdCBtdXN0IHdhaXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpOyAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuVHlwZUV4cHJlc3Npb25Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjZkMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBBbiBpbnRlcm5hbCBpbnRlcmZhY2UgZm9yIHRoZSByZWdpc3RyaWVzIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgYmVhbnR5cGUgZXhwcmVzc2lvbiBwcm94eS4KLSAqIE5vdCB0byBiZSBpbXBsZW1lbnRlZCBvciByZWZlcmVuY2VkIGJ5IGN1c3RvbWVycy4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBleHRlbmRzIElQcm94eUJlYW5UeXBlIHsKLQotCS8qKgotCSAqIEFsbG93IHRoZSBleHByZXNzaW9uIHRvIHNldCB0aGUgdHlwZSBuYW1lLgotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2NTc2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgcHJveHkgZm9yIGEgQmVhblR5cGUgKGkuZS4gSmF2YSB0eXBlL2NsYXNzKS4gQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzg6MDYgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5LCBJUHJveHlCZWFuVHlwZSB7Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgbW9zdCBjb21wYXRpYmxlIGNvbnN0cnVjdG9yIChvdXQgb2YgdGhlIGRlY2xhcmVkIGNvbnN0cnVjdG9ycykuIFRoaXMgbWVhbnMgaXQgd2lsbAotCSAqIGZpbmQgZWl0aGVyIGFuIGV4YWN0IG1hdGNoIG9yIGFuIG92ZXJyaWRlIHRoYXQgaXMgY29tcGF0aWJsZSwgZS5nLiBYKE9iamVjdCBqKSBpcyByZXR1cm5lZCB3aGVuIGxvb2tpbmcgd2l0aCBhcmcgdHlwZSBvZiAiamF2YS5sYW5nLlN0cmluZyIuCi0JICogQHBhcmFtIGFyZ3VtZW50VHlwZXMgYXJyYXkgb2YgYXJnIHR5cGVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIChJbiBjYXNlIG9mIG51bGwsIHRoaXMgaXMgdGhlIGRlZmF1bHQgY3Rvciwgc28ganVzdCB1c2UgdGhhdCkuCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICogQHRocm93cyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEZpbmQgdGhlIG1vc3QgY29tcGF0aWJsZSBwdWJsaWMgbWV0aG9kLCBpbmNsdWRpbmcgaW5oZXJpdGllZC4gVGhpcyBtZWFucyBpdCB3aWxsCi0JICogZmluZCBlaXRoZXIgYW4gZXhhY3QgbWF0Y2ggb3IgYW4gb3ZlcnJpZGUgdGhhdCBpcyBjb21wYXRpYmxlLCBlLmcuIHh5eihPYmplY3QgaikgaXMgcmV0dXJuZWQgd2hlbiBsb29raW5nIHdpdGggYXJnIHR5cGUgb2YgImphdmEubGFuZy5TdHJpbmciLgotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIGFyZ3VtZW50VHlwZXMgYXJyYXkgb2YgYXJnIHR5cGVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIChJbiBjYXNlIG9mIG51bGwsIGp1c3QgdXNlIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgc2luY2Ugb25seSBvbmUgaXMgY29tcGF0aWJsZSB0aGVuLgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRDb21wYXRpYmxlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpICB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlcyBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjI1OjA3IFBNKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcyk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIHB1YmxpYyBjb25zdHJ1Y3RvcnMgZm9yIHRoaXMgY2xhc3MuIAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29uc3RydWN0b3IgcHJveGllcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbiBlcnJvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXRDb25zdHJ1Y3RvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgY29uc3RydWN0b3IgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGNvbnN0cnVjdG9yIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZXMgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZGVjbGFyZWQgY29uc3RydWN0b3JzIGZvciB0aGlzIGNsYXNzLiAKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnN0cnVjdG9yIHByb3hpZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXJyb3IuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgb2YgZmllbGQgcHJveGllcy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IG9mIGRlY2xhcmVkIGZpZWxkIHByb3hpZXMuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpZWxkcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGZpZWxkcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5IGdldERlY2xhcmVkRmllbGRQcm94eShTdHJpbmcgZmllbGROYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgbm8gYXJndW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHJldHVybiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMgYXMgc3RyaW5nIGFyZ3VtZW50cwotCSAqIAotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIGFyZ3VtZW50Q2xhc3NOYW1lcwotCSAqIEByZXR1cm4gCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgb25lIGFyZ3VtZW50Ci0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gYXJndW1lbnRDbGFzc05hbWUKLQkgKiBAcmV0dXJuIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudENsYXNzTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgYmVhblR5cGVzIGFzIGFyZ3VtZW50cwotCSAqIAotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIGFyZ3VtZW50VHlwZXMKLQkgKiBAcmV0dXJuIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgcHVibGljIG1ldGhvZHMgZm9yIHRoaXMgY2xhc3MuIAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIHByb3hpZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYW4gZXJyb3IuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgbWV0aG9kIHByb3h5IG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBtZXRob2QgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlcyBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjI1OjA3IFBNKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGlzIGNsYXNzLiAKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBwcm94aWVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFuIGVycm9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW52b2thYmxlIG9uIHRoZSByZWNlaXZlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgbm8gYXJndW1lbnRzLgotCSAqIDxwPgotCSAqIFRoZSBtZXRob2QgcHJveHkgaXMgbm90IHJldHJpZXZlZC4gSW5zdGVhZCB0aGUgbWV0aG9kIHdpbGwgYmUgbG9va2VkIHVwCi0JICogZWFjaCB0aW1lIG9uIHRoZSB2bS4gQmVjYXVzZSBvZiB0aGlzIHRoZXNlIGFyZSBzdWl0YWJsZSBvbmx5IGZvciBvbmUtc2hvdCBpbnZva2F0aW9ucy4gSWYgaXQgaXMgdG8gYmUgaW52b2tlZCBvZnRlbiwgdGhlbiBhIG1ldGhvZCBwcm94eSBzaG91bGQKLQkgKiBiZSByZXRyaWV2ZWQgaW5zdGVhZC4KLQkgKiA8cD4KLQkgKiBUaG91Z2ggdHlwaWNhbCBmb3Igb25lLXNob3QgZGVhbCB0aGUgaW52b2thYmxlIGNhbiBiZSB1c2VkIG92ZXIgYW5kIG92ZXIuIFRoZXJlIGlzIGp1c3Qgb3ZlcmhlYWQgYmVjYXVzZSB0aGUgbWV0aG9kIGlzIGxvb2tlZCB1cCBlYWNoIHRpbWUuIFNvIGEgcmVhc29uYWJsZSBjb21wcm9taXNlCi0JICogd291bGQgYmUgaWYgdXNpbmcgaXQgaW5mcmVxdWVudGx5IG9yIGlzIHVzZWQgY2xvc2VseSB0b2dldGhlciBvbmNlIG9yIHR3aWNlIGl0IGlzIGJldHRlciB0byB1c2UgYSBJbnZva2FibGUgaW5zdGVhZCBvZiBhIG1ldGhvZCBwcm94eS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlLiBUaGlzIHdvbid0IGJlIGtub3duIHVudGlsIHRoZSBhY3R1YWwgaW52b2tlIGlzIGRvbmUuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcmV0dXJuIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgcXVhbGlmaWVkIGNsYXNzIG5hbWVzIGFzIHN0cmluZyBhcmd1bWVudHMKLQkgKiA8cD4KLQkgKiBUaGUgbWV0aG9kIHByb3h5IGlzIG5vdCByZXRyaWV2ZWQuIEluc3RlYWQgdGhlIG1ldGhvZCB3aWxsIGJlIGxvb2tlZCB1cAotCSAqIGVhY2ggdGltZSBvbiB0aGUgdm0uIEJlY2F1c2Ugb2YgdGhpcyB0aGVzZSBhcmUgc3VpdGFibGUgb25seSBmb3Igb25lLXNob3QgaW52b2thdGlvbnMuIElmIGl0IGlzIHRvIGJlIGludm9rZWQgb2Z0ZW4sIHRoZW4gYSBtZXRob2QgcHJveHkgc2hvdWxkCi0JICogYmUgcmV0cmlldmVkIGluc3RlYWQuCi0JICogPHA+Ci0JICogVGhvdWdoIHR5cGljYWwgZm9yIG9uZS1zaG90IGRlYWwgdGhlIGludm9rYWJsZSBjYW4gYmUgdXNlZCBvdmVyIGFuZCBvdmVyLiBUaGVyZSBpcyBqdXN0IG92ZXJoZWFkIGJlY2F1c2UgdGhlIG1ldGhvZCBpcyBsb29rZWQgdXAgZWFjaCB0aW1lLiBTbyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZQotCSAqIHdvdWxkIGJlIGlmIHVzaW5nIGl0IGluZnJlcXVlbnRseSBvciBpcyB1c2VkIGNsb3NlbHkgdG9nZXRoZXIgb25jZSBvciB0d2ljZSBpdCBpcyBiZXR0ZXIgdG8gdXNlIGEgSW52b2thYmxlIGluc3RlYWQgb2YgYSBtZXRob2QgcHJveHkuCi0JICogPHA+Ci0JICogTm90ZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZS4gVGhpcyB3b24ndCBiZSBrbm93biB1bnRpbCB0aGUgYWN0dWFsIGludm9rZSBpcyBkb25lLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIGFyZ3VtZW50Q2xhc3NOYW1lcwotCSAqIEByZXR1cm4gCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBvbmUgYXJndW1lbnQKLQkgKiA8cD4KLQkgKiBUaGUgbWV0aG9kIHByb3h5IGlzIG5vdCByZXRyaWV2ZWQuIEluc3RlYWQgdGhlIG1ldGhvZCB3aWxsIGJlIGxvb2tlZCB1cAotCSAqIGVhY2ggdGltZSBvbiB0aGUgdm0uIEJlY2F1c2Ugb2YgdGhpcyB0aGVzZSBhcmUgc3VpdGFibGUgb25seSBmb3Igb25lLXNob3QgaW52b2thdGlvbnMuIElmIGl0IGlzIHRvIGJlIGludm9rZWQgb2Z0ZW4sIHRoZW4gYSBtZXRob2QgcHJveHkgc2hvdWxkCi0JICogYmUgcmV0cmlldmVkIGluc3RlYWQuCi0JICogPHA+Ci0JICogVGhvdWdoIHR5cGljYWwgZm9yIG9uZS1zaG90IGRlYWwgdGhlIGludm9rYWJsZSBjYW4gYmUgdXNlZCBvdmVyIGFuZCBvdmVyLiBUaGVyZSBpcyBqdXN0IG92ZXJoZWFkIGJlY2F1c2UgdGhlIG1ldGhvZCBpcyBsb29rZWQgdXAgZWFjaCB0aW1lLiBTbyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZQotCSAqIHdvdWxkIGJlIGlmIHVzaW5nIGl0IGluZnJlcXVlbnRseSBvciBpcyB1c2VkIGNsb3NlbHkgdG9nZXRoZXIgb25jZSBvciB0d2ljZSBpdCBpcyBiZXR0ZXIgdG8gdXNlIGEgSW52b2thYmxlIGluc3RlYWQgb2YgYSBtZXRob2QgcHJveHkuCi0JICogPHA+Ci0JICogTm90ZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZS4gVGhpcyB3b24ndCBiZSBrbm93biB1bnRpbCB0aGUgYWN0dWFsIGludm9rZSBpcyBkb25lLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIGFyZ3VtZW50Q2xhc3NOYW1lCi0JICogQHJldHVybiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudENsYXNzTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBvbiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgYmVhblR5cGVzIGFzIGFyZ3VtZW50cwotCSAqIDxwPgotCSAqIFRoZSBtZXRob2QgcHJveHkgaXMgbm90IHJldHJpZXZlZC4gSW5zdGVhZCB0aGUgbWV0aG9kIHdpbGwgYmUgbG9va2VkIHVwCi0JICogZWFjaCB0aW1lIG9uIHRoZSB2bS4gQmVjYXVzZSBvZiB0aGlzIHRoZXNlIGFyZSBzdWl0YWJsZSBvbmx5IGZvciBvbmUtc2hvdCBpbnZva2F0aW9ucy4gSWYgaXQgaXMgdG8gYmUgaW52b2tlZCBvZnRlbiwgdGhlbiBhIG1ldGhvZCBwcm94eSBzaG91bGQKLQkgKiBiZSByZXRyaWV2ZWQgaW5zdGVhZC4KLQkgKiA8cD4KLQkgKiBUaG91Z2ggdHlwaWNhbCBmb3Igb25lLXNob3QgZGVhbCB0aGUgaW52b2thYmxlIGNhbiBiZSB1c2VkIG92ZXIgYW5kIG92ZXIuIFRoZXJlIGlzIGp1c3Qgb3ZlcmhlYWQgYmVjYXVzZSB0aGUgbWV0aG9kIGlzIGxvb2tlZCB1cCBlYWNoIHRpbWUuIFNvIGEgcmVhc29uYWJsZSBjb21wcm9taXNlCi0JICogd291bGQgYmUgaWYgdXNpbmcgaXQgaW5mcmVxdWVudGx5IG9yIGlzIHVzZWQgY2xvc2VseSB0b2dldGhlciBvbmNlIG9yIHR3aWNlIGl0IGlzIGJldHRlciB0byB1c2UgYSBJbnZva2FibGUgaW5zdGVhZCBvZiBhIG1ldGhvZCBwcm94eS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlLiBUaGlzIHdvbid0IGJlIGtub3duIHVudGlsIHRoZSBhY3R1YWwgaW52b2tlIGlzIGRvbmUuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gYXJndW1lbnRUeXBlcwotCSAqIEByZXR1cm4gCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgcHJveHkgb24gdGhlIHJlY2VpdmVyIHdpdGggbm8gYXJndW1lbnRzIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCk7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHR5cGUgcHJveHkgZm9yIHRoZSBzdXBlcmNsYXNzIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFN1cGVyQmVhblR5cGVQcm94eSgpOwotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHdlIGFyZSBwcm94eWluZyBUaGlzIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZS4gRm9yIGFycmF5cyBpdCB3aWxsIHJldHVybiB0aGUgZm9ybWF0OiBbTGNsYXNzbmFtZTsgQ3JlYXRpb24gZGF0ZToKLQkgKiAoMTIvMy85OSAyOjI1OjA3IFBNKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIEFuc3dlciB0aGUgZm9ybWFsIGZvcm1hdCB0eXBlIG5hbWUuIEZvciBub3JtYWwgY2xhc3NlcywgdGhpcyBqdXN0IHRoZSBzYW1lIGFzIGdldFR5cGVOYW1lKCksIGJ1dCBmb3IgYXJyYXlzLCBpdCBpcyBvZiB0aGUgZm9ybWF0IGNsYXNzbmFtZVtdCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb3JtYWxUeXBlTmFtZSgpOwotCi0JLyoqCi0JICogQW5zd2VyIGEgYm9vbGVhbiBhcyB0byB3aGV0aGVyIHdlIGFyZSBhbiBhcnJheSB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKTsKLQotCS8qKgotCSAqIEFuc3dlciBhIGJvb2xlYW4gYXMgdG8gd2hldGhlciB3ZSBhcmUgYSB0eXBlIG9yIGFuIGludGVyZmFjZSBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjI1OjA3IFBNKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBib29sZWFuIGFzIHRvIHdoZXRoZXIgd2UgYXJlIGEgcHJpbWl0aXZlIG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwotCi0JLyoqCi0JICogQW5zd2VyIGEgYm9vbGVhbiBhcyB0byB3aGV0aGVyIHdlIGFyZSBhIGtpbmQgb2YgdGhlIGFyZ3VtZW50IFdlIGNhbiBlaXRoZXIgYmUgaXQsIGluaGVyaXQgZnJvbSBpdCwgb3IgaW1wbGVtZW50IGl0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNLaW5kT2YoSUJlYW5UeXBlUHJveHkgYUJlYW5Qcm94eVR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDI6MjU6MDcgUE0pCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB0eXBlIHVzaW5nIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcgdG8gY3JlYXRlIHRoZSBwcm94eS4gQ2xhc3NDYXN0RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgaW5pdHN0cmluZyBkb2Vzbid0Ci0JICogcmVzdWx0IGluIGFuIG9iamVjdCBjb21wYXRpYmxlIHdpdGggdGhpcyB0eXBlLiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZCBjb3JyZWN0bHkuCi0JICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNTowNyBQTSkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleGNlcHRpb24gbWVzc2FnZSB0aGF0IGhhcHBlbmVkIHdoZW4gdHJ5aW5nIHRvIGZpbmQgdGhpcyBiZWFuIHR5cGUuIENsYXNzIG5vdCBmb3VuZCBpcyBub3Qgc3VjaCBhbiBleGNlcHRpb24uIEluIHRoYXQgY2FzZSB0aGUgYmVhbgotCSAqIHR5cGUgd2lsbCBiZSByZXR1cm5lZCBhcyBhIG51bGwgaW5zdGVhZC4gQW4gZXhhbXBsZSBvZiBzdWNoIGlzIGFuIGluaXRpYWxpemF0aW9uIGVycm9yIGR1cmluZyBsb2FkaW5nIHRoZSBjbGFzcywgaS5lLiBpdCB3YXMgZm91bmQgYnV0IHNvbWUKLQkgKiBzdGF0aWMgZmFpbGVkIHRvIGluaXRpYWxpemUuCi0JICogCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gaW5pdGlhbGl6YXRpb24gZXJyb3IuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTlmYWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIEJlYW5UeXBlUHJveHkncy4KLSAqIFRoaXMgaXMgYSBjb21tb24gdGFnIGludGVyZmFjZSBzbyB0aGF0Ci0gKiB0aGUgZmFjdG9yeSBjYW4gYmUgcmVnaXN0ZXJlZC4gQnV0IGVhY2gKLSAqIFZNIHJlcXVpcmVzIGEgZGlmZmVyZW50IGludGVyZmFjZSB0aGF0Ci0gKiBleHRlbmRzIHRoaXMgaW50ZXJmYWNlLiBUaGF0IGV4dGVuZGVkCi0gKiBpbnRlcmZhY2UgaXMgd2hhdCBtdXN0IGJlIGltcGxlbWVudGVkIGluCi0gKiBlYWNoIFZNLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMjoyNjowMCBQTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5UeXBlUHJveHlGYWN0b3J5IGV4dGVuZHMgSUJlYW5Qcm94eUZhY3RvcnkgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQm9vbGVhbkJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUJvb2xlYW5CZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzNzgxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQm9vbGVhbkJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElCb29sZWFuQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotCi0KLS8qKgotICogT3B0aW1pemVkIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIEJvb2xlYW4gcHJveGllcyB0aGF0Ci0gKiBhbGxvd3MgdGhlIElERSBWTSB0byBnZXQgdGhlIGJvb2xlYW4gdmFsdWUgZWFzaWx5Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTg6MjIgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCb29sZWFuQmVhblByb3h5IGV4dGVuZHMgSUJlYW5Qcm94eSB7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJveGllZCBib29sZWFuIGFzIGEgYm9vbGVhbiB0aGF0IHRoZSBJREUgY2FuIHVzZQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjU4OjMyIEFNKQotICovCi1ib29sZWFuIGJvb2xlYW5WYWx1ZSgpOwotQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDYWxsYmFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTk0YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElDYWxsYmFjay5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogVXNlcnMgd2lsbCBjcmVhdGUgYSBjYWxsYmFjayBvZiB0aGlzIGludGVyZmFjZQotICogYW5kIHJlZ2lzdGVyIGl0IHdpdGggdGhlIGZhY3RvcnkuIFRoZW4gd2hlbiBldmVyCi0gKiB0aGUgY2FsbGJhY2sgb2NjdXJzLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCi0gKiB3aXRoIGRhdGEgZnJvbSB0aGUgcHJveHkuIEl0IGNhbiByZXR1cm4gYSB2YWx1ZSB0b28uCi0gKgotICogT3IgYW4gSW5wdXRTdHJlYW0gY2FuIGJlIHJldHVybmVkIHRvIHN1cHBseSB0aGUgZGF0YS4KLSAqICAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYWxsYmFjayB7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgY2FsbGJhY2suCi0JICogSXQgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNhbGxiYWNrCi0JICogb2NjdXJyZWQuIEl0IHdpbGwgYmUgb24gaXRzIG93biB0aHJlYWQuCi0JICogQSBwYXJ0aWN1bGFyIHRocmVhZCBjYW5ub3QgYmUgcmVxdWVzdGVkLgotCSAqIDxwPgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHJldHVybi4gVGhpcyBpcyAKLQkgKiBiZWNhdXNlIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBiZSBjb21wbGV0ZWQKLQkgKiB1bnRpbCBpdCBpcyByZXR1cm5lZCwgYW5kIHRoZSBwcm9jZXNzIHdpbGwKLQkgKiBub3QgY29udGludWUgb24gdGhlIHJlbW90ZSB2bSB1bnRpbCBpdCBpcwotCSAqIHJldHVybmVkLgotCSAqIDxwPgotCSAqIFRoZSB2YWx1ZSByZXR1cm5lZCBtdXN0IGVpdGhlciBiZSBhbgotCSAqIElCZWFuUHJveHkgb3IgSUJlYW5Qcm94eVtdLiBJdCBpcyB0eXBlZAotCSAqIHRvIE9iamVjdCB0byBhbGxvdyBlaXRoZXIgb25lLCBidXQgaXQKLQkgKiB3aWxsIGJlIGNoZWNrZWQsIGFuZCBpZiBpdCBpc24ndCwgdGhlbgotCSAqIG51bGwgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIHRvIHRoZQotCSAqIGNhbGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnSUQKLQkgKiBAcGFyYW0gcGFybSBUaGUgYmVhbnByb3h5IC0gd2lsbCBub3QgYmUgbnVsbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBJQmVhblByb3h5IHBhcm0pOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGNhbGxiYWNrLgotCSAqIEl0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBjYWxsYmFjawotCSAqIG9jY3VycmVkLiBJdCB3aWxsIGJlIG9uIGl0cyBvd24gdGhyZWFkLgotCSAqIEEgcGFydGljdWxhciB0aHJlYWQgY2Fubm90IGJlIHJlcXVlc3RlZC4KLQkgKiA8cD4KLQkgKiBUaGUgcGFybXMgd2lsbCBiZSBhbiBhcnJheSBvZiBJQmVhblByb3h5cywKLQkgKiBvciBhbiBlbnRyeSBjb3VsZCBiZSBhbm90aGVyIGFycmF5IG9mIElCZWFuUHJveHlzLAotCSAqIG9yIG51bGwgaWYgbnVsbCB3YXMgc2VudCB0byBjYWxsQmFja1dpdGhQYXJtcy4KLQkgKiBUaGUgZmluYWwgY29tcG9uZW50IG9mIGFueSBlbnRyeSB3aWxsIGJlIGFuCi0JICogSUJlYW5Qcm94eS4gSXQgaXMgdXAgdG8gdGhlIGRldmVsb3BlcnMgdG8KLQkgKiBhZ3JlZSBvbiB0aGUgZm9ybWF0IG9mIHRoZSBwYXJtcy4KLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gTVVTVCByZXR1cm4uIFRoaXMgaXMgCi0JICogYmVjYXVzZSB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY29tcGxldGVkCi0JICogdW50aWwgaXQgaXMgcmV0dXJuZWQsIGFuZCB0aGUgcHJvY2VzcyB3aWxsCi0JICogbm90IGNvbnRpbnVlIG9uIHRoZSByZW1vdGUgdm0gdW50aWwgaXQgaXMKLQkgKiByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsdWUgcmV0dXJuZWQgbXVzdCBlaXRoZXIgYmUgYW4KLQkgKiBJQmVhblByb3h5IG9yIElCZWFuUHJveHlbXS4gSXQgaXMgdHlwZWQKLQkgKiB0byBPYmplY3QgdG8gYWxsb3cgZWl0aGVyIG9uZSwgYnV0IGl0Ci0JICogd2lsbCBiZSBjaGVja2VkLCBhbmQgaWYgaXQgaXNuJ3QsIHRoZW4KLQkgKiBudWxsIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCB0byB0aGUKLQkgKiBjYWxsZXIuCi0JICogCi0JICogQHBhcmFtIG1zZ0lECi0JICogQHBhcmFtIHBhcm1zCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2tIYW5kbGVyI2NhbGxiYWNrV2l0aFBhcm1zKGludCwgaW50LCBPYmplY3RbXSkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyk7Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGNhbGxiYWNrLgotCSAqIEl0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBjYWxsYmFjawotCSAqIG9jY3VycmVkLiBJdCB3aWxsIGJlIG9uIGl0cyBvd24gdGhyZWFkLgotCSAqIEEgcGFydGljdWxhciB0aHJlYWQgY2Fubm90IGJlIHJlcXVlc3RlZC4KLQkgKiA8cD4KLQkgKiBUaGUgcGFybSB3aWxsIGJlIGFuIG9iamVjdC4gVGhpcyBvY2N1cnMKLQkgKiBpZiByZW1vdGUgdm0ganVzdCB3YW50ZWQgdG8gc2VuZCBzb21lIG9iamVjdHMuCi0JICogVGhleSB3aWxsIG5vdCBiZSBwcm94aWVzLiBJdCBpcyByZWNvbW1lbmRlZAotCSAqIHRoYXQgdGhpcyBiZSB1c2VkIG9ubHkgZm9yIHNtYWxsIGl0ZW1zLiBGb3IKLQkgKiBhbnl0aGluZyBsYXJnZSwgdGhlIGNhbGxiYWNrU3RyZWFtIHNob3VsZCBiZQotCSAqIHVzZWQgaW5zdGVhZC4KLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gTVVTVCByZXR1cm4uIFRoaXMgaXMgCi0JICogYmVjYXVzZSB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY29tcGxldGVkCi0JICogdW50aWwgaXQgaXMgcmV0dXJuZWQsIGFuZCB0aGUgcHJvY2VzcyB3aWxsCi0JICogbm90IGNvbnRpbnVlIG9uIHRoZSByZW1vdGUgdm0gdW50aWwgaXQgaXMKLQkgKiByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsdWUgcmV0dXJuZWQgbXVzdCBlaXRoZXIgYmUgYW4KLQkgKiBJQmVhblByb3h5IG9yIElCZWFuUHJveHlbXS4gSXQgaXMgdHlwZWQKLQkgKiB0byBPYmplY3QgdG8gYWxsb3cgZWl0aGVyIG9uZSwgYnV0IGl0Ci0JICogd2lsbCBiZSBjaGVja2VkLCBhbmQgaWYgaXQgaXNuJ3QsIHRoZW4KLQkgKiBudWxsIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCB0byB0aGUKLQkgKiBjYWxsZXIuCi0JICogCi0JICogQHBhcmFtIG1zZ0lECi0JICogQHBhcmFtIHBhcm0gVGhlIHBhcm0gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCB3YXMgc2VudC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNlZSBJQ2FsbGJhY2sjY2FsbGVkQmFja1N0cmVhbShpbnQsIElucHV0U3RyZWFtKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIE9iamVjdCBwYXJtKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBjYWxsYmFjay4KLQkgKiBJdCB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgY2FsbGJhY2sgc3RyZWFtCi0JICogb2NjdXJyZWQuIEl0IHdpbGwgYmUgb24gaXRzIG93biB0aHJlYWQuCi0JICogQSBwYXJ0aWN1bGFyIHRocmVhZCBjYW5ub3QgYmUgcmVxdWVzdGVkLgotCSAqIDxwPgotCSAqIFRoZSBjYWxsYmFjayBzaG91bGQgY29udGludWUgdG8gcmVhZCBmcm9tIHRoZSBJbnB1dFN0cmVhbQotCSAqIHVudGlsIGl0IHJldHVybnMgLTEgaW5kaWNhdGluZyBubyBtb3JlIGRhdGEuIFRoZSBzdHJlYW0gY2FuCi0JICogYmUgY2xvc2VkLiBJbiB0aGF0IGNhc2UgdGhlIG5leHQgdGltZSB0aGUgcmVtb3RlIHZtIHdhbnRzIHRvCi0JICogc2VuZCBkYXRhIGl0IHdpbGwgZmlyc3QgY2hlY2sgdGhhdCB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBjbG9zZWQuCi0JICogSWYgaXQgaGFzLCBpdCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiB0aGF0IHNpZGUuCi0JICogPHA+Ci0JICogVGhlIGltcGxlbWVudGF0aW9uIE1VU1QgcmV0dXJuLiBUaGlzIGlzIAotCSAqIGJlY2F1c2UgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNvbXBsZXRlZAotCSAqIHVudGlsIGl0IGlzIHJldHVybmVkLCBhbmQgdGhlIHByb2Nlc3Mgd2lsbAotCSAqIG5vdCBjb250aW51ZSBvbiB0aGUgcmVtb3RlIHZtIHVudGlsIGl0IGlzCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIG1zZ0lECi0JICogQHBhcmFtIGlzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGlzKTsJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2FsbGJhY2tSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNhbGxiYWNrUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiM2E4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2FsbGJhY2tSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElDYWxsYmFja1JlZ2lzdHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IGZvciBoYW5kbGluZyBjYWxsYmFja3MuCi0gKiBJdCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGFuZCBkZXJlZ2lzdGVyIGNhbGxiYWNrcy4KLSAqCi0gKiBDYWxsYmFja3MgYXJlIHNwbGl0IGludG8gdHdvIHBhcnRzOgotICogMSkgQ2FsbGJhY2tQcm94eS4gVGhpcyBpcyBhbnkgcHJveHkgdGhhdCBpbXBsZW1lbnRzIHRoZQotICogICAgaW50ZXJmYWNlIElDYWxsYmFjay4gKE9yIHRoZQotICogICAgZXF1aXZhbGVudCBvbmUgaWYgbm90IHN0YW5kYXJkIHJlbW90ZSB2bSkuIFRoaXMgaXMgdGhlCi0gKiAgICBvYmplY3Qgd2hpY2ggd2lsbCBhY3R1YWxseSBzdWJtaXQgdGhlIGNhbGxiYWNrIG9uIHRoZSByZW1vdGUKLSAqICAgIHZtLiBGb3IgZXhhbXBsZSwgYW55IGtpbmQgb2YgbGlzdGVuZXIuIEl0IHdvdWxkIGltcGxlbWVudAotICogICAgYm90aCB0aGUgSUNhbGxiYWNrIGFuZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgaW50ZXJmYWNlLgotICogICAgVGhlbiB3aGVuIGl0IGdldHMgY2FsbGVkIGFzIGEgbGlzdGVuZXIsIGl0IHdpbGwgcmVkaXJlY3QgdGhlCi0gKiAgICBjYWxsIHRvIHRoZSByZW1vdGUgdm0gY2FsbGJhY2sgaGFuZGxlciB0byBzdWJtaXQgaXQgdG8gdGhlCi0gKiAgICBwcm94eSBzaWRlLgotICogMikgQ2FsbGJhY2suIFRoaXMgaXMgb24gdGhpcyBzaWRlIGFuZCBpcyB0aGUgb2JqZWN0IHRoYXQgd2lsbAotICogICAgYmUgbm90aWZpZWQgb2YgdGhlIGNhbGxiYWNrIGFuZCB3aWxsIGV4ZWN1dGUgYXQgdGhhdCB0aW1lLgotICoKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElDYWxsYmFja1JlZ2lzdHJ5IHsKLQkKLQkvKioKLQkgKiBSZWdpc3RlciB0aGlzIGNhbGxiYWNrIHByb3h5IGFuZCB0aGlzIGNhbGxiYWNrLgotCSAqCi0JICogVGhlIHByb2Nlc3MgaXMgdG86Ci0JICogMSkgQ3JlYXRlIHRoZSBjYWxsYmFja1Byb3h5IGFuZCB0aGUgY2FsbGJhY2sKLQkgKiAyKSByZWdpc3RlciB0aGVzZSB3aXRoIHJlZ2lzdGVyQ2FsbGJhY2sKLQkgKiAzKSBOb3cgY29ubmVjdCB0aGUgY2FsbGJhY2tQcm94eSBzbyB0aGF0IGl0IHdpbGwgc3RhcnQgbm90aWZ5aW5nLgotCSAqICAgIEZvciBleGFtcGxlLCBpZiBpdCBpcyBhIG5vcm1hbCBsaXN0ZW5lciwgYXQgdGhpcyB0aW1lIGRvIHRoZQotCSAqICAgIGFkZExpc3RlbmVyIGNhbGwgdG8gYWRkIHRoZSBjYWxsYmFja1Byb3h5IHRvIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QuCi0JICogICAgWW91IGRvbid0IHdhbnQgaXQgdG8gc3RhcnQgbm90aWZ5aW5nIGJlZm9yZSByZWdpc3RlcmluZyBpdC4KLQkgKiAgICAoVGhvdWdoIGl0IHdvbid0IGh1c3QgaXQsIGl0IHdpbGwganVzdCByZXR1cm4gbnVsbCkuCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5IGNhbGxiYWNrUHJveHksIElDYWxsYmFjayBjYik7Ci0JCi0JLyoqCi0JICogU2FtZSBhcyB7QGxpbmsgSUNhbGxiYWNrUmVnaXN0cnkjcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5LCBJQ2FsbGJhY2spIHJlZ2lzdGVyQ2FsbGJhY2t9IGV4Y2VwdCB0aGF0Ci0JICogaXQgaXMgZGVmZXJyZWQgb2ZmIGludG8gYW4gZXhwcmVzc2lvbi4KLQkgKiAgCi0JICogQHBhcmFtIGNhbGxiYWNrUHJveHkKLQkgKiBAcGFyYW0gY2IKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soSVByb3h5IGNhbGxiYWNrUHJveHksIElDYWxsYmFjayBjYiwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0JCi0JLyoqCi0JICogRGVyZWdpc3RlciB0aGUgY2FsbGJhY2sgcHJveHkuIFRoaXMgd2lsbCByZW1vdmUgaXQgZnJvbSB0aGUKLQkgKiByZWdpc3RyeSBhbmQgcmVsZWFzZSB0aGUgY2FsbGJhY2suCi0JICoKLQkgKiBUaGUgcHJvY2VzcyBpcyB0bzoKLQkgKiAxKSBTdG9wIHRoZSBwcm94eSBmcm9tIGxpc3RlbmluZyBzbyBpdCBubyBub3RpZmllcy4gVGhpcyBpcyB1c3VhbGx5Ci0JICogICAgcmVtb3ZlTGlzdGVuZXIgb24gdGhlIHJlbW90ZSB2bS4gWW91IGRvbid0IHdhbnQgaXQgbm90aWZ5aW5nCi0JICogICAgYWZ0ZXIgaXQgZGVyZWdpc3RlciAodGhvdWdoIGl0IHdvbid0IGh1cnQgaXQsIGl0IHdpbGwganVzdCByZXR1cm4gbnVsbCkuCi0JICogMikgZGVyZWdpc3RlciBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyQ2FsbGJhY2soSUJlYW5Qcm94eSBjYWxsYmFja1Byb3h5KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDaGFyYWN0ZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDaGFyYWN0ZXJCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhNmI0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ2hhcmFjdGVyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUNoYXJhY3RlckJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIE9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBjaGFyYWN0ZXIgcHJveGllcyB0aGF0Ci0gKiBhbGxvd3MgdGhlIElERSBWTSB0byBnZXQgdGhlIGNoYXJhY3RlciB2YWx1ZSBlYXNpbHkKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1ODoyMiBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNoYXJhY3RlckJlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHksIElOdW1iZXJCZWFuUHJveHkgewotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3hpZWQgY2hhcmFjdGVyIGFzIGEgY2hhciB0aGF0IHRoZSBJREUgY2FuIHVzZQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjU4OjMyIEFNKQotICovCi1jaGFyIGNoYXJWYWx1ZSgpOwotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3hpZWQgY2hhcmFjdGVyIGFzIGEgQ2hhcmFjdGVyIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTg6MzIgQU0pCi0gKi8KLUNoYXJhY3RlciBjaGFyYWN0ZXJWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxMzY1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotOwotLyoqCi0gKiBDb250cm9scyBjb250cmlidXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWxsb3dzIHRoZSBjbGFzc3BhdGgKLSAqIHRvIGJlIG1vZGlmaWVkIGluIGFuIGFjY2VwdGFibGUgbWFubmVyLCBzbyB0aGF0IGR1cGxpY2F0ZXMgYXJlbid0IGluCi0gKiB0aGUgcGF0aCwgb3IgYWRkaW5nIGEgcHJvamVjdCB0byB0aGUgcGF0aCBpbiBhbiBhY2NlcHRhYmxlIHdheS4KLSAqIAotICogSWYgb25seSBkZWxldGluZyBvciBtb3ZpbmcgZW50cmllcyBmcm9tIHRoZSBjbGFzc3BhdGgsIHRoYXQgY2FuIGJlIGRvbmUgZGlyZWN0bHkKLSAqIHRvIHRoZSBjbGFzc3BhdGggbGlzdCBwYXNzZWQgaW4uIEFkZGluZyBlbnRyaWVzIG5lZWRzIHRvIGdvIHRocm91Z2ggdGhpcwotICogY29udHJvbGxlci4KLSAqIAotICogVGhpcyBpcyBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSBkZXZlbG9wZXJzIG9mIHByb3h5IGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLSAqIAotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciB7Ci0JCi0JLyoqCi0JICogQXBwZW5kIHRvIHRoZSB1c2VyIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFTkRfVVNFUl9DTEFTU1BBVEggPSAwOwotCQotCS8qKgotCSAqIFByZXBlbmQgdG8gdGhlIHVzZXIgY2xhc3NwYXRoLiBUaGlzIHdpbGwgc3RpY2sgaXQgaW4gcG9zaXRpb24gMC4gSWYKLQkgKiBhbm90aGVyIHByZXBlbmQgY29tZXMgYWxvbmcsIGl0IHdpbGwgZ28gaW4gcG9zIDAgYW5kIHRoaXMgb25lIHdpbGwgbW92ZSB0byAxLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVBFTkRfVVNFUl9DTEFTU1BBVEggPSAxOwotCQotCi0JLyoqCi0JICogQXBwZW5kIHRvIHRoZSBib290IGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFTkRfQk9PVF9DTEFTU1BBVEggPSAyOwotCi0JLyoqCi0JICogUHJlcGVuZCB0byB0aGUgYm9vdCBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFUEVORF9CT09UX0NMQVNTUEFUSCA9IDM7Ci0JCi0JLyoqCi0JICogQXBwZW5kIGEgZm9sZGVyIHRvIHRoZSBqYXZhLmxpYnJhcnkucGF0aCAoZm9yIHRoaW5ncyBsaWtlCi0JICogZGxsJ3MpLiBUaGlzIHNob3VsZCByZXN1bHQgaW4gYSBmb2xkZXIgb25seS4KLQkgKiBUaGUgbmxzTG9jYWxpemUgZmxhZyBjb250cmlidXRlIHZpYSBwbHVnaW4gd2lsbCBiZQotCSAqIGlnbm9yZWQgZm9yIHRoaXMgdHlwZSBmbGFnLiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEggPSA0OwotCQotCS8qKgotCSAqIEdldCB0aGUgamF2YSBwcm9qZWN0IHRoYXQgd2UgYXJlIGNvbnRyaWJ1dGluZyBmb3IuCi0JICogCi0JICogQHJldHVybiBqYXZhcHJvamVjdCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCQkKLQkvKioKLQkgKiBBZGQgYSBwcm9qZWN0IHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQWRkIGFuIGV4dGVybmFsIGZpbGUvZm9sZGVyIHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGgKLQkgKiBAcGFyYW0gdHlwZUZsYWcgT25lIG9mIDxjb2RlPkFQUEVORF9VU0VSX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPkFQUEVORF9CT09UX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPlBSRVBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCBvciA8Y29kZT5BUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg8L2NvZGU+LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBjb250cmlidXRlQ2xhc3NwYXRoKFVSTCwgaW50KSBpbnN0ZWFkLgotCSAqIEBzZWUgI2NvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMLCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChTdHJpbmcgY2xhc3NwYXRoLCBpbnQgdHlwZUZsYWcpOwotCQotCS8qKgotCSAqIEFkZCBhbiBleHRlcm5hbCBmaWxlL2ZvbGRlciB0byB0aGUgY2xhc3NwYXRoLiBUaGUgdHlwZSBmbGFnIHRlbGxzIHdoZXJlIHRvIGFkZCBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NwYXRoVVJMCi0JICogQHBhcmFtIHR5cGVGbGFnIE9uZSBvZiA8Y29kZT5BUFBFTkRfVVNFUl9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5BUFBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5QUkVQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgb3IgPGNvZGU+QVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKFVSTCBjbGFzc3BhdGhVUkwsIGludCB0eXBlRmxhZyk7CQotCQotCS8qKgotCSAqIEFkZCBhbiBleHRlcm5hbCBmaWxlcy9mb2xkZXJzIHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGhzCi0JICogQHBhcmFtIHR5cGVGbGFnIE9uZSBvZiA8Y29kZT5BUFBFTkRfVVNFUl9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5BUFBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCA8Y29kZT5QUkVQRU5EX0JPT1RfQ0xBU1NQQVRIPC9jb2RlPiwgb3IgPGNvZGU+QVBQRU5EX0pBVkFfTElCUkFSWV9QQVRIPC9jb2RlPi4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY29udHJpYnV0ZUNsYXNzcGF0aChVUkxbXSwgaW50KSBpbnN0ZWFkLgotCSAqIEBzZWUgI2NvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMW10sIGludCkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKFN0cmluZ1tdIGNsYXNzcGF0aHMsIGludCB0eXBlRmxhZyk7CQotCi0JLyoqCi0JICogQWRkIGFuIGV4dGVybmFsIGZpbGVzL2ZvbGRlcnMgdG8gdGhlIGNsYXNzcGF0aC4gVGhlIHR5cGUgZmxhZyB0ZWxscyB3aGVyZSB0byBhZGQgaXQuCi0JICogCi0JICogQHBhcmFtIGNsYXNzcGF0aFVSTHMKLQkgKiBAcGFyYW0gdHlwZUZsYWcgT25lIG9mIDxjb2RlPkFQUEVORF9VU0VSX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPkFQUEVORF9CT09UX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPlBSRVBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCBvciA8Y29kZT5BUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg8L2NvZGU+LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMW10gY2xhc3NwYXRoVVJMcywgaW50IHR5cGVGbGFnKTsJCi0JCi0JLyoqCi0JICogQWRkIGEgZmlsZS9mb2xkZXIgZnJvbSBhIHBsdWdpbiBpbiB0aGUgcnVubmluZyBFY2xpcHNlIHRvIHRoZSBjbGFzc3BhdGguIFRoZSB0eXBlIGZsYWcgdGVsbHMgd2hlcmUgdG8gYWRkIGl0LgotCSAqIEluIGRldmVsb3BtZW50IG1vZGUgaXQgd2lsbCBmaW5kIHRoZSBiaW4gY2xhc3MgZmlsZXMgaW5zdGVhZCBpZiBwcm94eS5qYXJzIGlzIHNldHVwIGNvcnJlY3RseS4KLQkgKiA8cD4KLQkgKiBJZiBubHNMb2NhbGl6ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiBpdCB3aWxsIGFsc28gc2VhcmNoIHRocm91Z2ggdGhlIGZyYWdtZW50cyBpbiB0aGlzIG1hbm5lcjoKLQkgKiAoTm90ZTogaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGl0IHdpbGwgc3RpbGwgc2VhcmNoIGluIHRoZSBmcmFnbWVudHMsIGJ1dCBpdCB3aWxsIG9ubHkgcmV0dXJuIHRoZSBmaXJzdCBmaWxlIGZvdW5kIHRoYXQgbWF0Y2hlcy4KLQkgKiA8cD4KLQkgKiBUbyBmaW5kIHRoZSBmaWxlcyBpbiB0aGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluIHRoZSBydW50aW1lIHBhdGggKGkuZS4gbGlicmFyaWVzKSwgaXQgd2lsbCBuZWVkIHRvIHVzZSBhIHN1ZmZpeCwKLQkgKiBUaGlzIGlzIGJlY2F1c2UgdGhlIEpEVCB3aWxsIGdldCBjb25mdXNlZCBpZiBhIHJ1bnRpbWUgamFyIGluIGEgZnJhZ21lbnQgaGFzIHRoZSBzYW1lIG5hbWUKLQkgKiBhcyBhIHJ1bnRpbWUgamFyIGluIHRoZSBtYWluIHBsdWdpbi4gU28gd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBzZWFyY2ggcGF0dGVybjoKLQkgKiAKLQkgKiAxKSBGaW5kIGluIHRoZSBwbHVnaW4gYW5kIGFsbCBvZiB0aGUgZnJhZ21lbnRzIHRob3NlIHRoYXQgbWF0Y2ggdGhlIG5hbWUgZXhhY3RseQotCSAqIDIpIEZpbmQgaW4gYWxsIG9mIHRoZSBmcmFnbWVudHMsIGluIHRoZWlyIHJ1bnRpbWUgcGF0aCAoPGxpYnJhcnk+IHN0bXQpLCB0aG9zZSB0aGF0IG1hdGNoIHRoZSBuYW1lIAotCSAqICAgIGJ1dCBoYXZlIGEgc3VmZml4IHRoZSBzYW1lIGFzIHRoZSB1bmlxdWVpZCBvZiB0aGUgZnJhZ21lbnQgKHByZWNlZWRlZCBieSBhIHBlcmlvZCkuIFRoaXMgaXMgc28gdGhhdCBpdCBjYW4gYmUgZWFzaWx5Ci0JICogICAgZm91bmQgYnV0IHlldCBiZSB1bmlxdWUgaW4gdGhlIGVudGlyZSBsaXN0IG9mIGZyYWdtZW50cy4gRm9yIGV4YW1wbGUgaWYgbG9va2luZyBmb3IgInJ1bnRpbWUveHl6LmphciIKLQkgKiAgICBhbmQgd2UgaGF2ZSBmcmFnbWVudCAiYS5iLmMuZC5mcmFnIiwgdGhlbiBpbiB0aGUgcnVudGltZSBwYXRoIHdlIHdpbGwgbG9vayBmb3IgdGhlIGZpbGUKLQkgKiAgICAicnVudGltZS94eXouYS5iLmMuZC5mcmFnLmphciIuCi0JICogPHA+Ci0JICogSWYgdGhlIGZpbGVzIGluIHRoZSBmcmFnbWVudHMgYXJlIG5vdCBpbiB0aGUgZnJhZ21lbnRzIGxpYnJhcnkgcGF0aCB0aGVuIGl0IGNhbiBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgaW4gdGhlIHBsdWdpbi4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbmxzIHdoZXJlIHRoZSBubHMgZm9yIHRoZSBmaWxlbmFtZSB3aWxsIGJlIGluIG9uZSBvciBtb3JlIG9mIHRoZSBmcmFnbWVudHMgb2YgdGhlIHBsdWdpbi4JIAkgCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIGl0IGNhbiBiZSBmb3VuZCBpbi4KLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFBhdGggdG8gZmlsZS9mb2xkZXIgcmVsYXRpdmUgdG8gYnVuZGxlIHJvb3QuIElmIGl0IGlzIDxjb2RlPkFQUEVORF9KQVZBX0xJQlJBUllfUEFUSDwvY29kZT4sIGl0IHNob3VsZCBiZSBmb2xkZXIgYW5kIG5sc0xvY2FsaXplIHdpbGwgYmUgaWdub3JlZC4KLQkgKiBAcGFyYW0gdHlwZUZsYWcgT25lIG9mIDxjb2RlPkFQUEVORF9VU0VSX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPkFQUEVORF9CT09UX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPlBSRVBFTkRfQk9PVF9DTEFTU1BBVEg8L2NvZGU+LCBvciA8Y29kZT5BUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg8L2NvZGU+LgotCSAqIEBwYXJhbSBubHNMb2NhbGl6ZSBUaGUgdXN1YWwgdmFsdWUgc2hvdWxkIGJlIDxjb2RlPmZhbHNlPC9jb2RlPi4gVXNlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNob3VsZCBsb29rIHRocm91Z2ggZnJhZ21lbnRzIHRvIGdhdGhlciB0aGVtIGFsbCBhcyBkZXNjcmliZWQgaW4gdGhpcyBtZXRob2RzIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHJlbGF0aXZlUGF0aCwgaW50IHR5cGVGbGFnLCBib29sZWFuIG5sc0xvY2FsaXplKTsJCi0JCi0JLyoqCi0JICogU2FtZSBhcyBjb250cmlidXRlQ2xhc3NwYXRoKEJ1bmRsZSwgU3RyaW5nLCBpbnQsIGJvb2xlYW4pIGV4Y2VwdCBhbiBJUGF0aCBjYW4gYmUgdXNlZCBhcyB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotCSAqIEBwYXJhbSB0eXBlRmxhZwotCSAqIEBwYXJhbSBubHNMb2NhbGl6ZQotCSAqIAotCSAqIEBzZWUgI2NvbnRyaWJ1dGVDbGFzc3BhdGgoQnVuZGxlLCBTdHJpbmcsIGludCwgYm9vbGVhbikKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKEJ1bmRsZSBidW5kbGUsIElQYXRoIHJlbGF0aXZlUGF0aCwgaW50IHR5cGVGbGFnLCBib29sZWFuIG5sc0xvY2FsaXplKTsJCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmMzMWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci0gCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIGluaXRpYWxpemUgbWV0aG9kLiBJdCBoYXMgaW5mbwotICogdGhhdCBtYXkgYmUgbmVlZGVkIGJ5IHRoZSBjb250cmlidXRvci4gSXQgbWF5IGJlIHNhdmVkIGZvciBsYXRlciB1c2UsIGJ1dCBpZiBjbGFzc3BhdGhzIGhhdmUgY2hhbmdlZCwKLSAqIGl0IHdvbid0IGJlIGtlcHQgdXAgdG8gZGF0ZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciNpbml0aWFsaXplKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbykKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyB7Ci0JLyoqCi0JICogR2V0IHRoZSBqYXZhIHByb2plY3QgdGhhdCB3ZSBhcmUgY29udHJpYnV0aW5nIGZvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmFwcm9qZWN0LCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXAgb2YgY29udGFpbmVycyAodGhlIGtleSkgdGhhdCBhcmUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nCi0JICogaWYgdGhlIGNvbnRhaW5lciBpbXBsaW1lbnRzIGEgY29udHJpYnV0b3IgaW50ZXJmYWNlLgotCSAqIDxwPgotCSAqIFZhbHVlIHdpbGwgPGNvZGU+Qm9vbGVhbjwvY29kZT4gYW5kIHdpbGwgYmUgdHJ1ZSBpZiBjb250YWluZXIgd2FzIHZpc2libGUgdG8gdG9wLWxldmVsIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBNYXAgb2YgY29udGFpbmVycy4gS2V5cyBvZiB0eXBlIElDbGFzc3BhdGhDb250YWluZXIuIEVtcHR5IGlmIGxhdW5jaCBub3QgaW4gYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29udGFpbmVycygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwIG9mIGNvbnRhaW5lciBpZHMgKHRoZSBrZXkpIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBjbGFzc3BhdGguCi0JICogPHA+Ci0JICogVmFsdWUgd2lsbCA8Y29kZT5Cb29sZWFuPC9jb2RlPiBhbmQgd2lsbCBiZSB0cnVlIGlmIGNvbnRhaW5lciBpZCB3YXMgdmlzaWJsZSB0byB0b3AtbGV2ZWwgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIG1hcCBvZiBjb250YWluZXIgaWRzLiBLZXlzIG9mIHR5cGUgU3RyaW5nLiBFbXB0eSBpZiBsYXVuY2ggbm90IGluIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbnRhaW5lcklkcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwIG9mIHBsdWdpbiBpZHMgKHRoZSBrZXkpIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBjbGFzc3BhdGguCi0JICogPHA+Ci0JICogVmFsdWUgd2lsbCA8Y29kZT5Cb29sZWFuPC9jb2RlPiBhbmQgd2lsbCBiZSB0cnVlIGlmIHBsdWdpbiB3YXMgdmlzaWJsZSB0byB0b3AtbGV2ZWwgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIG1hcCBvZiBwbHVnaW4gaWRzLiBLZXkgb2YgdHlwZSBTdHJpbmcuIEVtcHR5IGlmIGxhdW5jaCBub3QgaW4gYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UGx1Z2luSWRzKCk7CQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwIG9mIHByb2plY3QgcGF0aHMgKHRoZSBrZXkpIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBjbGFzc3BhdGguIFRoZSB0b3AtbGV2ZWwgcHJvamVjdAotCSAqIHdpbGwgTk9UIGJlIGluIHRoaXMgbGlzdCBzaW5jZSBpdCBpcyBhc3N1bWVkIHRvIGJlIHZpc2libGUgdG8gaXRzZWxmLgotCSAqIDxwPgotCSAqIFZhbHVlIHdpbGwgPGNvZGU+Qm9vbGVhbjwvY29kZT4gYW5kIHdpbGwgYmUgdHJ1ZSBpZiBwcm9qZWN0IHdhcyB2aXNpYmxlIHRvIHRvcC1sZXZlbCBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gbWFwIG9mIHByb2plY3QgcGF0aHMuIEtleSBvZiB0eXBlIDxjb2RlPklQYXRoPC9jb2RlPi4gRW1wdHkgaWYgbGF1bmNoIG5vdCBpbiBhIHByb2plY3QuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb2plY3RQYXRocygpOwkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25maWd1cmF0aW9uQ29udHJpYnV0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lDb25maWd1cmF0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlYjBjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUNvbmZpZ3VyYXRpb25Db250cmlidXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBjb250cmlidXRlIHRvIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZQotICogdXNlZCB0byBzdGFydCBhIHByb3h5IHJlZ2lzdHJ5LiAKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciB7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGZpcnN0IGJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIGNhbGxzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRvIGFueSBpbnRlcm5hbCBpbml0aWFsaXphdGlvbnMKLQkgKiByZXF1aXJlZCBieSB0aGUgb3RoZXIgY2FsbHMuIFRoYXQgd2F5IHRoZSBvdGhlciBjYWxscyBjYW4gaGF2ZSB0aGUgb3JkZXIgY2hhbmdlZCBhcyB0aGUgaW1wbGVtZW50YXRpb24KLQkgKiByZXF1aXJlcy4KLQkgKiA8cD4KLQkgKiBOT1RFOiBGb3IgdGhvc2Ugd2hvIG5lc3QgY29uZmlndXJhdGlvbiBjb250cmlidXRvcnMgKGkuZS4gd2l0aGluIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgY29udHJpYnV0b3IsIG1vcmUKLQkgKiBjb250cmlidXRvcnMgYXJlIGRpc2NvdmVyZWQpIHRoZW4gaXQgaXMgaW1wZXJpdGl2ZSB0aGF0IHdoZW4gdGhvc2UgY29udHJpYnV0b3JzIGFyZSBkaXNjb3ZlcmVkIHRoYXQgdGhpcyBtZXRob2QKLQkgKiBiZSBjYWxsZWQgb24gdGhlbSB0b28uIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoZSBjb250cmFjdCB3aXRoIGNvbnRyaWJ1dG9ycyBjYW4gYmUgZm9sbG93ZWQuIEl0IGlzIGJlc3QgaWYgdGhlCi0JICogZGlzY292ZXJpZXMgYXJlIGFjdHVhbGx5IGRvbmUgaW4gdGhlIGluaXRpYWxpemUgbWV0aG9kIGl0c2VsZiBzbyB0aGF0IGl0IGNhbiBwYXNzIHRoZSBsYXVuY2ggaW5mbyByaWdodCB0aGVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5mbyBpbmZvIGNvbnRhaW5zIHRoaW5ncyBsaWtlIGNvbnRhaW5lcnMgdmlzaWJsZSwgZXRjLgotCSAqIAotCSAqIEBzZWUgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gaW5mbyk7Ci0JCi0JLyoqCi0JICogQ29udHJpYnV0ZSB0byB0aGUgY2xhc3NwYXRoLiBUaGUgY29udHJvbGxlciBpcyB1c2VkIHRvIGRvIHRoZSBhY3R1YWwgY29udHJpYnV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sbGVyCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aHMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ29udHJpYnV0ZSB1cGRhdGVzIHRvIHRoZSBjb25maWd1cmF0aW9uLiBJdCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGxhdW5jaCBoYXMgc3RhcnRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ29udHJpYnV0ZSB0byB0aGUgcmVnaXN0cnkgKG9yIGludGVyYWN0IHdpdGggdGhlIHJlbW90ZSB2bSkgYWZ0ZXIgdGhlIHJlZ2lzdHJ5IGhhcyBiZWVuCi0JICogY3JlYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9SZWdpc3RyeShQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uc3RydWN0b3JQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUNvbnN0cnVjdG9yUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5NGUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JQ29uc3RydWN0b3JQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElDb25zdHJ1Y3RvclByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLS8qKgotICogVGhpcyBpcyBhIHByb3h5IHRoYXQgYWxsb3dzIGEgY29uc3RydWN0b3IgdG8gZXhpc3QgaW4gdGhlIHRhcmdldCBWTQotICogYW5kIGJlIHJlZmVyZW5jZWQgaW4gdGhlIElERSBWTQotICogQ3JlYXRpb24gZGF0ZTogKDEvMTcvMDAgMToyMTo1MiBQTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnN0cnVjdG9yUHJveHkgZXh0ZW5kcyBJQWNjZXNzaWJsZU9iamVjdFByb3h5IHsKLS8qKgotICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIHdpdGggbm8gY3JlYXRpb24gYXJndW1lbnRzLAotICogaS5lLiBmb3IgYSBudWxsIGNvbnN0cnVjdG9yCi0gKiBDcmVhdGlvbiBkYXRlOiAoMS8xNy8wMCAxOjIyOjExIFBNKQotICovCi1JQmVhblByb3h5IG5ld0luc3RhbmNlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNyZWF0aW9uIGFyZ3VtZW50cwotICogQ3JlYXRpb24gZGF0ZTogKDEvMTcvMDAgMToyMjoxMSBQTSkKLSAqLwotSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShJQmVhblByb3h5W10gY3JlYXRpb25Bcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygpOwotSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5W10gY3JlYXRpb25Bcmd1bWVudHMpOwotCi1JQmVhblR5cGVQcm94eVtdIGdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lEaW1lbnNpb25CZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lEaW1lbnNpb25CZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMzBiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRGltZW5zaW9uQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSURpbWVuc2lvbkJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0KLS8qKgotICogSW50ZXJmYWNlIHRvIGEgRGltZW5zaW9uIGJlYW4gcHJveHkuCi0gKiA8cD4KLSAqIFRoZXNlIGFyZSBjb21tb24gZm9yIGRpZmZlcmVudCB3aW5kb3dpbmcgc3lzdGVtcywgZS5nLiBBV1QgYW5kIFNXVC4gU28gdGhpcyBoZXJlCi0gKiBpcyBjb21tb24gaW50ZXJmYWNlIGZvciB0aGVtLgotICogQ3JlYXRpb24gZGF0ZTogKDQvNy8wMCAzOjQ2OjM5IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaW1lbnNpb25CZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLQlwdWJsaWMgaW50IGdldEhlaWdodCgpOwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKTsKLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKTsKLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0U2l6ZShJRGltZW5zaW9uQmVhblByb3h5IGRpbSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2YWRmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJRXhwcmVzc2lvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JRXhwcmVzc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLk5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uOwotIAotLyoqCi0gKiBUaGlzIGlzIGFuIGV4cHJlc3Npb24uIEl0IHdpbGwgYmUgZXZhbHVhdGVkIG9uIHRoZSBvdGhlciBzaWRlLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuCi0gKiBleHByZXNzaW9uIGFuZCB1c2luZyBJTWV0aG9kUHJveHkncywgSUNvbnN0cnVjdG9yUHJveHkncywgZXRjLiBpcyB0aGUgZ3JhbnVsYXJpdHkuIFRoZSBwcm94aWVzCi0gKiBhcmUgb25lIHJvdW5kLXRyaXAgdG8gdGhlIG90aGVyIHNpZGUgZm9yIGVhY2ggYWNjZXNzIG9yIGV4ZWN1dGlvbi4gVGhlIGV4cHJlc3Npb24gYnVpbGRzIHRoZW0gdXAKLSAqIGFuZCB3aWxsIGV4ZWN1dGUgdGhlbSBhbGwgYXQgb25jZSBvbiB0aGUgb3RoZXIgc2lkZS4gQW5vdGhlciBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIHJlZmxlY3Rpb24KLSAqIHdpbGwgYmUgZG9uZSBvbiB0aGUgb3RoZXIgc2lkZSB0b28uIEZvciBpbnN0YW5jZSB3aGVuIGludm9raW5nIGEgbWV0aG9kLCB0aGUgbWV0aG9kIG5hbWUgaXMKLSAqIHBhc3NlZCBpbnRvIHRoZSBleHByZXNzaW9uIGFzIGEgc3RyaW5nIHRoZW4gcmVmbGVjdGVkIGFuZCB0aGVuIGludm9rZWQsIHdoaWxlIHdpdGggbWV0aG9kCi0gKiBwcm94aWVzLCB0aGUgc3RyaW5nIGlzIHVzZWQgdG8gZmluZCB0aGUgcHJveHkgb24gdGhlIG90aGVyIHNpZGUsIGFuZCB0aGVuIGEgbGF0ZXIgcm91bmQtdHJpcAotICogd2lsbCBiZSB1c2VkIHRvIGludm9rZSBpdC4KLSAqIDxwPgotICogQWxzbyBhbiBleHByZXNzaW9uIGlzIGEgb25lLXRpbWUgdXNlIG9iamVjdC4gSXQgY2FuJ3QgYmUgcmV1c2VkIGEgc2Vjb25kIHRpbWUuIEEgbmV3IG9uZSBtdXN0IGJlCi0gKiBidWlsdCB1cCBhZ2Fpbi4KLSAqIDxwPgotICogV2UgYXJlIG5vdCB1c2luZyBzZXBhcmF0ZSBpbnN0YW5jZXMgb2YgZXhwcmVzc2lvbnMsIGFuZCB0eXBlcyBvZiBleHByZXNzaW9ucywgYmVjYXVzZSB3ZSBkb24ndAotICogd2FudCB0byBidWlsZCB1cCBtYW55IG9iamVjdHMgKGluIGEgZm9ybSBvZiBhbiBleHByZXNzaW9uIHRyZWUpIHRoYXQgd2lsbCB0aGVuIGJlIHRocm93biBhd2F5Ci0gKiAob25lIGZvciBlYWNoIGV4cHJlc3Npb24gaW4gdGhlIG5lc3RlZCBsaXN0IG9mIGV4cHJlc3Npb25zKS4gV2UganVzdCBidWlsZCB0aGUgY29tbWFuZCBsaXN0IGFzCi0gKiB3ZSBidWlsZCB0aGUgZXhwcmVzc2lvbi4KLSAqIDxwPgotICogVG8gdXNlLCB5b3UgY2FsbCB0aGUgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSdzIGNyZWF0ZUV4cHJlc3Npb24gbWV0aG9kLiBBbiBJRXhwcmVzc2lvbiBpcwotICogcmV0dXJuZWQuIEZyb20gdGhlcmUgeW91IHdpbGwgc3RhcnQgY3JlYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHByZXNzaW9uLiBBbmQgdGhlbiB5b3Ugd2lsbAotICogZmluYWxseSBlaXRoZXIgZ2V0RXhwcmVzc2lvblZhbHVlKCkgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiwgb3IgdXNlCi0gKiBpbnZva2VFeHByZXNzaW9uKCkgdG8ganVzdCBleGVjdXRlIHRoZSBleHByZXNzaW9uKHMpLiBJZiB5b3UgdXNlIGdldEV4cHJlc3Npb25WYWx1ZSgpLCB0aGVyZSBjYW4KLSAqIG9ubHkgYmUgb25lIHJvb3QgZXhwcmVzc2lvbi4gSWYgeW91IHVzZSBpbnZva2VFeHByZXNzaW9uIHRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIHJvb3QKLSAqIGV4cHJlc3Npb24sIGFuZCB0aGV5IHdpbGwgYWxsIGJlIGV4ZWN1dGVkLgotICogPHA+Ci0gKiBTaW5jZSBzZXF1ZW5jZSBpcyBzbyBpbXBvcnRhbnQsIGl0IHdpbGwgYmUgdGVzdGVkIGFuZCBpZiBhbnl0aGluZyBpcyBkb25lIG91dCBvZiBvcmRlciBhbgotICogSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICogPHA+Ci0gKiBFYWNoIHRpbWUgYW4gZXhwcmVzc2lvbiBpcyBjcmVhdGVkLCBvbmUgYXJndW1lbnQgcGFzc2VkIGluIHdpbGwgYmUgPGNvZGU+Zm9yRXhwcmVzc2lvbjwvY29kZT4gZmxhZy4KLSAqIFRoaXMgaXMgYSBzZXQgb2YgY29uc3RhbnRzIHVzZWQgYXMgYSBjbHVlIGZvciB3aGF0IGV4cHJlc3Npb24gdGhpcyBleHByZXNzaW9uIGlzIGJlaW5nIGNyZWF0ZWQuCi0gKiBUaGlzIGlzIGZvciBhIHNhbml0eSBjaGVjayBvbiB0aGUgc3RhdGUuIEZvciBleGFtcGxlLCB3aGVuIGNyZWF0aW5nIHRoZSBhcnJheSBleHByZXNzaW9uIGZvciBhbgotICogYXJyYXkgYWNjZXNzLCB0aGUgQVJSQVlBQ0NFU1NfQVJSQVkgZmxhZyBpcyBwYXNzZWQgaW4uIFRoaXMgd2F5IGlmIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gb24gdGhlCi0gKiBzdGFjayBpcyBub3QgZm9yIGFuIGFycmF5IGFjY2VzcyB3YWl0aW5nIGZvciB0aGUgYXJyYXkgZXhwcmVzc2lvbiwgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICogV2l0aG91dCB0aGlzIGZsYWcsIGl0IHdvdWxkIGJlIGVhc3kgdG8gYWNjaWRlbnRseSBjcmVhdGUgdGhlIHdyb25nIGV4cHJlc3Npb24gYXQgdGhlIHdyb25nIHRpbWUuCi0gKiBPbmNlIHN1Y2ggYW4gZXJyb3Igb2NjdXJzLCB0aGlzIElFeHByZXNzaW9uIHdpbGwgbm8gbG9uZ2VyIGJlIHZhbGlkLiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KLSAqIGZvciBhbnkgdHlwZSBvZiBhY2Nlc3MuCi0gKiA8cD4KLSAqIEl0IGlzIGd1YXJlbnRlZWQgdGhhdCB0aGUgZW50aXJlIHN0YWNrIG9mIGNvbW1hbmRzIHdpbGwgYmUgc2VudCB3aXRob3V0IHN0b3BwaW5nIGV4Y2VwdCBmb3IgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gKiBkdWUgdG8gb3V0IG9mIG9yZGVyIGV4cHJlc3Npb25zLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBpbnRlcmZhY2UgaXMgbm90IG1lYW50IHRvIGJlIG5laXRoZXIgaW5zdGFudGlhdGVkIG5vciBpbXBsZW1lbnRlZCBieSBjdXN0b21lcnMuCi0gKiBJdCBpcyB0aGUgaW50ZXJmYWNlIGludG8gdGhlIGV4cHJlc3Npb24gcHJvY2Vzc2luZy4gSXQgaXMgdG8gYmUgaW5zdGFudGlhdGVkIHRocm91Z2ggdGhlIGNyZWF0ZUV4cHJlc3Npb24gcmVxdWVzdC4KLSAqIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbn0gY2xhc3MgaXMgYXZhaWxhYmxlIGFzIEFQSS4gSXQgaXMgbm90IG1lYW50IHRvCi0gKiBiZSBpbnN0YW50aWF0ZWQgYnkgY3VzdG9tZXJzLCBidXQgY3VzdG9tZXJzIGNhbiB0YWtlIHRoZSBJRXhwcmVzc2lvbiBhbmQgY2FzdCB0byBFeHByZXNzaW9uIGZvciBzb21lIGFkdmFuY2VkCi0gKiBBUEkuCi0gKiAgCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkjY3JlYXRlRXhwcmVzc2lvbigpCi0gKiBAc2VlIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHByZXNzaW9uIGV4dGVuZHMgSUV4cHJlc3Npb25Db25zdGFudHMgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0cnkgdGhpcyBleHByZXNzaW9uIGlzIHdvcmtpbmcgYWdhaW5zdC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7Ci0JCi0JLyoqCi0JICogSW52b2tlIHRoZSBleHByZXNzaW9uKHMpLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHJvb3QgZXhwcmVzc2lvbiwgaXQgd2lsbCBpbnZva2UgdGhlbQotCSAqIGluIHRoZSBvcmRlciBjcmVhdGVkLiBJZiB0aGUgZXhwcmVzc2lvbiBzdGFjayBpcyBub3QgY29tcGxldGUsIHRoZW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgdGhyb3duLgotCSAqIAotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnZva2VFeHByZXNzaW9uKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBleHByZXNzaW9uIGlzIHZhbGlkLiBJdCB3b3VsZCBiZSBpbnZhbGlkIGlmIGFueSBvZiB0aGUgY3JlYXRlLi4uIGNhbGxzIGhhZCB0aHJvd24gYW4KLQkgKiBleGNlcHRpb24gb3IgaWYgdGhlIGV4cHJlc3Npb24gaGFzIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQgKGludm9rZWQgb3IgZ2V0RXhwcmVzc2lvblZhbHVlKCkpLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXhwcmVzc2lvbiBpcyB2YWxpZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXJlIGhhZCBiZWVuIHNvbWUgZXJyb3IsIG9yIGlmIHRoZSBleHByZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKTsKLQkKLQkvKioKLQkgKiBDbG9zZSB0aGUgZXhwcmVzc2lvbi4gVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgaWYgZm9yIHNvbWUgcmVhc29uIHtAbGluayBJRXhwcmVzc2lvbiNpbnZva2VFeHByZXNzaW9uKCl9IG9yIHtAbGluayBJRXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uVmFsdWUoKX0KLQkgKiB3ZXJlIG5vdCBjYWxsZWQuIEl0IGlzIG5vdCBhbiBlcnJvciB0byBhbHdheXMgY2FsbCB0aGlzIGFmdGVyIHRoZXNlIGNhbGxzLiBJdCB3aWxsIG5vdCBoYXZlIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBleHByZXNzaW9uIGFscmVhZHkKLQkgKiBiZWluZyBjbG9zZWQuIGludm9rZSBhbmQgZ2V0dmFsdWUgYXV0b21hdGljYWxseSBjYWxsIGNsb3NlIGZvciB5b3UuIElmIHlvdSBkb24ndCBjYWxsIGNsb3NlIGluIGNhc2Ugb2YgYW4gZXJyb3IsIHRoZSByZXNvdXJjZXMKLQkgKiBmb3IgdGhlIGV4cHJlc3Npb24gd2lsbCBub3QgYmUgZnJlZWQgdXAuIAotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCk7Ci0JCi0JLyoqCi0JICogSW52b2tlIHRoZSByb290IGV4cHJlc3Npb24gYW5kIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uIElmIHRoZSBleHByZXNzaW9uIHN0YWNrCi0JICogaXMgbm90IGNvbXBsZXRlLCBvciBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHJvb3QgZXhwcmVzc2lvbiwgdGhlbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+Ci0JICogd2lsbCBiZSB0aHJvd24uCi0JICogCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHJvb3QgZXhwcmVzc2lvbi4gCi0JICogCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldEV4cHJlc3Npb25WYWx1ZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkJCQotCS8qKgotCSAqIENyZWF0ZSBhbiBBcnJheSBBY2Nlc3MgKGUuZy4geFszXSkuCi0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZSBleHByZXNzaW9ucyBmb3I6Ci0JICogPHByZT4KLQkgKiAgPGNvZGU+QVJSQVlBQ0NFU1NfQVJSQVk8L2NvZGU+Ci0JICogIDxjb2RlPkFSUkFZQUNDRVNTX0lOREVYPC9jb2RlPiBhbiBpbmRleENvdW50IHRpbWVzLiAKLQkgKiA8L3ByZT4KLQkgKiA8cD4KLQkgKiBTbyB0aGUgYXJyYXkgYWNjZXNzIG11c3QgYmUgZm9sbG93ZWQgYnkgMStpbmRleENvdW50IGV4cHJlc3Npb25zLgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uIFRoaXMgaXMgZm9yIHdoYXQgZXhwcmVzc2lvbiB0aGlzIGV4cHJlc3Npb24gaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiBAcGFyYW0gaW5kZXhDb3VudCBUaGUgbnVtYmVyIG9mIGluZGV4IGV4cHJlc3Npb25zIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBpbnQgaW5kZXhDb3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gQXJyYXkgQ3JlYXRpb24gKGUuZy4gPGNvZGU+bmV3IGludFszXTwvY29kZT4gb3IgPGNvZGU+bmV3IGludFszXVtdPC9jb2RlPiBvciA8Y29kZT5uZXcgaW50W10gezMsIDR9PC9jb2RlPikuCi0JICogSWYgPGNvZGU+ZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50PC9jb2RlPiBpcyB6ZXJvLCB0aGVuIHRoZXJlIG11c3QgYmUgYW4gaW5pdGlhbGl6ZXIuIFRoaXMgaXMgYmVjYXVzZQotCSAqIGlmIHRoZXJlIGFyZSBhbnkgZGltZW5zaW9uIGV4cHJlc3Npb25zLCB0aGVuIGluaXRpYWxpemVycyBhcmUgaW52YWxpZCBhbmQgdmlzYS12ZXJzYS4KLQkgKiA8cD4KLQkgKiBUaGUgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50IGlzIGZvciBob3cgbWFueSBkaW1lbnNpb25zIGhhdmUgYW4gZXhwcmVzc2lvbiBpbiB0aGVtLiBGb3IgaW5zdGFuY2UsCi0JICogPGNvZGU+bmV3IGludFszXTwvY29kZT4gd2lsbCBoYXZlIGEgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50IG9mIDEuIFdoaWxlCi0JICogPGNvZGU+bmV3IGludFszXVtdPC9jb2RlPiB3aWxsIGFsc28gaGF2ZSBjb3VudCBvZiAxLiBBbmQgZmluYWxseQotCSAqIDxjb2RlPm5ldyBpbnQgW108L2NvZGU+IHdpbGwgaGF2ZSBhIGNvdW50IG9mIDAuCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZSBleHByZXNzaW9ucyBmb3I6Ci0JICogPHByZT4KLQkgKiAgPGNvZGU+QVJSQVlDUkVBVElPTl9ESU1FTlNJT048L2NvZGU+IGEgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50IHRpbWVzLCAKLQkgKiAgb3IgYW4gPGNvZGU+Y3JlYXRlQXJyYXlJbml0aWFsaXplcigpPC9jb2RlPiBpZiBkaW1lbnNpb24gY291bnQgaXMgMC4KLQkgKiA8L3ByZT4KLQkgKiAgCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCBhbmQgaWYgYW4gaW5uZXIgY2xhc3MsIGl0IG11c3QgaGF2ZSB0aGUgIiQiIGZvcm1hdC4gSXQgbXVzdCBhbHNvIGluY2x1ZGUgdGhlIGNvcnJlY3QgbnVtYmVyIG9mICA8Y29kZT5bXTwvY29kZT4gYXQgdGhlIGVuZC4KLQkgKiBAcGFyYW0gZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgU3RyaW5nIHR5cGUsIGludCBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gQXJyYXkgQ3JlYXRpb24gKGUuZy4gPGNvZGU+bmV3IGludFszXTwvY29kZT4gb3IgPGNvZGU+bmV3IGludFszXVtdPC9jb2RlPiBvciA8Y29kZT5uZXcgaW50W10gezMsIDR9PC9jb2RlPikuCi0JICogSWYgPGNvZGU+ZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50PC9jb2RlPiBpcyB6ZXJvLCB0aGVuIHRoZXJlIG11c3QgYmUgYW4gaW5pdGlhbGl6ZXIuIFRoaXMgaXMgYmVjYXVzZQotCSAqIGlmIHRoZXJlIGFyZSBhbnkgZGltZW5zaW9uIGV4cHJlc3Npb25zLCB0aGVuIGluaXRpYWxpemVycyBhcmUgaW52YWxpZCBhbmQgdmlzYS12ZXJzYS4KLQkgKiA8cD4KLQkgKiBUaGUgZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50IGlzIGZvciBob3cgbWFueSBkaW1lbnNpb25zIGhhdmUgYW4gZXhwcmVzc2lvbiBpbiB0aGVtLiBGb3IgaW5zdGFuY2UsCi0JICogPG9sPgotCSAqIDxsaT48Y29kZT5uZXcgaW50WzNdPC9jb2RlPiB3aWxsIGhhdmUgYSBkaW1lbnNpb25FeHByZXNzaW9uQ291bnQgb2YgMS4gV2hpbGUKLQkgKiA8bGk+PGNvZGU+bmV3IGludFszXVtdPC9jb2RlPiB3aWxsIGFsc28gaGF2ZSBjb3VudCBvZiAxLiBBbmQgZmluYWxseQotCSAqIDxsaT48Y29kZT5uZXcgaW50IFtdPC9jb2RlPiB3aWxsIGhhdmUgYSBjb3VudCBvZiAwLgotCSAqIDwvb2w+Ci0JICogVGhlIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93IGlmIGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCBpcyBub3QgemVybyBtdXN0IGV2YWx1YXRlIHRvIGJlIGNvbXBhdGlibGUgdG8gYW4gaW50IHR5cGUgKGkuZS4gYnl0ZSwgY2hhciwgc2hvcnQsIG9yIGludCkuCi0JICogRWFjaCBleHByZXNzaW9uIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYW4gYXJyYXkgZm9yIHRoYXQgZGltZW5zaW9uIG9mIHRoYXQgc2l6ZS4gRm9yIGV4YW1wbGUgPGNvZGU+bmV3IGludFszXVtdPC9jb2RlPiB3aWxsIGhhdmUgYW4KLQkgKiBkaW1lbnNpb24gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byAiMyIsIGFuZCBzbyBpdCB3aWxsIGNyZWF0ZSBhbiBhcnJheSBpbnRbM11bXS4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlIGV4cHJlc3Npb25zIGZvcjoKLQkgKiAJZGltZW5zaW9uRXhwcmVzc2lvbkNvdW50IHRpbWVzIGFuOiA8Y29kZT5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTjwvY29kZT4KLQkgKiAgb3IgYW4gY3JlYXRlQXJyYXlJbml0aWFsaXplciBpZiBkaW1lbnNpb24gY291bnQgaXMgMC4KLQkgKiAgCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLiBUaGlzIG11c3QgYmUgdGhlIGFjdHVhbCB0eXBlIHdpdGggdGhlIGNvcnJlY3QgdG90YWwgbnVtYmVyIG9mIGRpbWVuc2lvbnMgKGUuZy4gImphdmEubGFuZy5PYmplY3RbXVtdIikuCi0JICogQHBhcmFtIGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCBudW1iZXIgb2YgaW50IHZhbHVlZCBleHByZXNzaW9ucyB0aGF0IGZvbGxvdyB0aGF0IGdpdmUgdGhlIHNpemUgZm9yIGVhY2ggZGltZW5zaW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGRpbWVuc2lvbkV4cHJlc3Npb25Db3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBhcnJheSBpbml0aWFsaXplci4gKGUuZy4gPGNvZGU+ezIsM308L2NvZGU+KS4KLQkgKiBUaGlzIG9uZSBpcyB1bnVzdWFsIGluIHRoYXQgdGhlcmUgaXMgbm8gZm9yRXhwcmVzc2lvbi4gVGhhdCBpcyBiZWNhdXNlIGFycmF5IGluaXRpYWxpemVycyBhcmUgb25seSB2YWxpZCBpbgotCSAqIGNlcnRhaW4gcGxhY2VzLiBBbmQgc28gaWYgY2FsbGVkIHdoZW4gbm90IGV4cGVjdGVkLCB0aGlzIGlzIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAlleHByZXNzaW9uQ291bnQgdGltZXMgYW46IDxjb2RlPkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTjwvY29kZT4KLQkgKiAJCWV4Y2VwdCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhbm90aGVyIGFycmF5IGluaXRpYWxpemVyLiBUaGF0IGlzIHZhbGlkIGFuZCBkb2Vzbid0IGhhdmUgYSBmb3JFeHByZXNzaW9uLAotCSAqIAkJYnV0IGl0IGRvZXMgY291bnQgYXMgb25lIG9mIHRoZSBleHByZXNzaW9uQ291bnRzLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uQ291bnQgTnVtYmVyIG9mIGV4cHJlc3Npb25zLCBtYXkgYmUgMC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoaW50IGV4cHJlc3Npb25Db3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkJCi0JLyoqCi0JICogQ3JlYXRlIGEgY2FzdCBleHByZXNzaW9uIChlLmcuIDxjb2RlPihzaG9ydCkxMDwvY29kZT4gb3IgPGNvZGU+KGphdmEubGFuZy5TdHJpbmcpICJhc2QiPC9jb2RlPikKLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAk8Y29kZT5DQVNUX0VYUFJFU1NJT048L2NvZGU+IAotCSAqICAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkIGFuZCBpZiBhbiBpbm5lciBjbGFzcywgaXQgbXVzdCBoYXZlIHRoZSAiJCIgZm9ybWF0LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGNhc3QgZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT4oc2hvcnQpMTA8L2NvZGU+IG9yIDxjb2RlPihqYXZhLmxhbmcuU3RyaW5nKSAiYXNkIjwvY29kZT4pCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJPGNvZGU+Q0FTVF9FWFBSRVNTSU9OPC9jb2RlPiAKLQkgKiAgCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdHlwZSBUaGlzIGlzIHRoZSB0eXBlLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQkJCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGNsYXNzIGluc3RhbmNlIGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+bmV3IGphdmEubGFuZy5JbnRlZ2VyKDUpPC9jb2RlPikKLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAlhcmd1bWVudENvdW50IHRpbWVzIGFuOiA8Y29kZT5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQ8L2NvZGU+Ci0JICogCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGNhbiB0aHJvdyB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5VbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvcn0gd2hpbGUgcHJvY2Vzc2luZwotCSAqIGFuZCBjYW4gYmUgY2F1Z2h0IGJ5IGFuIEV4cHJlc3Npb24gdHJ5L2NhdGNoLiBUaGlzIGlzIG5vdCB0aHJvd24gc3VjaCB0aGF0IGl0IGNhbiBiZSBjYXVnaHQgYnkgYSByZWFsIGphdmEgdHJ5L2NhdGNoLgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQgYW5kIGlmIGFuIGlubmVyIGNsYXNzLCBpdCBtdXN0IGhhdmUgdGhlICIkIiBmb3JtYXQuCi0JICogQHBhcmFtIGFyZ3VtZW50Q291bnQKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB0eXBlLCBpbnQgYXJndW1lbnRDb3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBjbGFzcyBpbnN0YW5jZSBleHByZXNzaW9uIChlLmcuIDxjb2RlPm5ldyBqYXZhLmxhbmcuSW50ZWdlcig1KTwvY29kZT4pCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAJYXJndW1lbnRDb3VudCB0aW1lcyBhbjogPGNvZGU+Q0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5UPC9jb2RlPgotCSAqIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBjYW4gdGhyb3cge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uVW5yZXNvbHZlZENvbXBpbGF0aW9uRXJyb3J9IHdoaWxlIHByb2Nlc3NpbmcKLQkgKiBhbmQgY2FuIGJlIGNhdWdodCBieSBhbiBFeHByZXNzaW9uIHRyeS9jYXRjaC4gVGhpcyBpcyBub3QgdGhyb3duIHN1Y2ggdGhhdCBpdCBjYW4gYmUgY2F1Z2h0IGJ5IGEgcmVhbCBqYXZhIHRyeS9jYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUuCi0JICogQHBhcmFtIGFyZ3VtZW50Q291bnQKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGFyZ3VtZW50Q291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIChlLmcuIDxjb2RlPnggIT0gMyA/IDQgOiA1PC9jb2RlPikKLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAk8Y29kZT5DT05ESVRJT05BTF9DT05ESVRJT048L2NvZGU+Ci0JICogCTxjb2RlPkNPTkRJVElPTkFMX1RSVUU8L2NvZGU+Ci0JICogCTxjb2RlPkNPTkRJVElPTkFMX0ZBTFNFPC9jb2RlPgkKLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBmaWVsZCBhY2Nlc3MgKGUuZy4gPGNvZGU+amF2YS5hd3QuQ29sb3IucmVkPC9jb2RlPikKLQkgKiA8cD4KLQkgKiBOb3RlOiBBdCB0aGlzIHRpbWUgd2UgcmVxdWlyZSBhIHJlY2VpdmVyLiBJbiB0aGUgZnV0dXJlIGl0IG1heSBiZSBwb3NzaWJsZSB0byBub3QgaGF2ZSBvbmUsIGJ1dAotCSAqIGZvciB0aGF0IHdlIG5lZWQgYSA8Y29kZT50aGlzPC9jb2RlPiBvYmplY3QgdG8ga25vdyB3aG8gdGhlIHJlY2VpdmVyIGltcGxpY2l0bHkgaXMuCi0JICogVGhlIHJlY2VpdmVyIG1heSBiZSBhICJ0eXBlIHJlY2VpdmVyIiBpZiBpdCBpcyBhIHR5cGUsIGUuZy4gPGNvZGU+amF2YS5hd3QuQ29sb3I8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCTxjb2RlPkZJRUxEX1JFQ0VJVkVSPC9jb2RlPiBpZiBoYXNSZWNlaXZlciBpcyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmllbGQuCi0JICogQHBhcmFtIGhhc1JlY2VpdmVyIEhhcyBhIHJlY2VpdmVyIGZsYWcuIEN1cnJlbnRseSB0aGlzIG11c3QgYWx3YXlzIGJlIHRydWUuIFRoaXMgaXMgYmVjYXVzZSBjYW4ndCB0ZWxsIHdoYXQgY2xhc3MgdG8gbG9vayBpbnRvIGZvciB0aGUgZmllbGQgd2l0aG91dCBhIHJlY2VpdmVyLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uI2NyZWF0ZVR5cGVSZWNlaXZlcihTdHJpbmcpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgZmllbGROYW1lLCBib29sZWFuIGhhc1JlY2VpdmVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmaWVsZCBhY2Nlc3MgKGUuZy4gPGNvZGU+amF2YS5hd3QuQ29sb3IucmVkPC9jb2RlPikKLQkgKiA8cD4KLQkgKiBOb3RlOiBBdCB0aGlzIHRpbWUgd2UgcmVxdWlyZSBhIHJlY2VpdmVyIGZvciBub24tc3RhdGljIGFjY2Vzcy4gSW4gdGhlIGZ1dHVyZSBpdCBtYXkgYmUgcG9zc2libGUgdG8gbm90IGhhdmUgb25lLCBidXQKLQkgKiBmb3IgdGhhdCB3ZSBuZWVkIGEgPGNvZGU+dGhpczwvY29kZT4gb2JqZWN0IHRvIGtub3cgd2hvIHRoZSByZWNlaXZlciBpbXBsaWNpdGx5IGlzLgotCSAqIFRoZSByZWNlaXZlciBtYXkgYmUgYSAidHlwZSByZWNlaXZlciIgaWYgaXQgaXMgYSB0eXBlLCBlLmcuIDxjb2RlPmphdmEuYXd0LkNvbG9yPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIDxwcmU+Ci0JICogCTxjb2RlPkZJRUxEX1JFQ0VJVkVSPC9jb2RlPiBpZiBoYXNSZWNlaXZlciBpcyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIGZpZWxkUHJveHkgVGhlIGZpZWxkIHByb3h5IGZvciB0aGUgZmllbGQuCi0JICogQHBhcmFtIGhhc1JlY2VpdmVyIEhhcyBhIHJlY2VpdmVyIGZsYWcuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlVHlwZVJlY2VpdmVyKFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eUZpZWxkIGZpZWxkUHJveHksIGJvb2xlYW4gaGFzUmVjZWl2ZXIpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpZi9lbHNlIHN0bXQuIFNpbmNlIHRoaXMgaXMgYSBzdGF0bWVudCwgdGhlcmUgaXMgbm8gRm9yRXhwcmVzc2lvbi4gUk9PVF9FWFBSRVNTSU9OIG11c3QgYmUgdGhlIG5leHQgZXhwcmVzc2lvbiB0eXBlLgotCSAqIDxwPAotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogPHByZT4KLQkgKiAgIDxjb2RlPklGX0NPTkRJVElPTjwvY29kZT4gVGhlIGlmIHRlc3QsIG11c3QgcmV0dXJuIGJvb2xlYW4uCi0JICogICA8Y29kZT5JRl9UUlVFPC9jb2RlPiBUaGUgaWYgY29uZGl0aW9uIGlzIHRydWUgY2xhdXNlLiBUaGUgY2xhdXNlIG1heSBiZSBhbiBleHByZXNzaW9uLCBvciBhIGJsb2NrLgotCSAqICAgPGNvZGU+SUZfRUxTRTwvY29kZT4gIGlmIGhhc0Vsc2VDbGF1c2UgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIFRoZSBlbHNlIGNsYXVzZS4gVGhlIGNsYXVzZSBtYXkgYmUgYW4gZXhwcmVzc2lvbiwgb3IgYSBibG9jay4KLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gaGFzRWxzZUNsYXVzZQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSWZFbHNlKGJvb2xlYW4gaGFzRWxzZUNsYXVzZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5maXggZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT4zICsgNDwvY29kZT4gb3IgPGNvZGU+MyArIDQgKyA1PC9jb2RlPikuCi0JICogPHA+Ci0JICogSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAyIG9wZXJhbmRzIChhbGwgd2l0aCB0aGUgc2FtZSBvcGVyYXRvcikgdGhlbiBmb3IgY29udmllbmVuY2UgYWxsIG9mCi0JICogdGhlIGV4cHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gb25lIGV4cHJlc3Npb24gdGhhbiByZXF1aXJpbmcgc2V2ZXJhbCwgb25lIGZvciBlYWNoIG9wZXJhdG9yLgotCSAqIElmIHRoZXkgYXJlIGRpZmZlcmVudCBvcGVyYXRvcnMsIHRoZW4gZGlmZmVyZW50IGV4cHJlc3Npb25zIHdpbGwgYmUgcmVxdWlyZWQuCi0JICogPHA+Ci0JICogPHByZT4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAk8Y29kZT5JTkZJWF9MRUZUPC9jb2RlPgotCSAqIAk8Y29kZT5JTkZJWF9SSUdIVDwvY29kZT4KLQkgKiAJZXh0ZW5kZWRPcGVyYW5kQ291bnQgdGltZXMgYW46IDxjb2RlPklORklYX0VYVEVOREVEPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIG9wZXJhdG9yIFRoZSBvcGVyYXRvci4KLQkgKiBAcGFyYW0gZXh0ZW5kZWRPcGVyYW5kQ291bnQgVGhlIG51bWJlciBvZiBleHRlbmRlZCBvcGVyYW5kcy4gTWF5IGJlIHplcm8uCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUV4cHJlc3Npb25Db25zdGFudHMjSU5fQU5ECi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgSW5maXhPcGVyYXRvciBvcGVyYXRvciwgaW50IGV4dGVuZGVkT3BlcmFuZENvdW50KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZW9mIGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+eCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+Ci0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb24gZm9yOgotCSAqIAk8Y29kZT5JTlNUQU5DRU9GX1ZBTFVFPC9jb2RlPgotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQgYW5kIGlmIGFuIGlubmVyIGNsYXNzLCBpdCBtdXN0IGhhdmUgdGhlICIkIiBmb3JtYXQuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZW9mIGV4cHJlc3Npb24gKGUuZy4gPGNvZGU+eCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmc8L2NvZGU+Ci0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb24gZm9yOgotCSAqIAk8Y29kZT5JTlNUQU5DRU9GX1ZBTFVFPC9jb2RlPgotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5zdGFuY2VvZkV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoMTApPC9jb2RlPikuCi0JICogV2hlbiB1c2luZyBhIHN0cmluZyB0aGUgbWV0aG9kIGludm9rZWQgd2lsbCBiZSB0aGUgb25lIG1vc3QgY29tcGF0aWJsZSB3aXRoIHRoZSBhcmd1bWVudHMgc2VudC4gCi0JICogVGhpcyBhbGxvd3Mgb3ZlcmxvYWRpbmcgYSBtZXRob2QgdG8gb2NjdXIgd2hlbiBjb21pbmcgaW4gZnJvbSBhIHBhcnNlIHRyZWUsIHNpbmNlIHRoZSBwYXJzZSB0cmVlCi0JICogZG9lc24ndCBrbm93IHRoZSBleGFjdCBtZXRob2QgdG8gdXNlLgotCSAqIDxwPgotCSAqIE5vdGU6IEF0IHRoaXMgdGltZSB3ZSByZXF1aXJlIGEgcmVjZWl2ZXIuIEluIHRoZSBmdXR1cmUgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIG5vdCBoYXZlIG9uZSwgYnV0Ci0JICogZm9yIHRoYXQgd2UgbmVlZCBhIDxjb2RlPnRoaXM8L2NvZGU+IG9iamVjdCB0byBrbm93IHdobyB0aGUgcmVjZWl2ZXIgaW1wbGljaXRseSBpcy4KLQkgKiBUaGUgcmVjZWl2ZXIgbWF5IGJlIGEgInR5cGUgcmVjZWl2ZXIiIGlmIGl0IGlzIGEgdHlwZSwgZS5nLiA8Y29kZT5qYXZhLmF3dC5Db2xvcjwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb24gZm9yOgotCSAqIAk8Y29kZT5NRVRIT0RfUkVDRUlWRVI8L2NvZGU+Ci0JICogCWFyZ3VtZW50Q291bnRzIHRpbWVzIGV4cHJlc3Npb25zIGZvcjogPGNvZGU+TUVUSE9EX0FSR1VNRU5UPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotCSAqIEBwYXJhbSBoYXNSZWNlaXZlciBIYXMgYSByZWNlaXZlciBmbGFnLiBDdXJyZW50bHkgdGhpcyBtdXN0IGFsd2F5cyBiZSB0cnVlLgotCSAqIEBwYXJhbSBhcmd1bWVudENvdW50IENvdW50IG9mIG51bWJlciBvZiBhcmd1bWVudHMuIE1heSBiZSB6ZXJvLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uI2NyZWF0ZVR5cGVSZWNlaXZlcihTdHJpbmcpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGhhc1JlY2VpdmVyLCBpbnQgYXJndW1lbnRDb3VudCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoMTApPC9jb2RlPikKLQkgKiA8cD4KLQkgKiBOb3RlOiBBdCB0aGlzIHRpbWUgd2UgcmVxdWlyZSBhIHJlY2VpdmVyLiBJbiB0aGUgZnV0dXJlIGl0IG1heSBiZSBwb3NzaWJsZSB0byBub3QgaGF2ZSBvbmUsIGJ1dAotCSAqIGZvciB0aGF0IHdlIG5lZWQgYSA8Y29kZT50aGlzPC9jb2RlPiBvYmplY3QgdG8ga25vdyB3aG8gdGhlIHJlY2VpdmVyIGltcGxpY2l0bHkgaXMuCi0JICogVGhlIHJlY2VpdmVyIG1heSBiZSBhICJ0eXBlIHJlY2VpdmVyIiBpZiBpdCBpcyBhIHR5cGUsIGUuZy4gPGNvZGU+amF2YS5hd3QuQ29sb3I8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9uIGZvcjoKLQkgKiAJPGNvZGU+TUVUSE9EX1JFQ0VJVkVSPC9jb2RlPgotCSAqIAlhcmd1bWVudENvdW50cyB0aW1lcyBleHByZXNzaW9ucyBmb3I6IDxjb2RlPk1FVEhPRF9BUkdVTUVOVDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBtZXRob2RQcm94eSBUaGUgcHJveHkgb2YgdGhlIG1ldGhvZAotCSAqIEBwYXJhbSBoYXNSZWNlaXZlciBIYXMgYSByZWNlaXZlciBmbGFnLiBDdXJyZW50bHkgdGhpcyBtdXN0IGFsd2F5cyBiZSB0cnVlLgotCSAqIEBwYXJhbSBhcmd1bWVudENvdW50IENvdW50IG9mIG51bWJlciBvZiBhcmd1bWVudHMuIE1heSBiZSB6ZXJvLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElFeHByZXNzaW9uI2NyZWF0ZVR5cGVSZWNlaXZlcihTdHJpbmcpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIElQcm94eU1ldGhvZCBtZXRob2RQcm94eSwgYm9vbGVhbiBoYXNSZWNlaXZlciwgaW50IGFyZ3VtZW50Q291bnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIHByZWZpeCBleHByZXNzaW9uIChlLmcuIDxjb2RlPiFmbGFnPC9jb2RlPiBvciA8Y29kZT4tKDMrNCk8L2NvZGU+KS4KLQkgKiBJZiB5b3UgYXJlIGp1c3QgdHJ5aW5nIHRvIGNyZWF0ZSBhIHNpZ25lZCBudW1lcmljIGxpdGVyYWwsIGp1c3QgdXNlIHRoZSBjcmVhdGVQcmltaXRpdmVMaXRlcmFsIHBhc3NpbmcgaW4gYQotCSAqIG5lZ2F0aXZlIHZhbHVlLiBZb3UgZG9uJ3QgbmVlZCB0byB1c2UgcHJlZml4IGV4cHJlc3Npb24gZm9yIHRoYXQuCi0JICogPHA+Ci0JICogPHByZT4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAk8Y29kZT5QUkVGSVhfT1BFUkFORDwvY29kZT4KLQkgKiA8L3ByZT4KLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBvcGVyYXRvciBUaGUgb3BlcmF0b3IuIFRoZSB2YWx1ZXMgY29tZSBmcm9tIElFeHByZXNzaW9uQ29uc3RhbnRzLCB0aGUgcHJlZml4IGNvbnN0YW50cy4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JRXhwcmVzc2lvbkNvbnN0YW50cyNQUkVfUExVUwotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBQcmVmaXhPcGVyYXRvciBvcGVyYXRvcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZU51bGwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHR5cGUgbGl0ZXJhbCAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPikuIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSB0eXBlIGlzIGJlaW5nIHVzZWQgYXMgdmFsdWUgaXRzZWxmLCBub3QKLQkgKiBhcyBhIHJlY2VpdmVyIGZvciBhIGZpZWxkIG9yIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZW9mLiBMaWtlIGFzIGFuIGFyZ3VtZW50IHRvIGEgbWV0aG9kLgotCSAqIDxwPgotCSAqIE5vdGU6IElmIHlvdSB3YW50IGEgdHlwZSBsaXRlcmFsIHRvIGJlIGFuIElQcm94eUJlYW5UeXBlLCBqdXN0IHVzZSB7QGxpbmsgSUV4cHJlc3Npb24jY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24sIElQcm94eSl9IGFuZCBwYXNzIGluIHRoZQotCSAqIElQcm94eUJlYW5UeXBlLgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQgYW5kIGlmIGFuIGlubmVyIGNsYXNzLCBpdCBtdXN0IGhhdmUgdGhlICIkIiBmb3JtYXQuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIFN0cmluZyB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHR5cGUgcmVjZWl2ZXIuIFRoaXMgaXMgd2hlcmUgYSB0eXBlIGlzIHVzZWQgYXMgdGhlIHJlY2VpdmVyIG9mIGEgZmllbGQgYWNjZXNzIG9yIGEgbWV0aG9kIGludm9jYXRpb24uCi0JICogKGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKTwvY29kZT4pLiBGb3IgdGhpcyB0aGUgImphdmEubGFuZy5TdHJpbmciIElCZWFuVHlwZVByb3h5IGlzIHRoZSB0eXBlIHJlY2VpdmVyLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdW51c3VhbCBpbiB0aGF0IHRoZXJlIGlzIG5vIGZvckV4cHJlc3Npb24uIEl0IGlzbid0IG5lZWRlZCBiZWNhdXNlIHRoZXNlIGFyZSBvbmx5IHZhbGlkCi0JICogaW4gY2VydGFpbiBzaXR1YXRpb25zIChtZXRob2Qgb3IgZmllbGQgcmVjZWl2ZXIpIGFuZCBpZiB1c2VkIGFueXdoZXJlIGVsc2UgaXQgaXMgYW4gZXJyb3IuCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhpcyBpcyB0aGUgdHlwZS4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQgYW5kIGlmIGFuIGlubmVyIGNsYXNzLCBpdCBtdXN0IGhhdmUgdGhlICIkIiBmb3JtYXQuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUeXBlUmVjZWl2ZXIoU3RyaW5nIHR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSB0eXBlIHJlY2VpdmVyLiBUaGlzIGlzIHdoZXJlIGEgdHlwZSBpcyB1c2VkIGFzIHRoZSByZWNlaXZlciBvZiBhIGZpZWxkIGFjY2VzcyBvciBhIG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqIChlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCk8L2NvZGU+KS4gRm9yIHRoaXMgdGhlICJqYXZhLmxhbmcuU3RyaW5nIiBJUHJveHlCZWFuVHlwZSBpcyB0aGUgdHlwZSByZWNlaXZlci4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVudXN1YWwgaW4gdGhhdCB0aGVyZSBpcyBubyBmb3JFeHByZXNzaW9uLiBJdCBpc24ndCBuZWVkZWQgYmVjYXVzZSB0aGVzZSBhcmUgb25seSB2YWxpZAotCSAqIGluIGNlcnRhaW4gc2l0dWF0aW9ucyAobWV0aG9kIG9yIGZpZWxkIHJlY2VpdmVyKSBhbmQgaWYgdXNlZCBhbnl3aGVyZSBlbHNlIGl0IGlzIGFuIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFRoaXMgaXMgdGhlIHR5cGUgcHJveHkuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVR5cGVSZWNlaXZlcihJUHJveHlCZWFuVHlwZSB0eXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgYm9vbGVhbiBwcmltaXRpdmUgbGl0ZXJhbCAoZS5nLiA8Y29kZT50cnVlPC9jb2RlPikuCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGJvb2xlYW4gdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgY2hhcmFjdGVyIGxpdGVyYWwgKGUuZy4gPGNvZGU+J2EnPC9jb2RlPiBvciA8Y29kZT4nXG4nPC9jb2RlPikKLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgY2hhcmFjdGVyIHZhbHVlIGZvciB0aGlzIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgY2hhciB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIGJ5dGUgbGl0ZXJhbCAoZS5nLiA8Y29kZT4oYnl0ZSkxMDwvY29kZT4pCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGJ5dGUgdmFsdWUgZm9yIHRoaXMgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBieXRlIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZG91YmxlIGxpdGVyYWwgKGUuZy4gPGNvZGU+MTBkPC9jb2RlPikKLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgZG91YmxlIHZhbHVlIGZvciB0aGlzIGxpdGVyYWwuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbiwgZG91YmxlIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgZmxvYXQgbGl0ZXJhbCAoZS5nLiA8Y29kZT4xMGY8L2NvZGU+KQotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBmbG9hdCB2YWx1ZSBmb3IgdGhpcyBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGZsb2F0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIGludCBsaXRlcmFsIChlLmcuIDxjb2RlPjEwMDAwMDwvY29kZT4pCi0JICogCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGludCB2YWx1ZSBmb3IgdGhpcyBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGludCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBsb25nIGxpdGVyYWwgKGUuZy4gPGNvZGU+MTBsPC9jb2RlPikKLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbG9uZyB2YWx1ZSBmb3IgdGhpcyBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIGxvbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgc2hvcnQgbGl0ZXJhbCAoZS5nLiA8Y29kZT4oc2hvcnQpMTA8L2NvZGU+KQotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBzaG9ydCB2YWx1ZSBmb3IgdGhpcyBsaXRlcmFsLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uIGZvckV4cHJlc3Npb24sIHNob3J0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHN0cmluZyBsaXRlcmFsIChlLmcuIDxjb2RlPiJhc2RmIjwvY29kZT4pLiBUaGUgdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcsIHdpdGggZXNjYXBlcyBhbHJlYWR5Ci0JICogdHJhbnNsYXRlZCBpbnRvIHRoZSB0cnVlIGNoYXJhY3RlciB2YWx1ZXMuCi0JICogIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdmFsdWUgZm9yIHRoaXMgbGl0ZXJhbC4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVN0cmluZ0xpdGVyYWwoRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgc3ViZXhwcmVzc2lvbi4KLQkgKiA8cD4KLQkgKiBBIHN1YmV4cHJlc3Npb24gYWxsb3dzLCBhdCBhbnkgdGltZSwgdG8gZm9yayBvZmYgdGhlIGV4cHJlc3Npb24gc3RhY2sgYW5kIGRvIHNvbWUgb3RoZXIgc2V0cyBvZiBleHByZXNzaW9ucy4KLQkgKiBXaGVuIHRoZSBjb29yZXNwb25kaW5nIHtAbGluayAjY3JlYXRlU3ViZXhwcmVzc2lvbkVuZCgpfSBpcyBjYWxsZWQsIGFsbCBvZiB0aGUgZXhwcmVzc2lvbiByZXN1bHRzIG9uIHRoZQotCSAqIHN0YWNrIHRoYXQgYWNjdW11bGF0ZWQgZHVyaW5nIHRoZSBzdWJleHByZXNzaW9uIGV2YWx1YXRpb24gd2lsbCBiZSB0aHJvd24gYXdheSBhbmQgdGhlIHN0YWNrIHdpbGwgYmUKLQkgKiB3aGF0IGl0IHdhcyBhdCB0aGUgc3RhcnQgb2Ygc3ViZXhwcmVzc2lvbi4gQW55IEV4cHJlc3Npb25Qcm94aWVzIHRoYXQgd2VyZSByZXNvbHZlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gCi0JICogd2lsbCBub3QgYmUgdGhyb3duIGF3YXkgYW5kIHdpbGwgc3RpbGwgYmUgdmFsaWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VmdWwgaWYgaW4gdGhlIG1pZGRsZSBvZiBhbiBleHByZXNzaW9uIChzdWNoIGFzIG1ldGhvZCBpbnZvY2F0aW9uIGFuZCBhbiBhcmd1bWVudCBpcyBuZWVkZWQpIHRvCi0JICogZ28gb2ZmIGFuZCBnZXQgdGhlIG5lY2Vzc2FyeSB2YWx1ZS4gVGhpcyB3aWxsIGFsbG93IGV4cHJlc3Npb25zIHRoYXQgcmVxdWlyZSBST09URVhQUkVTU0lPTiBzdGF0ZSBsaWtlIGEgCi0JICogdHJ5L2NhdGNoLiBJZiB5b3Uga25vdyB0aGUgZXhwcmVzc2lvbiBkb2Vzbid0IG5lZWQgdGhpcywgdGhlbiBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBub3QgdXNlIHN1YmV4cHJlc3Npb24uCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGU6Ci0JICogPHByZT48Y29kZT4KLQkgKiAgIG5ldyBYWVooCi0JICogICAgIHsoc3ViZXhwcmVzc2lvbikKLQkgKiAgICAgIHRyeSB7Ci0JICogICAgICAgICB4ID0gMyp5LmdldCgpOwotCSAqICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgKiAgICAgICAgIHggPTQ7Ci0JICogICAgICB9Ci0JICogICAgIChlbmQgc3ViZXhwcmVzc2lvbil9Ci0JICogICAgIHgpOwotCSAqIDwvY29kZT48L3ByZT4KLQkgKiAKLQkgKiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgd2UgbmVlZGVkIHRvIGNhbGN1bGF0ZSAieCIgYXMgdGhlIGFyZ3VtZW50IGZvciBYWVosIGJ1dCBpdCB3YXMgdG9vIGNvbXBsaWNhdGVkIGFuZAotCSAqIGNvdWxkIHRocm93IGV4Y2VwdGlvbnMuIFNvIHdlIHVzZWQgYSBzdWJleHByZXNzaW9uIGluc3RlYWQuIAotCSAqIDxwPgotCSAqIE9mIGNvdXJzZSB0aGUgZm9sbG93aW5nIHdvdWxkIG9mIGJlZW4gdGhlIGJldHRlciB3YXkgdG8gZG8gaXQgd2l0aG91dCBzdWJleHByZXNzaW9ucy4gQnV0IHNvbWV0aW1lcwotCSAqIHlvdXIgY29kZSBpcyBpbiBhIHBvc2l0aW9uIHRoYXQgeW91IGRvbid0IGtub3cgeW91IG5lZWQgdG8gZG8gdGhpcyB1bnRpbCBpdCBpcyB0b28gbGF0ZS4KLQkgKiAgPHByZT48Y29kZT4KLQkgKiAgIHRyeSB7Ci0JICogICAgICB4ID0gMyp5LmdldCgpOwotCSAqICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgKiAgICAgIHggPTQ7Ci0JICogICB9Ci0JICogICBuZXcgWFlaKHgpOwotCSAqIDwvY29kZT48L3ByZT4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVN1YmV4cHJlc3Npb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZVN1YmV4cHJlc3Npb25FbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBleHByZXNzaW9uIHRoYXQgaGFzIGFuIGV4aXN0aW5nIGJlYW4gcHJveHkgYXMgaXRzIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uIFRoaXMgaXMgZm9yIHdoYXQgZXhwcmVzc2lvbiB0aGlzIGV4cHJlc3Npb24gaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiBAcGFyYW0gcHJveHkgVGhlIHByb3h5IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYSB2YWx1ZSwgZWl0aGVyIGEgYmVhbiBwcm94eSBvciBhbiBleHByZXNzaW9uIHByb3h5LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBJUHJveHkgcHJveHkpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQkJCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBiZXR3ZWVuIGEgVmFyaWFibGVSZWZlcmVuY2UgYW5kIGFuIGV4cHJlc3Npb24uIFRoZSBsZWZ0IG9wZXJhbmQgbXVzdCBiZSBhIHZhcmlhYmxlIHJlZmVyZW5jZSAoZS5nLiBGaWVsZEFjY2VzcyBvcgotCSAqIEFycmF5QWNjZXNzKS4gVGhlIHJpZ2h0IG9wZXJhbmQgbWF5IGJlIGFueSBleHByZXNzaW9uIHRoYXQgcmVzdWx0cyBpbiBhIHZhbHVlLgotCSAqIDxwPgotCSAqIDxwcmU+Ci0JICogVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGNyZWF0ZUV4cHJlc3Npb25zIGZvcjoKLQkgKiAgPGNvZGU+QVNTSUdOTUVOVF9MRUZUPC9jb2RlPgotCSAqIAk8Y29kZT5BU1NJR05NRU5UX1JJR0hUPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIEBwYXJhbSBmb3JFeHByZXNzaW9uCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24gZm9yRXhwcmVzc2lvbikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gYXNzaWdubWVudCBleHByZXNzaW9uIChlLmcuIHggPSAzKzQpIHdoZXJlIHggd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgRXhwcmVzc2lvblByb3h5LiAKLQkgKiBJdCBtYXkgYmUgdXNlZCBsYXRlciBvbiBhcyBhIHZhbHVlIGluIHtAbGluayBJRXhwcmVzc2lvbiNjcmVhdGVFeHByZXNzaW9uUHJveHlFeHByZXNzaW9uKGludCwgRXhwcmVzc2lvblByb3h5KX0uCi0JICogT3IgaWYgY2FsbGJhY2tzIHdlcmUgYWRkZWQsIHRoZSBjYWxsYmFja3Mgd291bGQgYmUgY2FsbGVkIHRvIHJldHVybiB0aGUgdHJ1ZSBJQmVhblByb3h5IHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIHByb3h5IHdoZW4gdGhlIGNvbXBsZXRlCi0JICogSUV4cHJlc3Npb24gaGFzIGJlZW4gZXZhbHVhdGVkLiBUaGUgdmFsdWUgb2YgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiAoZS5nLiB4KSB3aWxsIGJlIHBhc3NlZCBvbiBpbnRvIHRoZSBuZXh0IGV4cHJlc3Npb24uCi0JICogPHA+Ci0JICogPHByZT4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbnMgZm9yOgotCSAqIAk8Y29kZT5BU1NJR05NRU5UX1JJR0hUPC9jb2RlPgotCSAqIDwvcHJlPgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBJdCBpcyBndWFyZW50ZWVkIGFzIHBhcnQgb2YgdGhlIGNvbnRyYWN0IHRoYXQgZXhwcmVzc2lvbiBwcm94aWVzIHdpbGwgYmUgbm90aWZpZWQgdGhyb3VnaCB0aGUgbGlzdGVuZXJzIG9mIHRoZSBmaW5hbCBzdGF0ZSBpbiB0aGUKLQkgKiBvcmRlciB0aGUgZXhwcmVzc2lvbiBwcm94aWVzIHdlcmUgY3JlYXRlZC4gCi0JICogQHBhcmFtIGZvckV4cHJlc3Npb24gVGhpcyBpcyBmb3Igd2hhdCBleHByZXNzaW9uIHRoaXMgZXhwcmVzc2lvbiBpcyBiZWluZyBjcmVhdGVkLgotCSAqIEByZXR1cm4gYSBwcm94eSB0byB0aGUgZXhwcmVzc2lvbiB2YWx1ZS4gCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHJlYXNzaWdubWVudCBleHByZXNzaW9uLiBUaGlzIGlzIGxpa2UgdGhlIG9yaWdpbmFsIHByb3h5IGFzc2lnbm1lbnQgZXhjZXB0IHRoYXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBuZXcgcHJveHksIGl0Ci0JICogcmVhc3NpZ25zIHRoZSBuZXcgdmFsdWUgdG8gdGhlIGV4aXN0aW5nIHByb3h5LiBUaGlzIGNhbm5vdCBiZSB1c2VkIG9uIElCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSdzLiBUaGF0IGlzIGJlY2F1c2UKLQkgKiB0aGV5IGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWdpc3RyeSBhbmQgc2V2ZXJlIGVycm9ycyB3b3VsZCBvY2N1ciBpZiB0aGV5IHdlcmUgcmVhc3NpZ25lZC4KLQkgKiA8cD4KLQkgKiA8cHJlPgotCSAqIFRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBjcmVhdGVFeHByZXNzaW9ucyBmb3I6Ci0JICogCTxjb2RlPkFTU0lHTk1FTlRfUklHSFQ8L2NvZGU+Ci0JICogPC9wcmU+Ci0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFNpbmNlIHdlIGFyZSBub3QgY3JlYXRpbmcgYSBuZXcgcHJveHksIHRoZSBub3RpZmljYXRpb24gb24gdGhlIGNhbGxiYWNrcyB3aWxsIGJlIGluIHRoZSBvcmlnaW5hbCBvcmRlciBvZiBwcm94aWVzLiBUaGlzCi0JICogZG9lcyBub3QgY2hhbmdlIHRoZSBub3RpZmljYXRpb24gcG9zaXRpb24gb2YgdGhpcyBwcm94eS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yRXhwcmVzc2lvbgotCSAqIEBwYXJhbSBwcm94eQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGV4cHJlc3Npb24gcHJveHkgaXMgZm9yIGEgQmVhblR5cGUgaW5zdGVhZCBvZiBqdXN0IGEgc3RhbmRhcmQgZXhwcmVzc2lvbiBwcm94eS4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcm94eVJlYXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBmb3JFeHByZXNzaW9uLCBFeHByZXNzaW9uUHJveHkgcHJveHkpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBBIHNpbXBsZSBtZXRob2QgaW52b2NhdGlvbi4gVGhpcyBpcyBhIGhlbHBlciB0byBtYWtlIGl0IGVhc2llciBmb3IgYSBzaW1wbGUgbWV0aG9kIGludm9rZS4gSXQgdXNlcyBvbmx5IHRoZSAKLQkgKiBtZXRob2QgcHJveHkgKG5vdCBhIHN0cmluZyB0byBsb29rIGl0IHVwKSwgaXQgdXNlcyBhIElCZWFuUHJveHkgcmVjZWl2ZXIgKG5vdCBhIGNvbXBsaWNhdGVkIGV4cHJlc3Npb24pLCBhbmQgdGhlCi0JICogYXJndW1lbnRzIGFyZSBhIG1peHR1cmUgb2YgSUJlYW5Qcm94aWVzIGFuZCBFeHByZXNzaW9uUHJveGllcy4gQWxzbyBpdCBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGUgbmV4dAotCSAqIGV4cHJlc3Npb24gbXVzdCBiZSBhIFJvb3RFeHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2QgbWV0aG9kcHJveHkgb2YgdGhlIG1ldGhvZAotCSAqIEBwYXJhbSByZWNlaXZlciB0aGUgcmVjZWl2ZXIgcHJveHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYSBzdGF0aWMgbWV0aG9kCi0JICogQHBhcmFtIGFyZ3VtZW50cyBhcnJheSBvZiBhcmd1bWVudHMsIHdoZXJlIGVhY2ggZWxlbWVudCBjYW4gb25seSBiZSBlaXRoZXIgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgbnVsbCBhcmd1bWVudCwgPGNvZGU+SVByb3h5PC9jb2RlPi4gVGhlIGFycmF5IGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhcmd1bWVudHMuCi0JICogQHBhcmFtIHdhbnRSZXN1bHQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgYW4gRXhwcmVzc2lvblByb3h5IGJhY2ssIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIG9ubHkgdXNlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSByZWFsbHkgbmVlZCB0aGUgZXhwcmVzc2lvbiBwcm94eS4KLQkgKiBAcmV0dXJuIGV4cHJlc3Npb24gcHJveHkgaWYgIndhbnRSZXN1bHQiIHdhcyB0cnVlLCBlbHNlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShJUHJveHlNZXRob2QgbWV0aG9kLCBJUHJveHkgcmVjZWl2ZXIsIElQcm94eVtdIGFyZ3VtZW50cywgYm9vbGVhbiB3YW50UmVzdWx0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBIHNpbXBsZSBmaWVsZCBhY2Nlc3MuIFRoaXMgaXMgYSBoZWxwZXIgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIGEgc2ltcGxlIGZpZWxkIGFjY2Vzcy4gSXQgdXNlcyBvbmx5IHRoZSAKLQkgKiBmaWVsZCBwcm94eSAobm90IGEgc3RyaW5nIHRvIGxvb2sgaXQgdXApLCBhbmQgdGhlIGJlYW4gcHJveHkgdGhhdCBpcyB0aGUgcmVjZWl2ZXIuIEFsc28gaXQgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIG5leHQKLQkgKiBleHByZXNzaW9uIG11c3QgYmUgYSBSb290RXhwcmVzc2lvbi4gSXQgZG9lc24ndCBhbGxvdyBjb21wbGljYXRlZCBmaWVsZCBhY2Nlc3MsIHN1Y2ggYXMgPGNvZGU+ZmllbGRhLmZpZWxkYi5maWVsZGM8L2NvZGU+LgotCSAqIFNpbmNlIHRoaXMgaXMgYSBmaWVsZCBhY2Nlc3MsIGl0IHdpbGwgYWx3YXlzIHJldHVybiBhbiBFeHByZXNzaW9uUHJveHkuIEl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgc2ltcGxlIGZpZWxkIGFjY2VzcwotCSAqIHRoYXQgZG9lc24ndCByZXR1cm4gb25lLgotCSAqIAotCSAqIEBwYXJhbSBmaWVsZCBmaWVsZCBwcm94eSBvZiB0aGUgZmllbGQuCi0JICogQHBhcmFtIHJlY2VpdmVyIHRoZSByZWNlaXZlciBwcm94eS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGZvciBzdGF0aWMgZmllbGRzLgotCSAqIEByZXR1cm4gZXhwcmVzc2lvbiBwcm94eSB0byB0aGUgcmVzdWx0IG9mIHRoZSBhY2Nlc3MuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uUHJveHkgY3JlYXRlU2ltcGxlRmllbGRBY2Nlc3MoSVByb3h5RmllbGQgZmllbGQsIElQcm94eSByZWNlaXZlcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQSBzaW1wbGUgZmllbGQgc2V0LiBUaGlzIGlzIGEgaGVscGVyIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBhIHNpbXBsZSBmaWVsZCBhY2Nlc3MuIEl0IHVzZXMgb25seSB0aGUgCi0JICogZmllbGQgcHJveHkgKG5vdCBhIHN0cmluZyB0byBsb29rIGl0IHVwKSwgYW5kIHRoZSBiZWFuIHByb3h5IHRoYXQgaXMgdGhlIHJlY2VpdmVyLiBBbHNvIGl0IGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBuZXh0Ci0JICogZXhwcmVzc2lvbiBtdXN0IGJlIGEgUm9vdEV4cHJlc3Npb24uIEl0IGRvZXNuJ3QgYWxsb3cgY29tcGxpY2F0ZWQgZmllbGQgYWNjZXNzIHNldHRpbmcsIHN1Y2ggYXMgPGNvZGU+ZmllbGRhLmZpZWxkYi5maWVsZGMgPSAzPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZmllbGQgZmllbGQgcHJveHkgb2YgdGhlIGZpZWxkLgotCSAqIEBwYXJhbSByZWNlaXZlciB0aGUgcmVjZWl2ZXIgcHJveHkuIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzIGEgc3RhdGljIGZpZWxkLgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgcHJveHkgdG8gc2V0IGl0IHRvIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHNldCB0byBudWxsIHZhbHVlLgotCSAqIEBwYXJhbSB3YW50UmVzdWx0IDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IGFuIEV4cHJlc3Npb25Qcm94eSBiYWNrLCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBvbmx5IHVzZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3UgcmVhbGx5IG5lZWQgdGhlIGV4cHJlc3Npb24gcHJveHkuCi0JICogQHJldHVybiBleHByZXNzaW9uIHByb3h5IGlmICJ3YW50UmVzdWx0IiB3YXMgdHJ1ZSwgZWxzZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVTaW1wbGVGaWVsZFNldChJUHJveHlGaWVsZCBmaWVsZCwgSVByb3h5IHJlY2VpdmVyLCBJUHJveHkgdmFsdWUsIGJvb2xlYW4gd2FudFJlc3VsdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQmVnaW4gYSBibG9jay4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogPHA+Ci0JICogRXZlbnR1YWxseSB7QGxpbmsgRXhwcmVzc2lvbiNjcmVhdGVCbG9ja0VuZCgpfSBtdXN0IGJlIGNhbGxlZC4gWW91IHNob3VsZCB1c2UgdGhpcyBwYXR0ZXJuOgotCSAqIDxwcmU+PGNvZGU+Ci0JICogZXhwLmNyZWF0ZUJlZ2luQmxvY2soKTsKLQkgKiB0cnkgewotCSAqICAgZXhwLmNyZWF0ZSBzb21ldGhpbmcgZWxzZS4KLQkgKiAgIC4uLgotCSAqIH0gZmluYWxseSB7Ci0JICogICBleHAuY3JlYXRlRW5kQmxvY2soKTsKLQkgKiB9Ci0JICogPC9jb2RlPjwvcHJlPgotCSAqIAotCSAqIEByZXR1cm4gYmxvY2tudW1iZXIgZm9yIHRoZSBibG9jayBqdXN0IG9wZW5lZC4gQ2FuIGJlIHVzZWQgaW4ge0BsaW5rIEV4cHJlc3Npb24jY3JlYXRlQmxvY2tCcmVhayhpbnQpfS4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnQgY3JlYXRlQmxvY2tCZWdpbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogRG9lcyBhIGJyZWFrIGZvciB0aGUgc3BlY2lmaWVkIGJsb2NrIG51bWJlci4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogQHBhcmFtIGJsb2NrTnVtYmVyCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVCbG9ja0JyZWFrKGludCBibG9ja051bWJlcikgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEVuZCBhIGJsb2NrLiBJdCB3aWxsIGFsd2F5cyBlbmQgdGhlIGlubmVyIG1vc3QgYmxvY2sgdGhhdCBjdXJyZW50bHkgaXMgb24gdGhlIHN0YWNrLiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgRXhwcmVzc2lvbiNjcmVhdGVCbG9ja0JlZ2luKCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVCbG9ja0VuZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgdHJ5L2NhdGNoIHN0YXRlbWVudC4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2UgYmVmb3JlIHRyeSBlbmQgb3IgdGhpcyBpcyBpbnZhbGlkLgotCSAqIDxwPgotCSAqIFRoaXMgc2hvdWxkIGJlIGV4ZWN1dGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgotCSAqIDxwcmU+PGNvZGU+Ci0JICogZXhwLmNyZWF0ZVRyeSgpOwotCSAqIHRyeSB7Ci0JICogICAuLi4gY3JlYXRlIG90aGVyIGV4Y2VwdGlvbnMgLi4uCi0JICogICAuLi4gY3JlYXRlIGNhdGNoL2ZpbmFsbHkgY2xhdXNlcyBhcyBuZWVkZWQuCi0JICogfSBmaW5hbGx5IHsKLQkgKiAgIGlmIChleHAuaXNWYWxpZCgpKQotCSAqICAgICBleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JICogfQotCSAqIDwvY29kZT48L3ByZT4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRyeSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0JCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBjYXRjaCBjbGF1c2UgZm9yIHRoZSBpbm5lciBtb3N0IHRyeSBzdGF0ZW1lbnQuIE5vIG5lZWQgZm9yIGEgZm9yRXhwcmVzc2lvbiBiZWNhdXNlIGl0IG11c3QgY3VycmVudGx5IGJlIGF0IFJPT1RFWFBSRVNTSU9OLgotCSAqIDxwPgotCSAqIFVzaW5nIHRoaXMgeW91IGNhbiBnZXQganVzdCB0aGUgZXhjZXB0aW9uIGFzIGEgcHJveHkgYW5kL29yIGV4ZWN1dGUgc29tZSBleHByZXNzaW9ucyBhcyBwYXJ0IG9mIHRoZSBjYXRjaCBjbGF1c2UuCi0JICogPHA+Ci0JICogVGhpcyBjYW4gYmUgZm9sbG93ZWQgYnkgUm9vdEV4cHJlc3Npb25zLCBvciBhbm90aGVyIGNhdGNoLCBvciBhIGZpbmFsbHksIG9yIGEgdHJ5IGVuZC4KLQkgKiAgCi0JICogQHBhcmFtIGV4Y2VwdGlvblR5cGUgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiB0byBjYXRjaCBvbi4KLQkgKiBAcGFyYW0gd2FudEV4Y2VwdGlvblJldHVybmVkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IGFuIGV4cHJlc3Npb24gcHJveHkgZm9yIHRoZSBleGNlcHRpb24uCi0JICogQHJldHVybiB0aGUgRXhwcmVzc2lvblByb3h5IGZvciB0aGUgZXhjZXB0aW9uIGlmIDxjb2RlPndhbnRFeGNlcHRpb25SZXR1cm5lZDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVUcnlDYXRjaENsYXVzZShJUHJveHlCZWFuVHlwZSBleGNlcHRpb25UeXBlLCBib29sZWFuIHdhbnRFeGNlcHRpb25SZXR1cm5lZCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgY2F0Y2ggY2xhdXNlIGZvciB0aGUgaW5uZXIgbW9zdCB0cnkgc3RhdGVtZW50LiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiA8cD4KLQkgKiBVc2luZyB0aGlzIHlvdSBjYW4gZ2V0IGp1c3QgdGhlIGV4Y2VwdGlvbiBhcyBhIHByb3h5IGFuZC9vciBleGVjdXRlIHNvbWUgZXhwcmVzc2lvbnMgYXMgcGFydCBvZiB0aGUgY2F0Y2ggY2xhdXNlLgotCSAqIDxwPgotCSAqIFRoaXMgY2FuIGJlIGZvbGxvd2VkIGJ5IFJvb3RFeHByZXNzaW9ucywgb3IgYW5vdGhlciBjYXRjaCwgb3IgYSBmaW5hbGx5LCBvciBhIHRyeSBlbmQuCi0JICogIAotCSAqIEBwYXJhbSBleGNlcHRpb25UeXBlIHRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24gdG8gY2F0Y2ggb24uCi0JICogQHBhcmFtIHdhbnRFeGNlcHRpb25SZXR1cm5lZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBhbiBleHByZXNzaW9uIHByb3h5IGZvciB0aGUgZXhjZXB0aW9uLgotCSAqIEByZXR1cm4gdGhlIEV4cHJlc3Npb25Qcm94eSBmb3IgdGhlIGV4Y2VwdGlvbiBpZiA8Y29kZT53YW50RXhjZXB0aW9uUmV0dXJuZWQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGNyZWF0ZVRyeUNhdGNoQ2xhdXNlKFN0cmluZyBleGNlcHRpb25UeXBlLCBib29sZWFuIHdhbnRFeGNlcHRpb25SZXR1cm5lZCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjs7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmaW5hbGx5IGNsYXVzZSBmb3IgdGhlIGlubmVyIG1vc3QgdHJ5IHN0YXRlbWVudC4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogVGhlcmUgbXVzdCBiZSBubyBtb3JlIGNhdGNoIGNsYXVzZXMgZm9yIHRoZSB0cnkgc3RhdGVtZW50IGFmdGVyIHRoaXMgZmluYWxseSBjbGF1c2UuCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjs7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBlbmQgb2YgdGhlIGlubmVyIG1vc3QgdHJ5IHN0YXRlbWVudC4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogVGhlcmUgbXVzdCBiZSBubyBtb3JlIGNhdGNoL2ZpbmFsbHkgY2xhdXNlcyBhZnRlciB0aGlzIGV4Y2VwdCBpZiBhIG5ldyB0cnkgc3RhdGVtZW50IGlzIHN0YXJ0ZWQuCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUcnlFbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOzsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSB0aHJvdy4gTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogVGhlIG5leHQgZXhwcmVzc2lvbiBpcyB0aGUgZXhjZXB0aW9uIHRvIGJlIHRocm93bi4KLQkgKiA8cD4KLQkgKiBUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgY3JlYXRlRXhwcmVzc2lvbiBmb3I6Ci0JICogCTxjb2RlPlRIUk9XX09QRVJBTkQ8L2NvZGU+Ci0JICogIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVGhyb3coKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHJldGhyb3cuIFRoaXMgbXVzdCBiZSB3aXRoaW4gYSBjYXRjaCBjbGF1c2Ugb3IgdGhlcmUgaXMgYW4gZXJyb3IuCi0JICogPHA+IAotCSAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3I6Ci0JICogPHByZT48Y29kZT4KLQkgKiB0cnkgewotCSAqICAgLi4gZG8gc29tZXRoaW5nIC4uCi0JICogfSBjYXRjaCAoQW5FeGNlcHRpb24gZSkgewotCSAqICAgLi4gZG8gc29tZXRoaW5nIC4uCi0JICogICB0aHJvdyBlOwotCSAqIH0KLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVSZXRocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotCQotCS8qKgotCSAqIE1hcmsgdGhlIGV4cHJlc3Npb24gc3RhY2sgc28gdGhhdCBpZiB0aGVyZSBhcmUgSWxsZWdhbFN0YXRlRXhjZXB0aW9ucyBlcnJvcnMgdGhhdCB3b3VsZCBtYWtlIHRoZQotCSAqIGV4cHJlc3Npb24gaW52YWxpZCwgeW91IGNhbiByZXN0b3JlIGJhY2sgdG8gdGhpcyBtYXJrIHBvaW50IGFuZCB0aGUgZXhwcmVzc2lvbiB3aWxsIG5vdyBiZSB2YWxpZAotCSAqIGFnYWluIGFuZCBhdCB0aGUgc3RhdGUgaXQgd2FzIHdoZW4gbWFyayB3YXMgY3JlYXRlZC4gQWxsIG1hcmtzIG11c3QgYmUgZW5kZWQsIGFuZCBhdCB0aGUgc2FtZSBuZXN0aW5nCi0JICogbGV2ZWwuCi0JICogPHA+Ci0JICogTm8gbmVlZCBmb3IgYSBmb3JFeHByZXNzaW9uIGJlY2F1c2UgaXQgbXVzdCBjdXJyZW50bHkgYmUgYXQgUk9PVEVYUFJFU1NJT04uCi0JICogPHA+Ci0JICogSXQgbXVzdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggZW5kTWFyay4gWW91IG11c3QgdXNlIDxjb2RlPm1hcms7dHJ5L2ZpbmFsbHl7ZW5kTWFyazt9PC9jb2RlPiBiZWNhdXNlCi0JICogdGhlIG1hcmsvZW5kTWFyayBtdXN0IG1hdGNoIHVwLiAKLQkgKiA8cHJlPjxjb2RlPgotCSAqIGludCBtYXJrID0gZXhwcmVzc2lvbi5tYXJrKCk7Ci0JICogdHJ5IHsKLQkgKiAgIGV4cHJlc3Npb24uY3JlYXRlIC4uLgotCSAqIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JICogICBwcm9jZXNzIHRoZSBlcnJvci4KLQkgKiB9IGZpbmFsbHkgewotCSAqICAgZXhwcmVzc2lvbi5lbmRNYXJrKG1hcmspOyAvLyBBZnRlciB0aGlzLCB0aGUgZXhwcmVzc2lvbiB3aWxsIGJlIHZhbGlkIGFnYWluLgotCSAqIH0KLQkgKiA8L2NvZGU+PC9wcmU+Ci0JICogPHA+Ci0JICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGJlIGludmFsaWQgbmVzdGluZywgYW5kIHdpbGwgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG9uIHRoZSBjcmVhdGVUcnlFbmQuIFRoaXMgaXMgYmVjYXVzZQotCSAqIHdlIHRyaWVkIHRvIGVuZCB0aGUgVHJ5IHN0YXRlbWVudCB3aXRoaW4gdGhlIG1hcmsuIFRoaXMgaXMgaW52YWxpZCBiZWNhdXNlIGlmIHdlIGxldCBpdCBnbyB0aHJvdWdoIGl0IHdvdWxkCi0JICogb2YgcG9wcGVkIHRoZSBzdGFjayBhbmQgd2hlbiB3ZSBnb3QgdG8gdGhlIGVuZE1hcmsgdGhlIHN0YWNrIHdvdWxkIG9mIGJlZW4gcG9wcGVkIHBhc3QgaXQgYW5kIGl0IGNvdWxkIG5vdAotCSAqIGJlIHJlc3RvcmVkIHRvIHRoZSBzYW1lIHN0YXRlIGFzIGl0IHdhcyBhdCB0aGUgdGltZSBvZiB0aGUgbWFyay4gVGhlIHRyeSB3b3VsZCBvZiBhbHJlYWR5IGJlZW4gZW5kZWQuCi0JICogPHByZT48Y29kZT4KLQkgKiBleHByZXNzaW9uLmNyZWF0ZVRyeSgpOwotCSAqIGludCBtYXJrID0gZXhwcmVzc2lvbi5tYXJrKCk7Ci0JICogdHJ5IHsKLQkgKiAgIGV4cHJlc3Npb24uY3JlYXRlIC4uLgotCSAqICAgZXhwcmVzc2lvbi5jcmVhdGVUcnlFbmQoKTsKLQkgKiB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCSAqICAgcHJvY2VzcyB0aGUgZXJyb3IuIFRoZSBleHByZXNzaW9uIGlzIG5vdyBpbnZhbGlkLgotCSAqIH0gZmluYWxseSB7Ci0JICogICBleHByZXNzaW9uLmVuZE1hcmsobWFyayk7IC8vIEFmdGVyIHRoaXMsIHRoZSBleHByZXNzaW9uIHdpbGwgYmUgdmFsaWQgYWdhaW4sIGlmIGl0IGhhZCBnb25lIGludmFsaWQuCi0JICogfQotCSAqIDwvY29kZT48L3ByZT4KLQkgKiA8cD4KLQkgKiBJZiBub3QgYXQgUm9vdEV4cHJlc3Npb24gYXQgdGltZSBvZiBtYXJrKCkgcmVxdWVzdCwgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqIEByZXR1cm4gbWFyayBudW1iZXIsIHRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCBpbiB0aGUgY29vcmVzcG9uZGluZyBlbmRNYXJrLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbiNlbmRNYXJrKGludCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50IG1hcmsoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFRoZSBlbmQgbWFyayBmb3IgYSBtYXJrLiAKLQkgKiA8cD4KLQkgKiBObyBuZWVkIGZvciBhIGZvckV4cHJlc3Npb24gYmVjYXVzZSBpdCBtdXN0IGN1cnJlbnRseSBiZSBhdCBST09URVhQUkVTU0lPTi4KLQkgKiBAcGFyYW0gbWFya051bWJlcgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBJRXhwcmVzc2lvbiNtYXJrKCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRNYXJrKGludCBtYXJrTnVtYmVyKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUV4dGVuc2lvblJlZ2lzdHJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUV4dGVuc2lvblJlZ2lzdHJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDEzOGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lFeHRlbnNpb25SZWdpc3RyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJRXh0ZW5zaW9uUmVnaXN0cmF0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDYvMTUgMjA6MTk6MTEgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBFeHRlbnNpb25zIHBvaW50ICgiZXh0ZW5zaW9ucyIgZWxlbWVudHMgb2YgdGhlICJvcmcuZWNsaXBzZS5qZW0ucHJveHkuY29udHJpYnV0b3JzIiBleHRlbnNpb24gcG9pbnQpLgotICogPHA+Ci0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIGNhbGxlZCB3aGVuIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RyeSB0eXBlIGZvciBhIGdpdmVuIGNsYXNzUGF0aC9wbHVnaW4gaXMgcHJlc2VudC4KLSAqIEl0IGlzIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIHJlZ2lzdHJ5IHR5cGUgc3BlY2lmaWMgZXh0ZW5zaW9ucy4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbnNpb25SZWdpc3RyYXRpb24gewotCQotCS8qKgotCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGFueSBjb250cmlidXRlVG9SZWdpc3RyeSdzIGhhdmUgYmVlbiBjYWxsZWQuIFR5cGljYWxseSBhbGwgdGhhdAotCSAqIHNob3VsZCBiZSBkb25lIGluIGhlcmUgaXMgdG8gcmVnaXN0ZXIgZXh0ZW5zaW9uIGZhY3RvcmllcyBvciBjb25zdGFudHMuIEl0IGlzIGJlc3QgaWYgbm8KLQkgKiBhY3R1YWwgcHJveHkgY2FsbHMgYXJlIG1hZGUuIFRoaXMgaXMgYmVjYXVzZSB0aGUgcmVnaXN0cnkgZG9lcyBub3QgeWV0IGhhdmUgYWxsIG9mIHRoZSAKLQkgKiBhcHByb3ByaWF0ZSBleHRlbnNpb25zIHJlZ2lzdGVyZWQgYW5kIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGFjY2lkZW50bHkgcmVmZXJlbmNlIGEgYmVhbiB0eXBlCi0JICogdGhhdCBoYXMgbm90IHlldCBoYWQgaXRzIGFwcHJvcHJpYXRlIGZhY3RvcnkgcmVnaXN0ZXJlZC4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGlmIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSBleHRlbnNpb24gb3IgaWYgdXNlZCBpbiBhIHBsdWdpbiBhbmQgYSBjb250YWluZXIgcGF0aCBhbmQgYm90aCBhcmUgZm91bmQuCi0JICogU2hvdWxkIHRha2UgdGhpcyBpbnRvIGFjY291bnQgYW5kIG5vdCByZWdpc3RlciB0d2ljZS4KLQkgKiBAcGFyYW0gYmFzZVJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGJhc2VSZWdpc3RyeSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lGaWVsZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JRmllbGRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBhYzNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lGaWVsZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUZpZWxkUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotLyoqCi0gKiBBIFByb3h5IHRvIGEgZmllbGQgdGhhdCBhbGxvd3MgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIHJldHJpZXZlZCBhbmQgc2V0Ci0gKiBUaGlzIGFsbG93cyB0YXJnZXQgVk0gcHJveHlpbmcgb2YgdGhlIGZpZWxkIGFuZCBpcyBhbmFsYWdvdXMgdG8gdGhlIGphdmEubGFuZy5SZWZsZWN0LkZpZWxkCi0gKiBpbiB0aGUgc2FtZSB3YXkgSU1ldGhvZFByb3h5IGlzIGFuYWxhZ291cyB0byBqYXZhLmxhbmcuUmVmbGVjdC5NZXRob2QKLSAqIENyZWF0aW9uIGRhdGU6ICgxLzE3LzAwIDEyOjE3OjUyIFBNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmllbGRQcm94eSBleHRlbmRzIElBY2Nlc3NpYmxlT2JqZWN0UHJveHksIElQcm94eUZpZWxkIHsKLS8qKgotICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KLSAqLwotSUJlYW5UeXBlUHJveHkgZ2V0RmllbGRUeXBlKCk7Ci0KLS8qKgotICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB1cyBvbiB0aGUgc3ViamVjdCBhcmd1bWVudC4KLSAqIElmIHRoZSBmaWVsZCBpcyBhIHByaW1pdGl2ZSB0eXBlLCB0aGUgcmV0dXJuIHByb3h5Ci0gKiB3aWxsIGJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSB0b28uICAKLSAqIENyZWF0aW9uIGRhdGU6ICgxLzE3LzAwIDEyOjI4OjQ4IFBNKQotICovCi1JQmVhblByb3h5IGdldChJQmVhblByb3h5IGFTdWJqZWN0KSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0KLS8qKgotICogU2V0IHRoZSBhcmd1bWVudCBhcyB0aGUgZmllbGQgdmFsdWUgb24gdGhlIHN1YmplY3QKLSAqIENyZWF0aW9uIGRhdGU6ICgxLzE3LzAwIDEyOjI4OjQ4IFBNKQotICovCi12b2lkIHNldChJQmVhblByb3h5IGFTdWJqZWN0LCBJQmVhblByb3h5IGFyZ3VtZW50KSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lJbnRlZ2VyQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JSW50ZWdlckJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWJlOWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lJbnRlZ2VyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSUludGVnZXJCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYW4gaW50ZWdlciBiZWFuIHByb3h5LgotICogV2Ugb3JpZ2luYWxseSBoYWQgb25seSBhbiBJbnRlZ2VyIHByb3h5LAotICogc28gdGhlIHVzZSBvZiBpdCB3YXMgdGhyb3VnaG91dCB0aGUgc3lzdGVtLgotICogV2UgYXJlIG5vdyBzdXBwb3J0aW5nIE51bWJlciBpbnN0ZWFkLCBidXQKLSAqIGJlY2F1c2UgdGhlcmUgd2VyZSBzbyBtYW55IHBsYWNlcyB1c2luZyBpbnQsCi0gKiB3ZSd2ZSBsZWZ0IGl0IGluLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjQyIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW50ZWdlckJlYW5Qcm94eSBleHRlbmRzIElOdW1iZXJCZWFuUHJveHkgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUludm9rYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSUludm9rYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE5MDRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lJbnZva2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElJbnZva2FibGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgaW52b2tpbmcgbWV0aG9kIGNhbGxzIG9uIHRoZSB2bS4KLSAqIElNZXRob2RQcm94eSBpbXBsZW1lbnRzIGl0IGZvciB3aGVuIHlvdSBoYXZlIGEgbWV0aG9kIHByb3h5IGF2YWlsYWJsZSwKLSAqIGJ1dCB5b3UgY2FuIGFsc28gZ2V0IGEgc3RyYWlnaHQgaW52b2thYmxlIHdoaWNoIHdpbGwgZ2V0IHRoZQotICogcHJveHkgb24gdGhlIHZtIGF0IHRoZSB0aW1lIG9mIGV4ZWN1dGlvbi4KLSAqIDxwPgotICogVGhlIG1ldGhvZCBwcm94eSBmYWN0b3J5IGNhbiBiZSB1c2VkIHRvIHJldHVybiBlaXRoZXIgbWV0aG9kCi0gKiBwcm94aWVzIHdoZW4gdGhlIGludm9rYWJsZSB3aWxsIGJlIHVzZWQgb3ZlciBhbmQgb3ZlciwgYW5kCi0gKiBpdCBjYW4gcmV0dXJuIElJbnZva2FibGUncyB3aGVuIGl0IGlzIG9uZSBzaG90IGRlYWwuIFRob3VnaCBldmVuCi0gKiB3aGVuIG9uZS1zaG90IGRlYWwgaXQgY2FuIGJlIHVzZWQgb3ZlciBhbmQgb3Zlci4gVGhlcmUgaXMganVzdCBvdmVyaGVhZCBiZWNhdXNlIHRoZSAKLSAqIG1ldGhvZCBpcyBsb29rZWQgdXAgZWFjaCB0aW1lLiBTbyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZSB3b3VsZCBiZSBpZgotICogdXNpbmcgaXQgaW5mcmVxdWVudGx5IG9yIHVzZSBjbG9zZWx5IHRvZ2V0aGVyIG9uY2Ugb3IgdHdpY2UgaXQgaXMgYmV0dGVyCi0gKiB0byB1c2UgYSBJbnZva2FibGUgaW5zdGVhZCBvZiBhIG1ldGhvZCBwcm94eS4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnZva2FibGUgewotCi0JLyoqCi0JICogSW52b2tlIHVzIG9uIHRoZSBzdWJqZWN0Ci0JICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MTIgQU0pCi0JICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotCSAqLwotCUlCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi0JLyoqCi0JICogSW52b2tlIHVzIG9uIHRoZSBzdWJqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudAotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgYXJndW1lbnQpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQotCS8qKgotCSAqIEludm9rZSB1cyBvbiB0aGUgc3ViamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzCi0JICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MTIgQU0pCi0JICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotCSAqLwotCUlCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eVtdIGFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZVByb3h5OwotCi0JLyoqCi0JICogSW52b2tlIHVzIG9uIHRoZSBzdWJqZWN0LCBob3dldmVyIGNhdGNoIGFsbCBleGNlcHRpb25zCi0JICogT25seSB0byBiZSB1c2VkIHdoZW4geW91IGRvbid0IHdhbnQgVGhyb3dhYmxlRXhjZXB0aW9ucy4gVGhpcyBzaG91bGQKLQkgKiBub3QgYmUgdGhlIG5vcm1hbCB3YXkgdG8gaW52b2tlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QpOwotCi0JLyoqCi0JICogSW52b2tlIHVzIG9uIHRoZSBzdWJqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudCwgaG93ZXZlciBjYXRjaCBhbGwgZXhjZXB0aW9ucwotCSAqIE9ubHkgdG8gYmUgdXNlZCB3aGVuIHlvdSBkb24ndCB3YW50IFRocm93YWJsZUV4Y2VwdGlvbnMuIFRoaXMgc2hvdWxkCi0JICogbm90IGJlIHRoZSBub3JtYWwgd2F5IHRvIGludm9rZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTozNzoxMiBBTSkKLQkgKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0JICovCi0JSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IGFyZ3VtZW50KTsKLQotCS8qKgotCSAqIEludm9rZSB1cyBvbiB0aGUgc3ViamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLCBob3dldmVyIGNhdGNoIGFsbCBleGNlcHRpb25zCi0JICogT25seSB0byBiZSB1c2VkIHdoZW4geW91IGRvbid0IHdhbnQgVGhyb3dhYmxlRXhjZXB0aW9ucy4gVGhpcyBzaG91bGQKLQkgKiBub3QgYmUgdGhlIG5vcm1hbCB3YXkgdG8gaW52b2tlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBhcmd1bWVudHMpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTWV0aG9kUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjEyMWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSU1ldGhvZFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIE1ldGhvZCBQcm94aWVzIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM2OjI5IEFNKQotICogCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RQcm94eSBleHRlbmRzIElBY2Nlc3NpYmxlT2JqZWN0UHJveHksIElJbnZva2FibGUsIElQcm94eU1ldGhvZCB7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIGNsYXNzIHRoZSBtZXRob2QgaXMgZGVmaW5lZCBpbi4gQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MTIgQU0pCi0JICogCi0JICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotCSAqLwotCUlCZWFuVHlwZVByb3h5IGdldENsYXNzVHlwZSgpOwotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MTIgQU0pCi0JICogCi0JICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiB0aGUgbWV0aG9kIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjEyIEFNKQotCSAqIAotCSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLQkgKi8KLQlJQmVhblR5cGVQcm94eVtdIGdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6Mzc6MTIgQU0pCi0JICogCi0JICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotCSAqLwotCUlCZWFuVHlwZVByb3h5IGdldFJldHVyblR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTBiMWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lNZXRob2RQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElNZXRob2RQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG1ldGhvZCBwcm94aWVzLgotICogCi0gKiBUaGUgZmFjdG9yeSBleGlzdHMgZm9yIHVzZSwgYnV0IGdlbmVyYWxseSBpdCBpcyBiZXR0ZXIgdG8gZ28gdGhyb3VnaCB0aGUgYmVhbiB0eXBlIHByb3h5IHRvIGdldCBhIG1ldGhvZCBwcm94eS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgYQotICogYnVuY2ggb2YgbWV0aG9kIHByb3hpZXMgaW4gaW5pdGlhbGl6YXRpb24gcm91dGluZXMgc28geW91IGRvbid0IG5lZWQgdG8gaGF2ZSBhIGJlYW4gdHlwZSBwcm94eSBmb3IgZWFjaC4KLSAqIAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgNjoyMTo1MiBQTSkKLSAqIAotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUHJveHlGYWN0b3J5IGV4dGVuZHMgSUJlYW5Qcm94eUZhY3RvcnkgewotCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIHByb3h5IGZvciB0aGUgc3BlY2lmaWVkIG5hbWUsIGFyZ3VtZW50cyBmcm9tIHRoZSBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiAgICAgICAgICAgIHBhcmFtZXRlciB0eXBlIG5hbWVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBwYXJhbWV0ZXJUeXBlcyBtZWFucyBubyBwYXJhbWV0ZXJzLgotCSAqIEByZXR1cm4gYSBtZXRob2QgcHJveHkgb3IgbnVsbCBpZiBjYW4ndCBiZSBmb3VuZC4gCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIElQcm94eU1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLCBhcmd1bWVudHMgZnJvbSB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVByb3h5RmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZSwgYXJndW1lbnRzIGZyb20gdGhlIGdpdmVuIGNsYXNzLgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JSVByb3h5RmllbGQgZ2V0RmllbGRQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lKTsKLQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpbnZva2FibGUgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZSwgYXJndW1lbnRzIGZyb20gdGhlIGNsYXNzLiBUaGUgbWV0aG9kIHByb3h5IGlzIG5vdCByZXRyaWV2ZWQuIEluc3RlYWQgdGhlIG1ldGhvZCB3aWxsIGJlIGxvb2tlZCB1cAotCSAqIGVhY2ggdGltZSBvbiB0aGUgdm0uIEJlY2F1c2Ugb2YgdGhpcyB0aGVzZSBhcmUgc3VpdGFibGUgb25seSBmb3Igb25lLXNob3QgaW52b2thdGlvbnMuIElmIGl0IGlzIHRvIGJlIGludm9rZWQgb2Z0ZW4sIHRoZW4gYSBtZXRob2QgcHJveHkgc2hvdWxkCi0JICogYmUgcmV0cmlldmVkIGluc3RlYWQuCi0JICogPHA+Ci0JICogVGhvdWdoIHR5cGljYWwgZm9yIG9uZS1zaG90IGRlYWwgdGhlIGludm9rYWJsZSBjYW4gYmUgdXNlZCBvdmVyIGFuZCBvdmVyLiBUaGVyZSBpcyBqdXN0IG92ZXJoZWFkIGJlY2F1c2UgdGhlIG1ldGhvZCBpcyBsb29rZWQgdXAgZWFjaCB0aW1lLiBTbyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZQotCSAqIHdvdWxkIGJlIGlmIHVzaW5nIGl0IGluZnJlcXVlbnRseSBvciBpcyB1c2VkIGNsb3NlbHkgdG9nZXRoZXIgb25jZSBvciB0d2ljZSBpdCBpcyBiZXR0ZXIgdG8gdXNlIGEgSW52b2thYmxlIGluc3RlYWQgb2YgYSBtZXRob2QgcHJveHkuCi0JICogPHA+Ci0JICogTm90ZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZS4gVGhpcyB3b24ndCBiZSBrbm93biB1bnRpbCB0aGUgYWN0dWFsIGludm9rZSBpcyBkb25lLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqICAgICAgICAgICAgcGFyYW1ldGVyIHR5cGUgbmFtZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHBhcmFtZXRlclR5cGVzIG1lYW5zIG5vIHBhcmFtZXRlcnMuCi0JICogQHJldHVybiBhbiBpbnZva2FibGUgCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lOdW1iZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lOdW1iZXJCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwNDI2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JTnVtYmVyQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSU51bWJlckJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi0vKioKLSAqIEludGVyZmFjZSB0byBhbiBpbnRlZ2VyIGJlYW4gcHJveHkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTI6NDIgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOdW1iZXJCZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLS8qKgotICogUmV0dXJuIHRoZSBwcmltaXRpdmUgYnl0ZSB2YWx1ZSBvZiB0aGUgcHJveGllZCBOdW1iZXIKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotYnl0ZSBieXRlVmFsdWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSBwcmltaXRpdmUgZG91YmxlIHZhbHVlIG9mIHRoZSBwcm94aWVkIE51bWJlcgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjU5IEFNKQotICovCi1kb3VibGUgZG91YmxlVmFsdWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSBwcmltaXRpdmUgZmxvYXQgdmFsdWUgb2YgdGhlIHByb3hpZWQgTnVtYmVyCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTI6NTkgQU0pCi0gKi8KLWZsb2F0IGZsb2F0VmFsdWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSBwcmltaXRpdmUgaW50IHZhbHVlIG9mIHRoZSBwcm94aWVkIE51bWJlcgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjU5IEFNKQotICovCi1pbnQgaW50VmFsdWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSBwcmltaXRpdmUgbG9uZyB2YWx1ZSBvZiB0aGUgcHJveGllZCBOdW1iZXIKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotbG9uZyBsb25nVmFsdWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIE51bWJlci4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1Mjo1OSBBTSkKLSAqLwotTnVtYmVyIG51bWJlclZhbHVlKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIHNob3J0IHZhbHVlIG9mIHRoZSBwcm94aWVkIE51bWJlcgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA4OjUyOjU5IEFNKQotICovCi1zaG9ydCBzaG9ydFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUERFQ29udHJpYnV0ZUNsYXNzcGF0aC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxMTQ0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUERFQ29udHJpYnV0ZUNsYXNzcGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBDb250cmlidXRlIHRvIGNsYXNzcGF0aCBQREUgZW50cmllcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGEgbGF1bmNoLgotICogPHA+IAotICogVXNlIHRoZSA8Y29kZT5JTlNUQU5DRSgpPC9jb2RlPiB0byBhY2Nlc3MgdGhlIGNvbnRyaWJ1dG9yLiBJZiB0aGUgdmFsdWUKLSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIFBERSBpcyBub3QgYXZhaWxhYmxlLgotICogCi0gKiBAc2luY2UgMS4wLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJUERFQ29udHJpYnV0ZUNsYXNzcGF0aCB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBJTlNUQU5DRSA9IFBERUNvbnRyaWJ1dGVDbGFzc3BhdGhJbnN0YW5jZS5nZXRJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzc3BhdGggY29udHJpYnV0aW9ucyBmb3IgdGhlIHBsdWdpbnMgaW4gdGhlIGdpdmVuIHByb2plY3QuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGFkZCBpbiB0aGUgbGlicmFyaWVzIGZyb20gYW55IGZyYWdtZW50cyBvZiBhbnkgcGx1Z2luIHRoYXQgdGhpcwotCSAqIHByb2plY3QgcmVmZXJlbmNlcywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCBvdGhlciBwbHVnaW5zLgotCSAqIDxwPgotCSAqIEl0IGlzIHVzZWQgYnkgbGF1bmNoZXMgdG8gZ2V0IHRoZSBmcmFnbWVudCBsaWJyYXJpZXMgc2luY2UgdGhlc2UgYXJlIG5vdAotCSAqIGFkZGVkIGJ5IGRlZmF1bHQgdG8gdGhlIGNsYXNzcGF0aCBmb3IgYSBwcm9qZWN0IGJ5IFBERS4gVGhhdCBpcyBiZWNhdXNlIHRoZXkKLQkgKiBhcmVuJ3QgbmVlZGVkIGZvciBjb21waWxhdGlvbiBwdXJwb3NlcywgYnV0IHRoZXkgYXJlIG5lZWRlZCBmb3IgcnVubmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbGxlciB0aGUgY29udHJvbGxlciB0byBjb250cmlidXRlIHRvLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldFBERUNvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVBvaW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUG9pbnRCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4ZWUxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUG9pbnRCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJUG9pbnRCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBQb2ludCBiZWFuIHByb3h5LgotICogPHA+Ci0gKiBUaGVzZSBhcmUgY29tbW9uIGZvciBkaWZmZXJlbnQgd2luZG93aW5nIHN5c3RlbXMsIGUuZy4gQVdUIGFuZCBTV1QuIFNvIHRoaXMgaGVyZQotICogaXMgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlbS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzcvMDAgMzo0NjozOSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJUG9pbnRCZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLQlwdWJsaWMgaW50IGdldFgoKTsKLQlwdWJsaWMgaW50IGdldFkoKTsKLQlwdWJsaWMgdm9pZCBzZXRYKGludCB4KTsKLQlwdWJsaWMgdm9pZCBzZXRZKGludCB5KTsKLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgeCwgaW50IHkpOwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQb2ludEJlYW5Qcm94eSBwb2ludCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzk2M2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBBIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHByb3hpZXMuIEl0IGlzIHVzZWQgYnkgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yIHRvIGVhc2lseSBkaXN0aW5xdWlzaCBiZXR3ZWVuCi0gKiBhIHByb3h5IGFuZCBhbiBFeHByZXNzaW9uIHByb3h5LiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdHJ5IHRoaXMgcHJveHkgd2FzIGNyZWF0ZWQgd2l0aC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCi0JLyoqCi0JICogSXMgdGhpcyBhIGJlYW4gcHJveHkgKGluY2x1ZGluZyBhbGwgb2YgdGhlIHN1YmludGVyZmFjZXMgb2YgaXQsIGxpa2UgSU1ldGhvZFByb3h5KS4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBiZWFuIHByb3h5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmVhblByb3h5KCk7Ci0KLQkvKioKLQkgKiBJcyB0aGlzIGFuIGV4cHJlc3Npb24gcHJveHkuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGFuIGV4cHJlc3Npb24gcHJveHkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eUJlYW5UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlCZWFuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJlNGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lQcm94eUJlYW5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSVByb3h5QmVhblR5cGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wNS8xOCAxODo0MToyMCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZvciBJQmVhblR5cGVQcm94eSdzIGFuZCBCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSdzIHNvIHRoYXQgd2UgY2FuIGxhemlseQotICogZ2V0IHRoZSBiZWFudHlwZSBwcm94eSBhbmQgaGF2ZSB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzIGl0IHdoZW4gbmVlZGVkLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlCZWFuVHlwZSBleHRlbmRzIElQcm94eSB7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIHR5cGUgd2UgYXJlIHByb3h5aW5nIFRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBGb3IgYXJyYXlzIGl0IHdpbGwgcmV0dXJuIHRoZSBmb3JtYXQ6IFtMY2xhc3NuYW1lOyAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgSVByb3h5TWV0aG9kIGZvciB0aGUgbWV0aG9kIGZyb20gdGhpcyBiZWFudHlwZS4gSXQgbWF5IGJlIGVpdGhlciBhIHJlc29sdmVkIG1ldGhvZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyBhcnJheSBvZiBwYXJhbWV0ZXIgdHlwZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVycy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcyk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHlNZXRob2QgZm9yIHRoZSBtZXRob2QgZnJvbSB0aGlzIGJlYW50eXBlIHdoZXJlIHRoZSBtZXRob2QgaGFzIG5vIGFyZ3VtZW50cy4gSXQgbWF5IGJlIGVpdGhlciBhIHJlc29sdmVkIG1ldGhvZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBnZXRNZXRob2RQcm94eSgpIHRoYXQgdGFrZXMgYXJndW1lbnRzIG5hbWVzIHdoZXJlIHRoZSBuYW1lcyBoYXZlIGJlZW4gc2VudCBhcyBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHlNZXRob2QgZm9yIHRoZSBtZXRob2QgZnJvbSB0aGlzIGJlYW50eXBlLiBJdCBtYXkgYmUgZWl0aGVyIGEgcmVzb2x2ZWQgbWV0aG9kIHByb3h5IChpZiBhbHJlYWR5IHJlc29sdmVkKSBvcgotCSAqIGl0IG1heSBiZSBhbiBFeHByZXNzaW9uUHJveHkgaWYgbm90IHlldCByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIGFycmF5IG9mIHBhcmFtZXRlciB0eXBlcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJhbWV0ZXJzLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJUHJveHl5RmllbGQgZm9yIHRoZSBmaWVsZCBmcm9tIHRoaXMgYmVhbnR5cGUuIEl0IG1heSBiZSBlaXRoZXIgYSByZXNvbHZlZCBmaWVsZCBwcm94eSAoaWYgYWxyZWFkeSByZXNvbHZlZCkgb3IKLQkgKiBpdCBtYXkgYmUgYW4gRXhwcmVzc2lvblByb3h5IGlmIG5vdCB5ZXQgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4N2UwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElQcm94eUNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0gCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIHdpdGggdGhlIHBsdWdpbiB4bWwuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUNvbnN0YW50cyB7Ci0JCi0JLyoqCi0JICogTGF1bmNoIGdyb3VwIGlkIGZvciBwcm94eSBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BST1hZX0xBVU5DSF9HUk9VUCA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTGF1bmNoIGNvbmZpZ3VyYXRpb24gdHlwZSBmb3IgbG9jYWwgcHJveHkuIEl0IGlzIGxvY2FsIGluIHRoYXQgaXQgaXMgb24gdGhlIHNhbWUgbWFjaGluZSwgYnV0IGEgZGlmZmVyZW50Ci0JICogVk0gdGhlbiB0aGUgb25lIHJ1bm5pbmcgdGhlIElERS4gCi0JICogCi0JICogSXQgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIGRlZmF1bHQgY29uZmlnIHR5cGUgd2hlbiBubyBsYXVuY2ggY29uZmlnIHNwZWNpZmllZCBmb3IgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0xBVU5DSF9UWVBFID0gIm9yZy5lY2xpcHNlLmplbS5wcm94eS5Mb2NhbFByb3h5TGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQXR0cmlidXRlIG9uIFByb3h5IExhdW5jaCBDb25maWd1cmF0aW9uOgotCSAqIAotCSAqIEtleSB1c2VkIGluIExhdW5jaCBDb25maWd1cmF0aW9uIGZvciBhdHRhY2hpbmcgQVdUL1N3aW5nIHRvIHRoZSByZWdpc3RyeS4gVGhpcyBtZWFucyBzaW1wbHkKLQkgKiB0aGF0IEFXVC9Td2luZyBzaG91bGQgYmUgdHJlYXRlZCBhcyBiZWluZyBpbiB0aGUgcmVnaXN0cnkgb3Igbm90LiBJdCBkb2Vzbid0IGFjdHVhbGx5IHByZXZlbnQKLQkgKiB0aGVtIGZyb20gYmVpbmcgdGhlcmUuCi0JICoKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgInRydWUiLCBzbyBpdCBzaG91bGQgYmUgc2V0IG9ubHkgdG8gImZhbHNlIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQVdUX1NXSU5HID0gIm9yZy5lY2xpcHNlLmplbS5wcm94eS5BV1QvU3dpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQXR0cmlidXRlIG9uIFByb3h5IExhdW5jaCBDb25maWd1cmF0aW9uOgotCSAqIAotCSAqIEtleSB1c2VkIGluIExhdW5jaCBDb25maWd1cmF0aW9uIGZvciB0aGUgY29udHJpYnV0b3JzIGFuZCByZXR1cm5pbmcgdGhlIHJlZ2lzdHJ5LiBBZnRlciByZXRyaWV2aW5nIGtleSwKLQkgKiBnbyBiYWNrIHRvIFByb3h5TGF1bmNoU3VwcG9ydCB0byByZXRyaWV2ZSB0aGUgY29udHJpYnV0b3JzLiBBbmQgaXQgdXNlcyBpdCB0byByZXR1cm4gdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIE5vdCB0byBiZSBzZXQgYnkgY29udHJpYnV0b3JzLiBUaGlzIHdpbGwgYmUgc2V0IG9ubHkgYnkgdGhlIFByb3h5TGF1bmNoU3VwcG9ydCBzdGFydCBpbXBsZW1lbnRhdGlvbiBtZXRob2RzLgotCSAqIEl0IGlzIGhlcmUgb25seSBiZWNhdXNlIGV4dGVybmFsIGRldmVsb3BlcidzIGxhdW5jaCBjb25maWd1cmF0aW9ucyB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhpcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTEFVTkNIX0tFWSA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkuTGF1bmNoS2V5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEF0dHJpYnV0ZSBvbiBQcm94eSBMYXVuY2ggQ29uZmlndXJhdGlvbjoKLQkgKiAgCi0JICogVk0gdGl0bGUgdXNlZCBmb3IgdGhlIGxhdW5jaCByZWdpc3RyeS4KLQkgKiAKLQkgKiBOb3QgdG8gYmUgc2V0IGJ5IGNvbnRyaWJ1dG9ycy4gVGhpcyB3aWxsIGJlIHNldCBvbmx5IGJ5IHRoZSBQcm94eUxhdW5jaFN1cHBvcnQgc3RhcnQgaW1wbGVtZW50YXRpb24gbWV0aG9kcy4KLQkgKiBJdCBpcyBoZXJlIG9ubHkgYmVjYXVzZSBleHRlcm5hbCBkZXZlbG9wZXIncyBsYXVuY2ggY29uZmlndXJhdGlvbnMgd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoaXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZNX1RJVExFID0gIm9yZy5lY2xpcHNlLmplbS5wcm94eS52bXRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlGaWVsZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5RmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlZjk1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElQcm94eUZpZWxkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLSAKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgSUZpZWxkUHJveHkncyBhbmQgRmllbGRFeHByZXNzaW9uUHJveHkncyBzbyB0aGF0IHdlIGNhbiBsYXppbHkKLSAqIGdldCB0aGUgZmllbGQgcHJveHkgYW5kIGhhdmUgdGhlIGV4cHJlc3Npb24gcHJvY2VzcyBpdCB3aGVuIG5lZWRlZC4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eUZpZWxkIGV4dGVuZHMgSVByb3h5IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVByb3h5TWV0aG9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2ODg2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUHJveHlNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJUHJveHlNZXRob2QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wNS8xMSAxOTowMToxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotIAotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZvciBJTWV0aG9kUHJveHkncyBhbmQgTWV0aG9kRXhwcmVzc2lvblByb3h5J3Mgc28gdGhhdCB3ZSBjYW4gbGF6aWx5Ci0gKiBnZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgaGF2ZSB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzIGl0IHdoZW4gbmVlZGVkLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlNZXRob2QgZXh0ZW5kcyBJUHJveHkgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUmVjdGFuZ2xlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JUmVjdGFuZ2xlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZmJmMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSZWN0YW5nbGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBSZWN0YW5nbGUgYmVhbiBwcm94eS4KLSAqIDxwPgotICogVGhlc2UgYXJlIGNvbW1vbiBmb3IgZGlmZmVyZW50IHdpbmRvd2luZyBzeXN0ZW1zLCBlLmcuIEFXVCBhbmQgU1dULiBTbyB0aGlzIGhlcmUKLSAqIGlzIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZW0uCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC83LzAwIDM6NDY6MzkgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlY3RhbmdsZUJlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotCXB1YmxpYyBpbnQgZ2V0WCgpOwotCXB1YmxpYyBpbnQgZ2V0WSgpOwotCXB1YmxpYyB2b2lkIHNldFgoaW50IHgpOwotCXB1YmxpYyB2b2lkIHNldFkoaW50IHkpOwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCB4LCBpbnQgeSk7Ci0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBvaW50QmVhblByb3h5IHBvaW50KTsKLQkKLQlwdWJsaWMgaW50IGdldEhlaWdodCgpOwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKTsKLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKTsKLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0JcHVibGljIHZvaWQgc2V0U2l6ZShJRGltZW5zaW9uQmVhblByb3h5IGRpbSk7Ci0JCi0JcHVibGljIHZvaWQgc2V0Qm91bmRzKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQlwdWJsaWMgdm9pZCBzZXRCb3VuZHMoSVJlY3RhbmdsZUJlYW5Qcm94eSByZWN0KTsJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDAzOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLQotLyoKLSAqICAkUkNTZmlsZTogSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIFRoZSBTdGFuZGFyZCBiYXNlIGJlYW4gcHJveHkgZmFjdG9yeS4KLSAqIFRoaXMgaXMgdGhlIEludGVyZmFjZSB0aGF0IHRoZSBkZXNrdG9wIHdpbGwgdGFsawotICogdG8uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjowOSBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBleHRlbmRzIElCZWFuUHJveHlGYWN0b3J5IHsKLQkKLS8qKgotICogR2V0IHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1TZXJ2ZXJ9IHByb3h5IGZvciB0aGUKLSAqIHRoaXMgcmVnaXN0cnkuIFRoaXMgaXMgb25seSBuZWVkZWQgaWYgeW91IG5lZWQgdG8gZ2l2ZSB0aGUgSVZNc2VydmVyIHRvIGEgcHJveHkgc28gdGhhdAotICogaXQgY2FuIGFjY2VzcyBpdC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IERvZXMgbm90IG5lZWQgdG8gYmUgZ2l2ZW4gdG8gY2FsbGJhY2sgcHJveGllcyBiZWNhdXNlIHRoZXkgYXJlIGdpdmVuCi0gKiBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1DYWxsYmFja1NlcnZlcn0gb24gaW5pdGlhbGl6YXRpb24sIGFuZAotICogdGhhdCBpbnRlcmZhY2UgaW1wbGVtZW50cyB0aGUgSVZNU2VydmVyIGludGVyZmFjZSB0b28uCi0gKiAKLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IGdldElWTVNlcnZlclByb3h5KCk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcHJpbWl0aXZlIGludGVnZXIgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSUludGVnZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgYVByaW1pdGl2ZUludGVnZXIpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBjaGFyYWN0ZXIgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGNoYXIgYVByaW1pdGl2ZUNoYXJhY3Rlcik7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcHJpbWl0aXZlIGJ5dGUgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGJ5dGUgYVByaW1pdGl2ZUJ5dGUpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBzaG9ydCBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoc2hvcnQgYVByaW1pdGl2ZVNob3J0KTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBwcmltaXRpdmUgbG9uZyBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgobG9uZyBhUHJpbWl0aXZlTG9uZyk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgcHJpbWl0aXZlIGZsb2F0IGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChmbG9hdCBhUHJpbWl0aXZlRmxvYXQpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHByaW1pdGl2ZSBkb3VibGUgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGRvdWJsZSBhUHJpbWl0aXZlRG91YmxlKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBCb29sZWFuIGFyZ3VtZW50Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMTo1MjoyMCBBTSkKLSAqIEBhdXRob3IgSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIElCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQm9vbGVhbiBhQm9vbGVhbik7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgSW50ZWdlciBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKEludGVnZXIgYW5JbnRlZ2VyKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBDaGFyYWN0ZXIgYXJndW1lbnQKLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjUyOjIwIEFNKQotICogQGF1dGhvciBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKENoYXJhY3RlciBhQ2hhcmFjdGVyKTsKLS8qKgotICogUmV0dXJuIGEgbmV3IGJlYW4gcHJveHkgZm9yIHRoZSBOdW1iZXIgYXJndW1lbnQsIGNhbiBoYW5kbGUgYW55IG9mIHRoZSBudW1iZXJzLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoTnVtYmVyIGFOdW1iZXIpOwotLyoqCi0gKiBSZXR1cm4gYSBuZXcgYmVhbiBwcm94eSBmb3IgdGhlIHN0cmluZyBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJU3RyaW5nQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoU3RyaW5nIGFTdHJpbmcpOwotCi0vKioKLSAqIENvbnZlcnQgdGhlIG5vbi1wcmltaXRpdmUgcHJveHkgdG8gYSBwcmltaXRpdmUgcHJveHksIGlmIGl0Ci0gKiBvZiBvbmUgb2YgdGhlIHdyYXBwZXIgdHlwZXMuIElmIG5vdCwgdGhlbiBqdXN0IHJldHVybiB0aGUgcHJveHkgYXMgaXMuCi0gKiA8cD4KLSAqIEkuRS4gQm9vbGVhbkNsYXNzUHJveHkgd2lsbCBjb252ZXJ0IHRvIEJvb2xlYW5UeXBlUHJveHksIGJ1dCBPYmplY3RDbGFzc1Byb3h5IHdpbGwganVzdCByZXR1cm4gdW5jaGFuZ2VkLgotICogQHBhcmFtIG5vblByaW1pdGl2ZVByb3h5Ci0gKiBAcmV0dXJuIGVpdGhlciB0aGUgcHJpbWl0aXZlIHByb3h5IHRoYXQgbm9uUHJpbWl0aXZlIHdyYXBwZXJzLCBvciB0aGUgbm9uLXByaW1pdGl2ZSBpZiBub3QgYSB3cmFwcGVyIHR5cGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBjb252ZXJ0VG9QcmltaXRpdmVCZWFuUHJveHkoSUJlYW5Qcm94eSBub25QcmltaXRpdmVQcm94eSk7Ci0vKioKLSAqIFJldHVybiBhIG5ldyBiZWFuIHByb3h5IGZvciB0aGUgYm9vbGVhbiBhcmd1bWVudAotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTE6NTI6MjAgQU0pCi0gKiBAYXV0aG9yIEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBJQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGJvb2xlYW4gYUJvb2xlYW4pOwotLyoqCi0gKiBDcmVhdGUgYW4gYXJyYXkgYmVhbiBwcm94eS4KLSAqCi0gKiAgIC0gKGludCwgbmV3IGludFsyXSB7MywgNH0pIHdpbGwgY3JlYXRlOgotICogICAgICBpbnQgWzNdIFs0XQotICoKLSAqICAgLSAoaW50W10sIG5ldyBpbnRbMV0gezF9KQotICogICAgICBpbnQgWzFdCi0gKgotICogICAtIChpbnRbXSwgbmV3IGludFsyXSB7MiwzfSkKLSAqICAgICAgaW50IFsyXSBbM10KLSAqIAotICoKLSAqICAgLSAoaW50W10sIG51bGwpIG9yIChpbnRbXSwgbmV3IGludFswXSkgb3IgKGludCwgbnVsbCkgb3IgKGludCwgbmV3IGludFswXSkKLSAqICAgICAgaW50IFswXS4uLgotICogICAgIG9yCi0gKiAgICAgKGludFtdW10uLi4sIG51bGwpIG9yIChpbnRbXVtdLi4uLCBuZXcgaW50WzBdKQotICogICAgICBpbnRbMF1bXS4uLgotICogICAgIFRoaXMgaXMgYmVjYXVzZSBhbiBhcnJheSBpbnN0YW5jZSB3aXRoIG5vIHNwZWNpZmllZCBkaW1lbnNpb25zIGlzIG5vdCB2YWxpZC4gCi0gKgotICogICAtIChpbnRbXVtdLCBuZXcgaW50WzFdIHszfSkKLSAqICAgICAgaW50WzNdW10KLSAqLwotcHVibGljIElBcnJheUJlYW5Qcm94eSAgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBpbnRbXSBkaW1lbnNpb25zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0vKioKLSAqIENyZWF0ZSBhIG9uZS1kaW1lbnNpb25hbCBhcnJheS4gCi0gKiBUaGUgcmVzdWx0IHdpbGwgYmUgdGhlIHNhbWUgYXMgY2FsbGluZyAKLSAqICAgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBuZXcgaW50WzFdIHt4fSkKLSAqIHdoZXJlICd4JyBpcyB0aGUgdmFsdWUgcGFzc2VkIGluIGFzIHRoZSBkaW1lbnNpb24uCi0gKi8KLXB1YmxpYyBJQXJyYXlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBpbnQgZGltZW5zaW9uKSB0aHJvd3MgVGhyb3dhYmxlUHJveHk7Ci0KLS8qKgotICogQ3JlYXRlIGEgYmVhbiBwcm94eSBmcm9tIGFuIGluaXRpYWxpemF0aW9uIHN0cmluZy4gCi0gKiA8cD4KLSAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0aGF0IHRoaXMgbWV0aG9kIGJlIGNvbW1vbmx5IHVzZWQuIFRoYXQgaXMgYmVjYXVzZSBubyB0eXBlIGNoZWNraW5nIHdpbGwgYmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgcmVzdWx0LiBXaGF0ZXZlciBpdCBldmFsdWF0ZXMgdG8gYmUgd2lsbCBiZSB3aGF0IGl0IGlzLiBJdCBpcyB1c2VmdWwgZm9yIHRoZSByYXJlIGNhc2VzIHdoZXJlIHRoZSBkZXNpcmVkCi0gKiByZXN1bHQgdHlwZSBpcyBub3Qga25vd24uCi0gKiA8cD4KLSAqIEl0IGlzIHJlY29tbWVuZGVkIGluc3RlYWQgdG8gdXNlIHRoZSBuZXdJbnN0YW5jZShpbml0U3RyaW5nKSBtZXRob2Qgb24gdGhlIGFwcHJvcHJpYXRlIElCZWFuVHlwZVByb3h5IHNvIHRoYXQgdGhlCi0gKiByZXN1bHQgY2FuIGJlIHR5cGUtY2hlY2tlZCB0byBtYWtlIHN1cmUgdGhlIHN0cmluZyBldmFsdWF0ZXMgdG8gc29tZXRoaW5nIG9mIHRoYXQgdHlwZS4KLSAqIAotICogQHBhcmFtIGluaXRpYWxpemF0aW9uU3RyaW5nCi0gKiBAcmV0dXJuCi0gKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0gKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlGcm9tKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBDbGFzc0Nhc3RFeGNlcHRpb247Ci0KLS8qKgotICogUmVsZWFzZSB0aGUgcHJveHkuIEluIHRoZSBjYXNlIG9mIFJlbW90ZSBWTSwgdGhpcyBtZWFucwotICogaXQgd2lsbCByZW1vdmUgdGhlIHByb3h5IG9uIHRoZSBjbGllbnQgc2lkZSwgYW5kIHJlbW92ZQotICogdGhlIHJlZmVyZW5jZSB0byB0aGUgcmVhbCBvYmplY3Qgb24gdGhlIHNlcnZlciBzaWRlLiBPbiB0aGUgc2VydmVyCi0gKiBzaWRlIHRoZSByZWFsIG9iamVjdCBtYXkgbm90IGdvIGF3YXkgYmVjYXVzZSBzb21ldGhpbmcgZWxzZSBjb3VsZAotICogYmUgaG9sZGluZyBvbnRvIGl0LCBidXQgaXQgd29uJ3QgYmUgaGVsZCBzaW1wbHkgYmVjYXVzZSB0aGUgY2xpZW50Ci0gKiBpcyBob2xkaW5nIG9udG8gaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbGVhc2VQcm94eShJQmVhblByb3h5IHByb3h5KTsKLQotLyoqCi0gKiBDcmVhdGUgYW4gZXhwcmVzc2lvbi4KLSAqIEByZXR1cm4gVGhlIGV4cHJlc3Npb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgSUV4cHJlc3Npb24gY3JlYXRlRXhwcmVzc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDMwMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotLyoqCi0gKiBUaGUgc3RhbmRhcmQgYmVhbiB0eXBlIHByb3h5IGZhY3RvcnkuCi0gKiBUaGlzIGlzIHRoZSBJbnRlcmZhY2UgdGhhdCB0aGUgZGVza3RvcCB3aWxsIHRhbGsKLSAqIHRvLCB0aGUgb25lIHRoYXQgaXMgcmV0dXJuZWQgd2hlbiBnZXRDdXJyZW50KCkgaXMgY2FsbGVkLgotICogQ3JlYXRpb24gZGF0ZTogKDMvMTAvMDAgMTE6MDA6NTAgQU0pCi0gKiBAYXV0aG9yOiBSaWNoYXJkIExlZSBLdWxwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZXh0ZW5kcyBJQmVhblByb3h5RmFjdG9yeSB7Ci0JCi0vKioKLSAqIFVzZWQgYnkgb3RoZXIgcmVnaXN0ZXJlZCBiZWFuIHR5cGUgcHJveHkgZmFjdG9yaWVzIHRvCi0gKiByZWdpc3RlciB0aGVpciBiZWFuIHR5cGUgcHJveGllcyB3aXRoIHRoZSBzdGFuZGFyZCBmYWN0b3J5Ci0gKiBzbyB0aGF0IGl0IHdpbGwgYmUgY2FjaGVkIHRoZXJlLiAKLSAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY3VzdG9tZXJzLiBJdCBpcyBoZXJlIGZvciB0aGUgdXNhZ2UKLSAqIG9mIHJlZ2lzdHJ5IGV4dGVuc2lvbnMuCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLSAqIEBwYXJhbSBwZXJtYW5lbnQgaW5kaWNhdGVzIHRoYXQgYmVhbnR5cGUgd2lsbCBuZXZlciBiZSByZWxlYXNlZCwKLSAqIG5vdCBldmVuIGlmIGV4cGxpY2l0IHJlcXVlc3QgaXMgbWFkZS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBib29sZWFuIHBlcm1hbmVudCk7Ci0KLS8qKgotICogVXNlZCBieSBvdGhlciByZWdpc3RlcmVkIGJlYW4gdHlwZSBwcm94eSBmYWN0b3JpZXMgdG8KLSAqIHJlZ2lzdGVyIHRoZWlyIHByb3h5IGJlYW4gdHlwZSB3aXRoIHRoZSBzdGFuZGFyZCBmYWN0b3J5Ci0gKiBzbyB0aGF0IGl0IHdpbGwgYmUgY2FjaGVkIHRoZXJlLiAKLSAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY3VzdG9tZXJzLiBJdCBpcyBoZXJlIGZvciB0aGUgdXNhZ2UKLSAqIG9mIHJlZ2lzdHJ5IGV4dGVuc2lvbnMuCi0gKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLSAqIEBwYXJhbSBwZXJtYW5lbnQgaW5kaWNhdGVzIHRoYXQgYmVhbnR5cGUgd2lsbCBuZXZlciBiZSByZWxlYXNlZCwKLSAqIG5vdCBldmVuIGlmIGV4cGxpY2l0IHJlcXVlc3QgaXMgbWFkZS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5LCBib29sZWFuIHBlcm1hbmVudCk7Ci0KLS8qKgotICogUmV0dXJuIHRoZSBiZWFuVHlwZSBwcm94eSBmb3IgdGhlIGdpdmVuIGNsYXNzIG5hbWUuCi0gKiBJdCBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZC4gQW5kIGZvciBhcnJheXMgaXQgY2FuIGhhbmRsZQotICogZWl0aGVyIHRoZSBqbmkgdHlwZSAoW0xqYXZhLmxhbmcuT2JqZWN0Oykgb3IgdGhlIEphdmEgRU1GIE1vZGVsCi0gKiBmb3JtYWwgdHlwZSAoamF2YS5sYW5nLk9iamVjdFtdKS4KLSAqLwotSUJlYW5UeXBlUHJveHkgZ2V0QmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lKTsKLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlIHByb3h5IHN1aXRhYmxlIGZvciBhbiBleHByZXNzaW9uLgotICogCi0gKiBAcGFyYW0gZXhwcmVzc2lvbgotICogQHBhcmFtIHR5cGVOYW1lCi0gKiBAcmV0dXJuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1JUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZVByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyB0eXBlTmFtZSk7Ci0KLS8qKgotICogUmV0dXJuIGFuIEFycmF5IHR5cGUgcHJveHkgZm9yIHRoZSBnaXZlbiBjbGFzcyBuYW1lIG9mCi0gKiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLiBUaGUKLSAqIHNhbWUgcmVzdWx0IGNhbiBiZSBnb3R0b24gZnJvbSBnZXRCZWFuVHlwZVByb3h5LgotICogZS5nLgotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgMykKLSAqICAgIGlzIHRoZSBzYW1lIGFzOgotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJbW1tMamF2YS5sYW5nLk9iamVjdDsiKQotICoKLSAqICAgIFRoZXkgYm90aCByZXN1bHQgaW4gYSB0eXBlIG9mOgotICogICAgICBPYmplY3QgW11bXVtdCi0gKiAKLSAqICAgIG9yIGlmIHVzaW5nIHRoZSBKTkkgZm9ybWF0IChwcm94eSBmb3JtYXQpCi0gKiAgICAgIGdldEJlYW5UeXBlUHJveHkoIltMamF2YS5sYW5nT2JqZWN0OyIsIDMpCi0gKiAgICBiZWNvbWVzCi0gKiAgICAgIE9iamVjdCBbXVtdW11bXSAKLSAqIAotICogICAgb3IgaWYgdXNpbmcgdGhlIHN0YW5kYXJkIGphdmEgZm9ybWF0IChhcyBpbiBhY3R1YWwgY29kZSkKLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nT2JqZWN0W107IiwgMykKLSAqICAgIGJlY29tZXMKLSAqICAgICAgT2JqZWN0IFtdW11bXVtdCi0gKi8KLUlCZWFuVHlwZVByb3h5IGdldEJlYW5UeXBlUHJveHkoU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpOwotCi0vKioKLSAqIFJldHVybiBhbiBBcnJheSB0eXBlIHByb3h5IGZvciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBvZgotICogdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zLiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZC4gVGhlCi0gKiBzYW1lIHJlc3VsdCBjYW4gYmUgZ290dG9uIGZyb20gZ2V0QmVhblR5cGVQcm94eS4KLSAqIGUuZy4KLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIsIDMpCi0gKiAgICBpcyB0aGUgc2FtZSBhczoKLSAqICAgICAgZ2V0QmVhblR5cGVQcm94eSgiW1tbTGphdmEubGFuZy5PYmplY3Q7IikKLSAqCi0gKiAgICBUaGV5IGJvdGggcmVzdWx0IGluIGEgdHlwZSBvZjoKLSAqICAgICAgT2JqZWN0IFtdW11bXQotICogCi0gKiAgICBvciBpZiB1c2luZyB0aGUgSk5JIGZvcm1hdCAocHJveHkgZm9ybWF0KQotICogICAgICBnZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZ09iamVjdDsiLCAzKQotICogICAgYmVjb21lcwotICogICAgICBPYmplY3QgW11bXVtdW10gCi0gKiAKLSAqICAgIG9yIGlmIHVzaW5nIHRoZSBzdGFuZGFyZCBqYXZhIGZvcm1hdCAoYXMgaW4gYWN0dWFsIGNvZGUpCi0gKiAgICAgIGdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZ09iamVjdFtdOyIsIDMpCi0gKiAgICBiZWNvbWVzCi0gKiAgICAgIE9iamVjdCBbXVtdW11bXQotICogCi0gKiBAcGFyYW0gZXhwcmVzc2lvbgotICogQHBhcmFtIGNvbXBvbmVudENsYXNzTmFtZQotICogQHBhcmFtIGRpbWVuc2lvbnMKLSAqIEByZXR1cm4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLUlQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNvbXBvbmVudENsYXNzTmFtZSwgaW50IGRpbWVuc2lvbnMpOwotCi0vKioKLSAqIFRlc3QgaWYgYSBzcGVjaWZpYyBiZWFuIHR5cGUgaGFzIGJlZW4gcmVnaXN0ZXJlZC4gRG9uJ3QgYWNjZXNzIGFuZCBjcmVhdGUKLSAqIGlmIGl0IGlzbid0IGN1cnJlbnRseSByZWdpc3RlcmVkLgotICovCi1ib29sZWFuIGlzQmVhblR5cGVSZWdpc3RlcmVkKFN0cmluZyBjbGFzc05hbWUpOwotCi0vKioKLSAqIFJlZ2lzdGVyZWQgdHlwZXMuIFJldHVybiBhIHNldCBvZiBzdHJpbmdzIHRoYXQgYXJlIHRoZSByZWdpc3RlcmVkIGNsYXNzZXMuCi0gKiBUaGlzIFNldCBpc24ndCBzeW5jaHJvbml6ZWQsIHRoZXJlIG1heSBiZSBjaGFuZ2VzIHdoaWxlIGFjY2Vzc2luZyBpdC4KLSAqLwotU2V0IHJlZ2lzdGVyZWRUeXBlcygpOwotCi0vKioKLSAqIE1haW50YWluIGxpc3Qgb2Ygbm90IGZvdW5kIHR5cGVzLiBUaGlzIGxpc3QgaXMgdHlwZXMgdGhhdCB3ZXJlIHJlcXVlc3RlZCwKLSAqIGJ1dCBkaWRuJ3QgZXhpc3QuIFRoaXMgbWV0aG9kIHNldHMgd2hldGhlciBsaXN0IHNob3VsZCBiZSBtYWludGFpbmVkIG9yIG5vdC4KLSAqIElmIHNldCB0byBmYWxzZSwgdGhlIGxpc3Qgd2lsbCBiZSBlbXB0eS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gKiAKLSAqIEBwYXJhbSBtYWludGFpbgotICovCi12b2lkIHNldE1haW50YWluTm90Rm91bmRUeXBlcyhib29sZWFuIG1haW50YWluKTsKLQotLyoqCi0gKiBNYWludGFpbiBsaXN0IG9mIG5vdCBmb3VuZCB0eXBlcy4gVGhpcyBsaXN0IGlzIHR5cGVzIHRoYXQgd2VyZSByZXF1ZXN0ZWQsCi0gKiBidXQgZGlkbid0IGV4aXN0LiBUaGlzIG1ldGhvZCByZXR1cm5zIHdoZXRoZXIgbGlzdCBzaG91bGQgYmUgbWFpbnRhaW5lZCBvciBub3QuCi0gKiBJZiBmYWxzZSwgdGhlIGxpc3Qgd2lsbCBiZSBlbXB0eS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gKiAKLSAqIEByZXR1cm4gbWFpbnRhaW5pbmcgbm90IGZvdW5kIHR5cGVzLgotICovCi1ib29sZWFuIGlzTWFpbnRhaW5Ob3RGb3VuZFR5cGVzKCk7Ci0KLS8qKgotICogTWFpbnRhaW4gbGlzdCBvZiBub3QgZm91bmQgdHlwZXMuIFRoaXMgbGlzdCBpcyB0eXBlcyB0aGF0IHdlcmUgcmVxdWVzdGVkLAotICogYnV0IGRpZG4ndCBleGlzdC4gCi0gKgotICogQHBhcmFtIGNsYXNzTmFtZSBDbGFzc25hbWUgdG8gc2VhcmNoIGZvciB0byBzZWUgaWYgZXZlciBub3QgZm91bmQuCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJlYW4gdHlwZSBoYWQgYmVlbiBzZWFyY2hlZCBmb3IgYnV0IHdhcyBub3QgZm91bmQuIElmIG5vdCBtYWludGFpbmluZywgdGhlbiByZXN1bHQgd2lsbCBiZSBmYWxzZS4KLSAqLwotYm9vbGVhbiBpc0JlYW5UeXBlTm90Rm91bmQoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdHJpbmdCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0lTdHJpbmdCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3ZDQ1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JU3RyaW5nQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogSVN0cmluZ0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIE9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBzdHJpbmcgcHJveGllcyB0aGF0Ci0gKiBhbGxvd3MgdGhlIElERSBWTSB0byBnZXQgdGhlIHN0cmluZyB2YWx1ZSBlYXNpbHkKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgODo1ODoyMiBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cmluZ0JlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3hpZWQgc3RyaW5nIGFzIGEgc3RyaW5nIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDg6NTg6MzIgQU0pCi0gKi8KLVN0cmluZyBzdHJpbmdWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSVVJUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JVUlSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiYmE5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JVUlSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElVSVJ1bm5lci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLSAKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBkb2Vzbid0IHJlcXVpcmUgVUkuIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsLiBUaGlzIHdpbGwKLSAqIG9ubHkgYmUgdXNlZCBpZiB3aXRoaW4gVUkgZW52aXJvbm1lbnQuCi0gKiAKLSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBzaG91bGQgb25seSBiZSB1c2VkIHdpdGhpbiBoZXJlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotaW50ZXJmYWNlIElVSVJ1bm5lciB7Ci0JLyoqCi0JICogSGFuZGxlIHRoZSBidWlsZC4gSWYgbm90IGluIFVJIHRocmVhZCwganVzdCBjYWxsIGJhY2sgdG8gUHJveHlMYXVuY2hTdXBwb3J0Ci0JICogdG8gaGFuZGxlIHRoZSBidWlsZC4gSWYgb24gVUkgdGhyZWFkLCB0aGVuIHVzZSB0aGUgSVByb2dyZXNzU2VydmljZSB0byBkbyBpdC4KLQkgKiBUaGlzIHdpbGwga2VlcCB0aGUgVUkgZnJvbSAibG9ja2luZyIsIHRob3VnaCBpdCB3aWxsIGJlIGRpc2FibGVkIGl0IHdvbid0IGRlYWRsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwbQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUJ1aWxkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkMDU1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9JdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIGFuIGphdmEudXRpbC5JdGVyYXRvciBwcm94eS4KLSAqIEl0IHByb3ZpZGVzIHRoZSBpdGVyYXRvciBtZXRob2RzIHRvIGludGVyZmFjZSB0bwotICogdGhlIHByb3h5LgotICovCi0KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgewotCXByb3RlY3RlZCBmaW5hbCBJQmVhblByb3h5IGZJdGVyYXRvcjsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIGZDb25zdGFudHM7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlcihJQmVhblByb3h5IGFuSXRlcmF0b3JQcm94eSkgewotCQlpZiAoIWFuSXRlcmF0b3JQcm94eS5nZXRUeXBlUHJveHkoKS5pc0tpbmRPZihhbkl0ZXJhdG9yUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5JdGVyYXRvciIpKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eU1lc3NhZ2VzLkNsYXNzQ2FzdF9FWENfX0luY29ycmVjdFR5cGUsIG5ldyBPYmplY3RbXSB7YW5JdGVyYXRvclByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksICJqYXZhLnV0aWwuSXRlcmF0b3IifSkpOyAKLQkJZWxzZQotCQkJZkl0ZXJhdG9yID0gYW5JdGVyYXRvclByb3h5OwotCQkJCi0JCWZDb25zdGFudHMgPSBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGFuSXRlcmF0b3JQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBpdGVyYXRvciBwcm94eSB0aGF0IHRoaXMgaXMgd3JhcHBlcmluZy4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRCZWFuUHJveHkoKSB7Ci0JCXJldHVybiBmSXRlcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogZXF1YWxzIC0gUGFzcyBpdCBvbiB0byB0aGUgcHJveHkgdG8gaGFuZGxlIHRoaXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZJdGVyYXRvci5lcXVhbHMob2JqZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogaGFzaENvZGUgLSBQYXNzIGl0IG9uIHRvIHRoZSBwcm94eSB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkl0ZXJhdG9yLmhhc2hDb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIEl0ZXJhdG9yIGFjY2Vzc29ycwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRJdGVyYXRvckhhc05leHQoKS5pbnZva2UoZkl0ZXJhdG9yKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCQotCX0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXh0KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGZDb25zdGFudHMuZ2V0SXRlcmF0b3JOZXh0KCkuaW52b2tlKGZJdGVyYXRvcik7Ci0JfQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlmQ29uc3RhbnRzLmdldEl0ZXJhdG9yUmVtb3ZlKCkuaW52b2tlKGZJdGVyYXRvcik7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0phdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MjUwY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi0vKioKLSAqIFN0YW5kYXJkIFByb3h5IGNvbnN0YW50cy4KLSAqCi0gKiBVc2UgdGhlIHN0YXRpYyBhY2Nlc3NvciBtZXRob2QgKGdldENvbnN0YW50cygpKSB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIAotICogY29uc3RhbnRzIGluc3RhbmNlIGZvciB0aGUgcmVnaXN0cnkuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHVudGlsIHRoZQotICogdGhlIGNvbnN0YW50cyBhcmUgbmVlZGVkLCB0aGV5IGFyZW4ndCByZWdpc3RlcmVkLgotICoKLSAqIFRoZXJlIGFyZSBzb21lIHN0YW5kYXJkIHV0aWxpdHkgZnVuY3Rpb25zIHRvby4KLSAqCi0gKiBOT1RFOiBTaW5jZSBldmVyeXRoaW5nIGluIGhlcmUganVzdCBwcm94aWVzLCB0aGVyZSBpcwotICogICAgICAgbm8gbmVlZCB0byBoYXZlIHRoZW0gc2VwYXJhdGVkIGJ5IFZNLiBUaGF0IGlzIHdoeQotICogICAgICAgdGhpcyBpbiB0aGUgUHJveHkgcGFja2FnZS4KLSAqCi0gKiBUaGlzIGlzIGZpbmFsIGJlY2F1c2UgdGhpcyBjYW4ndCBiZSBleHRlbmRlZC4gVGhpcyBzcGVjaWZpYyBvbmUKLSAqIHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBmYWN0b3J5IGZvciB0aGlzIGtleS4gQW55IGV4dGVuc2lvbnMKLSAqIG11c3QgYmUgZG9uZSBpbiB0aGVpciBvd24gY29uc3RhbnRzIGFuZCByZWdpc3RyeSBrZXkuCi0gKgotICogQ3JlYXRpb24gZGF0ZTogKDQvNy8wMCA0OjQ3OjQ4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdJU1RSWV9LRVkgPSBuZXcgT2JqZWN0KCk7Ci0JCQotCWZpbmFsIElCZWFuVHlwZVByb3h5IGZDb2xsZWN0aW9uVHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmTGlzdFR5cGU7Ci0JZmluYWwgSUJlYW5UeXBlUHJveHkgZkl0ZXJhdG9yVHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmTGlzdEl0ZXJhdG9yVHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmRW51bWVyYXRpb25UeXBlOwkKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmU3lzdGVtVHlwZTsKLQlmaW5hbCBJQmVhblR5cGVQcm94eSBmU3RyaW5nVHlwZTsKLQkKLQlJTWV0aG9kUHJveHkgZkNvbGxlY3Rpb25BZGQsIGZDb2xsZWN0aW9uQWRkQWxsLCBmQ29sbGVjdGlvbkNsZWFyLCBmQ29sbGVjdGlvbkNvbnRhaW5zLAotCQlmQ29sbGVjdGlvbkNvbnRhaW5zQWxsLCBmQ29sbGVjdGlvbklzRW1wdHksIGZDb2xsZWN0aW9uSXRlcmF0b3IsIGZDb2xsZWN0aW9uUmVtb3ZlLAotCQlmQ29sbGVjdGlvblJlbW92ZUFsbCwgZkNvbGxlY3Rpb25SZXRhaW5BbGwsIGZDb2xsZWN0aW9uU2l6ZSwgZkNvbGxlY3Rpb25Ub0FycmF5LAotCQlmQ29sbGVjdGlvblRvQXJyYXlXaXRoQXJyYXk7Ci0JCQotCUlNZXRob2RQcm94eSBmTGlzdEFkZFdpdGhJbnQsIGZMaXN0QWRkQWxsV2l0aEludCwgZkxpc3RHZXQsIGZMaXN0SW5kZXhPZiwgZkxpc3RMYXN0SW5kZXhPZiwKLQkJZkxpc3RMaXN0SXRlcmF0b3IsIGZMaXN0TGlzdEl0ZXJhdG9yV2l0aEludCwgZkxpc3RSZW1vdmVJbnQsIAotCQlmTGlzdFNldCwgZkxpc3RTdWJMaXN0OwotCQkKLQlJTWV0aG9kUHJveHkgZkl0ZXJhdG9ySGFzTmV4dCwgZkl0ZXJhdG9yTmV4dCwgZkl0ZXJhdG9yUmVtb3ZlOwotCi0JSU1ldGhvZFByb3h5IGZMaXN0SXRlcmF0b3JBZGQsIGZMaXN0SXRlcmF0b3JIYXNQcmV2aW91cywgZkxpc3RJdGVyYXRvck5leHRJbmRleCwgZkxpc3RJdGVyYXRvclByZXZpb3VzLAotCQlmTGlzdEl0ZXJhdG9yUHJldmlvdXNJbmRleCwgZkxpc3RJdGVyYXRvclJlbW92ZSwgZkxpc3RJdGVyYXRvclNldDsKLQkJCi0JSU1ldGhvZFByb3h5IGZFbnVtZXJhdGlvbkhhc01vcmVFbGVtZW50cywgZkVudW1lcmF0aW9uTmV4dEVsZW1lbnQ7Ci0JCi0JSU1ldGhvZFByb3h5IGZTeXN0ZW1BcnJheWNvcHk7Ci0KLS8qKgotICogR2V0IHRoZSBjb25zdGFudHMgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaXN0cnkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIGdldENvbnN0YW50cyhQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCUphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBjb25zdGFudHMgPSAoSmF2YVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzKSByZWdpc3RyeS5nZXRDb25zdGFudHMoUkVHSVNUUllfS0VZKTsKLQlpZiAoY29uc3RhbnRzID09IG51bGwpCi0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQ29uc3RhbnRzKFJFR0lTVFJZX0tFWSwgY29uc3RhbnRzID0gbmV3IEphdmFTdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyhyZWdpc3RyeSkpOwkKLQlyZXR1cm4gY29uc3RhbnRzOwotfQotCi0KLS8qKgotICogSURFSmF2YUJlYW5Db25zdGFudHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHJpdmF0ZSBKYXZhU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQlzdXBlcigpOwotCQotCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQlmQ29sbGVjdGlvblR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOy8vJE5PTi1OTFMtMSQKLQlmTGlzdFR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuTGlzdCIpOyAvLyROT04tTkxTLTEkCi0JZkl0ZXJhdG9yVHlwZSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5JdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JZkxpc3RJdGVyYXRvclR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQlmRW51bWVyYXRpb25UeXBlID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLkVudW1lcmF0aW9uIik7CSAvLyROT04tTkxTLTEkCi0JZlN5c3RlbVR5cGUgPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuU3lzdGVtIik7IC8vJE5PTi1OTFMtMSQKLQlmU3RyaW5nVHlwZSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5TdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3RyaW5nVHlwZSgpIHsKLQlyZXR1cm4gZlN0cmluZ1R5cGU7Ci19Ci0KLS8qKgotICogQ29sbGVjdGlvbiBtZXRob2QgYWNjZXNzb3JzCi0gKi8KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbkFkZCgpIHsKLQlpZiAoZkNvbGxlY3Rpb25BZGQgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25BZGQgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoImFkZCIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29sbGVjdGlvbkFkZDsKLX0KLQkKLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbkFkZEFsbCgpewotCWlmIChmQ29sbGVjdGlvbkFkZEFsbCA9PSBudWxsKQotCQlmQ29sbGVjdGlvbkFkZEFsbCA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiYWRkQWxsIiwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29sbGVjdGlvbkFkZEFsbDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uQ2xlYXIoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uQ2xlYXIgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25DbGVhciA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiY2xlYXIiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmQ29sbGVjdGlvbkNsZWFyOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25Db250YWlucygpIHsKLQlpZiAoZkNvbGxlY3Rpb25Db250YWlucyA9PSBudWxsKQotCQlmQ29sbGVjdGlvbkNvbnRhaW5zID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJjb250YWlucyIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29sbGVjdGlvbkNvbnRhaW5zOwotfQotCQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uQ29udGFpbnNBbGwoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uQ29udGFpbnNBbGwgPT0gbnVsbCkKLQkJZkNvbGxlY3Rpb25Db250YWluc0FsbCA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiY29udGFpbnNBbGwiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uQ29udGFpbnNBbGw7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbklzRW1wdHkoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uSXNFbXB0eSA9PSBudWxsKQotCQlmQ29sbGVjdGlvbklzRW1wdHkgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoImlzRW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmQ29sbGVjdGlvbklzRW1wdHk7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29sbGVjdGlvbkl0ZXJhdG9yKCkgewotCWlmIChmQ29sbGVjdGlvbkl0ZXJhdG9yID09IG51bGwpCi0JCWZDb2xsZWN0aW9uSXRlcmF0b3IgPSBmQ29sbGVjdGlvblR5cGUuZ2V0TWV0aG9kUHJveHkoIml0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkNvbGxlY3Rpb25JdGVyYXRvcjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uUmVtb3ZlKCkgewotCWlmIChmQ29sbGVjdGlvblJlbW92ZSA9PSBudWxsKQotCQlmQ29sbGVjdGlvblJlbW92ZSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgicmVtb3ZlIiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uUmVtb3ZlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25SZW1vdmVBbGwoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uUmVtb3ZlQWxsID09IG51bGwpCi0JCWZDb2xsZWN0aW9uUmVtb3ZlQWxsID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJyZW1vdmVBbGwiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uUmVtb3ZlQWxsOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25SZXRhaW5BbGwoKSB7Ci0JaWYgKGZDb2xsZWN0aW9uUmV0YWluQWxsID09IG51bGwpCi0JCWZDb2xsZWN0aW9uUmV0YWluQWxsID0gZkNvbGxlY3Rpb25UeXBlLmdldE1ldGhvZFByb3h5KCJyZXRhaW5BbGwiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb2xsZWN0aW9uUmV0YWluQWxsOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbGxlY3Rpb25TaXplKCkgIHsKLQlpZiAoZkNvbGxlY3Rpb25TaXplID09IG51bGwpCi0JCWZDb2xsZWN0aW9uU2l6ZSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgic2l6ZSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZDb2xsZWN0aW9uU2l6ZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uVG9BcnJheSgpIHsKLQlpZiAoZkNvbGxlY3Rpb25Ub0FycmF5ID09IG51bGwpCi0JCWZDb2xsZWN0aW9uVG9BcnJheSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgidG9BcnJheSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZDb2xsZWN0aW9uVG9BcnJheTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb2xsZWN0aW9uVG9BcnJheVdpdGhBcnJheSgpIHsKLQlpZiAoZkNvbGxlY3Rpb25Ub0FycmF5V2l0aEFycmF5ID09IG51bGwpCi0JCWZDb2xsZWN0aW9uVG9BcnJheVdpdGhBcnJheSA9IGZDb2xsZWN0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgidG9BcnJheSIsICJbTGphdmEubGFuZy5PYmplY3Q7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ29sbGVjdGlvblRvQXJyYXlXaXRoQXJyYXk7Ci19Ci0KLS8qKgotICogSXRlcmF0b3IgYWNjZXNzb3JzCi0gKi8KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRJdGVyYXRvckhhc05leHQoKSB7Ci0JaWYgKGZJdGVyYXRvckhhc05leHQgPT0gbnVsbCkKLQkJZkl0ZXJhdG9ySGFzTmV4dCA9IGZJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoImhhc05leHQiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmSXRlcmF0b3JIYXNOZXh0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEl0ZXJhdG9yTmV4dCgpIHsKLQlpZiAoZkl0ZXJhdG9yTmV4dCA9PSBudWxsKQotCQlmSXRlcmF0b3JOZXh0ID0gZkl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgibmV4dCIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZJdGVyYXRvck5leHQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0SXRlcmF0b3JSZW1vdmUoKSB7Ci0JaWYgKGZJdGVyYXRvclJlbW92ZSA9PSBudWxsKQotCQlmSXRlcmF0b3JSZW1vdmUgPSBmSXRlcmF0b3JUeXBlLmdldE1ldGhvZFByb3h5KCJyZW1vdmUiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmSXRlcmF0b3JSZW1vdmU7Ci19Ci0KLS8qKgotICogTGlzdGFjY2Vzc29ycwotICovCi0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEFkZFdpdGhJbnQoKSB7Ci0JaWYgKGZMaXN0QWRkV2l0aEludCA9PSBudWxsKQotCQlmTGlzdEFkZFdpdGhJbnQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImFkZCIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmTGlzdEFkZFdpdGhJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEFkZEFsbFdpdGhJbnQoKSB7Ci0JaWYgKGZMaXN0QWRkQWxsV2l0aEludCA9PSBudWxsKQotCQlmTGlzdEFkZEFsbFdpdGhJbnQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImFkZEFsbCIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkxpc3RBZGRBbGxXaXRoSW50OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RHZXQoKSB7Ci0JaWYgKGZMaXN0R2V0ID09IG51bGwpCi0JCWZMaXN0R2V0ID0gZkxpc3RUeXBlLmdldE1ldGhvZFByb3h5KCJnZXQiLCAiaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdEdldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRMaXN0SW5kZXhPZigpIHsKLQlpZiAoZkxpc3RJbmRleE9mID09IG51bGwpCi0JCWZMaXN0SW5kZXhPZiA9IGZMaXN0VHlwZS5nZXRNZXRob2RQcm94eSgiaW5kZXhPZiIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdEluZGV4T2Y7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdExhc3RJbmRleE9mKCkgewotCWlmIChmTGlzdExhc3RJbmRleE9mID09IG51bGwpCi0JCWZMaXN0TGFzdEluZGV4T2YgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImxhc3RJbmRleE9mIiwgImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0TGFzdEluZGV4T2Y7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdExpc3RJdGVyYXRvcigpIHsKLQlpZiAoZkxpc3RMaXN0SXRlcmF0b3IgPT0gbnVsbCkKLQkJZkxpc3RMaXN0SXRlcmF0b3IgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoImxpc3RJdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0TGlzdEl0ZXJhdG9yOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RMaXN0SXRlcmF0b3JXaXRoSW50KCkgewotCWlmIChmTGlzdExpc3RJdGVyYXRvcldpdGhJbnQgPT0gbnVsbCkKLQkJZkxpc3RMaXN0SXRlcmF0b3JXaXRoSW50ID0gZkxpc3RUeXBlLmdldE1ldGhvZFByb3h5KCJsaXN0SXRlcmF0b3IiLCAiaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdExpc3RJdGVyYXRvcldpdGhJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdFJlbW92ZUludCgpIHsKLQlpZiAoZkxpc3RSZW1vdmVJbnQgPT0gbnVsbCkKLQkJZkxpc3RSZW1vdmVJbnQgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoInJlbW92ZSIsICJpbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZMaXN0UmVtb3ZlSW50OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RTZXQoKSB7Ci0JaWYgKGZMaXN0U2V0ID09IG51bGwpCi0JCWZMaXN0U2V0ID0gZkxpc3RUeXBlLmdldE1ldGhvZFByb3h5KCJzZXQiLCBuZXcgU3RyaW5nW10geyJpbnQiLCAiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkxpc3RTZXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdFN1Ykxpc3QoKSB7Ci0JaWYgKGZMaXN0U3ViTGlzdCA9PSBudWxsKQotCQlmTGlzdFN1Ykxpc3QgPSBmTGlzdFR5cGUuZ2V0TWV0aG9kUHJveHkoInN1Ykxpc3QiLCBuZXcgU3RyaW5nW10geyJpbnQiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmTGlzdFN1Ykxpc3Q7Ci19Ci0KLS8qKgotICogTGlzdEl0ZXJhdG9yIGFjY2Vzc29ycwotICovCi0gCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvckFkZCgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvckFkZCA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yQWRkID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoImFkZCIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdEl0ZXJhdG9yQWRkOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvckhhc1ByZXZpb3VzKCkgewotCWlmIChmTGlzdEl0ZXJhdG9ySGFzUHJldmlvdXMgPT0gbnVsbCkKLQkJZkxpc3RJdGVyYXRvckhhc1ByZXZpb3VzID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoImhhc1ByZXZpb3VzIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkxpc3RJdGVyYXRvckhhc1ByZXZpb3VzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvck5leHRJbmRleCgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvck5leHRJbmRleCA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yTmV4dEluZGV4ID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoIm5leHRJbmRleCIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JOZXh0SW5kZXg7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9yUHJldmlvdXMoKSB7Ci0JaWYgKGZMaXN0SXRlcmF0b3JQcmV2aW91cyA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yUHJldmlvdXMgPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgicHJldmlvdXMiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmTGlzdEl0ZXJhdG9yUHJldmlvdXM7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TGlzdEl0ZXJhdG9yUHJldmlvdXNJbmRleCgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvclByZXZpb3VzSW5kZXggPT0gbnVsbCkKLQkJZkxpc3RJdGVyYXRvclByZXZpb3VzSW5kZXggPSBmTGlzdEl0ZXJhdG9yVHlwZS5nZXRNZXRob2RQcm94eSgicHJldmlvdXNJbmRleCIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JQcmV2aW91c0luZGV4OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvclNldCgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvclNldCA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yU2V0ID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoInNldCIsICJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTGlzdEl0ZXJhdG9yU2V0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldExpc3RJdGVyYXRvclJlbW92ZSgpIHsKLQlpZiAoZkxpc3RJdGVyYXRvclJlbW92ZSA9PSBudWxsKQotCQlmTGlzdEl0ZXJhdG9yUmVtb3ZlID0gZkxpc3RJdGVyYXRvclR5cGUuZ2V0TWV0aG9kUHJveHkoInJlbW92ZSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGZMaXN0SXRlcmF0b3JSZW1vdmU7Ci19Ci0KLXByb3RlY3RlZCBJTWV0aG9kUHJveHkgZ2V0U3lzdGVtQXJyYXljb3B5KCkgewotCWlmIChmU3lzdGVtQXJyYXljb3B5ID09IG51bGwpCi0JCWZTeXN0ZW1BcnJheWNvcHkgPSBmU3lzdGVtVHlwZS5nZXRNZXRob2RQcm94eSgiYXJyYXljb3B5IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQiLCAiamF2YS5sYW5nLk9iamVjdCIsICJpbnQiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCXJldHVybiBmU3lzdGVtQXJyYXljb3B5OwotfQotCi0vKioKLSAqIEVudW1lcmF0aW9uIGFjY2Vzc29ycwotICovCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEVudW1lcmF0aW9uSGFzTW9yZUVsZW1lbnRzKCkgewotCWlmIChmRW51bWVyYXRpb25IYXNNb3JlRWxlbWVudHMgPT0gbnVsbCkKLQkJZkVudW1lcmF0aW9uSGFzTW9yZUVsZW1lbnRzID0gZkVudW1lcmF0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgiaGFzTW9yZUVsZW1lbnRzIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZkVudW1lcmF0aW9uSGFzTW9yZUVsZW1lbnRzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEVudW1lcmF0aW9uTmV4dEVsZW1lbnQoKSB7Ci0JaWYgKGZFbnVtZXJhdGlvbk5leHRFbGVtZW50ID09IG51bGwpCi0JCWZFbnVtZXJhdGlvbk5leHRFbGVtZW50ID0gZkVudW1lcmF0aW9uVHlwZS5nZXRNZXRob2RQcm94eSgibmV4dEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBmRW51bWVyYXRpb25OZXh0RWxlbWVudDsKLX0KLQotLyoqCi0gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvcHkgYW4gYXJyYXkuCi0gKi8KLXB1YmxpYyB2b2lkIGFycmF5Y29weShJQmVhblByb3h5IHNyYywgaW50IHNyY1Bvc2l0aW9uLCBJQmVhblByb3h5IGRlc3QsIGludCBkZXN0UG9zaXRpb24sIGludCBsZW5ndGgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmYWN0b3J5ID0gc3JjLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpOwotCUlCZWFuUHJveHlbXSBhcmdzID0gbmV3IElCZWFuUHJveHlbXSB7Ci0JCXNyYywKLQkJZmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHNyY1Bvc2l0aW9uKSwKLQkJZGVzdCwKLQkJZmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGRlc3RQb3NpdGlvbiksCi0JCWZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChsZW5ndGgpCQkKLQl9OwotCQotCWdldFN5c3RlbUFycmF5Y29weSgpLmludm9rZShudWxsLCBhcmdzKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RCZWFuUHJveHlXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0QmVhblByb3h5V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEyNTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RCZWFuUHJveHlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IExpc3RCZWFuUHJveHlXcmFwcGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhbiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBwcm94eS4KLSAqIEl0IHByb3ZpZGVzIHRoZSBjb2xsZWN0aW9uIG1ldGhvZHMgdG8gaW50ZXJmYWNlIHRvCi0gKiB0aGUgcHJveHkuCi0gKi8KLQotcHVibGljIGNsYXNzIExpc3RCZWFuUHJveHlXcmFwcGVyIGV4dGVuZHMgQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIgewotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBMaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0QmVhblByb3h5V3JhcHBlcihJQmVhblByb3h5IGFMaXN0UHJveHkpIHsKLQkJc3VwZXIoYUxpc3RQcm94eSk7Ci0JCQotCQlpZiAoIWFMaXN0UHJveHkuZ2V0VHlwZVByb3h5KCkuaXNLaW5kT2YoYUxpc3RQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLkxpc3QiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5DbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlLCBuZXcgT2JqZWN0W10ge2FMaXN0UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgImphdmEudXRpbC5MaXN0In0pKTsgCi0JfQotCQotCQotCS8qKgotCSAqIExpc3QgYWNjZXNzb3JzCi0JICovCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWZDb25zdGFudHMuZ2V0TGlzdEFkZFdpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBvYmplY3R9KTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgSUJlYW5Qcm94eSBhQ29sbGVjdGlvbikgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdEFkZEFsbFdpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBhQ29sbGVjdGlvbn0pKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgZ2V0KGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGZDb25zdGFudHMuZ2V0TGlzdEdldCgpLmludm9rZShmQ29sbGVjdGlvbiwgZkNvbGxlY3Rpb24uZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChpbmRleCkpOwotCX0KLQlwdWJsaWMgaW50IGluZGV4T2YoSUJlYW5Qcm94eSBvYmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKElJbnRlZ2VyQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldExpc3RJbmRleE9mKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gLTE7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIGludCBsYXN0SW5kZXhPZihJQmVhblByb3h5IG9iamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUludGVnZXJCZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdExhc3RJbmRleE9mKCkuaW52b2tlKGZDb2xsZWN0aW9uLCBvYmplY3QpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gLTE7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIExpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgbGlzdEl0ZXJhdG9yKCkgewotCQl0cnkgewotCQkJSUJlYW5Qcm94eSBpdHIgPSBmQ29uc3RhbnRzLmdldExpc3RMaXN0SXRlcmF0b3IoKS5pbnZva2UoZkNvbGxlY3Rpb24pOwotCQkJaWYgKGl0ciAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlcihpdHIpOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCX0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlJQmVhblByb3h5IGl0ciA9IGZDb25zdGFudHMuZ2V0TGlzdExpc3RJdGVyYXRvcldpdGhJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIGZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpKTsKLQkJCWlmIChpdHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IExpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIoaXRyKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gVGhpcyBzaG91bGRuJ3Qgb2NjdXIsIHNvIGp1c3QgbG9nIGl0LgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIFByb3h5TWVzc2FnZXMuVW5leHBlY3RlZEV4Y2VwdGlvbl9FWENfLCBlKSk7IAotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQkKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgcmVtb3ZlKGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldExpc3RTZXQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIGZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpKTsKLQl9Ci0JcHVibGljIElCZWFuUHJveHkgc2V0KGludCBpbmRleCwgSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBmQ29uc3RhbnRzLmdldExpc3RSZW1vdmVJbnQoKS5pbnZva2UoZkNvbGxlY3Rpb24sIG5ldyBJQmVhblByb3h5W10ge2ZDb2xsZWN0aW9uLmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW5kZXgpLCBvYmplY3R9KTsKLQl9CQkJCQkJCQkJCQkKLQlwdWJsaWMgTGlzdEJlYW5Qcm94eVdyYXBwZXIgc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5Qcm94eSBsaXN0ID0gZkNvbnN0YW50cy5nZXRMaXN0U3ViTGlzdCgpLmludm9rZShmQ29sbGVjdGlvbiwgbmV3IElCZWFuUHJveHlbXSB7ZkNvbGxlY3Rpb24uZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChmcm9tSW5kZXgpLCBmQ29sbGVjdGlvbi5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHRvSW5kZXgpfSk7Ci0JCWlmIChsaXN0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IExpc3RCZWFuUHJveHlXcmFwcGVyKGxpc3QpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkJCQkJCQkJCQkJCQotCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL0xpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1YjVhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0SXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gamF2YS51dGlsLkxpc3RJdGVyYXRvciBwcm94eS4KLSAqIEl0IHByb3ZpZGVzIHRoZSBMaXN0SXRlcmF0b3IgbWV0aG9kcyB0byBpbnRlcmZhY2UgdG8KLSAqIHRoZSBwcm94eS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciBleHRlbmRzIEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgTGlzdEl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3JCZWFuUHJveHlXcmFwcGVyKElCZWFuUHJveHkgYW5JdGVyYXRvclByb3h5KSB7Ci0JCXN1cGVyKGFuSXRlcmF0b3JQcm94eSk7Ci0JCQotCQlpZiAoIWFuSXRlcmF0b3JQcm94eS5nZXRUeXBlUHJveHkoKS5pc0tpbmRPZihhbkl0ZXJhdG9yUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5MaXN0SXRlcmF0b3IiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlNZXNzYWdlcy5DbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlLCBuZXcgT2JqZWN0W10ge2FuSXRlcmF0b3JQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCAiamF2YS51dGlsLkxpc3RJdGVyYXRvciJ9KSk7IAotCX0KLQkKLQkKLQkvKioKLQkgKiBMaXN0SXRlcmF0b3IgYWNjZXNzb3JzCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElCZWFuUHJveHkgb2JqZWN0KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlmQ29uc3RhbnRzLmdldExpc3RJdGVyYXRvckFkZCgpLmludm9rZShmSXRlcmF0b3IsIG9iamVjdCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIGZDb25zdGFudHMuZ2V0TGlzdEl0ZXJhdG9ySGFzUHJldmlvdXMoKS5pbnZva2UoZkl0ZXJhdG9yKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCQotCX0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKElJbnRlZ2VyQmVhblByb3h5KSBmQ29uc3RhbnRzLmdldExpc3RJdGVyYXRvck5leHRJbmRleCgpLmludm9rZShmSXRlcmF0b3IpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZG4ndCBvY2N1ciwgc28ganVzdCBsb2cgaXQuCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgUHJveHlNZXNzYWdlcy5VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18sIGUpKTsgCi0JCQlyZXR1cm4gLTE7Ci0JCX0JCQkKLQl9CQkJCi0JcHVibGljIElCZWFuUHJveHkgcHJldmlvdXMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gZkNvbnN0YW50cy5nZXRMaXN0SXRlcmF0b3JQcmV2aW91cygpLmludm9rZShmSXRlcmF0b3IpOwotCX0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChJSW50ZWdlckJlYW5Qcm94eSkgZkNvbnN0YW50cy5nZXRMaXN0SXRlcmF0b3JQcmV2aW91c0luZGV4KCkuaW52b2tlKGZJdGVyYXRvcikpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkbid0IG9jY3VyLCBzbyBqdXN0IGxvZyBpdC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXywgZSkpOyAKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlmQ29uc3RhbnRzLmdldExpc3RJdGVyYXRvclJlbW92ZSgpLmludm9rZShmSXRlcmF0b3IpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXQoSUJlYW5Qcm94eSBvYmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCWZDb25zdGFudHMuZ2V0TGlzdEl0ZXJhdG9yU2V0KCkuaW52b2tlKGZJdGVyYXRvciwgb2JqZWN0KTsKLQl9CQkJCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvTGlzdGVuZXJMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0ZW5lckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkOTBhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBMaXN0ZW5lckxpc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtYWludGFpbiBhIGxpc3Qgb2YgbGlzdGVuZXJzLCBhbmQKLSAqIGlzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9ucyBvZiBzZXZlcmFsIGNsYXNzZXMgd2l0aGluIGplbQotICogd2hpY2ggYWxsb3cgeW91IHRvIHJlZ2lzdGVyIGxpc3RlbmVycyBvZiB2YXJpb3VzIGtpbmRzLgotICogSXQgaXMgYSBmYWlybHkgbGlnaHR3ZWlnaHQgb2JqZWN0LCBvY2N1cHlpbmcgbWluaW1hbCBzcGFjZSB3aGVuCi0gKiBubyBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgPGNvZGU+YWRkPC9jb2RlPiBtZXRob2QgY2hlY2tzIGZvciBhbmQgZWxpbWluYXRlcyAKLSAqIGR1cGxpY2F0ZXMgYmFzZWQgb24gaWRlbnRpdHkgKG5vdCBlcXVhbGl0eSkuICBMaWtld2lzZSwgdGhlCi0gKiA8Y29kZT5yZW1vdmU8L2NvZGU+IG1ldGhvZCBjb21wYXJlcyBiYXNlZCBvbiBpZGVudGl0eS4KLSAqIDwvcD4KLSAqIDxwPgotICogVXNlIHRoZSA8Y29kZT5nZXRMaXN0ZW5lcnM8L2NvZGU+IG1ldGhvZCB3aGVuIG5vdGlmeWluZyBsaXN0ZW5lcnMuCi0gKiBOb3RlIHRoYXQgbm8gZ2FyYmFnZSBpcyBjcmVhdGVkIGlmIG5vIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4KLSAqIFRoZSByZWNvbW1lbmRlZCBjb2RlIHNlcXVlbmNlIGZvciBub3RpZnlpbmcgYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0gKiBvZiBzYXksIDxjb2RlPkZvb0xpc3RlbmVyLmV2ZW50SGFwcGVuZWQ8L2NvZGU+LCBpczoKLSAqIDxwcmU+Ci0gKiBPYmplY3RbXSBsaXN0ZW5lcnMgPSBteUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLSAqIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gKiAgICAoKEZvb0xpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLmV2ZW50SGFwcGVuZWQoZXZlbnQpOwotICogfQotICogPC9wcmU+Ci0gKiA8L3A+Ci0gKi8KLQotcHVibGljIGNsYXNzIExpc3RlbmVyTGlzdCB7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgbGlzdC4gQWx3YXlzID49IDEuCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FwYWNpdHk7Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgbGlzdGVuZXJzLgotCSAqIE1haW50YWlucyBpbnZhcmlhbnQ6IDAgPD0gc2l6ZSA8PSBsaXN0ZW5lcnMubGVuZ3RoLgotCSAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMuICBJbml0aWFsbHkgPGNvZGU+bnVsbDwvY29kZT4gYnV0IGluaXRpYWxpemVkCi0JICogdG8gYW4gYXJyYXkgb2Ygc2l6ZSBjYXBhY2l0eSB0aGUgZmlyc3QgdGltZSBhIGxpc3RlbmVyIGlzIGFkZGVkLgotCSAqIE1haW50YWlucyBpbnZhcmlhbnQ6IGxpc3RlbmVycyAhPSBudWxsIElGRiBzaXplICE9IDAKLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGxpc3RlbmVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZW1wdHkgYXJyYXkgc2luZ2xldG9uIGluc3RhbmNlLCByZXR1cm5lZCBieSBnZXRMaXN0ZW5lcnMoKQotCSAqIHdoZW4gc2l6ZSA9PSAwLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVtcHR5QXJyYXkgPSBuZXcgT2JqZWN0WzBdOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGxpc3Qgd2l0aCBhbiBpbml0aWFsIGNhcGFjaXR5IG9mIDEuCi0JICovCi0JcHVibGljIExpc3RlbmVyTGlzdCgpIHsKLQkJdGhpcygxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdGVuZXIgbGlzdCB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LgotCSAqCi0JICogQHBhcmFtIGNhcGFjaXR5IHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHdoaWNoIHRoaXMgbGlzdCBjYW4gaW5pdGlhbGx5IGFjY2VwdCAKLQkgKiAgICB3aXRob3V0IGdyb3dpbmcgaXRzIGludGVybmFsIHJlcHJlc2VudGF0aW9uOyBtdXN0IGJlIGF0IGxlYXN0IDEKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJMaXN0KGludCBjYXBhY2l0eSkgewotCQlpZiAoIShjYXBhY2l0eSA+PSAxKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIHRvIHRoaXMgbGlzdC4gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIKLQkgKiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkKE9iamVjdCBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJbGlzdGVuZXJzID0gbmV3IE9iamVjdFtjYXBhY2l0eV07Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcyB1c2luZyBpZGVudGl0eQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQlpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBncm93IGFycmF5IGlmIG5lY2Vzc2FyeQotCQkJaWYgKHNpemUgPT0gbGlzdGVuZXJzLmxlbmd0aCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCWxpc3RlbmVycywKLQkJCQkJMCwKLQkJCQkJbGlzdGVuZXJzID0gbmV3IE9iamVjdFtzaXplICogMiArIDFdLAotCQkJCQkwLAotCQkJCQlzaXplKTsKLQkJCX0KLQkJfQotCQlsaXN0ZW5lcnNbc2l6ZSsrXSA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBmcm9tIHRoaXMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc2l6ZSA9IDA7Ci0JCWxpc3RlbmVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMsCi0JICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiBUaGUgcmVzdWx0aW5nIGFycmF5IGlzIHVuYWZmZWN0ZWQgYnkgc3Vic2VxdWVudCBhZGRzIG9yIHJlbW92ZXMuCi0JICogSWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGFycmF5Ci0JICogc2luZ2xldG9uIGluc3RhbmNlIChubyBnYXJiYWdlIGlzIGNyZWF0ZWQpLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIG5vdGlmeWluZyBsaXN0ZW5lcnMsIHNvIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMKLQkgKiB0byB0aGUgbGlzdGVuZXIgbGlzdCBkdXJpbmcgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIHRoZQotCSAqIG5vdGlmaWNhdGlvbiBpdHNlbGYuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gRW1wdHlBcnJheTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIHJlc3VsdCwgMCwgc2l6ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eS4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLCBhbmQKLQkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyBsaXN0LiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbAotCSAqIGxpc3RlbmVyIHdhcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7Ci0JCQkJaWYgKHNpemUgPT0gMSkgewotCQkJCQlsaXN0ZW5lcnMgPSBudWxsOwotCQkJCQlzaXplID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCQkJbGlzdGVuZXJzLAotCQkJCQkJaSArIDEsCi0JCQkJCQlsaXN0ZW5lcnMsCi0JCQkJCQlpLAotCQkJCQkJLS1zaXplIC0gaSk7Ci0JCQkJCWxpc3RlbmVyc1tzaXplXSA9IG51bGw7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9NYXBKTklUeXBlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvTWFwSk5JVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiZTgxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9NYXBKTklUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IE1hcEpOSVR5cGVzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWFwVHlwZXM7Ci0gCi0KLS8qKgotICogVGhpcyBpcyBhIHB1YmxpYyBjbGFzcyB0byBtYXAgYmV0d2VlbiBKTkkgYW5kIG5vcm1hbCBmb3JtYXQgKGUuZy4gIltMamF2YS5sYW5nLlN0cmluZzsiIHRvICJqYXZhLmxhbmcuU3RyaW5nW10iKSBhbmQgYmFjayBhZ2Fpbi4KLSAqIFRoaXMgaXMgZm9yIGFycmF5cywgbm9uLWFycmF5cyB3aWxsIGJlIGxlZnQgYWxvbmUgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBjb3JyZWN0LgotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBKTklUeXBlcyB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBmb3JtYWwgdHlwZSBuYW1lIHRvIHRoZSBKTkkgZm9ybWF0LgotCSAqIEBwYXJhbSBmb3JtYWxUeXBlTmFtZQotCSAqIEByZXR1cm4gSk5JIGZvcm1hdAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpOSVR5cGVOYW1lKFN0cmluZyBmb3JtYWxUeXBlTmFtZSkgewotCQlyZXR1cm4gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShmb3JtYWxUeXBlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIEpOSSBmb3JtYXQgdG8gdGhlIGZvcm1hbCB0eXBlIG5hbWUuCi0JICogQHBhcmFtIGpuaVR5cGVOYW1lCi0JICogQHJldHVybiBmb3JtYWwgdHlwZSBuYW1lIG9yICIiIGlmIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYWxUeXBlTmFtZShTdHJpbmcgam5pVHlwZU5hbWUpIHsKLQkJcmV0dXJuIE1hcFR5cGVzLmdldEZvcm1hbFR5cGVOYW1lKGpuaVR5cGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGZvcm1hbCB0eXBlIG5hbWUgaXMgZm9yIGEgcHJpbWl0aXZlIG9yIG5vdC4KLQkgKiBAcGFyYW0gZm9ybWFsVHlwZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZm9yIGEgcHJpbWl0aXZlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Zvcm1hbFR5cGVQcmltaXRpdmUoU3RyaW5nIGZvcm1hbFR5cGUpIHsKLQkJcmV0dXJuIE1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5nZXQoZm9ybWFsVHlwZSkgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCB0aGUgZm9ybWFsIHR5cGUgbmFtZSwgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGRpbWVuc2lvbnMsCi0JICogdG8gYW4gYXJyYXkgSk5JIHR5cGUuCi0JICogQHBhcmFtIGZpbmFsQ29tcG9uZW50IGZpbmFsIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgbm90IGJlIGFuIGFycmF5IHR5cGUuCi0JICogQHBhcmFtIGRpbWVuc2lvbnMgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIHRoZSBhcnJheS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Sk5JVHlwZU5hbWUoU3RyaW5nIGZpbmFsQ29tcG9uZW50LCBpbnQgZGltZW5zaW9ucykgewotCQlyZXR1cm4gTWFwVHlwZXMuZ2V0Sk5JVHlwZU5hbWUoZmluYWxDb21wb25lbnQsIGRpbWVuc2lvbnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERUNvbnRyaWJ1dGVDbGFzc3BhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5ZGQzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVDb250cmlidXRlQ2xhc3NwYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUERFQ29udHJpYnV0ZUNsYXNzcGF0aC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS4qOwotCi0gCi0KLS8qKgotICogQ29udHJpYnV0ZSB0byBjbGFzc3BhdGggUERFIGVudHJpZXMgdGhhdCBhcmUgbmVlZGVkIGZvciBhIGxhdW5jaC4KLSAqIDxwPgotICogVGhpcyBpcyBhIHNwZWNpYWwgY2xhc3MgdGhhdCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgZnJvbSBjb2RlLiBSZWZlcmVuY2UgaXQgdGhyb3VnaCB0aGUKLSAqIGludGVyZmFjZSB0aGF0IGl0IGltcGxlbWVudHMuIAotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQREVDb250cmlidXRlQ2xhc3NwYXRoCi0gKiBAc2luY2UgMS4wLjIKLSAqLwotY2xhc3MgUERFQ29udHJpYnV0ZUNsYXNzcGF0aCBpbXBsZW1lbnRzIElQREVDb250cmlidXRlQ2xhc3NwYXRoIHsKLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGgjZ2V0UERFQ29udHJpYnV0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRQREVDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1hcCBwbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKLQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZmluZFBsdWdpbnMocGx1Z2lucywgdHJ1ZSwgdHJ1ZSwgY29udHJvbGxlci5nZXRKYXZhUHJvamVjdCgpKTsKLQkJaWYgKCFwbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJQ29sbGVjdGlvbiBwbHVnaW5JZHMgPSBwbHVnaW5zLmtleVNldCgpOwotCQkJUGx1Z2luTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFBERUNvcmUuZ2V0RGVmYXVsdCgpLmdldE1vZGVsTWFuYWdlcigpOwotCQkJSUZyYWdtZW50TW9kZWxbXSBmcmFnbWVudHMgPSBtb2RlbE1hbmFnZXIuZ2V0RnJhZ21lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlGcmFnbWVudCBmcmFnbWVudCA9IGZyYWdtZW50c1tpXS5nZXRGcmFnbWVudCgpOwotCQkJCWlmIChwbHVnaW5JZHMuY29udGFpbnMoZnJhZ21lbnQuZ2V0UGx1Z2luSWQoKSkpIHsKLQkJCQkJLy8gV2UnbGwgZG8gYSBjaGVhdCBmb3Igbm93IGFuZCBhc3N1bWUgZnJhZ21lbnQgaXMgZm9yIHNhbWUgdmVyc2lvbiBvZiBwbHVnaW4uIFBERUNvcmUgYWN0dWFsbHkKLQkJCQkJLy8gY2hlY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBmcmFnbWVudCBhZ2FpbnN0IHRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4gdG8gc2VlIHRoZXkgYXJlIGZvciBlYWNoCi0JCQkJCS8vIG90aGVyLCBidXQgd2UnbGwganVzdCBhc3N1bWUgdGhleSBhcmUgZm9yIG5vdy4gQ2hhbmdlIHRoaXMgbGF0ZXIgaWYgd2UgYWN0dWFsbHkgZG8gcnVuIGludG8gdGhpcyBjYXNlLgotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmcmFnbWVudC5nZXRNb2RlbCgpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJSVByb2plY3QgZnJhZ1Byb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQlpZiAoZnJhZ1Byb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCQkJCQljb250cm9sbGVyLmNvbnRyaWJ1dGVQcm9qZWN0KGZyYWdQcm9qZWN0KTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJSVBsdWdpbkxpYnJhcnlbXSBsaWJyYXJpZXMgPSBmcmFnbWVudC5nZXRMaWJyYXJpZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaWJyYXJpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlQbHVnaW5MaWJyYXJ5IGxpYnJhcnkgPSBsaWJyYXJpZXNbal07Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGxpYnJhcnkuZ2V0TmFtZSgpOwotCQkJCQkJU3RyaW5nIGV4cGFuZGVkTmFtZSA9IENsYXNzcGF0aFV0aWxDb3JlLmV4cGFuZExpYnJhcnlOYW1lKG5hbWUpOwotCi0JCQkJCQlJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gbGlicmFyeS5nZXRQbHVnaW5Nb2RlbCgpOwotCQkJCQkJVVJMIHVybCA9IGdldFBhdGgobW9kZWwsIGV4cGFuZGVkTmFtZSk7Ci0JCQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKHVybCwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9VU0VSX0NMQVNTUEFUSCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybjsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkwgZ2V0UGF0aChJUGx1Z2luTW9kZWxCYXNlIG1vZGVsLCBTdHJpbmcgbGlicmFyeU5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG1vZGVsLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgamFyRmlsZSA9IHJlc291cmNlLmdldFByb2plY3QoKS5maW5kTWVtYmVyKGxpYnJhcnlOYW1lKTsKLQkJCQlpZiAoamFyRmlsZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gamFyRmlsZS5nZXRGdWxsUGF0aCgpLnRvRmlsZSgpLnRvVVJMKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG1vZGVsLmdldEluc3RhbGxMb2NhdGlvbigpLCBsaWJyYXJ5TmFtZSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJCXJldHVybiBmaWxlLnRvVVJMKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVDb250cmlidXRlQ2xhc3NwYXRoSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERUNvbnRyaWJ1dGVDbGFzc3BhdGhJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRiNzE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERUNvbnRyaWJ1dGVDbGFzc3BhdGhJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUERFQ29udHJpYnV0ZUNsYXNzcGF0aEluc3RhbmNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0gCi0KLS8qKgotICogQWNjZXNzb3IgdG8gdGhlIElQREVDb250cmlidXRlQ2xhc3NwYXRoIGluc3RhbmNlIHRvIHVzZS4KLSAqIDxwYWNha2dlLXByb3RlY3RlZD4gYmVjYXVzZSBvbmx5IElQREVDb250cmlidXRlQ2xhc3NwYXRoIHNob3VsZCBhY2Nlc3MgaXQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMgotICovCi1jbGFzcyBQREVDb250cmlidXRlQ2xhc3NwYXRoSW5zdGFuY2UgewotCi0JLyoqCi0JICogR2V0IHRoZSBpbnN0YW5jZSB0byB1c2UuIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIHRvIHVzZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBQREUgbm90IGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQREVDb250cmlidXRlQ2xhc3NwYXRoIGdldEluc3RhbmNlKCkgewotCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5wZGUuY29yZSIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlDbGFzcyBwZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlBERUNvbnRyaWJ1dGVDbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAoSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGgpIHBkZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBQREUgbm90IGF2YWlsYWJsZSwgdGhpcyBpcyBvay4KLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLmdldENhdXNlKCksIExldmVsLldBUk5JTkcpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERVByb2Nlc3NGb3JQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1BERVByb2Nlc3NGb3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4OWQwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9QREVQcm9jZXNzRm9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQREVQcm9jZXNzRm9yUGx1Z2luLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLmNvcmUuUERFQ29yZTsKLSAKLQotLyoKLSAqIFVzZWQgZm9yIFBERSBQcm9jZXNzaW5nIGZvciB0aGUgUHJveHkgUGx1Z2luIGNsYXNzLiBJdCB3aWxsIGJlIG9wdGlvbmFsbHkgbG9hZGVkCi0gKiBpZiBQREUgcGx1Z2luIGlzIGluc3RhbGxlZC4gVGhpcyBhbGxvd3MgdXNhZ2UgaW4gYW4gaW5zdGFsbGF0aW9uIHRoYXQgZG9lc24ndCBoYXZlCi0gKiBQREUgaW5zdGFsbGVkLgotICogCi0gKiBAc2luY2UgMS4wLjIKLSAqLwotY2xhc3MgUERFUHJvY2Vzc0ZvclBsdWdpbiBpbXBsZW1lbnRzIFByb3h5UGx1Z2luLklQREVQcm9jZXNzRm9yUGx1Z2luIHsKLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luLklQREVQcm9jZXNzRm9yUGx1Z2luI3Byb2Nlc3NQbHVnaW4ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0LCBqYXZhLnV0aWwuTWFwLCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmRQbHVnaW5zKElKYXZhUHJvamVjdCBwcm9qZWN0LCBNYXAgcGx1Z2luSWRzLCBib29sZWFuIHZpc2libGUsIGJvb2xlYW4gZmlyc3QpIHsKLQkJSVBsdWdpbk1vZGVsQmFzZSBtID0gUERFQ29yZS5nZXREZWZhdWx0KCkuZ2V0TW9kZWxNYW5hZ2VyKCkuZmluZE1vZGVsKHByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKG0gaW5zdGFuY2VvZiBJUGx1Z2luTW9kZWwpIHsKLQkJCS8vIGl0IGlzIGEgcGx1Z2luLCBwcm9jZXNzIGl0LgotCQkJSVBsdWdpbiBwbHVnaW4gPSAoKElQbHVnaW5Nb2RlbCkgbSkuZ2V0UGx1Z2luKCk7CQkJCi0JCQlpZiAocGx1Z2luSWRzLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRJZCgpKSkKLQkJCQlyZXR1cm47CS8vIGFscmVhZHkgcHJvY2Vzc2VkIGl0Ci0JCQlwbHVnaW5JZHMucHV0KHBsdWdpbi5nZXRJZCgpLCBmaXJzdCB8fCB2aXNpYmxlID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CQkJCi0JCQlleHBhbmRQbHVnaW4ocGx1Z2luLCBwbHVnaW5JZHMsIHZpc2libGUsIGZpcnN0KTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCQotCXByaXZhdGUgdm9pZCBleHBhbmRQbHVnaW4oSVBsdWdpbiBwbHVnaW4sIE1hcCBwbHVnaW5JZHMsIGJvb2xlYW4gdmlzaWJsZSwgYm9vbGVhbiBmaXJzdCkgewotCQlJUGx1Z2luSW1wb3J0W10gaW1wb3J0cyA9IHBsdWdpbi5nZXRJbXBvcnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJSVBsdWdpbkltcG9ydCBwaSA9IGltcG9ydHNbaV07Ci0JCQlCb29sZWFuIHBpVmFsdWUgPSAoQm9vbGVhbikgcGx1Z2luSWRzLmdldChwaS5nZXRJZCgpKTsKLQkJCWJvb2xlYW4gaW1wb3J0VmlzaWJsZSA9IGZpcnN0IHx8ICh2aXNpYmxlICYmIHBpLmlzUmVleHBvcnRlZCgpKTsKLQkJCWlmIChwaVZhbHVlICE9IG51bGwgJiYgKCFpbXBvcnRWaXNpYmxlIHx8IHBpVmFsdWUuYm9vbGVhblZhbHVlKCkpKQotCQkJCWNvbnRpbnVlOwkvLyB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCwgdGhpcyB0aW1lIG5vdCB2aXNpYmxlLCBvciB0aGlzIHRpbWUgdmlzaWJsZSBhbmQgd2FzIHByZXZpb3VzbHkgdmlzaWJsZS4KLQkJCS8vIE5vdyBlaXRoZXIgZmlyc3QgdGltZSwgb3IgaXQgd2FzIHRoZXJlIGJlZm9yZSwgYnV0IG5vdyB2aXNpYmxlLCBidXQgdGhpcyB0aW1lIGl0IGlzIHZpc2libGUuCi0JCQkvLyBXZSB3YW50IGl0IHRvIGJlY29tZSB2aXNpYmxlIGluIHRoYXQgY2FzZS4gCi0JCQlwbHVnaW5JZHMucHV0KHBpLmdldElkKCksIGltcG9ydFZpc2libGUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsJCQkKLQkJCUlQbHVnaW4gcGIgPSBQREVDb3JlLmdldERlZmF1bHQoKS5maW5kUGx1Z2luKHBpLmdldElkKCksCi0JCQkJcGkuZ2V0VmVyc2lvbigpLAotCQkJCXBpLmdldE1hdGNoKCkpOwotCQkJaWYgKHBiICE9IG51bGwpCi0JCQkJZXhwYW5kUGx1Z2luKHBiLCBwbHVnaW5JZHMsIGltcG9ydFZpc2libGUsIGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Byb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDY0MmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Byb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE0ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5UaW1lclRlc3RzOwotCi0vKioKLSAqIFJlZ2lzdHJ5IG9mIHByb3h5IGZhY3RvcmllcyBvbiBhIHBlci1WTSBiYXNpcy4KLSAqIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBWTSdzLCB0aGlzIHdvdWxkIGJlIHJlcXVpcmVkIGJ5IHRoZQotICogZGVza3RvcCBiZWNhdXNlIG1vcmUgdGhhbiBvbmUgcHJvamVjdCBjb3VsZCBiZSBvcGVuLCBhbmQgZWFjaAotICogd291bGQgcmVxdWlyZSB0aGVpciBvd24gVk0gYmVjYXVzZSB0aGUgY2xhc3NwYXRocyB3b3VsZCBiZSBkaWZmZXJlbnQuCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBzdWJjbGFzc2VkIHRvIHByb3ZpZGUgbW9yZSBmYWN0b3JpZXMgZm9yIGEgcGFydGljdWxhcgotICogVk0uIAotICogQ3JlYXRpb24gZGF0ZTogKDMvMTMvMDAgMTA6NDg6MTAgQU0pCi0gKiBAYXV0aG9yOiBSaWNoYXJkIExlZSBLdWxwCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm94eUZhY3RvcnlSZWdpc3RyeSB7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklzVmFsaWQgPSB0cnVlOwkvLyBUaGUgcmVnaXN0cnkgaXMgdmFsaWQgdW50aWwgdGVybWluYXRlZC4KLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0IHJlZ2lzdHJ5TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQotCS8qKgotCSAqIElSZWdpc3RyeUxpc3RlbmVyCi0JICogTGlzdGVuIGZvciB0aGUgcmVnaXN0cnkgYmVpbmcgdGVybWluYXRlZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElSZWdpc3RyeUxpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIE1ldGhvZCByZWdpc3RyeVRlcm1pbmF0ZWQuCi0JCSAqIAotCQkgKiBUaGUgcmVnaXN0cnkgaGFzIGJlZW4gdGVybWluYXRlZC4gV2hlbiB0aGlzIGlzIGNhbGxlZCB0aGUgcmVnaXN0cnkKLQkJICogaXMgbm8gbG9uZ2VyIHZhbGlkLiBJdCBzaG91bGQgbm90IGJlIGFzc3VtZWQgYW55IGNhbGxzIGNhbiBiZSBtYWRlCi0JCSAqIHRvIHRoZSByZWdpc3RyeS4KLQkJICogCi0JCSAqIEBwYXJhbSByZWdpc3RyeQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaXN0cnlUZXJtaW5hdGVkKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQl9Ci0JCQotCi0JLy8gRmFjdG9yeSByZWdpc3RyYXRpb24gSVMgTk9UIGEgZHluYW1pYyByZWdpc3RyYXRpb24uIE9uY2UgcmVnaXN0ZXJlZCBmb3IgYSBWTSBvciBhbiBpbnN0YW5jZQotCS8vIHRoZXkgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiBUaGlzIGlzIGJlY2F1c2UgcmVmZXJlbmNlcyBhcmUgY2FjaGVkIGluIG90aGVyIG9iamVjdHMuCi0JLy8gVGhlIFZNIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlZ2lzdHJ5IHNob3VsZG4ndCBleGl0ZWQgYW5kIHJlc3RhcnRlZCBiZWNhdXNlCi0JLy8gdGhlIGNhY2hlZCBvYmplY3Qgd2lsbCB0aGVuIGhhdmUgaW52YWxpZCByZWZlcmVuY2VzIHRvIG5vIGxvbmdlciBleGlzdGluZyBvYmplY3RzLgotCS8vIElmIHRoZSBWTSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQsIHRoZW4gYWxsIHByb3hpZXMgbmVlZCB0byBiZSB0b3NzZWQuCi0JCi0JLy8KLQkvLyBJbmRpdmlkdWFsIFByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhcHBsaWVzIHRvIGEgcGFydGljdWxhciBWTS4KLQkvLwotCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JLy8KLQkvLyBJQmVhblByb3h5RmFjdG9yeSBSZWdpc3RyeQotCS8vCi0JCi0JLy8gVGhlIHN0YW5kYXJkIGJlYW4gIHByb3h5IGZhY3RvcnksIHRoZSBvbmUgdGhlIGRlc2t0b3Agd2lsbCB1c2UgZm9yIHBhY2thZ2VzIHRoYXQgaGF2ZSBub3QKLQkvLyBiZWVuIGV4dGVuZGVkIGFuZCByZWdpc3RlcmVkIGJ5IGN1c3RvbWl6YXRpb24gZGV2ZWxvcGVycy4KLQlwcm90ZWN0ZWQgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeTsKLQotCS8vIFRoZSBkaXJlY3Rvcnkgb2YgcmVnaXN0ZXJlZCBleHRlbnNpb24gZmFjdG9yaWVzLCB0eXBpY2FsbHkgcmVnaXN0ZXJlZCBieSBwYWNrYWdlLgotCWZpbmFsIHByb3RlY3RlZCBIYXNodGFibGUgZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuUHJveHlGYWN0b3JpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkvLwotCS8vIElCZWFuVHlwZVByb3h5RmFjdG9yeSBSZWdpc3RyeQotCS8vCi0JCi0JLy8gVGhlIHN0YW5kYXJkIGJlYW4gdHlwZSBwcm94eSBmYWN0b3J5LCB0aGUgb25lIHRoZSBkZXNrdG9wIHdpbGwgdXNlIGZvciBwYWNrYWdlcyB0aGF0IGhhdmUgbm90Ci0JLy8gYmVlbiBleHRlbmRlZCBhbmQgcmVnaXN0ZXJlZCBieSBjdXN0b21pemF0aW9uIGRldmVsb3BlcnMuCi0JcHJvdGVjdGVkIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZDdXJyZW50U3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeTsKLQotCS8vIFRoZSBkaXJlY3Rvcnkgb2YgcmVnaXN0ZXJlZCBleHRlbnNpb24gZmFjdG9yaWVzLCB0eXBpY2FsbHkgcmVnaXN0ZXJlZCBieSBwYWNrYWdlLgotCWZpbmFsIHByb3RlY3RlZCBIYXNodGFibGUgZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQotCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JLy8KLQkvLyBPdGhlciBmYWN0b3JpZXMKLQkvLwotCQkKLQlwcm90ZWN0ZWQgSU1ldGhvZFByb3h5RmFjdG9yeSBmTWV0aG9kUHJveHlGYWN0b3J5ID0gbnVsbDsJLy8gTWV0aG9kIFByb3h5IEZhY3RvcnkKLQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCS8vCi0JLy8gQ29uc3RhbnRzIFJlZ2lzdHJ5LiBEaWZmZXJlbnQgZXh0ZW5zaW9ucyBjYW4gc3RvcmUKLQkvLyBvYmplY3RzIGJ5IGtleSBhcyBhIHJlZ2lzdHJ5IG9mIGNvbnN0YW50cy4KLQkvLyBGb3IgZXhhbXBsZSwgamF2YS5hd3QgZXh0ZW5zaW9uIHdpbGwgc3RvcmUgYW4gb2JqZWN0Ci0JLy8gd2hpY2ggaGFzIHNvbWUgcHJlLWZldGNoZWQgbWV0aG9kIHByb3hpZXMgc3RvcmVkIGluIGl0IHNvCi0JLy8gdGhhdCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgY29udGludWFsbHkgcmVjcmVhdGVkLgotCS8vCi0JLy8gVGhpcyBmZWF0dXJlIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZSwgc28gdGhhdAotCS8vIG9ubHkgcHJveGllcyB0aGF0IHJlYWxseSBuZWVkIHRvIGJlIGNhY2hlZCBzaG91bGQKLQkvLyBiZSBjYWNoZWQuCi0JLy8KLQkvLyBEb24ndCBzdG9yZSBwcm94aWVzIHRvIGxpdmUgYmVhbnMgaW4gaGVyZSBiZWNhdXNlCi0JLy8gdGhvc2Ugd2lsbCBiZSBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgb3ZlciBhbmQgb3ZlciwKLQkvLyBhbmQgdGhlIGluc3RhbmNlIGluIHRoaXMgY2FjaGUgd2lsbCBnZXQgc3RhbGUuCi0JLy8gU2hvdWxkIG9ubHkgc3RvcmUgdGhpbmdzIGxpa2Ugb2Z0ZW4gdXNlZCBtZXRob2QKLQkvLyBwcm94aWVzIHRoYXQgb25jZSBjcmVhdGVkIGFyZSByYXJlbHkgY2hhbmdlZC4KLQkvLwotCS8vIFNpbmNlIHRoZSBwcm94aWVzIGNhbiBiZSBvbiBhbnkgVk0sIHlvdSBzaG91bGQgaGF2ZQotCS8vIGFuIGludGVyZmFjZSBkZWZpbmluZyB3aGF0J3MgYXZhaWxhYmxlIGluIHlvdXIKLQkvLyBjb25zdGFudHMgZW50cnksIGFuZCBhY2Nlc3MgaXQgdGhyb3VnaCB0aGF0LgotCi0JcHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZSBmUmVnaXN0ZXJlZENvbnN0YW50cyA9IG5ldyBIYXNodGFibGUoKTsJCQotCi0JLyoqCi0JICogUHJveHlGYWN0b3J5UmVnaXN0cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCBhZGRSZWdpc3RyeUxpc3RlbmVyLgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZ2lzdHJ5TGlzdGVuZXIoSVJlZ2lzdHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmVnaXN0cnlMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHJlbW92ZVJlZ2lzdHJ5TGlzdGVuZXIuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVnaXN0cnlMaXN0ZW5lcihJUmVnaXN0cnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZWdpc3RyeUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUmVnaXN0cnlUZXJtaW5hdGVkKCkgewotCQlpZiAoIXJlZ2lzdHJ5TGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gbGlzdCA9IHJlZ2lzdHJ5TGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJUmVnaXN0cnlMaXN0ZW5lcikgbGlzdFtpXSkucmVnaXN0cnlUZXJtaW5hdGVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSBSZXR1cm4gdGhlIGN1cnJlbnQgZmFjdG9yeSB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBJQmVhblByb3h5IGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyBJU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGdldEJlYW5Qcm94eUZhY3RvcnkoKSB7Ci0JCWlmIChmQ3VycmVudFN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihQcm94eU1lc3NhZ2VzLlByb3h5RmFjdG9yeV9FWENfX05vQmVhblByb3h5RmFjdG9yeSk7Ci0JCX0KLQkJcmV0dXJuIGZDdXJyZW50U3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5OwotCX0KLQkvKioKLQkgUmV0dXJuIHRoZSBjdXJyZW50IHJlZ2lzdGVyZWQgYmVhbiBwcm94eSBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuUHJveHkgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIElCZWFuUHJveHlGYWN0b3J5IGdldEJlYW5Qcm94eUZhY3RvcnlFeHRlbnNpb24oU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCXJldHVybiAoSUJlYW5Qcm94eUZhY3RvcnkpZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuUHJveHlGYWN0b3JpZXMuZ2V0KHBhY2thZ2VOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JIFJldHVybiB0aGUgY3VycmVudCBmYWN0b3J5IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIElCZWFuVHlwZVByb3h5IGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyBJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBnZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpIHsKLQkJaWYgKGZDdXJyZW50U3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihQcm94eU1lc3NhZ2VzLlByb3h5RmFjdG9yeV9FWENfX05vQmVhblR5cGVQcm94eUZhY3RvcnkpOwotCQl9Ci0JCXJldHVybiBmQ3VycmVudFN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3Rvcnk7Ci0JfQotCS8qKgotCSBSZXR1cm4gdGhlIGN1cnJlbnQgcmVnaXN0ZXJlZCBiZWFuIHR5cGUgcHJveHkgZmFjdG9yeSB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBJQmVhblR5cGVQcm94eSBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHlGYWN0b3J5IGdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlyZXR1cm4gKElCZWFuVHlwZVByb3h5RmFjdG9yeSlmUmVnaXN0ZXJlZEV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3JpZXMuZ2V0KHBhY2thZ2VOYW1lKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSByZXF1ZXN0ZWQgY29uc3RhbnRzIGVudHJ5Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb25zdGFudHMoT2JqZWN0IGtleSkgewotCQlyZXR1cm4gZlJlZ2lzdGVyZWRDb25zdGFudHMuZ2V0KGtleSk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgTWV0aG9kUHJveHlGYWN0b3J5IGZvciB0aGlzIFZNLgotCSAqIENyZWF0aW9uIGRhdGU6ICgzLzEzLzAwIDEwOjU0OjU5IEFNKQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5RmFjdG9yeQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlGYWN0b3J5IGdldE1ldGhvZFByb3h5RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZNZXRob2RQcm94eUZhY3Rvcnk7Ci0JfQotCQotCQotCS8qKgotCSAqIFNldCB0aGUgcmVxdWVzdGVkIGNvbnN0YW50cyBlbnRyeSBmb3IgdGhpcyBWTS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckNvbnN0YW50cyhPYmplY3Qga2V5LCBPYmplY3QgY29uc3RhbnQpIHsKLQkJZlJlZ2lzdGVyZWRDb25zdGFudHMucHV0KGtleSwgY29uc3RhbnQpOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGNvbnN0YW50cyBmb3IgdGhlIGdpdmVuIGtleS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogCi0gICAgICogQHNpbmNlIDEuMS4wCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlckNvbnN0YW50cyhPYmplY3Qga2V5KSB7Ci0gICAgICAgIGZSZWdpc3RlcmVkQ29uc3RhbnRzLnJlbW92ZShrZXkpOwotICAgIH0KLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBwcm94eSwgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0byBlYXNpbHkgYWNjZXNzIHRoZSByZWxlYXNlIGZyb20gdGhlIGJlYW4gcHJveHkgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlUHJveHkoSUJlYW5Qcm94eSBwcm94eSkgewotCQkvLyBUbyBzaW1wbHkgdGhpbmdzIGlmIHJlbGVhc2UgaXMgY2FsbGVkIHdoZW4gdGhlIGZhY3RvcnkgaXMgZG93biAoaW52YWxpZCksIHRoZW4ganVzdAotCQkvLyBnbyBvbiBiZWNhdXNlIHRoZSBwcm94eSBpcyBhbHJlYWR5IHJlbGVhc2VkLgotCQlpZiAoZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgIT0gbnVsbCkKLQkJCWZDdXJyZW50U3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LnJlbGVhc2VQcm94eShwcm94eSk7Ci0JfSAKLQotCS8qKgotCSAqIElzIHRoaXMgYSB2YWxpZCByZWdpc3RyeSwgaS5lLiBpcyBpdCBub3QgdGVybWluYXRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZklzVmFsaWQ7Ci0JfQotCQotCS8qKgotCSAqIFRlcm1pbmF0ZSB0aGUgcmVnaXN0cnkgd2l0aG91dCB3YWl0aW5nLgotCSAqIDxwPgotCSAqIFRlcm1pbmF0ZSB0aGUgcmVnaXN0cnksIGJ1dCBkb24ndCBuZWNlc3NhcmlseSB3YWl0IGZvciBpdC4KLQkgKgotCSAqIEBzZWUgI3Rlcm1pbmF0ZVJlZ2lzdHJ5KGJvb2xlYW4pCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVybWluYXRlUmVnaXN0cnkoKSB7Ci0JCXRlcm1pbmF0ZVJlZ2lzdHJ5KGZhbHNlKTsKLQl9Ci0JCQotCS8qKgotCSAqIFRlcm1pbmF0ZSB0aGUgcmVnaXN0cnkuCi0JICogPHA+Ci0JICogVGhpcyB3aWxsIGdvIHRocm91Z2ggZWFjaCBmYWN0b3J5IGFuZCB0ZXJtaW5hdGUgaXQsIGFuZAotCSAqIGxldCB0aGUgc3ViY2xhc3MgdGVybWluYXRlLiBJdCB3aWxsIHRoZW4gcmVtb3ZlIGFsbCBvZiB0aGUgZmFjdG9yaWVzIHNvIHRoYXQKLQkgKiBpZiB0aGVyZSBhcmUgYW55IHByb3hpZXMgc3RpbGwgaGFuZ2luZyBhcm91bmQgdGhleSB3b24ndCBob2xkIG9udG8gZXZlcnl0aGluZywKLQkgKiBqdXN0IHRoZSB0aGlzIHJlZ2lzdHJ5IHdpbGwgYmUgaGVsZCBvbnRvLgotCSAqPHA+Ci0JICogTm90ZSBkdXJpbmcgdGVybWluYXRpb24sIHRoZSBmYWN0b3JpZXMgc2hvdWxkIG5vdCByZWZlcmVuY2UgYW55IG90aGVyIGZhY3RvcnkuCi0JICogSXQgY2FuIGFzc3VtZSB0aGF0IHRoZSBmYWN0b3JpZXMgd2lsbCB0YWtlIGNhcmUgb2YgdGhlbXNlbHZlcyBhbmQgdGhleSBzaG91bGQKLQkgKiBvbmx5IHJlbGVhc2UgdGhlaXIgcmVzb3VyY2VzLgotCSAqIDxwPgotCSAqIFRoZSBjb25zdGFudHMgcmVnaXN0cnkgd2lsbCBub3QgYmUgdGVybWluYXRlZCBiZWNhdXNlIHRoZXkgYXJlbid0IGZhY3Rvcmllcy4KLQkgKiBIb3dldmVyLCB0aGV5IHdpbGwgYmUgY2xlYXJlZCAobm8gbG9uZ2VyIHJlZmVyZW5jZWQpIGZyb20gaGVyZSBzbyB0aGF0IHRoZXkKLQkgKiBjYW4gYmUgR0MnZC4KLQkgKiAKLQkgKiBAcGFyYW0gd2FpdCA8Y29kZT50cnVlPC9jb2RlPiB0byB3YWl0IGZvciBjb21wbGV0ZSB0ZXJtaW5hdGlvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGtpY2sgb2ZmIHRlcm1pbmF0aW9uIGJ1dCByZXR1cm4gQVNBUC4KLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXJtaW5hdGVSZWdpc3RyeShib29sZWFuIHdhaXQpIHsKLQkJaWYgKCFmSXNWYWxpZCkKLQkJCXJldHVybjsJLy8gQWxyZWFkeSBvciBhcmUgYWxyZWFkeSB0ZXJtaW5hdGluZy4gRG9uJ3QgZG8gaXQgYWdhaW4gYW5kIGRvbid0IG5vdGlmeSBhZ2Fpbi4KLQkJZklzVmFsaWQgPSBmYWxzZTsKLQkJaWYgKGZDdXJyZW50U3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSAhPSBudWxsKSB7Ci0vLwkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0U3RlcCgiVGVybWluYXRlIEJlYW4gVHlwZSBGYWN0b3J5Iik7Ci0JCQlmQ3VycmVudFN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkudGVybWluYXRlRmFjdG9yeSh3YWl0KTsKLS8vCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoIlRlcm1pbmF0ZSBCZWFuIFR5cGUgRmFjdG9yeSIpOwotCQkJZkN1cnJlbnRTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQlpZiAoZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgIT0gbnVsbCkgewotCQkJZkN1cnJlbnRTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkudGVybWluYXRlRmFjdG9yeSh3YWl0KTsKLQkJCWZDdXJyZW50U3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQlpZiAoZk1ldGhvZFByb3h5RmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmTWV0aG9kUHJveHlGYWN0b3J5LnRlcm1pbmF0ZUZhY3Rvcnkod2FpdCk7Ci0JCQlmTWV0aG9kUHJveHlGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRyID0gZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkoKElCZWFuUHJveHlGYWN0b3J5KSBpdHIubmV4dCgpKS50ZXJtaW5hdGVGYWN0b3J5KHdhaXQpOwotCQl9Ci0JCWZSZWdpc3RlcmVkRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3Rvcmllcy5jbGVhcigpOwotCQkKLQkJaXRyID0gZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuUHJveHlGYWN0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCSgoSUJlYW5Qcm94eUZhY3RvcnkpIGl0ci5uZXh0KCkpLnRlcm1pbmF0ZUZhY3Rvcnkod2FpdCk7Ci0JCX0KLQkJZlJlZ2lzdGVyZWRFeHRlbnNpb25CZWFuUHJveHlGYWN0b3JpZXMuY2xlYXIoKTsKLQkJCi0JCWZSZWdpc3RlcmVkQ29uc3RhbnRzLmNsZWFyKCk7Ci0JCQotCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydFN0ZXAoIlJlZ2lzdHJ5IFRlcm1pbmF0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3RyeVRlcm1pbmF0ZWQod2FpdCk7Ci0JCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BTdGVwKCJSZWdpc3RyeSBUZXJtaW5hdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0vLwkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRTdGVwKCJSZWdpc3RyeSBUZXJtaW5hdGVkIE5vdGlmaWNhdGlvbiIpOwotCQlmaXJlUmVnaXN0cnlUZXJtaW5hdGVkKCk7CS8vIExldCBldmVyeW9uZSBrbm93IHRoYXQgd2UgYXJlIGdvbmUuIFRoaXMgaXMgZmlyZWQgZXZlbiBpZiB3YWl0IGlzIGZhbHNlIGJlY2F1c2UgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHRoZSByZWdpc3RyeSBpcyBpbnZhbGlkLgotLy8JCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BTdGVwKCJSZWdpc3RyeSBUZXJtaW5hdGVkIE5vdGlmaWNhdGlvbiIpOwotCX0KLQkKLQotCS8qKgotCSAqIFRlcm1pbmF0ZSB0aGUgUmVnaXN0cnkuIAotCSAqIDxwPgotCSAqIEl0IGlzIHVwIHRvIGVhY2ggcmVnaXN0cnkgdG8gZGV0ZXJtaW5lIHdoYXQgdGhpcyBtZWFucy4KLQkgKiA8cD4KLQkgKiBUaGUgd2FpdCBwYXJtIGlzIGEgc3VnZ2VzdGlvbiBpZiBpdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIGJ1dCBpdCBtdXN0IGJlIGhvbm91cmVkIGlmIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHdhaXQgd2FpdCBmb3IgcmVnaXN0cnkgdG8gdGVybWluYXRlIGZsYWcuCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVnaXN0cnlUZXJtaW5hdGVkKGJvb2xlYW4gd2FpdCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjYWxsYmFjayByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUNhbGxiYWNrUmVnaXN0cnkgZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlMYXVuY2hTdXBwb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUxhdW5jaFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4Y2JlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eUxhdW5jaFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQcm94eUxhdW5jaFN1cHBvcnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLQotIAotLyoqCi0gKiBUaGlzIGlzIHRoZSB1c2VkIHRvIGxhdW5jaCB0aGUgcHJveHkgcmVnaXN0cmllcy4KLSAqIFRoaXMgaXMgYSBzdGF0aWMgaGVscGVyIGNsYXNzLCBpdCBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3h5TGF1bmNoU3VwcG9ydCB7Ci0JCi0JLy8gVGhlIGtleSBmb3IgdGhlIHBlcnNpc3RlbiBwcm9wZXJ0eSBpcyBpbiBQcm94eVBsdWdpbiBzbyB0aGF0IGl0IGNhbiBzZXQgaXQgb24gc3RhcnR1cCB3aXRob3V0Ci0JLy8gY2F1c2luZyB0aGlzIGNsYXNzIHRvIGJlIGluaXRpYWxpemVkLiBXZSBkb24ndCB3YW50IHRoaXMgY2xhc3MgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIHZlcnkgbGFzdAotCS8vIG1vbWVudCB3aGVuIG5lZWRlZC4gVGhpcyBpcyBiZWNhdXNlIGl0IG5lZWRzIFVJIHRvIGJlIGFjdGl2ZSB3aGVuIGluaXRpYWxpemVkIHRvIHF1ZXJ5IHNvbWUgCi0JLy8gdmFsdWVzIGFuZCBpZiBQcm94eVBsdWdpbi5zdGFydCgpIGNhdXNlcyB0aGlzIGNsYXNzIHRvIGluaXRpYWxpemUsIGl0IG1heSBiZSB0b28gc29vbi4KLQkvLwotCS8vIElmIGEgcHJvamVjdCdzIHBlcnNpc3RlbnQgcHJvcGVydHkgaXMgc2V0IHdpdGggdGhpcyB2YWx1ZSwgdGhhdCBtZWFucyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLQkvLyBsYXVuY2ggY29uZmlndXJhdGlvbiB3aXRoIHRoaXMgcHJvamVjdCwgYnV0IG5vbmUgYXJlIHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0LiBUaGlzIGlzIGhlcmUKLQkvLyBzbyB0aGF0IHdlIGNhbiBjaGVjayBpbiB0aGUgb2JqZWN0IGNvbnRyaWJ1dGlvbiB0aGF0IGlmIG5vdCBzZXQgdGhlbiBkb24ndCBzaG93IHRoZSBtZW51Ci0JLy8gaXRlbSBhdCBhbGwuIFRoaXMgaXMgdG8gY2xlYW4gdXAgdGhlIHBvcHVwIG1lbnUgc28gbm90IHNvIGNsdXR0ZXJlZC4KLQkvLyBJZiB0aGUgcHJvcGVydHkgaXMgdHJ1bGx5IG5vdCBzZXQsIHRoZW4gdGhlcmUgaXMgbm8gZGVmYXVsdCBhbmQgdGhlcmUgYXJlIG5vIGNvbmZpZ3VyYXRpb25zIGZvciBpdC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfU0VUID0gIi4uLm5vdC4uc2V0Li4iOwkgIC8vJE5PTi1OTFMtMSQKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9UUkFDSU5HID0gIi9kZWJ1Zy90cmFjZWV4cHJlc3Npb25zIjsJLy8gVHJhY2UgSUV4cHJlc3Npb25zLiAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGltZXIgdGhyZXNob2xkIGZvciBpbmRpY2F0aW5nIGFueSBleHByZXNzaW9ucyB0aGF0IHRvb2sgbG9uZ2VyIHRoYW4gdGhpcy4KLQkgKiBJZiBub3Qgc2V0LCB0aGVuIHRocmVzaG9sZCB3aWxsIGRlZmF1bHQgdG8gMTAwbXMuCi0JICogSXQgd2lsbCBvbmx5IGJlIHVzZWQgaWYgdHJhY2VleHByZXNzaW9ucyBpcyB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fVFJBQ0VJTkdfVElNRVJfVEhSRVNIT0xEID0gIi9kZWJ1Zy90cmFjZWV4cHJlc3Npb25zdGltZXRocmVzaG9sZCI7CSAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBSZWdpc3RyeSBvZiBsYXVuY2gga2V5IHRvIExhdW5jaEluZm8gY2xhc3Nlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgTEFVTkNIX0lORk8gPSBuZXcgSGFzaE1hcCgyKTsKLQotCS8qKgotCSAqIFB1YmxpYyBvbmx5IGZvciBhY2Nlc3MgYnkgb3RoZXIgbGF1bmNoIGRlbGVnYXRlcyB0byBzZXQgdXAgaWYgdGhleSBnbyBvdXRzaWRlIG9mIFByb3h5TGF1bmNoU3VwcG9ydCwKLQkgKiBlLmcuIElERSBwcm94eS4gTXVzdCBub3QgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2UuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMYXVuY2hTdXBwb3J0SUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBNYXAgb2YgY29udGFpbmVycyAoSUNsYXNzcGF0aENvbnRhaW5lcikgZm91bmQgaW4gY2xhc3NwYXRoIChpbmNsdWRpbmcgcmVxdWlyZWQgcHJvamVjdHMpLgotCQkgKiBUaGlzIGlzIGZvciBlYWNoIHByb2plY3QgZm91bmQuIElmIHRoZXJlIHdhcyBhIGNvbnRhaW5lciBpbiBtb3JlIHRoYW4gb25lIHByb2plY3Qgd2l0aCB0aGUKLQkJICogaWQsIHRoaXMgc2V0IHdpbGwgY29udGFpbiB0aGUgY29udGFpbmVyIGZyb20gZWFjaCBzdWNoIHByb2plY3QuIFRoZXkgYXJlIG5vdCBjb25zaWRlcmVkIHRoZQotCQkgKiBzYW1lIGJlY2F1c2UgdGhleSBjb21lIGZyb20gYSBkaWZmZXJlbnQgcHJvamVjdC4KLQkJICogPHA+Ci0JCSAqIFRoZSBrZXkgd2lsbCBiZSB0aGUgY29udGFpbmVycywgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4sIHdoZXJlIHRydWUgbWVhbnMgaXQKLQkJICogaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqIDxwPgotCQkgKiBUaGlzIGlzIHVzZWQgZm9yIGRldGVybWluaW5nIGlmIGEgcHJvamVjdCdzIGNvbnRhaW5lciBpbXBsZW1lbnRzIHRoZSBkZXNpcmVkIGNvbnRyaWJ1dG9yLgotCQkgKiAKLQkJICogV2lsbCBiZSBlbXB0eSBpZiBubyBwcm9qZWN0IHNlbnQgaW4gdG8gbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIKLQkJICovCi0JCXB1YmxpYyBNYXAgY29udGFpbmVycyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogTWFwIG9mIHVuaXF1ZSBjb250YWluZXIgaWQgc3RyaW5ncyBmb3VuZCBpbiBjbGFzc3BhdGggKGluY2x1ZGluZyByZXF1aXJlZCBwcm9qZWN0cykuCi0JCSAqIElmIGEgY29udGFpbmVyIHdpdGggdGhlIHNhbWUgaWQgd2FzIGZvdW5kIGluIG1vcmUgdGhhbiBvbmUgcHJvamVjdCwgb25seSBvbmUgaWQgd2lsbAotCQkgKiBiZSBpbiB0aGlzIHNldCBzaW5jZSB0aGV5IGFyZSB0aGUgc2FtZS4KLQkJICogPHA+Ci0JCSAqIFRoZSBrZXkgd2lsbCBiZSB0aGUgY29udGFpbmVyIGlkcywgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4sIHdoZXJlIHRydWUgbWVhbnMgaXQKLQkJICogaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqIAotCQkgKiBXaWxsIGJlIGVtcHR5IGlmIG5vIHByb2plY3Qgc2VudCBpbiB0byBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBNYXAgY29udGFpbmVySWRzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBTZXQgb2YgdW5pcXVlIHBsdWdpbiBpZCBzdHJpbmdzIGZvdW5kIGluIGNsYXNzcGF0aCAoaW5jbHVkaW5nIHJlcXVpcmVkIHByb2plY3RzKS4KLQkJICogSWYgYSByZXF1aXJlZCBwbHVnaW4gd2l0aCB0aGUgc2FtZSBpZCB3YXMgZm91bmQgaW4gbW9yZSB0aGFuIG9uZSBwcm9qZWN0LCBvbmx5IG9uZSBpZCB3aWxsCi0JCSAqIGJlIGluIHRoaXMgc2V0IHNpbmNlIHRoZXkgYXJlIHRoZSBzYW1lLgotCQkgKiA8cD4KLQkJICogVGhlIGtleSB3aWxsIGJlIHRoZSBwbHVnaW4gaWRzLCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiwgd2hlcmUgdHJ1ZSBtZWFucyBpdAotCQkgKiBpcyB2aXNpYmxlIHRvIHRoZSB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogCi0JCSAqIFdpbGwgYmUgZW1wdHkgaWYgbm8gcHJvamVjdCBzZW50IGluIHRvIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCQkgKi8JCQotCQlwdWJsaWMgTWFwIHBsdWdpbklkcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDs7Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIE1hcCBvZiB1bmlxdWUgcHJvamVjdHMgZm91bmQgaW4gY2xhc3NwYXRoIChpbmNsdWRpbmcgcmVxdWlyZWQgcHJvamVjdHMpLCBidXQgbm90IGluY2x1ZGluZyB0b3AtbGV2ZWwgcHJvamVjdC4KLQkJICogPHA+Ci0JCSAqIFRoZSBrZXkgd2lsbCBiZSB0aGUgPGNvZGU+SVBhdGg8L2NvZGU+IGZvciB0aGUgcHJvamVjdCwgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4sIHdoZXJlIHRydWUgbWVhbnMgaXQKLQkJICogaXMgdmlzaWJsZSB0byB0aGUgdG9wLWxldmVsIHByb2plY3QuCi0JCSAqIAotCQkgKiBXaWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2plY3Qgc2VudCBpbiB0byBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkJICovCQkKLQkJcHVibGljIE1hcCBwcm9qZWN0UGF0aHM7Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEphdmEgcHJvamVjdCBmb3IgdGhpcyBsYXVuY2guIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3IgYSBwcm9qZWN0LgotCQkgKi8KLQkJcHVibGljIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8jZ2V0Q29udGFpbmVySWRzKCkKLQkJICovCi0JCXB1YmxpYyBNYXAgZ2V0Q29udGFpbmVySWRzKCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcklkczsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvI2dldENvbnRhaW5lcnMoKQotCQkgKi8KLQkJcHVibGljIE1hcCBnZXRDb250YWluZXJzKCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcnM7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyNnZXRKYXZhUHJvamVjdCgpCi0JCSAqLwotCQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8jZ2V0UGx1Z2luSWRzKCkKLQkJICovCi0JCXB1YmxpYyBNYXAgZ2V0UGx1Z2luSWRzKCkgewotCQkJcmV0dXJuIHBsdWdpbklkczsKLQkJfQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvI2dldFByb2plY3RQYXRocygpCi0JCSAqLwotCQlwdWJsaWMgTWFwIGdldFByb2plY3RQYXRocygpIHsKLQkJCXJldHVybiBwcm9qZWN0UGF0aHM7Ci0JCX0KLQkJCi0JfQotCQkKLQkvKioKLQkgKiBMYXVuY2hJbmZvIGZvciBhIGxhdW5jaC4gU3RvcmVkIGJ5IGtleSBhbmQgcmV0cmlldmFibGUgYnkgdGhlIGtleS4KLQkgKiBUaGlzIGlzIG9ubHkgcGFzc2VkIHRvIGxhdW5jaCBkZWxlZ2F0ZXMuIEl0IHNob3VsZCBub3QgYmUgcGFzc2VkIG9uIHRvCi0JICogb3RoZXJzLCB0aG91Z2ggdGhlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBtYXkgYmUuCi0JICogCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIFByb3h5TGF1bmNoU3VwcG9ydCNnZXRJbmZvKFN0cmluZykKLQkgKiBAc2VlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbwotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGF1bmNoSW5mbyB7Ci0JCS8qKgotCQkgKiBDb250cmlidXRvcnMgZm9yIHRoaXMgbGF1bmNoLiBJdCB3aWxsIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBJdCBtYXkgYmUgZW1wdHkuCi0JCSAqLwotCQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGNvbnRyaWJ1dG9yczsKLQkJCi0JCS8qKgotCQkgKiBUaGUgcmVnaXN0cnkgcmV0dXJuZWQgZnJvbSB0aGUgbGF1bmNoLiBUaGUgbGF1bmNoIG5lZWRzIHRvIHNldCB0aGlzIGJlZm9yZSBpdCByZXR1cm5zLgotCQkgKi8KLQkJcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlc3VsdFJlZ2lzdHJ5OwotCQkKLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvI2dldEphdmFQcm9qZWN0KCkKLQkJICovCi0JCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQlyZXR1cm4gY29uZmlnSW5mby5nZXRKYXZhUHJvamVjdCgpOwotCQl9CQkKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBmb3IgdGhpcyBsYXVuY2guCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBnZXRDb25maWdJbmZvKCkgewotCQkJcmV0dXJuIGNvbmZpZ0luZm87Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkluZm8gY29uZmlnSW5mbzsKLQkJCi0JfQotCQotCS8qKgotCSAqIFN0YXJ0IGFuIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogPHA+IAotCSAqIFRoaXMgd2lsbCB3YWl0IGZvciBidWlsZC4gSWYgeW91Ci0JICoga25vdyB0aGUgYnVpbGQgaGFzIGJlZW4gc3VzcGVuZGVkIGJ5IHlvdXIgdGhyZWFkLCB0aGVuIHlvdSBtdXN0IHVzZSB0aGUgb3RoZXIgbWV0aG9kIHRoYXQgdGFrZXMgYSB3YWl0Rm9yVGhyZWFkCi0JICogYm9vbGVhbiwgYW5kIHlvdSBtdXN0IHBhc3MgaW4gZmFsc2UuIE90aGVyd2lzZSBpdCB3aWxsIGRlYWRsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0LiBJdCBtdXN0IGJlIGEgamF2YSBwcm9qZWN0LCBhbmQgaXQgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2bVRpdGxlIHRpdGxlIGZvciBWTS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBhQ29udHJpYnMgVGhlIGNvbnRyaWJ1dGlvbnMgYXJyYXkuIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gcG0KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHJlZ2lzdHJ5LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgUHJveHlMYXVuY2hTdXBwb3J0I3N0YXJ0SW1wbGVtZW50YXRpb24oSVByb2plY3QsIFN0cmluZywgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgc3RhcnRJbXBsZW1lbnRhdGlvbigKLQkJCUlQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgdm1UaXRsZSwKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBhQ29udHJpYnMsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXJ0SW1wbGVtZW50YXRpb24ocHJvamVjdCwgdm1UaXRsZSwgYUNvbnRyaWJzLCB0cnVlLCBwbSk7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IGFuIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogPHA+IAotCSAqIElmIHlvdSBrbm93IHRoZSBidWlsZCBoYXMgYmVlbiBzdXNwZW5kZWQgYnkgeW91ciB0aHJlYWQsIHRoZW4geW91IG11c3QgdXNlIGNhbGwgdGhpcyB3aXRoIGZhbHNlIGZvciB3YWl0Rm9yVGhyZWFkLiBPdGhlcndpc2UgaXQgd2lsbCBkZWFkbG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdC4gSXQgbXVzdCBiZSBhIGphdmEgcHJvamVjdCwgYW5kIGl0IGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdm1UaXRsZSB0aXRsZSBmb3IgVk0uIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gYUNvbnRyaWJzIFRoZSBjb250cmlidXRpb25zIGFycmF5LiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHdhaXRGb3JCdWlsZCB3YWl0IGZvciB0aGUgYnVpbGQuIElmIGNhbGxlciBrbm93cyB0aGF0IHRoZSBidWlsZCBoYXMgYmVlbiBzdXNwZW5kZWQgYnkgdGhpcyB0aHJlYWQsIHRoZW4gaXQgbXVzdCBjYWxsIHRoaXMgd2l0aCBmYWxzZS4gT3RoZXJ3aXNlIGEgZGVhZGxvY2sgd2lsbCBvY2N1ci4KLQkgKiBAcGFyYW0gcG0KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHJlZ2lzdHJ5LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgc3RhcnRJbXBsZW1lbnRhdGlvbigKLQkJCUlQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgdm1UaXRsZSwKLQkJCUlDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSBhQ29udHJpYnMsCi0JCQlib29sZWFuIHdhaXRGb3JCdWlsZCwgCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QgZmluZCB0aGUgYXBwcm9wcmlhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciB0aGlzIHByb2plY3QuCi0JCS8vIFRoZSBwcm9jZXNzIGlzOgotCQkvLwkxKSBTZWUgaWYgdGhlIHByb2plY3QncyBwZXJzaXN0ZW50IHByb3BlcnR5IGhhcyBhIHNldHRpbmcgZm9yICJwcm94eUxhdW5jaENvbmZpZ3VyYXRpb24iLCBpZiBpdCBkb2VzLAotCQkvLwkJZ2V0IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoYXQgbmFtZSBhbmQgY3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIGl0LgotCQkvLwkyKSBJZiBub3QsIHRoZW4gZ2V0IHRoZSAib3JnLmVjbGlwc2UuamVtLnByb3h5LkxvY2FsUHJveHlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLQkJLy8JCWFuZCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd29ya2luZyBjb3B5LgotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuV0FSTklORywKLQkJCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkwLAotCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJUHJveHlNZXNzYWdlcy5Ob3RfSmF2YV9Qcm9qZWN0X1dBUk5fLCAKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHByb2plY3QuZ2V0TmFtZSgpfSksCi0JCQkJCQkJbnVsbCkpOwotCQl9Ci0KLQkJLy8gRmlyc3QgaWYgc3BlY2lmaWMgc2V0LgotCQlTdHJpbmcgbGF1bmNoTmFtZSA9IHByb2plY3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KFByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsJCQotCQlpZiAobGF1bmNoTmFtZSAhPSBudWxsICYmICFOT1RfU0VULmVxdWFscyhsYXVuY2hOYW1lKSkgewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGNvbmZpZ3NbaV0uZ2V0TmFtZSgpLmVxdWFscyhsYXVuY2hOYW1lKSkgewotCQkJCQljb25maWcgPSBjb25maWdzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY29uZmlnID09IG51bGwgfHwgIWNvbmZpZy5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAiIikuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoUHJveHlQbHVnaW4uUFJPUEVSVFlfTEFVTkNIX0NPTkZJR1VSQVRJT04sIChTdHJpbmcpIG51bGwpOwkvLyBDb25maWcgbm90IGZvdW5kLCBvciBmb3IgYSBkaWZmZXJlbnQgcHJvamVjdCwgc28gbm8gbG9uZ2VyIHRoZSBkZWZhdWx0LgotCQkJCWNvbmZpZyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd3YyA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoSVByb3h5Q29uc3RhbnRzLkxPQ0FMX0xBVU5DSF9UWVBFKS5uZXdJbnN0YW5jZShudWxsLCBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdlbmVyYXRlVW5pcXVlTGF1bmNoQ29uZmlndXJhdGlvbk5hbWVGcm9tKCJMb2NhbFByb3h5XyIrcHJvamVjdC5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJY29uZmlnd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOyAKLQkJCWNvbmZpZyA9IGNvbmZpZ3djOwotCQl9Ci0JCQotCQlyZXR1cm4gc3RhcnRJbXBsZW1lbnRhdGlvbihjb25maWcsIHZtVGl0bGUsIGFDb250cmlicywgd2FpdEZvckJ1aWxkLCBwbSk7Ci0JfQotCQotCS8qKgotCSAqIExhdW5jaCBhIHJlZ2lzdHJ5IHVzaW5nIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgotCSAqIDxwPiAKLQkgKiBUaGlzIHdpbGwgd2FpdCBmb3IgYnVpbGQuIElmIHlvdQotCSAqIGtub3cgdGhlIGJ1aWxkIGhhcyBiZWVuIHN1c3BlbmRlZCBieSB5b3VyIHRocmVhZCwgdGhlbiB5b3UgbXVzdCB1c2UgdGhlIG90aGVyIG1ldGhvZCB0aGF0IHRha2VzIGEgd2FpdEZvclRocmVhZAotCSAqIGJvb2xlYW4sIGFuZCB5b3UgbXVzdCBwYXNzIGluIGZhbHNlLiBPdGhlcndpc2UgaXQgd2lsbCBkZWFkbG9jay4KLQkgKgotCSAqIEBwYXJhbSBjb25maWcgCi0JICogQHBhcmFtIHZtVGl0bGUgdGl0bGUgZm9yIFZNLiBJdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGFDb250cmlicyBUaGUgY29udHJpYnV0aW9ucyBhcnJheS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwbQotCSAqIEByZXR1cm4gVGhlIHJlZ2lzdHJ5IGZyb20gdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzZWUgUHJveHlMYXVuY2hTdXBwb3J0I3N0YXJ0SW1wbGVtZW50YXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb24sIFN0cmluZywgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgc3RhcnRJbXBsZW1lbnRhdGlvbigKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVN0cmluZyB2bVRpdGxlLAotCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGFDb250cmlicywKLQkJCUlQcm9ncmVzc01vbml0b3IgcG0pCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGFydEltcGxlbWVudGF0aW9uKGNvbmZpZywgdm1UaXRsZSwgYUNvbnRyaWJzLCB0cnVlLCBwbSk7Ci0JfQotCi0JLyoqCi0JICogTGF1bmNoIGEgcmVnaXN0cnkgdXNpbmcgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uCi0JICogPHA+IAotCSAqIElmIHlvdSBrbm93IHRoZSBidWlsZCBoYXMgYmVlbiBzdXNwZW5kZWQgYnkgeW91ciB0aHJlYWQsIHRoZW4geW91IG11c3QgdXNlIHlvdSBtdXN0IHBhc3MgaW4gZmFsc2UgZm9yIHdhaXRGb3JUaHJlYWQuIE90aGVyd2lzZSBpdCB3aWxsIGRlYWRsb2NrLgotCSAqCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2bVRpdGxlIHRpdGxlIGZvciBWTS4gSXQgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBhQ29udHJpYnMgVGhlIGNvbnRyaWJ1dGlvbnMgYXJyYXkuIEl0IG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gd2FpdEZvckJ1aWxkIHdhaXQgZm9yIHRoZSBidWlsZC4gSWYgY2FsbGVyIGtub3dzIHRoYXQgdGhlIGJ1aWxkIGhhcyBiZWVuIHN1c3BlbmRlZCBieSB0aGlzIHRocmVhZCwgdGhlbiBpdCBtdXN0IGNhbGwgdGhpcyB3aXRoIGZhbHNlLiBPdGhlcndpc2UgYSBkZWFkbG9jayB3aWxsIG9jY3VyLgotCSAqIEBwYXJhbSBwbQotCSAqIEByZXR1cm4gVGhlIHJlZ2lzdHJ5IGZyb20gdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgc3RhcnRJbXBsZW1lbnRhdGlvbigKLQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQkJU3RyaW5nIHZtVGl0bGUsCi0JCQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGFDb250cmlicywKLQkJCQlib29sZWFuIHdhaXRGb3JCdWlsZCwKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAocG0gPT0gbnVsbCkKLQkJCXBtID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJU3RyaW5nIHN0ZXBJZCA9ICJQcmUtbGF1bmNoIFZNICggIiArIHZtVGl0bGUgKyAiICkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRTdGVwKHN0ZXBJZCk7Ci0JCWlmICh2bVRpdGxlLmVxdWFscygiQmVhbmluZm8iKSkgLy8kTk9OLU5MUy0xJAotCQkJUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5nZXRNb25pdG9yKCkuc25hcHNob3QoMTI1KTsKLQkJZmluYWwgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd3YyA9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQkKLQkJcG0uYmVnaW5UYXNrKCIiLCA0MDApOyAvLyROT04tTkxTLTEkCi0JCXBtLnN1YlRhc2soUHJveHlNZXNzYWdlcy5Qcm94eUxhdW5jaCk7CQotCQlpZiAod2FpdEZvckJ1aWxkKSB7Ci0JCQkvLyBTZWUgaWYgYnVpbGQgbmVlZGVkIG9yIHdhaXRpbmcgb3IgaW5wcm9ncmVzcywgaWYgc28sIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiBXZSd2ZQotCQkJLy8gZGVjaWRlZCB0b28gZGlmZmljdWx0IHRvIGRldGVybWluZSBpZiBidWlsZCB3b3VsZCBhZmZlY3QgdXMgb3Igbm90LCBzbyBqdXN0IHdhaXQuCQkKLQkJCWlmIChVSV9SVU5ORVIgIT0gbnVsbCkKLQkJCQlVSV9SVU5ORVIuaGFuZGxlQnVpbGQobmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7Ci0JCQllbHNlCi0JCQkJcnVuQnVpbGQobmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7Ci0JCQkKLQkJCWlmIChwbS5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCQkKLQkJaWYgKGFDb250cmlicyAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gbmV3Q29udHJpYnMgPSBuZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvclthQ29udHJpYnMubGVuZ3RoKzFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhQ29udHJpYnMsIDAsIG5ld0NvbnRyaWJzLCAxLCBhQ29udHJpYnMubGVuZ3RoKTsKLQkJCW5ld0NvbnRyaWJzWzBdID0gbmV3IFByb3h5Q29udHJpYnV0b3IoKTsKLQkJCWFDb250cmlicyA9IG5ld0NvbnRyaWJzOwotCQl9IGVsc2UKLQkJCWFDb250cmlicyA9IG5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10ge25ldyBQcm94eUNvbnRyaWJ1dG9yKCl9OwotCi0JCVN0cmluZyBsYXVuY2hLZXkgPSBTdHJpbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCUxhdW5jaEluZm8gbGF1bmNoSW5mbyA9IG5ldyBMYXVuY2hJbmZvKCk7Ci0JCXN5bmNocm9uaXplZCAoUHJveHlMYXVuY2hTdXBwb3J0LmNsYXNzKSB7Ci0JCQl3aGlsZSAoTEFVTkNIX0lORk8uY29udGFpbnNLZXkobGF1bmNoS2V5KSkgewotCQkJCWxhdW5jaEtleSArPSAnYSc7IC8vIEp1c3QgYWRkIHNvbWV0aGluZyBvbiB0byBtYWtlIGl0IHVuaXF1ZS4KLQkJCX0KLQkJCUxBVU5DSF9JTkZPLnB1dChsYXVuY2hLZXksIGxhdW5jaEluZm8pOwotCQl9Ci0JCQotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBjb25maWd3Yy5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAoU3RyaW5nKSBudWxsKTsKLQkJYUNvbnRyaWJzID0gZmlsbEluTGF1bmNoSW5mbyhhQ29udHJpYnMsIGxhdW5jaEluZm8sIHByb2plY3ROYW1lKTsKLQkJCi0JCXRyeSB7CQkKLQkJCWNvbmZpZ3djLnNldEF0dHJpYnV0ZShJUHJveHlDb25zdGFudHMuQVRUUklCVVRFX0xBVU5DSF9LRVksIGxhdW5jaEtleSk7Ci0JCQlpZiAodm1UaXRsZSAhPSBudWxsICYmIHZtVGl0bGUubGVuZ3RoKCk+MCkKLQkJCQljb25maWd3Yy5zZXRBdHRyaWJ1dGUoSVByb3h5Q29uc3RhbnRzLkFUVFJJQlVURV9WTV9USVRMRSwgdm1UaXRsZSk7Ci0JCQkKLQkJCWlmIChBVFRSX1BSSVZBVEUgIT0gbnVsbCkKLQkJCQljb25maWd3Yy5zZXRBdHRyaWJ1dGUoQVRUUl9QUklWQVRFLCB0cnVlKTsJCQkKLQkJCQotCQkJLy8gTGV0IGNvbnRyaWJ1dG9ycyBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gY29udHJpYnMgPSBhQ29udHJpYnM7Ci0JCQlmaW5hbCBMYXVuY2hJbmZvIGxpbmZvID0gbGF1bmNoSW5mbzsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBGaXJzdCBydW4gdGhlIGluaXRpYWxpemUuCi0JCQkJLy8gUnVuIGluIHNhZmUgbW9kZSBzbyB0aGF0IGFueXRoaW5nIGhhcHBlbnMgd2UgZG9uJ3QgZ28gYXdheS4KLQkJCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIFBsYXRmb3JtLnJ1biBsb2dzIGl0IGZvciBtZS4KLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJY29udHJpYnNbaWldLmluaXRpYWxpemUobGluZm8uZ2V0Q29uZmlnSW5mbygpKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJLy8gTm93IHJ1biB0aGUgY29udHJpYnV0ZSB0byBjb25maWd1cmF0aW9uLgotCQkJCS8vIFJ1biBpbiBzYWZlIG1vZGUgc28gdGhhdCBhbnl0aGluZyBoYXBwZW5zIHdlIGRvbid0IGdvIGF3YXkuCi0JCQkJUGxhdGZvcm0ucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gUGxhdGZvcm0ucnVuIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQljb250cmlic1tpaV0uY29udHJpYnV0ZVRvQ29uZmlndXJhdGlvbihjb25maWd3Yyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCXBtLndvcmtlZCgxMDApOwotCQkJCi0JCQljb25maWd3Yy5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEwMCkpOwotCQkJCi0JCQlmaW5hbCBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWcgPSBsYXVuY2hJbmZvLnJlc3VsdFJlZ2lzdHJ5OwotCQkJaWYgKCFwbS5pc0NhbmNlbGVkKCkgJiYgcmVnID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBQcm94eU1lc3NhZ2VzLlByb3h5TGF1bmNoU3VwcG9ydF9SZWdpc3RyeUNvdWxkTm90U3RhcnRGb3JTb21lUmVhc29uX1dBUk5fLCBudWxsKSk7IAotCQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkgewotCQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQkJcmVnLnRlcm1pbmF0ZVJlZ2lzdHJ5KCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXBlcmZvcm1FeHRlbnNpb25SZWdpc3RyYXRpb25zKChCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkpIHJlZywgbGF1bmNoSW5mbyk7Ci0JCQkKLS8vCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRTdGVwKCJjb250cmlidXRlIHRvIHJlZ2lzdHJ5Iik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCQkvLyBSdW4gaW4gc2FmZSBtb2RlIHNvIHRoYXQgYW55dGhpbmcgaGFwcGVucyB3ZSBkb24ndCBnbyBhd2F5LgotCQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIFBsYXRmb3JtLnJ1biBsb2dzIGl0IGZvciBtZS4KLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCQkJCQlTdHJpbmcgc3RlcGlkID0gImNvbnRyaWJ1dGUgdG8gcmVnaXN0cnkgZm9yICIgKyBjb250cmlic1tpaV0uZ2V0Q2xhc3MoKTsKLS8vCQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRTdGVwKHN0ZXBpZCk7Ci0JCQkJCQljb250cmlic1tpaV0uY29udHJpYnV0ZVRvUmVnaXN0cnkocmVnKTsKLS8vCQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoc3RlcGlkKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotLy8JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wU3RlcCgiY29udHJpYnV0ZSB0byByZWdpc3RyeSIpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gQ2xlYW4gdXAgYW5kIHJldHVybi4KLQkJCUxBVU5DSF9JTkZPLnJlbW92ZShsYXVuY2hLZXkpOwotCQl9CQotCQkKLQkJcG0uZG9uZSgpOwotCQlpZiAodm1UaXRsZS5lcXVhbHMoIkJlYW5pbmZvIikpIC8vJE5PTi1OTFMtMSQKLQkJCVBlcmZvcm1hbmNlTW9uaXRvclV0aWwuZ2V0TW9uaXRvcigpLnNuYXBzaG90KDEyNik7Ci0JCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BTdGVwKHN0ZXBJZCk7Ci0JCXJldHVybiBsYXVuY2hJbmZvLnJlc3VsdFJlZ2lzdHJ5OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBkZWZhdWx0IElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyBmb3IgdGhlIGdpdmVuIHByb2plY3QuIFRoaXMgaXMgdXNlZnVsIGluZm8gZXZlbiB3aGVuIG5vdCBsYXVuY2hpbmcgYQotCSAqIHZtLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEByZXR1cm4gbmV3IGNvbnRyaWIgaW5mby4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMYXVuY2hTdXBwb3J0SUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGNvbmZpZ0luZm8gPSBuZXcgTGF1bmNoU3VwcG9ydElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbygpOwotCQljb25maWdJbmZvLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JCWNvbmZpZ0luZm8uY29udGFpbmVySWRzID0gbmV3IEhhc2hNYXAoNSk7Ci0JCWNvbmZpZ0luZm8uY29udGFpbmVycyA9IG5ldyBIYXNoTWFwKDUpOwotCQljb25maWdJbmZvLnBsdWdpbklkcyA9IG5ldyBIYXNoTWFwKDUpOwotCQljb25maWdJbmZvLnByb2plY3RQYXRocyA9IG5ldyBIYXNoTWFwKDUpOwotCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJRHNGb3VuZChqYXZhUHJvamVjdCwgY29uZmlnSW5mby5jb250YWluZXJJZHMsIGNvbmZpZ0luZm8uY29udGFpbmVycywgY29uZmlnSW5mby5wbHVnaW5JZHMsIGNvbmZpZ0luZm8ucHJvamVjdFBhdGhzKTsKLQkJcmV0dXJuIGNvbmZpZ0luZm87Ci0KLQl9Ci0JCi0JLyoqCi0JICogVXNlIGluIGNhbGxpbmcge0BsaW5rIFByb3h5TGF1bmNoU3VwcG9ydCNmaWxsSW5MYXVuY2hJbmZvKElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSwgTGF1bmNoSW5mbywgU3RyaW5nKX0gZm9yIHRoZSBjb25maWd1cmF0aW9uCi0JICogY29udHJpYnV0b3JzIGFycmF5IGlmIHRoZXJlIGFyZSBubyBpbmNvbWluZyBjb250cmlidXRvcnMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gRU1QVFlfQ09ORklHX0NPTlRSSUJVVE9SUyA9IG5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yWzBdOwotCS8qKgotCSAqIEZpbGwgaW4gdGhlIGxhdW5jaCBpbmZvIGNvbmZpZyBpbmZvIGFuZCBjb250cmlicy4gVGhlIGNvbnRyaWJzIHNlbnQgaW4gbWF5IGJlIGV4cGFuZGVkIGR1ZSB0byBleHRlbnNpb24KLQkgKiBwb2ludHMgYW5kIGEgbmV3IG9uZSBjcmVhdGVkLiBFaXRoZXIgdGhlIGV4cGFuZGVkIGNvcHkgb3IgdGhlIG9yaWdpbmFsIChpZiBubyBjaGFuZ2UpIHdpbGwgYmUgc3RvcmVkIGluCi0JICogdGhlIGxhdW5jaGluZm8gYW5kIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBhQ29udHJpYnMgdGhpcyBzaG91bGQgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFBhc3MgaW4ge0BsaW5rIFByb3h5TGF1bmNoU3VwcG9ydCNFTVBUWV9DT05GSUdfQ09OVFJJQlVUT1JTfSBpbiB0aGF0IGNhc2UuCi0JICogQHBhcmFtIGxhdW5jaEluZm8KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcmV0dXJuIGEgbW9kaWZpZWQgYUNvbnRyaWJzIGlmIGFueSBjaGFuZ2Ugd2FzIG1hZGUgdG8gaXQuICBUaGlzIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uIEl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgYUNvbnRyaWJzIHdhcyBudWxsIGFuZCBubyBjaGFuZ2VzIHdlcmUgbWFkZS4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGZpbGxJbkxhdW5jaEluZm8oSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGFDb250cmlicywgTGF1bmNoSW5mbyBsYXVuY2hJbmZvLCBTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCkgewotCQkJcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZS50cmltKCk7Ci0JCQlpZiAocHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsICYmIGphdmFQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCWxhdW5jaEluZm8uY29uZmlnSW5mbyA9IGNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSW5mbyhqYXZhUHJvamVjdCk7Ci0JCQkJCWlmICghbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcklkcygpLmlzRW1wdHkoKSB8fCAhbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcnMoKS5pc0VtcHR5KCkgfHwgIWxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJCUxpc3QgY29tcHV0ZWRDb250cmlidXRvcnMgPSBuZXcgQXJyYXlMaXN0KGxhdW5jaEluZm8uY29uZmlnSW5mby5nZXRDb250YWluZXJJZHMoKS5zaXplKCkrbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcnMoKS5zaXplKCkrbGF1bmNoSW5mby5jb25maWdJbmZvLmdldFBsdWdpbklkcygpLnNpemUoKSk7Ci0JCQkJCQkvLyBOb3RlOiBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSB2aXNpYmlsaXR5IGJ1c2luZXNzIGhlcmUuIEZvciBjb250cmlidXRvcnMgdG8gcHJveHkgaXQgbWVhbnMKLQkJCQkJCS8vIHNvbWUgY2xhc3NlcyBpbiB0aGUgcHJvamVjdHMvcGx1Z2lucy9ldGMuIG5lZWQgY29uZmlndXJhdGlvbiB3aGV0aGVyIHRoZXkgYXJlIHZpc2libGUgb3Igbm90LgotCQkJCQkJLy8gVGhpcyBpcyBiZWNhdXNlIGV2ZW4gdGhvdWdoIG5vdCB2aXNpYmxlLCBzb21lIG90aGVyIHZpc2libGUgY2xhc3MgbWF5IGluc3RhbnRpYXRlIGl0LiBTbyBpdAotCQkJCQkJLy8gbmVlZHMgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkJCQkvLyBGaXJzdCBoYW5kbGUgZXhwbGljaXQgY2xhc3NwYXRoIGNvbnRhaW5lcnMgdGhhdCBpbXBsZW1lbnQgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcikKLQkJCQkJCQkJY29tcHV0ZWRDb250cmlidXRvcnMuYWRkKGNvbnRhaW5lcik7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIFNlY29uZCBhZGQgaW4gY29udHJpYnV0b3JzIHRoYXQgZXhpc3QgZm9yIGEgY29udGFpbmVyIGlkLgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGF1bmNoSW5mby5jb25maWdJbmZvLmdldENvbnRhaW5lcklkcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCVN0cmluZyBjb250YWluZXJpZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbnRyaWJ1dG9ycyA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldENvbnRhaW5lckNvbmZpZ3VyYXRpb25zKGNvbnRhaW5lcmlkKTsKLQkJCQkJCQlpZiAoY29udHJpYnV0b3JzICE9IG51bGwpCi0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlPYmplY3QgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQcm94eVBsdWdpbi5QSV9DTEFTUyk7Ci0JCQkJCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKQotCQkJCQkJCQkJCWNvbXB1dGVkQ29udHJpYnV0b3JzLmFkZChjb250cmlidXRvcik7Ci0JCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gRmluYWxseSBhZGQgaW4gY29udHJpYnV0b3JzIHRoYXQgZXhpc3QgZm9yIGEgcGx1Z2luIGlkLgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGF1bmNoSW5mby5jb25maWdJbmZvLmdldFBsdWdpbklkcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCVN0cmluZyBwbHVnaW5JZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbnRyaWJ1dG9ycyA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbkNvbmZpZ3VyYXRpb25zKHBsdWdpbklkKTsKLQkJCQkJCQlpZiAoY29udHJpYnV0b3JzICE9IG51bGwpCi0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlPYmplY3QgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQcm94eVBsdWdpbi5QSV9DTEFTUyk7Ci0JCQkJCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yKQotCQkJCQkJCQkJCWNvbXB1dGVkQ29udHJpYnV0b3JzLmFkZChjb250cmlidXRvcik7Ci0JCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gTm93IHR1cm4gaW50byBhcnJheQotCQkJCQkJaWYgKCFjb21wdXRlZENvbnRyaWJ1dG9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gbmV3Q29udHJpYnMgPSBuZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvclthQ29udHJpYnMubGVuZ3RoCi0JCQkJCQkJCQkrIGNvbXB1dGVkQ29udHJpYnV0b3JzLnNpemUoKV07Ci0JCQkJCQkJU3lzdGVtLmFycmF5Y29weShhQ29udHJpYnMsIDAsIG5ld0NvbnRyaWJzLCAwLCBhQ29udHJpYnMubGVuZ3RoKTsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gY0NvbnRyaWJzID0gKElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSkgY29tcHV0ZWRDb250cmlidXRvcnMKLQkJCQkJCQkJCS50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW2NvbXB1dGVkQ29udHJpYnV0b3JzLnNpemUoKV0pOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoY0NvbnRyaWJzLCAwLCBuZXdDb250cmlicywgYUNvbnRyaWJzLmxlbmd0aCwgY0NvbnRyaWJzLmxlbmd0aCk7Ci0JCQkJCQkJYUNvbnRyaWJzID0gbmV3Q29udHJpYnM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWxhdW5jaEluZm8uY29udHJpYnV0b3JzID0gYUNvbnRyaWJzOwotCQlyZXR1cm4gYUNvbnRyaWJzOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBleHRlbnNpb24gcmVnaXN0cmF0aW9ucyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhpcyB0eXBlIG9mIHJlZ2lzdHJ5IGFuZCB0aGUgbGF1bmNoaW5mbyBwYXRocy4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lYW50IHRvIGJlIGNhbGxlZCBvbmx5IGJ5IHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBsYXVuY2ggdGhyb3VnaCBhIGxhdW5jaCBjb25maWdyYXRpb24gYWZ0ZXIgdGhlIHJlZ2lzdHJ5IGlzIGNyZWF0ZWQgYnV0Ci0JICogYmVmb3JlIHRoZSB7QGxpbmsgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciNjb250cmlidXRlVG9SZWdpc3RyeShQcm94eUZhY3RvcnlSZWdpc3RyeSl9IGlzIGNhbGxlZC4gVGhpcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5Ci0JICogYnkgcmVnaXN0cmllcyB0aGF0IHVzZWQgYSBsYXVuY2ggY29uZmlndXJhdGlvbiB0byBsYXVuY2guCi0JICogCi0JICogQHBhcmFtIGJhc2VSZWdpc3RyeQotCSAqIEBwYXJhbSBsYXVuY2hJbmZvCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwZXJmb3JtRXh0ZW5zaW9uUmVnaXN0cmF0aW9ucyhmaW5hbCBCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkgYmFzZVJlZ2lzdHJ5LCBMYXVuY2hJbmZvIGxhdW5jaEluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JbmZvIGNvbmZpZ0luZm8gPSBsYXVuY2hJbmZvLmNvbmZpZ0luZm87Ci0JCWlmIChjb25maWdJbmZvICE9IG51bGwgJiYgKCFjb25maWdJbmZvLmdldENvbnRhaW5lcklkcygpLmlzRW1wdHkoKSB8fCAhY29uZmlnSW5mby5nZXRQbHVnaW5JZHMoKS5pc0VtcHR5KCkpKSB7Ci0JCQlTdHJpbmcgcmVnaXN0cnlJRCA9IGJhc2VSZWdpc3RyeS5nZXRSZWdpc3RyeVR5cGVJRCgpOwotCQkJLy8gTm90ZTogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdmlzaWJpbGl0eSBidXNpbmVzcyBoZXJlLiBGb3IgY29udHJpYnV0b3JzIHRvIHByb3h5IGl0IG1lYW5zCi0JCQkvLyBzb21lIGNsYXNzZXMgaW4gdGhlIHByb2plY3RzL3BsdWdpbnMvZXRjLiBuZWVkIGNvbmZpZ3VyYXRpb24gd2hldGhlciB0aGV5IGFyZSB2aXNpYmxlIG9yIG5vdC4KLQkJCS8vIFRoaXMgaXMgYmVjYXVzZSBldmVuIHRob3VnaCBub3QgdmlzaWJsZSwgc29tZSBvdGhlciB2aXNpYmxlIGNsYXNzIG1heSBpbnN0YW50aWF0ZSBpdC4gU28gaXQKLQkJCS8vIG5lZWRzIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCi0JCQkvLyBGaXJzdCBjYWxsIHJlZ2lzdHJhdGlvbnMgdGhhdCBleGlzdCBmb3IgYSBjb250YWluZXIgaWQuCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdJbmZvLmdldENvbnRhaW5lcklkcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBjb250YWluZXJpZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbnRyaWJ1dG9ycyA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldENvbnRhaW5lckV4dGVuc2lvbnMoY29udGFpbmVyaWQpOwotCQkJCWlmIChjb250cmlidXRvcnMgIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChyZWdpc3RyeUlELmVxdWFscyhjb250cmlidXRvcnNbaV0uZ2V0QXR0cmlidXRlQXNJcyhQcm94eVBsdWdpbi5QSV9SRUdJU1RSWV9UWVBFKSkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cmF0aW9uIGNvbnRyaWJ1dG9yID0gKElFeHRlbnNpb25SZWdpc3RyYXRpb24pIGNvbnRyaWJ1dG9yc1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFByb3h5UGx1Z2luLlBJX0NMQVNTKTsKLQkJCQkJCQkJUGxhdGZvcm0ucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkJCQkKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCQkJCWNvbnRyaWJ1dG9yLnJlZ2lzdGVyKGJhc2VSZWdpc3RyeSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLCBQbGF0Zm9ybSBsb2dzIGl0IGZvciBtZS4KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCX0pOwotCQkJCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIElmIG5vdCByaWdodCBjbGFzcywganVzdCBpZ25vcmUgaXQuCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIEZpbmFsbHkgYWRkIGluIGNvbnRyaWJ1dG9ycyB0aGF0IGV4aXN0IGZvciBhIHBsdWdpbiBpZC4KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ0luZm8uZ2V0UGx1Z2luSWRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29udHJpYnV0b3JzID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luRXh0ZW5zaW9ucyhwbHVnaW5JZCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9ycyAhPSBudWxsKQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHJlZ2lzdHJ5SUQuZXF1YWxzKGNvbnRyaWJ1dG9yc1tpXS5nZXRBdHRyaWJ1dGVBc0lzKFByb3h5UGx1Z2luLlBJX1JFR0lTVFJZX1RZUEUpKSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWZpbmFsIElFeHRlbnNpb25SZWdpc3RyYXRpb24gY29udHJpYnV0b3IgPSAoSUV4dGVuc2lvblJlZ2lzdHJhdGlvbikgY29udHJpYnV0b3JzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUHJveHlQbHVnaW4uUElfQ0xBU1MpOwotCQkJCQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQkJY29udHJpYnV0b3IucmVnaXN0ZXIoYmFzZVJlZ2lzdHJ5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJCQkJCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcsIFBsYXRmb3JtIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gSWYgbm90IHJpZ2h0IGNsYXNzLCBqdXN0IGlnbm9yZSBpdC4KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCX0KLQl9Ci19Ci0KLQotCS8qCi0JICogUnVuIHRoZSBidWlsZC4gSWYgdGhlIG9yaWdpbmFsIGxhdW5jaCB3YXMgaW4gdGhlIFVJIHRocmVhZCwgdGhpcyB3aWxsCi0JICogYmUgY2FsbGVkIHVuZGVyIGNvbnRyb2wgb2YgYW4gSVByb2dyZXNzU2VydmljZSBzbyB0aGF0IGl0IGlzIGluIGEgc2VwYXJhdGUKLQkgKiB0aHJlYWQgYW5kIHRoZSBVSSB3aWxsIHJlbWFpbiByZXNwb25zaXZlIChpbiB0aGF0IGVpdGhlciBhIGJ1c3kgY3Vyc29yIGNvbWVzCi0JICogdXAgb3IgZXZlbnR1YWxseSBhIHByb2dyZXNzIGRpYWxvZykuCi0JICogSWYgdGhlIHBtIGlzIGNhbmNlbGVkLCB0aGlzIHdpbGwganVzdCByZXR1cm4sIGJ1dCB0aGUgY2FsbGVyIG11c3QgY2hlY2sgaWYgdGhlIHBtIGlzIGNhbmNlbGVkLgotCSAqIAotCSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gc28gdGhhdCBvbmx5IHRoZSBVSSBoYW5kbGVyIHdpbGwgYWNjZXNzIGl0LgotCSAqLwotCXN0YXRpYyB2b2lkIHJ1bkJ1aWxkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBhdXRvYnVpbGRpbmcgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKTsKLQkJaWYgKCFhdXRvYnVpbGRpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gV2UgYXJlIG5vdCBhdXRvYnVpbGRpbmcuIFNvIGtpY2sgb2ZmIGEgYnVpbGQgcmlnaHQgaGVyZSBhbmQKLQkJCQkvLyB3YWl0IGZvciBpdC4gKElmIHdlIGFscmVhZHkgd2l0aGluIGEgYnVpbGQgb24gdGhpcyB0aHJlYWQsIHRoZW4gdGhpcwotCQkJCS8vIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgYnVpbGRpbmcuIFdlIHdpbGwgdGFrZSB0aGF0IHJpc2suIElmCi0JCQkJLy8gc29tZSBvdGhlciB0aHJlYWQgaXMgYnVpbGRpbmcsIHdlIHdpbGwgd2FpdCBmb3IgaXQgZmluaXNoIGJlZm9yZSB3ZQotCQkJCS8vIGNhbiBnZXQgaXQgYW5kIGRvIG91ciBidWlsZC4KLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgcG0pOyAKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgcG0gaXMgYWxyZWFkeSBtYXJrZWQgY2FuY2VsZWQsIHNvIGNhbGxlciBjYW4gY2hlY2sgdGhhdCBpbnN0ZWFkLgotCQkJfSAKLQkJfSBlbHNlIHsKLQkJCXBtLmJlZ2luVGFzaygiIiwgMjAwKTsgLy8kTk9OLU5MUy0xJAotCQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlciA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkJCUpvYiBjdXJyZW50Sm9iID0gam9iTWFuYWdlci5jdXJyZW50Sm9iKCk7Ci0JCQlpZiAoY3VycmVudEpvYiA9PSBudWxsIHx8ICghY3VycmVudEpvYi5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxEKSAmJiAhY3VycmVudEpvYi5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpKSkgeyAKLQkJCQlpZiAoam9iTWFuYWdlci5maW5kKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkubGVuZ3RoID4gMCB8fCBqb2JNYW5hZ2VyLmZpbmQoUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpLmxlbmd0aCA+MCkgewotCQkJCQkvLyBXZSBhcmUgbm90IHdpdGhpbiBhIGJ1aWxkIGpvYi4gSWYgd2Ugd2VyZSwgdGhlbiB3ZSBkb24ndCBkbyB0aGUgYnVpbGQuIFdlIHdpbGwgdGFrZQotCQkJCQkvLyB0aGF0IHJpc2suIFRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgd2l0aGluIHRoZSBidWlsZCwgd2UgY2FuJ3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoIGJlY2F1c2UKLQkJCQkJLy8gd2Ugd291bGQgc3RvcCB0aGUgdGhyZWFkIGFuZCBzbyB0aGUgYnVpbGQgd291bGQgbm90IGNvbXBsZXRlLgotCQkJCQlwbS5zdWJUYXNrKFByb3h5TWVzc2FnZXMuUHJveHlXYWl0Rm9yQnVpbGQpOyAKLQkJCQkJdHJ5IHsKLQkJCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJam9iTWFuYWdlci5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7Ci0JCQkJCQkJCWpvYk1hbmFnZXIuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoKLQkgKiBUaGlzIHByZXZlbnRzIHRoZSBsYXVuY2ggZnJvbSBiZWluZyBzaG93bi4gSG93ZXZlciB0aGVzZSBjb25zdGFudHMgYXJlIGluIFVJIGNvbXBvbmVudCwgYW5kIHdlIGRvbid0Ci0JICogd2FudCB0byBwcmUtcmVxIHRoYXQuIFNvIHdlIHdpbGwgZ2V0IHRoZW0gcmVmbGVjdGl2ZWx5IGluc3RlYWQuCi0JICogcHVibGljIGJ1dCBvbmx5IHNvIHRoYXQgbGF1bmNoIGRlbGVnYXRlIGNhbiBnZXQgdG8gaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUl9QUklWQVRFOwotCXByaXZhdGUgc3RhdGljIElVSVJ1bm5lciBVSV9SVU5ORVIgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJQVRUUl9QUklWQVRFID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIFNlZSBpZiB3ZSBoYXZlIGEgVUkgYnVuZGxlIGFuZCBpdCBpcyBhY3RpdmUuIElmIGl0IGV4aXN0cyBidXQgaXMgbm90IGFjdGl2ZSwKLQkJCS8vIHRoZW4gd2Ugd29uJ3QgZG8gYW55dGhpbmcuIElmIHdlIHdlcmUgcnVubmluZyBhIFVJIGFwcGxpY2F0aW9uLCBpdCBzaG91bGQgYWxyZWFkeQotCQkJLy8gb2YgYmVlbiBhY3RpdmUgYmVmb3JlIHdlIGdvdCBoZXJlLgotCQkJQnVuZGxlIHVpQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51aSIpOwkvLyROT04tTkxTLTEkCi0JCQlpZiAodWlCdW5kbGUgIT0gbnVsbCAmJiB1aUJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBXZSBoYXZlIGEgVUkgYnVuZGxlLCBzbyB3ZSBjYW4gbG9hZCBvdXIgVUlSdW5uZXIgY2xhc3MgYW5kIGl0IHdpbGwgbG9hZCBmaW5lLgotCQkJCQlVSV9SVU5ORVIgPSAoSVVJUnVubmVyKSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5VSVJ1bm5lciIpLm5ld0luc3RhbmNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlMSwgTGV2ZWwuV0FSTklORyk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIFNvIHRoYXQgd2UgY2FuIHJ1biBoZWFkbGVzcyAody9vIHVpKSwgbmVlZCB0byBkbyBjbGFzcyBmb3JOYW1lIGZvciBkZWJ1Z3VpIGNvbnRhbnRzCi0JCQkJQnVuZGxlIGRlYnVndWlCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmRlYnVnLnVpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZGVidWd1aUJ1bmRsZSAhPSBudWxsICYmIGRlYnVndWlCdW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJCUNsYXNzIGRlYnVnVUlDb25zdGFudHMgPSBkZWJ1Z3VpQnVuZGxlLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlBVFRSX1BSSVZBVEUgPSAoU3RyaW5nKSBkZWJ1Z1VJQ29uc3RhbnRzLmdldEZpZWxkKCJBVFRSX1BSSVZBVEUiKS5nZXQobnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9CQkJCi0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE9ubHkgcmVmZXJlbmNlZCBieSBsYXVuY2ggZGVsZWdhdGVzLiBwdWJsaWMgYmVjYXVzZSB0aGV5IGFyZSBpbiBvdGhlciBwYWNrYWdlcywKLQkgKiBvciBldmVuIGV4dGVybmFsIGRldmVsb3BlcnMgcGFja2FnZXMuIE5vdCBtZWFudCB0byBiZSBnZW5lcmFsbHkgYXZhaWxhYmxlLgotCSAqIAotCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgY2FuJ3QgcGFzcyB0aGUgZ2VuZXJpYyBpbmZvIGludG8gYSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqIGJlY2F1c2UgYSBsYXVuY2ggY29uZmlndXJhdGlvbiBjYW4ndCB0YWtlIG9iamVjdHMuIE9ubHkgY2FuIHRha2Ugc3RyaW5ncyBhbmQgbnVtYmVycy4gIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExhdW5jaEluZm8gZ2V0SW5mbyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoTGF1bmNoSW5mbykgTEFVTkNIX0lORk8uZ2V0KGtleSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHN0cmluZyBwYXRoIGludG8gYSB2YWxpZCB1cmwuCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSB1cmwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGNvbnZlcnRhYmxlIChpLmUuIG5vdCB3ZWxsLWZvcm1lZCkuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgY29udmVydFN0cmluZ1BhdGhUb1VSTChTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJcmV0dXJuIHBhdGggIT0gbnVsbCA/IG5ldyBGaWxlKHBhdGgpLnRvVVJMKCkgOiBudWxsOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzdHJpbmcgcGF0aHMgaW50byBhIHZhbGlkIHVybHMuCi0JICogCi0JICogQHBhcmFtIHBhdGhzCi0JICogQHJldHVybiB0aGUgdXJscyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwYXRocyBpcyBudWxsLiBBbnkgcGF0aCBub3QgY29udmVydGFibGUgKGkuZS4gbm90IHdlbGwtZm9ybWVkKSB3aWxsIG5vdCBiZSBpbiB0aGUgZmluYWwgbGlzdC4KLQkgKiBTbyB0aGlzIG1lYW5zIHRoZSByZXN1bHQgbGVuZ3RoIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIHBhdGhzIGxlbmd0aC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTFtdIGNvbnZlcnRTdHJpbmdQYXRoc1RvVVJMKFN0cmluZ1tdIHBhdGhzKSB7Ci0JCWlmIChwYXRocyAhPSBudWxsKSB7Ci0JCQlVUkxbXSByZXN1bHQgPSBuZXcgVVJMW3BhdGhzLmxlbmd0aF07Ci0JCQlpbnQgbmV4dFVSTCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVVJMIHVybCA9IGNvbnZlcnRTdHJpbmdQYXRoVG9VUkwocGF0aHNbaV0pOwotCQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQkJcmVzdWx0W25leHRVUkwrK10gPSB1cmw7ICAgCi0JCQl9Ci0JCQlpZiAobmV4dFVSTCA9PSAwKQotCQkJCXJldHVybiBudWxsOwkvLyBOb25lIHdlcmUgZm91bmQuCi0JCQkKLQkJCWlmIChuZXh0VVJMICE9IHJlc3VsdC5sZW5ndGgpIHsKLQkJCQlVUkxbXSBuciA9IG5ldyBVUkxbbmV4dFVSTF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIG5yLCAwLCBuci5sZW5ndGgpOwotCQkJCXJlc3VsdCA9IG5yOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSB1cmxzIHRvIHN0cmluZyBhcnJheS4gSXQgaXMgYXNzdW1lZCB0aGUgdXJscyBhcmUgaW4gZmlsZSBwcm90b2NvbC4gCi0JICogQHBhcmFtIHVybHMKLQkgKiBAcmV0dXJuIHN0cmluZyBwYXRocyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1cmxzIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBBbnkgPGNvZGU+bnVsbDwvY29kZT4gZW50cnkgb2YgdXJscyB3aWxsIHJlc3VsdCBpbiAKLQkgKiBhIGNvcnJlc3BvbmRpbmcgPGNvZGU+bnVsbDwvY29kZT4gaW4gdGhlIHN0cmluZ3MuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjb252ZXJ0VVJMc1RvU3RyaW5ncyhVUkxbXSB1cmxzKSB7Ci0JCWlmICh1cmxzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW3VybHMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJCXN0cmluZ3NbaV0gPSB1cmxzW2ldICE9IG51bGwgPyB1cmxzW2ldLmdldEZpbGUoKSA6IG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyaW5nczsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTG9jYWwgY29udHJpYnV0b3IgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCBjZXJ0YWluIGphcnMgYXJlIGluIHRoZSBwYXRoLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXN0YXRpYyBjbGFzcyBQcm94eUNvbnRyaWJ1dG9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQWRhcHRlciB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGhzKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0JCQkvLyBBZGQgdGhlIHJlcXVpcmVkIGphcnMgdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoLgotCQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAicHJveHljb21tb24uamFyIiwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9VU0VSX0NMQVNTUEFUSCwgZmFsc2UpOwkvLyROT04tTkxTLTEkCi0JCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksICJpbml0cGFyc2VyLmphciIsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfVVNFUl9DTEFTU1BBVEgsIHRydWUpOwkvLyROT04tTkxTLTEkCQkJCi0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzg2NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFByb3h5TWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByb3h5TWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZXhwZWN0ZWRFeGNlcHRpb25fRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc0Nhc3RfRVhDX19JbmNvcnJlY3RUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5RmFjdG9yeV9FWENfX05vQmVhblByb3h5RmFjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eUZhY3RvcnlfRVhDX19Ob0JlYW5UeXBlUHJveHlGYWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vdF9KYXZhX1Byb2plY3RfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fVk1fV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fSW1wbGVtZW50YXRpb25fV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlMYXVuY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlXYWl0Rm9yQnVpbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwcmVzc2lvbl9JbkludmFsaWRTdGF0ZUR1ZVRvX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwcmVzc2lvbl9JbkludmFsaWRTdGF0ZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fVHlwZVNlbnRJbkludmFsaWRPcmRlcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fQXJyYXlUeXBlTm90QW5BcnJheV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fQ2Fubm90SGFuZGxlTm9SZWNlaXZlT25GaWVsZEFjY2Vzc19FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fTWV0aG9kc05lZWRSZWNlaXZlcl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cHJlc3Npb25fSW52YWxpZE1hcmtOZXN0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5UGx1Z2luX0NsZWFudXBEZWZhdWx0UHJveHlMYXVuY2hDb25maWd1cmF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eUxhdW5jaFN1cHBvcnRfUmVnaXN0cnlDb3VsZE5vdFN0YXJ0Rm9yU29tZVJlYXNvbl9XQVJOXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX0NyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbl9JbnZhbGlkRm9yUmVhc3NpZ25tZW50X0VYQ187Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm94eU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHByZXNzaW9uX0ludmFsaWRQcm94eTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvUHJveHlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmZjczMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9Qcm94eVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotLyoKLSAqICAkUkNTZmlsZTogUHJveHlQbHVnaW4uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNTMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkJ1bmRsZVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5FY2xpcHNlTG9nZ2VyOwotCi0KLS8qKgotICogVGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlIHBsdWdpbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJveHlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCQotCS8qKgotCSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZvciBhIGxpc3RlbmVyIHRoYXQgbmVlZHMgdG8ga25vdyBpZiB0aGlzIHBsdWdpbiAoUHJveHlQbHVnaW4pIGlzIGJlaW5nIHNodXRkb3duLiAKLQkgKiBJdCBpcyBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgc29tZSBleHRlbnNpb25zIHRoYXQgZ2V0IGFkZGVkIGR5bmFtaWNhbGx5IHRoYXQgbmVlZCB0byBrbm93IHdoZW4gdGhlCi0JICogcGx1Z2luIGlzIGJlaW5nIHNodXRkb3duLiBDYW4ndCB1c2UgbmV3IGJ1bmRsZSBsaXN0ZW5lciBmb3IgdGhpcyBiZWNhdXNlIGl0IG5vdGlmaWVzIEFGVEVSIHNodXRkb3duLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBQcm94eVBsdWdpbiBpcyBpbiBzaHV0ZG93bi4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2h1dGRvd24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJveHlQbHVnaW4gUFJPWFlfUExVR0lOID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19WTV9OT1ZFUklGWV9LRVkgPSAiSkVNX1BSRUZFUkVOQ0VTX1ZNX05PVkVSSUZZX0tFWSI7IC8vIEtleSBmb3IgTk9WRVJJRlkgb3B0aW9uIG9mIFZNIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQREVfTkFUVVJFX0lEID0gIm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUiIDsgLy8kTk9OLU5MUy0xJAotCQkKLQkvLyBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIGluIGRldmVsb3BtZW50IG1vZGUgYW5kIGl0IHdpbGwgdHJ5IGZvciBwcm94eSBqYXJzIGluIGRpcmVjdG9yaWVzLgotCXByaXZhdGUgYm9vbGVhbiBkZXZNb2RlOwotCQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IHNodXRkb3duTGlzdGVuZXJzOwotCi0JcHVibGljIFByb3h5UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlQUk9YWV9QTFVHSU4gPSB0aGlzOwotCQlkZXZNb2RlID0gUGxhdGZvcm0uaW5EZXZlbG9wbWVudE1vZGUoKTsgIAkKLQl9Ci0KLQkvKioKLQkgKiBBY2Nlc3MgdGhlIHNpbmdsZXRvbgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBwbHVnaW4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3h5UGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIFBST1hZX1BMVUdJTjsKLQl9Ci0JCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlpZiAobG9nZ2VyID09IG51bGwpCi0JCQlsb2dnZXIgPSBFY2xpcHNlTG9nZ2VyLmdldEVjbGlwc2VMb2dnZXIodGhpcyk7Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQkKLQotCS8qKgotCSAqIFRoaXMgd2lsbCB0YWtlIHRoZSBidW5kbGUgYW5kIGZpbGUgbmFtZSBhbmQgbWFrZSBpdCBsb2NhbCBhbmQgcmV0dXJuIHRoYXQKLQkgKiBmdWxseSBxdWFsaWZpZWQuIEl0IHdpbGwgbG9vayBpbiBmcmFnbWVudHMsIGJ1dCBvbmx5IHJldHVybnMgZmlyc3QgZm91bmQuIElmIHRoZXJlIGNhbiBiZSBtdWx0aXBsZXMgdXNlCi0JICogdGhlIG9uZSBmb3IgYnVuZGxlcyBhbmQgaXQgZnJhZ21lbnRzLgotCSAqIDxwPgotCSAqIElmIHdlIGFyZSBpbiBkZXZlbG9wbWVudCBhbmQgaXQgd2lsbCBwaWNrIGl0IHVwIGZyb20gdGhlIHBhdGgKLQkgKiB0aGF0IGlzIGxpc3RlZCBpbiB0aGUgcHJveHkuamFycyBmaWxlIGxvY2F0ZWQgaW4gdGhlIGJ1bmRsZSBwYXNzZWQgaW4uIFRoaXMgYWxsb3dzIGRldmVsb3BtZW50IGNvZGUgdG8gYmUKLQkgKiB1c2VkIGluIHBsYWNlIG9mIHRoZSBhY3R1YWwgcnVudGltZSBqYXJzLiBJZiB0aGUgcnVudGltZSBqYXJzIGFyZSBmb3VuZCwKLQkgKiB0aGV5IHdpbGwgYmUgdXNlZC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSBpZiBsb29raW5nIGZvciBmaWxlIHJ1bnRpbWUveHl6LmphciBpbiBidW5kbGUgYWJjLCB0aGVuIGluIGJ1bmRsZSBkaXJlY3RvcnkgZm9yIGFiYywKLQkgKiB0aGVyZSBzaG91bGQgYmUgYSBmaWxlIGNhbGxlZCBwcm94eS5qYXJzLiBUaGlzIHNob3VsZCBvbmx5IGJlIGluIGRldmVsb3BtZW50LCB0aGlzIGZpbGUgc2hvdWxkIG5vdAotCSAqIGJlIGRpc3RyaWJ1dGVkIGZvciBwcm9kdWN0aW9uLiBJdCB3b3VsZCBiZSBkaXN0cmlidXRlZCBpbiB0aGUgU0RLIGVudmlyb25tZW50IHdoZW4gdGVzdGluZyBpcyBkZXNpcmVkLgotCSAqIDxwPgotCSAqIFRoZSBmb3JtYXQgb2YgdGhlIGZpbGUgaXM6Ci0JICogCXJ1bnRpbWVmaWxlPS9wcm9qZWN0bmFtZS9idWlsZGRpcmVjdG9yeQotCSAqIDxwPgotCSAqIEZvciB0aGlzIHRvIHdvcmsgd2hlbiB0aGUgYWN0dWFsIGphciBpcyBub3QgZm91bmQsIHRoZSBFY2xpcHNlIG11c3Qgb2YgYmVlbiBzdGFydGVkIGluIAotCSAqIGRldiBtb2RlIChpLmUuIHRoZSBidW5kbGUgbG9jYXRpb24gd2lsbCBiZSBhIHByb2plY3Qgd2l0aGluIHRoZSBkZXZlbG9wZXIgRWNsaXBzZS4gVGhhdCB3YXkKLQkgKiB3ZSBjYW4gZ28gdXAgb25lIGxldmVsIGZvciB0aGUgY3VycmVudCBpbnN0YWxsIGxvY2F0aW9uIGFuZCBhc3N1bWUgdGhlIGFib3ZlIHByb2plY3RuYW1lCi0JICogd2lsbCBiZSBmb3VuZCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5LgotCSAqIDxwPgotCSAqIEZvciB0aGUgYWJvdmUgZXhhbXBsZToKLQkgKiAJcnVudGltZS94eXouamFyPS94eXpwcm9qZWN0L2JpbgotCSAqIDxwPgotCSAqIEl0IHdpbGwgcmV0dXJuICIuIiBpZiBmaWxlIGNhbid0IGJlIGZvdW5kLiBJdCBtZWFucyBub3RoaW5nIGJ1dCBpdCB3b24ndCBjYXVzZSBqdm0gdG8gY3Jhc2guCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZQotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIGZpbGUgb3IgPGNvZGU+Ii4iPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2NhbGl6ZUZyb21CdW5kbGVPbmx5KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQlVUkwgdXJsID0gdXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJcmV0dXJuIHVybCAhPSBudWxsID8gZ2V0RmlsZUZyb21VUkwodXJsKSA6ICIuIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgU3RyaW5nIGxvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJVVJMIHVybCA9IHVybExvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJcmV0dXJuIHVybCAhPSBudWxsID8gZ2V0RmlsZUZyb21VUkwodXJsKSA6ICIuIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBKdXN0IGxpa2UgbG9jYWxpemVGcm9tQnVuZGxlIGV4Y2VwdCBpdCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBTdHJpbmdzLiBJdCB3aWxsIGxvb2sgZm9yIHRoZSBmaWxlbmFtZQotCSAqIHdpdGhpbiB0aGUgYnVuZGxlIGFuZCBhbnkgZnJhZ21lbnRzIG9mIHRoZSBidW5kbGUuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLgotCSAqIDxwPgotCSAqIFRvIGZpbmQgdGhlIGZpbGVzIGluIHRoZSBmcmFnbWVudHMgdGhhdCBhcmUgaW4gdGhlIHJ1bnRpbWUgcGF0aCAoaS5lLiBsaWJyYXJpZXMpLCBpdCB3aWxsIG5lZWQgdG8gdXNlIGEgc3VmZml4LAotCSAqIFRoaXMgaXMgYmVjYXVzZSB0aGUgSkRUIHdpbGwgZ2V0IGNvbmZ1c2VkIGlmIGEgcnVudGltZSBqYXIgaW4gYSBmcmFnbWVudCBoYXMgdGhlIHNhbWUgbmFtZQotCSAqIGFzIGEgcnVudGltZSBqYXIgaW4gdGhlIG1haW4gYnVuZGxlLgotCSAqIE5PVEU6IFRoaXMgaXMgb2Jzb2xldGUuIEpEVCBubyBsb25nZXIgaGFzIHRoaXMgcHJvYmxlbS4gU28gd2UgY2FuIGZpbmQgbGlicmFyaWVzIGluIGZyYWdtZW50cyB0aGF0IGhhdmUgdGhlCi0JICogc2FtZSBmaWxlIHBhdGguIAotCSAqIDxwPgotCSAqIFNvIHdlIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgc2VhcmNoIHBhdHRlcm46Ci0JICogPG9sPgotCSAqIDxsaT5GaW5kIGluIGFsbCBvZiB0aGUgZnJhZ21lbnRzIHRob3NlIHRoYXQgbWF0Y2ggdGhlIG5hbWUgZXhhY3RseSBpbiB0aGUgc2FtZSBwYXRocyBpZiBwYXRocyBhcmUgc3VwcGxpZWQuPC9saT4KLQkgKiA8bGk+RmluZCBpbiBhbGwgb2YgdGhlIGZyYWdtZW50cywgaW4gdGhlaXIgcnVudGltZSBwYXRoIChsaWJyYXJ5IHN0bXQpLCB0aG9zZSB0aGF0IG1hdGNoIHRoZSBuYW1lIAotCSAqICAgIGJ1dCBoYXZlIGEgc3VmZml4IHRoZSBzYW1lIGFzIHRoZSB1bmlxdWVpZCBvZiB0aGUgZnJhZ21lbnQgKHByZWNlZWRlZCBieSBhIHBlcmlvZCkuIFRoaXMgaXMgc28gdGhhdCBpdCBjYW4gYmUgZWFzaWx5Ci0JICogICAgZm91bmQgYnV0IHlldCBiZSB1bmlxdWUgaW4gdGhlIGVudGlyZSBsaXN0IG9mIGZyYWdtZW50cy4gRm9yIGV4YW1wbGUgaWYgbG9va2luZyBmb3IgInJ1bnRpbWUveHl6LmphciIKLQkgKiAgICBhbmQgd2UgaGF2ZSBmcmFnbWVudCAiYS5iLmMuZC5mcmFnIiwgdGhlbiBpbiB0aGUgcnVudGltZSBwYXRoIHdlIHdpbGwgbG9vayBmb3IgdGhlIGZpbGUKLQkgKiAgICAicnVudGltZS94eXouYS5iLmMuZC5mcmFnLmphciIuIE5vdGU6IFRoaXMgaXMgb2Jzb2xldGUuIFN0aWxsIGhlcmUgb25seSBmb3IgcG9zc2libGUgb2xkIGNvZGUuIFdpbGwgZ28gCi0JICogICAgYXdheSBpbiBmdXR1cmUuPC9saT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgZmlsZXMgaW4gdGhlIGZyYWdtZW50cyBhcmUgbm90IGluIHRoZSBmcmFnbWVudHMgbGlicmFyeSBwYXRoIHRoZW4gaXQgY2FuIGhhdmUgdGhlIHNhbWUgbmFtZS4gTk9URTogT2Jzb2xldGUsCi0JICogSkRUIGNhbiBub3cgaGFuZGxlIHNhbWUgbmFtZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbmxzIHdoZXJlIHRoZSBubHMgZm9yIHRoZSBmaWxlbmFtZSB3aWxsIGJlIGluIG9uZSBvciBtb3JlIG9mIHRoZSBmcmFnbWVudHMgb2YgdGhlIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHBhcmFtIGZpbGVuYW1lV2l0aGluQnVuZGxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBsb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCVVSTFtdIHVybHMgPSB1cmxMb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSk7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbdXJscy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGdldEZpbGVGcm9tVVJMKHVybHNbaV0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGaWxlRnJvbVVSTChVUkwgdXJsKSB7Ci0JCS8vIFdlIG5lZWQgdG8gZG8gdGhpcyBpbiBhIGRldmljZSBpbmRlcGVuZGVudCB3YXkuIFRoZSBVUkwgd2lsbCBhbHdheXMgcHV0IGEgbGVhZGluZyAnLycgaW4gdGhlCi0JCS8vIGZpbGUgcGFydCBvZiB0aGUgVVJMLCBidXQgb24gV2luZG93cyB3ZSBuZWVkIHRvIGhhdmUgdGhpcyAnLycgcmVtb3ZlZC4gU29tZSBKUkUncyBkb24ndCB1bmRlcnN0YW5kIGl0LgotCQlyZXR1cm4gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgVVJMIHVybExvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlLCBTdHJpbmcgZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsKLQkJcmV0dXJuIHVybExvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIG5ldyBQYXRoKGZpbGVuYW1lV2l0aGluQnVuZGxlKSk7Ci0JfQotCXB1YmxpYyBVUkwgdXJsTG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIElQYXRoIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgcHZtID0gUGxhdGZvcm0uZmluZChidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJCWlmIChwdm0gIT0gbnVsbCkKLQkJCQlyZXR1cm4gUGxhdGZvcm0uYXNMb2NhbFVSTChwdm0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGRldk1vZGUpIHsKLQkJCVVSTFtdIHVybHMgPSBmaW5kRGV2QWxsRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlLnRvU3RyaW5nKCkpOwotCQkJaWYgKHVybHMubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gdXJsc1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTGlrZSA8Y29kZT5sb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHM8L2NvZGU+IGV4Y2VwdCBpdCByZXR1cm5zIFVSTCdzIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2VlIFByb3h5UGx1Z2luI2xvY2FsaXplRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUsIFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgVVJMW10gdXJsTG9jYWxpemVBbGxGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQlyZXR1cm4gdXJsTG9jYWxpemVBbGxCdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCX0KLQlwdWJsaWMgVVJMW10gdXJsTG9jYWxpemVBbGxGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIElQYXRoIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCXJldHVybiB1cmxMb2NhbGl6ZUFsbEJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZS50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZQotCSAqIEBwYXJhbSBmcmFnbWVudHMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBVUkxbXSB1cmxMb2NhbGl6ZUFsbEJ1bmRsZUFuZEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlLCBCdW5kbGVbXSBmcmFnbWVudHMsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCi0JCUFycmF5TGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgoZnJhZ21lbnRzID09IG51bGwgPyAwIDogZnJhZ21lbnRzLmxlbmd0aCkgKyAxKTsKLQkJVVJMIHVybCA9IGludGVybmFsVXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJdXJscy5hZGQodXJsKTsKLQkJaWYgKGZyYWdtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUJ1bmRsZSBmcmFnbWVudCA9IGZyYWdtZW50c1tpXTsKLQkJCQl1cmwgPSBpbnRlcm5hbFVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoZnJhZ21lbnQsIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCXVybHMuYWRkKHVybCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChVUkxbXSkgdXJscy50b0FycmF5KG5ldyBVUkxbdXJscy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlKQVJTID0gInByb3h5LmphcnMiOwkvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQHNlZSBQcm94eVBsdWdpbiNsb2NhbGl6ZUZyb21CdW5kbGUoQnVuZGxlLCBTdHJpbmcpCi0JICogCi0JICogVGhpcyBpcyBqdXN0IGEgaGVscGVyIHRvIHJldHVybiBhIHVybCBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gZmlsZW5hbWVXaXRoaW5CdW5kbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFVSTCB1cmxMb2NhbGl6ZUZyb21CdW5kbGVPbmx5KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQkvLyBJZiB0aGUgZmlsZW5hbWVXaXRoaW5CdW5kbGUgYmVnaW5zIHdpdGggb25lIG9mIHRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycywKLQkJLy8gaXQgbWlnaHQgYmUgaW4gYSBmcmFnbWVudC4KLQkJaWYgKGZpbGVuYW1lV2l0aGluQnVuZGxlLmNoYXJBdCgwKSA9PSAnJCcKLQkJCQkmJiAoZmlsZW5hbWVXaXRoaW5CdW5kbGUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCAiJG5sJCIsIDAsICIkbmwkIi5sZW5ndGgoKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl8fCBmaWxlbmFtZVdpdGhpbkJ1bmRsZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsICIkb3MkIiwgMCwgIiRvcyQiLmxlbmd0aCgpKSB8fCBmaWxlbmFtZVdpdGhpbkJ1bmRsZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJIiR3cyQiLCAwLCAiJHdzJCIubGVuZ3RoKCkpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gdXJsTG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQl0cnkgewotCQkJVVJMIHB2bSA9IG5ldyBVUkwoYnVuZGxlLmdldEVudHJ5KCIvIiksIGZpbGVuYW1lV2l0aGluQnVuZGxlKTsgLy8kTk9OLU5MUy0xJAotCQkJcHZtID0gdmVyaWZ5Rm91bmQoUGxhdGZvcm0uYXNMb2NhbFVSTChwdm0pKTsKLQkJCWlmIChwdm0gIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHZtOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZpbmREZXYoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSk7Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIFVSTCBpbnRlcm5hbFVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGZpbGVuYW1lV2l0aGluQnVuZGxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgcHZtID0gYnVuZGxlLmdldEVudHJ5KGZpbGVuYW1lV2l0aGluQnVuZGxlKTsKLQkJCWlmIChwdm0gIT0gbnVsbCkKLQkJCQlyZXR1cm4gUGxhdGZvcm0uYXNMb2NhbFVSTChwdm0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZpbmREZXYoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSk7CQkKLQkJCi0JfQkKLQkKLQlwcml2YXRlIFVSTCB2ZXJpZnlGb3VuZChVUkwgcHZtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZGV2TW9kZSkgewotCQkJLy8gTmVlZCB0byB0ZXN0IGlmIGZvdW5kIGluIGRldm1vZGUuIE90aGVyd2lzZSB3ZSB3aWxsIGp1c3QgYXNzdW1lIGl0IGlzIGZvdW5kLiBJZiBub3QgZm91bmQgb24gcmVtb3RlIGFuZCBtb3ZlZCB0byBjYWNoZSwgYW4gSU9FeGNlcHRpb24gd291bGQgYmUgdGhyb3duLgotCQkJaWYgKHB2bSAhPSBudWxsKSB7Ci0JCQkJSW5wdXRTdHJlYW0gaW9zID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpb3MgPSBwdm0ub3BlblN0cmVhbSgpOwotCQkJCQlpZiAoaW9zICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gcHZtOyAvLyBGb3VuZCBpdCwgc28gcmV0dXJuIGl0LgotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpb3MgIT0gbnVsbCkKLQkJCQkJCWlvcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlCi0JCQlyZXR1cm4gcHZtOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFByb3h5UGx1Z2luI2xvY2FsaXplRnJvbUJ1bmRsZShidW5kbGUsIFN0cmluZykKLQkgKiAKLQkgKiBUaGlzIGlzIGp1c3QgYSBoZWxwZXIgdG8gcmV0dXJuIGEgdXJsIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBmaWxlbmFtZVdpdGhpbkJ1bmRsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgVVJMIHVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoQnVuZGxlIGJ1bmRsZSwgSVBhdGggZmlsZW5hbWVXaXRoaW5CdW5kbGUpIHsJCQkJCQotCQlyZXR1cm4gdXJsTG9jYWxpemVGcm9tQnVuZGxlT25seShidW5kbGUsIGZpbGVuYW1lV2l0aGluQnVuZGxlLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwcml2YXRlIFVSTCBmaW5kRGV2KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQlpZiAoZGV2TW9kZSkgewotCQkJLy8gR290IHRoaXMgZmFyIGFuZCBpbiBkZXYgbW9kZSBtZWFucyBpdCB3YXNuJ3QgZm91bmQsIHNvIHdlJ2xsIHRyeSBmb3IgZGV2ZWxvcG1lbnQgc3R5bGUuCi0JCQkvLyBJdCBpcyBhc3N1bWVkIHRoYXQgaW4gZGV2IG1vZGUsIHdlIGFyZSBydW5uaW5nIHdpdGggdGhlIElERSBhcyBsb2NhbCBhbmQgYW55IAotCQkJLy8gYnVpbGQgb3V0cHV0cyB3aWxsIGJlIGxvY2FsIHNvIGxvY2FsIGZpbGUgcHJvdG9jb2wgd2lsbCBiZSByZXR1cm5lZAotCQkJLy8gZnJvbSBQbGF0Zm9ybS5yZXNvbHZlKCkuIFdlIHdvbid0IGJlIHJ1bm5pbmcgaW4gZGV2IG1vZGUgd2l0aCBvdXIgZW50aXJlcGx1Z2luIGJlaW5nIGluIGEgamFyLAotCQkJLy8gb3Igb24gYSBzZXBhcmF0ZSBzeXN0ZW0uCi0JCQl0cnkgewotCQkJCVVSTCBwdm0gPSBidW5kbGUuZ2V0RW50cnkoUFJPWFlKQVJTKTsKLQkJCQlpZiAocHZtICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gaW9zID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlvcyA9IHB2bS5vcGVuU3RyZWFtKCk7Ci0JCQkJCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQkJCXByb3BzLmxvYWQoaW9zKTsKLQkJCQkJCVN0cmluZyBwYXRoU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoZmlsZW5hbWVXaXRoaW5CdW5kbGUudG9TdHJpbmcoKSk7Ci0JCQkJCQlpZiAocGF0aFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQkJVVJMIHVybCA9IFBsYXRmb3JtLnJlc29sdmUoYnVuZGxlLmdldEVudHJ5KCIvIikpOwkvLyBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgaW4gZGVidWcgbW9kZSwgdGhlbiB0aGlzIHBsdWdpbiBpcyBhbiBpbXBvcnRlZCBwbHVnaW4gd2l0aGluIHRoZSBkZXZlbG9wZW1lbnQgd29ya3NwYWNlLiAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpOwkvLyBUaGlzIGdldHMgdXMgdG8gd29ya3NwYWNlIHJvb3Qgb2YgZGV2ZWxvcG1lbnQgd29ya3NwYWNlLgotCQkJCQkJCQlmaWxlID0gbmV3IEZpbGUoZmlsZSwgcGF0aFN0cmluZyk7Ci0JCQkJCQkJCXJldHVybiBmaWxlLnRvVVJMKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGlvcyAhPSBudWxsKQotCQkJCQkJCWlvcy5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQlwcml2YXRlIFVSTFtdIGZpbmREZXZBbGxGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBmaWxlbmFtZVdpdGhpbkJ1bmRsZSkgewotCQlCdW5kbGUgW10gZnJhZ21lbnRzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0JCUFycmF5TGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgoZnJhZ21lbnRzID09IG51bGwgPyAwIDogZnJhZ21lbnRzLmxlbmd0aCkgKyAxKTsKLQkJVVJMIHVybCA9IGZpbmREZXYoYnVuZGxlLCBmaWxlbmFtZVdpdGhpbkJ1bmRsZSk7Ci0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXVybHMuYWRkKHVybCk7Ci0JCWlmIChmcmFnbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlCdW5kbGUgZnJhZ21lbnQgPSBmcmFnbWVudHNbaV07Ci0JCQkJdXJsID0gZmluZERldihmcmFnbWVudCwgZmlsZW5hbWVXaXRoaW5CdW5kbGUpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQkJdXJscy5hZGQodXJsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFVSTFtdKSB1cmxzLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pOwotCX0JCi0JLyoqCi0JICogQSBoZWxwZXIgdG8gb3JkZXIgdGhlIHBsdWdpbnMgaW50byBwcmUtcmVxIG9yZGVyLiAKLQkgKiBJZiBBIGV2ZW50dWFsbHkgZGVwZW5kcyBvbiBCLCB0aGVuIEIgd2lsbCBiZSBhaGVhZCBvZiBBIGluIHRoZQotCSAqIGxpc3Qgb2YgcGx1Z2lucy4gKEkuZS4gQiBpcyBhIHByZS1yZXEgc29tZXdoZXJlIG9mIEEpLgotCSAqICAKLQkgKiBAcGFyYW0gYnVuZGxlc1RvT3JkZXIgLSBCdW5kbGVzIG9mIGludGVyZXN0LiBUaGUgcmVzdWx0cyB3aWxsIGhhdmUgdGhlc2UgaW4gdGhpZWUgY29ycmVjdCBvcmRlci4KLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHRoZSBCdW5kbGVycyBpbiB0aGVyZSBvcmRlciBmcm9tIG5vIHByZXJlcXMgaW4gc2V0IHRvIHRoZSBsZWF2ZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBCdW5kbGVbXSBvcmRlclBsdWdpbnMoZmluYWwgU2V0IGJ1bmRsZXNUb09yZGVyKSB7Ci0JCU1hcCBwcmVyZXFzTWFwID0gbmV3IEhhc2hNYXAoYnVuZGxlc1RvT3JkZXIuc2l6ZSgpKjMpOwotCQlpbnQgbmR4ID0gYnVuZGxlc1RvT3JkZXIuc2l6ZSgpOwotCQlCdW5kbGVbXSByZXN1bHQgPSBuZXcgQnVuZGxlW25keF07Ci0JCU1hcCBkZXBlbmRlbnRzID0gZ2V0RGVwZW5kZW50Q291bnRzKGZhbHNlLCBidW5kbGVzVG9PcmRlciwgcHJlcmVxc01hcCk7CS8vIFdlIHdhbnQgdGhlIGluYWN0aXZlIG9uZXMgdG9vLiBUaGF0IHdheSBoYXZlIGNvbXBsZXRlIG9yZGVyLiBUaGV5IGNhbiBiZSBpZ25vcmVkIGxhdGVyIGlmIG5lY2Vzc2FyeS4KLQkJLy8ga2VlcCBpdGVyYXRpbmcgdW50aWwgYWxsIGhhdmUgYmVlbiB2aXNpdGVkLiBUaGlzIHdpbGwgYWN0dWFsbHkgZmluZCB0aGVtIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB3aGF0IHdlCi0JCS8vIHdhbnQsIGkuZS4gaXQgd2lsbCBmaW5kIHRoZSBsZWF2ZXMgZmlyc3QuIFNvIHdlIHdpbGwgYnVpbGQgcmVzdWx0IGFycmF5IGluIHJldmVyc2Ugb3JkZXIuCi0JCXdoaWxlICghZGVwZW5kZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGxvb3Agb3ZlciB0aGUgZGVwZW5kZW50cyBsaXN0LiAgRm9yIGVhY2ggZW50cnksIGlmIHRoZXJlIGFyZSBubyBkZXBlbmRlbnRzLCB2aXNpdAotCQkJLy8gdGhlIGJ1bmRsZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QuICBNYWtlIGEgY29weSBvZiB0aGUga2V5cyBzbyB3ZSBkb24ndCBlbmQgdXAKLQkJCS8vIHdpdGggY29uY3VycmVudCBhY2Nlc3NlcyAoc2luY2Ugd2UgYXJlIGRlbGV0aW5nIHRoZSB2YWx1ZXMgYXMgd2UgZ28pCi0JCQlJdGVyYXRvciBpYiA9IGRlcGVuZGVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGliLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGliLm5leHQoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSkgZW50cnkuZ2V0S2V5KCkgOwotCQkJCWludFtdIGNvdW50ID0gKGludFtdKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChjb3VudCAhPSBudWxsICYmIGNvdW50WzBdIDw9IDApIHsKLQkJCQkJaWYgKGJ1bmRsZXNUb09yZGVyLmNvbnRhaW5zKGJ1bmRsZSkpIHsKLQkJCQkJCXJlc3VsdFstLW5keF0gPSBidW5kbGU7Ci0JCQkJCQlpZiAobmR4ID09IDApCi0JCQkJCQkJcmV0dXJuIHJlc3VsdDsJLy8gV2UndmUgb3JkZXJlZCBhbGwgdGhhdCB3ZSBjYXJlIGFib3V0LiBBbnl0aGluZyBsZWZ0IG92ZXIgaXMgdW5pbXBvcnRhbnQuCi0JCQkJCX0KLQkJCQkJaWIucmVtb3ZlKCk7Ci0JCQkJCS8vIGRlY3JlbWVudCB0aGUgZGVwZW5kZW50IGNvdW50IGZvciBhbGwgb2YgdGhlIHByZXJlcXVpc2l0ZXMuCi0JCQkJCUJ1bmRsZVtdIHJlcXVpcmVzID0gZ2V0UHJlcmVxcyhidW5kbGUsIHByZXJlcXNNYXApOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlcXVpcmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlCdW5kbGUgcHJlcmVxID0gcmVxdWlyZXNbal07Ci0JCQkJCQlpbnRbXSBjb3VudFByZXJlcSA9IChpbnRbXSkgZGVwZW5kZW50cy5nZXQocHJlcmVxKTsKLQkJCQkJCWlmIChjb3VudFByZXJlcSAhPSBudWxsKQotCQkJCQkJCS0tY291bnRQcmVyZXFbMF07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYWxsIG9mIHRoZSBwcmVyZXFzIGZvciB0aGlzIGJ1bmRsZSwgYWxsIG9mIHRoZSB3YXkgZG93biB0byB0aGUgcm9vdC4KLQkgKiBUaGV5IHdpbGwgYmUgaW4gdG9wLWRvd24gZGVwdGgtZmlyc3Qgb3JkZXIuIFRoZXJlIHdvbid0IGJlIGR1cGxpY2F0ZXMuIFRoZXkgd2lsbCBzaG93IHVwCi0JICogb25seSBvbmNlIHRoZSBmaXJzdCB0aW1lIHRoZXkgYXJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWxsIHByZS1yZXFzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcmVyZXFzKEJ1bmRsZSBidW5kbGUpIHsKLQkJTGlzdCBwcmVyZXFzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxQcmVyZXFzKGJ1bmRsZSwgcHJlcmVxcywgbmV3IEhhc2hNYXAoKSk7Ci0JCXJldHVybiBwcmVyZXFzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbFByZXJlcXMoQnVuZGxlIGJ1bmRsZSwgTGlzdCBwcmVyZXFzLCBNYXAgcHJlcmVxc01hcCkgewotCQlCdW5kbGVbXSBwcnMgPSBnZXRQcmVyZXFzKGJ1bmRsZSwgcHJlcmVxc01hcCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlCdW5kbGUgcHJlID0gcHJzW2ldOwotCQkJaWYgKHByZXJlcXNNYXAuY29udGFpbnNLZXkocHJlKSkKLQkJCQljb250aW51ZTsJLy8gQWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBvbmUgb25jZS4KLQkJCXByZXJlcXMuYWRkKHByZSk7CS8vIEFkZCB0byB0aGUgbGlzdCBvZiBwcmUtcmVxcyBhY2N1bXVsYXRlZCBzbyBmYXIuCi0JCQlnZXRBbGxQcmVyZXFzKHByZSwgcHJlcmVxcywgcHJlcmVxc01hcCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlW10gZ2V0UHJlcmVxcyhCdW5kbGUgYnVuZGxlLCBNYXAgcHJlcmVxc01hcCkgewotCQlCdW5kbGVbXSBwcmVyZXFzID0gKEJ1bmRsZVtdKSBwcmVyZXFzTWFwLmdldChidW5kbGUpOwotCQlpZiAocHJlcmVxcyA9PSBudWxsKSB7Ci0JCQlwcmVyZXFzID0gZ2V0UHJlcmVxcyhidW5kbGUpOwotCQkJcHJlcmVxc01hcC5wdXQoYnVuZGxlLCBwcmVyZXFzKTsKLQkJfQotCQlyZXR1cm4gcHJlcmVxczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCdW5kbGVbXSBnZXRQcmVyZXFzKEJ1bmRsZSBidW5kbGUpIHsKLQkJQnVuZGxlW10gbCA9IChCdW5kbGVbXSkgcGx1Z2luUmVxdWlyZWRNYXAuZ2V0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCWlmIChsID09IG51bGwpIHsKLQkJCUJ1bmRsZVNwZWNpZmljYXRpb24gc3BlY3NbXSA9IFBsYXRmb3JtLmdldFBsYXRmb3JtQWRtaW4oKS5nZXRTdGF0ZShmYWxzZSkuZ2V0QnVuZGxlKGJ1bmRsZS5nZXRCdW5kbGVJZCgpKS5nZXRSZXF1aXJlZEJ1bmRsZXMoKTsKLQkJCUFycmF5TGlzdCBidW5kbGVzID0gbmV3IEFycmF5TGlzdChzcGVjcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjcy5sZW5ndGg7IGkrKykgewotCQkJCUJ1bmRsZSBiID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHNwZWNzW2ldLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGIgIT0gbnVsbCkKLQkJCQkJYnVuZGxlcy5hZGQoYik7Ci0JCQl9Ci0JCQlsID0gKEJ1bmRsZVtdKSBidW5kbGVzLnRvQXJyYXkobmV3IEJ1bmRsZVtidW5kbGVzLnNpemUoKV0pOwotCQkJcGx1Z2luUmVxdWlyZWRNYXAucHV0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgbCk7Ci0JCX0KLQkJcmV0dXJuIGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1hcCBnZXREZXBlbmRlbnRDb3VudHMoYm9vbGVhbiBhY3RpdmVPbmx5LCBTZXQgc3RhcnRpbmdTZXQsIE1hcCBwcmVyZXFzTWFwKSB7Ci0JCU1hcCBkZXBlbmRlbnRzID0gbmV3IEhhc2hNYXAoc3RhcnRpbmdTZXQuc2l6ZSgpKTsKLQkJLy8gYnVpbGQgYSB0YWJsZSBvZiBhbGwgZGVwZW5kZW50IGNvdW50cy4gIFRoZSB0YWJsZSBpcyBrZXllZCBieSBkZXNjcmlwdG9yIGFuZAotCQkvLyB0aGUgdmFsdWUgdGhlIGludGVnZXIgbnVtYmVyIG9mIGRlcGVuZGVudCBwbHVnaW5zLgotCQlMaXN0IHByb2Nlc3NOb3cgPSBuZXcgQXJyYXlMaXN0KHN0YXJ0aW5nU2V0KTsKLQkJTGlzdCBwcm9jZXNzTmV4dCA9IG5ldyBBcnJheUxpc3QocHJvY2Vzc05vdy5zaXplKCkpOwotCQlpZiAoIXByb2Nlc3NOb3cuaXNFbXB0eSgpKSB7Ci0JCQkvLyBHbyB0aHJvdWdoIHRoZSBmaXJzdCB0aW1lIGZyb20gdGhlIHN0YXJ0aW5nIHNldCB0byBnZXQgYW4gZW50cnkgaW50byB0aGUgbGlzdC4KLQkJCS8vIElmIHRoZXJlIGlzIGFuIGVudHJ5LCB0aGVuIGl0IHdvbid0IGJlIG1hcmtlZCBmb3IgcHJvY2Vzc05leHQuIE9ubHkgbmV3IGVudHJpZXMKLQkJCS8vIGFyZSBhZGRlZCB0byBwcm9jZXNzTmV4dCBpbiB0aGUgZm9sbG93aW5nIGxvb3AuCi0JCQlpbnQgcG5TaXplID0gcHJvY2Vzc05vdy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBuU2l6ZTsgaSsrKSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpIHByb2Nlc3NOb3cuZ2V0KGkpOwotCQkJCWlmIChhY3RpdmVPbmx5ICYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8vIGVuc3VyZSB0aGVyZSBpcyBhbiBlbnRyeSBmb3IgdGhpcyBkZXNjcmlwdG9yIChvdGhlcndpc2UgaXQgd2lsbCBub3QgYmUgdmlzaXRlZCkKLQkJCQlpbnRbXSBlbnRyeSA9IChpbnRbXSkgZGVwZW5kZW50cy5nZXQoYnVuZGxlKTsKLQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJZGVwZW5kZW50cy5wdXQoYnVuZGxlLCBuZXcgaW50WzFdKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gTm93IHByb2Nlc3MgdGhlIHByb2Nlc3NOb3cgdG8gZmluZCB0aGUgcmVxdWlyZWRzLCBpbmNyZW1lbnQgdGhlbSwgYW5kIGFkZCB0byBwcm9jZXNzTmV4dCBpZiBuZXZlciBmb3VuZCBiZWZvcmUuCi0JCXdoaWxlICghcHJvY2Vzc05vdy5pc0VtcHR5KCkpIHsKLQkJCXByb2Nlc3NOZXh0LmNsZWFyKCk7Ci0JCQlpbnQgcG5TaXplID0gcHJvY2Vzc05vdy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBuU2l6ZTsgaSsrKSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpIHByb2Nlc3NOb3cuZ2V0KGkpOwotCQkJCWlmIChhY3RpdmVPbmx5ICYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpCi0JCQkJCWNvbnRpbnVlOwkJCQotCQkJCUJ1bmRsZVtdIHJlcXVpcmVzID0gZ2V0UHJlcmVxcyhidW5kbGUsIHByZXJlcXNNYXApOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVxdWlyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJQnVuZGxlIHByZXJlcSA9IHJlcXVpcmVzW2pdOwotCQkJCQlpZiAocHJlcmVxID09IG51bGwgfHwgYWN0aXZlT25seQotCQkJCQkJCSYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaW50W10gZW50cnkgPSAoaW50W10pIGRlcGVuZGVudHMuZ2V0KHByZXJlcSk7Ci0JCQkJCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQkJCQlkZXBlbmRlbnRzLnB1dChwcmVyZXEsIG5ldyBpbnRbXXsxfSk7Ci0JCQkJCQlwcm9jZXNzTmV4dC5hZGQocHJlcmVxKTsgLy8gTmV2ZXIgcHJvY2Vzc2VkIGJlZm9yZSwgc28gd2UgYWRkIGl0IHRvIHRoZSBuZXh0IHByb2Nlc3MgbG9vcC4KLQkJCQkJfSBlbHNlCi0JCQkJCQkrK2VudHJ5WzBdOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gTm93IHN3YXAgdGhlIGxpc3RzIHNvIHRoYXQgd2UgcHJvY2Vzc05leHQgd2lsbCBiZSBub3cgYW5kIHZpc2EtdmVyc2EuCi0JCQlMaXN0IHQgPSBwcm9jZXNzTmV4dDsKLQkJCXByb2Nlc3NOZXh0ID0gcHJvY2Vzc05vdzsKLQkJCXByb2Nlc3NOb3cgPSB0OwotCQl9Ci0JCXJldHVybiBkZXBlbmRlbnRzOwotCX0KLQkJCi0JLyoqCi0JICogQWRkIGEgc2h1dGRvd24gbGlzdGVuZXIKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm94eVNodXRkb3duTGlzdGVuZXIoSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoc2h1dGRvd25MaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXNodXRkb3duTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlzaHV0ZG93bkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHNodXRkb3duIGxpc3RlbmVyCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJveHlTaHV0ZG93bkxpc3RlbmVyKElQcm94eVBsdWdpblNodXRkb3duTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNodXRkb3duTGlzdGVuZXJzICE9IG51bGwpCi0JCQlzaHV0ZG93bkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uTGlzdGVuZXIgbGF1bmNoTGlzdGVuZXIgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGF1bmNoQ29uZmlndXJhdGlvbkFkZGVkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFjb25maWd1cmF0aW9uLmlzV29ya2luZ0NvcHkoKSAmJiBJUHJveHlDb25zdGFudHMuSURfUFJPWFlfTEFVTkNIX0dST1VQLmVxdWFscyhjb25maWd1cmF0aW9uLmdldENhdGVnb3J5KCkpKQotCQkJCQlzdGFydENsZWFudXBKb2IoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsYXVuY2hDb25maWd1cmF0aW9uQ2hhbmdlZChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCQl0cnkgewotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc1dvcmtpbmdDb3B5KCkgJiYgSVByb3h5Q29uc3RhbnRzLklEX1BST1hZX0xBVU5DSF9HUk9VUC5lcXVhbHMoY29uZmlndXJhdGlvbi5nZXRDYXRlZ29yeSgpKSkKLQkJCQkJc3RhcnRDbGVhbnVwSm9iKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGF1bmNoQ29uZmlndXJhdGlvblJlbW92ZWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkJdHJ5IHsKLQkJCQkvLyBPbiBkZWxldGUgeW91IGNhbid0IHRlbGwgdGhlIGNhdGVnb3J5IG9yIGFueXRoaW5nIGJlY2F1c2UgYWxsIG9mIHRoYXQgaW5mbyBoYXMgYWxyZWFkeSByZW1vdmVkLgotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc1dvcmtpbmdDb3B5KCkpCi0JCQkJCXN0YXJ0Q2xlYW51cEpvYigpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBKb2IgY2xlYW51cEpvYiA9IG5ldyBKb2IoUHJveHlNZXNzYWdlcy5Qcm94eVBsdWdpbl9DbGVhbnVwRGVmYXVsdFByb3h5TGF1bmNoQ29uZmlndXJhdGlvbnMpIHsgCi0JCXsKLQkJCXNldFN5c3RlbSh0cnVlKTsJLy8gU28gaXQgZG9lc24ndCBzaG93IHVwIGluIHByb2dyZXNzIG1vbml0b3IuIE5vIG5lZWQgdG8gaW50ZXJydXB0IHVzZXIuCi0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwkvLyBBIHF1aWNrIHJ1bm5pbmcgam9iLgotCQl9Ci0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJLy8gYWxsIHdlIHdhbnQgdG8gZG8gaXMgZmluZCBvdXQgaWYgYW55IGxhdW5jaCBjb25maWd1cmF0aW9ucyAoZnJvbSBwcm94eSBsYXVuY2ggZ3JvdXApIGV4aXN0IGZvcgotCQkJLy8gYSBwcm9qZWN0LiBJZiB0aGV5IGRvbid0LCB0aGVuIHVuc2V0IHRoZSBwcm9qZWN0J3MgcHJvcGVydHkuIElmIHRoZXkgZG8sIGFuZCB0aGUgcHJvcGVydHkgaXMgbm90Ci0JCQkvLyBzZXQsIHRoZW4gc2V0IGl0IHRvIE5PVF9TRVQgdG8gaW5kaWNhdGUgbm90IHNldCwgYnV0IHRoZXJlIGFyZSBzb21lIGNvbmZpZ3MgZm9yIGl0LgotCQkJLy8gV2UganVzdCBnYXRoZXIgdGhlIHByb2plY3QgbmFtZXMgdGhhdCBoYXZlIGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLQkJCXRyeSB7Ci0JCQkJU2V0IHByb2plY3ROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoSVByb3h5Q29uc3RhbnRzLklEX1BST1hZX0xBVU5DSF9HUk9VUC5lcXVhbHMoY29uZmlnc1tpXS5nZXRDYXRlZ29yeSgpKQotCQkJCQkJJiYgKFByb3h5TGF1bmNoU3VwcG9ydC5BVFRSX1BSSVZBVEUgPT0gbnVsbCB8fCAhY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoUHJveHlMYXVuY2hTdXBwb3J0LkFUVFJfUFJJVkFURSwgZmFsc2UpKSkKLQkJCQkJCXByb2plY3ROYW1lcy5hZGQoY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAiIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJSUphdmFNb2RlbCBtb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IG1vZGVsLmdldENoaWxkcmVuKCk7Ci0JCQkJaW50IGNhbmNlbENvdW50ID0gMTA7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQlpZiAoY2hpbGRyZW5bal0uZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQkJCQlpZiAoLS1jYW5jZWxDb3VudCA8PSAwKQotCQkJCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkJCQljYW5jZWxDb3VudCA9IDEwOwkvLyBSZXN0IGZvciBuZXh0IHNldCBvZiB0ZW4uCi0JCQkJCQkJCS8vIENoZWNraW5nIG9uIGV2ZXJ5IDEwIHByb2plY3RzIGJlY2F1c2UgdGhleSBtYXkgYmUgbWFueSBwcm9qZWN0cywgd2hpbGUgb25seSBmZXcgY29uZmlncy4KLQkJCQkJCQkJLy8gVGhpcyB3YXkgaXQgd2lsbCBzdG9wIHNvb25lci4KLQkJCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCUlQcm9qZWN0IHAgPSAoKElKYXZhUHJvamVjdCkgY2hpbGRyZW5bal0pLmdldFByb2plY3QoKTsKLQkJCQkJCWlmIChwcm9qZWN0TmFtZXMuY29udGFpbnMocC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJLy8gVGhpcyBwcm9qZWN0IGhhcyBhIGxhdW5jaCBjb25maWcuIElmIGl0IGhhcyBhIHNldHRpbmcsIHRoZW4gZG8gbm90aGluZywgZWxzZSBuZWVkIHRvIHB1dCBvbiBub3Qgc2V0LiAKLQkJCQkJCQlpZiAocC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoUHJveHlQbHVnaW4uUFJPUEVSVFlfTEFVTkNIX0NPTkZJR1VSQVRJT04pID09IG51bGwpCi0JCQkJCQkJCXAuZ2V0UHJvamVjdCgpLnNldFBlcnNpc3RlbnRQcm9wZXJ0eSgKLQkJCQkJCQkJCVByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OLAotCQkJCQkJCQkJUHJveHlMYXVuY2hTdXBwb3J0Lk5PVF9TRVQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBUaGlzIHByb2plY3QgaGFzIG5vIGxhdW5jaCBjb25maWdzLiBSZW1vdmUgYW55IHNldHRpbmcgaWYgaXQgZXhpc3RzLgotCQkJCQkJCXAuc2V0UGVyc2lzdGVudFByb3BlcnR5KFByb3h5UGx1Z2luLlBST1BFUlRZX0xBVU5DSF9DT05GSUdVUkFUSU9OLCAoU3RyaW5nKSBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIHZvaWQgc3RhcnRDbGVhbnVwSm9iKCkgewotCQljbGVhbnVwSm9iLmNhbmNlbCgpOwkvLyBTdG9wIHdoYXQgd2UgYXJlIGRvaW5nLgotCQljbGVhbnVwSm9iLnNjaGVkdWxlKDEwMDBsKTsJLy8gU2NoZWR1bGUgdG8gc3RhcnQgaW4gb25lIHNlY29uZC4KLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmFkZExhdW5jaENvbmZpZ3VyYXRpb25MaXN0ZW5lcihsYXVuY2hMaXN0ZW5lcik7Ci0JCWNvbnRleHQuYWRkQnVuZGxlTGlzdGVuZXIobmV3IEJ1bmRsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgYnVuZGxlQ2hhbmdlZChCdW5kbGVFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRCdW5kbGUoKSAhPSBQcm94eVBsdWdpbi50aGlzLmdldEJ1bmRsZSgpKQotCQkJCQlyZXR1cm47CS8vIE5vdCBvZiBpbnRlcmVzdCB0byB1cy4KLQkJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJCQljYXNlIEJ1bmRsZUV2ZW50LlNUQVJURUQ6Ci0JCQkJCQljb250ZXh0LnJlbW92ZUJ1bmRsZUxpc3RlbmVyKHRoaXMpOwkvLyBTaW5jZSB3ZSBkb24ndCBjYXJlIGFueW1vcmUKLQkJCQkJCXN0YXJ0Q2xlYW51cEpvYigpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQnVuZGxlRXZlbnQuU1RPUFBFRDoKLQkJCQkJY2FzZSBCdW5kbGVFdmVudC5VTklOU1RBTExFRDoKLQkJCQkJY2FzZSBCdW5kbGVFdmVudC5VTlJFU09MVkVEOgotCQkJCQkJY29udGV4dC5yZW1vdmVCdW5kbGVMaXN0ZW5lcih0aGlzKTsJLy8gV2Ugc3RvcHBlZCBiZWZvcmUgd2Ugc3RhcnRlZCwgc28gcmVtb3ZlIG91cnNlbHZlcy4KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChQUkVGRVJFTkNFU19WTV9OT1ZFUklGWV9LRVksIHRydWUpOwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEhhbmRsZSBjYXNlIHdoZXJlIGRlYnVnIHBsdWdpbiBzaHV0cyBkb3duIGJlZm9yZSB3ZSBkbyBzaW5jZSBvcmRlciBub3QgZ3VhcmVudGVlZC4KLQkJaWYgKERlYnVnUGx1Z2luLmdldERlZmF1bHQoKSAhPSBudWxsKQotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKS5yZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uTGlzdGVuZXIobGF1bmNoTGlzdGVuZXIpOwotCQljbGVhbnVwSm9iLmNhbmNlbCgpOwkvLyBTdG9wIHdoYXQgd2UgYXJlIGRvaW5nLgkJCi0JCWlmIChzaHV0ZG93bkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBzaHV0ZG93bkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJUHJveHlQbHVnaW5TaHV0ZG93bkxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLnNodXRkb3duKCk7Ci0JCQl9Ci0JCX0JCQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DT05GSUdVUkFUSU9OX0NPTlRSSUJVVElPTl9FWFRFTlNJT05fUE9JTlQgPSAib3JnLmVjbGlwc2UuamVtLnByb3h5LmNvbnRyaWJ1dG9ycyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9FWFRFTlNJT05fUkVHSVNUUkFUSU9OX0VYVEVOU0lPTl9QT0lOVCA9ICJvcmcuZWNsaXBzZS5qZW0ucHJveHkuZXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DT05UQUlORVIgPSAiY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfUkVHSVNUUllfVFlQRSA9ICJyZWdpc3RyeVR5cGUiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgcGx1Z2luUmVxdWlyZWRNYXAgPSBuZXcgSGFzaE1hcCg1MCk7Ci0JCi0JLyoKLQkgKiBNYXAgb2YgY29udGFpbmVyIGlkJ3MgdG8gdGhlaXIgb3JkZXJlZCBhcnJheSBvZiBjb250cmlidXRpb24gY29uZmlnIGVsZW1lbnRzLgotCSAqLwotCXByb3RlY3RlZCBNYXAgY29udGFpbmVyVG9Db250cmlidXRpb25zID0gbnVsbDsKLQkvKgotCSAqIE1hcCBvZiBwbHVnaW4gaWQncyB0byB0aGVpciBvcmRlcmVkIGFycmF5IG9mIGNvbnRyaWJ1dGlvbiBjb25maWcgZWxlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIE1hcCBwbHVnaW5Ub0NvbnRyaWJ1dGlvbnMgPSBudWxsOwotCQotCS8qCi0JICogTWFwIG9mIGNvbnRhaW5lciBpZCdzIHRvIHRoZWlyIG9yZGVyZWQgYXJyYXkgb2YgZXh0ZW5zaW9uIGNvbmZpZyBlbGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGNvbnRhaW5lclRvRXh0ZW5zaW9ucyA9IG51bGw7Ci0JLyoKLQkgKiBNYXAgb2YgcGx1Z2luIGlkJ3MgdG8gdGhlaXIgb3JkZXJlZCBhcnJheSBvZiBjb250cmlidXRpb24gY29uZmlnIGVsZW1lbnRzLgotCSAqLwotCXByb3RlY3RlZCBNYXAgcGx1Z2luVG9FeHRlbnNpb24gPSBudWxsOwotCi0KLQkvKioKLQkgKiBUaGVzZSBhcmUgcHVibGljIG9ubHkgc28gdGhhdCBqZW0udWkgY2FuIGFjY2VzcyB0aGlzIGNvbnN0YW50LiBOb3QgbWVhbnQgdG8gYmUgYWNjZXNzZWQgYnkgb3RoZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTiA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLCAicHJveHlMYXVuY2hDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luIG9yZGVyZWQgYXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGNvbnRyaWJ1dGVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXJpZAotCSAqIEByZXR1cm4gQXJyYXkgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGNvbnRhaW5lciBoYXMgbm8gY29udHJpYnV0aW9ucy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbnRhaW5lckNvbmZpZ3VyYXRpb25zKFN0cmluZyBjb250YWluZXJpZCkgewotCQlpZiAoY29udGFpbmVyVG9Db250cmlidXRpb25zID09IG51bGwpCi0JCQlwcm9jZXNzUHJveHlDb250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBjb250YWluZXJUb0NvbnRyaWJ1dGlvbnMuZ2V0KGNvbnRhaW5lcmlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBsdWdpbiBvcmRlcmVkIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgZm9yIHRoZSBnaXZlbiBwbHVnaW4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBjb250cmlidXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luaWQKLQkgKiBAcmV0dXJuIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBwbHVnaW4gaGFzIG5vIGNvbnRyaWJ1dGlvbnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRQbHVnaW5Db25maWd1cmF0aW9ucyhTdHJpbmcgcGx1Z2luaWQpIHsKLQkJaWYgKHBsdWdpblRvQ29udHJpYnV0aW9ucyA9PSBudWxsKQotCQkJcHJvY2Vzc1Byb3h5Q29udHJpYnV0aW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgcGx1Z2luVG9Db250cmlidXRpb25zLmdldChwbHVnaW5pZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gb3JkZXJlZCBhcnJheSBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgY29udHJpYnV0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcmlkCi0JICogQHJldHVybiBBcnJheSBvZiBleHRlbnNpb24gcmVnaXN0cmF0aW9uIGVsZW1lbnRzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgY29udGFpbmVyIGhhcyBubyBjb250cmlidXRpb25zLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29udGFpbmVyRXh0ZW5zaW9ucyhTdHJpbmcgY29udGFpbmVyaWQpIHsKLQkJaWYgKGNvbnRhaW5lclRvRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJcHJvY2Vzc1Byb3h5RXh0ZW5zaW9uRXh0ZW5zaW9uUG9pbnQoKTsKLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgY29udGFpbmVyVG9FeHRlbnNpb25zLmdldChjb250YWluZXJpZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gb3JkZXJlZCBhcnJheSBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gcGx1Z2luLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgY29udHJpYnV0ZWQuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbmlkCi0JICogQHJldHVybiBBcnJheSBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnRzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgcGx1Z2luIGhhcyBubyBjb250cmlidXRpb25zLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0UGx1Z2luRXh0ZW5zaW9ucyhTdHJpbmcgcGx1Z2luaWQpIHsKLQkJaWYgKHBsdWdpblRvRXh0ZW5zaW9uID09IG51bGwpCi0JCQlwcm9jZXNzUHJveHlFeHRlbnNpb25FeHRlbnNpb25Qb2ludCgpOwotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBwbHVnaW5Ub0V4dGVuc2lvbi5nZXQocGx1Z2luaWQpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzUHJveHlDb250cmlidXRpb25FeHRlbnNpb25Qb2ludCgpIHsKLQkJQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8gaW5mbyA9IHByb2Nlc3NDb250cmlidXRpb25FeHRlbnNpb25Qb2ludChQSV9DT05GSUdVUkFUSU9OX0NPTlRSSUJVVElPTl9FWFRFTlNJT05fUE9JTlQpOwotCQljb250YWluZXJUb0NvbnRyaWJ1dGlvbnMgPSBpbmZvLmNvbnRhaW5lclRvQ29udHJpYnV0aW9uczsKLQkJcGx1Z2luVG9Db250cmlidXRpb25zID0gaW5mby5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnM7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzUHJveHlFeHRlbnNpb25FeHRlbnNpb25Qb2ludCgpIHsKLQkJQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8gaW5mbyA9IHByb2Nlc3NDb250cmlidXRpb25FeHRlbnNpb25Qb2ludChQSV9FWFRFTlNJT05fUkVHSVNUUkFUSU9OX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCWNvbnRhaW5lclRvRXh0ZW5zaW9ucyA9IGluZm8uY29udGFpbmVyVG9Db250cmlidXRpb25zOwotCQlwbHVnaW5Ub0V4dGVuc2lvbiA9IGluZm8ucGx1Z2luVG9Db250cmlidXRpb25zOwotCX0JCi0JCi0JLyoqCi0JICogUmVzdWx0IGZvcm0gcHJvY2Vzc0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50LgotCSAqIAotCSAqIEBzZWUgUHJveHlQbHVnaW4jcHJvY2Vzc0NvbnRyaWJ1dGlvbkV4dGVuc2lvblBvaW50KFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvIHsKLQkJLyoqCi0JCSAqIE1hcCBvZiBjb250YWluZXIgaWRzIChTdHJpbmcpIHRvIGNvbnRyaWJ1dGlvbnMgKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSB0aGF0IHdhcyBmb3VuZCB3aXRoIHRoYXQgaWQuIEZvciBlYWNoIGNvbnRhaW5lciwKLQkJICogdGhlIGNvbnRyaWJ1dGlvbnMgd2lsbCBiZSBsaXN0ZWQgaW4gcGx1Z2luIHByZXJlcSBvcmRlci4KLQkJICovCi0JCXB1YmxpYyBNYXAgY29udGFpbmVyVG9Db250cmlidXRpb25zOwotCQkKLQkJLyoqCi0JCSAqIE1hcCBvZiBwbHVnaW4gaWRzIChTdHJpbmcpIHRvIGNvbnRyaWJ1dGlvbnMgKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSB0aGF0IHdhcyBmb3VuZCB3aXRoIHRoYXQgaWQuIEZvciBlYWNoIHBsdWdpbiwKLQkJICogdGhlIGNvbnRyaWJ1dGlvbnMgd2lsbCBiZSBsaXN0ZWQgaW4gcGx1Z2luIHByZXJlcSBvcmRlci4KLQkJICovCi0JCXB1YmxpYyBNYXAgcGx1Z2luVG9Db250cmlidXRpb25zOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGV4dGVuc2lvbiBwb2ludCBsb29raW5nIGNvbnRyaWJ1dG9ycy4gSXQgd2lsbCBmaW5kIGVudHJpZXMgdGhhdCBoYXZlIHRoZSAiY29udGFpbmVyIiBvciAicGx1Z2luIiBhdHRyaWJ1dGVzCi0JICogc2V0IG9uIHRoZW0uCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50IGZ1bGx5LXF1YWxpZmllZCBleHRlbnNpb24gcG9pbnQgaWQsIGluY2x1ZGluZyBwbHVnaW4gaWQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiBAcmV0dXJuIHRoZSBjb250cmlidXRvciBpbmZvIHJlY29yZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRyaWJ1dG9yRXh0ZW5zaW9uUG9pbnRJbmZvIHByb2Nlc3NDb250cmlidXRpb25FeHRlbnNpb25Qb2ludChTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsJCi0JCS8vIFdlIGFyZSBwcm9jZXNzaW5nIHRoaXMgb25jZSBiZWNhdXNlIGl0IGlzIGFjY2Vzc2VkIG9mdGVuIChvbmNlIHBlciB2bSBwZXIgcHJvamVjdCkuCi0JCS8vIFRoaXMgY2FuIGFkZCB1cCBzbyB3ZSBnZXQgaXQgdG9nZXRoZXIgb25jZSBoZXJlLgotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0cCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoZXh0ZW5zaW9uUG9pbnQpOwotCQlDb250cmlidXRvckV4dGVuc2lvblBvaW50SW5mbyByZXN1bHQgPSBuZXcgQ29udHJpYnV0b3JFeHRlbnNpb25Qb2ludEluZm8oKTsKLQkJaWYgKGV4dHAgPT0gbnVsbCkgewotCQkJcmVzdWx0LmNvbnRhaW5lclRvQ29udHJpYnV0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCXJlc3VsdC5wbHVnaW5Ub0NvbnRyaWJ1dGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dHAuZ2V0RXh0ZW5zaW9ucygpOwotCQkvLyBOZWVkIHRvIGJlIGluIHBsdWdpbiBvcmRlciBzbyB0aGF0IGZpcnN0IG9uZXMgcHJvY2Vzc2VkIGhhdmUgbm8gZGVwZW5kZW5jaWVzIG9uIG90aGVycy4KLQkJSGFzaE1hcCBidW5kbGVzVG9FeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoZXh0ZW5zaW9ucy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZXh0ZW5zaW9uc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ID0gKElFeHRlbnNpb25bXSkgYnVuZGxlc1RvRXh0ZW5zaW9ucy5nZXQoYnVuZGxlKTsKLQkJCWlmIChleHQgPT0gbnVsbCkKLQkJCQlidW5kbGVzVG9FeHRlbnNpb25zLnB1dChidW5kbGUsIG5ldyBJRXh0ZW5zaW9uW10ge2V4dGVuc2lvbnNbaV19KTsKLQkJCWVsc2UgewotCQkJCS8vIE1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uIGRlZmluZWQgaW4gdGhpcyBwbHVnaW4uCi0JCQkJSUV4dGVuc2lvbltdIG5ld0V4dCA9IG5ldyBJRXh0ZW5zaW9uW2V4dC5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4dCwgMCwgbmV3RXh0LCAwLCBleHQubGVuZ3RoKTsKLQkJCQluZXdFeHRbbmV3RXh0Lmxlbmd0aC0xXSA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJYnVuZGxlc1RvRXh0ZW5zaW9ucy5wdXQoYnVuZGxlLCBuZXdFeHQpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBOb3cgb3JkZXIgdGhlbSBzbyB3ZSBwcm9jZXNzIGluIHJlcXVpcmVkIG9yZGVyLgotCQkvLyBJZiBpdCBpcyB0aGUgZmlyc3QgdGltZSwgd2UgYXJlIGFib3V0IHRvIGZpbmQgb3V0IG1hbnkgaW50ZXItZGVwZW5kZW5jaWVzCi0JCS8vIG5vdGlmeSB0aGUgY2FjaGUgb24gYSBzdGFydC9lbmQgb2YgYSB0cmFuc2FjdGlvbiBzbyB0aGF0IHVwZGF0ZXMgKGlmIG5ldwotCQkvLyBkZXBlbmRlbmNpZXMpIGFyZSB1cGRhdGVkIG9ubHkgb25jZQotCQlCdW5kbGVbXSBvcmRlcmVkID0gUHJveHlQbHVnaW4ub3JkZXJQbHVnaW5zKGJ1bmRsZXNUb0V4dGVuc2lvbnMua2V5U2V0KCkpOwotCQlyZXN1bHQuY29udGFpbmVyVG9Db250cmlidXRpb25zID0gbmV3IEhhc2hNYXAob3JkZXJlZC5sZW5ndGgpOwotCQlyZXN1bHQucGx1Z2luVG9Db250cmlidXRpb25zID0gbmV3IEhhc2hNYXAob3JkZXJlZC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyZWQubGVuZ3RoOyBpKyspIHsKLQkJCUlFeHRlbnNpb25bXSBleHRzID0gKElFeHRlbnNpb25bXSkgYnVuZGxlc1RvRXh0ZW5zaW9ucy5nZXQob3JkZXJlZFtpXSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGV4dHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdzID0gZXh0c1tqXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkvLyBUZWNobmljYWxseSB3ZSBleHBlY3QgdGhlIGNvbmZpZyBlbGVtZW50cyB0byBoYXZlIGEgbmFtZSBvZiAiY29udHJpYnV0b3IiLCBidXQgc2luY2UgdGhhdAotCQkJCS8vIGlzIGFsbCB0aGF0IGNhbiBiZSB0aGVyZSwgd2Ugd2lsbCBpZ25vcmUgaXQuIFRoZSBjb250ZW50IGlzIHdoYXQgaXMgaW1wb3J0YW50LgotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY29uZmlncy5sZW5ndGg7IGsrKykgewotCQkJCQlTdHJpbmcgY29udGFpbmVyID0gY29uZmlnc1trXS5nZXRBdHRyaWJ1dGVBc0lzKFBJX0NPTlRBSU5FUik7Ci0JCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJTGlzdCBjb250cmlidXRpb25zID0gKExpc3QpIHJlc3VsdC5jb250YWluZXJUb0NvbnRyaWJ1dGlvbnMuZ2V0KGNvbnRhaW5lcik7Ci0JCQkJCQlpZiAoY29udHJpYnV0aW9ucyA9PSBudWxsKSB7Ci0JCQkJCQkJY29udHJpYnV0aW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJCQkJcmVzdWx0LmNvbnRhaW5lclRvQ29udHJpYnV0aW9ucy5wdXQoY29udGFpbmVyLCBjb250cmlidXRpb25zKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRyaWJ1dGlvbnMuYWRkKGNvbmZpZ3Nba10pOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBwbHVnaW4gPSBjb25maWdzW2tdLmdldEF0dHJpYnV0ZUFzSXMoUElfUExVR0lOKTsKLQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IGNvbnRyaWJ1dGlvbnMgPSAoTGlzdCkgcmVzdWx0LnBsdWdpblRvQ29udHJpYnV0aW9ucy5nZXQocGx1Z2luKTsKLQkJCQkJCWlmIChjb250cmlidXRpb25zID09IG51bGwpIHsKLQkJCQkJCQljb250cmlidXRpb25zID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQkJCQlyZXN1bHQucGx1Z2luVG9Db250cmlidXRpb25zLnB1dChwbHVnaW4sIGNvbnRyaWJ1dGlvbnMpOwotCQkJCQkJfQotCQkJCQkJY29udHJpYnV0aW9ucy5hZGQoY29uZmlnc1trXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IAotCQl9Ci0JCQotCQkvLyBOb3cgZ28gdGhyb3VnaCBhbmQgdHVybiBhbGwgb2YgdGhlIGNvbnRyaWJ1dGlvbiBsaXN0cyBpbnRvIGFycmF5cy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0LmNvbnRhaW5lclRvQ29udHJpYnV0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQllbnRyeS5zZXRWYWx1ZSgoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnRvQXJyYXkobmV3IElDb25maWd1cmF0aW9uRWxlbWVudFsoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpLnNpemUoKV0pKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHQucGx1Z2luVG9Db250cmlidXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWVudHJ5LnNldFZhbHVlKCgoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WygoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKSkuc2l6ZSgpXSkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogRm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QsIHJldHVybiB0aGUgbWFwcyBvZiBjb250YWluZXIgcGF0aHMgYW5kIHBsdWdpbnMgZm91bmQuIFRoZSBrZXlzIHdpbGwgYmUgb2YgdHlwZSBhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJtcwotCSAqIHdoaWxlIHRoZSB2YWx1ZSB3aWxsIGJlIEJvb2xlYW4sIHRydWUgaWYgaXQgd2FzIHZpc2libGUsIGFuZCBmYWxzZSBpZiBpdCB3YXNuJ3QuCi0JICogRm9yIGV4YW1wbGUgaWYgPGNvZGU+L1NXVF9DT05UQUlORVIvc3VicGF0aDE8L2NvZGU+IGlzIGZvdW5kIGluIHRoZSBwcm9qZWN0cyBwYXRoIChvciBmcm9tIHJlcXVpcmVkIHByb2plY3RzKSwgdGhlbgotCSAqIHRoZSBjb250YWluZXIgaWQgd2lsbCBiZSBhZGRlZCB0byB0aGUgbWFwLiBUaGV5IGNvbWUgZnJvbSB0aGUgcmF3IGNsYXNzcGF0aCBlbnRyaWVzIG9mIHRoZSBwcm9qZWN0cy4KLQkgKgotCSAqIEBwYXJhbSBqcHJvamVjdAotCSAqIEBwYXJhbSBjb250YWluZXJJZHMgVGhpcyBtYXAgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBjb250YWluZXIgaWRzIGFzIGtleXMgKHR5cGUgaXMgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4pIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBwcm9qZWN0cyBidWlsZCBwYXRoLiBUaGUgdmFsdWUgd2lsbCBiZSBhIEJvb2xlYW4sIHRydWUgaWYgdGhpcyBjb250YWluZXIgaWQgd2FzIHZpc2libGUgdG8gdGhlIHByb2plY3QgKGkuZS4gd2FzIGluIHRoZSBwcm9qZWN0IG9yIHdhcyBleHBvcnRlZCBmcm9tIGEgcmVxdWlyZWQgcHJvamVjdCkuCi0JICogQHBhcmFtIGNvbnRhaW5lcnMgVGhpcyBtYXAgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBjbGFzc3BhdGggY29udGFpbmVycyBhcyBrZXlzIGZvdW5kIGluIHRoZSBwcm9qZWN0cyBidWlsZCBwYXRoLiBUaGUgdmFsdWUgd2lsbCBiZSBhIEJvb2xlYW4gYXMgaW4gY29udGFpbmVyIGlkcyBtYXAuCi0JICogQHBhcmFtIHBsdWdpbklkcyBUaGlzIG1hcCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHBsdWdpbiBpZHMgYXMga2V5cyAodHlwZSBpcyA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPikgdGhhdCBhcmUgZm91bmQgaW4gdGhlIHByb2plY3RzIGJ1aWxkIHBhdGguIFRoZSB2YWx1ZSB3aWxsIGJlIGEgQm9vbGVhbiBhcyBpbiBjb250YWluZXIgaWRzIG1hcC4KLQkgKiBAcGFyYW0gcHJvamVjdHMgVGhpcyBtYXAgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBwcm9qZWN0IHBhdGhzIChleGNlcHQgdGhlIHRvcCBwcm9qZWN0KSBhcyBrZXlzICh0eXBlIGlzIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDwvY29kZT4pIHRoYXQgYXJlIGZvdW5kIGluIHRoZSBwcm9qZWN0cyBidWlsZCBwYXRoLiBUaGUgdmFsdWUgd2lsbCBiZSBhIEJvb2xlYW4gYXMgaW4gY29udGFpbmVyIGlkcyBtYXAuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZ2V0SURzRm91bmQoSUphdmFQcm9qZWN0IGpwcm9qZWN0LCBNYXAgY29udGFpbmVySWRzLCBNYXAgY29udGFpbmVycywgTWFwIHBsdWdpbklkcywgTWFwIHByb2plY3RzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCQotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGpwcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOwotCQlwcm9qZWN0cy5wdXQocHJvamVjdFBhdGgsIEJvb2xlYW4uVFJVRSk7CQkKLQkJZXhwYW5kUHJvamVjdChwcm9qZWN0UGF0aCwgY29udGFpbmVySWRzLCBjb250YWluZXJzLCBwbHVnaW5JZHMsIHByb2plY3RzLCB0cnVlLCB0cnVlKTsKLQkJcHJvamVjdHMucmVtb3ZlKHByb2plY3RQYXRoKTsJLy8gRG9uJ3QgbmVlZCB0byBpbmNsdWRlIGl0c2VsZiBub3csIHdhcyBuZWVkZWQgZm9yIHRlc3Rpbmcgc28gaWYgY2lydWNsYXIgd2UgZG9uJ3QgZ2V0IGludG8gYSBsb29wLgotCX0KLQkKLQkvKgotCSAqIFRoZSBwYXNzZWQgaW4gdmlzaWJsZSBmbGFnIHRlbGxzIGlmIHRoaXMgcHJvamVjdCBpcyB2aXNpYmxlIGFuZCBpdHMgY29udGVudHMgYXJlIHZpc2libGUgaWYgdGhleSBhcmUgZXhwb3J0ZWQuCi0JICogT25seSBleGNlcHRpb24gaXMgaWYgZmlyc3QgaXMgdHJ1ZSwgdGhlbiBhbGwgY29udGVudHMgYXJlIHZpc2libGUgdG8gdGhlIHRvcCBsZXZlbCBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBleHBhbmRQcm9qZWN0KElQYXRoIHByb2plY3RQYXRoLCBNYXAgY29udGFpbmVySWRzLCBNYXAgY29udGFpbmVycywgTWFwIHBsdWdpbklkcywgTWFwIHByb2plY3RzLCBib29sZWFuIHZpc2libGUsIGJvb2xlYW4gZmlyc3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHByb2plY3RQYXRoLmxhc3RTZWdtZW50KCkpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQlyZXR1cm47CS8vIE5vdCBleGlzdCBzbyBkb24ndCBkZWx2ZSBpbnRvIGl0LgotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IChJSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKHJlcyk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuZXhpc3RzKCkgfHwgIXByb2plY3QuZ2V0UHJvamVjdCgpLmlzT3BlbigpKQotCQkJcmV0dXJuOwkvLyBOb3QgZXhpc3QgYXMgYSBqYXZhIHByb2plY3Qgb3Igbm90IG9wZW4sIHNvIGRvbid0IGRlbHZlIGludG8gaXQuCi0KLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCUJvb2xlYW4gY3VycmVudEZsYWcgPSBudWxsOwkvLyBDdXJyZW50IHNldHRpbmcgdmFsdWUuCi0JCQlib29sZWFuIG5ld0ZsYWc7CS8vIFRoZSBuZXcgc2V0dGluZyB2YWx1ZS4gCi0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6Ci0JCQkJCS8vIEZvcmNlIHRydWUgaWYgYWxyZWFkeSB0cnVlLCBvciB0aGlzIGlzIHRoZSBmaXJzdCBwcm9qZWN0LCBvciB0aGlzIHByb2plY3QgaXMgdmlzaWJsZSBhbmQgdGhlIGVudHJ5IGlzIGV4cG9ydGVkLiBUaGVzZSBvdmVycmlkZSBhIHByZXZpb3VzIGZhbHNlLgotCQkJCQljdXJyZW50RmxhZyA9IChCb29sZWFuKSBwcm9qZWN0cy5nZXQoZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQkJbmV3RmxhZyA9IChjdXJyZW50RmxhZyAhPSBudWxsICYmIGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpKSB8fCBmaXJzdCB8fCAodmlzaWJsZSAmJiBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQlpZiAoY3VycmVudEZsYWcgPT0gbnVsbCB8fCBjdXJyZW50RmxhZy5ib29sZWFuVmFsdWUoKSAhPSBuZXdGbGFnKQotCQkJCQkJcHJvamVjdHMucHV0KGVudHJ5LmdldFBhdGgoKSwgIG5ld0ZsYWcgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFICk7Ci0JCQkJCWlmIChjdXJyZW50RmxhZyA9PSBudWxsKQotCQkJCQkJZXhwYW5kUHJvamVjdChlbnRyeS5nZXRQYXRoKCksIGNvbnRhaW5lcklkcywgY29udGFpbmVycywgcGx1Z2luSWRzLCBwcm9qZWN0cywgdmlzaWJsZSAmJiBlbnRyeS5pc0V4cG9ydGVkKCksIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKLQkJCQkJaWYgKCFmaXJzdCAmJiAib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi5lcXVhbHMoZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsJLy8gVGhlIGZpcnN0IHByb2plY3QgZGV0ZXJtaW5lcyB0aGUgSlJFLCBzbyBhbnkgc3Vic2VxdWVudCBvbmVzIGNhbiBiZSBpZ25vcmVkLgotCQkJCQljdXJyZW50RmxhZyA9IChCb29sZWFuKSBjb250YWluZXJJZHMuZ2V0KGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKTsKLQkJCQkJbmV3RmxhZyA9IChjdXJyZW50RmxhZyAhPSBudWxsICYmIGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpKSB8fCBmaXJzdCB8fCAodmlzaWJsZSAmJiBlbnRyeS5pc0V4cG9ydGVkKCkpOwkJCQkJCi0JCQkJCWlmIChjdXJyZW50RmxhZyA9PSBudWxsIHx8IGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpICE9IG5ld0ZsYWcpCQkJCQkKLQkJCQkJCWNvbnRhaW5lcklkcy5wdXQoZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCksIG5ld0ZsYWcgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFICk7CQkJCQkKLQotCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeS5nZXRQYXRoKCksIHByb2plY3QpOwotCQkJCQkvLyBGb3JjZSB0cnVlIGlmIGFscmVhZHkgdHJ1ZSwgb3IgdGhpcyBpcyB0aGUgZmlyc3QgcHJvamVjdCwgb3IgdGhpcyBwcm9qZWN0IGlzIHZpc2libGUgYW5kIHRoZSBlbnRyeSBpcyBleHBvcnRlZC4gVGhlc2Ugb3ZlcnJpZGUgYSBwcmV2aW91cyBmYWxzZS4KLQkJCQkJY3VycmVudEZsYWcgPSAoQm9vbGVhbikgY29udGFpbmVycy5nZXQoY29udGFpbmVyKTsKLQkJCQkJbmV3RmxhZyA9IChjdXJyZW50RmxhZyAhPSBudWxsICYmIGN1cnJlbnRGbGFnLmJvb2xlYW5WYWx1ZSgpKSB8fCBmaXJzdCB8fCAodmlzaWJsZSAmJiBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQlpZiAoY3VycmVudEZsYWcgPT0gbnVsbCB8fCBjdXJyZW50RmxhZy5ib29sZWFuVmFsdWUoKSAhPSBuZXdGbGFnKQkJCQkJCi0JCQkJCQljb250YWluZXJzLnB1dChjb250YWluZXIsICBuZXdGbGFnID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6Ci0JCQkJCS8vIFdlIG9ubHkgY2FyZSBhYm91dCBKUkVfTElCLiBJZiB3ZSBoYXZlIHRoYXQsIHRoZW4gd2Ugd2lsbCB0cmVhdCBpdCBhcyBKUkVfQ09OVEFJTkVSLiBPbmx5Ci0JCQkJCS8vIGNhcmUgYWJvdXQgZmlyc3QgcHJvamVjdCB0b28sIGJlY2F1c2UgdGhlIGZpcnN0IHByb2plY3QgaXMgdGhlIG9uZSB0aGF0IGRldGVybWluZXMgdGhlIEpSRSB0eXBlLgotCQkJCQlpZiAoZmlyc3QgJiYgIkpSRV9MSUIiLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJY3VycmVudEZsYWcgPSAoQm9vbGVhbikgY29udGFpbmVySWRzLmdldCgib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIik7CS8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChjdXJyZW50RmxhZyA9PSBudWxsIHx8ICFjdXJyZW50RmxhZy5ib29sZWFuVmFsdWUoKSkJCQkJCQkKLQkJCQkJCQljb250YWluZXJJZHMucHV0KCJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0JCQotCQkKLQkJZmluZFBsdWdpbnMocGx1Z2luSWRzLCB2aXNpYmxlLCBmaXJzdCwgcHJvamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIEZpbmQgdGhlIHBsdWdpbnMgdGhhdCB0aGUgZ2l2ZW4gcHJvamVjdCByZWZlcmVuY2VzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KLQkgKiA8cD4KLQkgKiBUaGUgbWFwIHdpbGwgYmUgb2YgcGx1Z2luIGlkcyB0byBhIEJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPkJvb2xlYW5UUlVFPC9jb2RlPiwKLQkgKiB0aGVuIHRoZSBwbHVnaW4gaXMgdmlzaWJsZSB0byB0aGUgZ2l2ZW4gcHJvamVjdC4gdGhlIHZpc2libGUgYW5kIGZpcnN0IGZsYWdzCi0JICogd2lsbCBtb2RpZnkgdGhpcy4gSWYgZmlyc3QgaXMgdHJ1ZSwgdGhlbiBhbGwgZGlyZWN0IHBsdWdpbnMgd2lsbCBiZSB2aXNpYmxlLAotCSAqIGVsc2Ugb25seSBleHBvcnRlZCBwbHVnaW5zIHdpbGwgYmUgdmlzaWJsZS4gSWYgdmlzaWJsZSBpcyBmYWxzZSBhbmQgZmlyc3QgaXMgZmFsc2UsIHRoZW4gaXQgZG9lc24ndCBtYXR0ZXIsIGFsbCBvZiB0aGUKLQkgKiBwbHVnaW5zIHdpbGwgbm90IGJlIHZpc2libGUuIAotCSAqIDxwPgotCSAqIFZpc2libGUgbWVhbnMgdGhhdCBjbGFzc2VzIGluIHRoZSBwbHVnaW4gY2FuIGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgZnJvbSBjb2RlLiBOb3QgdmlzaWJsZQotCSAqIG1lYW5zIHRoYXQgdGhleSBjYW4gb25seSBiZSByZWZlcmVuY2VkIGZyb20gc29tZSBvdGhlciBwbHVnaW4gaW4gdGhlIGxpc3QuIEluIG90aGVyIHdvcmRzLAotCSAqIHZpc2libGUgb25lcyBjYW4gYmUgZGlyZWN0bHkgcmVmZXJlbmNlZCwgYnV0IGludmlzaWJsZSBvbmVzIGNhbiBvbmx5IGJlIHJlZmVyZW5jZWQgZnJvbQotCSAqIHBsdWdpbnMgdGhhdCBjYW4gc2VlIGl0LgotCSAqIDxwPgotCSAqIEZvciBtb3N0IHVzZXMsIGZpcnN0IGFuZCB2aXNpYmxlIHNob3VsZCBiZSB0cnVlLiBUaGVuIGl0IHdpbGwgdHJlYXQgdGhlIHByb2plY3QgYXMgdGhlIHRvcGxldmVsCi0JICogcHJvamVjdCBhbmQgd2lsbCByZXR1cm4gdHJ1ZSBmb3IgdGhvc2UgdGhhdCBhcmUgdmlzaWJsZSB0byBpdCwgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi0JICogVGhlc2UgZmxhZ3Mgd2VyZSBhZGRlZCBmb3IgbW9yZSBzcGVjaWFsIGNhc2VzIHdoZXJlIG1heSBiZSBjYWxsaW5nIG9uIGEgcHJvamVjdCB0aGF0IGlzIGRlZXBlcgotCSAqIGRvd24gaW4gdGhlIGNsYXNzcGF0aCB3ZXJlIHZpc2liaWx0eSBoYXMgYWxyZWFkeSBiZWVuIGRlY2lkZWQuCi0JICogPHA+Ci0JICogTm90ZTogUERFIG11c3QgYmUgaW5zdGFsbGVkIGZvciB0aGlzIHRvIHJldHVybiBhbnl0aGluZywgb3RoZXJ3aXNlIGl0IHdpbGwgbGVhdmUKLQkgKiB0aGUgbWFwIGFsb25lLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW5JZHMgbWFwIG9mIHBsdWdpbklkcy0+Qm9vbGVhbihUUlVFIGlzIHZpc2libGUpCi0JICogQHBhcmFtIHZpc2libGUgPGNvZGU+dHJ1ZTwvY29kZT4gbWVhbnMgdGhpcyBwcm9qZWN0IGlzIHZpc2libGUsIHNvIGFueSBwbHVnaW5zIHZpc2libGUgdG8gaXQgd2lsbCBiZSB2aXNpYmxlLCBlbHNlIG5vbmUgd2lsbCBiZSB2aXNpYmxlLgotCSAqIEBwYXJhbSBmaXJzdCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIHRoZSB0b3AgcHJvamVjdCBvZiBpbnRlcmVzdC4gVGhpcyBtZWFucyB0aGF0IGFsbCBwbHVnaW5zIHdpdGhpbiB0aGUgcHJvamVjdCBhcmUgdmlzaWJsZS4gRWxzZSBvbmx5IGV4cG9ydGVkIHByb2plY3RzIHdpbGwgYmUgdmlzaWJsZS4KLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHRvIHN0YXJ0IGxvb2tpbmcgZnJvbQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmRQbHVnaW5zKE1hcCBwbHVnaW5JZHMsIGJvb2xlYW4gdmlzaWJsZSwgYm9vbGVhbiBmaXJzdCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCS8vIFRvIHByZXZlbnQgdW5uZWNlc3NhcnkgbG9hZGluZyBvZiB0aGUgUERFIHBsdWdpbiwgZmluZCB0aGUgcGx1Z2lucyBvbmx5IGlmIHRoaXMgcHJvamVjdCBpcyBhIFBERSBwbHVnaW4gcHJvamVjdC4KLQkJCWlmIChpc1BERVByb2plY3QocHJvamVjdCkpIHsKLQkJCQlJUERFUHJvY2Vzc0ZvclBsdWdpbiBwZGVwcm9jZXNzID0gZ2V0UERFUHJvY2Vzc0ZvclBsdWdpbigpOwotCQkJCWlmIChwZGVwcm9jZXNzICE9IG51bGwpCi0JCQkJCXBkZXByb2Nlc3MuZmluZFBsdWdpbnMocHJvamVjdCwgcGx1Z2luSWRzLCB2aXNpYmxlLCBmaXJzdCk7IC8vIGV4cGFuZCB0aGUgcGx1Z2lucyBmb3IgdGhpcyBwcm9qZWN0LCBpZiBhbnkuCi0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIFBsdWdpbiBwcm9qZWN0IG9yIGZhbHNlIGlmIG5vdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BERVByb2plY3QoSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByb2plY3QuZ2V0UHJvamVjdCgpLmhhc05hdHVyZShQREVfTkFUVVJFX0lEKTsKLQl9Ci0KLQotCS8qCi0JICogSW50ZXJmYWNlIGZvciBwcm9jZXNzaW5nIFBsdWdpbnMuIFVzZWQgd2hlbiBQREUgcGx1Z2luIGlzIHByZXNlbnQgaW4gdGhlIGluc3RhbGxhdGlvbi4gCi0JICogCi0JICogQHNpbmNlIDEuMC4yCi0JICovCi0JaW50ZXJmYWNlIElQREVQcm9jZXNzRm9yUGx1Z2luIHsKLQotCQkvKgotCQkgKiBHbyB0aHJvdWdoIHRoZSBwcm9qZWN0IGFuZCBmaW5kIGFsbCBvZiB0aGUgcGx1Z2lucyBpdCByZWZlcmVuY2VzLCBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaAotCQkgKiB0aGUgcmVmZXJlbmNlZCBwbHVnaW5zLCBhbmQgbWFyayB0aGVtIGFzIHZpc2libGUgb3Igbm90LgotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgZmluZFBsdWdpbnMoSUphdmFQcm9qZWN0IHByb2plY3QsIE1hcCBwbHVnaW5JZHMsIGJvb2xlYW4gdmlzaWJsZSwgYm9vbGVhbiBmaXJzdCk7Ci0JfQotCQotCS8qCi0JICogVHJ5IHRvIGdldCB0aGUgcGRlIHByb2Nlc3MgZm9yIHBsdWdpbi4gSWYgYWxyZWFkeSB0cmllZCBvbmNlIGFuZCBub3QgZm91bmQsIHRoZW4gZm9yZ2V0IGl0LgotCSAqIDxwYWNrYWdlLXByb3RlY3RlZD4gYmVjYXVzZSBQREVDb250cmlidXRlQ2xhc3NwYXRoIG5lZWRzIGl0IHRvby4KLQkgKi8KLQlwcml2YXRlIElQREVQcm9jZXNzRm9yUGx1Z2luIHBkZVByb2Nlc3NGb3JQbHVnaW47Ci0JcHJpdmF0ZSBib29sZWFuIHRyaWVkUERFUHJvY2VzczsKLQlJUERFUHJvY2Vzc0ZvclBsdWdpbiBnZXRQREVQcm9jZXNzRm9yUGx1Z2luKCkgewotCQlpZiAoIXRyaWVkUERFUHJvY2VzcykgewotCQkJdHJpZWRQREVQcm9jZXNzID0gdHJ1ZTsKLQkJCWlmIChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnBkZS5jb3JlIikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJQ2xhc3MgY2xhc3NQREVQcm9jZXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUERFUHJvY2Vzc0ZvclBsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXBkZVByb2Nlc3NGb3JQbHVnaW4gPSAoSVBERVByb2Nlc3NGb3JQbHVnaW4pIGNsYXNzUERFUHJvY2Vzcy5uZXdJbnN0YW5jZSgpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBOb3QgZm91bmQsIGRvIG5vdGhpbmcuCi0JCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJZ2V0TG9nZ2VyKCkubG9nKGUsIExldmVsLldBUk5JTkcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGRlUHJvY2Vzc0ZvclBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyB0cmllcyB0byBmaW5kIGEgamFyIGluIHRoZSBidW5kbGUgc3BlY2lmaWVkLCBhbmQgdGhlIGF0dGFjaGVkIHNvdXJjZSB1c2luZyB0aGUKLQkgKiBQREUgc291cmNlIGxvY2F0aW9uIGV4dGVuc2lvbiBwb2ludC4gVGhlIGphciBtdXN0IGV4aXN0IGZvciBzb3VyY2UgdG8gYmUgYXR0YWNoYWJsZS4KLQkgKiBUaGUgc291cmNlIG11c3QgYmUgaW4gdGhlIHN0YW5kYXJkIFBERSBzb3VyY2UgcGx1Z2luLiBJLmUuIGl0IG11c3QgYmUgaW4gYSBkaXJlY3RvcnkKLQkgKiBvZiB0aGUgbmFtZSAiYnVuZGxlbmFtZV9idW5kbGV2ZXJzaW9uIiwgYW5kIGluIHRoZSBzYW1lIHBhdGggZnJvbSB0aGVyZSBhcyBpbiB0aGUKLQkgKiBqYXIsIHBsdXMgdGhlIG5hbWUgbXVzdCBiZSAiamFybmFtZXNyYy56aXAiLgotCSAqIDxwPgotCSAqIFRoZSByZXR1cm5lZCBVUkwncyB3aWxsIG5vdCBiZSBQbGF0Zm9ybS5yZXNvbHZlKCkuIFRoZXkgd2lsbCBiZSBpbiBmb3JtIHJldHVybmVkIGZyb20KLQkgKiBQbGF0Zm9ybS5maW5kKCkuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZSBidW5kbGUgdG8gc2VhcmNoLCB3aWxsIHNlYXJjaCBmcmFnbWVudHMgdG9vLgotCSAqIEBwYXJhbSBmaWxlcGF0aCBmaWxlcGF0aCBmcm9tIHRoZSByb290IG9mIHRoZSBidW5kbGUvZnJhZ21lbnQgd2hlcmUgdGhlIGphciB3aWxsIGJlIGZvdW5kLiAKLQkgKiBAcmV0dXJuIHR3byBVUkwncy4gWzBdIGlzIHRoZSBVUkwgdG8gdGhlIGphciwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLCBbMl0gaXMgdGhlIFVSTCB0byB0aGUgc291cmNlIHppcCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBVUkxbXSBmaW5kUGx1Z2luSmFyQW5kQXR0YWNoZWRTb3VyY2UoQnVuZGxlIGJ1bmRsZSwgSVBhdGggZmlsZXBhdGgpIHsKLQkJLy8gVGhpcyBpcyBhIGJpdCBrbHVkZ3ksIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIHRvIGZpbmQgdGhlIGZpbGUgZmlyc3QsIGFuZCB0aGVuIGdldCB0aGUgcm9vdCB1cmwgb2YgdGhlIGJ1bmRsZS9mcmFnbWVudAotCQkvLyB0aGF0IG1hdGNoZXMgdGhlIGZvdW5kIGZpbGUuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHVuZGVyIHRoZSBzb3VyY2UuIEZyb20gdGhlcmUKLQkJLy8gYWxsIG9mIHRoZSBzb3VyY2UgZXh0ZW5zaW9ucyB3aWxsIGJlIHNlYXJjaGVkIGZvciB0aGUgc291cmNlIHppcCBmaWxlLgotCQkvLyBUaGlzIGlzIGFzc3VtaW5nIHRoYXQgZmluZCByZXR1cm5zIGEgdXJsIHdoZXJlIHRoZSBmaWxlIHBhcnQgb2YgdGhlIHVybCBpcyBhIHN0YW5kYXJkIHBhdGggYW5kIGRvZXNuJ3QgaGF2ZQotCQkvLyB0aGluZ3MgbGlrZSBzcGVjaWFsIGNoYXJzIHRvIGluZGljYXRlIHdpdGhpbiBhIGphci4gVGhhdCB3b3VsZCBhcHBlYXIgd2hlbiBpdCBpcyByZXNvbHZlZCwgYnV0IEkgdGhpbmsgdGhhdCB0aGUKLQkJLy8gdW5yZXNvbHZlZCBvbmVzIGZyb20gZmluZCBhcmUgdHlwaWNhbGx5ICJqYXJidW5kbGU6Ly9ubm4vcGF0aCIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gVGhpcyBpcyBhIGdyYXkgYXJlYS4KLQkJVVJMIGphclVSTCA9IFBsYXRmb3JtLmZpbmQoYnVuZGxlLCBmaWxlcGF0aCk7Ci0JCWlmIChqYXJVUkwgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVVJMWzJdOwotCQkKLQkJLy8gRm91bmQgaXQsIHNvIGxldCdzIHRyeSB0byBmaW5kIHdoaWNoIGJ1bmRsZS9mcmFnbWVudCBpdCB3YXMgZm91bmQgaW4uCi0JCVN0cmluZyBqYXJTdHJpbmcgPSBqYXJVUkwudG9FeHRlcm5hbEZvcm0oKTsKLQkJLy8gRmlyc3QgdGhlIGJ1bmRsZSBpdHNlbGYuCi0JCVN0cmluZyBpbnN0YWxsTG9jID0gYnVuZGxlLmdldEVudHJ5KCIvIikudG9FeHRlcm5hbEZvcm0oKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgc291cmNlVVJMID0gbnVsbDsKLQkJaWYgKGphclN0cmluZy5zdGFydHNXaXRoKGluc3RhbGxMb2MpKQotCQkJc291cmNlVVJMID0gZ2V0U3JjRnJvbShidW5kbGUsIGluc3RhbGxMb2MsIGphclN0cmluZyk7Ci0JCWVsc2UgewotCQkJLy8gTm93IGxvb2sgaW4gdGhlIGZyYWdtZW50cy4KLQkJCUJ1bmRsZVtdIGZyYWdzID0gUGxhdGZvcm0uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5zdGFsbExvYyA9IGZyYWdzW2ldLmdldEVudHJ5KCIvIikudG9FeHRlcm5hbEZvcm0oKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChqYXJTdHJpbmcuc3RhcnRzV2l0aChpbnN0YWxsTG9jKSkgewotCQkJCQlzb3VyY2VVUkwgPSBnZXRTcmNGcm9tKGZyYWdzW2ldLCBpbnN0YWxsTG9jLCBqYXJTdHJpbmcpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBVUkxbXSB7amFyVVJMLCBzb3VyY2VVUkx9OwotCX0KLQkKLQlwcml2YXRlIFVSTCBnZXRTcmNGcm9tKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpbnN0YWxsTG9jLCBTdHJpbmcgamFyU3RyaW5nKSB7Ci0JCS8vIGZvcm1hdCBvZiBwYXRoIGluIGEgUERFIHNvdXJjZSBwbHVnaW4gaXMgKHVuZGVyIHRoZSAic3JjIiBkaXJlY3RvcnkgZnJvbSB0aGUgZXh0ZW5zaW9uIHBvaW50KSwKLQkJLy8gImJ1bmRsZW5hbWVfYnVuZGxldmVyc2lvbi9wYXRoT2ZKYXIvamFybmFtZXNyYy56aXAiLiBIb3dldmVyIHRoZXJlIGlzIG5vIHdheSB0byBrbm93Ci0JCS8vIHdoaWNoIGV4dGVuc2lvbiBoYXMgdGhlIHNvdXJjZSBpbiBpdCwgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhlbSBhbGwuCi0JCQotCQlJUGF0aCBzcmNQYXRoID0gbmV3IFBhdGgoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKyJfIisgKFN0cmluZykgYnVuZGxlLmdldEhlYWRlcnMoIiIpLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICROT04tTkxTLTIkCi0JCXNyY1BhdGggPSBzcmNQYXRoLmFwcGVuZChuZXcgUGF0aChqYXJTdHJpbmcuc3Vic3RyaW5nKGluc3RhbGxMb2MubGVuZ3RoKCkpKSk7Ci0JCWlmIChzcmNQYXRoLnNlZ21lbnRDb3VudCgpIDwgMikKLQkJCXJldHVybiBudWxsOwkvLyBTb21ldGhpbmcgaXMgbm90IHJpZ2h0LiBObyBqYXIgbmFtZS4KLQkJc3JjUGF0aCA9IHNyY1BhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwkvLyBSZW1vdmUgdGhlIC5qYXIuCi0JCVN0cmluZyBqYXJOYW1lID0gc3JjUGF0aC5sYXN0U2VnbWVudCgpOwkvLyBUaGlzIHNob3VsZCBiZSB0aGUgamFyIG5hbWUuCi0JCXNyY1BhdGggPSBzcmNQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoamFyTmFtZSsic3JjLnppcCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBOb3cgbG9vayB0aHJvdWdoIGFsbCBvZiB0aGUgc3JjIGV4dGVuc2lvbnMuIENhbid0IHRlbGwgaWYgdGhlIGV4dGVuc2lvbiBpcyBmcm9tIGEgZnJhZ21lbnQgb3IgYSBidW5kbGUsIHNvIHdlIG5lZWQgdG8KLQkJLy8gdXNlIFBsYXRmb3JtLmZpbmQoKSB0byBsb29rIGluIHRoZSBidW5kbGUgYW5kIGZyYWdtZW50LiBTbyB3ZSBtYXkgZ2V0IGEgZHVwIHNlYXJjaCBpZiB0aGVyZSBpcyBhIGZyYWdtZW50IHNvdXJjZSAKLQkJLy8gKGZvciBleGFtcGxlIHBsYXRmb3JtIHNvdXJjZSBhbmQgd2luMzIgcGxhdGZvcm0gc291cmNlICh3aGljaCBpcyBhIGZyYWdtZW50IG9mIHBsYXRmb3JtIHNvdXJjZSkuCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNlcyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5wZGUuY29yZS5zb3VyY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNlcy5sZW5ndGg7IGkrKykgewotCQkJSVBhdGggc3Jjc3JjaCA9IG5ldyBQYXRoKGNlc1tpXS5nZXRBdHRyaWJ1dGVBc0lzKCJwYXRoIikpLmFwcGVuZChzcmNQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJQnVuZGxlIHNyY0J1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShjZXNbaV0uZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkJVVJMIHNyY1VybCA9IFBsYXRmb3JtLmZpbmQoc3JjQnVuZGxlLCBzcmNzcmNoKTsKLQkJCWlmIChzcmNVcmwgIT0gbnVsbCkgewotCQkJCXJldHVybiBzcmNVcmw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvVGhyb3dhYmxlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1Rocm93YWJsZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOWM1Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvVGhyb3dhYmxlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmU7Ci0vKgotICogICRSQ1NmaWxlOiBUaHJvd2FibGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA1ICQgCi0gKi8KLQotCi0vKioKLSAqIFRoaXMgaXMgYSBwcm94eSB3cmFwcGVyIGZvciBhbiBleGNlcHRpb24gYmVpbmcgdGhyb3duIG9uIHRoZQotICogcmVtb3ZlIFZNLiBUaGUgc3RhbmRhcmQgZXhjZXB0aW9uIG1ldGhvZHMgcmVmZXIgdG8gdGhpcyBwcm94eS4KLSAqIFRvIHJlZmVyIHRvIHRoZSBwcm94aWVkIGV4Y2VwdGlvbiBpdHNlbGYsIHRoZSBtZXRob2RzIGRlZmluZWQKLSAqIGluIGhlcmUgd291bGQgYmUgdXNlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRocm93YWJsZVByb3h5IGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiBpbXBsZW1lbnRzIElCZWFuUHJveHkgewotICAgLyoqCi0gICAgKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gd2l0aCBubyBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuIAotICAgICovCi0gICBwdWJsaWMgVGhyb3dhYmxlUHJveHkoKSB7Ci0JCXN1cGVyKCk7Ci0gICB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBUaHJvd2FibGVQcm94eShTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZVByb3h5KFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JfQotICAgLyoqCi0gICAgKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLiAKLSAgICAqCi0gICAgKiBAcGFyYW0gICBzICAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgICovCi0gICBwdWJsaWMgVGhyb3dhYmxlUHJveHkoU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0gICB9Ci0JCi0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKTsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3h5TWVzc2FnZSgpOwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgd3JpdGVyKTsKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHN0cmVhbSk7Ci0JcHVibGljIGFic3RyYWN0IHZvaWQgcHJpbnRQcm94eVN0YWNrVHJhY2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIlByb3h5OiAiICsgdG9CZWFuU3RyaW5nKCk7CS8vJE5PTi1OTFMxJCAtIHRvU3RyaW5nJ3MgYXJlbid0IG5scydlZC4gLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1VJUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9VSVJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGU1MDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL1VJUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVUlSdW5uZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotIAotCi0vKioKLSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgSVVJUnVubmVyIHRvIHJ1biB0aGUgYnVpbGQgdW5kZXIKLSAqIElQcm9ncmVzc1NlcnZpY2UgY29udHJvbCBpZiBpbiB0aGUgVUkgdGhyZWFkLgotICogCi0gKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IGJlY2F1c2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoaW4gaGVyZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLWNsYXNzIFVJUnVubmVyIGltcGxlbWVudHMgSVVJUnVubmVyIHsKLQkKLQkvKgotCSAqIFNwZWNpYWwgY2xhc3MgdGhhdCB0YWtlcyBhIHByb2dyZXNzIG1vbml0b3IgMSBhbmQgb25seSBoYW5kbGVzIGlzQ2FuY2VsZWQgZnJvbSBpdCwKLQkgKiBidXQgZXZlcnl0aGluZyBlbHNlIGlzIGZvcndhcmRlZCB0byBwcm9ncmVzcyBtb25pdG9yIDIuIFRoaXMgYWxsb3dzIHRoZSBwbSB0aGF0Ci0JICogaXMgc2VudCBpbnRvIGhhbmRsZUJ1aWxkIHRvIHNpZ25hbCBhIGNhbmNlbCBldmVuIHRob3VnaCB0aGUgcHJvZ3Jlc3Mgc2VydmljZQotCSAqIHNlbmRzIGluIGl0cyBvd24gcG0uIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFVJUnVubmVyUHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgUHJvZ3Jlc3NNb25pdG9yV3JhcHBlciB7Ci0JCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwbWNhbmNlbDsKLQkJCi0JCXB1YmxpYyBVSVJ1bm5lclByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHBtY2FuY2VsLCBJUHJvZ3Jlc3NNb25pdG9yIHBtbWFpbikgewotCQkJc3VwZXIocG1tYWluKTsKLQkJCXRoaXMucG1jYW5jZWwgPSBwbWNhbmNlbDsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCQlyZXR1cm4gcG1jYW5jZWwuaXNDYW5jZWxlZCgpIHx8IHN1cGVyLmlzQ2FuY2VsZWQoKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3NldENhbmNlbGVkKGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7Ci0JCQlzdXBlci5zZXRDYW5jZWxlZCh2YWx1ZSk7Ci0JCQlwbWNhbmNlbC5zZXRDYW5jZWxlZCh2YWx1ZSk7CS8vIENhbmNlbCBpdCB0b28gbm93LgotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklVSVJ1bm5lciNoYW5kbGVCdWlsZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVCdWlsZChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKSB8fCBEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQlQcm94eUxhdW5jaFN1cHBvcnQucnVuQnVpbGQocG0pOwotCQl9IGVsc2UgewotCQkJcG0uYmVnaW5UYXNrKCIiLCAxMDApOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuYnVzeUN1cnNvcldoaWxlKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCUlQcm9ncmVzc01vbml0b3IgdWlwbSA9IG5ldyBVSVJ1bm5lclByb2dyZXNzTW9uaXRvcihwbSwgbW9uaXRvcik7IAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlQcm94eUxhdW5jaFN1cHBvcnQucnVuQnVpbGQodWlwbSk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh1aXBtLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCXBtLnNldENhbmNlbGVkKHRydWUpOwkvLyBNYWtlIHN1cmUgdGhhdCBjYW5jZWwgZ290IHRocm91Z2ggKGNvdWxkIG9mIGNvbWUgZnJvbSBtb25pdG9yIGluc3RlYWQpLgotCQkJCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCQkJdGhyb3cgKENvcmVFeGNlcHRpb24pIGUuZ2V0Q2F1c2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRDYXVzZSgpLCBMZXZlbC5XQVJOSU5HKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJdCB3YXMgY2FuY2VsZWQsIGxhdW5jaCB3aWxsIGJlIGNhbmNlbGVkIHRvby4gcG0gaXMgYWxyZWFkeSBtYXJrZWQgY2FuY2VsZWQgYW5kIGNhbGxlciBjYW4gY2hlY2sgdGhhdAotCQkJfQotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTA4YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvcmUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDUgJAotIwotCi0KLQotIwotIyBFeGNlcHRpb24gTWVzc2FnZXMuIEFsbCBvZiB0aGVzZSBtZXNzYWdlcyBhcmUgdGhlIHRleHQgb2YgYW4gamF2YSBleGNlcHRpb24uCi0jCi1VbmV4cGVjdGVkRXhjZXB0aW9uX0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDY0RSBVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24uCi0KLSMgezB9IGFuZCB7MX0gYXJlIGphdmEgY2xhc3NlcyAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotQ2xhc3NDYXN0X0VYQ19fSW5jb3JyZWN0VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA2NUUgInswfSIgaXMgbmVpdGhlciBhIHN1YmNsYXNzIG9mLCBub3IgZG9lcyBpdCBpbXBsZW1lbnQsIGNsYXNzICJ7MX0iLgotCi0jIFN0YW5kYXJkIEJlYW4gUHJveHkgRmFjdG9yeSBhbmQgU3RhbmRhcmQgQmVhbiBUeXBlIFByb3h5IEZhY3RvcnkgYXJlIHRlcm1zIGluIGJlYW5pbmZvLiBUaGV5IGFyZSB0aGUKLSMgc3RhbmRhcmQgKGkuZS4gYmFzZSkgZmFjdG9yaWVzIGZvciBiZWFucyBvciBiZWFuIHR5cGVzLiBCZWFuIHR5cGVzIGFyZSBqYXZhIGNsYXNzZXMuCi1Qcm94eUZhY3RvcnlfRVhDX19Ob0JlYW5Qcm94eUZhY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDY2RSBObyBTdGFuZGFyZCBCZWFuIFByb3h5IEZhY3RvcnkgaGFzIGJlZW4gc2V0LgotUHJveHlGYWN0b3J5X0VYQ19fTm9CZWFuVHlwZVByb3h5RmFjdG9yeSAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA2N0UgTm8gU3RhbmRhcmQgQmVhbiBUeXBlIFByb3h5IEZhY3RvcnkgaGFzIGJlZW4gc2V0LgotCi0KLSMgezB9IGlzIHRoZSB0aXRsZSBvZiBhIHByb2plY3QuCi1Ob3RfSmF2YV9Qcm9qZWN0X1dBUk5fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDY4VyBQcm9qZWN0ICJ7MH0iIGlzIG5vdCBhIGphdmEgcHJvamVjdC4KLU5vX1ZNX1dBUk5fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAwNjlXIFByb2plY3QgInswfSIgaGFzIG5vIEphdmEgSlJFIGRlZmluZWQgdG8gdXNlIHRvIHJ1biBwcm9ncmFtcyB3aXRoaW4gdGhpcyBwcm9qZWN0LgotTm9fSW1wbGVtZW50YXRpb25fV0FSTl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA3MFcgQ2Fubm90IGZpbmQgYSBwcm94eSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZm9yIHByb2plY3QgInswfS4iCi0KLVByb3h5TGF1bmNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTGF1bmNoaW5nIExvY2FsIFByb3h5IFZNCi1Qcm94eVdhaXRGb3JCdWlsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFdhaXRpbmcgZm9yIGJ1aWxkIHRvIGNvbXBsZXRlCi1FeHByZXNzaW9uX0luSW52YWxpZFN0YXRlRHVlVG9fRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTYyRSBFeHByZXNzaW9uIGlzIGluIGludmFsaWQgc3RhdGUgZHVlIHRvICJ7MH0iCi1FeHByZXNzaW9uX0luSW52YWxpZFN0YXRlX0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTYzRSBFeHByZXNzaW9uIGlzIGluIGludmFsaWQgc3RhdGUKLUV4cHJlc3Npb25fVHlwZVNlbnRJbkludmFsaWRPcmRlcl9FWENfICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNjRFIEV4cHJlc3Npb24gdHlwZSBzZW50IGluIGludmFsaWQgb3JkZXIsIHJlY2VpdmVkOiB7MH0sIGV4cGVjdGVkIHsxfS4KLUV4cHJlc3Npb25fQXJyYXlUeXBlTm90QW5BcnJheV9FWENfICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxNjVFIEFycmF5VHlwZSAiezB9IiBpcyBub3QgYW4gYXJyYXkuCi1FeHByZXNzaW9uX0Nhbm5vdEhhbmRsZU5vUmVjZWl2ZU9uRmllbGRBY2Nlc3NfRVhDXyAgICAgICAgICA9IElXQVYwMTY2RSBBY2Nlc3MgYnkgZmllbGQgbmFtZSAoezB9KSAobm90IGJ5IHByb3h5KSByZXF1aXJlcyBhIHJlY2VpdmVyLgotRXhwcmVzc2lvbl9NZXRob2RzTmVlZFJlY2VpdmVyX0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE2N0UgQWNjZXNzIGJ5IG1ldGhvZCBuYW1lICh7MH0pIChub3QgYnkgcHJveHkpIHJlcXVpcmVzIGEgcmVjZWl2ZXIuCi1FeHByZXNzaW9uX0ludmFsaWRNYXJrTmVzdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTY4RSBJbXByb3BlciBuZXN0aW5nIG9mIG1hcmsgc3RhdGVtZW50cyBpbiBFeHByZXNzaW9uLiBUcmllZCB0byBwb3Agb3IgZW5kTWFyayB0byBiZWZvcmUgY3VycmVudCBtYXJrLiBUcmllZCB0byBnbyBwYXN0IE1hcmsjIHswfS4KLUV4cHJlc3Npb25fSW52YWxpZFByb3h5PUV4cHJlc3Npb24gUHJveHkgaXMgZm9yIGEgZGlmZmVyZW50IGV4cHJlc3Npb24KLVByb3h5UGx1Z2luX0NsZWFudXBEZWZhdWx0UHJveHlMYXVuY2hDb25maWd1cmF0aW9ucyAgICAgICAgID0gQ2xlYW4gdXAgZGVmYXVsdCBwcm94eSBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi1Qcm94eUxhdW5jaFN1cHBvcnRfUmVnaXN0cnlDb3VsZE5vdFN0YXJ0Rm9yU29tZVJlYXNvbl9XQVJOXyA9IElXQVYwMTY4VyBSZWdpc3RyeSBjb3VsZCBub3QgYmUgc3RhcnRlZCBmb3Igc29tZSByZWFzb24uCi1FeHByZXNzaW9uX0NyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbl9JbnZhbGlkRm9yUmVhc3NpZ25tZW50X0VYQ189SW52YWxpZCBleHByZXNzaW9uIHR5cGUgZm9yIHJlYXNzaWdubWVudDogezB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0FtYmlndW91c01ldGhvZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzMmNhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0FtYmlndW91c01ldGhvZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA2LzE2IDE3OjQ2OjE0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLSAKLQotLyoqCi0gKiBBbWJpZ3VvdXMgTWV0aG9kIEV4Y2VwdGlvbi4gSS5FLiBUaGVyZSBpcyBtb3JlIHRoYW4gb25lIHRoYXQgY291bGQgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzA4NDEzNzYxMjM0NDM3MzM4MUw7Ci0JcHVibGljIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbigpIHsKLQl9Ci0JcHVibGljIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vQ29tbWFuZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9Db21tYW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODgzZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9Db21tYW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0vKgotICogICRSQ1NmaWxlOiBDb21tYW5kRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotLyoqCi0gKiBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgY29tbWFuZCBwcm9jZXNzaW5nLgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUxOTIzODU3MTE0NTY4MjUxNEw7Ci0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBmRXhjZXB0aW9uRGF0YTsKLQkKLQlwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbigpIHsKLQkJZkV4Y2VwdGlvbkRhdGEgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbihPYmplY3QgZGF0YSkgewotCQlmRXhjZXB0aW9uRGF0YSA9IGRhdGE7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kRXhjZXB0aW9uKFN0cmluZyBtc2csIE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JCWZFeGNlcHRpb25EYXRhID0gZGF0YTsKLQl9CQotCQotCXB1YmxpYyBPYmplY3QgZ2V0RXhjZXB0aW9uRGF0YSgpIHsKLQkJcmV0dXJuIGZFeGNlcHRpb25EYXRhOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlY292ZXJhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7CS8vIEJ5IGRlZmF1bHQgQ29tbWFuZCBFeGNlcHRpb25zIGFyZSBub3QgcmVjb3ZlcmFibGUuCi0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vR2VuZXJpY0V2ZW50UXVldWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vR2VuZXJpY0V2ZW50UXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4YmFhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0dlbmVyaWNFdmVudFF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZSQKLSAqICAkUmV2aXNpb24kICAkRGF0ZSQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi0vKioKLSAqIEEgZ2VuZXJpYyBldmVudCBxdWV1ZS4gSXQgcnVucyBvbiBpdHMgb3duIHRocmVhZCBhbmQgd2lsbCBleGVjdXRlIGFueSBxdWV1ZWQgdXAgcnVubmFibGVzLgotICogPHA+Ci0gKiBXaGVuIGEgcnVubmFibGUgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCB0aGUgdGhyZWFkIHdpbGwgYmUgbm90aWZpZWQuIElmIHRoZSB0aHJlYWQgaXMgZnJlZSBpdCB3aWxsCi0gKiBydW4gdGhlIHJ1bm5hYmxlLiBJZiBpdCBpcyBub3QgZnJlZSwgdGhlIHJ1bm5hYmxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLiBUaGUgdGhyZWFkIHdpbGwgcHJvY2VzcwotICogYWxsIGludGVydmVuaW5nIHJ1bm5hYmxlcyBhbmQgdGhlbiBleGVjdXRlIHRoZSBydW5uYWJsZSBpbiBzZXF1ZW5jZSB3aXRoIGFsbCBvZiB0aGUgcmVzdC4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VkIHdoZW4geW91IGNhbid0IHVzZSB0aGUgc3lzdGVtIHdpZGdldCAoZS5nLiBBV1QgZXZlbnQgcXVldWUgb3IgU1dUIGFzeW5jRXhlYykgb3Igd2hlbiB0aGUKLSAqIHJ1bm5hYmxlIG11c3QgYmUgZXhlY3V0ZWQgb24gYSBub24tdWkgdGhyZWFkLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gSXQgaXMgcmVxdWlyZWQgdGhhdCB7QGxpbmsgI2Nsb3NlKCl9IGJlIGNhbGxlZCBzbyB0aGF0IHJlc291cmNlcyBhcmUgY2xlYXJlZCB1cC4KLSAqIAotICogQHNpbmNlIDEuMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNFdmVudFF1ZXVlIHsKLQkKLQlwcml2YXRlIExpbmtlZExpc3QgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBFdmVudFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBydW4gPSB0cnVlOwotCQkKLQkJcHVibGljIEV2ZW50VGhyZWFkKFN0cmluZyB0aXRsZSkgewotCQkJc3VwZXIodGl0bGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCXN5bmNocm9uaXplZCAocXVldWUpIHsKLQkJCQlydW4gPSBmYWxzZTsKLQkJCQlxdWV1ZS5jbGVhcigpOwotCQkJCXF1ZXVlLm5vdGlmeUFsbCgpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwb3N0RXZlbnQoUnVubmFibGUgcnVuKSB7Ci0JCQlpZiAoIXRoaXMuaXNBbGl2ZSgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXZlbnQgcXVldWUgdGhyZWFkIGlzIG5vdCBleGVjdXRpbmcuIik7Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKHF1ZXVlKSB7Ci0JCQkJaWYgKHJ1biAhPSBudWxsKQotCQkJCQlxdWV1ZS5hZGRMYXN0KHJ1bik7Ci0JCQkJcXVldWUubm90aWZ5QWxsKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJUnVubmFibGUgcnVubmFibGU7Ci0JCQkJc3luY2hyb25pemVkIChxdWV1ZSkgewotCQkJCQl3aGlsZSAocnVuICYmIHF1ZXVlLmlzRW1wdHkoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlxdWV1ZS53YWl0KCk7Ci0JCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFydW4pCi0JCQkJCQlyZXR1cm47CS8vIERvbmUuCi0JCQkJCWVsc2UgewotCQkJCQkJcnVubmFibGUgPSAoUnVubmFibGUpIHF1ZXVlLnJlbW92ZUZpcnN0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlydW5uYWJsZSA9IG51bGw7CS8vIFNldCB0aGlzIHNvIHRoYXQgd2UgZG9uJ3QgaG9sZCBvbnRvIHJlc291cmNlcyBpbiB0aGUgcnVubmFibGUgd2hpbGUgd2FpdGluZyBmb3IgbmV4dCBxdXkuCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgRXZlbnRUaHJlYWQgZXZlbnRUaHJlYWQ7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSB0aXRsZS4gKFRoaXMgdGl0bGUgd2lsbCBiZSB0aGUgdGl0bGUgb24gdGhlIFRocmVhZCBmb3IgdGhlIHF1ZXVlKS4KLQkgKiBUaGUgdGhyZWFkIHdpbGwgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUgY3VycmVudCB0aHJlYWQuIAotCSAqIEBwYXJhbSBxdWV1ZVRpdGxlCi0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY0V2ZW50UXVldWUoU3RyaW5nIHF1ZXVlVGl0bGUpIHsKLQkJdGhpcyhxdWV1ZVRpdGxlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFByaW9yaXR5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIHRpdGxlLiAoVGhpcyB0aXRsZSB3aWxsIGJlIHRoZSB0aXRsZSBvbiB0aGUgVGhyZWFkIGZvciB0aGUgcXVldWUpLgotCSAqIEFuZCBhIHByaW9yaXR5IGZvciB0aGUgZXZlbnQgcXVldWUncyBwcm9jZXNzaW5nIHRocmVhZC4KLQkgKiBAcGFyYW0gcXVldWVUaXRsZQotCSAqIEBwYXJhbSBwcmlvcml0eSBwcmlvcml0eSB0byB1c2UgZm9yIGV2ZW50IHF1ZXVlJ3MgdGhyZWFkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHVibGljIEdlbmVyaWNFdmVudFF1ZXVlKFN0cmluZyBxdWV1ZVRpdGxlLCBpbnQgcHJpb3JpdHkpIHsKLQkJZXZlbnRUaHJlYWQgPSBuZXcgRXZlbnRUaHJlYWQocXVldWVUaXRsZSk7Ci0JCWV2ZW50VGhyZWFkLnNldFByaW9yaXR5KHByaW9yaXR5KTsKLQkJc3luY2hyb25pemVkKHF1ZXVlKSB7Ci0JCQlldmVudFRocmVhZC5zdGFydCgpOwotCQkJdHJ5IHsKLQkJCQlxdWV1ZS53YWl0KDEwMCk7CS8vIFdhaXQgZm9yIHRocmVhZCB0byBzdGFydC4KLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0JCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgdGhlIGV2ZW50IHF1ZXVlLiBUaGlzIHdpbGwgY2xlYXIgb3V0IGFueSBwZW5kaW5nIGV2ZW50cy4gVGhleSB3aWxsIG5vdAotCSAqIGJlIGV4ZWN1dGVkLiAKLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlldmVudFRocmVhZC5jbG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBQb3N0IHRoZSBldmVudC4KLQkgKiBAcGFyYW0gcnVubmFibGUgcnVubmFibGUgdG8gZXhlY3V0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8ga2ljay1zdGFydCB0aGUgdGhyZWFkIGlmIGZvciBzb21lIHJlYXNvbiBpdCBtYXkgYmUgd2FpdGluZyBhbmQgaXQgc2hvdWxkbid0IGJlLgotCSAqIAotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgZXZlbnQgcXVldWUgdGhyZWFkIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLCBvciBlbmRlZCBmb3Igc29tZSBzZXZlcmUgZXJyb3IuCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0RXZlbnQoUnVubmFibGUgcnVubmFibGUpIHsKLQkJZXZlbnRUaHJlYWQucG9zdEV2ZW50KHJ1bm5hYmxlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY0ZDdlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uOwotLyoKLSAqICAkUkNTZmlsZTogSUNhbGxiYWNrLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGFueSBjYWxsYmFjay4KLSAqIFRoZSBjYWxsYmFjayB3aWxsIHVzZSB0aGUgSVZNQ2FsbGJhY2tTZXJ2ZXIgcGFzc2VkIGluIHRvCi0gKiBnZXQgY2FsbGJhY2sgaGFuZGxlcnMsIGFuZCB0aGUgaWQgcGFzc2VkIGluIGlzCi0gKiB0byBiZSBwYXNzZWQgdG8gdGhlc2UgaGFuZGxlcnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhbGxiYWNrIHsKLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBjYWxsYmFjawotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciB2bVNlcnZlciwgaW50IGNhbGxiYWNrSUQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFja0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjY3ZmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNhbGxiYWNrSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IElDYWxsYmFja0hhbmRsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIGNhbGxiYWNrIGhhbmRsZXIuCi0gKiBVc2VycyB3aWxsIHRhbGsgdG8gdGhpcyBpbnRlcmZhY2UgdG8gcGVyZm9ybSAKLSAqIGNhbGxiYWNrcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FsbGJhY2tIYW5kbGVyIHsKLQotCS8qKgotCSAqIENhbGxiYWNrLCBidXQgc2VuZCB0aGUgcGFybSBhcyBhbiBvYmplY3QsIGllLiBpdCBtdXN0Ci0JICogYmUgbm90aGluZyBidXQgY29uc3RhbnRzLCBlLmcuIFN0cmluZywgSW50ZWdlciwgb3IgYW4KLQkgKiBhcnJheSBvZiBjb25zdGFudHMuIENvbnN0YW50cyBzaG91bGQgbm90IGJlIHRoaW5ncyBsaWtlCi0JICogcmVndWxhciBvYmplY3RzLiBUaGlzIGlzIGJlY2F1c2Ugb25seSBzdGFuZGFyZCBqYXZhLmxhbmcKLQkgKiB0eXBlIGNvbnN0YW50cyBjYW4gYmUgYXNzdXJlZCB0byBiZSBhdmFpbGFibGUgb24gdGhlIG90aGVyCi0JICogY2xpZW50LiBBbHNvIHlvdSBkb24ndCB3YW50IHRvIHNlbmQgYmlnIG9iamVjdHMuIEl0IG11c3QKLQkgKiBiZSBjb25zdGFudHMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIHNlbnQgYmFjayBmb3IgYW55IHJlYXNvbgotCSAqIHNpbmNlIHRoZWlyIGlkZW50aXR5IHdpbGwgYmUgbG9zdCBpbiB0aGUgdHJhbnNmZXIuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgYmUgdXNlZCBpZiB0aGVyZSBhcmUgbm8gcGFybXMgKGkuZS4gaXQgaXMgbnVsbCkuCi0JICogPHA+Ci0JICogVG8gc2VuZCBiaWcgb2JqZWN0cywgdXNlIHRoZSBjYWxsYmFjayBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGNhbGxiYWNrSUQKLQkgKiBAcGFyYW0gbXNnSUQKLQkgKiBAcGFyYW0gcGFybQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIElWTUNhbGxiYWNrU2VydmVyI3JlcXVlc3RTdHJlYW0oaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIE9iamVjdCBjYWxsYmFja0FzQ29uc3RhbnRzKGludCBjYWxsYmFja0lELCBpbnQgbXNnSUQsIE9iamVjdCBwYXJtKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxiYWNrIHRvIHJlZ2lzdGVyZWQgY2xpZW50LgotCSAqIDxwPgotCSAqICBUaGUgcGFybXMgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcm1zLCBvciBpdCBpcyBhbiBhcnJheSBvZiBwYXJtcy4KLQkgKiBUaGUgcGFybXMKLQkgKiAgICB3aWxsIGJlIHR1cm5lZCBpbnRvIHByb3hpZXMgb24gdGhlIGNsaWVudCB2bS4gU28gdGhlIGNhbGxiYWNrCi0JICogICAgd2lsbCByZWNpZXZlIGFuIGFycmF5IG9mIHByb3hpZXMgdG8gdGhlIHZhbHVlcyBpbiB0aGUgcGFybXMuCi0JICogICAgSWYgYW55IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBhcnJheSBpcyBpdHNlbGYgYW4gYXJyYXksIGEKLQkgKiAgICBwcm94eSB0byB0aGUgYXJyYXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBzZW50LiBUaGUgYXJyYXkgaXRzZWxmCi0JICogICAgd2lsbCBub3QgYmUgc2VudC4KLQkgKiA8cD4KLQkgKiAgICBJZiBhbiBhcnJheSBlbnRyeSBzaG91bGQgZ28gYWNyb3NzIGFzIGFuIGFycmF5IG9mIHByb3hpZXMgYW5kCi0JICogICAgbm90IGFzIG9uZSBwcm94eSB0byBhbiBhcnJheSwgdGhlbiB0aGUgZW50cnkgbmVlZHMgdG8gYmUgYW4KLQkgKiAgICBpbnN0YW5jZSBvZiB7QGxpbmsgSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSB0cmFuc21pdGFibGVBcnJheX0uIFRoaXMgd2lsbCBmbGFnCi0JICogICAgdGhhdCBpdCBzaG91bGQgdHJhbnNtaXQgdGhlIGVudGlyZSBlbnRyeSBhcyBwcm94aWVzLiBUaGlzIHNob3VsZAotCSAqICAgIGJlIHVzZWQgc3BhcmluZ2x5LCBvbmx5IGlmIHRoZXJlIGlzbid0IG11Y2ggZGF0YSBpbiB0aGUgYXJyYXkgYW5kCi0JICogICAgYWxsIG9mIHRoZSBhcnJheSB3b3VsZCBiZSB1c2VkIG9uIHRoZSBjbGllbnQuIFRoYXQgd2F5IHRyYW5zbWl0dGluZwotCSAqICAgIHRoZSBlbnRpcmUgYXJyYXkgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhY2Nlc3NpbmcgaW5kaXZpZHVhbCBjb21wb25lbnRzLgotCSAqIDxwPgotCSAqIElmIHRoZSBhcnJheSBjb250YWlucyBvbmx5IG9uZSBlbnRyeSBvciB0aGUgcGFybSBpdHNlbGYgaXMgbnVsbCwgdGhlbiB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2soaW50LCBJQmVhblByb3h5KX0KLQkgKiB3aWxsIGJlIGNhbGxlZC4gRWxzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrI2NhbGxlZEJhY2soaW50LCBPYmplY3RbXSl9IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIG9mIHRoZSBwYXJtcwotCSAqIHR1cm5lZCBpbnRvIHByb3hpZXMgYXMgbWVudGlvbmVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGguCi0JICoKLQkgKiBAcGFyYW0gY2FsbGJhY2tJRCBUaGUgaWQgb2YgdGhlIGNhbGxiYWNrLiBUaGlzIHdpbGwgYmUgZ2l2ZW4KLQkgKiAgICB0byB0aGUgY2FsbGJhY2sgd2hlbiBpdCBpcyBjcmVhdGVkLCBhbmQgaXQgbXVzdCBwYXNzCi0JICogICAgb24gdG8gdGhlIGhhbmRsZXIuIFRoYXQgd2F5IGl0IGlzIGtub3cgd2hpY2ggY2FsbGJhY2sKLQkgKiAgICB0byBjYWxsIG9uIHRoZSBjbGllbnQuCi0JICogQHBhcmFtIG1zZ0lEIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSBmb3IgdGhlIGNhbGxiYWNrLiBUaGlzIGlzIGFuCi0JICogICAgYWdyZWVkIHVwb24gaWQgb2YgdGhlIGRldmVsb3BlcnMgb2YgdGhlIGNhbGxiYWNrIG9uIGJvdGgKLQkgKiAgICBzaWRlcy4KLQkgKiBAcGFyYW0gcGFybXMgTnVsbCBpZiBubyBwYXJtcywgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBzZW5kIHRvIHRoZSBjbGllbnQgdm0uIFNlZSB0aGUgY29tbWVudHMgCi0JICogYWJvdmUgZm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlci4KLQkgKiAKLQkgKiBAc2VlIElDYWxsYmFja0hhbmRsZXIuVHJhbnNtaXRhYmxlQXJyYXkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxiYWNrV2l0aFBhcm1zKGludCBjYWxsYmFja0lELCBpbnQgbXNnSUQsIE9iamVjdFtdIHBhcm1zKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFycmF5IHdyYXBwZXIgdGhhdCB0dXJucyBhbiBhcnJheSBmb3IgcGFyYW1ldGVycyBpbnRvIGEgdHJhbnNtaXR0YWJsZSBhcnJheS4KLQkgKiAKLQkgKiBAc2VlIElDYWxsYmFja0hhbmRsZXIjY2FsbGJhY2tXaXRoUGFybXMoaW50LCBpbnQsIE9iamVjdFtdKQotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhbnNtaXRhYmxlQXJyYXkgewotCQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gZkFycmF5OwotCQlwdWJsaWMgVHJhbnNtaXRhYmxlQXJyYXkoT2JqZWN0W10gYXJyYXkpIHsKLQkJCWZBcnJheSA9IGFycmF5OwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRBcnJheSgpIHsKLQkJCXJldHVybiBmQXJyYXk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFja1J1bm5hYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDYWxsYmFja1J1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGM3OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JQ2FsbGJhY2tSdW5uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUNhbGxiYWNrUnVubmFibGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0KLS8qKgotICogVXNlcnMgd291bGQgaW1wbGVtZW50IHRoaXMgYXMgYSBydW5uYWJsZSB0byAKLSAqIHNlbmQgYSBjYWxsYmFjayByZXF1ZXN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYWxsYmFja1J1bm5hYmxlIHsKLQkKLQkvKioKLQkgKiBUaGUgYWN0dWFsIHJ1biBjb2RlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgcnVuKElDYWxsYmFja0hhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNvbW1hbmRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSUNvbW1hbmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlZTMyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lDb21tYW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0vKgotICogICRSQ1NmaWxlOiBJQ29tbWFuZEV4Y2VwdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgSUNvbW1hbmRFeGNlcHRpb24gewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lWTUNhbGxiYWNrU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lWTUNhbGxiYWNrU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTM0OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9JVk1DYWxsYmFja1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uOwotLyoKLSAqICAkUkNTZmlsZSQKLSAqICAkUmV2aXNpb24kICAkRGF0ZSQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyB0aGUgCi0gKiBWTSBjYWxsYmFjayBTZXJ2ZXIuIEl0IHdpbGwgYmUgZ2l2ZW4gdG8gYW4KLSAqIElDYWxsYmFjayBzbyB0aGF0IHRoZSBjYWxsYmFjayBjYW4gYWNjZXNzCi0gKiB0aGUgc2VydmVyIHRvIHJlcXVlc3QgYSBjYWxsYmFjay4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVk1DYWxsYmFja1NlcnZlciB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBJVk1TZXJ2ZXIgZm9yIHRoaXMgY2FsbGJhY2sgc2VydmVyLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVZNU2VydmVyIGdldElWTVNlcnZlcigpOwotCQotCQotCS8qKgotCSAqIFByb2Nlc3MgYSBjYWxsYmFjay4gVGhlIHJ1bm5hYmxlIGNvbnRhaW5zIHRoZQotCSAqIGFjdHVhbCBjb2RlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9DYWxsYmFjayhJQ2FsbGJhY2tSdW5uYWJsZSBydW5uYWJsZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVxdWVzdCBhIHN0cmVhbSBmb3Igd3JpdGluZyBhIGxvdCBvZiBkYXRhIChzdWdnZXN0ZWQgZm9yIGxhcmdlcgotCSAqIHRoYW4gc2V2ZXJhbCB0aG91c2FuZCBieXRlcykuIFRoZSBjb25uZWN0aW9uIHdpbGwgYmUgYXNzaWduZWQKLQkgKiB0byB0aGlzIHN0cmVhbSB1bnRpbCB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIHJlcXVlc3RTdHJlYW0oaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSVZNU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL0lWTVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGQ4YWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vSVZNU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJVk1TZXJ2ZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wNy8wOCAxNzo1MTo0NyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0gCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2Ugc2VydmVyIGZvciB0aGUgdm0gb24gdGhlIHZtIHNpZGUgKGkuZS4gbm90IHRoZSBjbGllbnQgc2lkZSkuCi0gKiA8cD4KLSAqIEl0IGNhbiBiZSBwYXNzZWQgdG8gcHJveGllcyBpZiB0aGV5IG5lZWQgdG8gYWNjZXNzIHRoZSB2bSBzZXJ2ZXIuCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVk1TZXJ2ZXIgewotCi0JLyoqCi0JICogQWRkIGEgcnVubmFibGUgdGhhdCB3aWxsIGJlIGNhbGxlZCBpZiBzaHV0ZG93biBpcyByZXF1ZXN0ZWQuIElmIGFscmVhZHkgYWRkZWQsCi0JICogaXQgd2lsbCBub3QgYmUgYWRkZWQgYWdhaW4uCi0JICogPHA+Ci0JICogVGhlIGJvZHkgb2YgdGhlIHJ1bm5hYmxlIG11c3Qgbm90IGRvIGFueSB2bSBzZXJ2ZXIgY2FsbHMuIFRoYXQgaXMgYmVjYXVzZQotCSAqIHRoZSBzZXJ2ZXIgaXMgc2h1dGRvd24gYXQgdGhpcyBwb2ludC4gVGhlIGJvZHkgbXVzdCBzaW1wbHkgZG8gY2xlYW4gdXAgY29kZS4KLQkgKiBUaGUgc2h1dGRvd24gd2lsbCBub3QgY29udGludWUgdW50aWwgdGhlIGNhbGwgdG8gdGhlIHJ1bm5hYmxlIGlzIHJldHVybmVkLgotCSAqIDxwPgotCSAqIENhbGxzIHRvIHRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHNodXRkb3duIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuCi0JICogQHBhcmFtIHJ1bm5hYmxlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2h1dGRvd25MaXN0ZW5lcihSdW5uYWJsZSBydW5uYWJsZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNodXRkb3duIHJ1bm5hYmxlIGZyb20gdGhlIGxpc3QuIElmIG5vdCBhZGRlZCwgdGhlbiBub3QgYW4gZXJyb3IgdG8gY2FsbCB0aGlzLgotCSAqIDxwPgotCSAqIENhbGxzIHRvIHRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHNodXRkb3duIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuCi0JICogQHBhcmFtIHJ1bm5hYmxlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2h1dGRvd25MaXN0ZW5lcihSdW5uYWJsZSBydW5uYWJsZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWFwVHlwZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5Q29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vTWFwVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkMTQyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL01hcFR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogTWFwVHlwZXMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHVzZWQgZm9yIG1hcHBpbmcgYmV0d2VlbiBKTkkgZm9ybWF0IGFuZCBub24tSk5JIGZvcm1hdC4gSXQgYWxzbyBoYXMgdGhlCi0gKiBtYXBzIGZvciBwcmltaXRpdmVzLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBUeXBlcyB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEhhc2hNYXAgTUFQX1NIT1JUU0lHX1RPX1RZUEUgPSBuZXcgSGFzaE1hcCg4KTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIEhhc2hNYXAgTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHID0gbmV3IEhhc2hNYXAoOCk7Ci0Jc3RhdGljIHsKLQkJTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJCIiwgQnl0ZS5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkMiLCBDaGFyYWN0ZXIuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJEIiwgRG91YmxlLlRZUEUpOwkJIC8vJE5PTi1OTFMtMSQKLQkJTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJGIiwgRmxvYXQuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTWFwVHlwZXMuTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJJIiwgSW50ZWdlci5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkoiLCBMb25nLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1hcFR5cGVzLk1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiUyIsIFNob3J0LlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1hcFR5cGVzLk1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiWiIsIEJvb2xlYW4uVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImJ5dGUiLCJCIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJjaGFyIiwiQyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiZG91YmxlIiwiRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiZmxvYXQiLCJGIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJpbnQiLCJJIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJsb25nIiwiSiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTWFwVHlwZXMuTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgic2hvcnQiLCJTIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJib29sZWFuIiwiWiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkKLQotCS8qKgotCSAqIENvbnZlcnQgZm9ybWFsIHR5cGUgbmFtZSBmb3IgYW4gYXJyYXkgKGkuZS4gamF2YS5sYW5nLk9iamVjdFtdCi0JICogdG8gdGhlIGpuaSBmb3JtYXQgKGkuZS4gW0xqYXZhLmxhbmcuT2JqZWN0OykKLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiBhIG5hbWUgaXMgcGFzc2VkIGluIGZyb20gdGhlIElERSBzaWRlLgotCSAqIFRoZSBWTSBzaWRlIHVzZXMgdGhlIGpuaSBmb3JtYXQsIGFuZCBhbGwgb2YgcHJveHkgdXNlcyB0aGUgam5pIGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NuYW1lCi0JICogQHJldHVybiBzdHJpbmcgam5pIGZvcm0gb2YgbmFtZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKTklGb3JtYXROYW1lKFN0cmluZyBjbGFzc25hbWUpIHsKLQkJaWYgKGNsYXNzbmFtZS5sZW5ndGgoKSA9PSAwIHx8ICFjbGFzc25hbWUuZW5kc1dpdGgoIl0iKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGNsYXNzbmFtZTsJLy8gTm90IGFuIGFycmF5LG9yIGludmFsaWQKLQkJCi0JCVN0cmluZ0J1ZmZlciBqbmkgPSBuZXcgU3RyaW5nQnVmZmVyKGNsYXNzbmFtZS5sZW5ndGgoKSk7Ci0JCWludCBmaXJzdE9wZW5CcmFja2V0ID0gY2xhc3NuYW1lLmluZGV4T2YoJ1snKTsKLQkJaW50IG9iID0gZmlyc3RPcGVuQnJhY2tldDsKLQkJd2hpbGUgKG9iID4gLTEpIHsKLQkJCWludCBjYiA9IGNsYXNzbmFtZS5pbmRleE9mKCddJywgb2IpOwotCQkJaWYgKGNiID09IC0xKQotCQkJCWJyZWFrOwotCQkJam5pLmFwcGVuZCgnWycpOwotCQkJb2IgPSBjbGFzc25hbWUuaW5kZXhPZignWycsIGNiKTsKLQkJfQotCQkKLQkJU3RyaW5nIGZpbmFsVHlwZSA9IGNsYXNzbmFtZS5zdWJzdHJpbmcoMCwgZmlyc3RPcGVuQnJhY2tldCkudHJpbSgpOwotCQlpZiAoZmluYWxUeXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBzaG9ydFNpZyA9IChTdHJpbmcpIE1hcFR5cGVzLk1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5nZXQoZmluYWxUeXBlKTsKLQkJCWlmIChzaG9ydFNpZyA9PSBudWxsKSB7Ci0JCQkJam5pLmFwcGVuZCgnTCcpOwotCQkJCWpuaS5hcHBlbmQoZmluYWxUeXBlKTsKLQkJCQlqbmkuYXBwZW5kKCc7Jyk7Ci0JCQl9IGVsc2UgewotCQkJCWpuaS5hcHBlbmQoc2hvcnRTaWcpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gam5pLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgY29udmVydHMgZnJvbSB0aGUgSk5JIGZvcm1hdCB0byB0aGUgZm9ybWFsIHR5cGVuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBqbmlOYW1lCi0JICogQHJldHVybiBmb3JtYWwgdHlwZW5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYWxUeXBlTmFtZShTdHJpbmcgam5pTmFtZSkgewotCQlpZiAoam5pTmFtZS5jaGFyQXQoMCkgPT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBhbiBhcnJheQotCQkJaW50IGRpbXMgPSBqbmlOYW1lLmxhc3RJbmRleE9mKCdbJykrMTsJLy8gTnVtYmVyIG9mIGRpbWVuc2lvbnMKLQkJCWludCBzdGFydFR5cGUgPSBkaW1zOwotCQkJU3RyaW5nQnVmZmVyIGZOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihqbmlOYW1lLmxlbmd0aCgpKygyKmRpbXMpKTsgCi0JCQlpZiAoam5pTmFtZS5jaGFyQXQoc3RhcnRUeXBlKSA9PSAnTCcpCi0JCQkJZk5hbWUuYXBwZW5kKGpuaU5hbWUuc3Vic3RyaW5nKHN0YXJ0VHlwZSsxLCBqbmlOYW1lLmxlbmd0aCgpLTEpKTsJLy8gRm9yICJbTGphdmEubGFuZy5TdHJpbmc7IiByZXR1cm4gImphdmEubGFuZy5TdHJpbmciCi0JCQllbHNlIGlmIChqbmlOYW1lLmxlbmd0aCgpID09IHN0YXJ0VHlwZSsxKSB7Ci0JCQkJLy8gUG9zc2libGUgcHJpbWl0aXZlCi0JCQkJQ2xhc3MgdHlwZSA9IChDbGFzcykgTUFQX1NIT1JUU0lHX1RPX1RZUEUuZ2V0KGpuaU5hbWUuc3Vic3RyaW5nKHN0YXJ0VHlwZSwgc3RhcnRUeXBlKzEpKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWZOYW1lLmFwcGVuZCh0eXBlLmdldE5hbWUoKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybiAiIjsJLy8gSW52YWxpZCBpZiBubyAnTCcgYW5kIG5vdCBhIHByaW1pdGl2ZS4gLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlCi0JCQkJcmV0dXJuICIiOwkvLyBJbnZhbGlkLCBtdXN0IGJlIGVpdGhlciBhIHByaW1pdGl2ZSBvciAnTCcgdHlwZS4gLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUoZGltcy0tID4gMCkgewotCQkJCWZOYW1lLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZOYW1lLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSBpZiAoam5pTmFtZS5sZW5ndGgoKSA9PSAxKSB7Ci0JCQkvLyBQb3NzaWJsZSBwcmltaXRpdmUuCi0JCQlDbGFzcyB0eXBlID0gKENsYXNzKSBNQVBfU0hPUlRTSUdfVE9fVFlQRS5nZXQoam5pTmFtZSk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiBnb3QgaGVyZSB0aGVuIGp1c3QgYSBuYW1lIGFzIGlzLgotCQlyZXR1cm4gam5pTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCB0aGUgZm9ybWFsIHR5cGUgbmFtZSwgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGRpbWVuc2lvbnMsCi0JICogdG8gYW4gYXJyYXkgSk5JIHR5cGUuCi0JICogQHBhcmFtIGZpbmFsQ29tcG9uZW50IGZpbmFsIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgbm90IGJlIGFuIGFycmF5IHR5cGUuCi0JICogQHBhcmFtIGRpbWVuc2lvbnMgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIHRoZSBhcnJheS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Sk5JVHlwZU5hbWUoU3RyaW5nIGZpbmFsQ29tcG9uZW50LCBpbnQgZGltZW5zaW9ucykgewotCQlTdHJpbmdCdWZmZXIgam5pID0gbmV3IFN0cmluZ0J1ZmZlcihmaW5hbENvbXBvbmVudC5sZW5ndGgoKStkaW1lbnNpb25zKzIpOwotCQl3aGlsZSAoZGltZW5zaW9ucy0tID4gMCkgewotCQkJam5pLmFwcGVuZCgnWycpOwotCQl9Ci0JCQotCQlTdHJpbmcgc2hvcnRTaWcgPSAoU3RyaW5nKSBNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcuZ2V0KGZpbmFsQ29tcG9uZW50KTsKLQkJaWYgKHNob3J0U2lnID09IG51bGwpIHsKLQkJCWpuaS5hcHBlbmQoJ0wnKTsKLQkJCWpuaS5hcHBlbmQoZmluYWxDb21wb25lbnQpOwotCQkJam5pLmFwcGVuZCgnOycpOwotCQl9IGVsc2UgewotCQkJam5pLmFwcGVuZChzaG9ydFNpZyk7Ci0JCX0KLQkJCi0JCXJldHVybiBqbmkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL01ldGhvZEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9NZXRob2RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3NzJjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL01ldGhvZEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgY2xhc3MgdG8gZG8gbWVzc2FnZS9jb25zdHJ1Y3RvciB3b3JrLiAKLSAqIFNwZWNpZmljYWxseSB0byBmaW5kIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEhlbHBlciB7Ci0JCi0JLyoKLQkgKiBUaGUgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCBOdWxsIGNsYXNzIHR5cGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTlVMTF9DTEFTUyB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgTlVMTF9UWVBFID0gTlVMTF9DTEFTUy5jbGFzczsKLQkKLQlzdGF0aWMgZmluYWwgQXJyYXlMaXN0IHNQcmltaXRpdmVzT3JkZXI7Ci0Jc3RhdGljIGZpbmFsIGludCBzQ2hhclBvczsKLQkKLQlzdGF0aWMgewotCQlzUHJpbWl0aXZlc09yZGVyID0gbmV3IEFycmF5TGlzdCg2KTsKLQkJc1ByaW1pdGl2ZXNPcmRlci5hZGQoQnl0ZS5UWVBFKTsKLQkJc1ByaW1pdGl2ZXNPcmRlci5hZGQoU2hvcnQuVFlQRSk7Ci0JCXNQcmltaXRpdmVzT3JkZXIuYWRkKEludGVnZXIuVFlQRSk7Ci0JCXNQcmltaXRpdmVzT3JkZXIuYWRkKExvbmcuVFlQRSk7Ci0JCXNQcmltaXRpdmVzT3JkZXIuYWRkKEZsb2F0LlRZUEUpOwotCQlzUHJpbWl0aXZlc09yZGVyLmFkZChEb3VibGUuVFlQRSk7Ci0KLQkJLy8gY2hhciBjYW4gYmUgdHJlYXRlZCBsaWtlIGEgc2hvcnQgZm9yIHB1cnBvc2VzIG9mIG9yZGVyaW5nLgotCQlzQ2hhclBvcyA9IHNQcmltaXRpdmVzT3JkZXIuaW5kZXhPZihTaG9ydC5UWVBFKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUyIGNhbiBiZSBhc3NpZ25lZCB0byB0eXBlMSBpbgotCSAqIG1ldGhvZCBhcmd1bWVudCBjb252ZXJzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKENsYXNzIHR5cGUxLCBDbGFzcyB0eXBlMikgewotCQlpZiAodHlwZTEgPT0gdHlwZTIpCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gVGhleSdyZSB0aGUgc2FtZSwgc28gYXNzaWduYWJsZS4KLQkJaWYgKHR5cGUxLmlzUHJpbWl0aXZlKCkpIHsKLQkJCWlmICh0eXBlMi5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJaWYgKHR5cGUxID09IEJvb2xlYW4uVFlQRSB8fCB0eXBlMiA9PSBCb29sZWFuLlRZUEUpCi0JCQkJCXJldHVybiBmYWxzZTsJLy8gU2luY2Ugbm90IGVxdWFsIGFuZCBvbmUgaXMgYm9vbGVhbiBhbmQgdGhlIG90aGVyIGlzbid0LCBub3QgYXNzaWduYWJsZQotCQkJCWludCB0eXBlMVBvcyA9ICh0eXBlMSAhPSBDaGFyYWN0ZXIuVFlQRSkgPyBzUHJpbWl0aXZlc09yZGVyLmluZGV4T2YodHlwZTEpIDogc0NoYXJQb3M7Ci0JCQkJaW50IHR5cGUyUG9zID0gKHR5cGUyICE9IENoYXJhY3Rlci5UWVBFKSA/IHNQcmltaXRpdmVzT3JkZXIuaW5kZXhPZih0eXBlMikgOiBzQ2hhclBvczsKLQkJCQlyZXR1cm4gdHlwZTFQb3MgPiB0eXBlMlBvczsJLy8gSXQgY2FuIGJlIHdpZGVuZWQgaWYgdHlwZTEgaXMgaGlnaGVyIGluIHRoZSBvcmRlcgotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwkvLyBwcmltaXRpdmUgdG8gbm9uLXByaW1pdGl2ZSwgbm90IGFzc2lnbmFibGUuCi0JCX0gZWxzZQotCQkJaWYgKHR5cGUyID09IE5VTExfVFlQRSkKLQkJCQlyZXR1cm4gdHJ1ZTsJLy8gTlVMTF9UWVBFIHJlcHJlc2VudHMgbnVsbCBmb3IgdXMsIGFuZCBudWxsIGNhbiBiZSBhc3NpZ25lZCB0byBhbnkgb2JqZWN0Ci0JCQllbHNlCQkKLQkJCQlyZXR1cm4gdHlwZTEuaXNBc3NpZ25hYmxlRnJvbSh0eXBlMik7CS8vIENhbiB0eXBlMiBiZSBhc3NpZ25lZCB0byB0eXBlMQotCX0KLQkKLQkKLQkvKioKLQkgKiBFdmVyeSBlbnRyeSBpbiBBcnJheTIgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIEFycmF5MS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShDbGFzc1tdIHR5cGVzMSwgQ2xhc3NbXSB0eXBlczIpIHsKLQkJaWYgKHR5cGVzMS5sZW5ndGggIT0gdHlwZXMyLmxlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsJLy8gTm90IHRoZSBzYW1lIHNpemUsIHNvIG5vdCBjb21wYXRpYmxlLgotCQlmb3IgKGludCBpPTA7IGk8dHlwZXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWlzQXNzaWduYWJsZUZyb20odHlwZXMxW2ldLCB0eXBlczJbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsJLy8gQWxsIGFyZSBhc3NpZ25hYmxlCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG1vc3QgY29tcGF0aWJsZSBtZXRob2QvY29uc3RydWN0b3IgZnJvbSB0aGUgbGlzdHMgcGFzc2VkIGluLgotCSAqIE1ldGhvZHNMaXN0OiBMaXN0IG9mIG1ldGhvZHMgKGlmIG51bGwgdGhlbiB0aGlzIGlzIGZvciBjb25zdHJ1Y3RvcnMpCi0JICogUGFybXNMaXN0OiBMaXN0IG9mIHBhcm1zIGZvciBlYWNoIG1ldGhvZCAoZWFjaCBlbnRyeSB3aWxsIGJlIENsYXNzW10pLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBmaW5kTW9zdENvbXBhdGlibGUoTGlzdCBtZXRob2RzLCBMaXN0IHBhcm1zLCBTdHJpbmcgYW1iaWd1b3VzTmFtZSkgdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBhbGdvcml0aG0gdXNlZCBpcyBmcm9tIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24gMTUuMTIuMi4yCi0JCS8vIEZpbmQgdGhlIG1heGltYWxseSBzcGVjaWZpYyBvbmVzCi0JCS8vIFRoaXMgaXMgZGVmaW5lZCBhcyB0aGUgb25lIHRoYXQgaXMgbW9yZSBzcGVjaWZpYyB0aGVuIGFsbCBvZiB0aGUgcmVzdC4KLQkJLy8gSWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgcGFybXMgdGhhdCBhcmUgbWF4aW1hbGx5IHNwZWNpZmljLCB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGNob29zZW4KLQkJLy8gYmVjYXVzZSB3aGVuIGludm9rZWQgdGhlIEpWTSB3aWxsIG1ha2Ugc3VyZSB0aGUgcmlnaHQgdGhpbmcgaXMgZG9uZS4KLQkJLy8gCi0JCUNsYXNzW11bXSBwYXJtc0NvcHkgPSAoQ2xhc3NbXVtdKSBwYXJtcy50b0FycmF5KG5ldyBDbGFzc1twYXJtcy5zaXplKCldW10pOwotCQlpbnQgc2l6ZSA9IHBhcm1zQ29weS5sZW5ndGg7Ci0JCS8vIEZvciBlYWNoIGVudHJ5IHNlZSBpZiBpdCBpcyBtYXhpbWFsbHkgc3BlY2lmaWMsIGkuZS4gaXQgaXMgbW9yZSBzcGVjaWZpYyB0aGVuIGFsbCBvZiB0aGUgb3RoZXJzLgotbmV4dE1ldGhvZDoJZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotCQkJLy8gRm9yIGN0b3JzIHdlIGRvbid0IG5lZWQgdG8gdGVzdCB0aGUgZGVjbGFyaW5nIGNsYXNzIGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgY2xhc3MuCi0JCQlDbGFzcyBkY2xDbGFzc2kgPSBtZXRob2RzICE9IG51bGwgPyAoKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSkpLmdldERlY2xhcmluZ0NsYXNzKCkgOiBudWxsOwotCQkJQ2xhc3NbXSBwYXJtc2kgPSBwYXJtc0NvcHlbaV07Ci0JCQlmb3IgKGludCBqPTA7IGo8c2l6ZTsgaisrKSB7Ci0JCQkJaWYgKGkgPT0gaikKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gTWV0aG9kaSBpcyBtb3JlIHNwZWNpZmljIGlmCi0JCQkJLy8gICBhKSBNZXRob2RpIGRlY2xhcmluZyBjbGFzcyBpcyBhc3NpZ25hYmxlIHRvIE1ldGhvZGogZGVjbGFyaW5nIGNsYXNzCi0JCQkJLy8gICBiKSBNZXRob2RpIHBhcm1zIGFyZSBhc3NpZ25hYmxlIHRvIE1ldGhvZGogcGFybXMKLQkJCQkvLwotCQkJCS8vIEZpcnN0IHNlZSBpZiBNZXRob2RpIGlzIG1vcmUgc3BlY2lmaWMsIGlmIGl0IGlzCi0JCQkJLy8gdGhlbiB0aHJvdyBvdXQgTWV0aG9kaiBhbmQgY29udGludWUKLQkJCQkvLyBJZiBNZXRob2RpIGlzIG5vdCBjb21wYXRpYmxlIHRvIE1ldGhvZGosIGdvIHRvIHRoZSBuZXh0IG1ldGhvZCBmb3IgaS4gTWV0aG9kaSBpcyBub3QgdGhlIG1vc3Qgc3BlY2lmaWMKLQkJCQkvLyBTb21ldGhpbmcgZWxzZSBpcyBlaXRoZXIgbW9yZSBzcGVjaWZpYyBvciBub25lIGFyZSBtYQotCQkJCWlmIChkY2xDbGFzc2kgIT0gbnVsbCkgewotCQkJCQkvLyBTdGVwIGEKLQkJCQkJaWYgKCFpc0Fzc2lnbmFibGVGcm9tKCgoTWV0aG9kKSBtZXRob2RzLmdldChqKSkuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgZGNsQ2xhc3NpKSkKLQkJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CS8vIE1ldGhvZGkgaXMgbm90IG1vcmUgc3BlY2lmaWMgdGhhbiBNZXRob2RqLCBzbyB0cnkgbmV4dCBpLgotCQkJCX0KLQkJCQkKLQkJCQkvLyBTdGVwIGIKLQkJCQlDbGFzc1tdIHBhcm1zaiA9IHBhcm1zQ29weVtqXTsKLQkJCQlpZiAoIWlzQXNzaWduYWJsZUZyb20ocGFybXNqLCBwYXJtc2kpKSB7Ci0JCQkJCS8vIE1ldGhvZGkgaXMgbm90IG1vcmUgc3BlY2lmaWMgdGhhbiBNZXRob2RqLCBzbyBnbyB0byBuZXh0IGkuCi0JCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGk7CS8vIE1ldGhvZGkgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIGFsbCBvZiB0aGUgb3RoZXIgb25lcy4KLQkJfQotCi0JCXRocm93IG5ldyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24oYW1iaWd1b3VzTmFtZSk7CS8vIFRoZXJlIHdhcyBub3Qgb25lIG1vcmUgc3BlY2lmaWMgdGhhbiBhbGwgb2YgdGhlIG90aGVycy4KLQl9Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgbW9zdCBjb21wYXRpYmxlIG1ldGhvZCBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBmaW5kQ29tcGF0aWJsZU1ldGhvZChDbGFzcyByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJndW1lbnRzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gewotCQl0cnkgewotCQkJTWV0aG9kIG10aGQgPSByZWNlaXZlci5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKLQkJCXJldHVybiBtdGhkOwkvLyBGb3VuZCBleGFjdCBtYXRjaAotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXhjKSB7Ci0JCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKLQkJCQkvLyBOZWVkIHRvIGZpbmQgbW9zdCBjb21wYXRpYmxlIG9uZS4KLQkJCQlNZXRob2QgbXRoZHNbXSA9IHJlY2VpdmVyLmdldE1ldGhvZHMoKTsKLQkJCQlBcnJheUxpc3QgcGFybXNMaXN0ID0gbmV3IEFycmF5TGlzdChtdGhkcy5sZW5ndGgpOyAvLyBUaGUgcGFybSBsaXN0IGZyb20gZWFjaCBjb21wYXRpYmxlIG1ldGhvZC4KLQkJCQlBcnJheUxpc3QgbXRoZHNMaXN0ID0gbmV3IEFycmF5TGlzdChtdGhkcy5sZW5ndGgpOyAvLyBUaGUgbGlzdCBvZiBjb21wYXRpYmxlIG1ldGhvZHMsIHNhbWUgb3JkZXIgYXMgdGhlIHBhcm1zIGFib3ZlLgotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXRoZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJTWV0aG9kIG10aGQgPSBtdGhkc1tpXTsKLQkJCQkJaWYgKCFtdGhkLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpCi0JCQkJCQljb250aW51ZTsgLy8gTm90IGNvbXBhdGlibGUsIG5vdCBzYW1lIG5hbWUKLQkJCQkJQ2xhc3NbXSBwYXJtcyA9IG10aGQuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQkJaWYgKCFpc0Fzc2lnbmFibGVGcm9tKHBhcm1zLCBhcmd1bWVudHMpKQotCQkJCQkJY29udGludWU7IC8vIE5vdCBjb21wYXRpYmxlLCBwYXJtcwotCQkJCQkvLyBJdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBtZXRob2QKLQkJCQkJcGFybXNMaXN0LmFkZChwYXJtcyk7Ci0JCQkJCW10aGRzTGlzdC5hZGQobXRoZCk7Ci0JCQkJfQotCi0JCQkJLy8gTm93IGhhdmUgbGlzdCBvZiBjb21wYXRpYmxlIG1ldGhvZHMuCi0JCQkJaWYgKHBhcm1zTGlzdC5zaXplKCkgPT0gMCkKLQkJCQkJdGhyb3cgdGhyb3dGaXhlZE5vU3VjaE1ldGhvZChleGMsIHJlY2VpdmVyLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOyAvLyBOb25lIGZvdW5kLCBzbyByZXRocm93IHRoZSBleGNlcHRpb24KLQkJCQlpZiAocGFybXNMaXN0LnNpemUoKSA9PSAxKQotCQkJCQlyZXR1cm4gKE1ldGhvZCkgbXRoZHNMaXN0LmdldCgwKTsgLy8gT25seSBvbmUsIHNvIHJldHVybiBpdAotCi0JCQkJLy8gTm93IGZpbmQgdGhlIG1vc3QgY29tcGF0aWJsZSBtZXRob2QKLQkJCQlpbnQgbW9zdENvbXBhdGlibGUgPSBmaW5kTW9zdENvbXBhdGlibGUobXRoZHNMaXN0LCBwYXJtc0xpc3QsIG1ldGhvZE5hbWUpOwotCQkJCXJldHVybiAoTWV0aG9kKSBtdGhkc0xpc3QuZ2V0KG1vc3RDb21wYXRpYmxlKTsKLQkJCX0gZWxzZQotCQkJCXRocm93IHRocm93Rml4ZWROb1N1Y2hNZXRob2QoZXhjLCByZWNlaXZlciwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsgLy8gTm9uZSBmb3VuZCwgc28gcmV0aHJvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBOb1N1Y2hNRXRob2RFeGVjZXB0aW9uIGRvZXNuJ3QgaW5jbHVkZSB0aGUgc2lnbmF0dXJlLiBTaW5jZSB0aGVzZSBhcmUgZHluYW1pYyBzZWFyY2hlcywgdGhlIGV4Y2VwdGlvbiBpdHNlbGYgaXMgdXNlbGVzcyB3aXRob3V0Ci0JICogdGhlIHNpZ25hdHVyZS4gU28gd2UgYWRkIGl0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB0aHJvd0ZpeGVkTm9TdWNoTWV0aG9kKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlLCBDbGFzcyBkZWNsYXJlQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ0NsYXNzZXMpIHsKLQotCQkvLyBUaGUgZGVmYXVsdCB0cmFjZSBkb2Vzbid0IHNob3cgd2hhdCBtZXRob2Qgd2FzIGJlaW5nIHNlYXJjaGVkIGZvciwgc28gcmVjcmVhdGUgd2l0aCB0aGF0LgotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcy5hcHBlbmQoZGVjbGFyZUNsYXNzLmdldE5hbWUoKSk7Ci0JCXMuYXBwZW5kKCcuJyk7Ci0JCXMuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQlzLmFwcGVuZCgnKCcpOwotCQlpZiAoYXJnQ2xhc3NlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0NsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXMuYXBwZW5kKCcsJyk7Ci0JCQkJcy5hcHBlbmQoYXJnQ2xhc3Nlc1tpXS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXMuYXBwZW5kKCcpJyk7Ci0JCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuZSA9IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24ocy50b1N0cmluZygpKTsKLQkJbmUuc2V0U3RhY2tUcmFjZShlLmdldFN0YWNrVHJhY2UoKSk7Ci0JCXJldHVybiBuZTsKLQl9Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgbW9zdCBjb21wYXRpYmxlIGNvbnN0cnVjdG9yIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29uc3RydWN0b3IgZmluZENvbXBhdGlibGVDb25zdHJ1Y3RvcihDbGFzcyByZWNlaXZlciwgQ2xhc3NbXSBhcmd1bWVudHMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjdG9yID0gcmVjZWl2ZXIuZ2V0RGVjbGFyZWRDb25zdHJ1Y3Rvcihhcmd1bWVudHMpOwotCQkJY3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwkvLyBXZSBhbGxvdyBhbGwgYWNjZXNzLCBsZXQgaWRlIGFuZCBjb21waWxlciBoYW5kbGUgc2VjdXJpdHkuCi0JCQlyZXR1cm4gY3RvcjsJLy8gRm91bmQgZXhhY3QgbWF0Y2gKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4YykgewotCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJLy8gTmVlZCB0byBmaW5kIG1vc3QgY29tcGF0aWJsZSBvbmUuCi0JCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY3RvcnNbXSA9IHJlY2VpdmVyLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7Ci0JCQkJQXJyYXlMaXN0IHBhcm1zTGlzdCA9IG5ldyBBcnJheUxpc3QoY3RvcnMubGVuZ3RoKTsgLy8gVGhlIHBhcm0gbGlzdCBmcm9tIGVhY2ggY29tcGF0aWJsZSBtZXRob2QuCi0JCQkJQXJyYXlMaXN0IGN0b3JzTGlzdCA9IG5ldyBBcnJheUxpc3QoY3RvcnMubGVuZ3RoKTsgLy8gVGhlIGxpc3Qgb2YgY29tcGF0aWJsZSBtZXRob2RzLCBzYW1lIG9yZGVyIGFzIHRoZSBwYXJtcyBhYm92ZS4KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGN0b3IgPSBjdG9yc1tpXTsKLQkJCQkJQ2xhc3NbXSBwYXJtcyA9IGN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQkJaWYgKCFpc0Fzc2lnbmFibGVGcm9tKHBhcm1zLCBhcmd1bWVudHMpKQotCQkJCQkJY29udGludWU7IC8vIE5vdCBjb21wYXRpYmxlLCBwYXJtcwotCQkJCQkvLyBJdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBtZXRob2QKLQkJCQkJcGFybXNMaXN0LmFkZChwYXJtcyk7Ci0JCQkJCWN0b3JzTGlzdC5hZGQoY3Rvcik7Ci0JCQkJfQotCi0JCQkJLy8gTm93IGhhdmUgbGlzdCBvZiBjb21wYXRpYmxlIG1ldGhvZHMuCi0JCQkJaWYgKHBhcm1zTGlzdC5zaXplKCkgPT0gMCkKLQkJCQkJdGhyb3cgZXhjOyAvLyBOb25lIGZvdW5kLCBzbyByZXRocm93IHRoZSBleGNlcHRpb24KLQkJCQlpZiAocGFybXNMaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGN0b3IgPSAoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGN0b3JzTGlzdC5nZXQoMCk7IC8vIE9ubHkgb25lLCBzbyByZXR1cm4gaXQKLQkJCQkJY3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOyAvLyBXZSBhbGxvdyBhbGwgYWNjZXNzLCBsZXQgaWRlIGFuZCBjb21waWxvciBoYW5kbGUgc2VjdXJpdHkuCi0JCQkJCXJldHVybiBjdG9yOwotCQkJCX0KLQotCQkJCS8vIE5vdyBmaW5kIHRoZSBtb3N0IGNvbXBhdGlibGUgY3RvcgotCQkJCWludCBtb3N0Q29tcGF0aWJsZSA9IGZpbmRNb3N0Q29tcGF0aWJsZShudWxsLCBwYXJtc0xpc3QsIHJlY2VpdmVyLmdldE5hbWUoKSk7Ci0JCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY3RvciA9IChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcikgY3RvcnNMaXN0LmdldChtb3N0Q29tcGF0aWJsZSk7Ci0JCQkJY3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOyAvLyBXZSBhbGxvdyBhbGwgYWNjZXNzLCBsZXQgaWRlIGFuZCBjb21waWxvciBoYW5kbGUgc2VjdXJpdHkuCi0JCQkJcmV0dXJuIGN0b3I7Ci0JCQl9IGVsc2UKLQkJCQl0aHJvdyBleGM7IC8vIE5vbmUgZm91bmQsIHNvIHJldGhyb3cgdGhlIGV4Y2VwdGlvbgotCQl9Ci0JfQkKLQkJCQkKLQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL1VucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL1VucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4N2RkNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9VbnJlc29sdmVkQ29tcGlsYXRpb25FcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZSQKLSAqICAkUmV2aXNpb24kICAkRGF0ZSQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbjsKLSAKLS8qKgotICogVXNlZCBieSB0aGUgdGhlIHJlZ2lzdHJpZXMgdG8gaW5kaWNhdGUgIlVucmVzb2x2ZWRDb21waWxhdGlvbkVycm9yIi4gVGhpcyBpcyBiZWNhdXNlIHRoZQotICogbm9ybWFsIGphdmEgdGhyb3dzIGp1c3QgYW4gRXJyb3Igd2l0aCBhIG1lc3NhZ2UuIFRvIG1ha2UgaXQgZWFzaWVyIGluIHByb2Nlc3NpbmcsIGl0IHdpbGwKLSAqIGJlIHR1cm5lZCBpbnRvIHRoaXMgZXJyb3IgaW5zdGVhZCBzbyB0aGF0IGl0IGNhbiBiZSBleHBsaWNpdGx5IGNhdWdodC4KLSAqIDxwPgotICogVGhpcyB3aWxsIG9ubHkgYmUgdXNlZCBpbiBjZXJ0YWluIGV4cGxpY2l0IHBhcnRzIG9mIHRoZSBjb2RlLiBJdCB3aWxsIGJlIGRldGFpbGVkIHdoZXJlCi0gKiBpdCBjYW4gYmUgdGhyb3duLgotICogCi0gKiBAc2luY2UgMS4xLjAuMQotICovCi1wdWJsaWMgY2xhc3MgVW5yZXNvbHZlZENvbXBpbGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzc3ODg0MjIxMTA3MzU5Mjc5MEw7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGZyb20gYW4gRXJyb3IuCi0JICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciB0aGF0IGlzIHRoZSBhY3R1YWwgb25lLiA8Yj5UaGlzIHdpbGwgbm90IGJlIHRoZSBjYXVzZSwgdGhlIG1lc3NhZ2UgYW5kIHN0YWNrdHJhY2Ugd2lsbCBiZSBjb3BpZWQgaW50byB0aGlzIG5ldyBlcnJvci48L2I+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wLjEKLQkgKi8KLQlwdWJsaWMgVW5yZXNvbHZlZENvbXBpbGF0aW9uRXJyb3IoRXJyb3IgZXJyb3IpIHsKLQkJc3VwZXIoZXJyb3IuZ2V0TWVzc2FnZSgpKTsKLQkJc2V0U3RhY2tUcmFjZShlcnJvci5nZXRTdGFja1RyYWNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9CZWFuUHJveHlWYWx1ZVNlbmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9CZWFuUHJveHlWYWx1ZVNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjMxZDEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvQmVhblByb3h5VmFsdWVTZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBCZWFuUHJveHlWYWx1ZVNlbmRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA1LzExIDE5OjAxOjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuVGhyb3dhYmxlUHJveHk7Ci0gCi0vKioKLSAqIFVzZWZ1bCBpbiBSRU0gdG8gZ2V0IHRoZSBhcnJheSBvZiBCZWFuUHJveHlWYWx1ZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgQmVhblByb3h5VmFsdWVTZW5kZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVNlbmRlciB7Ci0JcHJvdGVjdGVkIGludCBpbmRleCA9IDA7Ci0JcHJvdGVjdGVkIE9iamVjdFtdIGFycmF5OwotCXByaXZhdGUgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQlwcml2YXRlIGZpbmFsIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmYWN0b3J5OwotCQotCS8qKgotCSAqIFNlZSBpZiB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uIHRocm93biBkdXJpbmcgcmVhZGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBleGNlcHRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBleGNlcHRpb247Ci0JfQotCQkKLQlwdWJsaWMgQmVhblByb3h5VmFsdWVTZW5kZXIoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0JcHVibGljIEJlYW5Qcm94eVZhbHVlU2VuZGVyKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmYWN0b3J5LCBDb21tYW5kcy5WYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQl0aGlzKGZhY3RvcnkpOwotCQlpbml0aWFsaXplKGFycmF5SGVhZGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21tYW5kcy5WYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQlpbmRleCA9IDA7Ci0JCS8vIFRoZSBhcnJheSB0eXBlIGRvZXNuJ3QgbWF0dGVyLCBpdCB3aWxsIGJlIGFuIGFycmF5IG9mIG9iamVjdHMuCi0JCS8vIFRoZSB2YWx1ZXMgd2lsbCBlaXRoZXIgYmUgSUJlYW5Qcm94aWVzIG9yIGFuIGFycmF5LCBvciBjb25zdGFudHMuCi0JCWFycmF5ID0gbmV3IE9iamVjdFthcnJheUhlYWRlci5hbkludF07Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlhcnJheSA9IG51bGw7Ci0JCWluZGV4ID0gMDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEFycmF5KCkgewotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCQkJCQotCS8vIEEgbmV3IHZhbHVlIGlzIGJlaW5nIHNlbnQgdG8gdGhlIGFycmF5Ci0JLy8gTk9URTogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBoYXMgYmVlbiBjYWxsZWQgd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0JcHVibGljIHZvaWQgc2VuZFZhbHVlKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhcnJheVtpbmRleCsrXSA9IGZhY3RvcnkuZ2V0QmVhblByb3h5KHZhbHVlKTsJLy8gQWRkIGl0IHRvIHRoZSBhcnJheQotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBXZSBjYW4ndCBzdG9wIGl0IHJpZ2h0IGF3YXkgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGV4Y2VwdGlvbiBvbiwgaG93ZXZlciwKLQkJCS8vIHdlIGNhbiBsb2cgaXQgYW5kIHNhdmUgdGhlIGV4Y2VwdGlvbi4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlleGNlcHRpb24gPSBlOwkJCQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdlIGNhbid0IHN0b3AgaXQgcmlnaHQgYXdheSBiZWNhdXNlIHdlIGNhbid0IHNlbmQgZXhjZXB0aW9uIG9uLCBob3dldmVyLAotCQkJLy8gd2UgY2FuIGxvZyBpdCBhbmQgc2F2ZSB0aGUgZXhjZXB0aW9uLgotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQl9Ci0JCQkJCi0JLy8gVGhlIG5leHQgZW50cnkgaXMgYW4gYXJyYXkgdG9vIQotCXB1YmxpYyBDb21tYW5kcy5WYWx1ZVNlbmRlciBuZXN0ZWRBcnJheShDb21tYW5kcy5WYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQlCZWFuUHJveHlWYWx1ZVNlbmRlciBzZW5kZXIgPSBuZXcgQmVhblByb3h5VmFsdWVTZW5kZXIoZmFjdG9yeSwgYXJyYXlIZWFkZXIpOwotCQkvLyBUYWtlIHRoZSBuZXdseSBjcmVhdGVkIGFycmF5IGFuZCBwdXQgaXQgaW50byB0aGUgY3VycmVudCBhcnJheS4KLQkJYXJyYXlbaW5kZXgrK10gPSBzZW5kZXIuZ2V0QXJyYXkoKTsKLQkJcmV0dXJuIHNlbmRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9EZWJ1Z01vZGVIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvRGVidWdNb2RlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTkyM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9EZWJ1Z01vZGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBEZWJ1Z01vZGVIZWxwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLS8qKgotICogVGhpcyBpcyBhIGhlbHBlciBmb3IgZGVidWcgbW9kZS4gSXQgYWxsb3dzIGFjY2VzcyB0bwotICogdGhlIHdvcmtiZW5jaCwgaWYgYXZhaWxhYmxlLCBvciBBV1QsIGlmIGF2YWlsYWJsZSwgZm9yCi0gKiB0aGUgZGVidWcgcHJvbXB0cy4gSXQgdXNlcyByZWZsZWN0aW9uIHNvIHRoYXQgbm90aGluZyBpcwotICogZm9yY2VkIHRvIGJlIGxvYWRlZCBvciBwcmUtcmVxZC4gVGhhdCB3YXkgaXQgY2FuIHJ1biBoZWFkbGVzcy4KLSAqLwotCi1jbGFzcyBEZWJ1Z01vZGVIZWxwZXIgewotCWJvb2xlYW4gYXd0ID0gZmFsc2U7Ci0JYm9vbGVhbiBjb25zb2xlID0gZmFsc2U7Ci0JYm9vbGVhbiBzZXR1cCA9IGZhbHNlOwotCWphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIgaW5SZWFkZXIgPSBudWxsOwotCQotCS8vIFdvcmtiZW5jaCByZWZsZWN0aW9ucwotCU9iamVjdCBkaXNwbGF5ID0gbnVsbDsJCi0JQ29uc3RydWN0b3IgY01CID0gbnVsbDsKLQlGaWVsZCBmQXBwTW9kZWwgPSBudWxsOwotCU1ldGhvZCBmYXN5bmMgPSBudWxsOwotCU1ldGhvZCBmc3luYyA9IG51bGw7CQotCU1ldGhvZCBmU2V0VGV4dCA9IG51bGw7Ci0JTWV0aG9kIGZTZXRNZXNzYWdlID0gbnVsbDsKLQlNZXRob2QgZk9wZW4gPSBudWxsOwotCU1ldGhvZCBmR2V0V29ya2JlbmNoID0gbnVsbDsKLQlDbGFzcyBjU1dUID0gbnVsbDsKLQkJCi0JCi0JLy8gQVdUIFJlZmxlY3Rpb25zCi0JQ2xhc3MgY01lc3NhZ2VEaWFsb2cgPSBudWxsOwotCU1ldGhvZCBmRG9pdCA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBUeXBlKCkgewotCQlpZiAoc2V0dXApCi0JCQlyZXR1cm47Ci0JCQkKLQkJc2V0dXAgPSB0cnVlOwotCQkKLQkJLy8gU2VlIGlmIHVzZSBzeXN0ZW0gY29uc29sZSBpbnN0ZWFkLiBJZiBmYWxzZSBvciBub3Qgc2V0LCB0aGVuIHRyeSB0byBxdWVyeSB1c2FnZS4JIAkJCi0JIAljb25zb2xlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkrUHJveHlSZW1vdGVVdGlsLklPX0NPTlNPTEUpKTsgLy8kTk9OLU5MUy0xJAotCSAJaWYgKGNvbnNvbGUpCi0JIAkJcmV0dXJuOwotCQkKLQkJdHJ5IHsJCSAJCQotCQkgCS8vIFNlZSBpZiBQbGF0Zm9ybVVJIHBsdWdpbiBhdmFpbGFibGUuCi0JCSAJQnVuZGxlIHVpQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51aSIpOyAvLyROT04tTkxTLTEkCi0JCSAJaWYgKHVpQnVuZGxlID09IG51bGwpIHsKLQkJIAkJc2V0dXBBV1QoKTsJLy8gVUkgbm90IGF2YWlsYWJsZSwgdHJ5IHRocm91Z2ggQVdULgotCQkgCQlyZXR1cm47Ci0JCSAJfQotCQotCSAJCS8vIFNldHVwIEVjbGlwc2UKLQkJIAlDbGFzcyBjUGxhdGZvcm1VSSA9IHVpQnVuZGxlLmxvYWRDbGFzcygib3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSSIpOyAvLyROT04tTkxTLTEkCi0JCSAJTWV0aG9kIGlzV0JSdW5uaW5nID0gY1BsYXRmb3JtVUkuZ2V0TWV0aG9kKCJpc1dvcmtiZW5jaFJ1bm5pbmciLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkgCWlmICghKChCb29sZWFuKSBpc1dCUnVubmluZy5pbnZva2UobnVsbCwgbnVsbCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCSAJCXNldHVwQVdUKCk7CS8vIFVJIG5vdCBhdmFpbGFibGUsIHRyeSB0aHJvdWdoIEFXVC4KLQkJIAkJcmV0dXJuOwotCQkgCX0KLQkJIAkKLQkJIAlmR2V0V29ya2JlbmNoID0gY1BsYXRmb3JtVUkuZ2V0TWV0aG9kKCJnZXRXb3JrYmVuY2giLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkgCU9iamVjdCB3ID0gZkdldFdvcmtiZW5jaC5pbnZva2UobnVsbCwgbnVsbCk7Ci0KLQkJCWlmICh3ICE9IG51bGwpIHsKLQkgCQkJQ2xhc3MgY0Rpc3BsYXkgPSB1aUJ1bmRsZS5sb2FkQ2xhc3MoIm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkiKTsgLy8kTk9OLU5MUy0xJAotCSAJCQlNZXRob2QgZkdldEN1cnJlbnQgPSBjRGlzcGxheS5nZXRNZXRob2QoImdldEN1cnJlbnQiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCSAJCQlNZXRob2QgZkdldERlZmF1bHQgPSBjRGlzcGxheS5nZXRNZXRob2QoImdldERlZmF1bHQiLCBudWxsKTsJIAkJCSAvLyROT04tTkxTLTEkCi0JIAkJCWZhc3luYyA9IGNEaXNwbGF5LmdldE1ldGhvZCgiYXN5bmNFeGVjIiwgbmV3IENsYXNzW10ge1J1bm5hYmxlLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkgCQkJZnN5bmMgPSBjRGlzcGxheS5nZXRNZXRob2QoInN5bmNFeGVjIiwgbmV3IENsYXNzW10ge1J1bm5hYmxlLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkgCQkJCi0JIAkJCS8vIEdldCB0aGUgZGlzcGxheQotCSAJCQlkaXNwbGF5ID0gZkdldEN1cnJlbnQuaW52b2tlKG51bGwsIG51bGwpOwotCSAJCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCSAJCQkJZGlzcGxheSA9IGZHZXREZWZhdWx0Lmludm9rZShudWxsLCBudWxsKTsKLQkJCX0KLQkJCQotCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkgeyAJCi0JIAkJCUNsYXNzIGNTaGVsbCA9IHVpQnVuZGxlLmxvYWRDbGFzcygib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwiKTsgLy8kTk9OLU5MUy0xJAotCSAJCQlDbGFzcyBjTWVzc2FnZUJveCA9IHVpQnVuZGxlLmxvYWRDbGFzcygib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveCIpOyAvLyROT04tTkxTLTEkCi0JIAkJCWNNQiA9IGNNZXNzYWdlQm94LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtjU2hlbGwsIEludGVnZXIuVFlQRX0pOwotCi0JCQkJZlNldFRleHQgPSBjTWVzc2FnZUJveC5nZXRNZXRob2QoInNldFRleHQiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmU2V0TWVzc2FnZSA9IGNNZXNzYWdlQm94LmdldE1ldGhvZCgic2V0TWVzc2FnZSIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsJCQkJIC8vJE5PTi1OTFMtMSQKLQkJCQlmT3BlbiA9IGNNZXNzYWdlQm94LmdldE1ldGhvZCgib3BlbiIsIG51bGwpOwkJIAkJIC8vJE5PTi1OTFMtMSQJCQkJCi0JCSAJCQkKLQkgCQkJY1NXVCA9IHVpQnVuZGxlLmxvYWRDbGFzcygib3JnLmVjbGlwc2Uuc3d0LlNXVCIpOyAvLyROT04tTkxTLTEkCi0JIAkJCWZBcHBNb2RlbCA9IGNTV1QuZ2V0RmllbGQoIkFQUExJQ0FUSU9OX01PREFMIik7IC8vJE5PTi1OTFMtMSQKLQkJIAl9IGVsc2UgewotCQkgCQlzZXR1cEFXVCgpOwkvLyBVSSBub3QgYXZhaWxhYmxlLCB0cnkgdGhyb3VnaCBBV1QuCi0JCSAJfQotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCXJldHVybjsJCSAJCQkgCQkKLQkJIAkJCQotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEFXVCgpIHsKLQkgCQkKLQkgCS8vIFNlZSBpZiBBV1QgaXMgYXZhaWxhYmxlLgotCSAJdHJ5IHsKLQkJIAljTWVzc2FnZURpYWxvZyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuTWVzc2FnZURpYWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCSAJZkRvaXQgPSBjTWVzc2FnZURpYWxvZy5nZXRNZXRob2QoImRvaXQiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkJIAlhd3QgPSB0cnVlOwotCQkgCXJldHVybjsKLQkgCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCSAJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkgCX0KLSAJCWNvbnNvbGUgPSB0cnVlOwkvLyBObyBBV1QgZWl0aGVyLCBpLmUuIHRydWUgaGVhZGxlc3MgZW52aXJvbm1lbnQKLQl9IAkKLQkKLQlwdWJsaWMgYm9vbGVhbiBkZWJ1Z01vZGUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkgCWJvb2xlYW4gZGVidWdNb2RlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkrUHJveHlSZW1vdGVVdGlsLkRFQlVHX1ZNKSk7IC8vJE5PTi1OTFMtMSQKLQkgCWlmICghZGVidWdNb2RlKQotCSAJCXJldHVybiBkZWJ1Z01vZGU7Ci0JIAkJCi0JIAlzZXR1cFR5cGUoKTsKLQotCQkvLyBTZWUgaWYgdXNlIHN5c3RlbSBjb25zb2xlIGluc3RlYWQuIElmIGZhbHNlIG9yIG5vdCBzZXQsIHRoZW4gdHJ5IHRvIHF1ZXJ5IHVzYWdlLgkgCQkKLQkgCWlmIChjb25zb2xlKQotCSAJCXJldHVybiBkZWJ1Z01vZGVDb25zb2xlKG5hbWUpOwotCSAJCQotCSAJaWYgKGF3dCkKLQkgCQlyZXR1cm4gZGVidWdNb2RlQVdUKG5hbWUpOwotCQkKLQkJdHJ5IHsJCSAJCQotIAkJCWZpbmFsIEZpZWxkIGZZZXMgPSBjU1dULmdldEZpZWxkKCJZRVMiKTsgLy8kTk9OLU5MUy0xJAotIAkJCUZpZWxkIGZObyA9IGNTV1QuZ2V0RmllbGQoIk5PIik7IC8vJE5PTi1OTFMtMSQKLSAJCQlGaWVsZCBmSWNvbiA9IGNTV1QuZ2V0RmllbGQoIklDT05fUVVFU1RJT04iKTsgLy8kTk9OLU5MUy0xJAotCSAJCQkKLSAJCQlmaW5hbCBpbnQgc3R5bGUgPSBmWWVzLmdldEludChudWxsKSB8IGZOby5nZXRJbnQobnVsbCkgfCBmSWNvbi5nZXRJbnQobnVsbCkgfCBmQXBwTW9kZWwuZ2V0SW50KG51bGwpOwkgCQkJCi0gCQkJZmluYWwgYm9vbGVhbltdIGRiID0gbmV3IGJvb2xlYW5bMV07Ci0KLQkJCWZzeW5jLmludm9rZShkaXNwbGF5LCBuZXcgT2JqZWN0W10geyBuZXcgUnVubmFibGUoKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3Qgc2hlbGwgPSBnZXRBY3RpdmVTaGVsbCgpOwotCQkJCQkJT2JqZWN0IG1iID0gY01CLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7c2hlbGwsIG5ldyBJbnRlZ2VyKHN0eWxlKX0pOwkJCQkJCi0JCQkJCQlmU2V0VGV4dC5pbnZva2UobWIsIG5ldyBPYmplY3RbXSB7IkRlYnVnIFJlbW90ZVZNPyJ9KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZlNldE1lc3NhZ2UuaW52b2tlKG1iLCBuZXcgT2JqZWN0W10geyJEbyB5b3Ugd2FudCB0byBzdGFydCB0aGUgcmVtb3RlIHZtICgiK25hbWUrIikgaW4gZGVidWcgbW9kZT8ifSk7CS8vIE5vdCBOTFMnZCBiZWNhdXNlIHRoaXMgaXMgZm9yIGludGVybmFsIGRldmVsb3BlcnMgb25seSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkKLQkJCQkJCWRiWzBdID0gZlllcy5nZXQobnVsbCkuZXF1YWxzKGZPcGVuLmludm9rZShtYiwgbnVsbCkpOwotCQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfX0pOwotCQkgCXJldHVybiBkYlswXTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCXJldHVybiBkZWJ1Z01vZGVBV1QobmFtZSk7Ci0gCX0KLSAJCi0KLQkvKgotCSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGRpc3BsYXkgdGhyZWFkLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0QWN0aXZlU2hlbGwoKSB7Ci0JIAlPYmplY3Qgc2hlbGwgPSBudWxsOwkJCi0JCXRyeSB7Ci0JCQlPYmplY3QgdyA9IGZHZXRXb3JrYmVuY2guaW52b2tlKG51bGwsIG51bGwpOwotCQkJT2JqZWN0IHd3ID0gbnVsbDsKLQkJCWlmICh3ICE9IG51bGwpIHsKLQkJCSAJQ2xhc3MgY1dvcmtiZW5jaCA9IHcuZ2V0Q2xhc3MoKTsKLQkJCSAJTWV0aG9kIGdldFdvcmtiZW5jaFdpbmRvdyA9IGNXb3JrYmVuY2guZ2V0TWV0aG9kKCJnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3ciLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXd3ID0gZ2V0V29ya2JlbmNoV2luZG93Lmludm9rZSh3LCBudWxsKTsKLQkJCX0KLQkJCWlmICh3dyAhPSBudWxsKSB7Ci0JCQkJQ2xhc3MgY1dvcmtiZW5jaFdpbmRvdyA9IHd3LmdldENsYXNzKCk7Ci0JCQkJTWV0aG9kIGdldFNoZWxsID0gY1dvcmtiZW5jaFdpbmRvdy5nZXRNZXRob2QoImdldFNoZWxsIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzaGVsbCA9IGdldFNoZWxsLmludm9rZSh3dywgbnVsbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfQotCSAJCi0JIAlyZXR1cm4gc2hlbGw7Ci0JfQkKLQkJIAkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1Z01vZGVBV1QoU3RyaW5nIG5hbWUpIHsKLQkgCQkKLQkgCS8vIFNlZSBpZiBBV1QgaXMgYXZhaWxhYmxlLgotCSAJdHJ5IHsKLQkJIAlJbnRlZ2VyIHIgPSAoSW50ZWdlcikgZkRvaXQuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IkRlYnVnIFJlbW90ZVZNPyIsICJEbyB5b3Ugd2FudCB0byBzdGFydCB0aGUgcmVtb3RlIHZtICgiK25hbWUrIikgaW4gZGVidWcgbW9kZT8iLCAiWWVzIiwgIk5vIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJIAlyZXR1cm4gci5pbnRWYWx1ZSgpID09IDE7CS8vIGkuZS4gYnV0dG9uMSBvciAieWVzIiB3YXMgaGl0LgotCSAJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JIAl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkgCX0KLQkgCQotIAkJcmV0dXJuIGZhbHNlOwkvLyBObyBBV1QgZWl0aGVyLCBpLmUuIGhlYWRsZXNzIGVudmlyb25tZW50LCBzaG91bGRuJ3Qgb2YgZ290dG9uIGhlcmUuCi0JfSAJCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWdNb2RlQ29uc29sZShTdHJpbmcgbmFtZSkgewotCSAJCQotCSAJLy8gRGVidWcgdGhyb3VnaCB0aGUgY29uc29sZQotIAkJaW5SZWFkZXIgPSBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pOwotIAkJU3lzdGVtLm91dC5wcmludGxuKCJEbyB5b3Ugd2FudCB0byBzdGFydCB0aGUgcmVtb3RlIHZtICgiK25hbWUrIikgaW4gZGVidWcgbW9kZT8gKEVudGVyIFkgb3IgTik6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotIAkJY2hhciByID0gJyAnOwotIAkJdHJ5IHsKLSAJCQlyID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKChjaGFyKSBpblJlYWRlci5yZWFkKCkpOwotIAkJCS8vIE5lZWQgdG8gZmx1c2ggdGhlIGlucHV0IHJlYWRlciBub3cuCi0gCQkJd2hpbGUgKGluUmVhZGVyLnJlYWR5KCkpCi0gCQkJCWluUmVhZGVyLnJlYWQoKTsKLQkJIAlyZXR1cm4gciA9PSAneSc7CS8vIGkuZS4gInkiIHdhcyBlbnRlcmVkLgkgCQkJCi0gCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAJCX0KLQkgCQotIAkJcmV0dXJuIGZhbHNlOwkvLyBFcnJvciByZWFkaW5nLCBzbyBubyBkZWJ1Z2dpbmcuCi0JfSAKLSAJCi0gCS8qKgotIAkgKiBSZXR1cm4gdHJ1ZSBpZiBjb250aW51ZSBkZWJ1Z2dpbmcuCi0gCSAqLwotCXB1YmxpYyBib29sZWFuIHByb21wdFBvcnQoZmluYWwgaW50IGRwb3J0KSB7Ci0gCQlpZiAoYXd0KQotIAkJCXJldHVybiBwcm9tcHRQb3J0QVdUKGRwb3J0KTsKLSAJCWVsc2UgaWYgKGNvbnNvbGUpCi0gCQkJcmV0dXJuIHByb21wdFBvcnRDb25zb2xlKGRwb3J0KTsKLSAJCQkKLSAJCXRyeSB7CQotCQkJZmluYWwgRmllbGQgZk9LID0gY1NXVC5nZXRGaWVsZCgiT0siKTsgLy8kTk9OLU5MUy0xJAotCQkJRmllbGQgZkNhbmNlbCA9IGNTV1QuZ2V0RmllbGQoIkNBTkNFTCIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWVsZCBmSWNvbiA9IGNTV1QuZ2V0RmllbGQoIklDT05fV09SS0lORyIpOyAvLyROT04tTkxTLTEkCi0JIAkJCQotCQkJZmluYWwgaW50IHN0eWxlID0gZk9LLmdldEludChudWxsKSB8IGZDYW5jZWwuZ2V0SW50KG51bGwpIHwgZkljb24uZ2V0SW50KG51bGwpIHwgZkFwcE1vZGVsLmdldEludChudWxsKTsKLQotCQkJZmluYWwgYm9vbGVhbltdIG9rID0gbmV3IGJvb2xlYW5bMV07Ci0JCQlmc3luYy5pbnZva2UoZGlzcGxheSwgbmV3IE9iamVjdFtdIHsgbmV3IFJ1bm5hYmxlKCkgewkKLQkJCQkvKioKLQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCBzaGVsbCA9IGdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkJCQlPYmplY3QgbWIgPSBjTUIubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtzaGVsbCwgbmV3IEludGVnZXIoc3R5bGUpfSk7CQkJCQkKLQkJCQkJCWZTZXRUZXh0Lmludm9rZShtYiwgbmV3IE9iamVjdFtdIHsiQ29ubmVjdCBEZWJ1Z2dlciB0byBSZW1vdGVWTSEifSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZTZXRNZXNzYWdlLmludm9rZShtYiwgbmV3IE9iamVjdFtdIHsiWW91IG11c3Qgbm93IGF0dGFjaCB0aGUgZGVidWdnZXIgdG8gcG9ydCBudW1iZXIgIitkcG9ydCsiLiBQcmVzcyBPSyB3aGVuIHRoZSBkZWJ1Z2dlciBpcyBhdHRhY2hlZC4gVGhlIHByb2dyYW0gd2lsbCBub3QgY29udGludWUgcHJvcGVybHkgd2l0aG91dCB0aGUgZGVidWdnZXIgYmVpbmcgYXR0YWNoZWQuIFByZXNzIENhbmNlbCBpZiB5b3UgY291bGQgbm90IGNvbm5lY3QgdGhlIGRlYnVnZ2VyLiBUaGlzIHdpbGwgc3RpbGwgY2F1c2UgYW4gZXJyb3IsIGJ1dCBpdCB3aWxsIGNsZWFuIHVwIGJldHRlci4ifSk7CS8vIE5vdCBOTFMnZCBiZWNhdXNlIHRoaXMgaXMgZm9yIGludGVybmFsIGRldmVsb3BlcnMgb25seSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW9rWzBdID0gZk9LLmdldChudWxsKS5lcXVhbHMoZk9wZW4uaW52b2tlKG1iLCBudWxsKSk7Ci0JCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9fSk7CQkJCi0JCQlyZXR1cm4gb2tbMF07Ci0gCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0gCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotIAkJfQotIAkJcmV0dXJuIGZhbHNlOwotCX0JIAkKLSAJCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0UG9ydEFXVChpbnQgZHBvcnQpIHsKLQkJdHJ5IHsKLQkJIAlJbnRlZ2VyIHIgPSAoSW50ZWdlcikgZkRvaXQuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IkNvbm5lY3QgRGVidWdnZXIgdG8gUmVtb3RlVk0hIiwgIllvdSBtdXN0IG5vdyBhdHRhY2ggdGhlIGRlYnVnZ2VyIHRvIHBvcnQgbnVtYmVyICIrZHBvcnQrIi4gUHJlc3MgT0sgd2hlbiB0aGUgZGVidWdnZXIgaXMgYXR0YWNoZWQuIFRoZSBwcm9ncmFtIHdpbGwgbm90IGNvbnRpbnVlIHByb3Blcmx5IHdpdGhvdXQgdGhlIGRlYnVnZ2VyIGJlaW5nIGF0dGFjaGVkLiBQcmVzcyBDYW5jZWwgaWYgeW91IGNvdWxkIG5vdCBjb25uZWN0IHRoZSBkZWJ1Z2dlci4gVGhpcyB3aWxsIHN0aWxsIGNhdXNlIGFuIGVycm9yLCBidXQgaXQgd2lsbCBjbGVhbiB1cCBiZXR0ZXIuIiwgIk9LIiwgIkNhbmNlbCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCSAJcmV0dXJuIHIuaW50VmFsdWUoKSA9PSAxOwkvLyBpLmUuIGJ1dHRvbjEgb3IgIk9LIiB3YXMgaGl0LgotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLSAJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkgCQotIAlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRQb3J0Q29uc29sZShpbnQgZHBvcnQpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJZb3UgbXVzdCBub3cgYXR0YWNoIHRoZSBkZWJ1Z2dlciB0byBwb3J0IG51bWJlciAiK2Rwb3J0KyIuIEVudGVyICd5JyB3aGVuIHRoZSBkZWJ1Z2dlciBpcyBhdHRhY2hlZC4gVGhlIHByb2dyYW0gd2lsbCBub3QgY29udGludWUgcHJvcGVybHkgd2l0aG91dCB0aGUgZGVidWdnZXIgYmVpbmcgYXR0YWNoZWQuIFByZXNzICduJyBpZiB5b3UgY291bGQgbm90IGNvbm5lY3QgdGhlIGRlYnVnZ2VyLiBUaGlzIHdpbGwgc3RpbGwgY2F1c2UgYW4gZXJyb3IsIGJ1dCBpdCB3aWxsIGNsZWFuIHVwIGJldHRlci4gRW50ZXIgJ3knIG9yICduJzoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWNoYXIgciA9ICcgJzsKLQkJdHJ5IHsKLQkJCXIgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGluUmVhZGVyLnJlYWQoKSk7Ci0gCQkJd2hpbGUgKGluUmVhZGVyLnJlYWR5KCkpCi0gCQkJCWluUmVhZGVyLnJlYWQoKTsKLQkJCXJldHVybiByID09ICd5JzsJLy8gaS5lLiAieSIgd2FzIGVudGVyZWQsIGdvIG9uCi0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQl9Ci0gCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5IGFuIGVycm9yIG1zZy4gVGhlcmUgd2lsbCBvbmx5IGJlIGFuIE9LIGJ1dHRvbi4KLQkgKiBUaGlzIHdpbGwgYWx3YXlzIGRpc3BsYXksIGRlYnVnIG1vZGUgd29uJ3QgYmUgbG9va2VkIGF0LgotCSAqIFRoaXMgaXMgZm9yIGVycm9ycy4gVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBhc3luYywgc28gdGhpcwotCSAqIG1heSByZXR1cm4gYmVmb3JlIHRoZSBtc2cgaGFzIGJlZW4gZGlzcGxheWVkIGFuZCBhbnN3ZXJlZCwKLQkgKiBidXQgc2luY2UgdGhlIG9ubHkgcmVzcG9uc2UgaXMgT0ssIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3JNZXNzYWdlKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZykgewotCQlzZXR1cFR5cGUoKTsKLQkJaWYgKGNvbnNvbGUpCi0JCQlkaXNwbGF5RXJyb3JNZXNzYWdlQ29uc29sZSh0aXRsZSwgbXNnKTsKLQkJZWxzZSBpZiAoYXd0KQotCQkJZGlzcGxheUVycm9yTWVzc2FnZUFXVCh0aXRsZSwgbXNnKTsKLQkJZWxzZSB7Ci0JCQl0cnkgeyAvLyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gZGlzcGxheSB0aHJlYWQuCi0JCQkJRmllbGQgZk9LID0gY1NXVC5nZXRGaWVsZCgiT0siKTsgLy8kTk9OLU5MUy0xJAotCQkJCUZpZWxkIGZJY29uID0gY1NXVC5nZXRGaWVsZCgiSUNPTl9FUlJPUiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlmaW5hbCBpbnQgc3R5bGUgPSBmT0suZ2V0SW50KG51bGwpIHwgZkljb24uZ2V0SW50KG51bGwpIHwgZkFwcE1vZGVsLmdldEludChudWxsKTsKLQkJCQlmYXN5bmMuaW52b2tlKGRpc3BsYXksIG5ldyBPYmplY3RbXSB7IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCS8qKgotCQkJCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeyB0cnkgeyBPYmplY3Qgc2hlbGwgPSBnZXRBY3RpdmVTaGVsbCgpOwotCQkJCQkJCQlPYmplY3QgbWIgPSBjTUIubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgc2hlbGwsIG5ldyBJbnRlZ2VyKHN0eWxlKX0pOwotCi0JCQkJCQkJCWZTZXRUZXh0Lmludm9rZShtYiwgbmV3IE9iamVjdFtdIHsgdGl0bGUgfSk7Ci0JCQkJCQkJCWZTZXRNZXNzYWdlLmludm9rZShtYiwgbmV3IE9iamVjdFtdIHsgbXNnIH0pOwotCQkJCQkJCQlmT3Blbi5pbnZva2UobWIsIG51bGwpOwotCQkJCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0JCi0JCi0gCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlFcnJvck1lc3NhZ2VDb25zb2xlKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICIgKyBtc2cpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlFcnJvck1lc3NhZ2VBV1QoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCXRyeSB7Ci0JCSAJZkRvaXQuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7dGl0bGUsIG1zZywgUHJveHlSZW1vdGVNZXNzYWdlcy5PS183LCBudWxsfSk7IAotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZWE0OTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBJUkVNQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBBIFJlbW90ZSBWTSBwcm94eS4gQWxsIElCZWFuUHJveHkgaW1wbGVtZW50YXRpb25zCi0gKiBmb3IgdGhlIFJlbW90ZSBWTSBtdXN0IGFsc28gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHByb3BlciBmdW5jdGlvbmluZy4KLSAqCi0gKiBOT1RFOiBUaGlzIGlzIGFuIGludGVybmFsIGludGVyZmFjZSB0byB0aGUgUmVtb3RlIFZNIFByb3h5LgotICogSXQgTVVTVCBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBwcm94eSBmYWN0b3J5IGZhbWlseS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1CZWFuUHJveHkgZXh0ZW5kcyBJQmVhblByb3h5IHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIElEIG9mIHRoaXMgcHJveHkKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpOwotCQotCS8qKgotCSAqIFByb3h5IGlzIGFib3V0IHRvIGJlIHJlbGVhc2VkLCBNVVNUIG1hcmsgaXQgaW52YWxpZC4KLQkgKiBUaGlzIGlzIHJlcXVpcmVkLiBSZXNvdXJjZXMgY2FuIGFsc28gYmUgY2xlYW5lZCB1cAotCSAqIGlmIHRoZXkgYXJlIGJlaW5nIGhlbGQgYW5kIG5lZWQgdG8gYmUgY2xlYW5lZCB1cC4KLQkgKgotCSAqIE5PVEU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgcHJveHkKLQkgKiBpcyBleHBsaWNpdGx5IHJlbGVhc2VkLiBJZiBpdCBpcyBzaW1wbHkgZ2FyYmFnZSBjb2xsZWN0ZWQsCi0JICogdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQuIFNpbXBsZSBnYXJiYWdlIGNvbGxlY3Rpb24KLQkgKiBtZWFucyB0aGF0IG5vIG9uZSBpcyByZWZlcmVuY2luZyB0aGlzIHByb3h5LiBUaGUgcHJveHkgZmFjdG9yeQotCSAqIHdpbGwga25vdyB3aGF0IGlkIHRoaXMgcHJveHkgd2FzIHJlZmVyZW5jaW5nIGFuZCB3aWxsIHJlbGVhc2UgaXQKLQkgKiBvbiB0aGUgc2VydmVyIGF0IEdDIHRpbWUuCi0JICoKLQkgKiBJZiB0aGVyZSBhcmUgcmVzb3VyY2VzCi0JICogdGhhdCBhYnNvbHV0ZWx5IG11c3QgYmUgcmVsZWFzZWQsIHRoZW4gdGhlIGZpbmFsaXplIG1ldGhvZAotCSAqIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBkbyB0aGUgY2xlYW4gdXAuIEhvd2V2ZXIsIHRyeSBub3QKLQkgKiB0byBoYXZlIHRoaXMgYmUgdGhlIGNhc2UuIEZpbmFsaXplIG1ldGhvZHMgYWRkIG92ZXJoZWFkIHRoYXQgaXMKLQkgKiB1c3VhbGx5IGJldHRlciBub3QgdG8gaGF2ZS4gVGhlIGJldHRlciB3YXkgaXMgZm9yIGFueSB1c2VycwotCSAqIHRoYXQgZ2V0IHRoaXMga2luZCBvZiBwcm94eSBvYmplY3Qga25vdyB0byBjYWxsIHJlbGVhc2Ugb24KLQkgKiBQcm94eUZhY3RvcnlSZWdpc3RyeSB0byByZWxlYXNlIGl0IGJlZm9yZSBnYXJiYWdlIGNvbGxlY3Rpb24uCSAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci0JCi0JLyoqCi0JICogUmVuZGVyIHRoaXMgYmVhbiBmb3IgdHJhbnNwb3J0IHRvIHRoZSBzZXJ2ZXIgaW50byBhIENvbW1hbmRzLlZhbHVlT2JqZWN0LgotCSAqIEZvciBleGFtcGxlLCBhIHN0cmluZyBtYXkgcHV0IGEgc3RyaW5nLiBBbiBpZCB0eXBlIG1heSBwdXQgb3V0IHRoZSBpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHJlbmRlckludG8pOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBmYzRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSRU1CZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBBbGwgYmVhbiB0eXBlIHByb3hpZXMgaW4gcmVtb3RlIHZtIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICoKLSAqIE5PVEU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSBSZW1vdGUgVk0gUHJveHkuCi0gKiBJdCBNVVNUIG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIHByb3h5IGZhY3RvcnkgZmFtaWx5LiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUkVNQmVhblR5cGVQcm94eSBleHRlbmRzIElCZWFuVHlwZVByb3h5LCBJUkVNQmVhblByb3h5IHsKLQkKLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKTsKLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1CZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzNzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIEludGVyZmFjZSBmb3IgUmVtb3RlIFZNIEJlYW4gVHlwZSBQcm94eSBGYWN0b3JpZXMuCi0gKiBBbGwgZXh0ZW5zaW9uIGZhY3RvcmllcyBmb3IgUmVtb3RlIFZNIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5IGV4dGVuZHMgSUJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLS8qKgotICogUmV0dXJuIGEgYmVhbiB0eXBlIHByb3h5IGZvciB0aGUgY2xhc3MgbmFtZS4KLSAqIFJldHVybiBudWxsIGlmIHRoZSBleHRlbnNpb24gZmFjdG9yeSBkb2Vzbid0IGhhbmRsZSB0aGlzIGNsYXNzLgotICogRG9uJ3QgcmVnaXN0ZXIgYW55IHByb3hpZXMgcmV0dXJuZWQsIHRoZXkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlZ2lzdGVyZWQuCi0gKiBUaGlzIHNob3VsZCBvbmx5IHJldHVybiBiZWFuIHR5cGUgcHJveGllcyB3aGVyZSB0aGUgZmFjdG9yeSBjYW4gZGV0ZXJtaW5lCi0gKiBldmVyeXRoaW5nIGl0IG5lZWRzLCBzdWNoIGFzIHN1cGVydHlwZSBhbmQgY2xhc3NJRC4KLSAqIE5PVEU6IFRoaXMgaXMgaW1wbGVtZW50ZWQgZm9yIHRoZSB1c2FnZSBvZiB0aGUKLSAqICAgICAgIHN0YW5kYXJkIEJlYW5UeXBlIHByb3h5IGZhY3RvcnkuIEl0IHNob3VsZAotICogICAgICAgTk9UIGJlIGNhbGxlZCBieSBhbnlvbmUgZWxzZS4gVGhleSBzaG91bGQKLSAqICAgICAgIGdvIHRocm91Z2ggdGhlIElTdGFuZGFyZEJlYW5UeXBlRmFjdG9yeQotICogICAgICAgaW5zdGVhZC4gVGhlIHN0YW5kYXJkIGJlYW4gdHlwZSBmYWN0b3J5Ci0gKiAgICAgICB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgb24gdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICBleHRlbnNpb24gd2hlbiBpdCBuZWVkcyB0by4KLSAqCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjI2OjEyIFBNKQotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUpOwkKLQotLyoqCi0gKiBSZXR1cm4gYSBiZWFuIHR5cGUgcHJveHkgZm9yIHRoZSBjbGFzcyBuYW1lLgotICogUmV0dXJuIG51bGwgaWYgdGhlIGV4dGVuc2lvbiBmYWN0b3J5IGRvZXNuJ3QgaGFuZGxlIHRoaXMgY2xhc3MuCi0gKiBEb24ndCByZWdpc3RlciBhbnkgcHJveGllcyByZXR1cm5lZCwgdGhleSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVnaXN0ZXJlZC4KLSAqIFRoaXMgc2hvdWxkIG9ubHkgcmV0dXJuIGJlYW4gdHlwZSBwcm94aWVzIHdoZXJlIHRoZSBmYWN0b3J5IGNhbiBkZXRlcm1pbmUKLSAqIGV2ZXJ5dGhpbmcgaXQgbmVlZHMsIHN1Y2ggYXMgc3VwZXJ0eXBlIGFuZCBjbGFzc0lELgotICogTk9URTogVGhpcyBpcyBpbXBsZW1lbnRlZCBmb3IgdGhlIHVzYWdlIG9mIHRoZQotICogICAgICAgc3RhbmRhcmQgQmVhblR5cGUgcHJveHkgZmFjdG9yeS4gSXQgc2hvdWxkCi0gKiAgICAgICBOT1QgYmUgY2FsbGVkIGJ5IGFueW9uZSBlbHNlLiBUaGV5IHNob3VsZAotICogICAgICAgZ28gdGhyb3VnaCB0aGUgSVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5Ci0gKiAgICAgICBpbnN0ZWFkLiBUaGUgc3RhbmRhcmQgYmVhbiB0eXBlIGZhY3RvcnkKLSAqICAgICAgIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCBvbiB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgIGV4dGVuc2lvbiB3aGVuIGl0IG5lZWRzIHRvLgotIAotICogQHBhcmFtIHR5cGVOYW1lCi0gKiBAcGFyYW0gZXhwcmVzc2lvbgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIElQcm94eUJlYW5UeXBlIGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotLyoqCi0gKiBSZXR1cm4gYSBiZWFuIHR5cGUgcHJveHkgZm9yIHRoZSBjbGFzcyBpZCBhbmQgY2xhc3MgbmFtZS4KLSAqIFJldHVybiBudWxsIGlmIHRoZSBleHRlbnNpb24gZmFjdG9yeSBkb2Vzbid0IGhhbmRsZSB0aGlzIGNsYXNzLiAKLSAqIERvbid0IHJlZ2lzdGVyIGFueSBwcm94aWVzIHJldHVybmVkLCB0aGV5IHdpbGwgYXV0b21hdGljYWxseSBiZSByZWdpc3RlcmVkLiAKLSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGNhc2UgdGhhdCBhIG5ldyBjbGFzcyBpZCB3YXMgcmV0dXJuZWQKLSAqIGZyb20gdGhlIHNlcnZlciB0aGF0IHdlIGRvbid0IGhhdmUgcmVnaXN0ZXJlZCB5ZXQuIEltcGxlbWVudGVycyB3aWxsCi0gKiBjcmVhdGVkIGEgcHJveHkgb3V0IG9mIHRoZSBuYW1lIGFuZCB0aGUgaWQgYW5kIHJldHVybiBpdC4KLSAqIFRoZSBzdXBlcnR5cGUgd2lsbCBiZSBwYXNzZWQgaW4gc28gdGhhdCB0aGUgZXh0ZW5zaW9uIGZhY3RvcnkgZG9lc24ndCBuZWVkIHRvCi0gKiB0cnkgdG8gZmluZCBpdC4KLSAqIE5PVEU6IFRoaXMgaXMgaW1wbGVtZW50ZWQgZm9yIHRoZSB1c2FnZSBvZiB0aGUKLSAqICAgICAgIHN0YW5kYXJkIEJlYW5UeXBlIHByb3h5IGZhY3RvcnkuIEl0IHNob3VsZAotICogICAgICAgTk9UIGJlIGNhbGxlZCBieSBhbnlvbmUgZWxzZS4gVGhleSBzaG91bGQKLSAqICAgICAgIGdvIHRocm91Z2ggdGhlIElTdGFuZGFyZEJlYW5UeXBlRmFjdG9yeQotICogICAgICAgaW5zdGVhZC4gVGhlIHN0YW5kYXJkIGJlYW4gdHlwZSBmYWN0b3J5Ci0gKiAgICAgICB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgb24gdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICBleHRlbnNpb24gd2hlbiBpdCBuZWVkcyB0by4KLSAqCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjI2OjEyIFBNKQotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgdHlwZU5hbWUsIEludGVnZXIgY2xhc3NJRCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKTsJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjY1MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSRU1Db25uZWN0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEludGVyZmFjZSBmb3IgdGhlIFJlbW90ZSBWTSBDb25uZWN0aW9uIG9iamVjdC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1Db25uZWN0aW9uIHsKLQkKLQkvKioKLQkgKiBEaWQgdGhpcyBjb25zdHJ1Y3QgY29ycmVjdGx5LgotCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgYW4gZXhjZXB0aW9uIGNvdWxkIGJlIHRocm93biBpbiB0aGUgY3RvciBhbmQKLQkgKiB0aGF0J3Mgbm90IGEgZ29vZCB0aGluZyB0byBkby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOwotCQotCS8qKgotCSAqIFRlcm1pbmF0ZSB0aGUgc2VydmVyLgotCSAqIFdBUk5JTkc6IFRoaXMgaXMgb25seSBoZXJlIHNvIHRoYXQgZmFjdG9yeSBjYW4gdG8gaXQuIFRlcm1pbmF0aW9uIHNob3VsZCBPTkxZCi0JICogYmUgZG9uZSBieSB0aGUgRmFjdG9yeSBub3QgYW55IG9uZSBlbHNlLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVTZXJ2ZXIoKTsKLQkJCQotCS8qKgotCSAqIENsb3NlIHRoZSBjb25uZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyBpbmZvcm1hdGlvbi4gTnVsbCByZXR1cm4gaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kcy5HZXRDbGFzc1JldHVybiBnZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldCB0aGUgY2xhc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgaWQuIAotCSAqLwotCSBwdWJsaWMgQ29tbWFuZHMuR2V0Q2xhc3NJRFJldHVybiBnZXRDbGFzc0Zyb21JRChpbnQgY2xhc3NJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0KLQkKLQotCS8qKgotCSAqIEdldCBvYmplY3QgZGF0YSBmcm9tIGFuIGlkLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBnZXRPYmplY3REYXRhKGludCBvYmplY3RJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCQkKLQkvKioKLQkgKiBHZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXROZXdJbnN0YW5jZShpbnQgY2xhc3NJRCwgU3RyaW5nIGluaXRTdHJpbmcsIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5ld0luc3RhbmNlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkJCi0JLyoqCi0JICogSW52b2tlIHRoZSBnZXQgYXJyYXkgY29udGVudHMgY29tbWFuZC4KLQkgKiBAcGFyYW0gYXJyYXlJRAotCSAqIEBwYXJhbSByZXR1cm5WYWx1ZQotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGdldEFycmF5Q29udGVudHMoaW50IGFycmF5SUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCBjYWxsLgotCSAqIFRoZSBwYXJtcyB2YWx1ZU9iamVjdCBtdXN0IHJlcHJlc2VudCBhbiBPYmplY3RbXSAoZWl0aGVyIHRocm91Z2ggQVJSQVlfSURTIG9yIE9CSkVDVCkKLQkgKi8JCi0JcHVibGljIHZvaWQgaW52b2tlTWV0aG9kKGludCBtZXRob2RJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgaW52b2tlT24sIENvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zLCBDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCBjYWxsIHdpdGggbWV0aG9kIHBhc3NlZC4KLQkgKiBUaGUgcGFybXMgdmFsdWVPYmplY3QgbXVzdCByZXByZXNlbnQgYW4gT2JqZWN0W10gKGVpdGhlciB0aHJvdWdoIEFSUkFZX0lEUyBvciBPQkpFQ1QpCi0JICovCQotCXB1YmxpYyB2b2lkIGludm9rZU1ldGhvZChDb21tYW5kcy5WYWx1ZU9iamVjdCBjbGFzc1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtVHlwZXMsIENvbW1hbmRzLlZhbHVlT2JqZWN0IGludm9rZU9uLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtcywgQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVsZWFzZSB0aGUgaWQuIEl0IGlzIG5vIGxvbmdlciBuZWVkZWQgb24gdGhlIGNsaWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlSUQoaW50IGlkKTsKLQkKLQkvKioKLQkgKiBSZWFkIGFycmF5IHZhbHVlcyBhcyBCZWFuUHJveGllcyBpbnRvIHZhbHVlU2VuZGVyLgotCSAqIEBwYXJhbSByZXR1cm5WYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZVNlbmRlcgotCSAqIEBwYXJhbSBhbGxvd0ZsYWcgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgRkxBRyB2YWx1ZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QgYWxsb3cgZmxhZyB2YWx1ZXMuCi0JICogCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVhZFByb3h5QXJyYXlWYWx1ZXMoQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUsIENvbW1hbmRzLlZhbHVlU2VuZGVyIHZhbHVlU2VuZGVyLCBib29sZWFuIGFsbG93RmxhZykgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQ29uc3RhbnRCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkYWFlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogSVJFTUNvbnN0YW50QmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLS8qKgotICogVGFnIGludGVyZmFjZSB0byBpbmRpY2F0ZSB0aGlzIHByb3h5IGlzIGEgY29uc3RhbnQgcHJveHksIGkuZS4gdGhlcmUKLSAqIGlzIG5vIGJlYW4gb24gdGhlIHNlcnZlciByZXByZXNlbnRpbmcgdGhpcyAoZS5nLiBTdHJpbmdzIGFuZCBJbnRlZ2VycykuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUkVNQ29uc3RhbnRCZWFuUHJveHkgZXh0ZW5kcyBJUkVNQmVhblByb3h5IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25zdGFudEJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhNzM1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1Db25zdGFudEJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIGFueSBCZWFuVHlwZSB0aGF0IHJlcHJlc2VudHMgYSBjb25zdGFudCB0eXBlIGJlYW4uCi0gKiBUaGVzZSBhcmUgdHlwZXMgdGhhdCBhcmUgaW1tdXRhYmxlIGFuZCBhIGNvcHkgb2YgdGhlIGFjdHVhbCB2YWx1ZSBpcyBrZXB0IGhlcmUKLSAqIGluIHRoZSBjbGllbnQgYW5kIG5vdCBzdG9yZWQgYXMgYW4gb2JqZWN0IGlkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSBleHRlbmRzIElCZWFuVHlwZVByb3h5IHsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1FeHByZXNzaW9uQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlMDQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1FeHByZXNzaW9uQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0gCi0vKioKLSAqIEFkZGl0aW9uYWwgZnVuY3Rpb24gb24gYSBjb25uZWN0aW9uIGZvciBleHByZXNzaW9uIHRyZWUgcHJvY2Vzc2luZy4KLSAqIENvbm5lY3Rpb25zIHJldHVybmVkIChJUkVNQ29ubmVjdGlvbnMpIHdpbGwgYWx3YXlzIGFsc28gaW1wbGVtZW50IElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiwKLSAqIGJ1dCB0aGV5IGFyZSBzZXBhcmF0ZWQgc28gdGhhdCBleHByZXNzaW9uIGZ1bmN0aW9ucyBkb24ndCBwb2xsdXRlIHRoZSByZWd1bGFyCi0gKiBjb25uZWN0aW9uIGludGVyZmFjZSB3aXRoIGFkZGVkIGNvbW1hbmRzIHRoYXQgc2hvdWxkbid0IGJlIGNhbGxlZCBleGNlcHQKLSAqIHdoZW4gcHJvY2Vzc2luZyBhbiBleHByZXNzaW9uLiBJZiB0aGV5IHdlcmUgY2FsbGVkIG91dCBvZiBvcmRlciwgYmlnIHByb2JsZW1zCi0gKiBjYW4gb2NjdXIuCi0gKiA8cD4KLSAqIFRvIHVzZSwgc2ltcGx5IGNhc3QgdGhlIElSRU1Db25uZWN0aW9uIHRvIGJlIGFuIElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGV4dGVuZHMgSVJFTUNvbm5lY3Rpb24gewotCQotCS8qKgotCSAqIFN0YXJ0IGV4cHJlc3Npb24gcHJvY2Vzc2luZy4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIEBwYXJhbSB0cmFjZSBUT0RPCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RXhwcmVzc2lvblByb2Nlc3NpbmcoaW50IGV4cHJlc3Npb25JRCwgYnl0ZSB0cmFjZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFRyYW5zZmVyIHRoZSBleHByZXNzaW9uLiBUaGlzIHRlbGxzIHRoZSByZW1vdGUgdm0gdG8gc3RvcCBwcm9jZXNzaW5nIG9uIHRoZQotCSAqIGdpdmVuIGNvbm5lY3Rpb24gYW5kIHJldHVybiB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGNvbnRyb2xsZXIgZm9yIHRoZSBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQKLQkgKiBAcGFyYW0gZXhwQ29udHJvbGxlcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2ZlckV4cHJlc3Npb24oaW50IGV4cHJlc3Npb25JRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgZXhwQ29udHJvbGxlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVzdW1lIHRoZSBleHByZXNzaW9uIG9uIHRoaXMgY29ubmVjdGlvbi4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklECi0JICogQHBhcmFtIGV4cENvbnRyb2xsZXIgZXhwcmVzc2lvbiBwcm9jZXNzb3IgY29udHJvbGxlciB0byB1c2UgZm9yIHRoZSBleHByZXNzaW9uIG9uIHRoaXMgbmV3IGNvbm5lY3Rpb24uCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZUV4cHJlc3Npb24oaW50IGV4cHJlc3Npb25JRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgZXhwQ29udHJvbGxlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUHVzaCBhbiBleHByZXNzaW9uIGNvbW1hbmQuIFRoaXMgaXMgdGhlIGNvbW1vbiBwb3J0aW9uIG9mIHRoZQotCSAqIHN1YmNvbW1hbmQuIFRoZSBhY3R1YWwgZGF0YSBvZiB0aGUgY29tbWFuZCB3aWxsIGJlIHNlcGFyYXRlbHkgZG9uZS4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIEBwYXJhbSBzdWJjb21tYW5kIFRoZSBzdWJjb21tYW5kIGJlaW5nIHNlbnQuIEZyb20gSUludGVybmFsRXhwcmVzc2lvbkNvbnN0YW50cy4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLklJbnRlcm5hbEV4cHJlc3Npb25Db25zdGFudHMjUFVTSF9UT19QUk9YWV9FWFBSRVNTSU9OCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEV4cHJlc3Npb25Db21tYW5kKGludCBleHByZXNzaW9uSUQsIGJ5dGUgc3ViY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFB1c2ggdGhlIHZhbHVlIG9iamVjdCB0byB0aGUgcmVtb3RlIHNpZGUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlT2JqZWN0Ci0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcHVzaFZhbHVlT2JqZWN0KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFB1c2gganVzdCB0aGUgc2luZ2xlIGJ5dGUgdG8gdGhlIHJlbW90ZSBzaWRlLgotCSAqIEBwYXJhbSBhYnl0ZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoQnl0ZShieXRlIGFieXRlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUHVzaCBqdXN0IHRoZSBzaW5nbGUgaW50IHRvIHRoZSByZW1vdGUgc2lkZS4KLQkgKiAKLQkgKiBAcGFyYW0gYW5JbnQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEludChpbnQgYW5JbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkKLQkvKioKLQkgKiBQdXNoIGp1c3QgdGhlIHNpbmdlIHN0cmluZyB0byB0aGUgcmVtb3RlIHNpZGUuCi0JICogCi0JICogQHBhcmFtIGFTdHJpbmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcHVzaFN0cmluZyhTdHJpbmcgYVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFB1c2gganVzdCB0aGUgYm9vbCB0byB0aGUgcmVtb3RlIHNpZGUuCi0JICogQHBhcmFtIGFCb29sCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hCb29sZWFuKGJvb2xlYW4gYUJvb2wpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGZpbmFsIHZhbHVlLiBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciBwcm9jZXNzaW5nIHRoZSBwcm94eSBpZCByZXNvbHV0aW9ucyBldmVuIGZvciBzeW5jIChzbyB0aGF0IHdlIGNhbiBnZXQKLQkgKiBhbnkgdGhyb3duIGVycm9ycykuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGdldEZpbmFsVmFsdWUoQ29tbWFuZHMuVmFsdWVPYmplY3QgcmVzdWx0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBwdWxsIHZhbHVlIGNvbW1hbmQsIHdpdGggdGhlIHByb3h5aWRzIG9mIGludGVyZXNldC4gSWYgYW4gZXJyb3IKLQkgKiBvY2N1cnMsIGNvbW1hbmQgZXhjZXB0aW9uIGlzIHRocm93bi4gCi0JICogPHA+Ci0JICogQWZ0ZXIgdGhlIHB1bGwgdmFsdWUgY2FsbCwgaWYgbm8gZXJyb3JzLCB0aGUgcHJveHlpZHMgbXVzdCBiZSByZWFkLCBhbmQgdGhlbiBnZXRGaW5hbFZhbHVlIGNhbGwgbXVzdCBiZSBzZW50LgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQKLQkgKiBAcGFyYW0gcHJveHlpZHMgZXhwcmVzc2lvbiBwcm94eWlkcyB0aGF0IHJlcXVlc3QgZmVlZGJhY2sgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgaWRzLgotCSAqIEBwYXJhbSBzZW5kZXIgc2VuZGVyIHRvIHVzZSB0byBwcm9jZXNzIHRoZSByZXR1cm5lZCBwcm94eSBpZHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGV4cGVjdGluZyBubyBwcm94eSByZXNvbHV0aW9ucy4KLQkgKiAKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWxsVmFsdWUoaW50IGV4cHJlc3Npb25JRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgcHJveHlpZHMsIENvbW1hbmRzLlZhbHVlU2VuZGVyIHNlbmRlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogU2VuZCB0aGUgc3luYyBjb21tYW5kLCB3aXRoIHRoZSBwcm94eWlkcyBvZiBpbnRlcmVzZXQuIElmIGFuIGVycm9yCi0JICogb2NjdXJzLCBjb21tYW5kIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogPHA+Ci0JICogQWZ0ZXIgdGhlIHN5bmMgY2FsbCwgaWYgbm8gZXJyb3JzLCB0aGUgcmV0dXJuZWQgcHJveHlpZHMgbXVzdCBiZSBwcm9jZXNzZWQgYW5kIHRoZW4gdGhlIGZpbmFsIGVuZFZhbHVlIGNhbGwgbXVzdCBiZSBzZW50LgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQgCi0JICogQHBhcmFtIHByb3h5aWRzIGV4cHJlc3Npb24gcHJveHlpZHMgdGhhdCByZXF1ZXN0IGZlZWRiYWNrIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb3h5IGlkcy4KLQkgKiBAcGFyYW0gc2VuZGVyIHNlbmRlciB0byB1c2UgdG8gcHJvY2VzcyB0aGUgcHJveHkgaWQgcmVzb2x1dGlvbnMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGV4cGVjdGluZyBubyBwcm94eSBpZHMuCi0JICogCi0JICogQHRocm93cyBDb21tYW5kRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc3luYyhpbnQgZXhwcmVzc2lvbklELCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcywgQ29tbWFuZHMuVmFsdWVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbjsJCi0JCi0JLyoqCi0JICogU3RvcCBleHByZXNzaW9uIHByb2Nlc3NpbmcuCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRCAKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc3RvcEV4cHJlc3Npb25Qcm9jZXNzaW5nKGludCBleHByZXNzaW9uSUQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNTWV0aG9kUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTU1ldGhvZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MjEyMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9JUkVNTWV0aG9kUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElSRU1NZXRob2RQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZm9yIFJFTU1ldGhvZFByb3h5IGFsbG93cyB0aGUgaW52b2thdGlvbiB3aGVyZQotICogdGhlIHBhcm1zIGFyZSBhIG1peHR1cmUgb2YgY29uc3RhbnQgb2JqZWN0cyAoaS5lLiBjYW4gYmUgc2VudAotICogYXMgdmFsdWVzIHRvIHRoZSBjbGllbnQpIGFuZCBJQmVhblByb3hpZXMuIEl0IGlzIG9ubHkgdG8gYmUKLSAqIHVzZWQgYnkgb3RoZXIgZmFjdG9yaWVzIHRoYXQgd2FudCB0byBpbnZva2UgbWV0aG9kcyB3aGVyZQotICogc29tZSBvZiB0aGUgcGFybXMgYXJlIGNvbnN0YW50cyBzbyB0aGF0IHRoZXJlIGlzIG5vIG5lZWQKLSAqIGNyZWF0ZSBJQmVhblByb3hpZXMgZm9yIHRoZW0sIGUuZy4gU3RyaW5nLiBUaGlzIHNob3VsZCBiZQotICogdXNlZCB3aXRoIGV4dHJlbWUgY2FyZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSRU1NZXRob2RQcm94eSBleHRlbmRzIElNZXRob2RQcm94eSwgSVJFTUJlYW5Qcm94eSB7Ci0JcHVibGljIElCZWFuUHJveHkgaW52b2tlV2l0aFBhcm1zKElCZWFuUHJveHkgc3ViamVjdCwgT2JqZWN0W10gcGFybXMpIHRocm93cyBUaHJvd2FibGVQcm94eTsKLQkKLQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0lSRU1TcGVjaWFsQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk3NGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLS8qKgotICogVGhpcyBpcyBhIHNwZWNpYWwgaW50ZXJmYWNlIGZvciBhbGxvd2luZyBhYnN0cmFjdAotICogdHlwZXMgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IHN1YmNsYXNzIHR5cGVzLgotICogT25seSBvbmVzIHRoYXQgdXNlIFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5Ci0gKiBzaG91bGQgaW1wbGVtZW50IHRoaXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQkKLQkvKioKLQkgKiBDYWxsZWQgYnkgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgaXQuCi0JICogVGhpcyBhbGxvd3MgY29ycmVjdCB0eXBlcyB0byBiZSBjcmVhdGVkIGRlcGVuZGluZyB1cG9uIHRoZQotCSAqIG1haW4gc3VwZXIgdHlwZS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QsIElCZWFuVHlwZVByb3h5IHN1cGVyVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL0xvY2FsRmlsZUNvbmZpZ3VyYXRpb25Db250cmlidXRvckNvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDY2ZGI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IExvY2FsRmlsZUNvbmZpZ3VyYXRpb25Db250cmlidXRvckNvbnRyb2xsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTEgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0gCi0vKioKLSAqIFRoaXMgdmVyc2lvbiB3b3JrcyB3aXRoIGxvY2FsIGZpbGVzIGJlaW5nIGFkZGVkIHRvIHRoZSBjbGFzc3BhdGgsIGFuZCB0aGUgY2xhc3NwYXRoIGlzIHN0cmluZ3MuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciB7Ci0JCi0JcHJpdmF0ZSBVUkxbXSBjbGFzc3BhdGhJbmZvOwotCXByaXZhdGUgVVJMW11bXSBib290cGF0aEluZm87Ci0JcHJpdmF0ZSBMaXN0IGNsYXNzcGF0aDsKLQlwcml2YXRlIExpc3QgcHJlcGVuZEJvb3RwYXRoOwotCXByaXZhdGUgTGlzdCBhcHBlbmRCb290cGF0aDsKLQlwcml2YXRlIExpc3QgamF2YUxpYnJhcnlQYXRoOwotCXByaXZhdGUgUHJveHlMYXVuY2hTdXBwb3J0LkxhdW5jaEluZm8gbGF1bmNoSW5mbzsKLQkKLQlwdWJsaWMgTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlcihVUkxbXSBjbGFzc3BhdGhJbmZvLCBVUkxbXVtdIGJvb3RwYXRoSW5mbywgUHJveHlMYXVuY2hTdXBwb3J0LkxhdW5jaEluZm8gbGF1bmNoSW5mbykgewotCQl0aGlzLmNsYXNzcGF0aEluZm8gPSBjbGFzc3BhdGhJbmZvOwotCQl0aGlzLmJvb3RwYXRoSW5mbyA9IGJvb3RwYXRoSW5mbzsKLQkJdGhpcy5sYXVuY2hJbmZvID0gbGF1bmNoSW5mbzsKLQl9Ci0JCi0JcHVibGljIFVSTFtdIGdldEZpbmFsQ2xhc3NwYXRoKCkgewotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gY2xhc3NwYXRoSW5mbzsKLQkJZWxzZQotCQkJcmV0dXJuIChVUkxbXSkgY2xhc3NwYXRoLnRvQXJyYXkobmV3IFVSTFtjbGFzc3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFVSTFtdIGdldEZpbmFsUHJlcGVuZEJvb3RwYXRoKCkgewotCQlpZiAocHJlcGVuZEJvb3RwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gYm9vdHBhdGhJbmZvWzBdOwotCQllbHNlCi0JCQlyZXR1cm4gKFVSTFtdKSBwcmVwZW5kQm9vdHBhdGgudG9BcnJheShuZXcgVVJMW3ByZXBlbmRCb290cGF0aC5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIFVSTFtdIGdldEZpbmFsQXBwZW5kQm9vdHBhdGgoKSB7Ci0JCWlmIChhcHBlbmRCb290cGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGJvb3RwYXRoSW5mb1syXTsKLQkJZWxzZQotCQkJcmV0dXJuIChVUkxbXSkgcHJlcGVuZEJvb3RwYXRoLnRvQXJyYXkobmV3IFVSTFthcHBlbmRCb290cGF0aC5zaXplKCldKTsKLQl9CQotCi0JcHVibGljIExpc3QgZ2V0RmluYWxKYXZhTGlicmFyeVBhdGgoKSB7Ci0JCWlmIChqYXZhTGlicmFyeVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQllbHNlCi0JCQlyZXR1cm4gamF2YUxpYnJhcnlQYXRoOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRDbGFzc3BhdGgoKSB7Ci0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotCQkJY2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdChjbGFzc3BhdGhJbmZvLmxlbmd0aCk7Ci0JCQlhZGRBbGwoY2xhc3NwYXRoLCBjbGFzc3BhdGhJbmZvLCAtMSk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzcGF0aDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJlcGVuZEJvb3RwYXRoKCkgewotCQlpZiAocHJlcGVuZEJvb3RwYXRoID09IG51bGwpIHsKLQkJCWlmIChib290cGF0aEluZm9bMF0gIT0gbnVsbCkgewotCQkJCXByZXBlbmRCb290cGF0aCA9IG5ldyBBcnJheUxpc3QoYm9vdHBhdGhJbmZvWzBdLmxlbmd0aCk7Ci0JCQkJYWRkQWxsKHByZXBlbmRCb290cGF0aCwgYm9vdHBhdGhJbmZvWzBdLCAtMSk7Ci0JCQl9IGVsc2UKLQkJCQlwcmVwZW5kQm9vdHBhdGggPSBuZXcgQXJyYXlMaXN0KDEpOwotCQl9Ci0JCXJldHVybiBwcmVwZW5kQm9vdHBhdGg7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldEFwcGVuZEJvb3RwYXRoKCkgewotCQlpZiAoYXBwZW5kQm9vdHBhdGggPT0gbnVsbCkgewotCQkJaWYgKGJvb3RwYXRoSW5mb1syXSAhPSBudWxsKSB7Ci0JCQkJYXBwZW5kQm9vdHBhdGggPSBuZXcgQXJyYXlMaXN0KGJvb3RwYXRoSW5mb1syXS5sZW5ndGgpOwotCQkJCWFkZEFsbChhcHBlbmRCb290cGF0aCwgYm9vdHBhdGhJbmZvWzJdLCAtMSk7Ci0JCQl9IGVsc2UKLQkJCQlhcHBlbmRCb290cGF0aCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCX0KLQkJcmV0dXJuIGFwcGVuZEJvb3RwYXRoOwotCX0JCi0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0SmF2YUxpYnJhcnlQYXRoKCkgewotCQlpZiAoamF2YUxpYnJhcnlQYXRoID09IG51bGwpIHsKLQkJCWphdmFMaWJyYXJ5UGF0aCA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCX0KLQkJcmV0dXJuIGphdmFMaWJyYXJ5UGF0aDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWxsKExpc3QgdG9MaXN0LCBPYmplY3RbXSBhcnJheSwgaW50IGxvYykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBOZWVkIGEgZHVwIGNoZWNrLCBzb21ldGltZXMgZHVwcyBjb21lIGluIGVzcGVjaWFsbHkgZHVyaW5nIGRldmVsb3BtZW50Ci0JCQlpZiAodG9MaXN0LmNvbnRhaW5zKGFycmF5W2ldKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChsb2MgPT0gLTEpCi0JCQkJdG9MaXN0LmFkZChhcnJheVtpXSk7Ci0JCQllbHNlCi0JCQkJdG9MaXN0LmFkZChsb2MrKywgYXJyYXlbaV0pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZExvY2F0aW9ucyhMaXN0IHRvTGlzdCwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCVVSTCBsb2NhdGlvbiA9IFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aFRvVVJMKGVudHJ5LmdldExvY2F0aW9uKCkpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgIXRvTGlzdC5jb250YWlucyhsb2NhdGlvbikpCi0JCQkJdG9MaXN0LmFkZChsb2NhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyI2dldEphdmFQcm9qZWN0KCkKLQkgKi8KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gbGF1bmNoSW5mby5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjY29udHJpYnV0ZVByb2plY3Qob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBwcm9qUGF0aCA9IEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkUnVudGltZUNsYXNzcGF0aChqcHJvamVjdCk7Ci0JCWJvb2xlYW4ganJlQ29udGFpbmVyRm91bmQ9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2pQYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5PSBwcm9qUGF0aFtpXTsKLQkJCWlmIChlbnRyeS5nZXRDbGFzc3BhdGhQcm9wZXJ0eSgpID09IElSdW50aW1lQ2xhc3NwYXRoRW50cnkuQk9PVFNUUkFQX0NMQVNTRVMgfHwgZW50cnkuZ2V0Q2xhc3NwYXRoUHJvcGVydHkoKSA9PSBJUnVudGltZUNsYXNzcGF0aEVudHJ5LlNUQU5EQVJEX0NMQVNTRVMpIHsKLQkJCQlpbnQgZW50cnlLaW5kPSBlbnRyeS5nZXRDbGFzc3BhdGhFbnRyeSgpLmdldEVudHJ5S2luZCgpOwotCQkJCVN0cmluZyBzZWdtZW50MD0gZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCk7Ci0JCQkJaWYgKGVudHJ5S2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiAmJiBKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSLmVxdWFscyhzZWdtZW50MCkKLQkJCQkJCXx8IGVudHJ5S2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIEphdmFSdW50aW1lLkpSRUxJQl9WQVJJQUJMRS5lcXVhbHMoc2VnbWVudDApKSB7Ci0JCQkJCWpyZUNvbnRhaW5lckZvdW5kPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChqcmVDb250YWluZXJGb3VuZCkKLQkJCQkJCWFkZExvY2F0aW9ucyhnZXRBcHBlbmRCb290cGF0aCgpLCBKYXZhUnVudGltZS5yZXNvbHZlUnVudGltZUNsYXNzcGF0aEVudHJ5KGVudHJ5LCBqcHJvamVjdCkpOwotCQkJCQllbHNlCi0JCQkJCQlhZGRMb2NhdGlvbnMoZ2V0UHJlcGVuZEJvb3RwYXRoKCksIEphdmFSdW50aW1lLnJlc29sdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoZW50cnksIGpwcm9qZWN0KSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhZGRMb2NhdGlvbnMoZ2V0Q2xhc3NwYXRoKCksIEphdmFSdW50aW1lLnJlc29sdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoZW50cnksIGpwcm9qZWN0KSk7Ci0JCQl9Ci0JCX0JCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkNvbnRyb2xsZXIjY29udHJpYnV0ZUNsYXNzcGF0aChqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChTdHJpbmcgY2xhc3NwYXRoLCBpbnQgdHlwZUZsYWcpIHsKLQkJY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhUb1VSTChjbGFzc3BhdGgpLCB0eXBlRmxhZyk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciNjb250cmlidXRlQ2xhc3NwYXRoKGphdmEubmV0LlVSTCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoVVJMIGNsYXNzcGF0aFVSTCwgaW50IHR5cGVGbGFnKSB7Ci0JCWlmIChjbGFzc3BhdGhVUkwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3dpdGNoICh0eXBlRmxhZykgewotCQkJY2FzZSBQUkVQRU5EX0JPT1RfQ0xBU1NQQVRIOgotCQkJCWlmICghZ2V0UHJlcGVuZEJvb3RwYXRoKCkuY29udGFpbnMoY2xhc3NwYXRoVVJMKSkKLQkJCQkJZ2V0UHJlcGVuZEJvb3RwYXRoKCkuYWRkKGNsYXNzcGF0aFVSTCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBSRVBFTkRfVVNFUl9DTEFTU1BBVEg6Ci0JCQkJaWYgKCFnZXRDbGFzc3BhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQotCQkJCQlnZXRDbGFzc3BhdGgoKS5hZGQoMCwgY2xhc3NwYXRoVVJMKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVBQRU5EX1VTRVJfQ0xBU1NQQVRIOgotCQkJCWlmICghZ2V0Q2xhc3NwYXRoKCkuY29udGFpbnMoY2xhc3NwYXRoVVJMKSkJCQkJCQotCQkJCQlnZXRDbGFzc3BhdGgoKS5hZGQoY2xhc3NwYXRoVVJMKTsKLQkJCQlicmVhazsJCQkJCi0JCQljYXNlIEFQUEVORF9CT09UX0NMQVNTUEFUSDoKLQkJCQlpZiAoIWdldEFwcGVuZEJvb3RwYXRoKCkuY29udGFpbnMoY2xhc3NwYXRoVVJMKSkJCQkJCQotCQkJCQlnZXRBcHBlbmRCb290cGF0aCgpLmFkZChjbGFzc3BhdGhVUkwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEg6Ci0JCQkJaWYgKCFnZXRKYXZhTGlicmFyeVBhdGgoKS5jb250YWlucyhjbGFzc3BhdGhVUkwpKQkJCQkJCi0JCQkJCWdldEphdmFMaWJyYXJ5UGF0aCgpLmFkZChjbGFzc3BhdGhVUkwpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyI2NvbnRyaWJ1dGVDbGFzc3BhdGgob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZSwgamF2YS5sYW5nLlN0cmluZywgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHJlbGF0aXZlUGF0aCwgaW50IHR5cGVGbGFnLCBib29sZWFuIG5sc0xvY2FsaXplKSB7Ci0JCS8vIElmIG5vdCBubHMgbG9jYWxpemUsIG9yIGlmIGl0IGlzIGphdmEgbGlicmFyeSBwYXRoLCB0aGVuIGp1c3QgZmluZCB0aGUgb25lIGluIHRoZSBwbHVnaW4vZnJhZ21lbnQgYW5kIGFkZCBpdC4KLQkJaWYgKG5sc0xvY2FsaXplKQotCQkJY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCByZWxhdGl2ZVBhdGgpLCB0eXBlRmxhZyk7Ci0JCWVsc2UgaWYgKHR5cGVGbGFnID09IElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5BUFBFTkRfSkFWQV9MSUJSQVJZX1BBVEgpIHsKLQkJCVVSTCBjb250cmlidXRpb24gPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCByZWxhdGl2ZVBhdGgpOwotCQkJaWYgKGNvbnRyaWJ1dGlvbiA9PSBudWxsKSB7Ci0JCQkJLy8gUERFIGlzIG5vdCBoZXJlIHRvIGhlbHAgdXMgZXh0cmFjdCB0aGF0IEAjJCBkbGwKLQkJCSAgICBKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZygiTm8gZnJlZSBsdW5jaCEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY29udHJpYnV0ZUNsYXNzcGF0aChjb250cmlidXRpb24sIHR5cGVGbGFnKTsKLQkJfQotCQllbHNlCi0JCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoYnVuZGxlLCByZWxhdGl2ZVBhdGgpLCB0eXBlRmxhZyk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciNjb250cmlidXRlQ2xhc3NwYXRoKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVDbGFzc3BhdGgoQnVuZGxlIGJ1bmRsZSwgSVBhdGggcmVsYXRpdmVQYXRoLCBpbnQgdHlwZUZsYWcsIGJvb2xlYW4gbmxzTG9jYWxpemUpIHsKLQkJLy8gSWYgbm90IG5scyBsb2NhbGl6ZSwgb3IgaWYgaXQgaXMgamF2YSBsaWJyYXJ5IHBhdGgsIHRoZW4ganVzdCBmaW5kIHRoZSBvbmUgaW4gdGhlIHBsdWdpbi9mcmFnbWVudCBhbmQgYWRkIGl0LgotCQlpZiAobmxzTG9jYWxpemUpCi0JCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplQWxsRnJvbUJ1bmRsZUFuZEZyYWdtZW50cyhidW5kbGUsIHJlbGF0aXZlUGF0aCksIHR5cGVGbGFnKTsKLQkJZWxzZSBpZiAodHlwZUZsYWcgPT0gSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9KQVZBX0xJQlJBUllfUEFUSCkKLQkJCWNvbnRyaWJ1dGVDbGFzc3BhdGgoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkudXJsTG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgcmVsYXRpdmVQYXRoKSwgdHlwZUZsYWcpOwotCQllbHNlCi0JCQljb250cmlidXRlQ2xhc3NwYXRoKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLnVybExvY2FsaXplRnJvbUJ1bmRsZU9ubHkoYnVuZGxlLCByZWxhdGl2ZVBhdGgpLCB0eXBlRmxhZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyI2NvbnRyaWJ1dGVDbGFzc3BhdGgoamF2YS5sYW5nLlN0cmluZ1tdLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aChTdHJpbmdbXSBjbGFzc3BhdGhzLCBpbnQgdHlwZUZsYWcpIHsKLQkJY29udHJpYnV0ZUNsYXNzcGF0aChQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhzVG9VUkwoY2xhc3NwYXRocyksIHR5cGVGbGFnKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyI2NvbnRyaWJ1dGVDbGFzc3BhdGgoamF2YS5uZXQuVVJMW10sIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlQ2xhc3NwYXRoKFVSTFtdIGNsYXNzcGF0aFVSTHMsIGludCB0eXBlRmxhZykgewotCQlpZiAoY2xhc3NwYXRoVVJMcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzd2l0Y2ggKHR5cGVGbGFnKSB7Ci0JCQljYXNlIFBSRVBFTkRfQk9PVF9DTEFTU1BBVEg6Ci0JCQkJYWRkQWxsKGdldFByZXBlbmRCb290cGF0aCgpLCBjbGFzc3BhdGhVUkxzLCAtMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBSRVBFTkRfVVNFUl9DTEFTU1BBVEg6Ci0JCQkJYWRkQWxsKGdldENsYXNzcGF0aCgpLCBjbGFzc3BhdGhVUkxzLCAwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVBQRU5EX1VTRVJfQ0xBU1NQQVRIOgotCQkJCWFkZEFsbChnZXRDbGFzc3BhdGgoKSwgY2xhc3NwYXRoVVJMcywgLTEpOwotCQkJCWJyZWFrOwkJCQkKLQkJCWNhc2UgQVBQRU5EX0JPT1RfQ0xBU1NQQVRIOgotCQkJCWFkZEFsbChnZXRBcHBlbmRCb290cGF0aCgpLCBjbGFzc3BhdGhVUkxzLCAtMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFQUEVORF9KQVZBX0xJQlJBUllfUEFUSDoKLQkJCQlhZGRBbGwoZ2V0SmF2YUxpYnJhcnlQYXRoKCksIGNsYXNzcGF0aFVSTHMsIC0xKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Mb2NhbFByb3h5TGF1bmNoRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWY2OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Mb2NhbFByb3h5TGF1bmNoRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogJFJDU2ZpbGU6IExvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZS5qYXZhLHYgJCAkUmV2aXNpb246IDEuMzAgJCAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuRXhwcmVzc2lvbkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3QuUkVNUmVnaXN0ZXJBV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogTGF1bmNoIERlbGVnYXRlIGZvciBsYXVuY2hpbmcgTG9jYWwgKGkuZS4gcmVtb3RlIHZtIGlzIG9uIGxvY2FsIHN5c3RlbSkuIEhlcmUgInJlbW90ZSIgbWVhbnMgdGhlCi0gKiByZWdpc3RyeSBpcyBub3QgaW4gdGhlIElERSBidXQgaW4gYSBzZXBhcmF0ZSBWTSwgYW5kICJsb2NhbCIgbWVhbnMgdGhhdCBpcyBpbiBvbiB0aGUgbG9jYWwKLSAqIHBoeXNpY2FsIG1hY2hpbmUgYW5kIG5vdCBvbiBhIHNlcGFyYXRlIG1hY2hpbmUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm94eUxhdW5jaERlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlI2xhdW5jaChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBJTGF1bmNoIGxhdW5jaCwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cmluZyBsYXVuY2hLZXkgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUHJveHlDb25zdGFudHMuQVRUUklCVVRFX0xBVU5DSF9LRVksIChTdHJpbmcpIG51bGwpOwotCQlpZiAobGF1bmNoS2V5ID09IG51bGwpCi0JCQlhYm9ydChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5UmVtb3RlTm9MYXVuY2hLZXksIG51bGwsIDApOyAKLQotCQkvLyBJbiBFY2xpcHNlLCBldmVuIGlmIHByaXZhdGUsIGEgbGF1bmNoIHdpbGwgc2hvdyB1cCBpbiB0aGUgZGVidWcgcHJvY2VzcyB0cmVlIGFuZCBpbiB0aGUgY29uc29sZSB2aWV3ZXIuCi0JCS8vIFRvIGJlIGFic29sdXRlbHkgcHJpdmF0ZSwgd2UgbmVlZCB0byByZW1vdmUgdGhlIGxhdW5jaCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLgotCQlpZiAoUHJveHlMYXVuY2hTdXBwb3J0LkFUVFJfUFJJVkFURSAhPSBudWxsICYmIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFByb3h5TGF1bmNoU3VwcG9ydC5BVFRSX1BSSVZBVEUsIGZhbHNlKSkgCi0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLnJlbW92ZUxhdW5jaChsYXVuY2gpOwkJCi0JCWlmIChwbSA9PSBudWxsKSB7Ci0JCQlwbSA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgbmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElQcm94eUNvbnN0YW50cy5BVFRSSUJVVEVfVk1fVElUTEUsIChTdHJpbmcpIG51bGwpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuUHJveHlSZW1vdGVWTU5hbWUsIG5ldyBPYmplY3RbXSB7IHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSA6ICIiIH0pOyAKLQkJZWxzZQotCQkJbmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuUHJveHlSZW1vdGVWTU5hbWVXaXRoQ29tbWVudCwgbmV3IE9iamVjdFtdIHsgcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpIDogIiIsIG5hbWUgfSk7IAotCi0JCVN0cmluZyBzdGVwSWQgPSAiTGF1bmNoIFZNICggIiArIG5hbWUgKyAiICkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRTdGVwKHN0ZXBJZCk7Ci0JCS8vIFByb2JsZW0gd2l0aCBsYXVuY2gsIGNhbid0IGhhdmUgZG91YmxlLXF1b3RlcyBpbiB2bU5hbWUuCi0JCWlmIChuYW1lLmluZGV4T2YoJyInKSAhPSAtMSkKLQkJCW5hbWUgPSBuYW1lLnJlcGxhY2UoJyInLCAnXCcnKTsKLQotCQlwbS5iZWdpblRhc2soIiIsIDUwMCk7IC8vJE5PTi1OTFMtMSQKLQkJcG0uc3ViVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5UmVtb3RlTGF1bmNoVk0sIG5ldyBPYmplY3RbXSB7IG5hbWUgfSkpOyAKLQkJLy8gY2hlY2sgZm9yIGNhbmNlbGxhdGlvbgotCQlpZiAocG0uaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCUlWTUluc3RhbGwgdm0gPSB2ZXJpZnlWTUluc3RhbGwoY29uZmlndXJhdGlvbik7Ci0KLQkJSVZNUnVubmVyIHJ1bm5lciA9IHZtLmdldFZNUnVubmVyKG1vZGUpOwotCQlpZiAocnVubmVyID09IG51bGwpIHsKLQkJCWFib3J0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuUHJveHlfTm9SdW5uZXJfRVJST1JfLCBuZXcgT2JqZWN0W10geyBuYW1lIH0pLCBudWxsLCAwKTsgCi0JCX0KLQotCQlGaWxlIHdvcmtpbmdEaXIgPSB2ZXJpZnlXb3JraW5nRGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgd29ya2luZ0Rpck5hbWUgPSBudWxsOwotCQlpZiAod29ya2luZ0RpciAhPSBudWxsKSB7Ci0JCQl3b3JraW5nRGlyTmFtZSA9IHdvcmtpbmdEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQotCQkvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMKLQkJU3RyaW5nW10gZW52cCA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0RW52aXJvbm1lbnQoY29uZmlndXJhdGlvbik7Ci0KLQkJLy8gUHJvZ3JhbSAmIFZNIGFyZ3MKLQkJU3RyaW5nIHBnbUFyZ3MgPSBnZXRQcm9ncmFtQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgdm1BcmdzID0gZ2V0Vk1Bcmd1bWVudHMoY29uZmlndXJhdGlvbik7Ci0JCUV4ZWN1dGlvbkFyZ3VtZW50cyBleGVjQXJncyA9IG5ldyBFeGVjdXRpb25Bcmd1bWVudHModm1BcmdzLCBwZ21BcmdzKTsKLQotCQkvLyBWTS1zcGVjaWZpYyBhdHRyaWJ1dGVzCi0JCU1hcCB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKLQotCQlwbS53b3JrZWQoMTAwKTsKLQkJCi0JCS8vIE5vdyBsZXQncyBnZXQgdGhlIGNsYXNzcGF0aHMgY3JlYXRlZCB0aHJvdWdoIHRoZSBjb250cmlidXRvcnMuCi0JCVVSTFtdIGNsYXNzcGF0aCA9IFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aHNUb1VSTChnZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbikpOwotCQlTdHJpbmdbXVtdIGJvb3RwYXRoSW5mb1N0cmluZ3MgPSBnZXRCb290cGF0aEV4dCh2bUF0dHJpYnV0ZXNNYXApOwotCQlVUkxbXVtdIGJvb3RwYXRoSW5mbyA9IG5ldyBVUkxbXVtdewotCQkJCVByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0U3RyaW5nUGF0aHNUb1VSTChib290cGF0aEluZm9TdHJpbmdzWzBdKSwKLQkJCQlQcm94eUxhdW5jaFN1cHBvcnQuY29udmVydFN0cmluZ1BhdGhzVG9VUkwoYm9vdHBhdGhJbmZvU3RyaW5nc1sxXSksCi0JCQkJUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRTdHJpbmdQYXRoc1RvVVJMKGJvb3RwYXRoSW5mb1N0cmluZ3NbMl0pLAotCQl9OwotCQlQcm94eUxhdW5jaFN1cHBvcnQuTGF1bmNoSW5mbyBsYXVuY2hJbmZvID0gUHJveHlMYXVuY2hTdXBwb3J0LmdldEluZm8obGF1bmNoS2V5KTsKLQkJZmluYWwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGNvbnRyaWJ1dG9ycyA9IGxhdW5jaEluZm8uY29udHJpYnV0b3JzOwotCQlmaW5hbCBMb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotCQkJbmV3IExvY2FsRmlsZUNvbmZpZ3VyYXRpb25Db250cmlidXRvckNvbnRyb2xsZXIoY2xhc3NwYXRoLCBib290cGF0aEluZm8sIGxhdW5jaEluZm8pOwotCQlpZiAoY29udHJpYnV0b3JzICE9IG51bGwpIHsJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBSdW4gaW4gc2FmZSBtb2RlIHNvIHRoYXQgYW55dGhpbmcgaGFwcGVucyB3ZSBkb24ndCBnbyBhd2F5LgotCQkJCWZpbmFsIGludCBpaSA9IGk7Ci0JCQkJUGxhdGZvcm0ucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gUGxhdGZvcm0ucnVuIGxvZ3MgaXQgZm9yIG1lLgotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQljb250cmlidXRvcnNbaWldLmNvbnRyaWJ1dGVDbGFzc3BhdGhzKGNvbnRyb2xsZXIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgaW4gdGhlIHJlcXVpcmVkIG9uZXMgYnkgdGhlIFByb3h5IHN1cHBvcnQuIFRoZXNlIGFyZSBoYXJkLWNvZGVkIHNpbmNlIHRoZXkgYXJlCi0JCS8vIHJlcXVpcmVkLgotCQlQcm94eVJlbW90ZVV0aWwudXBkYXRlQ2xhc3NQYXRocyhjb250cm9sbGVyKTsKLQkJYWRkSW5GcmFnbWVudExpYnJhcmllcyhjb250cm9sbGVyKTsKLQotCQljbGFzc3BhdGggPSBjb250cm9sbGVyLmdldEZpbmFsQ2xhc3NwYXRoKCk7Ci0JCWlmIChib290cGF0aEluZm9bMF0gIT0gY29udHJvbGxlci5nZXRGaW5hbFByZXBlbmRCb290cGF0aCgpKSB7Ci0JCSAgICBpZiAodm1BdHRyaWJ1dGVzTWFwID09IG51bGwpCi0JCSAgICAgICAgdm1BdHRyaWJ1dGVzTWFwID0gbmV3IEhhc2hNYXAoMik7Ci0JCSAgICB2bUF0dHJpYnV0ZXNNYXAucHV0KElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0JPT1RQQVRIX1BSRVBFTkQsIFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0VVJMc1RvU3RyaW5ncyhib290cGF0aEluZm9bMF0pKTsKLQkJfQotCQlpZiAoYm9vdHBhdGhJbmZvWzJdICE9IGNvbnRyb2xsZXIuZ2V0RmluYWxBcHBlbmRCb290cGF0aCgpKSB7Ci0JCSAgICBpZiAodm1BdHRyaWJ1dGVzTWFwID09IG51bGwpCi0JCSAgICAgICAgdm1BdHRyaWJ1dGVzTWFwID0gbmV3IEhhc2hNYXAoMik7Ci0JCSAgICB2bUF0dHJpYnV0ZXNNYXAucHV0KElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0JPT1RQQVRIX0FQUEVORCwgUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRVUkxzVG9TdHJpbmdzKGJvb3RwYXRoSW5mb1syXSkpOwotCQl9Ci0KLQkJLy8gY2hlY2sgZm9yIGNhbmNlbGxhdGlvbgotCQlpZiAocG0uaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQlwbS53b3JrZWQoMTAwKTsKLQotCQkvLyBDcmVhdGUgVk0gY29uZmlnCi0JCVZNUnVubmVyQ29uZmlndXJhdGlvbiBydW5Db25maWcgPQotCQkJbmV3IFZNUnVubmVyQ29uZmlndXJhdGlvbigib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5SZW1vdGVWTUFwcGxpY2F0aW9uIiwgUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRVUkxzVG9TdHJpbmdzKGNsYXNzcGF0aCkpOyAvLyROT04tTkxTLTEkCi0KLQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkoUHJveHlSZW1vdGVVdGlsLmdldFJlZ2lzdHJ5Q29udHJvbGxlcigpLCBuYW1lKTsKLQkJSW50ZWdlciByZWdpc3RyeUtleSA9IHJlZ2lzdHJ5LmdldFJlZ2lzdHJ5S2V5KCk7Ci0KLQkJSW50ZWdlciBidWZTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJwcm94eXZtLmJ1ZnNpemUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYnVmU2l6ZSA9PSBudWxsKQotCQkJYnVmU2l6ZSA9IG5ldyBJbnRlZ2VyKDE2MDAwKTsKLQotCQlpbnQgbWFzdGVyU2VydmVyUG9ydCA9IFByb3h5UmVtb3RlVXRpbC5nZXRSZWdpc3RyeUNvbnRyb2xsZXIoKS5nZXRNYXN0ZXJTb2NrZXRQb3J0KCk7Ci0KLQkJLy8gU2VlIGlmIGRlYnVnIG1vZGUgaXMgcmVxdWVzdGVkLgotCQlEZWJ1Z01vZGVIZWxwZXIgZGggPSBuZXcgRGVidWdNb2RlSGVscGVyKCk7Ci0JCWJvb2xlYW4gZGVidWdNb2RlID0gZGguZGVidWdNb2RlKG5hbWUpOwotCQlib29sZWFuIHVzZU5vdmVyaWZ5ID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFByb3h5UGx1Z2luLlBSRUZFUkVOQ0VTX1ZNX05PVkVSSUZZX0tFWSk7Ci0KLQkJU3RyaW5nW10gZXZtQXJncyA9IGV4ZWNBcmdzLmdldFZNQXJndW1lbnRzQXJyYXkoKTsKLQkJCi0JCWludCBleHRyYUFyZ3MgPSA0OwkvLyBOdW1iZXIgb2YgZXh0cmEgc3RhbmRhcmQgYXJncyBhZGRlZCAoaWYgbnVtYmVyIGNoYW5nZXMgYmVsb3csIHRoaXMgbXVzdCBjaGFuZ2UpCi0JCWlmIChkZWJ1Z01vZGUpCi0JCQlleHRyYUFyZ3MrPTQ7CS8vIE51bWJlciBvZiBleHRyYSBhcmdzIGFkZGVkIGZvciBkZWJ1ZyBtb2RlIChpZiBudW1iZXIgY2hhbmdlcyBiZWxvdywgdGhpcyBtdXN0IGNoYW5nZSkuCi0JCWlmKHVzZU5vdmVyaWZ5KQotCQkJZXh0cmFBcmdzKys7IC8vIEFuIGV4dHJhIGFyZyBhZGRlZCBmb3IgJy1ub3ZlcmlmeScgZmxhZyAoaWYgbnVtYmVyIGNoYW5nZXMgYmVsb3csIHRoaXMgbXVzdCBjaGFuZ2UpLgotCQkKLQkJYm9vbGVhbiB1c2VFeHByZXNzaW9uVHJhY2luZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgUHJveHlMYXVuY2hTdXBwb3J0LkVYUFJFU1NJT05fVFJBQ0lORykpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgZXhwcmVzc2lvblRyYWNpbmdUaHJlc2hvbGQgPSAtMTsKLQkJaWYgKHVzZUV4cHJlc3Npb25UcmFjaW5nKSB7Ci0JCQlleHRyYUFyZ3MrKzsKLQkJCVN0cmluZyB0aHJlc2hvbGRTdHJpbmcgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIFByb3h5TGF1bmNoU3VwcG9ydC5FWFBSRVNTSU9OX1RSQUNFSU5HX1RJTUVSX1RIUkVTSE9MRCk7Ci0JCQlpZiAodGhyZXNob2xkU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlleHByZXNzaW9uVHJhY2luZ1RocmVzaG9sZCA9IExvbmcudmFsdWVPZih0aHJlc2hvbGRTdHJpbmcpLmxvbmdWYWx1ZSgpOwotCQkJCQlleHRyYUFyZ3MrKzsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTGlzdCBqYXZhTGliUGF0aHMgPSBjb250cm9sbGVyLmdldEZpbmFsSmF2YUxpYnJhcnlQYXRoKCk7Ci0JCWludCBleGlzdGluZ0xpYnBhdGhzID0gLTE7Ci0JCWlmICghamF2YUxpYlBhdGhzLmlzRW1wdHkoKSkgewotCQkJLy8gZmlyc3QgbmVlZCB0byBzZWUgaWYgamF2YSBsaWIgcGF0aCBhbHNvIHNwZWNpZmllZCBpbiBzdGFuZGFyZCBhcmdzIGJ5IHNvbWVvbmUgY29uZmlndXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gYnkgaGFuZC4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXZtQXJncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChldm1BcmdzW2ldLnN0YXJ0c1dpdGgoIi1EamF2YS5saWJyYXJ5LnBhdGgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIFdlIGZvdW5kIG9uZSBhbHJlYWR5IGhlcmUsIHNhdmUgdGhlIHNwb3Qgc28gd2UgdXBkYXRlIGl0IGxhdGVyLgotCQkJCQlleGlzdGluZ0xpYnBhdGhzID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGV4aXN0aW5nTGlicGF0aHMgPT0gLTEpCi0JCQkJKytleHRyYUFyZ3M7CS8vIE5lZWQgdG8gaGF2ZSByb29tIGZvciBvbmUgbW9yZS4KLQkJfQotCQkKLQkJU3RyaW5nW10gY3ZtQXJncyA9IG5ldyBTdHJpbmdbZXZtQXJncy5sZW5ndGggKyBleHRyYUFyZ3NdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGV2bUFyZ3MsIDAsIGN2bUFyZ3MsIGV4dHJhQXJncywgZXZtQXJncy5sZW5ndGgpOwkvLyBQdXQgZXhpc3RpbmcgaW50byBuZXcgbGlzdCBhdCB0aGUgZW5kLgkJCi0JCQotCQlpbnQgY3ZtQXJnc0NvdW50PTA7Ci0JCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1EcHJveHl2bS5yZWdpc3RyeUtleT0iICsgcmVnaXN0cnlLZXk7IC8vJE5PTi1OTFMtMSQKLQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLURwcm94eXZtLm1hc3RlclBvcnQ9IiArIFN0cmluZy52YWx1ZU9mKG1hc3RlclNlcnZlclBvcnQpOyAvLyROT04tTkxTLTEkCi0JCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1EcHJveHl2bS5idWZzaXplPSIgKyBidWZTaXplOyAvLyROT04tTkxTLTEkCi0JCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1EcHJveHl2bS5zZXJ2ZXJuYW1lPSIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZih1c2VOb3ZlcmlmeSkKLQkJCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1ub3ZlcmlmeSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICh1c2VFeHByZXNzaW9uVHJhY2luZykgewotCQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLUQiK0V4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OVFJBQ0UrIj10cnVlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoZXhwcmVzc2lvblRyYWNpbmdUaHJlc2hvbGQgIT0gLTEpCi0JCQkJY3ZtQXJnc1tjdm1BcmdzQ291bnQrK10gPSAiLUQiK0V4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OVFJBQ0VfVElNRVJfVEhSRVNIT0xEKyc9JytTdHJpbmcudmFsdWVPZihleHByZXNzaW9uVHJhY2luZ1RocmVzaG9sZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIElmIGluIGRlYnVnIG1vZGUsIHdlIG5lZWQgdG8gZmluZCBhIHBvcnQgZm9yIGl0IHRvIHVzZS4KLQkJaW50IGRwb3J0ID0gLTE7Ci0JCWlmIChkZWJ1Z01vZGUpIHsKLQkJCWRwb3J0ID0gZmluZFVudXNlZExvY2FsUG9ydCgibG9jYWxob3N0IiwgNTAwMCwgMTUwMDAsIG5ldyBpbnRbMF0pOyAvLyROT04tTkxTLTEkCi0JCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItRGphdmEuY29tcGlsZXI9Tk9ORSI7IC8vJE5PTi1OTFMtMSQKLQkJCWN2bUFyZ3NbY3ZtQXJnc0NvdW50KytdID0gIi1YZGVidWciOyAvLyROT04tTkxTLTEkCi0JCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItWG5vYWdlbnQiOyAvLyROT04tTkxTLTEkCi0JCQljdm1BcmdzW2N2bUFyZ3NDb3VudCsrXSA9ICItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxhZGRyZXNzPSIgKyBkcG9ydDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlpZiAoIWphdmFMaWJQYXRocy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBhcHBlbmRUbyA9IG51bGw7Ci0JCQlpZiAoZXhpc3RpbmdMaWJwYXRocyAhPSAtMSkgewotCQkJCWFwcGVuZFRvID0gbmV3IFN0cmluZ0J1ZmZlcihldm1BcmdzW2V4aXN0aW5nTGlicGF0aHNdKTsgCi0JCQkJYXBwZW5kVG8uYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwkvLyBQbHVzIGEgc2VwYXJhdG9yIHNvIHdlIGNhbiBhcHBlbmQKLQkJCX0gZWxzZSAKLQkJCQlhcHBlbmRUbyA9IG5ldyBTdHJpbmdCdWZmZXIoIi1EamF2YS5saWJyYXJ5LnBhdGg9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBbXSBsaWJQYXRocyA9IFByb3h5TGF1bmNoU3VwcG9ydC5jb252ZXJ0VVJMc1RvU3RyaW5ncygoVVJMW10pIGphdmFMaWJQYXRocy50b0FycmF5KG5ldyBVUkxbamF2YUxpYlBhdGhzLnNpemUoKV0pKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGliUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRUby5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLQkJCQlhcHBlbmRUby5hcHBlbmQobGliUGF0aHNbaV0pOwotCQkJfQotCQkJaWYgKGV4aXN0aW5nTGlicGF0aHMgIT0gLTEpCi0JCQkJY3ZtQXJnc1tleHRyYUFyZ3MrZXhpc3RpbmdMaWJwYXRoc10gPSBhcHBlbmRUby50b1N0cmluZygpOwotCQkJZWxzZQotCQkJCWN2bUFyZ3NbZXh0cmFBcmdzLTFdID0gYXBwZW5kVG8udG9TdHJpbmcoKTsKLQkJfQotCi0JCXJ1bkNvbmZpZy5zZXRQcm9ncmFtQXJndW1lbnRzKGV4ZWNBcmdzLmdldFByb2dyYW1Bcmd1bWVudHNBcnJheSgpKTsKLQkJcnVuQ29uZmlnLnNldEVudmlyb25tZW50KGVudnApOwotCQlydW5Db25maWcuc2V0Vk1Bcmd1bWVudHMoY3ZtQXJncyk7Ci0JCXJ1bkNvbmZpZy5zZXRXb3JraW5nRGlyZWN0b3J5KHdvcmtpbmdEaXJOYW1lKTsKLQkJcnVuQ29uZmlnLnNldFZNU3BlY2lmaWNBdHRyaWJ1dGVzTWFwKHZtQXR0cmlidXRlc01hcCk7Ci0KLQkJLy8gQm9vdHBhdGgKLQkJcnVuQ29uZmlnLnNldEJvb3RDbGFzc1BhdGgoZ2V0Qm9vdHBhdGgoY29uZmlndXJhdGlvbikpOwotCi0JCS8vIGNoZWNrIGZvciBjYW5jZWxsYXRpb24KLQkJaWYgKHBtLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJcG0ud29ya2VkKDEwMCk7Ci0KLQkJLy8gc2V0IHRoZSBkZWZhdWx0IHNvdXJjZSBsb2NhdG9yIGlmIHJlcXVpcmVkCi0JCXNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0KLQkJLy8gTGF1bmNoIHRoZSBjb25maWd1cmF0aW9uIC0gMSB1bml0IG9mIHdvcmsKLQkJcnVubmVyLnJ1bihydW5Db25maWcsIGxhdW5jaCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMTAwKSk7Ci0KLQkJLy8gY2hlY2sgZm9yIGNhbmNlbGxhdGlvbgotCQlpZiAocG0uaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCUlQcm9jZXNzW10gcHJvY2Vzc2VzID0gbGF1bmNoLmdldFByb2Nlc3NlcygpOwotCQlJUHJvY2VzcyBwcm9jZXNzID0gcHJvY2Vzc2VzWzBdOyAvLyBUaGVyZSBpcyBvbmx5IG9uZS4KLQkJLy8gQ2hlY2sgaWYgaXQgaXMgYWxyZWFkeSB0ZXJtaW5hdGVkLiBJZiBpdCBpcywgdGhlbiB0aGVyZSB3YXMgYSBiYWQgZXJyb3IsIHNvIGp1c3QKLQkJLy8gcHJpbnQgb3V0IHRoZSByZXN1bHRzIGZyb20gaXQuCi0JCWlmIChwcm9jZXNzLmlzVGVybWluYXRlZCgpKSB7Ci0JCQlJU3RyZWFtc1Byb3h5IHN0UHJveHkgPSBwcm9jZXNzLmdldFN0cmVhbXNQcm94eSgpOwotCQkJLy8gVXNpbmcgYSBwcmludFdyaXRlciBmb3IgcHJpbnRsbiBjYXBhYmlsaXR5LCBidXQgaXQgbmVlZHMgdG8gYmUgb24gYW5vdGhlcgotCQkJLy8gd3JpdGVyLCB3aGljaCB3aWxsIGJlIHN0cmluZwotCQkJamF2YS5pby5TdHJpbmdXcml0ZXIgcyA9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpOwotCQkJamF2YS5pby5QcmludFdyaXRlciB3ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIocyk7Ci0KLQkJCXcucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlZNX1RFUk1JTkFURURfSU5GT18pOyAKLQkJCXcucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlZNX1RFUk1JTkFURURfTElORTEpOyAKLQkJCXcucHJpbnRsbihzdFByb3h5LmdldEVycm9yU3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCkpOwotCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9MSU5FMik7IAotCQkJdy5wcmludGxuKHN0UHJveHkuZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCkpOwotCQkJdy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuVk1fVEVSTUlOQVRFRF9MSU5FMyk7IAotCQkJdy5jbG9zZSgpOwotCi0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVNZXNzYWdlcy5Qcm94eV9UZXJtaW5hdGVkX3Rvb19zb29uX0VSUk9SXywgbmV3IE9iamVjdFtdIHsgbmFtZSB9KTsgCi0JCQlkaC5kaXNwbGF5RXJyb3JNZXNzYWdlKFByb3h5UmVtb3RlTWVzc2FnZXMuUHJveHlfRXJyb3JfVGl0bGUsIG1zZyk7IAotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBzLnRvU3RyaW5nKCksIG51bGwpKTsKLQkJfSBlbHNlIHsKLQkJCWZpbmFsIFN0cmluZyB0cmFjZU5hbWUgPSBuYW1lOwotCQkJSVN0cmVhbXNQcm94eSBmU3RyZWFtc1Byb3h5ID0gcHJvY2Vzcy5nZXRTdHJlYW1zUHJveHkoKTsKLQotCQkJLyoqCi0JCQkgKiBTdHJlYW1MaXN0ZW5lci4gU2hvdWxkIG5vdCBiZSBjcmVhdGVkIGlmIFByb3h5UGx1Z2luIGxvZ2dlciBpcyBub3QgbG9nZ2luZyB0aGUgcmVxdWVzdGVkIGxldmVsLgotCQkJICogCi0JCQkgKiBAc2luY2UgMS4xLjAKLQkJCSAqLwotCQkJY2xhc3MgU3RyZWFtTGlzdGVuZXIgaW1wbGVtZW50cyBJU3RyZWFtTGlzdGVuZXIgewotCQkJCVN0cmluZyB0cmFjZVByZWZpeDsKLQkJCQlMZXZlbCBsZXZlbDsKLQkJCQlKb2IgcHJpbnRKb2I7CS8vIEpvYiB0byB0cnkgdG8gZ2F0aGVyIHByaW50aW5nIHRvZ2V0aGVyLgotCQkJCUxvZ2dlciBsb2dnZXI7Ci0JCQkJU3RyaW5nQnVmZmVyIGdhdGhlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJCQl7Ci0JCQkJCWxvZ2dlciA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpOwotCQkJCQlwcmludEpvYiA9IG5ldyBKb2IoIiIpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkJbW9uaXRvci5iZWdpblRhc2soUHJveHlSZW1vdGVNZXNzYWdlcy5Mb2NhbFByb3h5TGF1bmNoRGVsZWdhdGVfTW9uaXRvcl9QcmludFJlbW90ZVRyYWNlX1RleHQsIDEpOyAKLQkJCQkJCQl3aGlsZSh0cnVlKSB7Ci0JCQkJCQkJCVN0cmluZyBvdXRwdXQgPSBudWxsOwotCQkJCQkJCQlzeW5jaHJvbml6ZWQgKGdhdGhlcmVkVGV4dCkgewotCQkJCQkJCQkJaWYgKGdhdGhlcmVkVGV4dC5sZW5ndGgoKSA8PSB0cmFjZVByZWZpeC5sZW5ndGgoKSkKLQkJCQkJCQkJCQlicmVhazsJLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kLCBubyBtb3JlIHRvIHByaW50LgotCQkJCQkJCQkJb3V0cHV0ID0gZ2F0aGVyZWRUZXh0LnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQlnYXRoZXJlZFRleHQuc2V0TGVuZ3RoKHRyYWNlUHJlZml4Lmxlbmd0aCgpKTsJLy8gUmVzZXQgdGhlIGxlbmd0aCB0byB0aGUgcHJlZml4LgotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvZ2dlci5sb2cob3V0cHV0LCBsZXZlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlwcmludEpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJCQlwcmludEpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBTdHJlYW1MaXN0ZW5lcihTdHJpbmcgdHlwZSwgTGV2ZWwgbGV2ZWwsIExvZ2dlciBsb2dnZXIpIHsKLQkJCQkJdHJhY2VQcmVmaXggPSB0cmFjZU5hbWUgKyAnOicgKyB0eXBlICsgJz4nICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWdhdGhlcmVkVGV4dC5hcHBlbmQodHJhY2VQcmVmaXgpOwotCQkJCQl0aGlzLmxldmVsID0gbGV2ZWw7Ci0JCQkJCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHN0cmVhbUFwcGVuZGVkKFN0cmluZyBuZXdUZXh0LCBJU3RyZWFtTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCXN5bmNocm9uaXplZChnYXRoZXJlZFRleHQpIHsKLQkJCQkJCWdhdGhlcmVkVGV4dC5hcHBlbmQobmV3VGV4dCk7Ci0JCQkJCX0KLQkJCQkJcHJpbnRKb2Iuc2NoZWR1bGUoMTAwTCk7CS8vIFdhaXQgdGVudGggb2Ygc2Vjb25kIHRvIGdhdGhlciBhcyBtdWNoIGFzIGNhbiB0b2dldGhlci4KLQkJCQl9Ci0JCQl9OwotCi0JCQlMb2dnZXIgbG9nZ2VyID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJLy8gQWx3YXlzIGxpc3RlbiB0byBTeXN0ZW0uZXJyIG91dHB1dCBpZiB3ZSBhcmUgYXQgbGVhc3QgbG9nZ2luZyB3YXJuaW5ncy4KLQkJCQlJU3RyZWFtTW9uaXRvciBtb25pdG9yID0gZlN0cmVhbXNQcm94eS5nZXRFcnJvclN0cmVhbU1vbml0b3IoKTsKLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCQltb25pdG9yLmFkZExpc3RlbmVyKG5ldyBTdHJlYW1MaXN0ZW5lcigiZXJyIiwgTGV2ZWwuV0FSTklORywgbG9nZ2VyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJLy8gSWYgZGVidWcgdHJhY2UgaXMgcmVxdWVzdGVkLCB0aGVuIGF0dGFjaCB0cmFjZSBsaXN0ZW5lciBmb3IgU3lzdGVtLm91dAotCQkJLy8gRXhwcmVzc2lvbiB0cmFjaW5nIHJlcXVpcmVzIGRlYnVnIHRyYWNlIHRvbyBiZWNhdXNlIGl0IHByaW50cyB0byBzeXNvdXQuIEhvd2V2ZXIsIGl0IHJlcXVlc3RpbmcgZXhwcmVzc2lvblRyYWNpbmcsIGNoYW5nZSBsb2dnaW5nIGxldmVsIHRvIElORk8sCi0JCQkvLyB3ZSB3YW50IHRoZW0gdG8gc2hvdyBpZiB0aGlzIHRydWUuIEl0IGlzIGNvbmZ1c2luZyB0byBhbHNvIGhhdmUgdG8gY2hhbmdlIGxvZ2dpbmcgbGV2ZWwgaW4gLm9wdGlvbnMgZmlsZS4KLQkJCWlmICh1c2VFeHByZXNzaW9uVHJhY2luZykKLQkJCQlpZiAoIWxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5JTkZPKSkKLQkJCQkJbG9nZ2VyLnNldExldmVsKExldmVsLklORk8pOwotCQkJaWYgKHVzZUV4cHJlc3Npb25UcmFjaW5nIHx8ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgUHJveHlSZW1vdGVVdGlsLkRFQlVHX1ZNX1RSQUNFT1VUKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIFdhbnQgdG8gdHJhY2UgdGhlIG91dHB1dCBvZiB0aGUgcmVtb3RlIHZtJ3MuIEFuZCB3ZSBhcmUgbG9nZ2luZyBhdCBsZWFzdCBsZXZlbCBpbmZvLgotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuSU5GTykpIHsKLQkJCQkJSVN0cmVhbU1vbml0b3IgbW9uaXRvciA9IGZTdHJlYW1zUHJveHkuZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpOwotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCQkJbW9uaXRvci5hZGRMaXN0ZW5lcihuZXcgU3RyZWFtTGlzdGVuZXIoIm91dCIsIExldmVsLklORk8sIGxvZ2dlcikpOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCX0JCQkJCQkJCi0JCQl9Ci0JCX0KLQotCQkvLyBJZiBpbiBkZWJ1ZyBtb2RlLCB0ZXN0ZXIgbXVzdCBzdGFydCBkZWJ1Z2dlciBiZWZvcmUgZ29pbmcgb24uCi0JCWlmIChkZWJ1Z01vZGUpIHsKLQkJCWlmICghZGgucHJvbXB0UG9ydChkcG9ydCkpIHsKLQkJCQlwcm9jZXNzLnRlcm1pbmF0ZSgpOwotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkwLAotCQkJCQkJIkRlYnVnZ2VyIGF0dGFjaCBjYW5jZWxlZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW51bGwpKTsKLQkJCX0KLQkJfQotCi0JCS8vIE5vdyBzZXQgdXAgdGhlIHJlZ2lzdHJ5LgotCQlyZWdpc3RyeS5pbml0aWFsaXplUmVnaXN0cnkocHJvY2Vzcyk7Ci0JCW5ldyBSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJbmV3IFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JCW5ldyBSRU1NZXRob2RQcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCi0JCWlmIChkZWJ1Z01vZGUgfHwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkuZkdsb2JhbE5vVGltZW91dHMpCi0JCQlyZWdpc3RyeS5mTm9UaW1lb3V0cyA9IHRydWU7Ci0JCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJUHJveHlDb25zdGFudHMuQVRUUklCVVRFX0FXVF9TV0lORywgdHJ1ZSkpCi0JCQlSRU1SZWdpc3RlckFXVC5yZWdpc3RlckFXVChyZWdpc3RyeSk7Ci0KLQkJbGF1bmNoSW5mby5yZXN1bHRSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCi0JCXBtLmRvbmUoKTsKLQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcFN0ZXAoc3RlcElkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udHJvbGxlcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRJbkZyYWdtZW50TGlicmFyaWVzKElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlciBjb250cm9sbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQREVDb250cmlidXRlQ2xhc3NwYXRoIGluc3RhbmNlID0gSVBERUNvbnRyaWJ1dGVDbGFzc3BhdGguSU5TVEFOQ0U7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlpbnN0YW5jZS5nZXRQREVDb250cmlidXRpb25zKGNvbnRyb2xsZXIpOwotCQl9Ci0JfQotCi0JLy8gVXRpbGl0aWVzIHRvIGZpbmQgdGhlIGZyZWUgcG9ydAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBmZ1JhbmRvbSA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRVbnVzZWRMb2NhbFBvcnQoU3RyaW5nIGhvc3QsIGludCBzZWFyY2hGcm9tLCBpbnQgc2VhcmNoVG8sIGludFtdIGV4Y2x1ZGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpbnQgcG9ydCA9IDA7Ci0JCQluZXdwb3J0IDogd2hpbGUgKHRydWUpIHsKLQkJCQlwb3J0ID0gZ2V0UmFuZG9tUG9ydChzZWFyY2hGcm9tLCBzZWFyY2hUbyk7Ci0JCQkJaWYgKGV4Y2x1ZGUgIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgZSA9IDA7IGUgPCBleGNsdWRlLmxlbmd0aDsgZSsrKQotCQkJCQkJaWYgKHBvcnQgPT0gZXhjbHVkZVtlXSkKLQkJCQkJCQljb250aW51ZSBuZXdwb3J0OwotCQkJCWJyZWFrOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgU29ja2V0KGhvc3QsIHBvcnQpOwotCQkJfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHBvcnQ7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXRSYW5kb21Qb3J0KGludCBsb3csIGludCBoaWdoKSB7Ci0JCXJldHVybiAoaW50KSAoZmdSYW5kb20ubmV4dEZsb2F0KCkgKiAoaGlnaCAtIGxvdykpICsgbG93OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdW10gZ2V0Qm9vdHBhdGhFeHQoTWFwIHZtTWFwKSB7Ci0JICAgIFN0cmluZ1tdW10gZXh0ID0gbmV3IFN0cmluZ1szXVtdOwotCSAgICBpZiAodm1NYXAgIT0gbnVsbCkgewotCQkgICAgZXh0WzBdID0gKFN0cmluZ1tdKSB2bU1hcC5nZXQoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQk9PVFBBVEhfUFJFUEVORCk7Ci0JCSAgICBleHRbMV0gPSAoU3RyaW5nW10pIHZtTWFwLmdldChJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CT09UUEFUSCk7Ci0JCSAgICBleHRbMl0gPSAoU3RyaW5nW10pIHZtTWFwLmdldChJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CT09UUEFUSF9BUFBFTkQpOwotCSAgICB9Ci0JICAgIHJldHVybiBleHQ7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL01lc3NhZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTYxNGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvTWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IE1lc3NhZ2VEaWFsb2cuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLmF3dC4qOwotLyoqCi0gKiBUaGlzIGlzIGFuIEFXVCBtZXNzYWdlIGRpYWxvZy4gSXQgd2lsbCBvbmx5IGJlIHVzZWQKLSAqIGlmIG5vdCBydW5uaW5nIGluIHRoZSB3b3JrYmVuY2ggYnkgdGhlIGRlYnVnIG1vZGUgaGVscGVyLgotICogSXQgd29uJ3QgYmUgbG9hZGVkIHVubGVzcyBBV1QgaXMgYXZhaWxhYmxlLCBzbyBpdCBjYW4gYmUKLSAqIGRpc3RyaWJ1dGVkIHdpdGhvdXQgY2F1c2luZyBwcm9ibGVtcyBvbiBzeXN0ZW1zIHRoYXQKLSAqIGRvbid0IGhhdmUgQVdUIGJlY2F1c2UgaXQgd29uJ3QgYmUgbG9hZGVkIGluIHRoYXQgY2FzZS4KLSAqLwotY2xhc3MgTWVzc2FnZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNTQ3NjcwMzQ5MzcyMDY3MzQ1TDsKLQlwcml2YXRlIGphdmEuYXd0LlBhbmVsIGl2akNvbnRlbnRzUGFuZSA9IG51bGw7Ci0JSXZqRXZlbnRIYW5kbGVyIGl2akV2ZW50SGFuZGxlciA9IG5ldyBJdmpFdmVudEhhbmRsZXIoKTsKLQlwcml2YXRlIGphdmEuYXd0LlRleHRBcmVhIGl2alRleHRBcmVhMSA9IG51bGw7Ci0JcHJpdmF0ZSBqYXZhLmF3dC5CdXR0b24gaXZqQnV0dG9uMSA9IG51bGw7Ci0JcHVibGljIGludCByZXN1bHQgPSAyOwkvLyBOb3RoaW5nIGhpdCBpcyB0aGUgc2FtZSBhcyBidXR0b24gMi4KLQlwcml2YXRlIGphdmEuYXd0LkJ1dHRvbiBpdmpCdXR0b24yID0gbnVsbDsKLQotY2xhc3MgSXZqRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIsIGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IE1lc3NhZ2VEaWFsb2cudGhpcy5nZXRCdXR0b24xKCkpIAotCQkJCWNvbm5FdG9DMihlKTsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IE1lc3NhZ2VEaWFsb2cudGhpcy5nZXRCdXR0b24yKCkpIAotCQkJCWNvbm5FdG9DMyhlKTsKLQkJfTsKLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkge307Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkgewotCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gTWVzc2FnZURpYWxvZy50aGlzKSAKLQkJCQljb25uRXRvQzEoZSk7Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWljb25pZmllZChqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudCBlKSB7fTsKLQkJcHVibGljIHZvaWQgd2luZG93SWNvbmlmaWVkKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHt9OwotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgZSkge307Ci0JfTsKLS8qKgotICogTWVzc2FnZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG93bmVyIGphdmEuYXd0LkZyYW1lCi0gKiBAcGFyYW0gdGl0bGUgamF2YS5sYW5nLlN0cmluZwotICogQHBhcmFtIG1vZGFsIGJvb2xlYW4KLSAqLwotcHVibGljIE1lc3NhZ2VEaWFsb2coRnJhbWUgb3duZXIsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCwgU3RyaW5nIG1zZywgU3RyaW5nIGJ1dHRvbjEsIFN0cmluZyBidXR0b24yKSB7Ci0Jc3VwZXIob3duZXIsIHRpdGxlLCBtb2RhbCk7Ci0KLQlpbml0aWFsaXplKCk7Ci0JZ2V0VGV4dEFyZWExKCkuc2V0VGV4dChtc2cpOwotCWdldEJ1dHRvbjEoKS5zZXRMYWJlbChidXR0b24xKTsKLQlpZiAoYnV0dG9uMiAhPSBudWxsKQotCQlnZXRCdXR0b24yKCkuc2V0TGFiZWwoYnV0dG9uMik7Ci0JZWxzZSB7Ci0JCS8vIFdlIG9ubHkgd2FudCBvbmUgYnV0dG9uLCBzbyByZW1vdmUgYnV0dG9uMgotCQlnZXRDb250ZW50c1BhbmUoKS5yZW1vdmUoZ2V0QnV0dG9uMigpKTsKLQl9Ci0JCi19Ci0vKioKLSAqIENvbW1lbnQKLSAqLwotcHVibGljIHZvaWQgYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKSB7Ci0JcmVzdWx0ID0gMTsKLQlzZXRWaXNpYmxlKGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIENvbW1lbnQKLSAqLwotcHVibGljIHZvaWQgYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKSB7Ci0JcmVzdWx0ID0gMjsKLQlzZXRWaXNpYmxlKGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIGNvbm5FdG9DMTogIChNZXNzYWdlRGlhbG9nLndpbmRvdy53aW5kb3dDbG9zaW5nKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50KSAtLT4gTWVzc2FnZURpYWxvZy5kaXNwb3NlKClWKQotICogQHBhcmFtIGFyZzEgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQKLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgdm9pZCBjb25uRXRvQzEoamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQgYXJnMSkgewotCXRyeSB7Ci0JCS8vIHVzZXIgY29kZSBiZWdpbiB7MX0KLQkJLy8gdXNlciBjb2RlIGVuZAotCQl0aGlzLmRpc3Bvc2UoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogY29ubkV0b0MyOiAgKEJ1dHRvbjEuYWN0aW9uLmFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCkgLS0+IE1lc3NhZ2VEaWFsb2cuYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKVYpCi0gKiBAcGFyYW0gYXJnMSBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudAotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGNvbm5FdG9DMihqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBhcmcxKSB7Ci0JdHJ5IHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCXRoaXMuYnV0dG9uMV9BY3Rpb25QZXJmb3JtZWQoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogY29ubkV0b0MzOiAgKEJ1dHRvbjIuYWN0aW9uLmFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCkgLS0+IE1lc3NhZ2VEaWFsb2cuYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKVYpCi0gKiBAcGFyYW0gYXJnMSBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudAotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGNvbm5FdG9DMyhqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBhcmcxKSB7Ci0JdHJ5IHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCXRoaXMuYnV0dG9uMl9BY3Rpb25QZXJmb3JtZWQoKTsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJLy8gdXNlciBjb2RlIGJlZ2luIHszfQotCQkvLyB1c2VyIGNvZGUgZW5kCi0JCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCX0KLX0KLS8qKgotICogRGlzcGxheSBkaWFsb2cuCi0gKiBAcGFyYW0gYXJncyBqYXZhLmxhbmcuU3RyaW5nW10KLSAqLwotcHVibGljIHN0YXRpYyBpbnQgZG9pdChTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgYnV0dG9uMSwgU3RyaW5nIGJ1dHRvbjIpIHsKLQl0cnkgewotCQlGcmFtZSBmID0gbmV3IGphdmEuYXd0LkZyYW1lKHRpdGxlKTsKLQkJZi5zZXRWaXNpYmxlKHRydWUpOwotCQkvLyBOZWVkIHRvIG1hc3NhZ2UgdGhlIG1ldGhvZCBzaW5jZSBBV1QgZG9lc24ndCBoYXZlIHdvcmR3cmFwLiBUaGlzIGlzIGZvciBsZWZ0IHRvIHJpZ2h0IG9ubHkuCi0JCVN0cmluZyBtc2cgPSBtZXNzYWdlOwotCQlpZiAobWVzc2FnZS5sZW5ndGgoKSA+IDk1KSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotbmV4dFNlZzoJd2hpbGUgKG1lc3NhZ2UubGVuZ3RoKCkgPiA5NSkgewotCQkJCS8vIFRvbyB3aWRlLCB3cmFwcGluZyBzaG91bGQgYmUgZG9uZS4gVGhpcyBpcyBqdXN0IGEgcm91Z2ggZ3Vlc3MuCi0JCQkJZm9yIChpbnQgaT05NTsgMDw9aTsgaS0tKSB7Ci0JCQkJCWlmIChtZXNzYWdlLmNoYXJBdChpKSA9PSAnICcpIHsKLQkJCQkJCS8vIEJyZWFrIGhlcmUuCi0JCQkJCQltc2cgPSBtc2cgKyBtZXNzYWdlLnN1YnN0cmluZygwLCBpKSArICdcbic7Ci0JCQkJCQlpZiAoaSsxIDwgbWVzc2FnZS5sZW5ndGgoKSkKLQkJCQkJCQltZXNzYWdlID0gbWVzc2FnZS5zdWJzdHJpbmcoaSsxKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQltZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRpbnVlIG5leHRTZWc7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSWYgd2UgZ290IGhlcmUsIHRoZW4gdGhlcmUgd2VyZW4ndCBhbnkgc3BhY2VzIGluIHRoZSBmaXJzdCA4MCwgc28gbG9vayByaWdodCBmb3IgZmlyc3Qgc3BhY2UuCi0JCQkJZm9yIChpbnQgaT05NjsgaTxtZXNzYWdlLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKG1lc3NhZ2UuY2hhckF0KGkpID09ICcgJykgewotCQkJCQkJLy8gQnJlYWsgaGVyZQotCQkJCQkJbXNnID0gbXNnICsgbWVzc2FnZS5zdWJzdHJpbmcoMCwgaSkgKyAnXG4nOwotCQkJCQkJaWYgKGkrMSA8IG1lc3NhZ2UubGVuZ3RoKCkpCi0JCQkJCQkJbWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGkrMSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQljb250aW51ZSBuZXh0U2VnOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbXNnICs9IG1lc3NhZ2U7CS8vIE5vdyBwdXQgb24gd2hhdGV2ZXIgaXMgbGVmdC4KLQkJfQotCQlNZXNzYWdlRGlhbG9nIGFNZXNzYWdlRGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZix0aXRsZSx0cnVlLCBtc2csIGJ1dHRvbjEsIGJ1dHRvbjIpOwotCQlhTWVzc2FnZURpYWxvZy5wYWNrKCk7Ci0JCWFNZXNzYWdlRGlhbG9nLmdldFRvb2xraXQoKS5iZWVwKCk7Ci0JCWFNZXNzYWdlRGlhbG9nLnNldFZpc2libGUodHJ1ZSk7Ci0JCWYuZGlzcG9zZSgpOwotCQlhTWVzc2FnZURpYWxvZy5kaXNwb3NlKCk7Ci0KLQkJcmV0dXJuIGFNZXNzYWdlRGlhbG9nLnJlc3VsdDsKLQl9IGNhdGNoIChUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JfQotCi0JcmV0dXJuIDI7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgQnV0dG9uMSBwcm9wZXJ0eSB2YWx1ZS4KLSAqIEByZXR1cm4gamF2YS5hd3QuQnV0dG9uCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIGphdmEuYXd0LkJ1dHRvbiBnZXRCdXR0b24xKCkgewotCWlmIChpdmpCdXR0b24xID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWl2akJ1dHRvbjEgPSBuZXcgamF2YS5hd3QuQnV0dG9uKCk7Ci0JCQlpdmpCdXR0b24xLnNldE5hbWUoIkJ1dHRvbjEiKTsgLy8kTk9OLU5MUy0xJAotCQkJaXZqQnV0dG9uMS5zZXRMYWJlbCgiQnV0dG9uMSIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JCQkvLyB1c2VyIGNvZGUgZW5kCi0JCX0gY2F0Y2ggKGphdmEubGFuZy5UaHJvd2FibGUgaXZqRXhjKSB7Ci0JCQkvLyB1c2VyIGNvZGUgYmVnaW4gezJ9Ci0JCQkvLyB1c2VyIGNvZGUgZW5kCi0JCQloYW5kbGVFeGNlcHRpb24oaXZqRXhjKTsKLQkJfQotCX0KLQlyZXR1cm4gaXZqQnV0dG9uMTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBCdXR0b24yIHByb3BlcnR5IHZhbHVlLgotICogQHJldHVybiBqYXZhLmF3dC5CdXR0b24KLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgamF2YS5hd3QuQnV0dG9uIGdldEJ1dHRvbjIoKSB7Ci0JaWYgKGl2akJ1dHRvbjIgPT0gbnVsbCkgewotCQl0cnkgewotCQkJaXZqQnV0dG9uMiA9IG5ldyBqYXZhLmF3dC5CdXR0b24oKTsKLQkJCWl2akJ1dHRvbjIuc2V0TmFtZSgiQnV0dG9uMiIpOyAvLyROT04tTkxTLTEkCi0JCQlpdmpCdXR0b24yLnNldExhYmVsKCJCdXR0b24yIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHVzZXIgY29kZSBiZWdpbiB7MX0KLQkJCS8vIHVzZXIgY29kZSBlbmQKLQkJfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJCS8vIHVzZXIgY29kZSBiZWdpbiB7Mn0KLQkJCS8vIHVzZXIgY29kZSBlbmQKLQkJCWhhbmRsZUV4Y2VwdGlvbihpdmpFeGMpOwotCQl9Ci0JfQotCXJldHVybiBpdmpCdXR0b24yOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIENvbnRlbnRzUGFuZSBwcm9wZXJ0eSB2YWx1ZS4KLSAqIEByZXR1cm4gamF2YS5hd3QuUGFuZWwKLSAqLwotLyogV0FSTklORzogVEhJUyBNRVRIT0QgV0lMTCBCRSBSRUdFTkVSQVRFRC4gKi8KLXByaXZhdGUgamF2YS5hd3QuUGFuZWwgZ2V0Q29udGVudHNQYW5lKCkgewotCWlmIChpdmpDb250ZW50c1BhbmUgPT0gbnVsbCkgewotCQl0cnkgewotCQkJaXZqQ29udGVudHNQYW5lID0gbmV3IGphdmEuYXd0LlBhbmVsKCk7Ci0JCQlpdmpDb250ZW50c1BhbmUuc2V0TmFtZSgiQ29udGVudHNQYW5lIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl2akNvbnRlbnRzUGFuZS5zZXRMYXlvdXQobmV3IGphdmEuYXd0LkZsb3dMYXlvdXQoKSk7Ci0JCQlnZXRDb250ZW50c1BhbmUoKS5hZGQoZ2V0VGV4dEFyZWExKCksIGdldFRleHRBcmVhMSgpLmdldE5hbWUoKSk7Ci0JCQlnZXRDb250ZW50c1BhbmUoKS5hZGQoZ2V0QnV0dG9uMSgpLCBnZXRCdXR0b24xKCkuZ2V0TmFtZSgpKTsKLQkJCWdldENvbnRlbnRzUGFuZSgpLmFkZChnZXRCdXR0b24yKCksIGdldEJ1dHRvbjIoKS5nZXROYW1lKCkpOwotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQl9IGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIGl2akV4YykgewotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGl2akNvbnRlbnRzUGFuZTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBUZXh0QXJlYTEgcHJvcGVydHkgdmFsdWUuCi0gKiBAcmV0dXJuIGphdmEuYXd0LlRleHRBcmVhCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIGphdmEuYXd0LlRleHRBcmVhIGdldFRleHRBcmVhMSgpIHsKLQlpZiAoaXZqVGV4dEFyZWExID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWl2alRleHRBcmVhMSA9IG5ldyBUZXh0QXJlYSgpOwotCQkJaXZqVGV4dEFyZWExLnNldE5hbWUoIlRleHRBcmVhMSIpOyAvLyROT04tTkxTLTEkCi0JCQlpdmpUZXh0QXJlYTEuc2V0VGV4dCgiVGV4dEFyZWExIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl2alRleHRBcmVhMS5zZXRSb3dzKDIwKTsKLQkJCWl2alRleHRBcmVhMS5zZXRDb2x1bW5zKDEwMCk7Ci0JCQlpdmpUZXh0QXJlYTEuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsxfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQl9IGNhdGNoIChqYXZhLmxhbmcuVGhyb3dhYmxlIGl2akV4YykgewotCQkJLy8gdXNlciBjb2RlIGJlZ2luIHsyfQotCQkJLy8gdXNlciBjb2RlIGVuZAotCQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGl2alRleHRBcmVhMTsKLX0KLS8qKgotICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBwYXJ0IHRocm93cyBhbiBleGNlcHRpb24uCi0gKiBAcGFyYW0gZXhjZXB0aW9uIGphdmEubGFuZy5UaHJvd2FibGUKLSAqLwotcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihqYXZhLmxhbmcuVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCi0JLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gcHJpbnQgdW5jYXVnaHQgZXhjZXB0aW9ucyB0byBzdGRvdXQgKi8KLQkvLyBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZShMZXZlbC5XQVJOSU5HLCItLS0tLS0tLS0gVU5DQVVHSFQgRVhDRVBUSU9OIC0tLS0tLS0tLSIpOwotCS8vIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKExldmVsLldBUk5JTkcsZXhjZXB0aW9uKTsKLX0KLS8qKgotICogSW5pdGlhbGl6ZXMgY29ubmVjdGlvbnMKLSAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotICovCi0vKiBXQVJOSU5HOiBUSElTIE1FVEhPRCBXSUxMIEJFIFJFR0VORVJBVEVELiAqLwotcHJpdmF0ZSB2b2lkIGluaXRDb25uZWN0aW9ucygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JLy8gdXNlciBjb2RlIGVuZAotCXRoaXMuYWRkV2luZG93TGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLQlnZXRCdXR0b24xKCkuYWRkQWN0aW9uTGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLQlnZXRCdXR0b24yKCkuYWRkQWN0aW9uTGlzdGVuZXIoaXZqRXZlbnRIYW5kbGVyKTsKLX0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgY2xhc3MuCi0gKi8KLS8qIFdBUk5JTkc6IFRISVMgTUVUSE9EIFdJTEwgQkUgUkVHRU5FUkFURUQuICovCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQl0cnkgewotCQkvLyB1c2VyIGNvZGUgYmVnaW4gezF9Ci0JCS8vIHVzZXIgY29kZSBlbmQKLQkJc2V0TmFtZSgiTWVzc2FnZURpYWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCXNldExheW91dChuZXcgamF2YS5hd3QuQm9yZGVyTGF5b3V0KCkpOwotCQlzZXRTaXplKDQyNiwgMjQwKTsKLQkJYWRkKGdldENvbnRlbnRzUGFuZSgpLCAiQ2VudGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdENvbm5lY3Rpb25zKCk7Ci0JfSBjYXRjaCAoamF2YS5sYW5nLlRocm93YWJsZSBpdmpFeGMpIHsKLQkJaGFuZGxlRXhjZXB0aW9uKGl2akV4Yyk7Ci0JfQotCS8vIHVzZXIgY29kZSBiZWdpbiB7Mn0KLQkvLyB1c2VyIGNvZGUgZW5kCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUHJveHlSZW1vdGVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmJmOGQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUHJveHlSZW1vdGVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJveHlSZW1vdGVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcm94eVJlbW90ZU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT19PVVRQVVRfRk9MREVSX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVk1fVEVSTUlOQVRFRF9JTkZPXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWTV9URVJNSU5BVEVEX0xJTkUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZNX1RFUk1JTkFURURfTElORTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVk1fVEVSTUlOQVRFRF9MSU5FMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVEVfVk1fVFJBQ0VfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1RFX1ZNX0xPQ0FMX1RSQUNFX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzY2FzdF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbnRpYXRlX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3RlQ21kX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhjZXB0aW9uRXJyb3JNc2dfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPS183OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5X05vUnVubmVyX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eV9FcnJvcl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eV9UZXJtaW5hdGVkX3Rvb19zb29uX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVJlbW90ZVZNTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVJlbW90ZVZNTmFtZVdpdGhDb21tZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3h5UmVtb3RlTm9MYXVuY2hLZXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlSZW1vdGVMYXVuY2hWTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwSm9iX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5X0NhbGxiYWNrQ29ubmVjdGlvbk5vdFdvcmtpbmdfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db25uZWN0aW9uQ3JlYXRpb25GYWlsZWRfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfSm9iX1Rlcm1pbmF0ZVByb2Nlc3NfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ291bGROb3RDcmVhdGVTb2NrZXRDb25uZWN0aW9uVG9SZW1vdGVWTV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTUV4cHJlc3Npb25fSU9FeGNlcHRpb25TZWVMb2dfSU5GT187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNRXhwcmVzc2lvbl9Db21tYW5kRXhjZXB0aW9uU2VlTG9nX0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZV9Nb25pdG9yX1ByaW50UmVtb3RlVHJhY2VfVGV4dDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3h5UmVtb3RlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9Qcm94eVJlbW90ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5NjAwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1Byb3h5UmVtb3RlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUHJveHlSZW1vdGVVdGlsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjExICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlSZW1vdGVVdGlsIHsKLQotCS8vIERlYnVnIG9wdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19WTSA9ICIvcmVtb3RlL2RlYnVnL2RlYnVndm0iLCAvLyBCcmluZyB1cCBkZWJ1Z2dlciBvbiByZW1vdGUgdm0ncy4gLy8kTk9OLU5MUy0xJAotCQlJT19DT05TT0xFID0gIi9yZW1vdGUvZGVidWcvaW9jb25zb2xlIiwgLy8gSU8gVGhyb3VnaCBjb25zb2xlIChzeXN0ZW0gaW4gYW5kIG91dCkgZm9yIGFza2luZyBxdWVzdGlvbnMuIC8vJE5PTi1OTFMtMSQKLQkJREVCVUdfVk1fVFJBQ0VPVVQgPSAiL3JlbW90ZS9kZWJ1Zy92bXRyYWNlb3V0IiwgLy8gVHJhY2UgdGhlIG91dHB1dCBmcm9tIHRoZSByZW1vdGUgdm0ncy4gLy8kTk9OLU5MUy0xJAotCQlOT19USU1FT1VUUyA9ICIvcmVtb3RlL2RlYnVnL25vdGltZW91dHMiOwkvLyBObyBzb2NrZXQgdGltZW91dHMgd2hlbiB0YWxraW5nIHRvIHJlbW90ZSB2bS4gVHVybiB0aGlzIG9uIHdoZW4gZG9pbmcgY2FsbGJhY2sgdGVzdGluZy4gTm90IG5lZWRlZCBvdGhlcndpc2UuIC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBSRU1SZWdpc3RyeUNvbnRyb2xsZXIgcGx1Z2luUmVnaXN0cnlDb250cm9sbGVyOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaXN0cnkgY29udHJvbGxlci4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBSRU1SZWdpc3RyeUNvbnRyb2xsZXIgZ2V0UmVnaXN0cnlDb250cm9sbGVyKCkgewotCQlyZXR1cm4gcGx1Z2luUmVnaXN0cnlDb250cm9sbGVyICE9IG51bGwgPyBwbHVnaW5SZWdpc3RyeUNvbnRyb2xsZXIgOiAocGx1Z2luUmVnaXN0cnlDb250cm9sbGVyID0gbmV3IFJFTVJlZ2lzdHJ5Q29udHJvbGxlcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHRvIHVwZGF0ZSBhbnkgY2xhc3MgcGF0aHMgd2l0aCBhbnkKLQkgKiBwYXRocyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgdG8gYSBWTS4gSW4gdGhpcyBjYXNlLCBpdCBpcwotCSAqIHRoZSByZW1vdGV2bS5qYXIgYW5kIHRoZSByZW1vdGVjb21tb24uamFyIHRoYXQgbmVlZCB0byBiZSBhZGRlZC4gVGhlIGZpcnN0IGphciBjb250YWlucwotCSAqIHRoZSBjb2RlIG5lY2Vzc2FyeSB0byBydW4gdGhlIHJlbW90ZSB2bSBhbmQgbGlzdGVuIGZvciBjb21tYW5kcy4gVGhlIHNlY29uZCBqYXIgY29udGFpbnMKLQkgKiB0aGUgY29tbW9uIGNvZGUgdGhhdCBpcyByZXF1aXJlZCB0byBiZSBzaGFyZWQgb24gYm90aCB0aGUgSURFIHNpZGUgYW5kIHJlbW90ZSBzaWRlLiBJdAotCSAqIGlzIHRoZSBpbnRlcmZhY2UgY29kZSBzbyB0aGF0IHRoZXkgYm90aCB0YWxrIHRoZSBzYW1lIGxhbmd1YWdlLgotCSAqIHN1cHBvcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUNsYXNzUGF0aHMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLQkJQnVuZGxlIHByb3h5QnVuZGxlID0gUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCk7Ci0JCS8vIE5lZWQgdG8gaGF2ZSBvdXIgamFycyBhdCB0aGUgYmVnaW5uaW5nLiAoU3RydXRzIGNhdXNlcyBhIHByb2JsZW0gYmVjYXVzZSAKLQkJLy8gdGhleSBoYXZlIGEgamFyIChjb21tb25zLWZpbGV1cGxvYWQuamFyKSB0aGF0IGlmIHdoZW4gc2VhcmNoaW5nIGZvciBhIGNsYXNzIGFuZAotCQkvLyB0aGlzIGphciBpcyByZWFjaGVkLCBpdCBjYXVzZXMgdGhlIGNsYXNzIGxvYWRlciB0byBiYXJmLiBPdXIgamFycyB1c2VkIHRvIGJlIGF0Ci0JCS8vIHRoZSBlbmQsIGFuZCBzbyBpdCBmb3VuZCB0aGUgZmlsZXVwbG9hZCBqYXIgZmlyc3QgYW5kIG5vIHJlbW90ZSB2bSBjb3VsZCBiZSBzdGFydGVkCi0JCS8vIGJlY2F1c2Ugb2YgdGhpcy4KLQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKHByb3h5QnVuZGxlLCAicmVtb3RlY29tbW9uLmphciIsIElDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uQ29udHJvbGxlci5QUkVQRU5EX1VTRVJfQ0xBU1NQQVRILCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJY29udHJvbGxlci5jb250cmlidXRlQ2xhc3NwYXRoKHByb3h5QnVuZGxlLCAidm0vcmVtb3Rldm0uamFyIiwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLlBSRVBFTkRfVVNFUl9DTEFTU1BBVEgsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdEJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM5MjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3RCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1BYnN0cmFjdEJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS4qOwotLyoqCi0gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIElSRU1CZWFuUHJveHkgdGhhdCBkb2Vzbid0Ci0gKiBoYXZlIHRoZSBiZWFuIHR5cGUgc3RvcmVkIGluIGl0LiBUaGUgc3ViY2xhc3NlcyB3aWxsCi0gKiBzdXBwbHkgaXQuIEl0IGRvZXMgaG93ZXZlciBoYXZlIGFuIElEIGJlY2F1c2UgaXQgZG9lcwotICogZXhpc3Qgb3ZlciBvbiB0aGUgcmVtb3RlIFZNLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUkVNQWJzdHJhY3RCZWFuUHJveHkgaW1wbGVtZW50cyBJUkVNQmVhblByb3h5IHsKLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZkZhY3Rvcnk7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGZJRDsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGJlYW4gd2UgYXJlIHByb3h5aW5nLiAgV2UgYXJlIGEgcHJveHkgZm9yIGEgYmVhbiBydW5uaW5nIG9uIHRoZSByZW1vdGUgVk0uIAotCSAqLwotCXByb3RlY3RlZCBSRU1BYnN0cmFjdEJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCl7Ci0JCWZGYWN0b3J5ID0gYVJlZ2lzdHJ5OwotCQlmSUQgPSBhbklEOwotCX0KLQkKLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOgotCSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLQkgKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0JICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLQkgKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0JICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCQlpZiAoc3VwZXIuZXF1YWxzKGFuT2JqZWN0KSkKLQkJCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBJQmVhblByb3h5ICYmICEoYW5PYmplY3QgaW5zdGFuY2VvZiBJUkVNQ29uc3RhbnRCZWFuUHJveHkpICYmIGZGYWN0b3J5LmlzVmFsaWQoKSAmJiAoKElCZWFuUHJveHkpIGFuT2JqZWN0KS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpID09IGZGYWN0b3J5KQotCQkJdHJ5IHsKLQkJCQkvLyBUaGUgb3RoZXIgaXMgYSBiZWFuIHByb3h5IGFuZCBpcyBub3QgYSBjb25zdGFudCBvbmUsIGxldCB0aGUgc2VydmVyIGRvIHRoZSBjaGVjay4KLQkJCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRPYmplY3RFcXVhbHMoKS5pbnZva2UodGhpcywgKElCZWFuUHJveHkpIGFuT2JqZWN0KSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCQlyZXR1cm4gdGhpcyA9PSBhQmVhblByb3h5OwkvLyBXZSBjYW4gYmUgYXNzdXJlZCBpbiBSZW1vdGUgUHJveHkgdGhhdCBpZGVudGl0eSBvZiBwcm94eSBhbmQgaWRlbnRpdHkgb2Ygb2JqZWN0IGFyZSB0aGUgc2FtZS4KLQl9Ci0JCQotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZGYWN0b3J5OwotCX0KLQkKLQkvKioKLQkgKiBHZXQgSUQuIEFuIGludGVybmFsIG1ldGhvZCB0byBiZSB1c2VkIG9ubHkgd2l0aGluIHRoZSBQcm94eUZhY3RvcnkgZmFtaWx5LgotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gZklEOwotCX0KLQkKLQkvKioKLQkgKiBpc1ZhbGlkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmSUQgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUHJveHkgaXMgYWJvdXQgdG8gYmUgcmVsZWFzZWQsIE1VU1QgbWFyayBpdCBpbnZhbGlkLgotCSAqIFRoaXMgaXMgcmVxdWlyZWQuIFJlc291cmNlcyBjYW4gYWxzbyBiZSBjbGVhbmVkIHVwCi0JICogaWYgdGhleSBhcmUgYmVpbmcgaGVsZCBhbmQgbmVlZCB0byBiZSBjbGVhbmVkIHVwLgotCSAqCi0JICogTk9URTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBwcm94eQotCSAqIGlzIGV4cGxpY2l0bHkgcmVsZWFzZWQuIElmIGl0IGlzIHNpbXBseSBnYXJiYWdlIGNvbGxlY3RlZCwKLQkgKiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZC4gU2ltcGxlIGdhcmJhZ2UgY29sbGVjdGlvbgotCSAqIG1lYW5zIHRoYXQgbm8gb25lIGlzIHJlZmVyZW5jaW5nIHRoaXMgcHJveHkuIFRoZSBwcm94eSBmYWN0b3J5Ci0JICogd2lsbCBrbm93IHdoYXQgaWQgdGhpcyBwcm94eSB3YXMgcmVmZXJlbmNpbmcgYW5kIHdpbGwgcmVsZWFzZSBpdAotCSAqIG9uIHRoZSBzZXJ2ZXIgYXQgR0MgdGltZS4KLQkgKgotCSAqIElmIHRoZXJlIGFyZSByZXNvdXJjZXMKLQkgKiB0aGF0IGFic29sdXRlbHkgbXVzdCBiZSByZWxlYXNlZCwgdGhlbiB0aGUgZmluYWxpemUgbWV0aG9kCi0JICogc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIGRvIHRoZSBjbGVhbiB1cC4gSG93ZXZlciwgdHJ5IG5vdAotCSAqIHRvIGhhdmUgdGhpcyBiZSB0aGUgY2FzZS4gRmluYWxpemUgbWV0aG9kcyBhZGQgb3ZlcmhlYWQgdGhhdCBpcwotCSAqIHVzdWFsbHkgYmV0dGVyIG5vdCB0byBoYXZlLiBUaGUgYmV0dGVyIHdheSBpcyBmb3IgYW55IHVzZXJzCi0JICogdGhhdCBnZXQgdGhpcyBraW5kIG9mIHByb3h5IG9iamVjdCBrbm93IHRvIGNhbGwgcmVsZWFzZSBvbgotCSAqIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHRvIHJlbGVhc2UgaXQgYmVmb3JlIGdhcmJhZ2UgY29sbGVjdGlvbi4JIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZJRCA9IG51bGw7Ci0JfQotCQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b1N0cmluZyBvZiB0aGUgYWN0dWFsIGJlYW4gb24gdGhlIHJlbW90ZSBzaWRlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlJU3RyaW5nQmVhblByb3h5IHN0cmluZyA9IChJU3RyaW5nQmVhblByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldE9iamVjdFRvU3RyaW5nKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMpOwotCQlyZXR1cm4gKHN0cmluZyAhPSBudWxsKSA/IHN0cmluZy5zdHJpbmdWYWx1ZSgpIDogbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmVuZGVyIHRoZSBiZWFuIHByb3h5IGludG8gdGhlIHZhbHVlIGZpZWxkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQkJdmFsdWUuc2V0T2JqZWN0SUQoaXNWYWxpZCgpID8gZ2V0SUQoKS5pbnRWYWx1ZSgpIDogQ29tbWFuZHMuVk9JRCk7CS8vIE5vIGxvbmdlciBleGlzdHMsIHNvIHNlbmQgb3ZlciBudWxsLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0JlYW5Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCZWFuUHJveHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNFeHByZXNzaW9uUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZDE1ZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLlRyYW5zbWl0YWJsZUFycmF5OwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgaXMgZm9yIHdoZXJlIHRoZSBCZWFuIGlzIG9uIGEgZGlmZmVyZW50IFZNIHRoZW4gdGhlIElERQotICogCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAxMjoyOToyNiBQTSkKLSAqIAotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElSRU1CZWFuVHlwZVByb3h5IHsKLQotCXByaXZhdGUgSW50ZWdlciBmSUQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZlJlZ2lzdHJ5OwotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBmQ2xhc3NuYW1lOyAvLyBUaGlzIGlzIGNhY2hlZCBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBnbyBvdmVyIHRoZSBsaW5lIHRvIGdldCBpdC4KLQotCXByaXZhdGUgSUJlYW5UeXBlUHJveHkgZlN1cGVyVHlwZTsgLy8gVGhpcyBpcyBjYWNoZWQgc28gYXMgbm90IHRvIGhhdmUgdG8gZ28gb3ZlciB0aGUgbGluZSBmb3IgaXQuCi0KLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBhIHJlZ2lzdHJ5IGFuZCBhIGNsYXNzLiBJdCBpcyBwcm90ZWN0ZWQgc28gdGhhdCBvbmx5IHN1YmNsYXNzZXMgYW5kIHRoZSBmYWN0b3J5IHdpdGggdGhpcyBSRU0gcGFja2FnZSBjYW4gY2FsbCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCQlmUmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWZJRCA9IGFuSUQ7Ci0JCWZDbGFzc25hbWUgPSBhQ2xhc3NuYW1lOwotCQlmU3VwZXJUeXBlID0gYVN1cGVyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOiAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdCBUaGlzIGlzIGFsbCB0aGF0IGlzIG5lZWRlZCBmb3IgQmVhblR5cGVzIGJlY2F1c2Ugd2Uga25vdyB0aGVzZSBhcmUgY2xhc3NlcywKLQkgKiB0aGVyZSBpcyBvbmx5IG9uZSBwZXIgY2xhc3MsIGFuZCBDbGFzcyBlcXVhbHMgaXMgdHJ1ZSBvbmx5IGZvciBpZGVudGl0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5lcXVhbHMoYW5PYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCXJldHVybiB0aGlzID09IGFCZWFuUHJveHk7IC8vIFdlIGNhbiBiZSBhc3N1cmVkIGluIFJlbW90ZSBQcm94eSB0aGF0IGlkZW50aXR5IG9mIHByb3h5IGFuZCBpZGVudGl0eSBvZiBvYmplY3QgYXJlIHRoZSBzYW1lLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I2dldElEKCkKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIGZJRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjaXNWYWxpZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGZJRCAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIENsZWFyIHRoZSBpZCBhbmQgc3VwZXJ0eXBlIChzdXBlcnR5cGUgaXMgY2xlYXJlZCBzbyB0aGF0Ci0JCS8vIGl0IHdvbid0IGhvbGQgb250byBpdCBhbmQgd2lsbCBsZXQgdGhlIHN1cGVydHlwZSBiZSBHQydkCi0JCS8vIGlmIG5lY2Vzc2FyeS4KLQotCQlmSUQgPSBudWxsOwotCQlmU3VwZXJUeXBlID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCS8vIFR1cm4gY2xhc3MgbmFtZXMgaW50byBhcnJheSBvZiBCZWFuVHlwZXMuCi0JCUlCZWFuVHlwZVByb3h5W10gYXJnVHlwZXMgPSBudWxsOwotCQlpZiAoYXJndW1lbnRDbGFzc05hbWVzICE9IG51bGwpIHsKLQkJCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCQlhcmdUeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVthcmd1bWVudENsYXNzTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUJlYW5UeXBlUHJveHkgdHlwZSA9IGFyZ1R5cGVzW2ldID0gdHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShhcmd1bWVudENsYXNzTmFtZXNbaV0pOwotCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBDb3VsZG4ndCBmaW5kIHRoZSB0eXBlLgotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yUHJveHkoYXJnVHlwZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCUlSRU1NZXRob2RQcm94eSBnZXRDdG9yTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NDb25zdHJ1Y3RvcigpOwotCi0JCS8vIENyZWF0ZSB0aGUgYXJndW1lbnQgYXJyYXkKLQkJT2JqZWN0W10gZ2V0UGFybXMgPSAoYXJndW1lbnRUeXBlcyAhPSBudWxsKSA/IG5ldyBPYmplY3RbXSB7IG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5DTEFTU19DTEFTUywgYXJndW1lbnRUeXBlcyl9IDogLy8gR2V0IEN0b3IgaGFzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIG9ubHkgb25lIHBhcm0sCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIHRoZSBhcnJheSBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBwYXJtIHR5cGVzLgotCQkJCW51bGw7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoSUNvbnN0cnVjdG9yUHJveHkpIGdldEN0b3JNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIGdldFBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0Q29uc3RydWN0b3JzKCkgewotCi0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIEludGVyZmFjZXMgZG9uJ3QgaGF2ZSBjdG9yJ3MuCi0KLQkJSVJFTU1ldGhvZFByb3h5IGdldEN0b3JNZXRob2QgPSAoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRDbGFzc0NvbnN0cnVjdG9ycygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgY3RvcnMgPSAoSUFycmF5QmVhblByb3h5KSBnZXRDdG9yTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBudWxsKTsKLQkJCUlCZWFuUHJveHlbXSBwcm94aWVzID0gY3RvcnMuZ2V0U25hcHNob3QoKTsKLQkJCUlDb25zdHJ1Y3RvclByb3h5W10gY3RvcnByb3hpZXMgPSBuZXcgSUNvbnN0cnVjdG9yUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBjdG9ycHJveGllcywgMCwgcHJveGllcy5sZW5ndGgpOwotCQkJcmV0dXJuIGN0b3Jwcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIEludGVyZmFjZXMgZG9uJ3QgaGF2ZSBjdG9yJ3MuCi0KLQkJLy8gVHVybiBjbGFzcyBuYW1lcyBpbnRvIGFycmF5IG9mIEJlYW5UeXBlcy4KLQkJSUJlYW5UeXBlUHJveHlbXSBhcmdUeXBlcyA9IG51bGw7Ci0JCWlmIChhcmd1bWVudENsYXNzTmFtZXMgIT0gbnVsbCkgewotCQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJCWFyZ1R5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W2FyZ3VtZW50Q2xhc3NOYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQmVhblR5cGVQcm94eSB0eXBlID0gYXJnVHlwZXNbaV0gPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFyZ3VtZW50Q2xhc3NOYW1lc1tpXSk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7IC8vIENvdWxkbid0IGZpbmQgdGhlIHR5cGUuCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KGFyZ1R5cGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCUlSRU1NZXRob2RQcm94eSBnZXRDdG9yTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0RGVjbGFyZWRDbGFzc0NvbnN0cnVjdG9yKCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBhcnJheQotCQlPYmplY3RbXSBnZXRQYXJtcyA9IChhcmd1bWVudFR5cGVzICE9IG51bGwpID8gbmV3IE9iamVjdFtdIHsgbmV3IFRyYW5zbWl0YWJsZUFycmF5KENvbW1hbmRzLkNMQVNTX0NMQVNTLCBhcmd1bWVudFR5cGVzKX0gOiAvLyBHZXQgQ3RvciBoYXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gb25seSBvbmUgcGFybSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gdGhlIGFycmF5IG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIHBhcm0gdHlwZXMuCi0JCQkJbnVsbDsKLQotCQl0cnkgewotCQkJcmV0dXJuIChJQ29uc3RydWN0b3JQcm94eSkgZ2V0Q3Rvck1ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgZ2V0UGFybXMpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOyAvLyBJbnRlcmZhY2VzIGRvbid0IGhhdmUgY3RvcidzLgotCi0JCUlSRU1NZXRob2RQcm94eSBnZXRDdG9yTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0RGVjbGFyZWRDbGFzc0NvbnN0cnVjdG9ycygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgY3RvcnMgPSAoSUFycmF5QmVhblByb3h5KSBnZXRDdG9yTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBudWxsKTsKLQkJCUlCZWFuUHJveHlbXSBwcm94aWVzID0gY3RvcnMuZ2V0U25hcHNob3QoKTsKLQkJCUlDb25zdHJ1Y3RvclByb3h5W10gY3RvcnByb3hpZXMgPSBuZXcgSUNvbnN0cnVjdG9yUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBjdG9ycHJveGllcywgMCwgcHJveGllcy5sZW5ndGgpOwotCQkJcmV0dXJuIGN0b3Jwcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldEZpZWxkcygpIHsKLQotCQlJUkVNTWV0aG9kUHJveHkgZ2V0RmllbGRzTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NHZXRGaWVsZHMoKTsKLQotCQl0cnkgewotCQkJSUFycmF5QmVhblByb3h5IGZpZWxkcyA9IChJQXJyYXlCZWFuUHJveHkpIGdldEZpZWxkc01ldGhvZC5pbnZva2VXaXRoUGFybXModGhpcywgbnVsbCk7Ci0JCQlJQmVhblByb3h5W10gcHJveGllcyA9IGZpZWxkcy5nZXRTbmFwc2hvdCgpOwotCQkJSUZpZWxkUHJveHlbXSBmaWVsZFByb3hpZXMgPSBuZXcgSUZpZWxkUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBmaWVsZFByb3hpZXMsIDAsIHByb3hpZXMubGVuZ3RoKTsKLQkJCXJldHVybiBmaWVsZFByb3hpZXM7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWZSZWdpc3RyeS5yZWxlYXNlUHJveHkoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0KLQkJSVJFTU1ldGhvZFByb3h5IGdldERlY2xhcmVkRmllbGRzTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NHZXREZWNsYXJlZEZpZWxkcygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgZmllbGRzID0gKElBcnJheUJlYW5Qcm94eSkgZ2V0RGVjbGFyZWRGaWVsZHNNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIG51bGwpOwotCQkJSUJlYW5Qcm94eVtdIHByb3hpZXMgPSBmaWVsZHMuZ2V0U25hcHNob3QoKTsKLQkJCUlGaWVsZFByb3h5W10gZmllbGRQcm94aWVzID0gbmV3IElGaWVsZFByb3h5W3Byb3hpZXMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJveGllcywgMCwgZmllbGRQcm94aWVzLCAwLCBwcm94aWVzLmxlbmd0aCk7Ci0JCQlyZXR1cm4gZmllbGRQcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldERlY2xhcmVkRmllbGRQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eSBnZXREZWNsYXJlZEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gKElGaWVsZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRDbGFzc0dldERlY2xhcmVkRmllbGQoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywKLQkJCQlmUmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmllbGROYW1lKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRGaWVsZFByb3h5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0RmllbGRQcm94eSh0aGlzLGZpZWxkTmFtZSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpOwotCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRGaWVsZFByb3h5KGV4cHJlc3Npb24sIHRoaXMsIGZpZWxkTmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpIHsKLQotCQlJUkVNTWV0aG9kUHJveHkgZ2V0TWV0aG9kc01ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzTWV0aG9kcygpOwotCi0JCXRyeSB7Ci0JCQlJQXJyYXlCZWFuUHJveHkgbWV0aG9kcyA9IChJQXJyYXlCZWFuUHJveHkpIGdldE1ldGhvZHNNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIG51bGwpOwotCQkJSUJlYW5Qcm94eVtdIHByb3hpZXMgPSBtZXRob2RzLmdldFNuYXBzaG90KCk7Ci0JCQlJTWV0aG9kUHJveHlbXSBtZXRob2RQcm94aWVzID0gbmV3IElNZXRob2RQcm94eVtwcm94aWVzLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByb3hpZXMsIDAsIG1ldGhvZFByb3hpZXMsIDAsIHByb3hpZXMubGVuZ3RoKTsKLQkJCXJldHVybiBtZXRob2RQcm94aWVzOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB7Ci0KLQkJSVJFTU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kc01ldGhvZCA9IChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzRGVjbGFyZWRNZXRob2RzKCk7Ci0KLQkJdHJ5IHsKLQkJCUlBcnJheUJlYW5Qcm94eSBtZXRob2RzID0gKElBcnJheUJlYW5Qcm94eSkgZ2V0RGVjbGFyZWRNZXRob2RzTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBudWxsKTsKLQkJCUlCZWFuUHJveHlbXSBwcm94aWVzID0gbWV0aG9kcy5nZXRTbmFwc2hvdCgpOwotCQkJSU1ldGhvZFByb3h5W10gbWV0aG9kUHJveGllcyA9IG5ldyBJTWV0aG9kUHJveHlbcHJveGllcy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcm94aWVzLCAwLCBtZXRob2RQcm94aWVzLCAwLCBwcm94aWVzLmxlbmd0aCk7Ci0JCQlyZXR1cm4gbWV0aG9kUHJveGllczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZlJlZ2lzdHJ5LnJlbGVhc2VQcm94eShlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldE1ldGhvZFByb3h5KHRoaXMsbWV0aG9kTmFtZSwoU3RyaW5nW10pbnVsbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRNZXRob2RQcm94eSh0aGlzLG1ldGhvZE5hbWUsYXJndW1lbnRDbGFzc05hbWVzKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpOwotCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCB0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGV4cHJlc3Npb24uZ2V0UmVnaXN0cnkoKTsKLQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgdGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIChJUHJveHlCZWFuVHlwZVtdKSBudWxsKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRNZXRob2RQcm94eSh0aGlzLG1ldGhvZE5hbWUsbmV3IFN0cmluZ1tdIHthcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0TWV0aG9kUHJveHkodGhpcyxtZXRob2ROYW1lLGFyZ3VtZW50VHlwZXMpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0KLQkJLy8gVHVybiBjbGFzcyBuYW1lcyBpbnRvIGFycmF5IG9mIEJlYW5UeXBlcy4KLQkJSUJlYW5UeXBlUHJveHlbXSBhcmdUeXBlcyA9IG51bGw7Ci0JCWlmIChhcmd1bWVudENsYXNzTmFtZXMgIT0gbnVsbCkgewotCQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJCWFyZ1R5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W2FyZ3VtZW50Q2xhc3NOYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQmVhblR5cGVQcm94eSB0eXBlID0gYXJnVHlwZXNbaV0gPSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGFyZ3VtZW50Q2xhc3NOYW1lc1tpXSk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7IC8vIENvdWxkbid0IGZpbmQgdGhlIHR5cGUuCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVjbGFyZWRNZXRob2RQcm94eShtZXRob2ROYW1lLCBhcmdUeXBlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJSVJFTU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0Q2xhc3NEZWNsYXJlZE1ldGhvZCgpOwotCQlJQmVhblByb3h5IG5hbWVQcm94eSA9IGZSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChtZXRob2ROYW1lKTsKLQkJLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBhcnJheQotCQlPYmplY3RbXSBnZXRQYXJtcyA9IChhcmd1bWVudFR5cGVzICE9IG51bGwpID8gbmV3IE9iamVjdFtdIHsgbmFtZVByb3h5LCBuZXcgVHJhbnNtaXRhYmxlQXJyYXkoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MsIGFyZ3VtZW50VHlwZXMpfSA6IG5ldyBPYmplY3RbXSB7bmFtZVByb3h5LCBudWxsfTsKLQotCQl0cnkgewotCQkJcmV0dXJuIChJTWV0aG9kUHJveHkpIGdldERlY2xhcmVkTWV0aG9kTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBnZXRQYXJtcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWZSZWdpc3RyeS5yZWxlYXNlUHJveHkoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRJbnZva2FibGUodGhpcyxtZXRob2ROYW1lLChTdHJpbmdbXSludWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnByb3h5Q29uc3RhbnRzLmdldEludm9rYWJsZSh0aGlzLG1ldGhvZE5hbWUsYXJndW1lbnRDbGFzc05hbWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGdldEludm9rYWJsZShtZXRob2ROYW1lLCBuZXcgU3RyaW5nW10geyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0SW52b2thYmxlKHRoaXMsbWV0aG9kTmFtZSxhcmd1bWVudFR5cGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE51bGxDb25zdHJ1Y3RvclByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0TnVsbENvbnN0cnVjdG9yUHJveHkoKSB7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvclByb3h5KChJQmVhblR5cGVQcm94eVtdKSBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKQotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZSZWdpc3RyeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldFN1cGVyQmVhblR5cGVQcm94eSgpCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFN1cGVyQmVhblR5cGVQcm94eSgpIHsKLQkJcmV0dXJuIGZTdXBlclR5cGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc25hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc0ludGVyZmFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzUHJpbWl0aXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNLaW5kT2Yob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNLaW5kT2YoSUJlYW5UeXBlUHJveHkgYUJlYW5Qcm94eVR5cGUpIHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzSXNBc3NpZ25hYmxlRnJvbSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygKLQkJCQlhQmVhblByb3h5VHlwZSwgdGhpcykpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSkuY3JlYXRlQmVhblByb3h5KHRoaXMsIGluaXRpYWxpemF0aW9uU3RyaW5nKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiKCIgKyBnZXRUeXBlTmFtZSgpICsgIikiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNnZXRUeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5jbGFzc0NsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSN0b0JlYW5TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZlJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSkuY3JlYXRlQmVhblByb3h5KHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I3JlbmRlckJlYW4ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZS5zZXRPYmplY3RJRChnZXRJRCgpLmludFZhbHVlKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gQnkgZGVmYXVsdCBub25lIGhhdmUgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3IuIFRoZXJlIGlzIGEgc3BlY2lhbCBpbnN0YW5jZSBmb3IgaW5pdCBlcnJvcnMuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIEludGVyZmFjZXMgZG9uJ3QgaGF2ZSBjdG9yJ3MuCi0KLQkJSVJFTU1ldGhvZFByb3h5IGZpbmRDb21wYXRpYmxlTWV0aG9kID0gKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0RmluZENvbXBhdGlibGVDb25zdHJ1Y3Rvck1ldGhvZCgpOwotCi0JCS8vIENyZWF0ZSB0aGUgYXJndW1lbnQgYXJyYXkKLQkJT2JqZWN0W10gZ2V0UGFybXMgPSAoYXJndW1lbnRUeXBlcyAhPSBudWxsKSA/IG5ldyBPYmplY3RbXSB7IHRoaXMsIG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5DTEFTU19DTEFTUywgYXJndW1lbnRUeXBlcyl9IDogbmV3IE9iamVjdFtdIHt0aGlzLCBudWxsfTsKLQotCQl0cnkgewotCQkJcmV0dXJuIChJQ29uc3RydWN0b3JQcm94eSkgZmluZENvbXBhdGlibGVNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIGdldFBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZS5nZXRUeXBlUHJveHkoKS5lcXVhbHMoZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGUuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCWVsc2UgaWYgKGUuZ2V0VHlwZVByb3h5KCkuZXF1YWxzKGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQkJCXRocm93IG5ldyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24oZS5nZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJfQotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIHsKLQotCQlJUkVNTWV0aG9kUHJveHkgZmluZENvbXBhdGlibGVNZXRob2QgPSAoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZlJlZ2lzdHJ5KS5nZXRGaW5kQ29tcGF0aWJsZU1ldGhvZE1ldGhvZCgpOwotCQlJQmVhblByb3h5IG1ldGhvZE5hbWVQcm94eSA9IGZSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChtZXRob2ROYW1lKTsKLQotCQkvLyBDcmVhdGUgdGhlIGFyZ3VtZW50IGFycmF5Ci0JCU9iamVjdFtdIGdldFBhcm1zID0gKGFyZ3VtZW50VHlwZXMgIT0gbnVsbCkgPyBuZXcgT2JqZWN0W10geyB0aGlzLCBtZXRob2ROYW1lUHJveHksIG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5DTEFTU19DTEFTUywgYXJndW1lbnRUeXBlcyl9IDogbmV3IE9iamVjdFtdIHt0aGlzLCBtZXRob2ROYW1lUHJveHksIG51bGx9OwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKElNZXRob2RQcm94eSkgZmluZENvbXBhdGlibGVNZXRob2QuaW52b2tlV2l0aFBhcm1zKHRoaXMsIGdldFBhcm1zKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZS5nZXRUeXBlUHJveHkoKS5lcXVhbHMoZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGUuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCWVsc2UgaWYgKGUuZ2V0VHlwZVByb3h5KCkuZXF1YWxzKGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQkJCXRocm93IG5ldyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24oZS5nZXRQcm94eUxvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmUmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOwotCQkJfQotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0JlYW5Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCZWFuUHJveHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNFeHByZXNzaW9uUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGM3NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgYW55IG9mIHRoZSBudW1iZXIgYmVhbiB0eXBlIHN1YmNsYXNzZXMuCi0gKiBOT1RFOiBUaGlzIGRvZXMgbm90IHJlcHJlc2VudCB0aGUgYmVhbnR5cGUgTnVtYmVyLiBJdCBpcyBhCi0gKiBjbGFzcyB0aGF0IHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgTnVtYmVyIHN1YmNsYXNzIGJlYW50eXBlcy4KLSAqIFRoZSBOdW1iZXIgYmVhbnR5cGUgaXRzZWxmIGlzIHNpbXBseSBhIFJFTUJlYW5UeXBlUHJveHkgc2luY2UKLSAqIE51bWJlciBpcyBhYnN0cmFjdCBhbmQgaGFzIG5vIG5lY2Vzc2FyeSBleHRyYSBmdW5jdGlvbi4KLSAqIENyZWF0aW9uIGRhdGU6ICgwOC8zMS8wMCAxMTo0OToxMiBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkgewotCi1wcm90ZWN0ZWQgUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgYVN1cGVyVHlwZSk7Ci19Ci0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZU51bWJlckJlYW5Qcm94eShOdW1iZXIgYU51bWJlcik7Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIE51bWJlciB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gVGhleSBhcmUgY3JlYXRlZAotICogZXhwbGljaXRseSB0aHJvdWdoIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBOdW1iZXIgdHlwZXMsIHRoZXkgYXJlIGZpbmFsIGNsYXNzZXMsIHNvIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSAKLSAqIGZvciBzdWJjbGFzc2VzLgotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIE51bWJlcidzIGRvbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIEVhY2ggYmVhbnR5cGUgd2lsbCByZXR1cm4gYSBkZWZhdWx0IHZhbHVlICh1c3VhbGx5IGEgdmFsdWUgb2YgMCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5OwotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U5MzM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBSRU1BY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklBY2Nlc3NpYmxlT2JqZWN0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuVGhyb3dhYmxlUHJveHk7Ci0gCi0vKioKLSAqIEFjY2Vzc2libGVPYmplY3QgUHJveHkuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUkVNQWNjZXNzaWJsZU9iamVjdFByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuUHJveHkgaW1wbGVtZW50cyBJQWNjZXNzaWJsZU9iamVjdFByb3h5IHsKLQotCXByb3RlY3RlZCBSRU1BY2Nlc3NpYmxlT2JqZWN0UHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklEKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQWNjZXNzaWJsZU9iamVjdFByb3h5I2lzQWNjZXNzaWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NpYmxlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoSUJvb2xlYW5CZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QWNjZXNzaWJsZUlzQWNjZXNzaWJsZSgpLmludm9rZSh0aGlzKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUFjY2Vzc2libGVPYmplY3RQcm94eSNzZXRBY2Nlc3NpYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzaWJsZShib29sZWFuIGZsYWcpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCVJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QWNjZXNzaWJsZVNldEFjY2Vzc2libGUoKS5pbnZva2UodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmxhZykpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjZ2V0VHlwZVByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5hY2Nlc3NpYmxlVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiYWYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgcHJveHkgZm9yIGFuIGFic3RyYWN0IGJlYW4gdHlwZS4gSS5lLiB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGl0LgotICogSXQgY2FuIGJlIHVzZWQgYXMgYSBnZW5lcmFsIGFic3RyYWN0IHR5cGUuIEl0IHdpbGwgcGFzcyBuZXdCZWFuVHlwZUZvckNsYXNzIHVudG8KLSAqIHRoZSBtYWluIHN1cGVyIHR5cGUgcGFzc2VkIGluLgotICovCi0gCi1wdWJsaWMgY2xhc3MgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgewotCi0JcHJvdGVjdGVkIElSRU1TcGVjaWFsQmVhblR5cGVQcm94eSBmTWFpblN1cGVyVHlwZTsJLy8gVGhlIHR5cGUgdGhhdCB0aGlzIHdhcyBjcmVhdGVkIGZyb20gc28gdGhhdAotCQkJCQkJCS8vIGFueSBub24tYWJzdHJhY3Qgc3ViY2xhc3NlcyBjYW4gY3JlYXRlIHRoZSBjb3JyZWN0Ci0JCQkJCQkJLy8gdHlwZSBvZiBiZWFudHlwZSBwcm94eS4KLQkJCQkJCi0JcHVibGljIFJFTUFuQWJzdHJhY3RCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSwgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IGFUeXBlKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgYVN1cGVyVHlwZSk7Ci0JCWZNYWluU3VwZXJUeXBlID0gYVR5cGU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLQkgKgotCSAqIEZvciBhbGwgb2YgdGhlIGFic3RyYWN0IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLiAKLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0JCi0JCi0JLyoqCi0JICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBhYnN0cmFjdCBjbGFzc2VzIGNhbiBuZXZlciBiZSBkb25lLAotCSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsgCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIGZNYWluU3VwZXJUeXBlLm5ld0JlYW5UeXBlRm9yQ2xhc3MoYW5JRCwgYUNsYXNzbmFtZSwgYW5BYnN0cmFjdCwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIHJlbGVhc2UgLSBCZWFuVHlwZSBpcyBhYm91dCB0byBiZSByZWxlYXNlZC4KLQkgKiBDbGVhciB0aGUgZk1haW5TdXBlcnR5cGUgKHN1cGVydHlwZSBpcyBjbGVhcmVkIHNvIHRoYXQKLQkgKiBpdCB3b24ndCBob2xkIG9udG8gaXQgYW5kIHdpbGwgbGV0IHRoZSBzdXBlcnR5cGUgYmUgR0MnZAotCSAqIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmTWFpblN1cGVyVHlwZSA9IG51bGw7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9CQkJCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQXJyYXlCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQXJyYXlCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1MzNhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQXJyYXlCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZEVycm9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIElERSBWTSB2ZXJzaW9uIG9mIHRoZSBBcnJheSBwcm94eQotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSRU1BcnJheUJlYW5Qcm94eSBleHRlbmRzIFJFTUJlYW5Qcm94eSBpbXBsZW1lbnRzIElBcnJheUJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aCA9IC0xOwotCQotCVJFTUFycmF5QmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBJQmVhblR5cGVQcm94eSBhVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFUeXBlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0KGludCBpbmRleCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gRm9ybWF0IG9mIGdldHRlciBwYXJtcyBpczogKE9iamVjdCAoYXJyYXkpLCBpbnQgKGluZGV4KSkuCi0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHt0aGlzLCBuZXcgSW50ZWdlcihpbmRleCl9OwotCQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCQkvLyBpZiB3ZSBqdXN0IHVzZWQgdGhlIHN0YW5kYXJkIGdldCwgaWYgdGhlIHR5cGUgd2FzICJpbnQiIHRoZSB2YWx1ZSByZXR1cm5lZCB3b3VsZCBiZSBhbiBqYXZhLmxhbmcuSW50ZWdlci4KLQkJSUJlYW5UeXBlUHJveHkgY29tcFR5cGUgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWlmICghY29tcFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJLy8gVXNlIHN0YW5kYXJkIGdldHRlci4KLQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQl9IGVsc2UgewotCQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIuCi0JCQlpbnQgaWQgPSAoKElSRU1CZWFuUHJveHkpIGNvbXBUeXBlKS5nZXRJRCgpLmludFZhbHVlKCk7Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSBDb21tYW5kcy5CWVRFX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldEJ5dGUoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkJPT0xFQU5fVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5R2V0Qm9vbGVhbigpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuQ0hBUkFDVEVSX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldENoYXIoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkRPVUJMRV9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXREb3VibGUoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkZMT0FUX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldEZsb2F0KCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5JTlRFR0VSX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldEludCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuTE9OR19UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRMb25nKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5TSE9SVF9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlHZXRTaG9ydCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIG11bHRpLWRpbWVuc2lvbmFsIGluZGV4LgotCSAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQsCi0JICogYW5kIGVhY2ggaW5kZXggYWxvbmcgdGhlIHdheSBtdXN0IGV4aXN0LgotCSAqIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBjYW4ndCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgotCSAqIG9mIGRpbWVuc2lvbnMgb2YgdGhlIHJlYWwgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldChpbnQgW10gaW5kZXhlcykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gRm9ybWF0IG9mIGdldHRlciBwYXJtcyBpczogKE9iamVjdCAoYXJyYXkpLCBpbnRbXSAoaW5kZXhlcykpLgotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbXSB7dGhpcywgaW5kZXhlc307Ci0JCS8vIElmIHRoZSBjb21wb25lbnQgdHlwZSBhdCB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbiBpcyBwcmltaXRpdmUsIHdlIG5lZWQgdG8gdXNlIHRoZSBjb3JyZWN0IGdldHRlciBzbyB0aGF0IGEgdmFsaWQgdmFsdWUgaXMgcmV0dXJuZWQsCi0JCS8vIGlmIHdlIGp1c3QgdXNlZCB0aGUgc3RhbmRhcmQgZ2V0LCBpZiB0aGUgdHlwZSB3YXMgImludCIgdGhlIHZhbHVlIHJldHVybmVkIHdvdWxkIGJlIGFuIGphdmEubGFuZy5JbnRlZ2VyLgotCQlpbnQgZGltcyA9ICgoSUFycmF5QmVhblR5cGVQcm94eSkgZ2V0VHlwZVByb3h5KCkpLmdldERpbWVuc2lvbnMoKTsKLQkJaWYgKGRpbXMgPCBpbmRleGVzLmxlbmd0aCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsJLy8gVG9vIG1hbnkgZGltZW5zaW9ucwotCQlJQmVhblR5cGVQcm94eSBmaW5hbENvbXBUeXBlID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7CQkJCi0JCWlmIChkaW1zID09IGluZGV4ZXMubGVuZ3RoICYmIGZpbmFsQ29tcFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJLy8gVXNlIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSBnZXR0ZXIgYmVjYXVzZSB3ZSBhcmUgYWNjZXNzaW5nIHRoZSBmaW5hbCBjb21wb25lbnQgYW5kIGl0IGlzIHByaW1pdGl2ZS4KLQkJCWludCBpZCA9ICgoSVJFTUJlYW5Qcm94eSkgZmluYWxDb21wVHlwZSkuZ2V0SUQoKS5pbnRWYWx1ZSgpOwotCQkJc3dpdGNoIChpZCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQllURV9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRCeXRlKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5CT09MRUFOX1RZUEU6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUhlbHBlckdldEJvb2xlYW4oKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkNIQVJBQ1RFUl9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRDaGFyKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5ET1VCTEVfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0RG91YmxlKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRGbG9hdCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuSU5URUdFUl9UWVBFOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0QXJyYXlIZWxwZXJHZXRJbnQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCQljYXNlIENvbW1hbmRzLkxPTkdfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0TG9uZygpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCQkJCWNhc2UgQ29tbWFuZHMuU0hPUlRfVFlQRToKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0U2hvcnQoKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIEl0IGlzIG5vdCB0aGUgZmluYWwgY29tcG9uZW50LCBvciBpdCBpcyBub3QgcHJpbWl0aXZlLCB1c2UgdGhlIHN0YW5kYXJkIGFjY2Vzc29yLgotCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyR2V0KCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQmVhblByb3h5IHZhbHVlLCBpbnQgaW5kZXgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIEZvcm1hdCBvZiBzZXR0ZXIgcGFybXMgaXM6IChPYmplY3QgKGFycmF5KSwgaW50IChpbmRleCksIE9iamVjdCAodmFsdWUpKS4KLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0W10ge3RoaXMsIG5ldyBJbnRlZ2VyKGluZGV4KSwgdmFsdWV9OwotCQkoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheVNldCgpKS5pbnZva2VXaXRoUGFybXMobnVsbCwgcGFybXMpOwotCX0KLQkJCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBtdWx0aS1kaW1lbnNpb25hbCBpbmRleC4KLQkgKiBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgc3BlY2lmaWVkLAotCSAqIGFuZCBlYWNoIGluZGV4IGFsb25nIHRoZSB3YXkgbXVzdCBleGlzdC4KLQkgKiBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKLQkgKiBvZiBkaW1lbnNpb25zIG9mIHRoZSByZWFsIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUJlYW5Qcm94eSB2YWx1ZSwgaW50IFtdIGluZGV4ZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIEZvcm1hdCBvZiBzZXR0ZXIgcGFybXMgaXM6IChPYmplY3QgKGFycmF5KSwgaW50W10gKGluZGV4ZXMpLCBPYmplY3QgKHZhbHVlKSkuCi0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHt0aGlzLCBpbmRleGVzLCB2YWx1ZX07Ci0JCSgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEFycmF5SGVscGVyU2V0KCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhpcyBhcnJheS4KLQkgKiBJZiB0aGVyZSBhcmUgbXVsdGktZGltZW5zaW9ucywgeW91IG11c3QgZ2V0IHRoZSBhcHByb3ByaWF0ZQotCSAqIGRpbWVuc2lvbiBmcm9tIHRoZSBnZXQgbWV0aG9kIHRvIHNlZSB0aGUgc2l6ZSBvZiB0aGF0IGRpbWVuc2lvbi4KLQkgKgotCSAqIGUuZy4KLQkgKiAgICBpbnQgWzNdIHJldHVybnMgMwotCSAqICAgIGludCBbM11bMl0gcmV0dXJucyAzCi0JICoKLQkgKiAgICAoKElBcnJheUJlYW5Qcm94eSkgZ2V0KDEpKS5nZXRMZW5ndGgoKSByZXR1cm5zIDIKLQkgKiAgICBTaW5jZSBhcnJheXMgZG8gbm90IGhhdmUgdG8gYmUgaG9tb2dlbm91cywgdGhlcmUgY291bGQKLQkgKiAgICBiZSBhIGRpZmZlcmVudCBsZW5ndGggYXJyYXkgZm9yIGVhY2ggb2YgdGhlIGFycmF5cyAKLQkgKiAgICByZXR1cm5lZCBmcm9tIHRoZSBmaXJzdCBkaW1lbnNpb24sIHRoZSByZXR1cm5lZCBsZW5ndGgKLQkgKiAgICBmcm9tIGdldCgyKSBhbmQgZ2V0KDMpIGNvdWxkIHJlc3VsdCBpbiBhIGRpZmZlcmVudCB2YWx1ZQotCSAqICAgIGZyb20gZ2V0KDEpLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAoZkxlbmd0aCA9PSAtMSkgewotCQkJLy8gSXQgaGFzbid0IHlldCBiZWVuIHF1aWVyZWQuCi0JCQlmTGVuZ3RoID0gKChJSW50ZWdlckJlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRBcnJheUdldExlbmd0aCgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhudWxsLCB0aGlzKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZkxlbmd0aDsKLQl9CQotCQotCXB1YmxpYyBJQmVhblByb3h5IGdldENhdGNoVGhyb3dhYmxlRXhjZXB0aW9uKGludCBpbmRleCl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0KGluZGV4KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsJCSAvLyROT04tTkxTLTEkCi0JCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7CS8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQXJyYXlCZWFuUHJveHkjZ2V0U25hcHNob3QoKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5W10gZ2V0U25hcHNob3QoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZkZhY3RvcnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQkJcHJveHlGYWN0b3J5LnN0YXJ0VHJhbnNhY3Rpb24oKTsgLy8gVGhpcyBpcyBkZWZpbmF0ZWx5IGEgdHJhbnNhY3Rpb24sIHNvIHN0YXJ0IGl0LgotCQl0cnkgewotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcmV0dXJuVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY29ubmVjdC5nZXRBcnJheUNvbnRlbnRzKGdldElEKCkuaW50VmFsdWUoKSwgcmV0dXJuVmFsdWUpOwotCQkJCQlyZXR1cm4gcHJvY2Vzc1JldHVyblZhbHVlKGNvbm5lY3QsIHJldHVyblZhbHVlKTsKLQkJCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJCQlwcm94eUZhY3RvcnkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkJLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4KLQkJCQkJZkZhY3RvcnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJY29ubmVjdCA9IGZGYWN0b3J5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb25uZWN0LmdldEFycmF5Q29udGVudHMoZ2V0SUQoKS5pbnRWYWx1ZSgpLCByZXR1cm5WYWx1ZSk7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc1JldHVyblZhbHVlKGNvbm5lY3QsIHJldHVyblZhbHVlKTsKLQkJCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlQWdhaW4pIHsKLQkJCQkJCS8vIEZhaWxlZCBhZ2Fpbi4gSnVzdCBjbG9zZSBhbmQgcHJpbnQgdHJhY2UuCi0JCQkJCQlmRmFjdG9yeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlQWdhaW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBBIHJlY292ZXJhYmxlIGVycm9yLCBwcmludCB0cmFjZSBhbmQgcmV0dXJuCi0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJveHlGYWN0b3J5LnN0b3BUcmFuc2FjdGlvbigpOwotCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKLQkJCQlmRmFjdG9yeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoKLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBJQmVhblByb3h5W10gcHJvY2Vzc1JldHVyblZhbHVlKElSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24sIFZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHkgewotCQkvLyBJdCBpcyBhbiBhcnJheSBjb250YWluaW5nIElEcywgYXMgaXQgbm9ybWFsbHkgd291bGQgYmUuCi0JCS8vIEhvd2V2ZXIgaXQgd2lsbCBiZWNvbWUgSUJlYW5Qcm94eVtdLiBUaGF0IGlzIGJlY2F1c2UgaWYgSUQncwotCQkvLyB0aGV5IG11c3QgYmUgcHJveGllcyBvdmVyIGhlcmUuCi0JCUJlYW5Qcm94eVZhbHVlU2VuZGVyIHZhbHVlU2VuZGVyID0gbmV3IEJlYW5Qcm94eVZhbHVlU2VuZGVyKChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSwgcmV0dXJuVmFsdWUpOwotCQljb25uZWN0aW9uLnJlYWRQcm94eUFycmF5VmFsdWVzKHJldHVyblZhbHVlLCB2YWx1ZVNlbmRlciwgZmFsc2UpOwotCQlFeGNlcHRpb24gZSA9IHZhbHVlU2VuZGVyLmdldEV4Y2VwdGlvbigpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFRocm93YWJsZVByb3h5KQotCQkJCXRocm93IChUaHJvd2FibGVQcm94eSkgZTsKLQkJCWVsc2UKLQkJCQl0aHJvdyAoQ29tbWFuZEV4Y2VwdGlvbikgZTsKLQkJfQotCQlPYmplY3QgdmFscyA9IHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCUlCZWFuUHJveHlbXSBwcm94eUFycmF5ID0gbmV3IElCZWFuUHJveHlbQXJyYXkuZ2V0TGVuZ3RoKHZhbHMpXTsKLQkJU3lzdGVtLmFycmF5Y29weSh2YWxzLCAwLCBwcm94eUFycmF5LCAwLCBwcm94eUFycmF5Lmxlbmd0aCk7Ci0JCXJldHVybiBwcm94eUFycmF5OwotCX0KLQkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1BcnJheUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlNDBhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUFycmF5QmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUFycmF5QmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1hcFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIEFycmF5IFR5cGUgUHJveHkgZm9yIHRoZSBJREUgVk0uCi0gKgotICogVGhlIGNsYXNzIGlzIGZpbmFsIGJlY2F1c2UgYXJyYXkncyBhcmUgc3BlY2lhbCBhbmQgc2hvdWxkbid0IGhhdmUKLSAqIGFueSBzdWJjbGFzc2VzIHNpbmNlIHRoZSBmYWN0b3J5IHdvdWxkIG5ldmVyIGNhbGwgaXQuCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJFTUFycmF5QmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElBcnJheUJlYW5UeXBlUHJveHkgewotCQotCS8qKgotCSAqIENyZWF0ZSB3aXRoIGEgcmVnaXN0cnkgYW5kIGEgY2xhc3MuIEl0IGlzIHBhY2thZ2Ugc28gdGhhdCBvbmx5IAotCSAqIHRoZSBmYWN0b3J5IHdpdGggdGhpcyBJREUgcGFja2FnZSBjYW4gY2FsbCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgUkVNQXJyYXlCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgb2JqZWN0VHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIG9iamVjdFR5cGUpOwotCX0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIGFycmF5IHR5cGUhCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpIHsKLQkJLy8gQ29tcG9uZW50IHR5cGUgaXMgc3RyaXAgb2ZmIGFsbCAnWycgYW5kIHJldHVybiBjbGFzcyBuYW1lIChpZiB3ZSBldmVyIGFkZCBjbGFzc0xvYWRlciBzdXBwb3J0LCB0aGlzIHdvbid0IHdvcmspLgotCQkvLyBIb3dldmVyLCBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGNoYW5nZSB0YWJsZSkuCi0JCWludCB0eXBlU3RhcnQgPSBnZXRUeXBlTmFtZSgpLmxhc3RJbmRleE9mKCdbJykrMTsKLQkJaWYgKGdldFR5cGVOYW1lKCkuY2hhckF0KHR5cGVTdGFydCkgPT0gJ0wnKSB7Ci0JCQkvLyBJdCBpcyBhIGNsYXNzLgotCQkJLy8gU3RyaXAgb2ZmIHVwIHRvIHRoZSAnTCcsIGFuZCB0aGUgdHJhaWxpbmcgJzsnLiBUaGF0IGlzIHRoZSBjbGFzcyBuYW1lLgotCQkJcmV0dXJuIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoZ2V0VHlwZU5hbWUoKS5zdWJzdHJpbmcodHlwZVN0YXJ0KzEsIGdldFR5cGVOYW1lKCkubGVuZ3RoKCktMSkpOwotCQl9IGVsc2UgewotCQkJLy8gSXQgaXMgYSB0eXBlLiBOZWVkIHRvIG1hcCBpdC4KLQkJCUNsYXNzIGFUeXBlID0gKENsYXNzKSBNYXBUeXBlcy5NQVBfU0hPUlRTSUdfVE9fVFlQRS5nZXQoZ2V0VHlwZU5hbWUoKS5zdWJzdHJpbmcodHlwZVN0YXJ0LCB0eXBlU3RhcnQrMSkpOwotCQkJcmV0dXJuIGFUeXBlICE9IG51bGwgPyBmUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGFUeXBlLmdldE5hbWUoKSkgOiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29tcG9uZW50IHR5cGUuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldENvbXBvbmVudFR5cGUoKSB7Ci0JCS8vIENvbXBvbmVudCB0eXBlIGlzIHN0cmlwIG9mZiBmaXJzdCAnWycgYW5kIHJldHVybiBjbGFzcyBuYW1lIChpZiB3ZSBldmVyIGFkZCBjbGFzc0xvYWRlciBzdXBwb3J0LCB0aGlzIHdvbid0IHdvcmspLgotCQkvLyBIb3dldmVyLCBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGNoYW5nZSB0YWJsZSkuCi0JCWlmIChnZXRUeXBlTmFtZSgpLmNoYXJBdCgxKSAhPSAnWycpIHsKLQkJCS8vIEl0IGlzIGEgb25lIGRpbWVuc2lvbmFsIGFycmF5LCBqdXN0IHNlbmQgdG8gZ2V0RmluYWxDb21wb25lbnRUeXBlIHRvIGZpZ3VyZSBvdXQgdGhlIHR5cGUuCi0JCQlyZXR1cm4gZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdCBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LiBKdXN0IHN0cmlwIG9mZiBvbmUgJ1snIGFuZCBzZW5kIHRoYXQgdG8gdGhlIGJlYW4gdHlwZSBmYWN0b3J5LgotCQkJcmV0dXJuIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoZ2V0VHlwZU5hbWUoKS5zdWJzdHJpbmcoMSkpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuCi0JICovCi0JcHVibGljIGludCBnZXREaW1lbnNpb25zKCkgewotCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKS5sYXN0SW5kZXhPZignWycpKzE7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBVc2UgdGhlIGNvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIHRoZSB0eXBlIHByb3h5IHRvIGJlIHNldCBhcyB3ZWxsIGFzIHRoZSBiZWFuCi0JICogYmVjYXVzZSB3ZSBhcmUgdGhlIHR5cGUgYW5kIGJ5IHNldHRpbmcgaXQgbm93IHdlIG1pZ2h0IGF2b2lkIGl0IGJlaW5nIGxvb2t1cCBmb3IgaW4gdGhlCi0JICogZmFjdG9yeSB0aGUgZmlyc3QgdGltZSBpdCBpcyBhc2tlZCBmb3IuCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQlyZXR1cm4gbmV3IFJFTUFycmF5QmVhblByb3h5KGZSZWdpc3RyeSwgYW5JRCwgdGhpcyk7Ci0JfQotCQotCQotCS8qKgotCSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotCSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLQkgKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0JICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLQkgKiB0aGF0IGNhbiBiZSBkb25lLgotCSAqCi0JICogQXJyYXlzIGNhbid0IGJlIHN1YmNsYXNzZWQuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVsbCBjdG9yIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwkJCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCkgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7CQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0Q29uc3RydWN0b3JzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKiAKLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7CQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7CQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9CQotCQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBmaWVsZCBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKiAKLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKiAKLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldERlY2xhcmVkTWV0aG9kcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLgotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLgotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuCi0JICogRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLgotCSAqIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgkgCi0JICovCQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwkJCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSkgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBhcnJheSBiZWFuIHByb3h5LgotCSAqCi0JICogICAtIChpbnQsIG5ldyBpbnRbMl0gezMsIDR9KSB3aWxsIGNyZWF0ZToKLQkgKiAgICAgIGludCBbM10gWzRdCi0JICoKLQkgKiAgIC0gKGludFtdLCBuZXcgaW50WzFdIHsxfSkKLQkgKiAgICAgIGludCBbMV0KLQkgKgotCSAqICAgLSAoaW50W10sIG5ldyBpbnRbMl0gezIsM30pCi0JICogICAgICBpbnQgWzJdIFszXQotCSAqIAotCSAqCi0JICogICAtIChpbnRbXSwgbnVsbCkgb3IgKGludFtdLCBuZXcgaW50WzBdKSBvciAoaW50LCBudWxsKSBvciAoaW50LCBuZXcgaW50WzBdKQotCSAqICAgICAgaW50IFswXQotCSAqICAgICAoaW50W11bXSwgbnVsbCkgb3IgKGludFtdW10sIG5ldyBpbnRbMF0pCi0JICogICAgICBpbnRbMF1bXQotCSAqICAgICBUaGlzIGlzIGJlY2F1c2UgYW4gYXJyYXkgaW5zdGFuY2Ugd2l0aCBubyBkaW1lbnNpb25zIHNwZWNpZmllZCBpcyBub3QgdmFsaWQuIAotCSAqCi0JICogICAtIChpbnRbXVtdLCBuZXcgaW50WzFdIHszfSkKLQkgKiAgICAgIGludFszXVtdCi0JICoKLQkgKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyB0aGF0IG9ubHkgdGhlIFJFTSBGYWN0b3J5IGNhbiBjYWxsIGl0LgotCSAqLwotCVJFTUFycmF5QmVhblByb3h5ICBjcmVhdGVCZWFuUHJveHlXaXRoKGludFtdIGRpbWVuc2lvbnMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIElmIHRoZSBkaW1lbnNpb25zIGlzIG51bGwgb3IgemVybyBsZW5ndGgsIHRoZW4gY3JlYXRlIHRoZQotCQkvLyBhcnJheSBhcyBhIDAgc2l6ZWQgYXJyYXkgb25lIGRpbWVuc2lvbmFsIGFycmF5LgotCQlpZiAoZGltZW5zaW9ucyA9PSBudWxsIHx8IGRpbWVuc2lvbnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gY3JlYXRlQmVhblByb3h5V2l0aChuZXcgaW50W10gezB9KTsKLQkJCQotCQkvLyBSZW1vdmUgZnJvbSB0aGlzIHR5cGUgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHNwZWNpZmllZAotCQkvLyBjb21pbmcgaW4sIHVwIHRvIGJ1dCBubyBmdXJ0aGVyIHRoYW4gdGhlIGZpbmFsIGNvbXBvbmVudC4KLQkJLy8gRnJvbSBoZXJlIHdlIGNhbiB0aGVuIHVzZSB0aGUgYXBwcm9wcmlhdGUgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkKLQkJLy8gbWV0aG9kIHRvIGNyZWF0ZSB0aGUgYXJyYXkuCi0JCUlCZWFuVHlwZVByb3h5IGNvbXBUeXBlID0gbnVsbDsJLy8gVGhlIHR5cGUgb2YgYXJyYXkgdG8gY3JlYXRlIChpdCBtYXkgYmUgZGlmZmVyZW50IG51bWJlciBvZiBkaW1lbnNpb25zKS4KLQkJaW50IG51bURpbXMgPSBnZXREaW1lbnNpb25zKCk7Ci0JCWlmIChudW1EaW1zIDw9IGRpbWVuc2lvbnMubGVuZ3RoKQotCQkJY29tcFR5cGUgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKTsJLy8gVGhlcmUgYXJlIHRoZSBzYW1lIG9yIG1vcmUgcmVxdWVzdGVkIGRpbWVuc2lvbnMsIHNvIHVzZSBmaW5hbCBjb21wb25lbnQgdHlwZQotCQllbHNlIHsKLQkJCS8vIFRoZXJlIGFyZSBmZXdlciByZXF1ZXN0ZWQgZGltZW5zaW9ucywgc28gc3RyaXAgb2ZmIHRoYXQgbWFueQotCQkJU3RyaW5nIGNvbXBDbGFzcyA9IGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKGRpbWVuc2lvbnMubGVuZ3RoKTsKLQkJCWNvbXBUeXBlID0gZlJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShjb21wQ2xhc3MpOwotCQl9Ci0JCQotCQlpZiAoZGltZW5zaW9ucy5sZW5ndGggPT0gMSkgewotCQkJLy8gVXNlIHRoZSBvbmUgZGltZW5zaW9uIGNhbGwKLQkJCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHtjb21wVHlwZSwgbmV3IEludGVnZXIoZGltZW5zaW9uc1swXSl9OwotCQkJcmV0dXJuIChSRU1BcnJheUJlYW5Qcm94eSkgKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldEFycmF5TmV3SW5zdGFuY2VPbmVEaW1lbnNpb24oKSkuaW52b2tlV2l0aFBhcm1zKG51bGwsIHBhcm1zKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFVzZSB0aGUgbXVsdGkgZGltZW5zaW9uIGNhbGwKLQkJCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHtjb21wVHlwZSwgZGltZW5zaW9uc307Ci0JCQlyZXR1cm4gKFJFTUFycmF5QmVhblByb3h5KSAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZSZWdpc3RyeSkuZ2V0QXJyYXlOZXdJbnN0YW5jZU11bHRpRGltZW5zaW9uKCkpLmludm9rZVdpdGhQYXJtcyhudWxsLCBwYXJtcyk7Ci0JCX0KLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgSUJlYW5UeXBlUHJveHkjZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0VHlwZU5hbWUoKTsKLQkJaW50IGRpbXMgPSBuYW1lLmxhc3RJbmRleE9mKCdbJykgKyAxOwotCQlTdHJpbmcgdHlwZSA9IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpLmdldFR5cGVOYW1lKCk7Ci0JCVN0cmluZ0J1ZmZlciBmb3JtYWxUeXBlID0gbmV3IFN0cmluZ0J1ZmZlcih0eXBlLmxlbmd0aCgpKygiW10iLmxlbmd0aCgpKmRpbXMpKTsgLy8kTk9OLU5MUy0xJAotCQlmb3JtYWxUeXBlLmFwcGVuZCh0eXBlKTsKLQkJZm9yIChpbnQgaT0wOyBpPGRpbXM7IGkrKykKLQkJCWZvcm1hbFR5cGUuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmb3JtYWxUeXBlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjIzZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgSVJFTUJlYW5Qcm94eQotICovCi0KLXB1YmxpYyBjbGFzcyBSRU1CZWFuUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBJQmVhblR5cGVQcm94eSBmVHlwZTsKLQotCXByb3RlY3RlZCBSRU1CZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIElCZWFuVHlwZVByb3h5IGFUeXBlKXsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklEKTsKLQkJZlR5cGUgPSBhVHlwZTsKLQl9Ci0JCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmVHlwZSA9IG51bGw7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWFmYmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGEgQmVhblR5cGVQcm94eS4gVGhpcyBpcyB3aGF0IGlzIHVzZWQKLSAqIGZvciByZWd1bGFyIGRlZmF1bHQgYmVhbnMgYW5kIGJlYW50eXBlcyB3aGVuIG5vIHNwZWNpYWwgYmVhbnMgb3IgYmVhbiB0eXBlcyBhcmUgbmVlZGVkLgotICovCi1wdWJsaWMgY2xhc3MgUkVNQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElSRU1TcGVjaWFsQmVhblR5cGVQcm94eSB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBhIHJlZ2lzdHJ5IGFuZCBhIGNsYXNzLiBJdCBpcyBwcm90ZWN0ZWQgc28gdGhhdCBvbmx5IHN1YmNsYXNzZXMKLQkgKiBhbmQgdGhlIGZhY3Rvcnkgd2l0aCB0aGlzIFJFTSBwYWNrYWdlIGNhbiBjYWxsIGl0LgotCSAqLwotCXB1YmxpYyBSRU1CZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotCX0KLQotCS8qKgotCSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotCSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLQkgKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0JICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLQkgKiB0aGF0IGNhbiBiZSBkb25lLgotCSAqCi0JICogTk9URTogQWxsIHN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIHRvIHJldHVybiB0aGUgY29ycmVjdCB0eXBlIG9mIEJlYW5UeXBlUHJveHkuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JCXJldHVybiBuZXdCZWFuVHlwZUZvckNsYXNzKGFuSUQsIGFDbGFzc25hbWUsIGFuQWJzdHJhY3QsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWFsIG1ldGhvZCB0byBoYW5kbGUgc3ViY2xhc3NpbmcgZnJvbSBhbiBhYnN0cmFjdCkuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0LCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpIHsKLQkJaWYgKCFhbkFic3RyYWN0KSAKLQkJCXJldHVybiBuZXcgUkVNQmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCl7Ci0JCi0JCXJldHVybiBuZXcgUkVNQmVhblByb3h5KGZSZWdpc3RyeSwgYW5JRCwgdGhpcyk7Ci0JCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnRGVjaW1hbEJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdEZWNpbWFsQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNzk2YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdEZWNpbWFsQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1CaWdEZWNpbWFsQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgUHJveHkgZm9yIEJpZ0RlY2ltYWxzLgotICovCi1jbGFzcyBSRU1CaWdEZWNpbWFsQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNQmlnRGVjaW1hbEJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEJpZ0RlY2ltYWwgYUJpZ0RlY2ltYWwpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFCaWdEZWNpbWFsKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuYmlnRGVjaW1hbENsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChudW1iZXJWYWx1ZSgpLCAoKElSRU1CZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0SUQoKS5pbnRWYWx1ZSgpKTsKLX0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdEZWNpbWFsQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdEZWNpbWFsQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTYwNDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgZm9yIEJpZ0RlY2ltYWwuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1CaWdEZWNpbWFsQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgc3RhdGljIEJpZ0RlY2ltYWwgemVyb1ZhbHVlID0gbmV3IEJpZ0RlY2ltYWwoMEQpOwotCi1SRU1CaWdEZWNpbWFsQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG51bWJlclR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJJR19ERUNJTUFMX0NMQVNTKSwgQmlnRGVjaW1hbC5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1CaWdEZWNpbWFsQmVhblByb3h5KGFSZWdpc3RyeSwgemVyb1ZhbHVlKTsJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJpZ0RlY2ltYWxCZWFuUHJveHkoQmlnRGVjaW1hbCBhQmlnRGVjaW1hbCkgewotCXJldHVybiAoIXplcm9WYWx1ZS5lcXVhbHMoYUJpZ0RlY2ltYWwpKSA/Ci0JCW5ldyBSRU1CaWdEZWNpbWFsQmVhblByb3h5KGZSZWdpc3RyeSwgYUJpZ0RlY2ltYWwpIDogemVyb1Byb3h5OwotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBCaWdEZWNpbWFsIHByb3h5LCBob3dldmVyLCB0aGUgTnVtYmVyIG11c3QgYmUgYSBCaWdEZWNpbWFsLgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlQmlnRGVjaW1hbEJlYW5Qcm94eSgoQmlnRGVjaW1hbCkgYU51bWJlcik7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm8gcHJveHkgZm9yIHRoaXMgY2FzZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVCaWdEZWNpbWFsQmVhblByb3h5KChCaWdEZWNpbWFsKSB2YWx1ZS5hbk9iamVjdCk7Ci19CQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CaWdJbnRlZ2VyQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0ludGVnZXJCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxNWI0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0ludGVnZXJCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJpZ0ludGVnZXJCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0vKioKLSAqIFJlbW90ZSBQcm94eSBmb3IgQmlnSW50ZWdlcnMuCi0gKi8KLWNsYXNzIFJFTUJpZ0ludGVnZXJCZWFuUHJveHkgZXh0ZW5kcyBSRU1OdW1iZXJCZWFuUHJveHkgewotCi1SRU1CaWdJbnRlZ2VyQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQmlnSW50ZWdlciBhQmlnSW50ZWdlcikgewotCXN1cGVyKGFSZWdpc3RyeSwgYUJpZ0ludGVnZXIpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5iaWdJbnRlZ2VyQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KG51bWJlclZhbHVlKCksICgoSVJFTUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXRJRCgpLmludFZhbHVlKCkpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnSW50ZWdlckJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQmlnSW50ZWdlckJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxYmM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1CaWdJbnRlZ2VyQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBCaWdJbnRlZ2VyLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQmlnSW50ZWdlckJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBCaWdJbnRlZ2VyIHplcm9WYWx1ZSA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7IC8vJE5PTi1OTFMtMSQKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQklHX0lOVEVHRVJfQ0xBU1MpLCBCaWdJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgbnVtYmVyVHlwZSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTUJpZ0ludGVnZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCB6ZXJvVmFsdWUpOwkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmlnSW50ZWdlckJlYW5Qcm94eShCaWdJbnRlZ2VyIGFCaWdJbnRlZ2VyKSB7Ci0JcmV0dXJuICghemVyb1ZhbHVlLmVxdWFscyhhQmlnSW50ZWdlcikpID8KLQkJbmV3IFJFTUJpZ0ludGVnZXJCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhQmlnSW50ZWdlcikgOiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogR2VuZXJpYyB3YXkgdG8gY3JlYXRlIGFuIEJpZ0ludGVnZXIgcHJveHksIGhvd2V2ZXIsIHRoZSBOdW1iZXIgbXVzdCBiZSBhIEJpZ0ludGVnZXIuCi0gKi8KLXByb3RlY3RlZCBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZU51bWJlckJlYW5Qcm94eShOdW1iZXIgYU51bWJlcikgewotCXJldHVybiBjcmVhdGVCaWdJbnRlZ2VyQmVhblByb3h5KChCaWdJbnRlZ2VyKSBhTnVtYmVyKTsKLX0JCi0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm8gcHJveHkgZm9yIHRoaXMgY2FzZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVCaWdJbnRlZ2VyQmVhblByb3h5KChCaWdJbnRlZ2VyKSB2YWx1ZS5hbk9iamVjdCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MjY5ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCb29sZWFuQmVhblByb3h5IGZvciBCb29sZWFuLmNsYXNzLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJQm9vbGVhbkJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBCb29sZWFuIGZCb29sZWFuVmFsdWU7Ci0KLS8qKgotICogU3RvcmUgdGhlIGJvb2xlYW4gdmFsdWUgc28gdGhhdCB3ZSBjYW4gcmV0dXJuIHRoZSBib29sZWFuVmFsdWUgZmFzdGVyCi0gKiB3aXRob3V0IHRoZSBuZWVkIGZvciBnb2luZyBhY3Jvc3MgdGhlIGxpbmUuIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgaXMgY3JlYXRlZCBpbgotICogc3BlY2lhbCB3YXksIHNvIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlc2UuCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1SRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBCb29sZWFuIHZhbHVlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmQm9vbGVhblZhbHVlID0gdmFsdWU7Ci19Ci0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1Cb29sZWFuQ2xhc3NCZWFuUHJveHkpCi0JCXJldHVybiBmQm9vbGVhblZhbHVlLmJvb2xlYW5WYWx1ZSgpID09ICgoUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5KSBhbk9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgQm9vbGVhbikKLQkJcmV0dXJuIGZCb29sZWFuVmFsdWUuYm9vbGVhblZhbHVlKCkgPT0gKChCb29sZWFuKSBhbk9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZQotICovCi1wdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JcmV0dXJuIGZCb29sZWFuVmFsdWUuYm9vbGVhblZhbHVlKCk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgamF2YS5sYW5nLkJvb2xlYW4gdmFsdWUKLSAqLwotcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKCkgewotCXJldHVybiBmQm9vbGVhblZhbHVlOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgdG9TdHJpbmcgb2YgdGhlIGJlYW4gaXRzZWxmLgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQlyZXR1cm4gZkJvb2xlYW5WYWx1ZS50b1N0cmluZygpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5ib29sZWFuQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZCb29sZWFuVmFsdWUpOwotfQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyZmEyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEJvb2xlYW4gQmVhblR5cGUgUHJveHkgZm9yIEJvb2xlYW4uY2xhc3MuIAotICogQ3JlYXRpb24gZGF0ZTogKDIvMjMvMDAgMTo1OTowMiBQTSkKLSAqIEBhdXRob3I6IFJpY2hhcmQgTGVlIEt1bHAKLSAqLwotZmluYWwgY2xhc3MgUkVNQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkgewotCi0JLy8gQ2FjaGUgdGhlc2UgaW5zdGFuY2VzLiBTaW5jZSB0aGUgQmVhblR5cGUgcHJveGllcyBhcmUgY2FjaGVkIGFsc28sIG9ubHkgb25lIGluc3RhbmNlCi0JLy8gb2YgdHJ1ZS9mYWxzZSB3aWxsIGJlIGluIHN5c3RlbS4KLQlwcm90ZWN0ZWQgZmluYWwgSUJvb2xlYW5CZWFuUHJveHkgdHJ1ZVByb3h5OwotCXByb3RlY3RlZCBmaW5hbCBJQm9vbGVhbkJlYW5Qcm94eSBmYWxzZVByb3h5OwotLyoqCi0gKiBSRU1Cb29sZWFuQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wcm90ZWN0ZWQgUkVNQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG9iamVjdFR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fQ0xBU1MpLCBCb29sZWFuLmNsYXNzLmdldE5hbWUoKSwgb2JqZWN0VHlwZSk7Ci0JCi0JdHJ1ZVByb3h5ID0gbmV3IFJFTUJvb2xlYW5DbGFzc0JlYW5Qcm94eSggZlJlZ2lzdHJ5LCBCb29sZWFuLlRSVUUpOwotCWZhbHNlUHJveHkgPSBuZXcgUkVNQm9vbGVhbkNsYXNzQmVhblByb3h5KCBmUmVnaXN0cnksIEJvb2xlYW4uRkFMU0UpOwkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKiBVc2UgdGhlIGNhY2hlLgotICovCi1JQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCb29sZWFuQmVhblByb3h5KEJvb2xlYW4gYUJvb2xlYW4pIHsKLQlyZXR1cm4gYUJvb2xlYW4uYm9vbGVhblZhbHVlKCkgPyB0cnVlUHJveHkgOiBmYWxzZVByb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gVGhleSBhcmUgY3JlYXRlZAotICogZXhwbGljaXRseSB0aHJvdWdoIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciB0eXBlcywgdGhleSBhcmUgZmluYWwgY2xhc3Nlcywgc28geW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIAotICogZm9yIHN1YmNsYXNzZXMuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gQm9vbGVhbiBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgZmFsc2VQcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIGZhbHNlUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQm9vbGVhbkJlYW5Qcm94eSh2YWx1ZS5hQm9vbCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuVHlwZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuVHlwZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmEzNzQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCb29sZWFuQmVhblByb3h5IGZvciBCb29sZWFuLlRZUEUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSUJvb2xlYW5CZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmQm9vbGVhbjsKLQotLyoqCi0gKiBTdG9yZSB0aGUgYm9vbGVhbiB2YWx1ZSBzbyB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIGJvb2xlYW5WYWx1ZSBmYXN0ZXIKLSAqIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGdvaW5nIGFjcm9zcyB0aGUgbGluZS4gSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBpdCBpcyBjcmVhdGVkIGluCi0gKiBzcGVjaWFsIHdheSwgc28gbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVzZS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTUJvb2xlYW5UeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgYm9vbGVhbiB2YWx1ZSkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkJvb2xlYW4gPSB2YWx1ZTsKLX0KLQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTUJvb2xlYW5UeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkJvb2xlYW4gPT0gKChSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCXJldHVybiBmQm9vbGVhbiA9PSAoKEJvb2xlYW4pIGFuT2JqZWN0KS5ib29sZWFuVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLSAqLwotcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhQmVhblByb3h5IGluc3RhbmNlb2YgUkVNQm9vbGVhblR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmQm9vbGVhbiA9PSAoKFJFTUJvb2xlYW5UeXBlQmVhblByb3h5KSBhQmVhblByb3h5KS5ib29sZWFuVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBib29sZWFuIHZhbHVlCi0gKi8KLXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW47Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgamF2YS5sYW5nLkJvb2xlYW4gdmFsdWUKLSAqLwotcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKCkgewotCXJldHVybiBmQm9vbGVhbiA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSB0b1N0cmluZyBvZiB0aGUgYmVhbiBpdHNlbGYuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBmQm9vbGVhbiA/IEJvb2xlYW4uVFJVRS50b1N0cmluZygpIDogQm9vbGVhbi5GQUxTRS50b1N0cmluZygpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5ib29sZWFuVHlwZTsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoZkJvb2xlYW4pOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDVjNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogQm9vbGVhbiBCZWFuVHlwZSBQcm94eSBmb3IgQm9vbGVhbi5UWVBFCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi8yMy8wMCAxOjU5OjAyIFBNKQotICogQGF1dGhvcjogUmljaGFyZCBMZWUgS3VscAotICovCi1maW5hbCBjbGFzcyBSRU1Cb29sZWFuVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLQotCS8vIENhY2hlIHRoZXNlIGluc3RhbmNlcy4gU2luY2UgdGhlIEJlYW5UeXBlIHByb3hpZXMgYXJlIGNhY2hlZCBhbHNvLCBvbmx5IG9uZSBpbnN0YW5jZQotCS8vIG9mIHRydWUvZmFsc2Ugd2lsbCBiZSBpbiBzeXN0ZW0uCi0JcHJvdGVjdGVkIGZpbmFsIElCb29sZWFuQmVhblByb3h5IHRydWVQcm94eTsKLQlwcm90ZWN0ZWQgZmluYWwgSUJvb2xlYW5CZWFuUHJveHkgZmFsc2VQcm94eTsKLS8qKgotICogUkVNQm9vbGVhbkJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHJvdGVjdGVkIFJFTUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fVFlQRSksIEJvb2xlYW4uVFlQRS5nZXROYW1lKCkpOwotCQotCXRydWVQcm94eSA9IG5ldyBSRU1Cb29sZWFuVHlwZUJlYW5Qcm94eSggZlJlZ2lzdHJ5LCB0cnVlKTsKLQlmYWxzZVByb3h5ID0gbmV3IFJFTUJvb2xlYW5UeXBlQmVhblByb3h5KCBmUmVnaXN0cnksIGZhbHNlKTsJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICogVXNlIHRoZSBjYWNoZS4KLSAqLwotSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShib29sZWFuIGFCb29sZWFuKSB7Ci0JcmV0dXJuIGFCb29sZWFuID8gdHJ1ZVByb3h5IDogZmFsc2VQcm94eTsKLX0KLQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gYm9vbGVhbiBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSBmYWxzZVByb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gZmFsc2VQcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVCb29sZWFuQmVhblByb3h5KHZhbHVlLmFCb29sKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVDbGFzc0JlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlQ2xhc3NCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4OGZmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQnl0ZUNsYXNzQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi0vKioKLSAqIFJlbW90ZSBQcm94eSBmb3IgQnl0ZS5jbGFzcy4KLSAqLwotY2xhc3MgUkVNQnl0ZUNsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNQnl0ZUNsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQnl0ZSBhQnl0ZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYUJ5dGUpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5ieXRlQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KChCeXRlKSBudW1iZXJWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWJjYTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQnl0ZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogQmVhblR5cGUgUHJveHkgZm9yIEJ5dGUuY2xhc3MuIAotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQnl0ZUNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSBvbmVQcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1CeXRlQ2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9DTEFTUyksIEJ5dGUuY2xhc3MuZ2V0TmFtZSgpLCBudW1iZXJUeXBlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNQnl0ZUNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEJ5dGUoKGJ5dGUpMCkpOwkKLQlvbmVQcm94eSA9IG5ldyBSRU1CeXRlQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgQnl0ZSgoYnl0ZSkxKSk7Ci0JdHdvUHJveHkgPSBuZXcgUkVNQnl0ZUNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEJ5dGUoKGJ5dGUpMikpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNQnl0ZUNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEJ5dGUoKGJ5dGUpMykpOwkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJ5dGVCZWFuUHJveHkoQnl0ZSBhQnl0ZSkgewotCXN3aXRjaChhQnl0ZS5ieXRlVmFsdWUoKSkgewotCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHk7Ci0JCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJY2FzZSAyOiByZXR1cm4gdHdvUHJveHkgOwotCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJZGVmYXVsdDogcmV0dXJuIG5ldyBSRU1CeXRlQ2xhc3NCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhQnl0ZSk7Ci0JfQotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBJbnRlZ2VyIHByb3h5LCBob3dldmVyLCB0aGUgTnVtYmVyIG11c3QgYmUgYW4gSW50ZWdlci4KLSAqLwotcHJvdGVjdGVkIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlTnVtYmVyQmVhblByb3h5KE51bWJlciBhTnVtYmVyKSB7Ci0JcmV0dXJuIGNyZWF0ZUJ5dGVCZWFuUHJveHkoKEJ5dGUpIGFOdW1iZXIpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQnl0ZUJlYW5Qcm94eShuZXcgQnl0ZSh2YWx1ZS5hQnl0ZSkpOwotfQkKLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZVR5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQnl0ZVR5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyYmEyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVUeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQnl0ZVR5cGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciBCeXRlLlRZUEUuCi0gKiBJdCBjYW4gYW5zd2VyIGFsbCBvZiB0aGUgcHJpbWl0aXZlIG51bWJlciB0eXBlcyAoaW50LCBsb25nLCBzaG9ydCwgYnl0ZSwgZG91YmxlLCBmbG9hdCkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1jbGFzcyBSRU1CeXRlVHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBieXRlIGZCeXRlOwotCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNQnl0ZVR5cGVCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBieXRlIGFCeXRlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmQnl0ZSA9IGFCeXRlOwotfQotCi0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNQnl0ZVR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmQnl0ZSA9PSAoKFJFTUJ5dGVUeXBlQmVhblByb3h5KSBhbk9iamVjdCkuYnl0ZVZhbHVlKCk7Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgQnl0ZSkKLQkJcmV0dXJuIGZCeXRlID09ICgoQnl0ZSkgYW5PYmplY3QpLmJ5dGVWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBSRU1CeXRlVHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZCeXRlID09ICgoUkVNQnl0ZVR5cGVCZWFuUHJveHkpIGFCZWFuUHJveHkpLmJ5dGVWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gZkJ5dGU7Ci19Ci0vKioKLSAqIGRvdWJsZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCXJldHVybiBmQnl0ZTsKLX0KLS8qKgotICogZmxvYXRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JcmV0dXJuIGZCeXRlOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGludCB2YWx1ZQotICovCi1wdWJsaWMgaW50IGludFZhbHVlKCkgewotCXJldHVybiBmQnl0ZTsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIGZCeXRlOwotfQotLyoqCi0gKiBudW1iZXJWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE51bWJlciBudW1iZXJWYWx1ZSgpIHsKLQlyZXR1cm4gbmV3IEJ5dGUoZkJ5dGUpOwotfQotLyoqCi0gKiBzaG9ydFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQlyZXR1cm4gZkJ5dGU7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZCeXRlKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGJlYW50eXBlCi0gKi8KLXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuYnl0ZVR5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZCeXRlKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1ZGI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUJ5dGVUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUJ5dGVUeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBCeXRlLlRZUEUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1CeXRlVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUJ5dGVUeXBlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJZVEVfVFlQRSksIEJ5dGUuVFlQRS5nZXROYW1lKCkpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1CeXRlVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIChieXRlKTApOwkKLQlvbmVQcm94eSA9IG5ldyBSRU1CeXRlVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIChieXRlKTEpOwotCXR3b1Byb3h5ID0gbmV3IFJFTUJ5dGVUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgKGJ5dGUpMik7Ci0JdGhyZWVQcm94eSA9IG5ldyBSRU1CeXRlVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIChieXRlKTMpOwkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJ5dGVCZWFuUHJveHkoYnl0ZSBhQnl0ZSkgewotCXN3aXRjaChhQnl0ZSkgewotCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHk7Ci0JCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJY2FzZSAyOiByZXR1cm4gdHdvUHJveHkgOwotCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJZGVmYXVsdDogcmV0dXJuIG5ldyBSRU1CeXRlVHlwZUJlYW5Qcm94eShmUmVnaXN0cnksIGFCeXRlKTsKLQl9Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBieXRlIGlzIGEgcHJpbWl0aXZlLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm9Qcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0JCi0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlQnl0ZUJlYW5Qcm94eSh2YWx1ZS5hQnl0ZSk7Ci19Ci0KLS8qKgotICogU2hvcnQgY3V0IGZvciBuZXdJbnN0YW5jZSB3aGVyZSB0aGUgc3RyaW5nIGZvbGxvd3MgdGhlCi0gKiBzcGVjaWZpYyBwYXR0ZXJuIHdlIGV4cGVjdC4gVGhhdCB3YXkgaXQgd29uJ3QgYmUgbmVjZXNzYXJ5IHRvIHNoaXAgb3ZlciB0byB0aGUgdm0gCi0gKiB0byBwcm9jZXNzIGl0LgotICoKLSAqIFRoZSBwYXR0ZXJuIGl0IGNhbiBhY2NlcHQgaXM6Ci0gKiAJMSkgKGJ5dGUpIHZhbGlkTnVtYmVyIC0gbnVtYmVyIGNhbiBiZSBhbnkgbnVtYmVyIGJlY2F1c2UgKGJ5dGUpIGV4cGxpY2l0bHkgY2FzdHMgaXQgZG93bi4KLSAqCTIpIHZhbGlkTnVtYmVyCi0gKiBJdCB3aWxsIHVzZSB0aGUgZGVjb2RlIGZ1bmN0aW9uIG9mIGJ5dGUgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCBudW1iZXIuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCVN0cmluZyB0cmltID0gaW5pdGlhbGl6YXRpb25TdHJpbmcudHJpbSgpOwotCWlmICh0cmltLmxlbmd0aCgpID09IDApCi0JCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CQotCWJ5dGUgYUJ5dGU7Ci0JaWYgKHRyaW0uc3RhcnRzV2l0aCgiKGJ5dGUpIikpIHsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXIgdiA9IHBhcnNlU3RyaW5nKHRyaW0uc3Vic3RyaW5nKCIoYnl0ZSkiLmxlbmd0aCgpKS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ICE9IG51bGwpCi0JCQlhQnl0ZSA9IHYuYnl0ZVZhbHVlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQl9IGVsc2UgewotCQl0cnkgewotCQkJYUJ5dGUgPSBCeXRlLmRlY29kZSh0cmltKS5ieXRlVmFsdWUoKTsJLy8gU2VlIGlmIHZhbGlkIGJ5dGUgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYUJ5dGUpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DYWxsYmFja0lucHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5YjA1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1DYWxsYmFja0lucHV0U3RyZWFtLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuSU9Db21tYW5kRXhjZXB0aW9uOwotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnB1dHN0cmVhbSB1c2VkIHRvIHJldHVybiBhIGxvdCBvZiBkYXRhIGZyb20KLSAqIHRoZSBzZXJ2ZXIuCi0gKi8KLQotcHVibGljIGNsYXNzIFJFTUNhbGxiYWNrSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JCi0JcHJvdGVjdGVkIERhdGFJbnB1dFN0cmVhbSBmSW47Ci0JcHJvdGVjdGVkIERhdGFPdXRwdXRTdHJlYW0gZk91dDsKLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0JcHJvdGVjdGVkIGludCBmTmV4dEJ5dGUgPSAwOwotCXByb3RlY3RlZCBpbnQgZkxhc3RCeXRlID0gMDsKLQkKLQlwdWJsaWMgUkVNQ2FsbGJhY2tJbnB1dFN0cmVhbShEYXRhSW5wdXRTdHJlYW0gaW4sIERhdGFPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCWZJbiA9IGluOwotCQlmT3V0ID0gb3V0OwotCQkKLQkJSW50ZWdlciBidWZTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJwcm94eXZtLmJ1ZnNpemUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYnVmU2l6ZSA9PSBudWxsKQotCQkJYnVmU2l6ZSA9IG5ldyBJbnRlZ2VyKDE2MDAwKTsJCQotCQlmQnVmZmVyID0gbmV3IGJ5dGVbYnVmU2l6ZS5pbnRWYWx1ZSgpXTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTdHJlYW0oKSB7Ci0JCWZJbiA9IG51bGw7Ci0JCWZPdXQgPSBudWxsOwotCQlmQnVmZmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmSW4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZkxhc3RCeXRlICE9IC0xKSB7Ci0JCQkJZkxhc3RCeXRlID0gQ29tbWFuZHMucmVhZEJ5dGVzKGZJbiwgZkJ1ZmZlcik7Ci0JCQkJaWYgKGZMYXN0Qnl0ZSAhPSAtMSkKLQkJCQkJZk5leHRCeXRlID0gMDsKLQkJCQllbHNlIHsKLQkJCQkJZk5leHRCeXRlID0gLTE7Ci0JCQkJfQotCQkJfQkKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0cnkgewotCQkJCWNsb3NlKGZhbHNlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUxKSk7CS8vIEVycm9yIGR1cmluZyBjbG9zZSwganVzdCBsb2cgaXQuIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRocm93IG5ldyBJT0NvbW1hbmRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCQkKLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZk5leHRCeXRlID49IGZMYXN0Qnl0ZSkgewotCQkJZmlsbEJ1ZmZlcigpOwotCQl9Ci0JCWlmIChmTGFzdEJ5dGUgPT0gLTEpCi0JCQlyZXR1cm4gLTE7CS8vIFdlJ3ZlIHByZXZpb3VzbHkgcmVhY2hlZCB0aGUgZW5kLgkJCi0JCQotCQlyZXR1cm4gZkJ1ZmZlcltmTmV4dEJ5dGUrK10gJiAweEZGOwkvLyBTbyB0aGF0IGl0IGlzIGluIHJhbmdlIDAgdG8gMjU1LgotCX0KLQkKLQlwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChiID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gYi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fAotCQkJKChvZmYgKyBsZW4pID4gYi5sZW5ndGgpIHx8ICgob2ZmICsgbGVuKSA8IDApKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkKLQkJaW50IHJlYWQgPSAwOwotCQl3aGlsZSAobGVuID4gMCkgewotCQkJaWYgKGZOZXh0Qnl0ZSA+PSBmTGFzdEJ5dGUpCi0JCQkJZmlsbEJ1ZmZlcigpOwotCQkJaWYgKGZMYXN0Qnl0ZSA9PSAtMSkKLQkJCQlyZXR1cm4gcmVhZCAhPSAwID8gcmVhZCA6IC0xOwkvLyBObyBtb3JlLCByZXR1cm4gYW1vdW50IHJlYWQsIG9yIGlmIG5vbmUgcmVhZCwgdGhlbiAtMQotCQkJaW50IG1vdmUgPSBmTGFzdEJ5dGUgLSBmTmV4dEJ5dGU7Ci0JCQlpZiAobW92ZSA+IGxlbikKLQkJCQltb3ZlID0gbGVuOwotCQkJU3lzdGVtLmFycmF5Y29weShmQnVmZmVyLCBmTmV4dEJ5dGUsIGIsIG9mZiwgbW92ZSk7Ci0JCQlyZWFkICs9IG1vdmU7Ci0JCQlmTmV4dEJ5dGUgKz0gbW92ZTsKLQkJCW9mZiArPSBtb3ZlOwotCQkJbGVuIC09IG1vdmU7Ci0JCX0KLQkJCi0JCXJldHVybiByZWFkOwotCX0KLQkJCQotCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZMYXN0Qnl0ZSAhPSAtMSA/IGZMYXN0Qnl0ZSAtIGZOZXh0Qnl0ZSA6IDA7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2xvc2UodHJ1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsb3NlKGJvb2xlYW4gd2FpdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZPdXQgPT0gbnVsbCkKLQkJCXJldHVybjsJLy8gQWxyZWFkeSBjbG9zZWQuCi0JCXRyeSB7Ci0JCQlmT3V0LndyaXRlQnl0ZShDb21tYW5kcy5DQUxMQkFDS19TVFJFQU1fVEVSTUlOQVRFKTsKLQkJCWZPdXQuZmx1c2goKTsKLQkJCWZPdXQgPSBudWxsOwkvLyBTbyB0aGF0IHdlIGtub3cgd2UgY2xvc2VkIGFscmVhZHkgaWYgZXJyb3Igb2NjdXJzIGR1cmluZyBpbiByZWFkKCkgYmVsb3cuCi0JCQlpZiAod2FpdCkgewotCQkJCS8vIE5lZWQgdG8gcmVhZCB1bnRpbCBFbmQgb2Ygc3RyZWFtIGJlY2F1c2Ugd2UgbmVlZCB0byBmbHVzaCBvdXQgdGhlCi0JCQkJLy8gc3RyZWFtIHNvIHRoYXQgbmV4dCB0aW1lIHdlIHVzZSB0aGlzIGNvbm5lY3Rpb24gd2Ugc3RhcnQgZnJlc2guCi0JCQkJLy8gSWYgdGhlIHNlcnZlciBoYXMgYWxyZWFkeSBmaW5pc2hlZCB3cml0aW5nLCB3ZSB3aWxsIHJlYWQgdW50aWwgdGhlbi4KLQkJCQkvLyBJZiB0aGUgc2VydmVyIGhhcyBub3QgeWV0IGZpbmlzaGVkIHdyaXRpbmcsIHdoZW4gaXQgcmVhZHMgdGhlIHRlcm1pbmF0ZQotCQkJCS8vIHJlcXVlc3QgaXQgd2lsbCBzZW5kIGFuIGVuZCBvZiBzdHJlYW0gbWFya2VyIGZvciB1cyB0byByZWFkLiBCdXQgZWl0aGVyCi0JCQkJLy8gd2F5IHdlIGNhbid0IGxlYXZlIHVudGlsIHdlJ3ZlIHJlYWQgZXZlcnl0aGluZyBmcm9tIHRoZSBzdHJlYW0uCi0JCQkJCi0JCQkJLy8gSWYgY2FsbGVkIHdpdGggbm8gd2FpdCwgdGhlbiB3ZSBhcmUgY2xvc2luZyBoYXJkIGFuZCB3aWxsIGJlIGNsb3NpbmcgdGhlIHNvY2tldCB0b28uCi0JCQkJd2hpbGUgKHJlYWQoKSAhPSAtMSkgewotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWNsZWFyU3RyZWFtKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjUyNjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUNhbGxiYWNrUmVnaXN0cnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotCi0vKioKLSAqIFRoaXMgcmVnaXN0cnkgd2lsbCBoYW5kbGUgY2FsbGJhY2tzLgotICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBubyBvbmUKLSAqIHNob3VsZCBhY2Nlc3MgaXQgb3V0c2lkZS4KLSAqLwotY2xhc3MgUkVNQ2FsbGJhY2tSZWdpc3RyeSBpbXBsZW1lbnRzIElDYWxsYmFja1JlZ2lzdHJ5IHsKLQlmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeTsKLQlmaW5hbCBTdHJpbmcgZk5hbWVQb3N0Zml4OwotCUxpc3QgZlRocmVhZHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBMaW5rZWRMaXN0KCkpOwkvLyBMaXN0IG9mIGFjdGl2ZSBjYWxsYmFjayB0aHJlYWRzLgkKLQkKLQlNYXAgZklkVG9DYWxsYmFjayA9IG5ldyBIYXNoTWFwKDUpOwkvLyBJRCB0byBDYWxsYmFjayBtYXAuCi0JTWFwIGZDYWxsYmFja1Byb3h5VG9JZCA9IG5ldyBIYXNoTWFwKDUpOwkvLyBDYWxsYmFjayB0byBJRCBtYXAuIFRoaXMgd2lsbCBhbHNvIGhvbGQgb250byB0aGUgY2FsbGJhY2sgcHJveGllcyBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IEdDJ2Qgd2hpbGUgdGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCi0JCQotCUlSRU1NZXRob2RQcm94eSBmSW5pdGlhbGl6ZUNhbGxiYWNrOwotCUlCZWFuUHJveHkgZlJlbW90ZVNlcnZlcjsKLQkKLQlib29sZWFuIHJlZ2lzdHJ5T3BlbiA9IHRydWU7Ci0JCi0JcHVibGljIFJFTUNhbGxiYWNrUmVnaXN0cnkoU3RyaW5nIG5hbWUsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFGYWN0b3J5KSB7Ci0JCi0JCWZGYWN0b3J5ID0gYUZhY3Rvcnk7Ci0JCWZOYW1lUG9zdGZpeCA9IG5hbWU7Ci0JCQotCQkvLyBOb3cgcmVnaXN0ZXIgY29tbW9uIHByb3hpZXMuCi0JCUlSRU1CZWFuVHlwZVByb3h5IGNhbGxiYWNrVHlwZSA9IG5ldyBSRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5KGZGYWN0b3J5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5JQ0FMTEJBQ0tfQ0xBU1MpLCAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5JQ2FsbGJhY2siKTsgLy8kTk9OLU5MUy0xJAotCQotCQlmSW5pdGlhbGl6ZUNhbGxiYWNrID0gKElSRU1NZXRob2RQcm94eSkgKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5tZXRob2RUeXBlLm5ld0JlYW5Qcm94eShuZXcgSW50ZWdlcihDb21tYW5kcy5JTklUSUFMSVpFQ0FMTEJBQ0tfTUVUSE9EX0lEKSk7Ci0JCQotCQlmUmVtb3RlU2VydmVyID0gYUZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmdldElWTVNlcnZlclByb3h5KCk7CS8vIEZvciB1cywgdGhlIElWTVNlcnZlciBvbiB0aGUgcmVtb3RlIHZtIEFMU08gaW1wbGVtZW50cyBJVk1DYWxsYmFja1NlcnZlci4KLQotCQkoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShjYWxsYmFja1R5cGUsIHRydWUpOwotCQkoKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpKS5yZWdpc3RlclByb3h5KGZJbml0aWFsaXplQ2FsbGJhY2spOwotCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlQ2FsbGJhY2soU29ja2V0IGluY29taW5nKSB7Ci0JCWlmIChyZWdpc3RyeU9wZW4pIHsKLQkJCVRocmVhZCBzdCA9IG5ldyBSRU1DYWxsYmFja1RocmVhZChpbmNvbWluZywgdGhpcywgIkNhbGxiYWNrIFRocmVhZC0iK2ZOYW1lUG9zdGZpeCwgZkZhY3RvcnksIGZGYWN0b3J5LmZOb1RpbWVvdXRzKTsgLy8kTk9OLU5MUy0xJAotCQkJZlRocmVhZHMuYWRkKHN0KTsKLQkJCXN0LnN0YXJ0KCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIHJlcXVlc3QgYSBzaHV0ZG93bi4gSWYgdGhlIHNlcnZlciBpcyBhbHJlYWR5IHNodXRkb3duLCB0aGlzIHdpbGwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlcXVlc3RTaHV0ZG93bigpIHsJCQotCQlpZiAocmVnaXN0cnlPcGVuKQotCQkJc2h1dGRvd24oKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgdGhyZWFkIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2FsbGJhY2tUaHJlYWQoUkVNQ2FsbGJhY2tUaHJlYWQgdGhyZWFkKSB7Ci0JCWZUaHJlYWRzLnJlbW92ZSh0aHJlYWQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2h1dGRvd24oKSB7Ci0JCQotCQkvLyBHbyB0aHJvdWdoIGVhY2ggdGhyZWFkIGFuZCBhc2sgaXQgdG8gY2xvc2UuIE1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0IHNvIHRoYXQgd2UKLQkJLy8gd29uJ3QgZ2V0IGludG8gZGVhZGxvY2tzLgotCQlSRU1DYWxsYmFja1RocmVhZFtdIHRocmVhZHNBcnJheSA9IChSRU1DYWxsYmFja1RocmVhZFtdKSBmVGhyZWFkcy50b0FycmF5KG5ldyBSRU1DYWxsYmFja1RocmVhZFtmVGhyZWFkcy5zaXplKCldKTsKLQkJZm9yIChpbnQgaT0wOyBpPHRocmVhZHNBcnJheS5sZW5ndGg7IGkrKykgewotCQkJLy8gVGhpcyBpcyBhIGhhcnNoIHdheSB0byBzaHV0IGEgY29ubmVjdGlvbiBkb3duLCBidXQgdGhlcmUncyBubwotCQkJLy8gb3RoZXIgd2F5IEkga25vdyBvZiB0byBpbnRlcnJ1cHQgdGhlIHJlYWQgb24gYSBzb2NrZXQuCi0JCQl0aHJlYWRzQXJyYXlbaV0uY2xvc2UoKTsKLQkJfQotCQkJCi0JCS8vIE5vdyB0aGF0IHRoZXkndmUgYmVlbiB0b2xkIHRvIGNsb3NlLCB3YWl0IG9uIGVhY2ggb25lIHRvIGZpbmlzaC4KLQkJZm9yIChpbnQgaT0wOyBpPHRocmVhZHNBcnJheS5sZW5ndGg7IGkrKykKLQkJCXRyeSB7Ci0JCQkJdGhyZWFkc0FycmF5W2ldLmpvaW4oMTAwMDApOwkvLyBXYWl0IHRlbiBzZWNvbmRzLCBpZiBsb25nZXIsIGp1c3QgZ28gb24gdG8gbmV4dCBvbmUuCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQkKLQkJZlRocmVhZHMuY2xlYXIoKTsKLQkJZklkVG9DYWxsYmFjay5jbGVhcigpOwotCQlmQ2FsbGJhY2tQcm94eVRvSWQuY2xlYXIoKTsKLQkJZkluaXRpYWxpemVDYWxsYmFjayA9IG51bGw7Ci0JCWZSZW1vdGVTZXJ2ZXIgPSBudWxsOwotCQkJCi0JfQkJCi0JCi0JcHVibGljIElDYWxsYmFjayBnZXRSZWdpc3RlcmVkQ2FsbGJhY2soaW50IGlkKSB7Ci0JCXN5bmNocm9uaXplZChmSWRUb0NhbGxiYWNrKQl7CQotCQkJcmV0dXJuIChJQ2FsbGJhY2spIGZJZFRvQ2FsbGJhY2suZ2V0KG5ldyBJbnRlZ2VyKGlkKSk7Ci0JCX0KLQl9Ci0JCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFja1JlZ2lzdHJ5I3JlZ2lzdGVyQ2FsbGJhY2sob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soSUJlYW5Qcm94eSBjYWxsYmFja1Byb3h5LCBJQ2FsbGJhY2sgY2IpIHsKLQkJc3luY2hyb25pemVkKGZJZFRvQ2FsbGJhY2spIHsKLQkJCWZJZFRvQ2FsbGJhY2sucHV0KCgoSVJFTUJlYW5Qcm94eSkgY2FsbGJhY2tQcm94eSkuZ2V0SUQoKSwgY2IpOwotCQkJZkNhbGxiYWNrUHJveHlUb0lkLnB1dChjYWxsYmFja1Byb3h5LCAoKElSRU1CZWFuUHJveHkpIGNhbGxiYWNrUHJveHkpLmdldElEKCkpOwotCQkJZkluaXRpYWxpemVDYWxsYmFjay5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoY2FsbGJhY2tQcm94eSwgbmV3IElCZWFuUHJveHlbXSB7ZlJlbW90ZVNlcnZlciwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJUkVNQmVhblByb3h5KSBjYWxsYmFja1Byb3h5KS5nZXRJRCgpLmludFZhbHVlKCkpfSk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrUmVnaXN0cnkjcmVnaXN0ZXJDYWxsYmFjayhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDYWxsYmFjaywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhJUHJveHkgY2FsbGJhY2tQcm94eSwgZmluYWwgSUNhbGxiYWNrIGNiLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWZpbmFsIEludGVnZXIgaWQ7Ci0JCWlmIChjYWxsYmFja1Byb3h5LmlzQmVhblByb3h5KCkpIHsKLQkJCWlkID0gKChJUkVNQmVhblByb3h5KSBjYWxsYmFja1Byb3h5KS5nZXRJRCgpOwotCQkJc3luY2hyb25pemVkKGZJZFRvQ2FsbGJhY2spIHsKLQkJCQlmSWRUb0NhbGxiYWNrLnB1dChpZCwgY2IpOwotCQkJCWZDYWxsYmFja1Byb3h5VG9JZC5wdXQoY2FsbGJhY2tQcm94eSwgaWQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWQgPSBuZXcgSW50ZWdlcihjYWxsYmFja1Byb3h5Lmhhc2hDb2RlKCkpOwotCQkJc3luY2hyb25pemVkIChmSWRUb0NhbGxiYWNrKSB7Ci0JCQkJZklkVG9DYWxsYmFjay5wdXQoaWQsIGNiKTsJLy8gVGhpcyBpcyBzbyB0aGF0IGl0IGlzIHJlZ2lzdGVyZWQgaW4gY2FzZSBjYWxsYmFjayBpcyBpbnZva2VkIGZyb20gcmVtb3RlIHZtIGR1cmluZyBleHByZXNzaW9uIHByb2Nlc3NpbmcuCi0JCQl9Ci0JCQkoKEV4cHJlc3Npb25Qcm94eSkgY2FsbGJhY2tQcm94eSkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCXN5bmNocm9uaXplZChmSWRUb0NhbGxiYWNrKSB7Ci0JCQkJCQlmQ2FsbGJhY2tQcm94eVRvSWQucHV0KGV2ZW50LmdldFByb3h5KCksIGlkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gRmFpbGVkLCBzbyByZW1vdmUgcmVnaXN0cmF0aW9uIGNvbXBsZXRlbHkuCi0JCQkJCXN5bmNocm9uaXplZCAoZklkVG9DYWxsYmFjaykgewotCQkJCQkJZklkVG9DYWxsYmFjay5yZW1vdmUoaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIEZhaWxlZCwgc28gcmVtb3ZlIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZWx5LgotCQkJCQlzeW5jaHJvbml6ZWQgKGZJZFRvQ2FsbGJhY2spIHsKLQkJCQkJCWZJZFRvQ2FsbGJhY2sucmVtb3ZlKGlkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9Ci0JCWV4cHJlc3Npb24uY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKGZJbml0aWFsaXplQ2FsbGJhY2ssIGNhbGxiYWNrUHJveHksIG5ldyBJUHJveHlbXSB7ZlJlbW90ZVNlcnZlciwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaWQuaW50VmFsdWUoKSl9LCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBwdWJsaWMgaW50ZXJmYWNlIGZvciBkZXJlZ2lzdGVyaW5nIGNhbGxiYWNrcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyQ2FsbGJhY2soSUJlYW5Qcm94eSBjYWxsYmFja1Byb3h5KSB7Ci0JCXN5bmNocm9uaXplZChmSWRUb0NhbGxiYWNrKQl7Ci0JCQlJbnRlZ2VyIGlkID0gKEludGVnZXIpIGZDYWxsYmFja1Byb3h5VG9JZC5yZW1vdmUoY2FsbGJhY2tQcm94eSk7Ci0JCQlmSWRUb0NhbGxiYWNrLnJlbW92ZShpZCk7Ci0JCX0KLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2FsbGJhY2tUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0MTY5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNhbGxiYWNrVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQ2FsbGJhY2tUaHJlYWQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5UcmFuc21pdGFibGVBcnJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgdGhyZWFkIGhhbmRsZXMgdGhlIGFjdHVhbCBjYWxsYmFjay4KLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2Ugbm8gb25lIGVsc2Ugc2hvdWxkIGFjY2VzcyBpdC4KLSAqLwotY2xhc3MgUkVNQ2FsbGJhY2tUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCWZpbmFsIFJFTUNvbm5lY3Rpb24gZkNvbm5lY3Rpb247CS8vIEEgY29ubmVjdGlvbiB0byB1c2UKLQlmaW5hbCBSRU1DYWxsYmFja1JlZ2lzdHJ5IGZTZXJ2ZXI7Ci0JZmluYWwgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZGYWN0b3J5OwotCWZpbmFsIFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZlR5cGVGYWN0b3J5OwotCWZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCXByb3RlY3RlZCBib29sZWFuIHNodXR0aW5nRG93bjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpblRyYW5zYWN0aW9uOwkvLyBJcyB0aGlzIHRocmVhZCBjdXJyZW50bHkgcGFydGljaXBhdGluZyBpbiBhIHRyYW5zYWN0aW9uLCAoaS5lLiByZWFkaW5nL3dyaXRpbmcpLCBpZiBzbyB0aGVuIHdlIGNhbid0IHVzZSBpdCBmb3IgYW5vdGhlciB0cmFuc2FjdGlvbi4KLQkKLQotCS8qKgotCSAqIElzIHRoaXMgY2FsbGJhY2sgdGhyZWFkIGN1cnJlbnRseSBwYXJ0aWNpcGF0aW5nIGluIGEgdHJhbnNhY3Rpb24gKHJlYWRpbmcvd3JpdGluZykuIElmIHNvIHRoZW4gaXQgY2FuJ3QgYmUgdXNlZCBmb3IgYW4KLQkgKiBpbmRlcGVuZGVudCBuZXcgdHJhbnNhY3Rpb24uIEluIG90aGVyIHdvcmRzIHlvdSBjYW4ndCB3cml0ZS9yZWFkIGRhdGEgdXNpbmcgdGhpcyBjYWxsYmFjayB0aHJlYWQncwotCSAqIGNvbm5lY3Rpb24gYmVjYXVzZSBpdCBpcyBiZWluZyB1c2VkIGJ5IHNvbWVvbmUgZWxzZSBleHBlY3RpbmcgdG8gaGF2ZSBleGNsdXNpdmUgcmVhZC93cml0ZSBvbiB0aGlzIGNvbm5lY3Rpb24uCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGluVHJhbnNhY3Rpb24oKSB7Ci0JCXJldHVybiBpblRyYW5zYWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGlzIGNhbGxiYWNrIHRocmVhZCBpcyBpbiBhIHRyYW5zYWN0aW9uIG9yIG5vdC4gSWYgaXQgaXMgaW4gYSB0cmFuc2FjdGlvbiBpdCBjYW5ub3QgYmUgdXNlZAotCSAqIGZvciBhbiBpbmRlcGVuZGVudCBuZXcgdHJhbnNhY3Rpb24uIEluIG90aGVyIHdvcmRzIHlvdSBjYW4ndCB3cml0ZS9yZWFkIGRhdGEgdXNpbmcgdGhpcyBjYWxsYmFjayB0aHJlYWQncwotCSAqIGNvbm5lY3Rpb24gYmVjYXVzZSBpdCBpcyBiZWluZyB1c2VkIGJ5IHNvbWVvbmUgZWxzZSBleHBlY3RpbmcgdG8gaGF2ZSBleGNsdXNpdmUgcmVhZC93cml0ZSBvbiB0aGlzIGNvbm5lY3Rpb24uCi0JICogQHBhcmFtIGluVHJhbnNhY3Rpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRyYW5zYWN0aW9uKGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgewotCQl0aGlzLmluVHJhbnNhY3Rpb24gPSBpblRyYW5zYWN0aW9uOwotCX0KLQkKLQkvLyBLbHVkZ2U6IEJ1ZyBpbiBMaW51eCAxLjMueHh4IG9mIEpWTS4gQ2xvc2luZyBhIHNvY2tldCB3aGlsZSB0aGUgc29ja2V0IGlzIGJlaW5nIHJlYWQvYWNjZXB0IHdpbGwgbm90IGludGVycnVwdCB0aGUKLQkvLyB3YWl0LiBOZWVkIHRvIHRpbWVvdXQgdG8gdGhlIHNvY2tldCByZWFkL2FjY2VwdCBiZWZvcmUgdGhlIHNvY2tldCBjbG9zZSB3aWxsIGJlIG5vdGljZWQuIFRoaXMgaGFzIGJlZW4gZml4ZWQKLQkvLyBpbiBMaW51eCAxLjQuIFNvIG9uIExpbnV4IDEuMyBuZWVkIHRvIHB1dCB0aW1lb3V0cyBpbiBvbiB0aG9zZSBzb2NrZXRzIHRoYXQgY2FuIGJlIHNlcGFyYXRlbHkgY2xvc2VkIHdoaWxlIHJlYWRpbmcvYWNjZXB0aW5nLgotCXN0YXRpYyBib29sZWFuIExJTlVYXzFfMyA9ICJsaW51eCIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkgJiYgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLCIiKS5zdGFydHNXaXRoKCIxLjMiKTsJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQotCXB1YmxpYyBSRU1DYWxsYmFja1RocmVhZChTb2NrZXQgc29ja2V0LCBSRU1DYWxsYmFja1JlZ2lzdHJ5IHNlcnZlciwgU3RyaW5nIG5hbWUsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBib29sZWFuIG5vVGltZW91dHMpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCQotCQlmQ29ubmVjdGlvbiA9IG5ldyBSRU1Db25uZWN0aW9uKHNvY2tldCwgdHJ1ZSk7CS8vIE5vIHRpbWVvdXRzIHNpbmNlIHRoaXMgaXMgYSBzZXJ2ZXIgdGhyZWFkLgotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCWZTZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCWZGYWN0b3J5ID0gKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpOwotCQlmVHlwZUZhY3RvcnkgPSAoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgcmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXF1ZXN0IHRoZSB0aHJlYWQgdG8gY2xvc2UgZG93bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJdHJ5IHsKLQkJCXNodXR0aW5nRG93biA9IHRydWU7CS8vIFNvIHRoYXQgaWYgdGhpcyBpcyBhIGZvcmNlZCBjbG9zZSB0aGVuIGl0IHdpbGwga25vdyBub3QgdG8gcHJpbnQgZXJyb3IgbXNncy4KLQkJCWlmIChmQ29ubmVjdGlvbi5mU29ja2V0ICE9IG51bGwpCi0JCQkJZkNvbm5lY3Rpb24uZlNvY2tldC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBJUkVNQ29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWxsYmFjay4gVXNlZCBieQotCSAqIHRoZSBjb25uZWN0aW9uIHNlcnZlciB0byByZXR1cm4gdGhpcyBjb25uZWN0aW9uIGZvciBhbnkgcmVxdWVzdHMgCi0JICogbWFkZSBvbiB0aGlzIHRocmVhZC4KLQkgKiA8cGFja2FnZS1wcm90ZWN0ZWQ+IHNvIHRoYXQgb25seSByZW1vdGUgcHJveHkgY2FuIGFjY2Vzcy4KLQkgKi8KLQlJUkVNQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gZkNvbm5lY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQotCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBmQ29ubmVjdGlvbi5pbjsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBmQ29ubmVjdGlvbi5vdXQ7CQotCQlJbnB1dFN0cmVhbSBpbnMgPSBudWxsOwkKLQkJYm9vbGVhbiBzaHV0ZG93biA9IGZhbHNlOwotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZU9iamVjdCA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwkvLyBXb3JraW5nIHZhbHVlIG9iamVjdCBzbyBub3QgY29udGludWFsbHkgcmVjcmVhdGVkLgotCQlCZWFuUHJveHlWYWx1ZVNlbmRlciB2YWx1ZVNlbmRlciA9IG5ldyBCZWFuUHJveHlWYWx1ZVNlbmRlcih0aGlzLmZGYWN0b3J5KTsJLy8gV29ya2luZyB2YWx1ZXNlbmRlciBzbyBub3QgY29udGludWFsbHkgcmVjcmVhdGVkLiAKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gZG9Mb29wID0gdHJ1ZTsKLQotCQkJLyoqCi0JCQkgKiBOb3RlOiBJbiB0aGUgY2FzZXMgYmVsb3cgeW91IHdpbGwgc2VlIGEgbG90IG9mIGZpbmFsbHkgY2xhdXNlcyB0aGF0IG51bGwgdmFyaWFibGVzIG91dC4KLQkJCSAqIFRoaXMgaXMgYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGxvb3AsIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgd2l0aGluIGJsb2NrcyBhcmUgbm90Ci0JCQkgKiBnYXJiYWdlIGNvbGxlY3RlZCB1bnRpbCB0aGUgbWV0aG9kIGlzIHRlcm1pbmF0ZWQsIHNvIHRoZXNlIHZhcmlhYmxlcyBvbmNlIHNldCB3b3VsZCBuZXZlcgotCQkJICogYmUgR0MnZC4gVGhlIG51bGxpbmcgYXQgdGhlIGVuZCBvZiB0aGUgY2FzZSBtYWtlcyBzdXJlIHRoYXQgYW55IG9mIHRob3NlIG9iamVjdHMgc2V0IGFyZQotCQkJICogbm93IGF2YWlsYWJsZSBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gbmVjZXNzYXJ5LgotCQkJICovCQkKLQkJCXdoaWxlKGRvTG9vcCkgewotCQkJCWJ5dGUgY21kID0gMDsKLQkJCQl0cnkgewotCQkJCQlpZiAoTElOVVhfMV8zKQotCQkJCQkJZkNvbm5lY3Rpb24uZlNvY2tldC5zZXRTb1RpbWVvdXQoMTAwMCk7CS8vIExpbnV4IDEuMyBidWcsIHNlZSBzdGF0aWMgTElOVVhfMV8zIGFib3ZlCi0JCQkJCWNtZCA9IGluLnJlYWRCeXRlKCk7Ci0JCQkJCWlmIChMSU5VWF8xXzMpCi0JCQkJCQlmQ29ubmVjdGlvbi5mU29ja2V0LnNldFNvVGltZW91dCgwKTsJLy8gTGludXggMS4zIGJ1Zywgc2VlIHN0YXRpYyBMSU5VWF8xXzMgYWJvdmUKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7CS8vIFRpbWVkIG91dCwgdHJ5IGFnYWluCi0JCQkJfQotCQkJCQkKLQkJCQlzd2l0Y2ggKGNtZCkgewotCQkJCQljYXNlIENvbW1hbmRzLlFVSVRfQ09OTkVDVElPTjoJCQkJCi0JCQkJCQlkb0xvb3AgPSBmYWxzZTsJCi0JCQkJCQlicmVhazsJLy8gQ2xvc2UgdGhpcyBjb25uZWN0aW9uCi0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5URVJNSU5BVEVfU0VSVkVSOgotCQkJCQkJZG9Mb29wID0gZmFsc2U7CQkKLQkJCQkJCXNodXRkb3duID0gdHJ1ZTsJLy8gU2h1dGRvd24gZXZlcnl0aGluZwotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5DQUxMQkFDSzoKLQkJCQkJCWludCBjYWxsSUQgPSBpbi5yZWFkSW50KCk7CS8vIFRoZSBpZCBvZiB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayB0byBjYWxsLgotCQkJCQkJaW50IG1zZ0lEID0gaW4ucmVhZEludCgpOwkvLyBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdG8gY2FsbC4KLQkJCQkJCU9iamVjdCBwYXJtID0gbnVsbDsKLQkJCQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJCQkJSUNhbGxiYWNrIGNiID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gVGhlIHJlZ2lzdGVyIGNhbGxiYWNrIGhhbmRsZXIgd2lsbCBrbm93IGhvdyB0byBoYW5kbGUgdGhlIHBhcm0sCi0JCQkJCQkJLy8gaXQgd2lsbCBrbm93IGlmIGl0IGlzIGFuIGFycmF5IG9mIHByb3hpZXMsIG9yIGFuIG9iamVjdCBvZiBzb21lIGtpbmQuCi0JCQkJCQkJZkZhY3Rvcnkuc3RhcnRUcmFuc2FjdGlvbigpOwkvLyBTdGFydCBhIHRyYW5zYWN0aW9uLgotCQkJCQkJCXNldEludHJhbnNhY3Rpb24odHJ1ZSk7CS8vIEFsc28gdGVsbCBvdXJzZWx2ZXMgdGhhdCB3ZSBhcmUgaW4gYSB0cmFuc2FjdGlvbi4KLQkJCQkJCQlib29sZWFuIGlzUHJveGllcyA9IHRydWU7CQkJCQkJCQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCQlpZiAodmFsdWVPYmplY3QudHlwZSA9PSBDb21tYW5kcy5BUlJBWV9JRFMpIHsKLQkJCQkJCQkJCS8vIEl0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgSURzLCBhcyBpdCBub3JtYWxseSB3b3VsZCBiZS4KLQkJCQkJCQkJCS8vIEhvd2V2ZXIgaXQgd2lsbCBiZWNvbWUgSUJlYW5Qcm94eVtdLiBUaGF0IGlzIGJlY2F1c2UgaWYgSUQncwotCQkJCQkJCQkJLy8gdGhleSBtdXN0IGJlIHByb3hpZXMgb3ZlciBoZXJlLgotCQkJCQkJCQkJdmFsdWVTZW5kZXIuaW5pdGlhbGl6ZSh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQkJCQkJCWlmICh2YWx1ZVNlbmRlci5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJY2xvc2UoKTsJLy8gU29tZXRoaW5nIHdyb25nLCBjbG9zZSB0aGUgdGhyZWFkIHNvIG5leHQgdGltZSB3ZSBnZXQgYSBuZXcgb25lLgotCQkJCQkJCQkJfQotCQkJCQkJCQkJcGFybSA9IHZhbHVlU2VuZGVyLmdldEFycmF5KCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBJdCBpcyBvYmplY3Qgb3IgbnVsbC4gSXQgY291bGQgYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cywgb3Igb25lIG9iamVjdC4KLQkJCQkJCQkJCWlzUHJveGllcyA9IGZhbHNlOwotCQkJCQkJCQkJcGFybSA9IHZhbHVlT2JqZWN0LmdldEFzT2JqZWN0KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlzZXRJbnRyYW5zYWN0aW9uKGZhbHNlKTsKLQkJCQkJCQkJZkZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIE5vdyBwZXJmb3JtIHRoZSBjYWxsYmFjay4KLQkJCQkJCQljYiA9IGZTZXJ2ZXIuZ2V0UmVnaXN0ZXJlZENhbGxiYWNrKGNhbGxJRCk7Ci0JCQkJCQkJaWYgKGNiICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gQ2FsbGJhY2sgc3RpbGwgcmVnaXN0ZXJlZC4gSWYgcHJveGllcywgdGhlbiBpZiBmaXJzdCBlbnRyeSBpcyBqdXN0IGEgcHJveHksCi0JCQkJCQkJCS8vIHRoZW4gd2UgYXJlIHNlbmRpbmcgb25seSBvbmUuIEEgY29udmllbmVuY2UgZmFjdG9yIGZvciBjYWxsYmFja3MuCi0JCQkJCQkJCS8vIElmIG5vdCBhIHNpbmdsZSBlbnRyeSBvZiBJQmVhblByb3h5LCB0aGVuIHNlbmQgd2hvbGUgYXJyYXkuCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoaXNQcm94aWVzKQotCQkJCQkJCQkJCWlmICgoKE9iamVjdFtdKSBwYXJtKS5sZW5ndGggPT0gMSAmJiAoKChPYmplY3RbXSkgcGFybSlbMF0gPT0gbnVsbCB8fCAoKE9iamVjdFtdKSBwYXJtKVswXSBpbnN0YW5jZW9mIElCZWFuUHJveHkpKQotCQkJCQkJCQkJCQlyZXN1bHQgPSBjYi5jYWxsZWRCYWNrKG1zZ0lELCAoSUJlYW5Qcm94eSkgKChPYmplY3RbXSkgcGFybSlbMF0pOwotCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQkJcmVzdWx0ID0gY2IuY2FsbGVkQmFjayhtc2dJRCwgKE9iamVjdFtdKSBwYXJtKTsKLQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQlyZXN1bHQgPSBjYi5jYWxsZWRCYWNrKG1zZ0lELCBwYXJtKTsKLQkJCQkJCQkJCS8vIFdlIG9ubHkgYWNjZXB0IG51bGwsIElSRU1CZWFuUHJveGllcywgYW5kIE9iamVjdFtdLCB3aGVyZQotCQkJCQkJCQkJLy8gY29udGVudHMgb2YgT2JqZWN0W10gYXJlIGJlYW4gcHJveGllcy4KLQkJCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIElSRU1CZWFuUHJveHkpCi0JCQkJCQkJCQkJICgoSVJFTUJlYW5Qcm94eSkgcmVzdWx0KS5yZW5kZXJCZWFuKHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJCWVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQkJCQkJCQkJY2xhc3MgUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCQkJCQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQkJCQkJCU9iamVjdFtdIGFycmF5OwotCQkJCQkJCQkJCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJCQkJCQkJCQlwdWJsaWMgUmV0cmlldmVyKE9iamVjdFtdIGFuQXJyYXkpIHsKLQkJCQkJCQkJCQkJCWFycmF5ID0gYW5BcnJheTsKLQkJCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQkJCQkJCQkJCQlPYmplY3QgcmV0UGFybSA9IGFycmF5W2luZGV4KytdOwotCQkJCQkJCQkJCQkJaWYgKHJldFBhcm0gIT0gbnVsbCkKLQkJCQkJCQkJCQkJCQlpZiAocmV0UGFybSBpbnN0YW5jZW9mIElSRU1CZWFuUHJveHkpCi0JCQkJCQkJCQkJCQkJCSAoKElSRU1CZWFuUHJveHkpIHJldFBhcm0pLnJlbmRlckJlYW4od29ya2VyKTsKLQkJCQkJCQkJCQkJCQllbHNlIGlmIChyZXRQYXJtIGluc3RhbmNlb2YgVHJhbnNtaXRhYmxlQXJyYXkpIHsKLQkJCQkJCQkJCQkJCQkJLy8gSXQgaXMgYW5vdGhlciBhcnJheSwgY3JlYXRlIGEgbmV3Ci0JCQkJCQkJCQkJCQkJCS8vIHJldHJpZXZlci4KLQkJCQkJCQkJCQkJCQkJd29ya2VyLnNldEFycmF5SURTKAotCQkJCQkJCQkJCQkJCQkJbmV3IFJldHJpZXZlcigoKFRyYW5zbWl0YWJsZUFycmF5KSByZXRQYXJtKS5hcnJheSksCi0JCQkJCQkJCQkJCQkJCQkoKFRyYW5zbWl0YWJsZUFycmF5KSByZXRQYXJtKS5hcnJheS5sZW5ndGgsCi0JCQkJCQkJCQkJCQkJCQkoKFRyYW5zbWl0YWJsZUFycmF5KSByZXRQYXJtKS5jb21wb25lbnRUeXBlSUQpOwotCQkJCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCQkJCS8vIEl0J3MgYW4gb2JqZWN0LiBOZWVkIHRvIGdldCBiZWFuCi0JCQkJCQkJCQkJCQkJCS8vIHR5cGUgc28gdGhhdCB3ZSBjYW4gc2VuZCBpdC4KLQkJCQkJCQkJCQkJCQkJSVJFTUJlYW5Qcm94eSB0eXBlID0KLQkJCQkJCQkJCQkJCQkJCShJUkVNQmVhblByb3h5KSBmVHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShyZXRQYXJtLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJCQkJCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJCQkJCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJCQkJCQkJCQkJaW50IGNsYXNzSUQgPSB0eXBlLmdldElEKCkuaW50VmFsdWUoKTsKLQkJCQkJCQkJCQkJCQkJd29ya2VyLnNldEFzT2JqZWN0KHJldFBhcm0sIGNsYXNzSUQpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQkJCQl3b3JrZXIuc2V0KCk7Ci0JCQkJCQkJCQkJCQlyZXR1cm4gd29ya2VyOyAKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX07Ci0KLQkJCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXRBcnJheUlEUygKLQkJCQkJCQkJCQkJbmV3IFJldHJpZXZlcigoT2JqZWN0W10pIHJlc3VsdCksCi0JCQkJCQkJCQkJCSgoT2JqZWN0W10pIHJlc3VsdCkubGVuZ3RoLAotCQkJCQkJCQkJCQlDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tEb25lQ29tbWFuZChvdXQsIHZhbHVlT2JqZWN0LCBDb21tYW5kcy5OT19FUlJPUik7Ci0JCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJLy8gU29tZXRoaW5nIGhhcHBlbmVkLCB0dXJuIGl0IGludG8gYW4gZXJyb3Igb2JqZWN0Ci0JCQkJCQkJCQkvLyB0byBzZW5kIGJhY2suCi0JCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICc6JyArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQkJCQkJCUNvbW1hbmRzLnNlbmRDYWxsYmFja0RvbmVDb21tYW5kKG91dCwgdmFsdWVPYmplY3QsIENvbW1hbmRzLkNBTExCQUNLX1JVTlRJTUVfRVhDRVBUSU9OKTsKLQkJCQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5JTkZPKTsJLy8gSnVzdCBsb2cgaXQsIGJ1dCBhc3N1bWUgc2FmZSBlbm91Z2ggdG8ganVzdCBnbyBiYWNrIGFuZCB3YWl0IGZvciBuZXh0IGNhbGxiYWNrIHJlcXVlc3QuCi0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrRG9uZUNvbW1hbmQob3V0LCB2YWx1ZU9iamVjdCwgQ29tbWFuZHMuQ0FMTEJBQ0tfTk9UX1JFR0lTVEVSRUQpOwkvLyBTZW5kIGVycm9yIG1zZyBiYWNrIHRvIGluZGljYXRlIHdlIHdlcmVuJ3QgcmVnaXN0ZXJlZC4JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJcGFybSA9IG51bGw7CS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQkJCQkJY2IgPSBudWxsOwotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCXZhbHVlU2VuZGVyLmNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLkNBTExCQUNLX1NUUkVBTToKLQkJCQkJCS8vIEEgcmVxdWVzdCBmb3IgYSBzdHJlYW0KLQkJCQkJCWNhbGxJRCA9IGluLnJlYWRJbnQoKTsJLy8gVGhlIGlkIG9mIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIHRvIGNhbGwuCi0JCQkJCQltc2dJRCA9IGluLnJlYWRJbnQoKTsJLy8gVGhlIGlkIG9mIHRoZSBtZXNzYWdlIHRvIGNhbGwuCi0JCQkJCQljYiA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIE5vdyBwZXJmb3JtIHRoZSBjYWxsYmFjay4KLQkJCQkJCQljYiA9IGZTZXJ2ZXIuZ2V0UmVnaXN0ZXJlZENhbGxiYWNrKGNhbGxJRCk7Ci0JCQkJCQkJaWYgKGNiICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gQ2FsbGJhY2sgc3RpbGwgcmVnaXN0ZXJlZAotCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsJCQkJCQkJCQotCQkJCQkJCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tEb25lQ29tbWFuZChvdXQsIHZhbHVlT2JqZWN0LCBDb21tYW5kcy5OT19FUlJPUik7CS8vIFNlbmQgbnVsbCB0byBsZXQgaXQga25vdyB3ZSd2ZSBhY2NlcHRlZCB0aGUgc3RyZWFtCi0JCQkJCQkJCWlucyA9IG5ldyBSRU1DYWxsYmFja0lucHV0U3RyZWFtKGluLCBvdXQpOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJY2IuY2FsbGVkQmFja1N0cmVhbShtc2dJRCwgaW5zKTsKLQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaW5zLmNsb3NlKCk7CS8vIE1ha2Ugc3VyZSBpdCdzIGNsb3NlZC4KLQkJCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBFeGNlcHRpb24gd2hpbGUgY2xvc2luZywganVzdCBsb2cgaXQgYW5kIHRoZW4gbWFyayB0byBlbmQgdGhlIGxvb3Agc28gd2UgY2xvc2UgY29ubmVjdGlvbiB0b28uCi0JCQkJCQkJCQkJZG9Mb29wID0gZmFsc2U7Ci0JCQkJCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJJbiBSRU1DYWxsYmFja1RocmVhZCIsIGUpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkJCQkKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCQlDb21tYW5kcy5zZW5kQ2FsbGJhY2tEb25lQ29tbWFuZChvdXQsIHZhbHVlT2JqZWN0LCBDb21tYW5kcy5DQUxMQkFDS19OT1RfUkVHSVNURVJFRCk7CS8vIFNlbmQgZXJyb3IgbXNnIGJhY2sgdG8gaW5kaWNhdGUgd2Ugd2VyZW4ndCByZWdpc3RlcmVkLgkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQljYiA9IG51bGw7CS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCWlucyA9IG51bGw7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQotCQkJCQlkZWZhdWx0OgotCQkJCQkJLy8gVW5rbm93biBjb21tYW5kLiBXZSBkb24ndCBrbm93IGhvdyBsb25nIHRoZSBjb21tYW5kIGlzLCBzbyB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJSRU1DYWxsYmFjazogSW52YWxpZCBjbWQgc2VudD0iK2NtZCwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkb0xvb3AgPSBmYWxzZTsJCQkJCQkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgaXMgb2suIEl0IG1lYW5zIHRoYXQgdGhlIGNvbm5lY3Rpb24gb24gdGhlIG90aGVyIHNpZGUgd2FzIHRlcm1pbmF0ZWQuCi0JCQkvLyBTbyBqdXN0IGFjY2VwdCB0aGlzIGFuZCBnbyBkb3duLgotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJaWYgKCFzaHV0dGluZ0Rvd24pCi0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJJbiBSRU1DYWxsYmFja1RocmVhZCIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCWNsb3NlKCk7Ci0JCX0JCQotCQlmU2VydmVyLnJlbW92ZUNhbGxiYWNrVGhyZWFkKHRoaXMpOwotCQlpZiAoc2h1dGRvd24pCi0JCQlmU2VydmVyLnJlcXVlc3RTaHV0ZG93bigpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzVjZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAkUkNTZmlsZTogUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuUHJveHkuamF2YSx2ICQgJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIElERSBJbXBsZW1lbnRhdGlvbiBvZiBJQ2hhcmFjdGVyQmVhblByb3h5IGZvciB0aGUgQ2hhcmFjdGVyIGNsYXNzLiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwCi0gKiA5OjAyOjU0IEFNKSBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSUNoYXJhY3RlckJlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIENoYXJhY3RlciBmQ2hhclZhbHVlOwotCi0JLyoqCi0JICogQXMgd2VsbCBhcyBzdG9yaW5nIHRoZSBiZWFuIHN0b3JlIHRoZSBjaGFyIHZhbHVlIHNvIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgY2hhclZhbHVlIGZhc3RlcgotCSAqIHdpdGhvdXQgdGhlIG5lZWQgZm9yIHJlcGVhdGVkIHJlLWNhc3RpbmcuIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgaXMgY3JlYXRlZCBpbgotCSAqIHNwZWNpYWwgd2F5LCBzbyBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZXNlLgotCSAqIAotCSAqIEBwYXJhbSBhQmVhbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCVJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2hhcmFjdGVyIHZhbHVlKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSk7Ci0JCWZDaGFyVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOiAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdCAyKSBFbHNlIGlmIG90aGVyIGlzIGFuCi0JICogSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmIGVxdWFscyBvbiB0aGUgc2VydmVyLiAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQKLQkgKiBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50IHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksCi0JICogdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gSWRlbnRpdHkKLQkJaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuUHJveHkpCi0JCQlyZXR1cm4gZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKSA9PSAoKFJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5KSBhbk9iamVjdCkuY2hhclZhbHVlKCk7Ci0JCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCXJldHVybiBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpID09ICgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdmFsdWUKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphdmEubGFuZy5DaGFyYWN0ZXIgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQ2hhcmFjdGVyIGNoYXJhY3RlclZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXJWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHRvU3RyaW5nKCkgb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gZkNoYXJWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnR5cGUKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5jaGFyYWN0ZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZS5zZXQoZkNoYXJWYWx1ZSk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNieXRlVmFsdWUoKQotCSAqLwotCXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIChieXRlKSBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNkb3VibGVWYWx1ZSgpCi0JICovCi0JcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDaGFyVmFsdWUuY2hhclZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2Zsb2F0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCQlyZXR1cm4gZkNoYXJWYWx1ZS5jaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjaW50VmFsdWUoKQotCSAqLwotCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNsb25nVmFsdWUoKQotCSAqLwotCXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDaGFyVmFsdWUuY2hhclZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I251bWJlclZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCQlyZXR1cm4gbmV3IEludGVnZXIoY2hhclZhbHVlKCkpOyAvLyBLbHVkZ2UuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I3Nob3J0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCQlyZXR1cm4gKHNob3J0KSBmQ2hhclZhbHVlLmNoYXJWYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYmNiMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBDaGFyYWN0ZXIgQmVhblR5cGUgUHJveHkgZm9yIENoYXJhY3Rlci5jbGFzcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzIzLzAwIDE6NTk6MDIgUE0pCi0gKiBAYXV0aG9yOiBSaWNoYXJkIExlZSBLdWxwCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkgewotCWZpbmFsIFJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5IG5pbFByb3h5OwkvLyBWYWx1ZSBvZiAnXDAnCi0KLVJFTUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IG9iamVjdFR5cGUpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNIQVJBQ1RFUl9DTEFTUyksIENoYXJhY3Rlci5jbGFzcy5nZXROYW1lKCksIG9iamVjdFR5cGUpOwotCQotCW5pbFByb3h5ID0gbmV3IFJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IENoYXJhY3RlcignXDAnKSk7Ci19Ci0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KENoYXJhY3RlciBhQ2hhcmFjdGVyKSB7Ci0JcmV0dXJuIChhQ2hhcmFjdGVyLmNoYXJWYWx1ZSgpICE9ICdcMCcpID8KLQkJbmV3IFJFTUNoYXJhY3RlckNsYXNzQmVhblByb3h5KGZSZWdpc3RyeSwgYUNoYXJhY3RlcikgOiBuaWxQcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uIFRoZXkgYXJlIGNyZWF0ZWQKLSAqIGV4cGxpY2l0bHkgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgY3JlYXRlIG1ldGhvZC4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHdyYXBwZXIgdHlwZXMsIHRoZXkgYXJlIGZpbmFsIGNsYXNzZXMsIHNvIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSAKLSAqIGZvciBzdWJjbGFzc2VzLgotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIENoYXJhY3RlciBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgbmlsUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiBuaWxQcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVDaGFyYWN0ZXJCZWFuUHJveHkobmV3IENoYXJhY3Rlcih2YWx1ZS5hQ2hhcikpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJUeXBlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODk2NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJUeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICRSQ1NmaWxlOiBSRU1DaGFyYWN0ZXJUeXBlQmVhblByb3h5LmphdmEsdiAkICRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgaW1wbGVtZW50YXRpb24gb2YgSUNoYXJhY3RlckJlYW5Qcm94eS4gQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKSBAYXV0aG9yOiBKb2UKLSAqIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSBleHRlbmRzIFJFTUNvbnN0YW50QmVhblByb3h5IGltcGxlbWVudHMgSUNoYXJhY3RlckJlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIGNoYXIgZkNoYXI7Ci0KLQlSRU1DaGFyYWN0ZXJUeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgY2hhciB2YWx1ZSkgewotCQlzdXBlcihhUmVnaXN0cnkpOwotCQlmQ2hhciA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIGVxdWFsczogRXF1YWwgaWY6IDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0IDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4KLQkgKiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudAotCSAqIHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwKLQkgKiB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJCXJldHVybiB0cnVlOyAvLyBJZGVudGl0eQotCQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1DaGFyYWN0ZXJUeXBlQmVhblByb3h5KQotCQkJcmV0dXJuIGZDaGFyID09ICgoUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLmNoYXJWYWx1ZSgpOwotCQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQlyZXR1cm4gZkNoYXIgPT0gKChDaGFyYWN0ZXIpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gSWRlbnRpdHkKLQkJaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBSRU1DaGFyYWN0ZXJUeXBlQmVhblByb3h5KQotCQkJcmV0dXJuIGZDaGFyID09ICgoUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuY2hhclZhbHVlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdmFsdWUKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhcjsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBqYXZhLmxhbmcuQ2hhcmFjdGVyIHZhbHVlCi0JICovCi0JcHVibGljIENoYXJhY3RlciBjaGFyYWN0ZXJWYWx1ZSgpIHsKLQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoZkNoYXIpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZihmQ2hhcik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiZWFudHlwZQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmNoYXJUeXBlOwotCX0KLQotCS8qKgotCSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlLnNldChmQ2hhcik7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNieXRlVmFsdWUoKQotCSAqLwotCXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIChieXRlKSBmQ2hhcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjZG91YmxlVmFsdWUoKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjZmxvYXRWYWx1ZSgpCi0JICovCi0JcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjaW50VmFsdWUoKQotCSAqLwotCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjbG9uZ1ZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JCXJldHVybiBmQ2hhcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjbnVtYmVyVmFsdWUoKQotCSAqLwotCXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlcihmQ2hhcik7IC8vIEtsdWRnZQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNzaG9ydFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQkJcmV0dXJuIChzaG9ydCkgZkNoYXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlclR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNoYXJhY3RlclR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzMxMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQ2hhcmFjdGVyVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0KLS8qKgotICogQ2hhcmFjdGVyLlRZUEUgQmVhblR5cGUgUHJveHkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi8yMy8wMCAxOjU5OjAyIFBNKQotICogQGF1dGhvcjogUmljaGFyZCBMZWUgS3VscAotICovCi1maW5hbCBjbGFzcyBSRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotCi0JZmluYWwgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eSBuaWxQcm94eTsJLy8gVmFsdWUgb2YgJ1wwJwotLyoqCi0gKiBSRU1DaGFyYWN0ZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1DaGFyYWN0ZXJUeXBlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNIQVJBQ1RFUl9UWVBFKSwgQ2hhcmFjdGVyLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQluaWxQcm94eSA9IG5ldyBSRU1DaGFyYWN0ZXJUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgJ1wwJyk7Ci19Ci0KLS8qKgotICogU3RhdGljIGhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqIFVzZSB0aGUgY2FjaGUuCi0gKi8KLUlDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQ2hhcmFjdGVyQmVhblByb3h5KGNoYXIgYUNoYXJhY3RlcikgewotCXJldHVybiBuZXcgUkVNQ2hhcmFjdGVyVHlwZUJlYW5Qcm94eShmUmVnaXN0cnksIGFDaGFyYWN0ZXIpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gQ2hhcmFjdGVyIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSBuaWxQcm94eSBmb3IgdGhpcyBjYXNlIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIG5pbFByb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUNoYXJhY3RlckJlYW5Qcm94eSh2YWx1ZS5hQ2hhcik7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODE5ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1DbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogVGhpcyBpcyBhIGJlYW4gdHlwZSBmb3IgdGhlIENsYXNzIG9iamVjdC4gSXQgaXMgbmVlZGVkIHNvIHRoYXQKLSAqIHdoZW4gYSBuZXcgb2JqZWN0IGlkIGNvbWVzIGluIHRoYXQgcmVwcmVzZW50cyBhIGNsYXNzLCBpdCB3aWxsCi0gKiBnbyB0aHJvdWdoIHRoaXMgYmVhbiB0eXBlIHRvIGNyZWF0ZSBpdC4gV2UgbmVlZCB0byBkbyBzb21ldGhpbmcKLSAqIHNwZWNpYWwgc28gdGhhdCB0aGUgY29ycmVjdCBiZWFuIHR5cGUgb2JqZWN0IGlzIGNyZWF0ZWQuCi0gKi8KLQotZmluYWwgY2xhc3MgUkVNQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHsKLQotCi1SRU1DbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBvYmplY3RUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5DTEFTU19DTEFTUyksIENsYXNzLmNsYXNzLmdldE5hbWUoKSwgb2JqZWN0VHlwZSk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDbGFzcyBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGEgZGVmYXVsdCBjdG9yLAotICogdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsgCi0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDbGFzcyBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGEgaW5pdGlhbGl6YXRpb24gc3RyaW5ncywKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19CQkKLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIE5PVEU6IFNpbmNlIHRoZSBDbGFzcyB0eXBlIGlzIGZpbmFsLCB0aGlzIGZ1bmN0aW9uIGlzbid0IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotICoKLSAqIEluIHRoaXMgY2FzZSBpdCBtZWFucyB3ZSBuZWVkIGEgbmV3IElCZWFuUHJveHlUeXBlLiBXZSB3aWxsIGxldCB0aGUgCi0gKiBCZWFudHlwZSBmYWN0b3J5IGhhbmRsZSB0aGlzIHNpbmNlIGl0IGtub3dzIGhvdyB0byBnZXQgdGhlIGluZm9ybWF0aW9uCi0gKiBmb3IgYSBzcGVjaWZpYyBpZC4KLSAqLwotcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5jcmVhdGVCZWFuVHlwZVByb3h5KGFuSUQpOwotfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTY4MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNQ29ubmVjdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5UaW1lclRlc3RzOwotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKiBJdCB1c2VzIHRoZSBwcm9wZXJ0eSAicHJveHl2bS5idWZzaXplIiB0byBkZXRlcm1pbmUgdGhlIGJ1ZmZlciBzaXplIHRvIHVzZS4gSWYgbm90IHNwZWNpZmllZCwgaXQgdXNlcyB0aGUgc3lzdGVtIGRlZmF1bHQKLSAqLwotcHVibGljIGNsYXNzIFJFTUNvbm5lY3Rpb24gaW1wbGVtZW50cyBJUkVNQ29ubmVjdGlvbiwgSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlZPS0VfU1RFUCA9ICJJbnZva2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5WT0tFX01FVEhPRF9TVEVQID0gIkludm9rZSBNZXRob2QiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFNvY2tldCBmU29ja2V0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgRGF0YUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQlwcm90ZWN0ZWQgRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX09VVCA9IDEwMDAgKiAzMDsJLy8gV2FpdCB1cCB0byBoYWxmIG1pbnV0ZSBiZWZvcmUgdGltZW91dC4KLQkKLQlwdWJsaWMgUkVNQ29ubmVjdGlvbihTb2NrZXQgc29ja2V0LCBib29sZWFuIG5vVGltZW91dHMpIHsKLQkJdHJ5IHsKLQkJCWZTb2NrZXQgPSBzb2NrZXQ7Ci0JCQlmU29ja2V0LnNldFNvTGluZ2VyKHRydWUsIDEwKTsJLy8gV2FpdCAxMCBzZWNvbmRzIGlmIG5lY2Vzc2FyeSBmb3IgdGhlIGZpbmFsIHN0dWZmIHRvIGdvIG91dCBhZnRlciBjbG9zaW5nLgotCQkJaWYgKCFub1RpbWVvdXRzKQotCQkJCWZTb2NrZXQuc2V0U29UaW1lb3V0KFRJTUVfT1VUKTsJLy8gVGltZW91dCBwZXJpb2QKLQkJCUludGVnZXIgYnVmU2l6ZSA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5idWZzaXplIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChidWZTaXplID09IG51bGwpCi0JCQkJYnVmU2l6ZSA9IG5ldyBJbnRlZ2VyKDE2MDAwKTsKLQkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmU29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCBidWZTaXplLmludFZhbHVlKCkpKTsJLy8gSXQgZGlkbid0IHRha2UgdGhlIGhpbnQsIHNvIHdlIHdpbGwgYnVmZmVyIGl0LgotCQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSwgYnVmU2l6ZS5pbnRWYWx1ZSgpKSk7CS8vIEl0IGRpZG4ndCB0YWtlIHRoZSBoaW50LCBzbyB3ZSB3aWxsIGJ1ZmZlciBpdC4KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJfQotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMykgewotCQkJCX0KLQkJCXRyeSB7Ci0JCQkJZlNvY2tldC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTQpIHsKLQkJCX0KLQkJCWZTb2NrZXQgPSBudWxsOwotCQkJaW4gPSBudWxsOwotCQkJb3V0ID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEaWQgdGhpcyBjb25zdHJ1Y3QgY29ycmVjdGx5LgotCSAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgYW4gZXhjZXB0aW9uIGNvdWxkIGJlIHRocm93biBpbiB0aGUgY3RvciBhbmQKLQkgKiB0aGF0J3Mgbm90IGEgZ29vZCB0aGluZyB0byBkby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIGZTb2NrZXQgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGVybWluYXRlIHRoZSBzZXJ2ZXIuIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZVNlcnZlcigpIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJQ29tbWFuZHMuc2VuZFRlcm1pbmF0ZUNvbW1hbmQob3V0KTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0cnkgewotCQkJCUNvbW1hbmRzLnNlbmRRdWl0Q29tbWFuZChvdXQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUzKSB7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWZTb2NrZXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlNCkgewotCQkJCX0KLQkJCX0KLQkJCWZTb2NrZXQgPSBudWxsOwotCQkJaW4gPSBudWxsOwotCQkJb3V0ID0gbnVsbDsKLQkJfQotCX0KLQkJCi0JCQkJCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgaW5mb3JtYXRpb24uCi0JICovCi0JcHVibGljIEdldENsYXNzUmV0dXJuIGdldENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQl0cnkgewotCQkJCS8vIEl0J3Mgc2ltcGxlLCBqdXN0IHBhc3Mgb250byBDb21tYW5kcy4KLQkJCQlyZXR1cm4gQ29tbWFuZHMuc2VuZEdldENsYXNzQ29tbWFuZChvdXQsIGluLCBjbGFzc05hbWUpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZS5nZXRFcnJvckNvZGUoKSAhPSBDb21tYW5kcy5HRVRfQ0xBU1NfTk9UX0ZPVU5EKQotCQkJCQl0aHJvdyBlOwkvLyBOb3QgY2xhc3Mgbm90IGZvdW5kLCBzZW5kIGl0IG9uCi0JCQl9CQkJCi0JCXJldHVybiBudWxsOwkvLyBOb3QgZm91bmQsIHNvIHJldHVybiBudWxsCQkJCQotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGluZm9ybWF0aW9uIGdpdmVuIGFuIElELgotCSAqLwotCXB1YmxpYyBHZXRDbGFzc0lEUmV0dXJuIGdldENsYXNzRnJvbUlEKGludCBjbGFzc0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBJdCdzIHNpbXBsZSwganVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQlyZXR1cm4gQ29tbWFuZHMuc2VuZEdldENsYXNzRnJvbUlEQ29tbWFuZChvdXQsIGluLCBjbGFzc0lEKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsJLy8gTm90IGZvdW5kLCBzbyByZXR1cm4gbnVsbAkJCi0JfQkKLQkKLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBkYXRhIGZyb20gYW4gaWQuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0T2JqZWN0RGF0YShpbnQgY2xhc3NJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKLQkJCS8vIEp1c3QgcGFzcyBvbnRvIENvbW1hbmRzLgotCQkJQ29tbWFuZHMuc2VuZEdldE9iamVjdERhdGEob3V0LCBpbiwgY2xhc3NJRCwgdmFsdWVSZXR1cm4pOwotCQl9IGVsc2UKLQkJCXZhbHVlUmV0dXJuLnNldCgpOwkvLyBTZXQgaXQgdG8gbnVsbCBzaW5jZSB3ZSBhcmVuJ3QgY29ubmVjdGVkLgotCX0JCi0KLQkvKioKLQkgKiBHZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgYW4gaW5pdCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXROZXdJbnN0YW5jZShpbnQgY2xhc3NJRCwgU3RyaW5nIGluaXRTdHJpbmcsIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5ld0luc3RhbmNlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBKdXN0IHBhc3Mgb250byBDb21tYW5kcy4KLQkJCUNvbW1hbmRzLnNlbmROZXdJbnN0YW5jZShvdXQsIGluLCBjbGFzc0lELCBpbml0U3RyaW5nLCBuZXdJbnN0YW5jZSk7Ci0JCX0gZWxzZQotCQkJbmV3SW5zdGFuY2Uuc2V0KCk7CS8vIFNldCBpdCB0byBudWxsIHNpbmNlIHdlIGFyZW4ndCBjb25uZWN0ZWQuCi0JfQotCQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VJRChpbnQgaWQpewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCXRyeSB7Ci0JCQkJLy8gSnVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQkJQ29tbWFuZHMucmVsZWFzZU9iamVjdENvbW1hbmQob3V0LCBpZCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRG9uJ3QgY2FyZSBpdCBkaWRuJ3Qgd29yawotCQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUNvbm5lY3Rpb24jZ2V0QXJyYXlDb250ZW50cyhpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldEFycmF5Q29udGVudHMoaW50IGFycmF5SUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBJdCdzIHNpbXBsZSwganVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQlDb21tYW5kcy5zZW5kR2V0QXJyYXlDb250ZW50c0NvbW1hbmQob3V0LCBpbiwgYXJyYXlJRCwgcmV0dXJuVmFsdWUpOwotCQl9CQkJCi0JfQotCQotCS8qKgotCSAqIEludm9rZSB0aGUgbWV0aG9kIGNhbGwKLQkgKi8JCi0JcHVibGljIHZvaWQgaW52b2tlTWV0aG9kKGludCBtZXRob2RJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgaW52b2tlT24sIENvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zLCBDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gSXQncyBzaW1wbGUsIGp1c3QgcGFzcyBvbnRvIENvbW1hbmRzLgotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChJTlZPS0VfTUVUSE9EX1NURVApOwotCQkJQ29tbWFuZHMuc2VuZEludm9rZU1ldGhvZENvbW1hbmQob3V0LCBpbiwgbWV0aG9kSUQsIGludm9rZU9uLCBwYXJtcywgcmV0dXJuVmFsdWUpOwotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKElOVk9LRV9NRVRIT0RfU1RFUCk7Ci0JCX0JCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQ29ubmVjdGlvbiNpbnZva2VNZXRob2Qob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGludm9rZU1ldGhvZChWYWx1ZU9iamVjdCBjbGFzc1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBWYWx1ZU9iamVjdCBwYXJtVHlwZXMsIFZhbHVlT2JqZWN0IGludm9rZU9uLCBWYWx1ZU9iamVjdCBwYXJtcywKLQkJCVZhbHVlT2JqZWN0IHJldHVyblZhbHVlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyBJdCdzIHNpbXBsZSwganVzdCBwYXNzIG9udG8gQ29tbWFuZHMuCi0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKElOVk9LRV9TVEVQKTsKLQkJCUNvbW1hbmRzLnNlbmRJbnZva2VNZXRob2RDb21tYW5kKG91dCwgaW4sIGNsYXNzVHlwZSwgbWV0aG9kTmFtZSwgcGFybVR5cGVzLCBpbnZva2VPbiwgcGFybXMsIHJldHVyblZhbHVlKTsKLQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0b3BDdW11bGF0aXZlU3RlcChJTlZPS0VfU1RFUCk7Ci0JCX0JCQkKLQl9Ci0JCi0JLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogUHV0IHRoZSBFeHByZXNzaW9uIHByb2Nlc3NpbmcgY29tbWFuZHMgaGVyZS4KLQkgKiAKLQkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jc3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZygpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZyhpbnQgZXhwcmVzc2lvbklELCBieXRlIHRyYWNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kU3RhcnRFeHByZXNzaW9uUHJvY2Vzc2luZ0NvbW1hbmQoZXhwcmVzc2lvbklELCB0cmFjZSwgb3V0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoRXhwcmVzc2lvbkNvbW1hbmQoYnl0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRXhwcmVzc2lvbkNvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgYnl0ZSBzdWJjb21tYW5kKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kRXhwcmVzc2lvbkNvbW1hbmQoZXhwcmVzc2lvbklELCBvdXQsIHN1YmNvbW1hbmQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNzdG9wRXhwcmVzc2lvblByb2Nlc3NpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BFeHByZXNzaW9uUHJvY2Vzc2luZyhpbnQgZXhwcmVzc2lvbklEKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kRW5kRXhwcmVzc2lvblByb2Nlc3NpbmdDb21tYW5kKGV4cHJlc3Npb25JRCwgb3V0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoVmFsdWVPYmplY3Qob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHMuVmFsdWVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHVzaFZhbHVlT2JqZWN0KFZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHZhbHVlT2JqZWN0LCBmYWxzZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jcHVzaEJ5dGUoYnl0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoQnl0ZShieXRlIGFieXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kQnl0ZShvdXQsIGFieXRlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoSW50KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoSW50KGludCBhbkludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZEludChvdXQsIGFuSW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiNwdXNoU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcHVzaFN0cmluZyhTdHJpbmcgYVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZFN0cmluZyhvdXQsIGFTdHJpbmcpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uI3B1c2hCb29sZWFuKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEJvb2xlYW4oYm9vbGVhbiBhQm9vbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpCi0JCQlFeHByZXNzaW9uQ29tbWFuZHMuc2VuZEJvb2xlYW4ob3V0LCBhQm9vbCk7Ci0JfQotCi0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jZ2V0RmluYWxWYWx1ZShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRGaW5hbFZhbHVlKFZhbHVlT2JqZWN0IHJlc3VsdCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUNvbW1hbmRzLnJlYWRCYWNrVmFsdWUoaW4sIHJlc3VsdCwgQ29tbWFuZHMuTk9fVFlQRV9DSEVDSyk7Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uI3B1bGxWYWx1ZShpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHB1bGxWYWx1ZShpbnQgZXhwcmVzc2lvbklELCBWYWx1ZU9iamVjdCBwcm94eWlkcywgVmFsdWVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRQdWxsVmFsdWVDb21tYW5kKGV4cHJlc3Npb25JRCwgb3V0LCBpbiwgcHJveHlpZHMsIHNlbmRlcik7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24jc3luYyhpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmMoaW50IGV4cHJlc3Npb25JRCwgVmFsdWVPYmplY3QgcHJveHlpZHMsIFZhbHVlU2VuZGVyIHNlbmRlcikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlpZiAoaXNDb25uZWN0ZWQoKSkKLQkJCUV4cHJlc3Npb25Db21tYW5kcy5zZW5kU3luY0NvbW1hbmQoZXhwcmVzc2lvbklELCBvdXQsIGluLCBwcm94eWlkcywgc2VuZGVyKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1Db25uZWN0aW9uI3JlYWRQcm94eUFycmF5VmFsdWVzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZVNlbmRlciwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUHJveHlBcnJheVZhbHVlcyhDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSwgQ29tbWFuZHMuVmFsdWVTZW5kZXIgdmFsdWVTZW5kZXIsIGJvb2xlYW4gYWxsb3dGbGFnKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJQ29tbWFuZHMucmVhZEFycmF5KGluLCByZXR1cm5WYWx1ZS5hbkludCwgdmFsdWVTZW5kZXIsIHJldHVyblZhbHVlLCBhbGxvd0ZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyYW5zZmVyRXhwcmVzc2lvbihpbnQgZXhwcmVzc2lvbklELCBWYWx1ZU9iamVjdCBleHBDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRUcmFuc2ZlckV4cHJlc3Npb25Db21tYW5kKGV4cHJlc3Npb25JRCwgb3V0LCBpbiwgZXhwQ29udHJvbGxlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdW1lRXhwcmVzc2lvbihpbnQgZXhwcmVzc2lvbklELCBWYWx1ZU9iamVjdCBleHBDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0Nvbm5lY3RlZCgpKQotCQkJRXhwcmVzc2lvbkNvbW1hbmRzLnNlbmRSZXN1bWVFeHByZXNzaW9uQ29tbWFuZChleHByZXNzaW9uSUQsIG91dCwgZXhwQ29udHJvbGxlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0YW50QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0YW50QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmY2N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdGFudEJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUNvbnN0YW50QmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotLyoqCi0gKiBUaGlzIGlzIGEgYmFzZSBmb3IgYmVhbiBwcm94aWVzIHRoYXQgYXJlIGNvbnN0YW50cyBhbmQKLSAqIGRvIG5vdCBoYXZlIGFuIG9iamVjdCBvbiB0aGUgcmVtb3RlIFZNIHNpZGUuIFRoZXkgYXJlCi0gKiBzaGlwcGVkIGJhY2sgYW5kIGZvcnRoIGJ5IHZhbHVlLgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElSRU1Db25zdGFudEJlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5OwotCXByaXZhdGUgZmluYWwgc3RhdGljIEludGVnZXIgSUQgPSBuZXcgSW50ZWdlcihDb21tYW5kcy5OT1RfQU5fSUQpOwotCQotCXByb3RlY3RlZCBSRU1Db25zdGFudEJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhRmFjdG9yeSkgewotCQlmRmFjdG9yeSA9IGFGYWN0b3J5OwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdHJ5IHRoaXMgcHJveHkgd2FzIGNyZWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBmRmFjdG9yeTsKLQl9Ci0JCi0JLyoqCi0JICogZXF1YWxzOiBFcXVhbCBpZjoKLQkgKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0JICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotCSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0JICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotCSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotCSAqIFRoaXMgaXMgYWJzdHJhY3QgYmVjYXVzZSBlYWNoIHR5cGUgbmVlZHMgdG8gZG8gYSB1bmlxdWUgdGVzdCBmb3IgZXF1YWxpdHkuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCS8vIFdlIGNhbid0IGJlIGFzc3VyZWQgdGhhdCB0aGVyZSBhcmUgbm90IG5vbi1pZGVudGljYWwgY29uc3RhbnRzIHRoYXQgYXJlIGFjdHVhbGx5IGlkZW50aWNhbC4KLQkJLy8gVGhpcyBpcyBiZWNhdXNlIGZvciBjb25zdGFudHMgd2UgZG8gbm90IGtub3cgdGhlIGlkIG9mIHRoZSBvcmlnaW5hbC4gVGhhdCBpcyBub3Qgc2VudCBhY3Jvc3MgZnJvbSB0aGUgdm0uCQkKLQkJcmV0dXJuIHRoaXMgPT0gYUJlYW5Qcm94eTsJCi0JfQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIElEIG9mIHRoaXMgcHJveHkuCi0JICogQ29uc3RhbnRzIGhhdmUgbm8gaWQncywgc28gd2UgcmV0dXJuIC0xLgotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCQotCS8qKgotCSAqIGlzVmFsaWQuIENvbnN0YW50IG9uZXMgYXJlIGFsd2F5cyB2YWxpZCB1bmxlc3MgdGhlIHJlZ2lzdHJ5IGlzIHRlcm1pbmF0ZWQsIGV4Y2VwdCBpZiBhbgotCSAqIG92ZXJyaWRlIHJlbGVhc2VzIHJlc291cmNlcy4gSW4gdGhhdCBjYXNlIHRoZSBvdmVycmlkaW5nCi0JICogc3ViY2xhc3Mgc2hvdWxkIGFsc28gb3ZlcnJpZGUgaXNWYWxpZCgpIHRvIHJldHVybiBmYWxzZQotCSAqIGlmIHJlbGVhc2UoKSB3YXMgY2FsbGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmRmFjdG9yeS5pc1ZhbGlkKCk7Ci0JfQotCQotCS8qKgotCSAqIHJlbGVhc2UuIENvbnN0YW50IG9uZXMgZG9uJ3QgbmVlZCB0byB0eXBpY2FsbHkgYmUgcmVsZWFzZWQsIGhvd2V2ZXIKLQkgKiBpZiBhbiBvdmVycmlkZSBkb2VzIGRvIHNvbWV0aGluZyB0byByZWxlYXNlLCB0aGVuIGl0IE1VU1QgYWxzbwotCSAqIG92ZXJyaWRlIGlzVmFsaWQoKSB0byByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0JlYW5Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCZWFuUHJveHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNFeHByZXNzaW9uUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRXhwcmVzc2lvblByb3h5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Db25zdHJ1Y3RvclByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0cnVjdG9yUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4NGFjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0cnVjdG9yUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Db25zdHJ1Y3RvclByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLlRyYW5zbWl0YWJsZUFycmF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFByb3h5IGZvciBhIGNvbnN0cnVjdG9yLgotICovCi0KLWZpbmFsIGNsYXNzIFJFTUNvbnN0cnVjdG9yUHJveHkgZXh0ZW5kcyBSRU1BY2Nlc3NpYmxlT2JqZWN0UHJveHkgaW1wbGVtZW50cyBJQ29uc3RydWN0b3JQcm94eSB7Ci0KLQlSRU1Db25zdHJ1Y3RvclByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklEKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCk7Ci0JfQotCi0JLyoqCi0JICogVXNpbmcgdGhpcyBjb25zdHJ1Y3RvciAoYXNzdW1pbmcgaXQgdGFrZXMgbm8gYXJndW1lbnRzKSBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuCi0JICogRXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGlmIHRoaXMgY29uc3RydWN0b3IgdGFrZXMgYXJndW1lbnRzLgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIHByb3h5IGlzIGNvbnN0YW50IHByb3h5IG91dCBvZiB0aGUgbWV0aG9kIGZhY3RvcnkuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuY3RvclR5cGU7Ci0JfQotCi0JLyoqCi0JICogVXNpbmcgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCB0aGUgYXJndW1lbnRzKSBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuCi0JICogRXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGlmIGFyZ3VtZW50cyBkb24ndCBtYXRjaCB0aGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoSUJlYW5Qcm94eVtdIGNyZWF0aW9uQXJndW1lbnRzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJUkVNTWV0aG9kUHJveHkgbmV3SW5zdGFuY2VNZXRob2QgPQotCQkJKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRDb25zdHJ1Y3Rvck5ld0luc3RhbmNlKCk7Ci0KLQkJLy8gQ29uc3RydWN0b3IubmV3SW5zdGFuY2UgdGFrZXMgb25lIHBhcm0gKE9iamVjdFtdKSB3aGVyZSBbMF0gaXMgYW4gT2JqZWN0W10gb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IuCi0JCU9iamVjdFtdIHBhcm1zID0gbnVsbDsKLQkJaWYgKGNyZWF0aW9uQXJndW1lbnRzICE9IG51bGwpCi0JCQlwYXJtcyA9IG5ldyBPYmplY3RbXSB7IG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5PQkpFQ1RfQ0xBU1MsIGNyZWF0aW9uQXJndW1lbnRzKX07Ci0KLQkJcmV0dXJuIG5ld0luc3RhbmNlTWV0aG9kLmludm9rZVdpdGhQYXJtcyh0aGlzLCBwYXJtcyk7Ci0JfQotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKCkgewotCQl0cnkgewotCQkJcmV0dXJuIG5ld0luc3RhbmNlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZGYWN0b3J5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIG5ld0luc3RhbmNlKGFyZ3MpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQmVhblR5cGVQcm94eVtdIGZQYXJhbWV0ZXJUeXBlczsKLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uc3RydWN0b3JQcm94eSNnZXRQYXJhbWV0ZXJUeXBlcygpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJQmVhblR5cGVQcm94eVtdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCQlpZiAoZlBhcmFtZXRlclR5cGVzID09IG51bGwpIHsKLQkJCUlBcnJheUJlYW5Qcm94eSBwYXJtVHlwZXMgPSAoSUFycmF5QmVhblByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpCi0JCQkJCS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzKTsKLQkJCWlmIChwYXJtVHlwZXMgPT0gbnVsbCkKLQkJCQlmUGFyYW1ldGVyVHlwZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbMF07IC8vIFRoZXJlIHdhcyBzb21lIGVycm9yLCBvbmx5IHdheSBudWxsIGlzIHJldHVybmVkCi0JCQllbHNlIHsKLQkJCQlpbnQgbGVuID0gcGFybVR5cGVzLmdldExlbmd0aCgpOwotCQkJCWZQYXJhbWV0ZXJUeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVtsZW5dOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJCXRyeSB7Ci0JCQkJCQlmUGFyYW1ldGVyVHlwZXNbaV0gPSAoSUJlYW5UeXBlUHJveHkpIHBhcm1UeXBlcy5nZXQoaSk7Ci0JCQkJCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCQkJfQotCQkJCWZGYWN0b3J5LnJlbGVhc2VQcm94eShwYXJtVHlwZXMpOyAvLyBEb24ndCBuZWVkIHRoZSBhcnJheSBvbiB0aGUgc2VydmVyIGFueW1vcmUuCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZlBhcmFtZXRlclR5cGVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlYTc4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUNvbnN0cnVjdG9yVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Db25zdHJ1Y3RvclR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogQmVhblR5cGUgUHJveHkgZm9yIE1ldGhvZCBjbGFzcy4KLSAqLwotCi1maW5hbCBjbGFzcyBSRU1Db25zdHJ1Y3RvclR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB7Ci0KLVJFTUNvbnN0cnVjdG9yVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgYWNjZXNzaWJsZVR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQ09OU1RSVUNUT1JfQ0xBU1MpLCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5jbGFzcy5nZXROYW1lKCksIGFjY2Vzc2libGVUeXBlUHJveHkpOwotfQotCi0vKioKLSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0gKgotICogRm9yIGFsbCBvZiB0aGUgYWNjZXNzaWJsZSBvYmplY3QgdHlwZXMsIHRoZXkgYXJlIGZpbmFsIGNsYXNzZXMsIHNvIHlvdSBjYW4ndCBjcmVhdGUgYSBuZXdCZWFuVHlwZSAKLSAqIGZvciBzdWJjbGFzc2VzLgotICovCi1wdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBTcGVjaWFsaXplZCBmcm9tIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB0byBlbnN1cmUgQ29uc3RydWN0b3IgcHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JcmV0dXJuIG5ldyBSRU1Db25zdHJ1Y3RvclByb3h5KGZSZWdpc3RyeSwgb2JqZWN0SUQpOwotfQotCi0vKioKLSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgQ29uc3RydWN0b3IgYXJlIG5ldmVyIGRvbmUgdGhyb3VnaCBhIGRlZmF1bHQgY3RvciwKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7IAotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIE5vdGU6IFNpbmNlIG5ldyBpbnN0YW5jZXMgb2YgQ29uc3RydWN0b3IgYXJlIG5ldmVyIGRvbmUgdGhyb3VnaCBhbiBpbml0aWFsaXphdGlvbiBzdHJpbmcsCi0gKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgewotCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotfQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRG91YmxlQ2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRG91YmxlQ2xhc3NCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjZjI5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Eb3VibGVDbGFzc0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIFByb3h5IGZvciBEb3VibGUuY2xhc3MuCi0gKi8KLWNsYXNzIFJFTURvdWJsZUNsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNRG91YmxlQ2xhc3NCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBEb3VibGUgYURvdWJsZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYURvdWJsZSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmRvdWJsZUNsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldCgoRG91YmxlKSBudW1iZXJWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkYWVlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgZm9yIERvdWJsZS5jbGFzcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTURvdWJsZUNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotLyoqCi0gKiBSRU1JbnRlZ2VyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuRE9VQkxFX0NMQVNTKSwgRG91YmxlLmNsYXNzLmdldE5hbWUoKSwgbnVtYmVyVHlwZSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTURvdWJsZUNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IERvdWJsZSgwRCkpOwkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlRG91YmxlQmVhblByb3h5KERvdWJsZSBhRG91YmxlKSB7Ci0JcmV0dXJuIChhRG91YmxlLmRvdWJsZVZhbHVlKCkgIT0gMEQpID8KLQkJbmV3IFJFTURvdWJsZUNsYXNzQmVhblByb3h5KGZSZWdpc3RyeSwgYURvdWJsZSkgOiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogR2VuZXJpYyB3YXkgdG8gY3JlYXRlIGFuIERvdWJsZSBwcm94eSwgaG93ZXZlciwgdGhlIE51bWJlciBtdXN0IGJlIGEgRG91YmxlLgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlRG91YmxlQmVhblByb3h5KChEb3VibGUpIGFOdW1iZXIpOwotfQkKLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIE51bWJlcidzIGRvbid0IGhhdmUgYSBkZWZhdWx0IGN0b3IsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVybyBwcm94eSBmb3IgdGhpcyBjYXNlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZURvdWJsZUJlYW5Qcm94eShuZXcgRG91YmxlKHZhbHVlLmFEb3VibGUpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRG91YmxlVHlwZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGY1MjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRG91YmxlVHlwZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTURvdWJsZVR5cGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyUHJveHkgZm9yIHRoZSBwcmltaXRpdmUgImRvdWJsZSIuCi0gKiBJdCBjYW4gYW5zd2VyIGFsbCBvZiB0aGUgcHJpbWl0aXZlIG51bWJlciB0eXBlcyAoaW50LCBsb25nLCBzaG9ydCwgYnl0ZSwgZG91YmxlLCBmbG9hdCkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1jbGFzcyBSRU1Eb3VibGVUeXBlQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJTnVtYmVyQmVhblByb3h5IHsKLQlwcml2YXRlIGZpbmFsIGRvdWJsZSBmRG91YmxlOwotCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNRG91YmxlVHlwZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIGRvdWJsZSBhRG91YmxlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmRG91YmxlID0gYURvdWJsZTsKLX0KLQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTURvdWJsZVR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmRG91YmxlID09ICgoUkVNRG91YmxlVHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLmRvdWJsZVZhbHVlKCk7Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgRG91YmxlKQotCQlyZXR1cm4gZkRvdWJsZSA9PSAoKERvdWJsZSkgYW5PYmplY3QpLmRvdWJsZVZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTURvdWJsZVR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmRG91YmxlID09ICgoUkVNRG91YmxlVHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuZG91YmxlVmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIChieXRlKSBmRG91YmxlOwotfQotLyoqCi0gKiBkb3VibGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gZkRvdWJsZTsKLX0KLS8qKgotICogZmxvYXRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JcmV0dXJuIChmbG9hdCkgZkRvdWJsZTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gKGludCkgZkRvdWJsZTsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIChsb25nKSBmRG91YmxlOwotfQotLyoqCi0gKiBudW1iZXJWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE51bWJlciBudW1iZXJWYWx1ZSgpIHsKLQlyZXR1cm4gbmV3IERvdWJsZShmRG91YmxlKTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIChzaG9ydCkgZkRvdWJsZTsKLX0KLQotLyoqCi0gKiBUaGUgYmVhbidzIHRvU3RyaW5nLgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZkRvdWJsZSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmRvdWJsZVR5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZEb3VibGUpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRG91YmxlVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRG91YmxlVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhODNmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Eb3VibGVUeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBEb3VibGUuVFlQRQotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNRG91YmxlVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1Eb3VibGVUeXBlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkRPVUJMRV9UWVBFKSwgRG91YmxlLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNRG91YmxlVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDBEKTsJCQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVEb3VibGVCZWFuUHJveHkoZG91YmxlIGFEb3VibGUpIHsKLQlyZXR1cm4gKGFEb3VibGUgIT0gMEQpID8KLQkJbmV3IFJFTURvdWJsZVR5cGVCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhRG91YmxlKSA6IHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIGRvdWJsZSBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0JCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZURvdWJsZUJlYW5Qcm94eSh2YWx1ZS5hRG91YmxlKTsKLX0KLQotLyoqCi0gKiBTaG9ydCBjdXQgZm9yIG5ld0luc3RhbmNlIHdoZXJlIHRoZSBzdHJpbmcgZm9sbG93cyB0aGUKLSAqIHNwZWNpZmljIHBhdHRlcm4gd2UgZXhwZWN0LiBUaGF0IHdheSBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2hpcCBvdmVyIHRvIHRoZSB2bSAKLSAqIHRvIHByb2Nlc3MgaXQuCi0gKgotICogVGhlIHBhdHRlcm4gaXQgY2FuIGFjY2VwdCBpczoKLSAqIAkxKSAoZG91YmxlKSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChkb3VibGUpIGV4cGxpY2l0bHkgY2FzdHMgaXQgZG93bi4KLSAqCTIpIHZhbGlkTnVtYmVyCi0gKiBJdCB3aWxsIHVzZSB0aGUgZGVjb2RlIGZ1bmN0aW9uIG9mIGRvdWJsZSB0byBkZXRlcm1pbmUgdGhlIHZhbGlkIG51bWJlci4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JU3RyaW5nIHRyaW0gPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJCi0JZG91YmxlIGFEb3VibGU7Ci0JaWYgKHRyaW0uc3RhcnRzV2l0aCgiKGRvdWJsZSkiKSkgeyAvLyROT04tTkxTLTEkCi0JCU51bWJlciB2ID0gcGFyc2VTdHJpbmcodHJpbS5zdWJzdHJpbmcoIihkb3VibGUpIi5sZW5ndGgoKSkudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodiAhPSBudWxsKQotCQkJYURvdWJsZSA9IHYuZG91YmxlVmFsdWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlhRG91YmxlID0gRG91YmxlLnZhbHVlT2YoaW5pdGlhbGl6YXRpb25TdHJpbmcpLmRvdWJsZVZhbHVlKCk7CS8vIFNlZSBpZiB2YWxpZCBkb3VibGUgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYURvdWJsZSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1FeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyYjk0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUkVNRXhwcmVzc2lvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xOSAkICAkRGF0ZTogMjAwNS8wOS8wNyAxNDowNjowOCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kcy5WYWx1ZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLSAKLS8qKgotICogVGhlIFJlbW90ZSBwcm94eSB2ZXJzaW9uIG9mIEV4cHJlc3Npb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUkVNRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewotCi0JcHJpdmF0ZSBJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkOwkvLyBBcmUgd2UgY2xvc2VkLgotCQotCXByb3RlY3RlZCBDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXJWYWx1ZTsJLy8gQSB3b3JrZXIgb2JqZWN0IHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGNyZWF0aW5nIG9uZSBhbmQgdGhyb3dpbmcgaXQgYXdheS4KLQkKLQlwcm90ZWN0ZWQgTWFwIGJlYW5UeXBlQ2FjaGU7CS8vIFVzZSB0byBjYWNoZSBwZW5kaW5nIEJlYW5UeXBlcy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFJFTVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5LgotCXByb3RlY3RlZCBNYXAgbWV0aG9kc0NhY2hlOwkvLyBVc2UgdG8gY2FjaGUgcGVuZGluZyBleHByZXNzaW9uIG1ldGhvZCBwcm94aWVzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUkVNUHJveHlDb25zYW50cy4KLQlwcm90ZWN0ZWQgTWFwIGZpZWxkc0NhY2hlOwkvLyBVc2UgdG8gY2FjaGUgcGVuZGluZyBleHByZXNzaW9uIGZpZWxkIHByb3hpZXMuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBSRU1Qcm94eUNvbnNhbnRzLgotCQotCS8qCi0JICogVGhpcyBpcyB2ZXJ5IHNwZWNpYWwgbGlzdC4gSXQgdHJpZXMgdG8gZWxpbWluYXRlIHVubmVlZGVkIHRyYWZmaWMuIEZvciBleGFtcGxlIGEgbWFyayBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbiBlbmRtYXJrIGRvZXMKLQkgKiBub3QgbmVlZCB0byBiZSBzZW50LiBNYW55IGV4cHJlc3Npb25zIGNhbiBsb29rIGxpa2U6IG1hcmssIGVuZG1hcmssIGVuZHRyYW5zYWN0aW9uLiBUaGlzIGlzIGEgZG8gbm90aGluZyBhbmQgd2UgZG9uJ3Qgd2FudAotCSAqIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gdG8ganVzdCBzZW5kIHRoaXMuIFNvIHRoaXMgbGlzdCBpcyB1c2VkIHRvIHF1ZXVlIHVwIHRoZXNlIGFuZCByZW1vdmUgdGhlbSB0b28gd2hlbiBmb3VuZCBhcyBub3QgbmVlZGVkLgotCSAqIAotCSAqICBIb3dldmVyLCB0aGlzIGlzIHZlcnkgdHJpY2t5IGJlY2F1c2UgYWxsIHB1c2hUb1Byb3h5IHRyYW5zYWN0aW9ucyB0aGF0IGFjdHVhbGx5IGRvIHNvbWV0aGluZyBNVVNUIGNhbGwgdGhlIHByb2Nlc3NQZW5kaW5nKCkgbWV0aG9kIAotCSAqICBmaXJzdCB0byBtYWtlIHN1cmUgYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zIGFyZSBzdWJtaXR0ZWQuIEJlY2F1c2Ugb25jZSBhIHJlYWwgdHlwZSB0cmFuc2FjdGlvbiwgc3VjaCBhcyBhc3NpZ25tZW50IG9jY3VycywgYW55Ci0JICogIHBlbmRpbmcgdHJhbnNhY3Rpb24gaXMgYSB2YWxpZCB0cmFuc2FjdGlvbiwgYW5kIG5vIGxvbmdlciBhIGRvLW5vdGhpbmcgdHJhbnNhY3Rpb24uCi0JICogIAotCSAqICBFYWNoIHRyYW5zYWN0aW9uIHR5cGUgdXNlcyBhIHN1YmNsYXNzIG9mIFBlbmRpbmdUcmFuc2FjdGlvbiB0byBiZSBhbiBlbnRyeSBvbiB0aGUgbGlzdC4KLQkgKiAgCi0JICogIFRoZSBwZW5kaW5ncyBjdXJyZW50bHkgc3VwcG9ydGVkIGFyZToKLQkgKiAgbWFyay9lbmRtYXJrCi0JICogIHRyeS9jYXRjaC9lbmR0cnkKLQkgKiAgYmxvY2svZW5kYmxvY2sKLQkgKiAgCi0JICogIFNlZSBlYWNoIGluZGl2aWR1YWwgdHJhbnNhY3Rpb24gdHlwZSB0byBzZWUgaG93IGl0IGlzIGhhbmRsZWQuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgcGVuZGluZ1RyYW5zYWN0aW9uczsKLQkKLQkvKioKLQkgKiBQZW5kaW5nVHJhbnNhY3Rpb24gZW50cnkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQZW5kaW5nVHJhbnNhY3Rpb24gewotCQkKLQkJLyoqCi0JCSAqIFRoZSB0cmFuc2FjdGlvbiBpcyBub3cgYmVpbmcgcHVzaGVkLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkCi0JCSAqIGFjdHVhbGx5IGRvIHRoZSBwdXNoLgotCQkgKiAKLQkJICogQHBhcmFtIHJlbUV4cHJlc3Npb24gVGhlIFJFTUV4cHJlc3Npb24gZm9yIHRoaXMgdHJhbnNhY3Rpb24uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1c2hUcmFuc2FjdGlvbihSRU1FeHByZXNzaW9uIHJlbUV4cHJlc3Npb24pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUkVNRXhwcmVzc2lvbihSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlzdXBlcihyZWdpc3RyeSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBpZCBmb3IgdGhpcyBSRU1FeHByZXNzaW9uLiBUaGlzIGlkIGlzIHVzZWQgb24gdGhlIHJlbW90ZSB2bSB0bwotCSAqIGlkZW50aWZ5IHdobyB0aGUgcmVxdWVzdCBpcyBmb3IuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0UkVNRXhwcmVzc2lvbklEKCkgewotCQlyZXR1cm4gdGhpcy5oYXNoQ29kZSgpOwotCX0KLQkvKioKLQkgKiBHZXQgdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGxpc3QuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFBlbmRpbmdUcmFuc2FjdGlvbnMoKSB7Ci0JCWlmIChwZW5kaW5nVHJhbnNhY3Rpb25zID09IG51bGwpCi0JCQlwZW5kaW5nVHJhbnNhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcGVuZGluZ1RyYW5zYWN0aW9uczsKLQl9Ci0JCi0JLy8gVXNlIHRoaXMgZmxhZyB3aGVuIGRlYnVnZ2luZyB0byB0ZXN0IGlmIGVycm9ycyBhcmUgZHVlIHRvIGltcHJvcGVyIHBlbmRpbmcgcHJvY2Vzc2luZy4KLQkvLyBJZiB0cnVlIHRoZXkgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIG5vdCBwZW5kaW5nIGFuZCB3aWxsIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhFQ1VURV9QRU5ESU5HX0lNTUVESUFURUxZID0gZmFsc2U7Ci0JcHJvdGVjdGVkIHZvaWQgYWRkUGVuZGluZ1RyYW5zYWN0aW9uKFBlbmRpbmdUcmFuc2FjdGlvbiBwZW5kaW5nKSB7Ci0JCWlmICghRVhFQ1VURV9QRU5ESU5HX0lNTUVESUFURUxZKQotCQkJZ2V0UGVuZGluZ1RyYW5zYWN0aW9ucygpLmFkZChwZW5kaW5nKTsKLQkJZWxzZQotCQkJcGVuZGluZy5wdXNoVHJhbnNhY3Rpb24odGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNlbnREYXRhOwkvLyBGbGFnIHRvIGluZGljYXRlIGlmIHdlIGhhdmUgc2VudCBhbnl0aGluZyB5ZXQgdG8gdGhlIHJlbW90ZSB2bS4gVGhpcyBpcyB1c2VkIGZvciB0aGUgcGVuZGluZyBvcHRpbWl6YXRpb25zLgotCQotCS8qKgotCSAqIEhhdmUgd2Ugc2VudCBhbnkgZGF0YSBpbiB0aGlzIHRyYW5zYWN0aW9uIHlldC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGF2ZVNlbnREYXRhKCkgewotCQlyZXR1cm4gc2VudERhdGE7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29ubmVjdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7Ci0JCWlmIChjb25uZWN0aW9uID09IG51bGwpIHsKLQkJCWlmICghc2VudERhdGEpCi0JCQkJZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpLnN0YXJ0VHJhbnNhY3Rpb24oKTsJLy8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBzZW5kIGRhdGEsIHNvIHN0YXJ0IHRyYW5zYWN0aW9uLgotCQkJCi0JCQlzZW50RGF0YSA9IHRydWU7CS8vIElmIHdlIGFyZSBnZXR0aW5nIGEgdHJhbnNhY3Rpb24sIHRoYXQgbWVhbnMgd2UgYXJlIHNlbmRpbmcgZGF0YS4KLQkJCWNvbm5lY3Rpb24gPSAoSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uKSBnZXRSRU1SZWdpc3RyeSgpLmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQkvLyBUaGlzIHdpbGwgYWN0dWFsbHkgbm90IGJlIHN0b3BwZWQgdW50aWwgY2xvc2Vwcm94eS4gVGhlcmUgY291bGQgYmUgYSBzbGlnaHQgcHJvYmxlbSBpZiB0aGUgZXhwcmVzc2lvbiBpcyBuZXZlciBjbG9zZWQuCi0JCQkvLyBCdXQgdGhhdCBzaG91bGRuJ3QgaGFwcGVuLiBUaGlzIGlzIHRvIHByZXZlbnQgYW55IHByb3h5IHRoYXQgd2FzIHJlbGVhc2VkIGR1cmluZyB0aGUgZXhlY3V0aW9uIGJ1dCB3YXMgdXNlZCBieQotCQkJLy8gdGhlIGV4cHJlc3Npb24gZnJvbSBiZWluZyByZWxlYXNlZCBvbiB0aGUgcmVtb3RlIHZtIHVudGlsIGFmdGVyIHRoZSBleHByZXNzaW9uIGlzIGZpbmlzaGVkLgotCQkJdHJ5IHsKLQkJCQlpZiAod29ya2VyVmFsdWUgPT0gbnVsbCkKLQkJCQkJd29ya2VyVmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCQlpZiAoZXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgPT0gbnVsbCkgewotCQkJCQlieXRlIHRyYWNlID0gIWlzVHJhY2VTZXQoKSA/IEV4cHJlc3Npb25Db21tYW5kcy5UUkFDRV9ERUZBVUxUIDogKGlzVHJhY2UoKSA/IEV4cHJlc3Npb25Db21tYW5kcy5UUkFDRV9PTiA6IEV4cHJlc3Npb25Db21tYW5kcy5UUkFDRV9PRkYpOyAKLQkJCQkJY29ubmVjdGlvbi5zdGFydEV4cHJlc3Npb25Qcm9jZXNzaW5nKGdldFJFTUV4cHJlc3Npb25JRCgpLCB0cmFjZSk7CS8vIEl0IGlzIGEgbmV3IGV4cHJlc3Npb24uCi0JCQkJfSBlbHNlIHsKLQkJCQkJZmlsbFByb3h5KGV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCWNvbm5lY3Rpb24ucmVzdW1lRXhwcmVzc2lvbihnZXRSRU1FeHByZXNzaW9uSUQoKSwgd29ya2VyVmFsdWUpOwotCQkJCQlleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciA9IG51bGw7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJCWNvbm5lY3Rpb24gPSBudWxsOwotCQkJCX0KLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkKLQkJfQotCQlyZXR1cm4gY29ubmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmFsIElPRXhjZXB0aW9uIG9jY3VycmVkIG1zZy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJT19FWENFUFRJT05fTVNHID0gUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1FeHByZXNzaW9uX0lPRXhjZXB0aW9uU2VlTG9nX0lORk9fOyAKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0VYQ0VQVElPTl9NU0cgPSBQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTUV4cHJlc3Npb25fQ29tbWFuZEV4Y2VwdGlvblNlZUxvZ19JTkZPXzsgCi0JCi0JLyoqCi0JICogVGhyb3cgYW4gYW4gaWxsZWdhbCBzdGF0ZSBleGNlcHRpb24gaWYgc29tZSBnZW5lcmFsIGVycm9yLCBpbiBwYXJ0aWN1bGFyIGFuIEkvTyBvciBDb21tYW5kIEV4Y2VwdGlvbgotCSAqIG9jY3VycmVkIHNvIHRoYXQgY2FsbGVycyBrbm93IHRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZy4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtc2cpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdHJ5IGFzIGEgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJFTVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSByZWdpc3RyeTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBiZWFuIHByb3h5IGZhY3RvcnkgYXMgYSBSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpIHsKLQkJcmV0dXJuIChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGJlYW5Qcm94eUZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMuCi0JICogPHA+Ci0JICogPGI+Tm90ZTogPC9iPkl0IGlzIHJlcXVpcmVkIHRoYXQgYWxsIG5vbi1wZW5kaW5nLXBhcnRpY2lwYXRpbmcgdHJhbnNhY3Rpb25zIG11c3QKLQkgKiBjYWxsIHRoaXMgbWV0aG9kIGZpcnN0IHRvIG1ha2Ugc3VyZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBhcmUgc2VudC4gSWYgdGhpcyBpcwotCSAqIG5vdCBkb25lLCB0aGVyZSB3aWxsIGJlIGVycm9ycyBpbiB0aGUgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpIHsKLQkJaWYgKHBlbmRpbmdUcmFuc2FjdGlvbnMgIT0gbnVsbCAmJiAhcGVuZGluZ1RyYW5zYWN0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZW5kaW5nVHJhbnNhY3Rpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCSgoUGVuZGluZ1RyYW5zYWN0aW9uKSBwZW5kaW5nVHJhbnNhY3Rpb25zLmdldChpKSkucHVzaFRyYW5zYWN0aW9uKHRoaXMpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJcGVuZGluZ1RyYW5zYWN0aW9ucy5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgcGVuZGluZyBlbnRyeSBmcm9tIHRvcC4gSWYgdG9wIGlzIDEsIHRoZW4gZ2V0IHRvcCBlbnRyeSAoaS5lLiBsYXN0IG9uZSBhZGRlZCksIDIgaXMgbmV4dCBvbmUuIAotCSAqIEBwYXJhbSBmcm9tVG9wCi0JICogQHJldHVybiBlbnRyeSByZXF1ZXN0ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggZW50cnkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFBlbmRpbmdUcmFuc2FjdGlvbiBnZXRQZW5kaW5nRW50cnlGcm9tVG9wKGludCBmcm9tVG9wKSB7Ci0JCWlmIChwZW5kaW5nVHJhbnNhY3Rpb25zICE9IG51bGwgJiYgcGVuZGluZ1RyYW5zYWN0aW9ucy5zaXplKCkgPj0gZnJvbVRvcCkgewotCQkJcmV0dXJuIChQZW5kaW5nVHJhbnNhY3Rpb24pIHBlbmRpbmdUcmFuc2FjdGlvbnMuZ2V0KHBlbmRpbmdUcmFuc2FjdGlvbnMuc2l6ZSgpLWZyb21Ub3ApOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBQb3AgdXAgdGhlIHRvcCBlbnRyeSBmcm9tIHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBxdWV1ZS4KLQkgKiBAcGFyYW0gZnJvbVRvcCBob3cgbWFueSBlbnRyaWVzIHRvIHBvcCBmcm9tIHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9uIGxpc3QuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wUGVuZGluZ0VudHJ5KGludCBmcm9tVG9wKSB7Ci0JCWlmIChwZW5kaW5nVHJhbnNhY3Rpb25zICE9IG51bGwpCi0JCQlpZiAocGVuZGluZ1RyYW5zYWN0aW9ucy5zaXplKCkgPiBmcm9tVG9wKSB7Ci0JCQkJd2hpbGUoZnJvbVRvcC0tID4wKQotCQkJCQlwZW5kaW5nVHJhbnNhY3Rpb25zLnJlbW92ZShwZW5kaW5nVHJhbnNhY3Rpb25zLnNpemUoKS0xKTsKLQkJCX0gZWxzZQotCQkJCXBlbmRpbmdUcmFuc2FjdGlvbnMuY2xlYXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRvUHJveHkoSVByb3h5IHByb3h5KSB7Ci0JCWlmIChwcm94eSA9PSBudWxsIHx8IHByb3h5LmlzQmVhblByb3h5KCkpCi0JCQlwdXNoVG9Qcm94eSgoSUJlYW5Qcm94eSkgcHJveHkpOwotCQllbHNlCi0JCQlwdXNoVG9FeHByZXNzaW9uUHJveHkoKEV4cHJlc3Npb25Qcm94eSkgcHJveHkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHVzaFRvUHJveHkoSUJlYW5Qcm94eSBwcm94eSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJVmFsdWVPYmplY3QgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgcHJveHkuCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9UT19QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWlmIChwcm94eSA9PSBudWxsKQotCQkJCXdvcmtlclZhbHVlLnNldCgpOwotCQkJZWxzZQotCQkJCSgoSVJFTUJlYW5Qcm94eSkgcHJveHkpLnJlbmRlckJlYW4od29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI2Nsb3NlUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb3NlUHJveHkoKSB7Ci0JCWlmICghY2xvc2VkKSB7Ci0JCQl0cnkgewotCQkJCWlmIChjb25uZWN0aW9uICE9IG51bGwgJiYgY29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkJY29ubmVjdGlvbi5zdG9wRXhwcmVzc2lvblByb2Nlc3NpbmcoZ2V0UkVNRXhwcmVzc2lvbklEKCkpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuSU5GTyk7Ci0JCQkJCQkvLyBOb3QgdGhyb3dpbmcgYW4gaWxsZWdhbCBzdGF0ZSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSwgb3RoZXIgdGhhbiBsb2dnaW5nIGFuZCBub3QgCi0JCQkJCQkvLyByZXR1cm5pbmcgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlZ2lzdHJ5IHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIG9uIGNsb3NlLgotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJZ2V0UkVNUmVnaXN0cnkoKS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3Rpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQljbG9zZWQgPSB0cnVlOwotCQkJCWlmIChzZW50RGF0YSkKLQkJCQkJZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpLnN0b3BUcmFuc2FjdGlvbigpOwkvLyBSZXN1bWUgcHJveHkgcmVsZWFzZXMuIFdlJ3ZlIHNlbnQgZGF0YSBhdCBsZWFzdCBvbmNlLgotCQkJfQotCQl9Ci0JCW1ldGhvZHNDYWNoZSA9IG51bGw7Ci0JCWZpZWxkc0NhY2hlID0gbnVsbDsKLQkJYmVhblR5cGVDYWNoZSA9IG51bGw7Ci0JCXBlbmRpbmdUcmFuc2FjdGlvbnMgPSBudWxsOwotCQljb25uZWN0aW9uID0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFZPSURUWVBFID0gbmV3IE9iamVjdCgpOwkvLyBBIHZvaWQgdHlwZSB3YXMgc2VudCBpbiBleHByZXNzaW9uIHByb3h5IHJlc29sdXRpb24uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IE5PVFJFU09MVkVEID0gbmV3IE9iamVjdCgpOwkvLyBBIG5vdCByZXNvbHZlZCB0eXBlIHdhcyBzZW50IGluIGV4cHJlc3Npb24gcHJveHkgcmVzb2x1dGlvbi4KLQkKLQkvKgotCSAqIEdldCB0aGUgc2VuZGVyIHRvIHVzZSBmb3IgcHVsbGluZyB0aGUgZXhwcmVzc2lvbiBwcm94eSByZXNvbHV0aW9ucy4KLQkgKi8KLQlwcml2YXRlIEJlYW5Qcm94eVZhbHVlU2VuZGVyIGdldEV4cHJlc3Npb25Qcm94aWVzU2VuZGVyKCkgewotCQlyZXR1cm4gbmV3IEJlYW5Qcm94eVZhbHVlU2VuZGVyKGdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKSkgewotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuQmVhblByb3h5VmFsdWVTZW5kZXIjc2VuZFZhbHVlKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzZW5kVmFsdWUoVmFsdWVPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuZ2V0VHlwZSgpID09IENvbW1hbmRzLkZMQUcpIHsKLQkJCQkJc3dpdGNoICh2YWx1ZS5hbkludCkgewotCQkJCQkJY2FzZSBFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlBST1hZX05PVFJFU09MVkVEOgotCQkJCQkJCWFycmF5W2luZGV4KytdID0gTk9UUkVTT0xWRUQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OUFJPWFlfVk9JRFRZUEU6Ci0JCQkJCQkJYXJyYXlbaW5kZXgrK10gPSBWT0lEVFlQRTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJLy8gU2hvdWxkbid0IGhhcHBlbi4KLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlzdXBlci5zZW5kVmFsdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkJCi0JLyoKLQkgKiBQcm9jZXNzIHRoZSBwdWxsZWQgZXhwcmVzc2lvbiBwcm94eSByZXNvbHV0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc3B1bGxlZEV4cHJlc3Npb25Qcm94aWVzKExpc3QgZXhwcmVzc2lvblByb3hpZXMsIEJlYW5Qcm94eVZhbHVlU2VuZGVyIHNlbmRlcikgewotCi0JCS8vIEl0IGlzIGV4cGVjdGVkIHRoYXQgZWFjaCBlbnRyeSB3aWxsIGNvb3Jlc3BvbmQgdG8gdGhlIG5leHQgbm9uLW51bGwgZXhwcmVzc2lvbiBwcm94eSBhbmQgd2lsbCBiZSB0aGUgYmVhbiBwcm94eSBvciBvbmUgb2YgdGhlIHNwZWNpYWwKLQkJLy8gdHlwZXMuCi0JCWludCBsZW4gPSBleHByZXNzaW9uUHJveGllcy5zaXplKCk7Ci0JCWludCBqID0gMDsKLQkJT2JqZWN0W10gcmVzb2x2ZWRzID0gc2VuZGVyLmdldEFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCUV4cHJlc3Npb25Qcm94eSBlcCA9IChFeHByZXNzaW9uUHJveHkpIGV4cHJlc3Npb25Qcm94aWVzLmdldChpKTsKLQkJCWlmIChlcCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHJlc29sdmVkID0gcmVzb2x2ZWRzW2orK107Ci0JCQkJaWYgKHJlc29sdmVkID09IE5PVFJFU09MVkVEKQotCQkJCQlmaXJlUHJveHlOb3RSZXNvbHZlZChlcCk7Ci0JCQkJZWxzZSBpZiAocmVzb2x2ZWQgPT0gVk9JRFRZUEUpCi0JCQkJCWZpcmVQcm94eVZvaWQoZXApOwotCQkJCWVsc2UKLQkJCQkJZmlyZVByb3h5UmVzb2x2ZWQoZXAsIChJQmVhblByb3h5KSByZXNvbHZlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVsbFByb3h5VmFsdWUoaW50LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUJlYW5Qcm94eSBwdWxsUHJveHlWYWx1ZShpbnQgcHJveHljb3VudCwgTGlzdCBleHByZXNzaW9uUHJveGllcykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCWlmICghaGF2ZVNlbnREYXRhKCkpIHsKLQkJCW1hcmtBbGxQcm94aWVzTm90UmVzb2x2ZWQoZXhwcmVzc2lvblByb3hpZXMpOwotCQkJcmV0dXJuIG51bGw7CS8vIFdlIGhhdmVuJ3QgcHVzaGVkIGFueSBjb21tYW5kcywgc28gdGhlcmUgaXMgbm90aGluZyB0byBkby4gRG9uJ3QgY3JlYXRlIGEgY29ubmVjdGlvbiBmb3IgdGhpcy4KLQkJfQotCQkvLyBJZiB0aGVyZSBhcmUgYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zIGF0IHRoaXMgcG9pbnQgaW4gdGltZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIHRoZW0uIFRoZXkgd291bGQgYmUgZG8gbm90aGluZ3MgYW55d2F5LgotCQkKLQkJYm9vbGVhbiBwcm9jZXNzZWRFeHByZXNzaW9uUHJveGllcyA9IGZhbHNlOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gbGNsQ29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJbWFya0luVHJhbnNhY3Rpb24obGNsQ29ubmVjdGlvbik7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcyA9IG51bGw7Ci0JCQlCZWFuUHJveHlWYWx1ZVNlbmRlciBzZW5kZXIgPSBudWxsOwotCQkJaWYgKHByb3h5Y291bnQgPiAwKSB7Ci0JCQkJcHJveHlpZHMgPSBjcmVhdGVFeHByZXNzaW9uUHJveGllc1ZhbHVlT2JqZWN0KHByb3h5Y291bnQsIGV4cHJlc3Npb25Qcm94aWVzKTsKLQkJCQlzZW5kZXIgPSBnZXRFeHByZXNzaW9uUHJveGllc1NlbmRlcigpOwotCQkJfQotCQkJCi0JCQlsY2xDb25uZWN0aW9uLnB1bGxWYWx1ZShnZXRSRU1FeHByZXNzaW9uSUQoKSwgcHJveHlpZHMsIHNlbmRlcik7Ci0JCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIsIHRoZW4gaWYgdGhlcmUgYXJlIHByb3hpZXMsIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGVzZSB0b28uCi0JCQlpZiAocHJveHljb3VudCA+IDApCi0JCQkJcHJvY2Vzc3B1bGxlZEV4cHJlc3Npb25Qcm94aWVzKGV4cHJlc3Npb25Qcm94aWVzLCBzZW5kZXIpOwotCQkJcHJvY2Vzc2VkRXhwcmVzc2lvblByb3hpZXMgPXRydWU7Ci0JCQlsY2xDb25uZWN0aW9uLmdldEZpbmFsVmFsdWUod29ya2VyVmFsdWUpOwkvLyBHZXQgdGhlIHJldHVybmVkIHZhbHVlLgotCQkJcmV0dXJuIGdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKS5nZXRCZWFuUHJveHkod29ya2VyVmFsdWUpOwotCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZS5nZXRFcnJvckNvZGUoKSA9PSBFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTl9OT0VYUFJFU1NJT05WQUxVRV9FWENFUFRJT04pIHsKLQkJCQkJLy8gTmVlZCB0byB0dXJuIGl0IGludG8gYSBUaHJvd2FibGUuCi0JCQkJCVRocm93YWJsZVByb3h5IHQgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpLmdldEJlYW5Qcm94eShlLmdldFZhbHVlKCkpOwkvLyBUaGlzIHdpbGwgY2F1c2UgYSB0aHJvdyB0byBvY2N1ciwgYnV0IHdlIGRvbid0IHdhbnQgaXQgZ29pbmcgb3V0LCB3ZSB3YW50IHRvIGNhcHR1cmUgaXQuCi0JCQkJCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUxKSB7Ci0JCQkJCQl0ID0gZTE7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgbmV3IFJFTU5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKHQpOwotCQkJCX0KLQkJCQlnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOwotCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlMSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCWxjbENvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCQl9CQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWxjbENvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9IGZpbmFsbHkgewotCQkJbWFya0VuZFRyYW5zYWN0aW9uKGxjbENvbm5lY3Rpb24pOwotCQkJaWYgKCFwcm9jZXNzZWRFeHByZXNzaW9uUHJveGllcykKLQkJCQltYXJrQWxsUHJveGllc05vdFJlc29sdmVkKGV4cHJlc3Npb25Qcm94aWVzKTsJLy8gV2UgZmFpbGVkIGJlZm9yZSB3ZSBjb3VsZCBwcm9jZXNzIHRoZSBleHByZXNzaW9uIHByb3hpZXMuIFNvIG1hcmsgYWxsIGFzIG5vdCByZXNvbHZlZC4KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgYnkgY29tbWFuZHMgdGhhdCB3cml0ZSBzb21lIGRhdGEgYW5kIHdpbGwgYmUgcmVhZGluZyBkYXRhIGJhY2sgaW1tZWRpYXRlbHkgCi0JICogKGkuZS4gcHVsbCB2YWx1ZSBhbmQgaW52b2tlIGV4cHJlc3Npb24pLiBJZiB3ZSBhcmUgb24gYSBjYWxsYmFjayB0aHJlYWQgYW5kIGhhdmUgdGhlIAotCSAqIHVzZWQgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY2FsbGJhY2sgdGhyZWFkLCB3ZSBuZWVkIHRvIHRlbGwgdGhlIGNhbGxiYWNrIHRocmVhZCB0aGF0Ci0JICogaXQgaXMgaW4gYSB0cmFuc2FjdGlvbi4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3aGlsZSByZWFkaW5nIGRhdGEgYmFjayB0aGVyZSBhcmUKLQkgKiBzb21ldGltZXMgY2FsbHMgYmFjayB0byB0aGUgdm0gdG8gZ2V0IGJlYW50eXBlIGRhdGEgZm9yIG5ldyBjbGFzc2VzLiBUaGlzIHdvdWxkIAotCSAqIG5vcm1hbGx5IGJlIHRocm91Z2ggYSBuZXcgY29ubmVjdGlvbiBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHN0dWNrIGluIHRoZSBtaWRkbGUgb2YgdGhlCi0JICogZGF0YSBiZWluZyBzZW50IGJhY2suIEJ1dCB3aGVuIHJ1bm5pbmcgb24gYSBjYWxsYmFjayB0aGUgc2FtZSBjb25uZWN0aW9uIGlzIHVzZWQuIFNvIGl0Ci0JICogd291bGQgc3RpY2sgZGF0YSBpbiB0aGUgbWlkZGxlIG9mIHRoZSByZXR1cm4gc3RyZWFtIG9mIGRhdGEuIFRvIHByZXZlbnQgdGhpcyB3ZSBuZWVkCi0JICogdG8gdGVsbCB0aGUgY2FsbGJhY2sgdGhyZWFkIHRoYXQgaXQgaXMgaW4gYSB0cmFuc2FjdGlvbiBkdXJpbmcgdGhpcyBjYWxsIHNvIHRoYXQgYW55Ci0JICogc3VjaCBuZXcgY29ubmVjdGlvbiByZXF1ZXN0cyB3aWxsIGdldCBhIG5ldyBjb25uZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IG5lc3RhYmxlIChpLmUuIHRoZSBmaXJzdCBtYXJrRW5kVHJhbnNhY3Rpb24gd2lsbCBzZXQgaXQgZmFsc2UsIGV2ZW4gaWYgc2V2ZXJhbCBuZXN0ZWQKLQkgKiBtYXJrSW5UcmFuc2FjdGlvbnMgYXJlIGNhbGxlZCkuCi0JICogPHA+Ci0JICogbWFya0VuZFRyYW5zYWN0aW9uIG11c3QgYmUgY2FsbGVkIGluIEFMTCBjYXNlcywgc3VjaCB1c2UgdHJ5L2ZpbmFsbHkuCi0JICogQHBhcmFtIHJlbUNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdG8gc2VlIGNoZWNrIGFnYWluc3QgYW5kIG1hcmsgaW4gdHJhbnNhY3Rpb24gZm9yLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hcmtJblRyYW5zYWN0aW9uKElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiByZW1Db25uZWN0aW9uKSB7Ci0JCVRocmVhZCB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQlpZiAodGhyZWFkIGluc3RhbmNlb2YgUkVNQ2FsbGJhY2tUaHJlYWQpIHsKLQkJCS8vIFdlIGFyZSBpbiBhIGNhbGxiYWNrLCBhbmQgdGhlIGNhbGxiYWNrIGNvbm5lY3Rpb24gaXMgb3VyIGNvbm5lY3Rpb24sIHRlbGwgdGhlIGNhbGxiYWNrIHRoYXQgaXQgaXMgaW4gdHJhbnNhY3Rpb24uCi0JCQlSRU1DYWxsYmFja1RocmVhZCBjYWxsYmFja1RocmVhZCA9IChSRU1DYWxsYmFja1RocmVhZCkgdGhyZWFkOwotCQkJaWYgKGNhbGxiYWNrVGhyZWFkLmdldENvbm5lY3Rpb24oKSA9PSByZW1Db25uZWN0aW9uKSB7Ci0JCQkJY2FsbGJhY2tUaHJlYWQuc2V0SW50cmFuc2FjdGlvbih0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNYXJrIGVuZCBvZiB0cmFuc2FjdGlvbi4KLQkgKiBAcGFyYW0gcmVtQ29ubiBSRU1Db25uZWN0aW9uIHRvIHRlc3QgYW5kIG1hcmsgbm90IGluIGNvbm5lY3Rpb24gZm9yLgotCSAqIAotCSAqIEBzZWUgUkVNRXhwcmVzc2lvbiNtYXJrSW5UcmFuc2FjdGlvbihJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24pCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFya0VuZFRyYW5zYWN0aW9uKElSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiByZW1Db25uKSB7Ci0JCVRocmVhZCB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQlpZiAodGhyZWFkIGluc3RhbmNlb2YgUkVNQ2FsbGJhY2tUaHJlYWQpIHsKLQkJCS8vIFdlIGFyZSBpbiBhIGNhbGxiYWNrLCBhbmQgdGhlIGNhbGxiYWNrIGNvbm5lY3Rpb24gaXMgb3VyIGNvbm5lY3Rpb24sIHRlbGwgdGhlIGNhbGxiYWNrIHRoYXQgaXQgaXMgaW4gdHJhbnNhY3Rpb24uCi0JCQlSRU1DYWxsYmFja1RocmVhZCBjYWxsYmFja1RocmVhZCA9IChSRU1DYWxsYmFja1RocmVhZCkgdGhyZWFkOwotCQkJaWYgKGNhbGxiYWNrVGhyZWFkLmdldENvbm5lY3Rpb24oKSA9PSByZW1Db25uKSB7Ci0JCQkJY2FsbGJhY2tUaHJlYWQuc2V0SW50cmFuc2FjdGlvbihmYWxzZSk7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleHByZXNzaW9uUHJveGllcwotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgQ29tbWFuZHMuVmFsdWVPYmplY3QgY3JlYXRlRXhwcmVzc2lvblByb3hpZXNWYWx1ZU9iamVjdChpbnQgYWN0dWFsQ291bnQsIExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHsKLQkJY2xhc3MgRXhwcmVzc2lvblByb3h5UmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCQlJdGVyYXRvciBleHByZXNzaW9uUHJveGllc0l0cjsKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHdvcmtlciA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCi0JCQlwdWJsaWMgRXhwcmVzc2lvblByb3h5UmV0cmlldmVyKExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHsKLQkJCQl0aGlzLmV4cHJlc3Npb25Qcm94aWVzSXRyID0gZXhwcmVzc2lvblByb3hpZXMuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQkJcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5leHRWYWx1ZSgpIHsKLQkJCQl3b3JrZXIuc2V0KC0xKTsKLQkJCQl3aGlsZSAoZXhwcmVzc2lvblByb3hpZXNJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBwYXJtID0gZXhwcmVzc2lvblByb3hpZXNJdHIubmV4dCgpOwotCQkJCQlpZiAocGFybSAhPSBudWxsKSB7Ci0JCQkJCQl3b3JrZXIuc2V0KCgoRXhwcmVzc2lvblByb3h5KSBwYXJtKS5nZXRQcm94eUlEKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCXJldHVybiB3b3JrZXI7Ci0JCQl9Ci0JCX07Ci0KLQkJd29ya2VyVmFsdWUuc2V0QXJyYXlJRFMobmV3IEV4cHJlc3Npb25Qcm94eVJldHJpZXZlcihleHByZXNzaW9uUHJveGllcyksIGFjdHVhbENvdW50LCBDb21tYW5kcy5JTlQpOwotCQlyZXR1cm4gd29ya2VyVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQ2FzdFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENhc3RUb1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBjYXN0IHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBjYXN0IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DQVNUX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJZmlsbFByb3h5KHR5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwkJCQotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHVzaCB0aGUgcHJveHkgYmVhbiB0eXBlIGluIHRoZSBmb3JtYXQgZGVwZW5kaW5nIG9uIGV4cHJlc3Npb24gcHJveHkgb3IgYmVhbnR5cGUgcHJveHkuCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFByb3h5KElQcm94eSB0eXBlLCBDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8JCVZhbHVlT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBpZiBJQmVhblR5cGVQcm94eSBvciBpbnQgKGZvciBleHByZXNzaW9uIHByb3h5IGlkKSBpZiBleHByZXNzaW9uIHByb3h5LgotCQlpZiAodHlwZS5pc0JlYW5Qcm94eSgpKSB7Ci0JCQkoKElSRU1CZWFuUHJveHkpIHR5cGUpLnJlbmRlckJlYW4odmFsdWUpOwotCQl9IGVsc2UgewotCQkJRXhwcmVzc2lvblByb3h5IGVwID0gKEV4cHJlc3Npb25Qcm94eSkgdHlwZTsKLQkJCXZhbHVlLnNldChlcC5nZXRQcm94eUlEKCkpOwotCQl9Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEluc3RhbmNlb2ZUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJbnN0YW5jZW9mVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggaW5zdGFuY2VvZiB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggaW5zdGFuY2VvZiB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJVmFsdWVPYmplY3QgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIHRoZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIGNsYXNzLgotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLklOU1RBTkNFT0ZfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlmaWxsUHJveHkodHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJbmZpeFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbmZpeE9wZXJhdG9yLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEluZml4VG9Qcm94eShJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLCBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUgb3BlcmFuZFR5cGUpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBpbmZpeCB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggaW5maXggdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWJ5dGU6IG9wZXJhdG9yCi0JCQkvLwkJYnl0ZTogb3BlcmFuZFR5cGUKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTkZJWF9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEJ5dGUoKGJ5dGUpIG9wZXJhdG9yLmdldFZhbHVlKCkpOwotCQkJY29ubmVjdGlvbi5wdXNoQnl0ZSgoYnl0ZSkgb3BlcmFuZFR5cGUuZ2V0VmFsdWUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9CQkKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hQcmVmaXhUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuUHJlZml4T3BlcmF0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFByZWZpeFRvUHJveHkoUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBwcmVmaXggdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHByZWZpeCB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJYnl0ZTogb3BlcmF0b3IKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QUkVGSVhfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hCeXRlKChieXRlKSBvcGVyYXRvci5nZXRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hBcnJheUFjY2Vzc1RvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hBcnJheUFjY2Vzc1RvUHJveHkoaW50IGluZGV4Q291bnQpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBhcnJheSBhY2Nlc3MgdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGFycmF5IGFjY2VzIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlpbnQ6IGluZGV4Q291bnQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoaW5kZXhDb3VudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQXJyYXlDcmVhdGlvblRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXJyYXlDcmVhdGlvblRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IGRpbWVuc2lvbkNvdW50KSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggYXJyYXkgY3JlYXRpb24gdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGFycmF5IGNyZWF0aW9uIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlWYWx1ZU9iamVjdCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgdGhlIGV4cHJlc3Npb24gcHJveHkuCi0JCQkvLwkJaW50OiBkaW1lbnNpb24gY291bnQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9DUkVBVElPTl9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWZpbGxQcm94eSh0eXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoZGltZW5zaW9uQ291bnQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXJyYXlJbml0aWFsaXplclRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSwgaW50IHN0cmlwQ291bnQsIGludCBleHByZXNzaW9uQ291bnQpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBhcnJheSBpbml0aWFsaXplciB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggYXJyYXkgaW5pdGlhbGl6ZXIgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCVZhbHVlT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciBleHByZXNzaW9uIHByb3h5LgotCQkJLy8JCWludDogc3RyaXAgY291bnQKLQkJCS8vCQlpbnQ6IGV4cHJlc3Npb24gY291bnQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9JTklUSUFMSVpFUl9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWZpbGxQcm94eSh0eXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoc3RyaXBDb3VudCk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoZXhwcmVzc2lvbkNvdW50KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb25Ub1Byb3h5KElQcm94eUJlYW5UeXBlIHR5cGUsIGludCBhcmd1bWVudENvdW50KSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlWYWx1ZU9iamVjdCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBiZWFuIHR5cGUgcHJveHkgb3IgdGhlIGV4cHJlc3Npb24gcHJveHkKLQkJCS8vCQlpbnQ6IGFyZ3VtZW50IGNvdW50Ci0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlmaWxsUHJveHkodHlwZSwgd29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KGFyZ3VtZW50Q291bnQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUeXBlUmVjZWl2ZXJUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlKQotCSAqLyAKLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHlwZVJlY2VpdmVyVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdHlwZSByZWNlaXZlciB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggdHlwZSByZWNlaXZlciB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJVmFsdWVPYmplY3QgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIHRoZSBleHByZXNzaW9uIHByb3h5LgotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlRZUEVSRUNFSVZFUl9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWZpbGxQcm94eSh0eXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEZpZWxkQWNjZXNzVG9Qcm94eShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hGaWVsZEFjY2Vzc1RvUHJveHkoT2JqZWN0IGZpZWxkLCBib29sZWFuIGhhc1JlY2VpdmVyKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggZmllbGQgYWNjZXNzIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBmaWVsZCBhY2Nlc3MgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCUNvbW1hbmRzLlZhbHVlOiBmaWVsZE5hbWUgb3IgSVByb3h5RmllbGQKLQkJCS8vCQlib29sZWFuOiBoYXNSZWNlaXZlcgotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkZJRUxEX0FDQ0VTU19FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWlmIChmaWVsZCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXdvcmtlclZhbHVlLnNldCgoU3RyaW5nKSBmaWVsZCk7Ci0JCQl9IGVsc2UgewotCQkJCWZpbGxQcm94eSgoSVByb3h5KSBmaWVsZCwgd29ya2VyVmFsdWUpOwotCQkJfQotCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3Qod29ya2VyVmFsdWUpOwotCQkJY29ubmVjdGlvbi5wdXNoQm9vbGVhbihoYXNSZWNlaXZlcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaE1ldGhvZEludm9jYXRpb25Ub1Byb3h5KGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoTWV0aG9kSW52b2NhdGlvblRvUHJveHkoT2JqZWN0IG1ldGhvZCwgYm9vbGVhbiBoYXNSZWNlaXZlciwgaW50IGFyZ0NvdW50KSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggbWV0aG9kIGludm9jYXRpb24gdG8gcHJveHkgY29tbWFuZCBpczoKLQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIG1ldGhvZCBpbnZvY2F0aW9uIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlDb21tYW5kcy5WYWx1ZU9iamVjdDogbWV0aG9kTmFtZSBvciBJTWV0aG9kUHJveHkKLQkJCS8vCQlib29sZWFuOiBoYXNSZWNlaXZlcgotCQkJLy8JCWludDogYXJnQ291bnQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5NRVRIT0RfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQlpZiAobWV0aG9kIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJd29ya2VyVmFsdWUuc2V0KChTdHJpbmcpIG1ldGhvZCk7Ci0JCQl9IGVsc2UgewotCQkJCWZpbGxQcm94eSgoSVByb3h5KSBtZXRob2QsIHdvcmtlclZhbHVlKTsKLQkJCX0KLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEJvb2xlYW4oaGFzUmVjZWl2ZXIpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KGFyZ0NvdW50KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihDT01NQU5EX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQ29uZGl0aW9uYWxUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQ29uZGl0aW9uYWxUb1Byb3h5KEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZSBleHByZXNzaW9uVHlwZSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGNvbmRpdGlvbmFsIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBjb25kaXRpb25hbCB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJYnl0ZTogZXhwcmVzc2lvbiB0eXBlCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hCeXRlKChieXRlKSBleHByZXNzaW9uVHlwZS5nZXRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEEgc3BlY2lhbCBvbmUgdGhhdCB0YWtlcyB0aGUgVGhyb3dhYmxlUHJveHkgZm9yIG5vIGV4cHJlc3Npb24gdmFsdWUgYW5kIAotCSAqIHdyYXBwZXJzIGl0IHByaW50cyBpdHMgc3RhY2sgdHJhY2UgaW5zdGVhZCwgYnV0IHN0aWxsIG1ha2VzIGl0IGEgc3ViY2xhc3MKLQkgKiBvZiBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSRU1Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBleHRlbmRzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE2OTI0MDY3NzczOTE4MTI2OTRMOwotCi0KLQkJcHVibGljIFJFTU5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXN1cGVyKGUpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjZ2V0TG9jYWxpemVkTWVzc2FnZSgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gKChUaHJvd2FibGVQcm94eSkgZ2V0Q2F1c2UoKSkuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLlRocm93YWJsZSNnZXRNZXNzYWdlKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJCXJldHVybiAoKFRocm93YWJsZVByb3h5KSBnZXRDYXVzZSgpKS5nZXRQcm94eU1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCQlnZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcykgewotCQkJZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLlRocm93YWJsZSNwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBzKSB7Ci0JCQlnZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJbnZva2UoaW50LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSW52b2tlKGludCBwcm94eWNvdW50LCBMaXN0IGV4cHJlc3Npb25Qcm94aWVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJaWYgKCFoYXZlU2VudERhdGEoKSkgewotCQkJbWFya0FsbFByb3hpZXNOb3RSZXNvbHZlZChleHByZXNzaW9uUHJveGllcyk7Ci0JCQlyZXR1cm47CS8vIFdlIGhhdmVuJ3QgcHVzaGVkIGFueSBjb21tYW5kcywgc28gdGhlcmUgaXMgbm90aGluZyB0byBkby4gRG9uJ3QgY3JlYXRlIGEgY29ubmVjdGlvbiBmb3IgdGhpcy4KLQkJfQotCQkvLyBJZiBhdCB0aGlzIHBvaW50IHRoZXJlIGFyZSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIHRoZW0gYmVjYXVzZSB0aGV5IHdvdWxkIGFsbCBiZSBkby1ub3RoaW5ncy4KLQkJCi0JCWJvb2xlYW4gcHJvY2Vzc2VkRXhwcmVzc2lvblByb3hpZXMgPSBmYWxzZTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGxjbENvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCW1hcmtJblRyYW5zYWN0aW9uKGxjbENvbm5lY3Rpb24pOwotCQl0cnkgewotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcHJveHlpZHMgPSBudWxsOwotCQkJQmVhblByb3h5VmFsdWVTZW5kZXIgc2VuZGVyID0gbnVsbDsKLQkJCWlmIChwcm94eWNvdW50ID4gMCkgewotCQkJCXByb3h5aWRzID0gY3JlYXRlRXhwcmVzc2lvblByb3hpZXNWYWx1ZU9iamVjdChwcm94eWNvdW50LCBleHByZXNzaW9uUHJveGllcyk7Ci0JCQkJc2VuZGVyID0gZ2V0RXhwcmVzc2lvblByb3hpZXNTZW5kZXIoKTsKLQkJCX0KLQotCQkJbGNsQ29ubmVjdGlvbi5zeW5jKGdldFJFTUV4cHJlc3Npb25JRCgpLCBwcm94eWlkcywgc2VuZGVyKTsKLQkJCQotCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyLCB0aGVuIGlmIHRoZXJlIGFyZSBwcm94aWVzLCB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlc2UgdG9vLgotCQkJaWYgKHByb3h5Y291bnQgPiAwKQotCQkJCXByb2Nlc3NwdWxsZWRFeHByZXNzaW9uUHJveGllcyhleHByZXNzaW9uUHJveGllcywgc2VuZGVyKTsKLQkJCXByb2Nlc3NlZEV4cHJlc3Npb25Qcm94aWVzID0gdHJ1ZTsKLQkJCWxjbENvbm5lY3Rpb24uZ2V0RmluYWxWYWx1ZSh3b3JrZXJWYWx1ZSk7CS8vIFdlIGRvbid0IGNhcmUgd2hhdCBpdCBpcywgd2UganVzdCBuZWVkIHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KLQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGUuZ2V0RXJyb3JDb2RlKCkgPT0gRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05fTk9FWFBSRVNTSU9OVkFMVUVfRVhDRVBUSU9OKSB7Ci0JCQkJCS8vIE5lZWQgdG8gdHVybiBpdCBpbnRvIGEgVGhyb3dhYmxlLgotCQkJCQlUaHJvd2FibGVQcm94eSB0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWdldFJFTUJlYW5Qcm94eUZhY3RvcnkoKS5nZXRCZWFuUHJveHkoZS5nZXRWYWx1ZSgpKTsJLy8gVGhpcyB3aWxsIGNhdXNlIGEgdGhyb3cgdG8gb2NjdXIsIGJ1dCB3ZSBkb24ndCB3YW50IGl0IGdvaW5nIG91dCwgd2Ugd2FudCB0byBjYXB0dXJlIGl0LgotCQkJCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlMSkgewotCQkJCQkJdCA9IGUxOwotCQkJCQl9Ci0JCQkJCXRocm93IG5ldyBSRU1Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbih0KTsKLQkJCQl9Ci0JCQkJZ2V0UkVNQmVhblByb3h5RmFjdG9yeSgpLnByb2Nlc3NFcnJvclJldHVybihlKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZTEpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQlsY2xDb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQkJfQkJCQotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQlsY2xDb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCW1hcmtFbmRUcmFuc2FjdGlvbihsY2xDb25uZWN0aW9uKTsKLQkJCWlmICghcHJvY2Vzc2VkRXhwcmVzc2lvblByb3hpZXMpCi0JCQkJbWFya0FsbFByb3hpZXNOb3RSZXNvbHZlZChleHByZXNzaW9uUHJveGllcyk7CS8vIFdlIGZhaWxlZCBiZWZvcmUgd2UgY291bGQgcHJvY2VzcyB0aGUgZXhwcmVzc2lvbiBwcm94aWVzLiBTbyBtYXJrIGFsbCBhcyBub3QgcmVzb2x2ZWQuCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSRU1CZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBleHRlbmRzIEV4cHJlc3Npb25Qcm94eSBpbXBsZW1lbnRzIElCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gcHJveHlpZAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIFJFTUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJCXN1cGVyKHByb3h5aWQsIEJFQU5UWVBFX0VYUFJFU1NJT05fUFJPWFksIGV4cHJlc3Npb24pOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJCXJldHVybiB0eXBlTmFtZTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpKyIgLSAiK2dldFR5cGVOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGVbXSkKLQkJICovCi0JCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSBleHByZXNzaW9uLmdldFJlZ2lzdHJ5KCk7Ci0JCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCB0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkJICovCi0JCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpOwotCQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgdGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoZXhwcmVzc2lvbiwgbWV0aG9kTmFtZSwgKElQcm94eUJlYW5UeXBlW10pIG51bGwpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgSVByb3h5RmllbGQgZ2V0RmllbGRQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpOwotCQkJcmV0dXJuICgoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RmllbGRQcm94eShleHByZXNzaW9uLCB0aGlzLCBmaWVsZE5hbWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJFTU1ldGhvZEV4cHJlc3Npb25Qcm94eSBleHRlbmRzIEV4cHJlc3Npb25Qcm94eSBpbXBsZW1lbnRzIElQcm94eU1ldGhvZCB7Ci0JCQotCQkJLyoqCi0JCSAqIEBwYXJhbSBwcm94eWlkCi0JCSAqIEBwYXJhbSBwcm94eVR5cGUKLQkJICogQHBhcmFtIGV4cHJlc3Npb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBSRU1NZXRob2RFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJc3VwZXIocHJveHlpZCwgTUVUSE9EX0VYUFJFU1NJT05fUFJPWFksIGV4cHJlc3Npb24pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJFTUZpZWxkRXhwcmVzc2lvblByb3h5IGV4dGVuZHMgRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSVByb3h5RmllbGQgewotCQkKLQkJCS8qKgotCQkgKiBAcGFyYW0gcHJveHlpZAotCQkgKiBAcGFyYW0gcHJveHlUeXBlCi0JCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgUkVNRmllbGRFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJc3VwZXIocHJveHlpZCwgRklFTERfRVhQUkVTU0lPTl9QUk9YWSwgZXhwcmVzc2lvbik7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNjcmVhdGVFeHByZXNzaW9uUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uUHJveHkgY3JlYXRlRXhwcmVzc2lvblByb3h5KGludCBwcm94eVR5cGUsIGludCBwcm94eUlEKSB7Ci0JCXN3aXRjaCAocHJveHlUeXBlKSB7Ci0JCQljYXNlIE5PUk1BTF9FWFBSRVNTSU9OX1BST1hZOgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbmV3IEV4cHJlc3Npb25Qcm94eShwcm94eUlELCBOT1JNQUxfRVhQUkVTU0lPTl9QUk9YWSwgdGhpcyk7Ci0JCQkKLQkJCWNhc2UgQkVBTlRZUEVfRVhQUkVTU0lPTl9QUk9YWToKLQkJCQlyZXR1cm4gbmV3IFJFTUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KHByb3h5SUQsIHRoaXMpOwotCQkJCQotCQkJY2FzZSBNRVRIT0RfRVhQUkVTU0lPTl9QUk9YWToKLQkJCQlyZXR1cm4gbmV3IFJFTU1ldGhvZEV4cHJlc3Npb25Qcm94eShwcm94eUlELCB0aGlzKTsKLQkJCQkKLQkJCWNhc2UgRklFTERfRVhQUkVTU0lPTl9QUk9YWToKLQkJCQlyZXR1cm4gbmV3IFJFTUZpZWxkRXhwcmVzc2lvblByb3h5KHByb3h5SUQsIHRoaXMpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEFzc2lnbm1lbnRUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXNzaWdubWVudFRvUHJveHkoRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggYXNzaWdubWVudCB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggYXNzaWdubWVudCB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJaW50OiBwcm94eSBpZAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkFTU0lHTk1FTlRfUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQocHJveHkuZ2V0UHJveHlJRCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQXNzaWdubWVudFRvUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hBc3NpZ25tZW50VG9Qcm94eSgpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgdGhlIHB1c2ggYXNzaWdubWVudCBjb21tYW5kIGlzOgotCQkJLy8gICBQdXNoQXNzaWdubWVudENvbW1hbmQuCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFTU0lHTk1FTlRfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIHB1c2hUb0V4cHJlc3Npb25Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHkpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBleHByZXNzaW9uIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBleHByZXNzaW9uIHByb3h5IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCS8vCQlpbnQ6IHByb3h5IGlkCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9UT19FWFBSRVNTSU9OX1BST1hZX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KHByb3h5LmdldFByb3h5SUQoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmxvY2tCZWdpbiBleHRlbmRzIFBlbmRpbmdUcmFuc2FjdGlvbiB7Ci0JCXB1YmxpYyBpbnQgYmxvY2tOdW1iZXI7Ci0JCQotCQlwdWJsaWMgQmxvY2tCZWdpbihpbnQgYmxvY2tOdW1iZXIpIHsKLQkJCXRoaXMuYmxvY2tOdW1iZXIgPSBibG9ja051bWJlcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcHVzaFRyYW5zYWN0aW9uKFJFTUV4cHJlc3Npb24gcmVtRXhwcmVzc2lvbikgewotCQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSByZW1FeHByZXNzaW9uLmdldENvbm5lY3Rpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gYmxvY2sgYmVnaW4gcHJveHkgY29tbWFuZCBpczoKLQkJCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBibG9jayBiZWdpbiBwcm94eSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkJLy8JCWludDogYmxvY2sgaWQKLQkJCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChyZW1FeHByZXNzaW9uLmdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5CTE9DS19CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQoYmxvY2tOdW1iZXIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi5tYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi50aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQmxvY2tCZWdpblRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCbG9ja0JlZ2luVG9Qcm94eShpbnQgYmxvY2tOdW1iZXIpIHsKLQkJYWRkUGVuZGluZ1RyYW5zYWN0aW9uKG5ldyBCbG9ja0JlZ2luKGJsb2NrTnVtYmVyKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEJsb2NrRW5kVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJsb2NrRW5kVG9Qcm94eShpbnQgYmxvY2tOdW1iZXIpIHsKLQkJLy8gU2VlIGlmIHRoZSB0b3AgcGVuZGluZyB0cmFuc2FjdGlvbnMgaXMgQnJlYWtCbG9jayhibG9ja051bWJlcikuIElmIGl0IGlzIHRoZW4gdGhlIEJyZWFrQmxvY2sgY2FuIGJlIHRocm93biBhd2F5LgotCQlQZW5kaW5nVHJhbnNhY3Rpb24gdG9wRW50cnkgPSBnZXRQZW5kaW5nRW50cnlGcm9tVG9wKDEpOwotCQlpZiAodG9wRW50cnkgaW5zdGFuY2VvZiBCbG9ja0JyZWFrICYmICgoQmxvY2tCcmVhaykgdG9wRW50cnkpLmJsb2NrTnVtYmVyID09IGJsb2NrTnVtYmVyKSB7Ci0JCQlwb3BQZW5kaW5nRW50cnkoMSk7Ci0JCQl0b3BFbnRyeSA9IGdldFBlbmRpbmdFbnRyeUZyb21Ub3AoMSk7Ci0JCX0KLQkJLy8gU2VlIGlmIHRoZSB0b3AgcGVuZGluZyB0cmFuc2FjdGlvbiBpcyBub3cgQmVnaW5CbG9jayhibG9ja051bWJlcikuIElmIGl0IGlzLCB0aGVuIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHRoZSBibG9jayBiZWdpbgotCQkvLyBjYW4gYmUgdGhyb3duIGF3YXkgYmVjYXVzZSB0aGV5IGFyZSBhbiBlbXB0eSBibG9jay4KLQkJaWYgKHRvcEVudHJ5IGluc3RhbmNlb2YgQmxvY2tCZWdpbiAmJiAoKEJsb2NrQmVnaW4pIHRvcEVudHJ5KS5ibG9ja051bWJlciA9PSBibG9ja051bWJlcikgewotCQkJcG9wUGVuZGluZ0VudHJ5KDEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gYmxvY2sgZW5kIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBibG9jayBlbmQgcHJveHkgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWludDogYmxvY2sgaWQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5CTE9DS19FTkRfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQoYmxvY2tOdW1iZXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBCbG9ja0JyZWFrIGV4dGVuZHMgUGVuZGluZ1RyYW5zYWN0aW9uIHsKLQkJcHVibGljIGludCBibG9ja051bWJlcjsKLQkJCi0JCXB1YmxpYyBCbG9ja0JyZWFrKGludCBibG9ja051bWJlcikgewotCQkJdGhpcy5ibG9ja051bWJlciA9IGJsb2NrTnVtYmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwdXNoVHJhbnNhY3Rpb24oUkVNRXhwcmVzc2lvbiByZW1FeHByZXNzaW9uKSB7Ci0JCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHJlbUV4cHJlc3Npb24uZ2V0Q29ubmVjdGlvbigpOwotCQkJdHJ5IHsKLQkJCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBibG9jayBicmVhayBwcm94eSBjb21tYW5kIGlzOgotCQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIGJsb2NrIGJyZWFrIHByb3h5IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCQkvLwkJaW50OiBibG9jayBpZAotCQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKHJlbUV4cHJlc3Npb24uZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLkJMT0NLX0JSRUFLX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJCWNvbm5lY3Rpb24ucHVzaEludChibG9ja051bWJlcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZW1FeHByZXNzaW9uLm1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQlyZW1FeHByZXNzaW9uLnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQkJfQotCQl9CQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hCbG9ja0JyZWFrVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJsb2NrQnJlYWtUb1Byb3h5KGludCBibG9ja051bWJlcikgewotCQkvLyBFdmVuIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgYmxvY2sgYmVnaW4gZm9yIHRoaXMgYmxvY2ssIHdlIHdpbGwgcGVuZCB0aGUgYnJlYWsuCi0JCS8vIFRoaXMgaXMgc28gdGhhdCBpZiB0aGUgYnJlYWsgb2NjdXJyZWQganVzdCBiZWZvcmUgdGhlIGJsb2NrIGVuZCwgdGhlbiBpdCBjYW4gYmUgaWdub3JlZC4KLQkJYWRkUGVuZGluZ1RyYW5zYWN0aW9uKG5ldyBCbG9ja0JyZWFrKGJsb2NrTnVtYmVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHJ5QmVnaW4gZXh0ZW5kcyBQZW5kaW5nVHJhbnNhY3Rpb24gewotCi0JCXB1YmxpYyBmaW5hbCBpbnQgdHJ5TnVtYmVyOwotCQkKLQkJcHVibGljIFRyeUJlZ2luKGludCB0cnlOdW1iZXIpIHsKLQkJCXRoaXMudHJ5TnVtYmVyID0gdHJ5TnVtYmVyOwotCQkJCi0JCX0KLQkJcHVibGljIHZvaWQgcHVzaFRyYW5zYWN0aW9uKFJFTUV4cHJlc3Npb24gcmVtRXhwcmVzc2lvbikgewotCQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSByZW1FeHByZXNzaW9uLmdldENvbm5lY3Rpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gdHJ5IGJlZ2luIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggdHJ5IGJlZ2luIHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCQkvLwkJaW50OiB0cnkgaWQKLQkJCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChyZW1FeHByZXNzaW9uLmdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQkJY29ubmVjdGlvbi5wdXNoSW50KHRyeU51bWJlcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZW1FeHByZXNzaW9uLm1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQlyZW1FeHByZXNzaW9uLnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUcnlCZWdpblRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUcnlCZWdpblRvUHJveHkoaW50IHRyeU51bWJlcikgewotCQlhZGRQZW5kaW5nVHJhbnNhY3Rpb24obmV3IFRyeUJlZ2luKHRyeU51bWJlcikpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRyeUNhdGNoIGV4dGVuZHMgUGVuZGluZ1RyYW5zYWN0aW9uIHsKLQotCQlwdWJsaWMgZmluYWwgaW50IHRyeU51bWJlcjsKLQkJcHJpdmF0ZSBmaW5hbCBJUHJveHlCZWFuVHlwZSBleGNlcHRpb25UeXBlOwotCQlwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Qcm94eSBlcDsKLQotCQlwdWJsaWMgVHJ5Q2F0Y2goaW50IHRyeU51bWJlciwgSVByb3h5QmVhblR5cGUgZXhjZXB0aW9uVHlwZSwgRXhwcmVzc2lvblByb3h5IGVwKSB7Ci0JCQl0aGlzLnRyeU51bWJlciA9IHRyeU51bWJlcjsKLQkJCXRoaXMuZXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7Ci0JCQl0aGlzLmVwID0gZXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHB1c2hUcmFuc2FjdGlvbihSRU1FeHByZXNzaW9uIHJlbUV4cHJlc3Npb24pIHsKLQkJCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcmVtRXhwcmVzc2lvbi5nZXRDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIHRyeSBiZWdpbiBwcm94eSBjb21tYW5kIGlzOgotCQkJCS8vCVB1c2hFeHByZXNzaW9uQ29tbWFuZChwdXNoIHRyeSBiZWdpbiB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkJLy8JCWludDogdHJ5IGlkCi0JCQkJLy8JCW9iamVjdDogZXhwcmVzc2lvbiB0eXBlIChhcyBiZWFudHlwZSBvciBhcyBleHByZXNzaW9uIHByb3h5KQotCQkJCS8vCQlpbnQ6IHByb3h5IGlkIG9yICgtMSBpZiBudWxsKS4KLQkJCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChyZW1FeHByZXNzaW9uLmdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfQ0FUQ0hfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQkJY29ubmVjdGlvbi5wdXNoSW50KHRyeU51bWJlcik7Ci0JCQkJcmVtRXhwcmVzc2lvbi5maWxsUHJveHkoZXhjZXB0aW9uVHlwZSwgcmVtRXhwcmVzc2lvbi53b3JrZXJWYWx1ZSk7Ci0JCQkJY29ubmVjdGlvbi5wdXNoVmFsdWVPYmplY3QocmVtRXhwcmVzc2lvbi53b3JrZXJWYWx1ZSk7Ci0JCQkJaWYgKGVwICE9IG51bGwpCi0JCQkJCWNvbm5lY3Rpb24ucHVzaEludChlcC5nZXRQcm94eUlEKCkpOwotCQkJCWVsc2UKLQkJCQkJY29ubmVjdGlvbi5wdXNoSW50KC0xKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCXJlbUV4cHJlc3Npb24ubWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCXJlbUV4cHJlc3Npb24udGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi5tYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJCXJlbUV4cHJlc3Npb24udGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCQl9CQkJCi0JCQl9Ci0JCX0KLQkJCi0JfQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRyeUNhdGNoQ2xhdXNlVG9Qcm94eShpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyeUNhdGNoQ2xhdXNlVG9Qcm94eShpbnQgdHJ5TnVtYmVyLCBJUHJveHlCZWFuVHlwZSBleGNlcHRpb25UeXBlLCBFeHByZXNzaW9uUHJveHkgZXApIHsKLQkJYWRkUGVuZGluZ1RyYW5zYWN0aW9uKG5ldyBUcnlDYXRjaCh0cnlOdW1iZXIsIGV4Y2VwdGlvblR5cGUsIGVwKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHJ5RmluYWxseSBleHRlbmRzIFBlbmRpbmdUcmFuc2FjdGlvbiB7Ci0JCQotCQlwdWJsaWMgZmluYWwgaW50IHRyeU51bWJlcjsKLQotCQlwdWJsaWMgVHJ5RmluYWxseShpbnQgdHJ5TnVtYmVyKSB7Ci0JCQl0aGlzLnRyeU51bWJlciA9IHRyeU51bWJlcjsKLQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHVzaFRyYW5zYWN0aW9uKFJFTUV4cHJlc3Npb24gcmVtRXhwcmVzc2lvbikgewotCQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSByZW1FeHByZXNzaW9uLmdldENvbm5lY3Rpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gdHJ5IGJlZ2luIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggdHJ5IGZpbmFsbHkgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJCS8vCQlpbnQ6IHRyeSBpZAotCQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKHJlbUV4cHJlc3Npb24uZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlRSWV9GSU5BTExZX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJCWNvbm5lY3Rpb24ucHVzaEludCh0cnlOdW1iZXIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi5tYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJcmVtRXhwcmVzc2lvbi50aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVHJ5RmluYWxseUNsYXVzZVRvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hUcnlGaW5hbGx5Q2xhdXNlVG9Qcm94eShpbnQgdHJ5TnVtYmVyKSB7Ci0JCWFkZFBlbmRpbmdUcmFuc2FjdGlvbihuZXcgVHJ5RmluYWxseSh0cnlOdW1iZXIpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUcnlFbmRUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJ5RW5kVG9Qcm94eShpbnQgdHJ5TnVtYmVyKSB7Ci0JCS8vIFRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5LiBXZSBuZWVkIHRvIGZpbmQgaWYgdGhlcmUgaXMgbm90aGluZyBidXQgdHJ5L2NhdGNoL2ZpbmFsbHkgZm9yIHRoaXMgdHJ5TnVtYmVyIG9uIHRoZSBwZW5kaW5nCi0JCS8vIHRyYW5zYWN0aW9ucyB1cCB0byB0aGUgdHJ5IGJlZ2luLCBpZiB0aGVyZSBpcyBub3RoaW5nIGVsc2UsIHRoZW4gd2UgY2FuIHRocm93IHRoZSBlbnRpcmUgdHJ5IGF3YXkuIFRoYXQKLQkJLy8gbWVhbnMgdGhlcmUgd2FzIG5vIGNvZGUgYXQgYWxsIGluIGFueSBvZiB0aGUgdHJ5L2NhdGNoL2ZpbmFsbHkgYmxvY2tzLgotCQlpbnQgZnJvbVRvcCA9IDA7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlQZW5kaW5nVHJhbnNhY3Rpb24gdG9wRW50cnkgPSBnZXRQZW5kaW5nRW50cnlGcm9tVG9wKCsrZnJvbVRvcCk7Ci0JCQlpZiAodG9wRW50cnkgaW5zdGFuY2VvZiBUcnlGaW5hbGx5KSB7Ci0JCQkJaWYgKCgoVHJ5RmluYWxseSkgdG9wRW50cnkpLnRyeU51bWJlciAhPSB0cnlOdW1iZXIpCi0JCQkJCWJyZWFrOwkvLyBXZSBtZXQgYSBmaW5hbGx5IHRoYXQgd2Fzbid0IG91cnMsIHNvIGVudGlyZSB0cnkgZ3JvdXAgbXVzdCBiZSBzZW50LgotCQkJfSBlbHNlIGlmICh0b3BFbnRyeSBpbnN0YW5jZW9mIFRyeUNhdGNoKSB7Ci0JCQkJaWYgKCgoVHJ5Q2F0Y2gpIHRvcEVudHJ5KS50cnlOdW1iZXIgIT0gdHJ5TnVtYmVyKQotCQkJCQlicmVhazsJLy8gV2UgbWV0IGEgY2F0Y2ggdGhhdCB3YXNuJ3Qgb3Vycywgc28gZW50aXJlIHRyeSBncm91cCBtdXN0IGJlIHNlbnQuCi0JCQl9IGVsc2UgaWYgKHRvcEVudHJ5IGluc3RhbmNlb2YgVHJ5QmVnaW4pIHsKLQkJCQlpZiAoKChUcnlCZWdpbikgdG9wRW50cnkpLnRyeU51bWJlciA9PSB0cnlOdW1iZXIpIHsKLQkJCQkJLy8gV2UndmUgbWV0IG91ciB0cnkgYmVnaW4sIGFuZCBub3RoaW5nIGJ1dCBlbXB0eSBjYXRjaC9maW5hbGx5IGluIGJldHdlZW4sIHNvIHRoZSBlbnRpcmUgZ3JvdXAgY2FuIGJlIHRocm93biBhd2F5Ci0JCQkJCXBvcFBlbmRpbmdFbnRyeShmcm9tVG9wKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZQotCQkJCQlicmVhazsJLy8gV2UndmUgaGl0IGEgdHJ5IGJlZ2luIHRoYXQgd2Fzbid0IG91cnMsIHNvIHRoZSBlbnRpcmUgdHJ5IGdyb3VwIG11c3QgYmUgc2VudC4JCi0JCQl9IGVsc2UKLQkJCQlicmVhazsJLy8gV2UndmUgaGl0IHNvbWV0aGluZyBvdGhlciB0aGFuIG91ciB0cnkgZ3JvdXAsIHNvIHByb2Nlc3MgZXZlcnl0aGluZy4KLQkJfQotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIHRyeSBiZWdpbiBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggdHJ5IGVuZCB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJaW50OiB0cnkgaWQKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfRU5EX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KHRyeU51bWJlcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVGhyb3dUb1Byb3h5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVGhyb3dUb1Byb3h5KCkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIHRyeSBiZWdpbiBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggdGhyb3cgdG8gcHJveHkpCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVEhST1dfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoUmV0aHJvd1RvUHJveHkoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hSZXRocm93VG9Qcm94eShpbnQgdHJ5TnVtYmVyKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gcmV0aG93IHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCByZXRocm93IHRvIHByb3h5KQotCQkJLy8JCWludDogdHJ5IGlkCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUkVUSFJPV19FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludCh0cnlOdW1iZXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEJlYW5UeXBlVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVFeHByZXNzaW9uUHJveHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJlYW5UeXBlVG9Qcm94eShJQmVhblR5cGVFeHByZXNzaW9uUHJveHkgcHJveHkpIHsKLQkJLy8gUHVzaCBiZWFudHlwZSB0byBwcm94eSBpcyBzZW50IG91dCBvZiBzZXF1ZW5jZSB3aXRob3V0IHJlc3BlY3QgdG8gd2hlcmUgaW4gZXhwcmVzc2lvbiB3ZSBhcmUsCi0JCS8vIHNvIG5vIG5lZWQgdG8gaGFuZGxlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGF0IHRoaXMgcG9pbnQuIFRoZXkgd291bGQgbm90IGFmZmVjdCB0aGUgcmVzdWx0Ci0JCS8vIG9mIHRoaXMgY2FsbC4KLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBiZWFuVHlwZSBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggYmVhbiB0eXBlIGV4cHJlc3Npb24gcHJveHkpCi0JCQkvLwkJaW50OiBwcm94eSBpZAotCQkJLy8JCXN0cmluZzogdHlwZW5hbWUKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX0JFQU5UWVBFX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCVJFTUJlYW5UeXBlRXhwcmVzc2lvblByb3h5IGVwID0gKFJFTUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KSBwcm94eTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChlcC5nZXRQcm94eUlEKCkpOwotCQkJY29ubmVjdGlvbi5wdXNoU3RyaW5nKGVwLmdldFR5cGVOYW1lKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaE1ldGhvZFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGVbXSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoTWV0aG9kVG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHksIElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCS8vIFB1c2ggbWV0aG9kIHRvIHByb3h5IGlzIHNlbnQgb3V0IG9mIHNlcXVlbmNlIHdpdGhvdXQgcmVzcGVjdCB0byB3aGVyZSBpbiBleHByZXNzaW9uIHdlIGFyZSwKLQkJLy8gc28gbm8gbmVlZCB0byBoYW5kbGUgcGVuZGluZyB0cmFuc2FjdGlvbnMgYXQgdGhpcyBwb2ludC4gVGhleSB3b3VsZCBub3QgYWZmZWN0IHRoZSByZXN1bHQKLQkJLy8gb2YgdGhpcyBjYWxsLgotCi0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggdG8gbWV0aG9kIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBtZXRob2QgdHlwZSBleHByZXNzaW9uIHByb3h5KQotCQkJLy8JCWludDogcHJveHkgaWQKLQkJCS8vCQlWYWx1ZU9iamVjdDogY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIHRoZSBleHByZXNzaW9uIHByb3h5IGZvciB0aGUgZGVjbGFyaW5nIHR5cGUKLQkJCS8vCQlzdHJpbmc6IG1ldGhvZCBuYW1lCi0JCQkvLwkJaW50OiBudW1iZXIgb2YgcGFyYW1ldGVyIHR5cGVzCi0JCQkvLwkJVmFsdWVPYmplY3Qocyk6IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGJlYW4gdHlwZSBwcm94eSBvciB0aGUgZXhwcmVzc2lvbiBwcm94eSBmb3IgdGhlIHBhcmFtZXRlciB0eXBlcy4KLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX01FVEhPRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQocHJveHkuZ2V0UHJveHlJRCgpKTsKLQkJCWZpbGxQcm94eShkZWNsYXJpbmdUeXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hTdHJpbmcobWV0aG9kTmFtZSk7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCB8fCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMCkKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQoMCk7Ci0JCQllbHNlIHsKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQocGFyYW1ldGVyVHlwZXMubGVuZ3RoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZpbGxQcm94eShwYXJhbWV0ZXJUeXBlc1tpXSwgd29ya2VyVmFsdWUpOwotCQkJCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEZpZWxkVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hGaWVsZFRvUHJveHkoRXhwcmVzc2lvblByb3h5IHByb3h5LCBJUHJveHlCZWFuVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCS8vIFB1c2ggZmllbGQgdG8gcHJveHkgaXMgc2VudCBvdXQgb2Ygc2VxdWVuY2Ugd2l0aG91dCByZXNwZWN0IHRvIHdoZXJlIGluIGV4cHJlc3Npb24gd2UgYXJlLAotCQkvLyBzbyBubyBuZWVkIHRvIGhhbmRsZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBhdCB0aGlzIHBvaW50LiBUaGV5IHdvdWxkIG5vdCBhZmZlY3QgdGhlIHJlc3VsdAotCQkvLyBvZiB0aGlzIGNhbGwuCi0KLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCB0byBmaWVsZCBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggZmllbGQgdHlwZSBleHByZXNzaW9uIHByb3h5KQotCQkJLy8JCWludDogcHJveHkgaWQKLQkJCS8vCQlWYWx1ZU9iamVjdDogY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIHRoZSBleHByZXNzaW9uIHByb3h5IGZvciB0aGUgZGVjbGFyaW5nIHR5cGUKLQkJCS8vCQlzdHJpbmc6IGZpZWxkIG5hbWUKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX0ZJRUxEX0VYUFJFU1NJT05QUk9YWV9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEludChwcm94eS5nZXRQcm94eUlEKCkpOwotCQkJZmlsbFByb3h5KGRlY2xhcmluZ1R5cGUsIHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFZhbHVlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCWNvbm5lY3Rpb24ucHVzaFN0cmluZyhmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKENPTU1BTkRfRVhDRVBUSU9OX01TRyk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtYXAgb2YgSVByb3h5TWV0aG9kcyBmb3IgYSBiZWFudHlwZS4gTWVhbnQgdG8gYmUgdXNlZCBvbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggUkVNUHJveHlDb25zdGFudHMuCi0JICogSXQgaXMgaGVyZSBzbyB0aGUgUkVNUHJveHlDb25zdGFudHMgY2FuIHN0b3JlIHBlbmRpbmcgcHJveGllcyBwZXIgZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYmVhblR5cGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIE1hcCBnZXRNZXRob2RzKElQcm94eUJlYW5UeXBlIGJlYW5UeXBlKSB7Ci0JCWlmIChtZXRob2RzQ2FjaGUgPT0gbnVsbCkKLQkJCW1ldGhvZHNDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBtZXRob2RzID0gKE1hcCkgbWV0aG9kc0NhY2hlLmdldChiZWFuVHlwZS5nZXRUeXBlTmFtZSgpKTsKLQkJaWYobWV0aG9kcyA9PSBudWxsKXsKLQkJCW1ldGhvZHMgPSBuZXcgSGFzaE1hcCgyMCk7Ci0JCQltZXRob2RzQ2FjaGUucHV0KGJlYW5UeXBlLmdldFR5cGVOYW1lKCksbWV0aG9kcyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7CQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1hcCBvZiBJUHJveHlGaWVsZHMgZm9yIGEgYmVhbnR5cGUuIE1lYW50IHRvIGJlIHVzZWQgb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIFJFTVByb3h5Q29uc3RhbnRzLgotCSAqIEl0IGlzIGhlcmUgc28gdGhlIFJFTVByb3h5Q29uc3RhbnRzIGNhbiBzdG9yZSBwZW5kaW5nIHByb3hpZXMgcGVyIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGJlYW5UeXBlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RmllbGRzKElQcm94eUJlYW5UeXBlIGJlYW5UeXBlKSB7Ci0JCWlmIChmaWVsZHNDYWNoZSA9PSBudWxsKQotCQkJZmllbGRzQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgZmllbGRzID0gKE1hcCkgZmllbGRzQ2FjaGUuZ2V0KGJlYW5UeXBlLmdldFR5cGVOYW1lKCkpOwotCQlpZihmaWVsZHMgPT0gbnVsbCl7Ci0JCQlmaWVsZHMgPSBuZXcgSGFzaE1hcCgyMCk7Ci0JCQlmaWVsZHNDYWNoZS5wdXQoYmVhblR5cGUuZ2V0VHlwZU5hbWUoKSxmaWVsZHMpOwotCQl9Ci0JCXJldHVybiBmaWVsZHM7CQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1hcCBvZiBJUHJveHlCZWFuVHlwZXMgZm9yIGEgYmVhbnR5cGUgbmFtZS4gTWVhbnQgdG8gYmUgdXNlZCBvbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggUkVNU2d0YW5kYXJkQmVhblR5cGVGYWN0b3J5LgotCSAqIEl0IGlzIGhlcmUgc28gdGhlIFJFTVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5IGNhbiBzdG9yZSBwZW5kaW5nIHByb3hpZXMgcGVyIGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIGJlYW5UeXBlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZShTdHJpbmcgYmVhblR5cGVOYW1lKSB7Ci0JCWlmIChiZWFuVHlwZUNhY2hlID09IG51bGwpCi0JCQliZWFuVHlwZUNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIChJUHJveHlCZWFuVHlwZSkgYmVhblR5cGVDYWNoZS5nZXQoYmVhblR5cGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBiZWFudHlwZSBleHByZXNzaW9uIHByb3h5IHRvIHRoZSBtYXAgb2YgYmVhbiB0eXBlIGV4cHJlc3Npb24gcHJveGllcy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFJFTVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5LgotCSAqIEl0IGlzIGhlcmUgc28gdGhlIFJFTVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5IGNhbiBzdG9yZSBwZW5kaW5nIHByb3hpZXMgcGVyIGV4cHJlc3Npb24uCi0JICogQHBhcmFtIGJlYW5UeXBlTmFtZQotCSAqIEBwYXJhbSBiZWFudHlwZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEJlYW5UeXBlKFN0cmluZyBiZWFuVHlwZU5hbWUsIElQcm94eUJlYW5UeXBlIGJlYW50eXBlKSB7Ci0JCWJlYW5UeXBlQ2FjaGUucHV0KGJlYW5UeXBlTmFtZSwgYmVhbnR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGJlYW50eXBlIGV4cHJlc3Npb24gcHJveHkgZnJvbSB0aGUgbWFwLiBUaGlzIGlzIGNhbGxlZCBiZWNhdXNlIHRoZXJlIHdhcyBhIHJvbGxiYWNrIGR1ZSB0byBhbiBlbmRtYXJrLgotCSAqIEBwYXJhbSBiZWFuVHlwZU5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVCZWFuVHlwZShTdHJpbmcgYmVhblR5cGVOYW1lKSB7Ci0JCWJlYW5UeXBlQ2FjaGUucmVtb3ZlKGJlYW5UeXBlTmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSWZUZXN0VG9Qcm94eSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaElmVGVzdFRvUHJveHkoKSB7Ci0JCXByb2Nlc3NQZW5kaW5nVHJhbnNhY3Rpb25zKCk7Ci0JCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQl0cnkgewotCQkJLy8gRm9ybWF0IG9mIHB1c2ggaWYgdGVzdCB0byBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggaWYgdGVzdCB0byBwcm94eSkKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9URVNUX0VYUFJFU1NJT05fVkFMVUUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaElmRWxzZVRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJZkVsc2VUb1Byb3h5KEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUgY2xhdXNlVHlwZSkgewotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGNvbmRpdGlvbmFsIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBpZi9lbHNlIGNsYXVzZSB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJYnl0ZTogY2xhdXNlIHR5cGUKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9FTFNFX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoQnl0ZSgoYnl0ZSkgY2xhdXNlVHlwZS5nZXRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJbWFya0ludmFsaWQoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSU9fRVhDRVBUSU9OX01TRyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hOZXdJbnN0YW5jZVRvUHJveHkoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaE5ld0luc3RhbmNlVG9Qcm94eShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcsIElQcm94eUJlYW5UeXBlIHJlc3VsdFR5cGUpIHsKLQkJcHJvY2Vzc1BlbmRpbmdUcmFuc2FjdGlvbnMoKTsKLQkJSVJFTUV4cHJlc3Npb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBGb3JtYXQgb2YgcHVzaCBuZXcgaW5zdGFuY2UgZnJvbSBpbml0c3RyaW5nIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBuZXcgaW5zdGFuY2UgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCXN0cmluZzogaW5pdCBzdHJpbmcKLQkJCS8vCQlWYWx1ZU9iamVjdDogY29udGFpbmluZyB0aGUgcmVuZGVyZWQgYmVhbiB0eXBlIHByb3h5IG9yIHRoZSBleHByZXNzaW9uIHByb3h5IGZvciB0aGUgZGVjbGFyaW5nIHR5cGUKLQkJCWNvbm5lY3Rpb24ucHVzaEV4cHJlc3Npb25Db21tYW5kKGdldFJFTUV4cHJlc3Npb25JRCgpLCAoYnl0ZSlJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5ORVdfSU5TVEFOQ0VfVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoU3RyaW5nKGluaXRpYWxpemF0aW9uU3RyaW5nKTsKLQkJCWZpbGxQcm94eShyZXN1bHRUeXBlLCB3b3JrZXJWYWx1ZSk7Ci0JCQljb25uZWN0aW9uLnB1c2hWYWx1ZU9iamVjdCh3b3JrZXJWYWx1ZSk7CQkJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCWlmICghZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmsgZXh0ZW5kcyBQZW5kaW5nVHJhbnNhY3Rpb24gewotCQlwdWJsaWMgaW50IG1hcmtJRDsKLQkJCi0JCXB1YmxpYyBNYXJrKGludCBtYXJrSUQpIHsKLQkJCXRoaXMubWFya0lEID0gbWFya0lEOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwdXNoVHJhbnNhY3Rpb24oUkVNRXhwcmVzc2lvbiByZW1FeHByZXNzaW9uKSB7Ci0JCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHJlbUV4cHJlc3Npb24uZ2V0Q29ubmVjdGlvbigpOwotCQkJdHJ5IHsKLQkJCQkvLyBGb3JtYXQgb2YgcHVzaCBtYXJrIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggbWFyayB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkJLy8JCWludDogbWFya0lECi0JCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQocmVtRXhwcmVzc2lvbi5nZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuTUFSS19WQUxVRSk7Ci0JCQkJY29ubmVjdGlvbi5wdXNoSW50KG1hcmtJRCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZW1FeHByZXNzaW9uLm1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQlyZW1FeHByZXNzaW9uLnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwdXNoTWFya1RvUHJveHkoaW50IG1hcmtJRCkgewotCQlhZGRQZW5kaW5nVHJhbnNhY3Rpb24obmV3IE1hcmsobWFya0lEKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEVuZG1hcmtUb1Byb3h5KGludCBtYXJrSUQsIGJvb2xlYW4gcmVzdG9yZSkgewotCQkvLyBTZWUgaWYgdGhlIHRvcCBwZW5kaW5nIHRyYW5zYWN0aW9uIGlzIG5vdyBNYXJrKG1hcmtJRCkuIElmIGl0IGlzLCB0aGVuIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHRoZSBtYXJrIGJlZ2luCi0JCS8vIGNhbiBiZSB0aHJvd24gYXdheSBiZWNhdXNlIHRoZXkgYXJlIGFuIGVtcHR5IGJsb2NrLgotCQlQZW5kaW5nVHJhbnNhY3Rpb24gdG9wRW50cnkgPSBnZXRQZW5kaW5nRW50cnlGcm9tVG9wKDEpOwotCQlpZiAodG9wRW50cnkgaW5zdGFuY2VvZiBNYXJrICYmICgoTWFyaykgdG9wRW50cnkpLm1hcmtJRCA9PSBtYXJrSUQpIHsKLQkJCXBvcFBlbmRpbmdFbnRyeSgxKTsKLQkJCXJldHVybjsKLQkJfQotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIGVuZCBtYXJrIHRvIHByb3h5IGNvbW1hbmQgaXM6Ci0JCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBlbmQgbWFyayB0byBwcm94eSkgZm9sbG93ZWQgYnk6Ci0JCQkvLwkJaW50OiBtYXJrSUQKLQkJCS8vCQlib29sZWFuOiByZXN0b3JlCi0JCQljb25uZWN0aW9uLnB1c2hFeHByZXNzaW9uQ29tbWFuZChnZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuRU5ETUFSS19WQUxVRSk7Ci0JCQljb25uZWN0aW9uLnB1c2hJbnQobWFya0lEKTsKLQkJCWNvbm5lY3Rpb24ucHVzaEJvb2xlYW4ocmVzdG9yZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCW1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCXRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQl9Ci0JfQotCi0JLy8gVGhpcyBpcyB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzb3IgY29udHJvbGxlciB1c2VkIHRvIHRyYW5zZmVyLgotCS8vIFRoaXMgaXMgdGhlIGd1eSB0aGF0IG1haW50YWlucyBjb250aW51aXR5IG9mIHRoZSB0cmFuc2FjdGlvbiBhcwotCS8vIGl0IGlzIHBhc3NlZCBmcm9tIG9uZSBjb25uZWN0aW9uIHRvIGFub3RoZXIuCi0JcHJvdGVjdGVkIElCZWFuUHJveHkgZXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXI7CQotCXByb3RlY3RlZCB2b2lkIHB1c2hCZWdpblRyYW5zZmVyVGhyZWFkVG9Qcm94eSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIElmIHRoZSBjb250cm9sbGVyIGlzIG5vdCBudWxsLCB0aGF0IG1lYW5zIHdlIGhhZCBhbHJlYWR5IHJlcXVlc3RlZCBhIHRyYW5zZmVyCi0JCS8vIGJ1dCBoYWQgbm90IHVzZWQgaXQgaW4gdGhpcyB0aHJlYWQgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBhbnl0aGluZy4gSXQKLQkJLy8gd2lsbCBiZSBoYW5kbGVkIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gdGhlIG90aGVyIHRocmVhZC4KLQkJLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgbnVsbCwgbm8gbmVlZCB0byBkbyBhbnl0aGluZyBzaW5jZSB0aGVyZSBpcyBubyBjb25uZWN0aW9uCi0JCS8vIHRvIHRyYW5zZmVyLgotCQlpZiAoY29ubmVjdGlvbiAhPSBudWxsICYmIGV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyID09IG51bGwpIHsKLQkJCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBsY2xDb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpOwotCQkJbWFya0luVHJhbnNhY3Rpb24obGNsQ29ubmVjdGlvbik7Ci0JCQl0cnkgewotCQkJCXdvcmtlclZhbHVlLnNldCgpOwotCQkJCWxjbENvbm5lY3Rpb24udHJhbnNmZXJFeHByZXNzaW9uKGdldFJFTUV4cHJlc3Npb25JRCgpLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJZXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgPSBnZXRSRU1CZWFuUHJveHlGYWN0b3J5KCkuZ2V0QmVhblByb3h5KHdvcmtlclZhbHVlKTsKLQkJCQlnZXRSRU1SZWdpc3RyeSgpLnJldHVybkNvbm5lY3Rpb24obGNsQ29ubmVjdGlvbik7Ci0JCQkJdGhpcy5jb25uZWN0aW9uID0gbnVsbDsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCWxjbENvbm5lY3Rpb24uY2xvc2UoKTsKLQkJCQkJdGhyb3dJbGxlZ2FsU3RhdGVFeGNlcHRpb24oQ09NTUFORF9FWENFUFRJT05fTVNHKTsKLQkJCQl9CQkJCi0JCQl9IGZpbmFsbHkgewotCQkJCW1hcmtFbmRUcmFuc2FjdGlvbihsY2xDb25uZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hUcmFuc2ZlclRocmVhZFRvUHJveHkoKSB7Ci0JCS8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIFRoZSBuZXh0IHRpbWUgd2UgbmVlZCB0byBwdXNoIGRhdGEgYWNyb3NzLCB3ZSB3aWxsIGdldCBhIGNvbm5lY3Rpb24gYW5kIHRoZSBnZXRDb25uZWN0aW9uKCkKLQkJLy8gd2lsbCBob29rIHVwIHRoZSBleHByZXNzaW9uIHByb2Nlc3NvciBjb250cm9sbGVyIGZvciB1cy4gVGhpcyB3YXkgaWYgbm90aGluZyBoYXBwZW5zIGluIHRoaXMgdGhyZWFkIHRoZW4gd2Ugd29uJ3QKLQkJLy8gd2FzdGUgY29tbXVuaWNhdGlvbiB0aW1lIG9uIGl0LgotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN1YmV4cHJlc3Npb25CZWdpbiBleHRlbmRzIFBlbmRpbmdUcmFuc2FjdGlvbiB7Ci0JCXB1YmxpYyBpbnQgc3ViZXhwcmVzc2lvbk51bWJlcjsKLQkJCi0JCXB1YmxpYyBTdWJleHByZXNzaW9uQmVnaW4oaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJCXRoaXMuc3ViZXhwcmVzc2lvbk51bWJlciA9IHN1YmV4cHJlc3Npb25OdW1iZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHB1c2hUcmFuc2FjdGlvbihSRU1FeHByZXNzaW9uIHJlbUV4cHJlc3Npb24pIHsKLQkJCUlSRU1FeHByZXNzaW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcmVtRXhwcmVzc2lvbi5nZXRDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIHN1YmV4cHJlc3Npb24gYmVnaW4gcHJveHkgY29tbWFuZCBpczoKLQkJCQkvLwlQdXNoRXhwcmVzc2lvbkNvbW1hbmQocHVzaCBzdWJleHByZXNzaW9uIGJlZ2luIHByb3h5IHRvIHByb3h5KSBmb2xsb3dlZCBieToKLQkJCQkvLwkJaW50OiBzdWJleHByZXNzaW9uIGlkCi0JCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQocmVtRXhwcmVzc2lvbi5nZXRSRU1FeHByZXNzaW9uSUQoKSwgKGJ5dGUpSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuU1VCRVhQUkVTU0lPTl9CRUdJTl9FWFBSRVNTSU9OX1ZBTFVFKTsKLQkJCQljb25uZWN0aW9uLnB1c2hJbnQoc3ViZXhwcmVzc2lvbk51bWJlcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQlyZW1FeHByZXNzaW9uLm1hcmtJbnZhbGlkKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQlyZW1FeHByZXNzaW9uLnRocm93SWxsZWdhbFN0YXRlRXhjZXB0aW9uKElPX0VYQ0VQVElPTl9NU0cpOwotCQkJfQkJCQotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hTdWJleHByZXNzaW9uQmVnaW5Ub1Byb3h5KGludCBzdWJleHByZXNzaW9uTnVtYmVyKSB7Ci0JCWFkZFBlbmRpbmdUcmFuc2FjdGlvbihuZXcgU3ViZXhwcmVzc2lvbkJlZ2luKHN1YmV4cHJlc3Npb25OdW1iZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoU3ViZXhwcmVzc2lvbkVuZFRvUHJveHkoaW50IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJLy8gU2VlIGlmIHRoZSB0b3AgcGVuZGluZyB0cmFuc2FjdGlvbnMgaXMgU3ViZXhwcmVzc2lvbkJlZ2luKHN1YmV4cHJlc3Npb25OdW1iZXIpLiBJZiBpdCBpcyB0aGVuIHRoZSBTdWJleHByZXNzaW9uQmVnaW4gY2FuIGJlIHRocm93biBhd2F5LgotCQlQZW5kaW5nVHJhbnNhY3Rpb24gdG9wRW50cnkgPSBnZXRQZW5kaW5nRW50cnlGcm9tVG9wKDEpOwotCQlpZiAodG9wRW50cnkgaW5zdGFuY2VvZiBTdWJleHByZXNzaW9uQmVnaW4gJiYgKChTdWJleHByZXNzaW9uQmVnaW4pIHRvcEVudHJ5KS5zdWJleHByZXNzaW9uTnVtYmVyID09IHN1YmV4cHJlc3Npb25OdW1iZXIpIHsKLQkJCXBvcFBlbmRpbmdFbnRyeSgxKTsKLQkJCXJldHVybjsKLQkJfQotCQlwcm9jZXNzUGVuZGluZ1RyYW5zYWN0aW9ucygpOwotCQlJUkVNRXhwcmVzc2lvbkNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIEZvcm1hdCBvZiBwdXNoIHRvIGJsb2NrIGVuZCBwcm94eSBjb21tYW5kIGlzOgotCQkJLy8JUHVzaEV4cHJlc3Npb25Db21tYW5kKHB1c2ggc3ViZXhwcmVzc2lvbiBlbmQgcHJveHkgdG8gcHJveHkpIGZvbGxvd2VkIGJ5OgotCQkJLy8JCWludDogc3ViZXhwcmVzc2lvbiBpZAotCQkJY29ubmVjdGlvbi5wdXNoRXhwcmVzc2lvbkNvbW1hbmQoZ2V0UkVNRXhwcmVzc2lvbklEKCksIChieXRlKUludGVybmFsRXhwcmVzc2lvblR5cGVzLlNVQkVYUFJFU1NJT05fRU5EX0VYUFJFU1NJT05fVkFMVUUpOwotCQkJY29ubmVjdGlvbi5wdXNoSW50KHN1YmV4cHJlc3Npb25OdW1iZXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQljb25uZWN0aW9uLmNsb3NlKCk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQltYXJrSW52YWxpZChlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl0aHJvd0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJT19FWENFUFRJT05fTVNHKTsKLQkJfQotCQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZpZWxkUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmllbGRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGJiZDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmllbGRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUZpZWxkUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi1maW5hbCBjbGFzcyBSRU1GaWVsZFByb3h5IGV4dGVuZHMgUkVNQWNjZXNzaWJsZU9iamVjdFByb3h5IGltcGxlbWVudHMgSUZpZWxkUHJveHkgewotCXByaXZhdGUgSUJlYW5UeXBlUHJveHkgZkZpZWxkVHlwZTsKLQotCVJFTUZpZWxkUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGZpZWxkLgotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRGaWVsZFR5cGUoKSB7Ci0JCWlmIChmRmllbGRUeXBlID09IG51bGwpCi0JCQlmRmllbGRUeXBlID0KLQkJCQkoSUJlYW5UeXBlUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXRUeXBlKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKAotCQkJCQl0aGlzKTsKLQotCQlyZXR1cm4gZkZpZWxkVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBwcm94eSwgaS5lLiBtYXJrIGl0IGludmFsaWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZkZpZWxkVHlwZSA9IG51bGw7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgZnJvbSB0aGUgc3ViamVjdAotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldChJQmVhblByb3h5IHN1YmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIEZvcm1hdCBvZiBnZXR0ZXIgcGFybXMgaXM6IChPYmplY3QgKHN1YmplY3QpKS4KLQkJLy8gSWYgdGhlIGNvbXBvbmVudCB0eXBlIGlzIHByaW1pdGl2ZSwgd2UgbmVlZCB0byB1c2UgdGhlIGNvcnJlY3QgZ2V0dGVyIHNvIHRoYXQgYSB2YWxpZCB2YWx1ZSBpcyByZXR1cm5lZCwKLQkJLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JCUlCZWFuVHlwZVByb3h5IGZpZWxkVHlwZSA9IGdldEZpZWxkVHlwZSgpOwotCQlpZiAoIWZpZWxkVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkvLyBVc2Ugc3RhbmRhcmQgZ2V0dGVyLgotCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0KCkpLmludm9rZSh0aGlzLCBzdWJqZWN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIFVzZSB0aGUgY29ycmVjdCBwcmltaXRpdmUgZ2V0dGVyLgotCQkJaW50IGlkID0gKChJUkVNQmVhblByb3h5KSBmaWVsZFR5cGUpLmdldElEKCkuaW50VmFsdWUoKTsKLQkJCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIENvbW1hbmRzLkJZVEVfVFlQRSA6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldEJ5dGUoKSkuaW52b2tlKHRoaXMsIHN1YmplY3QpOwotCQkJCWNhc2UgQ29tbWFuZHMuQk9PTEVBTl9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSVJFTU1ldGhvZFByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldEZpZWxkR2V0Qm9vbGVhbigpKS5pbnZva2UoCi0JCQkJCQl0aGlzLAotCQkJCQkJc3ViamVjdCk7Ci0JCQkJY2FzZSBDb21tYW5kcy5DSEFSQUNURVJfVFlQRSA6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldENoYXIoKSkuaW52b2tlKHRoaXMsIHN1YmplY3QpOwotCQkJCWNhc2UgQ29tbWFuZHMuRE9VQkxFX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXREb3VibGUoKSkuaW52b2tlKAotCQkJCQkJdGhpcywKLQkJCQkJCXN1YmplY3QpOwotCQkJCWNhc2UgQ29tbWFuZHMuRkxPQVRfVFlQRSA6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldEZsb2F0KCkpLmludm9rZSgKLQkJCQkJCXRoaXMsCi0JCQkJCQlzdWJqZWN0KTsKLQkJCQljYXNlIENvbW1hbmRzLklOVEVHRVJfVFlQRSA6Ci0JCQkJCXJldHVybiAoKElSRU1NZXRob2RQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZEdldEludCgpKS5pbnZva2UodGhpcywgc3ViamVjdCk7Ci0JCQkJY2FzZSBDb21tYW5kcy5MT05HX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXRMb25nKCkpLmludm9rZSh0aGlzLCBzdWJqZWN0KTsKLQkJCQljYXNlIENvbW1hbmRzLlNIT1JUX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJUkVNTWV0aG9kUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RmllbGRHZXRTaG9ydCgpKS5pbnZva2UoCi0JCQkJCQl0aGlzLAotCQkJCQkJc3ViamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaW4gdGhpcyBzdWJqZWN0IHRvIHRoaXMgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eSB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRGaWVsZFNldCgpLmludm9rZSh0aGlzLCBuZXcgSUJlYW5Qcm94eVtdIHsgc3ViamVjdCwgdmFsdWUgfSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgcHJveHkgaXMgY29uc3RhbnQgcHJveHkgb3V0IG9mIHRoZSBtZXRob2QgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5maWVsZFR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZpZWxkVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZpZWxkVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODYyYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1GaWVsZFR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNRmllbGRUeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIEJlYW5UeXBlIFByb3h5IGZvciBNZXRob2QgY2xhc3MuCi0gKi8KLQotZmluYWwgY2xhc3MgUkVNRmllbGRUeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgewotCi1SRU1GaWVsZFR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIElCZWFuVHlwZVByb3h5IGFjY2Vzc2libGVUeXBlUHJveHkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkZJRUxEX0NMQVNTKSwgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuY2xhc3MuZ2V0TmFtZSgpLCBhY2Nlc3NpYmxlVHlwZVByb3h5KTsKLX0KLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIGFjY2Vzc2libGUgb2JqZWN0IHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogU3BlY2lhbGl6ZWQgZnJvbSBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIENvbnN0cnVjdG9yIHByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCXJldHVybiBuZXcgUkVNRmllbGRQcm94eShmUmVnaXN0cnksIG9iamVjdElEKTsKLX0KLQotLyoqCi0gKiBOb3RlOiBTaW5jZSBuZXcgaW5zdGFuY2VzIG9mIENvbnN0cnVjdG9yIGFyZSBuZXZlciBkb25lIHRocm91Z2ggYSBkZWZhdWx0IGN0b3IsCi0gKiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgeyAKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBOb3RlOiBTaW5jZSBuZXcgaW5zdGFuY2VzIG9mIENvbnN0cnVjdG9yIGFyZSBuZXZlciBkb25lIHRocm91Z2ggYW4gaW5pdGlhbGl6YXRpb24gc3RyaW5nLAotICogdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0JCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRDbGFzc0JlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk1N2M0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNRmxvYXRDbGFzc0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIHByb3h5IGltcGxlbWVudGF0aW9uIG9mIElOdW1iZXJCZWFuUHJveHkgZm9yIEZsb2F0LmNsYXNzCi0gKi8KLWNsYXNzIFJFTUZsb2F0Q2xhc3NCZWFuUHJveHkgZXh0ZW5kcyBSRU1OdW1iZXJCZWFuUHJveHkgewotCi1SRU1GbG9hdENsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgRmxvYXQgYUZsb2F0KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhRmxvYXQpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5mbG9hdENsYXNzOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldCgoRmxvYXQpIG51bWJlclZhbHVlKCkpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0M2I1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1GbG9hdENsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVBSb3h5IGZvciBGbG9hdC5jbGFzcwotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuRkxPQVRfQ0xBU1MpLCBGbG9hdC5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1GbG9hdENsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEZsb2F0KDBGKSk7CQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVGbG9hdEJlYW5Qcm94eShGbG9hdCBhRmxvYXQpIHsKLQlyZXR1cm4gKGFGbG9hdC5mbG9hdFZhbHVlKCkgIT0gMEYpID8KLQkJbmV3IFJFTUZsb2F0Q2xhc3NCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhRmxvYXQpIDogemVyb1Byb3h5OwotfQotCi0vKioKLSAqIEdlbmVyaWMgd2F5IHRvIGNyZWF0ZSBhbiBGbG9hdCBwcm94eSwgaG93ZXZlciwgdGhlIE51bWJlciBtdXN0IGJlIGEgRmxvYXQuCi0gKi8KLXByb3RlY3RlZCBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZU51bWJlckJlYW5Qcm94eShOdW1iZXIgYU51bWJlcikgewotCXJldHVybiBjcmVhdGVGbG9hdEJlYW5Qcm94eSgoRmxvYXQpIGFOdW1iZXIpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlRmxvYXRCZWFuUHJveHkobmV3IEZsb2F0KHZhbHVlLmFGbG9hdCkpOwotfQkKLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRUeXBlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWEwZTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRUeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNRmxvYXRUeXBlQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSU51bWJlckJlYW5Qcm94eSBmb3IgdGhlIHByaW1pdGl2ZSAiZmxvYXQiLgotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotY2xhc3MgUkVNRmxvYXRUeXBlQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJTnVtYmVyQmVhblByb3h5IHsKLQlwcml2YXRlIGZpbmFsIGZsb2F0IGZGbG9hdDsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTUZsb2F0VHlwZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIGZsb2F0IGFGbG9hdCkgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZkZsb2F0ID0gYUZsb2F0OwotfQotLyoqCi0gKiBlcXVhbHM6IEVxdWFsIGlmOgotICogICAgICAgICAxKSBUaGlzIHByb3h5ID09IChpZGVudGl0eSkgdG8gdGhlIG90aGVyIG9iamVjdAotICogICAgICAgICAyKSBFbHNlIGlmIG90aGVyIGlzIGFuIElCZWFuUHJveHkgYW5kIG5vdCBhIGNvbnN0YW50IG9uZSwgdGhlbiBpZgotICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLSAqICAgICAgICAgMykgSWYgdGhpcyBpcyBhIGNvbnN0YW50IHByb3h5IGFuZCB0aGUgb3RoZXIgaXMgdG9vIG9yIGlzIGEgY29uc3RhbnQKLSAqICAgICAgICAgICAgdmFsdWUgKGUuZy4gSVN0cmluZ0JlYW5Qcm94eS5lcXVhbHMoU3RyaW5nKSwgdGhlbiB0cnVlIGlmIHZhbHVlcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JaWYgKHRoaXMgPT0gYW5PYmplY3QpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFJFTUZsb2F0VHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZGbG9hdCA9PSAoKFJFTUZsb2F0VHlwZUJlYW5Qcm94eSkgYW5PYmplY3QpLmZsb2F0VmFsdWUoKTsKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpCi0JCXJldHVybiBmRmxvYXQgPT0gKChGbG9hdCkgYW5PYmplY3QpLmZsb2F0VmFsdWUoKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLSAqLwotcHVibGljIGJvb2xlYW4gc2FtZUFzKElCZWFuUHJveHkgYUJlYW5Qcm94eSkgewotCWlmICh0aGlzID09IGFCZWFuUHJveHkpCi0JCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCWlmIChhQmVhblByb3h5IGluc3RhbmNlb2YgUkVNRmxvYXRUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkZsb2F0ID09ICgoUkVNRmxvYXRUeXBlQmVhblByb3h5KSBhQmVhblByb3h5KS5mbG9hdFZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gKGJ5dGUpIGZGbG9hdDsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZGbG9hdDsKLX0KLS8qKgotICogZmxvYXRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JcmV0dXJuIGZGbG9hdDsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gKGludCkgZkZsb2F0OwotfQotLyoqCi0gKiBsb25nVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQlyZXR1cm4gKGxvbmcpIGZGbG9hdDsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIG5ldyBGbG9hdChmRmxvYXQpOwotfQotLyoqCi0gKiBzaG9ydFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQlyZXR1cm4gKHNob3J0KSBmRmxvYXQ7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZGbG9hdCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmZsb2F0VHlwZTsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoZkZsb2F0KTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzM3YWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNRmxvYXRUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNRmxvYXRUeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IGZvciBGbG9hdC5UWVBFLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNRmxvYXRUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5GTE9BVF9UWVBFKSwgRmxvYXQuVFlQRS5nZXROYW1lKCkpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1GbG9hdFR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAwRik7CQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlRmxvYXRCZWFuUHJveHkoZmxvYXQgYUZsb2F0KSB7Ci0JcmV0dXJuIChhRmxvYXQgIT0gMEYpID8KLQkJbmV3IFJFTUZsb2F0VHlwZUJlYW5Qcm94eShmUmVnaXN0cnksIGFGbG9hdCkgOiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBmbG9hdCBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlRmxvYXRCZWFuUHJveHkodmFsdWUuYUZsb2F0KTsKLX0KLQotLyoqCi0gKiBTaG9ydCBjdXQgZm9yIG5ld0luc3RhbmNlIHdoZXJlIHRoZSBzdHJpbmcgZm9sbG93cyB0aGUKLSAqIHNwZWNpZmljIHBhdHRlcm4gd2UgZXhwZWN0LiBUaGF0IHdheSBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2hpcCBvdmVyIHRvIHRoZSB2bSAKLSAqIHRvIHByb2Nlc3MgaXQuCi0gKgotICogVGhlIHBhdHRlcm4gaXQgY2FuIGFjY2VwdCBpczoKLSAqIAkxKSAoZmxvYXQpIHZhbGlkTnVtYmVyIC0gbnVtYmVyIGNhbiBiZSBhbnkgbnVtYmVyIGJlY2F1c2UgKGZsb2F0KSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBmbG9hdCB0byBkZXRlcm1pbmUgdGhlIHZhbGlkIG51bWJlci4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JU3RyaW5nIHRyaW0gPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJCi0JZmxvYXQgYUZsb2F0OwotCWlmICh0cmltLnN0YXJ0c1dpdGgoIihmbG9hdCkiKSkgeyAvLyROT04tTkxTLTEkCi0JCU51bWJlciB2ID0gcGFyc2VTdHJpbmcodHJpbS5zdWJzdHJpbmcoIihmbG9hdCkiLmxlbmd0aCgpKS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ICE9IG51bGwpCi0JCQlhRmxvYXQgPSB2LmZsb2F0VmFsdWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlhRmxvYXQgPSBGbG9hdC52YWx1ZU9mKGluaXRpYWxpemF0aW9uU3RyaW5nKS5mbG9hdFZhbHVlKCk7CS8vIFNlZSBpZiB2YWxpZCBmbG9hdCBmb3JtYXQuCi0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBDYW4ndCBkZWNvZGUgaXQsIGxldCBmdWxsIHBhcnNlciBoYW5kbGUgaXQuCi0JCX0KLQl9Ci0KLQlyZXR1cm4gZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChhRmxvYXQpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MzhmYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUkVNSW5pdEVycm9yQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLQotLyoqCi0gKiBBIHNwZWNpYWwgYmVhbiB0eXBlIHByb3h5LiBJdCBpcyBmb3IgdGhvc2UgYmVhbiB0eXBlcyB0aGF0IGhhZCBhbiBpbnN0YW50aWF0aW9uIGVycm9yIHdoaWxlIGJlaW5nIGluaXRpYWxpemVkLiBJdCBpcyBzbyB3ZSBoYXZlIHRoZSBtZXNzYWdlLiBBbGwKLSAqIG90aGVyIGFjdGlvbnMgYWdhaW5zdCBpdCB3aWxsIGZhaWwuCi0gKiAKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqLwotcHVibGljIGNsYXNzIFJFTUluaXRFcnJvckJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQmVhblR5cGVQcm94eSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGluaXRpYWxpemF0aW9uRXJyb3I7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGNsYXNzbmFtZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBSRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgaW5pdGlhbGl6YXRpb25FcnJvciwgU3RyaW5nIGNsYXNzbmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXRoaXMuaW5pdGlhbGl6YXRpb25FcnJvciA9IGluaXRpYWxpemF0aW9uRXJyb3I7Ci0JCXRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblR5cGVQcm94eSNuZXdCZWFuUHJveHkoamF2YS5sYW5nLkludGVnZXIpCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgYW5JRCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5UeXBlUHJveHkjbmV3QmVhblR5cGVGb3JDbGFzcyhqYXZhLmxhbmcuSW50ZWdlciwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0RmllbGRQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXREZWNsYXJlZEZpZWxkUHJveHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RGVjbGFyZWRGaWVsZFByb3h5KFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudENsYXNzTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKQotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NuYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWFsVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNBcnJheSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNJbnRlcmZhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc1ByaW1pdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzS2luZE9mKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzS2luZE9mKElCZWFuVHlwZVByb3h5IGFCZWFuUHJveHlUeXBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbml0aWFsaXphdGlvbkVycm9yKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxpemF0aW9uRXJyb3IoKSB7Ci0JCXJldHVybiBpbml0aWFsaXphdGlvbkVycm9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblByb3h5I2dldElEKCkKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLklSRU1CZWFuUHJveHkjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5Qcm94eSNyZW5kZXJCZWFuKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzLlZhbHVlT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgcmVuZGVySW50bykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNnZXRUeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSN0b0JlYW5TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjaXNWYWxpZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNzYW1lQXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JCXJldHVybiB0aGlzID09IGFCZWFuUHJveHk7IC8vIFRoaXMgaXMgcGxhY2UgaG9sZGVyIGFueXdheS4gU28gb25seSBpZGVudGljYWwgaWYgc2FtZSBwcm94eS4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgYXJndW1lbnRDbGFzc05hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlQ29uc3RydWN0b3Iob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29tcGF0aWJsZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNCZWFuUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmVhblByb3h5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzRXhwcmVzc2lvblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0V4cHJlc3Npb25Qcm94eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGVbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIG51bGw7CS8vIFNpbmNlIHRoaXMgZ3V5IGlzIGludmFsaWQsIHdlIGNhbid0IHJldHVybiBhIG1ldGhvZC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlI2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlZ2VyQ2xhc3NCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyNWM0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNSW50ZWdlckNsYXNzQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgUHJveHkgZm9yIEludGVnZXJzLiBTaW5jZSBJbnRlZ2VycyB3ZXJlIGZpcnN0IGltcGxlbWVudGVkCi0gKiBpbiB0aGUgVkNFLCBhbmQgYmVjYXVzZSB0aGV5IGFyZSBvZnRlbiByZWZlcmVuY2VkLCB3ZSd2ZSBjcmVhdGVkCi0gKiBhIHN1YmNsYXNzIHRvIGhhbmRsZSB0aGVtLiBUaGF0IHdheSB3ZSB3b3VsZG4ndCBuZWVkIHRvIGNoYW5nZQotICogZXZlcnlvbmUgdGhhdCB3YXMgdXNpbmcgdGhlIElJbnRlZ2VyUHJveHkgaW50ZXJmYWNlLgotICogQ3JlYXRpb24gZGF0ZTogKDA4LzMxLzAwIDExOjI4OjQ4IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1jbGFzcyBSRU1JbnRlZ2VyQ2xhc3NCZWFuUHJveHkgZXh0ZW5kcyBSRU1OdW1iZXJCZWFuUHJveHkgaW1wbGVtZW50cyBJSW50ZWdlckJlYW5Qcm94eSB7Ci0KLVJFTUludGVnZXJDbGFzc0JlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JbnRlZ2VyKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhbkludGVnZXIpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5pbnRlZ2VyQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KChJbnRlZ2VyKSBudW1iZXJWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQzNmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElOdW1iZXJCZWFuUHJveHkgZm9yIEludGVnZXIuY2xhc3MuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1JbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJSW50ZWdlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElJbnRlZ2VyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1JbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgbnVtYmVyVHlwZSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuSU5URUdFUl9DTEFTUyksIEludGVnZXIuY2xhc3MuZ2V0TmFtZSgpLCBudW1iZXJUeXBlKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNSW50ZWdlckNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMCkpOwkKLQlvbmVQcm94eSA9IG5ldyBSRU1JbnRlZ2VyQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcigxKSk7Ci0JdHdvUHJveHkgPSBuZXcgUkVNSW50ZWdlckNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMikpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNSW50ZWdlckNsYXNzQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMykpOwotCQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlJbnRlZ2VyQmVhblByb3h5IGNyZWF0ZUludGVnZXJCZWFuUHJveHkoSW50ZWdlciBhbkludGVnZXIpIHsKLQlzd2l0Y2goYW5JbnRlZ2VyLmludFZhbHVlKCkpIHsKLQkJY2FzZSAwOiByZXR1cm4gemVyb1Byb3h5OwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgUkVNSW50ZWdlckNsYXNzQmVhblByb3h5KGZSZWdpc3RyeSwgYW5JbnRlZ2VyKTsKLQl9Ci19Ci0KLS8qKgotICogR2VuZXJpYyB3YXkgdG8gY3JlYXRlIGFuIEludGVnZXIgcHJveHksIGhvd2V2ZXIsIHRoZSBOdW1iZXIgbXVzdCBiZSBhbiBJbnRlZ2VyLgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlSW50ZWdlckJlYW5Qcm94eSgoSW50ZWdlcikgYU51bWJlcik7Ci19CQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlSW50ZWdlckJlYW5Qcm94eShuZXcgSW50ZWdlcih2YWx1ZS5hbkludCkpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlclR5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlclR5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3Mjc4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNSW50ZWdlclR5cGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJSW50ZWdlckJlYW5Qcm94eSBmb3IgdGhlIHByaW1pdGl2ZSAiaW50Ii4KLSAqIEl0IGNhbiBhbnN3ZXIgYWxsIG9mIHRoZSBwcmltaXRpdmUgbnVtYmVyIHR5cGVzIChpbnQsIGxvbmcsIHNob3J0LCBieXRlLCBkb3VibGUsIGZsb2F0KS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWNsYXNzIFJFTUludGVnZXJUeXBlQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJSW50ZWdlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgZkludDsKLQotLyoqCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqIEBwYXJhbSBhQmVhbiBqYXZhLmxhbmcuT2JqZWN0Ci0gKi8KLVJFTUludGVnZXJUeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgaW50IGFuSW50KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmSW50ID0gYW5JbnQ7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNSW50ZWdlclR5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmSW50ID09ICgoUkVNSW50ZWdlclR5cGVCZWFuUHJveHkpIGFuT2JqZWN0KS5pbnRWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIEludGVnZXIpCi0JCXJldHVybiBmSW50ID09ICgoSW50ZWdlcikgYW5PYmplY3QpLmludFZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTUludGVnZXJUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZkludCA9PSAoKFJFTUludGVnZXJUeXBlQmVhblByb3h5KSBhQmVhblByb3h5KS5pbnRWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gKGJ5dGUpIGZJbnQ7Ci19Ci0vKioKLSAqIGRvdWJsZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotCXJldHVybiBmSW50OwotfQotLyoqCi0gKiBmbG9hdFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQlyZXR1cm4gZkludDsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZkludDsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIGZJbnQ7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBuZXcgSW50ZWdlcihmSW50KTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIChzaG9ydCkgZkludDsKLX0KLQotLyoqCi0gKiBUaGUgYmVhbidzIHRvU3RyaW5nLgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZkludCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmludFR5cGU7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KGZJbnQpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2M3MjRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgZm9yIEludGVnZXIuVFlQRS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJSW50ZWdlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJSW50ZWdlckJlYW5Qcm94eSBvbmVQcm94eTsKLQlwcml2YXRlIGZpbmFsIElJbnRlZ2VyQmVhblByb3h5IHR3b1Byb3h5OwotCXByaXZhdGUgZmluYWwgSUludGVnZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUludGVnZXJUeXBlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlzdXBlcihhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKENvbW1hbmRzLklOVEVHRVJfVFlQRSksIEludGVnZXIuVFlQRS5nZXROYW1lKCkpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDApOwkKLQlvbmVQcm94eSA9IG5ldyBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDEpOwotCXR3b1Byb3h5ID0gbmV3IFJFTUludGVnZXJUeXBlQmVhblByb3h5KGFSZWdpc3RyeSwgMik7Ci0JdGhyZWVQcm94eSA9IG5ldyBSRU1JbnRlZ2VyVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDMpOwotCQkKLX0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICogVXNlIHRoZSBjYWNoZSB0byBzZWUgaWYgdGhlIHZhbHVlIGlzIGJlaW5nIGhlbGQgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZQotICovCi1JSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVJbnRlZ2VyQmVhblByb3h5KGludCBhbkludCkgewotCi0Jc3dpdGNoKGFuSW50KSB7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJY2FzZSAxOiByZXR1cm4gb25lUHJveHkgOwotCQljYXNlIDI6IHJldHVybiB0d29Qcm94eSA7Ci0JCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQlkZWZhdWx0OiByZXR1cm4gbmV3IFJFTUludGVnZXJUeXBlQmVhblByb3h5KGZSZWdpc3RyeSwgYW5JbnQpOwotCX0KLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QuIGludGVnZXIgaXMgYSBwcmltaXRpdmUsIHNvIHRoZSBzdGFuZGFyZCB3YXkgd29uJ3Qgd29yay4KLSAqIFJldHVybiB0aGUgemVyb1Byb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gemVyb1Byb3h5OwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUludGVnZXJCZWFuUHJveHkodmFsdWUuYW5JbnQpOwotfQotCi0vKioKLSAqIFNob3J0IGN1dCBmb3IgbmV3SW5zdGFuY2Ugd2hlcmUgdGhlIHN0cmluZyBmb2xsb3dzIHRoZQotICogc3BlY2lmaWMgcGF0dGVybiB3ZSBleHBlY3QuIFRoYXQgd2F5IGl0IHdvbid0IGJlIG5lY2Vzc2FyeSB0byBzaGlwIG92ZXIgdG8gdGhlIHZtIAotICogdG8gcHJvY2VzcyBpdC4KLSAqCi0gKiBUaGUgcGF0dGVybiBpdCBjYW4gYWNjZXB0IGlzOgotICogCTEpIChpbnQpIHZhbGlkTnVtYmVyIC0gbnVtYmVyIGNhbiBiZSBhbnkgbnVtYmVyIGJlY2F1c2UgKGJ5dGUpIGV4cGxpY2l0bHkgY2FzdHMgaXQgZG93bi4KLSAqCTIpIHZhbGlkTnVtYmVyCi0gKiBJdCB3aWxsIHVzZSB0aGUgZGVjb2RlIGZ1bmN0aW9uIG9mIGludCB0byBkZXRlcm1pbmUgdGhlIHZhbGlkIG51bWJlci4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JU3RyaW5nIHRyaW0gPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJCi0JaW50IGFuSW50OwotCWlmICh0cmltLnN0YXJ0c1dpdGgoIihpbnQpIikpIHsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXIgdiA9IHBhcnNlU3RyaW5nKHRyaW0uc3Vic3RyaW5nKCIoaW50KSIubGVuZ3RoKCkpLnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHYgIT0gbnVsbCkKLQkJCWFuSW50ID0gdi5pbnRWYWx1ZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBDYW4ndCBkZWNvZGUgaXQsIGxldCBmdWxsIHBhcnNlciBoYW5kbGUgaXQuCi0JfSBlbHNlIHsKLQkJdHJ5IHsKLQkJCWFuSW50ID0gSW50ZWdlci5kZWNvZGUodHJpbSkuaW50VmFsdWUoKTsJLy8gU2VlIGlmIHZhbGlkIGludCBmb3JtYXQuCi0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBDYW4ndCBkZWNvZGUgaXQsIGxldCBmdWxsIHBhcnNlciBoYW5kbGUgaXQuCi0JCX0KLQl9Ci0KLQlyZXR1cm4gZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChhbkludCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVyZmFjZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzNzViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludGVyZmFjZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUludGVyZmFjZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIERlZmF1bHQgYmVhbnR5cGUgcHJveHkgZm9yIGFuIGludGVyZmFjZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUkVNSW50ZXJmYWNlQmVhblR5cGVQcm94eSBleHRlbmRzIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB7Ci0JCi0JcHJvdGVjdGVkIFJFTUludGVyZmFjZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgbnVsbCk7Ci0JfQotCQotCS8qKiAKLQkgKiBJbnRlcmZhY2VzIGFyZSBpbnRlcmZhY2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotCSAqCi0JICogRm9yIGFsbCBvZiB0aGUgaW50ZXJmYWNlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLiAKLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIEZvciBhbGwgb2YgdGhlIGludGVyZmFjZSB0eXBlcywgeW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIGZvciBzdWJjbGFzc2VzIHNpbmNlCi0JICogaW50ZXJmYWNlIGFyZW4ndCBzdWJjbGFzc2FibGUsIG9ubHkgZXh0ZW5kYWJsZS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdGFjdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBpbnRlcmZhY2VzIGNhbiBuZXZlciBiZSBkb25lLAotCSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsgCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZykgaXMgdmFsaWQgYmVjYXVzZSBpdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUKLQkgKiBhbiBpbnN0YW5jZSBvZiBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlLgotCSAqLwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludm9rYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1JbnZva2FibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4ZWU4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUludm9rYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTUludm9rYWJsZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklJbnZva2FibGU7Ci0gCi0KLS8qKgotICogUmVtb3RlIEludm9rYWJsZS4gVGhpcyBpbnZva2VzIG9uIHRoZSByZW1vdGUgdm0sIGJ1dCBpdCBkb2Vzbid0IHVzZSBhIG1ldGhvZCBwcm94eS4gSW5zdGVhZAotICogaXQgc2VuZHMgdGhlIGluZm9ybWF0aW9uIHRvIGdldCB0aGUgbWV0aG9kIHRvIHRoZSByZW1vdGUgdm0gYWxvbmcgd2l0aCB0aGUgcGFybXMuIFRoYXQgd2F5Ci0gKiBpdCB3aWxsIGRvIHRoZSBsb29rdXAgb24gdGhlIHJlbW90ZSB2bSBhbmQgd2UgZG9uJ3QgaGF2ZSB0aGUgb3ZlcmhlYWQgb2YgdHdvIGNhbGxzLCBvbmUgdG8KLSAqIGdldCB0aGUgbWV0aG9kcHJveHkgYW5kIHRoZSBvdGhlciB0byBhY3R1YWxseSBkbyB0aGUgaW52b2tlLiBUaGlzIHNob3VsZCB0eXBpY2FsbHkgYmUgdXNlZAotICogb25seSBmb3IgaW5mcmVxdWVudCBjYWxscyBzbyB0aGF0IGNhY2hlIG9mIHRoZSBtZXRob2QgcHJveHkgaXMgbm90IG5lZWRlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLWNsYXNzIFJFTUludm9rYWJsZSBpbXBsZW1lbnRzIElJbnZva2FibGUgewotCi0JcHJvdGVjdGVkIGZpbmFsIElSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlOwkvLyBCZWFudHlwZSB0byBnZXQgbWV0aG9kIGZyb20uCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lOwkvLyBNZXRob2QgbmFtZQotCXByb3RlY3RlZCBmaW5hbCBJQmVhblR5cGVQcm94eVtdIG1ldGhvZEFyZ1R5cGVzOwkvLyBBcmd1bWVudCB0eXBlcyAob3IgbnVsbCBpZiBubyBhcmd1bWVudHMpLgotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5OwkvLyBGYWN0b3J5IGZvciB0aGlzIGludm9rYWJsZQotCQotCQotCVJFTUludm9rYWJsZShJUkVNQmVhblR5cGVQcm94eSBiZWFuVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gbWV0aG9kQXJnVHlwZXMpIHsKLQkJdGhpcy5iZWFuVHlwZSA9IGJlYW5UeXBlOwotCQl0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQl0aGlzLm1ldGhvZEFyZ1R5cGVzID0gbWV0aG9kQXJnVHlwZXM7Ci0JCXRoaXMuZmFjdG9yeSA9IChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgYmVhblR5cGUuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKTsKLQl9Ci0JCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCAoSUJlYW5Qcm94eVtdKSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5W10gcGFybXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBpbnZva2VXaXRoUGFybXMoc3ViamVjdCwgcGFybXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBpbnRlcm5hbCBtZXRob2QgdGhhdCBhbGxvd3MgbWl4dHVyZSBvZiBjb25zdGFudHMgKGUuZy4gU3RyaW5nKSB3aXRoIGJlYW4gcHJveGllcy4KLQkgKiBBIHBhcm0gdmFsdWUgY2FuIGJlIGEgUkVNTWV0aG9kUHJveHkuUGFybUFycmF5LiBUaGlzIG1lYW5zIHRoaXMgcGFybSBpcyBhbiBhcnJheSB0aGF0Ci0JICogbmVlZHMgdG8gaGF2ZSBhIFZhbHVlUmV0cmlldmVyIGNyZWF0ZWQgZm9yIGl0LiBUaGlzIGlzIHVzZWQgaWYgdGhlIGFycmF5IGhhcyBJRCdzIGluCi0JICogaXQgYW5kIGlzIG5vdCBhbiBleGlzdGluZyBhcnJheSBvbiB0aGUgc2VydmVyIG9yIGFsbCBjb25zdGFudCB2YWx1ZXMuCi0JICoKLQkgKiBOT1RFOiBJdCBpcyBhc3N1bWVkIHRoYXQgYWxsIElCZWFuVHlwZVByb3hpZXMgb2YgdGhlIHBhcm1zIGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZC4KLQkgKiAgICAgICBJdCBzaG91bGQgc3RpbGwgd29yaywgYnV0IGl0IGNvdWxkIGJlIGFza2luZyBmb3IgdGhlbSBpbiB0aGUgbWlkZGxlIG9mIHRoZSByZXF1ZXN0Ci0JICogICAgICAgaWYgdGhleSBhcmUgbm90IGZpcnN0IGdvdHRvbi4KLQkgKgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZVdpdGhQYXJtcyhJQmVhblByb3h5IHN1YmplY3QsIGZpbmFsIE9iamVjdFtdIHBhcm1zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZmFjdG9yeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQlSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JCXByb3h5RmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7IC8vIFRoaXMgaXMgZGVmaW5hdGVseSBhIHRyYW5zYWN0aW9uLCBzbyBzdGFydCBpdC4KLQkJdHJ5IHsKLQkJCS8vIEZpcnN0IG5lZWQgdG8gc2VuZCB0aGUgbWV0aG9kIGluZm8uCi0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBjbGFzc1ZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQliZWFuVHlwZS5yZW5kZXJCZWFuKGNsYXNzVmFsdWUpOwotCQkJCi0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtVHlwZXNWYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJaWYgKG1ldGhvZEFyZ1R5cGVzICE9IG51bGwpIHsKLQkJCQljbGFzcyBSZXRyaWV2ZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVJldHJpZXZlIHsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJT2JqZWN0W10gYXJyYXk7Ci0JCQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHdvcmtlciA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCi0JCQkJCXB1YmxpYyBSZXRyaWV2ZXIoT2JqZWN0W10gYW5BcnJheSkgewotCQkJCQkJYXJyYXkgPSBhbkFycmF5OwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IG5leHRWYWx1ZSgpIHsKLQkJCQkJCU9iamVjdCBwYXJtID0gYXJyYXlbaW5kZXgrK107Ci0JCQkJCQkoKElSRU1CZWFuVHlwZVByb3h5KSBwYXJtKS5yZW5kZXJCZWFuKHdvcmtlcik7Ci0JCQkJCQlyZXR1cm4gd29ya2VyOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCXBhcm1UeXBlc1ZhbHVlLnNldEFycmF5SURTKG5ldyBSZXRyaWV2ZXIobWV0aG9kQXJnVHlwZXMpLCBtZXRob2RBcmdUeXBlcy5sZW5ndGgsIENvbW1hbmRzLkNMQVNTX0NMQVNTKTsgLy8gQ3JlYXRlIENsYXNzW10uCi0JCQl9Ci0JCQkKLQkJCQotCQkJLy8gTm93IHdlIHN0YXJ0IGJ1aWxkaW5nIHRoZSBhY3R1YWwgaW52b2NhdGlvbi4KLQkJCQotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgc3ViamVjdFZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQlpZiAoc3ViamVjdCAhPSBudWxsKQotCQkJCSAoKElSRU1CZWFuUHJveHkpIHN1YmplY3QpLnJlbmRlckJlYW4oc3ViamVjdFZhbHVlKTsKLQotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgcGFybXNWYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCi0JCQlpZiAocGFybXMgIT0gbnVsbCkgewotCQkJCS8vIEhhdmUgYSBsb2NhbCBkZWZpbml0aW9uIG9mIHRoZSByZXRyaWV2ZXIgc28gdGhhdCB0aGUgcmV0cmlldmVyIGNhbiBjcmVhdGUKLQkJCQkvLyBhbm90aGVyIG9uZSBvZiBpdHNlbGYgaWYgbmVjZXNzYXJ5LgotCQkJCWZpbmFsIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCi0JCQkJY2xhc3MgUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCU9iamVjdFtdIGFycmF5OwotCQkJCQlDb21tYW5kcy5WYWx1ZU9iamVjdCB3b3JrZXIgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQotCQkJCQlwdWJsaWMgUmV0cmlldmVyKE9iamVjdFtdIGFuQXJyYXkpIHsKLQkJCQkJCWFycmF5ID0gYW5BcnJheTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQkJCQlPYmplY3QgcGFybSA9IGFycmF5W2luZGV4KytdOwotCQkJCQkJaWYgKHBhcm0gIT0gbnVsbCkKLQkJCQkJCQlpZiAocGFybSBpbnN0YW5jZW9mIElSRU1CZWFuUHJveHkpCi0JCQkJCQkJCSAoKElSRU1CZWFuUHJveHkpIHBhcm0pLnJlbmRlckJlYW4od29ya2VyKTsKLQkJCQkJCQllbHNlIGlmIChwYXJtIGluc3RhbmNlb2YgVHJhbnNtaXRhYmxlQXJyYXkpIHsKLQkJCQkJCQkJLy8gSXQgaXMgYW5vdGhlciBhcnJheSwgY3JlYXRlIGEgbmV3IHJldHJpZXZlci4KLQkJCQkJCQkJd29ya2VyLnNldEFycmF5SURTKAotCQkJCQkJCQkJbmV3IFJldHJpZXZlcigoKFRyYW5zbWl0YWJsZUFycmF5KSBwYXJtKS5hcnJheSksCi0JCQkJCQkJCQkoKFRyYW5zbWl0YWJsZUFycmF5KSBwYXJtKS5hcnJheS5sZW5ndGgsCi0JCQkJCQkJCQkoKFRyYW5zbWl0YWJsZUFycmF5KSBwYXJtKS5jb21wb25lbnRUeXBlSUQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIEl0J3MgYW4gb2JqZWN0LiBOZWVkIHRvIGdldCBiZWFuIHR5cGUgc28gdGhhdCB3ZSBjYW4gc2VuZCBpdC4KLQkJCQkJCQkJSVJFTUJlYW5Qcm94eSB0eXBlID0gKElSRU1CZWFuUHJveHkpIHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkocGFybS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCQkJCWludCBjbGFzc0lEID0gdHlwZS5nZXRJRCgpLmludFZhbHVlKCk7Ci0JCQkJCQkJCXdvcmtlci5zZXRBc09iamVjdChwYXJtLCBjbGFzc0lEKTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJd29ya2VyLnNldCgpOwotCQkJCQkJcmV0dXJuIHdvcmtlcjsgCi0JCQkJCX0KLQkJCQl9OwotCi0JCQkJcGFybXNWYWx1ZS5zZXRBcnJheUlEUyhuZXcgUmV0cmlldmVyKHBhcm1zKSwgcGFybXMubGVuZ3RoLCBDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOyAvLyBDcmVhdGUgT2JqZWN0W10uCi0JCQl9Ci0KLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQl0cnkgewotCQkJCWludm9rZShjb25uZWN0LCBwcm94eUZhY3RvcnksIGNsYXNzVmFsdWUsIHBhcm1UeXBlc1ZhbHVlLCBzdWJqZWN0VmFsdWUsIHBhcm1zVmFsdWUsIHJldHVyblZhbHVlKTsKLQkJCQlyZXR1cm4gcHJveHlGYWN0b3J5LmdldEJlYW5Qcm94eShyZXR1cm5WYWx1ZSk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCS8vIENsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uCi0JCQkJCWZhY3RvcnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJY29ubmVjdCA9IGZhY3RvcnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWludm9rZShjb25uZWN0LCBwcm94eUZhY3RvcnksIGNsYXNzVmFsdWUsIHBhcm1UeXBlc1ZhbHVlLCBzdWJqZWN0VmFsdWUsIHBhcm1zVmFsdWUsIHJldHVyblZhbHVlKTsKLQkJCQkJCXJldHVybiBwcm94eUZhY3RvcnkuZ2V0QmVhblByb3h5KHJldHVyblZhbHVlKTsKLQkJCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlQWdhaW4pIHsKLQkJCQkJCS8vIEZhaWxlZCBhZ2Fpbi4gSnVzdCBjbG9zZSBhbmQgcHJpbnQgdHJhY2UuCi0JCQkJCQlmYWN0b3J5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGVBZ2FpbikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEEgcmVjb3ZlcmFibGUgZXJyb3IsIHByaW50IHRyYWNlIGFuZCByZXR1cm4KLQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwcm94eUZhY3Rvcnkuc3RvcFRyYW5zYWN0aW9uKCk7Ci0JCQlpZiAoY29ubmVjdCAhPSBudWxsKQotCQkJCWZhY3RvcnkucmV0dXJuQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJfQotCX0KLQotcHJpdmF0ZSB2b2lkIGludm9rZSgKLQkJSVJFTUNvbm5lY3Rpb24gY29ubmVjdCwKLQkJUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSwKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgY2xhc3NUeXBlVmFsdWUsCi0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1UeXBlc1ZhbHVlLAotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBzdWJqZWN0VmFsdWUsCi0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHBhcm1zVmFsdWUsCi0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHJldHVyblZhbHVlKQotCQl0aHJvd3MgVGhyb3dhYmxlUHJveHksIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJY29ubmVjdC5pbnZva2VNZXRob2QoY2xhc3NUeXBlVmFsdWUsIG1ldGhvZE5hbWUsIHBhcm1UeXBlc1ZhbHVlLCBzdWJqZWN0VmFsdWUsIHBhcm1zVmFsdWUsIHJldHVyblZhbHVlKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCXByb3h5RmFjdG9yeS5wcm9jZXNzRXJyb3JSZXR1cm4oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2UoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5IHBhcm0pIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBpbnZva2Uoc3ViamVjdCwgbmV3IElCZWFuUHJveHlbXSB7IHBhcm0gfSk7Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0LCBJQmVhblByb3h5W10gcGFybXMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCwgcGFybXMpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlmYWN0b3J5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgcGFybSkgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCBwYXJtKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZmFjdG9yeS5yZWxlYXNlUHJveHkoZSk7IC8vIFNpbmNlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCwgZ2V0IHJpZCBvZiBub3cgaW5zdGVhZCBvZiBHQyB0aW1lLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ0NsYXNzQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdDbGFzc0JlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYThhMmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ0NsYXNzQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Mb25nQ2xhc3NCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBQcm94eSBmb3IgTG9uZy5jbGFzcy4KLSAqLwotY2xhc3MgUkVNTG9uZ0NsYXNzQmVhblByb3h5IGV4dGVuZHMgUkVNTnVtYmVyQmVhblByb3h5IHsKLQotUkVNTG9uZ0NsYXNzQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTG9uZyBhTG9uZykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUxvbmcpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5sb25nQ2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KChMb25nKSBudW1iZXJWYWx1ZSgpKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ0NsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzZhOGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ0NsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNTG9uZ0NsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElCZWFuVHlwZVByb3h5IExvbmcuY2xhc3MuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDE6NDAgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1Mb25nQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3ROdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBudW1iZXJUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX0NMQVNTKSwgTG9uZy5jbGFzcy5nZXROYW1lKCksIG51bWJlclR5cGUpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1Mb25nQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgTG9uZygwKSk7CQotCW9uZVByb3h5ID0gbmV3IFJFTUxvbmdDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBMb25nKDEpKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1Mb25nQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgTG9uZygyKSk7Ci0JdGhyZWVQcm94eSA9IG5ldyBSRU1Mb25nQ2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgTG9uZygzKSk7CQkKLX0KLQotLyoqCi0gKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlTG9uZ0JlYW5Qcm94eShMb25nIGFMb25nKSB7Ci0JaWYgKGFMb25nLmxvbmdWYWx1ZSgpID49IDAgJiYgYUxvbmcubG9uZ1ZhbHVlKCkgPCA0KSB7Ci0JCS8vIFN3aXRjaCBzdGF0ZW1lbnRzIGRvbid0IHdvcmsgd2l0aCBsb25ncy4KLQkJc3dpdGNoKGFMb25nLmludFZhbHVlKCkpIHsKLQkJCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQl9Ci0JfSAKLQlyZXR1cm4gbmV3IFJFTUxvbmdDbGFzc0JlYW5Qcm94eShmUmVnaXN0cnksIGFMb25nKTsKLX0KLQotLyoqCi0gKiBHZW5lcmljIHdheSB0byBjcmVhdGUgYSBMb25nIHByb3h5LCBob3dldmVyLCB0aGUgTnVtYmVyIG11c3QgYmUgYSBMb25nLgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlTG9uZ0JlYW5Qcm94eSgoTG9uZykgYU51bWJlcik7Ci19CQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gTnVtYmVyJ3MgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgY3Rvciwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvIHByb3h5IGZvciB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgdGhlIFZhbHVlT2JqZWN0IHBhc3NlZCBpbi4KLSAqIFdlIHdpbGwgYXNzdW1lIHRoZSBvYmplY3QgaXMgY29ycmVjdCB0eXBlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQlyZXR1cm4gY3JlYXRlTG9uZ0JlYW5Qcm94eShuZXcgTG9uZyh2YWx1ZS5hTG9uZykpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ1R5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ1R5cGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyNjYyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTUxvbmdUeXBlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNTG9uZ1R5cGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciB0aGUgcHJpbWl0aXZlICJsb25nIi4KLSAqIEl0IGNhbiBhbnN3ZXIgYWxsIG9mIHRoZSBwcmltaXRpdmUgbnVtYmVyIHR5cGVzIChpbnQsIGxvbmcsIHNob3J0LCBieXRlLCBkb3VibGUsIGZsb2F0KS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMjo1NCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWNsYXNzIFJFTUxvbmdUeXBlQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJTnVtYmVyQmVhblByb3h5IHsKLQlwcml2YXRlIGZpbmFsIGxvbmcgZkxvbmc7Ci0KLS8qKgotICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkCi0gKiBpbiBhIHNwZWNpYWwgd2F5IGFuZCBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZW0uCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1SRU1Mb25nVHlwZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIGxvbmcgYUxvbmcpIHsKLQlzdXBlcihhUmVnaXN0cnkpOwotCWZMb25nID0gYUxvbmc7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNTG9uZ1R5cGVCZWFuUHJveHkpCi0JCXJldHVybiBmTG9uZyA9PSAoKFJFTUxvbmdUeXBlQmVhblByb3h5KSBhbk9iamVjdCkubG9uZ1ZhbHVlKCk7Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgTG9uZykKLQkJcmV0dXJuIGZMb25nID09ICgoTG9uZykgYW5PYmplY3QpLmxvbmdWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotICovCi1wdWJsaWMgYm9vbGVhbiBzYW1lQXMoSUJlYW5Qcm94eSBhQmVhblByb3h5KSB7Ci0JaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFCZWFuUHJveHkgaW5zdGFuY2VvZiBSRU1Mb25nVHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZMb25nID09ICgoUkVNTG9uZ1R5cGVCZWFuUHJveHkpIGFCZWFuUHJveHkpLmxvbmdWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogYnl0ZVZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JcmV0dXJuIChieXRlKSBmTG9uZzsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZMb25nOwotfQotLyoqCi0gKiBmbG9hdFZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQlyZXR1cm4gZkxvbmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgaW50IHZhbHVlCi0gKi8KLXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0JcmV0dXJuIChpbnQpIGZMb25nOwotfQotLyoqCi0gKiBsb25nVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQlyZXR1cm4gZkxvbmc7Ci19Ci0vKioKLSAqIG51bWJlclZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgTnVtYmVyIG51bWJlclZhbHVlKCkgewotCXJldHVybiBuZXcgTG9uZyhmTG9uZyk7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiAoc2hvcnQpIGZMb25nOwotfQotCi0vKioKLSAqIFRoZSBiZWFuJ3MgdG9TdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCXJldHVybiBTdHJpbmcudmFsdWVPZihmTG9uZyk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmxvbmdUeXBlOwotfQotCi0vKioKLSAqIFJlbmRlciB0aGUgYmVhbiBpbnRvIHZhbHVlIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXZhbHVlLnNldChmTG9uZyk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmM2ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgTG9uZy5UWVBFLwotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNTG9uZ1R5cGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSBvbmVQcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdHdvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHRocmVlUHJveHk7Ci0vKioKLSAqIFJFTUludGVnZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX1RZUEUpLCBMb25nLlRZUEUuZ2V0TmFtZSgpKTsKLQkKLQkvLyBDcmVhdGUgdGhlIGNhY2hlZCB2YWx1ZXMKLQl6ZXJvUHJveHkgPSBuZXcgUkVNTG9uZ1R5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAwKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNTG9uZ1R5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAxKTsKLQl0d29Qcm94eSA9IG5ldyBSRU1Mb25nVHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIDIpOwotCXRocmVlUHJveHkgPSBuZXcgUkVNTG9uZ1R5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAzKTsJCQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVMb25nQmVhblByb3h5KGxvbmcgYUxvbmcpIHsKLQlpZiAoYUxvbmcgPj0gMCAmJiBhTG9uZyA8IDQpIHsKLQkJLy8gU3dpdGNoIHN0YXRlbWVudHMgZG9uJ3Qgd29yayB3aXRoIGxvbmdzLgotCQlzd2l0Y2goKGludCkgYUxvbmcpIHsKLQkJCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eTsKLQkJCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJCWNhc2UgMzogcmV0dXJuIHRocmVlUHJveHkgOwotCQl9Ci0JfSAKLQlyZXR1cm4gbmV3IFJFTUxvbmdUeXBlQmVhblByb3h5KGZSZWdpc3RyeSwgYUxvbmcpOwotfQotCi0vKioKLSAqIG5ld0luc3RhbmNlIG1ldGhvZC4gbG9uZyBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19CQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZUxvbmdCZWFuUHJveHkodmFsdWUuYUxvbmcpOwotfQotCi0vKioKLSAqIFNob3J0IGN1dCBmb3IgbmV3SW5zdGFuY2Ugd2hlcmUgdGhlIHN0cmluZyBmb2xsb3dzIHRoZQotICogc3BlY2lmaWMgcGF0dGVybiB3ZSBleHBlY3QuIFRoYXQgd2F5IGl0IHdvbid0IGJlIG5lY2Vzc2FyeSB0byBzaGlwIG92ZXIgdG8gdGhlIHZtIAotICogdG8gcHJvY2VzcyBpdC4KLSAqCi0gKiBUaGUgcGF0dGVybiBpdCBjYW4gYWNjZXB0IGlzOgotICogCTEpIChsb25nKSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChieXRlKSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBsb25nIHRvIGRldGVybWluZSB0aGUgdmFsaWQgbnVtYmVyLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ2xhc3NDYXN0RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQlTdHJpbmcgdHJpbSA9IGluaXRpYWxpemF0aW9uU3RyaW5nLnRyaW0oKTsKLQlpZiAodHJpbS5sZW5ndGgoKSA9PSAwKQotCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwotCWxvbmcgYUxvbmc7Ci0JaWYgKHRyaW0uc3RhcnRzV2l0aCgiKGxvbmcpIikpIHsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXIgdiA9IHBhcnNlU3RyaW5nKHRyaW0uc3Vic3RyaW5nKCIobG9uZykiLmxlbmd0aCgpKS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ICE9IG51bGwpCi0JCQlhTG9uZyA9IHYubG9uZ1ZhbHVlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQl9IGVsc2UgewotCQlpZiAodHJpbS5jaGFyQXQodHJpbS5sZW5ndGgoKS0xKSA9PSAnTCcgfHwgdHJpbS5jaGFyQXQodHJpbS5sZW5ndGgoKS0xKSA9PSAnbCcpCi0JCQl0cmltID0gdHJpbS5zdWJzdHJpbmcoMCwgdHJpbS5sZW5ndGgoKS0xKTsKLQkJdHJ5IHsKLQkJCWFMb25nID0gTG9uZy5kZWNvZGUodHJpbSkubG9uZ1ZhbHVlKCk7CS8vIFNlZSBpZiB2YWxpZCBsb25nIGZvcm1hdC4KLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIENhbid0IGRlY29kZSBpdCwgbGV0IGZ1bGwgcGFyc2VyIGhhbmRsZSBpdC4KLQkJfQotCX0KLQotCXJldHVybiBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGFMb25nKTsKLX0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWFzdGVyU2VydmVyVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1hc3RlclNlcnZlclRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWU2MGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWFzdGVyU2VydmVyVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNTWFzdGVyU2VydmVyVGhyZWFkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi0vKioKLSAqIE1hc3RlciBTZXJ2ZXIgdGhyZWFkIGZvciB0aGUgUmVtb3RlIFZNcy4KLSAqIAotICogSXQgcmVzcG9uZHMgdG8gdGhlIHJlbW90ZSB2bSByZXF1ZXN0cyB0byB0aGlzIElERS4KLSAqIAotICogSXQgaXMgcGFja2FnZS1wcm90ZWN0ZWQgYmVjYXVzZSBvbmx5IFByb3h5UmVtb3RlUGx1Z3VpbiBzaG91bGQgYWNjZXNzIGl0LgotICogQGF1dGhvciByaWNoa3VscAotICovCi1jbGFzcyBSRU1NYXN0ZXJTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQotCXByb3RlY3RlZCBTZXJ2ZXJTb2NrZXQgbWFzdGVyU2VydmVyU29ja2V0OwotCXByb3RlY3RlZCBSRU1SZWdpc3RyeUNvbnRyb2xsZXIgcmVnaXN0cnlDb250cm9sbGVyOwotCXByb3RlY3RlZCBib29sZWFuIHNodXR0aW5nRG93biA9IGZhbHNlOwotCQotCS8vIEtsdWRnZTogQnVnIGluIExpbnV4IDEuMy54eHggb2YgSlZNLiBDbG9zaW5nIGEgc29ja2V0IHdoaWxlIHRoZSBzb2NrZXQgaXMgYmVpbmcgcmVhZC9hY2NlcHQgd2lsbCBub3QgaW50ZXJydXB0IHRoZQotCS8vIHdhaXQuIE5lZWQgdG8gdGltZW91dCB0byB0aGUgc29ja2V0IHJlYWQvYWNjZXB0IGJlZm9yZSB0aGUgc29ja2V0IGNsb3NlIHdpbGwgYmUgbm90aWNlZC4gVGhpcyBoYXMgYmVlbiBmaXhlZAotCS8vIGluIExpbnV4IDEuNC4gU28gb24gTGludXggMS4zIG5lZWQgdG8gcHV0IHRpbWVvdXRzIGluIG9uIHRob3NlIHNvY2tldHMgdGhhdCBjYW4gYmUgc2VwYXJhdGVseSBjbG9zZWQgd2hpbGUgcmVhZGluZy9hY2NlcHRpbmcuCi0Jc3RhdGljIGJvb2xlYW4gTElOVVhfMV8zID0gImxpbnV4Ii5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSAmJiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIsIiIpLnN0YXJ0c1dpdGgoIjEuMyIpOwkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCi0JCi0JcHVibGljIFJFTU1hc3RlclNlcnZlclRocmVhZChSRU1SZWdpc3RyeUNvbnRyb2xsZXIgcmVnaXN0cnlDb250cm9sbGVyKSB7Ci0JCXN1cGVyKCJSZW1vdGUgUHJveHkgTWFzdGVyIFNlcnZlciBUaHJlYWQiKTsJLy8kTk9OLU5MUy0xJAotCQl0aGlzLnJlZ2lzdHJ5Q29udHJvbGxlciA9IHJlZ2lzdHJ5Q29udHJvbGxlcjsKLQkJCi0JCXRyeSB7Ci0JCQltYXN0ZXJTZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KDAsIDUwLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoImxvY2FsaG9zdCIpKTsJLy8gQW55IGF2YWlsYWJsZSBwb3J0IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChMSU5VWF8xXzMpCi0JCQkJbWFzdGVyU2VydmVyU29ja2V0LnNldFNvVGltZW91dCgxMDAwKTsJLy8gTGludXggMS4zIGJ1Zywgc2VlIGNvbW1lbnQgb24gTElOVVhfMV8zCi0JCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsJLy8gVGhpcyBpcyBiYWQuIFNob3VsZCBiZSBubyBleGNlcHRpb25zIGNyZWF0aW5nIGEgc29ja2V0LiAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsJCQkJCi0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsJLy8gVGhpcyBpcyBiYWQuIFNob3VsZCBiZSBubyBleGNlcHRpb25zIGNyZWF0aW5nIGEgc29ja2V0LiAvLyROT04tTkxTLTEkCi0JCX0JCQkKLQl9Ci0KLQlwdWJsaWMgU2VydmVyU29ja2V0IGdldE1hc3RlclNvY2tldCgpIHsKLQkJcmV0dXJuIG1hc3RlclNlcnZlclNvY2tldDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJd2hpbGUgKG1hc3RlclNlcnZlclNvY2tldCAhPSBudWxsKSB7Ci0JCQkJU29ja2V0IGluY29taW5nID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbmNvbWluZyA9IG1hc3RlclNlcnZlclNvY2tldC5hY2NlcHQoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7IC8vIFRpbWVvdXQsIHRyeSBhZ2FpbgotCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7CS8vIEluIExpbnV4IDEuMyBjYXNlIG1hc3RlclNlcnZlclNvY2tldCBjb3VsZCBvZiBnb25lIG51bGwgYmV0d2VlbiBsb29wIHRlc3QgYW5kIHRyeSBibG9jay4KLQkJCQl9Ci0JCQkJYm9vbGVhbiBjbG9zZSA9IGZhbHNlOwkvLyBwcm9jZXNzIHJlcXVlc3Qgd2lsbCB0ZWxsIGlmIHNvY2tldCBzaG91bGQgYmUgY2xvc2VkLiBpdCBtYXkgYmUgcGFzc2VkIG9udG8gY2FsbGJhY2sgdGhyZWFkIGluc3RlYWQuCi0JCQkJdHJ5IHsKLQkJCQkJY2xvc2UgPSBwcm9jZXNzUmVxdWVzdChpbmNvbWluZyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGNsb3NlKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJaW5jb21pbmcuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotfQotCQkJCWluY29taW5nID0gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmICghc2h1dHRpbmdEb3duKQotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXNodXRkb3duKCk7CS8vIEVpdGhlciBhIGJhZCBleGNlcHRpb24gb3Igd2Ugd2VyZSBjbG9zZWQuIEVpdGhlciB3YXkgaXMgc2h1dGRvd24uCi0JfQotCQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIHJlcXVlc3QgYSBzaHV0ZG93bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0U2h1dGRvd24oKSB7CQkKLQkJaWYgKG1hc3RlclNlcnZlclNvY2tldCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBDbG9zaW5nIHRoZSBzZXJ2ZXIgc29ja2V0IHNob3VsZCBjYXVzZSBhIGJyZWFrLgotCQl0cnkgewotCQkJc2h1dHRpbmdEb3duID0gdHJ1ZTsKLQkJCW1hc3RlclNlcnZlclNvY2tldC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybjsKLQl9CQotCQotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NSZXF1ZXN0KFNvY2tldCByZW1vdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFJbnB1dFN0cmVhbQlpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0ocmVtb3RlLmdldElucHV0U3RyZWFtKCkpOwotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHJlbW90ZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0JCWJvb2xlYW4gIGNsb3NlID0gdHJ1ZTsJLy8gZmxhZyBpbmRpY2F0aW5nIHNvY2tldCBub3QgZ2l2ZW4gb3ZlciB0byBjYWxsYmFjay4gRG9uJ3QgY2xvc2UgdGhlIHNvY2tldCB3aGVuIGRvbmUgYmVjYXVzZSBjYWxsYmFjayBoYXMgaXQuCi0JCXRyeSB7Ci0JCQlieXRlIGNtZCA9IGluLnJlYWRCeXRlKCk7Ci0JCQlzd2l0Y2ggKGNtZCkgewotCQkJCWNhc2UgQ29tbWFuZHMuQUxJVkU6Ci0JCQkJCWludCByZWdpc3RyeUlEID0gaW4ucmVhZEludCgpOwotCQkJCQlvdXQud3JpdGVCb29sZWFuKHJlZ2lzdHJ5Q29udHJvbGxlci5nZXRSZWdpc3RyeShuZXcgSW50ZWdlcihyZWdpc3RyeUlEKSkgIT0gbnVsbCk7CS8vIFJldHVybiBpZiByZWdpc3RyeSBzdGlsbCBhbGl2ZQotCQkJCQlvdXQuZmx1c2goKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgQ29tbWFuZHMuUkVNT1RFX1NUQVJURUQ6Ci0JCQkJCXJlZ2lzdHJ5SUQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCWludCByZW1vdGVTZXJ2ZXJQb3J0ID0gaW4ucmVhZEludCgpOwotCQkJCQlSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IHJlZ2lzdHJ5Q29udHJvbGxlci5nZXRSZWdpc3RyeShuZXcgSW50ZWdlcihyZWdpc3RyeUlEKSk7Ci0JCQkJCWlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkJCQlyZWdpc3RyeS5zZXRTZXJ2ZXJQb3J0KHJlbW90ZVNlcnZlclBvcnQpOwotCQkJCQkJb3V0LndyaXRlQm9vbGVhbih0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlvdXQud3JpdGVCb29sZWFuKGZhbHNlKTsJLy8gTm8gcmVnaXN0cnkKLQkJCQkJb3V0LmZsdXNoKCk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIENvbW1hbmRzLkFUVEFDSF9DQUxMQkFDSzoKLQkJCQkJcmVnaXN0cnlJRCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJcmVnaXN0cnkgPSByZWdpc3RyeUNvbnRyb2xsZXIuZ2V0UmVnaXN0cnkobmV3IEludGVnZXIocmVnaXN0cnlJRCkpOwotCQkJCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCQkJY2xvc2UgPSAhKChSRU1DYWxsYmFja1JlZ2lzdHJ5KSByZWdpc3RyeS5nZXRDYWxsYmFja1JlZ2lzdHJ5KCkpLmNyZWF0ZUNhbGxiYWNrKHJlbW90ZSk7CS8vIGNsb3NlIGlmIGZhaWxlZCwgZG9uJ3QgY2xvc2UgaWYgZ29vZC4KLQkJCQkJCW91dC53cml0ZUJvb2xlYW4oIWNsb3NlKTsJLy8gaWYgbm90IGNsb3NlLCB0aGVuIHJldHVybiBpdCB3b3JrZWQuCi0JCQkJCX0gZWxzZQotCQkJCQkJb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7Ci0JCQkJCW91dC5mbHVzaCgpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOwkgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNsb3NlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNsb3NlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXJlcXVlc3RTaHV0ZG93bigpOwotCQltYXN0ZXJTZXJ2ZXJTb2NrZXQgPSBudWxsOwkJCi0JfQkJCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1ldGhvZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1ldGhvZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzY3NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTU1ldGhvZFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBSZW1vdGUgVk0gaW1wbGVtZW50YXRpb24gb2YgdGhlIE1ldGhvZFByb3h5Ci0gKi8KLQotZmluYWwgY2xhc3MgUkVNTWV0aG9kUHJveHkgZXh0ZW5kcyBSRU1BY2Nlc3NpYmxlT2JqZWN0UHJveHkgaW1wbGVtZW50cyBJUkVNTWV0aG9kUHJveHkgewotCi0JcHJpdmF0ZSBJQmVhblR5cGVQcm94eSBmRGVjbGFyaW5nVHlwZTsKLQlwcml2YXRlIFN0cmluZyBmTWV0aG9kTmFtZTsKLQlwcml2YXRlIElCZWFuVHlwZVByb3h5W10gZlBhcmFtZXRlclR5cGVzOwotCXByaXZhdGUgSUJlYW5UeXBlUHJveHkgZlJldHVyblR5cGU7Ci0KLQlSRU1NZXRob2RQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQpOwotCX0KLQotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRDbGFzc1R5cGUoKSB7Ci0JCWlmIChmRGVjbGFyaW5nVHlwZSA9PSBudWxsKQotCQkJZkRlY2xhcmluZ1R5cGUgPQotCQkJCShJQmVhblR5cGVQcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMKLQkJCQkJLmdldENvbnN0YW50cyhmRmFjdG9yeSkKLQkJCQkJLmdldE1ldGhvZERlY2xhcmluZ0NsYXNzTWVzc2FnZSgpCi0JCQkJCS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoCi0JCQkJCXRoaXMpOwotCQlyZXR1cm4gZkRlY2xhcmluZ1R5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZk1ldGhvZE5hbWUgPT0gbnVsbCkgewotCQkJSVN0cmluZ0JlYW5Qcm94eSBwcm94eSA9Ci0JCQkJKElTdHJpbmdCZWFuUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzCi0JCQkJCS5nZXRDb25zdGFudHMoZkZhY3RvcnkpCi0JCQkJCS5nZXRNZXRob2RNZXRob2ROYW1lTWVzc2FnZSgpCi0JCQkJCS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoCi0JCQkJCXRoaXMpOwotCQkJaWYgKHByb3h5ICE9IG51bGwpCi0JCQkJZk1ldGhvZE5hbWUgPSBwcm94eS5zdHJpbmdWYWx1ZSgpOwotCQkJZWxzZQotCQkJCWZNZXRob2ROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZk1ldGhvZE5hbWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJQmVhblR5cGVQcm94eVtdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCQlpZiAoZlBhcmFtZXRlclR5cGVzID09IG51bGwpIHsKLQkJCUlBcnJheUJlYW5Qcm94eSBwYXJtVHlwZXMgPSAoSUFycmF5QmVhblByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpCi0JCQkJCS5nZXRNZXRob2RQYXJhbWV0ZXJUeXBlc01lc3NhZ2UoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcyk7Ci0JCQlpZiAocGFybVR5cGVzID09IG51bGwpCi0JCQkJZlBhcmFtZXRlclR5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5WzBdOyAvLyBUaGVyZSB3YXMgc29tZSBlcnJvciwgb25seSB3YXkgbnVsbCBpcyByZXR1cm5lZAotCQkJZWxzZSB7Ci0JCQkJaW50IGxlbiA9IHBhcm1UeXBlcy5nZXRMZW5ndGgoKTsKLQkJCQlmUGFyYW1ldGVyVHlwZXMgPSBuZXcgSUJlYW5UeXBlUHJveHlbbGVuXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJCQl0cnkgewotCQkJCQkJZlBhcmFtZXRlclR5cGVzW2ldID0gKElCZWFuVHlwZVByb3h5KSBwYXJtVHlwZXMuZ2V0KGkpOwotCQkJCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkJCX0KLQkJCQlmRmFjdG9yeS5yZWxlYXNlUHJveHkocGFybVR5cGVzKTsgLy8gRG9uJ3QgbmVlZCB0aGUgYXJyYXkgb24gdGhlIHNlcnZlciBhbnltb3JlLgotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZQYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0UmV0dXJuVHlwZSgpIHsKLQkJaWYgKGZSZXR1cm5UeXBlID09IG51bGwpCi0JCQlmUmV0dXJuVHlwZSA9Ci0JCQkJKElCZWFuVHlwZVByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cwotCQkJCQkuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KQotCQkJCQkuZ2V0TWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2UoKQotCQkJCQkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKAotCQkJCQl0aGlzKTsKLQkJcmV0dXJuIGZSZXR1cm5UeXBlOwotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBpbnZva2Uoc3ViamVjdCwgKElCZWFuUHJveHlbXSkgbnVsbCk7Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eVtdIHBhcm1zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gaW52b2tlV2l0aFBhcm1zKHN1YmplY3QsIHBhcm1zKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW50ZXJuYWwgbWV0aG9kIHRoYXQgYWxsb3dzIG1peHR1cmUgb2YgY29uc3RhbnRzIChlLmcuIFN0cmluZykgd2l0aCBiZWFuIHByb3hpZXMuCi0JICogQSBwYXJtIHZhbHVlIGNhbiBiZSBhIFJFTU1ldGhvZFByb3h5LlBhcm1BcnJheS4gVGhpcyBtZWFucyB0aGlzIHBhcm0gaXMgYW4gYXJyYXkgdGhhdAotCSAqIG5lZWRzIHRvIGhhdmUgYSBWYWx1ZVJldHJpZXZlciBjcmVhdGVkIGZvciBpdC4gVGhpcyBpcyB1c2VkIGlmIHRoZSBhcnJheSBoYXMgSUQncyBpbgotCSAqIGl0IGFuZCBpcyBub3QgYW4gZXhpc3RpbmcgYXJyYXkgb24gdGhlIHNlcnZlciBvciBhbGwgY29uc3RhbnQgdmFsdWVzLgotCSAqCi0JICogTk9URTogSXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBJQmVhblR5cGVQcm94aWVzIG9mIHRoZSBwYXJtcyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICogICAgICAgSXQgc2hvdWxkIHN0aWxsIHdvcmssIGJ1dCBpdCBjb3VsZCBiZSBhc2tpbmcgZm9yIHRoZW0gaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmVxdWVzdAotCSAqICAgICAgIGlmIHRoZXkgYXJlIG5vdCBmaXJzdCBnb3R0b24uCi0JICoKLQkgKiBOT1RFOiBUaGlzIGlzIGluIElSRU1NZXRob2RQcm94eSBvbmx5IHNvIHRoYXQgb3RoZXIgUkVNIHByb3h5IGltcGxlbWVudGF0aW9ucyBjYW4gYWNjZXNzIGl0LgotCSAqLwotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlV2l0aFBhcm1zKElCZWFuUHJveHkgc3ViamVjdCwgZmluYWwgT2JqZWN0W10gcGFybXMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlSRU1Db25uZWN0aW9uIGNvbm5lY3QgPSBmRmFjdG9yeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQlSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpOwotCQlwcm94eUZhY3Rvcnkuc3RhcnRUcmFuc2FjdGlvbigpOyAvLyBUaGlzIGlzIGRlZmluYXRlbHkgYSB0cmFuc2FjdGlvbiwgc28gc3RhcnQgaXQuCi0JCXRyeSB7Ci0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBzdWJqZWN0VmFsdWUgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCWlmIChzdWJqZWN0ICE9IG51bGwpCi0JCQkJICgoSVJFTUJlYW5Qcm94eSkgc3ViamVjdCkucmVuZGVyQmVhbihzdWJqZWN0VmFsdWUpOwotCi0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtc1ZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0KLQkJCWNsYXNzIFJldHJpZXZlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlUmV0cmlldmUgewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJT2JqZWN0W10gYXJyYXk7Ci0JCQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCi0JCQkJcHVibGljIFJldHJpZXZlcihPYmplY3RbXSBhbkFycmF5KSB7Ci0JCQkJCWFycmF5ID0gYW5BcnJheTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQkJCWluZGV4ID0gMDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV4dFZhbHVlKCkgewotCQkJCQlPYmplY3QgcGFybSA9IGFycmF5W2luZGV4KytdOwotCQkJCQlpZiAocGFybSAhPSBudWxsKQotCQkJCQkJaWYgKHBhcm0gaW5zdGFuY2VvZiBJUkVNQmVhblByb3h5KQotCQkJCQkJCSAoKElSRU1CZWFuUHJveHkpIHBhcm0pLnJlbmRlckJlYW4od29ya2VyKTsKLQkJCQkJCWVsc2UgaWYgKHBhcm0gaW5zdGFuY2VvZiBUcmFuc21pdGFibGVBcnJheSkgewotCQkJCQkJCS8vIEl0IGlzIGFub3RoZXIgYXJyYXksIGNyZWF0ZSBhIG5ldyByZXRyaWV2ZXIuCi0JCQkJCQkJd29ya2VyLnNldEFycmF5SURTKAotCQkJCQkJCQluZXcgUmV0cmlldmVyKCgoVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmFycmF5KSwKLQkJCQkJCQkJKChUcmFuc21pdGFibGVBcnJheSkgcGFybSkuYXJyYXkubGVuZ3RoLAotCQkJCQkJCQkoKFRyYW5zbWl0YWJsZUFycmF5KSBwYXJtKS5jb21wb25lbnRUeXBlSUQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBJdCdzIGFuIG9iamVjdC4gTmVlZCB0byBnZXQgYmVhbiB0eXBlIHNvIHRoYXQgd2UgY2FuIHNlbmQgaXQuCi0JCQkJCQkJSVJFTUJlYW5Qcm94eSB0eXBlID0gKElSRU1CZWFuUHJveHkpIHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkocGFybS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCQkJCWludCBjbGFzc0lEID0gdHlwZS5nZXRJRCgpLmludFZhbHVlKCk7Ci0JCQkJCQkJd29ya2VyLnNldEFzT2JqZWN0KHBhcm0sIGNsYXNzSUQpOwotCQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQl3b3JrZXIuc2V0KCk7Ci0JCQkJCXJldHVybiB3b3JrZXI7IAotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCVJldHJpZXZlciByZXRyaWV2ZXIgPSBudWxsOwotCi0JCQlpZiAocGFybXMgIT0gbnVsbCkgewotCQkJCS8vIEhhdmUgYSBsb2NhbCBkZWZpbml0aW9uIG9mIHRoZSByZXRyaWV2ZXIgc28gdGhhdCB0aGUgcmV0cmlldmVyIGNhbiBjcmVhdGUKLQkJCQkvLyBhbm90aGVyIG9uZSBvZiBpdHNlbGYgaWYgbmVjZXNzYXJ5LgotCQkJCXBhcm1zVmFsdWUuc2V0QXJyYXlJRFMocmV0cmlldmVyID0gbmV3IFJldHJpZXZlcihwYXJtcyksIHBhcm1zLmxlbmd0aCwgQ29tbWFuZHMuT0JKRUNUX0NMQVNTKTsgLy8gQ3JlYXRlIE9iamVjdFtdLgotCQkJfQotCi0JCQlDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJdHJ5IHsKLQkJCQlpbnZva2UoY29ubmVjdCwgcHJveHlGYWN0b3J5LCBzdWJqZWN0VmFsdWUsIHBhcm1zVmFsdWUsIHJldHVyblZhbHVlKTsKLQkJCQlyZXR1cm4gcHJveHlGYWN0b3J5LmdldEJlYW5Qcm94eShyZXR1cm5WYWx1ZSk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIWUuaXNSZWNvdmVyYWJsZSgpKSB7Ci0JCQkJCS8vIENsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uCi0JCQkJCWZGYWN0b3J5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCWNvbm5lY3QgPSBmRmFjdG9yeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKHJldHJpZXZlciAhPSBudWxsKQotCQkJCQkJCXJldHJpZXZlci5yZXNldCgpOwotCQkJCQkJaW52b2tlKGNvbm5lY3QsIHByb3h5RmFjdG9yeSwgc3ViamVjdFZhbHVlLCBwYXJtc1ZhbHVlLCByZXR1cm5WYWx1ZSk7Ci0JCQkJCQlyZXR1cm4gcHJveHlGYWN0b3J5LmdldEJlYW5Qcm94eShyZXR1cm5WYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCQkvLyBGYWlsZWQgYWdhaW4uIEp1c3QgY2xvc2UgYW5kIHByaW50IHRyYWNlLgotCQkJCQkJZkZhY3RvcnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZUFnYWluKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQSByZWNvdmVyYWJsZSBlcnJvciwgcHJpbnQgdHJhY2UgYW5kIHJldHVybgotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXByb3h5RmFjdG9yeS5zdG9wVHJhbnNhY3Rpb24oKTsKLQkJCWlmIChjb25uZWN0ICE9IG51bGwpCi0JCQkJZkZhY3RvcnkucmV0dXJuQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJfQotCX0KLQotcHJpdmF0ZSB2b2lkIGludm9rZSgKLQkJSVJFTUNvbm5lY3Rpb24gY29ubmVjdCwKLQkJUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSwKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgc3ViamVjdFZhbHVlLAotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBwYXJtc1ZhbHVlLAotCQlDb21tYW5kcy5WYWx1ZU9iamVjdCByZXR1cm5WYWx1ZSkKLQkJdGhyb3dzIFRocm93YWJsZVByb3h5LCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNvbm5lY3QuaW52b2tlTWV0aG9kKGdldElEKCkuaW50VmFsdWUoKSwgc3ViamVjdFZhbHVlLCBwYXJtc1ZhbHVlLCByZXR1cm5WYWx1ZSk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQlwcm94eUZhY3RvcnkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eSBwYXJtKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gaW52b2tlKHN1YmplY3QsIG5ldyBJQmVhblByb3h5W10geyBwYXJtIH0pOwotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZGYWN0b3J5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBwYXJtcykgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZGYWN0b3J5LnJlbGVhc2VQcm94eShlKTsgLy8gU2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLCBnZXQgcmlkIG9mIG5vdyBpbnN0ZWFkIG9mIEdDIHRpbWUuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgcGFybSkgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCBwYXJtKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJZkZhY3RvcnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vIGxvbmdlciBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgcHJveHkgaXMgY29uc3RhbnQgcHJveHkgb3V0IG9mIHRoZSBtZXRob2QgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChSRU1NZXRob2RQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5tZXRob2RUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoZSBiZWFuIGlzIGJlaW5nIHJlbGVhc2VkLCBjbGVhciBvdXQgdGhlIGZpZWxkcyBzbyB0aGV5IGNhbiBiZSBHQydkIGlmIG5lY2Vzc2FyeS4KLQkgKiBVc3VhbGx5IG9ubHkgYmlnIG9iamVjdHMgYW5kIHByb3h5IGZpZWxkcyBuZWVkIHRvIGJlIGNsZWFyZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZkRlY2xhcmluZ1R5cGUgPSBudWxsOwotCQlmUGFyYW1ldGVyVHlwZXMgPSBudWxsOwotCQlmUmV0dXJuVHlwZSA9IG51bGw7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlOWQwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLlRyYW5zbWl0YWJsZUFycmF5OwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG1ldGhvZCBwcm94aWVzLiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSA2OjI5OjQwIFBNKQotICogCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgY2xhc3MgUkVNTWV0aG9kUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSU1ldGhvZFByb3h5RmFjdG9yeSB7Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZkZhY3RvcnlSZWdpc3RyeTsKLQotCS8vIENhY2hlZCBjb3B5IG9mIGEgZmV3IHR5cGljYWwgbWV0aG9kIHR5cGUgcHJveGllcy4KLQlJUkVNQmVhblR5cGVQcm94eSBhY2Nlc3NpYmxlVHlwZTsKLQotCVJFTU1ldGhvZFR5cGVQcm94eSBtZXRob2RUeXBlOwotCi0JUkVNRmllbGRUeXBlUHJveHkgZmllbGRUeXBlOwotCi0JUkVNQ29uc3RydWN0b3JUeXBlUHJveHkgY3RvclR5cGU7Ci0KLQlSRU1NZXRob2RQcm94eSBnZXRNZXRob2RQcm94eTsKLQotCVJFTU1ldGhvZFByb3h5RmFjdG9yeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJZkZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTWV0aG9kUHJveHlGYWN0b3J5KHRoaXMpOwotCQlSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGFSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCi0JCWFjY2Vzc2libGVUeXBlID0gdHlwZUZhY3Rvcnkub2JqZWN0Q2xhc3MubmV3QmVhblR5cGVGb3JDbGFzcyhuZXcgSW50ZWdlcihDb21tYW5kcy5BQ0NFU1NJQkxFT0JKRUNUX0NMQVNTKSwgQWNjZXNzaWJsZU9iamVjdC5jbGFzcy5nZXROYW1lKCksCi0JCQkJZmFsc2UpOwotCQltZXRob2RUeXBlID0gbmV3IFJFTU1ldGhvZFR5cGVQcm94eShhUmVnaXN0cnksIGFjY2Vzc2libGVUeXBlKTsKLQkJZmllbGRUeXBlID0gbmV3IFJFTUZpZWxkVHlwZVByb3h5KGFSZWdpc3RyeSwgYWNjZXNzaWJsZVR5cGUpOwotCQljdG9yVHlwZSA9IG5ldyBSRU1Db25zdHJ1Y3RvclR5cGVQcm94eShhUmVnaXN0cnksIGFjY2Vzc2libGVUeXBlKTsKLQkJYVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KGFjY2Vzc2libGVUeXBlLCB0cnVlKTsKLQkJYVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KG1ldGhvZFR5cGUsIHRydWUpOwotCQlhUmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5yZWdpc3RlckJlYW5UeXBlUHJveHkoZmllbGRUeXBlLCB0cnVlKTsKLQkJYVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KGN0b3JUeXBlLCB0cnVlKTsKLQotCQlnZXRNZXRob2RQcm94eSA9IChSRU1NZXRob2RQcm94eSkgbWV0aG9kVHlwZS5uZXdCZWFuUHJveHkobmV3IEludGVnZXIoQ29tbWFuZHMuR0VUX01FVEhPRF9JRCkpOwotCQkoKFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSkgYVJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKSkucmVnaXN0ZXJQcm94eShnZXRNZXRob2RQcm94eSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eUZhY3RvcnkjZ2V0TWV0aG9kUHJveHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlJQmVhblR5cGVQcm94eSBjbHNQcm94eSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoY2xhc3NOYW1lKTsKLQkJaWYgKGNsc1Byb3h5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gVGhpcyB3aWxsIHJlZGlyZWN0IHRvIHRoZSBiZWFudHlwZSwgd2hpY2ggd2lsbCBnbyB0aHJvdWdoIHRoZSBtZXRob2QgY2FjaGUuCi0JCXJldHVybiBjbHNQcm94eS5nZXRNZXRob2RQcm94eShtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIEEgaGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhlIGV4cHJlc3Npb24uIFRoaXMgaXMgdXNlZCBieSByZWdpc3RyaWVzIGFuZCBiZWFudHlwZSBwcm94aWVzLiBJdCB3aWxsIGdvIHRocm91Z2gKLQkgKiB0aGUgbWV0aG9kIGNhY2hlIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgb25seSBvbmUuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJtVHlwZXMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSBhQmVhblR5cGVQcm94eSwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzKXsKLQkJcmV0dXJuICgoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5wcm94eUNvbnN0YW50cy5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBhQmVhblR5cGVQcm94eSwgbWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgZmllbGQgcHJveHkgZm9yIHRoZSBleHByZXNzaW9uLiBUaGlzIGlzIHVzZWQgYnkgcmVnaXN0cmllcyBhbmQgYmVhbnR5cGUgcHJveGllcy4gSXQgd2lsbCBnbyB0aHJvdWdoCi0JICogdGhlIG1ldGhvZCBjYWNoZSB0byBtYWtlIHN1cmUgd2UgZ2V0IG9ubHkgb25lLgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGFCZWFuVHlwZVByb3h5Ci0JICogQHBhcmFtIGZpZWxkTmFtZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5RmllbGQgZ2V0RmllbGRQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSBhQmVhblR5cGVQcm94eSwgU3RyaW5nIGZpZWxkTmFtZSl7Ci0JCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkucHJveHlDb25zdGFudHMuZ2V0RmllbGRQcm94eShleHByZXNzaW9uLCBhQmVhblR5cGVQcm94eSwgZmllbGROYW1lKTsKLQl9Ci0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5I2dldEZpZWxkUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElQcm94eUZpZWxkIGdldEZpZWxkUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQkvLyBXZSBhcmUgZ2V0dGluZyB0aGUgY2xhc3MgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgZXhwcmVzc2lvbi4gTWlnaHQgYXMgd2VsbCBiZWNhdXNlIGl0IHByb2JhYmx5IHdpbGwKLQkJLy8gYmUgbmVlZGVkIGFnYWluIGFuZCB0aGlzIHdheSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZpbmlzaGVkIGl0IHdpbGwgYmUgcmVzb2x2ZWQgZm9yIGxhdGVyIHVzYWdlLgotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFuVHlwZVByb3h5RmFjdG9yeSA9IGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJSVByb3h5QmVhblR5cGUgYmVhblR5cGUgPSBiZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGV4cHJlc3Npb24sIGNsYXNzTmFtZSk7Ci0JCXJldHVybiBiZWFuVHlwZS5nZXRGaWVsZFByb3h5KGV4cHJlc3Npb24sIGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eUZhY3RvcnkjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkvLyBXZSBhcmUgZ2V0dGluZyB0aGUgY2xhc3MgYW5kIHBhcm10eXBlcyByZXNvbHZlZCB0aHJvdWdoIHRoZSBleHByZXNzaW9uLiBNaWdodCBhcyB3ZWxsIGJlY2F1c2UgdGhleSBwcm9iYWJseSB3aWxsCi0JCS8vIGJlIG5lZWRlZCBhZ2FpbiBhbmQgdGhpcyB3YXkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmaW5pc2hlZCB0aGV5IHdpbGwgYmUgcmVzb2x2ZWQgZm9yIGxhdGVyIHVzYWdlLgotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFuVHlwZVByb3h5RmFjdG9yeSA9IGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJSVByb3h5QmVhblR5cGUgYmVhblR5cGUgPSBiZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGV4cHJlc3Npb24sIGNsYXNzTmFtZSk7Ci0JCUlQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzID0gZ2V0UGFyYW1ldGVyVHlwZXMoZXhwcmVzc2lvbiwgcGFyYW1ldGVyVHlwZXMsIGJlYW5UeXBlUHJveHlGYWN0b3J5KTsKLQkJcmV0dXJuIGJlYW5UeXBlLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgZm9yIEJlYW5UeXBlcyBhbmQgcHJveHkgQmVhbnR5cGVzLiBTbyB0aGV5IGRvbid0IG5lZWQgdG8gaGF2ZSBjb21tb24gY29kZSB0byBjb252ZXJ0IHN0cmluZyB0byBwcm94eSBiZWFuIHR5cGUuCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gY2xhc3NUeXBlCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBJUHJveHlCZWFuVHlwZSBjbGFzc1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQkvLyBXZSBhcmUgZ2V0dGluZyB0aGUgY2xhc3MgYW5kIHBhcm10eXBlcyByZXNvbHZlZCB0aHJvdWdoIHRoZSBleHByZXNzaW9uLiBNaWdodCBhcyB3ZWxsIGJlY2F1c2UgdGhleSBwcm9iYWJseSB3aWxsCi0JCS8vIGJlIG5lZWRlZCBhZ2FpbiBhbmQgdGhpcyB3YXkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmaW5pc2hlZCB0aGV5IHdpbGwgYmUgcmVzb2x2ZWQgZm9yIGxhdGVyIHVzYWdlLgotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFuVHlwZVByb3h5RmFjdG9yeSA9IGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXMgPSBnZXRQYXJhbWV0ZXJUeXBlcyhleHByZXNzaW9uLCBwYXJhbWV0ZXJUeXBlcywgYmVhblR5cGVQcm94eUZhY3RvcnkpOwotCQlyZXR1cm4gY2xhc3NUeXBlLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiBAcGFyYW0gYmVhblR5cGVQcm94eUZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIElQcm94eUJlYW5UeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMsIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW5UeXBlUHJveHlGYWN0b3J5KSB7Ci0JCUlQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzOwotCQlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCB8fCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMCkKLQkJCXBhcm1UeXBlcyA9IG51bGw7Ci0JCWVsc2UgewotCQkJcGFybVR5cGVzID0gbmV3IElQcm94eUJlYW5UeXBlW3BhcmFtZXRlclR5cGVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFybVR5cGVzW2ldID0gYmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShleHByZXNzaW9uLCBwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcm1UeXBlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklNZXRob2RQcm94eUZhY3RvcnkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSkKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCUlTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHR5cGVGYWN0b3J5ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlJQmVhblR5cGVQcm94eSBjbHNQcm94eSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoY2xhc3NOYW1lKTsKLQkJaWYgKGNsc1Byb3h5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNsc1Byb3h5LmdldEludm9rYWJsZShtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2QgaWQgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSBhbmQgY3JlYXRlIHRoZSBtZXRob2QgcHJveHkuCi0JICogCi0JICogTk9URTogSXQgaXMgcHVibGljIE9OTFkgc28gdGhhdCBJQmVhblR5cGVQcm94eSBpbXBsZW1lbnRhdGlvbnMgY2FuIGNhbGwgaXQuIEl0IG11c3Qgbm90IGJlIHVzZWQgYnkgYW55b25lIGVsc2UuCi0JICogCi0JICogQHBhcmFtIGJlYW5UeXBlCi0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKElSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJLy8gRmlyc3QgY29udmVydCB0aGUgcGFyYW1ldGVyIHR5cGVzIGludG8gSUJlYW5UeXBlUHJveHlbXS4KLQkJSVJFTUJlYW5UeXBlUHJveHlbXSB0eXBlcyA9IG51bGw7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSB0eXBlRmFjdG9yeSA9IGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJCXR5cGVzID0gbmV3IElSRU1CZWFuVHlwZVByb3h5W3BhcmFtZXRlclR5cGVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUJlYW5UeXBlUHJveHkgdHlwZSA9IHR5cGVzW2ldID0gKElSRU1CZWFuVHlwZVByb3h5KSB0eXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCQlpZiAodHlwZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gT25lIG9mIHRoZSBwYXJtIHR5cGVzIGRvZXNuJ3QgZXhpc3QuCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0SW52b2thYmxlKGJlYW5UeXBlLCBtZXRob2ROYW1lLCB0eXBlcyk7CQkKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2QgaWQgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSBhbmQgY3JlYXRlIHRoZSBtZXRob2QgcHJveHkuCi0JICogVGhpcyBkb2VzIG5vdCBnbyB0aHJvdWdoIHRoZSBtZXRob2QgY2FjaGUuIEl0IGdvZXMgZGlyZWN0IHRvIHRoZSByZW1vdGUgdm0uCi0JICogCi0JICogTk9URTogSXQgaXMgcHVibGljIE9OTFkgc28gdGhhdCBJQmVhblR5cGVQcm94eSBpbXBsZW1lbnRhdGlvbnMgY2FuIGNhbGwgaXQuIEl0IG11c3Qgbm90IGJlIHVzZWQgYnkgYW55b25lIGVsc2UuCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShJUkVNQmVhblR5cGVQcm94eSBiZWFuVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCS8vIEZpcnN0IGNvbnZlcnQgdGhlIHBhcmFtZXRlciB0eXBlcyBpbnRvIElCZWFuVHlwZVByb3h5W10uCi0JCUlCZWFuVHlwZVByb3h5W10gdHlwZXMgPSBudWxsOwotCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgewotCQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCQl0eXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVtwYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCUlCZWFuVHlwZVByb3h5IHR5cGUgPSB0eXBlc1tpXSA9IHR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkocGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBPbmUgb2YgdGhlIHBhcm0gdHlwZXMgZG9lc24ndCBleGlzdC4KLQkJCX0KLQkJfQotCi0JCXJldHVybiBnZXRNZXRob2RQcm94eShiZWFuVHlwZSwgbWV0aG9kTmFtZSwgdHlwZXMpOwotCX0KLQotCQotCS8qKgotCSAqIEdldCB0aGUgaW52b2thYmxlLiAKLQkgKiAKLQkgKiBOT1RFOiBJdCBpcyBwdWJsaWMgT05MWSBzbyB0aGF0IElCZWFuVHlwZVByb3h5IGltcGxlbWVudGF0aW9ucyBjYW4gY2FsbCBpdC4gSXQgbXVzdCBub3QgYmUgdXNlZCBieSBhbnlvbmUgZWxzZS4KLQkgKiBAcGFyYW0gYmVhblR5cGUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBuZXcgUkVNSW52b2thYmxlKGJlYW5UeXBlLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIGlkIGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0gYW5kIGNyZWF0ZSB0aGUgbWV0aG9kIHByb3h5LgotCSAqIDxwPgotCSAqIFRoaXMgZG9lcyBub3QgZ28gdGhyb3VnaCB0aGUgbWV0aG9kIGNhY2hlLiBJdCBnb2VzIGRpcmVjdCB0byB0aGUgcmVtb3RlIHZtLgotCSAqIAotCSAqIE5PVEU6IEl0IGlzIHB1YmxpYyBPTkxZIHNvIHRoYXQgSUJlYW5UeXBlUHJveHkgaW1wbGVtZW50YXRpb25zIGNhbiBjYWxsIGl0LiBJdCBtdXN0IG5vdCBiZSB1c2VkIGJ5IGFueW9uZSBlbHNlLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCS8vIFRoZSBwYXJtcyB0byBnZXRNZXRob2QgYXJlOgotCQkvLyBwYXJtWzBdID0gU3RyaW5nIC0gbWV0aG9kIG5hbWUKLQkJLy8gcGFybVsxXSA9IENsYXNzW10gLSBQYXJhbWV0ZXIgQ2xhc3Nlcy4KLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0W10geyBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyAhPSBudWxsID8gKG5ldyBUcmFuc21pdGFibGVBcnJheShDb21tYW5kcy5DTEFTU19DTEFTUywgcGFyYW1ldGVyVHlwZXMpKSA6IG51bGx9OwotCQlJQmVhblByb3h5IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXRNZXRob2RQcm94eS5pbnZva2VXaXRoUGFybXMoYmVhblR5cGUsIHBhcm1zKTsKLQkJCXJldHVybiAoSU1ldGhvZFByb3h5KSByZXN1bHQ7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWZGYWN0b3J5UmVnaXN0cnkucmVsZWFzZVByb3h5KGUpOyAvLyBTaW5jZSBpdCdzIG5vdCBuZWVkZWQsIGdldCByaWQgb2Ygbm93IGluc3RlYWQgb2YgR0MgdGltZS4KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJLy8gU29tZSB0cmFjZSBtc2dzIGJlY2F1c2Ugd2Uga2VlcCBnZXR0aW5nIGludG8gYSBtb2RlIGFmdGVyIGF3aGlsZSAodGhvdWdoIG5vdCByZXByb2R1Y2libGUpIHRoYXQgcmV0dXJucyBub24tbWV0aG9kIHByb3hpZXMgYW5kIHdlIG5lZWQKLQkJCS8vIG1vcmUgaW5mby4KLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJNZXRob2QgcmVxdWVzdGVkIGlzIFwiIiArIG1ldGhvZE5hbWUgKyAiKCIpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCWJ1Zi5hcHBlbmQoJywnKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1Zi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbaV0uZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCQlidWYuYXBwZW5kKCIpXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBidWYudG9TdHJpbmcoKSwgbnVsbCkpOwotCQkJdHJ5IHsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkJCQkiQ2xhc3NDYXN0RXhjZXB0aW9uIG9mIHJlc3VsdC4gUmV0dXJuIHR5cGUgaXMgXCIiICsgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkgKyAiXCJcbiIgKyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJIlJldHVybiB0eXBlIGJlYW4gdHlwZSBwcm94eSBjbGFzcz1cIiIgKyByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXCJcbiIgKyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJIkdldE1ldGhvZFByb3h5IHZhbGlkPSIgKyBnZXRNZXRob2RQcm94eS5pc1ZhbGlkKCkgKyAiXG4iICsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJHZXRNZXRob2RQcm94eSByZWFsIG5hbWUgaXMgXCIiICsgZ2V0TWV0aG9kUHJveHkuZ2V0TmFtZSgpICsgIlwiXG4iLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAkJCQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZTIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhyb3cgZTsgLy8gUmV0aHJvdyBpdC4KLQkJfQotCX0KLQotCS8qCi0JICogVGVybWluYXRlIHRoZSBmYWN0b3J5LiBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGJlY2F1c2Ugb2YgdGhlIHByb3hpZXMgYmVpbmcgaGVsZCBvbnRvIGFyZSByZWdpc3RlcmVkIGFueSB3aWxsIGJlIGNsZWFuZWQgdXAgdGhlbXNlbHZlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RUeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTWV0aG9kVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTNmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1NZXRob2RUeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTU1ldGhvZFR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogQmVhblR5cGUgUHJveHkgZm9yIE1ldGhvZCBjbGFzcy4KLSAqLwotCi1maW5hbCBjbGFzcyBSRU1NZXRob2RUeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgewotCi1SRU1NZXRob2RUeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBhY2Nlc3NpYmxlVHlwZVByb3h5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5NRVRIT0RfQ0xBU1MpLCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MuZ2V0TmFtZSgpLCBhY2Nlc3NpYmxlVHlwZVByb3h5KTsKLX0KLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIGFjY2Vzc2libGUgb2JqZWN0IHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogU3BlY2lhbGl6ZWQgZnJvbSBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIENvbnN0cnVjdG9yIHByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCXJldHVybiBuZXcgUkVNTWV0aG9kUHJveHkoZlJlZ2lzdHJ5LCBvYmplY3RJRCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDb25zdHJ1Y3RvciBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGEgZGVmYXVsdCBjdG9yLAotICogdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsgCi0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogTm90ZTogU2luY2UgbmV3IGluc3RhbmNlcyBvZiBDb25zdHJ1Y3RvciBhcmUgbmV2ZXIgZG9uZSB0aHJvdWdoIGFuIGluaXRpYWxpemF0aW9uIHN0cmluZywKLSAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19CQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1OdW1iZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNTnVtYmVyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkM2E0NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1OdW1iZXJCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1OdW1iZXJCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogUmVtb3RlIEltcGxlbWVudGF0aW9uIG9mIElOdW1iZXJCZWFuUHJveHkgZm9yIGFueSBOdW1iZXIgKGkuZS4gdGhlIG5vbi1wcmltaXRpdmVzKQotICogSXQgY2FuIGFuc3dlciBhbGwgb2YgdGhlIHByaW1pdGl2ZSBudW1iZXIgdHlwZXMgKGludCwgbG9uZywgc2hvcnQsIGJ5dGUsIGRvdWJsZSwgZmxvYXQpLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAyOjU0IEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgUkVNTnVtYmVyQmVhblByb3h5IGV4dGVuZHMgUkVNQ29uc3RhbnRCZWFuUHJveHkgaW1wbGVtZW50cyBJTnVtYmVyQmVhblByb3h5IHsKLQlwcml2YXRlIGZpbmFsIE51bWJlciBmTnVtYmVyVmFsdWU7Ci0KLS8qKgotICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkCi0gKiBpbiBhIHNwZWNpYWwgd2F5IGFuZCBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZW0uCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1SRU1OdW1iZXJCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBOdW1iZXIgYU51bWJlcikgewotCXN1cGVyKGFSZWdpc3RyeSk7Ci0JZk51bWJlclZhbHVlID0gYU51bWJlcjsKLX0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBSRU1OdW1iZXJCZWFuUHJveHkpCi0JCXJldHVybiBmTnVtYmVyVmFsdWUuZXF1YWxzKCgoUkVNTnVtYmVyQmVhblByb3h5KSBhbk9iamVjdCkubnVtYmVyVmFsdWUoKSk7Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgTnVtYmVyKQotCQlyZXR1cm4gZk51bWJlclZhbHVlLmVxdWFscyhhbk9iamVjdCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmJ5dGVWYWx1ZSgpOwotfQotLyoqCi0gKiBkb3VibGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmRvdWJsZVZhbHVlKCk7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUuZmxvYXRWYWx1ZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGludCB2YWx1ZQotICovCi1wdWJsaWMgaW50IGludFZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUuaW50VmFsdWUoKTsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5sb25nVmFsdWUoKTsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5zaG9ydFZhbHVlKCk7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS50b1N0cmluZygpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODc4ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogUHJpbWl0aXZlIEJlYW5UeXBlIFByb3hpZXMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5ICB7Ci0JCi0JcHJvdGVjdGVkIFJFTVByaW1pdGl2ZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgdGhlIHByaW1pdGl2ZSBCeXRlLlRZUEUgb3IgQnl0ZS5jbGFzcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudWxsIGN0b3IgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLgotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwkJCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCkgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsJCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0JCi0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKiAKLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0Q29uc3RydWN0b3JzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgUkVNCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7CQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9CQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqIAotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXRGaWVsZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICogCi0JICogRm9yIGFsbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgZmllbGQgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTQotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8JCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLgotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4KLQkgKiBGb3IgYWxsIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCSAKLQkgKi8JCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLgotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4JIAotCSAqLwkJCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSkgewkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLQkgKgotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gVGhleSBhcmUgY3JlYXRlZAotCSAqIGV4cGxpY2l0bHkgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgY3JlYXRlIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcywgdGhleSBhcmVuJ3QgY2xhc3Nlcywgc28geW91IGNhbid0IGNyZWF0ZSBhIG5ld0JlYW5UeXBlIAotCSAqIGZvciBzdWJjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVsZWFzZSAtIEJlYW5UeXBlIGlzIGFib3V0IHRvIGJlIHJlbGVhc2VkLgotCSAqIHByaW1pdGl2ZXMgZG9uJ3QgbmVlZCB0byBiZSByZWxlYXNlZCwgdGhleSBkb24ndCBob2xkIG9udG8gYW55IGlkcyBvciByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0JCi0JLyoqCi0JICogSGF2ZSBhIHN0cmluZyB0aGF0IHNob3VsZCByZXByZXNlbnQgYSBudW1iZXIuCi0JICogU2VlIGlmIGl0IGVuZHMgaW4gYSB0eXBlIGxldHRlciwgaWYgc28gcGFyc2UgYXMgc3VjaC4KLQkgKiBTZWUgaWYgdGhlcmUgaXMgYW4gJ0UnIGluIGl0LCB0aGVuIHBhcnNlIGFzIGEgZG91YmxlLgotCSAqIElmIG5laXRoZXIgY29uZGl0aW9uLCB0aGVuIHRyeSBwYXJzZSBhcyBsb25nLCBpZiB0aGF0IAotCSAqIGZhaWxzIHRyeSBhcyBkb3VibGUuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBOdW1iZXIgcGFyc2VTdHJpbmcoU3RyaW5nIHYpIHsKLQkJaWYgKHYubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQljaGFyIGxhc3QgPSB2LmNoYXJBdCh2Lmxlbmd0aCgpLTEpOwotCQl0cnkgewotCQkJc3dpdGNoIChsYXN0KSB7Ci0JCQkJY2FzZSAnZCc6Ci0JCQkJY2FzZSAnRCc6Ci0JCQkJCXJldHVybiBEb3VibGUudmFsdWVPZih2KTsKLQkJCQljYXNlICdmJzoKLQkJCQljYXNlICdGJzoKLQkJCQkJcmV0dXJuIEZsb2F0LnZhbHVlT2Yodik7Ci0JCQkJY2FzZSAnbCc6Ci0JCQkJY2FzZSAnTCc6Ci0JCQkJCXJldHVybiBMb25nLmRlY29kZSh2LnN1YnN0cmluZygwLCB2Lmxlbmd0aCgpLTEpKTsKLQkJCX0KLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmV0dXJuIExvbmcuZGVjb2RlKHYpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gRG91YmxlLnZhbHVlT2Yodik7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTEpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlQ29uc3RydWN0b3Iob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q29tcGF0aWJsZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUHJveHlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUHJveHlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5ZDRmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBSRU1Qcm94eUNvbnN0YW50cy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA1LzE4IDIzOjExOjI2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotCi0KLQotCi0vKioKLSAqIE1ldGhvZFByb3h5Q29uc3RhbnRzIGlzIGEgY2FjaGUgb2YgSU1ldGhvZFByb3hpZXMgdG8gYXZvaWQgcmVwZWF0ZWQgbG9va3VwCi0gKiBhbmQgdGhlcmVieSBhdm9pZCB0aGUgcmVsYXRpdmVseSBleHBlbnNpdmUgamF2YS5sYW5nLnJlZmxlY3QgY2FsbHMgdG8gcmVwZWF0ZWRseQotICogbG9va3VwIG1ldGhvZCBieSBuYW1lCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgUkVNUHJveHlDb25zdGFudHMgewotCi0JcHJpdmF0ZSBNYXAgbWV0aG9kc0NhY2hlID0gbmV3IEhhc2hNYXAoODApOwotCXByaXZhdGUgTWFwIGludm9rYWJsZXNDYWNoZSA9IG5ldyBIYXNoTWFwKDgwKTsJCi0JcHJpdmF0ZSBNYXAgZmllbGRzQ2FjaGUgPSBuZXcgSGFzaE1hcCg4MCk7Ci0JCi0JcHJpdmF0ZSBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLQkKLQlwdWJsaWMgUkVNUHJveHlDb25zdGFudHMoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCX0KLQkKLQkvKgotCSAqIFVzZWQgYXMgdGhlIGtleSB0byB0aGUgbWV0aG9kQ2FjaGUgYW5kIGludm9rYWJsZXNDYWNoZSB3aGVuIHRoZXJlIGFyZSBwYXJtcy4KLQkgKiBJdCBhbGxvd3MgdGhlIHBhcm1zIHRvIGJlIGVpdGhlciBzdHJpbmdzIG9yIElCZWFuVHlwZVByb3hpZXMgd2l0aG91dCB0aGUKLQkgKiBvdmVyaGVhZCBvZiBjcmVhdGluZyBjb21wbGljYXRlZCBzdHJpbmdzLgotCSAqIAotCSAqIEl0IHdpbGwgY29tcGFyZSBtZXRob2QgbmFtZSBhbmQgZWFjaCBpbmRpdmlkdWFsIHBhcm0gbmFtZSB3aXRob3V0IGZsdWZmaW5nCi0JICogdXAgYSBzdHJpbmcgYW5kIGJ1aWxkaW5nIGl0IHVwLgotCSAqIAotCSAqIEZvciBubyBwYXJtIG1ldGhvZHMsIGp1c3QgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBhcyBhIHN0cmluZyB3aWxsIGJlIHRoZSBrZXkuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgTWV0aG9kS2V5IHsKLQkJcHVibGljIFN0cmluZyBtZXRob2ROYW1lOwotCQlwdWJsaWMgTWV0aG9kS2V5KFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCQl0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQl9Ci0JCQkJCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmVQYXJtcyhJUHJveHlCZWFuVHlwZVtdIHBhcm1zKTsKLQkJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY29tcGFyZVBhcm1zKFN0cmluZ1tdIHBhcm1zKTsKLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIG1ldGhvZE5hbWUuaGFzaENvZGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXRob2RLZXlTdHJpbmdQYXJtcyBleHRlbmRzIE1ldGhvZEtleSB7Ci0JCXB1YmxpYyBTdHJpbmdbXSBwYXJtTmFtZXM7Ci0JCQotCQlwdWJsaWMgTWV0aG9kS2V5U3RyaW5nUGFybXMoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcm1OYW1lcykgewotCQkJc3VwZXIobWV0aG9kTmFtZSk7Ci0JCQl0aGlzLnBhcm1OYW1lcyA9IHBhcm1OYW1lczsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJCXJldHVybiB0cnVlOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChNZXRob2RLZXkpIG9iaikuY29tcGFyZVBhcm1zKHBhcm1OYW1lcyk7Ci0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IGggPSBzdXBlci5oYXNoQ29kZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQloICs9IHBhcm1OYW1lc1tpXS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIGg7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNjb21wYXJlUGFybXMob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVQYXJtcyhJUHJveHlCZWFuVHlwZVtdIHBhcm1zKSB7Ci0JCQlpZiAocGFybXMubGVuZ3RoICE9IHBhcm1OYW1lcy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcGFybXNbaV0uZ2V0VHlwZU5hbWUoKS5lcXVhbHMocGFybU5hbWVzW2ldKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjY29tcGFyZVBhcm1zKGphdmEubGFuZy5TdHJpbmdbXSkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVQYXJtcyhTdHJpbmdbXSBwYXJtcykgewotCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMocGFybXMsIHBhcm1OYW1lcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWV0aG9kS2V5UHJveHlQYXJtcyBleHRlbmRzIE1ldGhvZEtleSB7Ci0JCXB1YmxpYyBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlczsKLQkJCi0JCXB1YmxpYyBNZXRob2RLZXlQcm94eVBhcm1zKFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcykgewotCQkJc3VwZXIobWV0aG9kTmFtZSk7Ci0JCQl0aGlzLnBhcm1UeXBlcyA9IHBhcm1UeXBlczsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCB0b01ldGhvZEtleVN0cmluZ1Bhcm1zKCkgewotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nW3Bhcm1UeXBlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJtc1tpXSA9IHBhcm1UeXBlc1tpXS5nZXRUeXBlTmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBNZXRob2RLZXlTdHJpbmdQYXJtcyhtZXRob2ROYW1lLCBwYXJtcyk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoTWV0aG9kS2V5KSBvYmopLmNvbXBhcmVQYXJtcyhwYXJtVHlwZXMpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IGggPSBzdXBlci5oYXNoQ29kZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQloICs9IHBhcm1UeXBlc1tpXS5nZXRUeXBlTmFtZSgpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuUkVNUHJveHlDb25zdGFudHMuTWV0aG9kS2V5I2NvbXBhcmVQYXJtcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gY29tcGFyZVBhcm1zKFN0cmluZ1tdIHBhcm1zKSB7Ci0JCQlpZiAocGFybXMubGVuZ3RoICE9IHBhcm1UeXBlcy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcGFybVR5cGVzW2ldLmdldFR5cGVOYW1lKCkuZXF1YWxzKHBhcm1zW2ldKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjY29tcGFyZVBhcm1zKGphdmEubGFuZy5TdHJpbmdbXSkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVQYXJtcyhJUHJveHlCZWFuVHlwZVtdIHBhcm1zKSB7Ci0JCQlpZiAocGFybXMubGVuZ3RoICE9IHBhcm1UeXBlcy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcGFybVR5cGVzW2ldLmdldFR5cGVOYW1lKCkuZXF1YWxzKHBhcm1zW2ldLmdldFR5cGVOYW1lKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JfQotCQkKLQlzdGF0aWMgaW50IFJFTU1FVEhPRENPVU5UID0gMDsKLQlzdGF0aWMgaW50IFVOSVFVRU1FVEhPRENPVU5UID0gMDsJCi0Jc3RhdGljIGludCBSRU1JTlZPS0FCTEVDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBVTklRVUVJTlZPS0FCTEVDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBJTlZPS0VJTlZPS0VDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBNRVRIT0RQUk9YWUlOVk9LRUNPVU5UID0gMDsKLQlzdGF0aWMgaW50IFJFTUZJRUxEQ09VTlQgPSAwOwotCXN0YXRpYyBpbnQgVU5JUVVFRklFTERDT1VOVCA9IDA7Ci0Jc3RhdGljIGludCBSRU1DT05TVFJVQ1RPUkNBTExFRCA9IDA7Ci0Jc3RhdGljIEhhc2hNYXAgTUVUSE9EQ09VTlRNQVA7Ci0Jc3RhdGljIEhhc2hNYXAgRklFTERDT1VOVE1BUDsJIAotCXN0YXRpYyBIYXNoTWFwIEZJRUxEU0VUQ09VTlRNQVA7Ci0Jc3RhdGljIGJvb2xlYW4gR0FUSEVSX0NPVU5UUzsKLQkKLQkvKioKLQkgKiBTZXQgaWYgY291bnRzIHNob3VsZCBiZSBnYXRoZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZ2F0aGVyQ291bnRzCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEdhdGhlckNvdW50cyhib29sZWFuIGdhdGhlckNvdW50cykgewotCQlpZiAoZ2F0aGVyQ291bnRzICE9IEdBVEhFUl9DT1VOVFMpIHsKLQkJCXJlc2V0KCk7Ci0JCQlpZiAoZ2F0aGVyQ291bnRzKSB7Ci0JCQkJaWYgKE1FVEhPRENPVU5UTUFQID09IG51bGwpIHsKLQkJCQkJTUVUSE9EQ09VTlRNQVAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlGSUVMRENPVU5UTUFQID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJRklFTERTRVRDT1VOVE1BUCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJfQotCQkJfQotCQkJR0FUSEVSX0NPVU5UUyA9IGdhdGhlckNvdW50czsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKXsKLQkJUkVNTUVUSE9EQ09VTlQgPSBVTklRVUVNRVRIT0RDT1VOVCA9IFJFTUlOVk9LQUJMRUNPVU5UID0gVU5JUVVFSU5WT0tBQkxFQ09VTlQgPSBSRU1DT05TVFJVQ1RPUkNBTExFRCA9IE1FVEhPRFBST1hZSU5WT0tFQ09VTlQgPSBJTlZPS0VJTlZPS0VDT1VOVCA9IFJFTUZJRUxEQ09VTlQgPSBVTklRVUVGSUVMRENPVU5UID0gMDsKLQkJaWYgKEdBVEhFUl9DT1VOVFMpIHsKLQkJCU1FVEhPRENPVU5UTUFQLmNsZWFyKCk7Ci0JCQlGSUVMRENPVU5UTUFQLmNsZWFyKCk7Ci0JCQlGSUVMRFNFVENPVU5UTUFQLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50bG4oKXsKLQkJCi0JCWlmIChHQVRIRVJfQ09VTlRTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kIHByb3hpZXMgaW52b2tlcyA9ICIgKyBNRVRIT0RQUk9YWUlOVk9LRUNPVU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbnZva2UgaW52b2tlcyA9ICIgKyBJTlZPS0VJTlZPS0VDT1VOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RzIHJldHJpZXZlZCA9ICIgKyBSRU1NRVRIT0RDT1VOVCArICIoIiArIFVOSVFVRU1FVEhPRENPVU5UICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52b2tlcyByZXRyaWV2ZWQgPSAiICsgUkVNSU5WT0tBQkxFQ09VTlQgKyAiKCIgKyBVTklRVUVJTlZPS0FCTEVDT1VOVCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkcyByZXRyaWV2ZWQgPSAiICsgUkVNRklFTERDT1VOVCArICIoIiArIFVOSVFVRUZJRUxEQ09VTlQgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvciBjYWxscyA9ICIgKyBSRU1DT05TVFJVQ1RPUkNBTExFRCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCItQ291bnQgb2YgbWV0aG9kcyBpbnZva2VkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQ29sbGF0ZSB0aGUgbWV0aG9kcyBjYWxsZWQKLQkJCUl0ZXJhdG9yIGVudHJpZXMgPSBNRVRIT0RDT1VOVE1BUC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGVudHJpZXMubmV4dCgpOwotCQkJCVJFTU1ldGhvZFByb3h5IG1ldGhvZFByb3h5ID0gKFJFTU1ldGhvZFByb3h5KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obWV0aG9kUHJveHkuZ2V0Q2xhc3NUeXBlKCkuZ2V0VHlwZU5hbWUoKSArICIsIiArIG1ldGhvZFByb3h5LmdldE5hbWUoKSArICIsIiArIGVudHJ5LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1Db3VudCBvZiBmaWVsZHMgZ2V0IGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBDb2xsYXRlIHRoZSBmaWVsZHMgYWNjZXNzZWQKLQkJCWVudHJpZXMgPSBGSUVMRENPVU5UTUFQLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgZW50cmllcy5uZXh0KCk7Ci0JCQkJUkVNRmllbGRQcm94eSBmaWVsZFByb3h5ID0gKFJFTUZpZWxkUHJveHkpIGVudHJ5LmdldEtleSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihmaWVsZFByb3h5LnRvQmVhblN0cmluZygpICsgIiwiICsgZW50cnkuZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1Db3VudCBvZiBmaWVsZHMgc2V0IGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBDb2xsYXRlIHRoZSBmaWVsZHMgc2V0Ci0JCQllbnRyaWVzID0gRklFTERTRVRDT1VOVE1BUC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGVudHJpZXMubmV4dCgpOwotCQkJCVJFTUZpZWxkUHJveHkgZmllbGRQcm94eSA9IChSRU1GaWVsZFByb3h5KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZmllbGRQcm94eS50b0JlYW5TdHJpbmcoKSArICIsIiArIGVudHJ5LmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IAotCQl9Ci0JCQotCX0KLQkKLS8qKgotICogQHBhcmFtIGFCZWFuVHlwZVByb3h5ID0gQmVhblR5cGVQcm94eSBmb3IgdGhlIG1ldGhvZAotICogQHBhcmFtIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lIHRvIGJlIGxvb2tlZCBmb3IKLSAqIEBwYXJhbSBwYXJtVHlwZXMgPSBhcnJheSBvZiBxdWFsaWZpZWQgdHlwZSBuYW1lcyBmb3IgdGhlIG1ldGhvZCBhcmd1bWVudHMsIG51bGwgaWYgbm8gbWV0aG9kcwotICovIAotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtVHlwZXMpewotCQlpZiAoIXJlZ2lzdHJ5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVJFTU1FVEhPRENPVU5UKys7Ci0JCU1hcCBtZXRob2RzOwotCQlPYmplY3Qga2V5OwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFRoZSBjbGFzc0NhY2hlIG1hcCBpcyBrZXllZCBieSB0aGUgQmVhblR5cGVQcm94eSBhbmQgaG9sZHMgYSBmdXJ0aGVyIG1hcCBvZiBjYWNoZSdkIG1ldGhvZHMKLQkJCW1ldGhvZHMgPSBnZXRNZXRob2RzKGFCZWFuVHlwZVByb3h5KTsKLQotCQkJLy8gVGhlIHN5bnRheCBvZiB0aGUga2V5IGlzIG1ldGhvZE5hbWUocGFybVR5cGUxLHBhcm1UeXBlMikKLQkJCWlmIChwYXJtVHlwZXMgPT0gbnVsbCB8fCBwYXJtVHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlrZXkgPSBtZXRob2ROYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlrZXkgPSBuZXcgTWV0aG9kS2V5U3RyaW5nUGFybXMobWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQkJCX0KLQotCQkJSU1ldGhvZFByb3h5IHJlc3VsdCA9IChJTWV0aG9kUHJveHkpIG1ldGhvZHMuZ2V0KGtleSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJVU5JUVVFTUVUSE9EQ09VTlQrKzsKLQkJLy8gR2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCVJFTU1ldGhvZFByb3h5RmFjdG9yeSBwcm94eUZhY3RvcnkgPSAoUkVNTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKTsKLQkJSU1ldGhvZFByb3h5IHJlc3VsdCA9IHByb3h5RmFjdG9yeS5nZXRNZXRob2RQcm94eSgoSVJFTUJlYW5UeXBlUHJveHkpYUJlYW5UeXBlUHJveHksbWV0aG9kTmFtZSxwYXJtVHlwZXMpOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIEdldCBpdCBhZ2FpbiB0byBtYWtlIHN1cmUgaXQgaGFzbid0IGNoYW5nZWQgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uIFdlIGRvbid0IHN5bmMgZm9yIHRoZSBnZXRNZXRob2RQcm94eSBiZWNhdXNlIHRoYXQgZ29lcyB0byB0aGUgcmVtb3RlIHZtIGFuZCBjb3VsZCBkZWFkbG9jay4KLQkJCUlNZXRob2RQcm94eSBtVmFsdWUgPSAoSU1ldGhvZFByb3h5KSBtZXRob2RzLmdldChrZXkpOwotCQkJaWYgKG1WYWx1ZSAhPSBudWxsICYmIG1WYWx1ZSAhPSByZXN1bHQpIHsKLQkJCQlyZWdpc3RyeS5yZWxlYXNlUHJveHkocmVzdWx0KTsgLy8gRG9uJ3QgbmVlZCB0aGUgcmVzdWx0IG5vdywgZ290IGl0IHRocm91Z2ggYSByYWNlIGNvbmRpdGlvbi4KLQkJCQlyZXR1cm4gbVZhbHVlOyAvLyBXZSBoYXZlIGEgcmVhbCB2YWx1ZSBub3cuCi0JCQl9Ci0JCQltZXRob2RzLnB1dChrZXksIHJlc3VsdCk7Ci0JCX0JCQotCQlyZXR1cm4gcmVzdWx0OwkJCQkKLQl9Ci0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eQotICogQHJldHVybiBNYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0gKi8KLXByaXZhdGUgTWFwIGdldE1ldGhvZHMoSVByb3h5QmVhblR5cGUgYUJlYW5UeXBlUHJveHkpIHsKLQlNYXAgbWV0aG9kcyA9IChNYXApIG1ldGhvZHNDYWNoZS5nZXQoYUJlYW5UeXBlUHJveHkuZ2V0VHlwZU5hbWUoKSk7Ci0JaWYobWV0aG9kcyA9PSBudWxsKXsKLQkJbWV0aG9kcyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJbWV0aG9kc0NhY2hlLnB1dChhQmVhblR5cGVQcm94eS5nZXRUeXBlTmFtZSgpLG1ldGhvZHMpOwotCX0KLQlyZXR1cm4gbWV0aG9kczsKLX0KLS8qKgotICogQHBhcmFtIGFCZWFuVHlwZVByb3h5Ci0gKiBAcmV0dXJuIE1hcCBvZiBjYWNoZSdkIGludm9rYWJsZXMKLSAqLwotcHJpdmF0ZSBNYXAgZ2V0SW52b2thYmxlcyhJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCU1hcCBpbnZva2FibGVzID0gKE1hcCkgaW52b2thYmxlc0NhY2hlLmdldChhQmVhblR5cGVQcm94eSk7Ci0JaWYoaW52b2thYmxlcyA9PSBudWxsKXsKLQkJaW52b2thYmxlcyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJaW52b2thYmxlc0NhY2hlLnB1dChhQmVhblR5cGVQcm94eSxpbnZva2FibGVzKTsKLQl9Ci0JcmV0dXJuIGludm9rYWJsZXM7Ci19Ci0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eQotICogQHJldHVybiBNYXAgb2YgY2FjaGUnZCBmaWVsZHMKLSAqLwotcHJpdmF0ZSBNYXAgZ2V0RmllbGRzKElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5KSB7Ci0JTWFwIGZpZWxkcyA9IChNYXApIGZpZWxkc0NhY2hlLmdldChhQmVhblR5cGVQcm94eS5nZXRUeXBlTmFtZSgpKTsKLQlpZihmaWVsZHMgPT0gbnVsbCl7Ci0JCWZpZWxkcyA9IG5ldyBIYXNoTWFwKDIwKTsKLQkJZmllbGRzQ2FjaGUucHV0KGFCZWFuVHlwZVByb3h5LmdldFR5cGVOYW1lKCksZmllbGRzKTsKLQl9Ci0JcmV0dXJuIGZpZWxkczsKLX0KLS8qKgotICogQHBhcmFtIGFCZWFuVHlwZVByb3h5ID0gQmVhblR5cGVQcm94eSBmb3IgdGhlIG1ldGhvZAotICogQHBhcmFtIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lIHRvIGJlIGxvb2tlZCBmb3IKLSAqIEBwYXJhbSBwYXJtVHlwZXMgPSBhcnJheSBvZiBxdWFsaWZpZWQgdHlwZSBuYW1lcyBmb3IgdGhlIG1ldGhvZCBhcmd1bWVudHMsIG51bGwgaWYgbm8gYXJndW1lbnRzCi0gKi8gCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgaW52b2thYmxlTmFtZSwgU3RyaW5nW10gcGFybVR5cGVOYW1lcyl7Ci0JCQotCQlSRU1JTlZPS0FCTEVDT1VOVCsrOwotCQkvLyBUaGUgY2xhc3NDYWNoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIEJlYW5UeXBlUHJveHkgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCU1hcCBpbnZva2FibGVzID0gZ2V0SW52b2thYmxlcyhhQmVhblR5cGVQcm94eSk7CQotCQkKLQkJT2JqZWN0IGtleSA9IG51bGw7IAotCQlpZihwYXJtVHlwZU5hbWVzID09IG51bGwgfHwgcGFybVR5cGVOYW1lcy5sZW5ndGggPT0gMCl7Ci0JCQlrZXkgPSBpbnZva2FibGVOYW1lOwotCQl9IGVsc2UgewotCQkJa2V5ID0gbmV3IE1ldGhvZEtleVN0cmluZ1Bhcm1zKGludm9rYWJsZU5hbWUsIHBhcm1UeXBlTmFtZXMpOwotCQl9CQkJCi0JCQotCQlJSW52b2thYmxlIHJlc3VsdCA9IChJSW52b2thYmxlKSBpbnZva2FibGVzLmdldChrZXkpOwotCQlpZihyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKLQkJCi0JCVVOSVFVRUlOVk9LQUJMRUNPVU5UKys7Ci0JCS8vIEdldCB0aGUgbWV0aG9kIHByb3h5IGFuZCBjYWNoZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJLy8gR2V0IHRoZSBtZXRob2QgcHJveHkgYW5kIGNhY2hlIHRoaXMgYmVmb3JlIHJldHVybmluZyBpdAotCQlSRU1NZXRob2RQcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgYUJlYW5UeXBlUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKTsKLQkJcmVzdWx0ID0gcHJveHlGYWN0b3J5LmdldEludm9rYWJsZSgoSVJFTUJlYW5UeXBlUHJveHkpYUJlYW5UeXBlUHJveHksaW52b2thYmxlTmFtZSxwYXJtVHlwZU5hbWVzKTsKLQkJaW52b2thYmxlcy5wdXQoa2V5LHJlc3VsdCk7CQkKLQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JCQkJCi0JfQotCS8qKgotCSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eSA9IEJlYW5UeXBlUHJveHkgZm9yIHRoZSBtZXRob2QKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUgdG8gYmUgbG9va2VkIGZvcgotCSAqIEBwYXJhbSBwYXJtVHlwZXMgPSBhcnJheSBvZiBJQmVhblR5cGVQcm94eSB0eXBlcyBmb3IgdGhlIG1ldGhvZCBhcmd1bWVudHMsIG51bGwgaWYgbm8gYXJndW1lbnRzCi0JICovIAotCQlwdWJsaWMgSUludm9rYWJsZSBnZXRJbnZva2FibGUoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIFN0cmluZyBpbnZva2FibGVOYW1lLCBJQmVhblR5cGVQcm94eVtdIHBhcm1UeXBlcyl7Ci0JCQkKLQkJCVJFTUlOVk9LQUJMRUNPVU5UKys7Ci0JCQkvLyBUaGUgY2xhc3NDYWNoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIEJlYW5UeXBlUHJveHkgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCQlNYXAgaW52b2thYmxlcyA9IGdldEludm9rYWJsZXMoYUJlYW5UeXBlUHJveHkpOwkKLQkJCQotCQkJT2JqZWN0IGtleSA9IG51bGw7IAotCQkJaWYocGFybVR5cGVzID09IG51bGwgfHwgcGFybVR5cGVzLmxlbmd0aCA9PSAwKXsKLQkJCQlrZXkgPSBpbnZva2FibGVOYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlrZXkgPSBuZXcgTWV0aG9kS2V5UHJveHlQYXJtcyhpbnZva2FibGVOYW1lLCBwYXJtVHlwZXMpOwotCQkJfQkJCQotCQkJCi0JCQlJSW52b2thYmxlIHJlc3VsdCA9IChJSW52b2thYmxlKSBpbnZva2FibGVzLmdldChrZXkpOwotCQkJaWYocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7Ci0JCQkKLQkJCVVOSVFVRUlOVk9LQUJMRUNPVU5UKys7Ci0JCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCQlSRU1NZXRob2RQcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5ID0gKFJFTU1ldGhvZFByb3h5RmFjdG9yeSkgYUJlYW5UeXBlUHJveHkuZ2V0UHJveHlGYWN0b3J5UmVnaXN0cnkoKS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKTsKLQkJCXJlc3VsdCA9IHByb3h5RmFjdG9yeS5nZXRJbnZva2FibGUoKElSRU1CZWFuVHlwZVByb3h5KWFCZWFuVHlwZVByb3h5LGludm9rYWJsZU5hbWUscGFybVR5cGVzKTsKLQkJCWludm9rYWJsZXMucHV0KGtleSxyZXN1bHQpOwkJCi0JCQlyZXR1cm4gcmVzdWx0OwkJCQkKLQkJCQkJCi0JCX0JCi0vKioKLSAqIEBwYXJhbSBhQmVhblR5cGVQcm94eSA9IEJlYW5UeXBlUHJveHkgZm9yIHRoZSBtZXRob2QKLSAqIEBwYXJhbSBtZXRob2ROYW1lID0gbWV0aG9kTmFtZSB0byBiZSBsb29rZWQgZm9yCi0gKiBAcGFyYW0gcGFybVR5cGVzID0gYXJyYXkgb2YgcXVhbGlmaWVkIHR5cGUgbmFtZXMgZm9yIHRoZSBtZXRob2QgYXJndW1lbnRzLCBudWxsIGlmIG5vIG1ldGhvZHMKLSAqLyAKLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5LCBTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBwYXJtVHlwZXMpewotCQlpZiAoIXJlZ2lzdHJ5LmlzVmFsaWQoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJUkVNTUVUSE9EQ09VTlQrKzsJCQotCQkvLyBUaGUgY2xhc3NDYWNoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIEJlYW5UeXBlUHJveHkgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCU1hcCBtZXRob2RzOwotCQlPYmplY3Qga2V5OwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCW1ldGhvZHMgPSBnZXRNZXRob2RzKGFCZWFuVHlwZVByb3h5KTsKLQotCQkJa2V5ID0gbnVsbDsKLQkJCWlmIChwYXJtVHlwZXMgPT0gbnVsbCB8fCBwYXJtVHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlrZXkgPSBtZXRob2ROYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlrZXkgPSBuZXcgTWV0aG9kS2V5UHJveHlQYXJtcyhtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCQkJfQotCi0JCQlJTWV0aG9kUHJveHkgcmVzdWx0ID0gKElNZXRob2RQcm94eSkgbWV0aG9kcy5nZXQoa2V5KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlVTklRVUVNRVRIT0RDT1VOVCsrOwotCQkvLyBHZXQgdGhlIG1ldGhvZCBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCS8vIEdldCB0aGUgbWV0aG9kIHByb3h5IGFuZCBjYWNoZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJUkVNTWV0aG9kUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChSRU1NZXRob2RQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpOwotCQlJTWV0aG9kUHJveHkgcmVzdWx0ID0gcHJveHlGYWN0b3J5LmdldE1ldGhvZFByb3h5KChJUkVNQmVhblR5cGVQcm94eSlhQmVhblR5cGVQcm94eSxtZXRob2ROYW1lLHBhcm1UeXBlcyk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gR2V0IGl0IGFnYWluIHRvIG1ha2Ugc3VyZSBpdCBoYXNuJ3QgY2hhbmdlZCBkdWUgdG8gYSByYWNlIGNvbmRpdGlvbi4gV2UgZG9uJ3Qgc3luYyBmb3IgdGhlIGdldE1ldGhvZFByb3h5IGJlY2F1c2UgdGhhdCBnb2VzIHRvIHRoZSByZW1vdGUgdm0gYW5kIGNvdWxkIGRlYWRsb2NrLgotCQkJSU1ldGhvZFByb3h5IG1WYWx1ZSA9IChJTWV0aG9kUHJveHkpIG1ldGhvZHMuZ2V0KGtleSk7Ci0JCQlpZiAobVZhbHVlICE9IG51bGwgJiYgbVZhbHVlICE9IHJlc3VsdCkgewotCQkJCXJlZ2lzdHJ5LnJlbGVhc2VQcm94eShyZXN1bHQpOyAvLyBEb24ndCBuZWVkIHJlc3VsdCBub3csIGdvdCBpdCBhbHJlYWR5IHRocm91Z2ggYSByYWNlIGNvbmRpdGlvbi4KLQkJCQlyZXR1cm4gbVZhbHVlOyAvLyBXZSBoYXZlIGEgcmVhbCB2YWx1ZSBub3cuCi0JCQl9Ci0JCQltZXRob2RzLnB1dChrZXksIHJlc3VsdCk7Ci0JCX0JCQotCi0JCXJldHVybiByZXN1bHQ7CQkJCQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJveHkgbWV0aG9kIGZvciB0aGUgbWV0aG9kIHRocm91Z2ggdGhlIGV4cHJlc3Npb24uIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGFCZWFuVHlwZVByb3h5Ci0JICogQHBhcmFtIG1ldGhvZE5hbWUKLQkgKiBAcGFyYW0gcGFybVR5cGVzCi0JICogQHJldHVybiBlaXRoZXIgdGhlIElNZXRob2RQcm94eSBpZiBhbHJlYWR5IHJlc29sdmVkIG9yIGFuIEV4cHJlc3Npb25Qcm94eSBpZiBub3QgeWV0IHJlc29sdmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgSVByb3h5QmVhblR5cGUgYUJlYW5UeXBlUHJveHksIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcyl7Ci0JCWlmICghcmVnaXN0cnkuaXNWYWxpZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlSRU1NRVRIT0RDT1VOVCsrOwkKLQkJTWFwIG1ldGhvZHM7Ci0JCU1hcCBlcE1ldGhvZHM7Ci0JCU9iamVjdCBrZXk7Ci0JCWJvb2xlYW4gaXNLZXk7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gVGhlIGNsYXNzQ2FjaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBCZWFuVHlwZVByb3h5IG5hbWUgYW5kIGhvbGRzIGEgZnVydGhlciBtYXAgb2YgY2FjaGUnZCBtZXRob2RzCi0JCQltZXRob2RzID0gZ2V0TWV0aG9kcyhhQmVhblR5cGVQcm94eSk7Ci0KLQkJCWlmIChwYXJtVHlwZXMgPT0gbnVsbCB8fCBwYXJtVHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlrZXkgPSBtZXRob2ROYW1lOwotCQkJCWlzS2V5ID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWtleSA9IG5ldyBNZXRob2RLZXlQcm94eVBhcm1zKG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JCQkJaXNLZXkgPSB0cnVlOwotCQkJfQotCi0JCQlJUHJveHlNZXRob2QgcmVzdWx0ID0gKElQcm94eU1ldGhvZCkgbWV0aG9kcy5nZXQoa2V5KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCi0JCQkvLyBTZWUgaWYgc3RvcmVkIGluIHRoZSBleHByZXNzaW9uLgotCQkJZXBNZXRob2RzID0gKChSRU1FeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRNZXRob2RzKGFCZWFuVHlwZVByb3h5KTsKLQkJCXJlc3VsdCA9IChJUHJveHlNZXRob2QpIGVwTWV0aG9kcy5nZXQoa2V5KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlVTklRVUVNRVRIT0RDT1VOVCsrOwotCQkvLyBHZXQgdGhlIG1ldGhvZCBleHByZXNzaW9uIHByb3h5IGFuZCBjYWNoZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJSVByb3h5TWV0aG9kIHJlc3VsdCA9ICgoRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlTWV0aG9kRXhwcmVzc2lvblByb3h5KGFCZWFuVHlwZVByb3h5LG1ldGhvZE5hbWUscGFybVR5cGVzKTsKLQkJZXBNZXRob2RzLnB1dChrZXksIHJlc3VsdCk7Ci0JCWZpbmFsIE9iamVjdCBlcEtleSA9IGtleTsKLQkJZmluYWwgTWFwIHJNZXRob2RzID0gbWV0aG9kczsgCi0JCWZpbmFsIE1hcCBmZXBNZXRob2RzID0gZXBNZXRob2RzOwotCQlmaW5hbCBib29sZWFuIGlzS2V5VHlwZSA9IGlzS2V5OwotCQkoKEV4cHJlc3Npb25Qcm94eSkgcmVzdWx0KS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3luY2hyb25pemVkIChSRU1Qcm94eUNvbnN0YW50cy50aGlzKSB7Ci0JCQkJCWlmIChyTWV0aG9kcy5jb250YWluc0tleShlcEtleSkpCi0JCQkJCQlyZXR1cm47CS8vIFdlIGFscmVhZHkgaGF2ZSBhIHRydWUgbWV0aG9kIHByb3h5IGluIHRoZXJlLiBBIHJhY2UgY29uZGl0aW9uIG9jY3VycmVkLgotCQkJCQkKLQkJCQkJLy8gTm93IHB1dCB0aGlzIHJlc29sdmVkIGd1eSBpbnRvIHRoZSBtZXRob2RzLgotCQkJCQkvLyBXZSBkb24ndCB3YW50IHRoZSBrZXkgdG8gY29udGFpbiBleHByZXNzaW9uIHByb3hpZXMgaW4gdGhlIGZpbmFsIG1hcCwgc28gaWYgaXQgaXMgYSBrZXkgdHlwZQotCQkJCQkvLyB3ZSB3aWxsIHR1cm4gaXQgaW50byBhIHN0cmluZyB0eXBlIGtleS4KLQkJCQkJT2JqZWN0IGtleTsKLQkJCQkJaWYgKGlzS2V5VHlwZSkgewotCQkJCQkJa2V5ID0gKChNZXRob2RLZXlQcm94eVBhcm1zKSBlcEtleSkudG9NZXRob2RLZXlTdHJpbmdQYXJtcygpOwkvLyBTbyB0aGF0IHdlIGRvbid0IHB1dCBhIGtldCB0aGF0IGNvbnRhaW5zIGV4cHJlc3Npb24gcHJveHkgcGFybSB0eXBlcyBpbnRvIHRoZSBtYWluIG1hcC4KLQkJCQkJfSBlbHNlCi0JCQkJCQlrZXkgPSBlcEtleTsKLQkJCQkJCi0JCQkJCXJNZXRob2RzLnB1dChrZXksIGV2ZW50LmdldFByb3h5KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChFeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCBldmVudCkgewotCQkJCXN5bmNocm9uaXplZCAoUkVNUHJveHlDb25zdGFudHMudGhpcykgewotCQkJCQlmZXBNZXRob2RzLnJlbW92ZShlcEtleSk7Ci0JCQkJfQotCQkJCX0KLQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3h5Ci0JICovCi0Jc3RhdGljIHZvaWQgbWV0aG9kSW52b2tlZChSRU1NZXRob2RQcm94eSBwcm94eSkgewotCQotCQlpZiAoR0FUSEVSX0NPVU5UUykgewotCQkJSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBNRVRIT0RDT1VOVE1BUC5nZXQocHJveHkpOwotCQkJaWYgKGNvdW50ID09IG51bGwpIHsKLQkJCQlNRVRIT0RDT1VOVE1BUC5wdXQocHJveHksIG5ldyBJbnRlZ2VyKDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTUVUSE9EQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSkpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIHZvaWQgZmllbGRHZXRJbnZva2VkKElCZWFuUHJveHkgcHJveHkpIHsKLQotCQlpZiAoR0FUSEVSX0NPVU5UUykgewotCQkJSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBGSUVMRENPVU5UTUFQLmdldChwcm94eSk7Ci0JCQlpZiAoY291bnQgPT0gbnVsbCkgewotCQkJCUZJRUxEQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcigxKSk7Ci0JCQl9IGVsc2UgewotCQkJCUZJRUxEQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSkpOwotCQkJfSAKLQkJfQkJCi0JfQotCi0Jc3RhdGljIHZvaWQgZmllbGRTZXRJbnZva2VkKElCZWFuUHJveHkgcHJveHksIElCZWFuUHJveHkgdmFsdWUpIHsKLQotCQlpZiAoR0FUSEVSX0NPVU5UUykgewotCQkJSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBGSUVMRFNFVENPVU5UTUFQLmdldChwcm94eSk7Ci0JCQlpZiAoY291bnQgPT0gbnVsbCkgewotCQkJCUZJRUxEU0VUQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcigxKSk7Ci0JCQl9IGVsc2UgewotCQkJCUZJRUxEU0VUQ09VTlRNQVAucHV0KHByb3h5LCBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSkpOwotCQkJfSAKLQkJfQkJCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJveHkgZm9yIHRoZSBCZWFuVHlwZSBvZiB0aGUgZmllbGQKLQkgKiBAcGFyYW0gZmllbGROYW1lIG9mIHRoZSBmaWVsZCwgZS5nLiAoamF2YS5hd3QuRGltZW5zaW9uLCB3aWR0aCkgZm9yIHRoZSAid2lkdGgiIGZpZWxkIG9uIERpbWVuc2lvbgotCSAqIEByZXR1cm4gVGhlIGZpZWxkIHByb3h5IHRoYXQgaXMgY2FjaGUnZCBmb3IgcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eShSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJaWYgKCFyZWdpc3RyeS5pc1ZhbGlkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVJFTUZJRUxEQ09VTlQrKzsKLQkJTWFwIGZpZWxkczsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBUaGUgZmllbGQgbWFwIGlzIGtleWVkIGJ5IHRoZSBCZWFuVHlwZVByb3h5IGFuZCBob2xkcyBhIGZ1cnRoZXIgbWFwIG9mIGNhY2hlJ2QgZmllbGRzCi0JCQlmaWVsZHMgPSBnZXRGaWVsZHMoYUJlYW5UeXBlUHJveHkpOwkKLQkJCQkKLQkJCS8vIExvb2t1cCB0aGUgY2FjaGUnZCBGaWVsZCBwcm94eQotCQkJSUZpZWxkUHJveHkgcmVzdWx0ID0gKElGaWVsZFByb3h5KSBmaWVsZHMuZ2V0KGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJVU5JUVVFRklFTERDT1VOVCsrOwotCQlJRmllbGRQcm94eSByZXN1bHQgPSAoSUZpZWxkUHJveHkpIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhhQmVhblR5cGVQcm94eS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpKS5nZXRDbGFzc0dldEZpZWxkKCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKAotCQkJCWFCZWFuVHlwZVByb3h5LAotCQkJCXJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGZpZWxkTmFtZSkpOwkKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlJRmllbGRQcm94eSBmVmFsdWUgPSAoSUZpZWxkUHJveHkpIGZpZWxkcy5nZXQoZmllbGROYW1lKTsKLQkJCWlmIChmVmFsdWUgIT0gbnVsbCkgewotCQkJCXJlZ2lzdHJ5LnJlbGVhc2VQcm94eShyZXN1bHQpOwkvLyBEb24ndCBuZWVkIGl0IG5vdy4gQSByYWNlIGhhZCBwdXQgYW5vdGhlciBvbmUgaW4uCi0JCQkJcmV0dXJuIGZWYWx1ZTsKLQkJCX0KLQkJCWZpZWxkcy5wdXQoZmllbGROYW1lLHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsJCQkJCi0JfQotCQotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIGFCZWFuVHlwZVByb3h5LCBmaW5hbCBTdHJpbmcgZmllbGROYW1lKXsKLQkJaWYgKCFyZWdpc3RyeS5pc1ZhbGlkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVJFTUZJRUxEQ09VTlQrKzsKLQkJTWFwIGZpZWxkczsKLQkJTWFwIGVwRmllbGRzOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIFRoZSBjbGFzc0NhY2hlIG1hcCBpcyBrZXllZCBieSB0aGUgQmVhblR5cGVQcm94eSBuYW1lIGFuZCBob2xkcyBhIGZ1cnRoZXIgbWFwIG9mIGNhY2hlJ2QgbWV0aG9kcwotCQkJZmllbGRzID0gZ2V0RmllbGRzKGFCZWFuVHlwZVByb3h5KTsJCi0JCQotCQkJSVByb3h5RmllbGQgcmVzdWx0ID0gKElQcm94eUZpZWxkKSBmaWVsZHMuZ2V0KGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQotCQkJLy8gU2VlIGlmIHN0b3JlZCBpbiB0aGUgZXhwcmVzc2lvbi4KLQkJCWVwRmllbGRzID0gKChSRU1FeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRGaWVsZHMoYUJlYW5UeXBlUHJveHkpOwotCQkJcmVzdWx0ID0gKElQcm94eUZpZWxkKSBlcEZpZWxkcy5nZXQoZmllbGROYW1lKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwkJCQotCQl9Ci0JCQotCQlVTklRVUVGSUVMRENPVU5UKys7Ci0JCS8vIEdldCB0aGUgZmllbGQgZXhwcmVzc2lvbiBwcm94eSBhbmQgY2FjaGUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCUlQcm94eUZpZWxkIHJlc3VsdCA9ICgoUkVNRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlRmllbGRFeHByZXNzaW9uUHJveHkoYUJlYW5UeXBlUHJveHksIGZpZWxkTmFtZSk7Ci0JCWVwRmllbGRzLnB1dChmaWVsZE5hbWUsIHJlc3VsdCk7Ci0JCWZpbmFsIE1hcCBmcEZpZWxkcyA9IGZpZWxkczsKLQkJZmluYWwgTWFwIGZlcEZpZWxkcyA9IGVwRmllbGRzOwotCQkoKEV4cHJlc3Npb25Qcm94eSkgcmVzdWx0KS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJFTVByb3h5Q29uc3RhbnRzLnRoaXMpIHsKLQkJCQkJaWYgKGZwRmllbGRzLmNvbnRhaW5zS2V5KGZpZWxkTmFtZSkpCi0JCQkJCQlyZXR1cm47CS8vIEFscmVhZHkgc2V0IHRvIHJlc29sdmVkIHZhbHVlIGJ5IHNvbWVvbmUgZWxzZS4KLQkJCQkJZnBGaWVsZHMucHV0KGZpZWxkTmFtZSwgZXZlbnQuZ2V0UHJveHkoKSk7Ci0JCQkJfQotCQkJfQotCQkJIHB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkgc3luY2hyb25pemVkIChSRU1Qcm94eUNvbnN0YW50cy50aGlzKSB7Ci0JCQkJCSBmZXBGaWVsZHMucmVtb3ZlKGZpZWxkTmFtZSk7Ci0JCQkJfQotCQkJIH0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwkJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmE0ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjI1ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHJlZ2lzdHJ5IHRvIHVzZSBmb3IgUmVtb3RlIFZNLgotICogSXQgYWRkcyB0byB0aGUgc3RhbmRhcmQgcmVnaXN0cnksIGNvbm5lY3Rpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0gKgotICogVGhpcyB3aWxsIGFsd2F5cyBob2xkIG9udG8gb25lIGNvbm5lY3Rpb24gb3BlbiB1bnRpbCB0ZXJtaW5hdGlvbiBpcyByZXF1ZXN0ZWQuCi0gKiBUaGF0IHdheSB3aGlsZSB0aGUgSURFIGlzIHVwLCB0aGUgcmVtb3ZlIHZtIHdvbid0IHRpbWUgb3V0LgotICovCi0KLXB1YmxpYyBjbGFzcyBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIEJhc2VQcm94eUZhY3RvcnlSZWdpc3RyeSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX1JFR0lTVFJZX1RZUEVfSUQgPSAib3JnLmVjbGlwc2UuamVtLlJFTU9URSI7CS8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgaW50IGZTZXJ2ZXJQb3J0ID0gMDsJLy8gVGhlIHNlcnZlciBwb3J0IHRvIHVzZSB3aGVuIG1ha2luZyBjb25uZWN0aW9ucy4KLQlwcm90ZWN0ZWQgUkVNQ2FsbGJhY2tSZWdpc3RyeSBmQ2FsbGJhY2tTZXJ2ZXI7CS8vIFRoZSBjYWxsYmFjayBzZXJ2ZXIgdGhyZWFkIGZvciB0aGlzIHJlbW90ZSB2bS4KLQlwcm90ZWN0ZWQgU3RhY2sgZkNvbm5lY3Rpb25Qb29sID0gbmV3IFN0YWNrKCk7CS8vIFN0YWNrIG9mIGZyZWUgY29ubmVjdGlvbnMuCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgTlVNQkVSX0ZSRUVfQ09OTkVDVElPTlMgPSA1OwkvLyBOdW1iZXIgb2YgZnJlZSBjb25uZWN0aW9ucyB0byBrZWVwIG9wZW4uCi0JcHJvdGVjdGVkIElQcm9jZXNzIGZQcm9jZXNzOwkvLyBUaGUgcHJvY2VzcyB0aGF0IGlzIHRoZSBzZXJ2ZXIuIElmIG51bGwgYW5kIGZTZXJ2ZXJQb3J0IGlzIG5vdCB6ZXJvLCAKLQkJCQkJCQkJCS8vIHRoZW4gdGhpcyByZWdpc3RyeSBpcyBpbiB0ZXN0IG1vZGUKLQkJCQkJCQkJCS8vIGFuZCB0aGUgc2VydmVyIGlzIGluIHNhbWUgdGhlIHByb2Nlc3MuCi0JcHJvdGVjdGVkIFN0cmluZyBmTmFtZTsKLQlwcm90ZWN0ZWQgaW50IGZDYWxsYmFja1NlcnZlclBvcnQ7Ci0JcHJvdGVjdGVkIEludGVnZXIgZlJlZ2lzdHJ5S2V5OwotCXByb3RlY3RlZCBSRU1SZWdpc3RyeUNvbnRyb2xsZXIgZlJlZ2lzdHJ5Q29udHJvbGxlcjsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIE9iamVjdCBURVJNSU5BVEVfSk9CX0ZBTUlMWSA9IG5ldyBPYmplY3QoKTsKLQkKLQkvLyBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIG9ubHkgdGhlIFByb3h5Vk1TdGFydGVyIHNob3VsZCBzZXQgdGhpcyBmbGFnLiBJdCB3b3VsZCBzZXQgaXQgaWYKLQkvLyB3b3JraW5nIHdpdGggYSBkZWJ1Z2dlciBiZWNhdXNlIHdlIGRvbid0IGhvdyBsb25nIGl0IHdpbGwgYmUgdG8gcmVzcG9uZCB0byByZXF1ZXN0cyB3aGVuIAotCS8vIHNvbWVvbmUgaXMgd29ya2luZyB3aXRoIGEgZGVidWdnZXIuCi0JYm9vbGVhbiBmTm9UaW1lb3V0cyA9IGZhbHNlOwotCQotCS8vIFRoaXMgaXMgc2V0IHZpYSB0aGUgc3RhdGljIHNldEdsb2JhbE5vVGltZW91dHMoKSBtZXRob2QsIG9yIHZpYSBkZWJ1ZyBvcHRpb25zIGZsYWcuIEl0IGlzIGhlcmUgc28gdGhhdAotCS8vIHdoZW4gZGVidWdnaW5nIGNhbGxiYWNrcywgYnV0IG5vdCBkZWJ1Z2dpbmcgcmVtb3RlIHZtLCB0aGF0IG5vIHRpbWVvdXRzIGZvciBhbnkgcmVnaXN0cnkgd2lsbCBvY2N1ci4KLQkvLyBPciBpdCBjYW4gYmUgc2V0IHRocm91Z2ggdGhlIGRlYnVnIC5vcHRpb25zIGZsYWcuCi0Jc3RhdGljIGJvb2xlYW4gZkdsb2JhbE5vVGltZW91dHMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKStQcm94eVJlbW90ZVV0aWwuTk9fVElNRU9VVFMpKTsgLy8kTk9OLU5MUy0xJDsKLQkKLQkvKioKLQkgKiBUeXBpY2FsbCBzZXQgdGhyb3VnaCB0aGUgImV4cHJlc3Npb24iIGV2YWx1YXRpb24gb2YgdGhlIGRlYnVnZ2VyLgotCSAqIEBwYXJhbSBub1RpbWVvdXRzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEdsb2JhbE5vVGltZW91dHMoYm9vbGVhbiBub1RpbWVvdXRzKSB7Ci0JCWZHbG9iYWxOb1RpbWVvdXRzID0gbm9UaW1lb3V0czsKLQl9Ci0JCi0JLy8gQW4gaW50ZXJuYWwgdGhyZWFkIHRoYXQgbG9ja3MgYW5kIHdhaXRzIGZvciB0aGUgcmVtb3RlIHZtIHRvIHJlZ2lzdGVyIGl0c2VsZi4gCi0JcHJpdmF0ZSBXYWl0Rm9yUmVnaXN0cmF0aW9uVGhyZWFkIHdhaXRSZWdpc3RyYXRpb25UaHJlYWQ7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBXYWl0Rm9yUmVnaXN0cmF0aW9uVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHVibGljIFdhaXRGb3JSZWdpc3RyYXRpb25UaHJlYWQoKSB7Ci0JCQlzdXBlcigiV2FpdCBmb3IgcmVtb3RlIHZtIHJlZ2lzdHJhdGlvbiB0aHJlYWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBXYWl0IGZvciByZWdpc3RyYXRpb24uIFB1dCBpdCBpbnRvIGEgdGhyZWFkIHNvIHRoaXMKLQkJCS8vIGNhbiBvY2N1ciB3aGlsZSBvdGhlciBzdHVmZiBnb2VzIG9uLiBJdCBsb2NrcyB0aGUgZkNvbm5lY3Rpb25Qb29sCi0JCQkvLyB1bnRpbCBkb25lIHNvIHRoYXQgdGhlIGZpcnN0IHJlcXVlc3QgZm9yIGEgY29ubmVjdGlvbiBieSBhbnlvbmUKLQkJCS8vIGVsc2Ugd2lsbCB3YWl0IHVudGlsIHRoaXMgdGhyZWFkIGlzIGZpbmlzaGVkLiAKLQkJCQotCQkJc3luY2hyb25pemVkKGZDb25uZWN0aW9uUG9vbCkgewotCQkJCXN5bmNocm9uaXplZChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeS50aGlzKSB7Ci0JCQkJCS8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSBoYXZlIHRoZSAKLQkJCQkJLy8gY29ubmVjdGlvbiBwb29sIGxvY2tlZC4KLQkJCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkudGhpcy5ub3RpZnlBbGwoKTsKLQkJCQl9Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCS8vIHN5bmMgb24gc2VsZiBzbyB0aGF0IGl0IGNhbiBiZSBub3RpZmllZCB3aGVuIGZpbmFsbHkgcmVjZWl2ZSB0aGUgcmVnaXN0cmF0aW9uCi0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSs2MDAwMDsKLQkJCQkJd2hpbGUgKHdhaXRSZWdpc3RyYXRpb25UaHJlYWQgIT0gbnVsbCAmJiAoZk5vVGltZW91dHMgfHwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBzdG9wVGltZSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS53YWl0KDYwMDAwKTsKLQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJd2FpdFJlZ2lzdHJhdGlvblRocmVhZCA9IG51bGw7CS8vIE5vIGxvbmdlciBleGlzdHMuCQkJCQotCQl9Ci0JfQotCi0JCi0JcHVibGljIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5KFJFTVJlZ2lzdHJ5Q29udHJvbGxlciByZWdpc3RyeUNvbnRyb2xsZXIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKFJFTU9URV9SRUdJU1RSWV9UWVBFX0lEKTsKLQkJZlJlZ2lzdHJ5Q29udHJvbGxlciA9IHJlZ2lzdHJ5Q29udHJvbGxlcjsJCQotCQlmUmVnaXN0cnlLZXkgPSBmUmVnaXN0cnlDb250cm9sbGVyLnJlZ2lzdGVyUmVnaXN0cnkodGhpcyk7CS8vIFJlZ2lzdGVyIHRoZSByZWdpc3RyeSB3aXRoIHRoZSBwbHVnaW4uCQkKLQkJZk5hbWUgPSBuYW1lOwkJCi0JCQotCQkvLyBHZXQgdGhlIHdhaXRSZWdpc3RyYXRpb25UaHJlYWQgc3RhcnRlZCBiZWZvcmUgd2UgYWN0dWFsbHkgbGF1bmNoIHJlbW90ZSB2bSBzbwotCQkvLyB0aGF0IGl0IGlzIHdhaXRpbmcgd2hlbiB0aGUgY2FsbGJhY2sgY29tZXMgaW4uCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJd2FpdFJlZ2lzdHJhdGlvblRocmVhZCA9IG5ldyBXYWl0Rm9yUmVnaXN0cmF0aW9uVGhyZWFkKCk7Ci0JCQl3YWl0UmVnaXN0cmF0aW9uVGhyZWFkLnN0YXJ0KCk7Ci0JCQkKLQkJCS8vIE5vdyB3ZSB3aWxsIHdhaXQgdW50aWwgdGhlIHJlZ2lzdHJhdGlvbiBjYWxsYmFjayBoYXMgYmVlbiBkb25lLiBUaGUgdGhyZWFkIHdpbGwKLQkJCS8vIHNpZ25hbCB1cyB3aGVuIHRoYXQgaXMgZG9uZS4gVGhpcyBpcyBzbyB0aGF0IHdlIGRvbid0IGNvbnRpbnVlIG9uIGFuZCBsZXQKLQkJCS8vIGEgd29yayBjb25uZWN0aW9uIGJlIHJlcXVlc3RlZCBiZWZvcmUgd2UgZXZlbiBnb3QgYSBjaGFuY2UgdG8gc3RhcnQgd2FpdGluZwotCQkJLy8gZm9yIHRoZSByZWdpc3RyYXRpb24uCi0JCQl3aGlsZSh0cnVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd2FpdCgpOwotCQkJCQlicmVhazsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfTsJCQotCQl9CQkKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0UmVnaXN0cnlLZXkoKSB7Ci0JCXJldHVybiBmUmVnaXN0cnlLZXk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVSZWdpc3RyeShJUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWZQcm9jZXNzID0gcHJvY2VzczsKLQkJcHJvY2Vzc0xpc3RlbmVyID0gbmV3IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JRGVidWdFdmVudFNldExpc3RlbmVyI2hhbmRsZURlYnVnRXZlbnRzKERlYnVnRXZlbnRbXSkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdIGV2ZW50cykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCURlYnVnRXZlbnQgZSA9IGV2ZW50c1tpXTsKLQkJCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gZlByb2Nlc3MgJiYgZS5nZXRLaW5kKCkgPT0gRGVidWdFdmVudC5URVJNSU5BVEUpIHsKLQkJCQkJCS8vIFdlIHRlcm1pbmF0aW5nIHRvbyBzb29uLiBQb3AgdXAgYSBtc2cuCi0JCQkJCQlJU3RyZWFtc1Byb3h5IHN0UHJveHkgPSBmUHJvY2Vzcy5nZXRTdHJlYW1zUHJveHkoKTsKLQkJCQkJCWphdmEuaW8uU3RyaW5nV3JpdGVyIHMgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQkJCQkJCWphdmEuaW8uUHJpbnRXcml0ZXIgdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKHMpOwotCQkKLQkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlByb3h5X1Rlcm1pbmF0ZWRfdG9vX3Nvb25fRVJST1JfLCBuZXcgT2JqZWN0W10ge2ZOYW1lfSk7IAotCQkJCQkJdy5wcmludGxuKG1zZyk7CQkJCQkJCi0JCQkJCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0lORk9fKTsgCi0JCQkJCQl3LnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5WTV9URVJNSU5BVEVEX0xJTkUxKTsgCi0JCQkJCQl3LnByaW50bG4oc3RQcm94eS5nZXRFcnJvclN0cmVhbU1vbml0b3IoKS5nZXRDb250ZW50cygpKTsKLQkJCQkJCXcucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlZNX1RFUk1JTkFURURfTElORTIpOyAKLQkJCQkJCXcucHJpbnRsbihzdFByb3h5LmdldE91dHB1dFN0cmVhbU1vbml0b3IoKS5nZXRDb250ZW50cygpKTsKLQkJCQkJCXcucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlZNX1RFUk1JTkFURURfTElORTMpOyAKLQkJCQkJCXcuY2xvc2UoKTsKLQkJCi0JCQkJCQlEZWJ1Z01vZGVIZWxwZXIgZGggPSBuZXcgRGVidWdNb2RlSGVscGVyKCk7Ci0JCQkJCQlkaC5kaXNwbGF5RXJyb3JNZXNzYWdlKFByb3h5UmVtb3RlTWVzc2FnZXMuUHJveHlfRXJyb3JfVGl0bGUsIG1zZyk7IAotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgcy50b1N0cmluZygpLCBudWxsKSk7Ci0JCQkJCQlwcm9jZXNzTGlzdGVuZXIgPSBudWxsOwotCQkJCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsJCQkJCQkKLQkJCQkJCXRlcm1pbmF0ZVJlZ2lzdHJ5KCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hZGREZWJ1Z0V2ZW50TGlzdGVuZXIocHJvY2Vzc0xpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJRGVidWdFdmVudFNldExpc3RlbmVyIHByb2Nlc3NMaXN0ZW5lciA9IG51bGw7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBDYWxsYmFja1JlZ2lzdHJ5Ci0JICovCi0JcHVibGljIElDYWxsYmFja1JlZ2lzdHJ5IGdldENhbGxiYWNrUmVnaXN0cnkoKSB7Ci0JCWlmIChmQ2FsbGJhY2tTZXJ2ZXIgPT0gbnVsbCkKLQkJCWZDYWxsYmFja1NlcnZlciA9IG5ldyBSRU1DYWxsYmFja1JlZ2lzdHJ5KGZOYW1lLCB0aGlzKTsKLQkJcmV0dXJuIGZDYWxsYmFja1NlcnZlcjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHJlZ2lzdHJ5IGNvbnRyb2xsZXIgdG8gdGVsbAotCSAqIHRoZSByZWdpc3RyeSB0byB0ZXJtaW5hdGUgd2l0aCBwcmVqdWRpY2UgYWxsIAotCSAqIHBlbmRpbmcgVGVybWluYXRlSm9icy4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FuY2VsQWxsVGVybWluYXRlSm9icygpIHsKLQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlciA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkJam9iTWFuYWdlci5jYW5jZWwoVEVSTUlOQVRFX0pPQl9GQU1JTFkpOwotCQl0cnkgewotCQkJam9iTWFuYWdlci5qb2luKFRFUk1JTkFURV9KT0JfRkFNSUxZLCBudWxsKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVybWluYXRlUHJvY2VzcyBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgSVByb2Nlc3MgcHJvY2VzczsKLQkJCi0JCXB1YmxpYyBUZXJtaW5hdGVQcm9jZXNzKElQcm9jZXNzIHByb2Nlc3MpIHsKLQkJCXN1cGVyKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfSm9iX1Rlcm1pbmF0ZVByb2Nlc3NfVGl0bGUpOwkgCi0JCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJcmV0dXJuIGZhbWlseSA9PSBURVJNSU5BVEVfSk9CX0ZBTUlMWSB8fCBzdXBlci5iZWxvbmdzVG8oZmFtaWx5KTsKLQkJfQotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuVGhyZWFkI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb24pIHsKLQkJCXRyeSB7Ci0JCQkJLy8gVGhlcmUgaXMgbm8gam9pbiBvbiBhIHByb2Nlc3MgYXZhaWxhYmxlLCBzbyB3ZSB3aWxsIGhhdmUgdG8KLQkJCQkvLyBidXN5IHdhaXQuIEdpdmUgaXQgMTAgc2Vjb25kcyBpbiAxLzEwIHNlY29uZCBpbnRlcnZhbHMuCi0JCQkJZm9yIChpbnQgaT0wOyAhcHJvY2Vzcy5pc1Rlcm1pbmF0ZWQoKSAmJiBpPDEwMDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsJCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXByb2Nlc3MuaXNUZXJtaW5hdGVkKCkpIHsKLQkJCQkJcHJvY2Vzcy50ZXJtaW5hdGUoKTsKLQkJCQl9IAotCQkJfSBjYXRjaCAoRGVidWdFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0cnlUZXJtaW5hdGVkKGJvb2xlYW4gd2FpdCkgewotCQlpZiAocHJvY2Vzc0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCS8vIFJlbW92ZSBsaXN0ZW5lciBjYXVzZSB3ZSBhcmUgbm93IGdvaW5nIHRvIHRlcm1pbmF0ZSBwcm9jZXNzIGFuZCBkb24ndCB3YW50IHByZW1hdHVyZSB0ZXJtaW5hdGUgbm90aWNlLgotCQkJLy8gU29tZXRpbWVzIGluIHNodXRkb3duIHdlIGFyZSBjYWxsZWQgYW5kIHRoZSBkZWJ1ZyBwbHVnaW4gbWF5IG9mIGFscmVhZHkgYmVlbiBzaHV0ZG93bi4gSW4gdGhhdCBjYXNlIHRoZSBkYgotCQkJLy8gd2lsbCBiZSBudWxsIGFuZCB0aGVyZSBpcyBub3RoaW5nIHJlbW92ZSBsaXN0ZW5lciBmcm9tLgotCQkJRGVidWdQbHVnaW4gZGIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQlpZiAoZGIgIT0gbnVsbCkKLQkJCQlkYi5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIocHJvY2Vzc0xpc3RlbmVyKTsKLQkJCXByb2Nlc3NMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQkJCi0JCUpvYiB0am9iID0gbnVsbDsKLQkJaWYgKGZTZXJ2ZXJQb3J0ICE9IDApIHsKLQkJCWlmICh3YWl0UmVnaXN0cmF0aW9uVGhyZWFkICE9IG51bGwpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKHdhaXRSZWdpc3RyYXRpb25UaHJlYWQpIHsKLQkJCQkJLy8gU3RpbGwgd2FpdGluZy4gY2xvc2UgaXQgb3V0LgotCQkJCQlXYWl0Rm9yUmVnaXN0cmF0aW9uVGhyZWFkIHdUaHJlYWQgPSB3YWl0UmVnaXN0cmF0aW9uVGhyZWFkOwotCQkJCQl3YWl0UmVnaXN0cmF0aW9uVGhyZWFkID0gbnVsbDsKLQkJCQkJd1RocmVhZC5ub3RpZnlBbGwoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCQotCQkJSVJFTUNvbm5lY3Rpb24gY2xvc2VDb24gPSBudWxsOwkvLyBUaGUgY29ubmVjdGlvbiB3ZSB3aWxsIHVzZSB0byBjbG9zZSB0aGUgcmVtb3RlIHZtLgotCQkJc3luY2hyb25pemVkKGZDb25uZWN0aW9uUG9vbCkgewotCQkJCS8vIE5vdyB3ZSB3YWxrIHRocm91Z2ggYWxsIG9mIHRoZSBmcmVlIGNvbm5lY3Rpb25zIGFuZCBjbG9zZSB0aGVtIHByb3Blcmx5LgotCQkJCUl0ZXJhdG9yIGl0ciA9IGZDb25uZWN0aW9uUG9vbC5pdGVyYXRvcigpOwotCQkJCWlmIChpdHIuaGFzTmV4dCgpKQotCQkJCQljbG9zZUNvbiA9IChJUkVNQ29ubmVjdGlvbikgaXRyLm5leHQoKTsKLQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQlJUkVNQ29ubmVjdGlvbiBjb24gPSAoSVJFTUNvbm5lY3Rpb24pIGl0ci5uZXh0KCk7Ci0JCQkJCWNvbi5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCQkKLQkJCS8vIE5vdyB3ZSB0ZXJtaW5hdGUgdGhlIHNlcnZlci4KLQkJCWlmIChjbG9zZUNvbiA9PSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWNsb3NlQ29uID0gZ2V0RnJlZUNvbm5lY3Rpb24oKTsJLy8gVGhlcmUgd2VyZW4ndCBhbnkgZnJlZSBjb25uZWN0aW9ucywgc28gZ2V0IGEgbmV3IG9uZSBzbyB0aGF0IHdlIGNhbiBjbG9zZSBpdC4KLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBEbyBub3RoaW5nLCBkb24ndCB3YW50IHRvIHN0b3AgdGVybWluYXRpb24ganVzdCBiZWNhdXNlIHdlIGNhbid0IGdldCBhIGNvbm5lY3Rpb24uCi0JCQkJfQotCQkJaWYgKGNsb3NlQ29uICE9IG51bGwpIHsKLQkJCQljbG9zZUNvbi50ZXJtaW5hdGVTZXJ2ZXIoKTsJLy8gV2UgZ290IGEgY29ubmVjdGlvbiB0byB0ZXJtaW5hdGUgKHByb2Nlc3MgbWF5IG9mIHRlcm1pbmF0ZWQgZWFybHksIHNvIHdlIHdvdWxkIG5vdCBoYXZlIGEgY29ubiB0aGVuKS4KLQkJCX0KLQkJCWZDb25uZWN0aW9uUG9vbC5jbGVhcigpOwotCQkJZlNlcnZlclBvcnQgPSAwOwotCQkJCi0JCQlpZiAoZlByb2Nlc3MgIT0gbnVsbCAmJiAhZlJlZ2lzdHJ5Q29udHJvbGxlci5pblNodXREb3duKCkpIHsKLQkJCQl0am9iID0gbmV3IFRlcm1pbmF0ZVByb2Nlc3MoZlByb2Nlc3MpOwotCQkJCXRqb2Iuc2V0U3lzdGVtKHRydWUpOwotCQkJCXRqb2Iuc2NoZWR1bGUoKTsKLQkJCQlmUHJvY2VzcyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkKLQkJaWYgKGZDYWxsYmFja1NlcnZlciAhPSBudWxsKSB7Ci0JCQlmQ2FsbGJhY2tTZXJ2ZXIucmVxdWVzdFNodXRkb3duKCk7Ci0JCQlmQ2FsbGJhY2tTZXJ2ZXIgPSBudWxsOwkJCQkKLQkJfQotCQkKLQkJZkNvbm5lY3Rpb25Qb29sLmNsZWFyKCk7Ci0JCWZSZWdpc3RyeUNvbnRyb2xsZXIuZGVyZWdpc3RlclJlZ2lzdHJ5KGZSZWdpc3RyeUtleSk7CS8vIERlLXJlZ2lzdGVyIHRoaXMgcmVnaXN0cnkuCi0JCQotCQlpZiAod2FpdCAmJiB0am9iICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGpvYi5qb2luKCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSXQgdGltZWQgb3V0LCBzbyB3ZSdsbCBqdXN0IGdvIG9uLgotCQkJfQotCQl9Ci0JfQotCQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXJ2ZXIgcG9ydCBudW1iZXIuCi0JICovCi0JcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0KCkgewotCQlyZXR1cm4gZlNlcnZlclBvcnQ7Ci0JfQotCQotCS8qCi0JICogc2V0IHRoZSBzZXJ2ZXIgcG9ydC4KLQkgKi8KLQl2b2lkIHNldFNlcnZlclBvcnQoaW50IHNlcnZlcnBvcnQpIHsKLQkJZlNlcnZlclBvcnQgPSBzZXJ2ZXJwb3J0OwotCQlpZiAod2FpdFJlZ2lzdHJhdGlvblRocmVhZCAhPSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkICh3YWl0UmVnaXN0cmF0aW9uVGhyZWFkKSB7Ci0JCQkJCS8vIENsb3NlIGl0IG91dCwgd2UgYXJlIG5vdyByZWdpc3RlcmVkCi0JCQkJCVdhaXRGb3JSZWdpc3RyYXRpb25UaHJlYWQgd1RocmVhZCA9IHdhaXRSZWdpc3RyYXRpb25UaHJlYWQ7Ci0JCQkJCXdhaXRSZWdpc3RyYXRpb25UaHJlYWQgPSBudWxsOwotCQkJCQl3VGhyZWFkLm5vdGlmeUFsbCgpOwotCQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBmcmVlIGNvbm5lY3Rpb24KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSBUaHJvd24gaWYgYSBjb25uZWN0aW9uIGNhbm5vdCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJUkVNQ29ubmVjdGlvbiBnZXRGcmVlQ29ubmVjdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlUaHJlYWQgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQkJaWYgKHRocmVhZCBpbnN0YW5jZW9mIFJFTUNhbGxiYWNrVGhyZWFkKSB7Ci0JCQkvLyBUaGUgY3VycmVudCB0aHJlYWQgaXMgYSBjYWxsIGJhY2sgdGhyZWFkLCBzbyBqdXN0IHJldXNlIHRoZSBjb25uZWN0aW9uLgotCQkJLy8gQnV0IHRoaXMgdGhyZWFkIGNvdWxkIGFjdHVhbGx5IGJlIHRyeWluZyB0byBhY2Nlc3MgYW5vdGhlciByZWdpc3RyeS4KLQkJCS8vIFNvIGlmIHRoaXMgdGhyZWFkIGlzIGZvciB0aGlzIHJlZ2lzdHJ5LCB1c2UgaXQsIGlmIG5vdCBmb3IgdGhpcyByZWdpc3RyeSwgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24uCi0JCQkvLyBCdXQgaWYgZm9yIHRoaXMgcmVnaXN0cnkgQU5EIGlzIGFscmVhZHkgaW4gYSB0cmFuc2FjdGlvbiwgd2UgbmVlZCBhIGZyZXNoIGNvbm5lY3Rpb24uCi0JCQlSRU1DYWxsYmFja1RocmVhZCBjYWxsYmFja1RocmVhZCA9IChSRU1DYWxsYmFja1RocmVhZCkgdGhyZWFkOwotCQkJaWYgKGNhbGxiYWNrVGhyZWFkLnJlZ2lzdHJ5ID09IHRoaXMgJiYgIWNhbGxiYWNrVGhyZWFkLmluVHJhbnNhY3Rpb24oKSkgewotCQkJCS8vIFRoaXMgd2F5IGFueSBjYWxscyBvdXQgdG8gdGhlIHJlbW90ZSB2bSB3aWxsIGJlIG9uIHNhbWUgdGhyZWFkIGFzIGNhbGxiYWNrIGNhbGxlcgotCQkJCS8vIG9uIHJlbW90ZSB2bSBiZWNhdXNlIHRoYXQgdGhyZWFkIGlzIHdhaXRpbmcgb24gdGhpcyBjb25uZWN0aW9uIGZvciBjb21tYW5kcy4KLQkJCQlJUkVNQ29ubmVjdGlvbiBjID0gKGNhbGxiYWNrVGhyZWFkKS5nZXRDb25uZWN0aW9uKCk7Ci0JCQkJaWYgKGMuaXNDb25uZWN0ZWQoKSkKLQkJCQkJcmV0dXJuIGM7Ci0JCQkJZWxzZQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ2FsbGJhY2tDb25uZWN0aW9uTm90V29ya2luZ19FWENfKTsgCi0JCQl9Ci0JCX0KLQkJc3luY2hyb25pemVkKGZDb25uZWN0aW9uUG9vbCkgewotCQkJaWYgKCFmQ29ubmVjdGlvblBvb2wuaXNFbXB0eSgpKQotCQkJCXJldHVybiAoSVJFTUNvbm5lY3Rpb24pIGZDb25uZWN0aW9uUG9vbC5wb3AoKTsKLQkJCS8vIGVsc2Ugd2UgbmVlZCB0byBhbGxvY2F0ZSBvbmUuCQkJCi0JCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbigpOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogTWFrZSBhIG5ldyBjb25uZWN0aW9uLgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIFRocm93biBpZiBjb25uZWN0aW9uIGNhbm5vdCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBJUkVNQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCS8vIElmIHdlIGhhdmUgYSBzZXJ2ZXIgcG9ydCwgdGhlbiB0aGUgc2VydmVyIGlzIHByb2JhYmx5IG9wZW4uIElmIHdlIGRvbid0IHRoZW4gdGhlcmUgaXMgbm8gc2VydmVyLgotCQlpZiAoZlNlcnZlclBvcnQgIT0gMCkgewotCQkJLy8gV2UgYXJlIHB1dHRpbmcgaXQgb2ZmIGludG8gYSB0aHJlYWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdGltZW91dCBjYXBhYmlsaXRpZXMgb24gZ2V0dGluZyBhIHNvY2tldC4KLQkJCS8vIFNvIHdlIG5lZWQgdG8gYWxsb3cgZm9yIHRoYXQuCi0JCQlmaW5hbCBTb2NrZXRbXSBzY0FycmF5ID0gbmV3IFNvY2tldFsxXTsKLQkJCWZpbmFsIGJvb2xlYW5bXSB3YWl0aW5nID0gbmV3IGJvb2xlYW5bXSB7dHJ1ZX07Ci0JCQlUaHJlYWQgZG9JdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVNvY2tldCBzYyA9IG5ldyBTb2NrZXQoImxvY2FsaG9zdCIsIGZTZXJ2ZXJQb3J0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCQkJaWYgKHdhaXRpbmdbMF0pCi0JCQkJCQkJCXNjQXJyYXlbMF0gPSBzYzsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXNjLmNsb3NlKCk7CS8vIFdlIGFyZSBubyBsb25nZXIgd2FpdGluZyBvbiB0aGlzIHRocmVhZCBzbyBjbG9zZSB0aGUgc29ja2V0IHNpbmNlIG5vIG9uZSB3aWxsIHVzZSBpdC4KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWRvSXQuc3RhcnQoKTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZG9JdC5qb2luKCFmTm9UaW1lb3V0cyA/IDYwMDAwIDogMCk7Ci0JCQkJCXN5bmNocm9uaXplZCAoZG9JdCkgewotCQkJCQkJd2FpdGluZ1swXSA9IGZhbHNlOwkvLyBUbyBsZXQgaXQga25vdyB3ZSBhcmUgbm8gbG9uZ2VyIHdhaXRpbmcKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoc2NBcnJheVswXSA9PSBudWxsKSAgewotCQkJCS8vIExvZyB3aGVyZSB3ZSBhcmUgYXQgc28gd2UgY2FuIGtub3cgd2hlcmUgaXQgd2FzIHdlIGRvd24uCi0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db25uZWN0aW9uQ3JlYXRpb25GYWlsZWRfSU5GT18pKSk7CQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db3VsZE5vdENyZWF0ZVNvY2tldENvbm5lY3Rpb25Ub1JlbW90ZVZNX0VYQ18pOwkvLyBDb3VsZG4ndCBnZXQgb25lLCBwcm9iYWJseSBzZXJ2ZXIgaXMgZG93bi4gLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgUkVNQ29ubmVjdGlvbihzY0FycmF5WzBdLCBmTm9UaW1lb3V0cyk7Ci0JCQlpZiAoY29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKQotCQkJCXJldHVybiBjb25uZWN0aW9uOwotCQkJCQotCQkJLy8gRmFpbGVkLCBjbG9zZSB0aGUgc29ja2V0LiAKLQkJCXRyeSB7Ci0JCQkJc2NBcnJheVswXS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9IGVsc2UKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJObyBTZXJ2ZXIgdG8gcmV0cmlldmUgYSBjb25uZWN0aW9uLiIsIG51bGwpKTsJLy8vJE5PTi1OTFMtMSQKLQkJCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db3VsZE5vdENyZWF0ZVNvY2tldENvbm5lY3Rpb25Ub1JlbW90ZVZNX0VYQ18pOyAKLQl9Ci0JCSAKLQkvKioKLQkgKiBGcmVlIHRoZSBjb25uZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmV0dXJuQ29ubmVjdGlvbihJUkVNQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCWlmIChjb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKLQkJCVRocmVhZCB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQkJaWYgKCEodGhyZWFkIGluc3RhbmNlb2YgUkVNQ2FsbGJhY2tUaHJlYWQpIHx8ICgoUkVNQ2FsbGJhY2tUaHJlYWQpIHRocmVhZCkuZ2V0Q29ubmVjdGlvbigpICE9IGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBXZSBhcmUgbm90IGEgY2FsbGJhY2sgdGhyZWFkLCBvciB3ZSBhcmUgYnV0IHRoZSBjb25uZWN0aW9uIGlzIG5vdCBmb3IgdGhlIHRocmVhZCwgdGhlbiB0aGUgY29ubmVjdGlvbgotCQkJCS8vIGNhbiBiZSByZXR1cm5lZC4KLQkJCQlzeW5jaHJvbml6ZWQgKGZDb25uZWN0aW9uUG9vbCkgewotCQkJCQlpZiAoZkNvbm5lY3Rpb25Qb29sLnNpemUoKSA8IE5VTUJFUl9GUkVFX0NPTk5FQ1RJT05TKQotCQkJCQkJZkNvbm5lY3Rpb25Qb29sLnB1c2goY29ubmVjdGlvbik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbm5lY3Rpb24uY2xvc2UoKTsJLy8gV2UgZG9uJ3QgbmVlZCB0byBtYWludGFpbiBtb3JlIHRoYW4gZml2ZSBmcmVlIGNvbm5lY3Rpb25zLgotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZWxlYXNlIHRoaXMgY29ubmVjdGlvbi4gVGhpcyBtZWFucyBjbG9zZSBpdCBvdXQuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VDb25uZWN0aW9uKElSRU1Db25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50IGNvbm5lY3Rpb25Db3VudCgpIHsKLQkJc3luY2hyb25pemVkIChmQ29ubmVjdGlvblBvb2wpIHsKLQkJCXJldHVybiBmQ29ubmVjdGlvblBvb2wuc2l6ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1SZWdpc3RyeUNvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNUmVnaXN0cnlDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODBhMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1SZWdpc3RyeUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1SZWdpc3RyeUNvbnRyb2xsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBjb250cm9sbGVyIGZvciBhbGwgb2YgdGhlIHJlZ2lzdHJpZXMuCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1SZWdpc3RyeUNvbnRyb2xsZXIgewotCQotCXByaXZhdGUgTWFwIGZBY3RpdmVSZWdpc3RyaWVzID0gbmV3IEhhc2hNYXAoKTsJLy8gQWNjZXNzIHRvIHRoaXMgbXVzdCBiZSBzeW5jKFJFTVJlZ2lzdHJ5Q29udHJvbGxlcikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIENMRUFOVVBfSU5URVJWQUwgPSA2MDAwMGw7CS8vIFRoZSBpbnRlcnZhbCBiZXR3ZWVuIGNsZWFuIHVwIGpvYiBleGVjdXRpb24uCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5TaHV0ZG93bjsJLy8gQXJlIHdlIGluIHNodXRkb3duIG1vZGUuIFRlcm1pbmF0ZSByZWdpc3RyaWVzIHJ1bnMgZGlmZmVyZW50bHkgaW4gc2h1dGRvd24gbW9kZS4KLQkKLQkvLyBUaHJlYWQgdG8gY2xlYW4gdXAgR0MnZCBwcm94aWVzLiBSdW5zIGFzIGEgZGFlbW9uIGF0IHRoZSBsb3dlc3QgcHJpb3JpdHkKLQlwcml2YXRlIEpvYiBwcm9jZXNzUXVldWVKb2I9IG5ldyBKb2IoUHJveHlSZW1vdGVNZXNzYWdlcy5DbGVhbnVwSm9iX3RpdGxlKSB7IAotCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtKSB7Ci0JCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlbXSByZWdpc3RyaWVzID0gbnVsbDsKLQkJCQlzeW5jaHJvbml6ZWQgKFJFTVJlZ2lzdHJ5Q29udHJvbGxlci50aGlzKSB7Ci0JCQkJCS8vIFRoaXMgbGlzdCBtYXkgYmUgdXBkYXRlZCBieSBvdGhlcnMsIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkKLQkJCQkJLy8gb3IgZWxzZSB3ZSBjb3VsZCBnZXQgYSBmYWlsdXJlLgotCQkJCQlyZWdpc3RyaWVzID0gCi0JCQkJCQkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlbXSkgZkFjdGl2ZVJlZ2lzdHJpZXMudmFsdWVzKCkudG9BcnJheSgKLQkJCQkJCQluZXcgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlbZkFjdGl2ZVJlZ2lzdHJpZXMuc2l6ZSgpXSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJKChSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIHJlZ2lzdHJpZXNbaV0uZ2V0QmVhblByb3h5RmFjdG9yeSgpKS5wcm9jZXNzUXVldWUoKTsJCQkJCQotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFdoZW4gZGVidWdnaW5nLCBnZXRCZWFuUHJveHlGYWN0b3J5IGNhbiB0aHJvdyBleGNlcHRpb24gYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZAotCQkJCQkJLy8geWV0IHdoZW4gdGhlIHRocmVhZCB3YWtlcyB1cCwgdGhvdWdoIHRoZSByZWdpc3RyeSBoYXMgYmVlbiByZWdpc3RlcmVkLiBJdCBoYXMgdG8gZG8gd2l0aCBpdCAKLQkJCQkJCS8vIGNhbiB0YWtlIHNpZ25pZmljYW50IHRpbWUgZm9yIHRoZSB1c2VyIHRvIHN0YXJ0IHVwIHRoZSBkZWJ1Z2dlciwgYW5kIGR1cmluZyB0aGF0IHRpbWUgdGhpcwotCQkJCQkJLy8gdGhyZWFkIGNvdWxkIGtpY2sgaW4uCi0JCQkJCX0KLQkJCQl9Ci0JCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJCWlmICghbS5pc0NhbmNlbGVkKCkpCi0JCQkJCXRoaXMuc2NoZWR1bGUoQ0xFQU5VUF9JTlRFUlZBTCk7CS8vIFNjaGVkdWxlIHRvIHN0YXJ0IGFnYWluIGluIG9uZSBtaW51dGUuCi0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JfTsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwdWJsaWMgUkVNUmVnaXN0cnlDb250cm9sbGVyKCkgewotCi0JCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmFkZFByb3h5U2h1dGRvd25MaXN0ZW5lcihuZXcgUHJveHlQbHVnaW4uSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlQbHVnaW4uSVByb3h5UGx1Z2luU2h1dGRvd25MaXN0ZW5lciNzaHV0ZG93bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQkJCVJFTVJlZ2lzdHJ5Q29udHJvbGxlci50aGlzLnNodXRkb3duKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW1hc3RlclRocmVhZCA9IG5ldyBSRU1NYXN0ZXJTZXJ2ZXJUaHJlYWQodGhpcyk7Ci0JCW1hc3RlclRocmVhZC5zdGFydCgpOwotCi0JCXByb2Nlc3NRdWV1ZUpvYi5zZXRTeXN0ZW0odHJ1ZSk7CS8vIFNvIHRoYXQgaXQgd29uJ3Qgc2hvdyBwcm9jZXNzaW5nIGluIHByb2Nlc3Mgdmlldy4gTm90IG9mIGludGVyZXN0IHRvIGdlbmVyYWwgdXNlcnMuCi0JCXByb2Nlc3NRdWV1ZUpvYi5zZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQlwcm9jZXNzUXVldWVKb2Iuc2NoZWR1bGUoQ0xFQU5VUF9JTlRFUlZBTCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgd2UgYXJlIHNodXR0aW5nIGRvd24gb3Igbm90LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpblNodXREb3duKCkgewotCQlyZXR1cm4gaW5TaHV0ZG93bjsKLQl9Ci0JCi0JLyoKLQkgKiBBZGQgcmVnaXN0cnkgdG8gbGlzdCBvZiBhY3RpdmUuIFJldHVybiBhIHVuaXF1ZSBudW1iZXIgdG8gYmUgdGhlIGtleS4KLQkgKiBQYWNrYWdlLXByb3RlY3RlZCBzbyB0aGF0IG9ubHkgbG9jYWxzIGNhbiBhY2Nlc3MgaXQuCi0JICovCi0Jc3luY2hyb25pemVkIEludGVnZXIgcmVnaXN0ZXJSZWdpc3RyeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJCi0JCUludGVnZXIgaGFzaGNvZGUgPSBuZXcgSW50ZWdlcihyZWdpc3RyeS5oYXNoQ29kZSgpKTsJCQotCQl3aGlsZSAodHJ1ZSkgewotCQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZXhpc3RpbmcgPSAoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkpIGZBY3RpdmVSZWdpc3RyaWVzLmdldChoYXNoY29kZSk7Ci0JCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkKLQkJCQlicmVhazsJLy8gTm90IHlldCByZWdpc3RlcmVkLCB1c2UgdXNlIHRoZSBoYXNoY29kZQotCQkJZWxzZSBpZiAoZXhpc3RpbmcgIT0gcmVnaXN0cnkpCi0JCQkJaGFzaGNvZGUgPSBuZXcgSW50ZWdlcihoYXNoY29kZS5pbnRWYWx1ZSgpKzEpOwkJCQkJCQotCQkJZWxzZQotCQkJCXJldHVybiBoYXNoY29kZTsJLy8gU2FtZSBndXksIHVzZSB0aGUgaGFzaGNvZGUuCi0JCX0KLQkJCi0JCWZBY3RpdmVSZWdpc3RyaWVzLnB1dChoYXNoY29kZSwgcmVnaXN0cnkpOwotCQlyZXR1cm4gaGFzaGNvZGU7Ci0JfQotCQotCS8qCi0JICogZGVyZWdpc3RlciB0aGUgcmVnaXN0cnkuCi0JICovCi0Jc3luY2hyb25pemVkIHZvaWQgZGVyZWdpc3RlclJlZ2lzdHJ5KEludGVnZXIga2V5KSB7Ci0JCWZBY3RpdmVSZWdpc3RyaWVzLnJlbW92ZShrZXkpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiB0aGUgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBrZXkKLQkgKi8KLQlzeW5jaHJvbml6ZWQgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoSW50ZWdlciBrZXkpIHsKLQkJcmV0dXJuIChSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSkgZkFjdGl2ZVJlZ2lzdHJpZXMuZ2V0KGtleSk7Ci0JfQotCQotCS8qKgotCSAqIE1hc3RlciBzZXJ2ZXIgdGhyZWFkLiBIYW5kbGVzIGtlZXAtYWxpdmUgcmVxdWVzdHMgYW5kIHJlZ2lzdGVyIHJlbW90ZSBzZXJ2ZXIgdGhyZWFkcy4KLQkgKiBJdCB3aWxsIGJlIGNyZWF0ZWQgd2hlbiBuZWVkZWQuCi0JICovCi0JcHJvdGVjdGVkIFJFTU1hc3RlclNlcnZlclRocmVhZCBtYXN0ZXJUaHJlYWQ7Ci0KLQkvKgotCSAqIFNodXRzIGRvd24gdGhpcyBwbHVnLWluIGFuZCBkaXNjYXJkcyBhbGwgcGx1Zy1pbiBzdGF0ZS4KLQkgKgotCSAqIEluIHRoaXMgY2FzZSwgdGVybWluYXRlIGFsbCBvZiB0aGUgYWN0aXZlIHJlZ2lzdHJpZXMgc28gdGhhdCB0aGV5IGNhbiBiZSBzaHV0ZG93bi4KLQkgKiBEb24ndCB3YW50IHRoZW0gaGFuZ2luZyBhcm91bmQgYWZ0ZXIgdGVybWluYXRpb24gb2YgdGhlIGRlc2t0b3AuCi0JICovCi0Jdm9pZCBzaHV0ZG93bigpIHsKLQkJCi0JCXN5bmNocm9uaXplZChwcm9jZXNzUXVldWVKb2IpIHsKLQkJCXByb2Nlc3NRdWV1ZUpvYi5jYW5jZWwoKTsKLQkJfQotCQkJCi0JCVJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5W10gcmVnaXN0cmllcyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJLy8gVGhpcyBsaXN0IHdpbGwgYmUgdXBkYXRlZCBpbiB0aGUgdGVybWluYXRlUmVnaXN0cnksIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkKLQkJCS8vIG9yIGVsc2Ugd2UgZ2V0IGEgZmFpbHVyZS4KLQkJCXJlZ2lzdHJpZXMgPSAKLQkJCQkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlbXSkgZkFjdGl2ZVJlZ2lzdHJpZXMudmFsdWVzKCkudG9BcnJheSgKLQkJCQkJbmV3IFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5W2ZBY3RpdmVSZWdpc3RyaWVzLnNpemUoKV0pOwotCQl9Ci0JCQotCQlpblNodXRkb3duID0gdHJ1ZTsJLy8gV2UgYXJlIG5vdyBpbiBzaHV0ZG93biBtb2RlLgotCQkvLyBJbiBzaHV0ZG93biBtb2RlIHRoZSByZWdpc3RyaWVzIHdpbGwgbm90IGNyZWF0ZSB0aGUgam9iIHRoYXQgd2FpdHMgZm9yIHRoZSBwcm9jZXNzCi0JCS8vIHRvIHRlcm1pbmF0ZSwgYW5kIGlmIGl0IGRvZXNuJ3QgaW4gMS41IHNlY3MgaXQgZG9lcyBhIGZvcmNlLgotCQkvLyBJbnN0ZWFkIHdoYXQgd2Ugd2lsbCBkbyBpcyBzaHV0ZG93biBhbGwgb2YgdGhlIHJlZ2lzdHJpZXMuIElmIHRoZXkgZG9uJ3QKLQkJLy8gc2h1dGRvd24gb24gdGhlaXIgb3duIHRoZW4gdGhleSBzdGF5IG91dCB0aGVyZS4gQnV0IHRoZXkgZG8gaGF2ZSBhbgotCQkvLyBpbnRlcm5hbCB0aW1lciB0aGF0IGNoZWNrcyBldmVyeSBmaXZlIG1pbnV0ZXMgdG8gc2VlIGlmIHRoZSBob3N0IGlzIAotCQkvLyBzdGlsbCB0aGVyZSwgYW5kIGlmIGl0IGlzbid0IHRoZXkgd2lsbCBzaHV0IHRoZW1zZWx2ZXMgZG93bi4gVGhleQotCQkvLyB3b3VsZCBoYXZlIHRvIGJlIHJlYWxseSBob3NlZCBpZiB0aGUgc3VpY2lkZSB0aW1lciB3YXNuJ3Qgd29ya2luZy4KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykKLQkJCXJlZ2lzdHJpZXNbaV0udGVybWluYXRlUmVnaXN0cnkoKTsKLQkJCQotCQlpZiAobWFzdGVyVGhyZWFkICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbWFzdGVyVGhyZWFkLnJlcXVlc3RTaHV0ZG93bigpOwotCQkJCW1hc3RlclRocmVhZC5qb2luKDIwMDAwKTsJLy8gV2FpdCAyMCBzZWNvbmRzIGZvciBldmVyeXRoaW5nIHRvIGdvIGRvd24uCi0JCQkJbWFzdGVyVGhyZWFkID0gbnVsbDsJCQkJCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlwcm9jZXNzUXVldWVKb2Iuam9pbigpOwotCQl9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkuY2FuY2VsQWxsVGVybWluYXRlSm9icygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hc3RlciBzb2NrZXQgcG9ydCBudW1iZXIuCi0JICovCi0JcHVibGljIGludCBnZXRNYXN0ZXJTb2NrZXRQb3J0KCkgewotCQlyZXR1cm4gbWFzdGVyVGhyZWFkICE9IG51bGwgPyBtYXN0ZXJUaHJlYWQuZ2V0TWFzdGVyU29ja2V0KCkuZ2V0TG9jYWxQb3J0KCkgOiAtMTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0Q2xhc3NCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRDbGFzc0JlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzk1ZmVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRDbGFzc0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNU2hvcnRDbGFzc0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLS8qKgotICogUmVtb3RlIFByb3h5IGZvciBTaG9ydC5jbGFzcy4KLSAqLwotY2xhc3MgUkVNU2hvcnRDbGFzc0JlYW5Qcm94eSBleHRlbmRzIFJFTU51bWJlckJlYW5Qcm94eSB7Ci0KLVJFTVNob3J0Q2xhc3NCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBTaG9ydCBhU2hvcnQpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFTaG9ydCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnNob3J0Q2xhc3M7Ci19Ci0KLS8qKgotICogUmVuZGVyIHRoZSBiZWFuIGludG8gdmFsdWUgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCByZW5kZXJCZWFuKENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JdmFsdWUuc2V0KChTaG9ydCkgbnVtYmVyVmFsdWUoKSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTRhN2ZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBSZW1vdGUgSW1wbGVtZW50YXRpb24gb2YgSUJlYW5UeXBlUHJveHkgZm9yIFNob3J0LmNsYXNzLgotICogQ3JlYXRpb24gZGF0ZTogKDIvNi8wMCA5OjAxOjQwIEFNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotZmluYWwgY2xhc3MgUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdE51bWJlckJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IHR3b1Byb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0aHJlZVByb3h5OwotLyoqCi0gKiBSRU1JbnRlZ2VyQmVhblR5cGVQcm94eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJQmVhblR5cGVQcm94eSBudW1iZXJUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5TSE9SVF9DTEFTUyksIFNob3J0LmNsYXNzLmdldE5hbWUoKSwgbnVtYmVyVHlwZSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBjYWNoZWQgdmFsdWVzCi0JemVyb1Byb3h5ID0gbmV3IFJFTVNob3J0Q2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgU2hvcnQoKHNob3J0KTApKTsJCi0Jb25lUHJveHkgPSBuZXcgUkVNU2hvcnRDbGFzc0JlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBTaG9ydCgoc2hvcnQpMSkpOwotCXR3b1Byb3h5ID0gbmV3IFJFTVNob3J0Q2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgU2hvcnQoKHNob3J0KTIpKTsKLQl0aHJlZVByb3h5ID0gbmV3IFJFTVNob3J0Q2xhc3NCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgU2hvcnQoKHNob3J0KTMpKTsJCQotfQotCi0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVTaG9ydEJlYW5Qcm94eShTaG9ydCBhU2hvcnQpIHsKLQlzd2l0Y2goYVNob3J0LnNob3J0VmFsdWUoKSkgewotCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHk7Ci0JCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJY2FzZSAyOiByZXR1cm4gdHdvUHJveHkgOwotCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJZGVmYXVsdDogcmV0dXJuIG5ldyBSRU1TaG9ydENsYXNzQmVhblByb3h5KGZSZWdpc3RyeSwgYVNob3J0KTsKLQl9Ci19Ci0KLS8qKgotICogR2VuZXJpYyB3YXkgdG8gY3JlYXRlIGEgU2hvcnQgcHJveHksIGhvd2V2ZXIsIHRoZSBOdW1iZXIgbXVzdCBiZSBhIFNob3J0LgotICovCi1wcm90ZWN0ZWQgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVOdW1iZXJCZWFuUHJveHkoTnVtYmVyIGFOdW1iZXIpIHsKLQlyZXR1cm4gY3JlYXRlU2hvcnRCZWFuUHJveHkoKFNob3J0KSBhTnVtYmVyKTsKLX0JCi0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBOdW1iZXIncyBkb24ndCBoYXZlIGEgZGVmYXVsdCBjdG9yLCBzbyB0aGUgc3RhbmRhcmQgd2F5IHdvbid0IHdvcmsuCi0gKiBSZXR1cm4gdGhlIHplcm8gcHJveHkgZm9yIHRoaXMgY2FzZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JcmV0dXJuIHplcm9Qcm94eTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBjcmVhdGVTaG9ydEJlYW5Qcm94eShuZXcgU2hvcnQodmFsdWUuYVNob3J0KSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydFR5cGVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRUeXBlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzA5YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TaG9ydFR5cGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1TaG9ydFR5cGVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJTnVtYmVyQmVhblByb3h5IGZvciB0aGUgcHJpbWl0aXZlICJzaG9ydCIuCi0gKiBJdCBjYW4gYW5zd2VyIGFsbCBvZiB0aGUgcHJpbWl0aXZlIG51bWJlciB0eXBlcyAoaW50LCBsb25nLCBzaG9ydCwgYnl0ZSwgZG91YmxlLCBmbG9hdCkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1jbGFzcyBSRU1TaG9ydFR5cGVCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElOdW1iZXJCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgc2hvcnQgZlNob3J0OwotCi0vKioKLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICogQHBhcmFtIGFCZWFuIGphdmEubGFuZy5PYmplY3QKLSAqLwotUkVNU2hvcnRUeXBlQmVhblByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgc2hvcnQgYVNob3J0KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLQlmU2hvcnQgPSBhU2hvcnQ7Ci19Ci0vKioKLSAqIGVxdWFsczogRXF1YWwgaWY6Ci0gKiAgICAgICAgIDEpIFRoaXMgcHJveHkgPT0gKGlkZW50aXR5KSB0byB0aGUgb3RoZXIgb2JqZWN0Ci0gKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0gKiAgICAgICAgICAgIGVxdWFscyBvbiB0aGUgc2VydmVyLgotICogICAgICAgICAzKSBJZiB0aGlzIGlzIGEgY29uc3RhbnQgcHJveHkgYW5kIHRoZSBvdGhlciBpcyB0b28gb3IgaXMgYSBjb25zdGFudAotICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PYmplY3QpIHsKLQlpZiAodGhpcyA9PSBhbk9iamVjdCkKLQkJcmV0dXJuIHRydWU7CS8vIElkZW50aXR5Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgUkVNU2hvcnRUeXBlQmVhblByb3h5KQotCQlyZXR1cm4gZlNob3J0ID09ICgoUkVNU2hvcnRUeXBlQmVhblByb3h5KSBhbk9iamVjdCkuc2hvcnRWYWx1ZSgpOwotCWlmIChhbk9iamVjdCBpbnN0YW5jZW9mIFNob3J0KQotCQlyZXR1cm4gZlNob3J0ID09ICgoU2hvcnQpIGFuT2JqZWN0KS5zaG9ydFZhbHVlKCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkjc2FtZUFzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHkpCi0gKi8KLXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQlpZiAodGhpcyA9PSBhQmVhblByb3h5KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIFJFTVNob3J0VHlwZUJlYW5Qcm94eSkKLQkJcmV0dXJuIGZTaG9ydCA9PSAoKFJFTVNob3J0VHlwZUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuc2hvcnRWYWx1ZSgpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gKGJ5dGUpIGZTaG9ydDsKLX0KLS8qKgotICogZG91YmxlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JcmV0dXJuIGZTaG9ydDsKLX0KLS8qKgotICogZmxvYXRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JcmV0dXJuIGZTaG9ydDsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZlNob3J0OwotfQotLyoqCi0gKiBsb25nVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQlyZXR1cm4gZlNob3J0OwotfQotLyoqCi0gKiBudW1iZXJWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIE51bWJlciBudW1iZXJWYWx1ZSgpIHsKLQlyZXR1cm4gbmV3IFNob3J0KGZTaG9ydCk7Ci19Ci0vKioKLSAqIHNob3J0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotCXJldHVybiBmU2hvcnQ7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIFN0cmluZy52YWx1ZU9mKGZTaG9ydCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBiZWFudHlwZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCXJldHVybiAoKFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLnNob3J0VHlwZTsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoZlNob3J0KTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWJhODJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiBJQmVhblR5cGVQcm94eSBmb3IgU2hvcnQuVFlQRS4KLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMTo0MCBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1QcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB6ZXJvUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJTnVtYmVyQmVhblByb3h5IG9uZVByb3h5OwotCXByaXZhdGUgZmluYWwgSU51bWJlckJlYW5Qcm94eSB0d29Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElOdW1iZXJCZWFuUHJveHkgdGhyZWVQcm94eTsKLS8qKgotICogUkVNSW50ZWdlckJlYW5UeXBlUHJveHkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBhQ2xhc3MgamF2YS5sYW5nLkNsYXNzCi0gKi8KLVJFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5TSE9SVF9UWVBFKSwgU2hvcnQuVFlQRS5nZXROYW1lKCkpOwotCQotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBSRU1TaG9ydFR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoc2hvcnQpIDApOwkKLQlvbmVQcm94eSA9IG5ldyBSRU1TaG9ydFR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoc2hvcnQpIDEpOwotCXR3b1Byb3h5ID0gbmV3IFJFTVNob3J0VHlwZUJlYW5Qcm94eShhUmVnaXN0cnksIChzaG9ydCkgMik7Ci0JdGhyZWVQcm94eSA9IG5ldyBSRU1TaG9ydFR5cGVCZWFuUHJveHkoYVJlZ2lzdHJ5LCAoc2hvcnQpIDMpOwkJCi19Ci0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZVNob3J0QmVhblByb3h5KHNob3J0IGFTaG9ydCkgewotCXN3aXRjaChhU2hvcnQpIHsKLQkJY2FzZSAwOiByZXR1cm4gemVyb1Byb3h5OwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgUkVNU2hvcnRUeXBlQmVhblByb3h5KGZSZWdpc3RyeSwgYVNob3J0KTsKLQl9Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBzaG9ydCBpcyBhIHByaW1pdGl2ZSwgc28gdGhlIHN0YW5kYXJkIHdheSB3b24ndCB3b3JrLgotICogUmV0dXJuIHRoZSB6ZXJvUHJveHkgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCXJldHVybiB6ZXJvUHJveHk7Ci19CQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZVNob3J0QmVhblByb3h5KHZhbHVlLmFTaG9ydCk7Ci19Ci0KLS8qKgotICogU2hvcnQgY3V0IGZvciBuZXdJbnN0YW5jZSB3aGVyZSB0aGUgc3RyaW5nIGZvbGxvd3MgdGhlCi0gKiBzcGVjaWZpYyBwYXR0ZXJuIHdlIGV4cGVjdC4gVGhhdCB3YXkgaXQgd29uJ3QgYmUgbmVjZXNzYXJ5IHRvIHNoaXAgb3ZlciB0byB0aGUgdm0gCi0gKiB0byBwcm9jZXNzIGl0LgotICoKLSAqIFRoZSBwYXR0ZXJuIGl0IGNhbiBhY2NlcHQgaXM6Ci0gKiAJMSkgKHNob3J0KSB2YWxpZE51bWJlciAtIG51bWJlciBjYW4gYmUgYW55IG51bWJlciBiZWNhdXNlIChieXRlKSBleHBsaWNpdGx5IGNhc3RzIGl0IGRvd24uCi0gKgkyKSB2YWxpZE51bWJlcgotICogSXQgd2lsbCB1c2UgdGhlIGRlY29kZSBmdW5jdGlvbiBvZiBzaG9ydCB0byBkZXRlcm1pbmUgdGhlIHZhbGlkIG51bWJlci4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JU3RyaW5nIHRyaW0gPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkKLQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJCi0Jc2hvcnQgYVNob3J0OwotCWlmICh0cmltLnN0YXJ0c1dpdGgoIihzaG9ydCkiKSkgeyAvLyROT04tTkxTLTEkCi0JCU51bWJlciB2ID0gcGFyc2VTdHJpbmcodHJpbS5zdWJzdHJpbmcoIihzaG9ydCkiLmxlbmd0aCgpKS50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ICE9IG51bGwpCi0JCQlhU2hvcnQgPSB2LnNob3J0VmFsdWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlhU2hvcnQgPSBTaG9ydC5kZWNvZGUodHJpbSkuc2hvcnRWYWx1ZSgpOwkvLyBTZWUgaWYgdmFsaWQgc2hvcnQgZm9ybWF0LgotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGluaXRpYWxpemF0aW9uU3RyaW5nKTsJLy8gQ2FuJ3QgZGVjb2RlIGl0LCBsZXQgZnVsbCBwYXJzZXIgaGFuZGxlIGl0LgotCQl9Ci0JfQotCi0JcmV0dXJuIGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoYVNob3J0KTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjk5N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0vKioKLSAqIFJFTSBTdGFuZGFyZCBQcm94eSBjb25zdGFudHMuCi0gKgotICogVXNlIHRoZSBzdGF0aWMgYWNjZXNzb3IgbWV0aG9kIChnZXRDb25zdGFudHMoKSkgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSAKLSAqIGNvbnN0YW50cyBpbnN0YW5jZSBmb3IgdGhlIHJlZ2lzdHJ5LiBUaGlzIGlzIGRvbmUgc28gdGhhdCB1bnRpbCB0aGUKLSAqIHRoZSBjb25zdGFudHMgYXJlIG5lZWRlZCwgdGhleSBhcmVuJ3QgcmVnaXN0ZXJlZC4KLSAqCi0gKiBUaGVyZSBhcmUgc29tZSBzdGFuZGFyZCB1dGlsaXR5IGZ1bmN0aW9ucyB0b28uCi0gKgotICogVGhpcyBpcyBmaW5hbCBiZWNhdXNlIHRoaXMgY2FuJ3QgYmUgZXh0ZW5kZWQuIFRoaXMgc3BlY2lmaWMgb25lCi0gKiB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhpcyBrZXkuIEFueSBleHRlbnNpb25zCi0gKiBtdXN0IGJlIGRvbmUgaW4gdGhlaXIgb3duIGNvbnN0YW50cyBhbmQgcmVnaXN0cnkga2V5LgotICoKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzcvMDAgNDo0Nzo0OCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdJU1RSWV9LRVkgPSBuZXcgT2JqZWN0KCk7Ci0JCQotCXByaXZhdGUgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgZlJlZ2lzdHJ5OwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc05ld0luc3RhbmNlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldEZpZWxkOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldERlY2xhcmVkRmllbGQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0RGVjbGFyZWRGaWVsZHM7CQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldEZpZWxkczsJCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0Q29uc3RydWN0b3I7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0Q29uc3RydWN0b3JzOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3I7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnM7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0TWV0aG9kczsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ2xhc3NHZXREZWNsYXJlZE1ldGhvZHM7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkNsYXNzR2V0RGVjbGFyZWRNZXRob2Q7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3I7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlTWV0aG9kOwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDbGFzc0lzQXNzaWduYWJsZUZyb207Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZk9iamVjdFRvU3RyaW5nOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZPYmplY3RFcXVhbHM7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZlRocm93YWJsZUxvY2FsaXplZE1lc3NhZ2U7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZlRocm93YWJsZU1lc3NhZ2U7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZk1ldGhvZERlY2xhcmluZ0NsYXNzTWVzc2FnZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmTWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2U7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZk1ldGhvZFBhcmFtZXRlclR5cGVzTWVzc2FnZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmTWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2U7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFjY2Vzc2libGVJc0FjY2Vzc2libGU7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFjY2Vzc2libGVTZXRBY2Nlc3NpYmxlOwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXRUeXBlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldEJ5dGU7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0Qm9vbGVhbjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXRDaGFyOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZGaWVsZEdldERvdWJsZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXRGbG9hdDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmRmllbGRHZXRJbnQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0U2hvcnQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkR2V0TG9uZzsJCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkZpZWxkU2V0OwotCQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZDb25zdHJ1Y3Rvck5ld0luc3RhbmNlOwkKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQ29uc3RydWN0b3JQYXJhbWV0ZXJUeXBlc01lc3NhZ2U7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5TmV3SW5zdGFuY2VPbmVEaW1lbnNpb247Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbnM7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0TGVuZ3RoOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXRCeXRlOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldEJvb2xlYW47Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0Q2hhcjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlHZXREb3VibGU7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0RmxvYXQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5R2V0SW50OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldFNob3J0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUdldExvbmc7CQotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheVNldDsJCi0JCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0OwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldEJ5dGU7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0Qm9vbGVhbjsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXRDaGFyOwotCXByaXZhdGUgSU1ldGhvZFByb3h5IGZBcnJheUhlbHBlckdldERvdWJsZTsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXRGbG9hdDsKLQlwcml2YXRlIElNZXRob2RQcm94eSBmQXJyYXlIZWxwZXJHZXRJbnQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0U2hvcnQ7Ci0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyR2V0TG9uZzsJCi0JcHJpdmF0ZSBJTWV0aG9kUHJveHkgZkFycmF5SGVscGVyU2V0OwkJCQotCQotLyoqCi0gKiBHZXQgdGhlIGNvbnN0YW50cyBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCByZWdpc3RyeS4KLSAqLwotcHVibGljIHN0YXRpYyBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBnZXRDb25zdGFudHMoUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQlSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cyBjb25zdGFudHMgPSAoUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMpIHJlZ2lzdHJ5LmdldENvbnN0YW50cyhSRUdJU1RSWV9LRVkpOwotCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJcmVnaXN0cnkucmVnaXN0ZXJDb25zdGFudHMoUkVHSVNUUllfS0VZLCBjb25zdGFudHMgPSBuZXcgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMocmVnaXN0cnkpKTsJCi0JcmV0dXJuIGNvbnN0YW50czsKLX0KLQotCi1wcml2YXRlIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0Jc3VwZXIoKTsKLQlmUmVnaXN0cnkgPSByZWdpc3RyeTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc05ld0luc3RhbmNlKCkgewotCS8vIFdlIGFjdHVhbGx5IG5lZWQgYSBzcGVjaWFsIG5ldyBpbnN0YW5jZSBiZWNhdXNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBhY2Nlc3Mgb3V0c2lkZSBvZiBzZWN1cml0eS4gRm9yIG91ciBwdXJwb3NlcyBzZWN1cml0eSBkb2Vzbid0IG1hdHRlciBmb3IgY29uc3RydWN0aW9uLgotCWlmIChmQ2xhc3NOZXdJbnN0YW5jZSA9PSBudWxsKQotCQlmQ2xhc3NOZXdJbnN0YW5jZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5DbGFzc0hlbHBlciIsICJuZXdJbnN0YW5jZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5DbGFzcyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkNsYXNzTmV3SW5zdGFuY2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0Q2xhc3NHZXRGaWVsZCgpIHsKLQlpZiAoZkNsYXNzR2V0RmllbGQgPT0gbnVsbCkKLQkJZkNsYXNzR2V0RmllbGQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5DbGFzcyIsICJnZXRGaWVsZCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZDbGFzc0dldEZpZWxkOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzQ29uc3RydWN0b3IoKSB7Ci0JaWYgKGZDbGFzc0dldENvbnN0cnVjdG9yID09IG51bGwpCi0JCWZDbGFzc0dldENvbnN0cnVjdG9yID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0Q29uc3RydWN0b3IiLCBuZXcgU3RyaW5nW10geyJbTGphdmEubGFuZy5DbGFzczsifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZDbGFzc0dldENvbnN0cnVjdG9yOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzQ29uc3RydWN0b3JzKCkgewotCWlmIChmQ2xhc3NHZXRDb25zdHJ1Y3RvcnMgPT0gbnVsbCkKLQkJZkNsYXNzR2V0Q29uc3RydWN0b3JzID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0Q29uc3RydWN0b3JzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQ2xhc3NHZXRDb25zdHJ1Y3RvcnM7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRDbGFzc0NvbnN0cnVjdG9yKCkgewotCWlmIChmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yID09IG51bGwpCi0JCWZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3IgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5DbGFzcyIsICJnZXREZWNsYXJlZENvbnN0cnVjdG9yIiwgbmV3IFN0cmluZ1tdIHsiW0xqYXZhLmxhbmcuQ2xhc3M7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkQ2xhc3NDb25zdHJ1Y3RvcnMoKSB7Ci0JaWYgKGZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3JzID09IG51bGwpCi0JCWZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3JzID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3JzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzSXNBc3NpZ25hYmxlRnJvbSgpIHsKLQlpZiAoZkNsYXNzSXNBc3NpZ25hYmxlRnJvbSA9PSBudWxsKQotCQlmQ2xhc3NJc0Fzc2lnbmFibGVGcm9tID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiaXNBc3NpZ25hYmxlRnJvbSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5DbGFzcyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkNsYXNzSXNBc3NpZ25hYmxlRnJvbTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRPYmplY3RUb1N0cmluZygpIHsKLQlpZiAoZk9iamVjdFRvU3RyaW5nID09IG51bGwpCi0JCWZPYmplY3RUb1N0cmluZyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLk9iamVjdCIsICJ0b1N0cmluZyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZk9iamVjdFRvU3RyaW5nOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldE9iamVjdEVxdWFscygpIHsKLQlpZiAoZk9iamVjdEVxdWFscyA9PSBudWxsKQotCQlmT2JqZWN0RXF1YWxzID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgImVxdWFscyIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZPYmplY3RFcXVhbHM7Ci19Ci1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFRocm93YWJsZUxvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JaWYgKGZUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlID09IG51bGwpCi0JCWZUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuVGhyb3dhYmxlIiwgImdldExvY2FsaXplZE1lc3NhZ2UiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZUaHJvd2FibGVMb2NhbGl6ZWRNZXNzYWdlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldFRocm93YWJsZU1lc3NhZ2UoKSB7Ci0JaWYgKGZUaHJvd2FibGVNZXNzYWdlID09IG51bGwpCi0JCWZUaHJvd2FibGVNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuVGhyb3dhYmxlIiwgImdldE1lc3NhZ2UiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZUaHJvd2FibGVNZXNzYWdlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZERlY2xhcmluZ0NsYXNzTWVzc2FnZSgpIHsKLQlpZiAoZk1ldGhvZERlY2xhcmluZ0NsYXNzTWVzc2FnZSA9PSBudWxsKQotCQlmTWV0aG9kRGVjbGFyaW5nQ2xhc3NNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiLCAiZ2V0RGVjbGFyaW5nQ2xhc3MiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZNZXRob2REZWNsYXJpbmdDbGFzc01lc3NhZ2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2UoKSB7Ci0JaWYgKGZNZXRob2RNZXRob2ROYW1lTWVzc2FnZSA9PSBudWxsKQotCQlmTWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2UgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIsICJnZXROYW1lIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTWV0aG9kTWV0aG9kTmFtZU1lc3NhZ2U7Ci19CQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFBhcmFtZXRlclR5cGVzTWVzc2FnZSgpIHsKLQlpZiAoZk1ldGhvZFBhcmFtZXRlclR5cGVzTWVzc2FnZSA9PSBudWxsKQotCQlmTWV0aG9kUGFyYW1ldGVyVHlwZXNNZXNzYWdlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiLCAiZ2V0UGFyYW1ldGVyVHlwZXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZNZXRob2RQYXJhbWV0ZXJUeXBlc01lc3NhZ2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2UoKSB7Ci0JaWYgKGZNZXRob2RSZXR1cm5UeXBlTWVzc2FnZSA9PSBudWxsKQotCQlmTWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2UgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIsICJnZXRSZXR1cm5UeXBlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmTWV0aG9kUmV0dXJuVHlwZU1lc3NhZ2U7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QWNjZXNzaWJsZUlzQWNjZXNzaWJsZSgpIHsKLQlpZiAoZkFjY2Vzc2libGVJc0FjY2Vzc2libGUgPT0gbnVsbCkKLQkJZkFjY2Vzc2libGVJc0FjY2Vzc2libGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3QiLCAiaXNBY2Nlc3NpYmxlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmQWNjZXNzaWJsZUlzQWNjZXNzaWJsZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBY2Nlc3NpYmxlU2V0QWNjZXNzaWJsZSgpIHsKLQlpZiAoZkFjY2Vzc2libGVTZXRBY2Nlc3NpYmxlID09IG51bGwpCi0JCWZBY2Nlc3NpYmxlU2V0QWNjZXNzaWJsZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdCIsICJzZXRBY2Nlc3NpYmxlIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkFjY2Vzc2libGVTZXRBY2Nlc3NpYmxlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0VHlwZSgpIHsKLQlpZiAoZkZpZWxkR2V0VHlwZSA9PSBudWxsKQotCQlmRmllbGRHZXRUeXBlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXRUeXBlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXJldHVybiBmRmllbGRHZXRUeXBlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0KCkgewotCWlmIChmRmllbGRHZXQgPT0gbnVsbCkKLQkJZkZpZWxkR2V0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRHZXRCeXRlKCkgewotCWlmIChmRmllbGRHZXRCeXRlID09IG51bGwpCi0JCWZGaWVsZEdldEJ5dGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgImdldEJ5dGUiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXRCeXRlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0Qm9vbGVhbigpIHsKLQlpZiAoZkZpZWxkR2V0Qm9vbGVhbiA9PSBudWxsKQotCQlmRmllbGRHZXRCb29sZWFuID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXRCb29sZWFuIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0Qm9vbGVhbjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldENoYXIoKSB7Ci0JaWYgKGZGaWVsZEdldENoYXIgPT0gbnVsbCkKLQkJZkZpZWxkR2V0Q2hhciA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0Q2hhciIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZGaWVsZEdldENoYXI7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmllbGRHZXREb3VibGUoKSB7Ci0JaWYgKGZGaWVsZEdldERvdWJsZSA9PSBudWxsKQotCQlmRmllbGRHZXREb3VibGUgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIiwgImdldERvdWJsZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcmV0dXJuIGZGaWVsZEdldERvdWJsZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldEZsb2F0KCkgewotCWlmIChmRmllbGRHZXRGbG9hdCA9PSBudWxsKQotCQlmRmllbGRHZXRGbG9hdCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0RmxvYXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXRGbG9hdDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldEludCgpIHsKLQlpZiAoZkZpZWxkR2V0SW50ID09IG51bGwpCi0JCWZGaWVsZEdldEludCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0SW50IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0SW50OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEZpZWxkR2V0TG9uZygpIHsKLQlpZiAoZkZpZWxkR2V0TG9uZyA9PSBudWxsKQotCQlmRmllbGRHZXRMb25nID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCIsICJnZXRMb25nIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlyZXR1cm4gZkZpZWxkR2V0TG9uZzsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZEdldFNob3J0KCkgewotCWlmIChmRmllbGRHZXRTaG9ydCA9PSBudWxsKQotCQlmRmllbGRHZXRTaG9ydCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAiZ2V0U2hvcnQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmRmllbGRHZXRTaG9ydDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaWVsZFNldCgpIHsKLQlpZiAoZkZpZWxkU2V0ID09IG51bGwpCi0JCWZGaWVsZFNldCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuRmllbGQiLCAic2V0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZGaWVsZFNldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb25zdHJ1Y3Rvck5ld0luc3RhbmNlKCkgewotCWlmIChmQ29uc3RydWN0b3JOZXdJbnN0YW5jZSA9PSBudWxsKQotCQlmQ29uc3RydWN0b3JOZXdJbnN0YW5jZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IiLCAibmV3SW5zdGFuY2UiLCBuZXcgU3RyaW5nW10geyJbTGphdmEubGFuZy5PYmplY3Q7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQ29uc3RydWN0b3JOZXdJbnN0YW5jZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZSgpIHsKLQlpZiAoZkNvbnN0cnVjdG9yUGFyYW1ldGVyVHlwZXNNZXNzYWdlID09IG51bGwpCi0JCWZDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IiLCAiZ2V0UGFyYW1ldGVyVHlwZXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDb25zdHJ1Y3RvclBhcmFtZXRlclR5cGVzTWVzc2FnZTsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheU5ld0luc3RhbmNlT25lRGltZW5zaW9uKCkgewotCWlmIChmQXJyYXlOZXdJbnN0YW5jZU9uZURpbWVuc2lvbiA9PSBudWxsKQotCQlmQXJyYXlOZXdJbnN0YW5jZU9uZURpbWVuc2lvbiA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAibmV3SW5zdGFuY2UiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuQ2xhc3MiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheU5ld0luc3RhbmNlT25lRGltZW5zaW9uOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbigpIHsKLQlpZiAoZkFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbnMgPT0gbnVsbCkKLQkJZkFycmF5TmV3SW5zdGFuY2VNdWx0aURpbWVuc2lvbnMgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgIm5ld0luc3RhbmNlIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLkNsYXNzIiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheU5ld0luc3RhbmNlTXVsdGlEaW1lbnNpb25zOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0TGVuZ3RoKCkgewotCWlmIChmQXJyYXlHZXRMZW5ndGggPT0gbnVsbCkKLQkJZkFycmF5R2V0TGVuZ3RoID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRMZW5ndGgiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQXJyYXlHZXRMZW5ndGg7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlHZXQoKSB7Ci0JaWYgKGZBcnJheUdldCA9PSBudWxsKQotCQlmQXJyYXlHZXQgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgImdldCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldEJ5dGUoKSB7Ci0JaWYgKGZBcnJheUdldEJ5dGUgPT0gbnVsbCkKLQkJZkFycmF5R2V0Qnl0ZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0Qnl0ZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldEJ5dGU7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlHZXRCb29sZWFuKCkgewotCWlmIChmQXJyYXlHZXRCb29sZWFuID09IG51bGwpCi0JCWZBcnJheUdldEJvb2xlYW4gPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgImdldEJvb2xlYW4iLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRCb29sZWFuOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0Q2hhcigpIHsKLQlpZiAoZkFycmF5R2V0Q2hhciA9PSBudWxsKQotCQlmQXJyYXlHZXRDaGFyID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRDaGFyIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5R2V0Q2hhcjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUdldERvdWJsZSgpIHsKLQlpZiAoZkFycmF5R2V0RG91YmxlID09IG51bGwpCi0JCWZBcnJheUdldERvdWJsZSA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkiLCAiZ2V0RG91YmxlIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJpbnQifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5R2V0RG91YmxlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0RmxvYXQoKSB7Ci0JaWYgKGZBcnJheUdldEZsb2F0ID09IG51bGwpCi0JCWZBcnJheUdldEZsb2F0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRGbG9hdCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldEZsb2F0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0SW50KCkgewotCWlmIChmQXJyYXlHZXRJbnQgPT0gbnVsbCkKLQkJZkFycmF5R2V0SW50ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRJbnQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRJbnQ7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlHZXRMb25nKCkgewotCWlmIChmQXJyYXlHZXRMb25nID09IG51bGwpCi0JCWZBcnJheUdldExvbmcgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5yZWZsZWN0LkFycmF5IiwgImdldExvbmciLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlHZXRMb25nOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5R2V0U2hvcnQoKSB7Ci0JaWYgKGZBcnJheUdldFNob3J0ID09IG51bGwpCi0JCWZBcnJheUdldFNob3J0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJnZXRTaG9ydCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiaW50In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUdldFNob3J0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5U2V0KCkgewotCWlmIChmQXJyYXlTZXQgPT0gbnVsbCkKLQkJZkFycmF5U2V0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcucmVmbGVjdC5BcnJheSIsICJzZXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgImludCIsICJqYXZhLmxhbmcuT2JqZWN0In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQlyZXR1cm4gZkFycmF5U2V0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0KCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXQgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0OwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0Qnl0ZSgpIHsKLQlpZiAoZkFycmF5SGVscGVyR2V0Qnl0ZSA9PSBudWxsKQotCQlmQXJyYXlIZWxwZXJHZXRCeXRlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldEJ5dGUiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUhlbHBlckdldEJ5dGU7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0QXJyYXlIZWxwZXJHZXRCb29sZWFuKCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXRCb29sZWFuID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldEJvb2xlYW4gPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuQXJyYXlIZWxwZXIiLCAiZ2V0Qm9vbGVhbiIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0Qm9vbGVhbjsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldENoYXIoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldENoYXIgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0Q2hhciA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRDaGFyIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRDaGFyOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0RG91YmxlKCkgewotCWlmIChmQXJyYXlIZWxwZXJHZXREb3VibGUgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0RG91YmxlID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldERvdWJsZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5PYmplY3QiLCAiW0kifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZkFycmF5SGVscGVyR2V0RG91YmxlOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0RmxvYXQoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldEZsb2F0ID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldEZsb2F0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldEZsb2F0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRGbG9hdDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldEludCgpIHsKLQlpZiAoZkFycmF5SGVscGVyR2V0SW50ID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldEludCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRJbnQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JcmV0dXJuIGZBcnJheUhlbHBlckdldEludDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlckdldExvbmcoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldExvbmcgPT0gbnVsbCkKLQkJZkFycmF5SGVscGVyR2V0TG9uZyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJnZXRMb25nIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRMb25nOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldEFycmF5SGVscGVyR2V0U2hvcnQoKSB7Ci0JaWYgKGZBcnJheUhlbHBlckdldFNob3J0ID09IG51bGwpCi0JCWZBcnJheUhlbHBlckdldFNob3J0ID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLkFycmF5SGVscGVyIiwgImdldFNob3J0IiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLk9iamVjdCIsICJbSSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQXJyYXlIZWxwZXJHZXRTaG9ydDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRBcnJheUhlbHBlclNldCgpIHsKLQlpZiAoZkFycmF5SGVscGVyU2V0ID09IG51bGwpCi0JCWZBcnJheUhlbHBlclNldCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BcnJheUhlbHBlciIsICJzZXQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuT2JqZWN0IiwgIltJIiwgImphdmEubGFuZy5PYmplY3QifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCXJldHVybiBmQXJyYXlIZWxwZXJTZXQ7Ci19Ci0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0dldERlY2xhcmVkRmllbGQoKSB7Ci0KLQlpZiAoZkNsYXNzR2V0RGVjbGFyZWRGaWVsZCA9PSBudWxsKQotCQkJZkNsYXNzR2V0RGVjbGFyZWRGaWVsZCA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldERlY2xhcmVkRmllbGQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuU3RyaW5nIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXJldHVybiBmQ2xhc3NHZXREZWNsYXJlZEZpZWxkOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzR2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0KLQlpZiAoZkNsYXNzR2V0RGVjbGFyZWRGaWVsZHMgPT0gbnVsbCkKLQkJCWZDbGFzc0dldERlY2xhcmVkRmllbGRzID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0RGVjbGFyZWRGaWVsZHMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDbGFzc0dldERlY2xhcmVkRmllbGRzOwotfQotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0dldEZpZWxkcygpIHsKLQotCWlmIChmQ2xhc3NHZXRGaWVsZHMgPT0gbnVsbCkKLQkJCWZDbGFzc0dldEZpZWxkcyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldEZpZWxkcyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNsYXNzR2V0RmllbGRzOwotfQotCi0KLS8qKgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc01ldGhvZHMoKSB7Ci0JaWYgKGZDbGFzc0dldE1ldGhvZHMgPT0gbnVsbCkKLQkJZkNsYXNzR2V0TWV0aG9kcyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldE1ldGhvZHMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcmV0dXJuIGZDbGFzc0dldE1ldGhvZHM7Ci19Ci0KLS8qKgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIElNZXRob2RQcm94eSBnZXRDbGFzc0RlY2xhcmVkTWV0aG9kcygpIHsKLQlpZiAoZkNsYXNzR2V0RGVjbGFyZWRNZXRob2RzID09IG51bGwpCi0JCWZDbGFzc0dldERlY2xhcmVkTWV0aG9kcyA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgiamF2YS5sYW5nLkNsYXNzIiwgImdldERlY2xhcmVkTWV0aG9kcyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlyZXR1cm4gZkNsYXNzR2V0RGVjbGFyZWRNZXRob2RzOwotfQotCi1wdWJsaWMgSU1ldGhvZFByb3h5IGdldENsYXNzRGVjbGFyZWRNZXRob2QoKSB7Ci0JaWYgKGZDbGFzc0dldERlY2xhcmVkTWV0aG9kID09IG51bGwpCi0JCWZDbGFzc0dldERlY2xhcmVkTWV0aG9kID0gZlJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiLCAiZ2V0RGVjbGFyZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuU3RyaW5nIiwgIltMamF2YS5sYW5nLkNsYXNzOyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXJldHVybiBmQ2xhc3NHZXREZWNsYXJlZE1ldGhvZDsKLX0KLQotcHVibGljIElNZXRob2RQcm94eSBnZXRGaW5kQ29tcGF0aWJsZUNvbnN0cnVjdG9yTWV0aG9kKCkgewotCWlmIChmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVDb25zdHJ1Y3RvciA9PSBudWxsKQotCQlmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVDb25zdHJ1Y3RvciA9IGZSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKS5nZXRNZXRob2RQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5NZXRob2RIZWxwZXIiLCAiZmluZENvbXBhdGlibGVDb25zdHJ1Y3RvciIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5DbGFzcyIsICJbTGphdmEubGFuZy5DbGFzczsifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQlyZXR1cm4gZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3I7Ci19Ci0KLXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0RmluZENvbXBhdGlibGVNZXRob2RNZXRob2QoKSB7Ci0JaWYgKGZNZXRob2RIZWxwZXJGaW5kQ29tcGF0aWJsZU1ldGhvZCA9PSBudWxsKQotCQlmTWV0aG9kSGVscGVyRmluZENvbXBhdGlibGVNZXRob2QgPSBmUmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyIiwgImZpbmRDb21wYXRpYmxlTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLkNsYXNzIiwgImphdmEubGFuZy5TdHJpbmciLCAiW0xqYXZhLmxhbmcuQ2xhc3M7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQlyZXR1cm4gZk1ldGhvZEhlbHBlckZpbmRDb21wYXRpYmxlTWV0aG9kOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMmUzNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZEVycm9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi0vKioKLSAqIFRoZSBSZW1vdGUgVk0gU3RhbmRhcmQgQmVhbiBQcm94eSBGYWN0b3J5LgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzMvOTkgMTI6MDE6NDUgUE0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSB7Ci0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZSZWdpc3RyeTsKLQlwcm90ZWN0ZWQgZmluYWwgUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBmQmVhblR5cGVQcm94eUZhY3Rvcnk7CS8vIENvbnZlbmllbmNlIGZpZWxkLgotCXByb3RlY3RlZCBmaW5hbCBJUkVNQmVhblByb3h5IHZtU2VydmVyUHJveHk7Ci0KLQkKLQkvLyBXZSBuZWVkIGEgbWFwIGZvciBtYXBwaW5nIG9iamVjdCBpZCdzIHRvIHRoZSBwcm94eS4gVGhlIGVudHJ5IHdpbGwgYWN0dWFsbHkgYmUKLQkvLyBhIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5XZWFrUHJveHlSZWZlcmVuY2UuIFRoaXMgaXMgc28gdGhhdCB0aGUKLQkvLyBwcm94eSB3aWxsIG5vdCBiZSBoZWxkIHRpZ2h0bHkgYnkgdGhpcyBtYXAgYW5kIGNhbiBiZSBHQydkIGlmIG5vdCByZWZlcmVuY2VkLgotCS8vIFBlcmlvZGljYWxseSwgdGhlIHJlZmVyZW5jZSBxdWV1ZSB3aWxsIGJlIHByb2Nlc3NlZCB0byByZW1vdmUgYW55IG9mIHRoZQotCS8vIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gR0MnZCBhbmQgdGhlIHNlcnZlciB3aWxsIGJlIHRvbGQgdGhhdCBpdCBjYW4gcmVsZWFzZQotCS8vIHRoZSBJRCBvbiBpdHMgc2lkZS4KLQkvLwotCS8vIFRoaXMgbWFwIHdpbGwgYmUgdXNlZCBhcyBzeW5jaHJvbml6ZSBvYmplY3QgYWxzbyBmb3IgYWNjZXNzIHRvIGl0LgotCS8vCi0JLy8gVGhlcmUgd2lsbCBiZSBhIGxvdyBwcmlvcml0eSBqb2IgdGhhdCB3aWxsIG9jY2FzaW9uYWxseSBwcm9jZXNzIHRoZSBHQydkIG9iamVjdHMKLQkvLyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcXVldWUgYW5kIHRoZSByZW1vdGUgdm0uIEl0IHdpbGwgbm90IHJlbW92ZSBkdXJpbmcgbG9ja2VkVHJhbnNhY3Rpb25zLgotCS8vCi0JLy8gTk9URTogQ2VydGFpbiBwcm94aWVzIG5ldmVyIGdldCBhZGRlZCB0byB0aGUgbWFwLiBUaGV5IGFyZSB0aGUKLQkvLyBzdGFuZGFyZCB0eXBlcy9jbGFzcyAoaS5lLiBudWxsLCBieXRlLCBpbnQsIGxvbmcsIHNob3J0LCBkb3VibGUsIGZsb2F0LCBieXRlLCBzdHJpbmcpLiBUaGVzZQotCS8vIGFsd2F5cyBoYXZlIHRoZSB2YWx1ZSBzYXZlZCBpbiB0aGUgcHJveHkgc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIHdpdGhvdXQgZ29pbmcgYmFjawotCS8vIHRvIHRoZSBzZXJ2ZXIuIAotCXByaXZhdGUgZmluYWwgSGFzaE1hcCBmSURUb1Byb3hpZXNNYXAgPSBuZXcgSGFzaE1hcCgxMDAwKTsJLy8gTWFwIElEJ3MgdG8gcHJveGllcy4gVGhlIHByb3hpZXMgaGF2ZSB0aGVpciBpZCdzIHNvIHdlIGRvbid0IG5lZWQgYSByZXZlcnNlIG1hcAotCXByaXZhdGUgaW50IHRyYW5zYWN0aW9uTG9ja0NvdW50ID0gMDsJLy8gQ291bnQgb2YgdHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBsb2NrZWQgYWNjZXNzLiBJdCBpcyBjaGFuZ2VkIHVuZGVyIHN5bmMgY29udHJvbCBvZiBmSURUb1Byb3hpZXMgbWFwLgotCQotCS8qKgotCSAqIFRoZSBXZWFrIHJlZmVyZW5jZSB1c2VkIGZvciB0aGUgaWQgdG8gcHJveGllcyBtYXAgZm9yIHRoZSBwcm94eQotCSAqIHNvIHRoYXQgd2UgY2FuIGNsZWFuIGl0IHVwIHdoZW4gdGhlIHByb3h5IGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLgotCSAqCi0JICogSXQgaXMgaW1wb3J0YW50IHRoYXQgYWxsIGNoYW5nZXMgdG8gdGhlIFByb3h5UmVmIGFyZSBkb25lIHRocm91Z2ggc3luYyBvbiBmSURUb1Byb3hpZXNNYXAuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHlSZWYgZXh0ZW5kcyBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2UgewotCQlwcml2YXRlIEludGVnZXIgaWQ7CS8vIFdlIG5lZWQgdGhlIGlkIGJlY2F1c2UgdGhpcyByZWZlcmVuY2Ugd2lsbCBiZSBvbiB0aGUgdmFsdWUgc2lkZQotCQkJCQkvLyBhbmQgbm90IHRoZSBrZXkgc2lkZSBvZiB0aGUgbWFwLCBzbyB3ZSBuZWVkIHRvIGtub3cgdGhlIGtleQotCQkJCQkvLyBzbyB0aGF0IHRoZSBvYmplY3QgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgotCQkJCQkvLwotCQkJCQkvLyBJZiB0aGUgSUQgaXMgbnVsbCwgdGhlbiB0aGlzIG1lYW5zIHRoaXMgZW50cnkgaGFzIGJlZW4gcHJvY2Vzc2VkCi0JCQkJCS8vIGluIHNvbWUgd2F5IGFuZCBzaG91bGQgbm90IGJlIHJlbGVhc2VkIG9yIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUuCi0JCXByaXZhdGUgaW50IHVzZUNudCA9IDE7CS8vIFVzYWdlL1JlZiBjb3VudC4gTmVlZGVkIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHJpZCBvZiB0b28gc29vbi4gU2luY2Ugd2UgZG9uJ3QKLQkJCQkJLy8gY3JlYXRlIGEgUHJveHlSZWYgd2l0aG91dCBhIHVzYWdlLCB3ZSBzdGFydCBpdCBvZmYgd2l0aCBvbmUuIEl0IHdpbGwgYmUgaW5jcmVtZW50ZWQKLQkJCQkJLy8gdGhlbiBvbiByZXRyaWV2YWxzIHdoZW4gbmVlZGVkIGJ5IHVzZXJzIG91dHNpZGUgb2YgdGhlIHJlbW90ZSBmYWN0b3JpZXMgdGhlbXNlbHZlcy4KLQkJCQkJLy8gSXQgd29uJ3QgYmUgcGh5c2ljYWxseSByZWxlYXNlZCB1bnRpbCBlaXRoZXIgR0MgZ290IHJpZCBvZiBpdCwgb3IgaXQgZ29lcyB0byAwIG9yIGxlc3MKLQkJCQkJLy8gb24gYSByZWxlYXNlIHJlcXVlc3QuCi0JCQkJCQotCQlwdWJsaWMgUHJveHlSZWYoSW50ZWdlciBhbklELCBPYmplY3QgcHJveHksIGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWUgcSkgewotCQkJc3VwZXIocHJveHksIHEpOwotCQkJaWQgPSBhbklEOwotCQl9Ci0JCQotCQlwdWJsaWMgSW50ZWdlciBnZXRJRCgpIHsKLQkJCXJldHVybiBpZDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQlzdXBlci5jbGVhcigpOwotCQkJaWQgPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgc3luY2hyb25pemVkIGludCB1c2VDbnQoKSB7Ci0JCQlyZXR1cm4gdXNlQ250OwotCQl9Ci0JCQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5jclVzZUNudCgpIHsKLQkJCXVzZUNudCsrOwotCQl9Ci0JCQotCQlwdWJsaWMgc3luY2hyb25pemVkIGludCBkZWNyVXNlQ250KCkgewotCQkJaWYgKC0tdXNlQ250IDwgMCkKLQkJCQl1c2VDbnQgPSAwOwotCQkJcmV0dXJuIHVzZUNudDsKLQkJfQotCX0KLQkKLQkvKiBSZWZlcmVuY2UgcXVldWUgZm9yIGNsZWFyZWQgUHJveGllcyAqLwotCXByaXZhdGUgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlKCk7CQotCQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGVudHJpZXMgb24gdGhlIGlkIHRvIHByb3hpZXMgbWFwIHRoYXQgaGF2ZSBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLgotCSAqIEl0IGlzIHBhY2thZ2UtcHJvdGVjdGVkIGJlY2F1c2Ugb25seSBSRU1SZWdpc3RyeUNvbnRyb2xsZXIgc2hvdWxkIGNhbGwgaXQuCi0JICovCi0Jdm9pZCBwcm9jZXNzUXVldWUoKSB7Ci0JCVByb3h5UmVmIHByOwkKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkKLQkJCQlyZXR1cm47CS8vIE1heWJlIGdvaW5nIGRvd24uCShUaGlzIGFjdHVhbGx5IGEga2x1ZGdlIGJlY2F1c2UgdGhlIHRocmVhZCBoYXBwZW5zIHRvIGJlIHRoZSBtYXN0ZXIgdGhyZWFkIGZyb20gdGhlIHJlZ2lzdHJ5IGNvbnRyb2xsZXIpLgotCQkJCQotCQkJc3luY2hyb25pemVkIChmSURUb1Byb3hpZXNNYXApIHsKLQkJCQlpZiAocXVldWUgPT0gbnVsbCB8fCB0cmFuc2FjdGlvbkxvY2tDb3VudCA+IDApCi0JCQkJCWJyZWFrOwkvLyBFaXRoZXIgbm8gcXVldWUgKHdlIGFyZSBjbGVhbmluZyB1cCkgb3IgaW4gYSB0cmFuc2FjdGlvbiwgc3RvcCBwcm9jZXNzaW5nIGFuZCByZXRyeSBvbiBuZXh0IHRpbWUgc2xpY2UuCi0JCQkJaWYgKChwciA9IChQcm94eVJlZikgcXVldWUucG9sbCgpKSAhPSBudWxsKSB7CQkJCQotCQkJCQlpZiAocHIuZ2V0SUQoKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgYnkgc29tZSBvdGhlciBtZWFucy4JCQkJCi0JCQkJCQlmSURUb1Byb3hpZXNNYXAucmVtb3ZlKHByLmdldElEKCkpOwkJCQkJCQotCQkJCQkJcmVsZWFzZUlEKHByLmdldElEKCkuaW50VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJYnJlYWs7CS8vIFRoZXJlIGFyZSBubyBtb3JlIHdhaXRpbmcsIHNvIGxlYXZlLgotCQkJfQotCQl9Ci0JfQotCQotCQotLyoqCi0gKiBSRU1CZWFuUHJveHlGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKgotICogTm90ZTogSXQgYXNzdW1lcyB0aGUgYmVhbnR5cGUgZmFjdG9yeSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuCi0gKi8KLVJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQlmUmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JYVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblByb3h5RmFjdG9yeSh0aGlzKTsKLQlmQmVhblR5cGVQcm94eUZhY3RvcnkgPSAoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgYVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JZkJlYW5UeXBlUHJveHlGYWN0b3J5LmluaXRpYWxpemUodGhpcyk7CS8vIE5vdyB3ZSdyZSByZWFkeSBmb3IgdGhlIGJlYW50eXBlIGZhY3RvcnkgdG8gYmUgaW5pdGlhbGl6ZWQuCi0JCi0JSVJFTUJlYW5UeXBlUHJveHkgc2VydmVyVHlwZSA9IGZCZWFuVHlwZVByb3h5RmFjdG9yeS5vYmplY3RDbGFzcy5uZXdCZWFuVHlwZUZvckNsYXNzKG5ldyBJbnRlZ2VyKENvbW1hbmRzLlJFTU9URVZNU0VSVkVSX0NMQVNTKSwgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuUmVtb3RlVk1TZXJ2ZXJUaHJlYWQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQlmQmVhblR5cGVQcm94eUZhY3RvcnkucmVnaXN0ZXJCZWFuVHlwZVByb3h5KHNlcnZlclR5cGUsIHRydWUpOwotCXZtU2VydmVyUHJveHkgPSBzZXJ2ZXJUeXBlLm5ld0JlYW5Qcm94eShuZXcgSW50ZWdlcihDb21tYW5kcy5SRU1PVEVTRVJWRVJfSUQpKTsKLQlyZWdpc3RlclByb3h5KHZtU2VydmVyUHJveHkpOwotfQotCi0KLS8qKgotICogUmVnaXN0ZXIgYSBjb2xsZWN0aW9uIG9mIFByb3hpZXMKLSAqLwotcHVibGljIHZvaWQgcmVnaXN0ZXJQcm94aWVzKENvbGxlY3Rpb24gcHJveGllcykgewotCXN5bmNocm9uaXplZChmSURUb1Byb3hpZXNNYXApIHsKLQkJSXRlcmF0b3IgaXRyID0gcHJveGllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJSVJFTUJlYW5Qcm94eSBwcm94eSA9IChJUkVNQmVhblByb3h5KSBpdHIubmV4dCgpOwotCQkJaWYgKHByb3h5IGluc3RhbmNlb2YgSUJlYW5UeXBlUHJveHkgfHwgIShwcm94eS5nZXRUeXBlUHJveHkoKSBpbnN0YW5jZW9mIElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkpKSB7Ci0JCQkJUHJveHlSZWYgb2xkUmVmID0gKFByb3h5UmVmKSBmSURUb1Byb3hpZXNNYXAucHV0KHByb3h5LmdldElEKCksIG5ldyBQcm94eVJlZihwcm94eS5nZXRJRCgpLCBwcm94eSwgcXVldWUpKTsKLQkJCQlpZiAob2xkUmVmICE9IG51bGwpIHsKLQkJCQkJLy8gV2UndmUgcmVwbGFjZWQgaXQgd2l0aCBhIG5ldyBvbmUsIHNvIHdlIHdpbGwgY2xlYXIgb3V0IHRoZSByZWYgc28gdGhhdCBpdCB3b24ndCBsYXRlciB0cnkgdG8gcmVtb3ZlIGl0c2VsZgotCQkJCQlvbGRSZWYuY2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCX0KLX0KLQotLyoqCi0gKiBSZWdpc3RlciBhIHNpbmdsZSBwcm94eQotICovCi1wdWJsaWMgdm9pZCByZWdpc3RlclByb3h5KElSRU1CZWFuUHJveHkgcHJveHkpIHsKLQlpZiAocHJveHkgaW5zdGFuY2VvZiBJQmVhblR5cGVQcm94eSB8fCAhKHByb3h5LmdldFR5cGVQcm94eSgpIGluc3RhbmNlb2YgSVJFTUNvbnN0YW50QmVhblR5cGVQcm94eSkpCi0JCXN5bmNocm9uaXplZChmSURUb1Byb3hpZXNNYXApIHsKLQkJCVByb3h5UmVmIG9sZFJlZiA9IChQcm94eVJlZikgZklEVG9Qcm94aWVzTWFwLnB1dChwcm94eS5nZXRJRCgpLCBuZXcgUHJveHlSZWYocHJveHkuZ2V0SUQoKSwgcHJveHksIHF1ZXVlKSk7Ci0JCQlpZiAob2xkUmVmICE9IG51bGwpIHsKLQkJCQkvLyBXZSd2ZSByZXBsYWNlZCBpdCB3aXRoIGEgbmV3IG9uZSwgc28gd2Ugd2lsbCBjbGVhciBvdXQgdGhlIHJlZiBzbyB0aGF0IGl0IHdvbid0IGxhdGVyIHRyeSB0byByZW1vdmUgaXRzZWxmCi0JCQkJb2xkUmVmLmNsZWFyKCk7Ci0JCQl9CQkJCQkJCQotCQl9Ci19Ci0KLS8qKgotICogUmVsZWFzZSBhIHByb3h5IGJlY2F1c2Ugbm8gbG9uZ2VyIG5lZWRlZC4KLSAqLwotcHVibGljIHZvaWQgcmVsZWFzZVByb3h5KElCZWFuUHJveHkgcHJveHkpIHsKLQlpZiAoIXByb3h5LmlzVmFsaWQoKSkKLQkJcmV0dXJuOwotCWlmIChwcm94eSBpbnN0YW5jZW9mIElCZWFuVHlwZVByb3h5ICYmICFmQmVhblR5cGVQcm94eUZhY3RvcnkucmVsZWFzZVByb3h5KChJQmVhblR5cGVQcm94eSkgcHJveHkpKQotCQlyZXR1cm47CS8vIEJlYW5UeXBlIGFuZCB0eXBlIGZhY3Rvcnkgd29uJ3QgYWxsb3cgcmVsZWFzZSBvZiBpdC4KLQlJbnRlZ2VyIGlkID0gKChJUkVNQmVhblByb3h5KSBwcm94eSkuZ2V0SUQoKTsKLQlzeW5jaHJvbml6ZWQoZklEVG9Qcm94aWVzTWFwKSB7CQkJCi0JCS8vIFN5bmNlZCBpbiBoZXJlIHNvIHRoYXQgd2Ugd2lsbCByZW1vdmUgaXQgYmVmb3JlIHNvbWUgb25lIGVsc2UgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgbWF5IHRyeQotCQkvLyB0byBhY2Nlc3MgaXQgYWdhaW4uCi0JCWlmIChpZC5pbnRWYWx1ZSgpICE9IENvbW1hbmRzLk5PVF9BTl9JRCkgewotCQkJUHJveHlSZWYgcmVmID0gKFByb3h5UmVmKSBmSURUb1Byb3hpZXNNYXAuZ2V0KGlkKTsKLQkJCWlmIChyZWYgPT0gbnVsbCB8fCByZWYuZGVjclVzZUNudCgpIDw9IDApIHsKLQkJCQkvLyBObyB1c2FnZSwgc28gZG8gYWN0dWFsIHJlbGVhc2UuCi0JCQkJZklEVG9Qcm94aWVzTWFwLnJlbW92ZShpZCk7Ci0JCQkJKChJUkVNQmVhblByb3h5KSBwcm94eSkucmVsZWFzZSgpOwotCQkJCWlmIChyZWYgIT0gbnVsbCkKLQkJCQkJcmVmLmVucXVldWUoKTsJLy8gUXVldWUgaXQgdXAgc28gdGhhdCBvbiBuZXh0IHJlbGVhc2UgY3ljbGUgaXQgd2lsbCBnbyBhd2F5LgotCQkJfSAKLQkJfSBlbHNlIHsKLQkJCSgoSVJFTUJlYW5Qcm94eSkgcHJveHkpLnJlbGVhc2UoKTsJCQkKLQkJfQotCX0KLX0KLQotLyoqCi0gKiBSZWxlYXNlIGEgc3BlY2lmaWMgSUQuIFRoaXMgaXMgdXNlZCBpbiBjYXNlIGFuIElEIGhhcyBiZWVuIHNlbnQKLSAqIGJ1dCB3ZSBjb3VsZG4ndCBwcm94eSBpdC4gSW4gdGhhdCBjYXNlIHdlIG9ubHkgaGF2ZSBhbiBJRC4gSXQgaXMKLSAqIGFsc28gdXNlZCB3aGVuIGEgcHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgZXhwbGljaXRseSBvciB0aHJvdWdoIEdDLgotICogSW4gdGhhdCBjYXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gZGUtcmVnaXN0ZXJlZC4KLSAqLwotcHJpdmF0ZSB2b2lkIHJlbGVhc2VJRChpbnQgYW5JRCkgewotCXRyeSB7Ci0JCUlSRU1Db25uZWN0aW9uIGNvbm5lY3QgPSBmUmVnaXN0cnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJdHJ5IHsKLQkJCWNvbm5lY3QucmVsZWFzZUlEKGFuSUQpOwotCQl9IGZpbmFsbHkgewotCQkJZlJlZ2lzdHJ5LnJldHVybkNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCX0KLQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkvLyBDb3VsZG4ndCBnZXQgY29ubmVjdGlvbiwgZG9uJ3QgYm90aGVyIHdpdGggYSByZWxlYXNlLgotCX0KLX0KLQotLyoqCi0gKiBGb3IgdGhlIFJlbW90ZSBGYWN0b3J5IHdlIHdpbGwgY3JlYXRlIGFuIFJFTUJlYW5Qcm94eSB1c2luZyB0aGUgbnVsbCBjb25zdHJ1Y3RvcgotICogUGFja2FnZSBwcm90ZWN0ZWQgc28gb25seSBSRU1CZWFuVHlwZVByb3hpZXMgY2FuIGNyZWF0ZSBpbnN0YW5jZXMuCi0gKi8KLSAKLUlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5KElSRU1CZWFuVHlwZVByb3h5IGFUeXBlUHJveHkpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JcmV0dXJuIFJFTVN0YW5kYXJkQmVhblByb3h5Q29uc3RhbnRzLmdldENvbnN0YW50cyhmUmVnaXN0cnkpLmdldENsYXNzTmV3SW5zdGFuY2UoKS5pbnZva2UobnVsbCwgYVR5cGVQcm94eSk7Ci19Ci0KLS8qKgotICogRm9yIHRoZSBSZW1vdGUgRmFjdG9yeSB3ZSB3aWxsIGNyZWF0ZSBhIFJFTUJlYW5Qcm94eSB1c2luZyB0aGUgaW5pdGlhbGl6YXRpb25TdHJpbmcuCi0gKiBQYWNrYWdlIHByb3RlY3RlZCBzbyBvbmx5IFJFTUJlYW5UeXBlUHJveGllcyBjYW4gY3JlYXRlIGluc3RhbmNlcy4gCi0gKi8KLUlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5KElSRU1CZWFuVHlwZVByb3h5IGFUeXBlUHJveHksIFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykKLQl0aHJvd3MgVGhyb3dhYmxlUHJveHksIENvbW1hbmRFeGNlcHRpb24sIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZlJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0Jc3RhcnRUcmFuc2FjdGlvbigpOwotCS8vIFN0YXJ0aW5nIGEgdHJhbnNhY3Rpb24sIHdlIHdpbGwgYmUgZ2V0dGluZyBpZCdzIGJhY2sgYW5kIG5lZWQgdG8gZ2V0IGRhdGEgaW4gYSBzZXBhcmF0ZSBzdGVwLCBzbyB3ZSBuZWVkIHRvIGdyb3VwIGl0IGluIGEgdHJhbnNhY3Rpb24uCi0JdHJ5IHsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV3SW5zdGFuY2VEYXRhID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW5ld0luc3RhbmNlRGF0YSA9IGdldE5ld0luc3RhbmNlRGF0YShhVHlwZVByb3h5LCBpbml0aWFsaXphdGlvblN0cmluZywgY29ubmVjdCk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQlzd2l0Y2ggKGUuZ2V0RXJyb3JDb2RlKCkpIHsKLQkJCQljYXNlIENvbW1hbmRzLkNMQVNTX0NBU1RfRVhDRVBUSU9OOgotCQkJCQkvLyBUaGUgcmVzdWx0IHdhcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KLQkJCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuQ2xhc3NjYXN0X0VYQ18sIG5ldyBPYmplY3RbXSB7ZXh0cmFjdEZpcnN0TGluZShpbml0aWFsaXphdGlvblN0cmluZyksIGFUeXBlUHJveHkuZ2V0VHlwZU5hbWUoKX0pKTsgCi0JCQkJY2FzZSBDb21tYW5kcy5DQU5OT1RfRVZBTFVBVEVfU1RSSU5HOgotCQkJCQkvLyBXYW50IHRvIGxvZyB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIG5vdCBldmFsdWF0ZS4KLQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBsb2cgdGhpcyBzaWRlLCBqdXN0IGxvZyB0aGUgUmVtb3RlVk0gc2lkZSBvZiB0aGUgdHJhY2UuCi0JCQkJCWphdmEuaW8uU3RyaW5nV3JpdGVyIHMgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLQkJCQkJamF2YS5pby5QcmludFdyaXRlciB3ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIocyk7Ci0JCQkJCSgoVGhyb3dhYmxlUHJveHkpIGUuZ2V0RXJyb3JPYmplY3QoKSkucHJpbnRQcm94eVN0YWNrVHJhY2Uodyk7Ci0JCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsIHMudG9TdHJpbmcoKSwgbnVsbCkpOwotCQkJCQl0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuSW5zdGFudGlhdGVfRVhDXywgbmV3IE9iamVjdFtdIHtleHRyYWN0Rmlyc3RMaW5lKGluaXRpYWxpemF0aW9uU3RyaW5nKX0pKTsgCi0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgZTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyggCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCTAsCi0JCQkJCQkiIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZSkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBmYWlsZWQgaW4gdGhlIGNvbW1hbmQsIHRyeSBhZ2Fpbi4KLQkJCQlmUmVnaXN0cnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCWNvbm5lY3QgPSBmUmVnaXN0cnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJCQl0cnkgewotCQkJCQluZXdJbnN0YW5jZURhdGEgPSBnZXROZXdJbnN0YW5jZURhdGEoYVR5cGVQcm94eSwgaW5pdGlhbGl6YXRpb25TdHJpbmcsIGNvbm5lY3QpOwotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCS8vIEl0IGZhaWxlZCBhZ2Fpbi4gQ2xvc2UgdGhpcyBjb25uZWN0aW9uIGFuZCBkb24ndCBsZXQgaXQgYmUgcmV0dXJuZWQuCi0JCQkJCWZSZWdpc3RyeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCWNvbm5lY3QgPSBudWxsOyAvLyBUaGlzIGlzIHNvIHRoYXQgaXQgd29uJ3QgYmUgcmV0dXJuZWQuCi0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKLQkJCQlmUmVnaXN0cnkucmV0dXJuQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJfQotCi0JCWlmIChuZXdJbnN0YW5jZURhdGEgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRCZWFuUHJveHkobmV3SW5zdGFuY2VEYXRhKTsgLy8gVHVybiBpdCBpbnRvIGEgcHJveHkKLQl9IGZpbmFsbHkgewotCQlzdG9wVHJhbnNhY3Rpb24oKTsJLy8gTm93IHdlIGNhbiByZWxlYXNlIHRoZSB0cmFuc2FjdGlvbi4KLQl9Ci0KLXJldHVybiBudWxsOwotfQotCi1wcml2YXRlIFN0cmluZyBleHRyYWN0Rmlyc3RMaW5lKFN0cmluZyBpbml0U3RyaW5nKSB7Ci0JLy8gTmVlZCB0byBleHRyYWN0IHRoZSBmaXJzdCBsaW5lIGZvciB0aGUgbWVzc2FnZUZvcm1hdCBub3QgdG8gYmFyZi4KLQlpbnQgY3IgPSBpbml0U3RyaW5nLmluZGV4T2YoJ1xyJyk7Ci0JaW50IGxmID0gaW5pdFN0cmluZy5pbmRleE9mKCdcbicpOwkKLQlpZiAoY3IgIT0gLTEgfHwgbGYgIT0gLTEpIHsKLQkJaWYgKGNyID09IC0xIHx8IChsZiAhPSAtMSAmJiBsZiA8IGNyKSkKLQkJCXJldHVybiBpbml0U3RyaW5nLnN1YnN0cmluZygwLCBsZik7Ci0JCWVsc2UKLQkJCXJldHVybiBpbml0U3RyaW5nLnN1YnN0cmluZygwLCBjcik7Ci0JfSBlbHNlCi0JCXJldHVybiBpbml0U3RyaW5nOwotfQotCQotCQotLyoqCi0gKiBhY3R1YWxseSBjcmVhdGUgaXQgdXNpbmcgYSBwYXNzZWQgaW4gY29ubmVjdGlvbi4gVGhpcyBhbGxvd3MgcmV0cnkgY2FwYWJpbGl0eS4KLSAqCi0gKiBUaGlzIHdpbGwgc2VuZCB0aGUgcmVxdWVzdCBvdmVyIHRvIHRoZSBjb25uZWN0aW9uLgotICoKLSAqIElmIHdlIGdldCBhbiBPQkpFQ1QgYmFjaywgdGhlbiB0aGUgYmVhbnR5cGVwcm94eSB0aGF0IHRoZSBjbGFzc0lEIGluIHRoZQotICogdmFsdWUgcG9pbnRzIHRvIG11c3QgYmUgb2YgdHlwZSBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHNvIHRoYXQgd2UgY2FuCi0gKiBzZW5kIHRoaXMgbmV3IG9iamVjdCB0byB0aGUgY29ycmVjdCBiZWFudHlwZSB0byBjcmVhdGUgdGhlIGNvcnJlY3QgcHJveHkuCi0gKgotICogSWYgd2UgZ2V0IGFuIE9CSkVDVF9JRCBiYWNrLCB0aGVuIHRoZSBiZWFudHlwZXByb3h5IHRoYXQgdGhlIGNsYXNzSUQgaW4KLSAqIHRoZSB2YWx1ZSBwb2ludHMgdG8gbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSBjcmVhdGluZyBhIHByb3h5IG9mIHRoYXQgdHlwZS4gCi0gKi8KLXByaXZhdGUgQ29tbWFuZHMuVmFsdWVPYmplY3QgZ2V0TmV3SW5zdGFuY2VEYXRhKElSRU1CZWFuVHlwZVByb3h5IGFUeXBlUHJveHksIFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZywgSVJFTUNvbm5lY3Rpb24gY29ubmVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDb21tYW5kRXhjZXB0aW9uIHsJCi0JdHJ5IHsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV3SW5zdGFuY2VEYXRhID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCWNvbm5lY3QuZ2V0TmV3SW5zdGFuY2UoYVR5cGVQcm94eS5nZXRJRCgpLmludFZhbHVlKCksIGluaXRpYWxpemF0aW9uU3RyaW5nLCBuZXdJbnN0YW5jZURhdGEpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2VEYXRhOwotCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCS8vIFRCRCAtIE5lZWRzIHRvIGhhbmRsZSBlcnJvciBvZiBub3QgZXZhbHVhdGFibGUgYW5kIHNlbmQgb3ZlciB0byB0aGUgY29tcGlsb3IuCi0JCXByb2Nlc3NFcnJvclJldHVybihlKTsJLy8gUHJvY2VzcyB0aGlzCi0JfQotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIGFjdHVhbGx5IGNyZWF0ZSBpdCB1c2luZyBhIHBhc3NlZCBpbiBjb25uZWN0aW9uLiBUaGlzIGFsbG93cyByZXRyeSBjYXBhYmlsaXR5LgotICovCi1wcml2YXRlIHZvaWQgZ2V0T2JqZWN0SW5zdGFuY2VEYXRhKElSRU1Db25uZWN0aW9uIGNvbm5lY3QsIGludCBvYmplY3RJRCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBUaHJvd2FibGVQcm94eSwgQ29tbWFuZEV4Y2VwdGlvbiB7CQotCXRyeSB7Ci0JCWNvbm5lY3QuZ2V0T2JqZWN0RGF0YShvYmplY3RJRCwgdmFsdWVSZXR1cm4pOwotCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCXByb2Nlc3NFcnJvclJldHVybihlKTsJLy8gUHJvY2VzcyB0aGlzCi0JfQotfQotCi0vKioKLSAqIEdldCBhIGJlYW4gcHJveHkgZnJvbSB0aGUgdmFsdWUgb2JqZWN0IHBhc3NlZCBpbi4gSWYgbm90IHlldCBjcmVhdGVkLCBjcmVhdGUgb25lLgotICogTk9URTogTlVMTCB0eXBlIGFjdHVhbGx5IHJldHVybnMgYSB0cnVlIG51bGwuIFRoaXMgaXMgc28gdGhhdCBpZiBwZW9wbGUgYXJlIGNhc3RpbmcKLSAqIHRoZSByZXR1cm5lZCBwcm94eSB0byBhIHNwZWNpZmljIHR5cGUgKGUuZyBJSW50ZWdlckJlYW5Qcm94eSksIHRoZW4gdGhleSB3b24ndCBnZXQKLSAqIGEgQ2xhc3NDYXN0RXhjZXB0aW9uLCB0aGV5IHdpbGwgZ2V0IGEgbnVsbC4gVGhpcyBpcyBlYXNpZXIgZm9yIHRoZW0gdG8gaGFuZGxlLgotICogCi0gKiBOT1RFOiBUaGlzIGlzIHB1YmxpYyBPTkxZIHNvIHRoYXQgZXh0ZW5zaW9uIGZhY3RvcmllcyBjYW4gY3JlYXRlIGNvcnJlY3QgdHlwZXMgb2YKLSAqIHByb3hpZXMgaW4gY29uc2lzdGVudCBtYW5uZXIgZnJvbSBhIHZhbHVlIG9iamVjdC4gCi0gKiAKLSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgaXMgY2FsbGVkCi0gKiBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uIG9ubHkgYmVjYXVzZSBvdGhlcndpc2UgdGhlIHZhbHVlIGNvdWxkIGhhdmUgaW52YWxpZCBkYXRhCi0gKiBieSB0aGUgdGltZSB3ZSB0cnkgdG8gZ2V0IHRoZSBkYXRhIG91dCBvZiBpdC4KLSAqLwotcHVibGljIElCZWFuUHJveHkgZ2V0QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENvbW1hbmRFeGNlcHRpb24gewotCXN3aXRjaCAodmFsdWUudHlwZSkgewotCQkvLyBOdWxsIHJlc3VsdC4KLQkJY2FzZSAoYnl0ZSkgQ29tbWFuZHMuVk9JRF9UWVBFOgotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIEEgY29uc3RhbnQgb2JqZWN0IHdhcyByZWNlaXZlZC4KLQkJY2FzZSBDb21tYW5kcy5PQkpFQ1Q6Ci0JCQlJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IGNvbnN0YW50QmVhblR5cGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb25zdGFudEJlYW5UeXBlID0gKElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkpIGdldEJlYW5UeXBlKHZhbHVlLmNsYXNzSUQpOwotCQkJCWlmIChjb25zdGFudEJlYW5UeXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwkvLyBDYW5ub3QgZmluZCB0aGUgdHlwZSB0byBjcmVhdGUgaXQuCi0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCS8vIEl0IHdhc24ndCBhIGNvbnN0YW50IHR5cGUsIHNvIHdlIGNhbid0IGNyZWF0ZSBpdC4gUmV0dXJuIG51bGwuCi0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY29uc3RhbnRCZWFuVHlwZS5uZXdCZWFuUHJveHkodmFsdWUpOwotCQkKLQkJLy8gQW4gZXhpc3Rpbmcgb2JqZWN0X2lkIHdhcyByZXR1cm5lZCwgdGhlIG9iamVjdCBzaG91bGQgZXhpc3QuIElmIGl0IGRvZXNuJ3QKLQkJLy8gdGhlbiBzdWJtaXQgdGhlIGluZm8gY29tbWFuZCB0byB0cnkgdG8gcmVjcmVhdGUgaXQgY29ycmVjdGx5LgotCQljYXNlIENvbW1hbmRzLk9CSkVDVF9JRDoKLQkJCUludGVnZXIgb2JqZWN0SUQgPSBuZXcgSW50ZWdlcih2YWx1ZS5vYmplY3RJRCk7Ci0JCQlJQmVhblByb3h5IHByb3h5ID0gcmV0cmlldmVQcm94eShvYmplY3RJRCwgdHJ1ZSk7Ci0JCQlpZiAocHJveHkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHJveHk7Ci0KLQkJCS8vIE5vdCBmb3VuZCwgbmVlZCB0byB0cnkgdG8gcmVjcmVhdGUgaXQuCi0JCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gZlJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWdldE9iamVjdEluc3RhbmNlRGF0YShjb25uZWN0LCB2YWx1ZS5vYmplY3RJRCwgdmFsdWUpOyAvLyBHbyBhbmQgZ2V0IHRoZSBkYXRhCi0JCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJCWlmIChlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuV0FSTklORywKLQkJCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkwLAotCQkJCQkJCSIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZSkpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUcnkgb25lIG1vcmUgdGltZS4KLQkJCQkJZlJlZ2lzdHJ5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQkJY29ubmVjdCA9IG51bGw7Ci0JCQkJCWNvbm5lY3QgPSBmUmVnaXN0cnkuZ2V0RnJlZUNvbm5lY3Rpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWdldE9iamVjdEluc3RhbmNlRGF0YShjb25uZWN0LCB2YWx1ZS5vYmplY3RJRCwgdmFsdWUpOyAvLyBHbyBhbmQgZ2V0IHRoZSBkYXRhCi0JCQkJCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlQWdhaW4pIHsKLQkJCQkJCWZSZWdpc3RyeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQkJCXRocm93IGVBZ2FpbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGNvbm5lY3QgIT0gbnVsbCkKLQkJCQkJZlJlZ2lzdHJ5LnJldHVybkNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRCZWFuUHJveHkodmFsdWUpOyAvLyBOb3cgcHJvY2VzcyBpdCB0byBjcmVhdGUgdGhlIG5ldyBkYXRhLgotCQkJCi0JCS8vIEFuIG5ldyBvYmplY3QgaWQuIE5lZWQgdG8gZ2V0IHRoZSBjbGFzcyB0eXBlIGFuZCBsZXQgaXQgY3JlYXRlIGl0LgotCQljYXNlIENvbW1hbmRzLk5FV19PQkpFQ1RfSUQ6Ci0JCQl0cnkgewotCQkJCUlSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlID0gZ2V0QmVhblR5cGUodmFsdWUuY2xhc3NJRCk7Ci0JCQkJSVJFTUJlYW5Qcm94eSBuZXdQcm94eSA9IG5ld0JlYW5UeXBlLm5ld0JlYW5Qcm94eShuZXcgSW50ZWdlcih2YWx1ZS5vYmplY3RJRCkpOwotCQkJCWlmIChuZXdQcm94eSAhPSBudWxsKQotCQkJCQlyZWdpc3RlclByb3h5KG5ld1Byb3h5KTsKLQkJCQlyZXR1cm4gbmV3UHJveHk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgc2VydmVyIGhhcyBjcmVhdGVkIGEgbmV3IG9iamVjdCwgYnV0IHdlIGNvdWxkbid0IGNyZWF0ZS9yZWdpc3RlciBhIHByb3h5IGZvciBpdC4KLQkJCQkvLyBXZSBuZWVkIHRvIHJlbGVhc2UgaXQgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBnZXQgcmlkIG9mIGl0LiBPdGhlcndpc2UgaXQgd291bGQgaGFuZwotCQkJCS8vIGFyb3VuZCBvdmVyIHRoZXJlIGZvcmV2ZXIuCi0JCQkJcmVsZWFzZUlEKHZhbHVlLm9iamVjdElEKTsKLQkJCQl0aHJvdyBlOwkJCQkKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRoZSBzZXJ2ZXIgaGFzIGNyZWF0ZWQgYSBuZXcgb2JqZWN0LCBidXQgd2UgY291bGRuJ3QgY3JlYXRlL3JlZ2lzdGVyIGEgcHJveHkgZm9yIGl0LgotCQkJCS8vIFdlIG5lZWQgdG8gcmVsZWFzZSBpdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuIGdldCByaWQgb2YgaXQuIE90aGVyd2lzZSBpdCB3b3VsZCBoYW5nCi0JCQkJLy8gYXJvdW5kIG92ZXIgdGhlcmUgZm9yZXZlci4KLQkJCQlyZWxlYXNlSUQodmFsdWUub2JqZWN0SUQpOwotCQkJCXRocm93IGU7Ci0JCQl9CQkJCi0JCQkKLQkJLy8gQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24sIGNyZWF0ZSB0aGUgVGhyb3dhYmxlUHJveHkgYW5kIHRoZW4gdGhyb3cgaXQuCi0JCWNhc2UgQ29tbWFuZHMuVEhST1c6Ci0JCQlJUkVNQmVhblByb3h5IG5ld1Rocm93UHJveHkJPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlJUkVNQmVhblR5cGVQcm94eSBuZXdUaHJvd1R5cGUgPSBuZXdUaHJvd1R5cGUgPSBnZXRCZWFuVHlwZSh2YWx1ZS5jbGFzc0lEKTsKLQkJCQluZXdUaHJvd1Byb3h5ID0gbmV3VGhyb3dUeXBlLm5ld0JlYW5Qcm94eShuZXcgSW50ZWdlcih2YWx1ZS5vYmplY3RJRCkpOwotCQkJCWlmIChuZXdUaHJvd1Byb3h5ICE9IG51bGwpCi0JCQkJCXJlZ2lzdGVyUHJveHkobmV3VGhyb3dQcm94eSk7Ci0JCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUaGUgc2VydmVyIGhhcyBjcmVhdGVkIGEgbmV3IG9iamVjdCwgYnV0IHdlIGNvdWxkbid0IGNyZWF0ZS9yZWdpc3RlciBhIHByb3h5IGZvciBpdC4KLQkJCQkvLyBXZSBuZWVkIHRvIHJlbGVhc2UgaXQgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBnZXQgcmlkIG9mIGl0LiBPdGhlcndpc2UgaXQgd291bGQgaGFuZwotCQkJCS8vIGFyb3VuZCBvdmVyIHRoZXJlIGZvcmV2ZXIuCi0JCQkJcmVsZWFzZUlEKHZhbHVlLm9iamVjdElEKTsKLQkJCQl0aHJvdyBlOwkJCQkKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRoZSBzZXJ2ZXIgaGFzIGNyZWF0ZWQgYSBuZXcgb2JqZWN0LCBidXQgd2UgY291bGRuJ3QgY3JlYXRlL3JlZ2lzdGVyIGEgcHJveHkgZm9yIGl0LgotCQkJCS8vIFdlIG5lZWQgdG8gcmVsZWFzZSBpdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuIGdldCByaWQgb2YgaXQuIE90aGVyd2lzZSBpdCB3b3VsZCBoYW5nCi0JCQkJLy8gYXJvdW5kIG92ZXIgdGhlcmUgZm9yZXZlci4KLQkJCQlyZWxlYXNlSUQodmFsdWUub2JqZWN0SUQpOwotCQkJCXRocm93IGU7Ci0JCQl9CQkJCQotCQkJLy8gSXQgcmVhbGx5IHNob3VsZCBiZSBhIHRocm93YWJsZSwgYnV0IGlmIG5vdCwganVzdCByZXR1cm4gaXQuCi0JCQlpZiAobmV3VGhyb3dQcm94eSBpbnN0YW5jZW9mIFRocm93YWJsZVByb3h5KQotCQkJCXRocm93IChUaHJvd2FibGVQcm94eSkgbmV3VGhyb3dQcm94eTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbmV3VGhyb3dQcm94eTsJCQotCQkKLQkJLy8gSXQgaXMgb25lIG9mIHRoZSBzdGFuZGFyZCBraW5kcywgd2hpY2ggYXJlIENvbnN0YW50IHR5cGVzCi0JCWRlZmF1bHQ6Ci0JCQlJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHN0YW5kYXJkQmVhblR5cGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzdGFuZGFyZEJlYW5UeXBlID0gKElSRU1Db25zdGFudEJlYW5UeXBlUHJveHkpIGdldEJlYW5UeXBlKHZhbHVlLnR5cGUpOwotCQkJCWlmIChzdGFuZGFyZEJlYW5UeXBlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwkvLyBDYW5ub3QgZmluZCB0aGUgdHlwZSB0byBjcmVhdGUgaXQuCi0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCS8vIEl0IHdhc24ndCBhIHN0YW5kYXJkIHR5cGUsIHNvIHdlIGNhbid0IGNyZWF0ZSBpdC4gUmV0dXJuIG51bGwuCi0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIHN0YW5kYXJkQmVhblR5cGUubmV3QmVhblByb3h5KHZhbHVlKTsKLQl9CQkJCQkJCi19Ci0KLS8qKgotICogUHJvY2VzcyB0aGUgZXJyb3IgZXhjZXB0aW9uLiBHZXQgdGhlIGRhdGEgZnJvbSBpdCBhbmQgdHVybiBpdCBpbnRvIHByb3h5IGRhdGEuCi0gKiBJZiBpdCBpcyBhIFRIUk9XLCB0aGVuIGl0IHdpbGwgdGhyb3cgdGhlIFRocm93YWJsZSBpbnN0ZWFkLiAKLSAqCi0gKiBOT1RFOiBJdCBpcyBwdWJsaWMgT05MWSBzbyB0aGF0IGV4dGVuc2lvbiBmYWN0b3JpZXMgY2FuIHByb2Nlc3MgZXJyb3JzIGluCi0gKiBhbiBjb25zaXN0ZW50IG1hbm5lci4gCi0gKiAKLSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgYmUgY2FsbGVkIG9ubHkgd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0gKi8KLXB1YmxpYyB2b2lkIHByb2Nlc3NFcnJvclJldHVybihDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5IHsKLQlpbnQgY29kZSA9IGUuZ2V0RXJyb3JDb2RlKCk7Ci0JT2JqZWN0IGRhdGEgPSBudWxsOwotCWlmIChjb2RlID09IENvbW1hbmRzLlRIUk9XQUJMRV9TRU5UKQotCQlkYXRhID0gZ2V0QmVhblByb3h5KGUuZ2V0VmFsdWUoKSk7CS8vIEl0IGlzIFRocm93IHNlbnQsIHNvIGxldCB0aGUgdGhyb3cgZnJvbSBnZXRCZWFuUHJveHkgY29udGludWUgb24gb3V0LiAoQnV0IGFzIGEgc2FmZXR5LCB3ZSBzdGlsbCB0cnkgdG8gZ2V0IHRoZSBkYXRhLgotCWVsc2UgewotCQl0cnkgewotCQkJZGF0YSA9IGdldEJlYW5Qcm94eShlLmdldFZhbHVlKCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSB0KSB7Ci0JCQkvLyBCdXQgd2Ugd2FudCB0byBrZWVwIHRocm93YWJsZXMgaW4gdGhpcyBjYXNlLiBUaGV5IGFyZSBqdXN0IGRhdGEgZm9yIHRoZSBjb21tYW5kIGVycm9yLgotCQkJZGF0YSA9IHQ7Ci0JCX0KLQl9Ci0JdGhyb3cgbmV3IENvbW1hbmRFcnJvckV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZU1lc3NhZ2VzLlJlbW90ZUNtZF9FWENfLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGNvZGUpfSksIGNvZGUsIGUuZ2V0VmFsdWUoKSwgZGF0YSk7CS8vIENyZWF0ZSBhIG5ldyBvbmUgYW5kIHRocm93IGl0IGNvbnRhaW5pbmcgdGhlIHByb3hpZWQgZGF0YS4gLy8kTk9OLU5MUy0xJAotfQotCSAKLQotLyoqCi0gKiBHZXQgYSBiZWFudHlwZSB3aGVyZSB0aGUgaWQgcGFzc2VkIGluIGlzIHRoZSBjbGFzc0lEIG9mIHRoZSBiZWFudHlwZS4KLSAqIElmIG5vdCBmb3VuZCwgdGhlbiBnbyBnZXQgaXQgbG9hZGVkLiBJZiBpdCBjYW4ndCBiZSBmb3VuZCwgdGhlbiB3ZSB3aWxsCi0gKiByZWxlYXNlIHRoZSBpZCBiZWNhdXNlIGl0IG1lYW5zIHdlIGhhdmUgYW4gaWQgZnJvbSB0aGUgc2VydmVyLCBidXQgd2UKLSAqIGNhbid0IGNyZWF0ZSBhIHByb3h5IGZvciBpdCwgc28gZG9uJ3Qga2VlcCB0aGUgc2VydmVyIGhvbGRpbmcgaXQuCi0gKiBOT1RFOiBUaGlzIGlzIHB1YmxpYyBPTkxZIHNvIHRoYXQgZXh0ZW5zaW9uIGZhY3RvcmllcyBjYW4gY3JlYXRlIGNvcnJlY3QgdHlwZXMKLSAqIGluIGEgY29uc2lzdGVudCBtYW5uZXIgZnJvbSB0aGUgaWQuCi0gKiAKLSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbi4gCi0gKi8KLXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZShpbnQgaWQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQlJUkVNQmVhblR5cGVQcm94eSBiZWFuVHlwZSA9IG51bGw7Ci0JdHJ5IHsKLQkJSW50ZWdlciBjbGFzc0lEID0gbmV3IEludGVnZXIoaWQpOwotCQliZWFuVHlwZSA9IChJUkVNQmVhblR5cGVQcm94eSkgcmV0cmlldmVQcm94eShjbGFzc0lELCBmYWxzZSk7Ci0JCWlmIChiZWFuVHlwZSA9PSBudWxsKQotCQkJYmVhblR5cGUgPSBmQmVhblR5cGVQcm94eUZhY3RvcnkuY3JlYXRlQmVhblR5cGVQcm94eShjbGFzc0lEKTsJLy8gV2UgZG9uJ3QgaGF2ZSBpdCwgbmVlZCB0byBnbyB0byB0aGUgZmFjdG9yeSBzbyB0aGF0IGl0IGNhbiBnbyBxdWVyeSB3aGF0IGl0IG5lZWRzCi0JCWlmIChiZWFuVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIENhbm5vdCBmaW5kIHRoZSB0eXBlIHRvIGNyZWF0ZSBpdC4KLQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkvLyBJdCB3YXNuJ3QgYSBiZWFuIHR5cGUsIHNvIHdlIGNhbid0IGNyZWF0ZSBpdC4gUmV0dXJuIG51bGwuCi0JCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQl9IGZpbmFsbHkgewotCQlpZiAoYmVhblR5cGUgPT0gbnVsbCkKLQkJCXJlbGVhc2VJRChpZCk7CS8vIENvdWxkbid0IGNyZWF0ZSBhIHByb3h5LCBzbyByZWxlYXNlIHRoZSBpZC4KLQl9Ci0JcmV0dXJuIGJlYW5UeXBlOwotfQotCi0KLS8qKgotICogUmV0dXJuIGEgcHJveHkgd3JhcHBpbmcgdGhlIHByaW1pdGl2ZSBpbnRlZ2VyCi0gKi8KLXB1YmxpYyBJSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGludCBhUHJpbWl0aXZlSW50ZWdlcikgewotCi0JcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5pbnRUeXBlLmNyZWF0ZUludGVnZXJCZWFuUHJveHkoYVByaW1pdGl2ZUludGVnZXIpOwotfQotCi0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgYnl0ZQotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGJ5dGUgYVByaW1pdGl2ZUJ5dGUpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYnl0ZVR5cGUuY3JlYXRlQnl0ZUJlYW5Qcm94eShhUHJpbWl0aXZlQnl0ZSk7Ci19Ci0KLS8qKgotICogUmV0dXJuIGEgcHJveHkgd3JhcHBpbmcgdGhlIHByaW1pdGl2ZSBjaGFyCi0gKi8KLXB1YmxpYyBJQ2hhcmFjdGVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoY2hhciBhUHJpbWl0aXZlQ2hhcikgewotCi0JcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5jaGFyVHlwZS5jcmVhdGVDaGFyYWN0ZXJCZWFuUHJveHkoYVByaW1pdGl2ZUNoYXIpOwotfQotCi0vKioKLSAqIFJldHVybiBhIHByb3h5IHdyYXBwaW5nIHRoZSBwcmltaXRpdmUgc2hvcnQKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChzaG9ydCBhUHJpbWl0aXZlU2hvcnQpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3Rvcnkuc2hvcnRUeXBlLmNyZWF0ZVNob3J0QmVhblByb3h5KGFQcmltaXRpdmVTaG9ydCk7Ci19Ci0KLS8qKgotICogUmV0dXJuIGEgcHJveHkgd3JhcHBpbmcgdGhlIHByaW1pdGl2ZSBsb25nCi0gKi8KLXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgobG9uZyBhUHJpbWl0aXZlTG9uZykgewotCi0JcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5sb25nVHlwZS5jcmVhdGVMb25nQmVhblByb3h5KGFQcmltaXRpdmVMb25nKTsKLX0KLS8qKgotICogUmV0dXJuIGEgcHJveHkgd3JhcHBpbmcgdGhlIHByaW1pdGl2ZSBkb3VibGUKLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChkb3VibGUgYVByaW1pdGl2ZURvdWJsZSkgewotCi0JcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5kb3VibGVUeXBlLmNyZWF0ZURvdWJsZUJlYW5Qcm94eShhUHJpbWl0aXZlRG91YmxlKTsKLX0KLS8qKgotICogUmV0dXJuIGEgcHJveHkgd3JhcHBpbmcgdGhlIHByaW1pdGl2ZSBmbG9hdAotICovCi1wdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGZsb2F0IGFQcmltaXRpdmVGbG9hdCkgewotCi0JcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5mbG9hdFR5cGUuY3JlYXRlRmxvYXRCZWFuUHJveHkoYVByaW1pdGl2ZUZsb2F0KTsKLX0KLQotLyoqCi0gKiBjcmVhdGVCZWFuUHJveHlXaXRoIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChCb29sZWFuIGFCb29sZWFuKSB7Ci0JcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ib29sZWFuQ2xhc3MuY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShhQm9vbGVhbik7Ci19Ci0vKioKLSAqIFJldHVybiBhIHByb3h5IHRoYXQgd3JhcHMgdGhlIEludGVnZXIgYXJndW1lbnQKLSAqLwotcHVibGljIElJbnRlZ2VyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoSW50ZWdlciBhbkludGVnZXIpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50ZWdlckNsYXNzLmNyZWF0ZUludGVnZXJCZWFuUHJveHkoYW5JbnRlZ2VyKTsKLX0KLS8qKgotICogY3JlYXRlQmVhblByb3h5V2l0aCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChOdW1iZXIgYU51bWJlcikgewotCVJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSB0eXBlID0gKFJFTUFic3RyYWN0TnVtYmVyQmVhblR5cGVQcm94eSkgZkJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoYU51bWJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JcmV0dXJuIHR5cGUuY3JlYXRlTnVtYmVyQmVhblByb3h5KGFOdW1iZXIpOwotfQotLyoqCi0gKiBSZXR1cm4gYSBwcm94eSBmb3IgdGhlIGFyZ3VtZW50Ci0gKi8KLXB1YmxpYyBJU3RyaW5nQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoU3RyaW5nIGFTdHJpbmcpIHsKLQotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3Rvcnkuc3RyaW5nQ2xhc3MuY3JlYXRlU3RyaW5nQmVhblByb3h5KGFTdHJpbmcpOwotCi19Ci0vKioKLSAqIFJldHVybiBhIHByb3h5IGZvciB0aGUgYXJndW1lbnQKLSAqLwotcHVibGljIElDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChDaGFyYWN0ZXIgYUNoYXJhY3RlcikgewotCi0JcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5jaGFyYWN0ZXJDbGFzcy5jcmVhdGVDaGFyYWN0ZXJCZWFuUHJveHkoYUNoYXJhY3Rlcik7Ci0KLX0KLS8qKgotICogY3JlYXRlQmVhblByb3h5V2l0aCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIElCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoYm9vbGVhbiBhUHJpbWl0aXZlQm9vbGVhbikgewotCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYm9vbGVhblR5cGUuY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShhUHJpbWl0aXZlQm9vbGVhbik7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGFuIGFycmF5IGJlYW4gcHJveHkuCi0gKgotICogICAtIChpbnQsIG5ldyBpbnRbMl0gezMsIDR9KSB3aWxsIGNyZWF0ZToKLSAqICAgICAgaW50IFszXSBbNF0KLSAqCi0gKiAgIC0gKGludFtdLCBuZXcgaW50WzFdIHsxfSkKLSAqICAgICAgaW50IFsxXQotICoKLSAqICAgLSAoaW50W10sIG5ldyBpbnRbMl0gezIsM30pCi0gKiAgICAgIGludCBbMl0gWzNdCi0gKiAKLSAqCi0gKiAgIC0gKGludFtdLCBudWxsKSBvciAoaW50W10sIG5ldyBpbnRbMF0pIG9yIChpbnQsIG51bGwpIG9yIChpbnQsIG5ldyBpbnRbMF0pCi0gKiAgICAgIGludCBbMF0uLi4KLSAqICAgICBvcgotICogICAgIChpbnRbXVtdLi4uLCBudWxsKSBvciAoaW50W11bXS4uLiwgbmV3IGludFswXSkKLSAqICAgICAgaW50WzBdW10uLi4KLSAqICAgICBUaGlzIGlzIGJlY2F1c2UgYW4gYXJyYXkgaW5zdGFuY2Ugd2l0aCBubyBzcGVjaWZpZWQgZGltZW5zaW9ucyBpcyBub3QgdmFsaWQuIAotICoKLSAqICAgLSAoaW50W11bXSwgbmV3IGludFsxXSB7M30pCi0gKiAgICAgIGludFszXVtdCi0gKi8KLXB1YmxpYyBJQXJyYXlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChJQmVhblR5cGVQcm94eSB0eXBlLCBpbnRbXSBkaW1lbnNpb25zKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCWlmICh0eXBlLmlzQXJyYXkoKSkKLQkJcmV0dXJuICgoUkVNQXJyYXlCZWFuVHlwZVByb3h5KSB0eXBlKS5jcmVhdGVCZWFuUHJveHlXaXRoKGRpbWVuc2lvbnMpOwkvLyBBbHJlYWR5IGFuIGFycmF5IHR5cGUsIGp1c3QgcGFzcyBpdCBvbi4KLQllbHNlIHsKLQkJLy8gSXQgaXMgbm90IGFuIGFycmF5IHR5cGUsIHNvIHdlIG5lZWQgdG8gZ2V0IGFuIGFycmF5IG9mIHRoaXMgdHlwZSBhbmQgZGltZW5zaW9ucy4KLQkJUkVNQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChSRU1BcnJheUJlYW5UeXBlUHJveHkpIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHR5cGUuZ2V0VHlwZU5hbWUoKSwgZGltZW5zaW9ucy5sZW5ndGgpOwotCQlyZXR1cm4gYXJyYXlUeXBlLmNyZWF0ZUJlYW5Qcm94eVdpdGgoZGltZW5zaW9ucyk7Ci0JfQotfQotLyoqCi0gKiBDcmVhdGUgYSBvbmUtZGltZW5zaW9uYWwgYXJyYXkuIAotICogVGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBzYW1lIGFzIGNhbGxpbmcgCi0gKiAgIGNyZWF0ZUJlYW5Qcm94eVdpdGgoSUJlYW5UeXBlUHJveHkgdHlwZSwgbmV3IGludFsxXSB7eH0pCi0gKiB3aGVyZSAneCcgaXMgdGhlIHZhbHVlIHBhc3NlZCBpbiBhcyB0aGUgZGltZW5zaW9uLgotICovCi1wdWJsaWMgSUFycmF5QmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoSUJlYW5UeXBlUHJveHkgdHlwZSwgaW50IGRpbWVuc2lvbikgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQlyZXR1cm4gY3JlYXRlQmVhblByb3h5V2l0aCh0eXBlLCBuZXcgaW50W10ge2RpbWVuc2lvbn0pOwotfQotCi0vKioKLSAqIFJldHJpZXZlIHRoZSBwcm94eSBmcm9tIHRoZSBtYXBwaW5nIHRhYmxlLiBIYW5kbGUgYWxyZWFkeSBHQydkLgotICogSWYgdGhpcyByZXR1cm5zIG51bGwsIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBjYWxsZXIgdHJpZXMgdG8gcmVjcmVhdGUKLSAqIGl0IHNpbmNlIHRoZSBpZCBpcyBzdGlsbCB2YWxpZCBvbiB0aGUgc2VydmVyLgotICovCi1wcml2YXRlIElCZWFuUHJveHkgcmV0cmlldmVQcm94eShJbnRlZ2VyIG9iamVjdElELCBib29sZWFuIGluY3JlbWVudFVzZUNudCkgewotCXN5bmNocm9uaXplZCAoZklEVG9Qcm94aWVzTWFwKSB7Ci0JCVByb3h5UmVmIHJlZiA9IChQcm94eVJlZikgZklEVG9Qcm94aWVzTWFwLmdldChvYmplY3RJRCk7Ci0JCWlmIChyZWYgIT0gbnVsbCkgewotCQkJT2JqZWN0IGJwID0gcmVmLmdldCgpOwkJCQotCQkJaWYgKHJlZi5pc0VucXVldWVkKCkgfHwgYnAgPT0gbnVsbCkgewotCQkJCS8vIEl0J3Mgd2FpdGluZyB0byBiZSByZW1vdmVkLCBvciBoYXMgYmVlbiByZW1vdmVkLiBpLmUuIEdDJ2QsIHNvIGp1c3QgcmVtb3ZlIGl0IGZyb20gdGhlIG1hcCwgbmV4dCBwcm9jZXNzUXVldWUgd2lsbCByZW1vdmUgaXQgZnJvbSB0aGUgcXVldWUuCi0JCQkJZklEVG9Qcm94aWVzTWFwLnJlbW92ZShvYmplY3RJRCk7Ci0JCQkJcmVmLmNsZWFyKCk7CQkvLyBUaGlzIGlzIHNvIHRoYXQgd2hlbiB0aGUgcHJvY2Vzc1F1ZXVlIHNlZSdzIGl0LCAKLQkJCQkJCQkvLyBpdCB3b24ndCBzZW5kIGEgcmVsZWFzZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgCi0JCQkJCQkJLy8gc2luY2UgaXQgd2lsbCBiZSByZWNyZWF0ZWQgd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zLgotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaW5jcmVtZW50VXNlQ250KQotCQkJCQlyZWYuaW5jclVzZUNudCgpOwotCQkJCXJldHVybiAoSUJlYW5Qcm94eSkgYnA7Ci0JCQl9CQotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KLQotLyoqCi0gKiBTdGFydCBUcmFuc2FjdGlvbjogRHVyaW5nIHRoZSB0aW1lIGJldHdlZW4gc3RhcnQvc3RvcCB0cmFuc2FjdGlvbiwKLSAqIHByb3hpZXMgd2lsbCBub3QgYmUgY2xlYW5lZCB1cC4gVGhpcyBwcmV2ZW50cyB0aGUgY2FzZSBvZiBhIHR3byBzdGVwCi0gKiB0cmFuc2FjdGlvbiB3aGVyZSB0aGUgcmV0dXJuZWQgSUQgZnJvbSB0aGUgcmVtb3RlIHZtIGlzIGZvciBhIHByb3h5Ci0gKiB0aGF0IGlzIGFib3V0IHRvIGJlIGNsZWFuZWQgdXAsIGFuZCB0aGVuIGhhdmluZyB0aGF0IHByb3h5IGRpc2FwcGVhcgotICogd2hlbiBnb2luZyBmb3IgdGhlIGRhdGEgZm9yIGl0LgotICogCi0gKiBOb3RlOiBJdCBpcyBJTVBFUklUSVZFIHRoYXQgdGhlIHN0YXJ0L3N0b3AgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKLSAqICAgICBmYWN0b3J5LnN0YXJ0VHJhbnNhY3Rpb24oKTsKLSAqICAgICB0cnkgewotICogICAgICAgICBkbyB5b3VyIHN0dWZmLi4uCi0gKiAgICAgfSBmaW5hbGx5IHsKLSAqICAgICAgICAgZmFjdG9yeS5zdG9wVHJhbnNhY3Rpb24oKTsKLSAqICAgICB9Ci0gKiAKLSAqIFRoaXMgd2F5IGl0IGNhbiBuZXZlciBhY2NpZGVudGx5IGxlYXZlIGl0IGluIGEgbG9ja2VkIHN0YXRlLgotICovCi1wdWJsaWMJdm9pZCBzdGFydFRyYW5zYWN0aW9uKCkgIHsKLQlzeW5jaHJvbml6ZWQgKGZJRFRvUHJveGllc01hcCkgewotCQl0cmFuc2FjdGlvbkxvY2tDb3VudCsrOwotCX0KLX0KLQotcHVibGljIGJvb2xlYW4gaW5UcmFuc2FjdGlvbigpIHsKLQlzeW5jaHJvbml6ZWQgKGZJRFRvUHJveGllc01hcCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25Mb2NrQ291bnQgIT0gMDsKLQl9Ci19Ci0KLS8qKgotICogU3RvcCBUcmFuc2FjdGlvbjogRHVyaW5nIHRoZSB0aW1lIGJldHdlZW4gc3RhcnQvc3RvcCB0cmFuc2FjdGlvbiwKLSAqIHByb3hpZXMgd2lsbCBub3QgYmUgY2xlYW5lZCB1cC4gVGhpcyBwcmV2ZW50cyB0aGUgY2FzZSBvZiBhIHR3byBzdGVwCi0gKiB0cmFuc2FjdGlvbiB3aGVyZSB0aGUgcmV0dXJuZWQgSUQgZnJvbSB0aGUgcmVtb3RlIHZtIGlzIGZvciBhIHByb3h5Ci0gKiB0aGF0IGlzIGFib3V0IHRvIGJlIGNsZWFuZWQgdXAsIGFuZCB0aGVuIGhhdmluZyB0aGF0IHByb3h5IGRpc2FwcGVhcgotICogd2hlbiBnb2luZyBmb3IgdGhlIGRhdGEgZm9yIGl0LgotICogCi0gKiBOb3RlOiBJdCBpcyBJTVBFUklUSVZFIHRoYXQgdGhlIHN0YXJ0L3N0b3AgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKLSAqICAgICBmYWN0b3J5LnN0YXJ0VHJhbnNhY3Rpb24oKTsKLSAqICAgICB0cnkgewotICogICAgICAgICBkbyB5b3VyIHN0dWZmLi4uCi0gKiAgICAgfSBmaW5hbGx5IHsKLSAqICAgICAgICAgZmFjdG9yeS5zdG9wVHJhbnNhY3Rpb24oKTsKLSAqICAgICB9Ci0gKiAKLSAqIFRoaXMgd2F5IGl0IGNhbiBuZXZlciBhY2NpZGVudGx5IGxlYXZlIGl0IGluIGEgbG9ja2VkIHN0YXRlLgotICovCi1wdWJsaWMJdm9pZCBzdG9wVHJhbnNhY3Rpb24oKSAgewotCXN5bmNocm9uaXplZCAoZklEVG9Qcm94aWVzTWFwKSB7Ci0JCWlmICgtLXRyYW5zYWN0aW9uTG9ja0NvdW50IDwgMCkKLQkJCXRyYW5zYWN0aW9uTG9ja0NvdW50ID0gMDsJLy8gU2hvdWxkbid0IG9jY3VyLCBidXQganVzdCBpbiBjYXNlLgotCX0KLX0KLQotLyoqCi0gKiBUZXJtaW5hdGUgdGhlIGZhY3RvcnkuIElmIHRoaXMgaXMgYmVpbmcgdGVybWluYXRlZCwgdGhlbiB0aGUgc2VydmVyIGlzIGJlaW5nIHRlcm1pbmF0ZWQgdG9vLgotICogU28ganVzdCBnbyB0aHJvdWdoIGFsbCBvZiB0aGUgcHJveGllcyBhbmQgcmVsZWFzZSB0aGVtLCBidXQgZG9uJ3Qgc2VuZCBhbnkgbm90aWZpY2F0aW9uIHRvCi0gKiB0aGUgc2VydmVyIHNpbmNlIHRoZSBzZXJ2ZXIgaXMgc3Vic2VxdWVudGx5IGp1c3QgZ29pbmcgdG8gdGhyb3cgdGhlbSBhd2F5IHdoZW4gaXQgdGVybWluYXRlcy4KLSAqIDxwPgotICogVGhpcyBjYW4ndCBydW4gYXN5bmMsIHNvIHdhaXQgaXMgYSBzdWdnZXN0aW9uIGhlcmUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci0Jc3luY2hyb25pemVkIChmSURUb1Byb3hpZXNNYXApIHsKLQkJSXRlcmF0b3IgaXRyID0gZklEVG9Qcm94aWVzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlQcm94eVJlZiByZWYgPSAoUHJveHlSZWYpIGl0ci5uZXh0KCk7Ci0JCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQlPYmplY3QgYnAgPSByZWYuZ2V0KCk7Ci0JCQkJLy8gSWYgbm90IGNsZWFuZWQgdXAgYW5kIG5vdCBlbnF1ZXVlZCwgcmVsZWFzZSBpdC4KLQkJCQlpZiAoYnAgIT0gbnVsbCAmJiAhcmVmLmlzRW5xdWV1ZWQoKSkKLQkJCQkJKChJUkVNQmVhblByb3h5KSBicCkucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCQotCQlmSURUb1Byb3hpZXNNYXAuY2xlYXIoKTsKLQkJcXVldWUgPSBudWxsOwkvLyBEb24ndCBib3RoZXIgcHJvY2Vzc2luZyB0aGUgcXVldWUsIGRvbid0IG5lZWQgdG8gbm93LgotCX0KLX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NyZWF0ZUV4cHJlc3Npb24oKQotCSAqLwotCXB1YmxpYyBJRXhwcmVzc2lvbiBjcmVhdGVFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFJFTUV4cHJlc3Npb24odGhpcy5mUmVnaXN0cnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkjY3JlYXRlQmVhblByb3h5RnJvbShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eUZyb20oU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIENsYXNzQ2FzdEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY3JlYXRlQmVhblByb3h5KGZCZWFuVHlwZVByb3h5RmFjdG9yeS52b2lkVHlwZSwgaW5pdGlhbGl6YXRpb25TdHJpbmcpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NvbnZlcnRUb1ByaW1pdGl2ZUJlYW5Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGNvbnZlcnRUb1ByaW1pdGl2ZUJlYW5Qcm94eShJQmVhblByb3h5IG5vblByaW1pdGl2ZVByb3h5KSB7Ci0JCWlmIChub25QcmltaXRpdmVQcm94eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghbm9uUHJpbWl0aXZlUHJveHkuaXNWYWxpZCgpKQotCQkJcmV0dXJuIG5vblByaW1pdGl2ZVByb3h5OwotCQlJUkVNQmVhblR5cGVQcm94eSB0eXBlID0gKElSRU1CZWFuVHlwZVByb3h5KSBub25QcmltaXRpdmVQcm94eS5nZXRUeXBlUHJveHkoKTsKLQkJLy8gU3RlcCBpbnRvIHRoZSBpbnRlcm5hbHMuIFRoZSBJRCBpcyBhIGNvbnN0YW50IGludCwgc28gd2UgY2FuIHVzZSBhIHN3aXRjaCBzdG10LgotCQlzd2l0Y2ggKHR5cGUuZ2V0SUQoKS5pbnRWYWx1ZSgpKSB7Ci0JCQljYXNlIENvbW1hbmRzLkJPT0xFQU5fQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElCb29sZWFuQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuYm9vbGVhblZhbHVlKCkpOwotCQkJY2FzZSBDb21tYW5kcy5CWVRFX0NMQVNTOgotCQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuYnl0ZVZhbHVlKCkpOwotCQkJY2FzZSBDb21tYW5kcy5DSEFSQUNURVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElDaGFyYWN0ZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5jaGFyVmFsdWUoKSk7Ci0JCQljYXNlIENvbW1hbmRzLkRPVUJMRV9DTEFTUzoKLQkJCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmRvdWJsZVZhbHVlKCkpOwotCQkJY2FzZSBDb21tYW5kcy5GTE9BVF9DTEFTUzoKLQkJCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmZsb2F0VmFsdWUoKSk7Ci0JCQljYXNlIENvbW1hbmRzLklOVEVHRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5pbnRWYWx1ZSgpKTsKLQkJCWNhc2UgQ29tbWFuZHMuTE9OR19DTEFTUzoKLQkJCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmxvbmdWYWx1ZSgpKTsKLQkJCWNhc2UgQ29tbWFuZHMuU0hPUlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5zaG9ydFZhbHVlKCkpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbm9uUHJpbWl0aXZlUHJveHk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBJQmVhblByb3h5IGdldElWTVNlcnZlclByb3h5KCkgewotCQlyZXR1cm4gdm1TZXJ2ZXJQcm94eTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyNTg2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWFwVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZEVycm9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi0vKioKLSAqIFdlIGFyZSBhIGJlYW5UeXBlUHJveHlGYWN0b3J5IGZvciBjcmVhdGluZyBSRU1CZWFuVHlwZVByb3h5IG9iamVjdHMgUHJpbWl0aXZlIHR5cGVzIGFzIHdlbGwgYXMgY29tbW9uIHR5cGVzIGxpa2UgU3RyaW5nIGFyZSBjYWNoZWQgZm9yIHNwZWVkIG9mCi0gKiBsb29rdXAuIFdlIGFyZSB0aGUgc3RhbmRhcmQgb25lIHRoYXQgdGhlIFZDRSB1c2VzLiBDcmVhdGlvbiBkYXRlOiAoMTIvMy85OSAyOjMyOjQ4IFBNKQotICogCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBmaW5hbCBSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBmRmFjdG9yeVJlZ2lzdHJ5OwotCi0JcHJvdGVjdGVkIFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBmQmVhbkZhY3Rvcnk7Ci0KLQkvLyBIYXNodGFibGUgdG8gY2FjaGUgcHJveGllcyBmb3IgY2xhc3NlcyBzbyB0aGV5IGFyZSBmb3VuZCBvbiBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgbG9va3VwcwotCXByb3RlY3RlZCBNYXAgZkJlYW5Qcm94aWVzID0gbmV3IEhhc2hNYXAoMTAwMCk7Ci0KLQkvLyBBIENhY2hlIG9mIGJlYW4gdHlwZSBwcm94aWVzIHRoYXQgc2hvdWxkIG5vdCBldmVyIGJlIHJlbGVhc2VkLiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIG9uZXMKLQkvLyB0aGF0IHdlIGNyZWF0ZSBoZXJlLiBUaGV5IGFyZSBuZXZlciByZWxlYXNlZCBiZWNhdXNlIHRoZXkgd291bGRuJ3QgYmUgY29ycmVjdGx5IHJlLWNyZWF0ZWQKLQkvLyBpZiB0aGV5IHdlcmUuIEFsc28gdGhleSBhcmUgc3RhbmRhcmQgb25lcyB3aXRoIHN0YW5kYXJkIElEJ3MgdGhhdCBkb24ndCBjaGFuZ2Ugc28gdGhleQotCS8vIGRvbid0IG5lZWQgdG8gYmUgcmUtY3JlYXRlZCBsYXRlci4KLQlwcm90ZWN0ZWQgU2V0IGZQZXJtYW5lbnRQcm94aWVzID0gbmV3IEhhc2hTZXQoMzApOwotCi0JLy8gQ2FjaGUgb2YgcmVxdWVzdGVkIGJ1dCBub3QgZm91bmQgYmVhbiB0eXBlcy4gSWYgbm90IG1haW50YWluaW5nIHRoZSBsaXN0LCB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgbnVsbC4KLQkvLyBUaGUgdmFsdWVzIGFyZSBzdHJpbmdzIChjbGFzc25hbWVzIGluIEpOSSBmb3JtYXQpLgotCXByb3RlY3RlZCBTZXQgZk5vdEZvdW5kVHlwZXMgPSBudWxsOwotCi0JLy8gQ2FjaGVkIGNvcHkgb2YgYSBmZXcgdHlwaWNhbCBiZWFuIHR5cGUgcHJveGllcy4KLQlSRU1CZWFuVHlwZVByb3h5IG9iamVjdENsYXNzOwotCi0JUkVNQ2xhc3NCZWFuVHlwZVByb3h5IGNsYXNzQ2xhc3M7Ci0KLQlSRU1Wb2lkQmVhblR5cGVQcm94eSB2b2lkVHlwZTsKLQotCVJFTUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eSBib29sZWFuVHlwZTsKLQotCVJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkgYm9vbGVhbkNsYXNzOwotCi0JUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5IGludFR5cGU7Ci0KLQlSRU1JbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5IGludGVnZXJDbGFzczsKLQotCVJFTUJ5dGVUeXBlQmVhblR5cGVQcm94eSBieXRlVHlwZTsKLQotCVJFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkgYnl0ZUNsYXNzOwotCi0JUkVNU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkgc2hvcnRDbGFzczsKLQotCVJFTVNob3J0VHlwZUJlYW5UeXBlUHJveHkgc2hvcnRUeXBlOwotCi0JUkVNTG9uZ0NsYXNzQmVhblR5cGVQcm94eSBsb25nQ2xhc3M7Ci0KLQlSRU1Mb25nVHlwZUJlYW5UeXBlUHJveHkgbG9uZ1R5cGU7Ci0KLQlSRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkgZG91YmxlQ2xhc3M7Ci0KLQlSRU1Eb3VibGVUeXBlQmVhblR5cGVQcm94eSBkb3VibGVUeXBlOwotCi0JUkVNRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkgZmxvYXRDbGFzczsKLQotCVJFTUZsb2F0VHlwZUJlYW5UeXBlUHJveHkgZmxvYXRUeXBlOwotCi0JUkVNQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkgYmlnRGVjaW1hbENsYXNzOwotCi0JUkVNQmlnSW50ZWdlckJlYW5UeXBlUHJveHkgYmlnSW50ZWdlckNsYXNzOwotCi0JUkVNQ2hhcmFjdGVyVHlwZUJlYW5UeXBlUHJveHkgY2hhclR5cGU7Ci0KLQlSRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkgY2hhcmFjdGVyQ2xhc3M7Ci0KLQlSRU1TdHJpbmdCZWFuVHlwZVByb3h5IHN0cmluZ0NsYXNzOwotCi0JLyoqCi0JICogQXZhaWxhYmxlIHRvIGFsbCBSRU0gYmVhbnR5cGVzLgotCSAqLwotCXB1YmxpYyBSRU1Qcm94eUNvbnN0YW50cyBwcm94eUNvbnN0YW50czsKLQotCS8qKgotCSAqIElERUJlYW5UeXBlUHJveHlGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJZkZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkodGhpcyk7Ci0KLQkJcHJveHlDb25zdGFudHMgPSBuZXcgUkVNUHJveHlDb25zdGFudHMoYVJlZ2lzdHJ5KTsKLQotCQkvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgY2FjaGUuCi0JCW9iamVjdENsYXNzID0gbmV3IFJFTUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuT0JKRUNUX0NMQVNTKSwgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCWNsYXNzQ2xhc3MgPSBuZXcgUkVNQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG9iamVjdENsYXNzKTsKLQkJdm9pZFR5cGUgPSBuZXcgUkVNVm9pZEJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSk7Ci0JCWJvb2xlYW5UeXBlID0gbmV3IFJFTUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJYm9vbGVhbkNsYXNzID0gbmV3IFJFTUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgb2JqZWN0Q2xhc3MpOwotCQlJQmVhblR5cGVQcm94eSBudW1iZXJDbGFzcyA9IG9iamVjdENsYXNzLm5ld0JlYW5UeXBlRm9yQ2xhc3MobmV3IEludGVnZXIoQ29tbWFuZHMuTlVNQkVSX0NMQVNTKSwgTnVtYmVyLmNsYXNzLmdldE5hbWUoKSwgdHJ1ZSk7Ci0JCWludFR5cGUgPSBuZXcgUkVNSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQlpbnRlZ2VyQ2xhc3MgPSBuZXcgUkVNSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWJ5dGVUeXBlID0gbmV3IFJFTUJ5dGVUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJYnl0ZUNsYXNzID0gbmV3IFJFTUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQlzaG9ydFR5cGUgPSBuZXcgUkVNU2hvcnRUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJc2hvcnRDbGFzcyA9IG5ldyBSRU1TaG9ydENsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWxvbmdUeXBlID0gbmV3IFJFTUxvbmdUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJbG9uZ0NsYXNzID0gbmV3IFJFTUxvbmdDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQlkb3VibGVUeXBlID0gbmV3IFJFTURvdWJsZVR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQlkb3VibGVDbGFzcyA9IG5ldyBSRU1Eb3VibGVDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbnVtYmVyQ2xhc3MpOwotCQlmbG9hdFR5cGUgPSBuZXcgUkVNRmxvYXRUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJZmxvYXRDbGFzcyA9IG5ldyBSRU1GbG9hdENsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWJpZ0RlY2ltYWxDbGFzcyA9IG5ldyBSRU1CaWdEZWNpbWFsQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWJpZ0ludGVnZXJDbGFzcyA9IG5ldyBSRU1CaWdJbnRlZ2VyQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBudW1iZXJDbGFzcyk7Ci0JCWNoYXJUeXBlID0gbmV3IFJFTUNoYXJhY3RlclR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCQljaGFyYWN0ZXJDbGFzcyA9IG5ldyBSRU1DaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgb2JqZWN0Q2xhc3MpOwotCQlzdHJpbmdDbGFzcyA9IG5ldyBSRU1TdHJpbmdCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG9iamVjdENsYXNzKTsKLQkJSUJlYW5UeXBlUHJveHkgdGhyb3dhYmxlQ2xhc3MgPSBuZXcgUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5USFJPV0FCTEVfQ0xBU1MpLCBUaHJvd2FibGUuY2xhc3MKLQkJCQkuZ2V0TmFtZSgpLCBvYmplY3RDbGFzcyk7Ci0JCUlCZWFuVHlwZVByb3h5IHRocmVhZENsYXNzID0gb2JqZWN0Q2xhc3MubmV3QmVhblR5cGVGb3JDbGFzcyhuZXcgSW50ZWdlcihDb21tYW5kcy5USFJFQURfQ0xBU1MpLCBUaHJlYWQuY2xhc3MuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0JCUlCZWFuVHlwZVByb3h5IGV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyQ2xhc3MgPSBvYmplY3RDbGFzcy5uZXdCZWFuVHlwZUZvckNsYXNzKG5ldyBJbnRlZ2VyKENvbW1hbmRzLkVYUFJFU1NJT05QUk9DRVNTRVJDT05UUk9MTEVSX0NMQVNTKSwgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGUuRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIHRoZSBoYXNodGFibGUgd2l0aCB0aGUgcHJpbWl0aXZlcywgdGhlaXIgbGFuZyBlcXVpdmFsZW50cywgYW5kIGFsc28gY29tbW9uIGNsYXNzZXMgbGlrZSBTdHJpbmcKLQotCQkvLyBQcmltaXRpdmVzCi0JCWZCZWFuUHJveGllcy5wdXQodm9pZFR5cGUuZ2V0VHlwZU5hbWUoKSwgdm9pZFR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGludFR5cGUuZ2V0VHlwZU5hbWUoKSwgaW50VHlwZSk7Ci0JCWZCZWFuUHJveGllcy5wdXQoYm9vbGVhblR5cGUuZ2V0VHlwZU5hbWUoKSwgYm9vbGVhblR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGNoYXJUeXBlLmdldFR5cGVOYW1lKCksIGNoYXJUeXBlKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChieXRlVHlwZS5nZXRUeXBlTmFtZSgpLCBieXRlVHlwZSk7Ci0JCWZCZWFuUHJveGllcy5wdXQoc2hvcnRUeXBlLmdldFR5cGVOYW1lKCksIHNob3J0VHlwZSk7Ci0JCWZCZWFuUHJveGllcy5wdXQobG9uZ1R5cGUuZ2V0VHlwZU5hbWUoKSwgbG9uZ1R5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGZsb2F0VHlwZS5nZXRUeXBlTmFtZSgpLCBmbG9hdFR5cGUpOwotCQlmQmVhblByb3hpZXMucHV0KGRvdWJsZVR5cGUuZ2V0VHlwZU5hbWUoKSwgZG91YmxlVHlwZSk7Ci0KLQkJLy8gamF2YS5sYW5nIHByaW1pdGl2ZSBwZWVycwotCQkvLyBOb3RlIHRoYXQgc3BlY2lhbCBjbGFzc2VzIGFyZSB1c2VkIGZvciBzb21lIG9mIHRoZXNlIHdoaWNoIGFsbG93IHRoZSBJREUgdG8gZ2V0IHRoZQotCQkvLyBsYW5nIG9iamVjdHMgZnJvbSB0aGUgb2JqZWN0cyB0aGF0IGFyZSBob2xkaW5nIHByb3hpZXMKLQkJZkJlYW5Qcm94aWVzLnB1dChpbnRlZ2VyQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgaW50ZWdlckNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChib29sZWFuQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYm9vbGVhbkNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChjaGFyYWN0ZXJDbGFzcy5nZXRUeXBlTmFtZSgpLCBjaGFyYWN0ZXJDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoYnl0ZUNsYXNzLmdldFR5cGVOYW1lKCksIGJ5dGVDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoc2hvcnRDbGFzcy5nZXRUeXBlTmFtZSgpLCBzaG9ydENsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChsb25nQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgbG9uZ0NsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChmbG9hdENsYXNzLmdldFR5cGVOYW1lKCksIGZsb2F0Q2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KGRvdWJsZUNsYXNzLmdldFR5cGVOYW1lKCksIGRvdWJsZUNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChiaWdEZWNpbWFsQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYmlnRGVjaW1hbENsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChiaWdJbnRlZ2VyQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYmlnSW50ZWdlckNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChzdHJpbmdDbGFzcy5nZXRUeXBlTmFtZSgpLCBzdHJpbmdDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQodGhyb3dhYmxlQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgdGhyb3dhYmxlQ2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KG9iamVjdENsYXNzLmdldFR5cGVOYW1lKCksIG9iamVjdENsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dChjbGFzc0NsYXNzLmdldFR5cGVOYW1lKCksIGNsYXNzQ2xhc3MpOwotCQlmQmVhblByb3hpZXMucHV0KG51bWJlckNsYXNzLmdldFR5cGVOYW1lKCksIG51bWJlckNsYXNzKTsKLQkJZkJlYW5Qcm94aWVzLnB1dCh0aHJlYWRDbGFzcy5nZXRUeXBlTmFtZSgpLCB0aHJlYWRDbGFzcyk7Ci0JCWZCZWFuUHJveGllcy5wdXQoZXhwcmVzc2lvblByb2Nlc3NvckNvbnRyb2xsZXJDbGFzcy5nZXRUeXBlTmFtZSgpLCBleHByZXNzaW9uUHJvY2Vzc29yQ29udHJvbGxlckNsYXNzKTsKLQotCQkvLyBNYXJrIHRoZXNlIGFzIHBlcm1hbmVudC4KLQkJZlBlcm1hbmVudFByb3hpZXMuYWRkQWxsKGZCZWFuUHJveGllcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBBRlRFUiBCZWFuUHJveHlGYWN0b3J5IGhhcyBiZWVuIGNyZWF0ZWQuIFRoaXMgaXMgUkVRVUlSRUQhIE5PVEU6IEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIHRoYXQgb25seSBSRU1TdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkKLQkgKiBjYW4gY2FsbCBpdCB3aGVuIHJlYWR5LgotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemUoUkVNU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSkgewotCQlmQmVhbkZhY3RvcnkgPSBwcm94eUZhY3Rvcnk7Ci0JCWZCZWFuRmFjdG9yeS5yZWdpc3RlclByb3hpZXMoZkJlYW5Qcm94aWVzLnZhbHVlcygpKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Uga25vdyB3ZSBkb24ndCBoYXZlIHRoZSBjbGFzcyByZWdpc3RlcmVkLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgcHJveHkuIFdlIGhhdmUgYSBjb25uZWN0aW9uIHBhc3NlZCBpbiBhbmQgd2lsbCByZXVzZQotCSAqIGl0IGFzIG5lY2Vzc2FyeQotCSAqIAotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJUkVNQmVhblR5cGVQcm94eSBjcmVhdGVCZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSVJFTUNvbm5lY3Rpb24gY29ubmVjdGlvbikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCi0JCS8vIFdlIGRvbid0IGhhdmUgdGhlIGJlYW50eXBlIHByb3h5LCBzbyBjcmVhdGUgaXQuCi0JCUlSRU1CZWFuVHlwZVByb3h5IGJlYW5UeXBlUHJveHkgPSBudWxsOwotCQlDb21tYW5kcy5HZXRDbGFzc1JldHVybiByZXQgPSBudWxsOwotCQl0cnkgewotCQkJcmV0ID0gZ2V0Q2xhc3NSZXR1cm4oY29ubmVjdGlvbiwgdHlwZU5hbWUpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlcCkgewotCQkJLy8gUHJpbnQgb3V0IHRoZSB0cmFjZSBhbmQgcmV0dXJuIHByb3h5IHdpdGggaW5pdCBlcnJvci4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlcCkpOyAvLyROT04tTkxTLTEkCi0JCQlJUkVNQmVhblR5cGVQcm94eSBwcm94eSA9IG5ldyBSRU1Jbml0RXJyb3JCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb3h5UmVtb3RlTWVzc2FnZXMuRXhjZXB0aW9uRXJyb3JNc2dfRVhDXywgbmV3IE9iamVjdFtdIHsgZXAuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgZXAuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgdHlwZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlyZWdpc3RlckJlYW5UeXBlUHJveHkocHJveHksIGZhbHNlKTsKLQkJCXJldHVybiBwcm94eTsKLQkJfQotCQlpZiAocmV0ID09IG51bGwpIHsKLQkJCWlmIChmTm90Rm91bmRUeXBlcyAhPSBudWxsKQotCQkJCWZOb3RGb3VuZFR5cGVzLmFkZCh0eXBlTmFtZSk7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gVGhlIGNsYXNzIGRvZXNuJ3QgZXZlbiBleGlzdCBvbiB0aGUgc2VydmVyLgotCQl9Ci0KLQkJaWYgKHR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIEl0IGlzIG5vdCBhbiBhcnJheS4KLQkJCUlSRU1CZWFuVHlwZVByb3h5IHN1cGVyVHlwZVByb3h5ID0gbnVsbDsKLQkJCWlmICghcmV0LmlzSW50ZXJmYWNlICYmIHJldC5zdXBlckNsYXNzbmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJLy8gR2V0IHRoZSBiZWFudHlwZSBwcm94eSBvZiB0aGUgc3VwZXJjbGFzcy4KLQkJCQlzdXBlclR5cGVQcm94eSA9IGdldEJlYW5UeXBlUHJveHkocmV0LnN1cGVyQ2xhc3NuYW1lLCBjb25uZWN0aW9uKTsKLQkJCX0KLQotCQkJLy8gRmlyc3QgY2hlY2sgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzLgotCQkJLy8gSW5uZXIgY2xhc3NlcyBoYXZlIHRvIHVzZSB0aGUgZG9sbGFyIG5vdGF0aW9uIHNpbmNlIGlmIHRoZXkgZGlkbid0IHdlIGNvdWxkbid0IHRlbGwgd2hlcmUKLQkJCS8vIHRoZSBwYWNrYWdlIGVuZGVkIGFuZCB0aGUgY2xhc3Mgc3RhcnRlZC4gVGhpcyBjaGVjayBpcyBoZXJlIGluIGNhc2UgdGhlCi0JCQkvLyBleHRlbnNpb24gZmFjdG9yeSBjYW4gaGFuZGxlIHRoaXMgY2xhc3MgYnV0IG5lZWRzIHRoZSBpZCBmcm9tIHRoZSBzZXJ2ZXIgdG8KLQkJCS8vIGNyZWF0ZSBpdC4KLQkJCWludCBwYWNrYWdlSW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKHBhY2thZ2VJbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlSW5kZXgpOwotCQkJCUlSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24ocGFja2FnZU5hbWUpOwotCQkJCWlmIChwYWNrYWdlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCWJlYW5UeXBlUHJveHkgPSBwYWNrYWdlRmFjdG9yeS5nZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHR5cGVOYW1lLCBuZXcgSW50ZWdlcihyZXQuY2xhc3NJRCksIHN1cGVyVHlwZVByb3h5KTsKLQkJCQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmV0LmlzSW50ZXJmYWNlKSB7Ci0JCQkJLy8gSW50ZXJmYWNlIG5ldmVyIGhhdmUgYSBzdXBlciB0eXBlLCBzbyB3ZSB3aWxsIGNyZWF0ZSBhIHNwZWNpZmljIHR5cGUuCi0JCQkJYmVhblR5cGVQcm94eSA9IG5ldyBSRU1JbnRlcmZhY2VCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIG5ldyBJbnRlZ2VyKHJldC5jbGFzc0lEKSwgdHlwZU5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBBc2sgdGhlIHN1cGVydHlwZQotCQkJCS8vIHRvIGNyZWF0ZSBhIGJlYW50eXBlIHByb3h5IG9mIHRoZSBzYW1lIGJlYW50eXBlIHByb3h5IGNsYXNzLgotCQkJCS8vIFRoaXMgaXMgc28gdGhhdCBhbnkgc3ViY2xhc3NlcyB3aWxsIGdldCB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcwotCQkJCS8vIGZvciBpdCBpZiBpdCBpcyBzcGVjaWFsLgotCQkJCWlmIChzdXBlclR5cGVQcm94eSAhPSBudWxsKQotCQkJCQliZWFuVHlwZVByb3h5ID0gc3VwZXJUeXBlUHJveHkubmV3QmVhblR5cGVGb3JDbGFzcyhuZXcgSW50ZWdlcihyZXQuY2xhc3NJRCksIHR5cGVOYW1lLCByZXQuaXNBYnN0cmFjdCk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYmVhblR5cGVQcm94eSA9IG5ldyBSRU1BcnJheUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgbmV3IEludGVnZXIocmV0LmNsYXNzSUQpLCB0eXBlTmFtZSwgb2JqZWN0Q2xhc3MpOwotCi0JCS8vIENhY2hlIHRoZSBpbnN0YW5jZSBzbyB3ZSBjYW4gcmUtdXNlIGl0IGFnYWluCi0JCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpCi0JCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoYmVhblR5cGVQcm94eSwgZmFsc2UpOwotCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBVc2luZyB0aGUgaGVscGVyIGNsYXNzIHRvIGZpbmQgYSBjbGFzcyBieSBuYW1lLCB0aGVuIGNyZWF0ZSB0aGUgcHJveHkuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldEJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eShNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKHR5cGVOYW1lKSwgKElSRU1Db25uZWN0aW9uKSBudWxsKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUcnkgb25jZSBtb3JlICh3ZSB3b24ndCBoYXZlIHJlY2VpdmVkIHJlY292ZXJhYmxlIGV4Y2VwdGlvbnMgaGVyZSwgdGhleSB3ZXJlIGFscmVhZHkgY2F1Z2h0IGFuZCBoYW5kbGVkKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eSh0eXBlTmFtZSwgKElSRU1Db25uZWN0aW9uKSBudWxsKTsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJLy8gRmFpbGVkIGFnYWluLgotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGVBZ2FpbikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRCZWFuVHlwZVByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXR5cGVOYW1lID0gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZSh0eXBlTmFtZSk7Ci0JCS8vIFNlZSB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSB0aGUgcHJveHkgZm9yIHRoZSBhcmd1bWVudCBuYW1lCi0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSAoSVByb3h5QmVhblR5cGUpIGZCZWFuUHJveGllcy5nZXQodHlwZU5hbWUpOwotCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKQotCQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7Ci0JCQotCQkvLyBOb3cgc2VlIGlmIGFuIGV4cHJlc3Npb24gcHJveHkgY2FjaGVkLgotCQliZWFuVHlwZVByb3h5ID0gKChSRU1FeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRCZWFuVHlwZSh0eXBlTmFtZSk7Ci0JCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpCi0JCQlyZXR1cm4gYmVhblR5cGVQcm94eTsJCQotCi0JCS8vIElmIG5vdCBhbiBhcnJheSwgdGhlbiBzZWUgaWYgdGhlIHBhY2thZ2UgZXh0ZW5zaW9uIG1lY2hhbmlzbSBjYW4gZmluZCBpdC4KLQkJLy8gRG8gdGhpcyBoZXJlIHNvIHRoYXQgaWYgaXQgaXMgZm91bmQgaW4gdGhlIHBhY2thZ2UgZXh0ZW5zaW9uIHdlIHdvbid0IG5lY2Vzc2FyaWx5IGNyZWF0ZSBhbgotCQkvLyBleHRyYSBjb25uZWN0aW9uIHdoZW4gbm90IG5lZWRlZC4KLQkJaWYgKHR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIEl0IGlzIG5vdCBhbiBhcnJheQotCQkJLy8gRmlyc3QgY2hlY2sgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzLgotCQkJLy8gSW5uZXIgY2xhc3NlcyBoYXZlIHRvIHVzZSB0aGUgZG9sbGFyIG5vdGF0aW9uIHNpbmNlIGlmIHRoZXkgZGlkbid0IHdlIGNvdWxkbid0IHRlbGwgd2hlcmUKLQkJCS8vIHRoZSBwYWNrYWdlIGVuZGVkIGFuZCB0aGUgY2xhc3Mgc3RhcnRlZC4KLQkJCWludCBwYWNrYWdlSW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKHBhY2thZ2VJbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlSW5kZXgpOwotCQkJCUlSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSBwYWNrYWdlRmFjdG9yeSA9IChJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkpIGZGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24ocGFja2FnZU5hbWUpOwotCQkJCWlmIChwYWNrYWdlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCWJlYW5UeXBlUHJveHkgPSBwYWNrYWdlRmFjdG9yeS5nZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHR5cGVOYW1lLCBleHByZXNzaW9uKTsKLQkJCQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gTmVlZCB0byBjcmVhdGUgdGhlIGV4cHJlc3Npb24gcHJveHkgZm9yIGl0LgotCQliZWFuVHlwZVByb3h5ID0gKChFeHByZXNzaW9uKSBleHByZXNzaW9uKS5jcmVhdGVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSh0eXBlTmFtZSk7Ci0JCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCXJldHVybiBiZWFuVHlwZVByb3h5OwotCi0JfQotCi0JLyoqCi0JICogT25lIHRoYXQgaW50ZXJuYWxseSBhbGxvd3MgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgYSBjb25uZWN0aW9uIHRvIHdvcmsgd2l0aC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgbnVsbCwgdGhlbiBvbmUgd2lsbCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBudWxsLCB0aGVuIHdlIGFyZSBpbiBhIHRyYW5zYWN0aW9uLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIElSRU1CZWFuVHlwZVByb3h5IGdldEJlYW5UeXBlUHJveHkoU3RyaW5nIHR5cGVOYW1lLCBJUkVNQ29ubmVjdGlvbiBpbkNvbm5lY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQotCQkvLyBTZWUgd2hldGhlciB3ZSBhbHJlYWR5IGhhdmUgdGhlIHByb3h5IGZvciB0aGUgYXJndW1lbnQgbmFtZQotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZVByb3h5ID0gKElQcm94eUJlYW5UeXBlKSBmQmVhblByb3hpZXMuZ2V0KHR5cGVOYW1lKTsKLQkJLy8gU2VlIGlmIHRoZXJlIGFuZCByZXNvbHZlZCwgaWYgc28sIHJldHVybiBpdC4gSWYgbm90IHJlc29sdmVkLCB0aGF0IG1lYW5zIHdlIG5lZWQgaXQgTk9XCi0JCS8vIHNvIHdlIG11c3QgZ28gZm9yIGl0LiBXaGVuIGZpbmFsbHkgcmVzb2x2ZWQgdGhlIG9yaWdpbmFsIEV4cHJlc3Npb25Qcm94eSB3aWxsIGJlIGRlcmVnaXN0ZXJlZCBhbmQKLQkJLy8gdGhlIHJlc29sdmVkIGJlYW50eXBlcHJveHkgd2lsbCBiZSBpbiBpdHMgcGxhY2UuCi0JCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwgJiYgYmVhblR5cGVQcm94eS5pc0JlYW5Qcm94eSgpKSB7IHJldHVybiAoSVJFTUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7IH0KLQotCQkvLyBJZiBub3QgYW4gYXJyYXksIHRoZW4gc2VlIGlmIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiBtZWNoYW5pc20gY2FuIGZpbmQgaXQuCi0JCS8vIERvIHRoaXMgaGVyZSBzbyB0aGF0IGlmIGl0IGlzIGZvdW5kIGluIHRoZSBwYWNrYWdlIGV4dGVuc2lvbiB3ZSB3b24ndCBuZWNlc3NhcmlseSBjcmVhdGUgYW4KLQkJLy8gZXh0cmEgY29ubmVjdGlvbiB3aGVuIG5vdCBuZWVkZWQuCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkKLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChwYWNrYWdlSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgcGFja2FnZUluZGV4KTsKLQkJCQlJUkVNQmVhblR5cGVQcm94eUZhY3RvcnkgcGFja2FnZUZhY3RvcnkgPSAoSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKHBhY2thZ2VOYW1lKTsKLQkJCQlpZiAocGFja2FnZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQliZWFuVHlwZVByb3h5ID0gcGFja2FnZUZhY3RvcnkuZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSk7Ci0JCQkJCWlmIChiZWFuVHlwZVByb3h5ICE9IG51bGwpIHsKLQkJCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eSgoSVJFTUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiAoSVJFTUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJUkVNQ29ubmVjdGlvbiBjb25uZWN0ID0gaW5Db25uZWN0ICE9IG51bGwgPyBpbkNvbm5lY3QgOiBmRmFjdG9yeVJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCWlmIChpbkNvbm5lY3QgPT0gbnVsbCkKLQkJCWZCZWFuRmFjdG9yeS5zdGFydFRyYW5zYWN0aW9uKCk7IC8vIFN0YXJ0IGEgdHJhbnNhdGlvbi4KLQkJdHJ5IHsKLQkJCXJldHVybiBjcmVhdGVCZWFuVHlwZVByb3h5KHR5cGVOYW1lLCBjb25uZWN0KTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoaW5Db25uZWN0ID09IG51bGwpIHsKLQkJCQkvLyBOZWVkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uLCBub3QgcmV0dXJuIGl0LgotCQkJCWZGYWN0b3J5UmVnaXN0cnkuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3QpOwotCQkJCWNvbm5lY3QgPSBudWxsOyAvLyBTbyB0aGF0IGl0IHdvbid0IGJlIHJldHVybmVkLgotCQkJfQotCQkJdGhyb3cgZTsgLy8gUGFzcyBpdCBvbiB1cAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluQ29ubmVjdCA9PSBudWxsKQotCQkJCWZCZWFuRmFjdG9yeS5zdG9wVHJhbnNhY3Rpb24oKTsKLQkJCWlmIChpbkNvbm5lY3QgPT0gbnVsbCAmJiBjb25uZWN0ICE9IG51bGwpCi0JCQkJZkZhY3RvcnlSZWdpc3RyeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhpcyBiZSBjYWxsZWQgb25seSBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uLgotCSAqLwotCXByaXZhdGUgQ29tbWFuZHMuR2V0Q2xhc3NSZXR1cm4gZ2V0Q2xhc3NSZXR1cm4oSVJFTUNvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5IHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25uZWN0aW9uLmdldENsYXNzKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFcnJvckV4Y2VwdGlvbiBlKSB7Ci0JCQlmQmVhbkZhY3RvcnkucHJvY2Vzc0Vycm9yUmV0dXJuKGUpOyAvLyBMZXQgcHJveHkgZmFjdG9yeSBoYW5kbGUgdGhlIGVycm9yIHJldHVybgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBBcnJheSB0eXBlIHByb3h5IGZvciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLiBUaGUgc2FtZSByZXN1bHQgY2FuIGJlIGdvdHRvbiBmcm9tCi0JICogZ2V0QmVhblR5cGVQcm94eS4gZS5nLiBnZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgMykgaXMgdGhlIHNhbWUgYXM6IGdldEJlYW5UeXBlUHJveHkoIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIpCi0JICogCi0JICogVGhleSBib3RoIHJlc3VsdCBpbiBhIHR5cGUgb2Y6IE9iamVjdCBbXVtdW10KLQkgKiAKLQkgKiBvciBnZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZ09iamVjdDsiLCAzKSBiZWNvbWVzIE9iamVjdCBbXVtdW11bXQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZVByb3h5KFN0cmluZyBjb21wb25lbnRDbGFzc05hbWUsIGludCBkaW1lbnNpb25zKSB7Ci0JCXJldHVybiBnZXRCZWFuVHlwZVByb3h5KGdldEFycmF5Q2xhc3NOYW1lKGNvbXBvbmVudENsYXNzTmFtZSwgZGltZW5zaW9ucykpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnRDbGFzc05hbWUKLQkgKiBAcGFyYW0gZGltZW5zaW9ucwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcnJheUNsYXNzTmFtZShTdHJpbmcgY29tcG9uZW50Q2xhc3NOYW1lLCBpbnQgZGltZW5zaW9ucykgewotCQlTdHJpbmcgam5pQ29tcG9uZW50Q2xhc3NOYW1lID0gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjb21wb25lbnRDbGFzc05hbWUpOwotCQlTdHJpbmcgY29tcFR5cGUgPSBqbmlDb21wb25lbnRDbGFzc05hbWU7Ci0JCWlmIChqbmlDb21wb25lbnRDbGFzc05hbWUuY2hhckF0KDApICE9ICdbJykgewotCQkJLy8gV2UncmUgbm90IGFscmVhZHkgYW4gYXJyYXksIHNvIGNyZWF0ZSBjb3JyZWN0IHRlbXBsYXRlLgotCQkJY29tcFR5cGUgPSAoU3RyaW5nKSBNYXBUeXBlcy5NQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcuZ2V0KGpuaUNvbXBvbmVudENsYXNzTmFtZSk7Ci0JCQlpZiAoY29tcFR5cGUgPT0gbnVsbCkgewotCQkJCS8vIEl0IGlzIGEgY2xhc3MsIGFuZCBub3QgYSB0eXBlLgotCQkJCWNvbXBUeXBlID0gIkwiICsgam5pQ29tcG9uZW50Q2xhc3NOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JCS8vIE5vdyBjcmVhdGUgaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mICdbJyBpbiBmcm9udC4KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZGltZW5zaW9ucyArIGNvbXBUeXBlLmxlbmd0aCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspCi0JCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29tcFR5cGUpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRCZWFuVHlwZVByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBJUHJveHlCZWFuVHlwZSBnZXRCZWFuVHlwZVByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBjb21wb25lbnRDbGFzc05hbWUsIGludCBkaW1lbnNpb25zKSB7Ci0JCXJldHVybiBnZXRCZWFuVHlwZVByb3h5KGV4cHJlc3Npb24sIGdldEFycmF5Q2xhc3NOYW1lKGNvbXBvbmVudENsYXNzTmFtZSwgZGltZW5zaW9ucykpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbiB0eXBlIHByb3h5IGZyb20gYSBjbGFzcyBpZC4gVGhpcyBtZWFucyB0aGF0IGEgbmV3IGNsYXNzIGlkIHdhcyBzZW50IGJhY2sgZnJvbSB0aGUgc2VydmVyIHRoYXQgd2UgZG9uJ3QgaGF2ZSB5ZXQuIFdlIG5lZWQgdG8gZ28gYXNrCi0JICogdGhlIHNlcnZlciBmb3IgaW5mb3JtYXRpb24gb24gdGhpcyB0eXBlIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBpdC4KLQkgKiAKLQkgKiBOT1RFOiBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIHRoYXQgb25seSB0aGUgc3RhbmRhcmQgYmVhbiBwcm94eSBmYWN0b3J5IGNhbiBjYWxsIGl0LgotCSAqIAotCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgaGFzIGJlZW4gY2FsbGVkIHdpdGhpbiBhIHRyYW5zYWN0aW9uLgotCSAqLwotCUlSRU1CZWFuVHlwZVByb3h5IGNyZWF0ZUJlYW5UeXBlUHJveHkoSW50ZWdlciBjbGFzc0lEKSB7Ci0JCUlSRU1Db25uZWN0aW9uIGNvbm5lY3QgPSBmRmFjdG9yeVJlZ2lzdHJ5LmdldEZyZWVDb25uZWN0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY3JlYXRlQmVhblR5cGVQcm94eShjbGFzc0lELCBjb25uZWN0KTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5pc1JlY292ZXJhYmxlKCkpIHsKLQkJCQkvLyBJdCBpcyByZWNvdmVyYWJsZSwgcHJpbnQgbWVzc2FnZSwga2VlcCBjb25uZWN0aW9uIGxpdmUgYW5kIHJldHVybiBpdC4KLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCS8vIFRyeSBhZ2FpbiwgY2xvc2UgY29ubmVjdGlvbiwgZ2V0IGEgbmV3IG9uZS4KLQkJCQlmRmFjdG9yeVJlZ2lzdHJ5LmNsb3NlQ29ubmVjdGlvbihjb25uZWN0KTsKLQkJCQljb25uZWN0ID0gbnVsbDsKLQkJCQljb25uZWN0ID0gZkZhY3RvcnlSZWdpc3RyeS5nZXRGcmVlQ29ubmVjdGlvbigpOwotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBjcmVhdGVCZWFuVHlwZVByb3h5KGNsYXNzSUQsIGNvbm5lY3QpOwotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZUFnYWluKSB7Ci0JCQkJCS8vIEZhaWxlZCBhZ2Fpbi4gQ2xvc2UgY29ubmVjdGlvbiwgZG9uJ3QgcmV0dXJuIGl0LgotCQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZUFnYWluKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkZhY3RvcnlSZWdpc3RyeS5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdCk7Ci0JCQkJCWNvbm5lY3QgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb25uZWN0ICE9IG51bGwpCi0JCQkJZkZhY3RvcnlSZWdpc3RyeS5yZXR1cm5Db25uZWN0aW9uKGNvbm5lY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogT25lIHRoYXQgaW50ZXJuYWxseSBhbGxvd3MgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgYSBjb25uZWN0aW9uIHRvIHdvcmsgd2l0aC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgbnVsbCwgdGhlbiBvbmUgd2lsbCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEl0IGlzIGltcG9ydGFudCB0aGlzIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSVJFTUJlYW5UeXBlUHJveHkgY3JlYXRlQmVhblR5cGVQcm94eShJbnRlZ2VyIGNsYXNzSUQsIElSRU1Db25uZWN0aW9uIGNvbm5lY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJLy8gV2UgZG9uJ3QgaGF2ZSB0aGUgYmVhbnR5cGUgcHJveHksIHNvIGNyZWF0ZSBpdC4KLQkJSVJFTUJlYW5UeXBlUHJveHkgYmVhblR5cGVQcm94eSA9IG51bGw7Ci0KLQkJQ29tbWFuZHMuR2V0Q2xhc3NJRFJldHVybiByZXQgPSBudWxsOwotCQl0cnkgewotCQkJcmV0ID0gZ2V0Q2xhc3NJRFJldHVybihjb25uZWN0LCBjbGFzc0lEKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZXApIHsKLQkJCS8vIEp1c3QgcHJpbnQgb3V0IHRoZSB0cmFjZSBhbmQgcmV0dXJuIHByb3h5IG5vdCBmb3VuZC4KLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlcCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIElmIHRoZSBzaWduYXR1cmUgaXMgdGhhdCBvZiBhIGNsYXNzLgotCQlpZiAocmV0LmNsYXNzTmFtZS5jaGFyQXQoMCkgIT0gJ1snKSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkuCi0JCQlJUkVNQmVhblR5cGVQcm94eSBzdXBlclR5cGVQcm94eSA9IG51bGw7Ci0JCQlpZiAoIXJldC5pc0ludGVyZmFjZSAmJiByZXQuc3VwZXJDbGFzc25hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJCS8vIEdldCB0aGUgYmVhbnR5cGUgcHJveHkgb2YgdGhlIHN1cGVyY2xhc3MuCi0JCQkJc3VwZXJUeXBlUHJveHkgPSBnZXRCZWFuVHlwZVByb3h5KHJldC5zdXBlckNsYXNzbmFtZSwgY29ubmVjdCk7Ci0JCQl9Ci0KLQkJCS8vIEZpcnN0IGNoZWNrIHdpdGggdGhlIGZhY3RvcnkgZm9yIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcy4KLQkJCS8vIElubmVyIGNsYXNzZXMgaGF2ZSB0byB1c2UgdGhlIGRvbGxhciBub3RhdGlvbiBzaW5jZSBpZiB0aGV5IGRpZG4ndCB3ZSBjb3VsZG4ndCB0ZWxsIHdoZXJlCi0JCQkvLyB0aGUgcGFja2FnZSBlbmRlZCBhbmQgdGhlIGNsYXNzIHN0YXJ0ZWQuCi0JCQlpbnQgcGFja2FnZUluZGV4ID0gcmV0LmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKHBhY2thZ2VJbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHJldC5jbGFzc05hbWUuc3Vic3RyaW5nKDAsIHBhY2thZ2VJbmRleCk7Ci0JCQkJSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5IHBhY2thZ2VGYWN0b3J5ID0gKElSRU1CZWFuVHlwZVByb3h5RmFjdG9yeSkgZkZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeUV4dGVuc2lvbihwYWNrYWdlTmFtZSk7Ci0JCQkJaWYgKHBhY2thZ2VGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJYmVhblR5cGVQcm94eSA9IHBhY2thZ2VGYWN0b3J5LmdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkocmV0LmNsYXNzTmFtZSwgY2xhc3NJRCwgc3VwZXJUeXBlUHJveHkpOwotCQkJCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKSB7Ci0JCQkJCQlyZWdpc3RlckJlYW5UeXBlUHJveHkoYmVhblR5cGVQcm94eSwgZmFsc2UpOwotCQkJCQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXQuaXNJbnRlcmZhY2UpIHsKLQkJCQkvLyBJbnRlcmZhY2UgbmV2ZXIgaGF2ZSBhIHN1cGVyIHR5cGUsIHNvIHdlIHdpbGwgbGV0IHRoZSBvYmplY3QgY2xhc3MgZG8gaXQgZm9yIHVzLgotCQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgUkVNSW50ZXJmYWNlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBjbGFzc0lELCByZXQuY2xhc3NOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQXNrIHRoZSBiZWFudHlwZSBwcm94eSBvZiB0aGUgc3VwZXJjbGFzcwotCQkJCS8vIHRvIGNyZWF0ZSBhIGJlYW50eXBlIHByb3h5IG9mIHRoZSBzYW1lIGJlYW50eXBlIHByb3h5IGNsYXNzLgotCQkJCS8vIFRoaXMgaXMgc28gdGhhdCBhbnkgc3ViY2xhc3NlcyB3aWxsIGdldCB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcwotCQkJCS8vIGZvciBpdCBpZiBpdCBpcyBzcGVjaWFsLgotCQkJCWlmIChzdXBlclR5cGVQcm94eSAhPSBudWxsKQotCQkJCQliZWFuVHlwZVByb3h5ID0gc3VwZXJUeXBlUHJveHkubmV3QmVhblR5cGVGb3JDbGFzcyhjbGFzc0lELCByZXQuY2xhc3NOYW1lLCByZXQuaXNBYnN0cmFjdCk7Ci0JCQl9Ci0KLQkJCS8vIENhY2hlIHRoZSBpbnN0YW5jZSBzbyB3ZSBjYW4gcmUtdXNlIGl0IGFnYWluCi0JCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKQotCQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eShiZWFuVHlwZVByb3h5LCBmYWxzZSk7Ci0JCQlyZXR1cm4gYmVhblR5cGVQcm94eTsKLQkJfSBlbHNlIHsKLQkJCS8vIEl0IGlzIGFuIGFycmF5LgotCQkJYmVhblR5cGVQcm94eSA9IG5ldyBSRU1BcnJheUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgY2xhc3NJRCwgcmV0LmNsYXNzTmFtZSwgb2JqZWN0Q2xhc3MpOwotCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kcy5HZXRDbGFzc0lEUmV0dXJuIGdldENsYXNzSURSZXR1cm4oSVJFTUNvbm5lY3Rpb24gY29ubmVjdGlvbiwgSW50ZWdlciBjbGFzc0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHkgewotCQl0cnkgewotCQkJcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q2xhc3NGcm9tSUQoY2xhc3NJRC5pbnRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCWZCZWFuRmFjdG9yeS5wcm9jZXNzRXJyb3JSZXR1cm4oZSk7IC8vIExldCBwcm94eSBmYWN0b3J5IGhhbmRsZSB0aGUgZXJyb3IgcmV0dXJuCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNyZWdpc3RlckJlYW5UeXBlUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHksCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlckJlYW5UeXBlUHJveHkoSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHksIGJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCWZCZWFuUHJveGllcy5wdXQoYUJlYW5UeXBlUHJveHkuZ2V0VHlwZU5hbWUoKSwgYUJlYW5UeXBlUHJveHkpOwotCQlmQmVhbkZhY3RvcnkucmVnaXN0ZXJQcm94eSgoSVJFTUJlYW5Qcm94eSkgYUJlYW5UeXBlUHJveHkpOwotCQlpZiAocGVybWFuZW50KQotCQkJZlBlcm1hbmVudFByb3hpZXMuYWRkKGFCZWFuVHlwZVByb3h5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3JlZ2lzdGVyQmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElQcm94eUJlYW5UeXBlIGFQcm94eUJlYW5UeXBlLCBmaW5hbCBib29sZWFuIHBlcm1hbmVudCkgewotCQlpZiAoYVByb3h5QmVhblR5cGUuaXNCZWFuUHJveHkoKSkKLQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eSgoSUJlYW5UeXBlUHJveHkpIGFQcm94eUJlYW5UeXBlLCBwZXJtYW5lbnQpOyAvLyBBIHJlZ3VsYXIga2luZCwgZG8gcmVndWxhciByZWdpc3RyYXRpb24uCi0JCWVsc2UgewotCQkJRXhwcmVzc2lvblByb3h5IGJlYW5FeHByZXNzaW9uUHJveHkgPSAoKEV4cHJlc3Npb25Qcm94eSkgYVByb3h5QmVhblR5cGUpOwotCQkJZmluYWwgU3RyaW5nIHR5cGVOYW1lID0gYVByb3h5QmVhblR5cGUuZ2V0VHlwZU5hbWUoKTsKLQkJCSgoUkVNRXhwcmVzc2lvbikgYmVhbkV4cHJlc3Npb25Qcm94eS5nZXRFeHByZXNzaW9uKCkpLmFkZEJlYW5UeXBlKHR5cGVOYW1lLCBhUHJveHlCZWFuVHlwZSk7Ci0JCQliZWFuRXhwcmVzc2lvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJU3RyaW5nIHR5cGVOYW1lID0gKChJUHJveHlCZWFuVHlwZSkgZXZlbnQuZ2V0U291cmNlKCkpLmdldFR5cGVOYW1lKCk7Ci0JCQkJCXN5bmNocm9uaXplZCAoUkVNU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS50aGlzKSB7Ci0JCQkJCQlpZiAoIWZCZWFuUHJveGllcy5jb250YWluc0tleSh0eXBlTmFtZSkpIHsKLQkJCQkJCQkvLyBJdCBoYXNuJ3QgYmVlbiByZXNvbHZlZCB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMuIFNvIHRoaXMgaXMgZ29vZC4gQWN0dWFsbHkgdGhpcyBzaG91bGQgbmV2ZXIKLQkJCQkJCQkvLyBvY2N1ciBiZWNhdXNlIHVwb24gcmVzb2x1dGlvbiB3ZSd2ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgdGhlIGJlYW4gdHlwZSBwcm94eSB0aHJvdWdoIHRoZQotCQkJCQkJCS8vIG5vcm1hbCBtZWNoYW5pc21zLiBCdXQgdG8gYmUgc2FmZSwgd2UnbGwgZG8gaXQgaGVyZS4KLQkJCQkJCQlmQmVhblByb3hpZXMucHV0KHR5cGVOYW1lLCBldmVudC5nZXRQcm94eSgpKTsKLQkJCQkJCQlpZiAocGVybWFuZW50KQotCQkJCQkJCQlmUGVybWFuZW50UHJveGllcy5hZGQoZXZlbnQuZ2V0UHJveHkoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChFeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCBldmVudCkgewotCQkJCQkoKFJFTUV4cHJlc3Npb24pICgoRXhwcmVzc2lvblByb3h5KSBldmVudC5nZXRTb3VyY2UoKSkuZ2V0RXhwcmVzc2lvbigpKS5yZW1vdmVCZWFuVHlwZSh0eXBlTmFtZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEEgYmVhbnR5cGUgcHJveHkgaXMgYXNrZWQgdG8gYmUgcmVsZWFzZWQuIFdlIGNhbiBvbmx5IHJlbGVhc2Ugb25lcyB0aGF0IHdlcmUgbm90IGluIHRoZSBwZXJtYW5lbnQgc2V0IHRoYXQgd2UgaW5pdGlhbGl6ZWQgd2l0aC4gVGhvc2UgaW4gdGhlCi0JICogcGVybWFuZW50IHNldCBjYW4ndCBiZSBjaGFuZ2VkIHNvIHdlIGNhbid0IHJlbGVhc2UgdGhlbS4KLQkgKiAKLQkgKiBBbnN3ZXIgd2hldGhlciBpdCBjYW4gYmUgcmVsZWFzZWQgZnJvbSB0aGUgc2VydmVyIHRvby4KLQkgKiAKLQkgKiBOT1RFOiBQYWNrYWdlIHByb3RlY3RlZCBzaW5jZSBvbmx5IFJFTVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSBzaG91bGQgY2FsbCBpdC4KLQkgKi8KLQlib29sZWFuIHJlbGVhc2VQcm94eShJQmVhblR5cGVQcm94eSBwcm94eSkgewotCQkvKioKLQkJICogQ3VycmVudGx5IHdlIHdvbid0IGFsbG93IGFueSBiZWFuIHR5cGUgcHJveGllcyB0byBiZSByZWxlYXNlZC4gV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgc3RyYXRlZ3kgZm9yIGhhbmRsaW5nIHRoYXQgdGhlcmUgbWF5IGJlIGhhcmQgcmVmcyBmcm9tCi0JCSAqIHN1YnR5cGVzLiBPbmUgdGhvdWdodCBpcyB0aGF0IGJlYW5wcm94aWVzIHRhYmxlIHNob3VsZCBzdG9yZSBTb2Z0UmVmZXJlbmNlcyBzbyB0aGF0IG9ubHkgd2hlbiBzcGFjZSBpcyBuZWVkZWQsIHRoYXQgYW55IGJlYW50eXBlIHRoYXQKLQkJICogZG9lc24ndCBoYXZlIGEgc3VidHlwZSAoc2luY2Ugc3VidHlwZXMgaG9sZCBhIHN0cm9uZyByZWYpIG9yLCBpcyBpbiB0aGUgcGVybWFuZW50IHRhYmxlIChzaW5jZSB0aGF0IGlzIGhhcmRyZWYpIGNvdWxkIGJlIEdDJ2QuIFRoZW4gd2hhdAotCQkgKiB3b3VsZCBoYXBwZW4gaXMgb24gcmVsZWFzZVByb3h5IHdlIGRvbid0IGFjdHVhbGx5IHJlbGVhc2UsIHdlIGNoYW5nZSBpdCB0byBhIFdlYWtSZWYgc28gdGhhdCBpdCB3b3VsZCBkZWZpbml0ZWx5IGJlIHJlbGVhc2VkIG9uIGEgR0MuIFRoZXNlCi0JCSAqIGFyZSBjb21wbGljYXRlZCBhcmNoLiBhbmQgd2UncmUgbm90IHN1cmUgaWYgaXQgc2hvdWxkIGJlIGFsbG93ZWQgb3Igbm90LiBTbyBmb3Igbm93LCB3ZSBkb24ndCBhbGxvdyB0aGVtIHRvIGJlIHJlbGVhc2VkLiBpZgotCQkgKiAoIWZQZXJtYW5lbnRQcm94aWVzLmNvbnRhaW5zKHByb3h5KSkgeyAvLyBXZSBjYW4gcmVsZWFzZSBpdC4gSXQgaXMgbm90IG9uZSBvZiB0aGUgcGVybWFuZW50IG9uZXMuIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCSAqIGZCZWFuUHJveGllcy5yZW1vdmUocHJveHkuZ2V0VHlwZU5hbWUoKSk7IHJldHVybiB0cnVlOyB9IH0KLQkJICovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIFRlcm1pbmF0ZSB0aGlzIGZhY3RvcnkuIFNpbmNlIGFsbCBvZiB0aGUgcHJveGllcyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcHJveHkgZmFjdG9yeSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZWxlYXNlIHRoZW0gaGVyZS4gVGhlcmUgaXMgbm8gbmVlZAotCSAqIHRvIGNsZWFyIG91dCBhbnkgZmllbGRzIHNpbmNlIHRoaXMgZmFjdG9yeSB3aWxsIG5vdCBiZSBoZWxkIG9udG8gYnkgYW55dGhpbmcgYW5kIHNvIGl0IHdpbGwgYmUgR0MnZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNCZWFuVHlwZVJlZ2lzdGVyZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0JlYW5UeXBlUmVnaXN0ZXJlZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBmQmVhblByb3hpZXMuY29udGFpbnNLZXkoTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZShjbGFzc05hbWUpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3JlZ2lzdGVyZWRUeXBlcygpCi0JICovCi0JcHVibGljIFNldCByZWdpc3RlcmVkVHlwZXMoKSB7Ci0JCXJldHVybiBmQmVhblByb3hpZXMua2V5U2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNpc0JlYW5UeXBlTm90Rm91bmQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0JlYW5UeXBlTm90Rm91bmQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gZk5vdEZvdW5kVHlwZXMgIT0gbnVsbCAmJiBmTm90Rm91bmRUeXBlcy5jb250YWlucyhNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKGNsYXNzTmFtZSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNNYWludGFpbk5vdEZvdW5kVHlwZXMoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc01haW50YWluTm90Rm91bmRUeXBlcygpIHsKLQkJcmV0dXJuIGZOb3RGb3VuZFR5cGVzICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNzZXRNYWludGFpbk5vdEZvdW5kVHlwZXMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TWFpbnRhaW5Ob3RGb3VuZFR5cGVzKGJvb2xlYW4gbWFpbnRhaW4pIHsKLQkJaWYgKG1haW50YWluKSB7Ci0JCQlpZiAoZk5vdEZvdW5kVHlwZXMgPT0gbnVsbCkKLQkJCQlmTm90Rm91bmRUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0gZWxzZQotCQkJZk5vdEZvdW5kVHlwZXMgPSBudWxsOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0cmluZ0JlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViYTcxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0cmluZ0JlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUkVNU3RyaW5nQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotCi0vKioKLSAqIFJlbW90ZSBWTSBJbXBsZW1lbnRhdGlvbiBvZiBJU3RyaW5nQmVhblByb3h5Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NDIgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBSRU1TdHJpbmdCZWFuUHJveHkgZXh0ZW5kcyBSRU1Db25zdGFudEJlYW5Qcm94eSBpbXBsZW1lbnRzIElTdHJpbmdCZWFuUHJveHkgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZTdHJpbmc7Ci0KLS8qKgotICogU3RvcmUgdGhlIGJlYW4gaW4gdGhlIHN0cmluZyBmaWVsZCB0byBzYXZlIHJlLWNhc3RpbmcgZWFjaCB0aW1lIGl0IGlzIGFza2VkIGZvci4KLSAqIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZAotICogaW4gYSBzcGVjaWFsIHdheSBhbmQgbm8gb25lIGVsc2Ugc2hvdWxkIGNyZWF0ZSB0aGVtLgotICovCi1SRU1TdHJpbmdCZWFuUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBTdHJpbmcgdmFsdWUpIHsKLQlzdXBlcihhUmVnaXN0cnkpOwotCWZTdHJpbmcgPSB2YWx1ZTsKLX0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBJU3RyaW5nQmVhblByb3h5KQotCQlyZXR1cm4gZlN0cmluZy5lcXVhbHMoKChJU3RyaW5nQmVhblByb3h5KSBhbk9iamVjdCkuc3RyaW5nVmFsdWUoKSk7Ci0JZWxzZQotCQlyZXR1cm4gZlN0cmluZy5lcXVhbHMoYW5PYmplY3QpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGNhY2hlJ2Qgc3RyaW5nIHRoYXQgaXMgYSBqYXZhLmxhbmcuU3RyaW5nIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKi8KLXB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7Ci0JcmV0dXJuIGZTdHJpbmc7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSB0b1N0cmluZyB2YWx1ZSBmcm9tIHRoZSBiZWFuLgotICovCi1wdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQlyZXR1cm4gZlN0cmluZy50b1N0cmluZygpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYmVhbnR5cGUKLSAqLwotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQlyZXR1cm4gKChSRU1TdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5zdHJpbmdDbGFzczsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmRlckJlYW4oQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsKLQl2YWx1ZS5zZXQoZlN0cmluZyk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1TdHJpbmdCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0cmluZ0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5ZjBiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVN0cmluZ0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1TdHJpbmdCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5Db21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIFJlbW90ZSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQmVhblR5cGUgcHJveHkgZm9yIGphdmEubGFuZy5TdHJpbmcKLSAqIENyZWF0aW9uIGRhdGU6ICgyLzYvMDAgOTowMToyMyBBTSkKLSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJFTVN0cmluZ0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQkvLyBDYWNoZSBhIHByb3h5IHRvIGFuIGVtcHR5IHN0cmluZyBmb3Igc3BlZWQKLQlwcm90ZWN0ZWQgZmluYWwgSVN0cmluZ0JlYW5Qcm94eSBlbXB0eVN0cmluZ1Byb3h5OwotLyoqCi0gKiBJREVTdHJpbmdCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYUNsYXNzIGphdmEubGFuZy5DbGFzcwotICovCi1SRU1TdHJpbmdCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSUJlYW5UeXBlUHJveHkgb2JqZWN0VHlwZVByb3h5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcihDb21tYW5kcy5TVFJJTkdfQ0xBU1MpLCBTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLCBvYmplY3RUeXBlUHJveHkpOwotCi0JLy8gQ2FjaGUgYSBwcm94eSB0byBhbiBlbXB0eSBzdHJpbmcgZm9yIHNwZWVkCi0JZW1wdHlTdHJpbmdQcm94eSA9IG5ldyBSRU1TdHJpbmdCZWFuUHJveHkoYVJlZ2lzdHJ5LCAiIik7CS8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBzdHJpbmcgYmVhbnMKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2Ugbm8tb25lIGVsc2Ugb3V0c2lkZSB0aGUgcGFja2FnZSBzaG91bGQgdXNlIHRoaXMsIHRoZXkKLSAqIG11c3QgZ28gdGhyb3VnaCB0aGUgQVBJIHdoZXJlIHlvdSBsb29rIHVwIGEgZmFjdG9yeSBmaXJzdC4KLSAqLwotSVN0cmluZ0JlYW5Qcm94eSBjcmVhdGVTdHJpbmdCZWFuUHJveHkoU3RyaW5nIGFTdHJpbmcpewotCWlmICggYVN0cmluZy5lcXVhbHMoIiIpICkgey8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVtcHR5U3RyaW5nUHJveHk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG5ldyBSRU1TdHJpbmdCZWFuUHJveHkoZlJlZ2lzdHJ5LCBhU3RyaW5nKTsKLQl9Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLiBUaGV5IGFyZSBjcmVhdGVkCi0gKiBleHBsaWNpdGx5IHRocm91Z2ggdGhlIGFwcHJvcHJpYXRlIGNyZWF0ZSBtZXRob2QuCi0gKi8KLXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIGFuSUQpIHsKLQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLX0KLQotLyoqCi0gKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0gKiB0aGF0IGNhbiBiZSBkb25lLgotICoKLSAqIEZvciBhbGwgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIHR5cGVzLCB0aGV5IGFyZSBmaW5hbCBjbGFzc2VzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiBTdHJpbmcgaGFzIGEgZGVmYXVsdCBjdG9yLCBidXQgaXQgcmVzdWx0cyBpbiB0aGUgZW1wdHlTdHJpbmdQcm94eSwKLSAqIHNvIHJldHVybiB0aGUgemVyb1Byb3h5IGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gZW1wdHlTdHJpbmdQcm94eTsKLX0KLQotLyoqCi0gKiBuZXdJbnN0YW5jZSBtZXRob2QgY29tbWVudC4gUHV0IGEgc2hvcnQgY3V0IGluIGZvciBzdHJpbmdzIHNvIHdlIGRvbid0IG5lZWQgdG8gZ28gdG8gdGhlIHJlbW90ZQotICogdm0ganVzdCB0byBjcmVhdGUgYSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBDbGFzc0Nhc3RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCWlmIChpbml0aWFsaXphdGlvblN0cmluZy5sZW5ndGgoKSA8PSAxKQotCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBOb3QgbGFyZ2UgZW5vdWdoIGZvciB0d28gcXVvdGVzLCBzbyBsZXQgZGVmYXVsdCBoYW5kbGUgaXQuCi0JLy8gTmVlZCBhIHF1aWNrIGNoZWNrIHRoYXQgaXQgaXMgb25seSBvbmUgcXVvdGVkIHN0cmluZy4gQW55dGhpbmcgZWxzZSBuZWVkcyB0byBiZSBwYXNzZWQgb24gdXAuCi0JU3RyaW5nIHMgPSBpbml0aWFsaXphdGlvblN0cmluZy50cmltKCk7Ci0JaW50IHNsID0gcy5sZW5ndGgoKS0xOwkKLQlpZiAocy5jaGFyQXQoMCkgIT0gJyInIHx8IHMuY2hhckF0KHNsKSAhPSAnIicpCi0JCXJldHVybiBzdXBlci5uZXdJbnN0YW5jZShpbml0aWFsaXphdGlvblN0cmluZyk7CS8vIE5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHF1b3RlLgotCi0JU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzbCk7Ci0JYm9vbGVhbiBlc2NhcGUgPSBmYWxzZTsJCQotCWZvciAoaW50IGk9MTsgaTxzbDsgaSsrKSB7Ci0JCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQllc2NhcGUgPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFlc2NhcGUgJiYgYyA9PSAnIicpCi0JCQlyZXR1cm4gc3VwZXIubmV3SW5zdGFuY2UoaW5pdGlhbGl6YXRpb25TdHJpbmcpOwkvLyBIYWQgYSBxdW90ZSBpbiB0aGUgbWlkZGxlIHdpdGhvdXQgYW4gZXNjYXBlLiBUaGlzIG1lYW5zIGFuIGV4cHJlc3Npb24sIHNlbmQgb24gdXAuCi0JCWVzY2FwZSA9IGZhbHNlOwotCQlzYi5hcHBlbmQoYyk7Ci0JfQotCQotCXJldHVybiBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHNiLnRvU3RyaW5nKCkpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHRoZSBWYWx1ZU9iamVjdCBwYXNzZWQgaW4uCi0gKiBXZSB3aWxsIGFzc3VtZSB0aGUgb2JqZWN0IGlzIGNvcnJlY3QgdHlwZS4KLSAqLwotcHVibGljIElCZWFuUHJveHkgbmV3QmVhblByb3h5KENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlKSB7Ci0JcmV0dXJuIGNyZWF0ZVN0cmluZ0JlYW5Qcm94eSgoU3RyaW5nKSB2YWx1ZS5hbk9iamVjdCk7Ci19Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVRocm93YWJsZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1UaHJvd2FibGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyMWZmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL1JFTVRocm93YWJsZUJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVRocm93YWJsZUJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuKjsKLS8qKgotICogRXhjZXB0aW9uIFByb3h5IGZvciBleGNlcHRpb24gb24gUmVtb3RlLgotICogTk9URTogVGhpcyBvbmUgaXMgdW51c3VhbCBpbiB0aGF0IGl0IGRvZXNuJ3QgaW5oZXJpdCBmcm9tCi0gKiAgICAgICBJREVCZWFuUHJveHkgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSBhbiBleGNlcHRpb24sIGFuZAotICogICAgICAgZXhjZXB0aW9ucyBhcmUgbm90IGFuIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFJFTVRocm93YWJsZUJlYW5Qcm94eSBleHRlbmRzIFRocm93YWJsZVByb3h5IGltcGxlbWVudHMgSVJFTUJlYW5Qcm94eSB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIwNzY3NzczMzY4MTAyMTUyMDZMOwotCXByaXZhdGUgSW50ZWdlciBmSUQ7Ci0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5OwotCXByaXZhdGUgSUJlYW5UeXBlUHJveHkgZlR5cGVQcm94eTsKLQotCS8qKgotCSAqIFNldCB0aGUgYmVhbiB3ZSBhcmUgcHJveHlpbmcuICBXZSBhcmUgYSBwcm94eSBmb3IgYSBiZWFuIHJ1bm5pbmcgb24gdGhlIHJlbW90ZSBWTS4gCi0JICovCi0JcHJvdGVjdGVkIFJFTVRocm93YWJsZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgSUJlYW5UeXBlUHJveHkgYVR5cGUpewotCQlmRmFjdG9yeSA9IGFSZWdpc3RyeTsKLQkJZklEID0gYW5JRDsKLQkJZlR5cGVQcm94eSA9IGFUeXBlOwotCX0KLQkKLQkvKioKLQkgKiBlcXVhbHM6IEVxdWFsIGlmOgotCSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLQkgKiAgICAgICAgIDIpIEVsc2UgaWYgb3RoZXIgaXMgYW4gSUJlYW5Qcm94eSBhbmQgbm90IGEgY29uc3RhbnQgb25lLCB0aGVuIGlmCi0JICogICAgICAgICAgICBlcXVhbHMgb24gdGhlIHNlcnZlci4KLQkgKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0JICogICAgICAgICAgICB2YWx1ZSAoZS5nLiBJU3RyaW5nQmVhblByb3h5LmVxdWFscyhTdHJpbmcpLCB0aGVuIHRydWUgaWYgdmFsdWVzIGFyZSBlcXVhbHMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCQlpZiAoc3VwZXIuZXF1YWxzKGFuT2JqZWN0KSkKLQkJCXJldHVybiB0cnVlOwkvLyBJZGVudGl0eQotCQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBJQmVhblByb3h5ICYmICEoYW5PYmplY3QgaW5zdGFuY2VvZiBJUkVNQ29uc3RhbnRCZWFuUHJveHkpICYmIGZGYWN0b3J5LmlzVmFsaWQoKSAmJiAoKElCZWFuUHJveHkpIGFuT2JqZWN0KS5nZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpID09IGZGYWN0b3J5KQotCQkJdHJ5IHsKLQkJCQkvLyBUaGUgb3RoZXIgaXMgYSBiZWFuIHByb3h5IGFuZCBpcyBub3QgYSBjb25zdGFudCBvbmUsIGxldCB0aGUgc2VydmVyIGRvIHRoZSBjaGVjay4KLQkJCQlyZXR1cm4gKChJQm9vbGVhbkJlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRPYmplY3RFcXVhbHMoKS5pbnZva2UodGhpcywgKElCZWFuUHJveHkpIGFuT2JqZWN0KSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJcmV0dXJuIHRoaXMgPT0gYUJlYW5Qcm94eTsJLy8gV2UgY2FuIGJlIGFzc3VyZWQgaW4gUmVtb3RlIFByb3h5IHRoYXQgaWRlbnRpdHkgb2YgcHJveHkgYW5kIGlkZW50aXR5IG9mIG9iamVjdCBhcmUgdGhlIHNhbWUuCi0JfQotCQotCQotCS8qKgotCSAqIEdldCBJRC4gQW4gaW50ZXJuYWwgbWV0aG9kIHRvIGJlIHVzZWQgb25seSB3aXRoaW4gdGhlIFByb3h5RmFjdG9yeSBmYW1pbHkuCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBmSUQ7Ci0JfQotCQotCS8qKgotCSAqIGlzVmFsaWQgLSBoYXMgdGhpcyBiZWFuIGJlZW4gcmVsZWFzZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIGZJRCAhPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiByZWxlYXNlIC0gVGhlIGJlYW4gaXMgYmVpbmcgcmVsZWFzZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZklEID0gbnVsbDsKLQkJZlR5cGVQcm94eSA9IG51bGw7Ci0JfSAKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWdpc3RyeSB0aGlzIHByb3h5IHdhcyBjcmVhdGVkIHdpdGguCi0JICovCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZkZhY3Rvcnk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJveGllZCBjbGFzcyBvZiB0aGUgYmVhbgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMi8zLzk5IDExOjM3OjAxIEFNKQotCSAqIEBhdXRob3I6IEpvZSBXaW5jaGVzdGVyCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuIGZUeXBlUHJveHk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdG9TdHJpbmcgb2YgdGhlIGFjdHVhbCBiZWFuIG9uIHRoZSByZW1vdGUgc2lkZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQmVhblN0cmluZygpIHsKLQkJSVN0cmluZ0JlYW5Qcm94eSBzdHJpbmcgPSAoSVN0cmluZ0JlYW5Qcm94eSkgUkVNU3RhbmRhcmRCZWFuUHJveHlDb25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRPYmplY3RUb1N0cmluZygpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzKTsKLQkJcmV0dXJuIChzdHJpbmcgIT0gbnVsbCkgPyBzdHJpbmcuc3RyaW5nVmFsdWUoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQlJU3RyaW5nQmVhblByb3h5IG1zZyA9IChJU3RyaW5nQmVhblByb3h5KSBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFRocm93YWJsZUxvY2FsaXplZE1lc3NhZ2UoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcyk7Ci0JCXJldHVybiBtc2cgIT0gbnVsbCA/IG1zZy5zdHJpbmdWYWx1ZSgpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm94eU1lc3NhZ2UoKSB7Ci0JCUlTdHJpbmdCZWFuUHJveHkgbXNnID0gKElTdHJpbmdCZWFuUHJveHkpICBSRU1TdGFuZGFyZEJlYW5Qcm94eUNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFRocm93YWJsZU1lc3NhZ2UoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcyk7Ci0JCXJldHVybiBtc2cgIT0gbnVsbCA/IG1zZy5zdHJpbmdWYWx1ZSgpIDogbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGVtcG9yYXJ5IHdheSB0byBnZXQgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgc3RhY2t0cmFjZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm94eVN0YWNrVHJhY2UoKSB7Ci0JCUlNZXRob2RQcm94eSB0ZW1wR2V0U3RhY2tUcmFjZSA9IGZGYWN0b3J5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlLlN0YWNrVHJhY2VVdGlsaXR5IiwgInByaW50U3RhY2tUcmFjZSIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5UaHJvd2FibGUifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCUlTdHJpbmdCZWFuUHJveHkgdHJhY2UgPSAoSVN0cmluZ0JlYW5Qcm94eSkgdGVtcEdldFN0YWNrVHJhY2UuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKG51bGwsIHRoaXMpOwotCQlyZXR1cm4gdHJhY2UgIT0gbnVsbCA/IHRyYWNlLnN0cmluZ1ZhbHVlKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkJCi0JcHVibGljIHZvaWQgcHJpbnRQcm94eVN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciB3cml0ZXIpIHsKLQkJU3RyaW5nIHRyYWNlID0gZ2V0UHJveHlTdGFja1RyYWNlKCk7Ci0JCXN5bmNocm9uaXplZCh3cml0ZXIpIHsKLQkJCXdyaXRlci5wcmludCh0cmFjZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnRQcm94eVN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzdHJlYW0pIHsKLQkJU3RyaW5nIHRyYWNlID0gZ2V0UHJveHlTdGFja1RyYWNlKCk7Ci0JCXN5bmNocm9uaXplZChzdHJlYW0pIHsKLQkJCXN0cmVhbS5wcmludCh0cmFjZSk7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFByb3h5U3RhY2tUcmFjZSgpIHsKLQkJU3RyaW5nIHRyYWNlID0gZ2V0UHJveHlTdGFja1RyYWNlKCk7Ci0JCXN5bmNocm9uaXplZChTeXN0ZW0uZXJyKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50KHRyYWNlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQmVsb3cgYXJlIHRoZSBhY3R1YWwgcHJpbnRTdGFja1RyYWNlLiBUaGV5IGFyZSBzZXQgdXAgdG8gZmlyc3QgY2FsbAotCSAqIHRoZSBwcm94eSB0cmFjZSBzbyB0aGF0IGl0IGNhbiBzaG93IHdoZXJlIGl0IG9jY3VycmVkIG9uIHRoZSBzZXJ2ZXIsCi0JICogYW5kIHRoZW4gaXQgd2lsbCBkbyBhIHN1cGVyIHRvIHNob3cgd2hlcmUgaXQgb2NjdXJyZWQgb24gdGhpcyBzaWRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsgCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLmVycikgewotCQkJU3lzdGVtLmVyci5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNT1RFX1ZNX1RSQUNFX0lORk9fKTsgCi0JCQlwcmludFByb3h5U3RhY2tUcmFjZSgpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNT1RFX1ZNX0xPQ0FMX1RSQUNFX0lORk9fKTsgCi0JCQlzdXBlci5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsgCi0JCXN5bmNocm9uaXplZCAocykgewotCQkJcy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNT1RFX1ZNX1RSQUNFX0lORk9fKTsgCi0JCQlwcmludFByb3h5U3RhY2tUcmFjZShzKTsKLQkJCXMucHJpbnRsbihQcm94eVJlbW90ZU1lc3NhZ2VzLlJFTU9URV9WTV9MT0NBTF9UUkFDRV9JTkZPXyk7IAotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgeyAKLQkJc3luY2hyb25pemVkIChzKSB7Ci0JCQlzLnByaW50bG4oUHJveHlSZW1vdGVNZXNzYWdlcy5SRU1PVEVfVk1fVFJBQ0VfSU5GT18pOyAKLQkJCXByaW50UHJveHlTdGFja1RyYWNlKHMpOwotCQkJcy5wcmludGxuKFByb3h5UmVtb3RlTWVzc2FnZXMuUkVNT1RFX1ZNX0xPQ0FMX1RSQUNFX0lORk9fKTsgCi0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXIgdGhlIGJlYW4gaW50byB2YWx1ZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVuZGVyQmVhbihDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZS5zZXRPYmplY3RJRChnZXRJRCgpLmludFZhbHVlKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkjaXNCZWFuUHJveHkoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQmVhblByb3h5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzRXhwcmVzc2lvblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0V4cHJlc3Npb25Qcm94eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVGhyb3dhYmxlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1UaHJvd2FibGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzlmMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1UaHJvd2FibGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1UaHJvd2FibGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBUaGUgUmVtb3RlIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyb3dhYmxlIGJlYW4gdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFJFTVRocm93YWJsZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1UaHJvd2FibGVCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotCX0JCi0JCi0JLyoqCi0JICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLQkgKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotCSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0JICovCi0JUkVNVGhyb3dhYmxlQmVhblByb3h5IGNyZWF0ZVRocm93YWJsZUJlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBuZXcgUkVNVGhyb3dhYmxlQmVhblByb3h5KGZSZWdpc3RyeSwgb2JqZWN0SUQsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIE5PVEU6IEFsbCBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdHlwZSBvZiBCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQlyZXR1cm4gbmV3QmVhblR5cGVGb3JDbGFzcyhhbklELCBhQ2xhc3NuYW1lLCBhbkFic3RyYWN0LCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lhbCBtZXRob2QgdG8gaGFuZGxlIHN1YmNsYXNzaW5nIGZyb20gYW4gYWJzdHJhY3QpLgotCSAqLwkJCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0LCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpIHsKLQkJLy8gV2UgY2FuIG5ldmVyIGhhdmUgYW4gaW50ZXJmYWNlIG9mIHR5cGUgVGhyb3dhYmxlIHNpbmNlIHRoYXQgZG9lc24ndCBleGlzdC4KLQkJaWYgKCFhbkFic3RyYWN0KQotCQkJcmV0dXJuIG5ldyBSRU1UaHJvd2FibGVCZWFuVHlwZVByb3h5KGZSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgc3VwZXJUeXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIFNwZWNpYWxpemVkIGZyb20gUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBFeGNlcHRpb25CZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkuCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgb2JqZWN0SUQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRocm93YWJsZUJlYW5Qcm94eShvYmplY3RJRCk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Wb2lkQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9SRU1Wb2lkQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjBmMjcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvUkVNVm9pZEJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTVZvaWRCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotLyoqCi0gKiBCZWFuVHlwZVByb3h5IGZvciByZXByZXNlbnRpbmcgdGhlICJ2b2lkIiB0eXBlIHZhbHVlLCBhbmQgYSB2YWx1ZSBvZiB0aGlzIHR5cGUgaXMgIm51bGwiLgotICogQ3JlYXRpb24gZGF0ZTogKDIvMTEvMDAgMjoyNjo0NyBQTSkKLSAqIEBhdXRob3I6IFJpY2hhcmQgTGVlIEt1bHAKLSAqLwotZmluYWwgY2xhc3MgUkVNVm9pZEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNQ29uc3RhbnRCZWFuVHlwZVByb3h5IHsKLQotCQotcHJvdGVjdGVkIFJFTVZvaWRCZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCXN1cGVyKGFSZWdpc3RyeSwgbmV3IEludGVnZXIoQ29tbWFuZHMuVk9JRF9UWVBFKSwgVm9pZC5UWVBFLmdldE5hbWUoKSwgbnVsbCk7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBzdXBlcnR5cGUgZm9yIHVzCi0gKiBudWxsL3ZvaWQgaGFzIG5vIHN1cGVyY2xhc3MuCi0gKiBUaGlzIGlzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGludGVyZmFjZQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0U3VwZXJCZWFuVHlwZVByb3h5KCkgewotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBiZWFuIHByb3h5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4KLSAqCi0gKiBGb3Igdm9pZCwgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4gVGhleSBhcmUgY3JlYXRlZAotICogZXhwbGljaXRseSB0aHJvdWdoIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgSVJFTUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoSW50ZWdlciBhbklEKSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0gKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0gKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotICogdGhhdCBjYW4gYmUgZG9uZS4KLSAqCi0gKiBGb3Igdm9pZCBpcyBhIGZpbmFsIGNsYXNzLCBzbyB5b3UgY2FuJ3QgY3JlYXRlIGEgbmV3QmVhblR5cGUgCi0gKiBmb3Igc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci19Ci0KLS8qKgotICogbmV3SW5zdGFuY2UgbWV0aG9kLiB2b2lkIHJlcHJlc2VudHMgIm51bGwiLAotICogc28gcmV0dXJuIHRoZSBudWxsIGZvciB0aGlzIGNhc2UgYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHZhbHVlLgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB0aGUgVmFsdWVPYmplY3QgcGFzc2VkIGluLgotICogV2Ugd2lsbCBhc3N1bWUgdGhlIG9iamVjdCBpcyBjb3JyZWN0IHR5cGUuCi0gKi8KLXB1YmxpYyBJQmVhblByb3h5IG5ld0JlYW5Qcm94eShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCXJldHVybiBuZXdJbnN0YW5jZSgpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1EaW1lbnNpb25CZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQxZmRmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1EaW1lbnNpb25CZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3Q7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1EaW1lbnNpb25CZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFRoZSBSRU0gQmVhbiBQcm94eSBmb3IgamF2YS5hd3QuRGltZW5zaW9uLgotICovCi1wdWJsaWMgY2xhc3MgUkVNRGltZW5zaW9uQmVhblByb3h5IGV4dGVuZHMgUkVNQmVhblByb3h5IGltcGxlbWVudHMgSURpbWVuc2lvbkJlYW5Qcm94eSB7Ci0JCi0JcHJvdGVjdGVkIFJFTURpbWVuc2lvbkJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgSUJlYW5UeXBlUHJveHkgYVR5cGUpIHsJCi0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLQkJdHJ5IHsKLQkJCUlJbnRlZ2VyQmVhblByb3h5IGggPSAoSUludGVnZXJCZWFuUHJveHkpIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXREaW1lbnNpb25IZWlnaHRGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJdHJ5IHsKLQkJCUlJbnRlZ2VyQmVhblByb3h5IGggPSAoSUludGVnZXJCZWFuUHJveHkpIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXREaW1lbnNpb25XaWR0aEZpZWxkUHJveHkoKS5nZXQodGhpcyk7Ci0JCQlyZXR1cm4gaC5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldERpbWVuc2lvbkhlaWdodEZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoaGVpZ2h0KSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXREaW1lbnNpb25XaWR0aEZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgod2lkdGgpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXREaW1lbnNpb25TZXRTaXplSFdQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBuZXcgSUJlYW5Qcm94eVtdIHtmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh3aWR0aCksIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGhlaWdodCl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2l6ZShJRGltZW5zaW9uQmVhblByb3h5IGZyb21EaW1lbnNpb25Qcm94eSkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0RGltZW5zaW9uU2V0U2l6ZURQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBmcm9tRGltZW5zaW9uUHJveHkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1EaW1lbnNpb25CZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1EaW1lbnNpb25CZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNjQ0MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNRGltZW5zaW9uQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJFTURpbWVuc2lvbkJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci0vKioKLSAqIEJlYW50eXBlIHByb3h5IGZvciBqYXZhLmF3dC5EaW1lbnNpb24KLSAqLwotcHVibGljIGNsYXNzIFJFTURpbWVuc2lvbkJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1EaW1lbnNpb25CZWFuVHlwZVByb3h5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgSUJlYW5UeXBlUHJveHkgYVN1cGVyVHlwZSkgewotCQlzdXBlcihhUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIGFTdXBlclR5cGUpOwotCX0KLQkJCi0JLyoqCi0JICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLQkgKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotCSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0JICovCi0JUkVNRGltZW5zaW9uQmVhblByb3h5IGNyZWF0ZURpbWVuc2lvbkJlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBuZXcgUkVNRGltZW5zaW9uQmVhblByb3h5KGZSZWdpc3RyeSwgb2JqZWN0SUQsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBuZXdCZWFuVHlwZUZvckNsYXNzOiBDcmVhdGUgYSBuZXcgYmVhbnR5cGVwcm94eSBvZiB0aGlzIGtpbmQgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgYmVhbnR5cGUgcHJveHkgZmFjdG9yeSB3aGVuIGNyZWF0aW5nIGEgYmVhbnR5cGUgcHJveHkgZm9yIGEgc3ViY2xhc3MuCi0JICogVGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzZXMsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4sIHNob3VsZCB1c2UgdGhlIHNhbWUga2luZAotCSAqIG9mIGJlYW50eXBlIHByb3h5LiBUaGlzIHdheSBpZiBhbnl0aGluZyBzcGVjaWFsIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyB0eXBlLCB0aGVuCi0JICogdGhhdCBjYW4gYmUgZG9uZS4KLQkgKgotCSAqIE5PVEU6IEFsbCBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdHlwZSBvZiBCZWFuVHlwZVByb3h5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCkgewotCQlyZXR1cm4gbmV3QmVhblR5cGVGb3JDbGFzcyhhbklELCBhQ2xhc3NuYW1lLCBhbkFic3RyYWN0LCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lhbCBtZXRob2QgdG8gaGFuZGxlIHN1YmNsYXNzaW5nIGZyb20gYW4gYWJzdHJhY3QpLgotCSAqLwkJCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0LCBJQmVhblR5cGVQcm94eSBzdXBlclR5cGUpIHsKLQkJaWYgKCFhbkFic3RyYWN0KQotCQkJcmV0dXJuIG5ldyBSRU1EaW1lbnNpb25CZWFuVHlwZVByb3h5KGZSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgc3VwZXJUeXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBSRU1BbkFic3RyYWN0QmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIFNwZWNpYWxpemVkIGZyb20gUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBFeGNlcHRpb25CZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkuCi0JICovCi0JcHVibGljIElSRU1CZWFuUHJveHkgbmV3QmVhblByb3h5KEludGVnZXIgb2JqZWN0SUQpIHsKLQkJcmV0dXJuIGNyZWF0ZURpbWVuc2lvbkJlYW5Qcm94eShvYmplY3RJRCk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUG9pbnRCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODc3ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUG9pbnRCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3Q7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1Qb2ludEJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBUaGUgUkVNIEJlYW4gUHJveHkgZm9yIGphdmEuYXd0LlBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgUkVNUG9pbnRCZWFuUHJveHkgZXh0ZW5kcyBSRU1CZWFuUHJveHkgaW1wbGVtZW50cyBJUG9pbnRCZWFuUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1Qb2ludEJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgSUJlYW5UeXBlUHJveHkgYVR5cGUpIHsJCi0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFgoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UG9pbnRYRmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WSgpIHsKLQkJdHJ5IHsKLQkJCUlJbnRlZ2VyQmVhblByb3h5IGggPSAoSUludGVnZXJCZWFuUHJveHkpIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRQb2ludFlGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0WChpbnQgeCkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFBvaW50WEZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0WShpbnQgeSkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFBvaW50WUZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeSkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oaW50IHgsIGludCB5KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRQb2ludFNldExvY2F0aW9uWFlQcm94eSgpLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyh0aGlzLCBuZXcgSUJlYW5Qcm94eVtdIHtmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh4KSwgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeSl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBvaW50QmVhblByb3h5IGZyb21Qb2ludFByb3h5KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRQb2ludFNldExvY2F0aW9uUFByb3h5KCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsIGZyb21Qb2ludFByb3h5KTsKLQl9CQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVBvaW50QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUG9pbnRCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTQ1OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUG9pbnRCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogUkVNUG9pbnRCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotLyoqCi0gKiBCZWFudHlwZSBwcm94eSBmb3IgamF2YS5hd3QuRGltZW5zaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1Qb2ludEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBSRU1BYnN0cmFjdEJlYW5UeXBlUHJveHkgaW1wbGVtZW50cyBJUkVNU3BlY2lhbEJlYW5UeXBlUHJveHkgewotCQotCXByb3RlY3RlZCBSRU1Qb2ludEJlYW5UeXBlUHJveHkoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBJQmVhblR5cGVQcm94eSBhU3VwZXJUeXBlKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYUNsYXNzbmFtZSwgYVN1cGVyVHlwZSk7Ci0JfQotCQkKLQkvKioKLQkgKiBIZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0JICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLQkgKi8KLQlSRU1Qb2ludEJlYW5Qcm94eSBjcmVhdGVQb2ludEJlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBuZXcgUkVNUG9pbnRCZWFuUHJveHkoZlJlZ2lzdHJ5LCBvYmplY3RJRCwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIG5ld0JlYW5UeXBlRm9yQ2xhc3M6IENyZWF0ZSBhIG5ldyBiZWFudHlwZXByb3h5IG9mIHRoaXMga2luZCBmb3IgdGhlIGdpdmVuIGNsYXNzLgotCSAqIFRoaXMgaXMgdXNlZCBieSBiZWFudHlwZSBwcm94eSBmYWN0b3J5IHdoZW4gY3JlYXRpbmcgYSBiZWFudHlwZSBwcm94eSBmb3IgYSBzdWJjbGFzcy4KLQkgKiBUaGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3NlcywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiwgc2hvdWxkIHVzZSB0aGUgc2FtZSBraW5kCi0JICogb2YgYmVhbnR5cGUgcHJveHkuIFRoaXMgd2F5IGlmIGFueXRoaW5nIHNwZWNpYWwgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHR5cGUsIHRoZW4KLQkgKiB0aGF0IGNhbiBiZSBkb25lLgotCSAqCi0JICogTk9URTogQWxsIHN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIHRvIHJldHVybiB0aGUgY29ycmVjdCB0eXBlIG9mIEJlYW5UeXBlUHJveHkuCi0JICovCi0JcHVibGljIElSRU1CZWFuVHlwZVByb3h5IG5ld0JlYW5UeXBlRm9yQ2xhc3MoSW50ZWdlciBhbklELCBTdHJpbmcgYUNsYXNzbmFtZSwgYm9vbGVhbiBhbkFic3RyYWN0KSB7Ci0JCXJldHVybiBuZXdCZWFuVHlwZUZvckNsYXNzKGFuSUQsIGFDbGFzc25hbWUsIGFuQWJzdHJhY3QsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWFsIG1ldGhvZCB0byBoYW5kbGUgc3ViY2xhc3NpbmcgZnJvbSBhbiBhYnN0cmFjdCkuCi0JICovCQkKLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QsIElCZWFuVHlwZVByb3h5IHN1cGVyVHlwZSkgewotCQlpZiAoIWFuQWJzdHJhY3QpCi0JCQlyZXR1cm4gbmV3IFJFTVBvaW50QmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsaXplZCBmcm9tIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB0byBlbnN1cmUgRXhjZXB0aW9uQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBjcmVhdGVQb2ludEJlYW5Qcm94eShvYmplY3RJRCk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVjdGFuZ2xlQmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1SZWN0YW5nbGVCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzMTk0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1SZWN0YW5nbGVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogUkVNUmVjdGFuZ2xlQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFRoZSBSRU0gQmVhbiBQcm94eSBmb3IgamF2YS5hd3QuUmVjdGFuZ2xlLgotICovCi1wdWJsaWMgY2xhc3MgUkVNUmVjdGFuZ2xlQmVhblByb3h5IGV4dGVuZHMgUkVNQmVhblByb3h5IGltcGxlbWVudHMgSVJlY3RhbmdsZUJlYW5Qcm94eSB7Ci0JCi0JcHJvdGVjdGVkIFJFTVJlY3RhbmdsZUJlYW5Qcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgSUJlYW5UeXBlUHJveHkgYVR5cGUpIHsJCi0JCXN1cGVyKGFSZWdpc3RyeSwgYW5JRCwgYVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFgoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlWEZpZWxkUHJveHkoKS5nZXQodGhpcyk7Ci0JCQlyZXR1cm4gaC5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IGdldFkoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlWUZpZWxkUHJveHkoKS5nZXQodGhpcyk7Ci0JCQlyZXR1cm4gaC5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRYKGludCB4KSB7Ci0JCXRyeSB7Ci0JCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlWEZpZWxkUHJveHkoKS5zZXQodGhpcywgZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0WShpbnQgeSkgewotCQl0cnkgewotCQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVlGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHkpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCB4LCBpbnQgeSkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlU2V0TG9jYXRpb25YWVByb3h5KCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsIG5ldyBJQmVhblByb3h5W10ge2ZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHgpLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh5KX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihJUG9pbnRCZWFuUHJveHkgZnJvbVBvaW50UHJveHkpIHsKLQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVNldExvY2F0aW9uUFByb3h5KCkuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRoaXMsIGZyb21Qb2ludFByb3h5KTsKLQl9Ci0JCi0JCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlSGVpZ2h0RmllbGRQcm94eSgpLmdldCh0aGlzKTsKLQkJCXJldHVybiBoLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXRyeSB7Ci0JCQlJSW50ZWdlckJlYW5Qcm94eSBoID0gKElJbnRlZ2VyQmVhblByb3h5KSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlV2lkdGhGaWVsZFByb3h5KCkuZ2V0KHRoaXMpOwotCQkJcmV0dXJuIGguaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKLQkJdHJ5IHsKLQkJCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVIZWlnaHRGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGhlaWdodCkpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlV2lkdGhGaWVsZFByb3h5KCkuc2V0KHRoaXMsIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHdpZHRoKSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhmRmFjdG9yeSkuZ2V0UmVjdGFuZ2xlU2V0U2l6ZUhXUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgbmV3IElCZWFuUHJveHlbXSB7ZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgod2lkdGgpLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChoZWlnaHQpfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNpemUoSURpbWVuc2lvbkJlYW5Qcm94eSBmcm9tRGltZW5zaW9uUHJveHkpIHsKLQkJSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50cy5nZXRDb25zdGFudHMoZkZhY3RvcnkpLmdldFJlY3RhbmdsZVNldFNpemVEUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgZnJvbURpbWVuc2lvblByb3h5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Qm91bmRzKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVTZXRCb3VuZHNYWUhXUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgbmV3IElCZWFuUHJveHlbXSB7ZkZhY3RvcnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoeCksIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHkpLCBmRmFjdG9yeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh3aWR0aCksIGZGYWN0b3J5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGhlaWdodCl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Qm91bmRzKElSZWN0YW5nbGVCZWFuUHJveHkgZnJvbVJlY3RhbmdsZVByb3h5KSB7Ci0JCUphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMuZ2V0Q29uc3RhbnRzKGZGYWN0b3J5KS5nZXRSZWN0YW5nbGVTZXRCb3VuZHNSUHJveHkoKS5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnModGhpcywgZnJvbVJlY3RhbmdsZVByb3h5KTsKLQl9CQkJCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVjdGFuZ2xlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNUmVjdGFuZ2xlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZjYzc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVJlY3RhbmdsZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3Q7Ci0vKgotICogICRSQ1NmaWxlOiBSRU1SZWN0YW5nbGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotLyoqCi0gKiBCZWFudHlwZSBwcm94eSBmb3IgamF2YS5hd3QuRGltZW5zaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBSRU1SZWN0YW5nbGVCZWFuVHlwZVByb3h5IGV4dGVuZHMgUkVNQWJzdHJhY3RCZWFuVHlwZVByb3h5IGltcGxlbWVudHMgSVJFTVNwZWNpYWxCZWFuVHlwZVByb3h5IHsKLQkKLQlwcm90ZWN0ZWQgUkVNUmVjdGFuZ2xlQmVhblR5cGVQcm94eShSRU1Qcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIElCZWFuVHlwZVByb3h5IGFTdXBlclR5cGUpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBhU3VwZXJUeXBlKTsKLQl9Ci0JCQotCS8qKgotCSAqIEhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0JICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLQkgKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotCSAqLwotCVJFTVJlY3RhbmdsZUJlYW5Qcm94eSBjcmVhdGVSZWN0YW5nbGVCZWFuUHJveHkoSW50ZWdlciBvYmplY3RJRCkgewotCQlyZXR1cm4gbmV3IFJFTVJlY3RhbmdsZUJlYW5Qcm94eShmUmVnaXN0cnksIG9iamVjdElELCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogbmV3QmVhblR5cGVGb3JDbGFzczogQ3JlYXRlIGEgbmV3IGJlYW50eXBlcHJveHkgb2YgdGhpcyBraW5kIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0JICogVGhpcyBpcyB1c2VkIGJ5IGJlYW50eXBlIHByb3h5IGZhY3Rvcnkgd2hlbiBjcmVhdGluZyBhIGJlYW50eXBlIHByb3h5IGZvciBhIHN1YmNsYXNzLgotCSAqIFRoaXMgaXMgYmVjYXVzZSBzdWJjbGFzc2VzLCB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLCBzaG91bGQgdXNlIHRoZSBzYW1lIGtpbmQKLQkgKiBvZiBiZWFudHlwZSBwcm94eS4gVGhpcyB3YXkgaWYgYW55dGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgdHlwZSwgdGhlbgotCSAqIHRoYXQgY2FuIGJlIGRvbmUuCi0JICoKLQkgKiBOT1RFOiBBbGwgc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHR5cGUgb2YgQmVhblR5cGVQcm94eS4KLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhJbnRlZ2VyIGFuSUQsIFN0cmluZyBhQ2xhc3NuYW1lLCBib29sZWFuIGFuQWJzdHJhY3QpIHsKLQkJcmV0dXJuIG5ld0JlYW5UeXBlRm9yQ2xhc3MoYW5JRCwgYUNsYXNzbmFtZSwgYW5BYnN0cmFjdCwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpYWwgbWV0aG9kIHRvIGhhbmRsZSBzdWJjbGFzc2luZyBmcm9tIGFuIGFic3RyYWN0KS4KLQkgKi8JCQotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKEludGVnZXIgYW5JRCwgU3RyaW5nIGFDbGFzc25hbWUsIGJvb2xlYW4gYW5BYnN0cmFjdCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKSB7Ci0JCWlmICghYW5BYnN0cmFjdCkKLQkJCXJldHVybiBuZXcgUkVNUmVjdGFuZ2xlQmVhblR5cGVQcm94eShmUmVnaXN0cnksIGFuSUQsIGFDbGFzc25hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUkVNQW5BYnN0cmFjdEJlYW5UeXBlUHJveHkoZlJlZ2lzdHJ5LCBhbklELCBhQ2xhc3NuYW1lLCBzdXBlclR5cGUsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsaXplZCBmcm9tIFJFTUFic3RyYWN0QmVhblR5cGVQcm94eSB0byBlbnN1cmUgRXhjZXB0aW9uQmVhblByb3hpZXMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5LgotCSAqLwotCXB1YmxpYyBJUkVNQmVhblByb3h5IG5ld0JlYW5Qcm94eShJbnRlZ2VyIG9iamVjdElEKSB7Ci0JCXJldHVybiBjcmVhdGVSZWN0YW5nbGVCZWFuUHJveHkob2JqZWN0SUQpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVJlZ2lzdGVyQVdULmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1SZWdpc3RlckFXVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjEyMWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVJlZ2lzdGVyQVdULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogUkVNUmVnaXN0ZXJBV1QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNyAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeTsKLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBBV1QgZmFjdG9yaWVzLiBJdCBpcyBub3QKLSAqIG1lYW50IHRvIGJlIGNhbGxlZCBieSBhbnlvbmUgb3RoZXIgdGhhbiBQcm94eVZNU3RhcnRlci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJFTVJlZ2lzdGVyQVdUIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJBV1QoUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJbmV3IFJFTVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCQluZXcgUkVNU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJCi0JCS8vIElmIHdlIGFyZSBkb2luZyBBV1QsIGdldCB0aGUgQVdUIGV2ZW50IHF1ZXVlIGdvaW5nLiBUaGlzIGlzIHRyeWluZyB0byBiZSBhIHRpbWUtc2F2ZXIKLQkJLy8gYnkgaGF2aW5nIGl0IHVwIHJpZ2h0IGF3YXkuCi0JCUlCZWFuVHlwZVByb3h5IHN0YXJ0ZXJCZWFuVHlwZSA9IHJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZS5BV1RTdGFydGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN0YXJ0ZXJCZWFuVHlwZSAhPSBudWxsKSB7Ci0JCQlJTWV0aG9kUHJveHkgc3RhcnRlciA9IHN0YXJ0ZXJCZWFuVHlwZS5nZXRNZXRob2RQcm94eSgic3RhcnRBV1QiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHN0YXJ0ZXIgIT0gbnVsbCkKLQkJCQlzdGFydGVyLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvYXd0L1JFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWRiZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogUkVNU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeTsKLQotLyoqCi0gKiBTdGFuZGFyZCBBV1QgQmVhbiBQcm94eSBGYWN0b3J5LgotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBpdCBzaG91bGQgbm90IHJlZmVyZW5jZWQKLSAqIG91dHNpZGUgb2YgdGhlIHBhY2thZ2Ugb3RoZXIgdGhhbiB0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCi0gKi8KLWNsYXNzIFJFTVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkgewotCi0JZmluYWwgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZkJlYW5UeXBlRmFjdG9yeTsKLQkKLQlwdWJsaWMgUkVNU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnkpIHsKLQkJZmFjdG9yeS5yZWdpc3RlckJlYW5Qcm94eUZhY3RvcnkoSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5SRUdJU1RSWV9LRVksIHRoaXMpOwotCQlmQmVhblR5cGVGYWN0b3J5ID0gZmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgSURpbWVuc2lvbkJlYW5Qcm94eSBjcmVhdGVEaW1lbnNpb25CZWFuUHJveHlXaXRoKGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElEaW1lbnNpb25CZWFuUHJveHkpIGZCZWFuVHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuRGltZW5zaW9uIikubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmF3dC5EaW1lbnNpb24oIit3aWR0aCsiLCIraGVpZ2h0KyIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7CS8vIFNob3VsZG4ndCBvY2N1cgotCQl9Ci0JfQotCQotCXB1YmxpYyBJUG9pbnRCZWFuUHJveHkgY3JlYXRlUG9pbnRCZWFuUHJveHlXaXRoKGludCB4LCBpbnQgeSl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElQb2ludEJlYW5Qcm94eSkgZkJlYW5UeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Qb2ludCIpLm5ld0luc3RhbmNlKCJuZXcgamF2YS5hd3QuUG9pbnQoIit4KyIsIit5KyIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7CS8vIFNob3VsZG4ndCBvY2N1cgotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIElSZWN0YW5nbGVCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElSZWN0YW5nbGVCZWFuUHJveHkpIGZCZWFuVHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUmVjdGFuZ2xlIikubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmF3dC5SZWN0YW5nbGUoIit4KyIsIit5KyIsIit3aWR0aCsiLCIraGVpZ2h0KyIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwkvLyBTaG91bGRuJ3Qgb2NjdXIKLQkJfQotCi0JfQotCQotCS8qCi0JICogVGVybWluYXRlIHRoaXMgZmFjdG9yeS4gU2luY2UgaXQgZG9lc24ndCBob2xkIG9udG8gYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgYmVhbnR5cGUgZmFjdG9yeSwKLQkgKiBhbmQgbm90aGluZyB3aWxsIGJlIGhvbGRpbmcgb250byB0aGlzIGZhY3RvcnksIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZS4gSXQgd2lsbCBiZSBHQydkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1TdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL2F3dC9SRU1TdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjZlNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9hd3QvUkVNU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUkVNU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5hd3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS4qOwotCi0vKioKLSAqIEJlYW5UeXBlIGZhY3Rvcnkgc3RhbmRhcmQgQVdUIGJlYW4gdHlwZXMuIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBpdCBzaG91bGRuJ3QgYmUgcmVmZXJlbmNlZCBvdXRzaWRlIHRoZSBwYWNrYWdlLiBJdCBzaG91bGQgb25seSBiZQotICogYWNjZXNzZWQgdGhyb3VnaCB0aGUgaW50ZXJmYWNlLgotICovCi1jbGFzcyBSRU1TdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9UWVBFX0ZBQ1RPUllfS0VZID0gImphdmEuYXd0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5UmVnaXN0cnk7Ci0KLQlSRU1TdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5KFJFTVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlmRmFjdG9yeVJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCQlmRmFjdG9yeVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkoQkVBTl9UWVBFX0ZBQ1RPUllfS0VZLCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJFTUJlYW5UeXBlUHJveHkgZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5JUkVNQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5KQotCSAqLwotCXB1YmxpYyBJUkVNQmVhblR5cGVQcm94eSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyBjbGFzc05hbWUsIEludGVnZXIgY2xhc3NJRCwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKSB7Ci0KLQkJaWYgKCJqYXZhLmF3dC5EaW1lbnNpb24iLmVxdWFscyhjbGFzc05hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFJFTURpbWVuc2lvbkJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgY2xhc3NJRCwgY2xhc3NOYW1lLCBzdXBlclR5cGUpOwotCQllbHNlIGlmICgiamF2YS5hd3QuUG9pbnQiLmVxdWFscyhjbGFzc05hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFJFTVBvaW50QmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBjbGFzc0lELCBjbGFzc05hbWUsIHN1cGVyVHlwZSk7Ci0JCWVsc2UgaWYgKCJqYXZhLmF3dC5SZWN0YW5nbGUiLmVxdWFscyhjbGFzc05hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFJFTVJlY3RhbmdsZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgY2xhc3NJRCwgY2xhc3NOYW1lLCBzdXBlclR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5yZW1vdGUuSVJFTUJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBJUHJveHlCZWFuVHlwZSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5RmFjdG9yeSN0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5UmVtb3RlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9yZW1vdGUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YjUzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eVJlbW90ZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvcmVtb3RlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlSZW1vdGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3JlbW90ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuMTUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJAotIwotCi0KLQotIyBFeGNlcHRpb24gbWVzc2FnZSAtIHswfSBpcyB0aGUgbmFtZSBvZiBhIHByb2plY3Qgd2l0aGluIEVjbGlwc2UuCi1OT19PVVRQVVRfRk9MREVSX0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA3MUUgTm8gb3V0cHV0IGZvbGRlciBmb3IgcHJvamVjdCAiezB9LiIKLQotIyBUaGVzZSBhcmUgbGluZXMgdGhhdCBhcmUgcGxhY2VkIGludG8gYSBsb2cgZmlsZSBsaXN0aW5nIHRoZSBvdXRwdXRzIGZyb20gdGhlIHR3byBkaWZmZXJlbnQgc3RyZWFtcy4KLVZNX1RFUk1JTkFURURfSU5GT18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDcySSBSZW1vdGUgVk0gdGVybWluYXRlZCBiZWZvcmUgYW55IGNvbW1hbmRzIGNhbiBiZSBzZW50LiBGb2xsb3dpbmcgYXJlIHRoZSBlcnJvciBhbmQgb3V0cHV0IHN0cmVhbXMuCi1WTV9URVJNSU5BVEVEX0xJTkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtLSBFcnJvciBTdHJlYW0gLS0KLVZNX1RFUk1JTkFURURfTElORTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0tIE91dHB1dCBTdHJlYW0gLS0KLVZNX1RFUk1JTkFURURfTElORTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0tIEVuZCBvZiBTdHJlYW0gT3V0cHV0IC0tCi0KLSMgVGhlc2UgYXJlIHRoZSBoZWFkZXJzIGZvciB0d28gcGFydHMgb2YgYSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uIFRoZSBmaXJzdCBvbmUgaXMgdGhlIHRyYWNlIGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0uCi0jIFRoZSBzZWNvbmQgaXMgdGhlIHRyYWNlIGZyb20gdGhlIGxvY2FsIHN5c3RlbS4KLVJFTU9URV9WTV9UUkFDRV9JTkZPXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMDczSSAqKiogUmVtb3RlVk0gRXhjZXB0aW9uIC0gVHJhY2UgZnJvbSBSZW1vdGUgVk06Ci1SRU1PVEVfVk1fTE9DQUxfVFJBQ0VfSU5GT18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA3NEkgKioqIExvY2FsIFN0YWNrVHJhY2U6Ci0KLSMgSW4gdGhlIHR3byBiZWxvdywgezB9IGlzIGEgc3RyaW5nIHRoYXQgaXMgYSBqYXZhIGNyZWF0aW9uIHN0cmluZywgZS5nLiAibmV3IEludGVnZXIoMykiLCBzbyB0aGV5IGRvbid0IHBhcnRpY2lwYXRlIGluIHRyYW5zbGF0aW9uLgotIyBJbiBDbGFzc2Nhc3QsIHsxfSBpcyBhIGphdmEgdHlwZSBuYW1lLCBlLmcuIGphdmEubGFuZy5JbnRlZ2VyLgotQ2xhc3NjYXN0X0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxMjRFICJ7MH0iIGRvZXMgbm90IGV2YWx1YXRlIHRvIGFuIG9iamVjdCBvZiB0eXBlIHsxfQotSW5zdGFudGlhdGVfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVdBVjAxMjVFICJ7MH0iIGlzIHRvbyBjb21wbGljYXRlZCB0byBiZSBldmFsdWF0ZWQKLQotIyB7MH0gaXMgYSBudW1iZXIsIGUuZy4gMSwgMiwgLi4uCi1SZW1vdGVDbWRfRVhDXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDEyNkUgUmVtb3RlIGNvbW1hbmQgZXJyb3IgezB9Ci0KLSMgVGhlIGZvbGxvd2luZyBpcyBhbiBleGNlcHRpb24gZXJyb3Igd2hlcmUgezB9IGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgZXhjZXB0aW9uIGFuZCB7MX0gaXMgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgZXhjZXB0aW9uCi0jIFRoZSBtZXNzYWdlIHsxfSBoYXMgYWxyZWFkeSBiZWVuIGxvY2FsaXplZCAoaWYgaXQgc3VwcGxpZWQgaXQgbG9jYWxpemVkKS4gSXQgY29tZXMgZnJvbSBzb21ld2hlcmUgb3V0c2lkZSBvZiBvdXIgcHJvamVjdC4KLUV4Y2VwdGlvbkVycm9yTXNnX0VYQ18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTM1RSB7MH0oezF9KQotT0tfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gT0sKLVByb3h5X05vUnVubmVyX0VSUk9SXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTM3RSBDb3VsZCBub3QgZmluZCBhIFJ1biB0eXBlIHJ1bm5lciB0byBsYXVuY2ggZm9yIFwiezB9XCIuCi1Qcm94eV9FcnJvcl9UaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFcnJvcjoKLVByb3h5X1Rlcm1pbmF0ZWRfdG9vX3Nvb25fRVJST1JfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTM4RSBSZW1vdGUgVk0gdGVybWluYXRlZCB0b28gc29vbi4gU2VlIC5sb2cgZmlsZSBmb3IgdHJhY2Ugb2Ygb3V0cHV0LiBGb3IgVk0gXCJ7MH1cIi4KLSMgVGhpcyBpcyBhIGxhdW5jaCBuYW1lIGZvciBhIGdpdmVuIHByb2plY3QgbmFtZSAoezB9KS4KLSMgV0FSTklORyBmb3IgdGhlIFByb3h5UmVtb3RlVk1OYW1lIGFuZCBQcm94eVJlbW90ZVZNTmFtZVdpdGhDb21tZW50IGRvIG5vdCB1c2UgZG91YmxlLXF1b3RlICgiKS4gSXQgd2lsbCBjYXVzZSBwcm9ibGVtcy4KLVByb3h5UmVtb3RlVk1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFByb2plY3QgKHswfSkKLSMgVGhpcyBpcyBhIGxhdW5jaCBuYW1lIHRoYXQgaGFzIGEgY29tbWVudCAoezB9IGlzIHByb2plY3QgbmFtZSwgezF9IGlzIHRoZSBjb21tZW50IGZvciB0aGlzIHByb2plY3QgbGF1bmNoKQotUHJveHlSZW1vdGVWTU5hbWVXaXRoQ29tbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUHJvamVjdCAoezB9KS17MX0KLQotUHJveHlSZW1vdGVOb0xhdW5jaEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ2Fubm90IGxhdW5jaCBsb2NhbCBwcm94eSByZWdpc3RyeS4gTm90IGxhdW5jaGVkIGZyb20gdmFsaWQgbGF1bmNoZXIuCi0KLSMgezB9IGlzIHRoZSBhcHByb3ByaWF0ZSBWTU5hbWUgZnJvbSB0aGUgYWJvdmUgdHdvIGVudHJpZXMuCi1Qcm94eVJlbW90ZUxhdW5jaFZNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMYXVuY2hpbmcgcmVtb3RlIHZtICJ7MH0iCi0KLUNsZWFudXBKb2JfdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFJlbW90ZSBWTSBDbGVhbnVwIEdDJ2QgUHJveGllcyBKb2IKLQotUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ2FsbGJhY2tDb25uZWN0aW9uTm90V29ya2luZ19FWENfICAgICAgICAgICAgID0gSVdBVjAxNjlFIENhbGxiYWNrIGNvbm5lY3Rpb24gaXMgbm90IHdvcmtpbmcuCi1SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Db25uZWN0aW9uQ3JlYXRpb25GYWlsZWRfSU5GT18gICAgICAgICAgICAgICAgPSBJV0FWMDE3MEkgQ29ubmVjdGlvbiBjcmVhdGlvbiBmYWlsZWQuCi1SRU1Qcm94eUZhY3RvcnlSZWdpc3RyeV9Kb2JfVGVybWluYXRlUHJvY2Vzc19UaXRsZT1UZXJtaW5hdGUgdGhlIHJlbW90ZSB2bSBwcm9jZXNzLgotUkVNUHJveHlGYWN0b3J5UmVnaXN0cnlfQ291bGROb3RDcmVhdGVTb2NrZXRDb25uZWN0aW9uVG9SZW1vdGVWTV9FWENfID0gSVdBVjAxNzFFIENvdWxkIG5vdCBjcmVhdGUgYSBzb2NrZXQgY29ubmVjdGlvbiB0byByZW1vdGUgdm0uCi1SRU1FeHByZXNzaW9uX0lPRXhjZXB0aW9uU2VlTG9nX0lORk9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDE3MkkgSS9PIEV4Y2VwdGlvbiBvY2N1cnJlZC4gU2VlIC5sb2cgZmlsZSBmb3IgZGV0YWlscy4KLVJFTUV4cHJlc3Npb25fQ29tbWFuZEV4Y2VwdGlvblNlZUxvZ19JTkZPXyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElXQVYwMTczSSBDb21tYW5kIEV4Y2VwdGlvbiBvY2N1cnJlZC4gU2VlIC5sb2cgZmlsZSBmb3IgZGV0YWlscy4KLUxvY2FsUHJveHlMYXVuY2hEZWxlZ2F0ZV9Nb25pdG9yX1ByaW50UmVtb3RlVHJhY2VfVGV4dD1QcmludCByZW1vdGUgdm0gdHJhY2Ugb3V0cHV0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwOTg5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFjY2Vzc2libGVPYmplY3RQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSURFQWNjZXNzaWJsZU9iamVjdFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0gCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkgZXh0ZW5kcyBJREVCZWFuUHJveHkgaW1wbGVtZW50cyBJQWNjZXNzaWJsZU9iamVjdFByb3h5IHsKLQotCXByb3RlY3RlZCBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSB7Ci0JCXN1cGVyKGFQcm94eUZhY3RvcnlSZWdpc3RyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIElERUFjY2Vzc2libGVPYmplY3RQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUHJveHlGYWN0b3J5UmVnaXN0cnksIE9iamVjdCBhbk9iamVjdCkgewotCQlzdXBlcihhUHJveHlGYWN0b3J5UmVnaXN0cnksIGFuT2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQWNjZXNzaWJsZU9iamVjdFByb3h5I2lzQWNjZXNzaWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NpYmxlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJcmV0dXJuICgoQWNjZXNzaWJsZU9iamVjdCkgZ2V0QmVhbigpKS5pc0FjY2Vzc2libGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQWNjZXNzaWJsZU9iamVjdFByb3h5I3NldEFjY2Vzc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NpYmxlKGJvb2xlYW4gZmxhZykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJKChBY2Nlc3NpYmxlT2JqZWN0KSBnZXRCZWFuKCkpLnNldEFjY2Vzc2libGUoZmxhZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eSNnZXRUeXBlUHJveHkoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRUeXBlUHJveHkoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5hY2Nlc3NpYmxlVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQXJyYXlCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQXJyYXlCZWFuUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4ZDU2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFycmF5QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQXJyYXlCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBJREUgVk0gdmVyc2lvbiBvZiB0aGUgQXJyYXkgcHJveHkKLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSURFQXJyYXlCZWFuUHJveHkgZXh0ZW5kcyBJREVPYmplY3RCZWFuUHJveHkgaW1wbGVtZW50cyBJQXJyYXlCZWFuUHJveHkgewotCi0JcHJpdmF0ZSBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZCZWFuVHlwZVByb3h5RmFjdG9yeTsKLQkKLUlERUFycmF5QmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFycmF5LElCZWFuVHlwZVByb3h5IGFUeXBlKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhcnJheSAsYVR5cGUpOwotCWZCZWFuVHlwZVByb3h5RmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KWFSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotfQotLyoqCi0gKiBHZXQgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBnZXQoaW50IGluZGV4KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCS8vIElmIHRoZSBjb21wb25lbnQgdHlwZSBpcyBwcmltaXRpdmUsIHdlIG5lZWQgdG8gdXNlIHRoZSBjb3JyZWN0IGdldHRlciBzbyB0aGF0IGEgdmFsaWQgdmFsdWUgaXMgcmV0dXJuZWQsCi0JLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JSUJlYW5UeXBlUHJveHkgY29tcFR5cGUgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JaWYgKCFjb21wVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCS8vIFVzZSBzdGFuZGFyZCBnZXR0ZXIuCi0JCU9iamVjdCByZXN1bHQgPSBBcnJheS5nZXQoZkJlYW4saW5kZXgpOwotCQlpZiAoIHJlc3VsdCA9PSBudWxsICkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElERUJlYW5UeXBlUHJveHkpZkJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkocmVzdWx0LmdldENsYXNzKCkpKS5uZXdCZWFuUHJveHkocmVzdWx0KTsKLQl9IGVsc2UgewotCQkvLyBVc2UgdGhlIGNvcnJlY3QgcHJpbWl0aXZlIGdldHRlci4KLQkJaW50IGlkID0gKChJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5KWNvbXBUeXBlKS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5CWVRFOgotCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYnl0ZVR5cGUuY3JlYXRlQnl0ZUJlYW5Qcm94eShBcnJheS5nZXRCeXRlKGZCZWFuLGluZGV4KSk7Ci0JCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQk9PTEVBTjoKLQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJvb2xlYW5UeXBlLmNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoQXJyYXkuZ2V0Qm9vbGVhbihmQmVhbixpbmRleCkpOwotCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkNIQVI6Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5jaGFyVHlwZS5jcmVhdGVDaGFyQmVhblByb3h5KEFycmF5LmdldENoYXIoZkJlYW4saW5kZXgpKTsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5ET1VCTEU6Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5kb3VibGVUeXBlLmNyZWF0ZURvdWJsZUJlYW5Qcm94eShBcnJheS5nZXREb3VibGUoZkJlYW4saW5kZXgpKTsKLQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5GTE9BVDoKLQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmZsb2F0VHlwZS5jcmVhdGVGbG9hdEJlYW5Qcm94eShBcnJheS5nZXRGbG9hdChmQmVhbixpbmRleCkpOwotCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LklOVEVHRVI6Ci0JCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5pbnRUeXBlLmNyZWF0ZUludGVnZXJCZWFuUHJveHkoQXJyYXkuZ2V0SW50KGZCZWFuLGluZGV4KSk7Ci0JCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuTE9ORzoKLQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmxvbmdUeXBlLmNyZWF0ZUxvbmdCZWFuUHJveHkoQXJyYXkuZ2V0TG9uZyhmQmVhbixpbmRleCkpOwotCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LlNIT1JUOgotCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3Rvcnkuc2hvcnRUeXBlLmNyZWF0ZVNob3J0QmVhblByb3h5KEFycmF5LmdldFNob3J0KGZCZWFuLGluZGV4KSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsgLy8gU2hvdWxkbid0IGdldCBoZXJlLCBzYWlkIGl0IHdhcyBwcmltaXRpdmUsIGJ1dCBub3Qgb25lIHdlIHVuZGVyc3RhbmQJCQkJCi0JCX0KLQl9CQkKLX0KLS8qKgotICogR2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBtdWx0aS1kaW1lbnNpb25hbCBpbmRleC4KLSAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBzcGVjaWZpZWQsCi0gKiBhbmQgZWFjaCBpbmRleCBhbG9uZyB0aGUgd2F5IG11c3QgZXhpc3QuCi0gKiBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKLSAqIG9mIGRpbWVuc2lvbnMgb2YgdGhlIHJlYWwgb2JqZWN0LgotICovCi1wdWJsaWMgSUJlYW5Qcm94eSBnZXQoaW50W10gaW5kZXhlcykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQlpZiAoaW5kZXhlcy5sZW5ndGggPT0gMSkKLQkJcmV0dXJuIGdldChpbmRleGVzWzBdKTsKLQlpbnQgZGltcyA9ICgoSUFycmF5QmVhblR5cGVQcm94eSkgZ2V0VHlwZVByb3h5KCkpLmdldERpbWVuc2lvbnMoKTsKLQlpZiAoZGltcyA8IGluZGV4ZXMubGVuZ3RoKQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IC8vIFRvbyBtYW55IGRpbWVuc2lvbnMKLQkvLyBHZXQgdXAgdG8gdGhlIG5leHQgdG8gbGFzdCBkaW1lbnNpb24gc28gdGhhdCB3ZSBjYW4gZG8gdGhlIGFwcHJvcHJpYXRlIGZpbmFsIGdldCBkZXBlbmRpbmcgdXBvbiBwcmltaXRpdmUgb3Igbm90LgotCU9iamVjdCBhcnJheSA9IGZCZWFuOwotCWludCBsYXN0QXJyYXlEaW0gPSBpbmRleGVzLmxlbmd0aCAtIDE7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYXN0QXJyYXlEaW07IGkrKykKLQkJYXJyYXkgPSBBcnJheS5nZXQoYXJyYXksIGluZGV4ZXNbaV0pOwotCi0JaW50IGluZGV4ID0gaW5kZXhlc1tsYXN0QXJyYXlEaW1dOwkvLyBGaW5hbCBhcnJheSBkaW0gdG8gcmV0cmlldmUKLQkKLQlpZiAoZGltcyA9PSBpbmRleGVzLmxlbmd0aCkgewotCQlJQmVhblR5cGVQcm94eSBmaW5hbENvbXBUeXBlID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBnZXRUeXBlUHJveHkoKSkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCWlmIChmaW5hbENvbXBUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCS8vIElmIHRoZSBjb21wb25lbnQgdHlwZSBhdCB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbiBpcyBwcmltaXRpdmUsIHdlIG5lZWQgdG8gdXNlIHRoZSBjb3JyZWN0IGdldHRlciBzbyB0aGF0IGEgdmFsaWQgdmFsdWUgaXMgcmV0dXJuZWQsCi0JCQkvLyBpZiB3ZSBqdXN0IHVzZWQgdGhlIHN0YW5kYXJkIGdldCwgaWYgdGhlIHR5cGUgd2FzICJpbnQiIHRoZSB2YWx1ZSByZXR1cm5lZCB3b3VsZCBiZSBhbiBqYXZhLmxhbmcuSW50ZWdlci4KLQkJCWludCBpZCA9ICgoSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSkgZmluYWxDb21wVHlwZSkuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQkJc3dpdGNoIChpZCkgewotCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5CWVRFIDoKLQkJCQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ieXRlVHlwZS5jcmVhdGVCeXRlQmVhblByb3h5KEFycmF5LmdldEJ5dGUoYXJyYXksIGluZGV4KSk7Ci0JCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkJPT0xFQU4gOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJvb2xlYW5UeXBlLmNyZWF0ZUJvb2xlYW5CZWFuUHJveHkoQXJyYXkuZ2V0Qm9vbGVhbihhcnJheSwgaW5kZXgpKTsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQ0hBUiA6Ci0JCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuY2hhclR5cGUuY3JlYXRlQ2hhckJlYW5Qcm94eShBcnJheS5nZXRDaGFyKGFycmF5LCBpbmRleCkpOwotCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5ET1VCTEUgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmRvdWJsZVR5cGUuY3JlYXRlRG91YmxlQmVhblByb3h5KEFycmF5LmdldERvdWJsZShhcnJheSwgaW5kZXgpKTsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRkxPQVQgOgotCQkJCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmZsb2F0VHlwZS5jcmVhdGVGbG9hdEJlYW5Qcm94eShBcnJheS5nZXRGbG9hdChhcnJheSwgaW5kZXgpKTsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuSU5URUdFUiA6Ci0JCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50VHlwZS5jcmVhdGVJbnRlZ2VyQmVhblByb3h5KEFycmF5LmdldEludChhcnJheSwgaW5kZXgpKTsKLQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuTE9ORyA6Ci0JCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkubG9uZ1R5cGUuY3JlYXRlTG9uZ0JlYW5Qcm94eShBcnJheS5nZXRMb25nKGFycmF5LCBpbmRleCkpOwotCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5TSE9SVCA6Ci0JCQkJCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3Rvcnkuc2hvcnRUeXBlLmNyZWF0ZVNob3J0QmVhblByb3h5KEFycmF5LmdldFNob3J0KGFycmF5LCBpbmRleCkpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gbnVsbDsgLy8gU2hvdWxkbid0IGdldCBoZXJlLCBzYWlkIGl0IHdhcyBwcmltaXRpdmUsIGJ1dCBub3Qgb25lIHdlIHVuZGVyc3RhbmQKLQkJCX0KLQkJfQotCX0KLQotCS8vIFdvbid0IGJlIHJldHVybmluZyBhIHByaW1pdGl2ZSwgc28gdXNlIHN0YW5kYXJkIGFjY2Vzc29yCi0JT2JqZWN0IHJlc3VsdCA9IEFycmF5LmdldChhcnJheSwgaW5kZXgpOwotCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuICgoSURFQmVhblR5cGVQcm94eSkgZkJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkocmVzdWx0LmdldENsYXNzKCkpKS5uZXdCZWFuUHJveHkoCi0JCXJlc3VsdCk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAqLwotcHVibGljIHZvaWQgc2V0KElCZWFuUHJveHkgdmFsdWVQcm94eSwgaW50IGluZGV4KSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCS8vIElmIHRoZSBjb21wb25lbnQgdHlwZSBpcyBwcmltaXRpdmUsIHdlIG5lZWQgdG8gdXNlIHRoZSBjb3JyZWN0IGdldHRlciBzbyB0aGF0IGEgdmFsaWQgdmFsdWUgaXMgcmV0dXJuZWQsCi0JLy8gaWYgd2UganVzdCB1c2VkIHRoZSBzdGFuZGFyZCBnZXQsIGlmIHRoZSB0eXBlIHdhcyAiaW50IiB0aGUgdmFsdWUgcmV0dXJuZWQgd291bGQgYmUgYW4gamF2YS5sYW5nLkludGVnZXIuCi0JT2JqZWN0IHZhbHVlID0gKChJSURFQmVhblByb3h5KXZhbHVlUHJveHkpLmdldEJlYW4oKTsKLQlDbGFzcyB2YWx1ZUNsYXNzID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLQlpZiAoIXZhbHVlQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkvLyBVc2Ugc3RhbmRhcmQgZ2V0dGVyLgotCQlBcnJheS5zZXQoZkJlYW4saW5kZXgsdmFsdWUpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBCeXRlLlRZUEUgKSB7Ci0JCUFycmF5LnNldEJ5dGUoZkJlYW4saW5kZXgsKChCeXRlKXZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IEJvb2xlYW4uVFlQRSApewotCQlBcnJheS5zZXRCb29sZWFuKGZCZWFuLGluZGV4LCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwkJCQotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBDaGFyYWN0ZXIuVFlQRSkgewotCQlBcnJheS5zZXRDaGFyKGZCZWFuLGluZGV4LCgoQ2hhcmFjdGVyKXZhbHVlKS5jaGFyVmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IERvdWJsZS5UWVBFKSB7Ci0JCUFycmF5LnNldERvdWJsZShmQmVhbixpbmRleCwoKERvdWJsZSl2YWx1ZSkuZG91YmxlVmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IEZsb2F0LlRZUEUpIHsKLQkJQXJyYXkuc2V0RmxvYXQoZkJlYW4saW5kZXgsKChGbG9hdCl2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsJCQotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBJbnRlZ2VyLlRZUEUpIHsKLQkJQXJyYXkuc2V0SW50KGZCZWFuLGluZGV4LCgoSW50ZWdlcil2YWx1ZSkuaW50VmFsdWUoKSk7CQkKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gTG9uZy5UWVBFICkgewotCQlBcnJheS5zZXRMb25nKGZCZWFuLGluZGV4LCgoTG9uZyl2YWx1ZSkubG9uZ1ZhbHVlKCkpOwkJCi0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IFNob3J0LlRZUEUgKSB7Ci0JCUFycmF5LnNldFNob3J0KGZCZWFuLGluZGV4LCgoU2hvcnQpdmFsdWUpLnNob3J0VmFsdWUoKSk7CQkKLQl9Ci19Ci0vKioKLSAqIFNldCB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgbXVsdGktZGltZW5zaW9uYWwgaW5kZXguCi0gKiBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgc3BlY2lmaWVkLAotICogYW5kIGVhY2ggaW5kZXggYWxvbmcgdGhlIHdheSBtdXN0IGV4aXN0LgotICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCi0gKiBvZiBkaW1lbnNpb25zIG9mIHRoZSByZWFsIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgc2V0KElCZWFuUHJveHkgdmFsdWVQcm94eSwgaW50W10gaW5kZXhlcykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQotCU9iamVjdCBzdWJBcnJheSA9IGZCZWFuOwotCWludCB1cFRvID0gaW5kZXhlcy5sZW5ndGggLSAxOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdXBUbzsgaSsrKQotCQlzdWJBcnJheSA9IEFycmF5LmdldChzdWJBcnJheSwgaW5kZXhlc1tpXSk7Ci0JaW50IGluZGV4ID0gaW5kZXhlc1t1cFRvXTsKLQotCS8vIE5vdyBzZXQgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluCi0JLy8gSWYgdGhlIGNvbXBvbmVudCB0eXBlIGlzIHByaW1pdGl2ZSwgd2UgbmVlZCB0byB1c2UgdGhlIGNvcnJlY3QgZ2V0dGVyIHNvIHRoYXQgYSB2YWxpZCB2YWx1ZSBpcyByZXR1cm5lZCwKLQkvLyBpZiB3ZSBqdXN0IHVzZWQgdGhlIHN0YW5kYXJkIGdldCwgaWYgdGhlIHR5cGUgd2FzICJpbnQiIHRoZSB2YWx1ZSByZXR1cm5lZCB3b3VsZCBiZSBhbiBqYXZhLmxhbmcuSW50ZWdlci4KLQlPYmplY3QgdmFsdWUgPSAoKElJREVCZWFuUHJveHkpIHZhbHVlUHJveHkpLmdldEJlYW4oKTsKLQlDbGFzcyB2YWx1ZUNsYXNzID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLQlpZiAoIXZhbHVlQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkvLyBVc2Ugc3RhbmRhcmQgZ2V0dGVyLgotCQlBcnJheS5zZXQoc3ViQXJyYXksIGluZGV4LCB2YWx1ZSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IEJ5dGUuVFlQRSkgewotCQlBcnJheS5zZXRCeXRlKHN1YkFycmF5LCBpbmRleCwgKChCeXRlKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBCb29sZWFuLlRZUEUpIHsKLQkJQXJyYXkuc2V0Qm9vbGVhbihzdWJBcnJheSwgaW5kZXgsICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gQ2hhcmFjdGVyLlRZUEUpIHsKLQkJQXJyYXkuc2V0Q2hhcihzdWJBcnJheSwgaW5kZXgsICgoQ2hhcmFjdGVyKSB2YWx1ZSkuY2hhclZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBEb3VibGUuVFlQRSkgewotCQlBcnJheS5zZXREb3VibGUoc3ViQXJyYXksIGluZGV4LCAoKERvdWJsZSkgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCX0gZWxzZSBpZiAodmFsdWVDbGFzcyA9PSBGbG9hdC5UWVBFKSB7Ci0JCUFycmF5LnNldEZsb2F0KHN1YkFycmF5LCBpbmRleCwgKChGbG9hdCkgdmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IEludGVnZXIuVFlQRSkgewotCQlBcnJheS5zZXRJbnQoc3ViQXJyYXksIGluZGV4LCAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQl9IGVsc2UgaWYgKHZhbHVlQ2xhc3MgPT0gTG9uZy5UWVBFKSB7Ci0JCUFycmF5LnNldExvbmcoc3ViQXJyYXksIGluZGV4LCAoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JfSBlbHNlIGlmICh2YWx1ZUNsYXNzID09IFNob3J0LlRZUEUpIHsKLQkJQXJyYXkuc2V0U2hvcnQoc3ViQXJyYXksIGluZGV4LCAoKFNob3J0KSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsKLQl9Ci0KLX0KLS8qKgotICogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGlzIGFycmF5LgotICogSWYgdGhlcmUgYXJlIG11bHRpLWRpbWVuc2lvbnMsIHlvdSBtdXN0IGdldCB0aGUgYXBwcm9wcmlhdGUKLSAqIGRpbWVuc2lvbiBmcm9tIHRoZSBnZXQgbWV0aG9kIHRvIHNlZSB0aGUgc2l6ZSBvZiB0aGF0IGRpbWVuc2lvbi4KLSAqCi0gKiBlLmcuCi0gKiAgICBpbnQgWzNdIHJldHVybnMgMwotICogICAgaW50IFszXVsyXSByZXR1cm5zIDMKLSAqCi0gKiAgICAoKElBcnJheUJlYW5Qcm94eSkgZ2V0KDEpKS5nZXRMZW5ndGgoKSByZXR1cm5zIDIKLSAqICAgIFNpbmNlIGFycmF5cyBkbyBub3QgaGF2ZSB0byBiZSBob21vZ2Vub3VzLCB0aGVyZSBjb3VsZAotICogICAgYmUgYSBkaWZmZXJlbnQgbGVuZ3RoIGFycmF5IGZvciBlYWNoIG9mIHRoZSBhcnJheXMgCi0gKiAgICByZXR1cm5lZCBmcm9tIHRoZSBmaXJzdCBkaW1lbnNpb24sIHRoZSByZXR1cm5lZCBsZW5ndGgKLSAqICAgIGZyb20gZ2V0KDIpIGFuZCBnZXQoMykgY291bGQgcmVzdWx0IGluIGEgZGlmZmVyZW50IHZhbHVlCi0gKiAgICBmcm9tIGdldCgxKS4KLSAqLwotcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JcmV0dXJuIEFycmF5LmdldExlbmd0aChmQmVhbik7Ci19CQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUFycmF5QmVhblByb3h5I2dldENhdGNoVGhyb3dhYmxlRXhjZXB0aW9uKGludCkKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBnZXRDYXRjaFRocm93YWJsZUV4Y2VwdGlvbihpbnQgaW5kZXgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXQoaW5kZXgpOwotCQl9IGNhdGNoICggVGhyb3dhYmxlUHJveHkgZXhjICkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOwkJCSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCQotCXB1YmxpYyBJQmVhblByb3h5W10gZ2V0U25hcHNob3QoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBJZiB0aGUgY29tcG9uZW50IHR5cGUgaXMgcHJpbWl0aXZlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCBnZXR0ZXIgc28gdGhhdCBhIHZhbGlkIHZhbHVlIGlzIHJldHVybmVkLAotCQkvLyBpZiB3ZSBqdXN0IHVzZWQgdGhlIHN0YW5kYXJkIGdldCwgaWYgdGhlIHR5cGUgd2FzICJpbnQiIHRoZSB2YWx1ZSByZXR1cm5lZCB3b3VsZCBiZSBhbiBqYXZhLmxhbmcuSW50ZWdlci4KLQkJSUJlYW5UeXBlUHJveHkgY29tcFR5cGUgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGdldFR5cGVQcm94eSgpKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWludCBpZCA9IGNvbXBUeXBlLmlzUHJpbWl0aXZlKCkgPyAoKElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkpY29tcFR5cGUpLmdldFByaW1pdGl2ZVR5cGUoKSA6IC0xOwotCQlJQmVhblByb3h5W10gcmVzdWx0ID0gbmV3IElCZWFuUHJveHlbQXJyYXkuZ2V0TGVuZ3RoKGZCZWFuKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaWQgPT0gLTEpIHsKLQkJCQkvLyBVc2Ugc3RhbmRhcmQgZ2V0dGVyLgotCQkJCU9iamVjdCB2YWwgPSBBcnJheS5nZXQoZkJlYW4saSk7Ci0JCQkJaWYgKCB2YWwgIT0gbnVsbCApCi0JCQkJCXJlc3VsdFtpXSA9ICgoSURFQmVhblR5cGVQcm94eSlmQmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSh2YWwuZ2V0Q2xhc3MoKSkpLm5ld0JlYW5Qcm94eSh2YWwpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBVc2UgdGhlIGNvcnJlY3QgcHJpbWl0aXZlIGdldHRlci4KLQkJCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5CWVRFOgotCQkJCQkJcmVzdWx0W2ldID0gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJ5dGVUeXBlLmNyZWF0ZUJ5dGVCZWFuUHJveHkoQXJyYXkuZ2V0Qnl0ZShmQmVhbixpKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5LkJPT0xFQU46Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkuYm9vbGVhblR5cGUuY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShBcnJheS5nZXRCb29sZWFuKGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuQ0hBUjoKLQkJCQkJCXJlc3VsdFtpXSA9IGZCZWFuVHlwZVByb3h5RmFjdG9yeS5jaGFyVHlwZS5jcmVhdGVDaGFyQmVhblByb3h5KEFycmF5LmdldENoYXIoZkJlYW4saSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5ET1VCTEU6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkuZG91YmxlVHlwZS5jcmVhdGVEb3VibGVCZWFuUHJveHkoQXJyYXkuZ2V0RG91YmxlKGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuRkxPQVQ6Ci0JCQkJCQlyZXN1bHRbaV0gPSBmQmVhblR5cGVQcm94eUZhY3RvcnkuZmxvYXRUeXBlLmNyZWF0ZUZsb2F0QmVhblByb3h5KEFycmF5LmdldEZsb2F0KGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuSU5URUdFUjoKLQkJCQkJCXJlc3VsdFtpXSA9IGZCZWFuVHlwZVByb3h5RmFjdG9yeS5pbnRUeXBlLmNyZWF0ZUludGVnZXJCZWFuUHJveHkoQXJyYXkuZ2V0SW50KGZCZWFuLGkpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuTE9ORzoKLQkJCQkJCXJlc3VsdFtpXSA9IGZCZWFuVHlwZVByb3h5RmFjdG9yeS5sb25nVHlwZS5jcmVhdGVMb25nQmVhblByb3h5KEFycmF5LmdldExvbmcoZkJlYW4saSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5TSE9SVDoKLQkJCQkJCXJlc3VsdFtpXSA9IGZCZWFuVHlwZVByb3h5RmFjdG9yeS5zaG9ydFR5cGUuY3JlYXRlU2hvcnRCZWFuUHJveHkoQXJyYXkuZ2V0U2hvcnQoZkJlYW4saSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJYnJlYWs7IC8vIFNob3VsZG4ndCBnZXQgaGVyZSwgc2FpZCBpdCB3YXMgcHJpbWl0aXZlLCBidXQgbm90IG9uZSB3ZSB1bmRlcnN0YW5kCQkJCQotCQkJCX0KLQkJCX0JCQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFycmF5QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVBcnJheUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTgxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUFycmF5QmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotLyoKLSAqICAkUkNTZmlsZTogSURFQXJyYXlCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLS8qKgotICogQXJyYXkgVHlwZSBQcm94eSBmb3IgdGhlIElERSBWTS4KLSAqIAotICogVGhlIGNsYXNzIGlzIGZpbmFsIGJlY2F1c2UgYXJyYXkncyBhcmUgc3BlY2lhbCBhbmQgc2hvdWxkbid0IGhhdmUgYW55IHN1YmNsYXNzZXMgc2luY2UgdGhlIGZhY3Rvcnkgd291bGQgbmV2ZXIgY2FsbCBpdC4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSURFQXJyYXlCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSBpbXBsZW1lbnRzIElBcnJheUJlYW5UeXBlUHJveHkgewotCi0JSUJlYW5UeXBlUHJveHkgZkZpbmFsQ29tcG9uZW50VHlwZTsKLQotCUlCZWFuVHlwZVByb3h5IGZDb21wb25lbnRUeXBlOwotCi0JU3RyaW5nIGZUeXBlTmFtZTsKLQotCS8qKgotCSAqIENyZWF0ZSB3aXRoIGEgcmVnaXN0cnkgYW5kIGEgY2xhc3MuIEl0IGlzIHBhY2thZ2Ugc28gdGhhdCBvbmx5IHRoZSBmYWN0b3J5IHdpdGggdGhpcyBJREUgcGFja2FnZSBjYW4gY2FsbCBpdC4KLQkgKi8KLQlJREVBcnJheUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBTdHJpbmcgYVR5cGVOYW1lLCBDbGFzcyBhQ2xhc3MpIHsKLQkJLy8gVGhlIGNsYXNzIG9mIGFuIEFycmF5IGlzIGFsd2F5cyBPYmplY3QKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCQlmVHlwZU5hbWUgPSBhVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhbiBhcnJheSB0eXBlIQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBmVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0RmluYWxDb21wb25lbnRUeXBlKCkgewotCQlpZiAoZkZpbmFsQ29tcG9uZW50VHlwZSA9PSBudWxsKSB7Ci0JCQkvLyBDb21wb25lbnQgdHlwZSBpcyBzdHJpcCBvZmYgYWxsICdbJyBhbmQgcmV0dXJuIGNsYXNzIG5hbWUgKGlmIHdlIGV2ZXIgYWRkIGNsYXNzTG9hZGVyIHN1cHBvcnQsIHRoaXMgd29uJ3Qgd29yaykuCi0JCQkvLyBIb3dldmVyLCBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGNoYW5nZSB0YWJsZSkuCi0JCQlpbnQgdHlwZVN0YXJ0ID0gZ2V0VHlwZU5hbWUoKS5sYXN0SW5kZXhPZignWycpICsgMTsKLQkJCWlmIChnZXRUeXBlTmFtZSgpLmNoYXJBdCh0eXBlU3RhcnQpID09ICdMJykgewotCQkJCS8vIEl0IGlzIGEgY2xhc3MuCi0JCQkJLy8gU3RyaXAgb2ZmIHVwIHRvIHRoZSAnTCcsIGFuZCB0aGUgdHJhaWxpbmcgJzsnLiBUaGF0IGlzIHRoZSBjbGFzcyBuYW1lLgotCQkJCWZGaW5hbENvbXBvbmVudFR5cGUgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KAotCQkJCQkJZ2V0VHlwZU5hbWUoKS5zdWJzdHJpbmcodHlwZVN0YXJ0ICsgMSwgZ2V0VHlwZU5hbWUoKS5sZW5ndGgoKSAtIDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXQgaXMgYSB0eXBlLiBOZWVkIHRvIG1hcCBpdC4KLQkJCQlDbGFzcyBhVHlwZSA9IChDbGFzcykgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5NQVBfU0hPUlRTSUdfVE9fVFlQRS5nZXQoZ2V0VHlwZU5hbWUoKS5zdWJzdHJpbmcodHlwZVN0YXJ0LCB0eXBlU3RhcnQgKyAxKSk7Ci0JCQkJZkZpbmFsQ29tcG9uZW50VHlwZSA9IGFUeXBlICE9IG51bGwgPyBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGFUeXBlLmdldE5hbWUoKSkgOiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBmRmluYWxDb21wb25lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29tcG9uZW50IHR5cGUuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldENvbXBvbmVudFR5cGUoKSB7Ci0JCWlmIChmQ29tcG9uZW50VHlwZSA9PSBudWxsKSB7Ci0JCQkvLyBDb21wb25lbnQgdHlwZSBpcyBzdHJpcCBvZmYgZmlyc3QgJ1snIGFuZCByZXR1cm4gY2xhc3MgbmFtZSAoaWYgd2UgZXZlciBhZGQgY2xhc3NMb2FkZXIgc3VwcG9ydCwgdGhpcyB3b24ndCB3b3JrKS4KLQkJCS8vIEhvd2V2ZXIsIGlmIHRoZSB0eXBlIGlzIGEgcHJpbWl0aXZlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgY2hhbmdlIHRhYmxlKS4KLQkJCWlmIChnZXRUeXBlTmFtZSgpLmNoYXJBdCgxKSAhPSAnWycpIHsKLQkJCQkvLyBJdCBpcyBhIG9uZSBkaW1lbnNpb25hbCBhcnJheSwganVzdCBzZW5kIHRvIGdldEZpbmFsQ29tcG9uZW50VHlwZSB0byBmaWd1cmUgb3V0IHRoZSB0eXBlLgotCQkJCWZDb21wb25lbnRUeXBlID0gZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEl0IGlzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkuIEp1c3Qgc3RyaXAgb2ZmIG9uZSAnWycgYW5kIHNlbmQgdGhhdCB0byB0aGUgYmVhbiB0eXBlIGZhY3RvcnkuCi0JCQkJZkNvbXBvbmVudFR5cGUgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKDEpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbXBvbmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldERpbWVuc2lvbnMoKSB7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSgpLmxhc3RJbmRleE9mKCdbJykgKyAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVsbCBjdG9yIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkgRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0Q29uc3RydWN0b3JzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBwcm94eSB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIFJFTSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldEZpZWxkcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb21wYXRpYmxlQ29uc3RydWN0b3Iob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29tcGF0aWJsZUNvbnN0cnVjdG9yKElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRDb21wYXRpYmxlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKSBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIGZpZWxkIGZvciB0aGUgdGFyZ2V0IFZNIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBSRU0gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBwcm94eSBmb3IgdGhpcyBtZXRob2Qgd2l0aCB0aGVzZSBhcmd1bWVudHMuIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBhcmd1bWVudFF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXRNZXRob2RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpIEZvciBhbGwgb2YgdGhlIGFycmF5IHR5cGVzLCB0aGlzIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIHByb3h5IGZvciB0aGlzIG1ldGhvZCB3aXRoIHRoZXNlIGFyZ3VtZW50cy4gRm9yIGFsbCBvZiB0aGUgYXJyYXkgdHlwZXMsIHRoaXMgaXMgYW4gaW52YWxpZCBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QgcHJveHkgZm9yIHRoaXMgbWV0aG9kIHdpdGggdGhlc2UgYXJndW1lbnRzLiBGb3IgYWxsIG9mIHRoZSBhcnJheSB0eXBlcywgdGhpcyBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXJyYXkgYmVhbiBwcm94eS4KLQkgKiAgLSAoaW50LCBuZXcgaW50WzJdIHszLCA0fSkgd2lsbCBjcmVhdGU6IGludCBbM10gWzRdCi0JICogIC0gKGludFtdLCBuZXcgaW50WzFdIHsxfSkgaW50IFsxXQotCSAqICAtIChpbnRbXSwgbmV3IGludFsyXSB7MiwzfSkgaW50IFsyXSBbM10KLQkgKiAKLQkgKiAgLSAoaW50W10sIG51bGwpIG9yIChpbnRbXSwgbmV3IGludFswXSkgb3IgKGludCwgbnVsbCkgb3IgKGludCwgbmV3IGludFswXSkgaW50IFswXSAoaW50W11bXSwgbnVsbCkgb3IgKGludFtdW10sIG5ldyBpbnRbMF0pIGludFswXVtdIFRoaXMgaXMKLQkgKiBiZWNhdXNlIGFuIGFycmF5IGluc3RhbmNlIHdpdGggbm8gZGltZW5zaW9ucyBzcGVjaWZpZWQgaXMgbm90IHZhbGlkLgotCSAqICAtIChpbnRbXVtdLCBuZXcgaW50WzFdIHszfSkgaW50WzNdW10KLQkgKiAKLQkgKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyB0aGF0IG9ubHkgdGhlIFJFTSBGYWN0b3J5IGNhbiBjYWxsIGl0LgotCSAqLwotCUlERUFycmF5QmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoaW50W10gZGltZW5zaW9ucykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJLy8gSWYgdGhlIGRpbWVuc2lvbnMgaXMgbnVsbCBvciB6ZXJvIGxlbmd0aCwgdGhlbiBjcmVhdGUgdGhlCi0JCS8vIGFycmF5IGFzIGEgMCBzaXplZCBhcnJheSBvbmUgZGltZW5zaW9uYWwgYXJyYXkuCi0JCWlmIChkaW1lbnNpb25zID09IG51bGwgfHwgZGltZW5zaW9ucy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBjcmVhdGVCZWFuUHJveHlXaXRoKG5ldyBpbnRbXSB7IDB9KTsKLQotCQkvLyBSZW1vdmUgZnJvbSB0aGlzIHR5cGUgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHNwZWNpZmllZAotCQkvLyBjb21pbmcgaW4sIHVwIHRvIGJ1dCBubyBmdXJ0aGVyIHRoYW4gdGhlIGZpbmFsIGNvbXBvbmVudC4KLQkJLy8gRnJvbSBoZXJlIHdlIGNhbiB0aGVuIHVzZSB0aGUgYXBwcm9wcmlhdGUgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkKLQkJLy8gbWV0aG9kIHRvIGNyZWF0ZSB0aGUgYXJyYXkuCi0JCUlCZWFuVHlwZVByb3h5IGNvbXBUeXBlID0gbnVsbDsgLy8gVGhlIHR5cGUgb2YgYXJyYXkgdG8gY3JlYXRlIChpdCBtYXkgYmUgZGlmZmVyZW50IG51bWJlciBvZiBkaW1lbnNpb25zKS4KLQkJaW50IG51bURpbXMgPSBnZXREaW1lbnNpb25zKCk7Ci0JCWlmIChudW1EaW1zIDw9IGRpbWVuc2lvbnMubGVuZ3RoKQotCQkJY29tcFR5cGUgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKTsgLy8gVGhlcmUgYXJlIHRoZSBzYW1lIG9yIG1vcmUgcmVxdWVzdGVkIGRpbWVuc2lvbnMsIHNvIHVzZSBmaW5hbCBjb21wb25lbnQgdHlwZQotCQllbHNlIHsKLQkJCS8vIFRoZXJlIGFyZSBmZXdlciByZXF1ZXN0ZWQgZGltZW5zaW9ucywgc28gc3RyaXAgb2ZmIHRoYXQgbWFueQotCQkJU3RyaW5nIGNvbXBDbGFzcyA9IGdldFR5cGVOYW1lKCkuc3Vic3RyaW5nKGRpbWVuc2lvbnMubGVuZ3RoKTsKLQkJCWNvbXBUeXBlID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eShjb21wQ2xhc3MpOwotCQl9Ci0KLQkJaWYgKGRpbWVuc2lvbnMubGVuZ3RoID09IDEpIHsKLQkJCS8vIFVzZSB0aGUgb25lIGRpbWVuc2lvbiBjYWxsCi0JCQlPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZSgoKElERUJlYW5UeXBlUHJveHkpIGNvbXBUeXBlKS5mQ2xhc3MsIGRpbWVuc2lvbnNbMF0pOwotCQkJcmV0dXJuIG5ldyBJREVBcnJheUJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIGFycmF5LCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFVzZSB0aGUgbXVsdGkgZGltZW5zaW9uIGNhbGwKLQkJCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKCgoSURFQmVhblR5cGVQcm94eSkgY29tcFR5cGUpLmZDbGFzcywgZGltZW5zaW9ucyk7Ci0JCQlyZXR1cm4gbmV3IElERUFycmF5QmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYXJyYXksIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGJlYW4gcHJveHkgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpIHsKLQotCQlyZXR1cm4gbmV3IElERUFycmF5QmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYW5PYmplY3QsIHRoaXMpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBJQmVhblR5cGVQcm94eSNnZXRGb3JtYWxUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb3JtYWxUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRUeXBlTmFtZSgpOwotCQlpbnQgZGltcyA9IG5hbWUubGFzdEluZGV4T2YoJ1snKSArIDE7Ci0JCVN0cmluZyB0eXBlID0gZ2V0RmluYWxDb21wb25lbnRUeXBlKCkuZ2V0VHlwZU5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIGZvcm1hbFR5cGUgPSBuZXcgU3RyaW5nQnVmZmVyKHR5cGUubGVuZ3RoKCkgKyAoIltdIi5sZW5ndGgoKSAqIGRpbXMpKTsgLy8kTk9OLU5MUy0xJAotCQlmb3JtYWxUeXBlLmFwcGVuZCh0eXBlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1zOyBpKyspCi0JCQlmb3JtYWxUeXBlLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZm9ybWFsVHlwZS50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTNhMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSURFQmVhblByb3h5IGltcGxlbWVudHMgSUJlYW5Qcm94eSwgSUlERUJlYW5Qcm94eSB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGZCZWFuOwotCXByb3RlY3RlZCBmaW5hbCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLQlwcm90ZWN0ZWQgSURFQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFQcm94eUZhY3RvcnlSZWdpc3RyeSkgewotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkgPSBhUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0JfQotCXByb3RlY3RlZCBJREVCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBPYmplY3QgYW5PYmplY3QpIHsKLQkJZlByb3h5RmFjdG9yeVJlZ2lzdHJ5ID0gYVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCQlmQmVhbiA9IGFuT2JqZWN0OwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQkvKioKLQkgKiBVU0Ugd2l0aCBleHRyZW1lIGNhcmUKLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldEJlYW4oKSB7Ci0JCXJldHVybiBmQmVhbjsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0b1N0cmluZygpIG9mIHRoZSBiZWFuCi0JICovCi0JcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JCXJldHVybiAoZkJlYW4gIT0gbnVsbCA/IGZCZWFuLnRvU3RyaW5nKCkgOiAibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSBBcHBlbmQgdGhlIGJlYW4ncyB0byBzdHJpbmcgdG8gb3VyIG93biBuYW1lIGlmIHdlIGhhdmUgb25lCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQotCQlpZiAoZkJlYW4gPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIoIiArIGZCZWFuLnRvU3RyaW5nKCkgKyAiKSI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQl9Ci0JLyoqCi0JICogZXF1YWxzOiBJZiB0aGVyZSBhcmUgaWRlbnRpY2FsIG9yIGlmIHRoZXkgd3JhcHBlciB0aGUgc2FtZSBiZWFuLiBJbiB0aGUgSURFIFZNIHRoaXMKLQkgKiBjYW4gaGFwcGVuIGlmIGJlYW4gcHJveGllcyBhcmUgY3JlYXRlZCBmcm9tIGEgQmVhbiwgc2luY2UgcHJveGllcyBhcmVuJ3QgY2FjaGVkIGluCi0JICogdGhlIGJlYW5wcm94eSBmYWN0b3J5LCBtb3JlIHRoYW4gb25lIHByb3h5IGNhbiBiZSBjcmVhdGVkIGZvciB0aGUgc2FtZSBiZWFuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSUlERUJlYW5Qcm94eSkgewotCQkJcmV0dXJuIGZCZWFuLmVxdWFscygoKElJREVCZWFuUHJveHkpIG9iaikuZ2V0QmVhbigpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAxMjM0NSArIChnZXRCZWFuKCkgIT0gbnVsbCA/IGdldEJlYW4oKS5oYXNoQ29kZSgpIDogMCk7IAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIElJREVCZWFuUHJveHkpCi0JCQlyZXR1cm4gZ2V0QmVhbigpID09ICgoSUlERUJlYW5Qcm94eSkgYUJlYW5Qcm94eSkuZ2V0QmVhbigpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzQmVhblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0V4cHJlc3Npb25Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzBjOWI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAkUkNTZmlsZTogSURFQmVhblR5cGVQcm94eS5qYXZhLHYgJCAkUmV2aXNpb246IDEuMTQgJCAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotcHVibGljIGNsYXNzIElERUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuUHJveHkgaW1wbGVtZW50cyBJQmVhblR5cGVQcm94eSB7Ci0KLQlwcm90ZWN0ZWQgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCi0JQ2xhc3MgZkNsYXNzOwotCi0JcHJvdGVjdGVkIElERUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWZDbGFzcyA9IGFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgVHlwZSBQcm94eS4gVGhlIHR5cGUgcHJveHkgb2YgYSBCZWFuVHlwZSBpcyBDbGFzcy4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuY2xhc3NDbGFzczsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgewotCQlyZXR1cm4gZkNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gZkNsYXNzLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3MuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzS2luZE9mKElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KSB7Ci0JCXJldHVybiAoKElERUJlYW5UeXBlUHJveHkpIGFCZWFuVHlwZVByb3h5KS5mQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZkNsYXNzLmlzSW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmQ2xhc3MuaXNQcmltaXRpdmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZkNsYXNzLmlzQXJyYXkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9ycygpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RzKGZDbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHlbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXREZWNsYXJlZE1ldGhvZHMoZkNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBjYW4gdXNlIHJlZmxlY3Rpb24gb24gb3VyIGNsYXNzIHRvIGZpbmQgdGhlIGphdmEucmVmbGVjdC5NZXRob2QgaW5zdGFuY2UgYW5kIGNyZWF0ZSB0aGUgSURFTWV0aG9kUHJveHkgZGlyZWN0bHkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lKSB7Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZCBhTWV0aG9kID0gZkNsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgQ2xhc3NbMF0pOwotCQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldE1ldGhvZFByb3h5KGFNZXRob2QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkodGhpcywgbWV0aG9kTmFtZSwgYXJndW1lbnRDbGFzc05hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgZmlyc3RBcmdDbGFzcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkobWV0aG9kTmFtZSwgbmV3IFN0cmluZ1tdIHsgZmlyc3RBcmdDbGFzc30pOwotCX0KLQotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJncykgewotCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbYXJncy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWFyZ0NsYXNzZXNbaV0gPSAoKElERUJlYW5UeXBlUHJveHkpIGFyZ3NbaV0pLmZDbGFzczsKLQkJfQotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZkNsYXNzLCBtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldERlY2xhcmVkTWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RGVjbGFyZWRNZXRob2RQcm94eShmQ2xhc3MsIG1ldGhvZE5hbWUsIGFyZ3VtZW50Q2xhc3NOYW1lcyk7Ci0JfQotCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3MpIHsKLQkJQ2xhc3NbXSBhcmdDbGFzc2VzID0gbnVsbDsKLQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1thcmdzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlhcmdDbGFzc2VzW2ldID0gKChJREVCZWFuVHlwZVByb3h5KSBhcmdzW2ldKS5mQ2xhc3M7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldERlY2xhcmVkTWV0aG9kUHJveHkoZkNsYXNzLCBtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShtZXRob2ROYW1lLCBhcmd1bWVudFR5cGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50Q2xhc3NOYW1lKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShtZXRob2ROYW1lLCBhcmd1bWVudENsYXNzTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbnZva2FibGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJSW52b2thYmxlIGdldEludm9rYWJsZShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShtZXRob2ROYW1lLCBhcmd1bWVudENsYXNzTmFtZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0SW52b2thYmxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShtZXRob2ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmdUeXBlTmFtZXMpIHsKLQkJSUJlYW5UeXBlUHJveHlbXSBhcmdDbGFzc2VzID0gbmV3IElCZWFuVHlwZVByb3h5W2FyZ1R5cGVOYW1lcy5sZW5ndGhdOwotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBidEZhY3RvcnkgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdUeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFyZ0NsYXNzZXNbaV0gPSBidEZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShhcmdUeXBlTmFtZXNbaV0pOwotCQkJaWYgKGFyZ0NsYXNzZXNbaV0gPT0gbnVsbCkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIkNvbnN0cnVjdG9yIG5vdCBmb3VuZCAtICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGZDbGFzcy5nZXROYW1lKCkgKyAiIGFyZ3M9IiArIGFyZ1R5cGVOYW1lcywgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yUHJveHkoYXJnQ2xhc3Nlcyk7Ci0JfQotCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSBhcmdzKSB7Ci0JCUNsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1thcmdzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJYXJnQ2xhc3Nlc1tpXSA9ICgoSURFQmVhblR5cGVQcm94eSkgYXJnc1tpXSkuZkNsYXNzOwotCQl9Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRDb25zdHJ1Y3RvclByb3h5KGZDbGFzcywgYXJnQ2xhc3Nlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldENvbnN0cnVjdG9ycyhmQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10gYXJnVHlwZU5hbWVzKSB7Ci0JCUlCZWFuVHlwZVByb3h5W10gYXJnQ2xhc3NlcyA9IG5ldyBJQmVhblR5cGVQcm94eVthcmdUeXBlTmFtZXMubGVuZ3RoXTsKLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYnRGYWN0b3J5ID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmdDbGFzc2VzW2ldID0gYnRGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoYXJnVHlwZU5hbWVzW2ldKTsKLQkJCWlmIChhcmdDbGFzc2VzW2ldID09IG51bGwpIHsKLQkJCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJDb25zdHJ1Y3RvciBub3QgZm91bmQgLSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyBmQ2xhc3MuZ2V0TmFtZSgpICsgIiBhcmdzPSIgKyBhcmdUeXBlTmFtZXMsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkoYXJnQ2xhc3Nlcyk7Ci0JfQotCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3MpIHsKLQkJQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzW2FyZ3MubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmdDbGFzc2VzW2ldID0gKChJREVCZWFuVHlwZVByb3h5KSBhcmdzW2ldKS5mQ2xhc3M7Ci0JCX0KLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShmQ2xhc3MsIGFyZ0NsYXNzZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHlbXSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKGZDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdXBlcnR5cGUgZm9yIHVzIFVzZSB0aGUgZmFjdG9yeSB0byBnZXQgaXQgcmF0aGVyIHRoYW4gY3JlYXRlIGl0IGRpcmVjdGx5IHNvIHRoYXQgdGhlIGZhY3RvcnkgaGFzIHRoZSBjaGFuY2UgdG8gY2FjaGUgY2xhc3NlcyBpZgotCSAqIHJlcXVpcmVkIFRoaXMgaXMgcmVxdWlyZWQgYXMgcGFydCBvZiB0aGUgaW50ZXJmYWNlCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFN1cGVyQmVhblR5cGVQcm94eSgpIHsKLQotCQlpZiAoZkNsYXNzLmlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoZkNsYXNzLmdldFN1cGVyY2xhc3MoKS5nZXROYW1lKCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvcnMoKQotCSAqLwotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldEZpZWxkcygpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldEZpZWxkcyhmQ2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29uc3RydWN0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSUZpZWxkUHJveHlbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldERlY2xhcmVkRmllbGRzKGZDbGFzcyk7Ci0JfQotCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJRmllbGQgZmllbGQgPSBmQ2xhc3MuZ2V0RmllbGQoZmllbGROYW1lKTsKLQkJCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRGaWVsZFByb3h5KGZpZWxkKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIkZpZWxkIG5vdCBmb3VuZCAiICsgZkNsYXNzLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyAiIC0gIiArIGZpZWxkTmFtZSwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElGaWVsZFByb3h5IGdldERlY2xhcmVkRmllbGRQcm94eShTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWVsZCBmaWVsZCA9IGZDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7Ci0JCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0RmllbGRQcm94eShmaWVsZCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJGaWVsZCBub3QgZm91bmQgIiArIGZDbGFzcy5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgIiAtICIgKyBmaWVsZE5hbWUsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHByb3h5IHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHRhcmdldCBWTSBiZWluZyB0aGUgc2FtZSBhcyB0aGUgSURFIFdlIGNhbiB1c2UgdGhlIHBhY2thZ2UgcHJvdGVjdGVkIGNvbnRzdHJ1Y3RvciBvbgotCSAqIElERUNvbnN0cnVjdG9yUHJveHkKLQkgKi8KLQlJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KENsYXNzW10gcGFyYW1ldGVyVHlwZXMpIHsKLQotCQlDb25zdHJ1Y3RvciBhQ29uc3RydWN0b3IgPSBudWxsOwotCi0JCS8vIFVzZSByZWZsZWN0aW9uIHRvIHRyeSBhbmQgZmluZCBhIGNvbnN0cnVjdG9yLiBUaGUgYXJndW1lbnRDbGFzc05hbWVzIG11c3QgYmUgY29udmVydGVkIHRvIGNsYXNzZXMKLQkJdHJ5IHsKLQkJCWFDb25zdHJ1Y3RvciA9IGZDbGFzcy5nZXRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gSWYgd2UgaGF2ZSBhIGNvbnN0cnVjdG9yIHJldHVybiBpdAotCQlpZiAoYUNvbnN0cnVjdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXROZXdDb25zdHJ1Y3RvclByb3h5KGFDb25zdHJ1Y3Rvcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogRmFjdG9yZWQgaW50byBpdHMgb3duIG1ldGhvZCBzbyBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnN0cnVjdG9yUHJveHkgZ2V0TmV3Q29uc3RydWN0b3JQcm94eShDb25zdHJ1Y3RvciBhQ29uc3RydWN0b3IpIHsKLQotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0Q29uc3RydWN0b3JQcm94eShhQ29uc3RydWN0b3IpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcHJveHkgdG8gdGhlIG51bGwgY29uc3RydWN0b3IgZm9yIHRoZSB0YXJnZXQgVk0gYmVpbmcgdGhlIHNhbWUgYXMgdGhlIElERSBXZSBjYW4gdXNlIHRoZSBwYWNrYWdlIHByb3RlY3RlZCBjb250c3RydWN0b3Igb24KLQkgKiBJREVDb25zdHJ1Y3RvclByb3h5Ci0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCkgewotCi0JCUNvbnN0cnVjdG9yIGFDb25zdHJ1Y3RvciA9IG51bGw7Ci0KLQkJLy8gVXNlIHJlZmxlY3Rpb24gdG8gdHJ5IGFuZCBmaW5kIGEgY29uc3RydWN0b3IuIFRoZSBhcmd1bWVudENsYXNzTmFtZXMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gY2xhc3NlcwotCQl0cnkgewotCQkJYUNvbnN0cnVjdG9yID0gZkNsYXNzLmdldENvbnN0cnVjdG9yKG51bGwpOwotCQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmdldENvbnN0cnVjdG9yUHJveHkoYUNvbnN0cnVjdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcpIHsKLQkJcmV0dXJuICgoSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpKS5jcmVhdGVCZWFuUHJveHkodGhpcywgaW5pdGlhbGl6YXRpb25TdHJpbmcpOwotCX0KLQotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gKChJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkpLmNyZWF0ZUJlYW5Qcm94eSh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYmVhbiBwcm94eSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IFVzZSB0aGUgY29uc3RydWN0b3IgdGhhdCBhbGxvd3MgdGhlIHR5cGUgcHJveHkgdG8gYmUgc2V0IGFzIHdlbGwgYXMgdGhlIGJlYW4gYmVjYXVzZSB3ZSBhcmUKLQkgKiB0aGUgdHlwZSBhbmQgYnkgc2V0dGluZyBpdCBub3cgd2UgbWlnaHQgYXZvaWQgaXQgYmVpbmcgbG9va3VwIGZvciBpbiB0aGUgZmFjdG9yeSB0aGUgZmlyc3QgdGltZSBpdCBpcyBhc2tlZCBmb3IKLQkgKiAKLQkgKiBOT1RFOiBBbGwgc3ViY2xhc3NlcyBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgdG8gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBJREVCZWFuUHJveHkuCi0JICovCi0JcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCkgewotCi0JCXJldHVybiBuZXcgSURFT2JqZWN0QmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYW5PYmplY3QsIHRoaXMpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3ViY2xhc3MgYmVhbnR5cGUgcHJveHkuCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcyB0eXBlKSB7Ci0JCS8vIERlZmF1bHQgaXMganVzdCBhbm90aGVyIGluc3RhbmNlIG9mIHRoaXMgc2FtZSBjbGFzcy4KLQkJcmV0dXJuIG5ldyBJREVCZWFuVHlwZVByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgdHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQmVhblR5cGVQcm94eSNnZXRGb3JtYWxUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb3JtYWxUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRJbml0aWFsaXphdGlvbkVycm9yKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxpemF0aW9uRXJyb3IoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBCeSBkZWZhdWx0IG5vbmUgaGF2ZSBhbiBpbml0aWFsaXphdGlvbiBlcnJvci4gVGhlcmUgaXMgYSBzcGVjaWFsIGluc3RhbmNlIGZvciBpbml0IGVycm9ycy4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVDb25zdHJ1Y3RvcihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCi0JCUNsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1thcmd1bWVudFR5cGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJYXJnQ2xhc3Nlc1tpXSA9ICgoSURFQmVhblR5cGVQcm94eSkgYXJndW1lbnRUeXBlc1tpXSkuZkNsYXNzOwotCQl9Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoZkNsYXNzLCBhcmdDbGFzc2VzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVNZXRob2QoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRDb21wYXRpYmxlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiB7Ci0JCUNsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1thcmd1bWVudFR5cGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJYXJnQ2xhc3Nlc1tpXSA9ICgoSURFQmVhblR5cGVQcm94eSkgYXJndW1lbnRUeXBlc1tpXSkuZkNsYXNzOwotCQl9Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRDb21wYXRpYmxlTWV0aG9kKGZDbGFzcywgbWV0aG9kTmFtZSwgYXJnQ2xhc3Nlcyk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgSVByb3h5QmVhblR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlJUHJveHlNZXRob2QgbWV0aG9kID0gKChJREVFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRNZXRob2RFeHByZXNzaW9uUHJveHkodGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCS8vIE5lZWQgdG8gZ28gdG8gdGhlIGV4cHJlc3Npb24gYW5kIGNyZWF0ZSBpdC4KLQkJCW1ldGhvZCA9ICgoRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlTWV0aG9kRXhwcmVzc2lvblByb3h5KHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCB0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIChJUHJveHlCZWFuVHlwZVtdKSBudWxsKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRGaWVsZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJSVByb3h5RmllbGQgZmllbGQgPSAoKElERUV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldEZpZWxkRXhwcmVzc2lvblByb3h5KHRoaXMsIGZpZWxkTmFtZSk7Ci0JCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGdvIHRvIHRoZSBleHByZXNzaW9uIGFuZCBjcmVhdGUgaXQuCi0JCQlmaWVsZCA9ICgoRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlRmllbGRFeHByZXNzaW9uUHJveHkodGhpcywgZmllbGROYW1lKTsKLQkJfQotCQlyZXR1cm4gZmllbGQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCaWdEZWNpbWFsQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCaWdEZWNpbWFsQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZiNWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBqYXZhLm1hdGguKjsKLQotZmluYWwgY2xhc3MgSURFQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotSURFQmlnRGVjaW1hbEJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyxuZXcgQmlnRGVjaW1hbCgwKSk7Ci19Ci0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmlnRGVjaW1hbEJlYW5Qcm94eShCaWdEZWNpbWFsIGFCaWdEZWNpbWFsKSB7Ci0JaWYgKCBhQmlnRGVjaW1hbCA9PSBudWxsIHx8IGFCaWdEZWNpbWFsLmludFZhbHVlKCkgPT0gMCApIHsKLQkJcmV0dXJuIHplcm9Qcm94eTsKLQl9IGVsc2UgewotCQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYUJpZ0RlY2ltYWwsdGhpcyk7Ci0JfQotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOTEwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCaWdJbnRlZ2VyQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQmlnSW50ZWdlckJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IGphdmEubWF0aC4qOwotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSUludGVnZXJCZWFuVHlwZVByb3h5Ci0gKi8KLWZpbmFsIGNsYXNzIElERUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblR5cGVQcm94eSB7Ci0vLyBTb21lIHZhbHVlcyBhcmUgY2FjaGUnZCBmb3Igc3BlZWQKLUlERUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBCaWdJbnRlZ2VyKCIwIikpOyAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmlnSW50ZWdlckJlYW5Qcm94eShCaWdJbnRlZ2VyIGFCaWdJbnRlZ2VyKSB7Ci0JaWYgKCBhQmlnSW50ZWdlciA9PSBudWxsIHx8IGFCaWdJbnRlZ2VyLmludFZhbHVlKCkgPT0gMCApIHsKLQkJcmV0dXJuIHplcm9Qcm94eTsKLQl9IGVsc2UgewotCQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYUJpZ0ludGVnZXIsdGhpcyk7Ci0JfQotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5CZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTNlMGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQm9vbGVhbkJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIElERSBJbXBsZW1lbnRhdGlvbiBvZiBJQm9vbGVhbkJlYW5Qcm94eS4uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1jbGFzcyBJREVCb29sZWFuQmVhblByb3h5IGV4dGVuZHMgSURFT2JqZWN0QmVhblByb3h5IGltcGxlbWVudHMgSUJvb2xlYW5CZWFuUHJveHkgewotCXByb3RlY3RlZCBCb29sZWFuIGZCb29sZWFuVmFsdWU7Ci0vKioKLSAqIEFzIHdlbGwgYXMgc3RvcmluZyB0aGUgYmVhbiBzdG9yZSB0aGUgYm9vbGVhbiB2YWx1ZSBzbyB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIGJvb2xlYW5WYWx1ZSBmYXN0ZXIKLSAqIHdpdGhvdXQgdGhlIG5lZWQgZm9yIHJlcGVhdGVkIHJlLWNhc3RpbmcuIEl0IGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgaXMgY3JlYXRlZCBpbgotICogc3BlY2lhbCB3YXksIHNvIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlc2UuCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1JREVCb29sZWFuQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFCZWFuLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYUJlYW4sYUJlYW5UeXBlUHJveHkpOwotCWZCb29sZWFuVmFsdWUgPSAoQm9vbGVhbilhQmVhbjsKLX0KLXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW5WYWx1ZS5ib29sZWFuVmFsdWUoKTsKLX0KLXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKLQlyZXR1cm4gZkJvb2xlYW5WYWx1ZTsKLX0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZmOTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAxNSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSURFQm9vbGVhbkJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCb29sZWFuQmVhblByb3h5IHsKLQotCS8qKgotCSAqIEBwYXJhbSBhUmVnaXN0cnkKLQkgKiBAcGFyYW0gYUJlYW4KLQkgKiBAcGFyYW0gYUJlYW5UeXBlUHJveHkKLQkgKi8KLQlwdWJsaWMgSURFQm9vbGVhbkJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBPYmplY3QgYUJlYW4sIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUJlYW4sIGFCZWFuVHlwZVByb3h5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJcmV0dXJuIChhQmVhblByb3h5IGluc3RhbmNlb2YgSURFQm9vbGVhbkJlYW5UeXBlUHJveHkpID8gZ2V0Qm9vbGVhblZhbHVlKCkgPT0gKChJREVCb29sZWFuQmVhblR5cGVQcm94eSkgYUJlYW5Qcm94eSkuZ2V0Qm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQm9vbGVhbkNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjMxYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotZmluYWwgcHVibGljIGNsYXNzIElERUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQotCS8vIENhY2hlIHRoZXNlIGluc3RhbmNlcy4gU2luY2UgdGhlIEJlYW5UeXBlIHByb3hpZXMgYXJlIGNhY2hlZCBhbHNvLCBvbmx5IG9uZSBpbnN0YW5jZQotCS8vIG9mIHRydWUvZmFsc2Ugd2lsbCBiZSBpbiBzeXN0ZW0uCi0JcHJvdGVjdGVkIGZpbmFsIElERUJvb2xlYW5CZWFuUHJveHkgdHJ1ZVByb3h5OwotCXByb3RlY3RlZCBmaW5hbCBJREVCb29sZWFuQmVhblByb3h5IGZhbHNlUHJveHk7Ci0KLUlERUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLQl0cnVlUHJveHkgPSBuZXcgSURFQm9vbGVhbkJlYW5Qcm94eSggZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBCb29sZWFuLlRSVUUsIHRoaXMgKTsKLQlmYWxzZVByb3h5ID0gbmV3IElERUJvb2xlYW5CZWFuUHJveHkoIGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgQm9vbGVhbi5GQUxTRSwgdGhpcyk7CQotfQotSUJvb2xlYW5CZWFuUHJveHkgY3JlYXRlQm9vbGVhbkJlYW5Qcm94eShCb29sZWFuIGFCb29sZWFuKSB7Ci0JaWYgKCBhQm9vbGVhbi5ib29sZWFuVmFsdWUoKSApewotCQlyZXR1cm4gdHJ1ZVByb3h5OwotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZVByb3h5OwotCX0KLX0KLS8qIFNwZWNpYWxpemVkIGZyb20gSURFQmVhblR5cGVQcm94eSB0byBlbnN1cmUgSUJvb2xlYW5CZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkKLSAqLwotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlpZiAoIGFuT2JqZWN0ID09IG51bGwgfHwgYW5PYmplY3QgPT0gQm9vbGVhbi5GQUxTRSApIHsKLQkJcmV0dXJuIGZhbHNlUHJveHk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHRydWVQcm94eTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCb29sZWFuVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmMGZkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotZmluYWwgcHVibGljIGNsYXNzIElERUJvb2xlYW5UeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotCi0JLy8gQ2FjaGUgdGhlc2UgaW5zdGFuY2VzLiBTaW5jZSB0aGUgQmVhblR5cGUgcHJveGllcyBhcmUgY2FjaGVkIGFsc28sIG9ubHkgb25lIGluc3RhbmNlCi0JLy8gb2YgdHJ1ZS9mYWxzZSB3aWxsIGJlIGluIHN5c3RlbS4KLQlwcm90ZWN0ZWQgZmluYWwgSURFQm9vbGVhbkJlYW5Qcm94eSB0cnVlUHJveHk7Ci0JcHJvdGVjdGVkIGZpbmFsIElERUJvb2xlYW5CZWFuUHJveHkgZmFsc2VQcm94eTsKLQotSURFQm9vbGVhblR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0KLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci0JdHJ1ZVByb3h5ID0gbmV3IElERUJvb2xlYW5CZWFuVHlwZVByb3h5KCBmUHJveHlGYWN0b3J5UmVnaXN0cnksIEJvb2xlYW4uVFJVRSwgdGhpcyApOwotCWZhbHNlUHJveHkgPSBuZXcgSURFQm9vbGVhbkJlYW5UeXBlUHJveHkoIGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgQm9vbGVhbi5GQUxTRSwgdGhpcyApOwotCQotCS8vIFRPRE8gTmVlZCB0byBnbyB0aHJvdWdoIGFsbCBvZiB0aGUgcHJpbWl0aXZlcywgc2VwYXJhdGUgdGhlbSBvdXQgaW50byBhIHNlcGFyYXRlIGNsYXNzZXMgc28KLQkvLyB0aGF0IHNhbWVBcyBjYW4gd29yayB3aXRoIHRoZW0gY29ycmVjdGx5LiBDdXJyZW50bHkgb25seSBib29sZWFuIHR5cGUgd2lsbCBkbyBzYW1lQXMgY29ycmVjdGx5LgotCS8vIFNob3VsZCBhbHNvIGxvb2sgaW50byBzdG9yaW5nIHRoZSBwcmltaXRpdmUgaW4gdGhlIHByb3h5IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgd3JhcHBlciBvYmplY3QKLQkvLyBmb3IgZWFjaCBmb3IgdGhlIG5vbi1ib29sZWFuIHByaW1pdGl2ZXMuCQotfQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCb29sZWFuQmVhblByb3h5KGJvb2xlYW4gYUJvb2xlYW4pIHsKLQlpZiAoIGFCb29sZWFuICl7Ci0JCXJldHVybiB0cnVlUHJveHk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGZhbHNlUHJveHk7Ci0JfQotfQotLyogU3BlY2lhbGl6ZWQgZnJvbSBJREVCZWFuVHlwZVByb3h5IHRvIGVuc3VyZSBJQm9vbGVhbkJlYW5Qcm94aWVzIGFyZSBjcmVhdGVkIGNvcnJlY3RseQotICovCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiAoSUlERUJlYW5Qcm94eSljcmVhdGVCb29sZWFuQmVhblByb3h5KCBhbk9iamVjdCAhPSBudWxsID8gKChCb29sZWFuKWFuT2JqZWN0KS5ib29sZWFuVmFsdWUoKSA6IGZhbHNlICk7Ci0KLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIEJPT0xFQU47Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQnl0ZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Q2ODJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQnl0ZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQnl0ZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogQnl0ZSBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFQnl0ZUNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIElERU51bWJlckJlYW5UeXBlUHJveHkgewotCQkKLXByb3RlY3RlZCBJREVCeXRlQ2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBCeXRlKChieXRlKTApKTsKLX0KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQnl0ZUJlYW5Qcm94eShCeXRlIGFCeXRlKXsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYUJ5dGUsdGhpcyk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQnl0ZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGM4OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVCeXRlVHlwZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUJ5dGVUeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIEJ5dGUgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUJ5dGVUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotcHJvdGVjdGVkIElERUJ5dGVUeXBlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLX0KLUlOdW1iZXJCZWFuUHJveHkgY3JlYXRlQnl0ZUJlYW5Qcm94eShieXRlIGFCeXRlKXsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IEJ5dGUoYUJ5dGUpLHRoaXMpOwotfQotaW50IGdldFByaW1pdGl2ZVR5cGUoKXsKLQlyZXR1cm4gQllURTsKLX0KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCU51bWJlciBuID0gYW5PYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIgPyBuZXcgQnl0ZSgoYnl0ZSkoKENoYXJhY3RlcikgYW5PYmplY3QpLmNoYXJWYWx1ZSgpKSA6IChOdW1iZXIpIGFuT2JqZWN0OwotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgbiwgdGhpcyk7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2FsbGJhY2tSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDYWxsYmFja1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0N2Q3N2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDYWxsYmFja1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQ2FsbGJhY2tSZWdpc3RyeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudDsKLQotcHVibGljIGNsYXNzIElERUNhbGxiYWNrUmVnaXN0cnkgaW1wbGVtZW50cyBJQ2FsbGJhY2tSZWdpc3RyeSB7Ci0JCi0JSURFVk1TZXJ2ZXIgZlZNU2VydmVyOwotCWludCBmTmV4dENhbGxiYWNrSUQ7Ci0JSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCU1hcCBmQ2FsbGJhY2tJRFRvQ2FsbGJhY2sgPSBuZXcgSGFzaE1hcCgyNSk7Ci0JTWFwIGZCZWFuUHJveHlUb0NhbGxiYWNrSUQgPSBuZXcgSGFzaE1hcCgyNSk7Ci0JTWFwIGZDYWxsYmFja0lEVG9TdHJlYW0gPSBuZXcgSGFzaE1hcCgyNSk7Ci0JcHJpdmF0ZSBJUHJveHlNZXRob2QgaW5pdGlhbGl6ZUNhbGxiYWNrTWV0aG9kUHJveHk7Ci0JcHJpdmF0ZSBJQmVhblByb3h5IHZtU2VydmVyUHJveHk7Ci0JCi1JREVDYWxsYmFja1JlZ2lzdHJ5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSl7Ci0JZlByb3h5RmFjdG9yeVJlZ2lzdHJ5ID0gYVJlZ2lzdHJ5OwotCWZWTVNlcnZlciA9IG5ldyBJREVWTVNlcnZlcih0aGlzKTsKLQkKLQl2bVNlcnZlclByb3h5ID0gYVJlZ2lzdHJ5LmdldEJlYW5Qcm94eShmVk1TZXJ2ZXIuZ2V0Q2xhc3MoKSwgZlZNU2VydmVyKTsKLQkKLQl0cnkgewotCQlNZXRob2QgaW5pdGlhbGl6ZUNhbGxiYWNrTWV0aG9kID0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2suY2xhc3MuZ2V0TWV0aG9kKCJpbml0aWFsaXplQ2FsbGJhY2siLCBuZXcgQ2xhc3NbXSB7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JVk1DYWxsYmFja1NlcnZlci5jbGFzcywgSW50ZWdlci5UWVBFfSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdGlhbGl6ZUNhbGxiYWNrTWV0aG9kUHJveHkgPSAoSVByb3h5TWV0aG9kKSBhUmVnaXN0cnkuZ2V0QmVhblByb3h5KE1ldGhvZC5jbGFzcywgaW5pdGlhbGl6ZUNhbGxiYWNrTWV0aG9kKTsKLQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JCi19Ci0KLQotLyoqCi0gKiBBZGQgYSBjYWxsYmFjay4gIGFCZWFuUHJveHkgaXMgcnVubmluZyBvbiB0aGUgdGFyZ2V0IFZNIGFuZCBJQ2FsbGJhY2sgcnVucyBvbiBvdXIgVk0KLSAqIGFCZWFuUHJveHkgd2lsbCBpbXBsZW1lbnQgSUNhbGxiYWNrIG9uIHRoZSB0YXJnZXQgc2lkZQotICovCQotcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5IGFCZWFuUHJveHksIElDYWxsYmFjayBhQ2FsbGJhY2spewotCi0JLy8gR2V0IGEgaGFuZGxlIHRvIHRoZSByZW1vdGUgVk0gY2FsbGJhY2sJCi0Jb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2sgdm1DYWxsYmFjayA9IChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLklDYWxsYmFjaykgKChJSURFQmVhblByb3h5KWFCZWFuUHJveHkpLmdldEJlYW4oKTsgCi0JZk5leHRDYWxsYmFja0lEID0gZk5leHRDYWxsYmFja0lEICsgMTsKLQlpbnQgY2FsbGJhY2tJRCA9IGZOZXh0Q2FsbGJhY2tJRDsKLQl2bUNhbGxiYWNrLmluaXRpYWxpemVDYWxsYmFjaygKLQkJZlZNU2VydmVyLAotCQljYWxsYmFja0lEKTsKLQlJbnRlZ2VyIGNhbGxiYWNrSW50ZWdlcklEID0gbmV3IEludGVnZXIoY2FsbGJhY2tJRCk7Ci0JZkNhbGxiYWNrSURUb0NhbGxiYWNrLnB1dChjYWxsYmFja0ludGVnZXJJRCxhQ2FsbGJhY2spOwotCWZCZWFuUHJveHlUb0NhbGxiYWNrSUQucHV0KGFCZWFuUHJveHksY2FsbGJhY2tJbnRlZ2VySUQpOwotCi19Ci0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ2FsbGJhY2tSZWdpc3RyeSNyZWdpc3RlckNhbGxiYWNrKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNhbGxiYWNrLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbikKLSAqLwotcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhJUHJveHkgY2FsbGJhY2tQcm94eSwgZmluYWwgSUNhbGxiYWNrIGNiLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JZmluYWwgSW50ZWdlciBjYWxsYmFja0lEID0gbmV3IEludGVnZXIoKytmTmV4dENhbGxiYWNrSUQpOwotCWZDYWxsYmFja0lEVG9DYWxsYmFjay5wdXQoY2FsbGJhY2tJRCwgY2IpOwotCWlmIChjYWxsYmFja1Byb3h5LmlzQmVhblByb3h5KCkpIHsKLQkJZkJlYW5Qcm94eVRvQ2FsbGJhY2tJRC5wdXQoY2FsbGJhY2tQcm94eSwgY2FsbGJhY2tJRCk7CQkKLQl9IGVsc2UgewotCQkoKEV4cHJlc3Npb25Qcm94eSkgY2FsbGJhY2tQcm94eSkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWZCZWFuUHJveHlUb0NhbGxiYWNrSUQucHV0KGV2ZW50LmdldFByb3h5KCksIGNhbGxiYWNrSUQpOwkJCi0JCQl9Ci0JCX0pOwotCX0KLQlleHByZXNzaW9uLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShpbml0aWFsaXplQ2FsbGJhY2tNZXRob2RQcm94eSwgY2FsbGJhY2tQcm94eSwgbmV3IElQcm94eVtdIHt2bVNlcnZlclByb3h5LCBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoY2FsbGJhY2tJRC5pbnRWYWx1ZSgpKX0sIGZhbHNlKTsKLQkKLX0KLQotT3V0cHV0U3RyZWFtIHJlcXVlc3RTdHJlYW0oZmluYWwgaW50IGFDYWxsYmFja0lELCBmaW5hbCBpbnQgYU1zZ0lEKXsKLQlmaW5hbCBQaXBlZE91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oKTsKLQlQaXBlZElucHV0U3RyZWFtIHRlbXBTdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXRlbXBTdHJlYW0gPSBuZXcgUGlwZWRJbnB1dFN0cmVhbShyZXN1bHQpOwkKLQl9IGNhdGNoICggSU9FeGNlcHRpb24gZXhjICkgewotCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCWZpbmFsIFBpcGVkSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB0ZW1wU3RyZWFtOwotCVRocmVhZCBzdHJlYW1Qcm9jZXNzb3IgPSBuZXcgVGhyZWFkKCl7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJSUNhbGxiYWNrIGlkZUNhbGxiYWNrID0gKElDYWxsYmFjaylmQ2FsbGJhY2tJRFRvQ2FsbGJhY2suZ2V0KG5ldyBJbnRlZ2VyKGFDYWxsYmFja0lEKSk7Ci0JCQlpZiAoaWRlQ2FsbGJhY2sgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlkZUNhbGxiYWNrLmNhbGxlZEJhY2tTdHJlYW0oYU1zZ0lELCBpbnB1dFN0cmVhbSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7CS8vIE1ha2Ugc3VyZSBpdCdzIGNsb3NlZC4KLQkJCQkJfSBjYXRjaCAoIElPRXhjZXB0aW9uICBleGMgKXsKLQkJCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQkJCQotCQkJfQotCQl9Ci0JfTsKLQlzdHJlYW1Qcm9jZXNzb3Iuc3RhcnQoKTsKLQlyZXR1cm4gcmVzdWx0OwkKLX0KLQotT2JqZWN0IHZtQ2FsbGJhY2soaW50IGFDYWxsYmFja0lEICxpbnQgYU1zZ0lELCBPYmplY3RbXSBwYXJtcyl7Ci0JLy8gRmluZCB0aGUgYmVhbiBwcm94eSB0aGF0IHJlZ2lzdGVyZWQgd2l0aCB0aGUgSUQKLQlJQ2FsbGJhY2sgaWRlQ2FsbGJhY2sgPSAoSUNhbGxiYWNrKSBmQ2FsbGJhY2tJRFRvQ2FsbGJhY2suZ2V0KG5ldyBJbnRlZ2VyKGFDYWxsYmFja0lEKSk7Ci0JT2JqZWN0IGNhbGxiYWNrUmVzdWx0ID0gbnVsbDsKLQlpZiAoIHBhcm1zLmxlbmd0aCA9PSAxICkgewotCQljYWxsYmFja1Jlc3VsdCA9IGlkZUNhbGxiYWNrLmNhbGxlZEJhY2soYU1zZ0lELChJQmVhblByb3h5KXBhcm1zWzBdKTsKLQl9IGVsc2UgewotCQljYWxsYmFja1Jlc3VsdCA9IGlkZUNhbGxiYWNrLmNhbGxlZEJhY2soYU1zZ0lELHBhcm1zKTsKLQl9Ci0JcmV0dXJuIGNhbGxiYWNrUmVzdWx0OwotfQotCi1PYmplY3Qgdm1DYWxsYmFjayhpbnQgYUNhbGxiYWNrSUQgLGludCBhTXNnSUQsIE9iamVjdCBwYXJtKXsKLQkvLyBGaW5kIHRoZSBiZWFuIHByb3h5IHRoYXQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBJRAotCUlDYWxsYmFjayBpZGVDYWxsYmFjayA9IChJQ2FsbGJhY2spIGZDYWxsYmFja0lEVG9DYWxsYmFjay5nZXQobmV3IEludGVnZXIoYUNhbGxiYWNrSUQpKTsKLQlyZXR1cm4gaWRlQ2FsbGJhY2suY2FsbGVkQmFjayhhTXNnSUQscGFybSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJDYWxsYmFjayhJQmVhblByb3h5IGFCZWFuUHJveHkpewotCS8vIFJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBib3RoIG1hcHMuICBUaGUgYWN0dWFsIHVucmVnaXN0ZXJpbmcgb2YgdGhlIGNhbGxiYWNrCi0JLy8gb24gdGhlIHRhcmdldCBWTSBpcyBkb25lIHNlcGFyYXRlbHkgYnkgdGhlIG9iamVjdCB0aGF0IGFkZGVkIHRoZSBldmVudCBoYW5kbGVyIG9uIHRoZSB0YXJnZXQgVk0KLQlJbnRlZ2VyIGNhbGxiYWNrSUQgPSAoSW50ZWdlcikgZkJlYW5Qcm94eVRvQ2FsbGJhY2tJRC5yZW1vdmUoYUJlYW5Qcm94eSk7Ci0JZkNhbGxiYWNrSURUb0NhbGxiYWNrLnJlbW92ZShjYWxsYmFja0lEKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2hhclR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNoYXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg2Y2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2hhclR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVDaGFyVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIGNoYXIgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUNoYXJUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotcHJvdGVjdGVkIElERUNoYXJUeXBlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLX0KLUlDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQ2hhckJlYW5Qcm94eShjaGFyIGFDaGFyKXsKLQlyZXR1cm4gbmV3IElERUNoYXJhY3RlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IENoYXJhY3RlcihhQ2hhciksdGhpcyk7Ci19Ci1pbnQgZ2V0UHJpbWl0aXZlVHlwZSgpewotCXJldHVybiBDSEFSOwotfQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0JQ2hhcmFjdGVyIGMgPSBhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlciA/IChDaGFyYWN0ZXIpIGFuT2JqZWN0IDogbmV3IENoYXJhY3RlcigoY2hhcikoKE51bWJlcikgYW5PYmplY3QpLmludFZhbHVlKCkpOwotCXJldHVybiBuZXcgSURFQ2hhcmFjdGVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYywgdGhpcyk7Ci0JCi19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDaGFyYWN0ZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2hhcmFjdGVyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNWI2OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDaGFyYWN0ZXJCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAkUkNTZmlsZTogSURFQ2hhcmFjdGVyQmVhblByb3h5LmphdmEsdiAkICRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSUNoYXJhY3RlckJlYW5CZWFuUHJveHkuLgotICovCi1jbGFzcyBJREVDaGFyYWN0ZXJCZWFuUHJveHkgZXh0ZW5kcyBJREVPYmplY3RCZWFuUHJveHkgaW1wbGVtZW50cyBJQ2hhcmFjdGVyQmVhblByb3h5IHsKLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyIGZDaGFyYWN0ZXJWYWx1ZTsKLQlJREVDaGFyYWN0ZXJCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBPYmplY3QgYUJlYW4sIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUJlYW4sIGFCZWFuVHlwZVByb3h5KTsKLQkJZkNoYXJhY3RlclZhbHVlID0gKENoYXJhY3RlcikgYUJlYW47Ci0JfQotCXB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDaGFyYWN0ZXJWYWx1ZS5jaGFyVmFsdWUoKTsKLQl9Ci0JcHVibGljIENoYXJhY3RlciBjaGFyYWN0ZXJWYWx1ZSgpIHsKLQkJcmV0dXJuIGZDaGFyYWN0ZXJWYWx1ZTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JSW50ZWdlckJlYW5Qcm94eSNpbnRWYWx1ZSgpCi0JICovCi0JcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQkJcmV0dXJuIGNoYXJWYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjYnl0ZVZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0JCXJldHVybiAoYnl0ZSkgY2hhclZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNkb3VibGVWYWx1ZSgpCi0JICovCi0JcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGNoYXJWYWx1ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjZmxvYXRWYWx1ZSgpCi0JICovCi0JcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0JCXJldHVybiBjaGFyVmFsdWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTnVtYmVyQmVhblByb3h5I2xvbmdWYWx1ZSgpCi0JICovCi0JcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotCQlyZXR1cm4gY2hhclZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU51bWJlckJlYW5Qcm94eSNudW1iZXJWYWx1ZSgpCi0JICovCi0JcHVibGljIE51bWJlciBudW1iZXJWYWx1ZSgpIHsKLQkJLy8gVGhpcyBpcyBhIGtsdWRnZS4gTmVlZCB0byBuZXcgb25lIHVwLgotCQlyZXR1cm4gbmV3IEludGVnZXIoY2hhclZhbHVlKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklOdW1iZXJCZWFuUHJveHkjc2hvcnRWYWx1ZSgpCi0JICovCi0JcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JCXJldHVybiAoc2hvcnQpIGNoYXJWYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWRkZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUNoYXJhY3RlckNsYXNzQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogQ2hhciBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JCi1wcm90ZWN0ZWQgSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVDaGFyYWN0ZXJCZWFuUHJveHkoQ2hhcmFjdGVyIGFDaGFyKXsKLQlyZXR1cm4gbmV3IElERUNoYXJhY3RlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYUNoYXIsdGhpcyk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiZTYyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSURFQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eTsKLSAKLS8qKgotICogRm9yIGphdmEubGFuZy5DbGFzcyB0eXBlLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQotCS8qKgotCSAqIEBwYXJhbSBhUmVnaXN0cnkKLQkgKiBAcGFyYW0gYUNsYXNzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElERUNsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVCZWFuVHlwZVByb3h5I25ld0JlYW5Qcm94eShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpIHsKLQkJcmV0dXJuIChJSURFQmVhblByb3h5KSAoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KChDbGFzcykgYW5PYmplY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFQmVhblR5cGVQcm94eSNuZXdCZWFuVHlwZUZvckNsYXNzKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgSURFQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKENsYXNzIHR5cGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNuZXdJbnN0YW5jZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDb25zdHJ1Y3RvclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTk0Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVDb25zdHJ1Y3RvclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFQ29uc3RydWN0b3JQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgSUNvbnN0cnVjdG9yUHJveHkgd2hlcmUgdGhlIHRhcmdldCBWTSBpcyB0aGUgc2FtZSBhcwotICogdGhlIElERS4gIFRoZSBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBpbnN0YW5jZSBpcyBoZWxkIGluIGEgZmllbGQKLSAqLwotY2xhc3MgSURFQ29uc3RydWN0b3JQcm94eSBleHRlbmRzIElERUFjY2Vzc2libGVPYmplY3RQcm94eSBpbXBsZW1lbnRzIElDb25zdHJ1Y3RvclByb3h5IHsKLQotCS8qKgotCSAqIHBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHdoZXJlIHRoZSBpbnN0YW5jZSBvZiBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcgotCSAqIGNhbiBiZSBwYXNzZWQgaW4gZGlyZWN0bHkKLQkgKi8KLQlJREVDb25zdHJ1Y3RvclByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ29uc3RydWN0b3IgYUNvbnN0cnVjdG9yKSB7Ci0JCXN1cGVyKGFSZWdpc3RyeSwgYUNvbnN0cnVjdG9yKTsKLQl9Ci0JLyoqCi0JICogVGhlIHR5cGUgcHJveHkgaXMgY29uc3RhbnQgcHJveHkgb3V0IG9mIHRoZSBtZXRob2QgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuY29uc3RydWN0b3JUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgZmFjdG9yZWQgaW50byBhIHNwZWNpYWwgbWV0aG9kIHNvIHRoYXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLQkgKiBpZiB0aGV5IHdpc2guCi0JICovCi0JcHJvdGVjdGVkIElCZWFuUHJveHkgZ2V0TmV3SURFQmVhblByb3h5KE9iamVjdCBhQmVhbikgewotCi0JCXJldHVybiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgYUJlYW4pOyAvLyBVc2UgbG9jYWwgaGVscGVyIG1ldGhvZCB0byBkbyB0aGlzLgotCX0KLQkvKioKLQkgKiBJbnZva2UgdGhlIGNvbnN0cnVjdG9yIGFuZCByZXR1cm4gYW4gSURFQmVhblByb3h5IHdpdGggdGhlIHJlc3VsdAotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKCkgewotCi0JCS8vIEludm9rZSB0aGUgY29uc3RydWN0b3IKLQkJdHJ5IHsKLQkJCU9iamVjdCByZXN1bHQgPSAoKENvbnN0cnVjdG9yKSBnZXRCZWFuKCkpLm5ld0luc3RhbmNlKG51bGwpOwotCQkJcmV0dXJuIGdldE5ld0lERUJlYW5Qcm94eShyZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKCk7Ci0JfQotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHlbXSBhcmdzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShhcmdzKTsKLQl9Ci0JLyoqCi0JICogSW52b2tlIHRoZSBjb25zdHJ1Y3RvciBhbmQgcmV0dXJuIGFuIElERUJlYW5Qcm94eSB3aXRoIHRoZSByZXN1bHQKLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBuZXdJbnN0YW5jZShJQmVhblByb3h5W10gY3JlYXRpb25Bcmd1bWVudHMpIHsKLQotCQkvLyBHZXQgYW4gYXJyYXkgb2YgYmVhbiBvYmplY3RzIGZyb20gdGhlIGJlYW4gcHJveHkgYXJndW1lbnRzCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlPYmplY3RbXSBjcmVhdGlvbk9iamVjdHMgPSBuZXcgT2JqZWN0W2NyZWF0aW9uQXJndW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3JlYXRpb25Bcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBhcmd1bWVudHMgYXJlIG51bGwgd2hpY2ggaXMgcGVyZmVjdGx5IHZhbGlkCi0JCQlpZiAoY3JlYXRpb25Bcmd1bWVudHNbaV0gIT0gbnVsbCkKLQkJCQljcmVhdGlvbk9iamVjdHNbaV0gPSAoKElJREVCZWFuUHJveHkpIGNyZWF0aW9uQXJndW1lbnRzW2ldKS5nZXRCZWFuKCk7Ci0JCX0KLQotCQkvLyBJbnZva2UgdGhlIGNvbnN0cnVjdG9yCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoKENvbnN0cnVjdG9yKSBnZXRCZWFuKCkpLm5ld0luc3RhbmNlKGNyZWF0aW9uT2JqZWN0cyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBJZiB3ZSBoYXZlIGEgbm9uLW51bGwgcmVzdWx0IGNyZWF0ZSBhbiBJREVCZWFuUHJveHkgYW5kIHJldHVybiBpdAotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXROZXdJREVCZWFuUHJveHkocmVzdWx0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbnN0cnVjdG9yUHJveHkjZ2V0UGFyYW1ldGVyVHlwZXMoKQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eVtdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCQlDbGFzc1tdIHBhcm1DbGFzc2VzID0gKChDb25zdHJ1Y3RvcikgZ2V0QmVhbigpKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlJQmVhblR5cGVQcm94eVtdIHBhcm1UeXBlcyA9IG5ldyBJQmVhblR5cGVQcm94eVtwYXJtQ2xhc3Nlcy5sZW5ndGhdOwotCQlJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGZhY3RvcnkgPSAoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybUNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBhcm1UeXBlc1tpXSA9IGZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShwYXJtQ2xhc3Nlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHBhcm1UeXBlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFQ29uc3RydWN0b3JUeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhYzk5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUNvbnN0cnVjdG9yVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVDb25zdHJ1Y3RvclR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIElERUNvbnN0cnVjdG9yVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JCi0JSURFQ29uc3RydWN0b3JUeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJc3VwZXIocmVnaXN0cnksIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSURFQmVhblR5cGVQcm94eSNuZXdCZWFuUHJveHkoT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpIHsKLQkJcmV0dXJuIG5ldyBJREVDb25zdHJ1Y3RvclByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKSBhbk9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVEb3VibGVDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhNzEwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERURvdWJsZUNsYXNzQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBEb3VibGUgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERURvdWJsZUNsYXNzQmVhblR5cGVQcm94eSBleHRlbmRzIElERU51bWJlckJlYW5UeXBlUHJveHkgewotCi1wcm90ZWN0ZWQgSURFRG91YmxlQ2xhc3NCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MsIG5ldyBEb3VibGUoMCkpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVEb3VibGVCZWFuUHJveHkoRG91YmxlIGFEb3VibGUpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxhRG91YmxlLHRoaXMpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRG91YmxlVHlwZUJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiYWQ1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERURvdWJsZVR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVEb3VibGVUeXBlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogZG91YmxlIEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVEb3VibGVUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotcHJvdGVjdGVkIElERURvdWJsZVR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVEb3VibGVCZWFuUHJveHkoZG91YmxlIGFEb3VibGUpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxuZXcgRG91YmxlKGFEb3VibGUpLHRoaXMpOwotfQotaW50IGdldFByaW1pdGl2ZVR5cGUoKXsKLQlyZXR1cm4gRE9VQkxFOwotfQotCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQlOdW1iZXIgbiA9IGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyID8gbmV3IERvdWJsZSgoKENoYXJhY3RlcikgYW5PYmplY3QpLmNoYXJWYWx1ZSgpKSA6IChOdW1iZXIpIGFuT2JqZWN0OwotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgbiwgdGhpcyk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzg4NzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogJFJDU2ZpbGU6IElERUV4cHJlc3Npb24uamF2YSx2ICQgJFJldmlzaW9uOiAxLjEyICQgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS4qOwotCi0vKioKLSAqIElERSBleHByZXNzaW9uIHByb2Nlc3NpbmcuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSURFRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gewotCi0JcHJpdmF0ZSBmaW5hbCBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW50eXBlZmFjdG9yeTsKLQlwcm90ZWN0ZWQgZmluYWwgRXhwcmVzc2lvblByb2Nlc3NlciBlcHJvYzsKLQl7Ci0JCWJvb2xlYW4gdXNlVHJhY2luZyA9ICFpc1RyYWNlU2V0KCkgPyAKLQkJCSJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgUHJveHlMYXVuY2hTdXBwb3J0LkVYUFJFU1NJT05fVFJBQ0lORykpIDogLy8kTk9OLU5MUy0xJAotCQkJaXNUcmFjZSgpOwotCQlsb25nIHRocmVzaG9sZCA9IExvbmcuZ2V0TG9uZyhQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIFByb3h5TGF1bmNoU3VwcG9ydC5FWFBSRVNTSU9OX1RSQUNFSU5HX1RJTUVSX1RIUkVTSE9MRCksIC0xTCkubG9uZ1ZhbHVlKCk7Ci0JCWVwcm9jID0gbmV3IEV4cHJlc3Npb25Qcm9jZXNzZXIodXNlVHJhY2luZywgdGhyZXNob2xkKTsKLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0V4cHJlc3Npb25FcnJvcigpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlpZiAoIWVwcm9jLm5vRXJyb3JzKCkpCi0JCQlpZiAoZXByb2MuaXNOb0V4cHJlc3Npb25WYWx1ZSgpKQotCQkJCXRocm93IChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbikgZXByb2MuZ2V0RXJyb3JUaHJvd2FibGUoKTsKLQkJCWVsc2UgewotCQkJCVRocm93YWJsZSB0ID0gZXByb2MuZ2V0RXJyb3JUaHJvd2FibGUoKTsKLQkJCQlpZiAodCBpbnN0YW5jZW9mIFRocm93YWJsZVByb3h5KQotCQkJCQl0aHJvdyAoVGhyb3dhYmxlUHJveHkpIHQ7Ci0JCQkJZWxzZQotCQkJCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoZXByb2MuZ2V0RXJyb3JUaHJvd2FibGUoKSwgYmVhbnR5cGVmYWN0b3J5LmdldEJlYW5UeXBlUHJveHkodC5nZXRDbGFzcygpKSk7Ci0JCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSURFRXhwcmVzc2lvbgotCSAqIAotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJREVFeHByZXNzaW9uKFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXN1cGVyKHJlZ2lzdHJ5KTsKLQkJYmVhbnR5cGVmYWN0b3J5ID0gKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldElERVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gKElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSByZWdpc3RyeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBnZXRJREVCZWFuVHlwZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBiZWFudHlwZWZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRvUHJveHkoSVByb3h5IHByb3h5KSB7Ci0JCWlmIChwcm94eSA9PSBudWxsKQotCQkJZXByb2MucHVzaEV4cHJlc3Npb24obnVsbCwgTWV0aG9kSGVscGVyLk5VTExfVFlQRSk7Ci0JCWVsc2UgaWYgKHByb3h5LmlzQmVhblByb3h5KCkpCi0JCQllcHJvYy5wdXNoRXhwcmVzc2lvbigoKElERUJlYW5Qcm94eSkgcHJveHkpLmdldEJlYW4oKSwgKChJREVCZWFuVHlwZVByb3h5KSAoKElCZWFuUHJveHkpIHByb3h5KS5nZXRUeXBlUHJveHkoKSkuZ2V0VHlwZUNsYXNzKCkpOwotCQllbHNlCi0JCQllcHJvYy5wdXNoRXhwcmVzc2lvblByb3h5KCgoRXhwcmVzc2lvblByb3h5KSBwcm94eSkuZ2V0UHJveHlJRCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jY2xvc2VQcm94eSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2VQcm94eSgpIHsKLQkJbWV0aG9kRXhwcmVzc2lvblByb3hpZXMgPSBmaWVsZEV4cHJlc3Npb25Qcm94aWVzID0gbnVsbDsKLQkJZXByb2MuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1bGxQcm94eVZhbHVlKGludCwgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIElCZWFuUHJveHkgcHVsbFByb3h5VmFsdWUoaW50IHByb3h5Y291bnQsIExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlwcm9jZXNzRXh0ZW5zaW9uUHJveGllcyhwcm94eWNvdW50LCBleHByZXNzaW9uUHJveGllcyk7Ci0JCXByb2Nlc3NFeHByZXNzaW9uRXJyb3IoKTsKLQkJT2JqZWN0IHJlc3VsdFtdID0gbmV3IE9iamVjdFsyXTsKLQkJZXByb2MucHVsbFZhbHVlKHJlc3VsdCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0UHJveHkgPSBnZXRJREVSZWdpc3RyeSgpLmdldEJlYW5Qcm94eSgoQ2xhc3MpIHJlc3VsdFsxXSwgcmVzdWx0WzBdKTsKLQkJcmV0dXJuIHJlc3VsdFByb3h5OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dGVuc2lvblByb3hpZXMoaW50IHByb3h5Y291bnQsIExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHsKLQkJaWYgKHByb3h5Y291bnQgPiAwKSB7Ci0JCQlpbnQgbGVuID0gZXhwcmVzc2lvblByb3hpZXMuc2l6ZSgpOwotCQkJT2JqZWN0W10gcHJveHlSZXNvbHV0aW9uID0gbmV3IE9iamVjdFsyXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlFeHByZXNzaW9uUHJveHkgZXAgPSAoRXhwcmVzc2lvblByb3h5KSBleHByZXNzaW9uUHJveGllcy5nZXQoaSk7Ci0JCQkJaWYgKGVwICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWVwcm9jLnB1bGxFeHByZXNzaW9uUHJveHlWYWx1ZShlcC5nZXRQcm94eUlEKCksIHByb3h5UmVzb2x1dGlvbik7Ci0JCQkJCQlpZiAocHJveHlSZXNvbHV0aW9uWzFdICE9IFZvaWQuVFlQRSkKLQkJCQkJCQlmaXJlUHJveHlSZXNvbHZlZChlcCwgZ2V0SURFUmVnaXN0cnkoKS5nZXRCZWFuUHJveHkoKENsYXNzKSBwcm94eVJlc29sdXRpb25bMV0sIHByb3h5UmVzb2x1dGlvblswXSkpOwotCQkJCQkJZWxzZQotCQkJCQkJCWZpcmVQcm94eVZvaWQoZXApOwotCQkJCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlmaXJlUHJveHlOb3RSZXNvbHZlZChlcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hDYXN0VG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQ2FzdFRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSkgewotCQl0cnkgewotCQkJZXByb2MucHVzaENhc3QoZ2V0SURFQmVhblR5cGVQcm94eSh0eXBlKS5nZXRUeXBlQ2xhc3MoKSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJbnN0YW5jZW9mVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSW5zdGFuY2VvZlRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSkgewotCQl0cnkgewotCQkJZXByb2MucHVzaEluc3RhbmNlb2YoZ2V0SURFQmVhblR5cGVQcm94eSh0eXBlKS5nZXRUeXBlQ2xhc3MoKSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBCZWFuVHlwZSBwcm94eSBhbmQgdGVzdCBpZiB2YWxpZC4gVGhyb3cgVGhyb3dhYmxlUHJveHkgaWYgbm90IHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIAotCSAqIEByZXR1cm4gCi0JICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBJREVCZWFuVHlwZVByb3h5IGdldElERUJlYW5UeXBlUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSURFQmVhblR5cGVQcm94eSB0eXBlUHJveHk7Ci0JCWlmICh0eXBlLmlzRXhwcmVzc2lvblByb3h5KCkpIHsKLQkJCS8vIEl0IHNob3VsZCBhbHJlYWR5IGJlIHJlc29sdmVkIGF0IHRoaXMgcG9pbnQuCi0JCQl0eXBlUHJveHkgPSAoKElERUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KSB0eXBlKS5nZXRCZWFuVHlwZVByb3h5KCk7Ci0JCX0gZWxzZQotCQkJdHlwZVByb3h5ID0gKElERUJlYW5UeXBlUHJveHkpIHR5cGU7Ci0JCWlmICghdHlwZVByb3h5LmlzVmFsaWQoKSkgewotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KAotCQkJCQluZXcgRXhjZXB0aW9uKHR5cGVQcm94eS5nZXRJbml0aWFsaXphdGlvbkVycm9yKCkpLAotCQkJCQlnZXRJREVCZWFuVHlwZUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KEV4Y2VwdGlvbi5jbGFzcykpOwotCQl9IGVsc2UKLQkJCXJldHVybiB0eXBlUHJveHk7Ci0JfQotCi0JCi0JLyoqCi0JICogR2V0IHRoZSBCZWFuVHlwZSBwcm94eSBhbmQgdGVzdCBpZiB2YWxpZC4gVGhyb3cgVGhyb3dhYmxlUHJveHkgaWYgbm90IHZhbGlkLgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSURFQmVhblR5cGVQcm94eSBnZXRJREVCZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlyZXR1cm4gKElERUJlYW5UeXBlUHJveHkpIHJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSh0eXBlKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hQcmVmaXhUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuUHJlZml4T3BlcmF0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFByZWZpeFRvUHJveHkoUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJZXByb2MucHVzaFByZWZpeChvcGVyYXRvcik7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSW5maXhUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW5maXhPcGVyYXRvciwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEluZml4T3BlcmFuZFR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEluZml4VG9Qcm94eShJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLCBJbnRlcm5hbEluZml4T3BlcmFuZFR5cGUgb3BlcmFuZFR5cGUpIHsKLQkJZXByb2MucHVzaEluZml4KG9wZXJhdG9yLCBvcGVyYW5kVHlwZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQXJyYXlBY2Nlc3NUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXJyYXlBY2Nlc3NUb1Byb3h5KGludCBpbmRleENvdW50KSB7Ci0JCWVwcm9jLnB1c2hBcnJheUFjY2VzcyhpbmRleENvdW50KTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hBcnJheUNyZWF0aW9uVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hBcnJheUNyZWF0aW9uVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgZGltZW5zaW9uQ291bnQpIHsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hBcnJheUNyZWF0aW9uKGdldElERUJlYW5UeXBlUHJveHkodHlwZSkuZ2V0VHlwZUNsYXNzKCksIGRpbWVuc2lvbkNvdW50KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hBcnJheUluaXRpYWxpemVyVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgc3RyaXBDb3VudCwgaW50IGV4cHJlc3Npb25Db3VudCkgewotCQl0cnkgewotCQkJZXByb2MucHVzaEFycmF5SW5pdGlhbGl6ZXIoZ2V0SURFQmVhblR5cGVQcm94eSh0eXBlKS5nZXRUeXBlQ2xhc3MoKSwgc3RyaXBDb3VudCwgZXhwcmVzc2lvbkNvdW50KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvblRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uVG9Qcm94eShJUHJveHlCZWFuVHlwZSB0eXBlLCBpbnQgYXJndW1lbnRDb3VudCkgewotCQl0cnkgewotCQkJZXByb2MucHVzaENsYXNzSW5zdGFuY2VDcmVhdGlvbihnZXRJREVCZWFuVHlwZVByb3h5KHR5cGUpLmdldFR5cGVDbGFzcygpLCBhcmd1bWVudENvdW50KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFR5cGVSZWNlaXZlclRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFR5cGVSZWNlaXZlclRvUHJveHkoSVByb3h5QmVhblR5cGUgdHlwZSkgewotCQl0cnkgewotCQkJQ2xhc3MgYyA9IGdldElERUJlYW5UeXBlUHJveHkodHlwZSkuZ2V0VHlwZUNsYXNzKCk7Ci0JCQllcHJvYy5wdXNoRXhwcmVzc2lvbihjLCBjKTsJLy8gV2hlbiBhcyBhIHJlY2VpdmVyLCB0aGUgdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVjZWl2ZXIuIAotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hGaWVsZEFjY2Vzc1RvUHJveHkoamF2YS5sYW5nLk9iamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoRmllbGRBY2Nlc3NUb1Byb3h5KE9iamVjdCBmaWVsZCwgYm9vbGVhbiBoYXNSZWNlaXZlcikgewotCQlib29sZWFuIGlzU3RyaW5nID0gZmllbGQgaW5zdGFuY2VvZiBTdHJpbmc7Ci0JCXRyeSB7Ci0JCQllcHJvYy5wdXNoRmllbGRBY2Nlc3MoaXNTdHJpbmcgPyBmaWVsZCA6IGdldElERUZpZWxkUHJveHkoKElQcm94eUZpZWxkKSBmaWVsZCkuZ2V0QmVhbigpLCBpc1N0cmluZywgaGFzUmVjZWl2ZXIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9CQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hNZXRob2RJbnZvY2F0aW9uVG9Qcm94eShqYXZhLmxhbmcuT2JqZWN0LCBib29sZWFuLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaE1ldGhvZEludm9jYXRpb25Ub1Byb3h5KE9iamVjdCBtZXRob2QsIGJvb2xlYW4gaGFzUmVjZWl2ZXIsIGludCBhcmdDb3VudCkgewotCQlib29sZWFuIGlzU3RyaW5nID0gbWV0aG9kIGluc3RhbmNlb2YgU3RyaW5nOwotCQl0cnkgewotCQkJZXByb2MucHVzaE1ldGhvZEludm9jYXRpb24oaXNTdHJpbmcgPyBtZXRob2QgOiBnZXRJREVNZXRob2RQcm94eSgoSVByb3h5TWV0aG9kKSBtZXRob2QpLmdldEJlYW4oKSwgaXNTdHJpbmcsIGhhc1JlY2VpdmVyLCBhcmdDb3VudCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hDb25kaXRpb25hbFRvUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENvbmRpdGlvbmFsVG9Qcm94eShJbnRlcm5hbENvbmRpdGlvbmFsT3BlcmFuZFR5cGUgZXhwcmVzc2lvblR5cGUpIHsKLQkJZXByb2MucHVzaENvbmRpdGlvbmFsKGV4cHJlc3Npb25UeXBlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJbnZva2UoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hJbnZva2UoaW50IHByb3h5Y291bnQsIExpc3QgZXhwcmVzc2lvblByb3hpZXMpIHRocm93cyBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBJbiB0aGUgSURFIGNhc2UgZG8gbm90aGluZy4gTm90aGluZyBpcyBwZW5kaW5nLiBCdXQgc3RpbGwgbmVlZCB0byBoYW5kbGUgcHJveHkgcmVzb2x1dGlvbi4KLQkJcHJvY2Vzc0V4dGVuc2lvblByb3hpZXMocHJveHljb3VudCwgZXhwcmVzc2lvblByb3hpZXMpOwotCQlwcm9jZXNzRXhwcmVzc2lvbkVycm9yKCk7IAotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgYXMgYm90aCBhbiBFeHByZXNzaW9uUHJveHkgKGkuZS4gSURFIHNpZGUpIGFuZCB0aGUgRXhwcmVzc2lvbnMgZXhwcmVzc2lvbiBwcm94eSByZXN1bHQgb24gdGhlIG90aGVyIHNpZGUuCi0JICogVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8ganVzdCB1c2Ugc2FtZSBpbnN0YW5jZSBvbiBib3RoIHNpZGVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSURFRXhwcmVzc2lvblByb3h5IGV4dGVuZHMgRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgewotCQkKLQkJcHJvdGVjdGVkIElERUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlpZCwgaW50IHByb3h5VHlwZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQlzdXBlcihwcm94eWlkLCBwcm94eVR5cGUsIGV4cHJlc3Npb24pOwotCQl9Ci0JCQotCQlwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQkJcHJpdmF0ZSBDbGFzcyB0eXBlOwotCQlwcml2YXRlIGJvb2xlYW4gc2V0OwotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkjZGlzcG9zZSgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJdmFsdWUgPSBudWxsOwotCQkJdHlwZSA9IG51bGw7Ci0JCQlzZXQgPSBmYWxzZTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjZ2V0VHlwZSgpCi0JCSAqLwotCQlwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNnZXRWYWx1ZSgpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I3NldFByb3h5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFByb3h5KE9iamVjdCB2YWx1ZSwgQ2xhc3MgdHlwZSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXNldCA9IHRydWU7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjaXNTZXQoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNTZXQoKSB7Ci0JCQlyZXR1cm4gc2V0OwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBFeHByZXNzaW9uIHByb3h5IGZvciBJREUgQmVhblR5cGVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSURFQmVhblR5cGVFeHByZXNzaW9uUHJveHkgZXh0ZW5kcyBJREVFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJQmVhblR5cGVFeHByZXNzaW9uUHJveHkgewotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0JCXByaXZhdGUgSURFQmVhblR5cGVQcm94eSByZXNvbHZlZFByb3h5OwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcHJveHlpZAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgSURFQmVhblR5cGVFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJc3VwZXIocHJveHlpZCwgQkVBTlRZUEVfRVhQUkVTU0lPTl9QUk9YWSwgZXhwcmVzc2lvbik7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqICAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlRXhwcmVzc2lvblByb3h5I3NldFR5cGVOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJfQotCQkKLQkJLyoKLQkJICogIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRUeXBlTmFtZSgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQkJcmV0dXJuIHR5cGVOYW1lOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiIC0gIitnZXRUeXBlTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQ2FsbGVkIGJ5IElERUV4cHJlc3Npb24gdG8gcmVzb2x2ZSB0aGUgYmVhbnR5cGUuCi0JCSAqIEBwYXJhbSBiZWFudHlwZVByb3h5Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0UHJveHkoSURFQmVhblR5cGVQcm94eSBiZWFudHlwZVByb3h5KSB7Ci0JCQl0aGlzLnJlc29sdmVkUHJveHkgPSBiZWFudHlwZVByb3h5OwotCQkJc2V0UHJveHkocmVzb2x2ZWRQcm94eS5nZXRUeXBlQ2xhc3MoKSwgQ2xhc3MuY2xhc3MpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ2FsbGVkIGJ5IElERUV4cHJlc3Npb24gdG8gZ2V0IHRoZSByZXNvbHZlZCBiZWFudHlwZSBwcm94eS4KLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlJREVCZWFuVHlwZVByb3h5IGdldEJlYW5UeXBlUHJveHkoKSB7Ci0JCQlyZXR1cm4gcmVzb2x2ZWRQcm94eTsKLQkJfQotCi0JCS8qCi0JCSAqICAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0TWV0aG9kUHJveHkob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlW10pCi0JCSAqLwotCQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCQlJUHJveHlNZXRob2QgbWV0aG9kID0gKChJREVFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRNZXRob2RFeHByZXNzaW9uUHJveHkodGhpcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJLy8gTmVlZCB0byBnbyB0byB0aGUgZXhwcmVzc2lvbiBhbmQgY3JlYXRlIGl0LgotCQkJCW1ldGhvZCA9ICgoRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuY3JlYXRlTWV0aG9kRXhwcmVzc2lvblByb3h5KHRoaXMsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJCX0KLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSNnZXRNZXRob2RQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdKQotCQkgKi8KLQkJcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJCXJldHVybiAoKElERU1ldGhvZFByb3h5RmFjdG9yeSkgZXhwcmVzc2lvbi5nZXRSZWdpc3RyeSgpLmdldE1ldGhvZFByb3h5RmFjdG9yeSgpKS5nZXRNZXRob2RQcm94eShleHByZXNzaW9uLCB0aGlzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUHJveHlNZXRob2QgZ2V0TWV0aG9kUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJCXJldHVybiBnZXRNZXRob2RQcm94eShleHByZXNzaW9uLCBtZXRob2ROYW1lLCAoSVByb3h5QmVhblR5cGVbXSkgbnVsbCk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUjZ2V0RmllbGRQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJCUlQcm94eUZpZWxkIGZpZWxkID0gKChJREVFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRGaWVsZEV4cHJlc3Npb25Qcm94eSh0aGlzLCBmaWVsZE5hbWUpOwotCQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCQkvLyBOZWVkIHRvIGdvIHRvIHRoZSBleHByZXNzaW9uIGFuZCBjcmVhdGUgaXQuCi0JCQkJZmllbGQgPSAoKEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmNyZWF0ZUZpZWxkRXhwcmVzc2lvblByb3h5KHRoaXMsIGZpZWxkTmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmllbGQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIEV4cHJlc3Npb24gcHJveHkgZm9yIElERSBCZWFuVHlwZXMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJREVNZXRob2RFeHByZXNzaW9uUHJveHkgZXh0ZW5kcyBJREVFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJUHJveHlNZXRob2QgewotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZTsKLQkJcHJpdmF0ZSBJREVNZXRob2RQcm94eSByZXNvbHZlZFByb3h5OwotCQlwcml2YXRlIFRocm93YWJsZVByb3h5IGVycm9yVGhyb3dhYmxlOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcHJveHlpZAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgSURFTWV0aG9kRXhwcmVzc2lvblByb3h5KGludCBwcm94eWlkLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJCXN1cGVyKHByb3h5aWQsIE1FVEhPRF9FWFBSRVNTSU9OX1BST1hZLCBleHByZXNzaW9uKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldCBieSBJREVFeHByZXNzaW9uIHdpdGggdGhlIG1ldGhvZCBuYW1lLgotCQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJCXRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0JCX0KLQkJCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkrIiAtICIrbWV0aG9kTmFtZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIENhbGxlZCBieSBJREVFeHByZXNzaW9uIHRvIHJlc29sdmUgdGhlIGJlYW50eXBlLgotCQkgKiBAcGFyYW0gbWV0aG9kUHJveHkKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJdm9pZCBzZXRQcm94eShJREVNZXRob2RQcm94eSBtZXRob2RQcm94eSkgewotCQkJdGhpcy5yZXNvbHZlZFByb3h5ID0gbWV0aG9kUHJveHk7Ci0JCQlzZXRQcm94eShyZXNvbHZlZFByb3h5LmdldEJlYW4oKSwgQ2xhc3MuY2xhc3MpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ2FsbGVkIGJ5IElERUV4cHJlc3Npb24gdG8gc2F5IHRoZXJlIHdhcyBlcnJvciBpbiBjcmVhdGluZyB0aGUgcHJveHkuCi0JCSAqIEBwYXJhbSBlcnJvclRocm93YWJsZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldFRocm93YWJsZShUaHJvd2FibGVQcm94eSBlcnJvclRocm93YWJsZSkgewotCQkJdGhpcy5lcnJvclRocm93YWJsZSA9IGVycm9yVGhyb3dhYmxlOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ2FsbGVkIGJ5IElERUV4cHJlc3Npb24gdG8gZ2V0IHRoZSByZXNvbHZlZCBtZXRob2QgcHJveHkuCi0JCSAqIEByZXR1cm4KLQkJICogQHRocm93cyBUaHJvd2FibGVQcm94eQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlJREVNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCQlpZiAoZXJyb3JUaHJvd2FibGUgIT0gbnVsbCkKLQkJCQl0aHJvdyBlcnJvclRocm93YWJsZTsKLQkJCXJldHVybiByZXNvbHZlZFByb3h5OwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSURFRmllbGRFeHByZXNzaW9uUHJveHkgZXh0ZW5kcyBJREVFeHByZXNzaW9uUHJveHkgaW1wbGVtZW50cyBJUHJveHlGaWVsZCB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBmaWVsZE5hbWU7Ci0JCXByaXZhdGUgSURFRmllbGRQcm94eSByZXNvbHZlZFByb3h5OwotCQlwcml2YXRlIFRocm93YWJsZVByb3h5IGVycm9yVGhyb3dhYmxlOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcHJveHlpZAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgSURFRmllbGRFeHByZXNzaW9uUHJveHkoaW50IHByb3h5aWQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJc3VwZXIocHJveHlpZCwgRklFTERfRVhQUkVTU0lPTl9QUk9YWSwgZXhwcmVzc2lvbik7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXQgYnkgSURFRXhwcmVzc2lvbiB3aXRoIHRoZSBtZXRob2QgbmFtZS4KLQkJICogQHBhcmFtIGZpZWxkTmFtZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJCXRoaXMuZmllbGROYW1lID0gZmllbGROYW1lOwotCQl9Ci0JCQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpKyIgLSAiK2ZpZWxkTmFtZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIENhbGxlZCBieSBJREVFeHByZXNzaW9uIHRvIHJlc29sdmUgdGhlIGJlYW50eXBlLgotCQkgKiBAcGFyYW0gZmllbGRQcm94eQotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQl2b2lkIHNldFByb3h5KElERUZpZWxkUHJveHkgZmllbGRQcm94eSkgewotCQkJdGhpcy5yZXNvbHZlZFByb3h5ID0gZmllbGRQcm94eTsKLQkJCXNldFByb3h5KHJlc29sdmVkUHJveHkuZ2V0QmVhbigpLCBDbGFzcy5jbGFzcyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgYnkgSURFRXhwcmVzc2lvbiB0byBzYXkgdGhlcmUgd2FzIGVycm9yIGluIGNyZWF0aW5nIHRoZSBwcm94eS4KLQkJICogQHBhcmFtIGVycm9yVGhyb3dhYmxlCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXZvaWQgc2V0VGhyb3dhYmxlKFRocm93YWJsZVByb3h5IGVycm9yVGhyb3dhYmxlKSB7Ci0JCQl0aGlzLmVycm9yVGhyb3dhYmxlID0gZXJyb3JUaHJvd2FibGU7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgYnkgSURFRXhwcmVzc2lvbiB0byBnZXQgdGhlIHJlc29sdmVkIGZpZWxkIHByb3h5LgotCQkgKiBAcmV0dXJuCi0JCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJSURFRmllbGRQcm94eSBnZXRGaWVsZFByb3h5KCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJCWlmIChlcnJvclRocm93YWJsZSAhPSBudWxsKQotCQkJCXRocm93IGVycm9yVGhyb3dhYmxlOwotCQkJcmV0dXJuIHJlc29sdmVkUHJveHk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNjcmVhdGVFeHByZXNzaW9uUHJveHkoaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb25Qcm94eSBjcmVhdGVFeHByZXNzaW9uUHJveHkoaW50IHByb3h5VHlwZSwgaW50IHByb3h5SUQpIHsKLQkJc3dpdGNoIChwcm94eVR5cGUpIHsKLQkJCWNhc2UgTk9STUFMX0VYUFJFU1NJT05fUFJPWFk6Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBuZXcgSURFRXhwcmVzc2lvblByb3h5KHByb3h5SUQsIE5PUk1BTF9FWFBSRVNTSU9OX1BST1hZLCB0aGlzKTsKLQkJCQotCQkJY2FzZSBCRUFOVFlQRV9FWFBSRVNTSU9OX1BST1hZOgotCQkJCXJldHVybiBuZXcgSURFQmVhblR5cGVFeHByZXNzaW9uUHJveHkocHJveHlJRCwgdGhpcyk7Ci0JCQkJCi0JCQljYXNlIE1FVEhPRF9FWFBSRVNTSU9OX1BST1hZOgotCQkJCXJldHVybiBuZXcgSURFTWV0aG9kRXhwcmVzc2lvblByb3h5KHByb3h5SUQsIHRoaXMpOwotCQkJCQotCQkJY2FzZSBGSUVMRF9FWFBSRVNTSU9OX1BST1hZOgotCQkJCXJldHVybiBuZXcgSURFRmllbGRFeHByZXNzaW9uUHJveHkocHJveHlJRCwgdGhpcyk7Ci0JCX0KLQkJCi0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEFzc2lnbm1lbnRUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQXNzaWdubWVudFRvUHJveHkoRXhwcmVzc2lvblByb3h5IHByb3h5KSB7Ci0JCWVwcm9jLnB1c2hBc3NpZ25tZW50KChJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSkgcHJveHkpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hBc3NpZ25tZW50VG9Qcm94eSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEFzc2lnbm1lbnRUb1Byb3h5KCkgewotCQllcHJvYy5wdXNoQXNzaWdubWVudCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaEJsb2NrQmVnaW5Ub1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmxvY2tCZWdpblRvUHJveHkoaW50IGJsb2NrTnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hCbG9ja0JlZ2luKGJsb2NrTnVtYmVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQmxvY2tFbmRUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmxvY2tFbmRUb1Byb3h5KGludCBibG9ja051bWJlcikgewotCQllcHJvYy5wdXNoQmxvY2tFbmQoYmxvY2tOdW1iZXIpOwotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hCbG9ja0JyZWFrVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEJsb2NrQnJlYWtUb1Byb3h5KGludCBibG9ja051bWJlcikgewotCQllcHJvYy5wdXNoQmxvY2tCcmVhayhibG9ja051bWJlcik7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRyeUJlZ2luVG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyeUJlZ2luVG9Qcm94eShpbnQgdHJ5TnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hUcnlCZWdpbih0cnlOdW1iZXIpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRyeUNhdGNoQ2xhdXNlVG9Qcm94eShpbnQsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFRyeUNhdGNoQ2xhdXNlVG9Qcm94eShpbnQgdHJ5TnVtYmVyLCBJUHJveHlCZWFuVHlwZSBleGNlcHRpb25UeXBlLCBFeHByZXNzaW9uUHJveHkgZXApIHsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hUcnlDYXRjaENsYXVzZSh0cnlOdW1iZXIsIGdldElERUJlYW5UeXBlUHJveHkoZXhjZXB0aW9uVHlwZSkuZ2V0VHlwZUNsYXNzKCksIChJbnRlcm5hbEV4cHJlc3Npb25Qcm94eSkgZXApOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb24jcHVzaFRyeUZpbmFsbHlDbGF1c2VUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJ5RmluYWxseUNsYXVzZVRvUHJveHkoaW50IHRyeU51bWJlcikgewotCQllcHJvYy5wdXNoVHJ5RmluYWxseUNsYXVzZSh0cnlOdW1iZXIpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hUcnlFbmRUb1Byb3h5KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJ5RW5kVG9Qcm94eShpbnQgdHJ5TnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hUcnlFbmQodHJ5TnVtYmVyKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoVGhyb3dUb1Byb3h5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVGhyb3dUb1Byb3h5KCkgewotCQllcHJvYy5wdXNoVGhyb3dFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hSZXRocm93VG9Qcm94eShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFJldGhyb3dUb1Byb3h5KGludCB0cnlOdW1iZXIpIHsKLQkJZXByb2MucHVzaFRyeVJldGhyb3codHJ5TnVtYmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoQmVhblR5cGVUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoQmVhblR5cGVUb1Byb3h5KElCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSBwcm94eSkgewotCQl0cnkgewotCQkJSURFQmVhblR5cGVFeHByZXNzaW9uUHJveHkgZXAgPSAoSURFQmVhblR5cGVFeHByZXNzaW9uUHJveHkpIHByb3h5OwotCQkJSURFQmVhblR5cGVQcm94eSB0eXBlUHJveHkgPSBnZXRJREVCZWFuVHlwZVByb3h5KHByb3h5LmdldFR5cGVOYW1lKCkpOwotCQkJZXAuc2V0UHJveHkodHlwZVByb3h5KTsKLQkJCWVwcm9jLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KGVwKTsKLQkJCWlmICghdHlwZVByb3h5LmlzVmFsaWQoKSkgewotCQkJCVRocm93YWJsZSBjYXVzZSA9ICgoSURFSW5pdEVycm9yQmVhblR5cGVQcm94eSkgdHlwZVByb3h5KS5nZXRDYXVzZSgpOwotCQkJCWlmIChjYXVzZSA9PSBudWxsKQotCQkJCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoCi0JCQkJCQkJbmV3IEV4Y2VwdGlvbih0eXBlUHJveHkuZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpKSwKLQkJCQkJCQlnZXRJREVCZWFuVHlwZUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KEV4Y2VwdGlvbi5jbGFzcykpOwotCQkJCWVsc2UKLQkJCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KAotCQkJCQkJCWNhdXNlLAotCQkJCQkJCWdldElERUJlYW5UeXBlRmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoY2F1c2UuZ2V0Q2xhc3MoKSkpOwotCi0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWVwcm9jLnByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtYXAgb2YgSVByb3h5QmVhblR5cGVzIGZvciBhIGJlYW50eXBlIG5hbWUuIE1lYW50IHRvIGJlIHVzZWQgb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIElERVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5LgotCSAqIEl0IGlzIGhlcmUgc28gdGhlIElEREVTdGFuZGFyZEJlYW5UeXBlRmFjdG9yeSBjYW4gc3RvcmUgcGVuZGluZyBwcm94aWVzIHBlciBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBiZWFuVHlwZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0QmVhblR5cGUoU3RyaW5nIGJlYW5UeXBlTmFtZSkgewotCQlpZiAoYmVhblR5cGVDYWNoZSA9PSBudWxsKQotCQkJYmVhblR5cGVDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiAoSVByb3h5QmVhblR5cGUpIGJlYW5UeXBlQ2FjaGUuZ2V0KGJlYW5UeXBlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgYmVhbnR5cGUgZXhwcmVzc2lvbiBwcm94eSB0byB0aGUgbWFwIG9mIGJlYW4gdHlwZSBleHByZXNzaW9uIHByb3hpZXMuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBJREVTdGFuZGFyZEJlYW5UeXBlRmFjdG9yeS4KLQkgKiBJdCBpcyBoZXJlIHNvIHRoZSBJREVTdGFuZGFyZEJlYW5UeXBlRmFjdG9yeSBjYW4gc3RvcmUgcGVuZGluZyBwcm94aWVzIHBlciBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBiZWFuVHlwZU5hbWUKLQkgKiBAcGFyYW0gYmVhbnR5cGUKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCZWFuVHlwZShTdHJpbmcgYmVhblR5cGVOYW1lLCBJUHJveHlCZWFuVHlwZSBiZWFudHlwZSkgewotCQliZWFuVHlwZUNhY2hlLnB1dChiZWFuVHlwZU5hbWUsIGJlYW50eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBiZWFudHlwZSBleHByZXNzaW9uIHByb3h5IGZyb20gdGhlIG1hcC4gVGhpcyBpcyBjYWxsZWQgYmVjYXVzZSB0aGVyZSB3YXMgYSByb2xsYmFjayBkdWUgdG8gYW4gZW5kbWFyay4KLQkgKiBAcGFyYW0gYmVhblR5cGVOYW1lCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQmVhblR5cGUoU3RyaW5nIGJlYW5UeXBlTmFtZSkgewotCQliZWFuVHlwZUNhY2hlLnJlbW92ZShiZWFuVHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEtlZXBpbmcgYSBsb2NhbCBtYXAgb2YgTWV0aG9kIEV4cHJlc3Npb24gUHJveGllcyBzbyB0aGF0IHdlIGRvbid0IGtlZXAgcmVjcmVhdGluZyB0aGVtIGZvciBlYWNoIHJlcXVlc3QgZnJvbSB3aXRoaW4gdGhpcyBleHByZXNzaW9uLgotCSAqIFRoZSBtYXAgd2lsbCBiZTogIGRlY2xhcmluZ1R5cGVOYW1lLT4oTWFwKSBtZXRob2ROYW1lIG9yIElERU1ldGhvZEtleSAtPiBtZXRob2QgZXhwcmVzc2lvbiBwcm94eS4gCi0JICogQHNlZSBJREVFeHByZXNzaW9uI3B1c2hNZXRob2RUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSwgSVByb3h5QmVhblR5cGUsIFN0cmluZywgSVByb3h5QmVhblR5cGVbXSkgZm9yIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uIAotCSAqLwotCXByb3RlY3RlZCBNYXAgbWV0aG9kRXhwcmVzc2lvblByb3hpZXM7Ci0JCi0JLyoqCi0JICogS2VlcGluZyBhIGxvY2FsIG1hcCBvZiBGaWVsZCBFeHByZXNzaW9uIFByb3hpZXMgc28gdGhhdCB3ZSBkb24ndCBrZWVwIHJlY3JlYXRpbmcgdGhlbSBmb3IgZWFjaCByZXF1ZXN0IGZyb20gd2l0aGluIHRoaXMgZXhwcmVzc2lvbi4KLQkgKiBUaGUgbWFwIHdpbGwgYmU6ICBkZWNsYXJpbmdUeXBlTmFtZS0+KE1hcCkgZmllbGRuYW1lIC0+IGZpZWxkIGV4cHJlc3Npb24gcHJveHkuIAotCSAqIEBzZWUgSURFRXhwcmVzc2lvbiNwdXNoRmllbGRUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSwgSVByb3h5QmVhblR5cGUsIFN0cmluZykgCi0JICovCi0JcHJvdGVjdGVkIE1hcCBmaWVsZEV4cHJlc3Npb25Qcm94aWVzOwotCQotCS8qKgotCSAqIEtlZXBpbmcgYSBsb2NhbCBtYXAgb2YgQmVhblR5cGUgZXhwcmVzc2lvbiBwcm94aWVzIHNvIHRoYXQgd2UgZG9uJ3Qga2VlcCByZWNyZWF0aW5nIHRoZW0gZm9yIGVhY2ggcmVxdWVzdCBmcm9tIHdpdGhpbiB0aGlzIGV4cHJlc3Npb24uCi0JICogVGhlIG1hcCB3aWxsIGJlOiB0eXBlbmFtZS0+YmVhblR5cGVFeHByZXNzaW9uUHJveHkKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGJlYW5UeXBlQ2FjaGU7CS8vIFVzZSB0byBjYWNoZSBwZW5kaW5nIEJlYW5UeXBlcy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIElERVN0YW5kYXJkQmVhblR5cGVGYWN0b3J5LgotCi0JLyoKLQkgKiBVc2VkIGFzIHRoZSBrZXkgdG8gdGhlIG1ldGhvZENhY2hlIHdoZW4gdGhlcmUgYXJlIHBhcm1zLgotCSAqIEl0IGFsbG93cyB0aGUgcGFybXMgdG8gYmUgZWl0aGVyIElQcm94eUJlYW5UeXBlIHdpdGhvdXQgdGhlCi0JICogb3ZlcmhlYWQgb2YgY3JlYXRpbmcgY29tcGxpY2F0ZWQgc3RyaW5ncy4KLQkgKiAKLQkgKiBJdCB3aWxsIGNvbXBhcmUgbWV0aG9kIG5hbWUgYW5kIGVhY2ggaW5kaXZpZHVhbCBwYXJtIG5hbWUgd2l0aG91dCBmbHVmZmluZwotCSAqIHVwIGEgc3RyaW5nIGFuZCBidWlsZGluZyBpdCB1cC4KLQkgKiAKLQkgKiBGb3Igbm8gcGFybSBtZXRob2RzLCBqdXN0IHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYXMgYSBzdHJpbmcgd2lsbCBiZSB0aGUga2V5LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGhvZEtleSB7Ci0JCXB1YmxpYyBTdHJpbmcgbWV0aG9kTmFtZTsKLQkJcHVibGljIElQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzOwotCQlwdWJsaWMgTWV0aG9kS2V5KFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcm1UeXBlcykgewotCQkJdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLQkJCXRoaXMucGFybVR5cGVzID0gcGFybVR5cGVzOwotCQl9Ci0JCQkJCi0JCQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoTWV0aG9kS2V5KSBvYmopLmNvbXBhcmVQYXJtcyhwYXJtVHlwZXMpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTVByb3h5Q29uc3RhbnRzLk1ldGhvZEtleSNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IGggPSBtZXRob2ROYW1lLmhhc2hDb2RlKCk7OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQloICs9IHBhcm1UeXBlc1tpXS5nZXRUeXBlTmFtZSgpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaDsKLQkJfQotCQkJCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5SRU1Qcm94eUNvbnN0YW50cy5NZXRob2RLZXkjY29tcGFyZVBhcm1zKGphdmEubGFuZy5TdHJpbmdbXSkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVQYXJtcyhJUHJveHlCZWFuVHlwZVtdIHBhcm1zKSB7Ci0JCQlpZiAocGFybXMubGVuZ3RoICE9IHBhcm1UeXBlcy5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcGFybVR5cGVzW2ldLmdldFR5cGVOYW1lKCkuZXF1YWxzKHBhcm1zW2ldLmdldFR5cGVOYW1lKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoTWV0aG9kVG9Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHksIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eUJlYW5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZVtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hNZXRob2RUb1Byb3h5KEV4cHJlc3Npb25Qcm94eSBwcm94eSwgSVByb3h5QmVhblR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJdHJ5IHsKLQkJCWZpbmFsIE1hcCBtZXRob2RzID0gZ2V0TWV0aG9kcyhkZWNsYXJpbmdUeXBlKTsKLQkJCWZpbmFsIE9iamVjdCBrZXkgPSBnZXRNZXRob2RLZXkobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOyAKLQkJCW1ldGhvZHMucHV0KGtleSwgcHJveHkpOwotCQkJcHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlcigpIHsKLQkJCQotCQkJCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCQltZXRob2RzLnJlbW92ZShrZXkpOwkvLyBCYWNrIGl0IG91dC4gdGlzIGNvdWxkIGhhcHBlbiBkdWUgdG8gZW5kbWFyayByb2xsYmFjay4KLQkJCQl9Ci0JCQkKLQkJCX0pOwotCQkJCi0JCQlJREVNZXRob2RFeHByZXNzaW9uUHJveHkgZXAgPSAoSURFTWV0aG9kRXhwcmVzc2lvblByb3h5KSBwcm94eTsKLQkJCWVwLnNldE1ldGhvZE5hbWUobWV0aG9kTmFtZSk7Ci0JCQkvLyBXZSByZXNvbHZlIGltbWVkaWF0ZWx5LiBBbnkgZXhwcmVzc2lvbiBwcm94aWVzIHNob3VsZCBhbHNvIGJlIHJlc29sdmVkIGF0IHRoaXMgcG9pbnQgdG9vLgotCQkJQ2xhc3MgZGVjbGFyaW5nQ2xhc3MgPSBnZXRJREVCZWFuVHlwZVByb3h5KGRlY2xhcmluZ1R5cGUpLmdldFR5cGVDbGFzcygpOwotCQkJQ2xhc3NbXSBwYXJhbWV0ZXJDbGFzc2VzOwotCQkJaWYgKHBhcmFtZXRlclR5cGVzID09IG51bGwgfHwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDApCi0JCQkJcGFyYW1ldGVyQ2xhc3NlcyA9IG51bGw7Ci0JCQllbHNlIHsKLQkJCQlwYXJhbWV0ZXJDbGFzc2VzID0gbmV3IENsYXNzW3BhcmFtZXRlclR5cGVzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXBhcmFtZXRlckNsYXNzZXNbaV0gPSBnZXRJREVCZWFuVHlwZVByb3h5KHBhcmFtZXRlclR5cGVzW2ldKS5nZXRUeXBlQ2xhc3MoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJREVNZXRob2RQcm94eSBtZXRob2RQcm94eSA9ICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSByZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkuZ2V0TWV0aG9kUHJveHkoZGVjbGFyaW5nQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckNsYXNzZXMpOwotCQkJaWYgKG1ldGhvZFByb3h5ID09IG51bGwpIHsKLQkJCQlTdHJpbmcgcGFybXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJhbWV0ZXJUeXBlcyAhPSBudWxsICYmIHBhcmFtZXRlclR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJU3RyaW5nQnVmZmVyIHN0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpID4gMCkKLQkJCQkJCQlzdC5hcHBlbmQoJywnKTsKLQkJCQkJCXN0LmFwcGVuZChwYXJhbWV0ZXJUeXBlc1tpXS5nZXRUeXBlTmFtZSgpKTsKLQkJCQkJfQotCQkJCQlwYXJtcyA9IHN0LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eShuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJObyBtZXRob2Q6ICIrZGVjbGFyaW5nVHlwZSsnLicrbWV0aG9kTmFtZSsiKCIrcGFybXMrJyknKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWdldElERUJlYW5UeXBlRmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSk7Ci0JCQl9Ci0JCQkKLQkJCWVwLnNldFByb3h5KG1ldGhvZFByb3h5KTsKLQkJCWVwcm9jLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KGVwKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJKChJREVNZXRob2RFeHByZXNzaW9uUHJveHkpIHByb3h5KS5zZXRUaHJvd2FibGUoZSk7CS8vIFNvIHdlIGRvbid0IHJlY3JlYXRlIHRocm93YWJsZSBhbGwgb2YgdGhlIHRpbWUuCi0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZ2V0TWV0aG9kcyhJUHJveHlCZWFuVHlwZSBjbGFzc3R5cGUpIHsKLQkJaWYgKG1ldGhvZEV4cHJlc3Npb25Qcm94aWVzID09IG51bGwpCi0JCQltZXRob2RFeHByZXNzaW9uUHJveGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBtZXRob2RzID0gKE1hcCkgbWV0aG9kRXhwcmVzc2lvblByb3hpZXMuZ2V0KGNsYXNzdHlwZS5nZXRUeXBlTmFtZSgpKTsKLQkJaWYgKG1ldGhvZHMgPT0gbnVsbCkKLQkJCW1ldGhvZEV4cHJlc3Npb25Qcm94aWVzLnB1dChjbGFzc3R5cGUuZ2V0VHlwZU5hbWUoKSwgbWV0aG9kcyA9IG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0TWV0aG9kS2V5KFN0cmluZyBtZXRob2ROYW1lLCBJUHJveHlCZWFuVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsIHx8IHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG1ldGhvZE5hbWU7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgTWV0aG9kS2V5KG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZ2V0RmllbGRzKElQcm94eUJlYW5UeXBlIGNsYXNzdHlwZSkgewotCQlpZiAoZmllbGRFeHByZXNzaW9uUHJveGllcyA9PSBudWxsKQotCQkJZmllbGRFeHByZXNzaW9uUHJveGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBmaWVsZHMgPSAoTWFwKSBmaWVsZEV4cHJlc3Npb25Qcm94aWVzLmdldChjbGFzc3R5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0JCWlmIChmaWVsZHMgPT0gbnVsbCkKLQkJCWZpZWxkRXhwcmVzc2lvblByb3hpZXMucHV0KGNsYXNzdHlwZS5nZXRUeXBlTmFtZSgpLCBmaWVsZHMgPSBuZXcgSGFzaE1hcCgpKTsKLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIGJ5IElERUJlYW5UeXBlcyBhbmQgSURFQmVhblR5cGVFeHByZXNzaW9uUHJveHkgdG8gYWNjZXNzIGFueSBhbHJlYWR5IGNyZWF0ZWQgTWV0aG9kIEV4cHJlc3Npb24gUHJveGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZQotCSAqIEBwYXJhbSBtZXRob2ROYW1lCi0JICogQHBhcmFtIHBhcmFtZXRlclR5cGVzCi0JICogQHJldHVybiBJUHJveHlNZXRob2Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHlldCBjcmVhdGVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCUlQcm94eU1ldGhvZCBnZXRNZXRob2RFeHByZXNzaW9uUHJveHkoSVByb3h5QmVhblR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIElQcm94eUJlYW5UeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJTWFwIG1ldGhvZHMgPSBnZXRNZXRob2RzKGRlY2xhcmluZ1R5cGUpOwotCQlPYmplY3Qga2V5ID0gZ2V0TWV0aG9kS2V5KG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsgCi0JCXJldHVybiAoSVByb3h5TWV0aG9kKSBtZXRob2RzLmdldChrZXkpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgYnkgSURFQmVhblR5cGVzIGFuZCBJREVCZWFuVHlwZUV4cHJlc3Npb25Qcm94eSB0byBhY2Nlc3MgYW55IGFscmVhZHkgY3JlYXRlZCBGaWVsZCBFeHByZXNzaW9uIFByb3hpZXMuCi0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUKLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCUlQcm94eUZpZWxkIGdldEZpZWxkRXhwcmVzc2lvblByb3h5KElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJTWFwIGZpZWxkcyA9IGdldEZpZWxkcyhkZWNsYXJpbmdUeXBlKTsKLQkJcmV0dXJuIChJUHJveHlGaWVsZCkgZmllbGRzLmdldChmaWVsZE5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIElERU1ldGhvZFByb3h5IG91dCBvZiB0aGUgYWxyZWFkeSByZXNvbHZlZCBFeHByZXNzaW9uIFByb3h5IG9yIElERU1ldGhvZFByb3h5IGl0c2VsZi4KLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSURFTWV0aG9kUHJveHkgZ2V0SURFTWV0aG9kUHJveHkoSVByb3h5TWV0aG9kIG1ldGhvZCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSURFTWV0aG9kUHJveHkgbWV0aG9kUHJveHk7Ci0JCWlmIChtZXRob2QuaXNFeHByZXNzaW9uUHJveHkoKSkgewotCQkJLy8gSXQgc2hvdWxkIGFscmVhZHkgYmUgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludC4KLQkJCW1ldGhvZFByb3h5ID0gKChJREVNZXRob2RFeHByZXNzaW9uUHJveHkpIG1ldGhvZCkuZ2V0TWV0aG9kUHJveHkoKTsKLQkJfSBlbHNlCi0JCQltZXRob2RQcm94eSA9IChJREVNZXRob2RQcm94eSkgbWV0aG9kOwotCQlyZXR1cm4gbWV0aG9kUHJveHk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoRmllbGRUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eSwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEZpZWxkVG9Qcm94eShFeHByZXNzaW9uUHJveHkgcHJveHksIElQcm94eUJlYW5UeXBlIGRlY2xhcmluZ1R5cGUsIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQotCQl0cnkgewotCQkJZmluYWwgTWFwIGZpZWxkcyA9IGdldEZpZWxkcyhkZWNsYXJpbmdUeXBlKTsKLQkJCWZpZWxkcy5wdXQoZmllbGROYW1lLCBwcm94eSk7Ci0JCQlwcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyKCl7Ci0JCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChFeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCBldmVudCkgewotCQkJCQlmaWVsZHMucmVtb3ZlKGZpZWxkTmFtZSk7CS8vIHRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gYW4gZW5kbWFyay4gSXQgY291bGQgYmUgb25lIG9mIHRoZSBvbmVzIHRoYXQgYXJlIHJvbGxlZCBiYWNrLgotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQkKLQkJCUlERUZpZWxkRXhwcmVzc2lvblByb3h5IGVwID0gKElERUZpZWxkRXhwcmVzc2lvblByb3h5KSBwcm94eTsKLQkJCS8vIFdlIHJlc29sdmUgaW1tZWRpYXRlbHkuIEFueSBleHByZXNzaW9uIHByb3hpZXMgc2hvdWxkIGFsc28gYmUgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludCB0b28uCi0JCQlJREVGaWVsZFByb3h5IGZpZWxkUHJveHkgPSAoSURFRmllbGRQcm94eSkgZ2V0SURFQmVhblR5cGVQcm94eShkZWNsYXJpbmdUeXBlKS5nZXRGaWVsZFByb3h5KGZpZWxkTmFtZSk7Ci0JCQlpZiAoZmllbGRQcm94eSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkobmV3IE5vU3VjaEZpZWxkRXhjZXB0aW9uKCJObyBmaWVsZDogIitkZWNsYXJpbmdUeXBlKycuJytmaWVsZE5hbWUpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldElERUJlYW5UeXBlRmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoTm9TdWNoRmllbGRFeGNlcHRpb24uY2xhc3MpKTsKLQkJCX0KLQkJCQotCQkJZXAuc2V0UHJveHkoZmllbGRQcm94eSk7Ci0JCQllcHJvYy5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShlcCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCSgoSURFRmllbGRFeHByZXNzaW9uUHJveHkpIHByb3h5KS5zZXRUaHJvd2FibGUoZSk7CS8vIFNvIHdlIGRvbid0IHJlY3JlYXRlIHRocm93YWJsZSBhbGwgb2YgdGhlIHRpbWUuCi0JCQllcHJvYy5wcm9jZXNzRXhjZXB0aW9uKGUpOwotCQl9CQkKLQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIElERUZpZWxkUHJveHkgb3V0IG9mIHRoZSBhbHJlYWR5IHJlc29sdmVkIEV4cHJlc3Npb24gUHJveHkgb3IgSURFRmllbGRQcm94eSBpdHNlbGYuCi0JICogQHBhcmFtIGZpZWxkCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlUHJveHkKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSURFRmllbGRQcm94eSBnZXRJREVGaWVsZFByb3h5KElQcm94eUZpZWxkIGZpZWxkKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJREVGaWVsZFByb3h5IGZpZWxkUHJveHk7Ci0JCWlmIChmaWVsZC5pc0V4cHJlc3Npb25Qcm94eSgpKSB7Ci0JCQkvLyBJdCBzaG91bGQgYWxyZWFkeSBiZSByZXNvbHZlZCBhdCB0aGlzIHBvaW50LgotCQkJZmllbGRQcm94eSA9ICgoSURFRmllbGRFeHByZXNzaW9uUHJveHkpIGZpZWxkKS5nZXRGaWVsZFByb3h5KCk7Ci0JCX0gZWxzZQotCQkJZmllbGRQcm94eSA9IChJREVGaWVsZFByb3h5KSBmaWVsZDsKLQkJcmV0dXJuIGZpZWxkUHJveHk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvbiNwdXNoSWZUZXN0VG9Qcm94eSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaElmVGVzdFRvUHJveHkoKSB7Ci0JCWVwcm9jLnB1c2hJZkVsc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hJZkVsc2VUb1Byb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxJZkVsc2VPcGVyYW5kVHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoSWZFbHNlVG9Qcm94eShJbnRlcm5hbElmRWxzZU9wZXJhbmRUeXBlIGNsYXVzZVR5cGUpIHsKLQkJZXByb2MucHVzaElmRWxzZShjbGF1c2VUeXBlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uI3B1c2hOZXdJbnN0YW5jZVRvUHJveHkoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5QmVhblR5cGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVzaE5ld0luc3RhbmNlVG9Qcm94eShTdHJpbmcgaW5pdGlhbGl6YXRpb25TdHJpbmcsIElQcm94eUJlYW5UeXBlIHJlc3VsdFR5cGUpIHsKLQkJdHJ5IHsKLQkJCWVwcm9jLnB1c2hOZXdJbnN0YW5jZUZyb21TdHJpbmcoaW5pdGlhbGl6YXRpb25TdHJpbmcsIGdldElERUJlYW5UeXBlUHJveHkocmVzdWx0VHlwZSkuZ2V0VHlwZUNsYXNzKCksIGdldElERVJlZ2lzdHJ5KCkuZkNsYXNzTG9hZGVyKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJZXByb2MucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hNYXJrVG9Qcm94eShpbnQgbWFya0lEKSB7Ci0JCWVwcm9jLnB1c2hNYXJrKG1hcmtJRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaEVuZG1hcmtUb1Byb3h5KGludCBtYXJrSUQsIGJvb2xlYW4gcmVzdG9yZSkgewotCQllcHJvYy5wdXNoRW5kbWFyayhtYXJrSUQsIHJlc3RvcmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hCZWdpblRyYW5zZmVyVGhyZWFkVG9Qcm94eSgpIHsKLQkJLy8gRm9yIElERSBpdCBkb2Vzbid0IG1hdHRlci4gSnVzdCBnbyBhaGVhZCBhbmQgY29udGludWUgcHJvY2Vzc2luZy4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXNoVHJhbnNmZXJUaHJlYWRUb1Byb3h5KCkgewotCQkvLyBGb3IgSURFIGl0IGRvZXNuJ3QgbWF0dGVyLiBKdXN0IGdvIGFoZWFkIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nLgotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1c2hTdWJleHByZXNzaW9uQmVnaW5Ub1Byb3h5KGludCBzdWJleHByZXNzaW9uTnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hTdWJleHByZXNzaW9uQmVnaW4oc3ViZXhwcmVzc2lvbk51bWJlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaFN1YmV4cHJlc3Npb25FbmRUb1Byb3h5KGludCBzdWJleHByZXNzaW9uTnVtYmVyKSB7Ci0JCWVwcm9jLnB1c2hTdWJleHByZXNzaW9uRW5kKHN1YmV4cHJlc3Npb25OdW1iZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxYjI1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkgZXh0ZW5kcyBJQmVhblR5cGVQcm94eUZhY3RvcnkgewotCi1wdWJsaWMgSURFQmVhblR5cGVQcm94eSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyBjbGFzc05hbWUpOwotCi1wdWJsaWMgSURFQmVhblR5cGVQcm94eSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSUJlYW5UeXBlUHJveHkgc3VwZXJUeXBlKTsJCi0KLXB1YmxpYyBJUHJveHlCZWFuVHlwZSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGaWVsZFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUZpZWxkUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1NDE4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUZpZWxkUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUZpZWxkUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIElGaWVsZFByb3h5IHdoZXJlIHRoZSBiZWFuIHZtIGlzIHRoZSBzYW1lIGFzIHRoZSBJREUKLSAqIFRoZXJlZm9yZSB3ZSBob2xkIHRoZSBpbnN0YW5jZSBvZiBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGluIGEgZmllbGQKLSAqIGRpcmVjdGx5IGFuZCBoYXZlIGEgcGFja2FnZSBwcm90ZWN0ZWQgY29uc3RydWN0b3IgdG8gc2V0IHRoaXMKLSAqIENyZWF0aW9uIGRhdGU6ICgxLzE3LzAwIDEyOjMyOjI0IFBNKQotICogQGF1dGhvcjogSm9lIFdpbmNoZXN0ZXIKLSAqLwotcHVibGljIGNsYXNzIElERUZpZWxkUHJveHkgZXh0ZW5kcyBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkgaW1wbGVtZW50cyBJRmllbGRQcm94eSB7Ci0JcHJvdGVjdGVkIElCZWFuVHlwZVByb3h5IGZGaWVsZFR5cGU7Ci0JLyoqCi0JICogUGFja2FnZSBwcm90ZWN0ZWQgY29uc3RydWN0b3IgdGhhdCB0YWtlcyB0aGUgZmllbGQgZGlyZWN0bHkKLQkgKiBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2Ugb25seSBjbGFzc2VzIGluIHRoZSBJREUgcGFja2FnZSBjYW4gY29uc3RydWN0Ci0JICogdGhpcy4gIEV2ZXJ5b25lIGVsc2UgbXVzdCBnbyB2aWEgdGhlIHR5cGVQcm94eQotCSAqLwotCUlERUZpZWxkUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBGaWVsZCBhRmllbGQpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhRmllbGQpOwotCX0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBhbmQgcmV0dXJuIGl0IHdyYXBwZWQgaW4gYSBiZWFuIHByb3h5Ci0JICovCi0JcHVibGljIElCZWFuUHJveHkgZ2V0KElCZWFuUHJveHkgYVN1YmplY3QpIHsKLQotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJLy8gR2V0IHRoZSBmaWVsZCB2YWx1ZSBhbmQgY2F0Y2ggYW55IGVycm9ycwkKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9ICgoRmllbGQpIGdldEJlYW4oKSkuZ2V0KGFTdWJqZWN0ICE9IG51bGwgPyAoKElJREVCZWFuUHJveHkpIGFTdWJqZWN0KS5nZXRCZWFuKCkgOiBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIElmIHdlIGhhdmUgYSBub24gbnVsbCByZXN1bHQgd3JhcCBpdCBpbiBhbiBJQmVhblByb3h5IGFuZCByZXR1cm4gaXQKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eSgoKEZpZWxkKSBnZXRCZWFuKCkpLmdldFR5cGUoKSwgcmVzdWx0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBiZWFucyBmcm9tIGJvdGggb2YgdGhlIHByb3hpZXMgYW5kIGludm9rZSB0aGUgZmllbGQgc2V0IG1ldGhvZAotCSAqIENhc3QgdG8gSURFQmVhblByb3h5IGFuZCB1c2UgcGFja2FnZSBwcm90ZWN0ZWQgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElCZWFuUHJveHkgYVN1YmplY3QsIElCZWFuUHJveHkgYXJndW1lbnQpIHsKLQotCQkvLyBTZXQgdGhlIGZpZWxkIHZhbHVlIGFuZCBjYXRjaCBhbnkgZXJyb3JzCQotCQl0cnkgewotCQkJKChGaWVsZCkgZ2V0QmVhbigpKS5zZXQoCi0JCQkJYVN1YmplY3QgIT0gbnVsbCA/ICgoSUlERUJlYW5Qcm94eSkgYVN1YmplY3QpLmdldEJlYW4oKSA6IG51bGwsCi0JCQkJYXJndW1lbnQgIT0gbnVsbCA/ICgoSUlERUJlYW5Qcm94eSkgYXJndW1lbnQpLmdldEJlYW4oKSA6IG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qKgotCSAqIFRoZSB0eXBlIHByb3h5IGlzIGNvbnN0YW50IHByb3h5IG91dCBvZiB0aGUgbWV0aG9kIGZhY3RvcnkuCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpIHsKLQkJcmV0dXJuICgoSURFTWV0aG9kUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkpLmZpZWxkVHlwZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0RmllbGRUeXBlKCkgewotCQlpZiAoZkZpZWxkVHlwZSA9PSBudWxsKSB7Ci0JCQlmRmllbGRUeXBlID0KLQkJCQkoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KAotCQkJCQkoKEZpZWxkKSBnZXRCZWFuKCkpLmdldFR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZGaWVsZFR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGaWVsZFR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGaWVsZFR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZThjOWVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmllbGRUeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUZpZWxkVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIElERUZpZWxkVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JCi0JSURFRmllbGRUeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJc3VwZXIocmVnaXN0cnksIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSURFQmVhblR5cGVQcm94eSNuZXdCZWFuUHJveHkoT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpIHsKLQkJcmV0dXJuIG5ldyBJREVGaWVsZFByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKSBhbk9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGbG9hdENsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGbG9hdENsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ5MTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmxvYXRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogRmxvYXQgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblR5cGVQcm94eSB7Ci0KLXByb3RlY3RlZCBJREVGbG9hdENsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzLCBuZXcgRmxvYXQoMCkpOwotfQotSU51bWJlckJlYW5Qcm94eSBjcmVhdGVGbG9hdEJlYW5Qcm94eShGbG9hdCBhRmxvYXQpewotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxhRmxvYXQsdGhpcyk7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGbG9hdFR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWM2OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVGbG9hdFR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVGbG9hdFR5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBGbG9hdCBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotcHJvdGVjdGVkIElERUZsb2F0VHlwZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUZsb2F0QmVhblByb3h5KGZsb2F0IGFGbG9hdCl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBGbG9hdChhRmxvYXQpLHRoaXMpOwotfQotaW50IGdldFByaW1pdGl2ZVR5cGUoKXsKLQlyZXR1cm4gRkxPQVQ7Ci19Ci0KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCU51bWJlciBuID0gYW5PYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIgPyBuZXcgRmxvYXQoKChDaGFyYWN0ZXIpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKSkgOiAoTnVtYmVyKSBhbk9iamVjdDsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIG4sIHRoaXMpOwotCi19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbml0RXJyb3JCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUluaXRFcnJvckJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMzM2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUluaXRFcnJvckJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IElERUluaXRFcnJvckJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mCi0gKiB0eXBlIGNvbW1lbnRzIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIElERUluaXRFcnJvckJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NuYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBpbml0aWFsaXphdGlvbkVycm9yOwotCQotCXByb3RlY3RlZCBUaHJvd2FibGUgY2F1c2U7Ci0KLQlwcm90ZWN0ZWQgSURFSW5pdEVycm9yQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGNsYXNzbmFtZSwgU3RyaW5nIGluaXRpYWxpemF0aW9uRXJyb3IsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihyZWdpc3RyeSwgbnVsbCk7Ci0JCXRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotCQl0aGlzLmluaXRpYWxpemF0aW9uRXJyb3IgPSBpbml0aWFsaXphdGlvbkVycm9yOwotCQl0aGlzLmNhdXNlID0gY2F1c2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB0aHJvd2FibGUgKGNhdXNlKSB0aGF0IG1hZGUgdGhpcyBiZWFuIHR5cGUgYmFkLiAKLQkgKiBAcmV0dXJuIHRoZSBUaHJvd2FibGUgdGhhdCB3YXMgdGhlIGNhdXNlLCBvciBudWxsIGlmIG5vdCBjYXVzZWQgYnkgYW4gdGhyb3dhYmxlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7Ci0JCXJldHVybiBjYXVzZTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KFN0cmluZ1tdIGFyZ3VtZW50Q2xhc3NOYW1lcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0Q29uc3RydWN0b3JzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbnN0cnVjdG9yUHJveHkoU3RyaW5nW10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRDb25zdHJ1Y3RvclByb3h5KElCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldERlY2xhcmVkQ29uc3RydWN0b3JQcm94eShJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5W10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJRmllbGRQcm94eVtdIGdldEZpZWxkcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElGaWVsZFByb3h5W10gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0RmllbGRQcm94eShTdHJpbmcpCi0JICovCi0JcHVibGljIElGaWVsZFByb3h5IGdldEZpZWxkUHJveHkoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5W10gZ2V0TWV0aG9kcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElNZXRob2RQcm94eVtdIGdldERlY2xhcmVkTWV0aG9kcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShTdHJpbmcpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KFN0cmluZywgU3RyaW5nW10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gYXJndW1lbnRDbGFzc05hbWVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGFyZ3VtZW50Q2xhc3NOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0TWV0aG9kUHJveHkoU3RyaW5nLCBJQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldE1ldGhvZFByb3h5KFN0cmluZywgU3RyaW5nW10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBhcmd1bWVudENsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRNZXRob2RQcm94eShTdHJpbmcsIElCZWFuVHlwZVByb3h5W10pCi0JICovCi0JcHVibGljIElNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KFN0cmluZyBtZXRob2ROYW1lLCBJQmVhblR5cGVQcm94eVtdIGFyZ3VtZW50VHlwZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXROdWxsQ29uc3RydWN0b3JQcm94eSgpCi0JICovCi0JcHVibGljIElDb25zdHJ1Y3RvclByb3h5IGdldE51bGxDb25zdHJ1Y3RvclByb3h5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldFN1cGVyQmVhblR5cGVQcm94eSgpCi0JICovCi0JcHVibGljIElCZWFuVHlwZVByb3h5IGdldFN1cGVyQmVhblR5cGVQcm94eSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNnZXRUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEZvcm1hbFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm1hbFR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzQXJyYXkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2lzSW50ZXJmYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjaXNQcmltaXRpdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNpc0tpbmRPZihJQmVhblR5cGVQcm94eSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0tpbmRPZihJQmVhblR5cGVQcm94eSBhQmVhblByb3h5VHlwZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjbmV3SW5zdGFuY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IG5ld0luc3RhbmNlKFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldEluaXRpYWxpemF0aW9uRXJyb3IoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbGl6YXRpb25FcnJvcigpIHsKLQkJcmV0dXJuIGluaXRpYWxpemF0aW9uRXJyb3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3RvQmVhblN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JCXJldHVybiBjbGFzc25hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I2lzVmFsaWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5I2dldENvbXBhdGlibGVDb25zdHJ1Y3RvcihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eVtdKQotCSAqLwotCXB1YmxpYyBJQ29uc3RydWN0b3JQcm94eSBnZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoSUJlYW5UeXBlUHJveHlbXSBhcmd1bWVudFR5cGVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHkjZ2V0Q29tcGF0aWJsZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHlbXSkKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldENvbXBhdGlibGVNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIElCZWFuVHlwZVByb3h5W10gYXJndW1lbnRUeXBlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlckJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGVlNmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlckJlYW5Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFSW50ZWdlckJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLS8qKgotICogSURFIFByb3h5IGZvciBJbnRlZ2Vycy4gU2luY2UgSW50ZWdlcnMgd2VyZSBmaXJzdCBpbXBsZW1lbnRlZAotICogaW4gdGhlIFZDRSwgYW5kIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gcmVmZXJlbmNlZCwgd2UndmUgY3JlYXRlZAotICogYSBzdWJjbGFzcyB0byBoYW5kbGUgdGhlbS4gVGhhdCB3YXkgd2Ugd291bGRuJ3QgbmVlZCB0byBjaGFuZ2UKLSAqIGV2ZXJ5b25lIHRoYXQgd2FzIHVzaW5nIHRoZSBJSW50ZWdlclByb3h5IGludGVyZmFjZSBhbmQgd2UKLSAqIGNhbiBzdG9yZSB0aGUgaW50IHZhbHVlIHRvIHNwZWVkIHVwIGFjY2Vzcy4KLSAqLwotcHVibGljIGNsYXNzIElERUludGVnZXJCZWFuUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuUHJveHkgaW1wbGVtZW50cyBJSW50ZWdlckJlYW5Qcm94eSB7Ci0JcHJvdGVjdGVkIGludCBmSW50VmFsdWU7Ci1JREVJbnRlZ2VyQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTnVtYmVyIGFuSW50ZWdlciwgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFuSW50ZWdlciAsIGFCZWFuVHlwZVByb3h5KTsKLQlmSW50VmFsdWUgPSBhbkludGVnZXIuaW50VmFsdWUoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBpbnQgdmFsdWUKLSAqLwotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQlyZXR1cm4gZkludFZhbHVlOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVJbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllYTllYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JSW50ZWdlckJlYW5Qcm94eTsKLQotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSUludGVnZXJCZWFuVHlwZVByb3h5Ci0gKi8KLWZpbmFsIGNsYXNzIElERUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuVHlwZVByb3h5IHsKLS8vIFNvbWUgdmFsdWVzIGFyZSBjYWNoZSdkIGZvciBzcGVlZAotCXByaXZhdGUgZmluYWwgSURFSW50ZWdlckJlYW5Qcm94eSB6ZXJvSW50UHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IG9uZUludFByb3h5OwotCXByaXZhdGUgZmluYWwgSURFSW50ZWdlckJlYW5Qcm94eSB0d29JbnRQcm94eTsKLQlwcml2YXRlIGZpbmFsIElERUludGVnZXJCZWFuUHJveHkgdGhyZWVJbnRQcm94eTsKLUlERUludGVnZXJDbGFzc0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcywgbmV3IEludGVnZXIoMCkpOwotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9JbnRQcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMCksIHRoaXMgKTsJCi0Jb25lSW50UHJveHkgPSBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDEpLCB0aGlzICk7Ci0JdHdvSW50UHJveHkgPSBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShhUmVnaXN0cnksIG5ldyBJbnRlZ2VyKDIpLCB0aGlzICk7Ci0JdGhyZWVJbnRQcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMyksIHRoaXMgKTsKLQkJCi19Ci0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gY3JlYXRlIGEgYmVhbiBwcm94eQotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBldmVyeW9uZSBzaG91bGQgZ28gdGhyb3VnaCB0aGUgZmFjdG9yeSBBUEkKLSAqIHRoYXQgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIElCZWFuUHJveHlGYWN0b3J5Ci0gKi8KLUlJbnRlZ2VyQmVhblByb3h5IGNyZWF0ZUludGVnZXJCZWFuUHJveHkoSW50ZWdlciBhbkludGVnZXIpIHsKLQlzd2l0Y2goYW5JbnRlZ2VyLmludFZhbHVlKCkpewotCQljYXNlIDA6IHJldHVybiB6ZXJvSW50UHJveHkgOwotCQljYXNlIDE6IHJldHVybiBvbmVJbnRQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b0ludFByb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVJbnRQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksYW5JbnRlZ2VyLHRoaXMpOwotCX0KLX0KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCi0JcmV0dXJuIChJSURFQmVhblByb3h5KWNyZWF0ZUludGVnZXJCZWFuUHJveHkoKEludGVnZXIpYW5PYmplY3QpOwotCi19Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUludGVnZXJUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2YzZWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVJbnRlZ2VyVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JSW50ZWdlckJlYW5Qcm94eTsKLQotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSUludGVnZXJCZWFuVHlwZVByb3h5Ci0gKi8KLWZpbmFsIGNsYXNzIElERUludGVnZXJUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotLy8gU29tZSB2YWx1ZXMgYXJlIGNhY2hlJ2QgZm9yIHNwZWVkCi0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IHplcm9Qcm94eTsKLQlwcml2YXRlIGZpbmFsIElERUludGVnZXJCZWFuUHJveHkgb25lUHJveHk7Ci0JcHJpdmF0ZSBmaW5hbCBJREVJbnRlZ2VyQmVhblByb3h5IHR3b1Byb3h5OwotCXByaXZhdGUgZmluYWwgSURFSW50ZWdlckJlYW5Qcm94eSB0aHJlZVByb3h5OwotSURFSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgYUNsYXNzKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCS8vIENyZWF0ZSB0aGUgY2FjaGVkIHZhbHVlcwotCXplcm9Qcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMCksIHRoaXMgKTsKLQlvbmVQcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMSksIHRoaXMgKTsKLQl0d29Qcm94eSA9IG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGFSZWdpc3RyeSwgbmV3IEludGVnZXIoMiksIHRoaXMgKTsKLQl0aHJlZVByb3h5ID0gbmV3IElERUludGVnZXJCZWFuUHJveHkoYVJlZ2lzdHJ5LCBuZXcgSW50ZWdlcigzKSwgdGhpcyApOwotCQkKLX0KLS8qKgotICogU3RhdGljIGhlbHBlciB0byBjcmVhdGUgYSBiZWFuIHByb3h5Ci0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIGV2ZXJ5b25lIHNob3VsZCBnbyB0aHJvdWdoIHRoZSBmYWN0b3J5IEFQSQotICogdGhhdCBpcyBkZWZpbmVkIGFzIHBhcnQgb2YgSUJlYW5Qcm94eUZhY3RvcnkKLSAqLwotSUludGVnZXJCZWFuUHJveHkgY3JlYXRlSW50ZWdlckJlYW5Qcm94eShpbnQgYW5JbnQpIHsKLQlzd2l0Y2goYW5JbnQpewotCQljYXNlIDA6IHJldHVybiB6ZXJvUHJveHkgOwotCQljYXNlIDE6IHJldHVybiBvbmVQcm94eSA7Ci0JCWNhc2UgMjogcmV0dXJuIHR3b1Byb3h5IDsKLQkJY2FzZSAzOiByZXR1cm4gdGhyZWVQcm94eSA7Ci0JCWRlZmF1bHQ6IHJldHVybiBuZXcgSURFSW50ZWdlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IEludGVnZXIoYW5JbnQpLHRoaXMpOwotCX0KLX0KLS8qIFNwZWNpYWxpemVkIGZyb20gSURFQmVhblR5cGVQcm94eSB0byBlbnN1cmUgSUludGVnZXJCZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkKLSAqLwotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0JTnVtYmVyIG4gPSBhbk9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlciA/IG5ldyBJbnRlZ2VyKCgoQ2hhcmFjdGVyKSBhbk9iamVjdCkuY2hhclZhbHVlKCkpIDogKE51bWJlcikgYW5PYmplY3Q7Ci0Jc3dpdGNoKG4uaW50VmFsdWUoKSl7Ci0JCWNhc2UgMDogcmV0dXJuIHplcm9Qcm94eSA7Ci0JCWNhc2UgMTogcmV0dXJuIG9uZVByb3h5IDsKLQkJY2FzZSAyOiByZXR1cm4gdHdvUHJveHkgOwotCQljYXNlIDM6IHJldHVybiB0aHJlZVByb3h5IDsKLQkJZGVmYXVsdDogcmV0dXJuIG5ldyBJREVJbnRlZ2VyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgbiwgdGhpcyk7Ci0JfQotCQotCQotfQotaW50IGdldFByaW1pdGl2ZVR5cGUoKXsKLQlyZXR1cm4gSU5URUdFUjsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVMb25nQ2xhc3NCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwNmI1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIExvbmcgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERUxvbmdDbGFzc0JlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVOdW1iZXJCZWFuVHlwZVByb3h5IHsKLQkJCi1wcm90ZWN0ZWQgSURFTG9uZ0NsYXNzQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzLCBuZXcgTG9uZygwKSk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUxvbmdCZWFuUHJveHkoTG9uZyBhTG9uZyl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFMb25nLHRoaXMpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERUxvbmdUeXBlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTEzZWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTG9uZ1R5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVMb25nVHlwZUJlYW5UeXBlUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBMb25nIEJlYW5UeXBlIFByb3h5LgotICovCi1maW5hbCBjbGFzcyBJREVMb25nVHlwZUJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVQcmltaXRpdmVCZWFuVHlwZVByb3h5IHsKLQkKLXByb3RlY3RlZCBJREVMb25nVHlwZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZUxvbmdCZWFuUHJveHkobG9uZyBhTG9uZyl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBMb25nKGFMb25nKSx0aGlzKTsKLX0KLWludCBnZXRQcmltaXRpdmVUeXBlKCl7Ci0JcmV0dXJuIExPTkc7Ci19Ci0KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCU51bWJlciBuID0gYW5PYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIgPyBuZXcgTG9uZygoKENoYXJhY3RlcikgYW5PYmplY3QpLmNoYXJWYWx1ZSgpKSA6IChOdW1iZXIpIGFuT2JqZWN0OwotCXJldHVybiBuZXcgSURFTnVtYmVyQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgbiwgdGhpcyk7Ci19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTWV0aG9kUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTWV0aG9kUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4ZjcyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFTWV0aG9kUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFTWV0aG9kUHJveHkgZXh0ZW5kcyBJREVBY2Nlc3NpYmxlT2JqZWN0UHJveHkgaW1wbGVtZW50cyBJTWV0aG9kUHJveHkgewotCi0JcHJvdGVjdGVkIElERU1ldGhvZFByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgTWV0aG9kIGFNZXRob2QpIHsKLQkJc3VwZXIoYVJlZ2lzdHJ5LCBhTWV0aG9kKTsKLQl9Ci0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0Q2xhc3NUeXBlKCkgewotCQlyZXR1cm4gKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eSgKLQkJCSgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldERlY2xhcmluZ0NsYXNzKCkpOwotCX0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0UmV0dXJuVHlwZSgpIHsKLQkJcmV0dXJuICgoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmdldEJlYW5UeXBlUHJveHkoCi0JCQkoKE1ldGhvZCkgZ2V0QmVhbigpKS5nZXRSZXR1cm5UeXBlKCkpOwotCX0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHlbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQkJQ2xhc3NbXSBwYXJtQ2xhc3NlcyA9ICgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCUlCZWFuVHlwZVByb3h5W10gcGFybVR5cGVzID0gbmV3IElCZWFuVHlwZVByb3h5W3Bhcm1DbGFzc2VzLmxlbmd0aF07Ci0JCUlERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJcGFybVR5cGVzW2ldID0gZmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KHBhcm1DbGFzc2VzW2ldKTsKLQkJfQotCQlyZXR1cm4gcGFybVR5cGVzOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoKE1ldGhvZCkgZ2V0QmVhbigpKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgcHJveHkgaXMgY29uc3RhbnQgcHJveHkgb3V0IG9mIHRoZSBtZXRob2QgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gKChJREVNZXRob2RQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRNZXRob2RQcm94eUZhY3RvcnkoKSkubWV0aG9kVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCBkaXJlY3RseS4gIEJlY2F1c2Ugd2UgYXJlIGFuIElERU1ldGhvZFByb3h5IHdlIGNhbiBhc3N1bWUgdGhhdCBJQmVhblByb3h5Ci0JICogaXMgYW4gSURFQmVhblByb3h5IGFuZCB3ZSBjYW4gZ2V0IGl0cyBiZWFuIGRpcmVjdGx5Ci0JICovCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlKElCZWFuUHJveHkgc3ViamVjdCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJdHJ5IHsKLQkJCU9iamVjdCByZXN1bHQgPSAoKE1ldGhvZCkgZ2V0QmVhbigpKS5pbnZva2Uoc3ViamVjdCAhPSBudWxsID8gKChJSURFQmVhblByb3h5KSBzdWJqZWN0KS5nZXRCZWFuKCkgOiBudWxsLCBuZXcgT2JqZWN0WzBdKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBUaGUgcmVzdWx0IG1heSBiZSBhIGphdmEubGFuZy5JbnRlZ2VyIHdoZW4gd2UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIGFuIGludAotCQkJCS8vIFJlZmxlY3Rpb24gYWx3YXlzIGdpdmUgeW91IHRoZSBiaWcgb2JqZWN0Ci0JCQkJQ2xhc3MgcmV0dXJuVHlwZSA9ICgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldFJldHVyblR5cGUoKTsKLQkJCQlyZXR1cm4gZ2V0QmVhblByb3h5KHJldHVyblR5cGUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBhIHdyYXBwZXJlZCBleGNlcHRpb24uIFJldHVybiB0aGUgd3JhcHBlcmVkIG9uZSBzbyBpdCBsb29rcyBsaWtlCi0JCQkvLyBpdCB3YXMgdGhlIHJlYWwgb25lLgotCQkJSUJlYW5UeXBlUHJveHkgZXhjZXB0aW9uVHlwZVByb3h5ID0KLQkJCQkoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KAotCQkJCQllLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldENsYXNzKCkpOwotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4Y2VwdGlvblR5cGVQcm94eSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlCZWFuVHlwZVByb3h5IGV4Y2VwdGlvblR5cGVQcm94eSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eShleGMuZ2V0Q2xhc3MoKSk7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoZXhjLCBleGNlcHRpb25UeXBlUHJveHkpOwotCQl9Ci0JfQotCS8qKgotCSAqIERvIG5vdCB0aHJvdyBhbiBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUJlYW5Qcm94eSBpbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoSUJlYW5Qcm94eSBzdWJqZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKHN1YmplY3QpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCB3aXRoIGFyZ3VtZW50LiAgVGhlIGFyZ3VtZW50IHdpbGwgYmUgYW4gSURFQmVhblByb3h5IAotCSAqICggYmVjYXVzZSB3ZSBhcmUgYW4gSURFTWV0aG9kUHJveHkgKSBzbyB3ZSBjYW4gY2FzdCB0byBpdCBhbmQgZ2V0IHRoZSBhY3R1YWwgYmVhbgotCSAqIGl0c2VsZiBhbmQgdXNlIHRoaXMgdG8gaW52b2tlIGFnYWluc3QgbWV0aG9kIHdoaWNoIGlzIHRoZSBhY3R1YWwKLQkgKiBqYXZhLmxhbmcuUmVmbGVjdCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgYXJndW1lbnQpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0KLQkJCQkoKE1ldGhvZCkgZ2V0QmVhbigpKS5pbnZva2UoCi0JCQkJCXN1YmplY3QgIT0gbnVsbCA/ICgoSUlERUJlYW5Qcm94eSkgc3ViamVjdCkuZ2V0QmVhbigpIDogbnVsbCwKLQkJCQkJbmV3IE9iamVjdFtdIHsgYXJndW1lbnQgIT0gbnVsbCA/ICgoSUlERUJlYW5Qcm94eSkgYXJndW1lbnQpLmdldEJlYW4oKSA6IG51bGwgfSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJQ2xhc3MgcmV0dXJuVHlwZSA9ICgoTWV0aG9kKSBnZXRCZWFuKCkpLmdldFJldHVyblR5cGUoKTsKLQkJCQlyZXR1cm4gZ2V0QmVhblByb3h5KHJldHVyblR5cGUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBhIHdyYXBwZXJlZCBleGNlcHRpb24uIFJldHVybiB0aGUgd3JhcHBlcmVkIG9uZSBzbyBpdCBsb29rcyBsaWtlCi0JCQkvLyBpdCB3YXMgdGhlIHJlYWwgb25lLgotCQkJSUJlYW5UeXBlUHJveHkgZXhjZXB0aW9uVHlwZVByb3h5ID0KLQkJCQkoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KAotCQkJCQllLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldENsYXNzKCkpOwotCQkJdGhyb3cgbmV3IElERVRocm93YWJsZVByb3h5KGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4Y2VwdGlvblR5cGVQcm94eSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlCZWFuVHlwZVByb3h5IGV4Y2VwdGlvblR5cGVQcm94eSA9Ci0JCQkJKChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKSkuZ2V0QmVhblR5cGVQcm94eShleGMuZ2V0Q2xhc3MoKSk7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoZXhjLCBleGNlcHRpb25UeXBlUHJveHkpOwotCQl9Ci0JfQotCS8qKgotCSAqIEludm9rZSB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHkgYXJndW1lbnQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpbnZva2Uoc3ViamVjdCwgYXJndW1lbnQpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBJbnZva2UgdGhlIG1ldGhvZCB3aXRoIGFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgd2lsbCBiZSBJREVCZWFuUHJveHkgb2JqZWN0cwotCSAqICggYmVjYXVzZSB3ZSBhcmUgYW4gSURFTWV0aG9kUHJveHkgKSBzbyB3ZSBjYW4gY2FzdCB0byB0aGVtIGFuZCBnZXQgdGhlIGFjdHVhbCBiZWFuCi0JICogb2JqZWN0cyB0aGVtc2VsdmVzIGFuZCB1c2UgdGhlc2UgdG8gaW52b2tlIGFnYWluc3QgbWV0aG9kIHdoaWNoIGlzIHRoZSBhY3R1YWwKLQkgKiBqYXZhLmxhbmcuUmVmbGVjdCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGludm9rZShJQmVhblByb3h5IHN1YmplY3QsIElCZWFuUHJveHlbXSBhcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCU9iamVjdFtdIGJlYW5Bcmd1bWVudHMgPSBuZXcgT2JqZWN0W2FyZ3VtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3VtZW50c1tpXSAhPSBudWxsKSB7Ci0JCQkJYmVhbkFyZ3VtZW50c1tpXSA9ICgoSUlERUJlYW5Qcm94eSkgYXJndW1lbnRzW2ldKS5nZXRCZWFuKCk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCU9iamVjdCByZXN1bHQgPSAoKE1ldGhvZCkgZ2V0QmVhbigpKS5pbnZva2Uoc3ViamVjdCAhPSBudWxsID8gKChJSURFQmVhblByb3h5KSBzdWJqZWN0KS5nZXRCZWFuKCkgOiBudWxsLCBiZWFuQXJndW1lbnRzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlDbGFzcyByZXR1cm5UeXBlID0gKChNZXRob2QpIGdldEJlYW4oKSkuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCXJldHVybiBnZXRCZWFuUHJveHkocmV0dXJuVHlwZSwgcmVzdWx0KTsKLQkJCX0KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIGEgd3JhcHBlcmVkIGV4Y2VwdGlvbi4gUmV0dXJuIHRoZSB3cmFwcGVyZWQgb25lIHNvIGl0IGxvb2tzIGxpa2UKLQkJCS8vIGl0IHdhcyB0aGUgcmVhbCBvbmUuCi0JCQlJQmVhblR5cGVQcm94eSBleGNlcHRpb25UeXBlUHJveHkgPQotCQkJCSgoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSkgZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkpLmdldEJlYW5UeXBlUHJveHkoCi0JCQkJCWUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0Q2xhc3MoKSk7Ci0JCQl0aHJvdyBuZXcgSURFVGhyb3dhYmxlUHJveHkoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgZXhjZXB0aW9uVHlwZVByb3h5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJSUJlYW5UeXBlUHJveHkgZXhjZXB0aW9uVHlwZVByb3h5ID0KLQkJCQkoKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpKS5nZXRCZWFuVHlwZVByb3h5KGV4Yy5nZXRDbGFzcygpKTsKLQkJCXRocm93IG5ldyBJREVUaHJvd2FibGVQcm94eShleGMsIGV4Y2VwdGlvblR5cGVQcm94eSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogSW52b2tlIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCi0JICovCi0JcHVibGljIElCZWFuUHJveHkgaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKElCZWFuUHJveHkgc3ViamVjdCwgSUJlYW5Qcm94eVtdIGFyZ3VtZW50cykgewotCQl0cnkgewotCQkJcmV0dXJuIGludm9rZShzdWJqZWN0LCBhcmd1bWVudHMpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBleGMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlJQmVhblByb3h5IGdldEJlYW5Qcm94eShDbGFzcyByZXR1cm5UeXBlLCBPYmplY3QgYmVhbikgewotCQlyZXR1cm4gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eShyZXR1cm5UeXBlLCBiZWFuKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RQcm94eUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmNGYyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAkUkNTZmlsZTogSURFTWV0aG9kUHJveHlGYWN0b3J5LmphdmEsdiAkICRSZXZpc2lvbjogMS4xMiAkICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uTWV0aG9kSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLXB1YmxpYyBjbGFzcyBJREVNZXRob2RQcm94eUZhY3RvcnkgaW1wbGVtZW50cyBJTWV0aG9kUHJveHlGYWN0b3J5IHsKLQotCWZpbmFsIHByb3RlY3RlZCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIE1hcCBwcmltTG9va3VwID0gbmV3IEhhc2hNYXAoKTsKLQotCUlERUJlYW5UeXBlUHJveHkgYWNjZXNzaWJsZVR5cGUsIGZpZWxkVHlwZSwgbWV0aG9kVHlwZSwgY29uc3RydWN0b3JUeXBlOwotCS8vIENhY2hlZCBjb3B5IG9mIGEgZmV3IHR5cGljYWwgbWV0aG9kIHR5cGUgcHJveGllcy4KLQlzdGF0aWMgewotCQlwcmltTG9va3VwLnB1dCgiaW50IiwgSW50ZWdlci5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlwcmltTG9va3VwLnB1dCgiY2hhciIsIENoYXJhY3Rlci5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlwcmltTG9va3VwLnB1dCgibG9uZyIsIExvbmcuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbUxvb2t1cC5wdXQoInNob3J0IiwgU2hvcnQuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbUxvb2t1cC5wdXQoImRvdWJsZSIsIERvdWJsZS5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlwcmltTG9va3VwLnB1dCgiYm9vbGVhbiIsIEJvb2xlYW4uVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbUxvb2t1cC5wdXQoImJ5dGUiLCBCeXRlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCXByaW1Mb29rdXAucHV0KCJmbG9hdCIsIEZsb2F0LlRZUEUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JSURFTWV0aG9kUHJveHlGYWN0b3J5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWZQcm94eUZhY3RvcnlSZWdpc3RyeS5yZWdpc3Rlck1ldGhvZFByb3h5RmFjdG9yeSh0aGlzKTsKLQkJYWNjZXNzaWJsZVR5cGUgPSBuZXcgSURFQmVhblR5cGVQcm94eShhUmVnaXN0cnksIEFjY2Vzc2libGVPYmplY3QuY2xhc3MpOwotCQlmaWVsZFR5cGUgPSBuZXcgSURFRmllbGRUeXBlUHJveHkoYVJlZ2lzdHJ5KTsKLQkJbWV0aG9kVHlwZSA9IG5ldyBJREVNZXRob2RUeXBlUHJveHkoYVJlZ2lzdHJ5KTsKLQkJY29uc3RydWN0b3JUeXBlID0gbmV3IElERUNvbnN0cnVjdG9yVHlwZVByb3h5KGFSZWdpc3RyeSk7Ci0JCWZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShhY2Nlc3NpYmxlVHlwZSwgdHJ1ZSk7Ci0JCWZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShmaWVsZFR5cGUsIHRydWUpOwotCQlmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5yZWdpc3RlckJlYW5UeXBlUHJveHkobWV0aG9kVHlwZSwgdHJ1ZSk7Ci0JCWZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLnJlZ2lzdGVyQmVhblR5cGVQcm94eShjb25zdHJ1Y3RvclR5cGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBhbiBJREVDb25zdHJ1Y3RvclByb3h5IFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGUgb25seSBwZW9wbGUgd2hvIGNhbiB1c2UgdGhpcyBhcmUgcHJpdmVsZWRnZSBvYmplY3RzIHRoYXQKLQkgKiBoYXZlIHRoZSBhTWV0aG9kIGluc3RhbmNlLiBUaGVzZSBhcmUgcGFydCBvZiB0aGUgaWRldm0gcGFja2FnZSBvbmx5LiBJZiB5b3UgaGF2ZSB0byBtYWtlIHRoaXMgbWV0aG9kIHB1YmxpYyB5b3UgYXJlIGRvaW5nIHRoaW5ncyBpbmNvcnJlY3RseS4KLQkgKiBUbyBnZXQgYSBtZXRob2QgcHJveHkgeW91IG11c3QgdXNlIHRoZSBpbnRlcmZhY2UgbWV0aG9kcyBvbiBJTWV0aG9kUHJveHlGYWN0b3J5IHRvIGRvIGxvb2t1cCBieSBzdHJpbmcgb3IgZWxzZSBvbiBJQmVhblR5cGVQcm94eSB0aGF0IGhhcwotCSAqIGdldE1ldGhvZChTdHJpbmcpIGFzIHdlbGwKLQkgKi8KLQlJQ29uc3RydWN0b3JQcm94eSBnZXRDb25zdHJ1Y3RvclByb3h5KENvbnN0cnVjdG9yIGFDb25zdHJ1Y3RvcikgewotCi0JCXJldHVybiAoSUNvbnN0cnVjdG9yUHJveHkpIGNvbnN0cnVjdG9yVHlwZS5uZXdCZWFuUHJveHkoYUNvbnN0cnVjdG9yKTsKLQotCX0KLQkKLQlJQ29uc3RydWN0b3JQcm94eVtdIGdldENvbnN0cnVjdG9ycyhDbGFzcyBhQ2xhc3MpIHsKLQkJQ29uc3RydWN0b3JbXSBjdG9ycyA9IGFDbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJSUNvbnN0cnVjdG9yUHJveHlbXSBjdG9yUHJveGllcyA9IG5ldyBJQ29uc3RydWN0b3JQcm94eVtjdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQljdG9yUHJveGllc1tpXSA9IGdldENvbnN0cnVjdG9yUHJveHkoY3RvcnNbaV0pOwotCQl9Ci0JCXJldHVybiBjdG9yUHJveGllczsKLQl9Ci0KLQlJQ29uc3RydWN0b3JQcm94eVtdIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKENsYXNzIGFDbGFzcykgewotCQlDb25zdHJ1Y3RvcltdIGN0b3JzID0gYUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7Ci0JCUlDb25zdHJ1Y3RvclByb3h5W10gY3RvclByb3hpZXMgPSBuZXcgSUNvbnN0cnVjdG9yUHJveHlbY3RvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY3RvclByb3hpZXNbaV0gPSBnZXRDb25zdHJ1Y3RvclByb3h5KGN0b3JzW2ldKTsKLQkJfQotCQlyZXR1cm4gY3RvclByb3hpZXM7Ci0JfQotCi0JSUNvbnN0cnVjdG9yUHJveHkgZ2V0Q29uc3RydWN0b3JQcm94eShDbGFzcyBhQ2xhc3MsIENsYXNzW10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlDb25zdHJ1Y3RvciBjdG9yID0gYUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ3MpOwotCQkJcmV0dXJuIGdldENvbnN0cnVjdG9yUHJveHkoY3Rvcik7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JSUNvbnN0cnVjdG9yUHJveHkgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KENsYXNzIGFDbGFzcywgQ2xhc3NbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCUNvbnN0cnVjdG9yIGN0b3IgPSBhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihhcmdzKTsKLQkJCXJldHVybiBnZXRDb25zdHJ1Y3RvclByb3h5KGN0b3IpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCUlGaWVsZFByb3h5W10gZ2V0RmllbGRzKENsYXNzIGFDbGFzcykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGFDbGFzcy5nZXRGaWVsZHMoKTsKLQkJSUZpZWxkUHJveHlbXSBmaWVsZFByb3hpZXMgPSBuZXcgSUZpZWxkUHJveHlbZmllbGRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWVsZFByb3hpZXNbaV0gPSBnZXRGaWVsZFByb3h5KGZpZWxkc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkUHJveGllczsKLQl9Ci0KLQlJRmllbGRQcm94eVtdIGdldERlY2xhcmVkRmllbGRzKENsYXNzIGFDbGFzcykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGFDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlJRmllbGRQcm94eVtdIGZpZWxkUHJveGllcyA9IG5ldyBJRmllbGRQcm94eVtmaWVsZHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCWZpZWxkUHJveGllc1tpXSA9IGdldEZpZWxkUHJveHkoZmllbGRzW2ldKTsKLQkJfQotCQlyZXR1cm4gZmllbGRQcm94aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBhbiBJREVGaWVsZFByb3h5IFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGUgb25seSBwZW9wbGUgd2hvIGNhbiB1c2UgdGhpcyBhcmUgcHJpdmVsZWRnZSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUKLQkgKiBhRmllbGQgaW5zdGFuY2UuIFRoZXNlIGFyZSBwYXJ0IG9mIHRoZSBpZGV2bSBwYWNrYWdlIG9ubHkuIElmIHlvdSBoYXZlIHRvIG1ha2UgdGhpcyBtZXRob2QgcHVibGljIHlvdSBhcmUgZG9pbmcgdGhpbmdzIGluY29ycmVjdGx5LiBUbyBnZXQgYQotCSAqIGZpZWxkIHByb3h5IHlvdSBtdXN0IHVzZSB0aGUgaW50ZXJmYWNlIG1ldGhvZHMgb24gSUJlYW5UeXBlUHJveHkgdGhhdCBoYXMgZ2V0RmllbGQoU3RyaW5nKSBhcyB3ZWxsCi0JICovCi0JSUZpZWxkUHJveHkgZ2V0RmllbGRQcm94eShGaWVsZCBhRmllbGQpIHsKLQotCQlyZXR1cm4gKElGaWVsZFByb3h5KSBmaWVsZFR5cGUubmV3QmVhblByb3h5KGFGaWVsZCk7Ci0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSU1ldGhvZFByb3h5RmFjdG9yeSNnZXRGaWVsZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJveHlGaWVsZCBnZXRGaWVsZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJLy8gV2UgYXJlIGdldHRpbmcgdGhlIGNsYXNzIHJlc29sdmVkIHRocm91Z2ggdGhlIGV4cHJlc3Npb24uIE1pZ2h0IGFzIHdlbGwgYmVjYXVzZSBpdCBwcm9iYWJseSB3aWxsCi0JCS8vIGJlIG5lZWRlZCBhZ2FpbiBhbmQgdGhpcyB3YXkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmaW5pc2hlZCB0aGV5IHdpbGwgYmUgcmVzb2x2ZWQgZm9yIGxhdGVyIHVzYWdlLgotCQlJU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSBiZWFuVHlwZVByb3h5RmFjdG9yeSA9IGZQcm94eUZhY3RvcnlSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZSA9IGJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwcmVzc2lvbiwgY2xhc3NOYW1lKTsKLQkJcmV0dXJuIGJlYW5UeXBlLmdldEZpZWxkUHJveHkoZXhwcmVzc2lvbiwgZmllbGROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYW4gSURFTWV0aG9kUHJveHkgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZSBvbmx5IHBlb3BsZSB3aG8gY2FuIHVzZSB0aGlzIGFyZSBwcml2ZWxlZGdlIG9iamVjdHMgdGhhdCBoYXZlIHRoZQotCSAqIGFNZXRob2QgaW5zdGFuY2UuIFRoZXNlIGFyZSBwYXJ0IG9mIHRoZSBpZGV2bSBwYWNrYWdlIG9ubHkuIElmIHlvdSBoYXZlIHRvIG1ha2UgdGhpcyBtZXRob2QgcHVibGljIHlvdSBhcmUgZG9pbmcgdGhpbmdzIGluY29ycmVjdGx5LiBUbyBnZXQgYQotCSAqIG1ldGhvZCBwcm94eSB5b3UgbXVzdCB1c2UgdGhlIGludGVyZmFjZSBtZXRob2RzIG9uIElNZXRob2RQcm94eUZhY3RvcnkgdG8gZG8gbG9va3VwIGJ5IHN0cmluZyBvciBlbHNlIG9uIElCZWFuVHlwZVByb3h5IHRoYXQgaGFzCi0JICogZ2V0TWV0aG9kKFN0cmluZykgYXMgd2VsbAotCSAqLwotCUlERU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KE1ldGhvZCBhTWV0aG9kKSB7Ci0KLQkJcmV0dXJuIChJREVNZXRob2RQcm94eSkgbWV0aG9kVHlwZS5uZXdCZWFuUHJveHkoYU1ldGhvZCk7Ci0KLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQl0cnkgewotCQkJQ2xhc3MgYUNsYXNzID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5I2dldE1ldGhvZFByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElQcm94eU1ldGhvZCBnZXRNZXRob2RQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJLy8gV2UgYXJlIGdldHRpbmcgdGhlIGNsYXNzIGFuZCBwYXJtdHlwZXMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgZXhwcmVzc2lvbi4gTWlnaHQgYXMgd2VsbCBiZWNhdXNlIHRoZXkgcHJvYmFibHkgd2lsbAotCQkvLyBiZSBuZWVkZWQgYWdhaW4gYW5kIHRoaXMgd2F5IHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgZmluaXNoZWQgdGhleSB3aWxsIGJlIHJlc29sdmVkIGZvciBsYXRlciB1c2FnZS4KLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhblR5cGVQcm94eUZhY3RvcnkgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJSVByb3h5QmVhblR5cGUgYmVhblR5cGUgPSBiZWFuVHlwZVByb3h5RmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGV4cHJlc3Npb24sIGNsYXNzTmFtZSk7Ci0JCUlQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzID0gZ2V0UGFyYW1ldGVyVHlwZXMoZXhwcmVzc2lvbiwgcGFyYW1ldGVyVHlwZXMsIGJlYW5UeXBlUHJveHlGYWN0b3J5KTsKLQkJcmV0dXJuIGJlYW5UeXBlLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JfQkKLQkKLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIGZvciBCZWFudHlwZXMgYW5kIFByb3h5IGJlYW4gdHlwZXMgdG8gZ2V0IHRoZSBwcm94eS4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBjbGFzc1R5cGUKLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQotCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgSVByb3h5TWV0aG9kIGdldE1ldGhvZFByb3h5KElFeHByZXNzaW9uIGV4cHJlc3Npb24sIElQcm94eUJlYW5UeXBlIGNsYXNzVHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCS8vIFdlIGFyZSBnZXR0aW5nIHRoZSBwYXJtdHlwZXMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgZXhwcmVzc2lvbi4gTWlnaHQgYXMgd2VsbCBiZWNhdXNlIHRoZXkgcHJvYmFibHkgd2lsbAotCQkvLyBiZSBuZWVkZWQgYWdhaW4gYW5kIHRoaXMgd2F5IHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgZmluaXNoZWQgdGhleSB3aWxsIGJlIHJlc29sdmVkIGZvciBsYXRlciB1c2FnZS4KLQkJSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgYmVhblR5cGVQcm94eUZhY3RvcnkgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKTsKLQkJSVByb3h5QmVhblR5cGVbXSBwYXJtVHlwZXMgPSBnZXRQYXJhbWV0ZXJUeXBlcyhleHByZXNzaW9uLCBwYXJhbWV0ZXJUeXBlcywgYmVhblR5cGVQcm94eUZhY3RvcnkpOwotCQlyZXR1cm4gY2xhc3NUeXBlLmdldE1ldGhvZFByb3h5KGV4cHJlc3Npb24sIG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMKLQkgKiBAcGFyYW0gYmVhblR5cGVQcm94eUZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIElQcm94eUJlYW5UeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMsIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGJlYW5UeXBlUHJveHlGYWN0b3J5KSB7Ci0JCUlQcm94eUJlYW5UeXBlW10gcGFybVR5cGVzOwotCQlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCB8fCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMCkKLQkJCXBhcm1UeXBlcyA9IG51bGw7Ci0JCWVsc2UgewotCQkJcGFybVR5cGVzID0gbmV3IElQcm94eUJlYW5UeXBlW3BhcmFtZXRlclR5cGVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFybVR5cGVzW2ldID0gYmVhblR5cGVQcm94eUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eShleHByZXNzaW9uLCBwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcm1UeXBlczsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFByb3h5IGdldE1ldGhvZFByb3h5KENsYXNzIGNscywgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlDbGFzc1tdIHBhcm1DbGFzc2VzID0gbnVsbDsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQkJcGFybUNsYXNzZXMgPSBuZXcgQ2xhc3NbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1DbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUNsYXNzIHRlbXAgPSAoQ2xhc3MpIHByaW1Mb29rdXAuZ2V0KHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCQkJaWYgKHRlbXAgPT0gbnVsbCkKLQkJCQkJCXRlbXAgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkubG9hZENsYXNzKHBhcmFtZXRlclR5cGVzW2ldKTsKLQkJCQkJcGFybUNsYXNzZXNbaV0gPSB0ZW1wOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBnZXRNZXRob2RQcm94eShjbHMuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcm1DbGFzc2VzKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlJTWV0aG9kUHJveHkgZ2V0RGVjbGFyZWRNZXRob2RQcm94eShDbGFzcyBjbHMsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQl0cnkgewotCQkJQ2xhc3NbXSBwYXJtQ2xhc3NlcyA9IG51bGw7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgewotCQkJCXBhcm1DbGFzc2VzID0gbmV3IENsYXNzW3BhcmFtZXRlclR5cGVzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCQlDbGFzcyB0ZW1wID0gKENsYXNzKSBwcmltTG9va3VwLmdldChwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQkJCWlmICh0ZW1wID09IG51bGwpCi0JCQkJCQl0ZW1wID0gZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmxvYWRDbGFzcyhwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQkJCXBhcm1DbGFzc2VzW2ldID0gdGVtcDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoY2xzLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIHBhcm1DbGFzc2VzKSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0KLQlJREVNZXRob2RQcm94eSBnZXRNZXRob2RQcm94eShDbGFzcyBhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZCBtZXRob2QgPSBhQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOwotCQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KG1ldGhvZCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiVW5hYmxlIHRvIGZpbmQgbWV0aG9kICIgKyBhQ2xhc3MuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICI6IiArIG1ldGhvZE5hbWUgKyAiIGFyZ3M9IiArIGFyZ3MsIGV4YykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCUlNZXRob2RQcm94eSBnZXREZWNsYXJlZE1ldGhvZFByb3h5KENsYXNzIGFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJncykgewotCQl0cnkgewotCQkJTWV0aG9kIG1ldGhvZCA9IGFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKLQkJCXJldHVybiBnZXRNZXRob2RQcm94eShtZXRob2QpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIlVuYWJsZSB0byBmaW5kIG1ldGhvZCAiICsgYUNsYXNzLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyAiOiIgKyBtZXRob2ROYW1lICsgIiBhcmdzPSIgKyBhcmdzLCBleGMpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0JCi0KLQlJTWV0aG9kUHJveHkgZ2V0TWV0aG9kUHJveHkoSURFQmVhblR5cGVQcm94eSBhVHlwZVByb3h5LCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZFByb3h5KGFUeXBlUHJveHkuZkNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCUlNZXRob2RQcm94eVtdIGdldE1ldGhvZHMoQ2xhc3MgYUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBhQ2xhc3MuZ2V0TWV0aG9kcygpOwotCQlJTWV0aG9kUHJveHlbXSBtZXRob2RQcm94aWVzID0gbmV3IElNZXRob2RQcm94eVttZXRob2RzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJbWV0aG9kUHJveGllc1tpXSA9IGdldE1ldGhvZFByb3h5KG1ldGhvZHNbaV0pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQcm94aWVzOwotCX0KLQkKLQlJTWV0aG9kUHJveHkgZ2V0Q29tcGF0aWJsZU1ldGhvZChDbGFzcyBhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIHBhcm1UeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IE1ldGhvZEhlbHBlci5maW5kQ29tcGF0aWJsZU1ldGhvZChhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcm1UeXBlcyk7Ci0JCXJldHVybiBnZXRNZXRob2RQcm94eShtZXRob2QpOwotCX0KLQkKLQlJQ29uc3RydWN0b3JQcm94eSBnZXRDb21wYXRpYmxlQ29uc3RydWN0b3IoQ2xhc3MgYUNsYXNzLCBDbGFzc1tdIHBhcm1UeXBlcykgdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJQ29uc3RydWN0b3IgbWV0aG9kID0gTWV0aG9kSGVscGVyLmZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3IoYUNsYXNzLCBwYXJtVHlwZXMpOwotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JQcm94eShtZXRob2QpOwotCX0KLQkKLQotCUlNZXRob2RQcm94eVtdIGdldERlY2xhcmVkTWV0aG9kcyhDbGFzcyBhQ2xhc3MpIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJSU1ldGhvZFByb3h5W10gbWV0aG9kUHJveGllcyA9IG5ldyBJTWV0aG9kUHJveHlbbWV0aG9kcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCW1ldGhvZFByb3hpZXNbaV0gPSBnZXRNZXRob2RQcm94eShtZXRob2RzW2ldKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUHJveGllczsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JTWV0aG9kUHJveHlGYWN0b3J5I2dldEludm9rYWJsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10pCi0JICovCi0JcHVibGljIElJbnZva2FibGUgZ2V0SW52b2thYmxlKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kUHJveHkoY2xhc3NOYW1lLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eUZhY3RvcnkjdGVybWluYXRlRmFjdG9yeShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVNZXRob2RUeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2YTM3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU1ldGhvZFR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFTWV0aG9kVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgSURFTWV0aG9kVHlwZVByb3h5IGV4dGVuZHMgSURFQmVhblR5cGVQcm94eSB7Ci0JCi0JSURFTWV0aG9kVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXN1cGVyKHJlZ2lzdHJ5LCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MpOwotCX0KLQotCS8qCi0JICogQHNlZSBJREVCZWFuVHlwZVByb3h5I25ld0JlYW5Qcm94eShPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCkgewotCQlyZXR1cm4gbmV3IElERU1ldGhvZFByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkgYW5PYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVOdW1iZXJCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGNjMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVOdW1iZXJCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVOdW1iZXJCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotLyoqCi0gKiBJREUgSW1wbGVtZW50YXRpb24gb2YgSU51bWJlckJlYW5Qcm94eSBmb3IgYW55IE51bWJlciAoaS5lLiB0aGUgbm9uLXByaW1pdGl2ZXMpCi0gKiBJdCBjYW4gYW5zd2VyIGFsbCBvZiB0aGUgcHJpbWl0aXZlIG51bWJlciB0eXBlcyAoaW50LCBsb25nLCBzaG9ydCwgYnl0ZSwgZG91YmxlLCBmbG9hdCkuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NTQgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1wdWJsaWMgY2xhc3MgSURFTnVtYmVyQmVhblByb3h5IGV4dGVuZHMgSURFQmVhblByb3h5IGltcGxlbWVudHMgSU51bWJlckJlYW5Qcm94eSB7Ci0JcHJpdmF0ZSBmaW5hbCBOdW1iZXIgZk51bWJlclZhbHVlOwotCXByb3RlY3RlZCBJQmVhblR5cGVQcm94eSBmQmVhblR5cGVQcm94eTsKLQkKLS8qKgotICogSXQgaXMgcGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkCi0gKiBpbiBhIHNwZWNpYWwgd2F5IGFuZCBubyBvbmUgZWxzZSBzaG91bGQgY3JlYXRlIHRoZW0uCi0gKiBAcGFyYW0gYUJlYW4gamF2YS5sYW5nLk9iamVjdAotICovCi1JREVOdW1iZXJCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBOdW1iZXIgYU51bWJlciAsIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LGFOdW1iZXIpOwotCWZOdW1iZXJWYWx1ZSA9IGFOdW1iZXI7Ci0JZkJlYW5UeXBlUHJveHkgPSBhQmVhblR5cGVQcm94eTsKLX0KLS8qKgotICogZXF1YWxzOiBFcXVhbCBpZjoKLSAqICAgICAgICAgMSkgVGhpcyBwcm94eSA9PSAoaWRlbnRpdHkpIHRvIHRoZSBvdGhlciBvYmplY3QKLSAqICAgICAgICAgMikgRWxzZSBpZiBvdGhlciBpcyBhbiBJQmVhblByb3h5IGFuZCBub3QgYSBjb25zdGFudCBvbmUsIHRoZW4gaWYKLSAqICAgICAgICAgICAgZXF1YWxzIG9uIHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgIDMpIElmIHRoaXMgaXMgYSBjb25zdGFudCBwcm94eSBhbmQgdGhlIG90aGVyIGlzIHRvbyBvciBpcyBhIGNvbnN0YW50Ci0gKiAgICAgICAgICAgIHZhbHVlIChlLmcuIElTdHJpbmdCZWFuUHJveHkuZXF1YWxzKFN0cmluZyksIHRoZW4gdHJ1ZSBpZiB2YWx1ZXMgYXJlIGVxdWFscy4KLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewotCWlmICh0aGlzID09IGFuT2JqZWN0KQotCQlyZXR1cm4gdHJ1ZTsJLy8gSWRlbnRpdHkKLQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBJREVOdW1iZXJCZWFuUHJveHkpCi0JCXJldHVybiBmTnVtYmVyVmFsdWUuZXF1YWxzKCgoSURFTnVtYmVyQmVhblByb3h5KSBhbk9iamVjdCkubnVtYmVyVmFsdWUoKSk7Ci0JaWYgKGFuT2JqZWN0IGluc3RhbmNlb2YgTnVtYmVyKQotCQlyZXR1cm4gZk51bWJlclZhbHVlLmVxdWFscyhhbk9iamVjdCk7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBieXRlVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmJ5dGVWYWx1ZSgpOwotfQotLyoqCi0gKiBkb3VibGVWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLQlyZXR1cm4gZk51bWJlclZhbHVlLmRvdWJsZVZhbHVlKCk7Ci19Ci0vKioKLSAqIGZsb2F0VmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUuZmxvYXRWYWx1ZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGludCB2YWx1ZQotICovCi1wdWJsaWMgaW50IGludFZhbHVlKCkgewotCXJldHVybiBmTnVtYmVyVmFsdWUuaW50VmFsdWUoKTsKLX0KLS8qKgotICogbG9uZ1ZhbHVlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5sb25nVmFsdWUoKTsKLX0KLS8qKgotICogbnVtYmVyVmFsdWUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOdW1iZXIgbnVtYmVyVmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZTsKLX0KLS8qKgotICogc2hvcnRWYWx1ZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS5zaG9ydFZhbHVlKCk7Ci19Ci0KLS8qKgotICogVGhlIGJlYW4ncyB0b1N0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyB0b0JlYW5TdHJpbmcoKSB7Ci0JcmV0dXJuIGZOdW1iZXJWYWx1ZS50b1N0cmluZygpOwotfQotcHVibGljIElCZWFuVHlwZVByb3h5IGdldFR5cGVQcm94eSgpewotCXJldHVybiBmQmVhblR5cGVQcm94eTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFTnVtYmVyQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVOdW1iZXJCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMWMxZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVOdW1iZXJCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVOdW1iZXJCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogTnVtYmVyIEJlYW5UeXBlIFByb3h5LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSURFTnVtYmVyQmVhblR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCXByb3RlY3RlZCBmaW5hbCBJREVOdW1iZXJCZWFuUHJveHkgemVyb1Byb3h5OwotLyoqCi0gKiBJREVOdW1iZXJCZWFuVHlwZVByb3h5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gYVJlZ2lzdHJ5IGNvbS5pYm0uZXRvb2xzLnZjZS5wcm94eS5Qcm94eUZhY3RvcnlSZWdpc3RyeQotICogQHBhcmFtIGFDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLSAqLwotcHJvdGVjdGVkIElERU51bWJlckJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MsIE51bWJlciB6ZXJvTnVtYmVyKSB7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LCBhQ2xhc3MpOwotCS8vIENhY2hlIGEgemVybyBwcm94eSBvZiB0aGlzIHR5cGUgKHRob3VnaCB0aGUgbnVtYmVyIHdpbGwgYmUgTG9uZykuCi0JemVyb1Byb3h5ID0gbmV3IElERU51bWJlckJlYW5Qcm94eShhUmVnaXN0cnksIHplcm9OdW1iZXIgLCB0aGlzKTsKLX0KLS8qKgotICogSGVscGVyIHRvIGNyZWF0ZSBhIGJlYW4gcHJveHkKLSAqIFBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgZXZlcnlvbmUgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGZhY3RvcnkgQVBJCi0gKiB0aGF0IGlzIGRlZmluZWQgYXMgcGFydCBvZiBJQmVhblByb3h5RmFjdG9yeQotICovCi1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZU51bWJlckJlYW5Qcm94eShOdW1iZXIgYU51bWJlcikgewotCWlmIChhTnVtYmVyID09IG51bGwgfHwgemVyb1Byb3h5LmZCZWFuLmVxdWFscyhhTnVtYmVyKSkKLQkJcmV0dXJuIHplcm9Qcm94eTsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIGFOdW1iZXIsIHRoaXMpOwotfQotLyoqCi0gKiBTcGVjaWFsaXplZCBmcm9tIElERUJlYW5UeXBlUHJveHkgdG8gZW5zdXJlIElOdW1iZXJCZWFuUHJveGllcyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkuCi0gKi8KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCi0JcmV0dXJuIChJSURFQmVhblByb3h5KWNyZWF0ZU51bWJlckJlYW5Qcm94eSgoTnVtYmVyKSBhbk9iamVjdCk7Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFT2JqZWN0QmVhblByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERU9iamVjdEJlYW5Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY4MWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFT2JqZWN0QmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVPYmplY3RCZWFuUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFT2JqZWN0QmVhblByb3h5IGV4dGVuZHMgSURFQmVhblByb3h5IHsKLQotCXByb3RlY3RlZCBJQmVhblR5cGVQcm94eSBmQmVhblR5cGVQcm94eTsgLy8gQ2FjaGUgdGhlIHR5cGUgcHJveHkgZm9yIHNwZWVkCi0JCi1wcm90ZWN0ZWQgSURFT2JqZWN0QmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSl7Ci0Jc3VwZXIoYVJlZ2lzdHJ5KTsKLX0KLS8qKgotICogQ29uc3RydWN0b3IgdGhhdCBsZXRzIHRoZSBiZWFuIHR5cGUgYmUgc2V0IG9uIGNyZWF0aW9uLgotICogVGhpcyBzYXZlcyB0aGUgb3ZlcmhlYWQgb2YgaXQgYmVpbmcgbG9va2VkIHVwIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGFza2VkIGZvci4KLSAqCi0gKiBUaGlzIGlzIHByb3RlY3RlZCBiZWNhdXNlIHRoZSBvbmx5IHBlcnNvbgotICogd2hvIHNob3VsZCB1c2UgaXQgaXMgdGhlIElERUJlYW5UeXBlUHJveHkgb3IgYSBzdWJjbGFzcy4gIE1ha2luZyBpdCBwYWNrYWdlIHByb3RlY3RlZCBzdG9wcyBwZW9wbGUgZnJvbQotICogd3JpdGluZyBib2d1cyBjb2RlIGFuZCBkb2luZyBjYXN0cyBhbmQgc2xhbW1pbmcgbmV3IGJlYW5zIGluIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgcHJvcGVyIEFQSQotICogdGhhdCBpcyBiYXNlZCBhcm91bmQgYW55IGtpbmQgb2YgVk0gYXJ0aWZhY3QgYmVpbmcgcHJveGllZCB0byBzdXBwb3J0IHRhcmdldCBWTXMgYW5kIHBsdWdnYWJsZSBKREsKLSAqIGxldmVscyAKLSAqLwotcHJvdGVjdGVkIElERU9iamVjdEJlYW5Qcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIE9iamVjdCBhQmVhbiwgSUJlYW5UeXBlUHJveHkgYUJlYW5UeXBlUHJveHkpewotCQotCXRoaXMoYVJlZ2lzdHJ5LCBhQmVhbik7Ci0JZkJlYW5UeXBlUHJveHkgPSBhQmVhblR5cGVQcm94eTsKLQkKLX0KLS8qKgotICogU2V0IHRoZSBiZWFuIHdlIGFyZSBwcm94eWluZy4gIFdlIGFyZSBhIHByb3h5IGZvciBhIGJlYW4gcnVubmluZyBvbiB0aGUgc2FtZSBJREUKLSAqIHNvIHdlIGhvbGQgdGhlIGJlYW4gZGlyZWN0bHkgYW5kIGNhbiByZXR1cm4gaXQuIAotICovCi1wcm90ZWN0ZWQgSURFT2JqZWN0QmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFCZWFuKXsKLQl0aGlzKGFSZWdpc3RyeSk7Ci0JCi0JZkJlYW4gPSBhQmVhbjsKLQkKLX0KLS8qKgotICogVGhlIHR5cGUgcHJveHkgaXMgZ290IGZyb20gb3VyIGNsYXNzIG5hbWUKLSAqIElmIHdlIGhhdmUgdGhlIHR5cGUgcmV0dXJuIGl0LCBvdGhlcndpc2UgZ28gdGhlIGZhY3RvcnkgZm9yIGl0Ci0gKiBEb24ndCBuZXcgaXQgdXAgYmVjYXVzZSB0aGUgZmFjdG9yeSBtdXN0IGJlIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0eXBlIHByb3hpZXMgYXMgaXQKLSAqIGhhcyB0byBwZXJmb3JtIGluc3RhbmNlIG1hbmFnZW1lbnQgb24gdGhlbQotICovCi1wdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCi0JaWYgKCBmQmVhblR5cGVQcm94eSA9PSBudWxsICkgewkKLQkJZkJlYW5UeXBlUHJveHkgPSBmUHJveHlGYWN0b3J5UmVnaXN0cnkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KCBmQmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSApOwotCX0KLQlyZXR1cm4gZkJlYW5UeXBlUHJveHk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmVhNTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCQotCXN0YXRpYyBmaW5hbCBpbnQgQk9PTEVBTiA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBCWVRFID0gMjsKLQlzdGF0aWMgZmluYWwgaW50IENIQVIgPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IEZMT0FUID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IElOVEVHRVIgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgTE9ORyA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBTSE9SVCA9IDg7Ci0JCi1wdWJsaWMgSURFUHJpbWl0aXZlQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksQ2xhc3MgYUNsYXNzKXsKLQlzdXBlcihhUmVnaXN0cnksYUNsYXNzKTsKLX0KLXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCXJldHVybiB0cnVlOwotfQotYWJzdHJhY3QgaW50IGdldFByaW1pdGl2ZVR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0OTNkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFUHJveHlGYWN0b3J5UmVnaXN0cnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSVZNU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcnVucyB0aGUgQmVhbnMgaW5zaWRlIHRoZSBFY2xpcHNlIElERQotICogSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBwbHVnaW5zIHRoYXQgY2FuIGd1YXJhbnRlZSB0aGVpciB0aGVpciBiZWFucyBkbwotICogbm90IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBJREUgYW5kIGNhbiBydW4gYXQgdGhlIHNhbWUgSkRLIGxldmVsCi0gKiB0aGF0IHRoZSBFY2xpcHNlIElERSBpcyBydW5uaW5nCi0gKi8KLQotcHVibGljIGNsYXNzIElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGltcGxlbWVudHMgSVZNU2VydmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERV9SRUdJU1RSWV9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmplbS5JREUiOwkvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBmTmFtZTsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZkNsYXNzTG9hZGVyOwotCXByb3RlY3RlZCBJREVDYWxsYmFja1JlZ2lzdHJ5IGZDYWxsYmFja1JlZ2lzdHJ5OwotCQotCS8qCi0JICogU3BlY2lhbCBjbGFzc2xvYWRlciB0aGF0IGZpcnN0cyB0cmllcyB0byBsb2FkIGZyb20gYnVuZGxlIHRoZW4gdHJpZXMgZnJvbSB1cmwgcGF0aHMgc28KLQkgKiB0aGF0IGJ1bmRsZSBpcyB0cmVhdGVkIGFzIGJlaW5nIGF0IHRoZSBoZWFkIG9mIHRoZSB1cmwgcGF0aHMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSURFU3BlY2lhbENsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgewotCQkKLQkJcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCQkvLyBUaGlzIGlzIHRoZSBidW5kbGUgdGhhdCBjb250YWlucyB0aGUgSURFIEVjbGlwc2UgY29kZS4KLQkJLy8gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZmlyc3QgYmVjYXVzZSB0aGVyZSBhcmUgSURFIHNwZWNpZmljIHN0dWZmIHRoYXQgaXMgdXNlZCBvbiB0aGUgInJlbW90ZSB2bSIgdG9vIGFuZAotCQkvLyBzbyBtdXN0IGJlIGNvbW1vbi4KLQkJcHJpdmF0ZSBCdW5kbGUgaWRlQnVuZGxlOwkgCi0KLQkJcHVibGljIElERVNwZWNpYWxDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBCdW5kbGUgYnVuZGxlKSB7Ci0JCQlzdXBlcih1cmxzLCBudWxsKTsKLQkJCWlkZUJ1bmRsZSA9IFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpOwotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJREVTcGVjaWFsQ2xhc3NMb2FkZXIoVVJMW10gdXJscykgewotCQkJdGhpcyh1cmxzLCBudWxsKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5DbGFzc0xvYWRlciNmaW5kQ2xhc3MoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGlkZUJ1bmRsZS5sb2FkQ2xhc3MobmFtZSk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBidW5kbGUubG9hZENsYXNzKG5hbWUpOwotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmZpbmRDbGFzcyhuYW1lKTsKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIjZmluZFJlc291cmNlKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotCQkJVVJMIHIgPSBpZGVCdW5kbGUuZ2V0UmVzb3VyY2UobmFtZSk7Ci0JCQlpZiAociA9PSBudWxsICYmIGJ1bmRsZSAhPSBudWxsKQotCQkJCXIgPSBidW5kbGUuZ2V0UmVzb3VyY2UobmFtZSk7Ci0JCQlyZXR1cm4gciAhPSBudWxsID8gciA6IHN1cGVyLmZpbmRSZXNvdXJjZShuYW1lKTsKLQkJfQotfQotCi0vKioKLSAqIENyZWF0ZSBhIHNwZWNpYWwgbG9hZGVyIHRoYXQgaGFzIHRoZSBwbHVnaW4gY2xhc3Nsb2FkZXIgb2YgdGhlIHBhc3NlZCBpbiBwbHVnaW4KLSAqIGFzIHRoZSBwYXJlbnQgbG9hZGVyLCBwbHVzIGFsbCBvZiB0aGUgdXJscywgcGx1cyB0aGUgcmVtb3Rldm0uamFyIGZpbGUgdGhhdCBpcwotICogbmVlZGVkIGJ5IElERSBQcm94eSB0byB3b3JrLgotICovCQotcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVTcGVjaWFsTG9hZGVyKFN0cmluZyBwbHVnaW5OYW1lLCBVUkxbXSBvdGhlclVSTHMpIHsKLQlCdW5kbGUgYnVuZGxlID0gcGx1Z2luTmFtZSAhPSBudWxsID8gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbk5hbWUpIDogbnVsbDsKLQkKLQlVUkxbXSBtdXN0SGF2ZVVybHMgPSBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS51cmxMb2NhbGl6ZUFsbEZyb21CdW5kbGVBbmRGcmFnbWVudHMoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksICJ2bS9yZW1vdGV2bS5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQotCVVSTFtdIHVybHMgPSBudWxsOwotCWlmIChvdGhlclVSTHMgIT0gbnVsbCkgewotCQl1cmxzID0gbmV3IFVSTFtvdGhlclVSTHMubGVuZ3RoK211c3RIYXZlVXJscy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG11c3RIYXZlVXJscywgMCwgdXJscywgMCwgbXVzdEhhdmVVcmxzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkob3RoZXJVUkxzLCAwLCB1cmxzLCBtdXN0SGF2ZVVybHMubGVuZ3RoLCBvdGhlclVSTHMubGVuZ3RoKTsKLQl9IGVsc2UgCi0JCXVybHMgPSBtdXN0SGF2ZVVybHM7Ci0JCQotCXJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBJREVTcGVjaWFsQ2xhc3NMb2FkZXIodXJscywgYnVuZGxlKSA6IG5ldyBJREVTcGVjaWFsQ2xhc3NMb2FkZXIodXJscyk7Ci19Ci0KLXB1YmxpYyBJREVQcm94eUZhY3RvcnlSZWdpc3RyeShTdHJpbmcgYU5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgewotCXN1cGVyKElERV9SRUdJU1RSWV9UWVBFX0lEKTsKLQlmTmFtZSA9IGFOYW1lOwotCWZDbGFzc0xvYWRlciA9IGxvYWRlcjsKLX0KLQotQ2xhc3NMb2FkZXIgZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKXsKLQlyZXR1cm4gZkNsYXNzTG9hZGVyOwotfQotCi1wcm90ZWN0ZWQgdm9pZCByZWdpc3RyeVRlcm1pbmF0ZWQoYm9vbGVhbiB3YWl0KXsKLQlMaXN0IHJ1bm5hYmxlcyA9IG51bGw7Ci0Jc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCXJ1bm5hYmxlcyA9IHNodXRkb3duUnVubmFibGVzOwotCQlzaHV0ZG93blJ1bm5hYmxlcyA9IG51bGw7Ci0JfQotCWlmIChydW5uYWJsZXMgIT0gbnVsbCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJ1bm5hYmxlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQkoKFJ1bm5hYmxlKSBpdHIubmV4dCgpKS5ydW4oKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLUNsYXNzIGxvYWRDbGFzcyhTdHJpbmcgYUNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciwgTGlua2FnZUVycm9yIHsKLQlyZXR1cm4gZkNsYXNzTG9hZGVyLmxvYWRDbGFzcyhhQ2xhc3NOYW1lKTsKLX0KLQotcHVibGljIElDYWxsYmFja1JlZ2lzdHJ5IGdldENhbGxiYWNrUmVnaXN0cnkoKXsKLQlpZiAoIGZDYWxsYmFja1JlZ2lzdHJ5ID09IG51bGwgKXsKLQkJZkNhbGxiYWNrUmVnaXN0cnkgPSBuZXcgSURFQ2FsbGJhY2tSZWdpc3RyeSh0aGlzKTsKLQl9Ci0JcmV0dXJuIGZDYWxsYmFja1JlZ2lzdHJ5OwotfQotCi0KLS8qKgotICogR2V0IGEgYmVhbiBwcm94eSBmcm9tIHRoZSBiZWFuIG9mIHRoZSBjb3JyZWN0IHR5cGUuCi0gKiAKLSAqIEBwYXJhbSByZXR1cm5UeXBlCi0gKiBAcGFyYW0gYmVhbgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotSUJlYW5Qcm94eSBnZXRCZWFuUHJveHkoQ2xhc3MgcmV0dXJuVHlwZSwgT2JqZWN0IGJlYW4pIHsKLQlJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHByb3h5RmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KSB0aGlzLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCk7Ci0JaWYgKCFyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJcmV0dXJuIElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHkodGhpcywgYmVhbik7Ci0JfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IEludGVnZXIuVFlQRSkgewotCQlyZXR1cm4gcHJveHlGYWN0b3J5LmludFR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBCb29sZWFuLlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5ib29sZWFuVHlwZS5uZXdCZWFuUHJveHkoYmVhbik7Ci0JfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IEZsb2F0LlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5mbG9hdFR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBMb25nLlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5sb25nVHlwZS5uZXdCZWFuUHJveHkoYmVhbik7Ci0JfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IFNob3J0LlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5zaG9ydFR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBEb3VibGUuVFlQRSkgewotCQlyZXR1cm4gcHJveHlGYWN0b3J5LmRvdWJsZVR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBCeXRlLlRZUEUpIHsKLQkJcmV0dXJuIHByb3h5RmFjdG9yeS5ieXRlVHlwZS5uZXdCZWFuUHJveHkoYmVhbik7Ci0JfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IENoYXJhY3Rlci5UWVBFKSB7Ci0JCXJldHVybiBwcm94eUZhY3RvcnkuY2hhclR5cGUubmV3QmVhblByb3h5KGJlYW4pOwotCX0gZWxzZSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHByaW1pdGl2ZSB0eXBlICIgKyByZXR1cm5UeXBlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci0KLUxpc3Qgc2h1dGRvd25SdW5uYWJsZXM7Ci0KLXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTaHV0ZG93bkxpc3RlbmVyKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JaWYgKHNodXRkb3duUnVubmFibGVzID09IG51bGwpIHsKLQkJc2h1dGRvd25SdW5uYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfSBlbHNlIGlmIChzaHV0ZG93blJ1bm5hYmxlcy5jb250YWlucyhydW5uYWJsZSkpCi0JCXJldHVybjsKLQlzaHV0ZG93blJ1bm5hYmxlcy5hZGQocnVubmFibGUpOwotfQotCi1wdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU2h1dGRvd25MaXN0ZW5lcihSdW5uYWJsZSBydW5uYWJsZSkgewotCWlmIChzaHV0ZG93blJ1bm5hYmxlcyAhPSBudWxsKQotCQlzaHV0ZG93blJ1bm5hYmxlcy5yZW1vdmUocnVubmFibGUpOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVJlZ2lzdHJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVSZWdpc3RyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjYzY2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVJlZ2lzdHJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVJlZ2lzdHJhdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5hd3QuSURFUmVnaXN0ZXJBV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnJlbW90ZS5Mb2NhbEZpbGVDb25maWd1cmF0aW9uQ29udHJpYnV0b3JDb250cm9sbGVyOwotLyoqCi0gKiBUaGlzIGlzIHRoZSByZWdpc3RyYXRpb24gY2xhc3MgZm9yIHN0YXJ0aW5nIGFuIElERVJlbW90ZSBWTS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSURFUmVnaXN0cmF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHN0YXJ0QW5JbXBsZW1lbnRhdGlvbigKLQkJSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGNvbnRyaWJ1dG9ycywKLQkJYm9vbGVhbiBhdHRhY2hBV1QsCi0JCUlQcm9qZWN0IHByb2plY3QsCi0JCVN0cmluZyB2bU5hbWUsCi0JCVN0cmluZyBwbHVnaW5OYW1lLAotCQlJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJREVSZWdpc3RyYXRpb24gaWRlcmVnID0gbmV3IElERVJlZ2lzdHJhdGlvbihwbHVnaW5OYW1lKTsKLQkJCXJldHVybiBpZGVyZWcuc3RhcnRJbXBsZW1lbnRhdGlvbihjb250cmlidXRvcnMsIGF0dGFjaEFXVCwgcHJvamVjdCwgdm1OYW1lLCBwbSk7IAotCQl9Ci0JCi0JcHVibGljIElERVJlZ2lzdHJhdGlvbigpIHsKLQl9Ci0JCi0JcHJpdmF0ZSBJREVSZWdpc3RyYXRpb24oU3RyaW5nIHBsdWdpbk5hbWUpIHsKLQkJdGhpcy5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luTmFtZTsJCi0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY3JlYXRlIGEgcmVtb3RlIFZNIGFuZCByZXR1cm4gYW4gaW5pdGlhbGl6ZWQgUkVNUHJveHlGYWN0b3J5UmVnaXN0cnkuCi0JICogUGFzc2VkIGluIGFyZToKLQkgKiAgICAgIHByb2plY3Q6IFRoZSBwcm9qZWN0IHRoaXMgaXMgYmVpbmcgc3RhcnRlZCBvbi4gTXVzdCBub3QgYmUgbnVsbCBhbmQgbXVzdCBiZSBhIEphdmFQcm9qZWN0LiAoQ3VycmVudGx5IGlnbm9yZWQgZm9yIElERSkuCi0JICogICAgICBhdHRhY2hBV1Q6IFNob3VsZCBBV1QgYmUgYXR0YWNoZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KLQkgKiAgICAgIGNvbnRyaWJ1dG9yczogQ29udHJpYnV0b3JzIHRvIHRoZSBjb25maWd1cmF0aW9uLiBDYW4gYmUgbnVsbC4KLQkgKiAgICAgIHBtOiBQcm9ncmVzc01vbml0b3IgdG8gdXNlLiBNdXN0IG5vdCBiZSBudWxsLgotCSAqICAgICAgdm1OYW1lOiBOYW1lIGZvciB0aGUgdm0uIENhbiBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBzdGFydEltcGxlbWVudGF0aW9uKAotCQlJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10gY29udHJpYnV0b3JzLAotCQlib29sZWFuIGF0dGFjaEFXVCwKLQkJSVByb2plY3QgcHJvamVjdCwKLQkJU3RyaW5nIHZtTmFtZSwKLQkJSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVVSTFtdIGNsYXNzUGF0aHMgPSBudWxsOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCS8vIEFkZCBpbiB0aGUgcGF0aHMgZm9yIHRoZSBwcm9qZWN0CSAJCi0JCQljbGFzc1BhdGhzID0gUHJveHlMYXVuY2hTdXBwb3J0LmNvbnZlcnRTdHJpbmdQYXRoc1RvVVJMKEphdmFSdW50aW1lLmNvbXB1dGVEZWZhdWx0UnVudGltZUNsYXNzUGF0aChqYXZhUHJvamVjdCkpOwotCQl9IGVsc2UKLQkJCWNsYXNzUGF0aHMgPSBuZXcgVVJMWzBdOwotCi0JCWZpbmFsIElKYXZhUHJvamVjdCBqcCA9IGphdmFQcm9qZWN0OwotCi0JCWZpbmFsIFByb3h5TGF1bmNoU3VwcG9ydC5MYXVuY2hJbmZvIGxhdW5jaEluZm8gPSBuZXcgUHJveHlMYXVuY2hTdXBwb3J0LkxhdW5jaEluZm8oKTsKLQkJY29udHJpYnV0b3JzID0gUHJveHlMYXVuY2hTdXBwb3J0LmZpbGxJbkxhdW5jaEluZm8oY29udHJpYnV0b3JzID09IG51bGwgPyBQcm94eUxhdW5jaFN1cHBvcnQuRU1QVFlfQ09ORklHX0NPTlRSSUJVVE9SUyA6IGNvbnRyaWJ1dG9ycywgbGF1bmNoSW5mbywganAgIT0gbnVsbCA/IGpwLmdldEVsZW1lbnROYW1lKCkgOiBudWxsKTsKLQkJZmluYWwgTG9jYWxGaWxlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IExvY2FsRmlsZUNvbmZpZ3VyYXRpb25Db250cmlidXRvckNvbnRyb2xsZXIoY2xhc3NQYXRocywgbmV3IFVSTFszXVtdLCBsYXVuY2hJbmZvKTsKLQkJZmluYWwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIGNvbnRyaWJzID0gY29udHJpYnV0b3JzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJ1dG9ycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGlpID0gaTsKLQkJCS8vIFJ1biBpbiBzYWZlIG1vZGUgc28gdGhhdCBhbnl0aGluZyBoYXBwZW5zIHdlIGRvbid0IGdvIGF3YXkuCi0JCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gUGxhdGZvcm0ucnVuIGxvZ3MgaXQgZm9yIG1lLgotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQljb250cmlic1tpaV0uaW5pdGlhbGl6ZShsYXVuY2hJbmZvLmdldENvbmZpZ0luZm8oKSk7Ci0JCQkJfQotCQkJfSk7CQkJCQotCQl9CQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJLy8gUnVuIGluIHNhZmUgbW9kZSBzbyB0aGF0IGFueXRoaW5nIGhhcHBlbnMgd2UgZG9uJ3QgZ28gYXdheS4KLQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBQbGF0Zm9ybS5ydW4gbG9ncyBpdCBmb3IgbWUuCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCWNvbnRyaWJzW2lpXS5jb250cmlidXRlQ2xhc3NwYXRocyhjb250cm9sbGVyKTsKLQkJCQl9Ci0JCQl9KTsJCQkJCi0JCX0KLQkJY2xhc3NQYXRocyA9IGNvbnRyb2xsZXIuZ2V0RmluYWxDbGFzc3BhdGgoKTsKLQotCQlmaW5hbCBCYXNlUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoQmFzZVByb3h5RmFjdG9yeVJlZ2lzdHJ5KSBjcmVhdGVJREVQcm94eUZhY3RvcnlSZWdpc3RyeSh2bU5hbWUsIHBsdWdpbk5hbWUsIGNsYXNzUGF0aHMpOwotCQlQcm94eUxhdW5jaFN1cHBvcnQucGVyZm9ybUV4dGVuc2lvblJlZ2lzdHJhdGlvbnMocmVnaXN0cnksIGxhdW5jaEluZm8pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyaWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBpbnQgaWkgPSBpOwotCQkJLy8gUnVuIGluIHNhZmUgbW9kZSBzbyB0aGF0IGFueXRoaW5nIGhhcHBlbnMgd2UgZG9uJ3QgZ28gYXdheS4KLQkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBQbGF0Zm9ybS5ydW4gbG9ncyBpdCBmb3IgbWUuCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCWNvbnRyaWJzW2lpXS5jb250cmlidXRlVG9SZWdpc3RyeShyZWdpc3RyeSk7Ci0JCQkJfQotCQkJfSk7CQotCQl9Ci0KLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgY3JlYXRlSURFUHJveHlGYWN0b3J5UmVnaXN0cnkoU3RyaW5nIGFOYW1lLCBTdHJpbmcgYVBsdWdpbk5hbWUsIFVSTFtdIG90aGVyVVJMcykgewotCQkvLyBDcmVhdGUgdGhlIHJlZ2lzdHJ5LgotCQlJREVQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9Ci0JCQluZXcgSURFUHJveHlGYWN0b3J5UmVnaXN0cnkoYU5hbWUsIElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5LmNyZWF0ZVNwZWNpYWxMb2FkZXIoYVBsdWdpbk5hbWUsIG90aGVyVVJMcykpOwotCQlpbml0UmVnaXN0cnkocmVnaXN0cnkpOwotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBjcmVhdGVJREVQcm94eUZhY3RvcnlSZWdpc3RyeShTdHJpbmcgYU5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgewotCQkvLyBDcmVhdGUgdGhlIHJlZ2lzdHJ5LgotCQlJREVQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBJREVQcm94eUZhY3RvcnlSZWdpc3RyeShhTmFtZSwgbG9hZGVyKTsKLQkJaW5pdFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFJlZ2lzdHJ5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCW5ldyBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJbmV3IElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JCW5ldyBJREVNZXRob2RQcm94eUZhY3RvcnkocmVnaXN0cnkpOwotCQkvLyBBbHdheXMgc3VwcG9ydCBBV1QgZm9yIG5vdwotCQlJREVSZWdpc3RlckFXVC5yZWdpc3RlckFXVChyZWdpc3RyeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTaG9ydENsYXNzQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA0MmM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLS8qKgotICogU2hvcnQgQmVhblR5cGUgUHJveHkuCi0gKi8KLWZpbmFsIGNsYXNzIElERVNob3J0Q2xhc3NCZWFuVHlwZVByb3h5IGV4dGVuZHMgSURFTnVtYmVyQmVhblR5cGVQcm94eSB7Ci1wcm90ZWN0ZWQgSURFU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcywgbmV3IFNob3J0KChzaG9ydCkwKSk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZVNob3J0QmVhblByb3h5KFNob3J0IGFTaG9ydCl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LGFTaG9ydCx0aGlzKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU2hvcnRUeXBlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjQyYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVTaG9ydFR5cGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBTaG9ydCBCZWFuVHlwZSBQcm94eS4KLSAqLwotZmluYWwgY2xhc3MgSURFU2hvcnRUeXBlQmVhblR5cGVQcm94eSBleHRlbmRzIElERVByaW1pdGl2ZUJlYW5UeXBlUHJveHkgewotcHJvdGVjdGVkIElERVNob3J0VHlwZUJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyBhQ2xhc3MpIHsKLQlzdXBlcihhUmVnaXN0cnksIGFDbGFzcyk7Ci19Ci1JTnVtYmVyQmVhblByb3h5IGNyZWF0ZVNob3J0QmVhblByb3h5KHNob3J0IGFTaG9ydCl7Ci0JcmV0dXJuIG5ldyBJREVOdW1iZXJCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBTaG9ydChhU2hvcnQpLHRoaXMpOwotfQotaW50IGdldFByaW1pdGl2ZVR5cGUoKXsKLQlyZXR1cm4gU0hPUlQ7Ci19Ci1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQlOdW1iZXIgbiA9IGFuT2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyID8gbmV3IFNob3J0KChzaG9ydCkgKChDaGFyYWN0ZXIpIGFuT2JqZWN0KS5jaGFyVmFsdWUoKSkgOiAoTnVtYmVyKSBhbk9iamVjdDsKLQlyZXR1cm4gbmV3IElERU51bWJlckJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIG4sIHRoaXMpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTg1MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogJFJDU2ZpbGU6IElERVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeS5qYXZhLHYgJCAkUmV2aXNpb246IDEuMTEgJCAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLklWTVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLkluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeSB7Ci0KLQotCXByb3RlY3RlZCBJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmUmVnaXN0cnk7Ci0JcHJvdGVjdGVkIElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgZkJlYW5UeXBlUHJveHlGYWN0b3J5OwotCXByaXZhdGUgSUJlYW5Qcm94eSBpdm1TZXJ2ZXJQcm94eTsKLQkKLQkvKgotCSAqIFJldHVybiBhIGJlYW4gcHJveHkgZm9yIHRoZSBhcmd1bWVudC4gVG8gZG8gdGhpcyBjcmVhdGUgdGhyb3VnaCB0aGUgY29ycmVjdCBCZWFuVHlwZVByb3h5Ci0JICogV2hpY2ggZW5zdXJlcyB0aGF0IHNwZWNpYWwgc3ViY2xhc3NlcyBvZiBJREVCZWFuUHJveHkgYXJlIGNyZWF0ZWQuIFRoaXMgaXMganVzdCBhIGxvY2FsCi0JICogaGVscGVyIG1ldGhvZC4KLQkgKi8KLQlzdGF0aWMgSUlERUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHkoUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBPYmplY3QgYW5PYmplY3QpIHsKLQotCQlyZXR1cm4gKChJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpIGFSZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkpLmNyZWF0ZUlERUJlYW5Qcm94eVdpdGgoYW5PYmplY3QpOwotCX0KLQkKLQlJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWZSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQkJZlJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblByb3h5RmFjdG9yeSh0aGlzKTsKLQkJZkJlYW5UeXBlUHJveHlGYWN0b3J5ID0gKElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkpIGFSZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCQlpdm1TZXJ2ZXJQcm94eSA9IGZSZWdpc3RyeS5nZXRCZWFuUHJveHkoSVZNU2VydmVyLmNsYXNzLCBmUmVnaXN0cnkpOwotCX0KLQkKLQlwdWJsaWMgSVN0cmluZ0JlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3Rvcnkuc3RyaW5nQ2xhc3MuY3JlYXRlU3RyaW5nQmVhblByb3h5KGFTdHJpbmcpOwotCX0KLQkKLQlwdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGZsb2F0IGFGbG9hdCkgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmZsb2F0VHlwZS5jcmVhdGVGbG9hdEJlYW5Qcm94eShhRmxvYXQpOwotCX0KLQkKLQlwdWJsaWMgSU51bWJlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKHNob3J0IGFTaG9ydCkgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LnNob3J0VHlwZS5jcmVhdGVTaG9ydEJlYW5Qcm94eShhU2hvcnQpOwotCX0KLQkKLQlwdWJsaWMgSUNoYXJhY3RlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGNoYXIgYUNoYXIpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5jaGFyVHlwZS5jcmVhdGVDaGFyQmVhblByb3h5KGFDaGFyKTsKLQl9Ci0JCi0JcHVibGljIElDaGFyYWN0ZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChDaGFyYWN0ZXIgYUNoYXJhY3RlcikgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmNoYXJDbGFzcy5jcmVhdGVDaGFyYWN0ZXJCZWFuUHJveHkoYUNoYXJhY3Rlcik7Ci0JfQotCQotCXB1YmxpYyBJSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGludCBhbkludCkgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmludFR5cGUuY3JlYXRlSW50ZWdlckJlYW5Qcm94eShhbkludCk7Ci0JfQotCQotCXB1YmxpYyBJSW50ZWdlckJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKEludGVnZXIgYW5JbnRlZ2VyKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuaW50ZWdlckNsYXNzLmNyZWF0ZUludGVnZXJCZWFuUHJveHkoYW5JbnRlZ2VyKTsKLQl9Ci0JCi0JcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChsb25nIGFMb25nKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkubG9uZ1R5cGUuY3JlYXRlTG9uZ0JlYW5Qcm94eShhTG9uZyk7Ci0JfQotCQotCXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoTnVtYmVyIGFOdW1iZXIpIHsKLQkJSURFTnVtYmVyQmVhblR5cGVQcm94eSBudW1iZXJUeXBlUHJveHkgPSAoSURFTnVtYmVyQmVhblR5cGVQcm94eSkgZkJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoYU51bWJlci5nZXRDbGFzcygpKTsKLQkJcmV0dXJuIG51bWJlclR5cGVQcm94eS5jcmVhdGVOdW1iZXJCZWFuUHJveHkoYU51bWJlcik7Ci0JfQotCQotCXB1YmxpYyBJQm9vbGVhbkJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5ib29sZWFuVHlwZS5jcmVhdGVCb29sZWFuQmVhblByb3h5KGFCb29sZWFuKTsKLQl9Ci0JCi0JcHVibGljIElCb29sZWFuQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoQm9vbGVhbiBhQm9vbGVhbikgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHlGYWN0b3J5LmJvb2xlYW5DbGFzcy5jcmVhdGVCb29sZWFuQmVhblByb3h5KGFCb29sZWFuKTsKLQl9Ci0JCi0JcHVibGljIElOdW1iZXJCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChieXRlIGFCeXRlKSB7Ci0JCXJldHVybiBmQmVhblR5cGVQcm94eUZhY3RvcnkuYnl0ZVR5cGUuY3JlYXRlQnl0ZUJlYW5Qcm94eShhQnl0ZSk7Ci0JfQotCQotCXB1YmxpYyBJTnVtYmVyQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoZG91YmxlIGFEb3VibGUpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5RmFjdG9yeS5kb3VibGVUeXBlLmNyZWF0ZURvdWJsZUJlYW5Qcm94eShhRG91YmxlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NvbnZlcnRUb1ByaW1pdGl2ZUJlYW5Qcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGNvbnZlcnRUb1ByaW1pdGl2ZUJlYW5Qcm94eShJQmVhblByb3h5IG5vblByaW1pdGl2ZVByb3h5KSB7Ci0JCWlmIChub25QcmltaXRpdmVQcm94eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghbm9uUHJpbWl0aXZlUHJveHkuaXNWYWxpZCgpKQotCQkJcmV0dXJuIG5vblByaW1pdGl2ZVByb3h5OwotCQlJREVCZWFuVHlwZVByb3h5IHR5cGUgPSAoSURFQmVhblR5cGVQcm94eSkgbm9uUHJpbWl0aXZlUHJveHkuZ2V0VHlwZVByb3h5KCk7Ci0JCWlmICh0eXBlLmdldENsYXNzKCkgPT0gQm9vbGVhbi5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJQm9vbGVhbkJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJZWxzZSBpZiAodHlwZS5nZXRDbGFzcygpID09IEJ5dGUuY2xhc3MpCi0JCQlyZXR1cm4gdGhpcy5jcmVhdGVCZWFuUHJveHlXaXRoKCgoSU51bWJlckJlYW5Qcm94eSkgbm9uUHJpbWl0aXZlUHJveHkpLmJ5dGVWYWx1ZSgpKTsKLQkJZWxzZSBpZiAodHlwZS5nZXRDbGFzcygpID09IENoYXJhY3Rlci5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJQ2hhcmFjdGVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuY2hhclZhbHVlKCkpOwotCQllbHNlIGlmICh0eXBlLmdldENsYXNzKCkgPT0gRG91YmxlLmNsYXNzKQotCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5kb3VibGVWYWx1ZSgpKTsKLQkJZWxzZSBpZiAodHlwZS5nZXRDbGFzcygpID09IEZsb2F0LmNsYXNzKQotCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5mbG9hdFZhbHVlKCkpOwotCQllbHNlIGlmICh0eXBlLmdldENsYXNzKCkgPT0gSW50ZWdlci5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuaW50VmFsdWUoKSk7Ci0JCWVsc2UgaWYgKHR5cGUuZ2V0Q2xhc3MoKSA9PSBMb25nLmNsYXNzKQotCQkJcmV0dXJuIHRoaXMuY3JlYXRlQmVhblByb3h5V2l0aCgoKElOdW1iZXJCZWFuUHJveHkpIG5vblByaW1pdGl2ZVByb3h5KS5sb25nVmFsdWUoKSk7Ci0JCWVsc2UgaWYgKHR5cGUuZ2V0Q2xhc3MoKSA9PSBTaG9ydC5jbGFzcykKLQkJCXJldHVybiB0aGlzLmNyZWF0ZUJlYW5Qcm94eVdpdGgoKChJTnVtYmVyQmVhblByb3h5KSBub25QcmltaXRpdmVQcm94eSkuc2hvcnRWYWx1ZSgpKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5vblByaW1pdGl2ZVByb3h5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG9uZS1kaW1lbnNpb25hbCBhcnJheS4gVGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBzYW1lIGFzIGNhbGxpbmcKLQkgKiBjcmVhdGVCZWFuUHJveHlXaXRoKElCZWFuVHlwZVByb3h5IHR5cGUsIG5ldyBpbnRbMV0ge3h9KSB3aGVyZSAneCcgaXMgdGhlIHZhbHVlIHBhc3NlZCBpbiBhcwotCSAqIHRoZSBkaW1lbnNpb24uCi0JICovCi0JcHVibGljIElBcnJheUJlYW5Qcm94eSBjcmVhdGVCZWFuUHJveHlXaXRoKElCZWFuVHlwZVByb3h5IHR5cGUsIGludCBkaW1lbnNpb24pIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCXJldHVybiBjcmVhdGVCZWFuUHJveHlXaXRoKHR5cGUsIG5ldyBpbnRbXSB7IGRpbWVuc2lvbiB9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFycmF5IGJlYW4gcHJveHkuCi0JICogIC0gKGludCwgbmV3IGludFsyXSB7MywgNH0pIHdpbGwgY3JlYXRlOiBpbnQgWzNdIFs0XQotCSAqICAtIChpbnRbXSwgbmV3IGludFsxXSB7MX0pIGludCBbMV0KLQkgKiAgLSAoaW50W10sIG5ldyBpbnRbMl0gezIsM30pIGludCBbMl0gWzNdCi0JICogCi0JICogIC0gKGludFtdLCBudWxsKSBvciAoaW50W10sIG5ldyBpbnRbMF0pIG9yIChpbnQsIG51bGwpIG9yIChpbnQsIG5ldyBpbnRbMF0pIGludCBbMF0uLi4gb3IKLQkgKiAoaW50W11bXS4uLiwgbnVsbCkgb3IgKGludFtdW10uLi4sIG5ldyBpbnRbMF0pIGludFswXVtdLi4uIFRoaXMgaXMgYmVjYXVzZSBhbiBhcnJheSBpbnN0YW5jZQotCSAqIHdpdGggbm8gc3BlY2lmaWVkIGRpbWVuc2lvbnMgaXMgbm90IHZhbGlkLgotCSAqICAtIChpbnRbXVtdLCBuZXcgaW50WzFdIHszfSkgaW50WzNdW10KLQkgKi8KLQlwdWJsaWMgSUFycmF5QmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eVdpdGgoSUJlYW5UeXBlUHJveHkgdHlwZSwgaW50W10gZGltZW5zaW9ucykgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJaWYgKHR5cGUuaXNBcnJheSgpKQotCQkJcmV0dXJuICgoSURFQXJyYXlCZWFuVHlwZVByb3h5KSB0eXBlKS5jcmVhdGVCZWFuUHJveHlXaXRoKGRpbWVuc2lvbnMpOyAvLyBBbHJlYWR5IGFuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIGFycmF5IHR5cGUsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIGp1c3QgcGFzcyBpdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBvbi4KLQkJZWxzZSB7Ci0JCQkvLyBJdCBpcyBub3QgYW4gYXJyYXkgdHlwZSwgc28gd2UgbmVlZCB0byBnZXQgYW4gYXJyYXkgb2YgdGhpcyB0eXBlIGFuZCBkaW1lbnNpb25zLgotCQkJSURFQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9Ci0JCQkJKElERUFycmF5QmVhblR5cGVQcm94eSkgZkJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkodHlwZS5nZXRUeXBlTmFtZSgpLCBkaW1lbnNpb25zLmxlbmd0aCk7Ci0JCQlyZXR1cm4gYXJyYXlUeXBlLmNyZWF0ZUJlYW5Qcm94eVdpdGgoZGltZW5zaW9ucyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZVByb3h5KElCZWFuUHJveHkgYVByb3h5KSB7Ci0JCS8vIERvIG5vdGhpbmcuIFRoaXMgaXMgbW9yZSBmb3IgcmVtb3RlIHByb3hpZXMKLQl9Ci0JCi0JLyoqCi0JICogY3JlYXRlSURFQmVhblByb3h5V2l0aCBtZXRob2QgY29tbWVudC4gVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgSVN0YW5kYXJkQmVhblByb3h5RmFjdG9yeQotCSAqIGludGVyZmFjZS4gSXQgaXMgYXZhaWxhYmxlIG9ubHkgZnJvbSBJREVCZWFuUHJveHlGYWN0b3J5IHNvIHRoYXQgSURFIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucwotCSAqIGNhbiB3cmFwcGVyIGEgYmVhbi4gVGhleSB3aWxsIG5lZWQgdG8gZ2V0IGN1cnJlbnQgYW5kIGV4cGxpY2l0bHkgY2FzdCB0bwotCSAqIElERUJlYW5Qcm94eUZhY3RvcnksIHNvIHRoZXkgc2hvdWxkIG9ubHkgYmUgSURFIHR5cGVzIHRoZW1zZWx2ZXMuCi0JICovCi0JcHVibGljIElJREVCZWFuUHJveHkgY3JlYXRlSURFQmVhblByb3h5V2l0aChPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKGFuT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoSURFQmVhblR5cGVQcm94eSkgZkJlYW5UeXBlUHJveHlGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoYW5PYmplY3QuZ2V0Q2xhc3MoKSkpLm5ld0JlYW5Qcm94eShhbk9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIEZvciB0aGUgSURFIEZhY3Rvcnkgd2Ugd2lsbCBjcmVhdGUgYW4gSURFQmVhblByb3h5IHVzaW5nIHRoZSBpbml0aWFsaXphdGlvblN0cmluZy4gSWYgdGhlCi0JICogZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgbm90IG9uZSB3ZSB1bmRlcnN0YW5kLCBwYXNzIGl0IG9udG8gdGhlIGV2YWx1YXRvci4gVGhlCi0JICogaW5pdFN0cmluZ1BhcnNlciBpcyBwYXNzZWQgdG8gYWxsb3cgc2hvcnRjdXQgZXZhbHVhdGlvbi4gUGFja2FnZSBwcm90ZWN0ZWQgc28gb25seQotCSAqIElERUJlYW5UeXBlUHJveGllcyBjYW4gY3JlYXRlIGluc3RhbmNlcy4KLQkgKi8KLQlJQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eShJREVCZWFuVHlwZVByb3h5IGFUeXBlUHJveHksIFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZykgewotCQlpZiAoaW5pdGlhbGl6YXRpb25TdHJpbmcuZXF1YWxzKCJudWxsIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOyAvLyBWYWx1ZSBpcyBpbml0aWFsaXplZCBhcyBudWxsLgotCQkvLyBXZSBoYXZlIHRvIGV2YWx1YXRlIHRoZSByZXN1bHQgb2YgdGhlIGluaXRpYWxpemF0aW9uU3RyaW5nCi0JCXRyeSB7Ci0JCQlDbGFzc0xvYWRlciBwbHVnaW5DbGFzc0xvYWRlciA9IGZSZWdpc3RyeS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotCQkJT2JqZWN0IG5ld1ZhbHVlID0gSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuZXZhbHVhdGUoaW5pdGlhbGl6YXRpb25TdHJpbmcsIHBsdWdpbkNsYXNzTG9hZGVyKTsKLQkJCXJldHVybiBuZXdWYWx1ZSAhPSBudWxsID8gYVR5cGVQcm94eS5uZXdCZWFuUHJveHkobmV3VmFsdWUpIDogbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGV4YykpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIElERSBGYWN0b3J5IHdlIHdpbGwgY3JlYXRlIGFuIElERUJlYW5Qcm94eSB1c2luZyB0aGUgbnVsbCBjb25zdHJ1Y3RvciBQYWNrYWdlCi0JICogcHJvdGVjdGVkIHNvIG9ubHkgSURFQmVhblR5cGVQcm94aWVzIGNhbiBjcmVhdGUgaW5zdGFuY2VzLgotCSAqLwotCUlCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5KElERUJlYW5UeXBlUHJveHkgYVR5cGVQcm94eSkgewotCi0JCUNsYXNzIGJlYW5UeXBlID0gYVR5cGVQcm94eS5mQ2xhc3M7Ci0KLQkJLy8gSWYgdGhlIGJlYW5UeXBlIGlzIGEgcHJpbWl0aXZlLCB0aGUgY3JlYXRpb24gd2lsbCBmYWlsIGJlY2F1c2UgeW91IGNhbid0Ci0JCS8vIGNyZWF0ZSBhIHByaW1pdGl2ZSB3aXRob3V0IGEgdmFsdWUuCi0JCXRyeSB7Ci0JCQlyZXR1cm4gYVR5cGVQcm94eS5uZXdCZWFuUHJveHkoIShhVHlwZVByb3h5LmlzUHJpbWl0aXZlKCkpID8gYmVhblR5cGUubmV3SW5zdGFuY2UoKSA6IG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuUHJveHlGYWN0b3J5I3Rlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotCQkvLyBOb3RoaW5nIHJlYWxseSB0byBkbyBoZXJlIC0gbW9yZSBhcHBsaWNhYmxlIHRvIHJlbW90ZSBwcm94eSBmYWN0b3JpZXMKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5I2NyZWF0ZUV4cHJlc3Npb24oKQotCSAqLwotCXB1YmxpYyBJRXhwcmVzc2lvbiBjcmVhdGVFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IElERUV4cHJlc3Npb24odGhpcy5mUmVnaXN0cnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkjY3JlYXRlQmVhblByb3h5RnJvbShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGNyZWF0ZUJlYW5Qcm94eUZyb20oU3RyaW5nIGluaXRpYWxpemF0aW9uU3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlpZiAoaW5pdGlhbGl6YXRpb25TdHJpbmcuZXF1YWxzKCJudWxsIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOyAvLyBWYWx1ZSBpcyBpbml0aWFsaXplZCBhcyBudWxsLgotCQkvLyBXZSBoYXZlIHRvIGV2YWx1YXRlIHRoZSByZXN1bHQgb2YgdGhlIGluaXRpYWxpemF0aW9uU3RyaW5nCi0JCXRyeSB7Ci0JCQlDbGFzc0xvYWRlciBwbHVnaW5DbGFzc0xvYWRlciA9IGZSZWdpc3RyeS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotCQkJSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgcGFyc2VyID0gSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuY3JlYXRlUGFyc2VyKGluaXRpYWxpemF0aW9uU3RyaW5nLCBwbHVnaW5DbGFzc0xvYWRlcik7Ci0JCQlPYmplY3QgbmV3VmFsdWUgPSBwYXJzZXIuZXZhbHVhdGUoKTsKLQkJCWlmIChuZXdWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZSZWdpc3RyeS5nZXRCZWFuUHJveHkocGFyc2VyLmdldEV4cGVjdGVkVHlwZSgpLCBuZXdWYWx1ZSk7Ci0JCQl9IGVsc2UgCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZygKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgZXhjKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElCZWFuUHJveHkgZ2V0SVZNU2VydmVyUHJveHkoKSB7Ci0JCXJldHVybiBpdm1TZXJ2ZXJQcm94eTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZmQ3ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotCi0vKgotICogJFJDU2ZpbGU6IElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkuamF2YSx2ICQgJFJldmlzaW9uOiAxLjEyICQgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJAotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLk1hcFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IGltcGxlbWVudHMgSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkgewotCi0JcHJvdGVjdGVkIGZpbmFsIElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5UmVnaXN0cnk7Ci0KLQkvLyBIYXNodGFibGUgdG8gY2FjaGUgcHJveGllcyBmb3IgY2xhc3NlcyBzbyB0aGV5IGFyZSBmb3VuZCBvbiBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgbG9va3VwcwotCXByb3RlY3RlZCBNYXAgYmVhblByb3hpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIE1hcCBNQVBfU0hPUlRTSUdfVE9fVFlQRSA9IG5ldyBIYXNoTWFwKDgpOwotCi0JcHVibGljIHN0YXRpYyBNYXAgTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHID0gbmV3IEhhc2hNYXAoOCk7Ci0KLQlzdGF0aWMgewotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkIiLCBCeXRlLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiQyIsIENoYXJhY3Rlci5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkQiLCBEb3VibGUuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJGIiwgRmxvYXQuVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQkJTUFQX1NIT1JUU0lHX1RPX1RZUEUucHV0KCJJIiwgSW50ZWdlci5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlNQVBfU0hPUlRTSUdfVE9fVFlQRS5wdXQoIkoiLCBMb25nLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiUyIsIFNob3J0LlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCU1BUF9TSE9SVFNJR19UT19UWVBFLnB1dCgiWiIsIEJvb2xlYW4uVFlQRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJieXRlIiwgIkIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImNoYXIiLCAiQyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTUFQX1RZUEVOQU1FX1RPX1NIT1JUU0lHLnB1dCgiZG91YmxlIiwgIkQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImZsb2F0IiwgIkYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImludCIsICJJIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcucHV0KCJsb25nIiwgIkoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoInNob3J0IiwgIlMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCU1BUF9UWVBFTkFNRV9UT19TSE9SVFNJRy5wdXQoImJvb2xlYW4iLCAiWiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvLyBDYWNoZWQgY29weSBvZiBhIGZldyB0eXBpY2FsIGJlYW4gdHlwZSBwcm94aWVzLgotCUlERUJlYW5UeXBlUHJveHkgb2JqZWN0Q2xhc3M7Ci0KLQlJREVCb29sZWFuVHlwZUJlYW5UeXBlUHJveHkgYm9vbGVhblR5cGU7Ci0KLQlJREVCb29sZWFuQ2xhc3NCZWFuVHlwZVByb3h5IGJvb2xlYW5DbGFzczsKLQotCUlERUludGVnZXJUeXBlQmVhblR5cGVQcm94eSBpbnRUeXBlOwotCi0JSURFSW50ZWdlckNsYXNzQmVhblR5cGVQcm94eSBpbnRlZ2VyQ2xhc3M7Ci0KLQlJREVGbG9hdFR5cGVCZWFuVHlwZVByb3h5IGZsb2F0VHlwZTsKLQotCUlERUZsb2F0Q2xhc3NCZWFuVHlwZVByb3h5IGZsb2F0Q2xhc3M7Ci0KLQlJREVMb25nVHlwZUJlYW5UeXBlUHJveHkgbG9uZ1R5cGU7Ci0KLQlJREVMb25nQ2xhc3NCZWFuVHlwZVByb3h5IGxvbmdDbGFzczsKLQotCUlERVNob3J0VHlwZUJlYW5UeXBlUHJveHkgc2hvcnRUeXBlOwotCi0JSURFU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkgc2hvcnRDbGFzczsKLQotCUlERUJ5dGVUeXBlQmVhblR5cGVQcm94eSBieXRlVHlwZTsKLQotCUlERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkgYnl0ZUNsYXNzOwotCi0JSURFQ2hhclR5cGVCZWFuVHlwZVByb3h5IGNoYXJUeXBlOwotCi0JSURFQ2hhcmFjdGVyQ2xhc3NCZWFuVHlwZVByb3h5IGNoYXJDbGFzczsKLQotCUlERURvdWJsZVR5cGVCZWFuVHlwZVByb3h5IGRvdWJsZVR5cGU7Ci0KLQlJREVEb3VibGVDbGFzc0JlYW5UeXBlUHJveHkgZG91YmxlQ2xhc3M7Ci0KLQlJREVTdHJpbmdCZWFuVHlwZVByb3h5IHN0cmluZ0NsYXNzOwotCi0JSURFQ2xhc3NCZWFuVHlwZVByb3h5IGNsYXNzQ2xhc3M7Ci0KLQlJREVCZWFuVHlwZVByb3h5IHZvaWRUeXBlOwotCi0JcHVibGljIElERVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWZGYWN0b3J5UmVnaXN0cnkgPSBhUmVnaXN0cnk7Ci0JCWFSZWdpc3RyeS5yZWdpc3RlckJlYW5UeXBlUHJveHlGYWN0b3J5KHRoaXMpOwotCi0JCS8vIE5vdyBpbml0aWFsaXplIHRoZSBjYWNoZS4KLQkJb2JqZWN0Q2xhc3MgPSBuZXcgSURFQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBPYmplY3QuY2xhc3MpOwotCQlib29sZWFuVHlwZSA9IG5ldyBJREVCb29sZWFuVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgQm9vbGVhbi5UWVBFKTsKLQkJYm9vbGVhbkNsYXNzID0gbmV3IElERUJvb2xlYW5DbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgQm9vbGVhbi5jbGFzcyk7Ci0JCWludFR5cGUgPSBuZXcgSURFSW50ZWdlclR5cGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEludGVnZXIuVFlQRSk7Ci0JCWludGVnZXJDbGFzcyA9IG5ldyBJREVJbnRlZ2VyQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEludGVnZXIuY2xhc3MpOwotCQlmbG9hdFR5cGUgPSBuZXcgSURFRmxvYXRUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBGbG9hdC5UWVBFKTsKLQkJZmxvYXRDbGFzcyA9IG5ldyBJREVGbG9hdENsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBGbG9hdC5jbGFzcyk7Ci0JCWxvbmdUeXBlID0gbmV3IElERUxvbmdUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBMb25nLlRZUEUpOwotCQlsb25nQ2xhc3MgPSBuZXcgSURFTG9uZ0NsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBMb25nLmNsYXNzKTsKLQkJc2hvcnRUeXBlID0gbmV3IElERVNob3J0VHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgU2hvcnQuVFlQRSk7Ci0JCXNob3J0Q2xhc3MgPSBuZXcgSURFU2hvcnRDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgU2hvcnQuY2xhc3MpOwotCQlieXRlVHlwZSA9IG5ldyBJREVCeXRlVHlwZUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgQnl0ZS5UWVBFKTsKLQkJYnl0ZUNsYXNzID0gbmV3IElERUJ5dGVDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgQnl0ZS5jbGFzcyk7Ci0JCWNoYXJUeXBlID0gbmV3IElERUNoYXJUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBDaGFyYWN0ZXIuVFlQRSk7Ci0JCWNoYXJDbGFzcyA9IG5ldyBJREVDaGFyYWN0ZXJDbGFzc0JlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgQ2hhcmFjdGVyLmNsYXNzKTsKLQkJZG91YmxlVHlwZSA9IG5ldyBJREVEb3VibGVUeXBlQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBEb3VibGUuVFlQRSk7Ci0JCWRvdWJsZUNsYXNzID0gbmV3IElERURvdWJsZUNsYXNzQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5LCBEb3VibGUuY2xhc3MpOwotCQlzdHJpbmdDbGFzcyA9IG5ldyBJREVTdHJpbmdCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIFN0cmluZy5jbGFzcyk7Ci0JCWNsYXNzQ2xhc3MgPSBuZXcgSURFQ2xhc3NCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIGphdmEubGFuZy5DbGFzcy5jbGFzcyk7Ci0JCXZvaWRUeXBlID0gbmV3IElERUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgVm9pZC5UWVBFKTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBoYXNodGFibGUgd2l0aCB0aGUgcHJpbWl0aXZlcywgdGhlaXIgbGFuZyBlcXVpdmFsZW50cywgYW5kIGFsc28gY29tbW9uIGNsYXNzZXMgbGlrZSBTdHJpbmcKLQkJYmVhblByb3hpZXMgPSBuZXcgSGFzaE1hcCgyMCk7Ci0KLQkJLy8gUHJpbWl0aXZlcwotCQliZWFuUHJveGllcy5wdXQoaW50VHlwZS5nZXRUeXBlTmFtZSgpLCBpbnRUeXBlKTsKLQkJYmVhblByb3hpZXMucHV0KGJvb2xlYW5UeXBlLmdldFR5cGVOYW1lKCksIGJvb2xlYW5UeXBlKTsKLQkJYmVhblByb3hpZXMucHV0KGNoYXJUeXBlLmdldFR5cGVOYW1lKCksIGNoYXJUeXBlKTsKLQkJYmVhblByb3hpZXMucHV0KGJ5dGVUeXBlLmdldFR5cGVOYW1lKCksIGJ5dGVUeXBlKTsKLQkJYmVhblByb3hpZXMucHV0KHNob3J0VHlwZS5nZXRUeXBlTmFtZSgpLCBzaG9ydFR5cGUpOwotCQliZWFuUHJveGllcy5wdXQobG9uZ1R5cGUuZ2V0VHlwZU5hbWUoKSwgbG9uZ1R5cGUpOwotCQliZWFuUHJveGllcy5wdXQoZmxvYXRUeXBlLmdldFR5cGVOYW1lKCksIGZsb2F0VHlwZSk7Ci0JCWJlYW5Qcm94aWVzLnB1dChkb3VibGVUeXBlLmdldFR5cGVOYW1lKCksIGRvdWJsZVR5cGUpOwotCi0JCS8vIGphdmEubGFuZyBwcmltaXRpdmUgcGVlcnMKLQkJLy8gTm90ZSB0aGF0IHNwZWNpYWwgY2xhc3NlcyBhcmUgdXNlZCBmb3Igc29tZSBvZiB0aGVzZSB3aGljaCBhbGxvdyB0aGUgSURFIHRvIGdldCB0aGUKLQkJLy8gbGFuZyBvYmplY3RzIGZyb20gdGhlIG9iamVjdHMgdGhhdCBhcmUgaG9sZGluZyBwcm94aWVzCi0JCWJlYW5Qcm94aWVzLnB1dChpbnRlZ2VyQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgaW50ZWdlckNsYXNzKTsKLQkJYmVhblByb3hpZXMucHV0KGJvb2xlYW5DbGFzcy5nZXRUeXBlTmFtZSgpLCBib29sZWFuQ2xhc3MpOwotCQliZWFuUHJveGllcy5wdXQoY2hhckNsYXNzLmdldFR5cGVOYW1lKCksIGNoYXJDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChieXRlQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgYnl0ZUNsYXNzKTsKLQkJYmVhblByb3hpZXMucHV0KHNob3J0Q2xhc3MuZ2V0VHlwZU5hbWUoKSwgc2hvcnRDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChsb25nQ2xhc3MuZ2V0VHlwZU5hbWUoKSwgbG9uZ0NsYXNzKTsKLQkJYmVhblByb3hpZXMucHV0KGZsb2F0Q2xhc3MuZ2V0VHlwZU5hbWUoKSwgZmxvYXRDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChkb3VibGVDbGFzcy5nZXRUeXBlTmFtZSgpLCBkb3VibGVDbGFzcyk7Ci0JCWJlYW5Qcm94aWVzLnB1dChCaWdEZWNpbWFsLmNsYXNzLmdldE5hbWUoKSwgbmV3IElERUJpZ0RlY2ltYWxCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJpZ0RlY2ltYWwuY2xhc3MpKTsvLyROT04tTkxTLTEkCi0JCWJlYW5Qcm94aWVzLnB1dChCaWdJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgbmV3IElERUJpZ0ludGVnZXJCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIEJpZ0ludGVnZXIuY2xhc3MpKTsvLyROT04tTkxTLTEkCQkKLQkJYmVhblByb3hpZXMucHV0KHN0cmluZ0NsYXNzLmdldFR5cGVOYW1lKCksIHN0cmluZ0NsYXNzKTsKLQotCQliZWFuUHJveGllcy5wdXQoY2xhc3NDbGFzcy5nZXRUeXBlTmFtZSgpLCBjbGFzc0NsYXNzKTsKLQkJYmVhblByb3hpZXMucHV0KHZvaWRUeXBlLmdldFR5cGVOYW1lKCksIHZvaWRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhcmUgYW4gSURFIHByb3h5IGFuZCBrbm93IHRoYXQgdGhlIHR5cGUgaXMgaW4gdGhlIHNhbWUgVk0gYXMgdGhlIElERS4gdGhlIElERUJlYW5UeXBlUHJveHkgb2JqZWN0IE5PVEUgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZQotCSAqIG9ubHkgcGVyc29uIHdobyBjYW4gY2FsbCBpdCBhcmUgcHJpdmVsZWRnZWQgY2xhc3NlcyB0aGF0IGFyZSBhbHNvIGNyZWF0aW5nIHRoaW5ncyBpbiBhbiBJREVQcm94eSBlbnZpcm9ubWVudC4gSWYgYW55b25lIG5lZWRzIHRvIG1ha2UgdGhpcwotCSAqIG1ldGhvZCBwdWJsaWMgdGhleSBhcmUgZG9pbmcgdGhlIHdyb25nIHRoaW5nIGFzIHRoZXkgc2hvdWxkIHVzZSB0aGUgcHVibGljIG1ldGhvZCBnZXRCZWFuVHlwZVByb3h5KFN0cmluZykgdGhhdCBpcyBvbiB0aGUgaW50ZXJmYWNlLiBUaGUgb25seQotCSAqIG90aGVyIG9iamVjdCB0aGF0IGNhbiBndWFyYW50ZWUgdGhhdCB0aGV5IGhhdmUgdGhlIGNsYXNzIGZvciB0aGUgYXJndW1lbnQgYXJlIHRob3NlIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGlkZXZtIHBhY2thZ2UKLQkgKi8KLQlJQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZVByb3h5KENsYXNzIGFuSURFQ2xhc3MpIHsKLQkJcmV0dXJuIGdldEJlYW5UeXBlUHJveHkoYW5JREVDbGFzcy5nZXROYW1lKCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRCZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSkgewotCQl0eXBlTmFtZSA9IE1hcFR5cGVzLmdldEpOSUZvcm1hdE5hbWUodHlwZU5hbWUpOwotCi0JCS8vIFNlZSB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSB0aGUgcHJveHkgZm9yIHRoZSBhcmd1bWVudCBuYW1lCi0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSAoSVByb3h5QmVhblR5cGUpIGJlYW5Qcm94aWVzLmdldCh0eXBlTmFtZSk7Ci0JCS8vIFNlZSBpZiB0aGVyZSBhbmQgcmVzb2x2ZWQsIGlmIHNvLCByZXR1cm4gaXQuIElmIG5vdCByZXNvbHZlZCwgdGhhdCBtZWFucyB3ZSBuZWVkIGl0IE5PVwotCQkvLyBzbyB3ZSBtdXN0IGdvIGZvciBpdC4gV2hlbiBmaW5hbGx5IHJlc29sdmVkIHRoZSBvcmlnaW5hbCBFeHByZXNzaW9uUHJveHkgd2lsbCBiZSBkZXJlZ2lzdGVyZWQgYW5kCi0JCS8vIHRoZSByZXNvbHZlZCBiZWFudHlwZXByb3h5IHdpbGwgYmUgaW4gaXRzIHBsYWNlLgotCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsICYmIGJlYW5UeXBlUHJveHkuaXNCZWFuUHJveHkoKSkgewotCQkJcmV0dXJuIChJQmVhblR5cGVQcm94eSkgYmVhblR5cGVQcm94eTsKLQkJfQotCi0JCS8vIElmIG5vdCBhbiBhcnJheSwgdGhlbiBzZWUgaWYgdGhlIHBhY2thZ2UgZXh0ZW5zaW9uIG1lY2hhbmlzbSBjYW4gZmluZCBpdC4KLQkJLy8gRG8gdGhpcyBoZXJlIHNvIHRoYXQgaWYgaXQgaXMgZm91bmQgaW4gdGhlIHBhY2thZ2UgZXh0ZW5zaW9uIHdlIHdvbid0IG5lY2Vzc2FyaWx5IGNyZWF0ZSBhbgotCQkvLyBleHRyYSBjb25uZWN0aW9uIHdoZW4gbm90IG5lZWRlZC4KLQkJaWYgKHR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIEl0IGlzIG5vdCBhbiBhcnJheQotCQkJLy8gRmlyc3QgY2hlY2sgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzLgotCQkJLy8gSW5uZXIgY2xhc3NlcyBoYXZlIHRvIHVzZSB0aGUgZG9sbGFyIG5vdGF0aW9uIHNpbmNlIGlmIHRoZXkgZGlkbid0IHdlIGNvdWxkbid0IHRlbGwgd2hlcmUKLQkJCS8vIHRoZSBwYWNrYWdlIGVuZGVkIGFuZCB0aGUgY2xhc3Mgc3RhcnRlZC4KLQkJCWludCBwYWNrYWdlSW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKHBhY2thZ2VJbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlSW5kZXgpOwotCQkJCUlERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5IHBhY2thZ2VGYWN0b3J5ID0gKElERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeVJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24ocGFja2FnZU5hbWUpOwotCQkJCWlmIChwYWNrYWdlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCWJlYW5UeXBlUHJveHkgPSBwYWNrYWdlRmFjdG9yeS5nZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHR5cGVOYW1lKTsKLQkJCQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KChJQmVhblR5cGVQcm94eSkgYmVhblR5cGVQcm94eSwgZmFsc2UpOwotCQkJCQkJcmV0dXJuIChJQmVhblR5cGVQcm94eSkgYmVhblR5cGVQcm94eTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIFRoZXJlIHdhcyBub3QgYSByZWdpc3RlcmVkIGZhY3RvcnkgdGhhdCBkZWFsdCB3aXRoIHRoZSBjbGFzcy4gTG9hZCBpdCB1c2luZyB0aGUgZmFjdG9yeQotCQkJLy8gcmVnaXN0cnkgd2hpY2ggaGFzIHRoZSBwbHVnaW4ncyBjbGFzcyBsb2FkZXIKLQkJCXRyeSB7Ci0JCQkJQ2xhc3MgaWRlQ2xhc3MgPSBmRmFjdG9yeVJlZ2lzdHJ5LmxvYWRDbGFzcyh0eXBlTmFtZSk7Ci0JCQkJSURFQmVhblR5cGVQcm94eSBzdXBlclR5cGVQcm94eSA9IG51bGw7Ci0JCQkJaWYgKGlkZUNsYXNzLmdldFN1cGVyY2xhc3MoKSAhPSBudWxsKSB7Ci0JCQkJCS8vIEdldCB0aGUgYmVhbnR5cGUgcHJveHkgb2YgdGhlIHN1cGVyY2xhc3MuCi0JCQkJCXN1cGVyVHlwZVByb3h5ID0gKElERUJlYW5UeXBlUHJveHkpIGdldEJlYW5UeXBlUHJveHkoaWRlQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKTsKLQkJCQl9Ci0KLQkJCQkvLyBBc2sgdGhlIHN1cGVydHlwZQotCQkJCS8vIHRvIGNyZWF0ZSBhIGJlYW50eXBlIHByb3h5IG9mIHRoZSBzYW1lIGJlYW50eXBlIHByb3h5IGNsYXNzLgotCQkJCS8vIFRoaXMgaXMgc28gdGhhdCBhbnkgc3ViY2xhc3NlcyB3aWxsIGdldCB0aGUgc2FtZSBiZWFudHlwZSBwcm94eSBjbGFzcwotCQkJCS8vIGZvciBpdCBpZiBpdCBpcyBzcGVjaWFsLgotCQkJCWlmIChzdXBlclR5cGVQcm94eSAhPSBudWxsKQotCQkJCQliZWFuVHlwZVByb3h5ID0gc3VwZXJUeXBlUHJveHkubmV3QmVhblR5cGVGb3JDbGFzcyhpZGVDbGFzcyk7Ci0KLQkJCQlpZiAoYmVhblR5cGVQcm94eSA9PSBudWxsKQotCQkJCQliZWFuVHlwZVByb3h5ID0gbmV3IElERUJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgaWRlQ2xhc3MpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezB9KHsxfSkiLCBuZXcgT2JqZWN0W10geyBlLmdldENsYXNzKCksIGUuZ2V0TWVzc2FnZSgpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQliZWFuVHlwZVByb3h5ID0gbmV3IElERUluaXRFcnJvckJlYW5UeXBlUHJveHkoZkZhY3RvcnlSZWdpc3RyeSwgdHlwZU5hbWUsIG1zZywgZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IgZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoInswfSh7MX0pIiwgbmV3IE9iamVjdFtdIHsgZS5nZXRDbGFzcygpLCBlLmdldE1lc3NhZ2UoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJYmVhblR5cGVQcm94eSA9IG5ldyBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIHR5cGVOYW1lLCBtc2csIGUuZ2V0Q2F1c2UoKSk7Ci0JCQl9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgewotCQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoInswfSh7MX0pIiwgbmV3IE9iamVjdFtdIHsgZS5nZXRDbGFzcygpLCBlLmdldE1lc3NhZ2UoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJYmVhblR5cGVQcm94eSA9IG5ldyBJREVJbml0RXJyb3JCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIHR5cGVOYW1lLCBtc2csIGUpOwotCQkJfQotCi0JCQkvLyBDYWNoZSB0aGUgaW5zdGFuY2Ugc28gd2UgY2FuIHJlLXVzZSBpdCBhZ2FpbgotCQkJYmVhblByb3hpZXMucHV0KHR5cGVOYW1lLCBiZWFuVHlwZVByb3h5KTsKLQkJCXJldHVybiAoSUJlYW5UeXBlUHJveHkpIGJlYW5UeXBlUHJveHk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBuZWVkIHRvIGNyZWF0ZSBhIGFycmF5IG9mIHRoaXMgbWFueSBkaW1lbnNpb25zIHNvIHRoYXQgd2UgY2FuIGdldCB0aGUgYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGl0LgotCQkJaW50IGRpbXMgPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignWycpICsgMTsKLQkJCUNsYXNzIGZpbmFsQ29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCQlpZiAodHlwZU5hbWUuY2hhckF0KGRpbXMpID09ICdMJykgewotCQkJCS8vIEl0IGlzIGEgY2xhc3MuCi0JCQkJLy8gU3RyaXAgb2ZmIHVwIHRvIHRoZSAnTCcsIGFuZCB0aGUgdHJhaWxpbmcgJzsnLiBUaGF0IGlzIHRoZSBjbGFzcyBuYW1lLgotCQkJCUlERUJlYW5UeXBlUHJveHkgZmluYWxUeXBlID0gKElERUJlYW5UeXBlUHJveHkpIGdldEJlYW5UeXBlUHJveHkodHlwZU5hbWUuc3Vic3RyaW5nKGRpbXMgKyAxLCB0eXBlTmFtZS5sZW5ndGgoKSAtIDEpKTsKLQkJCQlpZiAoZmluYWxUeXBlICE9IG51bGwpCi0JCQkJCWZpbmFsQ29tcG9uZW50VHlwZSA9IGZpbmFsVHlwZS5mQ2xhc3M7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEl0IGlzIGEgdHlwZS4gTmVlZCB0byBtYXAgaXQuCi0JCQkJZmluYWxDb21wb25lbnRUeXBlID0gKENsYXNzKSBJREVTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5Lk1BUF9TSE9SVFNJR19UT19UWVBFLmdldCh0eXBlTmFtZS5zdWJzdHJpbmcoZGltcywgZGltcyArIDEpKTsKLQkJCX0KLQotCQkJaWYgKGZpbmFsQ29tcG9uZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGR1bW15QXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZShmaW5hbENvbXBvbmVudFR5cGUsIG5ldyBpbnRbZGltc10pOwotCQkJCWJlYW5UeXBlUHJveHkgPSBuZXcgSURFQXJyYXlCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnksIHR5cGVOYW1lLCBkdW1teUFycmF5LmdldENsYXNzKCkpOwotCQkJCWJlYW5Qcm94aWVzLnB1dCh0eXBlTmFtZSwgYmVhblR5cGVQcm94eSk7Ci0JCQl9Ci0JCQlyZXR1cm4gKElCZWFuVHlwZVByb3h5KSBiZWFuVHlwZVByb3h5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRCZWFuVHlwZVByb3h5KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElQcm94eUJlYW5UeXBlIGdldEJlYW5UeXBlUHJveHkoSUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXR5cGVOYW1lID0gTWFwVHlwZXMuZ2V0Sk5JRm9ybWF0TmFtZSh0eXBlTmFtZSk7Ci0KLQkJLy8gU2VlIHdoZXRoZXIgd2UgYWxyZWFkeSBoYXZlIHRoZSBwcm94eSBmb3IgdGhlIGFyZ3VtZW50IG5hbWUKLQkJSVByb3h5QmVhblR5cGUgYmVhblR5cGVQcm94eSA9IChJUHJveHlCZWFuVHlwZSkgYmVhblByb3hpZXMuZ2V0KHR5cGVOYW1lKTsKLQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkgeyByZXR1cm4gYmVhblR5cGVQcm94eTsgfQotCQkKLQkJLy8gTm93IHNlZSBpZiBhbiBleHByZXNzaW9uIHByb3h5IGNhY2hlZC4KLQkJYmVhblR5cGVQcm94eSA9ICgoSURFRXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0QmVhblR5cGUodHlwZU5hbWUpOwotCQlpZiAoYmVhblR5cGVQcm94eSAhPSBudWxsKQotCQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7CQkKLQotCi0JCS8vIElmIG5vdCBhbiBhcnJheSwgdGhlbiBzZWUgaWYgdGhlIHBhY2thZ2UgZXh0ZW5zaW9uIG1lY2hhbmlzbSBjYW4gZmluZCBpdC4KLQkJLy8gRG8gdGhpcyBoZXJlIHNvIHRoYXQgaWYgaXQgaXMgZm91bmQgaW4gdGhlIHBhY2thZ2UgZXh0ZW5zaW9uIHdlIHdvbid0IG5lY2Vzc2FyaWx5IGNyZWF0ZSBhbgotCQkvLyBleHRyYSBjb25uZWN0aW9uIHdoZW4gbm90IG5lZWRlZC4KLQkJaWYgKHR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnWycpIHsKLQkJCS8vIEl0IGlzIG5vdCBhbiBhcnJheQotCQkJLy8gRmlyc3QgY2hlY2sgd2l0aCB0aGUgZmFjdG9yeSBmb3IgdGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzLgotCQkJLy8gSW5uZXIgY2xhc3NlcyBoYXZlIHRvIHVzZSB0aGUgZG9sbGFyIG5vdGF0aW9uIHNpbmNlIGlmIHRoZXkgZGlkbid0IHdlIGNvdWxkbid0IHRlbGwgd2hlcmUKLQkJCS8vIHRoZSBwYWNrYWdlIGVuZGVkIGFuZCB0aGUgY2xhc3Mgc3RhcnRlZC4KLQkJCWludCBwYWNrYWdlSW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKHBhY2thZ2VJbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlSW5kZXgpOwotCQkJCUlERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5IHBhY2thZ2VGYWN0b3J5ID0gKElERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5KSBmRmFjdG9yeVJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnlFeHRlbnNpb24ocGFja2FnZU5hbWUpOwotCQkJCWlmIChwYWNrYWdlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCWJlYW5UeXBlUHJveHkgPSBwYWNrYWdlRmFjdG9yeS5nZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KHR5cGVOYW1lLCBleHByZXNzaW9uKTsKLQkJCQkJaWYgKGJlYW5UeXBlUHJveHkgIT0gbnVsbCkgewotCQkJCQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJCQkJCXJldHVybiBiZWFuVHlwZVByb3h5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gVGhlcmUgd2FzIG5vdCBhIHJlZ2lzdGVyZWQgZmFjdG9yeSB0aGF0IGRlYWx0IHdpdGggdGhlIGNsYXNzLiBTbyBjcmVhdGUgdGhlIGV4cHJlc3Npb24gcHJveHkuCi0JCWJlYW5UeXBlUHJveHkgPSAoKEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmNyZWF0ZUJlYW5UeXBlRXhwcmVzc2lvblByb3h5KHR5cGVOYW1lKTsKLQkJcmVnaXN0ZXJCZWFuVHlwZVByb3h5KGJlYW5UeXBlUHJveHksIGZhbHNlKTsKLQkJcmV0dXJuIGJlYW5UeXBlUHJveHk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEJlYW5UeXBlUHJveHkoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBJQmVhblR5cGVQcm94eSBnZXRCZWFuVHlwZVByb3h5KFN0cmluZyBjb21wb25lbnRDbGFzc05hbWUsIGludCBkaW1lbnNpb25zKSB7Ci0JCXJldHVybiBnZXRCZWFuVHlwZVByb3h5KGdldEFycmF5Q2xhc3NuYW1lKGNvbXBvbmVudENsYXNzTmFtZSwgZGltZW5zaW9ucykpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0QmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbiwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSVByb3h5QmVhblR5cGUgZ2V0QmVhblR5cGVQcm94eShJRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgY29tcG9uZW50Q2xhc3NOYW1lLCBpbnQgZGltZW5zaW9ucykgewotCQlyZXR1cm4gZ2V0QmVhblR5cGVQcm94eShleHByZXNzaW9uLCBnZXRBcnJheUNsYXNzbmFtZShjb21wb25lbnRDbGFzc05hbWUsIGRpbWVuc2lvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3NOYW1lCi0JICogQHBhcmFtIGRpbWVuc2lvbnMKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBcnJheUNsYXNzbmFtZShTdHJpbmcgY29tcG9uZW50Q2xhc3NOYW1lLCBpbnQgZGltZW5zaW9ucykgewotCQlTdHJpbmcgam5pQ29tcG9uZW50VHlwZU5hbWUgPSBNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKGNvbXBvbmVudENsYXNzTmFtZSk7Ci0JCVN0cmluZyBjb21wVHlwZSA9IGpuaUNvbXBvbmVudFR5cGVOYW1lOwotCQlpZiAoam5pQ29tcG9uZW50VHlwZU5hbWUuY2hhckF0KDApICE9ICdbJykgewotCQkJLy8gV2UncmUgbm90IGFscmVhZHkgYW4gYXJyYXksIHNvIGNyZWF0ZSBjb3JyZWN0IHRlbXBsYXRlLgotCQkJY29tcFR5cGUgPSAoU3RyaW5nKSBNQVBfVFlQRU5BTUVfVE9fU0hPUlRTSUcuZ2V0KGNvbXBvbmVudENsYXNzTmFtZSk7Ci0JCQlpZiAoY29tcFR5cGUgPT0gbnVsbCkgewotCQkJCS8vIEl0IGlzIGEgY2xhc3MsIGFuZCBub3QgYSB0eXBlLgotCQkJCWNvbXBUeXBlID0gIkwiICsgam5pQ29tcG9uZW50VHlwZU5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCS8vIE5vdyBjcmVhdGUgaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mICdbJyBpbiBmcm9udC4KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZGltZW5zaW9ucyArIGNvbXBUeXBlLmxlbmd0aCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspCi0JCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29tcFR5cGUpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5RmFjdG9yeSN0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVybWluYXRlRmFjdG9yeShib29sZWFuIHdhaXQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3JlZ2lzdGVyQmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyQmVhblR5cGVQcm94eShJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSwgYm9vbGVhbiBwZXJtYW5lbnQpIHsKLQkJYmVhblByb3hpZXMucHV0KGFCZWFuVHlwZVByb3h5LmdldFR5cGVOYW1lKCksIGFCZWFuVHlwZVByb3h5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3JlZ2lzdGVyQmVhblR5cGVQcm94eShvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JUHJveHlCZWFuVHlwZSwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJCZWFuVHlwZVByb3h5KElQcm94eUJlYW5UeXBlIGFQcm94eUJlYW5UeXBlLCBib29sZWFuIHBlcm1hbmVudCkgewotCQlpZiAoYVByb3h5QmVhblR5cGUuaXNCZWFuUHJveHkoKSkKLQkJCXJlZ2lzdGVyQmVhblR5cGVQcm94eSgoSUJlYW5UeXBlUHJveHkpIGFQcm94eUJlYW5UeXBlLCBwZXJtYW5lbnQpOyAvLyBBIHJlZ3VsYXIga2luZCwgZG8gcmVndWxhciByZWdpc3RyYXRpb24uCi0JCWVsc2UgewotCQkJRXhwcmVzc2lvblByb3h5IGJlYW5FeHByZXNzaW9uUHJveHkgPSAoKEV4cHJlc3Npb25Qcm94eSkgYVByb3h5QmVhblR5cGUpOwotCQkJZmluYWwgU3RyaW5nIHR5cGVOYW1lID0gYVByb3h5QmVhblR5cGUuZ2V0VHlwZU5hbWUoKTsKLQkJCSgoSURFRXhwcmVzc2lvbikgYmVhbkV4cHJlc3Npb25Qcm94eS5nZXRFeHByZXNzaW9uKCkpLmFkZEJlYW5UeXBlKHR5cGVOYW1lLCBhUHJveHlCZWFuVHlwZSk7Ci0JCQliZWFuRXhwcmVzc2lvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJU3RyaW5nIHR5cGVOYW1lID0gKChJUHJveHlCZWFuVHlwZSkgZXZlbnQuZ2V0U291cmNlKCkpLmdldFR5cGVOYW1lKCk7Ci0JCQkJCXN5bmNocm9uaXplZCAoSURFU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeS50aGlzKSB7Ci0JCQkJCQlpZiAoIWJlYW5Qcm94aWVzLmNvbnRhaW5zS2V5KHR5cGVOYW1lKSkgewotCQkJCQkJCS8vIEl0IGhhc24ndCBiZWVuIHJlc29sdmVkIHRocm91Z2ggc29tZSBvdGhlciBtZWFucy4gU28gdGhpcyBpcyBnb29kLiBBY3R1YWxseSB0aGlzIHNob3VsZCBuZXZlcgotCQkJCQkJCS8vIG9jY3VyIGJlY2F1c2UgdXBvbiByZXNvbHV0aW9uIHdlJ3ZlIGFscmVhZHkgcmVnaXN0ZXJlZCB0aGUgYmVhbiB0eXBlIHByb3h5IHRocm91Z2ggdGhlCi0JCQkJCQkJLy8gbm9ybWFsIG1lY2hhbmlzbXMuIEJ1dCB0byBiZSBzYWZlLCB3ZSdsbCBkbyBpdCBoZXJlLgotCQkJCQkJCWJlYW5Qcm94aWVzLnB1dCh0eXBlTmFtZSwgZXZlbnQuZ2V0UHJveHkoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChFeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCBldmVudCkgewotCQkJCQkoKElERUV4cHJlc3Npb24pICgoRXhwcmVzc2lvblByb3h5KSBldmVudC5nZXRTb3VyY2UoKSkuZ2V0RXhwcmVzc2lvbigpKS5yZW1vdmVCZWFuVHlwZSh0eXBlTmFtZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNCZWFuVHlwZVJlZ2lzdGVyZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0JlYW5UeXBlUmVnaXN0ZXJlZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBiZWFuUHJveGllcy5jb250YWluc0tleShNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKGNsYXNzTmFtZSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjcmVnaXN0ZXJlZFR5cGVzKCkKLQkgKi8KLQlwdWJsaWMgU2V0IHJlZ2lzdGVyZWRUeXBlcygpIHsKLQkJcmV0dXJuIGJlYW5Qcm94aWVzLmtleVNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3RvcnkjaXNCZWFuVHlwZU5vdEZvdW5kKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JlYW5UeXBlTm90Rm91bmQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkvLyBEbyBub3RoaW5nLiBObyBuZWVkIGZvciBpdCBpbiBJREUgc3lzdGVtIGJlY2F1c2UgdGhlcmUgd2lsbCBhbHdheXMgYmUgYSBwcm94eSwgZXZlbiB3aGVuIG5vdCBmb3VuZC4KLQkJLy8gSW4gdGhhdCBjYXNlIGFuIElERUluaXRFcnJvckJlYW5UeXBlUHJveHkgd2lsbCBiZSBjcmVhdGVkLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JU3RhbmRhcmRCZWFuVHlwZVByb3h5RmFjdG9yeSNpc01haW50YWluTm90Rm91bmRUeXBlcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYWludGFpbk5vdEZvdW5kVHlwZXMoKSB7Ci0JCS8vIERvIG5vdGhpbmcuIE5vIG5lZWQgZm9yIGl0IGluIElERSBzeXN0ZW0gYmVjYXVzZSB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhIHByb3h5LCBldmVuIHdoZW4gbm90IGZvdW5kLgotCQkvLyBJbiB0aGF0IGNhc2UgYW4gSURFSW5pdEVycm9yQmVhblR5cGVQcm94eSB3aWxsIGJlIGNyZWF0ZWQuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5I3NldE1haW50YWluTm90Rm91bmRUeXBlcyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW50YWluTm90Rm91bmRUeXBlcyhib29sZWFuIG1haW50YWluKSB7Ci0JCS8vIERvIG5vdGhpbmcuIE5vIG5lZWQgZm9yIGl0IGluIElERSBzeXN0ZW0gYmVjYXVzZSB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhIHByb3h5LCBldmVuIHdoZW4gbm90IGZvdW5kLgotCQkvLyBJbiB0aGF0IGNhc2UgYW4gSURFSW5pdEVycm9yQmVhblR5cGVQcm94eSB3aWxsIGJlIGNyZWF0ZWQuCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdHJpbmdCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RyaW5nQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDNmZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVTdHJpbmdCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVN0cmluZ0JlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0vKioKLSAqIElERSBJbXBsZW1lbnRhdGlvbiBvZiBJU3RyaW5nQmVhblByb3h5Ci0gKiBDcmVhdGlvbiBkYXRlOiAoMi82LzAwIDk6MDI6NDIgQU0pCi0gKiBAYXV0aG9yOiBKb2UgV2luY2hlc3RlcgotICovCi1maW5hbCBjbGFzcyBJREVTdHJpbmdCZWFuUHJveHkgZXh0ZW5kcyBJREVPYmplY3RCZWFuUHJveHkgaW1wbGVtZW50cyBJU3RyaW5nQmVhblByb3h5IHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJpbmc7Ci0vKioKLSAqIFN0b3JlIHRoZSBiZWFuIGluIHRoZSBzdHJpbmcgZmllbGQgdG8gc2F2ZSByZS1jYXN0aW5nIGVhY2ggdGltZSBpdCBpcyBhc2tlZCBmb3IuCi0gKiBJdCBpcyBwYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIGNyZWF0ZWQKLSAqIGluIGEgc3BlY2lhbCB3YXkgYW5kIG5vIG9uZSBlbHNlIHNob3VsZCBjcmVhdGUgdGhlbS4KLSAqLwotSURFU3RyaW5nQmVhblByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgT2JqZWN0IGFCZWFuLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCXN1cGVyKGFSZWdpc3RyeSwgYUJlYW4sYUJlYW5UeXBlUHJveHkpOwotCWZTdHJpbmcgPSAoU3RyaW5nKWFCZWFuOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGNhY2hlJ2Qgc3RyaW5nIHRoYXQgaXMgYSBqYXZhLmxhbmcuU3RyaW5nIHRoYXQgdGhlIElERSBjYW4gdXNlCi0gKi8KLXB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7Ci0JcmV0dXJuIGZTdHJpbmc7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVN0cmluZ0JlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RyaW5nQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGQxNjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFU3RyaW5nQmVhblR5cGVQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFU3RyaW5nQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklTdHJpbmdCZWFuUHJveHk7Ci0vKioKLSAqIElERSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQmVhblR5cGUgcHJveHkgZm9yIGphdmEubGFuZy5TdHJpbmcKLSAqLwotZmluYWwgY2xhc3MgSURFU3RyaW5nQmVhblR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCS8vIENhY2hlIGEgcHJveHkgdG8gYW4gZW1wdHkgc3RyaW5nIGZvciBzcGVlZAotCXByb3RlY3RlZCBmaW5hbCBJREVTdHJpbmdCZWFuUHJveHkgZW1wdHlTdHJpbmdQcm94eTsKLQotSURFU3RyaW5nQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIGFDbGFzcykgewotCXN1cGVyKGFSZWdpc3RyeSwgYUNsYXNzKTsKLQkvLyBDYWNoZSBhIHByb3h5IHRvIGFuIGVtcHR5IHN0cmluZyBmb3Igc3BlZWQKLQllbXB0eVN0cmluZ1Byb3h5ID0gbmV3IElERVN0cmluZ0JlYW5Qcm94eShhUmVnaXN0cnksICIiLHRoaXMpOwkvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIEhlbHBlciB0byBjcmVhdGUgc3RyaW5nIGJlYW5zCi0gKiBQYWNrYWdlIHByb3RlY3RlZCBiZWNhdXNlIG5vLW9uZSBlbHNlIG91dHNpZGUgdGhlIHBhY2thZ2Ugc2hvdWxkIHVzZSB0aGlzLCB0aGV5Ci0gKiBtdXN0IGdvIHRocm91Z2ggdGhlIEFQSSB3aGVyZSB5b3UgbG9vayB1cCBhIGZhY3RvcnkgZmlyc3QuCi0gKi8KLUlTdHJpbmdCZWFuUHJveHkgY3JlYXRlU3RyaW5nQmVhblByb3h5KFN0cmluZyBhU3RyaW5nKXsKLQlpZiAoIGFTdHJpbmcuZXF1YWxzKCIiKSApIHsvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbXB0eVN0cmluZ1Byb3h5OwotCX0gZWxzZSB7Ci0JCXJldHVybiBuZXcgSURFU3RyaW5nQmVhblByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSxhU3RyaW5nLHRoaXMpOwotCX0KLX0KLS8qIFNwZWNpYWxpemVkIGZyb20gSURFQmVhblR5cGVQcm94eSB0byBlbnN1cmUgSVN0cmluZ0JlYW5Qcm94aWVzIGFyZSBjcmVhdGVkIGNvcnJlY3RseQotICovCi1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiAoSUlERUJlYW5Qcm94eSljcmVhdGVTdHJpbmdCZWFuUHJveHkoIChTdHJpbmcpYW5PYmplY3QgKTsKLQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVUaHJvd2FibGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVUaHJvd2FibGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODMwZDFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSURFVGhyb3dhYmxlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVUaHJvd2FibGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA2ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci0KLXB1YmxpYyBjbGFzcyBJREVUaHJvd2FibGVQcm94eSBleHRlbmRzIFRocm93YWJsZVByb3h5IGltcGxlbWVudHMgSUlERUJlYW5Qcm94eSB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcxNjI3NTc5NjExNzU5NzgzMzhMOwotCXByb3RlY3RlZCBJQmVhblR5cGVQcm94eSBmQmVhblR5cGVQcm94eTsKLQotCXByb3RlY3RlZCBJREVUaHJvd2FibGVQcm94eShUaHJvd2FibGUgZXhjLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSkgewotCQlzdXBlcihleGMpOwotCQlmQmVhblR5cGVQcm94eSA9IGFCZWFuVHlwZVByb3h5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSUlERUJlYW5Qcm94eSkgewotCQkJcmV0dXJuIGdldENhdXNlKCkuZXF1YWxzKCgoSUlERUJlYW5Qcm94eSkgb2JqKS5nZXRCZWFuKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5I3NhbWVBcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblByb3h5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJQmVhblByb3h5IGFCZWFuUHJveHkpIHsKLQkJaWYgKHRoaXMgPT0gYUJlYW5Qcm94eSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYUJlYW5Qcm94eSBpbnN0YW5jZW9mIElJREVCZWFuUHJveHkpCi0JCQlyZXR1cm4gZ2V0Q2F1c2UoKSA9PSAoKElJREVCZWFuUHJveHkpIGFCZWFuUHJveHkpLmdldEJlYW4oKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQlyZXR1cm4gZ2V0Q2F1c2UoKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHlNZXNzYWdlKCkgewotCQlyZXR1cm4gZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCWdldENhdXNlKCkucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7Ci0JfQotCXB1YmxpYyB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gc3RyZWFtKSB7Ci0JCWdldENhdXNlKCkucHJpbnRTdGFja1RyYWNlKHN0cmVhbSk7Ci0JfQotCXB1YmxpYyB2b2lkIHByaW50UHJveHlTdGFja1RyYWNlKCkgewotCQlnZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQlwdWJsaWMgSUJlYW5UeXBlUHJveHkgZ2V0VHlwZVByb3h5KCkgewotCQlyZXR1cm4gZkJlYW5UeXBlUHJveHk7Ci0JfQotCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRQcm94eUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGZCZWFuVHlwZVByb3h5LmdldFByb3h5RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9CZWFuU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q2F1c2UoKS50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBleGNlcHRpb24gd2hpY2ggaXMgdGhlIGxpdmUgYmVhbgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QmVhbigpIHsKLQkJcmV0dXJuIGdldENhdXNlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5I2lzQmVhblByb3h5KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JlYW5Qcm94eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklQcm94eSNpc0V4cHJlc3Npb25Qcm94eSgpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFeHByZXNzaW9uUHJveHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVZNU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL0lERVZNU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYzI5YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JREVWTVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFVk1TZXJ2ZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowNiAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLQotcHVibGljIGNsYXNzIElERVZNU2VydmVyIGltcGxlbWVudHMgSVZNQ2FsbGJhY2tTZXJ2ZXIgewotCQotCUlERUNhbGxiYWNrUmVnaXN0cnkgZkNhbGxiYWNrUmVnaXN0cnk7Ci0JSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5IGZCZWFuUHJveHlGYWN0b3J5OwotCQotSURFVk1TZXJ2ZXIoSURFQ2FsbGJhY2tSZWdpc3RyeSBhQ2FsbGJhY2tSZWdpc3RyeSl7Ci0JZkNhbGxiYWNrUmVnaXN0cnkgPSBhQ2FsbGJhY2tSZWdpc3RyeTsKLQlmQmVhblByb3h5RmFjdG9yeSA9IChJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpZkNhbGxiYWNrUmVnaXN0cnkuZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKTsKLQkKLX0JCi1wdWJsaWMgT2JqZWN0IGRvQ2FsbGJhY2soSUNhbGxiYWNrUnVubmFibGUgYVJ1bm5hYmxlKXsKLQl0cnkgewotCQlyZXR1cm4gYVJ1bm5hYmxlLnJ1bihuZXcgSUNhbGxiYWNrSGFuZGxlcigpewotCQkJcHVibGljIE9iamVjdCBjYWxsYmFja1dpdGhQYXJtcyhpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyl7Ci0JCQkJLy8gV2UgYXJlIHJ1bm5pbmcgaW4gdGhlIHNhbWUgSURFIHNvIGp1c3QgY2FsbCB0aGUgcmVnaXN0cnkgZGlyZWN0bHkKLQkJCQkvLyBhbHRob3VnaCB3ZSBtdXN0IGNvbnZlcnQgdGhlIHBhcm1zIHRvIGJlYW4gcHJveGllcwotCQkJCU9iamVjdFtdIHByb3h5UGFybXMgPSBudWxsOwotCQkJCS8vIElmIHdlIGhhdmUgYW55IHBhcm1zIHRoZW4gY29udmVydCB0aGVtIHRvIGJlYW4gcHJveGllcwotCQkJCWlmICggcGFybXMgIT0gbnVsbCApIHsKLQkJCQkJcHJveHlQYXJtcyA9IG5ldyBPYmplY3RbcGFybXMubGVuZ3RoXTsKLQkJCQkJZm9yICggaW50IGk9MDtpPHBhcm1zLmxlbmd0aDtpKyspewotCQkJCQkJT2JqZWN0IHAgPSBwYXJtc1tpXTsKLQkJCQkJCXByb3h5UGFybXNbaV0gPSBjcmVhdGVOZXh0UGFybShwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZkNhbGxiYWNrUmVnaXN0cnkudm1DYWxsYmFjayhjYWxsYmFja0lELG1zZ0lELHByb3h5UGFybXMpOwotCQkJfQotCi0JCQlwcml2YXRlIE9iamVjdCBjcmVhdGVOZXh0UGFybShPYmplY3QgcCkgewotCQkJCWlmICghKHAgaW5zdGFuY2VvZiBJQ2FsbGJhY2tIYW5kbGVyLlRyYW5zbWl0YWJsZUFycmF5KSkgewotCQkJCQlyZXR1cm4gZkJlYW5Qcm94eUZhY3RvcnkuY3JlYXRlSURFQmVhblByb3h5V2l0aChwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3RbXSBhcnJheSA9ICgoSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSkgcCkuZ2V0QXJyYXkoKTsKLQkJCQkJT2JqZWN0W10gcGFybSA9IG5ldyBPYmplY3RbYXJyYXkubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQkJcGFybVtpXSA9IGNyZWF0ZU5leHRQYXJtKGFycmF5W2ldKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcGFybTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5JQ2FsbGJhY2tIYW5kbGVyI2NhbGxiYWNrQXNDb25zdGFudHMoaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3QgY2FsbGJhY2tBc0NvbnN0YW50cyhpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lELCBPYmplY3QgcGFybSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQkJCXJldHVybiBmQ2FsbGJhY2tSZWdpc3RyeS52bUNhbGxiYWNrKGNhbGxiYWNrSUQsbXNnSUQscGFybSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9IGNhdGNoICggQ29tbWFuZEV4Y2VwdGlvbiBleGMgKSB7Ci0JCXJldHVybiBudWxsOwkKLQl9Ci19Ci0KLXB1YmxpYyBPdXRwdXRTdHJlYW0gcmVxdWVzdFN0cmVhbShpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGZDYWxsYmFja1JlZ2lzdHJ5LnJlcXVlc3RTdHJlYW0oY2FsbGJhY2tJRCxtc2dJRCk7Ci19Ci1wdWJsaWMgSVZNU2VydmVyIGdldElWTVNlcnZlcigpIHsKLQlyZXR1cm4gZkNhbGxiYWNrUmVnaXN0cnkuZlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvSUlERUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JSURFQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmJhZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9JSURFQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJSURFQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDYgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eTsKLQotCi0vKioKLSAqIEludGVyZmFjZSB0aGF0IGFsbG93cyB0aGUgSURFIFZNIHRvIGdldCB0aGUgYWN0dWFsIGJlYW4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUlERUJlYW5Qcm94eSBleHRlbmRzIElCZWFuUHJveHkgewotLyoqCi0gKiBHZXQgdGhlIGFjdHVhbCBsaXZlIGJlYW4uIAotICogVVNFIHdpdGggZXh0cmVtZSBjYXJlLgotICovCi1wdWJsaWMgT2JqZWN0IGdldEJlYW4oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERURpbWVuc2lvbkJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFRGltZW5zaW9uQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWIwNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFRGltZW5zaW9uQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSURFRGltZW5zaW9uQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSURpbWVuc2lvbkJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERU9iamVjdEJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgSURFRGltZW5zaW9uQmVhblByb3h5IGV4dGVuZHMgSURFT2JqZWN0QmVhblByb3h5IGltcGxlbWVudHMgSURpbWVuc2lvbkJlYW5Qcm94eSB7Ci0JCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBmRGltZW5zaW9uOwotCi1JREVEaW1lbnNpb25CZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LE9iamVjdCBhRGltZW5zaW9uLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSl7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LGFEaW1lbnNpb24sYUJlYW5UeXBlUHJveHkpOwotCWZEaW1lbnNpb24gPSAoRGltZW5zaW9uKWFEaW1lbnNpb247Ci19Ci1wdWJsaWMgaW50IGdldFdpZHRoKCl7Ci0JcmV0dXJuIGZEaW1lbnNpb24ud2lkdGg7Ci19Ci1wdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgYVdpZHRoKXsKLQlmRGltZW5zaW9uLndpZHRoID0gYVdpZHRoOwotfQotcHVibGljIGludCBnZXRIZWlnaHQoKXsKLQlyZXR1cm4gZkRpbWVuc2lvbi5oZWlnaHQ7Ci19Ci1wdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGFIZWlnaHQpewotCWZEaW1lbnNpb24uaGVpZ2h0ID0gYUhlaWdodDsKLX0KLXB1YmxpYyB2b2lkIHNldFNpemUoSURpbWVuc2lvbkJlYW5Qcm94eSBhQmVhblByb3h5KXsKLQlmRGltZW5zaW9uLnNldFNpemUobmV3IERpbWVuc2lvbihhQmVhblByb3h5LmdldFdpZHRoKCksYUJlYW5Qcm94eS5nZXRIZWlnaHQoKSkpOwotfQotcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCWZEaW1lbnNpb24ud2lkdGggPSB3aWR0aDsKLQlmRGltZW5zaW9uLmhlaWdodCA9IGhlaWdodDsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERURpbWVuc2lvbkJlYW5UeXBlUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERURpbWVuc2lvbkJlYW5UeXBlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzOGE4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVEaW1lbnNpb25CZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSURFRGltZW5zaW9uQmVhblR5cGVQcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuKjsKLQotcHVibGljIGNsYXNzIElERURpbWVuc2lvbkJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQotSURFRGltZW5zaW9uQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpewotCXRoaXMoYVJlZ2lzdHJ5LERpbWVuc2lvbi5jbGFzcyk7Ci19Ci0KLXByaXZhdGUgSURFRGltZW5zaW9uQmVhblR5cGVQcm94eShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnksIENsYXNzIHR5cGUpewotCXN1cGVyKGFSZWdpc3RyeSwgdHlwZSk7Ci19Ci0KLXByb3RlY3RlZCBJSURFQmVhblByb3h5IG5ld0JlYW5Qcm94eShPYmplY3QgYW5PYmplY3QpewotCi0JcmV0dXJuIG5ldyBJREVEaW1lbnNpb25CZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhbk9iamVjdCwgdGhpcyk7Ci0KLX0KLUlERURpbWVuc2lvbkJlYW5Qcm94eSBjcmVhdGVEaW1lbnNpb25CZWFuUHJveHkoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQlyZXR1cm4gbmV3IElERURpbWVuc2lvbkJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IERpbWVuc2lvbih3aWR0aCxoZWlnaHQpLHRoaXMpOwotfQotCS8qCi0JICogQHNlZSBJREVCZWFuVHlwZVByb3h5I25ld0JlYW5UeXBlRm9yQ2xhc3MoQ2xhc3MpCi0JICovCi0JcHVibGljIElERUJlYW5UeXBlUHJveHkgbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgSURFRGltZW5zaW9uQmVhblR5cGVQcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIHR5cGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUG9pbnRCZWFuUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDc0Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUG9pbnRCZWFuUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5hd3Q7Ci0vKgotICogICRSQ1NmaWxlOiBJREVQb2ludEJlYW5Qcm94eS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5UeXBlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVBvaW50QmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFT2JqZWN0QmVhblByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBJREVQb2ludEJlYW5Qcm94eSBleHRlbmRzIElERU9iamVjdEJlYW5Qcm94eSBpbXBsZW1lbnRzIElQb2ludEJlYW5Qcm94eSB7Ci0JCi0JcHJvdGVjdGVkIFBvaW50IGZQb2ludDsKLQotSURFUG9pbnRCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LE9iamVjdCBhUG9pbnQsIElCZWFuVHlwZVByb3h5IGFCZWFuVHlwZVByb3h5KXsKLQlzdXBlcihhUmVnaXN0cnksYVBvaW50LGFCZWFuVHlwZVByb3h5KTsKLQlmUG9pbnQgPSAoUG9pbnQpYVBvaW50OwotfQotcHVibGljIGludCBnZXRYKCl7Ci0JcmV0dXJuIGZQb2ludC54OwotfQotcHVibGljIHZvaWQgc2V0WChpbnQgYW5YKXsKLQlmUG9pbnQueCA9IGFuWDsKLX0KLXB1YmxpYyBpbnQgZ2V0WSgpewotCXJldHVybiBmUG9pbnQueTsKLX0KLXB1YmxpYyB2b2lkIHNldFkoaW50IGFZKXsKLQlmUG9pbnQueSA9IGFZOwotfQotcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBvaW50QmVhblByb3h5IGFCZWFuUHJveHkpewotCWZQb2ludC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoYUJlYW5Qcm94eS5nZXRYKCksYUJlYW5Qcm94eS5nZXRZKCkpKTsKLX0KLXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCBhblgsIGludCBhWSl7Ci0JZlBvaW50LnggPSBhblg7Ci0JZlBvaW50LnkgPSBhWTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVBvaW50QmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUG9pbnRCZWFuVHlwZVByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjQyNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUG9pbnRCZWFuVHlwZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSURFUG9pbnRCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLio7Ci0KLXB1YmxpYyBjbGFzcyBJREVQb2ludEJlYW5UeXBlUHJveHkgZXh0ZW5kcyBJREVCZWFuVHlwZVByb3h5IHsKLQotSURFUG9pbnRCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSl7Ci0JdGhpcyhhUmVnaXN0cnksUG9pbnQuY2xhc3MpOwotfQotcHJpdmF0ZSBJREVQb2ludEJlYW5UeXBlUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LCBDbGFzcyB0eXBlKXsKLQlzdXBlcihhUmVnaXN0cnksdHlwZSk7Ci19Ci1wcm90ZWN0ZWQgSUlERUJlYW5Qcm94eSBuZXdCZWFuUHJveHkoT2JqZWN0IGFuT2JqZWN0KXsKLQotCXJldHVybiBuZXcgSURFUG9pbnRCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCBhbk9iamVjdCwgdGhpcyk7Ci0KLX0KLUlERVBvaW50QmVhblByb3h5IGNyZWF0ZVBvaW50QmVhblByb3h5KGludCB4LCBpbnQgeSl7Ci0JcmV0dXJuIG5ldyBJREVQb2ludEJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksbmV3IFBvaW50KHgseSksdGhpcyk7Ci19Ci0JLyoKLQkgKiBAc2VlIElERUJlYW5UeXBlUHJveHkjbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcykKLQkgKi8KLQlwdWJsaWMgSURFQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKENsYXNzIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBJREVQb2ludEJlYW5UeXBlUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LCB0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlY3RhbmdsZUJlYW5Qcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUmVjdGFuZ2xlQmVhblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWQ1ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUmVjdGFuZ2xlQmVhblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSURFUmVjdGFuZ2xlQmVhblByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERU9iamVjdEJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgSURFUmVjdGFuZ2xlQmVhblByb3h5IGV4dGVuZHMgSURFT2JqZWN0QmVhblByb3h5IGltcGxlbWVudHMgSVJlY3RhbmdsZUJlYW5Qcm94eSB7Ci0JCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBmUmVjdGFuZ2xlOwotCi1JREVSZWN0YW5nbGVCZWFuUHJveHkoSURFUHJveHlGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5LE9iamVjdCBhUmVjdGFuZ2xlLCBJQmVhblR5cGVQcm94eSBhQmVhblR5cGVQcm94eSl7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LGFSZWN0YW5nbGUsYUJlYW5UeXBlUHJveHkpOwotCWZSZWN0YW5nbGUgPSAoUmVjdGFuZ2xlKWFSZWN0YW5nbGU7Ci19Ci1wdWJsaWMgaW50IGdldFgoKXsKLQlyZXR1cm4gZlJlY3RhbmdsZS54OwotfQotcHVibGljIHZvaWQgc2V0WChpbnQgYW5YKXsKLQlmUmVjdGFuZ2xlLnggPSBhblg7Ci19Ci1wdWJsaWMgaW50IGdldFkoKXsKLQlyZXR1cm4gZlJlY3RhbmdsZS55OwotfQotcHVibGljIHZvaWQgc2V0WShpbnQgYVkpewotCWZSZWN0YW5nbGUueSA9IGFZOwotfQotcHVibGljIGludCBnZXRIZWlnaHQoKXsKLQlyZXR1cm4gZlJlY3RhbmdsZS5oZWlnaHQ7Ci19Ci1wdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGFIZWlnaHQpewotCWZSZWN0YW5nbGUuaGVpZ2h0ID0gYUhlaWdodDsKLX0KLXB1YmxpYyB2b2lkIHNldFdpZHRoKGludCBhV2lkdGgpewotCWZSZWN0YW5nbGUud2lkdGggPSBhV2lkdGg7Ci19Ci1wdWJsaWMgaW50IGdldFdpZHRoKCl7Ci0JcmV0dXJuIGZSZWN0YW5nbGUud2lkdGg7Ci19Ci1wdWJsaWMgdm9pZCBzZXRCb3VuZHMoSVJlY3RhbmdsZUJlYW5Qcm94eSBhQmVhblByb3h5KXsKLQlmUmVjdGFuZ2xlLnNldEJvdW5kcyhhQmVhblByb3h5LmdldFgoKSxhQmVhblByb3h5LmdldFkoKSxhQmVhblByb3h5LmdldFdpZHRoKCksYUJlYW5Qcm94eS5nZXRIZWlnaHQoKSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRCb3VuZHMoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCWZSZWN0YW5nbGUuc2V0Qm91bmRzKHgseSx3aWR0aCxoZWlnaHQpOwotfQotcHVibGljIHZvaWQgc2V0U2l6ZShJRGltZW5zaW9uQmVhblByb3h5IGFCZWFuUHJveHkpewotCWZSZWN0YW5nbGUuc2V0U2l6ZShhQmVhblByb3h5LmdldFdpZHRoKCksYUJlYW5Qcm94eS5nZXRXaWR0aCgpKTsKLX0KLXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQb2ludEJlYW5Qcm94eSBhQmVhblByb3h5KXsKLQlmUmVjdGFuZ2xlLnNldExvY2F0aW9uKGFCZWFuUHJveHkuZ2V0WCgpLGFCZWFuUHJveHkuZ2V0WSgpKTsKLX0KLXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCB4LCBpbnQgeSl7Ci0JZlJlY3RhbmdsZS5zZXRMb2NhdGlvbih4LHkpOwotfQotcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpewotCWZSZWN0YW5nbGUuc2V0U2l6ZSh3aWR0aCxoZWlnaHQpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDc2ODcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVJlY3RhbmdsZUJlYW5UeXBlUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5hd3Q7Ci0vKgotICogICRSQ1NmaWxlOiBJREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS4qOwotCi1wdWJsaWMgY2xhc3MgSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eSBleHRlbmRzIElERUJlYW5UeXBlUHJveHkgewotCi1JREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSl7Ci0JdGhpcyhhUmVnaXN0cnksUmVjdGFuZ2xlLmNsYXNzKTsKLX0KLQotcHJpdmF0ZSBJREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5KElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSwgQ2xhc3MgdHlwZSl7Ci0Jc3VwZXIoYVJlZ2lzdHJ5LHR5cGUpOwotfQotcHJvdGVjdGVkIElJREVCZWFuUHJveHkgbmV3QmVhblByb3h5KE9iamVjdCBhbk9iamVjdCl7Ci0KLQlyZXR1cm4gbmV3IElERVJlY3RhbmdsZUJlYW5Qcm94eShmUHJveHlGYWN0b3J5UmVnaXN0cnksIGFuT2JqZWN0LCB0aGlzKTsKLQotfQotSURFUmVjdGFuZ2xlQmVhblByb3h5IGNyZWF0ZVJlY3RhbmdsZUJlYW5Qcm94eShpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JcmV0dXJuIG5ldyBJREVSZWN0YW5nbGVCZWFuUHJveHkoZlByb3h5RmFjdG9yeVJlZ2lzdHJ5LG5ldyBSZWN0YW5nbGUoeCx5LHdpZHRoLGhlaWdodCksdGhpcyk7Ci19Ci0JLyoKLQkgKiBAc2VlIElERUJlYW5UeXBlUHJveHkjbmV3QmVhblR5cGVGb3JDbGFzcyhDbGFzcykKLQkgKi8KLQlwdWJsaWMgSURFQmVhblR5cGVQcm94eSBuZXdCZWFuVHlwZUZvckNsYXNzKENsYXNzIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBJREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5KGZQcm94eUZhY3RvcnlSZWdpc3RyeSwgdHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVSZWdpc3RlckFXVC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFUmVnaXN0ZXJBV1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmYjBlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVSZWdpc3RlckFXVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLmF3dDsKLS8qCi0gKiAgJFJDU2ZpbGU6IElERVJlZ2lzdGVyQVdULmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIEFXVCBmYWN0b3JpZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJREVSZWdpc3RlckFXVCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQVdUKElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCW5ldyBJREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5KHJlZ2lzdHJ5KTsKLQkJbmV3IElERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeShyZWdpc3RyeSk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3Byb3h5aWRlL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9pZGUvYXd0L0lERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNDhjOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuYXd0OwotLyoKLSAqICAkUkNTZmlsZTogSURFU3RhbmRhcmRBV1RCZWFuUHJveHlGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDcgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuYXd0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERVByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotLyoqCi0gKiBTdGFuZGFyZCBBV1QgQmVhbiBQcm94eSBGYWN0b3J5LgotICogUGFja2FnZSBwcm90ZWN0ZWQgYmVjYXVzZSBpdCBzaG91bGQgbm90IHJlZmVyZW5jZWQKLSAqIG91dHNpZGUgb2YgdGhlIHBhY2thZ2Ugb3RoZXIgdGhhbiB0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCi0gKi8KLWNsYXNzIElERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkgewotCi0JZmluYWwgSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeSBmQVdUQmVhblR5cGVGYWN0b3J5OwotCQotcHVibGljIElERVN0YW5kYXJkQVdUQmVhblByb3h5RmFjdG9yeShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5KSB7Ci0JZmFjdG9yeS5yZWdpc3RlckJlYW5Qcm94eUZhY3RvcnkoSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5SRUdJU1RSWV9LRVksIHRoaXMpOwotCWZBV1RCZWFuVHlwZUZhY3RvcnkgPSAoSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeSlmYWN0b3J5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5RXh0ZW5zaW9uKElERVN0YW5kYXJkQVdUQmVhblR5cGVQcm94eUZhY3RvcnkuQkVBTl9UWVBFX0ZBQ1RPUllfS0VZKTsKLX0KLXB1YmxpYyBJRGltZW5zaW9uQmVhblByb3h5IGNyZWF0ZURpbWVuc2lvbkJlYW5Qcm94eVdpdGgoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQlyZXR1cm4gZkFXVEJlYW5UeXBlRmFjdG9yeS5kaW1lbnNpb25UeXBlLmNyZWF0ZURpbWVuc2lvbkJlYW5Qcm94eSh3aWR0aCxoZWlnaHQpOwotfQotCi1wdWJsaWMgSVBvaW50QmVhblByb3h5IGNyZWF0ZVBvaW50QmVhblByb3h5V2l0aChpbnQgeCwgaW50IHkpewotCXJldHVybiBmQVdUQmVhblR5cGVGYWN0b3J5LnBvaW50VHlwZS5jcmVhdGVQb2ludEJlYW5Qcm94eSh4LHkpOwotfQotcHVibGljIElSZWN0YW5nbGVCZWFuUHJveHkgY3JlYXRlQmVhblByb3h5V2l0aChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JcmV0dXJuIGZBV1RCZWFuVHlwZUZhY3RvcnkucmVjdGFuZ2xlVHlwZS5jcmVhdGVSZWN0YW5nbGVCZWFuUHJveHkoeCx5LHdpZHRoLGhlaWdodCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXJtaW5hdGVGYWN0b3J5KGJvb2xlYW4gd2FpdCkgewotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9wcm94eWlkZS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvaWRlL2F3dC9JREVTdGFuZGFyZEFXVEJlYW5UeXBlUHJveHlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjcwOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcHJveHlpZGUvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2lkZS9hd3QvSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA3ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5hd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuKjsKLQotLyoqCi0gKiBCZWFuVHlwZSBmYWN0b3J5IHN0YW5kYXJkIEFXVCBiZWFuIHR5cGVzLiBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2UgaXQgc2hvdWxkbid0IGJlIHJlZmVyZW5jZWQgb3V0c2lkZSB0aGUgcGFja2FnZS4gSXQgc2hvdWxkIG9ubHkgYmUKLSAqIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGludGVyZmFjZS4KLSAqLwotY2xhc3MgSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeSBpbXBsZW1lbnRzIElERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5IHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9UWVBFX0ZBQ1RPUllfS0VZID0gImphdmEuYXd0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIElERVByb3h5RmFjdG9yeVJlZ2lzdHJ5IGZGYWN0b3J5UmVnaXN0cnk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSURFRGltZW5zaW9uQmVhblR5cGVQcm94eSBkaW1lbnNpb25UeXBlOwotCi0JcHJvdGVjdGVkIGZpbmFsIElERVBvaW50QmVhblR5cGVQcm94eSBwb2ludFR5cGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSURFUmVjdGFuZ2xlQmVhblR5cGVQcm94eSByZWN0YW5nbGVUeXBlOwotCi0JSURFU3RhbmRhcmRBV1RCZWFuVHlwZVByb3h5RmFjdG9yeShJREVQcm94eUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJZkZhY3RvcnlSZWdpc3RyeSA9IGFSZWdpc3RyeTsKLQkJZkZhY3RvcnlSZWdpc3RyeS5yZWdpc3RlckJlYW5UeXBlUHJveHlGYWN0b3J5KEJFQU5fVFlQRV9GQUNUT1JZX0tFWSwgdGhpcyk7Ci0JCWRpbWVuc2lvblR5cGUgPSBuZXcgSURFRGltZW5zaW9uQmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJcG9pbnRUeXBlID0gbmV3IElERVBvaW50QmVhblR5cGVQcm94eShmRmFjdG9yeVJlZ2lzdHJ5KTsKLQkJcmVjdGFuZ2xlVHlwZSA9IG5ldyBJREVSZWN0YW5nbGVCZWFuVHlwZVByb3h5KGZGYWN0b3J5UmVnaXN0cnkpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFRXh0ZW5zaW9uQmVhblR5cGVQcm94eUZhY3RvcnkjZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJREVCZWFuVHlwZVByb3h5IGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIGNsYXNzTmFtZSkgewotCi0JCWlmICgiamF2YS5hd3QuRGltZW5zaW9uIi5lcXVhbHMoY2xhc3NOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGRpbWVuc2lvblR5cGU7Ci0JCWVsc2UgaWYgKCJqYXZhLmF3dC5Qb2ludCIuZXF1YWxzKGNsYXNzTmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBwb2ludFR5cGU7Ci0JCWVsc2UgaWYgKCJqYXZhLmF3dC5SZWN0YW5nbGUiLmVxdWFscyhjbGFzc05hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVjdGFuZ2xlVHlwZTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVFeHRlbnNpb25CZWFuVHlwZVByb3h5RmFjdG9yeSNnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklCZWFuVHlwZVByb3h5KQotCSAqLwotCXB1YmxpYyBJREVCZWFuVHlwZVByb3h5IGdldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoU3RyaW5nIGNsYXNzTmFtZSwgSUJlYW5UeXBlUHJveHkgYmVhblR5cGVQcm94eSkgewotCi0JCXJldHVybiBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaWRlLklERUV4dGVuc2lvbkJlYW5UeXBlUHJveHlGYWN0b3J5I2dldEV4dGVuc2lvbkJlYW5UeXBlUHJveHkoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBJUHJveHlCZWFuVHlwZSBnZXRFeHRlbnNpb25CZWFuVHlwZVByb3h5KFN0cmluZyB0eXBlTmFtZSwgSUV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uQmVhblR5cGVQcm94eSh0eXBlTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eUZhY3RvcnkjdGVybWluYXRlRmFjdG9yeShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZhY3RvcnkoYm9vbGVhbiB3YWl0KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL0NvbW1hbmRFcnJvckV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL0NvbW1hbmRFcnJvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJiMTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9Db21tYW5kRXJyb3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBDb21tYW5kRXJyb3JFeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci0vKioKLSAqIEFuIGVycm9yIHJldHVybiBmcm9tIGEgY29tbWFuZC4gVGhpcyBpcyBjbGVhbiByZXR1cm4gaW4gdGhhdAotICogdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgdmFsaWQgYW5kIGFsaXZlLgotICogQWZ0ZXIgaXQgaGFzIGJlZW4gcHJvY2Vzc2VkIHRoZSBkYXRhIHdpbGwgYmUgdGhlIHZhbHVlIHJldHJpZXZlZAotICogb3V0IG9mIHRoZSB2YWx1ZW9iamVjdCBhbmQgbWFkZSBpbnRvIGEgcHJveHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE3MDE3NTIwMzU2MDY1OTMzMDVMOwotCXByaXZhdGUgZmluYWwgT2JqZWN0IGZFcnJvck9iamVjdDsKLQlwcml2YXRlIGZpbmFsIGludCBmRXJyb3JDb2RlOwotCQotCXB1YmxpYyBDb21tYW5kRXJyb3JFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgQ29tbWFuZHMuVmFsdWVPYmplY3QgZXJyb3JEYXRhKSB7Ci0JCXN1cGVyKGVycm9yRGF0YS5jbG9uZSgpKTsJLy8gQ2xvbmUgaXQgYmVjYXVzZSB0eXBpY2FsbHkgdGhlc2UgZ2V0IHJldXNlZCBhbmQgY2xlYXJlZCBvdXQuIFRoaXMgd2F5IHdlIGhhdmUgb3VyIG93bi4KLQkJZkVycm9yT2JqZWN0ID0gbnVsbDsKLQkJZkVycm9yQ29kZSA9IGVycm9yQ29kZTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmRFcnJvckV4Y2VwdGlvbihTdHJpbmcgbXNnLCBpbnQgZXJyb3JDb2RlLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBlcnJvckRhdGEsIE9iamVjdCBlcnJvck9iamVjdCkgewotCQlzdXBlcihtc2csIGVycm9yRGF0YS5jbG9uZSgpKTsKLQkJZkVycm9yT2JqZWN0ID0gZXJyb3JPYmplY3Q7Ci0JCWZFcnJvckNvZGUgPSBlcnJvckNvZGU7CQkKLQl9Ci0JCi0JcHVibGljIENvbW1hbmRzLlZhbHVlT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gKENvbW1hbmRzLlZhbHVlT2JqZWN0KSBnZXRFeGNlcHRpb25EYXRhKCk7Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlY292ZXJhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsJLy8gQ29tbWFuZCBlcnJvcnMgYXJlIHJlY292ZXJhYmxlLgotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVycm9yIGNvZGUuCi0JICovCi0JcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7Ci0JCXJldHVybiBmRXJyb3JDb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVycm9yIG9iamVjdCBhZnRlciBjb252ZXJzaW9uIHRvIHByb3h5IGZvcm1hdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVycm9yT2JqZWN0KCkgewotCQlyZXR1cm4gZkVycm9yT2JqZWN0OwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICItLSBFcnJvciBjb2RlOiIrZ2V0RXJyb3JDb2RlKCkgKyAoZ2V0VmFsdWUoKSAhPSBudWxsID8gIiBWYWx1ZSBkYXRhOlwiIiArIGdldFZhbHVlKCkuZ2V0QXNPYmplY3QoKSArICJcIiIgOiAiICIpICsgKGZFcnJvck9iamVjdCAhPSBudWxsID8gIiBFcnJvciBvYmplY3Q6XCIiK2ZFcnJvck9iamVjdC50b1N0cmluZygpKyJcIiIgOiAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvQ29tbWFuZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9Db21tYW5kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODUwZjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9Db21tYW5kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogQ29tbWFuZHMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotLyoqCi0gKiBUaGUgY29tbWFuZHMgdGhhdCBjYW4gYmUgcGFzc2VkIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4KLSAqIGNsaWVudCBhbmQgc2VydmVyLiBBbmQgb3RoZXIgY29uc3RhbnRzLgotICoKLSAqIC0gQ29udGFpbnMgaGVscGVyIG1ldGhvZHMgZm9yIHJlYWRpbmcvd3JpdGluZyBjb21tYW5kcy4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRzIHsKLQkvLyBUaGUgY29tbWFuZHMgd2lsbCBiZSB3cml0dGVuIGluIHdyaXRlQnl0ZSBmb3JtYXQgLgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZQotCQlHRVRfQ0xBU1MgPSAxLAkJLy8gR2V0IHRoZSBjbGFzcyBvYmplY3QsCi0JCVZBTFVFID0gMiwJCS8vIFJldHVybmluZyBhIHZhbHVlCi0JCVFVSVRfQ09OTkVDVElPTiA9IDQsCS8vIENsb3NlIHRoaXMgY29ubmVjdGlvbgotCQlURVJNSU5BVEVfU0VSVkVSID0gNSwJLy8gVGVybWluYXRlIHRoZSBlbnRpcmUgc2VydmVyLgotCQlFUlJPUiA9IDYsCQkvLyBSZXR1cm5pbmcgYW4gZXJyb3IKLQkJUkVMRUFTRV9PQkpFQ1QgPSA3LAkvLyBBbiBvYmplY3QgaXMgbm8gbG9uZ2VyIG5lZWRlZCBvbiB0aGUgY2xpZW50IHNpZGUsIHNvCi0JCQkJCS8vIGl0IGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcnZlciBpZCB0YWJsZSBhbmQgcmVsZWFzZWQuCi0JCUdFVF9DTEFTU19SRVRVUk4gPSA4LAkvLyBUaGUgcmV0dXJuIGNvbW1hbmQgZnJvbSBHRVRfQ0xBU1MKLQkJLy8gT2Jzb2xldGUsIG5vdCB1c2VkIGFueW1vcmUgR0VUX01FVEhPRCA9IDksCS8vIFJldHVybiB0aGUgaWQgZm9yIGEgbWV0aG9kCi0JCS8vIE9ic29sZXRlLCBub3QgdXNlZCBhbnltb3JlIEdFVF9DVE9SID0gMTAsCQkvLyBSZXR1cm4gdGhlIGlkIGZvciBhIGNvbnN0cnVjdG9yCQkKLQkJTkVXX0lOSVRfU1RSSU5HID0gMTEsCS8vIENyZWF0ZSBhIG5ldyBiZWFuIHVzaW5nIHRoZSBpbml0IHN0cmluZwotCQlHRVRfQ0xBU1NfRlJPTV9JRCA9IDEyLAkvLyBXZSBoYXZlIGFuIElELCByZXR1cm4gdGhlIGNsYXNzIGluZm8gZm9yIHRoaXMgaWQuCi0JCUdFVF9DTEFTU19JRF9SRVRVUk4gPSAxMywJLy8gVGhlIHJldHVybiBjb21tYW5kIGZyb20gR0VUX0NMQVNTX0ZST01fSUQKLQkJR0VUX09CSkVDVF9EQVRBID0gMTQsCS8vIFdlIGhhdmUgYW4gSUQsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSBpbmZvLCByZXR1cm4gaXQuIFRoaXMgaXMgYSAKLQkJCQkJLy8gY29ycmVjdGl2ZSBjb21tYW5kIG9ubHkuIFRoaXMgd291bGQgaGFwcGVuIGlmIGZvciBzb21lIHN0cmFuZ2UKLQkJCQkJLy8gcmVhc29uIHRoZSBwcm94eSBoYXMgYmVlbiByZW1vdmVkIGJ1dCBoYXMgbm90IGJlZW4gcmVsZWFzZWQuIFRoaXMKLQkJCQkJLy8gcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4gZXhjZXB0IGFzIGEgcG9zc2libGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbgotCQkJCQkvLyBHQyBhbmQgcmV0dXJuaW5nIGlkIGZyb20gdGhlIHNlcnZlci4KLQkJSU5WT0tFID0gMTUsCQkvLyBJbnZva2UgYSBtZXRob2QuCi0JCi0JCi0JCS8vIFRoZXNlIGNvbW1hbmRzIGFyZSB0byB0aGUgTWFzdGVyIFNlcnZlciB0aHJlYWQgaW4gdGhlIElERS4KLQkJQUxJVkUgPSAxNiwJLy8gQXJlIHlvdSBhbGl2ZT8KLQkJUkVNT1RFX1NUQVJURUQgPSAxNywJLy8gUmVtb3RlIFZNIGhhcyBzdGFydGVkLgotCQlBVFRBQ0hfQ0FMTEJBQ0sgPSAxOCwJLy8gQXR0YWNoIHRvIGEgY2FsbGJhY2sgdGhyZWFkIG9uIHRoZSBJREUgc2lkZS4gVGhlIHJlbW90ZSB2bSB3aWxsIHVzZSBpdHMgc29ja2V0IGFzIHRoZSBjYWxsYmFjayBzb2NrZXQuCi0JCQkJCQkJCS8vIGl0IHdpbGwgcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXR0YWNoIHdvcmtlZCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgZmFpbGVkLgotCi0JCS8vIFRoZXNlIGFyZSBtb3JlIHJlZ3VsYXIgY29tbWFuZHMuIFRoZXkgd2VyZSBoaXN0b3JpY2FsbHkgYWRkZWQgYWZ0ZXIgdGhlIG1hc3RlciBzZXJ2ZXIgdGhyZWFkIGNvbW1hbmRzLCBzbwotCQkvLyB0aGV5IGFyZSBzaG93biBoZXJlIGFmdGVyIHRoZW0gYW5kIHdpdGggbnVtYmVycyBncmVhdGVyIHRoYW4gdGhlbS4KLQkJRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQgPSAxOSwJLy8gQW4gZXhwcmVzc2lvbiB0cmVlIHN1YmNvbW1hbmQgaGFzIGNvbWUgaW4uCi0JCUlOVk9LRV9XSVRIX01FVEhPRF9QQVNTRUQgPSAyMCwJLy8gSW52b2tlIHdoZXJlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWV0aG9kIGlzIHBhc3NlZCBpbiB3aXRoIHRoZSBjb21tYW5kLgotCQlHRVRfQVJSQVlfQ09OVEVOVFMgPSAyMTsJLy8gR2V0IHRoZSBmaXJzdCBkaW1lbnNpb24gY29udGVudHMgYXMgYW4gYXJyYXkgb2YgaWRzIGFuZCBzZW5kIHRoZW0gYmFjay4KLQkKLQkJCi0JLy8gQ2FsbGJhY2sgY29tbWFuZHMKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJ5dGUKLQkJQ0FMTEJBQ0sgPSAoYnl0ZSkgMjU1LAkvLyBBIGNhbGxiYWNrIGhhcyBjb21lIGluLgotCQlDQUxMQkFDS19ET05FID0gKGJ5dGUpIDI1NCwJLy8gQSBjYWxsYmFjayBkb25lIGNvbW1hbmQsIHNlbnQgdG8gdGhlIHJlbW90ZSB2bSB1cG9uIGNhbGxiYWNrIGNvbXBsZXRpb24uCi0JCUNBTExCQUNLX1NUUkVBTSA9IChieXRlKSAyNTMsCS8vIEEgY2FsbGJhY2sgZm9yIGEgYnl0ZSBzdHJlYW0gaGFzIGNvbWUgaW4uCi0JCQkJCQkJCS8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhbGxiYWNrLiBXaGVuIHRoaXMgY29tZXMgaW4gYSBzcGVjaWFsCi0JCQkJCQkJCS8vIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNyZWF0ZWQgdGhhdCB3aWxsIHRha2Ugb3ZlciBjb250cm9sIG9mCi0JCQkJCQkJCS8vIHRoZSBjb25uZWN0aW9uIHVudGlsIHRoZSBzdHJlYW0gaXMgdGVybWluYXRlZCBvbiB0aGUgcmVtb3RlCi0JCQkJCQkJCS8vIHNpZGUuIEF0IHRoaXMgdGltZSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIHJldHVybmVkLgotCQlDQUxMQkFDS19TVFJFQU1fVEVSTUlOQVRFID0gKGJ5dGUpIDI1MjsJLy8gQSBjYWxsYmFjayBzdHJlYW0gaXMgYXNrZWQgdG8gdGVybWluYXRlIGVhcmx5LgotCQkKLQkvLyBUaGUgZXJyb3IgdmFsdWVzIGZyb20gdGhlIGNvbW1hbmQgb24gdGhlIHNlcnZlci4KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludAotCQlOT19FUlJPUiA9IDAsCQkJCS8vIE5vIGVycm9yIHN0YXR1cy4KLQkJVU5LTk9XTl9DT01NQU5EX1NFTlQgPSAxLAkvLyBBbiB1bmtub3duIGNvbW1hbmQgd2FzIHNlbnQgdG8gdGhlIHNlcnZlci4gVmFsdWUgaXMgdm9pZC4KLQkJR0VUX0NMQVNTX05PVF9GT1VORCA9IDIsCS8vIFRoZSBjbGFzcyB3YXMgbm90IGZvdW5kIGluIEdldENsYXNzLiBWYWx1ZSBpcyB2b2lkLgotCQlDQU5OT1RfRVZBTFVBVEVfU1RSSU5HID0gMywJLy8gRXZhbHVhdG9yIGNvdWxkbid0IGV2YWx1YXRlIHRoZSBpbml0IHN0cmluZy4gVG9vIGNvbXBsaWNhdGVkLiBWYWx1ZSBpcyBhIHRocm93YWJsZSBvZiB0aGUgd3JhcHBlcmVkIEluaXQgc3RyaW5nIGVycm9yLgotCQlDTEFTU19DQVNUX0VYQ0VQVElPTiA9IDQsCS8vIFRoZSByZXN1bHQgaXMgbm90IGFzc2lnbmFibGUgdG8gdGhlIGV4cGVjdGVkIHR5cGUuIFZhbHVlIGlzIHZvaWQuCi0JCUdFVF9NRVRIT0RfTk9UX0ZPVU5EID0gNSwJLy8gTWV0aG9kIHJlcXVlc3RlZCB3YXNuJ3QgZm91bmQuIFZhbHVlIGlzIHZvaWQuCi0JCVRIUk9XQUJMRV9TRU5UID0gNiwJCQkvLyBBIFRocm93YWJsZSBpcyBiZWluZyBzZW50IGJhY2sgYXMgdGhlIGVycm9yLCBub3QgYXMganVzdCBkYXRhIGZvciB0aGUgZXJyb3IuIFZhbHVlIGlzIHRoZSBUaHJvd2FibGUuCi0JCUNBTExCQUNLX1JVTlRJTUVfRVhDRVBUSU9OID0gNywJLy8gQSBydW50aW1lIGV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgYSBjYWxsYmFjay4gVGhlIGRhdGEgaXMgdGhlIG1lc3NhZ2UuCi0JCUNBTExCQUNLX05PVF9SRUdJU1RFUkVEID0gOCwKLQkJTUFYX0VSUk9SX0NPREUgPSBDQUxMQkFDS19OT1RfUkVHSVNURVJFRDsJLy8gVGhpcyBpcyBqdXN0IHRoZSBtYXggY29kZS4gTm90IGFjdHVhbGx5IHNlbnQuIFVzZWQgYXMgYSBmbGFnLgotCQkKLQkvLyBQcmVkZWZpbmVkIHN0YW5kYXJkIGlkJ3MgZm9yIHN0YW5kYXJkIGNsYXNzZXMvb2JqZWN0cy4gQm90aCBzaWRlcyB3aWxsIGFzc3VtZSB0aGVzZSBpZCdzIGhhdmUgYmVlbiBhc3NpZ25lZAotCS8vIHRvIHRoZXNlIGNsYXNzZXMvdHlwZXMvb2JqZWN0cwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50Ci0JCU5PVF9BTl9JRCA9IC0xLAkvLyBUaGlzIHZhbHVlIG1lYW5zIGl0IGlzIG5vdCBhbiBpZC4gSXQgaXMgbmV2ZXIgYSB2YWxpZCBpZC4KLQkJVk9JRF9UWVBFID0gMCwKLQkJQk9PTEVBTl9UWVBFID0gMSwKLQkJQk9PTEVBTl9DTEFTUyA9IDIsCi0JCUlOVEVHRVJfVFlQRSA9IDMsCi0JCUlOVEVHRVJfQ0xBU1MgPSA0LAotCQlCWVRFX1RZUEUgPSA1LAotCQlCWVRFX0NMQVNTID0gNiwKLQkJQ0hBUkFDVEVSX1RZUEUgPSA3LAotCQlDSEFSQUNURVJfQ0xBU1MgPSA4LAotCQlET1VCTEVfVFlQRSA9IDksCi0JCURPVUJMRV9DTEFTUyA9IDEwLAotCQlGTE9BVF9UWVBFID0gMTEsCi0JCUZMT0FUX0NMQVNTID0gMTIsCi0JCVNIT1JUX1RZUEUgPSAxMywKLQkJU0hPUlRfQ0xBU1MgPSAxNCwKLQkJTE9OR19UWVBFID0gMTUsCi0JCUxPTkdfQ0xBU1MgPSAxNiwKLQkJU1RSSU5HX0NMQVNTID0gMTcsCi0JCUJJR19ERUNJTUFMX0NMQVNTID0gMTgsCi0JCUJJR19JTlRFR0VSX0NMQVNTID0gMTksCi0JCU5VTUJFUl9DTEFTUyA9IDIwLAotCQlUSFJPV0FCTEVfQ0xBU1MgPSAyMSwKLQkJQ0xBU1NfQ0xBU1MgPSAyMiwKLQkJT0JKRUNUX0NMQVNTID0gMjMsCi0JCUFDQ0VTU0lCTEVPQkpFQ1RfQ0xBU1MgPSAyNCwKLQkJTUVUSE9EX0NMQVNTID0gMjUsCi0JCUZJRUxEX0NMQVNTID0gMjYsCi0JCUNPTlNUUlVDVE9SX0NMQVNTID0gMjcsCi0JCUdFVF9NRVRIT0RfSUQgPSAyOCwJLy8gQ2xhc3MuZ2V0TWV0aG9kKC4uLikgcHJlZGVmaW5lZCBpZC4KLQkJSVZNU0VSVkVSX0NMQVNTID0gMjksCS8vIElWTVNlcnZlci5jbGFzcwotCQlJQ0FMTEJBQ0tfQ0xBU1MgPSAzMCwJLy8gSUNhbGxiYWNrLmNsYXNzCi0JCVJFTU9URVNFUlZFUl9JRCA9IDMxLAkvLyBpZCBvZiBSZW1vdGVWTVNlcnZlclRocmVhZCBpbnN0YW5jZS4KLQkJUkVNT1RFVk1TRVJWRVJfQ0xBU1MgPSAzMiwJLy8gUmVtb3RlVk1TZXJ2ZXIuY2xhc3MKLQkJSU5JVElBTElaRUNBTExCQUNLX01FVEhPRF9JRCA9IDMzLAkvLyBJQ2FsbGJhY2suaW5pdGlhbGl6ZUNhbGxiYWNrIG1ldGhvZC4KLQkJVEhSRUFEX0NMQVNTID0gMzQsCi0JCUVYUFJFU1NJT05QUk9DRVNTRVJDT05UUk9MTEVSX0NMQVNTID0gMzUsCi0JCUZJUlNUX0ZSRUVfSUQgPSAzNjsKLQkJCQkKLQkvLyBUaGUgdHlwZSBmbGFncyB3cml0dGVuIGluIHdyaXRlQnl0ZSBmb3JtYXQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJ5dGUKLQkJVk9JRCA9IFZPSURfVFlQRSwJLy8gbnVsbCAtIG5vdGhpbmcgZm9sbG93cwotCQlCWVRFID0gQllURV9UWVBFLAkvLyBieXRlIC0gd3JpdGVCeXRlCi0JCUxfQllURSA9IEJZVEVfQ0xBU1MsCS8vIGphdmEubGFuZy5CeXRlIC0gd3JpdGVCeXRlCi0JCUNIQVIgPSBDSEFSQUNURVJfVFlQRSwJLy8gY2hhciAtIHdyaXRlQ2hhcgotCQlMX0NIQVIgPSBDSEFSQUNURVJfQ0xBU1MsCS8vIGphdmEubGFuZy5DaGFyYWN0ZXIgLSB3cml0ZUNoYXIKLQkJRE9VQkxFID0gRE9VQkxFX1RZUEUsCS8vIGRvdWJsZSAtIHdyaXRlRG91YmxlCi0JCUxfRE9VQkxFID0gRE9VQkxFX0NMQVNTLAkvLyBqYXZhLmxhbmcuRG91YmxlIC0gd3JpdGVEb3VibGUKLQkJRkxPQVQgPSBGTE9BVF9UWVBFLAkvLyBmbG9hdCAtIHdyaXRlRmxvYXQKLQkJTF9GTE9BVCA9IEZMT0FUX0NMQVNTLAkvLyBqYXZhLmxhbmcuRmxvYXQgLSB3cml0ZUZsb2F0Ci0JCUlOVCA9IElOVEVHRVJfVFlQRSwJLy8gaW50IC0gd3JpdGVJbnQKLQkJTF9JTlQgPSBJTlRFR0VSX0NMQVNTLAkvLyBqYXZhLmxhbmcuSW50ZWdlciAtIHdyaXRlSW50Ci0JCUxPTkcgPSBMT05HX1RZUEUsCS8vIGxvbmcgLSB3cml0ZUxvbmcKLQkJTF9MT05HID0gTE9OR19DTEFTUywJLy8gamF2YS5sYW5nLkxvbmcgLSB3cml0ZUxvbmcKLQkJU0hPUlQgPSBTSE9SVF9UWVBFLAkvLyBzaG9ydCAtIHdyaXRlU2hvcnQKLQkJTF9TSE9SVCA9IFNIT1JUX0NMQVNTLAkvLyBqYXZhLmxhbmcuU2hvcnQgLSB3cml0ZVNob3J0Ci0JCUJPT0wgPSBCT09MRUFOX1RZUEUsCS8vIGJvb2xlYW4gLSB3cml0ZUJvb2xlYW4KLQkJTF9CT09MID0gQk9PTEVBTl9DTEFTUywJLy8gamF2YS5sYW5nLkJvb2xlYW4gLSB3cml0ZUJvb2xlYW4KLQkJU1RSSU5HID0gU1RSSU5HX0NMQVNTLAkvLyBqYXZhLmxhbmcuU3RyaW5nIC0gd3JpdGVVVEYKLQkJT0JKRUNUID0gT0JKRUNUX0NMQVNTLAkvLyBPYmplY3QgLSBzcGVjaWFsLCBzZWUgYmVsb3cgKE9iamVjdCBjYW4gYmUgdXNlZCB0byByZXR1cm4gYW4gYXJyYXkgKGV4Y2VwdCBpZiB0aGUgYXJyYXkgY29udGFpbnMgYW55IG9iamVjdF9pZHMsIHRoYXQgaGFzIGEgc3BlY2lhbCB0eXBlKQotCQlPQkpFQ1RfSUQgPSA1MCwJLy8gT2JqZWN0IGlkZW50aXR5IGtleSAtIHdyaXRlSW50Ci0JCU5FV19PQkpFQ1RfSUQgPSA1MSwJLy8gTmV3IE9iamVjdCBpZGVudGl0eSAodGhpcyBpcyBhIG5ldyBvYmplY3QgdGhhdCBkaWRuJ3QgZXhpc3QgYmVmb3JlKQotCQlUSFJPVyA9IDUyLAkvLyBBbiBleGNlcHRpb24gb2NjdXJlZC4gVGhlIHZhbHVlIGlzIGEgdGhyb3dhYmxlLCBpdCBpcyBvZiB0aGUgc2FtZSBmb3JtYXQgYXMgTkVXX09CSkVDVF9JRC4KLQkJQVJSQVlfSURTID0gNTMsCS8vIEFuIGFycmF5IG9mIHZhbHVlcywgd2hlcmUgdGhlcmUgYXJlIGF0IGxlYXN0IG9uZSBJRCBpbiB0aGUgYXJyYXkuIElmIHRoZXJlIHdlcmUgbm8KLQkJCQkJCS8vIElEJ3MgKGkuZS4gYWxsIGp1c3QgdmFsdWVzKSwgdGhlbiB1c2UgT0JKRUNUIHR5cGUgaW50ZWFkIGFuZCBoYXZlIGl0IHdyaXR0ZW4gYXMKLQkJCQkJCS8vIHdyaXRlT2JqZWN0LgotCQlGTEFHID0gNTQ7CS8vIFRoZSB2YWx1ZSBpcyBhIGZsYWcgaW50LiBJZiB0aGlzIGlzIGFsbG93ZWQgb24gYSByZWFkLCB0aGUgYW5JbnQgZmllbGQgd2lsbCBjb250YWluIHRoZSBmbGFnIHZhbHVlLgotCQkJCQotCQkKLQkJCi0JLy8gVW5sZXNzIHNwZWNpZmllZCBiZWxvdywgdGhlIGNvbW1hbmRzIGFyZSBvbmUgYnl0ZSBsb25nLgotCS8vIEFsc28sIHVubGVzcyBzcGVjaWZpZWQgYmVsb3csIHRoZSBjb21tYW5kcyBkbyBub3QgcmV0dXJuIGEgY29uZmlybWF0aW9uIHJlc3BvbnNlLgotCS8vCi0JLy8gTk9URTogVkVSWSBJTVBPUlRBTlQsIGFmdGVyIGV2ZXJ5IGNvbW1hbmQsIGZsdXNoKCkgc2hvdWxkIGJlIHVzZWQgc28gdGhhdCB0aGUKLQkvLyB0aGUgZGF0YSBpcyBpbW1lZGlhdGVseSBzZW50IHRvIHRoZSBzZXJ2ZXIuIAkKLQkvLwotCS8vIG4gbWVhbnMgaW50IChlLmcuIDEpCi0JLy8gbmIgbWVhbnMgYnl0ZSAoZS5nLiAxYikKLQkvLyAneCcgbWVhbnMgVW5pY29kZSBjaGFyIChpLmUuIHdyaXRlQ2hhcigpKQotCS8vICJ4eHgiIG1lYW5zIFVURjggc3RyaW5nIChpLmUuIHdyaXRlVVRGKQotCS8vIGJvb2wgbWVhbnMgYSBvbmUgYnl0ZSBib29sZWFuIHZhbHVlCi0JLy8KLQkvLyBUaGUgY29tbWFzIGFyZW4ndCBhY3R1YWxseSB3cml0dGVuLCB0aGV5IGFyZSB1c2VkIGFzIHNlcGFyYXRlcnMgaW4gdGhlIGNvbW1lbnRzIGJlbG93Ci0JLy8KLQkvLyBHRVRfQ0xBU1M6IDFiLCAiY2xhc3NuYW1lIgotCS8vCQlXaWxsIHJldHVybiBvbiB0aGUgb3V0cHV0IHN0cmVhbSBHRVRfQ0xBU1NfUkVUVVJOIGNvbW1hbmQ6Ci0JLy8JCThiLCBuMSwgYm9vbDEsIGJvb2wyLCAic3VwZXJjbGFzc25hbWUiCi0JLy8JCVRoZSAibjEiIGlzIHRoZSBjbGFzcyBpZC4KLQkvLwkJVGhlIGJvb2wxIGlzIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBhbiBpbnRlcmZhY2UgKHRydWUgaWYgaXQgaXMpLgotCS8vCQlUaGUgYm9vbDIgaXMgd2hldGhlciB0aGlzIGNsYXNzIGlzIGFic3RyYWN0ICh0cnVlIGlmIGl0IGlzKS4JCi0JLy8JCVRoZSAic3VwZXJjbGFzc25hbWUiIGlzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcyAoMCBsZW5ndGggaWYgbm8gc3VwZXJjbGFzcykKLQkvLwkJSWYgdGhlIGNsYXNzIGlzIG5vdCBmb3VuZCwgdGhlbiBpdCB3aWxsIHJldHVybiBhbiBlcnJvciB3aXRoIGEgdmFsdWUgZm9yIHRoZSBlcnJvci4KLQkvLwotCS8vIEdFVF9DTEFTU19GUk9NX0lEOiAxMmIsIG4KLQkvLwkJV2hlcmUgIm4iIGlzIHRoZSBjbGFzcyBpZC4KLQkvLwkJV2lsbCByZXR1cm4gb24gdGhlIG91dHB1dCBzdHJlYW0gR0VUX0NMQVNTX0lEX1JFVFVSTiBjb21tYW5kOgkKLQkvLwkJMTNiLCAiY2xhc3NuYW1lIiwgYm9vbDEsIGJvb2wyLCAic3VwZXJjbGFzc25hbWUiCi0JLy8JCVRoZSBib29sMSBpcyB3aGV0aGVyIHRoaXMgY2xhc3MgaXMgYW4gaW50ZXJmYWNlICh0cnVlIGlmIGl0IGlzKS4KLQkvLwkJVGhlIGJvb2wyIGlzIHdoZXRoZXIgdGhpcyBjbGFzcyBpcyBhYnN0cmFjdCAodHJ1ZSBpZiBpdCBpcykuCQotCS8vCi0JLy8gVkFMVUU6IDJiLCB0YiwgdmFsdWUKLQkvLwkJV2hlcmUgdGIgaXMgdGhlIHR5cGUgaW4gYnl0ZSwgYW5kIHZhbHVlIGlzIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBzaG93biBpbgotCS8vCQl0YWJsZSBhYm92ZS4KLQkvLwkJT0JKRUNUX0lEOiA1MGIsIG4KLQkvLwkJCVdoZXJlICJuIiBpcyB0aGUgb2JqZWN0IGlkLgotCS8vCQlORVdfT0JKRUNUX0lEOiA1MWIsIG4xLCBuMgotCS8vCQkJV2hlcmUgIm4xIiBpcyBjbGFzcyBPYmplY3RJRCBvZiB0aGUgb2JqZWN0IHRoYXQgdGhlIG9iamVjdF9pZCAoIm4yIikgaXMgbWFkZSBvZi4KLQkvLwkJT0JKRUNUOiAxOWIsIG4sIHdyaXRlT2JqZWN0Ci0JLy8JCQlXaGVyZSAibiIgaXMgdGhlIGNsYXNzT2JqZWN0SUQgb2YgdGhlIGNsYXNzIG9mIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JLy8JCQlOT1RFOiBPYmplY3Qgc2hvdWxkIGJlIHVzZWQgb25seSB2ZXJ5IHJhcmVseS4gSWRlbnRpdHkgaXMgbG9zdCwgaS5lLgotCS8vCQkJYSBjb3B5IGlzIG1hZGUgZWFjaCB0aW1lIGFuZCBpdCBjYW4ndCBiZSByZWZlcmVuY2VkIGJhY2sgb24gdGhlIHJlbW90ZQotCS8vCQkJVk0uCi0JLy8JCUFSUkFZX0lEUzogNTJiLCBpZCwgbiwgW3RiLCB2YWx1ZSwgLi4uXQotCS8vCQkJVGhpcyBpcyBhIHZlcnkgc3BlY2lhbCBhcnJheS4gSXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIElELiBUaGVyZWZvciBhbGwgb2YgdGhlIAotCS8vCQkJRmlyc3QgbGV2ZWwgZW50cmllcyBhcmUgdmFsdWUgb2JqZWN0cy4gCi0JLy8JCQkiaWQiIGlzIHRoZSBpZCBvZiB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5KGUuZy4gaWQgZm9yIE9iamVjdCwgb3IgaWYgbXVsdGktZGltZW5zaW9uYWwgU3RyaW5nW10gKHRoaXMgd2lsbCBwcm9kdWNlIFN0cmluZ1tdW10pLgotCS8vCQkJIm4iIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYXJyYXkuIEZvbGxvd2VkIGJ5IHRoZSB2YWx1ZXMsIG9uZSBvZiB0aGUKLQkvLwkJCXZhbHVlcyBjb3VsZCBiZSBhbiBBUlJBWV9JRFMgdG9vLiBUaGUgcmVhZGluZy93cml0aW5nIG9mIHRoZXNlIGFyZSBzcGVjaWFsIGJlY2F1c2UKLQkvLwkJCXRoZXJlIGlzIGEgY2FsbGJhY2sgbWVjaGFuaXNtIHRvIHByb2Nlc3MgdGhlIGluZGl2aWR1YWwgZW50cmllcy4gVGhpcyBpcyBzbyB0aGF0Ci0JLy8JCQl0ZW1wIGFycmF5cyBvZiBWYWx1ZU9iamVjdHMgd29uJ3QgbmVlZCB0byBiZSBjcmVhdGVkIHRvIGhhbmRsZSB0aGlzLCBzbyBpdCBjYW4KLQkvLwkJCWdvIGRpcmVjdGx5IGZyb20gdGhlIGFycmF5IHRvL2Zyb20gdGhlIHN0cmVhbS4KLQkvLwkJCi0JLy8gUkVMRUFTRV9PQkpFQ1Q6IDdiLCBuCi0JLy8JCVdoZXJlIHRoZSBuIGlzIHRoZSBvYmplY3QgaWQgdG8gcmVsZWFzZS4gVGhlcmUgaXMgbm8gY29uZmlybWF0aW9uIHRvIHJlYWQgYmFjay4KLQkvLwotCS8vIEVSUk9SOiA2YiwgbiwgdGIsIC4uLgotCS8vICAgICAgbiBpcyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBlcnJvci4KLQkvLwkJdGIgaXMgYSB0eXBlIGZsYWcsIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZS4gVGhlIHZhbHVlIGlzIGRlcGVuZGVudCB1cG9uCi0JLy8JCXRoZSBjb21tYW5kIHRoYXQgdGhpcyBpcyBlcnJvciBpcyBmcm9tLiBJZiBhIFRIUk9XLCB0aGVuIHRoZSBUSFJPVyBpcyBBTFdBWVMgYSBuZXcKLQkvLwkJSUQsIGl0IGNhbiBuZXZlciBiZSBhbiBleGlzdGluZyBpZC4KLQkvLyAgICAgIAotCS8vCi0JLy8gVE9fQkVBTl9TVFJJTkc6IDliLCBuCi0JLy8JCVdoZXJlIG4gaXMgdGhlIG9iamVjdCBpZCB0byBwcm9kdWNlIHRoZSBiZWFuIHN0cmluZyBmb3IuCi0JLy8JCUl0IHdpbGwgcmV0dXJuIGEgVkFMVUUgY29tbWFuZCB3aGVyZSB0aGUgdHlwZSBpcyBTdHJpbmcuCi0JLy8KLQkvLyBORVdfSU5TVEFOQ0U6IDEwYiwgbgotCS8vCQlXaGVyZSBuIGlzIHRoZSBjbGFzcyBvYmplY3QgaWQgb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB1c2luZyB0aGUgZGVmYXVsdCBjdG9yLgotCS8vCQlJdCB3aWxsIHJldHVybiBlaXRoZXIgYSBWQUxVRSBjb21tYW5kIGNvbnRhaW5pbmcgdGhlIG5ldyB2YWx1ZSAob2YgdHlwZSBPQkpFQ1RfSUQvTkVXX09CSkVDVF9JRCBpZiBub3QKLQkvLwkJb25lIG9mIHRoZSBjb25zdGFudCB0eXBlcyB3aXRoIHRoZSB0cnVlIGNsYXNzSUQgaW4gaXQpIG9yIGFuIEVSUk9SIGNvbW1hbmQuIChUaGUgRVJST1IgY291bGQKLQkvLwkJYmUgYSBUSFJPVyB0eXBlKS4gSWYgdGhlIG9iamVjdCBjcmVhdGVkIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlIHBhc3NlZCBpbiwgdGhlbgotCS8vCQlhbiBFUlJPUiBpcyByZXR1cm5lZCB3aXRoIENMQVNTX0NBU1RfRVhDRVBUSU9OIGZsYWcuCi0JLy8KLQkvLyBORVdfSU5JVF9TVFJJTkc6IDExYiwgbiwgImluaXRzdHJpbmciCi0JLy8JCVdoZXJlIG4gaXMgdGhlIGNsYXNzIG9iamVjdCBpZCBvZiB0aGUgY2xhc3MgdGhpcyBpbml0c3RyaW5nIGlzIHN1cHBvc2VkIHRvIGNyZWF0ZSBmb3IuCi0JLy8JCUl0IHdpbGwgcmV0dXJuIGVpdGhlciBhIFZBTFVFIGNvbW1hbmQgY29udGFpbmluZyB0aGUgbmV3IHZhbHVlIChvZiB0eXBlIE9CSkVDVF9JRC9ORVdfT0JKRUNUX0lEIGlmIG5vdAotCS8vCQlvbmUgb2YgdGhlIGNvbnN0YW50IHR5cGVzIHdpdGggdGhlIHRydWUgY2xhc3NJRCBpbiBpdCkgb3IgYW4gRVJST1IgY29tbWFuZC4gKFRoZSBFUlJPUiBjb3VsZAotCS8vCQliZSBhIFRIUk9XIHR5cGUpLiBUaGUgZXJyb3IgY291bGQgYWxzbyBiZSBDQU5OT1RfRVZBTFVBVEVfU1RSSU5HLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0cmluZyB3YXMgdG9vCi0JLy8JCWNvbXBsaWNhdGVkIGZvciB0aGUgZXZhbHVhdG9yIGFuZCBuZWVkcyB0byBiZSBjb21waWxlZCBhbmQgdHJpZWQgYWdhaW4uIChUQkQpCi0gCS8vCQlJZiB0aGUgb2JqZWN0IGNyZWF0ZWQgaXMgbm90IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgcGFzc2VkIGluLCB0aGVuCi0JLy8JCWFuIEVSUk9SIGlzIHJldHVybmVkIHdpdGggQ0xBU1NfQ0FTVF9FWENFUFRJT04gZmxhZy4KLQkvLwotCS8vIEdFVF9PQkpFQ1RfREFUQTogMTRiLCBuCi0JLy8JCVdoZXJlIG4gaXMgdGhlIGlkIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVxdWVzdGVkLiBJdCB3aWxsIHJldHVybiBhIE5FV19PQkpFQ1RfSUQgdmFsdWUgd2l0aCB0aGUgaW5mby4KLQkvLwotCS8vIEdFVF9NRVRIT0Q6IDliLCBjbGFzc0lkLCAibWV0aG9kTmFtZSIsIG4xLCBbbjJdLi4uCi0JLy8JCVdoZXJlIGNsYXNzSUQgaXMgdGhlIGlkIG9mIHRoZSBjbGFzcyB0aGUgbWV0aG9kIHNob3VsZCBiZSBmb3VuZCBpbi4KLQkvLwkJV2hlcmUgbjEgaXMgdGhlIG51bWJlciBvZiBwYXJtIHR5cGVzIGZvbGxvd2luZywgYW5kIG4yIGlzIHJlcGxpY2F0ZWQgdGhhdCBtYW55IHRpbWVzLAotCS8vCQllYWNoIGVudHJ5IGlzIHRoZSBpZCBvZiBjbGFzcyBmb3IgdGhlIHBhcm0gdHlwZS4gKDAgaXMgdmFsaWQgd2hpY2ggbWVhbnMgdGhlcmUgYXJlIG5vIHBhcm1zKS4KLQkvLwkJVGhlIHJldHVybiB3aWxsIGJlIGEgVkFMVUUgY29tbWFuZCBjb250YWluaW5nIHRoZSBPQkpFQ1RfSUQgb2YgdGhlIG1ldGhvZC4KLQkvLwotCS8vIEdFVF9DVE9SOiAxMGIsIGNsYXNzSWQsIG4xLCBbbjJdLi4uCi0JLy8JCVdoZXJlIGNsYXNzSUQgaXMgdGhlIGlkIG9mIHRoZSBjbGFzcyB0aGUgbWV0aG9kIHNob3VsZCBiZSBmb3VuZCBpbi4KLQkvLwkJV2hlcmUgbjEgaXMgdGhlIG51bWJlciBvZiBwYXJtIHR5cGVzIGZvbGxvd2luZywgYW5kIG4yIGlzIHJlcGxpY2F0ZWQgdGhhdCBtYW55IHRpbWVzLAotCS8vCQllYWNoIGVudHJ5IGlzIHRoZSBpZCBvZiBjbGFzcyBmb3IgdGhlIHBhcm0gdHlwZS4gKDAgaXMgdmFsaWQgd2hpY2ggbWVhbnMgdGhlcmUgYXJlIG5vIHBhcm1zKS4KLQkvLwkJVGhlIHJldHVybiB3aWxsIGJlIGEgVkFMVUUgY29tbWFuZCBjb250YWluaW5nIHRoZSBPQkpFQ1RfSUQgb2YgdGhlIG1ldGhvZC4KLQkvLwkKLQkvLyBHRVRfRklFTEQ6Ci0JLy8KLQkvLyBHRVRfQ1RPUjoKLQkvLwotCS8vIElOVk9LRTogMTViLCBuMSwgdGIsIHZhbHVlMSwgdmFsdWUyCi0JLy8JCVdoZXJlICJuMSIgaXMgdGhlIGlkIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgotCS8vCQl0YiwgdmFsdWUxIGlzIHRoZSB2YWx1ZSBvZiB3aG8gdG8gaW52b2tlIGFnYWluc3QgKGl0IGlzIHVzdWFsbHkgYW4gT0JKRUNUX0lEIGZvciB0YikKLQkvLyAgICAgIHZhbHVlMiBpcyBhbiBBUlJBWV9JRFMgdHlwZSBvciBhbiBPQkpFQ1QgYXJyYXkgb2YgdmFsdWVzIGlmIGFsbCBjb25zdGFudHMuCi0JLy8JCVdoYXQgaXMgcmV0dXJuZWQgaXMgYSBWQUxVRSBjb21tYW5kIGNvbnRhaW5pbmcgdGhlIHJldHVybiB2YWx1ZSwgKHRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgKFZPSUQpIGlmCi0JLy8JCXRoZXJlIGlzIG5vIHJldHVybiB0eXBlIChpLmUuIHRoZSBtZXRob2Qgd2FzIHZvaWQpLiBTbyBudWxsIGNhbiBiZSByZXR1cm5lZCBlaXRoZXIgaWYgdGhlIHZhbHVlCi0JLy8JCXdhcyBudWxsIG9yIGlmIHRoZSByZXR1cm4gdHlwZSB3YXMgdm9pZC4KLQkvLwotCS8vIEVYUFJFU1NJT05fVFJFRV9DT01NQU5EOiAyMGIsIG4sIGIKLQkvLwkJUmVjZWl2aW5nIGFuIGV4cHJlc3Npb24gdHJlZSBzdWJjb21tYW5kLiBXaGVyZSAibiIgaXMgYSB1bmlxdWUgaWQgbnVtYmVyIG9mIHRoZQotCS8vCQlleHByZXNzaW9uIGJlaW5nIHByb2Nlc3NlZC4gV2hlcmUgImIiIGlzIGJ5dGUgY29kZSwgZGVmaW5lZCBpbiBFeHByZXNzaW9uQ29tbWFuZHMsIHRoYXQKLQkvLwkJZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBleHByZXNzaW9uIHRyZWUgY29tbWFuZHMuCi0JLy8JCVRoZXJlIGNhbiBiZSBtb3JlIGRhdGEgZm9sbG93aW5nLCBidXQgaXQgaXMgcmVhZCBieSB0aGUgCi0JLy8JCUV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLCBub3QgYnkgdGhlIGNvbm5lY3Rpb24uIFNlZSB0aGUgY29udHJvbGxlciBmb3IgdGhlIHN1YmNvbW1hbmRzLgotCS8vCi0JLy8JCVRoZSBpZCBudW1iZXIgaXMgdGhlIGlkIG9mIHRoZSBleHByZXNzaW9uIGJlaW5nIHByb2Nlc3NlZC4gVGhpcyBhbGxvd3MgbW9yZSB0aGFuIG9uZSBleHByZXNzaW9uCi0JLy8JCXRvIGJlIHByb2Nlc3NlZCBhdCBhIHRpbWUgZnJvbSB0aGlzIGNvbm5lY3Rpb24uCi0JLy8KLQkvLwkJQHNlZSBFeHByZXNzaW9uQ29tbWFuZHMKLQkvLwkJQHNlZSBFeHByZXNzaW9uUHJvY2Vzc0NvbnRyb2xsZXIKLQkvLwotCS8vIElOVk9LRV9XSVRIX01FVEhPRF9QQVNTRUQ6IDIwYiwgIGNsYXNzSWQsICJtZXRob2ROYW1lIiwgdmFsdWUwLCB0YiwgdmFsdWUxLCB2YWx1ZTIKLQkvLwkJV2hlcmUgY2xhc3NJRCBpcyB0aGUgaWQgb2YgdGhlIGNsYXNzIHRoZSBtZXRob2Qgc2hvdWxkIGJlIGZvdW5kIGluLgotCS8vCQl2YWx1ZTAgaXMgYW4gQVJSQVlfSURTIHR5cGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBwYXJtcywgb3IgbnVsbCB0eXBlIGZvciBubyBwYXJtcy4gIAotCS8vCQl0YiwgdmFsdWUxIGlzIHRoZSB2YWx1ZSBvZiB3aG8gdG8gaW52b2tlIGFnYWluc3QgKGl0IGlzIHVzdWFsbHkgYW4gT0JKRUNUX0lEIGZvciB0YikKLQkvLyAgICAgIHZhbHVlMiBpcyBhbiBBUlJBWV9JRFMgdHlwZSBvciBhbiBPQkpFQ1QgYXJyYXkgb2YgdmFsdWVzIGlmIGFsbCBjb25zdGFudHMuCi0JLy8JCVdoYXQgaXMgcmV0dXJuZWQgaXMgYSBWQUxVRSBjb21tYW5kIGNvbnRhaW5pbmcgdGhlIHJldHVybiB2YWx1ZSwgKHRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgKFZPSUQpIGlmCi0JLy8JCXRoZXJlIGlzIG5vIHJldHVybiB0eXBlIChpLmUuIHRoZSBtZXRob2Qgd2FzIHZvaWQpLiBTbyBudWxsIGNhbiBiZSByZXR1cm5lZCBlaXRoZXIgaWYgdGhlIHZhbHVlCi0JLy8JCXdhcyBudWxsIG9yIGlmIHRoZSByZXR1cm4gdHlwZSB3YXMgdm9pZC4KLQkvLwotCS8vIEdFVF9BUlJBWV9DT05URU5UUzogMjFiLCBhcnJheUlkCi0JLy8JCVdoZXJlIGFycmF5SUQgaXMgdGhlIGlkIG9mIHRoZSBhcnJheSB0byBnZXQgdGhlIGNvbnRlbnRzIG9mLiBXaGF0IGlzIHJldHVybmVkIGlzIGEgdmFsdWUgY29tbWFuZAotCS8vCQljb250YWluaW5nIGFuIGFycmF5IG9mIGlkcyBvZiB0aGUgZmlyc3QgZGltZW5zaW9uIGNvbnRlbnRzLgotCS8vCi0JLy8gQ2FsbGJhY2sgY29tbWFuZHM6Ci0JLy8KLQkvLyBDQUxMQkFDSzogMjU1YiwgbjEsIG4yLCB2YWx1ZTEKLQkvLyAgICAgIFdoZXJlCi0JLy8gICAgICAgICJuMSIgaXMgdGhlIGlkIG9mIGNhbGxiYWNrIHR5cGUgKHRoZXNlIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGNhbGxiYWNrIHNlcnZlcikKLQkvLyAgICAgICAgIm4yIiBpcyB0aGUgbXNnSWQgZm9yIHRoZSBjYWxsYmFjayAoVGhlc2UgYXJlIGVudGlyZWx5IGNhbGxiYWNrIGRlcGVuZGVudCBhbmQgYXJlIG1haW50YWluZWQgYnkgdGhlIGNhbGxiYWNrIGRldmVsb3BlcikKLQkvLyAgICAgICAgdmFsdWUxIGlzIGFuIEFSUkFZX0lEUyB0eXBlIG9yIGFuIE9CSkVDVCBhcnJheSBvZiB2YWx1ZXMgaWYgYWxsIGNvbnN0YW50cy4gVGhlc2UgYXJlCi0JLy8gICAgICAgICAgcGFybXMgdG8gc2VuZCB0byB0aGUgY2FsbGJhY2sgbXNnLgotCS8vICAgICAgSXQgd2lsbCByZXR1cm4gYSBDQUxMQkFDS19ET05FLgotCS8vCi0JLy8gQ0FMTEJBQ0tfRE9ORTogMjU0YiwgdmFsdWUgY29tbWFuZC4KLQkvLwkJV2hhdCBjb21lcyBiYWNrIGlzIGEgdmFsdWUgY29tbWFuZCAoaS5lLiBDb21tYW5kcy5WQUxVRSBmb2xsb3dlZCBieSB2YWx1ZSkuIFRoaXMgYWxsb3dzCi0JLy8JCUVSUk9SUyB0byBiZSBzZW50IGJhY2sgdG9vLgotCS8vCi0JLy8gQ0FMTEJBQ0tfU1RSRUFNOiAyNTNiLCBuMSwgbjIKLQkvLyAgICAgIFdoZXJlCi0JLy8gICAgICAgICJuMSIgaXMgdGhlIGlkIG9mIGNhbGxiYWNrIHR5cGUgKHRoZXNlIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGNhbGxiYWNrIHNlcnZlcikKLQkvLyAgICAgICAgIm4yIiBpcyB0aGUgbXNnSWQgZm9yIHRoZSBjYWxsYmFjayAoVGhlc2UgYXJlIGVudGlyZWx5IGNhbGxiYWNrIGRlcGVuZGVudCBhbmQgYXJlIG1haW50YWluZWQgYnkgdGhlIGNhbGxiYWNrIGRldmVsb3BlcikKLQkvLwkJSXQgd2lsbCBjcmVhdGUgYSBDYWxsYmFja0lucHV0U3RyZWFtIGFuZCBub3RpZnkgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgdGhhdCB0aGUKLQkvLwkJc3RyZWFtIGlzIGF2YWlsYWJsZS4gSXQgd2lsbCBzZW5kIGEgY2FsbGJhY2tfZG9uZSB3aGVuIGl0IGhhcyBhY2NlcHRlZCB0aGUgcmVxdWVzdAotCS8vCQlidXQgYmVmb3JlIGl0IG5vdGlmaWVzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIHdpdGggdGhlIHN0cmVhbS4gVGhpcyBsZXRzIHRoZSByZW1vdGUKLQkvLwkJdm0ga25vdyB0aGF0IGl0IGNhbiBzdGFydCBzZW5kaW5nIGRhdGEuCi0JCi0KLQkvLyBUbyB0aGUgTWFzdGVyU2VydmVyIHNvY2tldDoKLQkvLyBUaGUgTWFzdGVyU2VydmVyIHNvY2tldCB3aWxsIGV4cGVjdCBpbnB1dCBpbiBEYXRhSW5wdXRTdHJlYW0gZm9ybWF0LCBhbmQgRGF0YU91dHB1dFN0cmVhbSBmb3IgcmV0dXJuLgotCS8vIFRoZSBzb2NrZXQgd2lsbCBiZSBzaG9ydC1saXZlZC4gSXQgd2lsbCBiZSBmb3Igb25lIHRyYW5zYWN0aW9uIG9ubHkuIEVhY2ggcmVxdWVzdCB3aWxsIHJldHVybiBhIG5ldyBzb2NrZXQuCi0JLy8KLQkvLyBBTElWRTogMTZiLCBuMQotCS8vICAgICAgV2hlcmUKLQkvLyAgICAgICAgIm4xIiBpcyB0aGUgaWQgb2YgdGhlIHJlZ2lzdHJ5IHRoaXMgaXMgYXNraW5nIHRvIHRlc3QgZm9yIGFsaXZlbmVzcwotCS8vICAgICAgV2lsbCByZXR1cm4gYm9vbCwgd2hlcmUgZmFsc2UgaWYgcmVnaXN0cnkgaXMgbm90IGFsaXZlLCB0cnVlIGlmIGl0IGlzIGFsaXZlLgotCS8vIFJFTU9URV9TVEFSVEVEOiAxN2IsIG4xLCBuMgotCS8vICAgICAgV2hlcmUKLQkvLyAgICAgICAgIm4xIiBpcyB0aGUgaWQgb2YgdGhlIHJlZ2lzdHJ5IHRoaXMgaXMgdGVsbGluZyB0aGF0IGl0IGlzIHN0YXJ0ZWQKLQkvLyAgICAgICAgIm4yIiBpcyB0aGUgc2VydmVyc29ja2V0IHBvcnQgbnVtYmVyIG9mIHRoZSBzZXJ2ZXIgc29ja2V0IGluIHRoaXMgcmVtb3RlIHZtLgotCS8vICAgICAgV2lsbCByZXR1cm4gYm9vbCwgd2hlcmUgZmFsc2UgaWYgcmVnaXN0cnkgaXMgbm90IGFsaXZlLCB0cnVlIGlmIGl0IGlzIGFsaXZlLiBJZiBmYWxzZSwgdGhlbiB0ZXJtaW5hdGUgdGhlIHNlcnZlciBiZWNhdXNlIG5vdGhpbmcgdG8gdGFsayB0by4KLQkvLyBHRVRfQ0FMTEJBQ0tfUE9SVDogMThiLCBuMQotCS8vICAgICAgV2hlcmUKLQkvLyAgICAgICAgIm4xIiBpcyB0aGUgaWQgb2YgdGhlIHJlZ2lzdHJ5IHRoaXMgaXMgYXNraW5nIGZvciB0aGUgY2FsbGJhY2sgc2VydmVyIHBvcnQuCi0JLy8gICAgICBXaWxsIHJldHVybiBpbnQsIHdoZXJlIHRoZSB2YWx1ZSBpcyB0aGUgY2FsbGJhY2sgc2VydmVyIHBvcnQgbnVtYmVyLiAtMSBpZiB0aGVyZSBpcyBubyBjYWxsYmFjayBzZXJ2ZXIgcG9ydC4JCQotCQotCS8qKgotCSAqIFRoaXMgY2xhc3MgaXMgdGhlIHJldHVybiBmcm9tIGEgcmVhZCB2YWx1ZS4gSXQgY29udGFpbnMgdGhlCi0JICogdHlwZSBvZiB0aGUgdmFsdWUgYW5kIHRoZSB2YWx1ZSBpdHNlbGYuIFNpbmNlIHByaW1pdGl2ZXMgY2FuIGJlCi0JICogcmV0dXJuZWQgYWxzbywgdGhlcmUgaXMgYSBzbG90IGZvciBlYWNoIG9uZSBhbmQgdGhlIHR5cGUgc2hvdWxkCi0JICogYmUgY2hlY2tlZCB0byBzZWUgd2hpY2ggb25lIGlzIHNldC4KLQkgKgotCSAqIEFsc28sIGlmIHRoZSB0eXBlIGlzIE9CSkVDVCwgdGhlbiB0aGUgYW5PYmplY3QgaGFzIHRoZSBvYmplY3QgaW4gaXQsIEFORAotCSAqIHRoZSBjbGFzc0lEIGZpZWxkIGhhcyB0aGUgb2JqZWN0X2lkIG9mIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IHNvIHRoYXQgdGhlCi0JICogYXBwcm9wcmlhdGUgYmVhbnR5cGVwcm94eSBjYW4gYmUgZm91bmQgdG8gdXNlIHRoYXQgb2JqZWN0LiBBbHNvLCBvbmx5Ci0JICogSVJFTUNvbnN0YW50QmVhblR5cGVQcm94aWVzIGNhbiBiZSBvZiB0eXBlIE9CSkVDVC4gVGhhdCBpcyBiZWNhdXNlIHRob3NlCi0JICogYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBrbm93IGhvdyB0byB0YWtlIHRoZSB2YWx1ZSBvYmplY3QgYW5kIGludGVycHJldCBpdC4KLQkgKgotCSAqIElmIHRoZSB0eXBlIGlzIE9CSkVDVF9JRCBvciBORVdfT0JKRUNUX0lELCB0aGVuIHRoZSBvYmplY3RJRCBmaWVsZCB3aWxsIGJlIHNldCB3aXRoCi0JICogdGhlIGlkLgotCSAqIElmIHRoZSB0eXBlIGlzIE5FV19PQkpFQ1RfSUQsIHRoZW4gdGhlIGNsYXNzSUQgZmllbGQgd2lsbAotCSAqIGhhdmUgdGhlIGNsYXNzIG9iamVjdElEIG9mIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IGZvciB3aGljaCBvYmplY3RfaWQgcHJveGllcy4KLQkgKgotCSAqIFRIUk9XIGlzIHRyZWF0ZWQgbGlrZSBORVdfT0JKRUNUX0lEIGluIHdoYXQgZmllbGRzIGFyZSBzZXQgc2luY2UgaXQgaXMgYSBuZXcgb2JqZWN0LgotCSAqCi0JICogTm90ZTogc28gYXMgbm90IHRvIGNyZWF0ZSB1bm5lY2Vzc2FyeSBvYmplY3RzLCBpZiB0aGUgT2JqZWN0IHR5cGUgb2YgdGhlIHByaW1pdGl2ZSBpcyBiZWluZwotCSAqIHNlbnQsIHRoZW4gdGhlIHByaW1pdGl2ZSBmaWVsZCB3aWxsIGJlIHNldCBpbnN0ZWFkLCB0aG91Z2ggdGhlIHR5cGUKLQkgKiB3aWxsIHN0aWxsIGJlIHRoZSBPYmplY3QgdHlwZSAoaS5lLiBpZiB0eXBlID0gTF9CWVRFLCB0aGUgYUJ5dGUgd2lsbAotCSAqIGhhdmUgdGhlIHZhbHVlIGluIGl0KS4KLQkgKiAKLQkgKiBOb3RlOiBBbHNvIGZsYWdzIGNhbiBiZSBzZW5kIGJhY2suIFRoZSB0eXBlIHdpbGwgYmUgRkxBRyBhbmQgdGhlIGFuSW50IGZpZWxkIHdpbGwgYmUgdGhlCi0JICogZmxhZyB2YWx1ZS4gVGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIHNwZWNpYWwgdGhpbmdzIHRoYXQgYXJlbid0IHZhbHVlcy4gTW9zdCB1c2VmdWwgaW4KLQkgKiBhcnJheXMgd2hlcmUgb25lIG9mIHRoZSBlbnRyaWVzIGlzIG5vdCBhIHZhbHVlLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgaWYgcmVhZFZhbHVlCi0JICogaXMgcGFzc2VkIGEgZmxhZyBpbmRpY2F0aW5nIGZsYWdzIGFyZSB2YWxpZCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBub3QgdmFsaWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBWYWx1ZU9iamVjdCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JCXB1YmxpYyBieXRlIHR5cGU7CS8vIFNhbWUgYXMgdGhlIHR5cGVzIGFib3ZlCi0JCXB1YmxpYyBieXRlIGFCeXRlOwotCQlwdWJsaWMgY2hhciBhQ2hhcjsKLQkJcHVibGljIGRvdWJsZSBhRG91YmxlOwotCQlwdWJsaWMgZmxvYXQgYUZsb2F0OwotCQlwdWJsaWMgaW50IGFuSW50OwotCQlwdWJsaWMgc2hvcnQgYVNob3J0OwotCQlwdWJsaWMgbG9uZyBhTG9uZzsKLQkJcHVibGljIGJvb2xlYW4gYUJvb2w7Ci0JCXB1YmxpYyBpbnQgb2JqZWN0SUQ7CS8vIFRoZSBvYmplY3QgaWQgZm9yIGVpdGhlciBPQkpFQ1RfSUQgb3IgTkVXX09CSkVDVF9JRC4KLQkJcHVibGljIGludCBjbGFzc0lEOwkJLy8gVGhlIGNsYXNzIG9iamVjdCBpZCBvZiB0aGUgdmFsdWUgaW4gT2JqZWN0IGlmIHRoZSB0eXBlIGlzIE9iamVjdAotCQlwdWJsaWMgT2JqZWN0IGFuT2JqZWN0OwkvLyBTdHJpbmcgYWxzbyB3aWxsIGJlIGluIGhlcmUKLQkJCi0JCXB1YmxpYyBWYWx1ZU9iamVjdCgpIHsKLQkJCXR5cGUgPSBWT0lEOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKFZhbHVlT2JqZWN0KSBzdXBlci5jbG9uZSgpOwotCQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIHN0b3JlZCBoZXJlIGlzIGEgcHJpbWl0aXZlLgotCQkgKiAKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB2YWx1ZSBpcyBhIHByaW1pdGl2ZSB0eXBlLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJCXJldHVybiBnZXRQcmltaXRpdmVUeXBlKCkuaXNQcmltaXRpdmUoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEdldCB0aGUgcHJpbWl0aXZlIHR5cGUgb2YgdGhlIHZhbHVlLiAKLQkJICogQHJldHVybiBUaGUgcHJpbWl0aXZlIHR5cGUsIG9yIGlmIG5vdCBwcmltaXRpdmUsIGl0IHJldHVybnMgc2ltcGx5IDxjb2RlPk9iamVjdC5jbGFzczwvY29kZT4uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBDbGFzcyBnZXRQcmltaXRpdmVUeXBlKCkgewotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBCWVRFOgotCQkJCQlyZXR1cm4gQnl0ZS5UWVBFOwotCQkJCWNhc2UgQ0hBUjoKLQkJCQkJcmV0dXJuIENoYXJhY3Rlci5UWVBFOwotCQkJCWNhc2UgRE9VQkxFOgotCQkJCQlyZXR1cm4gRG91YmxlLlRZUEU7Ci0JCQkJY2FzZSBGTE9BVDoKLQkJCQkJcmV0dXJuIEZsb2F0LlRZUEU7Ci0JCQkJY2FzZSBJTlQ6Ci0JCQkJCXJldHVybiBJbnRlZ2VyLlRZUEU7Ci0JCQkJY2FzZSBTSE9SVDoKLQkJCQkJcmV0dXJuIFNob3J0LlRZUEU7Ci0JCQkJY2FzZSBMT05HOgotCQkJCQlyZXR1cm4gTG9uZy5UWVBFOwotCQkJCWNhc2UgQk9PTDoKLQkJCQkJcmV0dXJuIEJvb2xlYW4uVFlQRTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCQkJfQkKLQkJCQotCQl9Ci0JCQotCQkvKioKLQkJICogR2V0IHRoZSB0eXBlIGFzIG9uZSBvZiB0aGUgdmFsaWQgQ29tbWFuZHMuVHlwZXMuIFZPSUQsIEJZVEUsIExfQllURSwgZXRjLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JCQotCQkvKioKLQkJICogU3BlY2lhbCBnZXR0ZXIgdG8gZ2V0IHRoZSB0eXBlIGFzIGFuIE9iamVjdCwgdGhpcyBpcyB1c2VkIGJ5IGludm9rZSBmb3IgZXhhbXBsZS4KLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0QXNPYmplY3QoKSB7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIFZPSUQ6Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCWNhc2UgQllURToKLQkJCQljYXNlIExfQllURToKLQkJCQkJcmV0dXJuIG5ldyBCeXRlKGFCeXRlKTsKLQkJCQljYXNlIENIQVI6Ci0JCQkJY2FzZSBMX0NIQVI6Ci0JCQkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKGFDaGFyKTsKLQkJCQljYXNlIERPVUJMRToKLQkJCQljYXNlIExfRE9VQkxFOgotCQkJCQlyZXR1cm4gbmV3IERvdWJsZShhRG91YmxlKTsKLQkJCQljYXNlIEZMT0FUOgotCQkJCWNhc2UgTF9GTE9BVDoKLQkJCQkJcmV0dXJuIG5ldyBGbG9hdChhRmxvYXQpOwotCQkJCWNhc2UgSU5UOgotCQkJCWNhc2UgTF9JTlQ6Ci0JCQkJCXJldHVybiBuZXcgSW50ZWdlcihhbkludCk7Ci0JCQkJY2FzZSBTSE9SVDoKLQkJCQljYXNlIExfU0hPUlQ6Ci0JCQkJCXJldHVybiBuZXcgU2hvcnQoYVNob3J0KTsKLQkJCQljYXNlIExPTkc6Ci0JCQkJY2FzZSBMX0xPTkc6Ci0JCQkJCXJldHVybiBuZXcgTG9uZyhhTG9uZyk7Ci0JCQkJY2FzZSBCT09MOgotCQkJCWNhc2UgTF9CT09MOgotCQkJCQlyZXR1cm4gYUJvb2wgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJCWNhc2UgU1RSSU5HOgotCQkJCQlyZXR1cm4gKFN0cmluZykgYW5PYmplY3Q7Ci0JCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJCXJldHVybiBhbk9iamVjdDsKLQkJCQkKLQkJCQlkZWZhdWx0OiAKLQkJCQkJcmV0dXJuIG51bGw7CS8vIENhbid0IGhhbmRsZSBvdGhlcnMuIFRob3NlIG5lZWQgdG8gYmUgY2hlY2tlZCBiZWZvcmUgY2FsbGluZy4KLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNwZWNpYWwgc2V0dGVyIHRvIHNldCB0aGUgdmFsdWUgZGVwZW5kaW5nIHVwb24gdGhlIHR5cGUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRBc09iamVjdChPYmplY3QgdmFsdWUsIGludCB2YWx1ZUNsYXNzSUQpIHsKLQkJCXN3aXRjaCAodmFsdWVDbGFzc0lEKSB7Ci0JCQkJY2FzZSBWT0lEOgotCQkJCQlzZXQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCWVRFX0NMQVNTOgotCQkJCQlzZXQoKEJ5dGUpIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDSEFSQUNURVJfQ0xBU1M6Ci0JCQkJCXNldCgoQ2hhcmFjdGVyKSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRE9VQkxFX0NMQVNTOgotCQkJCQlzZXQoKERvdWJsZSkgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEZMT0FUX0NMQVNTOgotCQkJCQlzZXQoKEZsb2F0KSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5URUdFUl9DTEFTUzoKLQkJCQkJc2V0KChJbnRlZ2VyKSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU0hPUlRfQ0xBU1M6Ci0JCQkJCXNldCgoU2hvcnQpIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMT05HX0NMQVNTOgotCQkJCQlzZXQoKExvbmcpIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCT09MRUFOX0NMQVNTOgotCQkJCQlzZXQoKEJvb2xlYW4pIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTVFJJTkdfQ0xBU1M6Ci0JCQkJCXNldCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNldCh2YWx1ZSwgdmFsdWVDbGFzc0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCQotCQlwdWJsaWMgdm9pZCBzZXQoKSB7Ci0JCQl0eXBlID0gVk9JRDsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0RmxhZyhpbnQgZmxhZykgewotCQkJdHlwZSA9IEZMQUc7Ci0JCQlhbkludCA9IGZsYWc7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChieXRlIHZhbHVlKSB7Ci0JCQl0eXBlID0gQllURTsKLQkJCWFCeXRlID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KEJ5dGUgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IExfQllURTsKLQkJCQlhQnl0ZSA9IHZhbHVlLmJ5dGVWYWx1ZSgpOwotCQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJCX0gZWxzZQotCQkJCXNldCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChjaGFyIHZhbHVlKSB7Ci0JCQl0eXBlID0gQ0hBUjsKLQkJCWFDaGFyID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KENoYXJhY3RlciB2YWx1ZSkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gTF9DSEFSOwotCQkJCWFDaGFyID0gdmFsdWUuY2hhclZhbHVlKCk7Ci0JCQkJYW5PYmplY3QgPSBudWxsOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KGRvdWJsZSB2YWx1ZSkgewotCQkJdHlwZSA9IERPVUJMRTsKLQkJCWFEb3VibGUgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoRG91YmxlIHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBMX0RPVUJMRTsKLQkJCQlhRG91YmxlID0gdmFsdWUuZG91YmxlVmFsdWUoKTsKLQkJCQlhbk9iamVjdCA9IG51bGw7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoZmxvYXQgdmFsdWUpIHsKLQkJCXR5cGUgPSBGTE9BVDsKLQkJCWFGbG9hdCA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChGbG9hdCB2YWx1ZSkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gTF9GTE9BVDsKLQkJCQlhRmxvYXQgPSB2YWx1ZS5mbG9hdFZhbHVlKCk7Ci0JCQkJYW5PYmplY3QgPSBudWxsOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KGludCB2YWx1ZSkgewotCQkJdHlwZSA9IElOVDsKLQkJCWFuSW50ID0gdmFsdWU7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KEludGVnZXIgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IExfSU5UOwotCQkJCWFuSW50ID0gdmFsdWUuaW50VmFsdWUoKTsKLQkJCQlhbk9iamVjdCA9IG51bGw7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoc2hvcnQgdmFsdWUpIHsKLQkJCXR5cGUgPSBTSE9SVDsKLQkJCWFTaG9ydCA9IHZhbHVlOwotCQkJYW5PYmplY3QgPSBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChTaG9ydCB2YWx1ZSkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gTF9TSE9SVDsKLQkJCQlhU2hvcnQgPSB2YWx1ZS5zaG9ydFZhbHVlKCk7Ci0JCQkJYW5PYmplY3QgPSBudWxsOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KGxvbmcgdmFsdWUpIHsKLQkJCXR5cGUgPSBMT05HOwotCQkJYUxvbmcgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoTG9uZyB2YWx1ZSkgewotCQkJdHlwZSA9IExfTE9ORzsKLQkJCWFMb25nID0gdmFsdWUubG9uZ1ZhbHVlKCk7Ci0JCQlhbk9iamVjdCA9IG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KGJvb2xlYW4gdmFsdWUpIHsKLQkJCXR5cGUgPSBCT09MOwotCQkJYUJvb2wgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoQm9vbGVhbiB2YWx1ZSkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gTF9CT09MOwotCQkJCWFCb29sID0gdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JCQkJYW5PYmplY3QgPSBudWxsOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KFN0cmluZyB2YWx1ZSkgewotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQl0eXBlID0gU1RSSU5HOwotCQkJCWFuT2JqZWN0ID0gdmFsdWU7Ci0JCQl9IGVsc2UKLQkJCQlzZXQoKTsKLQkJfQkJCQkKLQkJcHVibGljIHZvaWQgc2V0KE9iamVjdCB2YWx1ZSwgaW50IGNsYXNzT2JqZWN0SUQpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IE9CSkVDVDsKLQkJCQljbGFzc0lEID0gY2xhc3NPYmplY3RJRDsKLQkJCQlhbk9iamVjdCA9IHZhbHVlOwotCQkJfSBlbHNlCi0JCQkJc2V0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0T2JqZWN0SUQoaW50IHZhbHVlKSB7Ci0JCQl0eXBlID0gT0JKRUNUX0lEOwotCQkJb2JqZWN0SUQgPSB2YWx1ZTsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCQkKLQkJLy8gVXNlIHRoaXMgaWYgdGhlIG9iamVjdCBpcyBhbiBhcnJheSBjb250YWluaW5nIElEcy4gVGhlIHJldHJpZXZlcgotCQkvLyB3aWxsIGJlIHVzZWQgdG8gZ2V0IHRoZSBuZXh0IHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBzdHJlYW0uCi0JCXB1YmxpYyB2b2lkIHNldEFycmF5SURTKFZhbHVlUmV0cmlldmUgcmV0cmlldmVyLCBpbnQgYXJyYXlTaXplLCBpbnQgY29tcG9uZW50VHlwZSkgewotCQkJdHlwZSA9IEFSUkFZX0lEUzsKLQkJCWNsYXNzSUQgPSBjb21wb25lbnRUeXBlOwotCQkJYW5JbnQgPSBhcnJheVNpemU7Ci0JCQlhbk9iamVjdCA9IHJldHJpZXZlcjsKLQkJfQotCQkKLQkJCi0JCS8vIFVzZSB0aGlzIGlmIHRoaXMgaXMgYSBuZXcgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGdldCB0aGUgY29ycmVjdCBjbGFzcyB0eXBlLgotCQlwdWJsaWMgdm9pZCBzZXRPYmplY3RJRChpbnQgdmFsdWUsIGludCBjbGFzc09iamVjdElEKSB7Ci0JCQl0eXBlID0gTkVXX09CSkVDVF9JRDsKLQkJCW9iamVjdElEID0gdmFsdWU7Ci0JCQljbGFzc0lEID0gY2xhc3NPYmplY3RJRDsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQkJCQkJCQkJCQotCQkKLQkJLy8gVXNlIHRoaXMgdG8gaW5kaWNhdGUgYW4gZXhjZXB0aW9uIG9jY3VyZWQuCi0JCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbihpbnQgdGhyb3dJRCwgaW50IHRocm93Q2xhc3NJRCkgewotCQkJdHlwZSA9IFRIUk9XOwotCQkJb2JqZWN0SUQgPSB0aHJvd0lEOwotCQkJY2xhc3NJRCA9IHRocm93Q2xhc3NJRDsKLQkJCWFuT2JqZWN0ID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogSGVscGZ1bCBjb21tYW5kcy4KLQkgKiAtIElmIGEgY29tbWFuZCB0aHJvd3MgYW55IGV4Y2VwdGlvbiBleGNlcHQgQ29tbWFuZEVycm9yRXhjZXB0aW9uLCBvcgotCSAqICAgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24gd2l0aCByZWNvdmVyYWJsZSB0cnVlLCB0aGVuIHRoZSBjb25uZWN0aW9uIGlzIGluIGEgYmFkIHN0YXRlCi0JICogICBhbmQgbmVlZHMgdG8gYmUgY2xvc2VkLgotCSAqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCi0JLyoqCi0JICogVXNlIHRoaXMgdG8gcmVhZCBhIHZhbHVlIChpbnB1dHN0cmVhbSBzaG91bGQgYmUgcG9pbnRpbmcgdG8gdGhlIHR5cGUgYnl0ZSBhcyB0aGUgbmV4dCBieXRlIHRvIHJlYWQpLgotCSAqIFRoZSBwcmltaXRpdmUgZmllbGRzIG9mICJ2YWx1ZSIgd2lsbCBub3QgYmUgY2hhbmdlZCBpZiB0aGV5IGFyZSBub3QgdGhlCi0JICogdHlwZSBvZiB0aGUgdmFsdWUgYmVpbmcgcmVhZC4gSG93ZXZlciwgYW5PYmplY3Qgd2lsbCBiZSBzZXQgdG8gbnVsbC4KLQkgKi8KLQkgCi0JLyoqCi0JICogRXJyb3IgZmxhZ3MgZm9yIFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9ucyB0aGF0IGNhbiBiZSB0aHJvd24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVU5LTk9XTl9SRUFEX1RZUEUgPSAiVU5LTk9XTl9SRUFEX1RZUEUiOwkJLy8gVGhlIHJlYWQgdHlwZSBieXRlIHdhcyBub3QgYSB2YWxpZCB0eXBlIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBVTktOT1dOX1dSSVRFX1RZUEUgPSAiVU5LTk9XTl9XUklURV9UWVBFIjsJCS8vIFRoZSB3cml0ZSB0eXBlIGJ5dGUgd2FzIG5vdCBhIHZhbGlkIHR5cGUJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUWVBFX0lOVkFMSURfRk9SX0NPTU1BTkQgPSAiVFlQRV9JTlZBTElEX0ZPUl9DT01NQU5EIjsJCS8vIFRoZSBkYXRhIHR5cGUgcmVhZCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgY29tbWFuZCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVU5LTk9XTl9DT01NQU5EID0gIlVOS05PV05fQ09NTUFORCI7CQkJLy8gVGhlIGNvbW1hbmQgZmxhZyBpcyB1bmtub3duIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTT01FX1VORVhQRUNURURfRVhDRVBUSU9OID0gIlNPTUVfVU5FWFBFQ1RFRF9FWENFUFRJT04iOwkvLyBUaGVyZSB3YXMgc29tZSBraW5kIG9mIGV4Y2VwdGlvbiB0aGF0IHdhc24ndCBleHBlY3RlZC4gVGhlIGRhdGEgd2lsbCBiZSB0aGUgZXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9PX01BTllfQllURVMgPSAiVE9PX01BTllfQllURVMiOwkJCS8vIFRvbyBtYW55IGJ5dGVzIHdlcmUgc2VudCBvbiBhIHdyaXRlQnl0ZXMuIEl0IHdhcyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBtb3JlIHRoYW4gY291bGQgYmUgcmVhZCBpbnRvIHRoZSBidWZmZXIuIFRoZSBkYXRhIHdpbGwgYmUgdGhlIHNpemUgc2VudC4KLQotCS8qKgotCSAqIFJlYWQgYSB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0gaW50byB0aGUgdmFsdWUgb2JqZWN0LiBJdCB3aWxsIG5vdCBhbGxvdyB2YWx1ZXMgb2YgdHlwZSBGTEFHLgotCSAqIAotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBhbGxvd0ZsYWcKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvYmplY3Qgc2VudCBpbi4gVGhpcyBhbGxvd3MgPGNvZGU+dmFsdWUgPSBDb21tYW5kcy5yZWFkVmFsdWUoaXMsIG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpKTs8L2NvZGU+IAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsdWVPYmplY3QgcmVhZFZhbHVlKERhdGFJbnB1dFN0cmVhbSBpcywgVmFsdWVPYmplY3QgdmFsdWUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJcmVhZFZhbHVlKGlzLCB2YWx1ZSwgZmFsc2UpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBhIHZhbHVlIGZyb20gdGhlIHN0cmVhbSBpbnRvIHRoZSB2YWx1ZSBvYmplY3QuIEl0IHdpbGwgYWxsb3cgdmFsdWVzIG9mIHR5cGUgRkxBRyBpZiBhbGxvd0ZsYWcgaXMgdHJ1ZS4KLQkgKiBAcGFyYW0gaXMKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gYWxsb3dGbGFnIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZhbHVlcyBvZiB0eXBlIGZsYWcgYXJlIGFsbG93LgotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWFkVmFsdWUoRGF0YUlucHV0U3RyZWFtIGlzLCBWYWx1ZU9iamVjdCB2YWx1ZSwgYm9vbGVhbiBhbGxvd0ZsYWcpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXZhbHVlLmFuT2JqZWN0ID0gbnVsbDsKLQkJCXZhbHVlLnR5cGUgPSBpcy5yZWFkQnl0ZSgpOwotCQkJc3dpdGNoICh2YWx1ZS50eXBlKSB7Ci0JCQkJY2FzZSBCWVRFOgotCQkJCWNhc2UgTF9CWVRFOgotCQkJCQl2YWx1ZS5hQnl0ZSA9IGlzLnJlYWRCeXRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ0hBUjoKLQkJCQljYXNlIExfQ0hBUjoKLQkJCQkJdmFsdWUuYUNoYXIgPSBpcy5yZWFkQ2hhcigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERPVUJMRToKLQkJCQljYXNlIExfRE9VQkxFOgotCQkJCQl2YWx1ZS5hRG91YmxlID0gaXMucmVhZERvdWJsZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEZMT0FUOgotCQkJCWNhc2UgTF9GTE9BVDoKLQkJCQkJdmFsdWUuYUZsb2F0ID0gaXMucmVhZEZsb2F0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5UOgotCQkJCWNhc2UgTF9JTlQ6Ci0JCQkJCXZhbHVlLmFuSW50ID0gaXMucmVhZEludCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE9CSkVDVF9JRDoKLQkJCQkJdmFsdWUub2JqZWN0SUQgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCWJyZWFrOwkJCQkJCi0JCQkJY2FzZSBORVdfT0JKRUNUX0lEOgotCQkJCQl2YWx1ZS5jbGFzc0lEID0gaXMucmVhZEludCgpOwotCQkJCQl2YWx1ZS5vYmplY3RJRCA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUSFJPVzoKLQkJCQkJdmFsdWUuY2xhc3NJRCA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJdmFsdWUub2JqZWN0SUQgPSBpcy5yZWFkSW50KCk7Ci0JCQkJCWJyZWFrOwkJCQkKLQkJCQljYXNlIFNIT1JUOgotCQkJCWNhc2UgTF9TSE9SVDoKLQkJCQkJdmFsdWUuYVNob3J0ID0gaXMucmVhZFNob3J0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTE9ORzoKLQkJCQljYXNlIExfTE9ORzoKLQkJCQkJdmFsdWUuYUxvbmcgPSBpcy5yZWFkTG9uZygpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJPT0w6Ci0JCQkJY2FzZSBMX0JPT0w6Ci0JCQkJCXZhbHVlLmFCb29sID0gaXMucmVhZEJvb2xlYW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTVFJJTkc6Ci0JCQkJCXZhbHVlLmFuT2JqZWN0ID0gcmVhZFN0cmluZ0RhdGEoaXMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE9CSkVDVDoKLQkJCQkJdmFsdWUuY2xhc3NJRCA9IGlzLnJlYWRJbnQoKTsJLy8gUmVhZCB0aGUgY2xhc3MgaWQKLQkJCQkJT2JqZWN0SW5wdXRTdHJlYW0gb2kgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaXMpOwotCQkJCQl2YWx1ZS5hbk9iamVjdCA9IG9pLnJlYWRPYmplY3QoKTsJLy8gUmVhZCB0aGUgb2JqZWN0IGl0c2VsZgotCQkJCQlvaSA9IG51bGw7CS8vIERvbid0IGNsb3NlIGl0LCB0aGF0IHdvdWxkIGNsb3NlIHRoZSBzdHJlYW0gaXRzZWxmLgotCQkJCQlicmVhazsKLQkJCQljYXNlIEFSUkFZX0lEUzoKLQkJCQkJLy8gVGhlIGhlYWRlciBmb3IgYW4gYXJyYXkgb2YgaWRzLgotCQkJCQl2YWx1ZS5jbGFzc0lEID0gaXMucmVhZEludCgpOwkvLyBUaGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5Ci0JCQkJCXZhbHVlLmFuSW50ID0gaXMucmVhZEludCgpOwkvLyBUaGUgc2l6ZSBvZiB0aGUgYXJyYXkuCi0JCQkJCS8vIEF0IHRoaXMgcG9pbnQsIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIHVzZSByZWFkQXJyYXkgdG8gcmVhZCBpbiB0aGUgYXJyYXkuCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVk9JRDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBGTEFHOgotCQkJCQlpZiAoYWxsb3dGbGFnKSB7Ci0JCQkJCQl2YWx1ZS5hbkludCA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8vIEZsYWdzIG5vdCBhbGxvd2VkLCBzbyBkcm9wIGludG8gZGVmYXVsdC4KLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oVU5LTk9XTl9SRUFEX1RZUEUsIGZhbHNlLCBuZXcgQnl0ZSh2YWx1ZS50eXBlKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTcGVjaWFsIGludGVyZmFjZSB1c2VkIHRvIHJlYWQgYmFjayBhcnJheXMuIEl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsdWVTZW5kZXIgewotCQkvKioKLQkJICogVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggZW50cnkgZnJvbSB0aGUgYXJyYXkuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgVmFsdWVTZW5kZXIgaGFzCi0JCSAqIHRoZSBhcnJheSB0aGF0IGlzIGJlaW5nIGJ1aWx0LgotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VuZFZhbHVlKFZhbHVlT2JqZWN0IHZhbHVlKTsKLQotCQkvKioKLQkJICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBBUlJBWV9JRFMgaXMgZm91bmQgd2l0aGluIHRoZSByZWFkaW5nIG9mIHRoZSBhcnJheSAoaS5lLiBuZXN0ZWQgYXJyYXlzKQotCQkgKiBJdCBpcyBhc2tpbmcgZm9yIGEgbmV3IFZhbHVlU2VuZGVyIHRvIHVzZSB3aGlsZSB0aGlzIG5lc3RlZCBhcnJheS4gVGhlIGFycmF5VmFsdWUgY29udGFpbnMKLQkJICogdGhlIHZhbHVlb2JqZWN0IGZvciB0aGUgYXJyYXkgaGVhZGVyIChpLmUuIHRoZSBjbGFzcyBpZCBvZiB0aGUgYXJyYXkgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMpLgotCQkgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIFZhbHVlU2VuZGVyIHRvIHN0b3JlIHRoaXMgYXJyYXkgaW4gdGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgYnVpbHQuCi0JCSAqIEBwYXJhbSBhcnJheVZhbHVlCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIFZhbHVlU2VuZGVyIG5lc3RlZEFycmF5KFZhbHVlT2JqZWN0IGFycmF5VmFsdWUpOwotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCB0byBpbml0aWFsaXplIHRoZSBzZW5kZXIgd2l0aCB0aGUgZ2l2ZW4gYXJyYXkgaGVhZGVyLiBUaGlzIGlzIG5vdCBhbHdheXMgY2FsbGVkLCBlYWNoIHVzYWdlCi0JCSAqIGtub3dzIHdoZXRoZXIgaXQgY2FuIGJlIGNhbGxlZCBvciBub3QuIEZvciBleGFtcGxlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBuZXN0ZWRBcnJheSBtYXkgbm90IG5lZWQgdG8gY2FsbCBpbml0aWFsaXplLgotCQkgKiBAcGFyYW0gYXJyYXlIZWFkZXIKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWYWx1ZU9iamVjdCBhcnJheUhlYWRlcik7Ci0JCQotCX0JCi0JCi0JLyoKLQkgKiBOT1RFOiBJdCBpcyBpbXBvcnRhbnQgdGhhdCBvbiB0aGUgSURFIHNpZGUgdGhhdCB0aGlzIGlzIGNhbGxlZCB3aXRoaW4gYSB0cmFuc2FjdGlvbi4gCi0JICogSWYgbm90LCB0aGVyZSBjb3VsZCBiZSBzb21lIGNvcnJ1cHRpb24gaWYgcHJveHkgY2xlYW51cCBvY2N1cnMgaW4gdGhlIG1pZGRsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVhZEFycmF5KERhdGFJbnB1dFN0cmVhbSBpcywgaW50IGFycmF5U2l6ZSwgVmFsdWVTZW5kZXIgdmFsdWVTZW5kZXIsIFZhbHVlT2JqZWN0IHZhbHVlLCBib29sZWFuIGFsbG93RmxhZykgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQkvLyBBbnl0aGluZyBleGNlcHRpb24gb3RoZXIgdGhhbiBhIENvbW1hbmRFeGNlcHRpb24sIHdlIHdpbGwgdHJ5IHRvIGZsdXNoIHRoZSBpbnB1dCBzbyB0aGF0Ci0JCS8vIGl0IGNhbiBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGNvbW1hbmQgYW5kIG5vdCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KLQkJUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlmb3IgKGludCBpPTA7IGk8YXJyYXlTaXplOyBpKyspIHsKLQkJCXJlYWRWYWx1ZShpcywgdmFsdWUsIGFsbG93RmxhZyk7Ci0JCQlpZiAoZXhjZXB0aW9uID09IG51bGwpIAotCQkJCXRyeSB7Ci0JCQkJCWlmICh2YWx1ZS50eXBlICE9IEFSUkFZX0lEUykKLQkJCQkJCXZhbHVlU2VuZGVyLnNlbmRWYWx1ZSh2YWx1ZSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gV2UgaGF2ZSBhIG5lc3RlZCBhcnJheS4KLQkJCQkJCVZhbHVlU2VuZGVyIG5lc3RlZFNlbmRlciA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5lc3RlZFNlbmRlciA9IHZhbHVlU2VuZGVyLm5lc3RlZEFycmF5KHZhbHVlKTsKLQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIFdlIHN0aWxsIG5lZWQgdG8gcmVhZCBpbiB0aGUgYXJyYXkgdG8gZmx1c2guIENyZWF0ZQotCQkJCQkJCS8vIGEgZHVtbXkgc2VuZGVyIHRoYXQgYWNjZXB0cyBldmVyeXRoaW5nIHNlbnQgdG8gaXQuCi0JCQkJCQkJZXhjZXB0aW9uID0gZTsKLQkJCQkJCQluZXN0ZWRTZW5kZXIgPSBuZXcgVmFsdWVTZW5kZXIoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHNlbmRWYWx1ZShWYWx1ZU9iamVjdCB2YWx1ZSkgewotCQkJCQkJCQl9Ci0JCQkJCQkJCXB1YmxpYyBWYWx1ZVNlbmRlciBuZXN0ZWRBcnJheShWYWx1ZU9iamVjdCBhcnJheVZhbHVlKSB7Ci0JCQkJCQkJCQlyZXR1cm4gdGhpczsKLQkJCQkJCQkJfQotCQkJCQkJCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJfQotCQkJCQkJcmVhZEFycmF5KGlzLCB2YWx1ZS5hbkludCwgbmVzdGVkU2VuZGVyLCB2YWx1ZSwgYWxsb3dGbGFnKTsKLQkJCQkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkKLQkJCQkJCQl0aHJvdyBleGNlcHRpb247CS8vIEFuIGV4Y2VwdGlvbiBvY3VycmVkIGluIG5ldyBzZW5kZXIgcmVxdWVzdC4KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBXZSB3YW50IHRvIGZsdXNoIHRoZSBxdWV1ZSwgc28gc2F2ZSB0aGUgZXhjZXB0aW9uIGZvciBsYXRlci4KLQkJCQkJZXhjZXB0aW9uID0gZTsKLQkJCQl9Ci0JCX0KLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQotCQkJdGhyb3cgZXhjZXB0aW9uOwotCX0KLQkJCQkKLQotCS8qKgotCSAqIFNwZWNpYWwgaW50ZXJmYWNlIHRvIGhhbmRsZSB3cml0aW5nIHRoZSBBUlJBWV9JRFMgdHlwZS4KLQkgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIG9iamVjdCB3aWxsIGJlIGluIHRoZSB2YWx1ZU9iamVjdCBzZW50IHRvIHdyaXRlVmFsdWUgd2hlbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKLQkgKiBpcyBBUlJBWV9JRFMuIFRoZW4gd3JpdGUgdmFsdWUgd2lsbCBrbm93IHRvIGNhbGwgdGhpcyBpbnRlcmZhY2UgdG8gd3JpdGUgb3V0IHRoZSB2YWx1ZXMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsdWVSZXRyaWV2ZSB7Ci0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBuZXh0IHZhbHVlIG9iamVjdCB0byBzZW5kLiBJdCB3aWxsIGJlIGNhbGxlZCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIHNpemUgb2YgCi0JCSAqIHRoZSBhcnJheSB3YXMgc2V0IHRvIGJlIHNlbmQuIAotCQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvYmplY3QgdG8gc2VuZC4KLQkJICogQHRocm93cyBFT0ZFeGNlcHRpb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIFZhbHVlT2JqZWN0IG5leHRWYWx1ZSgpIHRocm93cyBFT0ZFeGNlcHRpb247Ci0JfQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVZhbHVlKERhdGFPdXRwdXRTdHJlYW0gb3MsIFZhbHVlT2JqZWN0IHZhbHVlLCBib29sZWFuIGFzVmFsdWVDb21tYW5kKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiAgewotCQl3cml0ZVZhbHVlKG9zLCB2YWx1ZSwgYXNWYWx1ZUNvbW1hbmQsIGFzVmFsdWVDb21tYW5kID8gdHJ1ZSA6IGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVmFsdWUoRGF0YU91dHB1dFN0cmVhbSBvcywgVmFsdWVPYmplY3QgdmFsdWUsIGJvb2xlYW4gYXNWYWx1ZUNvbW1hbmQsIGJvb2xlYW4gZmx1c2gpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uICB7Ci0JCXRyeSB7Ci0JCQlpZiAoYXNWYWx1ZUNvbW1hbmQpCi0JCQkJb3Mud3JpdGVCeXRlKFZBTFVFKTsKLQkJCXN3aXRjaCAodmFsdWUudHlwZSkgewotCQkJCWNhc2UgQllURToKLQkJCQljYXNlIExfQllURToKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUuYUJ5dGUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENIQVI6Ci0JCQkJY2FzZSBMX0NIQVI6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJb3Mud3JpdGVDaGFyKHZhbHVlLmFDaGFyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBET1VCTEU6Ci0JCQkJY2FzZSBMX0RPVUJMRToKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlvcy53cml0ZURvdWJsZSh2YWx1ZS5hRG91YmxlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBGTE9BVDoKLQkJCQljYXNlIExfRkxPQVQ6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsJCQkKLQkJCQkJb3Mud3JpdGVGbG9hdCh2YWx1ZS5hRmxvYXQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElOVDoKLQkJCQljYXNlIExfSU5UOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCW9zLndyaXRlSW50KHZhbHVlLmFuSW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBPQkpFQ1RfSUQ6Ci0JCQkJCW9zLndyaXRlQnl0ZSh2YWx1ZS50eXBlKTsKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUub2JqZWN0SUQpOwotCQkJCQlicmVhazsJCQkJCQotCQkJCWNhc2UgTkVXX09CSkVDVF9JRDoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5jbGFzc0lEKTsKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUub2JqZWN0SUQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRIUk9XOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7Ci0JCQkJCW9zLndyaXRlSW50KHZhbHVlLmNsYXNzSUQpOwotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5vYmplY3RJRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU0hPUlQ6Ci0JCQkJY2FzZSBMX1NIT1JUOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCW9zLndyaXRlU2hvcnQodmFsdWUuYVNob3J0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMT05HOgotCQkJCWNhc2UgTF9MT05HOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCW9zLndyaXRlTG9uZyh2YWx1ZS5hTG9uZyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQk9PTDoKLQkJCQljYXNlIExfQk9PTDoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlvcy53cml0ZUJvb2xlYW4odmFsdWUuYUJvb2wpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNUUklORzoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwkJCQotCQkJCQlzZW5kU3RyaW5nRGF0YShvcywgKFN0cmluZykgdmFsdWUuYW5PYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE9CSkVDVDoKLQkJCQkJb3Mud3JpdGVCeXRlKHZhbHVlLnR5cGUpOwotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5jbGFzc0lEKTsJLy8gV3JpdGUgdGhlIGNsYXNzIElELgotCQkJCQlPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvcyk7Ci0JCQkJCW9vcy53cml0ZU9iamVjdCh2YWx1ZS5hbk9iamVjdCk7Ci0JCQkJCW9vcy5mbHVzaCgpOwotCQkJCQlvb3MgPSBudWxsOwkvLyBEb24ndCBjbG9zZSBpdCwgdGhhdCB3b3VsZCBjbG9zZSB0aGUgc3RyZWFtIGl0c2VsZi4KLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIEFSUkFZX0lEUzoKLQkJCQkJLy8gV2UgYXJlIHdyaXRpbmcgb3V0IGFuIGFycmF5IHdpdGggSUQncyBpbiBpdC4gVGhlIGZpZWxkcyBvZiB0aGUgdmFsZSBvYmplY3Qgd2lsbCBiZToKLQkJCQkJLy8gCWNsYXNzSUQ6IFRoZSBjbGFzcyBpZCBvZiB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5LgotCQkJCQkvLyAgYW5PYmplY3Q6IENvbnRhaW5zIHRoZSBWYWx1ZVJldHJpZXZlciB0byBnZXQgdGhlIG5leHQgdmFsdWUuCi0JCQkJCW9zLndyaXRlQnl0ZShBUlJBWV9JRFMpOwkKLQkJCQkJb3Mud3JpdGVJbnQodmFsdWUuY2xhc3NJRCk7Ci0JCQkJCW9zLndyaXRlSW50KHZhbHVlLmFuSW50KTsJLy8gVGhlIHNpemUgb2YgdGhlIGFycmF5LgotCQkJCQkvLyBOb3cgY29tZXMgdGhlIGtsdWRneSBwYXJ0LCB3cml0aW5nIHRoZSB2YWx1ZXMuCi0JCQkJCVZhbHVlUmV0cmlldmUgcmV0cmlldmVyID0gKFZhbHVlUmV0cmlldmUpIHZhbHVlLmFuT2JqZWN0OwotCQkJCQlpbnQgbGVuID0gdmFsdWUuYW5JbnQ7Ci0JCQkJCXdoaWxlIChsZW4tLSA+IDApCi0JCQkJCQl3cml0ZVZhbHVlKG9zLCByZXRyaWV2ZXIubmV4dFZhbHVlKCksIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBWT0lEOgotCQkJCQlvcy53cml0ZUJ5dGUodmFsdWUudHlwZSk7CQkJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRkxBRzoKLQkJCQkJb3Mud3JpdGVCeXRlKEZMQUcpOwotCQkJCQlvcy53cml0ZUludCh2YWx1ZS5hbkludCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCW9zLndyaXRlQnl0ZShWT0lEKTsKLQkJCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKFVOS05PV05fV1JJVEVfVFlQRSwgdHJ1ZSwgdmFsdWUpOwkJCQkJCi0JCQl9Ci0JCQlpZiAoZmx1c2gpCi0JCQkJb3MuZmx1c2goKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9CQotCQotCS8qKgotCSAqIEZvciByZWFkaW5nIGEgbGFyZ2UgbnVtYmVyIG9mIGJ5dGVzLiBUaGlzIGlzIGEgdmFsdWUgdHlwZSwgbm90IGEgY29tbWFuZC4gVGhlIGNvbW1hbmQgCi0JICogbmVlZHMgdG8gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gLTEgaWYgdGhlcmUKLQkgKiBpcyBubyBtb3JlIGRhdGEgdG8gc2VuZCBhbmQgdGhlIHN0cmVhbSBzaG91bGQgY2xvc2VkLiBJZiByZWFkIHNvbWV0aGluZyBidXQgbm90IGFsbCwKLQkgKiB0aGVuIGp1c3Qgd2hhdCBpdCBjb3VsZCByZWFkIHdpbGwgYmUgcmV0dXJuZWQuIFRoZSBuZXh0IHJlYWQgd2lsbCByZXR1cm4gLTEgZm9yIEVPRi4KLQkgKgotCSAqIEl0IHdpbGwgcmVhZCBmcm9tIHRoZSBmb3JtYXQ6Ci0JICogICBpbnQgLSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAocmV0cmlldmVkIGZyb20gdGhlIHN0cmVhbSkuCi0JICogICBieXRlcyAtIHRoZSBhY3R1YWwgYnl0ZXMuCi0JICoKLQkgKiBOb3RlOiBBIGNvbW1hbmQgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotCSAqICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBieXRlIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHJlYWRCeXRlcyhEYXRhSW5wdXRTdHJlYW0gaXMsIGJ5dGVbXSBieXRlcykgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gIHsKLQkJdHJ5IHsKLQkJCWludCBieXRlc1RvUmVhZCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlieXRlc1RvUmVhZCA9IGlzLnJlYWRJbnQoKTsKLQkJCX0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlpZiAoYnl0ZXNUb1JlYWQgPT0gLTEpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKGJ5dGVzVG9SZWFkID4gYnl0ZXMubGVuZ3RoKQotCQkJCXRocm93IG5ldyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihUT09fTUFOWV9CWVRFUywgZmFsc2UsIG5ldyBJbnRlZ2VyKGJ5dGVzVG9SZWFkKSk7Ci0JCQlpbnQgc3RhcnQgPSAwOwotCQkJaW50IHRvUmVhZCA9IGJ5dGVzVG9SZWFkOwotCQkJd2hpbGUgKHRvUmVhZCA+IDApIHsKLQkJCQlpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChieXRlcywgc3RhcnQsIHRvUmVhZCk7Ci0JCQkJaWYgKGJ5dGVzUmVhZCA9PSAtMSkKLQkJCQkJcmV0dXJuIGJ5dGVzVG9SZWFkICE9IHRvUmVhZCA/IGJ5dGVzVG9SZWFkLXRvUmVhZCA6IC0xOwkvLyBBY3R1YWwgbnVtYmVyIHJlYWQsIG9yIGlmIG5vbmUgcmVhZCwgdGhlbiBFT0YKLQkJCQlzdGFydCs9Ynl0ZXNSZWFkOwotCQkJCXRvUmVhZC09Ynl0ZXNSZWFkOwotCQkJfQotCQkJcmV0dXJuIGJ5dGVzVG9SZWFkOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkJCi0JLyoqCi0JICogRm9yIHdyaXRpbmcgYSBsYXJnZSBudW1iZXIgb2YgYnl0ZXMuIFRoaXMgaXMgYSB2YWx1ZSB0eXBlLCBub3QgYSBjb21tYW5kLiBUaGUgY29tbWFuZCAKLQkgKiBuZWVkcyB0byBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICoKLQkgKiBJdCB3aWxsIHdyaXRlIGl0IGluIHRoZSBmb3JtYXQ6Ci0JICogICBpbnQgLSBudW1iZXIgb2YgYnl0ZXMKLQkgKiAgIGJ5dGVzIC0gdGhlIGFjdHVhbCBieXRlcy4KLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUJ5dGVzKERhdGFPdXRwdXRTdHJlYW0gb3MsIGJ5dGVbXSBieXRlcywgaW50IGJ5dGVzVG9Xcml0ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlSW50KGJ5dGVzVG9Xcml0ZSk7Ci0JCQlvcy53cml0ZShieXRlcywgMCwgYnl0ZXNUb1dyaXRlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9CQotCQkKLQkvKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogU2VuZCBjb21tYW5kIGhlbHBlcnMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqLwotCSAKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFF1aXRDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQnl0ZShRVUlUX0NPTk5FQ1RJT04pOwotCQlvcy5mbHVzaCgpOwotCQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kVGVybWluYXRlQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvcy53cml0ZUJ5dGUoVEVSTUlOQVRFX1NFUlZFUik7Ci0JCW9zLmZsdXNoKCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlT2JqZWN0Q29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBpbnQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQnl0ZShDb21tYW5kcy5SRUxFQVNFX09CSkVDVCk7Ci0JCW9zLndyaXRlSW50KGlkKTsKLQkJb3MuZmx1c2goKTsKLQl9Ci0KLQkvKioKLQkgKiBTZW5kIGEgY2FsbGJhY2sgcmVxdWVzdC4gVGhlIHZhbHVlIGlzIHRvIGJlIHNlbmQgc2VwYXJhdGVseS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZENhbGxiYWNrQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ0FMTEJBQ0spOwotCQkJb3Mud3JpdGVJbnQoY2FsbGJhY2tJRCk7Ci0JCQlvcy53cml0ZUludChtc2dJRCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZENhbGxiYWNrRG9uZUNvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgVmFsdWVPYmplY3QgdmFsdWUsIGludCBlcnJvckNvZGUpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShDQUxMQkFDS19ET05FKTsKLQkJCWlmIChlcnJvckNvZGUgPT0gTk9fRVJST1IpIHsKLQkJCQl3cml0ZVZhbHVlKG9zLCB2YWx1ZSwgdHJ1ZSk7Ci0JCQkJb3MuZmx1c2goKTsKLQkJCX0gZWxzZQotCQkJCXNlbmRFcnJvckNvbW1hbmQob3MsIGVycm9yQ29kZSwgdmFsdWUpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGEgc3RhcnQgY2FsbGJhY2sgc3RyZWFtIHJlcXVlc3QuIFRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiBzZXBhcmF0ZWx5LgotCSAqIFRoZXJlIHdpbGwgbm90IGJlIGEgY2FsbGJhY2sgZG9uZSBjb21tYW5kLiBJdCB3aWxsIHJldHVybiBhcyBzb29uIGFzIHRoZSBjb21tYW5kCi0JICogaXMgc2VudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZENhbGxiYWNrU3RyZWFtQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBpbnQgY2FsbGJhY2tJRCwgaW50IG1zZ0lEKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ0FMTEJBQ0tfU1RSRUFNKTsKLQkJCW9zLndyaXRlSW50KGNhbGxiYWNrSUQpOwotCQkJb3Mud3JpdGVJbnQobXNnSUQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgU1RSSU5HX05PVF9DSFVOS0VEID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgU1RSSU5HX0NIVU5LRUQgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBNT1JFX0NIVU5LUyA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIExBU1RfQ0hVTksgPSAzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENIVU5LX1NJWkUgPSA2NTAwMC8zOyAKLQkKLQkvKioKLQkgKiBTZW5kIHN0cmluZyBkYXRhLiBUaGlzIGlzIGZvciBnZW5lcmFsIHN0cmluZyBkYXRhLiBJdCBtYWtlcyBzdXJlIHRoYXQgaWYgdGhlIHN0cmluZyBpcyB0b28gYmlnICh0aGVyZSBpcyBhIFVURi04IGxpbWl0KQotCSAqIHRoYXQgaXQgd2lsbCBzZW5kIGl0IGluIGNodW5rcy4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPnJlYWRTdHJpbmdEYXRhPC9jb2RlPiB0byByZWFkIHN1Y2ggZGF0YSBpbi4KLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kU3RyaW5nRGF0YShEYXRhT3V0cHV0U3RyZWFtIG9zLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBVVEYtOCBjYW4gdGFrZSB1cCB0byB0aHJlZSBieXRlcyBmb3IgZWFjaCBjaGFyLiBUbyBiZSBvbiBzYWZlIHNpZGUgd2Ugd2lsbAotCQkvLyBub3Qgc2VuZCBhIHN0cmluZyBsYXJnZXIgdGhhbiA2NUsvMyBhcyBvbmUgY2h1bmsuCi0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPD0gQ0hVTktfU0laRSkgewotCQkJLy8gTGVzcyB0aGFuIHRoZSBsaW1pdCwgc2VuZCBieXRlIHRvIGluZGljYXRlIG5vdCBjaHVua2VkLgotCQkJb3Mud3JpdGVCeXRlKFNUUklOR19OT1RfQ0hVTktFRCk7Ci0JCQlvcy53cml0ZVVURihzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJLy8gT3ZlciBsaW1pdCwgbmVlZCB0byBjaHVuayBpdC4KLQkJCS8vIHNlbmQgYnl0ZSB0byBpbmRpY2F0ZSBjaHVua2VkLCB0aGVuIHNlbmQgdHJ1ZSBsZW5ndGggc28gdGhhdCBvdGhlciBzaWRlIGtub3dzIGhvdyBiaWcgdG8gY3JlYXRlLgotCQkJb3Mud3JpdGVCeXRlKFNUUklOR19DSFVOS0VEKTsKLQkJCW9zLndyaXRlSW50KHN0cmluZy5sZW5ndGgoKSk7Ci0JCQkvLyBOb3cgc2VuZCBmaXJzdCBjaHVuawotCQkJZm9yKGludCBpPTA7IGk8c3RyaW5nLmxlbmd0aCgpOyBpKz1DSFVOS19TSVpFKSB7Ci0JCQkJaW50IGVuZEluZGV4ID0gaStDSFVOS19TSVpFOwotCQkJCWlmIChpID09IDApIHsKLQkJCQkJLy8gVGhlIGZpcnN0IGNodW5rIGlzIGp1c3Qgd3JpdHRlbiBhcyBpcy4gV2Uga25vdyBlbmRJbmRleCB3aWxsIGJlIG9rIGJlY2F1c2Ugd2Ugd291bGRuJ3QgZ2V0IGhlcmUgdW5sZXNzIExBUkdFUiB0aGFuIGNodW5rc2l6ZS4KLQkJCQkJb3Mud3JpdGVVVEYoc3RyaW5nLnN1YnN0cmluZyhpLCBlbmRJbmRleCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEZvbGxvd2luZyBjaHVua3MgaGF2ZSBlaXRoZXIgYnl0ZSBNT1JFX0NIVU5LUyBvciBMQVNUX0NIVU5LCi0JCQkJCWlmIChlbmRJbmRleCA+PSBzdHJpbmcubGVuZ3RoKCkpIHsKLQkJCQkJCS8vIFRoaXMgaXMgbGFzdCBjaHVuay4KLQkJCQkJCW9zLndyaXRlQnl0ZShMQVNUX0NIVU5LKTsKLQkJCQkJCW9zLndyaXRlVVRGKHN0cmluZy5zdWJzdHJpbmcoaSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gVGhpcyBpcyBhbiBpbnRlcm1lZGlhdGUgY2h1bmsuCi0JCQkJCQlvcy53cml0ZUJ5dGUoTU9SRV9DSFVOS1MpOwotCQkJCQkJb3Mud3JpdGVVVEYoc3RyaW5nLnN1YnN0cmluZyhpLCBlbmRJbmRleCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlYWQgYSBzdHJpbmcgdGhhdCB3YXMgc2VudCB1c2luZyB0aGUgc2VuZFN0cmluZ0RhdGEgY29tbWFuZC4KLQkgKiBAcGFyYW0gaW4KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRTdHJpbmdEYXRhKERhdGFJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZSBjaHVua2VkID0gaXMucmVhZEJ5dGUoKTsKLQkJaWYgKGNodW5rZWQgPT0gU1RSSU5HX05PVF9DSFVOS0VEKQotCQkJcmV0dXJuIGlzLnJlYWRVVEYoKTsJLy8gTm90IGNodW5rLCBqdXN0IHJlYWQgaXQuCi0JCWVsc2UgewotCQkJLy8gSXQgaXMgY2h1bmtlZC4KLQkJCWludCB0b3RhbExlbmd0aCA9IGlzLnJlYWRJbnQoKTsJLy8gR2V0IHRoZSB0b3RhbCBsZW5ndGguCi0JCQlTdHJpbmdCdWZmZXIgc2JyID0gbmV3IFN0cmluZ0J1ZmZlcih0b3RhbExlbmd0aCk7Ci0JCQl3aGlsZSh0cnVlKSB7Ci0JCQkJc2JyLmFwcGVuZChpcy5yZWFkVVRGKCkpOwotCQkJCWlmIChjaHVua2VkICE9IExBU1RfQ0hVTkspCi0JCQkJCWNodW5rZWQgPSBpcy5yZWFkQnl0ZSgpOwotCQkJCWVsc2UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gc2JyLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVhZCBiYWNrIGNvbW1hbmQsIGV4cGVjdGluZyBlaXRoZXIgYSBWQUxVRSBvciBhbiBFUlJPUi4gWW91IGNhbiByZXF1ZXN0IHRoYXQKLQkgKiBpdCBiZSBvZiBhIHNwZWNpZmljIHR5cGUgKGlmIGFueSB0eXBlIGNhbiBiZSBhY2NlcHRlZCB0aGVuIGVudGVyIC0xIGZvciB0aGUgdHlwZSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE5PX1RZUEVfQ0hFQ0sgPSAtMTsKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVhZEJhY2tWYWx1ZShEYXRhSW5wdXRTdHJlYW0gaXMsIFZhbHVlT2JqZWN0IHZhbHVlLCBieXRlIGV4cGVjdGVkVHlwZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewkJCi0JCQlieXRlIHYgPSBpcy5yZWFkQnl0ZSgpOwotCQkJc3dpdGNoICh2KSB7Ci0JCQkJY2FzZSBWQUxVRToKLQkJCQkJcmVhZFZhbHVlKGlzLCB2YWx1ZSk7Ci0JCQkJCWlmIChleHBlY3RlZFR5cGUgIT0gTk9fVFlQRV9DSEVDSyAmJiAKLQkJCQkJCQkhKGV4cGVjdGVkVHlwZSA9PSB2YWx1ZS50eXBlIHx8IChleHBlY3RlZFR5cGUgPT0gQ29tbWFuZHMuT0JKRUNUX0lEICYmIHZhbHVlLnR5cGUgPT0gTkVXX09CSkVDVF9JRCkpKQotCQkJCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKFRZUEVfSU5WQUxJRF9GT1JfQ09NTUFORCwgdHJ1ZSwgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEVSUk9SOgotCQkJCQlpbnQgY29kZSA9IGlzLnJlYWRJbnQoKTsKLQkJCQkJcmVhZFZhbHVlKGlzLCB2YWx1ZSk7Ci0JCQkJCXRocm93IG5ldyBDb21tYW5kRXJyb3JFeGNlcHRpb24oY29kZSwgdmFsdWUpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbihVTktOT1dOX0NPTU1BTkQsIGZhbHNlLCBuZXcgQnl0ZSh2KSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCQkKLQl9Ci0JCQotCQotCS8qKgotCSAqIEdldENsYXNzIGNvbW1hbmQgcmV0dXJucyBhIEdldENsYXNzUmV0dXJuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEdldENsYXNzUmV0dXJuIHsKLQkJcHVibGljIGludCBjbGFzc0lEOwotCQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZTsKLQkJcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdDsKLQkJcHVibGljIFN0cmluZyBzdXBlckNsYXNzbmFtZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBHZXRDbGFzc1JldHVybiBzZW5kR2V0Q2xhc3NDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIERhdGFJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKEdFVF9DTEFTUyk7Ci0JCQlvcy53cml0ZVVURihjbGFzc05hbWUpOwotCQkJb3MuZmx1c2goKTsKLQkJCQotCQkJR2V0Q2xhc3NSZXR1cm4gcmV0ID0gbmV3IEdldENsYXNzUmV0dXJuKCk7Ci0JCQlieXRlIHYgPSBpcy5yZWFkQnl0ZSgpOwotCQkJc3dpdGNoICh2KSB7Ci0JCQkJY2FzZSBHRVRfQ0xBU1NfUkVUVVJOOgotCQkJCQlyZXQuY2xhc3NJRCA9IGlzLnJlYWRJbnQoKTsJLy8gR2V0IHRoZSBuZXcgY2xhc3MgaWQuCi0JCQkJCXJldC5pc0ludGVyZmFjZSA9IGlzLnJlYWRCb29sZWFuKCk7CS8vIEdldCB0aGUgaXNJbnRlcmZhY2UgZmxhZwotCQkJCQlyZXQuaXNBYnN0cmFjdCA9IGlzLnJlYWRCb29sZWFuKCk7CS8vIEdldCB0aGUgaXNBYnN0cmFjdCBmbGFnLgkJCQkJCi0JCQkJCXJldC5zdXBlckNsYXNzbmFtZSA9IGlzLnJlYWRVVEYoKTsJLy8gR2V0IHRoZSBzdXBlciBjbGFzcyBuYW1lLgotCQkJCQlyZXR1cm4gcmV0OwotCQkJCWNhc2UgRVJST1I6Ci0JCQkJCWludCBjb2RlID0gaXMucmVhZEludCgpOwotCQkJCQlWYWx1ZU9iamVjdCB2YWx1ZSA9IG5ldyBWYWx1ZU9iamVjdCgpOwotCQkJCQlyZWFkVmFsdWUoaXMsIHZhbHVlKTsKLQkJCQkJdGhyb3cgbmV3IENvbW1hbmRFcnJvckV4Y2VwdGlvbihjb2RlLCB2YWx1ZSk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKFVOS05PV05fQ09NTUFORCwgZmFsc2UsIG5ldyBCeXRlKHYpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogR2V0Q2xhc3NGcm9tSUQgY29tbWFuZCByZXR1cm5zIGEgR2V0Q2xhc3NJRFJldHVybiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBHZXRDbGFzc0lEUmV0dXJuIHsKLQkJcHVibGljIFN0cmluZyBjbGFzc05hbWU7Ci0JCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlOwotCQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0OwotCQlwdWJsaWMgU3RyaW5nIHN1cGVyQ2xhc3NuYW1lOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBHZXRDbGFzc0lEUmV0dXJuIHNlbmRHZXRDbGFzc0Zyb21JRENvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBpbnQgY2xhc3NJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKEdFVF9DTEFTU19GUk9NX0lEKTsKLQkJCW9zLndyaXRlSW50KGNsYXNzSUQpOwotCQkJb3MuZmx1c2goKTsKLQkJCQotCQkJR2V0Q2xhc3NJRFJldHVybiByZXQgPSBuZXcgR2V0Q2xhc3NJRFJldHVybigpOwotCQkJYnl0ZSB2ID0gaXMucmVhZEJ5dGUoKTsKLQkJCXN3aXRjaCAodikgewotCQkJCWNhc2UgR0VUX0NMQVNTX0lEX1JFVFVSTjoKLQkJCQkJcmV0LmNsYXNzTmFtZSA9IGlzLnJlYWRVVEYoKTsJLy8gR2V0IHRoZSBuZXcgY2xhc3MgbmFtZS4KLQkJCQkJcmV0LmlzSW50ZXJmYWNlID0gaXMucmVhZEJvb2xlYW4oKTsJLy8gR2V0IHRoZSBpc0ludGVyZmFjZSBmbGFnCi0JCQkJCXJldC5pc0Fic3RyYWN0ID0gaXMucmVhZEJvb2xlYW4oKTsJLy8gR2V0IHRoZSBpc0Fic3RyYWN0IGZsYWcuCi0JCQkJCXJldC5zdXBlckNsYXNzbmFtZSA9IGlzLnJlYWRVVEYoKTsJLy8gR2V0IHRoZSBzdXBlciBjbGFzcyBuYW1lLgotCQkJCQlyZXR1cm4gcmV0OwotCQkJCWNhc2UgRVJST1I6Ci0JCQkJCWludCBjb2RlID0gaXMucmVhZEludCgpOwotCQkJCQlWYWx1ZU9iamVjdCB2YWx1ZSA9IG5ldyBWYWx1ZU9iamVjdCgpOwotCQkJCQlyZWFkVmFsdWUoaXMsIHZhbHVlKTsKLQkJCQkJdGhyb3cgbmV3IENvbW1hbmRFcnJvckV4Y2VwdGlvbihjb2RlLCB2YWx1ZSk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uKFVOS05PV05fQ09NTUFORCwgZmFsc2UsIG5ldyBCeXRlKHYpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kR2V0T2JqZWN0RGF0YShEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIGludCBvYmplY3RJRCwgVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShHRVRfT0JKRUNUX0RBVEEpOwotCQkJb3Mud3JpdGVJbnQob2JqZWN0SUQpOwotCQkJb3MuZmx1c2goKTsKLQkJCXJlYWRCYWNrVmFsdWUoaXMsIHZhbHVlUmV0dXJuLCBORVdfT0JKRUNUX0lEKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9CQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEVycm9yQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBpbnQgY29kZSwgVmFsdWVPYmplY3QgZXJyb3JWYWx1ZSkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKEVSUk9SKTsKLQkJCW9zLndyaXRlSW50KGNvZGUpOwotCQkJd3JpdGVWYWx1ZShvcywgZXJyb3JWYWx1ZSwgZmFsc2UpOwotCQkJb3MuZmx1c2goKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9CQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZE5ld0luc3RhbmNlKERhdGFPdXRwdXRTdHJlYW0gb3MsIERhdGFJbnB1dFN0cmVhbSBpcywgaW50IGNsYXNzSWQsIFN0cmluZyBpbml0aWFsaXphdGlvblN0cmluZywgVmFsdWVPYmplY3QgbmV3VmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShORVdfSU5JVF9TVFJJTkcpOwotCQkJb3Mud3JpdGVJbnQoY2xhc3NJZCk7Ci0JCQlvcy53cml0ZVVURihpbml0aWFsaXphdGlvblN0cmluZyk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJcmVhZEJhY2tWYWx1ZShpcywgbmV3VmFsdWVSZXR1cm4sIE5PX1RZUEVfQ0hFQ0spOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHJldGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2Ugd2Ugd2FudCB0aGVzZSB0byBnbyBvbiBvdXQuCi0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRJbnZva2VNZXRob2RDb21tYW5kKERhdGFPdXRwdXRTdHJlYW0gb3MsIERhdGFJbnB1dFN0cmVhbSBpcywgaW50IG1ldGhvZElELCBWYWx1ZU9iamVjdCBpbnZva2VPbiwgVmFsdWVPYmplY3QgcGFybXMsIFZhbHVlT2JqZWN0IHZhbHVlUmV0dXJuKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoSU5WT0tFKTsKLQkJCW9zLndyaXRlSW50KG1ldGhvZElEKTsKLQkJCXdyaXRlVmFsdWUob3MsIGludm9rZU9uLCBmYWxzZSk7Ci0JCQl3cml0ZVZhbHVlKG9zLCBwYXJtcywgZmFsc2UpOwotCQkJb3MuZmx1c2goKTsKLQkJCXJlYWRCYWNrVmFsdWUoaXMsIHZhbHVlUmV0dXJuLCBOT19UWVBFX0NIRUNLKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEludm9rZU1ldGhvZENvbW1hbmQoRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBWYWx1ZU9iamVjdCBjbGFzc1R5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBWYWx1ZU9iamVjdCBwYXJtVHlwZXMsIFZhbHVlT2JqZWN0IGludm9rZU9uLCBWYWx1ZU9iamVjdCBwYXJtcywgVmFsdWVPYmplY3QgdmFsdWVSZXR1cm4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShJTlZPS0VfV0lUSF9NRVRIT0RfUEFTU0VEKTsKLQkJCXdyaXRlVmFsdWUob3MsIGNsYXNzVHlwZSwgZmFsc2UpOwotCQkJb3Mud3JpdGVVVEYobWV0aG9kTmFtZSk7Ci0JCQl3cml0ZVZhbHVlKG9zLCBwYXJtVHlwZXMsIGZhbHNlKTsKLQkJCXdyaXRlVmFsdWUob3MsIGludm9rZU9uLCBmYWxzZSk7Ci0JCQl3cml0ZVZhbHVlKG9zLCBwYXJtcywgZmFsc2UpOwotCQkJb3MuZmx1c2goKTsKLQkJCXJlYWRCYWNrVmFsdWUoaXMsIHZhbHVlUmV0dXJuLCBOT19UWVBFX0NIRUNLKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdyYXBwZXIgdGhpcyBvbmUuCi0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRHZXRBcnJheUNvbnRlbnRzQ29tbWFuZChEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIGludCBhcnJheUlELCBWYWx1ZU9iamVjdCB2YWx1ZVJldHVybikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJb3Mud3JpdGVCeXRlKEdFVF9BUlJBWV9DT05URU5UUyk7Ci0JCQlvcy53cml0ZUludChhcnJheUlEKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlyZWFkQmFja1ZhbHVlKGlzLCB2YWx1ZVJldHVybiwgTk9fVFlQRV9DSEVDSyk7Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgQ29tbWFuZHMoKSB7Ci0JCS8vIE5ldmVyIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvRXhwcmVzc2lvbkNvbW1hbmRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvRXhwcmVzc2lvbkNvbW1hbmRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzlkMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL0V4cHJlc3Npb25Db21tYW5kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEV4cHJlc3Npb25Db21tYW5kcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci0KLSAKLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25Db21tYW5kcyB7Ci0KLQkvLyBUaGVzZSBhcmUgdGhlIHN1Yi1jb21tYW5kcyB1bmRlciBFWFBSRVNTSU9OX1RSRUVfQ09NTUFORFMgdGhhdCBjYW4gYmUgc2VuZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUKLQkJU1RBUlRfRVhQUkVTU0lPTl9UUkVFX1BST0NFU1NJTkcgPSAwLAotCQlQVVNIX0VYUFJFU1NJT04gPSAxLAotCQlFTkRfRVhQUkVTU0lPTl9UUkVFX1BST0NFU1NJTkcgPSAyLAotCQlTWU5DX1JFUVVFU1QgPSAzLAotCQlQVUxMX1ZBTFVFX1JFUVVFU1QgPSA0LAotCQlUUkFOU0ZFUl9FWFBSRVNTSU9OX1JFUVVFU1QgPSA1LAotCQlSRVNVTUVfRVhQUkVTU0lPTl9SRVFVRVNUID0gNjsKLQkJCi0JLy8gVGhlc2UgYXJlIHRoZSBleHByZXNzaW9uIHNwZWNpZmljIGVycm9yIGNvZGVzIChpdCBjYW4gYWxzbyBzZW5kIGJhY2sgZ2VuZXJhbCBvbmVzLiBTZWUgU1lOQ19SRVFVRVNUIGRvY3MgbG93ZXIgZG93bikuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQKLQkJRVhQUkVTU0lPTl9OT0VYUFJFU1NJT05WQUxVRV9FWENFUFRJT04gPSBDb21tYW5kcy5NQVhfRVJST1JfQ09ERSsxOwkvLyBObyBleHByZXNzaW9uIHZhbHVlIG9jY3VycmVkLgotCQotCS8vIFRoZXNlIGFyZSB0aGUgZmxhZyB2YWx1ZXMgc2VudCBpbiBwcm94eSByZXNvbHV0aW9uIHdoZW4gZG9lc24ndCByZXNvbHZlIHRvIHByb3h5LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50Ci0JCUVYUFJFU1NJT05QUk9YWV9WT0lEVFlQRSA9IDAsCS8vIEV4cHJlc3Npb24gcHJveHkgcmVzb2x2ZXMgdG8gdm9pZCB0eXBlLgotCQlFWFBSRVNTSU9OUFJPWFlfTk9UUkVTT0xWRUQgPSAxOwkvLyBFeHByZXNzaW9uIHByb3h5IG5vdCByZXNvbHZlZC4KLQkKLQkvLyBUaGVzZSBhcmUgdGhlIHRyYWNlIHZhbHVlcyBzZW50IGluIFNUQVJUX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlCi0JCVRSQUNFX0RFRkFVTFQgPSAtMSwKLQkJVFJBQ0VfT0ZGID0gMCwKLQkJVFJBQ0VfT04gPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTlRSQUNFID0gInByb3h5dm0uZXhwcmVzc2lvblRyYWNlIjsJLy8gVGhlIHN5c3RlbSBwcm9wZXJ0eSBmb3IgdHVybmluZyBvbiBleHByZXNzaW9uIHRyYWNpbmcuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OVFJBQ0VfVElNRVJfVEhSRVNIT0xEID0gInByb3h5dm0uZXhwcmVzc2lvblRyYWNlVGltZXJUaHJlc2hvbGQiOwkvLyBUaGUgc3lzdGVtIHByb3BlcnR5IGZvciB0aW1lciB0aHJlc2hvbGQuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIFRoZSBmb3JtYXQgb2YgdGhlIGNvbW1hbmRzIGFyZToKLQkgKiAJCU5vdGU6IE1vc3Qgb2YgdGhlIGNvbW1hbmRzIHdpbGwgbm90IGJlaW5nIGRvaW5nIGEgb3MuZmx1c2goKSBhdCB0aGUgZW5kLiBXZSBhcmUganVzdCBnb2luZyB0bwotCSAqIAkJYmUgc3RyZWFtaW5nIHRoZSBkYXRhIG92ZXIgdGhlIGxpbmUuIEF0IHRoZSBlbmQgd2Ugd2lsbCBmbHVzaCBhbmQgdGhlbiBjYXRjaCB1cC4gVGhhdCB3YXkKLQkgKiAJCXdlIGFyZW4ndCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgc2lkZSBhcyB3ZSBzZW5kIHRoZSBkYXRhLgotCSAqIAotCSAqIFNUQVJUX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HOiAwYiwgdHJhY2UKLQkgKiAJU3RhcnQgcHJvY2Vzc2luZy4KLQkgKiAgYnl0ZSh0cmFjZSk6IC0xIDogZG8gZGVmYXVsdAotCSAqICAgICAgICAgICAgICAgIDAgOiBubyB0cmFjZQotCSAqICAgICAgICAgICAgICAgIDEgOiBkbyB0cmFjZQotCSAqIAotCSAqIFBVU0hfRVhQUkVTU0lPTjogMWIsIGIKLQkgKiAJUHVzaCBhbiBleHByZXNzaW9uLiBXaGVyZSAiYiIgaXMgdGhlIGV4cHJlc3Npb24gdHlwZSBmcm9tIElJbnRlcm5hbEV4cHJlc3Npb25Db25zdGFudHMuIAotCSAqIAlUaGUgYWN0dWFsIGRhdGEgdGhhdCBmb2xsb3dzIGlzIGV4cHJlc3Npb24gdHlwZSBkZXBlbmRlbnQgYW5kIHdpbGwgYmUKLQkgKiAJc2VudCBpbiBhIGZvbGxvd2luZyBjYWxsIHRvIEV4cHJlc3Npb25Db21tYW5kcyBhcyBpdCBidWlsZHMgdXAgdGhlIGFjdHVhbCBjb21tYW5kLgotCSAqIAlTZWUgUkVNRXhwcmVzc2lvbiBhbmQgZWFjaCB0eXBlIG9mIHB1c2ggY2FsbCBtZXRob2Qgd2l0aGluIGl0IHRvIHNlZSB0aGUgYWN0dWFsCi0JICogCXNlbnQgZGF0YS4KLQkgKiAKLQkgKiBFTkRfRVhQUkVTU0lPTl9UUkVFX1BST0NFU1NJTkc6IDJiCi0JICogCUVuZCB0aGUgcHJvY2Vzc2luZyBhbmQgY2xlYW4gdXAuCi0JICogCi0JICogU1lOQ19SRVFVRVNUOiAzYgotCSAqIAlUaGlzIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cy4gVGhlIHJlYXNvbiBpdCBpcyBjYWxsZWQgc3luYyBpcyBiZWNhdXNlIHRoZQotCSAqIAlJREUgd2lsbCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSBhbmQgcmVhZCBiYWNrIHRoZSB2YWx1ZS4gSXQgd2lsbCBzZW5kIGJhY2s6Ci0JICogCQkxOiBWQUxVRSBjb21tYW5kIHdpdGggYm9vbGVhbiB0cnVlIGFzIHRoZSB2YWx1ZS4KLQkgKiAJCTI6IEVSUk9SIGNvbW1hbmQgd2l0aCBjb2RlIG9mIEV4cHJlc3Npb25DbGFzc05vdEZvdW5kLCB3aXRoIHZhbHVlIG9mIFN0cmluZyB3aXRoIG1lc3NhZ2UgZnJvbSBleGNlcHRpb24uCi0JICogCQkzOiBFUlJPUiBjb21tYW5kIHdpdGggY29kZSBvZiBFWFBSRVNTSU9OX05PRVhQUkVTU0lPTlZBTFVFX0VYQ0VQVElPTiwgd2l0aCB2YWx1ZSBvZiBTdHJpbmcgd2l0aCBtZXNzYWdlIGZyb20gZXhjZXB0aW9uLgotCSAqIAkJNDogVEhST1dBQkxFIGNvbW1hbmQgd2l0aCB0aGUgYWN0dWFsIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkLgotCSAqIAotCSAqCi0JICogUFVMTF9WQUxVRV9SRVFVRVNUOiA0YgotCSAqIAlUaGlzIHdpbGwgZG8gYSBzeW5jIHVwIGFuZCByZXR1cm4gdGhlIHZhbHVlIGZyb20gdGhlIGV4cHJlc3Npb24uCi0JICogCUlERSB3aWxsIHdhaXQgZm9yIGl0IHRvIGNvbXBsZWF0ZSBhbmQgcmVhZCBiYWNrIHRoZSB2YWx1ZS4gSXQgd2lsbCBzZW5kIGJhY2s6Ci0JICogCQkxOiBWQUxVRSBjb21tYW5kIHdpdGggdGhlIHJlc3VsdCBhcyB0aGUgdmFsdWUuCi0JICogCQkyOiBFUlJPUiBvciBFWENFUFRJT04gaWYgdGhlcmUgd2VyZSBlcnJvcnMsIHNlZSBTWU5DX1JFUVVFU1Qgd2l0aCB0aGUgZm9ybWF0IHRoZXkgYXJlIHNlbnQgYmFjay4KLQkgKiAKLQkgKiBUUkFOU0ZFUl9FWFBSRVNTSU9OX1JFUVVFU1Q6IDViCi0JICogIFRoaXMgd2lsbCBkbyBhIHN5bmMgdXAsIGFuZCByZXR1cm4gdGhlIEV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyIHRoYXQgdGhlIHJlcXVlc3QgaXMgZm9yLiBBbmQgcmVtb3ZlCi0JICogIHRoZSBjb250cm9sbGVyIGZyb20gaXRzIGxpc3Qgb2YgYWN0aXZlIGV4cHJlc3Npb24gY29udHJvbGxlcnMuIAotCSAqICAKLQkgKiBSRVNVTUVfRVhQUkVTU0lPTl9SRVFVRVNUOiA2YiwgYW5FeHByZXNzaW9uUHJvY2Vzc29yQ29udHJvbGxlcgotCSAqICBUaGlzIHdpbGwgdGFrZSB0aGUgZ2l2ZW4gY29udHJvbGxlciBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGNvbnRyb2xsZXJzIHRoaXMgY29ubmVjdGlvbiBpcyBoYW5kbGluZy4gSXQgcmV0dXJucyBub3RoaW5nLiAgCi0JICogIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JSW50ZXJuYWxFeHByZXNzaW9uQ29uc3RhbnRzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkucmVtb3RlLlJFTUV4cHJlc3Npb24KLQkgKiAKLQkgKi8KLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBzdGFydCBleHByZXNzaW9uIHByb2Nlc3NpbmcgY29tbWFuZC4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklECi0JICogQHBhcmFtIHRyYWNlIAotCSAqIEBwYXJhbSBvcwotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFN0YXJ0RXhwcmVzc2lvblByb2Nlc3NpbmdDb21tYW5kKGludCBleHByZXNzaW9uSUQsIGJ5dGUgdHJhY2UsIERhdGFPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQnl0ZShDb21tYW5kcy5FWFBSRVNTSU9OX1RSRUVfQ09NTUFORCk7Ci0JCW9zLndyaXRlSW50KGV4cHJlc3Npb25JRCk7Ci0JCW9zLndyaXRlQnl0ZShTVEFSVF9FWFBSRVNTSU9OX1RSRUVfUFJPQ0VTU0lORyk7Ci0JCW9zLndyaXRlQnl0ZSh0cmFjZSk7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgdGhlIGVuZCBleHByZXNzaW9uIHByb2Nlc3NpbmcgY29tbWFuZC4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIEBwYXJhbSBvcwotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEVuZEV4cHJlc3Npb25Qcm9jZXNzaW5nQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBEYXRhT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQlvcy53cml0ZUludChleHByZXNzaW9uSUQpOwotCQlvcy53cml0ZUJ5dGUoRU5EX0VYUFJFU1NJT05fVFJFRV9QUk9DRVNTSU5HKTsKLQkJb3MuZmx1c2goKTsJLy8gRmx1c2hpbmcgYmVjYXVzZSB3ZSBhcmUgZG9uZSBhbmQgd2FudCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBnb2VzIG91dC4KLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBhbiBleHByZXNzaW9uIHN1YmNvbW1hbmQuCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRCAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gc3ViY29tbWFuZAotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEV4cHJlc3Npb25Db21tYW5kKGludCBleHByZXNzaW9uSUQsIERhdGFPdXRwdXRTdHJlYW0gb3MsIGJ5dGUgc3ViY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGVCeXRlKENvbW1hbmRzLkVYUFJFU1NJT05fVFJFRV9DT01NQU5EKTsKLQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJb3Mud3JpdGVCeXRlKFBVU0hfRVhQUkVTU0lPTik7Ci0JCW9zLndyaXRlQnl0ZShzdWJjb21tYW5kKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBqdXN0IGEgYnl0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gYUJ5dGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRCeXRlKERhdGFPdXRwdXRTdHJlYW0gb3MsIGJ5dGUgYUJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQnl0ZShhQnl0ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQganVzdCBhbiBpbnQuCi0JICogCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGFuSW50Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kSW50KERhdGFPdXRwdXRTdHJlYW0gb3MsIGludCBhbkludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3Mud3JpdGVJbnQoYW5JbnQpOwotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGp1c3QgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGFTdHJpbmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRTdHJpbmcoRGF0YU91dHB1dFN0cmVhbSBvcywgU3RyaW5nIGFTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNvbW1hbmRzLnNlbmRTdHJpbmdEYXRhKG9zLCBhU3RyaW5nKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VuZCBqdXN0IGEgYm9vbGVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gYUJvb2wKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbmRCb29sZWFuKERhdGFPdXRwdXRTdHJlYW0gb3MsIGJvb2xlYW4gYUJvb2wpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW9zLndyaXRlQm9vbGVhbihhQm9vbCk7Ci0JfQotCQotCS8qKgotCSAqIFNlbmQgdGhlIHB1bGwgdmFsdWUgY29tbWFuZC4gQWZ0ZXIgcHJvY2Vzc2luZyB0aGUgcHJveGllcywgY2FsbGVyIHNob3VsZCBjYWxsIGdldEZpbmFsVmFsdWUoKSB0byBnZXQgdGhlIHZhbHVlLgotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQgCi0JICogQHBhcmFtIG9zCi0JICogQHBhcmFtIGlzCi0JICogQHBhcmFtIHByb3h5aWRzIGlmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGlzIGlzIHRoZSBsaXN0IG9mIGV4cHJlc3Npb24gcHJveHkgaWRzIHRoYXQgbmVlZCB0byBiZSByZXR1cm5lZCBhcyByZW5kZXJlZC4KLQkgKiBAcGFyYW0gc2VuZGVyIHNlbmRlciB1c2VkIHRvIHByb2Nlc3MgdGhlIHJlc29sdmVkIHByb3h5IGlkcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgaWRzLgotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kUHVsbFZhbHVlQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHByb3h5aWRzLCBDb21tYW5kcy5WYWx1ZVNlbmRlciBzZW5kZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9zLndyaXRlQnl0ZShDb21tYW5kcy5FWFBSRVNTSU9OX1RSRUVfQ09NTUFORCk7Ci0JCQlvcy53cml0ZUludChleHByZXNzaW9uSUQpOwotCQkJb3Mud3JpdGVCeXRlKFBVTExfVkFMVUVfUkVRVUVTVCk7Ci0JCQlzZW5kUHJveHlJRHMob3MsIHByb3h5aWRzKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCQlpZiAocHJveHlpZHMgIT0gbnVsbCkgewotCQkJCUNvbW1hbmRzLnJlYWRCYWNrVmFsdWUoaXMsIHByb3h5aWRzLCBDb21tYW5kcy5BUlJBWV9JRFMpOwkvLyBSZWFkIHRoZSBhcnJheSBoZWFkZXIuCi0JCQkJc2VuZGVyLmluaXRpYWxpemUocHJveHlpZHMpOwotCQkJCUNvbW1hbmRzLnJlYWRBcnJheShpcywgcHJveHlpZHMuYW5JbnQsIHNlbmRlciwgcHJveHlpZHMsIHRydWUpOwkvLyBSZWFkIHRoZSBhcnJheS4KLQkJCX0KLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyByZXRocm93IHRoaXMgZXhjZXB0aW9uIHNpbmNlIHdlIHdhbnQgdGhlc2UgdG8gZ28gb24gb3V0LgotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gV3JhcHBlciB0aGlzIG9uZS4KLQkJCXRocm93IG5ldyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihmYWxzZSwgZSk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGEgc3luYyBjb21tYW5kLiBUaGlzIGRvZXMgYSBzeW5jaHJvbml6ZSB3aXRoIHRoZSByZW1vdGUgZXhwcmVzc2lvbiBwcm9jZXNzb3IuIEl0IG1ha2VzIHN1cmUgdGhhdCB0aGUKLQkgKiBzdHJlYW0gaXMgY2F1Z2h0IGFuZCBkb2Vzbid0IHJldHVybiB1bnRpbCBldmVyeXRoaW5nIG9uIHRoZSBzdHJlYW0gaGFzIGJlZW4gcHJvY2Vzc2VkLiBTaG91bGQgdGhlbiBjYWxsCi0JICogZ2V0RmluYWxWYWx1ZSgpIHRvIHZlcmlmeSB0aGUgZXhwcmVzc2lvbiBpcyB2YWxpZC4KLQkgKiBAcGFyYW0gZXhwcmVzc2lvbklEIAotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSBwcm94eWlkcyBpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhpcyBpcyB0aGUgbGlzdCBvZiBleHByZXNzaW9uIHByb3h5IGlkcyB0aGF0IG5lZWQgdG8gYmUgcmV0dXJuZWQgYXMgcmVuZGVyZWQuCi0JICogQHBhcmFtIHNlbmRlciB0aGUgc2VuZGVyIHVzZWQgZm9yIHJlYWRpbmcgYmFjayB0aGUgcHJveHlpZCByZXNvbHV0aW9ucywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJveHkgaWRzLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kU3luY0NvbW1hbmQoaW50IGV4cHJlc3Npb25JRCwgRGF0YU91dHB1dFN0cmVhbSBvcywgRGF0YUlucHV0U3RyZWFtIGlzLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcywgQ29tbWFuZHMuVmFsdWVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJCW9zLndyaXRlQnl0ZShTWU5DX1JFUVVFU1QpOwotCQkJc2VuZFByb3h5SURzKG9zLCBwcm94eWlkcyk7Ci0JCQlvcy5mbHVzaCgpOwotCQkJaWYgKHByb3h5aWRzICE9IG51bGwpIHsKLQkJCQlDb21tYW5kcy5yZWFkQmFja1ZhbHVlKGlzLCBwcm94eWlkcywgQ29tbWFuZHMuQVJSQVlfSURTKTsJLy8gUmVhZCB0aGUgYXJyYXkgaGVhZGVyLgotCQkJCXNlbmRlci5pbml0aWFsaXplKHByb3h5aWRzKTsKLQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaXMsIHByb3h5aWRzLmFuSW50LCBzZW5kZXIsIHByb3h5aWRzLCB0cnVlKTsJLy8gUmVhZCB0aGUgYXJyYXkuCi0JCQl9Ci0JCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJLy8gcmV0aHJvdyB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB3ZSB3YW50IHRoZXNlIHRvIGdvIG9uIG91dC4KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCi0JfQkKLQkKLQkvKioKLQkgKiBTZW5kIHRoZSBwcm94eWlkcyAoaWYgbm90IG51bGwpIGFzIHBhcnQgb2YgYSBjb21tYW5kLiBVc2VkIGJ5IHN5bmMgYW5kIHB1bGxWYWx1ZS4KLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gcHJveHlpZHMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHJlcXVlc3RpbmcgcHJveHkgaWRzLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRQcm94eUlEcyhEYXRhT3V0cHV0U3RyZWFtIG9zLCBDb21tYW5kcy5WYWx1ZU9iamVjdCBwcm94eWlkcykgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKHByb3h5aWRzICE9IG51bGwpIHsKLQkJCW9zLndyaXRlQm9vbGVhbih0cnVlKTsJLy8gSW5kaWNhdGVzIHByb3h5IGlkcyBiZWluZyBzZW50LgotCQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvcywgcHJveHlpZHMsIGZhbHNlLCBmYWxzZSk7Ci0JCX0gZWxzZQotCQkJb3Mud3JpdGVCb29sZWFuKGZhbHNlKTsJLy8gTm8gcHJveHlpZHMgYmVpbmcgc2VudC4KLQl9Ci0JCi0JLyoqCi0JICogU2VuZCB0aGUgdHJhbnNmZXIgZXhwcmVzc2lvbiBjb21tYW5kIGFuZCByZWNlaXZlIGJhY2sgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yIGNvbnRyb2xsZXIuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb25JRAotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBpcwotCSAqIEBwYXJhbSBleHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcgotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kVHJhbnNmZXJFeHByZXNzaW9uQ29tbWFuZChpbnQgZXhwcmVzc2lvbklELCBEYXRhT3V0cHV0U3RyZWFtIG9zLCBEYXRhSW5wdXRTdHJlYW0gaXMsIENvbW1hbmRzLlZhbHVlT2JqZWN0IGV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJCW9zLndyaXRlQnl0ZShUUkFOU0ZFUl9FWFBSRVNTSU9OX1JFUVVFU1QpOwotCQkJb3MuZmx1c2goKTsKLQkJCUNvbW1hbmRzLnJlYWRCYWNrVmFsdWUoaXMsIGV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLCBDb21tYW5kcy5OT19UWVBFX0NIRUNLKTsgLy8gUmVhZCB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzb3IgY29udHJvbGxlcgotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmQgdGhlIHJlc3VtZSBleHByZXNzaW9uIGNvbW1hbmQgd2l0aCBnaXZlbiBleHByZXNzaW9uIHByb2Nlc3NvciBjb250cm9sbGVyLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uSUQKLQkgKiBAcGFyYW0gb3MKLQkgKiBAcGFyYW0gZXhwcmVzc2lvblByb2Nlc3NvckNvbnRyb2xsZXIKLQkgKiBAdGhyb3dzIENvbW1hbmRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFJlc3VtZUV4cHJlc3Npb25Db21tYW5kKGludCBleHByZXNzaW9uSUQsIERhdGFPdXRwdXRTdHJlYW0gb3MsIENvbW1hbmRzLlZhbHVlT2JqZWN0IGV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcy53cml0ZUJ5dGUoQ29tbWFuZHMuRVhQUkVTU0lPTl9UUkVFX0NPTU1BTkQpOwotCQkJb3Mud3JpdGVJbnQoZXhwcmVzc2lvbklEKTsKLQkJCW9zLndyaXRlQnl0ZShSRVNVTUVfRVhQUkVTU0lPTl9SRVFVRVNUKTsKLQkJCUNvbW1hbmRzLndyaXRlVmFsdWUob3MsIGV4cHJlc3Npb25Qcm9jZXNzb3JDb250cm9sbGVyLCBmYWxzZSwgZmFsc2UpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBXcmFwcGVyIHRoaXMgb25lLgotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIEV4cHJlc3Npb25Db21tYW5kcygpIHsKLQkJLy8gTmV2ZXIgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLgotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9JT0NvbW1hbmRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9JT0NvbW1hbmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3ZGNlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvSU9Db21tYW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogSU9Db21tYW5kRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkNvbW1hbmRFeGNlcHRpb247Ci0KLS8qKgotICogQSBjb21tYW5kIGV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIHByb2Nlc3NpbmcgYW4gaW8gcmVxdWVzdAotICogaW4gYSBjYWxsYmFjayBzdHJlYW0uIFRoaXMgZXhjZXB0aW9uIHdyYXBwZXJzIHRoZSBjb21tYW5kIGV4Y2VwdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSU9Db21tYW5kRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIzMDg5NDcxOTUxNjQzODI3NzlMOwotCXByb3RlY3RlZCBDb21tYW5kRXhjZXB0aW9uIGZFeGNlcHRpb247Ci0JCi0JcHVibGljIElPQ29tbWFuZEV4Y2VwdGlvbihDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJZkV4Y2VwdGlvbiA9IGU7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIGZFeGNlcHRpb247Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFeGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCWZFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHApIHsKLQkJZkV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UocCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcCkgewotCQlmRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShwKTsKLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVHJhbnNtaXRhYmxlQXJyYXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9UcmFuc21pdGFibGVBcnJheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGIwNzhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9UcmFuc21pdGFibGVBcnJheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRyYW5zbWl0YWJsZUFycmF5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi0KLS8qKgotICogQSB2YWx1ZSBjYW4gYmUgYSBUcmFuc21pdGFibGVBcnJheS4gVGhpcyBtZWFucyB0aGlzIHZhbHVlIGlzIGFuIGFycmF5IHRoYXQKLSAqIG5lZWRzIHRvIGhhdmUgYSBWYWx1ZVJldHJpZXZlciBjcmVhdGVkIGZvciBpdC4gVGhpcyBpcyB1c2VkIGlmIHRoZSBhcnJheSBoYXMgSUQncyBpbgotICogaXQgYW5kIGlzIG5vdCBhbiBleGlzdGluZyBhcnJheSBvbiB0aGUgc2VydmVyIG9yIGFsbCBjb25zdGFudCB2YWx1ZXMuCi0gKgotICogTk9URTogSXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBJQmVhblR5cGVQcm94aWVzIG9mIHRoZSBwYXJtcyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0gKiAgICAgICBJdCBzaG91bGQgc3RpbGwgd29yaywgYnV0IGl0IGNvdWxkIGJlIGFza2luZyBmb3IgdGhlbSBpbiB0aGUgbWlkZGxlIG9mIHRoZSByZXF1ZXN0Ci0gKiAgICAgICBpZiB0aGV5IGFyZSBub3QgZmlyc3QgZ290dG9uLiBBbmQgdGhpcyBjb3VsZCB0aHJvdyBhIG5vbi1yZWNvdmVyYWJsZSBleGNlcHRpb24gaWYgbm90IGZvdW5kLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNtaXRhYmxlQXJyYXkgewotCXB1YmxpYyBpbnQgY29tcG9uZW50VHlwZUlEOwkvLyBUaGUgaWQgb2YgdGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheS4KLQlwdWJsaWMgT2JqZWN0W10gYXJyYXk7CS8vIFRoZSBhcnJheSBpdCBzZWxmLgotCXB1YmxpYyBUcmFuc21pdGFibGVBcnJheShpbnQgdHlwZUlELCBPYmplY3RbXSBhbkFycmF5KSB7Ci0JCWNvbXBvbmVudFR5cGVJRCA9IHR5cGVJRDsKLQkJYXJyYXkgPSBhbkFycmF5OwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGVDb21tb24vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L2NvbW1vbi9yZW1vdGUvVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9VbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWUxMzdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9VbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFVuZXhwZWN0ZWRDb21tYW5kRXhjZXB0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5Db21tYW5kRXhjZXB0aW9uOwotLyoqCi0gKiBUaGlzIGlzIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIHRoZSBwcm9jZXNzaW5nCi0gKiBvZiBkYXRhIHdhcyBpbnZhbGlkIGZvciB0aGUgY29tbWFuZC4gCi0gKiBUaGVyZSB3aWxsIGJlIGEgZmxhZyBpbmRpY3RpbmcgZXJyb3IgdHlwZSwgYW5kIGEgZmxhZwotICogaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIHJlY292ZXJhYmxlIG9yIG5vdC4KLSAqIElmIG5vdCByZWNvdmVyYWJsZSwgdGhlbiB0aGUgY29ubmVjdGlvbiBuZWVkcyB0byBiZSBjbG9zZWQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcwOTc2OTMzODQ0NTMyNDMxMTNMOwotCXByaXZhdGUgZmluYWwgT2JqZWN0IGZFcnJvclR5cGU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZSZWNvdmVyYWJsZTsKLQkKLQlwdWJsaWMgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oT2JqZWN0IGVycm9yVHlwZSwgYm9vbGVhbiByZWNvdmVyYWJsZSkgewotCQlmRXJyb3JUeXBlID0gZXJyb3JUeXBlOwotCQlmUmVjb3ZlcmFibGUgPSByZWNvdmVyYWJsZTsKLQl9CQkKLQkKLQlwdWJsaWMgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oT2JqZWN0IGVycm9yVHlwZSwgYm9vbGVhbiByZWNvdmVyYWJsZSwgT2JqZWN0IGRhdGEpIHsKLQkJc3VwZXIoZGF0YSk7Ci0JCWZFcnJvclR5cGUgPSBlcnJvclR5cGU7Ci0JCWZSZWNvdmVyYWJsZSA9IHJlY292ZXJhYmxlOwotCX0KLQkKLQlwdWJsaWMgVW5leHBlY3RlZENvbW1hbmRFeGNlcHRpb24oT2JqZWN0IGVycm9yVHlwZSwgYm9vbGVhbiByZWNvdmVyYWJsZSwgU3RyaW5nIG1zZywgT2JqZWN0IGRhdGEpIHsKLQkJc3VwZXIobXNnLCBkYXRhKTsKLQkJZkVycm9yVHlwZSA9IGVycm9yVHlwZTsKLQkJZlJlY292ZXJhYmxlID0gcmVjb3ZlcmFibGU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRFcnJvclR5cGUoKSB7Ci0JCXJldHVybiBmRXJyb3JUeXBlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlY292ZXJhYmxlKCkgewotCQlyZXR1cm4gZlJlY292ZXJhYmxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBtID0gc3VwZXIuZ2V0TWVzc2FnZSgpOwotCQlpZiAoZkVycm9yVHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZGF0YU1zZyA9IGdldEV4Y2VwdGlvbkRhdGEoKSAhPSBudWxsID8gIiBFcnJvcmRhdGE9IitnZXRFeGNlcHRpb25EYXRhKCkudG9TdHJpbmcoKSA6ICIiOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChtID09IG51bGwpCi0JCQkJcmV0dXJuICJFcnJvcnR5cGU9IitmRXJyb3JUeXBlLnRvU3RyaW5nKCkgKyBkYXRhTXNnOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmV0dXJuIG0gKyAnOicgKyAiRXJyb3J0eXBlPSIrZkVycm9yVHlwZS50b1N0cmluZygpICsgZGF0YU1zZzsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UKLQkJCXJldHVybiBtOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZUNvbW1vbi9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvY29tbW9uL3JlbW90ZS9VbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL1VuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjdmZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlQ29tbW9uL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS9jb21tb24vcmVtb3RlL1VuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLS8qKgotICogV3JhcHBlciBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBhIENvbW1hbmQgRXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24gZXh0ZW5kcyBVbmV4cGVjdGVkQ29tbWFuZEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNjU0MTM0MzcwMTE1NjUwOTY5TDsKLQotCXB1YmxpYyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihib29sZWFuIHJlY292ZXJhYmxlLCBUaHJvd2FibGUgZGF0YSkgewotCQlzdXBlcihDb21tYW5kcy5TT01FX1VORVhQRUNURURfRVhDRVBUSU9OLCByZWNvdmVyYWJsZSwgZGF0YSk7Ci0JfQotCQotCXB1YmxpYyBVbmV4cGVjdGVkRXhjZXB0aW9uQ29tbWFuZEV4Y2VwdGlvbihib29sZWFuIHJlY292ZXJhYmxlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZGF0YSkgewotCQlzdXBlcihDb21tYW5kcy5TT01FX1VORVhQRUNURURfRVhDRVBUSU9OLCByZWNvdmVyYWJsZSwgbXNnLCBkYXRhKTsKLQl9Ci0JCi0JcHVibGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiAoVGhyb3dhYmxlKSBnZXRFeGNlcHRpb25EYXRhKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJU3RyaW5nIGxvY2FsTXNnID0gc3VwZXIuZ2V0TWVzc2FnZSgpOwotCQlpZiAoZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCWlmIChsb2NhbE1zZyA9PSBudWxsIHx8IGxvY2FsTXNnLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIGdldEV4Y2VwdGlvbigpLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbG9jYWxNc2cgKyAiOiAiICsgZ2V0RXhjZXB0aW9uKCkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybgotCQkJbG9jYWxNc2c7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByaW50RXhjZXB0aW9uU3RhY2tUcmFjZSgpIHsKLQkJZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQkJcHJpbnRFeGNlcHRpb25TdGFja1RyYWNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHApIHsKLQkJZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHApOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHApIHsKLQkJZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHApOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9zY2hlbWEvY29udHJpYnV0b3JzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9zY2hlbWEvY29udHJpYnV0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmN2E2NDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvc2NoZW1hL2NvbnRyaWJ1dG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmplbS5wcm94eSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnByb3h5IiBpZD0iY29udHJpYnV0b3JzIiBuYW1lPSJQcm94eSBDb25maWd1cmF0aW9uIENvbnRyaWJ1dG9ycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHN1cHBseSBjb25maWd1cmF0aW9uIGNvbnRyaWJ1dG9ycyBmb3IgcHJveHkgc3VwcG9ydC4gWW91IGNhbiBzdXBwbHkgYSBjb250cmlidXRvciBmb3IgYSBzcGVjaWZpYyBjbGFzc3BhdGggY29udGFpbmVyIG9yIGZvciBhIHBsdWdpbi4KLSZsdDtwJmd0OwotVGhlIHdheSBjb25maWd1cmF0aW9uIGNvbnRyaWJ1dG9ycyB3b3JrIGlzIHRoYXQgd2hlbiBhIHByb3h5IHZtIGlzIHN0YXJ0ZWQsIGl0IGZpcnN0IHJ1bnMgdGhyb3VnaCBhbGwgb2YgdGhlIGV4cGxpY2l0IGNvbnRyaWJ1dG9ycyB0aGF0IHdlcmUgZ2l2ZW4gdG8gaXQuIEl0IHRoZW4gZ29lcyB0aHJvdWdoIHRoZSBjbGFzc3BhdGggb2YgdGhlIHByb2plY3QgYW5kIGZpbmRzIHRoZSBjb250YWluZXJzLiBJZiB0aGUgY29udGFpbmVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciwgaXQgd2lsbCBiZSBjYWxsZWQgYXMgYSBjb250cmlidXRvci4gVGhlbiBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhvc2UgaGF2ZSB0aGUgc2FtZSBjb250YWluZXIgaWQsIGFuZCBpZiBzbyB0aGV5IHdpbGwgYmUgY2FsbGVkIGFzIGEgY29udHJpYnV0b3IuCi0mbHQ7cCZndDsKLVRoZSBleHRlbnNpb25zIHdpbGwgYmUgY2FsbGVkIGluIHBsdWdpbiBvcmRlci4gSW4gb3RoZXIgd29yZHMgaWYgcGx1Z2luIEEgZGVwZW5kcyBvbiBwbHVnaW4gQiwgdGhlIGNvbnRyaWJ1dGlvbiBpbiBwbHVnaW4gQSB3aWxsIG5vdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjb250cmlidXRpb24gaW4gcGx1Z2luIEIuCi0mbHQ7cCZndDsKLUlmIGEgcGx1Z2luIGlzIGluIHRoZSBjbGFzc3BhdGggb2YgdGhlIHByb2plY3QgKGluIG90aGVyIHdvcmRzIHRoZSBwcm9qZWN0IGlzIFBERSBwbHVnaW4gZGV2ZWxvcG1lbnQgcHJvamVjdCBhbmQgcmVxdWlyZXMgYSBwbHVnaW4pIHRoZW4gdGhlIGNvbnRyaWJ1dG9yIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpZCB3aWxsIGJlIGNhbGxlZC4KLSZsdDtwJmd0OwotQm90aCBjb250YWluZXIgYW5kIHBsdWdpbiBjYW4gYmUgc3BlY2lmaWVkLCBidXQgYXQgbGVhc3Qgb25lIG9mIHRoZW0gbXVzdCBiZSBzcGVjaWZpZWQuIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlbiB0aGlzIGVudHJ5IHdpbGwgYmUgdXNlZCBpZiBlaXRoZXIgdGhlIGNvbnRhaW5lciBvciB0aGUgcGx1Z2luIGlzIGZvdW5kIGluIHRoZSBjbGFzc3BhdGguCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRyaWJ1dG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udHJpYnV0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImNsYXNzIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEEgY29udHJpYnV0b3IuIEVpdGhlciB0aGUgY29udGFpbmVyIGFuZC9vciB0aGUgcGx1Z2luIGF0dHJpYnV0ZXMgbXVzdCBiZSBzZXQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBjb250YWluZXIuIFRoZSB2YWx1ZSBpcyB0aGUgY29udGFpbmVyIGlkIChlLmcuICZxdW90O0pSRV9DT05UQUlORVImcXVvdDspLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjb250cmlidXRvciBpcyBmb3IgYSBwbHVnaW4uIFRoZSB2YWx1ZSBpcyB0aGUgcGx1Z2luIGlkIChlLmcuICZxdW90O29yZy5lY2xpcHNlLnN3dCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRyaWJ1dG9yLiBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgY29udHJpYnV0b3I6IAotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0ucHJveHkuY29udHJpYnV0b3JzJnF1b3Q7Jmd0OwotICAmbHQ7Y29udHJpYnV0b3IKLSAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkNvbnRyaWJ1dG9ySW1wbGVtZW50YXRpb24mcXVvdDsKLSAgIGNvbnRhaW5lcj0mcXVvdDtNWV9DT05UQUlORVImcXVvdDsmZ3Q7Ci0gICZsdDsvY29udHJpYnV0b3ImZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUNvbmZpZ3VyYXRpb25Db250cmlidXRvciZsdDsvc2FtcCZndDsgaW50ZXJmYWNlIGZvciBjb250cmlidXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlcmUgaXMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yQWRhcHRlciZsdDsvc2FtcCZndDsgYXZhaWxhYmxlIHRvIHN1YmNsYXNzIHRvIHByb3ZpZGUgc3BlY2lmaWMgb3ZlcnJpZGVzLiBUaGUgZGVmYXVsdCBmb3IgdGhlIGFkYXB0ZXIgaXMgdGhhdCBpdCBkb2VzbiZhcG9zO3QgZG8gYW55dGhpbmcuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9zY2hlbWEvZXh0ZW5zaW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvc2NoZW1hL2V4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhNDdmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS9zY2hlbWEvZXh0ZW5zaW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmplbS5wcm94eSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnByb3h5IiBpZD0iZXh0ZW5zaW9ucyIgbmFtZT0iUHJveHkgRXh0ZW5zaW9uIFJlZ2lzdHJhdGlvbiBDb250cmlidXRvcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBzdXBwbHkgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgZm9yIHByb3h5IHN1cHBvcnQuIFlvdSBjYW4gc3VwcGx5IGFuIGV4dGVuc2lvbiByZWdpc3RyYXRpb24gZm9yIGEgc3BlY2lmaWMgY2xhc3NwYXRoIGNvbnRhaW5lciBvciBmb3IgYSBwbHVnaW4uCi0mbHQ7cCZndDsKLUp1c3QgYWZ0ZXIgdGhlIHJlZ2lzdHJ5IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGJlZm9yZSBhbnkgY29udHJpYnV0aW9ucyB0byB0aGUgcmVnaXN0cnkgY2FuIGJlIG1hZGUsIHRoZSBleHRlbnNpb24gcmVnaXN0cmF0aW9ucyBmb3IgdGhlIGdpdmVuIHJlZ2lzdHJ5IHR5cGUgKHN1Y2ggYXMgJnF1b3Q7b3JnLmVjbGlwc2UuamVtLlJFTU9URSZxdW90OykgZm9yIGFueSBwYXRocy9wbHVnaW5zL2NvbnRhaW5lcnMgdGhhdCBoYXZlIHRoYXQgbWF0Y2ggd2lsbCBiZSBleGVjdXRlZC4gVGhlc2UgYXJlIHVzZWQgdG8gZG8gZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgKHN1Y2ggYXMgQmFzZVByb3h5RmFjdHJveVJlZ2lzdHJ5LnJlZ2lzdGVyQmVhblR5cGVQcm94eUZhY3RvcnkoU3RyaW5nIHBhY2thZ2VOYW1lLCBJQmVhblR5cGVQcm94eUZhY3RvcnkgYUZhY3RvcnkpKS4gVGhlc2UgcmVnaXN0cmF0aW9ucyBzaG91bGRuJmFwb3M7dCBkbyBhbnkgYWN0dWFsIHByb3h5IGNhbGxzIGJlY2F1c2UgYXQgdGhpcyB0aW1lIG5vdCBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgaGFkIGJlZW4gcnVuIHlldCBhbmQgaXQgbWF5IGFjY2lkZW50bHkgcmVmZXJlbmNlIGEgcGFja2FnZSB0aGF0IHNob3VsZCBoYXZlIGFuIGV4dGVuc2lvbiBmYWN0b3J5IG9uIGl0LCBidXQgdGhhdCBmYWN0b3J5IGhhcyBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZC4gSW5zdGVhZCB0aGUgY29udHJpYnV0b3IgZXh0ZW5zaW9uIHBvaW50IHNob3VsZCBiZSB1c2VkIGZvciB0aGF0IGJlY2F1c2UgYXQgdGhhdCB0aW1lIGFsbCBvZiB0aGUgZXh0ZW5zaW9ucyB3aWxsIGJlIHJlZ2lzdGVyZWQuCi0mbHQ7cCZndDsKLVRoZSB3YXkgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgd29yayBpcyB0aGF0IHdoZW4gYSBwcm94eSB2bSBpcyBzdGFydGVkLCBpdCBmaW5kcyBhbGwgb2YgdGhlIGV4dGVuc2lvbnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhvc2UgaGF2ZSB0aGUgc2FtZSBjb250YWluZXIgaWQgYW5kIHJlZ2lzdHJ5IHR5cGUgaWQsIGFuZCBpZiBzbyB0aGV5IHdpbGwgYmUgY2FsbGVkIGFzIGFuIGV4dGVuc2lvbiByZWdpc3RyYXRpb24uCi0mbHQ7cCZndDsKLUlmIGEgcGx1Z2luIGlzIGluIHRoZSBjbGFzc3BhdGggb2YgdGhlIHByb2plY3QgKGluIG90aGVyIHdvcmRzIHRoZSBwcm9qZWN0IGlzIFBERSBwbHVnaW4gZGV2ZWxvcG1lbnQgcHJvamVjdCBhbmQgcmVxdWlyZXMgYSBwbHVnaW4pIHRoZW4gdGhlIGV4dGVuc2lvbiByZWdpc3RyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGlkIHdpbGwgYmUgY2FsbGVkLgotJmx0O3AmZ3Q7Ci1Cb3RoIGNvbnRhaW5lciBhbmQgcGx1Z2luIGNhbiBiZSBzcGVjaWZpZWQsIGJ1dCBhdCBsZWFzdCBvbmUgb2YgdGhlbSBtdXN0IGJlIHNwZWNpZmllZC4gSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoaXMgZW50cnkgd2lsbCBiZSB1c2VkIGlmIGVpdGhlciB0aGUgY29udGFpbmVyIG9yIHRoZSBwbHVnaW4gaXMgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVnaXN0cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVnaXN0cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBQcm94eSBFeHRlbnNpb24gZmFjdG9yaWVzIHJlZ2lzdHJhdGlvbiBjb250cmlidXRvci4gVXNlZCB0byBjb250cmlidXRlIHRoZSBmYWN0b3J5IGV4dGVuc2lvbnMgYmFzZWQgdXBvbiB0aGUgcmVnaXN0cnkgdHlwZSAoZS5nLiAmcXVvdDtvcmcuZWNsaXBzZS5qZW0uUkVNT1RFJnF1b3Q7IGZvciByZW1vdGUgdm0gcmVnaXN0cmllcykgZGVwZW5kaW5nIHVwb24gdGhlIGNvbnRhaW5lciBvciBwbHVnaW4gcGF0aC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVnaXN0cnlUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSByZWdpc3RyeSB0aGlzIGV4dGVuc2lvblJlZ2lzdHJhdGlvbiBpcyBmb3IsIHN1Y2ggYXMgJnF1b3Q7b3JnLmVjbGlwc2UuamVtLlJFTU9URSZxdW90OyBmb3IgdGhlIHJlbW90ZSB2bSByZWdpc3RyeSB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBleHRlbnNpb24gcmVnaXN0cmF0aW9uIGlzIGZvciBhIGNvbnRhaW5lci4gVGhlIHZhbHVlIGlzIHRoZSBjb250YWluZXIgaWQgKGUuZy4gJnF1b3Q7SlJFX0NPTlRBSU5FUiZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGx1Z2luIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiByZWdpc3RyYXRpb24gaXMgZm9yIGEgcGx1Z2luLiBUaGUgdmFsdWUgaXMgdGhlIHBsdWdpbiBpZCAoZS5nLiAmcXVvdDtvcmcuZWNsaXBzZS5zd3QmcXVvdDspLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBleHRlbnNpb24gcmVnaXN0cmF0aW9uLiBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgSUV4dGVuc2lvblJlZ2lzdHJhdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHRlbnNpb25SZWdpc3RyYXRpb24iLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4xLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgY29udHJpYnV0b3I6IAotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0ucHJveHkuZXh0ZW5zaW9ucyZxdW90OyZndDsKLSAgJmx0O2NvbnRyaWJ1dG9yCi0gICByZWdpc3RyeVR5cGU9JnF1b3Q7b3JnLmVjbGlwc2UuamVtLlJFTU9URSZxdW90OwotICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXh0ZW5zaW9uUmVnaXN0cmF0aW9uSW1wbGVtZW50YXRpb24mcXVvdDsKLSAgIGNvbnRhaW5lcj0mcXVvdDtNWV9DT05UQUlORVImcXVvdDsmZ3Q7Ci0gICZsdDsvY29udHJpYnV0b3ImZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4dGVuc2lvblJlZ2lzdHJhdGlvbiZsdDsvc2FtcCZndDsgaW50ZXJmYWNlIGZvciBleHRlbnNpb24gcmVnaXN0cmF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQVdUU3RhcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9BV1RTdGFydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MWY0OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9BV1RTdGFydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQVdUU3RhcnRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA1LzExIDE5OjAxOjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLQotaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7Ci0gCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRvIHN0YXJ0IHRoZSBBV1QgZXZlbnRxdWV1ZSBhaGVhZCBvZiB0aW1lIHRvIHRyeSB0byBwYXJhbGxlbCBwcm9jZXNzIGl0LgotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBV1RTdGFydGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydEFXVCgpIHsKLQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRocmVhZC55aWVsZCgpOwkvLyBTbyBhcyBub3QgdG8gcG9zc2libHkgaG9sZCB1cCB0aGUgZ3V5IGRvaW5nIHRoZSBzdGFydGluZy4KLQkJCQlUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7Ci0JCQl9Ci0JCX07Ci0JCXQuc3RhcnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0FycmF5SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0FycmF5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDIyMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9BcnJheUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogQXJyYXlIZWxwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHNpbWlsaWFyIGZ1bmN0aW9uIGFzIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheSBjbGFzcyBidXQKLSAqIGl0IGhhbmRsZXMgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLiBXaXRob3V0IHRoaXMgaGVscGVyLCB0aGUgY2xpZW50IHdvdWxkIGhhdmUKLSAqIHRvIHdhbGsgZG93biB0aHJvdWdoIGVhY2ggZGltZW5zaW9uIGV4ZWN1dGluZyBhIGdldCBjb21tYW5kLiBUaGlzIHdvdWxkIG1lYW4KLSAqIG1hbnkgdHJhbnNhY3Rpb25zIGluc3RlYWQgb2Ygb25lIHByb3ZpZGVkIGJ5IHRoaXMgaGVscGVyLgotICoKLSAqIEl0IGFsc28gcHJvdmlkZXMgc29tZSBvdGhlciBoZWxwZXIgZnVuY3Rpb25zIGZvciBhcnJheXMgdGhhdCBBcnJheSBkb2Vzbid0IHByb3ZpZGUuCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEFycmF5SGVscGVyIHsKLQkvLyBJdCBjYW4gbmV2ZXIgYmUgaW5zdGFudGlhdGVkLgotCXByaXZhdGUgQXJyYXlIZWxwZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldChPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJT2JqZWN0IGFuc3dlciA9IGFycmF5OwotCQlmb3IgKGludCBpPTA7IGk8aW5kZXhlcy5sZW5ndGg7IGkrKykKLQkJCWFuc3dlciA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldChhbnN3ZXIsIGluZGV4ZXNbaV0pOwotCQlyZXR1cm4gYW5zd2VyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJ5dGUgZ2V0Qnl0ZShPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoQnl0ZSkgZ2V0KGFycmF5LCBpbmRleGVzKSkuYnl0ZVZhbHVlKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKE9iamVjdCBhcnJheSwgaW50W10gaW5kZXhlcykgewotCQlyZXR1cm4gKChCb29sZWFuKSBnZXQoYXJyYXksIGluZGV4ZXMpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBjaGFyIGdldENoYXIoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzKSB7Ci0JCXJldHVybiAoKENoYXJhY3RlcikgZ2V0KGFycmF5LCBpbmRleGVzKSkuY2hhclZhbHVlKCk7Ci0JfQkKLQlwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXREb3VibGUoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzKSB7Ci0JCXJldHVybiAoKERvdWJsZSkgZ2V0KGFycmF5LCBpbmRleGVzKSkuZG91YmxlVmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBmbG9hdCBnZXRGbG9hdChPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoRmxvYXQpIGdldChhcnJheSwgaW5kZXhlcykpLmZsb2F0VmFsdWUoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KE9iamVjdCBhcnJheSwgaW50W10gaW5kZXhlcykgewotCQlyZXR1cm4gKChJbnRlZ2VyKSBnZXQoYXJyYXksIGluZGV4ZXMpKS5pbnRWYWx1ZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TG9uZyhPYmplY3QgYXJyYXksIGludFtdIGluZGV4ZXMpIHsKLQkJcmV0dXJuICgoTG9uZykgZ2V0KGFycmF5LCBpbmRleGVzKSkubG9uZ1ZhbHVlKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgc2hvcnQgZ2V0U2hvcnQoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzKSB7Ci0JCXJldHVybiAoKFNob3J0KSBnZXQoYXJyYXksIGluZGV4ZXMpKS5zaG9ydFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoT2JqZWN0IGFycmF5LCBpbnRbXSBpbmRleGVzLCBPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IHN1YkFycmF5ID0gYXJyYXk7Ci0JCWludCB1cFRvID0gaW5kZXhlcy5sZW5ndGgtMTsKLQkJZm9yIChpbnQgaT0wOyBpPHVwVG87IGkrKykKLQkJCXN1YkFycmF5ID0gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0KHN1YkFycmF5LCBpbmRleGVzW2ldKTsKLQkJamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuc2V0KHN1YkFycmF5LCBpbmRleGVzW3VwVG9dLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DYWxsYmFja0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ2FsbGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTY2NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DYWxsYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBDYWxsYmFja0hhbmRsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24ucmVtb3RlLlVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLS8qKgotICogVGhpcyBpcyBhIGhhbmRsZXIgZm9yIGRvaW5nIGNhbGxiYWNrcyB0byB0aGUKLSAqIGNsaWVudC4KLSAqCi0gKiBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIGJlY2F1c2Ugbm8gb25lIHNob3VsZAotICogdXNlIGl0IGZyb20gdGhlIG91dHNpZGUuIEl0IGlzIHRvbyBjcml0aWNhbCB0aGF0Ci0gKiBjYWxsYmFjaydzIHdvcmsgb25seSBpbiB0aGlzIHNwZWNpZmllZCB3YXkuCi0gKi8KLWNsYXNzIENhbGxiYWNrSGFuZGxlciBleHRlbmRzIENvbm5lY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSUNhbGxiYWNrSGFuZGxlciB7Ci0JcHVibGljIENhbGxiYWNrSGFuZGxlcihTb2NrZXQgc2MsIFJlbW90ZVZNU2VydmVyVGhyZWFkIHN2cikgewotCQlzdXBlcihzYywgc3ZyLCBudWxsKTsKLQl9CQkKLQkKLQkvKioKLQkgKiBJbml0aWF0ZSBhIHN0cmVhbSBjYWxsYmFjayByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYXRlQ2FsbGJhY2tTdHJlYW0oaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQl0cnkgewotCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrU3RyZWFtQ29tbWFuZChvdXQsIGNhbGxiYWNrSUQsIG1zZ0lEKTsKLQkJCW91dC5mbHVzaCgpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9Ci0JCXJ1bigpOwkvLyBOb3cgcnVuIGFuZCB3YWl0IGZvciByZXR1cm4uIElmIG5vIGNvbW1hbmQgZXhlY2VwdGlvbiB0aHJvd24sIHRoZW4gaXQgc2lnbmFscyB0byBjb250aW51ZS4KLQl9Ci0JCi0JLyoqCi0JICogV3JpdGUgYnl0ZXMgdG8gdGhlIGNsaWVudC4gSWYgYnl0ZXNUb1dyaXRlIGlzIC0xLCB0aGVuIHRoaXMgaXMgZW5kIGFuZAotCSAqIG5vIGJ5dGVzIGFyZSBiZWluZyB3cml0dGVuLiBKdXN0IHdyaXRlIHRoZSAtMSB0aGVuLgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZXNUb1dyaXRlKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoYnl0ZXNUb1dyaXRlICE9IC0xKQotCQkJCUNvbW1hbmRzLndyaXRlQnl0ZXMob3V0LCBieXRlcywgYnl0ZXNUb1dyaXRlKTsKLQkJCWVsc2UKLQkJCQlvdXQud3JpdGVJbnQoLTEpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgVW5leHBlY3RlZEV4Y2VwdGlvbkNvbW1hbmRFeGNlcHRpb24oZmFsc2UsIGUpOwotCQl9Ci0JfQotCi0JCQotCS8qKgotCSAqIENhbGxiYWNrLCBidXQgc2VuZCB0aGUgcGFybSBhcyBhbiBvYmplY3QsIGllLiBpdCBtdXN0Ci0JICogYmUgbm90aGluZyBidXQgY29uc3RhbnRzLCBlLmcuIFN0cmluZywgSW50ZWdlciwgb3IgYW4KLQkgKiBhcnJheSBvZiBjb25zdGFudHMuIENvbnN0YW50cyBzaG91bGQgbm90IGJlIHRoaW5ncyBsaWtlCi0JICogcmVndWxhciBvYmplY3RzLiBUaGlzIGlzIGJlY2F1c2Ugb25seSBzdGFuZGFyZCBqYXZhLmxhbmcKLQkgKiB0eXBlIGNvbnN0YW50cyBjYW4gYmUgYXNzdXJlZCB0byBiZSBhdmFpbGFibGUgb24gdGhlIG90aGVyCi0JICogY2xpZW50LiBBbHNvIHlvdSBkb24ndCB3YW50IHRvIHNlbmQgYmlnIG9iamVjdHMsIGV4Y2VwdAotCSAqIG1heWJlIHNvbWV0aGluZyBsaWtlIGFuIGFycmF5IG9mIGJ5dGVzIG9yIHN0cmluZ3MuIEl0IG11c3QKLQkgKiBiZSBjb25zdGFudHMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIHNlbnQgYmFjayBmb3IgYW55IHJlYXNvbgotCSAqIHNpbmNlIHRoZWlyIGlkZW50aXR5IHdpbGwgYmUgbG9zdCBpbiB0aGUgdHJhbnNmZXIuCi0JICoKLQkgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGlmIHRoZXJlIGFyZSBubyBwYXJtcyAoaS5lLiBpdCBpcyBudWxsKS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhbGxiYWNrQXNDb25zdGFudHMoaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCwgT2JqZWN0IHBhcm0pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrQ29tbWFuZChvdXQsIGNhbGxiYWNrSUQsIG1zZ0lEKTsKLQkJCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHYgPSBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKTsKLQkJCXNlbmRPYmplY3QocGFybSwgU0VORF9BU19JUywgdiwgb3V0LCBmYWxzZSk7Ci0JCQlvdXQuZmx1c2goKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQotCQlyZXR1cm4gcnVuKCk7CS8vIE5vdyBydW4gYW5kIHdhaXQgZm9yIHJldHVybi4KLQl9Ci0JCi0JCi0JLy8gQSByZXRyaWV2ZXIgaXMgd2hhdCBoYW5kbGVzIHRoZSBhcnJheSBwYXJ0LgotCXByaXZhdGUgY2xhc3MgUmV0cmlldmVyIGltcGxlbWVudHMgQ29tbWFuZHMuVmFsdWVSZXRyaWV2ZSB7Ci0JCWludCBpbmRleD0wOwotCQlPYmplY3RbXSBhcnJheTsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQotCQkKLQkJcHVibGljIFJldHJpZXZlcihPYmplY3RbXSBhbkFycmF5KSB7Ci0JCQlhcnJheSA9IGFuQXJyYXk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQlPYmplY3QgcGFybSA9IGFycmF5W2luZGV4KytdOwotCQkJaWYgKHBhcm0gIT0gbnVsbCkgewotCQkJCWlmIChwYXJtIGluc3RhbmNlb2YgSUNhbGxiYWNrSGFuZGxlci5UcmFuc21pdGFibGVBcnJheSkgewotCQkJCQkvLyBJdCBpcyBhbm90aGVyIGFycmF5LCBjcmVhdGUgYSBuZXcgcmV0cmlldmVyLgotCQkJCQl3b3JrZXIuc2V0QXJyYXlJRFMobmV3IFJldHJpZXZlcigoKElDYWxsYmFja0hhbmRsZXIuVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmdldEFycmF5KCkpLCAoKElDYWxsYmFja0hhbmRsZXIuVHJhbnNtaXRhYmxlQXJyYXkpIHBhcm0pLmdldEFycmF5KCkubGVuZ3RoLCBDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFRoZXkgbWF5IGFkZCBzb21lIG5ldyBJRCdzIGFuZCBpZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhleQotCQkJCQkvLyB3b24ndCBnZXQgcmVsZWFzZWQsIGJ1dCB0aGF0IGlzIGEgc2xpZ2h0IGNoYW5jZSB3ZSB3aWxsIGhhdmUKLQkJCQkJLy8gdG8gdGFrZSBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hpY2ggb25lcyB3ZXJlIG5ldyBhbmQgd2hpY2gKLQkJCQkJLy8gb25lcyB3ZXJlbid0LgotCQkJCQlmaWxsSW5WYWx1ZShwYXJtLCBOT1RfQV9QUklNSVRJVkUsIHdvcmtlcik7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJd29ya2VyLnNldCgpOwotCQkJcmV0dXJuIHdvcmtlcjsKLQkJfQotCX07Ci0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIE5VTExfU0VOVCA9IG5ldyBPYmplY3RbMV07Ci0JLyoqCi0JICogQ2FsbGJhY2ssIGJ1dCBzZW5kIHRoZSBwYXJtIGFzIElEcyBzbyB0aGF0IHByb3hpZXMKLQkgKiB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSBvYmplY3RzIGFuZCBjYW4gYmUgcmVmZXJlbmNlZC4KLQkgKgotCSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJtLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FsbGJhY2tXaXRoUGFybXMoaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCwgT2JqZWN0W10gcGFybXMpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChwYXJtcyA9PSBudWxsKQotCQkJCXBhcm1zID0gTlVMTF9TRU5UOwotCQkJCQotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgdiA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpOwotCQkJCQkJCQotCQkJdi5zZXRBcnJheUlEUyhuZXcgUmV0cmlldmVyKHBhcm1zKSwgcGFybXMubGVuZ3RoLCBDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOwotCQkJQ29tbWFuZHMuc2VuZENhbGxiYWNrQ29tbWFuZChvdXQsIGNhbGxiYWNrSUQsIG1zZ0lEKTsKLQkJCUNvbW1hbmRzLndyaXRlVmFsdWUob3V0LCB2LCBmYWxzZSk7Ci0JCQlvdXQuZmx1c2goKTsKLQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsKLQkJfQotCQlyZXR1cm4gcnVuKCk7CS8vIE5vdyBydW4gYW5kIHdhaXQgZm9yIHJldHVybi4KLQl9CQotCQotCS8qKgotCSAqIEEgY2xvc2VIYW5kbGVyIGhhcyBiZWVuIHJlcXVlc3RlZC4gVGhpcyBpcyBjYWxsZWQgd2hlbgotCSAqIG5vdCB3YWl0aW5nIHdpdGhpbiBhIGxvb3AsIHNvIHdlIG5lZWQgdG8gZG8gdGhlIGNsZWFudXAgb3Vyc2VsdmVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlSGFuZGxlcigpIHsKLQkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJQ29tbWFuZHMuc2VuZFF1aXRDb21tYW5kKG91dCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCW91dC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJY2xvc2UoKTsKLQkJCQlpbiA9IG51bGw7Ci0JCQkJb3V0ID0gbnVsbDsKLQkJCQlzb2NrZXQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQkJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NhbGxiYWNrT3V0cHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0NhbGxiYWNrT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGQyYzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ2FsbGJhY2tPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS52bS5yZW1vdGU7Ci0vKgotICogICRSQ1NmaWxlOiBDYWxsYmFja091dHB1dFN0cmVhbS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS5JT0NvbW1hbmRFeGNlcHRpb247Ci0vKioKLSAqIFRoaXMgaXMgdGhlIHNwZWNpYWwgc3RyZWFtIHVzZWQgdG8gYnVmZmVyIGFuZCB3cml0ZSBhIGxvdAotICogb2YgYnl0ZXMgdG8gY2FsbGJhY2sgaW50byB0aGUgY2xpZW50LgotICoKLSAqIEJlZm9yZSB3cml0aW5nIGFueSBieXRlcyB0byB0aGUgY2xpZW50LCBpdCB3aWxsIHNlZSBpZiB0aGUKLSAqIGNsaWVudCBoYXMgc2VudCBhbnl0aGluZyBiYWNrLiBJZiBpdCBoYXMsIHRoaXMgaXMgYW4gaW5kaWNhdGlvbgotICogdGhhdCB0aGF0IGNsaWVudCBoYXMgcmVxdWVzdGVkIHRoYXQgdGhlIHN0cmVhbSBiZSBjbG9zZWQuIEluIHRoYXQKLSAqIGNhc2UgYW4gSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBpcyByYWlzZWQgdG8gaW5kaWNhdGUgdGhhdAotICogdGhlIHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBhbmQgbm8gbW9yZSBkYXRhIHdpbGwgYmUgc2VudC4KLSAqLwotcHVibGljIGNsYXNzIENhbGxiYWNrT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLQkKLQlwcm90ZWN0ZWQgQ2FsbGJhY2tIYW5kbGVyIGZIYW5kbGVyOwotCXByb3RlY3RlZCBSZW1vdGVWTVNlcnZlclRocmVhZCBmU3ZyOwotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQlwcm90ZWN0ZWQgaW50IGZOZXh0Qnl0ZSA9IDA7Ci0JCi0JcHVibGljIENhbGxiYWNrT3V0cHV0U3RyZWFtKENhbGxiYWNrSGFuZGxlciBoYW5kbGVyLCBSZW1vdGVWTVNlcnZlclRocmVhZCBzdnIpIHsKLQkJZkhhbmRsZXIgPSBoYW5kbGVyOwotCQlmU3ZyID0gc3ZyOwotCQkKLQkJSW50ZWdlciBidWZTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJwcm94eXZtLmJ1ZnNpemUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYnVmU2l6ZSA9PSBudWxsKQotCQkJYnVmU2l6ZSA9IG5ldyBJbnRlZ2VyKDUwMDApOwotCQlmQnVmZmVyID0gbmV3IGJ5dGVbYnVmU2l6ZS5pbnRWYWx1ZSgpXTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTdHJlYW0oKSB7Ci0JCWZTdnIucmV0dXJuQ2FsbGJhY2tIYW5kbGVyKGZIYW5kbGVyKTsKLQkJZlN2ciA9IG51bGw7Ci0JCWZIYW5kbGVyID0gbnVsbDsKLQkJZkJ1ZmZlciA9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFeGNlcHRpb24oQ29tbWFuZEV4Y2VwdGlvbiBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljbGVhclN0cmVhbSgpOwotCQl0aHJvdyBuZXcgSU9Db21tYW5kRXhjZXB0aW9uKGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZsdXNoQnVmZmVyKCk7Ci0JCWZIYW5kbGVyLm91dC5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZIYW5kbGVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQuIE5vIG1vcmUgb3BlcmF0aW9ucyBwZXJtaXR0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZOZXh0Qnl0ZSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZIYW5kbGVyLmluLmF2YWlsYWJsZSgpID4gMCkgewotCQkJCQkvLyBUaGVyZSB3YXMgc29tZXRoaW5nIHdhaXRpbmcuIFRoaXMgbWVhbnMgYSBjYW5jZWwgaGFzIGJlZW4gcmVxdWVzdGVkLgotCQkJCQlmSGFuZGxlci5pbi5za2lwKGZIYW5kbGVyLmluLmF2YWlsYWJsZSgpKTsKLQkJCQkJY2xvc2UoZmFsc2UpOwkvLyBOb3cgY2xvc2UgdGhlIHN0cmVhbS4gV2UgbmVlZCB0byBoYXZlIHRoZSBjbG9zZSBpbmRpY2F0b3Igc2VudCBzbyB0aGF0IHRoZSByZW1vdGUgc2lkZSwgYnV0IHdlIGRvbid0IG5lZWQgdG8gd2FpdCBiZWNhdXNlIHRoZSB0ZXJtaW5hdGUgcmVzcG9uc2UgaGFzIGFscmVhZHkgYmVlbiBzZW50LgotCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlmSGFuZGxlci53cml0ZUJ5dGVzKGZCdWZmZXIsIGZOZXh0Qnl0ZSk7Ci0JCQkJZk5leHRCeXRlID0gMDsKLQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2VzIHRoaXMgb3V0cHV0IHN0cmVhbSBhbmQgcmVsZWFzZXMgYW55IHN5c3RlbSByZXNvdXJjZXMgCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyZWFtLiBUaGUgZ2VuZXJhbCBjb250cmFjdCBvZiA8Y29kZT5jbG9zZTwvY29kZT4gCi0JICogaXMgdGhhdCBpdCBjbG9zZXMgdGhlIG91dHB1dCBzdHJlYW0uIEEgY2xvc2VkIHN0cmVhbSBjYW5ub3QgcGVyZm9ybSAKLQkgKiBvdXRwdXQgb3BlcmF0aW9ucyBhbmQgY2Fubm90IGJlIHJlb3BlbmVkLgotCSAqIDxwPgotCSAqIENsb3NlIHdpbGwgc2VuZCBhIC0xIHRvIHRoZSBjbGllbnQgYW5kIHNldCB0byBpbmRpY2F0ZSBpdCBpcyBjbG9zZWQuCi0JICoKLQkgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNsb3NlKHRydWUpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGNsb3NlKGJvb2xlYW4gd2FpdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZIYW5kbGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmx1c2hCdWZmZXIoKTsKLQkJCQl0cnkgewkJCQkKLQkJCQkJZkhhbmRsZXIud3JpdGVCeXRlcyhudWxsLCAtMSk7Ci0JCQkJCWZIYW5kbGVyLm91dC5mbHVzaCgpOwotCQkJCQlpZiAod2FpdCkgewotCQkJCQkJLy8gV2FpdCBtZWFucyB3YWl0IGZvciB0aGUgcmVtb3RlIHNpZGUgdG8gc2VuZCB0aGUgdGVybWluYXRlZCByZXNwb25zZS4KLQkJCQkJCS8vIEEgbm9ybWFsIGNsb3NlIHdpbGwgZG8gdGhpcy4gSWYgdGhlIHJlbW90ZSBzaWRlIHNlbnQgYSBjYW5jZWwgcmVxdWVzdCwgdGhlbiBpdCBoYXMgYWxyZWFkeQotCQkJCQkJLy8gc2VudCB0aGUgdGVybWluYXRlZCByZXNwb25zZSBhbmQgaXQgaXMgd2FpdGluZyBmb3IgdXMgdG8gc2VuZCB0aGUgZW5kLW9mLWZpbGUgY29tbWFuZC4KLQkJCQkJCQotCQkJCQkJZkhhbmRsZXIuaW4ucmVhZEJ5dGUoKTsJLy8gQmxvY2sgYW5kIHdhaXQgdW50aWwgdGhlIHRlcm1pbmF0ZSByZXF1ZXN0LiBUaGVyZSBzaG91bGRuJ3QgYmUgYW55dGhpbmcgZWxzZSBpbiB0aGUgcGlwZWxpbmUuCi0JCQkJCQlpZiAoZkhhbmRsZXIuaW4uYXZhaWxhYmxlKCkgPiAwKQotCQkJCQkJCS8vIFRoZXJlIHdhcyBzb21ldGhpbmcgZWxzZSB3YWl0aW5nLiBMZXQncyBqdXN0IGNsZWFyIGl0IG91dCB0byBiZSBzYWZlLgotCQkJCQkJCWZIYW5kbGVyLmluLnNraXAoZkhhbmRsZXIuaW4uYXZhaWxhYmxlKCkpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXByb2Nlc3NFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQljbGVhclN0cmVhbSgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmQnVmZmVyW2ZOZXh0Qnl0ZSsrXSA9IChieXRlKSBiOwotCQlpZiAoZk5leHRCeXRlID49IGZCdWZmZXIubGVuZ3RoKQotCQkJZmx1c2hCdWZmZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChiID09IG51bGwpIHsKLQkJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gYi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fAotCQkJICAgKChvZmYgKyBsZW4pID4gYi5sZW5ndGgpIHx8ICgob2ZmICsgbGVuKSA8IDApKSB7Ci0JCSAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKGxlbiA9PSAwKSB7Ci0JCSAgICByZXR1cm47Ci0JCX0KLQkJCi0JCXdoaWxlIChsZW4gPiAwKSB7Ci0JCQlpbnQgbW92ZSA9IGZCdWZmZXIubGVuZ3RoLWZOZXh0Qnl0ZTsKLQkJCWlmIChsZW4gPCBtb3ZlKQotCQkJCW1vdmUgPSBsZW47Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgZkJ1ZmZlciwgZk5leHRCeXRlLCBtb3ZlKTsKLQkJCWxlbiAtPSBtb3ZlOwotCQkJb2ZmICs9IG1vdmU7Ci0JCQlmTmV4dEJ5dGUgKz0gbW92ZTsKLQkJCWlmIChmTmV4dEJ5dGUgPj0gZkJ1ZmZlci5sZW5ndGgpCi0JCQkJZmx1c2hCdWZmZXIoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DbGFzc0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9DbGFzc0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVmNDgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ2xhc3NIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IENsYXNzSGVscGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgaGVscGVyIGZvciBDbGFzcyBhY2Nlc3NpbmcgZnVuY3Rpb25zLgotICogSXRzIG1haW4gZnVuY3Rpb24gaXMgdG8gYnlwYXNzIHNlY3VyaXR5LiBUaGlzIGlzIGJlY2F1c2UKLSAqIHdlIGRvbid0IGNhcmUgYWJvdXQgc2VjdXJpdHkgZm9yIHJlbW90ZSB2bS4gU2VjdXJpdHkgaXMKLSAqIGhhbmRsZWQgYnkgdGhlIElERSBhbmQgY29tcGlsb3Igb3ZlciB0aGVyZS4gV2UgZG8gd2hhdAotICogd2UncmUgdG9sZC4KLSAqIAotICogQGF1dGhvciByaWNoa3VscAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NIZWxwZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENsYXNzSGVscGVyLgotCSAqLwotCXByaXZhdGUgQ2xhc3NIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gRU1QVFlfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsJCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQkvLyBXZSB3YW50IHRvIGdldCB0aGUgZGVmYXVsdCBjdG9yLCB3aGljaCBpcyBpbiB0aGUgZGVjbGFyZWQgbGlzdC4gTm8gbmVlZAotCQkvLyB0byB3b3JyeSBhYm91dCBpbmhlcml0YW5jZSBiZWNhdXNlIGN0b3JzIGFyZSBuZXZlciB2aXJ0dWFsLgotCQlDb25zdHJ1Y3RvciBjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihFTVBUWV9DTEFTU19BUlJBWSk7Ci0JCWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGN0b3IubmV3SW5zdGFuY2UoRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvQ29ubmVjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzZDkyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0Nvbm5lY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogQ29ubmVjdGlvbkhhbmRsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Ob0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGhhbmRsZXMgb25lIGNvbm5lY3Rpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIENvbm5lY3Rpb25IYW5kbGVyIHsJCi0JCQotCXByb3RlY3RlZCBTb2NrZXQgc29ja2V0OwotCWZpbmFsIHByb3RlY3RlZCBSZW1vdGVWTVNlcnZlclRocmVhZCBzZXJ2ZXI7Ci0JZmluYWwgcHJvdGVjdGVkIFRocmVhZCBjb25uZWN0aW9uVGhyZWFkOwotCXByb3RlY3RlZCBEYXRhSW5wdXRTdHJlYW0gaW47Ci0JcHJvdGVjdGVkIERhdGFPdXRwdXRTdHJlYW0gb3V0OwotCQotCS8vIEtsdWRnZTogQnVnIGluIExpbnV4IDEuMy54eHggb2YgSlZNLiBDbG9zaW5nIGEgc29ja2V0IHdoaWxlIHRoZSBzb2NrZXQgaXMgYmVpbmcgcmVhZC9hY2NlcHQgd2lsbCBub3QgaW50ZXJydXB0IHRoZQotCS8vIHdhaXQuIE5lZWQgdG8gdGltZW91dCB0byB0aGUgc29ja2V0IHJlYWQvYWNjZXB0IGJlZm9yZSB0aGUgc29ja2V0IGNsb3NlIHdpbGwgYmUgbm90aWNlZC4gVGhpcyBoYXMgYmVlbiBmaXhlZAotCS8vIGluIExpbnV4IDEuNC4gU28gb24gTGludXggMS4zIG5lZWQgdG8gcHV0IHRpbWVvdXRzIGluIG9uIHRob3NlIHNvY2tldHMgdGhhdCBjYW4gYmUgc2VwYXJhdGVseSBjbG9zZWQgd2hpbGUgcmVhZGluZy9hY2NlcHRpbmcuCi0Jc3RhdGljIGJvb2xlYW4gTElOVVhfMV8zID0gImxpbnV4Ii5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSAmJiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIsIiIpLnN0YXJ0c1dpdGgoIjEuMyIpOwkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCi0JLyoqCi0JICogVGhpcyBtYXkgYmUgcnVubmluZyBhcyBhIGNhbGxiYWNrLCBpbiB0aGF0IGNhc2UgdGhlcmUgaXMgbm8gY29ubmVjdGlvblRocmVhZC4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbkhhbmRsZXIoU29ja2V0IHNjLCBSZW1vdGVWTVNlcnZlclRocmVhZCBzdnIsIFRocmVhZCBjb25uZWN0aW9uVGhyZWFkKSB7Ci0JCXNvY2tldCA9IHNjOwotCQlzZXJ2ZXIgPSBzdnI7Ci0JCXRoaXMuY29ubmVjdGlvblRocmVhZCA9IGNvbm5lY3Rpb25UaHJlYWQ7Ci0JCQotCQlJbnRlZ2VyIGJ1ZlNpemUgPSBJbnRlZ2VyLmdldEludGVnZXIoInByb3h5dm0uYnVmc2l6ZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChidWZTaXplID09IG51bGwpCi0JCQlidWZTaXplID0gbmV3IEludGVnZXIoNTAwMCk7Ci0JCQkKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIGJ1ZlNpemUuaW50VmFsdWUoKSkpOwotCQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLCBidWZTaXplLmludFZhbHVlKCkpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCQkKLQl9Ci0JCi0JLyoqCi0JICogRGlkIHRoaXMgY29uc3RydWN0IGNvcnJlY3RseS4KLQkgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGFuIGV4Y2VwdGlvbiBjb3VsZCBiZSB0aHJvd24gaW4gdGhlIGN0b3IgYW5kCi0JICogdGhhdCdzIG5vdCBhIGdvb2QgdGhpbmcgdG8gZG8uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0JCXJldHVybiBzb2NrZXQgIT0gbnVsbDsKLQl9CQotCQotCS8qKgotCSAqIFJlcXVlc3QgdGhlIHRocmVhZCB0byBjbG9zZSBkb3duLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlpZiAoc29ja2V0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU29ja2V0IHMgPSBzb2NrZXQ7Ci0JCQkJc29ja2V0ID0gbnVsbDsKLQkJCQlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCQotCS8vIE1hcCBvZiBJRCB0byBleHByZXNzaW9uIHByb2Nlc3NlcnMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4KLQlwcml2YXRlIE1hcCBleHByZXNzaW9uUHJvY2Vzc29ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogUHJvY2VzcyBhbmQgbG9vcCB1bnRpbCB0b2xkIHRvIHN0b3AuIEEgY2FsbGJhY2tfZG9uZSB3aWxsIHN0b3AKLQkgKiB0aGUgbG9vcCBhbmQgd2lsbCByZXR1cm4gYSByZXN1bHQuIE90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsJCQotCQlib29sZWFuIHNodXRkb3duID0gZmFsc2U7Ci0JCWJvb2xlYW4gY2xvc2VXaGVuRG9uZSA9IHRydWU7Ci0JCUNvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0ID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7CS8vIFdvcmtpbmcgdmFsdWUgb2JqZWN0IHNvIG5vdCBjb250aW51YWxseSByZWNyZWF0ZWQuCi0JCUludm9rYWJsZVZhbHVlU2VuZGVyIHZhbHVlU2VuZGVyID0gbmV3IEludm9rYWJsZVZhbHVlU2VuZGVyKCk7CS8vIFdvcmtpbmcgdmFsdWVzZW5kZXIgc28gbm90IGNvbnRpbnVhbGx5IHJlY3JlYXRlZC4gCi0JCXRyeSB7Ci0JCQlib29sZWFuIGRvTG9vcCA9IHRydWU7Ci0KLQkJCS8qKgotCQkJICogTm90ZTogSW4gdGhlIGNhc2VzIGJlbG93IHlvdSB3aWxsIHNlZSBhIGxvdCBvZiBmaW5hbGx5IGNsYXVzZXMgdGhhdCBudWxsIHZhcmlhYmxlcyBvdXQuCi0JCQkgKiBUaGlzIGlzIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZyBsb29wLCBhbmQgdmFyaWFibGVzIGRlY2xhcmVkIHdpdGhpbiBibG9ja3MgYXJlIG5vdAotCQkJICogZ2FyYmFnZSBjb2xsZWN0ZWQgdW50aWwgdGhlIG1ldGhvZCBpcyB0ZXJtaW5hdGVkLCBzbyB0aGVzZSB2YXJpYWJsZXMgb25jZSBzZXQgd291bGQgbmV2ZXIKLQkJCSAqIGJlIEdDJ2QuIFRoZSBudWxsaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGNhc2UgbWFrZXMgc3VyZSB0aGF0IGFueSBvZiB0aG9zZSBvYmplY3RzIHNldCBhcmUKLQkJCSAqIG5vdyBhdmFpbGFibGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGVuIG5lY2Vzc2FyeS4KLQkJCSAqLwkJCi0JCQl3aGlsZShkb0xvb3AgJiYgaXNDb25uZWN0ZWQoKSkgewotCQkJCWJ5dGUgY21kID0gMDsKLQkJCQl0cnkgewotCQkJCQlpZiAoTElOVVhfMV8zKQotCQkJCQkJc29ja2V0LnNldFNvVGltZW91dCgxMDAwKTsJLy8gTGludXggMS4zIGJ1Zywgc2VlIGNvbW1lbnQgb24gTElOVVhfMV8zCi0JCQkJCWNtZCA9IGluLnJlYWRCeXRlKCk7Ci0JCQkJCWlmIChMSU5VWF8xXzMgJiYgaXNDb25uZWN0ZWQoKSkKLQkJCQkJCXNvY2tldC5zZXRTb1RpbWVvdXQoMCk7CS8vIExpbnV4IDEuMyBidWcsIHNlZSBjb21tZW50IG9uIExJTlVYXzFfMwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkSU9FeGNlcHRpb24gZSkgewotCQkJCQljb250aW51ZTsJLy8gVGltZW91dCwgdHJ5IGFnYWluCi0JCQkJfQotCQkJCXN3aXRjaCAoY21kKSB7Ci0JCQkJCWNhc2UgQ29tbWFuZHMuUVVJVF9DT05ORUNUSU9OOgkJCQkKLQkJCQkJCWRvTG9vcCA9IGZhbHNlOwkKLQkJCQkJCWJyZWFrOwkvLyBDbG9zZSB0aGlzIGNvbm5lY3Rpb24KLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLlRFUk1JTkFURV9TRVJWRVI6Ci0JCQkJCQlkb0xvb3AgPSBmYWxzZTsJCQotCQkJCQkJc2h1dGRvd24gPSB0cnVlOwkvLyBTaHV0ZG93biBldmVyeXRoaW5nCi0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLkdFVF9DTEFTUzoKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBpbi5yZWFkVVRGKCk7Ci0JCQkJCQlDbGFzcyBhQ2xhc3MgPSBudWxsOwotCQkJCQkJQ2xhc3Mgc3VwZXJDbGFzcyA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgc3VwZXJDbGFzc05hbWUgPSBudWxsOwotCQkJCQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlhQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CS8vIFR1cm5zIG91dCB1c2luZyBKTkkgZm9ybWF0IGZvciBhcnJheSB0eXBlIHdpbGwgd29yayBmaW5lLgotCQkJCQkJCQkKLQkJCQkJCQlhZGRlZCA9IHNlcnZlci5nZXRJZGVudGl0eUlEKGFDbGFzcywgdmFsdWVPYmplY3QpOwotCQkJCQkJCWJvb2xlYW4gaXNJbnRlcmZhY2UgPSBhQ2xhc3MuaXNJbnRlcmZhY2UoKTsKLQkJCQkJCQlib29sZWFuIGlzQWJzdHJhY3QgPSBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0Fic3RyYWN0KGFDbGFzcy5nZXRNb2RpZmllcnMoKSk7Ci0JCQkJCQkJc3VwZXJDbGFzcyA9IGFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQkJCQkJc3VwZXJDbGFzc05hbWUgPSAoc3VwZXJDbGFzcyAhPSBudWxsKSA/IHN1cGVyQ2xhc3MuZ2V0TmFtZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlvdXQud3JpdGVCeXRlKENvbW1hbmRzLkdFVF9DTEFTU19SRVRVUk4pOwotCQkJCQkJCW91dC53cml0ZUludCh2YWx1ZU9iamVjdC5vYmplY3RJRCk7Ci0JCQkJCQkJb3V0LndyaXRlQm9vbGVhbihpc0ludGVyZmFjZSk7Ci0JCQkJCQkJb3V0LndyaXRlQm9vbGVhbihpc0Fic3RyYWN0KTsKLQkJCQkJCQlvdXQud3JpdGVVVEYoc3VwZXJDbGFzc05hbWUpOwotCQkJCQkJCW91dC5mbHVzaCgpOwotCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJQ29tbWFuZHMuc2VuZEVycm9yQ29tbWFuZChvdXQsIENvbW1hbmRzLkdFVF9DTEFTU19OT1RfRk9VTkQsIHZhbHVlT2JqZWN0KTsJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlKSB7Ci0JCQkJCQkJc2VuZEV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpLCB2YWx1ZU9iamVjdCwgb3V0KTsJCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKLQkJCQkJCQlzZW5kRXhjZXB0aW9uKGUsIHZhbHVlT2JqZWN0LCBvdXQpOwkJCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCS8vIFNvbWV0aGluZyBiYWQsIGRpZCB3ZSBhZGQgYSBjbGFzcz8gSWYgd2UgZGlkIHJlbW92ZSBpdCBmcm9tIHRoZSB0YWJsZS4KLQkJCQkJCQlpZiAoYWRkZWQpCi0JCQkJCQkJCXNlcnZlci5yZW1vdmVPYmplY3Qoc2VydmVyLmdldE9iamVjdCh2YWx1ZU9iamVjdC5vYmplY3RJRCkpOwotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCS8vIGNsZWFyIG91dCBmb3IgR0MgdG8gd29yay4KLQkJCQkJCQljbGFzc05hbWUgPSBudWxsOwotCQkJCQkJCWFDbGFzcyA9IG51bGw7Ci0JCQkJCQkJc3VwZXJDbGFzcyA9IG51bGw7Ci0JCQkJCQkJc3VwZXJDbGFzc05hbWUgPSBudWxsOwotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5HRVRfQ0xBU1NfRlJPTV9JRDoKLQkJCQkJCWludCBjbGFzc0lEID0gaW4ucmVhZEludCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlhQ2xhc3MgPSAoQ2xhc3MpIHNlcnZlci5nZXRPYmplY3QoY2xhc3NJRCk7Ci0JCQkJCQkJYm9vbGVhbiBpc0ludGVyZmFjZSA9IGFDbGFzcy5pc0ludGVyZmFjZSgpOwotCQkJCQkJCWJvb2xlYW4gaXNBYnN0cmFjdCA9IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzQWJzdHJhY3QoYUNsYXNzLmdldE1vZGlmaWVycygpKTsJCQkJCQkJCi0JCQkJCQkJc3VwZXJDbGFzcyA9IGFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQkJCQkJc3VwZXJDbGFzc05hbWUgPSAoc3VwZXJDbGFzcyAhPSBudWxsKSA/IHN1cGVyQ2xhc3MuZ2V0TmFtZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlvdXQud3JpdGVCeXRlKENvbW1hbmRzLkdFVF9DTEFTU19JRF9SRVRVUk4pOwotCQkJCQkJCW91dC53cml0ZVVURihhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJCQkJCQlvdXQud3JpdGVCb29sZWFuKGlzSW50ZXJmYWNlKTsKLQkJCQkJCQlvdXQud3JpdGVCb29sZWFuKGlzQWJzdHJhY3QpOwotCQkJCQkJCW91dC53cml0ZVVURihzdXBlckNsYXNzTmFtZSk7Ci0JCQkJCQkJb3V0LmZsdXNoKCk7Ci0JCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5DTEFTU19DQVNUX0VYQ0VQVElPTiwgdmFsdWVPYmplY3QpOwotCQkJCQkJfSBmaW5hbGx5IHsJCi0JCQkJCQkJLy8gY2xlYXIgb3V0IGZvciBHQyB0byB3b3JrLgotCQkJCQkJCWFDbGFzcyA9IG51bGw7Ci0JCQkJCQkJc3VwZXJDbGFzcyA9IG51bGw7Ci0JCQkJCQkJc3VwZXJDbGFzc05hbWUgPSBudWxsOwotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCi0JCQkJCWNhc2UgQ29tbWFuZHMuR0VUX09CSkVDVF9EQVRBOgotCQkJCQkJaW50IG9iamVjdElEID0gaW4ucmVhZEludCgpOwotCQkJCQkJT2JqZWN0IGFuT2JqZWN0ID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYW5PYmplY3QgPSBzZXJ2ZXIuZ2V0T2JqZWN0KG9iamVjdElEKTsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXRPYmplY3RJRChvYmplY3RJRCwgc2VydmVyLmdldElkZW50aXR5SUQoYW5PYmplY3QuZ2V0Q2xhc3MoKSkpOwotCQkJCQkJCUNvbW1hbmRzLndyaXRlVmFsdWUob3V0LCB2YWx1ZU9iamVjdCwgdHJ1ZSk7Ci0JCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5DTEFTU19DQVNUX0VYQ0VQVElPTiwgdmFsdWVPYmplY3QpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlhbk9iamVjdCA9IG51bGw7CS8vIENsZWFyIG91dCBmb3IgR0MgdG8gd29yawotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQotCQkJCQkJCi0JCQkJCWNhc2UgQ29tbWFuZHMuUkVMRUFTRV9PQkpFQ1Q6Ci0JCQkJCQlpbnQgaWQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCQlzZXJ2ZXIucmVtb3ZlT2JqZWN0KHNlcnZlci5nZXRPYmplY3QoaWQpKTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCi0JCQkJCWNhc2UgQ29tbWFuZHMuTkVXX0lOSVRfU1RSSU5HOgotCQkJCQkJY2xhc3NJRCA9IGluLnJlYWRJbnQoKTsJLy8gSUQgT2YgY2xhc3MgdG8gZG8gbmV3IHVwb24uCi0JCQkJCQlTdHJpbmcgaW5pdFN0cmluZyA9IGluLnJlYWRVVEYoKTsJLy8gVGhlIGluaXQgc3RyaW5nLgotCQkJCQkJT2JqZWN0IG5ld1ZhbHVlID0gbnVsbDsKLQkJCQkJCUNsYXNzIHRoZUNsYXNzID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdGhlQ2xhc3MgPSAoQ2xhc3MpIHNlcnZlci5nZXRPYmplY3QoY2xhc3NJRCk7Ci0JCQkJCQkJaWYgKHRoZUNsYXNzID09IG51bGwpIHsKLQkJCQkJCQkJLy8gVGhlIGNsYXNzIHdhc24ndCBmb3VuZC4gU28gaW1wbHkgQ2xhc3NOb3RGb3VuZCBleGNlcHRpb24uCi0JCQkJCQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCUluaXRpYWxpemF0aW9uU3RyaW5nUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcGFyc2VyID0gSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuY3JlYXRlUGFyc2VyKGluaXRTdHJpbmcpOwotCQkJCQkJCQluZXdWYWx1ZSA9IHBhcnNlci5ldmFsdWF0ZSgpOwkJCQkJCQkJCi0JCQkJCQkJCWJvb2xlYW4gcHJpbWl0aXZlID0gcGFyc2VyLmlzUHJpbWl0aXZlKCk7Ci0JCQkJCQkJCS8vIElmIGV4cGVjdGVkIGNsYXNzIGlzIFZvaWQuVFlQRSwgdGhhdCBtZWFucyBkb24ndCB0ZXN0IHRoZSB0eXBlIG9mIHRoZSByZXN1bHQKLQkJCQkJCQkJLy8gdG8gdmVyaWZ5IGlmIGNvcnJlY3QgdHlwZSwganVzdCByZXR1cm4gd2hhdCBpdCByZWFsbHkgaXMuCi0JCQkJCQkJCWlmICh0aGVDbGFzcyAhPSBWb2lkLlRZUEUgJiYgcHJpbWl0aXZlICE9IHRoZUNsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCQkJQ29tbWFuZHMuc2VuZEVycm9yQ29tbWFuZChvdXQsIENvbW1hbmRzLkNMQVNTX0NBU1RfRVhDRVBUSU9OLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQljb250aW51ZTsJLy8gR290byBuZXh0IGNvbW1hbmQuCi0JCQkJCQkJCX0gCi0JCQkJCQkJCWlmIChwcmltaXRpdmUpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJLy8gTmVlZCB0byBkbyBzcGVjaWFsIHRlc3RzIGZvciBjb21wYXRpYmlsaXR5IGFuZCBhc3NpZ25tZW50LgotCQkJCQkJCQkJCXNlbmRPYmplY3QobmV3VmFsdWUsIGNsYXNzSUQgIT0gQ29tbWFuZHMuVk9JRF9UWVBFID8gY2xhc3NJRCA6IHNlcnZlci5nZXRJZGVudGl0eUlEKHBhcnNlci5nZXRFeHBlY3RlZFR5cGUoKSksIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUpOwkvLyBUaGlzIHdpbGwgbWFrZSBzdXJlIGl0IGdvZXMgb3V0IGFzIHRoZSBjb3JyZWN0IHByaW1pdGl2ZSB0eXBlCi0JCQkJCQkJCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIFRoZSByZXR1cm5lZCB0eXBlIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB3aGF0IGlzIGV4cGVjdGVkLgotCQkJCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCQkJCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5DTEFTU19DQVNUX0VYQ0VQVElPTiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCQkJCWNvbnRpbnVlOwkvLyBHb3RvIG5leHQgY29tbWFuZAotCQkJCQkJCQkJfQkJCQkJCQkJCQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJCQkvLyBUZXN0IHRvIHNlZSBpZiB0aGV5IGFyZSBjb21wYXRpYmxlLiAoTnVsbCBjYW4gYmUgYXNzaWduZWQgdG8gYW55IG9iamVjdCwKLQkJCQkJCQkJCQkvLyBzbyB0aGF0IGlzIHdoeSBpdCB3YXMgdGVzdGVkIG91dCBhYm92ZSkuCi0JCQkJCQkJCQkJLy8gSWYgZXhwZWN0ZWQgY2xhc3MgaXMgVm9pZC5UWVBFLCB0aGF0IG1lYW5zIGRvbid0IHRlc3QgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdAotCQkJCQkJCQkJCS8vIHRvIHZlcmlmeSBpZiBjb3JyZWN0IHR5cGUsIGp1c3QgcmV0dXJuIHdoYXQgaXQgcmVhbGx5IGlzLgotCQkJCQkJCQkJCWlmICh0aGVDbGFzcyAhPSBWb2lkLlRZUEUgJiYgIXRoZUNsYXNzLmlzSW5zdGFuY2UobmV3VmFsdWUpKSB7Ci0JCQkJCQkJCQkJCS8vIFRoZSByZXR1cm5lZCB0eXBlIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB3aGF0IGlzIGV4cGVjdGVkLgotCQkJCQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQkJCQkJQ29tbWFuZHMuc2VuZEVycm9yQ29tbWFuZChvdXQsIENvbW1hbmRzLkNMQVNTX0NBU1RfRVhDRVBUSU9OLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQkJCWNvbnRpbnVlOwkvLyBHb3RvIG5leHQgY29tbWFuZAotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNlbmRPYmplY3QobmV3VmFsdWUsIE5PVF9BX1BSSU1JVElWRSwgdmFsdWVPYmplY3QsIG91dCwgdHJ1ZSk7CS8vIFNlbmQgb3V0IGFzIGFuIG9iamVjdC4KLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgRXZhbHVhdGlvbkV4Y2VwdGlvbikgewotCQkJCQkJCQkJLy8gV2FudCB0byByZXR1cm4gdGhlIHJlYWwgZXhjZXB0aW9uLgotCQkJCQkJCQkJc2VuZEV4Y2VwdGlvbihlLmdldE9yaWdpbmFsRXhjZXB0aW9uKCksIHZhbHVlT2JqZWN0LCBvdXQpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gQ291bGRuJ3QgYmUgZXZhbHVhdGVkLCByZXR1cm4gYW4gZXJyb3IgZm9yIHRoaXMuCi0JCQkJCQkJCQlzZXRFeGNlcHRpb25JbnRvVmFsdWUoZS5nZXRPcmlnaW5hbEV4Y2VwdGlvbigpLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuQ0FOTk9UX0VWQUxVQVRFX1NUUklORywgdmFsdWVPYmplY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJcGFyc2VyID0gbnVsbDsJLy8gQ2xlYXIgb3V0IGZvciBHQyB0byB3b3JrCi0JCQkJCQkJfQkJCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJCQlzZW5kRXhjZXB0aW9uKGUsIHZhbHVlT2JqZWN0LCBvdXQpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkvLyBDbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsKLQkJCQkJCQlpbml0U3RyaW5nID0gbnVsbDsKLQkJCQkJCQl0aGVDbGFzcyA9IG51bGw7Ci0JCQkJCQkJbmV3VmFsdWUgPSBudWxsOwotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwkJCQkJCQkKLQkJCQkJCX0JCi0JCQkJCQlicmVhazsJCQkJCQkKLQkJCQkJCQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLklOVk9LRToKLQkJCQkJCU9iamVjdCB0YXJnZXQgPSBudWxsOwotCQkJCQkJT2JqZWN0W10gcGFybXMgPSBudWxsOwkJCQkJCQotCQkJCQkJQ2xhc3MgcmV0dXJuVHlwZSA9IG51bGw7Ci0JCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgYU1ldGhvZCA9IG51bGw7CQkJCQkJCi0JCQkJCQl0cnkgewkJCQkJCi0JCQkJCQkJaW50IG1ldGhvZElEID0gaW4ucmVhZEludCgpOwkvLyBJRCBvZiBtZXRob2QgdG8gaW52b2tlCi0JCQkJCQkJYU1ldGhvZCA9IChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIHNlcnZlci5nZXRPYmplY3QobWV0aG9kSUQpOwkvLyBNZXRob2QgdG8gaW52b2tlCi0JCQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJdGFyZ2V0ID0gZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlT2JqZWN0KTsJCi0JCQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJaWYgKHZhbHVlT2JqZWN0LnR5cGUgPT0gQ29tbWFuZHMuQVJSQVlfSURTKSB7Ci0JCQkJCQkJCS8vIEl0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgSURzLCBhcyBpdCBub3JtYWxseSB3b3VsZCBiZS4KLQkJCQkJCQkJdmFsdWVTZW5kZXIuaW5pdGlhbGl6ZSh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCUNvbW1hbmRzLnJlYWRBcnJheShpbiwgdmFsdWVPYmplY3QuYW5JbnQsIHZhbHVlU2VuZGVyLCB2YWx1ZU9iamVjdCwgZmFsc2UpOwotCQkJCQkJCQlwYXJtcyA9IChPYmplY3RbXSkgdmFsdWVTZW5kZXIuZ2V0QXJyYXkoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJdCBpcyBhbGwgb2JqZWN0cyBvciBudWxsLCBzbyBpdCBzaG91bGQgYmUgYW4gT2JqZWN0W10gb3IgbnVsbC4gSWYgbm90LCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IuCi0JCQkJCQkJCXBhcm1zID0gKE9iamVjdFtdKSB2YWx1ZU9iamVjdC5hbk9iamVjdDsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKCFhTWV0aG9kLmlzQWNjZXNzaWJsZSgpKQotCQkJCQkJCQlhTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CS8vIFdlIHdpbGwgYWxsb3cgYWxsIHRvIG9jY3VyLiBMZXQgYWNjZXNzIGNvbnRyb2wgYmUgaGFuZGxlZCBieSBJREUgYW5kIGNvbXBpbGVyLgotCQkJCQkJCW5ld1ZhbHVlID0gYU1ldGhvZC5pbnZva2UodGFyZ2V0LCBwYXJtcyk7Ci0JCQkJCQkJcmV0dXJuVHlwZSA9IGFNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCQkJCWlmIChyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQkJaW50IHJldHVyblR5cGVJRCA9IHNlcnZlci5nZXRJZGVudGl0eUlEKHJldHVyblR5cGUpOwotCQkJCQkJCQkvLyBOZWVkIHRvIHRlbGwgc2VuZE9iamVjdCB0aGUgY29ycmVjdCBwcmltaXRpdmUgdHlwZS4KLQkJCQkJCQkJc2VuZE9iamVjdChuZXdWYWx1ZSwgcmV0dXJuVHlwZUlELCB2YWx1ZU9iamVjdCwgb3V0LCB0cnVlKTsKLQkJCQkKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZW5kT2JqZWN0KG5ld1ZhbHVlLCBOT1RfQV9QUklNSVRJVkUsIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUpOwkvLyBKdXN0IHNlbmQgdGhlIG9iamVjdCBiYWNrLiBzZW5kT2JqZWN0IGtub3dzIGhvdyB0byBpdGVycHJldCB0aGUgdHlwZQotCQkJCQkJCX0JCQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7CS8vIFRocm93IGl0IGFnYWluLiBUaGVzZSB3ZSBkb24ndCB3YW50IHRvIGNvbWUgdXAgYXMgYW4gZXhjZXB0aW9uIHByb3h5LiBUaGVzZSBzaG91bGQgZW5kIHRoZSB0aHJlYWQuCi0JCQkJCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUaGlzIGlzIGEgd3JhcHBlcmVkIGV4Y2VwdGlvbi4gUmV0dXJuIHRoZSB3cmFwcGVyZWQgb25lIHNvIGl0IGxvb2tzIGxpa2UKLQkJCQkJCQkvLyBpdCB3YXMgdGhlIHJlYWwgb25lLiAoU29tZXRpbWVzIHRoZSBtZXRob2QgYmVpbmcgaW52b2tlZCBpcyBvbiBhIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlLAotCQkJCQkJCS8vIHdoaWNoIGluIHR1cm4gaXMgYW4gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgc28gd2Ugd2lsbCBnbyB1bnRpbCB3ZSBkb24ndCBoYXZlIGFuIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24uCi0JCQkJCQkJVGhyb3dhYmxlIHQgPSBlOwotCQkJCQkJCWRvIHsKLQkJCQkJCQkJdCA9ICgoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgdCkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJCQkJfSB3aGlsZSAodCBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pOwotCQkJCQkJCXNlbmRFeGNlcHRpb24odCwgdmFsdWVPYmplY3QsIG91dCk7Ci0JCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCXNlbmRFeGNlcHRpb24oZSwgdmFsdWVPYmplY3QsIG91dCk7CS8vIFR1cm4gaXQgaW50byBhIGV4Y2VwdGlvbiBwcm94eSBvbiB0aGUgY2xpZW50LgotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkvLyBDbGVhciBvdXQgZm9yIEdDIHRvIHdvcmsKLQkJCQkJCQl2YWx1ZU9iamVjdC5zZXQoKTsKLQkJCQkJCQlwYXJtcyA9IG51bGw7Ci0JCQkJCQkJdGFyZ2V0ID0gbnVsbDsKLQkJCQkJCQlhTWV0aG9kID0gbnVsbDsKLQkJCQkJCQlyZXR1cm5UeXBlID0gbnVsbDsKLQkJCQkJCQluZXdWYWx1ZSA9IG51bGw7Ci0JCQkJCQkJdmFsdWVTZW5kZXIuY2xlYXIoKTsKLQkJCQkJCX0JCQkJCQotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5JTlZPS0VfV0lUSF9NRVRIT0RfUEFTU0VEOgotCQkJCQkJYUNsYXNzID0gbnVsbDsKLQkJCQkJCVN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsKLQkJCQkJCUNsYXNzW10gcGFybVR5cGVzID0gbnVsbDsKLQkJCQkJCXRhcmdldCA9IG51bGw7Ci0JCQkJCQlwYXJtcyA9IG51bGw7CQkJCQkJCi0JCQkJCQlyZXR1cm5UeXBlID0gbnVsbDsKLQkJCQkJCWFNZXRob2QgPSBudWxsOwkJCQkJCQotCQkJCQkJCi0JCQkJCQl0cnkgewotCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCWFDbGFzcyA9IChDbGFzcykgZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlT2JqZWN0KTsgLy8gVGhlIGNsYXNzIHRoYXQgaGFzIHRoZSBtZXRob2QuCi0JCQkJCQkJbWV0aG9kTmFtZSA9IGluLnJlYWRVVEYoKTsKLQkJCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQkJCQlpZiAodmFsdWVPYmplY3QudHlwZSA9PSBDb21tYW5kcy5BUlJBWV9JRFMpIHsKLQkJCQkJCQkJLy8gSXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBJRHMsIGFzIGl0IG5vcm1hbGx5IHdvdWxkIGJlLgotCQkJCQkJCQl2YWx1ZVNlbmRlci5pbml0aWFsaXplKHZhbHVlT2JqZWN0KTsKLQkJCQkJCQkJQ29tbWFuZHMucmVhZEFycmF5KGluLCB2YWx1ZU9iamVjdC5hbkludCwgdmFsdWVTZW5kZXIsIHZhbHVlT2JqZWN0LCBmYWxzZSk7Ci0JCQkJCQkJCXBhcm1UeXBlcyA9IChDbGFzc1tdKSB2YWx1ZVNlbmRlci5nZXRBcnJheSgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIEl0IG51bGwsIHNvIGl0IHNob3VsZCBiZSBhbiBudWxsLiBJZiBub3QsIHRoZW4gdGhpcyBpcyBhbiBlcnJvci4KLQkJCQkJCQkJcGFybVR5cGVzID0gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQkJYU1ldGhvZCA9IGFDbGFzcy5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFybVR5cGVzKTsKLQotCQkJCQkJCS8vIE5vdyB3ZSBnZXQgdGhlIGluZm8gZm9yIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QgYW5kIGV4ZWN1dGUgaXQuCi0JCQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJdGFyZ2V0ID0gZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlT2JqZWN0KTsJCi0JCQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJaWYgKHZhbHVlT2JqZWN0LnR5cGUgPT0gQ29tbWFuZHMuQVJSQVlfSURTKSB7Ci0JCQkJCQkJCS8vIEl0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgSURzLCBhcyBpdCBub3JtYWxseSB3b3VsZCBiZS4KLQkJCQkJCQkJdmFsdWVTZW5kZXIuaW5pdGlhbGl6ZSh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCUNvbW1hbmRzLnJlYWRBcnJheShpbiwgdmFsdWVPYmplY3QuYW5JbnQsIHZhbHVlU2VuZGVyLCB2YWx1ZU9iamVjdCwgZmFsc2UpOwotCQkJCQkJCQlwYXJtcyA9IChPYmplY3RbXSkgdmFsdWVTZW5kZXIuZ2V0QXJyYXkoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJdCBpcyBhbGwgb2JqZWN0cyBvciBudWxsLCBzbyBpdCBzaG91bGQgYmUgYW4gT2JqZWN0W10gb3IgbnVsbC4gSWYgbm90LCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IuCi0JCQkJCQkJCXBhcm1zID0gKE9iamVjdFtdKSB2YWx1ZU9iamVjdC5hbk9iamVjdDsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKCFhTWV0aG9kLmlzQWNjZXNzaWJsZSgpKQotCQkJCQkJCQlhTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CS8vIFdlIHdpbGwgYWxsb3cgYWxsIHRvIG9jY3VyLiBMZXQgYWNjZXNzIGNvbnRyb2wgYmUgaGFuZGxlZCBieSBJREUgYW5kIGNvbXBpbGVyLgotCQkJCQkJCW5ld1ZhbHVlID0gYU1ldGhvZC5pbnZva2UodGFyZ2V0LCBwYXJtcyk7Ci0JCQkJCQkJcmV0dXJuVHlwZSA9IGFNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCQkJCWlmIChyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJCQkJaW50IHJldHVyblR5cGVJRCA9IHNlcnZlci5nZXRJZGVudGl0eUlEKHJldHVyblR5cGUpOwotCQkJCQkJCQkvLyBOZWVkIHRvIHRlbGwgc2VuZE9iamVjdCB0aGUgY29ycmVjdCBwcmltaXRpdmUgdHlwZS4KLQkJCQkJCQkJc2VuZE9iamVjdChuZXdWYWx1ZSwgcmV0dXJuVHlwZUlELCB2YWx1ZU9iamVjdCwgb3V0LCB0cnVlKTsKLQkJCQkKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZW5kT2JqZWN0KG5ld1ZhbHVlLCBOT1RfQV9QUklNSVRJVkUsIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUpOwkvLyBKdXN0IHNlbmQgdGhlIG9iamVjdCBiYWNrLiBzZW5kT2JqZWN0IGtub3dzIGhvdyB0byBpdGVycHJldCB0aGUgdHlwZQotCQkJCQkJCX0JCQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7CS8vIFRocm93IGl0IGFnYWluLiBUaGVzZSB3ZSBkb24ndCB3YW50IHRvIGNvbWUgdXAgYXMgYW4gZXhjZXB0aW9uIHByb3h5LiBUaGVzZSBzaG91bGQgZW5kIHRoZSB0aHJlYWQuCi0JCQkJCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUaGlzIGlzIGEgd3JhcHBlcmVkIGV4Y2VwdGlvbi4gUmV0dXJuIHRoZSB3cmFwcGVyZWQgb25lIHNvIGl0IGxvb2tzIGxpa2UKLQkJCQkJCQkvLyBpdCB3YXMgdGhlIHJlYWwgb25lLiAoU29tZXRpbWVzIHRoZSBtZXRob2QgYmVpbmcgaW52b2tlZCBpcyBvbiBhIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlLAotCQkJCQkJCS8vIHdoaWNoIGluIHR1cm4gaXMgYW4gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgc28gd2Ugd2lsbCBnbyB1bnRpbCB3ZSBkb24ndCBoYXZlIGFuIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24uCi0JCQkJCQkJVGhyb3dhYmxlIHQgPSBlOwotCQkJCQkJCWRvIHsKLQkJCQkJCQkJdCA9ICgoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgdCkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJCQkJfSB3aGlsZSAodCBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pOwotCQkJCQkJCXNlbmRFeGNlcHRpb24odCwgdmFsdWVPYmplY3QsIG91dCk7Ci0KLQkJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQkJCXNlbmRFeGNlcHRpb24oZSwgdmFsdWVPYmplY3QsIG91dCk7CS8vIFR1cm4gaXQgaW50byBhIGV4Y2VwdGlvbiBwcm94eSBvbiB0aGUgY2xpZW50LgotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlhQ2xhc3MgPSBudWxsOwotCQkJCQkJCW1ldGhvZE5hbWUgPSBudWxsOwotCQkJCQkJCXBhcm1UeXBlcyA9IG51bGw7Ci0JCQkJCQkJLy8gQ2xlYXIgb3V0IGZvciBHQyB0byB3b3JrCi0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJcGFybXMgPSBudWxsOwotCQkJCQkJCXRhcmdldCA9IG51bGw7Ci0JCQkJCQkJYU1ldGhvZCA9IG51bGw7Ci0JCQkJCQkJcmV0dXJuVHlwZSA9IG51bGw7Ci0JCQkJCQkJbmV3VmFsdWUgPSBudWxsOwotCQkJCQkJCXZhbHVlU2VuZGVyLmNsZWFyKCk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCQkKLQkJCQkJY2FzZSBDb21tYW5kcy5HRVRfQVJSQVlfQ09OVEVOVFM6Ci0JCQkJCQl0cnkgewotCQkJCQkJCXRhcmdldCA9IHNlcnZlci5nZXRPYmplY3QoaW4ucmVhZEludCgpKTsJLy8gQXJyYXkgdG8gZ2V0IHRoZSBpZHMgZm9yLgotCQkJCQkJCXZhbHVlT2JqZWN0LnNldEFycmF5SURTKG5ldyBBcnJheUNvbnRlbnRzUmV0cmlldmVyKHRhcmdldCksIEFycmF5LmdldExlbmd0aCh0YXJnZXQpLCBDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpOwotCQkJCQkJCUNvbW1hbmRzLndyaXRlVmFsdWUob3V0LCB2YWx1ZU9iamVjdCwgdHJ1ZSk7CS8vIFdyaXRlIGl0IGJhY2sgYXMgYSB2YWx1ZSBjb21tYW5kLgotCQkJCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgZTsJLy8gVGhyb3cgaXQgYWdhaW4uIFRoZXNlIHdlIGRvbid0IHdhbnQgdG8gY29tZSB1cCBhcyBhbiBleGNlcHRpb24gcHJveHkuIFRoZXNlIHNob3VsZCBlbmQgdGhlIHRocmVhZC4KLQkJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQkJc2VuZEV4Y2VwdGlvbihlLCB2YWx1ZU9iamVjdCwgb3V0KTsJLy8gVHVybiBpdCBpbnRvIGEgZXhjZXB0aW9uIHByb3h5IG9uIHRoZSBjbGllbnQuCi0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCXRhcmdldCA9IG51bGw7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLkNBTExCQUNLX0RPTkU6Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChjb25uZWN0aW9uVGhyZWFkICE9IG51bGwpIHsKLQkJCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJCUNvbW1hbmRzLnNlbmRFcnJvckNvbW1hbmQob3V0LCBDb21tYW5kcy5VTktOT1dOX0NPTU1BTkRfU0VOVCwgdmFsdWVPYmplY3QpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlDb21tYW5kcy5yZWFkQmFja1ZhbHVlKGluLCB2YWx1ZU9iamVjdCwgQ29tbWFuZHMuTk9fVFlQRV9DSEVDSyk7Ci0JCQkJCQkJCQlpZiAodmFsdWVPYmplY3QudHlwZSA9PSBDb21tYW5kcy5BUlJBWV9JRFMpIHsKLQkJCQkJCQkJCQkvLyBJdCBpcyBhbiBhcnJheSBjb250YWluaW5nIElEcywgYXMgaXQgbm9ybWFsbHkgd291bGQgYmUuCi0JCQkJCQkJCQkJdmFsdWVTZW5kZXIuaW5pdGlhbGl6ZSh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJCQkJQ29tbWFuZHMucmVhZEFycmF5KGluLCB2YWx1ZU9iamVjdC5hbkludCwgdmFsdWVTZW5kZXIsIHZhbHVlT2JqZWN0LCBmYWxzZSk7Ci0JCQkJCQkJCQkJcmVzdWx0ID0gKE9iamVjdFtdKSB2YWx1ZVNlbmRlci5nZXRBcnJheSgpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlyZXN1bHQgPSBnZXRJbnZva2FibGVPYmplY3QodmFsdWVPYmplY3QpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZG9Mb29wID0gZmFsc2U7IC8vIFdlIG5lZWQgdG8gdGVybWluYXRlIGFuZCByZXR1cm4gcmVzdWx0Ci0JCQkJCQkJCQljbG9zZVdoZW5Eb25lID0gZmFsc2U7IC8vIERvbid0IGNsb3NlLCB3ZSB3aWxsIGNvbnRpbnVlLgotCQkJCQkJCQl9IGNhdGNoIChDb21tYW5kRXJyb3JFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJLy8gVGhlcmUgd2FzIGFuIGNvbW1hbmQgZXJyb3Igb24gdGhlIG90aGVyIHNpZGUuIFRoaXMgbWVhbnMgCi0JCQkJCQkJCQkvLyBjb25uZWN0aW9uIHN0aWxsIGdvb2QsIGJ1dCBkb24ndCBjb250aW51ZSB0aGUgY2FsbGJhY2sgcHJvY2Vzc2luZy4KLQkJCQkJCQkJCWRvTG9vcCA9IGZhbHNlOyAvLyBXZSBuZWVkIHRvIHRlcm1pbmF0ZSBhbmQgcmV0dXJuIHJlc3VsdAotCQkJCQkJCQkJY2xvc2VXaGVuRG9uZSA9IGZhbHNlOyAvLyBEb24ndCBjbG9zZSwgd2Ugd2lsbCBjb250aW51ZS4KLQkJCQkJCQkJCXRocm93IGU7CS8vIExldCBpdCBnbyBvbiBvdXQuCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJCXZhbHVlU2VuZGVyLmNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLkVSUk9SOgotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBHb3QgYW4gZXJyb3IgY29tbWFuZC4gRG9uJ3Qga25vdyB3aGF0IHRvIGRvIGJ1dCByZWFkIHRoZQotCQkJCQkJCS8vIHZhbHVlIGFuZCBzaW1wbHkgcHJpbnQgaXQgb3V0LgotCQkJCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQkJCXJlc3VsdCA9IGdldEludm9rYWJsZU9iamVjdCh2YWx1ZU9iamVjdCk7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBzZW50IHRvIHNlcnZlcjogUmVzdWx0PSIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCXZhbHVlT2JqZWN0LnNldCgpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCQljYXNlIENvbW1hbmRzLkVYUFJFU1NJT05fVFJFRV9DT01NQU5EOgotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwcm9jZXNzRXhwcmVzc2lvbkNvbW1hbmQodmFsdWVPYmplY3QsIHZhbHVlU2VuZGVyKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JCQkJCQkJdmFsdWVTZW5kZXIuY2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQkJCi0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQkvLyBVbmtub3duIGNvbW1hbmQuIFdlIGRvbid0IGtub3cgaG93IGxvbmcgaXQgaXMsIHNvIHdlIG5lZWQgdG8gc2h1dCB0aGUgY29ubmVjdGlvbiBkb3duLgotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogSW52YWxpZCBjbWQgc2VuZCB0byBzZXJ2ZXI6IENtZD0iICsgY21kKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9Mb29wID0gZmFsc2U7Ci0JCQkJCQljbG9zZVdoZW5Eb25lID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgaXMgb2suIEl0IG1lYW5zIHRoYXQgdGhlIGNvbm5lY3Rpb24gb24gdGhlIG90aGVyIHNpZGUgd2FzIHRlcm1pbmF0ZWQuCi0JCQkvLyBTbyBqdXN0IGFjY2VwdCB0aGlzIGFuZCBnbyBkb3duLgotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoc29ja2V0ICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb25Db21tYW5kRXhjZXB0aW9uKGZhbHNlLCBlKTsJLy8gc29ja2V0IG51bGwgbWVhbnMgYSB2YWxpZCBjbG9zZSByZXF1ZXN0Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNsb3NlV2hlbkRvbmUpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGV4cHJlc3Npb25Qcm9jZXNzb3JzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciBleHAgPSAoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIpIGl0ci5uZXh0KCk7Ci0JCQkJCQlleHAuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWV4cHJlc3Npb25Qcm9jZXNzb3JzLmNsZWFyKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlpbi5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJaW4gPSBudWxsOwotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCW91dC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJb3V0ID0gbnVsbDsKLQkJCQljbG9zZSgpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoY2xvc2VXaGVuRG9uZSAmJiBjb25uZWN0aW9uVGhyZWFkICE9IG51bGwpCi0JCQlzZXJ2ZXIucmVtb3ZlQ29ubmVjdGlvblRocmVhZChjb25uZWN0aW9uVGhyZWFkKTsKLQkJaWYgKHNodXRkb3duKQotCQkJc2VydmVyLnJlcXVlc3RTaHV0ZG93bigpOwotCQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8vIEEgcmV0cmlldmVyIGlzIHdoYXQgaGFuZGxlcyB0aGUgYXJyYXkgZ2V0IGNvbnRlbnRzLgotCXByaXZhdGUgY2xhc3MgQXJyYXlDb250ZW50c1JldHJpZXZlciBpbXBsZW1lbnRzIENvbW1hbmRzLlZhbHVlUmV0cmlldmUgewotCQlpbnQgaW5kZXg9MDsKLQkJT2JqZWN0IGFycmF5OwotCQlpbnQgbGVuZ3RoOwotCQlpbnQgY29tcG9uZW50VHlwZTsKLQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQotCQkKLQkJcHVibGljIEFycmF5Q29udGVudHNSZXRyaWV2ZXIoT2JqZWN0IGFuQXJyYXkpIHsKLQkJCWFycmF5ID0gYW5BcnJheTsKLQkJCWxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhbkFycmF5KTsKLQkJCWlmIChhbkFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQljb21wb25lbnRUeXBlID0gc2VydmVyLmdldElkZW50aXR5SUQoYW5BcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSk7Ci0JCQl9IGVsc2UKLQkJCQljb21wb25lbnRUeXBlID0gTk9UX0FfUFJJTUlUSVZFOwotCQl9Ci0JCQotCQlwdWJsaWMgQ29tbWFuZHMuVmFsdWVPYmplY3QgbmV4dFZhbHVlKCkgewotCQkJZmlsbEluVmFsdWUoQXJyYXkuZ2V0KGFycmF5LCBpbmRleCsrKSwgY29tcG9uZW50VHlwZSwgd29ya2VyKTsKLQkJCXJldHVybiB3b3JrZXI7Ci0JCX0KLQl9OwotCi0JCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHByZXNzaW9uQ29tbWFuZChDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZU9iamVjdCwgSW52b2thYmxlVmFsdWVTZW5kZXIgdmFsdWVTZW5kZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCUludGVnZXIgZXhwcmVzc2lvbklEID0gbmV3IEludGVnZXIoaW4ucmVhZEludCgpKTsKLQkJYnl0ZSBjbWRUeXBlID0gaW4ucmVhZEJ5dGUoKTsKLQkJRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIgZXhwID0gbnVsbDsKLQkJc3dpdGNoIChjbWRUeXBlKSB7Ci0JCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5TVEFSVF9FWFBSRVNTSU9OX1RSRUVfUFJPQ0VTU0lORzoKLQkJCQlieXRlIHRyYWNlID0gaW4ucmVhZEJ5dGUoKTsKLQkJCQlpZiAodHJhY2UgPT0gRXhwcmVzc2lvbkNvbW1hbmRzLlRSQUNFX0RFRkFVTFQpCi0JCQkJCWV4cCA9IG5ldyBFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcihzZXJ2ZXIsIHRoaXMpOwotCQkJCWVsc2UKLQkJCQkJZXhwID0gbmV3IEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKHNlcnZlciwgdGhpcywgdHJhY2UgPT0gRXhwcmVzc2lvbkNvbW1hbmRzLlRSQUNFX09OKTsKLQkJCQlleHByZXNzaW9uUHJvY2Vzc29ycy5wdXQoZXhwcmVzc2lvbklELCBleHApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFeHByZXNzaW9uQ29tbWFuZHMuVFJBTlNGRVJfRVhQUkVTU0lPTl9SRVFVRVNUOgotCQkJCWV4cCA9IChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlcikgZXhwcmVzc2lvblByb2Nlc3NvcnMucmVtb3ZlKGV4cHJlc3Npb25JRCk7IAotCQkJCXNlbmRPYmplY3QoZXhwLCBOT1RfQV9QUklNSVRJVkUsIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFeHByZXNzaW9uQ29tbWFuZHMuUkVTVU1FX0VYUFJFU1NJT05fUkVRVUVTVDoKLQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHZhbHVlT2JqZWN0KTsKLQkJCQlleHAgPSAoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIpIGdldEludm9rYWJsZU9iamVjdCh2YWx1ZU9iamVjdCk7IAotCQkJCWV4cHJlc3Npb25Qcm9jZXNzb3JzLnB1dChleHByZXNzaW9uSUQsIGV4cCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5QVVNIX0VYUFJFU1NJT046Ci0JCQkJZXhwID0gKEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKSBleHByZXNzaW9uUHJvY2Vzc29ycy5nZXQoZXhwcmVzc2lvbklEKTsKLQkJCQlleHAucHJvY2Vzcyhpbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEV4cHJlc3Npb25Db21tYW5kcy5TWU5DX1JFUVVFU1Q6Ci0JCQkJYm9vbGVhbiBoYXZlUHJveGllcyA9IGluLnJlYWRCb29sZWFuKCk7CS8vIFNlZSBpZiB3ZSBleHByZXNzaW9uIHByb3h5IGlkcyB0aGF0IG5lZWQgdG8gYmUgcmVzb2x2ZWQgCi0JCQkJaWYgKGhhdmVQcm94aWVzKSB7Ci0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgdmFsdWVPYmplY3QpOwotCQkJCQl2YWx1ZVNlbmRlci5pbml0aWFsaXplKHZhbHVlT2JqZWN0KTsKLQkJCQkJQ29tbWFuZHMucmVhZEFycmF5KGluLCB2YWx1ZU9iamVjdC5hbkludCwgdmFsdWVTZW5kZXIsIHZhbHVlT2JqZWN0LCBmYWxzZSk7Ci0JCQkJfQotCi0JCQkJZXhwID0gKEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKSBleHByZXNzaW9uUHJvY2Vzc29ycy5nZXQoZXhwcmVzc2lvbklEKTsKLQkJCQlpZiAoaGF2ZVByb3hpZXMpCi0JCQkJCXNlbmRFeHByZXNzaW9uUHJveHlSZXNvbHV0aW9ucyh2YWx1ZU9iamVjdCwgKGludFtdKSB2YWx1ZVNlbmRlci5nZXRBcnJheSgpLCBleHApOwotCQkJCWlmIChleHAubm9FcnJvcnMoKSkgewotCQkJCQl2YWx1ZU9iamVjdC5zZXQodHJ1ZSk7IC8vIE1hcmsgdGhhdCBhbGwgaXMgZ29vZC4KLQkJCQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHZhbHVlT2JqZWN0LCB0cnVlLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9jZXNzRXhwcmVzc2lvbkVycm9yKGV4cCwgdmFsdWVPYmplY3QpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLlBVTExfVkFMVUVfUkVRVUVTVDoKLQkJCQloYXZlUHJveGllcyA9IGluLnJlYWRCb29sZWFuKCk7CS8vIFNlZSBpZiB3ZSBleHByZXNzaW9uIHByb3h5IGlkcyB0aGF0IG5lZWQgdG8gYmUgcmVzb2x2ZWQKLQkJCQlpZiAoaGF2ZVByb3hpZXMpIHsKLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB2YWx1ZU9iamVjdCk7Ci0JCQkJCXZhbHVlU2VuZGVyLmluaXRpYWxpemUodmFsdWVPYmplY3QpOwotCQkJCQlDb21tYW5kcy5yZWFkQXJyYXkoaW4sIHZhbHVlT2JqZWN0LmFuSW50LCB2YWx1ZVNlbmRlciwgdmFsdWVPYmplY3QsIGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlleHAgPSAoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIpIGV4cHJlc3Npb25Qcm9jZXNzb3JzLmdldChleHByZXNzaW9uSUQpOwotCQkJCWlmIChoYXZlUHJveGllcykKLQkJCQkJc2VuZEV4cHJlc3Npb25Qcm94eVJlc29sdXRpb25zKHZhbHVlT2JqZWN0LCAoaW50W10pIHZhbHVlU2VuZGVyLmdldEFycmF5KCksIGV4cCk7Ci0JCQkJaWYgKGV4cC5ub0Vycm9ycygpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3RbXSBwdWxsZWRWYWx1ZSA9IGV4cC5wdWxsVmFsdWUoKTsKLQkJCQkJCS8vIFNlbmQgYmFjayB0aGUgY29tbWFuZCBjb2RlIGZvciBwdWxsIHZhbHVlLiBEb24ndCBmbHVzaC4gV2Ugd2lsbCBmbHVzaCB3aGVuIGFsbCBkb25lLgotCQkJCQkJaWYgKCgoQ2xhc3MpIHB1bGxlZFZhbHVlWzFdKS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCQkJaW50IHJldHVyblR5cGVJRCA9IHNlcnZlci5nZXRJZGVudGl0eUlEKHB1bGxlZFZhbHVlWzFdKTsKLQkJCQkJCQkvLyBOZWVkIHRvIHRlbGwgc2VuZE9iamVjdCB0aGUgY29ycmVjdCBwcmltaXRpdmUgdHlwZS4KLQkJCQkJCQlzZW5kT2JqZWN0KHB1bGxlZFZhbHVlWzBdLCByZXR1cm5UeXBlSUQsIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUsIHRydWUpOwotCQkJCQkJCQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzZW5kT2JqZWN0KHB1bGxlZFZhbHVlWzBdLCBOT1RfQV9QUklNSVRJVkUsIHZhbHVlT2JqZWN0LCBvdXQsIHRydWUsIHRydWUpOwkvLyBKdXN0IHNlbmQgdGhlIG9iamVjdCBiYWNrLiBzZW5kT2JqZWN0IGtub3dzIGhvdyB0byBpdGVycHJldCB0aGUgdHlwZQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlzZW5kTm9WYWx1ZUVycm9yQ29tbWFuZChleHAsIHZhbHVlT2JqZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSAKLQkJCQkJcHJvY2Vzc0V4cHJlc3Npb25FcnJvcihleHAsIHZhbHVlT2JqZWN0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRXhwcmVzc2lvbkNvbW1hbmRzLkVORF9FWFBSRVNTSU9OX1RSRUVfUFJPQ0VTU0lORzoKLQkJCQlleHAgPSAoRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIpIGV4cHJlc3Npb25Qcm9jZXNzb3JzLnJlbW92ZShleHByZXNzaW9uSUQpOwotCQkJCWV4cC5jbG9zZSgpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gaXMKLQkgKiBAcGFyYW0gZXhwCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbmRFeHByZXNzaW9uUHJveHlSZXNvbHV0aW9ucyhDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZU9iamVjdCwgZmluYWwgaW50W10gcHJveHlJRHMsIGZpbmFsIEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIGV4cCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQljbGFzcyBFeHByZXNzaW9uUHJveHlSZXRyaWV2ZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVJldHJpZXZlIHsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlPYmplY3RbXSBwcm94eVJlc29sdXRpb24gPSBuZXcgT2JqZWN0WzJdOwotCQkJQ29tbWFuZHMuVmFsdWVPYmplY3Qgd29ya2VyID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0KLQkJCXB1YmxpYyBDb21tYW5kcy5WYWx1ZU9iamVjdCBuZXh0VmFsdWUoKSB7Ci0JCQkJaW50IHByb3h5SUQgPSBwcm94eUlEc1tpbmRleCsrXTsKLQkJCQlpZiAoZXhwLnB1bGxFeHByZXNzaW9uUHJveHlWYWx1ZShwcm94eUlELCBwcm94eVJlc29sdXRpb24pKSB7Ci0JCQkJCWlmIChwcm94eVJlc29sdXRpb25bMV0gIT0gVm9pZC5UWVBFKSB7Ci0JCQkJCQlpZiAoKChDbGFzcykgcHJveHlSZXNvbHV0aW9uWzFdKS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCQkJaW50IHJldHVyblR5cGVJRCA9IHNlcnZlci5nZXRJZGVudGl0eUlEKHByb3h5UmVzb2x1dGlvblsxXSk7Ci0JCQkJCQkJLy8gTmVlZCB0byB0ZWxsIHdvcmtlciB0aGUgY29ycmVjdCBwcmltaXRpdmUgdHlwZS4KLQkJCQkJCQlmaWxsSW5WYWx1ZShwcm94eVJlc29sdXRpb25bMF0sIHJldHVyblR5cGVJRCwgd29ya2VyKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmlsbEluVmFsdWUocHJveHlSZXNvbHV0aW9uWzBdLCBOT1RfQV9QUklNSVRJVkUsIHdvcmtlcik7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZQotCQkJCQkJd29ya2VyLnNldEZsYWcoRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05QUk9YWV9WT0lEVFlQRSk7CS8vIEl0IHdhcyByZXNvbHZlZCwgYnV0IHRvIG5vdCBzZXQgZHVlIHRvIHZvaWQgdHlwZSBvZiBleHByZXNzaW9uLgotCQkJCX0gZWxzZQotCQkJCQl3b3JrZXIuc2V0RmxhZyhFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlBST1hZX05PVFJFU09MVkVEKTsJLy8gSXQgd2Fzbid0IHJlc29sdmVkLgotCQkJCQotCQkJCXJldHVybiB3b3JrZXI7Ci0JCQl9Ci0JCX07Ci0KLQkJdmFsdWVPYmplY3Quc2V0QXJyYXlJRFMobmV3IEV4cHJlc3Npb25Qcm94eVJldHJpZXZlcigpLCBwcm94eUlEcy5sZW5ndGgsIENvbW1hbmRzLk9CSkVDVF9DTEFTUyk7Ci0JCUNvbW1hbmRzLndyaXRlVmFsdWUob3V0LCB2YWx1ZU9iamVjdCwgdHJ1ZSwgZmFsc2UpOwkvLyBXcml0ZSBpdCBiYWNrIGFzIGEgdmFsdWUgY29tbWFuZC4KLQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXhwcmVzc2lvbkVycm9yKEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIGV4cCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWVPYmplY3QpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJaWYgKGV4cC5pc05vRXhwcmVzc2lvblZhbHVlKCkpIHsKLQkJCXNlbmROb1ZhbHVlRXJyb3JDb21tYW5kKGV4cCwgdmFsdWVPYmplY3QpOwotCQl9IGVsc2UKLQkJCXNlbmRFeGNlcHRpb24oZXhwLmdldEVycm9yVGhyb3dhYmxlKCksIHZhbHVlT2JqZWN0LCBvdXQpOwotCX0KLQotCS8qCi0JICogQHBhcmFtIGV4cAotCSAqIEBwYXJhbSB2YWx1ZU9iamVjdAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgdm9pZCBzZW5kTm9WYWx1ZUVycm9yQ29tbWFuZChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlciBleHAsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCXNldEV4Y2VwdGlvbkludG9WYWx1ZShleHAuZ2V0RXJyb3JUaHJvd2FibGUoKSwgdmFsdWVPYmplY3QpOwotCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgRXhwcmVzc2lvbkNvbW1hbmRzLkVYUFJFU1NJT05fTk9FWFBSRVNTSU9OVkFMVUVfRVhDRVBUSU9OLCB2YWx1ZU9iamVjdCk7Ci0JfQotCi1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT1RfQV9QUklNSVRJVkUgPSBDb21tYW5kcy5OT1RfQU5fSUQ7Ci1wcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTRU5EX0FTX0lTID0gLTI7CS8vIFRoaXMgbWVhbnMgc2VuZHMgYXMgYW4gb2JqZWN0IG5vdCBhcyBhbiBpZC4KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0FEREVEID0gMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9BRERFRCA9IDI7Ci1wdWJsaWMgaW50IGZpbGxJblZhbHVlKE9iamVjdCBvYmplY3QsIGludCBwcmltaXRpdmVUeXBlSUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0KSB7Ci0JaW50IGFkZGVkID0gMDsKLQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJdmFsdWVPYmplY3Quc2V0KCk7Ci0JfSBlbHNlIHsKLQkJaW50IGNsYXNzSUQgPSAwOwotCQlpZiAocHJpbWl0aXZlVHlwZUlEICE9IE5PVF9BX1BSSU1JVElWRSAmJiBwcmltaXRpdmVUeXBlSUQgIT0gU0VORF9BU19JUykgewotCQkJY2xhc3NJRCA9IHByaW1pdGl2ZVR5cGVJRDsJLy8gVGhlIG9iamVjdCBpcyByZWFsbHkgc3VwcG9zZWQgdG8gYmUgYSBwcmltaXRpdmUgb2YgdGhpcyB0eXBlCi0JCQlzd2l0Y2ggKGNsYXNzSUQpIHsKLQkJCQljYXNlIENvbW1hbmRzLkJPT0xFQU5fVFlQRToKLQkJCQkJdmFsdWVPYmplY3Quc2V0KCgoQm9vbGVhbikgb2JqZWN0KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuSU5URUdFUl9UWVBFOgotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyKQotCQkJCQkJdmFsdWVPYmplY3Quc2V0KChpbnQpICgoQ2hhcmFjdGVyKSBvYmplY3QpLmNoYXJWYWx1ZSgpKTsJLy8gQmVjYXVzZSBjaGFyIGNhbiBiZSB3aWRlbmVkIHRvIGFuIGludAotCQkJCQllbHNlCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChOdW1iZXIpIG9iamVjdCkuaW50VmFsdWUoKSk7CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5CWVRFX1RZUEU6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoKE51bWJlcikgb2JqZWN0KS5ieXRlVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuQ0hBUkFDVEVSX1RZUEU6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoKENoYXJhY3Rlcikgb2JqZWN0KS5jaGFyVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuRE9VQkxFX1RZUEU6Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKGRvdWJsZSkgKChDaGFyYWN0ZXIpIG9iamVjdCkuY2hhclZhbHVlKCkpOwkvLyBCZWNhdXNlIGNoYXIgY2FuIGJlIHdpZGVuZWQgdG8gYSBkb3VibGUKLQkJCQkJZWxzZQotCQkJCQkJdmFsdWVPYmplY3Quc2V0KCgoTnVtYmVyKSBvYmplY3QpLmRvdWJsZVZhbHVlKCkpOwkJCQkJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuRkxPQVRfVFlQRToKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCQkJCXZhbHVlT2JqZWN0LnNldCgoZmxvYXQpICgoQ2hhcmFjdGVyKSBvYmplY3QpLmNoYXJWYWx1ZSgpKTsJLy8gQmVjYXVzZSBjaGFyIGNhbiBiZSB3aWRlbmVkIHRvIGEgZmxvYXQKLQkJCQkJZWxzZQotCQkJCQkJdmFsdWVPYmplY3Quc2V0KCgoTnVtYmVyKSBvYmplY3QpLmZsb2F0VmFsdWUoKSk7CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5TSE9SVF9UWVBFOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChOdW1iZXIpIG9iamVjdCkuc2hvcnRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5MT05HX1RZUEU6Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKGxvbmcpICgoQ2hhcmFjdGVyKSBvYmplY3QpLmNoYXJWYWx1ZSgpKTsJLy8gQmVjYXVzZSBjaGFyIGNhbiBiZSB3aWRlbmVkIHRvIGEgbG9uZwotCQkJCQllbHNlCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQoKChOdW1iZXIpIG9iamVjdCkubG9uZ1ZhbHVlKCkpOwkJCQkJCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gSXQncyBub3QgYSBwcmltaXRpdmUuCi0JCQlib29sZWFuIGFkZE9iamVjdCA9IGZhbHNlLCBhZGRDbGFzcyA9IGZhbHNlOwkJCQotCQkJQ2xhc3Mgb2JqQ2xhc3MgPSBvYmplY3QuZ2V0Q2xhc3MoKTsKLQkJCWNsYXNzSUQgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChvYmpDbGFzcyk7Ci0JCQlpZiAoY2xhc3NJRCA9PSBSZW1vdGVWTVNlcnZlclRocmVhZC5JRF9OT1RfRk9VTkQpIHsKLQkJCQlDb21tYW5kcy5WYWx1ZU9iamVjdCBjbGFzc1ZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7Ci0JCQkJYWRkQ2xhc3MgPSBzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChvYmpDbGFzcywgY2xhc3NWYWx1ZSk7Ci0JCQkJaWYgKGFkZENsYXNzKQotCQkJCQlhZGRlZCB8PSBDTEFTU19BRERFRDsKLQkJCQljbGFzc0lEID0gY2xhc3NWYWx1ZS5vYmplY3RJRDsKLQkJCX0KLQkJCi0JCQlzd2l0Y2ggKGNsYXNzSUQpIHsKLQkJCQljYXNlIENvbW1hbmRzLkJZVEVfQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoQnl0ZSkgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5DSEFSQUNURVJfQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoQ2hhcmFjdGVyKSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkRPVUJMRV9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChEb3VibGUpIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuRkxPQVRfQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoRmxvYXQpIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuSU5URUdFUl9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChJbnRlZ2VyKSBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkxPTkdfQ0xBU1M6Ci0JCQkJCXZhbHVlT2JqZWN0LnNldCgoTG9uZykgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5TSE9SVF9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KChTaG9ydCkgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5CT09MRUFOX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKEJvb2xlYW4pIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29tbWFuZHMuU1RSSU5HX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQoKFN0cmluZykgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb21tYW5kcy5CSUdfREVDSU1BTF9DTEFTUzoKLQkJCQkJdmFsdWVPYmplY3Quc2V0KG9iamVjdCwgQ29tbWFuZHMuQklHX0RFQ0lNQUxfQ0xBU1MpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbW1hbmRzLkJJR19JTlRFR0VSX0NMQVNTOgotCQkJCQl2YWx1ZU9iamVjdC5zZXQob2JqZWN0LCBDb21tYW5kcy5CSUdfSU5URUdFUl9DTEFTUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWlmIChwcmltaXRpdmVUeXBlSUQgIT0gU0VORF9BU19JUykgewotCQkJCQkJYWRkT2JqZWN0ID0gc2VydmVyLmdldElkZW50aXR5SUQob2JqZWN0LCB2YWx1ZU9iamVjdCk7Ci0JCQkJCQlpZiAoYWRkT2JqZWN0KSB7Ci0JCQkJCQkJYWRkZWQgfD0gT0JKRUNUX0FEREVEOwkJCQotCQkJCQkJCXZhbHVlT2JqZWN0LnNldE9iamVjdElEKHZhbHVlT2JqZWN0Lm9iamVjdElELCBjbGFzc0lEKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXZhbHVlT2JqZWN0LnNldE9iamVjdElEKHZhbHVlT2JqZWN0Lm9iamVjdElEKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQl2YWx1ZU9iamVjdC5zZXQob2JqZWN0LCBjbGFzc0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIGFkZGVkOwotfQotCi1wdWJsaWMgdm9pZCBzZW5kT2JqZWN0KE9iamVjdCBvYmplY3QsIGludCBwcmltaXRpdmVUeXBlSUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0LCBEYXRhT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiB3cml0ZUFzQ29tbWFuZCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCXNlbmRPYmplY3Qob2JqZWN0LCBwcmltaXRpdmVUeXBlSUQsIHZhbHVlT2JqZWN0LCBvdXQsIHdyaXRlQXNDb21tYW5kLCB3cml0ZUFzQ29tbWFuZCk7Ci19Ci1wdWJsaWMgdm9pZCBzZW5kT2JqZWN0KE9iamVjdCBvYmplY3QsIGludCBwcmltaXRpdmVUeXBlSUQsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlT2JqZWN0LCBEYXRhT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiB3cml0ZUFzQ29tbWFuZCwgYm9vbGVhbiBmbHVzaCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewkJCQotCWludCBhZGRlZCA9IGZpbGxJblZhbHVlKG9iamVjdCwgcHJpbWl0aXZlVHlwZUlELCB2YWx1ZU9iamVjdCk7Ci0JYm9vbGVhbiBzZW50ID0gZmFsc2U7Ci0JdHJ5IHsKLQkJQ29tbWFuZHMud3JpdGVWYWx1ZShvdXQsIHZhbHVlT2JqZWN0LCB3cml0ZUFzQ29tbWFuZCwgZmx1c2gpOwkvLyBXcml0ZSBpdCBiYWNrIGFzIGEgdmFsdWUgY29tbWFuZC4KLQkJc2VudCA9IHRydWU7Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKCFzZW50KSB7Ci0JCQkvLyBFbmRpbmcgZHVlIHRvIHNvbWUgcHJvYmxlbSwgc28gY2xlYW4gdXAgYW55IGFkZGVkIG9iamVjdHMgZnJvbSB0aGUgaWQgdGFibGUuCi0JCQlpZiAoKGFkZGVkICYgT0JKRUNUX0FEREVEKSAhPSAwKQotCQkJCXNlcnZlci5yZW1vdmVPYmplY3QodmFsdWVPYmplY3Qub2JqZWN0SUQpOwotCQkJaWYgKChhZGRlZCAmIENMQVNTX0FEREVEKSAhPSAwKQotCQkJCXNlcnZlci5yZW1vdmVPYmplY3QodmFsdWVPYmplY3QuY2xhc3NJRCk7Ci0JCX0KLQl9Ci19Ci0JCQotCQotCXB1YmxpYyB2b2lkIHNlbmRFeGNlcHRpb24oVGhyb3dhYmxlIGUsIENvbW1hbmRzLlZhbHVlT2JqZWN0IHZhbHVlLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24gewotCQkvLyBFeGNlcHRpb24gb2N1cnJlZCwgcmV0dXJuIGEgdmFsdWUgY29tbWFuZCB3aXRoIHRoZSBleGNlcHRpb24gd2l0aGluIGl0LgotCQlzZXRFeGNlcHRpb25JbnRvVmFsdWUoZSwgdmFsdWUpOwotCQlDb21tYW5kcy5zZW5kRXJyb3JDb21tYW5kKG91dCwgQ29tbWFuZHMuVEhST1dBQkxFX1NFTlQsIHZhbHVlKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbkludG9WYWx1ZShUaHJvd2FibGUgZSwgQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHsJCQotCQlzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChlLCB2YWx1ZSk7CS8vIEl0IHNob3VsZCBhbHdheXMgY3JlYXRlIGl0IHNvIHdlIGRvbid0IG5lZWQgdG8ga25vdy4KLQkJaW50IGVJRCA9IHZhbHVlLm9iamVjdElEOwotCQlDbGFzcyBlQ2xhc3MgPSBlLmdldENsYXNzKCk7CQkJCQkJCQotCQlzZXJ2ZXIuZ2V0SWRlbnRpdHlJRChlQ2xhc3MsIHZhbHVlKTsKLQkJaW50IGVDbGFzc0lEID0gdmFsdWUub2JqZWN0SUQ7Ci0JCXZhbHVlLnNldEV4Y2VwdGlvbihlSUQsIGVDbGFzc0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogRnJvbSB0aGUgdmFsdWVPYmplY3QsIGdldCBhbiBPYmplY3QgdGhhdCBpcyBpbnZva2FibGUgKGkuZS4gY2FuIGJlIHRoZSB0YXJnZXQgb2YgYW4gaW52b2tlLCBvciBvbmUgb2YgaXRzIHBhcm1zKS4KLQkgKiBJZiBpdCBpcyBhbiBhcnJheSB0eXBlLCB0aGUgYSBWYWx1ZVNlbmRlciBpcyByZXR1cm5lZC4gVGhlIGludm9rZXIgbmVlZHMgdG8gdGhlbiBjYXN0IHRoaXMKLQkgKiB0byBhIFZhbHVlU2VuZGVyIGFuZCBjYWxsIHRoZSByZWFkQXJyYXkgcm91dGluZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEludm9rYWJsZU9iamVjdChmaW5hbCBDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlLnR5cGUpIHsKLQkJCWNhc2UgQ29tbWFuZHMuTkVXX09CSkVDVF9JRDoKLQkJCWNhc2UgQ29tbWFuZHMuT0JKRUNUX0lEOgotCQkJCS8vIFRoZXNlIG5lZWQgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIHNlcnZlciB0byBnZXQgdGhlIHJlYWwgb2JqZWN0Ci0JCQkJcmV0dXJuIHNlcnZlci5nZXRPYmplY3QodmFsdWUub2JqZWN0SUQpOwkJCQkJCQotCQkJZGVmYXVsdDoKLQkJCQkvLyBUaGVzZSBoYXZlIGFsbCB0aGUgaW5mbyBuZWVkZWQgd2l0aGluIHRoZSB2YWx1ZSBvYmplY3QgaXRzZWxmLCBzbyBhc2sgaXQuCi0JCQkJcmV0dXJuIHZhbHVlLmdldEFzT2JqZWN0KCk7Ci0JCX0KLQl9Ci0JCi0JLy8gSGVscGVyIGNsYXNzIGZvciBnZXR0aW5nIGFuIGFycmF5LgotCXByaXZhdGUgY2xhc3MgSW52b2thYmxlVmFsdWVTZW5kZXIgaW1wbGVtZW50cyBDb21tYW5kcy5WYWx1ZVNlbmRlciB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCU9iamVjdCBhcnJheTsKLQotCQlwdWJsaWMgSW52b2thYmxlVmFsdWVTZW5kZXIoKSB7Ci0JCX0KLQkJCQkKLQkJcHVibGljIEludm9rYWJsZVZhbHVlU2VuZGVyKENvbW1hbmRzLlZhbHVlT2JqZWN0IGFycmF5SGVhZGVyKSB7Ci0JCQlpbml0aWFsaXplKGFycmF5SGVhZGVyKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21tYW5kcy5WYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQkJaW5kZXggPSAwOwotCQkJQ2xhc3MgYXJyYXlUeXBlID0gKENsYXNzKSBzZXJ2ZXIuZ2V0T2JqZWN0KGFycmF5SGVhZGVyLmNsYXNzSUQpOwotCQkJYXJyYXkgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShhcnJheVR5cGUsIGFycmF5SGVhZGVyLmFuSW50KTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQlhcnJheSA9IG51bGw7Ci0JCQlpbmRleCA9IDA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0QXJyYXkoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJCQkJCi0JCS8vIEEgbmV3IHZhbHVlIGlzIGJlaW5nIHNlbnQgdG8gdGhlIGFycmF5Ci0JCXB1YmxpYyB2b2lkIHNlbmRWYWx1ZShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgewotCQkJamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuc2V0KGFycmF5LCBpbmRleCsrLCBnZXRJbnZva2FibGVPYmplY3QodmFsdWUpKTsJLy8gYWRkIGl0IHRvIHRoZSBhcnJheQotCQl9Ci0JCQkJCQotCQkvLyBUaGUgbmV4dCBlbnRyeSBpcyBhbiBhcnJheSB0b28hCi0JCXB1YmxpYyBDb21tYW5kcy5WYWx1ZVNlbmRlciBuZXN0ZWRBcnJheShDb21tYW5kcy5WYWx1ZU9iamVjdCBhcnJheUhlYWRlcikgewotCQkJSW52b2thYmxlVmFsdWVTZW5kZXIgc2VuZGVyID0gbmV3IEludm9rYWJsZVZhbHVlU2VuZGVyKGFycmF5SGVhZGVyKTsKLQkJCS8vIFRha2UgdGhlIG5ld2x5IGNyZWF0ZWQgYXJyYXkgYW5kIHB1dCBpdCBpbnRvIHRoZSBjdXJyZW50IGFycmF5LgotCQkJamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuc2V0KGFycmF5LCBpbmRleCsrLCBzZW5kZXIuZ2V0QXJyYXkoKSk7Ci0JCQlyZXR1cm4gc2VuZGVyOwotCQl9Ci0JfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9Db25uZWN0aW9uVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0Nvbm5lY3Rpb25UaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3MjEyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0Nvbm5lY3Rpb25UaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IENvbm5lY3Rpb25UaHJlYWQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQ29tbWFuZEV4Y2VwdGlvbjsKLS8qKgotICogVGhpcyBpcyBhIHRocmVhZCB0byBoYW5kbGUgb25lIGNvbm5lY3Rpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIENvbm5lY3Rpb25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewkKLQkJCi0JZmluYWwgcHJvdGVjdGVkIENvbm5lY3Rpb25IYW5kbGVyIGNvbm5lY3Rpb25IYW5kbGVyOwotCQotCXB1YmxpYyBDb25uZWN0aW9uVGhyZWFkKFNvY2tldCBzYywgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc3ZyLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQotCQljb25uZWN0aW9uSGFuZGxlciA9IG5ldyBDb25uZWN0aW9uSGFuZGxlcihzYywgc3ZyLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVxdWVzdCB0aGUgdGhyZWFkIHRvIGNsb3NlIGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCXRyeSB7Ci0JCQljb25uZWN0aW9uSGFuZGxlci5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCWNvbm5lY3Rpb25IYW5kbGVyLnJ1bigpOwotCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0V4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0V4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Nzk3ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9FeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLQotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuQ29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5yZW1vdGUuRXhwcmVzc2lvbkNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLQotIAotLyoqCi0gKiBUaGlzIHByb2Nlc3NlcyB0aGUgY29tbWFuZHMgZm9yIGV4cHJlc3Npb24gcHJvY2Vzc2luZyBhbmQgc2VuZHMgdGhlbSBvdmVyCi0gKiB0byB0aGUgY29tbW9uIGV4cHJlc3Npb24gcHJvY2Vzc2VyLgotICogCi0gKiBUaGlzIHdpbGwgYmUgaW5zdGFudGlhdGVkIG9uIHRoZSBzdGFydCBvZiBhbiBleHByZXNzaW9uLiBBbmQgdGhlbgotICogZWFjaCBleHByZXNzaW9uIHJlcXVlc3QgZnJvbSB0aGUgSURFIHdpbGwgYmUgc2VudCBpbnRvIGhlcmUuIFRoZQotICogcmVhc29uIHRoaXMgZ3V5IGRvZXNuJ3QgaG9sZCBvbnRvIHRoZSBjb25uZWN0aW9uIGFuZCBwcm9jZXNzIHRoZQotICogZW50aXJlIGV4cHJlc3Npb24gaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldHVybiB0byB0aGUgY29ubmVjdGlvbgotICogaGFuZGxlciB0byBrZWVwIHRoZSBjb25uZWN0aW9uIGxpdmUgKHRoZXJlIGlzIHRpbWVvdXRzIGFuZCBzdHVmZgotICogaW4gdGhlcmUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGR1cGxpY2F0ZSBoZXJlKS4KLSAqIDxwPgotICogSWYgdGhlcmUgYXJlIGFueSBleHByZXNzaW9uIHByb2Nlc3NpbmcgZXJyb3JzICh2ZXJzdXMgaGFyZCBpbyBlcnJvcnMpIHdlCi0gKiB3aWxsIHNhdmUgdXAgdGhlIGVycm9yIGJ1dCBkb24ndCBkbyBhbnkgbW9yZSBwcm9jZXNzaW5nIG90aGVyIHRoYW4gdG8gbWFrZQotICogc3VyZSB3ZSByZWFkIHRoZSBjb21wbGV0ZSBzdWJjb21tYW5kLiBUaGlzIGlzIHNvIHRoYXQgdGhlIGlucHV0c3RyZWFtIGlzIGxlZnQKLSAqIGluIGEgdmFsaWQgc3RhdGUgd2l0aG91dCBzdGFuZGVkIGRhdGEuCi0gKiA8cD4KLSAqIFRoZSBhdCB0aGUgc3luYyBwb2ludCAoZWl0aGVyIGdldCB2YWx1ZSBvciBzeW5jIHN1YmNvbW1hbmQpIHdlIHdpbGwgc2VuZCBiYWNrCi0gKiB0aGUgZXJyb3IuCi0gKiAgCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyIHsKLQotCQotCXByb3RlY3RlZCBmaW5hbCBSZW1vdGVWTVNlcnZlclRocmVhZCBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbm5lY3Rpb25IYW5kbGVyIGNvbm5IYW5kbGVyOwkKLQlwcm90ZWN0ZWQgZmluYWwgRXhwcmVzc2lvblByb2Nlc3NlciBleHA7Ci0JcHJvdGVjdGVkIENvbW1hbmRzLlZhbHVlT2JqZWN0IHdvcmtlclZhbHVlID0gbmV3IENvbW1hbmRzLlZhbHVlT2JqZWN0KCk7CS8vIEEgd29ya2VyIHZhbHVlIG9iamVjdCBzbyB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgY3JlYXRpbmcgdGhlbSBhbmQgcmVsZWFzaW5nIHRoZW0uCi0JcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBhIGRlZmF1bHQgZXhwcmVzc2lvbiBwcm9jZXNzZXIgYW5kIHVzZSBkZWZhdWx0IGZsYWcgZm9yIHRyYWNlLgotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIoUmVtb3RlVk1TZXJ2ZXJUaHJlYWQgc2VydmVyLCBDb25uZWN0aW9uSGFuZGxlciBjb25uSGFuZGxlcikgewotCQl0aGlzKHNlcnZlciwgY29ubkhhbmRsZXIsIG5ldyBFeHByZXNzaW9uUHJvY2Vzc2VyKEJvb2xlYW4uZ2V0Qm9vbGVhbihFeHByZXNzaW9uQ29tbWFuZHMuRVhQUkVTU0lPTlRSQUNFKSwgTG9uZy5nZXRMb25nKEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OVFJBQ0VfVElNRVJfVEhSRVNIT0xELCAtMUwpLmxvbmdWYWx1ZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGEgZGVmYXVsdCBleHByZXNzaW9uIHByb2Nlc3Nlci4KLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIGNvbm5IYW5kbGVyCi0JICogQHBhcmFtIHRyYWNlCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKFJlbW90ZVZNU2VydmVyVGhyZWFkIHNlcnZlciwgQ29ubmVjdGlvbkhhbmRsZXIgY29ubkhhbmRsZXIsIGJvb2xlYW4gdHJhY2UpIHsKLQkJdGhpcyhzZXJ2ZXIsIGNvbm5IYW5kbGVyLCBuZXcgRXhwcmVzc2lvblByb2Nlc3Nlcih0cmFjZSwgTG9uZy5nZXRMb25nKEV4cHJlc3Npb25Db21tYW5kcy5FWFBSRVNTSU9OVFJBQ0VfVElNRVJfVEhSRVNIT0xELCAtMUwpLmxvbmdWYWx1ZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBmcm9tIGEgc3ViY2xhc3Mgd2l0aCBhIGdpdmVuIGV4cHJlc3Npb24gcHJvY2Vzc2VyLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gZXhwCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb25Qcm9jZXNzZXJDb250cm9sbGVyKFJlbW90ZVZNU2VydmVyVGhyZWFkIHNlcnZlciwgQ29ubmVjdGlvbkhhbmRsZXIgY29ubkhhbmRsZXIsIEV4cHJlc3Npb25Qcm9jZXNzZXIgZXhwKSB7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLmNvbm5IYW5kbGVyID0gY29ubkhhbmRsZXI7Ci0JCXRoaXMuZXhwID0gZXhwOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGNsYXNzIGxvYWRlciB0byB1c2UgZm9yIGZpbmRpbmcgY2xhc3Nlcy4gSWYgbmV2ZXIgc2V0LCBvciBpZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbgotCSAqIDxjb2RlPkNsYXNzLmZvck5hbWU8L2NvZGU+IHdpbGwgYmUgdXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NMb2FkZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQl0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0JfQotCQotCS8qCi0JICogQXJyYXkgb2YgcHJpbWl0aXZlIHR5cGUgbmFtZXMuIFVzZWQgdG8gbG9vayB1cCBwcmltdGl2ZSB0eXBlcyBpbiBwcmltaXRpdmUgdHlwZXMgYXJyYXkuIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgUFJJTUlUSVZFX05BTUVTID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJieXRlIiwgImNoYXIiLCAic2hvcnQiLCAiaW50IiwgImxvbmciLCAiZmxvYXQiLCAiZG91YmxlIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBQUklNSVRJVkVfVFlQRVMgPSBuZXcgQ2xhc3NbXSB7Qnl0ZS5UWVBFLCBDaGFyYWN0ZXIuVFlQRSwgU2hvcnQuVFlQRSwgSW50ZWdlci5UWVBFLCBMb25nLlRZUEUsIEZsb2F0LlRZUEUsIERvdWJsZS5UWVBFfTsKLQkvKioKLQkgKiBMb2FkIHRoZSBjbGFzcyBnaXZlbiB0aGUgbmFtZS4gSWYgbm90IGZvdW5kLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoY2xhc3NOYW1lLmVuZHNXaXRoKCJbXSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFdlIGhhdmUgYW4gYXJyYXkgcmVxdWVzdCBpbnN0ZWFkLiBUaGlzIGlzIHRyaWNraWVyLgotCQkJcmV0dXJuIGxvYWRDbGFzcyhNYXBUeXBlcy5nZXRKTklGb3JtYXROYW1lKGNsYXNzTmFtZSkpOwotCQl9IGVsc2UgewotCQkJaW50IHByaW1JbmRleCA9IFBSSU1JVElWRV9OQU1FUy5pbmRleE9mKGNsYXNzTmFtZSk7Ci0JCQlpZiAocHJpbUluZGV4ID49IDApCi0JCQkJcmV0dXJuIFBSSU1JVElWRV9UWVBFU1twcmltSW5kZXhdOwotCQkJZWxzZSBpZiAoY2xhc3NMb2FkZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdyBwcm9jZXNzIHRoZSBpbnB1dCBzdHJlYW0uIElmIGVpdGhlciB0aHJvd3Mgb2NjdXJzLCB0aGlzIGlzIGEgaGFyZCBlcnJvciBhbmQgd2UgbXVzdCB0ZXJtaW5hdGUKLQkgKiB0aGUgZW50aXJlIGNvbm5lY3Rpb24uIFRoZSBpbnB1dCBzdHJlYW0gaXMgaW4gYW4gdW5rbm93biBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW4gVGhlIGlucHV0IHN0cmVhbSB0byBnZXQgdGhlIGRhdGEgZm9yIHRoZSBjdXJyZW50IHN1Yi1jb21tYW5kLgotCSAqIAotCSAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzKERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIENvbW1hbmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gSW4gdGhlIGZvbGxvd2luZyBzdWJjb21tYW5kIHByb2Nlc3NpbmcsIHdlIGFsd2F5cyByZWFkIHRoZSBlbnRpcmUgc3ViY29tbWFuZCBmcm9tIHRoZSBzdHJlYW0uCi0JCS8vIFRoaXMgaXMgc28gdGhhdCBhbnkgZXJyb3JzIGR1cmluZyBwcm9jZXNzaW5nIHdpbGwgbm90IG1lc3MgdXAgdGhlIHN0cmVhbSB3aXRoIHVucmVhZCBkYXRhLgotCQkvLwotCQkvLyBUaGVuIHdlIGNoZWNrIGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZCBpbiB0aGUgcGFzdC4gSWYgaXQgaGFzLCB3ZSBzaW1wbHkgYnJlYWsuIFRoaXMgaXMgYmVjYXVzZQotCQkvLyBvbmNlIGFuIGVycm9yIG9jY3VycmVkIHdlIGRvbid0IHdhbnQgdG8gY29udGludWUgd2FzdGluZyB0aW1lIGV2YWx1YXRpbmcsIGhvd2V2ZXIgd2UgbmVlZCB0byBtYWtlCi0JCS8vIHN1cmUgdGhhdCB0aGUgc3RyZWFtIGlzIHJlYWQgY29tcGxldGVseSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgYSBjb3JydXB0ZWQgaW5wdXQgc3RyZWFtLiBUaGF0IHdheQotCQkvLyB3aGVuIGFsbCBpcyBkb25lIHdlIGNhbiByZXR1cm4gdGhlIGVycm9yIGFuZCBzdGlsbCBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbiBzb2NrZXQuCi0JCWJ5dGUgc3ViY29tbWFuZCA9IGluLnJlYWRCeXRlKCk7Ci0JCXRyeSB7Ci0JCQlzd2l0Y2ggKHN1YmNvbW1hbmQpIHsKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlBVU0hfVE9fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0dGluZyBhIHByb3h5IHB1c2guIFRoZSB2YWx1ZSBpcyBzZW50IGFzIHZhbHVlT2JqZWN0LCBzbyB1c2UgdGhhdCB0byByZWFkIGl0IGluLgotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJT2JqZWN0IHZhbHVlID0gY29ubkhhbmRsZXIuZ2V0SW52b2thYmxlT2JqZWN0KHdvcmtlclZhbHVlKTsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCQlleHAucHVzaEV4cHJlc3Npb24obnVsbCwgTWV0aG9kSGVscGVyLk5VTExfVFlQRSk7Ci0JCQkJCWVsc2UgaWYgKHdvcmtlclZhbHVlLmlzUHJpbWl0aXZlKCkpCi0JCQkJCQlleHAucHVzaEV4cHJlc3Npb24odmFsdWUsIHdvcmtlclZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWV4cC5wdXNoRXhwcmVzc2lvbih2YWx1ZSwgdmFsdWUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5DQVNUX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGNhc3QgcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaENhc3QoY2xhc3NWYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTlNUQU5DRU9GX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGluc3RhbmNlb2YgcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaEluc3RhbmNlb2YoY2xhc3NWYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JTkZJWF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYW4gaW5maXggcmVxdWVzdC4gVGhlIG9wZXJhdG9yIGFuZCBvcGVyYW5kIHR5cGUgYXJlIHNlbnQgYXMgYnl0ZXMuCi0JCQkJCWJ5dGUgaW5maXhfb3BlcmF0b3IgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCQlieXRlIGluZml4X29wZXJhbmRUeXBlID0gaW4ucmVhZEJ5dGUoKTsKLQkJCQkJZXhwLnB1c2hJbmZpeChJbmZpeE9wZXJhdG9yLmdldChpbmZpeF9vcGVyYXRvciksIEludGVybmFsSW5maXhPcGVyYW5kVHlwZS5nZXQoaW5maXhfb3BlcmFuZFR5cGUpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlBSRUZJWF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBwcmVmaXggcmVxdWVzdC4gVGhlIG9wZXJhdG9yIGlzIHNlbnQgYXMgYnl0ZS4KLQkJCQkJYnl0ZSBwcmVmaXhfb3BlcmFuZFR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotCQkJCQlleHAucHVzaFByZWZpeChQcmVmaXhPcGVyYXRvci5nZXQocHJlZml4X29wZXJhbmRUeXBlKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BUlJBWV9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGFuIGFycmF5IGFjY2VzcyByZXF1ZXN0LiBUaGUgaW5kZXggY291bmQgaXMgc2VudCBhcyBpbnQuCi0JCQkJCWludCBhcnJheUFjY2Vzc19JbmRleGNvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQlleHAucHVzaEFycmF5QWNjZXNzKGFycmF5QWNjZXNzX0luZGV4Y291bnQpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQVJSQVlfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGFuIGFycmF5IGNyZWF0aW9uIHJlcXVlc3QuIFRoZSB0eXBlIGlzIHNlbnQgYXMgdmFsdWVPYmplY3QsIGZvbGxvd2VkIGJ5IGludCBkaW1lbnNpb24gY291bnQuCi0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlpbnQgYXJyYXlDcmVhdGlvbl9kaW1Db3VudCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoQXJyYXlDcmVhdGlvbihjbGFzc1ZhbHVlLCBhcnJheUNyZWF0aW9uX2RpbUNvdW50KTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkFSUkFZX0lOSVRJQUxJWkVSX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhbiBhcnJheSBpbml0aWFsaXplciByZXF1ZXN0LiBUaGUgdHlwZSBpcyBzZW50IGFzIHZhbHVlT2JqZWN0LCBmb2xsb3dlZCBieSBpbnQgZXhwcmVzc2lvbiBjb3VudC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCWludCBzdHJpcENvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQlpbnQgYXJyYXlJbml0aWFsaXplcl9leHByZXNzaW9uQ291bnQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaEFycmF5SW5pdGlhbGl6ZXIoY2xhc3NWYWx1ZSwgc3RyaXBDb3VudCwgYXJyYXlJbml0aWFsaXplcl9leHByZXNzaW9uQ291bnQpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdCwgZm9sbG93ZWQgYnkgaW50IGFyZ3VtZW50IGNvdW50LgotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJaW50IG5ld0luc3RhbmNlX2FyZ0NvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgY2xhc3NWYWx1ZSA9IGdldEJlYW5UeXBlVmFsdWUod29ya2VyVmFsdWUpOwotCQkJCQkJZXhwLnB1c2hDbGFzc0luc3RhbmNlQ3JlYXRpb24oY2xhc3NWYWx1ZSwgbmV3SW5zdGFuY2VfYXJnQ291bnQpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFlQRVJFQ0VJVkVSX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIHR5cGUgcmVjZWl2ZXIgcmVxdWVzdC4gVGhlIHR5cGUgaXMgc2VudCBhcyB2YWx1ZU9iamVjdC4KLQkJCQkJQ29tbWFuZHMucmVhZFZhbHVlKGluLCB3b3JrZXJWYWx1ZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gZ2V0QmVhblR5cGVWYWx1ZSh3b3JrZXJWYWx1ZSk7Ci0JCQkJCQlleHAucHVzaEV4cHJlc3Npb24oY2xhc3NWYWx1ZSwgY2xhc3NWYWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5GSUVMRF9BQ0NFU1NfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgZmllbGQgYWNjZXNzIHJlcXVlc3QuIENvbW1hbmQuVmFsdWVPYmplY3QsIGZvbGxvd2VkIGJ5IGhhc1JlY2VpdmVyIGFzIGJvb2xlYW4uCi0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlib29sZWFuIGhhc19maWVsZEFjY2Vzc19yZWNlaXZlciA9IGluLnJlYWRCb29sZWFuKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3QgZmllbGRBY2Nlc3MgPSBnZXRGaWVsZFZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoRmllbGRBY2Nlc3MoZmllbGRBY2Nlc3MsIHdvcmtlclZhbHVlLmdldFR5cGUoKSA9PSBDb21tYW5kcy5TVFJJTkcsIGhhc19maWVsZEFjY2Vzc19yZWNlaXZlcik7Ci0JCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCWV4cC5wcm9jZXNzRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CS8vIExldCB0aGUgcHJvY2Vzc29yIGtub3cgd2UgaGF2ZSBhIHN0b3BwaW5nIGVycm9yLgotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5NRVRIT0RfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgbWV0aG9kIGludm9jYXRpb24gcmVxdWVzdC4gU2VudCBhcyBDb21tYW5kcy5WYWx1ZU9iamVjdCwgZm9sbG93ZWQgYnkgaGFzUmVjZWl2ZXIgYXMgYm9vbGVhbi4sIGFuZCBhcmdDb3VudCBhcyBpbnQuCi0JCQkJCUNvbW1hbmRzLnJlYWRWYWx1ZShpbiwgd29ya2VyVmFsdWUpOwotCQkJCQlib29sZWFuIGhhc19tZXRob2RfcmVjZWl2ZXIgPSBpbi5yZWFkQm9vbGVhbigpOwotCQkJCQlpbnQgbWV0aG9kX2FyZ0NvdW50ID0gaW4ucmVhZEludCgpOwotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IG1ldGhvZCA9IGdldE1ldGhvZFZhbHVlKHdvcmtlclZhbHVlKTsJCQkJCQotCQkJCQkJZXhwLnB1c2hNZXRob2RJbnZvY2F0aW9uKG1ldGhvZCwgd29ya2VyVmFsdWUuZ2V0VHlwZSgpID09IENvbW1hbmRzLlNUUklORywgaGFzX21ldGhvZF9yZWNlaXZlciwgbWV0aG9kX2FyZ0NvdW50KTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLkNPTkRJVElPTkFMX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gcmVxdWVzdC4gVGhlIGV4cHJlc3Npb24gdHlwZSAoaWUuIGNvbmRpdGlvbi90cnVlL2ZhbHNlKSBpcyBzZW50IGFzIGEgYnl0ZQotCQkJCQlleHAucHVzaENvbmRpdGlvbmFsKEludGVybmFsQ29uZGl0aW9uYWxPcGVyYW5kVHlwZS5nZXQoaW4ucmVhZEJ5dGUoKSkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX1BST1hZX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gcmVxdWVzdC4gVGhlIHByb3h5IGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlpbnQgcHJveHlpZCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJZXhwLnB1c2hBc3NpZ25tZW50KG5ldyBSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5BU1NJR05NRU5UX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gcmVxdWVzdC4gTm90aGluZyBlbHNlIHRvIHJlYWQgZnJvbSBzdHJlYW0uCi0JCQkJCWV4cC5wdXNoQXNzaWdubWVudCgpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX1RPX0VYUFJFU1NJT05fUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgcHVzaCBleHByZXNzaW9uIHByb3h5IGV4cHJlc3Npb24uIFRoZSBwcm94eSBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJLy8gRmlyc3QgdGVzdCBpZiBhIHBvc3NpYmxlIEZhaWxlZEV4cHJlc3Npb25Qcm94eSBiZWNhdXNlIHdlIGNvdWxkIG9mIGJlZW4gcHVzaGluZwotCQkJCQkvLyBhIGZhaWxlZCByZWZsZWN0aW9uIHByb3h5LgotCQkJCQlwcm94eWlkID0gaW4ucmVhZEludCgpOwotCQkJCQl0cnkgewotCQkJCQkJZXhwLmdldEV4cHJlc3Npb25Qcm94eShwcm94eWlkLCBuZXcgT2JqZWN0W10ge251bGwsIG51bGx9KTsKLQkJCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZTEpIHsJCQkJCQkKLQkJCQkJCWlmIChlMS5nZXRQcm94eSgpICE9IG51bGwpIHsKLQkJCQkJCQlGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkgZmFpbHVyZSA9IChGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkpIGUxLmdldFByb3h5KCk7Ci0JCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oKFRocm93YWJsZSkgZmFpbHVyZS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQlicmVhazsJLy8gRG9uJ3QgZ28gb24sIHdlIHByb2Nlc3NlZCBpdC4gQSBzdGFuZGFyZCBubyBleHByZXNzaW9uIHZhbHVlIHNob3VsZCBiZSBwYXNzZWQgb24gYW5kIGxldCBmb2xsb3dpbmcgY29kZSBoYW5kbGUgaXQuCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZXhwLnB1c2hFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCWJyZWFrOwotCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfQkVHSU5fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgYmVnaW4gYmxvY2sgcHJveHkgZXhwcmVzc2lvbi4gVGhlIGJsb2NrIGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaEJsb2NrQmVnaW4oaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfQlJFQUtfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgYnJlYWsgYmxvY2sgcHJveHkgZXhwcmVzc2lvbi4gVGhlIGJsb2NrIGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaEJsb2NrQnJlYWsoaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuQkxPQ0tfRU5EX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGVuZCBibG9jayBwcm94eSBleHByZXNzaW9uLiBUaGUgYmxvY2sgaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoQmxvY2tFbmQoaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0JFR0lOX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIHRyeSBiZWdpbiBwcm94eSBleHByZXNzaW9uLiBUaGUgdHJ5IGlkIGlzIHNlbnQgYXMgYW4gaW50LgotCQkJCQlleHAucHVzaFRyeUJlZ2luKGluLnJlYWRJbnQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlRSWV9DQVRDSF9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQlpbnQgdHJ5TnVtYmVyID0gaW4ucmVhZEludCgpOwotCQkJCQlDb21tYW5kcy5yZWFkVmFsdWUoaW4sIHdvcmtlclZhbHVlKTsKLQkJCQkJcHJveHlpZCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoVHJ5Q2F0Y2hDbGF1c2UodHJ5TnVtYmVyLCBjbGFzc1ZhbHVlLCBwcm94eWlkICE9IC0xID8gbmV3IFJlbW90ZUV4cHJlc3Npb25Qcm94eShwcm94eWlkKSA6IG51bGwpOwotCQkJCQl9IGNhdGNoIChGYWlsZWRQcm94eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlLmdldENhdXNlKCkpOwkvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlIGhhdmUgYSBzdG9wcGluZyBlcnJvci4KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVFJZX0ZJTkFMTFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgdHJ5IGZpbmFsbHkgcHJveHkgZXhwcmVzc2lvbi4gVGhlIHRyeSBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hUcnlGaW5hbGx5Q2xhdXNlKGluLnJlYWRJbnQoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5UUllfRU5EX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIHRyeSBlbmQgcHJveHkgZXhwcmVzc2lvbi4gVGhlIHRyeSBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hUcnlFbmQoaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuVEhST1dfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJZXhwLnB1c2hUaHJvd0V4Y2VwdGlvbigpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUkVUSFJPV19FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSByZXRocm93IHByb3h5IGV4cHJlc3Npb24uIFRoZSB0cnkgaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoVHJ5UmV0aHJvdyhpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9CRUFOVFlQRV9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IHRoZSBiZWFudHlwZSBleHByZXNzaW9uIHByb3h5IGFuZCByZXNvbHZlIGl0LgotCQkJCQlwcm94eWlkID0gaW4ucmVhZEludCgpOwotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBDb21tYW5kcy5yZWFkU3RyaW5nRGF0YShpbik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjbGFzc1ZhbHVlID0gbG9hZENsYXNzKHR5cGVOYW1lKTsKLQkJCQkJCVJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGNsYXNzVmFsdWUsIENsYXNzLmNsYXNzKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGUsIGUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKLQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGUsIGUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5QVVNIX01FVEhPRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IHRoZSBNZXRob2QgZXhwcmVzc2lvbiBwcm94eSBhbmQgcmVzb2x2ZSBpdC4KLQkJCQkJLy8gQ29tZXMgb3ZlciBhczoKLQkJCQkJLy8gICBpbnQgZm9yIHByb3h5IGlkIGZvciB0aGUgbWV0aG9kCi0JCQkJCS8vICAgYmVhblR5cGVWYWx1ZSBmb3IgZGVjbGFyaW5nIGNsYXNzIChlaXRoZXIgYmVhbnR5cGUgb3IgZXhwcmVzc2lvbiBwcm94eSkKLQkJCQkJLy8gICBzdHJpbmcgZm9yIG1ldGhvZCBuYW1lCi0JCQkJCS8vICAgaW50IGZvciBhcmcgY291bnQKLQkJCQkJLy8gICBiZWFuVHlwZVZhbHVlKHMpIGZvciBhcmcgdHlwZXMgKGFzIG1hbnkgYXMgYXJnIGNvdW50KS4KLQkJCQkJcHJveHlpZCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJQ29tbWFuZHMuVmFsdWVPYmplY3QgZGVjQ2xhc3NWYWx1ZSA9ICBDb21tYW5kcy5yZWFkVmFsdWUoaW4sIG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpKTsKLQkJCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBDb21tYW5kcy5yZWFkU3RyaW5nRGF0YShpbik7Ci0JCQkJCWludCBhcmdDb3VudCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJQ29tbWFuZHMuVmFsdWVPYmplY3RbXSBhcmdzID0gbnVsbDsKLQkJCQkJaWYgKGFyZ0NvdW50ID4gMCkgewotCQkJCQkJYXJncyA9IG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdFthcmdDb3VudF07Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0NvdW50OyBpKyspIHsKLQkJCQkJCQlhcmdzW2ldID0gQ29tbWFuZHMucmVhZFZhbHVlKGluLCBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJQ2xhc3MgZGVjQ2xhc3MgPSBudWxsOwotCQkJCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJZGVjQ2xhc3MgPSBnZXRCZWFuVHlwZVZhbHVlKGRlY0NsYXNzVmFsdWUpOwotCQkJCQkJYXJnQ2xhc3NlcyA9IG51bGw7Ci0JCQkJCQlpZiAoYXJnQ291bnQ+MCkgewotCQkJCQkJCWFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbYXJnQ291bnRdOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgewotCQkJCQkJCQlhcmdDbGFzc2VzW2ldID0gZ2V0QmVhblR5cGVWYWx1ZShhcmdzW2ldKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBOb3cgZ2V0IHRoZSBtZXRob2QgaXRzZWxmLgotCQkJCQkJTWV0aG9kIG0gPSBkZWNDbGFzcy5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJnQ2xhc3Nlcyk7Ci0JCQkJCQlSZW1vdGVFeHByZXNzaW9uUHJveHkgcmVwID0gbmV3IFJlbW90ZUV4cHJlc3Npb25Qcm94eShwcm94eWlkKTsKLQkJCQkJCXJlcC5zZXRQcm94eShtLCBNZXRob2QuY2xhc3MpOwotCQkJCQkJZXhwLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KHJlcCk7Ci0JCQkJCX0gY2F0Y2ggKEZhaWxlZFByb3h5RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGUuZ2V0Q2F1c2UoKSwgZS5nZXRDYXVzZSgpLmdldENsYXNzKCkpOwotCQkJCQkJZXhwLmFsbG9jYXRlRXhwcmVzc2lvblByb3h5KHJlcCk7Ci0JCQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUaGUgZGVmYXVsdCB0cmFjZSBkb2Vzbid0IHNob3cgd2hhdCBtZXRob2Qgd2FzIGJlaW5nIHNlYXJjaGVkIGZvciwgc28gcmVjcmVhdGUgd2l0aCB0aGF0LgotCQkJCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlzLmFwcGVuZChkZWNDbGFzcy5nZXROYW1lKCkpOwotCQkJCQkJcy5hcHBlbmQoJy4nKTsKLQkJCQkJCXMuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQkJCQkJcy5hcHBlbmQoJygnKTsKLQkJCQkJCWlmIChhcmdDbGFzc2VzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ0NsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaWYgKGkgPiAwKQotCQkJCQkJCQkJcy5hcHBlbmQoJywnKTsKLQkJCQkJCQkJcy5hcHBlbmQoYXJnQ2xhc3Nlc1tpXS5nZXROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXMuYXBwZW5kKCcpJyk7Ci0JCQkJCQlOb1N1Y2hNZXRob2RFeGNlcHRpb24gbmUgPSBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKHMudG9TdHJpbmcoKSk7Ci0JCQkJCQluZS5zZXRTdGFja1RyYWNlKGUuZ2V0U3RhY2tUcmFjZSgpKTsKLQkJCQkJCUZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KG5lLCBuZS5nZXRDbGFzcygpKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9CQkJCQkKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuUFVTSF9GSUVMRF9FWFBSRVNTSU9OUFJPWFlfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IHRoZSBGaWxlZCBleHByZXNzaW9uIHByb3h5IGFuZCByZXNvbHZlIGl0LgotCQkJCQkvLyBDb21lcyBvdmVyIGFzOgotCQkJCQkvLyAgIGludCBmb3IgcHJveHkgaWQgZm9yIHRoZSBmaWVsZAotCQkJCQkvLyAgIGJlYW5UeXBlVmFsdWUgZm9yIGRlY2xhcmluZyBjbGFzcyAoZWl0aGVyIGJlYW50eXBlIG9yIGV4cHJlc3Npb24gcHJveHkpCi0JCQkJCS8vICAgc3RyaW5nIGZvciBmaWVsZCBuYW1lCi0JCQkJCXByb3h5aWQgPSBpbi5yZWFkSW50KCk7Ci0JCQkJCWRlY0NsYXNzVmFsdWUgPSAgQ29tbWFuZHMucmVhZFZhbHVlKGluLCBuZXcgQ29tbWFuZHMuVmFsdWVPYmplY3QoKSk7Ci0JCQkJCVN0cmluZyBmaWVsZE5hbWUgPSBDb21tYW5kcy5yZWFkU3RyaW5nRGF0YShpbik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlkZWNDbGFzcyA9IGdldEJlYW5UeXBlVmFsdWUoZGVjQ2xhc3NWYWx1ZSk7Ci0JCQkJCQkvLyBOb3cgZ2V0IHRoZSBmaWVsZCBpdHNlbGYuCi0JCQkJCQlGaWVsZCBmID0gZGVjQ2xhc3MuZ2V0RmllbGQoZmllbGROYW1lKTsKLQkJCQkJCVJlbW90ZUV4cHJlc3Npb25Qcm94eSByZXAgPSBuZXcgUmVtb3RlRXhwcmVzc2lvblByb3h5KHByb3h5aWQpOwotCQkJCQkJcmVwLnNldFByb3h5KGYsIE1ldGhvZC5jbGFzcyk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoZS5nZXRDYXVzZSgpLCBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQlleHAuYWxsb2NhdGVFeHByZXNzaW9uUHJveHkocmVwKTsKLQkJCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IHJlcCA9IG5ldyBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkocHJveHlpZCk7Ci0JCQkJCQlyZXAuc2V0UHJveHkoZSwgZS5nZXRDbGFzcygpKTsKLQkJCQkJCWV4cC5hbGxvY2F0ZUV4cHJlc3Npb25Qcm94eShyZXApOwotCQkJCQl9CQkJCQkKLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQkJCi0JCQkJY2FzZSBJbnRlcm5hbEV4cHJlc3Npb25UeXBlcy5JRl9URVNUX0VYUFJFU1NJT05fVkFMVUU6Ci0JCQkJCS8vIEdldCBhIGlmIHRlc3QgZXhwcmVzc2lvbiByZXF1ZXN0LiAKLQkJCQkJZXhwLnB1c2hJZkVsc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuSUZfRUxTRV9FWFBSRVNTSU9OX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBpZi9lbHNlIGV4cHJlc3Npb24gY2xhdXNlIHJlcXVlc3QuIFRoZSBjbGF1c2UgdHlwZSAoaWUuIHRydWUvZmFsc2UpIGlzIHNlbnQgYXMgYSBieXRlCi0JCQkJCWV4cC5wdXNoSWZFbHNlKEludGVybmFsSWZFbHNlT3BlcmFuZFR5cGUuZ2V0KGluLnJlYWRCeXRlKCkpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuTkVXX0lOU1RBTkNFX1ZBTFVFOgotCQkJCQkvLyBHZXQgYSBuZXcgaW5zdGFuY2UgZnJvbSBzdHJpbmcuCi0JCQkJCVN0cmluZyBpbml0U3RyaW5nID0gQ29tbWFuZHMucmVhZFN0cmluZ0RhdGEoaW4pOwotCQkJCQl3b3JrZXJWYWx1ZSA9ICBDb21tYW5kcy5yZWFkVmFsdWUoaW4sIG5ldyBDb21tYW5kcy5WYWx1ZU9iamVjdCgpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIGNsYXNzVmFsdWUgPSBnZXRCZWFuVHlwZVZhbHVlKHdvcmtlclZhbHVlKTsKLQkJCQkJCWV4cC5wdXNoTmV3SW5zdGFuY2VGcm9tU3RyaW5nKGluaXRTdHJpbmcsIGNsYXNzVmFsdWUsIGNsYXNzTG9hZGVyKTsKLQkJCQkJfSBjYXRjaCAoRmFpbGVkUHJveHlFeGNlcHRpb24gZSkgewotCQkJCQkJZXhwLnByb2Nlc3NFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsJLy8gTGV0IHRoZSBwcm9jZXNzb3Iga25vdyB3ZSBoYXZlIGEgc3RvcHBpbmcgZXJyb3IuCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuTUFSS19WQUxVRToKLQkJCQkJLy8gRG8gYSBtYXJrLgotCQkJCQlpbnQgbWFya0lEID0gaW4ucmVhZEludCgpOwotCQkJCQlleHAucHVzaE1hcmsobWFya0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuRU5ETUFSS19WQUxVRToKLQkJCQkJLy8gRG8gYW4gZW5kIG1hcmsuCi0JCQkJCW1hcmtJRCA9IGluLnJlYWRJbnQoKTsKLQkJCQkJYm9vbGVhbiByZXN0b3JlID0gaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQkJZXhwLnB1c2hFbmRtYXJrKG1hcmtJRCwgcmVzdG9yZSk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIEludGVybmFsRXhwcmVzc2lvblR5cGVzLlNVQkVYUFJFU1NJT05fQkVHSU5fRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgYmVnaW4gc3ViZXhwcmVzc2lvbiBwcm94eSBleHByZXNzaW9uLiBUaGUgc3ViZXhwcmVzc2lvbiBpZCBpcyBzZW50IGFzIGFuIGludC4KLQkJCQkJZXhwLnB1c2hTdWJleHByZXNzaW9uQmVnaW4oaW4ucmVhZEludCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgSW50ZXJuYWxFeHByZXNzaW9uVHlwZXMuU1VCRVhQUkVTU0lPTl9FTkRfRVhQUkVTU0lPTl9WQUxVRToKLQkJCQkJLy8gR2V0IGEgZW5kIHN1YmV4cHJlc3Npb24gcHJveHkgZXhwcmVzc2lvbi4gVGhlIHN1YmV4cHJlc3Npb24gaWQgaXMgc2VudCBhcyBhbiBpbnQuCi0JCQkJCWV4cC5wdXNoU3ViZXhwcmVzc2lvbkVuZChpbi5yZWFkSW50KCkpOwotCQkJCQlicmVhazsKLQkJCQkJCi0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleHAucHJvY2Vzc0V4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJd29ya2VyVmFsdWUuc2V0KCk7CS8vIENsZWFyIGl0IG91dCBzbyBub3RoaW5nIGJlaW5nIGhlbGQgb250by4KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpcyBhbiBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gZnJvbSB0aGUgZ2V0QmVhblR5cGUsIGZpZWxkLCBtZXRob2QgKHJlZmxlY3QgdHlwZSBzdHVmZikKLQkgKiB0aGF0IHdyYXBwZXJzIHRoZSByZWFsIHRocm93YWJsZSB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgcHJldmlvdXMgcmVmbGVjdGlvbi4gVGhpcyBpcwotCSAqIGJlY2F1c2UgcmVmbGVjdGlvbiBpcyBkb25lIG91dCBvZiBzZXF1ZW5jZSB3aXRoIHRoZSB1c2Ugb2YgdGhlIHJlZmxlY3QgdmFsdWUuIFNvIHdlIG5lZWQKLQkgKiB0byBzdG9yZSB0aGUgcmVmbGVjdGlvbiBleGNlcHRpb24gaW4gdGhpcyBleGNlcHRpb24gYW5kIHRoZW4gc3RvcmUgdGhpcyBleGNlcHRpb24gaW4KLQkgKiBhIHtAbGluayBGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHl9LiBUaGlzIHdpbGwgdGhlbiBiZSBwaWNrZWQgdXAgd2hlbiB0cnlpbmcgdG8gYmUKLQkgKiB1c2VkIGFuZCBpdCB3aWxsIGdldCB0aGUgdHJ1ZSBleGNlcHRpb24gb3V0IG9mIHRoZSB7QGxpbmsgVGhyb3dhYmxlI2dldENhdXNlKCl9LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZhaWxlZFByb3h5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI4NzIzMjU2NzIxNjYzNDg5MjNMOwotCi0JCXB1YmxpYyBGYWlsZWRQcm94eUV4Y2VwdGlvbihUaHJvd2FibGUgcmVhbFRocm93YWJsZSkgewotCQkJc3VwZXIocmVhbFRocm93YWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBiZWFudHlwZSAoY2xhc3MpIG91dCBvZiB0aGUgdmFsdWUgb2JqZWN0IHNlbnQgaW4uIEl0IGNhbiBoYW5kbGUgdGhlIGJlYW50eXBlIHNlbnQgb3IKLQkgKiBhcyBhbiBleHByZXNzaW9uIHByb3h5IHRvIGEgYmVhbnR5cGUgZXhwcmVzc2lvbiBwcm94eS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBGYWlsZWRQcm94eUV4Y2VwdGlvbiBXcmFwcGVycyB0aGUgcmVhbCB0aHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIGJlYW4gdHlwZSB0byBub3QgYmUgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEJlYW5UeXBlVmFsdWUoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHRocm93cyBGYWlsZWRQcm94eUV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBiZWFudHlwZSA9IGNvbm5IYW5kbGVyLmdldEludm9rYWJsZU9iamVjdCh2YWx1ZSk7Ci0JCS8vIEl0IGlzIGVpdGhlciBhIHR5cGUgZGlyZWN0bHkgb3IgaXMgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkJaWYgKHZhbHVlLnR5cGUgPT0gQ29tbWFuZHMuSU5UKSB7Ci0JCQkvLyBJdCBpcyBhbiBleHByZXNzaW9uIHByb3h5IHJlcXVlc3QuCi0JCQlPYmplY3RbXSBleHB2YWx1ZSA9IG5ldyBPYmplY3RbMl07Ci0JCQl0cnkgewotCQkJCWV4cC5nZXRFeHByZXNzaW9uUHJveHkoKChJbnRlZ2VyKSBiZWFudHlwZSkuaW50VmFsdWUoKSwgZXhwdmFsdWUpOwotCQkJCWJlYW50eXBlID0gZXhwdmFsdWVbMF07IAotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCS8vIFNlZSBpZiB0aGVyZSBpcyBhIGZhaWxlZCBwcm94eS4KLQkJCQlpZiAoZS5nZXRQcm94eSgpICE9IG51bGwpIHsKLQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IGZhaWx1cmUgPSAoRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KSBlLmdldFByb3h5KCk7Ci0JCQkJCXRocm93IG5ldyBGYWlsZWRQcm94eUV4Y2VwdGlvbigoVGhyb3dhYmxlKSBmYWlsdXJlLmdldFZhbHVlKCkpOwotCQkJCX0gZWxzZQotCQkJCQl0aHJvdyBuZXcgRmFpbGVkUHJveHlFeGNlcHRpb24obmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oKSk7CS8vIFRoaXMgc2hvdWxkbid0IG9mIG9jY3VycmVkLgotCQkJfSAKLQkJfQotCQlyZXR1cm4gKENsYXNzKSBiZWFudHlwZTsKLQl9Ci0JCQotCS8qKgotCSAqIEdldCB0aGUgbWV0aG9kIG91dCBvZiB0aGUgdmFsdWUgb2JqZWN0IHNlbnQgaW4uIEl0IGNhbiBoYW5kbGUgdGhlIG1ldGhvZCBzZW50IG9yCi0JICogYXMgYW4gZXhwcmVzc2lvbiBwcm94eSB0byBhIG1ldGhvZCBleHByZXNzaW9uIHByb3h5LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gbWV0aG9kIGlmIGEgbWV0aG9kIG9yIHN0cmluZyBpZiBhIHN0cmluZyBvciBnZXQgdGhlIG1ldGhvZCBpZiBhbiBleHByZXNzaW9uIHByb3h5LgotCSAqIEB0aHJvd3MgRmFpbGVkUHJveHlFeGNlcHRpb24gV3JhcHBlcnMgdGhlIHJlYWwgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSBtZXRob2QgdG8gbm90IGJlIGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0TWV0aG9kVmFsdWUoQ29tbWFuZHMuVmFsdWVPYmplY3QgdmFsdWUpIHRocm93cyBGYWlsZWRQcm94eUV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtZXRob2QgPSBjb25uSGFuZGxlci5nZXRJbnZva2FibGVPYmplY3QodmFsdWUpOwotCQkvLyBJdCBpcyBlaXRoZXIgYSBtZXRob2QgZGlyZWN0bHkgb3IgaXMgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkJaWYgKHZhbHVlLnR5cGUgPT0gQ29tbWFuZHMuSU5UKSB7Ci0JCQkvLyBJdCBpcyBhbiBleHByZXNzaW9uIHByb3h5IHJlcXVlc3QuCi0JCQlPYmplY3RbXSBleHB2YWx1ZSA9IG5ldyBPYmplY3RbMl07Ci0JCQl0cnkgewotCQkJCWV4cC5nZXRFeHByZXNzaW9uUHJveHkoKChJbnRlZ2VyKSBtZXRob2QpLmludFZhbHVlKCksIGV4cHZhbHVlKTsKLQkJCQltZXRob2QgPSBleHB2YWx1ZVswXTsgCi0JCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2VlIGlmIHRoZXJlIGlzIGEgZmFpbGVkIHByb3h5LgotCQkJCWlmIChlLmdldFByb3h5KCkgIT0gbnVsbCkgewotCQkJCQlGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkgZmFpbHVyZSA9IChGYWlsZWRSZW1vdGVFeHByZXNzaW9uUHJveHkpIGUuZ2V0UHJveHkoKTsKLQkJCQkJdGhyb3cgbmV3IEZhaWxlZFByb3h5RXhjZXB0aW9uKChUaHJvd2FibGUpIGZhaWx1cmUuZ2V0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCXRocm93IG5ldyBGYWlsZWRQcm94eUV4Y2VwdGlvbihuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCkpOwkvLyBUaGlzIHNob3VsZG4ndCBvZiBvY2N1cnJlZC4KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWV0aG9kOwotCX0JCi0KLQkvKioKLQkgKiBHZXQgdGhlIGZpZWxkIG91dCBvZiB0aGUgdmFsdWUgb2JqZWN0IHNlbnQgaW4uIEl0IGNhbiBoYW5kbGUgdGhlIGZpZWxkIHNlbnQgb3IKLQkgKiBhcyBhbiBleHByZXNzaW9uIHByb3h5IHRvIGEgZmllbGQgZXhwcmVzc2lvbiBwcm94eS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZpZWxkIGlmIGEgZmllbGQgb3Igc3RyaW5nIGlmIGEgc3RyaW5nIG9yIGdldCB0aGUgZmllbGQgaWYgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkgKiBAdGhyb3dzIEZhaWxlZFByb3h5RXhjZXB0aW9uIFdyYXBwZXJzIHRoZSByZWFsIHRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGUgZmllbGQgdG8gbm90IGJlIGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RmllbGRWYWx1ZShDb21tYW5kcy5WYWx1ZU9iamVjdCB2YWx1ZSkgdGhyb3dzIEZhaWxlZFByb3h5RXhjZXB0aW9uIHsKLQkJT2JqZWN0IGZpZWxkID0gY29ubkhhbmRsZXIuZ2V0SW52b2thYmxlT2JqZWN0KHZhbHVlKTsKLQkJLy8gSXQgaXMgZWl0aGVyIGEgZmllbGQgZGlyZWN0bHkgb3IgaXMgYW4gZXhwcmVzc2lvbiBwcm94eS4KLQkJaWYgKHZhbHVlLnR5cGUgPT0gQ29tbWFuZHMuSU5UKSB7Ci0JCQkvLyBJdCBpcyBhbiBleHByZXNzaW9uIHByb3h5IHJlcXVlc3QuCi0JCQlPYmplY3RbXSBleHB2YWx1ZSA9IG5ldyBPYmplY3RbMl07Ci0JCQl0cnkgewotCQkJCWV4cC5nZXRFeHByZXNzaW9uUHJveHkoKChJbnRlZ2VyKSBmaWVsZCkuaW50VmFsdWUoKSwgZXhwdmFsdWUpOwotCQkJCWZpZWxkID0gZXhwdmFsdWVbMF07IAotCQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQkJCS8vIFNlZSBpZiB0aGVyZSBpcyBhIGZhaWxlZCBwcm94eS4KLQkJCQlpZiAoZS5nZXRQcm94eSgpICE9IG51bGwpIHsKLQkJCQkJRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5IGZhaWx1cmUgPSAoRmFpbGVkUmVtb3RlRXhwcmVzc2lvblByb3h5KSBlLmdldFByb3h5KCk7Ci0JCQkJCXRocm93IG5ldyBGYWlsZWRQcm94eUV4Y2VwdGlvbigoVGhyb3dhYmxlKSBmYWlsdXJlLmdldFZhbHVlKCkpOwotCQkJCX0gZWxzZQotCQkJCQl0aHJvdyBuZXcgRmFpbGVkUHJveHlFeGNlcHRpb24obmV3IE5vU3VjaEZpZWxkRXhjZXB0aW9uKCkpOwkvLyBUaGlzIHNob3VsZG4ndCBvZiBvY2N1cnJlZC4KLQotCQkJfSAKLQkJfQotCQlyZXR1cm4gZmllbGQ7Ci0JfQkKLQkKLQkvKioKLQkgKiBQdWxsIHRoZSBFeHByZXNzaW9uIFByb3h5IHZhbHVlIGludG8gdGhlIHJlc3VsdCBvYmplY3QuCi0JICogQHBhcmFtIHByb3h5SUQKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB2YWx1ZSBjb3VsZCBiZSByZXR1cm5lZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdhcyBubyBleHByZXNzaW9uIHZhbHVlIGFzc2lnbmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHB1bGxFeHByZXNzaW9uUHJveHlWYWx1ZShpbnQgcHJveHlJRCwgT2JqZWN0W10gcmVzdWx0KSB7Ci0JCXRyeSB7Ci0JCQlleHAucHVsbEV4cHJlc3Npb25Qcm94eVZhbHVlKHByb3h5SUQsIHJlc3VsdCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVtb3RlRXhwcmVzc2lvblByb3h5IGltcGxlbWVudHMgSW50ZXJuYWxFeHByZXNzaW9uUHJveHkgewotCi0JCQotCQlwcml2YXRlIGZpbmFsIGludCBwcm94eUlEOwotCQlwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQkJcHJpdmF0ZSBDbGFzcyB0eXBlOwotCQlwcml2YXRlIGJvb2xlYW4gc2V0OwotCQkKLQkJcHVibGljIFJlbW90ZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlJRCkgewotCQkJdGhpcy5wcm94eUlEID0gcHJveHlJRDsKLQkJCQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNnZXRQcm94eUlEKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0UHJveHlJRCgpIHsKLQkJCXJldHVybiBwcm94eUlEOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbnRlcm5hbEV4cHJlc3Npb25Qcm94eSNnZXRUeXBlKCkKLQkJICovCi0JCXB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2dldFZhbHVlKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkludGVybmFsRXhwcmVzc2lvblByb3h5I2lzU2V0KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU2V0KCkgewotCQkJcmV0dXJuIHNldDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW50ZXJuYWxFeHByZXNzaW9uUHJveHkjc2V0UHJveHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UHJveHkoT2JqZWN0IHZhbHVlLCBDbGFzcyB0eXBlKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJc2V0ID0gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNGYWlsZWRFeHByZXNzaW9uKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgZm9yIHRoZSBqYXZhLmxhbmcucmVmbGVjdCB0aGluZ3MgKGNsYXNzLCBmaWVsZCwgbWV0aG9kKSB0byBpbmRpY2F0ZQotCSAqIHdoeSB0aGV5IGFyZW4ndCBmb3VuZC4KLQkgKiA8cD4KLQkgKiBUaGUgZXhjZXB0aW9uIHdpbGwgYmUgcGxhY2VkIGludG8gdmFsdWUsIEJVVCB0aGlzIHNob3VsZCBuZXZlciBiZSBzZW50Ci0JICogYmFjayB0byB0aGUgY2FsbGVyLiBJdCBpcyBpbnRlbmRlZCBvbmx5IGFzIGEgcGxhY2UtaG9sZGVyIGZvciBzdWJzZXF1ZW50Ci0JICogdXNhZ2UuIFVzZSB0aGUge0BsaW5rIFJlbW90ZUV4cHJlc3Npb25Qcm94eSNpc0ZhaWxlZEV4cHJlc3Npb24oKX0gbWV0aG9kCi0JICogdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgZmFpbGVkIG9uZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgYmVjYXVzZSB0aGUgcmVmbGVjdCBjYWxscyBhcmUgZG9uZSBvdXQgb2Ygc2VxdWVuY2UgZnJvbSB3aGVyZQotCSAqIHRoZXkgYXJlIHVzZWQgYW5kIHNvIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgdGhlIGVycm9yIGlzIHJlcG9ydGVkIGluIHRoZQotCSAqIHdyb25nIHBsYWNlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eSBleHRlbmRzIFJlbW90ZUV4cHJlc3Npb25Qcm94eSB7Ci0KLQkJcHVibGljIEZhaWxlZFJlbW90ZUV4cHJlc3Npb25Qcm94eShpbnQgcHJveHlJRCkgewotCQkJc3VwZXIocHJveHlJRCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzRmFpbGVkRXhwcmVzc2lvbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1NldCgpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY29uc2lkZXJlZCB0byBiZSBzZXQuIEl0IGlzIGhvbGRlciBvZiBpbmZvIG9ubHkuCi0JCX0KLQkJCi0JfQotCQotCi0JLyoqCi0JICogUHVsbCB0aGUgdmFsdWUuIAotCSAqIAotCSAqIEByZXR1cm4gclswXSBpcyB0aGUgdmFsdWUsIHJbMV0gaXMgdGhlIHR5cGUgb2YgdGhlIHZhbHVlLgotCSAqIEB0aHJvd3MgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gcHVsbFZhbHVlKCkgdGhyb3dzIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsyXTsKLQkJZXhwLnB1bGxWYWx1ZShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCQkKLQkvKioKLQkgKiBDbG9zZSBvdXQgdGhpbmdzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlleHAuY2xvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB0aHJvd2FibGUgZXJyb3IuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3JUaHJvd2FibGUoKSB7Ci0JCXJldHVybiBleHAuZ2V0RXJyb3JUaHJvd2FibGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgd2VyZSBubyBlcnJvcnMgb3Igbm90LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBub0Vycm9ycygpIHsKLQkJcmV0dXJuIGV4cC5ub0Vycm9ycygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBpcyBhIG5vIGV4cHJlc3Npb24gdmFsdWUgZXhjZXB0aW9uIG9yIG5vdC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb0V4cHJlc3Npb25WYWx1ZSgpIHsKLQkJcmV0dXJuIGV4cC5pc05vRXhwcmVzc2lvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0lkZW50aXR5TWFwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL0lkZW50aXR5TWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNTgzZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9JZGVudGl0eU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkudm0ucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogSWRlbnRpdHlNYXAuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotLyoqCi0gKiBBIEhhc2hNYXAgd2hlcmUgdGhlIGtleSBpcwotICogZG9uZSBhcyBhbiBpZGVudGl0eSAoaS5lLiBmb3VuZCBieSAnPT0nIG5vdCBlcXVhbHMoKSkuCi0gKi8KLQotcHVibGljIGNsYXNzIElkZW50aXR5TWFwIGV4dGVuZHMgSGFzaE1hcHsKLQkKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02ODE3Mjc0ODMzMjIxMzgzNjgzTDsKLQotCS8qKgotCSAqIEtleSB0aGF0IHJldHVybnMgdHJ1ZSBvbiBlcXVhbHMoKSBvbmx5Ci0JICogaWYgdGhlIGl0ZW0gaXQgaXMgd3JhcHBlcmluZyBpcyAnPT0nCi0JICogbm90IGVxdWFscygpCi0JICovCi0Jc3RhdGljIGNsYXNzIElkZW50aXR5S2V5IHsKLQkJCi0JCXB1YmxpYyBzdGF0aWMgSWRlbnRpdHlLZXkgY3JlYXRlS2V5KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogIT0gbnVsbCA/IG5ldyBJZGVudGl0eUtleShvYmopIDogbnVsbDsKLQkJfQotCQkKLQkJZmluYWwgT2JqZWN0IG87Ci0JCQotCQlwdWJsaWMgSWRlbnRpdHlLZXkoT2JqZWN0IG9iaikgewotCQkJbyA9IG9iajsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJZGVudGl0eUtleSkpIHJldHVybiBmYWxzZTsKLQkJCWlmICh0aGlzLm8gPT0gKCgoSWRlbnRpdHlLZXkpIG9iaikubykpIHJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIG8uaGFzaENvZGUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSWRlbnRpdHlNYXAoKSB7Ci0JfQotCQotCXB1YmxpYyBJZGVudGl0eU1hcChpbnQgY2FwYWNpdHkpIHsKLQkJc3VwZXIoY2FwYWNpdHkpOwotCX0KLQkKLQlwdWJsaWMgSWRlbnRpdHlNYXAoaW50IGNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0JCXN1cGVyKGNhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotCQlyZXR1cm4gc3VwZXIuY29udGFpbnNLZXkoSWRlbnRpdHlLZXkuY3JlYXRlS2V5KGtleSkpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBzdXBlci5nZXQoSWRlbnRpdHlLZXkuY3JlYXRlS2V5KGtleSkpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLnB1dChJZGVudGl0eUtleS5jcmVhdGVLZXkoa2V5KSwgdmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBzdXBlci5yZW1vdmUoSWRlbnRpdHlLZXkuY3JlYXRlS2V5KGtleSkpOwotCX0KLQkKLQkvKioKLQkgKiBOT1RFOiBEaWRuJ3QgYm90aGVyIGltcGxlbWVudGluZyBlbnRyeVNldCgpLiBJZiB0aGF0IGJlY29tZXMKLQkgKiBuZWVkZWQsIHRoZW4gaXQgd2lsbCBiZSBpbXBsZW1lbnRlZC4KLQkgKi8KLQlwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotCQl0aHJvdyAgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9SZW1vdGVWTUFwcGxpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1JlbW90ZVZNQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwZDY2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1JlbW90ZVZNQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJlbW90ZVZNQXBwbGljYXRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDozOTowOCAkIAotICovCi0KLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24gdG8gcnVuIHRvIGtpY2sgb2ZmIHRoZSByZW1vdGUgVk0gc2VydmVyIHNpZGUuCi0gKgotICoKLSAqIEFsbCB0aGlzIGRvZXMgaXMgc3RhcnQgdGhlIFNlcnZlciBUaHJlYWQgYW5kIHdhaXRzIGZvciBpdCB0byBmaW5pc2guCi0gKiBUaGlzIGFsbG93cyBvdGhlciBtYWlucyB0byBoYXZlIGEgc2VydmVyIHRocmVhZCwgYW5kIHNvbWUgb3RoZXIKLSAqIHRocmVhZHMgaWYgdGhleSB3aXNoZWQuIFRoZXkgY291bGQgc3RhcnQgdGhlIHNlcnZlciB0aHJlYWQgdG9vCi0gKiBhbmQgc29tZSBvdGhlciB0aHJlYWQsIGFuZCB0aGVuIHdhaXQgZm9yIGJvdGggdG8gZmluaXNoLgotICovCi0KLXB1YmxpYyBjbGFzcyBSZW1vdGVWTUFwcGxpY2F0aW9uIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmcgc2VydmVyTmFtZSA9ICJTZXJ2ZXIgVGhyZWFkIjsgLy8kTk9OLU5MUy0xJAotCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoInByb3h5dm0uc2VydmVybmFtZSIpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyTmFtZSA9IHNlcnZlck5hbWUgKyAiLSIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoInByb3h5dm0uc2VydmVybmFtZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlUaHJlYWQgdCA9IG5ldyBSZW1vdGVWTVNlcnZlclRocmVhZChzZXJ2ZXJOYW1lKTsKLQl0LnN0YXJ0KCk7Ci0JdHJ5IHsKLQkJdC5qb2luKCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0JU3lzdGVtLmV4aXQoMCk7Ci19Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1JlbW90ZVZNU2VydmVyVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS5wcm94eS92bV9yZW1vdGV2bS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcHJveHkvdm0vcmVtb3RlL1JlbW90ZVZNU2VydmVyVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODFmYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9SZW1vdGVWTVNlcnZlclRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJlbW90ZVZNU2VydmVyVGhyZWFkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjM5OjA4ICQgCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLnJlbW90ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uKjsKLS8qKgotICogUmVtb3RlVk0gU2VydmVyIFRocmVhZC4gVGhpcyB0aHJlYWQgaXMgdGhlIG9uZQotICogdGhhdCB3YWl0cyBmb3IgY29ubmVjdGlvbnMgYW5kIHNwaW5zIG9mZiAKLSAqIHNlcnZlciBjb25uZWN0aW9uIHRocmVhZHMuIEl0IG1hbmFnZXMgdGhlCi0gKiBjb25uZWN0aW9uIHRocmVhZHMgYW5kIGhhbmRsZXMgc2h1dHRpbmcgdGhlbQotICogZG93bi4KLSAqCi0gKiBTeXN0ZW0gUHJvcGVydGllczoKLSAqICAgcHJveHl2bS5wb3J0IC0gUG9ydCBudW1iZXIgdG8gdXNlIGZvciB0aGUgU2VydmVyU29ja2V0IChkZWZhdWx0IGlzIDg4ODgpCi0gKiAgIHByb3h5dm0uYnVmc2l6ZSAtIEJ1ZmZlciBzaXplIHRvIHVzZSBmb3IgVENQL0lQIGJ1ZmZlcnMgKGRlZmF1bHQgaXMgc3lzdGVtIGRlZmF1bHQpCi0gKi8KLQotcHVibGljIGNsYXNzIFJlbW90ZVZNU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIGltcGxlbWVudHMgSVZNU2VydmVyLCBJVk1DYWxsYmFja1NlcnZlciB7Ci0JcHJvdGVjdGVkIExpc3QgdGhyZWFkcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IExpbmtlZExpc3QoKSk7CS8vIExpc3Qgb2YgYWN0aXZlIHRocmVhZHMuCi0JcHJvdGVjdGVkIFNlcnZlclNvY2tldCBzZXJ2ZXI7CS8vIFNlcnZlciBTb2NrZXQgZm9yIHRoaXMgYXBwbGljYXRpb24KLQlwcml2YXRlIGludCBoaWdoZXN0SWRlbnRpdHlJRCA9IDA7CS8vIElkZW50aXR5IGNvZGVzIHRvIGlkZW50aWZ5IG9iamVjdHMgYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudC4KLQlwcml2YXRlIE1hcCBvYmplY3RUb0lETWFwOwotCXByaXZhdGUgSGFzaE1hcCBpZFRvT2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoMTAwKTsJLy8gTWFwIGZyb20gaWRlbnRpdHkgaWQgdG8gb2JqZWN0Ci0JCi0JcHJvdGVjdGVkIFN0YWNrIGZDYWxsYmFja0hhbmRsZXJQb29sID0gbmV3IFN0YWNrKCk7CS8vIFN0YWNrIG9mIGZyZWUgY2FsbGJhY2sgaGFuZGxlcnMKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBOVU1CRVJfRlJFRV9DQUxMQkFDS1MgPSA1OwkvLyBOdW1iZXIgb2YgZnJlZSBjYWxsYmFjayBoYW5kbGVycyB0byBrZWVwIG9wZW4uCi0JCi0JcHVibGljIHN0YXRpYyBpbnQgSURfTk9UX0ZPVU5EID0gQ29tbWFuZHMuTk9UX0FOX0lEOwkvLyBUaGUgaWQgd2FzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUuCi0JCi0JcHJvdGVjdGVkIGludCBtYXN0ZXJJREVTb2NrZXRQb3J0ID0gLTE7CS8vIFBvcnQgb2YgbWFzdGVyIHNlcnZlciBzb2NrZXQgb24gSURFLiBVc2VkIGZvciBzcGVjaWFsIGdsb2JhbCByZXF1ZXN0cy4KLQlwcm90ZWN0ZWQgaW50IHJlZ2lzdHJ5S2V5ID0gLTE7CS8vIEtleSBvZiByZWdpc3RyeSBvbiB0aGUgSURFLgotCQotCS8vIEtsdWRnZTogQnVnIGluIExpbnV4IDEuMy54eHggb2YgSlZNLiBDbG9zaW5nIGEgc29ja2V0IHdoaWxlIHRoZSBzb2NrZXQgaXMgYmVpbmcgcmVhZC9hY2NlcHQgd2lsbCBub3QgaW50ZXJydXB0IHRoZQotCS8vIHdhaXQuIE5lZWQgdG8gdGltZW91dCB0byB0aGUgc29ja2V0IHJlYWQvYWNjZXB0IGJlZm9yZSB0aGUgc29ja2V0IGNsb3NlIHdpbGwgYmUgbm90aWNlZC4gVGhpcyBoYXMgYmVlbiBmaXhlZAotCS8vIGluIExpbnV4IDEuNC4gU28gb24gTGludXggMS4zIG5lZWQgdG8gcHV0IHRpbWVvdXRzIGluIG9uIHRob3NlIHNvY2tldHMgdGhhdCBjYW4gYmUgc2VwYXJhdGVseSBjbG9zZWQgd2hpbGUgcmVhZGluZy9hY2NlcHRpbmcuCi0Jc3RhdGljIGJvb2xlYW4gTElOVVhfMV8zID0gImxpbnV4Ii5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSAmJiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIsIiIpLnN0YXJ0c1dpdGgoIjEuMyIpOwkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCi0JLy8gSWYgdmVyc2lvbiAxLjMueCwgd2UgbmVlZCB0byB1c2Ugb3VyIElkZW50aWR5TWFwLCBpZiAxLjQgb3IgZ3JlYXRlciB0aGVuIHdlIGNhbiB1c2UgSmF2YSdzIElkZW50aWR5SGFzaE1hcCwgd2hpY2ggaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBvdXJzLgotCXN0YXRpYyBDb25zdHJ1Y3RvciBJREVOVElEWU1BUF9DTEFTU19DVE9SOwotCXN0YXRpYyB7Ci0JCUNsYXNzIGlkQ2xhc3M7Ci0JCXRyeSB7Ci0JCQlpZENsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLklkZW50aXR5SGFzaE1hcCIpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWlkQ2xhc3MgPSBJZGVudGl0eU1hcC5jbGFzczsKLQkJfQotCQl0cnkgewotCQkJSURFTlRJRFlNQVBfQ0xBU1NfQ1RPUiA9IGlkQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge0ludGVnZXIuVFlQRX0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRyeSB7Ci0JCQlvYmplY3RUb0lETWFwID0gKE1hcCkgSURFTlRJRFlNQVBfQ0xBU1NfQ1RPUi5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKDEwMCl9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyB0aHJlYWQgaXMgdG8gd2FpdCA1IG1pbnV0ZXMsIHRoZW4gc2VlIGlmIHRoZSBJREUgaXMgc3RpbGwKLQkvLyB1cC4gSWYgaXQgaXNuJ3QgaXQgd2lsbCBnbyBkb3duLiBUaGlzIGlzIHNhZmV0eSBtZWNoYW5pc20KLQkvLyBpbiBjYXNlIHRoZSBjbGllbnQgd2VudCBkb3duIHdpdGhvdXQgY2xlYW5pbmcgdXAgYW5kIHRlbGxpbmcgdGhlIHNlcnZlciB0byBnbyBkb3duLgotCS8vIFRoYXQgd2F5IGl0IHdvbid0IGhhbmcgYXJvdW5kIGZvcmV2ZXIuCi0JcHJpdmF0ZSBib29sZWFuIGdvaW5nRG93biA9IGZhbHNlOwotCXByaXZhdGUgVGhyZWFkIHNhZmVDbGVhbiA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl3aGlsZSAoIWdvaW5nRG93bikgewotCQkJCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkKLQkJCQkJY29udGludWU7CS8vIEdldCB0byBjbGVhbiB1bmludGVycnVwdGVkIHN0YXRlLgotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCg1ICogNjAgKiAxMDAwKTsJLy8gU2xlZXAgZml2ZSBtaW51dGVzCi0JCQkJCS8vIFRlc3QgaWYgSURFIHN0aWxsIHVwLgotCQkJCQlpZiAoIWlzQWxpdmUoKSkgewotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyByZWdpc3RyeSBhdmFpbGFibGUgdG8gY29ubmVjdCB3aXRoIGFmdGVyIGZpdmUgbWludXRlcy4gU2h1dHRpbmcgZG93bi4iKTsJLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVxdWVzdFNodXRkb3duKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBTZWUgaWYgc3RpbGwgYWxpdmUKLQkJICovCQkKLQkJcHJpdmF0ZSBib29sZWFuIGlzQWxpdmUoKSB7Ci0JCQlTb2NrZXQgc29ja2V0ID0gZ2V0U29ja2V0KCk7Ci0JCQlpZiAoc29ja2V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0JCQkJCURhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oc29ja2V0LmdldElucHV0U3RyZWFtKCkpOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCW91dC53cml0ZUJ5dGUoQ29tbWFuZHMuQUxJVkUpOwotCQkJCQkJb3V0LndyaXRlSW50KHJlZ2lzdHJ5S2V5KTsKLQkJCQkJCW91dC5mbHVzaCgpOwotCQkJCQkJcmV0dXJuIGluLnJlYWRCb29sZWFuKCk7Ci0JCQkJCQkvLyBOb3cgZ2V0IHRoZSByZXN1bHQuCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCQl0cnkgewotCQkJCQkJCW91dC5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzb2NrZXQuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsJLy8gVGhleSBzaG91bGQgYmUgY2xvc2luZy4gSWYgdGhleSBhcmVuJ3QsIHRoZW4gdGhleSBhY2N1bXVsYXRlIGFuZCBtYXN0ZXIgc2VydmVyIHdpbGwgc3RhcnQgcmVqZWN0aW5nIG5ldyBvbmVzLgotCQkJCQl9Ci0JCQkJfQkJCQkJCi0JCQl9Ci0JCQkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkKLQkJCi0JfSwgIlRpbWVvdXQgVGVybWluYXRpb24gVGhyZWFkIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQotCQkvLyBJbml0aWFsaXplIHRoZSBtYXBwaW5nIHRhYmxlIHdpdGggY2VydGFpbiBwcmUtZGVmaW5lZCBpZHMuCi0JCXN5bmNocm9uaXplZChvYmplY3RUb0lETWFwKSB7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChWb2lkLlRZUEUsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlZPSURfVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuVk9JRF9UWVBFKSwgVm9pZC5UWVBFKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoQm9vbGVhbi5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5CT09MRUFOX1RZUEUpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJPT0xFQU5fVFlQRSksIEJvb2xlYW4uVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChCb29sZWFuLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5CT09MRUFOX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5CT09MRUFOX0NMQVNTKSwgQm9vbGVhbi5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KEludGVnZXIuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuSU5URUdFUl9UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5JTlRFR0VSX1RZUEUpLCBJbnRlZ2VyLlRZUEUpOwotCQkJb2JqZWN0VG9JRE1hcC5wdXQoSW50ZWdlci5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuSU5URUdFUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuSU5URUdFUl9DTEFTUyksIEludGVnZXIuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChCeXRlLlRZUEUsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJZVEVfVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQllURV9UWVBFKSwgQnl0ZS5UWVBFKTsKLQkJCW9iamVjdFRvSURNYXAucHV0KEJ5dGUuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJZVEVfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJZVEVfQ0xBU1MpLCBCeXRlLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoU2hvcnQuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuU0hPUlRfVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuU0hPUlRfVFlQRSksIFNob3J0LlRZUEUpOwotCQkJb2JqZWN0VG9JRE1hcC5wdXQoU2hvcnQuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlNIT1JUX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5TSE9SVF9DTEFTUyksIFNob3J0LmNsYXNzKTsJCi0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KExvbmcuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuTE9OR19UWVBFKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5MT05HX1RZUEUpLCBMb25nLlRZUEUpOwotCQkJb2JqZWN0VG9JRE1hcC5wdXQoTG9uZy5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuTE9OR19DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuTE9OR19DTEFTUyksIExvbmcuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChDaGFyYWN0ZXIuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuQ0hBUkFDVEVSX1RZUEUpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNIQVJBQ1RFUl9UWVBFKSwgQ2hhcmFjdGVyLlRZUEUpOwotCQkJb2JqZWN0VG9JRE1hcC5wdXQoQ2hhcmFjdGVyLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5DSEFSQUNURVJfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNIQVJBQ1RFUl9DTEFTUyksIENoYXJhY3Rlci5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KERvdWJsZS5UWVBFLCBuZXcgSW50ZWdlcihDb21tYW5kcy5ET1VCTEVfVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuRE9VQkxFX1RZUEUpLCBEb3VibGUuVFlQRSk7Ci0JCQlvYmplY3RUb0lETWFwLnB1dChEb3VibGUuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkRPVUJMRV9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuRE9VQkxFX0NMQVNTKSwgRG91YmxlLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoRmxvYXQuVFlQRSwgbmV3IEludGVnZXIoQ29tbWFuZHMuRkxPQVRfVFlQRSkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuRkxPQVRfVFlQRSksIEZsb2F0LlRZUEUpOwotCQkJb2JqZWN0VG9JRE1hcC5wdXQoRmxvYXQuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkZMT0FUX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5GTE9BVF9DTEFTUyksIEZsb2F0LmNsYXNzKTsJCQkJCQkJCQkJCQkJCQotCQkJCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChTdHJpbmcuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlNUUklOR19DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuU1RSSU5HX0NMQVNTKSwgU3RyaW5nLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJJR19ERUNJTUFMX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5CSUdfREVDSU1BTF9DTEFTUyksIGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkJJR19JTlRFR0VSX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5CSUdfSU5URUdFUl9DTEFTUyksIGphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzKTsKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoTnVtYmVyLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5OVU1CRVJfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLk5VTUJFUl9DTEFTUyksIE51bWJlci5jbGFzcyk7CQkJCQotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChUaHJvd2FibGUuY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlRIUk9XQUJMRV9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuVEhST1dBQkxFX0NMQVNTKSwgVGhyb3dhYmxlLmNsYXNzKTsJCi0JCQkKLQkJCQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoT2JqZWN0LmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5PQkpFQ1RfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLk9CSkVDVF9DTEFTUyksIE9iamVjdC5jbGFzcyk7CQotCQkJCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChDbGFzcy5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuQ0xBU1NfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkNMQVNTX0NMQVNTKSwgQ2xhc3MuY2xhc3MpOwotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0LmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5BQ0NFU1NJQkxFT0JKRUNUX0NMQVNTKSk7Ci0JCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5BQ0NFU1NJQkxFT0JKRUNUX0NMQVNTKSwgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdC5jbGFzcyk7CQkJCQkJCQkKLQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5NRVRIT0RfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLk1FVEhPRF9DTEFTUyksIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5jbGFzcyk7Ci0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5DT05TVFJVQ1RPUl9DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuQ09OU1RSVUNUT1JfQ0xBU1MpLCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5jbGFzcyk7CQkJCQotCQkJCi0JCQlvYmplY3RUb0lETWFwLnB1dChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuRklFTERfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkZJRUxEX0NMQVNTKSwgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuY2xhc3MpOwkKLQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoSVZNU2VydmVyLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5JVk1TRVJWRVJfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLklWTVNFUlZFUl9DTEFTUyksIElWTVNlcnZlci5jbGFzcyk7CQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChJQ2FsbGJhY2suY2xhc3MsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLklDQUxMQkFDS19DTEFTUykpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuSUNBTExCQUNLX0NMQVNTKSwgSUNhbGxiYWNrLmNsYXNzKTsJCi0JCQkKLQkJCW9iamVjdFRvSURNYXAucHV0KHRoaXMsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLlJFTU9URVNFUlZFUl9JRCkpOwotCQkJaWRUb09iamVjdE1hcC5wdXQobmV3IEludGVnZXIoQ29tbWFuZHMuUkVNT1RFU0VSVkVSX0lEKSwgdGhpcyk7CQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChSZW1vdGVWTVNlcnZlclRocmVhZC5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuUkVNT1RFVk1TRVJWRVJfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLlJFTU9URVZNU0VSVkVSX0NMQVNTKSwgUmVtb3RlVk1TZXJ2ZXJUaHJlYWQuY2xhc3MpOwkKLQotCQkJb2JqZWN0VG9JRE1hcC5wdXQoVGhyZWFkLmNsYXNzLCBuZXcgSW50ZWdlcihDb21tYW5kcy5USFJFQURfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLlRIUkVBRF9DTEFTUyksIFRocmVhZC5jbGFzcyk7CQotCi0JCQlvYmplY3RUb0lETWFwLnB1dChFeHByZXNzaW9uUHJvY2Vzc2VyQ29udHJvbGxlci5jbGFzcywgbmV3IEludGVnZXIoQ29tbWFuZHMuRVhQUkVTU0lPTlBST0NFU1NFUkNPTlRST0xMRVJfQ0xBU1MpKTsKLQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLkVYUFJFU1NJT05QUk9DRVNTRVJDT05UUk9MTEVSX0NMQVNTKSwgRXhwcmVzc2lvblByb2Nlc3NlckNvbnRyb2xsZXIuY2xhc3MpOwkKLQotCQkJdHJ5IHsKLQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0TWV0aG9kID0gQ2xhc3MuY2xhc3MuZ2V0TWV0aG9kKCJnZXRNZXRob2QiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzLCAobmV3IENsYXNzWzBdKS5nZXRDbGFzcygpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlvYmplY3RUb0lETWFwLnB1dChnZXRNZXRob2QsIG5ldyBJbnRlZ2VyKENvbW1hbmRzLkdFVF9NRVRIT0RfSUQpKTsKLQkJCQlpZFRvT2JqZWN0TWFwLnB1dChuZXcgSW50ZWdlcihDb21tYW5kcy5HRVRfTUVUSE9EX0lEKSwgZ2V0TWV0aG9kKTsJCi0JCQkJCi0JCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGluaXRNZXRob2QgPSBJQ2FsbGJhY2suY2xhc3MuZ2V0TWV0aG9kKCJpbml0aWFsaXplQ2FsbGJhY2siLCBuZXcgQ2xhc3NbXSB7SVZNQ2FsbGJhY2tTZXJ2ZXIuY2xhc3MsIEludGVnZXIuVFlQRX0pOyAvLyROT04tTkxTLTEkCi0JCQkJb2JqZWN0VG9JRE1hcC5wdXQoaW5pdE1ldGhvZCwgbmV3IEludGVnZXIoQ29tbWFuZHMuSU5JVElBTElaRUNBTExCQUNLX01FVEhPRF9JRCkpOwotCQkJCWlkVG9PYmplY3RNYXAucHV0KG5ldyBJbnRlZ2VyKENvbW1hbmRzLklOSVRJQUxJWkVDQUxMQkFDS19NRVRIT0RfSUQpLCBpbml0TWV0aG9kKTsJCi0JCQkJCi0JCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCS8vIFNob3VsZG4ndCByZWFsbHkgZXZlciBvY2N1ci4KLQkJCX0JCQkJCi0KLQkJCWhpZ2hlc3RJZGVudGl0eUlEID0gQ29tbWFuZHMuRklSU1RfRlJFRV9JRDsJCQotCQl9Ci0KLQkJbWFzdGVySURFU29ja2V0UG9ydCA9IEludGVnZXIuZ2V0SW50ZWdlcigicHJveHl2bS5tYXN0ZXJQb3J0IiwgLTEpLmludFZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1hc3RlcklERVNvY2tldFBvcnQgPT0gLTEpIHsKLQkJCS8vIE5vIHBvcnRzIHNwZWNpZmllZCwgbmVlZCB0byBqdXN0IHNodXRkb3duLgotCQkJc2h1dGRvd24oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcmVnaXN0cnlLZXkgPSBJbnRlZ2VyLmdldEludGVnZXIoInByb3h5dm0ucmVnaXN0cnlLZXkiLCAtMSkuaW50VmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVnaXN0cnlLZXkgPT0gLTEpIHsKLQkJCS8vIE5vIHJlZ2lzdHJ5IHNwZWNpZmllZCwgbmVlZCB0byBqdXN0IHNodXRkb3duLgotCQkJc2h1dGRvd24oKTsKLQkJCXJldHVybjsKLQkJfQkJCi0JCQotCQlzYWZlQ2xlYW4uc2V0UHJpb3JpdHkoVGhyZWFkLk1JTl9QUklPUklUWSk7Ci0JCXNhZmVDbGVhbi5zdGFydCgpOwkKLQkJYm9vbGVhbiB0cnlpbmcgPSB0cnVlOwotCQl0cnkgewotCQkJc2VydmVyID0gbmV3IFNlcnZlclNvY2tldCgwLCA1MCAsIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgibG9jYWxob3N0IikpOyAvLyROT04tTkxTLTEkCi0JCQl0cnlpbmcgPSBmYWxzZTsKLQkJCWlmIChMSU5VWF8xXzMpCi0JCQkJc2VydmVyLnNldFNvVGltZW91dCgxMDAwKTsJLy8gTGludXggMS4zIGJ1Zywgc2VlIGNvbW1lbnQgb24gTElOVVhfMV8zCi0JCQlpZiAocmVnaXN0ZXJTZXJ2ZXIoc2VydmVyLmdldExvY2FsUG9ydCgpKSkgewotCQkJCXdoaWxlKHNlcnZlciAhPSBudWxsKSB7Ci0JCQkJCVNvY2tldCBpbmNvbWluZyA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbmNvbWluZyA9IHNlcnZlci5hY2NlcHQoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQljb250aW51ZTsJLy8gVGltZW91dCwgdHJ5IGFnYWluCi0JCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWNvbnRpbnVlOwkvLyBTZXJ2ZXIgY291bGQgb2YgZ29uZSBudWxsIGFmdGVyIHRlc3QgaW4gd2hpbGUsIG1lYW5zIHNodXR0aW5nIGRvd24uIFRoaXMgcHJvYmFibHkgd291bGQgb25seSBoYXBwZW4gTGludXggMS4zLgotCQkJCQl9Ci0JCQkJCVRocmVhZCBzdCA9IG5ldyBDb25uZWN0aW9uVGhyZWFkKGluY29taW5nLCB0aGlzLCAiQ29ubmVjdGlvbiBUaHJlYWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJlYWRzLmFkZChzdCk7Ci0JCQkJCXNhZmVDbGVhbi5pbnRlcnJ1cHQoKTsJLy8gTGV0IHNhZmVDbGVhbiBrbm93IHRoZXJlIGlzIGEgY2hhbmdlCi0JCQkJCXN0LnN0YXJ0KCk7Ci0JCQkJCS8vIE51bGwgb3V0IGxvY2FscyBzbyB0aGV5IGNhbiBiZSBHQydkIHNpbmNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcgbG9vcC4KLQkJCQkJc3QgPSBudWxsOwotCQkJCQlpbmNvbWluZyA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotCQkJaWYgKHRyeWluZyB8fCBzZXJ2ZXIgIT0gbnVsbCkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkvLyBFeGNlcHRpb24gYW5kIG5vdCBzaHV0ZG93biByZXF1ZXN0LCBzbyBwcmludCBzdGFjayB0cmFjZS4KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCS8vIFdlJ3ZlIGhhZCBhbiBleGNlcHRpb24sIGVpdGhlciBzb21ldGhpbmcgcmVhbGx5IGJhZCwgb3Igd2Ugd2VyZSBjbG9zZWQsCi0JCS8vIHNvIGdvIHRocm91Z2ggc2h1dGRvd25zLgotCQlzaHV0ZG93bigpOwkJCi0JfQotCQotCQotCS8qKgotCSAqIEdldCBhbiBpZGVudGl0eUlELCByZXR1cm4gLTEgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWRlbnRpdHlJRChPYmplY3QgYW5PYmplY3QpIHsKLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCUludGVnZXIgaWQgPSAoSW50ZWdlcikgb2JqZWN0VG9JRE1hcC5nZXQoYW5PYmplY3QpOwotCQkJcmV0dXJuIGlkICE9IG51bGwgPyBpZC5pbnRWYWx1ZSgpIDogSURfTk9UX0ZPVU5EOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCBhbiBpZGVudGl0eUlEIGFuZCBhZGQgaXQgaWYgbm90IGZvdW5kLiBQbGFjZSB0aGUgaWQgaW4gdGhlCi0JICogVmFsdWVPYmplY3QgcGFzc2VkIGluIGFuZCByZXR1cm4gd2hldGhlciBpdCB3YXMgYWRkZWQgKHRydWUpIG9yIHdhcyBhbHJlYWR5IGluIHRhYmxlIChmYWxzZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRJZGVudGl0eUlEKE9iamVjdCBhbk9iamVjdCwgQ29tbWFuZHMuVmFsdWVPYmplY3QgaW50b1ZhbHVlICkgewotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZChvYmplY3RUb0lETWFwKSB7Ci0JCQlJbnRlZ2VyIGlkID0gKEludGVnZXIpIG9iamVjdFRvSURNYXAuZ2V0KGFuT2JqZWN0KTsKLQkJCWlmIChpZCA9PSBudWxsKSB7Ci0JCQkJZG8gewotCQkJCQlpZiAoKytoaWdoZXN0SWRlbnRpdHlJRCA9PSBDb21tYW5kcy5OT1RfQU5fSUQpCi0JCQkJCQkrK2hpZ2hlc3RJZGVudGl0eUlEOwkvLyBEb24ndCBsZXQgLTEgYmUgYSB2YWxpZCBpZC4KLQkJCQkJaWQgPSBuZXcgSW50ZWdlcihoaWdoZXN0SWRlbnRpdHlJRCk7Ci0JCQkJfSB3aGlsZSAoaWRUb09iamVjdE1hcC5jb250YWluc0tleShpZCkpOyAvLyBNYWtlIHN1cmUgbm90IGluIHVzZSwgcmVhbGx5IHNob3VsZG4ndCBldmVyIGhhcHBlbiBiZWNhdXNlIHdlIGhhdmUgb3ZlciA0IGJpbGxpb24gYmVmb3JlIGl0IHdyYXBzIGJhY2sKLQkJCQlvYmplY3RUb0lETWFwLnB1dChhbk9iamVjdCwgaWQpOwotCQkJCWlkVG9PYmplY3RNYXAucHV0KGlkLCBhbk9iamVjdCk7Ci0JCQkJYWRkZWQgPSB0cnVlOwotCQkJfSAKLQkJCWludG9WYWx1ZS5zZXRPYmplY3RJRChpZC5pbnRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gYWRkZWQ7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbiBpZGVudGl0eSBvYmplY3QgZnJvbSB0aGUgbWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVPYmplY3QoT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXN5bmNocm9uaXplZChvYmplY3RUb0lETWFwKSB7Ci0JCQlJbnRlZ2VyIGlkID0gKEludGVnZXIpIG9iamVjdFRvSURNYXAucmVtb3ZlKGFuT2JqZWN0KTsKLQkJCWlkVG9PYmplY3RNYXAucmVtb3ZlKGlkKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYW4gaWRlbnRpdHkgb2JqZWN0IGZyb20gdGhlIG1hcHBpbmcsIGdpdmVuIHRoZSBpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVPYmplY3QoaW50IGlkKSB7Ci0JCXN5bmNocm9uaXplZChvYmplY3RUb0lETWFwKSB7Ci0JCQlPYmplY3QgbyA9IGlkVG9PYmplY3RNYXAucmVtb3ZlKG5ldyBJbnRlZ2VyKGlkKSk7Ci0JCQlvYmplY3RUb0lETWFwLnJlbW92ZShvKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBmb3IgYW4gaWRlbnRpdHkgaWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChpbnQgaWQpIHsKLQkJc3luY2hyb25pemVkKG9iamVjdFRvSURNYXApIHsKLQkJCXJldHVybiBpZFRvT2JqZWN0TWFwLmdldChuZXcgSW50ZWdlcihpZCkpOwotCQl9Ci0JfSAKLQkKLQkvKioKLQkgKiBSZW1vdmUgYSB0aHJlYWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0aW9uVGhyZWFkKFRocmVhZCB0aHJlYWQpIHsKLQkJdGhyZWFkcy5yZW1vdmUodGhyZWFkKTsKLQkJc2FmZUNsZWFuLmludGVycnVwdCgpOwkvLyBMZXQgc2FmZSBjbGVhbiBrbm93IHRoZXJlIGlzIGEgY2hhbmdlLgotCX0KLQkKLQkvKioKLQkgKiBVc2UgdGhpcyB0byByZXF1ZXN0IGEgc2h1dGRvd24uIElmIHRoZSBzZXJ2ZXIgaGFzbid0IGV2ZW4gYmVlbgotCSAqIGNyZWF0ZWQgeWV0LCB0aGlzIHdpbGwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlcXVlc3RTaHV0ZG93bigpIHsJCQotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIENsb3NpbmcgdGhlIHNlcnZlciBzb2NrZXQgc2hvdWxkIGNhdXNlIGEgYnJlYWsuCi0JCXRyeSB7Ci0JCQlTZXJ2ZXJTb2NrZXQgc3J2ID0gc2VydmVyOwotCQkJc2VydmVyID0gbnVsbDsJLy8gU28gdGhhdCBzZXJ2ZXIga25vd3MgaXQgaXMgYmVpbmcgc2h1dGRvd24gYW5kIG5vdCBwcmludCBleGNlcHRpb24gbXNnLgotCQkJc3J2LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJlcXVlc3QgYSBjYWxsYmFjayBzdHJlYW0gdG8gd3JpdGUgdG8uCi0JICogV2hlbiBkb25lLCB0aGUgc3RyZWFtIHNob3VsZCBiZSBjbG9zZWQgdG8gcmVsZWFzZSB0aGUgY29ubmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIHJlcXVlc3RTdHJlYW0oaW50IGNhbGxiYWNrSUQsIGludCBtc2dJRCkgIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJQ2FsbGJhY2tIYW5kbGVyIGggPSAoQ2FsbGJhY2tIYW5kbGVyKSBnZXRGcmVlQ2FsbGJhY2tIYW5kbGVyKCk7Ci0JCWlmIChoID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29tbWFuZEV4Y2VwdGlvbigiTm8gY2FsbGJhY2sgaGFuZGxlciByZXRyaWV2ZWQuIiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQkJaC5pbml0aWF0ZUNhbGxiYWNrU3RyZWFtKGNhbGxiYWNrSUQsIG1zZ0lEKTsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja091dHB1dFN0cmVhbShoLCB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWdvaW5nRG93biA9IHRydWU7Ci0JCXNhZmVDbGVhbi5pbnRlcnJ1cHQoKTsJLy8gTGV0IHNhZmVDbGVhbiBrbm93IHRvIGNvbWUgZG93bi4KLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJc2VydmVyLmNsb3NlKCk7CS8vIENsb3NlIGl0IHNvIHRoYXQgbm8gbW9yZSByZXF1ZXN0cyBjYW4gYmUgbWFkZS4KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQotCQkvLyBHbyB0aHJvdWdoIGVhY2ggdGhyZWFkIGFuZCBhc2sgaXQgdG8gY2xvc2UuIE1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0IHNvIHRoYXQgd2UKLQkJLy8gd29uJ3QgZ2V0IGludG8gZGVhZGxvY2tzLgotCQlDb25uZWN0aW9uVGhyZWFkW10gdGhyZWFkc0FycmF5ID0gKENvbm5lY3Rpb25UaHJlYWRbXSkgdGhyZWFkcy50b0FycmF5KG5ldyBDb25uZWN0aW9uVGhyZWFkWzBdKTsKLQkJZm9yIChpbnQgaT0wOyBpPHRocmVhZHNBcnJheS5sZW5ndGg7IGkrKykgewotCQkJLy8gVGhpcyBpcyBhIGhhcnNoIHdheSB0byBzaHV0IGEgY29ubmVjdGlvbiBkb3duLCBidXQgdGhlcmUncyBubwotCQkJLy8gb3RoZXIgd2F5IEkga25vdyBvZiB0byBpbnRlcnJ1cHQgdGhlIHJlYWQgb24gYSBzb2NrZXQuCi0JCQl0aHJlYWRzQXJyYXlbaV0uY2xvc2UoKTsKLQkJfQotCQkJCi0JCS8vIE5vdyB0aGF0IHRoZXkndmUgYmVlbiB0b2xkIHRvIGNsb3NlLCB3YWl0IG9uIGVhY2ggb25lIHRvIGZpbmlzaC4KLQkJZm9yIChpbnQgaT0wOyBpPHRocmVhZHNBcnJheS5sZW5ndGg7IGkrKykKLQkJCXRyeSB7Ci0JCQkJdGhyZWFkc0FycmF5W2ldLmpvaW4oMTAwMDApOwkvLyBXYWl0IHRlbiBzZWNvbmRzLCBpZiBsb25nZXIsIGp1c3QgZ28gb24gdG8gbmV4dCBvbmUuCi0JCQkJaWYgKHRocmVhZHNBcnJheVtpXS5pc0FsaXZlKCkpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIENvbm5lY3Rpb24gIitpKyIgZGlkIG5vdCBkaWUuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQotCQlpZiAoc2FmZUNsZWFuLmlzQWxpdmUoKSkgewotCQkJdHJ5IHsJCi0JCQkJc2FmZUNsZWFuLmpvaW4oMTAwMDApOwotCQkJCWlmIChzYWZlQ2xlYW4uaXNBbGl2ZSgpKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBDbGVhbnVwIHRocmVhZCBkaWQgbm90IGRpZS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCQotCQkvLyBOb3cgY2xvc2UgdGhlIGNhbGxiYWNrcy4KLQkJc3luY2hyb25pemVkKGZDYWxsYmFja0hhbmRsZXJQb29sKSB7Ci0JCQkvLyBOb3cgd2Ugd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgZnJlZSBoYW5kbGVycyBhbmQgY2xvc2UgdGhlbSBwcm9wZXJseS4KLQkJCUl0ZXJhdG9yIGl0ciA9IGZDYWxsYmFja0hhbmRsZXJQb29sLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCSgoQ2FsbGJhY2tIYW5kbGVyKSBpdHIubmV4dCgpKS5jbG9zZUhhbmRsZXIoKTsKLQkJCX0KLQkJCQotCQkJZkNhbGxiYWNrSGFuZGxlclBvb2wuY2xlYXIoKTsKLQkJfQkKLQkJCi0JCUxpc3QgcnVubmFibGVzID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlydW5uYWJsZXMgPSBzaHV0ZG93blJ1bm5hYmxlczsKLQkJCXNodXRkb3duUnVubmFibGVzID0gbnVsbDsKLQkJfQotCQlpZiAocnVubmFibGVzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcnVubmFibGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChSdW5uYWJsZSkgaXRyLm5leHQoKSkucnVuKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZyZWUgY2FsbGJhY2sgaGFuZGxlcgotCSAqLwotCXB1YmxpYyBJQ2FsbGJhY2tIYW5kbGVyIGdldEZyZWVDYWxsYmFja0hhbmRsZXIoKSB7Ci0JCXN5bmNocm9uaXplZChmQ2FsbGJhY2tIYW5kbGVyUG9vbCkgewotCQkJaWYgKCFmQ2FsbGJhY2tIYW5kbGVyUG9vbC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIChJQ2FsbGJhY2tIYW5kbGVyKSBmQ2FsbGJhY2tIYW5kbGVyUG9vbC5wb3AoKTsKLQkJCS8vIGVsc2Ugd2UgbmVlZCB0byBhbGxvY2F0ZSBvbmUuCQkJCi0JCQlyZXR1cm4gY3JlYXRlQ2FsbGJhY2tIYW5kbGVyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTWFrZSBhIG5ldyBjYWxsYmFjayBoYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIElDYWxsYmFja0hhbmRsZXIgY3JlYXRlQ2FsbGJhY2tIYW5kbGVyKCkgewotCQlTb2NrZXQgY2FsbGJhY2tTb2NrZXQgPSByZXF1ZXN0Q2FsbGJhY2tTb2NrZXQoKTsKLQkJaWYgKGNhbGxiYWNrU29ja2V0ICE9IG51bGwpIHsKLQkJCUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcihjYWxsYmFja1NvY2tldCwgdGhpcyk7Ci0JCQlpZiAoaGFuZGxlci5pc0Nvbm5lY3RlZCgpKQotCQkJCXJldHVybiBoYW5kbGVyOwotCQkJCQotCQkJLy8gRmFpbGVkLCBjbG9zZSB0aGUgc29ja2V0LgotCQkJdHJ5IHsKLQkJCQljYWxsYmFja1NvY2tldC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JLyoqCi0JICogRnJlZSB0aGUgaGFuZGxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJldHVybkNhbGxiYWNrSGFuZGxlcihJQ2FsbGJhY2tIYW5kbGVyIGFIYW5kbGVyKSB7Ci0JCUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gKENhbGxiYWNrSGFuZGxlcikgYUhhbmRsZXI7Ci0JCWlmIChoYW5kbGVyLmlzQ29ubmVjdGVkKCkpCi0JCQlzeW5jaHJvbml6ZWQgKGZDYWxsYmFja0hhbmRsZXJQb29sKSB7Ci0JCQkJaWYgKGZDYWxsYmFja0hhbmRsZXJQb29sLnNpemUoKSA8IE5VTUJFUl9GUkVFX0NBTExCQUNLUykKLQkJCQkJZkNhbGxiYWNrSGFuZGxlclBvb2wucHVzaChoYW5kbGVyKTsKLQkJCQllbHNlCi0JCQkJCWhhbmRsZXIuY2xvc2VIYW5kbGVyKCk7CS8vIFdlIGRvbid0IG5lZWQgdG8gbWFpbnRhaW4gbW9yZSB0aGFuIGZpdmUgZnJlZSBjb25uZWN0aW9ucy4KLQkJCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJvY2VzcyBhIGNhbGxiYWNrLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9DYWxsYmFjayhJQ2FsbGJhY2tSdW5uYWJsZSBydW4pIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSAoQ2FsbGJhY2tIYW5kbGVyKSBnZXRGcmVlQ2FsbGJhY2tIYW5kbGVyKCk7Ci0JCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJ1bi5ydW4oaGFuZGxlcik7Ci0JCQkJfSBjYXRjaCAoQ29tbWFuZEVycm9yRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVGhpcyBpcyBjb21tYW5kIGVycm9yLCBjb25uZWN0aW9uIHN0aWxsIGdvb2QsIGRvbid0IHJldHJ5LCBqdXN0IHBhc3MgaXQgb24uCi0JCQkJCS8vIEl0IG1lYW5zIHRoZSBvdGhlciBzaWRlIHNhaWQgSSBwcm9jZXNzZWQgaXQsIGJ1dCB0aGVyZSBpcyBhbiBlcnJvci4KLQkJCQkJdGhyb3cgZTsKLQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCFlLmlzUmVjb3ZlcmFibGUoKSkgewotCQkJCQkJLy8gQ2xvc2UgdGhpcyBoYW5kbGVyIGFuZCB0cnkgYSBuZXcgb25lLCBvbmUgbW9yZSB0aW1lLgotCQkJCQkJaGFuZGxlci5jbG9zZUhhbmRsZXIoKTsKLQkJCQkJCWhhbmRsZXIgPSAoQ2FsbGJhY2tIYW5kbGVyKSBnZXRGcmVlQ2FsbGJhY2tIYW5kbGVyKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJldHVybiBydW4ucnVuKGhhbmRsZXIpOwkJCQkJCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGVBZ2FpbikgewotCQkJCQkJCS8vIEl0IGZhaWxlZCBhZ2FpbiwganVzdCBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgcmV0aHJvdyB0aGUgZXhjZXB0aW9uLgotCQkJCQkJCWhhbmRsZXIuY2xvc2VIYW5kbGVyKCk7Ci0JCQkJCQkJdGhyb3cgZUFnYWluOwotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCXRocm93IGU7CS8vIFJlY292ZXJhYmxlLCByZXRocm93IGV4Y2VwdGlvbi4KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXJldHVybkNhbGxiYWNrSGFuZGxlcihoYW5kbGVyKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQl0aHJvdyBuZXcgQ29tbWFuZEV4Y2VwdGlvbigiTm8gY2FsbGJhY2sgaGFuZGxlciByZXRyaWV2ZWQuIiwgbnVsbCk7CS8vJE5PTi1OTFMtMSQKLQkJCi0JfQotCQotCS8qCi0JICogUmVnaXN0ZXIgdGhlIHNlcnZlci4gUmV0dXJuIGlmIGlkZSBzdGlsbCBhY3RpdmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVnaXN0ZXJTZXJ2ZXIoaW50IHZtc2VydmVyUG9ydCkgewotCQlTb2NrZXQgc29ja2V0ID0gZ2V0U29ja2V0KCk7Ci0JCWlmIChzb2NrZXQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0JCQkJRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJb3V0LndyaXRlQnl0ZShDb21tYW5kcy5SRU1PVEVfU1RBUlRFRCk7Ci0JCQkJCW91dC53cml0ZUludChyZWdpc3RyeUtleSk7Ci0JCQkJCW91dC53cml0ZUludCh2bXNlcnZlclBvcnQpOwotCQkJCQlvdXQuZmx1c2goKTsKLQkJCQkJcmV0dXJuIGluLnJlYWRCb29sZWFuKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlzb2NrZXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQkJCQkJCi0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIFJlcXVlc3QgdGhlIGNhbGxiYWNrIHNvY2tldC4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXNuJ3Qgb25lLgotCSAqLwotCXByaXZhdGUgU29ja2V0IHJlcXVlc3RDYWxsYmFja1NvY2tldCgpIHsKLQkJU29ja2V0IHNvY2tldCA9IGdldFNvY2tldCgpOwotCQlpZiAoc29ja2V0ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gY2xvc2VTb2NrZXQgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0JCQkJRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJb3V0LndyaXRlQnl0ZShDb21tYW5kcy5BVFRBQ0hfQ0FMTEJBQ0spOwotCQkJCQlvdXQud3JpdGVJbnQocmVnaXN0cnlLZXkpOwotCQkJCQlvdXQuZmx1c2goKTsKLQkJCQkJY2xvc2VTb2NrZXQgPSAhaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQkJcmV0dXJuICFjbG9zZVNvY2tldCA/IHNvY2tldCA6IG51bGw7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGNsb3NlU29ja2V0KSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCQl0cnkgewotCQkJCQkJCW91dC5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjbG9zZVNvY2tldCkgewotCQkJCQl0cnkgewotCQkJCQkJc29ja2V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCQkKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQotCi0JcHJvdGVjdGVkIFNvY2tldCBnZXRTb2NrZXQoKSB7Ci0JCS8vIFdlIGFyZSBwdXR0aW5nIGl0IG9mZiBpbnRvIGEgdGhyZWFkIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHRpbWVvdXQgY2FwYWJpbGl0aWVzIG9uIGdldHRpbmcgYSBzb2NrZXQuCi0JCS8vIFNvIHdlIG5lZWQgdG8gYWxsb3cgZm9yIHRoYXQuCQkKLQkJZmluYWwgU29ja2V0W10gc2NBcnJheSA9IG5ldyBTb2NrZXRbMV07Ci0JCWZpbmFsIGJvb2xlYW5bXSB3YWl0aW5nID0gbmV3IGJvb2xlYW5bXSB7dHJ1ZX07CQkKLQkJVGhyZWFkIGRvSXQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlTb2NrZXQgc2MgPSBuZXcgU29ja2V0KCJsb2NhbGhvc3QiLCBtYXN0ZXJJREVTb2NrZXRQb3J0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJCWlmICh3YWl0aW5nWzBdKQotCQkJCQkJCXNjQXJyYXlbMF0gPSBzYzsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzYy5jbG9zZSgpOwkvLyBXZSBhcmUgbm8gbG9uZ2VyIHdhaXRpbmcgb24gdGhpcyB0aHJlYWQgc28gY2xvc2UgdGhlIHNvY2tldCBzaW5jZSBubyBvbmUgd2lsbCB1c2UgaXQuCi0JCQkJCX0JCQkJCQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZG9JdC5zdGFydCgpOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJdHJ5IHsKLQkJCQlkb0l0LmpvaW4oNjAwMDApOwotCQkJCXN5bmNocm9uaXplZCAoZG9JdCkgewotCQkJCQl3YWl0aW5nWzBdID0gZmFsc2U7CS8vIFRvIGxldCBpdCBrbm93IHdlIGFyZSBubyBsb25nZXIgd2FpdGluZwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNjQXJyYXlbMF0gPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZG4ndCByZXRyaWV2ZSBhIHNvY2tldCBmcm9tIG1hc3RlciBzZXJ2ZXIgaW4gNjAgc2Vjb25kcy4iKTsJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7CS8vIENvdWxkbid0IGdldCBvbmUsIHByb2JhYmx5IHNlcnZlciBpcyBkb3duLgotCQl9Ci0JCQkKLQkJcmV0dXJuIHNjQXJyYXlbMF07Ci0JfQotCQotCXByaXZhdGUgTGlzdCBzaHV0ZG93blJ1bm5hYmxlczsKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU2h1dGRvd25MaXN0ZW5lcihSdW5uYWJsZSBydW5uYWJsZSkgewotCQlpZiAoc2h1dGRvd25SdW5uYWJsZXMgPT0gbnVsbCkgewotCQkJc2h1dGRvd25SdW5uYWJsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSBpZiAoc2h1dGRvd25SdW5uYWJsZXMuY29udGFpbnMocnVubmFibGUpKQotCQkJcmV0dXJuOwotCQlzaHV0ZG93blJ1bm5hYmxlcy5hZGQocnVubmFibGUpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU2h1dGRvd25MaXN0ZW5lcihSdW5uYWJsZSBydW5uYWJsZSkgewotCQlpZiAoc2h1dGRvd25SdW5uYWJsZXMgIT0gbnVsbCkKLQkJCXNodXRkb3duUnVubmFibGVzLnJlbW92ZShydW5uYWJsZSk7Ci0JfQotCi0KLQlwdWJsaWMgSVZNU2VydmVyIGdldElWTVNlcnZlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9TdGFja1RyYWNlVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ucHJveHkvdm1fcmVtb3Rldm0vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3Byb3h5L3ZtL3JlbW90ZS9TdGFja1RyYWNlVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGViNmFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnByb3h5L3ZtX3JlbW90ZXZtL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wcm94eS92bS9yZW1vdGUvU3RhY2tUcmFjZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LnZtLnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFN0YWNrVHJhY2VVdGlsaXR5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6Mzk6MDggJCAKLSAqLwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0vKioKLSAqIEEgdXRpbGl0eSB0byBnZXQgdGhlIHN0YWNrIHRyYWNlIGZyb20gYW4gZXhjZXB0aW9uCi0gKiBiYWNrIHRvIHRoZSBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFja1RyYWNlVXRpbGl0eSB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnRTdGFja1RyYWNlKFRocm93YWJsZSB0KSB7Ci0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCXQucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcih3cml0ZXIpKTsKLQkJcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotCX0KLQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmYzNDllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InVpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iYmVhbmluZm91aSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0NjNhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMDc0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2d0cmFjZWZpbGU9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ2xldmVsPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZTQ5YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5kZWJ1Zy51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZzwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm88L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmplbS5wcm94eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmlkZTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJhYmMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0jVGh1IEp1biAxNiAxMzoyMjowNiBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmZjYyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jV2VkIE1heSAxMSAxNjoyMDoxNSBFRFQgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9amF2YTtqYXZheDtvcmc7b3JnLmVjbGlwc2Uud3RwO29yZy5lY2xpcHNlLmplbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZG07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RlO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmpjbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qYXZhO29yZy5lY2xpcHNlLnZlO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkMjk4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZW0udWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLjEKLUJ1bmRsZS1DbGFzc1BhdGg6IHVpLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUuSkVNVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHksCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5LnJlbW90ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmpkdC51aSwKLSBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8sCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLnByb3h5LAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcsCi0gb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JJTGlzdEVsZW1lbnRTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JJTGlzdEVsZW1lbnRTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI0ZjJlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CSUxpc3RFbGVtZW50U29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJJTGlzdEVsZW1lbnRTb3J0ZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb0VudHJ5OwotCi0vKioKLSAqIFNvcnRlciBmb3Igc29ydGluZyBCUEJlYW5pbmZvTGlzdEVsZW1lbnRzIHdpdGhpbiB0aGUgbWFpbiBsaXN0LgotICogCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCSUxpc3RFbGVtZW50U29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkKLQkvKgotCSAqIEBzZWUgVmlld2VyU29ydGVyI2NhdGVnb3J5KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJQQmVhbmluZm9MaXN0RWxlbWVudCkgewotCQkJQlBCZWFuaW5mb0xpc3RFbGVtZW50IGVsZW1lbnQgPSAoQlBCZWFuaW5mb0xpc3RFbGVtZW50KSBvYmo7Ci0JCQkKLQkJCXN3aXRjaCAoKChCZWFuaW5mb0VudHJ5KSBlbGVtZW50LmdldEVudHJ5KCkpLmdldEtpbmQoKSkgewotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIDQ7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDoKLQkJCQlyZXR1cm4gMTsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U6Ci0JCQkJcmV0dXJuIDA7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6Ci0JCQkJcmV0dXJuIDM7Ci0JCQljYXNlIEJlYW5pbmZvRW50cnkuQklFX1BMVUdJTjoKLQkJCQlyZXR1cm4gNTsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJcmV0dXJuIDI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhdGVnb3J5KG9iaik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFZpZXdlclNvcnRlciNjb21wYXJlKCkKLQkgKi8JCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQkKLQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJCQotCQlpZiAoKGUxIGluc3RhbmNlb2YgQlBCZWFuaW5mb0xpc3RFbGVtZW50KSAmJiAoZTIgaW5zdGFuY2VvZiBCUEJlYW5pbmZvTGlzdEVsZW1lbnQpKSB7Ci0JCQlCZWFuaW5mb0VudHJ5IHAxID0gKEJlYW5pbmZvRW50cnkpICgoQlBCZWFuaW5mb0xpc3RFbGVtZW50KSBlMSkuZ2V0RW50cnkoKTsKLQkJCUJlYW5pbmZvRW50cnkgcDIgPSAoQmVhbmluZm9FbnRyeSkgKChCUEJlYW5pbmZvTGlzdEVsZW1lbnQpIGUyKS5nZXRFbnRyeSgpOwotCQkJCi0JCQkvLyBDb21wYXJlIHBhdGhzCi0JCQlyZXR1cm4gcDEuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuY29tcGFyZVRvKHAyLmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JfQkKLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JQQmVhbmluZm9MaXN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQlBCZWFuaW5mb0xpc3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MmQ1YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQlBCZWFuaW5mb0xpc3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJQQmVhbmluZm9MaXN0RWxlbWVudC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLkJlYW5pbmZvRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuU2VhcmNocGF0aEVudHJ5OwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEJQQmVhbmluZm9MaXN0RWxlbWVudCBleHRlbmRzIEJQTGlzdEVsZW1lbnQgewotCi0JQlBTZWFyY2hMaXN0RWxlbWVudFtdIHNlYXJjaHBhdGhzOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCUEJlYW5pbmZvTGlzdEVsZW1lbnQuCi0JICogVGhlIHNlYXJjaFBhdGhzIGlzIHRoZSBpbml0aWFsIGxpc3QsIGl0IGlzIGFzc3VtZWQgdGhhdAotCSAqIHRoZSBiZWFuaW5mb0VudHJ5IGhhcyB0aGVzZSBzZWFyY2hwYXRocyBpbiB0aGVtIHRvby4KLQkgKi8KLQlwdWJsaWMgQlBCZWFuaW5mb0xpc3RFbGVtZW50KEJlYW5pbmZvRW50cnkgZW50cnksIEJQU2VhcmNoTGlzdEVsZW1lbnRbXSBzZWFyY2hwYXRocywgYm9vbGVhbiBtaXNzaW5nKSB7Ci0JCXN1cGVyKGVudHJ5LCBtaXNzaW5nKTsKLQkJdGhpcy5zZWFyY2hwYXRocyA9IHNlYXJjaHBhdGhzICE9IG51bGwgPyBzZWFyY2hwYXRocyA6IG5ldyBCUFNlYXJjaExpc3RFbGVtZW50WzBdOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIGVudHJ5IGFzIGV4cG9ydGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydGVkKGJvb2xlYW4gZXhwb3J0ZWQpIHsKLQkJKChCZWFuaW5mb0VudHJ5KSBlbnRyeSkuc2V0SXNFeHBvcnRlZChleHBvcnRlZCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEJQTGlzdEVsZW1lbnQjY2FuRXhwb3J0QmVDaGFuZ2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeHBvcnRCZUNoYW5nZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogQHNlZSBCUExpc3RFbGVtZW50I2lzRXhwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhwb3J0ZWQoKSB7Ci0JCXJldHVybiAoKEJlYW5pbmZvRW50cnkpIGVudHJ5KS5pc0V4cG9ydGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBsaXN0IG9mIFNlYXJjaHBhdGhzIGZvciB0aGlzIEJlYW5pbmZvIEVsZW1lbnQuCi0JICovCi0JcHVibGljIEJQU2VhcmNoTGlzdEVsZW1lbnRbXSBnZXRTZWFyY2hwYXRocygpIHsKLQkJcmV0dXJuIHNlYXJjaHBhdGhzOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIG5ldyBsaXN0LiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBiZWFuaW5mbyBlbnRyeSB0b28uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VhcmNocGF0aHMoQlBTZWFyY2hMaXN0RWxlbWVudFtdIHNlYXJjaHBhdGhzKSB7Ci0JCXRoaXMuc2VhcmNocGF0aHMgPSBzZWFyY2hwYXRoczsKLQkJCi0JCVNlYXJjaHBhdGhFbnRyeVtdIHNwRW50cmllcyA9IG5ldyBTZWFyY2hwYXRoRW50cnlbc2VhcmNocGF0aHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hwYXRocy5sZW5ndGg7IGkrKykgewotCQkJQlBTZWFyY2hMaXN0RWxlbWVudCBicHMgPSBzZWFyY2hwYXRoc1tpXTsKLQkJCXNwRW50cmllc1tpXSA9IChTZWFyY2hwYXRoRW50cnkpIGJwcy5nZXRFbnRyeSgpOwotCQl9Ci0JCQotCQkoKEJlYW5pbmZvRW50cnkpIGVudHJ5KS5zZXRTZWFyY2hQYXRocyhzcEVudHJpZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JQTGlzdEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JQTGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1NjI0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CUExpc3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJQTGlzdEVsZW1lbnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLklCZWFuaW5mb3NEb2NFbnRyeTsKLS8qKgotICogQSBCYXNlIExpc3RFbGVtZW50IChpLmUuIGVsZW1lbnQgaW4gYSBsaXN0IHZpZXdlcikgZm9yCi0gKiBhIEJlYW5JbmZvIFNlYXJjaCBQYXRoIEVudHJ5LgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCUExpc3RFbGVtZW50IGV4dGVuZHMgT2JqZWN0IHsKLQlwcm90ZWN0ZWQgSUJlYW5pbmZvc0RvY0VudHJ5IGVudHJ5OwotCXByb3RlY3RlZCBib29sZWFuIG1pc3Npbmc7IC8vIExpYnJhcnkvZm9sZGVyL2NsYXNzcGF0aCBlbnRyeSBmb3IgdGhpcyBlbnRyeSBjb3VsZCBub3QgYmUgZm91bmQuCi0KLQlwdWJsaWMgQlBMaXN0RWxlbWVudChJQmVhbmluZm9zRG9jRW50cnkgZW50cnksIGJvb2xlYW4gbWlzc2luZykgewotCQl0aGlzLmVudHJ5ID0gZW50cnk7Ci0JCXRoaXMubWlzc2luZyA9IG1pc3Npbmc7Ci0JfQotCi0JcHVibGljIElCZWFuaW5mb3NEb2NFbnRyeSBnZXRFbnRyeSgpIHsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWlzc2luZygpIHsKLQkJcmV0dXJuIG1pc3Npbmc7Ci0JfQotCi0JLyoqCi0JICogQ2VydGFpbiBlbnRyaWVzIGNhbm5vdCBoYXZlIHRoZWlyIGV4cG9ydCBzdGF0dXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5FeHBvcnRCZUNoYW5nZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgZW50cnkgaXMgZXhwb3J0ZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFeHBvcnRlZCgpOwotCi0JLyoqCi0JICogSWYgZXhwb3J0IGNhbiBiZSBjaGFuZ2VkLCBjaGFuZ2UgaXQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwb3J0ZWQoYm9vbGVhbiBleHBvcnRlZCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JQU2VhcmNoTGlzdEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JQU2VhcmNoTGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0MzMxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CUFNlYXJjaExpc3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJQU2VhcmNoTGlzdEVsZW1lbnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5TZWFyY2hwYXRoRW50cnk7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgQlBTZWFyY2hMaXN0RWxlbWVudCBleHRlbmRzIEJQTGlzdEVsZW1lbnQgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhwb3J0ZWQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcGFja2FnZU1pc3Npbmc7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEJQU2VhcmNoTGlzdEVsZW1lbnQuCi0JICogQHBhcmFtIGVudHJ5Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gaW5NaXNzaW5nCi0JICovCi0JcHVibGljIEJQU2VhcmNoTGlzdEVsZW1lbnQoCi0JCVNlYXJjaHBhdGhFbnRyeSBlbnRyeSwKLQkJYm9vbGVhbiBtaXNzaW5nLAotCQlib29sZWFuIHBhY2thZ2VNaXNzaW5nLAotCQlib29sZWFuIGV4cG9ydGVkKSB7Ci0JCXN1cGVyKGVudHJ5LCBtaXNzaW5nKTsKLQotCQl0aGlzLnBhY2thZ2VNaXNzaW5nID0gcGFja2FnZU1pc3Npbmc7Ci0JCXRoaXMuZXhwb3J0ZWQgPSBleHBvcnRlZDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQlBMaXN0RWxlbWVudCNjYW5FeHBvcnRCZUNoYW5nZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4cG9ydEJlQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBCUExpc3RFbGVtZW50I2lzRXhwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhwb3J0ZWQoKSB7Ci0JCXJldHVybiBleHBvcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGUgcGFja2FnZSBtaXNzaW5nLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFja2FnZU1pc3NpbmcoKSB7Ci0JCXJldHVybiBwYWNrYWdlTWlzc2luZzsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEJQTGlzdEVsZW1lbnQjc2V0RXhwb3J0ZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRlZChib29sZWFuIGV4cG9ydGVkKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuSW5mb1VJTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5JbmZvVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNlNTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5JbmZvVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCZWFuSW5mb1VJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBCZWFuSW5mb1VJTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhdGhEaWFsb2dfQ2hvb3NlUGFja2FnZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGF0aERpYWxvZ19SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGF0aERpYWxvZ19EZXNjX0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhdGhEaWFsb2dfTW9kaWZ5U2VhcmNoUGF0aHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGF0aERpYWxvZ19Ob3RFZGl0YWJsZV9JTkZPXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hQYXRoRGlhbG9nX1BhY2thZ2VQcmVzZW50X0lORk9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhdGhEaWFsb2dfSW5wdXREaWFsb2dfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGF0aERpYWxvZ19JbnB1dERpYWxvZ19NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvUGF0aHNCbG9ja19FeHBvcnRBbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9QYXRoc0Jsb2NrX1VuZXhwb3J0QWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvUGF0aHNCbG9ja19QYWdlX1RhYl9QYWNrYWdlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb1BhdGhzQmxvY2tfUGFnZV9UYWJfQ2xhc3NlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkRm9sZGVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkSkFSczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkRXh0ZXJuYWxKQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX0FkZFZhcmlhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvc1dvcmtib29rUGFnZV9BZGRQcm9qZWN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfTW9kaWZ5UGF0aHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX1JlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfTGlzdF9UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfQ2xhc3Nlc19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX0pBUnNfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19KQVJzX01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19FeHRKQVJzX1RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19Qcm9qZWN0c19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX0NsYXNzZXNfUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfUHJvamVjdHNfUHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VzV29ya2Jvb2tfQ2hvb3NlUGFja2FnZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZXNXb3JrYm9va19DaG9vc2VEZWZpbmVkUGF0aHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZXNXb3JrYm9va19SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZXNXb3JrYm9va19MYWJlbFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZXNXb3JrYm9va19TZWxlY3Rpb25EaWFsb2dfRGVmaW5lZFBhdGhzX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VzV29ya2Jvb2tfU2VsZWN0aW9uRGlhbG9nX0RlZmluZWRQYXRoc19NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsUHJvdmlkZXJfTGlicmFyeV9Gb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxQcm92aWRlcl9MaWJyYXJ5X19QYXRoTGFzdFNlZ21lbnRfUGF0aFJlbGF0aXZlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbFByb3ZpZGVyX0xpYnJhcnlfX1BhdGhMYXN0U2VnbWVudF9QYXRoRXhjZXB0TGFzdF87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxQcm92aWRlcl9WYXJpYWJsZV9fbmFtZV9QYXRoT1NTdHJpbmdfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsUHJvdmlkZXJfX3BhY2thZ2VOYW1lX1BhdGhfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfdmFyaWFibGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVTZWxlY3Rpb25CbG9ja192YXJpYWJsZV9idXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVTZWxlY3Rpb25CbG9ja19leHRlbnNpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVTZWxlY3Rpb25CbG9ja19leHRlbnNpb25fYnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZnVsbHBhdGhfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9lbnRlcm5hbWVfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXJyb3JfbmFtZW5vdGV4aXN0c19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9wYXRoZXhpc3RzX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2Vycm9yX2ludmFsaWRleHRlbnNpb25fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfd2FybmluZ19wYXRobm90ZXhpc3RzX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfRXh0SmFyRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvX1VJX19lcnJvcnRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvX1VJX19lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1Byb3BlcnRpZXNQYWdlX0lORk9fX25vamF2YXByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9Qcm9wZXJ0aWVzUGFnZV9JTkZPX19jbG9zZWRwcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fZW5hYmxlYmVhbmluZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF91cF9idXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX2Rvd25fYnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9yZW1vdmVfYnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VyYWNocGF0aF90YWJfb3JkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9QYXRoc0Jsb2NrX1dBUk5fX3NlYXJjaHBhdGhfbWlzc2luZ19wYXRoX2Zvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfb3BlcmF0aW9uZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19hZGRzZWFyY2hwYXRoX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fYWRkc2VhcmNocGF0aF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3dhcm5pbmdfRW50cnlNaXNzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9hZGRfYnV0dG9uOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQmVhbkluZm9VSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQmVhbmluZm9FbnRyeVNlYXJjaHBhdGhEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5pbmZvRW50cnlTZWFyY2hwYXRoRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjY2YwMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQmVhbmluZm9FbnRyeVNlYXJjaHBhdGhEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvRW50cnlTZWFyY2hwYXRoRGlhbG9nLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMTAvMDQgMTc6NTk6MTcgJCAKLSAqLwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLlNlYXJjaHBhdGhFbnRyeTsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGRpc3BsYXkgYW5kIG1vZGlmeSB0aGUgc2VhcmNoIHBhdGgKLSAqIHdpdGhpbiBhIEJlYW5pbmZvRW50cnkuCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuaW5mb0VudHJ5U2VhcmNocGF0aERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIEJQQmVhbmluZm9MaXN0RWxlbWVudCBpbmZvRWxlbWVudDsKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGpQcm9qZWN0OwotCS8vcHJvdGVjdGVkIExpc3REaWFsb2dGaWVsZCBsaXN0RmllbGQ7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgdG9wOwotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcml2YXRlIExhYmVsIGxhYmVsOwotCXByaXZhdGUgQ29tcG9zaXRlIGJ1dHRvbnNCYXI7Ci0JcHJpdmF0ZSBCdXR0b24gdXBidXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZG93bkJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBjaG9vc2VQYWNrYWdlc0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBMaXN0IHRhYmxlRWxlbWVudHM7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0JcHVibGljIEJlYW5pbmZvRW50cnlTZWFyY2hwYXRoRGlhbG9nKAotCQlTaGVsbCBwYXJlbnRTaGVsbCwKLQkJQlBCZWFuaW5mb0xpc3RFbGVtZW50IGluZm9FbGVtZW50LAotCQlJSmF2YVByb2plY3QgalByb2plY3QpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCi0JCXRoaXMuaW5mb0VsZW1lbnQgPSBpbmZvRWxlbWVudDsKLQkJdGhpcy5qUHJvamVjdCA9IGpQcm9qZWN0OwotCQl0aGlzLnRhYmxlRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KAotCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJQmVhbkluZm9VSU1lc3NhZ2VzLlNlYXJjaFBhdGhEaWFsb2dfTW9kaWZ5U2VhcmNoUGF0aHMsIAotCQkJCW5ldyBPYmplY3RbXSB7IGluZm9FbGVtZW50LmdldEVudHJ5KCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCl9KSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRvcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdG9wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwodG9wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLlNlYXJjaFBhdGhEaWFsb2dfRGVzY19MYWJlbCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQljcmVhdGVUYWJsZSgpOwotCQljcmVhdGVCdXR0b25zQmFyKCk7Ci0KLQkJdXBkYXRlUGFja2FnZXNMaXN0KCk7Ci0JCQotCQl1cGRhdGVCdXR0b25zKCk7Ci0KLQkJcmV0dXJuIHRvcDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0YWJsZQkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZSgpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGExID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGExLmhvcml6b250YWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhMS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGExLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGExLnZlcnRpY2FsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQl0YWJsZSA9IG5ldyBUYWJsZSh0b3AsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhMSk7Ci0JCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCS8vdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBCSUxpc3RFbGVtZW50U29ydGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIoalByb2plY3QpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQodGFibGVFbGVtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYnV0dG9uc0JhcgkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25zQmFyKCkgewotCQlSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotCQlyb3dMYXlvdXQudHlwZSA9IG9yZy5lY2xpcHNlLnN3dC5TV1QuVkVSVElDQUw7Ci0JCXJvd0xheW91dC5tYXJnaW5MZWZ0ID0gMzsKLQkJcm93TGF5b3V0LmZpbGwgPSB0cnVlOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YSgpOwotCQlncmlkRGF0YTIuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YTIudmVydGljYWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWJ1dHRvbnNCYXIgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotCQlidXR0b25zQmFyLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJYnV0dG9uc0Jhci5zZXRMYXlvdXQocm93TGF5b3V0KTsKLQkJdXBidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJdXBidXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX3VwX2J1dHRvbik7Ci0JCXVwYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBzZWxlY3RlZCA9IEJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWxlY3RlZExpc3QodGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCUl0ZXJhdG9yIHNlbEl0ciA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHNlbEl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxJdHIubmV4dCgpOwotCQkJCQlpbnQgb2xkSW5kZXggPSB0YWJsZUVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7Ci0JCQkJCWlmKG9sZEluZGV4PjApewotCQkJCQkJdGFibGVFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQl0YWJsZUVsZW1lbnRzLmFkZCgtLW9sZEluZGV4LCBlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWRvd25CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJZG93bkJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfZG93bl9idXR0b24pOwotCQlkb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IHNlbGVjdGVkID0gQmVhbmluZm9QYXRoc0Jsb2NrLmdldFNlbGVjdGVkTGlzdCh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJSXRlcmF0b3Igc2VsSXRyID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoc2VsSXRyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IHNlbEl0ci5uZXh0KCk7Ci0JCQkJCWludCBvbGRJbmRleCA9IHRhYmxlRWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJaWYob2xkSW5kZXg8KHRhYmxlRWxlbWVudHMuc2l6ZSgpLTEpKXsKLQkJCQkJCXRhYmxlRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQkJdGFibGVFbGVtZW50cy5hZGQoKytvbGRJbmRleCwgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTGFiZWwoYnV0dG9uc0JhciwgU1dULk5PTkUpOwotCQljaG9vc2VQYWNrYWdlc0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0JhciwgU1dULk5PTkUpOwotCQljaG9vc2VQYWNrYWdlc0J1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5TZWFyY2hQYXRoRGlhbG9nX0Nob29zZVBhY2thZ2VzKTsKLQkJY2hvb3NlUGFja2FnZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIExpc3QgZWxlbWVudHNUb0FkZCA9IGNob29zZVBhY2thZ2VzKCk7Ci0JCQkJaWYgKGVsZW1lbnRzVG9BZGQgIT0gbnVsbCAmJiAhZWxlbWVudHNUb0FkZC5pc0VtcHR5KCkpIHsKLQkJCQkJdGFibGVFbGVtZW50cy5hZGRBbGwoZWxlbWVudHNUb0FkZCk7Ci0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJdGFibGUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudHNUb0FkZCkpOwotCQkJCQkJfTsKLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJbmV3IExhYmVsKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5TZWFyY2hQYXRoRGlhbG9nX1JlbW92ZSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBzZWxlY3RlZCA9IEJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWxlY3RlZExpc3QodGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCXRhYmxlRWxlbWVudHMucmVtb3ZlQWxsKHNlbGVjdGVkKTsKLQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJaWYodG9wIT1udWxsICYmICF0b3AuaXNEaXNwb3NlZCgpKXsKLQkJCXVwYnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCAmJiBjYW5Nb3ZlVXAoKSk7Ci0JCQlkb3duQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCAmJiBjYW5Nb3ZlRG93bigpKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQgJiYgIXRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0JCQljaG9vc2VQYWNrYWdlc0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlRG93bigpIHsKLQkJaW50W10gaW5kYz0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCQlpbnQgaz0gdGFibGVFbGVtZW50cy5zaXplKCkgLSAxOwotCQlmb3IgKGludCBpPSBpbmRjLmxlbmd0aCAtIDE7IGkgPj0gMCA7IGktLSwgay0tKSB7Ci0JCQlpZiAoaW5kY1tpXSAhPSBrKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlVXAoKSB7Ci0JCWludFtdIGluZGM9IHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGluZGMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbmRjW2ldICE9IGkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhY2thZ2VzTGlzdCgpIHsKLQkJaWYgKGluZm9FbGVtZW50LmdldEVudHJ5KCkuZ2V0S2luZCgpID09IEJlYW5pbmZvRW50cnkuQklFX1BMVUdJTikgewotCQkJLy8gV2UgZG9uJ3QgYWxsb3cgdGhlc2UgdG8gYmUgdXBkYXRlZC4gVGhleSBzaG91bGQgb25seSBiZSB1c2VkIHRocm91Z2gKLQkJCS8vIHJlZ2lzdGVyZWQgbWVjaGFuaXNtcyBhbmQgd2Ugd29uJ3QgYmUgc2hvd2luZyB0aGVtIGhlcmUgbm9ybWFsbHkuCi0JCQlsYWJlbC5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5TZWFyY2hQYXRoRGlhbG9nX05vdEVkaXRhYmxlX0lORk9fKTsgCi0JCQl1cGRhdGVFbmFibGVkU3RhdGUoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRhYmxlRWxlbWVudHMuY2xlYXIoKTsKLQkJdGFibGVFbGVtZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbmZvRWxlbWVudC5nZXRTZWFyY2hwYXRocygpKSk7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKGJvb2xlYW4gYikgewotCQllbmFibGVkID0gYjsKLQkJaWYodG9wIT1udWxsICYmICF0b3AuaXNEaXNwb3NlZCgpKXsKLQkJCWxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl0YWJsZS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAodGFibGUuaXNFbmFibGVkKCkpIHsKLQkJCS8vIElmIHRoZSBmaWVsZCBpcyBub3QgZW5hYmxlZCwgdGhlbiB0aGVyZSBpcyBubyB1cGRhdGUgdG8gcGVyZm9ybS4gV2UgZG9uJ3QKLQkJCS8vIHdhbnQgdG8gYWNjaWRlbnRpYWxseSB3aXBlIG91dCB0aGUgc2VhcmNoIHBhdGhzIGluIHRoaXMgY2FzZS4KLQotCQkJLy8gT3ZlcnJpZGUgdG8gcHV0IHRoZSBsaXN0IG9mIGVsZW1lbnRzIGJhY2sgaW50byB0aGUgQlBCZWFuaW5mb0xpc3RFbGVtZW50Ci0JCQkvLyBVbnRpbCB0aGVuIHRoZXkgYXJlbid0IGFjdHVhbGx5IHVwZGF0ZWQuCi0JCQlpbmZvRWxlbWVudC5zZXRTZWFyY2hwYXRocygKLQkJCQkoQlBTZWFyY2hMaXN0RWxlbWVudFtdKSB0YWJsZUVsZW1lbnRzLnRvQXJyYXkobmV3IEJQU2VhcmNoTGlzdEVsZW1lbnRbdGFibGVFbGVtZW50cy5zaXplKCldKSk7Ci0JCX0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hvb3NlIHRoZSBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgc2VhcmNoIHBhdGguCi0JICovCi0JcHJpdmF0ZSBMaXN0IGNob29zZVBhY2thZ2VzKCkgewotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBnZXRCZWFuaW5mb1Jvb3RzKCk7Ci0JCUxpc3QgbmV3UGFja2FnZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocm9vdHMgIT0gbnVsbCkgewotCQkJLy8gSXQncyB3aXRoaW4gdGhlIHdvcmtzcGFjZSwgc28gd2UgY2FuIGdldCB0aGUgcm9vdHMgYW5kIHBhY2thZ2VzLgotCQkJSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgUGFja2FnZXNXb3JrYm9va1BhZ2UuQ2hvb3NlUGFja2FnZXNTZWxlY3Rpb25WYWxpZGF0b3IoKTsKLQotCQkJLy8gU2hvdyB1cCB0byB0aGUgcGFja2FnZSBmcmFnbWVudCwgZG9uJ3Qgc2hvdyBhbnkgY29udGVudHMgb2YgaXQuCi0JCQlDbGFzc1tdIGFjY2VwdGVkQ2xhc3NlcyA9IG5ldyBDbGFzc1tdIHsgSVBhY2thZ2VGcmFnbWVudFJvb3QuY2xhc3MsIElQYWNrYWdlRnJhZ21lbnQuY2xhc3MgfTsKLQkJCU9iamVjdFtdIHJlamVjdGVkRnJhZ21lbnRzID0gZ2V0RmlsdGVyZWRFeGlzdGluZ0VudHJpZXMocm9vdHMpOwotCi0JCQkvLyBPbmx5IHNob3cgcGFja2FnZSBmcmFnbWVudHMgdGhhdCBoYXZlIGNoaWxkcmVuIChpLmUuIHRoZXJlIGNsYXNzZXMgaW4gaXQsIG5vdCBpbnRlcmVzdGVkCi0JCQkvLyBpbiBpbnRlcm1lZGlhdGUgb25lcyB0aGF0IGhhdmUgbm8gY2xhc3NlcyBkZWZpbmVkIGluIHRoZW0uIFRob3NlIGFyZSBmaWx0ZXJlZCBvdXQuCi0JCQlUeXBlZFZpZXdlckZpbHRlciBmaWx0ZXIgPSBuZXcgVHlwZWRWaWV3ZXJGaWx0ZXIoYWNjZXB0ZWRDbGFzc2VzLCByZWplY3RlZEZyYWdtZW50cykgewotCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJaWYgKHN1cGVyLnNlbGVjdCh2aWV3ZXIsIHBhcmVudEVsZW1lbnQsIGVsZW1lbnQpKSB7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXJldHVybiBwa2cuaGFzQ2hpbGRyZW4oKTsKLQkJCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQotCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgUGFja2FnZU9ubHlDb250ZW50UHJvdmlkZXIoKTsKLQotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfREVGQVVMVCk7Ci0JCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPQotCQkJCW5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBsYWJlbFByb3ZpZGVyLCBwcm92aWRlcik7Ci0JCQlkaWFsb2cuc2V0VGl0bGUoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fYWRkc2VhcmNocGF0aF90aXRsZSk7IAotCi0JCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19hZGRzZWFyY2hwYXRoX2Rlc2NyaXB0aW9uKTsgCi0JCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCQlkaWFsb2cuc2V0SW5wdXQoQXJyYXlzLmFzTGlzdChnZXRCZWFuaW5mb1Jvb3RzKCkpKTsKLQotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJT2JqZWN0W10gZWxlbWVudHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQluZXdQYWNrYWdlTmFtZXMuYWRkKCgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudHNbaV0pLmdldEVsZW1lbnROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIEl0J3Mgbm90IHdpdGhpbiB0aGUgd29ya3NwYWNlCi0JCQlmaW5hbCBMaXN0IGV4aXN0aW5nUGFja2FnZW5hbWVzID0gZ2V0RmlsdGVyZWRFeGlzdGluZ0VudHJpZXMoKTsKLQkJCUlJbnB1dFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgSUlucHV0VmFsaWRhdG9yKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQlpZiAoZXhpc3RpbmdQYWNrYWdlbmFtZXMuY29udGFpbnMobmV3VGV4dCkpCi0JCQkJCQlyZXR1cm4gQmVhbkluZm9VSU1lc3NhZ2VzLlNlYXJjaFBhdGhEaWFsb2dfUGFja2FnZVByZXNlbnRfSU5GT187IAotCQkJCQkJCi0JCQkJCUlTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUobmV3VGV4dCk7Ci0JCQkJCXJldHVybiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LID8gbnVsbCA6IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJfTsKLQkJCUlucHV0RGlhbG9nIGRpYWxvZyA9IG5ldyBJbnB1dERpYWxvZyhnZXRTaGVsbCgpLCBCZWFuSW5mb1VJTWVzc2FnZXMuU2VhcmNoUGF0aERpYWxvZ19JbnB1dERpYWxvZ19UaXRsZSwgQmVhbkluZm9VSU1lc3NhZ2VzLlNlYXJjaFBhdGhEaWFsb2dfSW5wdXREaWFsb2dfTWVzc2FnZSwgbnVsbCwgdmFsaWRhdG9yKTsgCi0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0JCQkJbmV3UGFja2FnZU5hbWVzLmFkZChkaWFsb2cuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlpZiAobmV3UGFja2FnZU5hbWVzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJTGlzdCBuZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QobmV3UGFja2FnZU5hbWVzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UGFja2FnZU5hbWVzLnNpemUoKTsgaSsrKQotCQkJbmV3RWxlbWVudHMuYWRkKAotCQkJCW5ldyBCUFNlYXJjaExpc3RFbGVtZW50KG5ldyBTZWFyY2hwYXRoRW50cnkoKFN0cmluZykgbmV3UGFja2FnZU5hbWVzLmdldChpKSksIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKLQkJcmV0dXJuIG5ld0VsZW1lbnRzOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2VmcmFnbWVudCByb290cyBmb3IgdGhlIGdpdmVuIGJlYW5pbmZvIGVudHJ5LgotCSAqIFJldHVybiBudWxsIGlmIGl0IGNhbiBiZSBoYW5kbGVkIChpLmUuIG5vdCBpbiBhIHByb2plY3Qgc29tZSB3aGVyZSkuCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0QmVhbmluZm9Sb290cygpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IG51bGw7Ci0JCWlmIChpbmZvRWxlbWVudC5nZXRFbnRyeSgpLmdldEtpbmQoKSAhPSBCZWFuaW5mb0VudHJ5LkJJRV9QTFVHSU4pIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSByZXNvbHZlZCA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoKChCZWFuaW5mb0VudHJ5KSBpbmZvRWxlbWVudC5nZXRFbnRyeSgpKS5nZXRDbGFzc3BhdGhFbnRyeSgpKTsKLQkJCUlSZXNvdXJjZSByZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocmVzb2x2ZWQuZ2V0UGF0aCgpKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXhpc3RzKCkpIHsKLQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJLy8gSXQgaXMgYSBwcm9qZWN0IGl0c2VsZi4KLQkJCQkJSUphdmFQcm9qZWN0IGpwID0gKElKYXZhUHJvamVjdCkgSmF2YUNvcmUuY3JlYXRlKHJlcyk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoanAgIT0gbnVsbCkKLQkJCQkJCQlyb290cyA9IGpwLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7IC8vIEFsbCBvZiB0aGUgcm9vdHMgaW4gdGhlIHByb2plY3QgYXJlIGFwcGxpY2FibGUuCi0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBJdCBpcyB3aXRoaW4gYW5vdGhlciBwcm9qZWN0Ci0JCQkJCUlQcm9qZWN0IGNvbnRhaW5pbmdQcm9qZWN0ID0gcmVzLmdldFByb2plY3QoKTsKLQkJCQkJSUphdmFQcm9qZWN0IGpwID0gSmF2YUNvcmUuY3JlYXRlKGNvbnRhaW5pbmdQcm9qZWN0KTsKLQkJCQkJaWYgKGpwICE9IG51bGwpIHsKLQkJCQkJCS8vIFRoZSByb290cyBpZiB0aGlzIGlzIGluIHRoZSBjbGFzc3BhdGggb2YgdGhpcyBwcm9qZWN0Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBqcC5maW5kUGFja2FnZUZyYWdtZW50Um9vdChyZXNvbHZlZC5nZXRQYXRoKCkpOwotCQkJCQkJCWlmIChyb290ICE9IG51bGwpCi0JCQkJCQkJCXJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W10geyByb290IH07Ci0JCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByb290czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZW50cmllcyB0aGF0IGFscmVhZHkgYXJlIGluIHRoZSBzZWFyY2ggcGF0aAotCSAqIHNvIHRoYXQgdGhleSBkb24ndCBzaG93IHVwIGluIHRoZSBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRGaWx0ZXJlZEV4aXN0aW5nRW50cmllcyhJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzKSB7Ci0JCUxpc3QgZW50cmllcyA9IHRhYmxlRWxlbWVudHM7Ci0JCUxpc3QgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdChlbnRyaWVzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGl0ciA9IGVudHJpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUJQU2VhcmNoTGlzdEVsZW1lbnQgZWxlbSA9IChCUFNlYXJjaExpc3RFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJZnJhZ21lbnRzLmFkZEFsbChnZXRQYWNrYWdlcyhlbGVtLCByb290cykpOwotCQl9Ci0JCXJldHVybiBmcmFnbWVudHMudG9BcnJheSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZW50cmllcyB0aGF0IGFscmVhZHkgYXJlIGluIHRoZSBzZWFyY2ggcGF0aAotCSAqIHNvIHRoYXQgdGhleSBkb24ndCBzaG93IHVwIGluIHRoZSBsaXN0LiBUaGlzIG9uZSBpcyBqdXN0IHRoZSBwYWNrYWdlIG5hbWVzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEZpbHRlcmVkRXhpc3RpbmdFbnRyaWVzKCkgewotCQlMaXN0IGVudHJpZXMgPSB0YWJsZUVsZW1lbnRzOwotCQlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdChlbnRyaWVzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGl0ciA9IGVudHJpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUJQU2VhcmNoTGlzdEVsZW1lbnQgZWxlbSA9IChCUFNlYXJjaExpc3RFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJbmFtZXMuYWRkKCgoU2VhcmNocGF0aEVudHJ5KSBlbGVtLmdldEVudHJ5KCkpLmdldFBhY2thZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFBhY2thZ2VzKEJQU2VhcmNoTGlzdEVsZW1lbnQgZWxlbWVudCwgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cykgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSAoKFNlYXJjaHBhdGhFbnRyeSkgZWxlbWVudC5nZXRFbnRyeSgpKS5nZXRQYWNrYWdlKCk7Ci0JCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJdHJ5IHsKLQkJCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJSmF2YUVsZW1lbnRbXSBwZnMgPSByb290c1tpXS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGZzLmxlbmd0aDsgaisrKQotCQkJCQlpZiAocGZzW2pdLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQKLQkJCQkJCSYmIHBmc1tqXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYWNrYWdlTmFtZSkpIHsKLQkJCQkJCXBhY2thZ2VzLmFkZChwZnNbal0pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCX0KLQkJCXJldHVybiBwYWNrYWdlczsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb1BhdGhzQmxvY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5pbmZvUGF0aHNCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTc5YTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5pbmZvUGF0aHNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvUGF0aHNCbG9jay5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNiAkICAkRGF0ZTogMjAwNS8xMC8wMyAyMzowNjo0MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZS5KRU1VSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEJlYW5pbmZvUGF0aHNCbG9jayB7Ci0KLQkvL3ByaXZhdGUgU2hlbGwgc1NoZWxsMSA9IG51bGw7ICAvLyAgQGp2ZTpkZWNsLWluZGV4PTA6dmlzdWFsLWNvbnN0cmFpbnQ9IjQwLDE5IgotCXByaXZhdGUgQ29tcG9zaXRlIHRvcCA9IG51bGw7Ci0JcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBlbmFibGVCZWFuaW5mb0NoZWNrYm94ID0gbnVsbDsKLQlwcml2YXRlIFBhY2thZ2VzV29ya2Jvb2tQYWdlIHBhY2thZ2VzV29ya2Jvb2tQYWdlMiA9IG51bGw7Ci0JcHJpdmF0ZSBTZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2Ugc2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlMiA9IG51bGw7Ci0JcHJpdmF0ZSBCZWFuaW5mb3NXb3JrYm9va1BhZ2UgYmVhbmluZm9zUHJvcGVydHlQYWdlMiA9IG51bGw7Ci0JcHJpdmF0ZSBDb250cm9sIHBhY2thZ2VzUGFnZUNvbnRyb2wgPSBudWxsOwotCXByaXZhdGUgQ29udHJvbCBzZWFyY2hwYXRoUGFnZUNvbnRyb2wgPSBudWxsOwotCXByaXZhdGUgQ29udHJvbCBiZWFuaW5mb3NQYWdlQ29udHJvbCA9IG51bGw7Ci0JcHJpdmF0ZSBJbWFnZSBwYWNrYWdlc1RhYkltYWdlOwotCXByaXZhdGUgSW1hZ2UgYmVhbmluZm9zVGFiSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBzZWFyY2hQYXRoVGFiSW1hZ2U7Ci0JLy8gLi4udWkKLQkKLQlwcml2YXRlIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3Q7Ci0JcHJpdmF0ZSBJU3RhdHVzQ2hhbmdlTGlzdGVuZXIgc3RhdHVzQ2hhbmdlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBJQnVpbGRTZWFyY2hQYWdlIGN1cnJlbnRQYWdlOwotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVCZWFuaW5mbyA9IHRydWU7Ci0JCi0JcHVibGljIEJlYW5pbmZvUGF0aHNCbG9jayhJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290LCBJU3RhdHVzQ2hhbmdlTGlzdGVuZXIgc3RhdHVzQ2hhbmdlTGlzdGVuZXIpewotCQl0aGlzLndvcmtzcGFjZVJvb3QgPSB3b3Jrc3BhY2VSb290OwotCQl0aGlzLnN0YXR1c0NoYW5nZUxpc3RlbmVyID0gc3RhdHVzQ2hhbmdlTGlzdGVuZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRFbmFibGVCZWFuaW5mbyhib29sZWFuIGVuYWJsZSl7Ci0JCWVuYWJsZUJlYW5pbmZvID0gZW5hYmxlOwotCQlpZihlbmFibGVCZWFuaW5mb0NoZWNrYm94IT1udWxsICYmICFlbmFibGVCZWFuaW5mb0NoZWNrYm94LmlzRGlzcG9zZWQoKSkKLQkJCWVuYWJsZUJlYW5pbmZvQ2hlY2tib3guc2V0U2VsZWN0aW9uKGVuYWJsZSk7Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBzU2hlbGwxCQotLy8JICoKLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNTaGVsbDEoKSB7Ci0vLwkJc1NoZWxsMSA9IG5ldyBTaGVsbCgpOwotLy8JCXNTaGVsbDEuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotLy8JCWNyZWF0ZVRvcCgpOwotLy8JCXNTaGVsbDEuc2V0U2l6ZShuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50KDQwMywyODkpKTsKLS8vCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRvcAkKLQkgKgotCSAqLwotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQl0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljcmVhdGVUYWJGb2xkZXIoKTsKLQkJZW5hYmxlQmVhbmluZm9DaGVja2JveCA9IG5ldyBCdXR0b24odG9wLCBTV1QuQ0hFQ0spOwotCQllbmFibGVCZWFuaW5mb0NoZWNrYm94LnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fZW5hYmxlYmVhbmluZm8pOwotCQllbmFibGVCZWFuaW5mb0NoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlQmVhbmluZm8gPSBlbmFibGVCZWFuaW5mb0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCQkJCXBhY2thZ2VzV29ya2Jvb2tQYWdlMi5zZXRCZWFuaW5mb0VuYWJsZWQoZW5hYmxlQmVhbmluZm8pOwotCQkJCWJlYW5pbmZvc1Byb3BlcnR5UGFnZTIuc2V0QmVhbmluZm9FbmFibGVkKGVuYWJsZUJlYW5pbmZvKTsKLQkJCQlzZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UyLnNldEJlYW5pbmZvRW5hYmxlZChlbmFibGVCZWFuaW5mbyk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQllbmFibGVCZWFuaW5mb0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVCZWFuaW5mbyk7Ci0JCWlmKGphdmFQcm9qZWN0IT1udWxsKXsKLQkJCWdldFBhY2thZ2VzUGFnZSgpLmluaXQoamF2YVByb2plY3QpOwotCQkJZ2V0QmVhbmluZm9zUGFnZSgpLmluaXQoamF2YVByb2plY3QpOwotCQkJZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpLmluaXQoamF2YVByb2plY3QpOwotCQl9Ci0JCXJldHVybiB0b3A7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGFiRm9sZGVyCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYkZvbGRlcigpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcih0b3AsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljcmVhdGVQYWNrYWdlc1dvcmtib29rUGFnZTIoKTsKLQkJY3JlYXRlQmVhbmluZm9zUHJvcGVydHlQYWdlMigpOwotCQljcmVhdGVTZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UyKCk7Ci0JCXRhYkZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdGFiQ2hhbmdlZChlLml0ZW0pOwotCQkJfQotCQl9KTsKLQkJCQkKLQkJVGFiSXRlbSB0YWJJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCXRhYkl0ZW0uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9QYXRoc0Jsb2NrX1BhZ2VfVGFiX1BhY2thZ2VzKTsKLQkJdGFiSXRlbS5zZXRJbWFnZShnZXRQYWNrYWdlc1RhYkltYWdlKCkpOwotCQl0YWJJdGVtLnNldENvbnRyb2wocGFja2FnZXNQYWdlQ29udHJvbCk7Ci0JCVRhYkl0ZW0gdGFiSXRlbTEgPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJdGFiSXRlbTEuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9QYXRoc0Jsb2NrX1BhZ2VfVGFiX0NsYXNzZXMpOwotCQl0YWJJdGVtMS5zZXRJbWFnZShnZXRCZWFuaW5mb3NUYWJJbWFnZSgpKTsKLQkJdGFiSXRlbTEuc2V0Q29udHJvbChiZWFuaW5mb3NQYWdlQ29udHJvbCk7Ci0JCVRhYkl0ZW0gdGFiSXRlbTIgPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJdGFiSXRlbTIuc2V0SW1hZ2UoZ2V0U2VhcmNoUGF0aFRhYkltYWdlKCkpOwotCQl0YWJJdGVtMi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlcmFjaHBhdGhfdGFiX29yZGVyKTsKLQkJdGFiSXRlbTIuc2V0Q29udHJvbChzZWFyY2hwYXRoUGFnZUNvbnRyb2wpOwotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDIpOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZ2V0U2VhcmNoUGF0aFRhYkltYWdlKCkgewotCQlpZihzZWFyY2hQYXRoVGFiSW1hZ2U9PW51bGwpCi0JCQlzZWFyY2hQYXRoVGFiSW1hZ2UgPSBKRU1VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKEpFTVVJUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAiaWNvbnMvY3Bfb3JkZXJfb2JqLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBzZWFyY2hQYXRoVGFiSW1hZ2U7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRQYWNrYWdlc1RhYkltYWdlKCkgewotCQlpZihwYWNrYWdlc1RhYkltYWdlPT1udWxsKQotCQkJcGFja2FnZXNUYWJJbWFnZSA9IEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tBR0UpOwotCQlyZXR1cm4gcGFja2FnZXNUYWJJbWFnZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbWFnZSBnZXRCZWFuaW5mb3NUYWJJbWFnZSgpewotCQlpZihiZWFuaW5mb3NUYWJJbWFnZT09bnVsbCl7Ci0JCQlVUkwgaW1hZ2VVUkwgPSBQbGF0Zm9ybS5maW5kKEpFTVVJUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCBuZXcgUGF0aCgiaWNvbnMvamF2YWJlYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW1hZ2VVUkwgIT0gbnVsbCkgCi0JCQkJYmVhbmluZm9zVGFiSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCkuY3JlYXRlSW1hZ2UoKTsKLQkJCWVsc2UKLQkJCQliZWFuaW5mb3NUYWJJbWFnZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gYmVhbmluZm9zVGFiSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgcGFja2FnZXNXb3JrYm9va1BhZ2UyCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhY2thZ2VzV29ya2Jvb2tQYWdlMigpIHsKLQkJcGFja2FnZXNQYWdlQ29udHJvbCA9IGdldFBhY2thZ2VzUGFnZSgpLmNyZWF0ZUNvbnRyb2wodGFiRm9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBzZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UyCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZTIoKSB7Ci0JCXNlYXJjaHBhdGhQYWdlQ29udHJvbCA9IGdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKS5jcmVhdGVDb250cm9sKHRhYkZvbGRlcik7Ci0JCXNlYXJjaHBhdGhQYWdlQ29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQgZSkgewotCQkJCWlmKHNlYXJjaFBhdGhUYWJJbWFnZSE9bnVsbCl7Ci0JCQkJCWlmKCFzZWFyY2hQYXRoVGFiSW1hZ2UuaXNEaXNwb3NlZCgpKQotCQkJCQkJc2VhcmNoUGF0aFRhYkltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJc2VhcmNoUGF0aFRhYkltYWdlPW51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBiZWFuaW5mb3NQcm9wZXJ0eVBhZ2UyCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJlYW5pbmZvc1Byb3BlcnR5UGFnZTIoKSB7Ci0JCWJlYW5pbmZvc1BhZ2VDb250cm9sID0gZ2V0QmVhbmluZm9zUGFnZSgpLmNyZWF0ZUNvbnRyb2wodGFiRm9sZGVyKTsKLQkJYmVhbmluZm9zUGFnZUNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlpZihiZWFuaW5mb3NUYWJJbWFnZSE9bnVsbCl7Ci0JCQkJCWlmKCFiZWFuaW5mb3NUYWJJbWFnZS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQliZWFuaW5mb3NUYWJJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWJlYW5pbmZvc1RhYkltYWdlPW51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlQYWNrYWdlc1dvcmtib29rUGFnZSBnZXRQYWNrYWdlc1BhZ2UoKXsKLQkJaWYocGFja2FnZXNXb3JrYm9va1BhZ2UyPT1udWxsKQotCQkJcGFja2FnZXNXb3JrYm9va1BhZ2UyID0gbmV3IFBhY2thZ2VzV29ya2Jvb2tQYWdlKHdvcmtzcGFjZVJvb3QsIHRoaXMpOwotCQlyZXR1cm4gcGFja2FnZXNXb3JrYm9va1BhZ2UyOwotCX0KLQkKLQlCZWFuaW5mb3NXb3JrYm9va1BhZ2UgZ2V0QmVhbmluZm9zUGFnZSgpewotCQlpZihiZWFuaW5mb3NQcm9wZXJ0eVBhZ2UyPT1udWxsKQotCQkJYmVhbmluZm9zUHJvcGVydHlQYWdlMiA9IG5ldyBCZWFuaW5mb3NXb3JrYm9va1BhZ2Uod29ya3NwYWNlUm9vdCwgdGhpcyk7Ci0JCXJldHVybiBiZWFuaW5mb3NQcm9wZXJ0eVBhZ2UyOwotCX0KLQkKLQlTZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UgZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpewotCQlpZihzZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UyPT1udWxsKQotCQkJc2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlMiA9IG5ldyBTZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UodGhpcyk7Ci0JCXJldHVybiBzZWFyY2hwYXRoT3JkZXJpbmdXb3JrYm9va1BhZ2UyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGFiQ2hhbmdlZChXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJJdGVtKSB7Ci0JCQlJQnVpbGRTZWFyY2hQYWdlIG5ld1BhZ2UgPSAoSUJ1aWxkU2VhcmNoUGFnZSkgKChUYWJJdGVtKSB3aWRnZXQpLmdldERhdGEoKTsKLQkJCWlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0JCQkJTGlzdCBzZWxlY3Rpb24gPSBjdXJyZW50UGFnZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJbmV3UGFnZS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQljdXJyZW50UGFnZSA9IG5ld1BhZ2U7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBydW5uYWJsZSB0aGF0IHNldHMgdGhlIGNvbmZpZ3VyZWQgYnVpbGQgcGF0aHMuCi0JICovCi0JcHVibGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZSgpIHsKLQkJZmluYWwgYm9vbGVhbiB3YW50TmF0dXJlID0gZW5hYmxlQmVhbmluZm87Ci0JCWZpbmFsIExpc3Qgc2VhcmNoUGF0aEVudHJpZXMgPSB3YW50TmF0dXJlID8gZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpLmdldEVsZW1lbnRzKCkgOiBudWxsOwotCi0JCXJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJfQotCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQlCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX29wZXJhdGlvbmRlc2NyaXB0aW9uLCAKLQkJCQkJMTApOwotCQkJCXRyeSB7Ci0JCQkJCXNldEJlYW5pbmZvU2VhcmNocGF0aCh3YW50TmF0dXJlLCBzZWFyY2hQYXRoRW50cmllcywgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QmVhbmluZm9TZWFyY2hwYXRoKAotCQkJYm9vbGVhbiB3YW50TmF0dXJlLAotCQkJTGlzdCBzZWFyY2hQYXRoRW50cmllcywKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAod2FudE5hdHVyZSkgewotCQkJLy8gY3JlYXRlIGJlYW5pbmZvIG5hdHVyZQotCQkJaWYgKCFqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaGFzTmF0dXJlKEJlYW5pbmZvTmF0dXJlLk5BVFVSRV9JRCkpIHsKLQkJCQlhZGROYXR1cmVJRFRvUHJvamVjdChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksIEJlYW5pbmZvTmF0dXJlLk5BVFVSRV9JRCwgbW9uaXRvcik7Ci0JCQl9Ci0KLQkJCUJlYW5pbmZvTmF0dXJlIG5hdHVyZSA9IEJlYW5pbmZvTmF0dXJlLmdldFJ1bnRpbWUoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJCS8vIE5vdyBidWlsZC9zZXQgdGhlIHNlYXJjaCBwYXRoLgotCQkJaWYgKHNlYXJjaFBhdGhFbnRyaWVzLnNpemUoKSA+IDApIHsKLQkJCQlJQmVhbmluZm9zRG9jRW50cnlbXSBzcGFycmF5ID0gbmV3IElCZWFuaW5mb3NEb2NFbnRyeVtzZWFyY2hQYXRoRW50cmllcy5zaXplKCldOwotCQkJCUl0ZXJhdG9yIGl0ciA9IHNlYXJjaFBhdGhFbnRyaWVzLml0ZXJhdG9yKCk7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCUJQTGlzdEVsZW1lbnQgZWxlbSA9IChCUExpc3RFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJCQlzcGFycmF5W2krK10gPSBlbGVtLmdldEVudHJ5KCk7Ci0JCQkJfQotCQkJCW5hdHVyZS5zZXRTZWFyY2hQYXRoKG5ldyBCZWFuaW5mb3NEb2Moc3BhcnJheSksIG1vbml0b3IpOwotCQkJfSBlbHNlCi0JCQkJbmF0dXJlLnNldFNlYXJjaFBhdGgobnVsbCwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBSZW1vdmUgdGhlIG5hdHVyZSwgbm8gbG9uZ2VyIHdhbnRlZC4KLQkJCXJlbW92ZU5hdHVyZUlERnJvbVByb2plY3QoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLCBCZWFuaW5mb05hdHVyZS5OQVRVUkVfSUQsIG1vbml0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIGdpdmVuIHByb2plY3QuIE11bHRpcGxlIGNhbGxzIHRvIGluaXQgYXJlIGFsbG93ZWQsCi0JICogYnV0IGFsbCBleGlzdGluZyBzZXR0aW5ncyB3aWxsIGJlIGNsZWFyZWQgYW5kIHJlcGxhY2UgYnkgdGhlIGdpdmVuIG9yIGRlZmF1bHQgcGF0aHMuCi0JICogQHBhcmFtIHByb2plY3QgVGhlIGphdmEgcHJvamVjdCB0byBjb25maWd1cmUuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJSmF2YVByb2plY3QganByb2plY3QpIHsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IGpwcm9qZWN0OwotCQkvL1RPRE86IGxhYmVsUHJvdmlkZXIuc2V0SmF2YVByb2plY3QoanByb2plY3QpOwotCi0JCXRyeSB7Ci0JCQkvLyBJZiB3ZSBoYXZlIGEgY29uZmlnIGZpbGUsIHdlIHdpbGwgYXNzdW1lIHdlIGhhdmUgYSBuYXR1cmUuIEl0IHdpbGwgYWRkIGl0IGF1dG9tYXRpY2FsbHkKLQkJCS8vIHdoZW4gd2UgYXNrIGZvciB0aGUgaW5mb3JtYXRpb24uIEV2ZW4gaWYgd2UgZGlkbid0IGhhdmUgdGhlIG5hdHVyZSwgYXMgc29vbiBhcyBzb21lb25lCi0JCQkvLyBhc2tzIGZvciBpdCwgd2Ugd291bGQgY3JlYXRlIGl0IGFueWhvdywgYW5kIGl0IHdvdWxkIHVzZSB0aGUgZXhpc3RpbmcgY29uZmlnIGZpbGUuCi0JCQkvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY29uZmlnIGZpbGUsIHdlIGNvdWxkIGhhdmUgdGhlIG5hdHVyZSwgc28gd2Ugd2lsbCBjaGVjayBmb3IgdGhhdCB0b28uCi0JCQlib29sZWFuIGhhdmVDb25maWdGaWxlID0ganByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUoQmVhbmluZm9OYXR1cmUuUF9CRUFOSU5GT19TRUFSQ0hfUEFUSCkuZXhpc3RzKCk7Ci0JCQlib29sZWFuIGhhdmVOYXR1cmUgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaGFzTmF0dXJlKEJlYW5pbmZvTmF0dXJlLk5BVFVSRV9JRCk7Ci0JCQllbmFibGVCZWFuaW5mbyA9IGhhdmVDb25maWdGaWxlIHx8IGhhdmVOYXR1cmU7Ci0JCQlpZiAoaGF2ZU5hdHVyZSB8fCBoYXZlQ29uZmlnRmlsZSkgewotCQkJCUJlYW5pbmZvc0RvYyBkb2MgPSBCZWFuaW5mb05hdHVyZS5nZXRSdW50aW1lKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSkuZ2V0U2VhcmNoUGF0aCgpOwotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHJhdyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCi0JCQkJTGlzdCBuZXdTZWFyY2hwYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQlJQmVhbmluZm9zRG9jRW50cnlbXSBzcCA9IGRvYy5nZXRTZWFyY2hwYXRoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3AubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlCZWFuaW5mb3NEb2NFbnRyeSBjdXJyID0gc3BbaV07Ci0JCQkJCQlib29sZWFuIGlzTWlzc2luZyA9IGZhbHNlOwotCQkJCQkJQlBMaXN0RWxlbWVudCBlbGVtID0gbnVsbDsKLQkJCQkJCWlmIChjdXJyIGluc3RhbmNlb2YgQmVhbmluZm9FbnRyeSkgewotCQkJCQkJCUJlYW5pbmZvRW50cnkgYmUgPSAoQmVhbmluZm9FbnRyeSkgY3VycjsKLQotCQkJCQkJCS8vIGdldCB0aGUgcmVzb3VyY2UsIHRoaXMgdGVsbHMgaWYgdGhlIGJlYW5pbmZvcyBleGlzdCBvciBub3QuCi0JCQkJCQkJT2JqZWN0W10gcGF0aHMgPSBiZS5nZXRDbGFzc3BhdGgoamF2YVByb2plY3QpOwotCQkJCQkJCWlmIChwYXRocyAhPSBudWxsICYmIHBhdGhzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7ICFpc01pc3NpbmcgJiYgaiA8IHBhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJCQlPYmplY3QgcGF0aCA9IHBhdGhzW2pdOwotCQkJCQkJCQkJaWYgKHBhdGggaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQkJCQkJCQlpc01pc3NpbmcgPSAhKChJUHJvamVjdCkgcGF0aCkuZXhpc3RzKCk7Ci0JCQkJCQkJCQllbHNlIGlmIChwYXRoIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQkJCQkJRmlsZSBmID0gbmV3IEZpbGUoKFN0cmluZykgcGF0aCk7Ci0JCQkJCQkJCQkJaXNNaXNzaW5nID0gIWYuZXhpc3RzKCk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKHBhdGggaW5zdGFuY2VvZiBJUGF0aCkgewotCQkJCQkJCQkJCWlzTWlzc2luZyA9IHRydWU7CS8vIFBsdWdpbnMgYXJlIGludmFsaWQgaW4gQmVhbmluZm9Db25maWcuIFRoZXkgb25seSBhcHBseSB3aXRoaW4gY29udHJpYnV0aW9ucy4KLQkJCQkJCQkJCX0gZWxzZQotCQkJCQkJCQkJCWlzTWlzc2luZyA9IHRydWU7IC8vIEludmFsaWQsIHNvIGlzTWlzc2luZy4KLQkJCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQkJfSBlbHNlCi0JCQkJCQkJCWlzTWlzc2luZyA9IHRydWU7Ci0KLQkJCQkJCQllbGVtID0gbmV3IEJQQmVhbmluZm9MaXN0RWxlbWVudChiZSwgZ2V0SW5pdGlhbFNlYXJjaHBhdGhzKGJlKSwgaXNNaXNzaW5nKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gU2VhcmNocGF0aCBlbnRyeSwgc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSByYXcgY2xhc3NwYXRoIGVudHJ5IHRoYXQgaXQgaXMgZm9yLgotCQkJCQkJCWJvb2xlYW4gaXNFeHBvcnRlZCA9IGZhbHNlOwotCQkJCQkJCWJvb2xlYW4gaXNQYWNrYWdlTWlzc2luZyA9IHRydWU7Ci0JCQkJCQkJaXNNaXNzaW5nID0gdHJ1ZTsJLy8gSW5pdGlhbGx5IG1pc3NpbmcgdW50aWwgd2UgZmluZCBpdC4KLQkJCQkJCQlTZWFyY2hwYXRoRW50cnkgY2UgPSAoU2VhcmNocGF0aEVudHJ5KSBjdXJyOwotCQkJCQkJCWludCBraW5kID0gY2UuZ2V0S2luZCgpOwotCQkJCQkJCUlQYXRoIHBhdGggPSBjZS5nZXRQYXRoKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByYXcubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJaWYgKHJhd1tqXS5nZXRFbnRyeUtpbmQoKSA9PSBraW5kICYmIHJhd1tqXS5nZXRQYXRoKCkuZXF1YWxzKHBhdGgpKSB7Ci0JCQkJCQkJCQlpc01pc3NpbmcgPSBmYWxzZTsKLQkJCQkJCQkJCWlzRXhwb3J0ZWQgPSByYXdbal0uaXNFeHBvcnRlZCgpIHx8IHJhd1tqXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRTsKLQkJCQkJCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGNlLmdldFBhY2thZ2UoKTsKLQkJCQkJCQkJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGphdmFQcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290cyhyYXdbal0pOwotCQkJCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcm9vdHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgaXJvb3QgPSByb290c1trXTsKLQkJCQkJCQkJCQkJaWYgKGlyb290LmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSkuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCQkJCWlzUGFja2FnZU1pc3NpbmcgPSBmYWxzZTsKLQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlCi0JCQkJCQkJCQkJaXNQYWNrYWdlTWlzc2luZyA9IGZhbHNlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxlbSA9IG5ldyBCUFNlYXJjaExpc3RFbGVtZW50KGNlLCBpc01pc3NpbmcsIGlzUGFja2FnZU1pc3NpbmcsIGlzRXhwb3J0ZWQpOwotCQkJCQkJfQotCi0JCQkJCQluZXdTZWFyY2hwYXRoLmFkZChlbGVtKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGluaXRzIHRoZSBkaWFsb2cgZmllbGQKLQkJCQlzZXRTZWFyY2hPcmRlckVsZW1lbnRzKG5ld1NlYXJjaHBhdGgpOwotCi0JCQkJaWYgKGdldFBhY2thZ2VzUGFnZSgpICE9IG51bGwpIHsKLQkJCQkJZ2V0UGFja2FnZXNQYWdlKCkuaW5pdChqYXZhUHJvamVjdCk7Ci0JCQkJCWdldEJlYW5pbmZvc1BhZ2UoKS5pbml0KGphdmFQcm9qZWN0KTsKLQkJCQkJZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpLmluaXQoamF2YVByb2plY3QpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gTm8gbmF0dXJlLCBkaXNhYmxlLAotCQkJCXNldEVuYWJsZUJlYW5pbmZvKGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXNldEVuYWJsZUJlYW5pbmZvKGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRFbmFibGVCZWFuaW5mbyhmYWxzZSk7Ci0JCX0KLQotLy8JCWxpc3RlbkZvckNsYXNzcGF0aENoYW5nZSgpOwotCQlkb1N0YXR1c0xpbmVVcGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmF0dXJlIHRvIGEgcHJvamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROYXR1cmVJRFRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5hdHVyZUlERnJvbVByb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJaW50IGluZHggPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmV2TmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHByZXZOYXR1cmVzW2ldLmVxdWFscyhuYXR1cmVJZCkpIHsKLQkJCQlpbmR4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaW5keCA9PSAtMSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggLSAxXTsKLQkJaWYgKG5ld05hdHVyZXMubGVuZ3RoICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIGluZHgpOwotCQkJaWYgKGluZHggPCBuZXdOYXR1cmVzLmxlbmd0aCkKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCBpbmR4ICsgMSwgbmV3TmF0dXJlcywgaW5keCwgbmV3TmF0dXJlcy5sZW5ndGggLSBpbmR4KTsKLQkJfQotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCX0KLQkKLQl2b2lkIGRvU3RhdHVzTGluZVVwZGF0ZSgpIHsKLQkJc3RhdHVzQ2hhbmdlTGlzdGVuZXIuc3RhdHVzQ2hhbmdlZChnZXRTZWFyY2hwYXRoT3JkZXJpbmdQYWdlKCkuZ2V0U3RhdHVzKCkpOwotCX0KLQkKLQkvKgotCSAqIHNlYXJjaE9yZGVyIGRpYWxvZyBtdXN0IG5ldmVyIGhhdmUgYWxsIG9mIGVsZW1lbnRzIHNldAotCSAqIGRpcmVjdGx5LiBNdXN0IGNvbWUgdGhyb3VnaCBoZXJlIGZpcnN0IHNvIHRoYXQgd2UgY2FuCi0JICogbWFrZSBzdXJlIHVwZGF0ZXMgb2NjdXIgaW4gY29ycmVjdCBzZXF1ZW5jZSwgZWxzZQotCSAqIHdlIHdpbGwgd2luZCB1cCB3aXRoIGVudHJpZXMgYmVpbmcgbWFya2VkIGFzIHVuZXhwb3J0ZWQKLQkgKiB3aGVuIHRoZXkgcmVhbGx5IGFyZSBleHBvcnRlZC4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoT3JkZXJFbGVtZW50cyhMaXN0IG5ld0VsZW1lbnRzKSB7Ci0JCUFycmF5TGlzdCBleHBvcnRlZEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KG5ld0VsZW1lbnRzLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0VsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQlBMaXN0RWxlbWVudCBlbGVtZW50ID0gKEJQTGlzdEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuaXNFeHBvcnRlZCgpKQotCQkJCWV4cG9ydGVkRW50cmllcy5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCWdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKS5zZXRFbGVtZW50cyhuZXdFbGVtZW50cyk7Ci0JCWdldFNlYXJjaHBhdGhPcmRlcmluZ1BhZ2UoKS5zZXRDaGVja2VkRWxlbWVudHMoZXhwb3J0ZWRFbnRyaWVzKTsKLQl9Ci0JCi0JLyoKLQkgKiBDcmVhdGUgdGhlIFNlYXJjaHBhdGggZWxlbWVudHMgZm9yIGEgQmVhbmluZm9FbGVtZW50LgotCSAqIFJldHVybiBudWxsIGlmIG5vdCB0byB1cGRhdGUuCi0JICovCi0JcHJpdmF0ZSBCUFNlYXJjaExpc3RFbGVtZW50W10gZ2V0SW5pdGlhbFNlYXJjaHBhdGhzKEJlYW5pbmZvRW50cnkgaW5mb0VudHJ5KSB7Ci0KLQkJLy8gV2UgY2FuIG9ubHkgdmVyaWZ5IHRoZSBleGlzdGVuY2Ugb2YgcGFja2FnZXMgd2l0aGluIGJlYW5pbmZvcyB0aGF0IGFyZSAKLQkJLy8gbG9jYXRlZCB3aXRoaW4gYSBwcm9qZWN0IG9uIHRoZSBkZXNrdG9wLiBPdGhlcndpc2Ugd2UgY2FuJ3QgZmluZCBvdXQgd2hhdAotCQkvLyBwYWNrYWdlcyBhcmUgaW4gdGhlbS4KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IG51bGw7Ci0KLQkJaWYgKGluZm9FbnRyeS5nZXRLaW5kKCkgIT0gQmVhbmluZm9FbnRyeS5CSUVfUExVR0lOKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWQgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGluZm9FbnRyeS5nZXRDbGFzc3BhdGhFbnRyeSgpKTsKLQkJCUlSZXNvdXJjZSByZXMgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIocmVzb2x2ZWQuZ2V0UGF0aCgpKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXhpc3RzKCkpIHsKLQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJLy8gSXQgaXMgYSBwcm9qZWN0IGl0c2VsZi4KLQkJCQkJSUphdmFQcm9qZWN0IGpwID0gKElKYXZhUHJvamVjdCkgSmF2YUNvcmUuY3JlYXRlKHJlcyk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoanAgIT0gbnVsbCkKLQkJCQkJCQlyb290cyA9IGpwLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7IC8vIEFsbCBvZiB0aGUgcm9vdHMgaW4gdGhlIHByb2plY3QgYXJlIGFwcGxpY2FibGUuCi0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBJdCBpcyB3aXRoaW4gYW5vdGhlciBwcm9qZWN0Ci0JCQkJCUlQcm9qZWN0IGNvbnRhaW5pbmdQcm9qZWN0ID0gcmVzLmdldFByb2plY3QoKTsKLQkJCQkJSUphdmFQcm9qZWN0IGpwID0gSmF2YUNvcmUuY3JlYXRlKGNvbnRhaW5pbmdQcm9qZWN0KTsKLQkJCQkJaWYgKGpwICE9IG51bGwpIHsKLQkJCQkJCS8vIFRoZSByb290cyBpZiB0aGlzIGlzIGluIHRoZSBjbGFzc3BhdGggb2YgdGhpcyBwcm9qZWN0Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBqcC5maW5kUGFja2FnZUZyYWdtZW50Um9vdChyZXNvbHZlZC5nZXRQYXRoKCkpOwotCQkJCQkJCWlmIChyb290ICE9IG51bGwpCi0JCQkJCQkJCXJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W10geyByb290IH07Ci0JCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU2VhcmNocGF0aEVudHJ5W10gZW50cmllcyA9IGluZm9FbnRyeS5nZXRTZWFyY2hQYXRocygpOwotCQlCUFNlYXJjaExpc3RFbGVtZW50W10gcGFja2FnZUVsZW1lbnRzID0gbmV3IEJQU2VhcmNoTGlzdEVsZW1lbnRbZW50cmllcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsKLQkJCWkgPCBlbnRyaWVzLmxlbmd0aDsKLQkJCWkrKykgeyAvLyBTZWFyY2hwYXRoIGVudHJ5LCBzZWUgaWYgd2UgY2FuIGZpbmQgdGhlIHJhdyBjbGFzc3BhdGggZW50cnkgdGhhdCBpdCBpcyBmb3IuCi0JCQlib29sZWFuIGlzUGFja2FnZU1pc3NpbmcgPSByb290cyAhPSBudWxsOwotCQkJLy8gSWYgcm9vdHMgaXMgbnVsbCwgdGhlbiB0aGUgcGFja2FnZSBpc24ndCBtaXNzaW5nIGJlY2F1c2Ugd2UgY2FuJ3QgdGVzdCBmb3IgaXQuCi0JCQlTZWFyY2hwYXRoRW50cnkgY2UgPSBlbnRyaWVzW2ldOwotCQkJaWYgKHJvb3RzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBjZS5nZXRQYWNrYWdlKCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCByb290cy5sZW5ndGg7IGsrKykgewotCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBpcm9vdCA9IHJvb3RzW2tdOwotCQkJCQlpZiAoaXJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKS5leGlzdHMoKSkgewotCQkJCQkJaXNQYWNrYWdlTWlzc2luZyA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlwYWNrYWdlRWxlbWVudHNbaV0gPSBuZXcgQlBTZWFyY2hMaXN0RWxlbWVudChjZSwgZmFsc2UsIGlzUGFja2FnZU1pc3NpbmcsIGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBwYWNrYWdlRWxlbWVudHM7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZWxlY3RlZExpc3QoSVNlbGVjdGlvbiBzZWxlY3Rpb24pewotCQlMaXN0IHNlbGVjdGVkTGlzdCA9IG51bGw7Ci0JCWlmKHNlbGVjdGlvbiE9bnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbil7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3Qoc3RydWN0dXJlZFNlbGVjdGlvbi50b0FycmF5KCkpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0JlYW5pbmZvRW5hYmxlZCgpewotCQlyZXR1cm4gZW5hYmxlQmVhbmluZm87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvQmVhbmluZm9zUHJvcGVydHlQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllZGU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvc1Byb3BlcnR5UGFnZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOS8yNiAyMDoyNjo1OSAkIAotICovCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZS5KRU1VSVBsdWdpbjsKLQotLyoqCi0gKiBQcm9wZXJ0eSBwYWdlIGZvciBjb25maWd1cmluZyBCZWFuaW5mbyBwYXRoCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuaW5mb3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJU3RhdHVzQ2hhbmdlTGlzdGVuZXIgewotCQkKLQkvKioKLQkgKiBBcHBsaWVzIHRoZSBzdGF0dXMgdG8gdGhlIHN0YXR1cyBsaW5lIG9mIGEgZGlhbG9nIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gcGFnZSB0aGUgZGlhbG9nIHBhZ2UKLQkgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlUb1N0YXR1c0xpbmUoRGlhbG9nUGFnZSBwYWdlLCBJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbWVzc2FnZT0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLk9LOgotCQkJCXBhZ2Uuc2V0TWVzc2FnZShtZXNzYWdlLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJCXBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLldBUk5JTkc6Ci0JCQkJcGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTzoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWlmIChtZXNzYWdlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJbWVzc2FnZT0gbnVsbDsKLQkJCQl9Ci0JCQkJcGFnZS5zZXRNZXNzYWdlKG51bGwpOwotCQkJCXBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCZWFuaW5mb1BhdGhzQmxvY2sgZkJ1aWxkUGF0aHNCbG9jazsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQkKLQkvKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotLy8gd2hlbiB3ZSBnZXQgaGVscCB3b3JraW5nLgotLy8JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsIG5ldyBEaWFsb2dQYWdlQ29udGV4dENvbXB1dGVyKHRoaXMsIElKYXZhSGVscENvbnRleHRJZHMuQlVJTERfUEFUSF9QUk9QRVJUWV9QQUdFKSk7Ci0KLQkJLy8gZW5zdXJlIHRoZSBwYWdlIGhhcyBubyBzcGVjaWFsIGJ1dHRvbnMKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsJCQotCQkKLQkJcHJvamVjdD0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFpc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2l0aG91dEphdmEocGFyZW50KTsKLQkJfSBlbHNlIGlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJcmV0dXJuIGNyZWF0ZUZvckNsb3NlZFByb2plY3QocGFyZW50KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBjcmVhdGVXaXRoSmF2YShwYXJlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnRlbnQgZm9yIHZhbGlkIHByb2plY3RzLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVXaXRoSmF2YShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3Q9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWZCdWlsZFBhdGhzQmxvY2s9IG5ldyBCZWFuaW5mb1BhdGhzQmxvY2socm9vdCwgdGhpcyk7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJZkJ1aWxkUGF0aHNCbG9jay5pbml0KGpwcm9qZWN0KTsKLQkJZmluYWwgSVBhdGggY2xhc3NwYXRoZmlsZSA9IHByb2plY3QuZ2V0RmlsZSgiLmNsYXNzcGF0aCIpLmdldEZ1bGxQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJbGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZkJ1aWxkUGF0aHNCbG9jayAhPSBudWxsKSB7Ci0JCQkJCWlmIChldmVudC5nZXREZWx0YSgpLmZpbmRNZW1iZXIoY2xhc3NwYXRoZmlsZSkgIT0gbnVsbCkKLQkJCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJLy8gQ2FuIGJlIGNhbGxlZCBvdXRzaWRlIG9mIGRpc3BsYXkgbG9vcAotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZkJ1aWxkUGF0aHNCbG9jay5pbml0KGpwcm9qZWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXByb2plY3QuZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0JCXJldHVybiBmQnVpbGRQYXRoc0Jsb2NrLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IGZvciBub24tSmF2YSBwcm9qZWN0cy4KLQkgKi8JCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZVdpdGhvdXRKYXZhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9Qcm9wZXJ0aWVzUGFnZV9JTkZPX19ub2phdmFwcm9qZWN0KTsgCi0JCQotCQlmQnVpbGRQYXRoc0Jsb2NrPSBudWxsOwotCQlzZXRWYWxpZCh0cnVlKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgZm9yIGNsb3NlZCBwcm9qZWN0cy4KLQkgKi8JCQotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVGb3JDbG9zZWRQcm9qZWN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9Qcm9wZXJ0aWVzUGFnZV9JTkZPX19jbG9zZWRwcm9qZWN0KTsgCi0JCQotCQlmQnVpbGRQYXRoc0Jsb2NrPSBudWxsOwotCQlzZXRWYWxpZCh0cnVlKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCUlBZGFwdGFibGUgYWRhcHRhYmxlPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChhZGFwdGFibGUgIT0gbnVsbCkgewotCQkJSUphdmFFbGVtZW50IGVsZW09IChJSmF2YUVsZW1lbnQpIGFkYXB0YWJsZS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQlpZiAoZWxlbSBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCXJldHVybiAoKElKYXZhUHJvamVjdCkgZWxlbSkuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvai5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2sKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmIChmQnVpbGRQYXRoc0Jsb2NrICE9IG51bGwpIHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZT0gZkJ1aWxkUGF0aHNCbG9jay5nZXRSdW5uYWJsZSgpOwotCi0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3A9IG5ldyBXb3Jrc3BhY2VNb2RpZnlEZWxlZ2F0aW5nT3BlcmF0aW9uKHJ1bm5hYmxlKTsKLQkJCVNoZWxsIHNoZWxsPSBnZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQkJCXRyeSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcCk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgdGl0bGU9IEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb19VSV9fZXJyb3J0aXRsZTsgCi0JCQkJU3RyaW5nIG1lc3NhZ2U9IEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb19VSV9fZXJyb3I7IAotCQkJCUV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsIHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhbmNlbGxlZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJU3RhdHVzQ2hhbmdlTGlzdGVuZXIjc3RhdHVzQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXR1c0NoYW5nZWQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJc2V0VmFsaWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKLQkJYXBwbHlUb1N0YXR1c0xpbmUodGhpcywgc3RhdHVzKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlwcm9qZWN0LmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlsaXN0ZW5lciA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9CZWFuaW5mb3NXb3JrYm9va1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5pbmZvc1dvcmtib29rUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E0NTI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0JlYW5pbmZvc1dvcmtib29rUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEJlYW5pbmZvc1dvcmtib29rUGFnZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMSAkICAkRGF0ZTogMjAwNS8xMC8wNCAxNzo1OToxNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkJ1aWxkUGF0aERpYWxvZ0FjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5CZWFuaW5mb0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5jb3JlLkpFTVVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQmVhbmluZm9zV29ya2Jvb2tQYWdlIGltcGxlbWVudHMgSUJ1aWxkU2VhcmNoUGFnZXsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dTVE9SRV9MQVNUVkFSSUFCTEUgPSBKRU1VSVBsdWdpbi5QSV9CRUFOSU5GT19VSSArICIubGFzdHZhciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBhIGRpYWxvZyB0byBjaG9vc2UgYSB2YXJpYWJsZQotCXByaXZhdGUgY2xhc3MgVmFyaWFibGVTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBTdGF0dXNEaWFsb2cgaW1wbGVtZW50cyBJU3RhdHVzQ2hhbmdlTGlzdGVuZXIgewkKLQkJcHJpdmF0ZSBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrIGZWYXJpYWJsZVNlbGVjdGlvbkJsb2NrOwotCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3M9IEpFTVVJUGx1Z2luLmdldFBsdWdpbigpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQkJCi0JCXB1YmxpYyBWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIExpc3QgZXhpc3RpbmdQYXRocykgewotCQkJc3VwZXIocGFyZW50KTsKLQkJCXNldFRpdGxlKCJOZXcgVmFyaWFibGUgQ2xhc3NwYXRoIEVudHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBpbml0VmFyPSBkaWFsb2dTZXR0aW5ncy5nZXQoRElBTE9HU1RPUkVfTEFTVFZBUklBQkxFKTsKLQkJCWZWYXJpYWJsZVNlbGVjdGlvbkJsb2NrPSBuZXcgVmFyaWFibGVTZWxlY3Rpb25CbG9jayh0aGlzLCBleGlzdGluZ1BhdGhzLCBudWxsLCBpbml0VmFyLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEBzZWUgV2luZG93cyNjb25maWd1cmVTaGVsbAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLS8vCQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKG5ld1NoZWxsLCBJSmF2YUhlbHBDb250ZXh0SWRzLlZBUklBQkxFX1NFTEVDVElPTl9ESUFMT0cpOwotCQl9CQkKLQotCQkvKgotCQkgKiBAc2VlIFN0YXR1c0RpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKCkKLQkJICovCQkJCQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGU9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQkKLQkJCUxhYmVsIG1lc3NhZ2U9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCW1lc3NhZ2Uuc2V0VGV4dCgiTmV3IFZhcmlhYmxlIENsYXNzcGF0aCBFbnRyeSIpOyAvLyROT04tTkxTLTEkCi0JCQltZXNzYWdlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwkKLQkJCQkJCQotCQkJQ29udHJvbCBpbm5lcj0gZlZhcmlhYmxlU2VsZWN0aW9uQmxvY2suY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotCQkJaW5uZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0JCQotCQkvKgotCQkgKiBAc2VlIERpYWxvZyNva1ByZXNzZWQoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkJZGlhbG9nU2V0dGluZ3MucHV0KERJQUxPR1NUT1JFX0xBU1RWQVJJQUJMRSwgZ2V0VmFyaWFibGUoKS5zZWdtZW50KDApKTsKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9CQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0YXR1c0NoYW5nZUxpc3RlbmVyI3N0YXR1c0NoYW5nZWQoKQotCQkgKi8JCQkKLQkJcHVibGljIHZvaWQgc3RhdHVzQ2hhbmdlZChJU3RhdHVzIHN0YXR1cykgewotCQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUGF0aCBnZXRWYXJpYWJsZSgpIHsKLQkJCXJldHVybiBmVmFyaWFibGVTZWxlY3Rpb25CbG9jay5nZXRWYXJpYWJsZVBhdGgoKTsKLQkJfQkJCi0JfQotCi0JCi0JLy9jb250cm9scwotCXByaXZhdGUgQ29tcG9zaXRlIGphdmFQcm9qZWN0c0NvbXBvc2l0ZSA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBsYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgYnV0dG9uc0JhciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkRm9sZGVyc2J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkSmFyc0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkRXh0SmFyc0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkVmFyaWFibGVCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGFkZFByb2plY3RCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIG1vZGlmeVBhdGhzQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b24gPSBudWxsOwotCXByaXZhdGUgTGFiZWwgc3BhY2VyMiA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBzcGFjZXIxID0gbnVsbDsKLQkvLyAuLiBjb250cm9scwotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBCZWFuaW5mb1BhdGhzQmxvY2sgYmVhbmluZm9QYXRoc0Jsb2NrOwotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgTGlzdCBiZWFuaW5mb3NMaXN0OwotCXByaXZhdGUgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdDsKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkTGlzdDsKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIHJhd0xpc3Q7Ci0JcHJpdmF0ZSBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXB1YmxpYyBCZWFuaW5mb3NXb3JrYm9va1BhZ2UoSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCwgQmVhbmluZm9QYXRoc0Jsb2NrIGJlYW5pbmZvUGF0aHNCbG9jaykgewotCQl0aGlzLndvcmtzcGFjZVJvb3QgPSB3b3Jrc3BhY2VSb290OwotCQl0aGlzLmJlYW5pbmZvUGF0aHNCbG9jayA9IGJlYW5pbmZvUGF0aHNCbG9jazsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbmV3IFNlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlcigpOwotCQl0aGlzLmJlYW5pbmZvc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKHNwYWNlcjE9PW51bGwgfHwgc3BhY2VyMj09bnVsbCl7Ci0JCQkvLyBqdXN0IGhhdmUgU09NRSByZWFkIGFjY2VzcwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgamF2YVByb2plY3RzQ29tcG9zaXRlCQotCSAqCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlqYXZhUHJvamVjdHNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlqYXZhUHJvamVjdHNDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlsYWJlbCA9IG5ldyBMYWJlbChqYXZhUHJvamVjdHNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX0xpc3RfVGV4dCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljcmVhdGVUYWJsZSgpOwotCQljcmVhdGVCdXR0b25zQmFyKCk7Ci0JCXVwZGF0ZUVuYWJsZWRTdGF0ZXMoKTsKLQkJcmV0dXJuIGphdmFQcm9qZWN0c0NvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0YWJsZQkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZSgpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGExID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGExLmhvcml6b250YWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhMS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGExLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGExLnZlcnRpY2FsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQl0YWJsZSA9IG5ldyBUYWJsZShqYXZhUHJvamVjdHNDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhMSk7Ci0JCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgQklMaXN0RWxlbWVudFNvcnRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoYmVhbmluZm9zTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYnV0dG9uc0JhcgkKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25zQmFyKCkgewotCQlSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotCQlyb3dMYXlvdXQudHlwZSA9IG9yZy5lY2xpcHNlLnN3dC5TV1QuVkVSVElDQUw7Ci0JCXJvd0xheW91dC5tYXJnaW5MZWZ0ID0gMzsKLQkJcm93TGF5b3V0LmZpbGwgPSB0cnVlOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YSgpOwotCQlncmlkRGF0YTIuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YTIudmVydGljYWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWJ1dHRvbnNCYXIgPSBuZXcgQ29tcG9zaXRlKGphdmFQcm9qZWN0c0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25zQmFyLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJYnV0dG9uc0Jhci5zZXRMYXlvdXQocm93TGF5b3V0KTsKLQkJYWRkRm9sZGVyc2J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0JhciwgU1dULk5PTkUpOwotCQlhZGRGb2xkZXJzYnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5JbmZvc1dvcmtib29rUGFnZV9BZGRGb2xkZXJzKTsKLQkJYWRkRm9sZGVyc2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBiZWFuaW5mb0VudHJpZXMgPSBjaG9vc2VDbGFzc0NvbnRhaW5lcnMoKTsKLQkJCQlhZGRUb0JlYW5pbmZvc0xpc3QoYmVhbmluZm9FbnRyaWVzKTsKLQkJCX0KLQkJfSk7Ci0JCWFkZEphcnNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJYWRkSmFyc0J1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkSkFScyk7Ci0JCWFkZEphcnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgYmVhbmluZm9FbnRyaWVzID0gY2hvb3NlSmFyRmlsZXMoKTsKLQkJCQlhZGRUb0JlYW5pbmZvc0xpc3QoYmVhbmluZm9FbnRyaWVzKTsKLQkJCX0KLQkJfSk7Ci0JCWFkZEV4dEphcnNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJYWRkRXh0SmFyc0J1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkRXh0ZXJuYWxKQVIpOwotCQlhZGRFeHRKYXJzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IGJlYW5pbmZvRW50cmllcyA9IGNob29zZUV4dEphckZpbGVzKCk7Ci0JCQkJYWRkVG9CZWFuaW5mb3NMaXN0KGJlYW5pbmZvRW50cmllcyk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRWYXJpYWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0JhciwgU1dULk5PTkUpOwotCQlhZGRWYXJpYWJsZUJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkVmFyaWFibGUpOwotCQlhZGRWYXJpYWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTGlzdCBiZWFuaW5mb0VudHJpZXMgPSBjaG9vc2VWYXJpYWJsZUVudHJpZXMoKTsKLQkJCQlhZGRUb0JlYW5pbmZvc0xpc3QoYmVhbmluZm9FbnRyaWVzKTsKLQkJCX0KLQkJfSk7Ci0JCWFkZFByb2plY3RCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJYWRkUHJvamVjdEJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkUHJvamVjdHMpOwotCQlhZGRQcm9qZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IGJlYW5pbmZvRW50cmllcyA9IGNob29zZVByb2plY3RzKCk7Ci0JCQkJYWRkVG9CZWFuaW5mb3NMaXN0KGJlYW5pbmZvRW50cmllcyk7Ci0JCQl9Ci0JCX0pOwotCQlzcGFjZXIxID0gbmV3IExhYmVsKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJbW9kaWZ5UGF0aHNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJbW9kaWZ5UGF0aHNCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9zV29ya2Jvb2tQYWdlX01vZGlmeVBhdGhzKTsKLQkJbW9kaWZ5UGF0aHNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGlmeVNlYXJjaFBhdGhzKCk7Ci0JCQl9Ci0JCX0pOwotCQlzcGFjZXIyID0gbmV3IExhYmVsKGJ1dHRvbnNCYXIsIFNXVC5OT05FKTsKLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQmFyLCBTV1QuTk9ORSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfUmVtb3ZlKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IHNlbGVjdGVkID0gQmVhbmluZm9QYXRoc0Jsb2NrLmdldFNlbGVjdGVkTGlzdCh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJYmVhbmluZm9zTGlzdC5yZW1vdmVBbGwoc2VsZWN0ZWQpOwotCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGNob29zZVZhcmlhYmxlRW50cmllcygpIHsKLQkJLy8gUmVtb3ZlIGV4aXN0aW5nIHZhcmlhYmxlIGVudHJpZXMgaW4gYm90aCB0aGUgY2xhc3NwYXRoIGFuZCB0aGUgYmVhbmluZm9wYXRocy4KLQkJLy8gRG9uJ3Qgd2FudCBjbGFzc3BhdGggb25lcyBiZWNhdXNlIHRoZXkgc2hvdWxkIGJlIG9mIGJlZW4gc2VsZWN0ZWQgaW4gdGhlIHNlYXJjaCBwYXRocyBwYWdlLgotCQlBcnJheUxpc3QgZXhpc3RpbmdQYXRocz0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgcmF3TGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJhd0xpc3RbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSkgewotCQkJCWV4aXN0aW5nUGF0aHMuYWRkKHJhd0xpc3RbaV0uZ2V0UGF0aCgpKTsKLQkJCX0KLQkJfQotCQkKLQkJTGlzdCBvdXJzID0gYmVhbmluZm9zTGlzdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCUEJlYW5pbmZvTGlzdEVsZW1lbnQgYnBiID0gKEJQQmVhbmluZm9MaXN0RWxlbWVudCkgb3Vycy5nZXQoaSk7Ci0JCQlpZiAoYnBiLmdldEVudHJ5KCkuZ2V0S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUpCi0JCQkJZXhpc3RpbmdQYXRocy5hZGQoYnBiLmdldEVudHJ5KCkuZ2V0UGF0aCgpKTsKLQkJfQotCQkKLQkJVmFyaWFibGVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nPSBuZXcgVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coYWRkVmFyaWFibGVCdXR0b24uZ2V0U2hlbGwoKSwgZXhpc3RpbmdQYXRocyk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJSVBhdGggcGF0aD0gZGlhbG9nLmdldFZhcmlhYmxlKCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgY3BlID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShwYXRoLCBudWxsLCBudWxsKTsKLQkJCUlQYXRoIHJlc29sdmVkUGF0aD0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgocGF0aCk7Ci0JCQlib29sZWFuIGlzTWlzc2luZyA9IHJlc29sdmVkUGF0aCA9PSBudWxsIHx8ICFyZXNvbHZlZFBhdGgudG9GaWxlKCkuaXNGaWxlKCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgQlBCZWFuaW5mb0xpc3RFbGVtZW50KG5ldyBCZWFuaW5mb0VudHJ5KGNwZSwgbnVsbCwgdHJ1ZSksIG51bGwsIGlzTWlzc2luZykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHJpdmF0ZSBMaXN0IGNob29zZUphckZpbGVzKCkgewotCQlJUGF0aFtdIGphclBhdGhzID0gQnVpbGRQYXRoRGlhbG9nQWNjZXNzLmNob29zZUpBUkVudHJpZXMoYWRkSmFyc0J1dHRvbi5nZXRTaGVsbCgpLCBqYXZhUHJvamVjdC5nZXRQYXRoKCksIGdldFVzZWRKQVJGaWxlcygpKTsKLQkJaWYgKGphclBhdGhzIT1udWxsKSB7Ci0JCQlMaXN0IHJlcz0gbmV3IEFycmF5TGlzdChqYXJQYXRocy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGphclBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQlBCZWFuaW5mb0xpc3RFbGVtZW50IG5ld0d1eSA9IG5ld0JQQmVhbmluZm9MaXN0RWxlbWVudEZyb21GdWxscGF0aChqYXJQYXRoc1tpXSk7Ci0JCQkJaWYgKG5ld0d1eSAhPSBudWxsKQotCQkJCQlyZXMuYWRkKG5ld0d1eSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgTGlzdCBjaG9vc2VFeHRKYXJGaWxlcygpIHsKLQkJSVBhdGhbXSBleHRKQVJQYXRocyA9IEJ1aWxkUGF0aERpYWxvZ0FjY2Vzcy5jaG9vc2VFeHRlcm5hbEpBUkVudHJpZXMoYWRkRXh0SmFyc0J1dHRvbi5nZXRTaGVsbCgpKTsKLQkJTGlzdCBlbGVtcyA9IG51bGw7Ci0JCWlmKGV4dEpBUlBhdGhzIT1udWxsKXsKLQkJCWVsZW1zID0gbmV3IEFycmF5TGlzdChleHRKQVJQYXRocy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGV4dEpBUlBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQlBCZWFuaW5mb0xpc3RFbGVtZW50IG5ld0d1eSA9IG5ld0JQQmVhbmluZm9MaXN0RWxlbWVudChleHRKQVJQYXRoc1tpXSk7Ci0JCQkJaWYgKG5ld0d1eSAhPSBudWxsKQotCQkJCQllbGVtcy5hZGQobmV3R3V5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbXM7Ci0JfQotCi0JcHJpdmF0ZSBCUEJlYW5pbmZvTGlzdEVsZW1lbnQgbmV3QlBCZWFuaW5mb0xpc3RFbGVtZW50KElQYXRoIHBhdGgpIHsKLQkJLy8gQ3JlYXRlIGZvciBhbiBleHRlcm5hbCwgaWYgbm90IGFscmVhZHkgdXNlZCBpbiBlaXRoZXIgY2xhc3NwYXRoIG9yIGJlYW5pbmZvIHBhdGguCi0JCS8vIFRoZXNlIGNhbid0IGJlIHByZS1zZWxlY3RlZCBvdXQgbGlrZSBmb3IgdGhlIG90aGVyIGNob29zZSBkaWFsb2dzLgotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc29sdmVkTGlzdC5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGNwZSA9IHJlc29sdmVkTGlzdFtpXTsKLQkJCWlmIChjcGUgIT0gbnVsbCAmJiBjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZICYmIGNwZS5nZXRQYXRoKCkuZXF1YWxzKHBhdGgpKQotCQkJCXJldHVybiBudWxsOwkvLyBBbHJlYWR5IGV4aXN0cy4KLQkJfQotCQkKLQkJLy8gTm93IHNlZSBpZiBvbmUgb2Ygb3Vycy4KLQkJTGlzdCBvdXJzID0gYmVhbmluZm9zTGlzdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCUEJlYW5pbmZvTGlzdEVsZW1lbnQgYnBiID0gKEJQQmVhbmluZm9MaXN0RWxlbWVudCkgb3Vycy5nZXQoaSk7Ci0JCQlpZiAoYnBiLmdldEVudHJ5KCkuZ2V0S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAmJiBicGIuZ2V0RW50cnkoKS5nZXRQYXRoKCkuZXF1YWxzKHBhdGgpKQotCQkJCXJldHVybiBudWxsOwkvLyBBbHJlYWR5IGV4aXN0cwotCQl9Ci0JCQotCQlJQ2xhc3NwYXRoRW50cnkgY3BlID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwpOwotCQlCZWFuaW5mb0VudHJ5IGJpZSA9IG5ldyBCZWFuaW5mb0VudHJ5KGNwZSwgbnVsbCwgdHJ1ZSk7Ci0JCXJldHVybiBuZXcgQlBCZWFuaW5mb0xpc3RFbGVtZW50KGJpZSwgbnVsbCwgZmFsc2UpOwotCX0KLQkKLQotCXByaXZhdGUgSVBhdGhbXSBnZXRVc2VkSkFSRmlsZXMoKSB7Ci0JCS8vIEphcnMgdXNlZCBieSBib3RoIHRoZSBjbGFzc3BhdGggYW5kIHRoZSBiZWFuaW5mbyBzZWFyY2ggcGF0aC4KLQkJLy8gRG9uJ3Qgd2FudCBqYXJzIHVzZWQgYnkgY2xhc3NwYXRoIGJlY2F1c2UgdGhvc2Ugd291bGQgdGhlbiBiZQotCQkvLyBpbiB0aGUgYnVpbGRwYXRoIGFuZCB1c2VyIHdvdWxkIHNlbGVjdCBwYXRocyB0aHJvdWdoIHRoZSBzZWFyY2ggcGF0aCBwYWdlLgotCQlBcnJheUxpc3QgcmVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCByZXNvbHZlZExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZXNvbHZlZExpc3RbaV0gIT0gbnVsbCAmJiByZXNvbHZlZExpc3RbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJSVBhdGggcGF0aCA9IHJlc29sdmVkTGlzdFtpXS5nZXRQYXRoKCk7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIocGF0aCk7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0JCQkJCXJlcy5hZGQocGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGJpbGlzdD0gYmVhbmluZm9zTGlzdDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGJpbGlzdC5zaXplKCk7IGkrKykgewotCQkJQlBMaXN0RWxlbWVudCBlbGVtPSAoQlBMaXN0RWxlbWVudCliaWxpc3QuZ2V0KGkpOwotCQkJaWYgKGVsZW0uZ2V0RW50cnkoKS5nZXRLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJSVBhdGggcGF0aCA9IGVsZW0uZ2V0RW50cnkoKS5nZXRQYXRoKCk7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIocGF0aCk7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0JCQkJCXJlcy5hZGQocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJUGF0aFtdKSByZXMudG9BcnJheShuZXcgSVBhdGhbcmVzLnNpemUoKV0pOwotCX0JCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgQlBMaXN0RWxlbWVudCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIEJQQmVhbmluZm9MaXN0RWxlbWVudCBuZXdCUEJlYW5pbmZvTGlzdEVsZW1lbnQoSVJlc291cmNlIGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJcmV0dXJuIG5ld0JQQmVhbmluZm9MaXN0RWxlbWVudEZyb21GdWxscGF0aChlbGVtZW50LmdldEZ1bGxQYXRoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgQlBMaXN0RWxlbWVudCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcml2YXRlIEJQQmVhbmluZm9MaXN0RWxlbWVudCBuZXdCUEJlYW5pbmZvTGlzdEVsZW1lbnRGcm9tRnVsbHBhdGgoSVBhdGggZnVsbFBhdGgpIHsKLQkJaWYoZnVsbFBhdGghPW51bGwpewotCQkJSUNsYXNzcGF0aEVudHJ5IGNwZSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShmdWxsUGF0aCwgbnVsbCwgbnVsbCk7Ci0JCQlCZWFuaW5mb0VudHJ5IGJpZSA9IG5ldyBCZWFuaW5mb0VudHJ5KGNwZSwgbnVsbCwgdHJ1ZSk7Ci0JCQlyZXR1cm4gbmV3IEJQQmVhbmluZm9MaXN0RWxlbWVudChiaWUsIG51bGwsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY2hvb3NlQ2xhc3NDb250YWluZXJzKCkgewkKLQkJQ2xhc3NbXSBhY2NlcHRlZENsYXNzZXM9IG5ldyBDbGFzc1tdIHsgSUZvbGRlci5jbGFzcyB9OwotCQlJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHZhbGlkYXRvcj0gbmV3IFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihhY2NlcHRlZENsYXNzZXMsIHRydWUpOwotCQkJCi0JCWFjY2VwdGVkQ2xhc3Nlcz0gbmV3IENsYXNzW10geyBJUHJvamVjdC5jbGFzcywgSUZvbGRlci5jbGFzcyB9OwotCi0JCVZpZXdlckZpbHRlciBmaWx0ZXI9IG5ldyBUeXBlZFZpZXdlckZpbHRlcihhY2NlcHRlZENsYXNzZXMsIGdldFVzZWRDb250YWluZXJzKCkpOwkKLQkJCQotCQlJTGFiZWxQcm92aWRlciBscD0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3A9IG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKTsKLQotCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2c9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhhZGRGb2xkZXJzYnV0dG9uLmdldFNoZWxsKCksIGxwLCBjcCk7Ci0JCWRpYWxvZy5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKLQkJZGlhbG9nLnNldFRpdGxlKEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX0NsYXNzZXNfVGl0bGUpOyAKLQkJZGlhbG9nLnNldE1lc3NhZ2UoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfQ2xhc3Nlc19Qcm9tcHQpOyAgCi0JCWRpYWxvZy5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJZGlhbG9nLnNldElucHV0KHdvcmtzcGFjZVJvb3QpOwotCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cz0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJTGlzdCByZXM9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUJQQmVhbmluZm9MaXN0RWxlbWVudCBuZXdHdXkgPSBuZXdCUEJlYW5pbmZvTGlzdEVsZW1lbnQoKElSZXNvdXJjZSkgZWxlbWVudHNbaV0pOwotCQkJCWlmIChuZXdHdXkgIT0gbnVsbCkKLQkJCQkJcmVzLmFkZChuZXdHdXkpOwotCQkJfQotCQkJcmV0dXJuIHJlczsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkKLQlwcml2YXRlIElDb250YWluZXJbXSBnZXRVc2VkQ29udGFpbmVycygpIHsKLQkJLy8gQ29udGFpbmVycyB1c2VkIGJ5IGJvdGggdGhlIGNsYXNzcGF0aCBhbmQgdGhlIGJlYW5pbmZvIHNlYXJjaCBwYXRoLgotCQkvLyBEb24ndCB3YW50IGNvbnRhaW5lcnMgdXNlZCBieSBjbGFzc3BhdGggYmVjYXVzZSB0aG9zZSB3b3VsZCB0aGVuIGJlCi0JCS8vIGluIHRoZSBidWlsZHBhdGggYW5kIHVzZXIgd291bGQgc2VsZWN0IHBhdGhzIHRocm91Z2ggdGhlIHNlYXJjaCBwYXRoIHBhZ2UuCi0JCUFycmF5TGlzdCByZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlQYXRoIG91dHB1dExvY2F0aW9uPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJaWYgKG91dHB1dExvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2U9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihvdXRwdXRMb2NhdGlvbik7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQlyZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUgaXQgaGVyZSwganVzdCBsb2cKLQkJCUpFTVVJUGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfQotCQkJCi0JCWZvciAoaW50IGk9IDA7IGkgPCByZXNvbHZlZExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZXNvbHZlZExpc3RbaV0gIT0gbnVsbCAmJiByZXNvbHZlZExpc3RbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2U9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihyZXNvbHZlZExpc3RbaV0uZ2V0UGF0aCgpKTsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXJlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxpc3QgYmlsaXN0PSBiZWFuaW5mb3NMaXN0OwotCQlmb3IgKGludCBpPSAwOyBpIDwgYmlsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlCUExpc3RFbGVtZW50IGVsZW09IChCUExpc3RFbGVtZW50KWJpbGlzdC5nZXQoaSk7Ci0JCQlpZiAoZWxlbS5nZXRFbnRyeSgpLmdldEtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKGVsZW0uZ2V0RW50cnkoKS5nZXRQYXRoKCkpOwotCQkJCXJlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbnRhaW5lcltdKSByZXMudG9BcnJheShuZXcgSUNvbnRhaW5lcltyZXMuc2l6ZSgpXSk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9CZWFuaW5mb3NMaXN0KGZpbmFsIExpc3QgdG9BZGQpewotCQlpZiAoYmVhbmluZm9zTGlzdCAhPSBudWxsICYmIHRvQWRkIT1udWxsKSB7Ci0JCQliZWFuaW5mb3NMaXN0LmFkZEFsbCh0b0FkZCk7Ci0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQl0YWJsZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRvQWRkKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlwYWdlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYWdlQ2hhbmdlZCgpIHsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgaW5pdGlhbGl6ZWQKLQkJCXVwZGF0ZVNlYXJjaHBhdGhMaXN0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VhcmNocGF0aExpc3QoKSB7Ci0JCUxpc3Qgc2VhcmNoZWxlbWVudHMgPSBiZWFuaW5mb1BhdGhzQmxvY2suZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpLmdldEVsZW1lbnRzKCk7Ci0KLQkJTGlzdCBiZWFuaW5mb2VsZW1lbnRzID0gbmV3IEFycmF5TGlzdChiZWFuaW5mb3NMaXN0KTsKLQotCQlib29sZWFuIGNoYW5nZURvbmUgPSBmYWxzZTsKLQkJLy8gRmlyc3QgZ28gdGhyb3VnaCB0aGUgc2VhcmNoIHBhdGggYW5kIHJlbW92ZSBhbnkgQmVhbmluZm8gbGlzdCBlbGVtZW50cyB0aGF0Ci0JCS8vIGFyZSBub3QgaW4gdGhpcyBwYWdlcyBiZWFuaW5mb3MgbGlzdC4KLQkJZm9yIChMaXN0SXRlcmF0b3Igc3BpdHIgPSBzZWFyY2hlbGVtZW50cy5saXN0SXRlcmF0b3Ioc2VhcmNoZWxlbWVudHMuc2l6ZSgpKTsKLQkJCXNwaXRyLmhhc1ByZXZpb3VzKCk7Ci0JCQkpIHsKLQkJCUJQTGlzdEVsZW1lbnQgZWxlbWVudCA9IChCUExpc3RFbGVtZW50KSBzcGl0ci5wcmV2aW91cygpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCUEJlYW5pbmZvTGlzdEVsZW1lbnQgJiYgIWJlYW5pbmZvZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpKSB7Ci0JCQkJLy8gU2VhcmNoIGVsZW1lbnQgYW5kIG5vdCBmb3VuZCBpbiBwYWNrYWdlcyBsaXN0IHNvIHJlbW92ZSBpdCBmcm9tIHNlYXJjaHBhdGggbGlzdC4KLQkJCQlzcGl0ci5yZW1vdmUoKTsKLQkJCQljaGFuZ2VEb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBBbnkgbGVmdCBvdmVyIGluIGJlYW5pbmZvcyBsaXN0IGFyZSBuZXcgYW5kIG5lZWQgdG8gYmUgYWRkZWQuCi0JCXNlYXJjaGVsZW1lbnRzLmFkZEFsbChiZWFuaW5mb2VsZW1lbnRzKTsKLQkJY2hhbmdlRG9uZSA9IGNoYW5nZURvbmUgfHwgIWJlYW5pbmZvZWxlbWVudHMuaXNFbXB0eSgpOwotCi0JCWlmIChjaGFuZ2VEb25lKQotCQkJYmVhbmluZm9QYXRoc0Jsb2NrLnNldFNlYXJjaE9yZGVyRWxlbWVudHMoc2VhcmNoZWxlbWVudHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KXsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQlsYWJlbFByb3ZpZGVyLnNldEphdmFQcm9qZWN0KHRoaXMuamF2YVByb2plY3QpOwotCQl0cnkgewotCQkJcmF3TGlzdCA9IHRoaXMuamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlyZXNvbHZlZExpc3QgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Jhd0xpc3QubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmF3TGlzdC5sZW5ndGg7IGkrKykgewotCQkJCXJlc29sdmVkTGlzdFtpXSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkocmF3TGlzdFtpXSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyYXdMaXN0ID0gcmVzb2x2ZWRMaXN0ID0gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQkJfQotCQl1cGRhdGVCZWFuaW5mb3NMaXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJlYW5pbmZvc0xpc3QoKSB7Ci0JCUxpc3Qgc3BlbGVtZW50cyA9IGJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWFyY2hwYXRoT3JkZXJpbmdQYWdlKCkuZ2V0RWxlbWVudHMoKTsKLQotCQlMaXN0IGJpRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KHNwZWxlbWVudHMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlCUExpc3RFbGVtZW50IHNwZSA9IChCUExpc3RFbGVtZW50KSBzcGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChzcGUgaW5zdGFuY2VvZiBCUEJlYW5pbmZvTGlzdEVsZW1lbnQpIHsKLQkJCQliaUVsZW1lbnRzLmFkZChzcGUpOwotCQkJfQotCQl9Ci0JCWJlYW5pbmZvc0xpc3QuY2xlYXIoKTsKLQkJYmVhbmluZm9zTGlzdC5hZGRBbGwoYmlFbGVtZW50cyk7Ci0JCWlmKHRhYmxlVmlld2VyIT1udWxsICYmICF0YWJsZS5pc0Rpc3Bvc2VkKCkpCi0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0aW9uKCkgewotCQlpZih0YWJsZVZpZXdlciE9bnVsbCkKLQkJCXJldHVybiBCZWFuaW5mb1BhdGhzQmxvY2suZ2V0U2VsZWN0ZWRMaXN0KHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCWlmKHRhYmxlVmlld2VyIT1udWxsKQotCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKXsKLQkJTGlzdCBzZWxlY3RlZCA9IEJlYW5pbmZvUGF0aHNCbG9jay5nZXRTZWxlY3RlZExpc3QodGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlhZGRFeHRKYXJzQnV0dG9uLnNldEVuYWJsZWQoYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQlhZGRGb2xkZXJzYnV0dG9uLnNldEVuYWJsZWQoYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQlhZGRKYXJzQnV0dG9uLnNldEVuYWJsZWQoYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQlhZGRQcm9qZWN0QnV0dG9uLnNldEVuYWJsZWQoYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQlhZGRWYXJpYWJsZUJ1dHRvbi5zZXRFbmFibGVkKGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJCi0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHNlbGVjdGVkIT1udWxsICYmIHNlbGVjdGVkLnNpemUoKT4wICYmIGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJbW9kaWZ5UGF0aHNCdXR0b24uc2V0RW5hYmxlZChzZWxlY3RlZCE9bnVsbCAmJiBzZWxlY3RlZC5zaXplKCk9PTEgJiYgYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgY2hvb3NlUHJvamVjdHMoKSB7CQotCQlDbGFzc1tdIGFjY2VwdGVkQ2xhc3Nlcz0gbmV3IENsYXNzW10geyBJSmF2YVByb2plY3QuY2xhc3MgfTsKLQkJSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3I9IG5ldyBUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IoYWNjZXB0ZWRDbGFzc2VzLCB0cnVlKTsKLQotCQlMaXN0IGFsbFByb2plY3RzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFsbFByb2plY3RzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGphdmFQcm9qZWN0LmdldEphdmFNb2RlbCgpLmdldENoaWxkcmVuKCkpKTsKLQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJYWxsUHJvamVjdHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCWFsbFByb2plY3RzLnJlbW92ZUFsbChnZXRVc2VkUHJvamVjdHMoKSk7Ci0JCQkKLQkJSUxhYmVsUHJvdmlkZXIgbHA9IG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfREVGQVVMVCk7Ci0KLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coYWRkUHJvamVjdEJ1dHRvbi5nZXRTaGVsbCgpLCBscCk7Ci0JCWRpYWxvZy5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKLQkJZGlhbG9nLnNldFRpdGxlKEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX1Byb2plY3RzX1RpdGxlKTsgCi0JCWRpYWxvZy5zZXRNZXNzYWdlKEJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX1Byb2plY3RzX1Byb21wdCk7IAotCQlkaWFsb2cuc2V0RWxlbWVudHMoYWxsUHJvamVjdHMudG9BcnJheSgpKTsKLQkJCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0W10gZWxlbWVudHM9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCUxpc3QgcmVzPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlJQ2xhc3NwYXRoRW50cnkgY3BlID0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KCgoSUphdmFQcm9qZWN0KSBlbGVtZW50c1tpXSkuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCUJlYW5pbmZvRW50cnkgYmllID0gbmV3IEJlYW5pbmZvRW50cnkoY3BlLCBudWxsLCB0cnVlKTsKLQkJCQkJcmVzLmFkZChuZXcgQlBCZWFuaW5mb0xpc3RFbGVtZW50KGJpZSwgbnVsbCwgZmFsc2UpKTsKLQkJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlczsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0VXNlZFByb2plY3RzKCkgewotCQkvLyBQcm9qZWN0cyB1c2VkIGJ5IGJvdGggdGhlIGNsYXNzcGF0aCBhbmQgdGhlIGJlYW5pbmZvIHNlYXJjaCBwYXRoLgotCQkvLyBEb24ndCB3YW50IHByb2plY3RzIHVzZWQgYnkgY2xhc3NwYXRoIGJlY2F1c2UgdGhvc2Ugd291bGQgdGhlbiBiZQotCQkvLyBpbiB0aGUgYnVpbGRwYXRoIGFuZCB1c2VyIHdvdWxkIHNlbGVjdCBwYXRocyB0aHJvdWdoIHRoZSBzZWFyY2ggcGF0aCBwYWdlLgotCQlBcnJheUxpc3QgcmVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlcy5hZGQoamF2YVByb2plY3QpOwkvLyBQbHVzIG91ciBvd24gcHJvamVjdCBpcyB1c2VkLgotCQlJSmF2YU1vZGVsIGptb2RlbCA9IGphdmFQcm9qZWN0LmdldEphdmFNb2RlbCgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgcmVzb2x2ZWRMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVzb2x2ZWRMaXN0W2ldICE9IG51bGwgJiYgcmVzb2x2ZWRMaXN0W2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewotCQkJCXJlcy5hZGQoam1vZGVsLmdldEphdmFQcm9qZWN0KHJlc29sdmVkTGlzdFtpXS5nZXRQYXRoKCkuc2VnbWVudCgwKSkpOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBiaWxpc3Q9IGJlYW5pbmZvc0xpc3Q7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBiaWxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUJQTGlzdEVsZW1lbnQgZWxlbT0gKEJQTGlzdEVsZW1lbnQpYmlsaXN0LmdldChpKTsKLQkJCWlmIChlbGVtLmdldEVudHJ5KCkuZ2V0S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgCi0JCQkJcmVzLmFkZChqbW9kZWwuZ2V0SmF2YVByb2plY3QoZWxlbS5nZXRFbnRyeSgpLmdldFBhdGgoKS5zZWdtZW50KDApKSk7CQkJCi0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbW9kaWZ5U2VhcmNoUGF0aHMoKSB7Ci0JCS8vIEJyaW5nIHVwIHRoZSBkaWFsb2cgZm9yIG1vZGlmeWluZyBzZWFyY2ggcGF0aHMgb2YgYSBwYXJ0aWN1bGFyIGJlYW5pbmZvIGVudHJ5LgotCQlCUEJlYW5pbmZvTGlzdEVsZW1lbnQgZWxlbSA9IChCUEJlYW5pbmZvTGlzdEVsZW1lbnQpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwkvLyBUaGVyZSBzaG91bGQgb25seSBiZSBvbmUsIGJ1dHRvbiBub3QgZW5hYmxlZCBpZiBub25lIG9yIG1vcmUgdGhhbiBvbmUgc2VsZWN0ZWQuCi0JCUJlYW5pbmZvRW50cnlTZWFyY2hwYXRoRGlhbG9nIGRpYWxvZyA9IG5ldyBCZWFuaW5mb0VudHJ5U2VhcmNocGF0aERpYWxvZyhtb2RpZnlQYXRoc0J1dHRvbi5nZXRTaGVsbCgpLCBlbGVtLCBqYXZhUHJvamVjdCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZXMoKXsKLQkJdXBkYXRlQnV0dG9ucygpOwotCQl0YWJsZS5zZXRFbmFibGVkKGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJbGFiZWwuc2V0RW5hYmxlZChiZWFuaW5mb1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJlYW5pbmZvRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotCQlpZihqYXZhUHJvamVjdHNDb21wb3NpdGUhPW51bGwgJiYgIWphdmFQcm9qZWN0c0NvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpeyAKLQkJCS8vIHVpIHBvcHVsYXRlZAotCQkJdXBkYXRlRW5hYmxlZFN0YXRlcygpOwotCQl9Ci0JfQotCi19ICAvLyAgQGp2ZTpkZWNsLWluZGV4PTA6dmlzdWFsLWNvbnN0cmFpbnQ9IjEwLDEwIgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvRXhjZXB0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvRXhjZXB0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzc1ZWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEV4Y2VwdGlvbkhhbmRsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8yNiAyMDoyNjo1OSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5jb3JlLkpFTVVJUGx1Z2luOwotIAotLyoqCi0gKiAKLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25IYW5kbGVyIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSwgU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJVGhyb3dhYmxlIHRhcmdldD0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCWhhbmRsZSgoQ29yZUV4Y2VwdGlvbil0YXJnZXQsIHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBlLmdldE1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkaXNwbGF5TWVzc2FnZURpYWxvZyhlLCBlLmdldE1lc3NhZ2UoKSwgc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzcGxheU1lc3NhZ2VEaWFsb2coZSwgdGFyZ2V0LmdldE1lc3NhZ2UoKSwgc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlKENvcmVFeGNlcHRpb24gZSwgU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJSkVNVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQlJU3RhdHVzIHN0YXR1cz0gZS5nZXRTdGF0dXMoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJZGlzcGxheU1lc3NhZ2VEaWFsb2coZSwgZS5nZXRNZXNzYWdlKCksIHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkaXNwbGF5TWVzc2FnZURpYWxvZyhUaHJvd2FibGUgdCwgU3RyaW5nIGV4Y2VwdGlvbk1lc3NhZ2UsIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZ1dyaXRlciBtc2c9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbXNnLndyaXRlKG1lc3NhZ2UpOwotCQkJbXNnLndyaXRlKCJcblxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZXhjZXB0aW9uTWVzc2FnZSA9PSBudWxsIHx8IGV4Y2VwdGlvbk1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCW1zZy53cml0ZSgiU2VlIGVycm9yIGxvZyBmb3IgbW9yZSBkZXRhaWxzLiIpOyAKLQkJZWxzZQotCQkJbXNnLndyaXRlKGV4Y2VwdGlvbk1lc3NhZ2UpOwotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZy50b1N0cmluZygpKTsJCQkKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9JQnVpbGRTZWFyY2hQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9JQnVpbGRTZWFyY2hQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Zjk4ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvSUJ1aWxkU2VhcmNoUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUJ1aWxkU2VhcmNoUGFnZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzEwLzAzIDIzOjA2OjQyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUJ1aWxkU2VhcmNoUGFnZSB7Ci0KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3Rpb24oKTsKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oTGlzdCBzZWxlY3Rpb24pOwotCXB1YmxpYyB2b2lkIHNldEJlYW5pbmZvRW5hYmxlZChib29sZWFuIGVuYWJsZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9JU3RhdHVzQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0lTdGF0dXNDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2MyOTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0lTdGF0dXNDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSVN0YXR1c0NoYW5nZUxpc3RlbmVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMjYgMjA6MjY6NTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLSAKLS8qKgotICogU3RhdHVzIGNoYW5nZSBsaXN0ZW5lcgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhdHVzQ2hhbmdlTGlzdGVuZXIgewotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgZ2l2ZW4gc3RhdHVzIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbQlzdGF0dXMJdGhlIG5ldyBzdGF0dXMKLQkgKi8KLQl2b2lkIHN0YXR1c0NoYW5nZWQoSVN0YXR1cyBzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvSW1hZ2VEaXNwb3Nlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvSW1hZ2VEaXNwb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDFiODI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0ltYWdlRGlzcG9zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEltYWdlRGlzcG9zZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8yNiAyMDoyNjo1OSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLSAKLS8qKgotICogCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VEaXNwb3NlciBpbXBsZW1lbnRzIERpc3Bvc2VMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBJbWFnZVtdIGZJbWFnZXM7Ci0JCQotCXB1YmxpYyBJbWFnZURpc3Bvc2VyKEltYWdlIGltYWdlKSB7Ci0JCXRoaXMobmV3IEltYWdlW10geyBpbWFnZSB9KTsKLQl9Ci0JCi0JcHVibGljIEltYWdlRGlzcG9zZXIoSW1hZ2VbXSBpbWFnZXMpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpbWFnZXMpOwotCQlmSW1hZ2VzPSBpbWFnZXM7CQkKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIFdpZGdldExpc3RlbmVyI3dpZGdldERpc3Bvc2VkCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJaWYgKGZJbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZJbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmSW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9PdmVybGF5Q29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9PdmVybGF5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODhkMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvT3ZlcmxheUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgQ3JlYXRlZCBBcHIgMjcsIDIwMDUgYnkgR2lsaSBNZW5kZWwKLSAqIAotICogICRSQ1NmaWxlOiBPdmVybGF5Q29tcG9zaXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLSAKLS8vVE9ETzogIFRoaXMgY2xhc3Mgd2FzIGRyb3BwZWQgaW4gMy4xIE03IGZyb20gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYwotLy8gICAgICAgV2UgbWFkZSAgbG9jYWwgY29weSBmb3IgdGhlIHRpbWUgYmVpbmcuICBOZWVkIHRvIGludmVzdGlnYXRlIGlmIHRoaXMgaXMgZmlsZQotLy8gICAgICAgZm9yIHVzIGdpdmVuIHRoYXQgdGhlIE92ZXJsYXlJY29uIChyZXBsYWNlbWVudCkgaXMgaW50ZXJuYWwKLXB1YmxpYyBjbGFzcyBPdmVybGF5Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQotICAgIHByaXZhdGUgSW1hZ2VEYXRhIGJhY2tncm91bmRJbWFnZTsKLQotICAgIHByaXZhdGUgSW1hZ2VEYXRhIGxlZnRJbWFnZTsKLQotICAgIHByaXZhdGUgSW1hZ2VEYXRhIHJpZ2h0SW1hZ2U7Ci0KLSAgICBwcml2YXRlIEltYWdlRGF0YSB0b3BJbWFnZTsKLQotICAgIHByaXZhdGUgSW1hZ2VEYXRhIGJvdHRvbUltYWdlOwotCi0gICAgcHJpdmF0ZSBMaXN0IGZvcmVncm91bmRJbWFnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKglDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlcmxheUNvbXBvc2l0ZShJbWFnZURhdGEgYmFja2dyb3VuZCkgewotICAgICAgICBiYWNrZ3JvdW5kSW1hZ2UgPSBiYWNrZ3JvdW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFkZCB0aGUgcGFzc2VkIGltYWdlIHRvIHRoaXMgZGVzY3JpcHRvcidzIGNvbGxlY3Rpb24gb2YgaW1hZ2VzIHRvIAotICAgICAqIGJlIGNvbXBvc2VkIHRvZ2V0aGVyIHRvIGNyZWF0ZSBhbiBpbWFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGb3JlZ3JvdW5kSW1hZ2UoSW1hZ2VEYXRhIGltYWdlKSB7Ci0gICAgICAgIGZvcmVncm91bmRJbWFnZXMuYWRkKGltYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKlN1cGVyaW1wb3NlIHNlbGYncyBpbWFnZXMgd2l0aGluIHRoZSBnaXZlbiBib3VuZHMgYnkgbWVhbnMgb2YgI2RyYXdJbWFnZQotICAgICAqCi0gICAgICpAc2VlIENvbXBvc2l0ZUltYWdlI2RyYXdJbWFnZShJbWFnZURhdGEgc3JjLGludCBveCxpbnQgb3kpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAvL2RyYXcgYmFja2dyb3VuZAotICAgICAgICBkcmF3SW1hZ2UoYmFja2dyb3VuZEltYWdlLCBnZXRMZWZ0Qm91bmQoKSwgZ2V0VG9wQm91bmQoKSk7Ci0KLSAgICAgICAgLy9kcmF3IGZvcmVncm91bmQgaW1hZ2VzCi0gICAgICAgIEl0ZXJhdG9yIGUgPSBmb3JlZ3JvdW5kSW1hZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkKLSAgICAgICAgICAgIGRyYXdJbWFnZSgoKEltYWdlRGF0YSkgZS5uZXh0KCkpLCBnZXRMZWZ0Qm91bmQoKSwgZ2V0VG9wQm91bmQoKSk7Ci0KLSAgICAgICAgLy9kcmF3IGV4dGVuc2lvbnMKLSAgICAgICAgaWYgKHRvcEltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBkcmF3SW1hZ2UodG9wSW1hZ2UsIGdldExlZnRCb3VuZCgpLCAwKTsKLSAgICAgICAgaWYgKGJvdHRvbUltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBkcmF3SW1hZ2UoYm90dG9tSW1hZ2UsIGdldExlZnRCb3VuZCgpLCBoZWlnaHQgLSBib3R0b21JbWFnZS5oZWlnaHQpOwotICAgICAgICBpZiAobGVmdEltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBkcmF3SW1hZ2UobGVmdEltYWdlLCAwLCBnZXRUb3BCb3VuZCgpKTsKLSAgICAgICAgaWYgKHJpZ2h0SW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIGRyYXdJbWFnZShyaWdodEltYWdlLCB3aWR0aCAtIHJpZ2h0SW1hZ2Uud2lkdGgsIGdldFRvcEJvdW5kKCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBPYmplY3QjZXF1YWxzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBPdmVybGF5Q29tcG9zaXRlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIE92ZXJsYXlDb21wb3NpdGUgb3RoZXIgPSAoT3ZlcmxheUNvbXBvc2l0ZSkgbzsKLQotICAgICAgICByZXR1cm4gZXF1YWxzKGJhY2tncm91bmRJbWFnZSwgb3RoZXIuYmFja2dyb3VuZEltYWdlKQotICAgICAgICAgICAgICAgICYmIGVxdWFscyhsZWZ0SW1hZ2UsIG90aGVyLmxlZnRJbWFnZSkKLSAgICAgICAgICAgICAgICAmJiBlcXVhbHMocmlnaHRJbWFnZSwgb3RoZXIucmlnaHRJbWFnZSkKLSAgICAgICAgICAgICAgICAmJiBlcXVhbHModG9wSW1hZ2UsIG90aGVyLnRvcEltYWdlKQotICAgICAgICAgICAgICAgICYmIGVxdWFscyhib3R0b21JbWFnZSwgb3RoZXIuYm90dG9tSW1hZ2UpCi0gICAgICAgICAgICAgICAgJiYgZXF1YWxzKGZvcmVncm91bmRJbWFnZXMsIG90aGVyLmZvcmVncm91bmRJbWFnZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaXZhdGUgdXRpbGl0eSBmb3IgY29tcGFyaW5nIHR3byBwb3NzaWJseS1udWxsIG9iamVjdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGVxdWFscyhPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICByZXR1cm4gbzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgbGVmdC1tb3N0IGNvb3JkaW5hdGUgdGhhdCB0aGUgbWFpbiBpbWFnZSBjYW4gZHJhdyB0bwotICAgICAqCi0gICAgICoJQHJldHVybiBpbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldExlZnRCb3VuZCgpIHsKLSAgICAgICAgaWYgKGxlZnRJbWFnZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgcmV0dXJuIGxlZnRJbWFnZS53aWR0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKglBbnN3ZXIgc2VsZidzIHNpemUsIGFzIGRldGVybWluZWQgYnkgdGhlIHNpemUgb2YgdGhlIGluaXRpYWxseS0KLSAgICAgKglwcm92aWRlZCBiYXNlLWxldmVsIGltYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0gICAgICAgIC8vc3RhcnQgd2l0aCBiYXNpYyBzaXplCi0gICAgICAgIFBvaW50IHNpemUgPSBuZXcgUG9pbnQoYmFja2dyb3VuZEltYWdlLndpZHRoLCBiYWNrZ3JvdW5kSW1hZ2UuaGVpZ2h0KTsKLQotICAgICAgICAvL292ZXJsYXlzIG1heSBpbmNyZWFzZSBzaXplLgotICAgICAgICBpZiAodG9wSW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHNpemUueSArPSB0b3BJbWFnZS5oZWlnaHQ7Ci0KLSAgICAgICAgaWYgKGJvdHRvbUltYWdlICE9IG51bGwpCi0gICAgICAgICAgICBzaXplLnkgKz0gYm90dG9tSW1hZ2UuaGVpZ2h0OwotCi0gICAgICAgIGlmIChsZWZ0SW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHNpemUueCArPSBsZWZ0SW1hZ2Uud2lkdGg7Ci0KLSAgICAgICAgaWYgKHJpZ2h0SW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHNpemUueCArPSByaWdodEltYWdlLndpZHRoOwotCi0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCUFuc3dlciB0aGUgdG9wLW1vc3QgY29vcmRpbmF0ZSB0aGF0IHRoZSBtYWluIGltYWdlIGNhbiBkcmF3IHRvCi0gICAgICoKLSAgICAgKglAcmV0dXJuIGludAotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0VG9wQm91bmQoKSB7Ci0gICAgICAgIGlmICh0b3BJbWFnZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgcmV0dXJuIHRvcEltYWdlLmhlaWdodDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIE9iamVjdCNoYXNoQ29kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBoYXNoQ29kZShiYWNrZ3JvdW5kSW1hZ2UpICsgaGFzaENvZGUobGVmdEltYWdlKQotICAgICAgICAgICAgICAgICsgaGFzaENvZGUocmlnaHRJbWFnZSkgKyBoYXNoQ29kZSh0b3BJbWFnZSkKLSAgICAgICAgICAgICAgICArIGhhc2hDb2RlKGJvdHRvbUltYWdlKSArIGhhc2hDb2RlKGZvcmVncm91bmRJbWFnZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaXZhdGUgdXRpbGl0eSBmb3IgZ2V0dGluZyB0aGUgaGFzaENvZGUgZm9yIGFuCi0gICAgICogb2JqZWN0IHRoYXQgbWF5IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaGFzaENvZGUoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIG8gPT0gbnVsbCA/IDAgOiBvLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgaW1hZ2UgdG8gYmUgZHJhd24gYmVsb3cgdGhlIHByaW1hcnkgb3ZlcmxheSByZWdpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Qm90dG9tRXh0ZW5zaW9uKEltYWdlRGF0YSB2YWx1ZSkgewotICAgICAgICBib3R0b21JbWFnZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIGltYWdlIHRvIGJlIGRyYXduIHRvIHRoZSBsZWZ0IG9mIHRoZSBwcmltYXJ5IG92ZXJsYXkgcmVnaW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExlZnRFeHRlbnNpb24oSW1hZ2VEYXRhIHZhbHVlKSB7Ci0gICAgICAgIGxlZnRJbWFnZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIGltYWdlIHRvIGJlIGRyYXduIHRvIHRoZSByaWdodCBvZiB0aGUgcHJpbWFyeSBvdmVybGF5IHJlZ2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSaWdodEV4dGVuc2lvbihJbWFnZURhdGEgdmFsdWUpIHsKLSAgICAgICAgcmlnaHRJbWFnZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIGltYWdlIHRvIGJlIGRyYXduIGFib3ZlIHRoZSBwcmltYXJ5IG92ZXJsYXkgcmVnaW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvcEV4dGVuc2lvbihJbWFnZURhdGEgdmFsdWUpIHsKLSAgICAgICAgdG9wSW1hZ2UgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1BhY2thZ2VPbmx5Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9QYWNrYWdlT25seUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFkMThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1BhY2thZ2VPbmx5Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBhY2thZ2VPbmx5Q29udGVudFByb3ZpZGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0vKioKLSAqIEEgY29udGVudCBwcm92aWRlciB3aGljaCB3aWxsIG9ubHkgZ28gZG93biB0byB0aGUgcGFja2FnZSBsZXZlbCwKLSAqIGl0IHdvbid0IGV4cGxvcmUgZnVydGhlci4gVGhlIGFkdmFudGFnZSBvZiB0aGlzIGlzIHNvIHRoYXQgcGx1cyBzaWducyAoJysnKQotICogd29uJ3Qgc2hvdyB1cCBvbiBwYWNrYWdlcy4gVGhlIEZpbHRlciB0ZWNobmlxdWUgY291bGQgYmUgdXNlZCB0byBub3QKLSAqIHNob3cgdGhlIGNoaWxkcmVuLCBidXQgdGhpcyBzdGlsbCBzaG93cyB0aGUgcGx1cyBzaWduLgotICoKLSAqIEFsc28sIGlmIHRoZSBlbGVtZW50IGlzIGEgamF2YS51dGlsLkxpc3QsIHRoZW4gdGhhdCBsaXN0IHdpbGwgYmUgcmV0dXJuZWQKLSAqIGFzIHRoZSBjaGlsZHJlbi4gVGhpcyBhbGxvd3MgZm9yIGEgcm9vdCB0byBiZSBjb21wb3NlZCBpbnN0ZWFkIG9mIGJlaW5nCi0gKiBvbmUgb2YgdGhlIHN0YW5kYXJkIEphdmEgRWxlbWVudHMuCi0gKi8KLQotcHVibGljIGNsYXNzIFBhY2thZ2VPbmx5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlciB7Ci0JCi0JLyoqCi0JICogSWYgdGhlIGVsZW1lbnQgaXMgYSBsaXN0LCByZXR1cm4gdGhlIGl0ZXJhdG9yIG9uIGl0LgotCSAqIEVsc2Ugc2VuZCBpdCB1cCB0aGUgY2hhaW4uCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCkKLQkJCXJldHVybiAoKExpc3QpIGVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgZWxlbWVudCBpcyBhIGxpc3QgYW5kIGl0IGlzIG5vdCBlbXB0eSwgaXQgaGFzIGNoaWxkcmVuLAotCSAqIGlmIGl0IGlzIGEgSVBhY2thZ2VGcmFnbWVudCBpdCBkb2VzIG5vdCwKLQkgKiBlbHNlIHNlbmQgaXQgdXAgdGhlIGNoYWluLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCkKLQkJCXJldHVybiAhKChMaXN0KSBlbGVtZW50KS5pc0VtcHR5KCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1BhY2thZ2VzV29ya2Jvb2tQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9QYWNrYWdlc1dvcmtib29rUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQyM2M0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1BhY2thZ2VzV29ya2Jvb2tQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUGFja2FnZXNXb3JrYm9va1BhZ2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8xMC8wMyAyMzowNjo0MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLlNlYXJjaHBhdGhFbnRyeTsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VzV29ya2Jvb2tQYWdlIGltcGxlbWVudHMgSUJ1aWxkU2VhcmNoUGFnZSB7Ci0JCi0JLyoqCi0JICogVmFsaWRhdG9yIGZvciB0aGlzIHdvcmtib29rIHBhZ2UgdG8gdmVyaWZ5IHRoZSBzZWxlY3Rpb25zIG9uIENob29zZSBwYWdlLgotCSAqIEB2ZXJzaW9uIAkxLjAKLQkgKiBAYXV0aG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDaG9vc2VQYWNrYWdlc1NlbGVjdGlvblZhbGlkYXRvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgewotCi0JCXByaXZhdGUgSVN0YXR1cyBmZ0Vycm9yU3RhdHVzID0gU3RhdHVzSGVscGVyLkVSUk9SX1NUQVRVUzsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIElTdGF0dXMgZmdPS1N0YXR1cyA9IFN0YXR1c0hlbHBlci5PS19TVEFUVVM7Ci0KLQkJcHVibGljIENob29zZVBhY2thZ2VzU2VsZWN0aW9uVmFsaWRhdG9yKCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU2VsZWN0aW9uVmFsaWRhdG9yI3ZhbGlkYXRlKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQkJaWYgKGlzVmFsaWQoc2VsZWN0aW9uKSkgewotCQkJCXJldHVybiBmZ09LU3RhdHVzOwotCQkJfQotCQkJcmV0dXJuIGZnRXJyb3JTdGF0dXM7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWxlY3Rpb25baV0gaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KQotCQkJCQljb250aW51ZTsgLy8gRnJhZ21lbnRzIGFyZSBhbHdheXMgdmFsaWQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLQkKLQlwcml2YXRlIExhYmVsIGxhYmVsID0gbnVsbDsKLQlwcml2YXRlIFRhYmxlIHRhYmxlID0gbnVsbDsKLQlwcml2YXRlIENvbXBvc2l0ZSBidXR0b25CYXIgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGNob29zZVBhY2thZ2VzQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBjaG9vc2VEZWZQYXRoc0J1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBzcGFjZXIxID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b24gPSBudWxsOwotCS8vIC4uLiB1aQotCQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIFNlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIEJlYW5pbmZvUGF0aHNCbG9jayBiZWFuaW5mb3NQYXRoc0Jsb2NrID0gbnVsbDsKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290W11bXSByb290c1BlclJhd0VudHJ5OwotCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5W10gcmF3TGlzdDsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByaXZhdGUgTGlzdCBwYWNrYWdlc0xpc3QgPSBudWxsOwotCXByaXZhdGUgQ29tcG9zaXRlIHRvcDsKLQotCXB1YmxpYyBQYWNrYWdlc1dvcmtib29rUGFnZShJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290LCBCZWFuaW5mb1BhdGhzQmxvY2sgYmVhbmluZm9zUGF0aHNCbG9jaykgewotCQl0aGlzLmJlYW5pbmZvc1BhdGhzQmxvY2sgPSBiZWFuaW5mb3NQYXRoc0Jsb2NrOwotCQl0aGlzLnBhY2thZ2VzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbmV3IFNlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCl7Ci0JCXRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQl0b3Auc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCh0b3AsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuUGFja2FnZXNXb3JrYm9va19MYWJlbFRleHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY3JlYXRlVGFibGUoKTsKLQkJY3JlYXRlQnV0dG9uQmFyKCk7Ci0JCXRvcC5zZXRTaXplKG5ldyBQb2ludCgzMDAsIDIwMCkpOwotCQl1cGRhdGVFbmFibGVkU3RhdGVzKCk7Ci0JCWlmKHNwYWNlcjE9PW51bGwpewotCQkJLy9UT0RPOiAKLQkJfQotCQlyZXR1cm4gdG9wOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRhYmxlCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlKCkgewotCQlHcmlkRGF0YSBncmlkRGF0YTEgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YSgpOwotCQlncmlkRGF0YTEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YTEudmVydGljYWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhMS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGExLmhvcml6b250YWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkZJTEw7Ci0JCXRhYmxlID0gbmV3IFRhYmxlKHRvcCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGExKTsKLQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgU1BMaXN0RWxlbWVudFNvcnRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQocGFja2FnZXNMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBidXR0b25CYXIJCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uQmFyKCkgewotCQlSb3dMYXlvdXQgcm93TGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotCQlyb3dMYXlvdXQudHlwZSA9IG9yZy5lY2xpcHNlLnN3dC5TV1QuVkVSVElDQUw7Ci0JCXJvd0xheW91dC5maWxsID0gdHJ1ZTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEyLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEyLnZlcnRpY2FsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YTIuaG9yaXpvbnRhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuQkVHSU5OSU5HOwotCQlidXR0b25CYXIgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotCQlidXR0b25CYXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YTIpOwotCQlidXR0b25CYXIuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCWNob29zZVBhY2thZ2VzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5OT05FKTsKLQkJY2hvb3NlUGFja2FnZXNCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuUGFja2FnZXNXb3JrYm9va19DaG9vc2VQYWNrYWdlcyk7Ci0JCWNob29zZVBhY2thZ2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBMaXN0IGVsZW1lbnRzVG9BZGQgPSBjaG9vc2VQYWNrYWdlcygpOwotCQkJCWFkZFRvUGFja2FnZXNMaXN0KGVsZW1lbnRzVG9BZGQpOwotCQkJfQotCQl9KTsKLQkJY2hvb3NlRGVmUGF0aHNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULk5PTkUpOwotCQljaG9vc2VEZWZQYXRoc0J1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5QYWNrYWdlc1dvcmtib29rX0Nob29zZURlZmluZWRQYXRocyk7Ci0JCWNob29zZURlZlBhdGhzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IGVsZW1lbnRzVG9BZGQgPSBjaG9vc2VEZWZpbmVkKCk7Ci0JCQkJYWRkVG9QYWNrYWdlc0xpc3QoZWxlbWVudHNUb0FkZCk7Ci0JCQl9Ci0JCX0pOwotCQlzcGFjZXIxID0gbmV3IExhYmVsKGJ1dHRvbkJhciwgU1dULk5PTkUpOwotCQlyZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULk5PTkUpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuUGFja2FnZXNXb3JrYm9va19SZW1vdmUpOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3Qgc2VsZWN0ZWQgPSBCZWFuaW5mb1BhdGhzQmxvY2suZ2V0U2VsZWN0ZWRMaXN0KHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQlwYWNrYWdlc0xpc3QucmVtb3ZlQWxsKHNlbGVjdGVkKTsKLQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRUb1BhY2thZ2VzTGlzdChmaW5hbCBMaXN0IHRvQWRkKXsKLQkJaWYgKHRvQWRkICE9IG51bGwgJiYgIXRvQWRkLmlzRW1wdHkoKSkgewotCQkJcGFja2FnZXNMaXN0LmFkZEFsbCh0b0FkZCk7Ci0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQl0YWJsZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRvQWRkKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlwYWdlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJSmF2YVByb2plY3QganByb2plY3QpIHsKLQkJamF2YVByb2plY3QgPSBqcHJvamVjdDsKLQkJbGFiZWxQcm92aWRlci5zZXRKYXZhUHJvamVjdChqcHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlyYXdMaXN0ID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlyb290c1BlclJhd0VudHJ5ID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W3Jhd0xpc3QubGVuZ3RoXVtdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYXdMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJcm9vdHNQZXJSYXdFbnRyeVtpXSA9IGphdmFQcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290cyhyYXdMaXN0W2ldKTsKLQkJCX0JCQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJcmF3TGlzdCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCQlyb290c1BlclJhd0VudHJ5ID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290WzBdW107Ci0JCX0KLQkJdXBkYXRlUGFja2FnZXNMaXN0KCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gQmVhbmluZm9QYXRoc0Jsb2NrLmdldFNlbGVjdGVkTGlzdCh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhY2thZ2VzTGlzdCgpIHsKLQkJTGlzdCBzcGVsZW1lbnRzID0gYmVhbmluZm9zUGF0aHNCbG9jay5nZXRTZWFyY2hwYXRoT3JkZXJpbmdQYWdlKCkuZ2V0RWxlbWVudHMoKTsKLQotCQlMaXN0IHBhY2thZ2VFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Qoc3BlbGVtZW50cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCUJQTGlzdEVsZW1lbnQgc3BlID0gKEJQTGlzdEVsZW1lbnQpIHNwZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKHNwZSBpbnN0YW5jZW9mIEJQU2VhcmNoTGlzdEVsZW1lbnQpIHsKLQkJCQlwYWNrYWdlRWxlbWVudHMuYWRkKHNwZSk7Ci0JCQl9Ci0JCX0KLQkJcGFja2FnZXNMaXN0LmNsZWFyKCk7Ci0JCXBhY2thZ2VzTGlzdC5hZGRBbGwocGFja2FnZUVsZW1lbnRzKTsKLQkJaWYodGFibGVWaWV3ZXIhPW51bGwgJiYgIXRhYmxlLmlzRGlzcG9zZWQoKSkKLQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBDaG9vc2UgdGhlIHBhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIGluIHRoZSBzZWFyY2ggcGF0aC4KLQkgKi8KLQlwcml2YXRlIExpc3QgY2hvb3NlUGFja2FnZXMoKSB7Ci0KLQkJSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ2hvb3NlUGFja2FnZXNTZWxlY3Rpb25WYWxpZGF0b3IoKTsKLQotCQkvLyBTaG93IHVwIHRvIHRoZSBwYWNrYWdlIGZyYWdtZW50LCBkb24ndCBzaG93IGFueSBjb250ZW50cyBvZiBpdC4KLQkJQ2xhc3NbXSBhY2NlcHRlZENsYXNzZXMgPQotCQkJbmV3IENsYXNzW10geyBJSmF2YVByb2plY3QuY2xhc3MsIElQYWNrYWdlRnJhZ21lbnRSb290LmNsYXNzLCBJUGFja2FnZUZyYWdtZW50LmNsYXNzIH07Ci0JCU9iamVjdFtdIHJlamVjdGVkRnJhZ21lbnRzID0gZ2V0RmlsdGVyZWRFeGlzdGluZ0VudHJpZXMoKTsKLQotCQkvLyBPbmx5IHNob3cgcGFja2FnZSBmcmFnbWVudHMgdGhhdCBoYXZlIGNoaWxkcmVuIChpLmUuIHRoZXJlIGNsYXNzZXMgaW4gaXQsIG5vdCBpbnRlcmVzdGVkCi0JCS8vIGluIGludGVybWVkaWF0ZSBvbmVzIHRoYXQgaGF2ZSBubyBjbGFzc2VzIGRlZmluZWQgaW4gdGhlbS4gVGhvc2UgYXJlIGZpbHRlcmVkIG91dC4KLQkJVHlwZWRWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFR5cGVkVmlld2VyRmlsdGVyKGFjY2VwdGVkQ2xhc3NlcywgcmVqZWN0ZWRGcmFnbWVudHMpIHsKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoc3VwZXIuc2VsZWN0KHZpZXdlciwgcGFyZW50RWxlbWVudCwgZWxlbWVudCkpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZXR1cm4gcGtnLmhhc0NoaWxkcmVuKCk7Ci0JCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgUGFja2FnZU9ubHlDb250ZW50UHJvdmlkZXIoKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ERUZBVUxUKTsKLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyh0b3AuZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlciwgcHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VGl0bGUoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fYWRkc2VhcmNocGF0aF90aXRsZSk7Ci0KLQkJZGlhbG9nLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19hZGRzZWFyY2hwYXRoX2Rlc2NyaXB0aW9uKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOwotCQlkaWFsb2cuc2V0SW5wdXQoamF2YVByb2plY3QpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlMaXN0IG5ld0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUJQTGlzdEVsZW1lbnQgbmV3R3V5ID0gbmV3QlBMaXN0RWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQkJaWYgKG5ld0d1eSAhPSBudWxsKQotCQkJCQluZXdFbGVtZW50cy5hZGQobmV3R3V5KTsKLQkJCX0KLQkJCXJldHVybiBuZXdFbGVtZW50czsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgQlBMaXN0RWxlbWVudCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQlBMaXN0RWxlbWVudCBuZXdCUExpc3RFbGVtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCVNlYXJjaHBhdGhFbnRyeSBzZSA9IG51bGw7Ci0JCWJvb2xlYW4gaXNFeHBvcnRlZCA9IGZhbHNlOwotCQlJUGFja2FnZUZyYWdtZW50IGZyYWcgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLQkJLy8gTmVlZCB0byBmaW5kIGNvcnJlc3BvbmRpbmcgcmF3IGNsYXNzIHBhdGggZW50cnkuCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGZyYWcuZ2V0UGFyZW50KCk7IC8vIEdldCBmcmFnIHJvb3QuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHNQZXJSYXdFbnRyeS5sZW5ndGg7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByb290c1BlclJhd0VudHJ5W2ldLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKHJvb3RzUGVyUmF3RW50cnlbaV1bal0uZXF1YWxzKHJvb3QpKSB7Ci0JCQkJCWlzRXhwb3J0ZWQgPSByYXdMaXN0W2ldLmlzRXhwb3J0ZWQoKSB8fCByYXdMaXN0W2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOwotCQkJCQlzZSA9IG5ldyBTZWFyY2hwYXRoRW50cnkocmF3TGlzdFtpXS5nZXRFbnRyeUtpbmQoKSwgcmF3TGlzdFtpXS5nZXRQYXRoKCksIGZyYWcuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXcgQlBTZWFyY2hMaXN0RWxlbWVudChzZSwgZmFsc2UsIGZhbHNlLCBpc0V4cG9ydGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZW50cmllcyB0aGF0IGFscmVhZHkgYXJlIGluIHRoZSBzZWFyY2ggcGF0aAotCSAqIHNvIHRoYXQgdGhleSBkb24ndCBzaG93IHVwIGluIHRoZSBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRGaWx0ZXJlZEV4aXN0aW5nRW50cmllcygpIHsKLQkJdHJ5IHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJTGlzdCBlbnRyaWVzID0gcGFja2FnZXNMaXN0OwotCQkJTGlzdCBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0KGVudHJpZXMuc2l6ZSgpKTsKLQkJCUl0ZXJhdG9yIGl0ciA9IGVudHJpZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJQlBMaXN0RWxlbWVudCBlbGVtID0gKEJQTGlzdEVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBCUFNlYXJjaExpc3RFbGVtZW50KSB7Ci0JCQkJCUJQU2VhcmNoTGlzdEVsZW1lbnQgYnNlID0gKEJQU2VhcmNoTGlzdEVsZW1lbnQpIGVsZW07Ci0JCQkJCWZyYWdtZW50cy5hZGRBbGwoZ2V0UGFja2FnZXMoYnNlLCByb290cykpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmcmFnbWVudHMudG9BcnJheSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBwYWNrYWdlIGZyYWdtZW50cyBmb3IgdGhpcyBwYWNrYWdlIGVudHJ5LgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFBhY2thZ2VzKEJQU2VhcmNoTGlzdEVsZW1lbnQgZWxlbWVudCwgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cykgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSAoKFNlYXJjaHBhdGhFbnRyeSkgZWxlbWVudC5nZXRFbnRyeSgpKS5nZXRQYWNrYWdlKCk7Ci0JCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJdHJ5IHsKLQkJCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJSmF2YUVsZW1lbnRbXSBwZnMgPSByb290c1tpXS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGZzLmxlbmd0aDsgaisrKQotCQkJCQlpZiAocGZzW2pdLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQKLQkJCQkJCSYmIHBmc1tqXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYWNrYWdlTmFtZSkpIHsKLQkJCQkJCXBhY2thZ2VzLmFkZChwZnNbal0pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCX0KLQkJCXJldHVybiBwYWNrYWdlczsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyoqCi0JICogQ2hvb3NlIHRoZSBwcmUtZGVmaW5lZCBzZWFyY2ggcGF0aHMgdGhhdCBzaG91bGQgYmUgaW4gdGhlIHNlYXJjaCBwYXRoLgotCSAqLwotCXByaXZhdGUgTGlzdCBjaG9vc2VEZWZpbmVkKCkgewotCi0JCS8vIEN1cnJlbnQgcHJlLWRlZmluZWQgb25lcyBhcmUgb25seSBwcmUtcmVxZWQgcHJvamVjdHMuCi0JCS8vIFRoZSBsaXN0IG9mIGlucHV0cyB3aWxsIG5vdCBjb250YWluIGFueSBhbHJlYWR5IGluIHRoZSBwYXRoLgotCQkvLyBXZSB3aWxsIGNyZWF0ZSB0aGVtIGhlcmUgYW5kIGlmIG5vdCBzZWxlY3RlZCB0aGV5IHdpbGwgdGhyb3duIGF3YXkuCi0JCS8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlcmUgYXJlIG5vdCB2ZXJ5IG1hbnkgYW5kIG91ciBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIgZG9lcwotCQkvLyBhIGdvb2Qgam9iIG9mIHNob3dpbmcgdGhlbS4gT3RoZXJ3aXNlIHdlIHdvdWxkIG5lZWQgdG8gY29tZSB1cCB3aXRoIG9uZSB0aGF0IGNhbiBzaG93Ci0JCS8vIElKYXZhUHJvamVjdHMgd2hlbiB3ZSBnZXQgdGhlbS4KLQkJTGlzdCBpbnB1dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgY3VycmVudExpc3QgPSBwYWNrYWdlc0xpc3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmF3TGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJhd0xpc3RbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7Ci0JCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCUJQU2VhcmNoTGlzdEVsZW1lbnQgYnNlID0gKEJQU2VhcmNoTGlzdEVsZW1lbnQpIGN1cnJlbnRMaXN0LmdldChqKTsKLQkJCQkJaWYgKGJzZS5nZXRFbnRyeSgpLmdldEtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgJiYgcmF3TGlzdFtpXS5nZXRQYXRoKCkuZXF1YWxzKGJzZS5nZXRFbnRyeSgpLmdldFBhdGgoKSkpIHsKLQkJCQkJCWV4aXN0cyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIWV4aXN0cykKLQkJCQkJaW5wdXRzLmFkZChuZXcgQlBTZWFyY2hMaXN0RWxlbWVudChuZXcgU2VhcmNocGF0aEVudHJ5KElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCwgcmF3TGlzdFtpXS5nZXRQYXRoKCksIG51bGwpLCBmYWxzZSwgZmFsc2UsIHJhd0xpc3RbaV0uaXNFeHBvcnRlZCgpKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIxID0gbmV3IFNlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlcihqYXZhUHJvamVjdCk7Ci0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2codG9wLmdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIxKTsKLQkJZGlhbG9nLnNldFRpdGxlKEJlYW5JbmZvVUlNZXNzYWdlcy5QYWNrYWdlc1dvcmtib29rX1NlbGVjdGlvbkRpYWxvZ19EZWZpbmVkUGF0aHNfVGl0bGUpOyAKLQotCQlkaWFsb2cuc2V0TWVzc2FnZShCZWFuSW5mb1VJTWVzc2FnZXMuUGFja2FnZXNXb3JrYm9va19TZWxlY3Rpb25EaWFsb2dfRGVmaW5lZFBhdGhzX01lc3NhZ2UpOyAKLQkJZGlhbG9nLnNldEVsZW1lbnRzKGlucHV0cy50b0FycmF5KCkpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KGRpYWxvZy5nZXRSZXN1bHQoKSk7Ci0JCWVsc2UKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKXsKLQkJY2hvb3NlRGVmUGF0aHNCdXR0b24uc2V0RW5hYmxlZChiZWFuaW5mb3NQYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQljaG9vc2VQYWNrYWdlc0J1dHRvbi5zZXRFbmFibGVkKGJlYW5pbmZvc1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JCQotCQlMaXN0IHNlbGVjdGVkID0gQmVhbmluZm9QYXRoc0Jsb2NrLmdldFNlbGVjdGVkTGlzdCh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHNlbGVjdGVkIT1udWxsICYmIHNlbGVjdGVkLnNpemUoKT4wICYmIGJlYW5pbmZvc1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNvbWV0aGluZyBpbXBvcnRhbnQgYWJvdXQgdGhlIHBhZ2UgY2hhbmdlZCAtIHBlcmZvcm0gdXBkYXRlLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2VkKCl7Ci0JCXVwZGF0ZVNlYXJjaHBhdGhMaXN0KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVTZWFyY2hwYXRoTGlzdCgpIHsKLQkJTGlzdCBzZWFyY2hlbGVtZW50cyA9IGJlYW5pbmZvc1BhdGhzQmxvY2suZ2V0U2VhcmNocGF0aE9yZGVyaW5nUGFnZSgpLmdldEVsZW1lbnRzKCk7Ci0KLQkJTGlzdCBwYWNrYWdlZWxlbWVudHMgPSBwYWNrYWdlc0xpc3Q7Ci0KLQkJYm9vbGVhbiBjaGFuZ2VEb25lID0gZmFsc2U7Ci0JCS8vIEZpcnN0IGdvIHRocm91Z2ggdGhlIHNlYXJjaCBwYXRoIGFuZCByZW1vdmUgYW55IFNlYXJjaExpc3RFbGVtZW50cyB0aGF0IGFyZQotCQkvLyBub3QgaW4gdGhlIHNlYXJjaCBwYWNrYWdlcyBsaXN0IGZyb20gdGhpcyBwYWdlLgotCQlmb3IgKExpc3RJdGVyYXRvciBzcGl0ciA9IHNlYXJjaGVsZW1lbnRzLmxpc3RJdGVyYXRvcihzZWFyY2hlbGVtZW50cy5zaXplKCkpOwotCQkJc3BpdHIuaGFzUHJldmlvdXMoKTsKLQkJCSkgewotCQkJQlBMaXN0RWxlbWVudCBlbGVtZW50ID0gKEJQTGlzdEVsZW1lbnQpIHNwaXRyLnByZXZpb3VzKCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJQU2VhcmNoTGlzdEVsZW1lbnQgJiYgIXBhY2thZ2VlbGVtZW50cy5yZW1vdmUoZWxlbWVudCkpIHsKLQkJCQkvLyBTZWFyY2ggZWxlbWVudCBhbmQgbm90IGZvdW5kIGluIHBhY2thZ2VzIGxpc3Qgc28gcmVtb3ZlIGl0IGZyb20gc2VhcmNocGF0aCBsaXN0LgotCQkJCXNwaXRyLnJlbW92ZSgpOwotCQkJCWNoYW5nZURvbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIEFueSBsZWZ0IG92ZXIgaW4gcGFja2FnZXMgbGlzdCBhcmUgbmV3IGFuZCBuZWVkIHRvIGJlIGFkZGVkLgotCQlzZWFyY2hlbGVtZW50cy5hZGRBbGwocGFja2FnZWVsZW1lbnRzKTsKLQkJY2hhbmdlRG9uZSA9IGNoYW5nZURvbmUgfHwgIXBhY2thZ2VlbGVtZW50cy5pc0VtcHR5KCk7Ci0KLQkJaWYgKGNoYW5nZURvbmUpCi0JCQliZWFuaW5mb3NQYXRoc0Jsb2NrLnNldFNlYXJjaE9yZGVyRWxlbWVudHMoc2VhcmNoZWxlbWVudHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZXMoKXsKLQkJdXBkYXRlQnV0dG9ucygpOwotCQl0YWJsZS5zZXRFbmFibGVkKGJlYW5pbmZvc1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JCWxhYmVsLnNldEVuYWJsZWQoYmVhbmluZm9zUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QmVhbmluZm9FbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWlmKHRvcCE9bnVsbCAmJiAhdG9wLmlzRGlzcG9zZWQoKSkKLQkJCXVwZGF0ZUVuYWJsZWRTdGF0ZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9TUExpc3RFbGVtZW50U29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9TUExpc3RFbGVtZW50U29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjg4NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU1BMaXN0RWxlbWVudFNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBTUExpc3RFbGVtZW50U29ydGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuU2VhcmNocGF0aEVudHJ5OwotCi0vKioKLSAqIFNvcnRlciBmb3Igc29ydGluZyBCUFNlYXJjaExpc3RFbGVtZW50cyB3aXRoaW4gdGhlIG1haW4gbGlzdC4KLSAqIEl0IGlzIG5vdCB0byBiZSB1c2VkIG9uIGVsZW1lbnRzIHdpdGhpbiBhIHNwZWNpZmljIGJlYW5pbmZvIGVudHJ5LgotICogCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTUExpc3RFbGVtZW50U29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkKLQkvKgotCSAqIEBzZWUgVmlld2VyU29ydGVyI2NhdGVnb3J5KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJQU2VhcmNoTGlzdEVsZW1lbnQpIHsKLQkJCUJQU2VhcmNoTGlzdEVsZW1lbnQgZWxlbWVudCA9IChCUFNlYXJjaExpc3RFbGVtZW50KSBvYmo7Ci0JCQkKLQkJCXN3aXRjaCAoKChTZWFyY2hwYXRoRW50cnkpIGVsZW1lbnQuZ2V0RW50cnkoKSkuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWToKLQkJCQlyZXR1cm4gNDsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgotCQkJCXJldHVybiAxOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRToKLQkJCQlyZXR1cm4gMDsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRToKLQkJCQlyZXR1cm4gMzsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJcmV0dXJuIDI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhdGVnb3J5KG9iaik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFZpZXdlclNvcnRlciNjb21wYXJlKCkKLQkgKi8JCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQkKLQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJCQotCQlpZiAoKGUxIGluc3RhbmNlb2YgQlBTZWFyY2hMaXN0RWxlbWVudCkgJiYgKGUyIGluc3RhbmNlb2YgQlBTZWFyY2hMaXN0RWxlbWVudCkpIHsKLQkJCVNlYXJjaHBhdGhFbnRyeSBwMSA9IChTZWFyY2hwYXRoRW50cnkpICgoQlBTZWFyY2hMaXN0RWxlbWVudCkgZTEpLmdldEVudHJ5KCk7Ci0JCQlTZWFyY2hwYXRoRW50cnkgcDIgPSAoU2VhcmNocGF0aEVudHJ5KSAoKEJQU2VhcmNoTGlzdEVsZW1lbnQpIGUyKS5nZXRFbnRyeSgpOwotCQkJCi0JCQkvLyBDb21wYXJlIGZpcnN0IHdpdGhpbiBwYXRoLCB0aGVuIHBhY2thZ2VzIHdpdGhpbiBlYWNoIHBhdGguCi0JCQlpbnQgYyA9IHAxLmdldFBhdGgoKS50b1N0cmluZygpLmNvbXBhcmVUbyhwMi5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQlpZiAoYyA9PSAwKSB7Ci0JCQkJLy8gV2l0aGluIHNhbWUgcGF0aCwgc28gbm93IHNvcnQgYnkgcGFja2FnZSwgaWYgdGhlcmUgYXJlIGFueS4KLQkJCQlTdHJpbmcgcGtnMSA9IHAxLmdldFBhY2thZ2UoKTsKLQkJCQlTdHJpbmcgcGtnMiA9IHAyLmdldFBhY2thZ2UoKTsKLQkJCQlpZiAocGtnMSA9PSBudWxsKQotCQkJCQlwa2cxID0gIiI7CS8vIEZvciBudWxsLCB1c2UgYW4gZW1wdHkgc3RyaW5nIC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGtnMiA9PSBudWxsKQotCQkJCQlwa2cyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gcGtnMS5jb21wYXJlVG8ocGtnMik7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gYzsJLy8gUGF0aHMgYXJlIG5vdCBlcXVhbCwgc28gc29ydCB2aWEgcGF0aC4KLQkJfQotCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JfQkKLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1NlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU2VhcmNoUGF0aExpc3RMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDJhNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU2VhcmNoUGF0aExpc3RMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0vKgotICogICRSQ1NmaWxlOiBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTQgJCAgJERhdGU6IDIwMDUvMTAvMDMgMjM6MDY6NDIgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUuSkVNVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCUlXb3Jrc3BhY2VSb290IGZSb290OwotCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQotCS8vIFNoYXJlZCBpbWFnZXMKLQlwcml2YXRlIEltYWdlIGZKYXJJY29uLCBmRXh0SmFySWNvbjsKLQlwcml2YXRlIEltYWdlIGZGb2xkZXJJbWFnZSwgZlByb2plY3RJbWFnZSwgZlZhcmlhYmxlSW1hZ2UsIGZMaWJyYXJ5SW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmTWlzc2luZ0phckltYWdlLCBmTWlzc2luZ1ZhcmlhYmxlSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmTWlzc2luZ0ZvbGRlckltYWdlLCBmTWlzc2luZ1Byb2plY3RJbWFnZTsKLQlwcml2YXRlIEltYWdlIGZQYWNrYWdlSW1hZ2U7Ci0KLQkvLyBMb2NhbCBpbWFnZXMsIHdpbGwgYmUgZGlzcG9zZWQuCi0JcHJpdmF0ZSBJbWFnZSBmUGx1Z2luSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmQmVhbkltYWdlOwotCXByaXZhdGUgSW1hZ2UgZk1pc3NpbmdQYWNrYWdlSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBmQmxhbmtJbWFnZTsKLQlwcml2YXRlIEltYWdlIGZNaXNzaW5nTGlicmFyeUltYWdlOwotCXByaXZhdGUgSGFzaE1hcCBmQmVhbmVkSW1hZ2VzID0gbmV3IEhhc2hNYXAoKTsgLy8gS2V5IG9mIGltYWdlIHRvIGEgY29tcG9zaXRlIHdpdGggYSBiZWFuIGF0dGFjaGVkCi0JcHJpdmF0ZSBIYXNoTWFwIGZQYWNrYWdlZEltYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZNaXNzaW5nUGFja2FnZWRJbWFnZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSGFzaE1hcCBmTm9ybWFsSW1hZ2VzID0gbmV3IEhhc2hNYXAoKTsJLy8gTmVlZCB0byBjb21wb3NpdGUgbm9ybWFsIGltYWdlcyB3L2JsYW5rIHNvIHRoYXQgdGhleSBhcmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY29tcG9zaXRlZCBvbmVzLgotCS8vIEtleSBvZiBpbWFnZSB0byBhIGNvbXBvc2l0ZSB3aXRoIGEgcGFja2FnZSBhdHRhY2hlZAotCi0JcHVibGljIFNlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JCi0JcHVibGljIFNlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQkKLQkJZlJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJbWFnZVJlZ2lzdHJ5IHJlZyA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJSVNoYXJlZEltYWdlcyBqZHRTaGFyZWRJbWFnZXMgPSBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0KLQkJZkphckljb24gPSBqZHRTaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19KQVIpOwotCQlmRXh0SmFySWNvbiA9IGpkdFNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VYVEVSTkFMX0FSQ0hJVkUpOwotCQlmRm9sZGVySW1hZ2UgPSBqZHRTaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19QQUNLRlJBR19ST09UKTsKLQotCQlmVmFyaWFibGVJbWFnZSA9IHJlZy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfT0JKU19FTlZfVkFSKTsKLQkJCi0JCWZMaWJyYXJ5SW1hZ2UgPSBqZHRTaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19MSUJSQVJZKTsKLQotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCWZQcm9qZWN0SW1hZ2UgPSB3b3JrYmVuY2guZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1QpOwotCi0JCWZNaXNzaW5nSmFySW1hZ2UgPSByZWcuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfTUlTU0lOR19KQVIpOwotCQlmTWlzc2luZ1ZhcmlhYmxlSW1hZ2UgPSByZWcuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfTUlTU0lOR19FTlZfVkFSKTsKLQkJZk1pc3NpbmdGb2xkZXJJbWFnZSA9IHJlZy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfT0JKU19NSVNTSU5HX1BBQ0tGUkFHX1JPT1QpOwotCQlmTWlzc2luZ1Byb2plY3RJbWFnZSA9IHdvcmtiZW5jaC5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVF9DTE9TRUQpOwotCi0JCWZQYWNrYWdlSW1hZ2UgPSBqZHRTaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19QQUNLQUdFKTsKLQotCQlSZWN0YW5nbGUgciA9IGZMaWJyYXJ5SW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCVBvaW50IHMgPSBuZXcgUG9pbnQoci53aWR0aCwgci5oZWlnaHQpOwotCQlKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvciBqZWQgPSBuZXcgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IoamR0U2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0xJQlJBUlkpLCAgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuV0FSTklORywgcyk7Ci0JCWZNaXNzaW5nTGlicmFyeUltYWdlID0gamVkLmNyZWF0ZUltYWdlKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKTsKLQkJVVJMIHVybCA9IFBsYXRmb3JtLmZpbmQoYnVuZGxlLCBuZXcgUGF0aCgiaWNvbnMvcGx1Z2luX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJZlBsdWdpbkltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotCQllbHNlCi0JCQlmUGx1Z2luSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpLmNyZWF0ZUltYWdlKCk7Ci0KLQkJdXJsID0gUGxhdGZvcm0uZmluZChidW5kbGUsIG5ldyBQYXRoKCJpY29ucy9qYXZhYmVhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJZkJlYW5JbWFnZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQkJZWxzZQotCQkJZkJlYW5JbWFnZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkuY3JlYXRlSW1hZ2UoKTsKLQotCQl1cmwgPSBQbGF0Zm9ybS5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoImljb25zL3BhY2thZ2Vfb2JqX21pc3NpbmcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCWZNaXNzaW5nUGFja2FnZUltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotCQllbHNlCi0JCQlmTWlzc2luZ1BhY2thZ2VJbWFnZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkuY3JlYXRlSW1hZ2UoKTsKLQotCQl1cmwgPSBQbGF0Zm9ybS5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoImljb25zL2JsYW5rLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsICE9IG51bGwpCi0JCQlmQmxhbmtJbWFnZSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQkJZWxzZQotCQkJZkJsYW5rSW1hZ2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpLmNyZWF0ZUltYWdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQlBMaXN0RWxlbWVudCkgewotCQkJQlBMaXN0RWxlbWVudCBicGVudHJ5ID0gKEJQTGlzdEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlJQmVhbmluZm9zRG9jRW50cnkgZG9jRW50cnkgPSBicGVudHJ5LmdldEVudHJ5KCk7Ci0JCQlJUGF0aCBwYXRoID0gZG9jRW50cnkuZ2V0UGF0aCgpOwotCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBudWxsOwotCQkJc3dpdGNoIChkb2NFbnRyeS5nZXRLaW5kKCkpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZSb290LmZpbmRNZW1iZXIocGF0aCk7Ci0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJCXBhdGhTdHJpbmcgPQotCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEJlYW5JbmZvVUlNZXNzYWdlcy5MYWJlbFByb3ZpZGVyX0xpYnJhcnlfRm9sZGVyLCBuZXcgT2JqZWN0W10geyBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCl9KTsgCi0JCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJaWYgKFZhcmlhYmxlU2VsZWN0aW9uQmxvY2suaXNBcmNoaXZlUGF0aChwYXRoKSkgewotCQkJCQkJCS8vIEludGVybmFsIGxpYnJhcnkKLQkJCQkJCQlTdHJpbmdbXSBhcmdzID0KLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgcGF0aC5sYXN0U2VnbWVudCgpLCBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpfTsKLQkJCQkJCQlwYXRoU3RyaW5nID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoQmVhbkluZm9VSU1lc3NhZ2VzLkxhYmVsUHJvdmlkZXJfTGlicmFyeV9fUGF0aExhc3RTZWdtZW50X1BhdGhSZWxhdGl2ZV8sIGFyZ3MpOyAKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChWYXJpYWJsZVNlbGVjdGlvbkJsb2NrLmlzQXJjaGl2ZVBhdGgocGF0aCkpIHsKLQkJCQkJCQkvLyBFeHRlcm5hbCBsaWJyYXJ5Ci0JCQkJCQkJU3RyaW5nW10gYXJncyA9Ci0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHBhdGgubGFzdFNlZ21lbnQoKSwgcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKX07Ci0JCQkJCQkJcGF0aFN0cmluZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEJlYW5JbmZvVUlNZXNzYWdlcy5MYWJlbFByb3ZpZGVyX0xpYnJhcnlfX1BhdGhMYXN0U2VnbWVudF9QYXRoRXhjZXB0TGFzdF8sIGFyZ3MpOyAKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gc2hvdWxkIG5vdCBjb21lIGhlcmUKLQkJCQkJCQlwYXRoU3RyaW5nID0gcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQkJU3RyaW5nIG5hbWUgPSBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCUlQYXRoIGVudHJ5UGF0aCA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKHBhdGguc2VnbWVudCgwKSk7Ci0JCQkJCWlmIChlbnRyeVBhdGggIT0gbnVsbCkKLQkJCQkJCXBhdGhTdHJpbmcgPQotCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQlCZWFuSW5mb1VJTWVzc2FnZXMuTGFiZWxQcm92aWRlcl9WYXJpYWJsZV9fbmFtZV9QYXRoT1NTdHJpbmdfLCAKLQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZSwgZW50cnlQYXRoLmFwcGVuZChwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpLnRvT1NTdHJpbmcoKX0pOwotCQkJCQllbHNlCi0JCQkJCQlwYXRoU3RyaW5nID0gbmFtZTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCQl0cnkgewotCQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKHBhdGgsIGphdmFQcm9qZWN0KTsKLQkJCQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQkJCQlwYXRoU3RyaW5nID0gYy5nZXREZXNjcmlwdGlvbigpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCXBhdGhTdHJpbmcgPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJCXBhdGhTdHJpbmcgPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJCXBhdGhTdHJpbmcgPSBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBCZWFuaW5mb0VudHJ5LkJJRV9QTFVHSU4gOgotCQkJCQlwYXRoU3RyaW5nID0gcGF0aC50b1N0cmluZygpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJLy8gbm8gcGF0aCwgc28gcHJvYmFibHkgYSBzZWFyY2ggZW50cnkgd2l0aGluIGEgYmVhbmluZm8gZW50cnkuCi0JCQl9Ci0KLQkJCWlmIChkb2NFbnRyeSBpbnN0YW5jZW9mIFNlYXJjaHBhdGhFbnRyeSkgewotCQkJCS8vIFRoZXJlIGNvdWxkIGJlIGEgcGFja2FnZSBpbnZvbHZlZCB0b28gaWYgdGhpcyBpcyBub3QgYSBwcm9qZWN0IG9yIHJlZ2lzdGVyZWQgdmFyIGVudHJ5Ci0JCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gKChTZWFyY2hwYXRoRW50cnkpIGRvY0VudHJ5KS5nZXRQYWNrYWdlKCk7Ci0JCQkJaWYgKHBhY2thZ2VOYW1lICE9IG51bGwgJiYgcGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKQotCQkJCQlpZiAocGF0aFN0cmluZyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEJlYW5JbmZvVUlNZXNzYWdlcy5MYWJlbFByb3ZpZGVyX19wYWNrYWdlTmFtZV9QYXRoXywgbmV3IE9iamVjdFtdIHsgcGFja2FnZU5hbWUsIHBhdGhTdHJpbmcgfSk7IAotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gcGFja2FnZU5hbWU7Ci0JCQl9Ci0KLQkJCWlmIChwYXRoU3RyaW5nICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhdGhTdHJpbmc7Ci0JCQllbHNlCi0JCQkJcmV0dXJuICI/IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSByZXR1cm5lZEltYWdlID0gbnVsbDsKLQkJYm9vbGVhbiBpbWFnZUlzTm9ybWFsID0gdHJ1ZTsJLy8gV2hldGhlciB0aGlzIGlzIGEgbm9ybWFsIHNpemVkIGltYWdlICh3aGljaCB3aWxsIG5lZWQgY29tcG9zaXRpbmcgd2l0aCBibGFuaykKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCUExpc3RFbGVtZW50KSB7Ci0JCQlCUExpc3RFbGVtZW50IGJwZW50cnkgPSAoQlBMaXN0RWxlbWVudCkgZWxlbWVudDsKLQkJCUlCZWFuaW5mb3NEb2NFbnRyeSBkb2NFbnRyeSA9IGJwZW50cnkuZ2V0RW50cnkoKTsKLQkJCUlQYXRoIHBhdGggPSBkb2NFbnRyeS5nZXRQYXRoKCk7Ci0JCQlJbWFnZSBwYXRoSW1hZ2UgPSBudWxsOwotCQkJc3dpdGNoIChkb2NFbnRyeS5nZXRLaW5kKCkpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQkJaWYgKCFicGVudHJ5LmlzTWlzc2luZygpKQotCQkJCQkJcGF0aEltYWdlID0gZkZvbGRlckltYWdlOwotCQkJCQllbHNlCi0JCQkJCQlwYXRoSW1hZ2UgPSBmTWlzc2luZ0ZvbGRlckltYWdlOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQkJaWYgKCFicGVudHJ5LmlzTWlzc2luZygpKSB7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmUm9vdC5maW5kTWVtYmVyKHBhdGgpOwotCQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikKLQkJCQkJCQlwYXRoSW1hZ2UgPSBmRm9sZGVySW1hZ2U7Ci0JCQkJCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCQkJCQkJCXBhdGhJbWFnZSA9IGZKYXJJY29uOwotCQkJCQkJZWxzZQotCQkJCQkJCXBhdGhJbWFnZSA9IGZFeHRKYXJJY29uOwotCQkJCQl9IGVsc2UKLQkJCQkJCXBhdGhJbWFnZSA9IGZNaXNzaW5nSmFySW1hZ2U7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCQlpZiAoIWJwZW50cnkuaXNNaXNzaW5nKCkpCi0JCQkJCQlwYXRoSW1hZ2UgPSBmUHJvamVjdEltYWdlOwotCQkJCQllbHNlCi0JCQkJCQlwYXRoSW1hZ2UgPSBmTWlzc2luZ1Byb2plY3RJbWFnZTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCQlpZiAoIWJwZW50cnkuaXNNaXNzaW5nKCkpCi0JCQkJCQlwYXRoSW1hZ2UgPSBmVmFyaWFibGVJbWFnZTsKLQkJCQkJZWxzZQotCQkJCQkJcGF0aEltYWdlID0gZk1pc3NpbmdWYXJpYWJsZUltYWdlOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJCWlmICghYnBlbnRyeS5pc01pc3NpbmcoKSkKLQkJCQkJCXBhdGhJbWFnZSA9IGZMaWJyYXJ5SW1hZ2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXBhdGhJbWFnZSA9IGZNaXNzaW5nTGlicmFyeUltYWdlOwotCQkJCQlicmVhazsJCQkJCi0JCQkJCQotCQkJCWNhc2UgQmVhbmluZm9FbnRyeS5CSUVfUExVR0lOOgotCQkJCQlwYXRoSW1hZ2UgPSBmUGx1Z2luSW1hZ2U7Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQlkZWZhdWx0IDoKLQkJCQkJLy8gcHJvYmFibHkgYSBzZWFyY2hlbnRyeSB1bmRlciBiZWFuaW5mbyBlbnRyeSwgbm8gcGF0aCBpY29uIHRvIGRlY29yYXRlLgotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGJwZW50cnkgaW5zdGFuY2VvZiBCUFNlYXJjaExpc3RFbGVtZW50KSB7Ci0JCQkJU2VhcmNocGF0aEVudHJ5IHNlID0gKFNlYXJjaHBhdGhFbnRyeSkgZG9jRW50cnk7Ci0JCQkJQlBTZWFyY2hMaXN0RWxlbWVudCBicHNlID0gKEJQU2VhcmNoTGlzdEVsZW1lbnQpIGJwZW50cnk7Ci0JCQkJaWYgKHNlLmdldFBhY2thZ2UoKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwYXRoSW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFicHNlLmlzUGFja2FnZU1pc3NpbmcoKSkgewotCQkJCQkJCS8vIE5lZWQgdG8gZGVjb3JhdGUgd2l0aCBhIHBhY2thZ2Ugc3ltYm9sLgotCQkJCQkJCWltYWdlSXNOb3JtYWwgPSBmYWxzZTsKLQkJCQkJCQlyZXR1cm5lZEltYWdlID0gKEltYWdlKSBmUGFja2FnZWRJbWFnZXMuZ2V0KHBhdGhJbWFnZSk7IC8vIFNlZSBpZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgdGhlIGltYWdlCi0JCQkJCQkJaWYgKHJldHVybmVkSW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQlPdmVybGF5Q29tcG9zaXRlIG9jID0gbmV3IE92ZXJsYXlDb21wb3NpdGUocGF0aEltYWdlLmdldEltYWdlRGF0YSgpKTsKLQkJCQkJCQkJb2Muc2V0UmlnaHRFeHRlbnNpb24oZlBhY2thZ2VJbWFnZS5nZXRJbWFnZURhdGEoKSk7Ci0JCQkJCQkJCXJldHVybmVkSW1hZ2UgPSBvYy5jcmVhdGVJbWFnZSgpOwotCQkJCQkJCQlmUGFja2FnZWRJbWFnZXMucHV0KHBhdGhJbWFnZSwgcmV0dXJuZWRJbWFnZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBOZWVkIHRvIGRlY29yYXRlIHdpdGggYSBtaXNzaW5nIHBhY2thZ2Ugc3ltYm9sLgotCQkJCQkJCWltYWdlSXNOb3JtYWwgPSBmYWxzZTsKLQkJCQkJCQlyZXR1cm5lZEltYWdlID0gKEltYWdlKSBmTWlzc2luZ1BhY2thZ2VkSW1hZ2VzLmdldChwYXRoSW1hZ2UpOyAvLyBTZWUgaWYgd2UndmUgYWxyZWFkeSBjcmVhdGVkIHRoZSBpbWFnZQotCQkJCQkJCWlmIChyZXR1cm5lZEltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJT3ZlcmxheUNvbXBvc2l0ZSBvYyA9IG5ldyBPdmVybGF5Q29tcG9zaXRlKHBhdGhJbWFnZS5nZXRJbWFnZURhdGEoKSk7Ci0JCQkJCQkJCW9jLnNldFJpZ2h0RXh0ZW5zaW9uKGZNaXNzaW5nUGFja2FnZUltYWdlLmdldEltYWdlRGF0YSgpKTsKLQkJCQkJCQkJcmV0dXJuZWRJbWFnZSA9IG9jLmNyZWF0ZUltYWdlKCk7Ci0JCQkJCQkJCWZNaXNzaW5nUGFja2FnZWRJbWFnZXMucHV0KHBhdGhJbWFnZSwgcmV0dXJuZWRJbWFnZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQkKLQkJCQlpZiAocGF0aEltYWdlID09IG51bGwgJiYgcmV0dXJuZWRJbWFnZSA9PSBudWxsKQotCQkJCQlpZiAoIWJwc2UuaXNQYWNrYWdlTWlzc2luZygpKQotCQkJCQkJcmV0dXJuZWRJbWFnZSA9IGZQYWNrYWdlSW1hZ2U7IC8vIEp1c3QgYSBwYWNrYWdlIGltYWdlCi0JCQkJCWVsc2UKLQkJCQkJCXJldHVybmVkSW1hZ2UgPSBmTWlzc2luZ1BhY2thZ2VJbWFnZTsJLy8gSnVzdCB0aGUgbWlzc2luZyBwYWNrYWdlIGltYWdlLgotCQkJCWVsc2UgaWYgKHJldHVybmVkSW1hZ2UgPT0gbnVsbCkKLQkJCQkJcmV0dXJuZWRJbWFnZSA9IHBhdGhJbWFnZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBhdGhJbWFnZSAhPSBudWxsKSB7Ci0JCQkJCS8vIEl0IGlzIGEgYmVhbmluZm8gZW50cnksIG5lZWQgdG8gZGVjb3JhdGUgd2l0aCB0aGUgYmVhbi4KLQkJCQkJaW1hZ2VJc05vcm1hbCA9IGZhbHNlOwotCQkJCQlyZXR1cm5lZEltYWdlID0gKEltYWdlKSBmQmVhbmVkSW1hZ2VzLmdldChwYXRoSW1hZ2UpOyAvLyBTZWUgaWYgd2UndmUgYWxyZWFkeSBjcmVhdGVkIHRoZSBpbWFnZQotCQkJCQlpZiAocmV0dXJuZWRJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQlPdmVybGF5Q29tcG9zaXRlIG9jID0gbmV3IE92ZXJsYXlDb21wb3NpdGUocGF0aEltYWdlLmdldEltYWdlRGF0YSgpKTsKLQkJCQkJCW9jLnNldFJpZ2h0RXh0ZW5zaW9uKGZCZWFuSW1hZ2UuZ2V0SW1hZ2VEYXRhKCkpOwotCQkJCQkJcmV0dXJuZWRJbWFnZSA9IG9jLmNyZWF0ZUltYWdlKCk7Ci0JCQkJCQlmQmVhbmVkSW1hZ2VzLnB1dChwYXRoSW1hZ2UsIHJldHVybmVkSW1hZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZXR1cm5lZEltYWdlID09IG51bGwpCi0JCQkJCXJldHVybmVkSW1hZ2UgPSBmQmVhbkltYWdlOyAvLyBTaG91bGRuJ3Qgb2NjdXIuCi0JCQl9Ci0JCX0KLQkJCi0JCWlmIChpbWFnZUlzTm9ybWFsICYmIHJldHVybmVkSW1hZ2UgIT0gbnVsbCkgewotCQkJLy8gV2UgbmVlZCB0byBjb21wb3NpdGUgaXQgd2l0aCBibGFuayBzbyB0aGF0IHRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSBzaXplCi0JCQkvLyBhcyBjb21wb3NpdGVkIGltYWdlcy4gSWYgdGhpcyBpc24ndCBkb25lLCB0aGUgdmlld2VyIHdpbGwgc3RyZXRjaCB0aGUgaW1hZ2UKLQkJCS8vIHRvIG1hdGNoIHRoZSBzYW1lIHNpemUgYXMgdGhlIGNvbXBvc2l0ZWQgaW1hZ2VzIGFuZCB0aGluZ3Mgd2lsbCBsb29rIGF3ZWZ1bC4KLQkJCUltYWdlIG5ld1JldHVybmVkID0gKEltYWdlKSBmTm9ybWFsSW1hZ2VzLmdldChyZXR1cm5lZEltYWdlKTsKLQkJCWlmIChuZXdSZXR1cm5lZCA9PSBudWxsKSB7Ci0JCQkJT3ZlcmxheUNvbXBvc2l0ZSBvYyA9IG5ldyBPdmVybGF5Q29tcG9zaXRlKHJldHVybmVkSW1hZ2UuZ2V0SW1hZ2VEYXRhKCkpOwotCQkJCW9jLnNldFJpZ2h0RXh0ZW5zaW9uKGZCbGFua0ltYWdlLmdldEltYWdlRGF0YSgpKTsKLQkJCQluZXdSZXR1cm5lZCA9IG9jLmNyZWF0ZUltYWdlKCk7Ci0JCQkJZk5vcm1hbEltYWdlcy5wdXQocmV0dXJuZWRJbWFnZSwgbmV3UmV0dXJuZWQpOwotCQkJfQotCQkJcmV0dXJuZWRJbWFnZSA9IG5ld1JldHVybmVkOwotCQl9Ci0JCXJldHVybiByZXR1cm5lZEltYWdlOwotCX0KLQotCS8qCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWZQbHVnaW5JbWFnZS5kaXNwb3NlKCk7Ci0JCWZCZWFuSW1hZ2UuZGlzcG9zZSgpOwotCQlmTWlzc2luZ1BhY2thZ2VJbWFnZS5kaXNwb3NlKCk7Ci0JCWZCbGFua0ltYWdlLmRpc3Bvc2UoKTsKLQkJZk1pc3NpbmdMaWJyYXJ5SW1hZ2UuZGlzcG9zZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGZCZWFuZWRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCSgoSW1hZ2UpIGl0ci5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGZQYWNrYWdlZEltYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJKChJbWFnZSkgaXRyLm5leHQoKSkuZGlzcG9zZSgpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gZk1pc3NpbmdQYWNrYWdlZEltYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJKChJbWFnZSkgaXRyLm5leHQoKSkuZGlzcG9zZSgpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gZk5vcm1hbEltYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJKChJbWFnZSkgaXRyLm5leHQoKSkuZGlzcG9zZSgpOwotCQl9CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1NlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOWZlNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogU2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMTAvMDMgMjM6MDY6NDIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZS5KRU1VSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIFNlYXJjaHBhdGhPcmRlcmluZ1dvcmtib29rUGFnZSBpbXBsZW1lbnRzIElCdWlsZFNlYXJjaFBhZ2V7Ci0KLQlwcml2YXRlIExhYmVsIGxhYmVsID0gbnVsbDsKLQlwcml2YXRlIFRhYmxlIHRhYmxlID0gbnVsbDsKLQlwcml2YXRlIENvbXBvc2l0ZSBidXR0b25CYXIgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHVwQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBkb3duQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIExhYmVsIHNwYWNlcjEgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGV4cG9ydEFsbEJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gdW5FeHBvcnRBbGxCdXR0b24gPSBudWxsOwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0JcHJpdmF0ZSBib29sZWFuIGluVXBkYXRlOwotCXByaXZhdGUgQmVhbmluZm9QYXRoc0Jsb2NrIGJlYW5pbmZvUGF0aHNCbG9jazsKLQlwcml2YXRlIENvbXBvc2l0ZSB0b3A7Ci0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyPW51bGw7Ci0JcHJpdmF0ZSBTZWFyY2hQYXRoTGlzdExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50czsKLQlwcml2YXRlIExpc3Qgc2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBMaXN0IGNoZWNrZWQ7Ci0KLQlwdWJsaWMgU2VhcmNocGF0aE9yZGVyaW5nV29ya2Jvb2tQYWdlKEJlYW5pbmZvUGF0aHNCbG9jayBiZWFuaW5mb1BhdGhzQmxvY2spIHsKLQkJdGhpcy5iZWFuaW5mb1BhdGhzQmxvY2sgPSBiZWFuaW5mb1BhdGhzQmxvY2s7Ci0JCXRoaXMuc3RhdHVzID0gU3RhdHVzSGVscGVyLk9LX1NUQVRVUzsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbmV3IFNlYXJjaFBhdGhMaXN0TGFiZWxQcm92aWRlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCl7Ci0JCXRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYWJlbCA9IG5ldyBMYWJlbCh0b3AsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX2xhYmVsKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNyZWF0ZVRhYmxlKCk7Ci0JCXRvcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWNyZWF0ZUJ1dHRvbkJhcigpOwotCQl0b3Auc2V0U2l6ZShuZXcgUG9pbnQoMzAwLCAyMDApKTsKLQkJdXBkYXRlRW5hYmxlZFN0YXRlcygpOwotCQlpZihzcGFjZXIxPT1udWxsKXsKLQkJCS8vVE9ETwotCQl9Ci0JCXJldHVybiB0b3A7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGFibGUJCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhMSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhKCk7Ci0JCWdyaWREYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YTEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMS52ZXJ0aWNhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJdGFibGUgPSBuZXcgVGFibGUodG9wLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkNIRUNLIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YTEpOwotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRTZWxlY3Rpb24oQmVhbmluZm9QYXRoc0Jsb2NrLmdldFNlbGVjdGVkTGlzdCh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJsZVZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoZWxlbWVudHMpOwotCQlpZihnZXRTZWxlY3Rpb24oKSE9bnVsbCkKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSkpOwotCQlpZihjaGVja2VkIT1udWxsKQotCQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGNoZWNrZWQudG9BcnJheSgpKTsKLQkJdGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgY29tcG9zaXRlCQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbkJhcigpIHsKLQkJUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLQkJcm93TGF5b3V0LnR5cGUgPSBvcmcuZWNsaXBzZS5zd3QuU1dULlZFUlRJQ0FMOwotCQlyb3dMYXlvdXQuZmlsbCA9IHRydWU7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhKCk7Ci0JCWdyaWREYXRhMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhMi52ZXJ0aWNhbEFsaWdubWVudCA9IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxBbGlnbm1lbnQgPSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhLkJFR0lOTklORzsKLQkJYnV0dG9uQmFyID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJYnV0dG9uQmFyLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJYnV0dG9uQmFyLnNldExheW91dChyb3dMYXlvdXQpOwotCQl1cEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQmFyLCBTV1QuTk9ORSk7Ci0JCXVwQnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF91cF9idXR0b24pOwotCQl1cEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIHNlbEl0ciA9IGdldFNlbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHNlbEl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxJdHIubmV4dCgpOwotCQkJCQlpbnQgb2xkSW5kZXggPSBlbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpOwotCQkJCQlpZihvbGRJbmRleD4wKXsKLQkJCQkJCWVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJCWVsZW1lbnRzLmFkZCgtLW9sZEluZGV4LCBlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWRvd25CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULk5PTkUpOwotCQlkb3duQnV0dG9uLnNldFRleHQoQmVhbkluZm9VSU1lc3NhZ2VzLkJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9kb3duX2J1dHRvbik7Ci0JCWRvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJdGVyYXRvciBzZWxJdHIgPSBnZXRTZWxlY3Rpb24oKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChzZWxJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gc2VsSXRyLm5leHQoKTsKLQkJCQkJaW50IG9sZEluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJaWYob2xkSW5kZXg8KGVsZW1lbnRzLnNpemUoKS0xKSl7Ci0JCQkJCQllbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQllbGVtZW50cy5hZGQoKytvbGRJbmRleCwgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlzcGFjZXIxID0gbmV3IExhYmVsKGJ1dHRvbkJhciwgU1dULk5PTkUpOwotCQlleHBvcnRBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkJhciwgU1dULk5PTkUpOwotCQlleHBvcnRBbGxCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9QYXRoc0Jsb2NrX0V4cG9ydEFsbCk7Ci0JCWV4cG9ydEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldENoZWNrZWRFbGVtZW50cyhnZXRFbGVtZW50cygpKTsKLQkJCX0KLQkJfSk7Ci0JCXVuRXhwb3J0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25CYXIsIFNXVC5OT05FKTsKLQkJdW5FeHBvcnRBbGxCdXR0b24uc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuQmVhbkluZm9QYXRoc0Jsb2NrX1VuZXhwb3J0QWxsKTsKLQkJdW5FeHBvcnRBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRDaGVja2VkRWxlbWVudHMobnVsbCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChlbGVtZW50cyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKExpc3QgZWxlbWVudHMpewotCQl0aGlzLmVsZW1lbnRzLmNsZWFyKCk7Ci0JCXRoaXMuZWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJaWYodGFibGVWaWV3ZXIhPW51bGwpewotCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJbGFiZWxQcm92aWRlci5zZXRKYXZhUHJvamVjdChqYXZhUHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tlZEVsZW1lbnRzKExpc3QgZXhwb3J0ZWRFbnRyaWVzKSB7Ci0JCXRoaXMuY2hlY2tlZCA9IGV4cG9ydGVkRW50cmllczsKLQkJaWYodGFibGVWaWV3ZXIhPW51bGwgJiYgIXRhYmxlLmlzRGlzcG9zZWQoKSl7Ci0JCQl0YWJsZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZCE9bnVsbCA/IGNoZWNrZWQudG9BcnJheSgpIDogbmV3IE9iamVjdFswXSk7Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQkJcGFnZUNoYW5nZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoQlBMaXN0RWxlbWVudCBjdXJyRWxlbWVudCkgewotCQlpZih0YWJsZVZpZXdlciE9bnVsbCl7Ci0JCQlyZXR1cm4gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChjdXJyRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrZWQhPW51bGwgJiYgY2hlY2tlZC5jb250YWlucyhjdXJyRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0ZWQgPSBzZWxlY3Rpb247Ci0JCWlmKHRhYmxlVmlld2VyIT1udWxsICYmICF0YWJsZS5pc0Rpc3Bvc2VkKCkpewotCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbiE9bnVsbD9zZWxlY3Rpb24gOiBuZXcgQXJyYXlMaXN0KCkpKTsKLQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwYWdlQ2hhbmdlZCgpewotCQl1cGRhdGVTZWFyY2hQYXRoU3RhdHVzKCk7Ci0JCWJlYW5pbmZvUGF0aHNCbG9jay5kb1N0YXR1c0xpbmVVcGRhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpewotCQl1cEJ1dHRvbi5zZXRFbmFibGVkKGNhbk1vdmVVcCgpICYmIGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQkJZG93bkJ1dHRvbi5zZXRFbmFibGVkKGNhbk1vdmVEb3duKCkgJiYgYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQlleHBvcnRBbGxCdXR0b24uc2V0RW5hYmxlZChlbGVtZW50cyE9bnVsbCAmJiBiZWFuaW5mb1BhdGhzQmxvY2suaXNCZWFuaW5mb0VuYWJsZWQoKSk7Ci0JCXVuRXhwb3J0QWxsQnV0dG9uLnNldEVuYWJsZWQoZWxlbWVudHMhPW51bGwgJiYgYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuTW92ZURvd24oKSB7Ci0JCWludFtdIGluZGM9IHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQkJaW50IGs9IGVsZW1lbnRzLnNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGk9IGluZGMubGVuZ3RoIC0gMTsgaSA+PSAwIDsgaS0tLCBrLS0pIHsKLQkJCWlmIChpbmRjW2ldICE9IGspIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbk1vdmVVcCgpIHsKLQkJaW50W10gaW5kYz0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgaW5kYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGluZGNbaV0gIT0gaSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHNlYXJjaCBwYXRoLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVTZWFyY2hQYXRoU3RhdHVzKCkgewotCQlpZiAoaW5VcGRhdGUpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpblVwZGF0ZSA9IHRydWU7Ci0KLQkJCXN0YXR1cyA9IFN0YXR1c0hlbHBlci5PS19TVEFUVVM7Ci0KLQkJCUxpc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCi0JCQlib29sZWFuIGVudHJ5TWlzc2luZyA9IGZhbHNlOwotCi0JCQkvLyBCZWNhdXNlIG9mIGJ1ZyBpbiBzZXRjaGVja2VkV2l0aG91dFVwZGF0ZSwgd2hpY2ggc2V0cyB0byB0cnVlIG5vIG1hdHRlciB3aGF0IHRoZSBzdGF0ZSBpcywgd2UgbmVlZAotCQkJLy8gdG8gYWNjdW11bGF0ZSB0aGUgY2hlY2tlZCBlbGVtZW50cyBhbmQgcmUtc2V0IHRoZW0gYWdhaW4gYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZXkgd2lsbCBiZSBjb3JyZWN0LgkKLQkJCUFycmF5TGlzdCBleHBvcnRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJZm9yIChJdGVyYXRvciBlbnRyaWVzID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgZW50cmllcy5oYXNOZXh0KCk7KSB7Ci0JCQkJQlBMaXN0RWxlbWVudCBjdXJyRWxlbWVudCA9IChCUExpc3RFbGVtZW50KSBlbnRyaWVzLm5leHQoKTsKLQotCQkJCWJvb2xlYW4gaXNDaGVja2VkID0gaXNDaGVja2VkKGN1cnJFbGVtZW50KTsKLQkJCQlpZiAoY3VyckVsZW1lbnQuY2FuRXhwb3J0QmVDaGFuZ2VkKCkpIHsKLQkJCQkJaWYgKGlzQ2hlY2tlZCkKLQkJCQkJCWV4cG9ydGVkLmFkZChjdXJyRWxlbWVudCk7Ci0JCQkJCWN1cnJFbGVtZW50LnNldEV4cG9ydGVkKGlzQ2hlY2tlZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8JCQkJZlNlYXJjaE9yZGVyLnNldENoZWNrZWRXaXRob3V0VXBkYXRlKGN1cnJFbGVtZW50LCBjdXJyRWxlbWVudC5pc0V4cG9ydGVkKCkpOwotCQkJCQlpZiAoY3VyckVsZW1lbnQuaXNFeHBvcnRlZCgpKQotCQkJCQkJZXhwb3J0ZWQuYWRkKGN1cnJFbGVtZW50KTsKLQkJCQl9Ci0KLQkJCQllbnRyeU1pc3NpbmcgPSBlbnRyeU1pc3NpbmcgfHwgY3VyckVsZW1lbnQuaXNNaXNzaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIE5vdyByZXNldCB0aGUgY2hlY2tlZCBzdGF0ZXMsIGR1ZSB0byBidWcKLQkJCXNldENoZWNrZWRFbGVtZW50cyhleHBvcnRlZCk7Ci0KLQkJCWlmIChlbnRyeU1pc3NpbmcpIHsKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgCi0JCQkJCQlKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCUlTdGF0dXMuV0FSTklORywKLQkJCQkJCUJlYW5JbmZvVUlNZXNzYWdlcy5CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3dhcm5pbmdfRW50cnlNaXNzaW5nLAotCQkJCQkJbnVsbCk7IAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaW5VcGRhdGUgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZWFuaW5mb0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYodG9wIT1udWxsICYmICF0b3AuaXNEaXNwb3NlZCgpKQotCQkJdXBkYXRlRW5hYmxlZFN0YXRlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVFbmFibGVkU3RhdGVzKCkgewotCQl1cGRhdGVCdXR0b25zKCk7Ci0JCXRhYmxlLnNldEVuYWJsZWQoYmVhbmluZm9QYXRoc0Jsb2NrLmlzQmVhbmluZm9FbmFibGVkKCkpOwotCQlsYWJlbC5zZXRFbmFibGVkKGJlYW5pbmZvUGF0aHNCbG9jay5pc0JlYW5pbmZvRW5hYmxlZCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1N0YXR1c0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU3RhdHVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ODBjMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvU3RhdHVzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBTdGF0dXNIZWxwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8xMC8wMyAyMzowNjo0MiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZS5KRU1VSVBsdWdpbjsKLSAKLQotcHVibGljIGNsYXNzIFN0YXR1c0hlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgT0tfU1RBVFVTID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssICIiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBFUlJPUl9TVEFUVVMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIiIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0YXR1cyB3aXRoIHRoZSBwcm92aWRlZCBzZXZlcml0eSBhbmQgbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSl7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCAKLQkJCQlKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgCi0JCQkJc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBtb3N0IHNldmVyZSBzdGF0dXMgZnJvbSBhIGFycmF5IG9mIHN0YXRpLgotCSAqIEFuIGVycm9yIGlzIG1vcmUgc2V2ZXJlIHRoYW4gYSB3YXJuaW5nLCBhbmQgYSB3YXJuaW5nIGlzIG1vcmUgc2V2ZXJlCi0JICogdGhhbiBvay4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBnZXRNb3N0U2V2ZXJlKElTdGF0dXNbXSBzdGF0dXMpIHsKLQkJSVN0YXR1cyBtYXg9IG51bGw7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzdGF0dXMubGVuZ3RoOyBpKyspIHsKLQkJCUlTdGF0dXMgY3Vycj0gc3RhdHVzW2ldOwotCQkJaWYgKGN1cnIubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJCXJldHVybiBjdXJyOwotCQkJfQotCQkJaWYgKG1heCA9PSBudWxsIHx8IGN1cnIuZ2V0U2V2ZXJpdHkoKSA+IG1heC5nZXRTZXZlcml0eSgpKSB7Ci0JCQkJbWF4PSBjdXJyOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9UeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1R5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmRlMmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1R5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMTAvMDMgMjM6MDY6NDIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLSAKLQotcHVibGljIGNsYXNzIFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBJU3RhdHVzIGZnRXJyb3JTdGF0dXM9IFN0YXR1c0hlbHBlci5FUlJPUl9TVEFUVVM7IAotCXByaXZhdGUgSVN0YXR1cyBmZ09LU3RhdHVzPSBTdGF0dXNIZWxwZXIuT0tfU1RBVFVTOwotCi0JcHJpdmF0ZSBDbGFzc1tdIGZBY2NlcHRlZFR5cGVzOwotCXByaXZhdGUgYm9vbGVhbiBmQWxsb3dNdWx0aXBsZVNlbGVjdGlvbjsKLQlwcml2YXRlIENvbGxlY3Rpb24gZlJlamVjdGVkRWxlbWVudHM7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFjY2VwdGVkVHlwZXMgVGhlIHR5cGVzIGFjY2VwdGVkIGJ5IHRoZSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB2YWxpZGF0b3IKLQkgKiBhbGxvd3MgbXVsdGlwbGUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IoQ2xhc3NbXSBhY2NlcHRlZFR5cGVzLCBib29sZWFuIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24pIHsKLQkJdGhpcyhhY2NlcHRlZFR5cGVzLCBhbGxvd011bHRpcGxlU2VsZWN0aW9uLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFjY2VwdGVkVHlwZXMgVGhlIHR5cGVzIGFjY2VwdGVkIGJ5IHRoZSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB2YWxpZGF0b3IKLQkgKiBhbGxvd3MgbXVsdGlwbGUgc2VsZWN0aW9uLgotCSAqIEBwYXJhbSByZWplY3RlZEVsZW1lbnRzIEEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IGFyZSBub3QgYWNjZXB0ZWQKLQkgKi8KLQlwdWJsaWMgVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKENsYXNzW10gYWNjZXB0ZWRUeXBlcywgYm9vbGVhbiBhbGxvd011bHRpcGxlU2VsZWN0aW9uLCBDb2xsZWN0aW9uIHJlamVjdGVkRWxlbWVudHMpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChhY2NlcHRlZFR5cGVzKTsKLQkJZkFjY2VwdGVkVHlwZXM9IGFjY2VwdGVkVHlwZXM7Ci0JCWZBbGxvd011bHRpcGxlU2VsZWN0aW9uPSBhbGxvd011bHRpcGxlU2VsZWN0aW9uOwotCQlmUmVqZWN0ZWRFbGVtZW50cz0gcmVqZWN0ZWRFbGVtZW50czsKLQl9CQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25WYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWlmIChpc1ZhbGlkKGVsZW1lbnRzKSkgewotCQkJcmV0dXJuIGZnT0tTdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIGZnRXJyb3JTdGF0dXM7Ci0JfQkKLQotCXByaXZhdGUgYm9vbGVhbiBpc09mQWNjZXB0ZWRUeXBlKE9iamVjdCBvKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmQWNjZXB0ZWRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZBY2NlcHRlZFR5cGVzW2ldLmlzSW5zdGFuY2UobykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1JlamVjdGVkRWxlbWVudChPYmplY3QgZWxlbSkgewotCQlyZXR1cm4gKGZSZWplY3RlZEVsZW1lbnRzICE9IG51bGwpICYmIGZSZWplY3RlZEVsZW1lbnRzLmNvbnRhaW5zKGVsZW0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkVmFsaWQoT2JqZWN0IGVsZW0pIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICghZkFsbG93TXVsdGlwbGVTZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCAhPSAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBvPSBzZWxlY3Rpb25baV07CQotCQkJaWYgKCFpc09mQWNjZXB0ZWRUeXBlKG8pIHx8IGlzUmVqZWN0ZWRFbGVtZW50KG8pIHx8ICFpc1NlbGVjdGVkVmFsaWQobykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvVHlwZWRWaWV3ZXJGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1R5cGVkVmlld2VyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNGY2ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvVHlwZWRWaWV3ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFR5cGVkVmlld2VyRmlsdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMTAvMDMgMjM6MDY6NDIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLSAKLQotcHVibGljIGNsYXNzIFR5cGVkVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQlwcml2YXRlIENsYXNzW10gYWNjZXB0ZWRDbGFzc2VzOwotCXByaXZhdGUgT2JqZWN0W10gcmVqZWN0ZWRGcmFnbWVudHM7Ci0JCi0JcHVibGljIFR5cGVkVmlld2VyRmlsdGVyKENsYXNzW10gYWNjZXB0ZWRDbGFzc2VzLCBPYmplY3RbXSByZWplY3RlZEZyYWdtZW50cykgewotCQl0aGlzLmFjY2VwdGVkQ2xhc3NlcyA9IGFjY2VwdGVkQ2xhc3NlczsKLQkJdGhpcy5yZWplY3RlZEZyYWdtZW50cyA9IHJlamVjdGVkRnJhZ21lbnRzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHJlamVjdGVkRnJhZ21lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCByZWplY3RlZEZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50LmVxdWFscyhyZWplY3RlZEZyYWdtZW50c1tpXSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgYWNjZXB0ZWRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYWNjZXB0ZWRDbGFzc2VzW2ldLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvVmFyaWFibGVTZWxlY3Rpb25CbG9jay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYmVhbmluZm91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vdWkvVmFyaWFibGVTZWxlY3Rpb25CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFhYzUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL1ZhcmlhYmxlU2VsZWN0aW9uQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQnVpbGRQYXRoRGlhbG9nQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFZhcmlhYmxlU2VsZWN0aW9uQmxvY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8xMC8wMyAyMzowNjo0MiAkIAotICovCi0KLXB1YmxpYyBjbGFzcyBWYXJpYWJsZVNlbGVjdGlvbkJsb2NrIHsKLQkKLQkKLQlwcml2YXRlIExpc3QgZkV4aXN0aW5nUGF0aHM7Ci0JCi0JcHJpdmF0ZSBMYWJlbCB2YXJpYWJsZUZpZWxkTGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IHZhcmlhYmxlRmllbGRUZXh0OwotCXByaXZhdGUgQnV0dG9uIHZhcmlhYmxlRmllbGRCdXR0b247Ci0JcHJpdmF0ZSBTdHJpbmcgdmFyaWFibGVGaWVsZFRleHRDb250ZW50OwotCQotCXByaXZhdGUgTGFiZWwgZXh0ZW5zaW9uRmllbGRMYWJlbDsKLQlwcml2YXRlIFRleHQgZXh0ZW5zaW9uRmllbGRUZXh0OwotCXByaXZhdGUgQnV0dG9uIGV4dGVuc2lvbkZpZWxkQnV0dG9uOwotCXByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbkZpZWxkVGV4dENvbnRlbnQ7Ci0JCi0JcHJpdmF0ZSBDTGFiZWwgZkZ1bGxQYXRoOwotCQotCXByaXZhdGUgSVN0YXR1cyBmVmFyaWFibGVTdGF0dXM7Ci0JcHJpdmF0ZSBJU3RhdHVzIGZFeGlzdHNTdGF0dXM7Ci0JcHJpdmF0ZSBJU3RhdHVzIGZFeHRlbnNpb25TdGF0dXM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlZhcmlhYmxlOwotCXByaXZhdGUgSVN0YXR1c0NoYW5nZUxpc3RlbmVyIGZDb250ZXh0OwotCQotCXByaXZhdGUgYm9vbGVhbiBmSXNFbXB0eUFsbG93ZWQ7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFZhcmlhYmxlU2VsZWN0aW9uQmxvY2sKLQkgKi8KLQlwdWJsaWMgVmFyaWFibGVTZWxlY3Rpb25CbG9jayhJU3RhdHVzQ2hhbmdlTGlzdGVuZXIgY29udGV4dCwgTGlzdCBleGlzdGluZ1BhdGhzLCBJUGF0aCB2YXJQYXRoLCBTdHJpbmcgbGFzdFZhclNlbGVjdGlvbiwgYm9vbGVhbiBlbXB0eUFsbG93ZWQpIHsJCi0JCWZDb250ZXh0PSBjb250ZXh0OwotCQlmRXhpc3RpbmdQYXRocz0gZXhpc3RpbmdQYXRoczsKLQkJZklzRW1wdHlBbGxvd2VkPSBlbXB0eUFsbG93ZWQ7Ci0JCWZFeGlzdHNTdGF0dXM9IFN0YXR1c0hlbHBlci5PS19TVEFUVVM7Ci0JCQotCQkvL1ZhcmlhYmxlU2VsZWN0aW9uQWRhcHRlciBhZGFwdGVyPSBuZXcgVmFyaWFibGVTZWxlY3Rpb25BZGFwdGVyKCk7Ci0KLQkJaWYgKHZhclBhdGggIT0gbnVsbCkgewotCQkJdmFyaWFibGVGaWVsZFRleHRDb250ZW50ID0gdmFyUGF0aC5zZWdtZW50KDApOwotCQkJZXh0ZW5zaW9uRmllbGRUZXh0Q29udGVudCA9IHZhclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJdmFyaWFibGVGaWVsZFRleHRDb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWV4dGVuc2lvbkZpZWxkVGV4dENvbnRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXVwZGF0ZUZ1bGxUZXh0RmllbGQoKTsKLQkJZlZhcmlhYmxlU3RhdHVzPSB2YXJpYWJsZVVwZGF0ZWQoKTsKLQkJZkV4dGVuc2lvblN0YXR1cz1leHRlbnNpb25VcGRhdGVkKCk7Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRWYXJpYWJsZVBhdGgoKSB7Ci0JCWlmIChmVmFyaWFibGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZWYXJpYWJsZSkuYXBwZW5kKGV4dGVuc2lvbkZpZWxkVGV4dENvbnRlbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0UmVzb2x2ZWRQYXRoKCkgewotCQlpZiAoZlZhcmlhYmxlICE9IG51bGwpIHsKLQkJCUlQYXRoIGVudHJ5UGF0aD0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUoZlZhcmlhYmxlKTsKLQkJCWlmIChlbnRyeVBhdGggIT0gbnVsbCkgewotCQkJCXJldHVybiBlbnRyeVBhdGguYXBwZW5kKGV4dGVuc2lvbkZpZWxkVGV4dENvbnRlbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCQkKLQlwdWJsaWMgdm9pZCBzZXRGb2N1cyhEaXNwbGF5IGRpc3BsYXkpIHsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdmFyaWFibGVGaWVsZFRleHQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBpbm5lcj0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWlubmVyLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJdmFyaWFibGVGaWVsZExhYmVsID0gbmV3IExhYmVsKGlubmVyLCBTV1QuTk9ORSk7Ci0JCXZhcmlhYmxlRmllbGRMYWJlbC5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX3ZhcmlhYmxlX2xhYmVsKTsKLQkJdmFyaWFibGVGaWVsZExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl2YXJpYWJsZUZpZWxkVGV4dCA9IG5ldyBUZXh0KGlubmVyLCBTV1QuQk9SREVSfFNXVC5TSU5HTEUpOwotCQl2YXJpYWJsZUZpZWxkVGV4dC5zZXRUZXh0KHZhcmlhYmxlRmllbGRUZXh0Q29udGVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJdmFyaWFibGVGaWVsZFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXZhcmlhYmxlRmllbGRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmFyaWFibGVGaWVsZFRleHRDb250ZW50ID0gdmFyaWFibGVGaWVsZFRleHQuZ2V0VGV4dCgpOwotCQkJCWZWYXJpYWJsZVN0YXR1cyA9IHZhcmlhYmxlVXBkYXRlZCgpOwotCQkJCWZFeGlzdHNTdGF0dXM9IGdldEV4aXN0c1N0YXR1cygpOwotCQkJCXVwZGF0ZUZ1bGxUZXh0RmllbGQoKTsKLQkJCQlmQ29udGV4dC5zdGF0dXNDaGFuZ2VkKFN0YXR1c0hlbHBlci5nZXRNb3N0U2V2ZXJlKG5ldyBJU3RhdHVzW10geyBmVmFyaWFibGVTdGF0dXMsIGZFeHRlbnNpb25TdGF0dXMsIGZFeGlzdHNTdGF0dXMgfSkpOwotCQkJfQotCQl9KTsKLQkJdmFyaWFibGVGaWVsZEJ1dHRvbiA9IG5ldyBCdXR0b24oaW5uZXIsIFNXVC5QVVNIKTsKLQkJdmFyaWFibGVGaWVsZEJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX3ZhcmlhYmxlX2J1dHRvbik7Ci0JCXZhcmlhYmxlRmllbGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXZhcmlhYmxlRmllbGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdmFyaWFibGU9IGNob29zZVZhcmlhYmxlKCk7Ci0JCQkJaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKLQkJCQkJdmFyaWFibGVGaWVsZFRleHQuc2V0VGV4dCh2YXJpYWJsZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWV4dGVuc2lvbkZpZWxkTGFiZWwgPSBuZXcgTGFiZWwoaW5uZXIsIFNXVC5OT05FKTsKLQkJZXh0ZW5zaW9uRmllbGRMYWJlbC5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2V4dGVuc2lvbl9sYWJlbCk7Ci0JCWV4dGVuc2lvbkZpZWxkTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWV4dGVuc2lvbkZpZWxkVGV4dCA9IG5ldyBUZXh0KGlubmVyLCBTV1QuQk9SREVSfFNXVC5TSU5HTEUpOwotCQlleHRlbnNpb25GaWVsZFRleHQuc2V0VGV4dCh2YXJpYWJsZUZpZWxkVGV4dENvbnRlbnQpOwotCQlleHRlbnNpb25GaWVsZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWV4dGVuc2lvbkZpZWxkVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWV4dGVuc2lvbkZpZWxkVGV4dENvbnRlbnQgPSBleHRlbnNpb25GaWVsZFRleHQuZ2V0VGV4dCgpOwotCQkJCWZFeHRlbnNpb25TdGF0dXM9IGV4dGVuc2lvblVwZGF0ZWQoKTsKLQkJCQlmRXhpc3RzU3RhdHVzPSBnZXRFeGlzdHNTdGF0dXMoKTsKLQkJCQl1cGRhdGVGdWxsVGV4dEZpZWxkKCk7Ci0JCQkJZkNvbnRleHQuc3RhdHVzQ2hhbmdlZChTdGF0dXNIZWxwZXIuZ2V0TW9zdFNldmVyZShuZXcgSVN0YXR1c1tdIHsgZlZhcmlhYmxlU3RhdHVzLCBmRXh0ZW5zaW9uU3RhdHVzLCBmRXhpc3RzU3RhdHVzIH0pKTsKLQkJCX0KLQkJfSk7Ci0JCWV4dGVuc2lvbkZpZWxkQnV0dG9uID0gbmV3IEJ1dHRvbihpbm5lciwgU1dULlBVU0gpOwotCQlleHRlbnNpb25GaWVsZEJ1dHRvbi5zZXRUZXh0KEJlYW5JbmZvVUlNZXNzYWdlcy5WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2V4dGVuc2lvbl9idXR0b24pOwotCQlleHRlbnNpb25GaWVsZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJZXh0ZW5zaW9uRmllbGRCdXR0b24uc2V0RW5hYmxlZChmVmFyaWFibGUhPW51bGwpOwotCQlleHRlbnNpb25GaWVsZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlQYXRoIGZpbGVQYXRoPSBjaG9vc2VFeHRKYXIoKTsKLQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCQlleHRlbnNpb25GaWVsZFRleHQuc2V0VGV4dChmaWxlUGF0aC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChpbm5lciwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJbGFiZWwuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja19mdWxscGF0aF9sYWJlbCk7IAotCQkKLQkJZkZ1bGxQYXRoPSBuZXcgQ0xhYmVsKGlubmVyLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuPTI7Ci0JCWZGdWxsUGF0aC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCXVwZGF0ZUZ1bGxUZXh0RmllbGQoKTsKLQkJCi0JCXNldEZvY3VzKHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQkKLQkJcmV0dXJuIGlubmVyOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YXJpYWJsZVVwZGF0ZWQoKSB7Ci0JCWZWYXJpYWJsZT0gbnVsbDsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzPSBTdGF0dXNIZWxwZXIuT0tfU1RBVFVTOwotCQkKLQkJU3RyaW5nIG5hbWUgPSB2YXJpYWJsZUZpZWxkVGV4dENvbnRlbnQ7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWlmICghZklzRW1wdHlBbGxvd2VkKSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzSGVscGVyLmNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9lbnRlcm5hbWVfRVJST1JfKTsgCi0JCQl9IGVsc2UgewotCQkJCWZWYXJpYWJsZT0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIGlmIChKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZShuYW1lKSA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNIZWxwZXIuY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIEJlYW5JbmZvVUlNZXNzYWdlcy5WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2Vycm9yX25hbWVub3RleGlzdHNfRVJST1JfKTsgCi0JCX0gZWxzZSB7Ci0JCQlmVmFyaWFibGU9IG5hbWU7Ci0JCX0KLQkJaWYoZXh0ZW5zaW9uRmllbGRCdXR0b24hPW51bGwpCi0JCQlleHRlbnNpb25GaWVsZEJ1dHRvbi5zZXRFbmFibGVkKGZWYXJpYWJsZSAhPSBudWxsKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIGV4dGVuc2lvblVwZGF0ZWQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzPSBTdGF0dXNIZWxwZXIuT0tfU1RBVFVTOwotCQlTdHJpbmcgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uRmllbGRUZXh0Q29udGVudDsKLQkJaWYgKGV4dGVuc2lvbi5sZW5ndGgoKSA+IDAgJiYgIVBhdGguUk9PVC5pc1ZhbGlkUGF0aChleHRlbnNpb24pKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNIZWxwZXIuY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIEJlYW5JbmZvVUlNZXNzYWdlcy5WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2Vycm9yX2ludmFsaWRleHRlbnNpb25fRVJST1JfKTsgCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCQotCXByaXZhdGUgSVN0YXR1cyBnZXRFeGlzdHNTdGF0dXMoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzSGVscGVyLk9LX1NUQVRVUzsKLQkJSVBhdGggcGF0aD0gZ2V0UmVzb2x2ZWRQYXRoKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWlmIChmaW5kUGF0aChwYXRoKSkgewotCQkJCXN0YXR1cyA9IFN0YXR1c0hlbHBlci5jcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIEJlYW5JbmZvVUlNZXNzYWdlcy5WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2Vycm9yX3BhdGhleGlzdHNfRVJST1JfKTsgCi0JCQl9IGVsc2UgaWYgKCFwYXRoLnRvRmlsZSgpLmlzRmlsZSgpKSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzSGVscGVyLmNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsICBCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja193YXJuaW5nX3BhdGhub3RleGlzdHNfV0FSTl8pOyAKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IFN0YXR1c0hlbHBlci5jcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCAgQmVhbkluZm9VSU1lc3NhZ2VzLlZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfd2FybmluZ19wYXRobm90ZXhpc3RzX1dBUk5fKTsgCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZpbmRQYXRoKElQYXRoIHBhdGgpIHsKLQkJZm9yIChpbnQgaT0gZkV4aXN0aW5nUGF0aHMuc2l6ZSgpIC0xOyBpID49MDsgaS0tKSB7Ci0JCQlJUGF0aCBjdXJyPSAoSVBhdGgpIGZFeGlzdGluZ1BhdGhzLmdldChpKTsKLQkJCWlmIChjdXJyLmVxdWFscyhwYXRoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUZ1bGxUZXh0RmllbGQoKSB7Ci0JCWlmIChmRnVsbFBhdGggIT0gbnVsbCAmJiAhZkZ1bGxQYXRoLmlzRGlzcG9zZWQoKSkgewotCQkJSVBhdGggcmVzb2x2ZWRQYXRoPSBnZXRSZXNvbHZlZFBhdGgoKTsKLQkJCWlmIChyZXNvbHZlZFBhdGggIT0gbnVsbCkgewotCQkJCWZGdWxsUGF0aC5zZXRUZXh0KHJlc29sdmVkUGF0aC50b09TU3RyaW5nKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlmRnVsbFBhdGguc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotCQlpZiAoZkZ1bGxQYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBmRnVsbFBhdGguZ2V0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJjaGl2ZVBhdGgoSVBhdGggcGF0aCl7Ci0JCWZpbmFsIFN0cmluZ1tdIGFyY2hpdmVFeHRlbnNpb25zID0geyJqYXIiLCAiemlwIn07Ci0JCVN0cmluZyBleHQ9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlpZiAoZXh0ICE9IG51bGwgJiYgZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBhcmNoaXZlRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZShhcmNoaXZlRXh0ZW5zaW9uc1tpXSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGF0aCBjaG9vc2VFeHRKYXIoKSB7Ci0JCVN0cmluZyBsYXN0VXNlZFBhdGg9ICIiOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGVudHJ5UGF0aD0gZ2V0UmVzb2x2ZWRQYXRoKCk7Ci0JCWlmIChlbnRyeVBhdGggIT0gbnVsbCkgewotCQkJaWYgKGlzQXJjaGl2ZVBhdGgoZW50cnlQYXRoKSkgewotCQkJCWxhc3RVc2VkUGF0aD0gZW50cnlQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b09TU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCWxhc3RVc2VkUGF0aD0gZW50cnlQYXRoLnRvT1NTdHJpbmcoKTsKLQkJCX0KLQkJfQotCQkKLQkJRmlsZURpYWxvZyBkaWFsb2c9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCksIFNXVC5TSU5HTEUpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmphcjsqLnppcCJ9KTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0VXNlZFBhdGgpOwotCQlkaWFsb2cuc2V0VGV4dChCZWFuSW5mb1VJTWVzc2FnZXMuVmFyaWFibGVTZWxlY3Rpb25CbG9ja19FeHRKYXJEaWFsb2dfdGl0bGUpOyAKLQkJU3RyaW5nIHJlcz0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJUGF0aCByZXNQYXRoPSBuZXcgUGF0aChyZXMpLm1ha2VBYnNvbHV0ZSgpOwotCQlJUGF0aCB2YXJQYXRoPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZShmVmFyaWFibGUpOwotCQkKLQkJaWYgKCF2YXJQYXRoLmlzUHJlZml4T2YocmVzUGF0aCkpIHsKLQkJCXJldHVybiBuZXcgUGF0aChyZXNQYXRoLmxhc3RTZWdtZW50KCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJlc1BhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyh2YXJQYXRoLnNlZ21lbnRDb3VudCgpKS5zZXREZXZpY2UobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjaG9vc2VWYXJpYWJsZSgpIHsKLQkJSVBhdGhbXSB2YXJQYXRocyA9IEJ1aWxkUGF0aERpYWxvZ0FjY2Vzcy5jaG9vc2VWYXJpYWJsZUVudHJpZXModmFyaWFibGVGaWVsZEJ1dHRvbi5nZXRTaGVsbCgpLCBuZXcgSVBhdGhbMF0pOwotCQlTdHJpbmcgdmFyaWFibGUgPSBudWxsOwotCQlpZih2YXJQYXRocyE9bnVsbCAmJiB2YXJQYXRocy5sZW5ndGg+MCl7Ci0JCQl2YXJpYWJsZSA9IHZhclBhdGhzWzBdLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmxlOwotCX0KLQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9iZWFuaW5mb3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9iZWFuaW5mby91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDU3M2ViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2JlYW5pbmZvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2JlYW5pbmZvL3VpL0F0dGljL21lc3NhZ2VzLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQKLSMKLQotCi1TZWFyY2hQYXRoRGlhbG9nX0Nob29zZVBhY2thZ2VzICAgICAgICAgICAgICAgICAgICAgICAgID0gJkNob29zZSBQYWNrYWdlcwotU2VhcmNoUGF0aERpYWxvZ19SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZSZW1vdmUKLVNlYXJjaFBhdGhEaWFsb2dfRGVzY19MYWJlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAmTW9kaWZ5IHNlYXJjaCBwYXRoIG9mIHBhY2thZ2VzIHdpdGhpbiB0aGlzIEJlYW5JbmZvIGNsYXNzZXMgSkFSL2ZvbGRlcgotU2VhcmNoUGF0aERpYWxvZ19Nb2RpZnlTZWFyY2hQYXRocyAgICAgICAgICAgICAgICAgICAgICA9IE1vZGlmeSBTZWFyY2ggUGF0aHMgLSB7MH0KLVNlYXJjaFBhdGhEaWFsb2dfTm90RWRpdGFibGVfSU5GT18gICAgICAgICAgICAgICAgICAgICAgPSBJV0FWMDA3NUkgUGx1Z2luIHR5cGUgQmVhbkluZm8gY2xhc3NlcyBsb2NhdGlvbnMgYXJlIG5vdCBlZGl0YWJsZQotU2VhcmNoUGF0aERpYWxvZ19QYWNrYWdlUHJlc2VudF9JTkZPXyAgICAgICAgICAgICAgICAgICA9IElXQVYwMDc2SSBQYWNrYWdlIGFscmVhZHkgaW4gdGhlIHNlYXJjaCBwYXRoCi1TZWFyY2hQYXRoRGlhbG9nX0lucHV0RGlhbG9nX1RpdGxlICAgICAgICAgICAgICAgICAgICAgID0gUGFja2FnZQotU2VhcmNoUGF0aERpYWxvZ19JbnB1dERpYWxvZ19NZXNzYWdlICAgICAgICAgICAgICAgICAgICA9ICZFbnRlciBhIHBhY2thZ2U6Ci1CZWFuSW5mb1BhdGhzQmxvY2tfRXhwb3J0QWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRSZ4cG9ydCBhbGwKLUJlYW5JbmZvUGF0aHNCbG9ja19VbmV4cG9ydEFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBVJm5leHBvcnQgYWxsCi1CZWFuSW5mb1BhdGhzQmxvY2tfUGFnZV9UYWJfUGFja2FnZXMgICAgICAgICAgICAgICAgICAgID0gJlBhY2thZ2VzCi1CZWFuSW5mb1BhdGhzQmxvY2tfUGFnZV9UYWJfQ2xhc3NlcyAgICAgICAgICAgICAgICAgICAgID0gJkJlYW5JbmZvIGNsYXNzZXMKLUJlYW5JbmZvc1dvcmtib29rUGFnZV9BZGRGb2xkZXJzICAgICAgICAgICAgICAgICAgICAgICAgPSAmQWRkIEZvbGRlcnMKLUJlYW5JbmZvc1dvcmtib29rUGFnZV9BZGRKQVJzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGQgJkpBUnMKLUJlYW5JbmZvc1dvcmtib29rUGFnZV9BZGRFeHRlcm5hbEpBUiAgICAgICAgICAgICAgICAgICAgPSBBZGQgRSZ4dGVybmFsIEpBUnMKLUJlYW5JbmZvc1dvcmtib29rUGFnZV9BZGRWYXJpYWJsZSAgICAgICAgICAgICAgICAgICAgICAgPSBBZGQgJlZhcmlhYmxlCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfQWRkUHJvamVjdHMgICAgICAgICAgICAgICAgICAgICAgID0gQWRkIFByb2plYyZ0cwotQmVhbkluZm9zV29ya2Jvb2tQYWdlX01vZGlmeVBhdGhzICAgICAgICAgICAgICAgICAgICAgICA9ICZNb2RpZnkgUGF0aHMKLUJlYW5JbmZvc1dvcmtib29rUGFnZV9SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAmUmVtb3ZlCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfTGlzdF9UZXh0ICAgICAgICAgICAgICAgICAgICAgICAgID0gJkNob29zZSBsb2NhdGlvbnMgb2YgQmVhbkluZm8gY2xhc3NlcyAoQmVhbkluZm8gY2xhc3NlcyBsb2NhdGlvbnMgbm90IGluIGN1cnJlbnQgcHJvamVjdCkKLUJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfQ2xhc3Nlc19UaXRsZSAgICAgPSBCZWFuSW5mbyBDbGFzcyBGb2xkZXJzIFNlbGVjdGlvbgotQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19KQVJzX1RpdGxlICAgICAgICA9IEpBUiBTZWxlY3Rpb24KLUJlYW5JbmZvc1dvcmtib29rUGFnZV9TZWxlY3Rpb25EaWFsb2dfSkFSc19NZXNzYWdlICAgICAgPSAmQ2hvb3NlIEpBUnMgdG8gYmUgYWRkZWQgYXMgQmVhbkluZm8gY2xhc3NlcyBKQVJzCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX0V4dEpBUnNfVGV4dCAgICAgID0gSkFSIFNlbGVjdGlvbgotQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19Qcm9qZWN0c19UaXRsZSAgICA9IEJlYW5JbmZvIFByb2plY3RzIFNlbGVjdGlvbgotQmVhbkluZm9zV29ya2Jvb2tQYWdlX1NlbGVjdGlvbkRpYWxvZ19DbGFzc2VzX1Byb21wdCAgICA9ICZDaG9vc2UgZm9sZGVycyB0byBiZSBhZGRlZCBhcyBCZWFuSW5mbyBjbGFzc2VzIGZvbGRlcnMuCi1CZWFuSW5mb3NXb3JrYm9va1BhZ2VfU2VsZWN0aW9uRGlhbG9nX1Byb2plY3RzX1Byb21wdCAgID0gJkNob29zZSBwcm9qZWN0cyB0byBiZSBhZGRlZCBhcyBCZWFuSW5mbyBwcm9qZWN0cy4KLVBhY2thZ2VzV29ya2Jvb2tfQ2hvb3NlUGFja2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSAmQ2hvb3NlIHBhY2thZ2VzCi1QYWNrYWdlc1dvcmtib29rX0Nob29zZURlZmluZWRQYXRocyAgICAgICAgICAgICAgICAgICAgID0gQ2hvb3NlICZkZWZpbmVkIHBhdGhzCi1QYWNrYWdlc1dvcmtib29rX1JlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJlJlbW92ZQotUGFja2FnZXNXb3JrYm9va19MYWJlbFRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENob29zZSBCZWFuSW5mbyAmcGFja2FnZXMgZnJvbSB0aGUgY2xhc3MgcGF0aAotUGFja2FnZXNXb3JrYm9va19TZWxlY3Rpb25EaWFsb2dfRGVmaW5lZFBhdGhzX1RpdGxlICAgICA9IENob29zZSBEZWZpbmVkIFBhdGhzCi1QYWNrYWdlc1dvcmtib29rX1NlbGVjdGlvbkRpYWxvZ19EZWZpbmVkUGF0aHNfTWVzc2FnZSAgID0gQ2hvb3NlIHRoZSBwcmUtZGVmaW5lZCBwYXRocyB0byBhZGQgdG8gdGhlIHNlYXJjaCBwYXRoCi1MYWJlbFByb3ZpZGVyX0xpYnJhcnlfRm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gezB9IChjbGFzcyBmb2xkZXIpCi1MYWJlbFByb3ZpZGVyX0xpYnJhcnlfX1BhdGhMYXN0U2VnbWVudF9QYXRoUmVsYXRpdmVfICAgID0gezB9IC0gezF9Ci1MYWJlbFByb3ZpZGVyX0xpYnJhcnlfX1BhdGhMYXN0U2VnbWVudF9QYXRoRXhjZXB0TGFzdF8gID0gezB9IC0gezF9Ci1MYWJlbFByb3ZpZGVyX1ZhcmlhYmxlX19uYW1lX1BhdGhPU1N0cmluZ18gICAgICAgICAgICAgID0gezB9IC0gezF9Ci1MYWJlbFByb3ZpZGVyX19wYWNrYWdlTmFtZV9QYXRoXyAgICAgICAgICAgICAgICAgICAgICAgID0gezB9OiB7MX0KLQotVmFyaWFibGVTZWxlY3Rpb25CbG9ja192YXJpYWJsZV9sYWJlbCAgICAgICAgICAgICAgICAgICA9ICZWYXJpYWJsZSBOYW1lOgotVmFyaWFibGVTZWxlY3Rpb25CbG9ja192YXJpYWJsZV9idXR0b24gICAgICAgICAgICAgICAgICA9ICZCcm93c2UuLi4KLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXh0ZW5zaW9uX2xhYmVsICAgICAgICAgICAgICAgICAgPSBQYXRoIEUmeHRlbnNpb246Ci1WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2V4dGVuc2lvbl9idXR0b24gICAgICAgICAgICAgICAgID0gQnJvJndzZS4uLgotVmFyaWFibGVTZWxlY3Rpb25CbG9ja19mdWxscGF0aF9sYWJlbCAgICAgICAgICAgICAgICAgICA9IFJlc29sdmVkIFBhdGg6Ci0KLVZhcmlhYmxlU2VsZWN0aW9uQmxvY2tfZXJyb3JfZW50ZXJuYW1lX0VSUk9SXyAgICAgICAgICAgPSBJV0FWMDA3N0UgVmFyaWFibGUgbmFtZSBtdXN0IGJlIGVudGVyZWQuCi1WYXJpYWJsZVNlbGVjdGlvbkJsb2NrX2Vycm9yX25hbWVub3RleGlzdHNfRVJST1JfICAgICAgID0gSVdBVjAwNzhFIFZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgotVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9wYXRoZXhpc3RzX0VSUk9SXyAgICAgICAgICA9IElXQVYwMDc5RSBDbGFzcyBwYXRoIGVudHJ5IGFscmVhZHkgZXhpc3RzLgotVmFyaWFibGVTZWxlY3Rpb25CbG9ja19lcnJvcl9pbnZhbGlkZXh0ZW5zaW9uX0VSUk9SXyAgICA9IElXQVYwMDgwRSBFeHRlbnNpb24gaXMgbm90IGEgdmFsaWQgcGF0aC4KLQotVmFyaWFibGVTZWxlY3Rpb25CbG9ja193YXJuaW5nX3BhdGhub3RleGlzdHNfV0FSTl8gICAgICA9IElXQVYwMDgxVyBSZXNvbHZlZCBwYXRoIGlzIG5vdCBhbiBleGlzdGluZyBKQVIgZmlsZS4KLQotVmFyaWFibGVTZWxlY3Rpb25CbG9ja19FeHRKYXJEaWFsb2dfdGl0bGUgICAgICAgICAgICAgICA9IEpBUiBTZWxlY3Rpb24KLQotCi0KLQotIwotIyBQcm9wZXJ0aWVzIGZvciB0aGUgY29tLmlibS5ldG9vbHMuYmVhbmluZm8udWkgcGx1Z2luCi0jCi0KLSMgVGhpcyBzaG93cyB1cCBhcyB0aGUgdGl0bGUgb2YgYSBtZXNzYWdlIGRpYWxvZwotQmVhbmluZm9fVUlfX2Vycm9ydGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVycm9yCi0KLUJlYW5pbmZvX1VJX19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFcnJvciB3aGlsZSBzZXR0aW5nIEJlYW5JbmZvIGNvbmZpZ3VyYXRpb24uCi0KLUJlYW5pbmZvUHJvcGVydGllc1BhZ2VfSU5GT19fbm9qYXZhcHJvamVjdCAgICAgICAgICAgICAgPSBJV0FWMDAxOUkgQmVhbkluZm8gaXMgb25seSBhcHBsaWNhYmxlIHRvIEphdmEgcHJvamVjdHMuCi1CZWFuaW5mb1Byb3BlcnRpZXNQYWdlX0lORk9fX2Nsb3NlZHByb2plY3QgICAgICAgICAgICAgID0gSVdBVjAwMjBJIEJlYW5JbmZvIGlzIG5vdCBhdmFpbGFibGUgZm9yIGEgY2xvc2VkIHByb2plY3QuCi0KLSMgVGhpcyBpcyBhIGNoZWNrYm94IG9uIGEgcHJlZmVyZW5jZSBwYWdlLiBUaGUgbGFiZWwgaXMgdG8gaW5kaWNhdGUgd2hldGhlciBpbnRyb3NwZWN0aW9uIGlzIGVuYWJsZWQgdG8gcnVuIG9yIG5vdC4KLUJlYW5pbmZvUGF0aHNCbG9ja19VSV9fZW5hYmxlYmVhbmluZm8gICAgICAgICAgICAgICAgICAgPSAmRW5hYmxlIEJlYW5JbmZvIEludHJvc3BlY3Rpb24gb24gdGhpcyBQcm9qZWN0Ci0KLSMgVGhpcyBpcyBhIGhlYWRlciBsaW5lIGZvciBhIHBhZ2Ugb2YgcHJlZmVyZW5jZXMuCi1CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfbGFiZWwgICAgICAgICAgICAgICAgID0gQnVpbGQgQmVhbkluZm8gJnNlYXJjaCBwYXRoIG9yZGVyIGFuZCBleHBvcnRlZCBlbnRyaWVzOlxuKEV4cG9ydGVkIGVudHJpZXMgYXJlIGNvbnRyaWJ1dGVkIHRvIGRlcGVuZGVudCBwcm9qZWN0cykKLUJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF91cF9idXR0b24gICAgICAgICAgICAgPSAmVXAKLUJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VhcmNocGF0aF9kb3duX2J1dHRvbiAgICAgICAgICAgPSAmRG93bgotQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX3JlbW92ZV9idXR0b24gICAgICAgICA9ICZSZW1vdmUKLUJlYW5pbmZvUGF0aHNCbG9ja19VSV9fc2VyYWNocGF0aF90YWJfb3JkZXIgICAgICAgICAgICAgPSAmT3JkZXIgYW5kIEV4cG9ydAotCi1CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3dhcm5pbmdfRW50cnlNaXNzaW5nICAgICAgICAgICAgID0gUHJvamVjdCBjbGFzcyBwYXRoIGVudHJpZXMsIG9yIEJlYW5JbmZvIGNsYXNzIGZpbGVzIGFyZSBtaXNzaW5nLgotCi0jIHswfSB3aWxsIGJlIHRoZSBwYWNrYWdlIG5hbWUsIGUuZy4gamF2YS5sYW5nCi1CZWFuaW5mb1BhdGhzQmxvY2tfV0FSTl9fc2VhcmNocGF0aF9taXNzaW5nX3BhdGhfZm9ybWF0ID0gSVdBVjAwMjFXIHswfSAtIFBhY2thZ2UgcGF0aCBub3QgZm91bmQuCi0KLSMgVGhpcyBpcyBhIG1lc3NhZ2Ugb24gYSBwcm9ncmVzcyBkaWFsb2cuCi1CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3NlYXJjaHBhdGhfb3BlcmF0aW9uZGVzY3JpcHRpb24gID0gU2V0dGluZyBCZWFuSW5mbyBzZWFyY2ggcGF0aHMuLi4KLQotQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19hZGRzZWFyY2hwYXRoX3RpdGxlICAgICAgICAgICAgICA9IFNlbGVjdCBQYWNrYWdlcwotQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19hZGRzZWFyY2hwYXRoX2Rlc2NyaXB0aW9uICAgICAgICA9ICZTZWxlY3QgcGFja2FnZXMgdG8gYWRkIHRvIHNlYXJjaCBwYXRoOgotCi1CZWFuaW5mb1BhdGhzQmxvY2tfVUlfX3dhcm5pbmdfRW50cnlNaXNzaW5nICAgICAgICAgICAgID0gUHJvamVjdCBjbGFzcyBwYXRoIGVudHJpZXMsIG9yIEJlYW5JbmZvIGNsYXNzIGZpbGVzIGFyZSBtaXNzaW5nLgotQmVhbmluZm9QYXRoc0Jsb2NrX1VJX19zZWFyY2hwYXRoX2FkZF9idXR0b24gICAgICAgICAgICA9IEFkZCBQYWNrYWdlLi4uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3ZTI1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdWkuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotb3V0cHV0LnVpLmphciA9IGJpbi8KLXNvdXJjZS51aS5qYXIgPSB1aS8sXAotICAgICAgICAgICAgICAgIGJlYW5pbmZvdWkvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9ibGFuay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9ibGFuay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjlkMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvYmxhbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvY3Bfb3JkZXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2NwX29yZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmE0Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvY3Bfb3JkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9ydW5fZXhjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9ydW5fZXhjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmNDEwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9mdWxsL2N0b29sMTYvcnVuX2V4Yy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9mdWxsL29iajE2L2ZpbGVfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjExNjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvZnVsbC93aXpiYW4vcnVuX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9mdWxsL3dpemJhbi9ydW5fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiZDQ2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9mdWxsL3dpemJhbi9ydW5fd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2phdmFiZWFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL2phdmFiZWFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4NTI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9qYXZhYmVhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9wYWNrYWdlX29ial9taXNzaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL3BhY2thZ2Vfb2JqX21pc3NpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGQ3ZTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL2ljb25zL3BhY2thZ2Vfb2JqX21pc3NpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvaWNvbnMvcGx1Z2luX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9wbHVnaW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5M2RmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9pY29ucy9wbHVnaW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNWZiNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvQXR0aWMvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQKLSMKLQotCi1wbHVnaW5OYW1lPUphdmEgRU1GIE1vZGVsIFVJCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCi1wcm94eUxhdW5jaEdyb3VwLmxhYmVsPVByb3h5Ci0KLUFjdGlvblNldC5wcm94eVRvb2xzPVByb3h5IFRvb2xzCi1BY3Rpb25TZXQucHJveHlUb29scy5EZXNjcmlwdGlvbj1BY3Rpb25zIGZvciB3b3JraW5nIHdpdGggUHJveHkgYW5kIFByb3h5IExhdW5jaGVycy4KLUFjdGlvbi5wcm94eUxhdW5jaD1Qcm94eS4uLgotQWN0aW9uLnByb3h5TGF1bmNoVGlwPVByb3h5IExhdW5jaCBNYW5hZ2VyCi1BY3Rpb24uc2VsZWN0RGVmYXVsdD1TZWxlY3QgRGVmYXVsdCBQcm94eSBDb25maWd1cmF0aW9uLi4uCi1BY3Rpb24uc2VsZWN0RGVmYXVsdFRpcD1TZWxlY3QgZGVmYXVsdCBmb3IgezB9LgotTWVudS5ydW49JlJ1bgotCi1FZGl0b3JzLk92ZXJyaWRlRWRpdG9yID0gT3ZlcnJpZGUgRWRpdG9yCi0KLSMgVGhpcyBpcyB0aGUgdGl0bGUgb2YgdGhlIFByb3BlcnRpZXMgcGFnZSBmb3Igc2V0dGluZyBwcm9wZXJ0aWVzIG9mIEJlYW5JbmZvIHBhdGhzLgotQmVhbmluZm9QYXRoX1RpdGxlX1VJXyA9IEJlYW5JbmZvIFBhdGgKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzU0ODM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEdyb3VwcyI+Ci0gICAgICA8bGF1bmNoR3JvdXAKLSAgICAgICAgICAgIGxhYmVsPSIlcHJveHlMYXVuY2hHcm91cC5sYWJlbCIKLSAgICAgICAgICAgIGJhbm5lckltYWdlPSJpY29ucy9mdWxsL3dpemJhbi9ydW5fd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiCi0gICAgICAgICAgICBpbWFnZT0iaWNvbnMvZnVsbC9jdG9vbDE2L3J1bl9leGMuZ2lmIgotICAgICAgICAgICAgbW9kZT0icnVuIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS5wcm94eSI+Ci0gICAgICA8L2xhdW5jaEdyb3VwPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9ydW5fZXhjLmdpZiIKLSAgICAgICAgICAgIGNvbmZpZ1R5cGVJRD0ib3JnLmVjbGlwc2UuamVtLnByb3h5LkxvY2FsUHJveHlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZS5sb2NhbFByb3h5Ij4KLSAgICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cHMiPgotICAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cAotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuamVtLnByb3h5LkxvY2FsUHJveHlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkucmVtb3RlLkxvY2FsTGF1bmNoVGFiR3JvdXAiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnVpLnJlbW90ZS5Mb2NhbExhdW5jaFRhYkdyb3VwMSI+Ci0gICAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVBY3Rpb25TZXQucHJveHlUb29scyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQWN0aW9uU2V0LnByb3h5VG9vbHMuRGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnVpLlByb3h5VG9vbHNTZXQiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSIlTWVudS5ydW4iCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucnVuIj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkuUHJveHlMYXVuY2hUb29sYmFyRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvcnVuX2V4Yy5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnVpLnByb3h5LlByb3h5TGF1bmNoVG9vbGJhckRlbGVnYXRlQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVBY3Rpb24ucHJveHlMYXVuY2giCi0gICAgICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQWN0aW9uU2V0L3Byb3h5TGF1bmNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJUFjdGlvbi5wcm94eUxhdW5jaFRpcCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWN0aW9uLnNlbGVjdERlZmF1bHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5LlNlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkucnVuLyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnVpLnByb3h5LlNlbGVjdERlZmF1bHRNZW51RGVsZWdhdGVBY3Rpb24iPgotICAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBY3Rpb24ucHJveHlMYXVuY2giCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvcnVuX2V4Yy5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlQWN0aW9uLnByb3h5TGF1bmNoVGlwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5wcm94eS5Qcm94eUxhdW5jaE1lbnVEZWxlZ2F0ZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS5ydW4vIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS51aS5wcm94eS5Qcm94eUxhdW5jaE1lbnVEZWxlZ2F0ZUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnVpLnNlbGVjdC5kZWZhdWx0Lm9iamVjdGNvbnRpYnV0aW9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWN0aW9uLnNlbGVjdERlZmF1bHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5LlNlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS51aS5zZWxlY3Qub2JqZWN0LmFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwZXJzaXN0ZW50UHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnByb3h5LnByb3h5TGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBuYW1lPSIlQmVhbmluZm9QYXRoX1RpdGxlX1VJXyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8udWkuQmVhbmluZm9zUHJvcGVydHlQYWdlIgotICAgICAgICAgICAgaWQ9IkJlYW5pbmZvUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIKLSAgICAgICAgICAgIG5hbWU9IiVCZWFuaW5mb1BhdGhfVGl0bGVfVUlfIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aS5CZWFuaW5mb3NQcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBpZD0iQmVhbmluZm9Qcm9wZXJ0aWVzUGFnZSI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iJUVkaXRvcnMuT3ZlcnJpZGVFZGl0b3IiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJvdmVycmlkZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvZmlsZV9vYmouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMvb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzL29yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLk92ZXJyaWRlRWRpdG9yIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL2NvcmUvSkVNVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9jb3JlL0pFTVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZmNjYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL2NvcmUvSkVNVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEpFTVVJUGx1Z2luLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkuY29yZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5FY2xpcHNlTG9nZ2VyOwotCi0gCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKRU1VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgSkVNVUlQbHVnaW4gUExVR0lOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0JFQU5JTkZPX1VJID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby51aSI7CS8vIEtleSBmb3IgZGlhbG9nIHNldHRpbmdzLgkgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEpFTVVJUGx1Z2luKCkgewotCQlQTFVHSU4gPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBKRU1VSVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBQTFVHSU47Ci0JfQotCQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKQotCQkJbG9nZ2VyID0gRWNsaXBzZUxvZ2dlci5nZXRFY2xpcHNlTG9nZ2VyKHRoaXMpOwotCQlyZXR1cm4gbG9nZ2VyOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9Qcm94eUxhdW5jaE1lbnVEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1Byb3h5TGF1bmNoTWVudURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNmFmOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1Byb3h5TGF1bmNoTWVudURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQcm94eUxhdW5jaE1lbnVEZWxlZ2F0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5PcGVuTGF1bmNoRGlhbG9nQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVByb3h5Q29uc3RhbnRzOwotIAotLyoqCi0gKiBNZW51IGRlbGVnYXRlIHRvIGxhdW5jaCB0aGUgUHJveHkgTGF1bmNoIE1hbmFnZXIuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3h5TGF1bmNoTWVudURlbGVnYXRlIGV4dGVuZHMgT3BlbkxhdW5jaERpYWxvZ0FjdGlvbiB7Ci0JCi0JcHVibGljIFByb3h5TGF1bmNoTWVudURlbGVnYXRlKCkgewotCQlzdXBlcihJUHJveHlDb25zdGFudHMuSURfUFJPWFlfTEFVTkNIX0dST1VQKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9Qcm94eUxhdW5jaFRvb2xiYXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1Byb3h5TGF1bmNoVG9vbGJhckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmM3MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1Byb3h5TGF1bmNoVG9vbGJhckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUHJveHlMYXVuY2hUb29sYmFyRGVsZWdhdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5wcm94eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLmNvcmUuSkVNVUlQbHVnaW47Ci0gCi0vKioKLSAqIFRoZSB0b29sYmFyIGRlbGVnYXRlIGZvciBwcm94eSBsYXVuY2guCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3h5TGF1bmNoVG9vbGJhckRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyIHsKLQotCXByaXZhdGUgTWVudSBtZW51OwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlMiNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnUpCi0JICovCi0JcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotCQlzZXRNZW51KG5ldyBNZW51KHBhcmVudCkpOwotCQlmaWxsTWVudShtZW51KTsKLQkJcmV0dXJuIG1lbnU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgewotCQlpZiAodGhpcy5tZW51ICE9IG51bGwpIHsKLQkJCXRoaXMubWVudS5kaXNwb3NlKCk7Ci0JCX0KLQkJdGhpcy5tZW51ID0gbWVudTsKLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotCSAqLwotCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLQkJc2V0TWVudShuZXcgTWVudShwYXJlbnQpKTsKLQkJZmlsbE1lbnUobWVudSk7Ci0JCXJldHVybiBtZW51OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7Ci0JCWFkZFRvTWVudShtZW51LCBwcm94eUxhdW5jaERlbGVnYXRlLCAtMSk7CQotCQlhZGRUb01lbnUobWVudSwgc2VsZWN0RGVsZWdhdGUsIC0xKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gYWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbWVudSB3aXRoIGFuIGFjY2VsZXJhdG9yIHNwZWNpZmllZAotCSAqIGJ5IHRoZSBnaXZlbiBudW1iZXIuCi0JICogCi0JICogQHBhcmFtIG1lbnUgdGhlIG1lbnUgdG8gYWRkIHRoZSBhY3Rpb24gdG8KLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYWRkCi0JICogQHBhcmFtIGFjY2VsZXJhdG9yIHRoZSBudW1iZXIgdGhhdCBzaG91bGQgYXBwZWFyIGFzIGFuIGFjY2VsZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KE1lbnUgbWVudSwgSUFjdGlvbiBhY3Rpb24sIGludCBhY2NlbGVyYXRvcikgewotCQlTdHJpbmdCdWZmZXIgbGFiZWw9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGFjY2VsZXJhdG9yID49IDAgJiYgYWNjZWxlcmF0b3IgPCAxMCkgewotCQkJLy9hZGQgdGhlIG51bWVyaWNhbCBhY2NlbGVyYXRvcgotCQkJbGFiZWwuYXBwZW5kKCcmJyk7Ci0JCQlsYWJlbC5hcHBlbmQoYWNjZWxlcmF0b3IpOwotCQkJbGFiZWwuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJbGFiZWwuYXBwZW5kKGFjdGlvbi5nZXRUZXh0KCkpOwotCQlhY3Rpb24uc2V0VGV4dChsYWJlbC50b1N0cmluZygpKTsKLQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCQlpdGVtLmZpbGwobWVudSwgLTEpOwotCX0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc2V0TWVudShudWxsKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc2VsZWN0RGVsZWdhdGUuaW5pdCh3aW5kb3cpOwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3REZWZhdWx0Q29uZmlndXJhdGlvbkFjdGlvbkRlbGVnYXRlIHNlbGVjdERlbGVnYXRlID0gbmV3IFNlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUoKTsKLQlwcm90ZWN0ZWQgUHJveHlMYXVuY2hNZW51RGVsZWdhdGUgcHJveHlMYXVuY2hEZWxlZ2F0ZSA9IG5ldyBQcm94eUxhdW5jaE1lbnVEZWxlZ2F0ZSgpOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3REZWxlZ2F0ZS5pc0VuYWJsZWQoKSkKLQkJCXNlbGVjdERlbGVnYXRlLnJ1bihhY3Rpb24pOwotCQllbHNlCi0JCQlwcm94eUxhdW5jaERlbGVnYXRlLnJ1bihhY3Rpb24pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdERlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQobnVsbCwgc2VsZWN0aW9uKTsKLQkJaWYgKHNlbGVjdERlbGVnYXRlLmlzRW5hYmxlZCgpKQotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KHNlbGVjdERlbGVnYXRlLmdldFRvb2xUaXBUZXh0KCkpOwotCQllbHNlCi0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoSkVNVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksICIlQWN0aW9uLnByb3h5TGF1bmNoVGlwIikpOyAvLyROT04tTkxTLTEkCi0JCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9Qcm94eVVJTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9Qcm94eVVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlZDgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvUHJveHlVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFByb3h5VUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5Lm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByb3h5VUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0X3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdF9tZXNzYWdlOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHJveHlVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1NlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9TZWxlY3REZWZhdWx0Q29uZmlndXJhdGlvbkFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNDk4ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L1NlbGVjdERlZmF1bHRDb25maWd1cmF0aW9uQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBTZWxlY3REZWZhdWx0Q29uZmlndXJhdGlvbkFjdGlvbkRlbGVnYXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHk7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ2hlY2tlZFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51aS5jb3JlLkpFTVVJUGx1Z2luOwotIAotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RGVmYXVsdENvbmZpZ3VyYXRpb25BY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSwgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQkKLQotCS8qKgotCSAqIEhlbHBlciB0byBnZXQgc2luZ2xlIHNlbGVjdGVkIGphdmEgcHJvamVjdCBvdXQgb2Ygc2VsZWN0aW9uLgotCSAqIFVzZWQgYnkgUHJveHlMYXVuY2hUb29sYmFyRGVsZWdhdGUgdG9vLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0U2VsZWN0ZWRKYXZhUHJvamVjdChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB8fCAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnNpemUoKSA+IDEpCi0JCQlyZXR1cm4gbnVsbDsJLy8gQ2FuJ3QgaGFuZGxlIGl0LgotCQllbHNlIHsKLQkJCU9iamVjdCBzZWwgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICgoSVByb2plY3QpIHNlbCkuaXNPcGVuKCkpIHsKLQkJCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKChJUHJvamVjdCkgc2VsKTsJLy8gV2lsbCByZXR1cm4gbnVsbCBpZiBub3QgZXhpc3QuCi0JCQl9IGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCAmJiAoKElKYXZhUHJvamVjdCkgc2VsKS5pc09wZW4oKSkKLQkJCQlyZXR1cm4gKElKYXZhUHJvamVjdCkgc2VsOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTZWxlY3REZWZhdWx0Q29uZmlndXJhdGlvbkFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcihQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKSwgIiVBY3Rpb24uc2VsZWN0RGVmYXVsdCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXNlbGVjdERpYWxvZygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9CQotCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBqYXZhcHJvamVjdDsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWphdmFwcm9qZWN0ID0gZ2V0U2VsZWN0ZWRKYXZhUHJvamVjdChzZWxlY3Rpb24pOwotCQl0cnkgewotCQkJc2V0RW5hYmxlZCgKLQkJCQlqYXZhcHJvamVjdCAhPSBudWxsCi0JCQkJCSYmIGphdmFwcm9qZWN0LmdldFByb2plY3QoKS5nZXRQZXJzaXN0ZW50UHJvcGVydHkoUHJveHlQbHVnaW4uUFJPUEVSVFlfTEFVTkNIX0NPTkZJR1VSQVRJT04pICE9IG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7CS8vIFNvbWUgZXJyb3IsIHNvIG5vdCBlbmFibGVkLgotCQl9Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkJCQkKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQkJaWYgKGphdmFwcm9qZWN0ICE9IG51bGwpCi0JCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlRm9ybWF0LmZvcm1hdChQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhKRU1VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKSwgIiVBY3Rpb24uc2VsZWN0RGVmYXVsdFRpcCIpLCBuZXcgT2JqZWN0W10ge2phdmFwcm9qZWN0LmdldEVsZW1lbnROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFkgPSBuZXcgT2JqZWN0WzBdOwotCXByb3RlY3RlZCB2b2lkIHNlbGVjdERpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBEZWJ1Z1VJVG9vbHMubmV3RGVidWdNb2RlbFByZXNlbnRhdGlvbigpOwotCQkJCi0JCQlDaGVja2VkVHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgQ2hlY2tlZFRyZWVTZWxlY3Rpb25EaWFsb2cod2luZG93LmdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIsIG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIEVNUFRZOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlpZiAoaW5wdXRFbGVtZW50ICE9IG51bGwgJiYgaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pCi0JCQkJCQlyZXR1cm4gKE9iamVjdFtdKSBpbnB1dEVsZW1lbnQ7Ci0JCQkJCWVsc2UgCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCX0KLQkJCX0pIHsKLQkJCQlwcm90ZWN0ZWQgQ2hlY2tib3hUcmVlVmlld2VyIGNyZWF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQlmaW5hbCBDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IHN1cGVyLmNyZWF0ZVRyZWVWaWV3ZXIocGFyZW50KTsKLQkJCQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQkJCQlib29sZWFuIHByb2Nlc3NpbmdDaGVjayA9IGZhbHNlOwotCQkJCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCWlmICghcHJvY2Vzc2luZ0NoZWNrKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlwcm9jZXNzaW5nQ2hlY2sgPSB0cnVlOwotCQkJCQkJCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCQkJCQkJCS8vIFdlIGFyZSBjaGVja2luZyBzb21ldGhpbmcsIG1ha2Ugc3VyZSBvbGQgb25lIHVuY2hlY2tlZC4KLQkJCQkJCQkJCQlPYmplY3RbXSBjaGVja2VkID0gdHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQkJaWYgKGNoZWNrZWRbaV0gIT0gZXZlbnQuZ2V0RWxlbWVudCgpKQotCQkJCQkJCQkJCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGNoZWNrZWRbaV0sIGZhbHNlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQlwcm9jZXNzaW5nQ2hlY2sgPSBmYWxzZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JCQkJfQotCQkJCQotCQkJCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU2VsZWN0aW9uQnV0dG9ucyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQkJCXJldHVybiBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwkvLyBXZSBkb24ndCB3YW50IHNlbGVjdGlvbiBidXR0b25zIHNpbmNlIG9ubHkgb25lIGNhbiBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCi0JCQkJfQotCQkJfTsKLQkJCWRpYWxvZy5zZXRUaXRsZShQcm94eVVJTWVzc2FnZXMuU2VsZWN0X3RpdGxlKTsgCi0JCQlkaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVVJTWVzc2FnZXMuU2VsZWN0X21lc3NhZ2UsIG5ldyBPYmplY3RbXSB7IGphdmFwcm9qZWN0LmdldEVsZW1lbnROYW1lKCl9KSk7IAotCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlMaXN0IGNvbmZpZ3NMaXN0ID0gbmV3IEFycmF5TGlzdChjb25maWdzLmxlbmd0aCsxKTsKLQkJCVN0cmluZyBqcE5hbWUgPSBqYXZhcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKElQcm94eUNvbnN0YW50cy5JRF9QUk9YWV9MQVVOQ0hfR1JPVVAuZXF1YWxzKGNvbmZpZ3NbaV0uZ2V0Q2F0ZWdvcnkoKSkgJiYgIWNvbmZpZ3NbaV0uZ2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfUFJJVkFURSwgZmFsc2UpICYmIGpwTmFtZS5lcXVhbHMoY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPSkVDVF9OQU1FLCAiIikpKSAvLyROT04tTkxTLTEkCi0JCQkJCWNvbmZpZ3NMaXN0LmFkZChjb25maWdzW2ldKTsKLQkJCX0KLQkJCWNvbmZpZ3MgPSAoSUxhdW5jaENvbmZpZ3VyYXRpb25bXSkgY29uZmlnc0xpc3QudG9BcnJheShuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25bY29uZmlnc0xpc3Quc2l6ZSgpXSk7Ci0JCQlkaWFsb2cuc2V0SW5wdXQoY29uZmlncyk7Ci0KLQkJCVN0cmluZyBsYXVuY2hOYW1lID0gamF2YXByb2plY3QuZ2V0UHJvamVjdCgpLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShQcm94eVBsdWdpbi5QUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTik7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQkJaWYgKGxhdW5jaE5hbWUgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoY29uZmlnc1tpXS5nZXROYW1lKCkuZXF1YWxzKGxhdW5jaE5hbWUpKSB7Ci0JCQkJCQljb25maWcgPSBjb25maWdzW2ldOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9ucyhuZXcgT2JqZWN0W10geyBjb25maWcgfSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJY29uZmlnID0gKElMYXVuY2hDb25maWd1cmF0aW9uKSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCQlpZiAoY29uZmlnICE9IG51bGwpCi0JCQkJCWphdmFwcm9qZWN0LmdldFByb2plY3QoKS5zZXRQZXJzaXN0ZW50UHJvcGVydHkoUHJveHlQbHVnaW4uUFJPUEVSVFlfTEFVTkNIX0NPTkZJR1VSQVRJT04sIGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCWVsc2UKLQkJCQkJamF2YXByb2plY3QuZ2V0UHJvamVjdCgpLnNldFBlcnNpc3RlbnRQcm9wZXJ0eShQcm94eVBsdWdpbi5QUk9QRVJUWV9MQVVOQ0hfQ09ORklHVVJBVElPTiwgUHJveHlMYXVuY2hTdXBwb3J0Lk5PVF9TRVQpOwotCQkJfSAKLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW5kb3cuZ2V0U2hlbGwoKSwgbnVsbCwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCX0JCQkJCQotCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gVGhpcyBpcyBjYWxsZWQgaW5zdGVhZCBvZiBpbml0KFdvcmtiZW5jaFdpbmRvdykgd2hlbiB0aGlzIGlzIG9uIHBvcHVwIG1lbnUuCi0JCXdpbmRvdyA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MjhlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvQXR0aWMvbWVzc2FnZXMucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDc6MTIgJAotIwotCi1TZWxlY3RfdGl0bGU9U2VsZWN0IERlZmF1bHQKLVNlbGVjdF9tZXNzYWdlPVNlbGVjdCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHByb2plY3QgInswfSI6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL0xvY2FsTGF1bmNoUHJvamVjdFRhYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L3JlbW90ZS9Mb2NhbExhdW5jaFByb2plY3RUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4NDZhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL0xvY2FsTGF1bmNoUHJvamVjdFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IExvY2FsTGF1bmNoUHJvamVjdFRhYi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5LnJlbW90ZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5KYXZhTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotIAotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxMYXVuY2hQcm9qZWN0VGFiIGV4dGVuZHMgSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCQkKLQkvLyBQcm9qZWN0IFVJIHdpZGdldHMKLQlwcm90ZWN0ZWQgTGFiZWwgZlByb2pMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBmUHJvalRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUHJvakJ1dHRvbjsKLQkJCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldENvbnRyb2woY29tcCk7Ci0JCUdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcC5zZXRMYXlvdXQodG9wTGF5b3V0KTsJCQotCQlHcmlkRGF0YSBnZDsKLQkJCi0JCWNyZWF0ZVZlcnRpY2FsU3BhY2VyKGNvbXAsIDEpOwotCQkKLQkJQ29tcG9zaXRlIHByb2pDb21wID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgcHJvakxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXByb2pMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXByb2pMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcHJvakxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXByb2pDb21wLnNldExheW91dChwcm9qTGF5b3V0KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcHJvakNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXByb2pDb21wLnNldEZvbnQoZm9udCk7Ci0JCQotCQlmUHJvakxhYmVsID0gbmV3IExhYmVsKHByb2pDb21wLCBTV1QuTk9ORSk7Ci0JCWZQcm9qTGFiZWwuc2V0VGV4dChQcm94eVJlbW90ZVVJTWVzc2FnZXMuTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3QpOyAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmUHJvakxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlmUHJvakxhYmVsLnNldEZvbnQoZm9udCk7Ci0JCQotCQlmUHJvalRleHQgPSBuZXcgVGV4dChwcm9qQ29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlmUHJvalRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZQcm9qVGV4dC5zZXRGb250KGZvbnQpOwotCQlmUHJvalRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIHsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZlByb2pCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKHByb2pDb21wLCBQcm94eVJlbW90ZVVJTWVzc2FnZXMuTG9jYWxMYXVuY2hQcm9qZWN0VGFiX0Jyb3dzZSwgbnVsbCk7IAotCQlmUHJvakJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQkJCWhhbmRsZVByb2plY3RCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQkJCQkKLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXVwZGF0ZVByb2plY3RGcm9tQ29uZmlnKGNvbmZpZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2plY3RGcm9tQ29uZmlnKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcHJvamVjdE5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgIiIpOwkgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2coY2UpOwotCQl9Ci0JCWZQcm9qVGV4dC5zZXRUZXh0KHByb2plY3ROYW1lKTsKLQl9Ci0JCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3BlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotCQljb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgZlByb2pUZXh0LmdldFRleHQoKSk7CQkKLQl9Ci0JCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCQkJCi0JCQotCS8qKgotCSAqIFNob3cgYSBkaWFsb2cgdGhhdCBsZXRzIHRoZSB1c2VyIHNlbGVjdCBhIHByb2plY3QuICBUaGlzIGluIHR1cm4gcHJvdmlkZXMKLQkgKiBjb250ZXh0IGZvciB0aGUgbWFpbiB0eXBlLCBhbGxvd2luZyB0aGUgdXNlciB0byBrZXkgYSBtYWluIHR5cGUgbmFtZSwgb3IKLQkgKiBjb25zdHJhaW5pbmcgdGhlIHNlYXJjaCBmb3IgbWFpbiB0eXBlcyB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvamVjdEJ1dHRvblNlbGVjdGVkKCkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGNob29zZUphdmFQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpOwotCQlmUHJvalRleHQuc2V0VGV4dChwcm9qZWN0TmFtZSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmVhbGl6ZSBhIEphdmEgUHJvamVjdCBzZWxlY3Rpb24gZGlhbG9nIGFuZCByZXR1cm4gdGhlIGZpcnN0IHNlbGVjdGVkIHByb2plY3QsCi0JICogb3IgbnVsbCBpZiB0aGVyZSB3YXMgbm9uZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGNob29zZUphdmFQcm9qZWN0KCkgewotCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0czsKLQkJdHJ5IHsKLQkJCXByb2plY3RzPSBKYXZhQ29yZS5jcmVhdGUoZ2V0V29ya3NwYWNlUm9vdCgpKS5nZXRKYXZhUHJvamVjdHMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCVByb3h5UGx1Z2luLmdldFBsdWdpbigpLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCXByb2plY3RzPSBuZXcgSUphdmFQcm9qZWN0WzBdOwotCQl9Ci0JCQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyPSBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX0RFRkFVTFQpOwotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2c9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBsYWJlbFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldFRpdGxlKFByb3h5UmVtb3RlVUlNZXNzYWdlcy5Mb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdF9TZWxlY3Rpb24pOyAKLQkJZGlhbG9nLnNldE1lc3NhZ2UoUHJveHlSZW1vdGVVSU1lc3NhZ2VzLkxvY2FsTGF1bmNoUHJvamVjdFRhYl9DaG9vc2VQcm9qZWN0KTsgCi0JCWRpYWxvZy5zZXRFbGVtZW50cyhwcm9qZWN0cyk7Ci0JCQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKG5ldyBPYmplY3RbXSB7IGphdmFQcm9qZWN0IH0pOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewkJCQotCQkJcmV0dXJuIChJSmF2YVByb2plY3QpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQl9CQkJCi0JCXJldHVybiBudWxsOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSUphdmFQcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb2plY3QgbmFtZSBpbiB0aGUgcHJvamVjdCBuYW1lCi0JICogdGV4dCBmaWVsZCwgb3IgbnVsbCBpZiB0aGUgdGV4dCBkb2VzIG5vdCBtYXRjaCBhIHByb2plY3QgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBmUHJvalRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKHByb2plY3ROYW1lLmxlbmd0aCgpIDwgMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsJCQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQkgKi8KLQlwcml2YXRlIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGFjY2VzcyB0byB0aGUgamF2YSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKGdldFdvcmtzcGFjZVJvb3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IGZQcm9qVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5QUk9KRUNUKTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdD0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5hbWUpOwotCQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVVSU1lc3NhZ2VzLkxvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0Tm90RXhpc3RfRVJST1JfLCBuZXcgU3RyaW5nW10ge25hbWV9KSk7IAotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoUHJveHlSZW1vdGVVSU1lc3NhZ2VzLkxvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0Tm90T3Blbl9FUlJPUl8sIG5ldyBTdHJpbmdbXSB7bmFtZX0pKTsgCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChQcm94eVJlbW90ZVVJTWVzc2FnZXMuTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3RWYWxpZGF0ZUVycm9yX0VSUk9SXywgbmV3IFN0cmluZ1tde3N0YXR1cy5nZXRNZXNzYWdlKCl9KSk7IAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwkvLyBLbHVkZ2UuIFdlIGFsd2F5cyByZXR1cm4gZmFsc2Ugc28gdGhhdCAiUnVuIiBidXR0b24gaXMgbmV2ZXIgZW5hYmxlZC4gV2UgY2FuJ3QgbGF1bmNoIHRoZXNlIGNvbmZpZ3VyYXRpb25zIHVzaW5nIHRoZSBzdGFuZGFyZCB3YXkuIE9ubHkgdGhyb3VnaCBQcm94eUxhdW5jaFN1cHBvcnQuCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0JCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IGdldENvbnRleHQoKTsKLQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLQkJCWluaXRpYWxpemVKYXZhUHJvamVjdChqYXZhRWxlbWVudCwgY29uZmlnKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFdlIHNldCBlbXB0eSBhdHRyaWJ1dGVzIGZvciBwcm9qZWN0IHNvIHRoYXQgd2hlbiBvbmUgY29uZmlnIGlzCi0JCQkvLyBjb21wYXJlZCB0byBhbm90aGVyLCB0aGUgZXhpc3RlbmNlIG9mIGVtcHR5IGF0dHJpYnV0ZXMgZG9lc24ndCBjYXVzZSBhbgotCQkJLy8gaW5jb3JyZWN0IHJlc3VsdCAodGhlIHBlcmZvcm1BcHBseSgpIG1ldGhvZCBjYW4gcmVzdWx0IGluIGVtcHR5IHZhbHVlcwotCQkJLy8gZm9yIHRoZXNlIGF0dHJpYnV0ZXMgYmVpbmcgc2V0IG9uIGEgY29uZmlnIGlmIHRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlCi0JCQkvLyBjb3JyZXNwb25kaW5nIHRleHQgYm94ZXMpCi0JCQljb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIFByb3h5UmVtb3RlVUlNZXNzYWdlcy5Mb2NhbExhdW5jaFByb2plY3RUYWJfbmFtZTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L3JlbW90ZS9Mb2NhbExhdW5jaFRhYkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL0xvY2FsTGF1bmNoVGFiR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2MmYyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL0xvY2FsTGF1bmNoVGFiR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAkUkNTZmlsZTogTG9jYWxMYXVuY2hUYWJHcm91cC5qYXZhLHYgJCAkUmV2aXNpb246IDEuNSAkICREYXRlOiAyMDA1LzA4LzI0IDIxOjA3OjEyICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5zb3VyY2Vsb29rdXAuU291cmNlTG9va3VwVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy4qOwotCi0vKioKLSAqIExhdW5jaCBUYWIgR3JvdXAgZm9yIHRoZSBMb2NhbCBMYXVuY2ggb2YgYSBSZW1vdGUgUHJveHkgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbExhdW5jaFRhYkdyb3VwIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAgewotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBKYXZhIGFwcGxldCB0YWIgZ3JvdXAuCi0JICovCi0JcHVibGljIExvY2FsTGF1bmNoVGFiR3JvdXAoKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAjY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkgewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPQotCQkJbmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gewotCQkJCW5ldyBMb2NhbExhdW5jaFByb2plY3RUYWIoKSwKLQkJCQluZXcgSmF2YUFyZ3VtZW50c1RhYigpLAotCQkJCW5ldyBKYXZhSlJFVGFiKCksCi0JCQkJbmV3IEphdmFDbGFzc3BhdGhUYWIoKSwKLQkJCQluZXcgU291cmNlTG9va3VwVGFiKCksCS8vIFRPRE8gTmVlZCB0byBzZWUgd2h5IFNvdXJjZUxvb2t1cFRhYiBkaWRuJ3Qgd29yay4gVW50aWwgdGhlbiB1c2UgdGhpcy4KLQkJCQluZXcgRW52aXJvbm1lbnRUYWIoKSwKLQkJCQluZXcgQ29tbW9uVGFiKCl9OwotCQlzZXRUYWJzKHRhYnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L3JlbW90ZS9Qcm94eVJlbW90ZVVJTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9yZW1vdGUvUHJveHlSZW1vdGVVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjEyNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L3JlbW90ZS9Qcm94eVJlbW90ZVVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudWkucHJveHkucmVtb3RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFByb3h5UmVtb3RlVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnVpLnByb3h5LnJlbW90ZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcm94eVJlbW90ZVVJTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsTGF1bmNoUHJvamVjdFRhYl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsTGF1bmNoUHJvamVjdFRhYl9Ccm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3RfU2VsZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsTGF1bmNoUHJvamVjdFRhYl9DaG9vc2VQcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0Tm90RXhpc3RfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsTGF1bmNoUHJvamVjdFRhYl9Qcm9qZWN0Tm90T3Blbl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3RWYWxpZGF0ZUVycm9yX0VSUk9SXzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3h5UmVtb3RlVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9yZW1vdGUvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnVpL3VpL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91aS9wcm94eS9yZW1vdGUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjYTAxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51aS91aS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdWkvcHJveHkvcmVtb3RlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udWkvdWkvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3VpL3Byb3h5L3JlbW90ZS9BdHRpYy9tZXNzYWdlcy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMTowNzoxMiAkCi0jCi0KLUxvY2FsTGF1bmNoUHJvamVjdFRhYl9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgPSAmUHJvamVjdAotTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3QgICAgICAgICAgICAgICAgICAgICA9ICZQcm9qZWN0Ci1Mb2NhbExhdW5jaFByb2plY3RUYWJfQnJvd3NlICAgICAgICAgICAgICAgICAgICAgID0gJkJyb3dzZS4uLgotTG9jYWxMYXVuY2hQcm9qZWN0VGFiX1Byb2plY3RfU2VsZWN0aW9uICAgICAgICAgICA9IFByb2plY3QgU2VsZWN0aW9uCi1Mb2NhbExhdW5jaFByb2plY3RUYWJfQ2hvb3NlUHJvamVjdCAgICAgICAgICAgICAgID0gQ2hvb3NlIGEgJnByb2plY3QgdG8gZm9yIHRoZSBsYXVuY2g6Ci1Mb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdE5vdEV4aXN0X0VSUk9SXyAgICAgID0gSVdBVjAxNzRFIFByb2plY3QgInswfSIgZG9lc24nJ3QgZXhpc3QuCi1Mb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdE5vdE9wZW5fRVJST1JfICAgICAgID0gSVdBVjAxNzVFIFByb2plY3QgInswfSIgaXMgbm90IG9wZW4uCi1Mb2NhbExhdW5jaFByb2plY3RUYWJfUHJvamVjdFZhbGlkYXRlRXJyb3JfRVJST1JfID0gSVdBVjAxNzZFIFByb2plY3QgdmFsaWRhdGlvbiBlcnJvci4gTXNnIGlzICJ7MH0uIgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MmRhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id29ya2JlbmNoLyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ2M2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTg2MmJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamVtPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZW0ucHJveHk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDYzODJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotI1RodSBKdW4gMTYgMTM6MjM6MzIgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmZjYyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI1dlZCBNYXkgMTEgMTY6MjA6MTUgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhODZkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHdvcmtiZW5jaC5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLG9yZy5lY2xpcHNlLmplbS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbAotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzMzYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLndvcmtiZW5jaC5qYXIgPSB3b3JrYmVuY2gvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHdvcmtiZW5jaC5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTMyMjM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjEzOjUzICQKLSMKLQotCi1wbHVnaW5OYW1lPUphdmEgRU1GIE1vZGVsIFdvcmtiZW5jaCBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCi1KYXZhRU1GTmF0dXJlTmFtZT1KYXZhRU1GTmF0dXJlIFByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDg5MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iSmF2YUVNRk5hdHVyZSIKLSAgICAgICAgIG5hbWU9IiVKYXZhRU1GTmF0dXJlTmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIj4KLSAgICAgIDxydW50aW1lPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZSI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvcnVudGltZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwubmF0dXJlX3JlZ2lzdHJhdGlvbiI+Ci0gICAgICA8bmF0dXJlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlIj4KLSAgICAgIDwvbmF0dXJlPgotICAgPC9leHRlbnNpb24+ICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODM1NjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLSAqICAkUkNTZmlsZTogSkRPTUFkYXB0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDoyNyAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmRmFjdG9yeUltcGw7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi82LzIwMDAgNDo0Mjo1MCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpET01BZGFwdG9yIGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgSkFWQV9QQUNLID0gSmF2YVJlZkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKTsKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IHNvdXJjZVByb2plY3Q7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgSU5WQUxJRF9MSU5FTk8gPSAtMTsKLQlmaW5hbCBwcm90ZWN0ZWQgSW50ZWdlciBmTElORU5PTG9jayA9IG5ldyBJbnRlZ2VyKElOVkFMSURfTElORU5PKTsKLQkvLyBUaGlzIG9iamVjdCBpcyBub3Qgc3RhdGljLCBhcyBpdCBpcyB1c2VkIGFzIHN5bmNocm9uaXphdGlvbiBlbGVtZW50LgotCXByaXZhdGUgaW50IGZSZXNvbHZlZExpbmVObyA9IElOVkFMSURfTElORU5POyAvLyBMaW5lIG9mZnNldCBpbiBzb3VyY2UgZmlsZQotCXByaXZhdGUgaW50IGZSZXNvbHZlZENvbE5vID0gSU5WQUxJRF9MSU5FTk87IC8vIENvbHVtbiBvZmZzZXQgaW4gc291cmNlIGZpbGUKLQlwdWJsaWMgSkRPTUFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBJSmF2YVByb2plY3Qgd29ya2luZ1Byb2plY3QpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJc2V0U291cmNlUHJvamVjdCh3b3JraW5nUHJvamVjdCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNsZWFyU291cmNlKCkgewotCQkvLyBUbyBiZSBvdmVyaWRkZW4gaWYgbmVlZGVkLgotCX0KLQkvKioKLQkgKiBTY2FuIGZvciBDUnMgYW5kIExGcyB3aXRoaW4gYSBjaGFyYWN0ZXIgYnVmZmVyCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAyOjE0OjEzIFBNKQotCSAqIEByZXR1cm4gaW50ICBMaW5lTm8gYXQgY2hhck9mZnNldAotCSAqIEBwYXJhbSBjaGFyT2Zmc2V0IGludAotCSAqIEBwYXJhbSBidWZmZXIgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wdXRlTGluZU9mZnNldChpbnQgY2hhck9mZnNldCwgSUJ1ZmZlciBidWZmZXIpIHsKLQotCQlmUmVzb2x2ZWRDb2xObyA9IGZSZXNvbHZlZExpbmVObyA9IElOVkFMSURfTElORU5POwotCi0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljaGFyW10gY2hhckJ1ZmYgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOwotCi0JCWlmIChjaGFyQnVmZiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBMaW5lQ291bnQgPSAwOwotCQlpbnQgQ29sTm8gPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8PSBjaGFyT2Zmc2V0OyBpKyspIHsKLQkJCUNvbE5vKys7Ci0JCQlpZiAoY2hhckJ1ZmZbaV0gPT0gJ1xyJykgewotCQkJCUxpbmVDb3VudCsrOwotCQkJCUNvbE5vID0gMDsKLQkJCQlpZiAoY2hhckJ1ZmZbaSArIDFdID09ICdcbicpCi0JCQkJCWkrKzsgLy8gc2tpcCBMaW5lRmVlZCBmb2xsb3dlZCAgYSBDUgotCQkJfSBlbHNlIGlmIChjaGFyQnVmZltpXSA9PSAnXG4nKSB7Ci0JCQkJTGluZUNvdW50Kys7Ci0JCQkJQ29sTm8gPSAwOwotCQkJfQotCi0JCX0KLQkJZlJlc29sdmVkQ29sTm8gPSBDb2xObzsKLQkJZlJlc29sdmVkTGluZU5vID0gTGluZUNvdW50OwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kSUQgLSBnZW5lcmF0ZSB0aGUgdW5pcXVlIElEIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogU2ltaWxhciB0byBhIFNpZ25hdHVyZSwgYnV0IGhvcGVmdWxseSBtb3JlIHJlYWRhYmxlLgotCSAqIFRoZSBuYW1lIGZvcm1hdCB3aWxsIGJlOgotCSAqIAlzaW1wbGVUeXBlTmFtZS5tZXRob2ROYW1lKG15LnBhY2thZ2UuUGFybV9UeXBlMSxwYXJtVHlwZTIKLQkgKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIFJlZmxlY3Rpb25BZGFwdGVyLmdldFR5cGVOYW1lc0Zyb21NZXRob2RJRCgpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2RJRChJTWV0aG9kIGpkb21NZXRob2QpIHsKLQkJcmV0dXJuIGNvbXB1dGVNZXRob2RJRChqZG9tTWV0aG9kLCBqZG9tTWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSwgbnVsbCk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCXNpbXBsZVR5cGVOYW1lLm1ldGhvZE5hbWUobXkucGFja2FnZS5QYXJtX1R5cGUxLHBhcm1UeXBlMgotCSAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggUmVmbGVjdGlvbkFkYXB0ZXIuZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKElNZXRob2QgamRvbU1ldGhvZCwgSVR5cGUgdHlwZSwgTWFwIHR5cGVDYWNoZSkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlvdXQuYXBwZW5kKHR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSk7Ci0JCW91dC5hcHBlbmQoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQkJb3V0LmFwcGVuZChqZG9tTWV0aG9kLmdldEVsZW1lbnROYW1lKCkpOwotCQlvdXQuYXBwZW5kKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSKTsKLQkJU3RyaW5nW10gcGFybVR5cGVOYW1lcyA9IGpkb21NZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJU3RyaW5nIHBhcm1OYW1lOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBhcm1OYW1lID0gY29udmVydEpET010eXBlTmFtZShwYXJtVHlwZU5hbWVzW2ldKTsKLQkJCXBhcm1OYW1lID0gSkRPTVNlYXJjaEhlbHBlci5nZXRSZXNvbHZlZFR5cGVOYW1lKHBhcm1OYW1lLCB0eXBlLCB0eXBlQ2FjaGUpOwotCQkJb3V0LmFwcGVuZChwYXJtTmFtZSk7Ci0JCQlpZiAoaSA8IChwYXJtVHlwZU5hbWVzLmxlbmd0aCAtIDEpKQotCQkJCW91dC5hcHBlbmQoQ19QQVJNX1BBUk1fREVMSU1JVEVSKTsKLQkJfQotCQl0cnkgewotCQkJaWYgKGpkb21NZXRob2QuaXNDb25zdHJ1Y3RvcigpKQotCQkJCW91dC5hcHBlbmQoU19DT05TVFJVQ1RPUl9UT0tFTik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kTmFtZSAtIGdlbmVyYXRlIHRoZSBuYW1lIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogRm9yIHRoZSBtb21lbnQsIG5hbWVzIGFyZSBzaW1wbGUsIGFuZCBVVUlEJ3MgYXJlIGNvbXBsZXguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZE5hbWUoSU1ldGhvZCBqZG9tTWV0aG9kKSB7Ci0JCXJldHVybiBqZG9tTWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCS8qKgotCSAqIEphdmEgY29udGVudCBoYXMgY2hhbmdlZCwgYnV0IG5vIHN0cnVjdHVyYWwgY2hhbmdlcyB0aGF0IHJlcXVpcmUKLQkgKiB0byByZWZsZWN0VmFsdWVzKCk7ICBlLmcuLCB0aGUgYm9keSBvZiBhIG1ldGhvZCBoYXMgY2hhbmdlZC4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDEwOjQ3OjU4IEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRlbnRDaGFuZ2VkKCkgewotCQlzeW5jaHJvbml6ZWQgKGZMSU5FTk9Mb2NrKSB7Ci0JCQlmUmVzb2x2ZWRMaW5lTm8gPSBJTlZBTElEX0xJTkVOTzsKLQkJCWZSZXNvbHZlZENvbE5vID0gSU5WQUxJRF9MSU5FTk87Ci0JCX0KLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZElEIC0gZ2VuZXJhdGUgdGhlIHVuaXF1ZSBJRCB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBUaGUgbmFtZSBmb3JtYXQgd2lsbCBiZToKLQkgKiAJbWV0aG9kTmFtZV9wYXJtVHlwZTFfcGFybVR5cGUyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEpET010eXBlTmFtZShTdHJpbmcgamRvbVR5cGVOYW1lKSB7Ci0JCXJldHVybiBzaWduYXR1cmVUb1N0cmluZyhqZG9tVHlwZU5hbWUpOwotCX0KLQkvKioKLQkgKiBjcmVhdGVKYXZhRmllbGQgLSBpbnN0YW50aWF0ZSBhIEphdmEgRmllbGQgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIE1vZGVsIElGaWVsZAotCSAqIFdlIGFyZSBkZWZlcnJpbmcgZmllbGQgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICovCi0JcHVibGljIEZpZWxkIGNyZWF0ZUphdmFGaWVsZChJRmllbGQgamRvbUZpZWxkLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlTdHJpbmcgbmFtZSA9IGpkb21GaWVsZC5nZXRFbGVtZW50TmFtZSgpOwotCQlGaWVsZCBuZXdGaWVsZCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLQkJbmV3RmllbGQuc2V0TmFtZShuYW1lKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3RmllbGQsICgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpICsgQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSICsgbmFtZSk7Ci0JCXJldHVybiBuZXdGaWVsZDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YU1ldGhvZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBNZXRob2QgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIE1vZGVsIElNZXRob2QKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIG1ldGhvZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKiBXZSBuZWVkIHRvIHN0b3JlIGVub3VnaCBpbmZvIGluIHRoZSBlbXB0eSBNZXRob2QgdG8gZmluZCBpdHMgSmF2YSBzb3VyY2UuCi0JICogVGhlIFVVSUQgd2lsbCBldmVudHVhbGx5IGhvbGQgZW5vdWdoIGluZm8gdG8gaWRlbnRpZnkgdGhlIHNvdXJjZSwgc28gd2UgdXNlIGl0LgotCSAqLwotCXB1YmxpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZChJTWV0aG9kIGpkb21NZXRob2QsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZCBuZXdNZXRob2QgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotCQkvLyBXZSB1c2UgYSBzaW1wbGUgbmFtZSwgYnV0IGEgY29tcGxleCBJRCAKLQkJbmV3TWV0aG9kLnNldE5hbWUoY29tcHV0ZU1ldGhvZE5hbWUoamRvbU1ldGhvZCkpOwotCQlyZXNvdXJjZS5zZXRJRChuZXdNZXRob2QsIGNvbXB1dGVNZXRob2RJRChqZG9tTWV0aG9kLCBnZXRUeXBlKCksIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSkpOwotCQlyZXR1cm4gbmV3TWV0aG9kOwotCX0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0QmluYXJ5UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBJVHlwZSBnZXRCaW5hcnlUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwpIHsKLQkJCQlJSmF2YUVsZW1lbnQgZm91bmQgPSBnZXRTb3VyY2VQcm9qZWN0KCkuZmluZEVsZW1lbnQoZ2V0QmluYXJ5UGF0aEZyb21RdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUpKTsKLQkJCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIENvbXB1dGUgYSBjb2x1bW4gbnVtYmVyIGZyb20gdGhlIElTb3VyY2VSYW5nZSBvZmZzZXQKLQkgKiBDYWNoZSB0aGUgbGluZSBudW1iZXIgdGhlcmVhZnRlci4gIFNvdXJjZSBjaGFuZ2Ugd2lsbAotCSAqIEludm9rZSB0aGUgY29udGVudENoYW5nZWQoKSBtZXRob2QuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAxMToxNjo1MSBBTSkKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sTm8oKSB7Ci0KLQkJc3luY2hyb25pemVkIChmTElORU5PTG9jaykgewotCQkJaWYgKGZSZXNvbHZlZENvbE5vID09IElOVkFMSURfTElORU5PKQotCQkJCXJlc29sdmVMaW5lQ29sTm8oKTsKLQkJfQotCQlyZXR1cm4gZlJlc29sdmVkQ29sTm87Ci0JfQotCS8qKgotCSAqIENvbXB1dGUgYSBsaW5lIG51bWJlciBmcm9tIHRoZSBJU291cmNlUmFuZ2Ugb2Zmc2V0Ci0JICogQ2FjaGUgdGhlIGxpbmUgbnVtYmVyIHRoZXJlYWZ0ZXIuICBTb3VyY2UgY2hhbmdlIHdpbGwKLQkgKiBJbnZva2UgdGhlIGNvbnRlbnRDaGFuZ2VkKCkgbWV0aG9kLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzE3LzIwMDEgMTE6MTY6NTEgQU0pCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVObygpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMSU5FTk9Mb2NrKSB7Ci0JCQlpZiAoZlJlc29sdmVkTGluZU5vID09IElOVkFMSURfTElORU5PKQotCQkJCXJlc29sdmVMaW5lQ29sTm8oKTsKLQkJfQotCQlyZXR1cm4gZlJlc29sdmVkTGluZU5vOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAxOjE4OjI5IFBNKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpOwotCS8qIAotCSAqIFJlc29sdmUgYSB0eXBlIG5hbWUgaW4gdGhlIGNvbnRleHQgb2YgYSBUeXBlLgotCSAqIChCb3Jyb3dlZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5jb2RlbWFuaXB1bGF0aW9uLlN0dWJVdGlsaXR5LmdldFJlc29sdmVkVHlwZU5hbWUoKSkKLQkgKiBUaGUgaW5wdXQgaXMgYSBzaW1wbGUgb3IgcXVhbGlmaWVkIG5hbWUsIE5PVCBhIHNpZ25hdHVyZQotCSAqIFRoZSBvdXRwdXQgd2lsbCBiZSBhIHF1YWxpZmllZCBuYW1lLCBOT1QgYSBzaWduYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSkgewotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwotCQl0cnkgewotCQkJbmFtZSA9IEpET01TZWFyY2hIZWxwZXIucmVzb2x2ZVNpbXBsZVR5cGVOYW1lKGRlY2xhcmluZ1R5cGUsIHR5cGVOYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0U291cmNlUHJvamVjdCgpIHsKLQkJcmV0dXJuIHNvdXJjZVByb2plY3Q7Ci0JfQotCXByb3RlY3RlZCBhYnN0cmFjdCBJVHlwZSBnZXRUeXBlKCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IE1hcCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlU291cmNlVHlwZSgpIHsKLQkJZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSh0cnVlKTsgLy8gaW5kdWNlIGNsaWVudHMgdG8gZ2V0IE5vdGlmaWVkLgotCX0KLQotCXB1YmxpYyBOb3RpZmljYXRpb24gcmVsZWFzZVNvdXJjZVR5cGVOb05vdGlmaWNhdGlvbigpIHsKLQkJcmV0dXJuIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbih0cnVlKTsgLy8gaW5kdWNlIGNsaWVudHMgdG8gZ2V0IE5vdGlmaWVkLgotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjEvMjAwMSA4OjA5OjM0IEFNKQotCSAqLwotCXByaXZhdGUgdm9pZCByZXNvbHZlTGluZUNvbE5vKCkgewotCi0JCUlNZW1iZXIgcnMgPSAoSU1lbWJlcikgZ2V0UmVmbGVjdGlvblNvdXJjZSgpOwotCQlpZiAocnMgIT0gbnVsbCkgewotCQkJaW50IG9mZnNldCA9IElOVkFMSURfTElORU5POwotCQkJdHJ5IHsKLQkJCQlJU291cmNlUmFuZ2Ugc3IgPSBycy5nZXROYW1lUmFuZ2UoKTsKLQkJCQlpZiAoc3IuZ2V0TGVuZ3RoKCkgPD0gMCkKLQkJCQkJcmV0dXJuOwotCQkJCW9mZnNldCA9IHNyLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGplKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHJzLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlJQnVmZmVyIGJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOwotCQkJCQljb21wdXRlTGluZU9mZnNldChvZmZzZXQsIGJ1ZmZlcik7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGplKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVByb2plY3QoSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXNvdXJjZVByb2plY3QgPSB3b3JraW5nUHJvamVjdDsKLQl9Ci0JLyoqCi0JICogQ29udmVydHMgYSB0eXBlIHNpZ25hdHVyZSB0byBhIHJlYWRhYmxlIHN0cmluZy4KLQkgKgotCSAqIFVzZXMgU2lnbmF0dXJlLnRvU3RyaW5nKCksIHRoZW4gdHJpZXMgdG8gdW5kbyBiYWQgcmVwbGFjZW1lbnQgZm9yIGlubmVyIGNsYXNzZXMuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaWduYXR1cmVUb1N0cmluZyhTdHJpbmcgc2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNEb2xsYXIgPSAoc2lnbmF0dXJlLmluZGV4T2YoU2lnbmF0dXJlLkNfRE9MTEFSKSAhPSAtMSk7Ci0JCVN0cmluZyByZXN1bHQgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnbmF0dXJlKTsKLQkJaWYgKGhhc0RvbGxhcikgewotCQkJaW50IG5ld1BvcyA9IHJlc3VsdC5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobmV3UG9zICE9IC0xKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygwLCBuZXdQb3MpICsgIiQiICsgcmVzdWx0LnN1YnN0cmluZyhuZXdQb3MgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKFN0cmluZyBzaWcpIHsKLQkJcmV0dXJuIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShzaWcsIGdldFR5cGUoKSk7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKFN0cmluZyBzaWcsIElUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gdHlwZU5hbWVGcm9tU2lnbmF0dXJlKHNpZywgcGFyZW50LCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpOwotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlTmFtZUZyb21TaWduYXR1cmUoU3RyaW5nIHNpZywgSVR5cGUgcGFyZW50LCBNYXAgdHlwZUNhY2hlKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0JCVN0cmluZyBjb21wb25lbnRTaWduYXR1cmUgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoc2lnKTsKLQkJaW50IGFycmF5RGltZW5zaW9ucyA9IFNpZ25hdHVyZS5nZXRBcnJheUNvdW50KHNpZyk7Ci0JCXJlc3VsdCA9IEpET01TZWFyY2hIZWxwZXIuZ2V0UmVzb2x2ZWRUeXBlTmFtZShzaWduYXR1cmVUb1N0cmluZyhjb21wb25lbnRTaWduYXR1cmUpLCBwYXJlbnQsIHR5cGVDYWNoZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlEaW1lbnNpb25zOyBpKyspIHsKLQkJCXJlc3VsdCA9IHJlc3VsdCArICJbXSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSkRPTVNlYXJjaEhlbHBlciNmaW5kVHlwZShTdHJpbmcsIGJvb2xlYW4sIElKYXZhUHJvamVjdCwgSkRPTUFkYXB0b3IpCi0JICovCi0JcHVibGljIElUeXBlIGdldFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJcmV0dXJuIEpET01TZWFyY2hIZWxwZXIuZmluZFR5cGUocXVhbGlmaWVkTmFtZSwgZmFsc2UsIGdldFNvdXJjZVByb2plY3QoKSwgdGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQ2xhc3NGaW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUNsYXNzRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmY2OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQ2xhc3NGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotICogICRSQ1NmaWxlOiBKRE9NQ2xhc3NGaW5kZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMTYvMjAwMCAxMTowNjo0NiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEpET01DbGFzc0ZpbmRlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSkRPTUNsYXNzRmluZGVyIGluc3RhbmNlOwotLyoqCi0gKiBKRE9NQ2xhc3NGaW5kZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEpET01DbGFzc0ZpbmRlcigpIHsKLQlzdXBlcigpOwotfQotcHJvdGVjdGVkIElQYXRoIGdldEJpbmFyeVBhdGhGcm9tUXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyIpOy8vJE5PTi1OTFMtMSQKLX0KLXB1YmxpYyBJVHlwZSBnZXRCaW5hcnlUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JdHJ5IHsKLQkJSUphdmFFbGVtZW50IGZvdW5kID0gZ2V0SmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSk7Ci0JCXJldHVybiAoKElDbGFzc0ZpbGUpIGZvdW5kKS5nZXRUeXBlKCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyIsIChuZXcgT2JqZWN0W10ge3F1YWxpZmllZE5hbWUsIGptZS5nZXRNZXNzYWdlKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQl0cnkgewotCQlpZiAoZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0U291cmNlUHJvamVjdCgpLmZpbmRFbGVtZW50KGdldFBhdGhGcm9tUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lKSk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyIsIChuZXcgT2JqZWN0W10ge3F1YWxpZmllZE5hbWUsIGptZS5nZXRNZXNzYWdlKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXByb3RlY3RlZCBJUGF0aCBnZXRQYXRoRnJvbVF1YWxpZmllZE5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQlyZXR1cm4gbmV3IFBhdGgocXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuamF2YSIpOy8vJE5PTi1OTFMtMSQKLX0KLXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0U291cmNlUHJvamVjdCgpIHsKLQkvL3JldHVybiAoSUphdmFQcm9qZWN0KSAoKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpKS5nZXRKYXZhUmVmRmFjdG9yeSgpLmdldEphdmFDb250ZXh0KCk7Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCXRyeSB7Ci0JCUlKYXZhRWxlbWVudCBmb3VuZCA9IGdldEphdmFFbGVtZW50KHF1YWxpZmllZE5hbWUpOwotCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCWlmIChmb3VuZCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQkJCWVsc2UKLQkJCQlpZiAoZm91bmQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJCUlDb21waWxhdGlvblVuaXQgZm91bmRDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBmb3VuZDsKLQkJCQkJLy8gc3RyaXAgdGhlICIuamF2YSIsIGxpZnRlZCBmcm9tIENvbXBpbGF0aW9uVW5pdC5nZXRNYWluVHlwZU5hbWUoKQotCQkJCQlTdHJpbmcgY3VNYWluVHlwZU5hbWUgPSBmb3VuZENVLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJCWN1TWFpblR5cGVOYW1lID0gY3VNYWluVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGN1TWFpblR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQkJCXJldHVybiBmb3VuZENVLmdldFR5cGUoY3VNYWluVHlwZU5hbWUpOwotCQkJCX0KLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9Mb29raW5nX1VwX1R5cGVfRVJST1JfIiwgKG5ldyBPYmplY3RbXSB7cXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNi8yMDAwIDExOjE5OjQ4IFBNKQotICogQHJldHVybiBjb20uaWJtLmV0b29scy5qYXZhLmFkYXB0ZXJzLkpET01DbGFzc0ZpbmRlcgotICovCi1wdWJsaWMgc3RhdGljIEpET01DbGFzc0ZpbmRlciBpbnN0YW5jZSgpIHsKLQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJaW5zdGFuY2UgPSBuZXcgSkRPTUNsYXNzRmluZGVyKCk7Ci0JcmV0dXJuIGluc3RhbmNlOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NU2VhcmNoSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01TZWFyY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4NjFhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01TZWFyY2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLSAqICAkUkNTZmlsZTogSkRPTVNlYXJjaEhlbHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjEzOjUzICQgCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOS8yNi8yMDAxIDExOjA5OjMwIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSkRPTVNlYXJjaEhlbHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVkVEX05BTUUgPSAiIDo6IFJFU09MVkVEX05BTUUgOjogIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJJT0QgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFID0gImJ5dGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVIgPSAiY2hhciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlQgPSAic2hvcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVCA9ICJpbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkcgPSAibG9uZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSUQgPSAidm9pZCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKRE9NU2VhcmNoSGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpET01TZWFyY2hIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIElmIHRoZSBAc2ltcGxlTmFtZSBpcyBhbiBpbm5lciBjbGFzcywgd2UgbmVlZCB0byByZXNvbHZlIG9ubHkgdGhlIGRlY2xhcmluZyBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGdldFR5cGVOYW1lSW5mbyhJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgYm9vbGVhbiBpc0ZvclJlZmxlY3Rpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmdbXVtdIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBkZWNsYXJpbmdOYW1lLCB0eXBlTmFtZTsKLQkJdHlwZU5hbWUgPSBzaW1wbGVOYW1lOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNGb3JSZWZsZWN0aW9uKQotCQkJCXR5cGVOYW1lID0gdHlwZU5hbWUucmVwbGFjZSgnLicsICckJyk7Ci0JCQlpbnQgaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCIkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQlkZWNsYXJpbmdOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQlyZXN1bHQgPSB0eXBlLnJlc29sdmVUeXBlKGRlY2xhcmluZ05hbWUpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQlpZiAoaXNGb3JSZWZsZWN0aW9uKQotCQkJCQkJcmVzdWx0WzBdWzFdID0gcmVzdWx0WzBdWzFdLnJlcGxhY2UoJy4nLCAnJCcpOwotCQkJCQlyZXN1bHRbMF1bMV0gKz0gdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4LCB0eXBlTmFtZS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoIlsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJZGVjbGFyaW5nTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCXJlc3VsdCA9IHR5cGUucmVzb2x2ZVR5cGUoZGVjbGFyaW5nTmFtZSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCXJlc3VsdFswXVsxXSA9IHJlc3VsdFswXVsxXSArIHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JCQkJfSBlbHNlCi0JCQkJCXJlc3VsdCA9IHR5cGUucmVzb2x2ZVR5cGUodHlwZU5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIChCT09MRUFOLmVxdWFscyh0eXBlKSB8fCBJTlQuZXF1YWxzKHR5cGUpIHx8IENIQVIuZXF1YWxzKHR5cGUpIHx8IFNIT1JULmVxdWFscyh0eXBlKSB8fCBMT05HLmVxdWFscyh0eXBlKSB8fCBGTE9BVC5lcXVhbHModHlwZSkgfHwgRE9VQkxFLmVxdWFscyh0eXBlKSB8fCBCWVRFLmVxdWFscyh0eXBlKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmVPclZvaWQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGlzUHJpbWl0aXZlKHR5cGUpIHx8IGlzVm9pZCh0eXBlKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgcHJpbWl0aXZlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1ZvaWQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIFZPSUQuZXF1YWxzKHR5cGUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBzaWduYXR1cmVzIG1hdGNoIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFR5cGVTaWduYXR1cmVzKElUeXBlIHR5cGUsIFN0cmluZyBzaWduYXR1cmUxLCBTdHJpbmcgc2lnbmF0dXJlMikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtYXRjaFR5cGVTaWduYXR1cmVzKHR5cGUsIHNpZ25hdHVyZTEsIHNpZ25hdHVyZTIsIG51bGwpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBzaWduYXR1cmVzIG1hdGNoIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFR5cGVTaWduYXR1cmVzKElUeXBlIHR5cGUsIFN0cmluZyBzaWduYXR1cmUxLCBTdHJpbmcgc2lnbmF0dXJlMiwgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHNpZzEgPSBzaWduYXR1cmUxOwotCQlTdHJpbmcgc2lnMiA9IHNpZ25hdHVyZTI7Ci0JCS8vIEZpcnN0IGNoZWNrIGFycmF5IGNvdW50LgotCQlpZiAoU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnMSkgPT0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnMikpIHsKLQkJCS8vIFdlIGhhdmUgdGhlIHNhbWUgYXJyYXkgY291bnQsIGdldCB0aGUgZWxlbWVudCB0eXBlcyBmb3IgY29uc2lkZXJhdGlvbi4KLQkJCXNpZzEgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoc2lnMSk7Ci0JCQlzaWcyID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZzIpOwotCi0JCQkvLyBUaGVyZSBhcmUgdGhyZWUgY2FzZXM6Ci0JCQkvLwkJMSkgQm90aCBhcmUgdW5xdWFsaWZpZWQgKGJvdGggYmVpbmcgcHJpbWl0aXZlIHdpbGwgZmFsbCBpbnRvIHRoaXMpLAotCQkJLy8JCTIpIEJvdGggYXJlIHF1YWxpZmllZCwgYW5kCi0JCQkvLwkJMykgT25lIGlzIHF1YWxpZmllZCBhbmQgdGhlIG90aGVyIGlzIG5vdCAob25lIGNvdWxkIGJlIHByaW1pdGl2ZSkuCi0KLQkJCS8vIEZvciB0aGUgZmlyc3QgdHdvIGNhc2VzIGEgY29tcGFyZSBvZiB0aGUgcmVhZGFibGUgbmFtZXMgd2lsbCBhbHdheXMgZG8uCi0JCQlpZiAoISgoc2lnMS5pbmRleE9mKCcuJykgPT0gLTEpIF4gKHNpZzIuaW5kZXhPZignLicpID09IC0xKSkpIHsKLQkJCQlyZXN1bHQgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMSkuZXF1YWxzKFNpZ25hdHVyZS50b1N0cmluZyhzaWcyKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoaXMgaXMgY2FzZSAzLgotCQkJCS8vIEZpcnN0IHJvb3Qgb3V0IG9uZSBiZWluZyBwcmltaXRpdmUuCi0JCQkJaWYgKCgoc2lnMS5jaGFyQXQoMCkgPT0gJ1EnKSB8fCAoc2lnMS5jaGFyQXQoMCkgPT0gJ0wnKSkgJiYgKChzaWcyLmNoYXJBdCgwKSA9PSAnUScpIHx8IChzaWcyLmNoYXJBdCgwKSA9PSAnTCcpKSkgewotCQkJCQkvLyBHZXQgdGhlIHJlYWRhYmxlIG5hbWUgb2YgdGhlIHF1YWxpZmllZCBzaWduYXR1cmUKLQkJCQkJLy8gYW5kIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgb3RoZXIuCi0JCQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBudWxsOwotCQkJCQlpZiAoc2lnMS5pbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCQkJCXF1YWxpZmllZE5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMik7Ci0JCQkJCQlzaW1wbGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHNpZzEpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcXVhbGlmaWVkTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhzaWcxKTsKLQkJCQkJCXNpbXBsZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMik7Ci0JCQkJCX0KLQotCQkJCQkvLyBJZiB0aGUgc2ltcGxlIG5hbWUgcmVzb2x2ZXMgdG8gdGhlIHF1YWxpZmllZCBuYW1lLCB3ZSBoYXZlIGEgbWF0Y2guCi0JCQkJCXJlc3VsdCA9IHF1YWxpZmllZE5hbWUuZXF1YWxzKHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCByZXNvbHZlZE5hbWVDYWNoZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmVlZHNUb1Jlc29sdmVOYW1lKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lLCBib29sZWFuIGlzRm9yUmVmbGVjdGlvbikgewotCQlyZXR1cm4gISh0eXBlLmlzQmluYXJ5KCkgfHwgKCFpc0ZvclJlZmxlY3Rpb24gJiYgc2ltcGxlTmFtZS5pbmRleE9mKFBFUklPRCkgPiAtMSkgfHwgaXNQcmltaXRpdmVPclZvaWQoc2ltcGxlTmFtZSkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNpbXBsZSBuYW1lIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHR5cGUuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVNpbXBsZVR5cGVOYW1lKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzaW1wbGUgbmFtZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSB0eXBlLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSBjYW4gbm90IGJlIHJlc29sdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVTaW1wbGVUeXBlTmFtZShJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCByZXNvbHZlZE5hbWVDYWNoZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2ltcGxlIG5hbWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgdHlwZS4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgY2FuIG5vdCBiZSByZXNvbHZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlU2ltcGxlVHlwZU5hbWUoSVR5cGUgdHlwZSwgU3RyaW5nIHNpbXBsZU5hbWUsIE1hcCByZXNvbHZlZE5hbWVDYWNoZSwgYm9vbGVhbiBpc0ZvclJlZmxlY3Rpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoIW5lZWRzVG9SZXNvbHZlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCBpc0ZvclJlZmxlY3Rpb24pKQotCQkJcmV0dXJuIHNpbXBsZU5hbWU7Ci0JCVN0cmluZyBrZXkgPSBudWxsLCBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJaWYgKHJlc29sdmVkTmFtZUNhY2hlICE9IG51bGwpIHsKLQkJCWtleSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgKyBSRVNPTFZFRF9OQU1FICsgc2ltcGxlTmFtZTsKLQkJCXF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKSByZXNvbHZlZE5hbWVDYWNoZS5nZXQoa2V5KTsKLQkJfQotCQlpZiAocXVhbGlmaWVkTmFtZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmdbXVtdIHJlc3VsdCA9IGdldFR5cGVOYW1lSW5mbyh0eXBlLCBzaW1wbGVOYW1lLCBpc0ZvclJlZmxlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhY2tOYW1lID0gcmVzdWx0WzBdWzBdOwotCQkJCWlmIChwYWNrTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSByZXN1bHRbMF1bMV07Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQlxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgJyQnKTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQliLmFwcGVuZChyZXN1bHRbMF1bMF0pLmFwcGVuZChQRVJJT0QpOwotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSByZXN1bHRbMF1bMV07Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnJlcGxhY2UoJy4nLCAnJCcpOwotCQkJCQliLmFwcGVuZCh0eXBlTmFtZSk7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSBiLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlxdWFsaWZpZWROYW1lID0gc2ltcGxlTmFtZTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlZE5hbWVDYWNoZSAhPSBudWxsKQotCQkJCXJlc29sdmVkTmFtZUNhY2hlLnB1dChrZXksIHF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCXJldHVybiBxdWFsaWZpZWROYW1lOwotCX0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgYSBtYXRjaGluZyBtZXRob2QgYW5kIHNldHMgaXQgaW4gdGhlCi0JICogZGVzY3JpcHRvciBpZiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRob2Qgc2VhcmNoRm9yTWF0Y2hpbmdNZXRob2QoSVR5cGUgdHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcm1TaWdzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKHR5cGUsIG1ldGhvZE5hbWUsIHBhcm1TaWdzLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogU2VhcmNoZXMgZm9yIGEgbWF0Y2hpbmcgbWV0aG9kIGFuZCBzZXRzIGl0IGluIHRoZQotCSAqIGRlc2NyaXB0b3IgaWYgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kIHNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKElUeXBlIHR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtU2lncywgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQkvLyBGaXJzdCBnZXQgYWxsIHRoZSBtZXRob2RzIGJ5IHRoaXMgbmFtZSBhbmQgd2l0aCB0aGlzIG1hbnkgcGFybXMuCi0JCUlNZXRob2RbXSBhbGxNZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCUxpc3QgY2FuZGlkYXRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgcGFybVNpZ3NMZW5ndGggPSAocGFybVNpZ3MgIT0gbnVsbCA/IHBhcm1TaWdzLmxlbmd0aCA6IDApOwotCQkJaWYgKChhbGxNZXRob2RzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSAmJiAoYWxsTWV0aG9kc1tpXS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSA9PSBwYXJtU2lnc0xlbmd0aCkpCi0JCQkJY2FuZGlkYXRlTWV0aG9kcy5hZGQoYWxsTWV0aG9kc1tpXSk7Ci0JCX0KLQotCQkvLyBGb3IgZWFjaCBjYW5kaWRhdGUgY29uc2lkZXIgZWFjaCBwYXJtIGZvciBhIG1hdGNoLgotCQkvLyBUYWtlIHRoZSBmaXJzdCBvbmUgdGhhdCBtYXRjaGVzIG9uIGFsbCBwYXJtcy4KLQkJSU1ldGhvZCBuZXh0ID0gbnVsbDsKLQkJU3RyaW5nW10gbmV4dFBhcm1TaWdzID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBjYW5kaWRhdGVJdGVyID0gY2FuZGlkYXRlTWV0aG9kcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoIWZvdW5kICYmIChjYW5kaWRhdGVJdGVyLmhhc05leHQoKSkpIHsKLQkJCW5leHQgPSAoSU1ldGhvZCkgY2FuZGlkYXRlSXRlci5uZXh0KCk7Ci0JCQluZXh0UGFybVNpZ3MgPSBuZXh0LmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsoZm91bmQgJiYgKGkgPCBuZXh0UGFybVNpZ3MubGVuZ3RoKSk7IGkrKykKLQkJCQlmb3VuZCAmPSBtYXRjaFR5cGVTaWduYXR1cmVzKHR5cGUsIHBhcm1TaWdzW2ldLCBuZXh0UGFybVNpZ3NbaV0sIHJlc29sdmVkTmFtZUNhY2hlKTsKLQkJfQotCQlyZXR1cm4gZm91bmQgPyBuZXh0IDogbnVsbDsKLQl9Ci0KLQkvKioKLQkqIFRoZSByZXR1cm5lZCBPYmplY3RbXSB3aWxsIGNvbnRhaW4gdHdvIGVudHJpZXMuICBUaGUKLQkqIGZpcnN0IHdpbGwgYmUgdGhlIElKYXZhRWxlbWVudCB0aGF0IHdhcyBmb3VuZCBhbmQgdGhlCi0JKiBzZWNvbmQgd2lsbCBiZSB0aGUgcXVhbGlmaWVkTmFtZSB1c2VkIHRvIGZpbmQgaXQuCi0JKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFtdIGZpbmRBY3R1YWxKYXZhRWxlbWVudChTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMl07Ci0JCWlmIChhZGFwdG9yID09IG51bGwpCi0JCQlyZXN1bHRbMV0gPSBxdWFsaWZpZWROYW1lOwotCQllbHNlIAotCQkJLy9FbnN1cmUgdGhlIG5hbWUgaXMgcXVhbGlmaWVkCi0JCQlyZXN1bHRbMV0gPSBnZXRSZXNvbHZlZFR5cGVOYW1lKHF1YWxpZmllZE5hbWUsIGFkYXB0b3IuZ2V0VHlwZSgpLCBhZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSk7Ci0JCQotCQlyZXN1bHRbMF0gPSBmaW5kSmF2YUVsZW1lbnQoKFN0cmluZykgcmVzdWx0WzFdLCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCWlmIChyZXN1bHRbMF0gPT0gbnVsbCkKLQkJCWZpbmRJbm5lckphdmFFbGVtZW50KHJlc3VsdCwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSByZXR1cm5lZCBPYmplY3RbXSB3aWxsIGNvbnRhaW4gdHdvIGVudHJpZXMuICBUaGUKLQkgKiBmaXJzdCB3aWxsIGJlIHRoZSBJSmF2YUVsZW1lbnQgdGhhdCB3YXMgZm91bmQgYW5kIHRoZQotCSAqIHNlY29uZCB3aWxsIGJlIHRoZSBxdWFsaWZpZWROYW1lIHVzZWQgdG8gZmluZCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmluZElubmVySmF2YUVsZW1lbnQoT2JqZWN0W10gaW5mbywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCVN0cmluZyBxdWFsaWZpZWROYW1lLCBpbm5lck5hbWU7Ci0JCXF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKSBpbmZvWzFdOwotCQlpbnQgaW5kZXggPSBxdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJaW5uZXJOYW1lID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJaW5uZXJOYW1lICs9ICIkIjsgLy8kTk9OLU5MUy0xJAotCQkJaW5uZXJOYW1lICs9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSk7Ci0JCQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCQkJLy9FbnN1cmUgdGhlIG5hbWUgaXMgcXVhbGlmaWVkIHdoaWNoIGl0IG1heSBub3QgYmUgaWYgYW4gaW5uZXIgY2xhc3MKLQkJCQlpbm5lck5hbWUgPSBnZXRSZXNvbHZlZFR5cGVOYW1lKGlubmVyTmFtZSwgYWRhcHRvci5nZXRUeXBlKCksIGFkYXB0b3IuZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKTsKLQkJCX0KLQkJCWluZm9bMV0gPSBpbm5lck5hbWU7Ci0JCQlpbmZvWzBdID0gZmluZEphdmFFbGVtZW50KGlubmVyTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQkJaWYgKGluZm9bMF0gPT0gbnVsbCkKLQkJCQlmaW5kSW5uZXJKYXZhRWxlbWVudChpbmZvLCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElKYXZhRWxlbWVudCBmaW5kSmF2YUVsZW1lbnQoU3RyaW5nIHF1YWxpZmllZE5hbWUsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSkRPTUFkYXB0b3IgYWRhcHRvcikgewotCQl0cnkgewotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YVByb2plY3QuZmluZEVsZW1lbnQoZ2V0UGF0aEZyb21RdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggZ2V0UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogCi0JKiBSZXNvbHZlIGEgdHlwZSBuYW1lIGluIHRoZSBjb250ZXh0IG9mIGEgVHlwZS4KLQkqIChCb3Jyb3dlZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5jb2RlbWFuaXB1bGF0aW9uLlN0dWJVdGlsaXR5LmdldFJlc29sdmVkVHlwZU5hbWUoKSkKLQkqIFRoZSBpbnB1dCBpcyBhIHNpbXBsZSBvciBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JKiBUaGUgb3V0cHV0IHdpbGwgYmUgYSBxdWFsaWZpZWQgbmFtZSwgTk9UIGEgc2lnbmF0dXJlCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgTWFwIHR5cGVDYWNoZSkgewotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwotCQl0cnkgewotCQkJbmFtZSA9IEpET01TZWFyY2hIZWxwZXIucmVzb2x2ZVNpbXBsZVR5cGVOYW1lKGRlY2xhcmluZ1R5cGUsIHR5cGVOYW1lLCB0eXBlQ2FjaGUsIHRydWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgYm9vbGVhbiB1c2VBZHZhbmNlZEZvcklubmVycywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YUVsZW1lbnQgZm91bmQgPSBudWxsOwotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHF1YWxpZmllZE5hbWU7Ci0JCQlpZiAodXNlQWR2YW5jZWRGb3JJbm5lcnMpIHsKLQkJCQlPYmplY3RbXSByZXN1bHQgPSBmaW5kQWN0dWFsSmF2YUVsZW1lbnQocXVhbGlmaWVkTmFtZSwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQkJCWZvdW5kID0gKElKYXZhRWxlbWVudCkgcmVzdWx0WzBdOwotCQkJCXJlc29sdmVkTmFtZSA9IChTdHJpbmcpIHJlc3VsdFsxXTsKLQkJCX0gZWxzZQotCQkJCWZvdW5kID0gZmluZEphdmFFbGVtZW50KHF1YWxpZmllZE5hbWUsIGphdmFQcm9qZWN0LCBhZGFwdG9yKTsKLQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCWlmIChmb3VuZCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCQkJCXJldHVybiAoKElDbGFzc0ZpbGUpIGZvdW5kKS5nZXRUeXBlKCk7Ci0JCQkJZWxzZSBpZiAoZm91bmQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJCUlDb21waWxhdGlvblVuaXQgZm91bmRDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBmb3VuZDsKLQkJCQkJLy8gc3RyaXAgdGhlICIuamF2YSIsIGxpZnRlZCBmcm9tIENvbXBpbGF0aW9uVW5pdC5nZXRNYWluVHlwZU5hbWUoKQotCQkJCQlTdHJpbmcgY3VNYWluVHlwZU5hbWUgPSBmb3VuZENVLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJCWN1TWFpblR5cGVOYW1lID0gY3VNYWluVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGN1TWFpblR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQkJCXJldHVybiBmb3VuZENVLmdldFR5cGUoY3VNYWluVHlwZU5hbWUpOwotCQkJCX0gZWxzZSBpZiAoZm91bmQgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJCQlpbnQgaW5kZXggPSByZXNvbHZlZE5hbWUubGFzdEluZGV4T2YoJyQnKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW5kZXggPiAtMSkKLQkJCQkJCXJldHVybiAoKElUeXBlKSBmb3VuZCkuZ2V0VHlwZShyZXNvbHZlZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgcmVzb2x2ZWROYW1lLmxlbmd0aCgpKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiAoSVR5cGUpIGZvdW5kOwotCQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQl0cnkgewotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUocGFja2FnZU5hbWUsIHF1YWxpZmllZFR5cGVOYW1lLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcGFja2FnZU5hbWUgKyAiLiIgKyBxdWFsaWZpZWRUeXBlTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCA9ICJFcnJvciBsb29raW5nIHVwIHR5cGU6ICIKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUNsYXNzSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUNsYXNzSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2NGM1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFDbGFzc0pET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFDbGFzc0pET01BZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIxICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjI3ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIEphdmFDbGFzc0pET01BZGFwdG9yIGV4dGVuZHMgSkRPTUFkYXB0b3IgaW1wbGVtZW50cyBJSmF2YUNsYXNzQWRhcHRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9UWVBFX05BTUUgPSAiamF2YS5sYW5nLk9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogU3RlcCBpZHMgdXNlZCBmb3IgVGltZXJUZXN0cyBvZiBwZXJmb3JtYW5jZSB0ZXN0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkxFQ1RfQ0xBU1MgPSAiUmVmbGVjdCBKRE9NIENsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkxFQ1RfTUVUSE9EUyA9ICJSZWZsZWN0IGFsbCBKRE9NIG1ldGhvZHMgZm9yIGEgY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9GSUVMRFMgPSAiUmVmbGVjdCBhbGwgSkRPTSBmaWVsZHMgZm9yIGEgY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJvdGVjdGVkIElUeXBlIHNvdXJjZVR5cGUgPSBudWxsOwotCXByb3RlY3RlZCBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwIHR5cGVSZXNvbHV0aW9uQ2FjaGUgPSBuZXcgSGFzaE1hcCgyNSk7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1JlZmxlY3RlZEZpZWxkcywgaXNSZWZsZWN0aW5nRmllbGRzOwotCXByaXZhdGUgYm9vbGVhbiBoYXNSZWZsZWN0ZWRNZXRob2RzLCBpc1JlZmxlY3RpbmdNZXRob2RzOwotCQotCXB1YmxpYyBKYXZhQ2xhc3NKRE9NQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCwgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBpbkZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCB3b3JraW5nUHJvamVjdCk7Ci0JCXNldEFkYXB0ZXJGYWN0b3J5KGluRmFjdG9yeSk7Ci0JfQotCQotCXByaXZhdGUgTWFwIGV4aXN0aW5nRmllbGRzID0gbmV3IEhhc2hNYXAoKTsgCi0JLyoKLQkgKiBhZGRGaWVsZHMgLSByZWZsZWN0IG91ciBmaWVsZHMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaWVsZHMoKSB7Ci0KLQkJLy8gVGhlIGFsZ29yaXRobSB3ZSB3aWxsIHVzZSBpczoKLQkJLy8gMSkgUGFzcyB0aHJvdWdoIHRoZSBJRmllbGQncyBvZiB0aGlzIGNsYXNzCi0JCS8vICAgIGEpIElmIGl0IGlzIGluIGV4aXN0aW5nRmllbGRzLCB0aGVuIGFkZCB0byBuZXdFeGlzdGluZyB0aGUgZW50cnkgZnJvbQotCQkvLyAgICAgICBvbGRFeGlzdGluZyAoZGVsZXRpbmcgZnJvbSBvbGRFeGlzdGluZyBhdCB0aGUgc2FtZSB0aW1lKSwgYW5kIGZsdXNoIHRoZSBmaWVsZC4gVGhpcyBpcyBzbyBuZXh0IHdlIHJlLWdldCBhbnkgY2hhbmdlZCBwYXJ0cyBvZiBpdC4KLQkJLy8gICAgYikgZWxzZSBub3QgZXhpc3RpbmcsIHRoZW4gY3JlYXRlIG5ldyBmaWVsZCBhbmQgYWRkIHRvIHRoZSBuZXcgZmllbGRzIGxpc3QuCi0JCS8vIDIpIFJlbW92ZSBmcm9tIHRoZSBmaWVsZHMgbGlzdCBhbnkgc3RpbGwgbGVmdCBpbiBvbGRFeGlzdGluZy4gVGhlc2UgYXJlIG9uZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCi0JCS8vIDMpIEFkZCBhbGwgb2YgdGhlIG5ld3Mgb25lcyB0byB0aGUgZmllbGRzLgotCQkvLyAgICAgICAKLQkJSUZpZWxkW10gZmllbGRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRGaWVsZHMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQlyZXR1cm4gZmFsc2U7CQotCQl9Ci0JCVhNSVJlc291cmNlIHJlc291cmNlID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsJCQotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCUphdmFGaWVsZEpET01BZGFwdG9yIGFkYXB0ZXIgPSBudWxsOwotCQlNYXAgbmV3RXhpc3RpbmcgPSBuZXcgSGFzaE1hcChmaWVsZHMubGVuZ3RoKTsKLQkJTGlzdCBuZXdGaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmllbGQgaWZpZWxkID0gZmllbGRzW2ldOwotCQkJZmllbGQgPSAoRmllbGQpIGV4aXN0aW5nRmllbGRzLnJlbW92ZShpZmllbGQpOwkvLyBHZXQgdGhlIGV4aXN0aW5nIGZpZWxkICh3aGljaCBpcyB0aGUgdmFsdWUpIGZyb20gdGhlIGNvbGxlY3Rpb24ga2V5ZWQgYnkgSUZpZWxkLgotCQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCQkvLyBJdCBpcyBhbiBleGlzdGluZyBtZXRob2QuIFNvIGp1c3QgcHV0IG92ZXIgdG8gbmV3RXhpc3RpbmcuIFRoZW4gZmx1c2ggaXQuCi0JCQkJbmV3RXhpc3RpbmcucHV0KGlmaWVsZCwgZmllbGQpOwotCQkJCS8vIFNpbmNlIHRoaXMgaXMgYSBuZXcgbWV0aG9kLCBpdCBpcyBub3QgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgc28gd2UgbmVlZCB0byBleHBsaWNpdGx5IGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJCQlhZGFwdGVyID0gKEphdmFGaWVsZEpET01BZGFwdG9yKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGZpZWxkLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQkJYWRhcHRlciA9IChKYXZhRmllbGRKRE9NQWRhcHRvcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdE5ldyhmaWVsZCwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWVsc2UKLQkJCQkJYWRhcHRlci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJYWRhcHRlci5zZXRTb3VyY2VGaWVsZChpZmllbGQpOwkvLyBHaXZlIGl0IHRoaXMgbmV3IElGaWVsZAotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIG5ldyBtZXRob2QuIENyZWF0ZSB0aGUgbmV3IG1ldGhvZCwgYWRkIHRvIG5ld0V4aXN0aW5nLCBhbmQgYWRkIHRvIG5ld01ldGhvZHMgbGlzdC4KLQkJCQlmaWVsZCA9IGNyZWF0ZUphdmFGaWVsZChpZmllbGQsIHJlc291cmNlKTsKLQkJCQluZXdFeGlzdGluZy5wdXQoaWZpZWxkLCBmaWVsZCk7CQkJCQotCQkJCW5ld0ZpZWxkcy5hZGQoZmllbGQpOwotCQkJCWFkYXB0ZXIgPSAoSmF2YUZpZWxkSkRPTUFkYXB0b3IpIGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHROZXcoZmllbGQsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLnNldFNvdXJjZUZpZWxkKGlmaWVsZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJhc2ljRUxpc3QgZmllbGRzTGlzdCA9IChCYXNpY0VMaXN0KSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKTsKLQkJaWYgKCFleGlzdGluZ0ZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhbnkgc3RpbGwgbGVmdCBpbiBvbGQgZXhpc3RpbmcgYXJlIGRlbGV0ZWQuIFNvIHdlIG1ha2UgdGhlbSBwcm94aWVzIGFuZCB0aGVuIHJlbW92ZSB0aGVtIGZyb20gZmllbGRzIGxpc3QuCQkJCi0JCQlVUkkgYmFzZVVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJQ29sbGVjdGlvbiB0b0RlbGV0ZSA9IGV4aXN0aW5nRmllbGRzLnZhbHVlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSB0b0RlbGV0ZS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCUludGVybmFsRU9iamVjdCBtID0gKEludGVybmFsRU9iamVjdCkgaXRyLm5leHQoKTsKLQkJCQlTdHJpbmcgaWQgPSByZXNvdXJjZS5nZXRJRChtKTsKLQkJCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQkJbS5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQkJfQotCQkJZmllbGRzTGlzdC5yZW1vdmVBbGwodG9EZWxldGUpOwotCQl9Ci0JCQotCQlpZiAoIW5ld0ZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhZGQgaW4gdGhlIG5ld3Mgb25lcwotCQkJZmllbGRzTGlzdC5hZGRBbGxVbmlxdWUobmV3RmllbGRzKTsKLQkJfQotCQkKLQkJLy8gRmluYWxseSBzZXQgY3VycmVudCBleGlzdGluZyB0byB0aGUgbmV3IG1hcCB3ZSBjcmVhdGVkLgotCQlleGlzdGluZ0ZpZWxkcyA9IG5ld0V4aXN0aW5nOwotCQlyZXR1cm4gdHJ1ZTsJCQkKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZXhpc3RpbmdNZXRob2RzID0gbmV3IEhhc2hNYXAoKTsgCi0JLyoKLQkgKiBhZGRNZXRob2RzIC0gcmVmbGVjdCBvdXIgbWV0aG9kcy4gTWVyZ2UgaW4gd2l0aCB0aGUgcHJldmlvdXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkTWV0aG9kcygpIHsKLQkJLy8gVGhlIGFsZ29yaXRobSB3ZSB3aWxsIHVzZSBpczoKLQkJLy8gMSkgUGFzcyB0aHJvdWdoIHRoZSBJTWV0aG9kJ3Mgb2YgdGhpcyBjbGFzcwotCQkvLyAgICBhKSBJZiBpdCBpcyBpbiBleGlzdGluZ01ldGhvZHMsIHRoZW4gYWRkIHRvIG5ld0V4aXN0aW5nIHRoZSBlbnRyeSBmcm9tCi0JCS8vICAgICAgIG9sZEV4aXN0aW5nIChkZWxldGluZyBmcm9tIG9sZEV4aXN0aW5nIGF0IHRoZSBzYW1lIHRpbWUpLCBhbmQgZmx1c2ggdGhlIG1ldGhvZC4gVGhpcyBpcyBzbyBuZXh0IHdlIHJlLWdldCBhbnkgY2hhbmdlZCBwYXJ0cyBvZiBpdC4KLQkJLy8gICAgYikgZWxzZSBub3QgZXhpc3RpbmcsIHRoZW4gY3JlYXRlIG5ldyBtZXRob2QgYW5kIGFkZCB0byB0aGUgbmV3IG1ldGhvZHMgbGlzdC4KLQkJLy8gMikgUmVtb3ZlIGZyb20gdGhlIG1ldGhvZHMgbGlzdCBhbnkgc3RpbGwgbGVmdCBpbiBvbGRFeGlzdGluZy4gVGhlc2UgYXJlIG9uZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCi0JCS8vIDMpIEFkZCBhbGwgb2YgdGhlIG5ld3Mgb25lcyB0byB0aGUgbWV0aG9kcy4KLQkJLy8gICAgICAgCi0JCUlNZXRob2RbXSBtZXRob2RzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1ldGhvZHMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0TWV0aG9kcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCXJldHVybiBmYWxzZTsJCi0JCX0KLQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlKYXZhTWV0aG9kSkRPTUFkYXB0b3IgYWRhcHRlciA9IG51bGw7Ci0JCU1hcCBuZXdFeGlzdGluZyA9IG5ldyBIYXNoTWFwKG1ldGhvZHMubGVuZ3RoKTsKLQkJTGlzdCBuZXdNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCUlNZXRob2QgaW0gPSBtZXRob2RzW2ldOwotCQkJbWV0aG9kID0gKE1ldGhvZCkgZXhpc3RpbmdNZXRob2RzLnJlbW92ZShpbSk7CS8vIEdldCB0aGUgZXhpc3RpbmcgbWV0aG9kICh3aGljaCBpcyB0aGUgdmFsdWUpIGZyb20gdGhlIGNvbGxlY3Rpb24ga2V5ZWQgYnkgSU1ldGhvZC4KLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCS8vIEl0IGlzIGFuIGV4aXN0aW5nIG1ldGhvZC4gU28ganVzdCBwdXQgb3ZlciB0byBuZXdFeGlzdGluZy4gVGhlbiBmbHVzaCBpdC4KLQkJCQluZXdFeGlzdGluZy5wdXQoaW0sIG1ldGhvZCk7Ci0JCQkJYWRhcHRlciA9IChKYXZhTWV0aG9kSkRPTUFkYXB0b3IpIHJldHJpZXZlQWRhcHRvckZyb20obWV0aG9kKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKHRydWUpOwotCQkJCQlhZGFwdGVyLnNldFNvdXJjZU1ldGhvZChpbSk7CS8vIEdpdmUgaXQgdGhpcyBuZXcgSU1ldGhvZAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXQgaXMgYSBuZXcgbWV0aG9kLiBDcmVhdGUgdGhlIG5ldyBtZXRob2QsIGFkZCB0byBuZXdFeGlzdGluZywgYW5kIGFkZCB0byBuZXdNZXRob2RzIGxpc3QuCi0JCQkJbWV0aG9kID0gY3JlYXRlSmF2YU1ldGhvZChpbSwgcmVzb3VyY2UpOwotCQkJCW5ld0V4aXN0aW5nLnB1dChpbSwgbWV0aG9kKTsJCQkJCi0JCQkJbmV3TWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJCQkvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IG1ldGhvZCwgaXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBjcmVhdGUgdGhlIGFkYXB0ZXIuCi0JCQkJYWRhcHRlciA9IChKYXZhTWV0aG9kSkRPTUFkYXB0b3IpIGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHROZXcobWV0aG9kLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJYWRhcHRlci5zZXRTb3VyY2VNZXRob2QobWV0aG9kc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJhc2ljRUxpc3QgbWV0aG9kc0xpc3QgPSAoQmFzaWNFTGlzdCkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0TWV0aG9kc0dlbigpOwotCQlpZiAoIWV4aXN0aW5nTWV0aG9kcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhbnkgc3RpbGwgbGVmdCBpbiBvbGQgZXhpc3RpbmcgYXJlIGRlbGV0ZWQuIFNvIHdlIG1ha2UgdGhlbSBwcm94aWVzIGFuZCB0aGVuIHJlbW92ZSB0aGVtIGZyb20gbWV0aG9kcyBsaXN0LgotCQkJVVJJIGJhc2VVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCUNvbGxlY3Rpb24gdG9EZWxldGUgPSBleGlzdGluZ01ldGhvZHMudmFsdWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHRvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG0gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdHIubmV4dCgpOwotCQkJCVN0cmluZyBpZCA9IHJlc291cmNlLmdldElEKG0pOwotCQkJCWlmIChpZCAhPSBudWxsKQotCQkJCQltLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCQl9Ci0JCQltZXRob2RzTGlzdC5yZW1vdmVBbGwodG9EZWxldGUpOwotCQl9Ci0JCQotCQlpZiAoIW5ld01ldGhvZHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBOb3cgYWRkIGluIHRoZSBuZXdzIG9uZXMKLQkJCW1ldGhvZHNMaXN0LmFkZEFsbFVuaXF1ZShuZXdNZXRob2RzKTsKLQkJfQotCQkKLQkJLy8gRmluYWxseSBzZXQgY3VycmVudCBleGlzdGluZyB0byB0aGUgbmV3IG1hcCB3ZSBjcmVhdGVkLgotCQlleGlzdGluZ01ldGhvZHMgPSBuZXdFeGlzdGluZzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIENsZWFyIHNvdXJjZSBUeXBlIDsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJc291cmNlVHlwZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlZmxlY3RlZCBmaWVsZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEZpZWxkcygpIHsKLQkJLy8gRmlyc3QgdHVybiB0aGVtIGFsbCBpbnRvIHByb3hpZXMgc28gdGhhdCBhbnkgaG9sZGVycyB3aWxsIHJlLXJlc29sdmUgdG8gbWF5YmUgdGhlIG5ldyBvbmUgaWYgY2xhc3MgY29tZXMgYmFjay4KLQkJZXhpc3RpbmdGaWVsZHMuY2xlYXIoKTsKLQkJWE1JUmVzb3VyY2UgcmVzID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsKLQkJVVJJIGJhc2VVUkkgPSByZXMuZ2V0VVJJKCk7Ci0JCUxpc3QgZmllbGRzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RmllbGRzR2VuKCk7Ci0JCWludCBtc2l6ZSA9IGZpZWxkcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXNpemU7IGkrKykgewotCQkJSW50ZXJuYWxFT2JqZWN0IGYgPSAoSW50ZXJuYWxFT2JqZWN0KSBmaWVsZHMuZ2V0KGkpOwotCQkJU3RyaW5nIGlkID0gcmVzLmdldElEKGYpOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJZi5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQl9Ci0JCWZpZWxkcy5jbGVhcigpOwkvLyBOb3cgd2UgY2FuIGNsZWFyIGl0LgotCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCS8qKgotCSAqIENsZWFyIHRoZSBpbXBsZW1lbnRzIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hJbXBsZW1lbnRzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIG1ldGhvZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaE1ldGhvZHMoKSB7Ci0JCS8vIEZpcnN0IHR1cm4gdGhlbSBhbGwgaW50byBwcm94aWVzIHNvIHRoYXQgYW55IGhvbGRlcnMgd2lsbCByZS1yZXNvbHZlIHRvIG1heWJlIHRoZSBuZXcgb25lIGlmIGNsYXNzIGNvbWVzIGJhY2suCi0JCWV4aXN0aW5nTWV0aG9kcy5jbGVhcigpOwotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwotCQlVUkkgYmFzZVVSSSA9IHJlcy5nZXRVUkkoKTsKLQkJTGlzdCBtZXRob2RzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0TWV0aG9kc0dlbigpOwotCQlpbnQgbXNpemUgPSBtZXRob2RzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtc2l6ZTsgaSsrKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgbSA9IChJbnRlcm5hbEVPYmplY3QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJU3RyaW5nIGlkID0gcmVzLmdldElEKG0pOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJbS5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQl9Ci0JCW1ldGhvZHMuY2xlYXIoKTsJLy8gTm93IHdlIGNhbiBjbGVhciBpdC4KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoTW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRBYnN0cmFjdChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRQdWJsaWMoZmFsc2UpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5VTkRFRklORURfTElURVJBTCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaElubmVyQ2xhc3NlcygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIENsZWFyIHRoZSByZWZsZWN0ZWQgdmFsdWVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlpZiAoY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkKLQkJCXNldFNvdXJjZVR5cGUobnVsbCk7Ci0JCXR5cGVSZXNvbHV0aW9uQ2FjaGUuY2xlYXIoKTsKLQkJZmx1c2hNb2RpZmllcnMoKTsKLQkJZmx1c2hTdXBlcigpOwotCQlmbHVzaEltcGxlbWVudHMoKTsKLQkJaWYgKGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJCS8vIERvbid0IGZsdXNoIHRoZXNlIHlldC4gV2Ugd2lsbCB0cnkgdG8gcmV1c2UgdGhlbSBvbiB0aGUgbmV4dCByZWZsdXNoLiBJZiBjbGVhciBtb2RlbCB0b28sIHRoZW4gZmx1c2ggdGhlbS4gVGhpcyB1c3VhbGx5IG1lYW5zIGNsYXNzIGhhcyBiZWVuIGRlbGV0ZWQsIHNvIHdoeSBrZWVwIHRoZW0gYXJvdW5kLgotCQkJZmx1c2hNZXRob2RzKCk7Ci0JCQlmbHVzaEZpZWxkcygpOwotCQl9Ci0JCS8vIEV2ZW4gaWYgd2UgZGlkbid0IGZsdXNoIHRoZSBmaWVsZHMvbWV0aG9kcywgd2UgZG8gbmVlZCB0byBtYXJrIGFzIG5vdCByZWZsZWN0ZWQgc28gb24gbmV4dCB1c2FnZSB3ZSB3aWxsIG1lcmdlIGluIHRoZSBjaGFuZ2VzLgotCQloYXNSZWZsZWN0ZWRNZXRob2RzID0gZmFsc2U7Ci0JCWhhc1JlZmxlY3RlZEZpZWxkcyA9IGZhbHNlOwotCQkKLQkJZmx1c2hJbm5lckNsYXNzZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3VwZXJ0eXBlIHRvIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hTdXBlcigpIHsKLQkJTGlzdCB0YXJnZXRTdXBlcnMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5wcmltR2V0RVN1cGVyVHlwZXMoKTsKLQkJdGFyZ2V0U3VwZXJzLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkvKioKLQkgKiBnZXRCaW5hcnlUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3MgZmlsZQotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRCaW5hcnlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRCaW5hcnlUeXBlKCgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0YXJnZXQgdHlwZWQgdG8gYSBKYXZhQ2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzc0ltcGwgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkgewotCQlyZXR1cm4gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlVHlwZSAhPSBudWxsOwotICAgIH0KLQkvKioKLQkgKiBnZXRTb3VyY2VUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3Mgb3Igc291cmNlIGZpbGUKLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0U291cmNlVHlwZSgpIHsKLQkJaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCkgewotCQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCQlzb3VyY2VUeXBlID0gSkRPTVNlYXJjaEhlbHBlci5maW5kVHlwZShqYXZhQ2xhc3MuZ2V0SmF2YVBhY2thZ2UoKS5nZXROYW1lKCksIGphdmFDbGFzcy5wcmltR2V0TmFtZSgpLCBnZXRTb3VyY2VQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiBzb3VyY2VUeXBlOwotCX0KLQkvKioKLQkgKiBnZXRTb3VyY2VUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3Mgb3Igc291cmNlIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKTsKLQl9Ci0JcHJvdGVjdGVkIE1hcCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkgewotCQlyZXR1cm4gdHlwZVJlc29sdXRpb25DYWNoZTsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGlzIG51bGwgb3IgaWYKLQkgKiBpdCBpcyBhIGJpbmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291cmNlVHlwZUZyb21CaW5hcnkoKSB7Ci0JCWlmIChnZXRTb3VyY2VUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy9tdXN0IGJlIG5ldz8KLQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKS5pc0JpbmFyeSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyByZWZsZWN0SmF2YUNsYXNzKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCUlUeXBlIHR5cGUgPSBKRE9NU2VhcmNoSGVscGVyLmZpbmRUeXBlKHF1YWxpZmllZE5hbWUsIHRydWUsIGdldFNvdXJjZVByb2plY3QoKSwgdGhpcyk7Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlyZXR1cm4gcmVmbGVjdEphdmFDbGFzcyh0eXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGFzc1JlZihxdWFsaWZpZWROYW1lKTsKLQl9Ci0JcHJvdGVjdGVkIEphdmFDbGFzcyByZWZsZWN0SmF2YUNsYXNzKElUeXBlIGFUeXBlKSB7Ci0JCWlmIChhVHlwZSAhPSBudWxsKSB7Ci0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGFUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCAoRU9iamVjdCkgZ2V0VGFyZ2V0KCkpOwotCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSmF2YUNsYXNzSkRPTUFkYXB0b3IgYWRhcHRvciA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIoamF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKGFkYXB0b3IgIT0gbnVsbCkKLQkJCQkJYWRhcHRvci5zZXRTb3VyY2VUeXBlKGFUeXBlKTsKLQkJCX0KLQkJCXJldHVybiBqYXZhQ2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIFJldHVybiB0cnVlIGFsd2F5cyBhbmQgdGhlIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIHdpbGwgZmx1c2ggd2l0aCB0aGUgdHlwZSBjYW4KLQkgKiBiZSBmb3VuZCBhZ2Fpbi4gIEluIGhlYWRsZXNzIG1vZGUsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIHR5cGUgaXMgZm91bmQuICBUaGlzIGlzCi0JICogbmVlZGVkIGJlY2F1Y2UgbW9zdCBoZWFkbGVzcyB0YXNrcyBhcmUgZG9uZSB1bmRlciBvbmUgb3BlcmF0aW9uIGFuZCB0aGUgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIKLQkgKiBtYXkgbm90IGhhdmUgYSBjaGFuY2UgdG8gZmx1c2ggYSBiYWQgcmVmbGVjdGlvbiBiZWZvcmUgdGhlIHJlYWwgdHlwZSBuZWVkcyB0byBiZSBmb3VuZCBhbmQgY2FuIGJlIGZvdW5kLgotCSAqIEphdmFDbGFzcyBhZGFwdG9yOgotCSAqIC0gc2V0IG1vZGlmaWVycwotCSAqIC0gc2V0IG5hbWUKLQkgKiAtIHNldCByZWZlcmVuY2UgdG8gc3VwZXIKLQkgKiAtIGNyZWF0ZSBtZXRob2RzCi0JICogLSBjcmVhdGUgZmllbGRzCi0JICogLSBhZGQgaW1wb3J0cwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJYm9vbGVhbiBpc0hlYWRsZXNzID0gVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5nZXRDdXJyZW50Q29udGV4dCgpID09IFVJQ29udGV4dERldGVybWluYXRpb24uSEVBRExFU1NfQ09OVEVYVDsKLQkJaWYgKGNhblJlZmxlY3QoKSkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChSRUZMRUNUX0NMQVNTKTsKLQkJCXRyeSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldFNvdXJjZVR5cGUoKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQlib29sZWFuIGlzV0MgPSBjdSAhPSBudWxsID8gY3UuaXNXb3JraW5nQ29weSgpIDogZmFsc2U7Ci0JCQkJSVJlc291cmNlIHJlcyA9IGlzV0MgPyBnZXRTb3VyY2VUeXBlKCkuZ2V0UmVzb3VyY2UoKSA6IG51bGw7Ci0JCQkJLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwaHlzaWNhbCBjbGFzc2VzLiBJZiBzdGlsbCBqdXN0IGluIHdvcmtpbmcgY29weSBhbmQgbm90IHlldCBwdXQgb3V0IHRvCi0JCQkJLy8gZGlzaywgd2UgZG9uJ3Qgc2hvdWxkIHRyZWF0IGFzIG5vdCBleGlzdC4gQW55dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIGV4aXN0aW5nIGJlY2F1c2Ugd2UgZ290IHBhc3QKLQkJCQkvLyBnZXRTb3VyY2VUeXBlLmV4aXN0cy4gVGhpcyB3aWxsIHJldHVybiB0aGUgdHJ1dGggZm9yIG5vbi13Yy4gQnV0IGZvciB3YyB0eXBlcyBpdCB3aWxsIHJldHVybiB0cnVlLAotCQkJCS8vIGV2ZW4gdGhvdWdoIG5vdCBwaHlzaWNhbGx5IG9uIGRpc2sgKHN1Y2ggYXMganVzdCBjcmVhdGluZyBpdCBhbmQgaGFkbid0IHNhdmVkIGl0IHlldCkuIFNvIGZvciB3YyB0eXBlcwotCQkJCS8vIHdlIG5lZWQgdG8gdGVzdCB0aGUgYWN0dWFsIHJlc291cmNlLgotCQkJCS8vIFRlc3QgaXMgT0sgaWYgbm90IHdjLCBvciBpZiB3YywgdGhlbiB0aGVyZSBpcyBhIHJlcy4gYW5kIGl0IGlzIGFjY2Vzc2libGUuCi0JCQkJaWYgKCFpc1dDIHx8IChyZXMgIT0gbnVsbCAmJiByZXMuaXNBY2Nlc3NpYmxlKCkpKSB7Ci0JCQkJCXNldE1vZGlmaWVycygpOwotCQkJCQlzZXROYW1pbmcoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNldFN1cGVyKCk7Ci0JCQkJCX0gY2F0Y2ggKEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gZSkgewotCQkJCQkJSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXNldEltcGxlbWVudHMoKTsKLQkJCQkJcmVmbGVjdElubmVyQ2xhc3NlcygpOwotCQkJCQkvL2FkZEltcG9ydHMoKTsKLQkJCQkJaWYgKGlzSGVhZGxlc3MpIHsKLQkJCQkJCXJlZ2lzdGVyV2l0aEZhY3RvcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9DTEFTUyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzSGVhZGxlc3MpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgewotCQkJcmVnaXN0ZXJXaXRoRmFjdG9yeSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5SZWZsZWN0KCkgewotCQlyZXR1cm4gZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwgJiYgZ2V0U291cmNlVHlwZSgpICE9IG51bGwgJiYgZ2V0U291cmNlVHlwZSgpLmV4aXN0cygpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkgJiYgY2FuUmVmbGVjdCgpKSB7Ci0JCQlpZiAoIWhhc1JlZmxlY3RlZEZpZWxkcyAmJiAhaXNSZWZsZWN0aW5nRmllbGRzKSB7Ci0JCQkJaXNSZWZsZWN0aW5nRmllbGRzID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfRklFTERTKTsKLQkJCQkJYWRkRmllbGRzKCk7Ci0JCQkJCWhhc1JlZmxlY3RlZEZpZWxkcyA9IHRydWU7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJaGFzUmVmbGVjdGVkRmllbGRzID0gZmFsc2U7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQkJCWxvZ2dlci5sb2coUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmFpbGVkX3JlZmxlY3RpbmdfdmFsdWVzX0VSUk9SXyIpLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJCA9ICJGYWlsZWQgcmVmbGVjdGluZyB2YWx1ZXMhISEiCi0JCQkJCQlsb2dnZXIubG9nV2FybmluZyhlKTsgCi0JCQkJCX0JCQkJCQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlzUmVmbGVjdGluZ0ZpZWxkcyA9IGZhbHNlOwotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9GSUVMRFMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBoYXNSZWZsZWN0ZWRGaWVsZHM7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwkvLyBDb3VsZG4ndCByZWZsZWN0IHRoZSBiYXNlIHZhbHVlcywgc28gY291bGRuJ3QgZG8gZmllbGRzIGVpdGhlcgotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpICYmIGNhblJlZmxlY3QoKSkgewotCQkJaWYgKCFoYXNSZWZsZWN0ZWRNZXRob2RzICYmICFpc1JlZmxlY3RpbmdNZXRob2RzKSB7Ci0JCQkJaXNSZWZsZWN0aW5nTWV0aG9kcyA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChSRUZMRUNUX01FVEhPRFMpOwotCQkJCQloYXNSZWZsZWN0ZWRNZXRob2RzID0gYWRkTWV0aG9kcygpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWhhc1JlZmxlY3RlZE1ldGhvZHMgPSBmYWxzZTsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCQkJbG9nZ2VyLmxvZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGYWlsZWRfcmVmbGVjdGluZ192YWx1ZXNfRVJST1JfIiksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkID0gIkZhaWxlZCByZWZsZWN0aW5nIHZhbHVlcyEhISIKLQkJCQkJCWxvZ2dlci5sb2dXYXJuaW5nKGUpOyAKLQkJCQkJfQkJCQkJCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaXNSZWZsZWN0aW5nTWV0aG9kcyA9IGZhbHNlOwotCQkJCQlpZiAoIWhhc1JlZmxlY3RlZCkKLQkJCQkJCWZsdXNoTWV0aG9kcygpOwkvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBzbyB3ZSB3aWxsIGRvIGEgY29tcGxldGUgZmx1c2ggdG8gYmUgb24gc2FmZSBzaWRlLgotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9NRVRIT0RTKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaGFzUmVmbGVjdGVkTWV0aG9kczsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7CS8vIENvdWxkbid0IHJlZmxlY3QgdGhlIGJhc2UgdmFsdWVzLCBzbyBjb3VsZG4ndCBkbyBmaWVsZHMgZWl0aGVyCi0JfQotCQotCXByaXZhdGUgdm9pZCByZWdpc3RlcldpdGhGYWN0b3J5KCkgewotCQlnZXRBZGFwdGVyRmFjdG9yeSgpLnJlZ2lzdGVyUmVmbGVjdGlvbihnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3Ijbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClOb3RpZmllciwgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIEVPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSCi0JCQkmJiBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSA9PSB0aGlzCi0JCQkmJiBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSA9PSBnZXRUYXJnZXQoKSkKLQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkudW5yZWdpc3RlclJlZmxlY3Rpb24oZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyRmFjdG9yeShKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGluRmFjdG9yeSkgewotCQlhZGFwdGVyRmFjdG9yeSA9IGluRmFjdG9yeTsKLQl9Ci0JLyoqCi0JICogc2V0SW1wbGVtZW50cyAtIHNldCBvdXIgaW1wbGVtZW50ZWQvc3VwZXIgaW50ZXJmYWNlcyBoZXJlCi0JICogRm9yIGFuIGludGVyZmFjZSwgdGhlc2UgYXJlIHN1cGVyY2xhc3Nlcy4KLQkgKiBGb3IgYSBjbGFzcywgdGhlc2UgYXJlIGltcGxlbWVudGVkIGludGVyZmFjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW1wbGVtZW50cygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIGludGVyZmFjZU5hbWVzID0gZ2V0U291cmNlVHlwZSgpLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKTsKLQkJCUphdmFDbGFzcyByZWY7Ci0JCQkvLyBuZWVkcyB3b3JrLCB0aGUgbmFtZXMgYWJvdmUgd2lsbCBiZSBzaW1wbGUgbmFtZXMgaWYgd2UgYXJlIHJlbGZlY3RpbmcgZnJvbSBhIHNvdXJjZSBmaWxlCi0JCQlMaXN0IGxpc3QgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXJlZiA9IHJlZmxlY3RKYXZhQ2xhc3MoaW50ZXJmYWNlTmFtZXNbaV0pOwotCQkJCWxpc3QuYWRkKHJlZik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vIG5hbWUgc3RheXMgbnVsbCBhbmQgd2UgY2Fycnkgb24KLQkJfQotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJamF2YUNsYXNzVGFyZ2V0LnNldEFic3RyYWN0KEZsYWdzLmlzQWJzdHJhY3QoZ2V0U291cmNlVHlwZSgpLmdldEZsYWdzKCkpKTsKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChGbGFncy5pc0ZpbmFsKGdldFNvdXJjZVR5cGUoKS5nZXRGbGFncygpKSk7Ci0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0UHVibGljKEZsYWdzLmlzUHVibGljKGdldFNvdXJjZVR5cGUoKS5nZXRGbGFncygpKSk7Ci0JCQkvLyBTZXQgdHlwZSB0byBjbGFzcyBvciBpbnRlcmZhY2UsIG5vdCB5ZXQgaGFuZGxpbmcgRVhDRVBUSU9OCi0JCQlpZiAoZ2V0U291cmNlVHlwZSgpLmlzQ2xhc3MoKSkKLQkJCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5DTEFTU19MSVRFUkFMKTsKLQkJCWVsc2UKLQkJCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpCi0JCQkJbG9nZ2VyLmxvZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9JbnRyb3NwZWN0aW5nX0ZsYWdzX0VSUk9SXyIsIG5ldyBPYmplY3RbXSB7IGphdmFDbGFzc1RhcmdldC5nZXRRdWFsaWZpZWROYW1lKCksIG5wZS5nZXRNZXNzYWdlKCl9KSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQgPSAiZXJyb3IgaW50cm9zcGVjdGluZyBmbGFncyBvbiB7MH0iCi0JCX0KLQl9Ci0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUKLQkgKiAJLSBxdWFsaWZpZWQgbmFtZSAocGFja2FnZSBuYW1lICsgbmFtZSkgbXVzdCBiZSBzZXQgZmlyc3QsIHRoYXQgaXMgdGhlIHBhdGggdG8gdGhlIHJlYWwgSmF2YSBjbGFzcwotCSAqCS0gSUQgLSBzaW1wbGUgbmFtZSwgaWRlbnRpdHkgd2l0aGluIGEgcGFja2FnZSBkb2N1bWVudAotCSAqIAktIG51bGwgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJLyogTmFtaW5nIGhhcyBiZWVuIHByb3ZpZGVkIGJ5IHRoZSBKYXZhUmVmbGVjdGlvbktleSAKLQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnJlZlNldFVVSUQoKFN0cmluZyludWxsKTsKLQkJKChYTUlSZXNvdXJjZSlqYXZhQ2xhc3NUYXJnZXQuZVJlc291cmNlKCkpLnNldElEKGphdmFDbGFzc1RhcmdldCxnZXRTb3VyY2VUeXBlKCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCSovCi0JfQotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVR5cGUoSVR5cGUgYVR5cGUpIHsKLQkJc291cmNlVHlwZSA9IGFUeXBlOwotCX0KLQkvKioKLQkgKiBzZXRTdXBlciAtIHNldCBvdXIgc3VwZXJ0eXBlIGhlcmUsIGltcGxlbWVudGVkIGludGVyZmFjZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXIoKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdXBlck5hbWUgPSBudWxsOwotCQlJVHlwZSBzdXBlclR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCFnZXRTb3VyY2VUeXBlKCkuaXNJbnRlcmZhY2UoKSkgewotCQkJCXN1cGVyTmFtZSA9IGdldFNvdXJjZVR5cGUoKS5nZXRTdXBlcmNsYXNzTmFtZSgpOwotCQkJCS8vIGJpbmFyeSB0eXBlcyB3aWxsIGFsd2F5cyBoYXZlIGZ1bGx5LXF1YWxpZmllZCBzdXBlciBuYW1lcywgc28gbm8gbmVlZCB0byBkbyBhbnkgc2VhcmNoaW5nLgotCQkJCWlmICghZ2V0U291cmNlVHlwZSgpLmlzQmluYXJ5KCkgJiYgc3VwZXJOYW1lICE9IG51bGwgJiYgaXNUYXJnZXRJbm5lcigpKSB7Ci0JCQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQkJCQlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkvL0dldCBhbGwgcGFyZW50IElubmVyVHlwZXMKLQkJCQkJCUlUeXBlW10gaW5uZXJzID0gZGVjbGFyaW5nVHlwZS5nZXRUeXBlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJVHlwZSB0eXBlID0gaW5uZXJzW2ldOwotCQkJCQkJCWlmIChzdXBlck5hbWUuZXF1YWxzKHR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJCQkJc3VwZXJOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpICsgJy4nICsgc3VwZXJOYW1lOwotCQkJCQkJCQlyZWZsZWN0SW5uZXJDbGFzc2VzKGRlY2xhcmluZ1R5cGUpOwotCQkJCQkJCQlzdXBlclR5cGUgPSB0eXBlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy9Tb3VyY2UgZmlsZXMgcmV0dXJuIG51bGwgaWYgZXh0ZW5kcyBkb2VzIG5vdCBleGlzdC4KLQkJCQlpZiAoc3VwZXJOYW1lID09IG51bGwgJiYgIWdldFNvdXJjZVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT0JKRUNUX1RZUEVfTkFNRSkpCi0JCQkJCXN1cGVyTmFtZSA9IE9CSkVDVF9UWVBFX05BTUU7Ci0JCQkJaWYgKHN1cGVyTmFtZSAhPSBudWxsKSB7Ci0JCQkJCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJCQkJaWYgKHN1cGVyVHlwZSAhPSBudWxsKQotCQkJCQkJamF2YUNsYXNzVGFyZ2V0LnNldFN1cGVydHlwZShyZWZsZWN0SmF2YUNsYXNzKHN1cGVyVHlwZSkpOwotCQkJCQllbHNlCi0JCQkJCQlqYXZhQ2xhc3NUYXJnZXQuc2V0U3VwZXJ0eXBlKHJlZmxlY3RKYXZhQ2xhc3Moc3VwZXJOYW1lKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzVGFyZ2V0SW5uZXIoKSB7Ci0JCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzID0gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCQlyZXR1cm4gKGphdmFDbGFzcy5nZXROYW1lKCkuaW5kZXhPZignJCcpICE9IC0xKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgY2FuIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNvdXJjZVR5cGVFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCkgIT0gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdElubmVyQ2xhc3NlcygpIHsKLQkJSVR5cGVbXSBpbm5lckNsYXNzZXMgPSBudWxsOwotCQl0cnkgewotCQkJaW5uZXJDbGFzc2VzID0gZ2V0U291cmNlVHlwZSgpLmdldFR5cGVzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGlubmVyQ2xhc3NlcyAhPSBudWxsICYmIGlubmVyQ2xhc3Nlcy5sZW5ndGggIT0gMCkgewotCQkJTGlzdCBkZWNsYXJlZENsYXNzZXMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXREZWNsYXJlZENsYXNzZXNHZW4oKTsKLQkJCUphdmFDbGFzcyBpbm5lcjsKLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFRhcmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFNvdXJjZVR5cGUoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbm5lciA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShwYWNrYWdlTmFtZSwgaW5uZXJDbGFzc2VzW2ldLmdldFR5cGVRdWFsaWZpZWROYW1lKCksIHNldCk7Ci0JCQkJZGVjbGFyZWRDbGFzc2VzLmFkZChpbm5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdElubmVyQ2xhc3NlcyhJVHlwZSBhVHlwZSkgewotCQlJVHlwZVtdIGlubmVyQ2xhc3NlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbm5lckNsYXNzZXMgPSBhVHlwZS5nZXRUeXBlcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChpbm5lckNsYXNzZXMgIT0gbnVsbCAmJiBpbm5lckNsYXNzZXMubGVuZ3RoICE9IDApIHsKLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFRhcmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGFUeXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlKYXZhQ2xhc3NJbXBsIHBhcmVudFR5cGUgPSAoSmF2YUNsYXNzSW1wbCkgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHBhY2thZ2VOYW1lLCBhVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpLCBzZXQpOwotCQkJTGlzdCBkZWNsYXJlZENsYXNzZXMgPSBwYXJlbnRUeXBlLmdldERlY2xhcmVkQ2xhc3Nlc0dlbigpOwotCQkJSmF2YUNsYXNzIGlubmVyOwotCQkJCi0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5uZXJDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5uZXIgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocGFja2FnZU5hbWUsIGlubmVyQ2xhc3Nlc1tpXS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpLCBzZXQpOwotCQkJCWRlY2xhcmVkQ2xhc3Nlcy5hZGQoaW5uZXIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhRmllbGRKRE9NQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhRmllbGRKRE9NQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWUzMjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUZpZWxkSkRPTUFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUZpZWxkSkRPTUFkYXB0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MjcgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuRmllbGRJbXBsOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRmllbGRKRE9NQWRhcHRvciBleHRlbmRzIEpET01BZGFwdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVHSU5fQ09NTUVOVCA9ICIvKiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX0NPTU1FTlQgPSAiKi8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElGaWVsZCBzb3VyY2VGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIElUeXBlIHBhcmVudFR5cGUgPSBudWxsOwotCXB1YmxpYyBKYXZhRmllbGRKRE9NQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCkgewotCQlzdXBlcih0YXJnZXQsIHdvcmtpbmdQcm9qZWN0KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTb3VyY2UoKSB7Ci0JCXNvdXJjZUZpZWxkID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCWlmIChjbGVhckNhY2hlZE1vZGVsT2JqZWN0KQotCQkJY2xlYXJTb3VyY2UoKTsKLQkJRmllbGRJbXBsIGZpZWxkID0gZ2V0VGFyZ2V0RmllbGQoKTsKLQkJZmllbGQuc2V0SW5pdGlhbGl6ZXIobnVsbCk7Ci0JCWZpZWxkLnNldEZpbmFsKGZhbHNlKTsKLQkJZmllbGQuc2V0U3RhdGljKGZhbHNlKTsKLQkJZmllbGQuc2V0VHJhbnNpZW50KGZhbHNlKTsKLQkJZmllbGQuc2V0Vm9sYXRpbGUoZmFsc2UpOwotCQlmaWVsZC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQlmaWVsZC5zZXRFVHlwZShudWxsKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gaXNFeGlzdGluZykgewotCQlnZXRUYXJnZXRGaWVsZCgpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBTdHJpbmcgZm9yIHRoZSBzb3VyY2Ugc3RhcnRpbmcgYWZ0ZXIgdGhlIGZpZWxkJ3MgbmFtZSB0byB0aGUgZW5kIG9mCi0JICogdGhlIHNvdXJjZSByYW5nZS4gIFRoaXMgd2lsbCBiZSB0aGUgc291cmNlIGFmdGVyIHRoZSBuYW1lIHdoaWNoIGNvdWxkIGluY2x1ZGUgY29tbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWVsZEluaXRpYWxpemVyU291cmNlKCkgewotCQlJT3BlbmFibGUgb3BlbmFibGUgPSBnZXRTb3VyY2VGaWVsZCgpLmdldE9wZW5hYmxlKCk7Ci0JCXRyeSB7Ci0JCQlJU291cmNlUmFuZ2UgbmFtZVJhbmdlLCBzb3VyY2VSYW5nZTsKLQkJCWludCBzdGFydCA9IC0xLCBsZW5ndGggPSAwOwotCQkJSUJ1ZmZlciBidWZmZXIgPSBvcGVuYWJsZS5nZXRCdWZmZXIoKTsKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbmFtZVJhbmdlID0gZ2V0U291cmNlRmllbGQoKS5nZXROYW1lUmFuZ2UoKTsKLQkJCXN0YXJ0ID0gbmFtZVJhbmdlLmdldE9mZnNldCgpICsgbmFtZVJhbmdlLmdldExlbmd0aCgpOwotCQkJaWYgKHN0YXJ0ICE9IC0xKSB7Ci0JCQkJc291cmNlUmFuZ2UgPSBnZXRTb3VyY2VGaWVsZCgpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJaWYgKHNvdXJjZVJhbmdlLmdldE9mZnNldCgpICE9IC0xKQotCQkJCQlsZW5ndGggPSBzb3VyY2VSYW5nZS5nZXRPZmZzZXQoKSArIHNvdXJjZVJhbmdlLmdldExlbmd0aCgpIC0gc3RhcnQ7Ci0JCQkJcmV0dXJuIGJ1ZmZlci5nZXRUZXh0KHN0YXJ0LCBsZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpZWxkIHNvdXJjZSBzdHJpbmcgd2l0aG91dCBjb21tZW50cwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRJbml0aWFsaXplclNvdXJjZVdpdGhvdXRDb21tZW50cygpIHsKLQkJU3RyaW5nIHMgPSBnZXRGaWVsZEluaXRpYWxpemVyU291cmNlKCk7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBzdGFydENvbW1lbnQgPSAtMTsKLQkJaW50IGVuZENvbW1lbnQgPSAtMTsKLQkJd2hpbGUgKHN0YXJ0IDwgcy5sZW5ndGgoKSkgewotCQkJc3RhcnRDb21tZW50ID0gcy5pbmRleE9mKEJFR0lOX0NPTU1FTlQsIHN0YXJ0KTsKLQkJCWlmIChzdGFydENvbW1lbnQgPiAwKSB7Ci0JCQkJU3RyaW5nIG5ld1N0cmluZzsKLQkJCQllbmRDb21tZW50ID0gcy5pbmRleE9mKEVORF9DT01NRU5ULCBzdGFydCk7Ci0JCQkJbmV3U3RyaW5nID0gcy5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0Q29tbWVudCk7Ci0JCQkJcyA9IG5ld1N0cmluZyArIHMuc3Vic3RyaW5nKGVuZENvbW1lbnQgKyBFTkRfQ09NTUVOVC5sZW5ndGgoKSwgcy5sZW5ndGgoKSk7Ci0JCQkJc3RhcnQgPSAwOwotCQkJCXN0YXJ0Q29tbWVudCA9IC0xOwotCQkJCWVuZENvbW1lbnQgPSAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhcnQgPSBzLmxlbmd0aCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzOwotCX0KLQkvKioKLQkgKiBnZXRGaWVsZEluaXRpYWxpemVyU3RyaW5nIC0gcGFyc2UgdGhlIHNvdXJjZSBmb3Igb3VyIHNvdXJjZSBmaWVsZCAKLQkgKiAJYW5kIHJldHVybiB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotCSAqICBSZXR1cm4gbnVsbCBpZiBubyBpbml0aWFsaXphdGlvbiBzdHJpbmcgb3IgY29uc3RhbnQgdmFsdWUgaXMgcHJlc2VudC4KLQkgKiBpLmUuIC0gcHVibGljIFN0cmluZyBmb28gPSAiZm9vIGRlZmF1bHQiOyBzaG91bGQgcmV0dXJuICJmb28gZGVmYXVsdCIgKGluY2x1ZGluZyBxdW90ZXMpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWVsZEluaXRpYWxpemVyU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICghZ2V0UGFyZW50VHlwZSgpLmlzQmluYXJ5KCkpIHsKLQkJCQlTdHJpbmcgc291cmNlID0gZ2V0RmllbGRJbml0aWFsaXplclNvdXJjZVdpdGhvdXRDb21tZW50cygpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlpbnQgZXF1YWxzUG9zID0gc291cmNlLmluZGV4T2YoJz0nKTsvLyROT04tTkxTLTEkCi0JCQkJCWludCBlbmRQb3MgPSBzb3VyY2UuaW5kZXhPZignLCcpOy8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGVuZFBvcyA9PSAtMSkKLQkJCQkJCWVuZFBvcyA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7Ci0JCQkJCWlmIChlcXVhbHNQb3MgIT0gLTEpIHsKLQkJCQkJCS8vIENvcHkgZnJvbSBhZnRlciAiPSIgdG8gYmVmb3JlICI7IiBvciAiLCIKLQkJCQkJCXJlc3VsdCA9IHNvdXJjZS5zdWJzdHJpbmcoZXF1YWxzUG9zICsgMSwgZW5kUG9zKTsKLQkJCQkJCXJlc3VsdCA9IHJlc3VsdC50cmltKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEJpbmFyeSB0eXBlLCBzZWUgaWYgd2UgY2FuIHVzZSB0aGUgY29uc3RhbnQKLQkJCQkvLyBpdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBBUEkncywgYnV0IHRoaXMgaXMgcHJvYmFibHkgb25seQotCQkJCS8vIGF2YWlsYWJsZSBmb3Igc3RhdGljcy4KLQkJCQlPYmplY3QgY29uc3RhbnRWYWx1ZSA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0Q29uc3RhbnQoKTsKLQkJCQkvLyBOZWVkIHRvIGNvbnZlcnQgdGhlIGNvbnN0YW50IHRvIGEgU3RyaW5nCi0JCQkJaWYgKGNvbnN0YW50VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBjb25zdGFudFZhbHVlLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChjb25zdGFudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQlyZXN1bHQgPSAiXCIiICsgcmVzdWx0ICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHB1bnQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcwotCSAqIHdlJ3JlIGdvaW5nIHRvIGRvIHRoaXMgYSBsb3QsIHNvIGNhY2hlIGl0LgotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRQYXJlbnRUeXBlKCkgewotCQlpZiAocGFyZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlGaWVsZCB0YXJnZXRGaWVsZCA9IChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0RmllbGQuZ2V0SmF2YUNsYXNzKCk7Ci0JCQlpZiAocGFyZW50SmF2YUNsYXNzICE9IG51bGwpIHsKLQkJCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKHBhICE9IG51bGwpCi0JCQkJCXBhcmVudFR5cGUgPSBwYS5nZXRTb3VyY2VUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFR5cGU7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZUZpZWxkKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlRmllbGQgIT0gbnVsbDsKLSAgICB9Ci0JCi0JLyoKLQkgKiBVc2VkIGJ5IEphdmEgQ2xhc3MgSkRPTSBhZGFwdGVyIHRvIGNyZWF0ZSBhbmQgc2V0IHdpdGggYSBzb3VyY2UgZmllbGQKLQkgKi8JCi0JcHVibGljIHZvaWQgc2V0U291cmNlRmllbGQoSUZpZWxkIGZpZWxkKSB7Ci0JCXNvdXJjZUZpZWxkID0gZmllbGQ7Ci0JfQkKLQkvKioKLQkgKiBnZXRTb3VyY2VGaWVsZCAtIHJldHVybiB0aGUgSUZpZWxkIHdoaWNoIGRlc2NyaWJlcyBvdXIgaW1wbGVtZW50aW5nIGZpZWxkCi0JICovCi0JcHJvdGVjdGVkIElGaWVsZCBnZXRTb3VyY2VGaWVsZCgpIHsKLQkJaWYgKHNvdXJjZUZpZWxkID09IG51bGwgfHwgIXNvdXJjZUZpZWxkLmV4aXN0cygpKSB7Ci0JCQlJVHlwZSBwYXJlbnQgPSB0aGlzLmdldFBhcmVudFR5cGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQlzb3VyY2VGaWVsZCA9IHBhcmVudC5nZXRGaWVsZCgoKEZpZWxkKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gc291cmNlRmllbGQ7Ci0JfQotCXB1YmxpYyBGaWVsZEltcGwgZ2V0VGFyZ2V0RmllbGQoKSB7Ci0JCXJldHVybiAoRmllbGRJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRUeXBlKCk7Ci0JfQotCXByb3RlY3RlZCBNYXAgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpIHsKLQkJRmllbGQgZmllbGQgPSBnZXRUYXJnZXRGaWVsZCgpOwotCQlpZiAoZmllbGQgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IGZpZWxkLmdldEphdmFDbGFzcygpOwotCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSkRPTUFkYXB0b3IgY2xhc3NBZGFwdG9yID0gKEpET01BZGFwdG9yKSByZXRyaWV2ZUFkYXB0b3JGcm9tKGphdmFDbGFzcyk7Ci0JCQkJaWYgKGNsYXNzQWRhcHRvciAhPSBudWxsKQotCQkJCQlyZXR1cm4gY2xhc3NBZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIEphdmFDbGFzcyBhZGFwdG9yOgotCSAqCS0gc2V0IG1vZGlmaWVycwotCSAqCS0gc2V0IG5hbWUKLQkgKiAJLSBzZXQgdHlwZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJaWYgKGdldFNvdXJjZVByb2plY3QoKSAhPSBudWxsICYmIGdldFNvdXJjZUZpZWxkKCkgIT0gbnVsbCkgewotCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQkvLwlzZXROYW1pbmcoKTsKLQkJCXNldFR5cGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogc2V0TW9kaWZpZXJzIC0gc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHJlbGF0ZWQgdG8gbW9kaWZpZXJzIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RpZmllcnMoKSB7Ci0JCUZpZWxkIGphdmFGaWVsZFRhcmdldCA9IChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaW5pdGlhbGl6ZXIgPSBnZXRGaWVsZEluaXRpYWxpemVyU3RyaW5nKCk7Ci0JCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkKLQkJCQlqYXZhRmllbGRUYXJnZXQuc2V0SW5pdGlhbGl6ZXIoY3JlYXRlQmxvY2soamF2YUZpZWxkVGFyZ2V0LmdldE5hbWUoKSwgaW5pdGlhbGl6ZXIpKTsKLQkJCWludCBmbGFncyA9IGdldFNvdXJjZUZpZWxkKCkuZ2V0RmxhZ3MoKTsKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRGaW5hbChGbGFncy5pc0ZpbmFsKGZsYWdzKSk7Ci0JCQlqYXZhRmllbGRUYXJnZXQuc2V0U3RhdGljKEZsYWdzLmlzU3RhdGljKGZsYWdzKSk7Ci0JCQlqYXZhRmllbGRUYXJnZXQuc2V0VHJhbnNpZW50KEZsYWdzLmlzVHJhbnNpZW50KGZsYWdzKSk7Ci0JCQlqYXZhRmllbGRUYXJnZXQuc2V0Vm9sYXRpbGUoRmxhZ3MuaXNWb2xhdGlsZShmbGFncykpOwotCQkJLy8gU2V0IHZpc2liaWxpdHkKLQkJCWlmIChGbGFncy5pc1B1YmxpYyhmbGFncykpCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1ByaXZhdGUoZmxhZ3MpKQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJJVkFURV9MSVRFUkFMKTsKLQkJCWVsc2UgaWYgKEZsYWdzLmlzUHJvdGVjdGVkKGZsYWdzKSkKLQkJCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRF9MSVRFUkFMKTsKLQkJCWVsc2UKLQkJCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0VfTElURVJBTCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9JbnRyb3NwZWN0aW5nX0ZsYWdzX0VSUk9SXyIsIG5ldyBPYmplY3RbXSB7KChYTUlSZXNvdXJjZSkgamF2YUZpZWxkVGFyZ2V0LmVSZXNvdXJjZSgpKS5nZXRJRChqYXZhRmllbGRUYXJnZXQpLCBucGUuZ2V0TWVzc2FnZSgpfSkpOyAvLyROT04tTkxTLTEkID0gImVycm9yIGludHJvc3BlY3RpbmcgZmxhZ3Mgb24gezB9IgotCQl9Ci0JfQotCS8qKgotCSAqIHNldE5hbWluZyAtIHNldCB0aGUgbmFtaW5nIHZhbHVlcyBoZXJlCi0JICogCS0gcXVhbGlmaWVkIG5hbWUgbXVzdCBiZSBzZXQgZmlyc3QsIHRoYXQgaXMgdGhlIHBhdGggdG8gdGhlIHJlYWwgSmF2YSBjbGFzcwotCSAqCS0gSUQKLQkgKiAJLSBudWxsIFVVSUQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1pbmcoKSB7Ci0JCUZpZWxkIGphdmFGaWVsZFRhcmdldCA9IChGaWVsZCkgZ2V0VGFyZ2V0KCk7Ci0JCUphdmFDbGFzcyBwYXJlbnQgPSBqYXZhRmllbGRUYXJnZXQuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQkoKFhNSVJlc291cmNlKSBqYXZhRmllbGRUYXJnZXQuZVJlc291cmNlKCkpLnNldElEKGphdmFGaWVsZFRhcmdldCwgcGFyZW50LmdldE5hbWUoKSArICJfIiArIGphdmFGaWVsZFRhcmdldC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFR5cGUoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0eXBlTmFtZSA9IHR5cGVOYW1lRnJvbVNpZ25hdHVyZShnZXRTb3VyY2VGaWVsZCgpLmdldFR5cGVTaWduYXR1cmUoKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vIG5hbWUgc3RheXMgbnVsbCBhbmQgd2UgY2Fycnkgb24KLQkJfQotCQlzZXRGaWVsZFR5cGUoZ2V0VGFyZ2V0RmllbGQoKSwgdHlwZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMmQyYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzEzLzIwMDAgMToyMDozMSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IHsKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0vKioKLSAqIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEphdmFKRE9NQWRhcHRlckZhY3RvcnkoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogSmF2YUpET01BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YUpET01BZGFwdGVyRmFjdG9yeShJSmF2YVByb2plY3QgYUphdmFQcm9qZWN0KSB7Ci0JdGhpcygpOwotCXNldEphdmFQcm9qZWN0KGFKYXZhUHJvamVjdCk7Ci19Ci1wcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUNsYXNzQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQlyZXR1cm4gbmV3IEphdmFDbGFzc0pET01BZGFwdG9yKHRhcmdldCwgZ2V0SmF2YVByb2plY3QoKSwgdGhpcyk7Ci19Ci1wcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUZpZWxkQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQlyZXR1cm4gbmV3IEphdmFGaWVsZEpET01BZGFwdG9yKHRhcmdldCwgZ2V0SmF2YVByb2plY3QoKSk7Ci19Ci1wcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YU1ldGhvZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JcmV0dXJuIG5ldyBKYXZhTWV0aG9kSkRPTUFkYXB0b3IodGFyZ2V0LCBnZXRKYXZhUHJvamVjdCgpKTsKLX0KLS8qKgotICogIEZsdXNoIEFMTCBhZGFwdGVycywgd29yc3QgY2FzZQotICogV2UgYWxzbyB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBzb3VyY2UgdHlwZXMgYXJlIGFsc28gY2xlYXJlZAotICogaW4gdGhpcyB3b3JzdCBjYXNlIHNjZW5hcmlvLgotICovCi1wdWJsaWMgdm9pZCBmbHVzaEFsbCgpIHsKLQlkb0ZsdXNoKHJlZmxlY3RlZC52YWx1ZXMoKSx0cnVlLCB0cnVlKTsKLX0KLQotcHVibGljIExpc3QgZmx1c2hBbGxOb05vdGlmaWNhdGlvbigpIHsKLQlyZXR1cm4gZG9GbHVzaChyZWZsZWN0ZWQudmFsdWVzKCksdHJ1ZSwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCBmbHVzaFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JTGlzdCBhZGFwdG9ycyA9IGdldFJlZmxlY3RlZEZvclBhY2thZ2UocGFja2FnZU5hbWUsIG5vRmx1c2hJZlNvdXJjZUZvdW5kKTsKLQlkb0ZsdXNoKGFkYXB0b3JzLCB0cnVlLCB0cnVlKTsKLX0KLXB1YmxpYyBMaXN0IGZsdXNoUGFja2FnZU5vTm90aWZpY2F0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBub0ZsdXNoSWZTb3VyY2VGb3VuZCkgewotCUxpc3QgYWRhcHRvcnMgPSBnZXRSZWZsZWN0ZWRGb3JQYWNrYWdlKHBhY2thZ2VOYW1lLCBub0ZsdXNoSWZTb3VyY2VGb3VuZCk7Ci0JcmV0dXJuIGRvRmx1c2goYWRhcHRvcnMsIHRydWUsIGZhbHNlKTsKLX0KLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiByZWZsZWN0aW9uIGFkYXB0b3JzIHRoYXQgYmVsb25nIHRvIAotICogdGhlIHBhY2thZ2VOYW1lLgotICogQHBhcmFtIHBhY2thZ2VOYW1lCi0gKiBAcmV0dXJuCi0gKi8KLXByaXZhdGUgTGlzdCBnZXRSZWZsZWN0ZWRGb3JQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBmaWx0ZXJGb3VuZFR5cGVzKSB7Ci0JaWYgKHBhY2thZ2VOYW1lICE9IG51bGwgJiYgIXJlZmxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJSXRlcmF0b3IgaXQgPSByZWZsZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJTWFwLkVudHJ5IGVudHJ5OwotCQkJU3RyaW5nIGtleTsKLQkJCUphdmFDbGFzc0pET01BZGFwdG9yIGFkYXB0b3I7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJYWRhcHRvciA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZmlsdGVyRm91bmRUeXBlcyAmJiBhZGFwdG9yLnNvdXJjZVR5cGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJa2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYgKGtleS5zdGFydHNXaXRoKHBhY2thZ2VOYW1lKSAmJiBrZXkuaW5kZXhPZignLicsIHBhY2thZ2VOYW1lLmxlbmd0aCgpICsgMSkgPCAwKSB7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcmVzdWx0LmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9CQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLX0KLXByaXZhdGUgTGlzdCBkb0ZsdXNoKENvbGxlY3Rpb24gYWRhcHRvcnMsIGJvb2xlYW4gY2xlYXJTb3VyY2VUeXBlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JaWYgKCFhZGFwdG9ycy5pc0VtcHR5KCkpIHsKLQkJaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQkJTGlzdCBub3RpZmljYXRpb25zID0gZG9Ob3RpZnkgPyBudWxsIDogbmV3IEFycmF5TGlzdChhZGFwdG9ycy5zaXplKCkpOwotCQl0cnkgewotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbjsKLQkJCUl0ZXJhdG9yIGkgPSBhZGFwdG9ycy5pdGVyYXRvcigpOwotCQkJSkRPTUFkYXB0b3IgYWRhcHRvcjsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCWFkYXB0b3IgPSAoSkRPTUFkYXB0b3IpIGkubmV4dCgpOwotCQkJCWlmIChkb05vdGlmeSkKLQkJCQkJYWRhcHRvci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGNsZWFyU291cmNlVHlwZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW5vdGlmaWNhdGlvbiA9IGFkYXB0b3IuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGNsZWFyU291cmNlVHlwZSk7Ci0JCQkJCWlmIChub3RpZmljYXRpb24gIT0gbnVsbCkKLQkJCQkJCW5vdGlmaWNhdGlvbnMuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQkJfQotCQlyZXR1cm4gbm90aWZpY2F0aW9uczsKLQl9Ci0JcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci19Ci0vLyBGbHVzaCB0aGUgYWRhcHRlciBmb3IgYSBzb3VyY2Ugb2JqZWN0Ci1wdWJsaWMgdm9pZCBmbHVzaFJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkgewotCUpET01BZGFwdG9yIGEgPSAoSkRPTUFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoc291cmNlKTsKLQlpZiAoYSAhPSBudWxsKQotCQlhLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoKTsKLX0KLXB1YmxpYyBOb3RpZmljYXRpb24gZmx1c2hSZWZsZWN0aW9uTm9Ob3RpZmljYXRpb24oU3RyaW5nIHNvdXJjZSkgewotCUpET01BZGFwdG9yIGEgPSAoSkRPTUFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoc291cmNlKTsKLQlpZiAoYSAhPSBudWxsKQotCQlyZXR1cm4gYS5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oZmFsc2UpOwotCXJldHVybiBudWxsOwotfQotCi1wdWJsaWMgTm90aWZpY2F0aW9uIGZsdXNoUmVmbGVjdGlvblBsdXNJbm5lck5vTm90aWZpY2F0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBudWxsOwotCXRyeSB7Ci0JCVN0cmluZyBpbm5lck5hbWUgPSBzb3VyY2UgKyAnJCc7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVmbGVjdGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlTdHJpbmcga2V5OwotCQlKYXZhUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRvcjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChrZXkuZXF1YWxzKHNvdXJjZSkgfHwga2V5LnN0YXJ0c1dpdGgoaW5uZXJOYW1lKSkgewotCQkJCWFkYXB0b3IgPSAoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSByZWZsZWN0ZWQuZ2V0KGtleSk7Ci0JCQkJaWYgKGFkYXB0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAobm90aWZpY2F0aW9uID09IG51bGwpCi0JCQkJCQlub3RpZmljYXRpb24gPSBhZGFwdG9yLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihmYWxzZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCSgoTm90aWZpY2F0aW9uQ2hhaW4pIG5vdGlmaWNhdGlvbikuYWRkKGFkYXB0b3IuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQl9Ci0JcmV0dXJuIG5vdGlmaWNhdGlvbjsKLQotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMi8yMDAwIDM6MDI6MzEgUE0pCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmFwaS5JSmF2YVByb2plY3QKLSAqLwotcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQlyZXR1cm4gamF2YVByb2plY3Q7Ci19Ci0vKioKLSAqIENyZWF0ZSBhIEphdmEgTW9kZWwgbGlzdGVuZXIgd2hpY2ggd2lsbCBmbHVzaCBpbnZhbGlkYXRlZCBhZGFwdG9ycy4KLSAqIFRoaXMgd2lsbCBjYXVzZSB0aG9zZSBhZGFwdGVycyB0byByZS1yZWZsZWN0IHRoZWlyIHRhcmdldCBvYmplY3QncyBjb250ZW50cy4KLSAqLwotcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVN5bmNocm9uaXplcigpIHsKLQlzeW5jaHJvbml6ZXIgPSBuZXcgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIodGhpcyk7Ci19Ci0vKioKLSAqIE5vdGlmeSBhbGwgSkRPTUFkYXB0ZXJzIHdoaWNoIHVzZSB0aGUgc2FtZSB0YXJnZXQgSUNvbXBpbGF0aW9uVW5pdAotICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSA0OjQ1OjQzIFBNKQotICovCi1wdWJsaWMgdm9pZCBub3RpZnlDb250ZW50Q2hhbmdlZChJQ29tcGlsYXRpb25Vbml0IHRhcmdldENVKSB7Ci0KLQlpZiAodGFyZ2V0Q1UgPT0gbnVsbCB8fCByZWZsZWN0ZWQudmFsdWVzKCk9PW51bGwpIHJldHVybiA7Ci0JaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQl0cnkgewotCQlJdGVyYXRvciBpID0gcmVmbGVjdGVkLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGEgPSAoUmVmbGVjdGlvbkFkYXB0b3IpIGkubmV4dCgpIDsKLQkJCWlmIChhIGluc3RhbmNlb2YgSkRPTUFkYXB0b3IpIHsKLQkJCQlKRE9NQWRhcHRvciBhZGFwdG9yID0gKEpET01BZGFwdG9yKSBhOwotCQkJCUlNZW1iZXIgcmVmbGVjdGlvblNvdXJjZSA9IChJTWVtYmVyKSBhZGFwdG9yLmdldFJlZmxlY3Rpb25Tb3VyY2UoKTsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGFkYXB0ZXJDVSA9IG51bGwgOwotCQkJCWlmIChyZWZsZWN0aW9uU291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJICAgYWRhcHRlckNVID0gcmVmbGVjdGlvblNvdXJjZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHt9IAotCQkJCX0KLQkJCQlpZiAoYWRhcHRlckNVICE9IG51bGwgJiYgdGFyZ2V0Q1UuZXF1YWxzKGFkYXB0ZXJDVSkpIHsKLQkJCSAgICAgICBhZGFwdG9yLmNvbnRlbnRDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsgIAkKLQl9Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yLzIwMDAgMzowMjozMSBQTSkKLSAqIEBwYXJhbSBuZXdKYXZhUHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QKLSAqLwotcHVibGljIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IG5ld0phdmFQcm9qZWN0KSB7Ci0JamF2YVByb2plY3QgPSBuZXdKYXZhUHJvamVjdDsKLQlpZiAobmV3SmF2YVByb2plY3QgIT0gbnVsbCAmJiBzeW5jaHJvbml6ZXIgPT0gbnVsbCkKLQkJaW5pdGlhbGl6ZVN5bmNocm9uaXplcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTWV0aG9kSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1ldGhvZEpET01BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmNjYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTWV0aG9kSkRPTUFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBKYXZhTWV0aG9kSkRPTUFkYXB0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTMgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MjcgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLk1ldGhvZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLQotLyoqCi0gKiBKYXZhIE1ldGhvZCBSZWZsZWN0aW9uIEFkYXB0ZXIgZm9yIEpET00gKGkuZS4gSkRUIG1vZGVsKQotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhTWV0aG9kSkRPTUFkYXB0b3IgZXh0ZW5kcyBKRE9NQWRhcHRvciBpbXBsZW1lbnRzIElKYXZhTWV0aG9kQWRhcHRlciAgewotCi0JLyoKLQkgKiBTdGVwIGlkcyB1c2VkIGZvciBUaW1lclRlc3RzIG9mIHBlcmZvcm1hbmNlIHRlc3RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9NRVRIT0QgPSAiUmVmbGVjdCBKRE9NIE1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJTWV0aG9kIHNvdXJjZU1ldGhvZCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgcGFyZW50VHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgSmF2YU1ldGhvZEpET01BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXN1cGVyKHRhcmdldCwgd29ya2luZ1Byb2plY3QpOwotCX0KLQotCQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlpZiAoY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkKLQkJCWNsZWFyU291cmNlKCk7Ci0JCU1ldGhvZEltcGwgbWV0aG9kID0gKE1ldGhvZEltcGwpIGdldFRhcmdldCgpOwotCQltZXRob2Quc2V0SXNHZW5lcmF0ZWQoZmFsc2UpOwotCQltZXRob2Quc2V0RmluYWwoZmFsc2UpOwotCQltZXRob2Quc2V0TmF0aXZlKGZhbHNlKTsKLQkJbWV0aG9kLnNldFN0YXRpYyhmYWxzZSk7Ci0JCW1ldGhvZC5zZXRTeW5jaHJvbml6ZWQoZmFsc2UpOwotCQltZXRob2Quc2V0Q29uc3RydWN0b3IoZmFsc2UpOwotCQltZXRob2Quc2V0QWJzdHJhY3QoZmFsc2UpOwotCQltZXRob2Quc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJbWV0aG9kLnNldEVUeXBlKG51bGwpOwotCQltZXRob2QuZ2V0UGFyYW1ldGVyc0dlbigpLmNsZWFyKCk7Ci0JCW1ldGhvZC5nZXRKYXZhRXhjZXB0aW9uc0dlbigpLmNsZWFyKCk7CQkKLQkJcGFyZW50VHlwZSA9IG51bGw7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGlzRXhpc3RpbmcpIHsKLQkJKChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKSkuc2V0UmVmbGVjdGVkKGZhbHNlKTsKLQkJc3VwZXIucG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoaXNFeGlzdGluZyk7Ci0JfQkKLQkvKioKLQkgKiBhZGRFeGNlcHRpb25zIC0gcmVmbGVjdCBvdXIgZXhjZXB0aW9uIGxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGNlcHRpb25zKCkgewotCQl0cnkgewotCQkJSU1ldGhvZCBzb3VyY2VNZXRob2QgPSBnZXRTb3VyY2VNZXRob2QoKTsKLQkJCVN0cmluZ1tdIGV4Y2VwdGlvbk5hbWVzID0gc291cmNlTWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0JCQlMaXN0IGV4Y2VwdGlvbnMgPSAoKE1ldGhvZEltcGwpIGdldFRhcmdldCgpKS5nZXRKYXZhRXhjZXB0aW9uc0dlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWV4Y2VwdGlvbnMuYWRkKGNyZWF0ZUphdmFDbGFzc1JlZih0eXBlTmFtZUZyb21TaWduYXR1cmUoZXhjZXB0aW9uTmFtZXNbaV0pKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vIG5hbWUgc3RheXMgbnVsbCBhbmQgd2UgY2Fycnkgb24KLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7Ci0JCVN0cmluZ1tdIHBhcm1OYW1lcyA9IG5ldyBTdHJpbmdbMF0sIHBhcm1UeXBlTmFtZXMgPSBnZXRTb3VyY2VNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQl0cnkgewotCQkJcGFybU5hbWVzID0gZ2V0U291cmNlTWV0aG9kKCkuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JCS8vIFRlbXAgaGFjayB0byB3b3JrIGFyb3VuZCBhIEphdmFNb2RlbCBidWcsIGFib3ZlIGNhbGwgb24gYSBCaW5hcnkgbWV0aG9kIG1heSByZXR1cm4gbnVsbAotCQlpZiAocGFybU5hbWVzID09IG51bGwgfHwgcGFybU5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlwYXJtTmFtZXMgPSBuZXcgU3RyaW5nW3Bhcm1UeXBlTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1OYW1lc1tpXSA9ICJhcmciICsgaTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCi0JCXJldHVybiBwYXJtTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogYWRkUGFyYW1ldGVycyAtIHJlZmxlY3Qgb3VyIHBhcm1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1ldGVycygpIHsKLQkJU3RyaW5nW10gcGFybVR5cGVOYW1lcyA9IGdldFNvdXJjZU1ldGhvZCgpLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCU1ldGhvZEltcGwgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKTsKLQkJTGlzdCBwYXJhbXMgPSBqYXZhTWV0aG9kVGFyZ2V0LmdldFBhcmFtZXRlcnNHZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXJhbXMuYWRkKGNyZWF0ZUphdmFQYXJhbWV0ZXIoamF2YU1ldGhvZFRhcmdldCwgbnVsbCwgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKHBhcm1UeXBlTmFtZXNbaV0pKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJc291cmNlTWV0aG9kID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnRUeXBlIC0gcmV0dXJuIHRoZSBJVHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byBvdXIgcGFyZW50IEphdmFDbGFzcyB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJTWV0aG9kIHRhcmdldE1ldGhvZCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQkJSmF2YUNsYXNzIHBhcmVudEphdmFDbGFzcyA9IHRhcmdldE1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQlpZiAocGEgIT0gbnVsbCkKLQkJCQlwYXJlbnRUeXBlID0gcGEuZ2V0U291cmNlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBwYXJlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIGdldFBhcm1UeXBlU2lnbmF0dXJlcyAtIHJldHVybiBhbiBhcnJheSBvZiBTdHJpbmdzIChpbiBTaWduYXR1cmUgZm9ybWF0KSBmb3Igb3VyIHBhcmFtZXRlciB0eXBlcyBGb3IgcmVmbGVjdGlvbiBwdXJwb3Nlcywgd2UgY2FuIG9ubHkgcmVseSBvbgotCSAqIG91ciBVVUlELCBzaW5jZSBvdXIgcGFybXMgbWF5IG5vdCB5ZXQgYmUga25vd24uIHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5Tb3VyY2VNYXBwZXIuY29udmVydFR5cGVOYW1lc1RvU2lncygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcm1UeXBlU2lnbmF0dXJlcygpIHsKLQkJTWV0aG9kIGphdmFNZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJU3RyaW5nW10gdHlwZU5hbWVzID0gZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCgoWE1JUmVzb3VyY2UpIGphdmFNZXRob2RUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKGphdmFNZXRob2RUYXJnZXQpKTsKLQkJaWYgKHR5cGVOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5U3RyaW5nQXJyYXk7Ci0JCWludCBuID0gdHlwZU5hbWVzLmxlbmd0aDsKLQkJaWYgKG4gPT0gMCkKLQkJCXJldHVybiBlbXB0eVN0cmluZ0FycmF5OwotCQlTdHJpbmdbXSB0eXBlU2lncyA9IG5ldyBTdHJpbmdbbl07Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotCQkJCXR5cGVTaWdzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUobmV3IFN0cmluZyh0eXBlTmFtZXNbaV0pLCBnZXRQYXJlbnRUeXBlKCkuaXNCaW5hcnkoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiB0eXBlU2lnczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VNZXRob2QoKTsKLQl9Ci0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VNZXRob2QgIT0gbnVsbDsKLSAgICB9Ci0KLQkvKgotCSAqIFVzZWQgYnkgSmF2YSBDbGFzcyBKRE9NIGFkYXB0ZXIgdG8gY3JlYXRlIGFuZCBzZXQgd2l0aCBhIHNvdXJjZSBtZXRob2QvCi0JICovCQotCXB1YmxpYyB2b2lkIHByaW1TZXRNZXRob2QoSU1ldGhvZCBtZXRob2QpIHsKLQkJc291cmNlTWV0aG9kID0gbWV0aG9kOwotCX0KLQkvKioKLQkgKiBnZXRzb3VyY2VNZXRob2QgLSByZXR1cm4gdGhlIElNZXRob2Qgd2hpY2ggZGVzY3JpYmVzIG91ciBpbXBsZW1lbnRpbmcgbWV0aG9kCi0JICovCi0JcHVibGljIElNZXRob2QgZ2V0U291cmNlTWV0aG9kKCkgewotCQlpZiAoKHNvdXJjZU1ldGhvZCA9PSBudWxsKSB8fCAoIXNvdXJjZU1ldGhvZC5leGlzdHMoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJSVR5cGUgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnRUeXBlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1OYW1lcyA9IHRoaXMuZ2V0UGFybVR5cGVTaWduYXR1cmVzKCk7Ci0JCQkJCXNvdXJjZU1ldGhvZCA9IEpET01TZWFyY2hIZWxwZXIuc2VhcmNoRm9yTWF0Y2hpbmdNZXRob2QocGFyZW50LCAoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSwgcGFybU5hbWVzKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VNZXRob2Q7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkgewotCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IG1ldGhvZC5nZXRKYXZhQ2xhc3MoKTsKLQkJCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJCUpET01BZGFwdG9yIGNsYXNzQWRhcHRvciA9IChKRE9NQWRhcHRvcikgcmV0cmlldmVBZGFwdG9yRnJvbShqYXZhQ2xhc3MpOwotCQkJCWlmIChjbGFzc0FkYXB0b3IgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGNsYXNzQWRhcHRvci5nZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCi0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4gb24gZW50cnk6IFVVSUQsIG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwKLQkgKiBhbmQgZG9jdW1lbnQgbXVzdCBiZSBzZXQuIE1ldGhvZCBhZGFwdG9yOiAtIHNldCBtb2RpZmllcnMgLSBzZXQgbmFtZSAtIHNldCByZXR1cm4gdHlwZSAtIGFkZCBwYXJhbWV0ZXJzIC0gYWRkIGV4Y2VwdGlvbnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlzdXBlci5yZWZsZWN0VmFsdWVzKCk7Ci0JCXRyeSB7Ci0JCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfTUVUSE9EKTsKLQkJCWlmIChnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VNZXRob2QoKSAhPSBudWxsICYmIHNvdXJjZU1ldGhvZC5leGlzdHMoKSkgewotCQkJCXNldE1vZGlmaWVycygpOwotCQkJCXNldE5hbWluZygpOwotCQkJCXNldFJldHVyblR5cGUoKTsKLQkJCQlhZGRQYXJhbWV0ZXJzKCk7Ci0JCQkJYWRkRXhjZXB0aW9ucygpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfTUVUSE9EKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBnZW5lcmF0ZWQgZmxhZyBpZiBAZ2VuZXJhdGVkIGlzIGZvdW5kIGluIHRoZSBzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0R2VuZXJhdGVkRmxhZygpIHsKLQkJTWV0aG9kIG1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZU1ldGhvZCgpLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaW50IGluZGV4ID0gc291cmNlLmluZGV4T2YoTWV0aG9kLkdFTkVSQVRFRF9DT01NRU5UX1RBRyk7Ci0JCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJbWV0aG9kVGFyZ2V0LnNldElzR2VuZXJhdGVkKHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9TZXR0aW5nX0dlbkZsYWdfRVJST1JfIiwgbmV3IE9iamVjdFtdCi0JCQkvLyB7KChYTUlSZXNvdXJjZSltZXRob2RUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKG1ldGhvZFRhcmdldCksIG5wZS5nZXRNZXNzYWdlKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiZXJyb3Igc2V0dGluZyB0aGUgZ2VuZXJhdGVkIGZsYWcgb24KLQkJCS8vIHswfSwgZXhjZXB0aW9uOiB7MX0iCi0JCX0KLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXIjcmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSkgewotCQkJc2V0R2VuZXJhdGVkRmxhZygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkpIHsKLQkJCVN0cmluZyBbXSBwYXJhbU5hbWVzID0gZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJCUxpc3QgcGFyYW0gPSAoKE1ldGhvZEltcGwpZ2V0VGFyZ2V0KCkpLmdldFBhcmFtZXRlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCSgoSmF2YVBhcmFtZXRlcilwYXJhbS5nZXQoaSkpLnNldE5hbWUocGFyYW1OYW1lc1tpXSk7CQkJCQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJTWV0aG9kIG1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJbWV0aG9kVGFyZ2V0LnNldEZpbmFsKEZsYWdzLmlzRmluYWwoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJbWV0aG9kVGFyZ2V0LnNldE5hdGl2ZShGbGFncy5pc05hdGl2ZShnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSk7Ci0JCQltZXRob2RUYXJnZXQuc2V0U3RhdGljKEZsYWdzLmlzU3RhdGljKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCW1ldGhvZFRhcmdldC5zZXRTeW5jaHJvbml6ZWQoRmxhZ3MuaXNTeW5jaHJvbml6ZWQoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJbWV0aG9kVGFyZ2V0LnNldENvbnN0cnVjdG9yKGdldFNvdXJjZU1ldGhvZCgpLmlzQ29uc3RydWN0b3IoKSk7Ci0KLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCQkvL1NldCBhYnN0cmFjdAotCQkJaWYgKGphdmFDbGFzcy5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBUeXBlS2luZC5JTlRFUkZBQ0UpCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEFic3RyYWN0KHRydWUpOwotCQkJZWxzZQotCQkJCW1ldGhvZFRhcmdldC5zZXRBYnN0cmFjdChGbGFncy5pc0Fic3RyYWN0KGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCS8vIFNldCB2aXNpYmlsaXR5Ci0JCQlpZiAoamF2YUNsYXNzLmdldEtpbmQoKS5nZXRWYWx1ZSgpID09IFR5cGVLaW5kLklOVEVSRkFDRSB8fCBGbGFncy5pc1B1YmxpYyhnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJCWVsc2UgaWYgKEZsYWdzLmlzUHJpdmF0ZShnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1Byb3RlY3RlZChnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRF9MSVRFUkFMKTsKLQkJCWVsc2UKLQkJCQkvL1Zpc2liaWxpdHkgbXVzdCBiZSBwYWNrYWdlCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKFJlc291cmNlSGFuZGxlcgotCQkJCQkJCS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkiRXJyb3JfSW50cm9zcGVjdGluZ19GbGFnc19FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgKChYTUlSZXNvdXJjZSkgbWV0aG9kVGFyZ2V0LmVSZXNvdXJjZSgpKS5nZXRJRChtZXRob2RUYXJnZXQpLCBucGUuZ2V0TWVzc2FnZSgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJlcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfSwgZXhjZXB0aW9uOiB7MX0iCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZSAtIHF1YWxpZmllZCBuYW1lIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MgLSBJRCAtIG5hbWUtYmFzZWQgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJLy8KLQkJLy8JbmFtaW5nIGlzIGN1cnJlbnRseSBhIG5vLW9wIHNpbmNlIHRoZSBuYW1lIGFuZCBVVUlEIG11c3QgYmUgc2V0IHByaW9yIHRvIHJlZmxlY3Rpb24KLQkJLy8JLi4uYW5kIElEIGlzIHJlZHVuZGFudCB3aXRoIFVVSUQuCi0JCS8vCWphdmFGaWVsZFRhcmdldC5zZXRJRChwYXJlbnQuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIl8iICsgamF2YUZpZWxkVGFyZ2V0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgcmV0dXJuIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJldHVyblR5cGUoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0eXBlTmFtZSA9IHR5cGVOYW1lRnJvbVNpZ25hdHVyZShnZXRTb3VyY2VNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBuYW1lIHN0YXlzIG51bGwgYW5kIHdlIGNhcnJ5IG9uCi0JCX0KLQkJaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJCU1ldGhvZCBqYXZhTWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlqYXZhTWV0aG9kVGFyZ2V0LnNldEVUeXBlKGNyZWF0ZUphdmFDbGFzc1JlZih0eXBlTmFtZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMy8yMDAxIDEwOjA4OjM0IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTb3VyY2VNZXRob2QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VNZXRob2Qob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCBuZXdTb3VyY2VNZXRob2QpIHsKLQkJc291cmNlTWV0aG9kID0gbmV3U291cmNlTWV0aG9kOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1vZGVsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjZjJiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFNb2RlbExpc3RlbmVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MTM6NTMgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMzEvMjAwMCAxOjEzOjEyIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0JCi0vKioKLSAqIEphdmFNb2RlbExpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhTW9kZWxMaXN0ZW5lcigpIHsKLQl0aGlzKEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9DSEFOR0UpOwotfQotCi1wdWJsaWMgSmF2YU1vZGVsTGlzdGVuZXIoaW50IGV2ZW50c1RvTGlzdGVuKSB7Ci0JSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLCBldmVudHNUb0xpc3Rlbik7Ci19Ci0vKioKLSAqIE9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2Ygb25lIG9yIG1vcmUgZWxlbWVudHMgbWFpbnRhaW5lZCBieQotICogdGhlIEphdmEgbW9kZWwgaGF2ZSBjaGFuZ2VkLiBUaGUgc3BlY2lmaWMgZGV0YWlscyBvZiB0aGUgY2hhbmdlCi0gKiBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiA8Y29kZT5FbGVtZW50Q2hhbmdlZEV2ZW50PC9jb2RlPi4KLSAqCi0gKiBAc2VlIEVsZW1lbnRDaGFuZ2VkRXZlbnQKLSAqLwotcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCXByb2Nlc3NEZWx0YSgoSUphdmFFbGVtZW50RGVsdGEpIGV2ZW50LmdldFNvdXJjZSgpKTsKLX0KLS8qKgotICogR2VuZXJpY2FsbHkgZGlzcGF0Y2ggdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWx0YS4KLSAqCi0gKi8KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGlsZHJlbihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJcHJvY2Vzc0RlbHRhKGNoaWxkcmVuW2ldKTsKLQl9Ci19Ci0vKioKLSAqIFNvdXJjZSBjb250ZXh0IGhhcyBiZWVuIGNoYW5nZWQuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDM6NTg6MzEgUE0pCi0gKiBAcGFyYW0gcGFyYW0gb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGEKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbnRlbnRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JICAvLyBvdmVycmlkZSB0byBpbXBsZW1lbnQgc3BlY2lmaWMgYmVoYXZpb3IKLX0KLS8qKgotICogRGlzcGF0Y2ggdGhlIGRldGFpbGVkIGhhbmRsaW5nIG9mIGFuIGVsZW1lbnQgY2hhbmdlZCBldmVudC4KLSAqCi0gKiBAc2VlIEVsZW1lbnRDaGFuZ2VkRXZlbnQKLSAqLwotcHVibGljIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCi0Jc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCA6Ci0JCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJSmF2YU1vZGVsKSBlbGVtZW50LCBkZWx0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKLQkJCXByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoKElKYXZhUHJvamVjdCkgZWxlbWVudCwgZGVsdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6Ci0JCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCwgZGVsdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCwgZGVsdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCwgZGVsdGEpOwotCQkJcHJvY2Vzc0NvbnRlbnRDaGFuZ2VkKGRlbHRhKSA7ICAgCi0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRSA6Ci0JCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJQ2xhc3NGaWxlKSBlbGVtZW50LCBkZWx0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6Ci0JCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJVHlwZSkgZWxlbWVudCwgZGVsdGEpOwotCQkJYnJlYWs7Ci0JCS8vIE5vdGU6IGlmIHdlIGFyZSB0byB1cGRhdGUgdGhlIE1ldGhvZC9GaWVsZCBhZGFwdGVycywgd2Ugc2hvdWxkIHByb2Nlc3MgdGhlCi0JCS8vICAgICAgIElKYXZhRWxlbWVudC5NRVRIT0QgYW5kIElKYXZhRWxlbWVudC5GSUVMRCAKLQl9CQotfQotLyoqCi0gKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0gKgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDbGFzc0ZpbGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkvLyBvdmVycmlkZSB0byBpbXBsZW1lbnQgc3BlY2lmaWMgYmVoYXZpb3IKLX0KLS8qKgotICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICoKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLX0KLS8qKgotICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICoKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YU1vZGVsIGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLX0KLS8qKgotICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICoKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJSmF2YVByb2plY3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotfQotLyoqCi0gKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0gKgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotfQotLyoqCi0gKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0gKgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnRSb290IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLX0KLS8qKgotICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICoKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJVHlwZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCS8vIG92ZXJyaWRlIHRvIGltcGxlbWVudCBzcGVjaWZpYyBiZWhhdmlvcgotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0NsYXNzUGF0aENoYW5nZShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JcmV0dXJuIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpICE9IDApIHx8ICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpICE9IDApIHx8ICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFT1JERVIpICE9IDApKTsKLX0KLQotLyoqCi0gKiBNZXRob2QgaXNDbGFzc3BhdGhSZXNvdXJjZUNoYW5nZS4KLSAqIEBwYXJhbSBkZWx0YQotICogQHJldHVybiBib29sZWFuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NwYXRoUmVzb3VyY2VDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQlJUmVzb3VyY2VEZWx0YVtdIHJlc291cmNlcyA9IGRlbHRhLmdldFJlc291cmNlRGVsdGFzKCk7Ci0JaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JSVBhdGggcGF0aCA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHJlc291cmNlc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJcGF0aCA9IHJlc291cmNlc1tpXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQlpZiAoaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKHBhdGgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBJcyB0aGlzIHBhdGggYWxzbyBhIGNsYXNzcGF0aCBjaGFuZ2UgdHlwZSBvZiByZXNvdXJjZS4gSWYgc28sIHJldHVybiB0cnVlLgotICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuIERlZmF1bHQgaXMgZmFsc2UuCi0gKiBAcGFyYW0gcGF0aAotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKElQYXRoIHBhdGgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCBjaGVjayB0byBzZWUgaWYgYSA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4gaXMgYSBwcm9qZWN0IGluIHRoZQotICogY2xhc3NwYXRoIG9mIHRoZSBhZGFwdGVyRmFjdG9yeSBqYXZhIHByb2plY3QuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGlzSW5DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JSUphdmFQcm9qZWN0IGFkYXB0ZXJKYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCk7Ci0JaWYgKGphdmFQcm9qZWN0LmVxdWFscyhhZGFwdGVySmF2YVByb2plY3QpKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gaXNJbkNsYXNzcGF0aChqYXZhUHJvamVjdCwgYWRhcHRlckphdmFQcm9qZWN0LCB0cnVlLCBuZXcgSGFzaFNldCgpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGphdmEgcHJvamVjdCB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLgotICogQHJldHVybgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHJvdGVjdGVkIGFic3RyYWN0IElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0vKgotICogdGVzdCB0byBzZWUgaWYgdGhlIHRlc3RQcm9qZWN0IGlzIGluIHRoZSBjbGFzc3BhdGggKGluY2x1ZGluZyBmcm9tIGFueSByZWZlcmVuY2VkIHByb2plY3RzKSBvZiB0aGUgdGFyZ2V0IHByb2plY3QuCi0gKiBLZWVwIHRyYWNrIG9mIHRob3NlIGFscmVhZHkgdmlzaXRlZCBzbyBhcyBub3QgdG8gdmlzaXQgYWdhaW4uCi0gKiBUT0RPIFRoaXMgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZS4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNJbkNsYXNzcGF0aChJSmF2YVByb2plY3QgdGVzdFByb2plY3QsIElKYXZhUHJvamVjdCB0YXJnZXRQcm9qZWN0LCBib29sZWFuIGlzRmlyc3RMZXZlbCwgU2V0IHZpc2l0ZWQpIHsKLQlpZiAodmlzaXRlZC5jb250YWlucyh0YXJnZXRQcm9qZWN0KSkKLQkJcmV0dXJuIGZhbHNlOwotCXZpc2l0ZWQuYWRkKHRhcmdldFByb2plY3QpOwotCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOwotCXRyeSB7Ci0JCWVudHJpZXMgPSB0YXJnZXRQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCByZXNFbnRyeTsKLQlJSmF2YVByb2plY3QgcHJvaiA9IG51bGw7Ci0JTGlzdCBwcm9qZWN0cyA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWVudHJ5ID0gZW50cmllc1tpXTsKLQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewotCQkJcmVzRW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KTsKLQkJCXByb2ogPSBnZXRKYXZhUHJvamVjdChlbnRyeSk7Ci0JCQlpZiAoaXNGaXJzdExldmVsIHx8IHJlc0VudHJ5LmlzRXhwb3J0ZWQoKSkgewotCQkJCWlmIChwcm9qLmVxdWFscyh0ZXN0UHJvamVjdCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgewotCQkJCQlpZiAocHJvamVjdHMgPT0gbnVsbCkKLQkJCQkJCXByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlwcm9qZWN0cy5hZGQocHJvaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBpc0luQ2xhc3NwYXRoKHRlc3RQcm9qZWN0LCBwcm9qZWN0cywgZmFsc2UsIHZpc2l0ZWQpOwotfQotCi0vKgotICogU2VlIGlmIHRoZSB0ZXN0UHJvamVjdCBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIGFueSBvZiB0aGUgbGlzdCBvZiBwcm9qZWN0cyBvciBpbiBhbnkgcHJvamVjdCB0aGF0IGFuIGVudHJ5Ci0gKiBpbiB0aGUgbGlzdCBtYXkgb2YgdmlzaXRlZC4KLSAqIFRPRE8gVGhpcyBzaG91bGQgYmUgbWFkZSBwcml2YXRlLgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0luQ2xhc3NwYXRoKElKYXZhUHJvamVjdCB0ZXN0UHJvamVjdCwgTGlzdCBzb21lSmF2YVByb2plY3RzLCBib29sZWFuIGlzRmlyc3RMZXZlbCwgU2V0IHZpc2l0ZWQpIHsKLQlpZiAoc29tZUphdmFQcm9qZWN0cyA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JaW50IHNpemUgPSBzb21lSmF2YVByb2plY3RzLnNpemUoKTsKLQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBudWxsOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCWphdmFQcm9qID0gKElKYXZhUHJvamVjdCkgc29tZUphdmFQcm9qZWN0cy5nZXQoaSk7Ci0JCXJldHVybiBpc0luQ2xhc3NwYXRoKHRlc3RQcm9qZWN0LCBqYXZhUHJvaiwgaXNGaXJzdExldmVsLCB2aXNpdGVkKTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCUlQcm9qZWN0IHByb2ogPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7Ci0JaWYgKHByb2ogIT0gbnVsbCkKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qKTsKLQlyZXR1cm4gbnVsbDsKLX0KLQotcHJvdGVjdGVkIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFSZWZsZWN0aW9uU3luY2hyb25pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFSZWZsZWN0aW9uU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjllYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhUmVmbGVjdGlvblN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzEvMjAwMCAxMTo0MjowNSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIGV4dGVuZHMgSmF2YU1vZGVsTGlzdGVuZXIgewotCQotCXByb3RlY3RlZCBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGZBZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoZWRBbGwgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCBmbHVzaFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGZsdXNoVHlwZVBsdXNJbm5lciA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBub3RpZmljYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCS8qKgotCSAqIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyKEphdmFKRE9NQWRhcHRlckZhY3Rvcnkgc3luY2hyb25pemVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IHN5bmNocm9uaXplZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmdldEphdmFQcm9qZWN0KCk7Ci0JfQkKLQkvKioKLQkgKiBUZWxsIHRoZSByZWZsZWN0aW9uIGZhY3RvcnkgdG8gZmx1c2ggdGhlIHBhc3NlZCBJVHlwZQotCSAqLwotCXByb3RlY3RlZCBOb3RpZmljYXRpb24gZG9GbHVzaChJVHlwZSBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmZsdXNoUmVmbGVjdGlvbk5vTm90aWZpY2F0aW9uKGVsZW1lbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCX0KLQkKLQkvKgotCSAqIEZsdXNoIHRoZSBjb21waWxhdGlvbiB1bml0IGFuZCBhbnkgaW5uZXIgY2xhc3NlcyBzaW5jZSB3ZSBkb24ndCBpZiB0aGV5IG1heSBvciBtYXkgbm90IG9mIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIE5vdGlmaWNhdGlvbiBkb0ZsdXNoKElDb21waWxhdGlvblVuaXQgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaFJlZmxlY3Rpb25QbHVzSW5uZXJOb05vdGlmaWNhdGlvbihnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2goSVR5cGUgZWxlbWVudCkgewotCQlpZiAoIWZsdXNoVHlwZXMuY29udGFpbnMoZWxlbWVudCkpCi0JCQlmbHVzaFR5cGVzLmFkZChlbGVtZW50KTsKLQl9Ci0JLyoKLQkgKiBmbHVzaCB0aGUgY29tcGlsYXRpb24gdW5pdC4gU2luY2Ugd2UgZG9uJ3Qga25vdyBpZiBpbm5lciBjbGFzc2VzIG1heSBhbHNvCi0JICogb2YgYmVlbiBhZmZlY3RlZCwgdGhleSB0byB3aWxsIGJlIGZsdXNoZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2goSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50KSB7Ci0JCWlmICghZmx1c2hUeXBlUGx1c0lubmVyLmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJZmx1c2hUeXBlUGx1c0lubmVyLmFkZChlbGVtZW50KTsJCQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JCW5vdGlmaWNhdGlvbnMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hQYWNrYWdlTm9Ob3RpZmljYXRpb24ocGFja2FnZU5hbWUsIHRydWUpKTsKLQl9Ci0JcHJvdGVjdGVkIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmQWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEIDogewotCQkJCS8vIEEgZmlsZSBzYXZlIGhhZCBvY2N1cnJlZC4gSXQgZG9lc24ndCBtYXR0ZXIgaWYgY3VycmVudGx5IHdvcmtpbmcgY29weSBvciBub3QuCi0JCQkJLy8gSXQgbWVhbnMgc29tZXRoaW5nIGhhcyBjaGFuZ2VkIHRvIHRoZSBmaWxlIG9uIGRpc2ssIGJ1dCBkb24ndCBrbm93IHdoYXQuCi0JCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB7Ci0JCQkJCWZsdXNoKGVsZW1lbnQpOwkvLyBGbHVzaCBldmVyeXRoaW5nLCBpbmNsdWRpbmcgaW5uZXIgY2xhc3Nlcy4JCQkJCQotCQkJCX0gZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpID09IDAgJiYgCi0JCQkJCQkoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pICE9IDApICAvL0EgdHlwZSBtYXkgaGF2ZSBiZWVuIGFkZGVkIG9yIHJlbW92ZWQuCi0JCQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6Ci0JCQkJaWYgKCFlbGVtZW50LmlzV29ya2luZ0NvcHkoKSkKLQkJCQkJZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFQcm9qZWN0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChpc0luQ2xhc3NwYXRoKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpIHsKLQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoZ2V0QWRhcHRlckZhY3RvcnkoKS5nZXRKYXZhUHJvamVjdCgpKSkKLQkJCQkJc3RvcFN5bmNocm9uaXplcigpOwotCQkJCWVsc2UKLQkJCQkJZmx1c2hBbGwoKTsgLy9hbm90aGVyIGRlcGVuZGVudCBwcm9qZWN0IGhhcyBjaGFuZ2VkIHNvIGZsdXNoIGFsbCB0byBiZSBzYWZlCi0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQgfHwgaXNDbGFzc3BhdGhSZXNvdXJjZUNoYW5nZShkZWx0YSkpIHsKLQkJCQlmbHVzaEFsbCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNsYXNzRmlsZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCBraW5kID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQkvLyBJdCBkb2Vzbid0IG1hdHRlciBpZiB0b3RhbGx5IHJlbW92ZWQgb3IganVzdCBtb3ZlZCBzb21ld2hlcmUgZWxzZSwgd2Ugd2lsbCBjbGVhciBvdXQgYW5kIHJlbW92ZSB0aGUKLQkJCS8vIGFkYXB0ZXIgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIHJlbmFtZSB3aGljaCB3b3VsZCBiZSBhIGRpZmZlcmVudCBjbGFzcy4KLQkJCS8vIEN1cnJlbnRseSB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGRlbGV0ZWQgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBmaW5kIHRoZSB0eXBlcyBpbiB0aGUgdW5pdCB0byByZW1vdmUuCi0JCQkvLyBTbyBpbnN0ZWFkIHdlIGFzayBmYWN0b3J5IHRvIHJlbW92ZSBhbGwgaXQgYW55IHRoYXQgc3RhcnQgd2l0aCBpdCBwbHVzIGZvciBpbm5lciBjbGFzc2VzLgotCQkJZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCkpOwotCQkJcmV0dXJuOyAvLyBTaW5jZSB0aGUgY2xhc3NmaWxlIHdhcyByZW1vdmVkIHdlIGRvbid0IG5lZWQgdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW4gKGFjdHVhbGx5IHRoZSBjaGlsZHJlbiBsaXN0IHdpbGwgYmUgZW1wdHkKLQkJfQotCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7Ci0JCQlwcm9jZXNzRGVsdGEoY2hpbGRyZW5baWldKTsKLQkJfQotCX0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNoYW5nZSBmb3IgYSBzaW5nbGUgZWxlbWVudCwgY2hpbGRyZW4gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHkuCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnRSb290IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChmbHVzaGVkQWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGFzc1BhdGhDaGFuZ2UoZGVsdGEpKQotCQkJZmx1c2hBbGwoKTsKLQkJZWxzZQotCQkJc3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChlbGVtZW50LCBkZWx0YSk7Ci0JfQotCQotCS8qIAotCSAqIFdlIHdpbGwgZm9yY2UgdGhlIGZsdXNoaW5nIG9mIGFsbCBhZGFwdG9ycyBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBpZiBhIHR5cGUgd2FzIHJlZmxlY3RlZCBwcmlvciB0byB0aGUgcGFja2FnZSBleGlzdGluZyBvcgotCSAqIGlmIHRoZSBwYWNrYWdlIGlzIGRlbGV0ZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6IHsKLQkJCQlpZiAoZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA9PSAwKQotCQkJCQlmbHVzaFBhY2thZ2UoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIHRydWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIDp7Ci0JCQkJaWYgKGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaFBhY2thZ2UoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOgotCQkJCXN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoZWxlbWVudCwgZGVsdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJVHlwZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCBraW5kID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQlkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoZWxlbWVudC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmbHVzaChlbGVtZW50KTsKLQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCQkvLyBOb3RlLCBpZiBhIG1ldGhvZCBlbGVtZW50IG9yIGEgZmllbGQgd2FzIGNoYW5nZWQsIHRoZXJlIG1heSBiZSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkKLQkJCS8vICAgICAgIHRoYXQgd2lsbCBoYXZlIHRvIGJlIHByb2Nlc3NlZCBpZiB3ZSBhcmUgdG8gdXBkYXRlIHRoZSBKYXZhTWV0aG9kL0phdmFGaWVsZCBKRE9NQWRhcHRvciBzLgkKLQkJfQotCX0KLQkvKioKLQkgKiBHaXZlbiB0aGF0IGFuIElUeXBlIGRvZXMgbm90IGV4aXN0cyBhbnltb3JlLCBhc3N1bWUKLQkgKiB0aGF0IHRoZSB0eXBlJ3MgbmFtZSBpcyBwYWNrYWdlLmZpbGVuYW1lICh3aXRob3V0IHRoZSAuamF2YSkKLQkgKiBJZiB3ZSBhcmUgd3JvbmcgKGlmLCB0aGVuIGEgcmFyZSBjYXNlKSwgIHdlIHdpbGwgZmx1c2guCi0JICogTmV4dCBhY2Nlc3Mgd2lsbCBpbmR1Y2UgYSByZWZsZWN0aW9uIGF0dGVtcHQuCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBpdCBpcyBldmVyIGNhbGxlZC4gSXQgc29tZW9uZSBlbHNlIGNhbGxzIGl0LCBwbGVhc2UgY29udGFjdCBkZXZlbG9wbWVudCB0byBzZWUgaWYgcmlnaHQgbWV0aG9kIHRvIGJlIGNhbGxlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVtb3ZlT3JBZGQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50KSB7Ci0JCWRpc0Fzc29jaWF0ZVNvdXJjZShnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpKTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxsTmFtZUZyb21FbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPD0gNSB8fCAhbmFtZS5zdWJzdHJpbmcobmFtZS5sZW5ndGgoKSAtIDUpLmVxdWFscygiLmphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBTaG91bGQgbm90IGJlIGhlcmUsIAotCQkJTG9nZ2VyIGxvZ2dlciA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkKLQkJCQlsb2dnZXIubG9nKCJJbnZhbGlkIC5qYXZhIGZpbGU6ICIgKyBuYW1lLCBMZXZlbC5GSU5FKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gTWFrZSBhIGd1ZXNzLCBhdCB3b3JzdCBjYXNlLCBub3RoaW5nIHdpbGwgY29tZSBvdXQgb2YgdGhpcy4KLQkJCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID49IDApCi0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSArICIuamF2YSI7IC8vIHJlbmFtZSB0aGUgZXh0ZW5zaW9uIHRvIC5qYXZhIC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQluYW1lID0gbmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpID09IG51bGwgfHwgZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDUpOwotCQllbHNlCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpICsgIi4iICsgbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDUpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIFN0b3AgdGhlIHN5bmNocm9uaXplciBmcm9tIGxpc3RlbmluZyB0byBhbnkgbW9yZSBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BTeW5jaHJvbml6ZXIoKSB7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXRyeSB7Ci0JCQlmbHVzaFR5cGVzLmNsZWFyKCk7Ci0JCQlmbHVzaFR5cGVQbHVzSW5uZXIuY2xlYXIoKTsKLQkJCW5vdGlmaWNhdGlvbnMuY2xlYXIoKTsKLQkJCXN1cGVyLmVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJCWZsdXNoVHlwZXMoKTsKLQkJCXByb2Nlc3NOb3RpZmljYXRpb25zKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlmbHVzaGVkQWxsID0gZmFsc2U7Ci0JCQlmbHVzaFR5cGVzLmNsZWFyKCk7Ci0JCQlmbHVzaFR5cGVQbHVzSW5uZXIuY2xlYXIoKTsKLQkJCW5vdGlmaWNhdGlvbnMuY2xlYXIoKTsKLQkJfQotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmx1c2hUeXBlcygpIHsKLQkJaWYgKCFmbHVzaFR5cGVzLmlzRW1wdHkoKSkgewotCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQlOb3RpZmljYXRpb24gbm90OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbHVzaFR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJdHlwZSA9IChJVHlwZSkgZmx1c2hUeXBlcy5nZXQoaSk7Ci0JCQkJbm90ID0gZG9GbHVzaCh0eXBlKTsKLQkJCQlpZiAobm90ICE9IG51bGwpCi0JCQkJCW5vdGlmaWNhdGlvbnMuYWRkKG5vdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmbHVzaFR5cGVQbHVzSW5uZXIuaXNFbXB0eSgpKSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBudWxsOwotCQkJTm90aWZpY2F0aW9uIG5vdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmx1c2hUeXBlUGx1c0lubmVyLnNpemUoKTsgaSsrKSB7Ci0JCQkJdW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBmbHVzaFR5cGVQbHVzSW5uZXIuZ2V0KGkpOwotCQkJCW5vdCA9IGRvRmx1c2godW5pdCk7Ci0JCQkJaWYgKG5vdCAhPSBudWxsKQotCQkJCQlub3RpZmljYXRpb25zLmFkZChub3QpOwotCQkJfQotCQl9CQkKLQl9Ci0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc05vdGlmaWNhdGlvbnMoKSB7Ci0JCU5vdGlmaWVyIG5vdGlmaWVyOwotCQlOb3RpZmljYXRpb24gbm90OwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdGlmaWNhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCW5vdCA9IChOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbnMuZ2V0KGkpOwotCQkJbm90aWZpZXIgPSAoTm90aWZpZXIpIG5vdC5nZXROb3RpZmllcigpOwotCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJbm90aWZpZXIuZU5vdGlmeShub3QpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZyhlKTsgLy9jYXRjaCBleGNlcHRpb25zIHNvIGFsbCBub3RpZmljYXRpb25zIGFyZSBwcm9jZXNzZWQKLQkJCQl9IAotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlOb3RpZmljYXRpb24gbm90ID0gZ2V0QWRhcHRlckZhY3RvcnkoKS5kaXNBc3NvY2lhdGVTb3VyY2UocXVhbGlmaWVkTmFtZSwgZmFsc2UpOwotCQlpZiAobm90ICE9IG51bGwpCi0JCQlub3RpZmljYXRpb25zLmFkZChub3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJTm90aWZpY2F0aW9uIG5vdCA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKHF1YWxpZmllZE5hbWUsIGZhbHNlKTsKLQkJaWYgKG5vdCAhPSBudWxsKQotCQkJbm90aWZpY2F0aW9ucy5hZGQobm90KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZmx1c2hBbGwoKSB7Ci0JCW5vdGlmaWNhdGlvbnMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hBbGxOb05vdGlmaWNhdGlvbigpKTsKLQkJZmx1c2hlZEFsbCA9IHRydWU7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjcHJvY2Vzc0NoaWxkcmVuKElKYXZhRWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoaWxkcmVuKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoIWZsdXNoZWRBbGwpCi0JCQlzdXBlci5wcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFNb2RlbExpc3RlbmVyI3Byb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKCFmbHVzaGVkQWxsKQotCQkJc3VwZXIucHJvY2Vzc0RlbHRhKGRlbHRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSUphdmFQcm9qZWN0SW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0lKYXZhUHJvamVjdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMzEwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSUphdmFQcm9qZWN0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDUvMDcvMDEgMTA6MDY6MjggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFQcm9qZWN0SW5mbyB7Ci1wdWJsaWMgU3RyaW5nIGdldFNvdXJjZVBhdGgoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhRU1GTmF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YUVNRk5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmY5YzMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhRU1GTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luOwotLyoKLSAqICRSQ1NmaWxlOiBKYXZhRU1GTmF0dXJlLmphdmEsdiAkICRSZXZpc2lvbjogMS4xNSAkICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjI3ICQKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFYTUlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5JSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIEphdmFFTUZOYXR1cmUgZXh0ZW5kcyBFTUZOYXR1cmUgaW1wbGVtZW50cyBJSmF2YUVNRk5hdHVyZSB7Ci0vKioKLSAqIEphdmFNT0ZOYXR1cmVSdW50aW1lIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhRU1GTmF0dXJlKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogQHJldHVybiBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUKLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIEphdmFFTUZOYXR1cmUgY3JlYXRlUnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYoIWhhc1J1bnRpbWUocHJvamVjdCkpCi0JCWlmIChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZXhpc3RzKCkpCi0JCQlhZGROYXR1cmVUb1Byb2plY3QocHJvamVjdCwgSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0KLQlyZXR1cm4gZ2V0UnVudGltZShwcm9qZWN0KTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIG5hdHVyZSdzIElELgotICovCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROYXR1cmVJRCgpIHsKLQlyZXR1cm4gSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGlzIG5hdHVyZSBpcyBjb250YWluZWQgd2l0aGluLgotICovCi1wcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQlyZXR1cm4gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogRmlyc3QgY2hlY2sgZm9yIHJlZ2lzdGVyZWQgbmF0dXJlcy4KLSAqIEByZXR1cm4gSUphdmFNT0ZOYXR1cmVSdW50aW1lCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBKYXZhRU1GTmF0dXJlIGdldFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCUphdmFFTUZOYXR1cmUgbmF0dXJlID0gbnVsbDsKLQlMaXN0IHJ1bnRpbWVzID0gRU1GTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lcyhwcm9qZWN0KTsKLQlmb3IgKGludCBpPTA7IGk8cnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJaWYgKHJ1bnRpbWVzLmdldChpKSBpbnN0YW5jZW9mIEphdmFFTUZOYXR1cmUpCi0JCQluYXR1cmUgPSAoSmF2YUVNRk5hdHVyZSkgcnVudGltZXMuZ2V0KGkpOwotCX0KLQlpZiAobmF0dXJlID09IG51bGwpCi0JCW5hdHVyZSA9IHByaW1HZXRSdW50aW1lKHByb2plY3QpOwotCXJldHVybiBuYXR1cmU7Ci19Ci0vKioKLSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvamVjdCBoYXMgYSBydW50aW1lIGNyZWF0ZWQgb24gaXQuCi0gKiBDaGVjayBmb3IgcmVnaXN0ZXJlZCBuYXR1cmVzIGZpcnN0LgotICogQHJldHVybiBib29sZWFuCi0gKiBAcGFyYW0gcHJvamVjdCBjb20uaWJtLml0cC5jb3JlLmFwaS5yZXNvdXJjZXMuSVByb2plY3QKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCUphdmFFTUZOYXR1cmUgbmF0dXJlID0gbnVsbDsKLQlMaXN0IHJ1bnRpbWVzID0gRU1GTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lcyhwcm9qZWN0KTsKLQlmb3IgKGludCBpPTA7IGk8cnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJaWYgKHJ1bnRpbWVzLmdldChpKSBpbnN0YW5jZW9mIEphdmFFTUZOYXR1cmUpCi0JCQluYXR1cmUgPSAoSmF2YUVNRk5hdHVyZSkgcnVudGltZXMuZ2V0KGkpOwotCX0KLQlpZiAobmF0dXJlID09IG51bGwpCi0JCXJldHVybiBwcmltSGFzUnVudGltZShwcm9qZWN0KTsKLQllbHNlCi0JCXJldHVybiB0cnVlOwotCi19Ci0vKioKLSAqIEdldCBhIElKYXZhTU9GTmF0dXJlUnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdXBwbGllZCBwcm9qZWN0LgotICogRG8gbm90IGNoZWNrIGZvciBvdGhlciByZWdpc3RlcmVkIHR5cGVzLgotICogQHJldHVybiBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUKLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIEphdmFFTUZOYXR1cmUgcHJpbUdldFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCXRyeSB7Ci0JCXJldHVybiAoSmF2YUVNRk5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUoSUphdmFFTUZOYXR1cmUuTkFUVVJFX0lEKTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHByb2plY3QgaGFzIGEgcnVudGltZSBjcmVhdGVkIG9uIGl0LgotICogRG8gbm90IGNoZWNrIGZvciByZWdpc3RlcmVkIG5hdHVyZSBpZHMuCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJpbUhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCXRyeSB7Ci0JCXJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi0vKioKLSAqIHByaW1hcnkgY29udHJpYnV0ZSB0byBjb250ZXh0Ci0gKi8KLXB1YmxpYyB2b2lkIHByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpIHsKLQlpZiAoZW1mQ29udGV4dCA9PSBhTmF0dXJlKSByZXR1cm47Ci0JZW1mQ29udGV4dCA9IGFOYXR1cmU7Ci0JUmVzb3VyY2VTZXQgc2V0ID0gYU5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCXNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkucHV0KEphdmFYTUlGYWN0b3J5LlNDSEVNRSwgSmF2YVhNSUZhY3RvcnkuSU5TVEFOQ0UpOwkKLQlXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQljb25maWd1cmVVUklDb252ZXJ0ZXIoY29udik7Ci0JYWRkQWRhcHRlckZhY3RvcmllcyhzZXQpOwkKLX0KLQotLyoqCi0gKiBzZWNvbmRhcnkgY29udHJpYnV0ZSB0byBjb250ZXh0Ci0gKi8KLXB1YmxpYyB2b2lkIHNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCXByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KGFOYXR1cmUpOwotfQotCi0vKioKLSAqIFJlbW92ZSB0aGUgcHJvamVjdCBhcyBhIGNvbnRhaW5lciBmcm9tIHRoZSBjb252ZXJ0ZXIgYW5kIGFkZAotICogdGhlIHNvdXJjZSBmb2xkZXIuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVVSSUNvbnZlcnRlcihXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udikgewotCWNvbnYucmVtb3ZlSW5wdXRDb250YWluZXIoZ2V0UHJvamVjdCgpKTsKLQljb252LmFkZElucHV0Q29udGFpbmVyKGdldEVNRlJvb3QoKSk7Ci19Ci0KLS8qKgotICogQWRkIEFkYXB0b3IgZmFjdG9yaWVzIHRvIGFDb250ZXh0IHdoaWNoIGlzIG5vdwotICogYmVpbmcgdXNlZCBmb3IgdGhpcyBuYXR1cmUuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoUmVzb3VyY2VTZXQgYVNldCkgewotCWFkZEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcmllcyhhU2V0KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yaWVzKFJlc291cmNlU2V0IGFTZXQpIHsKLQlMaXN0IGZhY3RvcmllcyA9IGFTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCS8vIFRoZSBjb250ZXh0IG1heSBhbHJlYWR5IGhhdmUgYSBKYXZhUmVmbGVjdGlvbiBhZGFwdG9yIGZhY3RvcnksIHNvIHJlbW92ZSBpdAotCWlmICghZmFjdG9yaWVzLmlzRW1wdHkoKSkgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KGZhY3RvcmllcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJZmFjdG9yaWVzLnJlbW92ZShmYWN0b3J5KTsKLQl9Ci0JLy8gVGhpcyBzaG91bGQgbWF5YmUgYmUgY29uc2lkZXJlZCBhIGxvZ2ljIGVycm9yLCBidXQgd2UgY2FuIHJlY292ZXIgZWFzaWx5Ci0JZmFjdG9yaWVzLmFkZChuZXcgSmF2YUpET01BZGFwdGVyRmFjdG9yeShKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpKSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDYwZjJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47Ci0vKgotICogJFJDU2ZpbGU6IEphdmFQbHVnaW4uamF2YSx2ICQgJFJldmlzaW9uOiAxLjEwICQgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MjcgJAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGsuSmF2YUpES0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkVjbGlwc2VMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyBhIHRvcC1sZXZlbCBjbGFzcyBvZiB0aGUgamF2YSBwbHVnaW4gdG9vbC4KLSAqIAotICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIFVJIHBsdWdpbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmF2YVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhUGx1Z2luIElOU1RBTkNFOwotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSmF2YSBwbHVnaW4gYW5kIGNhY2hlIGl0cyBkZWZhdWx0IGluc3RhbmNlCi0JICovCi0JcHVibGljIEphdmFQbHVnaW4oKSB7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKQotCQkJbG9nZ2VyID0gRWNsaXBzZUxvZ2dlci5nZXRFY2xpcHNlTG9nZ2VyKHRoaXMpOwotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEphdmFQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlKYXZhUmVmRmFjdG9yeUltcGwuc2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoSmF2YUpET01BZGFwdGVyRmFjdG9yeS5jbGFzcyk7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0UGx1Z2luUmVzb3VyY2VTZXQoKS5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBKYXZhSkRLQWRhcHRlckZhY3RvcnkoKSk7CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUHJvamVjdEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUHJvamVjdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmM2M0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVByb2plY3RJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUHJvamVjdEluZm8uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkIAotICovCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDUvMDcvMDEgMTA6MDk6MjYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdEluZm8gaW1wbGVtZW50cyBJSmF2YVByb2plY3RJbmZvIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0pBVkFfT1VUUFVUX1BBVEggPSAiYmluIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9TT1VSQ0VfUEFUSCA9ICJzb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZVBhdGg7Ci0vKioKLSAqIEphdmFQcm9qZWN0SW5mbyBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YVByb2plY3RJbmZvKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotICovCi1wcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTb3VyY2VQYXRoKCkgewotCXJldHVybiBERUZBVUxUX1NPVVJDRV9QQVRIOwotfQotLyoqCi0gKiBHZXQgdGhlIGNsYXNzIHBhdGggZm9yIHRoZSByZWNpZXZlci4gQnkgZGVmYXVsdCBhc2sgdGhlIHRlbXBsYXRlCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIFN0cmluZyBnZXRTb3VyY2VQYXRoKCkgewotCWlmIChzb3VyY2VQYXRoID09IG51bGwpCi0JCXNvdXJjZVBhdGggPSBnZXREZWZhdWx0U291cmNlUGF0aCgpOwotCXJldHVybiBzb3VyY2VQYXRoOwotfQotcHVibGljIHZvaWQgc2V0U291cmNlUGF0aChTdHJpbmcgcGF0aCkgewotCXNvdXJjZVBhdGggPSBwYXRoOwotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvQVNUQm91bmRSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvQVNUQm91bmRSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2FmZWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0FTVEJvdW5kUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBU1RCb3VuZFJlc29sdmVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MTM6NTMgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULkludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotIAotLyoqCi0gKiBUaGlzIHdvcmtzIG9uIHJlc29sdmVkIEFTVCBub2Rlcy4gSWYgdGhlIG5vZGVzIGhhZCBub3QgYmVlbiByZXNvbHZlZCwgdGhpcyB3aWxsIHJldHVybiBub3RpbmcuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUQm91bmRSZXNvbHZlciBleHRlbmRzIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULklSZXNvbHZlciNyZXNvbHZlTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIHJlc29sdmVOYW1lKE5hbWUgbmFtZSkgewotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlpZiAoYmluZGluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlzd2l0Y2ggKGJpbmRpbmcuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElCaW5kaW5nLlRZUEU6Ci0JCQkJU3RyaW5nIHR5cGVuYW1lID0gZ2V0VHlwZU5hbWUoKElUeXBlQmluZGluZykgYmluZGluZyk7Ci0JCQkJUFROYW1lIHB0bmFtZSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE5hbWUoKTsKLQkJCQlwdG5hbWUuc2V0TmFtZSh0eXBlbmFtZSk7Ci0JCQkJcmV0dXJuIHB0bmFtZTsKLQkJCWNhc2UgSUJpbmRpbmcuVkFSSUFCTEU6Ci0JCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzsKLQkJCQlpZiAodmFyaWFibGVCaW5kaW5nLmlzRmllbGQoKSkgewotCQkJCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWModmFyaWFibGVCaW5kaW5nLmdldE1vZGlmaWVycygpKSkgewotCQkJCQkJUFRGaWVsZEFjY2VzcyBmYSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0JCQkJCQkvLyBJZiBqdXN0IGEgc2ltcGxlIG5hbWUsIHRoZW4gaXQgaXMgbGlrZSB0aGlzLmZpZWxkLCBzbyBubyByZWNlaXZlci4gTm90IHN1cmUgaG93IHRvIGhhbmRsZSB0aGlzIHlldC4KLQkJCQkJCWlmIChuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKSB7Ci0JCQkJCQkJLy8gVGhlcmUgYXJlIHBhcnRzIGJlZm9yZSB0aGlzIG9uZS4gR2V0IHRoZW0gYXMgYW4gZXhwcmVzc2lvbiAoZWl0aGVyIGEgbmFtZSwgb3IgYW5vdGhlciBmaWVsZCBhY2Nlc3MpCi0JCQkJCQkJZmEuc2V0UmVjZWl2ZXIocmVzb2x2ZU5hbWUoKChRdWFsaWZpZWROYW1lKSBuYW1lKS5nZXRRdWFsaWZpZXIoKSkpOwotCQkJCQkJfQotCQkJCQkJZmEuc2V0RmllbGQodmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKSk7Ci0JCQkJCQlyZXR1cm4gZmE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvd0ludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5BU1RCb3VuZFJlc29sdmVyX0Nhbm5vdEhhbmRsZUxvY2FsRmllbGRfRVhDXywgbmV3IE9iamVjdFtde3ZhcmlhYmxlQmluZGluZy5nZXROYW1lKCl9KSk7IAotLy8JCQkJCQlwdXNoKG5ldyBQdXNoRmllbGRWYXJpYWJsZSh2YXJpYWJsZUlkLCBnZXRUeXBlU2lnbmF0dXJlKGRlY2xhcmluZ1R5cGVCaW5kaW5nKSwgZkNvdW50ZXIpKTsKLS8vCQkJCQkJcHVzaChuZXcgUHVzaFRoaXMoZ2V0RW5jbG9zaW5nTGV2ZWwobm9kZSwgZGVjbGFyaW5nVHlwZUJpbmRpbmcpKSk7Ci0vLwkJCQkJCXN0b3JlSW5zdHJ1Y3Rpb24oKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93SW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLkFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfLCBuZXcgT2JqZWN0W117dmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKX0pKTsgCi0vLwkJCQkJcHVzaChuZXcgUHVzaExvY2FsVmFyaWFibGUodmFyaWFibGVJZCkpOwotCQkJCX0JCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LklSZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKFR5cGUgdHlwZSkgewotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJcmV0dXJuIChiaW5kaW5nICE9IG51bGwpID8gZ2V0VHlwZU5hbWUoYmluZGluZykgOiBudWxsOyAKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlyZXR1cm4gKGJpbmRpbmcgIT0gbnVsbCkgPyBnZXRUeXBlTmFtZShiaW5kaW5nKSA6IG51bGw7IAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVOYW1lKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlTdHJpbmdCdWZmZXIgbmFtZTsKLQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJbmFtZT0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUeXBlTmFtZSh0eXBlQmluZGluZy5nZXRFbGVtZW50VHlwZSgpKSk7Ci0JCQlpbnQgZGltZW5zaW9ucz0gdHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgewotCQkJCW5hbWUuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbmFtZS50b1N0cmluZygpOwotCQl9Ci0JCW5hbWU9IG5ldyBTdHJpbmdCdWZmZXIodHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nPSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCk7Ci0JCXR5cGVCaW5kaW5nPSB0eXBlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpOwotCQl3aGlsZSh0eXBlQmluZGluZyAhPSBudWxsKSB7Ci0JCQluYW1lLmluc2VydCgwLCAnJCcpLmluc2VydCgwLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOwotCQkJdHlwZUJpbmRpbmc9IHR5cGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCX0KLQkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwgJiYgIXBhY2thZ2VCaW5kaW5nLmlzVW5uYW1lZCgpKSB7Ci0JCQluYW1lLmluc2VydCgwLCAnLicpLmluc2VydCgwLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZVRoaXMoKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gcmVzb2x2ZVRoaXMoKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQlyZXR1cm4gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUVGhpc0xpdGVyYWwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9JSmF2YUVNRk5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSUphdmFFTUZOYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyNzgzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9JSmF2YUVNRk5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUphdmFFTUZOYXR1cmUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDoyNyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLSAKLS8qKgotICogSW50ZXJmYWNlIGZvciBKYXZhIEVNRiBOYXR1cmUgY29uc3RhbnRzLgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YUVNRk5hdHVyZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfSUQgPSAib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZGI1OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSmVtUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotLyoKLSAqICRSQ1NmaWxlOiBKZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEsdiAkICRSZXZpc2lvbjogMS4xMCAkICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjI3ICQKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0vKioKLSAqIFByb2plY3QgVXRpbGl0aWVzIGZvciBKRU0gYW5kIEphdmEuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgSmVtUHJvamVjdFV0aWxpdGllcyBleHRlbmRzIFByb2plY3RVdGlsaXRpZXMgewotCQotCXByaXZhdGUgSmVtUHJvamVjdFV0aWxpdGllcygpewotCX0KLQkKLQkvKioKLQkgKiBUaGUgbmF0dXJlIGlkIGZvciBKRU0gTmF0dXJlLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpFTV9FTUZfTmF0dXJlSUQgPSBJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQ7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBFTUYgbmF0dXJlIGZvciBKRU0gZm9yIHRoZSBwcm9qZWN0LiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBhZGROYXR1cmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWRkIHRoZSBuYXR1cmUgdG8gdGhlIHByb2plY3QgaWYgbm90IHNldC4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGRvbid0IGFkZCBuYXR1cmUgaWYgbm90IGFscmVhZHkgb24gcHJvamVjdC4KLQkgKiBAcmV0dXJuIHRoZSBFTUZOYXR1cmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kIGFuZCBhZGROYXR1cmUgd2FzIDxjb2RlPmZhbHNlPC9jb2RlPiBvciBpdCB3YXMgbm90IGEgamF2YSBwcm9qZWN0LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRk5hdHVyZSBnZXRKRU1fRU1GX05hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFkZE5hdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gYWRkTmF0dXJlID8gSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKHByb2plY3QpIDogSmF2YUVNRk5hdHVyZS5nZXRSdW50aW1lKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSmF2YUNsYXNzIGZyb20gYW4gSUZpbGUuCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcyhJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gYUZpbGUuZ2V0UHJvamVjdCgpOwotCQlMaXN0IGZvbGRlcnMgPSBnZXRTb3VyY2VDb250YWluZXJzKHByb2plY3QpOwotCQlmb2xkZXJzLmFkZEFsbChnZXRMaWJyYXJ5Q29udGFpbmVycyhwcm9qZWN0KSk7Ci0JCUlDb250YWluZXIgZm9sZGVyID0gbnVsbDsKLQkJSVBhdGggZm9sZGVyUGF0aCwgZmlsZVBhdGgsIGphdmFQYXRoOwotCQlmaWxlUGF0aCA9IGFGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJaWYgKGZvbGRlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJZm9sZGVyID0gKElDb250YWluZXIpIGZvbGRlcnMuZ2V0KGkpOwotCQkJCWZvbGRlclBhdGggPSBmb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCWludCBzZWdtZW50cyA9IGZpbGVQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhmb2xkZXJQYXRoKTsKLQkJCQlpZiAoc2VnbWVudHMgPiAwKSB7Ci0JCQkJCWphdmFQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50cyk7Ci0JCQkJCWphdmFQYXRoID0gamF2YVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQkJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IGphdmFQYXRoLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsICcuJyk7Ci0JCQkJCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocXVhbGlmaWVkTmFtZSwgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldCBzb3VyY2UgY29udGFpbmVycyBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIGxpc3Qgb2Ygc291cmNlIGNvbnRhaW5lcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QgcCkgewotCQl0cnkgewotCQkJTGlzdCBzb3VyY2VDb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCBzb3VyY2VQYXRocyA9IGdldFNvdXJjZVBhdGhzKHApOwotCQkJaWYgKHNvdXJjZVBhdGhzICE9IG51bGwgJiYgIXNvdXJjZVBhdGhzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUGF0aHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgc291cmNlUGF0aHMuZ2V0KGkpOwotCQkJCQlpZiAocGF0aC5pc0VtcHR5KCkpCi0JCQkJCQlzb3VyY2VDb250YWluZXJzLmFkZChwKTsKLQkJCQkJZWxzZQotCQkJCQkJc291cmNlQ29udGFpbmVycy5hZGQocC5nZXRGb2xkZXIocGF0aCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzb3VyY2VDb250YWluZXJzOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRTb3VyY2VQYXRocyhJUHJvamVjdCBwKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljcCA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBzb3VyY2VQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNwW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJc291cmNlUGF0aHMuYWRkKGNwW2ldLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlUGF0aHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBsaXN0IG9mIElDb250YWluZXJzIHRoYXQgYXJlIExpYnJhcmllcyBpbiB0aGUgY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBsaXN0IG9mIGxpYnJhcnkgSUNvbnRhaW5lcnMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExpYnJhcnlDb250YWluZXJzKElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCUxpc3QgbGlicmFyeUNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IGxpYnJhcnlQYXRocyA9IGdldGxpYnJhcnlQYXRocyhwKTsKLQkJCWlmIChsaWJyYXJ5UGF0aHMgIT0gbnVsbCAmJiAhbGlicmFyeVBhdGhzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyeVBhdGhzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIGxpYnJhcnlQYXRocy5nZXQoaSk7Ci0JCQkJCWlmIChwYXRoLmlzRW1wdHkoKSkKLQkJCQkJCWxpYnJhcnlDb250YWluZXJzLmFkZChwKTsKLQkJCQkJZWxzZQotCQkJCQkJbGlicmFyeUNvbnRhaW5lcnMuYWRkKHAuZ2V0Rm9sZGVyKHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlicmFyeUNvbnRhaW5lcnM7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldGxpYnJhcnlQYXRocyhJUHJvamVjdCBwKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljcCA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBsaWJyYXJ5UGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjcFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQlsaWJyYXJ5UGF0aHMuYWRkKGNwW2ldLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlicmFyeVBhdGhzOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGphdmEgcHJvamVjdCBuYXR1cmUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0IG5hdHVyZSBmb3IgdGhlIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgamF2YSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb3VjaCBjbGFzc3BhdGguIEl0IHNpbXBseSB0YWtlcyB0aGUgY2xhc3NwYXRoIGFuZCBzZXRzIGl0IGJhY2sgaW4uCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKQotCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBiaW5hcnkgb3V0cHV0IGZpbGVzIGZvciB0aGUgSmF2YVByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIHBhdGggdG8gYmluYXJ5IG91dHB1dCBmb2xkZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBvdGhlciBwcm9ibGVtLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RPdXRwdXRMb2NhdGlvbihJUHJvamVjdCBwKSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwKTsKLQkJCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCFqYXZhUHJvai5pc09wZW4oKSkKLQkJCQlqYXZhUHJvai5vcGVuKG51bGwpOwotCQkJcmV0dXJuIGphdmFQcm9qLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCdzIGJpbmFyeSBvdXRwdXQgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBwcm9qZWN0J3Mgb3V0cHV0IGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgamF2YSBwcm9qZWN0IG9yIHNvbWUgb3RoZXIgZXJyb3IuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldEphdmFQcm9qZWN0T3V0cHV0Q29udGFpbmVyKElQcm9qZWN0IHApIHsKLQkJSVBhdGggcGF0aCA9IGdldEphdmFQcm9qZWN0T3V0cHV0TG9jYXRpb24ocCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gMSkKLQkJCXJldHVybiBwOwotCQlyZXR1cm4gcC5nZXRGb2xkZXIocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJpbmFyeSBvdXRwdXQgYWJzb2x1dGUgKGxvY2FsIGZpbGUgc3lzdGVtKSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBwcm9qZWN0J3Mgb3V0cHV0IHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIGVycm9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RPdXRwdXRBYnNvbHV0ZUxvY2F0aW9uKElQcm9qZWN0IHApIHsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXRKYXZhUHJvamVjdE91dHB1dENvbnRhaW5lcihwKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRhaW5lci5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIEpEVCBKYXZhTW9kZWwuCi0JICogCi0JICogQHJldHVybiBKRFQncyBKYXZhTW9kZWwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qCi0JICogQHJldHVybiBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290cwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3RzKElKYXZhUHJvamVjdCBqYXZhUHJvaikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2ouZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHJvb3RzW2ldOwotCQkJaWYgKHJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKQotCQkJCXJlc3VsdC5hZGQocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgY2xhc3NwYXRoCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gcmVzCi0JICogICAgICAgICAgICByZXNvdXJjZQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKElQcm9qZWN0IHAsIElSZXNvdXJjZSByZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocmVzLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwpOwotCQlyZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChwLCBlbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwYXRoIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gcmVtb3ZlCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgSVBhdGggcGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIGYgPSBwLmdldEZpbGUocGF0aCk7Ci0JCXJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKHAsIGYpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIHByb2plY3QncyBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiBAcGFyYW0gZW50cnkKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoY2xhc3NwYXRoLCBlbnRyeSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBsaXN0IG9mIGVudHJpZXMgZnJvbSB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIGVudHJpZXMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2YgSUNsYXNzUGF0aEVudHJ5J3MKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBMaXN0IGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoY2xhc3NwYXRoLCBlbnRyaWVzKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElDbGFzc3BhdGhFbnRyeVtdIHByaW1SZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIGRpZFJlbW92ZSA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQlpZiAoIWVudHJ5LmdldFBhdGgoKS5lcXVhbHMoY2xhc3NwYXRoW2ldLmdldFBhdGgoKSkpCi0JCQkJcmVzdWx0LmFkZChjcEVudHJ5KTsKLQkJCWVsc2UKLQkJCQlkaWRSZW1vdmUgPSB0cnVlOwotCQl9Ci0JCWlmICghZGlkUmVtb3ZlKQotCQkJcmV0dXJuIGNsYXNzcGF0aDsKLQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBMaXN0IGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMaXN0IGFycmF5TGlzdCA9IEFycmF5cy5hc0xpc3QoY2xhc3NwYXRoKTsKLQkJTGlzdCByZW1vdmVhYmxlID0gbmV3IEFycmF5TGlzdChhcnJheUxpc3QpOwotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCWJvb2xlYW4gZGlkUmVtb3ZlID0gZmFsc2U7Ci0JCWludCBzaXplID0gZW50cmllcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQllbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGVudHJpZXMuZ2V0KGkpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc3BhdGgubGVuZ3RoOyBqKyspIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IGNsYXNzcGF0aFtqXTsKLQkJCQlpZiAoZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhjbGFzc3BhdGhbal0uZ2V0UGF0aCgpKSkgewotCQkJCQlpZiAocmVtb3ZlYWJsZS5yZW1vdmUoY3BFbnRyeSkpCi0JCQkJCQlkaWRSZW1vdmUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWRpZFJlbW92ZSkKLQkJCXJldHVybiBjbGFzc3BhdGg7Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIHJlbW92ZWFibGUudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3JlbW92ZWFibGUuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzc3BhdGggYXMgYW4gYXJyYXkgb3IgVVJMJ3MuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHJldHVybiBhcnJheSBvZiBVUkwncyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBqYXZhUHJvamVjdCB3YXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkxbXSBnZXRDbGFzc3BhdGhBc1VSTEFycmF5KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoMjApOwotCQljb2xsZWN0Q2xhc3NwYXRoVVJMcyhqYXZhUHJvamVjdCwgdXJscywgdmlzaXRlZCwgdHJ1ZSk7Ci0JCVVSTFtdIHJlc3VsdCA9IG5ldyBVUkxbdXJscy5zaXplKCldOwotCQl1cmxzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RDbGFzc3BhdGhVUkxzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgTGlzdCB1cmxzLCBTZXQgdmlzaXRlZCwgYm9vbGVhbiBpc0ZpcnN0UHJvamVjdCkgewotCQlpZiAodmlzaXRlZC5jb250YWlucyhqYXZhUHJvamVjdCkpCi0JCQlyZXR1cm47Ci0JCXZpc2l0ZWQuYWRkKGphdmFQcm9qZWN0KTsKLQkJSVBhdGggb3V0UGF0aCA9IGdldEphdmFQcm9qZWN0T3V0cHV0QWJzb2x1dGVMb2NhdGlvbihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlvdXRQYXRoID0gb3V0UGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQlVUkwgb3V0ID0gUHJvamVjdFV0aWxpdGllcy5jcmVhdGVGaWxlVVJMKG91dFBhdGgpOwotCQl1cmxzLmFkZChvdXQpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCQljb2xsZWN0Q2xhc3NwYXRoRW50cnlVUkwoZW50cnksIHVybHMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDogewotCQkJCQlpZiAoaXNGaXJzdFByb2plY3QgfHwgZW50cnkuaXNFeHBvcnRlZCgpKQotCQkJCQkJY29sbGVjdENsYXNzcGF0aFVSTHMoZ2V0SmF2YVByb2plY3QoZW50cnkpLCB1cmxzLCB2aXNpdGVkLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdENsYXNzcGF0aEVudHJ5VVJMKElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgTGlzdCB1cmxzKSB7Ci0JCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCWlmIChudWxsID09IHBhdGguZ2V0RGV2aWNlKCkpIHsKLQkJCUlGaWxlIGphckZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQlpZiAoamFyRmlsZS5leGlzdHMoKSkgewotCQkJCXBhdGggPSBqYXJGaWxlLmdldExvY2F0aW9uKCk7Ci0JCQl9Ci0JCX0KLQotCQlVUkwgdXJsID0gUHJvamVjdFV0aWxpdGllcy5jcmVhdGVGaWxlVVJMKHBhdGgpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQl1cmxzLmFkZCh1cmwpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlJUHJvamVjdCBwcm9qID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKTsKLQkJaWYgKHByb2ogIT0gbnVsbCkKLQkJCXJldHVybiBnZXRKYXZhUHJvamVjdChwcm9qKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBwcm9qZWN0IGEgYmluYXJ5IHByb2plY3QuCi0JICogPHA+Ci0JICogVHlwaWNhbGx5IGEgSmF2YSBwcm9qZWN0IGlzIGNvbnNpZGVyZWQgYmluYXJ5IGlmIGl0IGRvZXMgbm90IGhhdmUgYSBzb3VyY2UgZW50cnkgaW4gdGhlIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgUHJvamVjdCB0byB0ZXN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcm9qZWN0IGlzIGEgYmluYXJ5IHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5UHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChhUHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVudHJpZXMgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRvIGphdmEgY2xhc3MgcGF0aC4KLQkgKiA8cD4KLQkgKiBBcHBlbmQgYSBsaXN0IG9mIElDbGFzc3BhdGhFbnRyeSdzIHRvIHRoZSBidWlsZCBwYXRoIG9mIHRoZSBwYXNzZWQgcHJvamVjdC4gVXBkYXRlZCB0byByZW1vdmUgZXhpc3Rpbmcgb2NjdXJyZW5jZXMgb2YgdGhlIHBhc3NlZCBlbnRyaWVzIGJlZm9yZQotCSAqIGFwcGVuZGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gYXBwZW5kQ2xhc3NwYXRoRW50cmllcwotCSAqICAgICAgICAgICAgbGlzdCBvZiBlbnRyaWVzCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBMaXN0IGFwcGVuZENsYXNzcGF0aEVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkgewotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUxpc3QgbmV3UGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0KGNsYXNzcGF0aC5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQkJLy8gU2tpcCBlbnRyaWVzIHdoaWNoIGFyZSBpbiB0aGUgYXBwZW5kIGxpc3QKLQkJCQlpZiAoYXBwZW5kQ2xhc3NwYXRoRW50cmllcy5pbmRleE9mKGVudHJ5KSA8IDApCi0JCQkJCW5ld1BhdGhMaXN0LmFkZChlbnRyeSk7Ci0JCQl9Ci0JCQluZXdQYXRoTGlzdC5hZGRBbGwoYXBwZW5kQ2xhc3NwYXRoRW50cmllcyk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSAoSUNsYXNzcGF0aEVudHJ5W10pIG5ld1BhdGhMaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtuZXdQYXRoTGlzdC5zaXplKCldKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGNsYXNzcGF0aCBlbnRyeS4KLQkgKiA8cD4KLQkgKiBBcHBlbmQgb25lIElDbGFzc3BhdGhFbnRyeSB0byB0aGUgYnVpbGQgcGF0aCBvZiB0aGUgcGFzc2VkIHByb2plY3QuIElmIGEgY2xhc3NwYXRoIGVudHJ5IGhhdmluZyB0aGUgc2FtZSBwYXRoIGFzIHRoZSBwYXJhbWV0ZXIgYWxyZWFkeSBleGlzdHMsCi0JICogdGhlbiBkb2VzIG5vdGhpbmcuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBQcm9qZWN0Ci0JICogQHBhcmFtIG5ld0VudHJ5Ci0JICogICAgICAgICAgICBFbnRyeQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZEphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJTGlzdCBuZXdQYXRoTGlzdCA9IG5ldyBBcnJheUxpc3QoY2xhc3NwYXRoLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQkvLyBmaXggZHVwIGNsYXNzIHBhdGggZW50cnkgZm9yIC5KRVRFbWl0dGVyIHByb2plY3QKLQkJCS8vIFNraXAgdGhlIGVudHJ5IHRvIGJlIGFkZGVkIGlmIGl0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uT1NfV0lOMzIpKSB7Ci0JCQkJaWYgKCFlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKG5ld0VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpKSkKLQkJCQkJbmV3UGF0aExpc3QuYWRkKGVudHJ5KTsKLQkJCQllbHNlCi0JCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG5ld0VudHJ5LmdldFBhdGgoKSkpCi0JCQkJCW5ld1BhdGhMaXN0LmFkZChlbnRyeSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJbmV3UGF0aExpc3QuYWRkKG5ld0VudHJ5KTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gKElDbGFzc3BhdGhFbnRyeVtdKSBuZXdQYXRoTGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3UGF0aExpc3Quc2l6ZSgpXSk7Ci0JCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIHBhdGggbWF0Y2hpbmcgdGhlIHBhcmFtZXRlcjsgaWYgdGhlIHBhcmFtZXRlciBpcyBudWxsLCBvciBpZiB0aGUgc291cmNlIGZvbGRlciBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aCwgcmV0dXJuIHRoZSBmaXJzdAotCSAqIHNvdXJjZSBwYXRoIG9uIHRoZSBjbGFzc3BhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEBwYXJhbSBkZWZhdWx0U291cmNlTmFtZQotCSAqICAgICAgICAgICAgc291cmNlIGZvbGRlciB0byBmaW5kIGlmIG9uIGNsYXNzcGF0aCwgb3IgaWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlIGZpcnN0IGZvbGRlcgotCSAqIEByZXR1cm4gcGF0aCBzZWFyY2hlZCBmb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIHByb2JsZW0uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRTb3VyY2VQYXRoT3JGaXJzdChJUHJvamVjdCBwLCBTdHJpbmcgZGVmYXVsdFNvdXJjZU5hbWUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNwID0gamF2YVByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ2xhc3NwYXRoRW50cnkgZmlyc3RTb3VyY2UgPSBudWxsOwotCQlJUGF0aCBkZWZhdWx0U291cmNlUGF0aCA9IG51bGw7Ci0JCWlmIChkZWZhdWx0U291cmNlTmFtZSAhPSBudWxsKQotCQkJZGVmYXVsdFNvdXJjZVBhdGggPSBQcm9qZWN0VXRpbGl0aWVzLmNyZWF0ZVBhdGgocCwgZGVmYXVsdFNvdXJjZU5hbWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY3BbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlpZiAoZmlyc3RTb3VyY2UgPT0gbnVsbCkgewotCQkJCQlmaXJzdFNvdXJjZSA9IGNwW2ldOwotCQkJCQlpZiAoZGVmYXVsdFNvdXJjZVBhdGggPT0gbnVsbCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY3BbaV0uZ2V0UGF0aCgpLmVxdWFscyhkZWZhdWx0U291cmNlUGF0aCkpCi0JCQkJCXJldHVybiBkZWZhdWx0U291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJfQotCQl9Ci0JCWlmIChmaXJzdFNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmaXJzdFNvdXJjZS5nZXRQYXRoKCkuc2VnbWVudCgwKS5lcXVhbHMocC5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZpcnN0U291cmNlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBIYWNrIHRvIGZvcmNlIGEgcmVsb2FkIG9mIHRoZSAuY2xhc3NwYXRoIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCB0byByZWxvYWQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9yY2VDbGFzc3BhdGhSZWxvYWQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoamF2YVByb2ogIT0gbnVsbCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qLnJlYWRSYXdDbGFzc3BhdGgoKTsKLQkJCWlmIChlbnRyaWVzICE9IG51bGwpIHsKLQkJCQlJUGF0aCBvdXRwdXQgPSBqYXZhUHJvai5yZWFkT3V0cHV0TG9jYXRpb24oKTsKLQkJCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkJCWphdmFQcm9qLnNldFJhd0NsYXNzcGF0aChlbnRyaWVzLCBvdXRwdXQsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwYXRocyBvZiBhbGwgb2YgdGhlIGxvY2FsIGphcnMgaW4gdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QuIEl0IGRvZXMgbm90IHJlY3Vyc2UgaW50byByZWZlcmVuY2VkIHByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qCi0JICogICAgICAgICAgICBwcm9qZWN0IHRvIHNlYXJjaCAoc2hvdWxkIGJlIGEgamF2YSBwcm9qZWN0KS4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBJUGF0aCwgd2hlcmUgZWFjaCBlbnRyeSBpcyBhIHByb2plY3QgcmVsYXRpdmUgcGF0aCB0byBhIEpBUiBjb250YWluZWQgaW4gdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExvY2FsSkFSUGF0aHNGcm9tQ2xhc3NwYXRoKElQcm9qZWN0IHByb2opIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocHJvaik7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gcHJvai5nZXRGdWxsUGF0aCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQlpbnQgc2VnbWVudHMgPSBwYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhwcm9qZWN0UGF0aCk7Ci0JCQkJCWlmIChzZWdtZW50cyA+IDApCi0JCQkJCQlyZXN1bHQuYWRkKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50cykpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIGZvbGRlciBtYXRjaGluZyB0aGUgcGFyYW1ldGVyOyBpZiB0aGUgcGFyYW1ldGVyIGlzIG51bGwsIG9yIGlmIHRoZSBzb3VyY2UgZm9sZGVyIGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoLCByZXR1cm4gdGhlIGZpcnN0Ci0JICogc291cmNlIGZvbGRlciBvbiB0aGUgY2xhc3NwYXRoCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gZGVmYXVsdFNvdXJjZU5hbWUKLQkgKiAgICAgICAgICAgIHNvdXJjZSBmb2xkZXIgdG8gZmluZCBpZiBvbiBjbGFzc3BhdGgsIG9yIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBmaXJzdCBmb2xkZXIKLQkgKiBAcmV0dXJuIGNvbnRhaW5lciBzZWFyY2hlZCBmb3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIHByb2JsZW0uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldFNvdXJjZUZvbGRlck9yRmlyc3QoSVByb2plY3QgcCwgU3RyaW5nIGRlZmF1bHRTb3VyY2VOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBzb3VyY2VQYXRoID0gZ2V0U291cmNlUGF0aE9yRmlyc3QocCwgZGVmYXVsdFNvdXJjZU5hbWUpOwotCQkJaWYgKHNvdXJjZVBhdGggPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UgaWYgKHNvdXJjZVBhdGguaXNFbXB0eSgpKQotCQkJCXJldHVybiBwOwotCQkJZWxzZQotCQkJCXJldHVybiBwLmdldEZvbGRlcihzb3VyY2VQYXRoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIElGb2xkZXIgdGhhdCByZXByZXNlbnRzIGVhY2ggc291cmNlIGZvbGRlciBpbiBhIGphdmEgcHJvamVjdAotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QpfWJlY2F1c2UgdGhlIHByb2plY3QgaXRzZWxmIG1pZ2h0IGJlIGEgc291cmNlIGNvbnRhaW5lcgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTb3VyY2VGb2xkZXJzKElQcm9qZWN0IHApIHsKLQkJdHJ5IHsKLQkJCUxpc3Qgc291cmNlRm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Qgc291cmNlUGF0aHMgPSBnZXRTb3VyY2VQYXRocyhwKTsKLQkJCWlmIChzb3VyY2VQYXRocyAhPSBudWxsICYmICFzb3VyY2VQYXRocy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVBhdGhzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIHNvdXJjZVBhdGhzLmdldChpKTsKLQkJCQkJaWYgKCFwYXRoLmlzRW1wdHkoKSkKLQkJCQkJCXNvdXJjZUZvbGRlcnMuYWRkKHAuZ2V0Rm9sZGVyKHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc291cmNlRm9sZGVyczsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Ob0FTVFJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Ob0FTVFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOWUxZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvTm9BU1RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogTm9BU1RSZXNvbHZlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIxOjEzOjUzICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5JbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIHVzZWQgZm9yIEFTVCBSZXNvbHV0aW9uLCBidXQgaXQgc2ltcGx5IHR1cm5zIE5hbWUgaW50byBQVE5hbWUuIFVzZWZ1bCB3aGVuCi0gKiBqdXN0IGNyZWF0aW5nIGEgcGFyc2UgdHJlZSB3aGVyZSB3ZSBrbm93IHRoZSBuYW1lcyBhcmUgb2sgYW5kIGp1c3QgdHlwZXMuIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb0FTVFJlc29sdmVyIGV4dGVuZHMgQVNUQm91bmRSZXNvbHZlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULlJlc29sdmVyI3Jlc29sdmVOYW1lKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gcmVzb2x2ZU5hbWUoTmFtZSBuYW1lKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQlyZXR1cm4gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTmFtZShuYW1lLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZVR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlVHlwZShUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUudG9TdHJpbmcoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlVHlwZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVUeXBlKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5hbWUudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1BhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWM4YzZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1BhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMToxMzo1MyAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotIAotLyoqCi0gKiBDcmVhdGUgYSBwYXJzZSB0cmVlIGZyb20gYW4gQVNUIG5vZGUuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVCBleHRlbmRzIEFTVFZpc2l0b3IgewotCXByb3RlY3RlZCBmaW5hbCBSZXNvbHZlciByZXNvbHZlcjsKLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb247CS8vIEVhY2ggdmlzaXQgKG9yIGVuZHZpc2l0KSB3aWxsIHB1dCBpbnRvIGV4cHJlc3Npb24gdGhlIHJlc3VsdCBvZiB0aGUgdmlzaXQgaWYgaXQgcHJvZHVjZWQgYW4gZXhwcmVzc2lvbi4KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIHVzZWQgYnkgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUIHRvIHJlc29sdmUgdGhlIHR5cGVzIHRvIHRoZSBhcHByb3ByaWF0ZQotCSAqIHR5cGVzIChlLmcuICJTdHJpbmciIHRvICJqYXZhLmxhbmcuU3RyaW5nIikuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVzb2x2ZXIgewotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIE5hbWUuIEl0IGNhbiByZXR1cm4gZWl0aGVyIGEgUFROYW1lIGlmIGl0IGlzIGp1c3QgYSBjbGFzc25hbWUsCi0JCSAqIG9yIGEgUFRGaWVsZEFjY2VzcyBpZiBpdCByZXNvbHZlcyB0byBhIFBURmllbGRBY2Nlc3MuIFRoZSBQVEZpZWxkQWNjZXNzIHNob3VsZAotCQkgKiBiZSBjb21wbGV0ZS4gZS5nIHdlIGhhdmUgY2xhc3MgbGlrZToKLQkJICogPGNvZGU+Ci0JCSAqIAlwYWNrYWdlIHh5ejsgCi0JCSAqIAlwdWJsaWMgY2xhc3MgQUNsYXNzIHsKLQkJICogCQlwdWJsaWMgamF2YS5hd3QuUmVjdGFuZ2xlIHJlY3Q7Ci0JCSAqIAl9IAotCQkgKiA8L2NvZGU+Ci0JCSAqIFRoZW4gYSBOYW1lIGxpa2UgPGNvZGU+QUNsYXNzLnJlY3QueDwvY29kZT4gc2hvdWxkIHJlc29sdmUgdG86Ci0JCSAqIAotCQkgKiBQVEZpZWxkQWNjZXNzOgotCQkgKiAJcmVjZWl2ZXI6IAotCQkgKiAJCVBURmllbGRBY2Nlc3MKLQkJICogCQkJcmVjZWl2ZXI6IHh5ei5BQ2xhc3MKLQkJICogCQkJZmllbGQ6ICJyZWN0IgotCQkgKiAJZmllbGQ6ICJ4IgotCQkgKgotCQkgKiBBY3R1YWxseSBpdCBjYW4gcmV0dXJuIGFueSB2YWxpZCBleHByZXNzaW9uIHRoYXQgaGFzIGEgdmFsdWUgKGkuZS4gaXQgY2Fubm90IGJlIGEgbWV0aG9kIGludm9jYXRpb24gd2l0aCBhIDxjb2RlPnZvaWQ8L2NvZGU+IHJldHVybiB0eXBlKS4gCi0JCSAqIAotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcmV0dXJuIEVpdGhlciBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIChhcyBhIFBUTmFtZSkgb3IgYSBQVEZpZWxkQWNjZXNzLCBhbnkgb3RoZXIgdHlwZSBvZiBleHByZXNzaW9uLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgUFRFeHByZXNzaW9uIHJlc29sdmVOYW1lKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIHR5cGUuIElmIGl0IGlzIGFuIGFycmF5IHR5cGUgcmV0dXJuIGl0IGluIGZvcm1hdCAidHlwZVtdW10iLgotCQkgKiAKLQkJICogQHBhcmFtIHR5cGUKLQkJICogQHJldHVybiBUaGUgdHlwZSBuYW1lLCBpbmNsdWRpbmcgYnJhY2tldHMgaWYgYXJyYXkgdHlwZS4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlVHlwZShUeXBlIHR5cGUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBUaGlzIGlzIGZvciByZXNvbHZpbmcgInRoaXMiIGxpdGVyYWwuIEl0IHNob3VsZCBlaXRoZXIgcmV0dXJuIGEgUFRUaGlzTGl0ZXJhbCwgaWYgaXQKLQkJICogY2FuJ3QgZG8gcmVzb2x2ZSwgb3Igc29tZSBQVEV4cHJlc3Npb24gdGhhdCBjYW4gcmVzb2x2ZSB0byAidGhpcyIgZm9yIGV2YWx1YXRpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIElmIHJlc29sdmFibGUsIGEgUFRFeHByZXNzaW9uLCBlbHNlIGEgUFRUaGlzTGl0ZXJhbCBpZiBub3QgcmVzb2x2YWJsZS4KLQkJICogQHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgUFRFeHByZXNzaW9uIHJlc29sdmVUaGlzKCkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIHR5cGUgc3BlY2lmaWVkIGFzIGEgTmFtZS4gSXQgbWF5IGJlIGEgc2ltcGxlIG5hbWUgb3IgaXQgbWF5IGJlCi0JCSAqIGEgcXVhbGlmaWVkIG5hbWUuIFRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgTmFtZSB0aGF0IHdlIGtub3cgbXVzdCBiZSBhCi0JCSAqIHR5cGUuIFRoaXMgaXMgc28gdGhhdCB0aGVyZSBpcyBubyBjb25mdXNpb24gd2l0aCBpdCBwb3NzaWJseSBiZWluZyBhIGZpZWxkIG9yIHZhcmlhYmxlCi0JCSAqIHRoYXQgaGFzIHRoZSBzYW1lIGNhc2UgYW5kIHNwZWxsaW5nIGFzIGEgdHlwZSBuYW1lLgotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUuCi0JCSAqIEB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlVHlwZShOYW1lIG5hbWUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlc29sdmVyIGlmIGl0IGNhbid0IHJlc29sdmUgZm9yIHNvbWUgcmVhc29uLiBUaGlzIHdpbGwgdGhyb3cKLQkJICogYW4gaW52YWxpZCBleHByZXNzaW9uIGV4Y2VwdGlvbiB3aGljaCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC4KLQkJICogCi0JCSAqIEBwYXJhbSBtc2cgTWVzc2FnZSB0byBiZSBwdXQgaW50byB0aGUgZXhjZXB0aW9uLgotCQkgKiBAdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXByb3RlY3RlZCBmaW5hbCB2b2lkIHRocm93SW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oU3RyaW5nIG1zZykgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JfQotCQotCS8qCi0JICogV2hlbiBhbiBpbnZhbGlkIGV4cHJlc3Npb24gaGFzIGJlZW4gZm91bmQgdGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93bi4gSXQgd2lsbAotCSAqIGJlIGNhdWdodCBhdCB0aGUgdG9wIGFuZCBjb252ZXJ0ZWQgaW50byBhbiBJbnZhbGlkRXhwcmVzc2lvbiBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhcnNlIHRyZWUgd2lsbCBiZQotCSAqIHRocm93biBhd2F5LiAKLQkgKiAKLQkgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIGEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNDI5ODQ1NjMxOTE1MjA2Njc4TDsKLQotCQkvKioKLQkJICogQHBhcmFtIHMgVGhlIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiB0aGUgZmluYWwgaW52YWxpZCBleHByZXNzaW9uLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIGdpdmVuIHJlc29sdmVyLgotCSAqIAotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QoUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIEFTVCBFeHByZXNzaW9uIGFuZCByZXR1cm4gYSBQVEV4cHJlc3Npb24uIElmIGFueSBwYXJ0IHdhcyBpbnZhbGlkLCB0aGVuCi0JICogb25seSBhbiBQVEludmFsaWRFeHByZXNzaW9uIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGFzdEV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIFRoZSBQVEV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIFBURXhwcmVzc2lvbiBjcmVhdGVFeHByZXNzaW9uKEV4cHJlc3Npb24gYXN0RXhwcmVzc2lvbikgewotCQl0cnkgewotCQkJcmV0dXJuIHBlcmZvcm0oYXN0RXhwcmVzc2lvbik7Ci0JCX0gY2F0Y2ggKEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENyZWF0ZSBhIG1zZyB0aGF0IGlzIGZvcm1lZCBvZiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYW5kIHRoZSBmdWxsIGluaXQgc3RyaW5nLgotCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfMCwgbmV3IE9iamVjdFtdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgYXN0RXhwcmVzc2lvbi50b1N0cmluZygpfSk7IAotCQkJUFRJbnZhbGlkRXhwcmVzc2lvbiBleHAgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQkJZXhwLnNldE1lc3NhZ2UobXNnKTsKLQkJCXJldHVybiBleHA7Ci0JCX0JCi0JfQotCQotCS8qCi0JICogVmlzaXQgdGhlIEFTVCBleHByZXNzaW9uIGFuZCBnZXQgdGhlIFBhcnNlVHJlZSBFeHByZXNzaW9uLgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgaW5kaXZpZHVhbCB2aXNpdHMgd2hlbiBwYXJzaW5nIGEgdHJlZS4KLQkgKiBJdCBwYXNzZXMgdG8gdGhlIHRvcCBtZXRob2QgKGNyZWF0ZUV4cHJlc3Npb24pLCB3aGljaCBjYW4KLQkgKiBoYW5kbGUgdGhlIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uLgotCSAqIAotCSAqIElmIGFueSB2aXNpdCBkb2Vzbid0IHJldHVybiBhbiBleHByZXNzaW9uLCB0aGVuIGFuIGludmFsaWQKLQkgKiBleHByZXNzaW9uIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biB0byBpbmRpY2F0ZSB0aGlzLiBJZiB0aGUKLQkgKiBpbmNvbWluZyBleHByZXNzaW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHJldHVybiBvZiA8Y29kZT5udWxsPC9jb2RlPiBpcyBvayBiZWNhdXNlCi0JICogdGhpcyB3b3VsZCBiZSBmb3IgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aGljaCBkaWRuJ3QgZXhpc3QuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IFBhcnNlVHJlZSBFeHByZXNzaW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGluY29taW5nIGV4cHJlc3Npb24gd2FzIG51bGwuIAotCSAqIAotCSAqIEBzZWUgY3JlYXRlRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbikKLQkgKiBAZXhjZXB0aW9uIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFBURXhwcmVzc2lvbiBwZXJmb3JtKEV4cHJlc3Npb24gYXN0RXhwcmVzc2lvbikgewotCQlpZiAoYXN0RXhwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQlleHByZXNzaW9uID0gbnVsbDsKLQkJCWFzdEV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwotCQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9FeHByZXNzaW9uVG9vQ29tcGxpY2F0ZWRfRVhDXywgbmV3IE9iamVjdFtdIHthc3RFeHByZXNzaW9uLnRvU3RyaW5nKCl9KSk7IAotCQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7CS8vIFRoaXMgaXMgb2suIEl0IG1lYW5zIGFuIG9wdGlvbmFsIGV4cHJlc3Npb24gd2FzIGJlaW5nIHByb2Nlc3NlZCBhbmQgdGhlIGV4cHJlc3Npb24gZGlkbid0IGV4aXN0LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUFjY2VzcyBub2RlKSB7Ci0JCVBUQXJyYXlBY2Nlc3MgYWEgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCQlMaXN0IGluZGV4ZXMgPSBhYS5nZXRJbmRleGVzKCk7Ci0JCUV4cHJlc3Npb24gYXJyYXlFeHAgPSBub2RlOwotCQl3aGlsZSAoYXJyYXlFeHAuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0FDQ0VTUykgewotCQkJLy8gVmlzaXQgdGhlIGluZGV4IHRvIGdldCB0aGUgaW5kZXggZXhwcmVzc2lvbi4KLQkJCUFycmF5QWNjZXNzIGFycmF5ID0gKEFycmF5QWNjZXNzKSBhcnJheUV4cDsgCi0JCQlpbmRleGVzLmFkZCgwLCBwZXJmb3JtKGFycmF5LmdldEluZGV4KCkpKTsJLy8gV2UncmUgdHJ5aW5nIHRvIGNyZWF0ZSB0aGUgZmluYWwgZXhwcmVzc2lvbiBmcm9tIGluc2lkZSBvdXQsIHRoZSBpbmRleGVzIGFyZSBjcmVhdGVkIGluIHJldmVyc2Ugb3JkZXIuCi0JCQlhcnJheUV4cCA9IGFycmF5LmdldEFycmF5KCk7Ci0JCX0KLQkJYWEuc2V0QXJyYXkocGVyZm9ybShhcnJheUV4cCkpOwkvLyBGaW5hbCBhcnJheUV4cCBpcyB0aGUgdHJ1ZSBleHByZXNzaW9uLgotCQlleHByZXNzaW9uID0gYWE7CS8vIFNldCB0aGUgcmV0dXJuIGV4cHJlc3Npb24gZm9yIHRoaXMgdmlzaXQuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5Q3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCVBUQXJyYXlDcmVhdGlvbiBhYyA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEFycmF5Q3JlYXRpb24oKTsKLQkJYWMuc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSkpOwotCQlMaXN0IGFjRGltcyA9IGFjLmdldERpbWVuc2lvbnMoKTsKLQkJTGlzdCBuRGltcyA9IG5vZGUuZGltZW5zaW9ucygpOwotCQlpbnQgbnNpemUgPSBuRGltcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnNpemU7IGkrKykgewotCQkJYWNEaW1zLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBuRGltcy5nZXQoaSkpKTsKLQkJfQotCQlhYy5zZXRJbml0aWFsaXplcigoUFRBcnJheUluaXRpYWxpemVyKSBwZXJmb3JtKG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSkpOwotCQlleHByZXNzaW9uID0gYWM7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJUFRBcnJheUluaXRpYWxpemVyIGFpID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQlMaXN0IGV4cHMgPSBub2RlLmV4cHJlc3Npb25zKCk7Ci0JCUxpc3QgYWlleHBzID0gYWkuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJaW50IG5leHAgPSBleHBzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXhwOyBpKyspIHsKLQkJCWFpZXhwcy5hZGQocGVyZm9ybSgoRXhwcmVzc2lvbikgZXhwcy5nZXQoaSkpKTsKLQkJfQotCQlleHByZXNzaW9uID0gYWk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXNzaWdubWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBjYW4ndCBoYW5kbGUgYXNzaWdubWVudC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlQVEJvb2xlYW5MaXRlcmFsIGJsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoKTsKLQkJYmwuc2V0Qm9vbGVhblZhbHVlKG5vZGUuYm9vbGVhblZhbHVlKCkpOwotCQlleHByZXNzaW9uID0gYmw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlQVENhc3RFeHByZXNzaW9uIGN0CT0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJY3Quc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSkpOwotCQljdC5zZXRFeHByZXNzaW9uKHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJZXhwcmVzc2lvbiA9IGN0OwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCVBUQ2hhcmFjdGVyTGl0ZXJhbCBjbCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJY2wuc2V0RXNjYXBlZFZhbHVlKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQljbC5zZXRDaGFyVmFsdWUobm9kZS5jaGFyVmFsdWUoKSk7Ci0JCWV4cHJlc3Npb24gPSBjbDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpICE9IG51bGwpIHsgdGhyb3cgbmV3IEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfQ2Fubm90UHJvY2Vzc0Fub255bW91c0RlY2xhcmF0aW9uc19FWENfKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNpYyA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkvLyBJZiBhc3QgbGV2ZWwgPSAyLCB0aGVuIHlvdSBtdXN0IHVzZSBnZXROYW1lLCBidXQgdGhlIG5hbWUgbmVlZHMgdG8gYmUgdHVybmVkIGludG8gYSB0eXBlCi0JCS8vIHNvIHRoYXQgaXQgY2FuIGJlIHJlc29sdmVkLiBJZiBhc3QgbGV2ZWwgPiAyLCB0aGVuIGl0IHdpbGwgcmV0dXJuIGEgdHlwZSB0byBiZSByZXNvbHZlZC4KLQkJLy8gTm90ZTogY2FuJ3QganVzdCB1c2UgcmVzb2x2ZSBuYW1lIG9uIHRoZSBuYW1lIGJlY2F1c2UgaWYgYSBmaWVsZCBhbmQgYSBjbGFzcyB3ZXJlIHNwZWxsZWQKLQkJLy8gdGhlIHNhbWUgdGhlbiB0aGUgY29kZWdlbiByZXNvbHZlciB3b3VsZCByZXR1cm4gYW4gaW5zdGFuY2UgcmVmIHRvIHRoZSBmaWVsZCBpbnN0ZWFkLgotCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMiA/IHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0TmFtZSgpKSA6IHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0VHlwZSgpKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdHlwZSA9IG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMiA/IG5vZGUuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIDogbm9kZS5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLQkJfQotCQljaWMuc2V0VHlwZSh0eXBlKTsKLQkJTGlzdCBhcmdzID0gY2ljLmdldEFyZ3VtZW50cygpOwotCQlMaXN0IG5hcmdzID0gbm9kZS5hcmd1bWVudHMoKTsKLQkJaW50IG5zaXplID0gbmFyZ3Muc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5zaXplOyBpKyspIHsKLQkJCWFyZ3MuYWRkKHBlcmZvcm0oKEV4cHJlc3Npb24pIG5hcmdzLmdldChpKSkpOwotCQl9Ci0JCWV4cHJlc3Npb24gPSBjaWM7Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbmRpdGlvbmFsRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQlQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjZSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCQljZS5zZXRDb25kaXRpb24ocGVyZm9ybShub2RlLmdldEV4cHJlc3Npb24oKSkpOwotCQljZS5zZXRUcnVlKHBlcmZvcm0obm9kZS5nZXRUaGVuRXhwcmVzc2lvbigpKSk7Ci0JCWNlLnNldEZhbHNlKHBlcmZvcm0obm9kZS5nZXRFbHNlRXhwcmVzc2lvbigpKSk7Ci0JCWV4cHJlc3Npb24gPSBjZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCVBURmllbGRBY2Nlc3MgZmEgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQlmYS5zZXRSZWNlaXZlcihwZXJmb3JtKG5vZGUuZ2V0RXhwcmVzc2lvbigpKSk7Ci0JCWZhLnNldEZpZWxkKG5vZGUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7Ci0JCWV4cHJlc3Npb24gPSBmYTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEhhc2hNYXAgaW5maXhPcGVyVG9QYXJzZU9wZXI7Ci0JcHJpdmF0ZSBmaW5hbCBQVEluZml4T3BlcmF0b3IgZ2V0UGFyc2VJbmZpeChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJaWYgKHByZWZpeE9wZXJUb1BhcnNlT3BlciA9PSBudWxsKSB7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3BlciA9IG5ldyBIYXNoTWFwKDUpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5BTkQsIFBUSW5maXhPcGVyYXRvci5BTkRfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTkRJVElPTkFMX0FORCwgUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX0FORF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09ORElUSU9OQUxfT1IsIFBUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9PUl9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuRElWSURFLCBQVEluZml4T3BlcmF0b3IuRElWSURFX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5FUVVBTFMsIFBUSW5maXhPcGVyYXRvci5FUVVBTFNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVJfRVFVQUxTLCBQVEluZml4T3BlcmF0b3IuR1JFQVRFUl9FUVVBTFNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVIsIFBUSW5maXhPcGVyYXRvci5HUkVBVEVSX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRUZUX1NISUZULCBQVEluZml4T3BlcmF0b3IuTEVGVF9TSElGVF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTU19FUVVBTFMsIFBUSW5maXhPcGVyYXRvci5MRVNTX0VRVUFMU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUywgUFRJbmZpeE9wZXJhdG9yLkxFU1NfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk1JTlVTLCBQVEluZml4T3BlcmF0b3IuTUlOVVNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk5PVF9FUVVBTFMsIFBUSW5maXhPcGVyYXRvci5OT1RfRVFVQUxTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5PUiwgUFRJbmZpeE9wZXJhdG9yLk9SX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTLCBQVEluZml4T3BlcmF0b3IuUExVU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUkVNQUlOREVSLCBQVEluZml4T3BlcmF0b3IuUkVNQUlOREVSX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORUQsIFBUSW5maXhPcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORURfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVELCBQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlRJTUVTLCBQVEluZml4T3BlcmF0b3IuVElNRVNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlhPUiwgUFRJbmZpeE9wZXJhdG9yLlhPUl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gKFBUSW5maXhPcGVyYXRvcikgaW5maXhPcGVyVG9QYXJzZU9wZXIuZ2V0KG9wZXJhdG9yKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlQVEluZml4RXhwcmVzc2lvbiBpbmYgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5mLnNldExlZnRPcGVyYW5kKHBlcmZvcm0obm9kZS5nZXRMZWZ0T3BlcmFuZCgpKSk7Ci0JCVBUSW5maXhPcGVyYXRvciBpbm9wZXIgPSBnZXRQYXJzZUluZml4KG5vZGUuZ2V0T3BlcmF0b3IoKSk7Ci0JCWlmIChpbm9wZXIgPT0gbnVsbCkgewotCQkJLy8gSXQgaXMgbm90IG9uZSB3ZSBjYW4gaGFuZGxlLgotCQkJdGhyb3cgbmV3IEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKAotCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfLCBuZXcgT2JqZWN0W10geyBub2RlLmdldE9wZXJhdG9yKCkudG9TdHJpbmcoKSB9KSk7IAotCQl9Ci0JCWluZi5zZXRPcGVyYXRvcihpbm9wZXIpOwotCQlpbmYuc2V0UmlnaHRPcGVyYW5kKHBlcmZvcm0obm9kZS5nZXRSaWdodE9wZXJhbmQoKSkpOwotCQlMaXN0IGVvcHMgPSBpbmYuZ2V0RXh0ZW5kZWRPcGVyYW5kcygpOwotCQlMaXN0IG5lb3BzID0gbm9kZS5leHRlbmRlZE9wZXJhbmRzKCk7Ci0JCWludCBuc2l6ZSA9IG5lb3BzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuc2l6ZTsgaSsrKSB7Ci0JCQllb3BzLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBuZW9wcy5nZXQoaSkpKTsKLQkJfQotCQlleHByZXNzaW9uID0gaW5mOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluc3RhbmNlb2ZFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uIG5vZGUpIHsKLQkJUFRJbnN0YW5jZW9mIGlub2YgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRJbnN0YW5jZW9mKCk7Ci0JCWlub2Yuc2V0T3BlcmFuZChwZXJmb3JtKG5vZGUuZ2V0TGVmdE9wZXJhbmQoKSkpOwotCQlpbm9mLnNldFR5cGUocmVzb2x2ZXIucmVzb2x2ZVR5cGUobm9kZS5nZXRSaWdodE9wZXJhbmQoKSkpOwotCQlleHByZXNzaW9uID0gaW5vZjsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Qb3N0Zml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsJLy8gV2UgY2FuJ3QgaGFuZGxlIHBvc3QgZml4LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2RJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlQVE1ldGhvZEludm9jYXRpb24gbWkgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCW1pLnNldFJlY2VpdmVyKHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJbWkuc2V0TmFtZShub2RlLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkpOwotCQlMaXN0IGFyZ3MgPSBtaS5nZXRBcmd1bWVudHMoKTsKLQkJTGlzdCBuYXJncyA9IG5vZGUuYXJndW1lbnRzKCk7Ci0JCWludCBuc2l6ZSA9IG5hcmdzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuc2l6ZTsgaSsrKSB7Ci0JCQlhcmdzLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBuYXJncy5nZXQoaSkpKTsKLQkJfQotCQlleHByZXNzaW9uID0gbWk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVsbExpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgewotCQlleHByZXNzaW9uID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTnVsbExpdGVyYWwoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bWJlckxpdGVyYWwgbm9kZSkgewotCQlQVE51bWJlckxpdGVyYWwgbmwgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0JCW5sLnNldFRva2VuKG5vZGUuZ2V0VG9rZW4oKSk7Ci0JCWV4cHJlc3Npb24gPSBubDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcGUgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQlwZS5zZXRFeHByZXNzaW9uKHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJZXhwcmVzc2lvbiA9IHBlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBwcmVmaXhPcGVyVG9QYXJzZU9wZXI7Ci0JcHJpdmF0ZSBmaW5hbCBQVFByZWZpeE9wZXJhdG9yIGdldFBhcnNlUHJlZml4KFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJaWYgKHByZWZpeE9wZXJUb1BhcnNlT3BlciA9PSBudWxsKSB7Ci0JCQlwcmVmaXhPcGVyVG9QYXJzZU9wZXIgPSBuZXcgSGFzaE1hcCg1KTsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3Blci5wdXQoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT01QTEVNRU5ULCBQVFByZWZpeE9wZXJhdG9yLkNPTVBMRU1FTlRfTElURVJBTCk7Ci0JCQlwcmVmaXhPcGVyVG9QYXJzZU9wZXIucHV0KFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMsIFBUUHJlZml4T3BlcmF0b3IuTUlOVVNfTElURVJBTCk7Ci0JCQlwcmVmaXhPcGVyVG9QYXJzZU9wZXIucHV0KFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTk9ULCBQVFByZWZpeE9wZXJhdG9yLk5PVF9MSVRFUkFMKTsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3Blci5wdXQoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTLCBQVFByZWZpeE9wZXJhdG9yLlBMVVNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIChQVFByZWZpeE9wZXJhdG9yKSBwcmVmaXhPcGVyVG9QYXJzZU9wZXIuZ2V0KG9wZXJhdG9yKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByZWZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWlmIChub2RlLmdldE9wZXJhbmQoKS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTlVNQkVSX0xJVEVSQUwpIHsKLQkJCS8vIEZvciBudW1iZXIgbGl0ZXJhbHMgd2Ugc2VlIGlmIGl0IGlzIGEgIisiIG9yICItIiBwcmVmaXgsIGFuZCBpZiBpdCBpcywgd2Ugc2ltcGx5Ci0JCQkvLyBjcmVhdGUgYSBQVE51bWJlckxpdGVyYWwgd2l0aCB0aGUgb3BlcmF0b3IgYWxyZWFkeSBpbiBpdC4gSXQgaXMgYSBzaW1wbGlmaWNhdGlvbi4KLQkJCS8vIEFueSBvdGhlciBvcGVyYXRvciB3ZSd2ZSBsZWZ0IGFsb25lIHNpbmNlIHRob3NlIHdvbid0IGJlIGRlY29kZWQgc2ltcGx5IGJ5IHRoZQotCQkJLy8gTnVtYmVyIGRlY29kZXIuCi0JCQkvLyBJZiBub3QgYSBudW1iZXIgbGl0ZXJhbCwgdGhlbiBsZWF2ZSBhbG9uZSBzaW5jZSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgcHJlZml4Ci0JCQkvLyBvcGVyYXRpb24uCi0JCQlQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yIG9wZXJhdG9yID0gbm9kZS5nZXRPcGVyYXRvcigpOwotCQkJaWYgKG9wZXJhdG9yID09IFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyB8fCBvcGVyYXRvciA9PSBQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLk1JTlVTKSB7Ci0JCQkJUFROdW1iZXJMaXRlcmFsIG5tID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTnVtYmVyTGl0ZXJhbCgpOwotCQkJCW5tLnNldFRva2VuKG9wZXJhdG9yLnRvU3RyaW5nKCkgKyAoKE51bWJlckxpdGVyYWwpIG5vZGUuZ2V0T3BlcmFuZCgpKS5nZXRUb2tlbigpKTsKLQkJCQlleHByZXNzaW9uID0gbm07Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJUFRQcmVmaXhFeHByZXNzaW9uIHBlID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpOwotCQlQVFByZWZpeE9wZXJhdG9yIHB0b3BlciA9IGdldFBhcnNlUHJlZml4KG5vZGUuZ2V0T3BlcmF0b3IoKSk7Ci0JCWlmIChwdG9wZXIgPT0gbnVsbCkgewotCQkJLy8gSXQgaXMgbm90IG9uZSB3ZSBjYW4gaGFuZGxlLgotCQkJdGhyb3cgbmV3IEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKAotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfT3BlcmF0b3JUb29Db21wbGljYXRlZFRvSGFuZGxlX0VYQ18sIG5ldyBPYmplY3RbXSB7IG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpIH0pKTsgCi0JCX0KLQkJcGUuc2V0T3BlcmF0b3IocHRvcGVyKTsKLQkJcGUuc2V0RXhwcmVzc2lvbihwZXJmb3JtKG5vZGUuZ2V0T3BlcmFuZCgpKSk7Ci0JCWV4cHJlc3Npb24gPSBwZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgewotCQlleHByZXNzaW9uID0gcmVzb2x2ZXIucmVzb2x2ZU5hbWUobm9kZSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSByZXNvbHZlci5yZXNvbHZlTmFtZShub2RlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQlQVFN0cmluZ0xpdGVyYWwgc2wgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0JCXNsLnNldEVzY2FwZWRWYWx1ZShub2RlLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJc2wuc2V0TGl0ZXJhbFZhbHVlKG5vZGUuZ2V0TGl0ZXJhbFZhbHVlKCkpOwotCQlleHByZXNzaW9uID0gc2w7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJGaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBjYW4ndCBoYW5kbGUgcG9zdCBmaXguCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyTWV0aG9kSW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGNhbid0IGhhbmRsZSBwb3N0IGZpeC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGhpc0V4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVGhpc0V4cHJlc3Npb24gbm9kZSkgewotCQlleHByZXNzaW9uID0gcmVzb2x2ZXIucmVzb2x2ZVRoaXMoKTsKLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZUxpdGVyYWwgbm9kZSkgewotCQlQVFR5cGVMaXRlcmFsIHB0bCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFR5cGVMaXRlcmFsKCk7Ci0JCXB0bC5zZXRUeXBlKHJlc29sdmVyLnJlc29sdmVUeXBlKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCWV4cHJlc3Npb24gPSBwdGw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L1dvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzdhZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5Lm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX0V4cHJlc3Npb25Ub29Db21wbGljYXRlZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9DYW5ub3RQcm9jZXNzQW5vbnltb3VzRGVjbGFyYXRpb25zX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxGaWVsZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjY0ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gezB9IC0gezF9Ci1QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfRXhwcmVzc2lvblRvb0NvbXBsaWNhdGVkX0VYQ18gICAgICAgICAgID0gSVdBVjAxNzdFIEV4cHJlc3Npb24gInswfSIgaXMgdG9vIGNvbXBsaWNhdGVkLgotUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX0Nhbm5vdFByb2Nlc3NBbm9ueW1vdXNEZWNsYXJhdGlvbnNfRVhDXyA9IElXQVYwMTc4RSBDYW5ub3QgcHJvY2VzcyBhbm9ueW1vdXMgZGVjbGFyYXRpb25zLgotUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfICAgICA9IElXQVYwMTc5RSBPcGVyYXRvciAiezB9IiBpcyB0b28gY29tcGxpY2F0ZWQgdG8gaGFuZGxlLgotQVNUQm91bmRSZXNvbHZlcl9DYW5ub3RIYW5kbGVMb2NhbEZpZWxkX0VYQ189Q2Fubm90IGhhbmRsZSBsb2NhbCBmaWVsZCBhY2Nlc3Mgb2YgInswfSIKLUFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfPUNhbm5vdCBoYW5kbGUgbG9jYWwgdmFyaWFibGUgYWNjZXNzIG9mICJ7MH0iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjZDdhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqYXZhaW5zdC8iLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2ZqYXZhLyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0NjNhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzZjhkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZWZpbGU9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ2xldmVsPWRlZmF1bHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmE1NjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZW0ucHJveHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLm9zZ2k8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnJ0cC50b29scy5yb3NlLmJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PnJvc2U8L2tleT4KLQkJCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ydHAudG9vbHMucm9zZS50b29sbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTY5YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLSNUaHUgSnVuIDE2IDEyOjQyOjI4IEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWVhYWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNXZWQgTWF5IDExIDE4OjMyOjEzIEVEVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249OAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJmNmJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IGphdmFpbnN0LmphciwKLSBtb2ZqYXZhLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmNvcmUuSkVNUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuY29yZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8sb3JnLmVjbGlwc2UuamVtLnByb3h5LG9yZy5lY2xpcHNlLmplbS50ZXN0cyxvcmcuZWNsaXBzZS5qZW0udWksb3JnLmVjbGlwc2UuamVtLnV0aWwsb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24sCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyxvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmJlYW5pbmZvLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmplbS5wcm94eTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5pbmkgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWEzZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5tYXBwaW5ncyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTFlY2M5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJAotIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1KYXZhIEVNRiBNb2RlbFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy4gMjAwMCwgMjAwNC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3ZlcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMDVmYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zcmMuZXhjbHVkZXMgPSAqKi8uY3ZzaWdub3JlCi1zb3VyY2UubW9mamF2YS5qYXIgPSBtb2ZqYXZhLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBqYXZhaW5zdC5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIG92ZXJyaWRlcy8sXAotICAgICAgICAgICAgICAgbW9mamF2YS5qYXIsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBtb2ZqYXZhLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBqYXZhaW5zdC5qYXIKLXNvdXJjZS5qYXZhaW5zdC5qYXIgPSBqYXZhaW5zdC8KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgbW9kZWwvLFwKLSAgICAgICAgICAgICAgIHJvc2UvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9lY2xpcHNlMzIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW1wbGljaXRBbGxvY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbXBsaWNpdEFsbG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwNThlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbXBsaWNpdEFsbG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBJbXBsaWNpdEFsbG9jYXRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1wbGljaXQgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgZm9yIGFuIGltcGxpY2l0IGFsbG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBjb21lcyBmcm9tIHRoZSBmZWF0dXJlIG9mIGFub3RoZXIgb2JqZWN0LiBJdCBpcyB0aGUgbGl2ZSBKYXZhIHZhbHVlIGZyb20gdGhlIHJlbW90ZSB2bS4KLSAqIDwvcD4gCi0gKiBAc2luY2UgMS4wLjAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyBpcyBmb3IgYW4gaW1wbGljaXQgYWxsb2NhdGlvbiB3aGVyZSB0aGUgb2JqZWN0IGNvbWVzIGZyb20gdGhlIGZlYXR1cmUgb2YgYW5vdGhlciBvYmplY3QuIEl0IGlzIHRoZSBsaXZlIEphdmEgdmFsdWUgZnJvbSB0aGUgcmVtb3RlIHZtLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldEZlYXR1cmUgPGVtPkZlYXR1cmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEltcGxpY2l0QWxsb2NhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbXBsaWNpdEFsbG9jYXRpb24gZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIFRoZSBwYXJlbnQgd2hvIGlzIHRvIGdpdmUgdXAgdGhlIHZhbHVlLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcmVudChFT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0SW1wbGljaXRBbGxvY2F0aW9uX1BhcmVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFT2JqZWN0IGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBhcmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyZW50KEVPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmVhdHVyZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogVGhlIGZlYXR1cmUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcXVlcnkgdGhlIGxpdmUgdmFsdWUuCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZlYXR1cmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0SW1wbGljaXRBbGxvY2F0aW9uX0ZlYXR1cmUoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRGZWF0dXJlIDxlbT5GZWF0dXJlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZWF0dXJlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRGZWF0dXJlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSB2YWx1ZSk7Ci0KLX0gLy8gSW1wbGljaXRBbGxvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9Jbml0U3RyaW5nQWxsb2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5pdFN0cmluZ0FsbG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmODk3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9Jbml0U3RyaW5nQWxsb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSW5pdFN0cmluZ0FsbG9jYXRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGFsbG9jYXRpb24gc3RyaW5nIGNhbiBiZSBwYXJzZWQgYnkgdGhlIHJlbW90ZSB2bS4gSXQgdXNlcyB0aGUgYWxsb2NTdHJpbmcuIAotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbiNnZXRBbGxvY1N0cmluZygpCi0gKiBAc2luY2UgMS4wLjAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGFsbG9jYXRpb24gc3RyaW5nIGNhbiBiZSBwYXJzZWQgYnkgdGhlIHJlbW90ZSB2bS4gSXQgdXNlcyB0aGUgYWxsb2NTdHJpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24jZ2V0SW5pdFN0cmluZyA8ZW0+SW5pdCBTdHJpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEluaXRTdHJpbmdBbGxvY2F0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaXRTdHJpbmdBbGxvY2F0aW9uIGV4dGVuZHMgSmF2YUFsbG9jYXRpb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBTdHJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXQgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZyBmb3IgdGhpcyBvYmplY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbml0U3RyaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEluaXRTdHJpbmdBbGxvY2F0aW9uX0luaXRTdHJpbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SW5pdFN0cmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24jZ2V0SW5pdFN0cmluZyA8ZW0+SW5pdCBTdHJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0U3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbml0U3RyaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW5pdFN0cmluZ0FsbG9jYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWUzMDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluc3RhbnRpYXRpb25GYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMTAvMDMgMTk6MjA6NDEgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEluc3RhbmNlUmVmZXJlbmNlIGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IFBUSW5zdGFuY2VSZWZlcmVuY2Ugd2l0aCBhIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlQVEluc3RhbmNlUmVmZXJlbmNlIGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoSUphdmFJbnN0YW5jZSBpbnN0YW5jZSk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBpbnZhbGlkIGV4cHJlc3Npb24gd2l0aCBhIG1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIFRoZSBuZXcgaW52YWxpZCBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUSW52YWxpZEV4cHJlc3Npb24gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbihTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicgYXMKLQkgKiB1dGlsaXR5IHdpdGggYSBnaXZlbiBpbml0IHN0cmluZy4KLQkgKiBAcGFyYW0gaW5pdFN0cmluZyAtIFN0cmluZyB0byBwdXQgaW50byBpbml0aWFsaXphdGlvbi4KLQkgKiBAcmV0dXJuIFRoZSBhbGxvY2F0aW9uIGluaXRpYWxpemVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCUluaXRTdHJpbmdBbGxvY2F0aW9uIGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKFN0cmluZyBpbml0U3RyaW5nKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicgYXMKLQkgKiB1dGlsaXR5IHdpdGggYSBnaXZlbiBwYXJlbnQgYW5kIGZlYXR1cmUuCi0JICogQHBhcmFtIHBhcmVudCBUaGUgc291cmNlIHRvIGdldCB0aGUgdmFsdWUgZnJvbS4KLQkgKiBAcGFyYW0gc2YgVGhlIGZlYXR1cmUgb24gdGhlIHNvdXJjZSBmb3IgdGhlIHZhbHVlLgotCSAqIEByZXR1cm4gVGhlIGFsbG9jYXRpb24gaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSW1wbGljaXRBbGxvY2F0aW9uIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbihFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIHNmKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5zdGFudGlhdGlvblBhY2thZ2UgZ2V0SW5zdGFudGlhdGlvblBhY2thZ2UoKTsKLQotfSAvL0luc3RhbnRpYXRpb25GYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvblBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkYWY0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLSAqICAkUkNTZmlsZTogSW5zdGFudGlhdGlvblBhY2thZ2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTEgJCAgJERhdGU6IDIwMDUvMTAvMDMgMTk6MjA6NDEgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogSmF2YSBJbnN0YW50aWF0aW9uIFBhY2thZ2UKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluc3RhbnRpYXRpb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiaW5zdGFudGlhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnN0YW50aWF0aW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSA8ZW0+SUphdmEgSW5zdGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldElKYXZhSW5zdGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUpBVkFfSU5TVEFOQ0UgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSmF2YSBJbnN0YW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSkFWQV9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIDxlbT5JSmF2YSBPYmplY3QgSW5zdGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldElKYXZhT2JqZWN0SW5zdGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUpBVkFfT0JKRUNUX0lOU1RBTkNFID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UgPGVtPklKYXZhIERhdGEgVHlwZSBJbnN0YW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRJSmF2YURhdGFUeXBlSW5zdGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUpBVkFfREFUQV9UWVBFX0lOU1RBTkNFID0gMDsKLQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSmF2YSBEYXRhIFR5cGUgSW5zdGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUpBVkFfREFUQV9UWVBFX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUphdmEgT2JqZWN0IEluc3RhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElKQVZBX09CSkVDVF9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UID0gSUpBVkFfSU5TVEFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSmF2YUFsbG9jYXRpb25JbXBsIDxlbT5KYXZhIEFsbG9jYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkphdmFBbGxvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SmF2YUFsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSkFWQV9BTExPQ0FUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SmF2YSBBbGxvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwgPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5JVF9TVFJJTkdfQUxMT0NBVElPTiA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBTdHJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORyA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX1NUUklOR19BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW1wbGljaXRBbGxvY2F0aW9uSW1wbCA8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW1wbGljaXRBbGxvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNUExJQ0lUX0FMTE9DQVRJT04gPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVCA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRSA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTVBMSUNJVF9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCA8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQQVJTRV9UUkVFX0FMTE9DQVRJT04gPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04gPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJTRV9UUkVFX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEV4cHJlc3Npb25JbXBsIDxlbT5QVCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfRVhQUkVTU0lPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5QWNjZXNzSW1wbCA8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5QWNjZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRBcnJheUFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9BUlJBWV9BQ0NFU1MgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFycmF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQUNDRVNTX19BUlJBWSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXhlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0FDQ0VTU19GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsIDxlbT5QVCBBcnJheSBDcmVhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUNyZWF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRBcnJheUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpbWVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsaXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlJbml0aWFsaXplckltcGwgPGVtPlBUIEFycmF5IEluaXRpYWxpemVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5SW5pdGlhbGl6ZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEFycmF5SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfSU5JVElBTElaRVIgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHByZXNzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRCb29sZWFuTGl0ZXJhbEltcGwgPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRCb29sZWFuTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQm9vbGVhbkxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQk9PTEVBTl9MSVRFUkFMID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9vbGVhbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9CT09MRUFOX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDYXN0RXhwcmVzc2lvbkltcGwgPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDYXN0RXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQ2FzdEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQ0FTVF9FWFBSRVNTSU9OID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DQVNUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCA8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9DSEFSQUNURVJfTElURVJBTCA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzY2FwZWQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0hBUkFDVEVSX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsIDxlbT5QVCBDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTiA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJndW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsIDxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT04gPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRydWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GYWxzZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQ29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURmllbGRBY2Nlc3NJbXBsIDxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURmllbGRBY2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEZpZWxkQWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0ZJRUxEX0FDQ0VTUyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY2VpdmVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgRmllbGQgQWNjZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0ZJRUxEX0FDQ0VTU19GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwgPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTiA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlZnQgT3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlnaHQgT3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIE9wZXJhbmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUyA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlb2ZJbXBsIDxlbT5QVCBJbnN0YW5jZW9mPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlb2ZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluc3RhbmNlb2YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VPRiA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wZXJhbmQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRU9GX19PUEVSQU5EID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VPRl9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEluc3RhbmNlb2Y8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VPRl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE1ldGhvZEludm9jYXRpb25JbXBsIDxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRNZXRob2RJbnZvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjZWl2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJndW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTUVUSE9EX0lOVk9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROYW1lSW1wbCA8ZW0+UFQgTmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX05BTUUgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTkFNRV9fTkFNRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIE5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTkFNRV9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bGxMaXRlcmFsSW1wbCA8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bGxMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFROdWxsTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9OVUxMX0xJVEVSQUwgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX05VTExfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bWJlckxpdGVyYWxJbXBsIDxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROdW1iZXJMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFROdW1iZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX05VTUJFUl9MSVRFUkFMID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9rZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OVU1CRVJfTElURVJBTF9fVE9LRU4gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OVU1CRVJfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCA8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04gPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFByZWZpeEV4cHJlc3Npb25JbXBsIDxlbT5QVCBQcmVmaXggRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQcmVmaXhFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9FWFBSRVNTSU9OID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUU3RyaW5nTGl0ZXJhbEltcGwgPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFN0cmluZ0xpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFN0cmluZ0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfU1RSSU5HX0xJVEVSQUwgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc2NhcGVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpdGVyYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1NUUklOR19MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVGhpc0xpdGVyYWxJbXBsIDxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVGhpc0xpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFRoaXNMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1RISVNfTElURVJBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfVEhJU19MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVHlwZUxpdGVyYWxJbXBsIDxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVHlwZUxpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFR5cGVMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1RZUEVfTElURVJBTCA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9UWVBFX0xJVEVSQUxfX1RZUEUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfVFlQRV9MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW52YWxpZEV4cHJlc3Npb25JbXBsIDxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW52YWxpZEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEludmFsaWRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0lOVkFMSURfRVhQUkVTU0lPTiA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0UgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5WQUxJRF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsIDxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluc3RhbmNlUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFX1JFRkVSRU5DRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yIDxlbT5QVCBJbmZpeCBPcGVyYXRvcjwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluZml4T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfT1BFUkFUT1IgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvciA8ZW0+UFQgUHJlZml4IE9wZXJhdG9yPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFByZWZpeE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9PUEVSQVRPUiA9IDMxOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UgPGVtPklKYXZhIE9iamVjdCBJbnN0YW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBPYmplY3QgSW5zdGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUphdmFPYmplY3RJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb24gPGVtPkphdmEgQWxsb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KYXZhIEFsbG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YUFsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uIDxlbT5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24jZ2V0SW5pdFN0cmluZyA8ZW0+SW5pdCBTdHJpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0IFN0cmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uI2dldEluaXRTdHJpbmcoKQotCSAqIEBzZWUgI2dldEluaXRTdHJpbmdBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbml0U3RyaW5nQWxsb2NhdGlvbl9Jbml0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24gPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBhcmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRQYXJlbnQoKQotCSAqIEBzZWUgI2dldEltcGxpY2l0QWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW1wbGljaXRBbGxvY2F0aW9uX1BhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0RmVhdHVyZSA8ZW0+RmVhdHVyZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkZlYXR1cmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0RmVhdHVyZSgpCi0JICogQHNlZSAjZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbXBsaWNpdEFsbG9jYXRpb25fRmVhdHVyZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbiA8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb24jZ2V0RXhwcmVzc2lvbigpCi0JICogQHNlZSAjZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbl9FeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24gPGVtPlBUIEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzIDxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRBcnJheUFjY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEFycmF5IDxlbT5BcnJheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFycmF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRBcnJheSgpCi0JICogQHNlZSAjZ2V0UFRBcnJheUFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRBcnJheUFjY2Vzc19BcnJheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0SW5kZXhlcyA8ZW0+SW5kZXhlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5kZXhlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0SW5kZXhlcygpCi0JICogQHNlZSAjZ2V0UFRBcnJheUFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRBcnJheUFjY2Vzc19JbmRleGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24gPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEFycmF5Q3JlYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFBUQXJyYXlDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRBcnJheUNyZWF0aW9uX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0RGltZW5zaW9ucyA8ZW0+RGltZW5zaW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGltZW5zaW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXREaW1lbnNpb25zKCkKLQkgKiBAc2VlICNnZXRQVEFycmF5Q3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQXJyYXlDcmVhdGlvbl9EaW1lbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRJbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Jbml0aWFsaXplcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRJbml0aWFsaXplcigpCi0JICogQHNlZSAjZ2V0UFRBcnJheUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEFycmF5Q3JlYXRpb25fSW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplciA8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQXJyYXlJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplciNnZXRFeHByZXNzaW9ucyA8ZW0+RXhwcmVzc2lvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4cHJlc3Npb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyI2dldEV4cHJlc3Npb25zKCkKLQkgKiBAc2VlICNnZXRQVEFycmF5SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQXJyYXlJbml0aWFsaXplcl9FeHByZXNzaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCA8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQm9vbGVhbkxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCNpc0Jvb2xlYW5WYWx1ZSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvb2xlYW4gVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsI2lzQm9vbGVhblZhbHVlKCkKLQkgKiBAc2VlICNnZXRQVEJvb2xlYW5MaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEJvb2xlYW5MaXRlcmFsX0Jvb2xlYW5WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiA8ZW0+UFQgQ2FzdCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQ2FzdEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UFRDYXN0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRDYXN0RXhwcmVzc2lvbl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldEV4cHJlc3Npb24oKQotCSAqIEBzZWUgI2dldFBUQ2FzdEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQ2FzdEV4cHJlc3Npb25fRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsIDxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVENoYXJhY3RlckxpdGVyYWxfRXNjYXBlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRDaGFyVmFsdWUgPGVtPkNoYXIgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFyIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldENoYXJWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVENoYXJhY3RlckxpdGVyYWxfQ2hhclZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiA8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcmd1bWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRBcmd1bWVudHMoKQotCSAqIEBzZWUgI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIDxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0Q29uZGl0aW9uIDxlbT5Db25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRDb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9Db25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0VHJ1ZSA8ZW0+VHJ1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRydWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRUcnVlKCkKLQkgKiBAc2VlICNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fVHJ1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRGYWxzZSA8ZW0+RmFsc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5GYWxzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldEZhbHNlKCkKLQkgKiBAc2VlICNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fRmFsc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MgPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEZpZWxkQWNjZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVjZWl2ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldFJlY2VpdmVyKCkKLQkgKiBAc2VlICNnZXRQVEZpZWxkQWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEZpZWxkQWNjZXNzX1JlY2VpdmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldEZpZWxkKCkKLQkgKiBAc2VlICNnZXRQVEZpZWxkQWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEZpZWxkQWNjZXNzX0ZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiA8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBJbmZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUSW5maXhFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldExlZnRPcGVyYW5kIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5MZWZ0IE9wZXJhbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRMZWZ0T3BlcmFuZCgpCi0JICogQHNlZSAjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX0xlZnRPcGVyYW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9wZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IoKQotCSAqIEBzZWUgI2dldFBUSW5maXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEluZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRSaWdodE9wZXJhbmQgPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SaWdodCBPcGVyYW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0UmlnaHRPcGVyYW5kKCkKLQkgKiBAc2VlICNnZXRQVEluZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fUmlnaHRPcGVyYW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0RXh0ZW5kZWRPcGVyYW5kcyA8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIE9wZXJhbmRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0RXh0ZW5kZWRPcGVyYW5kcygpCi0JICogQHNlZSAjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX0V4dGVuZGVkT3BlcmFuZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiA8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZW9mPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEluc3RhbmNlb2YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldE9wZXJhbmQgPGVtPk9wZXJhbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcGVyYW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldE9wZXJhbmQoKQotCSAqIEBzZWUgI2dldFBUSW5zdGFuY2VvZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbnN0YW5jZW9mX09wZXJhbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFBUSW5zdGFuY2VvZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRJbnN0YW5jZW9mX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiA8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUTWV0aG9kSW52b2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVjZWl2ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0UmVjZWl2ZXIoKQotCSAqIEBzZWUgI2dldFBUTWV0aG9kSW52b2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRNZXRob2RJbnZvY2F0aW9uX1JlY2VpdmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQVE1ldGhvZEludm9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcmd1bWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0QXJndW1lbnRzKCkKLQkgKiBAc2VlICNnZXRQVE1ldGhvZEludm9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSA8ZW0+UFQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFBUTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFROYW1lX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWwgPGVtPlBUIE51bGwgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVE51bGxMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwgPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIE51bWJlciBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVE51bWJlckxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsI2dldFRva2VuIDxlbT5Ub2tlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRva2VuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsI2dldFRva2VuKCkKLQkgKiBAc2VlICNnZXRQVE51bWJlckxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUTnVtYmVyTGl0ZXJhbF9Ub2tlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbigpCi0JICogQHNlZSAjZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9FeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24gPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVFByZWZpeEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9wZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldE9wZXJhdG9yKCkKLQkgKiBAc2VlICNnZXRQVFByZWZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUUHJlZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbigpCi0JICogQHNlZSAjZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVFByZWZpeEV4cHJlc3Npb25fRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsIDxlbT5QVCBTdHJpbmcgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBTdHJpbmcgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRTdHJpbmdMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRTdHJpbmdMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVFN0cmluZ0xpdGVyYWxfRXNjYXBlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRMaXRlcmFsVmFsdWUgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaXRlcmFsIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldExpdGVyYWxWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRTdHJpbmdMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVFN0cmluZ0xpdGVyYWxfTGl0ZXJhbFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsIDxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgVGhpcyBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRUaGlzTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCA8ZW0+UFQgVHlwZSBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUVHlwZUxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UFRUeXBlTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRUeXBlTGl0ZXJhbF9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uIDxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgSW52YWxpZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbiNnZXRNZXNzYWdlKCkKLQkgKiBAc2VlICNnZXRQVEludmFsaWRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEludmFsaWRFeHByZXNzaW9uX01lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2UgPGVtPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2UjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlI2dldFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZV9SZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yIDxlbT5QVCBJbmZpeCBPcGVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlBUIEluZml4IE9wZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFBUSW5maXhPcGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yIDxlbT5QVCBQcmVmaXggT3BlcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5QVCBQcmVmaXggT3BlcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFBUUHJlZml4T3BlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIDxlbT5JSmF2YSBEYXRhIFR5cGUgSW5zdGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgRGF0YSBUeXBlIEluc3RhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSmF2YURhdGFUeXBlSW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSA8ZW0+SUphdmEgSW5zdGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgSW5zdGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUphdmFJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5zdGFudGlhdGlvbkZhY3RvcnkgZ2V0SW5zdGFudGlhdGlvbkZhY3RvcnkoKTsKLQotfSAvL0luc3RhbnRpYXRpb25QYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9KYXZhQWxsb2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSmF2YUFsbG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1MjlmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9KYXZhQWxsb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFBbGxvY2F0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMTAvMDMgMTk6MjA6NDEgJCAKLSAqLwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIHRoZSBhbGxvY2F0aW9uIGNsYXNzLiBJdCBpcyB0aGUgdmFsdWUgb2YgdGhlICJhbGxvY2F0aW9uIiBwcm9wZXJ0eSBvbiBhIEphdmEgT2JqZWN0IHNvIHRoYXQgdGhlIGFjdHVhbCBhbGxvY2F0aW9uIGNhbiBiZSBjb250cm9sbGVkLiBGb3IgZXhhbXBsZSwgdGhlcmUgY291bGQgYmUgb25lIGZvciBqdXN0IGluaXQgc3RyaW5nLCBvciBvbmUgZm9yIHNlcmlhbGl6ZWQuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMS4wLjAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB0aGUgYWxsb2NhdGlvbiBjbGFzcy4gSXQgaXMgdGhlIHZhbHVlIG9mIHRoZSAiYWxsb2NhdGlvbiIgcHJvcGVydHkgb24gYSBKYXZhIE9iamVjdCBzbyB0aGF0IHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBjYW4gYmUgY29udHJvbGxlZC4gRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIG9uZSBmb3IganVzdCBpbml0IHN0cmluZywgb3Igb25lIGZvciBzZXJpYWxpemVkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEphdmFBbGxvY2F0aW9uKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQWxsb2NhdGlvbiBleHRlbmRzIEVPYmplY3R7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gaXMgYSBwYXJzZSB0cmVlIGFsbG9jYXRpb24uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXJzZSB0cmVlIGFsbG9jYXRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZSgpOwotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGlzIGFuIGltcGxpY2l0IGFsbG9jYXRpb24uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbXBsaWNpdCBhbGxvY2F0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpOwotfSAvLyBKYXZhQWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY4ZmE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBQVEFycmF5QWNjZXNzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgQWNjZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJyYXkgYWNjZXNzLiBlLmcuIHhbM10uIAotICogCi0gKiBVbmxpa2UgQVNULCB0aGUgZW50aXJlIGV4cHJlc3Npb24gb2YgdHlwZSB4WzNdWzRdIHdpbGwgYmUgZG9uZSBpbiBvbmUgZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBoYXZpbmcgYSBzZXBhcmF0ZSBBcnJheUFjY2VzcyBmb3IgZWFjaCBkaW1lbnNpb24uIFRoaXMgaXMganVzdCBhIHNpbXBsaWZpY2F0aW9uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgaWYgaXQgaXMgYSBzaW1wbGUgYXJyYXkgYWNjZXNzIHdoZXJlIGl0IGlzIG9mIHRoZSBmb3JtIHtleHByZXNzaW9ufVtleHByZXNzaW9uXVtleHByZXNzaW9uXS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEFycmF5IDxlbT5BcnJheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRJbmRleGVzIDxlbT5JbmRleGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5QWNjZXNzKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQXJyYXlBY2Nlc3MgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJyYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgYXJyYXkgdG8gYWNjZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcnJheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXJyYXkoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUFjY2Vzc19BcnJheSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0QXJyYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0QXJyYXkgPGVtPkFycmF5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BcnJheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXJyYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFycmF5KFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHByZXNzaW9ucyByZXByZXNlbnRpbmcgdGhlIGluZGV4ZXMgb2YgdGhlIGFjY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXhlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlBY2Nlc3NfSW5kZXhlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbmRleGVzKCk7Ci0KLX0gLy8gQXJyYXlBY2Nlc3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlDcmVhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUNyZWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDc0MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUNyZWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUQXJyYXlDcmVhdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA5LzE1IDIxOjAyOjE5ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFycmF5IENyZWF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJyYXkgQ3JlYXRpb24gZXhwcmVzc2lvbiwgZS5nLiBuZXcgaW50WzNdIG9yIG5ldyBqYXZhLmxhbmdTdHJpbmdbXVtdIHt7ImEifSwgeyJiIn19Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXREaW1lbnNpb25zIDxlbT5EaW1lbnNpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0SW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5Q3JlYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRBcnJheUNyZWF0aW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSwgZS5nLiBpbnRbXVtdIG9yIGphdmEubGFuZy5TdHJpbmdbXSwgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgZGltZW5zaW9uIGJyYWNrZXRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlDcmVhdGlvbl9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaW1lbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGZvciB0aGUgZGltZW5zaW9ucy4gWW91IGNhbiBoYXZlIFszXVs0XVtdIGJ1dCBbXVszM10gaXMgaW52YWxpZC4gU28gZm9yIGVhY2ggZGltZW5zaW9uIHRoYXQgaGFzIGFuIGV4cHJlc3Npb24sIHRoZXJlIHdpbGwgYmUgYW4gZW50cnkgaW4gdGhlIGxpc3QsIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBXaGVuIHlvdSByZWFjaCB0aGUgZW1wdHkgZGltZW5zaW9ucywgdGhlIGxpc3Qgd2lsbCBlbmQgdG9vLiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGltZW5zaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlDcmVhdGlvbl9EaW1lbnNpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGltZW5zaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbGl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGluaXRpYWxpemVyLCBpZiBhbnksIGZvciB0aGlzIGFycmF5LiBFLmcuIG5ldyBpbnRbXSB7MiwzfS4gSXQgaXMgdGhlIHsyLDN9LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsaXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5pdGlhbGl6ZXIoUFRBcnJheUluaXRpYWxpemVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUNyZWF0aW9uX0luaXRpYWxpemVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQXJyYXlJbml0aWFsaXplciBnZXRJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldEluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbml0aWFsaXplcihQVEFycmF5SW5pdGlhbGl6ZXIgdmFsdWUpOwotCi19IC8vIEFycmF5Q3JlYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYWFhNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLSAqICAkUkNTZmlsZTogUFRBcnJheUluaXRpYWxpemVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBcnJheSBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uLiBUaGlzIGlzIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciBjb250YWluZWQgd2l0aGluIHRoZSBleHByZXNzaW9ucyBsaXN0IGZvciB0aGUgdG9wIEFycmF5SW5pdGlhbGl6ZXIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyI2dldEV4cHJlc3Npb25zIDxlbT5FeHByZXNzaW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUluaXRpYWxpemVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQXJyYXlJbml0aWFsaXplciBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSBpbml0aWFsaXplciwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBmaXJzdCBjYXNlIGl0IHdpbGwgYmUgdHdvIE51bWJlckxpdGVyYWxzLiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIsIGZvbGxvd2VkIGJ5IGEgTnVtYmVyTGl0ZXJhbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5SW5pdGlhbGl6ZXJfRXhwcmVzc2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHByZXNzaW9ucygpOwotCi19IC8vIEFycmF5SW5pdGlhbGl6ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQm9vbGVhbkxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQm9vbGVhbkxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkMjU4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEJvb2xlYW5MaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQVEJvb2xlYW5MaXRlcmFsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Qm9vbGVhbiBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIGJvb2xlYW4gbGl0ZXJhbCwgaS5lLiB0cnVlIG9yIGZhbHNlIGRpcmVjdGx5IGluIHRoZSBjb2RlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwjaXNCb29sZWFuVmFsdWUgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQm9vbGVhbkxpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRCb29sZWFuTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29sZWFuIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGxpdGVyYWwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvb2xlYW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvb2xlYW5WYWx1ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRCb29sZWFuTGl0ZXJhbF9Cb29sZWFuVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQm9vbGVhblZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsI2lzQm9vbGVhblZhbHVlIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29sZWFuIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Jvb2xlYW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIEJvb2xlYW5MaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENhc3RFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENhc3RFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNGEzNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDYXN0RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUFRDYXN0RXhwcmVzc2lvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA5LzE1IDIxOjAyOjE5ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDYXN0IGV4cHJlc3Npb24sIGUuZy4gKHNob3J0KSAxMAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENhc3RFeHByZXNzaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQ2FzdEV4cHJlc3Npb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgb2YgdGhlIGNhc3QsIGUuZy4gaW50IG9yIGphdmEubGFuZy5TdHJpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENhc3RFeHByZXNzaW9uX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbiBiZWluZyBjYXN0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDYXN0RXhwcmVzc2lvbl9FeHByZXNzaW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBDYXN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENoYXJhY3RlckxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzM3ZWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUFRDaGFyYWN0ZXJMaXRlcmFsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcmFjdGVyIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgY2hhcmFjdGVyIGV4cHJlc3Npb24sIGUuZy4gJ2EnIG9yICdccicuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldENoYXJWYWx1ZSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQ2hhcmFjdGVyTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc2NhcGVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICdhJyBvciAnXHInLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHNpbmdsZSBxdW90ZXMgdGhlbXNlbHZlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXNjYXBlZFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzY2FwZWRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBwcmltaXRpdmUgY2hhcmFjdGVyIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFyIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFyVmFsdWUoY2hhcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbF9DaGFyVmFsdWUoKQotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWNoYXIgZ2V0Q2hhclZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0Q2hhclZhbHVlIDxlbT5DaGFyIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFyIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFyVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYXJWYWx1ZShjaGFyIHZhbHVlKTsKLQotfSAvLyBDaGFyYWN0ZXJMaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkYTNjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uLiBFLmcuIG5ldyBTdHJpbmcoImEiKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSB0eXBlIG9mIHRoZSBjbGFzcy4gRS5nLiBqYXZhLmxhbmcuU3RyaW5nLiBUaGlzIHNob3VsZCBiZSBmdWxseS1xdWFsaWZpZWQgZm9yIGFsbG9jYXRpb24gcHVycG9zZXMuIEl0IHNob3VsZCBhbHNvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIGlmIFggaXMgYW4gaW5uZXIgY2xhc3Mgb2Ygai5ZLCB0aGVuIHRoZSB0eXBlIGhlcmUgc2hvdWxkIGJlICJqLlkkWCIuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJndW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bcmd1bWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBcmd1bWVudHMoKTsKLQotfSAvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWIwNTE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUFRDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25kaXRpb25hbCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHRlc3QgRXhwcmVzc29uLCBlLmcuICh4PTMpID8gMSA6IDIKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRDb25kaXRpb24gPGVtPkNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0VHJ1ZSA8ZW0+VHJ1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0RmFsc2UgPGVtPkZhbHNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb25kaXRpb24gZXhwcmVzc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb25kaXRpb24oUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fQ29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRDb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldENvbmRpdGlvbiA8ZW0+Q29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uZGl0aW9uKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcnVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHJ1ZSBleHByZXNzaW9uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRydWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRydWUoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fVHJ1ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0VHJ1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0VHJ1ZSA8ZW0+VHJ1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJ1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VHJ1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJ1ZShQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmFsc2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmYWxzZSBleHByZXNzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GYWxzZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RmFsc2UoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fRmFsc2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldEZhbHNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRGYWxzZSA8ZW0+RmFsc2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZhbHNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRGYWxzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmFsc2UoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBDb25kaXRpb25hbEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BURXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzE2ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLSAqICAkUkNTZmlsZTogUFRFeHByZXNzaW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBURXhwcmVzc2lvbigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRFeHByZXNzaW9uIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdmlzaXQgb2YgdGhlIGN1cnJlbnQgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmlzaXRvciBpcyBudWxsCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0KFBhcnNlVmlzaXRvciB2aXNpdG9yKTsKLX0gLy8gRXhwcmVzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRGaWVsZEFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRGaWVsZEFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGY3NmMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BURmllbGRBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBURmllbGRBY2Nlc3MuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWVsZCBBY2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBY2Nlc3MgYSBmaWVsZCBleHByZXNzaW9uLCBlLmcuIGphdmEuYXd0LkNvbG9yLnJlZAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRGaWVsZEFjY2VzcygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEZpZWxkQWNjZXNzIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlY2VpdmVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG9iamVjdCB0aGF0IHRoZSBmaWVsZCBpcyBpbiwgZS5nLiBqYXZhLmF3dC5Db2xvci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVjZWl2ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlY2VpdmVyKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBURmllbGRBY2Nlc3NfUmVjZWl2ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldFJlY2VpdmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVjZWl2ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlY2VpdmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBhY2Nlc3NlZCwgZS5nLiByZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEZpZWxkQWNjZXNzX0ZpZWxkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEZpZWxkQWNjZXNzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluZml4RXhwcmVzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4MWI2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluZml4RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBQVEluZml4RXhwcmVzc2lvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA5LzE1IDIxOjAyOjE5ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluZml4IEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBleHByZXNzaW9uIHdpdGggYW4gb3BlcmF0b3IgdGhhdCBoYXMgdHdvIG9wZXJhbmRzLCBlLmcuIDMgKyA0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldExlZnRPcGVyYW5kIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0UmlnaHRPcGVyYW5kIDxlbT5SaWdodCBPcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRFeHRlbmRlZE9wZXJhbmRzIDxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRJbmZpeEV4cHJlc3Npb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVmdCBPcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZWZ0IE9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVmdCBPcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRMZWZ0T3BlcmFuZChQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluZml4RXhwcmVzc2lvbl9MZWZ0T3BlcmFuZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0TGVmdE9wZXJhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldExlZnRPcGVyYW5kIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlZnQgT3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TGVmdE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExlZnRPcGVyYW5kKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcGVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3BlcmF0b3IsIGUuZy4gKwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IKLQkgKiBAc2VlICNzZXRPcGVyYXRvcihQVEluZml4T3BlcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUSW5maXhPcGVyYXRvciBnZXRPcGVyYXRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IKLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3BlcmF0b3IoUFRJbmZpeE9wZXJhdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJpZ2h0IE9wZXJhbmQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByaWdodCBleHByZXNzaW9uLiBpLmUuIDQgb2YgIjMgKyA0IgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SaWdodCBPcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSaWdodE9wZXJhbmQoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbmZpeEV4cHJlc3Npb25fUmlnaHRPcGVyYW5kKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRSaWdodE9wZXJhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldFJpZ2h0T3BlcmFuZCA8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmlnaHRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSaWdodE9wZXJhbmQoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIE9wZXJhbmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFVzZWQgd2hlbiB0aGVyZSBhcmUgYSBzZXJpZXMgb2YgaW5maXggb3BlcmF0aW9ucyBvZiB0aGUgc2FtZSBvcGVyYXRvciwgZS5nLiAxICsgMiArIDMgKyA0LiAxIGFuZCAyIHdpbGwgZ28gaW50byBsZWZ0IGFuZCByaWdodCwgd2hpbGUgezMsIDR9IHdpbGwgZ28gaW50byB0aGUgZXh0ZW5kZWQgb3BlcmFuZHMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5maXhFeHByZXNzaW9uX0V4dGVuZGVkT3BlcmFuZHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgZXhwcmVzc2lvbgotCSAqIElmIHRoZXJlIGlzIG5vIGxlZnQgb3BlcmFuZCBhbmQgYSByaWdodCBvcGVyYW5kLCBvciB2aWNlIHZlcnNhLCBhbmQgbm8gZXh0ZW5kZWQgb3BlcmFuZHMKLQkgKiByZXR1cm4gdGhlIHJlbWFpbmluZyBzaW5nbGUgb3BlcmFuZAotCSAqIElmIHRoZXJlIGlzIG5vIGxlZnQgb3BlcmFuZCBhbmQgYSByaWdodCBhbmQgc29tZSBleHRlbmRlZCBvbmVzIHNodWZmbGUgZXZlcnl0aGluZyBhbG9uZwotCSAqIHNvIHRoYXQgdGhlIHJpZ2h0IGJlY29tZXMgdGhlIGxlZnQgYW5kIHRoZSBmaXJzdCBleHRlbmRlZCBtb3ZlcyBpbnRvIHRoZSByaWdodAotCSAqIG9yIGlmIG5vIHJpZ2h0IGFuZCBhIGxlZnQgdGhlbiBqdXN0IG1vdmUgdGhlIGZpcnN0IGV4dGVuZGVkIGludG8gdGhlIHJpZ2h0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRFeHByZXNzaW9uIGFzQ29tcHJlc3NlZEV4cHJlc3Npb24oKTsKLQotfSAvLyBJbmZpeEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5maXhPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeE9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWY3MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbmZpeE9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUSW5maXhPcGVyYXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA5LzE1IDIxOjAyOjE5ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkluZml4IE9wZXJhdG9yPC9iPjwvZW0+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+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUFRJbmZpeE9wZXJhdG9yIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBUSU1FUzogcmV0dXJuIFRJTUVTX0xJVEVSQUw7Ci0JCQljYXNlIERJVklERTogcmV0dXJuIERJVklERV9MSVRFUkFMOwotCQkJY2FzZSBSRU1BSU5ERVI6IHJldHVybiBSRU1BSU5ERVJfTElURVJBTDsKLQkJCWNhc2UgUExVUzogcmV0dXJuIFBMVVNfTElURVJBTDsKLQkJCWNhc2UgTUlOVVM6IHJldHVybiBNSU5VU19MSVRFUkFMOwotCQkJY2FzZSBMRUZUX1NISUZUOiByZXR1cm4gTEVGVF9TSElGVF9MSVRFUkFMOwotCQkJY2FzZSBSSUdIVF9TSElGVF9TSUdORUQ6IHJldHVybiBSSUdIVF9TSElGVF9TSUdORURfTElURVJBTDsKLQkJCWNhc2UgUklHSFRfU0hJRlRfVU5TSUdORUQ6IHJldHVybiBSSUdIVF9TSElGVF9VTlNJR05FRF9MSVRFUkFMOwotCQkJY2FzZSBMRVNTOiByZXR1cm4gTEVTU19MSVRFUkFMOwotCQkJY2FzZSBHUkVBVEVSOiByZXR1cm4gR1JFQVRFUl9MSVRFUkFMOwotCQkJY2FzZSBMRVNTX0VRVUFMUzogcmV0dXJuIExFU1NfRVFVQUxTX0xJVEVSQUw7Ci0JCQljYXNlIEdSRUFURVJfRVFVQUxTOiByZXR1cm4gR1JFQVRFUl9FUVVBTFNfTElURVJBTDsKLQkJCWNhc2UgRVFVQUxTOiByZXR1cm4gRVFVQUxTX0xJVEVSQUw7Ci0JCQljYXNlIE5PVF9FUVVBTFM6IHJldHVybiBOT1RfRVFVQUxTX0xJVEVSQUw7Ci0JCQljYXNlIFhPUjogcmV0dXJuIFhPUl9MSVRFUkFMOwotCQkJY2FzZSBBTkQ6IHJldHVybiBBTkRfTElURVJBTDsKLQkJCWNhc2UgT1I6IHJldHVybiBPUl9MSVRFUkFMOwotCQkJY2FzZSBDT05ESVRJT05BTF9BTkQ6IHJldHVybiBDT05ESVRJT05BTF9BTkRfTElURVJBTDsKLQkJCWNhc2UgQ09ORElUSU9OQUxfT1I6IHJldHVybiBDT05ESVRJT05BTF9PUl9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQVEluZml4T3BlcmF0b3IoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvcGVyYXRvciBzdHJpbmcgKGkuZS4gZm9yIFBMVVMgcmV0dXJuICIrIikuCi0JICogQHJldHVybiBUaGUgb3BlcmF0b3Igc3RyaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBPUEVSQVRPUl9TVFJJTkdbZ2V0VmFsdWUoKV07Ci0JfQotCi19IC8vSW5maXhPcGVyYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnN0YW5jZVJlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnN0YW5jZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2NlOTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBUSW5zdGFuY2VSZWZlcmVuY2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8xMC8wMyAxOToyMDo0MSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZSNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEluc3RhbmNlUmVmZXJlbmNlIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlKElKYXZhSW5zdGFuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluc3RhbmNlUmVmZXJlbmNlX1JlZmVyZW5jZSgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJSmF2YUluc3RhbmNlIGdldFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZSNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZShJSmF2YUluc3RhbmNlIHZhbHVlKTsKLQotfSAvLyBQVEluc3RhbmNlUmVmZXJlbmNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluc3RhbmNlb2YuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VvZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNjZGY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VvZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUFRJbnN0YW5jZW9mLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5zdGFuY2VvZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEluc3RhbmNlb2YgZXhwcmVzc2lvbiwgZS5nLiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRPcGVyYW5kIDxlbT5PcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnN0YW5jZW9mKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUSW5zdGFuY2VvZiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgdG8gdGVzdCwgZS5nLiB4IGluIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE9wZXJhbmQoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnN0YW5jZW9mX09wZXJhbmQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldE9wZXJhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRPcGVyYW5kIDxlbT5PcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcGVyYW5kKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdGVzdCwgZS5nLiBqYXZhLmxhbmcuU3RyaW5nLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluc3RhbmNlb2ZfVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEluc3RhbmNlb2YKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW52YWxpZEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW52YWxpZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2ZWE0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEludmFsaWRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQVEludmFsaWRFeHByZXNzaW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW52YWxpZCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBzb21lIGV4cHJlc3Npb24gd2UganVzdCBjYW4ndCBldmFsdWF0ZSBmb3Igb3VyIHB1cnBvc2VzLiBJdCBhbGxvd3MgdXMgdG8gdGVsbCB0aGUgZXZhbHVhdGlvbiB3aGF0IGlzIGFjdHVhbGx5IHdyb25nLiBJdCBzaG91bGQgYmUgcGxhY2VkIGFzIHRoZSByb290IGV4cHJlc3Npb24gdG8gcHJldmVudCBwcm9jZXNzaW5nIG11Y2ggb2YgdGhlIHRyZWUgYW5kIHRoZW4gZmluYWxseSBmYWlsLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24jZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEludmFsaWRFeHByZXNzaW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWVzc2FnZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEludmFsaWRFeHByZXNzaW9uX01lc3NhZ2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbiNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW52YWxpZEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTWV0aG9kSW52b2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRNZXRob2RJbnZvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTUzNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRNZXRob2RJbnZvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUTWV0aG9kSW52b2NhdGlvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA5LzE1IDIxOjAyOjE5ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBJbnZvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogTWV0aG9kSW52b2NhdGlvbiBleHByZXNzaW9uLCBlLmcuIHguZ2V0WSgzKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTWV0aG9kSW52b2NhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVE1ldGhvZEludm9jYXRpb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVjZWl2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdobyB0aGUgbWV0aG9kIGlzIGludm9rZWQgYWdhaW5zdC4gVGhpcyBtYXkgYmUgbm90IHNldCwgd2hpY2ggbWVhbnMgInRoaXMiLiBJdCBtYXkgYWxzbyBiZSBhIE5hbWUsIHdoaWNoIHdvdWxkIG1lYW4gYSBjbGFzcyBsaWtlICJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWNlaXZlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRNZXRob2RJbnZvY2F0aW9uX1JlY2VpdmVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRSZWNlaXZlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVjZWl2ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlY2VpdmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBpbnZva2VkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTWV0aG9kSW52b2NhdGlvbl9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bcmd1bWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxpc3Qgb2YgYXJndW1lbnRzLCBpZiBhbnksIHRvIHRoZSBtZXRob2QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyZ3VtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBcmd1bWVudHMoKTsKLQotfSAvLyBNZXRob2RJbnZvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2RlMDBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUFROYW1lLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgcmVwcmVzZW50cyBhIG5hbWUuIFRoaXMgY2FuIGhhcHBlbiBmb3IgdGhlIHJlY2VpdmVyIG9mIGEgbWV0aG9kIGludm9jYXRpb24sIGUuZy4geC5nZXRZKCkgb3IgamF2YS5sYW5nLlN0cmluZy52YWx1ZU9mKDEwKS4gSW4gdGhlc2UgY2FzZXMgeW91IHdvdWxkIGhhdmUgYSBuYW1lIG9mICJ4IiBvciAiamF2YS5sYW5nLlN0cmluZyIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTmFtZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVE5hbWUgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUsIHdoaWNoIGNhbiBiZSBhIHR5cGUgb3IgYSB2YXJpYWJsZS4gSWYgaXQgaXMgYSB0eXBlLCB0aGVuICBpdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE5hbWVfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVsbExpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVsbExpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmYTRjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE51bGxMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQVE51bGxMaXRlcmFsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TnVsbCBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50cyB0aGUgZXhwcmVzc2lvbiAibnVsbCIKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE51bGxMaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUTnVsbExpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci19IC8vIE51bGxMaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE51bWJlckxpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVtYmVyTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTA3NGM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVtYmVyTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUFROdW1iZXJMaXRlcmFsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OdW1iZXIgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJlcHJlc2VudCBhIG51bWJlciBwcmltaXRpdmUgbGl0ZXJhbCwgZS5nLiAxMC4gT25lIG9wdGltaXphdGlvbiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIGlzIHRoYXQgaWYgYW4gZXhwcmVzc2lvbiBpcyBvZiB0aGUgZm9ybSArbnVtYmVyIG9yIC1udW1iZXIsIGl0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBQcmVmaXhFeHByZXNzaW9uIHdpdGggYSBOdW1iZXJMaXRlcmFsIHRvIGp1c3QgYSBOdW1iZXJMaXRlcmFsLiBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCNnZXRUb2tlbiA8ZW0+VG9rZW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTnVtYmVyTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVE51bWJlckxpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9rZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b2tlbiB2YWx1ZSwgZS5nLiAxMCwgMTBkLCBvciAtMTAuNzUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9rZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRva2VuKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTnVtYmVyTGl0ZXJhbF9Ub2tlbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUb2tlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsI2dldFRva2VuIDxlbT5Ub2tlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG9rZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRva2VuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb2tlbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE51bWJlckxpdGVyYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkYzAyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gZXhwcmVzc2lvbiB3aXRoaW4gcGFyZW50aGVzaXMsIGUuZy4gKHgrMykKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbiB3cmFwcGVkIGJ5IHRoZSBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSB0aGVuIHRoZSBleHByZXNzaW9uIGlzICJ4KzMiCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9FeHByZXNzaW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQcmVmaXhFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1ZDU2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBUUHJlZml4RXhwcmVzc2lvbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA5LzE1IDIxOjAyOjE5ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByZWZpeCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBvbmUgb3BlcmFuZCBvcGVyYXRvciwgd2hlcmUgdGhlIG9wZXJhdG9yIGNvbWVzIGJlZm9yZSB0aGUgb3BlcmFuZCwgZS5nLiAtICh4KzMpLiBJbiBBU1QsIGV2ZW4gLTMgaXMgbW9kZWxlZCBhcyBhIFByZWZpeEV4cHJlc3Npb24gb2Ygb3BlcmF0b3IgIi0iIGFuZCBleHByZXNzaW9uIG9mIE51bWJlckxpdGVyYWwoMykuIEJ1dCB3ZSBvcHRpbWl6ZSB0aGlzIGF3YXkgYW5kIGp1c3QgdXNlIGEgTnVtYmVyTGl0ZXJhbCgtMykgZGlyZWN0bHkgaW5zdGVhZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUUHJlZml4RXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcGVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG9wZXJhdG9yIG9mIHRoaXMgZXhwcmVzc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcgotCSAqIEBzZWUgI3NldE9wZXJhdG9yKFBUUHJlZml4T3BlcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFByZWZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFByZWZpeE9wZXJhdG9yIGdldE9wZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24jZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yCi0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9wZXJhdG9yKFBUUHJlZml4T3BlcmF0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4cHJlc3Npb24gdGhhdCB0aGUgb3BlcmF0b3IgaXMgYXBwbGllZCB0by4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFByZWZpeEV4cHJlc3Npb25fRXhwcmVzc2lvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBQcmVmaXhFeHByZXNzaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeE9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeE9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YTZhMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQcmVmaXhPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBQVFByZWZpeE9wZXJhdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UHJlZml4IE9wZXJhdG9yPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBwcmVmaXggZXhwcmVzc2lvbiBvcGVyYXRvci4gV2UgYXJlIG5vdCBtb2RlbGluZyArKyBhbmQgLS0uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUUHJlZml4T3BlcmF0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQVFByZWZpeE9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QTFVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogKyBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNQTFVTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTFVTID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1JTlVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogLSBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNNSU5VU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVMgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09NUExFTUVOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIH4gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjQ09NUExFTUVOVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFTUVOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1Q8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAhIG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI05PVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBMVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUExVUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBQTFVTX0xJVEVSQUwgPSBuZXcgUFRQcmVmaXhPcGVyYXRvcihQTFVTLCAiUExVUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TUlOVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUlOVVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgTUlOVVNfTElURVJBTCA9IG5ldyBQVFByZWZpeE9wZXJhdG9yKE1JTlVTLCAiTUlOVVMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTVBMRU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09NUExFTUVOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBDT01QTEVNRU5UX0xJVEVSQUwgPSBuZXcgUFRQcmVmaXhPcGVyYXRvcihDT01QTEVNRU5ULCAiQ09NUExFTUVOVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBOT1RfTElURVJBTCA9IG5ldyBQVFByZWZpeE9wZXJhdG9yKE5PVCwgIk5PVCIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlBUIFByZWZpeCBPcGVyYXRvcjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvcltdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBQVFByZWZpeE9wZXJhdG9yW10gewotCQkJUExVU19MSVRFUkFMLAotCQkJTUlOVVNfTElURVJBTCwKLQkJCUNPTVBMRU1FTlRfTElURVJBTCwKLQkJCU5PVF9MSVRFUkFMLAotCQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9QRVJBVE9SX1NUUklORzsKLQlzdGF0aWMgewotCQlPUEVSQVRPUl9TVFJJTkcgPSBuZXcgU3RyaW5nW1ZBTFVFU19BUlJBWS5sZW5ndGhdOwotCQlPUEVSQVRPUl9TVFJJTkdbUExVU10gPSAiKyI7Ci0JCU9QRVJBVE9SX1NUUklOR1tNSU5VU10gPSAiLSI7Ci0JCU9QRVJBVE9SX1NUUklOR1tDT01QTEVNRU5UXSA9ICJ+IjsKLQkJT1BFUkFUT1JfU1RSSU5HW05PVF0gPSAiISI7Ci0JfQotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlBUIFByZWZpeCBPcGVyYXRvcjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UFQgUHJlZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUFRQcmVmaXhPcGVyYXRvciBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVBUUHJlZml4T3BlcmF0b3IgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QVCBQcmVmaXggT3BlcmF0b3I8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUFRQcmVmaXhPcGVyYXRvciBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgUExVUzogcmV0dXJuIFBMVVNfTElURVJBTDsKLQkJCWNhc2UgTUlOVVM6IHJldHVybiBNSU5VU19MSVRFUkFMOwotCQkJY2FzZSBDT01QTEVNRU5UOiByZXR1cm4gQ09NUExFTUVOVF9MSVRFUkFMOwotCQkJY2FzZSBOT1Q6IHJldHVybiBOT1RfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUFRQcmVmaXhPcGVyYXRvcihpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9wZXJhdG9yIHN0cmluZyAoaS5lLiBmb3IgUExVUyByZXR1cm4gIisiKS4KLQkgKiBAcmV0dXJuIFRoZSBvcGVyYXRvciBzdHJpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIE9QRVJBVE9SX1NUUklOR1tnZXRWYWx1ZSgpXTsKLQl9Ci19IC8vUHJlZml4T3BlcmF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUU3RyaW5nTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRTdHJpbmdMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDEwM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRTdHJpbmdMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBQVFN0cmluZ0xpdGVyYWwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdHJpbmcgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIGxpdGVyYWwsIGUuZy4gImFzZGYiLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRMaXRlcmFsVmFsdWUgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUU3RyaW5nTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVFN0cmluZ0xpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXNjYXBlZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBpcyB0aGUgZXNjYXBlZCBzdHJpbmcuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAiYWIiIG9yICJjXHIiLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHF1b3RlcyB0aGVtc2VsdmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFc2NhcGVkVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRTdHJpbmdMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFc2NhcGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzY2FwZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXNjYXBlZFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaXRlcmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHN0cmluZyB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGl0ZXJhbFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUU3RyaW5nTGl0ZXJhbF9MaXRlcmFsVmFsdWUoKQotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMaXRlcmFsVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRMaXRlcmFsVmFsdWUgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpdGVyYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpdGVyYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGl0ZXJhbFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU3RyaW5nTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUaGlzTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUaGlzTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFjMmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUVGhpc0xpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBUVGhpc0xpdGVyYWwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaGlzIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzICJ0aGlzIiwgZS5nLiB0aGlzLmdldFgoKSB3aWxsIGJlIGEgTWV0aG9kSW52b2NhdGlvbiB3aXRoIHRoZSByZWNlaXZlciBiZWluZyBhIFRoaXNMaXRlcmFsLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGZvcm1hdCBYWVoudGhpcyBiZWNhdXNlIHRoYXQgaXMgZm9yIGlubmVyIGNsYXNzZXMgYW5kIHdlIGRvbid0IHN1cHBvcnQgdGhhdCByaWdodCBub3cuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRUaGlzTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVFRoaXNMaXRlcmFsIGV4dGVuZHMgUFRFeHByZXNzaW9uewotfSAvLyBUaGlzTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUeXBlTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUeXBlTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTBjNGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUVHlwZUxpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBUVHlwZUxpdGVyYWwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIHJlcHJlc2VudHMgYSBsaXRlcmFsIG9mIHRoZSBmb3JtIGouWFlaLmNsYXNzLiBGb3IgaW5zdGFuY2UgaW4gYSBtZXRob2QgaW52b2NhdGlvbiB4LmdldFgoalhZWi5jbGFzcykgdGhlIGFyZ3VtZW50IHdpbGwgYmUgYSBUeXBlTGl0ZXJhbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUVHlwZUxpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRUeXBlTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgbGl0ZXJhbC4gIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUVHlwZUxpdGVyYWxfVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBUeXBlTGl0ZXJhbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUGFyc2VUcmVlQWxsb2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUGFyc2VUcmVlQWxsb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmFmZTc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVHJlZUFsbG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBhcnNlVHJlZUFsbG9jYXRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbGxvY2F0aW9ucyB2aWEgUGFyc2UgVHJlZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VUcmVlQWxsb2NhdGlvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQYXJzZVRyZWVBbGxvY2F0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcnNlVHJlZUFsbG9jYXRpb24gZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQYXJzZVRyZWVBbGxvY2F0aW9uX0V4cHJlc3Npb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBQYXJzZVRyZWVBbGxvY2F0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QYXJzZVZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzY5OTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFBhcnNlVmlzaXRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0gCi0vKioKLSAqIEEgdmlzaXRvciBmb3IgYWJzdHJhY3QgcGFyc2UgZXhwcmVzc2lvbiB0cmVlcy4KLSAqIDxwPgotICogRm9yIGVhY2ggZGlmZmVyZW50IGNvbmNyZXRlIEV4cHJlc3Npb24gbm9kZSB0eXBlIDxpdD5UPC9pdD4gdGhlcmUgYXJlCi0gKiBhIHBhaXIgb2YgbWV0aG9kczoKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5wdWJsaWMgYm9vbGVhbiB2aXNpdCg8aXQ+VDwvaXQ+IG5vZGUpPC9jb2RlPiAtIFZpc2l0cwotICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uIElmIDxjb2RlPnRydWU8L2NvZGU+Ci0gKiBpcyByZXR1cm5lZCwgdGhlIGdpdmVuIG5vZGUncyBjaGlsZCBub2RlcyB3aWxsIGJlIHZpc2l0ZWQgbmV4dDsgaG93ZXZlciwKLSAqIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCwgdGhlIGdpdmVuIG5vZGUncyBjaGlsZCBub2RlcyB3aWxsIAotICogbm90IGJlIHZpc2l0ZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgZG9lcwotICogbm90aGluZyBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQKLSAqIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC48L2xpPgotICogPGxpPjxjb2RlPnB1YmxpYyB2b2lkIGVuZFZpc2l0KDxpdD5UPC9pdD4gbm9kZSk8L2NvZGU+IC0gVmlzaXRzCi0gKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gV2hlbiB1c2VkIGluIHRoZQotICogY29udmVudGlvbmFsIHdheSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFsbCBvZiB0aGUgZ2l2ZW4gbm9kZSdzCi0gKiBjaGlsZHJlbiBoYXZlIGJlZW4gdmlzaXRlZCAob3IgaW1tZWRpYXRlbHksIGlmIDxjb2RlPnZpc2l0PC9jb2RlPiByZXR1cm5lZAotICogPGNvZGU+ZmFsc2U8L2NvZGU+KS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyBkb2VzCi0gKiBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIGEgcGFpciBvZiBtZXRob2RzIGZvciB2aXNpdGluZyBBU1Qgbm9kZXMgaW4gdGhlIAotICogYWJzdHJhY3QsIHJlZ2FyZGxlc3Mgb2Ygbm9kZSB0eXBlOgotICogPHVsPgotICogPGxpPjxjb2RlPnB1YmxpYyB2b2lkIHByZVZpc2l0KEFTVE5vZGUgbm9kZSk8L2NvZGU+IC0gVmlzaXRzCi0gKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gCi0gKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHByaW9yIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLXNwZWNpZmljCi0gKiA8Y29kZT52aXNpdDwvY29kZT4gbWV0aG9kLgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+Ci0gKiA8bGk+PGNvZGU+cHVibGljIHZvaWQgcG9zdFZpc2l0KEFTVE5vZGUgbm9kZSk8L2NvZGU+IC0gVmlzaXRzCi0gKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gCi0gKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGFmdGVyIHRoZSBhcHByb3ByaWF0ZSB0eXBlLXNwZWNpZmljCi0gKiA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kLgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBGb3Igbm9kZXMgd2l0aCBsaXN0LXZhbHVlZCBwcm9wZXJ0aWVzLCB0aGUgY2hpbGQgbm9kZXMgd2l0aGluIHRoZSBsaXN0Ci0gKiBhcmUgdmlzaXRlZCBpbiBvcmRlci4gRm9yIG5vZGVzIHdpdGggbXVsdGlwbGUgcHJvcGVydGllcywgdGhlIGNoaWxkIG5vZGVzCi0gKiBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgdGhhdCBtb3N0IGNsb3NlbHkgY29ycmVzcG9uZHMgdG8gdGhlIGxleGljYWwKLSAqIHJlYWRpbmcgb3JkZXIgb2YgdGhlIHNvdXJjZSBwcm9ncmFtLiBGb3IgaW5zdGFuY2UsIGZvciBhIHR5cGUgZGVjbGFyYXRpb24KLSAqIG5vZGUsIHRoZSBjaGlsZCBvcmRlcmluZyBpczogbmFtZSwgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzLCBhbmQgCi0gKiBib2R5IGRlY2xhcmF0aW9ucy4KLSAqIDwvcD4KLSAqIDxwPgotICogV2hpbGUgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSB0cmVlIGluIHRoZSB2aXNpdG9yLCBjYXJlIGlzIHJlcXVpcmVkIHRvCi0gKiBlbnN1cmUgdGhhdCB0aGUgY29uc2VxdWVuY2VzIGFyZSBhcyBleHBlY3RlZCBhbmQgZGVzaXJhYmxlLgotICogRHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYW4gb3JkaW5hcnkgdmlzaXQgc3RhcnRpbmcgYXQgYSBnaXZlbiBub2RlLCBldmVyeSBub2RlCi0gKiBpbiB0aGUgc3VidHJlZSBpcyB2aXNpdGVkIGV4YWN0bHkgdHdpY2UsIGZpcnN0IHdpdGggPGNvZGU+dmlzaXQ8L2NvZGU+IGFuZAotICogdGhlbiB3aXRoIDxjb2RlPmVuZFZpc2l0PC9jb2RlPi4gRHVyaW5nIGEgdHJhdmVyc2FsIG9mIGEgc3RhdGlvbmFyeSB0cmVlLCAKLSAqIGVhY2ggbm9kZSBpcyBlaXRoZXIgYmVoaW5kIChhZnRlciA8Y29kZT5lbmRWaXNpdDwvY29kZT4pLCBhaGVhZCAoYmVmb3JlIAotICogPGNvZGU+dmlzaXQ8L2NvZGU+KSwgb3IgaW4gcHJvZ3Jlc3MgKGJldHdlZW4gPGNvZGU+dmlzaXQ8L2NvZGU+IGFuZAotICogdGhlIG1hdGNoaW5nIDxjb2RlPmVuZFZpc2l0PC9jb2RlPikuIENoYW5nZXMgdG8gdGhlICJiZWhpbmQiIHJlZ2lvbiBvZiB0aGUKLSAqIHRyZWUgYXJlIG9mIG5vIGNvbnNlcXVlbmNlIHRvIHRoZSB2aXNpdCBpbiBwcm9ncmVzcy4gQ2hhbmdlcyB0byB0aGUgImFoZWFkIgotICogcmVnaW9uIHdpbGwgYmUgdGFrZW4gaW4gc3RyaWRlLiBDaGFuZ2VzIHRvIHRoZSAiaW4gcHJvZ3Jlc3MiIHBvcnRpb24gYXJlCi0gKiB0aGUgbW9yZSBpbnRlcmVzdGluZyBjYXNlcy4gV2l0aCBhIG5vZGUsIHRoZSB2YXJpb3VzIHByb3BlcnRpZXMgYXJlIGFycmFuZ2VkCi0gKiBpbiBhIGxpbmVhciBsaXN0LCB3aXRoIGEgY3Vyc29yIHRoYXQgc2VwYXJhdGVzIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZQotICogYmVlbiB2aXNpdGVkIGZyb20gdGhlIG9uZXMgdGhhdCBhcmUgc3RpbGwgdG8gYmUgdmlzaXRlZCAodGhlIGN1cnNvcgotICogaXMgYmV0d2VlbiB0aGUgZWxlbWVudHMsIHJhdGhlciB0aGFuIG9uIGFuIGVsZW1lbnQpLiBUaGUgY3Vyc29yIG1vdmVzIGZyb20KLSAqIHRoZSBoZWFkIHRvIHRoZSB0YWlsIG9mIHRoaXMgbGlzdCwgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IHBvc2l0aW9uIGp1c3QKLSAqIDxpdD5iZWZvcmU8L2l0PiA8Y29kZT52aXNpdDwvY29kZT4gaWYgY2FsbGVkIGZvciB0aGF0IGNoaWxkLiBBZnRlciB0aGUgY2hpbGQKLSAqIHN1YnRyZWUgaGFzIGJlZW4gY29tcGxldGVseSB2aXNpdGVkLCB0aGUgdmlzaXQgbW92ZXMgb24gdGhlIGNoaWxkIAotICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnNvci4gUmVtb3ZpbmcgYSBjaGlsZCB3aGlsZSBpdCBpcyBiZWluZyB2aXNpdGVkCi0gKiBkb2VzIG5vdCBhbHRlciB0aGUgY291cnNlIG9mIHRoZSB2aXNpdC4gQnV0IGFueSBjaGlsZHJlbiBhZGRlZCBhdCBwb3NpdGlvbnMKLSAqIGFmdGVyIHRoZSBjdXJzb3IgYXJlIGNvbnNpZGVyZWQgaW4gdGhlICJhaGVhZCIgcG9ydGlvbiBhbmQgd2lsbCBiZSB2aXNpdGVkLgotICogPC9wPgotICogPHA+Ci0gKiBDYXNlcyB0byB3YXRjaCBvdXQgZm9yOgotICogPHVsPgotICogPGxpPk1vdmluZyBhIGNoaWxkIG5vZGUgZnVydGhlciBkb3duIHRoZSBsaXN0LiBUaGlzIGNvdWxkIHJlc3VsdCBpbiB0aGUKLSAqIGNoaWxkIHN1YnRyZWUgYmVpbmcgdmlzaXRlZCBtdWx0aXBsZSB0aW1lczsgdGhlc2UgdmlzaXRzIGFyZSBzZXF1ZW50aWFsLjwvbGk+Ci0gKiA8bGk+TW92aW5nIGEgY2hpbGQgbm9kZSB1cCBpbnRvIGFuIGFuY2VzdG9yLiBJZiB0aGUgbmV3IGhvbWUgZm9yCi0gKiB0aGUgbm9kZSBpcyBpbiB0aGUgImFoZWFkIiBwb3J0aW9uLCB0aGUgc3VidHJlZSB3aWxsIGJlIHZpc2l0ZWQgCi0gKiBhIHNlY29uZCB0aW1lOyBhZ2FpbiwgdGhlc2UgdmlzaXRzIGFyZSBzZXF1ZW50aWFsLjwvbGk+Ci0gKiA8bGk+TW92aW5nIGEgbm9kZSBkb3duIGludG8gYSBjaGlsZC4gSWYgdGhlIG5ldyBob21lIGZvcgotICogdGhlIG5vZGUgaXMgaW4gdGhlICJhaGVhZCIgcG9ydGlvbiwgdGhlIHN1YnRyZWUgd2lsbCBiZSB2aXNpdGVkIAotICogYSBzZWNvbmQgdGltZTsgaW4gdGhpcyBjYXNlLCB0aGUgdmlzaXRzIHdpbGwgYmUgbmVzdGVkLiBJbiBzb21lIGNhc2VzLAotICogdGhpcyBjYW4gbGVhZCB0byBhIHN0YWNrIG92ZXJmbG93IG9yIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIE5vdGU6IFRoaXMgaXMgYmFzZWQgdXBvbiB0aGUgdmlzaXQgY29uY2VwdCBpbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvci4gCi0gKgotICogQHNlZSBFeHByZXNzaW9uI2FjY2VwdAotICogIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVZpc2l0b3IgewotCQotCS8qKgotCSAqIEV4Y2VwdGlvbiB0byB0aHJvdyB0byBqdXN0IHN0b3AgdmlzaXRpbmcgYSBwYXJzZSB2aXNpdC4gSXQgZG9lc24ndCBtZWFuIGVycm9yLCBpdAotCSAqIGp1c3QgbWVhbnMgc3RvcCB2aXNpdGluZy4gUGFyc2VWaXNpdG9ycyBzaG91bGQgdGhyb3cgdGhpcyB3aGVuIHRoZXkgd2FudCB0byBzdG9wCi0JICogdmlzaXRpbmcgZnVydGhlciB3aXRob3V0IGFuIGV4cGxpY2l0IGVycm9yLgotCSAqIDxwPgotCSAqIElmIHRoZXkgd2FudCB0byBpbmRpY2F0ZSBhbiBlcnJvciwgcGFyc2UgdmlzaXRvcnMgY2FuIHRocm93IGFueSBvdGhlciBSdW50aW1lRXhjZXB0aW9uLiAKLQkgKiBUaG9zZSB3aWxsIGFsc28gc3RvcCB2aXNpdGluZywgYnV0IHRoZSBleGNlcHRpb24gd2lsbCBiZSBwYXNzZWQgb24gb3V0IG9mIHRoZSAKLQkgKiB7QGxpbmsgUFRFeHByZXNzaW9uI2FjY2VwdChQYXJzZVZpc2l0b3IpfS4gU3RvcFZpc2l0aW5nIHdpbGwgbm90IGJlIHBhc3NlZCBvbgotCSAqIGJ1dCB3aWxsIGJlIGNhdWdodCBpbnNpZGUgYWNjZXB0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdG9wVmlzaXRpbmcgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMC4xCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTI0Njg2MDgwNjU2ODM1NTUyMEw7Ci0JCQotCX0KLQkvKioKLQkgKiBWaXNpdHMgdGhlIGdpdmVuIHBhcnNlIG5vZGUgcHJpb3IgdG8gdGhlIHR5cGUtc3BlY2lmaWMgdmlzaXQuIChiZWZvcmUgPGNvZGU+dmlzaXQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIG5vZGUgdG8gdmlzaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWaXNpdChQVEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVmlzaXRzIHRoZSBnaXZlbiBwYXJzZSBub2RlIGZvbGxvd2luZyB0aGUgdHlwZS1zcGVjaWZpYyB2aXNpdCAoYWZ0ZXIgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIG5vZGUgdG8gdmlzaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0VmlzaXQoUFRFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBURmllbGRBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnN0YW5jZW9mIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTmFtZSBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUaGlzTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5zdGFuY2VSZWZlcmVuY2Ugbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBURmllbGRBY2Nlc3Mgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEluc3RhbmNlb2Ygbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFROYW1lIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVE51bWJlckxpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFRoaXNMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEluc3RhbmNlUmVmZXJlbmNlIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvRmVhdHVyZVZhbHVlUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvRmVhdHVyZVZhbHVlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExYzhiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0ZlYXR1cmVWYWx1ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLSAqICAkUkNTZmlsZTogRmVhdHVyZVZhbHVlUHJvdmlkZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSAoYW4gRU1GIEVPYmplY3Qgc3ViY2xhc3MpIHByb3ZpZGUgYSB2aXNpdGVyCi0gKiBjYXBhYmlsaXR5IHRvIHRoZSBzZXQgZmVhdHVyZXMgb24gdGhlIEVPYmplY3QuIFRoaXMgd2F5IG9ubHkgdGhlIHNldCBmZWF0dXJlcwotICogYXJlIHByZXNlbnRlZCB0byB0aGUgdmlzaXRvci4gVGhpcyBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBGZWF0dXJlVmFsdWVQcm92aWRlciB7Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgY2xhc3MgZm9yIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLgotCSAqIAotCSAqIEBzZWUgRmVhdHVyZVZhbHVlUHJvdmlkZXJIZWxwZXIjdmlzaXRTZXRGZWF0dXJlcyhFT2JqZWN0LCBWaXNpdG9yKQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmVhdHVyZVZhbHVlUHJvdmlkZXJIZWxwZXIgewotCQkKLQkJLyoqCi0JCSAqIEEgaGVscGVyIHRvIGhhbmRsZSB3aGVyZSB0aGUgb2JqZWN0IG1heSBvciBtYXkgbm90IGJlCi0JCSAqIGltcGxlbWVudCBGZWF0dXJlVmFsdWVQcm92aWRlci4gVGhpcyB3YXkgaXQgY2FuIGJlIGEKLQkJICogY29tbW9uIGFjY2VzcyB0byBkbyBpdC4KLQkJICogCi0JCSAqIEBwYXJhbSBlb2JqZWN0Ci0JCSAqIEBwYXJhbSB2aXNpdG9yCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBPYmplY3QgdmlzaXRTZXRGZWF0dXJlcyhFT2JqZWN0IGVvYmplY3QsIFZpc2l0b3IgdmlzaXRvcikgewotCQkJaWYgKGVvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVQcm92aWRlcikKLQkJCQlyZXR1cm4gKChGZWF0dXJlVmFsdWVQcm92aWRlcillb2JqZWN0KS52aXNpdFNldEZlYXR1cmVzKHZpc2l0b3IpOwotCQkJZWxzZSB7Ci0JCQkJLy8gTm90IGEgRmVhdHVyZVZhbHVlUHJvdmlkZXIsIHNvIGRvIG5vcm1hbC4KLQkJCQlJdGVyYXRvciBmZWF0dXJlcyA9IGVvYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoZmVhdHVyZXMuaGFzTmV4dCgpKXsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlcy5uZXh0KCk7Ci0JCQkJCWlmKGVvYmplY3QuZUlzU2V0KHNmKSl7Ci0JCQkJCQlPYmplY3QgcmVzdWx0ID0gdmlzaXRvci5pc1NldChzZiwgZW9iamVjdC5lR2V0KHNmKSk7Ci0JCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFuc3dlcnMgd2hldGhlciBhbnkgZmVhdHVyZSBpcyBzZXQgb3Igbm90LgotCQkgKiA8cD4KLQkJICogPGI+Tm90ZTo8L2I+IFRoaXMgU0hPVUxEIE5PVCBiZSB1c2VkIGFzIGEgdGVzdCBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0byBkbyB2aXNpdFNldEZlYXR1cmVzIG9yIG5vdC4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8ganVzdCBjYWxsCi0JCSAqIHZpc2l0U2V0RmVhdHVyZXMuIEl0IHNob3VsZCBiZSB1c2VkIG9ubHkgdG8gc2VlIGlmIGFueSBmZWF0dXJlcyBhcmUgc2V0LgotCQkgKiAKLQkJICogQHBhcmFtIGVvYmplY3QKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbnlGZWF0dXJlU2V0KEVPYmplY3QgZW9iamVjdCkgewotCQkJaWYgKGVvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVQcm92aWRlcikKLQkJCQlyZXR1cm4gKChGZWF0dXJlVmFsdWVQcm92aWRlcillb2JqZWN0KS5pc0FueUZlYXR1cmVTZXQoKTsKLQkJCWVsc2UgewotCQkJCS8vIE5vdCBhIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLCBzbyBkbyBub3JtYWwuCi0JCQkJSXRlcmF0b3IgZmVhdHVyZXMgPSBlb2JqZWN0LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGZlYXR1cmVzLmhhc05leHQoKSl7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZXMubmV4dCgpOwotCQkJCQlpZihlb2JqZWN0LmVJc1NldChzZikpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIEZlYXR1cmVWYWx1ZVByb3ZpZGVySGVscGVyKCkgewotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB2aXNpdGVyIGNhbGxiYWNrLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgVmlzaXRvcnsKLQkJLyoqCi0JCSAqIENhbGxlZCBmb3IgZWFjaCBzZXQgZmVhdHVyZSBvbiB0aGUgRmVhdHVyZVZhbHVlUHJvdmlkZXIuCi0JCSAqIAotCQkgKiBAcGFyYW0gZmVhdHVyZQotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB0byBjb250aW51ZSB0byBuZXh0IHNldHRpbmcsIG9yIGEgdmFsdWUgdG8gc3RvcCB2aXNpdGluZyBhbmQgcmV0dXJuIHRoYXQgdmFsdWUgYmUgdGhlIHJlYWwgZXhjZXB0aW9uLgotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCU9iamVjdCBpc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKTsKLQl9CQotCi0JLyoqCi0JICogVmlzaXQgdGhlIHNldCBmZWF0dXJlcy4KLQkgKiBAcGFyYW0gYVZpc2l0b3IKLQkgKiBAcGFyYW0gPGNvZGU+bnVsbDwvY29kZT4gaWYgYWxsIHNldHRpbmdzIHZpc2l0ZWQsIG9yIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSB2aXNpdCAoaXNTZXQpIHRoYXQgcmV0dXJuZWQgYSBub24tbnVsbFNlLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXRTZXRGZWF0dXJlcyhWaXNpdG9yIGFWaXNpdG9yKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgYW55IGZlYXR1cmUgaXMgc2V0IG9yIG5vdC4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBTSE9VTEQgTk9UIGJlIHVzZWQgYXMgYSB0ZXN0IGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIHRvIGRvIHZpc2l0U2V0RmVhdHVyZXMgb3Igbm90LiBJdCBpcwotCSAqIG1vcmUgZWZmaWNpZW50IHRvIGp1c3QgY2FsbCB2aXNpdFNldEZlYXR1cmVzLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5IHRvIHNlZSBpZiBhbnkgZmVhdHVyZXMgYXJlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBmZWF0dXJlcyBhcmUgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW55RmVhdHVyZVNldCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFEYXRhVHlwZUluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTU0NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElKYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGluc3RhbmNlcyBvZiBqYXZhIGRhdGEgdHlwZXMuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJSmF2YURhdGFUeXBlSW5zdGFuY2UgZXh0ZW5kcyBJSmF2YUluc3RhbmNlIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YUluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlZDQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElKYXZhSW5zdGFuY2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8xMC8wMyAxOToyMDo0MiAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkphdmFBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25JbnN0YW5jZTsKLS8qKgotICogQSBjb21tb24gaW50ZXJmYWNlIGZvciBKYXZhIGluc3RhbmNlcy4gSXQgd2lsbCBiZQotICogc2hhcmVkIGJ5IEphdmEgT2JqZWN0cyBhbmQgSmF2YSBEYXRhVHlwZSBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFJbnN0YW5jZSBleHRlbmRzIEVPYmplY3QsIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLCBJSW5zdGFudGlhdGlvbkluc3RhbmNlIHsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGFsbG9jYXRpb24gb2JqZWN0LgotCSAqIEByZXR1cm4gVGhlIGFsbG9jYXRpb24gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBKYXZhQWxsb2NhdGlvbiBnZXRBbGxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBhbGxvY2F0aW9uIGZvciB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gYWxsb2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb24oSmF2YUFsbG9jYXRpb24gYWxsb2NhdGlvbik7CQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGhhcyBiZWVuIHNldCBvciBub3QuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzZXQuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWxsb2NhdGlvbigpOwotCQotCS8qKgotCSAqIEFuc3dlciB0cnVlIGlmIHdlIGFyZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YgSmF2YSdzIHByaW1pdGl2ZSBkYXRhIHR5cGVzLgotCSAqIGUuZy4gYm9vbGVhbiwgY2hhciAtIHRydWUgb3RoZXJ3aXNlLCBlLmcuIGphdmEubGFuZy5Cb29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIGhhcyBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaW1wbGljaXQgYWxsb2NhdGlvbi4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBzZXQgb3Igbm90IGltcGxpY2l0LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBoYXMgYW4gcGFyc2V0cmVlIGFsbG9jYXRpb24uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXJzZXRyZWUgYWxsb2NhdGlvbi4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdCBzZXQgb3Igbm90IHBhcnNldHJlZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YU9iamVjdEluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhT2JqZWN0SW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3OWIzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0lKYXZhT2JqZWN0SW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IElKYXZhT2JqZWN0SW5zdGFuY2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGphdmEgb2JqZWN0IGluc3RhbmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YU9iamVjdEluc3RhbmNlIGV4dGVuZHMgSUphdmFJbnN0YW5jZSB7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0luc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzg0NDU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ3VycmVudGx5VGhpc05vdFN1cHBvcnRlZF9FWENfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyY2UzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFEYXRhVHlwZUluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBKYXZhRGF0YVR5cGVJbnN0YW5jZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgYSBKYXZhIE1vZGVsIERhdGF0eXBlIChpLmUuIHByaW1pdGl2ZSkuCi0gKiBJdCBjYW4gYmUgY3JlYXRlZCBmcm9tIGEgc3RyaW5nLCB3aGljaCBiZWNvbWVzIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcKLSAqIGZvciB0aGUgaW5zdGFuY2UuIEl0J3MgdG9TdHJpbmcgd2lsbCBiZSB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotICoKLSAqIEl0IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBkaXJlY3RseSwgdGhlIElKYXZhRGF0YVR5cGVJbnN0YW5jZSBpbnRlcmZhY2Ugc2hvdWxkIGJlCi0gKiB1c2VkIGluc3RlYWQuIEl0IGlzIHB1YmxpYyBzbyB0aGF0IGl0IGNhbiBiZSBzdWJjbGFzc2VkLiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFEYXRhVHlwZUluc3RhbmNlIGV4dGVuZHMgSmF2YUluc3RhbmNlIGltcGxlbWVudHMgSUphdmFEYXRhVHlwZUluc3RhbmNlIHsKLQotCXByb3RlY3RlZCBKYXZhRGF0YVR5cGVJbnN0YW5jZSgpIHsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCl7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUZhY3RvcnlIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFGYWN0b3J5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU0MjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUZhY3RvcnlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhRmFjdG9yeUhhbmRsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXI7Ci0KLS8qKgotICogQWRhcHRlciBvbiBKYXZhRmFjdG9yeUltcGwgdG8gZG8gaW5zdGFudGlhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEphdmFGYWN0b3J5SGFuZGxlciBpbXBsZW1lbnRzIElJbnN0YW50aWF0aW9uSGFuZGxlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEphdmFGYWN0b3J5SGFuZGxlciBJTlNUQU5DRSA9IG5ldyBKYXZhRmFjdG9yeUhhbmRsZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhRmFjdG9yeUFkYXB0ZXIuCi0JICovCi0JcHJvdGVjdGVkIEphdmFGYWN0b3J5SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlciNoYW5kbGVzQ2xhc3Mob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzQ2xhc3MoRUNsYXNzIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBKYXZhQ2xhc3MgfHwgdHlwZSBpbnN0YW5jZW9mIEphdmFEYXRhVHlwZTsKLQkJLy8gRHVyaW5nIFhNSSBsb2FkaW5nLCBpdCBjYW4ndCB0ZWxsIHRoZSBKYXZhRGF0YVR5cGUgaXMgZGlmZmVyZW50IHRoYW4gSmF2YUNsYXNzLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyI2hhbmRsZXNEYXRhVHlwZShvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0RhdGFUeXBlKEphdmFEYXRhVHlwZSB0eXBlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyI2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCUVPYmplY3QgcmVzdWx0ID0gamF2YUNsYXNzIGluc3RhbmNlb2YgSmF2YUNsYXNzID8gKEVPYmplY3QpIG5ldyBKYXZhT2JqZWN0SW5zdGFuY2UoKSA6IG5ldyBKYXZhRGF0YVR5cGVJbnN0YW5jZSgpOwotCQkoKEludGVybmFsRU9iamVjdCkgcmVzdWx0KS5lU2V0Q2xhc3MoamF2YUNsYXNzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4N2VlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGUkCi0gKiAgJFJldmlzaW9uJCAgJERhdGUkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBmb3IgamF2YSBtb2RlbCBvYmplY3RzLgotICogSXQgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGRpcmVjdGx5LCB0aGUgSUphdmFPYmplY3RJbnN0YW5jZSBpbnRlcmZhY2Ugc2hvdWxkIGJlCi0gKiB1c2VkIGluc3RlYWQuIEl0IGlzIHB1YmxpYyBzbyB0aGF0IGl0IGNhbiBiZSBzdWJjbGFzc2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUluc3RhbmNlIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJSmF2YUluc3RhbmNlIHsKLQkKLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0SmF2YVR5cGUoKXsKLQkJcmV0dXJuIChKYXZhSGVscGVycykgZUNsYXNzKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhQWxsb2NhdGlvbiBnZXRBbGxvY2F0aW9uKCkgewotCQlyZXR1cm4gaXNTZXRBbGxvY2F0aW9uKCkgPyAoSmF2YUFsbG9jYXRpb24pIGVHZXQoSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcykpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdEFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldEFsbG9jYXRpb24oKSAmJiBnZXRBbGxvY2F0aW9uKCkuaXNJbXBsaWNpdCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZUFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldEFsbG9jYXRpb24oKSAmJiBnZXRBbGxvY2F0aW9uKCkuaXNQYXJzZVRyZWUoKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFZpc2l0IHRoZSBhcmd1bWVudCB3aXRoIGFsbCBvZiB0aGUgc2V0IGZlYXR1cmVzIGluIGFuIG9wdGltaXplZCBmYXNoaW9uIAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBOSUwgPSBFU3RydWN0dXJhbEZlYXR1cmVJbXBsLkludGVybmFsU2V0dGluZ0RlbGVnYXRlU2luZ2xlLk5JTDsKLQlwdWJsaWMgT2JqZWN0IHZpc2l0U2V0RmVhdHVyZXMoVmlzaXRvciBhVmlzaXRvcikgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGVIYXNTZXR0aW5ncygpKSB7Ci0JCQlKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyIHNldHRpbmdzID0gKEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIpIGVQcm9wZXJ0aWVzKCk7Ci0KLQkJCU9iamVjdFtdIHNldFByb3BlcnR5VmFsdWVzID0gc2V0dGluZ3MuZVNldHRpbmdzKCk7Ci0JCQlpZiAoc2V0UHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkgewotCQkJCUxpc3QgYWxsRmVhdHVyZXMgPSBzZXR0aW5ncy5nZXRBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNldFByb3BlcnR5VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBwcm9wZXJ0eVZhbHVlID0gc2V0UHJvcGVydHlWYWx1ZXNbaV07Ci0JCQkJCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJCS8vIDxudWxsPiBpcyBoYW5kbGVkIGJ5IHRoZSBwbGFjZWhvbGRlciBOSUwuIEEgc2V0dGluZyBvZiB0cnVlIG51bGwgbWVhbnMgbm90IHNldC4gQSBzZXR0aW5nIG9mIE5JTCBtZWFucyBzZXQgdG8gbnVsbC4KLQkJCQkJCWlmIChwcm9wZXJ0eVZhbHVlID09IE5JTCkKLQkJCQkJCQlwcm9wZXJ0eVZhbHVlID0gbnVsbDsKLQkJCQkJCWlmICgocmVzdWx0ID0gYVZpc2l0b3IuaXNTZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsRmVhdHVyZXMuZ2V0KGkpLCBwcm9wZXJ0eVZhbHVlKSkgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBbnlGZWF0dXJlU2V0KCkgewotCQlpZiAoZUhhc1NldHRpbmdzKCkpIHsKLQkJCUphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIgc2V0dGluZ3MgPSAoSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcikgZVByb3BlcnRpZXMoKTsKLQotCQkJT2JqZWN0W10gc2V0UHJvcGVydHlWYWx1ZXMgPSBzZXR0aW5ncy5lU2V0dGluZ3MoKTsKLQkJCWlmIChzZXRQcm9wZXJ0eVZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRQcm9wZXJ0eVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgcHJvcGVydHlWYWx1ZSA9IHNldFByb3BlcnR5VmFsdWVzW2ldOwotCQkJCQlpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBbGxvY2F0aW9uKCkgewotCQlFUmVmZXJlbmNlIGFsbG9jYXRpb25GZWF0dXJlID0gSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcyk7Ci0JCXJldHVybiBhbGxvY2F0aW9uRmVhdHVyZSAhPSBudWxsICYmIGVJc1NldChhbGxvY2F0aW9uRmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb24oSmF2YUFsbG9jYXRpb24gYWxsb2NhdGlvbikgewotCQlFUmVmZXJlbmNlIGFsbG9jYXRpb25GZWF0dXJlID0gSmF2YUluc3RhbnRpYXRpb24uZ2V0QWxsb2NhdGlvbkZlYXR1cmUodGhpcyk7Ci0JCWlmIChhbGxvY2F0aW9uRmVhdHVyZSAhPSBudWxsKQotCQkJZVNldChhbGxvY2F0aW9uRmVhdHVyZSwgYWxsb2NhdGlvbik7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIEVPYmplY3QncyB0b1N0cmluZyBpcyB0b28gYmlnIGZvciB1cywgc28gd2UgZG8gYSBjdXN0b21pemVkIG9uZS4KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlyZXN1bHQuYXBwZW5kKCdAJyk7Ci0JCXJlc3VsdC5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7Ci0JCQotCQlpZiAoZUlzUHJveHkoKSkKLQkJewotCQkgIHJlc3VsdC5hcHBlbmQoIiAoZVByb3h5VVJJOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkgIHJlc3VsdC5hcHBlbmQoZVByb3h5VVJJKCkpOwotCQkgIHJlc3VsdC5hcHBlbmQoJyknKTsKLQkJfQotCQlpZihnZXRKYXZhVHlwZSgpICE9IG51bGwpewotCQkJcmVzdWx0LmFwcGVuZCgneycpOwotCQkJcmVzdWx0LmFwcGVuZChnZXRKYXZhVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCd9Jyk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlKYXZhQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gZ2V0QWxsb2NhdGlvbigpOwotCQkJaWYgKGFsbG9jYXRpb24gIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hcHBlbmQoJzonKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoYWxsb2NhdGlvbi50b1N0cmluZygpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBjYW4gb2NjdXIgYmVjYXVzZSBzb21ldGltZXMgdGhpcyBlQ2xhc3MgY2FuJ3QgYmUgY29uc3RydWN0ZWQgcmlnaHQgYW5kIHdvbid0IGhhdmUgYW4gaW5pdHN0cmluZyBmZWF0dXJlLgotCQkJLy8gSW4gdGhhdCBjYXNlIGFuIE5QRSBpcyB0aHJvd24uCi0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIgZXh0ZW5kcyBFUHJvcGVydGllc0hvbGRlckltcGwgewotCQlwcml2YXRlIEVMaXN0IGFsbFN0cnVjdHVyYWxGZWF0dXJlczsKLQkJCi0JCXB1YmxpYyBKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyKCkgewotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZVNldHRpbmdzKCkgewotCQkJcmV0dXJuIGVTZXR0aW5nczsKLQkJfQotCi0JCXB1YmxpYyBFTGlzdCBnZXRBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSB7Ci0JCQlyZXR1cm4gYWxsU3RydWN0dXJhbEZlYXR1cmVzOwotCQl9Ci0JCQotCQkvKgotCQkgKiBDbGVhciB0aGUgY2FjaGUuIFRoaXMgaXMgZHVlIHRvIAotCQkgKiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGhhdmUgY2hhbmdlZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCQllU2V0dGluZ3MgPSBudWxsOwotCQkJc2V0RUNvbnRlbnRzKG51bGwpOwotCQkJc2V0RUNyb3NzUmVmZXJlbmNlcyhudWxsKTsKLQkJCWFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9IG51bGw7CQkJCi0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI2FsbG9jYXRlU2V0dGluZ3MoaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWxsb2NhdGVTZXR0aW5ncyhpbnQgbWF4aW11bUR5bmFtaWNGZWF0dXJlSUQpIHsKLQkJCWlmIChhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPT0gbnVsbCkKLQkJCQlhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPSBnZXRFQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7CQkJCi0JCQlzdXBlci5hbGxvY2F0ZVNldHRpbmdzKG1heGltdW1EeW5hbWljRmVhdHVyZUlEKTsKLQkJfQotCQkKLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI3NldEVDb250ZW50cyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFQ29udGVudHMoRUxpc3QgZUNvbnRlbnRzKSB7Ci0JCQlpZiAoYWxsU3RydWN0dXJhbEZlYXR1cmVzID09IG51bGwpCi0JCQkJYWxsU3RydWN0dXJhbEZlYXR1cmVzID0gZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJc3VwZXIuc2V0RUNvbnRlbnRzKGVDb250ZW50cyk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGwuRVByb3BlcnRpZXNIb2xkZXJJbXBsI3NldEVDcm9zc1JlZmVyZW5jZXMob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RUNyb3NzUmVmZXJlbmNlcyhFTGlzdCBlQ3Jvc3NSZWZlcmVuY2VzKSB7Ci0JCQlpZiAoYWxsU3RydWN0dXJhbEZlYXR1cmVzID09IG51bGwpCi0JCQkJYWxsU3RydWN0dXJhbEZlYXR1cmVzID0gZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJc3VwZXIuc2V0RUNyb3NzUmVmZXJlbmNlcyhlQ3Jvc3NSZWZlcmVuY2VzKTsKLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCBFUHJvcGVydGllc0hvbGRlciBlUHJvcGVydGllcygpCi0JewotCSAgaWYgKGVQcm9wZXJ0aWVzID09IG51bGwpCi0JICB7Ci0JCWVQcm9wZXJ0aWVzID0gbmV3IEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIoKTsKLQkgIH0KLQkgIHJldHVybiBlUHJvcGVydGllczsKLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlU2V0Q2xhc3MoRUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXRDbGFzcyhFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyLmVTZXRDbGFzcyhlQ2xhc3MpOwotCQltaWdyYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0VDbGFzcyBOZXcgZUNsYXNzIHNldCB0by4gKG51bGwpIHdoZW4gbWlncmF0aW5nIHdoaWxlIG5vdCBzZXR0aW5nIGEgbmV3IEVDbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlKCkgewotCQkvLyBOb3RlOiBUaGlzIGlzIGV4dHJlbWVsbHkgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBJdCBtYXkgY2hhbmdlIGZvciBhbnkgaW1wbGVtZW50YXRpb24gb2YgRU1GLgkKLQkJaWYgKGVQcm9wZXJ0aWVzICE9IG51bGwgJiYgKGVQcm9wZXJ0aWVzLmhhc1NldHRpbmdzKCkgfHwgZVByb3BlcnRpZXMuZ2V0RUNvbnRlbnRzKCkgIT0gbnVsbCB8fCBlUHJvcGVydGllcy5nZXRFQ3Jvc3NSZWZlcmVuY2VzKCkgIT0gbnVsbCkpIHsKLQkJCS8vIE1heWJlIG5lZWQgdG8gcmVjb25zdHJ1Y3Qgc2V0dGluZ3Mgb3IgY2xlYXIgY2FjaGUuCi0JCQlKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyIHByb3BlcnRpZXMgPSAoSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcikgZVByb3BlcnRpZXM7Ci0JCQlFTGlzdCBvbGRBbGxGZWF0dXJlcyA9IHByb3BlcnRpZXMuZ2V0QWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQkKLQkJCS8vIFNlZSBpZiBtaWdyYXRpb24gbmVlZGVkLgotCQkJaWYgKHByb3BlcnRpZXMuZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpID09IG9sZEFsbEZlYXR1cmVzKQotCQkJCXJldHVybjsJLy8gTm8gbWlncmF0aW9uIG5lZWRlZC4KLQkJCQotCQkJT2JqZWN0W10gb2xkU2V0dGluZ3MgPSBwcm9wZXJ0aWVzLmVTZXR0aW5ncygpOwkJCQotCQkJcHJvcGVydGllcy5jbGVhckNhY2hlKCk7CS8vIENsZWFyIHRoZSBjYWNoZSBzbyB3ZSBjYW4gcmVidWlsZCBpdC4KLQkJCWlmIChvbGRTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwkvLyBJdCB3YXMganVzdCBlaXRoZXIgY29udGVudHMgb3IgY3Jvc3NyZWZzLCBhbmQgdGhleSBoYXZlIGJlZW4gYXBwcm9wcmlhdGVseSBjbGVhcmVkLgkJCQotCQkJfQotCQkJCi0JCQkvLyBJdCBpcyBhc3N1bWVkIHRoYXQgYW55IFNGIHRoYXQgKGJ5IGlkZW50aXR5KSBpcyBpbgotCQkJLy8gYm90aCB0aGUgb2xkIGFuZCB0aGUgbmV3IGVDbGFzcywgdGhlbiBpdCBkb2Vzbid0IGhhdmUgYW55IGludGVybmFsIGNoYW5nZXMuIEl0IHNpbXBseSBjaGFuZ2VkIHBvc2l0aW9uCi0JCQkvLyBpbiB0aGUgc2V0dGluZ3MgbGlzdC4gT3RoZXJ3aXNlLCBuZWVkIHRvIHNlZSBpZiBjb21wYXRpYmxlIGJ5IHNhbWUgbmFtZSwgYW5kIGlmIHNvLCBtb3ZlIGl0LgkJCQotCQkJZVNldHRpbmdzKCk7CS8vIENyZWF0ZSBuZXcgc2V0dGluZ3MKLQkJCU9iamVjdFtdIG5ld1NldHRpbmdzID0gcHJvcGVydGllcy5lU2V0dGluZ3MoKTsKLQkJCWludCBzdGF0aWNGZWF0dXJlQ250ID0gZVN0YXRpY0ZlYXR1cmVDb3VudCgpOwkJCQotCQkJZm9yIChpbnQgb2xkSW5kZXggPSAwOyBvbGRJbmRleCA8IG9sZFNldHRpbmdzLmxlbmd0aDsgb2xkSW5kZXgrKykgewotCQkJCWlmIChvbGRTZXR0aW5nc1tvbGRJbmRleF0gIT0gbnVsbCkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBvbGRBbGxGZWF0dXJlcy5nZXQob2xkSW5kZXgrc3RhdGljRmVhdHVyZUNudCk7Ci0JCQkJCWludCBuZXdJbmRleCA9IHN1cGVyLmVEeW5hbWljRmVhdHVyZUlEKHNmKTsJLy8gVG8gYXZvaWQgcmVjdXJzZSBvbiBtaWdyYXRlLgotCQkJCQlpZiAobmV3SW5kZXggPiAtMSkgewotCQkJCQkJbW92ZUVTZXR0aW5nKG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncywgb2xkSW5kZXgsIHNmLCBuZXdJbmRleCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBTZWUgaWYgaXQgZXhpc3RzIGJ5IG5hbWUgYW5kIGlzIGNvbXBhdGlibGUuCi0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgbmV3U0YgPSBwcm9wZXJ0aWVzLmdldEVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShzZi5nZXROYW1lKCkpOwotCQkJCQkJaWYgKG5ld1NGICE9IG51bGwgJiYgbmV3U0YuZ2V0Q2xhc3MoKS5lcXVhbHMoc2YuZ2V0Q2xhc3MoKSkgJiYKLQkJCQkJCQluZXdTRi5pc01hbnkoKSA9PSBzZi5pc01hbnkoKSAmJiBuZXdTRi5pc0NoYW5nZWFibGUoKSA9PSBzZi5pc0NoYW5nZWFibGUoKSkgewotCQkJCQkJCWJvb2xlYW4gY29tcGF0aWJsZSA9IG5ld1NGLmlzVW5pcXVlKCkgPT0gc2YuaXNVbmlxdWUoKSB8fCAhbmV3U0YuaXNVbmlxdWUoKTsJLy8gSWYgbmV3IGlzIG5vdCB1bmlxdWUsIHRoZW4gZG9lc24ndCBtYXR0ZXIgaWYgb2xkIGFuZCBuZXcgYXJlIHRoZSBzYW1lCi0JCQkJCQkJaWYgKG5ld1NGIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQkJCQlFUmVmZXJlbmNlIG5ld1JlZiA9IChFUmVmZXJlbmNlKSBuZXdTRjsKLQkJCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgc2Y7Ci0JCQkJCQkJCWNvbXBhdGlibGUgPSBuZXdSZWYuaXNDb250YWlubWVudCgpID09IHJlZi5pc0NvbnRhaW5tZW50KCkgJiYgbmV3UmVmLmdldEVSZWZlcmVuY2VUeXBlKCkuaXNTdXBlclR5cGVPZihyZWYuZ2V0RVJlZmVyZW5jZVR5cGUoKSk7Ci0JCQkJCQkJfSBlbHNlCi0JCQkJCQkJCWNvbXBhdGlibGUgPSBuZXdTRi5nZXRFVHlwZSgpLmVxdWFscyhzZi5nZXRFVHlwZSgpKTsKLQkJCQkJCQkJCi0JCQkJCQkJaWYgKGNvbXBhdGlibGUpIHsKLQkJCQkJCQkJbmV3SW5kZXggPSBlRHluYW1pY0ZlYXR1cmVJRChuZXdTRik7Ci0JCQkJCQkJCW1vdmVFU2V0dGluZyhvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MsIG9sZEluZGV4LCBuZXdTRiwgbmV3SW5kZXgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbW92ZUVTZXR0aW5nKE9iamVjdFtdIG9sZFNldHRpbmdzLCBPYmplY3RbXSBuZXdTZXR0aW5ncywgaW50IG9sZEluZGV4LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YsIGludCBuZXdJbmRleCkgewotCQkvLyBTZWUgaWYgc2luZ2xlIHZzIG1hbnkuCi0JCWlmICghc2YuaXNNYW55KCkpCi0JCQluZXdTZXR0aW5nc1tuZXdJbmRleF0gPSBvbGRTZXR0aW5nc1tvbGRJbmRleF07CS8vIEdyZWF0LCB3ZSBjYW4ganVzdCBtb3ZlIGl0IG92ZXIuCi0JCWVsc2UgewotCQkJLy8gTWFueSBpcyBtb3JlIGRpZmZpY3VsdC4gTmVlZCB0byBjcmVhdGUgYSBuZXcgZHluYW1pYyBsaXN0IG9mIHJpZ2h0IHR5cGUsIGFuZAotCQkJLy8gdGhlbiBqdXN0IGNvcHkgb3ZlciB0aGUgZGF0YSBmcm9tIHRoZSBvbGQgb25lLiBXZSBjcmVhdGUgbmV3IG9uZSBieSBkb2luZyBhIHNpbXBsZSBlR2V0LgotCQkJLy8gVGhpcyB3aWxsIGNvbnN0cnVjdCBhbiBlbXB0eSBvbmUgd2l0aCBubyBub3RpZmljYXRpb25zIGdvaW5nIG91dC4KLQkJCS8vIE5vdGU6IFRoaXMgaXMgZXh0cmVtZWxseSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIFdlIHdpbGwgYmUgdGhyb3dpbmcgYXdheSB0aGUgb2xkCi0JCQkvLyBvbGRNYW55LCBzbyBpdCBpcyBvayB0byByZXVzZSB0aGUgYWN0dWFsIGFycmF5IG9mIGRhdGEgZm9yIHRoZSBuZXdNYW55LgotCQkJQmFzaWNFTGlzdCBuZXdNYW55ID0gKEJhc2ljRUxpc3QpIGVHZXQoc2YpOwotCQkJQmFzaWNFTGlzdCBvbGRNYW55ID0gKEJhc2ljRUxpc3QpIG9sZFNldHRpbmdzW29sZEluZGV4XTsKLQkJCW5ld01hbnkuc2V0RGF0YShvbGRNYW55LnNpemUoKSwgb2xkTWFueS5kYXRhKCkpOyAKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsI2VEeW5hbWljRmVhdHVyZUlEKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHJvdGVjdGVkIGludCBlRHluYW1pY0ZlYXR1cmVJRChFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCW1pZ3JhdGUoKTsJLy8gU2VlIGlmIG1pZ3JhdGlvbiBuZWVkZWQsIGFuZCBkbyBpZiBpdCBkb2VzLgotCQlyZXR1cm4gc3VwZXIuZUR5bmFtaWNGZWF0dXJlSUQoZVN0cnVjdHVyYWxGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCNlQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBlQ29udGVudHMoKSB7Ci0JCW1pZ3JhdGUoKTsJCQkKLQkJcmV0dXJuIHN1cGVyLmVDb250ZW50cygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0I2VDcm9zc1JlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBFTGlzdCBlQ3Jvc3NSZWZlcmVuY2VzKCkgewotCQltaWdyYXRlKCk7CQkJCi0JCXJldHVybiBzdXBlci5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW50aWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNDZiMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFJbnN0YW50aWF0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBqYXZhIG1vZGVsIGluc3RhbnRpYXRpb24gY29kZSBhbmQgdG8gYWNjZXNzIGR5bmFtaWMgZmVhdHVyZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSW5zdGFudGlhdGlvbiB7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT0NBVElPTiA9ICJhbGxvY2F0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdldCBhIHN0cnVjdHVyYWwgZmVhdHVyZSBmcm9tIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhT2JqZWN0SW5zdGFuY2UsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFNGZWF0dXJlKElKYXZhT2JqZWN0SW5zdGFuY2Ugam9iamVjdCwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBqb2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHJlZmVyZW5jZSBmcm9tIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhT2JqZWN0SW5zdGFuY2UsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBnZXRTRmVhdHVyZShqb2JqZWN0LCBmZWF0dXJlTmFtZSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXQgYSBzdHJ1Y3R1cmFsIGZlYXR1cmUgZnJvbSBhbiBpbnN0YW5jZSBvZiBhbiBJSmF2YU9iamVjdEluc3RhbmNlLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIGdldFNGZWF0dXJlKChKYXZhQ2xhc3MpIGpvYmplY3QuZ2V0SmF2YVR5cGUoKSwgc2ZVUkkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHN0cnVjdHVyYWwgZmVhdHVyZSBmcm9tIGEgSmF2YUNsYXNzLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoSmF2YUNsYXNzIGpjbGFzcywgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiBnZXRTRmVhdHVyZShqY2xhc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSwgc2ZVUkkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBzdHJ1Y3R1cmFsIGZlYXR1cmUgZnJvbSBhIFJlc291cmNlU2V0LCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoUmVzb3VyY2VTZXQgcnNldCwgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKSByc2V0LmdldEVPYmplY3Qoc2ZVUkksIHRydWUpOwotCX0JCi0JCi0JLyoqCi0JICogR2V0IGEgcmVmZXJlbmNlIGZyb20gYW4gaW5zdGFuY2Ugb2YgYW4gSUphdmFPYmplY3RJbnN0YW5jZSwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBnZXRTRmVhdHVyZSgoSmF2YUNsYXNzKSBqb2JqZWN0LmdldEphdmFUeXBlKCksIHNmVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSByZWZlcmVuY2UgZnJvbSBhIEphdmFDbGFzcywgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSmF2YUNsYXNzIGpjbGFzcywgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ2V0U0ZlYXR1cmUoamNsYXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCksIHNmVVJJKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgcmVmZXJlbmNlIGZyb20gYSBSZXNvdXJjZVNldCwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoUmVzb3VyY2VTZXQgcnNldCwgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcnNldC5nZXRFT2JqZWN0KHNmVVJJLCB0cnVlKTsKLQl9CQotCQotCS8qKgotCSAqIEdldCB0aGUgYWxsb2NhdGlvbiBGZWF0dXJlIGZvciB0aGlzIG9iamVjdC4gU2luY2UgaXQgZGVwZW5kcwotCSAqIG9uIHdoYXQgcmVzb3VyY2UgdGhhdCB0aGUgbWV0YWNsYXNzIGlzIGRlZmluZWQgaW4sIHdlIG11c3QgbG9vayBmb3IgaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldEFsbG9jYXRpb25GZWF0dXJlKElKYXZhSW5zdGFuY2Ugamluc3RhbmNlKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgamluc3RhbmNlLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShBTExPQ0FUSU9OKTsKLQl9Ci0JCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShSZXNvdXJjZVNldCByc2V0KSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyc2V0LCBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5BREFQVEVSX0tFWSkgPT0gbnVsbCkKLQkJCQlyc2V0LmVBZGFwdGVycygpLmFkZChuZXcgSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDVkZjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIGF0dGFjaGVkIHRvIHRoZSByZXNvdXJjZSBzZXQgZm9yIGEgamF2YSBtb2RlbC4gVGhlCi0gKiBKYXZhWE1JRmFjdG9yeSB3aWxsIGFzayBmb3IgdGhpcyBhZGFwdGVyIGFuZCBhc2sgaXQgZm9yIHRoZSBJSW5zdGFudGlhdGlvbkhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBKYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyI2dldEluc3RhbnRpYXRpb25IYW5kbGVyKEphdmFGYWN0b3J5SW1wbCkKLQkgKi8KLQlwdWJsaWMgSUluc3RhbnRpYXRpb25IYW5kbGVyIGdldEluc3RhbnRpYXRpb25IYW5kbGVyKEphdmFGYWN0b3J5SW1wbCBmYWN0b3J5KSB7Ci0JCXJldHVybiBKYXZhRmFjdG9yeUhhbmRsZXIuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLkFEQVBURVJfS0VZID09IHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFPYmplY3RJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhT2JqZWN0SW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3MzI3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFPYmplY3RJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSmF2YU9iamVjdEluc3RhbmNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE4ICQgICREYXRlOiAyMDA1LzA4LzIzIDIxOjEzOjAxICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLSAKLQotLyoqCi0gKiBKYXZhIE9iamVjdCBJbnN0YW5jZSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBzaW5jZSAxLjEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhT2JqZWN0SW5zdGFuY2UgZXh0ZW5kcyBKYXZhSW5zdGFuY2UgaW1wbGVtZW50cyBJSmF2YU9iamVjdEluc3RhbmNlIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSNpc1ByaW1pdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL1BhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmYxY2Q2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS4qOwotIAotLyoqCi0gKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBwYXJzZSB2aXNpdG9yIGZvciBpbnN0YW50aWF0aW5nIGEgYmVhbiBwcm94eSBmcm9tIGEgamF2YSBwYXJzZSB0cmVlIGFsbG9jYXRpb24uCi0gKiBJdCBjYW4gYmUgcmV1c2VkLCBidXQgaXMgbm90IHRocmVhZC1zYWZlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvciBleHRlbmRzIFBhcnNlVmlzaXRvciB7Ci0JCQotCS8qKgotCSAqIFRoZSBleHByZXNzaW9uIHRoYXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgZXZhbHVhdGVkLgotCSAqLwotCXByaXZhdGUgSUV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQkKLQkvKgotCSAqIFRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkLiBJdCBpcyB1c2VkIHdoZW4gb25lIGV4cHJlc3Npb24gaXMgc2VuZGluZyB0aGUKLQkgKiB2aXNpdGF0aW9uIHRvIHRoZSBuZXh0IGV4cHJlc3Npb24uIEl0IHdpbGwgc2V0IHRoaXMgdG8gd2hhdCB0aGF0IGV4cHJlc3Npb24gc2hvdWxkIGJlIHVzaW5nLiBUaGlzCi0JICogaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5leHQgZXhwcmVzc2lvbiBkb2Vzbid0IGtub3cgd2hhdCBpdCBzaG91bGQgYmUuCi0JICovCi0JcHJpdmF0ZSBGb3JFeHByZXNzaW9uIG5leHRFeHByZXNzaW9uID0gRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTjsKLQkKLQkvKioKLQkgKiBBbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3NpbmcuIEl0IGlzIGEgUnVudGltZUV4Y2VwdGlvbiBiZWNhdXNlCi0JICogaXQgY2FuIGJlIHRocm93biBhdCBhbnkgdGltZS4gSXQgd3JhcHBlcnMgYW5vdGhlciBleGNlcHRpb24uIFRoYXQgZXhjZXB0aW9uCi0JICogY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBjYXVzZSBvZiB0aGUgUHJvY2Vzc2luZ0V4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAc2VlIFRocm93YWJsZSNnZXRDYXVzZSgpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzaW5nRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTI2ODYyNDIyMjQ5MDQwNjY0M0w7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBjYXVzZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgUHJvY2Vzc2luZ0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJCXN1cGVyKGNhdXNlKTsKLQkJfQotCX0KLQkKLQlzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvcltdIElORklYVE9QUk9YWTsKLQlzdGF0aWMgewotCQlJTkZJWFRPUFJPWFkgPSBuZXcgSW5maXhPcGVyYXRvcltQVEluZml4T3BlcmF0b3IuVkFMVUVTLnNpemUoKV07Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuQU5EXSA9IEluZml4T3BlcmF0b3IuSU5fQU5EOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX0FORF0gPSBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX0FORDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9PUl0gPSBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkRJVklERV0gPSBJbmZpeE9wZXJhdG9yLklOX0RJVklERTsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5FUVVBTFNdID0gSW5maXhPcGVyYXRvci5JTl9FUVVBTFM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuR1JFQVRFUl0gPSBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVI7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuR1JFQVRFUl9FUVVBTFNdID0gSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSX0VRVUFMUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRUZUX1NISUZUXSA9IEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRVNTXSA9IEluZml4T3BlcmF0b3IuSU5fTEVTUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRVNTX0VRVUFMU10gPSBJbmZpeE9wZXJhdG9yLklOX0xFU1NfRVFVQUxTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLk1JTlVTXSA9IEluZml4T3BlcmF0b3IuSU5fTUlOVVM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuTk9UX0VRVUFMU10gPSBJbmZpeE9wZXJhdG9yLklOX05PVF9FUVVBTFM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuT1JdID0gSW5maXhPcGVyYXRvci5JTl9PUjsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5QTFVTXSA9IEluZml4T3BlcmF0b3IuSU5fUExVUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5SRU1BSU5ERVJdID0gSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVI7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVEXSA9IEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVEOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVEXSA9IEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfVU5TSUdORUQ7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuVElNRVNdID0gSW5maXhPcGVyYXRvci5JTl9USU1FUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5YT1JdID0gSW5maXhPcGVyYXRvci5JTl9YT1I7Ci0JfQotCQotCS8qKgotCSAqIEEgaGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBwYXJzZSB0cmVlJ3MgaW5maXggb3BlcmF0b3IgdG8gdGhlIFByb3h5IGluZml4IG9wZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRvcgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluZml4T3BlcmF0b3IgY29udmVydFBUSW5maXhPcGVyYXRvclRvUHJveHlJbmZpeE9wZXJhdG9yKFBUSW5maXhPcGVyYXRvciBvcGVyYXRvcikgewotCQlyZXR1cm4gSU5GSVhUT1BST1hZW29wZXJhdG9yLmdldFZhbHVlKCldOwotCX0KLQotCXN0YXRpYyBmaW5hbCBQcmVmaXhPcGVyYXRvcltdIFBSRUZJWFRPUFJPWFk7Ci0Jc3RhdGljIHsKLQkJUFJFRklYVE9QUk9YWSA9IG5ldyBQcmVmaXhPcGVyYXRvcltQVFByZWZpeE9wZXJhdG9yLlZBTFVFUy5zaXplKCldOwotCQlQUkVGSVhUT1BST1hZW1BUUHJlZml4T3BlcmF0b3IuQ09NUExFTUVOVF0gPSBQcmVmaXhPcGVyYXRvci5QUkVfQ09NUExFTUVOVDsKLQkJUFJFRklYVE9QUk9YWVtQVFByZWZpeE9wZXJhdG9yLk1JTlVTXSA9IFByZWZpeE9wZXJhdG9yLlBSRV9NSU5VUzsKLQkJUFJFRklYVE9QUk9YWVtQVFByZWZpeE9wZXJhdG9yLk5PVF0gPSBQcmVmaXhPcGVyYXRvci5QUkVfTk9UOwotCQlQUkVGSVhUT1BST1hZW1BUUHJlZml4T3BlcmF0b3IuUExVU10gPSBQcmVmaXhPcGVyYXRvci5QUkVfUExVUzsKLQl9Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHBhcnNlIHRyZWUncyBwcmVmaXggb3BlcmF0b3IgdG8gdGhlIFByb3h5IHByZWZpeCBvcGVyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVmaXhPcGVyYXRvciBjb252ZXJ0UFRQcmVmaXhPcGVyYXRvclRvUHJveHlQcmVmaXhPcGVyYXRvcihQVFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCXJldHVybiBQUkVGSVhUT1BST1hZW29wZXJhdG9yLmdldFZhbHVlKCldOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHZpc2l0b3Igd2l0aCB0aGUgZ2l2ZW4gcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50IHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBleHByZXNzaW9uLmdldFJlZ2lzdHJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCBleHByZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQkKLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnByb3h5IGZvciB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgcmVnaXN0cnkuIEl0IHdpbGwgZXZhbHVhdGUgaW1tZWRpYXRlbHkuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldEJlYW5Qcm94eShQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLCBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQkJdGhpcy5leHByZXNzaW9uID0gcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCXRyeSB7Ci0JCQlleHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKLQkJfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBIYW5kbGUgdGhlIG1vc3QgY29tbW9uIHRoYXQgbWFrZSBzZW5zZSB0byBiZSBrbm93IGRpc3RpbmN0bHkgYW5kIHRocm93IHRoZW0gaW5zdGVhZCBvZiBQcm9jZXNzaW5nRXhjZXB0aW9uLgotCQkJVGhyb3dhYmxlIHQgPSBlLmdldENhdXNlKCk7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKQotCQkJCXRocm93IChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbikgdDsKLQkJCWVsc2UgaWYgKHQgaW5zdGFuY2VvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikgdDsKLQkJCWVsc2UKLQkJCQl0aHJvdyBlOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVc2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBwcm9jZXNzb3IgYWxsb2NhdGUgdGhlIHByb3h5LiBJdCB3aWxsIG5vdCBldmFsdWF0ZSBpbW1lZGlhdGVseSwgYnV0IGp1c3QgcHVzaCBvbnRvIHRoZSBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGV4cHJlc3Npb25Qcm9jZXNzb3IKLQkgKiBAcmV0dXJuIHRoZSBFeHByZXNzaW9uUHJveHkgZm9yIHRoZSBhbGxvY2F0aW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGdldFByb3h5KFBURXhwcmVzc2lvbiBleHByZXNzaW9uLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uUHJvY2Vzc29yKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFByb2Nlc3NpbmdFeGNlcHRpb24gewotCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uUHJvY2Vzc29yOwotCQl0cnkgewotCQkJRXhwcmVzc2lvblByb3h5IHByb3h5ID0gZXhwcmVzc2lvblByb2Nlc3Nvci5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hUKTsKLQkJCWV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwotCQkJcmV0dXJuIHByb3h5OwotCQl9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEhhbmRsZSB0aGUgbW9zdCBjb21tb24gdGhhdCBtYWtlIHNlbnNlIHRvIGJlIGtub3cgZGlzdGluY3RseSBhbmQgdGhyb3cgdGhlbSBpbnN0ZWFkIG9mIFByb2Nlc3NpbmdFeGNlcHRpb24uCi0JCQlUaHJvd2FibGUgdCA9IGUuZ2V0Q2F1c2UoKTsKLQkJCWlmICh0IGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKQotCQkJCXRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pIHQ7Ci0JCQllbHNlCi0JCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIFNldCB0aGUgbmV4dCBleHByZXNzaW9uIHR5cGUuIChpLmUuIHRoZSA8Y29kZT5mb3JFeHByZXNzaW9uPC9jb2RlPiBmaWVsZCBvZiBtb3N0IG9mIHRoZSBjcmVhdGUgZXhwcmVzc2lvbiBtZXRob2RzLgotCSAqIAotCSAqIEBwYXJhbSBuZXh0RXhwcmVzc2lvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlSW5maXhFeHByZXNzaW9uKGludCwgaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBuZXh0RXhwcmVzc2lvbikgewotCQl0aGlzLm5leHRFeHByZXNzaW9uID0gbmV4dEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZS4gKGkuZS4gdGhlIDxjb2RlPmZvckV4cHJlc3Npb248L2NvZGU+IGZpZWxkIG9mIG1vc3Qgb2YgdGhlIGNyZWF0ZSBleHByZXNzaW9uIG1ldGhvZHMuCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlSW5maXhFeHByZXNzaW9uKGludCwgaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEZvckV4cHJlc3Npb24gZ2V0TmV4dEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXh0RXhwcmVzc2lvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUFycmF5QWNjZXNzKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0SW5kZXhlcygpLnNpemUoKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVkpOwotCQlub2RlLmdldEFycmF5KCkuYWNjZXB0KHRoaXMpOwotCQlMaXN0IGlkeCA9IG5vZGUuZ2V0SW5kZXhlcygpOwotCQlpbnQgcyA9IGlkeC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBpZHguZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUFycmF5Q3JlYXRpb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCksIG5vZGUuZ2V0RGltZW5zaW9ucygpLnNpemUoKSk7Ci0JCWlmIChub2RlLmdldERpbWVuc2lvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCW5vZGUuZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcyk7CS8vIEFycmF5IGluaXRpYWxpemVyIGRvZXNuJ3QgcmVxdWlyZSBhIG5leHQgZXhwcmVzc2lvbi4KLQkJfSBlbHNlIHsKLQkJCUxpc3QgZGltcyA9IG5vZGUuZ2V0RGltZW5zaW9ucygpOwotCQkJaW50IHMgPSBkaW1zLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTik7Ci0JCQkJKChQVEV4cHJlc3Npb24pIGRpbXMuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIobm9kZS5nZXRFeHByZXNzaW9ucygpLnNpemUoKSk7Ci0JCUxpc3QgZXhwcyA9IG5vZGUuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJaW50IHMgPSBleHBzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBleHBzLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5pc0Jvb2xlYW5WYWx1ZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlQ2FzdEV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNBU1RfRVhQUkVTU0lPTik7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRDaGFyVmFsdWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpLCBub2RlLmdldEFyZ3VtZW50cygpLnNpemUoKSk7Ci0JCUxpc3QgYXJncyA9IG5vZGUuZ2V0QXJndW1lbnRzKCk7Ci0JCWludCBzID0gYXJncy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCk7Ci0JCQkoKFBURXhwcmVzc2lvbikgYXJncy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04pOwotCQlub2RlLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFKTsKLQkJbm9kZS5nZXRUcnVlKCkuYWNjZXB0KHRoaXMpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFKTsKLQkJbm9kZS5nZXRGYWxzZSgpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBURmllbGRBY2Nlc3Mgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlRmllbGRBY2Nlc3MoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRGaWVsZCgpLCBub2RlLmdldFJlY2VpdmVyKCkgIT0gbnVsbCk7Ci0JCWlmIChub2RlLmdldFJlY2VpdmVyKCkgIT0gbnVsbCkgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUik7Ci0JCQlub2RlLmdldFJlY2VpdmVyKCkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlSW5maXhFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCksIGNvbnZlcnRQVEluZml4T3BlcmF0b3JUb1Byb3h5SW5maXhPcGVyYXRvcihub2RlLmdldE9wZXJhdG9yKCkpLCBub2RlLmdldEV4dGVuZGVkT3BlcmFuZHMoKS5zaXplKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQpOwotCQlub2RlLmdldExlZnRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX1JJR0hUKTsKLQkJbm9kZS5nZXRSaWdodE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCUxpc3QgZXh0ZW5kZWQgPSBub2RlLmdldEV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJaW50IHMgPSBleHRlbmRlZC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVEKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBleHRlbmRlZC5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluc3RhbmNlb2Ygbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlSW5zdGFuY2VvZkV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklOU1RBTkNFT0ZfVkFMVUUpOwotCQlub2RlLmdldE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihub2RlLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlTWV0aG9kSW52b2NhdGlvbihnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldE5hbWUoKSwgbm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwsIG5vZGUuZ2V0QXJndW1lbnRzKCkuc2l6ZSgpKTsKLQkJaWYgKG5vZGUuZ2V0UmVjZWl2ZXIoKSAhPSBudWxsKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUik7Ci0JCQlub2RlLmdldFJlY2VpdmVyKCkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCUxpc3QgYXJncyA9IG5vZGUuZ2V0QXJndW1lbnRzKCk7Ci0JCWludCBzID0gYXJncy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCk7Ci0JCQkoKFBURXhwcmVzc2lvbikgYXJncy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE5hbWUgbm9kZSkgewotCQkvLyBUaGlzIGlzIHNwZWNpYWwgaW4gdGhlIFBUTmFtZSBjYW4gb25seSBiZSB1c2VkIGFzIGEgdHlwZSByZWNlaXZlciBhdCB0aGlzIHRpbWUuCi0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVUeXBlUmVjZWl2ZXIobm9kZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIFRoaXMgaXMgc3BlY2lhbCBpbiB0aGUgUFROYW1lIGNhbiBvbmx5IGJlIHVzZWQgYXMgYSB0eXBlIHJlY2VpdmVyIGF0IHRoaXMgdGltZS4KLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZU51bGwoZ2V0TmV4dEV4cHJlc3Npb24oKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIEl0IGlzIGFzc3VtZWQgdGhlIHRva2VucyBhcmUgdHJpbW1lZC4KLQkJU3RyaW5nIGxpdCA9IG5vZGUuZ2V0VG9rZW4oKTsKLQkJY2hhciBsYXN0Q2hhciA9IGxpdC5jaGFyQXQobGl0Lmxlbmd0aCgpLTEpOwotCQlpZiAobGFzdENoYXIgPT0gJ2wnIHx8IGxhc3RDaGFyID09ICdMJyApIHsKLQkJCS8vIEl0IGlzIGRlZmluaXRlbHkgYSBsb25nLgotCQkJLy8gVXNpbmcgZGVjb2RlIHNvIHRoYXQgdGhpbmdzIGxpa2UgMHgzIHdpbGwgYmUgcGFyc2VkLiBwYXJzZUxvbmcgd29uJ3QgcmVjb2duaXplIHRob3NlLgotCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgTG9uZy5kZWNvZGUobGl0LnN1YnN0cmluZygwLCBsaXQubGVuZ3RoKCktMSkpLmxvbmdWYWx1ZSgpKTsKLQkJfSBlbHNlIGlmIChsYXN0Q2hhciA9PSAnRicgfHwgbGFzdENoYXIgPT0gJ2YnKSB7Ci0JCQkvLyBJdCBpcyBkZWZpbml0ZWx5IGEgZmxvYXQuCi0JCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBGbG9hdC5wYXJzZUZsb2F0KGxpdC5zdWJzdHJpbmcoMCwgbGl0Lmxlbmd0aCgpLTEpKSk7Ci0JCX0gZWxzZSBpZiAobGFzdENoYXIgPT0gJ0QnIHx8IGxhc3RDaGFyID09ICdkJykgIHsKLQkJCS8vIEl0IGlzIGRlZmluaXRlbHkgYSBkb3VibGUuCi0JCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBEb3VibGUucGFyc2VEb3VibGUobGl0LnN1YnN0cmluZygwLCBsaXQubGVuZ3RoKCktMSkpKTsKLQkJfSBlbHNlIGlmIChsaXQuaW5kZXhPZignLicpICE9IC0xIHx8IGxpdC5pbmRleE9mKCdlJykgIT0gLTEgfHwgbGl0LmluZGV4T2YoJ0UnKSAhPSAtMSkgewotCQkJCS8vIEl0IGlzIGRlZmluaXRlbHkgYSBkb3VibGUuIChoYXMgYSBwZXJpb2Qgb3IgYW4gZXhwb25lbnQsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICdmJyBvbiB0aGUgZW5kIGlzIGFsd2F5cyBhIGRvdWJsZSkuCi0JCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgRG91YmxlLnBhcnNlRG91YmxlKGxpdC5zdWJzdHJpbmcoMCwgbGl0Lmxlbmd0aCgpKSkpOwotCQl9IGVsc2UgewotCQkJLy8gVXNpbmcgZGVjb2RlIHNvIHRoYXQgdGhpbmdzIGxpa2UgMHgzIHdpbGwgYmUgcGFyc2VkLiBwYXJzZUludCB3b24ndCByZWNvZ25pemUgdGhvc2UuCi0JCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChnZXROZXh0RXhwcmVzc2lvbigpLCBJbnRlZ2VyLmRlY29kZShsaXQpLmludFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwkvLyBGb3IgaW5zdGFudGlhdGlvbiBwdXJwb3NlcywgdGhlIHBhcmVudGhlc2lzIGNhbiBiZSBpZ25vcmVkLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlUHJlZml4RXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpLCBjb252ZXJ0UFRQcmVmaXhPcGVyYXRvclRvUHJveHlQcmVmaXhPcGVyYXRvcihub2RlLmdldE9wZXJhdG9yKCkpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCk7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpLCBnZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKG5vZGUuZ2V0TGl0ZXJhbFZhbHVlKCkpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFRoaXNMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVGhpc0xpdGVyYWwgbm9kZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEluc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0N1cnJlbnRseVRoaXNOb3RTdXBwb3J0ZWRfRVhDXyk7IAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVHlwZUxpdGVyYWwgbm9kZSkgewotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlVHlwZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXRUeXBlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODcwNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcl9DdXJyZW50bHlUaGlzTm90U3VwcG9ydGVkX0VYQ18gPSBJV0FWMDAwMUUgQ3VycmVudGx5ICJ0aGlzIiBpcyBub3Qgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0ltcGxpY2l0QWxsb2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW1wbGljaXRBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWEyOTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW1wbGljaXRBbGxvY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEltcGxpY2l0QWxsb2NhdGlvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOSAkICAkRGF0ZTogMjAwNS8xMC8wMyAxOToyMDo0MSAkIAotICovCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1wbGljaXQgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbXBsaWNpdEFsbG9jYXRpb25JbXBsI2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkltcGxpY2l0QWxsb2NhdGlvbkltcGwjZ2V0RmVhdHVyZSA8ZW0+RmVhdHVyZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEltcGxpY2l0QWxsb2NhdGlvbkltcGwgZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbkltcGwgaW1wbGVtZW50cyBJbXBsaWNpdEFsbG9jYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudCgpIDxlbT5QYXJlbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgcGFyZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZlYXR1cmUoKSA8ZW0+RmVhdHVyZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmVhdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbXBsaWNpdEFsbG9jYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEltcGxpY2l0QWxsb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IG9sZFBhcmVudCA9IHBhcmVudDsKLQkJCXBhcmVudCA9IGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClwYXJlbnQpOwotCQkJaWYgKHBhcmVudCAhPSBvbGRQYXJlbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQsIG9sZFBhcmVudCwgcGFyZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBiYXNpY0dldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoRU9iamVjdCBuZXdQYXJlbnQpIHsKLQkJRU9iamVjdCBvbGRQYXJlbnQgPSBwYXJlbnQ7Ci0JCXBhcmVudCA9IG5ld1BhcmVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5ULCBvbGRQYXJlbnQsIHBhcmVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlLmVJc1Byb3h5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBvbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJCWZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClmZWF0dXJlKTsKLQkJCWlmIChmZWF0dXJlICE9IG9sZEZlYXR1cmUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFLCBvbGRGZWF0dXJlLCBmZWF0dXJlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBiYXNpY0dldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG5ld0ZlYXR1cmUpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIG9sZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlmZWF0dXJlID0gbmV3RmVhdHVyZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRSwgb2xkRmVhdHVyZSwgZmVhdHVyZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFyZW50KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UGFyZW50KCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGZWF0dXJlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RmVhdHVyZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UOgotCQkJCXNldFBhcmVudCgoRU9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFOgotCQkJCXNldEZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UOgotCQkJCXNldFBhcmVudCgoRU9iamVjdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkU6Ci0JCQkJc2V0RmVhdHVyZSgoRVN0cnVjdHVyYWxGZWF0dXJlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQ6Ci0JCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFOgotCQkJCXJldHVybiBmZWF0dXJlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSW1wbGljaXRBbGxvY2F0aW9uKCIgKyBnZXRQYXJlbnQoKSArICItIiArIGdldEZlYXR1cmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi19IC8vSW1wbGljaXRBbGxvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZGZhMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBJbml0U3RyaW5nQWxsb2NhdGlvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMTowMjoxOSAkIAotICovCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsI2dldEluaXRTdHJpbmcgPGVtPkluaXQgU3RyaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsIGV4dGVuZHMgSmF2YUFsbG9jYXRpb25JbXBsIGltcGxlbWVudHMgSW5pdFN0cmluZ0FsbG9jYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0U3RyaW5nKCkgPGVtPkluaXQgU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0U3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUX1NUUklOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0U3RyaW5nKCkgPGVtPkluaXQgU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0U3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRTdHJpbmcgPSBJTklUX1NUUklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbml0U3RyaW5nQWxsb2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRTdHJpbmcoKSB7Ci0JCXJldHVybiBpbml0U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRTdHJpbmcoU3RyaW5nIG5ld0luaXRTdHJpbmcpIHsKLQkJU3RyaW5nIG9sZEluaXRTdHJpbmcgPSBpbml0U3RyaW5nOwotCQlpbml0U3RyaW5nID0gbmV3SW5pdFN0cmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9fSU5JVF9TVFJJTkcsIG9sZEluaXRTdHJpbmcsIGluaXRTdHJpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HOgotCQkJCXJldHVybiBnZXRJbml0U3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORzoKLQkJCQlzZXRJbml0U3RyaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HOgotCQkJCXNldEluaXRTdHJpbmcoSU5JVF9TVFJJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORzoKLQkJCQlyZXR1cm4gSU5JVF9TVFJJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRTdHJpbmcgIT0gbnVsbCA6ICFJTklUX1NUUklOR19FREVGQVVMVC5lcXVhbHMoaW5pdFN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXN1bHQuYXBwZW5kKCJJbml0U3RyaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0U3RyaW5nKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0luaXRTdHJpbmdBbGxvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZDViOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBJbnN0YW50aWF0aW9uRmFjdG9yeUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTEgJCAgJERhdGU6IDIwMDUvMTAvMDMgMTk6MjA6NDEgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBJbnN0YW50aWF0aW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT046IHJldHVybiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OOiByZXR1cm4gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTjogcmV0dXJuIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTOiByZXR1cm4gY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTjogcmV0dXJuIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9JTklUSUFMSVpFUjogcmV0dXJuIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT046IHJldHVybiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTOiByZXR1cm4gY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRjogcmV0dXJuIGNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTjogcmV0dXJuIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OQU1FOiByZXR1cm4gY3JlYXRlUFROYW1lKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTExfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUTnVsbExpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9USElTX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVFRoaXNMaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTDogcmV0dXJuIGNyZWF0ZVBUVHlwZUxpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OOiByZXR1cm4gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0U6IHJldHVybiBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9PUEVSQVRPUjogewotCQkJCVBUSW5maXhPcGVyYXRvciByZXN1bHQgPSBQVEluZml4T3BlcmF0b3IuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX09QRVJBVE9SOiB7Ci0JCQkJUFRQcmVmaXhPcGVyYXRvciByZXN1bHQgPSBQVFByZWZpeE9wZXJhdG9yLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9PUEVSQVRPUjoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX09QRVJBVE9SOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRTdHJpbmdBbGxvY2F0aW9uIGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCkgewotCQlJbml0U3RyaW5nQWxsb2NhdGlvbkltcGwgaW5pdFN0cmluZ0FsbG9jYXRpb24gPSBuZXcgSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsKCk7Ci0JCXJldHVybiBpbml0U3RyaW5nQWxsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1wbGljaXRBbGxvY2F0aW9uIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbigpIHsKLQkJSW1wbGljaXRBbGxvY2F0aW9uSW1wbCBpbXBsaWNpdEFsbG9jYXRpb24gPSBuZXcgSW1wbGljaXRBbGxvY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gaW1wbGljaXRBbGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZVRyZWVBbGxvY2F0aW9uIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKSB7Ci0JCVBhcnNlVHJlZUFsbG9jYXRpb25JbXBsIHBhcnNlVHJlZUFsbG9jYXRpb24gPSBuZXcgUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHBhcnNlVHJlZUFsbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcygpIHsKLQkJUFRBcnJheUFjY2Vzc0ltcGwgcHRBcnJheUFjY2VzcyA9IG5ldyBQVEFycmF5QWNjZXNzSW1wbCgpOwotCQlyZXR1cm4gcHRBcnJheUFjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUNyZWF0aW9uIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpIHsKLQkJUFRBcnJheUNyZWF0aW9uSW1wbCBwdEFycmF5Q3JlYXRpb24gPSBuZXcgUFRBcnJheUNyZWF0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHRBcnJheUNyZWF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEFycmF5SW5pdGlhbGl6ZXIgY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKCkgewotCQlQVEFycmF5SW5pdGlhbGl6ZXJJbXBsIHB0QXJyYXlJbml0aWFsaXplciA9IG5ldyBQVEFycmF5SW5pdGlhbGl6ZXJJbXBsKCk7Ci0JCXJldHVybiBwdEFycmF5SW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbCgpIHsKLQkJUFRCb29sZWFuTGl0ZXJhbEltcGwgcHRCb29sZWFuTGl0ZXJhbCA9IG5ldyBQVEJvb2xlYW5MaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRCb29sZWFuTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRDYXN0RXhwcmVzc2lvbiBjcmVhdGVQVENhc3RFeHByZXNzaW9uKCkgewotCQlQVENhc3RFeHByZXNzaW9uSW1wbCBwdENhc3RFeHByZXNzaW9uID0gbmV3IFBUQ2FzdEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdENhc3RFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVENoYXJhY3RlckxpdGVyYWwgY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKCkgewotCQlQVENoYXJhY3RlckxpdGVyYWxJbXBsIHB0Q2hhcmFjdGVyTGl0ZXJhbCA9IG5ldyBQVENoYXJhY3RlckxpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdENoYXJhY3RlckxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkgewotCQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwgcHRDbGFzc0luc3RhbmNlQ3JlYXRpb24gPSBuZXcgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsKCk7Ci0JCXJldHVybiBwdENsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRDb25kaXRpb25hbEV4cHJlc3Npb24gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7Ci0JCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCBwdENvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IG5ldyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEZpZWxkQWNjZXNzIGNyZWF0ZVBURmllbGRBY2Nlc3MoKSB7Ci0JCVBURmllbGRBY2Nlc3NJbXBsIHB0RmllbGRBY2Nlc3MgPSBuZXcgUFRGaWVsZEFjY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIHB0RmllbGRBY2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUSW5maXhFeHByZXNzaW9uIGNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKCkgewotCQlQVEluZml4RXhwcmVzc2lvbkltcGwgcHRJbmZpeEV4cHJlc3Npb24gPSBuZXcgUFRJbmZpeEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdEluZml4RXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRJbnN0YW5jZW9mIGNyZWF0ZVBUSW5zdGFuY2VvZigpIHsKLQkJUFRJbnN0YW5jZW9mSW1wbCBwdEluc3RhbmNlb2YgPSBuZXcgUFRJbnN0YW5jZW9mSW1wbCgpOwotCQlyZXR1cm4gcHRJbnN0YW5jZW9mOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVE1ldGhvZEludm9jYXRpb24gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCkgewotCQlQVE1ldGhvZEludm9jYXRpb25JbXBsIHB0TWV0aG9kSW52b2NhdGlvbiA9IG5ldyBQVE1ldGhvZEludm9jYXRpb25JbXBsKCk7Ci0JCXJldHVybiBwdE1ldGhvZEludm9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUTmFtZSBjcmVhdGVQVE5hbWUoKSB7Ci0JCVBUTmFtZUltcGwgcHROYW1lID0gbmV3IFBUTmFtZUltcGwoKTsKLQkJcmV0dXJuIHB0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFROdWxsTGl0ZXJhbCBjcmVhdGVQVE51bGxMaXRlcmFsKCkgewotCQlQVE51bGxMaXRlcmFsSW1wbCBwdE51bGxMaXRlcmFsID0gbmV3IFBUTnVsbExpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdE51bGxMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVE51bWJlckxpdGVyYWwgY3JlYXRlUFROdW1iZXJMaXRlcmFsKCkgewotCQlQVE51bWJlckxpdGVyYWxJbXBsIHB0TnVtYmVyTGl0ZXJhbCA9IG5ldyBQVE51bWJlckxpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdE51bWJlckxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHsKLQkJUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwgcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IG5ldyBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRQcmVmaXhFeHByZXNzaW9uIGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpIHsKLQkJUFRQcmVmaXhFeHByZXNzaW9uSW1wbCBwdFByZWZpeEV4cHJlc3Npb24gPSBuZXcgUFRQcmVmaXhFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRQcmVmaXhFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCkgewotCQlQVFN0cmluZ0xpdGVyYWxJbXBsIHB0U3RyaW5nTGl0ZXJhbCA9IG5ldyBQVFN0cmluZ0xpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdFN0cmluZ0xpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUVGhpc0xpdGVyYWwgY3JlYXRlUFRUaGlzTGl0ZXJhbCgpIHsKLQkJUFRUaGlzTGl0ZXJhbEltcGwgcHRUaGlzTGl0ZXJhbCA9IG5ldyBQVFRoaXNMaXRlcmFsSW1wbCgpOwotCQlyZXR1cm4gcHRUaGlzTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRUeXBlTGl0ZXJhbCBjcmVhdGVQVFR5cGVMaXRlcmFsKCkgewotCQlQVFR5cGVMaXRlcmFsSW1wbCBwdFR5cGVMaXRlcmFsID0gbmV3IFBUVHlwZUxpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdFR5cGVMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEludmFsaWRFeHByZXNzaW9uIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oKSB7Ci0JCVBUSW52YWxpZEV4cHJlc3Npb25JbXBsIHB0SW52YWxpZEV4cHJlc3Npb24gPSBuZXcgUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0SW52YWxpZEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUSW5zdGFuY2VSZWZlcmVuY2UgY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZSgpIHsKLQkJUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwgcHRJbnN0YW5jZVJlZmVyZW5jZSA9IG5ldyBQVEluc3RhbmNlUmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gcHRJbnN0YW5jZVJlZmVyZW5jZTsKLQl9Ci0KLQlwdWJsaWMgUFRJbnN0YW5jZVJlZmVyZW5jZSBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKElKYXZhSW5zdGFuY2UgaW5zdGFuY2UpIHsKLQkJUFRJbnN0YW5jZVJlZmVyZW5jZSBwdEluc3RhbmNlUmVmZXJlbmNlID0gY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCQlwdEluc3RhbmNlUmVmZXJlbmNlLnNldFJlZmVyZW5jZShpbnN0YW5jZSk7Ci0JCXJldHVybiBwdEluc3RhbmNlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnN0YW50aWF0aW9uUGFja2FnZSBnZXRJbnN0YW50aWF0aW9uUGFja2FnZSgpIHsKLQkJcmV0dXJuIChJbnN0YW50aWF0aW9uUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnN0YW50aWF0aW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSW1wbGljaXRBbGxvY2F0aW9uIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbihFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIHNmKSB7Ci0JCUltcGxpY2l0QWxsb2NhdGlvbiBhbGxvYyA9IGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbigpOwotCQlhbGxvYy5zZXRQYXJlbnQocGFyZW50KTsKLQkJYWxsb2Muc2V0RmVhdHVyZShzZik7Ci0JCXJldHVybiBhbGxvYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbml0U3RyaW5nQWxsb2NhdGlvbiBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbihTdHJpbmcgaW5pdFN0cmluZykgewotCQlJbml0U3RyaW5nQWxsb2NhdGlvbiBhbGxvYyA9IGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCk7Ci0JCWFsbG9jLnNldEluaXRTdHJpbmcoaW5pdFN0cmluZyk7Ci0JCXJldHVybiBhbGxvYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUGFyc2VUcmVlQWxsb2NhdGlvbiBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBhcnNlVHJlZUFsbG9jYXRpb24gYSA9IGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQkJYS5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEFycmF5QWNjZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcyhQVEV4cHJlc3Npb24gYXJyYXksIExpc3QgaW5kZXhlcykgewotCQlQVEFycmF5QWNjZXNzIGEgPSBjcmVhdGVQVEFycmF5QWNjZXNzKCk7Ci0JCWEuc2V0QXJyYXkoYXJyYXkpOwotCQlhLmdldEluZGV4ZXMoKS5hZGRBbGwoaW5kZXhlcyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQXJyYXlDcmVhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyKQotCSAqLwotCXB1YmxpYyBQVEFycmF5Q3JlYXRpb24gY3JlYXRlUFRBcnJheUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGRpbWVuc2lvbnMsIFBUQXJyYXlJbml0aWFsaXplciBpbml0aWFsaXplcikgewotCQlQVEFycmF5Q3JlYXRpb24gYSA9IGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCQlhLnNldFR5cGUodHlwZSk7Ci0JCWlmIChkaW1lbnNpb25zICE9IG51bGwpCi0JCQlhLmdldERpbWVuc2lvbnMoKS5hZGRBbGwoZGltZW5zaW9ucyk7Ci0JCWEuc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQXJyYXlJbml0aWFsaXplciBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoTGlzdCBleHByZXNzaW9ucykgewotCQlQVEFycmF5SW5pdGlhbGl6ZXIgYSA9IGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQlpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkKLQkJCWEuZ2V0RXhwcmVzc2lvbnMoKS5hZGRBbGwoZXhwcmVzc2lvbnMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKGJvb2xlYW4pCi0JICovCi0JcHVibGljIFBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbChib29sZWFuIGJvb2xlYW5WYWx1ZSkgewotCQlQVEJvb2xlYW5MaXRlcmFsIGEgPSBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JCWEuc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW5WYWx1ZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVENhc3RFeHByZXNzaW9uIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oU3RyaW5nIHR5cGUsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUQ2FzdEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlhLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVENoYXJhY3RlckxpdGVyYWwgY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKFN0cmluZyBlc2NhcGVkVmFsdWUpIHsKLQkJUFRDaGFyYWN0ZXJMaXRlcmFsIGEgPSBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJYS5zZXRFc2NhcGVkVmFsdWUoZXNjYXBlZFZhbHVlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGFyZ3VtZW50cykgewotCQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBhID0gY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlpZiAoYXJndW1lbnRzICE9IG51bGwpCi0JCQlhLmdldEFyZ3VtZW50cygpLmFkZEFsbChhcmd1bWVudHMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigKLQkJUFRFeHByZXNzaW9uIGNvbmRpdGlvbiwKLQkJUFRFeHByZXNzaW9uIHRydWVFeHByZXNzb2luLAotCQlQVEV4cHJlc3Npb24gZmFsc2VFeHByZXNzaW9uKSB7Ci0JCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGEgPSBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCQlhLnNldENvbmRpdGlvbihjb25kaXRpb24pOwotCQlhLnNldFRydWUodHJ1ZUV4cHJlc3NvaW4pOwotCQlhLnNldEZhbHNlKGZhbHNlRXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBURmllbGRBY2Nlc3Mob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEZpZWxkQWNjZXNzIGNyZWF0ZVBURmllbGRBY2Nlc3MoUFRFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgZmllbGQpIHsKLQkJUFRGaWVsZEFjY2VzcyBhID0gY3JlYXRlUFRGaWVsZEFjY2VzcygpOwotCQlhLnNldFJlY2VpdmVyKHJlY2VpdmVyKTsKLQkJYS5zZXRGaWVsZChmaWVsZCk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUSW5maXhFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVEluZml4RXhwcmVzc2lvbiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbigKLQkJUFRFeHByZXNzaW9uIGxlZnRPcGVyYW5kLAotCQlQVEluZml4T3BlcmF0b3Igb3BlcmF0b3IsCi0JCVBURXhwcmVzc2lvbiByaWdodE9wZXJhbmQsCi0JCUxpc3QgZXh0ZW5kZWRPcGVyYW5kcykgewotCQlQVEluZml4RXhwcmVzc2lvbiBhID0gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQkJYS5zZXRMZWZ0T3BlcmFuZChsZWZ0T3BlcmFuZCk7Ci0JCWEuc2V0T3BlcmF0b3Iob3BlcmF0b3IpOwotCQlhLnNldFJpZ2h0T3BlcmFuZChyaWdodE9wZXJhbmQpOwotCQlpZiAoZXh0ZW5kZWRPcGVyYW5kcyAhPSBudWxsKQotCQkJYS5nZXRFeHRlbmRlZE9wZXJhbmRzKCkuYWRkQWxsKGV4dGVuZGVkT3BlcmFuZHMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEluc3RhbmNlb2Yob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEluc3RhbmNlb2YgY3JlYXRlUFRJbnN0YW5jZW9mKFBURXhwcmVzc2lvbiBvcGVyYW5kLCBTdHJpbmcgdHlwZSkgewotCQlQVEluc3RhbmNlb2YgYSA9IGNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCQlhLnNldE9wZXJhbmQob3BlcmFuZCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVEludmFsaWRFeHByZXNzaW9uIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJUFRJbnZhbGlkRXhwcmVzc2lvbiBhID0gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQlhLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVE1ldGhvZEludm9jYXRpb24gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKFBURXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIG5hbWUsIExpc3QgYXJndW1lbnRzKSB7Ci0JCVBUTWV0aG9kSW52b2NhdGlvbiBhID0gY3JlYXRlUFRNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCWEuc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotCQlhLnNldE5hbWUobmFtZSk7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKLQkJCWEuZ2V0QXJndW1lbnRzKCkuYWRkQWxsKGFyZ3VtZW50cyk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVE5hbWUgY3JlYXRlUFROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVBUTmFtZSBhID0gY3JlYXRlUFROYW1lKCk7Ci0JCWEuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFROdW1iZXJMaXRlcmFsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUTnVtYmVyTGl0ZXJhbCBjcmVhdGVQVE51bWJlckxpdGVyYWwoU3RyaW5nIHRva2VuKSB7Ci0JCVBUTnVtYmVyTGl0ZXJhbCBhID0gY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0JCWEuc2V0VG9rZW4odG9rZW4pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJYS5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvciwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBQVFByZWZpeEV4cHJlc3Npb24gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKFBUUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCVBUUHJlZml4RXhwcmVzc2lvbiBhID0gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCWEuc2V0T3BlcmF0b3Iob3BlcmF0b3IpOwotCQlhLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUU3RyaW5nTGl0ZXJhbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKFN0cmluZyBlc2NhcGVMaXRlcmFsKSB7Ci0JCVBUU3RyaW5nTGl0ZXJhbCBhID0gY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0JCWEuc2V0RXNjYXBlZFZhbHVlKGVzY2FwZUxpdGVyYWwpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFR5cGVMaXRlcmFsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFBUVHlwZUxpdGVyYWwgY3JlYXRlUFRUeXBlTGl0ZXJhbChTdHJpbmcgdHlwZSkgewotCQlQVFR5cGVMaXRlcmFsIGEgPSBjcmVhdGVQVFR5cGVMaXRlcmFsKCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi19IC8vSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGViZTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXJfSW52YWxpZEV4cHJlc3Npb247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzczN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzEwLzAzIDE5OjIwOjQxICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2Y7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdWxsTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSW5zdGFudGlhdGlvblBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcHRJbmZpeE9wZXJhdG9yRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBwdFByZWZpeE9wZXJhdG9yRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaUphdmFJbnN0YW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnN0YW50aWF0aW9uUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSW5zdGFudGlhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSW5zdGFudGlhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlJbnN0YW50aWF0aW9uUGFja2FnZUltcGwgdGhlSW5zdGFudGlhdGlvblBhY2thZ2UgPSAoSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUluc3RhbnRpYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSW5zdGFudGlhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSW5zdGFudGlhdGlvblBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUluc3RhbnRpYXRpb25QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFPYmplY3RJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGlKYXZhT2JqZWN0SW5zdGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhQWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGphdmFBbGxvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0U3RyaW5nQWxsb2NhdGlvbl9Jbml0U3RyaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEltcGxpY2l0QWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGltcGxpY2l0QWxsb2NhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBsaWNpdEFsbG9jYXRpb25fUGFyZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW1wbGljaXRBbGxvY2F0aW9uX0ZlYXR1cmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhcnNlVHJlZUFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnNlVHJlZUFsbG9jYXRpb25fRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBURXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0RXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQXJyYXlBY2Nlc3MoKSB7Ci0JCXJldHVybiBwdEFycmF5QWNjZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQXJyYXlBY2Nlc3NfQXJyYXkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5QWNjZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRBcnJheUFjY2Vzc19JbmRleGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRBcnJheUFjY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRBcnJheUNyZWF0aW9uKCkgewotCQlyZXR1cm4gcHRBcnJheUNyZWF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQXJyYXlDcmVhdGlvbl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRBcnJheUNyZWF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRBcnJheUNyZWF0aW9uX0RpbWVuc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5Q3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5Q3JlYXRpb25fSW5pdGlhbGl6ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5Q3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQXJyYXlJbml0aWFsaXplcigpIHsKLQkJcmV0dXJuIHB0QXJyYXlJbml0aWFsaXplckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5SW5pdGlhbGl6ZXJfRXhwcmVzc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQm9vbGVhbkxpdGVyYWwoKSB7Ci0JCXJldHVybiBwdEJvb2xlYW5MaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQm9vbGVhbkxpdGVyYWxfQm9vbGVhblZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRCb29sZWFuTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRDYXN0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0Q2FzdEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRDYXN0RXhwcmVzc2lvbl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRDYXN0RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ2FzdEV4cHJlc3Npb25fRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVENoYXJhY3RlckxpdGVyYWxfRXNjYXBlZFZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0NoYXJWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKSB7Ci0JCXJldHVybiBwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9Db25kaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX1RydWUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0ZhbHNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBURmllbGRBY2Nlc3MoKSB7Ci0JCXJldHVybiBwdEZpZWxkQWNjZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBURmllbGRBY2Nlc3NfUmVjZWl2ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEZpZWxkQWNjZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRGaWVsZEFjY2Vzc19GaWVsZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0RmllbGRBY2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUSW5maXhFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fTGVmdE9wZXJhbmQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUSW5maXhFeHByZXNzaW9uX09wZXJhdG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEluZml4RXhwcmVzc2lvbl9SaWdodE9wZXJhbmQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX0V4dGVuZGVkT3BlcmFuZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRJbnN0YW5jZW9mKCkgewotCQlyZXR1cm4gcHRJbnN0YW5jZW9mRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5zdGFuY2VvZl9PcGVyYW5kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRJbnN0YW5jZW9mRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRJbnN0YW5jZW9mX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEluc3RhbmNlb2ZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUTWV0aG9kSW52b2NhdGlvbigpIHsKLQkJcmV0dXJuIHB0TWV0aG9kSW52b2NhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVE1ldGhvZEludm9jYXRpb25fUmVjZWl2ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVE1ldGhvZEludm9jYXRpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUTmFtZSgpIHsKLQkJcmV0dXJuIHB0TmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVE5hbWVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFROdWxsTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0TnVsbExpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVE51bWJlckxpdGVyYWwoKSB7Ci0JCXJldHVybiBwdE51bWJlckxpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFROdW1iZXJMaXRlcmFsX1Rva2VuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHROdW1iZXJMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0V4cHJlc3Npb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFByZWZpeEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRQcmVmaXhFeHByZXNzaW9uX09wZXJhdG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRQcmVmaXhFeHByZXNzaW9uX0V4cHJlc3Npb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUU3RyaW5nTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0U3RyaW5nTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVFN0cmluZ0xpdGVyYWxfRXNjYXBlZFZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRTdHJpbmdMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRTdHJpbmdMaXRlcmFsX0xpdGVyYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0U3RyaW5nTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRUaGlzTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0VGhpc0xpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFR5cGVMaXRlcmFsKCkgewotCQlyZXR1cm4gcHRUeXBlTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVFR5cGVMaXRlcmFsX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdFR5cGVMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEludmFsaWRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEludmFsaWRFeHByZXNzaW9uX01lc3NhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEluc3RhbmNlUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEluc3RhbmNlUmVmZXJlbmNlX1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UFRJbmZpeE9wZXJhdG9yKCkgewotCQlyZXR1cm4gcHRJbmZpeE9wZXJhdG9yRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFBUUHJlZml4T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBwdFByZWZpeE9wZXJhdG9yRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSmF2YURhdGFUeXBlSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpSmF2YURhdGFUeXBlSW5zdGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSmF2YUluc3RhbmNlKCkgewotCQlyZXR1cm4gaUphdmFJbnN0YW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5zdGFudGlhdGlvbkZhY3RvcnkgZ2V0SW5zdGFudGlhdGlvbkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSW5zdGFudGlhdGlvbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJaUphdmFEYXRhVHlwZUluc3RhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX0RBVEFfVFlQRV9JTlNUQU5DRSk7Ci0KLQkJaUphdmFJbnN0YW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9JTlNUQU5DRSk7Ci0KLQkJaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9PQkpFQ1RfSU5TVEFOQ0UpOwotCi0JCWphdmFBbGxvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfQUxMT0NBVElPTik7Ci0KLQkJaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5JVF9TVFJJTkdfQUxMT0NBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MsIElOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HKTsKLQotCQlpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1QTElDSVRfQUxMT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLCBJTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcywgSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRSk7Ci0KLQkJcGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQVJTRV9UUkVFX0FMTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MsIFBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTik7Ci0KLQkJcHRFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0VYUFJFU1NJT04pOwotCi0JCXB0QXJyYXlBY2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQVJSQVlfQUNDRVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEFycmF5QWNjZXNzRUNsYXNzLCBQVF9BUlJBWV9BQ0NFU1NfX0FSUkFZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEFycmF5QWNjZXNzRUNsYXNzLCBQVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVMpOwotCi0JCXB0QXJyYXlDcmVhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9BUlJBWV9DUkVBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVF9BUlJBWV9DUkVBVElPTl9fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIpOwotCi0JCXB0QXJyYXlJbml0aWFsaXplckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9BUlJBWV9JTklUSUFMSVpFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRBcnJheUluaXRpYWxpemVyRUNsYXNzLCBQVF9BUlJBWV9JTklUSUFMSVpFUl9fRVhQUkVTU0lPTlMpOwotCi0JCXB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQk9PTEVBTl9MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLCBQVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUUpOwotCi0JCXB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQ0FTVF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdENhc3RFeHByZXNzaW9uRUNsYXNzLCBQVF9DQVNUX0VYUFJFU1NJT05fX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MsIFBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTik7Ci0KLQkJcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0NIQVJBQ1RFUl9MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MsIFBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MsIFBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFKTsKLQotCQlwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MsIFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcywgUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUyk7Ci0KLQkJcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MsIFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MsIFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSk7Ci0KLQkJcHRGaWVsZEFjY2Vzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9GSUVMRF9BQ0NFU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0RmllbGRBY2Nlc3NFQ2xhc3MsIFBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0RmllbGRBY2Nlc3NFQ2xhc3MsIFBUX0ZJRUxEX0FDQ0VTU19fRklFTEQpOwotCi0JCXB0SW5maXhFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0lORklYX0VYUFJFU1NJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUyk7Ci0KLQkJcHRJbnN0YW5jZW9mRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0lOU1RBTkNFT0YpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0SW5zdGFuY2VvZkVDbGFzcywgUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRJbnN0YW5jZW9mRUNsYXNzLCBQVF9JTlNUQU5DRU9GX19UWVBFKTsKLQotCQlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfTUVUSE9EX0lOVk9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcywgUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFMpOwotCi0JCXB0TmFtZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdE5hbWVFQ2xhc3MsIFBUX05BTUVfX05BTUUpOwotCi0JCXB0TnVsbExpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfTlVMTF9MSVRFUkFMKTsKLQotCQlwdE51bWJlckxpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfTlVNQkVSX0xJVEVSQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0TnVtYmVyTGl0ZXJhbEVDbGFzcywgUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOKTsKLQotCQlwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcywgUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OKTsKLQotCQlwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfUFJFRklYX0VYUFJFU1NJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OKTsKLQotCQlwdFN0cmluZ0xpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfU1RSSU5HX0xJVEVSQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0U3RyaW5nTGl0ZXJhbEVDbGFzcywgUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0U3RyaW5nTGl0ZXJhbEVDbGFzcywgUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUUpOwotCi0JCXB0VGhpc0xpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfVEhJU19MSVRFUkFMKTsKLQotCQlwdFR5cGVMaXRlcmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX1RZUEVfTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRUeXBlTGl0ZXJhbEVDbGFzcywgUFRfVFlQRV9MSVRFUkFMX19UWVBFKTsKLQotCQlwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0lOVkFMSURfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcywgUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFKTsKLQotCQlwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0lOU1RBTkNFX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcywgUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0UpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlwdEluZml4T3BlcmF0b3JFRW51bSA9IGNyZWF0ZUVFbnVtKFBUX0lORklYX09QRVJBVE9SKTsKLQkJcHRQcmVmaXhPcGVyYXRvckVFbnVtID0gY3JlYXRlRUVudW0oUFRfUFJFRklYX09QRVJBVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlSW1wbCB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlpSmF2YURhdGFUeXBlSW5zdGFuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YUluc3RhbmNlKCkpOwotCQlpSmF2YU9iamVjdEluc3RhbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFJbnN0YW5jZSgpKTsKLQkJaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhQWxsb2NhdGlvbigpKTsKLQkJaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUFsbG9jYXRpb24oKSk7Ci0JCXBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhQWxsb2NhdGlvbigpKTsKLQkJcHRBcnJheUFjY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRBcnJheUNyZWF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEZpZWxkQWNjZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRJbnN0YW5jZW9mRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0TmFtZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHROdWxsTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHROdW1iZXJMaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0U3RyaW5nTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRUaGlzTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRUeXBlTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGlKYXZhRGF0YVR5cGVJbnN0YW5jZUVDbGFzcywgSUphdmFEYXRhVHlwZUluc3RhbmNlLmNsYXNzLCAiSUphdmFEYXRhVHlwZUluc3RhbmNlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpSmF2YUluc3RhbmNlRUNsYXNzLCBJSmF2YUluc3RhbmNlLmNsYXNzLCAiSUphdmFJbnN0YW5jZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoaUphdmFPYmplY3RJbnN0YW5jZUVDbGFzcywgSUphdmFPYmplY3RJbnN0YW5jZS5jbGFzcywgIklKYXZhT2JqZWN0SW5zdGFuY2UiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGphdmFBbGxvY2F0aW9uRUNsYXNzLCBKYXZhQWxsb2NhdGlvbi5jbGFzcywgIkphdmFBbGxvY2F0aW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcywgSW5pdFN0cmluZ0FsbG9jYXRpb24uY2xhc3MsICJJbml0U3RyaW5nQWxsb2NhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb25fSW5pdFN0cmluZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5pdFN0cmluZyIsIG51bGwsIDAsIDEsIEluaXRTdHJpbmdBbGxvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLCBJbXBsaWNpdEFsbG9jYXRpb24uY2xhc3MsICJJbXBsaWNpdEFsbG9jYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEltcGxpY2l0QWxsb2NhdGlvbl9QYXJlbnQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgbnVsbCwgInBhcmVudCIsIG51bGwsIDEsIDEsIEltcGxpY2l0QWxsb2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW1wbGljaXRBbGxvY2F0aW9uX0ZlYXR1cmUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBudWxsLCAiZmVhdHVyZSIsIG51bGwsIDEsIDEsIEltcGxpY2l0QWxsb2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MsIFBhcnNlVHJlZUFsbG9jYXRpb24uY2xhc3MsICJQYXJzZVRyZWVBbGxvY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQYXJzZVRyZWVBbGxvY2F0aW9uX0V4cHJlc3Npb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImV4cHJlc3Npb24iLCBudWxsLCAxLCAxLCBQYXJzZVRyZWVBbGxvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRFeHByZXNzaW9uRUNsYXNzLCBQVEV4cHJlc3Npb24uY2xhc3MsICJQVEV4cHJlc3Npb24iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0QXJyYXlBY2Nlc3NFQ2xhc3MsIFBUQXJyYXlBY2Nlc3MuY2xhc3MsICJQVEFycmF5QWNjZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5QWNjZXNzX0FycmF5KCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJhcnJheSIsIG51bGwsIDAsIDEsIFBUQXJyYXlBY2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlBY2Nlc3NfSW5kZXhlcygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiaW5kZXhlcyIsIG51bGwsIDEsIC0xLCBQVEFycmF5QWNjZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRBcnJheUNyZWF0aW9uRUNsYXNzLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICJQVEFycmF5Q3JlYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQXJyYXlDcmVhdGlvbl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUFRBcnJheUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5Q3JlYXRpb25fRGltZW5zaW9ucygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZGltZW5zaW9ucyIsIG51bGwsIDAsIC0xLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlDcmVhdGlvbl9Jbml0aWFsaXplcigpLCB0aGlzLmdldFBUQXJyYXlJbml0aWFsaXplcigpLCBudWxsLCAiaW5pdGlhbGl6ZXIiLCBudWxsLCAwLCAxLCBQVEFycmF5Q3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MsIFBUQXJyYXlJbml0aWFsaXplci5jbGFzcywgIlBUQXJyYXlJbml0aWFsaXplciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRBcnJheUluaXRpYWxpemVyX0V4cHJlc3Npb25zKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9ucyIsIG51bGwsIDAsIC0xLCBQVEFycmF5SW5pdGlhbGl6ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEJvb2xlYW5MaXRlcmFsRUNsYXNzLCBQVEJvb2xlYW5MaXRlcmFsLmNsYXNzLCAiUFRCb29sZWFuTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRCb29sZWFuTGl0ZXJhbF9Cb29sZWFuVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJib29sZWFuVmFsdWUiLCBudWxsLCAwLCAxLCBQVEJvb2xlYW5MaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRDYXN0RXhwcmVzc2lvbkVDbGFzcywgUFRDYXN0RXhwcmVzc2lvbi5jbGFzcywgIlBUQ2FzdEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQ2FzdEV4cHJlc3Npb25fVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUQ2FzdEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ2FzdEV4cHJlc3Npb25fRXhwcmVzc2lvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbiIsIG51bGwsIDAsIDEsIFBUQ2FzdEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MsIFBUQ2hhcmFjdGVyTGl0ZXJhbC5jbGFzcywgIlBUQ2hhcmFjdGVyTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXNjYXBlZFZhbHVlIiwgbnVsbCwgMCwgMSwgUFRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVENoYXJhY3RlckxpdGVyYWxfQ2hhclZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFQ2hhcigpLCAiY2hhclZhbHVlIiwgbnVsbCwgMCwgMSwgUFRDaGFyYWN0ZXJMaXRlcmFsLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcywgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uY2xhc3MsICJQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImFyZ3VtZW50cyIsIG51bGwsIDAsIC0xLCBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzLCBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5jbGFzcywgIlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9Db25kaXRpb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9UcnVlKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJ0cnVlIiwgbnVsbCwgMCwgMSwgUFRDb25kaXRpb25hbEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0ZhbHNlKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJmYWxzZSIsIG51bGwsIDAsIDEsIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRGaWVsZEFjY2Vzc0VDbGFzcywgUFRGaWVsZEFjY2Vzcy5jbGFzcywgIlBURmllbGRBY2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBURmllbGRBY2Nlc3NfUmVjZWl2ZXIoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgInJlY2VpdmVyIiwgbnVsbCwgMCwgMSwgUFRGaWVsZEFjY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRGaWVsZEFjY2Vzc19GaWVsZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGQiLCBudWxsLCAwLCAxLCBQVEZpZWxkQWNjZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAiUFRJbmZpeEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUSW5maXhFeHByZXNzaW9uX0xlZnRPcGVyYW5kKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJsZWZ0T3BlcmFuZCIsIG51bGwsIDAsIDEsIFBUSW5maXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEluZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpLCB0aGlzLmdldFBUSW5maXhPcGVyYXRvcigpLCAib3BlcmF0b3IiLCBudWxsLCAwLCAxLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbmZpeEV4cHJlc3Npb25fUmlnaHRPcGVyYW5kKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJyaWdodE9wZXJhbmQiLCBudWxsLCAwLCAxLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbmZpeEV4cHJlc3Npb25fRXh0ZW5kZWRPcGVyYW5kcygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXh0ZW5kZWRPcGVyYW5kcyIsIG51bGwsIDAsIC0xLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0SW5zdGFuY2VvZkVDbGFzcywgUFRJbnN0YW5jZW9mLmNsYXNzLCAiUFRJbnN0YW5jZW9mIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEluc3RhbmNlb2ZfT3BlcmFuZCgpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAib3BlcmFuZCIsIG51bGwsIDAsIDEsIFBUSW5zdGFuY2VvZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRJbnN0YW5jZW9mX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVEluc3RhbmNlb2YuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MsIFBUTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIlBUTWV0aG9kSW52b2NhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRNZXRob2RJbnZvY2F0aW9uX1JlY2VpdmVyKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJyZWNlaXZlciIsIG51bGwsIDAsIDEsIFBUTWV0aG9kSW52b2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRNZXRob2RJbnZvY2F0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQVE1ldGhvZEludm9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImFyZ3VtZW50cyIsIG51bGwsIDAsIC0xLCBQVE1ldGhvZEludm9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE5hbWVFQ2xhc3MsIFBUTmFtZS5jbGFzcywgIlBUTmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFROYW1lX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQVE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdE51bGxMaXRlcmFsRUNsYXNzLCBQVE51bGxMaXRlcmFsLmNsYXNzLCAiUFROdWxsTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0TnVtYmVyTGl0ZXJhbEVDbGFzcywgUFROdW1iZXJMaXRlcmFsLmNsYXNzLCAiUFROdW1iZXJMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVE51bWJlckxpdGVyYWxfVG9rZW4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRva2VuIiwgbnVsbCwgMCwgMSwgUFROdW1iZXJMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcywgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5jbGFzcywgIlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25fRXhwcmVzc2lvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbiIsIG51bGwsIDAsIDEsIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUUHJlZml4RXhwcmVzc2lvbi5jbGFzcywgIlBUUHJlZml4RXhwcmVzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRQcmVmaXhFeHByZXNzaW9uX09wZXJhdG9yKCksIHRoaXMuZ2V0UFRQcmVmaXhPcGVyYXRvcigpLCAib3BlcmF0b3IiLCBudWxsLCAwLCAxLCBQVFByZWZpeEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUUHJlZml4RXhwcmVzc2lvbl9FeHByZXNzaW9uKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9uIiwgbnVsbCwgMCwgMSwgUFRQcmVmaXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRTdHJpbmdMaXRlcmFsRUNsYXNzLCBQVFN0cmluZ0xpdGVyYWwuY2xhc3MsICJQVFN0cmluZ0xpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUU3RyaW5nTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVzY2FwZWRWYWx1ZSIsIG51bGwsIDAsIDEsIFBUU3RyaW5nTGl0ZXJhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRTdHJpbmdMaXRlcmFsX0xpdGVyYWxWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGl0ZXJhbFZhbHVlIiwgbnVsbCwgMCwgMSwgUFRTdHJpbmdMaXRlcmFsLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdFRoaXNMaXRlcmFsRUNsYXNzLCBQVFRoaXNMaXRlcmFsLmNsYXNzLCAiUFRUaGlzTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHB0VHlwZUxpdGVyYWxFQ2xhc3MsIFBUVHlwZUxpdGVyYWwuY2xhc3MsICJQVFR5cGVMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVFR5cGVMaXRlcmFsX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVFR5cGVMaXRlcmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzcywgUFRJbnZhbGlkRXhwcmVzc2lvbi5jbGFzcywgIlBUSW52YWxpZEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUSW52YWxpZEV4cHJlc3Npb25fTWVzc2FnZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWVzc2FnZSIsIG51bGwsIDAsIDEsIFBUSW52YWxpZEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzLCBQVEluc3RhbmNlUmVmZXJlbmNlLmNsYXNzLCAiUFRJbnN0YW5jZVJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZV9SZWZlcmVuY2UoKSwgdGhpcy5nZXRJSmF2YUluc3RhbmNlKCksIG51bGwsICJyZWZlcmVuY2UiLCBudWxsLCAxLCAxLCBQVEluc3RhbmNlUmVmZXJlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLmNsYXNzLCAiUFRJbmZpeE9wZXJhdG9yIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlRJTUVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5ESVZJREVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlJFTUFJTkRFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuUExVU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuTUlOVVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFRlRfU0hJRlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFU1NfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkdSRUFURVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkxFU1NfRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5HUkVBVEVSX0VRVUFMU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5OT1RfRVFVQUxTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5YT1JfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkFORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuT1JfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX0FORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuQ09ORElUSU9OQUxfT1JfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5jbGFzcywgIlBUUHJlZml4T3BlcmF0b3IiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5QTFVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLk1JTlVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLkNPTVBMRU1FTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdFByZWZpeE9wZXJhdG9yRUVudW0sIFBUUHJlZml4T3BlcmF0b3IuTk9UX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9JbnN0YW50aWF0aW9uUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSmF2YUFsbG9jYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0phdmFBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhkNDYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSmF2YUFsbG9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhQWxsb2NhdGlvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8xMC8wMyAxOToyMDo0MSAkIAotICovCi0gCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFBbGxvY2F0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSmF2YUFsbG9jYXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQWxsb2NhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUFsbG9jYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19IC8vSmF2YUFsbG9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL05haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9OYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwNzAyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL05haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IE5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcjsKLSAKLS8qKgotICogVGhpcyBuYWl2ZWx5IGZsYXR0ZW5zIHRoZSBQYXJzZVRyZWUuIEl0IGp1c3Qgd29ya3Mgd2l0aCB3aGF0J3MgdGhlcmUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyIGV4dGVuZHMgUGFyc2VWaXNpdG9yIHsKLQkKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1ZmZlciBnZXRTdHJpbmdCdWZmZXIoKSB7Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHJlc3VsdCBvZiB0aGUgZmxhdHRlbmluZy4KLQkgKiBAcmV0dXJuIFRoZSBmbGF0dGVuZWQgc3RyaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlc2V0IHRoZSByZXN1bHQgc28gdGhhdCBmbGF0dGVuZXIgY2FuIGJlIHVzZWQgYWdhaW4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCWJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUFjY2VzcyBub2RlKSB7Ci0JCW5vZGUuZ2V0QXJyYXkoKS5hY2NlcHQodGhpcyk7Ci0JCWlmICghbm9kZS5nZXRJbmRleGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGluZGV4ZXMgPSBub2RlLmdldEluZGV4ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlcy5zaXplKCk7IGkrKykgewotCQkJCWJ1ZmZlci5hcHBlbmQoJ1snKTsKLQkJCQkoKFBURXhwcmVzc2lvbikgaW5kZXhlcy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJCQlidWZmZXIuYXBwZW5kKCddJyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCVN0cmluZyB0eXBlID0gaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldFR5cGUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIm5ldyAiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgb2IgPSB0eXBlLmluZGV4T2YoJ1snKTsKLQkJYnVmZmVyLmFwcGVuZCh0eXBlLnN1YnN0cmluZygwLCBvYikpOwotCQlpbnQgcmVhbGRpbXMgPSAwOwotCQl3aGlsZSAob2IgIT0gLTEpIHsKLQkJCXJlYWxkaW1zKys7Ci0JCQlvYiA9IHR5cGUuaW5kZXhPZignWycsb2IrMSk7Ci0JCX0KLQkJTGlzdCBkaW1zID0gbm9kZS5nZXREaW1lbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGltcy5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgnWycpOwotCQkJKChQVEV4cHJlc3Npb24pIGRpbXMuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCQlidWZmZXIuYXBwZW5kKCddJyk7Ci0JCX0KLQkJZm9yIChpbnQgaT1kaW1zLnNpemUoKTsgaSA8IHJlYWxkaW1zOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJaWYgKG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkoKFBURXhwcmVzc2lvbikgbm9kZS5nZXRJbml0aWFsaXplcigpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoJ3snKTsKLQkJTGlzdCBleHAgPSBub2RlLmdldEV4cHJlc3Npb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCSgoUFRFeHByZXNzaW9uKSBleHAuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnfScpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5pc0Jvb2xlYW5WYWx1ZSgpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIikgIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgibmV3ICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldFR5cGUoKSkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCUxpc3QgYXJncyA9IG5vZGUuZ2V0QXJndW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkoKFBURXhwcmVzc2lvbikgYXJncy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQlub2RlLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgiID8gIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5nZXRUcnVlKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLmdldEZhbHNlKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCW5vZGUuZ2V0UmVjZWl2ZXIoKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldEZpZWxkKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJbm9kZS5nZXRMZWZ0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlTdHJpbmcgb3BlciA9IG5vZGUuZ2V0T3BlcmF0b3IoKS5nZXRPcGVyYXRvcigpOwotCQlidWZmZXIuYXBwZW5kKG9wZXIpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCW5vZGUuZ2V0UmlnaHRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlMaXN0IGV4dCA9IG5vZGUuZ2V0RXh0ZW5kZWRPcGVyYW5kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dC5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZChvcGVyKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBleHQuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnN0YW5jZW9mIG5vZGUpIHsKLQkJbm9kZS5nZXRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCIgaW5zdGFuY2VvZiAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXRUeXBlKCkpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMuTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyX0ludmFsaWRFeHByZXNzaW9uLCBuZXcgT2JqZWN0W117bm9kZS5nZXRNZXNzYWdlKCl9KSk7IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlpZiAobm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwpIHsKLQkJCW5vZGUuZ2V0UmVjZWl2ZXIoKS5hY2NlcHQodGhpcyk7Ci0JCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJCi0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXROYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCUxpc3QgYXJncyA9IG5vZGUuZ2V0QXJndW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkoKFBURXhwcmVzc2lvbikgYXJncy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE5hbWUgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXROYW1lKCkpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVsbExpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldFRva2VuKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRPcGVyYXRvcigpLmdldE9wZXJhdG9yKCkpOwotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFRoaXNMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgidGhpcyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZW5hYmxlcyBvbmUgdG8gb3ZlcmlkZSB0aGUgaGFuZGxpbmcgb2YgcXVhbGlmaWVkIG5hbWVzLgotCSAqIFRoZSBkZWZhdWx0IG9wZXJhdGlvbiBpcyB0byBkbyBub3RoaW5nLgotCSAqIAotCSAqIE92ZXJyaWRlcnMgbWF5IGNob29zZSB0byB1c2Ugc2hvcnQgbmFtZXMsIHJlbHlpbmcgb24gaW1wb3J0IHN0YXRlbWVudCBoYW5kbGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcU5hbWUgIAotCSAqIEByZXR1cm4gTmFtZSB0byB1c2UgZm9yIHRoZSBmbGF0dGVuZWQgcmVzdWx0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoYW5kbGVRdWFsaWZpZWROYW1lKFN0cmluZyBxTmFtZSkgewotCQlyZXR1cm4gcU5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlBY2Nlc3NJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlBY2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmU1OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5QWNjZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUQXJyYXlBY2Nlc3NJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgQWNjZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlBY2Nlc3NJbXBsI2dldEFycmF5IDxlbT5BcnJheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5QWNjZXNzSW1wbCNnZXRJbmRleGVzIDxlbT5JbmRleGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRBcnJheUFjY2Vzc0ltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRBcnJheUFjY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJyYXkoKSA8ZW0+QXJyYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFycmF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGFycmF5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4ZXMoKSA8ZW0+SW5kZXhlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5kZXhlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBcnJheUFjY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRBcnJheUFjY2VzcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0QXJyYXkoKSB7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBcnJheShQVEV4cHJlc3Npb24gbmV3QXJyYXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEFycmF5ID0gYXJyYXk7Ci0JCWFycmF5ID0gbmV3QXJyYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVksIG9sZEFycmF5LCBuZXdBcnJheSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJyYXkoUFRFeHByZXNzaW9uIG5ld0FycmF5KSB7Ci0JCWlmIChuZXdBcnJheSAhPSBhcnJheSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXJyYXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXJyYXkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBcnJheSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBcnJheSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXJyYXkobmV3QXJyYXksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWSwgbmV3QXJyYXksIG5ld0FycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluZGV4ZXMoKSB7Ci0JCWlmIChpbmRleGVzID09IG51bGwpIHsKLQkJCWluZGV4ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVMpOwotCQl9Ci0JCXJldHVybiBpbmRleGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXJyYXkobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5kZXhlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVk6Ci0JCQkJcmV0dXJuIGdldEFycmF5KCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQlyZXR1cm4gZ2V0SW5kZXhlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQlzZXRBcnJheSgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQlnZXRJbmRleGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmRleGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZOgotCQkJCXNldEFycmF5KChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVM6Ci0JCQkJZ2V0SW5kZXhlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVk6Ci0JCQkJcmV0dXJuIGFycmF5ICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQlyZXR1cm4gaW5kZXhlcyAhPSBudWxsICYmICFpbmRleGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRBcnJheSgpKTsKLQkJCWlmIChpbmRleGVzICE9IG51bGwpCi0JCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgaW5kZXhlcyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vQXJyYXlBY2Nlc3NJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlDcmVhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUNyZWF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDAxMWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUNyZWF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUQXJyYXlDcmVhdGlvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBDcmVhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUNyZWF0aW9uSW1wbCNnZXREaW1lbnNpb25zIDxlbT5EaW1lbnNpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlDcmVhdGlvbkltcGwjZ2V0SW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRBcnJheUNyZWF0aW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEFycmF5Q3JlYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGltZW5zaW9ucygpIDxlbT5EaW1lbnNpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpbWVuc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaW1lbnNpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxpemVyKCkgPGVtPkluaXRpYWxpemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBUQXJyYXlJbml0aWFsaXplciBpbml0aWFsaXplciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBcnJheUNyZWF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEFycmF5Q3JlYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGltZW5zaW9ucygpIHsKLQkJaWYgKGRpbWVuc2lvbnMgPT0gbnVsbCkgewotCQkJZGltZW5zaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TKTsKLQkJfQotCQlyZXR1cm4gZGltZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUluaXRpYWxpemVyIGdldEluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5pdGlhbGl6ZXIoUFRBcnJheUluaXRpYWxpemVyIG5ld0luaXRpYWxpemVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBUQXJyYXlJbml0aWFsaXplciBvbGRJbml0aWFsaXplciA9IGluaXRpYWxpemVyOwotCQlpbml0aWFsaXplciA9IG5ld0luaXRpYWxpemVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIsIG9sZEluaXRpYWxpemVyLCBuZXdJbml0aWFsaXplcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoUFRBcnJheUluaXRpYWxpemVyIG5ld0luaXRpYWxpemVyKSB7Ci0JCWlmIChuZXdJbml0aWFsaXplciAhPSBpbml0aWFsaXplcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5pdGlhbGl6ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luaXRpYWxpemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luaXRpYWxpemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluaXRpYWxpemVyKG5ld0luaXRpYWxpemVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiwgbmV3SW5pdGlhbGl6ZXIsIG5ld0luaXRpYWxpemVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaW1lbnNpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0SW5pdGlhbGl6ZXIobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TOgotCQkJCXJldHVybiBnZXREaW1lbnNpb25zKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQlnZXREaW1lbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREaW1lbnNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQlzZXRJbml0aWFsaXplcigoUFRBcnJheUluaXRpYWxpemVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlM6Ci0JCQkJZ2V0RGltZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVI6Ci0JCQkJc2V0SW5pdGlhbGl6ZXIoKFBUQXJyYXlJbml0aWFsaXplciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlM6Ci0JCQkJcmV0dXJuIGRpbWVuc2lvbnMgIT0gbnVsbCAmJiAhZGltZW5zaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXIgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgZGltZW5zaW9ucyk7Ci0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRJbml0aWFsaXplcigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi19IC8vQXJyYXlDcmVhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUluaXRpYWxpemVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5SW5pdGlhbGl6ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzdhMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5SW5pdGlhbGl6ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRBcnJheUluaXRpYWxpemVySW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUluaXRpYWxpemVySW1wbCNnZXRFeHByZXNzaW9ucyA8ZW0+RXhwcmVzc2lvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEFycmF5SW5pdGlhbGl6ZXJJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQXJyYXlJbml0aWFsaXplciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbnMoKSA8ZW0+RXhwcmVzc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHByZXNzaW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBcnJheUluaXRpYWxpemVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEFycmF5SW5pdGlhbGl6ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXhwcmVzc2lvbnMoKSB7Ci0JCWlmIChleHByZXNzaW9ucyA9PSBudWxsKSB7Ci0JCQlleHByZXNzaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV4cHJlc3Npb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCWdldEV4cHJlc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHByZXNzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCWdldEV4cHJlc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCXJldHVybiBleHByZXNzaW9ucyAhPSBudWxsICYmICFleHByZXNzaW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgZXhwcmVzc2lvbnMpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL0FycmF5SW5pdGlhbGl6ZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQm9vbGVhbkxpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQm9vbGVhbkxpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllY2UxZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEJvb2xlYW5MaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUQm9vbGVhbkxpdGVyYWxJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjE6MDI6MTkgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Qm9vbGVhbiBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQm9vbGVhbkxpdGVyYWxJbXBsI2lzQm9vbGVhblZhbHVlIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRCb29sZWFuTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRCb29sZWFuTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQm9vbGVhblZhbHVlKCkgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQm9vbGVhblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQk9PTEVBTl9WQUxVRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNCb29sZWFuVmFsdWUoKSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNCb29sZWFuVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU5fVkFMVUVfRUZMQUcgPSAxIDw8IDg7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRCb29sZWFuTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRCb29sZWFuTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhblZhbHVlKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEJPT0xFQU5fVkFMVUVfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gbmV3Qm9vbGVhblZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkQm9vbGVhblZhbHVlID0gKGVGbGFncyAmIEJPT0xFQU5fVkFMVUVfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdCb29sZWFuVmFsdWUpIGVGbGFncyB8PSBCT09MRUFOX1ZBTFVFX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Qk9PTEVBTl9WQUxVRV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFLCBvbGRCb29sZWFuVmFsdWUsIG5ld0Jvb2xlYW5WYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFOgotCQkJCXJldHVybiBpc0Jvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRToKLQkJCQlzZXRCb29sZWFuVmFsdWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFOgotCQkJCXNldEJvb2xlYW5WYWx1ZShCT09MRUFOX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEJPT0xFQU5fVkFMVUVfRUZMQUcpICE9IDApICE9IEJPT0xFQU5fVkFMVUVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9Cb29sZWFuTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDYXN0RXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDYXN0RXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkYTk2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2FzdEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRDYXN0RXhwcmVzc2lvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2FzdEV4cHJlc3Npb25JbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDYXN0RXhwcmVzc2lvbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQ2FzdEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQ2FzdEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbigpIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQ2FzdEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQ2FzdEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJZXhwcmVzc2lvbiA9IG5ld0V4cHJlc3Npb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgb2xkRXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbikgewotCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBleHByZXNzaW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChleHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cHJlc3Npb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhwcmVzc2lvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHByZXNzaW9uKG5ld0V4cHJlc3Npb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBuZXdFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4cHJlc3Npb24obnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBleHByZXNzaW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vQ2FzdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENoYXJhY3RlckxpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTA0ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENoYXJhY3RlckxpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcmFjdGVyIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCNnZXRFc2NhcGVkVmFsdWUgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCNnZXRDaGFyVmFsdWUgPGVtPkNoYXIgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVENoYXJhY3RlckxpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQ2hhcmFjdGVyTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzY2FwZWRWYWx1ZSgpIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXNjYXBlZFZhbHVlKCkgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc2NhcGVkVmFsdWUgPSBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYXJWYWx1ZSgpIDxlbT5DaGFyIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFyVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBDSEFSX1ZBTFVFX0VERUZBVUxUID0gJ1x1MDAwMCc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFyVmFsdWUoKSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhclZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2hhciBjaGFyVmFsdWUgPSBDSEFSX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFc2NhcGVkVmFsdWUoKSB7Ci0JCXJldHVybiBlc2NhcGVkVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXNjYXBlZFZhbHVlKFN0cmluZyBuZXdFc2NhcGVkVmFsdWUpIHsKLQkJY2hhclZhbHVlU2V0ID0gZmFsc2U7Ci0JCXNldENoYXJWYWx1ZUdlbihDSEFSX1ZBTFVFX0VERUZBVUxUKTsKLQkJc2V0RXNjYXBlZFZhbHVlR2VuKG5ld0VzY2FwZWRWYWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZUdlbihTdHJpbmcgbmV3RXNjYXBlZFZhbHVlKSB7Ci0JCVN0cmluZyBvbGRFc2NhcGVkVmFsdWUgPSBlc2NhcGVkVmFsdWU7Ci0JCWVzY2FwZWRWYWx1ZSA9IG5ld0VzY2FwZWRWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUsIG9sZEVzY2FwZWRWYWx1ZSwgZXNjYXBlZFZhbHVlKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoYXJWYWx1ZVNldDsKLQkKLQlwdWJsaWMgY2hhciBnZXRDaGFyVmFsdWUoKSB7Ci0JCWlmICghY2hhclZhbHVlU2V0ICYmIGVzY2FwZWRWYWx1ZSAhPSBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUKSB7Ci0JCQlTdHJpbmcgcyA9IGdldEVzY2FwZWRWYWx1ZSgpOwotCQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCQlpZiAobGVuIDwgMiB8fCBzLmNoYXJBdCgwKSAhPSAnXCcnIHx8IHMuY2hhckF0KGxlbi0xKSAhPSAnXCcnICkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWNoYXIgYyA9IHMuY2hhckF0KDEpOwotCQkJaWYgKGMgPT0gJ1wnJykgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChjID09ICdcXCcpIHsKLQkJCQlpZiAobGVuID09IDQpIHsKLQkJCQkJc2V0Q2hhclZhbHVlR2VuKGdldENoYXJFc2NhcGVkKHMuY2hhckF0KDIpKSk7Ci0JCQkJfSBlbHNlIGlmIChsZW4gPT0gOCkgewotCQkJCQkvL2hhbmRsZSB0aGUgY2FzZSBvZiB1bmljb2RlLgotCQkJCQlpbnQgY3VycmVudFBvc2l0aW9uID0gMjsKLQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKLQkJCQkJaWYgKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSA9PSAndScpIHsKLQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKLQkJCQkJCQkJfHwgYzEgPCAwCi0JCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQotCQkJCQkJCQl8fCBjMiA8IDAKLQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1Ci0JCQkJCQkJCXx8IGMzIDwgMAotCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKLQkJCQkJCQkJfHwgYzQgPCAwKXsKLQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzZXRDaGFyVmFsdWVHZW4oKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXNldENoYXJWYWx1ZUdlbihjKTsKLQkJCQotCQkJY2hhclZhbHVlU2V0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hhclZhbHVlR2VuKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2hhciBnZXRDaGFyRXNjYXBlZChjaGFyIG5leHRDaGFyKSB7Ci0JCXN3aXRjaChuZXh0Q2hhcikgewotCQkJY2FzZSAnYicgOgotCQkJCXJldHVybiAnXGInOwotCQkJY2FzZSAndCcgOgotCQkJCXJldHVybiAnXHQnOwotCQkJY2FzZSAnbicgOgotCQkJCXJldHVybiAnXG4nOwotCQkJY2FzZSAnZicgOgotCQkJCXJldHVybiAnXGYnOwotCQkJY2FzZSAncicgOgotCQkJCXJldHVybiAnXHInOwotCQkJY2FzZSAnXCInOgotCQkJCXJldHVybiAnXCInOwotCQkJY2FzZSAnXCcnOgotCQkJCXJldHVybiAnXCcnOwotCQkJY2FzZSAnXFwnOgotCQkJCXJldHVybiAnXFwnOwotCQkJY2FzZSAnMCcgOgotCQkJCXJldHVybiAnXDAnOwotCQkJY2FzZSAnMScgOgotCQkJCXJldHVybiAnXDEnOwotCQkJY2FzZSAnMicgOgotCQkJCXJldHVybiAnXDInOwotCQkJY2FzZSAnMycgOgotCQkJCXJldHVybiAnXDMnOwotCQkJY2FzZSAnNCcgOgotCQkJCXJldHVybiAnXDQnOwotCQkJY2FzZSAnNScgOgotCQkJCXJldHVybiAnXDUnOwotCQkJY2FzZSAnNicgOgotCQkJCXJldHVybiAnXDYnOwotCQkJY2FzZSAnNycgOgotCQkJCXJldHVybiAnXDcnOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjaGFyIGdldENoYXJWYWx1ZUdlbigpIHsKLQkJcmV0dXJuIGNoYXJWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFyVmFsdWUoY2hhciBuZXdDaGFyVmFsdWUpIHsJCQotCQljaGFyVmFsdWVTZXQgPSB0cnVlOwotCQlzZXRDaGFyVmFsdWVHZW4obmV3Q2hhclZhbHVlKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcig4KTsKLQkJYi5hcHBlbmQoJ1wnJyk7IC8vIG9wZW5pbmcgZGVsaW1pdGVyCi0JCWFwcGVuZENoYXJhY3RlcihuZXdDaGFyVmFsdWUsIGIpOwotCQliLmFwcGVuZCgnXCcnKTsgLy8gY2xvc2luZyBkZWxpbWl0ZXIKLQkJc2V0RXNjYXBlZFZhbHVlR2VuKGIudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRDaGFyYWN0ZXIoY2hhciBjaGFyYWN0ZXIsIFN0cmluZ0J1ZmZlciBiKSB7Ci0JCXN3aXRjaChjaGFyYWN0ZXIpIHsKLQkJCWNhc2UgJ1xiJyA6Ci0JCQkJYi5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdCcgOgotCQkJCWIuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nIDoKLQkJCQliLmFwcGVuZCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xmJyA6Ci0JCQkJYi5hcHBlbmQoIlxcZiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdccicgOgotCQkJCWIuYXBwZW5kKCJcXHIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCInOgotCQkJCWIuYXBwZW5kKCJcXFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wnJzoKLQkJCQliLmFwcGVuZCgiXFxcJyIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcXCc6Ci0JCQkJYi5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDAnIDoKLQkJCQliLmFwcGVuZCgiXFwwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wxJyA6Ci0JCQkJYi5hcHBlbmQoIlxcMSIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcMicgOgotCQkJCWIuYXBwZW5kKCJcXDIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDMnIDoKLQkJCQliLmFwcGVuZCgiXFwzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1w0JyA6Ci0JCQkJYi5hcHBlbmQoIlxcNCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcNScgOgotCQkJCWIuYXBwZW5kKCJcXDUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDYnIDoKLQkJCQliLmFwcGVuZCgiXFw2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1w3JyA6Ci0JCQkJYi5hcHBlbmQoIlxcNyIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7CQkJCi0JCQlkZWZhdWx0OgotCQkJCS8vIHVzZSBhIHNpbXBsZSBhbGdvcml0aG0sIGlmIGNoYXIgaXMgPCAyNTUgdGhlbiBqdXN0IHVzZSBpdCwgZWxzZSB1c2UgaXQgYXMgdW5pY29kZS4KLQkJCQlpZiAoY2hhcmFjdGVyIDwgMjU1KQotCQkJCQliLmFwcGVuZChjaGFyYWN0ZXIpOwotCQkJCWVsc2UgewotCQkJCQliLmFwcGVuZCgiXFx1Iik7Ci0JCQkJCVN0cmluZyBzID0gSW50ZWdlci50b1N0cmluZyhjaGFyYWN0ZXIsIDE2KTsKLQkJCQkJaW50IHplcm9zID0gNC1zLmxlbmd0aCgpOwotCQkJCQl3aGlsZSAoemVyb3MtLSA+IDApIHsKLQkJCQkJCWIuYXBwZW5kKCcwJyk7Ci0JCQkJCX0KLQkJCQkJYi5hcHBlbmQocyk7Ci0JCQkJfQkKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYXJWYWx1ZUdlbihjaGFyIG5ld0NoYXJWYWx1ZSkgewotCQljaGFyIG9sZENoYXJWYWx1ZSA9IGNoYXJWYWx1ZTsKLQkJY2hhclZhbHVlID0gbmV3Q2hhclZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRSwgb2xkQ2hhclZhbHVlLCBjaGFyVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRFc2NhcGVkVmFsdWUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUU6Ci0JCQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoZ2V0Q2hhclZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJc2V0RXNjYXBlZFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUU6Ci0JCQkJc2V0Q2hhclZhbHVlKCgoQ2hhcmFjdGVyKW5ld1ZhbHVlKS5jaGFyVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJc2V0RXNjYXBlZFZhbHVlKEVTQ0FQRURfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUU6Ci0JCQkJc2V0Q2hhclZhbHVlKENIQVJfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlyZXR1cm4gRVNDQVBFRF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZXNjYXBlZFZhbHVlICE9IG51bGwgOiAhRVNDQVBFRF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZXNjYXBlZFZhbHVlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUU6Ci0JCQkJcmV0dXJuIGNoYXJWYWx1ZSAhPSBDSEFSX1ZBTFVFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL0NoYXJhY3RlckxpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYTE5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwjZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJndW1lbnRzKCkgPGVtPkFyZ3VtZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcmd1bWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhcmd1bWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBcmd1bWVudHMoKSB7Ci0JCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgewotCQkJYXJndW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGFyZ3VtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXJndW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QXJndW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlnZXRBcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCWdldEFyZ3VtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFM6Ci0JCQkJZ2V0QXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gYXJndW1lbnRzICE9IG51bGwgJiYgIWFyZ3VtZW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGFyZ3VtZW50cyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2FlNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwjZ2V0Q29uZGl0aW9uIDxlbT5Db25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsI2dldFRydWUgPGVtPlRydWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsI2dldEZhbHNlIDxlbT5GYWxzZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZGl0aW9uKCkgPGVtPkNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGNvbmRpdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcnVlKCkgPGVtPlRydWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRydWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gdHJ1ZV8gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmFsc2UoKSA8ZW0+RmFsc2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZhbHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGZhbHNlXyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRDb25kaXRpb24oKSB7Ci0JCXJldHVybiBjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29uZGl0aW9uKFBURXhwcmVzc2lvbiBuZXdDb25kaXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZENvbmRpdGlvbiA9IGNvbmRpdGlvbjsKLQkJY29uZGl0aW9uID0gbmV3Q29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04sIG9sZENvbmRpdGlvbiwgbmV3Q29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oUFRFeHByZXNzaW9uIG5ld0NvbmRpdGlvbikgewotCQlpZiAobmV3Q29uZGl0aW9uICE9IGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb25kaXRpb24obmV3Q29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTiwgbmV3Q29uZGl0aW9uLCBuZXdDb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldFRydWUoKSB7Ci0JCXJldHVybiB0cnVlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUcnVlKFBURXhwcmVzc2lvbiBuZXdUcnVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRUcnVlID0gdHJ1ZV87Ci0JCXRydWVfID0gbmV3VHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRSwgb2xkVHJ1ZSwgbmV3VHJ1ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJ1ZShQVEV4cHJlc3Npb24gbmV3VHJ1ZSkgewotCQlpZiAobmV3VHJ1ZSAhPSB0cnVlXykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodHJ1ZV8gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdHJ1ZV8pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUcnVlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RydWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRydWUobmV3VHJ1ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFLCBuZXdUcnVlLCBuZXdUcnVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRGYWxzZSgpIHsKLQkJcmV0dXJuIGZhbHNlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRGYWxzZShQVEV4cHJlc3Npb24gbmV3RmFsc2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEZhbHNlID0gZmFsc2VfOwotCQlmYWxzZV8gPSBuZXdGYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UsIG9sZEZhbHNlLCBuZXdGYWxzZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmFsc2UoUFRFeHByZXNzaW9uIG5ld0ZhbHNlKSB7Ci0JCWlmIChuZXdGYWxzZSAhPSBmYWxzZV8pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGZhbHNlXyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmYWxzZV8pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RmFsc2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RmFsc2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRGYWxzZShuZXdGYWxzZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRSwgbmV3RmFsc2UsIG5ld0ZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUU6Ci0JCQkJCXJldHVybiBiYXNpY1NldFRydWUobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RmFsc2UobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUU6Ci0JCQkJcmV0dXJuIGdldFRydWUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0U6Ci0JCQkJcmV0dXJuIGdldEZhbHNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJc2V0Q29uZGl0aW9uKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQlzZXRUcnVlKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0U6Ci0JCQkJc2V0RmFsc2UoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OOgotCQkJCXNldENvbmRpdGlvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQlzZXRUcnVlKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQlzZXRGYWxzZSgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJcmV0dXJuIGNvbmRpdGlvbiAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFOgotCQkJCXJldHVybiB0cnVlXyAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19GQUxTRToKLQkJCQlyZXR1cm4gZmFsc2VfICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0Q29uZGl0aW9uKCkpOwotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0VHJ1ZSgpKTsKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEZhbHNlKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQkKLQotfSAvL0NvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjRkNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRFeHByZXNzaW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBURXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBURXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uRXhwcmVzc2lvbiNhY2NlcHQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFjY2VwdChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl0cnkgewotCQkJY2hpbGRBY2NlcHQwKHZpc2l0b3IpOwotCQl9IGNhdGNoIChQYXJzZVZpc2l0b3IuU3RvcFZpc2l0aW5nIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcsIHRoaXMgaXMgYSBub3JtYWwgd2F5IHRvIGp1c3Qgc3RvcCB2aXNpdGluZy4KLQkJfQotCX0KLQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3Igb24gYSB0eXBlLXNwZWNpZmljIHZpc2l0IG9mIHRoZSBjdXJyZW50IG5vZGUuCi0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhbGwgY29uY3JldGUgRXhwcmVzc2lvbiBub2RlIHR5cGVzLgotCSAqIDxwPgotCSAqIEdlbmVyYWwgdGVtcGxhdGUgZm9yIGltcGxlbWVudGF0aW9uIG9uIGVhY2ggY29uY3JldGUgQVNUTm9kZSBjbGFzczoKLQkgKiA8cHJlPgotCSAqIDxjb2RlPgotCSAqIGJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JICogaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkgKiAgICAvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JICogICAgYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UHJvcGVydHkxKCkpOwotCSAqICAgIGFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHJhd0xpc3RQcm9wZXJ0eSk7Ci0JICogICAgYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UHJvcGVydHkyKCkpOwotCSAqIH0KLQkgKiB2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCSAqIDwvY29kZT4KLQkgKiA8L3ByZT4KLQkgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciAoPGNvZGU+YWNjZXB0PC9jb2RlPikgdGFrZSBjYXJlcyBvZiBpbnZva2luZwotCSAqIDxjb2RlPnZpc2l0b3IucHJlVmlzaXQodGhpcyk8L2NvZGU+IGFuZCA8Y29kZT52aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpOwotCi0JLyoqCi0JICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbiBhIHZpc2l0IG9mIHRoZSBjdXJyZW50IG5vZGUuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZgotCSAqIDxjb2RlPmFjY2VwdDA8L2NvZGU+IHRvIHRyYXZlcnNlIG9wdGlvbmFsIHByb3BlcnRpZXMuIEVxdWl2YWxlbnQKLQkgKiB0byA8Y29kZT5jaGlsZC5hY2NlcHQodmlzaXRvcik8L2NvZGU+IGlmIDxjb2RlPmNoaWxkPC9jb2RlPgotCSAqIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0Ci0JICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCBFeHByZXNzaW9uIG5vZGUgdG8gZGlzcGF0Y2ggdG9vLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIGlmIG5vbmUuIEl0IGFjdHVhbGx5IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgUFRFeHByZXNzaW9uSW1wbCwgYnV0IAotCSAqICAgIGl0IHdvdWxkIGJlIHRvbyBkaWZmaWN1bHQgdG8gcHV0IHRoZSBjYXN0IGluIGVhY2ggY2FsbCB0byBhY2NlcHRDaGlsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhY2NlcHRDaGlsZChQYXJzZVZpc2l0b3IgdmlzaXRvciwgUFRFeHByZXNzaW9uIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJKChQVEV4cHJlc3Npb25JbXBsKSBjaGlsZCkuY2hpbGRBY2NlcHQwKHZpc2l0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgT05MWSBieSBQVEV4cHJlc3Npb25JbXBsIGZvciB0aGUgY2hpbGQgdG8gYWNjZXB0IHRoZSB2aXNpdG9yLCBidXQKLQkgKiBpdCBkb2Vzbid0IGNhdGNoIFN0b3BWaXNpdGluZy4KLQkgKiBAcGFyYW0gdmlzaXRvcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hpbGRBY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWlmICh2aXNpdG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQkvLyBiZWdpbiB3aXRoIHRoZSBnZW5lcmljIHByZS12aXNpdAotCQl2aXNpdG9yLnByZVZpc2l0KHRoaXMpOwotCQkvLyBkeW5hbWljIGRpc3BhdGNoIHRvIGludGVybmFsIG1ldGhvZCBmb3IgdHlwZS1zcGVjaWZpYyB2aXNpdC9lbmRWaXNpdAotCQlhY2NlcHQwKHZpc2l0b3IpOwotCQkvLyBlbmQgd2l0aCB0aGUgZ2VuZXJpYyBwb3N0LXZpc2l0Ci0JCXZpc2l0b3IucG9zdFZpc2l0KHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdmlzaXQgb2YgdGhlIGdpdmVuIGxpdmUgbGlzdCBvZgotCSAqIGNoaWxkIG5vZGVzLiAKLQkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKLQkgKiBAcGFyYW0gY2hpbGRyZW4gdGhlIGNoaWxkIEV4cHJlc3Npb24gbm9kZXMgdG8gZGlzcGF0Y2ggdG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWNjZXB0Q2hpbGRyZW4oUGFyc2VWaXNpdG9yIHZpc2l0b3IsIExpc3QgY2hpbGRyZW4pIHsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCAoUFRFeHByZXNzaW9uKSBjaGlsZHJlbi5nZXQoaSkpOwotCQkJfQotCQl9IAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkvLyBhbGxvY2F0ZSBhIGJ1ZmZlciB0aGF0IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIGFuIGF2ZXJhZ2UgY29tcGlsYXRpb24gdW5pdAotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcig2MDAwKTsKLQkJaW50IHAgPSBidWZmZXIubGVuZ3RoKCk7Ci0JCXRyeSB7Ci0JCQlhcHBlbmREZWJ1Z1N0cmluZyhidWZmZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNpbmNlIGRlYnVnZ2VyIHNvbWV0aW1lcyBjYWxsIHRvU3RyaW5nIG1ldGhvZHMsIHByb2JsZW1zIGNhbiBlYXNpbHkgaGFwcGVuIHdoZW4KLQkJCS8vIHRvU3RyaW5nIGlzIGNhbGxlZCBvbiBhbiBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIGluaXRpYWxpemVkCi0JCQlidWZmZXIuc2V0TGVuZ3RoKHApOwotCQkJYnVmZmVyLmFwcGVuZCgiISIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHN0YW5kYXJkVG9TdHJpbmcoKSk7Ci0JCX0KLQkJLy8gY29udmVydCB0byBhIHN0cmluZywgYnV0IGxvc2UgdGhlIGV4dHJhIHNwYWNlIGluIHRoZSBzdHJpbmcgYnVmZmVyIGJ5IGNvcHlpbmcKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHN0YW5kYXJkVG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmREZWJ1Z1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCS8vIHByaW50IHRoZSBzdWJ0cmVlIGJ5IGRlZmF1bHQKLQkJYXBwZW5kUHJpbnRTdHJpbmcoYnVmZmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBBcHBlbmRzIGEgc3RhbmRhcmQgSmF2YSBzb3VyY2UgY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHN1YnRyZWUgdG8gdGhlIGdpdmVuCi0JICogc3RyaW5nIGJ1ZmZlci4KLQkgKiAKLQkgKiBAcGFyYW0gYnVmZmVyIHRoZSBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0bwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFwcGVuZFByaW50U3RyaW5nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyIHByaW50ZXIgPSBuZXcgTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyKCk7Ci0JCXRoaXMuYWNjZXB0KHByaW50ZXIpOwotCQlidWZmZXIuYXBwZW5kKHByaW50ZXIuZ2V0UmVzdWx0KCkpOwotCX0JCi0KLX0gLy9FeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEZpZWxkQWNjZXNzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEZpZWxkQWNjZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg3ZTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRGaWVsZEFjY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVEZpZWxkQWNjZXNzSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZpZWxkIEFjY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEZpZWxkQWNjZXNzSW1wbCNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRGaWVsZEFjY2Vzc0ltcGwjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRGaWVsZEFjY2Vzc0ltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRGaWVsZEFjY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVjZWl2ZXIoKSA8ZW0+UmVjZWl2ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlY2VpdmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIHJlY2VpdmVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZCgpIDxlbT5GaWVsZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkKCkgPGVtPkZpZWxkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZCA9IEZJRUxEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBURmllbGRBY2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBURmllbGRBY2Nlc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldFJlY2VpdmVyKCkgewotCQlyZXR1cm4gcmVjZWl2ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uIG5ld1JlY2VpdmVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRSZWNlaXZlciA9IHJlY2VpdmVyOwotCQlyZWNlaXZlciA9IG5ld1JlY2VpdmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSLCBvbGRSZWNlaXZlciwgbmV3UmVjZWl2ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY2VpdmVyKFBURXhwcmVzc2lvbiBuZXdSZWNlaXZlcikgewotCQlpZiAobmV3UmVjZWl2ZXIgIT0gcmVjZWl2ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlY2VpdmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlY2VpdmVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVjZWl2ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVjZWl2ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlY2VpdmVyKG5ld1JlY2VpdmVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIsIG5ld1JlY2VpdmVyLCBuZXdSZWNlaXZlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoKSB7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZChTdHJpbmcgbmV3RmllbGQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkID0gZmllbGQ7Ci0JCWZpZWxkID0gbmV3RmllbGQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fRklFTEQsIG9sZEZpZWxkLCBmaWVsZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmVjZWl2ZXIobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVI6Ci0JCQkJcmV0dXJuIGdldFJlY2VpdmVyKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fRklFTEQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCXNldFJlY2VpdmVyKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRDoKLQkJCQlzZXRGaWVsZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCXNldFJlY2VpdmVyKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEOgotCQkJCXNldEZpZWxkKEZJRUxEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUjoKLQkJCQlyZXR1cm4gcmVjZWl2ZXIgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRDoKLQkJCQlyZXR1cm4gRklFTERfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkICE9IG51bGwgOiAhRklFTERfRURFRkFVTFQuZXF1YWxzKGZpZWxkKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UmVjZWl2ZXIoKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vRmllbGRBY2Nlc3NJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5maXhFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluZml4RXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjODc3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5maXhFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUSW5maXhFeHByZXNzaW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5maXggRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwjZ2V0TGVmdE9wZXJhbmQgPGVtPkxlZnQgT3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwjZ2V0T3BlcmF0b3IgPGVtPk9wZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCNnZXRSaWdodE9wZXJhbmQgPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsI2dldEV4dGVuZGVkT3BlcmFuZHMgPGVtPkV4dGVuZGVkIE9wZXJhbmRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRJbmZpeEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUSW5maXhFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZWZ0T3BlcmFuZCgpIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlZnRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGxlZnRPcGVyYW5kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcigpIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIE9QRVJBVE9SX0VERUZBVUxUID0gUFRJbmZpeE9wZXJhdG9yLlRJTUVTX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcigpIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEluZml4T3BlcmF0b3Igb3BlcmF0b3IgPSBPUEVSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpZ2h0T3BlcmFuZCgpIDxlbT5SaWdodCBPcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaWdodE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkT3BlcmFuZHMoKSA8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRPcGVyYW5kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4dGVuZGVkT3BlcmFuZHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUSW5maXhFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEluZml4RXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0TGVmdE9wZXJhbmQoKSB7Ci0JCXJldHVybiBsZWZ0T3BlcmFuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMZWZ0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3TGVmdE9wZXJhbmQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZExlZnRPcGVyYW5kID0gbGVmdE9wZXJhbmQ7Ci0JCWxlZnRPcGVyYW5kID0gbmV3TGVmdE9wZXJhbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCwgb2xkTGVmdE9wZXJhbmQsIG5ld0xlZnRPcGVyYW5kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWZ0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3TGVmdE9wZXJhbmQpIHsKLQkJaWYgKG5ld0xlZnRPcGVyYW5kICE9IGxlZnRPcGVyYW5kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChsZWZ0T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClsZWZ0T3BlcmFuZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TGVmdE9wZXJhbmQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TGVmdE9wZXJhbmQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TGVmdE9wZXJhbmQobmV3TGVmdE9wZXJhbmQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5ELCBuZXdMZWZ0T3BlcmFuZCwgbmV3TGVmdE9wZXJhbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRJbmZpeE9wZXJhdG9yIGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gb3BlcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoUFRJbmZpeE9wZXJhdG9yIG5ld09wZXJhdG9yKSB7Ci0JCVBUSW5maXhPcGVyYXRvciBvbGRPcGVyYXRvciA9IG9wZXJhdG9yOwotCQlvcGVyYXRvciA9IG5ld09wZXJhdG9yID09IG51bGwgPyBPUEVSQVRPUl9FREVGQVVMVCA6IG5ld09wZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUiwgb2xkT3BlcmF0b3IsIG9wZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRSaWdodE9wZXJhbmQoKSB7Ci0JCXJldHVybiByaWdodE9wZXJhbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmlnaHRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdSaWdodE9wZXJhbmQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZFJpZ2h0T3BlcmFuZCA9IHJpZ2h0T3BlcmFuZDsKLQkJcmlnaHRPcGVyYW5kID0gbmV3UmlnaHRPcGVyYW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5ELCBvbGRSaWdodE9wZXJhbmQsIG5ld1JpZ2h0T3BlcmFuZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmlnaHRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdSaWdodE9wZXJhbmQpIHsKLQkJaWYgKG5ld1JpZ2h0T3BlcmFuZCAhPSByaWdodE9wZXJhbmQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJpZ2h0T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyaWdodE9wZXJhbmQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSaWdodE9wZXJhbmQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmlnaHRPcGVyYW5kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSaWdodE9wZXJhbmQobmV3UmlnaHRPcGVyYW5kLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQsIG5ld1JpZ2h0T3BlcmFuZCwgbmV3UmlnaHRPcGVyYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVuZGVkT3BlcmFuZHMoKSB7Ci0JCWlmIChleHRlbmRlZE9wZXJhbmRzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkT3BlcmFuZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUyk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkT3BlcmFuZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQ6Ci0JCQkJCXJldHVybiBiYXNpY1NldExlZnRPcGVyYW5kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmlnaHRPcGVyYW5kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5kZWRPcGVyYW5kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQlyZXR1cm4gZ2V0TGVmdE9wZXJhbmQoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIGdldE9wZXJhdG9yKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIGdldFJpZ2h0T3BlcmFuZCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUzoKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRPcGVyYW5kcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EOgotCQkJCXNldExlZnRPcGVyYW5kKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJc2V0T3BlcmF0b3IoKFBUSW5maXhPcGVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCXNldFJpZ2h0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCWdldEV4dGVuZGVkT3BlcmFuZHMoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkT3BlcmFuZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQlzZXRMZWZ0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1I6Ci0JCQkJc2V0T3BlcmF0b3IoT1BFUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQlzZXRSaWdodE9wZXJhbmQoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCWdldEV4dGVuZGVkT3BlcmFuZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIGxlZnRPcGVyYW5kICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXJldHVybiBvcGVyYXRvciAhPSBPUEVSQVRPUl9FREVGQVVMVDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQlyZXR1cm4gcmlnaHRPcGVyYW5kICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCXJldHVybiBleHRlbmRlZE9wZXJhbmRzICE9IG51bGwgJiYgIWV4dGVuZGVkT3BlcmFuZHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRMZWZ0T3BlcmFuZCgpKTsKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFJpZ2h0T3BlcmFuZCgpKTsKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGV4dGVuZGVkT3BlcmFuZHMpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2FzQ29tcHJlc3NlZEV4cHJlc3Npb24oKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gYXNDb21wcmVzc2VkRXhwcmVzc2lvbigpIHsKLQkJLy8gSWYgbm8gbGVmdCBhbmQgbm8gcmlnaHQKLQkJaWYoZ2V0TGVmdE9wZXJhbmQoKSA9PSBudWxsICYmIGdldFJpZ2h0T3BlcmFuZCgpICE9IG51bGwpewotCQkJLy8gbm8gZXh0ZW5kcyBzbyBqdXN0IHVzZSB0aGUgcmlnaHQgb3BlcmFuZAotCQkJaWYoZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmlzRW1wdHkoKSl7Ci0JCQkJcmV0dXJuIGdldFJpZ2h0T3BlcmFuZCgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBUaGUgcmlnaHQgYmVjb21lcyB0aGUgbmV3IGxlZnQKLQkJCQlzZXRMZWZ0T3BlcmFuZChnZXRSaWdodE9wZXJhbmQoKSk7Ci0JCQkJLy8gVGhlIGZpcnN0IG9wZXJhbmQgYmVjb21lcyB0aGUgcmlnaHQgb25lCi0JCQkJc2V0UmlnaHRPcGVyYW5kKChQVEV4cHJlc3Npb24pIGdldEV4dGVuZGVkT3BlcmFuZHMoKS5yZW1vdmUoMCkpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCQl9IGVsc2UgaWYgKGdldFJpZ2h0T3BlcmFuZCgpID09IG51bGwgJiYgZ2V0TGVmdE9wZXJhbmQoKSAhPSBudWxsKXsKLQkJCS8vIG5vIGV4dGVuZHMgc28ganVzdCB1c2UgdGhlIGxlZnQgb3BlcmFuZAotCQkJaWYoZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmlzRW1wdHkoKSl7Ci0JCQkJcmV0dXJuIGdldExlZnRPcGVyYW5kKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSByaWdodCBiZWNvbWVzIHRoZSBmaXJzdCBleHRlbmRlZAotCQkJCXNldFJpZ2h0T3BlcmFuZCgoUFRFeHByZXNzaW9uKWdldEV4dGVuZGVkT3BlcmFuZHMoKS5yZW1vdmUoMCkpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQkJCQotCQl9CQotCQlyZXR1cm4gdGhpczsKLQl9Ci19IC8vSW5maXhFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlUmVmZXJlbmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlUmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY1ZDBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAlVyUKLSAqIEB2ZXJzaW9uICVJJSAlSCUKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEluc3RhbmNlUmVmZXJlbmNlSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEluc3RhbmNlUmVmZXJlbmNlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2UoKSA8ZW0+UmVmZXJlbmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJSmF2YUluc3RhbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJSmF2YUluc3RhbmNlIGdldFJlZmVyZW5jZSgpIHsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsICYmIHJlZmVyZW5jZS5lSXNQcm94eSgpKSB7Ci0JCQlJSmF2YUluc3RhbmNlIG9sZFJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQkJCXJlZmVyZW5jZSA9IChJSmF2YUluc3RhbmNlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClyZWZlcmVuY2UpOwotCQkJaWYgKHJlZmVyZW5jZSAhPSBvbGRSZWZlcmVuY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRSwgb2xkUmVmZXJlbmNlLCByZWZlcmVuY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJSmF2YUluc3RhbmNlIGJhc2ljR2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZShJSmF2YUluc3RhbmNlIG5ld1JlZmVyZW5jZSkgewotCQlJSmF2YUluc3RhbmNlIG9sZFJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQkJcmVmZXJlbmNlID0gbmV3UmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRSwgb2xkUmVmZXJlbmNlLCByZWZlcmVuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVmZXJlbmNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRToKLQkJCQlzZXRSZWZlcmVuY2UoKElKYXZhSW5zdGFuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFOgotCQkJCXNldFJlZmVyZW5jZSgoSUphdmFJbnN0YW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkluc3RhbmNlUmVmeyIgKyByZWZlcmVuY2UgKyAifSI7Ci0JfQotCi19IC8vUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnN0YW5jZW9mSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlb2ZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Mjg5MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluc3RhbmNlb2ZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRJbnN0YW5jZW9mSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5zdGFuY2VvZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlb2ZJbXBsI2dldE9wZXJhbmQgPGVtPk9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZW9mSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRJbnN0YW5jZW9mSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEluc3RhbmNlb2YgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhbmQoKSA8ZW0+T3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmFuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBvcGVyYW5kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUSW5zdGFuY2VvZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRJbnN0YW5jZW9mKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRPcGVyYW5kKCkgewotCQlyZXR1cm4gb3BlcmFuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdPcGVyYW5kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRPcGVyYW5kID0gb3BlcmFuZDsKLQkJb3BlcmFuZCA9IG5ld09wZXJhbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQsIG9sZE9wZXJhbmQsIG5ld09wZXJhbmQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld09wZXJhbmQpIHsKLQkJaWYgKG5ld09wZXJhbmQgIT0gb3BlcmFuZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvcGVyYW5kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3BlcmFuZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPcGVyYW5kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPcGVyYW5kKG5ld09wZXJhbmQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORCwgbmV3T3BlcmFuZCwgbmV3T3BlcmFuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRPcGVyYW5kKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCXJldHVybiBnZXRPcGVyYW5kKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJc2V0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCXNldE9wZXJhbmQoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORDoKLQkJCQlyZXR1cm4gb3BlcmFuZCAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldE9wZXJhbmQoKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9JbnN0YW5jZW9mSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEludmFsaWRFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEludmFsaWRFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjhkZDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVEludmFsaWRFeHByZXNzaW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludmFsaWQgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEludmFsaWRFeHByZXNzaW9uSW1wbCNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRJbnZhbGlkRXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2UoKSA8ZW0+TWVzc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlKCkgPGVtPk1lc3NhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9IE1FU1NBR0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSkgewotCQlTdHJpbmcgb2xkTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCW1lc3NhZ2UgPSBuZXdNZXNzYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0UsIG9sZE1lc3NhZ2UsIG1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRToKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFOgotCQkJCXNldE1lc3NhZ2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFOgotCQkJCXNldE1lc3NhZ2UoTUVTU0FHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRToKLQkJCQlyZXR1cm4gTUVTU0FHRV9FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZSAhPSBudWxsIDogIU1FU1NBR0VfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vSW52YWxpZEV4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTWV0aG9kSW52b2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRNZXRob2RJbnZvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzUwNGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRNZXRob2RJbnZvY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUTWV0aG9kSW52b2NhdGlvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBJbnZvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwjZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE1ldGhvZEludm9jYXRpb25JbXBsI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRNZXRob2RJbnZvY2F0aW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVE1ldGhvZEludm9jYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlY2VpdmVyKCkgPGVtPlJlY2VpdmVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWNlaXZlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiByZWNlaXZlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFyZ3VtZW50cygpIDxlbT5Bcmd1bWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJndW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXJndW1lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVE1ldGhvZEludm9jYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUTWV0aG9kSW52b2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0UmVjZWl2ZXIoKSB7Ci0JCXJldHVybiByZWNlaXZlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gbmV3UmVjZWl2ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZFJlY2VpdmVyID0gcmVjZWl2ZXI7Ci0JCXJlY2VpdmVyID0gbmV3UmVjZWl2ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiwgb2xkUmVjZWl2ZXIsIG5ld1JlY2VpdmVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gbmV3UmVjZWl2ZXIpIHsKLQkJaWYgKG5ld1JlY2VpdmVyICE9IHJlY2VpdmVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZWNlaXZlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWNlaXZlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVjZWl2ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVjZWl2ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVjZWl2ZXIobmV3UmVjZWl2ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSLCBuZXdSZWNlaXZlciwgbmV3UmVjZWl2ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXJndW1lbnRzKCkgewotCQlpZiAoYXJndW1lbnRzID09IG51bGwpIHsKLQkJCWFyZ3VtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFMpOwotCQl9Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJCXJldHVybiBiYXNpY1NldFJlY2VpdmVyKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcmd1bWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJcmV0dXJuIGdldFJlY2VpdmVyKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEFyZ3VtZW50cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSOgotCQkJCXNldFJlY2VpdmVyKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJZ2V0QXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRBcmd1bWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUjoKLQkJCQlzZXRSZWNlaXZlcigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJZ2V0QXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSOgotCQkJCXJldHVybiByZWNlaXZlciAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTOgotCQkJCXJldHVybiBhcmd1bWVudHMgIT0gbnVsbCAmJiAhYXJndW1lbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UmVjZWl2ZXIoKSk7Ci0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBhcmd1bWVudHMpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL01ldGhvZEludm9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTE5MGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUTmFtZUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE5hbWVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVE5hbWVJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUTmFtZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFROYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05BTUVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vTmFtZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdWxsTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdWxsTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyNjkxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTnVsbExpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBQVE51bGxMaXRlcmFsSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TnVsbCBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFROdWxsTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFROdWxsTGl0ZXJhbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUTnVsbExpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUTnVsbExpdGVyYWwoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vTnVsbExpdGVyYWxJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTnVtYmVyTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdW1iZXJMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQ5NGIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdW1iZXJMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUTnVtYmVyTGl0ZXJhbEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk51bWJlciBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTnVtYmVyTGl0ZXJhbEltcGwjZ2V0VG9rZW4gPGVtPlRva2VuPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFROdW1iZXJMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVE51bWJlckxpdGVyYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb2tlbigpIDxlbT5Ub2tlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9rZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRva2VuKCkgPGVtPlRva2VuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb2tlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0b2tlbiA9IFRPS0VOX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUTnVtYmVyTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFROdW1iZXJMaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb2tlbigpIHsKLQkJcmV0dXJuIHRva2VuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRva2VuKFN0cmluZyBuZXdUb2tlbikgewotCQlTdHJpbmcgb2xkVG9rZW4gPSB0b2tlbjsKLQkJdG9rZW4gPSBuZXdUb2tlbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOLCBvbGRUb2tlbiwgdG9rZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTjoKLQkJCQlyZXR1cm4gZ2V0VG9rZW4oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTjoKLQkJCQlzZXRUb2tlbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTF9fVE9LRU46Ci0JCQkJc2V0VG9rZW4oVE9LRU5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTF9fVE9LRU46Ci0JCQkJcmV0dXJuIFRPS0VOX0VERUZBVUxUID09IG51bGwgPyB0b2tlbiAhPSBudWxsIDogIVRPS0VOX0VERUZBVUxULmVxdWFscyh0b2tlbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0b2tlbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG9rZW4pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vTnVtYmVyTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlOGRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cHJlc3Npb24oKSA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJZXhwcmVzc2lvbiA9IG5ld0V4cHJlc3Npb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgb2xkRXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbikgewotCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBleHByZXNzaW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChleHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cHJlc3Npb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhwcmVzc2lvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHByZXNzaW9uKG5ld0V4cHJlc3Npb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBuZXdFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4cHJlc3Npb24obnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBleHByZXNzaW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQcmVmaXhFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFByZWZpeEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMTUwYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFByZWZpeEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRQcmVmaXhFeHByZXNzaW9uSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmVmaXggRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFByZWZpeEV4cHJlc3Npb25JbXBsI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFByZWZpeEV4cHJlc3Npb25JbXBsI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFByZWZpeEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUUHJlZml4RXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wZXJhdG9yKCkgPGVtPk9wZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQVFByZWZpeE9wZXJhdG9yIE9QRVJBVE9SX0VERUZBVUxUID0gUFRQcmVmaXhPcGVyYXRvci5QTFVTX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcigpIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yID0gT1BFUkFUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9uKCkgPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRQcmVmaXhFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVFByZWZpeEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRQcmVmaXhPcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZXJhdG9yKFBUUHJlZml4T3BlcmF0b3IgbmV3T3BlcmF0b3IpIHsKLQkJUFRQcmVmaXhPcGVyYXRvciBvbGRPcGVyYXRvciA9IG9wZXJhdG9yOwotCQlvcGVyYXRvciA9IG5ld09wZXJhdG9yID09IG51bGwgPyBPUEVSQVRPUl9FREVGQVVMVCA6IG5ld09wZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IsIG9sZE9wZXJhdG9yLCBvcGVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JCWV4cHJlc3Npb24gPSBuZXdFeHByZXNzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgb2xkRXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbikgewotCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBleHByZXNzaW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChleHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cHJlc3Npb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHByZXNzaW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhwcmVzc2lvbihuZXdFeHByZXNzaW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBuZXdFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXhwcmVzc2lvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXJldHVybiBnZXRPcGVyYXRvcigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXNldE9wZXJhdG9yKChQVFByZWZpeE9wZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXNldE9wZXJhdG9yKE9QRVJBVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXJldHVybiBvcGVyYXRvciAhPSBPUEVSQVRPUl9FREVGQVVMVDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL1ByZWZpeEV4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUU3RyaW5nTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRTdHJpbmdMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmI4OTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRTdHJpbmdMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUU3RyaW5nTGl0ZXJhbEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0cmluZyBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUU3RyaW5nTGl0ZXJhbEltcGwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUU3RyaW5nTGl0ZXJhbEltcGwjZ2V0TGl0ZXJhbFZhbHVlIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRTdHJpbmdMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVFN0cmluZ0xpdGVyYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc2NhcGVkVmFsdWUoKSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzY2FwZWRWYWx1ZSgpIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXNjYXBlZFZhbHVlID0gRVNDQVBFRF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaXRlcmFsVmFsdWUoKSA8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGl0ZXJhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSVRFUkFMX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpdGVyYWxWYWx1ZSgpIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaXRlcmFsVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGl0ZXJhbFZhbHVlID0gTElURVJBTF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVFN0cmluZ0xpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUU3RyaW5nTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCkgewotCQlyZXR1cm4gZXNjYXBlZFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZShTdHJpbmcgbmV3RXNjYXBlZFZhbHVlKSB7Ci0JCXN0cmluZ0xpdGVyYWxTZXQgPSBmYWxzZTsKLQkJc2V0TGl0ZXJhbFZhbHVlR2VuKExJVEVSQUxfVkFMVUVfRURFRkFVTFQpOwotCQlzZXRFc2NhcGVkVmFsdWVHZW4obmV3RXNjYXBlZFZhbHVlKTsJCQotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc2NhcGVkVmFsdWVHZW4oU3RyaW5nIG5ld0VzY2FwZWRWYWx1ZSkgewotCQlTdHJpbmcgb2xkRXNjYXBlZFZhbHVlID0gZXNjYXBlZFZhbHVlOwotCQllc2NhcGVkVmFsdWUgPSBuZXdFc2NhcGVkVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFLCBvbGRFc2NhcGVkVmFsdWUsIGVzY2FwZWRWYWx1ZSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzdHJpbmdMaXRlcmFsU2V0OwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbFZhbHVlKCkgewotCQlpZiAoIXN0cmluZ0xpdGVyYWxTZXQgJiYgZXNjYXBlZFZhbHVlICE9IEVTQ0FQRURfVkFMVUVfRURFRkFVTFQpIHsKLQkJCVN0cmluZyBzID0gZ2V0RXNjYXBlZFZhbHVlKCk7Ci0JCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPCAyIHx8IHMuY2hhckF0KDApICE9ICdcIicgfHwgcy5jaGFyQXQobGVuLTEpICE9ICdcIicgKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotCQkJaW50IHN0b3AgPSBsZW4tMTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc3RvcDsgaSsrKSB7Ci0JCQkJY2hhciBhdGkgPSBzLmNoYXJBdChpKTsKLQkJCQlpZiAoYXRpID09ICdcXCcpIHsKLQkJCQkJaWYgKCsraSA8IHN0b3ApIHsKLQkJCQkJCWF0aSA9IHMuY2hhckF0KGkpOwotCQkJCQkJaWYgKGF0aSA9PSAndScpIHsKLQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOwotCQkJCQkJCWlmIChpKzQgPj0gc3RvcAotCQkJCQkJCQkJfHwgKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdCgrK2kpKSkgPiAxNQotCQkJCQkJCQkJfHwgYzEgPCAwCi0JCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KCsraSkpKSA+IDE1Ci0JCQkJCQkJCQl8fCBjMiA8IDAKLQkJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoKytpKSkpID4gMTUKLQkJCQkJCQkJCXx8IGMzIDwgMAotCQkJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdCgrK2kpKSkgPiAxNQotCQkJCQkJCQkJfHwgYzQgPCAwKXsKLQkJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBzdHJpbmcgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCkpOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJYnVmZmVyLmFwcGVuZChQVENoYXJhY3RlckxpdGVyYWxJbXBsLmdldENoYXJFc2NhcGVkKGF0aSkpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgc3RyaW5nIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlCi0JCQkJCWJ1ZmZlci5hcHBlbmQoYXRpKTsJCi0JCQl9Ci0JCQkKLQkJCXN0cmluZ0xpdGVyYWxTZXQgPSB0cnVlOwotCQkJc2V0TGl0ZXJhbFZhbHVlR2VuKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldExpdGVyYWxWYWx1ZUdlbigpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWxWYWx1ZUdlbigpIHsKLQkJcmV0dXJuIGxpdGVyYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXRlcmFsVmFsdWUoU3RyaW5nIG5ld0xpdGVyYWxWYWx1ZSkgewotCQlzdHJpbmdMaXRlcmFsU2V0ID0gdHJ1ZTsKLQkJc2V0TGl0ZXJhbFZhbHVlR2VuKG5ld0xpdGVyYWxWYWx1ZSk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIobmV3TGl0ZXJhbFZhbHVlLmxlbmd0aCgpKzIpOwotCQliLmFwcGVuZCgnXCInKTsgLy8gb3BlbmluZyBkZWxpbWl0ZXIKLQkJaW50IHN0b3AgPSBuZXdMaXRlcmFsVmFsdWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RvcDsgaSsrKSB7Ci0JCQlQVENoYXJhY3RlckxpdGVyYWxJbXBsLmFwcGVuZENoYXJhY3RlcihuZXdMaXRlcmFsVmFsdWUuY2hhckF0KGkpLCBiKTsJCi0JCX0KLQkJYi5hcHBlbmQoJ1wiJyk7IC8vIGNsb3NpbmcgZGVsaW1pdGVyCi0JCXNldEVzY2FwZWRWYWx1ZUdlbihiLnRvU3RyaW5nKCkpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXRlcmFsVmFsdWVHZW4oU3RyaW5nIG5ld0xpdGVyYWxWYWx1ZSkgewotCQlTdHJpbmcgb2xkTGl0ZXJhbFZhbHVlID0gbGl0ZXJhbFZhbHVlOwotCQlsaXRlcmFsVmFsdWUgPSBuZXdMaXRlcmFsVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFLCBvbGRMaXRlcmFsVmFsdWUsIGxpdGVyYWxWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldEVzY2FwZWRWYWx1ZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlzZXRFc2NhcGVkVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRToKLQkJCQlzZXRMaXRlcmFsVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJc2V0RXNjYXBlZFZhbHVlKEVTQ0FQRURfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUU6Ci0JCQkJc2V0TGl0ZXJhbFZhbHVlKExJVEVSQUxfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlyZXR1cm4gRVNDQVBFRF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZXNjYXBlZFZhbHVlICE9IG51bGwgOiAhRVNDQVBFRF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZXNjYXBlZFZhbHVlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUU6Ci0JCQkJcmV0dXJuIExJVEVSQUxfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGxpdGVyYWxWYWx1ZSAhPSBudWxsIDogIUxJVEVSQUxfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGxpdGVyYWxWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9TdHJpbmdMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFRoaXNMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFRoaXNMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJlNzFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUaGlzTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IFBUVGhpc0xpdGVyYWxJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaGlzIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFRoaXNMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVFRoaXNMaXRlcmFsIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRUaGlzTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRUaGlzTGl0ZXJhbCgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9UaGlzTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUeXBlTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUeXBlTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjMWMxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVHlwZUxpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUFRUeXBlTGl0ZXJhbEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRUeXBlTGl0ZXJhbEltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUVHlwZUxpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUVHlwZUxpdGVyYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUVHlwZUxpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUVHlwZUxpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUxfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUxfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9UeXBlTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4MzhmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BhcnNlVHJlZUFsbG9jYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8xMC8wMyAxOToyMDo0MSAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwjZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVHJlZUFsbG9jYXRpb25JbXBsIGV4dGVuZHMgSmF2YUFsbG9jYXRpb25JbXBsIGltcGxlbWVudHMgUGFyc2VUcmVlQWxsb2NhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbigpIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhcnNlVHJlZUFsbG9jYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnNlVHJlZUFsbG9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQlleHByZXNzaW9uID0gbmV3RXhwcmVzc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OLCBvbGRFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uKSB7Ci0JCWlmIChuZXdFeHByZXNzaW9uICE9IGV4cHJlc3Npb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwcmVzc2lvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHByZXNzaW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEV4cHJlc3Npb24obmV3RXhwcmVzc2lvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04sIG5ld0V4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXhwcmVzc2lvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJc2V0RXhwcmVzc2lvbigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGV4cHJlc3Npb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKSAhPSBudWxsID8gZ2V0RXhwcmVzc2lvbigpLnRvU3RyaW5nKCkgOiBzdXBlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFyc2VUcmVlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0gLy9QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2I0NGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1OYWl2ZUV4cHJlc3Npb25GbGF0dGVuZXJfSW52YWxpZEV4cHJlc3Npb249IGludmFsaWQ6ICJ7MH0iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9pbnN0YW5jZS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWYwYTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Imluc3RhbnRpYXRpb24iCi0gICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbiI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKYXZhIEluc3RhbnRpYXRpb24gUGFja2FnZSIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YURhdGFUeXBlSW5zdGFuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JSmF2YUluc3RhbmNlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFJbnN0YW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YU9iamVjdEluc3RhbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhSW5zdGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaW50ZXJmYWNlIGlzIHRoZSBpbnN0YW5jZSBvZiBhbiBqYXZhIG9iamVjdCBpbiB0aGUgamF2YSBtb2RlbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUFsbG9jYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIHRoZSBhbGxvY2F0aW9uIGNsYXNzLiBJdCBpcyB0aGUgdmFsdWUgb2YgdGhlICZxdW90O2FsbG9jYXRpb24mcXVvdDsgcHJvcGVydHkgb24gYSBKYXZhIE9iamVjdCBzbyB0aGF0IHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBjYW4gYmUgY29udHJvbGxlZC4gRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIG9uZSBmb3IganVzdCBpbml0IHN0cmluZywgb3Igb25lIGZvciBzZXJpYWxpemVkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbml0U3RyaW5nQWxsb2NhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0phdmFBbGxvY2F0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYWxsb2NhdGlvbiBzdHJpbmcgY2FuIGJlIHBhcnNlZCBieSB0aGUgcmVtb3RlIHZtLiBJdCB1c2VzIHRoZSBhbGxvY1N0cmluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdFN0cmluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZyBmb3IgdGhpcyBvYmplY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkltcGxpY2l0QWxsb2NhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0phdmFBbGxvY2F0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIGlzIGZvciBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uIHdoZXJlIHRoZSBvYmplY3QgY29tZXMgZnJvbSB0aGUgZmVhdHVyZSBvZiBhbm90aGVyIG9iamVjdC4gSXQgaXMgdGhlIGxpdmUgSmF2YSB2YWx1ZSBmcm9tIHRoZSByZW1vdGUgdm0uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZlYXR1cmUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cnVjdHVyYWxGZWF0dXJlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhcnNlVHJlZUFsbG9jYXRpb24iIGVTdXBlclR5cGVzPSIjLy9KYXZhQWxsb2NhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQWxsb2NhdGlvbnMgdmlhIFBhcnNlIFRyZWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEV4cHJlc3Npb24iIGFic3RyYWN0PSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRBcnJheUFjY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJyYXkgYWNjZXNzLiBlLmcuIHhbM10uICYjeEQ7JiN4QTsmI3hEOyYjeEE7VW5saWtlIEFTVCwgdGhlIGVudGlyZSBleHByZXNzaW9uIG9mIHR5cGUgeFszXVs0XSB3aWxsIGJlIGRvbmUgaW4gb25lIGV4cHJlc3Npb24gcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2VwYXJhdGUgQXJyYXlBY2Nlc3MgZm9yIGVhY2ggZGltZW5zaW9uLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGlmaWNhdGlvbi4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIGl0IGlzIGEgc2ltcGxlIGFycmF5IGFjY2VzcyB3aGVyZSBpdCBpcyBvZiB0aGUgZm9ybSB7ZXhwcmVzc2lvbn1bZXhwcmVzc2lvbl1bZXhwcmVzc2lvbl0uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFycmF5IiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgYXJyYXkgdG8gYWNjZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleGVzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbnMgcmVwcmVzZW50aW5nIHRoZSBpbmRleGVzIG9mIHRoZSBhY2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQXJyYXlDcmVhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJyYXkgQ3JlYXRpb24gZXhwcmVzc2lvbiwgZS5nLiBuZXcgaW50WzNdIG9yIG5ldyBqYXZhLmxhbmdTdHJpbmdbXVtdIHt7JnF1b3Q7YSZxdW90O30sIHsmcXVvdDtiJnF1b3Q7fX0iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSwgZS5nLiBpbnRbXVtdIG9yIGphdmEubGFuZy5TdHJpbmdbXSwgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgZGltZW5zaW9uIGJyYWNrZXRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaW1lbnNpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGlzdCBvZiBleHByZXNzaW9ucyBmb3IgdGhlIGRpbWVuc2lvbnMuIFlvdSBjYW4gaGF2ZSBbM11bNF1bXSBidXQgW11bMzNdIGlzIGludmFsaWQuIFNvIGZvciBlYWNoIGRpbWVuc2lvbiB0aGF0IGhhcyBhbiBleHByZXNzaW9uLCB0aGVyZSB3aWxsIGJlIGFuIGVudHJ5IGluIHRoZSBsaXN0LCBpbiB0aGUgY29ycmVjdCBvcmRlci4gV2hlbiB5b3UgcmVhY2ggdGhlIGVtcHR5IGRpbWVuc2lvbnMsIHRoZSBsaXN0IHdpbGwgZW5kIHRvby4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRpYWxpemVyIiBlVHlwZT0iIy8vUFRBcnJheUluaXRpYWxpemVyIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGluaXRpYWxpemVyLCBpZiBhbnksIGZvciB0aGlzIGFycmF5LiBFLmcuIG5ldyBpbnRbXSB7MiwzfS4gSXQgaXMgdGhlIHsyLDN9LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEFycmF5SW5pdGlhbGl6ZXIiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFycmF5IGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24uIFRoaXMgaXMgdGhlIGVudGlyZSBleHByZXNzaW9uLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGV4cHJlc3Npb25zIGxpc3QgZm9yIHRoZSB0b3AgQXJyYXlJbml0aWFsaXplci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwcmVzc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXN0aGUgbGlzdCBvZiBleHByZXNzaW9ucyB3aXRoaW4gdGhlIGluaXRpYWxpemVyLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIGZpcnN0IGNhc2UgaXQgd2lsbCBiZSB0d28gTnVtYmVyTGl0ZXJhbHMuIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciwgZm9sbG93ZWQgYnkgYSBOdW1iZXJMaXRlcmFsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEJvb2xlYW5MaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgYm9vbGVhbiBsaXRlcmFsLCBpLmUuIHRydWUgb3IgZmFsc2UgZGlyZWN0bHkgaW4gdGhlIGNvZGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvb2xlYW5WYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIGxpdGVyYWwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQ2FzdEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNhc3QgZXhwcmVzc2lvbiwgZS5nLiAoc2hvcnQpIDEwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBvZiB0aGUgY2FzdCwgZS5nLiBpbnQgb3IgamF2YS5sYW5nLlN0cmluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9uIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIGJlaW5nIGNhc3RlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRDaGFyYWN0ZXJMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgY2hhcmFjdGVyIGV4cHJlc3Npb24sIGUuZy4gJ2EnIG9yICdccicuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzY2FwZWRWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gJ2EnIG9yICdccicuIEluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgc2luZ2xlIHF1b3RlcyB0aGVtc2VsdmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFyVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VDaGFyIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHByaW1pdGl2ZSBjaGFyYWN0ZXIgd2l0aG91dCB0aGUgcXVvdGVzLiBFc2NhcGUgYXJlIGV2YWx1YXRlZCBhbmQgdHVybmVkIGludG8gdGhlaXIgY2hhcmFjdGVyIHZhbHVlLiBUaGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLiBJZiBub3Qgc2V0IHdoZW4gY3JlYXRlZCB3aGVuIHF1ZXJpZWQgaXQgd2lsbCBjcmVhdGUgaXQuIFR5cGljYWxseSBpdCB3aWxsIGJlIHNldCB3aGVuIGNyZWF0ZWQgZnJvbSBhbiBBU1Qgbm9kZSBzaW5jZSB0aGUgbm9kZSBhbHJlYWR5IGhhcyBldmFsdWF0ZWQgaXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uLiBFLmcuIG5ldyBTdHJpbmcoJnF1b3Q7YSZxdW90OykiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIGNsYXNzLiBFLmcuIGphdmEubGFuZy5TdHJpbmcuIFRoaXMgc2hvdWxkIGJlIGZ1bGx5LXF1YWxpZmllZCBmb3IgYWxsb2NhdGlvbiBwdXJwb3Nlcy4gSXQgc2hvdWxkIGFsc28gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gaWYgWCBpcyBhbiBpbm5lciBjbGFzcyBvZiBqLlksIHRoZW4gdGhlIHR5cGUgaGVyZSBzaG91bGQgYmUgJnF1b3Q7ai5ZJFgmcXVvdDsuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhcmd1bWVudHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRlc3QgRXhwcmVzc29uLCBlLmcuICh4PTMpID8gMSA6IDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uZGl0aW9uIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25kaXRpb24gZXhwcmVzc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHJ1ZSIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHJ1ZSBleHByZXNzaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZhbHNlIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmYWxzZSBleHByZXNzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEZpZWxkQWNjZXNzIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBY2Nlc3MgYSBmaWVsZCBleHByZXNzaW9uLCBlLmcuIGphdmEuYXd0LkNvbG9yLnJlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWNlaXZlciIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG9iamVjdCB0aGF0IHRoZSBmaWVsZCBpcyBpbiwgZS5nLiBqYXZhLmF3dC5Db2xvci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgYWNjZXNzZWQsIGUuZy4gcmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEluZml4RXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXhwcmVzc2lvbiB3aXRoIGFuIG9wZXJhdG9yIHRoYXQgaGFzIHR3byBvcGVyYW5kcywgZS5nLiAzICsgNC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGVmdE9wZXJhbmQiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9wZXJhdG9yIiBlVHlwZT0iIy8vUFRJbmZpeE9wZXJhdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG9wZXJhdG9yLCBlLmcuICsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmlnaHRPcGVyYW5kIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByaWdodCBleHByZXNzaW9uLiBpLmUuIDQgb2YgJnF1b3Q7MyArIDQmcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRPcGVyYW5kcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVXNlZCB3aGVuIHRoZXJlIGFyZSBhIHNlcmllcyBvZiBpbmZpeCBvcGVyYXRpb25zIG9mIHRoZSBzYW1lIG9wZXJhdG9yLCBlLmcuIDEgKyAyICsgMyArIDQuIDEgYW5kIDIgd2lsbCBnbyBpbnRvIGxlZnQgYW5kIHJpZ2h0LCB3aGlsZSB7MywgNH0gd2lsbCBnbyBpbnRvIHRoZSBleHRlbmRlZCBvcGVyYW5kcy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUFRJbmZpeE9wZXJhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbnVtZXJhdG9yIGZvciB0aGUgb3BlcmF0b3Igb24gYW4gSW5maXhFeHByZXNzaW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVElNRVMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIqIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRJVklERSIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIvIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFTUFJTkRFUiIgdmFsdWU9IjIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIlIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBMVVMiIHZhbHVlPSIzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iKyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJNSU5VUyIgdmFsdWU9IjQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSItIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxFRlRfU0hJRlQiIHZhbHVlPSI1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmx0OyZsdDsgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUklHSFRfU0hJRlRfU0lHTkVEIiB2YWx1ZT0iNiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ij4+IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJJR0hUX1NISUZUX1VOU0lHTkVEIiB2YWx1ZT0iNyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ij4+PiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMRVNTIiB2YWx1ZT0iOCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiZsdDsgIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkdSRUFURVIiIHZhbHVlPSI5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMRVNTX0VRVUFMUyIgdmFsdWU9IjEwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmx0Oz0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iR1JFQVRFUl9FUVVBTFMiIHZhbHVlPSIxMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ij49IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkVRVUFMUyIgdmFsdWU9IjEyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iPT0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTk9UX0VRVUFMUyIgdmFsdWU9IjEzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iIT0gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iWE9SIiB2YWx1ZT0iMTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJeIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFORCIgdmFsdWU9IjE1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmFtcDsgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1IiIHZhbHVlPSIxNiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9InwgIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNPTkRJVElPTkFMX0FORCIgdmFsdWU9IjE3Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJmFtcDsmYW1wOyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDT05ESVRJT05BTF9PUiIgdmFsdWU9IjE4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0ifHwgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEluc3RhbmNlb2YiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikluc3RhbmNlb2YgZXhwcmVzc2lvbiwgZS5nLiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcGVyYW5kIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSB0byB0ZXN0LCBlLmcuIHggaW4geCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB0ZXN0LCBlLmcuIGphdmEubGFuZy5TdHJpbmcuIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVE1ldGhvZEludm9jYXRpb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZEludm9jYXRpb24gZXhwcmVzc2lvbiwgZS5nLiB4LmdldFkoMykiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVjZWl2ZXIiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hvIHRoZSBtZXRob2QgaXMgaW52b2tlZCBhZ2FpbnN0LiBUaGlzIG1heSBiZSBub3Qgc2V0LCB3aGljaCBtZWFucyAmcXVvdDt0aGlzJnF1b3Q7LiBJdCBtYXkgYWxzbyBiZSBhIE5hbWUsIHdoaWNoIHdvdWxkIG1lYW4gYSBjbGFzcyBsaWtlICZxdW90O2phdmEubGFuZy5TdHJpbmcmcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgaW52b2tlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXJndW1lbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGlzdCBvZiBhcmd1bWVudHMsIGlmIGFueSwgdG8gdGhlIG1ldGhvZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFROYW1lIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHJlcHJlc2VudHMgYSBuYW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIHRoZSByZWNlaXZlciBvZiBhIG1ldGhvZCBpbnZvY2F0aW9uLCBlLmcuIHguZ2V0WSgpIG9yIGphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCkuIEluIHRoZXNlIGNhc2VzIHlvdSB3b3VsZCBoYXZlIGEgbmFtZSBvZiAmcXVvdDt4JnF1b3Q7IG9yICZxdW90O2phdmEubGFuZy5TdHJpbmcmcXVvdDsuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSwgd2hpY2ggY2FuIGJlIGEgdHlwZSBvciBhIHZhcmlhYmxlLiBJZiBpdCBpcyBhIHR5cGUsIHRoZW4gIGl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVE51bGxMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICZxdW90O251bGwmcXVvdDsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFROdW1iZXJMaXRlcmFsIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXByZXNlbnQgYSBudW1iZXIgcHJpbWl0aXZlIGxpdGVyYWwsIGUuZy4gMTAuIE9uZSBvcHRpbWl6YXRpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBpcyB0aGF0IGlmIGFuIGV4cHJlc3Npb24gaXMgb2YgdGhlIGZvcm0gK251bWJlciBvciAtbnVtYmVyLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tIGEgUHJlZml4RXhwcmVzc2lvbiB3aXRoIGEgTnVtYmVyTGl0ZXJhbCB0byBqdXN0IGEgTnVtYmVyTGl0ZXJhbC4gVGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBtb2RlbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9rZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG9rZW4gdmFsdWUsIGUuZy4gMTAsIDEwZCwgb3IgLTEwLjc1Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4cHJlc3Npb24gd2l0aGluIHBhcmVudGhlc2lzLCBlLmcuICh4KzMpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cHJlc3Npb24iIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb24gd3JhcHBlZCBieSB0aGUgcGFyZW50aGVzaXMsIGUuZy4gKHgrMykgdGhlbiB0aGUgZXhwcmVzc2lvbiBpcyAmcXVvdDt4KzMmcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRQcmVmaXhFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIG9uZSBvcGVyYW5kIG9wZXJhdG9yLCB3aGVyZSB0aGUgb3BlcmF0b3IgY29tZXMgYmVmb3JlIHRoZSBvcGVyYW5kLCBlLmcuIC0gKHgrMykuIEluIEFTVCwgZXZlbiAtMyBpcyBtb2RlbGVkIGFzIGEgUHJlZml4RXhwcmVzc2lvbiBvZiBvcGVyYXRvciAmcXVvdDstJnF1b3Q7IGFuZCBleHByZXNzaW9uIG9mIE51bWJlckxpdGVyYWwoMykuIEJ1dCB3ZSBvcHRpbWl6ZSB0aGlzIGF3YXkgYW5kIGp1c3QgdXNlIGEgTnVtYmVyTGl0ZXJhbCgtMykgZGlyZWN0bHkgaW5zdGVhZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3BlcmF0b3IiIGVUeXBlPSIjLy9QVFByZWZpeE9wZXJhdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG9wZXJhdG9yIG9mIHRoaXMgZXhwcmVzc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwcmVzc2lvbiIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbiB0aGF0IHRoZSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlBUUHJlZml4T3BlcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmVmaXggZXhwcmVzc2lvbiBvcGVyYXRvci4gV2UgYXJlIG5vdCBtb2RlbGluZyArKyBhbmQgLS0uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQTFVTIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iKyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJNSU5VUyIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSItIG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNPTVBMRU1FTlQiIHZhbHVlPSIyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0ifiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT1QiIHZhbHVlPSIzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iISBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUU3RyaW5nTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZS5nLiAmcXVvdDthc2RmJnF1b3Q7LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc2NhcGVkVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBlc2NhcGVkIHN0cmluZy4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICZxdW90O2FiJnF1b3Q7IG9yICZxdW90O2NcciZxdW90Oy4gSW5jbHVkaW5nIHRoZSBzdXJyb3VuZGluZyBxdW90ZXMgdGhlbXNlbHZlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGl0ZXJhbFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0cmluZyB3aXRob3V0IHRoZSBxdW90ZXMuIEVzY2FwZSBhcmUgZXZhbHVhdGVkIGFuZCB0dXJuZWQgaW50byB0aGVpciBjaGFyYWN0ZXIgdmFsdWUuIFRoaXMgaXMgYSB0cmFuc2llbnQgZmllbGQuIElmIG5vdCBzZXQgd2hlbiBjcmVhdGVkIHdoZW4gcXVlcmllZCBpdCB3aWxsIGNyZWF0ZSBpdC4gVHlwaWNhbGx5IGl0IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRlZCBmcm9tIGFuIEFTVCBub2RlIHNpbmNlIHRoZSBub2RlIGFscmVhZHkgaGFzIGV2YWx1YXRlZCBpdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRUaGlzTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyAmcXVvdDt0aGlzJnF1b3Q7LCBlLmcuIHRoaXMuZ2V0WCgpIHdpbGwgYmUgYSBNZXRob2RJbnZvY2F0aW9uIHdpdGggdGhlIHJlY2VpdmVyIGJlaW5nIGEgVGhpc0xpdGVyYWwuIFdlIGNhbid0IGhhbmRsZSB0aGUgZm9ybWF0IFhZWi50aGlzIGJlY2F1c2UgdGhhdCBpcyBmb3IgaW5uZXIgY2xhc3NlcyBhbmQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0IHJpZ2h0IG5vdy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRUeXBlTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyByZXByZXNlbnRzIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybSBqLlhZWi5jbGFzcy4gRm9yIGluc3RhbmNlIGluIGEgbWV0aG9kIGludm9jYXRpb24geC5nZXRYKGpYWVouY2xhc3MpIHRoZSBhcmd1bWVudCB3aWxsIGJlIGEgVHlwZUxpdGVyYWwuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB0aGUgbGl0ZXJhbC4gIEl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEludmFsaWRFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIHNvbWUgZXhwcmVzc2lvbiB3ZSBqdXN0IGNhbid0IGV2YWx1YXRlIGZvciBvdXIgcHVycG9zZXMuIEl0IGFsbG93cyB1cyB0byB0ZWxsIHRoZSBldmFsdWF0aW9uIHdoYXQgaXMgYWN0dWFsbHkgd3JvbmcuIEl0IHNob3VsZCBiZSBwbGFjZWQgYXMgdGhlIHJvb3QgZXhwcmVzc2lvbiB0byBwcmV2ZW50IHByb2Nlc3NpbmcgbXVjaCBvZiB0aGUgdHJlZSBhbmQgdGhlbiBmaW5hbGx5IGZhaWwuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1lc3NhZ2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIG1lc3NhZ2UgYXMgdG8gd2h5IGl0IGlzIGludmFsaWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUSW5zdGFuY2VSZWZlcmVuY2UiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JSmF2YUluc3RhbmNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2luc3RhbmNlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjI0MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0IgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9IiIgbW9kZWxOYW1lPSJpbnN0YW5jZSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5wcm92aWRlci5pbnN0YW5jZUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLnByZXNlbnRhdGlvbi5pbnN0YW5jZUVkaXRvclBsdWdpbiIKLSAgICB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIiBib29sZWFuRmxhZ3NGaWVsZD0iZUZsYWdzIiBib29sZWFuRmxhZ3NSZXNlcnZlZEJpdHM9IjgiCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLnJvc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcaW5zdGFuY2UubWRsPC9mb3JlaWduTW9kZWw+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+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlUmVmZXJlbmNlL3JlZmVyZW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4YWEzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImphdmEiCi0gICAgbnNVUkk9ImphdmEueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuamVtLmphdmEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhbmdlcyB0byBzeW5jaCB1cCB3aXRoIEphdmEzZTomI3hEOyYjeEE7LSBkZWxldGVkIEphdmFFbGVtZW50LCBCb2R5RWxlbWVudCB3aGljaCBkaWRuJ3QgYWRkIGFueXRoaW5nIHVzZWZ1bCYjeEQ7JiN4QTstIGRlbGV0ZWQgTmVzdGVkQ2xhc3MgYW5kIHRoZSBhc3NvY2lhdGlvbiB3aGljaCBkZXNjcmliZWQgbmVzdGluZywgY29udGVudHMgY2FuIGJlIHVzZWQgaW5zdGVhZCYjeEQ7JiN4QTstIGRlbGV0ZWQgZXh0ZW5kcy9leHRlbmRlZEJ5IHdoaWNoIGlzIHJlcGxhY2VkIHdpdGggTU9GIHN1YnR5cGUvc3VwZXJ0eXBlJiN4RDsmI3hBOy0gZGVsZXRlZCB0aGUgY2x1bXN5IG1haW4gZGlhZ3JhbSYjeEQ7JiN4QTstIG1vdmVkIHRoZSBNT0YgaW5oZXJpdGFuY2UgZGV0YWlscyB0byB0aGUgTU9GIGJpbmRpbmcgZGlhZ3JhbSYjeEQ7JiN4QTstIGRlbGV0ZWQgJnF1b3Q7ZmluYWwmcXVvdDsgb24gSmF2YVBhcmFtZXRlciwgZG9uJ3Qga25vdyB3aGF0IHRoYXQgd2FzIHN1cHBvc2VkIHRvIGJlJiN4RDsmI3hBOy0gZGVsZXRlZCB0aGUgQ2F0ZWdvcnkganVuayYjeEQ7JiN4QTstIGNoYW5nZWQgdGhlIEJsb2NrLXR5cGVkIGF0dHJpYnV0ZXMgb24gRmllbGQsIE1ldGhvZCwgSW5pdGlhbGl6ZXIgdG8gYmUgYXNzb2NpYXRpb25zIHRvIEJsb2NrJiN4RDsmI3hBOyYjeEQ7JiN4QTtPdXRzdGFuZGluZyBxdWVzdGlvbnMvaXNzdWVzOiYjeEQ7JiN4QTstIEphdmFQYXJhbWV0ZXJLaW5kIHNob3VsZCBnbyBhd2F5IGlmIHdlIGdldCB0aGUgYmFzZSBQYXJhbWV0ZXIga2luZCBmaXhlZCB1cCYjeEQ7JiN4QTsiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUNsYXNzIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUNsYXNzIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNOZXN0ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpZWxkIiBlVHlwZT0iIy8vRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmaWVsZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaWVsZEV4dGVuZGVkIiBlVHlwZT0iIy8vRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIgUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lIGZyb20gdGhpcyBKYXZhQ2xhc3Mgb3IgYW55IHN1cGVydHlwZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmaWVsZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaWVsZE5hbWVkIiBlVHlwZT0iIy8vRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmaWVsZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaWVsZHNFeHRlbmRlZCIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbGwgZmllbGRzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kIiBlVHlwZT0iIy8vTWV0aG9kIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWV0aG9kTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlclR5cGVzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZVBhcmFtZXRlcnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBMaXN0IG9mIFN0cmluZ3MgdGhhdCByZXByZXNlbnQgTWV0aG9kRWxlbWVudCBzaWduYXR1cmVzIGZyb20gbW9zdCBnZW5lcmFsIHRvIG1vc3Qgc3BlY2lmaWMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXRob2RFeHRlbmRlZCIgZVR5cGU9IiMvL01ldGhvZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWV0aG9kTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlclR5cGVzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZVBhcmFtZXRlcnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kc0V4dGVuZGVkIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T25seVNwZWNpZmljTWV0aG9kcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIExpc3Qgb2YgTWV0aG9kcyB0aGF0IGJlZ2lucyB3aXRoIEBhTWV0aG9kTmFtZVByZWZpeCBhbmQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBAZXhjbHVkZWROYW1lcyBsaXN0LiBJZiBAYU1ldGhvZE5hbWVQcmVmaXggaXMgbnVsbCwgYWxsIG1ldGhvZHMgd2lsbCBiZSByZXR1cm5lZC4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJhTWV0aG9kTmFtZVByZWZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImV4Y2x1ZGVkTmFtZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQdWJsaWNNZXRob2QiIGVUeXBlPSIjLy9NZXRob2QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiAgSXQgd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1ldGhvZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJhbWV0ZXJUeXBlcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2VQYXJhbWV0ZXJzPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFB1YmxpY01ldGhvZHMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYWxsIG1ldGhvZHMsIGl0IHdpbGwgbm90IGdvIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFsbCBwdWJsaWMgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFB1YmxpY01ldGhvZHNOYW1lZCIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8gdGhhdCBvZiB0aGUgcGFyYW1ldGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFN1cGVydHlwZSIgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpbXBsZW1lbnRzSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlc3Qgd2hldGhlciB0aGUgcmVjZWl2ZXIgaW1wbGVtZW50cyB0aGUgcGFzc2VkIGludGVyZmFjZSAob3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImludGVyZmFjZVR5cGUiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpbmZvU3RyaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgc3RyaW5nIHNob3dpbmcgb3VyIGRldGFpbHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpbmhlcml0c0Zyb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImphdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzRXhpc3RpbmdUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRvZXMgdGhpcyB0eXBlIGV4aXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBhbiBpbnRlcmZhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRTdXBlcnR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXQgdGhlIHN1cGVydHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImphdmFjbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtpbmQiIGVUeXBlPSIjLy9UeXBlS2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdWJsaWMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBsZW1lbnRzSW50ZXJmYWNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2xhc3NJbXBvcnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhY2thZ2VJbXBvcnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpZWxkcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GaWVsZCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRmllbGQvamF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXRob2QvamF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRpYWxpemVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0aWFsaXplciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSW5pdGlhbGl6ZXIvamF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlY2xhcmVkQ2xhc3NlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2RlY2xhcmluZ0NsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlY2xhcmluZ0NsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9kZWNsYXJlZENsYXNzZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YVBhY2thZ2UiIGVUeXBlPSIjLy9KYXZhUGFja2FnZSIKLSAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YVBhY2thZ2UvamF2YUNsYXNzZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXZlbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFFdmVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWxsRXZlbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFFdmVudCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbml0aWFsaXplciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3RhdGljIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvaW5pdGlhbGl6ZXJzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgZVR5cGU9IiMvL0Jsb2NrIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFQYXJhbWV0ZXIiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FUGFyYW1ldGVyIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNBcnJheSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc1JldHVybiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJcyB0aGlzIGEgcmV0dXJuIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEphdmFUeXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRRdWFsaWZpZWROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbWV0ZXJLaW5kIiBlVHlwZT0iIy8vSmF2YVBhcmFtZXRlcktpbmQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU9wZXJhdGlvbiI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gdGhlIGphdmEgY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB0aGUgbWV0aG9kIG5hbWUgYW5kIGl0cyBwYXJhbWV0ZXJzLiBlLmcuICZsdDtjb2RlPiBzZXRGaXJzdE5hbWUoamF2YS5sYW5nLlN0cmluZykgJmx0Oy9jb2RlPiAuJiN4RDsmI3hBOyAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcmFtZXRlciIgZVR5cGU9IiMvL0phdmFQYXJhbWV0ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBQYXJhbWV0ZXIgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJhbWV0ZXJOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UmV0dXJuVHlwZSIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIHJldHVybiB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0UmV0dXJuVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgcmV0dXJuIHR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U2lnbmF0dXJlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC50b1N0cmluZygpLiYjeEQ7JiN4QTsmI3hEOyYjeEE7UmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgTWV0aG9kLiAgVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgdGhlIG1ldGhvZCBhY2Nlc3MgbW9kaWZpZXJzLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUsIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1ldGhvZCwgZm9sbG93ZWQgYnkgYSBwZXJpb2QsIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgbmFtZSwgZm9sbG93ZWQgYnkgYSBwYXJlbnRoZXNpemVkLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbWV0aG9kJ3MgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG1ldGhvZCB0aHJvd3MgY2hlY2tlZCBleGNlcHRpb25zLCB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIHdvcmQgdGhyb3dzIGZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRocm93biBleGNlcHRpb24gdHlwZXMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtGb3IgZXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICBwdWJsaWMgYm9vbGVhbiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KSYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGFjY2VzcyBtb2RpZmllcnMgYXJlIHBsYWNlZCBpbiBjYW5vbmljYWwgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5ICZxdW90O1RoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24mcXVvdDsuICBUaGlzIGlzIHB1YmxpYywgJmx0O3R0PnByb3RlY3RlZCZsdDsvdHQ+IG9yICZsdDt0dD5wcml2YXRlJmx0Oy90dD4gZmlyc3QsIGFuZCB0aGVuIG90aGVyIG1vZGlmaWVycyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAmbHQ7dHQ+YWJzdHJhY3QmbHQ7L3R0PiwgJmx0O3R0PnN0YXRpYyZsdDsvdHQ+LCAmbHQ7dHQ+ZmluYWwmbHQ7L3R0PiwgJmx0O3R0PnN5bmNocm9uaXplZCZsdDsvdHQ+ICZsdDt0dD5uYXRpdmUmbHQ7L3R0Pi4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0dlbmVyYXRlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBzeXN0ZW0gZ2VuZXJhdGVkLiYjeEQ7JiN4QTtUaGlzIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgQGdlbmVyYXRlZCB0YWcgaW4gdGhlIGNvbW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRJc0dlbmVyYXRlZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNldCB0aGUgaXNHZW5lcmF0ZWQgZmxhZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImdlbmVyYXRlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc1ZvaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBhIHZvaWQgcmV0dXJuIHR5cGUgbWV0aG9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWJzdHJhY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hdGl2ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3luY2hyb25pemVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RydWN0b3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXRpYyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YVZpc2liaWxpdHkiIGVUeXBlPSIjLy9KYXZhVmlzaWJpbGl0eUtpbmQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyYW1ldGVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhUGFyYW1ldGVyIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhRXhjZXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL21ldGhvZHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBlVHlwZT0iIy8vQmxvY2siLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmllbGQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FVHlwZWRFbGVtZW50Ij4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgY2xhc3MgdGhhdCB0aGlzIGZpZWxkIGlzIHdpdGhpbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzQXJyYXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBmaWVsZCBhbiBhcnJheSB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXRpYyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YVZpc2liaWxpdHkiIGVUeXBlPSIjLy9KYXZhVmlzaWJpbGl0eUtpbmQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNpZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2b2xhdGlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2ZpZWxkcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbml0aWFsaXplciIgZVR5cGU9IiMvL0Jsb2NrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlR5cGVLaW5kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTkRFRklORUQ9MSBDTEFTUz0yIElOVEVSRkFDRT0zIEVYQ0VQVElPTj00Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJVTkRFRklORUQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNMQVNTIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5URVJGQUNFIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRVhDRVBUSU9OIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCbG9jayI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvdXJjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jsb2NrIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21tZW50IiBlU3VwZXJUeXBlcz0iIy8vQmxvY2siLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9CbG9jayIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFQYWNrYWdlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVBhY2thZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhQ2xhc3NlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhQ2xhc3MiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9qYXZhUGFja2FnZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkphdmFWaXNpYmlsaXR5S2luZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUEFDS0FHRT0xJiN4RDsmI3hBO1BVQkxJQz0yJiN4RDsmI3hBO1BSSVZBVEU9MyYjeEQ7JiN4QTtQUk9URUNURUQ9NCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUFVCTElDIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQUklWQVRFIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUFJPVEVDVEVEIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUEFDS0FHRSIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJKYXZhUGFyYW1ldGVyS2luZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSU49MCYjeEQ7JiN4QTtPVVQ9MSYjeEQ7JiN4QTtJTk9VVD0yJiN4RDsmI3hBO1JFVFVSTj0zIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VUIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5PVVQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSRVRVUk4iIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFEYXRhVHlwZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VDbGFzcyI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldERlZmF1bHRWYWx1ZVN0cmluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnJheVR5cGUiIGVTdXBlclR5cGVzPSIjLy9KYXZhQ2xhc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBhIEphdmEgQXJyYXkgdHlwZSYjeEQ7JiN4QTsgICBGb3IgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlJiN4RDsmI3hBOyAgIHNwZWNpZmllZCBkaXJlY3RseS4gIFRoaXMgd291bGQgcmVxdWlyZSBpbnN0YW50aWF0aW5nIGEgY2hhaW4gb2YgY29tcG9uZW50IHR5cGVzJiN4RDsmI3hBOyAgIHN1Y2ggYXMgU3RyaW5nW11bXVtdW10tPlN0cmluZ1tdW11bXS0+U3RyaW5nW11bXS0+U3RyaW5nW10tPlN0cmluZy4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgVGhlIGNvbXBvbmVudCB0eXBlIHJlbGF0aW9uc2hpcCB3aWxsIGJlIGNvbXB1dGVkIGlmIHRoZSBmaW5hbENvbXBvbmVudFR5cGUmI3hEOyYjeEE7ICBhbmQgYXJyYXkgZGltZW5zaW9ucyBpcyBzcGVjaWZpZWQuJiN4RDsmI3hBOyAmI3hEOyYjeEE7ICBGb3IgdGhpcyByZWFzb24sIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGNyZWF0ZSBpcyB0aHJvdWdoIHRoZSBKYXZhUmVmRmFjdG9yeSBmYWN0b3J5IG1ldGhvZDomI3hEOyYjeEE7ICAgICAgIGNyZWF0ZUFycmF5VHlwZShKYXZhQ2xhc3MgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucykiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmluYWxDb21wb25lbnRUeXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgQXJyYXkgVHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO0luIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZyByZWZsZWN0aW9uLiBJdCB0dXJucyBvdXQgdG8gYmUgbW9zdCBlZmZpY2llbnQgdG8ganVzdCBkbyB0aGlzIGJ5IHRyaW1taW5nIHRoZSBuYW1lLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheS4gJiN4RDsmI3hBOyYjeEQ7JiN4QTtJZiB0aGlzIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXksIHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlIHRoZSBuZXN0ZWQgYXJyYXkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzUHJpbWl0aXZlQXJyYXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBhbiBhcnJheSBvZiBqYXZhIHByaW1pdGl2ZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldENvbXBvbmVudFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXQgdGhlIGNvbXBvbmVudCB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaGVscGVyQ29tcG9uZW50VHlwZSIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcnJheURpbWVuc2lvbnMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tcG9uZW50VHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3NpZmllciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJKVHlwZUphdmFIZWxwZXJzIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgaW50ZXJmYWNlIGlzIGEgY29tbW9uIGludGVyZmFjZSBiZXR3ZWVuIEphdmFDbGFzcyBhbmQgSmF2YURhdGFUeXBlIHBsdXMgc29tZSBjb21tb24gaGVscGVyIG1ldGhvZHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkpUeXBlTGlzdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJqYXZhLnV0aWwuTGlzdCB0eXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFFdmVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RydWN0dXJhbEZlYXR1cmUiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGZkNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YU1vZGVsLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9IiIgbW9kZWxOYW1lPSJKYXZhIiBtb2RlbFBsdWdpbkNsYXNzPSIiIGVkaXRQbHVnaW5DbGFzcz0iamF2YS5wcm92aWRlci5KYXZhRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iamF2YS5wcmVzZW50YXRpb24uSmF2YUVkaXRvclBsdWdpbiIgdXBkYXRlQ2xhc3NwYXRoPSJmYWxzZSIKLSAgICBib29sZWFuRmxhZ3NGaWVsZD0iZUZsYWdzIiBib29sZWFuRmxhZ3NSZXNlcnZlZEJpdHM9IjgiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcamF2YU1vZGVsLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldvcmtzcGFjZVJvb3Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJKYXZhUmVmIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuamVtIiBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiCi0gICAgICBlY29yZVBhY2thZ2U9ImphdmEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iamF2YS5lY29yZSMvL1R5cGVLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL1R5cGVLaW5kL1VOREVGSU5FRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQvQ0xBU1MiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL1R5cGVLaW5kL0lOVEVSRkFDRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vVHlwZUtpbmQvRVhDRVBUSU9OIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJqYXZhLmVjb3JlIy8vSmF2YVZpc2liaWxpdHlLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZC9QVUJMSUMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZC9QUklWQVRFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhVmlzaWJpbGl0eUtpbmQvUFJPVEVDVEVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhVmlzaWJpbGl0eUtpbmQvUEFDS0FHRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kL0lOIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyS2luZC9PVVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXJLaW5kL0lOT1VUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyS2luZC9SRVRVUk4iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iamF2YS5lY29yZSMvL0pUeXBlSmF2YUhlbHBlcnMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImphdmEuZWNvcmUjLy9KVHlwZUxpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2tpbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL3B1YmxpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZmluYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbXBsZW1lbnRzSW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2NsYXNzSW1wb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvcGFja2FnZUltcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9maWVsZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9tZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW5pdGlhbGl6ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZGVjbGFyZWRDbGFzc2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZGVjbGFyaW5nQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvamF2YVBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9ldmVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9hbGxFdmVudHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2lzTmVzdGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkL2ZpZWxkTmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGRFeHRlbmRlZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkRXh0ZW5kZWQvZmllbGROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZE5hbWVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGROYW1lZC9maWVsZE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkc0V4dGVuZGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2QiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2QvbWV0aG9kTmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2QvcGFyYW1ldGVyVHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2RFeHRlbmRlZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZEV4dGVuZGVkL21ldGhvZE5hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kRXh0ZW5kZWQvcGFyYW1ldGVyVHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZHNFeHRlbmRlZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0T25seVNwZWNpZmljTWV0aG9kcyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE9ubHlTcGVjaWZpY01ldGhvZHMvYU1ldGhvZE5hbWVQcmVmaXgiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0T25seVNwZWNpZmljTWV0aG9kcy9leGNsdWRlZE5hbWVzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2QiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2QvbWV0aG9kTmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2QvcGFyYW1ldGVyVHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZHNFeHRlbmRlZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kc05hbWVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kc05hbWVkL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFN1cGVydHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW1wbGVtZW50c0ludGVyZmFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2ltcGxlbWVudHNJbnRlcmZhY2UvaW50ZXJmYWNlVHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW5mb1N0cmluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW5oZXJpdHNGcm9tIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW5oZXJpdHNGcm9tL2phdmFDbGFzcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaXNFeGlzdGluZ1R5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2lzSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9zZXRTdXBlcnR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9zZXRTdXBlcnR5cGUvamF2YWNsYXNzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9Jbml0aWFsaXplciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0luaXRpYWxpemVyL2lzU3RhdGljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9Jbml0aWFsaXplci9qYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9Jbml0aWFsaXplci9zb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2ZpbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvcGFyYW1ldGVyS2luZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2lzQXJyYXkiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9pc1JldHVybiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2dldEphdmFUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvZ2V0UXVhbGlmaWVkTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vTWV0aG9kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2Fic3RyYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9uYXRpdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL3N5bmNocm9uaXplZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvZmluYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2NvbnN0cnVjdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9zdGF0aWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2phdmFWaXNpYmlsaXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9NZXRob2QvcGFyYW1ldGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2phdmFFeGNlcHRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9NZXRob2QvamF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vTWV0aG9kL3NvdXJjZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0UGFyYW1ldGVyIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9NZXRob2QvZ2V0UGFyYW1ldGVyL3BhcmFtZXRlck5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2dldFJldHVyblR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL3NldFJldHVyblR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL01ldGhvZC9zZXRSZXR1cm5UeXBlL3R5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2dldFNpZ25hdHVyZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvaXNHZW5lcmF0ZWQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL3NldElzR2VuZXJhdGVkIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9NZXRob2Qvc2V0SXNHZW5lcmF0ZWQvZ2VuZXJhdGVkIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9pc1ZvaWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0ZpZWxkIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvZmluYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvc3RhdGljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0ZpZWxkL2phdmFWaXNpYmlsaXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0ZpZWxkL3RyYW5zaWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9GaWVsZC92b2xhdGlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vRmllbGQvamF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9GaWVsZC9pbml0aWFsaXplciIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9GaWVsZC9nZXRDb250YWluaW5nSmF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0ZpZWxkL2lzQXJyYXkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0Jsb2NrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vQmxvY2svc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0Jsb2NrL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0Jsb2NrL2NvbnRlbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9Db21tZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL1N0YXRlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhUGFja2FnZS9qYXZhQ2xhc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YURhdGFUeXBlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YURhdGFUeXBlL2dldERlZmF1bHRWYWx1ZVN0cmluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2FycmF5RGltZW5zaW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0FycmF5VHlwZS9jb21wb25lbnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0FycmF5VHlwZS9nZXRGaW5hbENvbXBvbmVudFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2dldENvbXBvbmVudFR5cGVBc0hlbHBlciIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvaXNQcmltaXRpdmVBcnJheSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvc2V0Q29tcG9uZW50VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL3NldENvbXBvbmVudFR5cGUvaGVscGVyQ29tcG9uZW50VHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YUV2ZW50Ii8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9qYXZhYWRhcHRlcnMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvamF2YWFkYXB0ZXJzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDhhODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9qYXZhYWRhcHRlcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL2phdmFhZGFwdGVycy5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkCi0jCi0KLUZhaWxlZF9yZWZsZWN0aW5nX3ZhbHVlc19FUlJPUl8gICAgICAgPSBJV0FWMDAwMkUgRmFpbGVkIHJlZmxlY3RpbmcgdmFsdWVzLgotQ291bGRfTm90X1JlZmxlY3RfTWV0aG9kc19FUlJPUl8gICAgICA9IElXQVYwMDAzRSBDb3VsZCBub3QgcmVmbGVjdCBtZXRob2RzIGZvciB7MH0gYmVjYXVzZSBvbmUgb2YgdGhlIG1ldGhvZHMgcmVmZXJlbmNlcyBhIHR5cGUgdGhhdCBjb3VsZCBub3QgYmUgbG9hZGVkLiAgRXhjZXB0aW9uOiB7MX0KLUNvdWxkX05vdF9SZWZsZWN0X0NvbnN0cnVjdG9yc19FUlJPUl8gPSBJV0FWMDE0MkUgQ291bGQgbm90IHJlZmxlY3QgY29uc3RydWN0b3JzIGZvciB7MH0gYmVjYXVzZSBvbmUgb2YgdGhlIG1ldGhvZHMgcmVmZXJlbmNlcyBhIHR5cGUgdGhhdCBjb3VsZCBub3QgYmUgbG9hZGVkLiAgRXhjZXB0aW9uOiB7MX0KLUNvdWxkX05vdF9SZWZsZWN0X0ZpZWxkc19FUlJPUl8gICAgICAgPSBJV0FWMDE0M0UgQ291bGQgbm90IHJlZmxlY3QgZmllbGRzIGZvciB7MH0gYmVjYXVzZSBvbmUgb2YgdGhlIGZpZWxkcyBpcyBhIHR5cGUgdGhhdCBjb3VsZCBub3QgYmUgbG9hZGVkLiBFeGNlcHRpb246IHsxfQotRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyAgICAgICAgICA9IElXQVYwMTQ0RSBFcnJvciBsb29raW5nIHVwIHR5cGUgezB9LiAgRXhjZXB0aW9uOiB7MX0KLUVycm9yX0ludHJvc3BlY3RpbmdfRmxhZ3NfRVJST1JfICAgICAgPSBJV0FWMDE0NUUgRXJyb3IgaW50cm9zcGVjdGluZyBmbGFncyBvbiB7MH0uICBFeGNlcHRpb246IHsxfQotRXJyb3JfU2V0dGluZ19HZW5GbGFnX0VSUk9SXyAgICAgICAgICA9IElXQVYwMTUzRSBFcnJvciBzZXR0aW5nIHRoZSBnZW5lcmF0ZWQgZmxhZyBvbiB7MH0uICBFeGNlcHRpb246IHsxfQotSmF2YV9JbmhfQ3ljbGVfRVJST1JfICAgICAgICAgICAgICAgICA9IElXQVYwMTU0RSBEZXRlY3RlZCBhbiBpbmhlcml0YW5jZSBjeWNsZSB3aGVuIHswfSB0cnlzIHRvIGV4dGVuZCB7MX0uCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9jb3JlL0pFTVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvY29yZS9KRU1QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjZjI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9jb3JlL0pFTVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSkVNUGx1Z2luLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5FY2xpcHNlTG9nZ2VyOwotCi0KLS8qKgotICogb3JnLmVjbGlwc2UuamVtIHBsdWdpbgotICovCi1wdWJsaWMgY2xhc3MgSkVNUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCXByaXZhdGUgc3RhdGljIEpFTVBsdWdpbiBQTFVHSU47Ci0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCQotCXB1YmxpYyBKRU1QbHVnaW4oKSB7Ci0JCVBMVUdJTiA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSkVNUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIFBMVUdJTjsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlsb2dnZXIgPSBFY2xpcHNlTG9nZ2VyLmdldEVjbGlwc2VMb2dnZXIodGhpcyk7CQkKLQl9Ci0JCi0JcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhQ2xhc3NBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhQ2xhc3NBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Y2JiOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YUNsYXNzQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IElKYXZhQ2xhc3NBZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMjcvMjAwMSAxOjE3OjQ2IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhQ2xhc3NBZGFwdG9yIHsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgaXMgbnVsbCBvciBpZgotICogaXQgaXMgYSBiaW5hcnkgdHlwZS4KLSAqLwotYm9vbGVhbiBpc1NvdXJjZVR5cGVGcm9tQmluYXJ5KCkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBjYW4gYmUgZm91bmQuCi0gKi8KLWJvb2xlYW4gc291cmNlVHlwZUV4aXN0cygpIDsKLQotLyoqCi0gKiBSZWZsZWN0IHRoZSBmaWVsZHMKLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmbGVjdGlvbiBvY2N1cnJlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLWJvb2xlYW4gcmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCk7CQotCi0vKioKLSAqIFJlZmxlY3QgdGhlIG1ldGhvZHMuCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlZmxlY3Rpb24gb2NjdXJyZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1ib29sZWFuIHJlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKTsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YU1ldGhvZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSUphdmFNZXRob2RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDYzMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YU1ldGhvZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElKYXZhTWV0aG9kQWRhcHRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0gCi0KLS8qKgotICogVXNlZCB0byByZWZsZWN0IG1ldGhvZHMKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhTWV0aG9kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBSZWZsZWN0IHRoZSBnZW5lcmF0ZWQgaWYgbmVjZXNzYXJ5LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmbGVjdGlvbiBvY2N1cnJlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKTsKLQkKLQkvKioKLQkgKiBSZWZsZWN0IHRoZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmbGVjdGlvbiBvY2N1cnJlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0ludGVybmFsUmVhZEFkYXB0YWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JbnRlcm5hbFJlYWRBZGFwdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2ZmViNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0ludGVybmFsUmVhZEFkYXB0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEludGVybmFsUmVhZEFkYXB0YWJsZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJbnRlcm5hbFJlYWRBZGFwdGFibGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciB7Ci0vKioKLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBuZWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBtZXRob2QKLSAqIGltcGxlbWVudGF0aW9uczoKLSAqIHB1YmxpYyBPYmplY3QgcHJpbVJlZlZhbHVlKEVPYmplY3QgYSkgewotICoJcmV0dXJuIHN1cGVyLmdldFZhbHVlKGEpOwotICogfQotICogcHVibGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IGEpIHsKLSAqCXJldHVybiBSZWZsZWN0aW9uQWRhcHRvci5nZXRWYWx1ZSh0aGlzLCBhKTsKLSAqIH0KLSAqLwotLy9wdWJsaWMgT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGEpOwotdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiBhQm9vbGVhbik7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFBcnJheVR5cGVSZWZsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM2MjgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkFycmF5VHlwZUltcGw7Ci0KLS8qKgotICogQXJyYXkgdHlwZSByZWZsZWN0aW9uIGFkYXB0ZXIuIFNpbmNlIGFycmF5cyBhcmUgdmVyeSBjb25zdGFudCB3ZSBkb24ndCBuZWVkIGFueSBmYW5jeSByZWZsZWN0aW9uIHRvIHRoZSBzb3VyY2UgdHlwZSAoY2xhc3Mgb2JqZWN0KS4gSXQgcmVhbGx5Ci0gKiBkb2Vzbid0IGRvIGFueXRoaW5nLiBJdCBpcyBqdXN0IGhlcmUgc28gdGhhdCBpdCBleGlzdHMuIEV2ZXJ5dGhpbmcgaXMgY29uc3RhbnQgb3IgZGVwZW5kcyBvbiB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGltcGxlbWVudHMgSUphdmFDbGFzc0FkYXB0b3IgewotCi0JcHVibGljIEphdmFBcnJheVR5cGVSZWZsZWN0aW9uQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNnZXRSZWZsZWN0aW9uU291cmNlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBUaGVyZSBpc24ndCBhbnkgZm9yIGFycmF5cy4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWZsZWN0aW9uU291cmNlKCkgewotCQkvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB2YWxpZCwgc28gd2UgcGFzcyBvbiB0byB1c2UgdGhlIGZpbmFsIGNvbXBvbmVudC4KLQkJQXJyYXlUeXBlIGpoID0gKEFycmF5VHlwZSkgZ2V0VGFyZ2V0KCk7Ci0JCUphdmFIZWxwZXJzIGZjID0gamguZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCXJldHVybiAoZmMuaXNQcmltaXRpdmUoKSB8fCAoKEphdmFDbGFzcykgZmMpLmlzRXhpc3RpbmdUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotCQlBcnJheVR5cGUgamggPSAoQXJyYXlUeXBlKSBnZXRUYXJnZXQoKTsKLQkJSmF2YUhlbHBlcnMgZmMgPSBqaC5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJaWYoZmMuaXNQcmltaXRpdmUoKSkKLQkJICAgIHJldHVybiB0cnVlOwotCQllbHNlIHsKLQkJICAgIEphdmFSZWZsZWN0aW9uQWRhcHRvciByZWZsZWN0aW9uQWRhcHRvciA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoZmMsIFJlZmxlY3Rpb25BZGFwdG9yLlRZUEVfS0VZKTsKLQkJICAgIHJldHVybiAocmVmbGVjdGlvbkFkYXB0b3IgIT0gbnVsbCkgPyByZWZsZWN0aW9uQWRhcHRvci5oYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgOiBmYWxzZTsJCSAgICAKLQkJfSAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yI3JlZmxlY3RWYWx1ZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCUFycmF5VHlwZUltcGwgYXQgPSAoQXJyYXlUeXBlSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gQXJyYXlzIGFyZSBhbHdheXM6Ci0JCS8vCQlmaW5hbAotCQkvLwkJU3VwZXJ0eXBlIG9mIGphdmEubGFuZy5PYmplY3QKLQkJLy8JCWltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZSwgamF2YS5pby5TZXJpYWxpemFibGUKLQkJYXQuc2V0RmluYWwodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlhdC5zZXRTdXBlcnR5cGUoKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJqYXZhLmxhbmcuT2JqZWN0IiwgKEVPYmplY3QpIGdldFRhcmdldCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJTGlzdCBsaXN0ID0gYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXNHZW4oKTsKLQkJbGlzdC5hZGQoSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIikpOyAvLyROT04tTkxTLTEkCi0JCWxpc3QuYWRkKEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5pby5TZXJpYWxpemFibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQlBcnJheVR5cGVJbXBsIGF0ID0gKEFycmF5VHlwZUltcGwpIGdldFRhcmdldCgpOwotCQlhdC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yI2lzU291cmNlVHlwZUZyb21CaW5hcnkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291cmNlVHlwZUZyb21CaW5hcnkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YUNsYXNzQWRhcHRvciNyZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YUNsYXNzQWRhcHRvciNyZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yI3NvdXJjZVR5cGVFeGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNvdXJjZVR5cGVFeGlzdHMoKSB7Ci0JCXJldHVybiBoYXNSZWZsZWN0aW9uU291cmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiMzYwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLy8gTWFpbnRhaW4gYSBtYXBwaW5nIG9mIHRoZSBzb3VyY2Ugb2JqZWN0cyB0byB0aGUgYWRhcHRvcnMgd2hpY2ggaGF2ZQotCS8vIHJlbGZlY3RlZCBmcm9tIHRoZW0uICBUaGlzIGFsbG93cyBhIGZsdXNoIG9wZXJhdGlvbiB0byBmb3JjZSB0aG9zZQotCS8vIGFkYXB0ZXJzIHRvIHJlLXJlZmxlY3QuCi0JcHJvdGVjdGVkIEhhc2hNYXAgcmVmbGVjdGVkID0gbmV3IEhhc2hNYXAoKTsKLQkvKioKLQkgKiBLZXkgZm9yIHRoZSB0eXBlIG9mIGFkYXB0ZXJzIHRoYXQgdGhpcyBmYWN0b3J5IGNyZWF0ZXMuIChVc2VkIGluIGlzRmFjdG9yeUZvclR5cGUoKSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9LRVkgPSBSZWFkQWRhcHRvci5UWVBFX0tFWTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTWFwIHJlZ2lzdGVyUXVldWU7Ci0JcHJvdGVjdGVkIExpc3QgdW5yZWdpc3RlclF1ZXVlOwotLyoqCi0gKiBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCVJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0ZXIgPSBudWxsOwotCUVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKLQlKYXZhUmVmUGFja2FnZSBwYWNrID0gZ2V0SmF2YVJlZlBhY2thZ2UoKTsKLQlpZiAob2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0SmF2YUNsYXNzKCkpCi0JCWFkYXB0ZXIgPSBjcmVhdGVKYXZhQ2xhc3NBZGFwdG9yKHRhcmdldCk7Ci0JZWxzZQotCQlpZiAob2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0QXJyYXlUeXBlKCkpCi0JCQlhZGFwdGVyID0gY3JlYXRlQXJyYXlUeXBlQWRhcHRvcih0YXJnZXQpOwotCQllbHNlCi0JCQlpZiAob2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0TWV0aG9kKCkpCi0JCQkJYWRhcHRlciA9IGNyZWF0ZUphdmFNZXRob2RBZGFwdG9yKHRhcmdldCk7Ci0JCQllbHNlCi0JCQkJaWYgKG9iamVjdC5lQ2xhc3MoKSA9PSBwYWNrLmdldEZpZWxkKCkpCi0JCQkJCWFkYXB0ZXIgPSBjcmVhdGVKYXZhRmllbGRBZGFwdG9yKHRhcmdldCk7Ci0JcmV0dXJuIGFkYXB0ZXI7Ci19Ci0KLXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVBcnJheVR5cGVBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXJldHVybiBuZXcgSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyKHRhcmdldCk7Ci19Ci0KLXByb3RlY3RlZCBhYnN0cmFjdCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhQ2xhc3NBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgOwotcHJvdGVjdGVkIGFic3RyYWN0IFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFGaWVsZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSA7Ci1wcm90ZWN0ZWQgYWJzdHJhY3QgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YU1ldGhvZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSA7Ci0vLyBGbHVzaCB0aGUgYWRhcHRlciBmb3IgYSBzb3VyY2Ugb2JqZWN0Ci1wdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JcmV0dXJuIGRpc0Fzc29jaWF0ZVNvdXJjZShzb3VyY2UsIHRydWUpOwotfQotCi1wdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgc291cmNlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGEgPSAoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSByZWZsZWN0ZWQuZ2V0KHNvdXJjZSk7Ci0JTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7Ci0JaWYgKGEgIT0gbnVsbCkgewotCQlpZiAoZG9Ob3RpZnkpCi0JCQlhLnJlbGVhc2VTb3VyY2VUeXBlKCk7Ci0JCWVsc2UKLQkJCW5vdGlmaWNhdGlvbiA9IGEucmVsZWFzZVNvdXJjZVR5cGVOb05vdGlmaWNhdGlvbigpOwotCX0KLQlyZXR1cm4gbm90aWZpY2F0aW9uOwotfQotcHVibGljIHZvaWQgZmx1c2hBbGwoKSB7fQotLy8gRmx1c2ggdGhlIGFkYXB0ZXIgZm9yIGEgc291cmNlIG9iamVjdAotcHVibGljIHZvaWQgZmx1c2hSZWZsZWN0aW9uKFN0cmluZyBzb3VyY2UpIHt9Ci1wcm90ZWN0ZWQgSmF2YVJlZlBhY2thZ2UgZ2V0SmF2YVJlZlBhY2thZ2UoKSB7Ci0JcmV0dXJuIChKYXZhUmVmUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSk7Ci19Ci1wdWJsaWMgdm9pZCByZWdpc3RlclJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSwgUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRlcikgewotCWlmIChpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQpIHsKLQkJaWYgKHJlZ2lzdGVyUXVldWUgPT0gbnVsbCkKLQkJCXJlZ2lzdGVyUXVldWUgPSBuZXcgSGFzaE1hcCgpOwotCQlyZWdpc3RlclF1ZXVlLnB1dChzb3VyY2UsIGFkYXB0ZXIpOwotCX0gZWxzZQotCQlyZWZsZWN0ZWQucHV0KHNvdXJjZSwgYWRhcHRlcik7Ci19Ci1wdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUmVmbGVjdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JaWYgKGlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCkgewotCQlpZiAodW5yZWdpc3RlclF1ZXVlID09IG51bGwpCi0JCQl1bnJlZ2lzdGVyUXVldWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXVucmVnaXN0ZXJRdWV1ZS5hZGQoc291cmNlKTsKLQl9IGVsc2UKLQkJcmVmbGVjdGVkLnJlbW92ZShzb3VyY2UpOwotfQotcHVibGljIHZvaWQgZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKFN0cmluZyBzb3VyY2UpIHsKLQlkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoc291cmNlLCB0cnVlKTsKLX0KLQotcHVibGljIE5vdGlmaWNhdGlvbiBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHNvdXJjZSwgYm9vbGVhbiBkb05vdGlmeSkgewotCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IHRydWU7Ci0JTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7Ci0JdHJ5IHsKLQkJU3RyaW5nIGlubmVyTmFtZSA9IHNvdXJjZSArICckJzsKLQkJSXRlcmF0b3IgaXQgPSByZWZsZWN0ZWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCVN0cmluZyBrZXk7Ci0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGtleS5lcXVhbHMoc291cmNlKSB8fCBrZXkuc3RhcnRzV2l0aChpbm5lck5hbWUpKSB7Ci0JCQkJYWRhcHRvciA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoa2V5KTsKLQkJCQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChkb05vdGlmeSkKLQkJCQkJCWFkYXB0b3IucmVsZWFzZVNvdXJjZVR5cGUoKTsKLQkJCQkJZWxzZQotCQkJCQkJbm90aWZpY2F0aW9uID0gYWRhcHRvci5yZWxlYXNlU291cmNlVHlwZU5vTm90aWZpY2F0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQl9Ci0JcmV0dXJuIG5vdGlmaWNhdGlvbjsKLX0KLQotcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKSB7Ci0JaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gZmFsc2U7Ci0JaWYgKHVucmVnaXN0ZXJRdWV1ZSAhPSBudWxsICYmICF1bnJlZ2lzdGVyUXVldWUuaXNFbXB0eSgpKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5yZWdpc3RlclF1ZXVlLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWZsZWN0ZWQucmVtb3ZlKHVucmVnaXN0ZXJRdWV1ZS5nZXQoaSkpOwotCQl9Ci0JCXVucmVnaXN0ZXJRdWV1ZS5jbGVhcigpOwotCX0KLQlpZiAocmVnaXN0ZXJRdWV1ZSAhPSBudWxsICYmICFyZWdpc3RlclF1ZXVlLmlzRW1wdHkoKSkgewotCQlJdGVyYXRvciBpdCA9IHJlZ2lzdGVyUXVldWUuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJcmVmbGVjdGVkLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmVnaXN0ZXJRdWV1ZS5jbGVhcigpOwotCX0KLX0KLXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQlyZXR1cm4gVFlQRV9LRVkuZXF1YWxzKHR5cGUpOwotfQotfQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGEwN2Q2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFSZWZsZWN0aW9uQWRhcHRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMyAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozNSAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFSZWZsZWN0aW9uQWRhcHRvciBleHRlbmRzIFJlZmxlY3Rpb25BZGFwdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19NRVRIT0RfREVGQVVMVF9DVE9SID0gU3RyaW5nLnZhbHVlT2YoQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIpICsgU19DT05TVFJVQ1RPUl9UT0tFTjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRUZUX0JSQUNLRVQgPSAiWyI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFNwZWNpYWwgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUuIFRoaXMgaXMgc2VudCBhZ2FpbnN0IGEgSmF2YUNsYXNzIChhcyB0aGUgdGFyZ2V0KSB3aGVuZXZlciBmbHVzaCBvZiB0aGUgcmVmbGVjdGlvbiBvY2N1cnMuIEl0IHdpbGwgYmUKLQkgKiBzZW50IHVuZGVyIHRoZSBub3RpZmljYXRpb24gZXZlbnQgdHlwZSBvZiBSRUZMRUNUSU9OX0VWRU5ULgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBGTFVTSF9SRUZMRUNUSU9OX0VWRU5UID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFY29yZUZhY3RvcnkoKS5jcmVhdGVFQXR0cmlidXRlKCk7Ci0JCi0JLyoqCi0JICogU3BlY2lhbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZS4gVGhpcyBpcyBzZW50IGFnYWluc3QgYSBKYXZhQ2xhc3MgKGFzIHRoZSB0YXJnZXQpIHdoZW5ldmVyIGZsdXNoIG9mIGEgbmV3IGNsYXNzIChpLmUuIAotCSAqIG5vIHNvdXJjZSB3YXMgZm91bmQpIG9mIHRoZSByZWZsZWN0aW9uIG9jY3Vycy4gSXQgd2lsbCBiZQotCSAqIHNlbnQgdW5kZXIgdGhlIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlIG9mIFJFRkxFQ1RJT05fRVZFTlQuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEZMVVNIX05FV19SRUZMRUNUSU9OX0VWRU5UID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFY29yZUZhY3RvcnkoKS5jcmVhdGVFQXR0cmlidXRlKCk7Ci0KLQkvKgotCSAqIEZpbGwgaW4gdGhlIG5hbWUuIE5vdCByZWFsbHkgbmVlZGVkIGJ1dCBpdCB3b3VsZCBiZSBuaWNlLgotCSAqLwotCXN0YXRpYyB7Ci0JCUZMVVNIX1JFRkxFQ1RJT05fRVZFTlQuc2V0TmFtZSgiZmx1c2hSZWZsZWN0ZWRWYWx1ZXMiKTsgICAgLy8kTk9OLU5MUy0xJAotCQlGTFVTSF9ORVdfUkVGTEVDVElPTl9FVkVOVC5zZXROYW1lKCJmbHVzaE5ld1JlZmxlY3RlZFZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZsdXNoZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZsdXNoaW5nID0gZmFsc2U7Ci0vKioKLSAqIEphdmFSZWZsZWN0aW9uQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEphdmFSZWZsZWN0aW9uQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIHRhcmdldCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcgotICovCi1wdWJsaWMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyIHRhcmdldCkgewotCXN1cGVyKHRhcmdldCk7Ci19Ci0vKioKLSAqIGNyZWF0ZUJsb2NrIC0gaW5zdGFudGlhdGUgYSBCbG9jayBjb250YWluaW5nIHRoZSBwYXNzZWQgc291cmNlCi0gKi8KLXB1YmxpYyBCbG9jayBjcmVhdGVCbG9jayhTdHJpbmcgbmFtZSwgU3RyaW5nIHNvdXJjZVN0cmluZykgewotCUJsb2NrIG5ld0Jsb2NrID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVCbG9jaygpOwotCW5ld0Jsb2NrLnNldE5hbWUobmFtZSArICJfIiArICJibG9jayIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JbmV3QmxvY2suc2V0U291cmNlKHNvdXJjZVN0cmluZyk7Ci0JcmV0dXJuIG5ld0Jsb2NrOwotfQotLyoqCi0gKiBzZXRTdXBlciAtIHNldCBvdXIgc3VwZXJ0eXBlIGhlcmUsIGltcGxlbWVudGVkIGludGVyZmFjZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5Ci0gKi8KLXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JSmF2YUNsYXNzIHJlZiA9IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5jcmVhdGVKYXZhQ2xhc3MoKTsKLSAgIEphdmFVUkwgamF2YXVybCA9IG5ldyBKYXZhVVJMKHRhcmdldE5hbWUpOwotICAoKEludGVybmFsRU9iamVjdCkgcmVmKS5lU2V0UHJveHlVUkkoVVJJLmNyZWF0ZVVSSShqYXZhdXJsLmdldEZ1bGxTdHJpbmcoKSkpOwotICAgcmV0dXJuIHJlZjsKLX0KLS8qKgotICogY3JlYXRlSmF2YVBhcmFtZXRlciAtIGluc3RhbnRpYXRlIGEgSmF2YSBQYXJhbWV0ZXIgYmFzZWQgb24gdGhlIHBhc3NlZCBuYW1lIGFuZCB0eXBlIG5hbWUgKGEgc2ltcGxlIG5hbWUsIE5PVCBBIFNJR05BVFVSRSEhISkKLSAqIFRoZSBpZCBmb3IgYSBwYXJhbWV0ZXIgaGFzIHRvIGJlIGNvbXBsZXggaW4gb3JkZXIgdG8gYmUgcGFyc2FibGUgaW50byBjbGFzcywgbWV0aG9kLCBhbmQgcGFybS4KLSAqIEl0IGlzIGNyZWF0ZWQgYnkgYXBwZW5kaW5nIHRoZSBwYXJtIG5hbWUgdG8gdGhlIG1ldGhvZCBpZCwgd2l0aCBhIGtub3duIHNlcGFyYXRvci4KLSAqIEl0IHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSAiRm9vLmRvU29tZXRoaW5nKGphdmEubGFuZy5JbnRlZ2VyLWFyZzAiCi0gKi8KLXB1YmxpYyBKYXZhUGFyYW1ldGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXIoTWV0aG9kIHBhcmVudE1ldGhvZCwgU3RyaW5nIHBhcm1OYW1lLCBTdHJpbmcgcGFybVR5cGVOYW1lKSB7Ci0JSmF2YVBhcmFtZXRlciBuZXdQYXJtID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0JaWYgKHBhcm1OYW1lIT1udWxsKQotCSAgIG5ld1Bhcm0uc2V0TmFtZShwYXJtTmFtZSk7Ci0vLyAoKEludGVybmFsRU9iamVjdCluZXdQYXJtKS5lU2V0SUQocGFyZW50TWV0aG9kLmVJRCgpICsgQ19NRVRIT0RJRF9QQVJNSURfREVMSU1JVEVSICsgcGFybU5hbWUpOwotCVN0cmluZyBjbGFzc1JlZlN0cmluZyA9IHBhcm1UeXBlTmFtZTsKLQluZXdQYXJtLnNldEVUeXBlKGNyZWF0ZUphdmFDbGFzc1JlZihjbGFzc1JlZlN0cmluZykpOwotCXJldHVybiBuZXdQYXJtOwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgZGltZW5zaW9ucyBmb3IgYSB0eXBlTmFtZS4KLSAqIEZvciBleGFtcGxlICJmb29bXVtdIiB3b3VsZCByZXR1cm4gYSBMaXN0IG9mIEludGVnZXJzCi0gKiAxLCAxLiAgQXQgc29tZSBwb2ludCB3ZSBtYXkgd2FudCB0byBhY3R1YWxseSBjYXB0dXJlIHRoZSBzaXplCi0gKiBmb3IgRmllbGRzIGJ1dCB3ZSB3b3VsZCBuZWVkIHRoZSBpbml0aWFsaXplciBzb3VyY2UgdG8gZGV0ZXJtaW5lIHRoYXQuCi0gKi8KLXB1YmxpYyBMaXN0IGdldEFycmF5RGltZW5zaW9ucyhTdHJpbmcgdHlwZU5hbWUpIHsKLQlMaXN0IGRpbWVuc2lvbnMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCWlmICh0eXBlTmFtZSAhPSBudWxsKSB7Ci0JCWludCBiZWdpbiA9IDA7Ci0JCWludCBpbmRleCA9IC0xOwotCQl3aGlsZSAoYmVnaW4gPCB0eXBlTmFtZS5sZW5ndGgoKSkgewotCQkJaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKExFRlRfQlJBQ0tFVCwgYmVnaW4pOwotCQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCQlkaW1lbnNpb25zLmFkZChuZXcgSW50ZWdlcigxKSk7Ci0JCQkJYmVnaW4gPSBpbmRleCArIDE7Ci0JCQl9IGVsc2UgewotCQkJCWJlZ2luID0gdHlwZU5hbWUubGVuZ3RoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGRpbWVuc2lvbnM7Ci19Ci0vKiBHZXQgdGhlIEphdmEgRmFjdG9yeQotICovCi1wcm90ZWN0ZWQgc3RhdGljIEphdmFSZWZGYWN0b3J5IGdldEphdmFGYWN0b3J5KCkgewotCXJldHVybiAoKG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlLmVOU19VUkkpKS5nZXRKYXZhUmVmRmFjdG9yeSgpOwotfQotcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCk7Ci0vKioKLSAqIGdldFR5cGVOYW1lc0Zyb21NZXRob2RVVUlEIC0gUHVsbCB0aGUgcGFybSB0eXBlIG5hbWVzIG91dCBvZiBhIG1ldGhvZCBJRAotICogCQlJdCB3aWxsIGJlIGluIHRoZSBmb3JtOiAic2ltcGxlY2xhc3MubWV0aG9kTmFtZShjb20uZnJvbmsuUGFybTFfdHlwZSxwYXJtMnR5cGUiCi0gKi8KLXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKFN0cmluZyBtZXRob2RJRCkgewotCWlmIChtZXRob2RJRC5jaGFyQXQobWV0aG9kSUQubGVuZ3RoKCktMSkgPT0gQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIgfHwgbWV0aG9kSUQuZW5kc1dpdGgoQ19NRVRIT0RfREVGQVVMVF9DVE9SKSkKLQkJcmV0dXJuIGVtcHR5U3RyaW5nQXJyYXk7Ci0JCQotCS8vIENvdW50IHRoZSBwYXJtcyBmaXJzdC4gIFRoZSBudW1iZXIgb2YgcGFybXMgaXMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAnLCcgKyAxCi0JaW50IG51bVBhcm1zID0gMTsKLQlpbnQgcG9zID0gLTE7Ci0JLy8gU2tpcCB0aGUgJy4nIGFmdGVyIGNsYXNzbmFtZQotCXBvcyA9IG1ldGhvZElELmluZGV4T2YoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSLCArK3Bvcyk7Ci0JLy8gTG9vayBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBwYXJtcwotCWludCBwYXJtUG9zID0gbWV0aG9kSUQuaW5kZXhPZihDX01FVEhPRF9QQVJNX0RFTElNSVRFUiwgKytwb3MpOwotCXBvcyA9IHBhcm1Qb3M7Ci0Jd2hpbGUgKChwb3MgPSBtZXRob2RJRC5pbmRleE9mKENfUEFSTV9QQVJNX0RFTElNSVRFUiwgKytwb3MpKSAhPSAtMSkKLQkJbnVtUGFybXMrKzsKLQlTdHJpbmdbXSBwYXJtVHlwZU5hbWVzID0gbmV3IFN0cmluZ1tudW1QYXJtc107Ci0JLy8gbm93IGNvbGxlY3QgdGhlIHBhcm0gbmFtZXMKLQkvLyBza2lwIHRoZSBtZXRob2QgbmFtZQotCXBvcyA9IHBhcm1Qb3M7Ci0JaW50IGkgPSAwLCBlbmQ7Ci0JZG8gewotCQllbmQgPSBtZXRob2RJRC5pbmRleE9mKENfUEFSTV9QQVJNX0RFTElNSVRFUiwgcG9zICsgMSk7Ci0JCS8vIFRoaXMgaXMgdGhlIGxhc3QgcGFyYW1ldGVyLCB3ZSBtYXkgbmVlZCB0byBzdHJpcCBhIHRyYWlsaW5nICZWIGZvciBhIGNvbnN0cnVjdG9yCi0JCWlmIChlbmQgPT0gLTEpCi0JCQllbmQgPSBtZXRob2RJRC5pbmRleE9mKFNfQ09OU1RSVUNUT1JfVE9LRU4sIHBvcyArIDEpOwotCQkvLyBvdGhlcndpc2UgdGFrZSB0aGUgcmVzdCBvZiB0aGUgSUQKLQkJaWYgKGVuZCA9PSAtMSkKLQkJCWVuZCA9IG1ldGhvZElELmxlbmd0aCgpOwotCQlwYXJtVHlwZU5hbWVzW2krK10gPSBtZXRob2RJRC5zdWJzdHJpbmcocG9zICsgMSwgZW5kKTsKLQl9IHdoaWxlICgocG9zID0gbWV0aG9kSUQuaW5kZXhPZihDX1BBUk1fUEFSTV9ERUxJTUlURVIsICsrcG9zKSkgIT0gLTEpOwotCXJldHVybiBwYXJtVHlwZU5hbWVzOwotfQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpOwotCi1wdWJsaWMgYm9vbGVhbiBoYXNSZWZsZWN0aW9uU291cmNlKCkgewotICAgIHJldHVybiBnZXRSZWZsZWN0aW9uU291cmNlKCkgIT0gbnVsbDsKLX0KLQotLyoqCi0gKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4KLSAqCi0gKi8KLXB1YmxpYyB2b2lkIHJlbGVhc2VTb3VyY2VUeXBlKCl7Ci19Ci0KLS8qKgotICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gKiBAcmV0dXJuCi0gKi8KLXB1YmxpYyBOb3RpZmljYXRpb24gcmVsZWFzZVNvdXJjZVR5cGVOb05vdGlmaWNhdGlvbigpIHsKLQlyZXR1cm4gbnVsbDsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2VTb3VyY2VUeXBlKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQlpZiAoamF2YUNsYXNzID09IG51bGwpCi0JCXJldHVybjsKLQotCUphdmFSZWZsZWN0aW9uQWRhcHRvciBleGlzdGluZyA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJldHJpZXZlQWRhcHRvckZyb20oamF2YUNsYXNzKTsKLQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKLQkJZXhpc3RpbmcucmVsZWFzZVNvdXJjZVR5cGUoKTsKLX0KLS8qCi0gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYSBGaWVsZCBBZGFwdG9yIHRvIHNldCB0aGUgdHlwZSBvZiBhRmllbGQKLSAqIHRvIGJlIGFUeXBlTmFtZS4gIGFUeXBlTmFtZSBtYXkgY29udGFpbiBhcnJheSBicmFja2V0cyB3aGljaCBuZWVkCi0gKiB0byBiZSBkZXRlY3RlZCBpbiBvcmRlciB0byBzZXQgdGhlIGFycmF5IGRpbWVuc2lvbnMgb24gYUZpZWxkLgotICovCi1wcm90ZWN0ZWQgdm9pZCBzZXRGaWVsZFR5cGUoRmllbGQgYUZpZWxkLCBTdHJpbmcgYVR5cGVOYW1lKSB7Ci0JaWYgKGFGaWVsZCAhPSBudWxsICYmIGFUeXBlTmFtZSAhPSBudWxsKSB7Ci0JCVN0cmluZyBjbGFzc1JlZlN0cmluZyA9IGFUeXBlTmFtZTsKLQkJYUZpZWxkLnNldEVUeXBlKGNyZWF0ZUphdmFDbGFzc1JlZihjbGFzc1JlZlN0cmluZykpOwotCX0KLX0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoKSB7Ci0JcmV0dXJuIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoZmFsc2UpOwotfQotcHVibGljIGZpbmFsIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQlOb3RpZmljYXRpb24gbm90ID0gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpOwotCWlmIChub3QgIT0gbnVsbCkKLQkJZ2V0VGFyZ2V0KCkuZU5vdGlmeShub3QpOwotCXJldHVybiBoYXNGbHVzaGVkOwotfQotCi1wdWJsaWMgc3luY2hyb25pemVkIE5vdGlmaWNhdGlvbiBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JaWYgKCFoYXNGbHVzaGVkICYmICFpc0ZsdXNoaW5nKSB7Ci0JCWJvb2xlYW4gaXNFeGlzdGluZyA9IGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKTsKLQkJdHJ5IHsKLQkJCWlzRmx1c2hpbmcgPSB0cnVlOwotCQkJaGFzUmVmbGVjdGVkID0gZmFsc2U7Ci0JCQloYXNGbHVzaGVkID0gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoY2xlYXJDYWNoZWRNb2RlbE9iamVjdCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQloYXNGbHVzaGVkID0gZmFsc2U7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKQotCQkJCXRocm93IChFcnJvcikgZTsKLQkJCWVsc2UKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpc0ZsdXNoaW5nID0gZmFsc2U7Ci0JCQlwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShpc0V4aXN0aW5nKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlRmx1c2hOb3RpZmljYXRpb24oaXNFeGlzdGluZyk7Ci0JfQotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIEBwYXJhbSBpc0V4aXN0aW5nCi0gKiBAcmV0dXJuCi0gKi8KLXByb3RlY3RlZCBOb3RpZmljYXRpb24gY3JlYXRlRmx1c2hOb3RpZmljYXRpb24oYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBpc0V4aXN0aW5nID8gRkxVU0hfUkVGTEVDVElPTl9FVkVOVCA6IEZMVVNIX05FV19SRUZMRUNUSU9OX0VWRU5UOwotCXJldHVybiBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClnZXRUYXJnZXQoKSxFVkVOVCwgZmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGlzRXhpc3RpbmcpIHsKLX0KLS8qKgotICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGNsZWFyaW5nIG9mIHRoZSB2YWx1ZXMuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciByZWZsZWN0aW9uIGhhZCBvY2N1cnJlZC4KLSAqLwotcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkgewotCWlmIChpc0ZsdXNoaW5nKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHN1cGVyLnJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotfQotCi0vKioKLSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQKLSAqLwotcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQloYXNGbHVzaGVkID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25LZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25LZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyYjIzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFSZWZsZWN0aW9uS2V5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uOwotCi0vKioKLSAqIFRoaXMga2V5IGhhbmRsZXMgSmF2YSBSZWZsZWN0aW9uLiBJdCBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIGVudHJpZXMgaWYKLSAqIHRoZXkgYXJlIG5vdCBhbHJlYWR5IGluIHRoZSByZXNvdXJjZS4gVGhlcmUgaXMgYW4gZXh0ZW5zaW9uIG1lY2hhbmlzbSBmb3Igb3RoZXIKLSAqIHR5cGVzIG9mIGlkcyB0aGF0IGFyZSBub3QgcmVjb2duaXplZCBieSB0aGlzIGtleS4gVGhleSBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZQotICogSmF2YVhNSUZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGVzZSBrZXlzLCBhbmQgdGhlIGZhY3Rvcnkgd2lsbCBwYXNzIGluCi0gKiBhIExpc3Qgb2YgdGhlc2UgcmVnaXN0ZXJlZCBleHRlbnNpb24gcHJvY2Vzc2VycyAoSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKS4KLSAqIAotICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA4OjI0OjM2IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZmxlY3Rpb25LZXkgaW1wbGVtZW50cyBJSmF2YVJlZmxlY3Rpb25LZXkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUFJJTUlUSVZFUyA9IG5ldyBBcnJheUxpc3QoOCk7Ci0KLQlzdGF0aWMgeyBpbml0aWFsaXplUHJpbWl0aXZlc0NvbGxlY3Rpb24oKTsgfQotCQotCXByb3RlY3RlZCBKYXZhWE1JRmFjdG9yeUltcGwuSmF2YVhNSVJlc291cmNlIHJlc291cmNlOyAvL0ZCCi0JcHJvdGVjdGVkIExpc3QgZXh0ZW5zaW9uczsKLQotcHVibGljIEphdmFSZWZsZWN0aW9uS2V5KExpc3QgZXh0ZW5zaW9ucywgSmF2YVhNSUZhY3RvcnlJbXBsLkphdmFYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci19Ci0vL0ZCIEVORAotCi0vKiAKLSAqIENyZWF0ZSBhbiBBcnJheVR5cGUgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjY3JlYXRlQXJyYXlUeXBlKCkKLSAqLwotcHVibGljIEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoKSB7Ci0JcmV0dXJuIGdldEphdmFGYWN0b3J5KCkuY3JlYXRlQXJyYXlUeXBlKCk7Ci19Ci0vKiAKLSAqIENyZWF0ZSBhIEphdmFDbGFzcyBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVKYXZhQ2xhc3MoKQotICovCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzcygpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVKYXZhQ2xhc3MoKTsKLX0KLS8qKgotICogQ3JlYXRlIGEgZGF0YSB0eXBlIGFuZCBwdXQgaXQgaW4gdGhlIHByaW1pdGl2ZXMgcmVzb3VyY2UKLSAqLwotcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGdldEphdmFEYXRhVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQlKYXZhRGF0YVR5cGUgcmVzdWx0ID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVKYXZhRGF0YVR5cGUoKTsKLQlyZXN1bHQuc2V0TmFtZSh0eXBlTmFtZSk7Ci0JLy8gKChJbnRlcm5hbEVPYmplY3QpcmVzdWx0KS5lU2V0SUQodHlwZU5hbWUpOwotCS8vcmVzdWx0LmVTZXRVVUlEKChVVUlEKSBudWxsKTsKLQkvL3Jlc3VsdC5zZXRFUGFja2FnZShnZXRQYWNrYWdlKCkpOwotCWdldFBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcnMoKS5hZGQocmVzdWx0KTsKLQlyZXNvdXJjZS5zZXRJRChyZXN1bHQsIHR5cGVOYW1lKTsJCi0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qIAotICogQ3JlYXRlIGEgRmllbGQgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjY3JlYXRlSmF2YUZpZWxkKCkKLSAqLwotcHVibGljIEZpZWxkIGNyZWF0ZUphdmFGaWVsZCgpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVGaWVsZCgpOwotfQotLyogCi0gKiBDcmVhdGUgYSBNZXRob2QgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjY3JlYXRlSmF2YU1ldGhvZCgpCi0gKi8KLXB1YmxpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZCgpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLX0KLS8qIAotICogQ3JlYXRlIGEgSmF2YVBhcmFtZXRlciBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVKYXZhUGFyYW1ldGVyKCkKLSAqLwotcHVibGljIEphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcigpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci19Ci0vL0ZCLyoqCi0vL0ZCICogT3ZlcnJpZGUgdG8gdHJ5IHRvIGludHJvc3BlY3Qgb2JqZWN0cwotLy9GQiAqIHRoYXQgYXJlbid0IGZvdW5kIHVzaW5nIHRoZSBkZWZhdWx0IG1lY2hhbmlzbS4KLS8vRkIgKi8KLS8vRkJwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0vL0ZCIAlPYmplY3QgamF2YU9iamVjdCA9IHN1cGVyLmdldChrZXkpOwotLy9GQiAJaWYgKGphdmFPYmplY3QgPT0gbnVsbCkgewotLy9GQiAJCWphdmFPYmplY3QgPSBnZXRPYmplY3RGcm9tRXh0ZW5zaW9ucygoU3RyaW5nKSBrZXkpOwotLy9GQiAJCWlmIChqYXZhT2JqZWN0ID09IG51bGwpCi0vL0ZCIAkJCWphdmFPYmplY3QgPSBnZXRKYXZhT2JqZWN0KChTdHJpbmcpIGtleSk7Ci0vL0ZCIAl9Ci0vL0ZCCXJldHVybiBqYXZhT2JqZWN0OwotLy9GQn0KLQotLy9GQiBBRERFRAotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0KGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBrZXkpIHsKLQlPYmplY3QgamF2YU9iamVjdCA9IGdldE9iamVjdEZyb21FeHRlbnNpb25zKGtleSk7Ci0JaWYgKGphdmFPYmplY3QgPT0gbnVsbCkKLQkJamF2YU9iamVjdCA9IGdldEphdmFPYmplY3Qoa2V5KTsKLQlyZXR1cm4gamF2YU9iamVjdDsKLX0KLS8vRkIgRU5ECi0KLS8qCi0gKiBJbnN0YW50aWF0ZSB0aGUgbmFtZWQgY2xhc3MuCi0gKiBJZiB3ZSBtYWtlIGl0IHRvIHRoaXMgcG9pbnQsIHRoZSBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGluc3RhbnRpYXRlZCBvciByZWZsZWN0ZWQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2dldEFycmF5VHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgRUNsYXNzaWZpZXIgZ2V0QXJyYXlUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCUFycmF5VHlwZSBhcnJheVR5cGUgPSB0aGlzLmNyZWF0ZUFycmF5VHlwZSgpOwotCWFycmF5VHlwZS5zZXROYW1lKHR5cGVOYW1lKTsKLQkvLyAoKEludGVybmFsRU9iamVjdClhcnJheVR5cGUpLmVTZXRJRCh0eXBlTmFtZSk7Ci0JLy9hcnJheVR5cGUuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCWludCBwb3MgPSAtMSwgYnJhY2VzID0gMDsKLQlkbyB7Ci0JCXBvcyA9IHR5cGVOYW1lLmluZGV4T2YoIlsiLCBwb3MrMSk7Ly8kTk9OLU5MUy0xJAotCQlpZiAocG9zICE9IC0xKQotCQkJYnJhY2VzKys7Ci0JfSB3aGlsZSAocG9zICE9IC0xKTsKLQlhcnJheVR5cGUuc2V0QXJyYXlEaW1lbnNpb25zKGJyYWNlcyk7Ci0JLy9hcnJheVR5cGUuc2V0RVBhY2thZ2UoZ2V0UGFja2FnZSgpKTsKLQlnZXRQYWNrYWdlKCkuZ2V0RUNsYXNzaWZpZXJzKCkuYWRkKGFycmF5VHlwZSk7Ci0JcmVzb3VyY2Uuc2V0SUQoYXJyYXlUeXBlLCB0eXBlTmFtZSk7CQotCXJldHVybiBhcnJheVR5cGU7Ci19Ci0vKgotICogSW5zdGFudGlhdGUgdGhlIG5hbWVkIGNsYXNzLgotICogSWYgd2UgbWFrZSBpdCB0byB0aGlzIHBvaW50LCB0ZWggY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQgb3IgcmVmbGVjdGVkLgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXRKYXZhQ2xhc3MoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIEVDbGFzc2lmaWVyIGdldEphdmFDbGFzcyhTdHJpbmcgdHlwZU5hbWUpIHsKLQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gdGhpcy5jcmVhdGVKYXZhQ2xhc3MoKTsKLQlqYXZhQ2xhc3Muc2V0TmFtZSh0eXBlTmFtZSk7Ci0JLy8gKChJbnRlcm5hbEVPYmplY3QpamF2YUNsYXNzKS5lU2V0SUQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JLy9qYXZhQ2xhc3MuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCS8vIGphdmFDbGFzcy5zZXRFUGFja2FnZShnZXRQYWNrYWdlKCkpOwotCWdldFBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcnMoKS5hZGQoamF2YUNsYXNzKTsKLQlyZXNvdXJjZS5zZXRJRChqYXZhQ2xhc3MsIHR5cGVOYW1lKTsKLQlyZXR1cm4gamF2YUNsYXNzOwotfQotLyogR2V0IHRoZSBKYXZhIEZhY3RvcnkKLSAqLwotcHJvdGVjdGVkIHN0YXRpYyBKYXZhUmVmRmFjdG9yeSBnZXRKYXZhRmFjdG9yeSgpIHsKLQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFOwotfQotLyoqCi0gKiBUaGlzIGFsbG93cyBmb3IgdGhlIGRpcmVjdCByZXRyaWV2YWwgb2YgZmllbGRzIHdpdGggdGhlIGZvbGxvd2luZyBub3RhdGlvbjoKLSAqIGZpZWxkOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvbwotICogCi0gKi8KLXByb3RlY3RlZCBGaWVsZCBnZXRKYXZhRmllbGQoU3RyaW5nIGtleVZhbHVlKSB7Ci0JRmllbGQgcmVzdWx0ID0gbnVsbDsKLQlTdHJpbmcgY2xhc3NOYW1lLCBtZW1iZXJOYW1lOwotCWludCBtZW1iZXJEZWxpbWl0ZXIgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JY2xhc3NOYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKDAsIG1lbWJlckRlbGltaXRlcik7Ci0JbWVtYmVyTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZyhtZW1iZXJEZWxpbWl0ZXIgKyAxKTsKLQlFQ2xhc3NpZmllciBqYXZhQ2xhc3MgPSAoRUNsYXNzaWZpZXIpIHByaW1HZXQoY2xhc3NOYW1lKTsKLQkvLyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgaW5zdGFudGlhdGVkIHRoZSBjb250YWluaW5nIGNsYXNzLCB0aGVuIGdvIGRvIGl0LgotCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkKLQkJamF2YUNsYXNzID0gZ2V0SmF2YVR5cGUoY2xhc3NOYW1lKTsKLQlpZiAoKGphdmFDbGFzcyAhPSBudWxsKSAmJiAhKChKYXZhSGVscGVycykgamF2YUNsYXNzKS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCS8vIFdlIGhhdmUgYSBjbGFzcy4gTm93IHdlIG5lZWQgdG8gZm9yY2UgcmVmbGVjdGlvbiwgdGhpcyB3aWxsIGNhdXNlCi0JCS8vIHRoZSBKYXZhUmVmbGVjdGlvbktleSB0byBiZSB1cGRhdGVkIGFuZCBoYXZlIHRoZSBtZW1iZXIgYWRkZWQgdG8gdGhlCi0JCS8vIGxpc3QuCi0JCSgoSmF2YUNsYXNzKSBqYXZhQ2xhc3MpLmdldEZpZWxkcygpOwotCQkvL0ZCIHJlc3VsdCA9IChGaWVsZCkgc3VwZXIuZ2V0KGtleVZhbHVlKTsgLy8gSXQgc2hvdWxkIG5vdyBiZSByZWdpc3RlcmVkLgotCQlyZXN1bHQgPSAoRmllbGQpIHByaW1HZXQoa2V5VmFsdWUpOyAvLyBJdCBzaG91bGQgbm93IGJlIHJlZ2lzdGVyZWQuCi0JCQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCUZpZWxkIHRlbXBGaWVsZCA9IGNyZWF0ZUphdmFGaWVsZCgpOwotCQkJdGVtcEZpZWxkLnNldE5hbWUobWVtYmVyTmFtZSk7Ci0JCQkvLyAoKEludGVybmFsRU9iamVjdCl0ZW1wRmllbGQpLmVTZXRJRChrZXlWYWx1ZSk7Ci0JCQkvL3RlbXBGaWVsZC5lU2V0VVVJRCgoVVVJRCkgbnVsbCk7Ci0JCQkoKEphdmFDbGFzcykgamF2YUNsYXNzKS5nZXRGaWVsZHMoKS5hZGQodGVtcEZpZWxkKTsKLQkJCXJlc3VsdCA9IHRlbXBGaWVsZDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBUaGlzIGFsbG93cyBmb3IgdGhlIHJldHJpZXZhbCBvZiBtZXRob2RzIHdpdGggdGhlIGZvbGxvd2luZyBub3RhdGlvbjoKLSAqIG1ldGhvZDogamF2YTovY29tLmlibS5mb28jVGVzdC5mb29mb28oCi0gKiAKLSAqLwotcHJvdGVjdGVkIE1ldGhvZCBnZXRKYXZhTWV0aG9kKFN0cmluZyBrZXlWYWx1ZSkgewotCU1ldGhvZCByZXN1bHQgPSBudWxsOwotCVN0cmluZyBjbGFzc05hbWUsIG1lbWJlck5hbWU7Ci0JaW50IG1lbWJlckRlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQljbGFzc05hbWUgPSBrZXlWYWx1ZS5zdWJzdHJpbmcoMCwgbWVtYmVyRGVsaW1pdGVyKTsKLQlpbnQgcGFybURlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIsIG1lbWJlckRlbGltaXRlcik7Ci0JbWVtYmVyTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZyhtZW1iZXJEZWxpbWl0ZXIgKyAxLCBwYXJtRGVsaW1pdGVyKTsKLQlFQ2xhc3NpZmllciBqYXZhQ2xhc3MgPSAoRUNsYXNzaWZpZXIpIHByaW1HZXQoY2xhc3NOYW1lKTsKLQkvLyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgaW5zdGFudGlhdGVkIHRoZSBjb250YWluaW5nIGNsYXNzLCB0aGVuIGdvIGRvIGl0LgotCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkKLQkJamF2YUNsYXNzID0gZ2V0SmF2YVR5cGUoY2xhc3NOYW1lKTsKLQlpZiAoKGphdmFDbGFzcyAhPSBudWxsKSAmJiAhKChKYXZhSGVscGVycykgamF2YUNsYXNzKS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCS8vIFdlIGhhdmUgYSBjbGFzcy4gTm93IHdlIG5lZWQgdG8gZm9yY2UgcmVmbGVjdGlvbiwgdGhpcyB3aWxsIGNhdXNlCi0JCS8vIHRoZSBKYXZhUmVmbGVjdGlvbktleSB0byBiZSB1cGRhdGVkIGFuZCBoYXZlIHRoZSBtZW1iZXIgYWRkZWQgdG8gdGhlCi0JCS8vIGxpc3QuCi0JCSgoSmF2YUNsYXNzKSBqYXZhQ2xhc3MpLmdldE1ldGhvZHMoKTsKLQkJcmVzdWx0ID0gKE1ldGhvZCkgcHJpbUdldChrZXlWYWx1ZSk7IC8vIEl0IHNob3VsZCBub3cgYmUgcmVnaXN0ZXJlZC4KLQkJCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJTWV0aG9kIHRlbXBNZXRob2QgPSBjcmVhdGVKYXZhTWV0aG9kKCk7Ci0JCQl0ZW1wTWV0aG9kLnNldE5hbWUobWVtYmVyTmFtZSk7Ci0JCQlyZXNvdXJjZS5zZXRJRCh0ZW1wTWV0aG9kLCBrZXlWYWx1ZSk7Ci0JCQkoKEphdmFDbGFzcykgamF2YUNsYXNzKS5nZXRNZXRob2RzKCkuYWRkKHRlbXBNZXRob2QpOwotCQkJcmVzdWx0ID0gdGVtcE1ldGhvZDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0SmF2YU9iamVjdChqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgRU9iamVjdCBnZXRKYXZhT2JqZWN0KFN0cmluZyBrZXlWYWx1ZSkgewotCUVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQlpbnQgaW5kZXggPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JaWYgKGluZGV4ID4gMCkgewotCQkvLyBUaGUgcmVmZXJlbmNlIGlzIHRvIGEgbWVtYmVyOiBmaWVsZCwgbWV0aG9kLCBvciBwYXJhbWV0ZXIuCi0JCS8vIFRha2UgdGhlIG1vc3Qgc3BlY2lmaWMgY2FzZSBmaXJzdCwgYSBwYXJhbWV0ZXIuCi0JCS8vIE9ubHkgYSBwYXJhbWV0ZXIgc2hvdWxkIGNvbnRhaW4gdGhlIG1ldGhvZElEIHRvIHBhcm1JRCBkZWxpbWl0ZXIuCi0JCWJvb2xlYW4gaXNQYXJhbWV0ZXIgPSAoa2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX01FVEhPRElEX1BBUk1JRF9ERUxJTUlURVIsIGluZGV4KSAhPSAtMSk7Ci0JCWlmIChpc1BhcmFtZXRlcikgewotCQkJcmVzdWx0ID0gZ2V0SmF2YVBhcmFtZXRlcihrZXlWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgdGFyZ2V0IGlzIGEgZmllbGQgb3IgbWV0aG9kLiBJZiBpdCBoYXMgYSAiKCIsIHRoZW4gaXQgaXMgYSBtZXRob2QuCi0JCQkvLyBJZiBpdCBpcyBub3QgZm91bmQsIHRoZW4gd2Ugd2lsbCBjcmVhdGUgYSB0ZW1wb3Jhcnkgb2JqZWN0LgotCQkJaW50IHBhcm1TdGFydCA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIsIGluZGV4KTsKLQkJCWJvb2xlYW4gaXNGaWVsZCA9IHBhcm1TdGFydCA9PSAtMTsKLQkJCWlmIChpc0ZpZWxkKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0SmF2YUZpZWxkKGtleVZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZ2V0SmF2YU1ldGhvZChrZXlWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlyZXN1bHQgPSBnZXRKYXZhVHlwZShrZXlWYWx1ZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogU2VlIGlmIHRoZSBleHRlbnNpb25zIGNhbiByZXNvbHZlIHRoaXMgZmlyc3QuCi0gKi8KLXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0RnJvbUV4dGVuc2lvbnMoU3RyaW5nIGtleVZhbHVlKSB7Ci0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24pIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IG9iaiA9IGV4dGVuc2lvbi5nZXRPYmplY3Qoa2V5VmFsdWUsIHRoaXMpOwotCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCXJldHVybiBvYmo7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogVGhpcyBhbGxvd3MgZm9yIHRoZSByZXRyaWV2YWwgb2YgcGFyYW1ldGVycyB3aXRoIHRoZSBmb2xsb3dpbmcgbm90YXRpb246Ci0gKiBwYXJhbWV0ZXI6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vZm9vKC1hcmcwCi0gKiAKLSAqLwotcHJvdGVjdGVkIEphdmFQYXJhbWV0ZXIgZ2V0SmF2YVBhcmFtZXRlcihTdHJpbmcga2V5VmFsdWUpIHsKLQlKYXZhUGFyYW1ldGVyIHJlc3VsdCA9IG51bGw7Ci0JU3RyaW5nIHBhcm1OYW1lOwotCWludCBtZW1iZXJEZWxpbWl0ZXIgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JaW50IHBhcm1EZWxpbWl0ZXIgPSBrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfTUVUSE9ESURfUEFSTUlEX0RFTElNSVRFUiwgbWVtYmVyRGVsaW1pdGVyKTsKLQlwYXJtTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZyhwYXJtRGVsaW1pdGVyICsgMSk7Ci0JLy8gZ2V0TWV0aG9kKCkgd2lsbCBmaW5kIG9yIGNyZWF0ZSBhIG1ldGhvZAotCU1ldGhvZCBtZXRob2QgPSB0aGlzLmdldEphdmFNZXRob2Qoa2V5VmFsdWUuc3Vic3RyaW5nKHBhcm1EZWxpbWl0ZXIpKTsKLQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJcmVzdWx0ID0gbWV0aG9kLmdldFBhcmFtZXRlcihwYXJtTmFtZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJSmF2YVBhcmFtZXRlciB0ZW1wUGFyYW1ldGVyID0gY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotCQkJdGVtcFBhcmFtZXRlci5zZXROYW1lKHBhcm1OYW1lKTsKLQkJCS8vICgoSW50ZXJuYWxFT2JqZWN0KXRlbXBQYXJhbWV0ZXIpLmVTZXRJRChrZXlWYWx1ZSk7Ci0JCQkvLyB0ZW1wUGFyYW1ldGVyLmVTZXRVVUlEKChVVUlEKSBudWxsKTsKLQkJCW1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKHRlbXBQYXJhbWV0ZXIpOwotCQkJcmVzdWx0ID0gdGVtcFBhcmFtZXRlcjsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0SmF2YVR5cGUoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIEVDbGFzc2lmaWVyIGdldEphdmFUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCWlmIChpc1ByaW1pdGl2ZSh0eXBlTmFtZSkpCi0JCXJldHVybiBnZXRKYXZhRGF0YVR5cGUodHlwZU5hbWUpOwotCWVsc2UgaWYgKGlzQXJyYXkodHlwZU5hbWUpKQotCQlyZXR1cm4gZ2V0QXJyYXlUeXBlKHR5cGVOYW1lKTsKLQllbHNlIGlmIChpc1ZhbGlkSmF2YUlkZW50aWZpZXIodHlwZU5hbWUpKQotCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKHR5cGVOYW1lKTsKLQlyZXR1cm4gbnVsbDsKLX0KLQotcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEphdmFJZGVudGlmaWVyKFN0cmluZyB0eXBlTmFtZSkgewotCWlmICh0eXBlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQodHlwZU5hbWUuY2hhckF0KDApKSkgewotCQkJLy8gU3RhcnRzIHdpdGggYSB2YWxpZCBqYXZhIGlkZW50aWZpZXIgY2hhcmFjdGVyLgotCQkJLy8gTm93IHNlZSBpZiB0aGUgcmVzdCBhcmUgdmFsaWQuCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IHR5cGVOYW1lLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydCh0eXBlTmFtZS5jaGFyQXQoaSkpKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIE5vdCB2YWxpZAotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNwcmltR2V0KGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBPYmplY3QgcHJpbUdldChTdHJpbmcga2V5KSB7Ci0JcmV0dXJuIHJlc291cmNlLnByaW1HZXRFT2JqZWN0KGtleSk7Ci19Ci1wcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkvL0ZCIHJldHVybiAoRVBhY2thZ2UpIHN1cGVyLmdldChKYXZhUGFja2FnZS5QQUNLQUdFX0lEKTsKLQkvLyByZXR1cm4gKEVQYWNrYWdlKSByZXNvdXJjZS5nZXRFT2JqZWN0KEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOyAvL0ZCCi0JLy9yZXR1cm4gKEVQYWNrYWdlKSByZXNvdXJjZS5nZXRFT2JqZWN0KEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOyAvL0ZCCi0JcmV0dXJuIChFUGFja2FnZSlFY29yZVV0aWwuZ2V0T2JqZWN0QnlUeXBlKHJlc291cmNlLmdldENvbnRlbnRzKCksIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoKSk7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC80LzIwMDAgOTo1Njo1MyBBTSkKLSAqLwotcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJpbWl0aXZlc0NvbGxlY3Rpb24oKSB7Ci0JUFJJTUlUSVZFUy5hZGQoTl9WT0lEKTsKLQlQUklNSVRJVkVTLmFkZChOX0JPT0xFQU4pOwotCVBSSU1JVElWRVMuYWRkKE5fQllURSk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9DSEFSKTsKLQlQUklNSVRJVkVTLmFkZChOX0RPVUJMRSk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9GTE9BVCk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9JTlQpOwotCVBSSU1JVElWRVMuYWRkKE5fTE9ORyk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9TSE9SVCk7Ci19Ci0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNpc0FycmF5KGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzQXJyYXkoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JcmV0dXJuIHR5cGVOYW1lLmVuZHNXaXRoKCJbXSIpOy8vJE5PTi1OTFMtMSQKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA5OjU0OjIzIEFNKQotICogQHJldHVybiBib29sZWFuCi0gKiBAcGFyYW0gdHlwZU5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wcml2YXRlIGJvb2xlYW4gaXNQcmltaXRpdmUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JcmV0dXJuIFBSSU1JVElWRVMuY29udGFpbnModHlwZU5hbWUpOwotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkYTMwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhWE1JRmFjdG9yeUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozNSAkIAotICovCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBSZXNvdXJjZSBmb3IgdGhlIEphdmEgcHJvdG9jb2wuCi0gKiAKLSAqIEl0IGFsbG93cyBleHRlbnNpb25zIHRvIHRoZSByZWZsZWN0aW9uIGtleSB0byBiZSByZWdpc3RlcmVkIHdpdGggaXQuCi0gKiAKLSAqIENyZWF0aW9uIGRhdGU6ICgxMC80LzIwMDAgODoyMjoyMyBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFYTUlGYWN0b3J5SW1wbCBleHRlbmRzIFhNSVJlc291cmNlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKYXZhWE1JRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9TRVBFUkFUT1IgPSAiOi8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIExpc3QgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIEphdmFYTUlGYWN0b3J5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKYXZhWE1JRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBleHRlbnNpb24pIHsKLQkJZXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVmbGVjdGlvbktleUV4dGVuc2lvbihJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCWV4dGVuc2lvbnMucmVtb3ZlKGV4dGVuc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSmF2YVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgeG1pdXJpLCBSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBjaGFuZ2VkIHRvIGFsbG93IGEgemVyby1sZW5ndGggcGFja2FnZSBuYW1lIAotCQkvLyBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiAiamF2YTovI2ludCIsIGV0Yy4KLQkJSmF2YVJlZkZhY3RvcnkgamZhYyA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRTsKLQkJSmF2YVBhY2thZ2UgcGFjayA9IGpmYWMuY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQkJLy8gTmVlZCB0byBjcmVhdGUgYW5kIGFkZCBzcGVjaWFsIEphdmFGYWN0b3J5IGZvciBpbnN0YW50aWF0aW9uIHRvIHdvcmsuCi0JCUphdmFGYWN0b3J5SW1wbCBmYWN0ID0gbmV3IEphdmFGYWN0b3J5SW1wbCgpOwotCQlwYWNrLnNldEVGYWN0b3J5SW5zdGFuY2UoZmFjdCk7Ci0JCWlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIFN0YW5kYXJkIEphdmEgcGFja2FnZQotCQkJcGFjay5zZXROc1ByZWZpeChwYWNrYWdlTmFtZSk7Ci0JCQlwYWNrLnNldE5hbWUocGFja2FnZU5hbWUpOwotCQl9IGVsc2UgewotCQkJLy8gUHJpbWl0aXZlIHBhY2thZ2UKLQkJCXBhY2suc2V0TnNQcmVmaXgoSmF2YVBhY2thZ2UuUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRSk7Ci0JCQlwYWNrLnNldE5hbWUoSmF2YVBhY2thZ2UuUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRSk7Ci0JCX0KLQotCQlwYWNrLnNldE5zVVJJKHhtaXVyaSk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHBhY2spOwotCQkoKFhNSVJlc291cmNlKSBwYWNrLmVSZXNvdXJjZSgpKS5zZXRJRChwYWNrLCBKYXZhUGFja2FnZS5QQUNLQUdFX0lEKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBKYXZhWE1JUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgewotCQlwcm90ZWN0ZWQgSUphdmFSZWZsZWN0aW9uS2V5IHJlZmxlY3Rpb25LZXk7Ci0KLQkJcHVibGljIEphdmFYTUlSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCQlzdXBlcih1cmkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0UmVmbGVjdGlvbktleShJSmF2YVJlZmxlY3Rpb25LZXkga2V5KSB7Ci0JCQlyZWZsZWN0aW9uS2V5ID0ga2V5OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXRyeSB7Ci0JCQkJc3VwZXIubG9hZChvcHRpb25zKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoU3RyaW5nIHVyaUZyYWdtZW50KSB7Ci0JCQlFT2JqZWN0IHJlc3VsdCA9IHN1cGVyLmdldEVPYmplY3QodXJpRnJhZ21lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHJlZmxlY3Rpb25LZXkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IChFT2JqZWN0KSByZWZsZWN0aW9uS2V5LmdldCh1cmlGcmFnbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQkvKioKLQkJICogVXNlZCBieSBKYXZhUmVmbGVjdGlvbktleSB0byBsb29rIGRpcmVjdGx5IGludG8gSUQgdGFibGUgdG8gYnlwYXNzIGFuIGluZmluaXRlIGxvb3AuIEl0IHdpbGwgCi0JCSAqIGNhbGwgaGVyZSBiZWNhdXNlIGl0IG1heSBub3Qgb2YgZmlyc3QgYmVlbiBmb3VuZCwgYnV0IHRoZW4gYWRkZWQsIHNvIG5vdyBpcyBmb3VuZC4KLQkJICogCi0JCSAqIEBwYXJhbSB1cmlGcmFnbWVudAotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCUVPYmplY3QgcHJpbUdldEVPYmplY3QoU3RyaW5nIHVyaUZyYWdtZW50KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI3VzZUlEQXR0cmlidXRlcygpCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VJREF0dHJpYnV0ZXMoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCUphdmFYTUlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBKYXZhWE1JUmVzb3VyY2UodXJpKTsKLQkJcmVzb3VyY2Uuc2V0UmVmbGVjdGlvbktleShuZXcgSmF2YVJlZmxlY3Rpb25LZXkoZXh0ZW5zaW9ucywgcmVzb3VyY2UpKTsKLQotCQlTdHJpbmcgdXJpU3RyaW5nID0gdXJpLnRvU3RyaW5nKCk7Ci0JCWNyZWF0ZUphdmFQYWNrYWdlKHN0cmlwU2NoZW1lKHVyaVN0cmluZyksIHVyaVN0cmluZywgcmVzb3VyY2UpOwotCi0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoSmF2YVhNSUZhY3RvcnkuU0NIRU1FLCBKYXZhWE1JRmFjdG9yeS5JTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogU3RyaXAgdGhlIHRyYWlsaW5nIGlkZW50aWZpZXIsIGlmIGFueSwgZnJvbSB0aGUgdXJpLiAgQW4gaWRlbnRpZmllcgotCSAqIGJlZ2lucyB3aXRoICMgb3IgfC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdHJpcFNjaGVtZShTdHJpbmcgdXJpKSB7Ci0JCWludCBpbmRleCA9IHVyaS5pbmRleE9mKFNDSEVNQV9TRVBFUkFUT1IpOwotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhpbmRleCArIFNDSEVNQV9TRVBFUkFUT1IubGVuZ3RoKCksIHVyaS5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCXJldHVybiB1cmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlYWRBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlYWRBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjAyZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9SZWFkQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJlYWRBZGFwdG9yLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIEV4dGVuZGVkIEFkYXB0b3IgaW50ZXJmYWNlIHdoaWNoIGFkZHMgc3VwcG9ydCBmb3IgYW4gYWRhcHRlcgotICogcHJvdmlkaW5nIGRlZmF1bHQgdmFsdWVzIGZvciBhdHRyaWJ1dGVzLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDE6MTkgUE0pCi0gKiBAYXV0aG9yOiBTY290dCBSaWNoCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZEFkYXB0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0tFWSA9ICJKYXZhUmVmbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKTsKLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsgLy9GQgotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlZmxlY3Rpb25BZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlZmxlY3Rpb25BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZTgzOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9SZWZsZWN0aW9uQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotICogICRSQ1NmaWxlOiBSZWZsZWN0aW9uQWRhcHRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotLyoqCi0gKiBSZWZsZWN0aW9uQWRhcHRvciAtIGEgcmVhZCBhZGFwdG9yIGJhc2UgaW1wbGVtZW50YXRpb24gd2hpY2ggZG9lcyBhIGJ1bGsKLSAqIAlsb2FkIG9mIHJlbGZsZWN0ZWQgdmFsdWVzIG9uIHRoZSBmaXJzdCByZXF1ZXN0LgotICogCVN1YmNsYXNzZXMgY2FuIG9wdGltaXplIHRvIGRlZmVyIHNvbWUgcHJvcGVydGllcy4KLSAqIAlQcm9wZXJ0aWVzIG1heSBhbHNvIGJlIGRlZmVycmVkIGJ5IHNldHRpbmcgdGhlaXIgdmFsdWVzIHdpdGggcHJveHkgcmVmZXJlbmNlcywKLSAqIAlmb3IgZXhhbXBsZSwgZm9yIHN1cGVydHlwZSBhbmQgb3RoZXIgcmVmZXJlbmNlZCB0eXBlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmbGVjdGlvbkFkYXB0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsIGltcGxlbWVudHMgUmVhZEFkYXB0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIgPSAnLic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfTUVUSE9EX1BBUk1fREVMSU1JVEVSID0gJygnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX01FVEhPRElEX1BBUk1JRF9ERUxJTUlURVIgPSAnLSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfUEFSTV9QQVJNX0RFTElNSVRFUiA9ICcsJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUEFUSF9ERUxJTUlURVIgPSAnLyc7Ci0JLy8gU1cgaWQgY29udGFpbnMgJiBpbiB4bWwgZmlsZSBjYXN1ZXMgZXhjZXB0aW9uIHRocm93IGR1cmluZyBsb2FkCi0gICAgICAgIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNfQ09OU1RSVUNUT1JfVE9LRU4gPSAiJlYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTX0NPTlNUUlVDVE9SX1RPS0VOID0gIl9WIjsvLyROT04tTkxTLTEkIC8vIFNXCi0JLy8gY2FjaGUgYSBzdGF0aWMgZW1wdHkgU3RyaW5nW10gZm9yIG5vIHBhcm0gbWV0aG9kcwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZW1wdHlTdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JCi0JCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIGV2ZW50IHR5cGUgZm9yIHNwZWNpYWwgUmVmbGVjdGlvbiBub3RpZmljYXRpb25zLiBUaGlzIHdpbGwgYmUgdGhlIGV2ZW50IHR5cGUgZm9yIHRoZSBzcGVjaWFsIG9uZXMsIGxpa2UgUkVGTEVDVElPTl9FVkVOVC4KLQkgKiBUaGUgbGlzdGVuZXIgc2hvdWxkIGxpc3RlbiBmb3IgdGhpcyBldmVudCB0eXBlLCBhbmQgdGhlbiBjaGVjayB0aGUgZmVhdHVyZSBmb3IgdGhlIHR5cGUgb2Ygc3BlY2lhbCBldmVudCAobGlrZSBSRUZMRUNUSU9OX0VWRU5UKS4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVCA9IC0zNDU2OwkvLyBVc2luZyBhIGZ1bm55IG51bWJlciB0byB0cnkgdG8gZWxpbWluYXRlIGNvbmZsaWN0aW9uIHdpdGggYW55IG90aGVyIHNwZWNpYWxzIHRoYXQgbWF5IG9mIG9jY3VyIGZyb20gb3RoZXIgY29kZSBvbiB0aGUgSmF2YUNsYXNzLgotCQotCS8qKgotCSAqIFNwZWNpYWwgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUuIFRoaXMgaXMgc2VudCBhZ2FpbnN0IGEgSmF2YUNsYXNzIChhcyB0aGUgdGFyZ2V0KSB3aGVuZXZlciByZWZsZWN0aW9uIG9jY3Vycy4gSXQgd2lsbCBiZQotCSAqIHNlbnQgdW5kZXIgdGhlIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlIG9mIFJFRkxFQ1RJT05fRVZFTlQuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFJFRkxFQ1RJT05fRVZFTlQgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVBdHRyaWJ1dGUoKTsKLQotCS8qCi0JICogRmlsbCBpbiB0aGUgbmFtZS4gTm90IHJlYWxseSBuZWVkZWQgYnV0IGl0IHdvdWxkIGJlIG5pY2UuCi0JICovCi0Jc3RhdGljIHtSRUZMRUNUSU9OX0VWRU5ULnNldE5hbWUoInJlZmxlY3RWYWx1ZXMiKTt9IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZWZsZWN0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlZmxlY3RpbmcgPSBmYWxzZTsKLXB1YmxpYyBSZWZsZWN0aW9uQWRhcHRvcigpIHsKLQlzdXBlcigpOwotfQotcHVibGljIFJlZmxlY3Rpb25BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXN1cGVyKCk7Ci0Jc2V0VGFyZ2V0KHRhcmdldCk7Ci19Ci0vKioKLSAqIEhlbHBlciBtZXRob2QgdG8gZW5zdXJlIGZ1bGwgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhcmdldC4gIFJlcXVpcmVkCi0gKiBmb3Igc2VyaWFsaXphdGlvbi4KLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIGZvcmNlRGVmZXJyZWRSZWFkRm9yKEVPYmplY3QgdGFyZ2V0KSB7Ci0JUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRvciA9IHJldHJpZXZlQWRhcHRvckZyb20odGFyZ2V0KTsKLQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCWFkYXB0b3IucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotfQotcHJvdGVjdGVkIFJlc291cmNlIGdldFRhcmdldFJlc291cmNlKCkgewotCWlmIChnZXRUYXJnZXQoKSAhPSBudWxsKQotCQlyZXR1cm4gKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZ2V0VGFyZ2V0KCkpLmVSZXNvdXJjZSgpOwotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIGZldGNoIHRoZSBhZGFwdG9yIGZyb20gdGhlIG9iamVjdCwgYW5kIGlmIGl0IGV4aXN0cywgZ2V0IHRoZSBhZGFwdGVkCi0gKiB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4gIE92ZXJsb2FkZWQgZm9yIG1hbnktc2lkZWQgYXR0cmlidXRlcyB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIHdvdWxkCi0gKiBvdGhlcndpc2UgYmUgYW4gZW51bWVyYXRpb247IGluIHRoaXMgY2FzZSB3aWxsIHJldHVybiBhbiBBcnJheSBpbnN0ZWFkLiAKLSAqLwotcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVSZWZlcmVuY2UgYXR0cmlidXRlKSB7CQotLy9GQglSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yID0gcmV0cmlldmVBZGFwdG9yRnJvbShvYmplY3QpOwotLy9GQglpZiAoYWRhcHRvciAhPSBudWxsKQotLy9GQgkJcmV0dXJuIGFkYXB0b3IuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0vL0ZCCXJldHVybiAoKElSZWFkQWRhcHRhYmxlKSBvYmplY3QpLnByaW1SZWZWYWx1ZShhdHRyaWJ1dGUpOwotCXJldHVybiBvYmplY3QuZUdldChhdHRyaWJ1dGUpOyAvL0ZCCi0JCi19Ci0vKkhlbHBlciBtZXRob2QgdG8gZmV0Y2ggdGhlIGFkYXB0b3IgZnJvbSB0aGUgb2JqZWN0LCBhbmQgaWYgaXQgZXhpc3RzLCBnZXQgdGhlIGFkYXB0ZWQKLSAqdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewkKLS8vRkIJUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRvciA9IHJldHJpZXZlQWRhcHRvckZyb20ob2JqZWN0KTsKLS8vRkIJaWYgKGFkYXB0b3IgIT0gbnVsbCkKLS8vRkIJCXJldHVybiBhZGFwdG9yLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotLy9GQglyZXR1cm4gKChJUmVhZEFkYXB0YWJsZSkgb2JqZWN0KS5wcmltUmVmVmFsdWUoYXR0cmlidXRlKTsKLQlyZXR1cm4gb2JqZWN0LmVHZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlhdHRyaWJ1dGUpOyAvL0ZCCi19Ci0vKioKLSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLS8vRkIJcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0vL0ZCCXJldHVybiAoKElSZWFkQWRhcHRhYmxlKSBvYmplY3QpLnByaW1SZWZWYWx1ZShhdHRyaWJ1dGUpOwotCXJldHVybiBvYmplY3QuZUdldCgoRVN0cnVjdHVyYWxGZWF0dXJlKWF0dHJpYnV0ZSk7IC8vRkIKLX0KLS8qKgotICogaXNBZGFwdG9yRm9yVHlwZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCXJldHVybiAodHlwZSA9PSBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci19Ci0vKioKLSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQKLSAqLwotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpOwotLyoqCi0gKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciByZWZsZWN0aW9uIGhhZCBvY2N1cnJlZC4KLSAqLwotcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpIHsKLQlpZiAoIWhhc1JlZmxlY3RlZCAmJiAhaXNSZWZsZWN0aW5nKSB7Ci0JCXRyeSB7Ci0JCQlpc1JlZmxlY3RpbmcgPSB0cnVlOwotCQkJaWYgKCEoKEVPYmplY3QpZ2V0VGFyZ2V0KCkpLmVJc1Byb3h5KCkpCi0JCQkJaGFzUmVmbGVjdGVkID0gcmVmbGVjdFZhbHVlcygpOwotCQkJZWxzZQotCQkJCWhhc1JlZmxlY3RlZCA9IGZhbHNlOwkvLyBBUyBsb25nIHdlIGFyZSBhIHByb3h5LCB3ZSB3b24ndCByZWZsZWN0LgotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJaGFzUmVmbGVjdGVkID0gZmFsc2U7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCWxvZ2dlci5sb2coUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmFpbGVkX3JlZmxlY3RpbmdfdmFsdWVzX0VSUk9SXyIpLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJCA9ICJGYWlsZWQgcmVmbGVjdGluZyB2YWx1ZXMhISEiCi0JCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpc1JlZmxlY3RpbmcgPSBmYWxzZTsKLQkJCWdldFRhcmdldCgpLmVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpZ2V0VGFyZ2V0KCksIEVWRU5ULCBSRUZMRUNUSU9OX0VWRU5ULCBudWxsLCBudWxsLCBOb3RpZmljYXRpb24uTk9fSU5ERVgpKTsKLQkJfQotCX0KLQlyZXR1cm4gaGFzUmVmbGVjdGVkOwotfQotcHVibGljIHN0YXRpYyBSZWZsZWN0aW9uQWRhcHRvciByZXRyaWV2ZUFkYXB0b3JGcm9tKEVPYmplY3Qgb2JqZWN0KSB7Ci0Jc3luY2hyb25pemVkIChvYmplY3QpIHsKLQkJcmV0dXJuIChSZWZsZWN0aW9uQWRhcHRvcilFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIob2JqZWN0LCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KREtBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KREtBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDIzZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSkRLQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotLyoKLSAqICAkUkNTZmlsZTogSkRLQWRhcHRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSkRLQWRhcHRvciBleHRlbmRzIEphdmFSZWZsZWN0aW9uQWRhcHRvciB7Ci0JcHVibGljIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwdWJsaWMgSkRLQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhbkFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXNldEFkYXB0ZXJGYWN0b3J5KGFuQWRhcHRlckZhY3RvcnkpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kSUQgLSBnZW5lcmF0ZSB0aGUgdW5pcXVlIElEIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBjb25zdHJ1Y3Rvci4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCXNpbXBsZUNsYXNzTmFtZS5zaW1wbGVDbGFzc05hbWUoY29tLmZyb25rLlBhcm1UeXBlMV9wYXJtVHlwZTImVgotCSAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggUmVmbGVjdGlvbkFkYXB0ZXIuZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCkuCi0JICoKLQkgKiBJdCBoYXMgdG8gYmUgZG9uZSBzZXBhcmF0ZWx5IGZvciBKREsgYmVjYXVzZSBDb25zdHJ1Y3RvcnMgYW5kIE1ldGhvZHMgYXJlIGRpZmZlcmVudCBjbGFzc2VzLgotCSAqIEhvd2V2ZXIsIGluIHRoZSBKYXZhIE1vZGVsIHRoZXkgYXJlIGJvdGgganVzdCBNZXRob2RzIHdpdGggYSBmbGFnIGluZGljYXRpbmcgQ29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGpka0NvbnN0cnVjdG9yKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRTaW1wbGVOYW1lKGpka0NvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJb3V0LmFwcGVuZChjbGFzc05hbWUpOwotCQlvdXQuYXBwZW5kKENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCW91dC5hcHBlbmQoY29tcHV0ZU1ldGhvZE5hbWUoamRrQ29uc3RydWN0b3IpKTsKLQkJb3V0LmFwcGVuZChDX01FVEhPRF9QQVJNX0RFTElNSVRFUik7Ci0JCUNsYXNzW10gcGFybVR5cGVzID0gamRrQ29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCW91dC5hcHBlbmQocGFybVR5cGVzW2ldLmdldE5hbWUoKSk7Ci0JCQlpZiAoaSA8IHBhcm1UeXBlcy5sZW5ndGggLSAxKQotCQkJCW91dC5hcHBlbmQoQ19QQVJNX1BBUk1fREVMSU1JVEVSKTsKLQkJfQotCQlvdXQuYXBwZW5kKFNfQ09OU1RSVUNUT1JfVE9LRU4pOyAvL0l0J3MgYSBjb25zdHJ1Y3RvcgotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogSWYgdGhlcmUgYXJlIG5vIHBhcm1zLCBpdCB3aWxsIGVuZCB3aXRoIGEgIigiIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3RpY3RpdmUgZnJvbSBhIGZpZWxkLgotCSAqIFRoZSBuYW1lIGZvcm1hdCB3aWxsIGJlOgotCSAqIAlzaW1wbGVDbGFzc05hbWUubWV0aG9kTmFtZShjb20uZnJvbmsuUGFybVR5cGUxX3Bhcm1UeXBlMgotCSAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggUmVmbGVjdGlvbkFkYXB0ZXIuZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBqZGtNZXRob2QpIHsKLQkJU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldFNpbXBsZU5hbWUoamRrTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJb3V0LmFwcGVuZChjbGFzc05hbWUpOwotCQlvdXQuYXBwZW5kKENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCW91dC5hcHBlbmQoY29tcHV0ZU1ldGhvZE5hbWUoamRrTWV0aG9kKSk7Ci0JCW91dC5hcHBlbmQoQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIpOwotCQlDbGFzc1tdIHBhcm1UeXBlcyA9IGpka01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJb3V0LmFwcGVuZChwYXJtVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCWlmIChpIDwgcGFybVR5cGVzLmxlbmd0aCAtIDEpCi0JCQkJb3V0LmFwcGVuZChDX1BBUk1fUEFSTV9ERUxJTUlURVIpOwotCQl9Ci0JCWlmIChqZGtNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGpka01ldGhvZC5nZXROYW1lKCkpKQotCQkJb3V0LmFwcGVuZChTX0NPTlNUUlVDVE9SX1RPS0VOKTsgLy9JdCdzIGEgY29uc3RydWN0b3IKLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kTmFtZSAtIGdlbmVyYXRlIHRoZSBuYW1lIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBjb25zdHJ1Y3Rvci4KLQkgKiBGb3IgdGhlIG1vbWVudCwgbmFtZXMgYXJlIHNpbXBsZSwgYW5kIFVVSUQncyBhcmUgY29tcGxleC4KLQkgKgotCSAqIEl0IGhhcyB0byBiZSBkb25lIHNlcGFyYXRlbHkgZm9yIEpESyBiZWNhdXNlIENvbnN0cnVjdG9ycyBhbmQgTWV0aG9kcyBhcmUgZGlmZmVyZW50IGNsYXNzZXMuCi0JICogSG93ZXZlciwgaW4gdGhlIEphdmEgTW9kZWwgdGhleSBhcmUgYm90aCBqdXN0IE1ldGhvZHMgd2l0aCBhIGZsYWcgaW5kaWNhdGluZyBDb25zdHJ1Y3Rvci4gCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZE5hbWUoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgamRrQ29uc3RydWN0b3IpIHsKLQkJcmV0dXJuIGdldFNpbXBsZU5hbWUoamRrQ29uc3RydWN0b3IuZ2V0TmFtZSgpKTsgLy8gQ1RPUiBuYW1lcyBjb21lIGJhY2sgZnVsbHktcXVhbGlmaWVkIHdpdGggcGFja2FnZS4KLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZE5hbWUgLSBnZW5lcmF0ZSB0aGUgbmFtZSB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIEZvciB0aGUgbW9tZW50LCBuYW1lcyBhcmUgc2ltcGxlLCBhbmQgVVVJRCdzIGFyZSBjb21wbGV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2ROYW1lKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBqZGtNZXRob2QpIHsKLQkJcmV0dXJuIGpka01ldGhvZC5nZXROYW1lKCk7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUphdmFGaWVsZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBGaWVsZCBiYXNlZCBvbiB0aGUgcGFzc2VkIEZpZWxkCi0JICogV2UgYXJlIGRlZmVycmluZyBmaWVsZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgRmllbGQgY3JlYXRlSmF2YUZpZWxkKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHJlZmxlY3RlZEZpZWxkLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlGaWVsZCBuZXdGaWVsZCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLQkJbmV3RmllbGQuc2V0TmFtZShyZWZsZWN0ZWRGaWVsZC5nZXROYW1lKCkpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2ltcGxlTmFtZShyZWZsZWN0ZWRGaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXJlc291cmNlLnNldElEKG5ld0ZpZWxkLCBjbGFzc05hbWUgKyBDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIgKyByZWZsZWN0ZWRGaWVsZC5nZXROYW1lKCkpOwotCQlyZXR1cm4gbmV3RmllbGQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUphdmFNZXRob2QgLSBpbnN0YW50aWF0ZSBhIEphdmEgTWV0aG9kIGJhc2VkIG9uIHRoZSBwYXNzZWQgSmF2YSBSZWZsZWN0aW9uIENvbnN0cnVjdG9yCi0JICogV2UgYXJlIGRlZmVycmluZyBtZXRob2QgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICogV2UgbmVlZCB0byBzdG9yZSBlbm91Z2ggaW5mbyBpbiB0aGUgZW1wdHkgTWV0aG9kIHRvIGZpbmQgaXRzIEphdmEgc291cmNlLgotCSAqIFRoZSBJRCB3aWxsIGV2ZW50dWFsbHkgaG9sZCBlbm91Z2ggaW5mbyB0byBpZGVudGlmeSB0aGUgc291cmNlLCBzbyB3ZSB1c2UgaXQuCi0JICovCi0JcHVibGljIE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGpka0NvbnN0cnVjdG9yLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlNZXRob2QgbmV3TWV0aG9kID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLQkJLy8gV2UgdXNlIGEgc2ltcGxlIG5hbWUsIGJ1dCBhIGNvbXBsZXggSUQgCi0JCW5ld01ldGhvZC5zZXROYW1lKGNvbXB1dGVNZXRob2ROYW1lKGpka0NvbnN0cnVjdG9yKSk7Ci0JCXJlc291cmNlLnNldElEKG5ld01ldGhvZCwgY29tcHV0ZU1ldGhvZElEKGpka0NvbnN0cnVjdG9yKSk7Ci0JCXJldHVybiBuZXdNZXRob2Q7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUphdmFNZXRob2QgLSBpbnN0YW50aWF0ZSBhIEphdmEgTWV0aG9kIGJhc2VkIG9uIHRoZSBwYXNzZWQgSmF2YSBSZWZsZWN0aW9uIE1ldGhvZAotCSAqIFdlIGFyZSBkZWZlcnJpbmcgbWV0aG9kIGNvbnRlbnRzIGFzc3VtaW5nIHRoYXQgaXRzIGFkYXB0b3Igd2lsbCByZWZsZWN0IGl0cyBkZXRhaWxzLgotCSAqIFdlIG5lZWQgdG8gc3RvcmUgZW5vdWdoIGluZm8gaW4gdGhlIGVtcHR5IE1ldGhvZCB0byBmaW5kIGl0cyBKYXZhIHNvdXJjZS4KLQkgKiBUaGUgSUQgd2lsbCBldmVudHVhbGx5IGhvbGQgZW5vdWdoIGluZm8gdG8gaWRlbnRpZnkgdGhlIHNvdXJjZSwgc28gd2UgdXNlIGl0LgotCSAqLwotCXB1YmxpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgamRrTWV0aG9kLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlNZXRob2QgbmV3TWV0aG9kID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLQkJLy8gV2UgdXNlIGEgc2ltcGxlIG5hbWUsIGJ1dCBhIGNvbXBsZXggSUQgCi0JCW5ld01ldGhvZC5zZXROYW1lKGNvbXB1dGVNZXRob2ROYW1lKGpka01ldGhvZCkpOwotCQlyZXNvdXJjZS5zZXRJRChuZXdNZXRob2QsIGNvbXB1dGVNZXRob2RJRChqZGtNZXRob2QpKTsKLQkJcmV0dXJuIG5ld01ldGhvZDsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNy8wMCAzOjQzOjU1IFBNKQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YUpES0FkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEphdmFKREtBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQlwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0QWx0ZXJuYXRlQ2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCX0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIE1ldGhvZCB0byBjb252ZXJ0IHRoZSB0ZXh0dWFsIGZvcm0gb2YgYSBwcmltaXRpdmUgdHlwZSBpbnRvIGl0cyBDbGFzcyBvYmplY3QKLQkqCi0JKiBAcGFyYW0gdHlwZSBUaGUgcHJpbWl0aXZlIHR5cGUncyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uCi0JKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIGdldFByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJQ2xhc3MgYyA9IG51bGw7Ci0KLQkJaWYgKHR5cGUuZXF1YWxzKGJ5dGUuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGJ5dGUuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoc2hvcnQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IHNob3J0LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gaW50LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGxvbmcuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGxvbmcuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGZsb2F0LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGRvdWJsZS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gZG91YmxlLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGJvb2xlYW4uY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoY2hhci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gY2hhci5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSB2b2lkLmNsYXNzOwotCQl9Ci0KLQkJcmV0dXJuIGM7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhc3Qgc2VnbWVudCBvZiBhICcuJy1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gbmFtZSBpZiBpdCBpcyBub3QgcXVhbGlmaWVkLgotCSAqIEZvciBleGFtcGxlOgotCSAqIDxwcmU+Ci0JICogZ2V0U2ltcGxlTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpIC0+ICJPYmplY3QiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlpbnQgbGFzdERvdCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3REb3QgPT0gLTEpCi0JCQlyZXR1cm4gbmFtZTsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTsKLQl9Ci0JcHVibGljIENsYXNzIGdldFR5cGUoSmF2YUhlbHBlcnMgbW9kZWxDbGFzcykgewotCQlDbGFzcyByZXN1bHQgPSBudWxsOwotCQlpZiAobW9kZWxDbGFzcy5pc0FycmF5KCkpIHsKLQkJCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSBtb2RlbENsYXNzOwotCQkJQ2xhc3MgY29tcG9uZW50Q2xhc3MgPSBnZXRUeXBlKGFycmF5VHlwZS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKSk7Ci0JCQlyZXN1bHQgPSAoQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50Q2xhc3MsIG5ldyBpbnRbYXJyYXlUeXBlLmdldEFycmF5RGltZW5zaW9ucygpXSkpLmdldENsYXNzKCk7Ci0JCX0gZWxzZSBpZiAobW9kZWxDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlyZXN1bHQgPSBnZXRUeXBlKG1vZGVsQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGdldFR5cGUoKChKYXZhQ2xhc3MpIG1vZGVsQ2xhc3MpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBDbGFzcyBnZXRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCS8vIFRyeSBmb3IgYSBwcmltaXRpdmUgdHlwZSAoImludCIsImNoYXIiLGV0Yy4pIGZpcnN0Ci0JCUNsYXNzIHByaW1UeXBlID0gZ2V0UHJpbWl0aXZlVHlwZShxdWFsaWZpZWROYW1lKTsKLQkJaWYgKHByaW1UeXBlID09IG51bGwpIHsKLQkJCS8vIENoYW5nZWQgZm9yIGRlZmVjdCAjMjEyMTQ3IGJvdHBAYXVzYWl4MTkuYXVzdGluLmlibS5jb21ANzYzMCBzeXN0ZW0uCi0JCQkvLwotCQkJLy8gU2VhcmNoIG9ubHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3Nsb2FkZXJzICh0aGUgZmlyc3Qgb25lIHRoYXQgZXhpc3RzKSBpbiB0aGlzIG9yZGVyLiBJZiBub3QgZm91bmQKLQkJCS8vIGluIGEgY2xhc3Nsb2FkZXIsIGl0IHdpbGwgbm90IHJvbGwtb3ZlciB0byBhbm90aGVyIGNsYXNzIGxvYWRlci4gVGhpcyBpcyB0byBhdm9pZCBwcm9ibGVtcyB3aGVyZSBhCi0JCQkvLyBjbGFzcyBtYXkgZXhpc3QgaW4gbW9yZSB0aGFuIG9uZSBjbGFzc2xvYWRlci4gWW91IGdldCBlcnJvcnMgd2hlbiB0aGlzIGhhcHBlbnMgZHVlIHRvIG9uZSBjbGFzcyB0aGF0Ci0JCQkvLyB3YXMgZm91bmQgaW4gb25seSBvbmUgY2xhc3Nsb2FkZXIgdGhhdCByZWZlcnMgdG8gYW5vdGhlciBjbGFzcyB0aGF0IHdhcyBmb3VuZCBpbiBib3RoIGNsYXNzbG9hZGVycy4KLQkJCS8vIFRoZXkgZG9uJ3QgbWF0Y2ggd2hlbiB0cnlpbmcgdG8gcmVmbGVjdCBsYXRlci4KLQkJCS8vIDEpIEFsdGVybmF0ZSBjbGFzc2xvYWRlciAoaWYgZXhpc3RzKQotCQkJLy8gMikgVGhyZWFkIGNvbnRleHQgY2xhc3Nsb2FkZXIgKGlmIGV4aXN0cykKLQkJCS8vIDMpIFN5c3RlbSBjbGFzc2xvYWRlciAoaWYgZXhpc3RzKQotCQkJLy8gNCkgQ2xhc3MuZm9yTmFtZSgpLgotCQkJaWYgKGdldEFsdGVybmF0ZUNsYXNzTG9hZGVyKCkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBnZXRBbHRlcm5hdGVDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhxdWFsaWZpZWROYW1lKTsKLQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZjIpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkJaWYgKGNvbnRleHRDbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGNvbnRleHRDbGFzc0xvYWRlci5sb2FkQ2xhc3MocXVhbGlmaWVkTmFtZSk7Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQ2xhc3NMb2FkZXIgc3lzdGVtQ2xhc3NMb2FkZXIgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwotCQkJaWYgKHN5c3RlbUNsYXNzTG9hZGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gc3lzdGVtQ2xhc3NMb2FkZXIubG9hZENsYXNzKHF1YWxpZmllZE5hbWUpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIENsYXNzLmZvck5hbWUocXVhbGlmaWVkTmFtZSk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBlbHNlCi0JCQlyZXR1cm4gcHJpbVR5cGU7Ci0JfQotCS8qCi0JICogVXRpbGl0eSByb3V0aW5lIHRvIHBhcGVyIG92ZXIgYXJyYXkgdHlwZSBuYW1lcwotCSAqIEJvcnJvd2VkIGZyb20gYSBwYWNrYWdlLXZpc2liaWxpdHkgaGVscGVyIG9uIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShDbGFzcyB0eXBlKSB7Ci0JCWlmICh0eXBlLmlzQXJyYXkoKSkgewotCQkJdHJ5IHsKLQkJCQlDbGFzcyBjbCA9IHR5cGU7Ci0JCQkJaW50IGRpbWVuc2lvbnMgPSAwOwotCQkJCXdoaWxlIChjbC5pc0FycmF5KCkpIHsKLQkJCQkJZGltZW5zaW9ucysrOwotCQkJCQljbCA9IGNsLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChjbC5nZXROYW1lKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKSB7Ci0JCQkJCXNiLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7IC8qRkFMTFRIUlUqLwotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIE1ldGhvZCB0byBjb252ZXJ0IHRoZSB0ZXh0dWFsIGZvcm0gb2YgYSBwcmltaXRpdmUgdHlwZSBpbnRvIGl0cyBDbGFzcyBvYmplY3QKLQkqCi0JKiBAcGFyYW0gdHlwZSBUaGUgcHJpbWl0aXZlIHR5cGUncyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uCi0JKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIHByaW1pdGl2ZUZvck5hbWUoU3RyaW5nIHR5cGUpIHsKLQkJQ2xhc3MgYyA9IG51bGw7Ci0KLQkJaWYgKHR5cGUuZXF1YWxzKGJ5dGUuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGJ5dGUuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoc2hvcnQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IHNob3J0LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gaW50LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGxvbmcuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGxvbmcuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGZsb2F0LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGRvdWJsZS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gZG91YmxlLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGJvb2xlYW4uY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoY2hhci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gY2hhci5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSB2b2lkLmNsYXNzOwotCQl9Ci0KLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNy8wMCAzOjQzOjU1IFBNKQotCSAqIEBwYXJhbSBuZXdBZGFwdGVyRmFjdG9yeSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5KYXZhSkRLQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGFwdGVyRmFjdG9yeShKYXZhSkRLQWRhcHRlckZhY3RvcnkgbmV3QWRhcHRlckZhY3RvcnkpIHsKLQkJYWRhcHRlckZhY3RvcnkgPSBuZXdBZGFwdGVyRmFjdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhQ2xhc3NKREtBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhQ2xhc3NKREtBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOTE2ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUNsYXNzSkRLQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFDbGFzc0pES0FkYXB0b3IuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTQgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzUgJCAKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBSZWZsZWN0IHRoZSBjbGFzcyB1c2luZyBzdGFuZGFyZCBqYXZhLnJlZmxlY3QgbWV0aG9kcy4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNsYXNzSkRLQWRhcHRvciBleHRlbmRzIEpES0FkYXB0b3IgaW1wbGVtZW50cyBJSmF2YUNsYXNzQWRhcHRvciB7Ci0KLQlwcm90ZWN0ZWQgQ2xhc3Mgc291cmNlVHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgSmF2YUNsYXNzSkRLQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhbkFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCwgYW5BZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogYWRkRmllbGRzIC0gcmVmbGVjdCBvdXIgZmllbGRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmllbGRzKCkgewotCQlYTUlSZXNvdXJjZSByZXNvdXJjZSA9IChYTUlSZXNvdXJjZSkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZVJlc291cmNlKCk7Ci0JCUxpc3QgdGFyZ2V0RmllbGRzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RmllbGRzR2VuKCk7Ci0JCXRhcmdldEZpZWxkcy5jbGVhcigpOwotCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZFtdIGZpZWxkcyA9IHt9OwotCQl0cnkgewotCQkJZmllbGRzID0gZ2V0U291cmNlVHlwZSgpLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCX0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGVycm9yKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygKLQkJCQkJIkNvdWxkX05vdF9SZWZsZWN0X0ZpZWxkc19FUlJPUl8iLCBuZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lKCksIGVycm9yLmdldE1lc3NhZ2UoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0YXJnZXRGaWVsZHMuYWRkKGNyZWF0ZUphdmFGaWVsZChmaWVsZHNbaV0sIHJlc291cmNlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGRNZXRob2RzIC0gcmVmbGVjdCBvdXIgbWV0aG9kcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZHMoKSB7Ci0JCS8vIFdlIG5lZWQgdG8gZmlyc3QgZG8gbWV0aG9kcyBhbmQgdGhlbiBkbyBjb25zdHJ1Y3RvcnMgYmVjYXVzZSB0aGUgSkRLIHRyZWF0cyB0aGVtIGFzIHR3bwotCQkvLyBkaWZmZXJlbnQgb2JqZWN0cywgd2hpY2ggdGhlIEphdmEgTW9kZWwgdHJlYXRzIHRoZW0gYXMgYm90aCBNZXRob2Qncy4KLQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwotCQlMaXN0IHRhcmdldE1ldGhvZHMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRNZXRob2RzR2VuKCk7Ci0JCXRhcmdldE1ldGhvZHMuY2xlYXIoKTsKLQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kW10gbWV0aG9kcyA9IHt9OwotCQl0cnkgewotCQkJbWV0aG9kcyA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZXJyb3IpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nKAotCQkJCQkJCQlSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkJCQkuZ2V0U3RyaW5nKAotCQkJCQkJCQkJCQkJIkNvdWxkX05vdF9SZWZsZWN0X01ldGhvZHNfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBlcnJvci50b1N0cmluZygpfSksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0YXJnZXRNZXRob2RzLmFkZChjcmVhdGVKYXZhTWV0aG9kKG1ldGhvZHNbaV0sIHJlc291cmNlKSk7Ci0JCX0KLQotCQkvLyBOb3cgZG8gdGhlIGNvbnN0cnVjdG9ycwotCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcltdIGN0b3JzID0ge307Ci0JCXRyeSB7Ci0JCQljdG9ycyA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlcnJvcikgewotCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2coCi0JCQkJCQkJCVJlc291cmNlSGFuZGxlcgotCQkJCQkJCQkJCS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkJCQkiQ291bGRfTm90X1JlZmxlY3RfQ29uc3RydWN0b3JzX0VSUk9SXyIsIG5ldyBPYmplY3RbXSB7IGdldEphdmFDbGFzc1RhcmdldCgpLmdldFF1YWxpZmllZE5hbWUoKSwgZXJyb3IuZ2V0TWVzc2FnZSgpfSksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJdGFyZ2V0TWV0aG9kcy5hZGQoY3JlYXRlSmF2YU1ldGhvZChjdG9yc1tpXSwgcmVzb3VyY2UpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlZmxlY3RlZCBmaWVsZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEZpZWxkcygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RmllbGRzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGltcGxlbWVudHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEltcGxlbWVudHMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlZmxlY3RlZCBtZXRob2RzIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hNZXRob2RzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRNZXRob2RzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hJbm5lckNsYXNzZXMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldERlY2xhcmVkQ2xhc3Nlc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoTW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRBYnN0cmFjdChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRQdWJsaWMoZmFsc2UpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5VTkRFRklORURfTElURVJBTCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2ZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmx1c2hNb2RpZmllcnMoKTsKLQkJcmVzdWx0ICY9IGZsdXNoU3VwZXIoKTsKLQkJcmVzdWx0ICY9IGZsdXNoSW1wbGVtZW50cygpOwotCQlyZXN1bHQgJj0gZmx1c2hNZXRob2RzKCk7Ci0JCXJlc3VsdCAmPSBmbHVzaEZpZWxkcygpOwotCQlyZXN1bHQgJj0gZmx1c2hJbm5lckNsYXNzZXMoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3VwZXJ0eXBlIHRvIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hTdXBlcigpIHsKLQkJTGlzdCB0YXJnZXRTdXBlcnMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5wcmltR2V0RVN1cGVyVHlwZXMoKTsKLQkJdGFyZ2V0U3VwZXJzLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFyZ2V0IHR5cGVkIHRvIGEgSmF2YUNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3NJbXBsIGdldEphdmFDbGFzc1RhcmdldCgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCk7Ci0JfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlVHlwZSAhPSBudWxsOwotICAgIH0KLQotCS8qKgotCSAqIGdldFNvdXJjZVR5cGUgLSByZXR1cm4gdGhlIGphdmEubGFuZy5DbGFzcyB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0U291cmNlVHlwZSgpIHsKLQkJaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCkgewotCQkJc291cmNlVHlwZSA9IGdldFR5cGUoKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCkpOwotCQl9Ci0JCXJldHVybiBzb3VyY2VUeXBlOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGlzIG51bGwgb3IgaWYgaXQgaXMgYSBiaW5hcnkgdHlwZS4gUmVmbGVjdGlvbiBmcm9tIHRoZSBKREsgaXMgYWx3YXlzIGZyb20gYmluYXJ5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291cmNlVHlwZUZyb21CaW5hcnkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuIG9uIGVudHJ5OiBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksIGFuZAotCSAqIGRvY3VtZW50IG11c3QgYmUgc2V0LiBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsIEphdmFDbGFzcyBhZGFwdG9yOiAtIHNldCBtb2RpZmllcnMgLSBzZXQgbmFtZSAtIHNldCByZWZlcmVuY2UgdG8gc3VwZXIgLSBjcmVhdGUgbWV0aG9kcyAtCi0JICogY3JlYXRlIGZpZWxkcyAtIGFkZCBpbXBvcnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJc3VwZXIucmVmbGVjdFZhbHVlcygpOwotCQl0cnkgewotCQkJaWYgKGdldFNvdXJjZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQkJc2V0TmFtaW5nKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc2V0U3VwZXIoKTsKLQkJCQl9IGNhdGNoIChJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl9Ci0JCQkJc2V0SW1wbGVtZW50cygpOwotCQkJCWFkZE1ldGhvZHMoKTsKLQkJCQlhZGRGaWVsZHMoKTsKLQkJCQlyZWZsZWN0SW5uZXJDbGFzc2VzKCk7Ci0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5yZWdpc3RlclJlZmxlY3Rpb24oZ2V0U291cmNlVHlwZSgpLmdldE5hbWUoKSwgdGhpcyk7Ci0JCQkJLy8JYWRkSW1wb3J0cygpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJLy9Eb24ndCBjYWNoZSB0aGUgY2xhc3MgYmV5b25kIHRoZSBvcGVyYXRpb24gb2YgcmVmbGVjdCB2YWx1ZXM7Ci0JCQkvL3RoaXMgZW5hYmxlcyBkeW5hbWljIHN3YXBwaW5nIG9mIHRoZSBhbHRlcm5hdGUgY2xhc3MgbG9hZGVyCi0JCQkvL2ZvciBqYXZhIHJlZmxlY3Rpb24sIGFzIHdlbGwgYXMgYXZvaWRzIHBvdGVudGlhbCBtZW1vcnkgbGVha2FnZQotCQkJc291cmNlVHlwZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdElubmVyQ2xhc3NlcygpIHsKLQkJQ2xhc3NbXSBpbm5lckNsYXNzZXMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0Q2xhc3NlcygpOwotCQlpZiAoaW5uZXJDbGFzc2VzLmxlbmd0aCAhPSAwKSB7Ci0JCQlMaXN0IGRlY2xhcmVkQ2xhc3NlcyA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldERlY2xhcmVkQ2xhc3Nlc0dlbigpOwotCQkJSmF2YUNsYXNzIGlubmVyOwotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0VGFyZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbm5lciA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShpbm5lckNsYXNzZXNbaV0uZ2V0TmFtZSgpLCBzZXQpOwotCQkJCWRlY2xhcmVkQ2xhc3Nlcy5hZGQoaW5uZXIpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBzZXRJbXBsZW1lbnRzIC0gc2V0IG91ciBpbXBsZW1lbnRlZC9zdXBlciBpbnRlcmZhY2VzIGhlcmUgRm9yIGFuIGludGVyZmFjZSwgdGhlc2UgYXJlIHN1cGVyY2xhc3Nlcy4gRm9yIGEgY2xhc3MsIHRoZXNlIGFyZSBpbXBsZW1lbnRlZAotCSAqIGludGVyZmFjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW1wbGVtZW50cygpIHsKLQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gZ2V0U291cmNlVHlwZSgpLmdldEludGVyZmFjZXMoKTsKLQkJLy8gbmVlZHMgd29yaywgdGhlIG5hbWVzIGFib3ZlIHdpbGwgYmUgc2ltcGxlIG5hbWVzIGlmIHdlIGFyZSByZWxmZWN0aW5nIGZyb20gYSBzb3VyY2UgZmlsZQotCQlKYXZhQ2xhc3NJbXBsIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQkJSmF2YUNsYXNzIHJlZjsKLQkJTGlzdCBpbnRMaXN0ID0gamF2YUNsYXNzVGFyZ2V0LmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JCWludExpc3QuY2xlYXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWYgPSBjcmVhdGVKYXZhQ2xhc3NSZWYoaW50ZXJmYWNlc1tpXS5nZXROYW1lKCkpOwotCQkJaW50TGlzdC5hZGQocmVmKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRBYnN0cmFjdChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0Fic3RyYWN0KGdldFNvdXJjZVR5cGUoKS5nZXRNb2RpZmllcnMoKSkpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0RmluYWwoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNGaW5hbChnZXRTb3VyY2VUeXBlKCkuZ2V0TW9kaWZpZXJzKCkpKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldFB1YmxpYyhqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1B1YmxpYyhnZXRTb3VyY2VUeXBlKCkuZ2V0TW9kaWZpZXJzKCkpKTsKLQkJLy8gU2V0IHR5cGUgdG8gY2xhc3Mgb3IgaW50ZXJmYWNlLCBub3QgeWV0IGhhbmRsaW5nIEVYQ0VQVElPTgotCQlpZiAoZ2V0U291cmNlVHlwZSgpLmlzSW50ZXJmYWNlKCkpCi0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCWVsc2UKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwpOwotCX0KLQotCS8qKgotCSAqIHNldE5hbWluZyAtIHNldCB0aGUgbmFtaW5nIHZhbHVlcyBoZXJlIC0gcXVhbGlmaWVkIG5hbWUgKHBhY2thZ2UgbmFtZSArIG5hbWUpIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MgLSBJRCAtCi0JICogc2ltcGxlIG5hbWUsIGlkZW50aXR5IHdpdGhpbiBhIHBhY2thZ2UgZG9jdW1lbnQgLSBOTyBVVUlEISEhCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQkvLwlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCS8vCWphdmFDbGFzc1RhcmdldC5yZWZTZXRVVUlEKChTdHJpbmcpIG51bGwpOwotCQkvLwkoKFhNSVJlc291cmNlKWphdmFDbGFzc1RhcmdldC5lUmVzb3VyY2UoKSkuc2V0SUQoamF2YUNsYXNzVGFyZ2V0LGdldFNpbXBsZU5hbWUoZ2V0U291cmNlVHlwZSgpLmdldE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIHNldFN1cGVyIC0gc2V0IG91ciBzdXBlcnR5cGUgaGVyZSwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBlcigpIHRocm93cyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIHsKLQkJQ2xhc3Mgc3VwZXJDbGFzcyA9IG51bGw7Ci0JCXN1cGVyQ2xhc3MgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0U3VwZXJjbGFzcygpOwotCQlpZiAoc3VwZXJDbGFzcyAhPSBudWxsKSB7Ci0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0U3VwZXJ0eXBlKGNyZWF0ZUphdmFDbGFzc1JlZihzdXBlckNsYXNzLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgY2FuIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNvdXJjZVR5cGVFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhRmllbGRKREtBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhRmllbGRKREtBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZmE2YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUZpZWxkSkRLQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUZpZWxkSkRLQWRhcHRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUZpZWxkSkRLQWRhcHRvciBleHRlbmRzIEpES0FkYXB0b3IgewotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBzb3VyY2VGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIENsYXNzIHBhcmVudFR5cGUgPSBudWxsOwotCXB1YmxpYyBKYXZhRmllbGRKREtBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFuQWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCBhbkFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JLyoqCi0JICogZ2V0UGFyZW50VHlwZSAtIHJldHVybiB0aGUgQ2xhc3Mgd2hpY2ggY29ycmVzcG9uZHMgdG8gb3VyIHBhcmVudCBKYXZhQ2xhc3MKLQkgKiB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJRmllbGQgdGFyZ2V0RmllbGQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQkJSmF2YUNsYXNzIHBhcmVudEphdmFDbGFzcyA9IHRhcmdldEZpZWxkLmdldEphdmFDbGFzcygpOwotCQkJSmF2YUNsYXNzSkRLQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKREtBZGFwdG9yKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihwYXJlbnRKYXZhQ2xhc3MuZUFkYXB0ZXJzKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCWlmIChwYSAhPSBudWxsKQotCQkJCXBhcmVudFR5cGUgPSBwYS5nZXRTb3VyY2VUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFR5cGU7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZUZpZWxkKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlRmllbGQgIT0gbnVsbDsKLSAgICB9Ci0JLyoqCi0JICogZ2V0U291cmNlRmllbGQgLSByZXR1cm4gdGhlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHdoaWNoIGRlc2NyaWJlcyBvdXIgaW1wbGVtZW50aW5nIGZpZWxkCi0JICovCi0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGdldFNvdXJjZUZpZWxkKCkgewotCQlpZiAoc291cmNlRmllbGQgPT0gbnVsbCkgewotCQkJQ2xhc3MgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnRUeXBlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VGaWVsZCA9IHBhcmVudC5nZXREZWNsYXJlZEZpZWxkKCgoRmllbGQpIGdldFRhcmdldCgpKS5nZXROYW1lKCkpOwotCQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gT0ssIGNhcnJ5IG9uCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VGaWVsZDsKLQl9Ci0JcHVibGljIEZpZWxkIGdldFRhcmdldEZpZWxkKCkgewotCQlyZXR1cm4gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIEphdmFDbGFzcyBhZGFwdG9yOgotCSAqCS0gc2V0IG1vZGlmaWVycwotCSAqCS0gc2V0IG5hbWUKLQkgKiAJLSBzZXQgdHlwZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCWlmIChnZXRTb3VyY2VGaWVsZCgpICE9IG51bGwpIHsKLQkJCXNldE1vZGlmaWVycygpOwotCQkJc2V0VHlwZSgpOwotCQkJc2V0SW5pdGlhbGl6ZXJJZlBvc3NpYmxlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFVzZWQgZm9yIHRoZSB2ZXJ5IG5hcnJvdyBjYXNlIG9mIGZpbmFsIHN0YXRpYyBTdHJpbmdzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5pdGlhbGl6ZXJJZlBvc3NpYmxlKCkgewotCQlpZiAoIShnZXRUYXJnZXRGaWVsZCgpLmlzU3RhdGljKCkgJiYgZ2V0VGFyZ2V0RmllbGQoKS5pc0ZpbmFsKCkgJiYgImphdmEubGFuZy5TdHJpbmciLmVxdWFscygoKEphdmFIZWxwZXJzKSBnZXRUYXJnZXRGaWVsZCgpLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSkpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZhbHVlID0gKFN0cmluZykgZ2V0U291cmNlRmllbGQoKS5nZXQobnVsbCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlCi0JCQl2YWx1ZSA9ICJcIiIuY29uY2F0KHZhbHVlKS5jb25jYXQoIlwiIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJQmxvY2sgYUJsb2NrID0gY3JlYXRlQmxvY2soZ2V0VGFyZ2V0RmllbGQoKS5nZXROYW1lKCksIHZhbHVlKTsKLQkJZ2V0VGFyZ2V0RmllbGQoKS5zZXRJbml0aWFsaXplcihhQmxvY2spOwotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJRmllbGQgamF2YUZpZWxkVGFyZ2V0ID0gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQkJLy8gRm9yIEpESyByZWZsZWN0aW9uLCBJIGRvbid0IHRoaW5rIHdlIGNhbiBzZXQgdGhlIGluaXRpYWxpemVyCi0JCWludCBtb2RpZmllcnMgPSBnZXRTb3VyY2VGaWVsZCgpLmdldE1vZGlmaWVycygpOwotCQlqYXZhRmllbGRUYXJnZXQuc2V0U3RhdGljKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpOwotCQlqYXZhRmllbGRUYXJnZXQuc2V0VHJhbnNpZW50KGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzVHJhbnNpZW50KG1vZGlmaWVycykpOwotCQlqYXZhRmllbGRUYXJnZXQuc2V0Vm9sYXRpbGUoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNWb2xhdGlsZShtb2RpZmllcnMpKTsKLQkJamF2YUZpZWxkVGFyZ2V0LnNldEZpbmFsKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzRmluYWwobW9kaWZpZXJzKSk7Ci0JCS8vIFNldCB2aXNpYmlsaXR5Ci0JCWlmIChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCWVsc2UgaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpKQotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQllbHNlIGlmIChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKQotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCWVsc2UKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRV9MSVRFUkFMKTsKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgdHlwZSBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHlwZSgpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUoZ2V0U291cmNlRmllbGQoKS5nZXRUeXBlKCkpOwotCQlzZXRGaWVsZFR5cGUoZ2V0VGFyZ2V0RmllbGQoKSwgdHlwZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFKREtBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUpES0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMGI1ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUpES0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFKREtBZGFwdGVyRmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvMTMvMjAwMCAxOjIwOjMxIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSB7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc0xvYWRlcjsKLQkvKioKLQkgKiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFKREtBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJLy9hZGFwdGVyS2V5ID0gVFlQRV9OQU1FOwotCX0KLQkvKioKLQkgKiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFKREtBZGFwdGVyRmFjdG9yeShDbGFzc0xvYWRlciBhQ2xhc3NMb2FkZXIpIHsKLQkJdGhpcygpOwotCQlzZXRDb250ZXh0Q2xhc3NMb2FkZXIoYUNsYXNzTG9hZGVyKTsKLQl9Ci0JcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFDbGFzc0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiBuZXcgSmF2YUNsYXNzSkRLQWRhcHRvcih0YXJnZXQsIHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUZpZWxkQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRmllbGRKREtBZGFwdG9yKHRhcmdldCwgdGhpcyk7Ci0JfQotCXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhTWV0aG9kQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhTWV0aG9kSkRLQWRhcHRvcih0YXJnZXQsIHRoaXMpOwotCX0KLQkvLyBGbHVzaCBBTEwgYWRhcHRlcnMsIHdvcnN0IGNhc2UKLQlwdWJsaWMgdm9pZCBmbHVzaEFsbCgpIHsKLQkJaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCUl0ZXJhdG9yIGkgPSByZWZsZWN0ZWQudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkKLQkJCQkgKChKYXZhQ2xhc3NKREtBZGFwdG9yKSBpLm5leHQoKSkuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCQl9IGZpbmFsbHkgewotCQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQkJfQotCX0KLQkvLyBGbHVzaCB0aGUgYWRhcHRlciBmb3IgYSBzb3VyY2Ugb2JqZWN0Ci0JcHVibGljIHZvaWQgZmx1c2hSZWZsZWN0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJSmF2YUNsYXNzSkRLQWRhcHRvciBhID0gKEphdmFDbGFzc0pES0FkYXB0b3IpIHJlZmxlY3RlZC5nZXQoc291cmNlKTsKLQkJaWYgKGEgIT0gbnVsbCkKLQkJCWEuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDExLzA3LzAwIDM6Mzg6MTIgUE0pCi0JICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIGNvbnRleHRDbGFzc0xvYWRlcjsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNy8wMCAzOjM4OjEyIFBNKQotCSAqIEBwYXJhbSBuZXdDb250ZXh0Q2xhc3NMb2FkZXIgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dENsYXNzTG9hZGVyKGphdmEubGFuZy5DbGFzc0xvYWRlciBuZXdDb250ZXh0Q2xhc3NMb2FkZXIpIHsKLQkJY29udGV4dENsYXNzTG9hZGVyID0gbmV3Q29udGV4dENsYXNzTG9hZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFNZXRob2RKREtBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhTWV0aG9kSkRLQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTIyZmEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFNZXRob2RKREtBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGs7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhTWV0aG9kSkRLQWRhcHRvci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjM1ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5NZXRob2RJbXBsOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhTWV0aG9kSkRLQWRhcHRvciBleHRlbmRzIEpES0FkYXB0b3IgaW1wbGVtZW50cyBJSmF2YU1ldGhvZEFkYXB0ZXIgewotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0IHNvdXJjZUFjY2Vzc2libGUgPSBudWxsOyAvLyBDb3VsZCBiZSBtZXRob2Qgb3IgY3Rvci4KLQlwcm90ZWN0ZWQgQ2xhc3MgcGFyZW50VHlwZSA9IG51bGw7Ci0JLy8gY2FjaGUgYSBzdGF0aWMgZW1wdHkgQ2xhc3NbXSBmb3Igbm8gcGFybSBtZXRob2RzCi0JcHJvdGVjdGVkIHN0YXRpYyBDbGFzc1tdIGVtcHR5Q2xhc3NBcnJheSA9IG5ldyBDbGFzc1swXTsKLQkvLyBjYWNoZSBhIHN0YXRpYyBlbXB0eSBTdHJpbmdbXSwgdG9vCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBlbXB0eVN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1swXTsKLQlwdWJsaWMgSmF2YU1ldGhvZEpES0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBKYXZhSkRLQWRhcHRlckZhY3RvcnkgYW5BZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIGFuQWRhcHRlckZhY3RvcnkpOwotCX0KLQkvKioKLQkgKiBhZGRFeGNlcHRpb25zIC0gcmVmbGVjdCBvdXIgZXhjZXB0aW9uIGxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGNlcHRpb25zKCkgewotCQlDbGFzc1tdIGV4Y2VwdGlvbnMgPQotCQkJKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQkJCQk/ICgoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldEV4Y2VwdGlvblR5cGVzKCkKLQkJCQk6ICgoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLQkJLy8JRUxpc3QgZXhMaXN0ID0gKEVMaXN0KSBqYXZhTWV0aG9kVGFyZ2V0LnByaW1SZWZWYWx1ZShKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kX0phdmFFeGNlcHRpb25zKCkpOwotCQlMaXN0IGV4TGlzdCA9IGdldE1ldGhvZFRhcmdldCgpLmdldEphdmFFeGNlcHRpb25zR2VuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJZXhMaXN0LmFkZChjcmVhdGVKYXZhQ2xhc3NSZWYoZXhjZXB0aW9uc1tpXS5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNZXRob2RJbXBsIGdldE1ldGhvZFRhcmdldCgpIHsKLQkJcmV0dXJuIChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0JLyoqCi0JICogYWRkUGFyYW1ldGVycyAtIHJlZmxlY3Qgb3VyIHBhcm1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1ldGVycygpIHsKLQkJQ2xhc3NbXSBwYXJtVHlwZXMgPQotCQkJKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQkJCQk/ICgoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldFBhcmFtZXRlclR5cGVzKCkKLQkJCQk6ICgoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJTWV0aG9kSW1wbCBqYXZhTWV0aG9kVGFyZ2V0ID0gZ2V0TWV0aG9kVGFyZ2V0KCk7Ci0JCS8vIAlMaXN0IHBMaXN0ID0gKExpc3QpIGphdmFNZXRob2RUYXJnZXQucHJpbVJlZlZhbHVlKEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RfUGFyYW1ldGVycygpKTsKLQkJTGlzdCBwTGlzdCA9IGphdmFNZXRob2RUYXJnZXQuZ2V0UGFyYW1ldGVyc0dlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJcExpc3QuYWRkKGNyZWF0ZUphdmFQYXJhbWV0ZXIoamF2YU1ldGhvZFRhcmdldCwgImFyZyIgKyBpLCBnZXRUeXBlTmFtZShwYXJtVHlwZXNbaV0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQl9Ci0JLyoqCi0JICogZ2V0UGFyZW50VHlwZSAtIHJldHVybiB0aGUgQ2xhc3Mgd2hpY2ggY29ycmVzcG9uZHMgdG8gb3VyIHBhcmVudCBKYXZhQ2xhc3MKLQkgKiB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJTWV0aG9kIHRhcmdldE1ldGhvZCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQkJSmF2YUNsYXNzIHBhcmVudEphdmFDbGFzcyA9IHRhcmdldE1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCQlKYXZhQ2xhc3NKREtBZGFwdG9yIHBhID0gKEphdmFDbGFzc0pES0FkYXB0b3IpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHBhcmVudEphdmFDbGFzcy5lQWRhcHRlcnMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJaWYgKHBhICE9IG51bGwpCi0JCQkJcGFyZW50VHlwZSA9IHBhLmdldFNvdXJjZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50VHlwZTsKLQl9Ci0JLyoqCi0JICogZ2V0UGFybVR5cGVTaWduYXR1cmVzIC0gcmV0dXJuIGFuIGFycmF5IG9mIENsYXNzZXMgZm9yIG91ciBwYXJhbWV0ZXIgdHlwZXMKLQkgKiAJRm9yIHJlZmxlY3Rpb24gcHVycG9zZXMsIHdlIGNhbiBvbmx5IHJlbHkgb24gb3VyIElELCBzaW5jZSBvdXIgcGFybXMgbWF5Ci0JICogIG5vdCB5ZXQgYmUga25vd24uCi0JICovCi0JcHJvdGVjdGVkIENsYXNzW10gZ2V0UGFybVR5cGVzKCkgewotCQlNZXRob2QgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQlTdHJpbmcgaWQgPSAoKFhNSVJlc291cmNlKSBqYXZhTWV0aG9kVGFyZ2V0LmVSZXNvdXJjZSgpKS5nZXRJRChqYXZhTWV0aG9kVGFyZ2V0KTsKLQkJU3RyaW5nW10gdHlwZU5hbWVzID0gZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKGlkKTsKLQkJaWYgKHR5cGVOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5Q2xhc3NBcnJheTsKLQkJaW50IG4gPSB0eXBlTmFtZXMubGVuZ3RoOwotCQlpZiAobiA9PSAwKQotCQkJcmV0dXJuIGVtcHR5Q2xhc3NBcnJheTsKLQkJQ2xhc3NbXSB0eXBlcyA9IG5ldyBDbGFzc1tuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJCXR5cGVzW2ldID0gZ2V0VHlwZSh0eXBlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlQWNjZXNzaWJsZSgpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsgCi0gICAgICAgIHJldHVybiBzb3VyY2VBY2Nlc3NpYmxlICE9IG51bGw7Ci0gICAgfQotCS8qKgotCSAqIGdldHNvdXJjZU1ldGhvZCAtIHJldHVybiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHdoaWNoIGRlc2NyaWJlcyBvdXIgaW1wbGVtZW50aW5nIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0IGdldFNvdXJjZUFjY2Vzc2libGUoKSB7Ci0JCWlmIChzb3VyY2VBY2Nlc3NpYmxlID09IG51bGwpIHsKLQkJCUNsYXNzIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50VHlwZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJQ2xhc3NbXSBwYXJtVHlwZXMgPSB0aGlzLmdldFBhcm1UeXBlcygpOwotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZUFjY2Vzc2libGUgPSBwYXJlbnQuZ2V0RGVjbGFyZWRNZXRob2QoKChNZXRob2QpIGdldFRhcmdldCgpKS5nZXROYW1lKCksIHBhcm1UeXBlcyk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gT0ssIGNhbid0IHJlZmxlY3QgaXQKLQkJCQl9Ci0KLQkJCQlpZiAoc291cmNlQWNjZXNzaWJsZSA9PSBudWxsKSB7Ci0JCQkJCS8vIEl0IHdhc24ndCBhIG1ldGhvZCwgdHJ5IGZvciBjb25zdHJ1Y3Rvci4KLQkJCQkJdHJ5IHsKLQkJCQkJCXNvdXJjZUFjY2Vzc2libGUgPSBwYXJlbnQuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJtVHlwZXMpOwotCQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gT0ssIGNhbid0IHJlZmxlY3QgaXQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlQWNjZXNzaWJsZTsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IFVVSUQsIG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIE1ldGhvZCBhZGFwdG9yOgotCSAqCS0gc2V0IG1vZGlmaWVycwotCSAqCS0gc2V0IG5hbWUKLQkgKiAJLSBzZXQgcmV0dXJuIHR5cGUKLQkgKiAJLSBhZGQgcGFyYW1ldGVycwotCSAqIAktIGFkZCBleGNlcHRpb25zCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJaWYgKGdldFNvdXJjZUFjY2Vzc2libGUoKSAhPSBudWxsKSB7Ci0JCQkoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLnNldElzR2VuZXJhdGVkKGZhbHNlKTsKLQkJCXNldE1vZGlmaWVycygpOwotCQkJc2V0TmFtaW5nKCk7Ci0JCQlzZXRSZXR1cm5UeXBlKCk7Ci0JCQlhZGRQYXJhbWV0ZXJzKCk7Ci0JCQlhZGRFeGNlcHRpb25zKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhTWV0aG9kQWRhcHRlciNyZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlNZXRob2QgbWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCWludCBtb2RpZmllcnMgPQotCQkJKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQkJCQk/ICgoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldE1vZGlmaWVycygpCi0JCQkJOiAoKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldE1vZGlmaWVycygpOwotCQltZXRob2RUYXJnZXQuc2V0QWJzdHJhY3QoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNBYnN0cmFjdChtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldEZpbmFsKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzRmluYWwobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXROYXRpdmUoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNOYXRpdmUobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXRTdGF0aWMoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXRTeW5jaHJvbml6ZWQoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTeW5jaHJvbml6ZWQobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXRDb25zdHJ1Y3RvcihnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvcik7Ci0JCS8vIFNldCB2aXNpYmlsaXR5Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCWlmICgoamF2YUNsYXNzLmdldEtpbmQoKSA9PSBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCkgfHwgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpKQotCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCWVsc2UgaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpKQotCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQllbHNlIGlmIChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKQotCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCWVsc2UKLQkJCS8vVmlzaWJpbGl0eSBtdXN0IGJlIHBhY2thZ2UKLQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRV9MSVRFUkFMKTsKLQl9Ci0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUKLQkgKiAJLSBxdWFsaWZpZWQgbmFtZSBtdXN0IGJlIHNldCBmaXJzdCwgdGhhdCBpcyB0aGUgcGF0aCB0byB0aGUgcmVhbCBKYXZhIGNsYXNzCi0JICoJLSBJRAotCSAqIAktIG5hbWUtYmFzZWQgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJLy8KLQkJLy8JbmFtaW5nIGlzIGN1cnJlbnRseSBhIG5vLW9wIHNpbmNlIHRoZSBuYW1lIGFuZCBVVUlEIG11c3QgYmUgc2V0IHByaW9yIHRvIHJlZmxlY3Rpb24KLQkJLy8JLi4uYW5kIElEIGlzIHJlZHVuZGFudCB3aXRoIFVVSUQuCi0JCS8vCWphdmFGaWVsZFRhcmdldC5zZXRJRChwYXJlbnQuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIl8iICsgamF2YUZpZWxkVGFyZ2V0LmdldE5hbWUoKSk7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHJldHVybiB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXR1cm5UeXBlKCkgewotCQlpZiAoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSB7Ci0JCQlDbGFzcyB0eXBlID0gKChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0UmV0dXJuVHlwZSgpOwotCQkJTWV0aG9kIGphdmFNZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJCS8qCi0JCQkJCUphdmFQYXJhbWV0ZXIgbmV3UGFyYW1ldGVyID0gY3JlYXRlSmF2YVBhcmFtZXRlcihqYXZhTWV0aG9kVGFyZ2V0LCAicmVzdWx0IiwgZ2V0VHlwZU5hbWUodHlwZSkpOy8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3UGFyYW1ldGVyLnNldFBhcmFtZXRlcktpbmQoTWV0YUphdmFQYXJhbWV0ZXJLaW5kLlJFVFVSTik7Ci0JCQkJCWphdmFNZXRob2RUYXJnZXQuZ2V0UGFyYW1ldGVycygpLmFkZChuZXdQYXJhbWV0ZXIpOwotCQkJKi8KLQkJCWphdmFNZXRob2RUYXJnZXQuc2V0RVR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKGdldFR5cGVOYW1lKHR5cGUpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL25scy9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvbmxzL1Jlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWVmNmRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvbmxzL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHM7Ci0vKgotICogICRSQ1NmaWxlOiBSZXNvdXJjZUhhbmRsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJqYXZhYWRhcHRlcnMiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZT0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCQkKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCXRyeSB7cmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7cmV0dXJuIGdldFN0cmluZyhrZXkpO30KLQotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2JlYW5pbmZvL0lJbnRyb3NwZWN0aW9uQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9iZWFuaW5mby9JSW50cm9zcGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlZjBmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2JlYW5pbmZvL0lJbnRyb3NwZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IElJbnRyb3NwZWN0aW9uQWRhcHRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgQmVhbmluZm8gYWRhcHRlci4gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgotICogaXMgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHNvIHRoYXQgYmVhbmluZm8gY29kZSB3aWxsIG5vdCBiZSBsb2FkZWQKLSAqIHVubGVzcyBpdCBuZWVkcyB0byBiZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElJbnRyb3NwZWN0aW9uQWRhcHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSW50cm9zcGVjdGlvbkFkYXB0ZXIuY2xhc3M7Ci0JcHVibGljIHZvaWQgaW50cm9zcGVjdElmTmVjZXNzYXJ5KCk7Ci0JcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpOwotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JcHVibGljIEVMaXN0IGdldEVPcGVyYXRpb25zKCk7Ci0JcHVibGljIEJhc2ljRUxpc3QgZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQlwdWJsaWMgRUxpc3QgZ2V0RXZlbnRzKCk7Ci0JcHVibGljIEVMaXN0IGdldEFsbEV2ZW50cygpOwotCXB1YmxpYyBFTGlzdCBnZXRBbGxQcm9wZXJ0aWVzKCk7CQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5pdC9KYXZhSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbml0L0phdmFJbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzY4YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbml0L0phdmFJbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluaXQ7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhSW5pdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVhNSUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIEphdmEgUmVmbGVjdGlvbiBtZWNoYW5pc21zLiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFJbml0IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gcGx1Z2luX2luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJaW5pdCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChib29sZWFuIHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJaWYgKHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJCQlwcmVSZWdpc3RlclBhY2thZ2VzKCk7Ci0JCQkJc2V0RGVmYXVsdFJlc291cmNlRmFjdG9yeSgpOwotCQkJfQotCQkJLy9SZWdpc3RlciByZXNvdXJjZSBmYWN0b3J5Ci0JCQlKYXZhWE1JRmFjdG9yeUltcGwucmVnaXN0ZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlUmVnaXN0ZXJQYWNrYWdlcygpIHsKLQkJLy9lY29yZQotCQlpZiAoIUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmNvbnRhaW5zS2V5KCJlY29yZS54bWkiKSkgLy8kTk9OLU5MUy0xJAotCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KCJlY29yZS54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy9qYXZhCi0JCWlmICghRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuY29udGFpbnNLZXkoImphdmEueG1pIikpIC8vJE5PTi1OTFMtMSQKLQkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dCgiamF2YS54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlRmFjdG9yeSgpIHsKLQkJLy9UaGlzIGlzIG5vdCBkb25lIG91dHNpZGUgb2YgRWNsaXBzZQotCQlpZiAoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5nZXQoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTikgPT0gbnVsbCkKLQkJCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KAotCQkJCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sCi0JCQkJbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFBsdWdpbkluaXQoYm9vbGVhbiBiUGx1Z2luSW5pdCkgewotCQkvLyBIZXJlJ3Mgd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBiZSByZWFkLgotCQlwbHVnaW5faW5pdGlhbGl6ZWQgPSBiUGx1Z2luSW5pdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3MDJhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBJSW5zdGFudGlhdGlvbkhhbmRsZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGU7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgdGhlIEluc3RhbnRpYXRpb24gaGFuZGxlci4gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgotICogaXMgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHNvIHRoYXQgaW5zdGFudGlhdGlvbiBjb2RlIHdpbGwgbm90IGJlIGxvYWRlZAotICogdW5sZXNzIGl0IG5lZWRzIHRvIGJlLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25IYW5kbGVyIHsKLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgdGhlIGFkYXB0ZXIgaGFuZGxlcyB0aGUgZGF0YXR5cGUKLQkgKiBvciB3aGV0aGVyIHRoZSBzdGFuZGFyZCBFRmFjdG9yeSBkb2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNEYXRhVHlwZShKYXZhRGF0YVR5cGUgdHlwZSk7Ci0JCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBhZGFwdGVyIGhhbmRsZXMgdGhlIEVDbGFzcyBvciB0aGUKLQkgKiBzdGFuZGFyZCBFRmFjdG9yeSBkb2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZXNDbGFzcyhFQ2xhc3MgdHlwZSk7Ci0JCi0JLyoqCi0JICogSWYgYWRhcHRlckhhbmRsZXNJbnN0YW5jZSByZXR1cm5zIHRydWUsIHRoZW4KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0byBjcmVhdGUgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgamF2YUNsYXNzKTsKLQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzYxNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjM1ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRmFjdG9yeUltcGw7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIGEgZmFjdG9yeSBmb3IgSUluc3RhbnRpYXRpb25IYW5kbGVyJ3MuIEl0IGlzIGF0dGFjaGVkIGFzCi0gKiBhbiBhZGFwdGVyIG9uIHRoZSBSZXNvdXJjZVNldCB0aGF0IGNvbnRhaW5zIHRoZSBqYXZhIG1vZGVsLiBKYXZhWE1JRmFjdG9yeQotICogd2lsbCB1c2UgaXQgdG8gcmV0cmlldmUgaXRzIElJbnN0YW50aWF0aW9uSGFuZGxlci4gSWYgdGhlIGFkYXB0ZXIgaXMgbm90Ci0gKiBmb3VuZCwgdGhlbiBubyBpbnN0YW50aWF0aW9uIGhhbmRsZXIgZXhpc3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyIGV4dGVuZHMgQWRhcHRlciB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDbGFzcyBBREFQVEVSX0tFWSA9IElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmNsYXNzOwotCQotCS8qKgotCSAqIFJldHVybiBhbiBJSW5zdGFudGlhdGlvbkhhbmRsZXIuCi0JICovCi0JcHVibGljIElJbnN0YW50aWF0aW9uSGFuZGxlciBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcihKYXZhRmFjdG9yeUltcGwgZmFjdG9yeSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25JbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGM5ZGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvaW5zdGFudGlhdGlvbi9JSW5zdGFudGlhdGlvbkluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBJSW5zdGFudGlhdGlvbkluc3RhbmNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjUgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFuIGluc3RhbmNlLiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gKiBpcyBpbiBhIHNlcGFyYXRlIHByb2plY3Qgc28gdGhhdCBpbnN0YW50aWF0aW9uIGNvZGUgd2lsbCBub3QgYmUgbG9hZGVkCi0gKiB1bmxlc3MgaXQgbmVlZHMgdG8gYmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbnRpYXRpb25JbnN0YW5jZSB7Ci0JLyoqCi0JICogQHJldHVybiBUaGUgSmF2YUhlbHBlcnMgZm9yIHRoZSBqYXZhIHR5cGUgb2YgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRKYXZhVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0FycmF5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9BcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1YTM5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0FycmF5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLSAqICAkUkNTZmlsZTogQXJyYXlUeXBlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotLyoqCi0gKiBEZXNjcmliZXMgYSBKYXZhIEFycmF5IHR5cGUKLSAqICAgIEZvciBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMsIGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUKLSAqICAgIHNwZWNpZmllZCBkaXJlY3RseS4gIFRoaXMgd291bGQgcmVxdWlyZSBpbnN0YW50aWF0aW5nIGEgY2hhaW4gb2YgY29tcG9uZW50IHR5cGVzCi0gKiAgICBzdWNoIGFzIFN0cmluZ1tdW11bXVtdLT5TdHJpbmdbXVtdW10tPlN0cmluZ1tdW10tPlN0cmluZ1tdLT5TdHJpbmcuCi0gKiAKLSAqICAgVGhlIGNvbXBvbmVudCB0eXBlIHJlbGF0aW9uc2hpcCB3aWxsIGJlIGNvbXB1dGVkIGlmIHRoZSBmaW5hbENvbXBvbmVudFR5cGUKLSAqICAgYW5kIGFycmF5IGRpbWVuc2lvbnMgaXMgc3BlY2lmaWVkLgotICogIAotICogICBGb3IgdGhpcyByZWFzb24sIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGNyZWF0ZSBpcyB0aHJvdWdoIHRoZSBKYXZhUmVmRmFjdG9yeSBmYWN0b3J5IG1ldGhvZDoKLSAqICAgICAgICBjcmVhdGVBcnJheVR5cGUoSmF2YUNsYXNzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJyYXlUeXBlIGV4dGVuZHMgSmF2YUNsYXNzewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEFycmF5RGltZW5zaW9ucyBhdHRyaWJ1dGUKLQkgKi8KLQlpbnQgZ2V0QXJyYXlEaW1lbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQXJyYXlEaW1lbnNpb25zIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0QXJyYXlEaW1lbnNpb25zKGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBDb21wb25lbnRUeXBlIHJlZmVyZW5jZQotCSAqLwotCUVDbGFzc2lmaWVyIGdldENvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZSNnZXRDb21wb25lbnRUeXBlIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBvbmVudFR5cGUoRUNsYXNzaWZpZXIgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBBcnJheSBUeXBlLgotCSAqIAotCSAqIEluIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZwotCSAqIHJlZmxlY3Rpb24uIEl0IHR1cm5zIG91dCB0byBiZSBtb3N0IGVmZmljaWVudCB0byBqdXN0IGRvIHRoaXMgYnkgdHJpbW1pbmcgdGhlCi0JICogbmFtZS4KLQkgKi8KLQlKYXZhSGVscGVycyBnZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheS4gCi0JICogCi0JICogSWYgdGhpcyBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZSB0aGUgbmVzdGVkCi0JICogYXJyYXkgdHlwZS4KLQkgKi8KLQlKYXZhSGVscGVycyBnZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIElzIHRoaXMgYW4gYXJyYXkgb2YgamF2YSBwcmltaXRpdmVzCi0JICovCi0JYm9vbGVhbiBpc1ByaW1pdGl2ZUFycmF5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTZXQgdGhlIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXZvaWQgc2V0Q29tcG9uZW50VHlwZShKYXZhSGVscGVycyBoZWxwZXJDb21wb25lbnRUeXBlKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQmxvY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4NjRjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotICogICRSQ1NmaWxlOiBCbG9jay5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJsb2NrIGV4dGVuZHMgRU9iamVjdHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBTb3VyY2UgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNvdXJjZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBDb250ZW50cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0Q29udGVudHMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQ29tbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Db21tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYzE2YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Db21tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBDb21tZW50LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50IGV4dGVuZHMgQmxvY2sgewotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9GaWVsZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9GaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGFhZmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotICogICRSQ1NmaWxlOiBGaWVsZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmllbGQgZXh0ZW5kcyBFVHlwZWRFbGVtZW50ewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzRmluYWwgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzU3RhdGljIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNTdGF0aWMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzU3RhdGljIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXRpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXRpYyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBKYXZhVmlzaWJpbGl0eSBhdHRyaWJ1dGUKLQkgKi8KLQlKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2dldEphdmFWaXNpYmlsaXR5IDxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQKLQkgKiBAc2VlICNnZXRKYXZhVmlzaWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnNpZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zaWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHJhbnNpZW50KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRGaWVsZF9UcmFuc2llbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVHJhbnNpZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1RyYW5zaWVudCA8ZW0+VHJhbnNpZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2llbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc2llbnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Vm9sYXRpbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Vm9sYXRpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZvbGF0aWxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRGaWVsZF9Wb2xhdGlsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNWb2xhdGlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNWb2xhdGlsZSA8ZW0+Vm9sYXRpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZvbGF0aWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1ZvbGF0aWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWb2xhdGlsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEphdmFDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEluaXRpYWxpemVyIHJlZmVyZW5jZQotCSAqLwotCUJsb2NrIGdldEluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNnZXRJbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxpemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbGl6ZXIoQmxvY2sgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBjbGFzcyB0aGF0IHRoaXMgZmllbGQgaXMgd2l0aGluLgotCSAqLwotCUphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIGZpZWxkIGFuIGFycmF5IHR5cGUuCi0JICovCi0JYm9vbGVhbiBpc0FycmF5KCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzk2MzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIzODU2OTA4NDc0Mjc4OTc2NTZMOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNU0dfUEFUVEVSTiA9IFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkphdmFfSW5oX0N5Y2xlX0VSUk9SXyIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uKEphdmFDbGFzcyBhU3ViY2xhc3MsIEphdmFDbGFzcyBhU3VwZXJjbGFzcykgewotCQl0aGlzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1TR19QQVRURVJOLCBuZXcgU3RyaW5nW117YVN1YmNsYXNzLmdldFF1YWxpZmllZE5hbWUoKSwgYVN1cGVyY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpfSkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODVmMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLSAqICAkUkNTZmlsZTogSW5pdGlhbGl6ZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbml0aWFsaXplciBleHRlbmRzIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNTdGF0aWMgYXR0cmlidXRlCi0JICovCi0JQm9vbGVhbiBnZXRJc1N0YXRpYygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIElzU3RhdGljIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0SXNTdGF0aWMoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBKYXZhQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldEphdmFDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXIjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEphdmFDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YUNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTb3VyY2UgcmVmZXJlbmNlCi0JICovCi0JQmxvY2sgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplciNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZShCbG9jayB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFDbGFzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4MjE4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhQ2xhc3MuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOS8xNSAxMzo0MjowNCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEBleHRlbmRzIEphdmFIZWxwZXJzCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzUHVibGljIDxlbT5QdWJsaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEltcGxlbWVudHNJbnRlcmZhY2VzIDxlbT5JbXBsZW1lbnRzIEludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRDbGFzc0ltcG9ydCA8ZW0+Q2xhc3MgSW1wb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0UGFja2FnZUltcG9ydHMgPGVtPlBhY2thZ2UgSW1wb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEZpZWxkcyA8ZW0+RmllbGRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEluaXRpYWxpemVycyA8ZW0+SW5pdGlhbGl6ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RGVjbGFyZWRDbGFzc2VzIDxlbT5EZWNsYXJlZCBDbGFzc2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RGVjbGFyaW5nQ2xhc3MgPGVtPkRlY2xhcmluZyBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEphdmFQYWNrYWdlIDxlbT5KYXZhIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRFdmVudHMgPGVtPkV2ZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEFsbEV2ZW50cyA8ZW0+QWxsIEV2ZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YUNsYXNzKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFDbGFzcyBleHRlbmRzIEVDbGFzcywgSmF2YUhlbHBlcnN7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01FVEhPRF9OQU1FID0gIioiOwotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuICBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIDsKLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWROYW1lZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgRmllbGRzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBUaGUgZmllbGQgcmVsYXRpb25zaGlwIGlzIGRlcml2ZWQgZnJvbSBjb250ZW50cy4KLQkgKi8gIAotCXB1YmxpYyBGaWVsZFtdIGxpc3RGaWVsZEV4dGVuZGVkKCk7Ci0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGxpc3Rpbmcgb3VyIE1ldGhvZHMsIGluY2x1ZGluZyBpbmhlcml0ZWQgbWV0aG9kcy4KLQkgKiBUaGUgbWV0aG9kIHJlbGF0aW9uc2hpcCBpcyBkZXJpdmVkIGZyb20gY29udGVudHMuCi0JICovICAKLQlwdWJsaWMgTWV0aG9kW10gbGlzdE1ldGhvZEV4dGVuZGVkKCk7Ci0vL0ZCICAgLyoqCi0vL0ZCICAgICogVGhpcyBpcyByZXF1aXJlZCBmb3IgaW50ZXJuYWwgcmVmbGVjdGlvbi4gRG8gbm90IHVzZS4KLS8vRkIgICAgKi8KLS8vRkIgICBPYmplY3QgcHJpbVJlZlZhbHVlKEVPYmplY3QgZmVhdHVyZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEtpbmQgYXR0cmlidXRlCi0JICovCi0JVHlwZUtpbmQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuVHlwZUtpbmQKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLaW5kKFR5cGVLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc1B1YmxpYyBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzUHVibGljKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMgPGVtPlB1YmxpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1B1YmxpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVibGljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzRmluYWwgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5hbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSW1wbGVtZW50c0ludGVyZmFjZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIENsYXNzSW1wb3J0IHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRDbGFzc0ltcG9ydCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBQYWNrYWdlSW1wb3J0cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0UGFja2FnZUltcG9ydHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRmllbGRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRGaWVsZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBJbml0aWFsaXplcnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEluaXRpYWxpemVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRGVjbGFyaW5nQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RGVjbGFyaW5nQ2xhc3MgPGVtPkRlY2xhcmluZyBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZWNsYXJpbmdDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVjbGFyaW5nQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRGVjbGFyZWRDbGFzc2VzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXREZWNsYXJlZENsYXNzZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEphdmFQYWNrYWdlIHJlZmVyZW5jZQotCSAqLwotCUphdmFQYWNrYWdlIGdldEphdmFQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEV2ZW50cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0RXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGwgRXZlbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsbCBFdmVudHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgRXZlbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudCIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QWxsRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlib29sZWFuIGlzTmVzdGVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JRmllbGQgZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiAgUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lIGZyb20gdGhpcyBKYXZhQ2xhc3Mgb3IgYW55IHN1cGVydHlwZXMuCi0JICogCi0JICogUmV0dXJuIG51bGwgaWYgYSBGaWVsZCBuYW1lZCBmaWVsZE5hbWUgaXMgbm90IGZvdW5kLgotCSAqLwotCUZpZWxkIGdldEZpZWxkRXh0ZW5kZWQoU3RyaW5nIGZpZWxkTmFtZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JRmllbGQgZ2V0RmllbGROYW1lZChTdHJpbmcgZmllbGROYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbGwgZmllbGRzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCUxpc3QgZ2V0RmllbGRzRXh0ZW5kZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBub3QgbG9vayB1cCB0aGUKLQkgKiBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCU1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgTGlzdCBvZiBTdHJpbmdzIHRoYXQgcmVwcmVzZW50IE1ldGhvZEVsZW1lbnQgc2lnbmF0dXJlcyBmcm9tIG1vc3QKLQkgKiBnZW5lcmFsIHRvIG1vc3Qgc3BlY2lmaWMuCi0JICovCi0JTGlzdCBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSAKLQkgKiBoaWVyYXJjaHkuCi0JICovCi0JTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbGwgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlMaXN0IGdldE1ldGhvZHNFeHRlbmRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzIGV4Y2x1ZGluZyBwYXJ0aWN1bGFyIGNsYXNzZXMgYW5kIG1ldGhvZHMuCi0JICogQHBhcmFtIGV4Y2x1ZGVkQ2xhc3NlcyAtIEEgbGlzdCBvZiBKYXZhQ2xhc3MgaW5zdGFuY2VzIHRvIGJlIGlnbm9yZWQuCi0JICogQHBhcmFtIGV4Y2x1ZGVkTWV0aG9kcyAtIEEgbGlzdCBvZiBNZXRob2QgaW5zdGFuY2VzIHRvIGJlIGlnbm9yZWQuCi0JICovCi0JTGlzdCBnZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhMaXN0IGV4Y2x1ZGVkQ2xhc3NlcywgTGlzdCBleGNsdWRlZE1ldGhvZHMpIDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIExpc3Qgb2YgTWV0aG9kcyB0aGF0IGJlZ2lucyB3aXRoIEBhTWV0aG9kTmFtZVByZWZpeCBhbmQgaXMgbm90Ci0JICogaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyAKLQkgKiB3aWxsIGJlIHJldHVybmVkLgotCi0JICovCi0JTGlzdCBnZXRPbmx5U3BlY2lmaWNNZXRob2RzKFN0cmluZyBhTWV0aG9kTmFtZVByZWZpeCwgTGlzdCBleGNsdWRlZE5hbWVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5Ci0JICogcXVhbGlmaWVkIHR5cGVzIG1hdGNoaW5nIGFsbCB0aGUgdHlwZXMgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cy4gIEl0IHdpbGwgbm90Ci0JICogbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlNZXRob2QgZ2V0UHVibGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbGwgbWV0aG9kcywgaXQgd2lsbCBub3QgZ28gdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JTGlzdCBnZXRQdWJsaWNNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYWxsIHB1YmxpYyBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCUxpc3QgZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvCi0JICogdGhhdCBvZiB0aGUgcGFyYW1ldGVyLgotCSAqLwotCUxpc3QgZ2V0UHVibGljTWV0aG9kc05hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCUphdmFDbGFzcyBnZXRTdXBlcnR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRlc3Qgd2hldGhlciB0aGUgcmVjZWl2ZXIgaW1wbGVtZW50cyB0aGUgcGFzc2VkIGludGVyZmFjZSAob3Igb25lIG9mIGl0cwotCSAqIHN1cGVydHlwZXMpLgotCSAqLwotCWJvb2xlYW4gaW1wbGVtZW50c0ludGVyZmFjZShKYXZhQ2xhc3MgaW50ZXJmYWNlVHlwZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBzdHJpbmcgc2hvd2luZyBvdXIgZGV0YWlscy4KLQkgKi8KLQlTdHJpbmcgaW5mb1N0cmluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4KLQkgKi8KLQlib29sZWFuIGluaGVyaXRzRnJvbShKYXZhQ2xhc3MgamF2YUNsYXNzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIERvZXMgdGhpcyB0eXBlIGV4aXN0LgotCSAqLwotCWJvb2xlYW4gaXNFeGlzdGluZ1R5cGUoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElzIHRoaXMgYW4gaW50ZXJmYWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc0ludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU2V0IHRoZSBzdXBlcnR5cGUuCi0JICovCi0Jdm9pZCBzZXRTdXBlcnR5cGUoSmF2YUNsYXNzIGphdmFjbGFzcykgdGhyb3dzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGFzc2VkIEphdmFDbGFzcyBjYW4gYmUgc2V0IGFzIHRoZSBzdXBlcnR5cGUKLQkgKiBvZiB0aGlzIEphdmFDbGFzcy4gIFRoaXMgbWV0aG9kIHdpbGwgdGVzdCB0byBzZWUgaWYgYUphdmFDbGFzcyB3aWxsCi0JICogY3JlYXRlIGEgY3ljbGUgaW4gdGhlIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4gIFJldHVybiB0cnVlIGlmIG5vCi0JICogaW5oZXJpdGFuY2UgY3ljbGUgd2lsbCBiZSBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRTdXBlcnR5cGUoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIDsKLQotCS8qKgotCSAqIEdldCB0aGUgRVN0cnVjdHVyYWxGZWF0dXJlcyB0aGF0IHJlcHJlc2VudCB0aGUgQmVhbkluZm8gcHJvcGVydGllcyBmb3IKLQkgKiBqdXN0IHRoaXMgSmF2YSBjbGFzcywgbm90IGluY2x1ZGluZyBpbmhlcml0ZWQuIEl0IHdpbGwgcmV0dXJuIGFueSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiB0aGF0IHdhcyBzcGVjaWZpZWQgYXMgYmVpbmcgYXQgdGhpcyBjbGFzcyBlaXRoZXIgdGhyb3VnaCB0aGUgWE1JIG92ZXJyaWRlIGRvY3VtZW50IG9yCi0JICogdGhyb3VnaCB0aGUgQmVhbkluZm8uIFN0cnVjdHVyYWwgZmVhdHVyZXMgdGhyb3VnaCB0aGUgWE1JIG1heSBub3QgYmUgYmVhbiBwcm9wZXJ0aWVzLAotCSAqIGJ1dCB0aGV5IGFyZSBwYXJ0IG9mIHRoZSBmZWF0dXJlcyBhdmFpbGFibGUgYXQgdGhpcyBjbGFzcyBvbmx5LiAKLQkgKiAKLQkgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgZ2V0RUF0dHJpYnV0ZXMoKSBhbmQgZ2V0RVJlZmVyZW5jZXMoKS4KLQkgKiAKLQkgKiBUbyByZXRyaWV2ZSBvbmx5IHRoZSBCZWFuIFByb3BlcnRpZXMsIHRoZW4gdXNlIEJlYW5pbmZvIAotCSAqIFV0aWxpdGllcy5nZXRQcm9wZXJ0aWVzSXRlcmF0b3IoamF2YWNsYXNzLmdldFByb3BlcnRpZXMoKSkgYW5kIHRoaXMgd2lsbCBpdGVyYXRlIG92ZXIKLQkgKiB0aGUgQmVhbiBQcm9wZXJ0eURlY29yYXRvcnMsIGFuZCBmaWx0ZXIgb3V0IHRoZSBub24tYmVhbiBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHByb3BlcnRpZXMgKGFzIEVTdHJ1Y3R1cmFsRmVhdHVyZSdzKSBmb3IgdGhpcyBqYXZhIGNsYXNzLiBUaGlzIGxpc3QgaXMKLQkgKiBub3QgbW9kaWZpYWJsZS4KLQkgKi8KLQlFTGlzdCBnZXRQcm9wZXJ0aWVzKCk7Ci0JCi0JLyoqCi0JICogR2V0IGFsbCBvZiB0aGUgRVN0cnVjdHVyYWxGZWF0dXJlcyB0aGF0IHJlcHJlc2VudCB0aGUgQmVhbkluZm8gcHJvcGVydGllcyBmb3IKLQkgKiBqdXN0IHRoaXMgSmF2YSBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZC4gSXQgd2lsbCByZXR1cm4gYW55IEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIHRoYXQgd2FzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBYTUkgb3ZlcnJpZGUgZG9jdW1lbnQgb3IKLQkgKiB0aHJvdWdoIHRoZSBCZWFuSW5mby4gU3RydWN0dXJhbCBmZWF0dXJlcyB0aHJvdWdoIHRoZSBYTUkgbWF5IG5vdCBiZSBiZWFuIHByb3BlcnRpZXMsCi0JICogYnV0IHRoZXkgYXJlIHBhcnQgb2YgdGhlIGZlYXR1cmVzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBUaGUgaXMgbGlrZSBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkgZXhjZXB0IHRoYXQgaWYgQmVhbkluZm8gaGlkZXMgYW55IGJlYW4gcHJvcGVydGllcwotCSAqIGZyb20gdGhlIHN1cGVyIGNsYXNzLCB0aGlzIGxpc3Qgd2lsbCBhbHNvIGhpZGUgdGhlbSwgd2hpbGUgZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcwotCSAqIHdpbGwgbm90LgotCSAqIAotCSAqIFRvIHJldHJpZXZlIG9ubHkgdGhlIEJlYW4gUHJvcGVydGllcywgdGhlbiB1c2UgQmVhbmluZm8gCi0JICogVXRpbGl0aWVzLmdldFByb3BlcnRpZXNJdGVyYXRvcihqYXZhY2xhc3MuZ2V0QWxsUHJvcGVydGllcygpKSBhbmQgdGhpcyB3aWxsIGl0ZXJhdGUgb3ZlcgotCSAqIHRoZSBCZWFuIFByb3BlcnR5RGVjb3JhdG9ycywgYW5kIGZpbHRlciBvdXQgdGhlIG5vbi1iZWFuIGZlYXR1cmVzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMsIGluY2x1ZGluZyBpbmhlcml0ZWQsIChhcyBFU3RydWN0dXJhbEZlYXR1cmUncykgZm9yIHRoaXMgY2xhc3MuIFRoaXMgbGlzdCBpcwotCSAqIG5vdCBtb2RpZmlhYmxlLgotCSAqLwotCUVMaXN0IGdldEFsbFByb3BlcnRpZXMoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZmxlY3Rpb24gdHlwZSwgaWYgaXQgZXhpc3RzLCBmb3IgdGhpcyBjbGFzcy4gSWYgcnVubmluZyB3aXRoaW4gRWNsaXBzZSB0aGlzCi0JICogd2lsbCBiZSBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGV9LCBvciBydW5uaW5nIG91dHNpZGUgb2YgRWNsaXBzZSBpdCB3aWxsIGJlIGEge0BsaW5rIGphdmEubGFuZy5DbGFzc30uCi0JICogCi0JICogQHJldHVybiBJVHlwZSBpZiBpbiBFY2xpcHNlLCBDbGFzcyBpZiBvdXRzaWRlIEVjbGlwc2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHR5cGUgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCU9iamVjdCBnZXRSZWZsZWN0aW9uVHlwZSgpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRGF0YVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YURhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNWI4NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFEYXRhVHlwZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBAZXh0ZW5kcyBKYXZhSGVscGVycwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YURhdGFUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFEYXRhVHlwZSBleHRlbmRzIEVDbGFzcywgSmF2YUhlbHBlcnN7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjYwNDIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUV2ZW50LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEgRXZlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YUV2ZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRXZlbnQgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmV7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFIZWxwZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFIZWxwZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2VmYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhSGVscGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFIZWxwZXJzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8yNy8yMDAwIDQ6NDI6MDQgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUhlbHBlcnMgZXh0ZW5kcyBFQ2xhc3MgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTl9OQU1FID0gImphdmEubGFuZy5Cb29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSX05BTUUgPSAiamF2YS5sYW5nLkNoYXJhY3RlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEJZVEVfTkFNRSA9ICJqYXZhLmxhbmcuQnl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9OQU1FID0gImphdmEubGFuZy5Eb3VibGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBGTE9BVF9OQU1FID0gImphdmEubGFuZy5GbG9hdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVHRVJfTkFNRSA9ICJqYXZhLmxhbmcuSW50ZWdlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExPTkdfTkFNRSA9ICJqYXZhLmxhbmcuTG9uZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX05BTUUgPSAiamF2YS5sYW5nLlNob3J0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9CT09MRUFOX05BTUUgPSAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fQ0hBUkFDVEVSX05BTUUgPSAiY2hhciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fQllURV9OQU1FID0gImJ5dGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0RPVUJMRV9OQU1FID0gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fRkxPQVRfTkFNRSA9ICJmbG9hdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fSU5URUdFUl9OQU1FID0gImludCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fTE9OR19OQU1FID0gImxvbmciOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX1NIT1JUX05BTUUgPSAic2hvcnQiOyAvLyROT04tTkxTLTEkCi0JCi0Jc3RhdGljIGZpbmFsIGludCBQUklNX05PVF9JRCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0JPT0xFQU5fSUQgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9DSEFSQUNURVJfSUQgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9CWVRFX0lEID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fRE9VQkxFX0lEID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fRkxPQVRfSUQgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9JTlRFR0VSX0lEID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fTE9OR19JRCA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX1NIT1JUX0lEID0gODsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHF1YWxpZmllZCBuYW1lICh3aXRoIHVzaW5nICcuJyBmb3IgaW5uZXIgY2xhc3NlcykuIFdpbGwgcmV0dXJuIHRoZSBuYW1lIGlmIHByaW1pdGl2ZSB0b28gKGUuZy4gImJvb2xlYW4iKQotCSAqIE5vdGU6IFRoaXMgc2hvdWxkIG9mIGJlZW4gZ2V0IHRoZSBzaW1wbGUgbmFtZSBhbmQgbm90IHRoZSBxdWFsaWZlZCBuYW1lLCBidXQgaXQgaXMgdG9vIGxhdGUgYW5kIGhhcyBiZWVuIGVzdGFibGlzaGVkCi0JICogYXMgdGhlIEFQSS4gVXNlIDxjb2RlPmdldFNpbXBsZU5hbWUoKTwvY29kZT4gaW5zdGVhZCBpZiB5b3Ugd2FudCB0aGUgbmFtZSBub3QgcXVhbGlmaWVkLgotCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlLgotCSAqIEBzZWUgSmF2YUhlbHBlcnMjZ2V0U2ltcGxlTmFtZSgpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhTmFtZSgpOwotCS8qKgotCSAqIEdldCB0aGUgc2ltcGxlIG5hbWUuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHByaW1pdGl2ZSwgb3IgaWYgYSBjbGFzcywgdGhlIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZS4gQW5kIGlmIGl0IGlzIGFuCi0JICogaW5uZXIgY2xhc3MsIGl0IHdpbGwgdXNlICcuJyBpbnN0ZWFkIG9mICckJy4gSWYgeW91IHdhbnQgdGhlIHNpbXBsZSBuYW1lIGZvciByZWZsZWN0aW9uIChpLmUuIHdpdGggJyQnKSB1c2UgPGNvZGU+Z2V0TmFtZSgpPC9jb2RlPi4KLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSAobm8gcGFja2FnZSkgb2YgdGhlIHR5cGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByaW1pdGl2ZSB0eXBlIHRoYXQgdGhpcyBoZWxwZXIgd3JhcHBlcnMgb3IgaXMgKGUuZy4gImphdmEubGFuZy5JbnRlZ2VyIiBhbmQgImludCIgdHlwZXMgcmV0dXJuICJpbnQiIHR5cGUpLiBJZiBub3QgYSBwcmltaXRpdmUKLQkgKiBvciBhIHdyYXBwZXIgZm9yIGEgcHJpbWl0aXZlLCB0aGVuIHJldHVybiBudWxsLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YURhdGFUeXBlIGdldFByaW1pdGl2ZSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgcHJpbWl0aXZlIGlkIHRoYXQgdGhpcyBoZWxwZXIgd3JhcHBlcnMgb3IgaXMgKGUuZy4gImphdmEubGFuZy5JbnRlZ2VyIiBhbmQgImludCIgd2lsbCByZXR1cm4ge0BsaW5rIEphdmFIZWxwZXJzI1BSSU1fSU5URUdFUl9JRH0pLiBJZgotCSAqIG5vdCBhIHdyYXBwZXIgZm9yIGEgcHJpbWl0aXZlIHRoZW4gcmV0dXJuIHtAbGluayBKYXZhSGVscGVycyNQUklNX05PVF9JRH0uCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJpbWl0aXZlSUQoKTsKLQkvKioKLQkgKiBUbyBiZSB1c2VkIGJ5IHBlb3BsZSB0aGF0IG5lZWQgdG8gZ2V0IHRoZSBxdWFsaWZpZWQgbmFtZS4gVGhpcyB3b3VsZCB1c2UgJy4nIGZvciBpbm5lciBjbGFzc2VzCi0JICogYW5kIGluY2x1ZGUgdGhlIHBhY2thZ2UgbmFtZS4KLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSwgaW5jbHVkaW5nIHBhY2thZ2UuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0V3JhcHBlcigpOwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKTsKLQkvKioKLQkgKiBDYW4gYW4gb2JqZWN0IG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MgYmUgYXNzaWduZWQgdG8gYW4KLQkgKiBvYmplY3Qgb2YgdGhpcyBjbGFzcz8gSW4gb3RoZXIgd29yZHMgaXMgdGhpcyBjbGFzcyBhCi0JICogc3VwZXJ0eXBlIG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MsIG9yIGlzIGl0IHN1cGVyaW50ZXJmYWNlCi0JICogb2YgaXQ/IE9yIGluIHRoZSBjYXNlIG9mIHByaW1pdGl2ZXMsIGFyZSB0aGV5IHRoZSBzYW1lLiAKLQkgKiBAcGFyYW0gYUNsYXNzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhc3NpZ25hYmxlIGZyb20gdGhlIGdpdmVuIGNsYXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oRUNsYXNzaWZpZXIgYUNsYXNzKTsKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBwZW9wbGUgdGhhdCBuZWVkIHRvIGdldCB0aGUgcXVhbGlmaWVkIG5hbWUgdXNlZCBmb3IgcmVmbGVjdGlvbi4gVGhpcyB3b3VsZCB1c2UgJyQnIGluc3RlYWQgb2YgJy4nIGZvciBpbm5lciBjbGFzc2VzCi0JICogYW5kIGluY2x1ZGUgdGhlIHBhY2thZ2UgbmFtZS4KLQkgKiBUeXBpY2FsbHkgYmVhbiBpbmZvIHdvdWxkIG5lZWQgdG8gdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMuCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWUsIHVzZSAnJCcgZm9yIGlubmVyIGNsYXNzZXMKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkgOwkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmNzFlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVBhY2thZ2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9JRCA9ICIqcGFja2FnZSI7CS8vIFRoZSBpZCAodGhlIHBhcnQgdGhhdCBnb2VzIGFmdGVyIHRoZSAnIycgZm9yIGEgamF2YSBwYWNrYWdlLikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkvLyBUaGVyZSB3aWxsIG9ubHkgYmUgb25lIHBhY2thZ2UgcGVyIGphdmEgcmVzb3VyY2Ugc28gaXQKLQkJCQkJCQkJCQkJCQkJLy8gY2FuIGJlIHVuaXF1ZS4gTm8gamF2YSB0eXBlcywgbWV0aG9kcywgZmllbGRzIGlkcyBjYW4KLQkJCQkJCQkJCQkJCQkJLy8gc3RhcnQgd2l0aCBhbiBhc3RlcmljayBzbyB3aWxsIGJlIHVuaXF1ZS4KLQkJCQkJCQkJCQkJCQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRSA9ICJfLWphdmFwcmltIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSmF2YUNsYXNzZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEphdmFDbGFzc2VzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgOwotCi19IC8vSmF2YVBhY2thZ2UKLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYXJhbWV0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWU3YTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLSAqICAkUkNTZmlsZTogSmF2YVBhcmFtZXRlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUGFyYW1ldGVyIGV4dGVuZHMgRVBhcmFtZXRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNGaW5hbCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzRmluYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5hbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBQYXJhbWV0ZXJLaW5kIGF0dHJpYnV0ZQotCSAqLwotCUphdmFQYXJhbWV0ZXJLaW5kIGdldFBhcmFtZXRlcktpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIjZ2V0UGFyYW1ldGVyS2luZCA8ZW0+UGFyYW1ldGVyIEtpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXJLaW5kCi0JICogQHNlZSAjZ2V0UGFyYW1ldGVyS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyYW1ldGVyS2luZChKYXZhUGFyYW1ldGVyS2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuCi0JICovCi0JYm9vbGVhbiBpc0FycmF5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIGEgcmV0dXJuIHBhcmFtZXRlci4KLQkgKi8KLQlib29sZWFuIGlzUmV0dXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlKYXZhSGVscGVycyBnZXRKYXZhVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlcktpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlcktpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzNDczNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYXJhbWV0ZXJLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLSAqICAkUkNTZmlsZTogSmF2YVBhcmFtZXRlcktpbmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIElOPTAKLSAqIE9VVD0xCi0gKiBJTk9VVD0yCi0gKiBSRVRVUk49MwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhUGFyYW1ldGVyS2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmFQYXJhbWV0ZXJLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNJTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU4gPSAwOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI09VVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUID0gMTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI0lOT1VUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk9VVCA9IDI7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVUVVJOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjUkVUVVJOX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRVUk4gPSAzOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI0lOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgSU5fTElURVJBTCA9IG5ldyBKYXZhUGFyYW1ldGVyS2luZChJTiwgIklOIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI09VVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kIE9VVF9MSVRFUkFMID0gbmV3IEphdmFQYXJhbWV0ZXJLaW5kKE9VVCwgIk9VVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjSU5PVVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZCBJTk9VVF9MSVRFUkFMID0gbmV3IEphdmFQYXJhbWV0ZXJLaW5kKElOT1VULCAiSU5PVVQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFVFVSTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJFVFVSTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjUkVUVVJOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgUkVUVVJOX0xJVEVSQUwgPSBuZXcgSmF2YVBhcmFtZXRlcktpbmQoUkVUVVJOLCAiUkVUVVJOIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SmF2YSBQYXJhbWV0ZXIgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFQYXJhbWV0ZXJLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEphdmFQYXJhbWV0ZXJLaW5kW10gewotCQkJSU5fTElURVJBTCwKLQkJCU9VVF9MSVRFUkFMLAotCQkJSU5PVVRfTElURVJBTCwKLQkJCVJFVFVSTl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEphdmFQYXJhbWV0ZXJLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSmF2YVBhcmFtZXRlcktpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBKYXZhUGFyYW1ldGVyS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSU46IHJldHVybiBJTl9MSVRFUkFMOwotCQkJY2FzZSBPVVQ6IHJldHVybiBPVVRfTElURVJBTDsKLQkJCWNhc2UgSU5PVVQ6IHJldHVybiBJTk9VVF9MSVRFUkFMOwotCQkJY2FzZSBSRVRVUk46IHJldHVybiBSRVRVUk5fTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEphdmFQYXJhbWV0ZXJLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0phdmFQYXJhbWV0ZXJLaW5kCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Q4YzA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotICogICRSQ1NmaWxlOiBKYXZhUmVmRmFjdG9yeS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjM1ICQgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVmRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhUmVmRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmRmFjdG9yeUltcGwoKTsKLQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJveHkgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBuYW1lLgotCSAqIEBwYXJhbSB0YXJnZXROYW1lIENsYXNzbmFtZSB0byBjcmVhdGUgYSBwcm94eSByZWZlcmVuY2UgdG9vLgotCSAqIEByZXR1cm4gQSBwcm94eSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKTsKLQkKLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIGphdmEgdHlwZSAoY2xhc3Mgb3IgcHJpbWl0aXZlKSBmb3IgYSBnaXZlbiBxdWFsaWZpZWQgbmFtZS4KLQkgKiA8cD5JZiB0aGUgcGFja2FnZSBvciB0eXBlIGRvZXMgbm90IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHRocm91Z2gKLQkgKiB0aGUgcmVmbGVjdGlvbiBtZWNoYW5pc20uCi0JICogPHA+TG9va3VwIHRoZSBKYXZhQ2xhc3MgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBvYmplY3QsIGhhbmRsaW5nIHNvbWUgZXJyb3IgY2FzZXMuCi0JICogQHBhcmFtIGFRdWFsaWZpZWROYW1lIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGNsYXNzIG9yIHByaW1pdGl2ZSAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiBvciA8Y29kZT5pbnQ8L2NvZGU+Ci0JICogQHBhcmFtIHJlbGF0ZWRPYmplY3QgRU9iamVjdCB0aGF0IGl0IHdpbGwgYmUgcmVsYXRlZCB0b28gKGl0IHdpbGwgbG9vayB0aHJvdWdoIHRoZSByZXNvdXJjZSBzZXQncyBwcm9qZWN0IG9mIHRoZSBFT2JqZWN0KQotCSAqIEByZXR1cm4gVGhlIHR5cGUuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5hbWUgaXMgbm90IG9mIGNvcnJlY3QgZm9ybWF0LCByZWxhdGVkT2JqZWN0IGlzIG5vdCBjb250YWluZWQgYnkgYSByZXNvdXJjZSBzZXQsIG9yIHJlc291cmNlIHNldCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFRdWFsaWZpZWROYW1lLCBFT2JqZWN0IHJlbGF0ZWRPYmplY3QpOwotCQotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgamF2YSB0eXBlIChjbGFzcyBvciBwcmltaXRpdmUpIGZvciBhIGdpdmVuIHF1YWxpZmllZCBuYW1lLgotCSAqIDxwPklmIHRoZSBwYWNrYWdlIG9yIGNsYXNzIGRvZXMgbm90IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHRocm91Z2gKLQkgKiB0aGUgcmVmbGVjdGlvbiBtZWNoYW5pc20uCi0JICogQHBhcmFtIGFRdWFsaWZpZWROYW1lIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGNsYXNzIG9yIHByaW1pdGl2ZSAoZS5nLiA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiBvciA8Y29kZT5pbnQ8L2NvZGU+Ci0JICogQHBhcmFtIHNldCBSZXNvdXJjZSBzZXQgdG8gdXNlLiBJdHMgcHJvamVjdCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgdHlwZS4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIG5vdCBvZiBjb3JyZWN0IGZvcm1hdCwgb3IgcmVzb3VyY2Ugc2V0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCk7CQotCQotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgdHlwZSBmb3IgYSBnaXZlbiBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIG5hbWUuCi0JICogPHA+SWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaAotCSAqIHRoZSByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiBAcGFyYW0gYVBhY2thZ2VOYW1lIFBhY2thZ2UgbmFtZQotCSAqIEBwYXJhbSBhVHlwZU5hbWUgVHlwZSBuYW1lIAotCSAqIEBwYXJhbSBzZXQgUmVzb3VyY2Ugc2V0IHRvIHVzZS4gSXRzIHByb2plY3Qgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIHR5cGUuCi0JICogQHJldHVybiBUaGUgdHlwZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbmFtZSBpcyBub3Qgb2YgY29ycmVjdCBmb3JtYXQsIG9yIHJlc291cmNlIHNldCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFQYWNrYWdlTmFtZSwgU3RyaW5nIGFUeXBlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KTsKLQkKLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIEphdmEgcGFja2FnZSBmb3IgYSBnaXZlbiBwYWNrYWdlIG5hbWUuCi0JICogPHA+SWYgdGhlIHBhY2thZ2UgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaAotCSAqIHRoZSByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiBAcGFyYW0gcGFja2FnZU5hbWUgTmFtZSBvZiBwYWNrYWdlCi0JICogQHBhcmFtIHNldCBSZXNvdXJjZSBzZXQgdG8gdXNlLiBJdHMgcHJvamVjdCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgcGFja2FnZS4KLQkgKiBAcmV0dXJuIFRoZSBwYWNrYWdlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBuYW1lIGlzIG5vdCBvZiBjb3JyZWN0IGZvcm1hdCwgb3IgcmVzb3VyY2Ugc2V0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSByZWZsZWN0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBBcnJheVR5cGUgdmFsdWUgd2l0aCBhbiBhcnJheSBvZiB0aGUgY29tcG9uZW50IHR5cGUKLQkgKi8KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZShKYXZhSGVscGVycyBjb21wb25lbnRUeXBlKTsKLQkvKioKLQkgKiBAcmV0dXJuIEFycmF5VHlwZSB2YWx1ZSB3aXRoIGFuIGFycmF5IG9mIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9ucyBhbmQgZmluYWwgY29tcG9uZW50IHR5cGUuCi0JICovCi0JcHVibGljIEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoSmF2YUhlbHBlcnMgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucyk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2QgdmFsdWUKLQkgKi8KLQlNZXRob2QgY3JlYXRlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFDbGFzcyB2YWx1ZQotCSAqLwotCUphdmFDbGFzcyBjcmVhdGVKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRmllbGQgdmFsdWUKLQkgKi8KLQlGaWVsZCBjcmVhdGVGaWVsZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBCbG9jayB2YWx1ZQotCSAqLwotCUJsb2NrIGNyZWF0ZUJsb2NrKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENvbW1lbnQgdmFsdWUKLQkgKi8KLQlDb21tZW50IGNyZWF0ZUNvbW1lbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU3RhdGVtZW50IHZhbHVlCi0JICovCi0JU3RhdGVtZW50IGNyZWF0ZVN0YXRlbWVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBJbml0aWFsaXplciB2YWx1ZQotCSAqLwotCUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFQYXJhbWV0ZXIgdmFsdWUKLQkgKi8KLQlKYXZhUGFyYW1ldGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXJyYXlUeXBlIHZhbHVlCi0JICovCi0JQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhRGF0YVR5cGUgdmFsdWUKLQkgKi8KLQlKYXZhRGF0YVR5cGUgY3JlYXRlSmF2YURhdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFQYWNrYWdlIHZhbHVlCi0JICovCi0JSmF2YVBhY2thZ2UgY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUphdmFSZWZQYWNrYWdlIGdldEphdmFSZWZQYWNrYWdlKCk7Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZlBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2YmE5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUmVmUGFja2FnZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjM1ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEphdmFSZWZQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Uge30KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVmUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImphdmEiOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1MgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+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+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fS0lORCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX1BVQkxJQyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19GSU5BTCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU1QTEVNRU5UU19JTlRFUkZBQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRklFTERTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fTUVUSE9EUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSkFWQV9QQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VWRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19BTExfRVZFTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJRUxEID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVIgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRSA9IDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRSA9IDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfRVZFTlQgPSAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFID0gODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQkxPQ0sgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT01NRU5UID0gNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1RBVEVNRU5UID0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVElBTElaRVIgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUSUFMSVpFUl9fSVNfU1RBVElDID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBJTklUSUFMSVpFUl9fU09VUkNFID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fTkFNRSA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX09SREVSRUQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX01BTlkgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19FT1BFUkFUSU9OID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0VPUEVSQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fRklOQUwgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkphdmEgUGFyYW1ldGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX05BTUUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fT1JERVJFRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX01BTlkgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRUNPTlRBSU5JTkdfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRVBBUkFNRVRFUlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRVBBUkFNRVRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4Y2VwdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRUVYQ0VQVElPTlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUVYQ0VQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0FCU1RSQUNUID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmF0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19OQVRJVkUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5jaHJvbml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX1NZTkNIUk9OSVpFRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19GSU5BTCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cnVjdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19DT05TVFJVQ1RPUiA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXRpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fU1RBVElDID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFkgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19QQVJBTUVURVJTID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fSkFWQV9FWENFUFRJT05TID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fSkFWQV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX1NPVVJDRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRF9fTkFNRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19PUkRFUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fTUFOWSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX0ZJTkFMID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXRpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19TVEFUSUMgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklFTERfX0pBVkFfVklTSUJJTElUWSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1RSQU5TSUVOVCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19WT0xBVElMRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRF9fSkFWQV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklFTERfX0lOSVRJQUxJWkVSID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RmllbGQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBCTE9DS19fU09VUkNFID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQkxPQ0tfX05BTUUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBCTE9DS19fQ09OVEVOVFMgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CbG9jazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCTE9DS19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT01NRU5UX19TT1VSQ0UgPSBCTE9DS19fU09VUkNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT01NRU5UX19OQU1FID0gQkxPQ0tfX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTU1FTlRfX0NPTlRFTlRTID0gQkxPQ0tfX0NPTlRFTlRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJMT0NLX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNUQVRFTUVOVF9fU09VUkNFID0gQkxPQ0tfX1NPVVJDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1RBVEVNRU5UX19OQU1FID0gQkxPQ0tfX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNUQVRFTUVOVF9fQ09OVEVOVFMgPSBCTE9DS19fQ09OVEVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlN0YXRlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEFURU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJMT0NLX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX05BTUUgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fTlNfVVJJID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19OU19VUkk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5zIFByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fTlNfUFJFRklYID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19OU19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUZhY3RvcnkgSW5zdGFuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0VGQUNUT1JZX0lOU1RBTkNFID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FRkFDVE9SWV9JTlNUQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ2xhc3NpZmllcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRUNMQVNTSUZJRVJTID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1YnBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0VTVUJQQUNLQUdFUyA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRVNVQlBBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VTVVBFUl9QQUNLQUdFOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SmF2YSBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fSU5URVJGQUNFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VTVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VPUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9BVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VSRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX09QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VJRF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SmF2YSBEYXRhIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQU5OT1RBVElPTlMgPSBKQVZBX0NMQVNTX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fTkFNRSA9IEpBVkFfQ0xBU1NfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FID0gSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTUyA9IEpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fREVGQVVMVF9WQUxVRSA9IEpBVkFfQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRVBBQ0tBR0UgPSBKQVZBX0NMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0FCU1RSQUNUID0gSkFWQV9DTEFTU19fQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU5URVJGQUNFID0gSkFWQV9DTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRVNVUEVSX1RZUEVTID0gSkFWQV9DTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FT1BFUkFUSU9OUyA9IEpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9BVFRSSUJVVEVTID0gSkFWQV9DTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTID0gSkFWQV9DTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FUkVGRVJFTkNFUyA9IEpBVkFfQ0xBU1NfX0VSRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQVRUUklCVVRFUyA9IEpBVkFfQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA9IEpBVkFfQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9PUEVSQVRJT05TID0gSkFWQV9DTEFTU19fRUFMTF9PUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gSkFWQV9DTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgPSBKQVZBX0NMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEFSUkFZX1RZUEVfX0VJRF9BVFRSSUJVVEUgPSBKQVZBX0NMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEpBVkFfQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0tJTkQgPSBKQVZBX0NMQVNTX19LSU5EOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19QVUJMSUMgPSBKQVZBX0NMQVNTX19QVUJMSUM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19GSU5BTCA9IEpBVkFfQ0xBU1NfX0ZJTkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lNUExFTUVOVFNfSU5URVJGQUNFUyA9IEpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQ0xBU1NfSU1QT1JUID0gSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19QQUNLQUdFX0lNUE9SVFMgPSBKQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0ZJRUxEUyA9IEpBVkFfQ0xBU1NfX0ZJRUxEUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fTUVUSE9EUyA9IEpBVkFfQ0xBU1NfX01FVEhPRFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lOSVRJQUxJWkVSUyA9IEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fREVDTEFSRURfQ0xBU1NFUyA9IEpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0RFQ0xBUklOR19DTEFTUyA9IEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSkFWQV9QQUNLQUdFID0gSkFWQV9DTEFTU19fSkFWQV9QQUNLQUdFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19FVkVOVFMgPSBKQVZBX0NMQVNTX19FVkVOVFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0FMTF9FVkVOVFMgPSBKQVZBX0NMQVNTX19BTExfRVZFTlRTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TID0gSkFWQV9DTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEUgPSBKQVZBX0NMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXJyYXkgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBKQVZBX0NMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0VWRU5UX19OQU1FID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX01BTlkgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0NIQU5HRUFCTEUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fQ0hBTkdFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1ZPTEFUSUxFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1ZPTEFUSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX1RSQU5TSUVOVCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19UUkFOU0lFTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuc2V0dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19VTlNFVFRBQkxFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX1VOU0VUVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVyaXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0RFUklWRUQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fREVSSVZFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SmF2YSBFdmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1ZJU0lCSUxJVFlfS0lORCA9IDEzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9LSU5EID0gMTQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5KVHlwZSBKYXZhIEhlbHBlcnM8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SlR5cGVKYXZhSGVscGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKVFlQRV9KQVZBX0hFTFBFUlMgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SlR5cGUgTGlzdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKVHlwZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlRZUEVfTElTVCA9IDE2OwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVFlQRV9LSU5EID0gMTI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiamF2YS54bWkiOwotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmplbS5qYXZhIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YVJlZlBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhQ2xhc3Mgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhQ2xhc3NfS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMgPGVtPlB1YmxpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1YmxpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc1B1YmxpYygpCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhQ2xhc3NfUHVibGljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzRmluYWwoKQotCSAqIEBzZWUgI2dldEphdmFDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfQ2xhc3NJbXBvcnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX1BhY2thZ2VJbXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19GaWVsZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX01ldGhvZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0V2ZW50cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfQWxsRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEZpZWxkIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRGaWVsZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNGaW5hbCgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzU3RhdGljIDxlbT5TdGF0aWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGF0aWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1N0YXRpYygpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX1N0YXRpYygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWVsZF9KYXZhVmlzaWJpbGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1RyYW5zaWVudCA8ZW0+VHJhbnNpZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNpZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNUcmFuc2llbnQoKQotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWVsZF9UcmFuc2llbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNWb2xhdGlsZSA8ZW0+Vm9sYXRpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Wb2xhdGlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVm9sYXRpbGUoKQotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWVsZF9Wb2xhdGlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWVsZF9KYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmllbGRfSW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQWJzdHJhY3QgPGVtPkFic3RyYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWJzdHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNBYnN0cmFjdCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzTmF0aXZlIDxlbT5OYXRpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYXRpdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNOYXRpdmUoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX05hdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTeW5jaHJvbml6ZWQgPGVtPlN5bmNocm9uaXplZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5bmNocm9uaXplZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N5bmNocm9uaXplZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfU3luY2hyb25pemVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzRmluYWwoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0NvbnN0cnVjdG9yIDxlbT5Db25zdHJ1Y3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnN0cnVjdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQ29uc3RydWN0b3IoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0NvbnN0cnVjdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N0YXRpYyA8ZW0+U3RhdGljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhdGljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3RhdGljKCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9TdGF0aWMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0phdmFWaXNpYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZF9QYXJhbWV0ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhRXhjZXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RfSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZF9Tb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhcmFtZXRlciBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YVBhcmFtZXRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyI2lzRmluYWwoKQotCSAqIEBzZWUgI2dldEphdmFQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEphdmFQYXJhbWV0ZXJfRmluYWwoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SmF2YVBhcmFtZXRlcl9QYXJhbWV0ZXJLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFycmF5VHlwZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJyYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEFycmF5VHlwZV9BcnJheURpbWVuc2lvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXJyYXlUeXBlX0NvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YURhdGFUeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKYXZhRGF0YVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YUV2ZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKYXZhRXZlbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhY2thZ2Ugb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEJsb2NrIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRCbG9jaygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCbG9ja19Tb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmxvY2tfTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCbG9ja19Db250ZW50cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb21tZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFN0YXRlbWVudCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U3RhdGVtZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEluaXRpYWxpemVyIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbml0aWFsaXplcl9Jc1N0YXRpYygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbml0aWFsaXplcl9KYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW5pdGlhbGl6ZXJfU291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFWaXNpYmlsaXR5S2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRKYXZhVmlzaWJpbGl0eUtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhcmFtZXRlcktpbmQgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0SmF2YVBhcmFtZXRlcktpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVHlwZUtpbmQgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0VHlwZUtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSlR5cGVMaXN0IG9iamVjdAotCSAqLwotCUVEYXRhVHlwZSBnZXRKVHlwZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSlR5cGVKYXZhSGVscGVycyBvYmplY3QKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SlR5cGVKYXZhSGVscGVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JSmF2YVJlZkZhY3RvcnkgZ2V0SmF2YVJlZkZhY3RvcnkoKTsKLQotfSAvL0phdmFSZWZQYWNrYWdlCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFVUkwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVVSTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk0ZDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVVSTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFVUkwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozNSAkIAotICovCi0KLQotcHVibGljIGNsYXNzIEphdmFVUkwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLlVSTCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QUk9UT0NPTF9VUklfUFJFRklYID0gImphdmE6LyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKYXZhVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHVybFN0cmluZyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEphdmFVUkwoU3RyaW5nIHVybFN0cmluZykgewotCQlzdXBlcih1cmxTdHJpbmcpOwotCX0KLQkvKioKLQkgKiBKYXZhVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5hbWVTcGFjZU5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpRCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEphdmFVUkwoU3RyaW5nIG5hbWVTcGFjZU5hbWUsIFN0cmluZyBpRCkgewotCQlzdXBlcihudWxsLCBudWxsKTsKLQkJaW5pdGlhbGl6ZU5hbWVzcGFjZVN0cmluZyhuYW1lU3BhY2VOYW1lKTsKLQkJdGhpcy5JRCA9IGlEOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgY3JlYXRlZCBpbiBWaXN1YWxBZ2UuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobmFtZXNwYWNlTmFtZSAhPSBudWxsKSB7Ci0JCQlidWYuYXBwZW5kKG5hbWVzcGFjZU5hbWUpOwotCQkJaWYgKElEICE9IG51bGwpCi0JCQkJYnVmLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKElEICE9IG51bGwpCi0JCQlidWYuYXBwZW5kKElEKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlTdHJpbmcgaW50ZXJuYWxOYW1lID0gbmFtZXNwYWNlTmFtZS5zdWJzdHJpbmcoSkFWQV9QUk9UT0NPTF9VUklfUFJFRklYLmxlbmd0aCgpLCBuYW1lc3BhY2VOYW1lLmxlbmd0aCgpKTsKLQkJcmV0dXJuIEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUuZXF1YWxzKGludGVybmFsTmFtZSkgPyAiIiA6IGludGVybmFsTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgIyBzaWduIHRvIGRlbGltaXQgdGhlIHN0YXJ0IG9mIHRoZSBqYXZhIHBhY2thZ2UgdXMgdGhlIGluaGVyaXRlZCBiZWhhdmlvcgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tU3RyaW5nKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybC5pbmRleE9mKCIjIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLmluaXRpYWxpemVGcm9tU3RyaW5nKHVybCk7Ci0JCWVsc2UgewotCQkJaW50IGVuZE9mUGFja2FnZU5hbWUgPSB1cmwubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChlbmRPZlBhY2thZ2VOYW1lID09IC0xKQotCQkJCWluaXRpYWxpemVOYW1lc3BhY2VTdHJpbmcobnVsbCk7Ci0JCQllbHNlCi0JCQkJaW5pdGlhbGl6ZU5hbWVzcGFjZVN0cmluZyh1cmwuc3Vic3RyaW5nKDAsIGVuZE9mUGFja2FnZU5hbWUpKTsKLQkJCUlEID0gdXJsLnN1YnN0cmluZyhlbmRPZlBhY2thZ2VOYW1lICsgMSk7Ci0JCX0KLQotCX0KLQkvKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmFtZXNwYWNlU3RyaW5nKFN0cmluZyBhTmFtZXNwYWNlTmFtZSkgewotCQlpZiAoYU5hbWVzcGFjZU5hbWUgPT0gbnVsbCkKLQkJCW5hbWVzcGFjZU5hbWUgPSBKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVg7Ci0JCWVsc2UKLQkJCW5hbWVzcGFjZU5hbWUgPSBKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVggKyBhTmFtZXNwYWNlTmFtZTsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVVSTChTdHJpbmcgYVVybFN0cmluZykgewotCQlpZiAoYVVybFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYVVybFN0cmluZy5zdGFydHNXaXRoKEpBVkFfUFJPVE9DT0xfVVJJX1BSRUZJWCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJVUkwoIiArIGdldEZ1bGxTdHJpbmcoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVmlzaWJpbGl0eUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVZpc2liaWxpdHlLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTgxM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVmlzaWJpbGl0eUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVZpc2liaWxpdHlLaW5kLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6MjA6MjQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUEFDS0FHRT0xCi0gKiBQVUJMSUM9MgotICogUFJJVkFURT0zCi0gKiBQUk9URUNURUQ9NAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhVmlzaWJpbGl0eUtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhVmlzaWJpbGl0eUtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QVUJMSUM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFVCTElDX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBSSVZBVEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJJVkFURV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJPVEVDVEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BST1RFQ1RFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RFRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QQUNLQUdFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BBQ0tBR0VfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBVQkxJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UFVCTElDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BVQkxJQwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBQVUJMSUNfTElURVJBTCA9IG5ldyBKYXZhVmlzaWJpbGl0eUtpbmQoUFVCTElDLCAiUFVCTElDIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QUklWQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QUklWQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BSSVZBVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgUFJJVkFURV9MSVRFUkFMID0gbmV3IEphdmFWaXNpYmlsaXR5S2luZChQUklWQVRFLCAiUFJJVkFURSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJPVEVDVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QUk9URUNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPVEVDVEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIFBST1RFQ1RFRF9MSVRFUkFMID0gbmV3IEphdmFWaXNpYmlsaXR5S2luZChQUk9URUNURUQsICJQUk9URUNURUQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBBQ0tBR0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBBQ0tBR0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUEFDS0FHRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBQQUNLQUdFX0xJVEVSQUwgPSBuZXcgSmF2YVZpc2liaWxpdHlLaW5kKFBBQ0tBR0UsICJQQUNLQUdFIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEphdmFWaXNpYmlsaXR5S2luZFtdIHsKLQkJCVBVQkxJQ19MSVRFUkFMLAotCQkJUFJJVkFURV9MSVRFUkFMLAotCQkJUFJPVEVDVEVEX0xJVEVSQUwsCi0JCQlQQUNLQUdFX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUphdmFWaXNpYmlsaXR5S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBQVUJMSUM6IHJldHVybiBQVUJMSUNfTElURVJBTDsKLQkJCWNhc2UgUFJJVkFURTogcmV0dXJuIFBSSVZBVEVfTElURVJBTDsKLQkJCWNhc2UgUFJPVEVDVEVEOiByZXR1cm4gUFJPVEVDVEVEX0xJVEVSQUw7Ci0JCQljYXNlIFBBQ0tBR0U6IHJldHVybiBQQUNLQUdFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgSmF2YVZpc2liaWxpdHlLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0phdmFWaXNpYmlsaXR5S2luZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9NZXRob2QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvTWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTM2OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9NZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotICogICRSQ1NmaWxlOiBNZXRob2QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOS8xNSAxMzo0MjowNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2QgZXh0ZW5kcyBFT3BlcmF0aW9uewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX0NPTU1FTlRfVEFHID0gIkBnZW5lcmF0ZWQiOwotCS8qKgotCSAqIExpc3RzIGFsbCB0aGUgcGFyYW1ldGVycywgZXhjbHVkaW5nIHRoZSByZXR1cm4gdHlwZQotCSAqLyAKLQlwdWJsaWMgSmF2YVBhcmFtZXRlcltdIGxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzQWJzdHJhY3QgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNBYnN0cmFjdCA8ZW0+QWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBYnN0cmFjdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc05hdGl2ZSBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzTmF0aXZlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNOYXRpdmUgPGVtPk5hdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmF0aXZlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05hdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmF0aXZlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzU3luY2hyb25pemVkIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N5bmNocm9uaXplZCA8ZW0+U3luY2hyb25pemVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeW5jaHJvbml6ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU3luY2hyb25pemVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeW5jaHJvbml6ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNGaW5hbCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzRmluYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzQ29uc3RydWN0b3IgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNDb25zdHJ1Y3RvciA8ZW0+Q29uc3RydWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cnVjdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0NvbnN0cnVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25zdHJ1Y3Rvcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc1N0YXRpYyBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTdGF0aWMgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdGljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEphdmFWaXNpYmlsaXR5IGF0dHJpYnV0ZQotCSAqLwotCUphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2dldEphdmFWaXNpYmlsaXR5IDxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQKLQkgKiBAc2VlICNnZXRKYXZhVmlzaWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgUGFyYW1ldGVycyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0UGFyYW1ldGVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBKYXZhRXhjZXB0aW9ucyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEphdmFDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEphdmFDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YUNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTb3VyY2UgcmVmZXJlbmNlCi0JICovCi0JQmxvY2sgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoQmxvY2sgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIHRoZSBqYXZhIGNsYXNzIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbi4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHRoZSBtZXRob2QgbmFtZSBhbmQgaXRzIHBhcmFtZXRlcnMuIGUuZy4gPGNvZGU+Ci0JICogc2V0Rmlyc3ROYW1lKGphdmEubGFuZy5TdHJpbmcpIDwvL2NvZGU+IC4KLQkgKiAgCi0JICovCi0JU3RyaW5nIGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIFBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlKYXZhUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW1ldGVyTmFtZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIHJldHVybiB0eXBlLgotCSAqLwotCUphdmFIZWxwZXJzIGdldFJldHVyblR5cGUoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2V0IHRoZSByZXR1cm4gdHlwZQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAbW9kZWwgdHlwZURhdGFUeXBlPSJvcmcuZWNsaXBzZS5qZW0uamF2YS5KVHlwZUphdmFIZWxwZXJzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJldHVyblR5cGUoSmF2YUhlbHBlcnMgdHlwZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLnRvU3RyaW5nKCkuCi0JICogCi0JICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgTWV0aG9kLiAgVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgdGhlIG1ldGhvZCAKLQkgKiBhY2Nlc3MgbW9kaWZpZXJzLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUsIGZvbGxvd2VkIGJ5IGEKLQkgKiBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWV0aG9kLCBmb2xsb3dlZCBieSBhIHBlcmlvZCwKLQkgKiBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIG5hbWUsIGZvbGxvd2VkIGJ5IGEgcGFyZW50aGVzaXplZCwgY29tbWEtc2VwYXJhdGVkIGxpc3QKLQkgKiBvZiB0aGUgbWV0aG9kJ3MgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG1ldGhvZCB0aHJvd3MgY2hlY2tlZAotCSAqIGV4Y2VwdGlvbnMsIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgd29yZAotCSAqIHRocm93cyBmb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGVzLgotCSAqIAotCSAqIEZvciBleGFtcGxlOgotCSAqIAotCSAqICAgICBwdWJsaWMgYm9vbGVhbiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqIAotCSAqIFRoZSBhY2Nlc3MgbW9kaWZpZXJzIGFyZSBwbGFjZWQgaW4gY2Fub25pY2FsIG9yZGVyIGFzIHNwZWNpZmllZCBieSAiVGhlIEphdmEKLQkgKiBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIi4gIFRoaXMgaXMgcHVibGljLCA8dHQ+cHJvdGVjdGVkPC8vdHQ+IG9yCi0JICogPHR0PnByaXZhdGU8Ly90dD4gZmlyc3QsIGFuZCB0aGVuIG90aGVyIG1vZGlmaWVycyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotCSAqIDx0dD5hYnN0cmFjdDwvL3R0PiwgPHR0PnN0YXRpYzwvL3R0PiwgPHR0PmZpbmFsPC8vdHQ+LCA8dHQ+c3luY2hyb25pemVkPC8vdHQ+Ci0JICogPHR0Pm5hdGl2ZTwvL3R0Pi4KLQotCSAqLwotCVN0cmluZyBnZXRTaWduYXR1cmUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHN5c3RlbSBnZW5lcmF0ZWQuCi0JICogVGhpcyBpcyB1c3VhbGx5IGRldGVybWluZWQgYnkgdGhlIEBnZW5lcmF0ZWQgdGFnIGluIHRoZSBjb21tZW50LgotCSAqLwotCWJvb2xlYW4gaXNHZW5lcmF0ZWQoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU2V0IHRoZSBpc0dlbmVyYXRlZCBmbGFnLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0dlbmVyYXRlZChib29sZWFuIGdlbmVyYXRlZCk7Ci0KLSAgICAvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIGEgdm9pZCByZXR1cm4gdHlwZSBtZXRob2QuCi0JICovCi0JYm9vbGVhbiBpc1ZvaWQoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvU3RhdGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1N0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWE1NTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBTdGF0ZW1lbnQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdGF0ZW1lbnQgZXh0ZW5kcyBCbG9jayB7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1R5cGVLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1R5cGVLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTU3NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9UeXBlS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotICogICRSQ1NmaWxlOiBUeXBlS2luZC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI0ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTkRFRklORUQ9MSBDTEFTUz0yIElOVEVSRkFDRT0zIEVYQ0VQVElPTj00Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldFR5cGVLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZUtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VTkRFRklORUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVU5ERUZJTkVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNMQVNTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NMQVNTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1MgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URVJGQUNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVSRkFDRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSRkFDRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhDRVBUSU9OX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDRVBUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVOREVGSU5FRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VU5ERUZJTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOREVGSU5FRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVLaW5kIFVOREVGSU5FRF9MSVRFUkFMID0gbmV3IFR5cGVLaW5kKFVOREVGSU5FRCwgIlVOREVGSU5FRCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0xBU1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNMQVNTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NMQVNTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUtpbmQgQ0xBU1NfTElURVJBTCA9IG5ldyBUeXBlS2luZChDTEFTUywgIkNMQVNTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFUkZBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVEVSRkFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlRFUkZBQ0UKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlS2luZCBJTlRFUkZBQ0VfTElURVJBTCA9IG5ldyBUeXBlS2luZChJTlRFUkZBQ0UsICJJTlRFUkZBQ0UiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RVhDRVBUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYQ0VQVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVLaW5kIEVYQ0VQVElPTl9MSVRFUkFMID0gbmV3IFR5cGVLaW5kKEVYQ0VQVElPTiwgIkVYQ0VQVElPTiIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlS2luZFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBUeXBlS2luZFtdIHsKLQkJCVVOREVGSU5FRF9MSVRFUkFMLAotCQkJQ0xBU1NfTElURVJBTCwKLQkJCUlOVEVSRkFDRV9MSVRFUkFMLAotCQkJRVhDRVBUSU9OX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHlwZSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgVHlwZUtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUeXBlS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIFR5cGVLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBVTkRFRklORUQ6IHJldHVybiBVTkRFRklORURfTElURVJBTDsKLQkJCWNhc2UgQ0xBU1M6IHJldHVybiBDTEFTU19MSVRFUkFMOwotCQkJY2FzZSBJTlRFUkZBQ0U6IHJldHVybiBJTlRFUkZBQ0VfTElURVJBTDsKLQkJCWNhc2UgRVhDRVBUSU9OOiByZXR1cm4gRVhDRVBUSU9OX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgVHlwZUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vVHlwZUtpbmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0lKYXZhUmVmbGVjdGlvbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA1ZDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSUphdmFSZWZsZWN0aW9uS2V5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFSZWZsZWN0aW9uS2V5IHsKLQotCS8qIENvbnN0YW50cyBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlIG5hbWVzCi0JICogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHVzZWQgdG8gcmVmZXIgdG8gYSBwcmltaXRpdmUgdHlwZSwKLQkgKiBpLmUuIG5ldyBKYXZhVVJMKCJpbnQiKSAgb3IgbmV3IFVSTCgiamF2YTovLyNpbnQiKQotCSAqIFRoZXNlIHR5cGVzIGFyZSBjYWNoZWQgYnkgcHJlLWxvYWRpbmcgZG9jdW1lbnRzIGZvciB0aGUgcHJpbWl0aXZlcywKLQkgKiBpbiAiamF2YTovLyIsIGFuZCBmb3IgdGhlIGphdmEubGFuZyAoT2JqZWN0IGFuZCBTdHJpbmcpIGNsYXNzZXMKLQkgKi8KLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX1ZPSUQgPSAidm9pZCI7CSAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9JTlQgPSAiaW50IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9CT09MRUFOID0gImJvb2xlYW4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0NIQVIgPSAiY2hhciI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fQllURSA9ICJieXRlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9MT05HID0gImxvbmciOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0ZMT0FUID0gImZsb2F0IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9ET1VCTEUgPSAiZG91YmxlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9TSE9SVCA9ICJzaG9ydCI7Ly8kTk9OLU5MUy0xJAotCi0JLyogCi0JICogQ3JlYXRlIGFuIEFycmF5VHlwZSBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZSgpOwotCi0JLyogCi0JICogQ3JlYXRlIGEgSmF2YUNsYXNzIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzKCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBGaWVsZCBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRmllbGQgY3JlYXRlSmF2YUZpZWxkKCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBNZXRob2QgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBKYXZhUGFyYW1ldGVyIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IEphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotCi0JLy9GQi8qKgotCS8vRkIgKiBPdmVycmlkZSB0byB0cnkgdG8gaW50cm9zcGVjdCBvYmplY3RzCi0JLy9GQiAqIHRoYXQgYXJlbid0IGZvdW5kIHVzaW5nIHRoZSBkZWZhdWx0IG1lY2hhbmlzbS4KLQkvL0ZCICovCi0JLy9GQnB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLQkvL0ZCIAlPYmplY3QgamF2YU9iamVjdCA9IHN1cGVyLmdldChrZXkpOwotCS8vRkIgCWlmIChqYXZhT2JqZWN0ID09IG51bGwpIHsKLQkvL0ZCIAkJamF2YU9iamVjdCA9IGdldE9iamVjdEZyb21FeHRlbnNpb25zKChTdHJpbmcpIGtleSk7Ci0JLy9GQiAJCWlmIChqYXZhT2JqZWN0ID09IG51bGwpCi0JLy9GQiAJCQlqYXZhT2JqZWN0ID0gZ2V0SmF2YU9iamVjdCgoU3RyaW5nKSBrZXkpOwotCS8vRkIgCX0KLQkvL0ZCCXJldHVybiBqYXZhT2JqZWN0OwotCS8vRkJ9Ci0KLQkvL0ZCIEFEREVECi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXQoU3RyaW5nIGtleSk7Ci0KLQkvL0ZCIEVORAotCi0JLyoKLQkgKiBJbnN0YW50aWF0ZSB0aGUgbmFtZWQgY2xhc3MuCi0JICogSWYgd2UgbWFrZSBpdCB0byB0aGlzIHBvaW50LCB0aGUgY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQgb3IgcmVmbGVjdGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFQ2xhc3NpZmllciBnZXRBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKTsKLQotCS8qCi0JICogSW5zdGFudGlhdGUgdGhlIG5hbWVkIGNsYXNzLgotCSAqIElmIHdlIG1ha2UgaXQgdG8gdGhpcyBwb2ludCwgdGVoIGNsYXNzIGhhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkIG9yIHJlZmxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRUNsYXNzaWZpZXIgZ2V0SmF2YUNsYXNzKFN0cmluZyB0eXBlTmFtZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGFsbG93cyBmb3IgdGhlIHJldHJpZXZhbCBvZiBhdHRyaWJ1dGVzL21ldGhvZHMgd2l0aCB0aGUgZm9sbG93aW5nIG5vdGF0aW9uOgotCSAqIGZpZWxkOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvbwotCSAqIG1ldGhvZDogamF2YTovY29tLmlibS5mb28jVGVzdC5mb29mb28oCi0JICogcGFyYW1ldGVyOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvb2ZvbygtYXJnMAotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFT2JqZWN0IGdldEphdmFPYmplY3QoU3RyaW5nIGtleVZhbHVlKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTAvNC8yMDAwIDk6NTI6MjggQU0pCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXIKLQkgKiBAcGFyYW0gdHlwZU5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFQ2xhc3NpZmllciBnZXRKYXZhVHlwZShTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgZnJvbSB0aGUga2V5IGJ1dCBkb24ndCBkbyBhbnkgCi0JICogdHJpZXMgYXQgY3JlYXRpb24gb2YgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICogVGhlIEtleSBtdXN0IGJlIGFuIElEIGZvciBpdCB0byBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHByaW1HZXQoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGFzc2VkIHR5cGUgcmVwcmVzZW50cyBhIEphdmEgQXJyYXkgdHlwZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXJyYXkoU3RyaW5nIHR5cGVOYW1lKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0lKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTZkMzViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzOwotCi0vKioKLSAqIEV4dGVuc2lvbiBpbnRlcmZhY2UgdG8gYWRkIGFuIGFkZGl0aW9uYWwgcmVmbGVjdGlvbiBrZXkgaW4gdG8gaGFuZGxlCi0gKiBvdGhlciB0eXBlcyBvZiBrZXkncyBub3Qgc3BlY2lmaWNhbGx5IGhhbmRsZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiB7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBpZC4KLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gcmVmbGVjdGlvbktleQotCSAqIEByZXR1cm4gdGhlIG9iamVjdCAoaXQgc2hvdWxkIGFkZCB0aGUgaWQgd2l0aCBvYmplY3QgdG8gdGhlIHJlc291cmNlJ3MgaWQgdGFibGUgYmVmb3JlIHJldHVybmluZyBpdCkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IG9uZSBpdCBoYW5kbGVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBpZCwgSUphdmFSZWZsZWN0aW9uS2V5IHJlZmxlY3Rpb25LZXkpOwotCQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRmNmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFYTUlGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFYTUlGYWN0b3J5SW1wbDsKLSAKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBKYXZhIFhNSSBSZXNvdXJjZXMuCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhWE1JRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBTY2hlbWUgdXNlZCBpbiBVUkkncyBmb3IgamVtIGVsZW1lbnRzLgotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVhNSUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgSmF2YVhNSUZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZWdpc3RlciB0aGUgcmVmbGVjdGlvbiBrZXkgZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclJlZmxlY3Rpb25LZXlFeHRlbnNpb24oSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGV4dGVuc2lvbik7Ci0JCi0JLyoqCi0JICogRGVyZWdpc3RlciB0aGUgcmVmbGVjdGlvbiBrZXkgZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVmbGVjdGlvbktleUV4dGVuc2lvbihJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9BcnJheVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQXJyYXlUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGUxNGY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9BcnJheVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogQXJyYXlUeXBlSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA5LzE1IDIwOjI4OjA0ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlR5cGVLaW5kOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIEphdmEgQXJyYXkgdHlwZQotICogICAgRm9yIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cywgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZQotICogICAgc3BlY2lmaWVkIGRpcmVjdGx5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGluc3RhbnRpYXRpbmcgYSBjaGFpbiBvZiBjb21wb25lbnQgdHlwZXMKLSAqICAgIHN1Y2ggYXMgU3RyaW5nW11bXVtdW10tPlN0cmluZ1tdW11bXS0+U3RyaW5nW11bXS0+U3RyaW5nW10tPlN0cmluZy4KLSAqIAotICogICBUaGUgY29tcG9uZW50IHR5cGUgcmVsYXRpb25zaGlwIHdpbGwgYmUgY29tcHV0ZWQgaWYgdGhlIGZpbmFsQ29tcG9uZW50VHlwZQotICogICBhbmQgYXJyYXkgZGltZW5zaW9ucyBpcyBzcGVjaWZpZWQuCi0gKiAgCi0gKiAgIEZvciB0aGlzIHJlYXNvbiwgdGhlIHByZWZlcnJlZCB3YXkgdG8gY3JlYXRlIGlzIHRocm91Z2ggdGhlIEphdmFSZWZGYWN0b3J5IGZhY3RvcnkgbWV0aG9kOgotICogICAgICAgIGNyZWF0ZUFycmF5VHlwZShKYXZhQ2xhc3MgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucykKLSAqLwotcHVibGljIGNsYXNzIEFycmF5VHlwZUltcGwgZXh0ZW5kcyBKYXZhQ2xhc3NJbXBsIGltcGxlbWVudHMgQXJyYXlUeXBlLCBKYXZhQ2xhc3N7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJyYXlEaW1lbnNpb25zKCkgPGVtPkFycmF5IERpbWVuc2lvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFycmF5RGltZW5zaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlfRElNRU5TSU9OU19FREVGQVVMVCA9IDA7Ci0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGFycmF5RGltZW5zaW9ucyA9IEFSUkFZX0RJTUVOU0lPTlNfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50VHlwZSgpIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGNvbXBvbmVudFR5cGUgPSBudWxsOwotCQotCXByb3RlY3RlZCBKYXZhSGVscGVycyBmaW5hbENvbXBvbmVudFR5cGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFycmF5VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEFycmF5VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGUgdGhlIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIGFycmF5IHR5cGUgZnJvbSBvdXIgdHlwZSBuYW1lLgotCSAqIFRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5IHR5cGUgaXMgZXNzZW50aWFsbHk6IG5ldyBBcnJheVR5cGVJbXBsKGZpbmFsQ29tcG9uZW50VHlwZSwgYXJyYXlEaW1lbnNpb25zLTEpCi0JICogdW5sZXNzIG91ciBhcnJheSBkaW1lbnNpb24gaXMgMSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBvbmx5IG91ciBmaW5hbCBjb21wb25lbnQgdHlwZS4KLQkgKgotCSAqIEluIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZyByZWZsZWN0aW9uLgotCSAqICJqYXZhLmxhbmcuU3RyaW5nW11bXSIgY29tcG9uZW50IHR5cGUgaXMgImphdmEubGFuZy5TdHJpbmdbXSIKLQkgKgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBjb21wdXRlQ29tcG9uZW50VHlwZSgpIHsKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkvLyBTdHJpcCB0aGUgbGFzdCBbXSBmb3JtIG15IG5hbWUgdG8gZ2V0IG15IGNvbXBvbmVudCB0eXBlJ3MgbmFtZQotCQljb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZS5zdWJzdHJpbmcoMCwgY29tcG9uZW50TmFtZS5sZW5ndGgoKSAtIDIpOwotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGNvbXBvbmVudE5hbWUsIHRoaXMpOwotCX0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwZXJmb3JtIHNvbWUgbGF6eSBpbml0aWFsaXphdGlvbgotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRDb21wb25lbnRUeXBlKCkgewotCQkvLyBJZiB3ZSBkbyBub3QgaGF2ZSBhIGNvbXBvbmVudCB0eXBlIHNldCwgYnV0IHdlIGhhdmUgYSBuYW1lICh3aGljaCBjb250YWlucyBvdXIgY29tcG9uZW50IHR5cGUgbmFtZSkKLQkJLy8gd2UgY2FuIGNvbXB1dGUgdGhlIGNvbXBvbmVudCB0eXBlLgotCQlpZiAoKHRoaXMuZ2V0Q29tcG9uZW50VHlwZUdlbigpID09IG51bGwpICYmICh0aGlzLmdldE5hbWUoKSAhPSBudWxsKSkgewotCQkJY29tcG9uZW50VHlwZSA9IGNvbXB1dGVDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGdldENvbXBvbmVudFR5cGVHZW4oKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LiAKLQkgKiAKLQkgKiBJZiB0aGlzIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXksIHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlIHRoZSBuZXN0ZWQgYXJyYXkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBnZXRDb21wb25lbnRUeXBlKCk7Ci0JfQotCS8qKgotCSAqIEdldCB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgQXJyYXkgVHlwZS4KLQkgKiAKLQkgKiBJbiBvcmRlciB0byBlbnN1cmUgYSB1bmlxdWUgaW5zdGFuY2UsIHdlIHdpbGwgcmVzb2x2ZSB0aGlzIHR5cGUgdXNpbmcgcmVmbGVjdGlvbi4gSXQgdHVybnMgb3V0IHRvIGJlIG1vc3QgZWZmaWNpZW50IHRvIGp1c3QgZG8gdGhpcyBieSB0cmltbWluZyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0RmluYWxDb21wb25lbnRUeXBlKCkgewotCQlpZiAoZmluYWxDb21wb25lbnRUeXBlID09IG51bGwpIHsKLQkJCVN0cmluZyBjb21wb25lbnROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCS8vIFN0cmlwIGFsbCB0aGUgW10gZnJvbSBteSBuYW1lIHRvIGdldCBteSBGSU5BTCBjb21wb25lbnQgdHlwZSdzIG5hbWUKLQkJCWNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lLnN1YnN0cmluZygwLCBjb21wb25lbnROYW1lLmluZGV4T2YoIlsiKSk7Ci0JCQlmaW5hbENvbXBvbmVudFR5cGUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoY29tcG9uZW50TmFtZSwgdGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZpbmFsQ29tcG9uZW50VHlwZTsKLQl9Ci0JLyoqCi0JICogKEphdmFIZWxwZXJzKWlzQXJyYXkgLSBBcnJheVR5cGVzIGFyZSBhcnJheXMKLQkgKiBPdmVycmlkZSBmcm9tIEphdmFDbGFzcy4KLQkgKi8gICAgCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIElzIHRoaXMgYW4gYXJyYXkgb2YgamF2YSBwcmltaXRpdmVzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmVBcnJheSgpIHsKLQkJcmV0dXJuIGdldEZpbmFsQ29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCk7Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgY29tcG9uZW50IHR5cGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZShKYXZhSGVscGVycyBoZWxwZXJDb21wb25lbnRUeXBlKSB7Ci0JCXNldENvbXBvbmVudFR5cGUoKEVDbGFzc2lmaWVyKSBoZWxwZXJDb21wb25lbnRUeXBlKTsJCQotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFycmF5RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIGFycmF5RGltZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcnJheURpbWVuc2lvbnMoaW50IG5ld0FycmF5RGltZW5zaW9ucykgewotCQlpbnQgb2xkQXJyYXlEaW1lbnNpb25zID0gYXJyYXlEaW1lbnNpb25zOwotCQlhcnJheURpbWVuc2lvbnMgPSBuZXdBcnJheURpbWVuc2lvbnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlMsIG9sZEFycmF5RGltZW5zaW9ucywgYXJyYXlEaW1lbnNpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzTmFtZSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3NOYW1lKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU5TVEFOQ0VfQ0xBU1M6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBnZXRJbnN0YW5jZUNsYXNzKCkgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19FREVGQVVMVC5lcXVhbHMoZ2V0SW5zdGFuY2VDbGFzcygpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhnZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VQQUNLQUdFOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FCU1RSQUNUOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKSAhPSBBQlNUUkFDVF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU5URVJGQUNFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElOVEVSRkFDRV9FRkxBRykgIT0gMCkgIT0gSU5URVJGQUNFX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FU1VQRVJfVFlQRVM6Ci0JCQkJcmV0dXJuIGVTdXBlclR5cGVzICE9IG51bGwgJiYgIWVTdXBlclR5cGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRU9QRVJBVElPTlM6Ci0JCQkJcmV0dXJuIGVPcGVyYXRpb25zICE9IG51bGwgJiYgIWVPcGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFMTF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiAhZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gIWdldEVSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gIWdldEVBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQUxMX0NPTlRBSU5NRU5UUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxDb250YWlubWVudHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfT1BFUkFUSU9OUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQUxMX1NVUEVSX1RZUEVTOgotCQkJCXJldHVybiAhZ2V0RUFsbFN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VJRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCXJldHVybiBlU3RydWN0dXJhbEZlYXR1cmVzICE9IG51bGwgJiYgIWVTdHJ1Y3R1cmFsRmVhdHVyZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19LSU5EOgotCQkJCXJldHVybiBraW5kICE9IEtJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX1BVQkxJQzoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBQVUJMSUNfRUZMQUcpICE9IDApICE9IFBVQkxJQ19FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRklOQUw6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApICE9IEZJTkFMX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJcmV0dXJuIGltcGxlbWVudHNJbnRlcmZhY2VzICE9IG51bGwgJiYgIWltcGxlbWVudHNJbnRlcmZhY2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ0xBU1NfSU1QT1JUOgotCQkJCXJldHVybiBjbGFzc0ltcG9ydCAhPSBudWxsICYmICFjbGFzc0ltcG9ydC5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX1BBQ0tBR0VfSU1QT1JUUzoKLQkJCQlyZXR1cm4gcGFja2FnZUltcG9ydHMgIT0gbnVsbCAmJiAhcGFja2FnZUltcG9ydHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19GSUVMRFM6Ci0JCQkJcmV0dXJuIGZpZWxkcyAhPSBudWxsICYmICFmaWVsZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19NRVRIT0RTOgotCQkJCXJldHVybiBtZXRob2RzICE9IG51bGwgJiYgIW1ldGhvZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTklUSUFMSVpFUlM6Ci0JCQkJcmV0dXJuIGluaXRpYWxpemVycyAhPSBudWxsICYmICFpbml0aWFsaXplcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCXJldHVybiBkZWNsYXJlZENsYXNzZXMgIT0gbnVsbCAmJiAhZGVjbGFyZWRDbGFzc2VzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSSU5HX0NMQVNTOgotCQkJCXJldHVybiBkZWNsYXJpbmdDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19KQVZBX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIGJhc2ljR2V0SmF2YVBhY2thZ2UoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FVkVOVFM6Ci0JCQkJcmV0dXJuIGV2ZW50cyAhPSBudWxsICYmICFldmVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BTExfRVZFTlRTOgotCQkJCXJldHVybiAhZ2V0QWxsRXZlbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TOgotCQkJCXJldHVybiBhcnJheURpbWVuc2lvbnMgIT0gQVJSQVlfRElNRU5TSU9OU19FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbXBvbmVudFR5cGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUU6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BQlNUUkFDVDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FU1VQRVJfVFlQRVM6Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCWdldEVTdXBlclR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0tJTkQ6Ci0JCQkJc2V0S2luZCgoVHlwZUtpbmQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fUFVCTElDOgotCQkJCXNldFB1YmxpYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0ZJTkFMOgotCQkJCXNldEZpbmFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOgotCQkJCWdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DTEFTU19JTVBPUlQ6Ci0JCQkJZ2V0Q2xhc3NJbXBvcnQoKS5jbGVhcigpOwotCQkJCWdldENsYXNzSW1wb3J0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX1BBQ0tBR0VfSU1QT1JUUzoKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFja2FnZUltcG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRklFTERTOgotCQkJCWdldEZpZWxkcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmllbGRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTklUSUFMSVpFUlM6Ci0JCQkJZ2V0SW5pdGlhbGl6ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0aWFsaXplcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlnZXREZWNsYXJlZENsYXNzZXMoKS5jbGVhcigpOwotCQkJCWdldERlY2xhcmVkQ2xhc3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJc2V0RGVjbGFyaW5nQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FVkVOVFM6Ci0JCQkJZ2V0RXZlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRFdmVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQUxMX0VWRU5UUzoKLQkJCQlnZXRBbGxFdmVudHMoKS5jbGVhcigpOwotCQkJCWdldEFsbEV2ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TOgotCQkJCXNldEFycmF5RGltZW5zaW9ucygoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJc2V0Q29tcG9uZW50VHlwZSgoRUNsYXNzaWZpZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRToKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FCU1RSQUNUOgotCQkJCXNldEFic3RyYWN0KEFCU1RSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VTVVBFUl9UWVBFUzoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FT1BFUkFUSU9OUzoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0tJTkQ6Ci0JCQkJc2V0S2luZChLSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX1BVQkxJQzoKLQkJCQlzZXRQdWJsaWMoUFVCTElDX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0ZJTkFMOgotCQkJCXNldEZpbmFsKEZJTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DTEFTU19JTVBPUlQ6Ci0JCQkJZ2V0Q2xhc3NJbXBvcnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fUEFDS0FHRV9JTVBPUlRTOgotCQkJCWdldFBhY2thZ2VJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0ZJRUxEUzoKLQkJCQlnZXRGaWVsZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOSVRJQUxJWkVSUzoKLQkJCQlnZXRJbml0aWFsaXplcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlnZXREZWNsYXJlZENsYXNzZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSSU5HX0NMQVNTOgotCQkJCXNldERlY2xhcmluZ0NsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FVkVOVFM6Ci0JCQkJZ2V0RXZlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FMTF9FVkVOVFM6Ci0JCQkJZ2V0QWxsRXZlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlM6Ci0JCQkJc2V0QXJyYXlEaW1lbnNpb25zKEFSUkFZX0RJTUVOU0lPTlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJc2V0Q29tcG9uZW50VHlwZSgoRUNsYXNzaWZpZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhcnJheURpbWVuc2lvbnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFycmF5RGltZW5zaW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRDb21wb25lbnRUeXBlR2VuKCkgewotCQlpZiAoY29tcG9uZW50VHlwZSAhPSBudWxsICYmIGNvbXBvbmVudFR5cGUuZUlzUHJveHkoKSkgewotCQkJRUNsYXNzaWZpZXIgb2xkQ29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7Ci0JCQljb21wb25lbnRUeXBlID0gKEVDbGFzc2lmaWVyKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCljb21wb25lbnRUeXBlKTsKLQkJCWlmIChjb21wb25lbnRUeXBlICE9IG9sZENvbXBvbmVudFR5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSwgb2xkQ29tcG9uZW50VHlwZSwgY29tcG9uZW50VHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBiYXNpY0dldENvbXBvbmVudFR5cGUoKSB7Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoRUNsYXNzaWZpZXIgbmV3Q29tcG9uZW50VHlwZSkgewotCQlmaW5hbENvbXBvbmVudFR5cGUgPSBudWxsOwotCQlzZXRDb21wb25lbnRUeXBlR2VuKG5ld0NvbXBvbmVudFR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlR2VuKEVDbGFzc2lmaWVyIG5ld0NvbXBvbmVudFR5cGUpIHsKLQkJRUNsYXNzaWZpZXIgb2xkQ29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7Ci0JCWNvbXBvbmVudFR5cGUgPSBuZXdDb21wb25lbnRUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSwgb2xkQ29tcG9uZW50VHlwZSwgY29tcG9uZW50VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FUEFDS0FHRToKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FT1BFUkFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFT3BlcmF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0ZJRUxEUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWVsZHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTUVUSE9EUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0lOSVRJQUxJWkVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0aWFsaXplcnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZWNsYXJlZENsYXNzZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSSU5HX0NMQVNTOgotCQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzcykuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RGVjbGFyaW5nQ2xhc3MoKEphdmFDbGFzcylvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVBBQ0tBR0U6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRU9QRVJBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19GSUVMRFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmllbGRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX01FVEhPRFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTklUSUFMSVpFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RGVjbGFyaW5nQ2xhc3MobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FVkVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXZlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FUEFDS0FHRToKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzTmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTlNUQU5DRV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUZBVUxUX1ZBTFVFOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVBBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FCU1RSQUNUOgotCQkJCXJldHVybiBpc0Fic3RyYWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FU1VQRVJfVFlQRVM6Ci0JCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCXJldHVybiBnZXRFT3BlcmF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQUxMX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfUkVGRVJFTkNFUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVJFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldEVSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQUxMX0NPTlRBSU5NRU5UUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQUxMX09QRVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FQUxMX1NVUEVSX1RZUEVTOgotCQkJCXJldHVybiBnZXRFQWxsU3VwZXJUeXBlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19FSURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fS0lORDoKLQkJCQlyZXR1cm4gZ2V0S2luZCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19QVUJMSUM6Ci0JCQkJcmV0dXJuIGlzUHVibGljKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19GSU5BTDoKLQkJCQlyZXR1cm4gaXNGaW5hbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fSU1QTEVNRU5UU19JTlRFUkZBQ0VTOgotCQkJCXJldHVybiBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DTEFTU19JTVBPUlQ6Ci0JCQkJcmV0dXJuIGdldENsYXNzSW1wb3J0KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX1BBQ0tBR0VfSU1QT1JUUzoKLQkJCQlyZXR1cm4gZ2V0UGFja2FnZUltcG9ydHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fRklFTERTOgotCQkJCXJldHVybiBnZXRGaWVsZHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19JTklUSUFMSVpFUlM6Ci0JCQkJcmV0dXJuIGdldEluaXRpYWxpemVycygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCXJldHVybiBnZXREZWNsYXJlZENsYXNzZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fREVDTEFSSU5HX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZWNsYXJpbmdDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19KQVZBX1BBQ0tBR0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRKYXZhUGFja2FnZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEphdmFQYWNrYWdlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0VWRU5UUzoKLQkJCQlyZXR1cm4gZ2V0RXZlbnRzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FMTF9FVkVOVFM6Ci0JCQkJcmV0dXJuIGdldEFsbEV2ZW50cygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBcnJheURpbWVuc2lvbnMoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgVHlwZUtpbmQgZ2V0S2luZCgpIHsKLQkJLy8gT3ZlcnJpZGUgdG8gYWx3YXlzIHJldHVybiB0aGUgY2xhc3MgaWYgZmluYWwgdHlwZSBpcyB2YWxpZC4KLQkJSmF2YUhlbHBlcnMgZnQgPSBnZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJaWYgKCFmdC5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlUeXBlS2luZCBmdEtpbmQgPSAoKEphdmFDbGFzcykgZnQpLmdldEtpbmQoKTsgCi0JCQlyZXR1cm4gIGZ0S2luZCAhPSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTCA/IFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwgOiBUeXBlS2luZC5VTkRFRklORURfTElURVJBTDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gVHlwZUtpbmQuQ0xBU1NfTElURVJBTDsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzUHVibGljKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJLy8gT3ZlcnJpZGUgdG8gcmV0dXJuIHRoZSBraW5kIG9mIHRoZSBmaW5hbCBjb21wb25lbnQsIGJlY2F1c2UgdGhhdCBkZXRlcm1pbmVzIGl0LgotCQlKYXZhSGVscGVycyBmdCA9IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlpZiAoIWZ0LmlzUHJpbWl0aXZlKCkpIHsKLQkJCXJldHVybiAoKEphdmFDbGFzcykgZnQpLmlzUHVibGljKCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9CbG9ja0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9CbG9ja0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmZjEyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi0vKgotICogICRSQ1NmaWxlOiBCbG9ja0ltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmxvY2t7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzb3VyY2UgPSBTT1VSQ0VfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnRzKCkgPGVtPkNvbnRlbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGVudHMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEJsb2NrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmxvY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIG5ld1NvdXJjZSkgewotCQlTdHJpbmcgb2xkU291cmNlID0gc291cmNlOwotCQlzb3VyY2UgPSBuZXdTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkJMT0NLX19TT1VSQ0UsIG9sZFNvdXJjZSwgc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbnRlbnRzKCkgewotCQlpZiAoY29udGVudHMgPT0gbnVsbCkgewotCQkJY29udGVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmxvY2suY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlICE9IG51bGwgOiAhU09VUkNFX0VERUZBVUxULmVxdWFscyhzb3VyY2UpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc291cmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzb3VyY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQ29tbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Db21tZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDE4ZWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Db21tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotLyoKLSAqICAkUkNTZmlsZTogQ29tbWVudEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50SW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIENvbW1lbnR7Ci0KLQkKLQlwcm90ZWN0ZWQgQ29tbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX0NPTlRFTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fU09VUkNFOgotCQkJCXJldHVybiBnZXRTb3VyY2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UX19DT05URU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoU09VUkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlRfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fU09VUkNFOgotCQkJCXJldHVybiBTT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZSAhPSBudWxsIDogIVNPVVJDRV9FREVGQVVMVC5lcXVhbHMoc291cmNlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UX19DT05URU5UUzoKLQkJCQlyZXR1cm4gY29udGVudHMgIT0gbnVsbCAmJiAhY29udGVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvRmllbGRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvRmllbGRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YTdiNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0ZpZWxkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEZpZWxkSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA5LzE1IDIwOjI4OjAzICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FVHlwZWRFbGVtZW50SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFVUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZpZWxkSW1wbCBleHRlbmRzIEVUeXBlZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRmllbGQgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3RhdGljKCkgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTVEFUSUNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3RhdGljKCkgPGVtPlN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19FRkxBRyA9IDEgPDwgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVZpc2liaWxpdHkoKSA8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhVmlzaWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUID0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFWaXNpYmlsaXR5S2luZCBqYXZhVmlzaWJpbGl0eSA9IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1RyYW5zaWVudCgpIDxlbT5UcmFuc2llbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBTlNJRU5UX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1RyYW5zaWVudCgpIDxlbT5UcmFuc2llbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUUkFOU0lFTlRfRUZMQUcgPSAxIDw8IDEyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVm9sYXRpbGUoKSA8ZW0+Vm9sYXRpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVm9sYXRpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWT0xBVElMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWb2xhdGlsZSgpIDxlbT5Wb2xhdGlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNWb2xhdGlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVk9MQVRJTEVfRUZMQUcgPSAxIDw8IDEzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbGl6ZXIoKSA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmxvY2sgaW5pdGlhbGl6ZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIEZpZWxkSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWVsZCgpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUZpZWxkUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIGZpZWxkIGluIHRoZSBuYW1lZCBKYXZhIGNsYXNzIGluIHRoZSBmb3JtICJwYWNrYWdlLmNsYXNzX2ZpZWxkIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgY3JlYXRlRmllbGRSZWYoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlGaWVsZCByZWYgPSBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci0JCUphdmFVUkwgamF2YXVybCA9IG5ldyBKYXZhVVJMKGNsYXNzTmFtZSArICIvIiArIGZpZWxkTmFtZSk7Ci0JCSgoSW50ZXJuYWxFT2JqZWN0KSByZWYpLmVTZXRQcm94eVVSSShVUkkuY3JlYXRlVVJJKGphdmF1cmwuZ2V0RnVsbFN0cmluZygpKSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjbGFzcyB0aGF0IHRoaXMgZmllbGQgaXMgd2l0aGluLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YUNsYXNzKCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRvIHBlcmZvcm0gbGF6eSBpbml0aWFsaXphdGlvbnMvcmVmbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0RVR5cGUoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVUeXBlKCk7Ci0JfQotCi0JcHVibGljIEJsb2NrIGdldEluaXRpYWxpemVyKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBnZXRJbml0aWFsaXplckdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzRmluYWxHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNTdGF0aWNHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNUcmFuc2llbnRHZW4oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWb2xhdGlsZSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNWb2xhdGlsZUdlbigpOwotCX0JCi0KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0SmF2YVR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIGdldEVUeXBlKCk7Ci0JfQotCi0JcHVibGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gZ2V0SmF2YVZpc2liaWxpdHlHZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlYWRBZGFwdG9yIGdldFJlYWRBZGFwdGVyKCkgewotCQlyZXR1cm4gKFJlYWRBZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc1JlZmxlY3RlZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdFZhbHVlcygpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoIWhhc1JlZmxlY3RlZCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSByZWFkQWRhcHRvci5yZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQloYXNSZWZsZWN0ZWQgPSBzZXRSZWZsZWN0ZWQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFVzZWQgYnkgcmVmbGVjdGlvbiBhZGFwdGVyIHRvIGNsZWFyIHRoZSByZWZsZWN0aW9uLiBUaGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVmbGVjdGVkKGJvb2xlYW4gcmVmbGVjdGVkKSB7Ci0JCWhhc1JlZmxlY3RlZCA9IHJlZmxlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIGZpZWxkIGFuIGFycmF5IHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGdldEphdmFUeXBlKCkuaXNBcnJheSgpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gcHJldmVudCB0aGUgcmVmbGVjdGlvbiBvZiB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIEVMaXN0IGVDb250ZW50cygpIHsKLQkJRUxpc3QgcmVzdWx0cyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCS8vRkIKLQkJLy9GQiBFTGlzdCBjb250YWlubWVudHMgPSBlQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCk7Ci0JCS8vRkIgaWYgKGNvbnRhaW5tZW50cyAhPSBudWxsKSB7Ci0JCS8vRkIgSXRlcmF0b3IgaSA9IGNvbnRhaW5tZW50cy5pdGVyYXRvcigpOwotCQkvL0ZCIHdoaWxlIChpLmhhc05leHQoKSkgewotCQkvL0ZCIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGkubmV4dCgpOwotCQkvL0ZCIC8vQ2hhbmdlIGZyb20gc3VwZXIgdG8gcHJpbVJlZlZhbHVlCi0JCS8vRkIgT2JqZWN0IHZhbHVlID0gcHJpbVJlZlZhbHVlKHNmKTsKLQkJLy9GQiAvL0VuZENoYW5nZQotCQkvL0ZCIGlmICh2YWx1ZSAhPSBudWxsKQotCQkvL0ZCIGlmIChzZi5pc01hbnkoKSkKLQkJLy9GQiByZXN1bHRzLmFkZEFsbCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkvL0ZCIGVsc2UKLQkJLy9GQiByZXN1bHRzLmFkZCh2YWx1ZSk7Ci0JCS8vRkIgfQotCQkvL0ZCIH0KLQkJaWYgKGdldEluaXRpYWxpemVyR2VuKCkgIT0gbnVsbCkKLQkJCXJlc3VsdHMuYWRkKGdldEluaXRpYWxpemVyR2VuKCkpOyAvL0ZCCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgIiArICIoIiArIGdldE5hbWUoKSArICIpIjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldEphdmFWaXNpYmlsaXR5R2VuKCkgewotCQlyZXR1cm4gamF2YVZpc2liaWxpdHk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbEdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTCwgb2xkRmluYWwsIG5ld0ZpbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWNHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXRpYyhib29sZWFuIG5ld1N0YXRpYykgewotCQlib29sZWFuIG9sZFN0YXRpYyA9IChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdTdGF0aWMpIGVGbGFncyB8PSBTVEFUSUNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5TVEFUSUNfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUMsIG9sZFN0YXRpYywgbmV3U3RhdGljKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kIG5ld0phdmFWaXNpYmlsaXR5KSB7Ci0JCUphdmFWaXNpYmlsaXR5S2luZCBvbGRKYXZhVmlzaWJpbGl0eSA9IGphdmFWaXNpYmlsaXR5OwotCQlqYXZhVmlzaWJpbGl0eSA9IG5ld0phdmFWaXNpYmlsaXR5ID09IG51bGwgPyBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQgOiBuZXdKYXZhVmlzaWJpbGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWSwgb2xkSmF2YVZpc2liaWxpdHksIGphdmFWaXNpYmlsaXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnRHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zaWVudChib29sZWFuIG5ld1RyYW5zaWVudCkgewotCQlib29sZWFuIG9sZFRyYW5zaWVudCA9IChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdUcmFuc2llbnQpIGVGbGFncyB8PSBUUkFOU0lFTlRfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5UUkFOU0lFTlRfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQsIG9sZFRyYW5zaWVudCwgbmV3VHJhbnNpZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWb2xhdGlsZUdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWb2xhdGlsZShib29sZWFuIG5ld1ZvbGF0aWxlKSB7Ci0JCWJvb2xlYW4gb2xkVm9sYXRpbGUgPSAoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdWb2xhdGlsZSkgZUZsYWdzIHw9IFZPTEFUSUxFX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Vk9MQVRJTEVfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRSwgb2xkVm9sYXRpbGUsIG5ld1ZvbGF0aWxlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcykgewotCQlpZiAobmV3SmF2YUNsYXNzICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1MgJiYgbmV3SmF2YUNsYXNzICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3SmF2YUNsYXNzKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdKYXZhQ2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzLCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUywgbmV3SmF2YUNsYXNzLCBuZXdKYXZhQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX09SREVSRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgT1JERVJFRF9FRkxBRykgIT0gMCkgIT0gT1JERVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1VOSVFVRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBsb3dlckJvdW5kICE9IExPV0VSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSAhPSBNQU5ZX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0VUWVBFOgotCQkJCXJldHVybiBlVHlwZSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUw6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApICE9IEZJTkFMX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMCkgIT0gU1RBVElDX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBqYXZhVmlzaWJpbGl0eSAhPSBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwKSAhPSBUUkFOU0lFTlRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMCkgIT0gVk9MQVRJTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJcmV0dXJuIGluaXRpYWxpemVyICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVVBQRVJfQk9VTkQ6Ci0JCQkJc2V0VXBwZXJCb3VuZCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDOgotCQkJCXNldFN0YXRpYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoKEphdmFWaXNpYmlsaXR5S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVFJBTlNJRU5UOgotCQkJCXNldFRyYW5zaWVudCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRToKLQkJCQlzZXRWb2xhdGlsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlzZXRJbml0aWFsaXplcigoQmxvY2spbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKE9SREVSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKExPV0VSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUw6Ci0JCQkJc2V0RmluYWwoRklOQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1NUQVRJQzoKLQkJCQlzZXRTdGF0aWMoU1RBVElDX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19UUkFOU0lFTlQ6Ci0JCQkJc2V0VHJhbnNpZW50KFRSQU5TSUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVk9MQVRJTEU6Ci0JCQkJc2V0Vm9sYXRpbGUoVk9MQVRJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJc2V0SW5pdGlhbGl6ZXIoKEJsb2NrKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQmxvY2sgZ2V0SW5pdGlhbGl6ZXJHZW4oKSB7Ci0JCXJldHVybiBpbml0aWFsaXplcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbml0aWFsaXplcihCbG9jayBuZXdJbml0aWFsaXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlCbG9jayBvbGRJbml0aWFsaXplciA9IGluaXRpYWxpemVyOwotCQlpbml0aWFsaXplciA9IG5ld0luaXRpYWxpemVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVIsIG9sZEluaXRpYWxpemVyLCBuZXdJbml0aWFsaXplcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoQmxvY2sgbmV3SW5pdGlhbGl6ZXIpIHsKLQkJaWYgKG5ld0luaXRpYWxpemVyICE9IGluaXRpYWxpemVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbml0aWFsaXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5pdGlhbGl6ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5pdGlhbGl6ZXIobmV3SW5pdGlhbGl6ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSLCBuZXdJbml0aWFsaXplciwgbmV3SW5pdGlhbGl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1MsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRJbml0aWFsaXplcihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX09SREVSRUQ6Ci0JCQkJcmV0dXJuIGlzT3JkZXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1VOSVFVRToKLQkJCQlyZXR1cm4gaXNVbmlxdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1VQUEVSX0JPVU5EOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRVcHBlckJvdW5kKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19FVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVR5cGUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0ZJTkFMOgotCQkJCXJldHVybiBpc0ZpbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDOgotCQkJCXJldHVybiBpc1N0YXRpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWToKLQkJCQlyZXR1cm4gZ2V0SmF2YVZpc2liaWxpdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gaXNUcmFuc2llbnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRToKLQkJCQlyZXR1cm4gaXNWb2xhdGlsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVI6Ci0JCQkJcmV0dXJuIGdldEluaXRpYWxpemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmluYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhVmlzaWJpbGl0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YVZpc2liaWxpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zaWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdm9sYXRpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSW5pdGlhbGl6ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSW5pdGlhbGl6ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MjU1MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0luaXRpYWxpemVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluaXRpYWxpemVySW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzA5LzE0IDIzOjMwOjMyICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsaXplckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluaXRpYWxpemVyewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3RhdGljKCkgPGVtPklzIFN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19TVEFUSUNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNTdGF0aWMgPSBJU19TVEFUSUNfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmxvY2sgc291cmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBJbml0aWFsaXplckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxpemVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNTdGF0aWMoKSB7Ci0JCXJldHVybiBpc1N0YXRpYzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N0YXRpYyhCb29sZWFuIG5ld0lzU3RhdGljKSB7Ci0JCUJvb2xlYW4gb2xkSXNTdGF0aWMgPSBpc1N0YXRpYzsKLQkJaXNTdGF0aWMgPSBuZXdJc1N0YXRpYzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQywgb2xkSXNTdGF0aWMsIGlzU3RhdGljKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcykgewotCQlpZiAobmV3SmF2YUNsYXNzICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MgJiYgbmV3SmF2YUNsYXNzICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3SmF2YUNsYXNzKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdKYXZhQ2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzLCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUywgbmV3SmF2YUNsYXNzLCBuZXdKYXZhQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQmxvY2sgZ2V0U291cmNlKCkgewotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmVJc1Byb3h5KCkpIHsKLQkJCUJsb2NrIG9sZFNvdXJjZSA9IHNvdXJjZTsKLQkJCXNvdXJjZSA9IChCbG9jayllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3Qpc291cmNlKTsKLQkJCWlmIChzb3VyY2UgIT0gb2xkU291cmNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCbG9jayBiYXNpY0dldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoQmxvY2sgbmV3U291cmNlKSB7Ci0JCUJsb2NrIG9sZFNvdXJjZSA9IHNvdXJjZTsKLQkJc291cmNlID0gbmV3U291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQzoKLQkJCQlyZXR1cm4gZ2V0SXNTdGF0aWMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDOgotCQkJCXJldHVybiBJU19TVEFUSUNfRURFRkFVTFQgPT0gbnVsbCA/IGlzU3RhdGljICE9IG51bGwgOiAhSVNfU1RBVElDX0VERUZBVUxULmVxdWFscyhpc1N0YXRpYyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFOgotCQkJCXJldHVybiBzb3VyY2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQzoKLQkJCQlzZXRJc1N0YXRpYygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19JU19TVEFUSUM6Ci0JCQkJc2V0SXNTdGF0aWMoSVNfU1RBVElDX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKEJsb2NrKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNTdGF0aWM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlzU3RhdGljKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFDbGFzc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhQ2xhc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjVmOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFDbGFzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUNsYXNzSW1wbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzA5LzE1IDIwOjI4OjAzICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVDb2xsZWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlR5cGVLaW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5iZWFuaW5mby5JSW50cm9zcGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjaXNQdWJsaWMgPGVtPlB1YmxpYzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMgPGVtPkltcGxlbWVudHMgSW50ZXJmYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldENsYXNzSW1wb3J0IDxlbT5DbGFzcyBJbXBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRQYWNrYWdlSW1wb3J0cyA8ZW0+UGFja2FnZSBJbXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0RmllbGRzIDxlbT5GaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRNZXRob2RzIDxlbT5NZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0SW5pdGlhbGl6ZXJzIDxlbT5Jbml0aWFsaXplcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXREZWNsYXJlZENsYXNzZXMgPGVtPkRlY2xhcmVkIENsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXREZWNsYXJpbmdDbGFzcyA8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0SmF2YVBhY2thZ2UgPGVtPkphdmEgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEV2ZW50cyA8ZW0+RXZlbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0QWxsRXZlbnRzIDxlbT5BbGwgRXZlbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNsYXNzSW1wbCBleHRlbmRzIEVDbGFzc0ltcGwgaW1wbGVtZW50cyBKYXZhQ2xhc3MgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUeXBlS2luZCBLSU5EX0VERUZBVUxUID0gVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVHlwZUtpbmQga2luZCA9IEtJTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQdWJsaWMoKSA8ZW0+UHVibGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1B1YmxpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBVQkxJQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQdWJsaWMoKSA8ZW0+UHVibGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1B1YmxpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDX0VGTEFHID0gMSA8PCAxMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklOQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0VGTEFHID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGxlbWVudHNJbnRlcmZhY2VzKCkgPGVtPkltcGxlbWVudHMgSW50ZXJmYWNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGltcGxlbWVudHNJbnRlcmZhY2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzSW1wb3J0KCkgPGVtPkNsYXNzIEltcG9ydDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc0ltcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNsYXNzSW1wb3J0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2VJbXBvcnRzKCkgPGVtPlBhY2thZ2UgSW1wb3J0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdlSW1wb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBhY2thZ2VJbXBvcnRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkcygpIDxlbT5GaWVsZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZmllbGRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZHMoKSA8ZW0+TWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsaXplcnMoKSA8ZW0+SW5pdGlhbGl6ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxpemVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRpYWxpemVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWNsYXJlZENsYXNzZXMoKSA8ZW0+RGVjbGFyZWQgQ2xhc3NlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWNsYXJlZENsYXNzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZWNsYXJlZENsYXNzZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjbGFyaW5nQ2xhc3MoKSA8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWNsYXJpbmdDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBkZWNsYXJpbmdDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFdmVudHMoKSA8ZW0+RXZlbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV2ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV2ZW50cyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEVMaXN0IGdldEVBbm5vdGF0aW9uc0ludGVybmFsKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RUFubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvdGVjdGVkIGhlbHBlciBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RGaWVsZHNFeHRlbmRlZChMaXN0IGZpZWxkcykgewotCQlmaWVsZHMuYWRkQWxsKGdldEZpZWxkcygpKTsKLQkJSXRlcmF0b3IgaXQ7Ci0JCWl0ID0gZ2V0RXh0ZW5kZWRMb29rdXBJdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKQotCQkJKChKYXZhQ2xhc3NJbXBsKSBpdC5uZXh0KCkpLmNvbGxlY3RGaWVsZHNFeHRlbmRlZChmaWVsZHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RNZXRob2RzRXh0ZW5kZWQoTWFwIG1ldGhvZHMsIGJvb2xlYW4gb25seVB1YmxpYywgTGlzdCBleGNsdWRlZENsYXNzZXMsIExpc3QgZXhjbHVkZWRNZXRob2RzKSB7Ci0JCUl0ZXJhdG9yIGl0MSwgaXQyOwotCQlpdDIgPSBnZXRFeHRlbmRlZExvb2t1cEl0ZXJhdG9yKCk7Ci0JCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzOwotCQl3aGlsZSAoaXQyLmhhc05leHQoKSkgewotCQkJamF2YUNsYXNzID0gKEphdmFDbGFzc0ltcGwpIGl0Mi5uZXh0KCk7Ci0JCQlpZiAoIWV4Y2x1ZGVkQ2xhc3Nlcy5jb250YWlucyhqYXZhQ2xhc3MpKQotCQkJCWphdmFDbGFzcy5jb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIG9ubHlQdWJsaWMsIGV4Y2x1ZGVkQ2xhc3NlcywgZXhjbHVkZWRNZXRob2RzKTsKLQkJfQotCQlpdDEgPSBvbmx5UHVibGljID8gZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCkgOiBnZXRNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJTWV0aG9kIG5leHRNZXRob2Q7Ci0JCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQluZXh0TWV0aG9kID0gKE1ldGhvZCkgaXQxLm5leHQoKTsKLQkJCWlmICghZXhjbHVkZWRNZXRob2RzLmNvbnRhaW5zKG5leHRNZXRob2QpKQotCQkJCW1ldGhvZHMucHV0KG5leHRNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBuZXh0TWV0aG9kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZUNsYXNzUmVmKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQlyZXR1cm4gbWV0aG9kOwotCQllbHNlIHsKLQkJCUphdmFDbGFzc0ltcGwgbXlTdXBlcjsKLQkJCW15U3VwZXIgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0U3VwZXJ0eXBlKCk7Ci0JCQlpZiAobXlTdXBlciAhPSBudWxsKQotCQkJCXJldHVybiBteVN1cGVyLmZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgewotCQlNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJcmV0dXJuIG1ldGhvZDsKLQkJZWxzZSB7Ci0JCQlKYXZhQ2xhc3NJbXBsIHN1cGVySW50ZXJmYWNlOwotCQkJTGlzdCBsaXN0ID0gZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCXN1cGVySW50ZXJmYWNlID0gKEphdmFDbGFzc0ltcGwpIGxpc3QuZ2V0KGkpOwotCQkJCW1ldGhvZCA9IHN1cGVySW50ZXJmYWNlLmZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBJZiBhbnlvbmUgaXMgcmVmZXJlbmNpbmcgdGhpcywgcGxlYXNlIHVzZSBnZXRFQWxsU3VwZXJUeXBlcygpIGluc3RlYWQuIFRoaXMgd2FzIHBsYWNlZCBoZXJlIGFuZCBtaXNzcGVsbGVkIGJ5IG1pc3Rha2UuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFsbFN1cGVydHlwZXMoKSB7Ci0JCWdldEVTdXBlclR5cGVzKCk7IC8vRm9yY2UgcmVmbGVjdGlvbiwgaWYgbmVlZGVkLCBiZWZvcmUgZ2V0dGluZyBhbGwgc3VwZXJ0eXBlcy4KLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxTdXBlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRvIHBlcmZvcm0gcmVmbGVjdGlvbiBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2xhc3NJbXBvcnQoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXRDbGFzc0ltcG9ydEdlbigpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQWxsT3BlcmF0aW9ucygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGlhID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGlhID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RUFsbE9wZXJhdGlvbnMoKTsgLy8gTm8gaW50cm9zcGVjdGlvbiwgZG8gbm9ybWFsLgotCQlpZiAoZUFsbE9wZXJhdGlvbnMgPT0gbnVsbCkKLQkJCWVBbGxPcGVyYXRpb25zID0gaWEuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJcmV0dXJuIGVBbGxPcGVyYXRpb25zOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IEJlYW5JbmZvIGFkYXB0ZXIgY2FuIGFjY2VzcwotCSAqIHVuLWludHJvc3BlY3RlZCBhbGwgb3BlcmF0aW9ucy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEVMaXN0IHByaW1HZXRFQWxsT3BlcmF0aW9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVPcGVyYXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFT3BlcmF0aW9ucygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RU9wZXJhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBvdGhlcnMuIEl0IGlzIGhlcmUgc28gdGhhdCBCZWFuSW5mbyBhZGFwdGVycyBjYW4gZ28gdG8KLQkgKiB0aGUgbm9uLWludHJvc3BlY3RlZCBvcGVyYXRpb25zLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnNJbnRlcm5hbCgpIHsKLQkJLy8gQW4gaW50ZXJuYWwgbWV0aG9kIGZvciByZXR1cm5pbmcgYWN0dWFsIHdvIGZsdWZmaW5nIHVwLgotCQlyZXR1cm4gc3VwZXIuZ2V0RU9wZXJhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RUFubm90YXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLmludHJvc3BlY3RJZk5lY2Vzc2FyeSgpOyAvLyBUbyBjYXVzZSBpbnRyb3NwZWN0aW9uIHNvIHRoZSBhcHByb3ByaWF0ZSBkZWNvcmF0b3IgaXMgYWRkZWQuCi0JCXJldHVybiBzdXBlci5nZXRFQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGFkYXB0ZXIgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzSW50ZXJuYWwoKSB7Ci0JCS8vIEFuIGludGVybmFsIG1ldGhvZCBmb3IgcmV0dXJuaW5nIGFjdHVhbCB3byBmbHVmZmluZyB1cC4KLQkJcmV0dXJuIHN1cGVyLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb24gdGhlIGltcGxlbW50c0luZmVyZmFjZSBMaXN0IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlIGNsYXNzIG9yIG9uIHRoZSBzdXBlciBMaXN0IGlmIGl0IGlzIGEgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldEV4dGVuZGVkTG9va3VwSXRlcmF0b3IoKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuaXRlcmF0b3IoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJamF2YS51dGlsLkxpc3QgZmllbGRzID0gZ2V0RmllbGRzKCk7Ci0JCUZpZWxkIGZpZWxkOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJZmllbGQgPSAoRmllbGQpIGZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhmaWVsZE5hbWUpKQotCQkJCXJldHVybiBmaWVsZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4KLQkgKiAKLQkgKiBSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkRXh0ZW5kZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlGaWVsZCBmaWVsZCA9IGdldEZpZWxkTmFtZWQoZmllbGROYW1lKTsKLQkJaWYgKGZpZWxkICE9IG51bGwpCi0JCQlyZXR1cm4gZmllbGQ7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RXh0ZW5kZWRMb29rdXBJdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlGaWVsZCByZXN1bHQgPSAoKEphdmFDbGFzcykgaXQubmV4dCgpKS5nZXRGaWVsZEV4dGVuZGVkKGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkTmFtZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gZ2V0RmllbGQoZmllbGROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RmllbGRzKCkgewotCQlyZWZsZWN0RmllbGRzKCk7Ci0JCXJldHVybiBnZXRGaWVsZHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIGZpZWxkcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWVsZHNFeHRlbmRlZCgpIHsKLQkJTGlzdCBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbGxlY3RGaWVsZHNFeHRlbmRlZChmaWVsZHMpOwotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIEludHJvc3BlY3Rpb25BZGFwdG9yIHdoaWNoIGNhbiBpbnRyb3NwZWN0IG91ciBKYXZhIHByb3BlcnRpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIElJbnRyb3NwZWN0aW9uQWRhcHRlciBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpIHsKLQkJLy8gTmVlZCB0byBzeW5jIHRoaXMgYmVjYXVzZSB3ZSBhcmUgbm93IGluIG11bHRpLXRocmVhZCBlbnYuCi0JCXJldHVybiAoSUludHJvc3BlY3Rpb25BZGFwdGVyKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCkgewotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFNpbXBsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQkJcmV0dXJuIHByaW1HZXROYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCS8qKgotCSAqIGdldEphdmFQYWNrYWdlLiBUaGlzIGlzIGEgZGVyaXZlZCByZWxhdGlvbnNoaXAsIHNvIHdlIG11c3QgaW1wbGVtZW50IGl0IGhlcmUgdG8gZ2V0IHRoZSBFUGFja2FnZSB0aGF0IHRoaXMgb2JqZWN0IGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSmF2YVBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGdldE1ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMsIExpc3QgbWV0aG9kTGlzdCkgewotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kTGlzdC5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kTGlzdC5nZXQoaSk7Ci0JCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCWlmIChwYXJhbXMubGVuZ3RoID09IHBhcmFtZXRlclR5cGVzLnNpemUoKSkgewotCQkJCQlmb3VuZCA9IHRydWU7IC8vTWF5YmU7IHdlIG5lZWQgbW9yZSBpbmZvCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkvL2lmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgZG9lc24ndCBtYXRjaCB0aGVuIGZsaXAgYmFjayB0byBmYWxzZQotCQkJCQkJSmF2YUhlbHBlcnMgamggPSAoSmF2YUhlbHBlcnMpIHBhcmFtc1tqXS5nZXRFVHlwZSgpOwotCQkJCQkJaWYgKCFqaC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHBhcmFtZXRlclR5cGVzLmdldChqKSkpIHsKLQkJCQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfSAvLyBlbmQgaWYgcGFyYW1zIGVxdWFsCi0JCQkJCX0gLy8gZW5kIGNvbXBhcmUgYWxsIHBhcmFtcwotCQkJCQlpZiAoZm91bmQpIC8vc2hvcnQgY2lyY3VpdCBvdXQgb2YgdGhpcyBsb29wIGFuZCByZXR1cm4gdGhlIHdpbm5lcgotCQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQl9IC8vIGVuZCBjb21wYXJlIGxlbmd0aHMKLQkJCX0gLy8gZW5kIGNvbXBhcmUgbmFtZXMKLQkJfSAvLyBlbmQgbG9vcCB0aHJvdWdoIGFsbCBtZXRob2RMaXN0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0IGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpIHsKLQkJTGlzdCBtZXRob2RzLCBzaWduYXR1cmVzLCBzYW1lTmFtZXM7Ci0JCW1ldGhvZHMgPSBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJc2FtZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzaWduYXR1cmVzID0gbmV3IEFycmF5TGlzdChtZXRob2RzLnNpemUoKSArIDEpOwotCQlzaWduYXR1cmVzLmFkZChERUZBVUxUX01FVEhPRF9OQU1FKTsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZCBhTWV0aG9kOwotCQlTdHJpbmcgbWV0aG9kTmFtZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYU1ldGhvZCA9IChNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW1ldGhvZE5hbWUgPSBhTWV0aG9kLmdldE5hbWUoKTsKLQkJCWlmIChzYW1lTmFtZXMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLQkJCQlpZiAoIXNpZ25hdHVyZXMuY29udGFpbnMobWV0aG9kTmFtZSkpCi0JCQkJCXNpZ25hdHVyZXMuYWRkKG1ldGhvZE5hbWUpOwotCQkJfSBlbHNlCi0JCQkJc2FtZU5hbWVzLmFkZChtZXRob2ROYW1lKTsKLQkJCXNpZ25hdHVyZXMuYWRkKGFNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCQlyZXR1cm4gc2lnbmF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIGZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBmaW5kQ2xhc3NNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZHMoKSB7Ci0JCXJlZmxlY3RNZXRob2RzKCk7Ci0JCXJldHVybiBnZXRNZXRob2RzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZHNFeHRlbmRlZCgpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWV0aG9kcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKExpc3QsIExpc3QpIG9uIEphdmFDbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhMaXN0IGV4Y2x1ZGVkQ2xhc3NlcywgTGlzdCBleGNsdWRlZE1ldGhvZHMpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIGZhbHNlLCBleGNsdWRlZENsYXNzZXMsIGV4Y2x1ZGVkTWV0aG9kcyk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KG1ldGhvZHMudmFsdWVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHRoaXMucHJpbUdldE5hbWUoKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIGVJc1Byb3h5KCkpIHsKLQkJCUphdmFVUkwgdXJsID0gbmV3IEphdmFVUkwoZVByb3h5VVJJKCkudG9TdHJpbmcoKSk7Ci0JCQlyZXN1bHQgPSB1cmwuZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZHMgdGhhdCBiZWdpbnMgd2l0aCBAYU1ldGhvZE5hbWVQcmVmaXggYW5kIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQGV4Y2x1ZGVkTmFtZXMgbGlzdC4gSWYgQGFNZXRob2ROYW1lUHJlZml4IGlzIG51bGwsIGFsbCBtZXRob2RzIHdpbGwgYmUgcmV0dXJuZWQuCi0JIAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE9ubHlTcGVjaWZpY01ldGhvZHMoU3RyaW5nIGFNZXRob2ROYW1lUHJlZml4LCBMaXN0IGV4Y2x1ZGVkTmFtZXMpIHsKLQkJTGlzdCBtZXRob2RzLCBzcGVjaWZpYzsKLQkJbWV0aG9kcyA9IGdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQlzcGVjaWZpYyA9IG5ldyBBcnJheUxpc3QobWV0aG9kcy5zaXplKCkpOwotCQlJdGVyYXRvciBpdCA9IG1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJTWV0aG9kIGFNZXRob2Q7Ci0JCVN0cmluZyBtZXRob2ROYW1lOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhTWV0aG9kID0gKE1ldGhvZCkgaXQubmV4dCgpOwotCQkJbWV0aG9kTmFtZSA9IGFNZXRob2QuZ2V0TmFtZSgpOwotCQkJaWYgKGFNZXRob2ROYW1lUHJlZml4ICE9IG51bGwgJiYgbWV0aG9kTmFtZS5zdGFydHNXaXRoKGFNZXRob2ROYW1lUHJlZml4KSAmJiBleGNsdWRlZE5hbWVzICE9IG51bGwgJiYgIWV4Y2x1ZGVkTmFtZXMuY29udGFpbnMobWV0aG9kTmFtZSkpCi0JCQkJc3BlY2lmaWMuYWRkKGFNZXRob2QpOwotCQl9Ci0JCXJldHVybiBzcGVjaWZpYzsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0UGFja2FnZUltcG9ydHMoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXRQYWNrYWdlSW1wb3J0c0dlbigpOwotCX0KLQotCS8qKgotCSAqIGdldFByaW1pdGl2ZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSmF2YURhdGFUeXBlIGdldFByaW1pdGl2ZSgpIHsKLQkJU3RyaW5nIHByaW1pdGl2ZU5hbWUgPSBnZXRQcmltaXRpdmVOYW1lKCk7Ci0JCWlmIChwcmltaXRpdmVOYW1lICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlcyA9IGVSZXNvdXJjZSgpOwotCQkJcmV0dXJuIChKYXZhRGF0YVR5cGUpIEphdmFDbGFzc0ltcGwucmVmbGVjdChwcmltaXRpdmVOYW1lLCByZXMuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFByaW1pdGl2ZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW1pdGl2ZUlEKCkgewotCQlTdHJpbmcgbXlOYW1lID0gZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAobXlOYW1lLmVxdWFscyhJTlRFR0VSX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fSU5URUdFUl9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoQk9PTEVBTl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0JPT0xFQU5fSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEJZVEVfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9CWVRFX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhTSE9SVF9OQU1FKSkKLQkJCXJldHVybiBQUklNX1NIT1JUX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhMT05HX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fTE9OR19JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoRkxPQVRfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9GTE9BVF9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoRE9VQkxFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRE9VQkxFX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhDSEFSQUNURVJfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9DSEFSQUNURVJfSUQ7Ci0JCXJldHVybiBQUklNX05PVF9JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSBuYW1lIGZvciB0aGlzIHR5cGUgaWYgb25lIGV4aXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByaW1pdGl2ZU5hbWUoKSB7Ci0JCVN0cmluZyBteU5hbWUgPSBnZXRRdWFsaWZpZWROYW1lKCk7Ci0JCWlmIChteU5hbWUuZXF1YWxzKElOVEVHRVJfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9JTlRFR0VSX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEJPT0xFQU5fTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9CT09MRUFOX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEJZVEVfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9CWVRFX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKFNIT1JUX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fU0hPUlRfTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoTE9OR19OQU1FKSkKLQkJCXJldHVybiBQUklNX0xPTkdfTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoRkxPQVRfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9GTE9BVF9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhET1VCTEVfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9ET1VCTEVfTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoQ0hBUkFDVEVSX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQ0hBUkFDVEVSX05BTUU7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuIEl0Ci0JICogd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldFB1YmxpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBnZXRQdWJsaWNNZXRob2RzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuIEl0Ci0JICogd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldFB1YmxpY01ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG1ldGhvZHMsIGl0IHdpbGwgbm90IGdvIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1YmxpY01ldGhvZHMoKSB7Ci0JCUxpc3QgcHVibGljTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0aGVNZXRob2RzID0gZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZU1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZCBtID0gKE1ldGhvZCkgdGhlTWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMID09IG0uZ2V0SmF2YVZpc2liaWxpdHkoKSkKLQkJCQlwdWJsaWNNZXRob2RzLmFkZChtKTsKLQkJfQotCQlyZXR1cm4gcHVibGljTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHB1YmxpYyBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCgpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIHRydWUsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChtZXRob2RzLnZhbHVlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWROYW1lZChTdHJpbmcgbmFtZSkgewotCQlMaXN0IHB1YmxpY01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGhlTWV0aG9kcyA9IGdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZU1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZCBtID0gKE1ldGhvZCkgdGhlTWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXB1YmxpY01ldGhvZHMuYWRkKG0pOwotCQl9Ci0JCXJldHVybiBwdWJsaWNNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MsIGhhdmluZyBhIG5hbWUgZXF1YWwgdG8gdGhhdCBvZiB0aGUgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1YmxpY01ldGhvZHNOYW1lZChTdHJpbmcgbmFtZSkgewotCQlMaXN0IHB1YmxpY01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGhlTWV0aG9kcyA9IGdldFB1YmxpY01ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbSA9IChNZXRob2QpIHRoZU1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlwdWJsaWNNZXRob2RzLmFkZChtKTsKLQkJfQotCQlyZXR1cm4gcHVibGljTWV0aG9kczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoZUlzUHJveHkoKSkgewotCQkJSmF2YVVSTCB1cmwgPSBuZXcgSmF2YVVSTChlUHJveHlVUkkoKS50b1N0cmluZygpKTsKLQkJCVN0cmluZyBpbnRlcm5hbE5hbWUgPSB1cmwuZ2V0UGFja2FnZU5hbWUoKTsKLQkJCWlmIChpbnRlcm5hbE5hbWUgIT0gbnVsbCAmJiBpbnRlcm5hbE5hbWUubGVuZ3RoKCkgPiAwKQotCQkJCXJlc3VsdCA9IGludGVybmFsTmFtZSArICIuIiArIHVybC5nZXRDbGFzc05hbWUoKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSB1cmwuZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBwcmltR2V0UXVhbGlmaWVkTmFtZSgpOwotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKCckJywgJy4nKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUbyBiZSB1c2VkIGJ5IHBlb3BsZSB0aGF0IG5lZWQgdG8gZ2V0IHRoZSBxdWFsaWZpZWQgbmFtZSB1c2VkIGZvciByZWZsZWN0aW9uLiBUeXBpY2FsbHkgYmVhbiBpbmZvIHdvdWxkIG5lZWQgdG8gdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpIHsKLQkJcmV0dXJuIHByaW1HZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUmVhZEFkYXB0b3Igd2hpY2ggY2FuIHJlZmxlY3Qgb3VyIEphdmEgcHJvcGVydGllcwotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUmVhZEFkYXB0b3IgZ2V0UmVhZEFkYXB0ZXIoKSB7Ci0JCS8vIE5lZWQgdG8gc3luYyBiZWNhdXNlIG5vdyBpbiBhIG11bHRpLXRocmVhZCBlbnYuCi0JCXJldHVybiAoUmVhZEFkYXB0b3IpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9SRUZMRUNURUQgPSAweDAsIFJFRkxFQ1RFRF9CQVNFID0gMHgxLCBSRUZMRUNURURfTUVUSE9EUyA9IDB4MiwgUkVGTEVDVEVEX0ZJRUxEUyA9IDB4NDsKLQotCXByb3RlY3RlZCBpbnQgcmVmbGVjdGlvblN0YXR1cyA9IE5PVF9SRUZMRUNURUQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0QmFzZSgpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfQkFTRSkgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSByZWFkQWRhcHRvci5yZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IFJFRkxFQ1RFRF9CQVNFOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEZpZWxkcygpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfRklFTERTKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9ICgoSUphdmFDbGFzc0FkYXB0b3IpIHJlYWRBZGFwdG9yKS5yZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IChSRUZMRUNURURfRklFTERTIHwgUkVGTEVDVEVEX0JBU0UpOyAvLyBXZSBjYW4gYmUgY2VydGFpbiBiYXNlIHdpbGwgYmUgZG9uZSBieSByZWZsZWN0IGZpZWxkcyBpZiBub3QgYWxyZWFkeQotCQkJCQkJCQkJCQkJCQkJCQkJCSAvLyBkb25lLgotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdE1ldGhvZHMoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX01FVEhPRFMpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gKChJSmF2YUNsYXNzQWRhcHRvcikgcmVhZEFkYXB0b3IpLnJlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IChSRUZMRUNURURfTUVUSE9EUyB8IFJFRkxFQ1RFRF9CQVNFKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBmaWVsZHMgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGRvbmUuCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFN1cGVydHlwZSgpIHsKLQkJLy8gSWYgdGhpcyBpcyBhbiBpbnRlcmZhY2UsIHRoZXJlIGlzIG5vIHN1cGVydHlwZS4gSG93ZXZlciwgdGhlIGVTdXBlclR5cGVzIElTIGZpbGxlZCBpbiB3aXRoIGFueSBpbnRlcmZhY2UgdGhhdCB0aGlzIGV4dGVuZHMuIAotCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGxpc3QgPSBnZXRFU3VwZXJUeXBlcygpOwotCQlyZXR1cm4gKCFsaXN0LmlzRW1wdHkoKSkgPyAoSmF2YUNsYXNzKSBsaXN0LmdldCgwKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIEphdmFDbGFzcyBnZXRXcmFwcGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHdoZXRoZXIgdGhlIHJlY2VpdmVyIGltcGxlbWVudHMgdGhlIHBhc3NlZCBpbnRlcmZhY2UgKG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcykuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW1wbGVtZW50c0ludGVyZmFjZShKYXZhQ2xhc3MgaW50ZXJmYWNlVHlwZSkgewotCQlpZiAodGhpcyA9PSBpbnRlcmZhY2VUeXBlKQotCQkJcmV0dXJuIHRydWU7Ci0JCUVMaXN0IGltcGxlbWVudGVkID0gZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJSmF2YUNsYXNzIGFuSW50ZXJmYWNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcGxlbWVudGVkLnNpemUoKTsgaSsrKSB7Ci0JCQlhbkludGVyZmFjZSA9IChKYXZhQ2xhc3MpIGltcGxlbWVudGVkLmdldChpKTsKLQkJCWlmIChhbkludGVyZmFjZS5pbXBsZW1lbnRzSW50ZXJmYWNlKGludGVyZmFjZVR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChnZXRTdXBlcnR5cGUoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFN1cGVydHlwZSgpLmltcGxlbWVudHNJbnRlcmZhY2UoaW50ZXJmYWNlVHlwZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgc2hvd2luZyBvdXIgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGluZm9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIHRyaXAgY2xhc3MgcmVmbGVjdGlvbgotCQkvL0ZCIHRoaXMuZUdldChKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX1B1YmxpYygpKTsKLQkJcmVmbGVjdEJhc2UoKTsgLy9GQgotCQlvdXQuYXBwZW5kKCJKYXZhIGNsYXNzOiAiICsgZ2V0UXVhbGlmaWVkTmFtZSgpICsgIlxuIik7Ci0JCW91dC5hcHBlbmQoIiAgc3VwZXJjbGFzczogIiArIHRoaXMuZ2V0U3VwZXJ0eXBlKCkgKyAiXG4iKTsKLQkJRUxpc3QgZmllbGRzID0gZ2V0RmllbGRzKCk7Ci0JCUZpZWxkIGZpZWxkOwotCQlpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLQkJCW91dC5hcHBlbmQoIiAgRmllbGRzOlxuIik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJCWZpZWxkID0gKEZpZWxkKSBmaWVsZHMuZ2V0KGkpOwotCQkJCW91dC5hcHBlbmQoIiAgICAiICsgKChKYXZhSGVscGVycykgZmllbGQuZ2V0RVR5cGUoKSkuZ2V0SmF2YU5hbWUoKSArICIgIiArIGZpZWxkLmdldE5hbWUoKSArICJcbiIpOwotCQkJfQotCQl9Ci0JCUVMaXN0IG1ldGhvZHMgPSBnZXRNZXRob2RzKCk7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCWlmIChtZXRob2RzLnNpemUoKSA+IDApIHsKLQkJCW91dC5hcHBlbmQoIiAgTWV0aG9kczpcbiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQkJLy8gdHJpcCBtZXRob2QgcmVmbGVjdGlvbgotCQkJCW1ldGhvZC5pc1N0YXRpYygpOwotCQkJCWlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpICE9IG51bGwpCi0JCQkJCW91dC5hcHBlbmQoIiAgICAiICsgbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpICsgIiAiKTsKLQkJCQllbHNlCi0JCQkJCW91dC5hcHBlbmQoIiAgICB2b2lkICIpOwotCQkJCW91dC5hcHBlbmQobWV0aG9kLmdldE5hbWUoKSArICIoIik7Ci0JCQkJRUxpc3QgcGFybXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQkJCUphdmFQYXJhbWV0ZXIgcGFybTsKLQkJCQlpZiAocGFybXMuc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcGFybXMuc2l6ZSgpOyBpaSsrKSB7Ci0JCQkJCQlwYXJtID0gKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldChpaSk7Ci0JCQkJCQkvL0ZCIGlmICghcGFybS5pc1JldHVybigpKSB7Ci0JCQkJCQlvdXQuYXBwZW5kKCgoSmF2YUhlbHBlcnMpIHBhcm0uZ2V0RVR5cGUoKSkuZ2V0SmF2YU5hbWUoKSArICIgIiArIHBhcm0uZ2V0TmFtZSgpKTsKLQkJCQkJCWlmIChpaSA8IHBhcm1zLnNpemUoKSAtIDEpCi0JCQkJCQkJb3V0LmFwcGVuZCgiLCAiKTsKLQkJCQkJCS8vRkIgfQotCQkJCQl9Ci0JCQkJfQotCQkJCW91dC5hcHBlbmQoIilcbiIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvdXQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSB0aGUgcGFzc2VkIGluIGNsYXNzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluaGVyaXRzRnJvbShKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCWlmICh0aGlzID09IGphdmFDbGFzcykKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChnZXRTdXBlcnR5cGUoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFN1cGVydHlwZSgpLmluaGVyaXRzRnJvbShqYXZhQ2xhc3MpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENhbiBhbiBvYmplY3Qgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcyBiZSBhc3NpZ25lZCB0byBhbiBvYmplY3Qgb2YgdGhpcyBjbGFzcy4gSW4gb3RoZXIgd29yZHMgaXMgdGhpcyBjbGFzcyBhIHN1cGVydHlwZSBvZiB0aGUgcGFzc2VkIGluIGNsYXNzLAotCSAqIG9yIGlzIGl0IHN1cGVyaW50ZXJmYWNlIG9mIGl0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oRUNsYXNzaWZpZXIgYUNsYXNzKSB7Ci0JCWlmIChhQ2xhc3MgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpIHsKLQkJCUphdmFDbGFzcyB0aGVDbGFzcyA9IChKYXZhQ2xhc3MpIGFDbGFzczsKLQkJCS8vIElmIGVpdGhlciB0aGlzIGNsYXNzIG9yIGFDbGFzcyBraW5kIGlzIHVua25vd24gdGhlbiBpdCBpc24ndCBhc3NpZ25hYmxlRnJvbS4KLQkJCWlmIChnZXRLaW5kKCkgPT0gVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwgfHwgdGhlQ2xhc3MuZ2V0S2luZCgpID09IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIElmIHRoZSAiYUNsYXNzIiBpcyBub3QgYSBKYXZhQ2xhc3MgKGkuZS4gaXQgaXMgZWl0aGVyIGEgSmF2YURhdGF0eXBlIG9yCi0JCQkvLyBzb21lIG90aGVyIGtpbmQgb2YgTU9GIGNsYXNzaWZpZXIpLCB0aGVuIGl0IGNhbm5vdCBiZQotCQkJLy8gYXNzaWduZWQgdG8gc29tZXRoaW5nIG9mIHRoaXMgY2xhc3MuCi0JCQlpZiAoZ2V0S2luZCgpICE9IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKQotCQkJCWlmICh0aGVDbGFzcy5nZXRLaW5kKCkgIT0gVHlwZUtpbmQuSU5URVJGQUNFX0xJVEVSQUwpCi0JCQkJCXJldHVybiB0aGVDbGFzcy5pbmhlcml0c0Zyb20odGhpcyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFDbGFzcyBpcyBhbiBpbnRlcmZhY2UsIHNvIGl0IGlzIGFzc2lnbmFibGUgb25seSBpZgotCQkJCQkvLyAidGhpcyIgaXMgImphdmEubGFuZy5PYmplY3QiLgotCQkJCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpOwotCQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGhlQ2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZSh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRG9lcyB0aGlzIHR5cGUgZXhpc3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGlzdGluZ1R5cGUoKSB7Ci0JCS8vIFRPRE86IFRlbXBvcmFyeSwgaW5lZmZpY2llbnQgaW1wbGVtZW50YXRpb24KLQkJcmV0dXJuICgoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSBnZXRSZWFkQWRhcHRlcigpKS5oYXNSZWZsZWN0aW9uU291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogU2VlIGlmIHRoaXMgaXMgdmFsaWQgb2JqZWN0IG9mIHRoaXMgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbmNlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgSUluc3RhbnRpYXRpb25JbnN0YW5jZSA/IGlzQXNzaWduYWJsZUZyb20oKChJSW5zdGFudGlhdGlvbkluc3RhbmNlKSBvKS5nZXRKYXZhVHlwZSgpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgYW4gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZ2V0S2luZCgpID09IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgewotCQlyZXR1cm4gZ2V0RGVjbGFyaW5nQ2xhc3MoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGxpc3Rpbmcgb3VyIGZpZWxkcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuIFRoZSBmaWVsZCByZWxhdGlvbnNoaXAgaXMgZGVyaXZlZCBmcm9tIGNvbnRlbnRzLiBUaGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24KLQkgKiB0aGUgYXNzdW1wdGlvbiB0aGF0IHN1cGVydHlwZXMgYWJvdmUgSmF2YUNsYXNzIHdpbGwgaG9sZCBBdHRyaWJ1dGVzIHJhdGhlciB0aGFuIEZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgRmllbGRbXSBsaXN0RmllbGRFeHRlbmRlZCgpIHsKLQkJTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlGaWVsZFtdIHJlc3VsdCA9IG5ldyBGaWVsZFtmaWVsZHMuc2l6ZSgpXTsKLQkJZmllbGRzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgTWV0aG9kcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLiBUaGUgbWV0aG9kIHJlbGF0aW9uc2hpcCBpcyBkZXJpdmVkIGZyb20gY29udGVudHMuIFRoaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kcwotCSAqIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3VwZXJ0eXBlcyBhYm92ZSBKYXZhQ2xhc3Mgd2lsbCBob2xkIE9wZXJhdGlvbnMgcmF0aGVyIHRoYW4gTWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kW10gbGlzdE1ldGhvZEV4dGVuZGVkKCkgewotCQlqYXZhLnV0aWwuTGlzdCBtZXRob2RzID0gZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbbWV0aG9kcy5zaXplKCldOwotCQltZXRob2RzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uIGRvIG5vdCB1c2UuCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0TmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uIGRvIG5vdCB1c2UuCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCQlKYXZhUGFja2FnZSBwYWNrID0gZ2V0SmF2YVBhY2thZ2UoKTsKLQkJaWYgKHBhY2sgIT0gbnVsbCAmJiBwYWNrLmdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgIT0gMCkKLQkJCXJlc3VsdCA9IHBhY2suZ2V0UGFja2FnZU5hbWUoKSArICIuIiArIHRoaXMucHJpbUdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gdGhpcy5nZXROYW1lKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogcmVmbGVjdCAtIHJlZmxlY3QgYSBKYXZhQ2xhc3MgZm9yIGEgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUuIElmIHRoZSBwYWNrYWdlIG9yIGNsYXNzIGRvZXMgbm90IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHRocm91Z2ggdGhlIHJlZmxlY3Rpb24KLQkgKiBtZWNoYW5pc20uIExvb2t1cCB0aGUgSmF2YUNsYXNzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwYXNzZWQgb2JqZWN0LCBoYW5kbGluZyBzb21lIGVycm9yIGNhc2VzLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgcmVmbGVjdChTdHJpbmcgYVF1YWxpZmllZE5hbWUsIEVPYmplY3QgcmVsYXRlZE9iamVjdCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLCByZWxhdGVkT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIEphdmFDbGFzcyBmb3IgYSBnaXZlbiBxdWFsaWZpZWQgbmFtZS4gSWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgcmVmbGVjdGlvbgotCSAqIG1lY2hhbmlzbS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I3JlZmxlY3RUeXBlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFIZWxwZXJzIHJlZmxlY3QoU3RyaW5nIGFRdWFsaWZpZWROYW1lLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShhUXVhbGlmaWVkTmFtZSwgc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIEphdmFDbGFzcyBmb3IgYSBnaXZlbiBwYWNrYWdlIG5hbWUgb3IgY2xhc3MgbmFtZS4gSWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUKLQkgKiByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I3JlZmxlY3RUeXBlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgcmVmbGVjdChTdHJpbmcgYVBhY2thZ2VOYW1lLCBTdHJpbmcgYUNsYXNzTmFtZSwgUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoYVBhY2thZ2VOYW1lLCBhQ2xhc3NOYW1lLCBzZXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1cGVydHlwZShKYXZhQ2xhc3MgYUphdmFDbGFzcykgdGhyb3dzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gewotCQl2YWxpZGF0ZVN1cGVydHlwZShhSmF2YUNsYXNzKTsKLQkJTGlzdCBzID0gc3VwZXIuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJcy5jbGVhcigpOwotCQlpZiAoYUphdmFDbGFzcyAhPSBudWxsKQotCQkJcy5hZGQoYUphdmFDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBhc3NlZCBKYXZhQ2xhc3MgaXMgYSB2YWxpZCBzdXBlciBjbGFzcyAoaS5lLiwgaXQgZG9lcyBub3QgY3JlYXRlIGFueSBjeWNsZXMgaW4gdGhlIGluaGVyaXRhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhSmF2YUNsYXNzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTdXBlcnR5cGUoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHRocm93cyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkU3VwZXJ0eXBlKGFKYXZhQ2xhc3MpKQotCQkJdGhyb3cgbmV3IEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24odGhpcywgYUphdmFDbGFzcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFN1cGVydHlwZShKYXZhQ2xhc3MgYUphdmFDbGFzcykgewotCQlpZiAoYUphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5lcXVhbHMoYUphdmFDbGFzcykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIGV4dGVuZGVkSXNWYWxpZFN1cGVydHlwZShnZXRTdWJ0eXBlcygpLCBhSmF2YUNsYXNzKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3VidHlwZXMKLQkgKiBAcGFyYW0gYUphdmFDbGFzcwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRlZElzVmFsaWRTdXBlcnR5cGUoTGlzdCBzdWJ0eXBlcywgSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQkJaWYgKCFiYXNpY0lzVmFsaWRTdXBlcnR5cGUoc3VidHlwZXMsIGFKYXZhQ2xhc3MpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlKYXZhQ2xhc3Mgc3VidHlwZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJ0eXBlcy5zaXplKCk7IGkrKykgewotCQkJc3VidHlwZSA9IChKYXZhQ2xhc3MpIHN1YnR5cGVzLmdldChpKTsKLQkJCWlmICghc3VidHlwZS5pc1ZhbGlkU3VwZXJ0eXBlKGFKYXZhQ2xhc3MpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFzaWNJc1ZhbGlkU3VwZXJ0eXBlKExpc3Qgc3VidHlwZXMsIEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JCUphdmFDbGFzcyBzdWJ0eXBlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YnR5cGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlzdWJ0eXBlID0gKEphdmFDbGFzcykgc3VidHlwZXMuZ2V0KGkpOwotCQkJaWYgKHN1YnR5cGUuZXF1YWxzKGFKYXZhQ2xhc3MpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTdWJ0eXBlcygpIHsKLQkJcmV0dXJuIGdldEVTdXBlckFkYXB0ZXIoKS5nZXRTdWJjbGFzc2VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0UXVhbGlmaWVkTmFtZSgpICsgIikiOwotCX0KLQotCXB1YmxpYyBUeXBlS2luZCBnZXRLaW5kKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gZ2V0S2luZEdlbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtpbmQoVHlwZUtpbmQgbmV3S2luZCkgewotCQlUeXBlS2luZCBvbGRLaW5kID0ga2luZDsKLQkJa2luZCA9IG5ld0tpbmQgPT0gbnVsbCA/IEtJTkRfRURFRkFVTFQgOiBuZXdLaW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWMoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBpc1B1YmxpY0dlbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpYyhib29sZWFuIG5ld1B1YmxpYykgewotCQlib29sZWFuIG9sZFB1YmxpYyA9IChlRmxhZ3MgJiBQVUJMSUNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdQdWJsaWMpIGVGbGFncyB8PSBQVUJMSUNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5QVUJMSUNfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BVQkxJQywgb2xkUHVibGljLCBuZXdQdWJsaWMpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gaXNGaW5hbEdlbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmFsKGJvb2xlYW4gbmV3RmluYWwpIHsKLQkJYm9vbGVhbiBvbGRGaW5hbCA9IChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ZpbmFsKSBlRmxhZ3MgfD0gRklOQUxfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5GSU5BTF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklOQUwsIG9sZEZpbmFsLCBuZXdGaW5hbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUeXBlS2luZCBnZXRLaW5kR2VuKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpY0dlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBQVUJMSUNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbEdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0SW5pdGlhbGl6ZXJzKCkgewotCQlpZiAoaW5pdGlhbGl6ZXJzID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KEluaXRpYWxpemVyLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlMsCi0JCQkJCUphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTKTsKLQkJfQotCQlyZXR1cm4gaW5pdGlhbGl6ZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmluZ0NsYXNzKEphdmFDbGFzcyBuZXdEZWNsYXJpbmdDbGFzcykgewotCQlpZiAobmV3RGVjbGFyaW5nQ2xhc3MgIT0gZGVjbGFyaW5nQ2xhc3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlY2xhcmluZ0NsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0RlY2xhcmluZ0NsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0RlY2xhcmluZ0NsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGVjbGFyaW5nQ2xhc3MobmV3RGVjbGFyaW5nQ2xhc3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTLCBuZXdEZWNsYXJpbmdDbGFzcywgbmV3RGVjbGFyaW5nQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCkgewotCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAmJiBkZWNsYXJpbmdDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkRGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKLQkJCWRlY2xhcmluZ0NsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZGVjbGFyaW5nQ2xhc3MpOwotCQkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IG9sZERlY2xhcmluZ0NsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTLCBvbGREZWNsYXJpbmdDbGFzcywgZGVjbGFyaW5nQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVjbGFyaW5nQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldERlY2xhcmluZ0NsYXNzKCkgewotCQlyZXR1cm4gZGVjbGFyaW5nQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGVjbGFyaW5nQ2xhc3MoSmF2YUNsYXNzIG5ld0RlY2xhcmluZ0NsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUphdmFDbGFzcyBvbGREZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOwotCQlkZWNsYXJpbmdDbGFzcyA9IG5ld0RlY2xhcmluZ0NsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1MsIG9sZERlY2xhcmluZ0NsYXNzLCBuZXdEZWNsYXJpbmdDbGFzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldERlY2xhcmVkQ2xhc3NlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldERlY2xhcmVkQ2xhc3Nlc0dlbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZWNsYXJlZENsYXNzZXNHZW4oKSB7Ci0JCWlmIChkZWNsYXJlZENsYXNzZXMgPT0gbnVsbCkgewotCQkJZGVjbGFyZWRDbGFzc2VzID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KEphdmFDbGFzcy5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTKTsKLQkJfQotCQlyZXR1cm4gZGVjbGFyZWRDbGFzc2VzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOyAvLyBBcyBvZiBFTUYgMi4wLCBsb2NhbCBwcm9wZXJ0aWVzIGFyZSB0aGUgbG9jYWwgZmVhdHVyZXMuIFVzZWQgdG8gYmUgYSBtZXJnZSBvZiBlYXR0cmlidXRlcyBhbmQgZXJlZmVyZW5jZXMuCi0JfQotCi0JcHVibGljIEVMaXN0IGdldEV2ZW50cygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGFkYXB0ZXIgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RXZlbnRzKCk7Ci0JCXJldHVybiBnZXRFdmVudHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXZlbnRzR2VuKCkgewotCQlpZiAoZXZlbnRzID09IG51bGwpIHsKLQkJCWV2ZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKYXZhRXZlbnQuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGV2ZW50czsKLQl9Ci0KLQlwcml2YXRlIEVMaXN0IGFsbEV2ZW50czsKLQotCXB1YmxpYyBFTGlzdCBnZXRBbGxFdmVudHMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBpYSA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChpYSA9PSBudWxsKQotCQkJcmV0dXJuIEVDb2xsZWN0aW9ucy5FTVBUWV9FTElTVDsgLy8gTm8gaW50cm9zcGVjdGlvbiwgZG8gbm9ybWFsLgotCQlyZXR1cm4gYWxsRXZlbnRzID0gaWEuZ2V0QWxsRXZlbnRzKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEFsbEV2ZW50c0dlbigpIHsKLQkJcmV0dXJuIGFsbEV2ZW50czsKLQl9Ci0KLQlwcml2YXRlIEVMaXN0IGFsbFByb3BlcnRpZXM7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsUHJvcGVydGllcygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGlhID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGlhID09IG51bGwpCi0JCQlyZXR1cm4gRUNvbGxlY3Rpb25zLkVNUFRZX0VMSVNUOyAvLyBObyBpbnRyb3NwZWN0aW9uLCBkbyBub3JtYWwuCi0JCXJldHVybiBhbGxQcm9wZXJ0aWVzID0gaWEuZ2V0QWxsUHJvcGVydGllcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRBbGxQcm9wZXJ0aWVzR2VuKCkgewotCQlyZXR1cm4gYWxsUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTUzoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGdldEluc3RhbmNlQ2xhc3MoKSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX0VERUZBVUxULmVxdWFscyhnZXRJbnN0YW5jZUNsYXNzKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUZBVUxUX1ZBTFVFOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVBBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5URVJGQUNFX0VGTEFHKSAhPSAwKSAhPSBJTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VTVVBFUl9UWVBFUzoKLQkJCQlyZXR1cm4gZVN1cGVyVHlwZXMgIT0gbnVsbCAmJiAhZVN1cGVyVHlwZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FT1BFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZU9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZU9wZXJhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiAhZ2V0RUFsbFJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VSRUZFUkVOQ0VTOgotCQkJCXJldHVybiAhZ2V0RVJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBVFRSSUJVVEVTOgotCQkJCXJldHVybiAhZ2V0RUF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOgotCQkJCXJldHVybiAhZ2V0RUFsbENvbnRhaW5tZW50cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9PUEVSQVRJT05TOgotCQkJCXJldHVybiAhZ2V0RUFsbE9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUlEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuIGVTdHJ1Y3R1cmFsRmVhdHVyZXMgIT0gbnVsbCAmJiAhZVN0cnVjdHVyYWxGZWF0dXJlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0tJTkQ6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUFVCTElDOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFBVQkxJQ19FRkxBRykgIT0gMCkgIT0gUFVCTElDX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlyZXR1cm4gaW1wbGVtZW50c0ludGVyZmFjZXMgIT0gbnVsbCAmJiAhaW1wbGVtZW50c0ludGVyZmFjZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ6Ci0JCQkJcmV0dXJuIGNsYXNzSW1wb3J0ICE9IG51bGwgJiYgIWNsYXNzSW1wb3J0LmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBwYWNrYWdlSW1wb3J0cyAhPSBudWxsICYmICFwYWNrYWdlSW1wb3J0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gZmllbGRzICE9IG51bGwgJiYgIWZpZWxkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIG1ldGhvZHMgIT0gbnVsbCAmJiAhbWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXJzICE9IG51bGwgJiYgIWluaXRpYWxpemVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGRlY2xhcmVkQ2xhc3NlcyAhPSBudWxsICYmICFkZWNsYXJlZENsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRToKLQkJCQlyZXR1cm4gYmFzaWNHZXRKYXZhUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlyZXR1cm4gZXZlbnRzICE9IG51bGwgJiYgIWV2ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM6Ci0JCQkJcmV0dXJuICFnZXRBbGxFdmVudHMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUJTVFJBQ1Q6Ci0JCQkJc2V0QWJzdHJhY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTlRFUkZBQ0U6Ci0JCQkJc2V0SW50ZXJmYWNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNVUEVSX1RZUEVTOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FT1BFUkFUSU9OUzoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19LSU5EOgotCQkJCXNldEtpbmQoKFR5cGVLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BVQkxJQzoKLQkJCQlzZXRQdWJsaWMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUOgotCQkJCWdldENsYXNzSW1wb3J0KCkuY2xlYXIoKTsKLQkJCQlnZXRDbGFzc0ltcG9ydCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFM6Ci0JCQkJZ2V0UGFja2FnZUltcG9ydHMoKS5jbGVhcigpOwotCQkJCWdldFBhY2thZ2VJbXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlnZXRGaWVsZHMoKS5jbGVhcigpOwotCQkJCWdldEZpZWxkcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTOgotCQkJCWdldE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCWdldEluaXRpYWxpemVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdGlhbGl6ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJZ2V0RGVjbGFyZWRDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlnZXREZWNsYXJlZENsYXNzZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTOgotCQkJCXNldERlY2xhcmluZ0NsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCWdldEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXZlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM6Ci0JCQkJZ2V0QWxsRXZlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRBbGxFdmVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRToKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FCU1RSQUNUOgotCQkJCXNldEFic3RyYWN0KEFCU1RSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VTVVBFUl9UWVBFUzoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FT1BFUkFUSU9OUzoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzoKLQkJCQlnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0tJTkQ6Ci0JCQkJc2V0S2luZChLSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BVQkxJQzoKLQkJCQlzZXRQdWJsaWMoUFVCTElDX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMOgotCQkJCXNldEZpbmFsKEZJTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ6Ci0JCQkJZ2V0Q2xhc3NJbXBvcnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCWdldFBhY2thZ2VJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlnZXRGaWVsZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlnZXRJbml0aWFsaXplcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlnZXREZWNsYXJlZENsYXNzZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTOgotCQkJCXNldERlY2xhcmluZ0NsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FVkVOVFM6Ci0JCQkJZ2V0RXZlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM6Ci0JCQkJZ2V0QWxsRXZlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpIHsKLQkJaWYgKGltcGxlbWVudHNJbnRlcmZhY2VzID09IG51bGwpIHsKLQkJCWltcGxlbWVudHNJbnRlcmZhY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUykgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKiAKLQkJCQkgKiBAc2luY2UgMS4xLjAKLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5nZXQoaW5kZXgpOyAvL2ZvcmNlIHJlc29sdXRpb24gc28gdGhlIEVTdXBlckFkYXB0ZXIgd2lsbCBiZSB1cGRhdGVkIGNvcnJlY3RseQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCQkJc3VwZXIuY2xlYXIoKTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLnJlbW92ZShpbmRleCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQkJCQlzdXBlci5hZGQoaW5kZXgsIG9iamVjdCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLmFkZChpbmRleCwgb2JqZWN0KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotCQkJCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLmFkZChvYmplY3QpOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGQob2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGRBbGwoY29sbGVjdGlvbik7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBpbXBsZW1lbnRzSW50ZXJmYWNlczsKLQl9Ci0KLQlwcml2YXRlIEVMaXN0IGdldEludGVyZmFjZVN1cGVyVHlwZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDbGFzc0ltcG9ydEdlbigpIHsKLQkJaWYgKGNsYXNzSW1wb3J0ID09IG51bGwpIHsKLQkJCWNsYXNzSW1wb3J0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVCk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzSW1wb3J0OwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQWxsU3VwZXJUeXBlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsvL0ZvcmNlIHJlZmxlY3Rpb24sIGlmIG5lZWRlZCwgYmVmb3JlIGdldHRpbmcgYWxsIHN1cGVydHlwZXMuCi0JCXJldHVybiBzdXBlci5nZXRFQWxsU3VwZXJUeXBlcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3VwZXJUeXBlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVTdXBlclR5cGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IHRoZSByZWZsZWN0aW9uCi0JICogYWRhcHRlcnMgY2FuIHJlZmVyZW5jZSB0aGUgdW5yZWZsZWN0ZWQgc3VwZXJ0eXBlcy4KLQkgKiAgCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFTGlzdCBwcmltR2V0RVN1cGVyVHlwZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQYWNrYWdlSW1wb3J0c0dlbigpIHsKLQkJaWYgKHBhY2thZ2VJbXBvcnRzID09IG51bGwpIHsKLQkJCXBhY2thZ2VJbXBvcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhUGFja2FnZS5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcGFja2FnZUltcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpZWxkc0dlbigpIHsKLQkJaWYgKGZpZWxkcyA9PSBudWxsKSB7Ci0JCQlmaWVsZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChGaWVsZC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTLCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kc0dlbigpIHsKLQkJaWYgKG1ldGhvZHMgPT0gbnVsbCkgewotCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1ldGhvZC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUywgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2VHZW4oKSB7Ci0JCUphdmFQYWNrYWdlIGphdmFQYWNrYWdlID0gYmFzaWNHZXRKYXZhUGFja2FnZSgpOwotCQlyZXR1cm4gamF2YVBhY2thZ2UgPT0gbnVsbCA/IG51bGwgOiAoSmF2YVBhY2thZ2UpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWphdmFQYWNrYWdlKTsKLQl9Ci0KLQkvKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSBiYXNpY0dldEphdmFQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0SmF2YVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVBBQ0tBR0U6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRU9QRVJBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmllbGRzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVjbGFyaW5nQ2xhc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldERlY2xhcmluZ0NsYXNzKChKYXZhQ2xhc3Mpb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VQQUNLQUdFOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpZWxkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRpYWxpemVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlY2xhcmVkQ2xhc3NlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJCXJldHVybiBiYXNpY1NldERlY2xhcmluZ0NsYXNzKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV2ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVBBQ0tBR0U6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUNMQVNTSUZJRVJTLCBFUGFja2FnZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VQQUNLQUdFOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gaXNBYnN0cmFjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5URVJGQUNFOgotCQkJCXJldHVybiBpc0ludGVyZmFjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVNVUEVSX1RZUEVTOgotCQkJCXJldHVybiBnZXRFU3VwZXJUeXBlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FT1BFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFQWxsQXR0cmlidXRlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VSRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRFUmVmZXJlbmNlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0RUF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9DT05UQUlOTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEVBbGxDb250YWlubWVudHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9PUEVSQVRJT05TOgotCQkJCXJldHVybiBnZXRFQWxsT3BlcmF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUFMTF9TVVBFUl9UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRUlEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCXJldHVybiBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0tJTkQ6Ci0JCQkJcmV0dXJuIGdldEtpbmQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUFVCTElDOgotCQkJCXJldHVybiBpc1B1YmxpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlyZXR1cm4gZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUOgotCQkJCXJldHVybiBnZXRDbGFzc0ltcG9ydCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFM6Ci0JCQkJcmV0dXJuIGdldFBhY2thZ2VJbXBvcnRzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gZ2V0RmllbGRzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCXJldHVybiBnZXRJbml0aWFsaXplcnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gZ2V0RGVjbGFyZWRDbGFzc2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSkFWQV9QQUNLQUdFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SmF2YVBhY2thZ2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRKYXZhUGFja2FnZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FVkVOVFM6Ci0JCQkJcmV0dXJuIGdldEV2ZW50cygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BTExfRVZFTlRTOgotCQkJCXJldHVybiBnZXRBbGxFdmVudHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdHZW4oKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChraW5kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChraW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdWJsaWM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBQVUJMSUNfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aXRoIHRydWUuIEl0IGlzIGJhc2ljYWxseSBvbmx5IGZvciByZXNldCBvZiByZWZsZWN0aW9uLCBub3QgdG8gc2V0IGEgcGFydGljdWxhciBzdGF0ZS4gQnV0IEludGVybmFsUmVhZEFkYXB0YWJsZQotCSAqIG1heSBiZSB1c2VkIGJ5IHNvbWVvbmUgdGhhdCBzaG91bGRuJ3Qgc28gdG8gYmUgYmUgc2FmZSB3ZSBrZWVwIGl0LiBUT0RPIFJlbW92ZSBJbnRlcm5hbFJlYWRBZGFwdGFibGUgaW4gbmV4dCB2ZXJzaW9uLiBOZWVkIHRvIHdhaXQgYmVjYXVzZSB3ZQotCSAqIG5lZWQgdGltZSB0byBub3RpZnkgZXZlcnlvbmUuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5JbnRlcm5hbFJlYWRBZGFwdGFibGUjc2V0UmVmbGVjdGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlZmxlY3RlZChib29sZWFuIGFCb29sZWFuKSB7Ci0JCWlmICghYUJvb2xlYW4pCi0JCQlyZWZsZWN0aW9uU3RhdHVzID0gTk9UX1JFRkxFQ1RFRDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldFJlZmxlY3Rpb25UeXBlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25UeXBlKCkgewotCQlKYXZhUmVmbGVjdGlvbkFkYXB0b3IgamEgPSAoKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgZ2V0UmVhZEFkYXB0ZXIoKSk7Ci0JCXJldHVybiBqYSAhPSBudWxsID8gamEuZ2V0UmVmbGVjdGlvblNvdXJjZSgpIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YURhdGFUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFEYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMmVkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFEYXRhVHlwZUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkluc3RhbmNlOwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRGF0YVR5cGVJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIEphdmFEYXRhVHlwZXsKLQotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1pFUk8gPSAiMC4wIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUX1pFUk8gPSAiMC4wZiI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSX1pFUk8gPSAiJzAnIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk8gPSAiMCI7Ci0JCi0JcHJpdmF0ZSBpbnQgcHJpbWl0aXZlX3R5cGUgPSBQUklNX05PVF9JRDsKLQkKLQlwcm90ZWN0ZWQgSmF2YURhdGFUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YURhdGFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0SmF2YU5hbWUoKTsKLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhQUklNX0JPT0xFQU5fTkFNRSkpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoUFJJTV9ET1VCTEVfTkFNRSkpCi0JCQlyZXR1cm4gRE9VQkxFX1pFUk87Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoUFJJTV9GTE9BVF9OQU1FKSkKLQkJCXJldHVybiBGTE9BVF9aRVJPOwkJCQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKFBSSU1fQ0hBUkFDVEVSX05BTUUpKQotCQkJcmV0dXJuIENIQVJfWkVSTzsKLQkJcmV0dXJuIFpFUk87Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCXB1YmxpYyBKYXZhRGF0YVR5cGUgZ2V0UHJpbWl0aXZlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnMjZ2V0UHJpbWl0aXZlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJpbWl0aXZlSUQoKSB7Ci0JCWlmIChwcmltaXRpdmVfdHlwZSA9PSBQUklNX05PVF9JRCkgewotCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9CT09MRUFOX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9CT09MRUFOX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fQ0hBUkFDVEVSX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9DSEFSQUNURVJfSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9CWVRFX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9CWVRFX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fU0hPUlRfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX1NIT1JUX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fSU5URUdFUl9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fSU5URUdFUl9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0xPTkdfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0xPTkdfSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9GTE9BVF9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fRkxPQVRfSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9ET1VCTEVfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0RPVUJMRV9JRDsKLQkJfQotCQlyZXR1cm4gcHJpbWl0aXZlX3R5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gZ2V0SmF2YU5hbWUoKTsKLQl9Ci0JcHVibGljIEphdmFDbGFzcyBnZXRXcmFwcGVyKCkgewotCQlTdHJpbmcgd3JhcHBlck5hbWUgPSBnZXRXcmFwcGVyUXVhbGlmaWVkTmFtZSgpOwotCQlpZiAod3JhcHBlck5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSh3cmFwcGVyTmFtZSwgdGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIGdldFdyYXBwZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRXcmFwcGVyUXVhbGlmaWVkTmFtZSgpIHsKLQkJc3dpdGNoIChnZXRQcmltaXRpdmVJRCgpKSB7Ci0JCQljYXNlIFBSSU1fSU5URUdFUl9JRDoKLQkJCQlyZXR1cm4gSU5URUdFUl9OQU1FOwotCQkJY2FzZSBQUklNX0NIQVJBQ1RFUl9JRDoKLQkJCQlyZXR1cm4gQ0hBUkFDVEVSX05BTUU7Ci0JCQljYXNlIFBSSU1fQk9PTEVBTl9JRDoKLQkJCQlyZXR1cm4gQk9PTEVBTl9OQU1FOwotCQkJY2FzZSBQUklNX0JZVEVfSUQ6Ci0JCQkJcmV0dXJuIEJZVEVfTkFNRTsKLQkJCWNhc2UgUFJJTV9TSE9SVF9JRDoKLQkJCQlyZXR1cm4gU0hPUlRfTkFNRTsKLQkJCWNhc2UgUFJJTV9MT05HX0lEOgotCQkJCXJldHVybiBMT05HX05BTUU7Ci0JCQljYXNlIFBSSU1fRkxPQVRfSUQ6Ci0JCQkJcmV0dXJuIEZMT0FUX05BTUU7Ci0JCQljYXNlIFBSSU1fRE9VQkxFX0lEOgotCQkJCXJldHVybiBET1VCTEVfTkFNRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBKYXZhSGVscGVycy5pc0FycmF5KCkgLSBhcnJheSB0eXBlcyBhcmUgYWx3YXlzIEphdmFDbGFzc2VzLCBldmVuIGlmIHRoZWlyIGNvbXBvbmVudCB0eXBlIGlzCi0JICoJCWEgcHJpbWl0aXZlIGRhdGEgdHlwZS4gUmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQ2FuIGFuIG9iamVjdCBvZiB0aGUgcGFzc2VkIGluIGNsYXNzIGJlIGFzc2lnbmVkIHRvIGFuCi0JICogb2JqZWN0IG9mIHRoaXMgY2xhc3M/IEluIHRoZSBjYXNlIG9mIHByaW1pdGl2ZXMsIGFyZSB0aGV5IHRoZSBzYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oRUNsYXNzaWZpZXIgYUNsYXNzKSB7Ci0JCXJldHVybiB0aGlzID09IGFDbGFzczsKLQl9Ci0JLyoqCi0JICogU2VlIGlmIHRoaXMgaXMgdmFsaWQgb2JqZWN0IG9mIHRoaXMgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbmNlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgSUluc3RhbnRpYXRpb25JbnN0YW5jZSA/IGlzQXNzaWduYWJsZUZyb20oKChJSW5zdGFudGlhdGlvbkluc3RhbmNlKSBvKS5nZXRKYXZhVHlwZSgpKSA6IGZhbHNlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VQQUNLQUdFOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRU9QRVJBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVBBQ0tBR0U6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FT1BFUkFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFT3BlcmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VQQUNLQUdFOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUywgRVBhY2thZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3NOYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0FCU1RSQUNUOgotCQkJCXJldHVybiBpc0Fic3RyYWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fSU5URVJGQUNFOgotCQkJCXJldHVybiBpc0ludGVyZmFjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VTVVBFUl9UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCXJldHVybiBnZXRFT3BlcmF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFMTF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFQWxsQXR0cmlidXRlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBnZXRFQWxsUmVmZXJlbmNlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVJFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldEVSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0RUF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTOgotCQkJCXJldHVybiBnZXRFQWxsQ29udGFpbm1lbnRzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX09QRVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTExfU1VQRVJfVFlQRVM6Ci0JCQkJcmV0dXJuIGdldEVBbGxTdXBlclR5cGVzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FSURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCXJldHVybiBnZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRToKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19BQlNUUkFDVDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlRFUkZBQ0U6Ci0JCQkJc2V0SW50ZXJmYWNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VTVVBFUl9UWVBFUzoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VPUEVSQVRJT05TOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VBTk5PVEFUSU9OUzoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0FCU1RSQUNUOgotCQkJCXNldEFic3RyYWN0KEFCU1RSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlRFUkZBQ0U6Ci0JCQkJc2V0SW50ZXJmYWNlKElOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNVUEVSX1RZUEVTOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FT1BFUkFUSU9OUzoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9DTEFTUzoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGdldEluc3RhbmNlQ2xhc3MoKSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX0VERUZBVUxULmVxdWFscyhnZXRJbnN0YW5jZUNsYXNzKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhnZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fSU5URVJGQUNFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElOVEVSRkFDRV9FRkxBRykgIT0gMCkgIT0gSU5URVJGQUNFX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRVNVUEVSX1RZUEVTOgotCQkJCXJldHVybiBlU3VwZXJUeXBlcyAhPSBudWxsICYmICFlU3VwZXJUeXBlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FT1BFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZU9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZU9wZXJhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFMTF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiAhZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VSRUZFUkVOQ0VTOgotCQkJCXJldHVybiAhZ2V0RVJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gIWdldEVBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQ29udGFpbm1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFMTF9PUEVSQVRJT05TOgotCQkJCXJldHVybiAhZ2V0RUFsbE9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUzoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRV9fRUlEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOgotCQkJCXJldHVybiBlU3RydWN0dXJhbEZlYXR1cmVzICE9IG51bGwgJiYgIWVTdHJ1Y3R1cmFsRmVhdHVyZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyNnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpIHsKLQkJcmV0dXJuIGdldEphdmFOYW1lKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxN2MxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhRXZlbnRJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzIgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFFdmVudEltcGwgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIGltcGxlbWVudHMgSmF2YUV2ZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUV2ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVMsIEVDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RUFubm90YXRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fT1JERVJFRDoKLQkJCQlyZXR1cm4gaXNPcmRlcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19VTklRVUU6Ci0JCQkJcmV0dXJuIGlzVW5pcXVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFVwcGVyQm91bmQoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX01BTlk6Ci0JCQkJcmV0dXJuIGlzTWFueSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VUWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFVHlwZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19DSEFOR0VBQkxFOgotCQkJCXJldHVybiBpc0NoYW5nZWFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1ZPTEFUSUxFOgotCQkJCXJldHVybiBpc1ZvbGF0aWxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19UUkFOU0lFTlQ6Ci0JCQkJcmV0dXJuIGlzVHJhbnNpZW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOU0VUVEFCTEU6Ci0JCQkJcmV0dXJuIGlzVW5zZXR0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVSSVZFRDoKLQkJCQlyZXR1cm4gaXNEZXJpdmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fQ0hBTkdFQUJMRToKLQkJCQlzZXRDaGFuZ2VhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVk9MQVRJTEU6Ci0JCQkJc2V0Vm9sYXRpbGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19UUkFOU0lFTlQ6Ci0JCQkJc2V0VHJhbnNpZW50KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19VTlNFVFRBQkxFOgotCQkJCXNldFVuc2V0dGFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERVJJVkVEOgotCQkJCXNldERlcml2ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoT1JERVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKFVOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKExPV0VSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VQUEVSX0JPVU5EOgotCQkJCXNldFVwcGVyQm91bmQoVVBQRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRVRZUEU6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fQ0hBTkdFQUJMRToKLQkJCQlzZXRDaGFuZ2VhYmxlKENIQU5HRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVk9MQVRJTEU6Ci0JCQkJc2V0Vm9sYXRpbGUoVk9MQVRJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVFJBTlNJRU5UOgotCQkJCXNldFRyYW5zaWVudChUUkFOU0lFTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOU0VUVEFCTEU6Ci0JCQkJc2V0VW5zZXR0YWJsZShVTlNFVFRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0RFUklWRUQ6Ci0JCQkJc2V0RGVyaXZlZChERVJJVkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19PUkRFUkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE9SREVSRURfRUZMQUcpICE9IDApICE9IE9SREVSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VOSVFVRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fTE9XRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIGxvd2VyQm91bmQgIT0gTE9XRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1VQUEVSX0JPVU5EOgotCQkJCXJldHVybiB1cHBlckJvdW5kICE9IFVQUEVSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSAhPSBNQU5ZX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19FVFlQRToKLQkJCQlyZXR1cm4gZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBDSEFOR0VBQkxFX0VGTEFHKSAhPSAwKSAhPSBDSEFOR0VBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19WT0xBVElMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMCkgIT0gVk9MQVRJTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDApICE9IFRSQU5TSUVOVF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZUxpdGVyYWwgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWYWx1ZUxpdGVyYWwpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERUZBVUxUX1ZBTFVFOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVF9fVU5TRVRUQUJMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTlNFVFRBQkxFX0VGTEFHKSAhPSAwKSAhPSBVTlNFVFRBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0VWRU5UX19ERVJJVkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIERFUklWRURfRUZMQUcpICE9IDApICE9IERFUklWRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfRVZFTlRfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2ZkZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YUZhY3RvcnlJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzIgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IHRvIHVzZSBKYXZhUmVmIHBhY2thZ2VzLiBJdCB3aWxsIHVzZSB0aGUKLSAqIElJbnN0YW50aWF0aW9uSGFuZGxlciwgaWYgdGhlcmUgaXMgb25lLCB0byBkbyB0aGUKLSAqIGZhY3RvcnkgcmVxdWVzdHMuIEVsc2UgaXQgd2lsbCBsZXQgdGhlIHN1cGVyY2xhc3MgaGFuZGxlIGl0LgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIHsKLQkKLQlwcml2YXRlIElJbnN0YW50aWF0aW9uSGFuZGxlciBpbnN0YW50aWF0aW9uSGFuZGxlcjsKLQlwcml2YXRlIGJvb2xlYW4gcmV0cmlldmVkSGFuZGxlcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhRmFjdG9yeUltcGwuCi0JICovCi0JcHVibGljIEphdmFGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUluc3RhbnRpYXRpb25IYW5kbGVyIGdldEluc3RhbnRpYXRpb25IYW5kbGVyKCkgewotCQlpZiAoIXJldHJpZXZlZEhhbmRsZXIpIHsKLQkJCS8vIE5lZWQgdG8gcmV0cmlldmUgaGFuZGxlciBsYXppbHkgYmVjYXVzZSB3aGVuIGZhY3RvcnkgaXMgY3JlYXRlZCBpdCBkb2VzIG5vdCB5ZXQga25vdyB3aGF0IFJlc291cmNlU2V0IGl0IGlzIGluLgotCQkJLy8gQ2FuJ3Qga25vdyB0aGF0IHVudGlsIHRoZSBmaXJzdCB0aW1lIHdlIG5lZWQgYSBoYW5kbGVyLgotCQkJUmVzb3VyY2VTZXQgcnNldCA9IGdldEVQYWNrYWdlKCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyc2V0ICE9IG51bGwpIHsKLQkJCQlyZXRyaWV2ZWRIYW5kbGVyID0gdHJ1ZTsKLQkJCQlJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlciBmYWN0b3J5ID0gKElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHJzZXQsIElJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCQlpbnN0YW50aWF0aW9uSGFuZGxlciA9IGZhY3RvcnkuZ2V0SW5zdGFudGlhdGlvbkhhbmRsZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbnRpYXRpb25IYW5kbGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeSNjcmVhdGUoRUNsYXNzKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCUlJbnN0YW50aWF0aW9uSGFuZGxlciBpYSA9IGdldEluc3RhbnRpYXRpb25IYW5kbGVyKCk7Ci0JCWlmIChpYSA9PSBudWxsIHx8ICFpYS5oYW5kbGVzQ2xhc3MoZUNsYXNzKSkKLQkJCXJldHVybiBzdXBlci5jcmVhdGUoZUNsYXNzKTsKLQkJZWxzZQotCQkJcmV0dXJuIGlhLmNyZWF0ZShlQ2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTRjYWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUGFja2FnZUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FQ29sbGVjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi1wdWJsaWMgY2xhc3MgSmF2YVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVBhY2thZ2UsIEVQYWNrYWdlIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIGNsYXNzZXMgdGhhdCB0aGlzIHBhY2thZ2UgY29udGFpbnMuCi0JICogU2luY2UgdGhpcyBpcyBhIGRlcml2ZWQgcmVsYXRpb25zaGlwLCB3ZSBuZWVkIHRvIGltcGxlbWVudAotCSAqIGl0IGhlcmUuIEl0IHdpbGwgZ2V0IHRoZSBtZXRhb2JqZWN0cyBsaXN0LiBUaGVzZSBhcmUgdGhlCi0JICogamF2YSBjbGFzc2VzIHRoaXMgcGFja2FnZSBjb250YWlucy4KLQkgKgotCSAqIElmIHRoaXMgaXMgdGhlIHByaW1pdGl2ZXMgcGFja2FnZSwgdGhlbiBpdCBtdXN0IHJldHVybgotCSAqIGFuIGVtcHR5IGxpc3QgYmVjYXVzZSBpdCBkb2Vzbid0IGNvbnRhaW4gYW55IGNsYXNzZXMuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEphdmFDbGFzc2VzKCkgewotCQlyZXR1cm4gIVBSSU1JVElWRV9QQUNLQUdFX05BTUUuZXF1YWxzKGdldE5hbWUoKSkgPwotCQkJRUNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUVMaXN0KGdldEVDbGFzc2lmaWVycygpKSA6Ci0JCQlFQ29sbGVjdGlvbnMuRU1QVFlfRUxJU1Q7Ci0JfQotLyoqCi0gKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgcGFja2FnZS4KLSAqIFdlIGRvIG5vdCB3YW50IHRvIGV4cG9zZSB0aGUgLmphdmFwcmltIHBhY2thZ2UKLSAqIHNpbmNlIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgcGFja2FnZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCWlmIChpc0RlZmF1bHQoKSkKLQkJcmV0dXJuICIiOwotCWVsc2UKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCi0JU3RyaW5nIGludGVybmFsTmFtZSA9IHN1cGVyLmdldE5hbWUoKSA7Ci0JcmV0dXJuIEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUuZXF1YWxzKGludGVybmFsTmFtZSkgPyAiIiA6IGludGVybmFsTmFtZSA7CQotfQotcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCXJldHVybiBKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FLmVxdWFscyhzdXBlci5nZXROYW1lKCkpOwkKLX0KLQkvKioKLQkgKiBTaW5jZSBjbGFzc2VzIGFyZSBsb2FkZWQgZHluYW1pY2FsbHkgYW5kIG5vdCBmcm9tIGEgc2NoZW1hLCBhCi0JICogY2xhc3MgY291bGQgYmUgYXNrZWQgZm9yIHRocm91Z2ggdGhpcyBtZXRob2QsIGFuZCBpZiBub3QgeWV0IHJlZmxlY3RlZCwKLQkgKiBpdCB3b3VsZG4ndCBiZSBmb3VuZC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgY2xhc3MgYXNrZWQgZm9yCi0JICogaW4gdGhpcyBwYWNrYWdlIGlzIGZvdW5kIChpLmUuIHBvb2ZlZCB1cCkuIE90aGVyd2lzZSBsb2FkaW5nIGFuIGluc3RhbmNlCi0JICogZG9jdW1lbnQgdGhhdCByZWZlcnMgdG8gamF2YSBjbGFzcyB0aHJvdWdoIG5hbWVzcGFjZXMgd29uJ3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldEVDbGFzc2lmaWVyKFN0cmluZyBjbGFzc05hbWUpIHsJCQkKLQkJLy8gVHJ5IHRvIGdldCB0aGUgY2xhc3MgZnJvbSB0aGUgcmVzb3VyY2UgdGhhdCB0aGlzIHBhY2thZ2UgaXMgaW4uCi0JCS8vIFRoaXMgd2lsbCBjcmVhdGUgaXQgaWYgbm90IGZvdW5kLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlCi0JCS8vIHN0cnVjdHVyZSBpcyB0aGVyZSBpcyBvbmUgamF2YSBwYWNrYWdlIHBlciByZXNvdXJjZSwgYW5kCi0JCS8vIHRoZSBpZCBvZiB0aGUgY2xhc3MgaXMgdGhlIGNsYXNzIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZQotCQkvLyBwb3J0aW9uLCB3aGljaCBpcyB3aGF0IGNsYXNzTmFtZSBhYm92ZSBpcy4KLQkJT2JqZWN0IHJlc3VsdCA9IGVSZXNvdXJjZSgpLmdldEVPYmplY3QoY2xhc3NOYW1lKTsKLQkJcmV0dXJuIChyZXN1bHQgaW5zdGFuY2VvZiBFQ2xhc3NpZmllcikgPyAoRUNsYXNzaWZpZXIpIHJlc3VsdCA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YSBwYWNrYWdlIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiBJZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0UGFja2FnZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVBhY2thZ2UgcmVmbGVjdChTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RQYWNrYWdlKHBhY2thZ2VOYW1lLCBzZXQpOwotICAgIH0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUZBQ1RPUllfSU5TVEFOQ0U6Ci0JCQkJCWlmIChlRmFjdG9yeUluc3RhbmNlICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZUZhY3RvcnlJbnN0YW5jZSkuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVGQUNUT1JZX19FUEFDS0FHRSwgRUZhY3RvcnkuY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRFRmFjdG9yeUluc3RhbmNlKChFRmFjdG9yeSlvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VDTEFTU0lGSUVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQ2xhc3NpZmllcnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VCUEFDS0FHRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVN1YnBhY2thZ2VzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0U6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VQRVJfUEFDS0FHRSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VGQUNUT1JZX0lOU1RBTkNFOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFRmFjdG9yeUluc3RhbmNlKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQ0xBU1NJRklFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUNsYXNzaWZpZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRVNVQlBBQ0tBR0VTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVTdWJwYWNrYWdlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VTVVBFUl9QQUNLQUdFOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0UsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0U6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRVNVQlBBQ0tBR0VTLCBFUGFja2FnZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTlNfVVJJOgotCQkJCXJldHVybiBnZXROc1VSSSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX05TX1BSRUZJWDoKLQkJCQlyZXR1cm4gZ2V0TnNQcmVmaXgoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FRkFDVE9SWV9JTlNUQU5DRToKLQkJCQlyZXR1cm4gZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VDTEFTU0lGSUVSUzoKLQkJCQlyZXR1cm4gZ2V0RUNsYXNzaWZpZXJzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRVNVQlBBQ0tBR0VTOgotCQkJCXJldHVybiBnZXRFU3VicGFja2FnZXMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VQRVJfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0RVN1cGVyUGFja2FnZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0pBVkFfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19OU19VUkk6Ci0JCQkJc2V0TnNVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX05TX1BSRUZJWDoKLQkJCQlzZXROc1ByZWZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUZBQ1RPUllfSU5TVEFOQ0U6Ci0JCQkJc2V0RUZhY3RvcnlJbnN0YW5jZSgoRUZhY3RvcnkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FQ0xBU1NJRklFUlM6Ci0JCQkJZ2V0RUNsYXNzaWZpZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRFQ2xhc3NpZmllcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VCUEFDS0FHRVM6Ci0JCQkJZ2V0RVN1YnBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFU3VicGFja2FnZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTlNfVVJJOgotCQkJCXNldE5zVVJJKE5TX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX05TX1BSRUZJWDoKLQkJCQlzZXROc1ByZWZpeChOU19QUkVGSVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FRkFDVE9SWV9JTlNUQU5DRToKLQkJCQlzZXRFRmFjdG9yeUluc3RhbmNlKChFRmFjdG9yeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUNMQVNTSUZJRVJTOgotCQkJCWdldEVDbGFzc2lmaWVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VTVUJQQUNLQUdFUzoKLQkJCQlnZXRFU3VicGFja2FnZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX05TX1VSSToKLQkJCQlyZXR1cm4gTlNfVVJJX0VERUZBVUxUID09IG51bGwgPyBuc1VSSSAhPSBudWxsIDogIU5TX1VSSV9FREVGQVVMVC5lcXVhbHMobnNVUkkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX05TX1BSRUZJWDoKLQkJCQlyZXR1cm4gTlNfUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBuc1ByZWZpeCAhPSBudWxsIDogIU5TX1BSRUZJWF9FREVGQVVMVC5lcXVhbHMobnNQcmVmaXgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VGQUNUT1JZX0lOU1RBTkNFOgotCQkJCXJldHVybiBlRmFjdG9yeUluc3RhbmNlICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fRUNMQVNTSUZJRVJTOgotCQkJCXJldHVybiBlQ2xhc3NpZmllcnMgIT0gbnVsbCAmJiAhZUNsYXNzaWZpZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19FU1VCUEFDS0FHRVM6Ci0JCQkJcmV0dXJuIGVTdWJwYWNrYWdlcyAhPSBudWxsICYmICFlU3VicGFja2FnZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0VfX0VTVVBFUl9QQUNLQUdFOgotCQkJCXJldHVybiBnZXRFU3VwZXJQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFX19KQVZBX0NMQVNTRVM6Ci0JCQkJcmV0dXJuICFnZXRKYXZhQ2xhc3NlcygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vSmF2YVBhY2thZ2VJbXBsCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYXJhbWV0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVBhcmFtZXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzYWJhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVBhcmFtZXRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFQYXJhbWV0ZXJJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDkvMTUgMjA6Mjg6MDQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYXJhbWV0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBhcmFtZXRlckltcGwgZXh0ZW5kcyBFUGFyYW1ldGVySW1wbCBpbXBsZW1lbnRzIEphdmFQYXJhbWV0ZXJ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9FRkxBRyA9IDEgPDwgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVyS2luZCgpIDxlbT5QYXJhbWV0ZXIgS2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1ldGVyS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZCBQQVJBTUVURVJfS0lORF9FREVGQVVMVCA9IEphdmFQYXJhbWV0ZXJLaW5kLklOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVBhcmFtZXRlcktpbmQgcGFyYW1ldGVyS2luZCA9IFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUOwotCXByb3RlY3RlZCBKYXZhUGFyYW1ldGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVBhcmFtZXRlcigpOwotCX0KLQotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRKYXZhVHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhSGVscGVycylnZXRFVHlwZSgpOwotCX0KLSAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotICAgIHJldHVybiAoZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTWV0aG9kKSA/ICgoTWV0aG9kKWVDb250YWluZXIoKSkuZ2V0TmFtZSgpICsgIi4iICsgdGhpcy5nZXROYW1lKCkgOiB0aGlzLmdldE5hbWUoKTsKLSAgfQotCS8qKgotCSAqIElzIHRoaXMgcGFyYW1ldGVyIHR5cGUgYW4gYXJyYXkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZ2V0SmF2YVR5cGUoKS5pc0FycmF5KCk7Ci0JfQotCS8qKgotCSAqIElzIHRoaXMgYSByZXR1cm4gcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmV0dXJuKCkgewotCQlyZXR1cm4gSmF2YVBhcmFtZXRlcktpbmQuUkVUVVJOID09IGdldFBhcmFtZXRlcktpbmQoKS5nZXRWYWx1ZSgpOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmFsKGJvb2xlYW4gbmV3RmluYWwpIHsKLQkJYm9vbGVhbiBvbGRGaW5hbCA9IChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ZpbmFsKSBlRmxhZ3MgfD0gRklOQUxfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5GSU5BTF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0ZJTkFMLCBvbGRGaW5hbCwgbmV3RmluYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlcktpbmQgZ2V0UGFyYW1ldGVyS2luZCgpIHsKLQkJcmV0dXJuIHBhcmFtZXRlcktpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyS2luZChKYXZhUGFyYW1ldGVyS2luZCBuZXdQYXJhbWV0ZXJLaW5kKSB7Ci0JCUphdmFQYXJhbWV0ZXJLaW5kIG9sZFBhcmFtZXRlcktpbmQgPSBwYXJhbWV0ZXJLaW5kOwotCQlwYXJhbWV0ZXJLaW5kID0gbmV3UGFyYW1ldGVyS2luZCA9PSBudWxsID8gUEFSQU1FVEVSX0tJTkRfRURFRkFVTFQgOiBuZXdQYXJhbWV0ZXJLaW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQsIG9sZFBhcmFtZXRlcktpbmQsIHBhcmFtZXRlcktpbmQpKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgcmVmbGVjdGlvbiBhZGFwdGVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFJlYWRBZGFwdG9yIGdldFJlYWRBZGFwdGVyKCkgewotCQlyZXR1cm4gKFJlYWRBZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIoZUNvbnRhaW5lcigpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgUkVGTEVDVEVEX0JBU0UgPSAweDEsIFJFRkxFQ1RFRF9QQVJBTV9OQU1FID0gMHgyOwotCi0JcHJvdGVjdGVkIGludCByZWZsZWN0aW9uU3RhdHVzID0gUkVGTEVDVEVEX0JBU0U7ICAvLyBBdCB0aGlzIHRpbWUgYmFzZSByZWZsZWN0aW9uCi0JCQkJCQkJCQkJCQkJICAvLyBpcyBwZXJmb3JtZWQgYXQgY3JlYXRpb24uCi0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0UGFyYW1OYW1lKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9QQVJBTV9OQU1FKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9ICgoSUphdmFNZXRob2RBZGFwdGVyKSByZWFkQWRhcHRvcikucmVmbGVjdFBhcmFtTmFtZXNJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCS8vIE5vcm1hbGx5IHdlIHdvdWxkbid0IG5lZWQgdG8gc2V0IHRoaXMgYmVjYXVzZSBpdCB3b3VsZCBiZSBzZXQgZHVyaW5nIHRoZSByZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5LCBidXQKLQkJCQkvLyBpbiBjYXNlIHRoZXJlIHdhcyBhIHByb2JsZW0gd2UgbWFyayBpdCBzdGlsbCByZWZsZWN0ZWQgc28gd2UgZG9uJ3QgdHJ5IGFnYWluLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCXJlZmxlY3Rpb25TdGF0dXMgfD0gKFJFRkxFQ1RFRF9CQVNFIHwgUkVGTEVDVEVEX1BBUkFNX05BTUUpOyAvLyBXZSBjYW4gYmUgY2VydGFpbiBiYXNlIHdpbGwgYmUgZG9uZSBieSByZWZsZWN0IGdlbmVyYXRlZCBpZiBub3QgYWxyZWFkeQotCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZG9uZS4KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJlZmxlY3RQYXJhbU5hbWUoKTsKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzdXBlci5zZXROYW1lKG5hbWUpOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJICAgcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX1BBUkFNX05BTUUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19PUkRFUkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE9SREVSRURfRUZMQUcpICE9IDApICE9IE9SREVSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19VTklRVUU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVU5JUVVFX0VGTEFHKSAhPSAwKSAhPSBVTklRVUVfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbG93ZXJCb3VuZCAhPSBMT1dFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1VQUEVSX0JPVU5EOgotCQkJCXJldHVybiB1cHBlckJvdW5kICE9IFVQUEVSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgIT0gTUFOWV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FVFlQRToKLQkJCQlyZXR1cm4gZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VPUEVSQVRJT046Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb24oKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRklOQUw6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApICE9IEZJTkFMX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQ6Ci0JCQkJcmV0dXJuIHBhcmFtZXRlcktpbmQgIT0gUEFSQU1FVEVSX0tJTkRfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fVVBQRVJfQk9VTkQ6Ci0JCQkJc2V0VXBwZXJCb3VuZCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQ6Ci0JCQkJc2V0UGFyYW1ldGVyS2luZCgoSmF2YVBhcmFtZXRlcktpbmQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKE9SREVSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKExPV0VSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRklOQUw6Ci0JCQkJc2V0RmluYWwoRklOQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5EOgotCQkJCXNldFBhcmFtZXRlcktpbmQoUEFSQU1FVEVSX0tJTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmluYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1ldGVyS2luZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1ldGVyS2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VPUEVSQVRJT046Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VPUEVSQVRJT04sIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRU9QRVJBVElPTjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRU9QRVJBVElPTiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VPUEVSQVRJT046Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FUEFSQU1FVEVSUywgRU9wZXJhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fT1JERVJFRDoKLQkJCQlyZXR1cm4gaXNPcmRlcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fVU5JUVVFOgotCQkJCXJldHVybiBpc1VuaXF1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRMb3dlckJvdW5kKCkpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFVwcGVyQm91bmQoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0VUWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFVHlwZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRU9QRVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0RU9wZXJhdGlvbigpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVyS2luZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGViYTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUmVmRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUmVmRmFjdG9yeUltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGsuSmF2YUpES0FkYXB0ZXJGYWN0b3J5OwotCi0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKYXZhUmVmRmFjdG9yeSB7Ci0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIENsYXNzIFJlZmxlY3Rpb25GYWN0b3J5Q2xhc3MgPSBKYXZhSkRLQWRhcHRlckZhY3RvcnkuY2xhc3M7Ci0JcHVibGljIEphdmFSZWZGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTUzogcmV0dXJuIGNyZWF0ZUphdmFDbGFzcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUjogcmV0dXJuIGNyZWF0ZUluaXRpYWxpemVyKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSOiByZXR1cm4gY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0Q6IHJldHVybiBjcmVhdGVNZXRob2QoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTEQ6IHJldHVybiBjcmVhdGVGaWVsZCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DSzogcmV0dXJuIGNyZWF0ZUJsb2NrKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkNPTU1FTlQ6IHJldHVybiBjcmVhdGVDb21tZW50KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVDogcmV0dXJuIGNyZWF0ZVN0YXRlbWVudCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0U6IHJldHVybiBjcmVhdGVKYXZhUGFja2FnZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0RBVEFfVFlQRTogcmV0dXJuIGNyZWF0ZUphdmFEYXRhVHlwZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFOiByZXR1cm4gY3JlYXRlQXJyYXlUeXBlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5UWVBFX0tJTkQ6IHsKLQkJCQlUeXBlS2luZCByZXN1bHQgPSBUeXBlS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1ZJU0lCSUxJVFlfS0lORDogewotCQkJCUphdmFWaXNpYmlsaXR5S2luZCByZXN1bHQgPSBKYXZhVmlzaWJpbGl0eUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfS0lORDogewotCQkJCUphdmFQYXJhbWV0ZXJLaW5kIHJlc3VsdCA9IEphdmFQYXJhbWV0ZXJLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpUWVBFX0pBVkFfSEVMUEVSUzoKLQkJCQlyZXR1cm4gY3JlYXRlSlR5cGVKYXZhSGVscGVyc0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KVFlQRV9MSVNUOgotCQkJCXJldHVybiBjcmVhdGVKVHlwZUxpc3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlRZUEVfS0lORDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9WSVNJQklMSVRZX0tJTkQ6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX0tJTkQ6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpUWVBFX0pBVkFfSEVMUEVSUzoKLQkJCQlyZXR1cm4gY29udmVydEpUeXBlSmF2YUhlbHBlcnNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KVFlQRV9MSVNUOgotCQkJCXJldHVybiBjb252ZXJ0SlR5cGVMaXN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKEphdmFIZWxwZXJzIGNvbXBvbmVudFR5cGUpIHsKLQkJQXJyYXlUeXBlIGF0ID0gY3JlYXRlQXJyYXlUeXBlKCk7Ci0JCQotCQlTdHJpbmcgY29tcHV0ZWROYW1lID0gY29tcG9uZW50VHlwZS5nZXRRdWFsaWZpZWROYW1lKCkgKyAiW10iOwotCQlhdC5zZXROYW1lKGNvbXB1dGVkTmFtZSk7Ci0JCXJldHVybiBhdDsKLQl9Ci0JcHVibGljIEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoSmF2YUhlbHBlcnMgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucykgewotCQlBcnJheVR5cGUgYXQgPSBjcmVhdGVBcnJheVR5cGUoKTsKLQkJCi0JCVN0cmluZyBjb21wdXRlZE5hbWUgPSBmaW5hbENvbXBvbmVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKyl7Ci0JCQljb21wdXRlZE5hbWUgPSBjb21wdXRlZE5hbWUgKyAiW10iOwotCQl9Ci0JCWF0LnNldE5hbWUoY29tcHV0ZWROYW1lKTsKLQkJcmV0dXJuIGF0OwotCX0KLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVKYXZhQ29udGV4dCgpIHsKLSAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbml0LkphdmFJbml0LmluaXQoKTsKLSAgICBSZXNvdXJjZVNldCBzZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gICAgc2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQoY3JlYXRlSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSgpKTsKLSAgICByZXR1cm4gc2V0OwotICB9Ci0JcHJvdGVjdGVkIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5SW5zdGFuY2UgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGdldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKCkgIT0gbnVsbCkKLQkJCQlmYWN0b3J5SW5zdGFuY2UgPSAoQWRhcHRlckZhY3RvcnkpIGdldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKCkubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFJlZmxlY3Rpb24gb3IgaW5zdGFudGlhdGlvbiBwcm9ibGVtcy4KLQkJCS8vIE9LLCBjYW4ndCBkbyBKYXZhIE1vZGVsIHJlZmxlY3Rpb24KLQkJfQotCQlyZXR1cm4gZmFjdG9yeUluc3RhbmNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiBSZWZsZWN0aW9uRmFjdG9yeUNsYXNzOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBzZWUgSmF2YVBsdWdpbi5zdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoQ2xhc3MgamF2YVJlZmxlY3Rpb25GYWN0b3J5Q2xhc3MpIHsKLQkJUmVmbGVjdGlvbkZhY3RvcnlDbGFzcyA9IGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGNyZWF0ZU1ldGhvZCgpIHsKLQkJTWV0aG9kSW1wbCBtZXRob2QgPSBuZXcgTWV0aG9kSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzKCkgewotCQlKYXZhQ2xhc3NJbXBsIGphdmFDbGFzcyA9IG5ldyBKYXZhQ2xhc3NJbXBsKCk7Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEZpZWxkIGNyZWF0ZUZpZWxkKCkgewotCQlGaWVsZEltcGwgZmllbGQgPSBuZXcgRmllbGRJbXBsKCk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQmxvY2sgY3JlYXRlQmxvY2soKSB7Ci0JCUJsb2NrSW1wbCBibG9jayA9IG5ldyBCbG9ja0ltcGwoKTsKLQkJcmV0dXJuIGJsb2NrOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb21tZW50IGNyZWF0ZUNvbW1lbnQoKSB7Ci0JCUNvbW1lbnRJbXBsIGNvbW1lbnQgPSBuZXcgQ29tbWVudEltcGwoKTsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0YXRlbWVudCBjcmVhdGVTdGF0ZW1lbnQoKSB7Ci0JCVN0YXRlbWVudEltcGwgc3RhdGVtZW50ID0gbmV3IFN0YXRlbWVudEltcGwoKTsKLQkJcmV0dXJuIHN0YXRlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSW5pdGlhbGl6ZXIgY3JlYXRlSW5pdGlhbGl6ZXIoKSB7Ci0JCUluaXRpYWxpemVySW1wbCBpbml0aWFsaXplciA9IG5ldyBJbml0aWFsaXplckltcGwoKTsKLQkJcmV0dXJuIGluaXRpYWxpemVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXIoKSB7Ci0JCUphdmFQYXJhbWV0ZXJJbXBsIGphdmFQYXJhbWV0ZXIgPSBuZXcgSmF2YVBhcmFtZXRlckltcGwoKTsKLQkJcmV0dXJuIGphdmFQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoKSB7Ci0JCUFycmF5VHlwZUltcGwgYXJyYXlUeXBlID0gbmV3IEFycmF5VHlwZUltcGwoKTsKLQkJcmV0dXJuIGFycmF5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgY3JlYXRlSlR5cGVKYXZhSGVscGVyc0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEpUeXBlSmF2YUhlbHBlcnNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgY3JlYXRlSlR5cGVMaXN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTGlzdClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKVHlwZUxpc3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFEYXRhVHlwZSBjcmVhdGVKYXZhRGF0YVR5cGUoKSB7Ci0JCUphdmFEYXRhVHlwZUltcGwgamF2YURhdGFUeXBlID0gbmV3IEphdmFEYXRhVHlwZUltcGwoKTsKLQkJcmV0dXJuIGphdmFEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgY3JlYXRlSmF2YVBhY2thZ2UoKSB7Ci0JCUphdmFQYWNrYWdlSW1wbCBqYXZhUGFja2FnZSA9IG5ldyBKYXZhUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGphdmFQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhUmVmUGFja2FnZSBnZXRKYXZhUmVmUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKYXZhUmVmUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZGYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNjcmVhdGVDbGFzc1JlZihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJSmF2YUNsYXNzIHJlZiA9IGNyZWF0ZUphdmFDbGFzcygpOwotCQlKYXZhVVJMIGphdmF1cmwgPSBuZXcgSmF2YVVSTCh0YXJnZXROYW1lKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpIHJlZikuZVNldFByb3h5VVJJKFVSSS5jcmVhdGVVUkkoamF2YXVybC5nZXRGdWxsU3RyaW5nKCkpKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0VHlwZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFRdWFsaWZpZWROYW1lLCBFT2JqZWN0IHJlbGF0ZWRPYmplY3QpIHsKLQkJUmVzb3VyY2UgciA9IHJlbGF0ZWRPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyICE9IG51bGwpIHsKLQkJCVJlc291cmNlU2V0IHJzID0gci5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJzICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVmbGVjdFR5cGUoYVF1YWxpZmllZE5hbWUsIHJzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0VHlwZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCWlmIChhUXVhbGlmaWVkTmFtZSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBhUXVhbGlmaWVkTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotCQkJaWYgKGluZGV4ID4gMCkKLQkJCQlyZXR1cm4gcmVmbGVjdFR5cGUoYVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSwgYVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgYVF1YWxpZmllZE5hbWUubGVuZ3RoKCkpLCBzZXQpOwotCQkJZWxzZQotCQkJCXJldHVybiByZWZsZWN0VHlwZSgiIiwgYVF1YWxpZmllZE5hbWUsIHNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVBhY2thZ2VOYW1lLCBTdHJpbmcgYVR5cGVOYW1lLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJaWYgKGFUeXBlTmFtZSAhPSBudWxsICYmIGFQYWNrYWdlTmFtZSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbml0LkphdmFJbml0LmluaXQoKTsKLQkJCUphdmFVUkwgdXJsID0gbmV3IEphdmFVUkwoYVBhY2thZ2VOYW1lLCBhVHlwZU5hbWUpOwotCQkJcmV0dXJuIChKYXZhSGVscGVycykgc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSh1cmwuZ2V0RnVsbFN0cmluZygpKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFBhY2thZ2UoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSByZWZsZWN0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JCQlKYXZhVVJMIHVybCA9IG5ldyBKYXZhVVJMKHBhY2thZ2VOYW1lLCBKYXZhUGFja2FnZS5QQUNLQUdFX0lEKTsKLQkJCXJldHVybiAoSmF2YVBhY2thZ2UpIHNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkodXJsLmdldEZ1bGxTdHJpbmcoKSksIHRydWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWZmMDViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUmVmUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzIgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5UeXBlS2luZDsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIEphdmFSZWZQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEphdmFSZWZQYWNrYWdlLCBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVJlZlBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFDbGFzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbml0aWFsaXplckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqYXZhUGFyYW1ldGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmaWVsZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBibG9ja0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21tZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHN0YXRlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqYXZhUGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqYXZhRGF0YVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXJyYXlUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFFdmVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHR5cGVLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBqYXZhVmlzaWJpbGl0eUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGphdmFQYXJhbWV0ZXJLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgalR5cGVKYXZhSGVscGVyc0VEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqVHlwZUxpc3RFRGF0YVR5cGUgPSBudWxsOwotCi0JCSAgIC8qKgotCQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkJICovCi0JcHJpdmF0ZSBKYXZhUmVmUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhUmVmUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlKYXZhUmVmUGFja2FnZUltcGwgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFSZWZQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEphdmFSZWZQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUphdmFSZWZQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSmF2YVJlZlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSmF2YVJlZlBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUphdmFSZWZQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gamF2YUNsYXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFDbGFzc19LaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX1B1YmxpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFDbGFzc19GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19DbGFzc0ltcG9ydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19QYWNrYWdlSW1wb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19GaWVsZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19Jbml0aWFsaXplcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRXZlbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19BbGxFdmVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGaWVsZCgpIHsKLQkJcmV0dXJuIGZpZWxkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX0ZpbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZF9TdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX0phdmFWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZF9UcmFuc2llbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX1ZvbGF0aWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWVsZF9KYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpZWxkX0luaXRpYWxpemVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfTmF0aXZlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9TdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RfUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhRXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YVBhcmFtZXRlcigpIHsKLQkJcmV0dXJuIGphdmFQYXJhbWV0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YVBhcmFtZXRlcl9GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnJheVR5cGUoKSB7Ci0JCXJldHVybiBhcnJheVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFycmF5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFycmF5VHlwZV9Db21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXJyYXlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhRGF0YVR5cGUoKSB7Ci0JCXJldHVybiBqYXZhRGF0YVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhRXZlbnQoKSB7Ci0JCXJldHVybiBqYXZhRXZlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIGphdmFQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YVBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJsb2NrKCkgewotCQlyZXR1cm4gYmxvY2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmxvY2tfU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCbG9ja19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCbG9ja19Db250ZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWJsb2NrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIHN0YXRlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdGlhbGl6ZXJfSXNTdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluaXRpYWxpemVyX0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluaXRpYWxpemVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5pdGlhbGl6ZXJfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCkgewotCQlyZXR1cm4gamF2YVZpc2liaWxpdHlLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldEphdmFQYXJhbWV0ZXJLaW5kKCkgewotCQlyZXR1cm4gamF2YVBhcmFtZXRlcktpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHlwZUtpbmQoKSB7Ci0JCXJldHVybiB0eXBlS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SlR5cGVMaXN0KCkgewotCQlyZXR1cm4galR5cGVMaXN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SlR5cGVKYXZhSGVscGVycygpIHsKLQkJcmV0dXJuIGpUeXBlSmF2YUhlbHBlcnNFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFSZWZGYWN0b3J5IGdldEphdmFSZWZGYWN0b3J5KCkgewotCQlyZXR1cm4gKEphdmFSZWZGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWphdmFDbGFzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0tJTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fUFVCTElDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0ZJTkFMKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0ZJRUxEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19NRVRIT0RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fRVZFTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFMpOwotCi0JCWluaXRpYWxpemVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRJQUxJWkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX0lTX1NUQVRJQyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5pdGlhbGl6ZXJFQ2xhc3MsIElOSVRJQUxJWkVSX19KQVZBX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX1NPVVJDRSk7Ci0KLQkJamF2YVBhcmFtZXRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX1BBUkFNRVRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoamF2YVBhcmFtZXRlckVDbGFzcywgSkFWQV9QQVJBTUVURVJfX0ZJTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhUGFyYW1ldGVyRUNsYXNzLCBKQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQpOwotCi0JCW1ldGhvZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19BQlNUUkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX05BVElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NZTkNIUk9OSVpFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX0ZJTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fQ09OU1RSVUNUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19TVEFUSUMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19QQVJBTUVURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fSkFWQV9FWENFUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fSkFWQV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NPVVJDRSk7Ci0KLQkJZmllbGRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklFTEQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fRklOQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fU1RBVElDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWVsZEVDbGFzcywgRklFTERfX0pBVkFfVklTSUJJTElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmllbGRFQ2xhc3MsIEZJRUxEX19UUkFOU0lFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fVk9MQVRJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpZWxkRUNsYXNzLCBGSUVMRF9fSkFWQV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmllbGRFQ2xhc3MsIEZJRUxEX19JTklUSUFMSVpFUik7Ci0KLQkJYmxvY2tFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQkxPQ0spOwotCQljcmVhdGVFQXR0cmlidXRlKGJsb2NrRUNsYXNzLCBCTE9DS19fU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShibG9ja0VDbGFzcywgQkxPQ0tfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJsb2NrRUNsYXNzLCBCTE9DS19fQ09OVEVOVFMpOwotCi0JCWNvbW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NTUVOVCk7Ci0KLQkJc3RhdGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQVRFTUVOVCk7Ci0KLQkJamF2YVBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhUGFja2FnZUVDbGFzcywgSkFWQV9QQUNLQUdFX19KQVZBX0NMQVNTRVMpOwotCi0JCWphdmFEYXRhVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0RBVEFfVFlQRSk7Ci0KLQkJYXJyYXlUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSUkFZX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFycmF5VHlwZUVDbGFzcywgQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXJyYXlUeXBlRUNsYXNzLCBBUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSk7Ci0KLQkJamF2YUV2ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfRVZFTlQpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl0eXBlS2luZEVFbnVtID0gY3JlYXRlRUVudW0oVFlQRV9LSU5EKTsKLQkJamF2YVZpc2liaWxpdHlLaW5kRUVudW0gPSBjcmVhdGVFRW51bShKQVZBX1ZJU0lCSUxJVFlfS0lORCk7Ci0JCWphdmFQYXJhbWV0ZXJLaW5kRUVudW0gPSBjcmVhdGVFRW51bShKQVZBX1BBUkFNRVRFUl9LSU5EKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlqVHlwZUphdmFIZWxwZXJzRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpUWVBFX0pBVkFfSEVMUEVSUyk7Ci0JCWpUeXBlTGlzdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShKVFlQRV9MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlSW1wbCB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVDbGFzcygpKTsKLQkJamF2YVBhcmFtZXRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RVBhcmFtZXRlcigpKTsKLQkJbWV0aG9kRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFT3BlcmF0aW9uKCkpOwotCQlmaWVsZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RVR5cGVkRWxlbWVudCgpKTsKLQkJY29tbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJsb2NrKCkpOwotCQlzdGF0ZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCbG9jaygpKTsKLQkJamF2YVBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVQYWNrYWdlKCkpOwotCQlqYXZhRGF0YVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVDbGFzcygpKTsKLQkJYXJyYXlUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUNsYXNzKCkpOwotCQlqYXZhRXZlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGphdmFDbGFzc0VDbGFzcywgSmF2YUNsYXNzLmNsYXNzLCAiSmF2YUNsYXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhQ2xhc3NfS2luZCgpLCB0aGlzLmdldFR5cGVLaW5kKCksICJraW5kIiwgbnVsbCwgMCwgMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhQ2xhc3NfUHVibGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicHVibGljIiwgbnVsbCwgMCwgMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhQ2xhc3NfRmluYWwoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJmaW5hbCIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0ltcGxlbWVudHNJbnRlcmZhY2VzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJpbXBsZW1lbnRzSW50ZXJmYWNlcyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19DbGFzc0ltcG9ydCgpLCB0aGlzLmdldEphdmFDbGFzcygpLCBudWxsLCAiY2xhc3NJbXBvcnQiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfUGFja2FnZUltcG9ydHMoKSwgdGhpcy5nZXRKYXZhUGFja2FnZSgpLCBudWxsLCAicGFja2FnZUltcG9ydHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfRmllbGRzKCksIHRoaXMuZ2V0RmllbGQoKSwgdGhpcy5nZXRGaWVsZF9KYXZhQ2xhc3MoKSwgImZpZWxkcyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19NZXRob2RzKCksIHRoaXMuZ2V0TWV0aG9kKCksIHRoaXMuZ2V0TWV0aG9kX0phdmFDbGFzcygpLCAibWV0aG9kcyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19Jbml0aWFsaXplcnMoKSwgdGhpcy5nZXRJbml0aWFsaXplcigpLCB0aGlzLmdldEluaXRpYWxpemVyX0phdmFDbGFzcygpLCAiaW5pdGlhbGl6ZXJzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19EZWNsYXJpbmdDbGFzcygpLCAiZGVjbGFyZWRDbGFzc2VzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0RlY2xhcmluZ0NsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpLCAiZGVjbGFyaW5nQ2xhc3MiLCBudWxsLCAwLCAxLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpLCB0aGlzLmdldEphdmFQYWNrYWdlKCksIHRoaXMuZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKSwgImphdmFQYWNrYWdlIiwgbnVsbCwgMCwgMSwgSmF2YUNsYXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19FdmVudHMoKSwgdGhpcy5nZXRKYXZhRXZlbnQoKSwgbnVsbCwgImV2ZW50cyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19BbGxFdmVudHMoKSwgdGhpcy5nZXRKYXZhRXZlbnQoKSwgbnVsbCwgImFsbEV2ZW50cyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzTmVzdGVkIik7Ci0KLQkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEZpZWxkKCksICJnZXRGaWVsZCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIik7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRGaWVsZCgpLCAiZ2V0RmllbGRFeHRlbmRlZCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIik7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRGaWVsZCgpLCAiZ2V0RmllbGROYW1lZCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRGaWVsZHNFeHRlbmRlZCIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0TWV0aG9kKCksICJnZXRNZXRob2QiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZE5hbWUiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKVHlwZUxpc3QoKSwgInBhcmFtZXRlclR5cGVzIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0TWV0aG9kKCksICJnZXRNZXRob2RFeHRlbmRlZCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWV0aG9kTmFtZSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAicGFyYW1ldGVyVHlwZXMiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldE1ldGhvZHNFeHRlbmRlZCIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRPbmx5U3BlY2lmaWNNZXRob2RzIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhTWV0aG9kTmFtZVByZWZpeCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZXhjbHVkZWROYW1lcyIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0TWV0aG9kKCksICJnZXRQdWJsaWNNZXRob2QiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZE5hbWUiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKVHlwZUxpc3QoKSwgInBhcmFtZXRlclR5cGVzIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRQdWJsaWNNZXRob2RzIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQiKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZ2V0UHVibGljTWV0aG9kc05hbWVkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJnZXRTdXBlcnR5cGUiKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImltcGxlbWVudHNJbnRlcmZhY2UiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImludGVyZmFjZVR5cGUiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImluZm9TdHJpbmciKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImluaGVyaXRzRnJvbSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEphdmFDbGFzcygpLCAiamF2YUNsYXNzIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNFeGlzdGluZ1R5cGUiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0ludGVyZmFjZSIpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIG51bGwsICJzZXRTdXBlcnR5cGUiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImphdmFjbGFzcyIpOwotCi0JCWluaXRFQ2xhc3MoaW5pdGlhbGl6ZXJFQ2xhc3MsIEluaXRpYWxpemVyLmNsYXNzLCAiSW5pdGlhbGl6ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRpYWxpemVyX0lzU3RhdGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLCAiaXNTdGF0aWMiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdGlhbGl6ZXJfSmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgSW5pdGlhbGl6ZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluaXRpYWxpemVyX1NvdXJjZSgpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJzb3VyY2UiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhUGFyYW1ldGVyX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBKYXZhUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKSwgdGhpcy5nZXRKYXZhUGFyYW1ldGVyS2luZCgpLCAicGFyYW1ldGVyS2luZCIsIG51bGwsIDAsIDEsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihqYXZhUGFyYW1ldGVyRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzQXJyYXkiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNSZXR1cm4iKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0SmF2YVR5cGUiKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRRdWFsaWZpZWROYW1lIik7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RFQ2xhc3MsIE1ldGhvZC5jbGFzcywgIk1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX0Fic3RyYWN0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYWJzdHJhY3QiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZF9OYXRpdmUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJuYXRpdmUiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZF9TeW5jaHJvbml6ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzeW5jaHJvbml6ZWQiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZF9GaW5hbCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpbmFsIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfQ29uc3RydWN0b3IoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJjb25zdHJ1Y3RvciIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX1N0YXRpYygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN0YXRpYyIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX0phdmFWaXNpYmlsaXR5KCksIHRoaXMuZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCksICJqYXZhVmlzaWJpbGl0eSIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kX1BhcmFtZXRlcnMoKSwgdGhpcy5nZXRKYXZhUGFyYW1ldGVyKCksIG51bGwsICJwYXJhbWV0ZXJzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kX0phdmFFeGNlcHRpb25zKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJqYXZhRXhjZXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZF9KYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfTWV0aG9kcygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfU291cmNlKCksIHRoaXMuZ2V0QmxvY2soKSwgbnVsbCwgInNvdXJjZSIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiKTsKLQotCQlhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUiKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCB0aGlzLmdldEphdmFQYXJhbWV0ZXIoKSwgImdldFBhcmFtZXRlciIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1ldGVyTmFtZSIpOwotCi0JCWFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCB0aGlzLmdldEpUeXBlSmF2YUhlbHBlcnMoKSwgImdldFJldHVyblR5cGUiKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCBudWxsLCAic2V0UmV0dXJuVHlwZSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlSmF2YUhlbHBlcnMoKSwgInR5cGUiKTsKLQotCQlhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFNpZ25hdHVyZSIpOwotCi0JCWFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzR2VuZXJhdGVkIik7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgbnVsbCwgInNldElzR2VuZXJhdGVkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVkIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNWb2lkIik7Ci0KLQkJaW5pdEVDbGFzcyhmaWVsZEVDbGFzcywgRmllbGQuY2xhc3MsICJGaWVsZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmllbGRfRmluYWwoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJmaW5hbCIsIG51bGwsIDAsIDEsIEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9TdGF0aWMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzdGF0aWMiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmllbGRfSmF2YVZpc2liaWxpdHkoKSwgdGhpcy5nZXRKYXZhVmlzaWJpbGl0eUtpbmQoKSwgImphdmFWaXNpYmlsaXR5IiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1RyYW5zaWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInRyYW5zaWVudCIsIG51bGwsIDAsIDEsIEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9Wb2xhdGlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInZvbGF0aWxlIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpZWxkX0phdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19GaWVsZHMoKSwgImphdmFDbGFzcyIsIG51bGwsIDAsIDEsIEZpZWxkLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWVsZF9Jbml0aWFsaXplcigpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJpbml0aWFsaXplciIsIG51bGwsIDAsIDEsIEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWFkZEVPcGVyYXRpb24oZmllbGRFQ2xhc3MsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJnZXRDb250YWluaW5nSmF2YUNsYXNzIik7Ci0KLQkJYWRkRU9wZXJhdGlvbihmaWVsZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0FycmF5Iik7Ci0KLQkJaW5pdEVDbGFzcyhibG9ja0VDbGFzcywgQmxvY2suY2xhc3MsICJCbG9jayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmxvY2tfU291cmNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb3VyY2UiLCBudWxsLCAwLCAxLCBCbG9jay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmxvY2tfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEJsb2NrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRCbG9ja19Db250ZW50cygpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJjb250ZW50cyIsIG51bGwsIDAsIC0xLCBCbG9jay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbW1lbnRFQ2xhc3MsIENvbW1lbnQuY2xhc3MsICJDb21tZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moc3RhdGVtZW50RUNsYXNzLCBTdGF0ZW1lbnQuY2xhc3MsICJTdGF0ZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhUGFja2FnZUVDbGFzcywgSmF2YVBhY2thZ2UuY2xhc3MsICJKYXZhUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKSwgImphdmFDbGFzc2VzIiwgbnVsbCwgMCwgLTEsIEphdmFQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhRGF0YVR5cGVFQ2xhc3MsIEphdmFEYXRhVHlwZS5jbGFzcywgIkphdmFEYXRhVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlhZGRFT3BlcmF0aW9uKGphdmFEYXRhVHlwZUVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldERlZmF1bHRWYWx1ZVN0cmluZyIpOwotCi0JCWluaXRFQ2xhc3MoYXJyYXlUeXBlRUNsYXNzLCBBcnJheVR5cGUuY2xhc3MsICJBcnJheVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFycmF5VHlwZV9BcnJheURpbWVuc2lvbnMoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgImFycmF5RGltZW5zaW9ucyIsIG51bGwsIDAsIDEsIEFycmF5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXJyYXlUeXBlX0NvbXBvbmVudFR5cGUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVDbGFzc2lmaWVyKCksIG51bGwsICJjb21wb25lbnRUeXBlIiwgbnVsbCwgMSwgMSwgQXJyYXlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWFkZEVPcGVyYXRpb24oYXJyYXlUeXBlRUNsYXNzLCB0aGlzLmdldEpUeXBlSmF2YUhlbHBlcnMoKSwgImdldEZpbmFsQ29tcG9uZW50VHlwZSIpOwotCi0JCWFkZEVPcGVyYXRpb24oYXJyYXlUeXBlRUNsYXNzLCB0aGlzLmdldEpUeXBlSmF2YUhlbHBlcnMoKSwgImdldENvbXBvbmVudFR5cGVBc0hlbHBlciIpOwotCi0JCWFkZEVPcGVyYXRpb24oYXJyYXlUeXBlRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzUHJpbWl0aXZlQXJyYXkiKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oYXJyYXlUeXBlRUNsYXNzLCBudWxsLCAic2V0Q29tcG9uZW50VHlwZSIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlSmF2YUhlbHBlcnMoKSwgImhlbHBlckNvbXBvbmVudFR5cGUiKTsKLQotCQlpbml0RUNsYXNzKGphdmFFdmVudEVDbGFzcywgSmF2YUV2ZW50LmNsYXNzLCAiSmF2YUV2ZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHR5cGVLaW5kRUVudW0sIFR5cGVLaW5kLmNsYXNzLCAiVHlwZUtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHR5cGVLaW5kRUVudW0sIFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHR5cGVLaW5kRUVudW0sIFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuSU5URVJGQUNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuRVhDRVBUSU9OX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShqYXZhVmlzaWJpbGl0eUtpbmRFRW51bSwgSmF2YVZpc2liaWxpdHlLaW5kLmNsYXNzLCAiSmF2YVZpc2liaWxpdHlLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhVmlzaWJpbGl0eUtpbmRFRW51bSwgSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuUFJJVkFURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuUFJPVEVDVEVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShqYXZhUGFyYW1ldGVyS2luZEVFbnVtLCBKYXZhUGFyYW1ldGVyS2luZC5jbGFzcywgIkphdmFQYXJhbWV0ZXJLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhUGFyYW1ldGVyS2luZEVFbnVtLCBKYXZhUGFyYW1ldGVyS2luZC5JTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLk9VVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLklOT1VUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuUkVUVVJOX0xJVEVSQUwpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGpUeXBlSmF2YUhlbHBlcnNFRGF0YVR5cGUsIEphdmFIZWxwZXJzLmNsYXNzLCAiSlR5cGVKYXZhSGVscGVycyIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFRGF0YVR5cGUoalR5cGVMaXN0RURhdGFUeXBlLCBMaXN0LmNsYXNzLCAiSlR5cGVMaXN0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vSmF2YVJlZlBhY2thZ2VJbXBsCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvTWV0aG9kSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL01ldGhvZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4NmNiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvTWV0aG9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IE1ldGhvZEltcGwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOS8xNSAyMDoyODowMyAkIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5CbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kSW1wbCBleHRlbmRzIEVPcGVyYXRpb25JbXBsIGltcGxlbWVudHMgTWV0aG9kIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgc2lnbmF0dXJlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWJzdHJhY3QoKSA8ZW0+QWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBQlNUUkFDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBYnN0cmFjdCgpIDxlbT5BYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmF0aXZlKCkgPGVtPk5hdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOYXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBOQVRJVkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmF0aXZlKCkgPGVtPk5hdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOYXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5BVElWRV9FRkxBRyA9IDEgPDwgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTeW5jaHJvbml6ZWQoKSA8ZW0+U3luY2hyb25pemVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N5bmNocm9uaXplZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNZTkNIUk9OSVpFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTeW5jaHJvbml6ZWQoKSA8ZW0+U3luY2hyb25pemVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N5bmNocm9uaXplZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1lOQ0hST05JWkVEX0VGTEFHID0gMSA8PCAxMjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklOQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0VGTEFHID0gMSA8PCAxMzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbnN0cnVjdG9yKCkgPGVtPkNvbnN0cnVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbnN0cnVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09OU1RSVUNUT1JfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uc3RydWN0b3IoKSA8ZW0+Q29uc3RydWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ29uc3RydWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTlNUUlVDVE9SX0VGTEFHID0gMSA8PCAxNDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0YXRpYygpIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1RBVElDX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0YXRpYygpIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfRUZMQUcgPSAxIDw8IDE1OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFWaXNpYmlsaXR5KCkgPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YVZpc2liaWxpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCA9IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTDsKLQotCXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gaXNHZW5lcmF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhVmlzaWJpbGl0eUtpbmQgamF2YVZpc2liaWxpdHkgPSBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXJzKCkgPGVtPlBhcmFtZXRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1ldGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBhcmFtZXRlcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YUV4Y2VwdGlvbnMoKSA8ZW0+SmF2YSBFeGNlcHRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFFeGNlcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgamF2YUV4Y2VwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmxvY2sgc291cmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBNZXRob2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3RHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiBuZXdBYnN0cmFjdCkgewotCQlib29sZWFuIG9sZEFic3RyYWN0ID0gKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3QWJzdHJhY3QpIGVGbGFncyB8PSBBQlNUUkFDVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkFCU1RSQUNUX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0FCU1RSQUNULCBvbGRBYnN0cmFjdCwgbmV3QWJzdHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZUdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmF0aXZlKGJvb2xlYW4gbmV3TmF0aXZlKSB7Ci0JCWJvb2xlYW4gb2xkTmF0aXZlID0gKGVGbGFncyAmIE5BVElWRV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld05hdGl2ZSkgZUZsYWdzIHw9IE5BVElWRV9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfk5BVElWRV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkUsIG9sZE5hdGl2ZSwgbmV3TmF0aXZlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgU1lOQ0hST05JWkVEX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplZChib29sZWFuIG5ld1N5bmNocm9uaXplZCkgewotCQlib29sZWFuIG9sZFN5bmNocm9uaXplZCA9IChlRmxhZ3MgJiBTWU5DSFJPTklaRURfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdTeW5jaHJvbml6ZWQpIGVGbGFncyB8PSBTWU5DSFJPTklaRURfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5TWU5DSFJPTklaRURfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1lOQ0hST05JWkVELCBvbGRTeW5jaHJvbml6ZWQsIG5ld1N5bmNocm9uaXplZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluYWxHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBuZXdGaW5hbCkgewotCQlib29sZWFuIG9sZEZpbmFsID0gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3RmluYWwpIGVGbGFncyB8PSBGSU5BTF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gfkZJTkFMX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0ZJTkFMLCBvbGRGaW5hbCwgbmV3RmluYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIENPTlNUUlVDVE9SX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gbmV3Q29uc3RydWN0b3IpIHsKLQkJYm9vbGVhbiBvbGRDb25zdHJ1Y3RvciA9IChlRmxhZ3MgJiBDT05TVFJVQ1RPUl9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0NvbnN0cnVjdG9yKSBlRmxhZ3MgfD0gQ09OU1RSVUNUT1JfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5DT05TVFJVQ1RPUl9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19DT05TVFJVQ1RPUiwgb2xkQ29uc3RydWN0b3IsIG5ld0NvbnN0cnVjdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWNHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXRpYyhib29sZWFuIG5ld1N0YXRpYykgewotCQlib29sZWFuIG9sZFN0YXRpYyA9IChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdTdGF0aWMpIGVGbGFncyB8PSBTVEFUSUNfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5TVEFUSUNfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDLCBvbGRTdGF0aWMsIG5ld1N0YXRpYykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgamF2YSBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4uCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgdG8gZW5zdXJlIHJlZmxlY3Rpb24gaXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc0Fic3RyYWN0R2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNDb25zdHJ1Y3RvckdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzRmluYWxHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNOYXRpdmVHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNTdGF0aWNHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0SmF2YUV4Y2VwdGlvbnMoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldEphdmFFeGNlcHRpb25zR2VuKCk7Ci0JfQotCi0JcHVibGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gZ2V0SmF2YVZpc2liaWxpdHlHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0UGFyYW1ldGVycygpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gZ2V0UGFyYW1ldGVyc0dlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQjZ2V0RVR5cGUoKQotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRFVHlwZSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdGhlIG1ldGhvZCBuYW1lIGFuZCBpdHMgcGFyYW1ldGVycy4gZS5nLiA8Y29kZT4gc2V0Rmlyc3ROYW1lKGphdmEubGFuZy5TdHJpbmcpIDwvL2NvZGU+IC4KLQkgKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig3NSk7Ci0JCXNiLmFwcGVuZChnZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoIigiKTsKLQkJTGlzdCBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7Ci0JCUphdmFQYXJhbWV0ZXIgcGFyYW07Ci0JCWludCBwYXJtU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0JCWludCBjb21tYVRlc3QgPSAwOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcm1TaXplOyBqKyspIHsKLQkJCWlmIChqID4gY29tbWFUZXN0KSB7Ci0JCQkJc2IuYXBwZW5kKCIsIik7Ci0JCQl9Ci0JCQlwYXJhbSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KGopOwotCQkJLy9GQiBpZiAocGFyYW0uaXNSZXR1cm4oKSkgewotCQkJLy9GQiBjb21tYVRlc3QgKys7Ci0JCQkvL0ZCIGNvbnRpbnVlOwotCQkJLy9GQiB9Ci0JCQlzYi5hcHBlbmQoKChKYXZhSGVscGVycykgcGFyYW0uZ2V0RVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlzYi5hcHBlbmQoIikiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLgotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW1ldGVyTmFtZSkgewotCQlMaXN0IHBhcm1zID0gZ2V0UGFyYW1ldGVycygpOwotCQlKYXZhUGFyYW1ldGVyIHBhcm07Ci0JCWludCBwYXJtU2l6ZSA9IHBhcm1zLnNpemUoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtU2l6ZTsgaisrKSB7Ci0JCQlwYXJtID0gKEphdmFQYXJhbWV0ZXIpIHBhcm1zLmdldChqKTsKLQkJCWlmIChwYXJtLmdldE5hbWUoKS5lcXVhbHMocGFyYW1ldGVyTmFtZSkpCi0JCQkJcmV0dXJuIHBhcm07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9SRUZMRUNURUQgPSAweDAsIFJFRkxFQ1RFRF9CQVNFID0gMHgxLCBSRUZMRUNURURfR0VORVJBVEVEID0gMHgyOwotCi0JcHJvdGVjdGVkIGludCByZWZsZWN0aW9uU3RhdHVzID0gTk9UX1JFRkxFQ1RFRDsKLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0JBU0UpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gcmVhZEFkYXB0b3IucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSBSRUZMRUNURURfQkFTRTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSByZWZsZWN0aW9uIGFkYXB0ZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUmVhZEFkYXB0b3IgZ2V0UmVhZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoUmVhZEFkYXB0b3IpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotCi0JLyoKLQkgKiBVc2VkIGJ5IHJlZmxlY3Rpb24gYWRhcHRlciB0byBjbGVhciB0aGUgcmVmbGVjdGlvbi4gVGhpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlZmxlY3RlZChib29sZWFuIHJlZmxlY3RlZCkgewotCQlpZiAoIXJlZmxlY3RlZCkKLQkJCXJlZmxlY3Rpb25TdGF0dXMgPSBOT1RfUkVGTEVDVEVEOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmV0dXJuIHR5cGUuCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIGdldFJldHVyblR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YUhlbHBlcnMpIGdldEVUeXBlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7Ci0JCWlmIChzaWduYXR1cmUgPT0gbnVsbCkKLQkJCXNpZ25hdHVyZSA9IGRvR2V0U2lnbmF0dXJlKCk7Ci0JCXJldHVybiBzaWduYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC50b1N0cmluZygpLgotCSAqIAotCSAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIE1ldGhvZC4gVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgdGhlIG1ldGhvZCBhY2Nlc3MgbW9kaWZpZXJzLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUsCi0JICogZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWV0aG9kLCBmb2xsb3dlZCBieSBhIHBlcmlvZCwgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCBuYW1lLCBmb2xsb3dlZCBieSBhCi0JICogcGFyZW50aGVzaXplZCwgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1ldGhvZCdzIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBtZXRob2QgdGhyb3dzIGNoZWNrZWQgZXhjZXB0aW9ucywgdGhlIHBhcmFtZXRlciBsaXN0IGlzCi0JICogZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIHdvcmQgdGhyb3dzIGZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRocm93biBleGNlcHRpb24gdHlwZXMuCi0JICogCi0JICogRm9yIGV4YW1wbGU6Ci0JICogCi0JICogcHVibGljIGJvb2xlYW4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKiAKLQkgKiBUaGUgYWNjZXNzIG1vZGlmaWVycyBhcmUgcGxhY2VkIGluIGNhbm9uaWNhbCBvcmRlciBhcyBzcGVjaWZpZWQgYnkgIlRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24iLiBUaGlzIGlzIHB1YmxpYywKLQkgKiA8dHQ+cHJvdGVjdGVkPC8vdHQ+IG9yIDx0dD5wcml2YXRlPC8vdHQ+IGZpcnN0LCBhbmQgdGhlbiBvdGhlciBtb2RpZmllcnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogPHR0PmFic3RyYWN0PC8vdHQ+LCA8dHQ+c3RhdGljPC8vdHQ+LCA8dHQ+ZmluYWw8Ly90dD4sIDx0dD5zeW5jaHJvbml6ZWQ8Ly90dD4gPHR0Pm5hdGl2ZTwvL3R0Pi4KLQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZG9HZXRTaWduYXR1cmUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChnZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQzoKLQkJCQlzYi5hcHBlbmQoIlB1YmxpYyAiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRDoKLQkJCQlzYi5hcHBlbmQoIlByb3RlY3RlZCAiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEU6Ci0JCQkJc2IuYXBwZW5kKCJQcml2YXRlICIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRToKLQkJCQlzYi5hcHBlbmQoIlBhY2thZ2UgIik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGlzQWJzdHJhY3QoKSkKLQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QgIik7Ci0JCWlmIChpc1N0YXRpYygpKQotCQkJc2IuYXBwZW5kKCJzdGF0aWMgIik7Ci0JCWlmIChpc0ZpbmFsKCkpCi0JCQlzYi5hcHBlbmQoImZpbmFsICIpOwotCQlpZiAoaXNTeW5jaHJvbml6ZWQoKSkKLQkJCXNiLmFwcGVuZCgic3luY2hyb25pemVkICIpOwotCQlpZiAoaXNOYXRpdmUoKSkKLQkJCXNiLmFwcGVuZCgibmF0aXZlICIpOwotCQlpZiAoaXNWb2lkKCkpCi0JCQlzYi5hcHBlbmQoInZvaWQgIik7Ci0JCWVsc2UKLQkJCXNiLmFwcGVuZChnZXRSZXR1cm5UeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIiAiKTsKLQkJc2IuYXBwZW5kKGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpICsgIi4iKTsKLQkJc2IuYXBwZW5kKGdldE5hbWUoKSArICIoIik7Ci0JCUxpc3QgcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOwotCQlKYXZhUGFyYW1ldGVyIHBhcmFtOwotCQlpbnQgcGFybVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcm1TaXplOyBqKyspIHsKLQkJCXBhcmFtID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoaik7Ci0JCQkvL0ZCIGlmIChwYXJhbS5pc1JldHVybigpKQotCQkJLy9GQiBjb250aW51ZTsgLy8gbGlzdFBhcmFtZXRlcnMoKSBpbmNsdWRlcyByZXR1cm4gdHlwZSBpbiBhcnJheQotCQkJc2IuYXBwZW5kKCgoSmF2YUhlbHBlcnMpIHBhcmFtLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQlpZiAoaiA8IChwYXJhbXMuc2l6ZSgpIC0gMSkpIHsKLQkJCQlzYi5hcHBlbmQoIiwiKTsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoIikiKTsKLQkJTGlzdCBleGNlcHRpb25zID0gZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJSmF2YUNsYXNzIGV4Y2VwdGlvbjsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJc2IuYXBwZW5kKCIgdGhyb3dzICIpOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBleGNlcHRpb25zLnNpemUoKTsgaysrKSB7Ci0JCQkJZXhjZXB0aW9uID0gKEphdmFDbGFzcykgZXhjZXB0aW9ucy5nZXQoayk7Ci0JCQkJc2IuYXBwZW5kKGV4Y2VwdGlvbi5nZXRKYXZhTmFtZSgpKTsKLQkJCQlpZiAoayA8IChleGNlcHRpb25zLnNpemUoKSAtIDEpKSB7Ci0JCQkJCXNiLmFwcGVuZCgiLCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0R2VuZXJhdGVkKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9HRU5FUkFURUQpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gKChJSmF2YU1ldGhvZEFkYXB0ZXIpIHJlYWRBZGFwdG9yKS5yZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IChSRUZMRUNURURfR0VORVJBVEVEIHwgUkVGTEVDVEVEX0JBU0UpOyAvLyBXZSBjYW4gYmUgY2VydGFpbiBiYXNlIHdpbGwgYmUgZG9uZSBieSByZWZsZWN0IGdlbmVyYXRlZCBpZiBub3QgYWxyZWFkeQotCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZG9uZS4KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHN5c3RlbSBnZW5lcmF0ZWQuIFRoaXMgaXMgdXN1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSAiZ2VuZXJhdGVkIiB0YWcgaW4gdGhlIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZWQoKSB7Ci0JCXJlZmxlY3RHZW5lcmF0ZWQoKTsKLQkJcmV0dXJuIGlzR2VuZXJhdGVkOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVkR2VuKCkgewotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIGEgdm9pZCByZXR1cm4gdHlwZSBtZXRob2QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWb2lkKCkgewotCQkvL0ZCIHJldHVybiAoZ2V0UmV0dXJuUGFyYW1ldGVyKCkgPT0gbnVsbCB8fCAidm9pZCIuZXF1YWxzKGdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpKTsKLQkJcmV0dXJuIChnZXRSZXR1cm5UeXBlKCkgPT0gbnVsbCB8fCAidm9pZCIuZXF1YWxzKGdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBhcmFtZXRlcltdIGxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpIHsKLQkJQ29sbGVjdGlvbiB2ID0gZ2V0UGFyYW1ldGVycygpOwotCQlKYXZhUGFyYW1ldGVyW10gcmVzdWx0ID0gbmV3IEphdmFQYXJhbWV0ZXJbdi5zaXplKCldOwotCQl2LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZUNvbnRlbnRzKCkgewotCQlFTGlzdCByZXN1bHRzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJcmVzdWx0cy5hZGRBbGwoZ2V0UGFyYW1ldGVyc0dlbigpKTsgLy9GQgotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlzR2VuZXJhdGVkIGZsYWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNHZW5lcmF0ZWQoYm9vbGVhbiBnZW5lcmF0ZWQpIHsKLQkJaXNHZW5lcmF0ZWQgPSBnZW5lcmF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZXR1cm4gdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoSmF2YUhlbHBlcnMgdHlwZSkgewotCQl0aGlzLnNldEVUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHlHZW4oKSB7Ci0JCXJldHVybiBqYXZhVmlzaWJpbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQgbmV3SmF2YVZpc2liaWxpdHkpIHsKLQkJSmF2YVZpc2liaWxpdHlLaW5kIG9sZEphdmFWaXNpYmlsaXR5ID0gamF2YVZpc2liaWxpdHk7Ci0JCWphdmFWaXNpYmlsaXR5ID0gbmV3SmF2YVZpc2liaWxpdHkgPT0gbnVsbCA/IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCA6IG5ld0phdmFWaXNpYmlsaXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfVklTSUJJTElUWSwgb2xkSmF2YVZpc2liaWxpdHksIGphdmFWaXNpYmlsaXR5KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUykgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSmF2YUNsYXNzKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YUNsYXNzKEphdmFDbGFzcyBuZXdKYXZhQ2xhc3MpIHsKLQkJaWYgKG5ld0phdmFDbGFzcyAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUyAmJiBuZXdKYXZhQ2xhc3MgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdKYXZhQ2xhc3MpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0phdmFDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTLCBuZXdKYXZhQ2xhc3MsIG5ld0phdmFDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBCbG9jayBnZXRTb3VyY2UoKSB7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UuZUlzUHJveHkoKSkgewotCQkJQmxvY2sgb2xkU291cmNlID0gc291cmNlOwotCQkJc291cmNlID0gKEJsb2NrKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClzb3VyY2UpOwotCQkJaWYgKHNvdXJjZSAhPSBvbGRTb3VyY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCbG9jayBiYXNpY0dldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoQmxvY2sgbmV3U291cmNlKSB7Ci0JCUJsb2NrIG9sZFNvdXJjZSA9IHNvdXJjZTsKLQkJc291cmNlID0gbmV3U291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VBTk5PVEFUSU9OUzoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWVBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX09SREVSRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgT1JERVJFRF9FRkxBRykgIT0gMCkgIT0gT1JERVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19VTklRVUU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVU5JUVVFX0VGTEFHKSAhPSAwKSAhPSBVTklRVUVfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTE9XRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIGxvd2VyQm91bmQgIT0gTE9XRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgIT0gTUFOWV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VUWVBFOgotCQkJCXJldHVybiBlVHlwZSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZVBhcmFtZXRlcnMgIT0gbnVsbCAmJiAhZVBhcmFtZXRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VFWENFUFRJT05TOgotCQkJCXJldHVybiBlRXhjZXB0aW9ucyAhPSBudWxsICYmICFlRXhjZXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BVElWRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDApICE9IE5BVElWRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU1lOQ0hST05JWkVEX0VGTEFHKSAhPSAwKSAhPSBTWU5DSFJPTklaRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApICE9IEZJTkFMX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXJldHVybiAoKGVGbGFncyAmIENPTlNUUlVDVE9SX0VGTEFHKSAhPSAwKSAhPSBDT05TVFJVQ1RPUl9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TVEFUSUM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKSAhPSBTVEFUSUNfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBqYXZhVmlzaWJpbGl0eSAhPSBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gcGFyYW1ldGVycyAhPSBudWxsICYmICFwYXJhbWV0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0VYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGphdmFFeGNlcHRpb25zICE9IG51bGwgJiYgIWphdmFFeGNlcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRToKLQkJCQlyZXR1cm4gc291cmNlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fVVBQRVJfQk9VTkQ6Ci0JCQkJc2V0VXBwZXJCb3VuZCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FUEFSQU1FVEVSUzoKLQkJCQlnZXRFUGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVBhcmFtZXRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FRVhDRVBUSU9OUzoKLQkJCQlnZXRFRXhjZXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUV4Y2VwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlzZXRBYnN0cmFjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFUSVZFOgotCQkJCXNldE5hdGl2ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1lOQ0hST05JWkVEOgotCQkJCXNldFN5bmNocm9uaXplZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXNldENvbnN0cnVjdG9yKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TVEFUSUM6Ci0JCQkJc2V0U3RhdGljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoKEphdmFWaXNpYmlsaXR5S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUzoKLQkJCQlnZXRKYXZhRXhjZXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SmF2YUV4Y2VwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKE9SREVSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKFVOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoTE9XRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRVRZUEU6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FUEFSQU1FVEVSUzoKLQkJCQlnZXRFUGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VFWENFUFRJT05TOgotCQkJCWdldEVFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQUJTVFJBQ1Q6Ci0JCQkJc2V0QWJzdHJhY3QoQUJTVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJc2V0TmF0aXZlKE5BVElWRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NZTkNIUk9OSVpFRDoKLQkJCQlzZXRTeW5jaHJvbml6ZWQoU1lOQ0hST05JWkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJc2V0RmluYWwoRklOQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19DT05TVFJVQ1RPUjoKLQkJCQlzZXRDb25zdHJ1Y3RvcihDT05TVFJVQ1RPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQzoKLQkJCQlzZXRTdGF0aWMoU1RBVElDX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXNldEphdmFWaXNpYmlsaXR5KEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUzoKLQkJCQlnZXRKYXZhRXhjZXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKEJsb2NrKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWJzdHJhY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmF0aXZlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgTkFUSVZFX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzeW5jaHJvbml6ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBTWU5DSFJPTklaRURfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnN0cnVjdG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgQ09OU1RSVUNUT1JfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXRpYzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF2YVZpc2liaWxpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGphdmFWaXNpYmlsaXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBhcmFtZXRlcnNHZW4oKSB7Ci0JCWlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKLQkJCXBhcmFtZXRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSmF2YVBhcmFtZXRlci5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19QQVJBTUVURVJTKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SmF2YUV4Y2VwdGlvbnNHZW4oKSB7Ci0JCWlmIChqYXZhRXhjZXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlqYXZhRXhjZXB0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoSmF2YUNsYXNzLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGphdmFFeGNlcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FQ09OVEFJTklOR19DTEFTUywgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VQQVJBTUVURVJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVQYXJhbWV0ZXJzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VBTk5PVEFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VDT05UQUlOSU5HX0NMQVNTLCBtc2dzKTsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRVBBUkFNRVRFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVBhcmFtZXRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19QQVJBTUVURVJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBhcmFtZXRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlMsIEVDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fT1JERVJFRDoKLQkJCQlyZXR1cm4gaXNPcmRlcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1VOSVFVRToKLQkJCQlyZXR1cm4gaXNVbmlxdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTE9XRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldExvd2VyQm91bmQoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFVwcGVyQm91bmQoKSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VUWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFVHlwZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRVBBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIGdldEVQYXJhbWV0ZXJzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRUVYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVFeGNlcHRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFUSVZFOgotCQkJCXJldHVybiBpc05hdGl2ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQ6Ci0JCQkJcmV0dXJuIGlzU3luY2hyb25pemVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0ZJTkFMOgotCQkJCXJldHVybiBpc0ZpbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXJldHVybiBpc0NvbnN0cnVjdG9yKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQzoKLQkJCQlyZXR1cm4gaXNTdGF0aWMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBnZXRKYXZhVmlzaWJpbGl0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIGdldFBhcmFtZXRlcnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0VYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGdldEphdmFFeGNlcHRpb25zKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1N0YXRlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9TdGF0ZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYTM5MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1N0YXRlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBTdGF0ZW1lbnRJbXBsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDUvMDkvMTQgMjM6MzA6MzIgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLlN0YXRlbWVudDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RhdGVtZW50SW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIFN0YXRlbWVudHsKLQotCXByb3RlY3RlZCBTdGF0ZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdGF0ZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fQ09OVEVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX0NPTlRFTlRTOgotCQkJCXJldHVybiBnZXRDb250ZW50cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX0NPTlRFTlRTOgotCQkJCWdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKFNPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX1NPVVJDRToKLQkJCQlyZXR1cm4gU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2UgIT0gbnVsbCA6ICFTT1VSQ0VfRURFRkFVTFQuZXF1YWxzKHNvdXJjZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlNUQVRFTUVOVF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlRfX0NPTlRFTlRTOgotCQkJCXJldHVybiBjb250ZW50cyAhPSBudWxsICYmICFjb250ZW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9VUkwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9VUkwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2ZmViZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvVVJMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotICogICRSQ1NmaWxlOiBVUkwuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8wOS8xNCAyMzozMDozMiAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFVSTCB7Ci0JcHVibGljIFN0cmluZyBuYW1lc3BhY2VOYW1lOwotCXB1YmxpYyBTdHJpbmcgSUQ7Ci0JTGlzdCBhdHRyaWJ1dGVOYW1lczsKLS8qKgotICogVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBVUkwoU3RyaW5nIHVybFN0cmluZykgewotCWluaXRpYWxpemVGcm9tU3RyaW5nKHVybFN0cmluZyk7Ci19Ci0vKioKLSAqIFVSTCBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgVVJMKFN0cmluZyBuYW1lU3BhY2VOYW1lLCBTdHJpbmcgYW5JRCkgewotCXRoaXMubmFtZXNwYWNlTmFtZSA9IG5hbWVTcGFjZU5hbWU7Ci0JdGhpcy5JRCA9IGFuSUQ7Ci19Ci1wdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKLQlyZXR1cm4gYXR0cmlidXRlTmFtZXM7Ci19Ci1wdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVN0cmluZyhTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JaW50IHBvdW5kSW54ID0gdXJsU3RyaW5nLmxhc3RJbmRleE9mKCcjJyk7Ci0JaWYgKHBvdW5kSW54ID4gLTEpIHsKLQkJbmFtZXNwYWNlTmFtZSA9IHVybFN0cmluZy5zdWJzdHJpbmcoMCwgcG91bmRJbngpOwotCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKHBvdW5kSW54ICsgMSk7Ci0JCWludCBkb3RJbmRleCA9IHVybFN0cmluZy5pbmRleE9mKCItPiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkb3RJbmRleCA+IC0xKSB7Ci0JCQlJRCA9IHVybFN0cmluZy5zdWJzdHJpbmcoMCwgZG90SW5kZXgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWVTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKGRvdEluZGV4ICsgMik7Ci0JCQlhdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWRvIHsKLQkJCQlkb3RJbmRleCA9IGF0dHJpYnV0ZU5hbWVTdHJpbmcuaW5kZXhPZigiLT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkb3RJbmRleCA+IC0xKSB7Ci0JCQkJCWF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVOYW1lU3RyaW5nLnN1YnN0cmluZygwLCBkb3RJbmRleCkpOwotCQkJCQlhdHRyaWJ1dGVOYW1lU3RyaW5nID0gYXR0cmlidXRlTmFtZVN0cmluZy5zdWJzdHJpbmcoZG90SW5kZXggKyAyKTsKLQkJCQl9IGVsc2UKLQkJCQkJYXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZU5hbWVTdHJpbmcpOwotCQkJfSB3aGlsZSAoZG90SW5kZXggPiAtMSk7Ci0JCX0gZWxzZSB7Ci0JCQlJRCA9IHVybFN0cmluZzsKLQkJfQotCX0gZWxzZSB7Ci0JCS8vIGFzc3VtZSB0aGF0IGFueSBVUkwgc3RyaW5nIHRoYXQgZW5kcyB3aXRoIC54bWkgaXMgYSBuYW1lc3BhY2UuCi0JCWlmICh1cmxTdHJpbmcuZW5kc1dpdGgoIi54bWkiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWVzcGFjZU5hbWUgPSB1cmxTdHJpbmc7Ci0JCQlJRCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQluYW1lc3BhY2VOYW1lID0gIj9kZWZhdWx0VVJMPyI7IC8vJE5PTi1OTFMtMSQKLQkJCUlEID0gdXJsU3RyaW5nOwotCQl9Ci0JfQotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gIlVSTCgiICsgKChuYW1lc3BhY2VOYW1lID09IG51bGwpID8gIiIgOiBuYW1lc3BhY2VOYW1lICsgIiMiKSArICgoSUQgPT0gbnVsbCkgPyAiIiA6IElEKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njk4OThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0vKgotICogICRSQ1NmaWxlOiBKYXZhUmVmQWRhcHRlckZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhUmVmQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFSZWZTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgSmF2YVJlZlN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFDbGFzcyhKYXZhQ2xhc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGFzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUluaXRpYWxpemVyKEluaXRpYWxpemVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbml0aWFsaXplckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFQYXJhbWV0ZXIoSmF2YVBhcmFtZXRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVBhcmFtZXRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZChNZXRob2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZpZWxkKEZpZWxkIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVGaWVsZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJsb2NrKEJsb2NrIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCbG9ja0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbW1lbnQoQ29tbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVN0YXRlbWVudChTdGF0ZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVN0YXRlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFQYWNrYWdlKEphdmFQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFEYXRhVHlwZShKYXZhRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFEYXRhVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFycmF5VHlwZShBcnJheVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFycmF5VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFFdmVudChKYXZhRXZlbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFFdmVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzc2lmaWVyKEVDbGFzc2lmaWVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFQ2xhc3NpZmllckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzcyhFQ2xhc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVQYXJhbWV0ZXIoRVBhcmFtZXRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVBhcmFtZXRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVPcGVyYXRpb24oRU9wZXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVQYWNrYWdlKEVQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFDbGFzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaXRpYWxpemVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluaXRpYWxpemVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyIDxlbT5KYXZhIFBhcmFtZXRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkIDxlbT5GaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWVsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuQmxvY2sgPGVtPkJsb2NrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkJsb2NrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJsb2NrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5Db21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkNvbW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuU3RhdGVtZW50IDxlbT5TdGF0ZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuU3RhdGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YXRlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2UgPGVtPkphdmEgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YURhdGFUeXBlIDxlbT5KYXZhIERhdGEgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YURhdGFUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGUgPGVtPkFycmF5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFycmF5VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50IDxlbT5KYXZhIEV2ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhRXZlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50IDxlbT5FTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudCA8ZW0+RU5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyIDxlbT5FQ2xhc3NpZmllcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MgPGVtPkVDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQgPGVtPkVUeXBlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyIDxlbT5FUGFyYW1ldGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVQYXJhbWV0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPcGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZSA8ZW0+RVBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0phdmFSZWZBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjN2VkZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0KLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFSZWZTd2l0Y2guamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEphdmFSZWZQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVJlZlN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTUzogewotCQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhQ2xhc3MoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3MoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihqYXZhQ2xhc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUjogewotCQkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbml0aWFsaXplcihpbml0aWFsaXplcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUjogewotCQkJCUphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciA9IChKYXZhUGFyYW1ldGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhUGFyYW1ldGVyKGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVQYXJhbWV0ZXIoamF2YVBhcmFtZXRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChqYXZhUGFyYW1ldGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoamF2YVBhcmFtZXRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0Q6IHsKLQkJCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kKG1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU9wZXJhdGlvbihtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQobWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KG1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTEQ6IHsKLQkJCQlGaWVsZCBmaWVsZCA9IChGaWVsZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRmllbGQoZmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQoZmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0s6IHsKLQkJCQlCbG9jayBibG9jayA9IChCbG9jayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmxvY2soYmxvY2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVDogewotCQkJCUNvbW1lbnQgY29tbWVudCA9IChDb21tZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb21tZW50KGNvbW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJsb2NrKGNvbW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UOiB7Ci0JCQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IChTdGF0ZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJsb2NrKHN0YXRlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0U6IHsKLQkJCQlKYXZhUGFja2FnZSBqYXZhUGFja2FnZSA9IChKYXZhUGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YVBhY2thZ2UoamF2YVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVQYWNrYWdlKGphdmFQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGphdmFQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFOiB7Ci0JCQkJSmF2YURhdGFUeXBlIGphdmFEYXRhVHlwZSA9IChKYXZhRGF0YVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFEYXRhVHlwZShqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzcyhqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGphdmFEYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEU6IHsKLQkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJyYXlUeXBlKGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSmF2YUNsYXNzKGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzKGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoYXJyYXlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVDogewotCQkJCUphdmFFdmVudCBqYXZhRXZlbnQgPSAoSmF2YUV2ZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhRXZlbnQoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhRXZlbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBDbGFzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhQ2xhc3MoSmF2YUNsYXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUluaXRpYWxpemVyKEluaXRpYWxpemVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUphdmFQYXJhbWV0ZXIoSmF2YVBhcmFtZXRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZChNZXRob2Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWVsZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWVsZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRmllbGQoRmllbGQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CbG9jazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CbG9jazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmxvY2soQmxvY2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbW1lbnQoQ29tbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0YXRlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVN0YXRlbWVudChTdGF0ZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhUGFja2FnZShKYXZhUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgRGF0YSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhRGF0YVR5cGUoSmF2YURhdGFUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJyYXkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnJheSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcnJheVR5cGUoQXJyYXlUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBFdmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIEV2ZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhRXZlbnQoSmF2YUV2ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVOYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVOYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQ2xhc3NpZmllcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQ2xhc3NpZmllcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUNsYXNzaWZpZXIoRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQ2xhc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUNsYXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVQYXJhbWV0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVBhcmFtZXRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVBhcmFtZXRlcihFUGFyYW1ldGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9wZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFT3BlcmF0aW9uKEVPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVBhY2thZ2UoRVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0phdmFSZWZTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9Ob3RpZmljYXRpb25VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvTm90aWZpY2F0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDc5MDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9Ob3RpZmljYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogTm90aWZpY2F0aW9uVXRpbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4yICQgICREYXRlOiAyMDA1LzAyLzE1IDIyOjM3OjAyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvcjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyBvZiBzdGF0aWMgbWV0aG9kcyBmb3IgaGFuZGxpbmcgc3BlY2lhbCBKRU0gbm90aWZpY2F0aW9ucy4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25VdGlsIHsKLQkvKgotCSAqIE5vdCBtZWFudCB0byBiZSBjb25zdHJ1Y3RlZC4KLQkgKi8KLQlwcml2YXRlIE5vdGlmaWNhdGlvblV0aWwoKSB7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIG5vdGlmaWNhdGlvbiBpcyBhIHJlZmxlY3Rpb24gbm90aWZpY2F0aW9uLiBJZiBpdCBpcywgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSBKYXZhQ2xhc3MgaGFzCi0JICoganVzdCBoYWQgcmVmbGVjdGlvbiBwZXJmb3JtZWQgb24gaXQuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHJlZmxlY3Rpb24gZXZlbnQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmbGVjdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmV0dXJuIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBSZWZsZWN0aW9uQWRhcHRvci5FVkVOVCAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IFJlZmxlY3Rpb25BZGFwdG9yLlJFRkxFQ1RJT05fRVZFTlQ7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgbm90aWZpY2F0aW9uIGlzIGEgcmVmbGVjdGlvbiBmbHVzaCBldmVudCBvZiBhIEphdmFDbGFzcyB3aXRoIGV4aXN0aW5nIGNvZGUuIElmIGl0IGlzLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlIAotCSAqIEphdmFDbGFzcyBoYXMganVzdCBoYWQgdGhlIHJlZmxlY3Rpb24gcmVzdWx0cyBmbHVzaGVkLCBBTkQgdGhpcyB3YXMgYSBjbGFzcyB0aGF0IGhhZCBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBjb2RlIG9uIGl0Li4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgZmx1c2ggZXZlbnQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmx1c2hFdmVudChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJldHVybiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gUmVmbGVjdGlvbkFkYXB0b3IuRVZFTlQgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBKYXZhUmVmbGVjdGlvbkFkYXB0b3IuRkxVU0hfUkVGTEVDVElPTl9FVkVOVDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIG5vdGlmaWNhdGlvbiBpcyBhIHJlZmxlY3Rpb24gZmx1c2ggZXZlbnQgb2YgYSBKYXZhQ2xhc3MgdGhhdCBpcyBuZXcgYW5kIGRvZXNuJ3QgaGF2ZSBleGlzdGluZyBjb2RlLgotCSAqIElmIGl0IGlzLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlIEphdmFDbGFzcyBoYXMganVzdCBoYWQgdGhlIHJlZmxlY3Rpb24gcmVzdWx0cyBmbHVzaGVkLCBBTkQgdGhpcyB3YXMgYSBjbGFzcyB0aGF0IHdhcyBuZXcgYW5kCi0JICogaGFkIG5vIGNvZGUgYmVoaW5kIGl0LgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBmbHVzaCBldmVudCBvZiBuZXcgY2xhc3MuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmx1c2hOZXdFdmVudChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJldHVybiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gUmVmbGVjdGlvbkFkYXB0b3IuRVZFTlQgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBKYXZhUmVmbGVjdGlvbkFkYXB0b3IuRkxVU0hfTkVXX1JFRkxFQ1RJT05fRVZFTlQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvLi5ST09ULi4ub3ZlcnJpZGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvLi5ST09ULi4ub3ZlcnJpZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDU2ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzLy4uUk9PVC4uLm92ZXJyaWRlCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24geG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6Y2hhbmdlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL0NoYW5nZSIgeG1pOnZlcnNpb249IjIuMCI+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9Ilg6Uk9PVCMvL0Byb290Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgICAgPCEtLSB0b28gcmVtaW5kIHVzIHRoYXQgdGhlc2UgYXJlIG5lZWQgdG8gYmUgZG9uZSB5ZXQgaW4gdGhlIG5ldyBhbGxvY2F0aW9uIHNjaGVtZS4gCi0gIDxhZGRlZEVPYmplY3RzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnN0YW50aWF0ZVVzaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDxhZGRlZEVPYmplY3RzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJpYWxpemVEYXRhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0tLT4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLTwvY2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzL2phdmEvbGFuZy9PYmplY3Qub3ZlcnJpZGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvamF2YS9sYW5nL09iamVjdC5vdmVycmlkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzMjA1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvamF2YS9sYW5nL09iamVjdC5vdmVycmlkZQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hhbmdlOkNoYW5nZURlc2NyaXB0aW9uIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmNoYW5nZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9DaGFuZ2UiIHhtaTp2ZXJzaW9uPSIyLjAiPgotICAgPCEtLSAKLSAgICAgIFRoaXMgaXMga2luZCBvZiBjaGVhdCwgYnV0IGRhdGF0eXBlcyBhcmUgbmV2ZXIgaW50cm9zcGVjdGVkLCBzbyB3ZSBjYW4ndCBnZXQgdGhlc2UgYXR0cmlidXRlcwotICAgICAgYWRkZWQgdG8gdGhlbSBpbiBhIG5vcm1hbCB3YXkuIEJ5IGRvaW5nIGl0IGhlcmUsIHdoZW4gamF2YS5sYW5nLk9iamVjdCBpcyBpbnRyb3NwZWN0ZWQsIHRoZXNlCi0gICAgICB3aWxsIGJlIGRvbmUgYXQgdGhlIHNhbWUgdGltZS4gQW5kIHNpbmNlIE9iamVjdCBuZWVkcyB0byBiZSBpbnRyb3NwZWN0ZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UKLSAgICAgIGNhbiBiZSBkb25lLCB0aGVzZSB3aWxsIGJlIGRvbmUgYmVmb3JlIGFueXRoaW5nIG5lZWRzIHRoZW0uIC0tPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jYm9vbGVhbiI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iYm9vbGVhbl9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iYm9vbGVhbl9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jY2hhciI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iY2hhcl9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iY2hhcl9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jaW50Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJpbnRfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9ImludF9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jZmxvYXQiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImZsb2F0X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJmbG9hdF9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jc2hvcnQiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9InNob3J0X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJzaG9ydF9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jbG9uZyI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0ibG9uZ19lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0ibG9uZ19lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jZG91YmxlIj4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJkb3VibGVfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9ImRvdWJsZV9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jYnl0ZSI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iYnl0ZV9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iYnl0ZV9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotPC9jaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGJlYTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDoyMDoyNSAkCi0jCi0KLQotcGx1Z2luTmFtZSA9IEphdmEgRU1GIE1vZGVsCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZDRjMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJqYXZhLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8ucmVnaXN0cmF0aW9ucyI+Ci0gICAgICA8cmVnaXN0cmF0aW9uIGNvbnRhaW5lcj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLSAgICAgICAgPG92ZXJyaWRlCi0gICAgICAgICAgICBwYWNrYWdlPSJqYXZhLmxhbmciCi0gICAgICAgICAgICBwYXRoPSJvdmVycmlkZXMvamF2YS9sYW5nIj4KLSAgICAgICAgPC9vdmVycmlkZT4KLSAgICAgICAgPG92ZXJyaWRlCi0gICAgICAgICAgICBwYWNrYWdlPSIuLlJPT1QuLiIKLSAgICAgICAgICAgIHBhdGg9Im92ZXJyaWRlcyI+Ci0gICAgICAgIDwvb3ZlcnJpZGU+Ci0gICAgICA8L3JlZ2lzdHJhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlM2EzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSoubWR+Ci0qLmNhfgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvZWRvY2phdmEyLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvZWRvY2phdmEyLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViMWVlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2Vkb2NqYXZhMi5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw1NjEzICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXZhIgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJJREwiCi0JICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDAwLTAwNWQ5ZTZhZGVjNDoxIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qZW0iKSkKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJKYXZhUmVmIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkibnNVUkkiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJqYXZhLnhtaSIpKSkKLSAgICBxdWlkICAgICAgIAkiMzY1NDlGMkMwMDRFIgotICAgIGRvY3VtZW50YXRpb24gCQotfENoYW5nZXMgdG8gc3luY2ggdXAgd2l0aCBKYXZhM2U6Ci18LSBkZWxldGVkIEphdmFFbGVtZW50LCBCb2R5RWxlbWVudCB3aGljaCBkaWRuJ3QgYWRkIGFueXRoaW5nIHVzZWZ1bAotfC0gZGVsZXRlZCBOZXN0ZWRDbGFzcyBhbmQgdGhlIGFzc29jaWF0aW9uIHdoaWNoIGRlc2NyaWJlZCBuZXN0aW5nLCBjb250ZW50cyBjYW4gYmUgdXNlZCBpbnN0ZWFkCi18LSBkZWxldGVkIGV4dGVuZHMvZXh0ZW5kZWRCeSB3aGljaCBpcyByZXBsYWNlZCB3aXRoIE1PRiBzdWJ0eXBlL3N1cGVydHlwZQotfC0gZGVsZXRlZCB0aGUgY2x1bXN5IG1haW4gZGlhZ3JhbQotfC0gbW92ZWQgdGhlIE1PRiBpbmhlcml0YW5jZSBkZXRhaWxzIHRvIHRoZSBNT0YgYmluZGluZyBkaWFncmFtCi18LSBkZWxldGVkICJmaW5hbCIgb24gSmF2YVBhcmFtZXRlciwgZG9uJ3Qga25vdyB3aGF0IHRoYXQgd2FzIHN1cHBvc2VkIHRvIGJlCi18LSBkZWxldGVkIHRoZSBDYXRlZ29yeSBqdW5rCi18LSBjaGFuZ2VkIHRoZSBCbG9jay10eXBlZCBhdHRyaWJ1dGVzIG9uIEZpZWxkLCBNZXRob2QsIEluaXRpYWxpemVyIHRvIGJlIGFzc29jaWF0aW9ucyB0byBCbG9jawotfAotfE91dHN0YW5kaW5nIHF1ZXN0aW9ucy9pc3N1ZXM6Ci18LSBKYXZhUGFyYW1ldGVyS2luZCBzaG91bGQgZ28gYXdheSBpZiB3ZSBnZXQgdGhlIGJhc2UgUGFyYW1ldGVyIGtpbmQgZml4ZWQgdXAKLXwKLSAgICAKLSAgICBzdGVyZW90eXBlIAkibWV0YW1vZGVsIgotICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MURERjQ3MDI3MSIKLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9mIgotCSAgICBxdWlkdSAgICAgIAkiMzc0QUE4RjkwMjhFIikKLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDItMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOUJEMzY2MDAwRkUiCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlIgotCSAgICBxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIikpCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3MgIkphdmFDbGFzcyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwMy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MDk1MDAwMEIzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNOZXN0ZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0E5RDdDMjEwMUQ2IgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmllbGQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI1QjMwMDQ0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZmllbGROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQUEiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkZpZWxkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaWVsZEV4dGVuZGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNjI1MDExQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfCBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4KLXwKLXxSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuCi0JCSAgICAKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJmaWVsZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFBQyIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiRmllbGQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZpZWxkTmFtZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI2NjcwMjU1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZmllbGROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQUUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkZpZWxkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaWVsZHNFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjY4QTAzMjgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFsbCBmaWVsZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWV0aG9kIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCOTExMDIxQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1ldGhvZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCMSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJUeXBlcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUIyIgotCQkJICAgIGRvY3VtZW50YXRpb24gCSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlTGlzdCIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikpCi0JCSAgICByZXN1bHQgICAgIAkiTWV0aG9kIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjlFQTAzQ0EiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGEgTGlzdCBvZiBTdHJpbmdzIHRoYXQgcmVwcmVzZW50IE1ldGhvZEVsZW1lbnQgc2lnbmF0dXJlcyBmcm9tIG1vc3QgZ2VuZXJhbCB0byBtb3N0IHNwZWNpZmljLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1ldGhvZEV4dGVuZGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQTUxMDExNSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWV0aG9kTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUI1IgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlclR5cGVzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQjYiCi0JCQkgICAgZG9jdW1lbnRhdGlvbiAJIkxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVMaXN0IgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJNZXRob2QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1ldGhvZHNFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkE3RDAzNTQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE9ubHlTcGVjaWZpY01ldGhvZHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJBQzMwMjFFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyB3aWxsIGJlIHJldHVybmVkLgotfAotCQkgICAgCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYU1ldGhvZE5hbWVQcmVmaXgiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCOSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJleGNsdWRlZE5hbWVzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQkEiCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlTGlzdCIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikpCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQdWJsaWNNZXRob2QiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJCQzkwMzgzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuICBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXRob2ROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQkMiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyVHlwZXMiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCRCIKLQkJCSAgICBkb2N1bWVudGF0aW9uIAkiTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUxpc3QiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpKQotCQkgICAgcmVzdWx0ICAgICAJIk1ldGhvZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHVibGljTWV0aG9kcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkMzRDAzNEUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFsbCBtZXRob2RzLCBpdCB3aWxsIG5vdCBnbyB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJDNjMwMzIwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbGwgcHVibGljIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHVibGljTWV0aG9kc05hbWVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQ0FBMDA1QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUMxIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFN1cGVydHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkNGOTAwQ0QiCi0JCSAgICByZXN1bHQgICAgIAkiSmF2YUNsYXNzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJpbXBsZW1lbnRzSW50ZXJmYWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRDM5MDA5RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUZXN0IHdoZXRoZXIgdGhlIHJlY2VpdmVyIGltcGxlbWVudHMgdGhlIHBhc3NlZCBpbnRlcmZhY2UgKG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcykuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImludGVyZmFjZVR5cGUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFDNCIKLQkJCSAgICB0eXBlICAgICAgIAkiSmF2YUNsYXNzIgotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImluZm9TdHJpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJEODIwMkQzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhIHN0cmluZyBzaG93aW5nIG91ciBkZXRhaWxzLiIKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaW5oZXJpdHNGcm9tIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRDlFMDJFNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUZXN0cyB3aGV0aGVyIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSB0aGUgcGFzc2VkIGluIGNsYXNzLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJqYXZhQ2xhc3MiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFDNyIKLQkJCSAgICB0eXBlICAgICAgIAkiSmF2YUNsYXNzIgotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzRXhpc3RpbmdUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRTExMDEyMCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJEb2VzIHRoaXMgdHlwZSBleGlzdC4iCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0ludGVyZmFjZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkUyRjAxMzciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBhbiBpbnRlcmZhY2UuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0U3VwZXJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRTdCMDBBMCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdGhlIHN1cGVydHlwZS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiamF2YWNsYXNzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQ0IiCi0JCQkgICAgdHlwZSAgICAgICAJIkphdmFDbGFzcyIKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikpCi0JCSAgICByZXN1bHQgICAgIAkidm9pZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJraW5kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEE0NUUwMjMyIgotCQkgICAgdHlwZSAgICAgICAJIlR5cGVLaW5kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRCNDYwMDJCRiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwNi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOENFODAyMEMiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY4RjlDMDJENyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiSW5pdGlhbGl6ZXIiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDktMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QTVEQzAwQkIiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlzU3RhdGljIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMGEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEE4NjUwMDBGIgotCQkgICAgdHlwZSAgICAgICAJIkJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJKYXZhUGFyYW1ldGVyIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBiLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEFENzgwMjgwIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I3ODE4QjAwMTg2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVQYXJhbWV0ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0U2MTUwMTA0IikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzQXJyYXkiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJGRDQwMzRGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgcGFyYW1ldGVyIHR5cGUgYW4gYXJyYXkgdHlwZS4iCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc1JldHVybiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkZFRjAwMDUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBhIHJldHVybiBwYXJhbWV0ZXIuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SmF2YVR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUM4RTcwMDFBIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFF1YWxpZmllZE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUM5MjYwMDJGIgotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRCNjQ3MDJBRiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtZXRlcktpbmQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFDMUVCNDAwQzIiCi0JCSAgICB0eXBlICAgICAgIAkiSmF2YVBhcmFtZXRlcktpbmQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkxQzFFOEYwMTIzIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEFFOTEwMjcxIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxMC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTkwOTUzODAzQUQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RU9wZXJhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0REFBMjAwQTAiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzA0MjAyQTMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIHRoZSBqYXZhIGNsYXNzIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbi4iCi0JCSAgICByZXN1bHQgICAgIAkiSmF2YUNsYXNzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMDc2MDEzRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB0aGUgbWV0aG9kIG5hbWUgYW5kIGl0cyBwYXJhbWV0ZXJzLiBlLmcuIDxjb2RlPiBzZXRGaXJzdE5hbWUoamF2YS5sYW5nLlN0cmluZykgPC9jb2RlPiAuCi18IAotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlciIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzBCODAxMUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGEgUGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJOYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxRTMiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkphdmFQYXJhbWV0ZXIiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFJldHVyblR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMxNDcwMDEzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkdldCB0aGUgcmV0dXJuIHR5cGUuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFJldHVyblR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMyNzQwM0NFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgcmV0dXJuIHR5cGUiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAidHlwZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUU4IgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJ2b2lkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNpZ25hdHVyZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzE3RDAwNDMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLnRvU3RyaW5nKCkuCi18Ci18UmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgTWV0aG9kLiAgVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgdGhlIG1ldGhvZCBhY2Nlc3MgbW9kaWZpZXJzLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUsIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1ldGhvZCwgZm9sbG93ZWQgYnkgYSBwZXJpb2QsIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgbmFtZSwgZm9sbG93ZWQgYnkgYSBwYXJlbnRoZXNpemVkLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbWV0aG9kJ3MgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG1ldGhvZCB0aHJvd3MgY2hlY2tlZCBleGNlcHRpb25zLCB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIHdvcmQgdGhyb3dzIGZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRocm93biBleGNlcHRpb24gdHlwZXMuCi18Ci18Rm9yIGV4YW1wbGU6Ci18Ci18ICAgIHB1YmxpYyBib29sZWFuIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi18Ci18VGhlIGFjY2VzcyBtb2RpZmllcnMgYXJlIHBsYWNlZCBpbiBjYW5vbmljYWwgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5ICJUaGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIi4gIFRoaXMgaXMgcHVibGljLCA8dHQ+cHJvdGVjdGVkPC90dD4gb3IgPHR0PnByaXZhdGU8L3R0PiBmaXJzdCwgYW5kIHRoZW4gb3RoZXIgbW9kaWZpZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IDx0dD5hYnN0cmFjdDwvdHQ+LCA8dHQ+c3RhdGljPC90dD4sIDx0dD5maW5hbDwvdHQ+LCA8dHQ+c3luY2hyb25pemVkPC90dD4gPHR0Pm5hdGl2ZTwvdHQ+LgotfAotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzR2VuZXJhdGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMUZDMDA2RSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHN5c3RlbSBnZW5lcmF0ZWQuCi18VGhpcyBpcyB1c3VhbGx5IGRldGVybWluZWQgYnkgdGhlIEBnZW5lcmF0ZWQgdGFnIGluIHRoZSBjb21tZW50LgotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRJc0dlbmVyYXRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzI0NDAzN0YiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRoZSBpc0dlbmVyYXRlZCBmbGFnLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJnZW5lcmF0ZWQiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFFQyIKLQkJCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpKQotCQkgICAgcmVzdWx0ICAgICAJInZvaWQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNWb2lkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMjE4MDM4RiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIGEgdm9pZCByZXR1cm4gdHlwZSBtZXRob2QuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOTBCQzAyMkIiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYXRpdmUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxMi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOTBEMTAzNjQiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeW5jaHJvbml6ZWQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxMy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOTBEQjAzQzEiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkUwMDAzMyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cnVjdG9yIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQUREMjgwMjQ1IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3RhdGljIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2RTQwMzUwIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YVZpc2liaWxpdHkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxNy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZFQjAzOTciCi0JCSAgICB0eXBlICAgICAgIAkiSmF2YVZpc2liaWxpdHlLaW5kIgotCQkgICAgcXVpZHUgICAgICAJIjM4MjMzM0JFMDMyRSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIkZpZWxkIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEFGOEYwMjgwIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwNDg3RjkwMzM0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVUeXBlZEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RjYwMzk4IikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI1MTIwMDI0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkdldCB0aGUgY2xhc3MgdGhhdCB0aGlzIGZpZWxkIGlzIHdpdGhpbi4iCi0JCSAgICByZXN1bHQgICAgIAkiSmF2YUNsYXNzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0FycmF5IgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNTVGMDFFNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIGZpZWxkIGFuIGFycmF5IHR5cGUuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxZC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZCRTAyNkYiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdGF0aWMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZDMjAyRUQiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhVmlzaWJpbGl0eSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDFmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkM3MDM0RiIKLQkJICAgIHR5cGUgICAgICAgCSJKYXZhVmlzaWJpbGl0eUtpbmQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzgyMzMzQkUwMzJFIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRyYW5zaWVudCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA0ODgwMTAzQjgiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2b2xhdGlsZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA0ODgwODAxMkQiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIlR5cGVLaW5kIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDIwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEI0NjAwMkJGIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVU5ERUZJTkVEPTEgQ0xBU1M9MiBJTlRFUkZBQ0U9MyBFWENFUFRJT049NCIKLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJVTkRFRklORUQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBCOUUzNjAxQTEiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ0xBU1MiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyMi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBCOUU0NDAyNUQiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSU5URVJGQUNFIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwQjlFNTYwMTI0IgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkVYQ0VQVElPTiIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEI5RTY1MDFBMSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIkJsb2NrIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgwRjg4MzcwMTUwIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzb3VyY2UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyNi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwRTdGQzAyMzkiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0E2QzUzRTEwMDI5IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiQ29tbWVudCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyNy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MEY4ODlCMDJCOCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjg4RDYwMEE1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIikpKQotCShvYmplY3QgQ2xhc3MgIlN0YXRlbWVudCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyOS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MEY4OEI5MDI1QSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMmEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjg4REEwMDU2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFQYWNrYWdlIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDJiLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgxMDhFMDMwMUQyIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyYy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTkwOTRENzAwNDYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVBhY2thZ2UiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNUMzRjcwMDBBIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJKYXZhVmlzaWJpbGl0eUtpbmQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODIzMzNCRTAzMkUiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFBBQ0tBR0U9MQotfFBVQkxJQz0yCi18UFJJVkFURT0zCi18UFJPVEVDVEVEPTQKLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUFVCTElDIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyMzMzRTIwMjJDIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBSSVZBVEUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzMi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODIzMzNFNzAwM0UiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUFJPVEVDVEVEIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyMzMzRTgwMzg5IgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBBQ0tBR0UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzNC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODIzMzNFQTAzOEMiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFQYXJhbWV0ZXJLaW5kIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkxQzFFOEYwMTIzIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxJTj0wCi18T1VUPTEKLXxJTk9VVD0yCi18UkVUVVJOPTMKLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSU4iCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzNi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFDMUVGQzAyRUMiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiT1VUIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzctMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzFFRkYwMTZBIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklOT1VUIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzFGMDEwMDQwIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJFVFVSTiIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUMyMTk0MDM4NyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiSmF2YURhdGFUeXBlIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzk1OTEzMzQwMzE2IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjY4RTIwMUIxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRjkxMDMwMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkpCi0JKG9iamVjdCBDbGFzcyAiQXJyYXlUeXBlIgotCSAgICBxdWlkICAgICAgIAkiM0E5RDc5RUQwMURGIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxEZXNjcmliZXMgYSBKYXZhIEFycmF5IHR5cGUKLXwgICBGb3IgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlCi18ICAgc3BlY2lmaWVkIGRpcmVjdGx5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGluc3RhbnRpYXRpbmcgYSBjaGFpbiBvZiBjb21wb25lbnQgdHlwZXMKLXwgICBzdWNoIGFzIFN0cmluZ1tdW11bXVtdLT5TdHJpbmdbXVtdW10tPlN0cmluZ1tdW10tPlN0cmluZ1tdLT5TdHJpbmcuCi18Ci18ICBUaGUgY29tcG9uZW50IHR5cGUgcmVsYXRpb25zaGlwIHdpbGwgYmUgY29tcHV0ZWQgaWYgdGhlIGZpbmFsQ29tcG9uZW50VHlwZQotfCAgYW5kIGFycmF5IGRpbWVuc2lvbnMgaXMgc3BlY2lmaWVkLgotfCAKLXwgIEZvciB0aGlzIHJlYXNvbiwgdGhlIHByZWZlcnJlZCB3YXkgdG8gY3JlYXRlIGlzIHRocm91Z2ggdGhlIEphdmFSZWZGYWN0b3J5IGZhY3RvcnkgbWV0aG9kOgotfCAgICAgICBjcmVhdGVBcnJheVR5cGUoSmF2YUNsYXNzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0E5RDc5RkQwMTBGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaW5hbENvbXBvbmVudFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0E5RDdBODIwMTkzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18R2V0IHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBBcnJheSBUeXBlLgotfAotfEluIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZyByZWZsZWN0aW9uLiBJdCB0dXJucyBvdXQgdG8gYmUgbW9zdCBlZmZpY2llbnQgdG8ganVzdCBkbyB0aGlzIGJ5IHRyaW1taW5nIHRoZSBuYW1lLgotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVBRjk4MDEzNiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfEdldCB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheS4gCi18Ci18SWYgdGhpcyBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZSB0aGUgbmVzdGVkIGFycmF5IHR5cGUuCi0JCSAgICAKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc1ByaW1pdGl2ZUFycmF5IgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNDE3MDJCOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIGFuIGFycmF5IG9mIGphdmEgcHJpbWl0aXZlcyIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldENvbXBvbmVudFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI0NTUwM0JDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgY29tcG9uZW50IHR5cGUuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImhlbHBlckNvbXBvbmVudFR5cGUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDIyNiIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXJyYXlEaW1lbnNpb25zIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiRmluYWwiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQkgICAgdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJICAgIHZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E5RDdBQzgwMjg0IgotCQkgICAgdHlwZSAgICAgICAJImludCIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkpUeXBlSmF2YUhlbHBlcnMiCi0JICAgIHF1aWQgICAgICAgCSIzQjY1QURFNDAzQTYiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGludGVyZmFjZSBpcyBhIGNvbW1vbiBpbnRlcmZhY2UgYmV0d2VlbiBKYXZhQ2xhc3MgYW5kIEphdmFEYXRhVHlwZSBwbHVzIHNvbWUgY29tbW9uIGhlbHBlciBtZXRob2RzLiIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QUUxNzAyNjkiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJKVHlwZUxpc3QiCi0JICAgIHF1aWQgICAgICAgCSIzQjY1Qjg3NjAyQzEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJqYXZhLnV0aWwuTGlzdCB0eXBlIgotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0IgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCODhGMDM5OSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFFdmVudCIKLQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUYxMDNDOCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNERjRDRTgzMDM5MCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1OUQwMjMwIikpCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiSW1wbGVtZW50cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzYy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBMEQ3MDI0MiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkNvbnN0cmFpbnQgLSBTb3VyY2Ugb2YgaW1wbGVtZW50cyBpcyBvZiBUeXBlS2luZCBDTEFTU1RZUEUgYW5kIHRhcmdldCBpcyBJTlRFUkZBQ0VUWVBFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJpbXBsZW1lbnRzSW50ZXJmYWNlcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNkLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBMERBMDEwOSIKLQkJICAgIGxhYmVsICAgICAgCSJpbXBsZW1lbnRzSW50ZXJmYWNlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaW1wbGVtZW50ZWRCeSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNlLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBMERBMDEzOCIKLQkJICAgIGxhYmVsICAgICAgCSJpbXBsZW1lbnRlZEJ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJNZXRob2RIYXMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwM2YtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QUYwMzAyQ0UiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBhcmFtZXRlcnMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0MC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QUYwODAxOTYiCi0JCSAgICBsYWJlbCAgICAgIAkicGFyYW1ldGVycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJtZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0MS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QUYwODAxOTciCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDItMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QjA4ODAxQTUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIi90eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEIwOTEwMDdEIgotCQkgICAgbGFiZWwgICAgICAJIi90eXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIvdHlwZWRFbGVtZW50IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEIwOTEwMDhDIgotCQkgICAgbGFiZWwgICAgICAJIi90eXBlZEVsZW1lbnQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJNZXRob2RUaHJvd3MiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODEwQjYxQjAxNzgiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUYXJnZXQgbXVzdCBiZSBvZiBraW5kIEVYQ0VQVElPTlRZUEUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImphdmFFeGNlcHRpb25zIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEI2MUUwMUMzIgotCQkgICAgbGFiZWwgICAgICAJImphdmFFeGNlcHRpb25zIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJtZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Ny0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwQjYxRTAyMjciCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJDb250ZW50cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0OC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MTBFNjA4MDI2OCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY29udGFpbmVkQnkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0OS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwRTYwRTAxNDQiCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGFpbmVkQnkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0YS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwRTYwRTAxNjIiCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiQ2xhc3NJbXBvcnRzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRiLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgyOUM0QkYwMDBEIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJjbGFzc0ltcG9ydCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEJGMDAwRSIKLQkJICAgIGxhYmVsICAgICAgCSJjbGFzc0ltcG9ydCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaW1wb3J0ZWRCeSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRkLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEJGMDAwRiIKLQkJICAgIGxhYmVsICAgICAgCSJpbXBvcnRlZEJ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJQYWNrYWdlSW1wb3J0cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0ZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEVDMDIwNyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFja2FnZUltcG9ydHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Zi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzRFRTAwRkIiCi0JCSAgICBsYWJlbCAgICAgIAkicGFja2FnZUltcG9ydHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFja2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwOEUwMzAxRDIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaW1wb3J0ZWRCeSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDUwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEVFMDEwNSIKLQkJICAgIGxhYmVsICAgICAgCSJpbXBvcnRlZEJ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDUxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QkQwMjE5IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJmaWVsZHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Mi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODJBMjlCRTAzNTAiCi0JCSAgICBsYWJlbCAgICAgIAkiZmllbGRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJqYXZhQ2xhc3MiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1My0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODJBMjlCRTAzQkYiCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YUNsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1NC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUMwMDE3RCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAibWV0aG9kcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUMxMDE3NCIKLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2RzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiamF2YUNsYXNzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QzEwMjBBIgotCQkgICAgbGFiZWwgICAgICAJImphdmFDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTctMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBOUVCNDAzQzYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIi9zdXBlcnR5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1OC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBOUVCODAzQjciCi0JCSAgICBsYWJlbCAgICAgIAkiL3N1cGVydHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiL3N1YnR5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1OS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBOUVCOTAwOTgiCi0JCSAgICBsYWJlbCAgICAgIAkiL3N1YnR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBOUYwMzAxQUMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIi9zdXBlcnR5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Yi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBOUYwOTAzMjgiCi0JCSAgICBsYWJlbCAgICAgIAkiL3N1cGVydHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiL3N1YnR5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Yy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBOUYwQTAwMUMiCi0JCSAgICBsYWJlbCAgICAgIAkiL3N1YnR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1ZC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBMDk1MDNFNSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW5pdGlhbGl6ZXJzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEwOTcwMTUzIgotCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemVycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkluaXRpYWxpemVyIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBNURDMDBCQiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiamF2YUNsYXNzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEwOTcwMTVEIgotCQkgICAgbGFiZWwgICAgICAJImphdmFDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQTIxMjAwQzIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImRlY2xhcmVkQ2xhc3NlcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDYxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMjE3MDFEOCIKLQkJICAgIGxhYmVsICAgICAgCSJkZWNsYXJlZENsYXNzZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImRlY2xhcmluZ0NsYXNzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEyMTcwMkRDIgotCQkgICAgbGFiZWwgICAgICAJImRlY2xhcmluZ0NsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2My0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBMkE3MDFDMSIKLQkgICAgc3RlcmVvdHlwZSAJImRlcml2ZWQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImphdmFDbGFzc2VzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjQtMDA1ZDllNmFkZWM0OjEiKSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMkE4MDM2NyIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhQ2xhc3NlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiamF2YVBhY2thZ2UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2NS0wMDVkOWU2YWRlYzQ6MSIpKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEyQTkwMDgzIgotCQkgICAgbGFiZWwgICAgICAJImphdmFQYWNrYWdlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiCi0JCSAgICBxdWlkdSAgICAgIAkiMzgxMDhFMDMwMUQyIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUFDMzMwMzZBIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzb3VyY2UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Ny0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUMzODAxNDAiCi0JCSAgICBsYWJlbCAgICAgIAkic291cmNlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImluaXRpYWxpemVyIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDMzgwMTY4IgotCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemVyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SW5pdGlhbGl6ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEE1REMwMEJCIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjktMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQUM1NjAyQTIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImluaXRpYWxpemVyIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNmEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDNTcwMkRGIgotCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemVyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJmaWVsZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDZiLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzU3MDMwNyIKLQkJICAgIGxhYmVsICAgICAgCSJmaWVsZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDZjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUFDQTUwMUU3IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzb3VyY2UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ2YWM0MC04ODI2LTExZTEtMDAwMC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUNBNzAxN0MiCi0JCSAgICBsYWJlbCAgICAgIAkic291cmNlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIm1ldGhvZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDZhYzQwLTg4MjYtMTFlMS0wMDAxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQ0E3MDFCOCIKLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIgotCSAgICBxdWlkICAgICAgIAkiM0M2MkZCRTAwMTY4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJldmVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MkZCRTIwMDhGIgotCQkgICAgbGFiZWwgICAgICAJImV2ZW50cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkFGMTAzQzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyIgotCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQkUyMDA5MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyIKLQkgICAgcXVpZCAgICAgICAJIjNDODkzODc3MDI1MyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiYWxsRXZlbnRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQzg5Mzg3ODAyQ0MiCi0JCSAgICBsYWJlbCAgICAgIAkiYWxsRXZlbnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUV2ZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQUYxMDNDOCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODkzODc4MDJDRSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSIKLQkgICAgcXVpZCAgICAgICAJIjNERjRDQUFEMDFBMyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY29tcG9uZW50VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzREY0Q0FBRTAxRUIiCi0JCSAgICBsYWJlbCAgICAgIAkiY29tcG9uZW50VHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3NpZmllciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUNFNEZFRTAzNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiCi0JCSAgICBxdWlkICAgICAgIAkiM0RGNENBQUUwMUY1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QXJyYXlUeXBlIgotCQkgICAgcXVpZHUgICAgICAJIjNBOUQ3OUVEMDFERiIpKSkpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVjb3JlIGJpbmRpbmciCi0JICAgIHF1aWQgICAgICAgCSIzODEwOUMwRjAwOUIiCi0JICAgIHRpdGxlICAgICAgCSJFY29yZSBiaW5kaW5nIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAk0MDk0Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiIEAxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDExMDQsIDU3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDY4OSwgMzY4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTgzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkZpZWxkIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoNjg5LCA0MjQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJOAotCQkJbWF4X3dpZHRoICAJNzA5KQotCQkgICAgd2lkdGggICAgICAJODQ4Ci0JCSAgICBoZWlnaHQgICAgIAk0MzgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MiwgNDgwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMzEsIDQzNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFja2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIHdpZHRoICAgICAgCTM0MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFUGFja2FnZSIgQDMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyLCAxNDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxMDMsIDQ1KQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTc4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVBhY2thZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTA1QzNGNzAwMEEiCi0JCSAgICB3aWR0aCAgICAgIAkxOTYKLQkJICAgIGhlaWdodCAgICAgCTIyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5OTA5NEQ3MDA0NiIKLQkJICAgIGNsaWVudCAgICAgCUAyCi0JCSAgICBzdXBwbGllciAgIAlAMwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBANQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzI4LCAxODI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQlsb2NhdGlvbiAgIAkoMTQ2NSwgMTYxNSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTUyNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDUKLQkJCWxvY2F0aW9uICAgCSgxNDY1LCAxNzE1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNDUyKQotCQkgICAgd2lkdGggICAgICAJNTQ0Ci0JCSAgICBoZWlnaHQgICAgIAk0NDAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPcGVyYXRpb24iIEA2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMjAsIDE0NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANgotCQkJbG9jYXRpb24gICAJKDIyMzEsIDQ1KQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTc4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRU9wZXJhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDREQUEyMDBBMCIKLQkJICAgIHdpZHRoICAgICAgCTE5NgotCQkgICAgaGVpZ2h0ICAgICAJMjIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFEYXRhVHlwZSIgQDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCAxMjE2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoMTEsIDExNDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjgyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YURhdGFUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzk1OTEzMzQwMzE2IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDExLCAxMTk5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU4NSkKLQkJICAgIHdpZHRoICAgICAgCTcwMAotCQkgICAgaGVpZ2h0ICAgICAJMTY4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMzNiwgNzY4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4Ci0JCQlsb2NhdGlvbiAgIAkoMTczNiwgMzU3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTEyMDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2QiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDgKLQkJCWxvY2F0aW9uICAgCSgxNzM2LCA0MTMpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMTcKLQkJCW1heF93aWR0aCAgCTEwMjcpCi0JCSAgICB3aWR0aCAgICAgIAkxMjE4Ci0JCSAgICBoZWlnaHQgICAgIAk4NDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTkwOTUzODAzQUQiCi0JCSAgICBjbGllbnQgICAgIAlAOAotCQkgICAgc3VwcGxpZXIgICAJQDYKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM3NiwgMzQ2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzNzYsIDI1NSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMxMiwgMjg2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCWxvY2F0aW9uICAgCSgzMzAsIDIyNzMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTk2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDEwCi0JCQlsb2NhdGlvbiAgIAkoMzMwLCAyMzI5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTI1Ci0JCQltYXhfd2lkdGggIAkxNjgwKQotCQkgICAgd2lkdGggICAgICAJMTk4MgotCQkgICAgaGVpZ2h0ICAgICAJMTIwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5OTA5NTAwMDBCMyIKLQkJICAgIGNsaWVudCAgICAgCUAxMAotCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU5NCwgMjI2MikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTk0LCAyMDQ0KSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyIiBAMTIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAwOCwgMTQ3MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTIKLQkJCWxvY2F0aW9uICAgCSg2MDgsIDEyODYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhcmFtZXRlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDEyCi0JCQlsb2NhdGlvbiAgIAkoNjA4LCAxMzQyKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTcKLQkJCW1heF93aWR0aCAgCTY4NSkKLQkJICAgIHdpZHRoICAgICAgCTgxOAotCQkgICAgaGVpZ2h0ICAgICAJMzk0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFUGFyYW1ldGVyIiBAMTMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAwOCwgOTYwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMwotCQkJbG9jYXRpb24gICAJKDkxOSwgODYxKQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTc4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVBhcmFtZXRlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0U2MTUwMTA0IgotCQkgICAgd2lkdGggICAgICAJMTk2Ci0JCSAgICBoZWlnaHQgICAgIAkyMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I3ODE4QjAwMTg2IgotCQkgICAgY2xpZW50ICAgICAJQDEyCi0JCSAgICBzdXBwbGllciAgIAlAMTMKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDE1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMyMCwgODE2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDU2LCA2MzApCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE1Ci0JCQlsb2NhdGlvbiAgIAkoNTYsIDczMCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTQ1MikKLQkJICAgIHdpZHRoICAgICAgCTU0NgotCQkgICAgaGVpZ2h0ICAgICAJMzk0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNTI2OEUyMDFCMSIKLQkJICAgIGNsaWVudCAgICAgCUA3Ci0JCSAgICBzdXBwbGllciAgIAlAMTUKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVUeXBlZEVsZW1lbnQiIEAxNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCAxMTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTcKLQkJCWxvY2F0aW9uICAgCSg5MTYsIDQxKQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzc2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVR5cGVkRWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RjYwMzk4IgotCQkgICAgd2lkdGggICAgICAJMzk0Ci0JCSAgICBoZWlnaHQgICAgIAkxNjQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwNDg3RjkwMzM0IgotCQkgICAgY2xpZW50ICAgICAJQDEKLQkJICAgIHN1cHBsaWVyICAgCUAxNwotCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJQb2x5bW9ycGhpc20iCi0JICAgIHF1aWQgICAgICAgCSIzODEwOUQwMDAzNzMiCi0JICAgIHRpdGxlICAgICAgCSJQb2x5bW9ycGhpc20iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAxOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDU3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCWxvY2F0aW9uICAgCSgzNjUsIDUzMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIHdpZHRoICAgICAgCTI4MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDIwCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY2LCA1MzcpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQTlFQjQwM0M2IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvc3VwZXJ0eXBlIiBAMjEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMzAsIDIxNykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQotCQkJCWxvY2F0aW9uICAgCSgyMzQsIDQ4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjI2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrL3N1cGVydHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjQxOTE5MgotCQkJCWhlaWdodCAgICAgCTM4Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQTlFQjgwM0I3IgotCQkJICAgIGNsaWVudCAgICAgCUAyMAotCQkJICAgIHN1cHBsaWVyICAgCUAxOQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNjYsIDUzNykKLQkJCQkoMTY2LCA1MTcpCi0JCQkJKDM1NiwgNTE3KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUzNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU2LCA1MTcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMKLQkJCQlQYXJlbnRfVmlldyAJQDIxCi0JCQkJbG9jYXRpb24gICAJKDMzNCwgNDY0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiL3N1YnR5cGUiIEAyNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjAKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMzMCwgMjE3KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjUKLQkJCQlQYXJlbnRfVmlldyAJQDI0Ci0JCQkJbG9jYXRpb24gICAJKDI1NywgNTgyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvc3VidHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjUzMjQ2OAotCQkJCWhlaWdodCAgICAgCTI0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQTlFQjkwMDk4IgotCQkJICAgIGNsaWVudCAgICAgCUAyMAotCQkJICAgIHN1cHBsaWVyICAgCUAxOQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNjYsIDUzNykKLQkJCQkoMTY2LCA1NTgpCi0JCQkJKDM1NiwgNTU4KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUzNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU2LCA1NTgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYKLQkJCQlQYXJlbnRfVmlldyAJQDI0Ci0JCQkJbG9jYXRpb24gICAJKDMzNCwgNjEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMjcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM5MiwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNwotCQkJbG9jYXRpb24gICAJKDEyNjEsIDUzMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICB3aWR0aCAgICAgIAkyODAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIkltcGxlbWVudHMiIEAyOAotCQkgICAgbG9jYXRpb24gICAJKDk0NCwgNTIxKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBMEQ3MDI0MiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW1wbGVtZW50c0ludGVyZmFjZXMiIEAyOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDMwLCAtNTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMAotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoODM5LCA0ODgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQwNwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ltcGxlbWVudHNJbnRlcmZhY2VzIgotCQkJCXBjdERpc3QgICAgCS0wLjM0MzU1OAotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEEwREEwMTA5IgotCQkJICAgIGNsaWVudCAgICAgCUAyOAotCQkJICAgIHN1cHBsaWVyICAgCUAyNwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0NCwgNTIxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjUyLCA1MjEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEKLQkJCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQkJbG9jYXRpb24gICAJKDExODEsIDQ4NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC43NzMwMDYKLQkJCQloZWlnaHQgICAgIAkzNwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImltcGxlbWVudGVkQnkiIEAzMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDMwLCAtNTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMwotCQkJCVBhcmVudF9WaWV3IAlAMzIKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgNTc1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbXBsZW1lbnRlZEJ5IgotCQkJCXBjdERpc3QgICAgCS0wLjQ3MDc2OQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEEwREEwMTM4IgotCQkJICAgIGNsaWVudCAgICAgCUAyOAotCQkJICAgIHN1cHBsaWVyICAgCUAxOQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0NCwgNTIxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzYsIDUyMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNAotCQkJCVBhcmVudF9WaWV3IAlAMzIKLQkJCQlsb2NhdGlvbiAgIAkoNjg0LCA1NjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODQzMjMwCi0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAzNQotCQkgICAgbG9jYXRpb24gICAJKDE3NTAsIDYwMSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUYwMzAxQUMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIi9zdXBlcnR5cGUiIEAzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzU4LCAyNjUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNwotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTcyMSwgNjQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMjYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvc3VwZXJ0eXBlIgotCQkJCXBjdERpc3QgICAgCTAuMjI3MjczCi0JCQkJaGVpZ2h0ICAgICAJMTMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUYwOTAzMjgiCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE3NTAsIDYwMSkKLQkJCQkoMTc1MCwgNjI3KQotCQkJCSgxNTMyLCA2MjcpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDYwMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzMiwgNjI3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNgotCQkJCWxvY2F0aW9uICAgCSgxNTU3LCA1NzQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvc3VidHlwZSIgQDM5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNQotCQkJICAgIGxvY2F0aW9uICAgCSgzNTgsIDI2NSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwCi0JCQkJUGFyZW50X1ZpZXcgCUAzOQotCQkJCWxvY2F0aW9uICAgCSgxNjI2LCA1NTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE4OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiKy9zdWJ0eXBlIgotCQkJCXBjdERpc3QgICAgCTAuNjE1OTcwCi0JCQkJaGVpZ2h0ICAgICAJMjQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUYwQTAwMUMiCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE3NTAsIDYwMSkKLQkJCQkoMTc1MCwgNTc2KQotCQkJCSgxNTMyLCA1NzYpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDYwMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzMiwgNTc2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxCi0JCQkJUGFyZW50X1ZpZXcgCUAzOQotCQkJCWxvY2F0aW9uICAgCSgxNTU3LCA2MzApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCSAgICBxdWlkICAgICAgIAkiMzgxMDlGOTIwMDBCIgotCSAgICB0aXRsZSAgICAgIAkiTWFpbiIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMjc2MAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IE5vdGVWaWV3IEA0MgotCQkgICAgbG9jYXRpb24gICAJKDg0OCwgMTg0MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDIKLQkJCWxvY2F0aW9uICAgCSg1NTEsIDE3MTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJNTU5Ci0JCQlsYWJlbCAgICAgIAkiVGhpcyBzaG91bGQgcmVhbGx5IGJlIEphdmFDbGFzcyBhbmQgSmF2YURhdGFUeXBlLCBlQ2xhc3NpZmllciBpcyB0aGVpciBjbG9zZXN0IGNvbW1vbiBhbmNlc3Rvci4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJODQyMTYzMQotCQkgICAgd2lkdGggICAgICAJNjE5Ci0JCSAgICBoZWlnaHQgICAgIAkyNTYpCi0JCShvYmplY3QgTm90ZVZpZXcgQDQzCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyLCAzMjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQzCi0JCQlsb2NhdGlvbiAgIAkoMTA3LCAxNjYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJMjk1Ci0JCQlsYWJlbCAgICAgIAkiVGhlIGNsYXNzZXMgd2lsbCBiZSBjb250YWluZWQgYnkgdGhlIHN0YW5kYXJkIEVQYWNrYWdlIG1ldGFPYmplY3RzIHJlbGF0aW9uc2hpcC4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTM1NQotCQkgICAgaGVpZ2h0ICAgICAJMzIwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIiBANDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc3NiwgNDgwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NAotCQkJbG9jYXRpb24gICAJKDE2ODAsIDQzNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxOTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGaWVsZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIgotCQkgICAgd2lkdGggICAgICAJMjEwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SW5pdGlhbGl6ZXIiIEA0NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ1Ci0JCQlsb2NhdGlvbiAgIAkoMTM2MywgMTUxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQxMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkluaXRpYWxpemVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTVEQzAwQkIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA0NQotCQkJbG9jYXRpb24gICAJKDEzNjMsIDIwNykKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkzNDUpCi0JCSAgICB3aWR0aCAgICAgIAk0MjgKLQkJICAgIGhlaWdodCAgICAgCTE2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFja2FnZSIgQDQ2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDYwOCwgOTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ2Ci0JCQlsb2NhdGlvbiAgIAkoNDQ3LCA1MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFja2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIHdpZHRoICAgICAgCTM0MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXIiIEA0NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzQ0LCAxNTg0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NwotCQkJbG9jYXRpb24gICAJKDEzNDQsIDE0ODgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhcmFtZXRlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDQ3Ci0JCQlsb2NhdGlvbiAgIAkoMTM0NCwgMTU0NCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk2NzgpCi0JCSAgICB3aWR0aCAgICAgIAk4MTgKLQkJICAgIGhlaWdodCAgICAgCTIxNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiIEA0OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzEyLCA5OTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQlsb2NhdGlvbiAgIAkoMTYxMywgOTQ2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgd2lkdGggICAgICAJMjE2Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJNZXRob2RIYXMiIEA0OQotCQkgICAgbG9jYXRpb24gICAJKDE3MDAsIDEyNjIpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGMDMwMkNFIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2QiIEA1MAotCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA4LCAyMzgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUYwODAxOTciCi0JCQkgICAgY2xpZW50ICAgICAJQDQ5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcwMCwgMTI2MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMCwgMTA0OSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MQotCQkJCVBhcmVudF9WaWV3IAlANTAKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMywgMTA5NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43ODE2NTkKLQkJCQloZWlnaHQgICAgIAk2OAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcmFtZXRlcnMiIEA1MgotCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA4LCAyMzgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MwotCQkJCVBhcmVudF9WaWV3IAlANTIKLQkJCQlsb2NhdGlvbiAgIAkoMTgzNywgMTQzMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjM1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFyYW1ldGVycyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMzU2NQotCQkJCWhlaWdodCAgICAgCTEzNwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjA4MDE5NiIKLQkJCSAgICBjbGllbnQgICAgIAlANDkKLQkJCSAgICBzdXBwbGllciAgIAlANDcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAwLCAxMjYyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAwLCAxNDc2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0Ci0JCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJCWxvY2F0aW9uICAgCSgxNjM2LCAxNDU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwNTEyOAotCQkJCWhlaWdodCAgICAgCTY1Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUKLQkJCQlQYXJlbnRfVmlldyAJQDUyCi0JCQkJbG9jYXRpb24gICAJKDE1OTIsIDEzOTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNjI4ODIxCi0JCQkJaGVpZ2h0ICAgICAJMTA5Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUV2ZW50IiBANTYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE5MiwgNjU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU2Ci0JCQlsb2NhdGlvbiAgIAkoMjA2NCwgNjA3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI1NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFFdmVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZBRjEwM0M4IgotCQkgICAgd2lkdGggICAgICAJMjc0Ci0JCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBANTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTYwLCA2NzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU3Ci0JCQlsb2NhdGlvbiAgIAkoMzc0LCA1NTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA1NwotCQkJbG9jYXRpb24gICAJKDM3NCwgNjEwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTMxMykKLQkJICAgIHdpZHRoICAgICAgCTM5MAotCQkgICAgaGVpZ2h0ICAgICAJMjU4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDU4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTIxMywgNTM4KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MkEyOUJEMDIxOSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBANTkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Ci0JCQkgICAgbG9jYXRpb24gICAJKDczMywgMjgyKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDE1MTEsIDUxMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTkyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZmllbGRzIgotCQkJCXBjdERpc3QgICAgCTAuNjUzMDE3Ci0JCQkJaGVpZ2h0ICAgICAJMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlCRTAzNTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDU4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ0Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxMywgNTM4KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjcxLCA1MzgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDE2MjQsIDQ4NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFDbGFzcyIgQDYyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1OAotCQkJICAgIGxvY2F0aW9uICAgCSg3MzMsIDI4MikKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlCRTAzQkYiCi0JCQkgICAgY2xpZW50ICAgICAJQDU4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxMywgNTM4KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTUsIDUzOCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEA2MwotCQkgICAgbG9jYXRpb24gICAJKDkxNiwgMzA3KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMDk1MDNFNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdGlhbGl6ZXJzIiBANjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYzCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NiwgOTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTA5NiwgMjE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbml0aWFsaXplcnMiCi0JCQkJcGN0RGlzdCAgICAJMC40MTA3MTkKLQkJCQloZWlnaHQgICAgIAk5MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMDk3MDE1MyIKLQkJCSAgICBjbGllbnQgICAgIAlANjMKLQkJCSAgICBzdXBwbGllciAgIAlANDUKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTYsIDMwNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NCwgMzA3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxMzQ1LCAzNjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTc5Njg3Ci0JCQkJaGVpZ2h0ICAgICAJNjEKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhQ2xhc3MiIEA2NwotCQkJICAgIFBhcmVudF9WaWV3IAlANjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc2LCA5OSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTA5NzAxNUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDkxNiwgMzA3KQotCQkJCSg3MTMsIDMwNykKLQkJCQkoNzEzLCA1NDMpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkxNiwgMzA3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MTMsIDU0MykpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA2OAotCQkgICAgbG9jYXRpb24gICAJKDIwNiwgNjQyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMjEyMDBDMiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVjbGFyZWRDbGFzc2VzIiBANjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkgICAgbG9jYXRpb24gICAJKC01NzgsIDI3NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwCi0JCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDU4MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzI1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZGVjbGFyZWRDbGFzc2VzIgotCQkJCXBjdERpc3QgICAgCTAuMzQzMTk1Ci0JCQkJaGVpZ2h0ICAgICAJMzEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTIxNzAxRDgiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIwNiwgNjQyKQotCQkJCSgyMDYsIDYxMikKLQkJCQkoMzY1LCA2MTIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNiwgNjQyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjUsIDYxMikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQotCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQlsb2NhdGlvbiAgIAkoMzQ3LCA1NTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAyMzY3Ci0JCQkJaGVpZ2h0ICAgICAJNTcKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZWNsYXJpbmdDbGFzcyIgQDcyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSgtNTc4LCAyNzQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MwotCQkJCVBhcmVudF9WaWV3IAlANzIKLQkJCQlsb2NhdGlvbiAgIAkoMjU4LCA2NzUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI5OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2RlY2xhcmluZ0NsYXNzIgotCQkJCXBjdERpc3QgICAgCTAuNDM0Mjg2Ci0JCQkJaGVpZ2h0ICAgICAJMwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMjE3MDJEQyIKLQkJCSAgICBjbGllbnQgICAgIAlANjgKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMjA2LCA2NDIpCi0JCQkJKDIwNiwgNjcyKQotCQkJCSgzNjUsIDY3MikpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA2LCA2NDIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2NSwgNjcyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0Ci0JCQkJUGFyZW50X1ZpZXcgCUA3MgotCQkJCWxvY2F0aW9uICAgCSgzNDUsIDcyNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDc1Ci0JCSAgICBsb2NhdGlvbiAgIAkoNjAzLCAzNDcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDc2Ci0JCQlQYXJlbnRfVmlldyAJQDc1Ci0JCQlsb2NhdGlvbiAgIAkoNjAzLCAyMjgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJYW5jaG9yICAgICAJMTAKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ1MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGVyaXZlZD4+IgotCQkJcGN0RGlzdCAgICAJMC41MDAwMDAKLQkJCWhlaWdodCAgICAgCTEyMAotCQkJb3JpZW50YXRpb24gCTApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyQTcwMUMxIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhQ2xhc3NlcyIgQDc3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NQotCQkJICAgIGxvY2F0aW9uICAgCSgyNywgMjE5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgKLQkJCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQkJbG9jYXRpb24gICAJKDcyMCwgNDE5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitqYXZhQ2xhc3NlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjM2NzUyMQotCQkJCWhlaWdodCAgICAgCTExNwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMkE4MDM2NyIKLQkJCSAgICBjbGllbnQgICAgIAlANzUKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDMsIDM0NykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAzLCA1NDMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkKLQkJCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQkJbG9jYXRpb24gICAJKDY1NywgNTIyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YVBhY2thZ2UiIEA4MAotCQkJICAgIFBhcmVudF9WaWV3IAlANzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcsIDIxOSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxCi0JCQkJUGFyZW50X1ZpZXcgCUA4MAotCQkJCWxvY2F0aW9uICAgCSg0ODIsIDE3OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjYzCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIramF2YVBhY2thZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC44NjI5MDMKLQkJCQloZWlnaHQgICAgIAkxMjIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTJBOTAwODMiCi0JCQkgICAgY2xpZW50ICAgICAJQDc1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ2Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjAzLCAzNDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwMywgMTUyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyCi0JCQkJUGFyZW50X1ZpZXcgCUA4MAotCQkJCWxvY2F0aW9uICAgCSg2NTcsIDE3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDgzCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlANDMKLQkJICAgIHN1cHBsaWVyICAgCUA3NQotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEA4NAotCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTUyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUKLQkJCVBhcmVudF9WaWV3IAlAODQKLQkJCWxvY2F0aW9uICAgCSg2MTYsIDE0NjUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQloaWRkZW4gICAgIAlUUlVFCi0JCQlhbmNob3IgICAgIAkxCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSIiCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJaGVpZ2h0ICAgICAJNjAKLQkJCW9yaWVudGF0aW9uIAkwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRCMDg4MDFBNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiL3R5cGVkRWxlbWVudCIgQDg2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA4NAotCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgOTQ4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEIwOTEwMDhDIgotCQkJICAgIGNsaWVudCAgICAgCUA4NAotCQkJICAgIHN1cHBsaWVyICAgCUA0NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg2MTYsIDE1MjQpCi0JCQkJKDYxNiwgMTU4NCkKLQkJCQkoMTMzNSwgMTU4NCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjE2LCAxNTI0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzM1LCAxNTg0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3Ci0JCQkJUGFyZW50X1ZpZXcgCUA4NgotCQkJCWxvY2F0aW9uICAgCSgxMjU2LCAxNTMxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiL3R5cGUiIEA4OAotCQkJICAgIFBhcmVudF9WaWV3IAlAODQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDk0OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Ci0JCQkJUGFyZW50X1ZpZXcgCUA4OAotCQkJCWxvY2F0aW9uICAgCSg2OTcsIDEwOTkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTExNgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiKy90eXBlIgotCQkJCXBjdERpc3QgICAgCTAuNTg4MTYxCi0JCQkJaGVpZ2h0ICAgICAJODEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjA5MTAwN0QiCi0JCQkgICAgY2xpZW50ICAgICAJQDg0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjE2LCAxNTI0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MTYsIDgwMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA5MAotCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDk2MSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlDMDAxN0QiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZHMiIEA5MQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjA4LCA3MDUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MgotCQkJCVBhcmVudF9WaWV3IAlAOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOSwgODg5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIittZXRob2RzIgotCQkJCXBjdERpc3QgICAgCTAuNjI0MDIzCi0JCQkJaGVpZ2h0ICAgICAJNzMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlDMTAxNzQiCi0JCQkgICAgY2xpZW50ICAgICAJQDkwCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA4OCwgOTYxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjA0LCA5NjEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMKLQkJCQlQYXJlbnRfVmlldyAJQDkxCi0JCQkJbG9jYXRpb24gICAJKDE0ODMsIDEwMTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuNzY2MDQwCi0JCQkJaGVpZ2h0ICAgICAJNTYKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhQ2xhc3MiIEA5NAotCQkJICAgIFBhcmVudF9WaWV3IAlAOTAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjA4LCA3MDUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QzEwMjBBIgotCQkJICAgIGNsaWVudCAgICAgCUA5MAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMDg4LCA5NjEpCi0JCQkJKDczMiwgOTYxKQotCQkJCSg3MzIsIDgwMSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA4OCwgOTYxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MzIsIDgwMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIk1ldGhvZFRocm93cyIgQDk1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTA0NywgOTgxKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MTBCNjFCMDE3OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kIiBAOTYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ4NywgNDA1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MTBCNjFFMDIyNyIKLQkJCSAgICBjbGllbnQgICAgIAlAOTUKLQkJCSAgICBzdXBwbGllciAgIAlANDgKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ3LCA5ODEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDQsIDk4MSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhRXhjZXB0aW9ucyIgQDk3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NQotCQkJICAgIGxvY2F0aW9uICAgCSg0ODcsIDQwNSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NwotCQkJCWxvY2F0aW9uICAgCSg3MzMsIDk0NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzEyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIramF2YUV4Y2VwdGlvbnMiCi0JCQkJcGN0RGlzdCAgICAJMC41NjM2NjQKLQkJCQloZWlnaHQgICAgIAkzNwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MTBCNjFFMDFDMyIKLQkJCSAgICBjbGllbnQgICAgIAlAOTUKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTA0NywgOTgxKQotCQkJCSg2NjksIDk4MSkKLQkJCQkoNjY5LCA4MDEpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNDcsIDk4MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY5LCA4MDEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkKLQkJCQlQYXJlbnRfVmlldyAJQDk3Ci0JCQkJbG9jYXRpb24gICAJKDcyMywgODU3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDEwMAotCQkgICAgbG9jYXRpb24gICAJKDE1NDEsIDgwNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQkUwMDE2OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZXZlbnRzIiBAMTAxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTgxLCAxMzQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIKLQkJCQlQYXJlbnRfVmlldyAJQDEwMQotCQkJCWxvY2F0aW9uICAgCSgyMTY5LCA3NjUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2V2ZW50cyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MkZCRTIwMDhGIgotCQkJICAgIGNsaWVudCAgICAgCUAxMDAKLQkJCSAgICBzdXBwbGllciAgIAlANTYKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTU0MSwgODA2KQotCQkJCSgyMjM4LCA4MDYpCi0JCQkJKDIyMzgsIDcxNykpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0MSwgODA2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM4LCA3MTcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDEKLQkJCQlsb2NhdGlvbiAgIAkoMjI5MiwgNzk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEAxMDQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMAotCQkJICAgIGxvY2F0aW9uICAgCSg5ODEsIDEzNCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkJFMjAwOTEiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwMAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDEsIDgwNikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzU1LCA4MDYpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDEwNQotCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDY2MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDODkzODc3MDI1MyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiYWxsRXZlbnRzIiBAMTA2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUKLQkJCSAgICBsb2NhdGlvbiAgIAkoODQ1LCAtOSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNwotCQkJCVBhcmVudF9WaWV3IAlAMTA2Ci0JCQkJbG9jYXRpb24gICAJKDE5MjUsIDYyMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTkzCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrYWxsRXZlbnRzIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg5Mzg3ODAyQ0MiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNQotCQkJICAgIHN1cHBsaWVyICAgCUA1NgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MDUsIDY2MykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1NSwgNjYzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOAotCQkJCVBhcmVudF9WaWV3IAlAMTA2Ci0JCQkJbG9jYXRpb24gICAJKDE5NzUsIDcwMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44NzYzMzYKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTA5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUKLQkJCSAgICBsb2NhdGlvbiAgIAkoODQ1LCAtOSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg5Mzg3ODAyQ0UiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNQotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MDUsIDY2MykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzU1LCA2NjMpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzc2lmaWVyIiBAMTEwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgMjI1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMTAKLQkJCWxvY2F0aW9uICAgCSgxMzAsIDIwNTkpCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MzYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFQ2xhc3NpZmllciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FDRTRGRUUwMzcxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTEwCi0JCQlsb2NhdGlvbiAgIAkoMTMwLCAyMTYyKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk2Ci0JCQltYXhfd2lkdGggIAk1MzgpCi0JCSAgICB3aWR0aCAgICAgIAk2NTQKLQkJICAgIGhlaWdodCAgICAgCTQxOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpBcnJheVR5cGUiIEAxMTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCAxMzI4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMTEKLQkJCWxvY2F0aW9uICAgCSgxMTIsIDEyNTUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDgwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQXJyYXlUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E5RDc5RUQwMURGIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTExCi0JCQlsb2NhdGlvbiAgIAkoMTEyLCAxMzExKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTQwNSkKLQkJICAgIHdpZHRoICAgICAgCTQ5OAotCQkgICAgaGVpZ2h0ICAgICAJMTY4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTlENzlGRDAxMEYiCi0JCSAgICBjbGllbnQgICAgIAlAMTExCi0JCSAgICBzdXBwbGllciAgIAlANTcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDMxLCAxMjQzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQzMSwgODAxKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBAMTEzCi0JCSAgICBsb2NhdGlvbiAgIAkoMzkzLCAxNzI5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0RGNENBQUQwMUEzIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb21wb25lbnRUeXBlIiBAMTE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU1LCAzODUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUKLQkJCQlQYXJlbnRfVmlldyAJQDExNAotCQkJCWxvY2F0aW9uICAgCSgzNzgsIDE5ODYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMyOAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2NvbXBvbmVudFR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNERjRDQUFFMDFFQiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYKLQkJCQlQYXJlbnRfVmlldyAJQDExNAotCQkJCWxvY2F0aW9uICAgCSg0NzcsIDIwMDgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDExNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkgICAgbG9jYXRpb24gICAJKC01NSwgMzg1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNERjRDQUFFMDFGNSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIiBAMTE4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyMjQsIDIyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMTgKLQkJCWxvY2F0aW9uICAgCSgyMDMzLCAxNDUpCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzODIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFU3RydWN0dXJhbEZlYXR1cmUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIKLQkJICAgIHdpZHRoICAgICAgCTQwMAotCQkgICAgaGVpZ2h0ICAgICAJMTgyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzREY0Q0U4MzAzOTAiCi0JCSAgICBjbGllbnQgICAgIAlANTYKLQkJICAgIHN1cHBsaWVyICAgCUAxMTgKLQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiSW1wb3J0cyIKLQkgICAgcXVpZCAgICAgICAJIjM4MTBBMERDMDE1RCIKLQkgICAgdGl0bGUgICAgICAJIkltcG9ydHMiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAxMjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzIwLCA2NzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEyMAotCQkJbG9jYXRpb24gICAJKDE4OSwgNjI2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgd2lkdGggICAgICAJMjgwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJDbGFzc0ltcG9ydHMiIEAxMjEKLQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDExMTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMgotCQkJUGFyZW50X1ZpZXcgCUAxMjEKLQkJCWxvY2F0aW9uICAgCSg2NzcsIDEwNDApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlhbmNob3IgICAgIAkxCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJDbGFzc0ltcG9ydHMiCi0JCQlwY3REaXN0ICAgIAkxLjA2NjY2NwotCQkJaGVpZ2h0ICAgICAJNzYKLQkJCW9yaWVudGF0aW9uIAkwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEJGMDAwRCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiY2xhc3NJbXBvcnQiIEAxMjMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMQotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDMzMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNAotCQkJCVBhcmVudF9WaWV3IAlAMTIzCi0JCQkJbG9jYXRpb24gICAJKDY2NSwgNjcxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitjbGFzc0ltcG9ydCIKLQkJCQlwY3REaXN0ICAgIAkwLjcyNzE1NAotCQkJCWhlaWdodCAgICAgCTIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRCRjAwMEUiCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjAKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNjQzLCAxMTE1KQotCQkJCSg3MDMsIDExMTUpCi0JCQkJKDcwMywgNjcyKQotCQkJCSg0NjAsIDY3MikpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjQzLCAxMTE1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjAsIDY3MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUKLQkJCQlQYXJlbnRfVmlldyAJQDEyMwotCQkJCWxvY2F0aW9uICAgCSg1MjUsIDcyMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MTQ2NzYKLQkJCQloZWlnaHQgICAgIAk1MQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNgotCQkJCVBhcmVudF9WaWV3IAlAMTIzCi0JCQkJbG9jYXRpb24gICAJKDc0MiwgNzM3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjU4NzQ2NwotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW1wb3J0ZWRCeSIgQDEyNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNywgMzMxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjcKLQkJCQlsb2NhdGlvbiAgIAkoMzMwLCA5MzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ltcG9ydGVkQnkiCi0JCQkJcGN0RGlzdCAgICAJMC43MDgwNDAKLQkJCQloZWlnaHQgICAgIAkxMAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEJGMDAwRiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg2NDMsIDExMTUpCi0JCQkJKDMyMCwgMTExNSkKLQkJCQkoMzIwLCA3MjkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0MywgMTExNSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzIwLCA3MjkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjcKLQkJCQlsb2NhdGlvbiAgIAkoMjgwLCA4MDIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODk3NjExCi0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFja2FnZSIgQDEzMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDA4LCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEzMAotCQkJbG9jYXRpb24gICAJKDEyNDcsIDE3OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFja2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgxMDhFMDMwMUQyIgotCQkgICAgd2lkdGggICAgICAJMzQwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJQYWNrYWdlSW1wb3J0cyIgQDEzMQotCQkgICAgbG9jYXRpb24gICAJKDEwMjMsIDM4MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyCi0JCQlQYXJlbnRfVmlldyAJQDEzMQotCQkJbG9jYXRpb24gICAJKDEwMzgsIDQxOSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWFuY2hvciAgICAgCTEKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhY2thZ2VJbXBvcnRzIgotCQkJcGN0RGlzdCAgICAJMC43NTAwMDAKLQkJCWhlaWdodCAgICAgCTM3Ci0JCQlvcmllbnRhdGlvbiAJMSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRFQzAyMDciCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImltcG9ydGVkQnkiIEAxMzMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDE3LCAtMzA2KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzMKLQkJCQlsb2NhdGlvbiAgIAkoNjQ4LCA0MzApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ltcG9ydGVkQnkiCi0JCQkJcGN0RGlzdCAgICAJMC42NDY1MjYKLQkJCQloZWlnaHQgICAgIAk0MQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEVFMDEwNSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMDIzLCAzODIpCi0JCQkJKDEwMjMsIDI1NSkKLQkJCQkoNDEzLCA2MTQpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUKLQkJCQlQYXJlbnRfVmlldyAJQDEzMwotCQkJCWxvY2F0aW9uICAgCSg1MTIsIDYxOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhY2thZ2VJbXBvcnRzIiBAMTM2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQxNywgLTMwNikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNwotCQkJCVBhcmVudF9WaWV3IAlAMTM2Ci0JCQkJbG9jYXRpb24gICAJKDEyMjMsIDU3OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzEyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFja2FnZUltcG9ydHMiCi0JCQkJcGN0RGlzdCAgICAJMC41MjI0NzIKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEVFMDBGQiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzMAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMDIzLCAzODIpCi0JCQkJKDEwMjMsIDYxOCkKLQkJCQkoMTI2NSwgNjE4KQotCQkJCSgxMzg2LCAyODEpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgKLQkJCQlQYXJlbnRfVmlldyAJQDEzNgotCQkJCWxvY2F0aW9uICAgCSgxNDA5LCAzNzgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkKLQkJCQlQYXJlbnRfVmlldyAJQDEzNgotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA1MDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNzY5NjYzCi0JCQkJaGVpZ2h0ICAgICAJMTA5Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiU291cmNlIGNvZGUiCi0JICAgIHF1aWQgICAgICAgCSIzODEwQTEzQjAxNTkiCi0JICAgIHRpdGxlICAgICAgCSJTb3VyY2UgY29kZSIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkNvbW1lbnQiIEAxNDAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTkyLCA2ODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0MAotCQkJbG9jYXRpb24gICAJKDQ3NSwgNjQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIzNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkNvbW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODlCMDJCOCIKLQkJICAgIHdpZHRoICAgICAgCTI1MgotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OlN0YXRlbWVudCIgQDE0MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCA2ODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0MQotCQkJbG9jYXRpb24gICAJKDk4MywgNjQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI0MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlN0YXRlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4QjkwMjVBIgotCQkgICAgd2lkdGggICAgICAJMjYwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SW5pdGlhbGl6ZXIiIEAxNDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ0LCAyODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0MgotCQkJbG9jYXRpb24gICAJKDMzLCAyNDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW5pdGlhbGl6ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTVEQzAwQkIiCi0JCSAgICB3aWR0aCAgICAgIAkyNDAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIgQDE0MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTYsIDExMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTQzCi0JCQlsb2NhdGlvbiAgIAkoMTYwLCA2NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxOTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGaWVsZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIHdpZHRoICAgICAgCTIxMAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIiBAMTQ0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDg2NCwgMzUyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDQKLQkJCWxvY2F0aW9uICAgCSg2OTIsIDI1NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCbG9jayIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTQ0Ci0JCQlsb2NhdGlvbiAgIAkoNjkyLCAzMTIpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJMjkwKQotCQkgICAgd2lkdGggICAgICAJMzYyCi0JCSAgICBoZWlnaHQgICAgIAkyMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNDUKLQkJICAgIGxvY2F0aW9uICAgCSg4NjQsIDU4MCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSg4NjQsIDU4MCkKLQkJCSg4NjQsIDQ1OSkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODhENjAwQTUiCi0JCSAgICBjbGllbnQgICAgIAlAMTQwCi0JCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU4MSwgNjMxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU4MSwgNTgwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTQ1KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODhEQTAwNTYiCi0JCSAgICBjbGllbnQgICAgIAlAMTQxCi0JCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMjEsIDYzMCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIxLCA1ODApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNDUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMTQ4Ci0JCSAgICBsb2NhdGlvbiAgIAkoNDczLCAzMDApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDMzMwMzZBIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzb3VyY2UiIEAxNDkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OAotCQkJICAgIGxvY2F0aW9uICAgCSgxNTMsIC0zODgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTAKLQkJCQlQYXJlbnRfVmlldyAJQDE0OQotCQkJCWxvY2F0aW9uICAgCSg1OTksIDI2NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTQ1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrc291cmNlIgotCQkJCXBjdERpc3QgICAgCTAuNTk5MzkzCi0JCQkJaGVpZ2h0ICAgICAJMzQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUMzODAxNDAiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0OAotCQkJICAgIHN1cHBsaWVyICAgCUAxNDQKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzMsIDMwMCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjgzLCAzMDApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUxCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDkKLQkJCQlsb2NhdGlvbiAgIAkoNjA1LCAzMzQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNjM1MjY2Ci0JCQkJaGVpZ2h0ICAgICAJMzQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0aWFsaXplciIgQDE1MgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4Ci0JCQkgICAgbG9jYXRpb24gICAJKDE1MywgLTM4OCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUMzODAxNjgiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0OAotCQkJICAgIHN1cHBsaWVyICAgCUAxNDIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzMsIDMwMCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY0LCAzMDApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBAMTUzCi0JCSAgICBsb2NhdGlvbiAgIAkoNjcxLCAxMTQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NAotCQkJUGFyZW50X1ZpZXcgCUAxNTMKLQkJCWxvY2F0aW9uICAgCSg2NzEsIDU1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaGlkZGVuICAgICAJVFJVRQotCQkJYW5jaG9yICAgICAJMQotCQkJYW5jaG9yX2xvYyAJMQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSIiCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJaGVpZ2h0ICAgICAJNjAKLQkJCW9yaWVudGF0aW9uIAkwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzU2MDJBMiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdGlhbGl6ZXIiIEAxNTUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJICAgIGxvY2F0aW9uICAgCSgzMTksIC0zMzQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTYKLQkJCQlQYXJlbnRfVmlldyAJQDE1NQotCQkJCWxvY2F0aW9uICAgCSg5NTQsIDIxMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTk1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW5pdGlhbGl6ZXIiCi0JCQkJcGN0RGlzdCAgICAJMC44OTE4MjcKLQkJCQloZWlnaHQgICAgIAkxMDQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUM1NzAyREYiCi0JCQkgICAgY2xpZW50ICAgICAJQDE1MwotCQkJICAgIHN1cHBsaWVyICAgCUAxNDQKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNjcxLCAxMTQpCi0JCQkJKDg1MCwgMTE0KQotCQkJCSg4NTAsIDI0NSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjcxLCAxMTQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg1MCwgMjQ1KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NwotCQkJCVBhcmVudF9WaWV3IAlAMTU1Ci0JCQkJbG9jYXRpb24gICAJKDc5MCwgMjE4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkxMzQ2MgotCQkJCWhlaWdodCAgICAgCTYxCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZmllbGQiIEAxNTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJICAgIGxvY2F0aW9uICAgCSgzMTksIC0zMzQpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDNTcwMzA3IgotCQkJICAgIGNsaWVudCAgICAgCUAxNTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTQzCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjcxLCAxMTQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2MSwgMTE0KSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDE1OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyODgsIDQ5NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTU5Ci0JCQlsb2NhdGlvbiAgIAkoMTkwLCA0NTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgd2lkdGggICAgICAJMjE0Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDE2MAotCQkgICAgbG9jYXRpb24gICAJKDU5NiwgNDk2KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQ0E1MDFFNyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic291cmNlIiBAMTYxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc2LCAtNDQ4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYyCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjEKLQkJCQlsb2NhdGlvbiAgIAkoNjkwLCA0NjMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NvdXJjZSIKLQkJCQlwY3REaXN0ICAgIAkwLjQ3NDc3NwotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDQTcwMTdDIgotCQkJICAgIGNsaWVudCAgICAgCUAxNjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDU5NiwgNDk2KQotCQkJCSg3NTksIDQ5NikKLQkJCQkoNzU5LCA0NTkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU5NiwgNDk2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTksIDQ1OSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjMKLQkJCQlQYXJlbnRfVmlldyAJQDE2MQotCQkJCWxvY2F0aW9uICAgCSg4MTcsIDQ3NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MTUzNjcKLQkJCQloZWlnaHQgICAgIAk1OAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZCIgQDE2NAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NiwgLTQ0OCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUNBNzAxQjgiCi0JCQkgICAgY2xpZW50ICAgICAJQDE2MAotCQkJICAgIHN1cHBsaWVyICAgCUAxNTkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTYsIDQ5NikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzk1LCA0OTYpKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRGF0YSBUeXBlcyIKLQkgICAgcXVpZCAgICAgICAJIjM4MTBBMUNFMDJFQiIKLQkgICAgdGl0bGUgICAgICAJIkRhdGEgVHlwZXMiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpUeXBlS2luZCIgQDE2NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDIyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQlsb2NhdGlvbiAgIAkoNzcsIDg0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlR5cGVLaW5kIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJbG9jYXRpb24gICAJKDc3LCAzOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjQ2MDAyQkYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNjUKLQkJCWxvY2F0aW9uICAgCSg3NywgMTQwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTI3NykKLQkJICAgIHdpZHRoICAgICAgCTM0NAotCQkgICAgaGVpZ2h0ICAgICAJMzkyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFWaXNpYmlsaXR5S2luZCIgQDE2NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDY0MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY2Ci0JCQlsb2NhdGlvbiAgIAkoNjgsIDUwMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhVmlzaWJpbGl0eUtpbmQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY2Ci0JCQlsb2NhdGlvbiAgIAkoNjgsIDQ1NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQ0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODIzMzNCRTAzMkUiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNjYKLQkJCWxvY2F0aW9uICAgCSg2OCwgNTU2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTI5MikKLQkJICAgIHdpZHRoICAgICAgCTM2MgotCQkgICAgaGVpZ2h0ICAgICAJMzkyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IE5vdGVWaWV3IEAxNjcKLQkJICAgIGxvY2F0aW9uICAgCSgxMjk2LCAyMDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NwotCQkJbG9jYXRpb24gICAJKDg4NywgNTIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNzgzCi0JCQlsYWJlbCAgICAgIAkKLXxUaGUgSmF2YSBwcmltaXRpdmUgdHlwZXMgYXJlIGluc3RhbmNlcyBvZiBKYXZhRGF0YVR5cGUuICBUaGUgY29tbW9uIHBhcmVudCBjbGFzcyB3aXRoIEphdmFDbGFzcyBpcyBDbGFzc2lmaWVyLiAgVGhlIHByaW1pdGl2ZSB0eXBlcyBjYW4gYmUgb2J0YWluZWQgdmlhIGEgSmF2YVVSTCgiaW50IiksIHdoaWNoIHJlc29sdmVzIHRvIGEgcmVmZXJlbmNlIGxpa2U6ICJqYXZhOi8jaW50IgotCQkJKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTg0MwotCQkgICAgaGVpZ2h0ICAgICAJMzI1KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXJLaW5kIiBAMTY4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI1NiwgMTA4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY4Ci0JCQlsb2NhdGlvbiAgIAkoNjMsIDk0OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzODYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFyYW1ldGVyS2luZCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjgKLQkJCWxvY2F0aW9uICAgCSg2MywgOTAzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzODYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTFDMUU4RjAxMjMiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNjgKLQkJCWxvY2F0aW9uICAgCSg2MywgMTAwNCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk1Ci0JCQltYXhfd2lkdGggIAkyMDcpCi0JCSAgICB3aWR0aCAgICAgIAk0MDQKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBOb3RlVmlldyBAMTY5Ci0JCSAgICBsb2NhdGlvbiAgIAkoNzY4LCAxMTIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjkKLQkJCWxvY2F0aW9uICAgCSg1NzQsIDEwMTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJMzUyCi0JCQlsYWJlbCAgICAgIAkiVGVtcG9yYXJ5IGVudW0gZm9yIEphdmEgcGFyYW1ldGVyIGtpbmQgdW50aWwgd2UgZ2V0IHRoZSBiYXNlIHNvcnRlZCBvdXQiKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTQxMgotCQkgICAgaGVpZ2h0ICAgICAJMjE5KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFEYXRhVHlwZSIgQDE3MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTY4LCAxNDA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzAKLQkJCWxvY2F0aW9uICAgCSg5OTksIDEzNjIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzM4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YURhdGFUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzk1OTEzMzQwMzE2IgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVEYXRhVHlwZSIgQDE3MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA2NDApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3MQotCQkJbG9jYXRpb24gICAJKDgxMiwgNTExKQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTUyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRURhdGFUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1MjUwMzNFIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTcxCi0JCQlsb2NhdGlvbiAgIAkoODEyLCA2MTEpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1MjIpCi0JCSAgICB3aWR0aCAgICAgIAk1NzAKLQkJICAgIGhlaWdodCAgICAgCTI4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxNzIKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUAxNjkKLQkJICAgIHN1cHBsaWVyICAgCUAxNjgKLQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiSmF2YSBUeXBlcyIKLQkgICAgcXVpZCAgICAgICAJIjNCNjVCODIzMDIwRCIKLQkgICAgdGl0bGUgICAgICAJIkphdmEgVHlwZXMiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIGRpYWdyYW0gY29udGFpbnMgdGhlIEphdmEgVHlwZXMgdGhhdCBhcmUgbm90IEVNRiBjbGFzc2VzIGJ1dCBhcmUgcmVmZXJlbmNlZCBpbiB0aGlzIGRpYWdyYW0uIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJNDc4Ci0JICAgIG9yaWdpbl95ICAgCTM1Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SlR5cGVKYXZhSGVscGVycyIgQDE3MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDIwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTczCi0JCQlsb2NhdGlvbiAgIAkoMzk4LCAxNTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTAyOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTczCi0JCQlsb2NhdGlvbiAgIAkoMzk4LCAxMDkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTEwMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE3MwotCQkJbG9jYXRpb24gICAJKDM5OCwgMjEwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTg3MykKLQkJICAgIHdpZHRoICAgICAgCTEwNDYKLQkJICAgIGhlaWdodCAgICAgCTIyMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKVHlwZUxpc3QiIEAxNzQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3NAotCQkJbG9jYXRpb24gICAJKDYyOCwgNTIzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUwNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkpUeXBlTGlzdCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzQKLQkJCWxvY2F0aW9uICAgCSg2MjgsIDQ3OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTA0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNzQKLQkJCWxvY2F0aW9uICAgCSg2MjgsIDU3OSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1MDcpCi0JCSAgICB3aWR0aCAgICAgIAk1MjIKLQkJICAgIGhlaWdodCAgICAgCTIxOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbmNlLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFuY2UubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTAwN2U1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFuY2UubWRsCisrKyAvZGV2L251bGwKQEAgLTEsODY2OSArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIklERSIKLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyIKLQkgICAgdmFsdWUgICAgICAJIiIpKQotICAgIHF1aWQgICAgICAgCSIzQTc5RUJBNTAzMzEiCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJRkFMU0UKLQlncmlkWCAgICAgIAkxNgotCWdyaWRZICAgICAgCTE2Ci0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udAotCSAgICBzaXplICAgICAgIAkxMAotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JICAgIGJvbGQgICAgICAgCUZBTFNFCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JICAgIHVuZGVybGluZSAgCUZBTFNFCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JICAgIGNvbG9yICAgICAgCTAKLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQlzaG93TWVzc2FnZU51bSAJMQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3IgotCXF1aWQgICAgICAgCSIzQTc5OTlBRDAyOTciCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQTc5OTlCNzAyRjYiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyIKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMjhFIgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyIKLQlxdWlkdSAgICAgIAkiM0I4NkYxNzIwMTZGIgotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImluc3RhbnRpYXRpb24iCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5qZW1cXHJvc2VcXGluc3RhbnRpYXRpb24uY2F0IgotCQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTgwIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWNvcmUiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRWNvcmUuY2F0IgotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTczIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbiIgQDEKLQkJCWxvY2F0aW9uICAgCSgzMzQsIDI0MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTAsIDE1NikKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImluc3RhbnRpYXRpb24iKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjNCODZGMTcyMDE4MCIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJEZXBlbmRlbmNpZXMgKERvbid0IGVkaXQpIgotCQlxdWlkICAgICAgIAkiM0I4NkYzMUYwMjgxIgotCQl0aXRsZSAgICAgIAkiRGVwZW5kZW5jaWVzIChEb24ndCBlZGl0KSIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMgotCQkJbG9jYXRpb24gICAJKDc1MywgNjg1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkgICAgbG9jYXRpb24gICAJKDMwNSwgNTM5KQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJNgotCQkJICAgIG1heF93aWR0aCAgCTg2MAotCQkJICAgIGxhYmVsICAgICAgCSJUaGVzZSBhcmUgdGhlIGRlcGVuZGVuY2llcy4gVGhleSBhcmUgbm90IHRvIGJlIGVkaXRlZC4gVGhleSBtdXN0IG9ubHkgYmUgZWRpdGVkIGJ5IHRoZWlyIG93bmVyIG1vZGVscy4iKQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJODQyMTYzMQotCQkJd2lkdGggICAgICAJOTIwCi0JCQloZWlnaHQgICAgIAkzMDUpCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDMKLQkJCWxvY2F0aW9uICAgCSgyNjMsIDE4NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJICAgIGxvY2F0aW9uICAgCSgxMTksIDEwMSkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzOUE1RUQwNDAwNEUiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyIKLQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTZGIgotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzYiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3NlcwotCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzAiCi0JUHJvY3NORGV2cyAJKGxpc3QKLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyIKLQkJcXVpZCAgICAgICAJIjNCODZGMTcyMDE3MiIKLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMKLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCS0yKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keSIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIgotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkZyZWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iCi0JCQkJdmFsdWUgICAgICAJMjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVJbXBsZW1lbnRhdGlvblNldCIgMjA4KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk1peGluIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJUYXNrIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMjI1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjI2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiCi0JCQkJdmFsdWUgICAgICAJMjI5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBdXRvIgotCQkJCXZhbHVlICAgICAgCTIzMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudHJ5QmFycmllckNvbmRpdGlvbiIKLQkJCXZhbHVlICAgICAgCSJUcnVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU3BlYyIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5IgotCQkJCXZhbHVlICAgICAgCTIzMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ2xlYXJDYXNlIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJInByb2plY3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIgotCQkJdmFsdWUgICAgICAJMSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEQk1TIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNWaWV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiIKLQkJCXZhbHVlICAgICAgCSJOb25lIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJZGVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTmF0aXZlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUmVsYXRpb25zaGlwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUklNZXRob2QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzQ2x1c3RlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJLZXlMaXN0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmVyYWxNb2RlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJbnNlcnRFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmT2xkVGFibGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk5ld1JvdyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb3ciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxhbmd1YWdlIgotCQkJdmFsdWUgICAgICAJIlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSIKLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJTdHlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzT3V0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTSIKLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCIKLQkJCXZhbHVlICAgICAgCSI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxjaGFyc2V0cy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxqY2UuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcanNzZS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxydC5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzdW5yc2FzaWduLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcZG5zbnMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxsZGFwc2VjLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcbG9jYWxlZGF0YS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXHN1bmpjZV9wcm92aWRlci5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzZWN1cml0eVxcbG9jYWxfcG9saWN5LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHNlY3VyaXR5XFxVU19leHBvcnRfcG9saWN5LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFxkdC5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcaHRtbGNvbnZlcnRlci5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcdG9vbHMuamFyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3VuIgotCQkJCXZhbHVlICAgICAgCTIwMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZBSmF2YVdvcmtpbmdGb2xkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJInZvaWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiCi0JCQl2YWx1ZSAgICAgIAkzKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZW1vdGVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU291cmNlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1NlbGVjdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ0NvbW1lbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIgotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTkwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMTkwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiCi0JCQkJdmFsdWUgICAgICAJMTkwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIgotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJBRlRFUiIKLQkJCQl2YWx1ZSAgICAgIAkxODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSIKLQkJCQl2YWx1ZSAgICAgIAkxODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlJPVyIKLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCIKLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCIKLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIjIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIjYiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUmVxdWlzaXRlUHJvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjIuMV9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJTb0RBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJlbnVtIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiCi0JCQkJdmFsdWUgICAgICAJMTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiaW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTEwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyIKLQkJCQl2YWx1ZSAgICAgIAkxMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJhbGlhcyIKLQkJCQl2YWx1ZSAgICAgIAkxMDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJtYXgiCi0JCQkJdmFsdWUgICAgICAJMTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTEwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkia2luZCIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUtpbmRzIiAxMDkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidXVpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImFsaWFzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInV1aWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBmaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkibGNpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTIxMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCYXNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjAiCi0JCQkJdmFsdWUgICAgICAJMjIzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiMSIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyIKLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiQmluYXJ5IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlRleHQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQnlWYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5jcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAktMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIgotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIzIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNCIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGVwbG95IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjb25zdHJhaW50cyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbENvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb250ZW50S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkNvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbXB0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTWl4ZWQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudE9ubHkiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY5IikpCi0JcXVpZCAgICAgICAJIjNCODZGMTcyMDE3MSIpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW50aWF0aW9uLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFudGlhdGlvbi5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjAxODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW50aWF0aW9uLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDI4MDAgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImluc3RhbnRpYXRpb24iCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwiKSkpCi0gICAgcXVpZCAgICAgICAJIjNCODZGMTcyMDE4MCIKLSAgICBkb2N1bWVudGF0aW9uIAkiSmF2YSBJbnN0YW50aWF0aW9uIFBhY2thZ2UiCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3MgIklKYXZhRGF0YVR5cGVJbnN0YW5jZSIKLQkgICAgcXVpZCAgICAgICAJIjNCOEFCMTc4MDJCMSIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNFNTI5NTYyMDE0RSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhSW5zdGFuY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3NUEwMkQ0IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCOEFCMTkxMDBDMiIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUphdmFJbnN0YW5jZSIKLQkgICAgcXVpZCAgICAgICAJIjNFNTE1NzVBMDJENCIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIgotCQkgICAgcXVpZCAgICAgICAJIjNFNTE1Nzc4MDJCOSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUphdmFPYmplY3RJbnN0YW5jZSIKLQkgICAgcXVpZCAgICAgICAJIjNCNzgyRDc5MDI5NiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaW50ZXJmYWNlIGlzIHRoZSBpbnN0YW5jZSBvZiBhbiBqYXZhIG9iamVjdCBpbiB0aGUgamF2YSBtb2RlbC4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRTUxNTdEQTAzREQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1NzVBMDJENCIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I3ODMwMTgwMUM5IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhQWxsb2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFNjkwMDA2MSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBjbGFzcyBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB0aGUgYWxsb2NhdGlvbiBjbGFzcy4gSXQgaXMgdGhlIHZhbHVlIG9mIHRoZSAiYWxsb2NhdGlvbiIgcHJvcGVydHkgb24gYSBKYXZhIE9iamVjdCBzbyB0aGF0IHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBjYW4gYmUgY29udHJvbGxlZC4gRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIG9uZSBmb3IganVzdCBpbml0IHN0cmluZywgb3Igb25lIGZvciBzZXJpYWxpemVkLgotCSAgICAKLQkgICAgYWJzdHJhY3QgICAJVFJVRSkKLQkob2JqZWN0IENsYXNzICJJbml0U3RyaW5nQWxsb2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFQUY5MDAxRSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhbGxvY2F0aW9uIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSByZW1vdGUgdm0uIEl0IHVzZXMgdGhlIGFsbG9jU3RyaW5nLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGRDlFQjc1MDJEQSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkphdmFBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFNjkwMDA2MSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbml0U3RyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNGRkRFMURFMDMyRSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcgZm9yIHRoaXMgb2JqZWN0LiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkltcGxpY2l0QWxsb2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFQzE0MDI0MiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgaXMgZm9yIGFuIGltcGxpY2l0IGFsbG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBjb21lcyBmcm9tIHRoZSBmZWF0dXJlIG9mIGFub3RoZXIgb2JqZWN0LiBJdCBpcyB0aGUgbGl2ZSBKYXZhIHZhbHVlIGZyb20gdGhlIHJlbW90ZSB2bS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUM0NzAwRTciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpKYXZhQWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RTY5MDAwNjEiKSkpCi0JKG9iamVjdCBDbGFzcyAiUGFyc2VUcmVlQWxsb2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgyQzkxMDAwNSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkFsbG9jYXRpb25zIHZpYSBQYXJzZSBUcmVlcy4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MkNCNzAxRDYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpKYXZhQWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RTY5MDAwNjEiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODJEMEEwMUNCIgotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQotCShvYmplY3QgQ2xhc3MgIlBUQXJyYXlBY2Nlc3MiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MkUxNDAyNTAiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfEFycmF5IGFjY2Vzcy4gZS5nLiB4WzNdLiAKLXwKLXxVbmxpa2UgQVNULCB0aGUgZW50aXJlIGV4cHJlc3Npb24gb2YgdHlwZSB4WzNdWzRdIHdpbGwgYmUgZG9uZSBpbiBvbmUgZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBoYXZpbmcgYSBzZXBhcmF0ZSBBcnJheUFjY2VzcyBmb3IgZWFjaCBkaW1lbnNpb24uIFRoaXMgaXMganVzdCBhIHNpbXBsaWZpY2F0aW9uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgaWYgaXQgaXMgYSBzaW1wbGUgYXJyYXkgYWNjZXNzIHdoZXJlIGl0IGlzIG9mIHRoZSBmb3JtIHtleHByZXNzaW9ufVtleHByZXNzaW9uXVtleHByZXNzaW9uXS4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MkU2RjAxRjciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFycmF5IgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgyRThFMDIzNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGFycmF5IHRvIGFjY2Vzcy4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmRleGVzIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgyRTlCMDA3RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbnMgcmVwcmVzZW50aW5nIHRoZSBpbmRleGVzIG9mIHRoZSBhY2Nlc3MuIgotCQkgICAgc3RlcmVvdHlwZSAJIjEuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRBcnJheUNyZWF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODM3MTIwMjVBIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBcnJheSBDcmVhdGlvbiBleHByZXNzaW9uLCBlLmcuIG5ldyBpbnRbM10gb3IgbmV3IGphdmEubGFuZ1N0cmluZ1tdW10ge3siYSJ9LCB7ImIifX0KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MzcyMTAwNDkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM3RTkwMkJEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSwgZS5nLiBpbnRbXVtdIG9yIGphdmEubGFuZy5TdHJpbmdbXSwgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgZGltZW5zaW9uIGJyYWNrZXRzLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGltZW5zaW9ucyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4Mzg5NTAxRTgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgZm9yIHRoZSBkaW1lbnNpb25zLiBZb3UgY2FuIGhhdmUgWzNdWzRdW10gYnV0IFtdWzMzXSBpcyBpbnZhbGlkLiBTbyBmb3IgZWFjaCBkaW1lbnNpb24gdGhhdCBoYXMgYW4gZXhwcmVzc2lvbiwgdGhlcmUgd2lsbCBiZSBhbiBlbnRyeSBpbiB0aGUgbGlzdCwgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIFdoZW4geW91IHJlYWNoIHRoZSBlbXB0eSBkaW1lbnNpb25zLCB0aGUgbGlzdCB3aWxsIGVuZCB0b28uICIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5pdGlhbGl6ZXIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM5N0MwMjMxIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGluaXRpYWxpemVyLCBpZiBhbnksIGZvciB0aGlzIGFycmF5LiBFLmcuIG5ldyBpbnRbXSB7MiwzfS4gSXQgaXMgdGhlIHsyLDN9LiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEFycmF5SW5pdGlhbGl6ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM5NjgwMTRDIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEFycmF5SW5pdGlhbGl6ZXIiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4Mzk2ODAxNEMiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBcnJheSBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uLiBUaGlzIGlzIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciBjb250YWluZWQgd2l0aGluIHRoZSBleHByZXNzaW9ucyBsaXN0IGZvciB0aGUgdG9wIEFycmF5SW5pdGlhbGl6ZXIuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM5NzkwMDM4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHByZXNzaW9ucyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0E1NzAwRUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpc3RoZSBsaXN0IG9mIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgaW5pdGlhbGl6ZXIsIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgZmlyc3QgY2FzZSBpdCB3aWxsIGJlIHR3byBOdW1iZXJMaXRlcmFscy4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyLCBmb2xsb3dlZCBieSBhIE51bWJlckxpdGVyYWwuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRCb29sZWFuTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgzQUU3MDI0NyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBib29sZWFuIGxpdGVyYWwsIGkuZS4gdHJ1ZSBvciBmYWxzZSBkaXJlY3RseSBpbiB0aGUgY29kZS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0IxRDAwMDAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJvb2xlYW5WYWx1ZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0IzRDAwMUEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHZhbHVlIG9mIHRoZSBsaXRlcmFsLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVENhc3RFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODNCNkYwMDU4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiQ2FzdCBleHByZXNzaW9uLCBlLmcuIChzaG9ydCkgMTAiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0JENjAzMDkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCOTYwMEY0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG9mIHRoZSBjYXN0LCBlLmcuIGludCBvciBqYXZhLmxhbmcuU3RyaW5nIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHByZXNzaW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzQkI2MDMzRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbiBiZWluZyBjYXN0ZWQuIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQ2hhcmFjdGVyTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg0REYxMDI3NyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBjaGFyYWN0ZXIgZXhwcmVzc2lvbiwgZS5nLiAnYScgb3IgJ1xccicuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRFMTMwMUVBIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlc2NhcGVkVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRFMzkwMTRFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gJ2EnIG9yICdcXHInLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHNpbmdsZSBxdW90ZXMgdGhlbXNlbHZlcy4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNoYXJWYWx1ZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NEVCNzAyQ0MiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGFjdHVhbCBwcmltaXRpdmUgY2hhcmFjdGVyIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LiIKLQkJICAgIHR5cGUgICAgICAgCSJjaGFyIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg0RjQwMDI2RiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18Q2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbi4gRS5nLiBuZXcgU3RyaW5nKCJhIikKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NEY0QzAyRjgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRGQUQwMjk0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgY2xhc3MuIEUuZy4gamF2YS5sYW5nLlN0cmluZy4gVGhpcyBzaG91bGQgYmUgZnVsbHktcXVhbGlmaWVkIGZvciBhbGxvY2F0aW9uIHB1cnBvc2VzLiBJdCBzaG91bGQgYWxzbyBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBpZiBYIGlzIGFuIGlubmVyIGNsYXNzIG9mIGouWSwgdGhlbiB0aGUgdHlwZSBoZXJlIHNob3VsZCBiZSAiai5ZJFgiLiAKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcmd1bWVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUxNUUwMTM4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODUxRkIwMjZBIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHRlc3QgRXhwcmVzc29uLCBlLmcuICh4PTMpID8gMSA6IDIiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTI3NDAxMkUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbmRpdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTIxRDAyQUYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGNvbmRpdGlvbiBleHByZXNzaW9uLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRydWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUyNDEwMzMzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0cnVlIGV4cHJlc3Npb24iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWxzZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTI1RjAyOTYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGZhbHNlIGV4cHJlc3Npb24uIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBURmllbGRBY2Nlc3MiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NTJERjAyMDQiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBY2Nlc3MgYSBmaWVsZCBleHByZXNzaW9uLCBlLmcuIGphdmEuYXd0LkNvbG9yLnJlZCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MzVEMDI0MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVjZWl2ZXIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUzMTMwMTJDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0IHRoYXQgdGhlIGZpZWxkIGlzIGluLCBlLmcuIGphdmEuYXd0LkNvbG9yLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MzQ1MDBBQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgYWNjZXNzZWQsIGUuZy4gcmVkLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW5maXhFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODUzOEIwMTQzIgotCSAgICBkb2N1bWVudGF0aW9uIAkiQW4gZXhwcmVzc2lvbiB3aXRoIGFuIG9wZXJhdG9yIHRoYXQgaGFzIHR3byBvcGVyYW5kcywgZS5nLiAzICsgNC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTU3MDAwMzIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxlZnRPcGVyYW5kIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1M0FDMDAwMCIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wZXJhdG9yIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1M0I2MDBENyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgb3BlcmF0b3IsIGUuZy4gKyIKLQkJICAgIHR5cGUgICAgICAgCSJQVEluZml4T3BlcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUzRTEwMzU5IgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJpZ2h0T3BlcmFuZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTQwRDAxODYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcmlnaHQgZXhwcmVzc2lvbi4gaS5lLiA0IG9mICIzICsgNCIKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5kZWRPcGVyYW5kcyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTUxMTAzOUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVXNlZCB3aGVuIHRoZXJlIGFyZSBhIHNlcmllcyBvZiBpbmZpeCBvcGVyYXRpb25zIG9mIHRoZSBzYW1lIG9wZXJhdG9yLCBlLmcuIDEgKyAyICsgMyArIDQuIDEgYW5kIDIgd2lsbCBnbyBpbnRvIGxlZnQgYW5kIHJpZ2h0LCB3aGlsZSB7MywgNH0gd2lsbCBnbyBpbnRvIHRoZSBleHRlbmRlZCBvcGVyYW5kcy4gIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRJbmZpeE9wZXJhdG9yIgotCSAgICBxdWlkICAgICAgIAkiNDAwODUzRTEwMzU5IgotCSAgICBkb2N1bWVudGF0aW9uIAkiRW51bWVyYXRvciBmb3IgdGhlIG9wZXJhdG9yIG9uIGFuIEluZml4RXhwcmVzc2lvbi4iCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVElNRVMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2ODMwMjQwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiogb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRElWSURFIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NjhFMDFFMiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIvIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJFTUFJTkRFUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY5MjAyQkEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiJSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQTFVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1Njk3MDM5RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIrIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk1JTlVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NjlDMDFEOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSItIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxFRlRfU0hJRlQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2QjUwMjc0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIjw8IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJJR0hUX1NISUZUX1NJR05FRCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZCQTAwQ0QiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPj4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUklHSFRfU0hJRlRfVU5TSUdORUQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2QzMwMzhEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIj4+PiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMRVNTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkNDMDNDQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI8ICBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJHUkVBVEVSIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkQ5MDAxRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI+IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxFU1NfRVFVQUxTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkREMDA0QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI8PSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJHUkVBVEVSX0VRVUFMUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZFNTAyOUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPj0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRVFVQUxTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkVDMDI3MyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI9PSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOT1RfRVFVQUxTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkY5MDM5RSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIhPSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJYT1IiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU3MDEwMzI4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIl4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQU5EIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzEyMDM0QSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSImIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk9SIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzA0MDJGQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJ8ICBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDT05ESVRJT05BTF9BTkQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU3MTYwMDc1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiYmIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNPTkRJVElPTkFMX09SIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzI2MDJCRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJ8fCBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRJbnN0YW5jZW9mIgotCSAgICBxdWlkICAgICAgIAkiNDAwODU3RDMwM0EyIgotCSAgICBkb2N1bWVudGF0aW9uIAkiSW5zdGFuY2VvZiBleHByZXNzaW9uLCBlLmcuIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU4OTEwM0FGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcGVyYW5kIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1ODA3MDIzNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdmFsdWUgdG8gdGVzdCwgZS5nLiB4IGluIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTgyQTAyMjAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHRlc3QsIGUuZy4gamF2YS5sYW5nLlN0cmluZy4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRNZXRob2RJbnZvY2F0aW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODU4QjYwMThCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiTWV0aG9kSW52b2NhdGlvbiBleHByZXNzaW9uLCBlLmcuIHguZ2V0WSgzKSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QjlEMDA2NyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVjZWl2ZXIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCMEEwMUVDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18V2hvIHRoZSBtZXRob2QgaXMgaW52b2tlZCBhZ2FpbnN0LiBUaGlzIG1heSBiZSBub3Qgc2V0LCB3aGljaCBtZWFucyAidGhpcyIuIEl0IG1heSBhbHNvIGJlIGEgTmFtZSwgd2hpY2ggd291bGQgbWVhbiBhIGNsYXNzIGxpa2UgImphdmEubGFuZy5TdHJpbmciCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCNjEwMEQ5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgaW52b2tlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFyZ3VtZW50cyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUI2OTAyRUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGxpc3Qgb2YgYXJndW1lbnRzLCBpZiBhbnksIHRvIHRoZSBtZXRob2QuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFROYW1lIgotCSAgICBxdWlkICAgICAgIAkiNDAwODU4RUEwMjgwIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIHJlcHJlc2VudHMgYSBuYW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIHRoZSByZWNlaXZlciBvZiBhIG1ldGhvZCBpbnZvY2F0aW9uLCBlLmcuIHguZ2V0WSgpIG9yIGphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCkuIEluIHRoZXNlIGNhc2VzIHlvdSB3b3VsZCBoYXZlIGEgbmFtZSBvZiAieCIgb3IgImphdmEubGFuZy5TdHJpbmciLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QkExMDBEQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDBDMTEwNDAxQkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG5hbWUsIHdoaWNoIGNhbiBiZSBhIHR5cGUgb3IgYSB2YXJpYWJsZS4gSWYgaXQgaXMgYSB0eXBlLCB0aGVuICBpdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVE51bGxMaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODVCQkYwMDIwIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICJudWxsIgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QkQ0MDJGMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFROdW1iZXJMaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODVDNDAwMzVCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiUmVwcmVzZW50IGEgbnVtYmVyIHByaW1pdGl2ZSBsaXRlcmFsLCBlLmcuIDEwLiBPbmUgb3B0aW1pemF0aW9uIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQgaXMgdGhhdCBpZiBhbiBleHByZXNzaW9uIGlzIG9mIHRoZSBmb3JtICtudW1iZXIgb3IgLW51bWJlciwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSBhIFByZWZpeEV4cHJlc3Npb24gd2l0aCBhIE51bWJlckxpdGVyYWwgdG8ganVzdCBhIE51bWJlckxpdGVyYWwuIFRoaXMgd2lsbCBzaW1wbGlmeSB0aGUgbW9kZWwuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVDRUYwMjQ0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0b2tlbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUNBQTAyNEYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHRva2VuIHZhbHVlLCBlLmcuIDEwLCAxMGQsIG9yIC0xMC43NSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NUNGOTAwN0MiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBbiBleHByZXNzaW9uIHdpdGhpbiBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1RjRFMDNFMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhwcmVzc2lvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUYyMjAxMkIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgZXhwcmVzc2lvbiB3cmFwcGVkIGJ5IHRoZSBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSB0aGVuIHRoZSBleHByZXNzaW9uIGlzICJ4KzMiCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVFByZWZpeEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NUZBRDAwOEIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfEEgb25lIG9wZXJhbmQgb3BlcmF0b3IsIHdoZXJlIHRoZSBvcGVyYXRvciBjb21lcyBiZWZvcmUgdGhlIG9wZXJhbmQsIGUuZy4gLSAoeCszKS4gSW4gQVNULCBldmVuIC0zIGlzIG1vZGVsZWQgYXMgYSBQcmVmaXhFeHByZXNzaW9uIG9mIG9wZXJhdG9yICItIiBhbmQgZXhwcmVzc2lvbiBvZiBOdW1iZXJMaXRlcmFsKDMpLiBCdXQgd2Ugb3B0aW1pemUgdGhpcyBhd2F5IGFuZCBqdXN0IHVzZSBhIE51bWJlckxpdGVyYWwoLTMpIGRpcmVjdGx5IGluc3RlYWQuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYyREMwMUQ3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcGVyYXRvciIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjBCQzAxOTkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG9wZXJhdG9yIG9mIHRoaXMgZXhwcmVzc2lvbi4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRQcmVmaXhPcGVyYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjAyNDAwRDIiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhwcmVzc2lvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjBDNTAwNjUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb24gdGhhdCB0aGUgb3BlcmF0b3IgaXMgYXBwbGllZCB0by4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRQcmVmaXhPcGVyYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDI0MDBEMiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBwcmVmaXggZXhwcmVzc2lvbiBvcGVyYXRvci4gV2UgYXJlIG5vdCBtb2RlbGluZyArKyBhbmQgLS0uIgotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBMVVMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwNkYwMUI2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIisgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTUlOVVMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwNzIwM0I5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIi0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ09NUExFTUVOVCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjA3ODAwQUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkifiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOT1QiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwN0QwMTQ4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiEgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUU3RyaW5nTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2MUUyMDAwQiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZS5nLiAiYXNkZiIuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYyRDcwMzM4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlc2NhcGVkVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYxRkMwMUNCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgZXNjYXBlZCBzdHJpbmcuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAiYWIiIG9yICJjXHIiLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHF1b3RlcyB0aGVtc2VsdmVzLgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpdGVyYWxWYWx1ZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjIwQTAwQkQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGFjdHVhbCBzdHJpbmcgd2l0aG91dCB0aGUgcXVvdGVzLiBFc2NhcGUgYXJlIGV2YWx1YXRlZCBhbmQgdHVybmVkIGludG8gdGhlaXIgY2hhcmFjdGVyIHZhbHVlLiBUaGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLiBJZiBub3Qgc2V0IHdoZW4gY3JlYXRlZCB3aGVuIHF1ZXJpZWQgaXQgd2lsbCBjcmVhdGUgaXQuIFR5cGljYWxseSBpdCB3aWxsIGJlIHNldCB3aGVuIGNyZWF0ZWQgZnJvbSBhbiBBU1Qgbm9kZSBzaW5jZSB0aGUgbm9kZSBhbHJlYWR5IGhhcyBldmFsdWF0ZWQgaXQuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRUaGlzTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2M0E3MDBDQiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmVwcmVzZW50cyAidGhpcyIsIGUuZy4gdGhpcy5nZXRYKCkgd2lsbCBiZSBhIE1ldGhvZEludm9jYXRpb24gd2l0aCB0aGUgcmVjZWl2ZXIgYmVpbmcgYSBUaGlzTGl0ZXJhbC4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBmb3JtYXQgWFlaLnRoaXMgYmVjYXVzZSB0aGF0IGlzIGZvciBpbm5lciBjbGFzc2VzIGFuZCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQgcmlnaHQgbm93LgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2NDE4MDE5RiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRUeXBlTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2NDk1MDE4MSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgcmVwcmVzZW50cyBhIGxpdGVyYWwgb2YgdGhlIGZvcm0gai5YWVouY2xhc3MuIEZvciBpbnN0YW5jZSBpbiBhIG1ldGhvZCBpbnZvY2F0aW9uIHguZ2V0WChqWFlaLmNsYXNzKSB0aGUgYXJndW1lbnQgd2lsbCBiZSBhIFR5cGVMaXRlcmFsLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2NTRDMDAwOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjRENzAzN0IiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHR5cGUgb2YgdGhlIGxpdGVyYWwuICBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEludmFsaWRFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODY1QUYwMjA5IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBzb21lIGV4cHJlc3Npb24gd2UganVzdCBjYW4ndCBldmFsdWF0ZSBmb3Igb3VyIHB1cnBvc2VzLiBJdCBhbGxvd3MgdXMgdG8gdGVsbCB0aGUgZXZhbHVhdGlvbiB3aGF0IGlzIGFjdHVhbGx5IHdyb25nLiBJdCBzaG91bGQgYmUgcGxhY2VkIGFzIHRoZSByb290IGV4cHJlc3Npb24gdG8gcHJldmVudCBwcm9jZXNzaW5nIG11Y2ggb2YgdGhlIHRyZWUgYW5kIHRoZW4gZmluYWxseSBmYWlsLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2NkY1MDI1OCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjZFNDAyOTkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQSBtZXNzYWdlIGFzIHRvIHdoeSBpdCBpcyBpbnZhbGlkLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW5zdGFuY2VSZWZlcmVuY2UiCi0JICAgIHF1aWQgICAgICAgCSI0MDE3REIxODAyQjMiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDE3REI0QTAzNDEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MTAzRDUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcGFyZW50IHdobyBpcyB0byBnaXZlIHVwIHRoZSB2YWx1ZS4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBhcmVudCIKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MjAzOTAiCi0JCSAgICBsYWJlbCAgICAgIAkicGFyZW50IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPYmplY3QiCi0JCSAgICBxdWlkdSAgICAgIAkiM0M0RjFDODYwMTIzIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSIKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUQ3MjAzOUEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJbXBsaWNpdEFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVDMTQwMjQyIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RUREMDAwODgiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZmVhdHVyZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBxdWVyeSB0aGUgbGl2ZSB2YWx1ZS4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImZlYXR1cmUiCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVERDEwMTQ4IgotCQkgICAgbGFiZWwgICAgICAJImZlYXR1cmUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIgotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiCi0JCSAgICBxdWlkICAgICAgIAkiM0ZEOUVERDEwMTUyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SW1wbGljaXRBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQzE0MDI0MiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0IgotCSAgICBxdWlkICAgICAgIAkiNDAwODM0Q0UwMDFCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHJvb3QgZXhwcmVzc2lvbiBvZiB0aGUgcGFyc2UgdHJlZS4gVGhlIHJlc3VsdCBvZiBpdCBpcyB0aGUgYWxsb2NhdGlvbi4iCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImV4cHJlc3Npb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM0Q0YwMkU0IgotCQkgICAgbGFiZWwgICAgICAJImV4cHJlc3Npb24iCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1IgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzNENGMDJFNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBhcnNlVHJlZUFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJDOTEwMDA1IgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIHF1aWQgICAgICAgCSI0MDE3REJFMzAxMzgiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInJlZmVyZW5jZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDE3REJFNjAwMDYiCi0JCSAgICBsYWJlbCAgICAgIAkicmVmZXJlbmNlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDE3REJFNjAxNjQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluc3RhbmNlUmVmZXJlbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQjE4MDJCMyIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIikpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkgICAgcXVpZCAgICAgICAJIjNCNzgyRDFCMDM0RiIKLQkgICAgdGl0bGUgICAgICAJIk1haW4iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkzODQKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IE5vdGVWaWV3IEAxCi0JCSAgICBsb2NhdGlvbiAgIAkoNzQ3LCAxMDA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoMzQyLCA4NTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNzc1Ci0JCQlsYWJlbCAgICAgIAkiVGhpcyBpcyB1c2VkIGFzIHRoZSBFQ2xhc3NpZmllciB3aGVuIHlvdSB3YW50IGEgY29kZS1nZW5lcmF0ZWQgY2xhc3MgdG8gcG9pbnQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBJSmF2YU9iamVjdEluc3RhbmNlIGltcGxlbWVudGVyLiAoV2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgYSBqYXZhIG1vZGVsIGphdmEgb2JqZWN0KS4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTgzNQotCQkgICAgaGVpZ2h0ICAgICAJMzIwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhRGF0YVR5cGVJbnN0YW5jZSIgQDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjY1OSwgNjY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMTc3OSwgNjA1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE3NjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSmF2YURhdGFUeXBlSW5zdGFuY2UiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDE3NzksIDU1NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTc2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QUIxNzgwMkIxIgotCQkgICAgd2lkdGggICAgICAJMTc3OAotCQkgICAgaGVpZ2h0ICAgICAJMjQyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IE5vdGVWaWV3IEAzCi0JCSAgICBsb2NhdGlvbiAgIAkoMjM3OCwgMTA1MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMwotCQkJbG9jYXRpb24gICAJKDE5NzAsIDg4OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk3Ci0JCQltYXhfd2lkdGggIAk3ODAKLQkJCWxhYmVsICAgICAgCSJUaGlzIGlzIHVzZWQgYXMgdGhlIEVDbGFzc2lmaWVyIHdoZW4geW91IHdhbnQgYSBjb2RlLWdlbmVyYXRlZCBjbGFzcyB0byBwb2ludCB0byBhbiBpbnN0YW5jZSBvZiBhbiBJSmF2YURhdGFUeXBlSW5zdGFuY2UgaW1wbGVtZW50ZXIuIChXaGljaCBpcyBhbiBpbnN0YW5jZSBvZiBhIGphdmEgbW9kZWwgamF2YSBwcmltaXRpdmUpLiIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJODQwCi0JCSAgICBoZWlnaHQgICAgIAkzNDApCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDIKLQkJICAgIHN1cHBsaWVyICAgCUAzCi0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhSW5zdGFuY2UiIEA1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE1ODQsIDE2NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDgwNCwgODUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTU2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklKYXZhSW5zdGFuY2UiKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJOb25lIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQlsb2NhdGlvbiAgIAkoODA0LCAxNDYpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTMyOCkKLQkJICAgIHdpZHRoICAgICAgCTE1NzgKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYKLQkJICAgIGxvY2F0aW9uICAgCSgxNTg0LCA0NTUpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDE1ODQsIDQ1NSkKLQkJCSgxNTg0LCAyNTkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YU9iamVjdEluc3RhbmNlIiBANwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4NTgsIDY2NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDYyNywgNjE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ4MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklKYXZhT2JqZWN0SW5zdGFuY2UiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDYyNywgNTY0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCNzgyRDc5MDI5NiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSg2MjcsIDY3NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkwKQotCQkgICAgd2lkdGggICAgICAJNDgwCi0JCSAgICBoZWlnaHQgICAgIAkyMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDEKLQkJICAgIHN1cHBsaWVyICAgCUA3Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3REEwM0REIgotCQkgICAgY2xpZW50ICAgICAJQDcKLQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc5NSwgNTUyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc5NSwgNDU1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANikKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUyOTU2MjAxNEUiCi0JCSAgICBjbGllbnQgICAgIAlAMgotCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjY1OSwgNTQzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NTksIDQ1NSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDYpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiSmF2YSBDb25zdHJ1Y3RvcnMiCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RTY2RDAwN0YiCi0JICAgIHRpdGxlICAgICAgCSJKYXZhIENvbnN0cnVjdG9ycyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkphdmFBbGxvY2F0aW9uIiBAMTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMTIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExCi0JCQlsb2NhdGlvbiAgIAkoOTAyLCA2OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQWxsb2NhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUU2OTAwMDYxIgotCQkgICAgd2lkdGggICAgICAJMzYwCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SW5pdFN0cmluZ0FsbG9jYXRpb24iIEAxMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1NTMsIDQ5NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTIKLQkJCWxvY2F0aW9uICAgCSgzMjksIDQxNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbml0U3RyaW5nQWxsb2NhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVBRjkwMDFFIgotCQkgICAgd2lkdGggICAgICAJNDY2Ci0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMwotCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDMyMykKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMTEKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEwNzMsIDMyMykKLQkJCSgxMDczLCAxODMpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUI3NTAyREEiCi0JCSAgICBjbGllbnQgICAgIAlAMTIKLQkJICAgIHN1cHBsaWVyICAgCUAxMQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDQwMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjgsIDMyMykKLQkJICAgIGRyYXdTdXBwbGllciAJQDEzKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT2JqZWN0IiBAMTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgOTQyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDE2NDUsIDg5NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFT2JqZWN0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzY5NjAKLQkJICAgIHF1aWR1ICAgICAgCSIzQzRGMUM4NjAxMjMiCi0JCSAgICB3aWR0aCAgICAgIAkyMzAKLQkJICAgIGhlaWdodCAgICAgCTExNwotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIiBAMTYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE0MiwgOTI3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2Ci0JCQlsb2NhdGlvbiAgIAkoMTkxOCwgODgxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ0OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVTdHJ1Y3R1cmFsRmVhdHVyZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1OUQwMjMwIgotCQkgICAgd2lkdGggICAgICAJNDY2Ci0JCSAgICBoZWlnaHQgICAgIAkxMTcKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SW1wbGljaXRBbGxvY2F0aW9uIiBAMTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAxOCwgNTEwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNwotCQkJbG9jYXRpb24gICAJKDE4MTksIDQ1OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbXBsaWNpdEFsbG9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQzE0MDI0MiIKLQkJICAgIHdpZHRoICAgICAgCTQxNgotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQzQ3MDBFNyIKLQkJICAgIGNsaWVudCAgICAgCUAxNwotCQkgICAgc3VwcGxpZXIgICAJQDExCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMjMsIDQ0NikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDIzLCAzMjMpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMykKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxOQotCQkgICAgbG9jYXRpb24gICAJKDE4ODEsIDcyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFRDcxMDNENSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicGFyZW50IiBAMjAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Ci0JCQkgICAgbG9jYXRpb24gICAJKDcxNiwgMjI4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEKLQkJCQlQYXJlbnRfVmlldyAJQDIwCi0JCQkJbG9jYXRpb24gICAJKDE3MjcsIDg0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTM3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFyZW50IgotCQkJCXBjdERpc3QgICAgCTAuOTkxMjI0Ci0JCQkJaGVpZ2h0ICAgICAJNzIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUQ3MjAzOTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDE5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE1Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyCi0JCQkJUGFyZW50X1ZpZXcgCUAyMAotCQkJCWxvY2F0aW9uICAgCSgxODcxLCA3OTQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuMzM3ODE3Ci0JCQkJaGVpZ2h0ICAgICAJMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMjMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Ci0JCQkgICAgbG9jYXRpb24gICAJKDcxNiwgMjI4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGRDlFRDcyMDM5QSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTkKLQkJCSAgICBzdXBwbGllciAgIAlAMTcKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMjQKLQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA3MjEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUREMDAwODgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImZlYXR1cmUiIEAyNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTE1LCAyMjEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNgotCQkJCVBhcmVudF9WaWV3IAlAMjUKLQkJCQlsb2NhdGlvbiAgIAkoMjAyOCwgNzY2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitmZWF0dXJlIgotCQkJCXBjdERpc3QgICAgCTAuMTgxMzQ2Ci0JCQkJaGVpZ2h0ICAgICAJNjQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUREMTAxNDgiCi0JCQkgICAgY2xpZW50ICAgICAJQDI0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE2Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJCWxvY2F0aW9uICAgCSgyMTcyLCA4MzkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMjgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkgICAgbG9jYXRpb24gICAJKDkxNSwgMjIxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGRDlFREQxMDE1MiIKLQkJCSAgICBjbGllbnQgICAgIAlAMjQKLQkJCSAgICBzdXBwbGllciAgIAlAMTcKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIiBAMjkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgNzc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQlsb2NhdGlvbiAgIAkoMTA5NSwgNzI1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UGFyc2VUcmVlQWxsb2NhdGlvbiIgQDMwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNjUsIDQ5NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzAKLQkJCWxvY2F0aW9uICAgCSgxMDMyLCA0NDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDY2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFyc2VUcmVlQWxsb2NhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJDOTEwMDA1IgotCQkgICAgd2lkdGggICAgICAJNDg0Ci0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJDQjcwMUQ2IgotCQkgICAgY2xpZW50ICAgICAJQDMwCi0JCSAgICBzdXBwbGllciAgIAlAMTEKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI2NSwgNDMxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDMyMykKLQkJICAgIGRyYXdTdXBwbGllciAJQDEzKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDMyCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgNjM1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM0Q0UwMDFCIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJleHByZXNzaW9uIiBAMzMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkgICAgbG9jYXRpb24gICAJKC0xLCAxNDApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNAotCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTExMSwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitleHByZXNzaW9uIgotCQkJCXBjdERpc3QgICAgCTAuNDkyNTM3Ci0JCQkJaGVpZ2h0ICAgICAJMTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDAwODM0Q0YwMkU0IgotCQkJICAgIGNsaWVudCAgICAgCUAzMgotCQkJICAgIHN1cHBsaWVyICAgCUAyOQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNQotCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTMwNywgNjc5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjU2NzE2NAotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDM2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMgotCQkJICAgIGxvY2F0aW9uICAgCSgtMSwgMTQwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNENGMDJFNiIKLQkJCSAgICBjbGllbnQgICAgIAlAMzIKLQkJCSAgICBzdXBwbGllciAgIAlAMzAKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUGFyc2UgVHJlZSBFeHByZXNzaW9ucyIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgyQ0MyMDE0NiIKLQkgICAgdGl0bGUgICAgICAJIlBhcnNlIFRyZWUgRXhwcmVzc2lvbnMiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkxMDgxCi0JICAgIG9yaWdpbl95ICAgCTU3NjgKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iIEAzNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ4LCAxMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzcKLQkJCWxvY2F0aW9uICAgCSgxMTc5LCA3MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQXJyYXlBY2Nlc3MiIEAzOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMjM1LCA1NDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM4Ci0JCQlsb2NhdGlvbiAgIAkoMTg3NywgNDI2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTcxNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUQXJyYXlBY2Nlc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRTE0MDI1MCIKLQkJICAgIHdpZHRoICAgICAgCTczNAotCQkgICAgaGVpZ2h0ICAgICAJMjU4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUQXJyYXlDcmVhdGlvbiIgQDM5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQzNCwgNTE5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzOQotCQkJbG9jYXRpb24gICAJKDM4LCAzNzkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNzkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRBcnJheUNyZWF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MzcxMjAyNUEiCi0JCSAgICB3aWR0aCAgICAgIAk4MTAKLQkJICAgIGhlaWdodCAgICAgCTMwMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEFycmF5SW5pdGlhbGl6ZXIiIEA0MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzYxLCA1MTkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQwCi0JCQlsb2NhdGlvbiAgIAkoOTU5LCA0NDYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODA0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRBcnJheUluaXRpYWxpemVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4Mzk2ODAxNEMiCi0JCSAgICB3aWR0aCAgICAgIAk4MjIKLQkJICAgIGhlaWdodCAgICAgCTE2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEJvb2xlYW5MaXRlcmFsIiBANDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoOTk3LCA4NzApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQxCi0JCQlsb2NhdGlvbiAgIAkoNzM0LCA3ODkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTI3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRCb29sZWFuTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODNBRTcwMjQ3IgotCQkgICAgd2lkdGggICAgICAJNTQ1Ci0JCSAgICBoZWlnaHQgICAgIAkxODUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRDYXN0RXhwcmVzc2lvbiIgQDQyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3OTEsIDg4OSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDIKLQkJCWxvY2F0aW9uICAgCSgxNDkzLCA3NzEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRDYXN0RXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODNCNkYwMDU4IgotCQkgICAgd2lkdGggICAgICAJNjE0Ci0JCSAgICBoZWlnaHQgICAgIAkyNTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MwotCQkgICAgbG9jYXRpb24gICAJKDEzNDgsIDMzMCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEzNDgsIDMzMCkKLQkJCSgxMzQ4LCAxODcpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4Mzk3OTAwMzgiCi0JCSAgICBjbGllbnQgICAgIAlANDAKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgxLCA0MzQpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM4MSwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODNCMUQwMDAwIgotCQkgICAgY2xpZW50ICAgICAJQDQxCi0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTE4LCA3NzgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTE4LCAzMzApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0MykKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4M0JENjAzMDkiCi0JCSAgICBjbGllbnQgICAgIAlANDIKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzkxLCA3NjApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc5MSwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJFNkYwMUY3IgotCQkgICAgY2xpZW50ICAgICAJQDM4Ci0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIzNSwgNDE1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyMzUsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDQ4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNzIsIDEwOTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCWxvY2F0aW9uICAgCSgxMjAzLCAxMDQ0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRDaGFyYWN0ZXJMaXRlcmFsIiBANDkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMwLCAxNDM4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0OQotCQkJbG9jYXRpb24gICAJKDIwNywgMTMyOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NDcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVENoYXJhY3RlckxpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg0REYxMDI3NyIKLQkJICAgIHdpZHRoICAgICAgCTQ2NQotCQkgICAgaGVpZ2h0ICAgICAJMjQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1MAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNzIxMDA0OSIKLQkJICAgIGNsaWVudCAgICAgCUAzOQotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU2MSwgMzY3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU2MSwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iIEA1MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ2LCAxNDY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1MQotCQkJbG9jYXRpb24gICAJKDk2MCwgMTM0NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk3NzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODRGNDAwMjZGIgotCQkgICAgd2lkdGggICAgICAJNzkwCi0JCSAgICBoZWlnaHQgICAgIAkyNTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1MgotCQkgICAgbG9jYXRpb24gICAJKDEzNzIsIDEyNjApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMzcyLCAxMjYwKQotCQkJKDEzNzIsIDExNTgpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTMKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NEUxMzAxRUEiCi0JCSAgICBjbGllbnQgICAgIAlANDkKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NjQsIDEzMTcpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTY0LCAxMjYwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODRGNEMwMkY4IgotCQkgICAgY2xpZW50ICAgICAJQDUxCi0JCSAgICBzdXBwbGllciAgIAlANDgKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI2NywgMTMzNCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjY3LCAxMjYwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRDb25kaXRpb25hbEV4cHJlc3Npb24iIEA1NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMTY5LCAxNDgxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NQotCQkJbG9jYXRpb24gICAJKDE4OTAsIDEzNDEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTU4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRDb25kaXRpb25hbEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1MUZCMDI2QSIKLQkJICAgIHdpZHRoICAgICAgCTU3NgotCQkgICAgaGVpZ2h0ICAgICAJMzAyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1Mjc0MDEyRSIKLQkJICAgIGNsaWVudCAgICAgCUA1NQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxNjgsIDEzMzApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2OCwgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURmllbGRBY2Nlc3MiIEA1NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg3NjEsIDE3OTQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU3Ci0JCQlsb2NhdGlvbiAgIAkoNDkyLCAxNjc2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTUzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURmllbGRBY2Nlc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1MkRGMDIwNCIKLQkJICAgIHdpZHRoICAgICAgCTU1NgotCQkgICAgaGVpZ2h0ICAgICAJMjU4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1OAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1MzVEMDI0MSIKLQkJICAgIGNsaWVudCAgICAgCUA1NwotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc2MCwgMTY2NSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjAsIDEyNjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1MikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluZml4RXhwcmVzc2lvbiIgQDU5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3OTAsIDE4NDUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQlsb2NhdGlvbiAgIAkoMTMxNiwgMTY4MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk5NDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEluZml4RXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUzOEIwMTQzIgotCQkgICAgd2lkdGggICAgICAJOTY2Ci0JCSAgICBoZWlnaHQgICAgIAkzNDgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbmZpeE9wZXJhdG9yIiBANjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjY2MCwgMjIwNykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjAKLQkJCWxvY2F0aW9uICAgCSgyMzQ1LCAxNjk5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5maXhPcGVyYXRvciIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2MAotCQkJbG9jYXRpb24gICAJKDIzNDUsIDE2NDkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUzRTEwMzU5IgotCQkgICAgd2lkdGggICAgICAJNjQ4Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1NTcwMDAzMiIKLQkJICAgIGNsaWVudCAgICAgCUA1OQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3ODksIDE2NzEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4OSwgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDYyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNzIsIDI4NTMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjIKLQkJCWxvY2F0aW9uICAgCSgxMTAzLCAyODAyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbnN0YW5jZW9mIiBANjMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzcxLCAzMjU1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2MwotCQkJbG9jYXRpb24gICAJKDk5LCAzMTM3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5zdGFuY2VvZiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODU3RDMwM0EyIgotCQkgICAgd2lkdGggICAgICAJNTYyCi0JCSAgICBoZWlnaHQgICAgIAkyNTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRNZXRob2RJbnZvY2F0aW9uIiBANjQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0NiwgMzI1OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCWxvY2F0aW9uICAgCSg4NjAsIDMxMTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNzcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRNZXRob2RJbnZvY2F0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NThCNjAxOEIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJbG9jYXRpb24gICAJKDg2MCwgMzE3OCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk0Ci0JCQltYXhfd2lkdGggIAk3MTUpCi0JCSAgICB3aWR0aCAgICAgIAk3OTAKLQkJICAgIGhlaWdodCAgICAgCTMwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVE5hbWUiIEA2NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxOTYyLCAzMjEyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2NQotCQkJbG9jYXRpb24gICAJKDE4MDksIDMxMjEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzA3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFROYW1lIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NThFQTAyODAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA2NQotCQkJbG9jYXRpb24gICAJKDE4MDksIDMxODIpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMzAzKQotCQkgICAgd2lkdGggICAgICAJMzI1Ci0JCSAgICBoZWlnaHQgICAgIAkyMDUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NgotCQkgICAgbG9jYXRpb24gICAJKDEyNzIsIDMwNjEpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMjcyLCAzMDYxKQotCQkJKDEyNzIsIDI5MTYpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTg5MTAzQUYiCi0JCSAgICBjbGllbnQgICAgIAlANjMKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzQsIDMxMjYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDc0LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVCOUQwMDY3IgotCQkgICAgY2xpZW50ICAgICAJQDY0Ci0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI0NSwgMzEwNikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ1LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVCQTEwMERCIgotCQkgICAgY2xpZW50ICAgICAJQDY1Ci0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkwNSwgMzExMCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTA1LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFROdWxsTGl0ZXJhbCIgQDcwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMjgsIDMxOTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcwCi0JCQlsb2NhdGlvbiAgIAkoMjE3MCwgMzE0MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVE51bGxMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUJCRjAwMjAiCi0JCSAgICB3aWR0aCAgICAgIAkzMzQKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUJENDAyRjEiCi0JCSAgICBjbGllbnQgICAgIAlANzAKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjk3LCAzMTMxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTcsIDMwNjEpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iIEA3MgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjQzLCAzODY3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDcyCi0JCQlsb2NhdGlvbiAgIAkoMTA3NCwgMzgxNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMjYxNTkzNQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIHdpZHRoICAgICAgCTM1NgotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUTnVtYmVyTGl0ZXJhbCIgQDczCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMzU4MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzMKLQkJCWxvY2F0aW9uICAgCSg2MTksIDM0ODkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzY3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFROdW1iZXJMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUM0MDAzNUIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3MwotCQkJbG9jYXRpb24gICAJKDYxOSwgMzU1MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkzMDMpCi0JCSAgICB3aWR0aCAgICAgIAkzODUKLQkJICAgIGhlaWdodCAgICAgCTIxMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUNFRjAyNDQiCi0JCSAgICBjbGllbnQgICAgIAlANzMKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzAsIDM0NzgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzMwLCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIgQDc1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE2NzksIDM2MDkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDc1Ci0JCQlsb2NhdGlvbiAgIAkoMTM4MSwgMzUxMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1OTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUNGOTAwN0MiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3NQotCQkJbG9jYXRpb24gICAJKDEzODEsIDM1NzQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTQ2KQotCQkgICAgd2lkdGggICAgICAJNjE0Ci0JCSAgICBoZWlnaHQgICAgIAkyMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVGNEUwM0UxIgotCQkgICAgY2xpZW50ICAgICAJQDc1Ci0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY3NywgMzUwMikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc3LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRQcmVmaXhFeHByZXNzaW9uIiBANzcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzE4LCA0MjIxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3NwotCQkJbG9jYXRpb24gICAJKDksIDQxMDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNjE4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRQcmVmaXhFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NUZBRDAwOEIiCi0JCSAgICB3aWR0aCAgICAgIAk2MzYKLQkJICAgIGhlaWdodCAgICAgCTI1OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFByZWZpeE9wZXJhdG9yIiBANzgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMzLCA0NjAyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3OAotCQkJbG9jYXRpb24gICAJKDM0LCA0NDY4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUUHJlZml4T3BlcmF0b3IiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzgKLQkJCWxvY2F0aW9uICAgCSgzNCwgNDQxOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjAyNDAwRDIiCi0JCSAgICB3aWR0aCAgICAgIAk0MTYKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFN0cmluZ0xpdGVyYWwiIEA3OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA0MTk2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3OQotCQkJbG9jYXRpb24gICAJKDg0OSwgNDA5MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFN0cmluZ0xpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2MUUyMDAwQiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDc5Ci0JCQlsb2NhdGlvbiAgIAkoODQ5LCA0MTUzKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTMKLQkJCW1heF93aWR0aCAgCTQ1OSkKLQkJICAgIHdpZHRoICAgICAgCTM3MAotCQkgICAgaGVpZ2h0ICAgICAJMjMwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODAKLQkJICAgIGxvY2F0aW9uICAgCSgxMjQzLCA0MDIwKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTI0MywgNDAyMCkKLQkJCSgxMjQzLCAzOTMwKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYyRDcwMzM4IgotCQkgICAgY2xpZW50ICAgICAJQDc5Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAwOCwgNDA4MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA4LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYyREMwMUQ3IgotCQkgICAgY2xpZW50ICAgICAJQDc3Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjk3LCA0MDkyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI5NywgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUVGhpc0xpdGVyYWwiIEA4MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNjU1LCA0MTgwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4MwotCQkJbG9jYXRpb24gICAJKDE0OTQsIDQxMjkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRUaGlzTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODYzQTcwMENCIgotCQkgICAgd2lkdGggICAgICAJMzQwCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODY0MTgwMTlGIgotCQkgICAgY2xpZW50ICAgICAJQDgzCi0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYyNywgNDExNykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjI3LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRUeXBlTGl0ZXJhbCIgQDg1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyNTYsIDQyMDEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg1Ci0JCQlsb2NhdGlvbiAgIAkoMjA5MywgNDEwNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVFR5cGVMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjQ5NTAxODEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA4NQotCQkJbG9jYXRpb24gICAJKDIwOTMsIDQxNjcpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMjgxKQotCQkgICAgd2lkdGggICAgICAJMzQ1Ci0JCSAgICBoZWlnaHQgICAgIAkyMTUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODY1NEMwMDA4IgotCQkgICAgY2xpZW50ICAgICAJQDg1Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjE5NywgNDA5MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTk3LCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbnZhbGlkRXhwcmVzc2lvbiIgQDg3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE0NTcsIDQ1NDUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg3Ci0JCQlsb2NhdGlvbiAgIAkoMTI3OSwgNDQ0OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEludmFsaWRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjVBRjAyMDkiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA4NwotCQkJbG9jYXRpb24gICAJKDEyNzksIDQ1MTApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMzY4KQotCQkgICAgd2lkdGggICAgICAJMzc1Ci0JCSAgICBoZWlnaHQgICAgIAkyMTUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODY2RjUwMjU4IgotCQkgICAgY2xpZW50ICAgICAJQDg3Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQxMywgNDQzOCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEzLCA0MDIwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SUphdmFJbnN0YW5jZSIgQDg5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMDEsIDQ5MTcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg5Ci0JCQlsb2NhdGlvbiAgIAkoMjEzNywgNDg4NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSmF2YUluc3RhbmNlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg5Ci0JCQlsb2NhdGlvbiAgIAkoMjEzNywgNDgzNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JCSAgICB3aWR0aCAgICAgIAkzNDYKLQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluc3RhbmNlUmVmZXJlbmNlIiBAOTAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAwNSwgNDUwOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOTAKLQkJCWxvY2F0aW9uICAgCSgxODA1LCA0MzkzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQwMQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUSW5zdGFuY2VSZWZlcmVuY2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQjE4MDJCMyIKLQkJICAgIHdpZHRoICAgICAgCTQxOQotCQkgICAgaGVpZ2h0ICAgICAJMjU3Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQjRBMDM0MSIKLQkJICAgIGNsaWVudCAgICAgCUA5MAotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NDMsIDQzODEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MywgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDkyCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE2NSwgNDczMCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQkUzMDEzOCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlIiBAOTMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkyCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNywgMjU5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQKLQkJCQlQYXJlbnRfVmlldyAJQDkzCi0JCQkJbG9jYXRpb24gICAJKDIxMjAsIDQ3OTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE4OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3JlZmVyZW5jZSIKLQkJCQlwY3REaXN0ICAgIAkwLjIzMTk2MAotCQkJCWhlaWdodCAgICAgCTc3Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCRTYwMDA2IgotCQkJICAgIGNsaWVudCAgICAgCUA5MgotCQkJICAgIHN1cHBsaWVyICAgCUA4OQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NQotCQkJCVBhcmVudF9WaWV3IAlAOTMKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MCwgNDc4MykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEA5NgotCQkJICAgIFBhcmVudF9WaWV3IAlAOTIKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3LCAyNTkpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCRTYwMTY0IgotCQkJICAgIGNsaWVudCAgICAgCUA5MgotCQkJICAgIHN1cHBsaWVyICAgCUA5MAotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2phdmFNb2RlbC5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2phdmFNb2RlbC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmI5MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9qYXZhTW9kZWwubWRsCisrKyAvZGV2L251bGwKQEAgLTEsODgxOSArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIklERSIKLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyIKLQkgICAgdmFsdWUgICAgICAJIiIpKQotICAgIHF1aWQgICAgICAgCSIzOUVERkJFMDAzQjQiCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJVFJVRQotCWdyaWRYICAgICAgCTE2Ci0JZ3JpZFkgICAgICAJMTYKLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250Ci0JICAgIHNpemUgICAgICAgCTEwCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkgICAgY29sb3IgICAgICAJMAotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCXNob3dNZXNzYWdlTnVtIAkxCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUKLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciCi0JcXVpZCAgICAgICAJIjM5RURGQkUwMDNCNiIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RURGQkUyMDA4RCIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjUiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3IgotCXF1aWR1ICAgICAgCSIzOUVERkJFMDAzQjciCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamF2YSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmplbVxccm9zZVxcZWRvY2phdmEyLmNhdCIKLQkJcXVpZCAgICAgICAJIjM2NTQ5RjJDMDA0RSIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVjb3JlIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxtb2RlbFxcb3JnLmVjbGlwc2UuZW1mLkVjb3JlLmNhdCIKLQkJcXVpZCAgICAgICAJIjM5QTVFRDA0MDA0RSIpKQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RURGQkUyMDA4RSIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmphdmEiIEAxCi0JCQlsb2NhdGlvbiAgIAkoNzg0LCA1MjgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCA0OTMpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJqYXZhIikKLQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkgICAgbG9jYXRpb24gICAJKDYzMCwgNDQzKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSI8PG1ldGFtb2RlbD4+IikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzNjU0OUYyQzAwNEUiCi0JCQl3aWR0aCAgICAgIAkzMjAKLQkJCWhlaWdodCAgICAgCTE4MikKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMgotCQkJbG9jYXRpb24gICAJKDMwNCwgNTQ0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkgICAgbG9jYXRpb24gICAJKDE2MCwgNDYwKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiZWNvcmUiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjciCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RURGQkUyMDA4QyIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjM5RURGQkUwMDNCOCIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0JBIgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkicm9zZUlkIgotCQl2YWx1ZSAgICAgIAkiNzUzMTE3NTQwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2OSIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNJRCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicmVmZXJlbmNlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIzIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNCIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5IgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlclNvdXJjZUZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBTlNJIEMrKyBFdmVudCBXYXRjaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTgzX1NPVVJDRSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NOYW1lIgotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIgotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVBY2Nlc3MiCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJBXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4IgotCQkJdmFsdWUgICAgICAJIlRoZV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvcHkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NFcXVhbGl0eU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVFcXVhbGl0eU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1Rhc2siCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiCi0JCQkJdmFsdWUgICAgICAJMjI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJCb2R5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlVzZUNvbG9uTm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb250cm9sbGVkXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtjbGFzc31fUmVjb3JkX0tpbmRzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNMaW1pdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiIDExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyZW50Q2xhc3NOYW1lIgotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvcHkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJGcmVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVR5cGVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cXVvdGV9PSR7cXVvdGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVjb3JkIgotCQkJCXZhbHVlICAgICAgCTIxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTWl4aW4iCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhc2siCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVUeXBlIgotCQkJCXZhbHVlICAgICAgCTIwOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTIxNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRGaW5hbGl6YXRpb25Pbmx5IgotCQkJCXZhbHVlICAgICAgCTIyNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTIyOCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyIKLQkJCQl2YWx1ZSAgICAgIAkyMjkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkF1dG8iCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIgotCQkJdmFsdWUgICAgICAJIlRydWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiCi0JCQkJdmFsdWUgICAgICAJMjMxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjE3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjE3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDbGVhckNhc2UiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkicHJvamVjdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlZpZXdDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRvbWFpbkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbmRleENvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImNPTlRBSU5FUkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlZpZXdQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RlYXVsdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSIKLQkJCXZhbHVlICAgICAgCTEpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmVmZXRjaFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJMaXN0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1Jvb3REb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRCTVMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRG9tYWluIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm93IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSIKLQkJCXZhbHVlICAgICAgCSJTUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJvY1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9vdERpciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm90U2hvd1Jvc2VJRERsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSb3NlSUQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNIgotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIgotCQkJdmFsdWUgICAgICAJIjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGNoYXJzZXRzLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGpjZS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxqc3NlLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHJ0LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHN1bnJzYXNpZ24uamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxkbnNucy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGxkYXBzZWMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxsb2NhbGVkYXRhLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcc3VuamNlX3Byb3ZpZGVyLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHNlY3VyaXR5XFxsb2NhbF9wb2xpY3kuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc2VjdXJpdHlcXFVTX2V4cG9ydF9wb2xpY3kuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXGR0LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFxodG1sY29udmVydGVyLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFx0b29scy5qYXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdW4iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk1pY3Jvc29mdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiSUJNIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZBSmF2YVdvcmtpbmdGb2xkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIm1fIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJInNfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIgotCQkJdmFsdWUgICAgICAJMykKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZW1vdGVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU291cmNlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1NlbGVjdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ0NvbW1lbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJfSUQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIgotCQkJCXZhbHVlICAgICAgCTE4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIgotCQkJCXZhbHVlICAgICAgCTE4MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiIKLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUk9XIgotCQkJCXZhbHVlICAgICAgCTE3MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIgotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIgotCQkJCXZhbHVlICAgICAgCTE2MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiNiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDb21wb25lbnRUZXN0IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSZXF1aXNpdGVQcm8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZSgkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZSgkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiY29tcGlsZXIzLjBfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSIKLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIgotCQkJCXZhbHVlICAgICAgCTIwNikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kQm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZERlY2wiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGVudCIKLQkJCXZhbHVlICAgICAgCTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5IgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAk1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiCi0JCQkJdmFsdWUgICAgICAJNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlNvREEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlRvcExpbmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIlR5cGVLaW5kcyIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImVudW0iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkicmVjb3JkIgotCQkJCXZhbHVlICAgICAgCTEwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIm1vZHVsZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJjb2NsYXNzIgotCQkJCXZhbHVlICAgICAgCTEwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIgotCQkJCXZhbHVlICAgICAgCTEwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIgotCQkJCXZhbHVlICAgICAgCTEwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIm1heCIKLQkJCQl2YWx1ZSAgICAgIAkxMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJraW5kIgotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ1dWlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiZGxsbmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYWxpYXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkibGlicmFyeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidXVpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJsY2lkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiCi0JCQkJdmFsdWUgICAgICAJMjEzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiMCIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIxIgotCQkJCXZhbHVlICAgICAgCTIyNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSIKLQkJCXZhbHVlICAgICAgCSgiQmFzZVNldCIgMjIyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIgotCQkJdmFsdWUgICAgICAJKCJJbnN0YW5jaW5nU2V0IiAyMTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiVGV4dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0JvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCeVZhbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQnlSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcG9ydEJpbmFyeSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvblZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsRW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbiBBbGwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImZyYW1ld29yayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRlcGxveSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjb25zdHJhaW50cyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbENvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb250ZW50S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkNvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbXB0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTWl4ZWQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudE9ubHkiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkpCi0JcXVpZCAgICAgICAJIjM5RURGQkUwMDNCOSIpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTg2ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29udHJvbGxlciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTEwYjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotY29udHJvbGxlci5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzdmMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5MDczOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEFubm90YXRpb24gQ29udHJvbGxlciBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNy4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBjb250cm9sbGVyLmphcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlciwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGIzNzM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSAudGVtcGxhdGUsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuamFyLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS5jb250cm9sbGVyLmphciA9IGNvbnRyb2xsZXIvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0LmNvbnRyb2xsZXIuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvbnRyb2xsZXIvQW5ub3RhdGlvbnNDb250cm9sbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhMzBjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEFubm90YXRpb25zIENvbnRyb2xsZXIgaW50ZXJmYWNlIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBlbWl0dGVycyBhbmQgZGV0ZXJtaW5pbmcgYXZhaWxhYmxlCi0gKiB0YWcgc2V0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25zQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGEgdGFnIGhhbmRsZXIgaXMgaW5zdGFsbGVkIGZvciB0aGUgc3BlY2lmaWVkIHRhZwotCSAqIAotCSAqIEBwYXJhbSB0YWdzZXQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgdGFnc2V0IChlLmcuICJlamIiKQotCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBnaXZlbiB0YWdzZXQgaXMgYXZhaWxhYmxlIGFuZCBlbmFibGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYWdIYW5kbGVySW5zdGFsbGVkKFN0cmluZyB0YWdzZXQpOwotCi0JLyoqCi0JICogRGlzYWJsZXMgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIG1vZGVsT2JqZWN0Ci0JICogICAgICAgICAgICBUaGUgQW5ub3RhdGVkIEVNRiBPYmplY3QKLQkgKiBAcGFyYW0gdGFnc2V0Ci0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbnMgdGFnc2V0IHRvIGRpc2FibGUgb24gdGhlIG9iamVjdAotCSAqIEByZXR1cm4gYW4gSVN0YXR1cyByZXByZXNlbnRpbmcgc3VjY2VzcyBvciBmYWlsdXJlCi0JICovCi0JcHVibGljIElTdGF0dXMgZGlzYWJsZUFubm90YXRpb25zKEVPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyB0YWdzZXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCBhbm5vdGF0ZWQgZmlsZSBpZiB0aGUgc3BlY2lmaWVkIG1vZGVsIG9iamVjdCB3YXMgZ2VuZXJhdGVkIHZpYQotCSAqIGFubm90YXRpb25zIGZyb20gYSBwYXJlbnQgcmVzb3VyY2UgYW5kIGlzIGVuYWJsZWQKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWxPYmplY3QKLQkgKiAgICAgICAgICAgIFRoZSBBbm5vdGF0ZWQgRU1GIE9iamVjdAotCSAqIEByZXR1cm4gdGhlIGFubm90YXRlZCBzb3VyY2UgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1vZGVsT2JqZWN0Ci0JICovCi0JcHVibGljIElGaWxlIGdldEVuYWJsZWRBbm5vdGF0aW9uRmlsZShFT2JqZWN0IG1vZGVsT2JqZWN0KTsKLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGFubm90YXRpb25zIG9uIHRoZSBnaXZlbiByZXNvdXJjZSBkdXJpbmcgY3JlYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCBmaWxlcyB0b3VjaGVkIGJ5IHRoZSBhbm5vdGF0aW9ucyBwcm9jZXNzaW5nCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSBwcm9jZXNzaW5nCi0JICovCi0JcHVibGljIElGaWxlW10gcHJvY2VzcyhJUmVzb3VyY2UgcmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGFubm90YXRpb25zIG9uIHRoZSBnaXZlbiByZXNvdXJjZSBhcnJheQotCSAqIAotCSAqIEByZXR1cm4gYWxsIGZpbGVzIHRvdWNoZWQgYnkgdGhlIGFubm90YXRpb25zIHByb2Nlc3NpbmcKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcKLQkgKi8KLQlwdWJsaWMgSUZpbGVbXSBwcm9jZXNzKElSZXNvdXJjZVtdIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgYW4gb3Bwb3J0dW5pdHkgdG8gaW5pdGlhbGl6ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgYW4gb3Bwb3J0dW5pdHkgdG8gZGlzcG9zZSBhbmQgY2xlYW51cAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29udHJvbGxlci9Bbm5vdGF0aW9uc0NvbnRyb2xsZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb250cm9sbGVyL0Fubm90YXRpb25zQ29udHJvbGxlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjhhMDQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb250cm9sbGVyL0Fubm90YXRpb25zQ29udHJvbGxlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29udHJvbGxlckhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uc0NvbnRyb2xsZXJIZWxwZXIgSU5TVEFOQ0UgPSBuZXcgQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyKCk7Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGVkPyBtb2RlbCBvYmplY3QKLQkgKiBAcmV0dXJuIHRydWUgb25seSBpZiB0aGUgb2JqZWN0IGhhcyBhbm5vdGF0aW9ucwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVPYmplY3QsIEFubm90YXRpb25zQWRhcHRlci5HRU5FUkFURUQpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgdG8gdGFnIGEgbW9kZWwgb2JqZWN0IGFzIGFubm90YXRlZAotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW5ub3RhdGVkKEVPYmplY3QgZU9iamVjdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCUFubm90YXRpb25zQWRhcHRlci5hZGRBbm5vdGF0aW9ucyhlT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgdG8gdGFnIGEgbW9kZWwgb2JqZWN0IGFzIGFubm90YXRlZCBBbm5vdGF0aW9ucyBBZGFwdGVycyBjYW4gaG9sZCBleHRyYQotCSAqIGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgQSBTdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9ucyhFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyLmFkZEFubm90YXRpb25zKGVPYmplY3QsIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byB0YWcgYSBtb2RlbCBvYmplY3QgYXMgYW5ub3RhdGVkIEFubm90YXRpb25zIEFkYXB0ZXJzIGNhbiBob2xkIGV4dHJhCi0JICogaW5mb3JtYXRpb24uCi0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgQSBzdHJpbmcga2V5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBBIFN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QW5ub3RhdGlvbnMoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVPYmplY3QsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFjcXVpcmVzIHRoZSBnZW5lcmF0ZWQgYW5ub3RhdGlvbiBjb21tZW50IGFuZCBwYXJzZXMgdGhlIEZyYWdtZW50IFVSTCBvZiB0aGUgZm9sbG93aW5nIGZvcm0KLQkgKiB0byByZXR1cm4gdGhlIHRhZ3NldCBuYW1lOgotCSAqIAotCSAqIGNvbS5hY21lLmVqYnMuTXlFSkIjIDx0YWdzZXQ+LyA8ZnJhZ21lbnQ+LiA8ZnJhZ21lbnQtcG9pbnRlcj4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqICAgICAgICAgICAgVGhlIGFubm90YXRlZCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiA8dGFnc2V0PmluIHRoZSBVUkwgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnc2V0KEVPYmplY3QgZU9iamVjdCkgewotCi0JCVN0cmluZyBnZW5lcmF0ZWRDb21tZW50ID0gKFN0cmluZykgQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVPYmplY3QsIEFubm90YXRpb25zQWRhcHRlci5HRU5FUkFURUQpOwotCQlpZiAoZ2VuZXJhdGVkQ29tbWVudCA9PSBudWxsIHx8IGdlbmVyYXRlZENvbW1lbnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgcG91bmRpdCA9IGdlbmVyYXRlZENvbW1lbnQuaW5kZXhPZignIycpOwotCQlpbnQgc2xhc2ggPSBnZW5lcmF0ZWRDb21tZW50LmluZGV4T2YoJy8nKTsKLQkJaWYgKHBvdW5kaXQgPCAwIHx8IHNsYXNoIDwgMCB8fCBwb3VuZGl0ID49IHNsYXNoKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZW5lcmF0ZWRDb21tZW50LnN1YnN0cmluZyhwb3VuZGl0ICsgMSwgc2xhc2gpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ29tcGlsYXRpb25Vbml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbW9kZWwgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIGFuIEFubm90YXRlZCBtb2RlbCBPYmplY3QKLQkgKiBAcmV0dXJuIFRoZSBjb21waWxhdGlvbiB1bml0IHdoaWNoIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdAotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldEFubm90YXRlZENVKEVPYmplY3QgZU9iamVjdCkgewotCQlTdHJpbmcgZnJhZ2VtZW50U3RyaW5nID0gKFN0cmluZykgQW5ub3RhdGlvbnNBZGFwdGVyLmdldEFubm90YXRpb25zKGVPYmplY3QsIEFubm90YXRpb25zQWRhcHRlci5HRU5FUkFURUQpOwotCQlpZiAoZnJhZ2VtZW50U3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdHlwZVN0cmluZyA9IGZyYWdlbWVudFN0cmluZy5zdWJzdHJpbmcoMCwgZnJhZ2VtZW50U3RyaW5nLmluZGV4T2YoJyMnKSk7Ci0JCUlUeXBlIGl0eXBlOwotCi0JCWlmICh0eXBlU3RyaW5nICE9IG51bGwgJiYgKGl0eXBlID0gZmluZFR5cGUodHlwZVN0cmluZywgZU9iamVjdCkpICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGl0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFdvcmtpbmdDb3B5KG51bGwpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKFN0cmluZyB0eXBlLCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJSVR5cGUgcmVzdWx0ID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlT2JqZWN0KTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXJlc3VsdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHR5cGUpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgPGNvZGU+cHJvamVjdDwvY29kZT4gaGFzIGFubm90YXRpb24gc3VwcG9ydCBlbmFibGVkIG9uIGl0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbm5vdGF0aW9uU3VwcG9ydChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLklOU1RBTkNFLmhhc0Fubm90YXRpb25zQnVpbGRlcihwcm9qZWN0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvbnRyb2xsZXIvQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvbnRyb2xsZXIvQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTgxMjRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb250cm9sbGVyL0Fubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGVDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZWdpc3RyeSBmb3IgcmVhZGluZyBhbm5vdGF0aW9ucyBjb250cm9sbGVyIGV4dGVuc2lvbnMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciBpbXBsZW1lbnRzIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyKCk7Ci0JCi0Jc3RhdGljIHsKLQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSBTb3J0ZWRTZXQgZGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIE1hcCBhbm5vdGF0aW9uc0NvbnRyb2xsZXJzOwotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZXNjcmlwdG9yIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OU19DT05UUk9MTEVSID0gImFubm90YXRpb25zQ29udHJvbGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX0lEID0gImJ1aWxkZXJJRCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBJRDsKLQkJcHJpdmF0ZSBTdHJpbmcgYnVpbGRlcklEOwotCQlwcml2YXRlIGZpbmFsIGludCBsb2FkT3JkZXI7Ci0JCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMDsKLQotCQlwdWJsaWMgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ0VsZW1lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlBc3NlcnQuaXNMZWdhbChBTk5PVEFUSU9OU19DT05UUk9MTEVSLmVxdWFscyhhQ29uZmlnRWxlbWVudC5nZXROYW1lKCkpLCBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuZ2V0U3RyaW5nKCJBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyX0VSUk9SXzAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbmZpZ0VsZW1lbnQgPSBhQ29uZmlnRWxlbWVudDsKLQkJCUlEID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCWJ1aWxkZXJJRCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEJVSUxERVJfSUQpOwotCQkJbG9hZE9yZGVyID0gbG9hZE9yZGVyQ291bnRlcisrOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGUjZ2V0SUQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJCXJldHVybiBJRDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRCdWlsZGVySUQoKSB7Ci0JCQlyZXR1cm4gYnVpbGRlcklEOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGUjZ2V0TG9hZE9yZGVyKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgewotCQkJcmV0dXJuIGxvYWRPcmRlcjsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY3JlYXRlSW5zdGFuY2UoKSB7Ci0JCQlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgaW5zdGFuY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbnN0YW5jZSA9IChBbm5vdGF0aW9uc0NvbnRyb2xsZXIpIGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTUyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIoKSB7Ci0JCXN1cGVyKCJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIiLCAiYW5ub3RhdGlvbnNDb250cm9sbGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIHJlYWQgZXh0ZW5zaW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhEZXNjcmlwdG9yLkFOTk9UQVRJT05TX0NPTlRST0xMRVIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlhZGRBbm5vdGF0aW9uQ29udHJvbGxlcihuZXcgRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbkNvbnRyb2xsZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZGVzY3JpcHRvci5nZXRJRCgpLCBudWxsKS5hZGRJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCWdldERlc2NyaXB0b3JzKCkuYWRkKGRlc2NyaXB0b3IpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW5ub3RhdGlvbkNvbnRyb2xsZXJzLgotCSAqLwotCXByb3RlY3RlZCBTb3J0ZWRTZXQgZ2V0RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsKQotCQkJZGVzY3JpcHRvcnMgPSBuZXcgVHJlZVNldChJZGVudGlmaWFibGVDb21wYXJhdG9yLmdldEluc3RhbmNlKCkpOwotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldERlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZGVzY3JpcHRvci5nZXRJRCgpLCBwcm9qZWN0KTsKLQkJCWlmIChpZGVudGlmaWVyLmlzRW5hYmxlZCgpKQotCQkJCXJldHVybiBkZXNjcmlwdG9yOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBhbnkgYW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW55QW5ub3RhdGlvbnNTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdG9ycygpLnNpemUoKSA+IDA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciNpZGVudGlmaWVyQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllckV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgaWRlbnRpZmllckV2ZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBpZGVudGlmaWVyRXZlbnQuZ2V0SWRlbnRpZmllcigpKS5nZXRQcm9qZWN0KCk7Ci0JCWdldEFubm90YXRpb25zQ29udHJvbGxlcnMoKS5yZW1vdmUocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0aW9ucyBjb250cm9sbGVyIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvbnNDb250cm9sbGVyIGdldEFubm90YXRpb25zQ29udHJvbGxlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFubm90YXRpb25zQ29udHJvbGxlciBjb250cm9sbGVyID0gKEFubm90YXRpb25zQ29udHJvbGxlcikgZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVycygpLmdldChwcm9qZWN0KTsKLQkJaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotCQkJaWYgKCFoYXNBbm5vdGF0aW9uc0J1aWxkZXIocHJvamVjdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKHByb2plY3QpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQlnZXRBbm5vdGF0aW9uc0NvbnRyb2xsZXJzKCkucHV0KHByb2plY3QsIChjb250cm9sbGVyID0gZGVzY3JpcHRvci5jcmVhdGVJbnN0YW5jZSgpKSk7Ci0JCX0KLQotCQlyZXR1cm4gY29udHJvbGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFubm90YXRpb25Db250cm9sbGVycy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldEFubm90YXRpb25zQ29udHJvbGxlcnMoKSB7Ci0JCWlmIChhbm5vdGF0aW9uc0NvbnRyb2xsZXJzID09IG51bGwpCi0JCQlhbm5vdGF0aW9uc0NvbnRyb2xsZXJzID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uc0NvbnRyb2xsZXJzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNBbm5vdGF0aW9uc0J1aWxkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlEZXNjcmlwdG9yIGFubm90YXRpb25zRGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IocHJvamVjdCk7Ci0JCWlmIChhbm5vdGF0aW9uc0Rlc2NyaXB0b3I9PW51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBoYXNCdWlsZGVyKHByb2plY3QsIGFubm90YXRpb25zRGVzY3JpcHRvci5nZXRCdWlsZGVySUQoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgYnVpbGRlck5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlDb21tYW5kW10gYnVpbGRlcnMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0QnVpbGRTcGVjKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbW1hbmQgYnVpbGRlciA9IGJ1aWxkZXJzW2ldOwotCQkJCWlmIChidWlsZGVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1aWxkZXIuZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlck5hbWUpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gRG8gbm90aGluZwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZThkODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCi0gKgotICogNTcyNC1JNjYKLSAqIAotICogqSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIE5vdGUgdG8gVS5TLiBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzOiAgVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIAotICogQURQICBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICogIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBBbm5vdGF0aW9uVGFnUmVnaXN0cnkKLSAqIHdoZW4gaXQgaXMgdGltZSB0byByZWdpc3RlciB0aGUgdGFncyBmb3IgYSBnaXZlbgotICogVGFnU2V0LiAgQW4gQW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplciBkZWZpbmVkCi0gKiB1c2luZyB0aGUgYW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplci4KLSAqIAotICogQHNlZSBjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5Bbm5vdGF0aW9uVGFnUmVnaXN0cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyIHsKLQl2b2lkIHJlZ2lzdGVyVGFncygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uVGFnUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uVGFnUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjYzE0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMjIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGtlbGxleXAKLSAqIAotICogU2luZ2xldG9uIHRoYXQgcGFyc2VzIHRoZSBhbm5vdGF0aW9uIHRhZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhbm5vdGF0aW9uLXRhZ2hhbmRsZXIgZXh0ZW5zaW9uCi0gKiBwb2ludCwgYW5kIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIGl0IGZvciBvdGhlciBjbGFzc2VzLiBMYXJnZWx5IHRha2VuIGZyb20gdGhlCi0gKiBBbm5vdGF0aW9uUHJvY2Vzc29yIGJ1aWxkZXIuCi0gKi8KLQotcHVibGljIGNsYXNzIEFubm90YXRpb25UYWdSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBTZXQgdG8gdHJ1ZSBvbmNlIHdlJ3ZlIHJlYWQgaW4gdGhlIGFubm90YXRpb24gdGFnIGluZm9ybWF0aW9uIGZyb20gdGhlIHBsdWdpbiByZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fVEFHX0lORk8gPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25UYWdJbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTGlzdCBvZiB0YWcgc3BlY3MgZm9yIGFsbCBvZiB0aGUgdGFncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgYWxsVGFnU3BlY3MgPSBuZXcgQXJyYXlMaXN0KCkgewotCQlmaW5hbCBwcml2YXRlIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NjgzNDUyNTgxMTIyODkyMTkwTDsKLQotCQlwcml2YXRlIHZvaWQgc2NvcGVBbGwoQ29sbGVjdGlvbiBjLCBib29sZWFuIGZvckFkZCkgewotCQkJSXRlcmF0b3IgaXRlciA9IGMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVRhZ1NwZWMgdHMgPSAoVGFnU3BlYykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZvckFkZCkKLQkJCQkJYWRkU2NvcGUodHMpOwotCQkJCWVsc2UKLQkJCQkJcmVtb3ZlU2NvcGUodHMpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFNjb3BlKFRhZ1NwZWMgdHMpIHsKLQkJCWlmICh0cyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXN3aXRjaCAodHMuZ2V0U2NvcGUoKSkgewotCQkJCWNhc2UgVGFnU3BlYy5GSUVMRCA6Ci0JCQkJCWZpZWxkVGFncy5wdXQodHMuZ2V0VGFnTmFtZSgpLCB0cyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnU3BlYy5NRVRIT0QgOgotCQkJCQltZXRob2RUYWdzLnB1dCh0cy5nZXRUYWdOYW1lKCksIHRzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdTcGVjLlRZUEUgOgotCQkJCQl0eXBlVGFncy5wdXQodHMuZ2V0VGFnTmFtZSgpLCB0cyk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlbW92ZVNjb3BlKFRhZ1NwZWMgdHMpIHsKLQkJCWlmICh0cyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXN3aXRjaCAodHMuZ2V0U2NvcGUoKSkgewotCQkJCWNhc2UgVGFnU3BlYy5GSUVMRCA6Ci0JCQkJCWZpZWxkVGFncy5yZW1vdmUodHMuZ2V0VGFnTmFtZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdTcGVjLk1FVEhPRCA6Ci0JCQkJCW1ldGhvZFRhZ3MucmVtb3ZlKHRzLmdldFRhZ05hbWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnU3BlYy5UWVBFIDoKLQkJCQkJdHlwZVRhZ3MucmVtb3ZlKHRzLmdldFRhZ05hbWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQlhZGRTY29wZSgoVGFnU3BlYyllbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotCQkJVGFnU3BlYyBuZXdUYWdTcGVjID0gKFRhZ1NwZWMpbzsKLQkJCS8vIHNlYXJjaCBmb3IgYWxyZWFkeSBleGlzdGluZyB0YWcgc3BlYyB3aXRoIHNhbWUgbmFtZSBhbmQgc2FtZSB0YWcgc2V0IG5hbWUKLQkJCWZvciAoaW50IGk9MDsgaTx0aGlzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGFnU3BlYyB0YWdTcGVjID0gKFRhZ1NwZWMpIGdldChpKTsKLQkJCQlpZiAodGFnU3BlYy5nZXRUYWdOYW1lKCkuZXF1YWxzKG5ld1RhZ1NwZWMuZ2V0VGFnTmFtZSgpKSAmJiB0YWdTcGVjLmdldFNjb3BlKCkgPT0gbmV3VGFnU3BlYy5nZXRTY29wZSgpKSB7Ci0JCQkJCXJlbW92ZSh0YWdTcGVjKTsKLQkJCQkJcmVtb3ZlU2NvcGUodGFnU3BlYyk7Ci0JCQkJfQkKLQkJCX0KLQkJCS8vIGFkZCB0aGUgbmV3IHRhZyBzcGVjCi0JCQlhZGRTY29wZShuZXdUYWdTcGVjKTsKLQkJCXJldHVybiBzdXBlci5hZGQobmV3VGFnU3BlYyk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCQlzY29wZUFsbChjLCB0cnVlKTsKLQkJCXJldHVybiBzdXBlci5hZGRBbGwoYyk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsKLQkJCXNjb3BlQWxsKGMsIHRydWUpOwotCQkJcmV0dXJuIHN1cGVyLmFkZEFsbChpbmRleCwgYyk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotCQkJcmVtb3ZlU2NvcGUoKFRhZ1NwZWMpIHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCQlyZW1vdmVTY29wZSgoVGFnU3BlYykgbyk7Ci0JCQlyZXR1cm4gc3VwZXIucmVtb3ZlKG8pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotCQkJc2NvcGVBbGwoYywgZmFsc2UpOwotCQkJcmV0dXJuIHN1cGVyLnJlbW92ZUFsbChjKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uIGMpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSB0aGlzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlUYWdTcGVjIHRzID0gKFRhZ1NwZWMpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghYy5jb250YWlucyh0cykpCi0JCQkJCXJlbW92ZVNjb3BlKHRzKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5yZXRhaW5BbGwoYyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogTWFwIGZyb20gYSB0YWcgbmFtZSB0byBhIEluaXRUYWdJbmZvLiBPbmx5IGxpdmUgZHVyaW5nIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGluaXQoKSBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHRhZ0F0dHJpYnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvKioKLQkgKiBEaXZpc2lvbiBvZiB0YWcgbmFtZXMgYmV0d2VlbiBhbGxvd2VkIHNjb3Blcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgbWV0aG9kVGFncyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgdHlwZVRhZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZpZWxkVGFncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX1BST1AgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfSU5JVElBTElaRVJfRVhfUFQgPSAiYW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTlNfQ09OVFJPTExFUl9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSGVscGVyIGZvciBpbml0LCBwYXJzZSB0aGUgdGFnIGF0dHJpYnV0ZXMgZm9yIGEgQW5ub3RhdGlvblRhZ0luZm8gdGFnLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtcwotCSAqICAgICAgICAgICAgQXJyYXkgb2YgImF0dHJpYiIgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgTG93ZXJjYXNlZCBuYW1lIG9mIHRoZSB0YWcgdGhlc2UgYXR0cmlidXRlcyBhcmUgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEluaXRUYWdJbmZvIHBhcnNlVGFnQXR0cmlicyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtcywgU3RyaW5nIHRhZ05hbWUsIFN0cmluZyBzY29wZSkgewotCQlpbnQgaTsKLQkJQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSW5pdFRhZ0luZm8gdGFnSW5mID0gbmV3IEluaXRUYWdJbmZvKHRhZ05hbWUsIHNjb3BlLCBhdHRyaWJMaXN0KTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gZWxlbXNbaV07Ci0KLQkJCWlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJhdHRyaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJVGFnQXR0cmliU3BlYyB0YXMgPSBuZXcgVGFnQXR0cmliU3BlYyhlbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBlbGVtLmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyB1c2UgPSBlbGVtLmdldEF0dHJpYnV0ZSgidXNlIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXRhcy5zZXRUeXBlKGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBhZGQgdmFsaWQgdmFsdWVzCi0JCQkJaWYgKCJlbnVtIi5lcXVhbHMoZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHZhbGlkVmFsdWVzID0gZWxlbS5nZXRDaGlsZHJlbigiZW51bVZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxpc3QgdmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2YWxpZFZhbHVlcy5sZW5ndGg7IGorKykgewotCQkJCQkJU3RyaW5nIHZhbHVlID0gdmFsaWRWYWx1ZXNbal0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZXNMaXN0LmFkZCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nW10gdmFsaWRWYWx1ZXNBcnJheSA9IG5ldyBTdHJpbmdbdmFsdWVzTGlzdC5zaXplKCldOwotCQkJCQl2YWxpZFZhbHVlc0FycmF5ID0gKFN0cmluZ1tdKSB2YWx1ZXNMaXN0LnRvQXJyYXkodmFsaWRWYWx1ZXNBcnJheSk7Ci0KLQkJCQkJdGFzLnNldFZhbGlkVmFsdWVzKHZhbGlkVmFsdWVzQXJyYXkpOwotCQkJCX0KLQotCQkJCWlmICh1c2UgPT0gbnVsbCkgewotCQkJCQl0YXMuY2xlYXJSZXF1aXJlZCgpOwotCQkJCX0gZWxzZSBpZiAodXNlLmVxdWFsc0lnbm9yZUNhc2UoInJlcXVpcmVkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl0YXMuc2V0UmVxdWlyZWQoKTsKLQkJCQl9IGVsc2UgaWYgKHVzZS5lcXVhbHNJZ25vcmVDYXNlKCJvcHRpb25hbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFzLmNsZWFyUmVxdWlyZWQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBVbmxpa2VseSwgdW5sZXNzIGFubm90YXRpb24gZXh0ZW5zaW9uIHNwZWMgY2hhbmdlcwotCQkJCQkvLyB3aXRob3V0IGNoYW5nZXMgaGVyZS4KLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5nZXRTdHJpbmcoIkFubm90YXRpb25UYWdSZWdpc3RyeS45IikgKyB1c2UpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1VbmlxdWVBcnJheSA9IGVsZW0uZ2V0Q2hpbGRyZW4oInVuaXF1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGVsZW1VbmlxdWVBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQkJCXRhcy5zZXRVbmlxdWUoKTsKLQkJCQkJaWYgKGVsZW1VbmlxdWVBcnJheVswXS5nZXRBdHRyaWJ1dGUoInNjb3BlIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGFzLmdldFVuaXF1ZSgpLnNldFNjb3BlKFRhZ0F0dHJpYlNwZWMudW5pcXVlU2NvcGVGcm9tU3RyaW5nKGVsZW1VbmlxdWVBcnJheVswXS5nZXRBdHRyaWJ1dGUoInNjb3BlIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZWxlbVVuaXF1ZUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuZ2V0U3RyaW5nKCJUYWdBdHRyaWJTcGVjLjIiKSArIGVsZW1VbmlxdWVBcnJheS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0YXMuY2xlYXJVbmlxdWUoKTsKLQkJCQl9Ci0KLQkJCQlhdHRyaWJMaXN0LmFkZCh0YXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YWdJbmY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWcgc2V0IG5hbWUgZnJvbSBhIGZ1bGwgdGFnIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIEZ1bGwgdGFnIG5hbWUgKHdpdGhvdXQgdGhlICdAJyBhdCB0aGUgYmVnaW5uaW5nKQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWdTZXRGcm9tVGFnTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpZHggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0KLQkJaWYgKGlkeCAhPSAtMSkKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBpZHgpOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgZnJvbSBhIGZ1bGwgdGFnIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIEZ1bGwgdGFnIG5hbWUgKHdpdGhvdXQgdGhlICdAJyBhdCB0aGUgYmVnaW5uaW5nKQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWdGcm9tVGFnTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpZHggPSBuYW1lLmluZGV4T2YoJy4nKTsKLQotCQlpZiAoaWR4ICE9IC0xKSB7Ci0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaWR4ICsgMSk7Ci0JCX0KLQkJLy8gRGVmYXVsdCB0byB0aGUgd2hvbGUgbmFtZSBiZWluZyB0aGUgdGFnc2V0LgotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBpbiBhbGwgb2YgdGhlIHRhZyBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gZnJvbSBhbGwgYW5ub3RhdGlvbi10YWctaW5mbyBleHRlbnNpb25zIGRlZmluZWQKLQkgKiBpbiB0aGUgc3lzdGVtLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIHRhZ0F0dHJpYnMgaGFzaHRhYmxlIHdpdGggdGhlbS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRBbGxBdHRyaWJ1dGVJbmZvKElFeHRlbnNpb25Qb2ludCB4cCkgewotCi0JCWlmICh4cCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJRXh0ZW5zaW9uW10gZXh0cyA9IHhwLmdldEV4dGVuc2lvbnMoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbXMgPSBleHRzW2ldLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGV4dHNbaV0uZ2V0TmFtZXNwYWNlKCkpOwotCQkJU3RyaW5nIGlkZW50aWZpZXIgPSBleHRzW2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsKLQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBudWxsOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQkJU3RyaW5nIHNjb3BlID0gbnVsbDsKLQkJCVN0cmluZyB0YWdTZXQgPSBudWxsOwotCQkJU3RyaW5nIGZ1bGxUYWdOYW1lID0gbnVsbDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbXMubGVuZ3RoOyBqKyspIHsKLQkJCQllbGVtID0gZWxlbXNbal07Ci0JCQkJaWYgKCFlbGVtLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJBbm5vdGF0aW9uVGFnSW5mbyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRhZ1NldCA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0YWdTZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRhZ05hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZSgidGFnTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2NvcGUgPSBlbGVtLmdldEF0dHJpYnV0ZSgic2NvcGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpc051bGxPckVtcHR5KHRhZ1NldCkgfHwgaXNOdWxsT3JFbXB0eSh0YWdOYW1lKSB8fCBpc051bGxPckVtcHR5KHNjb3BlKSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5nZXRTdHJpbmcoIkFubm90YXRpb25UYWdSZWdpc3RyeS4xMCIsIG5ldyBPYmplY3RbXXtpZGVudGlmaWVyfSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWZ1bGxUYWdOYW1lID0gdGFnU2V0ICsgIi4iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJSW5pdFRhZ0luZm8gdGFnSW5mID0gcGFyc2VUYWdBdHRyaWJzKGVsZW0uZ2V0Q2hpbGRyZW4oKSwgZnVsbFRhZ05hbWUudG9Mb3dlckNhc2UoKSwgc2NvcGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGtleSA9IChmdWxsVGFnTmFtZSArICIjIiArIHNjb3BlKS50b0xvd2VyQ2FzZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJLyoKLQkJCQkgKiBUaGVyZSBzaG91bGQgb25seSBldmVyIGJlIG9uZSBBbm5vdGF0aW9uVGFnSW5mbyB0YWcgZm9yIGFueSBvbmUgYW5ub3RhdGlvbiB0YWcuCi0JCQkJICovCi0JCQkJaWYgKHRhZ0F0dHJpYnMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5nZXRTdHJpbmcoIkFubm90YXRpb25UYWdSZWdpc3RyeS4wIikgKyB0YWdOYW1lICsgIicuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0gZWxzZSB7Ci0JCQkJCXRhZ0luZi5idW5kbGUgPSBidW5kbGU7Ci0JCQkJCXRhZ0F0dHJpYnMucHV0KGtleSwgdGFnSW5mKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGFTdHJpbmcgPT0gbnVsbCB8fCBhU3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGFnU3BlYyBpbmZvcm1hdGlvbiBpbiBmcm9tIHRoZSBwbHVnaW4gcmVnaXN0cnkuIFRha2VuIGZyb20gQW5ub3RhdGlvblByb2Nlc3Nvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGVyZSB3ZXJlIHByb2JsZW1zIHJlYWRpbmcgdGhlIHJlZ2lzdHJ5LgotCSAqLwotCXByaXZhdGUgc3RhdGljLyogc3luY2hyb25pemVkICovYm9vbGVhbiBpbml0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCSAvKiBQcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uICovCi0gICAgICAgaWYgKGluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgIH0KLSAgICAgIGluaXRpYWxpemVTdGF0aWNUYWdEZWZpbml0aW9ucygpOwotICAgICAgaW5pdGlhaXplRHluYW1pY1RhZ0RlZmluaXRpb25zKCk7Ci0gICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gICAgICAgLyogRG9uJ3QgbmVlZCB0aGlzIGFueW1vcmUgKi8KLSAgICAgICB0YWdBdHRyaWJzID0gbnVsbDsKLQotICAgICAgIHJldHVybiB0cnVlOwotICAgfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVN0YXRpY1RhZ0RlZmluaXRpb25zKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0JCS8vIFRPRE86IE5vdCBldmVuIGNoZWNraW5nIHRoZSB0YWdzZXQgZXh0ZW5zaW9uIHBvaW50IHlldC4KLQkJSUV4dGVuc2lvblBvaW50IHhwID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoQU5OT1RBVElPTl9UQUdfSU5GTyk7Ci0KLSAgICAgICAgaWYgKHhwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSUV4dGVuc2lvbltdIHggPSB4cC5nZXRFeHRlbnNpb25zKCk7Ci0KLSAgICAgICAgLyogR2V0IGFsbCB0YWcgYXR0cmlidXRlIGluZm9ybWF0aW9uICovCi0gICAgICAgIHJlYWRBbGxBdHRyaWJ1dGVJbmZvKHhwKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCB4Lmxlbmd0aDsgaisrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0YWdTcGVjcyA9IHhbal0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ1NwZWNzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRhZ1NwZWMgPSB0YWdTcGVjc1tpXTsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IHRhZ1NwZWMuZ2V0QXR0cmlidXRlKCJ0YWdTZXQiKSArICIuIiArIHRhZ1NwZWMuZ2V0QXR0cmlidXRlKCJ0YWdOYW1lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJU3RyaW5nIHNjb3BlID0gdGFnU3BlYy5nZXRBdHRyaWJ1dGUoInNjb3BlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbXVsdGlwbGljaXR5ID0gdGFnU3BlYy5nZXRBdHRyaWJ1dGUoIm11bHRpcGxpY2l0eSIpOyAvLyROT04tTkxTLTEkCi0JCQkJVGFnU3BlYyB0cyA9IG51bGw7Ci0JCQkJaWYgKG11bHRpcGxpY2l0eSAhPSBudWxsKQotCQkJCQl0cyA9IG5ldyBUYWdTcGVjKHRhZ05hbWUsIFRhZ1NwZWMuc2NvcGVGcm9tU3RyaW5nKHNjb3BlKSwgVGFnU3BlYy5tdWx0aXBsaWNpdHlGcm9tU3RyaW5nKG11bHRpcGxpY2l0eSkpOwotCQkJCWVsc2UKLQkJCQkJdHMgPSBuZXcgVGFnU3BlYyh0YWdOYW1lLCBUYWdTcGVjLnNjb3BlRnJvbVN0cmluZyhzY29wZSksIFRhZ1NwZWMuTXVsdGlwbGljaXR5Lk9ORSk7Ci0JCQkJU3RyaW5nIGtleSA9ICh0YWdOYW1lICsgIiMiICsgc2NvcGUpLnRvTG93ZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJbml0VGFnSW5mbyB0YWdJbmYgPSAoSW5pdFRhZ0luZm8pIHRhZ0F0dHJpYnMuZ2V0KGtleSk7Ci0KLQkJCQlhbGxUYWdTcGVjcy5hZGQodHMpOwotCi0JCQkJaWYgKHRhZ0luZiAhPSBudWxsKSB7Ci0JCQkJCXRzLnNldEF0dHJpYnV0ZXModGFnSW5mLmF0dHJpYnV0ZXMpOwotCQkJCQl0cy5zZXRCdW5kbGUodGFnSW5mLmJ1bmRsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFpemVEeW5hbWljVGFnRGVmaW5pdGlvbnMoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCB4cCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoQU5OT1RBVElPTlNfQ09OVFJPTExFUl9OQU1FU1BBQ0UsIERZTkFNSUNfSU5JVElBTElaRVJfRVhfUFQpOwotCQlpZiAoeHAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSB4cC5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplciBpbml0aWFsaXplciA9IChBbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyKSBlbGVtZW50c1tqXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX1BST1ApOwotCQkJCQlpbml0aWFsaXplci5yZWdpc3RlclRhZ3MoKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3Qgb2YgQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5LlRhZ1NwZWNzIGZvciBhbGwgdGFncy4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGVyZSB3ZXJlIHByb2JsZW1zIHJlYWRpbmcgdGhlIGluaXRpYWxpemF0aW9uIGRhdGEgZnJvbSB0aGUgcGx1Z2luIHJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3QgZ2V0QWxsVGFnU3BlY3MoKSB7Ci0JCXJldHVybiBhbGxUYWdTcGVjczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzTWV0aG9kVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiBtZXRob2RUYWdzLmNvbnRhaW5zS2V5KHRhZ05hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGaWVsZFRhZyhTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gZmllbGRUYWdzLmNvbnRhaW5zS2V5KHRhZ05hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNUeXBlVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0eXBlVGFncy5jb250YWluc0tleSh0YWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRoZSB0YWdzcGVjIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZCB0YWcgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgRnVsbCBuYW1lIGZvciBhIHRhZy4KLQkgKiBAcmV0dXJuIGEgVGFnU3BlYyBmb3IgdGhlIHRhZyBuYW1lLCBvciBudWxsIGlmIG5vIHRhZyB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFRhZ1NwZWMgZ2V0TWV0aG9kVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiAoVGFnU3BlYykgbWV0aG9kVGFncy5nZXQodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyB0aGUgdGFnc3BlYyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZCB0YWcgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgRnVsbCBuYW1lIGZvciBhIHRhZy4KLQkgKiBAcmV0dXJuIGEgVGFnU3BlYyBmb3IgdGhlIHRhZyBuYW1lLCBvciBudWxsIGlmIG5vIHRhZyB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFRhZ1NwZWMgZ2V0RmllbGRUYWcoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIChUYWdTcGVjKSBmaWVsZFRhZ3MuZ2V0KHRhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgdGhlIHRhZ3NwZWMgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSB0YWcgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgRnVsbCBuYW1lIGZvciBhIHRhZy4KLQkgKiBAcmV0dXJuIGEgVGFnU3BlYyBmb3IgdGhlIHRhZyBuYW1lLCBvciBudWxsIGlmIG5vIHRhZyB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFRhZ1NwZWMgZ2V0VHlwZVRhZyhTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gKFRhZ1NwZWMpIHR5cGVUYWdzLmdldCh0YWdOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbml0VGFnSW5mbyB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkJcHJpdmF0ZSBMaXN0IGF0dHJpYnV0ZXM7Ci0KLQkJcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JCXByaXZhdGUgU3RyaW5nIHNjb3BlOwotCi0JCXB1YmxpYyBJbml0VGFnSW5mbyhTdHJpbmcgbmFtZSwgU3RyaW5nIHNjb3BlLCBMaXN0IGF0dCkgewotCQkJYXR0cmlidXRlcyA9IGF0dDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZSBpZiAoIShvYmogaW5zdGFuY2VvZiBJbml0VGFnSW5mbykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlyZXR1cm4gbmFtZS5lcXVhbHMoKChJbml0VGFnSW5mbykgb2JqKS5uYW1lKSB8fCAoc2NvcGUuZXF1YWxzKCgoSW5pdFRhZ0luZm8pIG9iaikubmFtZSkpOwotCi0JCX0KLQl9Ci0KLQlzdGF0aWMgewotCQl0cnkgewotCQkJQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5LmluaXQoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLmdldFN0cmluZygiQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5X0VSUk9SXzEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmUxMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0Fubm90YXRpb25UYWdzZXRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDcsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uVGFnc2V0UmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5KCk7Ci0KLQlwcml2YXRlIE1hcCBpbmRleDsKLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uVGFnc2V0UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIiLCBUYWdzZXREZXNjcmlwdG9yLlRBR1NFVCk7IC8vJE5PTi1OTFMtMSQKLQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoVGFnc2V0RGVzY3JpcHRvci5UQUdTRVQuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJZ2V0RGVzY3JpcHRvcnMoKS5hZGQobmV3IFRhZ3NldERlc2NyaXB0b3IoZWxlbWVudCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBUYWdzZXREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkgewotCi0JCQkvKiBJbmRleCBkZXNjcmlwdG9ycyB0byBhdm9pZCB1bm5lY2Vzc2FyeSBzZWFyY2hpbmcgKi8KLQkJCVRhZ3NldERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYWdzZXREZXNjcmlwdG9yKSBnZXRJbmRleCgpLmdldChuYW1lKTsKLQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5LklOU1RBTkNFLmdldERlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCQlkZXNjcmlwdG9yID0gKFRhZ3NldERlc2NyaXB0b3IpIGl0ci5uZXh0KCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0TmFtZSgpKSkgewotCQkJCQlnZXRJbmRleCgpLnB1dChkZXNjcmlwdG9yLmdldE5hbWUoKSwgZGVzY3JpcHRvcik7Ci0JCQkJCXJldHVybiBkZXNjcmlwdG9yOwotCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRvcnMuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsKQotCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluZGV4LgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0SW5kZXgoKSB7Ci0JCWlmIChpbmRleCA9PSBudWxsKQotCQkJaW5kZXggPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclRhZ3NldChUYWdzZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCAmJiBnZXREZXNjcmlwdG9yKGRlc2NyaXB0b3IuZ2V0TmFtZSgpKSA9PSBudWxsKQotCQkJZ2V0RGVzY3JpcHRvcnMoKS5hZGQoZGVzY3JpcHRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9Bbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1N2Q5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciA4LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIGtrYXR5YWwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJhbm5vdGF0aW9uY29udHJvbGxlciI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMoKSB7Ci0JCS8vIERlZmF1bHQgY29uc3RydWN0b3IKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0KLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGtleSwgYXJncyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0F0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9BdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTY3MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0F0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyIHsKLQlwcml2YXRlIFN0cmluZyByZXBsYWNlbWVudFN0cmluZzsKLQlwcml2YXRlIGludCB2YWx1ZU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgcmVwbGFjZW1lbnRMZW5ndGggPSAwOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlRGlzcGxheVN0cmluZzsKLQlwcml2YXRlIGJvb2xlYW4gZW5zdXJlQmVnaW5RdW90ZSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGVuc3VyZUVuZFF1b3RlID0gdHJ1ZTsKLQotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHZhbHVlT2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyB2YWx1ZURpc3BsYXlTdHJpbmcpIHsKLQkJdGhpcy5yZXBsYWNlbWVudFN0cmluZyA9IHJlcGxhY2VtZW50U3RyaW5nOwotCQl0aGlzLnZhbHVlT2Zmc2V0ID0gdmFsdWVPZmZzZXQ7Ci0JCXRoaXMucmVwbGFjZW1lbnRMZW5ndGggPSByZXBsYWNlbWVudExlbmd0aDsKLQkJdGhpcy52YWx1ZURpc3BsYXlTdHJpbmcgPSB2YWx1ZURpc3BsYXlTdHJpbmc7Ci0JfQotCi0JcHVibGljIGludCBnZXRSZXBsYWNlbWVudExlbmd0aCgpIHsKLQkJcmV0dXJuIHJlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50TGVuZ3RoKGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQl0aGlzLnJlcGxhY2VtZW50TGVuZ3RoID0gcmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXBsYWNlbWVudFN0cmluZygpIHsKLQkJcmV0dXJuIHJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50U3RyaW5nKFN0cmluZyByZXBsYWNlbWVudFN0cmluZykgewotCQl0aGlzLnJlcGxhY2VtZW50U3RyaW5nID0gcmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiB2YWx1ZURpc3BsYXlTdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWVEaXNwbGF5U3RyaW5nKFN0cmluZyB2YWx1ZURpc3BsYXlTdHJpbmcpIHsKLQkJdGhpcy52YWx1ZURpc3BsYXlTdHJpbmcgPSB2YWx1ZURpc3BsYXlTdHJpbmc7Ci0JfQotCi0JcHVibGljIGludCBnZXRWYWx1ZU9mZnNldCgpIHsKLQkJcmV0dXJuIHZhbHVlT2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlT2Zmc2V0KGludCB2YWx1ZU9mZnNldCkgewotCQl0aGlzLnZhbHVlT2Zmc2V0ID0gdmFsdWVPZmZzZXQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5zdXJlQmVnaW5RdW90ZSgpIHsKLQkJcmV0dXJuIGVuc3VyZUJlZ2luUXVvdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5zdXJlQmVnaW5RdW90ZShib29sZWFuIGVuc3VyZUJlZ2luUXVvdGUpIHsKLQkJdGhpcy5lbnN1cmVCZWdpblF1b3RlID0gZW5zdXJlQmVnaW5RdW90ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbnN1cmVFbmRRdW90ZSgpIHsKLQkJcmV0dXJuIGVuc3VyZUVuZFF1b3RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuc3VyZUVuZFF1b3RlKGJvb2xlYW4gZW5zdXJlRW5kUXVvdGUpIHsKLQkJdGhpcy5lbnN1cmVFbmRRdW90ZSA9IGVuc3VyZUVuZFF1b3RlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQXR0cmlidXRlVmFsdWVzSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvQXR0cmlidXRlVmFsdWVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzBhOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L0F0dHJpYnV0ZVZhbHVlc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdWwgMSwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlVmFsdWVzSGVscGVyIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfVkFMVUVTID0gbmV3IFN0cmluZ1swXTsKLQlzdGF0aWMgZmluYWwgQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcltdIEVNUFRZX1BST1BPU0FMX0hFTFBFUlMgPSBuZXcgQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlclswXTsKLQotCS8qKgotCSAqIFJldHVybiBhIHNpbXBsZSBTdHJpbmcgYXJyYXkgY29udGFpbmluZyB0aGUgdmFsaWQgdmFsdWVzIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QGxpbmsgVGFnQXR0cmlidXRlU3BlY31hbmQge0BsaW5rIElKYXZhRWxlbWVudH0uCi0JICogCi0JICogQHBhcmFtIHRhcwotCSAqIEBwYXJhbSBqYXZhRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRWYWx1ZXMoVGFnQXR0cmliU3BlYyB0YXMsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgbW9yZSBhZHZhbmNlZCBhcGkgZm9yIHJldHVybmluZyB2YWxpZCB2YWx1ZXMgZm9yIGEgZ2l2ZW4ge0BsaW5rIFRhZ0F0dHJpYlNwZWN9LgotCSAqIFRoaXMgYXBpIHByb3ZpZGVzIHlvdSB3aXRoIG1vcmUgZmxleGliaWxpdHkgdG8gY29udHJvbCB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIHRoYXQgaXMgdXNlZAotCSAqIGZvciB0aGUgY29tcGxldGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGFzCi0JICogQHBhcmFtIHBhcnRpYWxWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZU9mZnNldAotCSAqIEBwYXJhbSBqYXZhRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcltdIGdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXJzKFRhZ0F0dHJpYlNwZWMgdGFzLCBTdHJpbmcgcGFydGlhbFZhbHVlLCBpbnQgdmFsdWVPZmZzZXQsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvVGFnQXR0cmliU3BlYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ0F0dHJpYlNwZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2MzU5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvVGFnQXR0cmliU3BlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDI1LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzOwotCi0vKioKLSAqIEBhdXRob3Iga2VsbGV5cCBJbmZvcm1hdGlvbiBvbiBhIHNpbmdsZSBwYXJhbWV0ZXIgZm9yIGEgdGFnLiBQYXJhbWV0ZXJzIGhhdmUgbmFtZXMsIGFuZCBjYW4gYmUKLSAqICAgICAgICAgbWFya2VkIGFzIGJlaW5nIHJlcXVpcmVkLiAoaWUsIG5vdCBvcHRpb25hbCkKLSAqLwotcHVibGljIGNsYXNzIFRhZ0F0dHJpYlNwZWMgewotCXByaXZhdGUgU3RyaW5nIGF0dHJpYk5hbWU7Ci0JcHJpdmF0ZSBpbnQgZmxhZ3M7Ci0JcHJpdmF0ZSBTdHJpbmcgaGVscEtleTsKLQlwcml2YXRlIGludCB0eXBlID0gVHlwZS5URVhUOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEdfUkVRVUlSRUQgPSAxOwotCXByaXZhdGUgU3RyaW5nW10gdmFsaWRWYWx1ZXM7Ci0JcHJpdmF0ZSBUYWdTcGVjIHRhZ1NwZWM7Ci0KLQkvKiBFbnVtIGZvciB0eXBlICovCi0JcHVibGljIGludGVyZmFjZSBUeXBlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4gPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBVFlQRSA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVU0gPSAzOwotCX0KLQotCXB1YmxpYyBjbGFzcyBVbmlxdWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RVTEUgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRCA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEID0gNDsKLQotCQlwcml2YXRlIGludCBzY29wZSA9IE1PRFVMRTsKLQotCQlwdWJsaWMgaW50IGdldFNjb3BlKCkgewotCQkJcmV0dXJuIHNjb3BlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2NvcGUoaW50IGluKSB7Ci0JCQlzY29wZSA9IGluOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBVbmlxdWUgdW5pcXVlOwotCi0JcHVibGljIFVuaXF1ZSBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiB1bmlxdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbmlxdWUoKSB7Ci0JCXJldHVybiB1bmlxdWUgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoKSB7Ci0JCXVuaXF1ZSA9IG5ldyBVbmlxdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhclVuaXF1ZSgpIHsKLQkJdW5pcXVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRhZyBhdHRyaWJ1dGUgdHlwZSB0byB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gSW50ZWdlciB0eXBlLCBkZWZhdWx0cyB0byBURVhUIGlmIHRoZSB0eXBlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgdHlwZU5hbWVUb1R5cGUoU3RyaW5nIG5hbWUpIHsKLQkJLy9UT0RPIGFkZCBlbnVtCi0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInRleHQiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInN0cmluZyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBUeXBlLlRFWFQ7Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYm9vbGVhbiIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYm9vbCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBUeXBlLkJPT0xFQU47Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YVR5cGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIFR5cGUuSkFWQVRZUEU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFR5cGUuVEVYVDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHR5cGUgZW51bSB0byBhIHR5cGUgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlVG9UeXBlTmFtZShpbnQgdHkpIHsKLQkJc3dpdGNoICh0eSkgewotCQkJY2FzZSBUeXBlLlRFWFQgOgotCQkJCXJldHVybiAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBUeXBlLkJPT0xFQU4gOgotCQkJCXJldHVybiAiYm9vbCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgVHlwZS5KQVZBVFlQRSA6Ci0JCQkJcmV0dXJuICJqYXZhVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFRhZ0F0dHJpYlNwZWMgd2l0aCA8Y29kZT5uYW1lPC9jb2RlPiBhcyB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuIE11c3Qgbm90IGJlIG51bGwuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBuYW1lIGlzIG51bGwuCi0JICovCi0JcHVibGljIFRhZ0F0dHJpYlNwZWMoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0aGlzKG5hbWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBUYWdBdHRyaWJTcGVjKFN0cmluZyBuYW1lLCBTdHJpbmcgaGxwS2V5KSB7Ci0JCXNldEF0dHJpYk5hbWUobmFtZSk7Ci0JCXNldEhlbHBLZXkoaGxwS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlIG9mIHRoaXMgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSB0Ci0JICogICAgICAgICAgICBURVhUIHwgQk9PTEVBTgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHQpIHsKLQkJdHlwZSA9IHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZW5hbWUKLQkgKiAgICAgICAgICAgIFN0cmluZyByZXByZXNlbnRhdGlvbiwgc2hvdWxkIGJlIHRleHQgb3IgYm9vbGVhbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlbmFtZSkgewotCQl0eXBlID0gdHlwZU5hbWVUb1R5cGUodHlwZW5hbWUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVJc0phdmFUeXBlKCkgewotCQlyZXR1cm4gdHlwZSA9PSBUeXBlLkpBVkFUWVBFOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlSXNUZXh0KCkgewotCQlyZXR1cm4gdHlwZSA9PSBUeXBlLlRFWFQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVJc0Jvb2woKSB7Ci0JCXJldHVybiB0eXBlID09IFR5cGUuQk9PTEVBTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYk5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZSBuYW1lLiBUaGlzIGNhbiBub3QgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgTmV3IG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgbmFtZSBpcyBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYk5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEFubm90YXRpb25zQ29yZVJlc291cmNlcy5nZXRTdHJpbmcoIlRhZ0F0dHJpYlNwZWMuNiIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWF0dHJpYk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcmVxdWlyZWQgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBGTEdfUkVRVUlSRUQpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVxdWlyZWQgZmxhZyBmb3IgdGhpcyBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoKSB7Ci0JCWZsYWdzIHw9IEZMR19SRVFVSVJFRDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJlcXVpcmVkIGZsYWcgZm9yIHRoaXMgYXR0cmlidXRlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJlcXVpcmVkKCkgewotCQlmbGFncyAmPSAofkZMR19SRVFVSVJFRCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgaGVscCBrZXkgZm9yIHRoaXMgdGFnIGF0dHJpYnV0ZS4gU2hvdWxkIG5ldmVyIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEtleShpbnQgYVR5cGUpIHsKLQkJaWYgKGFUeXBlICE9IFRhZ1NwZWMuSEVMUF9URVhUKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChoZWxwS2V5ID09IG51bGwpIHsKLQkJCWhlbHBLZXkgPSBkZWZhdWx0SGVscEtleSgpOwotCQl9Ci0JCXJldHVybiBoZWxwS2V5OwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGhlbHAgdGV4dCBzbyBpdCBpbmNsdWRlcyB0eXBlIGFuZCB1c2UgaW5mb3JtYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0cmFuc2Zvcm1Mb2NhbGl6ZWRUZXh0KFN0cmluZyB0eHQpIHsKLQkJaWYgKHR4dCA9PSBudWxsKQotCQkJcmV0dXJuIHR4dDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodHh0Lmxlbmd0aCgpICsgNTApOwotCi0JCWJ1Zi5hcHBlbmQoIjxiPlR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1Zi5hcHBlbmQodHlwZVRvVHlwZU5hbWUodHlwZSkpOwotCQlidWYuYXBwZW5kKCIsIFVzZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuaXNSZXF1aXJlZCgpKSB7Ci0JCQlidWYuYXBwZW5kKCJyZXF1aXJlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlidWYuYXBwZW5kKCJvcHRpb25hbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHRoaXMuaXNVbmlxdWUoKSkgewotCQkJYnVmLmFwcGVuZCgiLCB1bmlxdWU6c2NvcGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWYuYXBwZW5kKFRhZ0F0dHJpYlNwZWMudW5pcXVlU2NvcGVUb1N0cmluZyh0aGlzLmdldFVuaXF1ZSgpLmdldFNjb3BlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1Zi5hcHBlbmQoIjwvYj48cD4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKHR4dCk7Ci0JCWJ1Zi5hcHBlbmQoIjwvcD4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBoZWxwIGtleSBmb3IgdGhpcyB0YWcgYXR0cmlidXRlLiBTaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIZWxwS2V5KCkgewotCQlyZXR1cm4gZ2V0VGV4dEtleShUYWdTcGVjLkhFTFBfVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVscCBrZXkuIFNldHRpbmcgdGhpcyB0byBudWxsIHJlc2V0cyB0aGUgaGVscCBrZXkgdG8gdGhlIGRlZmF1bHQgaGVscCBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBLZXkoU3RyaW5nIGtleSkgewotCQloZWxwS2V5ID0ga2V5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaGVscCBrZXkgbmFtZSBmb3IgdGhpcyB0YWcuCi0JICogIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRIZWxwS2V5KCkgewotCQlyZXR1cm4gImF0aC4iICsgYXR0cmliTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IHVuaXF1ZVNjb3BlRnJvbVN0cmluZyhTdHJpbmcgc2NvcGVTdHIpIHsKLQkJaWYgKHNjb3BlU3RyICE9IG51bGwpIHsKLQkJCWlmIChzY29wZVN0ci5lcXVhbHNJZ25vcmVDYXNlKCJtb2R1bGUiKSlyZXR1cm4gVGFnQXR0cmliU3BlYy5VbmlxdWUuTU9EVUxFOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2NvcGVTdHIuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKXJldHVybiBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5GSUxFOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2NvcGVTdHIuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKXJldHVybiBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5UWVBFOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2NvcGVTdHIuZXF1YWxzSWdub3JlQ2FzZSgibWV0aG9kIikpcmV0dXJuIFRhZ0F0dHJpYlNwZWMuVW5pcXVlLk1FVEhPRDsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHNjb3BlU3RyLmVxdWFsc0lnbm9yZUNhc2UoImZpZWxkIikpcmV0dXJuIFRhZ0F0dHJpYlNwZWMuVW5pcXVlLkZJRUxEOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKEFubm90YXRpb25zQ29udHJvbGxlclJlc291cmNlcy5nZXRTdHJpbmcoIlRhZ0F0dHJpYlNwZWMuMSIpICsgc2NvcGVTdHIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5NT0RVTEU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlU2NvcGVUb1N0cmluZyhpbnQgc2NvcGUpIHsKLQkJc3dpdGNoIChzY29wZSkgewotCQkJY2FzZSBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5NT0RVTEUgOgotCQkJCXJldHVybiAibW9kdWxlIjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBUYWdBdHRyaWJTcGVjLlVuaXF1ZS5GSUxFIDoKLQkJCQlyZXR1cm4gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIFRhZ0F0dHJpYlNwZWMuVW5pcXVlLlRZUEUgOgotCQkJCXJldHVybiAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgVGFnQXR0cmliU3BlYy5VbmlxdWUuTUVUSE9EIDoKLQkJCQlyZXR1cm4gIm1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgVGFnQXR0cmliU3BlYy5VbmlxdWUuRklFTEQgOgotCQkJCXJldHVybiAiZmllbGQiOyAvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLmdldFN0cmluZygiVGFnQXR0cmliU3BlYy4xIikgKyBzY29wZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gInVua25vd24gdmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsaWRWYWx1ZXMuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFZhbGlkVmFsdWVzKCkgewotCQlyZXR1cm4gdmFsaWRWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkVmFsdWVzCi0JICogICAgICAgICAgICBUaGUgdmFsaWRWYWx1ZXMgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkVmFsdWVzKFN0cmluZ1tdIHZhbGlkVmFsdWVzKSB7Ci0JCXRoaXMudmFsaWRWYWx1ZXMgPSB2YWxpZFZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgVGFnU3BlYyBnZXRUYWdTcGVjKCkgewotCQlyZXR1cm4gdGFnU3BlYzsKLQl9Ci0KLQl2b2lkIHNldFRhZ1NwZWMoVGFnU3BlYyB0YWdTcGVjKSB7Ci0JCXRoaXMudGFnU3BlYyA9IHRhZ1NwZWM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBsb29rdXBUYWdIZWxwKCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlQnVuZGxlIGIgPSBnZXRUYWdTcGVjKCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcga2V5ID0gZ2V0SGVscEtleSgpOwotCQlTdHJpbmcgdmFsID0gYi5nZXRTdHJpbmcoZ2V0SGVscEtleSgpKTsKLQkJaWYgKHZhbCA9PSBrZXkpCi0JCQl2YWwgPSBudWxsOwotCQlyZXR1cm4gdHJhbnNmb3JtTG9jYWxpemVkVGV4dCh2YWwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvVGFnU3BlYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ1NwZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlZTcyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9jb250cm9sbGVyL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvcmVnaXN0cnkvVGFnU3BlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBbGwgb2YgdGhlIGluZm9ybWF0aW9uIGluIGEgc2luZ2xlIHRhZ1NwZWMgdGFnLCBpbmNsdWRpbmcgdGhlIGVuY2xvc2luZyBoYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgVGFnU3BlYyB7Ci0KLQkvKioKLQkgKiBIYW5kbGUgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHBsdWdpbiB0aGF0IGRlY2xhcmVkIHRoZSBjb21wbGV0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIHRhZywKLQkgKiBpZiBhbnkuCi0JICovCi0JQnVuZGxlIGJ1bmRsZTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhdHRlbXB0ZWRUb0ZpbmRSZXNvdXJjZUJ1bmRsZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBBdHRyaWJ1dGVWYWx1ZXNIZWxwZXIgdmFsaWRWYWx1ZXNIZWxwZXI7Ci0JcHJpdmF0ZSBUYWdzZXREZXNjcmlwdG9yIHRhZ3NldERlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSB0YWcuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZTsKLQotCS8qKgotCSAqIFNjb3BlIG9mIHRoZSB0YWc6IE1FVEhPRCB8IEZJRUxEIHwgVFlQRQotCSAqLwotCXByaXZhdGUgaW50IHNjb3BlOwotCi0JLyoqCi0JICogTXVsdGlwbGljaXR5IG9mIHRoZSB0YWc6IE9ORSB8IE1BTlkKLQkgKi8KLQlwcml2YXRlIGludCBtdWx0aXBsaWNpdHk7Ci0KLQkvKioKLQkgKiBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNldCBmb3IgdGhpcyB0YWcuIChJbnN0YW5jZXMgb2YgVGFnQXR0cmliU3BlYykKLQkgKi8KLQlwcml2YXRlIExpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgU3RyaW5nIGhlbHBLZXk7Ci0KLQkvKioKLQkgKiBUZXh0IHR5cGUgZm9yIHVzZSB3aXRoIGxvY2FsaXplZCB0ZXh0IGNvbnRhaW5lci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUxQX1RFWFQgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEUgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTEQgPSAyOwotCi0JcHVibGljIGludGVyZmFjZSBNdWx0aXBsaWNpdHkgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkUgPSAxOwotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTlkgPSAyOwotCX0KLQotCXB1YmxpYyBUYWdTcGVjKFN0cmluZyBhTmFtZSwgaW50IGFTY29wZSwgaW50IGFNdWx0aXBsaWNpdHkpIHsKLQkJdGFnTmFtZSA9IGFOYW1lOwotCQlzY29wZSA9IGFTY29wZTsKLQkJbXVsdGlwbGljaXR5ID0gYU11bHRpcGxpY2l0eTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBzY29wZUZyb21TdHJpbmcoU3RyaW5nIHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHMgIT0gbnVsbCkgewotCQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gVGFnU3BlYy5UWVBFOwotCQkJfSBlbHNlIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UoImZpZWxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBUYWdTcGVjLkZJRUxEOwotCQkJfSBlbHNlIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UoIm1ldGhvZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gVGFnU3BlYy5NRVRIT0Q7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFNob3VsZCBiZSBpbXBvc3NpYmxlIHVubGVzcyB0aGUgYW5ub3RhdGlvbi10YWdoYW5kbGVyLmV4c2Qgb3IKLQkJCQkvLyBjYWxsaW5nIGNvZGUgY2hhbmdlcy4KLQkJCQkvL1RPRE86IExvZ2dpbmcKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIiLCBJU3RhdHVzLk9LLCBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZXNvdXJjZXMuZ2V0U3RyaW5nKCJUYWdTcGVjLjMiKSArIHMsIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiwgSVN0YXR1cy5PSywgQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLmdldFN0cmluZygiVGFnU3BlYy40IiksIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBtdWx0aXBsaWNpdHlGcm9tU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCWlmIChzLmVxdWFsc0lnbm9yZUNhc2UoIjEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIFRhZ1NwZWMuTXVsdGlwbGljaXR5Lk9ORTsKLQkJCX0gZWxzZSBpZiAocy5lcXVhbHNJZ25vcmVDYXNlKCIqIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBUYWdTcGVjLk11bHRpcGxpY2l0eS5NQU5ZOwotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiwgSVN0YXR1cy5PSywgQW5ub3RhdGlvbnNDb250cm9sbGVyUmVzb3VyY2VzLmdldFN0cmluZygiVGFnU3BlYy40IiksIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJLy9SZXR1cm4gZGVmYXVsdAotCQlyZXR1cm4gVGFnU3BlYy5NdWx0aXBsaWNpdHkuT05FOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gU2NvcGUgZm9yIHRhZywgTUVUSE9EIHwgVFlQRSB8IEZJRUxECi0JICovCi0JcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbXVsdGlwbGljaXR5IGZvciB0YWcsIE9ORSB8IE1BTlkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE11bHRpcGxpY2l0eSgpIHsKLQkJcmV0dXJuIG11bHRpcGxpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIHRhZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJcmV0dXJuIHRhZ05hbWU7Ci0JfQotCi0JcHVibGljIFRhZ3NldERlc2NyaXB0b3IgZ2V0VGFnU2V0RGVzY3JpcHRvcigpIHsKLQkJaWYgKHRhZ3NldERlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJU3RyaW5nIHRhZ1NldE5hbWUgPSBnZXRUYWdOYW1lKCk7Ci0JCQlpbnQgaW5kZXggPSB0YWdTZXROYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJdGFnU2V0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJdGFnU2V0TmFtZSA9IHRhZ1NldE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQl0YWdzZXREZXNjcmlwdG9yID0gQW5ub3RhdGlvblRhZ3NldFJlZ2lzdHJ5LklOU1RBTkNFLmdldERlc2NyaXB0b3IodGFnU2V0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRhZ3NldERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2NvcGUgb2YgdGhpcyB0YWcuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIE1FVEhPRCB8IFRZUEUgfCBGSUVMRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjb3BlKGludCBpKSB7Ci0JCXNjb3BlID0gaTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhpcyB0YWcuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIE9ORSB8IE1BTlkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNdWx0aXBsaWNpdHkoaW50IGkpIHsKLQkJbXVsdGlwbGljaXR5ID0gaTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0YWcKLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogICAgICAgICAgICBOYW1lIGZvciB0aGUgdGFnLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIHN0cmluZykgewotCQl0YWdOYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIHRhZy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGF0dHJpYnV0ZSB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIHRhZy4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0Ci0JICogICAgICAgICAgICBBIFRhZ0F0dHJpYlNwZWMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoVGFnQXR0cmliU3BlYyBhdHQpIHsKLQkJaWYgKGF0dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyaWJ1dGVzLmFkZChhdHQpOwotCQlhdHQuc2V0VGFnU3BlYyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgdGFnLgotCSAqIAotCSAqIEBwYXJhbSBsc3QKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IGxpc3Qgb2YgVGFnQXR0cmliU3BlY3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKExpc3QgbHN0KSB7Ci0JCWlmIChsc3QgPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJZWxzZSB7Ci0JCQlhdHRyaWJ1dGVzID0gbHN0OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlUYWdBdHRyaWJTcGVjIHRhcyA9IChUYWdBdHRyaWJTcGVjKSBsc3QuZ2V0KGkpOwotCQkJCXRhcy5zZXRUYWdTcGVjKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9va3MgZm9yIGF0dHJpYnV0ZSBuYW1lZCA8Y29kZT5hdHROYW1lPC9jb2RlPi4gQ2FzZSBpbnNlbnNpdGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0TmFtZQotCSAqICAgICAgICAgICAgTmFtZSB0byBsb29rIGZvcgotCSAqIEByZXR1cm4gQSBUYWdBdHRyaWJTcGVjLCBvciBudWxsIGlmIG5vbmUgd2FzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBUYWdBdHRyaWJTcGVjIGF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHROYW1lKSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVRhZ0F0dHJpYlNwZWMgdGFzID0gKFRhZ0F0dHJpYlNwZWMpIGkubmV4dCgpOwotCi0JCQlpZiAoYXR0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRhcy5nZXRBdHRyaWJOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRhczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVjbGFyaW5nUGx1Z2luLgotCSAqLwotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWNsYXJpbmdQbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBkZWNsYXJpbmdQbHVnaW4gdG8gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VCdW5kbGUuCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCAmJiAhYXR0ZW1wdGVkVG9GaW5kUmVzb3VyY2VCdW5kbGUpIHsKLQkJCWF0dGVtcHRlZFRvRmluZFJlc291cmNlQnVuZGxlID0gdHJ1ZTsKLQkJCUJ1bmRsZSBhQnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCQlpZiAoYUJ1bmRsZSAhPSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2VCdW5kbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlKSB7Ci0JCWF0dGVtcHRlZFRvRmluZFJlc291cmNlQnVuZGxlID0gZmFsc2U7Ci0JCXRoaXMucmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbGlkVmFsdWVzSGVscGVyLgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZXNIZWxwZXIgZ2V0VmFsaWRWYWx1ZXNIZWxwZXIoKSB7Ci0JCWlmICh2YWxpZFZhbHVlc0hlbHBlciA9PSBudWxsICYmIGdldFRhZ1NldERlc2NyaXB0b3IoKSAhPSBudWxsKQotCQkJc2V0VmFsaWRWYWx1ZXNIZWxwZXIoZ2V0VGFnU2V0RGVzY3JpcHRvcigpLmdldFZhbGlkVmFsdWVzSGVscGVyKCkpOwotCQlyZXR1cm4gdmFsaWRWYWx1ZXNIZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkVmFsdWVzSGVscGVyCi0JICogICAgICAgICAgICBUaGUgdmFsaWRWYWx1ZXNIZWxwZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkVmFsdWVzSGVscGVyKEF0dHJpYnV0ZVZhbHVlc0hlbHBlciB2YWxpZFZhbHVlc0hlbHBlcikgewotCQl0aGlzLnZhbGlkVmFsdWVzSGVscGVyID0gdmFsaWRWYWx1ZXNIZWxwZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwS2V5KCkgewotCQlpZiAoaGVscEtleSA9PSBudWxsKQotCQkJaGVscEtleSA9IGNvbXB1dGVIZWxwS2V5KCk7Ci0JCXJldHVybiBoZWxwS2V5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVIZWxwS2V5KCkgewotCQlyZXR1cm4gInRhZ2guIiArIGdldFRhZ05hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBLZXkoU3RyaW5nIGhlbHBLZXkpIHsKLQkJdGhpcy5oZWxwS2V5ID0gaGVscEtleTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cFRhZ0hlbHAoKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VCdW5kbGUgYiA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCWlmIChiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGtleSA9IGdldEhlbHBLZXkoKTsKLQkJU3RyaW5nIHZhbCA9IGIuZ2V0U3RyaW5nKGdldEhlbHBLZXkoKSk7Ci0JCWlmICh2YWwgPT0ga2V5KQotCQkJdmFsID0gbnVsbDsKLQkJcmV0dXJuIHZhbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ3NldERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL2NvbnRyb2xsZXIvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9yZWdpc3RyeS9UYWdzZXREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNGM0ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvY29udHJvbGxlci9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3JlZ2lzdHJ5L1RhZ3NldERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciA3LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRhZ3NldERlc2NyaXB0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHU0VUID0gIkFubm90YXRpb25UYWdTZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRElTUExBWV9OQU1FID0gImRpc3BsYXlOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUEFSRU5UX1RBR1NFVCA9ICJwYXJlbnRUYWdzZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1ZBTElEX1ZBTFVFU19IRUxQRVIgPSAidmFsaWRWYWx1ZXNIZWxwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheU5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudFRhZ3NldDsKLQlwcm90ZWN0ZWQgQXR0cmlidXRlVmFsdWVzSGVscGVyIHZhbGlkVmFsdWVzSGVscGVyOwotCi0JcHJvdGVjdGVkIFRhZ3NldERlc2NyaXB0b3IoKSB7Ci0JCWVsZW1lbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyBUYWdzZXREZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQl0aGlzLmRpc3BsYXlOYW1lID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRElTUExBWV9OQU1FKTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFU0NSSVBUSU9OKTsKLQkJdGhpcy5wYXJlbnRUYWdzZXQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QQVJFTlRfVEFHU0VUKTsKLQkJLy8gc2V0IHRoZSB2YWxpZCB2YWx1ZXMgaGVscGVyIGlmIHRoZXJlIGlzIG9uZQotCQl0cnkgewotCQkJU3RyaW5nIHZhbGlkVmFsdWVzSGVscGVyTmFtZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZBTElEX1ZBTFVFU19IRUxQRVIpOwotCQkJaWYgKHZhbGlkVmFsdWVzSGVscGVyTmFtZSAhPSBudWxsKSB7Ci0JCQkJQ2xhc3MgbG9hZGVkID0gQ2xhc3MuZm9yTmFtZSh2YWxpZFZhbHVlc0hlbHBlck5hbWUpOwotCQkJCXRoaXMudmFsaWRWYWx1ZXNIZWxwZXIgPSAoQXR0cmlidXRlVmFsdWVzSGVscGVyKSBsb2FkZWQubmV3SW5zdGFuY2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERvIG5vdGhpbmcKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzcGxheU5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50VGFnc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50VGFnc2V0KCkgewotCQlyZXR1cm4gcGFyZW50VGFnc2V0OwotCX0KLQotCXB1YmxpYyBUYWdzZXREZXNjcmlwdG9yW10gZ2V0RGlyZWN0RGVwZW5kZW50cygpIHsKLQotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwgfHwgZ2V0TmFtZSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVGFnc2V0RGVzY3JpcHRvclswXTsKLQotCQlMaXN0IGRlcGVuZGVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJVGFnc2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdHIgPSBBbm5vdGF0aW9uVGFnc2V0UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJZGVzY3JpcHRvciA9IChUYWdzZXREZXNjcmlwdG9yKSBpdHIubmV4dCgpOwotCQkJaWYgKGdldE5hbWUoKS5lcXVhbHMoZGVzY3JpcHRvci5nZXRQYXJlbnRUYWdzZXQoKSkpCi0JCQkJZGVwZW5kZW50cy5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQotCQlUYWdzZXREZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgVGFnc2V0RGVzY3JpcHRvcltkZXBlbmRlbnRzLnNpemUoKV07Ci0JCWRlcGVuZGVudHMudG9BcnJheShkZXNjcmlwdG9ycyk7Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbGlkVmFsdWVzSGVscGVyLgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZXNIZWxwZXIgZ2V0VmFsaWRWYWx1ZXNIZWxwZXIoKSB7Ci0JCXJldHVybiB2YWxpZFZhbHVlc0hlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsaWRWYWx1ZXNIZWxwZXIKLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZFZhbHVlc0hlbHBlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRWYWx1ZXNIZWxwZXIoQXR0cmlidXRlVmFsdWVzSGVscGVyIHZhbGlkVmFsdWVzSGVscGVyKSB7Ci0JCXRoaXMudmFsaWRWYWx1ZXNIZWxwZXIgPSB2YWxpZFZhbHVlc0hlbHBlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZWQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQW5ub3RhdGlvbnNfQ29udHJvbGxlcj1Bbm5vdGF0aW9ucyBDb250cm9sbGVyCi1hbm5vdGF0aW9uX3RhZ19pbmZvPWFubm90YXRpb24gdGFnIGluZm8KLWFubm90YXRpb25fdGFnc2V0PWFubm90YXRpb24gdGFnc2V0Ci1hbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyPWFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwZmRhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbnNDb250cm9sbGVyIiBuYW1lPSIlQW5ub3RhdGlvbnNfQ29udHJvbGxlciIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbnNDb250cm9sbGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkFubm90YXRpb25UYWdJbmZvIiBuYW1lPSIlYW5ub3RhdGlvbl90YWdfaW5mbyIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbi10YWctaW5mby5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJBbm5vdGF0aW9uVGFnU2V0IiBuYW1lPSIlYW5ub3RhdGlvbl90YWdzZXQiIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb24udGFnc2V0LmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIiIG5hbWU9IiVhbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyLmV4c2QiLz4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZmZmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLmNvbnRyb2xsZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvbnRyb2xsZXIucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3Byb3BlcnR5X2ZpbGVzL2Fubm90YXRpb25jb250cm9sbGVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MGU3NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvbnRyb2xsZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRhZ1NwZWMuMz1Vbmtub3duIHRhZyBzY29wZToKLVRhZ1NwZWMuND1OdWxsIHRhZyBzY29wZS4KLVRhZ1NwZWMuNT1Vbmtub3duIHRhZyBtdWx0aXBsaWNpdHk6Ci1UYWdTcGVjLjY9TnVsbCB0YWcgbXVsdGlwbGljaXR5LgotVGFnQXR0cmliU3BlYy4xPVVua25vd24gJ3VuaXF1ZScgc2NvcGUgdmFsdWU6Ci1UYWdBdHRyaWJTcGVjLjE9TW9yZSB0aGFuIG9uZSAndW5pcXVlJyB0YWcgZGVmaW5lZDoKLUFubm90YXRpb25UYWdQYXJzZXIuMD1OdWxsIGV2ZW50IGhhbmRsZXIuCi1Bbm5vdGF0aW9uVGFnUGFyc2VyLjE9Ci1Bbm5vdGF0aW9uVGFnUmVnaXN0cnkuMD1Nb3JlIHRoYW4gb25lICdBbm5vdGF0aW9uVGFnSW5mbycgdGFnIGZvciB0aGUgdGFnICcKLUFubm90YXRpb25UYWdSZWdpc3RyeS45PXBhcnNlVGFnQXR0cmliczogdW5rbm93biAndXNlJyB2YWx1ZToKLUFubm90YXRpb25UYWdSZWdpc3RyeS4xMD1JbmNvbXBsZXRlIGVsZW1lbnQgQW5ub3RhdGlvblRhZ0luZm8gaW4gcGx1Z2luIHswfQotQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5LjExPXBhcnNlVGFnQXR0cmliczogdW5rbm93biAnaXNKYXZhVHlwZUlkZW50aWZpZXInIHZhbHVlOgotQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlcl9FUlJPUl8wPUlXQUUwMDAxRSBJbnZhbGlkIElDb25maWd1cmF0aW9uRWxlbWVudCB1c2VkIHRvIGNyZWF0ZSBBbm5vdGF0aW9uc0NvbnRyb2xsZXJSZWdpc3RyeS5EZXNjcmlwdG9yLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb24tdGFnLWluZm8uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3NjaGVtYS9hbm5vdGF0aW9uLXRhZy1pbmZvLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGFlNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb24tdGFnLWluZm8uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiBpZD0iWEFubm90YXRpb25UYWdJbmZvIiBuYW1lPSJBbm5vdGF0aW9uIFRhZyBJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIERlc2NyaWJlcyB0aGUgdGFncyBjb250YWluZWQgYnkgYSB0YWcgc2V0IGFuZCB0aGUgdGFnJmFwb3M7cyBhdHRyaWJ1dGVzLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iQW5ub3RhdGlvblRhZ0luZm8iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iQW5ub3RhdGlvblRhZ0luZm8iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhdHRyaWIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFnU2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHRhZyBzZXQgdGhpcyB0YWcgY29tZXMgdW5kZXJuZWF0aC4gICggZm9yIGluc3RhbmNlLCBpZiB3ZSZhcG9zO3JlIGRlZmluaW5nIHRoZSAmbHQ7Y29kZSZndDtAZWpiLmJlYW4mbHQ7L2NvZGUmZ3Q7Ci10YWcsIHRoZW4gdGhlIHRhZyBzZXQgd291bGQgYmUgJmx0O2NvZGUmZ3Q7ZWpiJmx0Oy9jb2RlJmd0Oy4gKSAgVGhlIHRhZyBzZXQgbXVzdCBoYXZlIGJlZW4gZGVmaW5lZCB1c2luZyB0aGUgYW5ub3RhdGlvbi50YWdzZXQgZXh0ZW5zaW9uIHBvaW50Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YWdOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHRhZy4gICggaWYgd2UmYXBvcztyZSBkZWZpbmluZyB0aGUgJmx0O2NvZGUmZ3Q7QGVqYi5iZWFuJmx0Oy9jb2RlJmd0OyB0YWcsIHRoZW4gdGhlIHRhZ05hbWUgd291bGQgYmUgJmx0O2NvZGUmZ3Q7YmVhbiZsdDsvY29kZSZndDsgKS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFNjb3BlIG9mIHRoZSBiZWFuLiAgTXVzdCBiZSAmbHQ7Y29kZSZndDt0eXBlJmx0Oy9jb2RlJmd0OywmbHQ7Y29kZSZndDttZXRob2QmbHQ7L2NvZGUmZ3Q7LCBvciAmbHQ7Y29kZSZndDtmaWVsZCZsdDsvY29kZSZndDsuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICAgICA8c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InR5cGUiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJtZXRob2QiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmaWVsZCI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im11bHRpcGxpY2l0eSIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iMSI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgTXVsdGlwbGljaXR5IG9mIHRoZSB0YWdzZXQuICBNdXN0IGJlICZsdDtjb2RlJmd0OzEmbHQ7L2NvZGUmZ3Q7IG9yJmx0O2NvZGUmZ3Q7KiZsdDsvY29kZSZndDsuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEsIGlmIG5vdCBzcGVjaWZpZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICAgICA8c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IjEiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSIqIj4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgZGVzY3JpcHRpb24uICBNYXkgYmUgYSBkZXNjcmlwdGlvbiBzdHJpbmcsIG9yIGEKLWtleSB0byBsb2NhbGl6ZWQgdGV4dCBmb3IgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBkZWNsYXJpbmcgcGx1Z2luJmFwb3M7cyByZXNvdXJjZSBidW5kbGUuIE5vIGRlZmF1bHQgaWYgdGhpcyBpcwotbm90IHNwZWNpZmllZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+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+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVudW1WYWx1ZXMiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9zY2hlbWEvYW5ub3RhdGlvbi50YWdzZXQuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3NjaGVtYS9hbm5vdGF0aW9uLnRhZ3NldC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQ1OWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3NjaGVtYS9hbm5vdGF0aW9uLnRhZ3NldC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIiIGlkPSJwWEFubm90YXRpb25UYWdzZXQiIG5hbWU9IkFubm90YXRpb25zIFRhZyBTZXQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQWxsb3dzIGNsaWVudHMgdG8gZGVmaW5lIGEgdGFnIHNldCBmb3IgYW4gYW5ub3RhdGlvbiAKLXRhZy4gIEEgdGFnIHNldCBuYW1lZCBYIHdvdWxkIGNvbnRhaW4gYWxsIG9mIHRoZSB0YWdzIHRoYXQKLWxvb2sgbGlrZSAmbHQ7Y29kZSZndDtAWC50YWcmbHQ7L2NvZGUmZ3Q7LiAgU28gdGhlICZsdDtjb2RlJmd0O2VqYiZsdDsvY29kZSZndDsKLXRhZyBzZXQgd291bGQgY29udGFpbiB0aGUgJmx0O2NvZGUmZ3Q7QGVqYi5iZWFuJmx0Oy9jb2RlJmd0OyB0YWcsIAotdGhlICZsdDtjb2RlJmd0O0BlamIucGVyc2lzdGVuY2UmbHQ7L2NvZGUmZ3Q7IHRhZywgdGhlICZsdDtjb2RlJmd0O0BlamIucGsmbHQ7L2NvZGUmZ3Q7IHRhZywgZXRjLi4uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJBbm5vdGF0aW9uVGFnU2V0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IkFubm90YXRpb25UYWdTZXQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgdGFnc2V0LiAgVGhlIG5hbWUgZm9yIHRoZSB0YWdzZXQgdGhhdCBjb250YWlucyB0aGUgJmx0O2NvZGUmZ3Q7QGVqYi5iZWFuJmx0Oy9jb2RlJmd0OyB0YWcgd291bGQgYmUgJmx0O2NvZGUmZ3Q7ZWpiJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHRleHQgb2YgdGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhlIHRhZywgb3IgYSByZXNvdXJjZQota2V5IHBvaW50aW5nIHRvIHRoZSBsb2NhbGl6ZWQgZGlzcGxheSBuYW1lIGluc2lkZSBvZiB0aGUKLWRlY2xhcmluZyBwbHVnaW4mYXBvcztzIHJlc291cmNlIGJ1bmRsZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFnIHNldC4gIENhbiBiZSB0aGUgdGV4dCBvZiB0aGUgCi1kZXNjcmlwdGlvbiwgb3IgYSBrZXkgZm9yIHRoZSBkZWNsYXJpbmcgcGx1Z2luJmFwb3M7cyByZXNvdXJjZSBidW5kbGUgdGhhdCBwb2ludHMgdG8gdGhlIGxvY2FsaXplZCB0ZXh0IGZvciB0aGUgdGFnIHNldCBkZXNjcmlwdGlvbi4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50VGFnc2V0IiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWxpZFZhbHVlc0hlbHBlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3NjaGVtYS9hbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTk5ZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvc2NoZW1hL2Fubm90YXRpb25UYWdEeW5hbWljSW5pdGlhbGl6ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy5jb250cm9sbGVyIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy5jb250cm9sbGVyIiBpZD0iYW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplciIgbmFtZT0iYW5ub3RhdGlvblRhZ0R5bmFtaWNJbml0aWFsaXplciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFsbG93IGZvciBjbGllbnRzIHRvIGRlZmluZSB0aGVpciBhbm5vdGF0aW9uIHRhZ3MgZHluYW1pY2FsbHkuICBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBzdGF0aWNhbGx5IGRlZmluZSBhbm5vdGF0aW9uIHRhZ3MgdXNpbmcgdGhlIHRhZy1pbmZvIGV4dGVuc2lvbiBwb2ludC4gIFRoZSBleHRlbnNpb25zIGZvciB0aGlzIHBvaW50IHdpbGwgYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgaW5pdGlhbGl6aW5nIHRoZSBzdGF0aWMgYW5ub3RhdGlvbiB0YWdzIGZyb20gdGhlIHRhZy1pbmZvIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5pdGlhbGl6ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaW5pdGlhbGl6ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTZXQgdGhlIHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5Bbm5vdGF0aW9uVGFnRHluYW1pY0luaXRpYWxpemVyIGludGVyZmFjZS4gIFRoaXMgY2xhc3MgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3NjaGVtYS9hbm5vdGF0aW9uc0NvbnRyb2xsZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyL3NjaGVtYS9hbm5vdGF0aW9uc0NvbnRyb2xsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5OGU4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlci9zY2hlbWEvYW5ub3RhdGlvbnNDb250cm9sbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciIgaWQ9ImFubm90YXRpb25zQ29udHJvbGxlciIgbmFtZT0iQW5ub3RhdGlvbnMgQ29udHJvbGxlciIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgYW5ub3RhdGlvbnNDb250cm9sbGVyIGlzIHVzZWQgaW4gZ2VuZXJhdGluZyBhbm5vdGF0ZWQgYmVhbnMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbm5vdGF0aW9uc0NvbnRyb2xsZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbnNDb250cm9sbGVyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgaWQgaXMgdXNlZCB0byBjb29yZGluYXRlIHByZWNlZGVuY2UgdXNpbmcgZnVuY3Rpb24gZ3JvdXBzIHNvIHRoaXMgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGZ1bmN0aW9uIGdyb3VwIGJpbmRpbmdzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gY2xhc3MgZGVmaW5lZCBieSB0aGUgZXh0ZW5zaW9uDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImJ1aWxkZXJJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBJRCBvZiB0aGUgYW5ub3RhdGlvbnMgYnVpbGRlciB0byBiZSB1c2VkIGJ5IHRoaXMgYW5ub3RhdGlvbnMgY29udHJvbGxlci4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjRkNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZmEzNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYW5ub3RhdGlvbnMtY29yZS5qYXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmMDJlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTA2ZTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQW5ub3RhdGlvbiBDb3JlIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZQotQnVuZGxlLVZlcnNpb246IDAuNy4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBhbm5vdGF0aW9ucy1jb3JlLmphcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IC4sCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2MmRkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhbm5vdGF0aW9ucy1jb3JlLmphci5qYXIsXAotICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMtY29yZS5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcz1zY2hlbWEvCi1zb3VyY2UuYW5ub3RhdGlvbnMtY29yZS5qYXI9c3JjLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC5hbm5vdGF0aW9ucy1jb3JlLmphcj1iaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNjVmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzcxOGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuYW5ub3RhdGlvbnMuY29yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGVzIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vcHJvcGVydHlfZmlsZXMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcm9wZXJ0eV9maWxlcy9hbm5vdGF0aW9uY29yZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJvcGVydHlfZmlsZXMvYW5ub3RhdGlvbmNvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiNGQ2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcm9wZXJ0eV9maWxlcy9hbm5vdGF0aW9uY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGFnU3BlYy4zPVVua25vd24gdGFnIHNjb3BlOgotVGFnU3BlYy40PU51bGwgdGFnIHNjb3BlLgotQW5ub3RhdGlvblRhZ1BhcnNlci4wPU51bGwgZXZlbnQgaGFuZGxlci4KLUFubm90YXRpb25UYWdQYXJzZXIuMT0KLUFubm90YXRpb25UYWdSZWdpc3RyeS4wPU1vcmUgdGhhbiBvbmUgJ0Fubm90YXRpb25UYWdJbmZvJyB0YWcgZm9yIHRoZSB0YWcgJwotQW5ub3RhdGlvblRhZ1JlZ2lzdHJ5Ljk9cGFyc2VUYWdBdHRyaWJzOiB1bmtub3duICd1c2UnIHZhbHVlOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0ZWRDb21tZW50SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0ZWRDb21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc2N2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRlZENvbW1lbnRIYW5kbGVyIGltcGxlbWVudHMgVGFnUGFyc2VFdmVudEhhbmRsZXIgewotCi0JcHJpdmF0ZSBNYXAgYW5ub3RhdGlvbnM7Ci0KLQlwcml2YXRlIFRva2VuIGFubm90YXRpb25Ub2tlbjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVGFnUGFyc2VFdmVudEhhbmRsZXIjYW5ub3RhdGlvblRhZyhvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVG9rZW4pCi0JICovCi0JcHVibGljIHZvaWQgYW5ub3RhdGlvblRhZyhUb2tlbiB0YWcpIHsKLQkJdGhpcy5hbm5vdGF0aW9uVG9rZW4gPSB0YWc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVGFnUGFyc2VFdmVudEhhbmRsZXIjZW5kT2ZUYWcoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZE9mVGFnKGludCBwb3MpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRhZ1BhcnNlRXZlbnRIYW5kbGVyI2F0dHJpYnV0ZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVG9rZW4sCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5Ub2tlbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoVG9rZW4gbmFtZSwgaW50IGVxdWFsc1Bvc2l0aW9uLCBUb2tlbiB2YWx1ZSkgewotCQlpZiAodmFsdWUuZ2V0VGV4dCgpID09IG51bGwgfHwgdmFsdWUuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApCi0JCQlnZXRBbm5vdGF0aW9ucygpLnB1dCh0aGlzLmFubm90YXRpb25Ub2tlbi5nZXRUZXh0KCksIG5hbWUuZ2V0VGV4dCgpKTsKLQkJZWxzZQotCQkJZ2V0QW5ub3RhdGlvbnMoKS5wdXQobmFtZS5nZXRUZXh0KCksIHZhbHVlLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldEFubm90YXRpb25zKCkgewotCQlpZiAoYW5ub3RhdGlvbnMgPT0gbnVsbCkKLQkJCWFubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGFubm90YXRpb25zOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25UYWdQYXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvblRhZ1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdhMzhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvblRhZ1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDExLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi0vKioKLSAqIEBhdXRob3IgUGF0IEtlbGxleQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRhZ1BhcnNlciB7Ci0KLQlwcml2YXRlIFRhZ1BhcnNlRXZlbnRIYW5kbGVyIGhhbmRsZXI7Ci0KLQlwcml2YXRlIGNoYXJbXSBpbnB1dDsKLQotCWludCBwb3M7Ci0KLQlpbnQgZW5kT2ZMYXN0R29vZEF0dFBhcnNlOwotCi0JcHVibGljIEFubm90YXRpb25UYWdQYXJzZXIoVGFnUGFyc2VFdmVudEhhbmRsZXIgdHApIHsKLQkJaWYgKHRwID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmdldFN0cmluZygiQW5ub3RhdGlvblRhZ1BhcnNlci4wIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaGFuZGxlciA9IHRwOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlb3MoKSB7Ci0JCXJldHVybiBwb3MgPj0gaW5wdXQubGVuZ3RoOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1dTKGNoYXIgYykgewotCQlyZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcdCc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNraXBXUygpIHsKLQkJd2hpbGUgKHBvcyA8IGlucHV0Lmxlbmd0aCAmJiAoaXNXUyhpbnB1dFtwb3NdKSB8fCBpbnB1dFtwb3NdID09ICcqJykpIHsKLQkJCXBvcysrOwotCQl9Ci0JfQotCi0JLy8gQ2FsbGVyIGlzIGV4cGVjdGVkIHRvIG1ha2Ugc3VyZSB0aGUgZW9zIGhhcyBub3QgYmVlbiByZWFjaGVkLgotCXByaXZhdGUgY2hhciBwZWVrKCkgewotCQlyZXR1cm4gaW5wdXRbcG9zXTsKLQl9Ci0KLQkvLyBDYWxsZXIgaXMgZXhwZWN0ZWQgdG8gY2hlY2sgZm9yIEVPUy4KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCXJldHVybiBpbnB1dFtwb3MrK107Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV4dENoYXIoY2hhciBjKSB7Ci0JCWlmIChlb3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHBlZWsoKSA9PSBjOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0lEQ2hhcihjaGFyIGMpIHsKLQkJcmV0dXJuICFpc1dTKGMpICYmIGMgIT0gJz0nICYmIGMgIT0gJ0AnICYmIGMgIT0gJ1wiJzsKLQl9Ci0KLQlwcml2YXRlIFRva2VuIGNvbGxlY3RJRCgpIHsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDE2KTsKLQkJVG9rZW4gdCA9IG5ldyBUb2tlbigpOwotCi0JCXQuc2V0QmVnaW5uaW5nKHBvcyk7Ci0JCXdoaWxlICghZW9zKCkgJiYgaXNJRENoYXIocGVlaygpKSkgewotCQkJYi5hcHBlbmQobmV4dENoYXIoKSk7Ci0JCX0KLQkJdC5zZXRFbmQocG9zIC0gMSk7Ci0JCXQuc2V0VGV4dChiLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gdDsKLQl9Ci0KLQlwcml2YXRlIFRva2VuIGV4cGVjdEF0dHJpYk5hbWUoKSB7Ci0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IHNhdmUgPSBwb3M7Ci0KLQkJVG9rZW4gcmV0dmFsID0gY29sbGVjdElEKCk7Ci0JCWlmIChyZXR2YWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcG9zID0gc2F2ZTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBleHBlY3RUYWcoKSB7Ci0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IHNhdmVQb3MgPSBwb3M7Ci0KLQkJaWYgKG5leHRDaGFyKCkgIT0gJ0AnKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChlb3MoKSB8fCBpc1dTKHBlZWsoKSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVG9rZW4gcmV0dmFsID0gZXhwZWN0QXR0cmliTmFtZSgpOwotCi0JCWlmIChyZXR2YWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcG9zID0gc2F2ZVBvcyArIDE7Ci0JCX0KLQkJcmV0dmFsLnNldEJlZ2lubmluZyhzYXZlUG9zKTsKLQotCQkvLyBTYXZlIGVuZCBvZiBwYXJzZSBzbyB3ZSBjYW4gcGFzcyBpdCBhcyB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgdGFnLgotCQllbmRPZkxhc3RHb29kQXR0UGFyc2UgPSBwb3M7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JcHJpdmF0ZSBUb2tlbiBleHBlY3RRdW90ZWRWYWx1ZSgpIHsKLQkJc2tpcFdTKCk7Ci0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlUb2tlbiB0b2sgPSBuZXcgVG9rZW4oKTsKLQotCQl0b2suc2V0QmVnaW5uaW5nKHBvcyk7Ci0JCWlmIChwZWVrKCkgIT0gJ1wiJykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJbmV4dENoYXIoKTsKLQotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDY0KTsKLQotCQl3aGlsZSAoIWVvcygpICYmIHBlZWsoKSAhPSAnXCInKSB7Ci0JCQliLmFwcGVuZChuZXh0Q2hhcigpKTsKLQkJfQotCQlpZiAoIWVvcygpKSB7Ci0JCQluZXh0Q2hhcigpOwotCQl9Ci0KLQkJdG9rLnNldEVuZChwb3MgLSAxKTsKLQkJdG9rLnNldFRleHQoYi50b1N0cmluZygpKTsKLQkJcmV0dXJuIHRvazsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXhwZWN0QXNzaWduKCkgewotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChuZXh0Q2hhcigpID09ICc9JykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcG9zLS07Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFRva2VuIG1rTnVsbFRva2VuKCkgewotCQlUb2tlbiByZXR2YWwgPSBuZXcgVG9rZW4oKTsKLQotCQlyZXR2YWwuc2V0QmVnaW5uaW5nKHBvcyk7Ci0JCXJldHZhbC5zZXRFbmQocG9zIC0gMSk7Ci0JCXJldHZhbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwYXJzZU5leHRBdHRyaWJ1dGUoKSB7Ci0JCXNraXBXUygpOwotCQlpZiAoZW9zKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlUb2tlbiBrZXkgPSBjb2xsZWN0SUQoKTsKLQotCQlpZiAoa2V5ID09IG51bGwgfHwga2V5Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNraXBXUygpOwotCQlpZiAoZW9zKCkpIHsKLQkJCS8vIEdvIGFoZWFkIGFuZCByZXBvcnQgaXQsIGV2ZW4gdGhvdWdoIGl0IGlzIGEgcGFydGlhbCBhdHRyaWJ1dGUuICgKLQkJCS8vIHdlIHN0aWxsIGZhaWwgaGVyZSApCi0JCQloYW5kbGVyLmF0dHJpYnV0ZShrZXksIC0xLCBta051bGxUb2tlbigpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWludCBlcVBvcyA9IHBvczsKLQotCQlpZiAoIWV4cGVjdEFzc2lnbigpKSB7Ci0JCQkvLyBFdmVuIHRob3VnaCB3ZSB3b24ndCBwYXJzZSB0aGlzIGFzIGEgZnVsbCBhdHRyaWJ1dGUsIGdvIGFoZWFkIGFuZAotCQkJLy8gY2FsbCB0aGUgaGFuZGxlciB3aXRoIGl0LiBTb21lIGNsaWVudHMgd2FudCB0byBzZWUgcGFydGlhbAotCQkJLy8gYXR0cmlidXRlcy4KLQkJCWhhbmRsZXIuYXR0cmlidXRlKGtleSwgLTEsIG1rTnVsbFRva2VuKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXNraXBXUygpOwotCi0JCWlmIChlb3MoKSkgewotCQkJLy8gU2FtZSBoZXJlIC0gd2UgZmFpbCBvbiBpdCwgYnV0IHdlIHJlcG9ydCBpdCBhbnl3YXkKLQkJCWhhbmRsZXIuYXR0cmlidXRlKGtleSwgZXFQb3MsIG1rTnVsbFRva2VuKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVRva2VuIHZhbHVlID0gZXhwZWN0UXVvdGVkVmFsdWUoKTsKLQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBjb2xsZWN0SUQoKTsKLQkJCWlmIChpc05leHRDaGFyKCc9JykpIHsKLQkJCQlwb3MgPSB2YWx1ZS5nZXRCZWdpbm5pbmcoKTsKLQkJCQl2YWx1ZSA9IG1rTnVsbFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJZW5kT2ZMYXN0R29vZEF0dFBhcnNlID0gcG9zOwotCQloYW5kbGVyLmF0dHJpYnV0ZShrZXksIGVxUG9zLCB2YWx1ZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUF0dHJpYnV0ZXMoKSB7Ci0JCXdoaWxlICghZW9zKCkgJiYgcGFyc2VOZXh0QXR0cmlidXRlKCkpIHsKLQkJCS8vIGxvb3Agd2hpbGUgbm90IGVuZCBvZiBzdHJpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBza2lwVG9UYWdDaGFyKCkgewotCQl3aGlsZSAoIWVvcygpICYmIHBlZWsoKSAhPSAnQCcpIHsKLQkJCW5leHRDaGFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZXJJbnB1dChjaGFyW10gdGV4dCkgewotCQlpbnB1dCA9IHRleHQ7Ci0JCXBvcyA9IDA7Ci0JCWVuZE9mTGFzdEdvb2RBdHRQYXJzZSA9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VySW5wdXQoU3RyaW5nIHRleHQpIHsKLQkJc2V0UGFyc2VySW5wdXQodGV4dC50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYXJzZSgpIHsKLQkJd2hpbGUgKCFlb3MoKSkgewotCQkJc2tpcFRvVGFnQ2hhcigpOwotCQkJVG9rZW4gdGFnID0gZXhwZWN0VGFnKCk7Ci0JCQlpZiAodGFnID09IG51bGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWhhbmRsZXIuYW5ub3RhdGlvblRhZyh0YWcpOwotCQkJcGFyc2VBdHRyaWJ1dGVzKCk7Ci0JCQloYW5kbGVyLmVuZE9mVGFnKGVuZE9mTGFzdEdvb2RBdHRQYXJzZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0MzFjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJ1Y3R1cmFsRmVhdHVyZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5DbG9uZWFibGVQdWJsaWM7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBDbG9uZWFibGVQdWJsaWMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEID0gImdlbmVyYXRlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEQVBURVJfVFlQRSA9IEFubm90YXRpb25zQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBOT1RJRklDQVRJT05fRkVBVFVSRSA9IG5ldyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsKCkgewotCQkvLyBhbm9ueW1vdXMgaW5uZXIgY2xhc3MKLQl9OwotCi0JcHJpdmF0ZSBNYXAgYW5ub3RhdGlvbnNNYXA7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFubm90YXRpb25zQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjY2xvbmUoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7IC8vIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JCS8vcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEFubm90YXRpb25zKEVPYmplY3QgZW1mT2JqZWN0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVtZk9iamVjdCk7Ci0JCWFkYXB0ZXIuYWRkQW5ub3RhdGlvbnMobmFtZSwgdmFsdWUpOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBbm5vdGF0aW9ucyhFT2JqZWN0IGVtZk9iamVjdCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGVtZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBpbnRlcm5hbEdldEFubm90YXRpb25zKGVtZk9iamVjdCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgaW50ZXJuYWxHZXRBbm5vdGF0aW9ucyhFT2JqZWN0IGVtZk9iamVjdCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGVtZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUFubm90YXRpb25zQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbWZPYmplY3QpOwotCQlyZXR1cm4gKGFkYXB0ZXIgPT0gbnVsbCkgPyBpbnRlcm5hbEdldEFubm90YXRpb25zKGVtZk9iamVjdC5lQ29udGFpbmVyKCksIG5hbWUpIDogYWRhcHRlci5nZXRBbm5vdGF0aW9ucyhuYW1lKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgcmVtb3ZlQW5ub3RhdGlvbnMoRU9iamVjdCBlbWZPYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZW1mT2JqZWN0KTsKLQkJcmV0dXJuIGFkYXB0ZXIucmVtb3ZlQW5ub3RhdGlvbnMobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9ucyhTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWdldEFubm5vdGF0aW9ucygpLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRBbm5vdGF0aW9ucyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0QW5ubm90YXRpb25zKCkuZ2V0KG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgcmVtb3ZlQW5ub3RhdGlvbnMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm5vdGF0aW9ucygpLnJlbW92ZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRBbm5ub3RhdGlvbnMoKSB7Ci0JCWlmIChhbm5vdGF0aW9uc01hcCA9PSBudWxsKQotCQkJYW5ub3RhdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gYW5ub3RhdGlvbnNNYXA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFubm90YXRpb25zQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCUFubm90YXRpb25zQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIoZW1mT2JqZWN0KTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IGNyZWF0ZUFkYXB0ZXIoZW1mT2JqZWN0KSA6IGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFubm90YXRpb25zQWRhcHRlciBjcmVhdGVBZGFwdGVyKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCUFubm90YXRpb25zQWRhcHRlciBhZGFwdGVyID0gbmV3IEFubm90YXRpb25zQWRhcHRlcigpOwotCQlhZGFwdGVyLnNldFRhcmdldChlbWZPYmplY3QpOwotCQllbWZPYmplY3QuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQW5ub3RhdGlvbnNBZGFwdGVyIHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiAoQW5ub3RhdGlvbnNBZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGVtZk9iamVjdCwgQURBUFRFUl9UWVBFKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIEFEQVBURVJfVFlQRS5lcXVhbHModHlwZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZmRlYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDgsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBra2F0eWFsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29yZVJlc291cmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiYW5ub3RhdGlvbmNvcmUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTEwYWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXByaXZhdGUgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIgaGFuZGxlcjsKLQotCXByaXZhdGUgQW5ub3RhdGlvblRhZ1BhcnNlciBwYXJzZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25zVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKCIjY29tbWVudCIsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgVHJhbnNsYXRvci5DT01NRU5UX0ZFQVRVUkUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEFubm90YXRpb25zVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgVHJhbnNsYXRvci5DT01NRU5UX0ZFQVRVUkUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgc3R5bGUgfCBUcmFuc2xhdG9yLkNPTU1FTlRfRkVBVFVSRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5lbWYueG1sLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEhhbmRsZXIoKS5nZXRBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCWdldFBhcnNlcigpLnNldFBhcnNlcklucHV0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQlnZXRQYXJzZXIoKS5wYXJzZSgpOwotCQlTdHJpbmcgbmFtZTsKLQkJTWFwIGFubm90YXRpb25zID0gZ2V0SGFuZGxlcigpLmdldEFubm90YXRpb25zKCk7Ci0JCWZvciAoSXRlcmF0b3Iga2V5cyA9IGFubm90YXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGtleXMuaGFzTmV4dCgpOykgewotCQkJbmFtZSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQkJQW5ub3RhdGlvbnNBZGFwdGVyLmFkZEFubm90YXRpb25zKGVtZk9iamVjdCwgbmFtZSwgYW5ub3RhdGlvbnMuZ2V0KG5hbWUpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNTZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBnZXRNT0ZWYWx1ZShlbWZPYmplY3QpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBBbm5vdGF0aW9uc0FkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMoZW1mT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3VuU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdW5TZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIucmVtb3ZlQW5ub3RhdGlvbnMoZW1mT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2ZlYXR1cmVFeGlzdHMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzRGF0YVR5cGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYXBGb3IoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXBGb3IoT2JqZWN0IGFGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gKGFGZWF0dXJlID09IGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCWhhbmRsZXIgPSBuZXcgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIoKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJzZXIuCi0JICovCi0JcHJvdGVjdGVkIEFubm90YXRpb25UYWdQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpCi0JCQlwYXJzZXIgPSBuZXcgQW5ub3RhdGlvblRhZ1BhcnNlcihnZXRIYW5kbGVyKCkpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1RhZ1BhcnNlRXZlbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1RhZ1BhcnNlRXZlbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Nzk0MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9UYWdQYXJzZUV2ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLQotLyoqCi0gKiBQYXJzZXIgYW5kIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHdhbnQgdG8gcmVjZWl2ZSBwYXJzaW5nIGV2ZW50cy4gV2hlbiBwYXJzaW5nIGlzIHN0YXJ0ZWQKLSAqIHRocm91Z2ggdGhlIDxjb2RlPnBhcnNlKCk8L2NvZGU+IG1ldGhvZCwgZXZlbnQgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBpbnRlcmVzdGluZyBmZWF0dXJlcyBpbgotICogdGhlIHBhcnNlLiAoIGxpa2UgYSBTQVggQ29udGVudEhhbmRsZXIgKQotICogCi0gKiBAYXV0aG9yIFBhdCBLZWxsZXkKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWdQYXJzZUV2ZW50SGFuZGxlciB7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiB0YWcgaXMgZW5jb3VudGVyZWQuIFRoaXMgd2lsbCBhbHdheXMgYmUgdGhlIGZpcnN0IHBpZWNlIG9mIGNvbnRlbnQKLQkgKiBlbmNvdW50ZXJlZC4gRm9sbG93ZWQgYnkgYSBlbmRPZlRhZyggKSBjYWxsIHdoZW4gdGhlIGVuZCBvZiB0aGUgdGFnIGlzIHJlYWNoZWQuCi0JICovCi0JcHVibGljIHZvaWQgYW5ub3RhdGlvblRhZyhUb2tlbiB0YWcpOwotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIGVudGlyZSBhbm5vdGF0aW9uIGZvciBhIHNpbmdsZSB0YWcgaGFzIGJlZW4gcGFyc2VkLgotCSAqIAotCSAqIEBwYXJhbSBwb3MKLQkgKiAgICAgICAgICAgIFBvc2l0aW9uIGluIHRoZSBzdHJlYW0gb2YgdGhlIGVuZCBvZiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRPZlRhZyhpbnQgcG9zKTsKLQotCS8qKgotCSAqIENhbGxlZCBmb3IgZXZlcnkgYXR0cmlidXRlIHNldHRpbmcgZW5jb3VudGVyZWQgZm9yIGFuIGFubm90YXRpb24gdGFnLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGVxdWFsc1Bvc2l0aW9uCi0JICogICAgICAgICAgICBTb3VyY2UgcG9zaXRpb24gb2YgdGhlIGVxdWFscyBzaWduLCBvciAtMSBpZiBubyBlcXVhbHMgc2lnbiB3YXMgZm91bmQuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlLCB3aXRoIGFueSBxdW90ZXMgc3RyaXBwZWQgb2ZmLiBXaWxsIGJlIHplcm8gbGVuZ3RoIHRva2VuIGlmCi0JICogICAgICAgICAgICBubyBhdHRyaWJ1dGUgd2FzIGZvdW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGF0dHJpYnV0ZShUb2tlbiBuYW1lLCBpbnQgZXF1YWxzUG9zaXRpb24sIFRva2VuIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1Rva2VuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDMxMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDExLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi0vKioKLSAqIEEgc3RyaW5nLCBhbmQgdGhlIHJhbmdlIGl0IHdhcyB0YWtlbiBmcm9tIGluIHRoZSBzb3VyY2UgZmlsZS4gVGhlIHJhbmdlIGlzIGluY2x1c2l2ZS4gKGllLCB3aXRoCi0gKiBzb3VyY2UgIkFCQ0QiLCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgZm9yIHRoZSBUb2tlbiAiQkMiIHdvdWxkIGJlICgxLDIpICkKLSAqIAotICogQGF1dGhvciBQYXQgS2VsbGV5Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2tlbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQlwcml2YXRlIGludCBiZWdpbm5pbmc7Ci0JcHJpdmF0ZSBpbnQgZW5kOwotCi0KLQotCS8qKgotCSAqIEByZXR1cm4gUG9zaXRpb24gaW4gb3JpZ2luYWwgc291cmNlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEJlZ2lubmluZygpIHsKLQkJcmV0dXJuIGJlZ2lubmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFBvc2l0aW9uIGluIHRoZSBvcmlnaW5hbCBzb3VyY2Ugb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCi0JICovCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgdG9rZW4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIEEgc291cmNlIHBvc2l0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmVnaW5uaW5nKGludCBpKSB7Ci0JCWJlZ2lubmluZyA9IGk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIEEgc291cmNlIHBvc2l0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZChpbnQgaSkgewotCQllbmQgPSBpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzdHJpbmcpIHsKLQkJdGV4dCA9IHN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJcmV0dXJuIHRleHQubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciA8Y29kZT5zcmNQb3M8L2NvZGU+IGNvbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGlzIHRva2VuLgotCSAqIAotCSAqIEBwYXJhbSBzcmNQb3MKLQkgKiAgICAgICAgICAgIEEgcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGUgdG9rZW4gY2FtZSBmcm9tLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzcmNQb3MgY29tZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyB0b2tlbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbW1lZGlhdGVseVByZWNlZGVzKGludCBzcmNQb3MpIHsKLQkJcmV0dXJuIGVuZCArIDEgPT0gc3JjUG9zOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgc3JjUG9zIGlzIHdpdGhpbiB0aGUgb3JpZ2luYWwgc291cmNlIHJhbmdlIHJhbmdlIG9mIHRoZSB0b2tlbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3JjUG9zCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBzcmNQb3MpIHsKLQkJcmV0dXJuIHNyY1BvcyA+PSBiZWdpbm5pbmcgJiYgc3JjUG9zIDw9IGVuZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmNGQ3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyMWU1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi11aS5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiODU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjMzA3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBBbm5vdGF0aW9ucyBVSSBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjcuMAotQnVuZGxlLUNsYXNzUGF0aDogdWkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpLlVpUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnVpCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5qZHQudWksCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2Uuc3d0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlcgotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTlmYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHVpLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzPXNjaGVtYS8KLXNvdXJjZS51aS5qYXI9c3JjLyxcCi0gICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQudWkuamFyPWJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5Y2U0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1Bbm5vdGF0aW9uc0NvbXBsZXRpb25Qcm9jZXNzb3I9QW5ub3RhdGlvbnNDb21wbGV0aW9uUHJvY2Vzc29yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhOTZlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YWRvY0NvbXBsZXRpb25Qcm9jZXNzb3IiPgotICAgICAgPGphdmFkb2NDb21wbGV0aW9uUHJvY2Vzc29yCi0gICAgICAgICAgICBuYW1lPSIlQW5ub3RhdGlvbnNDb21wbGV0aW9uUHJvY2Vzc29yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWkuQW5ub3RhdGlvblRhZ0NvbXBsZXRpb25Qcm9jIgotICAgICAgICAgICAgaWQ9IkFubm90YXRpb25zQ29tcGxldGlvblByb2Nlc3NvciI+Ci0gICAgICA8L2phdmFkb2NDb21wbGV0aW9uUHJvY2Vzc29yPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQ5MThlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmFubm90YXRpb25zLnVpIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZXMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlcyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wcm9wZXJ0eV9maWxlcy90YWdoYW5kbGVydWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9wcm9wZXJ0eV9maWxlcy90YWdoYW5kbGVydWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4NDEwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvcHJvcGVydHlfZmlsZXMvdGFnaGFuZGxlcnVpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1KMkVFQW5ub3RhdGlvbnNDb21wbGV0aW9uUHJvY2Vzc29yLjM9RXJyb3IgcGFyc2luZyBhdHRyaWJ1dGVzIC0gd2FzIGV4cGVjaW5nIGEgJz0nIGJ1dCBmb3VuZCAnCi1KMkVFQW5ub3RhdGlvbnNDb21wbGV0aW9uUHJvY2Vzc29yLjQ9JyBpbnN0ZWFkLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NjaGVtYS9Bbm5vdGF0aW9uVUkuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zY2hlbWEvQW5ub3RhdGlvblVJLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWY5ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NjaGVtYS9Bbm5vdGF0aW9uVUkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkiIGlkPSJBbm5vdGF0aW9uVUkiIG5hbWU9IkFubm90YXRpb25VSSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgZm9yIGVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBhbiBleGlzdGluZyB0YWcgc2V0Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iQXV0b0NvbXBsZXRlRGF0YSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJBdXRvQ29tcGxldGVEYXRhIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbmFibGVzIGNvbnRlbnQgYXNzaXN0IGZvciBhIHNpbmdsZSB0YWcgc2V0Lg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFnU2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIHRhZyBzZXQgY29kZSBhc3Npc3Qgc2hvdWxkIGJlIGVuYWJsZWQgZm9yLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvQW5ub3RhdGlvblRhZ0NvbXBsZXRpb25Qcm9jLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvQW5ub3RhdGlvblRhZ0NvbXBsZXRpb25Qcm9jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzAxNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0Fubm90YXRpb25UYWdDb21wbGV0aW9uUHJvYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFkb2NDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25UYWdQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRhZ1BhcnNlRXZlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5LkFubm90YXRpb25UYWdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5LkF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5BdHRyaWJ1dGVWYWx1ZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5yZWdpc3RyeS5UYWdBdHRyaWJTcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuVGFnU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBhdCBLZWxsZXkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRhZ0NvbXBsZXRpb25Qcm9jIGltcGxlbWVudHMgSUphdmFkb2NDb21wbGV0aW9uUHJvY2Vzc29yLCBUYWdQYXJzZUV2ZW50SGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQk9PTEVBTl9WQUxJRF9WQUxVRVMgPSBuZXcgU3RyaW5nW117ImZhbHNlIiwgInRydWUifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JSUNvbXBpbGF0aW9uVW5pdCBtX2ljdTsKLQotCUlEb2N1bWVudCBtX2RvYzsKLQotCUxpc3QgbV90YWdzOwotCi0JLy8gSW5zdGFuY2UgdmFyaWFibGVzIGFjdGl2ZSB3aGVuIG1heWJlQ29tcGxldGVBdHRyaWJ1dGUgaXMgbGl2ZS4KLQlUb2tlbiBtX3RhZ05hbWU7Ci0KLQkvKioKLQkgKiBTZXQgb2YgYWxsIGF0dHJpYnV0ZXMgbmFtZXMgZW5jb3VudGVyZWQuIE9ubHkgbGl2ZSB3aGVuIG1heWJlQ29tcGxldGVBdHRyaWJ1dGUgaXMgbGl2ZS4KLQkgKi8KLQlTZXQgbV9hdHRTZXQgPSBuZXcgVHJlZVNldCgpOwotCi0JLyoqCi0JICogTGlzdCBvZiBBdHRyaWJ1dGUuIE9ubHkgbGl2ZSB3aGVuIG1heWJlQ29tcGxlQXR0cmlidXRlIGlzIGxpdmUuCi0JICovCi0JTGlzdCBtX2F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlBbm5vdGF0aW9uVGFnUGFyc2VyIG1fcGFyc2VyID0gbmV3IEFubm90YXRpb25UYWdQYXJzZXIodGhpcyk7Ci0KLQkvKioKLQkgKiBTY29wZSBvZiB0aGUgdGFnLiBUYWdTcGVjLlRZUEUgfCBUYWdTcGVjLk1FVEhPRCB8IFRhZ1NwZWMuRklFTEQuIE5vdCB2YWxpZCB1bnRpbAotCSAqIGdldEFubm90YXRpb25BcmVhIGhhcyBiZWVuIGNhbGxlZCBmb3IgYSBjb21wbGV0aW9ucyByZXF1ZXN0LCBhbmQgb25seSB0aGVuIGlmCi0JICogZ2V0QW5ub3RhdGlvbkFyZWEoKSBkaWQgbm90IHJldHVybiBudWxsLgotCSAqLwotCWludCBtX3RhZ1Njb3BlOwotCi0JcHVibGljIEFubm90YXRpb25UYWdDb21wbGV0aW9uUHJvYygpIHsKLQkJaW5pdFRhZ0luZm8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFRhZ0luZm8oKSB7Ci0JCWlmIChtX3RhZ3MgPT0gbnVsbCkKLQkJCW1fdGFncyA9IEFubm90YXRpb25UYWdSZWdpc3RyeS5nZXRBbGxUYWdTcGVjcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YWRvY0NvbXBsZXRpb25Qcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJQ29tcGlsYXRpb25Vbml0IGN1LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhZG9jQ29tcGxldGlvblByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0LAotCSAqICAgICAgaW50LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJQ29tcGlsYXRpb25Vbml0IGN1LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgZmxhZ3MpIHsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCi0JCS8vIFNldCB1cCBjb21wbGV0aW9uIHByb2Nlc3NvciBzdGF0ZS4KLQkJbV9kb2MgPSBKYXZhVUkuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvcklucHV0KTsKLQkJbV9pY3UgPSBjdTsKLQotCQl0cnkgewotCQkJQW5ub3RhdGlvbkFyZWEgYXJlYSA9IGdldEFubm90YXRpb25BcmVhKG9mZnNldCk7Ci0KLQkJCWlmIChhcmVhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gQ2hlY2sgZm9yIHRhZyBjb21wbGV0aW9uIGZpcnN0LiAoIHRoZSBlYXNpZXIgY2FzZSApCi0JCQlTdHJpbmcgdHNmID0gZ2V0VGFnU29GYXJJZk5vdENvbXBsZXRlZChhcmVhLmJlZ2luT2Zmc2V0LCBvZmZzZXQpOwotCi0JCQlpZiAodHNmICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0VGFnQ29tcGxldGlvbnNGb3IodHNmLCBhcmVhLCBsZW5ndGgpOwotCQkJfQotCi0JCQkvLyBBY2gsIGhhdmUgdG8gdHJ5IHRoZSBoYXJkZXIgY2FzZSBub3csIHdoZXJlIHdlIHBhcnNlIHRoZQotCQkJLy8gYW5ub3RhdGlvbgotCQkJcmV0dXJuIG1heWJlQ29tcGxldGVBdHRyaWJ1dGUoYXJlYSwgb2Zmc2V0KTsKLQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gU2lsZW50bHkgZmFpbC4KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gbWF5YmVDb21wbGV0ZUF0dHJpYnV0ZShBbm5vdGF0aW9uQXJlYSBhcmVhLCBpbnQgY3Vyc29yUG9zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQltX2F0dFNldC5jbGVhcigpOwotCQltX2F0dHJpYnV0ZXMuY2xlYXIoKTsKLQotCQltX3BhcnNlci5zZXRQYXJzZXJJbnB1dChtX2RvYy5nZXQoYXJlYS5iZWdpbk9mZnNldCwgYXJlYS5sZW5ndGgoKSkpOwotCQltX3BhcnNlci5wYXJzZSgpOwotCi0JCVRhZ1NwZWMgdHMgPSBnZXRUYWdTcGVjRm9yVGFnTmFtZShtX3RhZ05hbWUuZ2V0VGV4dCgpKTsKLQotCQkvLyBEbyB3ZSBldmVuIHJlY29nbml6ZSB0aGlzIHRhZz8KLQkJaWYgKHRzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gTG9vcCB0aHJvdWdoIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGUgY3Vyc29yIGlzIHdpdGhpbiBhIGF0dHJpYnV0ZQotCQkvLyBhc3NpZ25tZW50LCBvciBiZXR3ZWVuIGFzc2lnbmVtZW50cy4KLQkJQXR0cmlidXRlIHRhcmdldCA9IG51bGw7Ci0JCUF0dHJpYnV0ZSBsYXN0ID0gbnVsbDsKLQkJQXR0cmlidXRlIGJlZm9yZSA9IG51bGw7Ci0JCUF0dHJpYnV0ZSBhID0gbnVsbDsKLQkJYm9vbGVhbiBiZXR3ZWVuID0gZmFsc2U7Ci0JCWludCByQ3VyUG9zID0gYXJlYS5yZWxhdGl2ZUN1cnNvclBvcyhjdXJzb3JQb3MpOwotCQlJdGVyYXRvciBpID0gbV9hdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJYSA9IChBdHRyaWJ1dGUpIGkubmV4dCgpOwotCi0JCQlpZiAoYS5jb250YWlucyhyQ3VyUG9zKSkgewotCQkJCXRhcmdldCA9IGE7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKGxhc3QgIT0gbnVsbCkgewotCQkJCS8vIFNlZSBpZiB0aGUgY3Vyc29yIGlzIGJldHdlZW4sIGJ1dCBub3QgZGlyZWN0bHkgYWRqYWNlbnQgdG8KLQkJCQkvLyB0aGUgbGFzdCB0d28gYXR0cmlidXRlcy4KLQkJCQlpZiAockN1clBvcyA+IGxhc3QubWF4RXh0ZW50KCkgKyAxICYmIHJDdXJQb3MgPCBhLm1pbkV4dGVudCgpIC0gMSkgewotCQkJCQliZXR3ZWVuID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChhLmltbWVkaWF0ZWx5UHJlY2VkZXMockN1clBvcykpIHsKLQkJCQkJYmVmb3JlID0gYTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJbGFzdCA9IGE7Ci0JCX0KLQotCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKLQkJCWlmIChiZXR3ZWVuKSB7Ci0JCQkJLy8gSWYgd2UncmUgYmV0d2VlbiBhdHRyaWJ1dGVzLCBzdWdnZXN0IGFsbCBwb3NzaWJsZSBhdHRyaWJ1dGVzLgotCQkJCXJldHVybiBhdHRyaWJ1dGVDb21wbGV0aW9uc0Zvcih0cywgY3Vyc29yUG9zLCAwLCAiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoYmVmb3JlICE9IG51bGwpIHsKLQkJCQkvLyBXZSdyZSByaWdodCBhZnRlciB0aGUgYXR0cmlidXRlIG5hbWVkIGluICdiZWZvcmUnLCBzbyBzZXQgdGhlCi0JCQkJLy8gdGFyZ2V0IHRvIGl0LCBhbmQgZmFsbAotCQkJCS8vICB0aHJvdWdoIHRvIHRoZSB0YXJnZXQgaGFuZGxpbmcgY29kZS4KLQkJCQl0YXJnZXQgPSBiZWZvcmU7Ci0JCQl9IGVsc2UgewotCQkJCS8vIG5vdCBiZXR3ZWVuIGFuZCBub3QgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gYXR0cmlidXRlLiBXZSBhcmUKLQkJCQkvLyBwYXN0IHRoZSBlbmQgb2YgdGhlIHBhcnNlZCBhbm5vdGF0aW9uLgotCQkJCS8vICBPbmx5IG9mZmVyIHN1Z2dlc3Rpb25zIGlmIGl0IGxvb2tzIGxpa2UgdGhlIGxhc3QgYW5ub3RhdGlvbgotCQkJCS8vIGF0dHJpYnV0ZSBpcyB2YWxpZC4KLQkJCQlpZiAoYSA9PSBudWxsKSB7Ci0JCQkJCS8vIE5vIGFubm90YXRpb25zIGF0dHJpYnV0ZXMsIHN1Z2dlc3QgZXZlcnl0aGluZy4KLQkJCQkJcmV0dXJuIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKHRzLCBjdXJzb3JQb3MsIDAsICIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAockN1clBvcyA+IGEubWF4RXh0ZW50KCkpIHsKLQkJCQkJaWYgKGEuaGFzQXNzaWdubWVudCgpICYmIGEuaGFzVmFsdWUoKSkgewotCQkJCQkJLy8gTGFzdCBhbm5vdGF0aW9uIHdhcyBnb29kLCBhbmQgd2UncmUgcGFzdCBpdCwgc28gZG8KLQkJCQkJCS8vIGNvbXBsZXRpb25zIGZvciBhbnl0aGluZwotCQkJCQkJcmV0dXJuIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKHRzLCBjdXJzb3JQb3MsIDAsICIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgaWYgKGEuaGFzQXNzaWdubWVudCgpKQotCQkJCQkJcmV0dXJuIGF0dHJpYnV0ZVZhbGlkVmFsdWVzRm9yKHRzLCBhLCBhcmVhLCBjdXJzb3JQb3MpOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gYXR0cmlidXRlQ29tcGxldGlvbnNGb3IodHMsIGN1cnNvclBvcyAtIGEubmFtZS5sZW5ndGgoKSwgMCwgYS5uYW1lLmdldFRleHQoKSwgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gRGlkbid0IG1hdGNoIGFueXRoaW5nLCBub3QgcGFzdCB0aGUgZW5kIC0gd2UncmUgcHJvYmFibHkKLQkJCQkJLy8gdGhlIGZpcnN0IGF0dHJpYnV0ZQotCQkJCQkvLyBiZWluZyBhZGRlZCB0byB0aGUgdGFnLgotCQkJCQlyZXR1cm4gYXR0cmlidXRlQ29tcGxldGlvbnNGb3IodHMsIGN1cnNvclBvcywgMCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQ29tcGxldGlvbiBmb3IgYSBwYXJ0aWFsIGF0dHJpYnV0ZSBuYW1lPwotCQlpZiAodGFyZ2V0Lm5hbWUuaW1tZWRpYXRlbHlQcmVjZWRlcyhyQ3VyUG9zKSkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKHRzLCBhcmVhLnJlbGF0aXZlVG9BYnModGFyZ2V0Lm5hbWUuZ2V0QmVnaW5uaW5nKCkpLCB0YXJnZXQubmFtZS5sZW5ndGgoKSwgdGFyZ2V0Lm5hbWUuZ2V0VGV4dCgpLCAhdGFyZ2V0Lmhhc0Fzc2lnbm1lbnQoKSk7Ci0JCX0KLQotCQkvLyBBcmUgd2UgaW4gdGhlIG1pZGRsZSBvZiBhIG5hbWU/Ci0JCWlmICh0YXJnZXQubmFtZS5jb250YWlucyhyQ3VyUG9zKSkgewotCQkJLy8gV2UndmUgb3B0ZWQgdG8gcmVwbGFjZSB0aGUgZW50aXJlIG5hbWUgZm9yIHRoaXMgY2FzZSwgd2hpY2ggc2VlbXMKLQkJCS8vIHRvIG1ha2UgdGhlIG1vc3Qgc2Vuc2UuCi0JCQlyZXR1cm4gYXR0cmlidXRlQ29tcGxldGlvbnNGb3IodHMsIGFyZWEucmVsYXRpdmVUb0Ficyh0YXJnZXQubmFtZS5nZXRCZWdpbm5pbmcoKSksIHRhcmdldC5uYW1lLmxlbmd0aCgpLCB0YXJnZXQubmFtZS5nZXRUZXh0KCkuc3Vic3RyaW5nKDAsIHJDdXJQb3MgLSB0YXJnZXQubmFtZS5nZXRCZWdpbm5pbmcoKSksICF0YXJnZXQuaGFzQXNzaWdubWVudCgpKTsKLQkJfQotCi0JCS8vIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgZWl0aGVyIGluIGEgdmFsdWUsIG9yIHJlYWxseSBjb25mdXNlZC4KLQkJLy8gdHJ5IGFuZCByZXR1cm4gdmFsaWQgdmFsdWVzIG9yIGJhaWw/Ci0JCWlmIChhLnZhbHVlICE9IG51bGwgJiYgKGEudmFsdWUuY29udGFpbnMockN1clBvcykgfHwgKHRhcmdldC5oYXNBc3NpZ25tZW50KCkgJiYgYXJlYS5yZWxhdGl2ZUN1cnNvclBvcyhjdXJzb3JQb3MpID4gYS5uYW1lLmdldEJlZ2lubmluZygpKSkpCi0JCQlyZXR1cm4gYXR0cmlidXRlVmFsaWRWYWx1ZXNGb3IodHMsIGEsIGFyZWEsIGN1cnNvclBvcyk7Ci0JCXJldHVybiBhdHRyaWJ1dGVDb21wbGV0aW9uc0Zvcih0cywgY3Vyc29yUG9zLCAwLCAiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBhdHRyaWJ1dGVWYWxpZFZhbHVlc0ZvcihUYWdTcGVjIHRzLCBBdHRyaWJ1dGUgYSwgQW5ub3RhdGlvbkFyZWEgYXJlYSwgaW50IGN1cnNvclBvcykgewotCQlUYWdBdHRyaWJTcGVjIHRhcyA9IHRzLmF0dHJpYnV0ZU5hbWVkKGEubmFtZS5nZXRUZXh0KCkpOwotCQlpZiAodGFzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nW10gdmFsaWRWYWx1ZXMgPSBnZXRWYWxpZFZhbHVlcyh0YXMsIGEsIGFyZWEpOwotCQlTdHJpbmcgcGFydGlhbFZhbHVlID0gY2FsY3VsYXRlUGFydGlhbFZhbHVlKGEsIGFyZWEsIGN1cnNvclBvcyk7Ci0JCWludCB2YWx1ZU9mZnNldCA9IGNhbGN1bGF0ZVZhbHVlT2Zmc2V0KGEsIGFyZWEsIGN1cnNvclBvcyk7Ci0JCWlmICh2YWxpZFZhbHVlcyA9PSBudWxsIHx8IHZhbGlkVmFsdWVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGNyZWF0ZUN1c3RvbUF0dHJpYnV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModHMsIHRhcywgcGFydGlhbFZhbHVlLCB2YWx1ZU9mZnNldCwgYS52YWx1ZS5nZXRUZXh0KCksIGFyZWEuamF2YUVsZW1lbnQpOwotCQlyZXR1cm4gY3JlYXRlQXR0cmlidXRlQ29tcGxldGlvblByb3Bvc2FscyhwYXJ0aWFsVmFsdWUsIHZhbHVlT2Zmc2V0LCB2YWxpZFZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRzCi0JICogQHBhcmFtIHRhcwotCSAqIEBwYXJhbSBwYXJ0aWFsVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWVPZmZzZXQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNyZWF0ZUN1c3RvbUF0dHJpYnV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoVGFnU3BlYyB0cywgVGFnQXR0cmliU3BlYyB0YXMsIFN0cmluZyBwYXJ0aWFsVmFsdWUsIGludCB2YWx1ZU9mZnNldCwgU3RyaW5nIHZhbHVlLCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHsKLQkJQXR0cmlidXRlVmFsdWVzSGVscGVyIGhlbHBlciA9IHRzLmdldFZhbGlkVmFsdWVzSGVscGVyKCk7Ci0JCWlmIChoZWxwZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyW10gcHJvcG9zYWxIZWxwZXJzID0gaGVscGVyLmdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXJzKHRhcywgcGFydGlhbFZhbHVlLCB2YWx1ZU9mZnNldCwgamF2YUVsZW1lbnQpOwotCQlpZiAocHJvcG9zYWxIZWxwZXJzID09IG51bGwgfHwgcHJvcG9zYWxIZWxwZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gbmV3IElKYXZhQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2FsSGVscGVycy5sZW5ndGhdOwotCQlBbm5vdGF0aW9uVGFnUHJvcG9zYWwgcHJvcG9zYWw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxIZWxwZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9wb3NhbCA9IG5ldyBBbm5vdGF0aW9uVGFnUHJvcG9zYWwocHJvcG9zYWxIZWxwZXJzW2ldKTsKLQkJCS8vcHJvcG9zYWwuc2V0UGFydGlhbFZhbHVlU3RyaW5nKHBhcnRpYWxWYWx1ZSk7Ci0JCQlwcm9wb3NhbHNbaV0gPSBwcm9wb3NhbDsKLQkJfQotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCXByaXZhdGUgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBjcmVhdGVBdHRyaWJ1dGVDb21wbGV0aW9uUHJvcG9zYWxzKFN0cmluZyBwYXJ0aWFsVmFsdWUsIGludCB2YWx1ZU9mZnNldCwgU3RyaW5nW10gdmFsaWRWYWx1ZXMpIHsKLQkJTGlzdCByZXN1bHRpbmdWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBycGxTdHJpbmcgPSB2YWxpZFZhbHVlc1tpXTsKLQkJCWlmIChwYXJ0aWFsVmFsdWUgIT0gbnVsbCAmJiAhcnBsU3RyaW5nLnN0YXJ0c1dpdGgocGFydGlhbFZhbHVlKSkKLQkJCQljb250aW51ZTsKLQkJCUFubm90YXRpb25UYWdQcm9wb3NhbCBwcm9wID0gbmV3IEFubm90YXRpb25UYWdQcm9wb3NhbChycGxTdHJpbmcsIHZhbHVlT2Zmc2V0LCAwLCBudWxsLCBycGxTdHJpbmcsIDEpOwotCQkJcHJvcC5zZXRFbnN1cmVRdW90ZWQodHJ1ZSk7Ci0JCQkvL3Byb3Auc2V0UGFydGlhbFZhbHVlU3RyaW5nKHBhcnRpYWxWYWx1ZSk7Ci0JCQlyZXN1bHRpbmdWYWx1ZXMuYWRkKHByb3ApOwotCQl9Ci0JCWlmIChyZXN1bHRpbmdWYWx1ZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSkgcmVzdWx0aW5nVmFsdWVzLnRvQXJyYXkobmV3IElKYXZhQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdGluZ1ZhbHVlcy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldFZhbGlkVmFsdWVzKFRhZ0F0dHJpYlNwZWMgdGFzLCBBdHRyaWJ1dGUgYSwgQW5ub3RhdGlvbkFyZWEgYXJlYSkgewotCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IHRhcy5nZXRWYWxpZFZhbHVlcygpOwotCQlpZiAodmFsaWRWYWx1ZXMgPT0gbnVsbCB8fCB2YWxpZFZhbHVlcy5sZW5ndGggPT0gMCkgewotCQkJQXR0cmlidXRlVmFsdWVzSGVscGVyIGhlbHBlciA9IHRhcy5nZXRUYWdTcGVjKCkuZ2V0VmFsaWRWYWx1ZXNIZWxwZXIoKTsKLQkJCWlmIChoZWxwZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXZhbGlkVmFsdWVzID0gaGVscGVyLmdldFZhbGlkVmFsdWVzKHRhcywgYXJlYS5qYXZhRWxlbWVudCk7Ci0JCQlpZiAoKHZhbGlkVmFsdWVzID09IG51bGwgfHwgdmFsaWRWYWx1ZXMubGVuZ3RoID09IDApICYmIHRhcy52YWx1ZUlzQm9vbCgpKQotCQkJCXZhbGlkVmFsdWVzID0gQk9PTEVBTl9WQUxJRF9WQUxVRVM7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhCi0JICogQHBhcmFtIGFyZWEKLQkgKiBAcGFyYW0gY3Vyc29yUG9zCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVZhbHVlT2Zmc2V0KEF0dHJpYnV0ZSBhLCBBbm5vdGF0aW9uQXJlYSBhcmVhLCBpbnQgY3Vyc29yUG9zKSB7Ci0JCWlmIChhLnZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gY3Vyc29yUG9zOwotCQlpbnQgbmFtZUVuZCA9IGEubmFtZS5nZXRFbmQoKTsKLQkJaW50IHZhbEJlZyA9IGEudmFsdWUuZ2V0QmVnaW5uaW5nKCk7Ci0JCWlmICh2YWxCZWcgPiBuYW1lRW5kICsgMikKLQkJCXJldHVybiBhcmVhLnJlbGF0aXZlVG9BYnMobmFtZUVuZCArIDIpOyAvL1ZhbHVlIHRvbyBmYXIgYXdheSB0byBiZSBjb3JyZWN0LgotCQlyZXR1cm4gYXJlYS5yZWxhdGl2ZVRvQWJzKHZhbEJlZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGEKLQkgKiBAcGFyYW0gYXJlYQotCSAqIEBwYXJhbSBjdXJzb3JQb3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY3VsYXRlUGFydGlhbFZhbHVlKEF0dHJpYnV0ZSBhLCBBbm5vdGF0aW9uQXJlYSBhcmVhLCBpbnQgY3Vyc29yUG9zKSB7Ci0JCWlmIChhLnZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IG5hbWVFbmQgPSBhLm5hbWUuZ2V0RW5kKCk7Ci0JCWludCB2YWx1ZUJlZyA9IGEudmFsdWUuZ2V0QmVnaW5uaW5nKCk7Ci0JCWlmICh2YWx1ZUJlZyA+IG5hbWVFbmQgKyAyKQotCQkJcmV0dXJuIG51bGw7IC8vVmFsdWUgaXMgdG9vIGZhciBhd2F5IHNvIGl0IG11c3Qgbm90IGJlIHBhcnQgb2YgdGhpcyBhdHRyaWJ1dGUuCi0JCWludCByZWxhdGl2ZVBvcyA9IGFyZWEucmVsYXRpdmVDdXJzb3JQb3MoY3Vyc29yUG9zKTsKLQkJaWYgKGEudmFsdWUuY29udGFpbnMocmVsYXRpdmVQb3MpKSB7Ci0JCQlib29sZWFuIGhhc0JlZ2luUXVvdGUgPSB2YWx1ZUJlZyAtIG5hbWVFbmQgPT0gMjsKLQkJCVN0cmluZyB2YWx1ZSA9IGEudmFsdWUuZ2V0VGV4dCgpOwotCQkJaW50IGVuZCA9IHJlbGF0aXZlUG9zIC0gdmFsdWVCZWc7Ci0JCQlpZiAoaGFzQmVnaW5RdW90ZSkKLQkJCQllbmQtLTsKLQkJCWlmIChlbmQgPiAtMSkgewotCQkJCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJCQlpZiAoZW5kIDwgbGVuZ3RoKQotCQkJCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGVuZCk7Ci0JCQkJZWxzZSBpZiAoZW5kID09IGxlbmd0aCkKLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGFnU3BlYyBnZXRUYWdTcGVjRm9yVGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlTdHJpbmcgc2ltcGxlTmFtZSA9IHRhZ05hbWU7Ci0JCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5sZW5ndGgoKSA+IDAgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJ0AnKQotCQkJc2ltcGxlTmFtZSA9IHRhZ05hbWUubGVuZ3RoKCkgPT0gMiA/ICIiIDogdGFnTmFtZS5zdWJzdHJpbmcoMSk7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoIChtX3RhZ1Njb3BlKSB7Ci0JCQljYXNlIFRhZ1NwZWMuVFlQRSA6Ci0JCQkJcmV0dXJuIEFubm90YXRpb25UYWdSZWdpc3RyeS5nZXRUeXBlVGFnKHNpbXBsZU5hbWUpOwotCQkJY2FzZSBUYWdTcGVjLk1FVEhPRCA6Ci0JCQkJcmV0dXJuIEFubm90YXRpb25UYWdSZWdpc3RyeS5nZXRNZXRob2RUYWcoc2ltcGxlTmFtZSk7Ci0JCQljYXNlIFRhZ1NwZWMuRklFTEQgOgotCQkJCXJldHVybiBBbm5vdGF0aW9uVGFnUmVnaXN0cnkuZ2V0RmllbGRUYWcoc2ltcGxlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGF0dHJpYnV0ZUNvbXBsZXRpb25zRm9yKFRhZ1NwZWMgdHMsIGludCByZXBsYWNlT2Zmc2V0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHBhcnRpYWxBdHRyaWJ1dGVOYW1lLCBib29sZWFuIGFwcGVuZEVxdWFscykgewotCQlJdGVyYXRvciBpID0gdHMuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgcHJvcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJVGFnQXR0cmliU3BlYyB0YXMgPSAoVGFnQXR0cmliU3BlYykgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgYW5hbWUgPSB0YXMuZ2V0QXR0cmliTmFtZSgpOwotCi0JCQkvLyBEb24ndCBzdWdnZXN0IGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQuCi0JCQlpZiAoIW1fYXR0U2V0LmNvbnRhaW5zKGFuYW1lKSkgewotCQkJCWlmIChhbmFtZS5zdGFydHNXaXRoKHBhcnRpYWxBdHRyaWJ1dGVOYW1lKSkgewotCQkJCQlTdHJpbmcgcnR4dCA9IGFwcGVuZEVxdWFscyA/IGFuYW1lICsgJz0nIDogYW5hbWU7Ci0JCQkJCUFubm90YXRpb25UYWdQcm9wb3NhbCBwcm9wID0gbmV3IEFubm90YXRpb25UYWdQcm9wb3NhbChydHh0LCByZXBsYWNlT2Zmc2V0LCByZXBsYWNlTGVuZ3RoLCBudWxsLCBhbmFtZSwgMSk7Ci0JCQkJCXByb3Auc2V0SGVscFRleHQobG9va3VwQXR0SGVscCh0YXMpKTsKLQkJCQkJcHJvcHMuYWRkKHByb3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocHJvcHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3BzLnRvQXJyYXkobmV3IElKYXZhQ29tcGxldGlvblByb3Bvc2FsW3Byb3BzLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5hbm5vdGF0aW9ucy5UYWdQYXJzZUV2ZW50SGFuZGxlciNhbm5vdGF0aW9uVGFnKGNvbS5pYm0ud3MucmQuYW5ub3RhdGlvbnMuVG9rZW4pCi0JICovCi0JcHVibGljIHZvaWQgYW5ub3RhdGlvblRhZyhUb2tlbiB0YWcpIHsKLQkJbV90YWdOYW1lID0gdGFnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5hbm5vdGF0aW9ucy5UYWdQYXJzZUV2ZW50SGFuZGxlciNlbmRPZlRhZyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kT2ZUYWcoaW50IHBvcykgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLndzLnJkLmFubm90YXRpb25zLlRhZ1BhcnNlRXZlbnRIYW5kbGVyI2F0dHJpYnV0ZShjb20uaWJtLndzLnJkLmFubm90YXRpb25zLlRva2VuLAotCSAqICAgICAgaW50LCBjb20uaWJtLndzLnJkLmFubm90YXRpb25zLlRva2VuKQotCSAqLwotCXB1YmxpYyB2b2lkIGF0dHJpYnV0ZShUb2tlbiBuYW1lLCBpbnQgZXF1YWxzUG9zaXRpb24sIFRva2VuIHZhbHVlKSB7Ci0JCW1fYXR0cmlidXRlcy5hZGQobmV3IEF0dHJpYnV0ZShuYW1lLCBlcXVhbHNQb3NpdGlvbiwgdmFsdWUpKTsKLQkJbV9hdHRTZXQuYWRkKG5hbWUuZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRSZXBsYWNlbWVudEZvclRhZyhUYWdTcGVjIHRzLCBpbnQgYmVnaW5JbmRleCkgewotCQlTdHJpbmdCdWZmZXIgYnVkID0gbmV3IFN0cmluZ0J1ZmZlcigzMik7Ci0KLQkJYnVkLmFwcGVuZCgnQCcpOwotCQlidWQuYXBwZW5kKHRzLmdldFRhZ05hbWUoKSk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9IGdldEFycmF5UHJlZml4Rm9yTXVsdGlwbGVBdHRyaWJzKGJlZ2luSW5kZXgpOwotCQlMaXN0IGF0dHJpYnV0ZXMgPSB0cy5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWdBdHRyaWJTcGVjIHRhcyA9IChUYWdBdHRyaWJTcGVjKSBhdHRyaWJ1dGVzLmdldChpKTsKLQotCQkJaWYgKHRhcy5pc1JlcXVpcmVkKCkpIHsKLQkJCQlidWQuYXBwZW5kKHByZWZpeCk7Ci0JCQkJYnVkLmFwcGVuZCh0YXMuZ2V0QXR0cmliTmFtZSgpKTsKLQkJCQlidWQuYXBwZW5kKCc9Jyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEFycmF5UHJlZml4Rm9yTXVsdGlwbGVBdHRyaWJzKGludCBiZWdpbkluZGV4KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgc291cmNlID0gbnVsbDsKLQkJLy8gR2V0IHNvdXJjZSBmcm9tIGNvbXBpbGF0aW9uIHVuaXQKLQkJdHJ5IHsKLQkJCXNvdXJjZSA9IG1faWN1LmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IGJlZ2luSW5kZXggPCAwKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkvLyB0cmltIG9mZiBldmVyeXRoaW5nIGFmdGVyIG91ciBiZWdpbiBpbmRleAotCQkJc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBiZWdpbkluZGV4ICsgMSk7Ci0JCQlpbnQgbmV3TGluZUluZGV4ID0gc291cmNlLmxhc3RJbmRleE9mKCdcbicpOwotCQkJLy9pZiB3ZSBhcmUgb24gZmlyc3QgbGluZS4uLgotCQkJaWYgKG5ld0xpbmVJbmRleCA9PSAtMSkKLQkJCQluZXdMaW5lSW5kZXggPSAwOwotCQkJLy8gR2V0IHRoZSBjdXJyZW50IGxpbmUKLQkJCVN0cmluZyBjdXJyZW50TGluZSA9IHNvdXJjZS5zdWJzdHJpbmcobmV3TGluZUluZGV4LCBiZWdpbkluZGV4ICsgMSk7Ci0JCQkvLyBDdXJyZW50bHkgd2UgaGF2ZSB0byBoYXZlIHRoZSAnQCcgc2lnbiB0byBzaG93IG91ciBtZW51Ci0JCQlpbnQgYW5ub3RhdGlvbkluZGV4ID0gY3VycmVudExpbmUubGFzdEluZGV4T2YoJ0AnKTsKLQkJCXJlc3VsdCA9IGN1cnJlbnRMaW5lLnN1YnN0cmluZygwLCBhbm5vdGF0aW9uSW5kZXgpOwotCQkJcmVzdWx0ID0gcmVzdWx0ICsgIiAgIjsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gRG8gbm90aGluZwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0VGFnQ29tcGxldGlvbnNGb3IoU3RyaW5nIHBhcnRpYWxUYWdOYW1lLCBBbm5vdGF0aW9uQXJlYSBhcmVhLCBpbnQgc2VsZWN0TGVuZ3RoKSB7Ci0JCUxpc3QgZm91bmQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtX3RhZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCVRhZ1NwZWMgdHMgPSAoVGFnU3BlYykgbV90YWdzLmdldChpKTsKLQkJCVN0cmluZyB0bmFtZSA9IHRzLmdldFRhZ05hbWUoKTsKLQotCQkJaWYgKHRzLmdldFNjb3BlKCkgPT0gbV90YWdTY29wZSAmJiB0bmFtZS5zdGFydHNXaXRoKHBhcnRpYWxUYWdOYW1lKSkgewotCQkJCVN0cmluZyBydHh0ID0gZ2V0UmVwbGFjZW1lbnRGb3JUYWcodHMsIGFyZWEuYmVnaW5PZmZzZXQpOwotCQkJCVN0cmluZyBsYWJsID0gJ0AnICsgdG5hbWU7Ci0JCQkJQW5ub3RhdGlvblRhZ1Byb3Bvc2FsIHByb3AgPSBuZXcgQW5ub3RhdGlvblRhZ1Byb3Bvc2FsKHJ0eHQsIGFyZWEuYmVnaW5PZmZzZXQsIE1hdGgubWF4KHNlbGVjdExlbmd0aCwgcnR4dC5sZW5ndGgoKSksIG51bGwsIGxhYmwsIDEpOwotCQkJCXByb3Auc2V0SGVscFRleHQobG9va3VwVGFnSGVscCh0cykpOwotCQkJCWZvdW5kLmFkZChwcm9wKTsKLQkJCX0KLQkJfQotCi0JCWlmICghZm91bmQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gKElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10pIGZvdW5kLnRvQXJyYXkobmV3IElKYXZhQ29tcGxldGlvblByb3Bvc2FsW2ZvdW5kLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YWRvY0NvbXBsZXRpb25Qcm9jZXNzb3IjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV1MxKGNoYXIgYykgewotCQlyZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJyonIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcbic7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnU29GYXJJZk5vdENvbXBsZXRlZChpbnQgc3RhcnRpbmdBdCwgaW50IGN1cnNvckF0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpZiAobV9kb2MuZ2V0Q2hhcihzdGFydGluZ0F0KSAhPSAnQCcpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGZpcnN0Q2hhciA9IHN0YXJ0aW5nQXQgKyAxOwotCi0JCWlmIChmaXJzdENoYXIgPT0gY3Vyc29yQXQpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IGZpcnN0Q2hhcjsgaSA8IGN1cnNvckF0OyBpKyspIHsKLQkJCWNoYXIgYyA9IG1fZG9jLmdldENoYXIoaSk7Ci0KLQkJCWlmIChpc1dTMShjKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1fZG9jLmdldChmaXJzdENoYXIsIGN1cnNvckF0IC0gZmlyc3RDaGFyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSB0aGUgYXJlYSBvZiB0aGUgYW5ub3RhdGlvbiB3ZSdyZSB0cnlpbmcgdG8gY29tcGxldGUuIEFsc28gaW5pdGlhbGl6ZXMKLQkgKiBtX3RhZ1Njb3BlLgotCSAqIAotCSAqIEBwYXJhbSBmcm9tT2Zmc2V0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uQXJlYSBnZXRBbm5vdGF0aW9uQXJlYShpbnQgZnJvbU9mZnNldCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vIEZpcnN0LCByb3VnaGx5IGNhbGN1bGF0ZSB0aGUgZW5kIG9mIHRoZSBjb21tZW50LgotCQlJSmF2YUVsZW1lbnQgZWwgPSBtX2ljdS5nZXRFbGVtZW50QXQoZnJvbU9mZnNldCk7Ci0JCWludCBhYnNtYXgsIGFic21pbjsKLQkJaWYgKGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IHR5ID0gZWwuZ2V0RWxlbWVudFR5cGUoKTsKLQotCQlzd2l0Y2ggKHR5KSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRCA6Ci0JCQkJSUZpZWxkIGYgPSAoSUZpZWxkKSBlbDsKLQkJCQlhYnNtYXggPSBmLmdldE5hbWVSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCWFic21pbiA9IGYuZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQltX3RhZ1Njb3BlID0gVGFnU3BlYy5GSUVMRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6Ci0JCQkJSVR5cGUgdCA9IChJVHlwZSkgZWw7Ci0JCQkJYWJzbWF4ID0gdC5nZXROYW1lUmFuZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQlhYnNtaW4gPSB0LmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJbV90YWdTY29wZSA9IFRhZ1NwZWMuVFlQRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EIDoKLQkJCQlJTWV0aG9kIG0gPSAoSU1ldGhvZCkgZWw7Ci0JCQkJYWJzbWF4ID0gbS5nZXROYW1lUmFuZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQlhYnNtaW4gPSBtLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJbV90YWdTY29wZSA9IFRhZ1NwZWMuTUVUSE9EOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQltX3RhZ1Njb3BlID0gLTE7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBNYWtlIHN1cmUgd2UncmUgbm90IGFmdGVyIHRoZSBuYW1lIGZvciB0aGUgbWVtYmVyLgotCQlpZiAoYWJzbWF4IDwgZnJvbU9mZnNldCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgbWluID0gMCwgbWF4ID0gMDsKLQkJdHJ5IHsKLQkJCS8vIFNlYXJjaCBiYWNrd2FyZHMgZm9yIHRoZSBzdGFydGluZyAnQCcuCi0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKG1pbiA9IGZyb21PZmZzZXQ7IG1pbiA+PSBhYnNtaW47IG1pbi0tKSB7Ci0JCQkJaWYgKG1fZG9jLmdldENoYXIobWluKSA9PSAnQCcpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIFNlYXJjaCBmb3J3YXJkcyBmb3IgdGhlIG5leHQgJ0AnLCBvciB0aGUgZW5kIG9mIHRoZSBjb21tZW50LgotCQkJZm9yIChtYXggPSBmcm9tT2Zmc2V0ICsgMTsgbWF4IDwgYWJzbWF4OyBtYXgrKykgewotCQkJCWlmIChtX2RvYy5nZXRDaGFyKG1heCkgPT0gJ0AnKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEFubm90YXRpb25BcmVhKGVsLCBtaW4sIE1hdGgubWluKGFic21heCwgbWF4KSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbG9va3VwVGFnSGVscChUYWdTcGVjIHRzKSB7Ci0JCWlmICh0cyAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdHMubG9va3VwVGFnSGVscCgpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nLCByZXR1cm4gbnVsbAotCQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBsb29rdXBBdHRIZWxwKFRhZ0F0dHJpYlNwZWMgdGFzKSB7Ci0JCWlmICh0YXMgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHRhcy5sb29rdXBUYWdIZWxwKCk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCS8vIERvIG5vdGhpbmcsIHJldHVybiBudWxsCi0JCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEEgcmFuZ2UgdGhhdCBnb2VzIGZyb20gdGhlIGJlZ2lubmluZyBwb3NpdGlvbiB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBlbmQgcG9zaXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbkFyZWEgewotCQkvKioKLQkJICogRG9jdW1lbnQgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGphdmFkb2MgYW5ub3RhdGlvbi4KLQkJICovCi0JCWludCBiZWdpbk9mZnNldDsKLQotCQkvKioKLQkJICogRG9jdW1lbnQgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIGFyZWEgdGhhdCBjb3VsZCBjb250YWluIGFuIGFubm90YXRpb24uCi0JCSAqLwotCQlpbnQgZW5kT2Zmc2V0OwotCQkvKioKLQkJICogVGhlIEphdmEgZWxlbWVudCB0aGF0IHRoaXMgYW5ub3RhdGlvbiBpcyBhc3NpZ25lZC4KLQkJICogCi0JCSAqIEBwYXJhbSBiZWcKLQkJICogQHBhcmFtIGVuZAotCQkgKi8KLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50OwotCi0JCXB1YmxpYyBBbm5vdGF0aW9uQXJlYShJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIGludCBiZWcsIGludCBlbmQpIHsKLQkJCXRoaXMuamF2YUVsZW1lbnQgPSBqYXZhRWxlbWVudDsKLQkJCWJlZ2luT2Zmc2V0ID0gYmVnOwotCQkJZW5kT2Zmc2V0ID0gZW5kOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIG9mZnNldCA+PSBiZWdpbk9mZnNldCAmJiBvZmZzZXQgPCBlbmRPZmZzZXQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJCXJldHVybiBlbmRPZmZzZXQgLSBiZWdpbk9mZnNldDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBjdXJzb3IgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGFyZWEuIE9ubHkgdmFsaWQgaWYKLQkJICogPGNvZGU+dGhpcy5jb250YWlucyggYWJzQ3Vyc29yUG9zICk8L2NvZGU+Ci0JCSAqIAotCQkgKiBAcGFyYW0gYWJzQ3Vyc29yUG9zCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBpbnQgcmVsYXRpdmVDdXJzb3JQb3MoaW50IGFic0N1cnNvclBvcykgewotCQkJcmV0dXJuIGFic0N1cnNvclBvcyAtIGJlZ2luT2Zmc2V0OwotCQl9Ci0KLQkJcHVibGljIGludCByZWxhdGl2ZVRvQWJzKGludCByZWxQb3MpIHsKLQkJCXJldHVybiBiZWdpbk9mZnNldCArIHJlbFBvczsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZSB7Ci0JCVRva2VuIG5hbWU7Ci0KLQkJVG9rZW4gdmFsdWU7Ci0KLQkJaW50IGVxdWFsc1BvczsKLQotCQlBdHRyaWJ1dGUoVG9rZW4gbiwgaW50IGVwLCBUb2tlbiB2KSB7Ci0JCQluYW1lID0gbjsKLQkJCXZhbHVlID0gdjsKLQkJCWVxdWFsc1BvcyA9IGVwOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQXNzaWdubWVudCgpIHsKLQkJCXJldHVybiBlcXVhbHNQb3MgIT0gLTE7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZS5sZW5ndGgoKSAhPSAwOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHNyY1BvcykgewotCQkJcmV0dXJuIHNyY1BvcyA+PSBtaW5FeHRlbnQoKSAmJiBzcmNQb3MgPD0gbWF4RXh0ZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG1pbkV4dGVudCgpIHsKLQkJCXJldHVybiBuYW1lLmdldEJlZ2lubmluZygpOwotCQl9Ci0KLQkJcHVibGljIGludCBtYXhFeHRlbnQoKSB7Ci0JCQlpZiAoaGFzQXNzaWdubWVudCgpKSB7Ci0JCQkJaWYgKGhhc1ZhbHVlKCkpCi0JCQkJCXJldHVybiB2YWx1ZS5nZXRFbmQoKTsKLQkJCQlyZXR1cm4gZXF1YWxzUG9zOwotCQkJfQotCQkJcmV0dXJuIG5hbWUuZ2V0RW5kKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpbW1lZGlhdGVseVByZWNlZGVzKGludCBwb3MpIHsKLQkJCXJldHVybiBtYXhFeHRlbnQoKSArIDEgPT0gcG9zOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0Fubm90YXRpb25UYWdQcm9wb3NhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0Fubm90YXRpb25UYWdQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWE1NzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9Bbm5vdGF0aW9uVGFnUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA0LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMucmVnaXN0cnkuQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGtlbGxleXAKLSAqIAotICogQSBjb21wbGV0aW9uIHByb3Bvc2FsIGVzcGVjaWFsbHkgZm9yIEFubm90YXRpb24gdGFnIGNvbXBsZXRpb25zLiBUaGlzIHByb2JsZW0gdGhpcyBjbGFzcyB3YXMKLSAqIGNyZWF0ZWQgdG8gc29sdmUgd2FzIHRoZSBwcm9ibGVtIG9mIGF0dGFjaGluZyBoZWxwIHRleHQgdG8gYSBwcm9wb3NhbC4gVGhlIG1lY2hhbmlzbSBpbnNpZGUgb2YKLSAqIEphdmFDb21wbGV0aW9uUHJvcG9zYWwgd2FzIHVzZWxlc3MgdG8gdXMsIHNpbmNlIGl0IHdhcyB0aWVkIHRvIHRoZSBpZGVhIHRoYXQgdGhlIHByb3Bvc2FsIHdvdWxkCi0gKiBiZSBmb3IgYW4gYWN0dWFsIGphdmEgZWxlbWVudCwgdGhhdCBoYXMgamF2YWRvYyBhdHRhY2hlZCB0byBpdCwgZXRjLi4uIFNvIGhlcmUgd2Ugc3ViY2xhc3MKLSAqIEphdmFDb21wbGV0aW9uUHJvcG9zYWwgYW5kIG92ZXJyaWRlIDxjb2RlPmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm88L2NvZGU+IGZvciBhIG1vcmUgc3VpdGFibGUKLSAqIHdheSBvZiBhc3NvY2lhdGluZyBoZWxwIHRleHQgd2l0aCBhIHByb3Bvc2FsLgotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRhZ1Byb3Bvc2FsIGV4dGVuZHMgSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVU9URSA9ICciJzsKLQlwcml2YXRlIGJvb2xlYW4gZW5zdXJlQmVnaW5RdW90ZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBlbnN1cmVFbmRRdW90ZSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGxvY2FsU3RyaW5nOwotCS8vcHJpdmF0ZSBTdHJpbmcgcGFydGlhbFZhbHVlU3RyaW5nOwotCS8vcHJpdmF0ZSBBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyIGhlbHBlcjsKLQotCS8qKgotCSAqIExvY2FsaXplZCBoZWxwIHRleHQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbG9jVGV4dDsKLQotCS8qKgotCSAqIEBzZWUgSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCNKYXZhQ29tcGxldGlvblByb3Bvc2FsKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICogQHBhcmFtIHJlcGxhY2VtZW50U3RyaW5nCi0JICogQHBhcmFtIHJlcGxhY2VtZW50T2Zmc2V0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50TGVuZ3RoCi0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIGRpc3BsYXlTdHJpbmcKLQkgKiBAcGFyYW0gcmVsZXZhbmNlCi0JICovCi0JcHVibGljIEFubm90YXRpb25UYWdQcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBJbWFnZSBpbWFnZSwgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSk7Ci0JCXRoaXMubG9jYWxTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCNKYXZhQ29tcGxldGlvblByb3Bvc2FsKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotCSAqIEBwYXJhbSByZXBsYWNlbWVudFN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNlbWVudE9mZnNldAotCSAqIEBwYXJhbSByZXBsYWNlbWVudExlbmd0aAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBkaXNwbGF5U3RyaW5nCi0JICogQHBhcmFtIHJlbGV2YW5jZQotCSAqLwotCi0JcHVibGljIEFubm90YXRpb25UYWdQcm9wb3NhbChBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyIHByb3Bvc2FsSGVscGVyKSB7Ci0JCXRoaXMocHJvcG9zYWxIZWxwZXIuZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgcHJvcG9zYWxIZWxwZXIuZ2V0VmFsdWVPZmZzZXQoKSwgcHJvcG9zYWxIZWxwZXIuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbnVsbCwgcHJvcG9zYWxIZWxwZXIuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCksIDEpOwotCQlpZiAocHJvcG9zYWxIZWxwZXIgaW5zdGFuY2VvZiBVSUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIpCi0JCQlzZXRJbWFnZSgoKFVJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcikgcHJvcG9zYWxIZWxwZXIpLmdldEltYWdlKCkpOwotCQlzZXRFbnN1cmVCZWdpblF1b3RlKHByb3Bvc2FsSGVscGVyLmVuc3VyZUJlZ2luUXVvdGUoKSk7Ci0JCXNldEVuc3VyZUVuZFF1b3RlKHByb3Bvc2FsSGVscGVyLmVuc3VyZUVuZFF1b3RlKCkpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uVGFnUHJvcG9zYWwoVUlBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyIHByb3Bvc2FsSGVscGVyKSB7Ci0JCXRoaXMocHJvcG9zYWxIZWxwZXIuZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgcHJvcG9zYWxIZWxwZXIuZ2V0VmFsdWVPZmZzZXQoKSwgcHJvcG9zYWxIZWxwZXIuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zYWxIZWxwZXIuZ2V0SW1hZ2UoKSwgcHJvcG9zYWxIZWxwZXIuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCksIDEpOwotCQlzZXRFbnN1cmVCZWdpblF1b3RlKHByb3Bvc2FsSGVscGVyLmVuc3VyZUJlZ2luUXVvdGUoKSk7Ci0JCXNldEVuc3VyZUVuZFF1b3RlKHByb3Bvc2FsSGVscGVyLmVuc3VyZUVuZFF1b3RlKCkpOwotCX0KLQotCS8qKgotCSAqIE91ciBvdmVycmlkZSB0aGF0IHVzZXMgPGNvZGU+dGV4dEhvbGRlcjwvY29kZT4gdG8gcHJvdmlkZSB0aGUgaGVscCB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJcmV0dXJuIGxvY1RleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaG9sZGVyIG9mIHRoZSBoZWxwIHRleHQgdGhhdCBjYW4gYmUgZGlzcGxheWVkIHdpdGggdGhpcyBwcm9wb3NhbC4KLQkgKiAKLQkgKiBAcGFyYW0gaGxkCi0JICogICAgICAgICAgICBhbiBMb2NhbGl6ZWRUZXh0Q29udGFpbmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVscFRleHQoU3RyaW5nIHMpIHsKLQkJbG9jVGV4dCA9IHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBjaGFyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKLQkJZW5zdXJlUXVvdGVkSWZOZWNlc3NhcnkoZG9jdW1lbnQsIG9mZnNldCk7Ci0JCXN1cGVyLmFwcGx5KGRvY3VtZW50LCB0cmlnZ2VyLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlUXVvdGVkSWZOZWNlc3NhcnkoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChlbnN1cmVCZWdpblF1b3RlIHx8IGVuc3VyZUVuZFF1b3RlKSB7Ci0JCQl0cnkgewotCQkJCWNoYXIgYmVnaW4gPSBkb2N1bWVudC5nZXRDaGFyKGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgLSAxKTsKLQkJCQljaGFyIGVuZCA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCQlpZiAoZW5zdXJlQmVnaW5RdW90ZSAmJiBlbnN1cmVFbmRRdW90ZSAmJiBiZWdpbiAhPSBRVU9URSAmJiBlbmQgIT0gUVVPVEUpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWIuYXBwZW5kKFFVT1RFKS5hcHBlbmQobG9jYWxTdHJpbmcpLmFwcGVuZChRVU9URSk7Ci0JCQkJCWxvY2FsU3RyaW5nID0gYi50b1N0cmluZygpOwotCQkJCX0gZWxzZSBpZiAoZW5zdXJlQmVnaW5RdW90ZSAmJiBiZWdpbiAhPSBRVU9URSkKLQkJCQkJbG9jYWxTdHJpbmcgPSBRVU9URSArIGxvY2FsU3RyaW5nOwotCQkJCWVsc2UgaWYgKGVuc3VyZUVuZFF1b3RlICYmIGVuZCAhPSBRVU9URSkKLQkJCQkJbG9jYWxTdHJpbmcgPSBsb2NhbFN0cmluZyArIFFVT1RFOwotCQkJCXNldFJlcGxhY2VtZW50U3RyaW5nKGxvY2FsU3RyaW5nKTsKLQkJCQlzZXRDdXJzb3JQb3NpdGlvbihsb2NhbFN0cmluZy5sZW5ndGgoKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5zdXJlUXVvdGVkKGJvb2xlYW4gZW5zdXJlUXVvdGVkKSB7Ci0JCXNldEVuc3VyZUJlZ2luUXVvdGUoZW5zdXJlUXVvdGVkKTsKLQkJc2V0RW5zdXJlRW5kUXVvdGUoZW5zdXJlUXVvdGVkKTsKLQl9Ci0KLQkvL3B1YmxpYyB2b2lkIHNldFBhcnRpYWxWYWx1ZVN0cmluZyhTdHJpbmcgcGFydGlhbFZhbHVlU3RyaW5nKSB7Ci0JLy8JdGhpcy5wYXJ0aWFsVmFsdWVTdHJpbmcgPSBwYXJ0aWFsVmFsdWVTdHJpbmc7Ci0JLy99Ci0JcHVibGljIHZvaWQgc2V0RW5zdXJlQmVnaW5RdW90ZShib29sZWFuIGVuc3VyZUJlZ2luUXVvdGUpIHsKLQkJdGhpcy5lbnN1cmVCZWdpblF1b3RlID0gZW5zdXJlQmVnaW5RdW90ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnN1cmVFbmRRdW90ZShib29sZWFuIGVuc3VyZUVuZFF1b3RlKSB7Ci0JCXRoaXMuZW5zdXJlRW5kUXVvdGUgPSBlbnN1cmVFbmRRdW90ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0lXUkRSZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9JV1JEUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjJiMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL0lXUkRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3Iga2thdHlhbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJV1JEUmVzb3VyY2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJ0YWdoYW5kbGVydWkiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgSVdSRFJlc291cmNlcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvVUlBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvVUlBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FsSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTUzODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL3VpL1VJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLnJlZ2lzdHJ5LkF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFVJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlciBleHRlbmRzIEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxIZWxwZXIgewotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRTdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWVPZmZzZXQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gdmFsdWVEaXNwbGF5U3RyaW5nCi0JICovCi0JcHVibGljIFVJQXR0cmlidXRlVmFsdWVQcm9wb3NhbEhlbHBlcihTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCB2YWx1ZU9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgdmFsdWVEaXNwbGF5U3RyaW5nKSB7Ci0JCXN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCB2YWx1ZU9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIHZhbHVlRGlzcGxheVN0cmluZyk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvdWkvVWlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9VaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTk2ZjRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy91aS9VaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVWlQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVpUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMudWkuVWlQbHVnaW5SZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQzNDQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamR0X2ludGVncmF0aW9uLmphcgotQGRvdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjMGJjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjN2UyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogSW50ZWdyYXRpb24gUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjcuMAotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uY29tcG9uZW50Y29yZS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aCwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiYTBkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhNTU1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIKLQluYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5sYXVuY2hlci5hbnQiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5qYXZhIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyIgotCQlmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlIgotCQlmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvaW1hZ2VzL2phdmEuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvaW1hZ2VzL2phdmEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2NiNGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2ltYWdlcy9qYXZhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ5MmI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29udGV4dC5TZW5zaXRpdmUuQ2xhc3Mud29ya2luZ0NvcHlNYW5hZ2VyIgotICAgICAgICAgbmFtZT0iV29ya2luZyBDb3B5IE1hbmFnZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAga2V5PSJ3b3JraW5nQ29weU1hbmFnZXIiCi0gICAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uV1RQV29ya2luZ0NvcHlNYW5hZ2VyIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICBpZD0iamF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgbmFtZT0iamF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIj4KLSAgICAgIDx2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcgotICAgICAgICBpZD0iamF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgaGFuZGxlckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBzZWxlY3Rpb25UeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbCI+Ci0gICAgICA8ZWRpdE1vZGVsCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LnV0aWxpdHkiCi0gICAgICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLkphdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkiPgotICAgICAgPC9lZGl0TW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBQcm9qZWN0IEZhY2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iamF2YSI+Ci0gICAgICA8bGFiZWw+SmF2YTwvbGFiZWw+Ci0gICAgICA8ZGVzY3JpcHRpb24+QWRkcyBzdXBwb3J0IGZvciB3cml0aW5nIGFwcGxpY2F0aW9ucyB1c2luZyBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLjwvZGVzY3JpcHRpb24+Ci0gICAgICA8aWNvbj5pbWFnZXMvamF2YS5naWY8L2ljb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iamF2YSIgdmVyc2lvbj0iMS4zIj4KLSAgICAgIDxkZWxlZ2F0ZSB0eXBlPSJpbnN0YWxsIiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPGRlbGVnYXRlIHR5cGU9InZlcnNpb24tY2hhbmdlIiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSIvPgotICAgICAgPGRlbGVnYXRlIHR5cGU9InJ1bnRpbWUtY2hhbmdlZCIgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqYXZhIiB2ZXJzaW9uPSIxLjQiPgotICAgICAgPGRlbGVnYXRlIHR5cGU9Imluc3RhbGwiIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8ZGVsZWdhdGUgdHlwZT0idmVyc2lvbi1jaGFuZ2UiIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlIi8+Ci0gICAgICA8ZGVsZWdhdGUgdHlwZT0icnVudGltZS1jaGFuZ2VkIiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImphdmEiIHZlcnNpb249IjUuMCI+Ci0gICAgICA8ZGVsZWdhdGUgdHlwZT0iaW5zdGFsbCIgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDxkZWxlZ2F0ZSB0eXBlPSJ2ZXJzaW9uLWNoYW5nZSIgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUiLz4KLSAgICAgIDxkZWxlZ2F0ZSB0eXBlPSJydW50aW1lLWNoYW5nZWQiIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZSIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gIDwvZXh0ZW5zaW9uPgotICAgIAotICAgICAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vY29tcG9uZW50Y29yZS91dGlsL0NvbXBvbmVudFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vY29tcG9uZW50Y29yZS91dGlsL0NvbXBvbmVudFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg4NjNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdXRpbC9Db21wb25lbnRVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLklKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5KYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSUFydGlmYWN0RWRpdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRVdGlsaXRpZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9OQVRVUkUgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHJpZXZlIGFsbCB0aGUgc291cmNlIGNvbnRhaW5lcnMgZm9yIGEgZ2l2ZW4gdmlydHVhbCB3b3JrYmVuY2ggY29tcG9uZW50Ci0JICogCi0JICogQHBhcmFtIHZjCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgSVBhY2thZ2VGcmFnbWVudFJvb3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGdldFNvdXJjZUNvbnRhaW5lcnMoSVZpcnR1YWxDb21wb25lbnQgdmMpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gdmMuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3QgalByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHM7Ci0JCXRyeSB7Ci0JCQlyb290cyA9IGpQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcm9vdHNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAobnVsbCAhPSByZXNvdXJjZSkgewotCQkJCQlJVmlydHVhbFJlc291cmNlW10gdlJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlc291cmNlKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgIWZvdW5kICYmIGogPCB2UmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAodlJlc291cmNlc1tqXS5nZXRDb21wb25lbnQoKS5lcXVhbHModmMpKSB7Ci0JCQkJCQkJbGlzdC5hZGQocm9vdHNbaV0pOwotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3RbXSkgbGlzdC50b0FycmF5KG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtsaXN0LnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZSBhbGwgdGhlIG91dHB1dCBjb250YWluZXJzIGZvciBhIGdpdmVuIHZpcnR1YWwgY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSB2YwotCSAqIEByZXR1cm4gYXJyYXkgb2YgSUNvbnRhaW5lcnMgZm9yIHRoZSBvdXRwdXQgZm9sZGVycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lcltdIGdldE91dHB1dENvbnRhaW5lcnMoSVZpcnR1YWxDb21wb25lbnQgdmMpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VDb250YWluZXJzID0gZ2V0U291cmNlQ29udGFpbmVycyh2Yyk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8c291cmNlQ29udGFpbmVycy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gc291cmNlQ29udGFpbmVyc1tpXS5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJSUZvbGRlciBvdXRwdXRGb2xkZXIgPSB2Yy5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKG91dHB1dFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQkJaWYgKG91dHB1dEZvbGRlciAhPSBudWxsKQotCQkJCQlyZXN1bHQuYWRkKG91dHB1dEZvbGRlcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbnRhaW5lcltdKSByZXN1bHQudG9BcnJheShuZXcgSUNvbnRhaW5lcltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHRoZSBjb250YWluZXIgaXMgbm90IHJlYWQtb25seS4KLQkgKiA8cD4KLQkgKiBGb3IgTGludXgsIGEgUmVzb3VyY2UgY2Fubm90IGJlIGNyZWF0ZWQgaW4gYSBSZWFkT25seSBmb2xkZXIuIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIG5ldwotCSAqIGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgd29ya3NwYWNlIHJlc291cmNlIHRvIG1ha2UgcmVhZC93cml0ZQotCSAqIEBwbGFubmVkZm9yIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuZXhpc3RzKCkpIHsgLy8gaXQgbXVzdCBiZSBuZXcKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0ciA9IGNvbnRhaW5lci5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKTsKLQkJCQlpZiAoIWF0dHIuaXNSZWFkT25seSgpKQotCQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQkJYXR0ci5zZXRSZWFkT25seShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGb2xkZXIgY3JlYXRlRm9sZGVySW5Db21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZm9sZGVyTmFtZSAhPSBudWxsKSB7Ci0JCQlJVmlydHVhbEZvbGRlciByb290Zm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCUlGb2xkZXIgZm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIobmV3IFBhdGgocm9vdGZvbGRlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKS5hcHBlbmQoZm9sZGVyTmFtZSkpOwotCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlQcm9qZWN0VXRpbGl0aWVzLmVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KGZvbGRlcik7Ci0JCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBmb2xkZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgY29tcCkgewotCQlBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpOwotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaWQgPSBjb21wLmdldENvbXBvbmVudFR5cGVJZCgpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlJQXJ0aWZhY3RFZGl0RmFjdG9yeSBmYWN0b3J5ID0gcmVhZGVyLmdldEFydGlmYWN0RWRpdChpZCk7Ci0JCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyBJRmlsZSBmaW5kRmlsZShJVmlydHVhbENvbXBvbmVudCBjb21wLCBJUGF0aCBhUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29tcCA9PSBudWxsIHx8IGFQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdCA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbFJlc291cmNlIGZpbGUgPSByb290LmZpbmRNZW1iZXIoYVBhdGgpOwotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJcmV0dXJuIChJRmlsZSkgZmlsZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBmaW5kQ29tcG9uZW50KElSZXNvdXJjZSByZXMpIHsKLQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50KXJlcy5nZXRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogKioqKioqKioqKioqKioqKioqKioqKlBsZWFzZSByZWFkIGphdmEgZG9jIGJlZm9yZSB1c2luZyB0aGlzIGFwaSoqKioqKioqKioqKioqKioqKioKLQkgKiBUaGlzIGlzIGEgdmVyeSBleHBlbnNpdmUgYXBpIGZyb20gYSBwZXJmb3JtYW5jZSBwb2ludCBhcyBpdCBkb2VzIGEgc3RydWN0dXJlIGVkaXQKLQkgKiBhY2Nlc3MgYW5kIHJlbGVhc2UgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSB3b3Jrc3BhY2UuIFVzZSB0aGlzIGFwaSB2ZXJ5IHNwYXJpbmdseQotCSAqIGFuZCBpZiB1c2VkIGNhY2hlZCB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhpcyBhcGkgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZwotCSAqIEByZXR1cm4gLSBBIGFuIGFycmF5IG9mIGFsbCB2aXJ0dWFsIGNvbXBvbmVudHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0QWxsV29ya2JlbmNoQ29tcG9uZW50cygpIHsKLQkJTGlzdCBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHByb2plY3RzID0gQXJyYXlzLmFzTGlzdChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiggTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdCgoSVByb2plY3QpcHJvamVjdHMuZ2V0KGkpKSl7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgd2JDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoKElQcm9qZWN0KXByb2plY3RzLmdldChpKSk7Ci0JCQkJY29tcG9uZW50cy5hZGQod2JDb21wKTsKLQkJCX0KLQkJfQotCQlWaXJ0dWFsQ29tcG9uZW50W10gdGVtcCA9IChWaXJ0dWFsQ29tcG9uZW50W10pIGNvbXBvbmVudHMudG9BcnJheShuZXcgVmlydHVhbENvbXBvbmVudFtjb21wb25lbnRzLnNpemUoKV0pOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci0JCi0JLyoqCi0JICogKioqKioqKioqKioqKioqKioqKioqKlBsZWFzZSByZWFkIGphdmEgZG9jIGJlZm9yZSB1c2luZyB0aGlzIGFwaSoqKioqKioqKioqKioqKioqKioKLQkgKiBUaGlzIGlzIGEgdmVyeSBleHBlbnNpdmUgYXBpIGZyb20gYSBwZXJmb3JtYW5jZSBwb2ludCBhcyBpdCBkb2VzIGEgc3RydWN0dXJlIGVkaXQKLQkgKiBhY2Nlc3MgYW5kIHJlbGVhc2UgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSB3b3Jrc3BhY2UuIFVzZSB0aGlzIGFwaSB2ZXJ5IHNwYXJpbmdseQotCSAqIGFuZCBpZiB1c2VkIGNhY2hlZCB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhpcyBhcGkgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KLQkgKiAKLQkgKiBAcmV0dXJuIC0gQSB2aXJ0dWFsIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlCi0JICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudChTdHJpbmcgY29tcG9uZW50TmFtZSkgewotCQlJVmlydHVhbENvbXBvbmVudFtdIGFsbENvbXBvbmVudHMgPSBnZXRBbGxXb3JrYmVuY2hDb21wb25lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQ29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFsbENvbXBvbmVudHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhjb21wb25lbnROYW1lKSkKLQkJCQlyZXR1cm4gYWxsQ29tcG9uZW50c1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcCkgewotCQlBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpOwotCQlJQXJ0aWZhY3RFZGl0RmFjdG9yeSBmYWN0b3J5ID0gcmVhZGVyLmdldEFydGlmYWN0RWRpdChjb21wLmdldENvbXBvbmVudFR5cGVJZCgpKTsKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoY29tcCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBmaW5kQ29tcG9uZW50KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzID0gYW5PYmplY3QuZVJlc291cmNlKCk7Ci0JCXJldHVybiBmaW5kQ29tcG9uZW50KHJlcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBmaW5kQ29tcG9uZW50KFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50KVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoYVJlc291cmNlKS5nZXRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsSmF2YU5vbkZsZXhQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdCBub25GbGV4SmF2YVByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkgJiYgcHJvamVjdHNbaV0uaGFzTmF0dXJlKEpBVkFfTkFUVVJFKSAmJiAhcHJvamVjdHNbaV0uaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQlub25GbGV4SmF2YVByb2plY3RzLmFkZChwcm9qZWN0c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vbkZsZXhKYXZhUHJvamVjdHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbiBjcmVhdGVGbGV4SmF2YVByb2plY3RGb3JQcm9qZWN0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotCQlyZXR1cm4gbmV3IEphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCBjcmVhdGVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQkKLQkJcmV0dXJuIG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AobW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCBjcmVhdGVXTFBSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbiByZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQlyZXR1cm4gbmV3IFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihtb2RlbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKiBAZGVzY3JpcHRpb24gdGhlIHBhc3NlZCBuYW1lIHNob3VsZCBoYXZlIGVpdGhlciBsaWIgb3IgdmFyIGFzIGl0cyBmaXJzdCBzZWdtZW50IGUuZy4KLQkgKiAgICAgICAgICAgICAgbGliL0Q6L2Zvby9mb28uamFyIG9yIHZhci88Q0xBU1NQQVRIVkFSPi9mb28uamFyCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSZXNvbHZlZFBhdGhGb3JBcmNoaXZlQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7Ci0KLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkobmFtZSk7Ci0KLQkJU3RyaW5nIHJlc291cmNlVHlwZSA9IHVyaS5zZWdtZW50KDApOwotCQlVUkkgY29udGVudHVyaSA9IE1vZHVsZVVSSVV0aWwudHJpbVRvUmVsYXRpdmVQYXRoKHVyaSwgMSk7Ci0JCVN0cmluZyBjb250ZW50TmFtZSA9IGNvbnRlbnR1cmkudG9TdHJpbmcoKTsKLQotCQlpZiAocmVzb3VyY2VUeXBlLmVxdWFscygibGliIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gbW9kdWxlOi9jbGFzc3BhdGgvbGliL0Q6L2Zvby9mb28uamFyCi0JCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoY29udGVudE5hbWUpOwotCi0JCX0gZWxzZSBpZiAocmVzb3VyY2VUeXBlLmVxdWFscygidmFyIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBtb2R1bGU6L2NsYXNzcGF0aC92YXIvPENMQVNTUEFUSFZBUj4vZm9vLmphcgotCQkJU3RyaW5nIGNsYXNzcGF0aFZhciA9IGNvbnRlbnR1cmkuc2VnbWVudCgwKTsKLQkJCVVSSSByZW1haW5pbmdQYXRodXJpID0gTW9kdWxlVVJJVXRpbC50cmltVG9SZWxhdGl2ZVBhdGgoY29udGVudHVyaSwgMSk7Ci0JCQlTdHJpbmcgcmVtYWluaW5nUGF0aCA9IHJlbWFpbmluZ1BhdGh1cmkudG9TdHJpbmcoKTsKLQotCQkJU3RyaW5nW10gY2xhc3NwYXRodmFycyA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlTmFtZXMoKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRodmFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChjbGFzc3BhdGhWYXIuZXF1YWxzKGNsYXNzcGF0aHZhcnNbaV0pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKSB7Ci0JCQkJSVBhdGggcGF0aCA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKGNsYXNzcGF0aFZhcik7Ci0JCQkJVVJJIGZpbmFsdXJpID0gVVJJLmNyZWF0ZVVSSShwYXRoLnRvT1NTdHJpbmcoKSArIElQYXRoLlNFUEFSQVRPUiArIHJlbWFpbmluZ1BhdGgpOwotCQkJCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhmaW5hbHVyaS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0QWxsQ29tcG9uZW50c0luV29ya3NwYWNlT2ZUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50W10gYWxsQ29tcHMgPSBnZXRBbGxXb3JrYmVuY2hDb21wb25lbnRzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENvbXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBhbGxDb21wc1tpXTsKLQkJCWlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZUlkKCkuZXF1YWxzKHR5cGUpKQotCQkJCXJlc3VsdC5hZGQoY29tcG9uZW50KTsKLQkJfQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pIHJlc3VsdC50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vZnJhbWV3b3Jrcy9Db21tb25GcmFtZXdvcmtzUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9mcmFtZXdvcmtzL0NvbW1vbkZyYW1ld29ya3NQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4ZWViOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9mcmFtZXdvcmtzL0NvbW1vbkZyYW1ld29ya3NQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tb25GcmFtZXdvcmtzUGx1Z2luIAotCi0gICAgZXh0ZW5kcyBXVFBQbHVnaW4KLQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbiBpbnN0Ci0gICAgICAgID0gbmV3IENvbW1vbkZyYW1ld29ya3NQbHVnaW4oKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIENvbW1vbkZyYW1ld29ya3NQbHVnaW4gZ2V0RGVmYXVsdCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGluc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBQTFVHSU5fSUQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElMb2cgbG9nID0gQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiRW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24uIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgbG9nLmxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyMGVjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc3BhdGhEZWNvcmF0aW9ucwotewotICAgIHByaXZhdGUgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGg7Ci0gICAgcHJpdmF0ZSBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXh0cmFBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHB1YmxpYyBJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VBdHRhY2htZW50UGF0aDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRTb3VyY2VBdHRhY2htZW50UGF0aCggZmluYWwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGggKQotICAgIHsKLSAgICAgICAgdGhpcy5zb3VyY2VBdHRhY2htZW50UGF0aCA9IHNvdXJjZUF0dGFjaG1lbnRQYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoIGZpbmFsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCApCi0gICAgewotICAgICAgICB0aGlzLnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBnZXRFeHRyYUF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGFycmF5IAotICAgICAgICAgICAgPSBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVsgdGhpcy5leHRyYUF0dHJpYnV0ZXMuc2l6ZSgpIF07Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKElDbGFzc3BhdGhBdHRyaWJ1dGVbXSkgdGhpcy5leHRyYUF0dHJpYnV0ZXMudG9BcnJheSggYXJyYXkgKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRFeHRyYUF0dHJpYnV0ZXMoIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRycyApCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHRyYUF0dHJpYnV0ZXMuYWRkKCBhdHRyc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFkZEV4dHJhQXR0cmlidXRlKCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyCi0gICAgICAgICAgICA9IEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZXh0cmFBdHRyaWJ1dGVzLmFkZCggYXR0ciApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdlODg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIKLXsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGUgZjsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXAgZGVjb3JhdGlvbnM7Ci0gICAgCi0gICAgcHVibGljIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciggZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBGaWxlIHdzZGlyID0gd3MuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0gICAgICAgIGZpbmFsIEZpbGUgd3NtZHJvb3QgPSBuZXcgRmlsZSggd3NkaXIsICIubWV0YWRhdGEvLnBsdWdpbnMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmluYWwgRmlsZSBwbWRyb290ID0gbmV3IEZpbGUoIHdzbWRyb290LCBwbHVnaW4gKTsKLSAgICAKLSAgICAgICAgdGhpcy5mID0gbmV3IEZpbGUoIHBtZHJvb3QsICJjbGFzc3BhdGguZGVjb3JhdGlvbnMueG1sIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSByZWFkKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDbGFzc3BhdGhEZWNvcmF0aW9ucyBnZXREZWNvcmF0aW9ucyggZmluYWwgU3RyaW5nIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRyeSApCi0gICAgewotICAgICAgICBmaW5hbCBIYXNoTWFwIHN1Ym1hcCA9IChIYXNoTWFwKSB0aGlzLmRlY29yYXRpb25zLmdldCggY29udGFpbmVyICk7Ci0gICAgICAgIAotICAgICAgICBpZiggc3VibWFwID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChDbGFzc3BhdGhEZWNvcmF0aW9ucykgc3VibWFwLmdldCggZW50cnkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvcmF0aW9ucyggZmluYWwgU3RyaW5nIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgKQotICAgIHsKLSAgICAgICAgSGFzaE1hcCBzdWJtYXAgPSAoSGFzaE1hcCkgdGhpcy5kZWNvcmF0aW9ucy5nZXQoIGNvbnRhaW5lciApOwotICAgICAgICAKLSAgICAgICAgaWYoIHN1Ym1hcCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VibWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMucHV0KCBjb250YWluZXIsIHN1Ym1hcCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdWJtYXAucHV0KCBlbnRyeSwgZGVjICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsZWFyQWxsRGVjb3JhdGlvbnMoIGZpbmFsIFN0cmluZyBjb250YWluZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWNvcmF0aW9ucy5yZW1vdmUoIGNvbnRhaW5lciApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmUoKQotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBmb2xkZXIgPSB0aGlzLmYuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAKLSAgICAgICAgaWYoICEgZm9sZGVyLmV4aXN0cygpICYmICEgZm9sZGVyLm1rZGlycygpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBQcmludFdyaXRlciB3ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3ID0gbmV3IFByaW50V3JpdGVyKCBuZXcgQnVmZmVyZWRXcml0ZXIoIG5ldyBGaWxlV3JpdGVyKCB0aGlzLmYgKSApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHcucHJpbnRsbiggIjxjbGFzc3BhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMSA9IGRlY29yYXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgCi0gICAgICAgICAgICAgICAgIGl0cjEuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5MSA9IChNYXAuRW50cnkpIGl0cjEubmV4dCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcCBzdWJtYXAgPSAoTWFwKSBlbnRyeTEuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3LnByaW50KCAiICA8Y29udGFpbmVyIGlkPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdy5wcmludCggKFN0cmluZykgZW50cnkxLmdldEtleSgpICk7Ci0gICAgICAgICAgICAgICAgdy5wcmludGxuKCAiXCI+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIyID0gc3VibWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgCi0gICAgICAgICAgICAgICAgICAgICBpdHIyLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5MiA9IChNYXAuRW50cnkpIGl0cjIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NwYXRoRGVjb3JhdGlvbnMgZGVjIAotICAgICAgICAgICAgICAgICAgICAgICAgPSAoQ2xhc3NwYXRoRGVjb3JhdGlvbnMpIGVudHJ5Mi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIiAgICA8ZW50cnkgaWQ9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdy5wcmludCggKFN0cmluZykgZW50cnkyLmdldEtleSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIlwiPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGRlYy5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiICAgICAgPHNvdXJjZS1hdHRhY2htZW50LXBhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCBkZWMuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICI8L3NvdXJjZS1hdHRhY2htZW50LXBhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiICAgICAgPHNvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIGRlYy5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICI8L3NvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBkZWMuZ2V0RXh0cmFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyID0gYXR0cnNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIiAgICAgIDxhdHRyaWJ1dGUgbmFtZT1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggYXR0ci5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoICJcIj4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIGF0dHIuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludGxuKCAiPC9hdHRyaWJ1dGU+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIiAgICA8L2VudHJ5PiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3LnByaW50bG4oICIgIDwvY29udGFpbmVyPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3LnByaW50bG4oICI8L2NsYXNzcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB3LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHJlYWQoKQotICAgIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiggISB0aGlzLmYuZXhpc3RzKCkgKSByZXR1cm4gbWFwOwotCi0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgRWxlbWVudCByb290ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5IAotICAgICAgICAgICAgICAgID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgZG9jYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oIGYgKSApOwotICAgICAgICAgICAgcm9vdCA9IGRvY2J1aWxkZXIucGFyc2UoIGluICkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggaW4gIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSXRlcmF0b3IgaXRyMSA9IGVsZW1lbnRzKCByb290LCAiY29udGFpbmVyIiApOyBpdHIxLmhhc05leHQoKTsgKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZTEgPSAoRWxlbWVudCkgaXRyMS5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2lkID0gZTEuZ2V0QXR0cmlidXRlKCAiaWQiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSGFzaE1hcCBzdWJtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgbWFwLnB1dCggY2lkLCBzdWJtYXAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIyID0gZWxlbWVudHMoIGUxLCAiZW50cnkiICk7IGl0cjIuaGFzTmV4dCgpOyApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50IGUyID0gKEVsZW1lbnQpIGl0cjIubmV4dCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlaWQgPSBlMi5nZXRBdHRyaWJ1dGUoICJpZCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyA9IG5ldyBDbGFzc3BhdGhEZWNvcmF0aW9ucygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN1Ym1hcC5wdXQoIGVpZCwgZGVjICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIzID0gZWxlbWVudHMoIGUyICk7IGl0cjMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50IGUzID0gKEVsZW1lbnQpIGl0cjMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbiA9IGUzLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggbi5lcXVhbHMoICJzb3VyY2UtYXR0YWNobWVudC1wYXRoIiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFBhdGgoIG5ldyBQYXRoKCB0ZXh0KCBlMyApICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBuLmVxdWFscyggInNvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aCIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjLnNldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCggbmV3IFBhdGgoIHRleHQoIGUzICkgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIG4uZXF1YWxzKCAiYXR0cmlidXRlIiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGUzLmdldEF0dHJpYnV0ZSggIm5hbWUiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYy5hZGRFeHRyYUF0dHJpYnV0ZSggbmFtZSwgdGV4dCggZTMgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGV4dCggZmluYWwgRWxlbWVudCBlbCApCi0gICAgewotICAgICAgICBmaW5hbCBOb2RlTGlzdCBub2RlcyA9IGVsLmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICBTdHJpbmcgc3RyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IG5vZGVzLmdldExlbmd0aCgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTm9kZSBub2RlID0gbm9kZXMuaXRlbSggaSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggYnVmICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggdmFsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHN0ciAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggc3RyICk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHZhbCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc3RyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyID0gdmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGJ1ZiAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEl0ZXJhdG9yIGVsZW1lbnRzKCBmaW5hbCBFbGVtZW50IGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudHNJdGVyYXRvciggZWwsIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3IgZWxlbWVudHMoIGZpbmFsIEVsZW1lbnQgZWwgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50c0l0ZXJhdG9yKCBlbCwgbnVsbCApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVsZW1lbnRzSXRlcmF0b3IKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJdGVyYXRvcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTm9kZUxpc3Qgbm9kZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb247Ci0gICAgICAgIHByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCi0gICAgICAgIHB1YmxpYyBFbGVtZW50c0l0ZXJhdG9yKCBmaW5hbCBFbGVtZW50IHBhcmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubm9kZXMgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBub2Rlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAtMTsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0KLSAgICAgICAgICAgIGFkdmFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZHZhbmNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24rKzsKLQotICAgICAgICAgICAgZm9yKCA7IHRoaXMucG9zaXRpb24gPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmVsZW1lbnQgPT0gbnVsbDsgCi0gICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb24rKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTm9kZSBub2RlID0gdGhpcy5ub2Rlcy5pdGVtKCB0aGlzLnBvc2l0aW9uICk7Ci0KLSAgICAgICAgICAgICAgICBpZiggbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmCi0gICAgICAgICAgICAgICAgICAgICggdGhpcy5uYW1lID09IG51bGwgfHwgCi0gICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyggdGhpcy5uYW1lICkgKSApIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCB0aGlzLmVsZW1lbnQgIT0gbnVsbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZWwgPSB0aGlzLmVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIGlmKCBlbCA9PSBudWxsICkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWR2YW5jZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gZWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSAKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzZWVjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5jb21wb25lbnRjb3JlLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcgotCi0gICAgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyCi0KLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGhUeXBlCi0gICAgewotLy8gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHR5cGU7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFBhdGhUeXBlKCBmaW5hbCBTdHJpbmcgdHlwZSApCi0gICAgICAgIHsKLS8vICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGhUeXBlIAotICAgICAgICAgICAgTElCX0RJUkVDVE9SWSA9IG5ldyBQYXRoVHlwZSggImxpYiIgKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQ0xBU1NFU19ESVJFQ1RPUlkgPSBuZXcgUGF0aFR5cGUoICJjbGFzc2VzIiApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2Ugd29ya3NwYWNlOwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBkZWNvcmF0aW9uczsgCi0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSByZXNvdXJjZSBsaXN0ZW5lciB0aGF0IHdpbGwgbGlzdGVuIGZvciBjaGFuZ2VzIHRvCi0gICAgICAgIC8vIHJlc291cmNlcyByZWxldmFudCB0byBmbGV4aWJsZSBwcm9qZWN0IGNvbnRhaW5lcnMgYWNyb3NzIHRoZQotICAgICAgICAvLyB3b3Jrc3BhY2UgYW5kIHJlZnJlc2ggdGhlbSBhcyBuZWNlc3NhcnkuCi0gICAgICAgIAotICAgICAgICB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIHdvcmtzcGFjZS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCBuZXcgTGlzdGVuZXIoKSApOwotICAgICAgICAKLSAgICAgICAgLy8gUmVhZCB0aGUgZGVjb3JhdGlvbnMgZnJvbSB0aGUgd29ya3NwYWNlIG1ldGFkYXRhLgotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbiA9IENvbW1vbkZyYW1ld29ya3NQbHVnaW4uUExVR0lOX0lEOwotICAgICAgICBkZWNvcmF0aW9ucyA9IG5ldyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIoIHBsdWdpbiApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBJUGF0aCBwYXRoOwotICAgIHByb3RlY3RlZCBmaW5hbCBJSmF2YVByb2plY3Qgb3duZXI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjb21wb25lbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcGVudHJpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJUGF0aFtdIHdhdGNobGlzdDsKLSAgICAKLSAgICBwdWJsaWMgRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKCBmaW5hbCBJUGF0aCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGhbXSBwYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoVHlwZVtdIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBBcnJheUxpc3QgY3AgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCB3ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmKCAhIGlzRmxleGlibGVQcm9qZWN0KCB0aGlzLnByb2plY3QgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNpbGVudGx5IG5vb3AgaWYgdGhlIHJlZmVyZW5jZWQgcHJvamVjdCBpcyBub3QgYSBmbGV4aWJsZQotICAgICAgICAgICAgLy8gcHJvamVjdC4gU2hvdWxkIEkgYmUgZG9pbmcgc29tZXRoaW5nIGVsc2UgaGVyZT8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5jcGVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WyAwIF07Ci0gICAgICAgICAgICB0aGlzLndhdGNobGlzdCA9IG5ldyBJUGF0aFsgMCBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgLy8gICAgZmluYWwgU3RyaW5nIGNpZCA9IHRoaXMucGF0aC50b1N0cmluZygpOyAKLSAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCh0aGlzLnByb2plY3QpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZmluYWwgSVZpcnR1YWxGb2xkZXIgdmYgPSB2Yy5nZXRGb2xkZXIoIHBhdGhzWyBpIF0gKTsJCQkKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2Yy5nZXRSb290Rm9sZGVyKCk7Ci0JCQlmaW5hbCBJVmlydHVhbEZvbGRlciB2ZiA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKCBwYXRoc1sgaSBdICk7Ci0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHR5cGVzWyBpIF0gPT0gUGF0aFR5cGUuTElCX0RJUkVDVE9SWSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxSZXNvdXJjZVtdIGNvbnRlbnRzOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSB2Zi5tZW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBjb250ZW50cy5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2UgciA9IGNvbnRlbnRzWyBqIF0uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHAgPSByLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZiA9IHIuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZuYW1lID0gZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmLmlzRmlsZSgpICYmIGZuYW1lLmVuZHNXaXRoKCAiLmphciIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3AuYWRkKCBuZXdMaWJyYXJ5RW50cnkoIHAgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElGb2xkZXJbXSBmb2xkZXJzID0gdmYuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IGZvbGRlcnMubGVuZ3RoOyBqKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdy5hZGQoIGZvbGRlcnNbIGogXS5nZXRGdWxsUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElGb2xkZXJbXSB1ZiA9IHZmLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCB1Zi5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwID0gdWZbIGogXS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgaXNTb3VyY2VEaXJlY3RvcnkoIHAgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwLmFkZCggbmV3TGlicmFyeUVudHJ5KCBwICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdy5hZGQoIHRoaXMucHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZCggIi53dHBtb2R1bGVzIiApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAotICAgICAgICB0aGlzLmNwZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbIGNwLnNpemUoKSBdOwotICAgICAgICBjcC50b0FycmF5KCB0aGlzLmNwZW50cmllcyApOwotICAgICAgICAKLSAgICAgICAgdGhpcy53YXRjaGxpc3QgPSBuZXcgSVBhdGhbIHcuc2l6ZSgpIF07Ci0gICAgICAgIHcudG9BcnJheSggdGhpcy53YXRjaGxpc3QgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRLaW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBLX0FQUExJQ0FUSU9OOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNwZW50cmllczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdXRPZkRhdGUoIGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhICkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgdGhpcy53YXRjaGxpc3QubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihkZWx0YSAhPSBudWxsICYmIGRlbHRhLmZpbmRNZW1iZXIoIHRoaXMud2F0Y2hsaXN0WyBpIF0gKSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWZyZXNoKCk7Ci0gICAgCi0gICAgc3RhdGljIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBnZXREZWNvcmF0aW9uc01hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY29yYXRpb25zOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElDbGFzc3BhdGhFbnRyeSBuZXdMaWJyYXJ5RW50cnkoIGZpbmFsIElQYXRoIHAgKQotICAgIHsKLSAgICAgICAgSVBhdGggc3JjcGF0aCA9IG51bGw7Ci0gICAgICAgIElQYXRoIHNyY3Jvb3RwYXRoID0gbnVsbDsKLSAgICAgICAgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzID0ge307Ci0gICAgICAgIElBY2Nlc3NSdWxlW10gYWNjZXNzID0ge307Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgCi0gICAgICAgICAgICA9IGRlY29yYXRpb25zLmdldERlY29yYXRpb25zKCBnZXRQYXRoKCkudG9TdHJpbmcoKSwgcC50b1N0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZGVjICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzcmNwYXRoID0gZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0gICAgICAgICAgICBzcmNyb290cGF0aCA9IGRlYy5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKLSAgICAgICAgICAgIGF0dHJzID0gZGVjLmdldEV4dHJhQXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KCBwLCBzcmNwYXRoLCBzcmNyb290cGF0aCwgYWNjZXNzLCBhdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZURpcmVjdG9yeSggZmluYWwgSVBhdGggYVBhdGggKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSggdGhpcy5wcm9qZWN0ICk7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGpwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlID0gY3BbIGkgXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFICYmCi0gICAgICAgICAgICAgICAgICAgIGNwZS5nZXRQYXRoKCkuZXF1YWxzKCBhUGF0aCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0phdmFQcm9qZWN0KCBmaW5hbCBJUHJvamVjdCBwaiApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBqLmdldE5hdHVyZShDb21wb25lbnRVdGlsaXRpZXMuSkFWQV9OQVRVUkUpICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGbGV4aWJsZVByb2plY3QoIGZpbmFsIElQcm9qZWN0IHBqICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmF0dXJlIAotICAgICAgICAgICAgICAgID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcGouZ2V0TmF0dXJlKCBuYXR1cmUgKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdGVuZXIKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZCggZmluYWwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBMb2NhdGUgYWxsIG9mIHRoZSBmbGV4aWJsZSBwcm9qZWN0IGNvbnRhaW5lcnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdCBjb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZmluYWwgSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzWyBpIF07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggaXNKYXZhUHJvamVjdCggcHJvamVjdCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcGVzID0ganByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgY3Blcy5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwZXNbIGogXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhDb250YWluZXIgY29udAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoIGNwZS5nZXRQYXRoKCksIGpwcm9qICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY29udCBpbnN0YW5jZW9mIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMuYWRkKCBjb250ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBjb250YWluZXJzIHRoYXQgYXJlIG91dCBvZiBkYXRlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gY29udGFpbmVycy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lciBjIAotICAgICAgICAgICAgICAgICAgICA9IChGbGV4aWJsZVByb2plY3RDb250YWluZXIpIGNvbnRhaW5lcnMuZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGMuaXNPdXRPZkRhdGUoIGRlbHRhICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYy5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXJJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzg0OWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyIAotCi0gICAgZXh0ZW5kcyBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgotCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyIGRlY29yYXRpb25zCi0gICAgICAgID0gRmxleGlibGVQcm9qZWN0Q29udGFpbmVyLmdldERlY29yYXRpb25zTWFuYWdlcigpOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhblVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lciggZmluYWwgSVBhdGggY29udGFpbmVyUGF0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QgcHJvamVjdCkgCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZSggZmluYWwgSVBhdGggY29udGFpbmVyUGF0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhDb250YWluZXIgc2cgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgY2lkID0gY29udGFpbmVyUGF0aC50b1N0cmluZygpOwotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gc2cuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotICAgICAgICAKLSAgICAgICAgZGVjb3JhdGlvbnMuY2xlYXJBbGxEZWNvcmF0aW9ucyggY2lkICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzWyBpIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElQYXRoIHNyY3BhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotICAgICAgICAgICAgZmluYWwgSVBhdGggc3Jjcm9vdHBhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRycyA9IGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggc3JjcGF0aCAhPSBudWxsIHx8IGF0dHJzLmxlbmd0aCA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlaWQgPSBlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgPSBuZXcgQ2xhc3NwYXRoRGVjb3JhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFBhdGgoIHNyY3BhdGggKTsKLSAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCBzcmNyb290cGF0aCApOwotICAgICAgICAgICAgICAgIGRlYy5zZXRFeHRyYUF0dHJpYnV0ZXMoIGF0dHJzICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMuc2V0RGVjb3JhdGlvbnMoIGNpZCwgZWlkLCBkZWMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZGVjb3JhdGlvbnMuc2F2ZSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIKLSAgICAgICAgICAgID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKCBjb250YWluZXJQYXRoLCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICAoIChGbGV4aWJsZVByb2plY3RDb250YWluZXIpIGNvbnRhaW5lciApLnJlZnJlc2goKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9JSmF2YVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9JSmF2YVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhMGQ0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSUphdmFQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJSmF2YVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMgZXh0ZW5kcyBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCwgdHlwZSBTdHJpbmcgW10uIFRoZXNlIG5hbWVzIGFyZSByZWxhdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRk9MREVSUyA9ICJKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLlNPVVJDRV9GT0xERVJTIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIEJvb2xlYW4gZGVmYXVsdCBpcyBUcnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1NPVVJDRV9GT0xERVJTID0gIkphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwuQ1JFQVRFX1NPVVJDRV9GT0xERVJTIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBPcHRpb25hbCwgdHlwZSBJQ2xhc3NwYXRoRW50cnlbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9FTlRSSUVTID0gIkphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwuQ0xBU1NQQVRIX0VOVFJJRVMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPcHRpb25hbCwgdHlwZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTE9DQVRJT04gPSAiSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbC5PVVRQVVRfTE9DQVRJT04iOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0lKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzMTk5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogUmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MmJiNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwgZXh0ZW5kcyBBcnRpZmFjdEVkaXRNb2RlbCBpbXBsZW1lbnRzIFdvcmtpbmdDb3B5UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBXb3JraW5nQ29weU1hbmFnZXIgd29ya2luZ0NvcHlNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSBhbkVkaXRNb2RlbElkCi0JICogQHBhcmFtIGFDb250ZXh0Ci0JICogQHBhcmFtIHRvTWFrZVJlYWRPbmx5Ci0JICogQHBhcmFtIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqLwotCXB1YmxpYyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIGJvb2xlYW4gdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSwgVVJJIGFNb2R1bGVVUkkpIHsKLQkJc3VwZXIoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LAotCQkJCXRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIGFNb2R1bGVVUkkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5FZGl0TW9kZWxJZAotCSAqIEBwYXJhbSBhQ29udGV4dAotCSAqIEBwYXJhbSB0b01ha2VSZWFkT25seQotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICovCi0JcHVibGljIEphdmFBcnRpZmFjdEVkaXRNb2RlbChTdHJpbmcgYW5FZGl0TW9kZWxJZCwgRU1GV29ya2JlbmNoQ29udGV4dCBhQ29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwgVVJJIGFNb2R1bGVVUkkpIHsKLQkJc3VwZXIoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LCBhTW9kdWxlVVJJKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGRlbGV0ZQotCSAqIAotCSAqIEBjdSBmcm9tIHRoZSB3b3JrYmVuY2ggYW5kIGZpeCB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlcyBmb3IgdGhpcyB3b3JraW5nIGNvcHkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBjdSwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5kZWxldGUoY3UsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgSjJFRU5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCXJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlqYXZhLnV0aWwuU2V0IGFmZmVjdGVkID0gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCQlpZiAoZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWFmZmVjdGVkLmFkZEFsbChnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRBZmZlY3RlZEZpbGVzKCkpOwotCQotCQlyZXR1cm4gYWZmZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGVuY29kZWQgaW4gdGhlIGdpdmVuIGVkaXRvcgotCSAqIGlucHV0LiBEb2VzIG5vdCBjb25uZWN0IHRoZSBlZGl0IG1vZGVsIHRvIHRoZSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdXb3JraW5nQ29weShjdSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1LCBib29sZWFuIGZvck5ld0NVKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRXb3JraW5nQ29weShjdSwgZm9yTmV3Q1UpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIG5ldyBjb21waWxhdGlvbiB1bml0cyBvbmx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLnNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndvcmtiZW5jaC5KMkVFRWRpdE1vZGVsI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWJvb2xlYW4gZGlydHlCb29sID0gc3VwZXIuaXNEaXJ0eSgpOwotCQlpZiAoIWRpcnR5Qm9vbCAmJiBnZXRXb3JraW5nQ29weU1hbmFnZXIoKSAhPSBudWxsKQotCQkJZGlydHlCb29sID0gZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuaGFzV29ya2luZ0NvcGllcygpOwotCQlyZXR1cm4gZGlydHlCb29sOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBmb3JjZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgUmVzb3VyY2VzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzYXZlQ29tcGlsYXRpb25Vbml0cyhtb25pdG9yKTsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCB8fCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlzdXBlci5wcmltU2F2ZShtb25pdG9yKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcnVuU2F2ZU9wZXJhdGlvbihJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFNhdmVGYWlsZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbnVsbCxJV29ya3NwYWNlLkFWT0lEX1VQREFURSxtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSA0OjE0OjI2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLlNldAotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKSB7Ci0JCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKSB7Ci0JCQkJYWNjZXNzKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCQkJLy9XZSBuZWVkIGEgYmV0dGVyIHdheSB0byBwYXNzIHRoaXMgdGhyb3VnaCB0aGUgc2F2ZSBvcHRpb25zIGluc3RlYWQuCi0JCQkJLy9XZSBhbHNvIG5lZWQgdG8gbWFrZSB0aGlzIGR5bmFtaWMgYmFzZWQgb24gdGhlIHByb2plY3QgdGFyZ2V0Ci0JCQkJKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCQl9IGVsc2UgaWYgKCFpc1JlYWRPbmx5KCkpCi0JCQkJYVJlc291cmNlLnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQkJYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgZWFjaCBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkKLQkJcmVtb3ZlUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGlzUmVmUmVzID0gYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlOwotCQkJaWYgKGlzUmVmUmVzKQotCQkJCXJlbGVhc2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQkJCWlmICghaXNEaXNwb3NpbmcoKSkKLQkJCQlyZXNldFdvcmtpbmdDb3B5TWFuYWdlcigpOwotCQkJfQotCQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndvcmtiZW5jaC5KMkVFRWRpdE1vZGVsI3Jlc291cmNlSXNMb2FkZWRDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSwKLQkgKiAgICAgIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWlmICghaXNSZXZlcnRpbmcgJiYgIWRpc3Bvc2luZyAmJiAhaXNSZWFkT25seSgpICYmIG9sZFZhbHVlICYmICFuZXdWYWx1ZSAmJiBhUmVzb3VyY2UgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UpCi0JCQlyZXNldFdvcmtpbmdDb3B5TWFuYWdlcigpOwotCQlzdXBlci5yZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZChhUmVzb3VyY2UsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmV2ZXJ0ZWQoUmVmZXJlbmNlZFJlc291cmNlIHJldmVydGVkUmVzb3VyY2UpIHsKLQkJaWYgKGdldFdvcmtpbmdDb3B5TWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5yZXZlcnQoKTsKLQkJcmV2ZXJ0QWxsUmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUNvbXBpbGF0aW9uVW5pdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLnNhdmVDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBXb3JraW5nQ29weU1hbmFnZXIgZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlpZiAod29ya2luZ0NvcHlNYW5hZ2VyID09IG51bGwpCi0JCQl3b3JraW5nQ29weU1hbmFnZXIgPSBXb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5Lm5ld1JlZ2lzdGVyZWRJbnN0YW5jZSgpOwotCQlyZXR1cm4gd29ya2luZ0NvcHlNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJlc2V0IHRoZSB3b3JraW5nIGNvcHkgbWFuYWdlciBiZWNhdXNlIHRoZSBlamItamFyLnhtbCB3YXMgcmVtb3ZlZCB3aXRob3V0IGRpc3Bvc2luZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFdvcmtpbmdDb3B5TWFuYWdlcigpIHsKLQkJaWYgKHdvcmtpbmdDb3B5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQl3b3JraW5nQ29weU1hbmFnZXIuZGlzcG9zZSgpOwotCQkJd29ya2luZ0NvcHlNYW5hZ2VyID0gbnVsbDsKLQkJfQotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MmIyYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEphdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFZGl0TW9kZWxGYWN0b3J5IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRURJVF9NT0RFTF9JRCA9ICJvcmcuZWNsaXBzZS5qc3QubW9kdWxlY29yZS5lZGl0TW9kZWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTU9EVUxFX1VSSSA9ICJNT0RVTEVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpIDogbnVsbCk7Ci0JCWlmKG1vZHVsZVVSSSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSBNb2R1bGUgVVJJIG11c3QgYmUgcHJvdmlkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmV0dXJuICBuZXcgSmF2YUFydGlmYWN0RWRpdE1vZGVsKGVkaXRNb2RlbElELCBjb250ZXh0LCB0cnVlLCBtb2R1bGVVUkkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5I2NyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpIDogbnVsbCk7Ci0JCWlmKG1vZHVsZVVSSSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSBNb2R1bGUgVVJJIG11c3QgYmUgcHJvdmlkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIG5ldyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIGNvbnRleHQsIGZhbHNlLGZhbHNlLCBtb2R1bGVVUkkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5I2dldENhY2hlSUQoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhY2hlSUQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zKSB7IAotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSlwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpOwotCQlpZihtb2R1bGVVUkkgIT0gbnVsbCkKLQkJCXJldHVybiBlZGl0TW9kZWxJRCsiOiIrbW9kdWxlVVJJLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVkaXRNb2RlbElEKyI6Tk9VUkkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUluc2VydGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFJbnNlcnRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhYjkwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUluc2VydGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLkRPTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIEphdmEgc25pcHBldCBzdXBwb3J0IHRvIGNhcHR1cmUgdGhlIGluc2VydGlvblN0cmluZyB0aGF0IGlzIHRvIGJlCi0gKiBpbnNlcnRlZCBhdCB0aGUgdXNlcnMgc2VsZWN0aW9uIHBvaW50LiBJdCBhbHNvIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRlZmluZSBhZGRpdGlvbmFsIGZpZWxkcwotICogYW5kIG1ldGhvZHMgdG8gc3VwcG9ydCB0aGUgaW5zZXJ0aW9uU3RyaW5nLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUluc2VydGlvbkhlbHBlciB7Ci0JcHJvdGVjdGVkIERPTUZhY3RvcnkgZG9tRmFjdG9yeSA9IG5ldyBET01GYWN0b3J5KCk7Ci0JcHJvdGVjdGVkIExpc3QgZmllbGRzOwotCXByb3RlY3RlZCBMaXN0IG1ldGhvZHM7Ci0JcHJvdGVjdGVkIExpc3QgaW1wb3J0czsKLQlwcm90ZWN0ZWQgU3RyaW5nIGluc2VydGlvblN0cmluZzsKLQlwcm90ZWN0ZWQgTGlzdCBleHRlbmRlZE9wZXJhdGlvbnM7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEphdmFJbnNlcnRpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpZWxkcygpIHsKLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnNlcnRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBpbnNlcnRpb25TdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZHMoKSB7Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IGJ5IHRoZSBjbGllbnQuIFRoaXMgaXMgdGhlIFN0cmluZyB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlCi0JICogdXNlcnMgc2VsZWN0aW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRpb25TdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQlpbnNlcnRpb25TdHJpbmcgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHV0aWxpdHkgbWV0aG9kIHRoYXQgd2lsbCBwYXJzZSB0aGUgbWV0aG9kU3RyaW5nIGFuZCBjcmVhdGUgYSBJRE9NTWV0aG9kLiBUaGUKLQkgKiBET01GYWN0b3J5IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1ldGhvZC4gVGhpcyBuZXcgbWV0aG9kIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YKLQkgKiBtZXRob2RzLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RTdHJpbmcKLQkgKiBAc2VlIERPTUZhY3RvcnkjY3JlYXRlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcpCi0JICogQGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWV0aG9kRnJvbVNvdXJjZVN0cmluZyhTdHJpbmcgbWV0aG9kU3RyaW5nKSB7Ci0JCWlmIChtZXRob2RTdHJpbmcgIT0gbnVsbCAmJiBtZXRob2RTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAobWV0aG9kcyA9PSBudWxsKQotCQkJCW1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQltZXRob2RzLmFkZChkb21GYWN0b3J5LmNyZWF0ZU1ldGhvZChtZXRob2RTdHJpbmcpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSB1dGlsaXR5IG1ldGhvZCB0aGF0IHdpbGwgcGFyc2UgdGhlIGZpZWxkU3RyaW5nIGFuZCBjcmVhdGUgYSBJRE9NRmllbGQuIFRoZQotCSAqIERPTUZhY3Rvcnkgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZmllbGQuIFRoaXMgbmV3IGZpZWxkIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YKLQkgKiBmaWVsZHMuCi0JICogCi0JICogQHBhcmFtIGZpZWxkU3RyaW5nCi0JICogQHNlZSBET01GYWN0b3J5I2NyZWF0ZUZpZWxkKGphdmEubGFuZy5TdHJpbmcpCi0JICogQGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NRmllbGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGaWVsZEZyb21Tb3VyY2VTdHJpbmcoU3RyaW5nIGZpZWxkU3RyaW5nKSB7Ci0JCWlmIChmaWVsZFN0cmluZyAhPSBudWxsICYmIGZpZWxkU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKGZpZWxkcyA9PSBudWxsKQotCQkJCWZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZpZWxkcy5hZGQoZG9tRmFjdG9yeS5jcmVhdGVGaWVsZChmaWVsZFN0cmluZykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIGltcG9ydCB0aGF0IGlzIGVpdGhlciB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgYSB0eXBlIG9yIGEgcGFja2FnZSBuYW1lIHdpdGggLiogYXQgdGhlCi0JICogZW5kLgotCSAqIAotCSAqIEBwYXJhbSBpbXBvcnRTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbXBvcnQoU3RyaW5nIGltcG9ydFN0cmluZykgewotCQlpZiAoaW1wb3J0U3RyaW5nICE9IG51bGwgJiYgaW1wb3J0U3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKGltcG9ydHMgPT0gbnVsbCkKLQkJCQlpbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW1wb3J0cy5hZGQoaW1wb3J0U3RyaW5nKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBpbnNlcnRpb25TdHJpbmcgaXMgc2V0IGFuZCBub3QgYSB6ZXJvIGxlbmd0aC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0VGV4dCgpIHsKLQkJcmV0dXJuIGluc2VydGlvblN0cmluZyAhPSBudWxsICYmIGluc2VydGlvblN0cmluZy5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZpZWxkcygpIHsKLQkJcmV0dXJuIGZpZWxkcyAhPSBudWxsICYmICFmaWVsZHMuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNNZXRob2RzKCkgewotCQlyZXR1cm4gbWV0aG9kcyAhPSBudWxsICYmICFtZXRob2RzLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbXBvcnRzKCkgewotCQlyZXR1cm4gaW1wb3J0cyAhPSBudWxsICYmICFpbXBvcnRzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltcG9ydHMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW1wb3J0U3RhdGVtZW50cygpIHsKLQkJcmV0dXJuIGltcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbmRlZE9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRPcGVyYXRpb25zKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRPcGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gYWRkIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB3aGljaCB3aWxsIGJlIHBlcmZvcm1lZCBhZnRlciB0aGlzCi0JICogSmF2YUluc2VydGlvbkhlbHBlciBpcyBwcm9jZXNzZWQgYnkgdGhlIEphdmFJbnNlcnRpb25PcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBsaW5rIEphdmFJbnNlcnRpb25PcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbmRlZE9wZXJhdGlvbihJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZXh0ZW5kZWRPcGVyYXRpb25zID09IG51bGwpCi0JCQkJZXh0ZW5kZWRPcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZXh0ZW5kZWRPcGVyYXRpb25zLmFkZChvcGVyYXRpb24pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0NjdkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSmF2YVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMgewotCi0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChPVVRQVVRfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChTT1VSQ0VfRk9MREVSUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENMQVNTUEFUSF9FTlRSSUVTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ1JFQVRFX1NPVVJDRV9GT0xERVJTKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCS8vIFRPRE8gcHVsbCB0aGVzZSBmcm9tIHRoZSBqYXZhIHByZWZlcmVuY2VzCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9VVFBVVF9MT0NBVElPTikpIHsKLQkJCXJldHVybiAiYmluIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVJTKSkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ1JFQVRFX1NPVVJDRV9GT0xERVJTKSkKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY5NWY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLlByb2plY3RDcmVhdGlvbk9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gewotCi0JcHVibGljIEphdmFQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJdHJ5IHsKLQkJCWNyZWF0ZUphdmFQcm9qZWN0KG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSmF2YVByb2plY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1QpOwotCQlXVFBQcm9qZWN0VXRpbGl0aWVzLmFkZE5hdHVyZVRvUHJvamVjdExhc3QocHJvamVjdCwgSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlqYXZhUHJvamVjdC5zZXRPdXRwdXRMb2NhdGlvbihnZXRPdXRwdXRQYXRoKHByb2plY3QpLCBtb25pdG9yKTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGdldENsYXNzcGF0aEVudHJpZXMocHJvamVjdCksIG1vbml0b3IpOwotCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKYXZhUHJvamVjdENyZWF0aW9uUHJvcGVydGllcy5DUkVBVEVfU09VUkNFX0ZPTERFUlMpKSB7Ci0JCQlTdHJpbmdbXSBzb3VyY2VGb2xkZXJzID0gKFN0cmluZ1tdKSBtb2RlbC5nZXRQcm9wZXJ0eShJSmF2YVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuU09VUkNFX0ZPTERFUlMpOwotCQkJSUZvbGRlciBmb2xkZXIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGb2xkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoc291cmNlRm9sZGVyc1tpXSk7Ci0JCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0T3V0cHV0UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBvdXRwdXRMb2NhdGlvbiA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKYXZhUHJvamVjdENyZWF0aW9uUHJvcGVydGllcy5PVVRQVVRfTE9DQVRJT04pOwotCQlyZXR1cm4gcHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChvdXRwdXRMb2NhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IChJQ2xhc3NwYXRoRW50cnlbXSkgbW9kZWwuZ2V0UHJvcGVydHkoSUphdmFQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLkNMQVNTUEFUSF9FTlRSSUVTKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gc291cmNlRW50cmllcyA9IG51bGw7Ci0JCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUphdmFQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLkNSRUFURV9TT1VSQ0VfRk9MREVSUykpCi0JCQlzb3VyY2VFbnRyaWVzID0gZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGNvbWJpbmVBcnJheXMoc291cmNlRW50cmllcywgZW50cmllcyk7Ci0JfQotCi0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBnZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nW10gc291cmNlRm9sZGVycyA9IChTdHJpbmdbXSkgbW9kZWwuZ2V0UHJvcGVydHkoSUphdmFQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVJTKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRm9sZGVycy5sZW5ndGg7IGkrKykgewotCQkJbGlzdC5hZGQoSmF2YUNvcmUubmV3U291cmNlRW50cnkocHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChzb3VyY2VGb2xkZXJzW2ldKSkpOwotCQl9Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJY2xhc3NwYXRoW2ldID0gKElDbGFzc3BhdGhFbnRyeSkgbGlzdC5nZXQoaSk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzcGF0aDsKLQl9Ci0KLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIGNvbWJpbmVBcnJheXMoSUNsYXNzcGF0aEVudHJ5W10gc291cmNlRW50cmllcywgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQlpZiAoc291cmNlRW50cmllcyAhPSBudWxsKSB7Ci0JCQlpZiAoZW50cmllcyA9PSBudWxsKQotCQkJCXJldHVybiBzb3VyY2VFbnRyaWVzOwotCQkJcmV0dXJuIGRvQ29tYmluZUFycmF5cyhzb3VyY2VFbnRyaWVzLCBlbnRyaWVzKTsKLQkJfSBlbHNlIGlmIChlbnRyaWVzICE9IG51bGwpCi0JCQlyZXR1cm4gZW50cmllczsKLQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JfQotCi0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBkb0NvbWJpbmVBcnJheXMoSUNsYXNzcGF0aEVudHJ5W10gc291cmNlRW50cmllcywgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQlJQ2xhc3NwYXRoRW50cnlbXSByZXN1bHQgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3NvdXJjZUVudHJpZXMubGVuZ3RoICsgZW50cmllcy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZUVudHJpZXMsIDAsIHJlc3VsdCwgMCwgc291cmNlRW50cmllcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIHJlc3VsdCwgc291cmNlRW50cmllcy5sZW5ndGgsIGVudHJpZXMubGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVlMTZhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGRhdGFNb2RlbCBpcyBhIGNvbW1vbiBzdXBlciBjbGFzcyB1c2VkIGZvciBjcmVhdGlvbiBvZiBXVFAgQ29tcG9uZW50cy4KLSAqIAotICogVGhpcyBjbGFzcyAoYW5kIGFsbCBpdHMgZmllbGRzIGFuZCBtZXRob2RzKSBpcyBsaWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgV1RQIDEuMCBtaWxlc3RvbmVzIGFzCi0gKiB0aGUgbmV3IHByb2plY3Qgc3RydWN0dXJlcyBhcmUgYWRvcHRlZC4gVXNlIGF0IHlvdXIgb3duIHJpc2suCi0gKiAKLSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKSB7Ci0JCQlldmVudC5nZXREYXRhTW9kZWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24obW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0YTg1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi1wdWJsaWMgIGNsYXNzIEphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBJSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFdUUF9NT0RVTEVfRklMRV9OQU1FID0gIi53dHBtb2R1bGVzIjsgLy8kTk9OLU5MUy0xJAotCQotICAgIHB1YmxpYyBKYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCi0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkKLQkJCi0JCWlmKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlpZiggcHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBwcm9qZWN0LmV4aXN0cygpKXsKLQkJCQlpZiggc2hvdWxkTWlncmF0ZShwcm9qZWN0KSl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiggIXByb2plY3QuaGFzTmF0dXJlKCBJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQgKSApewotCQkJCQkJCWFkZE1vZHVsZUNvcmVOYXR1cmUoIHByb2plY3QgKTsKLQkJCQkJCX0KLQkJCQkJCW1pZ3JhdGUoIHByb2plY3QgKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCBlICk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0gICAgfQotICAgICAgICByZXR1cm4gT0tfU1RBVFVTOwotICAgIH0KLQkJCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkTWlncmF0ZShJUHJvamVjdCBwcm9qZWN0KXsKLQkJdHJ5IHsKLQkJCWlmKCBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpICkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCBlICk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTW9kdWxlQ29yZU5hdHVyZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyggZSApOwotCQl9Ci0JCVN0cmluZ1tdIGN1cnJlbnROYXR1cmVJZHMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlSWRzID0gbmV3IFN0cmluZ1tjdXJyZW50TmF0dXJlSWRzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnROYXR1cmVJZHMsIDAsIG5ld05hdHVyZUlkcywgMCwgY3VycmVudE5hdHVyZUlkcy5sZW5ndGgpOwotCQluZXdOYXR1cmVJZHNbY3VycmVudE5hdHVyZUlkcy5sZW5ndGhdID0gSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlSWRzKTsKLQkJdHJ5IHsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCBlMSApOwotCQl9Ci0JfQkJCi0JCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gd3RwTW9kdWxlRmlsZUV4aXN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZShXVFBfTU9EVUxFX0ZJTEVfTkFNRSk7Ci0JCXJldHVybiBmaWxlLmV4aXN0cygpOwotCX0KLQotCQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbXBvbmVudChTdHJpbmcgYUNvbXBvbmVudE5hbWUsIElQcm9qZWN0IGFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KTsKLSAgICAgICAgY29tcG9uZW50LmNyZWF0ZSgwLCBudWxsKTsKLQotCQlJVmlydHVhbEZvbGRlciBjb21wUm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0vLwkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBSb290Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvL0lWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Rm9sZGVyKG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkICAKLQkKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKCBhUHJvamVjdCApOwotCQl0cnkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJZm9yKCBpbnQgaT0wOyBpPCBlbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJCQlpZiggZW50cmllc1tpXS5nZXRFbnRyeUtpbmQoKSA9PSAgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpewotCQkJCQlJUGF0aCBwYXRoID0gZW50cmllc1tpXS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJaWYoIHBhdGguaXNFbXB0eSgpICl7Ci0JCQkJCQlwYXRoID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCUlQYXRoIG91dCA9IGVudHJpZXNbaV0uZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCQkJLy9JVmlydHVhbEZvbGRlciBqYXZhU291cmNlRm9sZGVyID0gY29tcG9uZW50LmdldEZvbGRlciggb3V0ICk7Ci0JCQkJCUlWaXJ0dWFsRm9sZGVyIGphdmFTb3VyY2VGb2xkZXIgPSBjb21wUm9vdEZvbGRlci5nZXRGb2xkZXIoIG91dCApOwotCQkJCQlqYXZhU291cmNlRm9sZGVyLmNyZWF0ZUxpbmsoIHBhdGgsIDAsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCQlzZXR1cENvbXBvbmVudFR5cGUoYUNvbXBvbmVudE5hbWUsIGFQcm9qZWN0LCBJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRSk7Ci0gICAgfQotCQotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwQ29tcG9uZW50VHlwZShTdHJpbmcgYUNvbXBvbmVudE5hbWUsIElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgdHlwZUlEKSB7Ci0gICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KTsKLSAgICAgICAgQ29tcG9uZW50VHlwZSBjb21wb25lbnRUeXBlID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgY29tcG9uZW50VHlwZS5zZXRDb21wb25lbnRUeXBlSWQodHlwZUlEKTsKLSAgICAgICAgU3RydWN0dXJlRWRpdC5zZXRDb21wb25lbnRUeXBlKGNvbXBvbmVudCwgY29tcG9uZW50VHlwZSk7Ci0gICAgfQotCQotCXByb3RlY3RlZCBib29sZWFuIG1pZ3JhdGUoSVByb2plY3QgcHJvamVjdCkgewotLy8JCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdDsKLQkJaWYgKHd0cE1vZHVsZUZpbGVFeGlzdChwcm9qZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXRyeSB7Ci0JCQljcmVhdGVDb21wb25lbnQocHJvamVjdC5nZXROYW1lKCksIHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9CQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjJjMzkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyOwotCi0KLS8qKgotICogSmF2YSBQcm9qZWN0IHZhbGlkYXRpb24gCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIHsKLQkKLQlwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uVHlwZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0QmFzZVZhbGlkYXRpb25UeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRCYXNlVmFsaWRhdGlvblR5cGUoT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQotCQkJcmV0dXJuICgoSUphdmFQcm9qZWN0KXNlbGVjdGlvbikuZ2V0UHJvamVjdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyI2dldFZhbGlkYXRpb25UeXBlU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25UeXBlU3RyaW5nKCkgewotCQlyZXR1cm4gdmFsaWRhdGlvblR5cGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNzZXRWYWxpZGF0aW9uVHlwZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25UeXBlU3RyaW5nKFN0cmluZyB2YWxpZGF0aW9uVHlwZSkgewotCQl0aGlzLnZhbGlkYXRpb25UeXBlID0gdmFsaWRhdGlvblR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV1RQV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV1RQV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MmY0YTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dUUFdvcmtpbmdDb3B5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2F2ZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVySGVhZGxlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVyUmVnaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMjcvMjAwMSA0OjE0OjMwIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBXb3JraW5nQ29weU1hbmFnZXIgaW1wbGVtZW50cyBXb3JraW5nQ29weU1hbmFnZXIgewotCi0JLy9OZXcgQ1VzIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgdXBvbiBkaXNwb3NlCi0JcHJpdmF0ZSBMaXN0IG9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0czsKLQkvL05ldyBDVXMgdGhhdCB3ZXJlIGNyZWF0ZWQgdGhhdCBuZWVkIHNhdmVkIGltbWVkaWF0ZWx5IChhZnRlciBlYWNoIGdlbikKLQlwcml2YXRlIExpc3QgbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzOwotCS8vQSBjb21wbGV0ZSBsaXN0IG9mIG5ldyBDVXMgdGhhdCBpcyBvbmx5IGNsZWFyZWQgb24gc2F2ZSBhbmQgZGlzcG9zZQotCXByaXZhdGUgTGlzdCBuZXdDb21waWxhdGlvblVuaXRzOwotCXByaXZhdGUgSGFzaE1hcCBkZWxldGVkQ29tcGlsYXRpb25Vbml0czsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQotCS8qKgotCSAqIFdUUFdvcmtpbmdDb3B5TWFuYWdlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXVFBXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWdldE5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cygpLnJlbW92ZShjdSk7Ci0JCWlmICghZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkuY29udGFpbnMoY3UpICYmICFnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zS2V5KGN1KSkKLQkJCXByaW1BZGREZWxldGVkQ29tcGlsYXRpb25Vbml0KGN1KTsKLQkJZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkucmVtb3ZlKGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXdDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSkgewotCQlnZXROZXdDb21waWxhdGlvblVuaXRzKCkuYWRkKGN1KTsKLQkJZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCkuYWRkKHdvcmtpbmdDb3B5KTsKLQkJaWYgKCFnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zS2V5KGN1KSkKLQkJCWdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmFkZChjdSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSBuZXcgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IHdjLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJd2MuY29tbWl0V29ya2luZ0NvcHkoZmFsc2UsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGUpICYmIHNob3VsZFNhdmVSZWFkT25seSh3YykpCi0JCQkJCXdjLmNvbW1pdFdvcmtpbmdDb3B5KGZhbHNlLCBtb25pdG9yKTsKLQkJCQllbHNlCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXdjLmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGRlbGV0ZQotCSAqIAotCSAqIEBjdSBmcm9tIHRoZSB3b3JrYmVuY2ggYW5kIGZpeCB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlcyBmb3IgdGhpcyB3b3JraW5nIGNvcHkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQljdSA9IGN1LmdldFByaW1hcnkoKTsKLQkJYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChjdSk7Ci0JCXRyeSB7Ci0JCQljdS5kZWxldGUoZmFsc2UsIG1vbml0b3IpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpICE9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCkKLQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzY2FyZE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKGdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJTGlzdCBjdXMgPSBnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB3YyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzLnNpemUoKTsgaSsrKSB7Ci0JCQljdSA9IChJQ29tcGlsYXRpb25Vbml0KSBjdXMuZ2V0KGkpOwotCQkJaWYgKGN1LmlzV29ya2luZ0NvcHkoKSkgewotCQkJCXdjID0gY3U7Ci0JCQkJY3UgPSB3Yy5nZXRQcmltYXJ5KCk7Ci0JCQl9Ci0JCQlwcmltRGVsZXRlKGN1KTsKLQkJCWlmICh3YyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCXdjLmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQlwcmltRGlzcG9zZSgpOwotCQkJfQotCQl9OwotCQlydW5PcGVyYXRpb24ocnVubmFibGUsIG51bGwsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVydCgpIHsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJcHJpbVJldmVydCgpOwotCQkJfQotCQl9OwotCQlydW5PcGVyYXRpb24ocnVubmFibGUsIG51bGwsIHRydWUpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgNjo0MzozNyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNoTWFwCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChkZWxldGVkQ29tcGlsYXRpb25Vbml0cyA9PSBudWxsKQotCQkJZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZGVsZXRlZENvbXBpbGF0aW9uVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGVuY29kZWQgaW4gdGhlIGdpdmVuIGVkaXRvcgotCSAqIGlucHV0LiBEb2VzIG5vdCBjb25uZWN0IHRoZSBlZGl0IG1vZGVsIHRvIHRoZSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBnZXROZXdDb21waWxhdGlvblVuaXRXb3JraW5nQ29weShjdSk7Ci0JCWlmIChuZXdDVSAhPSBudWxsKQotCQkJcmV0dXJuIG5ld0NVOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzE5LzIwMDEgMTE6MDA6MTkgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXROZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChuZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgPT0gbnVsbCkKLQkJCW5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIG5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0czsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgMzo0OTowNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldE5ld0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChuZXdDb21waWxhdGlvblVuaXRzID09IG51bGwpCi0JCQluZXdDb21waWxhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gbmV3Q29tcGlsYXRpb25Vbml0czsKLQl9Ci0KLQkvKioKLQkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBjcmVhdGVkIHRoaXMgQ29tcGlsYXRpb25Vbml0IGFuZCBpdHMgd29ya2luZyBjb3B5LiBJZgotCSAqIHRoaXMgaXMgdGhlIGNhc2UsIHJldHVybiBvdXIgbmV3IHdvcmtpbmcgY29weSBhbmQgZG8gbm90IGNyZWF0ZSBhIG5ldyBvbmUuCi0JICovCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0TmV3Q29tcGlsYXRpb25Vbml0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoaGFzTmV3Q29tcGlsYXRpb25Vbml0KGN1KSkgewotCQkJTGlzdCBsaXN0ID0gZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGNvcHk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpIGxpc3QuZ2V0KGkpOwotCQkJCWlmIChjdS5lcXVhbHMoY29weS5nZXRQcmltYXJ5KCkpKQotCQkJCQlyZXR1cm4gY29weTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgMzo0OTowNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKG9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cyA9PSBudWxsKQotCQkJb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVBhY2thZ2VGcmFnbWVudCBmb3IgdGhlIGdpdmVuIElDb21waWxhdGlvblVuaXQuCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGN1ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUphdmFFbGVtZW50IHBhcmVudCA9IGN1OwotCQlpbnQgZWxlbWVudFR5cGUgPSBjdS5nZXRFbGVtZW50VHlwZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgZWxlbWVudFR5cGUgIT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQllbGVtZW50VHlwZSA9IHBhcmVudC5nZXRFbGVtZW50VHlwZSgpOwotCQkJZWxzZQotCQkJCWVsZW1lbnRUeXBlID0gLTE7Ci0JCX0KLQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIElTYXZlSGFuZGxlciBnZXRTYXZlSGFuZGxlcigpIHsKLQkJcmV0dXJuIFNhdmVIYW5kbGVyUmVnaXN0ZXIuZ2V0U2F2ZUhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjdSA9PSBudWxsIHx8IGN1LmlzV29ya2luZ0NvcHkoKSkKLQkJCXJldHVybiBjdTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBuZXdDVSA9IGdldE5ld0NvbXBpbGF0aW9uVW5pdFdvcmtpbmdDb3B5KGN1KTsKLQkJaWYgKG5ld0NVICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3Q1U7Ci0JCUlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSBjdS5nZXRXb3JraW5nQ29weShudWxsKTsKLQkJYWRkTmV3Q29tcGlsYXRpb25Vbml0KGN1LCB3b3JraW5nQ29weSk7Ci0JCXJldHVybiB3b3JraW5nQ29weTsKLQl9Ci0KLQkvKioKLQkgKiBIYXMgYSBuZXcgY29tcGlsYXRpb24gdW5pdCBhbHJlYWR5IGJlZW4gY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXdDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gZ2V0TmV3Q29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zKGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBTYXZlSGFuZGxlckhlYWRsZXNzLmlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJT2JqZWN0W10gaW5mbyA9IG5ldyBPYmplY3RbMl07Ci0JCWluZm9bMF0gPSBnZXRQYWNrYWdlRnJhZ21lbnQoY3UpOwotCQl0cnkgewotCQkJaW5mb1sxXSA9IGN1LmdldFNvdXJjZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJaW5mb1sxXSA9IG51bGw7Ci0JCX0KLQkJZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5wdXQoY3UsIGluZm8pOwotCX0KLQotCS8vIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGVsZXRlIGNhbGwuCi0JcHJvdGVjdGVkIHZvaWQgcHJpbURlbGV0ZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY3UuZXhpc3RzKCkpCi0JCQkJY3UuZGVsZXRlKHRydWUsIG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkvL1doYXQgdG8gZG8gaGVyZT8KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1EaXNwb3NlKCkgewotCQlkaXNjYXJkT3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCk7Ci0JCXJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXRzKCk7Ci0JCW5ld0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQluZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQlvcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQlkZWxldGVkQ29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJldmVydCgpIHsKLQkJZGlzY2FyZE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpOwotCQlyZXZpdmVEZWxldGVkQ29tcGlsYXRpb25Vbml0cygpOwotCQluZXdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBlbmNvZGVkIGluIHRoZSBnaXZlbiBlZGl0b3IKLQkgKiBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBwcmltR2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZUNvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzYXZlTmV3Q29tcGlsYXRpb25Vbml0cyhtb25pdG9yKTsKLQkJZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgbmV3IENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgY3VzID0gZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgd2M7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzLnNpemUoKTsgaSsrKSB7Ci0JCQl3YyA9IChJQ29tcGlsYXRpb25Vbml0KSBjdXMuZ2V0KGkpOwotCQkJY29tbWl0V29ya2luZ0NvcHkod2MsIG1vbml0b3IpOwotCQl9Ci0JCWN1cy5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5yZW1vdmUoY3UpICE9IG51bGwpIHsKLQkJCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsLCBuZXh0Q1UsIHRlc3RDVTsKLQkJCQlvcmlnaW5hbCA9IGN1LmdldFByaW1hcnkoKTsKLQkJCQlTZXQgY3VzID0gZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5rZXlTZXQoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGN1cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJbmV4dENVID0gKElDb21waWxhdGlvblVuaXQpIGl0Lm5leHQoKTsKLQkJCQkJdGVzdENVID0gbmV4dENVLmlzV29ya2luZ0NvcHkoKSA/IChJQ29tcGlsYXRpb25Vbml0KSBuZXh0Q1UuZ2V0UHJpbWFyeSgpIDogbmV4dENVOwotCQkJCQlpZiAodGVzdENVLmVxdWFscyhvcmlnaW5hbCkpIHsKLQkJCQkJCWN1cy5yZW1vdmUobmV4dENVKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgT2JqZWN0W10gaW5mbywgSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQlpZiAoaW5mb1swXSAhPSBudWxsICYmIGluZm9bMV0gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0gY3UuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IChJUGFja2FnZUZyYWdtZW50KSBpbmZvWzBdOwotCQkJU3RyaW5nIHNvdXJjZSA9IChTdHJpbmcpIGluZm9bMV07Ci0JCQl0cnkgewotCQkJCUlDb21waWxhdGlvblVuaXQgZXhpc3RpbmdDVSA9IHBhY2suZ2V0Q29tcGlsYXRpb25Vbml0KHR5cGVOYW1lKTsKLQkJCQlpZiAoZXhpc3RpbmdDVS5leGlzdHMoKSAmJiBnZXROZXdDb21waWxhdGlvblVuaXRzKCkuY29udGFpbnMoZXhpc3RpbmdDVSkpCi0JCQkJCWV4aXN0aW5nQ1UuZGVsZXRlKGZhbHNlLCBwbSk7Ci0JCQkJcGFjay5jcmVhdGVDb21waWxhdGlvblVuaXQodHlwZU5hbWUsIHNvdXJjZSwgZmFsc2UsIHBtKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkgewotCQlpZiAoZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUlQcm9ncmVzc01vbml0b3IgcG0gPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlJQ29tcGlsYXRpb25Vbml0IGN1OwotCQlPYmplY3RbXSBpbmZvOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWN1ID0gKElDb21waWxhdGlvblVuaXQpIGVudHJ5LmdldEtleSgpOwotCQkJaW5mbyA9IChPYmplY3RbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoY3UsIGluZm8sIHBtKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBhUnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiB2YWxpZGF0ZSkgewotCQlwcmltUnVuT3BlcmF0aW9uKGFSdW5uYWJsZSwgbW9uaXRvcik7Ci0KLQkJLy8gVE9ETyBCcmVhayB0aGUgdmFsaWRhdG9yIGRlcGVkZW5jeQotCQkvLwlpZiAodmFsaWRhdGUpCi0JCS8vCQlwcmltUnVuT3BlcmF0aW9uKGFSdW5uYWJsZSwgbW9uaXRvcik7Ci0JCS8vCWVsc2UgewotCQkvLwkJSVByb2plY3QgcHJvaiA9IGdldFZhbGlkYXRpb25Qcm9qZWN0KCk7Ci0JCS8vCQkJCi0JCS8vCQlWYWxpZGF0b3JNYW5hZ2VyIG1nciA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpOwotCQkvLwkJYm9vbGVhbiBkaXNhYmxlVmFsaWRhdG9ycyA9IHByb2ogIT0gbnVsbDsKLQkJLy8JCWJvb2xlYW4gd2FzU3VzcGVuZGVkID0gZmFsc2U7Ci0JCS8vCQlpZiAoZGlzYWJsZVZhbGlkYXRvcnMpIHsKLQkJLy8JCQl3YXNTdXNwZW5kZWQgPSBtZ3IuaXNTdXNwZW5kZWQocHJvaik7Ci0JCS8vCQkJaWYgKCF3YXNTdXNwZW5kZWQpCi0JCS8vCQkJCW1nci5zdXNwZW5kVmFsaWRhdGlvbihwcm9qLCB0cnVlKTsKLQkJLy8JCX0KLQkJLy8JCXRyeSB7Ci0JCS8vCQkJcHJpbVJ1bk9wZXJhdGlvbihhUnVubmFibGUsIG1vbml0b3IpOwotCQkvLwkJfSBmaW5hbGx5IHsKLQkJLy8JCQlpZiAoZGlzYWJsZVZhbGlkYXRvcnMgJiYgIXdhc1N1c3BlbmRlZCkKLQkJLy8JCQkJbWdyLnN1c3BlbmRWYWxpZGF0aW9uKHByb2osIGZhbHNlKTsKLQkJLy8JCX0KLQkJLy8JfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SdW5PcGVyYXRpb24oSVdvcmtzcGFjZVJ1bm5hYmxlIGFSdW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlpZiAoYVJ1bm5hYmxlICE9IG51bGwpIHsKLQkJCS8vaWYgKHdvcmtzcGFjZS5pc1RyZWVMb2NrZWQoKSkKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1RyYWNlKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNhbm5vdF9ydW5fSjJFRVVJV29ya2luZ0NvX0VSUk9SXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiQ2Fubm90IHJ1biBKMkVFVUlXb3JraW5nQ29weU1hbmFnZXIgb3BlcmF0aW9uIGJlY2F1c2UgdGhlIFdvcmtzcGFjZQotCQkJLy8gdHJlZSBpcyBsb2NrZWQuIgotCQkJLy9lbHNlIHsKLQkJCWlmICghV1RQQ29tbW9uUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihhUnVubmFibGUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFNhdmVIYW5kbGVyKCkuYWNjZXNzKCk7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJCXByaW1TYXZlQ29tcGlsYXRpb25Vbml0cyhhTW9uaXRvcik7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9wZXJhdGlvbihydW5uYWJsZSwgbW9uaXRvciwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgpIHsKLQkJCWdldFNhdmVIYW5kbGVyKCkuaGFuZGxlU2F2ZUZhaWxlZChleCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRTYXZlSGFuZGxlcigpLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVOZXdDb21waWxhdGlvblVuaXRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlwcmltU2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCQlnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKS5jbGVhcigpOwotCQlnZXROZXdDb21waWxhdGlvblVuaXRzKCkuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIG5ldyBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFNhdmVIYW5kbGVyKCkuYWNjZXNzKCk7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJCXByaW1TYXZlT25seU5ld0NvbXBpbGF0aW9uVW5pdHMoYU1vbml0b3IpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5PcGVyYXRpb24ocnVubmFibGUsIG1vbml0b3IsIGZhbHNlKTsKLQkJfSBjYXRjaCAoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5oYW5kbGVTYXZlRmFpbGVkKGV4LCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFNhdmVIYW5kbGVyKCkucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZVJlYWRPbmx5KElDb21waWxhdGlvblVuaXQgd2MpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIHdjLmdldFByaW1hcnkoKS5nZXRBZGFwdGVyKElSRVNPVVJDRV9DTEFTUyk7Ci0KLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFIHx8ICFyZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGdldFNhdmVIYW5kbGVyKCkuc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKChJRmlsZSkgcmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guSUoyRUVXb3JraW5nQ29weU1hbmFnZXIjaGFzV29ya2luZ0NvcGllcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzV29ya2luZ0NvcGllcygpIHsKLQkJcmV0dXJuIChkZWxldGVkQ29tcGlsYXRpb25Vbml0cyAhPSBudWxsICYmICFkZWxldGVkQ29tcGlsYXRpb25Vbml0cy5pc0VtcHR5KCkpIHx8IChuZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgIT0gbnVsbCAmJiAhbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzLmlzRW1wdHkoKSkgfHwgKG5ld0NvbXBpbGF0aW9uVW5pdHMgIT0gbnVsbCAmJiAhbmV3Q29tcGlsYXRpb25Vbml0cy5pc0VtcHR5KCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjY2M4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2luZ0NvcHlNYW5hZ2VyIGV4dGVuZHMgV29ya2luZ0NvcHlQcm92aWRlciB7Ci0KLQl2b2lkIGRpc3Bvc2UoKTsKLQotCWphdmEudXRpbC5TZXQgZ2V0QWZmZWN0ZWRGaWxlcygpOwotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0Jdm9pZCBzYXZlQ29tcGlsYXRpb25Vbml0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSBuZXcgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQl2b2lkIHNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogTWV0aG9kIGhhc1dvcmtpbmdDb3BpZXMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNXb3JraW5nQ29waWVzKCk7Ci0KLQkvKioKLQkgKiBSZXZlcnQgYWxsIHdvcmtpbmcgY29waWVzLgotCSAqLwotCXZvaWQgcmV2ZXJ0KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5OGY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5IHsKLQotCS8vCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3Mgd29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtpbmdDb3B5TWFuYWdlciBuZXdSZWdpc3RlcmVkSW5zdGFuY2UoKSB7Ci0JCXJldHVybiAoV29ya2luZ0NvcHlNYW5hZ2VyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCJ3b3JraW5nQ29weU1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vCXB1YmxpYyBzdGF0aWMgSVdvcmtpbmdDb3B5TWFuYWdlciBjcmVhdGVXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JLy8JCWlmIChnZXRXb3JraW5nQ29weU1hbmFnZXJDbGFzcygpICE9IG51bGwpCi0JLy8JCQl0cnkgewotCS8vCQkJCXJldHVybiAoSVdvcmtpbmdDb3B5TWFuYWdlcikgZ2V0V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MoKS5uZXdJbnN0YW5jZSgpOwotCS8vCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlMSkgewotCS8vCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgewotCS8vCQkJfQotCS8vCQlyZXR1cm4gbnVsbDsKLQkvLwl9Ci0JLy8JCi0JLy8JLyoqCi0JLy8JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCS8vCSAqIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgNzo1MzoxNSBBTSkKLQkvLwkgKiBAcmV0dXJuIGphdmEubGFuZy5DbGFzcwotCS8vCSAqLwotCS8vCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNsYXNzIGdldFdvcmtpbmdDb3B5TWFuYWdlckNsYXNzKCkgewotCS8vCQlyZXR1cm4gd29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3M7Ci0JLy8JfQotCS8vCQotCS8vCS8qKgotCS8vCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkvLwkgKiBDcmVhdGlvbiBkYXRlOiAoNC8yNi8yMDAxIDc6NTM6MTUgQU0pCi0JLy8JICogQHBhcmFtIG5ld1dvcmtpbmdDb3B5TWFuYWdlckNsYXNzIGphdmEubGFuZy5DbGFzcwotCS8vCSAqLwotCS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JraW5nQ29weU1hbmFnZXJDbGFzcyhqYXZhLmxhbmcuQ2xhc3MgbmV3V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MpIHsKLQkvLwkJd29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MgPSBuZXdXb3JraW5nQ29weU1hbmFnZXJDbGFzczsKLQkvLwl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5NmY1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLQotCi0vKioKLSAqIFRoZSB1c2VyIG9mIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdGlvbiBmcmFtZXdvcmsgbXVzdCBzdXBwbHkgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiBUaGUgZnJhbWV3b3JrIHdpbGwgb2J0YWluIGNvbXBpbGF0aW9uIHdvcmtpbmcgY29waWVzIGZyb20gdGhpcyBpbnRlcmZhY2UuIFRoZSBzdXBwbGllciBvZiB0aGUKLSAqIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjb21taXR0aW5nIHRoZSB3b3JraW5nIGNvcGllcyB3aGVuIGFwcHJvcHJpYXRlIGZvciB0aGUgdXNlcidzCi0gKiBlZGl0IG1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtpbmdDb3B5UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyB3aWxsIGRlbGV0ZSBjb21waWxhdGlvbiB1bml0IGZyb20gdGhlIHdvcmtiZW5jaCBhbmQgZml4IHRoZSBpbnRlcm5hbCByZWZlcmVuY2VzIGZvciB0aGlzCi0JICogd29ya2luZyBjb3B5IG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGN1Ci0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdCB0byBkZWxldGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIGZvciB0aGUgZGVsZXRlCi0JICovCi0Jdm9pZCBkZWxldGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4gVGhhdCBpcywgdGhlIG1hbmFnZXIgYWxyZWFkeQotCSAqIGhhcyBhIHdvcmtpbmcgY29weSBmb3IgdGhpcyB1bml0LCBpdCBkb2VzIG5vdCBjcmVhdGUgYSBuZXcgd29ya2luZyBjb3B5LiBEb2VzIG5vdCBjb25uZWN0IHRoZQotCSAqIGVkaXQgbW9kZWwgdG8gdGhlIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpdCB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCUlDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBvciBjcmVhdGVzIGEgbmV3IHdvcmtpbmcgY29weQotCSAqIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgcmV0dXJucyBpdC4gSWYgYSB3b3JraW5nIGNvcHkgaXMgcGFzc2VkIGluLCBpdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIHdvcmtpbmcgY29weSBjYW4gbm90IGJlIGNyZWF0ZWQKLQkgKi8KLQlJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI0OGFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmNsYXNzcGF0aC5DbGFzc3BhdGhIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldEluc3RhbGxEZWxlZ2F0ZSAKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc291cmNlIGFuZCB0aGUgb3V0cHV0IGRpcmVjdG9yaWVzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUGF0aCBwanBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgICBmaW5hbCBJUGF0aCBzcmNkaXIgPSBwanBhdGguYXBwZW5kKCAic3JjIiApOwotICAgICAgICAgICAgZmluYWwgSVBhdGggb3V0ZGlyID0gcGpwYXRoLmFwcGVuZCggImJ1aWxkL2NsYXNzZXMiICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdzLmdldFJvb3QoKS5nZXRGb2xkZXIoIHNyY2RpciApLmdldExvY2F0aW9uKCkudG9GaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICB3cy5nZXRSb290KCkuZ2V0Rm9sZGVyKCBvdXRkaXIgKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCApOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIGphdmEgbmF0dXJlLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBhZGQgdGhlIGJ1aWxkZXIuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGN1cnJlbnQgPSBkZXNjLmdldE5hdHVyZUlkcygpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gcmVwbGFjZW1lbnQgPSBuZXcgU3RyaW5nWyBjdXJyZW50Lmxlbmd0aCArIDEgXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGN1cnJlbnQsIDAsIHJlcGxhY2VtZW50LCAwLCBjdXJyZW50Lmxlbmd0aCApOwotICAgICAgICAgICAgcmVwbGFjZW1lbnRbIGN1cnJlbnQubGVuZ3RoIF0gPSBKYXZhQ29yZS5OQVRVUkVfSUQ7Ci0gICAgICAgICAgICBkZXNjLnNldE5hdHVyZUlkcyggcmVwbGFjZW1lbnQgKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oIGRlc2MsIG51bGwgKTsKLQotICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBzb3VyY2VwYXRoIGFuZCB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IHsgSmF2YUNvcmUubmV3U291cmNlRW50cnkoIHNyY2RpciApIH07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGpwcm9qLnNldFJhd0NsYXNzcGF0aCggY3AsIG91dGRpciwgbnVsbCApOwotICAgICAgICAgICAganByb2ouc2F2ZSggbnVsbCwgdHJ1ZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBTZXR1cCB0aGUgY2xhc3NwYXRoLiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ2xhc3NwYXRoSGVscGVyLnJlbW92ZUNsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHRoZSBubyBydW50aW1lIGNhc2UuCi0gICAgICAgICAgICAgICAgLy8gQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCA8c29tZXRoaW5nPiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGNvbXBpbGVyIGNvbWxpYW5jZSBsZXZlbCBmb3IgdGhlIHByb2plY3QuIElnbm9yZSB3aGV0aGVyCi0gICAgICAgICAgICAvLyB0aGlzIG1pZ2h0IGFscmVhZHkgYmUgc2V0IHNvIGF0IHRoZSB3b3Jrc3BhY2UgbGV2ZWwgaW4gY2FzZQotICAgICAgICAgICAgLy8gd29ya3NwYWNlIHNldHRpbmdzIGNoYW5nZSBsYXRlciBvciB0aGUgcHJvamVjdCBpcyBpbmNsdWRlZCBpbiBhCi0gICAgICAgICAgICAvLyBkaWZmZXJlbnQgd29ya3NwYWNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBKYXZhRmFjZXRVdGlscy5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBmdiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTI3NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuY2xhc3NwYXRoLkNsYXNzcGF0aEhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZSAKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogU3VwcG9ydCB0aGUgbm8gcnVudGltZSBjYXNlLgotICAgICAgICAgICAgICAgIC8vIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiwgPHNvbWV0aGluZz4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldFV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzODgwZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhRmFjZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0VXRpbHMKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzEzCi0gICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiamF2YSIgKS5nZXRWZXJzaW9uKCAiMS4zIiApOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfMTQKLSAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJqYXZhIiApLmdldFZlcnNpb24oICIxLjQiICk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzUwCi0gICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiamF2YSIgKS5nZXRWZXJzaW9uKCAiNS4wIiApOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzIAotICAgICAgICAgICAgPSBjb250ZXh0LmdldE5vZGUoIEphdmFDb3JlLlBMVUdJTl9JRCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGYgPT0gSkFWQV8xMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzMgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfQ09ERUdFTl9UQVJHRVRfUExBVEZPUk0sIEphdmFDb3JlLlZFUlNJT05fMV8xICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzMgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIsIEphdmFDb3JlLklHTk9SRSApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9FTlVNX0lERU5USUZJRVIsIEphdmFDb3JlLklHTk9SRSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGYgPT0gSkFWQV8xNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzQgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfQ09ERUdFTl9UQVJHRVRfUExBVEZPUk0sIEphdmFDb3JlLlZFUlNJT05fMV8yICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzMgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIsIEphdmFDb3JlLldBUk5JTkcgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfRU5VTV9JREVOVElGSUVSLCBKYXZhQ29yZS5XQVJOSU5HICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZiA9PSBKQVZBXzUwICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9BU1NFUlRfSURFTlRJRklFUiwgSmF2YUNvcmUuRVJST1IgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfRU5VTV9JREVOVElGSUVSLCBKYXZhQ29yZS5FUlJPUiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZzLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIHRoaXMuCi0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjY0Zjg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmNsYXNzcGF0aC5DbGFzc3BhdGhIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSAKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIHZlcnNpb24gdGhhdCdzIGN1cnJlbnRseSBpbnN0YWxsZWQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvagotICAgICAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIG9sZHZlcgotICAgICAgICAgICAgICAgID0gZnByb2ouZ2V0SW5zdGFsbGVkVmVyc2lvbiggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNsYXNzcGF0aC4gCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIENsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBvbGR2ZXIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IFN1cHBvcnQgdGhlIG5vIHJ1bnRpbWUgY2FzZS4KLSAgICAgICAgICAgICAgICAvLyBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYsIDxzb21ldGhpbmc+ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjb21waWxlciBsZXZlbC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgSmF2YUZhY2V0VXRpbHMuc2V0Q29tcGlsZXJMZXZlbCggcHJvamVjdCwgZnYgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L1d0cFV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L1d0cFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwM2Q2ZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9XdHBVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFd0cFV0aWxzIAotewotICAgIHByaXZhdGUgV3RwVXRpbHMoKSB7fQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXVFBfTkFUVVJFIAotICAgICAgICA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpFTV9OQVRVUkUKLSAgICAgICAgPSAib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlcyggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBjdXJyZW50ID0gZGVzYy5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcmVwbGFjZW1lbnQgPSBuZXcgU3RyaW5nWyBjdXJyZW50Lmxlbmd0aCArIDIgXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSggY3VycmVudCwgMCwgcmVwbGFjZW1lbnQsIDAsIGN1cnJlbnQubGVuZ3RoICk7Ci0gICAgICAgIHJlcGxhY2VtZW50WyBjdXJyZW50Lmxlbmd0aCBdID0gV1RQX05BVFVSRTsKLSAgICAgICAgcmVwbGFjZW1lbnRbIGN1cnJlbnQubGVuZ3RoICsgMSBdID0gSkVNX05BVFVSRTsKLSAgICAgICAgZGVzYy5zZXROYXR1cmVJZHMoIHJlcGxhY2VtZW50ICk7Ci0gICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oIGRlc2MsIG51bGwgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzkzM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2ZqMmVlLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYnNlcnZpY2VzLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbkFyY2hpdmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iajJlZS12YWxpZGF0aW9uLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImoyZWVDb3JlUGx1Z2luLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNiYzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXJ1bnRpbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0ZjQ1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxOTJlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBKMkVFIENvcmUgQ29tcG9uZW50Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjcuMAotQnVuZGxlLUNsYXNzUGF0aDogcnVudGltZS9tb2ZqMmVlLmphciwKLSBydW50aW1lL2NvbW1vbkFyY2hpdmUuamFyLAotIHJ1bnRpbWUvajJlZS12YWxpZGF0aW9uLmphciwKLSBydW50aW1lL2oyZWVDb3JlUGx1Z2luLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3ksCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuYXBwbGljYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jbGllbnQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb25uZWN0b3IsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJhcHBsaWNhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcAotUmVxdWlyZS1CdW5kbGU6ICBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDY5NGRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBydW50aW1lL2NvbW1vbkFyY2hpdmUuamFyLFwKLSAgICAgICAgICAgICAgIHJ1bnRpbWUvajJlZUNvcmVQbHVnaW4uamFyLFwKLSAgICAgICAgICAgICAgIHJ1bnRpbWUvbW9majJlZS5qYXIsXAotICAgICAgICAgICAgICAgcnVudGltZS9qMmVlLXZhbGlkYXRpb24uamFyLFwKLSAgICAgICAgICAgICAgIGNoYW5nZXMubG9nLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSByb3NlLyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIG1vZGVsLwotc291cmNlLnJ1bnRpbWUvajJlZS12YWxpZGF0aW9uLmphciA9IGoyZWUtdmFsaWRhdGlvbi8KLW91dHB1dC5ydW50aW1lL21vZmoyZWUuamFyID0gYmluLwotc291cmNlLnJ1bnRpbWUvbW9majJlZS5qYXIgPSBtb2ZqMmVlLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYnNlcnZpY2VzLwotb3V0cHV0LnJ1bnRpbWUvajJlZUNvcmVQbHVnaW4uamFyID0gYmluLwotb3V0cHV0LnJ1bnRpbWUvajJlZS12YWxpZGF0aW9uLmphciA9IGJpbi8KLXNvdXJjZS5ydW50aW1lL2NvbW1vbkFyY2hpdmUuamFyID0gY29tbW9uQXJjaGl2ZS8KLWphcnMuY29tcGlsZS5vcmRlciA9IHJ1bnRpbWUvbW9majJlZS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgcnVudGltZS9jb21tb25BcmNoaXZlLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBydW50aW1lL2oyZWVDb3JlUGx1Z2luLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBydW50aW1lL2oyZWUtdmFsaWRhdGlvbi5qYXIKLXNvdXJjZS5ydW50aW1lL2oyZWVDb3JlUGx1Z2luLmphciA9IGoyZWVDb3JlUGx1Z2luLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvY29tbW9uYXJjaGl2ZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvY29tbW9uYXJjaGl2ZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzdkZjU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL2NvbW1vbmFyY2hpdmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN1YmNsYXNzX3Jlc3BvbnNpYmlsdHlfRVhDXz1JV0FFMDAwMUUgezB9IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MKLWtleV9jbGFzc19yZWZsZWN0aW9uX0VSUk9SXz1JV0FFMDAwMkUgVW5hYmxlIHRvIHJlZmxlY3QgdGhlIGNsYXNzICJ7MH0iIGluIG9yZGVyIHRvIGNvbXBhcmUgdGhlIHByaW1hcnkga2V5IGZpZWxkICJ7MX0iIGZyb20gZW50aXR5ICJ7Mn0iCi1rZXlfZmllbGRfcmVmbGVjdGlvbl9FUlJPUl89SVdBRTAwMDNFIFVuYWJsZSB0byByZWZsZWN0IHRoZSB0eXBlIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCAiezB9IiBmcm9tIGVudGl0eSAiezF9IgotcmVtb3Zpbmdfa2V5X2ZpZWxkX0lORk9fPUlXQUUwMDA0SSBSZW1vdmluZyBpbnZhbGlkIHByaW0ta2V5LWZpZWxkICJ7MH0iIGZyb20gZW50aXR5ICJ7MX0iCi1yZXBhaXJfdXNhZ2VfRVJST1JfPUlXQUUwMDA1RSBSZXBhaXJBcmNoaXZlQ29tbWFuZCB1c2FnZTogY2Fubm90IHdyaXRlIHRvIGRlc3RpbmF0aW9uUGF0aDogezB9Ci1pbnZhbGlkX2FyY2hpdmVfRVhDXz1JV0FFMDAwNkUgQXJjaGl2ZSBpcyBub3QgYSB2YWxpZCB7MH0gYmVjYXVzZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNhbiBub3QgYmUgZm91bmQgKGNhc2Ugc2Vuc2l0aXZlKTogezF9Ci1sb2FkX3Jlc291cmNlX0VYQ189SVdBRTAwMDdFIENvdWxkIG5vdCBsb2FkIHJlc291cmNlICJ7MH0iIGluIGFyY2hpdmUgInsxfSIKLW5lc3RlZF9qYXJfRVhDXz1JV0FFMDAwOEUgQW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyB7MH0gZnJvbSB7MX0KLW1ha2VfdGVtcF9kaXJfRVhDXz1JV0FFMDAwOUUgVW5hYmxlIHRvIG1ha2UgdGVtcCBkaXJlY3Rvcnk6IHswfQotaW52YWxpZF9jbGFzc3BhdGhfV0FSTl89SVdBRTAwMTBXIENsYXNzcGF0aCBlbGVtZW50ICJ7MH0iIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIFppcCBmaWxlCi1pbnZhbGlkX2NwX2ZpbGVfV0FSTl89SVdBRTAwMTFXIENsYXNzcGF0aCBlbGVtZW50ICJ7MH0iIGRvZXMgbm90IHBvaW50IHRvIGEgbG9jYWwgZmlsZQotaW9fZXhfbG9hZGluZ19FWENfPUlXQUUwMDEyRSBBbiBJTyBleGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyB7MH0KLXR4X2JlYW5fbWdkX1dBUk5fPUlXQUUwMDEzVyBFSkIgMS4wIEltcG9ydDogTm90IG1hcHBpbmcgVFhfQkVBTl9NQU5BR0VEIGNvbnRyb2wgZGVzY3JpcHRvciBmb3IgezB9Ci1lcnJvcl9zYXZpbmdfRVhDXz1JV0FFMDAxNEUgRXJyb3Igc2F2aW5nIHswfQotaW9fZXhfbWFuaWZlc3RfRVhDXz1JV0FFMDAxNUUgQW4gSU9FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB0aGUgbWFuaWZlc3QgaW4gYXJjaGl2ZTogezB9Ci1pb19leF9yZW9wZW5fRVhDXz1JV0FFMDAxNkUgSU9FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcmVvcGVuaW5nIHswfQotdW5hYmxlX3JlcGxhY2VfRVhDXz1JV0FFMDAxN0UgVW5hYmxlIHRvIHJlcGxhY2Ugb3JpZ2luYWwgYXJjaGl2ZTogezB9Ci1kdXBsaWNhdGVfZmlsZV9FWENfPUlXQUUwMDE4RSBUaGUgYXJjaGl2ZSBuYW1lZCB7MH0gYWxyZWFkeSBjb250YWlucyBhIGZpbGUgbmFtZWQgezF9Ci1kdXBsaWNhdGVfZW50cnlfRVhDXz1JV0FFMDAxOUUgQSBmaWxlIG9yIHJlc291cmNlIHdpdGggdXJpIHswfSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZSBuYW1lZCB7MX0KLWZpbGVfZXhpc3RfYXNfZGlyX0VYQ189SVdBRTAwMjBFIEEgZmlsZSBuYW1lZCB7MH0gZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeQotdW5jb250YWluZWRfbW9kdWxlX0VYQ189SVdBRTAwMjFFIE1vZHVsZSB7MH0gaXMgbm90IGNvbnRhaW5lZCBieSBhbiBFQVIgZmlsZQotZGRfaW5fZWFyX2xvYWRfRVhDXz1JV0FFMDAyMkUgRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gRUFSIGZpbGUgInsxfSIKLW5lc3RlZF9vcGVuX2ZhaWxfRVhDXz1JV0FFMDAyM0UgVW5hYmxlIHRvIG9wZW4gbW9kdWxlIGZpbGUgInswfSIgaW4gRUFSIGZpbGUgInsxfSIKLWR1cGxpY2F0ZV9tb2R1bGVfRVhDXz1JV0FFMDAyNEUgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIEVBUiBmaWxlICJ7MH0iIGFscmVhZHkgY29udGFpbnMgYSBtb2R1bGUgaGF2aW5nIHVyaSAiezF9Igotbm9fc2VjX3JvbGVfRVhDXz1JV0FFMDAyNUUgezB9OiBFQVIgRmlsZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgezF9Ci1kdXBfc2VjX3JvbGVfRVhDXz1JV0FFMDAyNkUgezB9OiBFQVIgRmlsZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxyZWFkeSBjb250YWlucyBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgezF9Ci1kdXBfc2VjX3JvbGVfbW9kdWxlX0VYQ189SVdBRTAwMjdFIERlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgezB9IGFscmVhZHkgY29udGFpbnMgYSBzZWN1cml0eSByb2xlIG5hbWVkIHsxfQotZHVwX3Jlc291cmNlX0VYQ189SVdBRTAwMjhFIFJlc291cmNlIG5hbWVkICJ7MH0iIGFscmVhZHkgZXhpc3RzIGluIGFyY2hpdmUgInsxfSIKLWVycm9yX3NhdmluZ19FWENfPUlXQUUwMDMwRSBFcnJvciBzYXZpbmcgezB9Ci1hZGRfY29weV9jbGFzc19kaXJfRVhDXz1JV0FFMDAzMUUgVGhlIG1ldGhvZCAiYWRkQ29weUNsYXNzIiBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3Rvcmllcy4gVVJJOiB7MH0KLWFkZF9jb3B5X2xpYl9kaXJfRVhDXz1JV0FFMDAzMkUgVGhlIG1ldGhvZCAiYWRkQ29weUxpYiIgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3JpZXMuIFVSSTogezB9Ci1saXN0X2NvbXBvbmVudHNfd2FyX0VYQ189SVdBRTAwMzNFIEV4Y2VwdGlvbiBvY2N1cnJlZCBsaXN0aW5nIGNvbXBvbmVudHMgaW4gV0FSIGZpbGU6IHswfQotb3Blbl9uZXN0ZWRfRVhDXz1JV0FFMDAzNEUgQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iCi1tYWtlX3RlbXBfZmlsZV9XQVJOXz1JV0FFMDAzNVcgV2FybmluZzogVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wIGZpbGUgZm9yIHswfS4gIFRoaXMgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2UuCi1maWxlX25vdF9mb3VuZF9FWENfPUlXQUUwMDM2RSBVUkkgTmFtZTogezB9OyBGaWxlIG5hbWU6IHsxfQotY291bGRfbm90X29wZW5fRVhDXz1JV0FFMDAzN0UgQ291bGQgbm90IG9wZW4gezB9Ci1jb3VsZF9ub3RfZmluZF9kaXJfRVhDXz1JV0FFMDAzOEUgVW5hYmxlIHRvIG9wZW4gZGlyZWN0b3J5IHswfQotbm90X2FfZGlyX0VYQ189SVdBRTAwMzlFIFVuYWJsZSB0byBvcGVuIGRpcmVjdG9yeSBiZWNhdXNlIGZpbGUgaXMgbm90IGEgZGlyZWN0b3J5OiB7MH0KLWluZmVycmVkX2Rkc19FWENfPUlXQUUwMDQwRSBUaGUgRUpCIEpBUiBmaWxlICJ7MH0iIHdhcyBpbmZlcnJlZCB0byBiZSBvZiB2ZXJzaW9uIDEuMCBiZWNhdXNlIHRoZSBtYW5pZmVzdCBkb2VzIG5vdCBkZWNsYXJlIGVudGVycHJpc2UgYmVhbnMgYnV0IHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBleGlzdCBpbiB0aGUgSkFSLgotZmlsZW5hbWVfZXhjZXB0aW9uX0VYQ189SVdBRTAwNDFFIEZpbGVuYW1lOiB7MH07IEV4Y2VwdGlvbjogezF9Ci1ub19kZHNfMTBfRVhDXz1JV0FFMDA0MkUgTm8gZGVwbG95bWVudCBkZXNjcmlwdG9ycyBpbiBFSkIgMS4wIEpBUiBmaWxlOiB7MH0KLW1hbmlmZXN0X2RkX2xvYWRfRVhDXz1JV0FFMDA0M0UgVGhlIEpBUiBtYW5pZmVzdCBkZWNsYXJlcyBhbiBlbnRlcnByaXNlIGJlYW4gZm9yIHdoaWNoIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBjYW4gbm90IGJlIGxvYWRlZDogezB9Ci1tYW5pZmVzdF9kZF9maW5kX0VYQ189SVdBRTAwNDRFIFRoZSBKQVIgbWFuaWZlc3QgZGVjbGFyZXMgYW4gZW50ZXJwcmlzZSBiZWFuIGZvciB3aGljaCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgY2FuIG5vdCBiZSBmb3VuZDogezB9Ci1pb19leF9yZWFkaW5nX2RkX0VYQ189SVdBRTAwNDVFIElPIEV4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHswfQotc2VyX25vdF9kZF9FWENfPUlXQUUwMDQ2RSBUaGUgc2VyaWFsaXplZCBvYmplY3QgaW4gZmlsZSAiezB9IiBpcyBub3QgYSBhbiBpbnN0YW5jZSBvZiBqYXZheC5lamIuZGVwbG95bWVudC5EZXBsb3ltZW50RGVzY3JpcHRvcgotcmVhZGluZ19kZF9FWENfPUlXQUUwMDQ3RSBFeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB7MH0KLW1pc3NpbmdfY2xhc3NfRVhDXz1JV0FFMDA0OEUgQ291bGQgbm90IGRlc2VyaWFsaXplIHswfSBiZWNhdXNlIGEgcmVxdWlyZWQgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kLiAgRXhjZXB0aW9uOiB7MX0KLUNvbnZlcnRlZD1Db252ZXJ0ZWQKLVN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VYQ189SVdBRTAwNDlFIFN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Ci1JT0V4Y2VwdGlvbl9vY2N1cnJlZF93aGlsZV9FWENfPUlXQUUwMDUwRSBJT0V4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjb3B5aW5nIG1hbmlmZXN0Ci1FeHRyYWN0X2Rlc3RpbmF0aW9uX2lzX3RoZV9FWENfPUlXQUUwMDUxRSBFeHRyYWN0IGRlc3RpbmF0aW9uIGlzIHRoZSBzYW1lIHBhdGggYXMgc291cmNlIGZpbGUKLVBhcmFtZXRlcl9zaG91bGRfbm90X2JlX251X0VYQ189SVdBRTAwNTJFIFBhcmFtZXRlciBzaG91bGQgbm90IGJlIG51bGwKLUFyY2hpdmVfaXNfbm90X2FfdmFsaWRfRUpCX0VYQ189SVdBRTAwNTVFIEFyY2hpdmUgaXMgbm90IGEgdmFsaWQgRUpCIEpBUiBmaWxlICgxLjApIGJlY2F1c2Ugbm8gc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGNhbiBiZSBmb3VuZCwgZWl0aGVyIGluIHRoZSBtYW5pZmVzdCBvciBpbiBlbnRyaWVzIHdpdGggYSAiLnNlciIgZXh0ZW5zaW9uCi1fVGhlX2ZvbGxvd2luZ19maWxlc19jb3VsZF9FWENfPUlXQUUwMDU2RSBUaGUgZm9sbG93aW5nIGZpbGVzIGNvdWxkIG5vdCBiZSBsb2FkZWQ6Ci1GaXhQcmltS2V5Q29tbWFuZF9mYWlsZWRfLV9FWENfPUlXQUUwMDU3RSBGaXhQcmltS2V5Q29tbWFuZCBmYWlsZWQgLSBleGNlcHRpb24gc3RhY2sgdHJhY2U6Ci1GaXhQcmltS2V5Q29tbWFuZF91c2FnZV9fXz1GaXhQcmltS2V5Q29tbWFuZCB1c2FnZTogIDxzb3VyY2VKYXJGaWxlUGF0aD4gW2Rlc3RpbmF0aW9uUGF0aF0KLUZpeFByaW1LZXlDb21tYW5kX3VzYWdlX19zX0VYQ189SVdBRTAwNThFIEZpeFByaW1LZXlDb21tYW5kIHVzYWdlOiBzb3VyY2VKYXJGaWxlUGF0aCBtdXN0IHBvaW50IHRvIGEgdmFsaWQgRUpCIEpBUiBmaWxlIG9yIGRpcmVjdG9yeSBvZiBhbiBpbmZsYXRlZCBFSkIgSkFSIGZpbGUKLVJlcGFpcl9jb21tYW5kX2ZhaWxlZF8tX2V4X0VYQ189SVdBRTAwNTlFIFJlcGFpciBjb21tYW5kIGZhaWxlZCAtIGV4Y2VwdGlvbiBzdGFjayB0cmFjZToKLVJlcGFpcnNfYWxsX2VudHJpZXNfaW5fdGhlPVJlcGFpcnMgYWxsIGVudHJpZXMgaW4gdGhlIE1FVEEtSU5GIGFuZC9vciBXRUItSU5GIGRpcmVjdG9yaWVzIHRvIGJlIHRoZSBjb3JyZWN0IGNhc2UKLVJlcGFpckFyY2hpdmVDb21tYW5kX3VzYWdlPVJlcGFpckFyY2hpdmVDb21tYW5kIHVzYWdlOiAgPHNvdXJjZUphckZpbGVQYXRoPiA8ZGVzdGluYXRpb25QYXRoPgotUmVwYWlyQXJjaGl2ZUNvbW1hbmRfdXNhZ2UxX0VSUk9SXz1JV0FFMDA2MEUgUmVwYWlyQXJjaGl2ZUNvbW1hbmQgdXNhZ2U6IHNvdXJjZUphckZpbGVQYXRoIG11c3QgcG9pbnQgdG8gYSB2YWxpZCBhcmNoaXZlIG9yIGRpcmVjdG9yeSBvZiBhbiBpbmZsYXRlZCBhcmNoaXZlCi1BcHBsaWNhdGlvbl9DbGllbnRfSmFyX0ZpbD1BcHBsaWNhdGlvbiBDbGllbnQgSkFSIEZpbGUKLUVBUl9GaWxlPUVBUiBGaWxlCi1FSkJfSmFyX0ZpbGU9RUpCIEpBUiBGaWxlCi1SQVJfRmlsZT1SQVIgRmlsZQotV0FSX0ZpbGU9V0FSIEZpbGUKLUVycm9yX29jY3VycmVkX2l0ZXJhdGluZ19mX0VYQ189SVdBRTAwNjFFIEVycm9yIG9jY3VycmVkIGl0ZXJhdGluZyBmaWxlcwotRW5kX29mX2xpc3RfcmVhY2hlZF9FWENfPUlXQUUwMDYyRSBSZWFjaGVkIGVuZCBvZiBsaXN0Ci1JbnRlcm5hbF9FcnJvcl9fSXRlcmF0b3Jfb19FWENfPUlXQUUwMDYzRSBJbnRlcm5hbCBFcnJvcjogSXRlcmF0b3Igb3V0IG9mIHN5bmMgd2l0aCB6aXAgZW50cmllcwotRXJyb3JfaXRlcmF0aW5nX3RoZV9hcmNoaXZfRVhDXz1JV0FFMDA2NEUgRXJyb3IgaXRlcmF0aW5nIHRoZSBhcmNoaXZlCi1BYnNvbHV0ZV9wYXRoX3Vua25vd25fRVhDXz1JV0FFMDA2NUUgQWJzb2x1dGUgcGF0aCB1bmtub3duCi1PcmlnaW5hbF9hcmNoaXZlX2lzX25vdF9hX19FWENfPUlXQUUwMDY2RSBPcmlnaW5hbCBhcmNoaXZlIGlzIG5vdCBhIGRpcmVjdG9yeQotTnVsbF91cmlfRVhDXz1JV0FFMDA2N0UgTnVsbCB1cmkKLU1vZHVsZV9maWxlPU1vZHVsZSBmaWxlCi1BX1dBUl9maWxlPVdBUiBmaWxlCi1Bbl9FSkJfSkFSX2ZpbGU9RUpCIEpBUiBmaWxlCi1Bbl9BcHBsaWNhdGlvbl9DbGllbnRfSkFSX2ZpbGU9QXBwbGljYXRpb24gQ2xpZW50IEpBUiBmaWxlCi1BX1JBUl9maWxlPVJBUiBmaWxlCi1BX0FwcGxpY2F0aW9uX2ZpbGU9QXBwbGljYXRpb24gZmlsZQotQV9maWxlX2RvZXNfbm90X2V4aXN0X2Zvcl9tb2R1bGU9QSBmaWxlIGRvZXMgbm90IGV4aXN0IGZvciBtb2R1bGUgZWxlbWVudCBoYXZpbmcgdXJpOiB7MH0KLUZpbGVfbm90X2NvcnJlY3RfdHlwZT1UaGUgZmlsZSB7MH0gaW4gRUFSIGZpbGUgezF9IGlzIG5vdCB0aGUgY29ycmVjdCB0eXBlIGJhc2VkIG9uIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBFeHBlY3RlZCB0eXBlOiB7Mn0iOwotTW9kdWxlX25vdF9pbl9FQVI9TW9kdWxlIGlzIG5vdCBpbiBhbiBFQVI6IHswfQotTW9kdWxlX2ZpbGVfZG9lc19ub3RfZXhpc3RfMj1Nb2R1bGUgZmlsZSBkb2VzIG5vdCBleGlzdCBmb3IgTW9kdWxlIHJlZi4gIE1vZHVsZSA9IHswfQotRmlsZUltcGwuX0Vycm9yXzA9UmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXBwbGljYXRpb25DbGllbnRGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcHBsaWNhdGlvbkNsaWVudEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiODQ5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcHBsaWNhdGlvbkNsaWVudEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkNsaWVudEZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlIHsKLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb25DbGllbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9BcmNoaXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTFkNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXJjaGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVvcGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcmNoaXZlIGV4dGVuZHMgQ29udGFpbmVyewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX05PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9XQVJfRklMRVMgPSAxIDw8IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0VBUl9GSUxFUyA9IDEgPDwgMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfRUpCSkFSX0ZJTEVTID0gMSA8PCAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9BUFBDTElFTlRfRklMRVMgPSAxIDw8IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0FSQ0hJVkVTID0gMSA8PCA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9SQVJfRklMRVMgPSAxIDw8IDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0FMTCA9ICgxIDw8IDEpIHwgKDEgPDwgMikgfCAoMSA8PCAzKSB8ICgxIDw8IDQpIHwgKDEgPDwgNSkgfCAoMSA8PCA2KTsKLQotCXB1YmxpYyBBcmNoaXZlIGFkZENvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JcHVibGljIEZpbGUgYWRkQ29weShGaWxlIGFGaWxlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldCBhIGZsYXR0ZW5lZCBsaXN0IGZyb20gdGhlIGRpcmVjdG9yeSwgdGhlbiBhZGRDb3B5IHRoZSBsaXN0Ci0JICogCi0JICogQHRocm93cyBjb20uaWJtLmV0b29scy5hcmNoaXZlLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIGZpbGUgd2l0aCBhIHVyaSB0aGF0IGVxdWFscyBvbmUgb2YgdGhlIG5lc3RlZCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGV4aXN0cwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QgdGhlIGNvcGllZCBmaWxlcyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgTGlzdCBhZGRDb3B5KFJlYWRPbmx5RGlyZWN0b3J5IGRpcikgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlwdWJsaWMgTGlzdCBhZGRDb3B5RmlsZXMoTGlzdCBsaXN0T2ZGaWxlcykgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRPclJlcGxhY2VNb2ZSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCl9Ci0JICogCi0JICogSWYgYW55IG9wZW5lZCBhcmNoaXZlIGNvbnRhaW5zIGZpbGVzIHRoYXQgaGF2ZSB0aGlzIGFyY2hpdmUgYXMgaXRzIGxvYWRpbmcgY29udGFpbmVyLCByZXR1cm4KLQkgKiBmYWxzZTsgb3RoZXJ3aXNlIHJldHVybiB0cnVlLiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOiBvcGVuIGphciBBLiBjcmVhdGUKLQkgKiBqYXIgQi4gQ29weSBmaWxlcyBmcm9tIEEgdG8gQi4gQXR0ZW1wdCB0byBjbG9zZSBqYXIgQSBiZWZvcmUgc2F2aW5nIGphciBCLiBUaGVuIGF0dGVtcHQgdG8KLQkgKiBzYXZlIEIsIGFuZCB0aGUgc2F2ZSBmYWlscyBiZWNhdXNlIEEgaXMgY2xvc2VkLiBUaGlzIG1ldGhvZCBhbGxvd3MgY2xpZW50IGNvZGUgdG8gdGVzdCBmb3IKLQkgKiBkZXBlbmRlbnQgb3BlbiBhcmNoaXZlcyBiZWZvcmUgc2F2aW5nIHRoZSBzb3VyY2UgYXJjaGl2ZS4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSwgdGhlCi0JICogc29sdXRpb24gaXMgdG8gZWl0aGVyIGNsb3NlIG9yIHNhdmUgQiBiZWZvcmUgY2xvc2luZyBBLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNsb3NlKCk7Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGxvYWQgc3RyYXRlZ3kgZm9yIHRoaXMgYXJjaGl2ZSBhbmQgY2xvc2VzIGFsbCBjb250YWluZWQgYXJjaGl2ZXM7IFdBUk5JTkc6IElmCi0JICogZmlsZXMgaGF2ZSBiZWVuIGNvcGllZCBmcm9tIHRoaXMgYXJjaGl2ZSB0byBhbm90aGVyIGFyY2hpdmUsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGFyY2hpdmUKLQkgKiBzaG91bGQgYmUgc2F2ZWQgb3IgY2xvc2VkIGJlZm9yZSB0aGlzIGFyY2hpdmUgY2FuIGJlIHNhZmVseSBjbG9zZWQ7IHRvIHRlc3QgaWYgdGhpcyBhcmNoaXZlCi0JICogY2FuIHNhZmVseSBjbG9zZSBpbnZva2Uge0BsaW5rICNjYW5DbG9zZSgpfQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCk7Ci0KLQkvKioKLQkgKiBTYXZlIHRoaXMgYXJjaGl2ZSBhcyBhbiBleHBhbmRlZCBkaXJlY3Rvcnkgd2hlcmUgdGhlIGZsYWdzIGlzIHRoZSByZXN1bHQgb2YgYml0d2lzZSBvciBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgdHlwZXMgdG8gYmUgZXhwYW5kZWQ7IGV4YW1wbGU6Ci0JICogPGNvZGU+YW5FYXJGaWxlLnNhdmVBc0RpcmVjdG9yeShhbkVhckZpbGUuRVhQQU5EX1dBUl9GSUxFUyB8IGFuRWFyRmlsZS5FWFBBTkRfRUpCSkFSRklMRVMpPC9jb2RlPjsKLQkgKiAKLQkgKiBJZiB0aGlzIGFyY2hpdmUgd2FzIGxvYWRlZCBmcm9tIHRoZSBzYW1lIHVyaSBhcyBpdCBpcyBiZWluZyBleHRyYWN0ZWQgdG8sIHRoZSBvcmlnbmFsIHdpbGwgYmUKLQkgKiBkZWxldGVkIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBkaXJlY3RvcnkKLQkgKiAKLQkgKiBAdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzYXZpbmcKLQkgKiAKLQkgKiBAdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmUtc3luY2luZyB0aGUgYXJjaGl2ZSB0byB0aGUgbmV3bHkgc2F2ZWQKLQkgKiAgICAgICAgICAgICBkZXN0aW5hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGV4dHJhY3QoaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIFJlb3BlbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZvciBwZXJmb3JtYW5jZSwgc2F2ZSB0aGUgYXJjaGl2ZSB3aXRob3V0IHJlb3BlbmluZzsgRnVydGhlciBvcGVyYXRpb25zIG9uIHRoaXMgaW5zdGFuY2UKLQkgKiB3aXRob3V0IGZpcnN0IGNhbGxpbmcge0BsaW5rICNyZW9wZW59d2lsbCB5aWVsZCB1bmV4cGVjdGVkIHJlc3VsdHMuCi0JICogCi0JICogQHNlZSAjZXh0cmFjdChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdE5vUmVvcGVuKGludCBleHBhbnNpb25GbGFncykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZSB0aGlzIGFyY2hpdmUgYXMgYSBkaXJlY3RvcnkgdXNpbmcgdGhlIHNwZWNpZmllZCB1cmkKLQkgKiAKLQkgKiBUaGUgYXJjaGl2ZSB3aWxsIG5vdCBiZSByZW5hbWVkCi0JICogCi0JICogQHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc2F2aW5nCi0JICogCi0JICogQHNlZSAjZXh0cmFjdChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdFRvKFN0cmluZyB1cmksIGludCBleHBhbnNpb25GbGFncykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0QXJjaGl2ZUNsYXNzTG9hZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBBUmNoaXZlIHRoYXQgc3RhcnQgd2l0aCB0aGUgcHJlZml4Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGZpbHRlckZpbGVzQnlQcmVmaXgoU3RyaW5nIHByZWZpeCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBBcmNoaXZlIGV4Y2x1ZGluZyBhbnkgZmlsZSB0aGF0IHN0YXJ0cyB3aXRoIG9uZSBvZiB0aGUgcHJlZml4ZXMKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXNXaXRob3V0UHJlZml4KFN0cmluZ1tdIHByZWZpeGVzKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIGFyY2hpdmUgZmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiAKLQkgKiBAbGluayBBcmNoaXZlI2FkZChGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFyY2hpdmVGaWxlcygpOwotCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCByb290IGxldmVsIChub24tbmVzdGVkKSBvcGVuZWQgYXJjaGl2ZXMgY29udGFpbmluZyBmaWxlcyB0aGF0IGhhdmUgdGhpcwotCSAqIGFyY2hpdmUgYXMgaXRzIGxvYWRpbmcgY29udGFpbmVyOyB0aGUgc2V0IHdpbGwgYmUgZW1wdHkgaWYgbm8gc3VjaCBvcGVuZWQgYXJjaGl2ZSBleGlzdHMuCi0JICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzogb3BlbiBqYXIgQS4gY3JlYXRlIGphciBCLiBDb3B5IGZpbGVzIGZyb20gQSB0bwotCSAqIEIuIEF0dGVtcHQgdG8gY2xvc2UgamFyIEEgYmVmb3JlIHNhdmluZyBqYXIgQi4gVGhlbiBhdHRlbXB0IHRvIHNhdmUgQiwgYW5kIHRoZSBzYXZlIGZhaWxzCi0JICogYmVjYXVzZSBBIGlzIGNsb3NlZC4gVGhpcyBtZXRob2QgYWxsb3dzIGNsaWVudCBjb2RlIHRvIHRlc3QgZm9yIGRlcGVuZGVudCBvcGVuIGFyY2hpdmVzCi0JICogYmVmb3JlIHNhdmluZyB0aGUgc291cmNlIGFyY2hpdmUuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IGVtcHR5LCB0aGUgc29sdXRpb24gaXMgdG8gZWl0aGVyCi0JICogY2xvc2Ugb3Igc2F2ZSBCIGJlZm9yZSBjbG9zaW5nIEEuCi0JICovCi0JcHVibGljIFNldCBnZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXh0cmFDbGFzc3BhdGgoKTsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgZnJhbWV3b3JrLCBzcGVjaWZpY2FsbHkgYXMgYW4gb3B0aW1pemF0aW9uIHdoZW4gc2F2aW5nL2V4cGxvZGluZwotCSAqIGFyY2hpdmVzIHdpdGggbmVzdGVkIGFyY2hpdmVzCi0JICovCi0JcHVibGljIEZpbGVJdGVyYXRvciBnZXRGaWxlc0ZvclNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9ucyBnZXRPcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAc2VlIExvYWRTdHJhdGVneSNnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB3ZWJzcGhlcmUgcnVudGltZSB3aGVyZSBhcmNoaXZlcyBhcmUgb24gZGlzayAobm90IG5lc3RlZCBpbiBqYXJzKQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiBhYnNvbHV0ZSBwYXRocyB0aGF0IHJlcHJlc2VudHMgdGhpcyBhcmNoaXZlIG9ubHksIGFuZCBpbiB0aGUgY2FzZSBvZgotCSAqICAgICAgICAgV0FSRmlsZXMsIHRoZSBuZXN0ZWQgbG9hZGFibGUgY29udGVudHMuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldExvY2FsUnVudGltZUNsYXNzUGF0aCgpOwotCi0JLyoqCi0JICogVXNlZCBmb3Igd2Vic3BoZXJlIHJ1bnRpbWUgd2hlcmUgYXJjaGl2ZXMgYXJlIG9uIGRpc2sgKG5vdCBuZXN0ZWQgaW4gamFycykgdG8gZ2V0IHRoZQotCSAqIHJlY3Vyc2l2ZSBiZWhhdmlvciwgdGhlIEFyY2hpdmUgbXVzdCBiZWxvbmcgdG8gYW4gRUFSIGZpbGUKLQkgKiAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aHMgdGhhdCByZXByZXNlbnRzIHRoaXMgYXJjaGl2ZSwgYWxsIGl0J3MgcHJlcmVxcywgcmVjdXJzaXZlLgotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRGdWxsUnVudGltZUNsYXNzUGF0aCgpOwotCi0JLyoqCi0JICogVXNlZCBmb3Igd2Vic3BoZXJlIHJ1bnRpbWUgd2hlcmUgYXJjaGl2ZXMgYXJlIG9uIGRpc2sgKG5vdCBuZXN0ZWQgaW4gamFycykgdG8gZ2V0IHRoZQotCSAqIHJlY3Vyc2l2ZSBiZWhhdmlvciwgdGhlIEFyY2hpdmUgbXVzdCBiZWxvbmcgdG8gYW4gRUFSIGZpbGUKLQkgKiAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aHMgdGhhdCByZXByZXNlbnRzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBBcmNoaXZlLCBhbGwgaXQncwotCSAqICAgICAgICAgcHJlcmVxcywgcmVjdXJzaXZlLgotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJvb3QgZnJvbSB3aGljaCBtZXRhIHJlc291cmNlcyBnZXQgbG9hZGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcm9vdCBmcm9tIHdoaWNoIGNsYXNzZXMgYW5kIHByb3BlcnRpZXMgYXJlIGxvYWRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmluYXJpZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wdGlvbmFsIGZpbHRlciBmb3Igc2F2aW5nIGEgc3Vic2V0IG9mIGZpbGVzOyBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIGZvciBhbGwgc2F2ZSBhbmQgZXh0cmFjdAotCSAqIGludm9rYXRpb25zCi0JICovCi0JcHVibGljIFNhdmVGaWx0ZXIgZ2V0U2F2ZUZpbHRlcigpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneSBnZXRTYXZlU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgQXJjaGl2ZSBoYXMKLQkgKiAKLQkgKiBAb3RoZXIgb24gaXQncyBjbGFzc3BhdGgsIGVpdGhlciBkaXJlY3RseSBvciB0cmFuc2l0aXZlbHkKLQkgKiBAcGFyYW0gQXJjaGl2ZQotCSAqICAgICAgICAgICAgb3RoZXIgLSBhbm90aGVyIGFyY2hpdmUgaW4gdGhlIHNhbWUgRUFSIGZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8oQXJjaGl2ZSBvdGhlcik7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBBUEk7IFVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayAjaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUpfQotCSAqIAotCSAqIEBwYXJhbSBBcmNoaXZlCi0JICogICAgICAgICAgICBvdGhlciAtIGFub3RoZXIgYXJjaGl2ZSBpbiB0aGUgc2FtZSBFQVIgZmlsZQotCSAqIEBwYXJhbSBTZXQKLQkgKiAgICAgICAgICAgIHZpc2l0ZWQgLSB0aGUgc2V0IG9mIGFyY2hpdmVzIGFscmVhZHkgdmlzaXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhBcmNoaXZlIG90aGVyLCBTZXQgdmlzaXRlZCwgRUFSRmlsZSBlYXIpOwotCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIGFmdGVyIHRoZSBhcmNoaXZlIGhhcyBiZWVuIG9wZW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWZ0ZXJPcGVuKCk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGxvYWQgc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQotCS8qKgotCSAqIEFuIGl0ZW0gaXMgY29uc2lkZXJlZCBhIGR1cGxpY2F0ZSBpZiB0aGUgYXJjaGl2ZSBjb250YWlucyBhIGZpbGUgb3IgbG9hZGVkIG1vZiByZXNvdXJjZSB3aXRoCi0JICogdGhlIHVyaSwgb3IgaWYgdGhlIHVyaSBpcyBlcXVhbCB0byB0aGUgbWFuaWZlc3QgdXJpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEdXBsaWNhdGUoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBVc2VkIGFzIGFuIG9wdGltaXphdGlvbiBhdCBjb3B5IHRpbWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmlmZXN0U2V0KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZlJlc291cmNlTG9hZGVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBkaXNwYXRjaCBiZXR3ZWVuIHRoZSBhcmNoaXZlIGFuZCB0aGUgbG9hZCBzdHJhdGVneSB3aGVuIGJ1aWxkaW5nIHRoZSBmaWxlCi0JICogbGlzdDsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZEFyY2hpdmUoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXJjaGl2ZSBpcyBzdGlsbCBvcGVuZWQgZm9yIHJlYWQ7IGlmIG5vdCwgSU9FeGNlcHRpb25zIGNvdWxkIGJlIHRocm93bgotCSAqIG9uIGF0dGVtcHRzIHRvIGdldCBpbnB1dCBzdHJlYW1zIG9uIGZpbGUgZW50cmllcy4gcmVvcGVuKCkgd2lsbCBjYXVzZSB0aGlzIGFyY2hpdmUgYW5kIGl0cwotCSAqIG5lc3RlZCBhcmNoaXZlcyB0byByZWJ1aWxkIHRoZWlyIGxvYWQgc3RyYXRlZ2llcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vZiByZXNvdXJjZSBhbmQgYWRkIGl0IHRvIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIGNvbnRleHQgb2YgdGhpcyBhcmNoaXZlOyBhbGwKLQkgKiByZXNvdXJjZXMgaW4gbWVtb3J5IGFyZSBzYXZlZCB3aGVuIHRoZSBhcmNoaXZlIGlzIHNhdmVkCi0JICogCi0JICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgYXJjaGl2ZSBoYXZpbmcgdGhlIHVyaQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBtb2YgcmVzb3VyY2UgYW5kIGFkZCBpdCB0byB0aGUgcmVzb3VyY2Ugc2V0IG9mIHRoZSBjb250ZXh0IG9mIHRoaXMgYXJjaGl2ZTsgYWxsCi0JICogcmVzb3VyY2VzIGluIG1lbW9yeSBhcmUgc2F2ZWQgd2hlbiB0aGUgYXJjaGl2ZSBpcyBzYXZlZAotCSAqIAotCSAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGFyY2hpdmUgaGF2aW5nIHRoZSB1cmkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZU1vZlJlc291cmNlKFN0cmluZyB1cmksIEVMaXN0IGV4dGVudCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBmb3IgZGlzcGF0Y2ggYmV0d2VlbiB0aGUgYXJjaGl2ZSBhbmQgdGhlIGxvYWQgc3RyYXRlZ3kgd2hlbiBidWlsZGluZyB0aGUgZmlsZQotCSAqIGxpc3Q7IGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciBkaXNwYXRjaCBiZXR3ZWVuIHRoZSBhcmNoaXZlIGFuZCB0aGUgbG9hZCBzdHJhdGVneSB3aGVuIGJ1aWxkaW5nIHRoZSBmaWxlCi0JICogbGlzdDsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGV4dHJhIGNsYXNzIHBhdGggd2l0aCBubyByZWZyZXNoIG9mIHRoZSBjbGFzcyBsb2FkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltU2V0RXh0cmFDbGFzc3BhdGgoamF2YS5sYW5nLlN0cmluZyBuZXdFeHRyYUNsYXNzcGF0aCk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoRmlsZSBhRmlsZSk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yICJyZS1zeW5jaW5nIiBhbiBhcmNoaXZlIGFmdGVyIHNhdmU7IGNsaWVudHMgbm9ybWFsbHkgc2hvdWxkIG5vdCBuZWVkIHRoaXMKLQkgKiBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW9wZW4oKSB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGZvciByZW9wZW5pbmcgbmVzdGVkIGFyY2hpdmVzOyBjbGllbnRzIG5vcm1hbGx5IHNob3VsZCBub3QgbmVlZCB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbihBcmNoaXZlIHBhcmVudCkgdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmUgdGhpcyBhcmNoaXZlIGFzIGEgamFyIGZpbGUgd2l0aCB0aGUgdXJpIG9mIHRoZSBhcmNoaXZlOwotCSAqIAotCSAqIEB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHNhdmluZwotCSAqIAotCSAqIEB0aHJvd3MgUmVvcGVuRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSByZS1zeW5jaW5nIHRoZSBhcmNoaXZlIHRvIHRoZSBuZXdseSBzYXZlZAotCSAqICAgICAgICAgICAgIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZSB0aGlzIGFyY2hpdmUgdXNpbmcgdGhlIHNhdmUgc3RyYXRlZ3kgc3BlY2lmaWVkCi0JICogCi0JICogQHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc2F2aW5nCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShTYXZlU3RyYXRlZ3kgYVN0cmF0ZWd5KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlIHRoaXMgYXJjaGl2ZSBhcyBhIGphciBmaWxlIHVzaW5nIHVyaSBwcm92aWRlZDsgSWYgdGhlIHVyaSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgVVJJIG9mCi0JICogdGhpcyBhcmNoaXZlLCB0aGUgdXJpIG9mIHRoaXMgYXJjaGl2ZSB3aWxsIGNoYW5nZSB0byB0aGUgbmV3IHVyaSAoZm9yIHJlb3BlbikKLQkgKiAKLQkgKiBAdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzYXZpbmcKLQkgKiAKLQkgKiBAdGhyb3dzIFJlb3BlbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmUtc3luY2luZyB0aGUgYXJjaGl2ZSB0byB0aGUgbmV3bHkgc2F2ZWQKLQkgKiAgICAgICAgICAgICBkZXN0aW5hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBcyhTdHJpbmcgdXJpKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIFJlb3BlbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZvciBwZXJmb3JtYW5jZSwgc2F2ZSB0aGUgYXJjaGl2ZSB3aXRob3V0IHJlb3BlbmluZzsgRnVydGhlciBvcGVyYXRpb25zIG9uIHRoaXMgaW5zdGFuY2UKLQkgKiB3aXRob3V0IGZpcnN0IGNhbGxpbmcge0BsaW5rICNyZW9wZW59d2lsbCB5aWVsZCB1bmV4cGVjdGVkIHJlc3VsdHMuCi0JICogCi0JICogQHNlZSAjc2F2ZUFzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXNOb1Jlb3BlbihTdHJpbmcgdXJpKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGb3IgcGVyZm9ybWFuY2UsIHNhdmUgdGhlIGFyY2hpdmUgd2l0aG91dCByZW9wZW5pbmc7IEZ1cnRoZXIgb3BlcmF0aW9ucyBvbiB0aGlzIGluc3RhbmNlCi0JICogd2l0aG91dCBmaXJzdCBjYWxsaW5nIHtAbGluayAjcmVvcGVufXdpbGwgeWllbGQgdW5leHBlY3RlZCByZXN1bHRzLgotCSAqIAotCSAqIEBzZWUgI3NhdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVOb1Jlb3BlbigpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0FyY2hpdmVDbGFzc0xvYWRlcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZUNsYXNzTG9hZGVyKGphdmEubGFuZy5DbGFzc0xvYWRlciBuZXdBcmNoaXZlQ2xhc3NMb2FkZXIpOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0cmFDbGFzc3BhdGgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRyYUNsYXNzcGF0aChqYXZhLmxhbmcuU3RyaW5nIG5ld0V4dHJhQ2xhc3NwYXRoKTsKLQotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KEFyY2hpdmVNYW5pZmVzdCBuZXdNYW5pZmVzdCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChqYXZhLnV0aWwuamFyLk1hbmlmZXN0IGFNYW5pZmVzdCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBDbGFzcy1wYXRoIG1hbmlmZXN0IGVudHJ5LCByZWJ1aWxkcyB0aGUgY2xhc3MgbG9hZGVyLCBhbmQgcmVmcmVzaGVzIGFueSByZWZsZWN0ZWQKLQkgKiBqYXZhIGNsYXNzZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdENsYXNzUGF0aEFuZFJlZnJlc2goU3RyaW5nIGNsYXNzcGF0aCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25zKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnMgbmV3T3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBmaWx0ZXIgZm9yIHNhdmluZyBhIHN1YnNldCBvZiBmaWxlczsgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCBmb3IgYWxsIHNhdmUgYW5kIGV4dHJhY3QKLQkgKiBpbnZva2F0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVGaWx0ZXIoU2F2ZUZpbHRlciBhRmlsdGVyKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1NhdmVTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYXZlU3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5IG5ld1NhdmVTdHJhdGVneSk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdYbWxFbmNvZGluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhtbEVuY29kaW5nKGphdmEubGFuZy5TdHJpbmcgbmV3WG1sRW5jb2RpbmcpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgamF2YSByZWZsZWN0aW9uIHNob3VsZCBiZSBzZXQgdXAgZm9yIHRoaXMgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUphdmFSZWZsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUKLQkgKiBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlI2dldEFyY2hpdmVfVHlwZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUeXBlcygpOwotCi0JYm9vbGVhbiBpc1R5cGUoU3RyaW5nIHR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTc2MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZGlzY3JpbWluYXRvcnMgPSBudWxsOwotCXByaXZhdGUgQ29sbGVjdGlvbiBjdXN0b21UeXBlcyA9IG51bGw7Ci0KLQkvKgotCSAqIE1vc3Qga25vd24gdHlwZXMgYXJlIG9mIGxlbmd0aCAzLiBXaGVudmVyIGEgbmV3IHR5cGUgaXMgYWRkZWQgdGhhdCBpcyBub3Qgb2YgbGVuZ3RoIDMsCi0JICogbW9kaWZpY2F0aW9ucyBtYXkgYmUgbmVjZXNzYXJ5IHRvIHRoZSAnaXNLbm93bkFyY2hpdmVUeXBlKCkgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGVmYXVsdEtub3duVHlwZXMgPSBuZXcgU3RyaW5nW117ImVhciIsICJ3YXIiLCAiamFyIiwgInppcCIsICJmYXIifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkoKTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RvckRpc2NyaW1pbmF0b3IoR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yKSB7Ci0JCUlOU1RBTkNFLmdldERpc2NyaW1pbmF0b3JzKCkuYWRkKGRpc2NyaW1pbmF0b3IpOwotCQlJTlNUQU5DRS5hZGRLbm93bkFyY2hpdmVUeXBlcyhkaXNjcmltaW5hdG9yLmdldEN1c3RvbUZpbGVFeHRlbnNpb25zKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RGlzY3JpbWluYXRvcnMoKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9ycyA9PSBudWxsKQotCQkJZGlzY3JpbWluYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVHlwZXMoQXJjaGl2ZSBhcmNoaXZlKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9ycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlHZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3IgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGRpc2NyaW1pbmF0b3JzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gKEdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoZGlzY3JpbWluYXRvci5kaXNjcmltaW5hdGUoYXJjaGl2ZSkpCi0JCQkJYXJjaGl2ZS5nZXRUeXBlcygpLmFkZChkaXNjcmltaW5hdG9yLmdldFR5cGVLZXkoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRLbm93bkFyY2hpdmVUeXBlcyhTdHJpbmdbXSBuZXdUeXBlcykgewotCQlpZiAoY3VzdG9tVHlwZXMgPT0gbnVsbCkgewotCQkJY3VzdG9tVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJY3VzdG9tVHlwZXMuYWRkKG5ld1R5cGVzW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzS25vd25BcmNoaXZlVHlwZShTdHJpbmcgZmlsZVVSSSkgewotCQlpZiAoZmlsZVVSSSA9PSBudWxsIHx8IGZpbGVVUkkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgbG93ZXJDYXNlVXJpID0gZmlsZVVSSS50b0xvd2VyQ2FzZSgpOwotCQkvKgotCQkgKiBFbnN1cmUgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBVUkkgaXMgbG9uZyBlbm91Z2ggdG8gY29udGFpbiBhIC4zIHN0eWxlIGV4dGVuc2lvbgotCQkgKi8KLQkJaWYgKGxvd2VyQ2FzZVVyaS5sZW5ndGgoKSA+IDQgJiYgbG93ZXJDYXNlVXJpLmNoYXJBdChsb3dlckNhc2VVcmkubGVuZ3RoKCkgLSA0KSA9PSAnLicpIHsKLQkJCVN0cmluZyBlbmRpbmcgPSBsb3dlckNhc2VVcmkuc3Vic3RyaW5nKGxvd2VyQ2FzZVVyaS5sZW5ndGgoKSAtIDMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0S25vd25UeXBlcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoZGVmYXVsdEtub3duVHlwZXNbaV0uZXF1YWxzKGVuZGluZykpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGN1c3RvbVR5cGUgPSBudWxsOwotCQlpZiAoY3VzdG9tVHlwZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgY3VzdG9tVHlwZXNJdGVyYXRvciA9IGN1c3RvbVR5cGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoY3VzdG9tVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQljdXN0b21UeXBlID0gKFN0cmluZykgY3VzdG9tVHlwZXNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGZpbGVVUkkuZW5kc1dpdGgoY3VzdG9tVHlwZSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ2xpZW50TW9kdWxlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9DbGllbnRNb2R1bGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0OGIwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9DbGllbnRNb2R1bGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLQotCi0KLQotcHVibGljIGludGVyZmFjZSBDbGllbnRNb2R1bGVSZWYgZXh0ZW5kcyBNb2R1bGVSZWYgewotCUFwcGxpY2F0aW9uQ2xpZW50IGdldEFwcGxpY2F0aW9uQ2xpZW50KCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotfSAvL0NsaWVudE1vZHVsZVJlZgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTMwODEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXB1YmxpYyBzdGF0aWMgQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQlwcm90ZWN0ZWQgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgY29tbW9uQXJjaGl2ZUZhY3RvcnkgPSAoKENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbCkgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkpLmdldERlbGVnYXRlKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbW1vbkFyY2hpdmVGYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1vbkFyY2hpdmVGYWN0b3J5KENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJY29tbW9uQXJjaGl2ZUZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzNTdhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICovCi0KLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0sCi0gKiBXZWJTcGhlcmUgU3R1ZGlvIFdvcmtiZW5jaAotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycCAyMDAxCi0gKi8KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImNvbW1vbmFyY2hpdmUiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbmFyY2hpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YWYwYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uYXJjaGl2ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogVGVsbCB0aGUgZmFjdG9yeSB0aGF0IGFuIGFyY2hpdmUgaGFzIGJlZW4gb3BlbmVkOyB0aGUgZmFjdG9yeSBtYWludGFpbnMgYSB3ZWFrIHNldCBvZiBhbGwgdGhlCi0JICogb3BlbiBhcmNoaXZlcyB0byBkZXRlcm1pbmUgaWYgYW5vdGhlciBhcmNoaXZlIGNhbiBiZSBjbG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgYXJjaGl2ZUNsb3NlZChBcmNoaXZlIGFDbG9zZWRBcmNoaXZlKTsKLQotCS8qKgotCSAqIFRlbGwgdGhlIGZhY3RvcnkgdGhhdCBhbiBhcmNoaXZlIGhhcyBiZWVuIG9wZW5lZDsgdGhlIGZhY3RvcnkgbWFpbnRhaW5zIGEgd2VhayBzZXQgb2YgYWxsIHRoZQotCSAqIG9wZW4gYXJjaGl2ZXMgdG8gZGV0ZXJtaW5lIGlmIGFub3RoZXIgYXJjaGl2ZSBjYW4gYmUgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFyY2hpdmVPcGVuZWQoQXJjaGl2ZSBhbk9wZW5BcmNoaXZlKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKEFyY2hpdmUpfQotCSAqIAotCSAqIElmIGFueSBvcGVuZWQgYXJjaGl2ZSBjb250YWlucyBmaWxlcyB0aGF0IGhhdmUgdGhlIHBhcmFtZXRlciBhcyBpdHMgbG9hZGluZyBjb250YWluZXIsIHJldHVybgotCSAqIGZhbHNlOyBvdGhlcndpc2UgcmV0dXJuIHRydWUuIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86IG9wZW4gamFyIEEuIGNyZWF0ZQotCSAqIGphciBCLiBDb3B5IGZpbGVzIGZyb20gQSB0byBCLiBBdHRlbXB0IHRvIGNsb3NlIGphciBBIGJlZm9yZSBzYXZpbmcgamFyIEIuIFRoZW4gYXR0ZW1wdCB0bwotCSAqIHNhdmUgQiwgYW5kIHRoZSBzYXZlIGZhaWxzIGJlY2F1c2UgQSBpcyBjbG9zZWQuIFRoaXMgbWV0aG9kIGFsbG93cyBjbGllbnQgY29kZSB0byB0ZXN0IGZvcgotCSAqIGRlcGVuZGVudCBvcGVuIGFyY2hpdmVzIGJlZm9yZSBzYXZpbmcgdGhlIHNvdXJjZSBhcmNoaXZlLiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGUKLQkgKiBzb2x1dGlvbiBpcyB0byBlaXRoZXIgY2xvc2Ugb3Igc2F2ZSBCIGJlZm9yZSBjbG9zaW5nIEEuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ2xvc2UoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi0JLyoqCi0JICogQ2xvc2UgYW55IG9wZW4gYXJjaGl2ZXMgYW5kIGRlbGV0ZSB0aGUgdGVtcCBmaWxlcyBhc3NvY2lhdGVkIHdpdGggbmVzdGVkIGFyY2hpdmVzLiBEdWUgdG8KLQkgKiBsaW1pdGF0aW9ucyBpbiB0aGUgZGVsZXRlT25FeGl0KCkgbWV0aG9kIG9mIGZpbGUsIGluIDEuMi4yIHRoZXJlIGlzIG5vIHdheSB0byBlbnN1cmUgdGhlc2UKLQkgKiBmaWxlcyBnZXQgZGVsZXRlZC4gQ2xpZW50IGNvZGUgc2hvdWxkIHVzZSBnb29kIHByYWN0aWNlIGJ5IGNhbGxpbmcge0BsaW5rIEFyY2hpdmUjY2xvc2V9d2hlbgotCSAqIGZpbmlzaGVkIHdpdGggYW4gQXJjaGl2ZSBpbnN0YW5jZSwgcmF0aGVyIHRoYW4ganVzdCBkaXNjYXJkIGFuIGluc3RhbmNlIHdpdGggb3BlbiBmaWxlCi0JICogaGFuZGxlcyBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgZ2MnZC4gQmV5b25kIHRoYXQsIHByb2dyYW0gY29kZSBjb21waWxlZCBmb3IgMS4zIGNhbiAoYW5kCi0JICogc2hvdWxkKSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBzaHV0ZG93biBob29rOiA8Y29kZT4KLQkgKiAJUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQoKSB7Ci0JIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgKChDb21tb25hcmNoaXZlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25hcmNoaXZlUGFja2FnZS5lTlNfVVJJKSkuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKS5jbG9zZU9wZW5BcmNoaXZlcygpOwotCSB9Ci0JIH0pOzwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU9wZW5BcmNoaXZlcygpOwotCi0JcHVibGljIEFyY2hpdmUgY29weShBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZSBjb3B5KE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhcmNoaXZlIGZvciBlZGl0aW5nLCBhbmQgaW5pdGlhbGl6ZXMgaXQgYXBwcm9wcmlhdGVseSAoYWRkcyBhbiBlbXB0eSBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhcmNoaXZlIGZvciBlZGl0aW5nLCBhbmQgaW5pdGlhbGl6ZXMgaXQgYXBwcm9wcmlhdGVseQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUFyY2hpdmVJbml0aWFsaXplZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseTsgY2xpZW50cyB1c3VhbGx5IHNob3VsZCBub3QgbmVlZCB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlQ2hpbGRMb2FkU3RyYXRlZ3koU3RyaW5nIHVyaSwgTG9hZFN0cmF0ZWd5IHBhcmVudCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhcmNoaXZlIGZvciBlZGl0aW5nLCBhbmQgaW5pdGlhbGl6ZXMgaXQgYXBwcm9wcmlhdGVseSAoYWRkcyBhbiBlbXB0eSBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFyY2hpdmUgZm9yIGVkaXRpbmcsIGFuZCBpbml0aWFsaXplcyBpdCBhcHByb3ByaWF0ZWx5IChhZGRzIGFuIGVtcHR5IGRlcGxveW1lbnQKLQkgKiBkZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbml0aWFsaXplZCBhcmNoaXZlIGJhc2VkIG9uIHRoZSBnaXZlbiBVUkkgYW5kIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVBcmNoaXZlSW5pdGlhbGl6ZWQoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluaXRpYWxpemVkIEVBUiBiYXNlZCBvbiB0aGUgZ2l2ZW4gVVJJIGFuZCBvcHRpb25zCi0JICovCi0JcHVibGljIEVBUkZpbGUgY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbml0aWFsaXplZCBFSkIgYmFzZWQgb24gdGhlIGdpdmVuIFVSSSBhbmQgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZChBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3QXBwbGljYXRpb25DbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0FyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0VBUkZpbGUoRUFSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZWQgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdFSkJKYXJGaWxlKEVKQkphckZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVkIGFyY2hpdmUgYmFzZWQgb24gdGhlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3TW9kdWxlRmlsZShNb2R1bGVGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplZCBhcmNoaXZlIGJhc2VkIG9uIHRoZSBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld1JBUkZpbGUoUkFSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZWQgYXJjaGl2ZSBiYXNlZCBvbiB0aGUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdXQVJGaWxlKFdBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBOdWxsTG9hZFN0cmF0ZWd5SW1wbDsgdXNlZCBmb3IgbmV3IGFyY2hpdmVzCi0JICovCi0JTG9hZFN0cmF0ZWd5IGNyZWF0ZUVtcHR5TG9hZFN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGR5bmFtaWNhbGx5IGJ1aWxkIGEgbG9hZCBzdHJhdGVneSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gRGV0ZXJtaW5lcyB3aGV0aGVyCi0JICogdGhlIHVyaSBwb2ludHMgdG8gYSBqYXIgZmlsZSBvciBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3koU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBjcmVhdGVSQVJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhcmNoaXZlIGZvciBlZGl0aW5nLCBhbmQgaW5pdGlhbGl6ZXMgaXQgYXBwcm9wcmlhdGVseSAoYWRkcyBhbiBlbXB0eSBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBjcmVhdGVXQVJGaWxlSW5pdGlhbGl6ZWQoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGludHJvc3BlY3QgYW4gYXJjaGl2ZSBhbmQgZ2V0IGl0J3MgY2xhc3MgcGF0aCBlbnRyaWVzIGJlZm9yZSBmdWxseSBvcGVuaW5nCi0JICogdGhlIGFyY2hpdmU7IG5lZWRlZCBiZWNhdXNlIHdlIG1heSBuZWVkIGV4dHJhIGNsYXNzcGF0aCBpbmZvIHRvIGJlIGFibGUgdG8gb3BlbiB0aGUgMS4wIGZpbGUKLQkgKiBhbmQgZGVzZXJpYWxpemUgaXRzIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAqIAotCSAqIEByZXR1cm4gYSB0b2tlbml6ZWQgYXJyYXkgb2YgY2xhc3MgcGF0aCBjb21wb25lbnRzCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldE1hbmlmZXN0Q2xhc3NQYXRoVmFsdWVzKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJvb3QgbGV2ZWwgKG5vbi1uZXN0ZWQpIG9wZW5lZCBhcmNoaXZlcyBjb250YWluaW5nIGZpbGVzIHRoYXQgaGF2ZSB0aGUKLQkgKiBwYXJhbWV0ZXIgYXMgaXRzIGxvYWRpbmcgY29udGFpbmVyOyB0aGUgc2V0IHdpbGwgYmUgZW1wdHkgaWYgbm8gc3VjaCBvcGVuZWQgYXJjaGl2ZSBleGlzdHMuCi0JICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzogb3BlbiBqYXIgQS4gY3JlYXRlIGphciBCLiBDb3B5IGZpbGVzIGZyb20gQSB0bwotCSAqIEIuIEF0dGVtcHQgdG8gY2xvc2UgamFyIEEgYmVmb3JlIHNhdmluZyBqYXIgQi4gVGhlbiBhdHRlbXB0IHRvIHNhdmUgQiwgYW5kIHRoZSBzYXZlIGZhaWxzCi0JICogYmVjYXVzZSBBIGlzIGNsb3NlZC4gVGhpcyBtZXRob2QgYWxsb3dzIGNsaWVudCBjb2RlIHRvIHRlc3QgZm9yIGRlcGVuZGVudCBvcGVuIGFyY2hpdmVzCi0JICogYmVmb3JlIHNhdmluZyB0aGUgc291cmNlIGFyY2hpdmUuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IGVtcHR5LCB0aGUgc29sdXRpb24gaXMgdG8gZWl0aGVyCi0JICogY2xvc2Ugb3Igc2F2ZSBCIGJlZm9yZSBjbG9zaW5nIEEuCi0JICovCi0JcHVibGljIFNldCBnZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbihBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIG9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIG9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUgYnkgdGhlIHBhc3NlZCB1cmkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBraW5kIG9mIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlIGJ5IHRoZSBwYXNzZWQgdXJpLCBhbmQgdXNlIHRoZSBleHRyYUNsYXNzUGF0aCBmb3IgamF2YSByZWZsZWN0aW9uLCBpbgotCSAqIGFkZGl0aW9uIHRvIHRoZSBtYW5pZmVzdCBjbGFzcy1wYXRoOyBtb3N0bHkgdXNlZCBmb3IgZWpiIDEuMCBqYXIgZmlsZXMgdG8gYmUgY29udmVydGVkCi0JICogCi0JICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUga2luZCBvZiBhcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSwgU3RyaW5nIGV4dHJhQ2xhc3NQYXRoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBvcGVuRUFSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBvcGVuRUFSRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JcHVibGljIEVBUkZpbGUgb3BlbkVBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQjExSmFyRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCMTFKYXJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCMTFKYXJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSwgU3RyaW5nIGV4dHJhQ2xhc3NQYXRoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShTdHJpbmcgdXJpLCBTdHJpbmcgZXh0cmFDbGFzc1BhdGgpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBmb3Igb3Blbm5pbmcgYW4gQXJjaGl2ZSBpbiBhbiBBcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoU3RyaW5nIHVyaSwgQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgaW50ZXJuYWxseSBmb3Igb3Blbm5pbmcgYW4gQXJjaGl2ZSBpbiBhbiBBcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoTG9vc2VBcmNoaXZlIGxvb3NlLCBBcmNoaXZlIHBhcmVudCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSQVJGaWxlIG9wZW5SQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBvcGVuUkFSRmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgUmVhZE9ubHlEaXJlY3Rvcnkgb3BlblJlYWRPbmx5RGlyZWN0b3J5KFN0cmluZyB1cmkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIFdBUkZpbGUgb3BlbldBUkZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIFdBUkZpbGUgb3BlbldBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBXQVJGaWxlIG9wZW5XQVJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wZW4gdGhlIGFyY2hpdmUgYnkgdGhlIHBhc3NlZCBwYXJhbWV0ZXIsIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgd2hhdCBraW5kIG9mCi0JICogYXJjaGl2ZSBpdCBpcwotCSAqIAotCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgQXJjaGl2ZSwgYnV0IG5vdCBhIHN1YmNsYXNzCi0JICovCi0JQXJjaGl2ZSBwcmltT3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCi0JQXJjaGl2ZSBwcmltT3BlbkFyY2hpdmUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCUFyY2hpdmUgcHJpbU9wZW5BcmNoaXZlKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBXQVJGaWxlIHZhbHVlCi0JICovCi0JV0FSRmlsZSBjcmVhdGVXQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRUpCSmFyRmlsZSB2YWx1ZQotCSAqLwotCUVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSB2YWx1ZQotCSAqLwotCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFQVJGaWxlIHZhbHVlCi0JICovCi0JRUFSRmlsZSBjcmVhdGVFQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gUkFSRmlsZSB2YWx1ZQotCSAqLwotCVJBUkZpbGUgY3JlYXRlUkFSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEFyY2hpdmUgdmFsdWUKLQkgKi8KLQlBcmNoaXZlIGNyZWF0ZUFyY2hpdmUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBGaWxlIHZhbHVlCi0JICovCi0JRmlsZSBjcmVhdGVGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gUmVhZE9ubHlEaXJlY3RvcnkgdmFsdWUKLQkgKi8KLQlSZWFkT25seURpcmVjdG9yeSBjcmVhdGVSZWFkT25seURpcmVjdG9yeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JQ29tbW9uYXJjaGl2ZVBhY2thZ2UgZ2V0Q29tbW9uYXJjaGl2ZVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFSkJNb2R1bGVSZWYgdmFsdWUKLQkgKi8KLQlFSkJNb2R1bGVSZWYgY3JlYXRlRUpCTW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBDb252aWVuaW5jZSBtZXRob2QgZm9yIHdyYXBwaW5nIGEgc3RhbmRhbG9uZSBFSkIgSkFSIGZpbGUKLQkgKi8KLQlFSkJNb2R1bGVSZWYgY3JlYXRlRUpCTW9kdWxlUmVmKEVKQkphckZpbGUgZWpiSmFyRmlsZSk7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBXZWJNb2R1bGVSZWYgdmFsdWUKLQkgKi8KLQlXZWJNb2R1bGVSZWYgY3JlYXRlV2ViTW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBDb252aWVuaW5jZSBtZXRob2QgZm9yIHdyYXBwaW5nIGEgc3RhbmRhbG9uZSBXQVIgZmlsZQotCSAqLwotCVdlYk1vZHVsZVJlZiBjcmVhdGVXZWJNb2R1bGVSZWYoV0FSRmlsZSB3YXJGaWxlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBDbGllbnRNb2R1bGVSZWYgdmFsdWUKLQkgKi8KLQlDbGllbnRNb2R1bGVSZWYgY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBDb252aWVuaW5jZSBtZXRob2QgZm9yIHdyYXBwaW5nIGEgc3RhbmRhbG9uZSBBcHBsaWNhdGlvbiBDbGllbnQgSkFSIGZpbGUKLQkgKi8KLQlDbGllbnRNb2R1bGVSZWYgY3JlYXRlQ2xpZW50TW9kdWxlUmVmKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjbGllbnRGaWxlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBDb25uZWN0b3JNb2R1bGVSZWYgdmFsdWUKLQkgKi8KLQlDb25uZWN0b3JNb2R1bGVSZWYgY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBDb252aWVuaW5jZSBtZXRob2QgZm9yIHdyYXBwaW5nIGEgc3RhbmRhbG9uZSBSQVIgZmlsZQotCSAqLwotCUNvbm5lY3Rvck1vZHVsZVJlZiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoUkFSRmlsZSByYXJGaWxlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbmFyY2hpdmVQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25hcmNoaXZlUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM2NGQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbmFyY2hpdmVQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vbmFyY2hpdmVQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImNvbW1vbmFyY2hpdmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUiA9IDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdBUl9GSUxFID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX0ZJTEUgPSA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfRklMRSA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9SRUYgPSAxMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9SRUYgPSAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9SRUYgPSAxMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ0xJRU5UX01PRFVMRV9SRUYgPSAxMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9SRUYgPSAxNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9GSUxFID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkFSX0ZJTEUgPSA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUkNISVZFID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX1VSSSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX0xBU1RfTU9ESUZJRUQgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxFX19TSVpFID0gMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0b3J5IEVudHJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMRV9fRElSRUNUT1JZX0VOVFJZID0gMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxFX19PUklHSU5BTF9VUkkgPSA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxFX19MT0FESU5HX0NPTlRBSU5FUiA9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTEVfX0NPTlRBSU5FUiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMRV9GRUFUVVJFX0NPVU5UID0gNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfX1VSSSA9IEZJTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19MQVNUX01PRElGSUVEID0gRklMRV9fTEFTVF9NT0RJRklFRDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX19TSVpFID0gRklMRV9fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+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+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVFlQRVMgPSBNT0RVTEVfRklMRV9fVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IE1PRFVMRV9GSUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50IEZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZID0gODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fVVJJID0gQ09OVEFJTkVSX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX0xBU1RfTU9ESUZJRUQgPSBDT05UQUlORVJfX0xBU1RfTU9ESUZJRUQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX1NJWkUgPSBDT05UQUlORVJfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdG9yeSBFbnRyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX0RJUkVDVE9SWV9FTlRSWSA9IENPTlRBSU5FUl9fRElSRUNUT1JZX0VOVFJZOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX09SSUdJTkFMX1VSSSA9IENPTlRBSU5FUl9fT1JJR0lOQUxfVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRUFEX09OTFlfRElSRUNUT1JZX19MT0FESU5HX0NPTlRBSU5FUiA9IENPTlRBSU5FUl9fTE9BRElOR19DT05UQUlORVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUiA9IENPTlRBSU5FUl9fQ09OVEFJTkVSOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9fRklMRVMgPSBDT05UQUlORVJfX0ZJTEVTOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVhZCBPbmx5IERpcmVjdG9yeTwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVBRF9PTkxZX0RJUkVDVE9SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJBUl9GSUxFX19VUkkgPSBNT0RVTEVfRklMRV9fVVJJOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fTEFTVF9NT0RJRklFRCA9IE1PRFVMRV9GSUxFX19MQVNUX01PRElGSUVEOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fU0laRSA9IE1PRFVMRV9GSUxFX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZID0gTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fT1JJR0lOQUxfVVJJID0gTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fQ09OVEFJTkVSID0gTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSQVJfRklMRV9fRklMRVMgPSBNT0RVTEVfRklMRV9fRklMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVJfRklMRV9fVFlQRVMgPSBNT0RVTEVfRklMRV9fVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UkFSIEZpbGU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBUl9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfRklMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfUkVGX19NT0RVTEVfRklMRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9SRUZfX0VBUl9GSUxFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfUkVGX19NT0RVTEUgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Nb2R1bGUgUmVmPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRSA9IE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEUgPSBNT0RVTEVfUkVGX19FQVJfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTU9EVUxFX1JFRl9fTU9EVUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FSkIgTW9kdWxlIFJlZjwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEVfUkVGX19FQVJfRklMRSA9IE1PRFVMRV9SRUZfX0VBUl9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9NT0RVTEVfUkVGX19NT0RVTEUgPSBNT0RVTEVfUkVGX19NT0RVTEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldlYiBNb2R1bGUgUmVmPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UID0gTU9EVUxFX1JFRl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEUgPSBNT0RVTEVfUkVGX19NT0RVTEVfRklMRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ0xJRU5UX01PRFVMRV9SRUZfX0VBUl9GSUxFID0gTU9EVUxFX1JFRl9fRUFSX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xJRU5UX01PRFVMRV9SRUZfX01PRFVMRSA9IE1PRFVMRV9SRUZfX01PRFVMRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q2xpZW50IE1vZHVsZSBSZWY8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENMSUVOVF9NT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSBNT0RVTEVfUkVGX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRSA9IE1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX1JFRl9fRUFSX0ZJTEUgPSBNT0RVTEVfUkVGX19FQVJfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX1JFRl9fTU9EVUxFID0gTU9EVUxFX1JFRl9fTU9EVUxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db25uZWN0b3IgTW9kdWxlIFJlZjwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IE1PRFVMRV9SRUZfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJjb21tb25hcmNoaXZlLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21tb25hcmNoaXZlUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQ29udGFpbmVyIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyX0ZpbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gV0FSRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V0FSRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTW9kdWxlRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TW9kdWxlRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVBUkZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVBUkZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFQVJGaWxlX01vZHVsZVJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBNb2R1bGVSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfTW9kdWxlRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfRWFyRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWYjZ2V0TW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWYjZ2V0TW9kdWxlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1vZHVsZVJlZl9Nb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBFSkJNb2R1bGVSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQk1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFdlYk1vZHVsZVJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViTW9kdWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gQ2xpZW50TW9kdWxlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDbGllbnRNb2R1bGVSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBDb25uZWN0b3JNb2R1bGVSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbm5lY3Rvck1vZHVsZVJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVKQkphckZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQkphckZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFJBUkZpbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFJBUkZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZSNnZXREZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGUjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBzZWUgI2dldFJBUkZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBBcmNoaXZlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcmNoaXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuQXJjaGl2ZSNnZXRUeXBlcyA8ZW0+VHlwZXM8L2VtPn0nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UeXBlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkFyY2hpdmUjZ2V0VHlwZXMoKQotCSAqIEBzZWUgI2dldEFyY2hpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFyY2hpdmVfVHlwZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBGaWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfVVJJKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfTGFzdE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2lzRGlyZWN0b3J5RW50cnkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI2dldEZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVfRGlyZWN0b3J5RW50cnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZV9PcmlnaW5hbFVSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWxlX0xvYWRpbmdDb250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsZV9Db250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBSZWFkT25seURpcmVjdG9yeSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVhZE9ubHlEaXJlY3RvcnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0KLX0gLy9Db21tb25hcmNoaXZlUGFja2FnZQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29ubmVjdG9yTW9kdWxlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db25uZWN0b3JNb2R1bGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyZDA2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db25uZWN0b3JNb2R1bGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci0KLQotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JNb2R1bGVSZWYgZXh0ZW5kcyBNb2R1bGVSZWYgewotCUNvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci0KLX0gLy9Db25uZWN0b3JNb2R1bGVSZWYKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTMzNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250YWluZXIgZXh0ZW5kcyBGaWxlIHsKLQotCS8qKgotCSAqIEluZGljYXRlIHdoZXRoZXIgdGhlIGFyY2hpdmUgY29udGFpbnMgYSBmaWxlIGhhdmluZyBhIHJlbGF0aXZlIHBhdGggb2YgdGhlIHBhcmFtZXRlcjsgdGhlIHVyaQotCSAqIG1heSBvciBtYXkgbm90IGhhdmUgYSBsZWFkaW5nIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIGl0cyBsb2FkIHN0cmF0ZWd5LCBpZiBpdCBpcyBrbm93bi4gU2hvdWxkIGJlIHVzZWQKLQkgKiBtYWlubHkgZm9yIHJlYWQtb25seSBydW50aW1lIHB1cnBvc2VzLCBhcyBlZGl0LXRpbWUgbW9kaWZpY2F0aW9ucyBtYXkgbWFrZSB0aGUgcmVzdWx0Ci0JICogdW5kZWZpbmVkLgotCSAqIAotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGFyY2hpdmUgaXMgInZpcnR1YWwiLCBlZywgYSBuZXN0ZWQgamFyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JcHVibGljIEZpbGUgZ2V0RmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBnZXRMb2FkU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGhhcyBldmVyIGhhZCBpdHMgZmlsZXMgZW51bWVyYXRlZDsgdXNlZCBhcyBhbiBvcHRpbWl6YXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKTsKLQotCS8qKgotCSAqIEdvZXMgZGlyZWN0bHkgdG8gdGhlIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIElucHV0U3RyZWFtIHByaW1HZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHJlYnVpbGRGaWxlSW5kZXgoKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0xvYWRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkU3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IG5ld0xvYWRTdHJhdGVneSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRmlsZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhpcyBDb250YWluZXIgYW5kIGRyb3BzIHRoZSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyRmlsZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VBUkZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VBUkZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjNzU0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FQVJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5FbXB0eVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVBUkZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlIHsKLQotCS8qKgotCSAqIE1ha2VzIGEgY29weSBvZgotCSAqIAotCSAqIEBhTW9kdWxlRmlsZSwgdXNpbmcgaXRzIGxvY2FsIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgY3JlYXRlcyBhIG5ldyBNb2R1bGUgYW5kIGFkZHMgaXQgdG8gdGhlCi0JICogICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgdGhpcyBFQVIgZmlsZSBhbmQgYWRkcyB0aGUgY29weSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgIE1vZHVsZUZpbGUgdG8gdGhpcyBFQVIuCi0JICogCi0JICogQHJldHVybiBUaGUgY29waWVkIG1vZHVsZSBmaWxlCi0JICogCi0JICogQGV4Y2VwdGlvbiBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGlzIEVBUiBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSB3aXRoIHRoZSBzYW1lIHVyaSBhcwotCSAqIEBhTW9kdWxlRmlsZQotCSAqLwotCi0JcHVibGljIE1vZHVsZUZpbGUgYWRkQ29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGFkZENvcHkoTW9kdWxlRmlsZSkgZXhjZXB0IHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG5ldyBNb2R1bGVSZWYKLQkgKi8KLQlwdWJsaWMgTW9kdWxlUmVmIGFkZENvcHlSZWYoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFkZCBhIGNvcHkgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdG8gdGhlIGRkIGZvciB0aGUgbW9kdWxlOyBpZiBhbiBhbHQgZGQgaXMgc3BlY2lmaWVkLCBhZGQgdG8KLQkgKiB0aGF0IGRkOyBvdGhlcndpc2UgYWRkIHRvIHRoZSBzdGFuZGFyZCBkZCBvZiB0aGUgbW9kdWxlOyBhbHNvIGFkZCBhIGNvcHkgb2YgdGhlIHJvbGUgdG8gdGhlCi0JICogZWFyIGZpbGUgZGQgaWYgYSByb2xlIHdpdGggdGhhdCBuYW1lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBkZCBmb3IgYU1vZHVsZSBhbHJlYWR5IGNvbnRhaW5zIGEgcm9sZSB3aXRoIHRoYXQgbmFtZQotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGUgYWRkQ29weShTZWN1cml0eVJvbGUgYVJvbGUsIE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWRkIGEgY29weSBvZiB0aGUgc2VjdXJpdHkgcm9sZSB0byB0aGUgZWFyIGZpbGUncyBkZCwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGEgcm9sZQotCSAqIHdpdGggdGhlIHNhbWUgbmFtZQotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGUgYWRkQ29weUlmTm90RXhpc3RzKFNlY3VyaXR5Um9sZSBhUm9sZSk7Ci0KLQlFT2JqZWN0IGdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBBcHBsaWNhdGlvbkNsaWVudEZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICogCi0JICogQGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBDbGllbnRNb2R1bGVSZWZzCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2xpZW50TW9kdWxlUmVmcygpOwotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0JQXBwbGljYXRpb24gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JQ29ubmVjdG9yIGdldERlcGxveW1lbnREZXNjcmlwdG9yKENvbm5lY3Rvck1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQlFSkJKYXIgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoRWpiTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCUFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yKEphdmFDbGllbnRNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uOwotCi0JRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uOwotCi0JV2ViQXBwIGdldERlcGxveW1lbnREZXNjcmlwdG9yKFdlYk1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBFSkJKYXJGaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RUpCSmFyRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIEVKQk1vZHVsZVJlZnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFSkJNb2R1bGVSZWZzKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlCi0JICogcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICogUmV0dXJucyB0aGUgZmlyc3QgaGl0IGZvdW5kOyBhc3N1bXB0aW9uIHRoYXQgdGhlIGVqYiBuYW1lcyBhcmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlCi0JICogZWFyIGZpbGUuIFRoaXMgd2lsbCBsaWtlbHkgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciB3YXkgZm9yIGRlcmVmZXJlbmNpbmcgZWpiIHJlZnMuCi0JICogCi0JICogQ2FuIGJlIHVzZWQgd2l0aCBlamIgMS4xIHJlZmVyZW5jZXMgb25seS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB7QGxpbmsjZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoRWpiUmVmIHJlZiwgU3RyaW5nIG1vZHVsZVVyaSApCi0JICogQHBhcmFtIEVqYlJlZgotCSAqICAgICAgICAgICAgcmVmIC0gQW4gZWpiIHJlZmVyZW5jZQotCSAqIEByZXR1cm4gRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoRWpiUmVmIHJlZik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZWQgYnkgdGhlIEVqYlJlZiBhbmQgYSBtb2R1bGUgdXJpLCBpZiBvbmUgZXhpc3RzLiBUaGUKLQkgKiBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOwotCSAqIG90aGVyd2lzZSByZXR1cm4gbnVsbC4gUmV0dXJucyB0aGUgZmlyc3QgaGl0IGZvdW5kOyBhc3N1bXB0aW9uIHRoYXQgdGhlIGVqYiBuYW1lcyBhcmUgdW5pcXVlCi0JICogd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgZWFyIGZpbGUuIFRoaXMgd2lsbCBsaWtlbHkgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciB3YXkgZm9yCi0JICogZGVyZWZlcmVuY2luZyBlamIgcmVmcy4KLQkgKiAKLQkgKiBDYW4gYmUgdXNlZCB3aXRoIGVqYiAxLjEgJiBlamIgMi4wIHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIEVqYlJlZgotCSAqICAgICAgICAgICAgcmVmIC0gQW4gZWpiIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIG1vZHVsZVVyaSAtIFRoZSBtb2R1bGUgdXJpCi0JICogQHJldHVybiBFbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihFamJSZWYgcmVmLCBTdHJpbmcgbW9kdWxlVXJpKTsKLQotCXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmksIFN0cmluZyBhbHRERCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgcmVmIHdoaWNoIHJlZmVyZW5jZXMKLQkgKiBAbW9kdWxlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBNb2R1bGVSZWYgZ2V0TW9kdWxlUmVmKE1vZHVsZSBtb2R1bGVEZXNjcmlwdG9yKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2YgYWxsIG1vZHVsZSByZWZzIGluIHRoaXMgRUFSIGhhdmluZyBhIHJlZmVyZW5jZSB0bwotCSAqIEBhTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZHVsZVJlZnMoTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBNb2R1bGVGaWxlczsgYWRkcyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQ7IHVzZQotCSAqIAotCSAqIEBsaW5rIEFyY2hpdmUjYWRkKEZpbGUpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIFJhckZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICogCi0JICogQGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSQVJGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgRkFSRmlsZXM7IGFkZHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkOyB1c2UKLQkgKiB7QGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSl9Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RkFSRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIENvbm5lY3Rvck1vZHVsZVJlZnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb25uZWN0b3JNb2R1bGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHNlY3VyaXR5IHJvbGVzIGZyb20gYWxsIGV4aXN0aW5nIG1vZHVsZXMgKEVqYk1vZHVsZSBhbmQgV2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlc0Zyb21BbGxNb2R1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHNlY3VyaXR5IHJvbGVzIGZyb20gYW4gZXhpc3RpbmcgbW9kdWxlIChFamJNb2R1bGUgYW5kIFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Um9sZXNGcm9tTW9kdWxlKE1vZHVsZSBhTW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIFdhckZpbGVzOyBhZGRzIHdpbGwgbm90IGJlIHJlZmxlY3RlZDsgdXNlCi0JICogCi0JICogQGxpbmsgQXJjaGl2ZSNhZGQoRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXQVJGaWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb2YgV2ViTW9kdWxlUmVmcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYk1vZHVsZVJlZnMoKTsKLQotCS8qKgotCSAqIENvcHkgdGhlIHJvbGUgaW50byBlYWNoIE1vZHVsZUZpbGUgaW4gdGhlIGVhciBmaWxlIHdoaWNoIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiB0aGUgcm9sZQotCSAqIEFzc3VtcHRpb246IGEgcm9sZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKLQkgKiAKLQkgKiBAcm9sZSBleGlzdHMgaW4gdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHB1c2hEb3duUm9sZShTZWN1cml0eVJvbGUgcm9sZSk7Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSByb2xlIGludG8gdGhlIE1vZHVsZUZpbGUgZm9yIHRoZSBtb2R1bGUsIGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgYWxyZWFkeSBjb250YWluIHRoZQotCSAqIHJvbGUgQXNzdW1wdGlvbjogYSByb2xlIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotCSAqIAotCSAqIEByb2xlIGV4aXN0cyBpbiB0aGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHZvaWQgcHVzaERvd25Sb2xlKFNlY3VyaXR5Um9sZSByb2xlLCBNb2R1bGUgYU1vZHVsZSk7Ci0KLQkvKioKLQkgKiBBdHRlbXB0IHRvIHJlbW92ZSB0aGUgbW9kdWxlIGZvciB0aGUgcGFyYW1ldGVyIGZyb20gdGhpcyBvYmplY3QncyBkZCwgdGhlbiByZW1vdmUgdGhlIG1vZHVsZQotCSAqIGZpbGUsIGlmIGl0IGlzIG5vdCByZWZlcmVuY2VkIGZyb20gYW55IG90aGVyIE1vZHVsZVJlZiwgZnJvbSB0aGUgbGlzdCBvZiBmaWxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShNb2R1bGVSZWYgYU1vZHVsZVJlZik7Ci0KLQkvKioKLQkgKiBSZW5hbWUgdGhlIHNlY3VyaXR5IHJvbGUgaW4gdGhlIGVhciBmaWxlJ3MgZGQ7IHB1c2ggdGhpcyBjaGFuZ2UgZG93biB0byBhbnkgY29udGFpbmVkIG1vZHVsZQotCSAqIGRkJ3M7IGlmIHRoZSBtb2R1bGUgc3BlY2lmaWVzIGFuIGFsdC1kZCwgdGhlIGNoYW5nZSB3aWxsIGJlIHJlZmxlY3RlZCB0aGVyZTsgb3RoZXJ3aXNlIGl0Ci0JICogd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIHN0YW5kYXJkIGRkIG9mIHRoZSBtb2R1bGUKLQkgKiAKLQkgKiBAdGhyb3dzIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGRkIGZvciB0aGUgZWFyIGRvZXMgbm90IGNvbnRhaW4gYSByb2xlIHdpdGggdGhlIGV4aXN0aW5nUm9sZU5hbWUKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBkZCBmb3IgdGhlIGVhciBmaWxlIGFscmVhZHkgY29udGFpbnMgYSByb2xlIHdpdGggdGhlIG5ldyBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKFN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBTdHJpbmcgbmV3Um9sZU5hbWUpIHRocm93cyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JLyoqCi0JICogRm9yIGVhY2ggc2VjdXJpdHkgcm9sZSBpbiB0aGUgZGQgZm9yIGVhY2ggbW9kdWxlLCBhZGQgYSBjb3B5IHRvIHRoZSBlYXIgZmlsZSdzIGRkOyBpZiBhbgotCSAqIGFsdC1kZCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBtb2R1bGUsIHVzZSB0aGF0IGRkOyBvdGhlcndpc2UgdXNlIHRoZSBzdGFuZGFyZCBkZCBpbiB0aGUgbW9kdWxlCi0JICogZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJvbGxVcFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBGb3IgZWFjaCBzZWN1cml0eSByb2xlIGluIHRoZSBkZCBmb3IgYSBtb2R1bGUsIGFkZCBhIGNvcHkgdG8gdGhlIGVhciBmaWxlJ3MgZGQ7IGlmIGFuIGFsdC1kZAotCSAqIGlzIHNwZWNpZmllZCBmb3IgdGhlIG1vZHVsZSwgdXNlIHRoYXQgZGQ7IG90aGVyd2lzZSB1c2UgdGhlIHN0YW5kYXJkIGRkIGluIHRoZSBtb2R1bGUgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJvbGxVcFJvbGVzKE1vZHVsZSBhTW9kdWxlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIE1vZHVsZVJlZnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1vZHVsZVJlZnMoKTsKLQotCXB1YmxpYyBMaXN0IGdldEFyY2hpdmVzT2ZUeXBlKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybiBhIE1hcCBvZiBNb2R1bGVzIGFzIGtleXMgYW5kIGEgTGlzdCBvZiBFSkIgUmVmZXJlbmNlcyBhcyB0aGUgdmFsdWVzLiBUaGlzIHdpbGwgbGV0IHlvdQotCSAqIGtub3cgd2hpY2ggTW9kdWxlcyB0aGUgcmVmZXJlbmNlcyBjYW1lIGZyb20uIFlvdSBjYW4gZmlsdGVyIHRoZSBsaXN0IG9mIEVKQiBSZWZlcmVuY2VzCi0JICogcmV0dXJuZWQgb24gdGhlIGxpbmtlZCBhdHRyaWJ1dGVkIG9mIHRoZSByZWZlcmVuY2UuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGZpbHRlciBsaW5rZWQKLQkgKiByZWZlcmVuY2VzLCBub24tbGlua2VkIHJlZmVyZW5jZXMsIG9yIG5laXRoZXIgKGkuZS4sIHJldHVybiBhbGwgcmVmZXJlbmNlcykuCi0JICovCi0JTWFwIGdldEVKQlJlZmVyZW5jZXMoYm9vbGVhbiBmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzLCBib29sZWFuIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VKQkphckZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0VKQkphckZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiZDBhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJKYXJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkphckZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlIHsKLQotCS8qKgotCSAqIFVzZWQgZm9yIHRvb2xzIHBlcmZvcm1pbmcgc2VsZWN0aXZlIGltcG9ydAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFzc29jaWF0ZWRGaWxlcyhFbnRlcnByaXNlQmVhbiBlamIpOwotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0JRUpCSmFyIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIGlzSW1wb3J0ZWRGcm9tMTAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlcGxveW1lbnREZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoRUpCSmFyIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRUpCTW9kdWxlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJNb2R1bGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjNTA3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9FSkJNb2R1bGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBFSkJNb2R1bGVSZWYgZXh0ZW5kcyBNb2R1bGVSZWYgewotCi0JRUpCSmFyIGdldEVKQkphcigpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbjsKLQotfSAvL0VKQk1vZHVsZVJlZgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODE0ZTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWxlIGV4dGVuZHMgRU9iamVjdHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB1cCB0byB0aGUgZmlsZW5hbWU7IGUuZy4sIGZyb20gY29tL2libS9mb28vYmFyLmNsYXNzLCBjb20vaWJtL2ZvbwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VVJJKCk7Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhaWwgb2YgdGhlIGZpbGUgcGF0aDsgZS5nLiwgZnJvbSBjb20vaWJtL2Zvby9iYXIuY2xhc3MsIHJldHVybiBiYXIuY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FyY2hpdmUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUkZpbGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzRkFSRmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNFSkJKYXJGaWxlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZHVsZUZpbGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzUkFSRmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seURpcmVjdG9yeSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNXQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBVUkkgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVSSSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFVSSShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGFzdE1vZGlmaWVkIGF0dHJpYnV0ZQotCSAqLwotCWxvbmcgZ2V0TGFzdE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2dldExhc3RNb2RpZmllZCA8ZW0+TGFzdCBNb2RpZmllZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAc2VlICN1bnNldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjZ2V0TGFzdE1vZGlmaWVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjZ2V0TGFzdE1vZGlmaWVkIDxlbT5MYXN0IE1vZGlmaWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBzZWUgI2dldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjc2V0TGFzdE1vZGlmaWVkKGxvbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSNnZXRMYXN0TW9kaWZpZWQgPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXN0IE1vZGlmaWVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBzZWUgI2dldExhc3RNb2RpZmllZCgpCi0JICogQHNlZSAjc2V0TGFzdE1vZGlmaWVkKGxvbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNpemUgYXR0cmlidXRlCi0JICovCi0JbG9uZyBnZXRTaXplKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5GaWxlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTaXplKCkKLQkgKiBAc2VlICN1bnNldFNpemUoKQotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNpemUobG9uZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAnCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLkZpbGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2lzU2V0U2l6ZSgpCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQHNlZSAjc2V0U2l6ZShsb25nKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTaXplKCkKLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAc2VlICNzZXRTaXplKGxvbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXJlY3RvcnkgRW50cnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseQotCSAqIHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI3Vuc2V0RGlyZWN0b3J5RW50cnkoKQotCSAqIEBzZWUgI3NldERpcmVjdG9yeUVudHJ5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5Db21tb25hcmNoaXZlUGFja2FnZSNnZXRGaWxlX0RpcmVjdG9yeUVudHJ5KCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0RpcmVjdG9yeUVudHJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlI2lzRGlyZWN0b3J5RW50cnkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjdW5zZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjaXNEaXJlY3RvcnlFbnRyeSA8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUjaXNEaXJlY3RvcnlFbnRyeSA8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlyZWN0b3J5IEVudHJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjaXNEaXJlY3RvcnlFbnRyeSgpCi0JICogQHNlZSAjc2V0RGlyZWN0b3J5RW50cnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBPcmlnaW5hbFVSSSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0T3JpZ2luYWxVUkkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBPcmlnaW5hbFVSSSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE9yaWdpbmFsVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIExvYWRpbmdDb250YWluZXIgcmVmZXJlbmNlCi0JICovCi0JQ29udGFpbmVyIGdldExvYWRpbmdDb250YWluZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvYWRpbmdDb250YWluZXIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb2FkaW5nQ29udGFpbmVyKENvbnRhaW5lciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIENvbnRhaW5lciByZWZlcmVuY2UKLQkgKi8KLQlDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb250YWluZXIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFjY2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0dlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciB7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBjb250cmlidXRvcnMgc2hvdWxkIHVzZSB0byBzcGVjaWZ5IHRoZSBnZW5lcmljIHR5cGUgdGhhdAotCSAqIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggYXJjaGl2ZXMuIEV4YW1wbGU6IGNvbS55b3VyY29tcGFueS5qMmVlLmV4dGVuc2lvbi5jdXN0b21Nb2R1bGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlS2V5KCk7Ci0KLQkvKioKLQkgKiBJZiBjb21tb24gYXJjaGl2ZSBzaG91bGQgcmVjb2duaXplIGZpbGUgZXh0ZW5zaW9ucyBvdGhlciB0aGFuIHRoZSBzdGFuZGFyZCBvbmVzLCBlLmcuLCAuamFyLAotCSAqIC56aXAsIHRoZW4gdGhlc2UgZmlsZSBleHRlbnNpb25zIGNhbiBiZSBzcGVjaWZpZWQgaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEN1c3RvbUZpbGVFeHRlbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgdGhhdCBpbmRpdmlkdWFsIGRpc2NyaW1pbmF0b3JzIGNhbiBpbXBsZW1lbnQgdG8gZGV0ZXJtaW5lIGlmIGFuIEFyY2hpdmUgaXMgb2YgYQotCSAqIHBhcnRpY3VsYXIgdHlwZS4gSW1wbGVtZW50ZXJzIHNob3VsZCBiZSBzZW5zaXRpdmUgdG8gcGVyZm9ybWFuY2UgcmVxdWlybWVudHMuIFVzdWFsbHkgc2ltcGxlCi0JICogdGVzdHMgc2hvdWxkIGJlIHBlcmZvcm1lZCwgc3VjaCBhczoKLQkgKiA8Y29kZT5pZiAoYW5BcmNoaXZlLmNvbnRhaW5zRmlsZSgieHh4LnhtbCIpPGNvZGU+LiAgVGhlIHJlc3VsdCB3aWxsCi0JICogYmUgc3RvcmVkIGluIHRoZSBBcmNoaXZlJ3MgInR5cGVzIiBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGFuQXJjaGl2ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNjcmltaW5hdGUoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDRiODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvTW9kdWxlRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZUZpbGUgZXh0ZW5kcyBBcmNoaXZlIHsKLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb247Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lciBmb3IgdGhpcyBhcmNoaXZlIGNhc3RlZCB0byBFQVJGaWxlOyBudWxsIGlmIHRoaXMgZmlsZSBpcyBub3QgY29udGFpbmVkCi0JICogaW4gYW4gRUFSRmlsZQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGdldEVBUkZpbGUoKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkV4cG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3kgZ2V0RXhwb3J0U3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGdldEltcG9ydFN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBmaWxlLiBGb3IgZXhhbXBsZSwgIjIuMCIKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCwgVXNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gSUQgb2YgdGhlIG1vZHVsZSBGb3IgZXhhbXBsZSwgIjIwIgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTcGVjVmVyc2lvbklEKCk7Ci0KLQlFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgbnVsbDsgdXNlZCBmb3IgY29weSwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi0JICogaW1wb3J0IHN0cmF0ZWd5IG5lZWRzIHRvIGJlIGNvcGllZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4cG9ydFN0cmF0ZWd5Ci0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLkV4cG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5FeHBvcnRTdHJhdGVneSBuZXdFeHBvcnRTdHJhdGVneSk7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdJbXBvcnRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcG9ydFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IG5ld0ltcG9ydFN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIEoyRUUgdmVyc2lvbiBmb3IgdGhpcyBhcmNoaXZlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKGludCB2ZXJzaW9uSUQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Nb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL01vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQ4ZjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL01vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZVJlZiBleHRlbmRzIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcnNlZCBsb2NhbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUgTW9kdWxlRmlsZQotCSAqLwotCUVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXJzZWQgYWx0IGRkLCBpZiBpdCBleGlzdHMsIGZyb20gdGhlIEVBUiBmaWxlIGNvbnRhaW5pbmcgdGhpcyBtb2R1bGUKLQkgKi8KLQlFT2JqZWN0IGdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFsdCBkZCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB0aGUgbG9jYWwgZGQKLQkgKi8KLQlFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSB1cmkgZnJvbSB0aGUge0BsaW5rIE1vZHVsZX1yZWZlcmVuY2VkIGJ5IHRoaXMgcmVmOyBpZiB0aGVyZSBpcyBubyBtb2R1bGUsIChlZy4gYQotCSAqIHN0YW5kYWxvbmUgSkFSKSwgZ2V0cyB0aGUgdXJpIGZyb20gdGhlIHtAbGluayBNb2R1bGVGaWxlfS4gQXNzdW1wdGlvbjogVGhlIHVyaSBvZiB0aGUKLQkgKiB7QGxpbmsgTW9kdWxlfWFuZCB7QGxpbmsgTW9kdWxlRmlsZX1zaG91bGQgc3RheSBpbiBzeW5jCi0JICovCi0JU3RyaW5nIGdldFVyaSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBNb2R1bGVGaWxlIHJlZmVyZW5jZQotCSAqLwotCU1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZSgpOwotCi0JLyoqCi0JICogU2ltaWxhciB0byB7QGxpbmsgQXJjaGl2ZSNnZXRNb2ZSZXNvdXJjZShTdHJpbmcpfSwgZXhjZXB0IHRoYXQgYWx0LWRkIGluZGlyZWN0aW9uIGlzCi0JICogY29uc2lkZXJlZC4gSWYgdGhpcyBtb2R1bGUgdXNlcyBhbiBhbHQtZGQsIHRoZW4gdGhlIHVyaSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIHRoZSAiYWx0LXJvb3QiCi0JICogYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBvd25pbmcgRUFSIGZpbGUuIEluIHRoaXMgY2FzZSwgYWxsIGhyZWZzIGludG8gYW5kCi0JICogb3V0IG9mIHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBFQVIuIFRoZSBocmVmcyBhcmUgdGFrZW4gY2FyZSBvZgotCSAqIGZvciBmcmVlIHdoZW4gdGhlIGNsaWVudCB1c2VzIHtAbGluayAjbWFrZUFsdERlc2NyaXB0b3JzQW5kUmVzb3VyY2VzKCl9LiBUaGUgYWx0IHJvb3QgaXMKLQkgKiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aGVuIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqIAotCSAqIEBzZWUgTW9kdWxlRXh0ZW5zaW9uI2dldEFsdFJvb3QoKQotCSAqLwotCVJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBbHRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRMb2NhbFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGlucHV0IHN0cmVhbSBmcm9tIHRoZSByZXNvdXJjZXMgcGF0aCBvZiBlaXRoZXIgdGhlIE1vZHVsZUZpbGUsIGlmIHRoZSBtb2R1bGUgZG9lcwotCSAqIG5vdCB1c2UgYWx0LWRkLCBvciBmcm9tIHRoZSBhbHRSb290IG9mIHRoZSBtb2R1bGUsIGZvdW5kIGluIHRoZSByZXNvdXJjZXMgcGF0aCBvZiB0aGUgRUFSCi0JICogCi0JICogQHNlZSBMb2FkU3RyYXRlZ3kjZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBSZXRyaWV2ZSBhIHJlc291cmNlIGZyb20gdGhlIE1vZHVsZUZpbGUKLQkgKiAKLQkgKiBAc2VlIEFyY2hpdmUjZ2V0TW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCVJlc291cmNlIGdldExvY2FsTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhlIHVyaSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIHRoZSAiYWx0LXJvb3QiIGFuZCB0aGUgcmVzb3VyY2Ugd2lsbCBiZSBsb2FkZWQgZnJvbSB0aGUgb3duaW5nCi0JICogRUFSIGZpbGUuCi0JICovCi0JUmVzb3VyY2UgZ2V0QWx0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vZiByZXNvdXJjZSBhbmQgYWRkIGl0IHRvIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIGNvbnRleHQgb2YgZWl0aGVyIHRoZSBtb2R1bGUKLQkgKiBmaWxlIGlmIHRoaXMgTW9kdWxlUmVmIGlzIG5vdCBhbiBhbHQsIG9yIHRvIHRoZSBFQVIgZmlsZSBpZiBpdCBpcyBhbiBhbHQuIElmIHRoaXMgbW9kdWxlIGlzCi0JICogdXNlcyBhbiBhbHQtZGQsIHRoZW4gdGhlIHVyaSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIHRoZSAiYWx0LXJvb3QiIFRoZSBhbHQgcm9vdCBpcwotCSAqIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHdoZW4gaXQgZG9lcyBub3QgZXhpc3QuCi0JICogCi0JICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgYXJjaGl2ZSBoYXZpbmcgdGhlIHVyaQotCSAqLwotCVJlc291cmNlIG1ha2VNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0JUmVzb3VyY2UgbWFrZUxvY2FsTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCVJlc291cmNlIG1ha2VBbHRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBNb2R1bGVGaWxlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TW9kdWxlRmlsZShNb2R1bGVGaWxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJlbmFtZSB0aGlzIG1vZHVsZTsgYm90aCBpdHMgTW9kdWxlRmlsZSBhbmQgTW9kdWxlIGVsZW1lbnQgZnJvbSB0aGUgQXBwbGljYXRpb24gZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpOwotCi0JYm9vbGVhbiBpc0VKQigpOwotCi0JYm9vbGVhbiBpc1dlYigpOwotCi0JYm9vbGVhbiBpc0NsaWVudCgpOwotCi0JYm9vbGVhbiBpc0Nvbm5lY3RvcigpOwotCi0JYm9vbGVhbiB1c2VzQWx0REQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgRWFyRmlsZSByZWZlcmVuY2UKLQkgKi8KLQlFQVJGaWxlIGdldEVhckZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVhckZpbGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRFYXJGaWxlKEVBUkZpbGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNb2R1bGUoTW9kdWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2UjZ2V0TW9kdWxlUmVmX01vZHVsZSgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2R1bGUgZ2V0TW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWYjZ2V0TW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb2R1bGUoTW9kdWxlIHZhbHVlKTsKLQotfSAvL01vZHVsZVJlZgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUkFSRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUkFSRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmRkZjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JBUkZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSQVJGaWxlIGV4dGVuZHMgTW9kdWxlRmlsZXsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZXBsb3ltZW50RGVzY3JpcHRvcihDb25uZWN0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5Db21tb25hcmNoaXZlUGFja2FnZSNnZXRSQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbm5lY3RvciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZSNnZXREZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoQ29ubmVjdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSBSQVIgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgZm9yIGV4cGFuZGluZwotCSAqIHRoZSBSQVIgZmlsZSBpZiBpdCBpcyBhIHN0YW5kYWxvbmUgUkFSLiBJZiB0aGUgUkFSIGZpbGUgaXMgcGFja2FnZWQgYXMgcGFydCBvZiBhbiBFQVIsIHRoaXMKLQkgKiBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLiBJbnN0ZWFkLCB0aGUgZXhwYW5kVG8oKSBvZiB0aGUgRUFSIHNob3VsZCBiZSB1c2VkIGV4cGFuZCB0aGUKLQkgKiBjb250ZW50cyBvZiB0aGUgZWFyIGFuZCB0aGUgbmVzdGVkIFJBUiByZWxhdGl2ZSB0byB0aGUgRUFSJ3MgZGlyZWN0b3J5IChzaW1pbGFyIHRvIFdBUidzKS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMi82LzIwMDEgNzo0NDo0MSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGV4cGFuZEZsYWdzCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQl2b2lkIGV4dHJhY3RUb0Nvbm5lY3RvckRpcmVjdG9yeShTdHJpbmcgZGlyLCBpbnQgZXhwYW5kRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlYWRPbmx5RGlyZWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZWFkT25seURpcmVjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VmNzYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlYWRPbmx5RGlyZWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5RGlyZWN0b3J5IGV4dGVuZHMgQ29udGFpbmVyIHsKLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KFN0cmluZyB1cmkpOwotCi0JcHVibGljIEZpbGUgZ2V0RmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KFN0cmluZyB1cmkpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBmbGF0IGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBjb250YWluZWQgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIHN1YmRpcmVjdG9yaWVzLCB3aXRoIHRoZQotCSAqIGRpcmVjdG9yaWVzIGZpbHRlcmVkIG91dCwgYXMgdGhlIGxpc3Qgd291bGQgYXBwZWFyIGluIGFuIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWxlc1JlY3Vyc2l2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgZmlsZXMgd2l0aCBqdXN0IHRoZSBpbnN0YW5jZXMgb2YgUmVhZE9ubHlEaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWFkT25seURpcmVjdG9yaWVzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZXBhaXJBcmNoaXZlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUmVwYWlyQXJjaGl2ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjZmUyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZXBhaXJBcmNoaXZlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yNy8wMSAyOjIwOjQ0IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBhaXJBcmNoaXZlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJvdGVjdGVkIEFyY2hpdmUgYXJjaGl2ZTsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBkaXJlY3RvcnlOYW1lczsKLQotCS8qKgotCSAqIFJlcGFpck1ldGFJbmZDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlcGFpckFyY2hpdmVDb21tYW5kKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXN1cGVyKCJSZXBhaXIgQXJjaGl2ZSIsIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSZXBhaXJzX2FsbF9lbnRyaWVzX2luX3RoZSIpKTsgLy8kTk9OLU5MUy0yJCA9ICJSZXBhaXJzIGFsbCBlbnRyaWVzIGluIHRoZSBNRVRBLUlORiBhbmQvb3IgV0VCLUlORiBkaXJlY3RvcmllcyB0byBiZSB0aGUgY29ycmVjdCBjYXNlIi8vJE5PTi1OTFMtMSQKLQkJYXJjaGl2ZSA9IGFuQXJjaGl2ZTsKLQkJLy9FbnN1cmUgSW5pdGlhaWxpemF0aW9uCi0JCWdldERpcmVjdG9yeU5hbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb24uY29tbWFuZC5Db21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTGlzdCBmaWxlcyA9IGFyY2hpdmUuZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpIHsKLQkJCQluZXcgUmVwYWlyQXJjaGl2ZUNvbW1hbmQoKEFyY2hpdmUpIGFGaWxlKS5leGVjdXRlKCk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyB1cHBlclVyaSA9IGFGaWxlLmdldFVSSSgpLnRvVXBwZXJDYXNlKCk7Ci0JCQkJSXRlcmF0b3Iga2V5c0FuZFZhbHVlcyA9IGRpcmVjdG9yeU5hbWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoa2V5c0FuZFZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIHVyaSA9IGFGaWxlLmdldFVSSSgpOwotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBrZXlzQW5kVmFsdWVzLm5leHQoKTsKLQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodXBwZXJVcmkuc3RhcnRzV2l0aChrZXkpICYmICF1cmkuc3RhcnRzV2l0aCh2YWx1ZSkpIHsKLQkJCQkJCVN0cmluZyB0YWlsID0gdXJpLnN1YnN0cmluZyhrZXkubGVuZ3RoKCkpOwotCQkJCQkJYUZpbGUuc2V0VVJJKHZhbHVlLmNvbmNhdCh0YWlsKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE0LzAxIDU6NTU6MTQgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBqYXZhLnV0aWwuTWFwIGdldERpcmVjdG9yeU5hbWVzKCkgewotCQlpZiAoZGlyZWN0b3J5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlyZWN0b3J5TmFtZXMgPSBuZXcgSGFzaE1hcCg2KTsKLQkJCWRpcmVjdG9yeU5hbWVzLnB1dChKMkVFQ29uc3RhbnRzLk1FVEFfSU5GLnRvVXBwZXJDYXNlKCksIEoyRUVDb25zdGFudHMuTUVUQV9JTkYpOwotCQkJZGlyZWN0b3J5TmFtZXMucHV0KEoyRUVDb25zdGFudHMuV0VCX0lORi50b1VwcGVyQ2FzZSgpLCBKMkVFQ29uc3RhbnRzLldFQl9JTkYpOwotCQkJZGlyZWN0b3J5TmFtZXMucHV0KEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkudG9VcHBlckNhc2UoKSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSk7Ci0JCQlkaXJlY3RvcnlOYW1lcy5wdXQoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkudG9VcHBlckNhc2UoKSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCQl9Ci0JCXJldHVybiBkaXJlY3RvcnlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXthcmNoaXZlfSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTQvMDEgNjo0NjoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoIXZhbGlkYXRlQXJncyhhcmdzKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLnByaW1PcGVuQXJjaGl2ZShhcmdzWzBdKTsKLQkJCW5ldyBSZXBhaXJBcmNoaXZlQ29tbWFuZChhbkFyY2hpdmUpLmV4ZWN1dGUoKTsKLQkJCWFuQXJjaGl2ZS5zYXZlQXMoYXJnc1sxXSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSZXBhaXJfY29tbWFuZF9mYWlsZWRfLV9leF9FWENfIikpOyAvLyROT04tTkxTLTEkID0gIlJlcGFpciBjb21tYW5kIGZhaWxlZCAtIGV4Y2VwdGlvbiBzdGFjayB0cmFjZToiCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uLmNvbW1hbmQuQ29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUFyZ3MoU3RyaW5nW10gYXJncykgewotCQlpZiAoIShhcmdzLmxlbmd0aCA9PSAyKSkgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmVwYWlyQXJjaGl2ZUNvbW1hbmRfdXNhZ2UiKSk7IC8vJE5PTi1OTFMtMSQgPSAiUmVwYWlyQXJjaGl2ZUNvbW1hbmQgdXNhZ2U6ICA8c291cmNlSmFyRmlsZVBhdGg+IDxkZXN0aW5hdGlvblBhdGg+IgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShhcmdzWzBdKTsKLQkJYm9vbGVhbiBpc1ppcCA9IGZhbHNlOwotCQlqYXZhLnV0aWwuemlwLlppcEZpbGUgemlwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXppcCA9IG5ldyBqYXZhLnV0aWwuemlwLlppcEZpbGUoZmlsZSk7Ci0JCQlpc1ppcCA9IHRydWU7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCWlzWmlwID0gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoemlwICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJemlwLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJfQotCQlpZiAoIWlzWmlwICYmICFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmVwYWlyQXJjaGl2ZUNvbW1hbmRfdXNhZ2UxX0VSUk9SXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXBhaXJBcmNoaXZlQ29tbWFuZCB1c2FnZTogc291cmNlSmFyRmlsZVBhdGggbXVzdCBwb2ludCB0byBhIHZhbGlkIGFyY2hpdmUgb3IgZGlyZWN0b3J5IG9mIGFuIGluZmxhdGVkIGFyY2hpdmUiCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG5ldyBqYXZhLmlvLkZpbGUoYXJnc1sxXSkuY2FuV3JpdGUoKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJyZXBhaXJfdXNhZ2VfRVJST1JfIiwgKG5ldyBPYmplY3RbXXthcmdzWzFdfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXBhaXJBcmNoaXZlQ29tbWFuZCB1c2FnZTogY2Fubm90IHdyaXRlIHRvIGRlc3RpbmF0aW9uUGF0aCAiCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvVmFsaWRhdGVYbWxDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9WYWxpZGF0ZVhtbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2YmZiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9WYWxpZGF0ZVhtbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkNvbGxlY3RpbmdFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLlhtbERvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAxMDowNDowOCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVYbWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcm90ZWN0ZWQgTGlzdCByZXN1bHRzOwotCXByb3RlY3RlZCBNb2R1bGVGaWxlIGFyY2hpdmU7Ci0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOZXN0ZWQgPSB0cnVlOwotCi0JLyoqCi0JICogVmFsaWRhdGVYbWxDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFZhbGlkYXRlWG1sQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZVhtbENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGVYbWxDb21tYW5kKE1vZHVsZUZpbGUgbSkgewotCQlzdXBlcigpOwotCQlhcmNoaXZlID0gbTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZVhtbENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdGVYbWxDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVYbWxDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFZhbGlkYXRlWG1sQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRhdGVYbWwoKTsKLQkJaWYgKGlzVmFsaWRhdGVOZXN0ZWQoKSkgewotCQkJTGlzdCBhcmNoaXZlcyA9IGFyY2hpdmUuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQXJjaGl2ZSBhID0gKEFyY2hpdmUpIGFyY2hpdmVzLmdldChpKTsKLQkJCQlpZiAoIWEuaXNNb2R1bGVGaWxlKCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCU1vZHVsZUZpbGUgbSA9IChNb2R1bGVGaWxlKSBhOwotCQkJCVZhbGlkYXRlWG1sQ29tbWFuZCBjbWQgPSBuZXcgVmFsaWRhdGVYbWxDb21tYW5kKG0pOwotCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJcmVzdWx0cy5hZGRBbGwoY21kLmdldFJlc3VsdCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gTGlzdCBvZiBYbWxWYWxpZGF0aW9uUmVzdWx0OyAxIGZvciB0aGUgYXJjaGl2ZSwgYW5kIG9uZSBmb3IgZWFjaCBuZXN0ZWQgbW9kdWxlIGZpbGUKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzIyLzIwMDEgMTowNjo1MiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlTmVzdGVkKCkgewotCQlyZXR1cm4gdmFsaWRhdGVOZXN0ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMjIvMjAwMSAxOjA2OjUyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWxpZGF0ZU5lc3RlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlTmVzdGVkKGJvb2xlYW4gbmV3VmFsaWRhdGVOZXN0ZWQpIHsKLQkJdmFsaWRhdGVOZXN0ZWQgPSBuZXdWYWxpZGF0ZU5lc3RlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0YXRlWG1sKCkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlSZXNvdXJjZSByZXMgPSBhcmNoaXZlLmdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKS5lUmVzb3VyY2UoKTsKLQkJWG1sVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgWG1sVmFsaWRhdGlvblJlc3VsdCgpOwotCQlyZXN1bHQuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJdHJ5IHsKLQkJCXJlcy5zYXZlKGJvcywgbmV3IGphdmEudXRpbC5IYXNoTWFwKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKTsKLQkJSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKGluU3RyZWFtKTsKLQkJQ29sbGVjdGluZ0Vycm9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENvbGxlY3RpbmdFcnJvckhhbmRsZXIoKTsKLQkJWG1sRG9jdW1lbnRSZWFkZXIgcGFyc2VBZGFwdGVyID0gbmV3IFhtbERvY3VtZW50UmVhZGVyKHNvdXJjZSwgbnVsbCwgaGFuZGxlcik7Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyB0cnkvY2F0Y2ggY2xhdXNlIGlzIGFkZGVkIHRvIGhhbmRsZSB0aGUgY2FzZQotCQkvLyB3aGVuIFNBWCBwYXJzZXIgdGhyb3dzIGEgZmF0YWwgZXhjZXB0aW9uICh0eXBlIFNBWEV4Y2VwdGlvbikKLQkJLy8gZm9yIHVubWF0Y2hpbmcgZW5kIHRhZyB0aGF0IHJlc3VsdHMgaW4gYSBSdW50aW1lRXhjZXB0aW9uIHRvCi0JCS8vIGJlIHRocm93bi4gTmVlZCB0byBjYXRjaCBpdCBzbyB3ZSBjYW4gZ2V0IHRoZSBwYXJzZXIgZXhjZXB0aW9ucwotCQkvLyBhbmQgZGlzcGxheSB0aGVtIHRvIHRoZSB1c2VyLgotCQl0cnkgewotCQkJcGFyc2VBZGFwdGVyLnBhcnNlRG9jdW1lbnQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCi0JCQlpZiAoaGFuZGxlci5nZXRDYXVnaHRFeGNlcHRpb25zKCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5zZXRBcmNoaXZlKGFyY2hpdmUpOwotCQkJCXJlc3VsdC5zZXRDYXVnaHRFeGNlcHRpb25zKGhhbmRsZXIuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpKTsKLQkJCQlyZXN1bHRzLmFkZChyZXN1bHQpOwotCQkJfQotCi0JCQl0aHJvdyByZTsKLQkJfQotCi0JCXJlc3VsdC5zZXRBcmNoaXZlKGFyY2hpdmUpOwotCQlyZXN1bHQuc2V0Q2F1Z2h0RXhjZXB0aW9ucyhoYW5kbGVyLmdldENhdWdodEV4Y2VwdGlvbnMoKSk7Ci0JCXJlc3VsdHMuYWRkKHJlc3VsdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV0FSRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvV0FSRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODA3ZTZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dBUkZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdBUkZpbGUgZXh0ZW5kcyBNb2R1bGVGaWxlIHsKLQotCS8qKgotCSAqIENvcHkgdGhlIGZpbGUsIGFuZCBzd2l6emxlIHRoZSBmaWxlIHVyaSBpZiBuZWNlc3NhcnkgYnkgcHJlcGVuZGluZyB0aGUgY2xhc3NlcyBkaXJlY3RvcnkKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIG9mIGEgZmlsZSB3aXRoIHRoZSBtb2RpZmllZCB1cmkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUKLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBSZWFkT25seURpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHlDbGFzcyhGaWxlIGFGaWxlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvcHkgdGhlIGZpbGUsIGFuZCBzd2l6emxlIHRoZSBmaWxlIHVyaSBpZiBuZWNlc3NhcnkgYnkgcHJlcGVuZGluZyB0aGUgbGlicyBkaXJlY3RvcnkKLQkgKiAKLQkgKiBAdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIG9mIGEgZmlsZSB3aXRoIHRoZSBtb2RpZmllZCB1cmkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUKLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBSZWFkT25seURpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHlMaWIoRmlsZSBhRmlsZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBnZXRDbGFzc2VzKCkgLSBmaWx0ZXIgZmlsZXMgdG8gcmV0dXJuIHRoZSBjbGFzcyBmaWxlcyBmcm9tIFx3ZWItaW5mXGNsYXNzZXMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBEZXBsb3ltZW50RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRmlsdGVyIGZpbGVzIHRvIHJldHVybiB0aGUgZmlsZXMgZnJvbSBcd2UtaW5mXGxpYgotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpYnMoKTsKLQotCS8qKgotCSAqIEZpbHRlciBmaWxlcyB0byByZXR1cm4gdGhlIEpBUnMgYW5kIFppcHMgZnJvbSBcd2UtaW5mXGxpYgotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpYkFyY2hpdmVzKCk7Ci0KLQkvKioKLQkgKiBnZXRSZXNvdXJjZXMoKSAtIGZpbHRlciBmaWxlcyB0byByZXR1cm4gdGhlIFdlYiByZXNvdXJjZXMgd2l0aGluIHRoZSBXQVIgKG5vCi0JICogY2xhc3Nlcy9saWJzL21ldGFkYXRhKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VyY2UgZmlsZSB0aGF0IG1hdGNoZXMgdGhlIG91dHB1dCBmaWxlIHBhc3NlZCBpbgotCSAqIAotCSAqIEBwYXJhbSBhQ2xhc3NGaWxlCi0JICogICAgICAgICAgICBUaGUgLmNsYXNzIGZpbGUgb3Igb3RoZXIgb3V0cHV0IGZpbGUgdG8gZmluZCB0aGUgc291cmNlIGZvcgotCSAqIEByZXR1cm4gU3RyaW5nIFRoZSBtYXRjaGluZyBzb3VyY2UuIE51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc291cmNlIGZvdW5kCi0JICovCi0JcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZShGaWxlIGFDbGFzc0ZpbGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVwbG95bWVudERlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHAgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9XZWJNb2R1bGVSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dlYk1vZHVsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRhM2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1dlYk1vZHVsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViTW9kdWxlUmVmIGV4dGVuZHMgTW9kdWxlUmVmIHsKLQlXZWJBcHAgZ2V0V2ViQXBwKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi19IC8vV2ViTW9kdWxlUmVmCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9YbWxWYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9YbWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTk1ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvWG1sVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMzozMTo1MyBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgWG1sVmFsaWRhdGlvblJlc3VsdCB7Ci0JcHJvdGVjdGVkIE1vZHVsZUZpbGUgYXJjaGl2ZTsKLQlwcm90ZWN0ZWQgTGlzdCBjYXVnaHRFeGNlcHRpb25zOwotCi0JLyoqCi0JICogWG1sVmFsaWRhdGlvblJlc3VsdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYbWxWYWxpZGF0aW9uUmVzdWx0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzE5LzAxIDM6MzQ6NDUgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLk1vZHVsZUZpbGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZSBnZXRBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAzOjM0OjQ1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIGNhdWdodEV4Y2VwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMzozNDo0NSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QXJjaGl2ZQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Nb2R1bGVGaWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZShNb2R1bGVGaWxlIG5ld0FyY2hpdmUpIHsKLQkJYXJjaGl2ZSA9IG5ld0FyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMTkvMDEgMzozNDo0NSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q2F1Z2h0RXhjZXB0aW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXVnaHRFeGNlcHRpb25zKGphdmEudXRpbC5MaXN0IG5ld0NhdWdodEV4Y2VwdGlvbnMpIHsKLQkJY2F1Z2h0RXhjZXB0aW9ucyA9IG5ld0NhdWdodEV4Y2VwdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDU4YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBub24tcnVudGltZSBleGNlcHRpb25zIG9jY3VycmluZyB3aXRoIG1hbmlwdWxhdGlvbiBvZiBhcmNoaXZlcwotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBcmNoaXZlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlUnVudGltZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhhZTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRSdW50aW1lRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBCYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgcnVudGltZSBleGNlcHRpb25zIG9jY3VycmluZyB3aXRoIG1hbmlwdWxhdGlvbiBvZiBhcmNoaXZlczsgdGhlcmUgYXJlCi0gKiBzb21lIHNpdHVhdGlvbnMgd2hlcmUgd2UgY2FuIG9ubHkgdGhyb3cgYSBydW50aW1lIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIGEgc3VidHlwZSBvZiBleGNlcHRpb24sCi0gKiBiZWNhdXNlIHRoZSBzaWduYXR1cmVzIG9mIGV0b29scyBnZW5lcmF0ZWQgbWV0aG9kcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiB0byB0aHJvdyBhbnkgZXhjZXB0aW9uCi0gKiBvdGhlciB0aGFuIHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzdmYmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBub24tcnVudGltZSBleGNlcHRpb25zIG9jY3VycmluZyB3aXRoIG1hbmlwdWxhdGlvbiBvZiBhcmNoaXZlcywgd2hlcmUgYQotICogY2F1Z2h0IGV4Y2VwdGlvbiBjYXVzZXMgdGhpcyBleGNlcHRpb24gdG8gYmUgdGhyb3duCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRFeGNlcHRpb24gaW1wbGVtZW50cyBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwMjVmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gd2hpY2ggY2FuIG9jY3VyIGlmIGFuIGVycm9yL2V4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgbG9hZGluZyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICovCi1wdWJsaWMgY2xhc3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0R1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0R1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDBlYTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB3aGljaCBjYW4gb2NjdXIgd2hlbiBhbiBhdHRlbXAgaXMgbWFkZSB0byBhZGQgdG8gYSBsaXN0IGFuIG9iamVjdCBlcXVhbGluZywgb3IgaGF2aW5nCi0gKiB0aGUgc2FtZSBuYW1lLCBpZCwgZXRjLCBhcyBhbm90aGVyIG9iamVjdCBpbiB0aGUgbGlzdC4KLSAqLwotcHVibGljIGNsYXNzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVFeGNlcHRpb24gewotCXByb3RlY3RlZCBPYmplY3QgZHVwbGljYXRlOwotCi0JLyoqCi0JICogRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKFN0cmluZyBzLCBPYmplY3QgbykgewotCQlzdXBlcihzKTsKLQkJc2V0RHVwbGljYXRlKG8pOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA0LzE2LzAxIDk6NDM6MDAgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RHVwbGljYXRlKCkgewotCQlyZXR1cm4gZHVwbGljYXRlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA0LzE2LzAxIDk6NDM6MDAgQU0pCi0JICogCi0JICogQHBhcmFtIG5ld0R1cGxpY2F0ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldER1cGxpY2F0ZShqYXZhLmxhbmcuT2JqZWN0IG5ld0R1cGxpY2F0ZSkgewotCQlkdXBsaWNhdGUgPSBuZXdEdXBsaWNhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0VtcHR5UmVzb3VyY2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9FbXB0eVJlc291cmNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzIyM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0VtcHR5UmVzb3VyY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnMgd2hlbiBhIG1vZiByZXNvdXJjZSdzIGV4dGVudCBjb250YWlucyB6ZXJvIGVsZW1lbnRzIGFuZCBhbiBhdHRlbXB0IGlzIG1hZGUKLSAqIHRvIGFjY2VzcyBhbiBlbGVtZW10IGZyb20gdGhlIHJlc291cmNlLgotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVFeGNlcHRpb24gewotCS8qKgotCSAqIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbXB0eVJlc291cmNlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vSUFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vSUFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OWIyMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0lBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSVdyYXBwZWRFeGNlcHRpb247Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZXhjZXB0aW9uLklXcmFwcGVkRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgSVdyYXBwZWRFeGNlcHRpb24gewotCS8vRGVmYXVsdAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL01hbmlmZXN0RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTWFuaWZlc3RFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhYWQ3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTWFuaWZlc3RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIE1hbmlmZXN0RXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbmlmZXN0RXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBNYW5pZmVzdEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RFeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbmlmZXN0RXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIE1hbmlmZXN0RXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIE1hbmlmZXN0RXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9OZXN0ZWRKYXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9OZXN0ZWRKYXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhN2UzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTmVzdGVkSmFyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBSdW50aW1lIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZyBhIGphciB3aXRoaW4gYSBqYXIKLSAqLwotcHVibGljIGNsYXNzIE5lc3RlZEphckV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQotCXB1YmxpYyBOZXN0ZWRKYXJFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5lc3RlZEphckV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGVkSmFyRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGVkSmFyRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwNjJjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm9FSkIxMERlc2NyaXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDUvMDEgNzozMToyNyBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTm9FSkIxMERlc2NyaXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogTm9FSkIxMERlc2NyaXB0b3JzRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5vRUpCMTBEZXNjcmlwdG9yc0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb0VKQjEwRGVzY3JpcHRvcnNFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzUxYWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob01vZHVsZUVsZW1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vIExvbmdlciB1c2VkOyBjaGVjayBmb3IgbnVsbCBpbnN0ZWFkIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnMgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlCi0gKiAgICAgICAgICAgICB0byBhY2Nlc3MgYSBub24tZXhpc3RlbnQgbW9kdWxlIGRkIGVsZW1lbnQgZnJvbSBhbiBlYXIgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogTm9Nb2R1bGVFbGVtZW50RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5vTW9kdWxlRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb01vZHVsZUVsZW1lbnRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb01vZHVsZUVsZW1lbnRFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjU4NmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob01vZHVsZUZpbGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOb01vZHVsZUZpbGVFeGNlcHRpb24uCi0JICovCi0JcHVibGljIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHVibGljIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9Ob3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5ZDMyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDYvMDEgOToyNjo0MyBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBOb3RBRGVwbG95bWVudERlc2NyaXB0b3JFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm90QURlcGxveW1lbnREZXNjcmlwdG9yRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vdEFEZXBsb3ltZW50RGVzY3JpcHRvckV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzM0ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmE4MTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzA4LzAxIDg6MzM6NTEgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vT3BlbkZhaWx1cmVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PcGVuRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGIyOWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9PcGVuRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIG9jY3VycyB3aGlsZSBvcGVuaW5nIGFuIGFyY2hpdmU7IGNvdWxkIG9jY3VyIGZvciBhIHZhcmlldHkgb2YgcmVhc29ucywgZWcsIGlvCi0gKiBmYWlsdXJlLCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZXJyb3JzLCBldGMuIENoZWNrIHRoZSBuZXN0ZWQgZXhjZXB0aW9uIGZvciBtb3JlIGluZm8uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBPcGVuRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPcGVuRmFpbHVyZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9wZW5GYWlsdXJlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIE9wZW5GYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgT3BlbkZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogT3BlbkZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9wZW5GYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vUmVvcGVuRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vUmVvcGVuRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NmM3ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1Jlb3BlbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogRXhjZXB0aW9uIHdoaWNoIGNhbiBiZSB0aHJvd24gYXMgYSByZXN1bHQgb2YgYW4gSU8gZXhjZXB0aW9uIHdoaWNoIG1heSBvY2N1ciB3aGlsZSAicmUtc3luY2luZyIKLSAqIGFuIGFyY2hpdmUgYWZ0ZXIgaXQgaGFzIGJlZW4gc2F2ZWQuIEZvciBleGFtcGxlLCBpZiAxMCBmaWxlcyBhcmUgY29waWVkIGZyb20gQXJjaGl2ZSBBIHRvIEFyY2hpdmUKLSAqIEIsIHRoZW4gYXJjaGl2ZSBiIGlzIHNhdmVkLCBpdHMgY29udGVudHMgd2lsbCBiZSBsb2FkZWQgZnJvbSBhIG5ldyBzb3VyY2UsIHRoZSBuZXdseSBzYXZlZCBqYXIKLSAqIGZpbGUuIFRoZXJlZm9yZSwgdGhlIGFyY2hpdmUgd2lsbCBiZSByZW9wZW5lZCBhZnRlciBzYXZpbmcsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBhbiBJT0V4Y2VwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFJlb3BlbkV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBSZW9wZW5FeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVvcGVuRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlb3BlbkV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFJlb3BlbkV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5FeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBSZW9wZW5FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogUmVvcGVuRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBSZW9wZW5FeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZXNvdXJjZUxvYWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9SZXNvdXJjZUxvYWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1OGRmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vUmVzb3VyY2VMb2FkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBFeGNlcHRpb24gdGhyb3duIGlmIGluIGV4Y2VwdGlvbiBvdGhlciB0aGFuIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlzIGNhdWdodCB3aGlsZQotICogYXR0ZW1wdGluZyB0byBsb2FkIGEgbW9mIHJlc291cmNlLgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvYWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VMb2FkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlTG9hZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlc291cmNlTG9hZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUxvYWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFJlc291cmNlTG9hZEV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1NhdmVGYWlsdXJlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU2F2ZUZhaWx1cmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwNTY1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vU2F2ZUZhaWx1cmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnMgd2hpbGUgc2F2aW5nIGFuIGFyY2hpdmU7IGNvdWxkIG9jY3VyIGZvciBhIHZhcmlldHkgb2YgcmVhc29ucywgZWcsIGlvCi0gKiBmYWlsdXJlLCBldGMuIENoZWNrIHRoZSBuZXN0ZWQgZXhjZXB0aW9uIGZvciBtb3JlIGluZm8uCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBTYXZlRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbHVyZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlRmFpbHVyZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFNhdmVGYWlsdXJlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsdXJlRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU2F2ZUZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZUZhaWx1cmVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIocywgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1N1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9TdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTllNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1N1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBSdW50aW1lIGV4Y2VwdGlvbiB1c2VkIGFzIGEgd2F5IHRvIGVuZm9yY2UgYWJzdHJhY3QgYmVoYXZpb3Igd2l0aG91dCBkZWNsYXJpbmcgdGhlIG1ldGhvZHMKLSAqIGFic3RyYWN0LiBOZWNlc3NhcnkgYmVjYXVzZSBpbXBsIGNsYXNzZXMgaW4gdGhlIGV0b29scyBnZW5lcmF0ZWQgaGllcmFyY2h5IGNhbm5vdCBiZSBhYnN0cmFjdCBpZgotICogdGhleSBoYXZlIHN1YnR5cGVzLgotICovCi1wdWJsaWMgY2xhc3MgU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBTdWJjbGFzc1Jlc3BvbnNpYmlsaXR5RXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NSZXNwb25zaWJpbGl0eUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN1YmNsYXNzUmVzcG9uc2liaWxpdHlFeGNlcHRpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJc3VwZXIoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoInN1YmNsYXNzX3Jlc3BvbnNpYmlsdHlfRVhDXyIsIChuZXcgT2JqZWN0W117bWV0aG9kTmFtZX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MiCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1VuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL1VuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk4MTcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9VbmNvbnRhaW5lZE1vZHVsZUZpbGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgRXhjZXB0aW9uIG5vIGxvbmdlciB0aHJvd247IGNoZWNrIGZvciBudWxsIGluc3RlYWQuIEV4Y2VwdGlvbiB3aGljaCBtYXkgYmUgdGhyb3duCi0gKiAgICAgICAgICAgICB3aGVuZXZlciBhIHtAbGluayBNb2R1bGVGaWxlfWlzIGV4cGVjdGVkIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYW4gZWFyIGZpbGUgYnV0IGl0Ci0gKiAgICAgICAgICAgICBpcyBub3QKLSAqLwotcHVibGljIGNsYXNzIFVuY29udGFpbmVkTW9kdWxlRmlsZUV4Y2VwdGlvbiBleHRlbmRzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBVbmNvbnRhaW5lZE1vZHVsZUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBVbmNvbnRhaW5lZE1vZHVsZUZpbGVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVW5jb250YWluZWRNb2R1bGVFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBVbmNvbnRhaW5lZE1vZHVsZUZpbGVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MThlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0KLS8qKgotICogVGhpcyBpcyBhIGNhdGFsb2cgb2YgdXNlZnVsIGNvbnN0YW50cyBmb3IgdGhlIGFyY2hpdmUgc3VwcG9ydC4gQ2FuIGJlIHVzZWQgdG8gc3RvcmUgcmVsYXRpdmUKLSAqIHBhdGhzIHRvIHNwZWNpZmljIHhtbCBhbmQgeG1pIHJlc291cmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBcmNoaXZlQ29uc3RhbnRzIGV4dGVuZHMgSjJFRUNvbnN0YW50cyB7Ci0JLy9TdGFuZGFyZCBKYXIgaW5mbwotCS8qKiAiY29tIiAqLwotCVN0cmluZyBSQVJfQ0xBU1NFU19VUkkgPSAiY29tIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVsYXRpdmUgcGF0aCBpbiBhIHdhciBmaWxlIHdpdGggbm8gbGVhZGluZyBzbGFzaCAiV0VCLUlORi9saWIvIgotCSAqLwotCVN0cmluZyBXRUJBUFBfTElCX1VSSSA9ICJXRUItSU5GL2xpYi8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZWxhdGl2ZSBwYXRoIGluIGEgd2FyIGZpbGUgd2l0aCBubyBsZWFkaW5nIHNsYXNoICJXRUItSU5GL2NsYXNzZXMvIgotCSAqLwotCVN0cmluZyBXRUJBUFBfQ0xBU1NFU19VUkkgPSAiV0VCLUlORi9jbGFzc2VzLyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUluaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZUluaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljZjY5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVJbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLQotLyoqCi0gKiBJbml0aWFsaXplciBjbGFzcyB0byBwcmVyZWdpc3RlciBwYWNrYWdlcwotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUluaXQgewotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwbHVnaW5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQlpbml0KHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KGJvb2xlYW4gc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQlpbnZva2VQcmVyZXFJbml0cyhzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKTsKLQkJCWlmIChzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKQotCQkJCXByZVJlZ2lzdGVyUGFja2FnZXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlUmVnaXN0ZXJQYWNrYWdlcygpIHsKLQkJLy9Db21tb25hcmNoaXZlUGFja2FnZSByZWcKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJjb21tb25hcmNoaXZlLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJCQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgiY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZy54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCQkJCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFOwotCQkJCQkJfQotCQkJCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlUHJlcmVxSW5pdHMoYm9vbGVhbiBzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKSB7Ci0JCUoyRUVJbml0LmluaXQoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwN2ViZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIEFQSSBvZgotICogCi0gKiBAbGluayBqYXZhLnV0aWwuamFyLk1hbmlmZXN0LCBhbG9uZyB3aXRoIGFkZGVkIGhlbHBlcnMKLSAqLwotcHVibGljIGludGVyZmFjZSBBcmNoaXZlTWFuaWZlc3QgewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuaWZlc3QgZW50cnkgKGF0dHJpYnV0ZXMpIGZvciB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeU5hbWUpOwotCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5TmFtZSwgQXR0cmlidXRlcyBhdHRyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZW50cnkgbmFtZTsgaWYgdGhlIGVudHJ5IGRvZXMgbm90Ci0JICogZXhpc3QsIGNyZWF0ZXMgYSBuZXcgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBEZWZhdWx0cyB0aGUgdmVyc2lvbiB0byAiMS4wIiBpZiBub3QgYWxyZWFkeSBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWZXJzaW9uSWZOZWNlc3NhcnkoKTsKLQotCXB1YmxpYyB2b2lkIGFwcGVuZENsYXNzUGF0aChTdHJpbmcgZXh0ZW5zaW9uKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNjbGVhcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0QXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNnZXRFbnRyaWVzCi0JICovCi0JcHVibGljIE1hcCBnZXRFbnRyaWVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I2dldEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlcyBnZXRNYWluQXR0cmlidXRlcygpOwotCi0JcHVibGljIFN0cmluZyBnZXRNYWluQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgaWZmIHRoZSBlbnRyeSBleGlzdHMgaW4gYSBjYXNlLXNlbnNpdGl2ZSBtYW5uZXI7IG1hbmlmZXN0IHZlcnNpb24gaXMKLQkgKiByZXF1aXJlZCBmb3IgdGhlIG1hbmlmZXN0IHRvIHNhdmUgY29ycmVjdGx5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdFZlcnNpb24oKTsKLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVudHJpZXMgbm90IGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBjbGFzcyBwYXRoIG9mIHRoaXMgbWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZXJnZUNsYXNzUGF0aChTdHJpbmdbXSBjbGFzc1BhdGhFbnRyaWVzKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNyZWFkCi0JICovCi0JcHVibGljIHZvaWQgcmVhZChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cnkoU3RyaW5nIGVudHJ5TmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBPYmplY3Qga2V5KTsKLQotCXB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChTdHJpbmcgYVNwYWNlRGVsaW1pdGVkUGF0aCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCN3cml0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgTWFuaWZlc3QgdG8gdGhlIHNwZWNpZmllZCBPdXRwdXRTdHJlYW0sIHNwbGl0dGluZyBlYWNoIGNsYXNzcGF0aCBlbnRyeSBvbiBhIGxpbmUKLQkgKiBieSBpdHNlbGYuCi0JICogCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlU3BsaXR0aW5nQ2xhc3NwYXRoKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjJjZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBtYW5pZmVzdCBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZU1hbmlmZXN0SW1wbCBleHRlbmRzIGphdmEudXRpbC5qYXIuTWFuaWZlc3QgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdCB7Ci0JLyoqCi0JICogQXJjaGl2ZU1hbmlmZXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQXJjaGl2ZU1hbmlmZXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbChqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuamFyLk1hbmlmZXN0Ci0JICovCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdEltcGwoamF2YS51dGlsLmphci5NYW5pZmVzdCBtYW4pIHsKLQkJc3VwZXIobWFuKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1hbmlmZXN0IGVudHJ5IChhdHRyaWJ1dGVzKSBmb3IgdGhlIGdpdmVuIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IG5ldyBBdHRyaWJ1dGVzKCk7Ci0JCWFkZEVudHJ5KGVudHJ5TmFtZSwgYXR0cik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5TmFtZSwgQXR0cmlidXRlcyBhdHRyKSB7Ci0JCWdldEVudHJpZXMoKS5wdXQoZW50cnlOYW1lLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBrZXkvdmFsdWUgcGFpciB0byB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGVudHJ5IG5hbWU7IGlmIHRoZSBlbnRyeSBkb2VzIG5vdAotCSAqIGV4aXN0LCBjcmVhdGVzIGEgbmV3IGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJYWRkRW50cnkoZW50cnlOYW1lKTsKLQkJYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJYXR0ci5wdXRWYWx1ZShrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRWZXJzaW9uSWZOZWNlc3NhcnkoKSB7Ci0JCS8vVGhpcyBpcyBhIGhhY2sgYmVjYXVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBtYW5pZmVzdCBkb2VzIG5vdCBzZXJpYWxpemUgY29ycmVjdGx5IGlmCi0JCS8vVGhlIHZlcnNpb24gaXMgbm90IHNldC4gSW4gYWRkaXRpb24gdG8gc2F2ZXMsIHRoZSBzZXJpYWxpemF0aW9uIGlzIHVzZWQgZm9yIGNvcHkKLQkJaWYgKGdldE1hbmlmZXN0VmVyc2lvbigpID09IG51bGwgfHwgZ2V0TWFuaWZlc3RWZXJzaW9uKCkuZXF1YWxzKCIiKSkvLyROT04tTkxTLTEkCi0JCQlzZXRNYW5pZmVzdFZlcnNpb24oIjEuMCIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kQ2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCVN0cmluZyBjbGFzc1BhdGggPSBnZXRDbGFzc1BhdGgoKTsKLQkJaWYgKGNsYXNzUGF0aCAhPSBudWxsKQotCQkJc2V0Q2xhc3NQYXRoKGNsYXNzUGF0aCArICIgIiArIGV4dGVuc2lvbik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlzZXRDbGFzc1BhdGgoZXh0ZW5zaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q2xhc3NQYXRoKCkgewotCQlyZXR1cm4gQXJjaGl2ZVV0aWwuZ2V0VmFsdWVJZ25vcmVLZXlDYXNlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRILnRvU3RyaW5nKCksIGdldE1haW5BdHRyaWJ1dGVzKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldENsYXNzUGF0aFRva2VuaXplZCgpIHsKLQkJU3RyaW5nIGNsYXNzUGF0aCA9IGdldENsYXNzUGF0aCgpOwotCQlpZiAoY2xhc3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuZ2V0VG9rZW5zKGNsYXNzUGF0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBTdHJpbmcga2V5KSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZShrZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzKCkgewotCQlyZXR1cm4gQXJjaGl2ZVV0aWwuZ2V0VmFsdWVJZ25vcmVLZXlDYXNlKEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTLnRvU3RyaW5nKCksIGdldE1haW5BdHRyaWJ1dGVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuaWZlc3RWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuTUFOSUZFU1RfVkVSU0lPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIG1lcmdlQ2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmdbXSBjbGFzc1BhdGhFbnRyaWVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJamF2YS51dGlsLkxpc3QgZXhpc3RpbmcgPSBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChnZXRDbGFzc1BhdGhUb2tlbml6ZWQoKSk7Ci0JCVN0cmluZyBjcCA9IGdldENsYXNzUGF0aCgpOwotCQlpZiAoY3AgIT0gbnVsbCkKLQkJCXNiLmFwcGVuZChjcCk7Ci0JCWJvb2xlYW4gZW1wdHkgPSBjcCA9PSBudWxsIHx8ICIiLmVxdWFscyhjcCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc1BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWV4aXN0aW5nLmNvbnRhaW5zKGNsYXNzUGF0aEVudHJpZXNbaV0pKSB7Ci0JCQkJaWYgKCFlbXB0eSkKLQkJCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCWVtcHR5ID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGNsYXNzUGF0aEVudHJpZXNbaV0pOwotCQkJfQotCQl9Ci0JCXNldENsYXNzUGF0aChzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWdldEVudHJpZXMoKS5yZW1vdmUoZW50cnlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBPYmplY3Qga2V5KSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHIucmVtb3ZlKGtleSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChqYXZhLmxhbmcuU3RyaW5nIGFTcGFjZURlbGltaXRlZFBhdGgpIHsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJaWYgKGFTcGFjZURlbGltaXRlZFBhdGggPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucmVtb3ZlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIKTsKLQkJZWxzZQotCQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuQ0xBU1NfUEFUSC50b1N0cmluZygpLCBhU3BhY2VEZWxpbWl0ZWRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzKGphdmEubGFuZy5TdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucmVtb3ZlKEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTKTsKLQkJZWxzZQotCQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuTUFJTl9DTEFTUy50b1N0cmluZygpLCBjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCWF0dHJpYnV0ZXMucHV0VmFsdWUoQXR0cmlidXRlcy5OYW1lLk1BTklGRVNUX1ZFUlNJT04udG9TdHJpbmcoKSwgdmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBNYW5pZmVzdCB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwgc3BsaXR0aW5nIGVhY2ggY2xhc3NwYXRoIGVudHJ5IG9uIGEgbGluZQotCSAqIGJ5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVTcGxpdHRpbmdDbGFzc3BhdGgoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQkvLyBXcml0ZSBvdXQgdGhlIG1haW4gYXR0cmlidXRlcyBmb3IgdGhlIG1hbmlmZXN0Ci0JCXdyaXRlTWFpblNwbGl0dGluZ0NsYXNzcGF0aChnZXRNYWluQXR0cmlidXRlcygpLCBkb3MpOwotCQkvLyBOb3cgd3JpdGUgb3V0IHRoZSBwcmUtZW50cnkgYXR0cmlidXRlcwotCQlJdGVyYXRvciBpdCA9IGdldEVudHJpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKChTdHJpbmcpIGUuZ2V0S2V5KCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCWRvcy53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCXdyaXRlKChBdHRyaWJ1dGVzKSBlLmdldFZhbHVlKCksIGRvcyk7Ci0JCX0KLQkJZG9zLmZsdXNoKCk7Ci0JfQotCi0JLyoKLQkgKiBXcml0ZXMgdGhlIGN1cnJlbnQgYXR0cmlidXRlcyB0byB0aGUgc3BlY2lmaWVkIGRhdGEgb3V0cHV0IHN0cmVhbS4gWFhYIE5lZWQgdG8gaGFuZGxlIFVURjgKLQkgKiB2YWx1ZXMgYW5kIGJyZWFrIHVwIGxpbmVzIGxvbmdlciB0aGFuIDcyIGJ5dGVzCi0JICogCi0JICogQHNlZSBBdHRyaWJ1dGVzI3dyaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBEYXRhT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCgoQXR0cmlidXRlcy5OYW1lKSBlLmdldEtleSgpKS50b1N0cmluZygpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoKFN0cmluZykgZS5nZXRWYWx1ZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9jYWxNYWtlNzJTYWZlKGJ1ZmZlcik7Ci0JCQlvcy53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQlvcy53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIFdyaXRlcyB0aGUgY3VycmVudCBhdHRyaWJ1dGVzIHRvIHRoZSBzcGVjaWZpZWQgZGF0YSBvdXRwdXQgc3RyZWFtLCBtYWtlIHN1cmUgdG8gd3JpdGUgb3V0IHRoZQotCSAqIE1BTklGRVNUX1ZFUlNJT04gb3IgU0lHTkFUVVJFX1ZFUlNJT04gYXR0cmlidXRlcyBmaXJzdC4KLQkgKiAKLQkgKiBAc2VlIEF0dHJpYnV0ZXMjd3JpdGVNYWluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVNYWluU3BsaXR0aW5nQ2xhc3NwYXRoKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgRGF0YU91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCB0aGUgKi1WZXJzaW9uIGhlYWRlciBmaXJzdCwgaWYgaXQgZXhpc3RzCi0JCVN0cmluZyB2ZXJuYW1lID0gQXR0cmlidXRlcy5OYW1lLk1BTklGRVNUX1ZFUlNJT04udG9TdHJpbmcoKTsKLQkJU3RyaW5nIHZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKHZlcm5hbWUpOwotCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQl2ZXJuYW1lID0gQXR0cmlidXRlcy5OYW1lLlNJR05BVFVSRV9WRVJTSU9OLnRvU3RyaW5nKCk7Ci0JCQl2ZXJzaW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSh2ZXJuYW1lKTsKLQkJfQotCi0JCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCW91dC53cml0ZUJ5dGVzKHZlcm5hbWUgKyAiOiAiICsgdmVyc2lvbiArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gd3JpdGUgb3V0IGFsbCBhdHRyaWJ1dGVzIGV4Y2VwdCBmb3IgdGhlIHZlcnNpb24KLQkJLy8gd2Ugd3JvdGUgb3V0IGVhcmxpZXIKLQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoQXR0cmlidXRlcy5OYW1lKSBlLmdldEtleSgpKS50b1N0cmluZygpOwotCQkJaWYgKCh2ZXJzaW9uICE9IG51bGwpICYmICEobmFtZS5lcXVhbHNJZ25vcmVDYXNlKHZlcm5hbWUpKSkgewotCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgudG9TdHJpbmcoKSkpIHsKLQkJCQkJd3JpdGVTcGxpdChvdXQsIG5hbWUsIChTdHJpbmcpIGUuZ2V0VmFsdWUoKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKLQkJCQlidWZmZXIuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZCgoU3RyaW5nKSBlLmdldFZhbHVlKCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWxvY2FsTWFrZTcyU2FmZShidWZmZXIpOwotCQkJCW91dC53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlvdXQud3JpdGVCeXRlcygiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVTcGxpdChEYXRhT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUpOwotCQlpbnQgaW5jID0gMDsKLQkJd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQkJaWYgKGluYyA9PSAwKSB7Ci0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKLQkJCQlidWZmZXIuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKHRvay5uZXh0VG9rZW4oKSk7Ci0JCQlpZiAodG9rLmNvdW50VG9rZW5zKCkgPiAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoIiBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2FsTWFrZTcyU2FmZShidWZmZXIpOwotCQkJb3V0LndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJaW5jKys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpbmUgYnJlYWtzIHRvIGVuZm9yY2UgYSBtYXhpbXVtIDcyIGJ5dGVzIHBlciBsaW5lLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2NhbE1ha2U3MlNhZmUoU3RyaW5nQnVmZmVyIGxpbmUpIHsKLQkJaW50IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPiA3MikgewotCQkJaW50IGluZGV4ID0gNzA7Ci0JCQl3aGlsZSAoaW5kZXggLSAxIDwgbGVuZ3RoKSB7Ci0JCQkJbGluZS5pbnNlcnQoaW5kZXgsICJcclxuICIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZXggKz0gNzI7Ci0JCQkJbGVuZ3RoICs9IDM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDEzYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMDIvMDEgMjo1ODo0OCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZU9wdGlvbnMgaW1wbGVtZW50cyBDbG9uZWFibGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FYID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET00gPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQgPSAzOwotCi0JcHJpdmF0ZSBpbnQgcmVuZGVyZXJUeXBlID0gREVGQVVMVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfTU9ERV9DT01QQVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfTU9ERV9TUEVDID0gMTsKLQotCXByaXZhdGUgaW50IGNsYXNzTG9hZGluZ01vZGUgPSBMT0FEX01PREVfQ09NUEFUOwotCi0JCi0JLyoqCi0JICogTG9hZCBzdHJhdGVneSBmb3Igb3BlbmluZy9yZWFkaW5nIHRoZSBhcmNoaXZlOyBvcHRpb25hbCAtIGlmIG51bGwgYSBsb2FkIHN0cmF0ZWd5IHdpbGwgYmUKLQkgKiBjcmVhdGVkIHdoZW4gdGhlIGFyY2hpdmUgaXMgb3BlbmVkCi0JICovCi0JcHJpdmF0ZSBMb2FkU3RyYXRlZ3kgbG9hZFN0cmF0ZWd5OwotCS8qKgotCSAqIEluZGljYXRvciBmb3Igd2hldGhlciBhdXRvIGphdmEgcmVmbGVjdGlvbiBzaG91bGQgYmUgdHVybmVkIG9uIGluIHRoZSBhcmNoaXZlIC0gZGVmYXVsdHMgdG8KLQkgKiB0cnVlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHVzZUphdmFSZWZsZWN0aW9uID0gdHJ1ZTsKLQkvKioKLQkgKiBJbmRpY2F0b3IgZm9yIHdoZXRoZXIgdGhlIGFyY2hpdmUgd2lsbCBiZSBtb2RpZmllZCBhZnRlciBvcGVuaW5nIG9yIGlmIGl0IGlzIGp1c3QgYmVpbmcKLQkgKiBvcGVuZWQsIHJlYWQsIHNhdmVkIHRvIGEgbmV3IGxvY2F0aW9uOyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiB0byBhdm9pZCB0ZW1wIGZpbGUgY3JlYXRpb24KLQkgKiBhbmQgc2F2aW5nIG9mIGluZGl2aWR1YWwgZmlsZXMgd2l0aGluIGEgbmVzdGVkIGFyY2hpdmUgaWYgdGhlIG5lc3RlZCBhcmNoaXZlIHdpbGwgbm90IGNoYW5nZSAtCi0JICogZGVmYXVsdHMgdG8gZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWFkT25seTsKLQotCS8qKgotCSAqIEluZGljYXRvciBmb3Igd2hldGhlciBhIGxpYmFyeSBuZXN0ZWQgaW4gYW5vdGhlciBhcmNoaXZlIChlZywgdXRpbGl0eSBKQVJzIGluIGFuIEVBUikgd2lsbCBiZQotCSAqIHNhdmVkIG91dCBhcyBhbiBvcmRpbmFyeSBmaWxlIG9yIGFzIGEgbmVzdGVkIEFyY2hpdmUuIFdoZW4gbG9hZGVkIGludG8gbWVtb3J5IHRoZXNlIGZpbGVzIGFyZQotCSAqIHRyZWF0ZWQgYXMgQXJjaGl2ZXMsIHRvIHN1cHBvcnQgZHluYW1pYyBjbGFzcyBsb2FkaW5nIGZvciBKYXZhIHJlZmxlY3Rpb24gb2YgY2xhc3NlcyBpbgotCSAqIEVKQkphckZpbGVzIGFuZCBkZXBlbmRlbnQgSkFScy4gQW4gYXJjaGl2ZSBvcGVuZWQgZm9yIGVkaXQsIGVpdGhlciBieSBhZGRpbmcgb3IgcmVtb3ZpbmcKLQkgKiBmaWxlcyBvciBjaGFuZ25pbmcgdGhlIE1hbmlmZXN0IG9yIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yLCB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IGZpbGUgb25lCi0JICogZmlsZSBhdCBhIHRpbWUuIFRoZSBkZWZhdWx0IGZvciB0aGlzIGZsYWcgaXMgdHJ1ZTsgaXQgb25seSBhcHBsaWVzIHRvIGxpYnJhcnkgQXJjaGl2ZXMsIG5vdAotCSAqIGluc3RhbmNlcyBvZiBNb2R1bGVGaWxlLiBJZiB5b3Ugd2lzaCB0byBlZGl0IGEgbmVzdGVkIGxpYnJhcnksIHNldCB0aGlzIGZsYWcgdG8gZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2F2ZUxpYnJhcmllc0FzRmlsZXMgPSB0cnVlOwotCi0KLQlwcml2YXRlIGJvb2xlYW4gc2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcyA9IHRydWU7Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBuZXN0ZWQgYXJjaGl2ZXMgYXJlIHRyZWF0ZWQgYXMgcHJpbWl0aXZlIGFyY2hpdmVzIGFuZCBhcmUgbm90IHBpcGVkIHRocm91Z2ggdGhlCi0JICogZGlzY3JpbWluYXRvciB0cmVlIG9uIHRoZSBhcmNoaXZlIGZhY3Rvcnk7IG1vZHVsZSBmaWxlcyBpbiBhbiBFQVIgYXJlIG9wZW5lZCB1c2luZyB0aGUKLQkgKiBzcGVjaWZpYyBvcGVuIG1ldGhvZHMgb24gdGhlIGZhY3Rvcnk7IGNoYW5nZSB0aGlzIGZsYWcgaWYgeW91J2QgbGlrZSBuZXN0ZWQgYXJjaGl2ZXMgdG8gYmUKLQkgKiBkaXNjcmltaW5hdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzID0gZmFsc2U7Ci0KLQlwcml2YXRlIE1hcCByZWFkT25seUZsYWdzOwotCi0JLyoqCi0JICogQXJjaGl2ZU9wdGlvbnMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU9wdGlvbnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIGNvcHkgb2YgdGhlIHJlY2lldmVyLCBzZXR0aW5nIHRoZSBsb2FkU3RyYXRlZ3kgdG8gbnVsbAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXJldHVybiBjbG9uZVdpdGgobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIGNvcHkgb2YgdGhlIHJlY2lldmVyLCBzZXR0aW5nIHRoZSBsb2FkU3RyYXRlZ3kgdG8gbnVsbAotCSAqLwotCXB1YmxpYyBBcmNoaXZlT3B0aW9ucyBjbG9uZVdpdGgoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3kpIHsKLQkJdHJ5IHsKLQkJCUFyY2hpdmVPcHRpb25zIHJlc3VsdCA9IChBcmNoaXZlT3B0aW9ucykgc3VwZXIuY2xvbmUoKTsKLQkJCXJlc3VsdC5zZXRMb2FkU3RyYXRlZ3koYUxvYWRTdHJhdGVneSk7Ci0JCQlyZXN1bHQucmVhZE9ubHlGbGFncyA9IG51bGw7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIEFyY2hpdmVPcHRpb25zIGNsb25lV2l0aChMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgewotCQlBcmNoaXZlT3B0aW9ucyByZXN1bHQgPSBjbG9uZVdpdGgoYUxvYWRTdHJhdGVneSk7Ci0JCXJlc3VsdC5zZXRJc1JlYWRPbmx5KGlzUmVhZE9ubHkodXJpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBnZXRMb2FkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBsb2FkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xOC8yMDAxIDI6NDI6MTEgUE0pCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcygpIHsKLQkJcmV0dXJuIHNhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNSZWFkT25seShib29sZWFuIG5ld0lzUmVhZE9ubHkpIHsKLQkJaXNSZWFkT25seSA9IG5ld0lzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNSZWFkT25seShib29sZWFuIHJlYWRPbmx5LCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChyZWFkT25seUZsYWdzID09IG51bGwpCi0JCQlyZWFkT25seUZsYWdzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmVhZE9ubHlGbGFncy5wdXQodXJpLCBuZXcgQm9vbGVhbihyZWFkT25seSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoU3RyaW5nIHVyaSkgewotCQlpZiAocmVhZE9ubHlGbGFncyAhPSBudWxsKSB7Ci0JCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgcmVhZE9ubHlGbGFncy5nZXQodXJpKTsKLQkJCWlmIChib29sICE9IG51bGwpCi0JCQkJcmV0dXJuIGJvb2wuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9hZFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBuZXdMb2FkU3RyYXRlZ3kpIHsKLQkJbG9hZFN0cmF0ZWd5ID0gbmV3TG9hZFN0cmF0ZWd5OwotCQlsb2FkU3RyYXRlZ3kuc2V0UmVhZE9ubHkoaXNSZWFkT25seSgpKTsKLQkJbG9hZFN0cmF0ZWd5LnNldFJlbmRlcmVyVHlwZShnZXRSZW5kZXJlclR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xOC8yMDAxIDI6NDI6MTEgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1NhdmVPbmx5RGlydHlNb2ZSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYXZlT25seURpcnR5TW9mUmVzb3VyY2VzKGJvb2xlYW4gbmV3U2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcykgewotCQlzYXZlT25seURpcnR5TW9mUmVzb3VyY2VzID0gbmV3U2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VKYXZhUmVmbGVjdGlvbihib29sZWFuIG5ld1VzZUphdmFSZWZsZWN0aW9uKSB7Ci0JCXVzZUphdmFSZWZsZWN0aW9uID0gbmV3VXNlSmF2YVJlZmxlY3Rpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlSmF2YVJlZmxlY3Rpb24oKSB7Ci0JCXJldHVybiB1c2VKYXZhUmVmbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzYXZlTGlicmFyaWVzQXNGaWxlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTGlicmFyaWVzQXNGaWxlcygpIHsKLQkJcmV0dXJuIHNhdmVMaWJyYXJpZXNBc0ZpbGVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNhdmVMaWJyYXJpZXNBc0ZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSBzYXZlTGlicmFyaWVzQXNGaWxlcwotCSAqICAgICAgICAgICAgVGhlIHNhdmVMaWJyYXJpZXNBc0ZpbGVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVMaWJyYXJpZXNBc0ZpbGVzKGJvb2xlYW4gc2F2ZUxpYnJhcmllc0FzRmlsZXMpIHsKLQkJdGhpcy5zYXZlTGlicmFyaWVzQXNGaWxlcyA9IHNhdmVMaWJyYXJpZXNBc0ZpbGVzOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzKCkgewotCQlyZXR1cm4gZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMuCi0JICogCi0JICogQHBhcmFtIGRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzCi0JICogICAgICAgICAgICBUaGUgZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMoYm9vbGVhbiBkaXNjcmltaW5hdGVOZXN0ZWRBcmNoaXZlcykgewotCQl0aGlzLmRpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzID0gZGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZW5kZXJlclR5cGUuCi0JICovCi0JcHVibGljIGludCBnZXRSZW5kZXJlclR5cGUoKSB7Ci0JCXJldHVybiByZW5kZXJlclR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJlbmRlcmVyVHlwZSBhbGxvd3MgYSB1c2VyIHRvIG92ZXJyaWRlIHRoZSByZW5kZXJlciB1c2VkIGJ5IENvbW1vbiBBcmNoaXZlIGZvciBzcGVjaWFsCi0JICogY2FzZXMgaW4gdGhlIFVJIHdoZXJlIHlvdSByZWFsbHkgd2FudCB0byB1c2UgYSBub24tc3luY2hyb25pemluZyByZW5kZXJlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVuZGVyZXJUeXBlCi0JICogICAgICAgICAgICBUaGUgcmVuZGVyZXJUeXBlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoaW50IHJlbmRlcmVyVHlwZSkgewotCQl0aGlzLnJlbmRlcmVyVHlwZSA9IHJlbmRlcmVyVHlwZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRDbGFzc0xvYWRpbmdNb2RlKCkgewotCQlyZXR1cm4gY2xhc3NMb2FkaW5nTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZCB2YWx1ZXMgYXJlIExPQURfTU9ERV9DT01QQVQgb3IgTE9BRF9NT0RFX1NQRUMuIFRoZSBkZWZhdWx0IGlzIExPQURfTU9ERV9DT01QQVQuIFRoaXMKLQkgKiBmbGFnIGlzIHRvIHNldCB0aGUgY2xhc3MgbG9hZGluZyBtb2RlOyB0aGUgZGVmYXVsdCBpcyBMT0FEX01PREVfQ09NUEFUIGZvciBiYWNrd2FyZHMKLQkgKiBjb21wYXRpYmlsaXR5LCB3aGlsZSBMT0FEX01PREVfU1BFQyB3aWxsIGVuZm9yY2Ugc3BlYyBkZWZpbmVkIGNsYXNzIGxvYWRpbmcuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTG9hZGluZ01vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRpbmdNb2RlKGludCBjbGFzc0xvYWRpbmdNb2RlKSB7Ci0JCXRoaXMuY2xhc3NMb2FkaW5nTW9kZSA9IGNsYXNzTG9hZGluZ01vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzY1ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotCi0KLS8qKgotICogQW4gaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBhbiBBUEkgZm9yIG9wZW5pbmcgYXJjaGl2ZXMuIFRoZSB7QGxpbmsgQ29tbW9uQXJjaGl2ZUZhY3Rvcnl9Ci0gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcm9vdCBsZXZlbCBkaXNjcmltaW5hdG9yIHRvIG9wZW4gYW4gYXJjaGl2ZS4gVGhlIG1haW4gYmVuZWZpdCBvZiB0aGlzIGFwaQotICogaXMgaXQgYWxsb3dzIGV4dGVuZGVkIHRlYW1zIG9yIHRoaXJkIHBhcnRpZXMgdG8gcGx1ZyBpbiB0byB0aGUgZnJhbWV3b3JrIHRvIGFsbG93IHNwZWNpYWxpemVkCi0gKiBraW5kcyBvZiBqYXIgZmlsZXMgZG8gYmUgZGlzY2VybmVkIGF0IGNyZWF0aW9uL29wZW4gdGltZSB3aXRob3V0IHRoZSBjbGllbnQgaGF2aW5nIHRvIHByb3ZpZGUgYQotICogbG90IG9mIGxvZ2ljLiBGb3IgZXhhbXBsZSwgYSBjbGllbnQgd291bGQgc2ltcGx5IHdyaXRlCi0gKiA8Y29kZT4oKENvbW1vbkFyY2hpdmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbkFyY2hpdmVQYWNrYWdlLmVOU19VUkkpKS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW4oYVN0cmluZyk8Y29kZT4sIGFuZCBnZXQgYmFjayAKLSAqIHRoZSBjb3JyZWN0IGtpbmQgb2YgYXJjaGl2ZSBpbnN0YW5jZS4gIEEgZGlzY3JpbWluYXRvciBjb250YWlucyBjaGlsZHJlbiwgd2hpY2ggaXMgYW4gb3JkZXJlZCBsaXN0IG9mIGRpc2NyaW1pbmF0b3JzLCBlYWNoIG9mIHdoaWNoIAotICogY2FuIGhhdmUgaXRzIHR1cm4gdG8gZGV0ZXJtaW5lIGlmIGl0IGNhbiBvcGVuIGFuIGFyY2hpdmUuICBUaGUgZmlyc3Qgb25lIHRvIHN1Y2NlZWQgd2lucy4gIE9uY2UgYSBkaXNjcmltaW5hdG9yIGRldGVybWluZXMgdGhhdCBpdAotICogY2FuIG9wZW4gYW4gYXJjaGl2ZSwgaXQgZ2l2ZXMgZWFjaCBvZiBpdHMgY2hpbGRyZW4gdGhlIG9wcG9ydHVudGl0eSB0byBkbyBzb21ldGhpbmcgbW9yZSBzcGVjaWZpYywgYW5kIHNvIG9uLiBJbiB0aGUgYmFzZQotICogaW1wbGVtZW50YXRpb24sIGRpc2NyaW1pbmF0b3JzIGFyZSBkZWZpbmVkIGFzIHNpbmdsZSBpbnN0YW5jZXMgb2YgYW4gaW5uZXIgY2xhc3MgZm9yIGVhY2ggaW1wb3J0IHN0cmF0ZWd5LiAgVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIAotICogaG93IHRvIHJlZ2lzdGVyIGEgZGlzY3JpbWluYXRvciBmb3IgYSBzcGVjaWFsaXplZCBFSkJKYXJGaWxlOiAKLSAqIDxjb2RlPkVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKS5hZGRDaGlsZChhRGlzY3JpbWluYXRvcik7PC9jb2RlPgotICogVGhpcyB3b3VsZCBiZSBkb25lIGFzIGFuIGluaXRpYWxpemF0aW9uIGF0IHN0YXJ0dXAgdGltZS4gIElmIHRoZSBjaGlsZCBkaXNjcmltaW5hdG9yIGlzIGV2ZXIgaW52b2tlZCwgdGhlIHBhcmVudCB3aWxsIGhhdmUgYWxyZWFkeQotICogZGV0ZXJtaW5lZCB0aGF0IHRoZSBhcmNoaXZlIGlzIGFuIEVKQkphckZpbGUgYW5kIHdpbGwgaGF2ZSBjb252ZXJ0ZWQgaXQgdG8gdGhhdCB0eXBlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciB7Ci0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkKTsKLQotCS8qKgotCSAqIEB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgcHJlZGVjZXNzb3IgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRBZnRlcihBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQsIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBwcmVkZWNlc3NvcikgdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHRocm93cyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBzdWNjZXNzb3IgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRCZWZvcmUoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkLCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3Igc3VjY2Vzc29yKSB0aHJvd3MgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0ZXN0cyBvbiB0aGUgYXJjaGl2ZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgdGhlIGtpbmQgdGhpcyBkaXNjcmltaW5hdG9yIGlzIGludGVyZXN0ZWQKLQkgKiBpbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSk7Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgdGhlIGltcG9ydCBzdHJhdGVneSBmb3IgYSBjb252ZXJ0ZWQgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyB0byBiZSBwcmVzZW50ZWQgZWl0aGVyIHRocm91Z2ggYW4gZXhjZXB0aW9uIG9yIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHNwZWNpZmljCi0JICoga2luZCBvZiBhcmNoaXZlIGlzIGV4cGVjdGVkIGFuZCB0aGlzIGRpc2NyaW1pbmF0b3IgY2FuJ3Qgb3BlbiBpdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKTsKLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjKTsKLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBQb2ludCBvZiBlbnRyeSBmb3IgYXR0ZW1wdGluZyB0byBvcGVuIGFuIGFyY2hpdmUKLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29udmVydGVkIGFyY2hpdmUgb3IgbnVsbCBpZiB0aGlzIGRpc2NyaW1pbmF0b3IgY2FuJ3QgY29udmVydCBpdAotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3YjI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneTsKLQotCi0vKioKLSAqIEBzZWUgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIGltcGxlbWVudHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKLQotCXB1YmxpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQpIHsKLQkJaWYgKGhhc0NoaWxkKGNoaWxkKSkKLQkJCXJldHVybjsKLQkJZ2V0Q2hpbGRyZW4oKS5hZGQoY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZEFmdGVyKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkLCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBwcmVkZWNlc3NvcikgdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLQkJaWYgKGhhc0NoaWxkKGNoaWxkKSkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKHByZWRlY2Vzc29yKTsKLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWluZGV4Kys7Ci0JCQlnZXRDaGlsZHJlbigpLmFkZChpbmRleCwgY2hpbGQpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKHByZWRlY2Vzc29yLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkQmVmb3JlKEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCwgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHN1Y2Nlc3NvcikgdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLQkJaWYgKGhhc0NoaWxkKGNoaWxkKSkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gZ2V0Q2hpbGRyZW4oKS5pbmRleE9mKHN1Y2Nlc3Nvcik7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlnZXRDaGlsZHJlbigpLmFkZChpbmRleCwgY2hpbGQpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKHN1Y2Nlc3Nvci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNvbnZlcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgZGVzdGluYXRpb24gPSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCk7Ci0KLQkJLy90dXJuIG9mIG5vdGlmaWNhdGlvbnMKLQkJZGVzdGluYXRpb24uZVNldERlbGl2ZXIoZmFsc2UpOwotCQlkZXN0aW5hdGlvbi5lU2V0RGVsaXZlcihmYWxzZSk7Ci0KLQkJLy9Db3B5IHRoZSByZWxldmFudCBhdHRyaWJ1dGVzCi0JCWRlc3RpbmF0aW9uLnNldFVSSShhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQlkZXN0aW5hdGlvbi5zZXRPcmlnaW5hbFVSSShhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQlkZXN0aW5hdGlvbi5zZXRTaXplKGFuQXJjaGl2ZS5nZXRTaXplKCkpOwotCQlkZXN0aW5hdGlvbi5zZXRMYXN0TW9kaWZpZWQoYW5BcmNoaXZlLmdldExhc3RNb2RpZmllZCgpKTsKLQotCQlkZXN0aW5hdGlvbi5zZXRMb2FkU3RyYXRlZ3koYW5BcmNoaXZlLmdldExvYWRTdHJhdGVneSgpKTsKLQkJZGVzdGluYXRpb24uc2V0T3B0aW9ucyhhbkFyY2hpdmUuZ2V0T3B0aW9ucygpKTsKLQkJZGVzdGluYXRpb24uc2V0RXh0cmFDbGFzc3BhdGgoYW5BcmNoaXZlLmdldEV4dHJhQ2xhc3NwYXRoKCkpOwotCQlpZiAoZGVzdGluYXRpb24uaXNNb2R1bGVGaWxlKCkpIHsKLQkJCUltcG9ydFN0cmF0ZWd5IGltcG9ydFN0cmF0ZWd5ID0gY3JlYXRlSW1wb3J0U3RyYXRlZ3koYW5BcmNoaXZlLCBkZXN0aW5hdGlvbik7Ci0JCQkoKE1vZHVsZUZpbGUpIGRlc3RpbmF0aW9uKS5zZXRJbXBvcnRTdHJhdGVneShpbXBvcnRTdHJhdGVneSk7Ci0JCX0KLQotCi0KLQkJLy90dXJuIG5vdGlmaWNhdGlvbnMgYmFjayBvbgotCQlkZXN0aW5hdGlvbi5lU2V0RGVsaXZlcih0cnVlKTsKLQkJZGVzdGluYXRpb24uZVNldERlbGl2ZXIodHJ1ZSk7Ci0KLQkJcmV0dXJuIGRlc3RpbmF0aW9uOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKTsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSk7Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggY2hpbGQgYW5kIGF0dGVtcHQgdG8gY29udmVydCB0aGUgYXJjaGl2ZSB0byB0aGUgY2hpbGQncyB0eXBlOyByZXR1cm4gdGhlCi0JICogY29udmVydGVkIGFyY2hpdmUgZnJvbSB0aGUgZmlyc3QgY2hpbGQgdGhhdCBzdWNjZWVkcywgb3IgbnVsbCBpZiBubyBjaGlsZCBzdWNjZWVkcyBvciBubwotCSAqIGNoaWxkIGV4aXN0cwotCSAqLwotCXByb3RlY3RlZCBBcmNoaXZlIGdldEltcG9ydGFibGVBcmNoaXZlRnJvbUNoaWxkKEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoIWhhc0NoaWxkcmVuKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3QgdGhlQ2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlBcmNoaXZlIGNoaWxkQ29udmVydGVkQXJjaGl2ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBjaGlsZCA9IChBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IpIHRoZUNoaWxkcmVuLmdldChpKTsKLQkJCWNoaWxkQ29udmVydGVkQXJjaGl2ZSA9IGNoaWxkLm9wZW5BcmNoaXZlKGFuQXJjaGl2ZSk7Ci0JCQlpZiAoY2hpbGRDb252ZXJ0ZWRBcmNoaXZlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY2hpbGRDb252ZXJ0ZWRBcmNoaXZlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0WG1sRERNZXNzYWdlKFN0cmluZyBhcmNoaXZlVHlwZSwgU3RyaW5nIGRkVXJpKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiaW52YWxpZF9hcmNoaXZlX0VYQ18iLCAobmV3IE9iamVjdFtde2FyY2hpdmVUeXBlLCBkZFVyaX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJBcmNoaXZlIGlzIG5vdCBhIHZhbGlkIHswfSBiZWNhdXNlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY2FuIG5vdCBiZSBmb3VuZCAoY2FzZSBzZW5zaXRpdmUpOiB7MX0iCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGQoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MpIHsKLQkJcmV0dXJuIGhhc0NoaWxkcmVuKCkgJiYgZ2V0Q2hpbGRyZW4oKS5jb250YWlucyhkaXNjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmICghY2FuSW1wb3J0KGFuQXJjaGl2ZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFyY2hpdmUgY29udmVydGVkQXJjaGl2ZSA9IGNvbnZlcnQoYW5BcmNoaXZlKTsKLQkJQXJjaGl2ZSBjaGlsZENvbnZlcnRlZEFyY2hpdmUgPSBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZyb21DaGlsZChjb252ZXJ0ZWRBcmNoaXZlKTsKLQkJaWYgKGNoaWxkQ29udmVydGVkQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNoaWxkQ29udmVydGVkQXJjaGl2ZTsKLQkJcmV0dXJuIGNvbnZlcnRlZEFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGNoaWxkKSB7Ci0JCWdldENoaWxkcmVuKCkucmVtb3ZlKGNoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihqYXZhLnV0aWwuTGlzdCBuZXdDaGlsZHJlbikgewotCQljaGlsZHJlbiA9IG5ld0NoaWxkcmVuOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMDMyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVVUklDb252ZXJ0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdXNlZCBmb3IgbG9hZGluZyBvZiBtb2YgcmVzb3VyY2VzIGNvbnRhaW5lZCB3aXRoaW4gYW4gYXJjaGl2ZTsga25vd3MgaG93IHRvIHJldHJpZXZlCi0gKiBhbiBpbnB1dCBzdHJlYW0gZm9yIGEgZ2l2ZW4gdXJpCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlVVJJQ29udmVydGVySW1wbCBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGZpbGVQcm90b2NvbCA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHBsYXRmb3JtUHJvdG9jb2wgPSAicGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgaW5GaWxlcGF0aCwgb3V0RmlsZXBhdGg7Ci0KLQlwdWJsaWMgQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZSBhbkFyY2hpdmUsIFN0cmluZyByZXNvdXJjZXNQYXRoKSB7Ci0JCXNldEFyY2hpdmUoYW5BcmNoaXZlKTsKLQkJdGhpcy5yZXNvdXJjZXNQYXRoID0gcmVzb3VyY2VzUGF0aDsKLQkJc2V0SW5wdXRGaWxlcGF0aChyZXNvdXJjZXNQYXRoKTsKLQkJU3RyaW5nIG91dHBhdGggPSByZXNvdXJjZXNQYXRoOwotCQlpZiAob3V0cGF0aCA9PSBudWxsKSB7Ci0JCQlMb2FkU3RyYXRlZ3kgbCA9IGFuQXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKTsKLQkJCWlmIChsICE9IG51bGwgJiYgbC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3V0cGF0aCA9IGwuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRPdXRwdXRGaWxlcGF0aChvdXRwYXRoKTsKLQl9Ci0KLQkvKiogVGhlIGFyY2hpdmUgZnJvbSB3aGljaCByZXNvdXJjZXMgd2lsbCBiZSBsb2FkZWQgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZSBhcmNoaXZlOwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VzUGF0aDsKLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZXNQYXRoICE9IG51bGwpCi0JCQlpbiA9IG1ha2VJbnB1dFN0cmVhbSh1cmkpOwotCQlpZiAoaW4gIT0gbnVsbCkKLQkJCXJldHVybiBpbjsKLQkJcmV0dXJuIGdldEFyY2hpdmUoKS5nZXRJbnB1dFN0cmVhbSh1cmkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZShvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJYXJjaGl2ZSA9IG5ld0FyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2VzUGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB7Ci0JCXJldHVybiByZXNvdXJjZXNQYXRoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlc291cmNlc1BhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlc1BhdGgKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZXNQYXRoIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlc1BhdGgoU3RyaW5nIHJlc291cmNlc1BhdGgpIHsKLQkJdGhpcy5yZXNvdXJjZXNQYXRoID0gcmVzb3VyY2VzUGF0aDsKLQkJc2V0SW5wdXRGaWxlcGF0aChyZXNvdXJjZXNQYXRoKTsKLQkJc2V0T3V0cHV0RmlsZXBhdGgocmVzb3VyY2VzUGF0aCk7Ci0JfQotCi0JcHVibGljIFVSSSBub3JtYWxpemUoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0SW50ZXJuYWxVUklNYXAoKS5nZXRVUkkodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW5wdXQgZmlsZSBwYXRoIGNvbnNpc3RzIG9mIGEgc3RyaW5nIG9mIGRpcmVjdG9yaWVzIG9yIHppcCBmaWxlcyBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbnMKLQkgKiB0aGF0IGFyZSBzZWFyY2hlZCB3aGVuIGFuIGlucHV0IHN0cmVhbSBpcyBjb25zdHJ1Y3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RmlsZXBhdGgoKSB7Ci0JCXJldHVybiBpbkZpbGVwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlcGF0aAotCSAqICAgICAgICAgICAgVGhlIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0RmlsZXBhdGgoU3RyaW5nIGZpbGVwYXRoKSB7Ci0JCWluRmlsZXBhdGggPSBmaWxlcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBvdXRwdXQgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRwdXRGaWxlcGF0aCgpIHsKLQkJcmV0dXJuIG91dEZpbGVwYXRoOwotCX0KLQotCS8qKgotCSAqIFRoZSBvdXRwdXQgZmlsZSBwYXRoIGlzIHRoZSBwYXRoIG5hbWUgb2YgYSBkaXJlY3RvcnkgdG8gcHJlcGVuZCB0byByZWxhdGl2ZSBmaWxlIHBhdGggbmFtZXMKLQkgKiB3aGVuIGFuIG91dHB1dCBzdHJlYW0gaXMgY29uc3RydWN0ZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGVwYXRoCi0JICogICAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGVwYXRoKFN0cmluZyBmaWxlcGF0aCkgewotCQlvdXRGaWxlcGF0aCA9IGZpbGVwYXRoOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIFVSSSB0byBhbiBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHVyaQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBtYWtlSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJVVJJIGNvbnZlcnRlZCA9IHVyaTsKLQotCQlpZiAoKGZpbGVQcm90b2NvbC5lcXVhbHMoY29udmVydGVkLnNjaGVtZSgpKSB8fCBjb252ZXJ0ZWQuc2NoZW1lKCkgPT0gbnVsbCkgJiYgaW5GaWxlcGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2VhcmNoRmlsZVBhdGgoY29udmVydGVkLnRvU3RyaW5nKCkpOwotCQl9Ci0JCVVSTCB1cmwgPSBjcmVhdGVVUkwoY29udmVydGVkLnRvU3RyaW5nKCkpOwotCQlVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJcmV0dXJuIHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggdGhlIGZpbGUgcGF0aCBpZiB0aGUgZmlsZSBwb3J0aW9uIG9mIHRoZSBVUkwgaXMgbm90IGFic29sdXRlIChkb2VzIG5vdCBiZWdpbiB3aXRoICIvIjsKLQkgKiBvdGhlcndpc2UsIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhlIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIHNlYXJjaEZpbGVQYXRoKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotCQlpZiAoZmlsZS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbkZpbGVwYXRoLCAiOyIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBmID0gc3QubmV4dFRva2VuKCk7Ci0JCQlaaXBGaWxlIHpmID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemYgPSBuZXcgWmlwRmlsZShmKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCWlmICh6ZiAhPSBudWxsKSB7Ci0JCQkJaW4gPSBzZWFyY2haaXBGaWxlKHpmLCBmaWxlbmFtZSk7Ci0JCQkJaWYgKGluID09IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQl6Zi5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy9JZ25vcmUKLQkJCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbiA9IHNlYXJjaERpcmVjdG9yeShmLCBmaWxlbmFtZSk7Ci0JCQl9Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQlyZXR1cm4gaW47Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWxlIHdpdGggdGhlIHJlbGF0aXZlIHBhdGggbmFtZSBvZiBmaWxlbmFtZSBleGlzdHMgaW4gdGhlCi0JICogZ2l2ZW4gZGlyZWN0b3J5LiBJZiBub3QsIGl0IHJldHVybnMgbnVsbDsgb3RoZXJ3aXNlLCBpdCBvcGVucyB0aGUgZmlsZSB1cCBhbmQgcmV0dXJucyB0aGUKLQkgKiBpbnB1dCBzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gamF2YS5pby5JbnB1dFNvdXJjZQotCSAqLwotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBzZWFyY2hEaXJlY3RvcnkoU3RyaW5nIGRpciwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZGlyLmVxdWFscygiLiIpKSAvLyROT04tTkxTLTEkCi0JCQlkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBmID0gbmV3IEZpbGUoZGlyICsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgZmlsZW5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOyAvLyROT04tTkxTLTEkCi0JCWlmICghZi5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgaXMgYSBaaXBFbnRyeSB3aG9zZSBuYW1lIGlzIGZpbGVuYW1lIGluIHRoZSBnaXZlbgotCSAqIFppcEZpbGUuIElmIG5vdCwgaXQgcmV0dXJucyBudWxsOyBvdGhlcndpc2UsIGl0IHJldHVybnMgYW4gaW5wdXQgc291cmNlIHRvIHJlYWQgZnJvbSB0aGUKLQkgKiBaaXBFbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gemlwCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGUKLQkgKiBAcmV0dXJuIGphdmEuaW8uSW5wdXRTb3VyY2UKLQkgKi8KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gc2VhcmNoWmlwRmlsZShaaXBGaWxlIHppcCwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlaaXBFbnRyeSBlbnRyeSA9IHppcC5nZXRFbnRyeShmaWxlbmFtZSk7Ci0JCWlmIChlbnRyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB6aXAuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCX0KLQotCS8qKgotCSAqIE1ha2UgYSBVUkwgZnJvbSB0aGUgdXJpOyBpZiB0aGUgYXR0ZW1wdCBmYWlscywgYXR0ZW1wdCB0byBhcHBlbmQgImZpbGU6IiB0byB0aGUgVVJJOyBpZiB0aGUKLQkgKiBhdHRlbXB0IHN0aWxsIGZhaWxzLCBhdHRlbXB0IHRvIHJlcGxhY2UgdGhlIHByb3RvY29sIHdpdGggdGhlIGZpbGUgcHJvdG9jb2wuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyB1cmkKLQkgKi8KLQlwdWJsaWMgVVJMIGNyZWF0ZVVSTChTdHJpbmcgdXJpKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG0gPSBudWxsOwotCQlpZiAodXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQltID0gKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbikgZTsKLQkJfQotCQlpZiAodXJsICE9IG51bGwpCi0JCQlyZXR1cm4gdXJsOwotCQkvLyBFaXRoZXIgdHJlYXQgdGhlIFVSSSBhcyBhIGZpbGVwYXRoIChpZiB0aGVyZSBhcmUgbm8gOiBvcgotCQkvLyBhIDogaW4gcG9zaXRpb24gMSkgb3IgcmVwbGFjZSB0aGUgZ2l2ZW4gcHJvdG9jb2wgd2l0aCB0aGUKLQkJLy8gZmlsZSBwcm90b2NvbC4KLQkJaW50IGluZGV4ID0gdXJpLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPT0gMSkKLQkJCXVyaSA9IGZpbGVQcm90b2NvbCArICI6IiArIHVyaTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChpbmRleCA+IDApCi0JCQl1cmkgPSBmaWxlUHJvdG9jb2wgKyAiOiIgKyB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwodXJpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJaWYgKHVybCAhPSBudWxsKQotCQkJcmV0dXJuIHVybDsKLQkJdGhyb3cgbTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBVUkkgdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJVVJJIGNvbnZlcnRlZCA9IHVyaTsKLQkJaWYgKHBsYXRmb3JtUHJvdG9jb2wuZXF1YWxzKGNvbnZlcnRlZC5zY2hlbWUoKSkpIHsKLQkJCVVSTCByZXNvbHZlZFVSTCA9IHJlc29sdmVQbGF0Zm9ybShuZXcgVVJMKGNvbnZlcnRlZC50b1N0cmluZygpKSk7Ci0JCQlpZiAocmVzb2x2ZWRVUkwgIT0gbnVsbCkgewotCQkJCWNvbnZlcnRlZCA9IFVSSS5jcmVhdGVGaWxlVVJJKHJlc29sdmVkVVJMLmdldEZpbGUoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGVQcm90b2NvbC5lcXVhbHMoY29udmVydGVkLnNjaGVtZSgpKSB8fCBjb252ZXJ0ZWQuc2NoZW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG9wZW5GaWxlT3V0cHV0U3RyZWFtKGNvbnZlcnRlZCk7Ci0JCX0KLQkJVVJMIHVybCA9IGNyZWF0ZVVSTChjb252ZXJ0ZWQudG9TdHJpbmcoKSk7Ci0JCVVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQl1cmxDb25uZWN0aW9uLnNldERvT3V0cHV0KHRydWUpOwotCQlyZXR1cm4gdXJsQ29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJMIHJlc29sdmVQbGF0Zm9ybShVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBsZXQgV29ya2JlbmNoVVJJQ29udmVydGVyIGltcGxlbWVudCB0aGlzIG9uZS4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGZpbGUgb3V0cHV0IHN0cmVhbSBmb3IgdGhlIGdpdmVuIHVyaSAodGhlIHVyaSBoYXMgZmlsZSBwcm90b2NvbCkuIElmIGFuIG91dHB1dCBmaWxlCi0JICogcGF0aCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBmaWxlIG5hbWUgaXMgcmVsYXRpdmUsIHByZXBlbmQgdGhlIG91dHB1dCBmaWxlIHBhdGggdG8gdGhlIGZpbGUKLQkgKiBuYW1lLiBNYWtlIHRoZSBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gdGhlIGZpbGUgaWYgdGhleSBkbyBub3QgZXhpc3QuCi0JICovCi0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBvcGVuRmlsZU91dHB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpOwotCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpICYmIG91dEZpbGVwYXRoICE9IG51bGwpIHsKLQkJCWZpbGUgPSBuZXcgRmlsZShvdXRGaWxlcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgdXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCQlTdHJpbmcgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQluZXcgRmlsZShwYXJlbnQpLm1rZGlycygpOwotCQl9Ci0JCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJcmV0dXJuIG91dHB1dFN0cmVhbTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0V4cG9ydFN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0V4cG9ydFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YjA4MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9FeHBvcnRTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5BcmNoaXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotCi0KLQotLyoqCi0gKiBFeHBvcnRTdHJhdGVneSBrbm93cyB3aGF0IHRvIGRvIGp1c3QgYmVmb3JlIGEgZHVtcCBvZiBhbiBhcmNoaXZlIGlzIGFib3V0IHRvIG9jY3VyLCB0eXBpY2FsbHkKLSAqIGFkZGluZyBpdGVtcyBzdWNoIGFzIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kIHN1Y2guIFRoaXMgcHJvdmlkZXMgYSBkZWxlZ2F0aW9uIG1vZGVsIGZvcgotICogYXJjaGl2ZS92ZXJzaW9uL3BsYXRmb3JtIHNwZWNpZmljIHJ1bGVzIGFib3V0IHdoaWNoIHJlc291cmNlcyBldGMgbmVlZCB0byBiZSBleHBvcnRlZC4gQ2xpZW50cwotICogY2FuIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYW5kICJwbHVnIGluIiB0byBhbiBpbnN0YW5jZSBvZiBhbiBhcmNoaXZlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4cG9ydFN0cmF0ZWd5IGV4dGVuZHMgQXJjaGl2ZVN0cmF0ZWd5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzdHJhdGVneSBoYXMgYWxyZWFkeSBzYXZlZCBhIGZpbGUgZW50cnkgaGF2aW5nIGEgdXJpIG5hbWVkIGJ5IHRoZQotCSAqIHBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1NhdmVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogVGhlIGFyY2hpdmUgaXMgc2F2aW5nIGl0c2VsZiwgYW5kIGdpdmluZyB0aGUgZXhwb3J0IHN0cmF0ZWd5IHRoZSBvcHBvcnR1bml0eSB0byBkbyB3aGF0ZXZlcgotCSAqIGl0IG5lZWRzIHRvIGRvLiBUaGUgZXhwb3J0IHN0cmF0ZWd5IG1heSB3cml0ZSBlbnRyaWVzIGRpcmVjdGx5IHRvIHRoZSBTYXZlU3RyYXRlZ3ksIGJ1dCBpZiBpdAotCSAqIGRvZXMsIGl0IHNob3VsZCByZW1lbWJlciB0aGUgbmFtZXMgb2YgdGhlc2UgZW50cmllcyBzbyB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBhdHRlbXB0IHRvCi0JICogZHVwbGljYXRlIGJ5IHNhdmluZyBhbiBlbnRyeSB3aXRoIHRoZSBzYW1lIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVTYXZlKFNhdmVTdHJhdGVneSBhU2F2ZVN0cmF0ZWd5KSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjliN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yOC8wMSAxOjIwOjA5IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwgZXh0ZW5kcyBTYXZlRmlsdGVySW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlciB7Ci0JcHJvdGVjdGVkIFNldCBleGNsdWRlZEV4dGVuc2lvbnM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFNldCBleGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZTsKLQotCS8qKgotCSAqIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwoU3RyaW5nW10gZXh0ZW5zaW9uc1RvRXhjbHVkZSwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXN1cGVyKCk7Ci0JCVNldCBleHRlbnNpb25zID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uc1RvRXhjbHVkZS5sZW5ndGg7IGkrKykgewotCQkJZXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uc1RvRXhjbHVkZVtpXSk7Ci0JCX0KLQkJc2V0RXhjbHVkZWRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlzZXRJc0Nhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZSk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsKFN0cmluZyBleHRlbnNpb24sIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQlzdXBlcigpOwotCQlTZXQgZXh0ZW5zaW9ucyA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgxKTsKLQkJZXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKLQkJc2V0RXhjbHVkZWRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlzZXRJc0Nhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZSk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsKFNldCBleHRlbnNpb25zVG9FeGNsdWRlLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RXhjbHVkZWRFeHRlbnNpb25zKGV4dGVuc2lvbnNUb0V4Y2x1ZGUpOwotCQlzZXRJc0Nhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZSk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yOC8wMSAxOjI0OjI4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLlNldAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldEV4Y2x1ZGVkRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGV4Y2x1ZGVkRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMi8yOC8wMSAyOjQyOjIwIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLlNldAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuU2V0IGdldEV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlKCkgewotCQlyZXR1cm4gZXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKGlzQ2FzZVNlbnNpdGl2ZSgpKQotCQkJcmV0dXJuOwotCi0JCWphdmEudXRpbC5IYXNoU2V0IGFTZXQgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQoKTsKLQkJamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gZ2V0RXhjbHVkZWRFeHRlbnNpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYVNldC5hZGQoKChTdHJpbmcpIGl0Lm5leHQoKSkudG9VcHBlckNhc2UoKSk7Ci0JCX0KLQkJc2V0RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UoYVNldCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gaXNDYXNlU2Vuc2l0aXZlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDE6MjQ6MjggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4Y2x1ZGVkRXh0ZW5zaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4Y2x1ZGVkRXh0ZW5zaW9ucyhqYXZhLnV0aWwuU2V0IG5ld0V4Y2x1ZGVkRXh0ZW5zaW9ucykgewotCQlleGNsdWRlZEV4dGVuc2lvbnMgPSBuZXdFeGNsdWRlZEV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgMjo0MjoyMCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5TZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeGNsdWRlZEV4dGVuc2lvbnNBc1VwcGVyY2FzZShqYXZhLnV0aWwuU2V0IG5ld0V4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlKSB7Ci0JCWV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlID0gbmV3RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SXNDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gdmFsdWUpIHsKLQkJaXNDYXNlU2Vuc2l0aXZlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTYXZlKFN0cmluZyB1cmksIEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCVN0cmluZyBleHRlbnNpb24gPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmdldEZpbGVOYW1lRXh0ZW5zaW9uKHVyaSk7Ci0JCWlmIChleHRlbnNpb24uZXF1YWxzKCIiKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlTZXQgZXhjbHVkZWQ7Ci0JCWlmIChpc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJZXhjbHVkZWQgPSBnZXRFeGNsdWRlZEV4dGVuc2lvbnMoKTsKLQkJfSBlbHNlIHsKLQkJCWV4Y2x1ZGVkID0gZ2V0RXhjbHVkZWRFeHRlbnNpb25zQXNVcHBlcmNhc2UoKTsKLQkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpOwotCQl9Ci0KLQkJcmV0dXJuICFleGNsdWRlZC5jb250YWlucyhleHRlbnNpb24pOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDJiNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzAyLzAxIDU6MjA6MDAgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWxlSXRlcmF0b3IgewotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShGaWxlIGFGaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCk7Ci0KLQlwdWJsaWMgRmlsZSBuZXh0KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVJdGVyYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUl0ZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDMzZjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUl0ZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUl0ZXJhdG9ySW1wbCBpbXBsZW1lbnRzIEZpbGVJdGVyYXRvciB7Ci0JcHJvdGVjdGVkIExpc3QgZmlsZXM7Ci0JcHJvdGVjdGVkIGludCBwb3NpdGlvbiA9IDA7Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wMi8wMSA2OjE2OjUyIFBNKQotCSAqLwotCXB1YmxpYyBGaWxlSXRlcmF0b3JJbXBsKCkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQlwdWJsaWMgRmlsZUl0ZXJhdG9ySW1wbChMaXN0IHRoZUZpbGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCWZpbGVzID0gdGhlRmlsZXM7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKEZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhRmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiBwb3NpdGlvbiA8IGZpbGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBuZXh0KCkgewotCQlpZiAoIWhhc05leHQoKSkKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFbmRfb2ZfbGlzdF9yZWFjaGVkX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQgPSAiRW5kIG9mIGxpc3QgcmVhY2hlZCIKLQkJcmV0dXJuIChGaWxlKSBmaWxlcy5nZXQocG9zaXRpb24rKyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9NYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZWY4MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9NYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLQotLyoqCi0gKiBVc2VkIGZvciBtYW5pZmVzdCBzdXBwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsIGV4dGVuZHMgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ0lGSUNBVElPTl9USVRMRSA9ICJTcGVjaWZpY2F0aW9uLVRpdGxlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJQ0FUSU9OX1ZFUlNJT04gPSAiU3BlY2lmaWNhdGlvbi1WZXJzaW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJQ0FUSU9OX1ZFTkRPUiA9ICJTcGVjaWZpY2F0aW9uLVZlbmRvciI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fVElUTEUgPSAiSW1wbGVtZW50YXRpb24tVGl0bGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVEFUSU9OX1ZFUlNJT04gPSAiSW1wbGVtZW50YXRpb24tVmVyc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fVkVORE9SID0gIkltcGxlbWVudGF0aW9uLVZlbmRvciI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWFuaWZlc3RQYWNrYWdlRW50cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTWFuaWZlc3RQYWNrYWdlRW50cnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1hbmlmZXN0UGFja2FnZUVudHJ5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNpemUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBNYW5pZmVzdFBhY2thZ2VFbnRyeUltcGwoaW50IHNpemUpIHsKLQkJc3VwZXIoc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogTWFuaWZlc3RQYWNrYWdlRW50cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIE1hbmlmZXN0UGFja2FnZUVudHJ5SW1wbChqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMgYXR0cikgewotCQlzdXBlcihhdHRyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoSU1QTEVNRU5UQVRJT05fVElUTEUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25WZW5kb3IoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoSU1QTEVNRU5UQVRJT05fVkVORE9SKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldChJTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoTkFNRSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXQoU1BFQ0lGSUNBVElPTl9USVRMRSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVmVuZG9yKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KFNQRUNJRklDQVRJT05fVkVORE9SKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0KFNQRUNJRklDQVRJT05fVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25UaXRsZShTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KElNUExFTUVOVEFUSU9OX1RJVExFLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25WZW5kb3IoU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChJTVBMRU1FTlRBVElPTl9WRU5ET1IsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChJTVBMRU1FTlRBVElPTl9WRVJTSU9OLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KE5BTUUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uVGl0bGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChTUEVDSUZJQ0FUSU9OX1RJVExFLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvblZlbmRvcihTdHJpbmcgdmFsdWUpIHsKLQkJcHV0KFNQRUNJRklDQVRJT05fVkVORE9SLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvblZlcnNpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCXB1dChTUEVDSUZJQ0FUSU9OX1ZFUlNJT04sIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL05lc3RlZEFyY2hpdmVJdGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9OZXN0ZWRBcmNoaXZlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlOTc3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL05lc3RlZEFyY2hpdmVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yIGV4dGVuZHMgRmlsZUl0ZXJhdG9ySW1wbCB7Ci0JcHJvdGVjdGVkIFppcElucHV0U3RyZWFtIHppcElucHV0U3RyZWFtOwotCXByb3RlY3RlZCBaaXBFbnRyeSBjdXJyZW50RW50cnk7Ci0KLQlzdGF0aWMgY2xhc3MgV3JhcHBlcklucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewotCQkvKioKLQkJICogQHBhcmFtIGluCi0JCSAqLwotCQlwdWJsaWMgV3JhcHBlcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7Ci0JCQlzdXBlcihpbik7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNjbG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvL2RvIG5vdGhpbmcgYmVjYXVzZSB3ZSB3YW50IHRvIHByZXZlbnQgdGhlIGNsaWVudHMgZnJvbSBjbG9zaW5nIHRoZSB6aXAKLQkJfQotCX0KLQotCS8qKgotCSAqIE5lc3RlZEFyY2hpdmVJdGVyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOZXN0ZWRBcmNoaXZlSXRlcmF0b3IoTGlzdCB0aGVGaWxlcywgWmlwSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCXN1cGVyKHRoZUZpbGVzKTsKLQkJemlwSW5wdXRTdHJlYW0gPSBzdHJlYW07Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKEZpbGUgYUZpbGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICghYUZpbGUuZ2V0VVJJKCkuZXF1YWxzKGN1cnJlbnRFbnRyeS5nZXROYW1lKCkpKQotCQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkludGVybmFsX0Vycm9yX19JdGVyYXRvcl9vX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQgPSAiSW50ZXJuYWwgRXJyb3I6IEl0ZXJhdG9yIG91dCBvZiBzeW5jIHdpdGggemlwIGVudHJpZXMiCi0JCXJldHVybiBuZXcgV3JhcHBlcklucHV0U3RyZWFtKHppcElucHV0U3RyZWFtKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBuZXh0KCkgewotCQlGaWxlIG5leHQgPSBzdXBlci5uZXh0KCk7Ci0JCXRyeSB7Ci0JCQlkbyB7Ci0JCQkJY3VycmVudEVudHJ5ID0gemlwSW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0JCQl9IHdoaWxlIChjdXJyZW50RW50cnkuaXNEaXJlY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfaXRlcmF0aW5nX3RoZV9hcmNoaXZfRVhDXyIpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgaXRlcmF0aW5nIHRoZSBhcmNoaXZlIgotCQl9Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1Jlc291cmNlUHJveHlWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUmVzb3VyY2VQcm94eVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhhM2I5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUmVzb3VyY2VQcm94eVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDExLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1maW5hbCBjbGFzcyBSZXNvdXJjZVByb3h5VmFsaWRhdG9yIHsKLQlzdGF0aWMgSGFzaE1hcCByZXNvdXJjZVVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc29sdmVDb250YWluZWRQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUxpc3QgY29udGFpbmVkID0gcmVmT2JqZWN0LmVDb250ZW50cygpOwotCQlFT2JqZWN0IG1vZk9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZWQuc2l6ZSgpOyBpKyspIHsKLQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSBjb250YWluZWQuZ2V0KGkpOwotCQkJcmVzb2x2ZVByb3hpZXMobW9mT2JqZWN0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzb2x2ZU5vbkNvbnRhaW5lZFByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gcmVmT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCUVSZWZlcmVuY2UgcmVmZXJlbmNlOwotCQlFT2JqZWN0IHByb3h5T3JPYmplY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIHJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKCFyZWZlcmVuY2UuaXNDb250YWlubWVudCgpICYmICFyZWZlcmVuY2UuaXNUcmFuc2llbnQoKSkgewotCQkJCWlmIChyZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkJSXRlcmF0b3IgdmFsdWUgPSAoKExpc3QpIHJlZk9iamVjdC5lR2V0KHJlZmVyZW5jZSkpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlICh2YWx1ZS5oYXNOZXh0KCkpIHsKLQkJCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgdmFsdWUubmV4dCgpOwotCQkJCQkJaWYgKHByb3h5T3JPYmplY3QuZUlzUHJveHkoKSkKLQkJCQkJCQl2YWx1ZS5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlLCBmYWxzZSk7Ci0JCQkJCWlmIChwcm94eU9yT2JqZWN0ICE9IG51bGwgJiYgcHJveHlPck9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQkJCQlVUkkgcmVzb3VyY2VVUkkgPSAoKEVPYmplY3RJbXBsKSBwcm94eU9yT2JqZWN0KS5lUHJveHlVUkkoKS50cmltRnJhZ21lbnQoKTsKLQkJCQkJCVN0cmluZyBwcm90b2NvbCA9IHJlc291cmNlVVJJLnNjaGVtZSgpOwotCQkJCQkJaWYgKHByb3RvY29sID09IG51bGwgfHwgIXByb3RvY29sLmVxdWFscygiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgaWQgPSAoKEVPYmplY3RJbXBsKSBwcm94eU9yT2JqZWN0KS5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQkJCQkJCWlmIChyZXNvdXJjZVVSSU1hcC5nZXQocmVzb3VyY2VVUkkpICE9IG51bGwpIHsKLQkJCQkJCQkJUmVzb3VyY2UgY2FjaGVkUmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlc291cmNlVVJJTWFwLmdldChyZXNvdXJjZVVSSSk7Ci0JCQkJCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgKChYTUxSZXNvdXJjZSkgY2FjaGVkUmVzb3VyY2UpLmdldElEVG9FT2JqZWN0TWFwKCkuZ2V0KGlkKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcm94eU9yT2JqZWN0ID0gKEVPYmplY3QpIHJlZk9iamVjdC5lR2V0KHJlZmVyZW5jZSk7Ci0JCQkJCQkJCXJlc291cmNlVVJJTWFwLnB1dChyZXNvdXJjZVVSSSwgcHJveHlPck9iamVjdC5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChwcm94eU9yT2JqZWN0ID09IG51bGwgfHwgcHJveHlPck9iamVjdC5lSXNQcm94eSgpKQotCQkJCQkJCQlyZWZPYmplY3QuZVNldChyZWZlcmVuY2UsIG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNvbHZlUHJveGllcyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlpZiAocmVmT2JqZWN0ICE9IG51bGwpIHsKLQkJCXJlc29sdmVOb25Db250YWluZWRQcm94aWVzKHJlZk9iamVjdCk7Ci0JCQlyZXNvbHZlQ29udGFpbmVkUHJveGllcyhyZWZPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yY2UgYWxsIG9mIHRoZSBwcm94aWVzIHdpdGggPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHRvIGJlIHJlc29sdmVkLgotCSAqLwotCXN0YXRpYyB2b2lkIGNoZWNrRm9yVW5yZXNvbHZhYmxlUHJveGllcyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXNvdXJjZVVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7IC8vUmVzZXQgaGFzaG1hcCBvbiBlYWNoIGNhbGwKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUxpc3QgdG9wTGV2ZWxzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJCUVPYmplY3QgbW9mT2JqZWN0OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BMZXZlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQltb2ZPYmplY3QgPSAoRU9iamVjdCkgdG9wTGV2ZWxzLmdldChpKTsKLQkJCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SdW50aW1lQ2xhc3NwYXRoRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4MWM2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLQotcHVibGljIGludGVyZmFjZSBSdW50aW1lQ2xhc3NwYXRoRW50cnkgewotCi0KLQkvKioKLQkgKiBUaGUgcmVzb2x2ZWQgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkKLQkgKi8KLQlTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQl2b2lkIHNldEFic29sdXRlUGF0aChTdHJpbmcgYWJzb2x1dGVQYXRoKTsKLQotCS8qKgotCSAqIEEgc2luZ2xlIHRva2VuIGZyb20gdGhlIENsYXNzLVBhdGg6IGF0dHJidXRlCi0JICovCi0JU3RyaW5nIGdldE1hbmlmZXN0VmFsdWUoKTsKLQotCXZvaWQgc2V0TWFuaWZlc3RWYWx1ZShTdHJpbmcgbWFuaWZlc3RWYWx1ZSk7Ci0KLQkvKioKLQkgKiB2YWxpZCBvbmx5IGlmIHRoaXMgZW50cnkgaXMgYSBsaWJyYXJ5IGluIGEgV0FSRmlsZSwgdW5kZXIgV0VCLUlORi9saWIKLQkgKi8KLQlXQVJGaWxlIGdldFdhckZpbGUoKTsKLQotCXZvaWQgc2V0V2FyRmlsZShXQVJGaWxlIGFXYXJGaWxlKTsKLQotCS8qKgotCSAqIHRydWUgaWYgdGhpcyBlbnRyeSBpcyBhIGxpYnJhcnkgaW4gYSBXQVIgZmlsZQotCSAqLwotCWJvb2xlYW4gaXNXZWJMaWIoKTsKLQotCS8qKgotCSAqIFRoZSByZXNvbHZlZCBhcmNoaXZlIGluc2lkZSBhbiBFQVIgdGhhdCB0aGlzIGVudHJ5IHBvaW50cyB0bzsgTm90ZSB0aGF0IHRoaXMgaXMgTk9UIHRoZQotCSAqIEFyY2hpdmUgdGhhdCBoYXMgdGhlIGVudHJ5IGluIHRoZSBtYW5pZmVzdCwgYnV0IHJhdGhlciB0aGUgcmVmZXJlbmNlZCBhcmNoaXZlLwotCSAqLwotCUFyY2hpdmUgZ2V0UmVmZXJlbmNlZEFyY2hpdmUoKTsKLQotCXZvaWQgc2V0UmVmZXJlbmNlZEFyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWY2MGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsIGltcGxlbWVudHMgUnVudGltZUNsYXNzcGF0aEVudHJ5IHsKLQotCS8qKiBBIHNpbmdsZSB0b2tlbiBmcm9tIHRoZSBDbGFzcy1QYXRoOiBhdHRyYnV0ZSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFuaWZlc3RWYWx1ZTsKLQkvKiogVGhlIHJlc29sdmVkIGFic29sdXRlIHBhdGggb2YgdGhlIGVudHJ5ICovCi0JcHJvdGVjdGVkIFN0cmluZyBhYnNvbHV0ZVBhdGg7Ci0JLyoqIHZhbGlkIG9ubHkgaWYgdGhpcyBlbnRyeSBpcyBhIGxpYnJhcnkgaW4gYSBXQVJGaWxlLCB1bmRlciBXRUItSU5GL2xpYiAqLwotCXByb3RlY3RlZCBXQVJGaWxlIHdhckZpbGU7Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSByZWZlcmVuY2VkQXJjaGl2ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdENsYXNzcGF0aEVudHJ5SW1wbC4KLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZVBhdGguCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7Ci0JCXJldHVybiBhYnNvbHV0ZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWJzb2x1dGVQYXRoLgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZVBhdGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWJzb2x1dGVQYXRoKFN0cmluZyBhYnNvbHV0ZVBhdGgpIHsKLQkJdGhpcy5hYnNvbHV0ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWFuaWZlc3RWYWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmlmZXN0VmFsdWUoKSB7Ci0JCXJldHVybiBtYW5pZmVzdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1hbmlmZXN0VmFsdWUuCi0JICogCi0JICogQHBhcmFtIG1hbmlmZXN0VmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBtYW5pZmVzdFZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0VmFsdWUoU3RyaW5nIG1hbmlmZXN0VmFsdWUpIHsKLQkJdGhpcy5tYW5pZmVzdFZhbHVlID0gbWFuaWZlc3RWYWx1ZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2FyRmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBXQVJGaWxlCi0JICovCi0JcHVibGljIFdBUkZpbGUgZ2V0V2FyRmlsZSgpIHsKLQkJcmV0dXJuIHdhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2FyRmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gd2FyRmlsZQotCSAqICAgICAgICAgICAgVGhlIHdhckZpbGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0V2FyRmlsZShXQVJGaWxlIHdhckZpbGUpIHsKLQkJdGhpcy53YXJGaWxlID0gd2FyRmlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgUnVudGltZUNsYXNzcGF0aEVudHJ5KQotCQkJcmV0dXJuIGdldEFic29sdXRlUGF0aCgpLmVxdWFscygoKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSkgbykuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldEFic29sdXRlUGF0aCgpLmhhc2hDb2RlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSNpc1dlYkxpYigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWJMaWIoKSB7Ci0JCXJldHVybiB3YXJGaWxlICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVmZXJlbmNlZEFyY2hpdmUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGdldFJlZmVyZW5jZWRBcmNoaXZlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlZEFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVmZXJlbmNlZEFyY2hpdmUuCi0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZWRBcmNoaXZlCi0JICogICAgICAgICAgICBUaGUgcmVmZXJlbmNlZEFyY2hpdmUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZEFyY2hpdmUoQXJjaGl2ZSByZWZlcmVuY2VkQXJjaGl2ZSkgewotCQl0aGlzLnJlZmVyZW5jZWRBcmNoaXZlID0gcmVmZXJlbmNlZEFyY2hpdmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NhdmVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWRiOTdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2F2ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci0KLS8qKgotICogT2JqZWN0IHVzZWQgZm9yIHNhdmluZyBhbiBhcmNoaXZlIHdpdGggb25seSBhIHN1YnNldCBvZiBpdHMgZmlsZXMuIEJ5IGRlZmF1bHQgYWxsIGZpbGVzIGFyZQotICogc2F2ZWQuIENsaWVudHMgY2FuIGNyZWF0ZSBhIGN1c3RvbSBmaWx0ZXIgYW5kIHNldCBpdCBvbiBhIHNhdmUgc3RyYXRlZ3ksIGFuZCBjYWxsCi0gKiB7QGxpbmsgQXJjaGl2ZSNzYXZlKFNhdmVTdHJhdGVneSl9Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2F2ZUZpbHRlciB7Ci0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgYW4gZWxlbWVudCBpbiB0aGUgYXJjaGl2ZSBoYXZpbmcgdGhlIHVyaSBzaG91bGQgYmUgc2F2ZWQ7IHRoZSB1cmkgbWF5IGJlIGZvciBhCi0JICogZmlsZSwgYSBuZXN0ZWQgYXJjaGl2ZSwgb3IgYSBsb2FkZWQgbW9mIHJlc291cmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2F2ZShTdHJpbmcgdXJpLCBBcmNoaXZlIGFuQXJjaGl2ZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NhdmVGaWx0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NhdmVGaWx0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDQxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TYXZlRmlsdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotCi0KLQotLyoqCi0gKiBEZWZhdWx0IGZpbHRlciB3aGljaCBhbGxvd3MgYWxsIGVsZW1lbXRzIHRvIHNhdmUKLSAqLwotcHVibGljIGNsYXNzIFNhdmVGaWx0ZXJJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIHsKLQkvKioKLQkgKiBTYXZlRmlsdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlRmlsdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZUZpbHRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFNhdmUoamF2YS5sYW5nLlN0cmluZyB1cmksIEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4MWY3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAzLzIzLzAxIDExOjA0OjUyIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RlZEZpbGVzRmlsdGVySW1wbCBleHRlbmRzIFNhdmVGaWx0ZXJJbXBsIHsKLQkvKiogU2V0IG9mIGZpbGUgdXJpcyB0byBiZSBzYXZlZCAqLwotCXByb3RlY3RlZCBTZXQgc2VsZWN0ZWRGaWxlTmFtZXM7Ci0KLQkvKioKLQkgKiBTZWxlY3RlZEZpbGVzRmlsdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZWxlY3RlZEZpbGVzRmlsdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB3aXRoIGEgcHJlc2VsZWN0ZWQgc3Vic2V0IG9mIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSB0byBiZSBzYXZlZDsgZWFjaCBlbGVtZW50Ci0JICogaW4gdGhlIGxpc3QgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlfQotCSAqLwotCXB1YmxpYyBTZWxlY3RlZEZpbGVzRmlsdGVySW1wbChMaXN0IGFyY2hpdmVGaWxlcykgewotCQlzdXBlcigpOwotCQlTZXQgZmlsZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgYXJjaGl2ZUZpbGVzLmdldChpKTsKLQkJCWZpbGVOYW1lcy5hZGQoYUZpbGUuZ2V0VVJJKCkpOwotCQl9Ci0JCXNldFNlbGVjdGVkRmlsZU5hbWVzKGZpbGVOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUGFyYW1ldGVyIG11c3QgYmUgYSBzZXQgb2YgdmFsaWQgdXJpcyBpbiB0aGUgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBTZWxlY3RlZEZpbGVzRmlsdGVySW1wbChTZXQgZmlsZU5hbWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFNlbGVjdGVkRmlsZU5hbWVzKGZpbGVOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDMvMjMvMDEgMTE6MTk6MDEgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5TZXQgZ2V0U2VsZWN0ZWRGaWxlTmFtZXMoKSB7Ci0JCXJldHVybiBzZWxlY3RlZEZpbGVOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMy8yMy8wMSAxMToxOTowMSBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2VsZWN0ZWRGaWxlTmFtZXMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5TZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEZpbGVOYW1lcyhqYXZhLnV0aWwuU2V0IG5ld1NlbGVjdGVkRmlsZU5hbWVzKSB7Ci0JCXNlbGVjdGVkRmlsZU5hbWVzID0gbmV3U2VsZWN0ZWRGaWxlTmFtZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2F2ZShqYXZhLmxhbmcuU3RyaW5nIHVyaSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGdldFNlbGVjdGVkRmlsZU5hbWVzKCkuY29udGFpbnModXJpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FsdFJlc291cmNlUmVnaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQWx0UmVzb3VyY2VSZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVmNzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQWx0UmVzb3VyY2VSZWdpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgQWx0UmVzb3VyY2VSZWdpc3RlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTZXQgcmVnaXN0ZXJlZFVSSXMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJvdGVjdGVkIEFsdFJlc291cmNlUmVnaXN0ZXIoKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIEFyY2hpdmUgcmVsYXRpdmUgcGF0aCBmb3IgdGhlIHJlc291cmNlIHdoaWNoIGNhbiBiZSBjb3BpZWQgdXAgYXMgYW4gYWx0IGluIGFuCi0JICogRUFSIGZpbGUuIFRoZSB1cmkgc2hvdWxkIGJlIGluIGNhbmFub25pY2FsIGZvcm0gYW5kIHVzZSB0aGUgZm9yd2FyZCBzbGFzaCwgZWcsCi0JICogIk1FVEEtSU5GL3ZlbmRvci1leHRlbnNpb25zLnhtaSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJVUkkoU3RyaW5nIHVyaSkgewotCQlyZWdpc3RlcmVkVVJJcy5hZGQodXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVSZWdpc3RlclVSSShTdHJpbmcgdXJpKSB7Ci0JCXJlZ2lzdGVyZWRVUklzLnJlbW92ZSh1cmkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gcmVnaXN0ZXJlZFVSSXMuY29udGFpbnModXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRSZWdpc3RlcmVkVVJJcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChyZWdpc3RlcmVkVVJJcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudEZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3ZTI1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCBleHRlbmRzIE1vZHVsZUZpbGVJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25DbGllbnRGaWxlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbkNsaWVudCBkZXBsb3ltZW50RGVzY3JpcHRvciA9IG51bGw7Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlBcHBsaWNhdGlvbkNsaWVudCBkZCA9IHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQkJaWYgKGRkID09IG51bGwgJiYgY2FuTGF6eUluaXRpYWxpemUoKSkgewotCQkJdHJ5IHsKLQkJCQlnZXRJbXBvcnRTdHJhdGVneSgpLmltcG9ydE1ldGFEYXRhKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRGVwbG95ZW1lbnREZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGFDbGllbnQgPSAoKENsaWVudFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkpLmdldENsaWVudEZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotCQlyZXNvdXJjZS5zZXRJRChhQ2xpZW50LCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfSUQpOwotCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihhQ2xpZW50KTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoYUNsaWVudCk7Ci0JCXJldHVybiBhQ2xpZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uQ2xpZW50IGwpIHsKLQkJdGhpcy5zZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihsKTsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19DT05UQUlORVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldExhc3RNb2RpZmllZCgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldFNpemUoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzRGlyZWN0b3J5RW50cnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIGdldE9yaWdpbmFsVVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIHR5cGVzICE9IG51bGwgJiYgIXR5cGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlzZXRMYXN0TW9kaWZpZWQoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCWdldFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEFwcGxpY2F0aW9uQ2xpZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVVJJOgotCQkJCXNldFVSSShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19TSVpFOgotCQkJCXVuc2V0U2l6ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQl1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQXBwbGljYXRpb25DbGllbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCkgewotCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXBsb3ltZW50RGVzY3JpcHRvci5lSXNQcm94eSgpKSB7Ci0JCQlBcHBsaWNhdGlvbkNsaWVudCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSAoQXBwbGljYXRpb25DbGllbnQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWRlcGxveW1lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBvbGREZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50IGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihBcHBsaWNhdGlvbkNsaWVudCBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQlBcHBsaWNhdGlvbkNsaWVudCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ld0RlcGxveW1lbnREZXNjcmlwdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDg2OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5U2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotLyoqCi0gKiBPdmVyUmlkZSBjbGFzcyB0byB1c2UgdGhlIHByb3BlciBjb3B5aW5nIG9mIFhNTFJlc291cmNlIGRvY3R5cGVzLiBIYWQgdG8gY3JlYXRlIHRoaXMgY2xhc3MgRHVlIHRvCi0gKiB0aGUgd2F5IGl0J3MgaGFuZGxlZCBpbiB0aGUgY29weSBjb21tYW5kcyBvZiBFdG9vbHNDb3B5VXRpbGl0eQotICogCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMTgvMDEgODg4ODg4ODg6NDggUE0pCi0gKiAKLSAqIEBhdXRob3I6IEphcmVkIEp1cmtpZXdpY3oKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkgZXh0ZW5kcyBFdG9vbHNDb3B5U2Vzc2lvbiB7Ci0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlpZiAoY29waWVkIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkKLQkJCWNvcHlQcmltS2V5SW5mbygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYVJlZk9iamVjdCwgKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGNvcGllZCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgcHJpbUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBzdXBlci5wcmltQ29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWlmIChjb3BpZWQgaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KQotCQkJY29weVByaW1LZXlJbmZvKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBhUmVmT2JqZWN0LCAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgY29waWVkKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eShFdG9vbHNDb3B5VXRpbGl0eSBhQ29weVV0aWxpdHkpIHsKLQkJc3VwZXIoYUNvcHlVdGlsaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5U2Vzc2lvbiNuZXdJbnN0YW5jZShSZXNvdXJjZSwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBuZXdJbnN0YW5jZShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJUmVzb3VyY2UgY29weVJlc291cmNlID0gc3VwZXIubmV3SW5zdGFuY2UoYVJlc291cmNlLCBuZXdVcmkpOwotCi0JCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKLQkJCSgoWE1MUmVzb3VyY2UpIGNvcHlSZXNvdXJjZSkuc2V0VmVyc2lvbklEKCgoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZSkuZ2V0VmVyc2lvbklEKCkpOwotCQlyZXR1cm4gY29weVJlc291cmNlOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldENvcHlJZkZvdW5kKEVPYmplY3QgYW5PYmplY3QpIHsKLQkJRU9iamVjdCBjb3BpZWRPYmplY3QgPSBzdXBlci5nZXRDb3B5SWZGb3VuZChhbk9iamVjdCk7Ci0JCWlmICgoYW5PYmplY3QgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpICYmIChhbk9iamVjdCA9PSBjb3BpZWRPYmplY3QpKSB7Ci0JCQljb3BpZWRPYmplY3QgPSBuZXdJbnN0YW5jZShhbk9iamVjdCk7Ci0JCQlVUkkgdXJpID0gRWNvcmVVdGlsLmdldFVSSShhbk9iamVjdCk7Ci0JCQkoKEludGVybmFsRU9iamVjdCkgY29waWVkT2JqZWN0KS5lU2V0UHJveHlVUkkodXJpKTsKLQkJfQotCQlyZXR1cm4gY29waWVkT2JqZWN0OwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBzdXBlci5jb3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJaWYgKGNvcGllZCBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpCi0JCQljb3B5UHJpbUtleUluZm8oKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGFSZWZPYmplY3QsIChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBjb3BpZWQpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvcHlQcmltS2V5SW5mbyhDb250YWluZXJNYW5hZ2VkRW50aXR5IHNvdXJjZSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjb3BpZWQpIHsKLQkJQ01QQXR0cmlidXRlIHByaW1LZXlGaWVsZCA9IHNvdXJjZS5nZXRQcmltS2V5RmllbGQoKTsKLQkJaWYgKHByaW1LZXlGaWVsZCAhPSBudWxsKQotCQkJY29waWVkLnNldFByaW1LZXlGaWVsZChwcmltS2V5RmllbGQpOwotCX0KLQotCS8qCi0JICogU3VwZXIgY2xhc3Mgb3ZlcnJpZGUgdG8gaGFuZGxlIHVucmVzb2x2YWJsZSBwcm94aWVzIChKYXZhQ2xhc3MpCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoYVJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJTGlzdCB2YWx1ZSA9IChMaXN0KSBhUmVmT2JqZWN0LmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQljb3B5TWFueVJlZmVyZW5jZShhUmVmZXJlbmNlLCB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9IGVsc2UgaWYgKGFSZWZPYmplY3QuZUlzU2V0KGFSZWZlcmVuY2UpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBhUmVmT2JqZWN0LmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQl2YWx1ZSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhUmVmT2JqZWN0KS5lR2V0KGFSZWZlcmVuY2UsIGZhbHNlKTsKLQkJCWNvcHlTaW5nbGVSZWZlcmVuY2UoYVJlZmVyZW5jZSwgKEVPYmplY3QpIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFjYzE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkRlZmF1bHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkNvcHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTgvMDAgNjoyNjo0OCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUNvcHlVdGlsaXR5IGV4dGVuZHMgRXRvb2xzQ29weVV0aWxpdHkgewotCS8qKgotCSAqIE1vZHVsZUZpbGVDb3B5VXRpbHRpdHkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZUNvcHlVdGlsaXR5KCkgewotCQlzdXBlcigpOwotCQlzZXRDb3B5QWRhcHRlcnModHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiBFbmQgb2YgY29kZSBwdWxsZWQgZnJvbSBFdG9vbHNDb3B5VXRpbGl0eSB0byBvdmVyLXJpZGUgdGhlIHByaW1Db3B5IG1ldGhvZC4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weShFUmVmZXJlbmNlIHJlZmVyZW5jZSwgRU9iamVjdCBhVmFsdWUsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlpZiAoKChEZWZhdWx0YWJsZSkgYVZhbHVlKS5pc0RlZmF1bHQoKSkKLQkJCXJldHVybjsKLQkJc3VwZXIuYWRkRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5KHJlZmVyZW5jZSwgYVZhbHVlLCBpZFN1ZmZpeCwgYUNvcHlDb250YWluZXIpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3QgY29weShBcmNoaXZlTWFuaWZlc3QgbWYpIHsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQltZi53cml0ZShvdXQpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotCQkJcmV0dXJuIG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGluKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQkvL1RoaXMgc2hvdWxkIGFsbW9zdCBuZXZlciBoYXBwZW4sIHVubGVzcyB0aGVyZSBpcyBhbiBpc3N1cmUgd2l0aCBtZW1vcnkgYWxsb2NhdGlvbgotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJT0V4Y2VwdGlvbl9vY2N1cnJlZF93aGlsZV9FWENfIiksIGlveCk7IC8vJE5PTi1OTFMtMSQgPSAiSU9FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgY29weWluZyBtYW5pZmVzdCIKLQkJfQotCX0KLQotCXB1YmxpYyBBcmNoaXZlIGNvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQotCQkvL0ZpcnN0IGNyZWF0ZSBhIGNvcHkgZ3JvdXAgYW5kIGNvcHkgdXRpbDsgY29weSB0aGUgYXJjaGl2ZSBhbmQgYWxsIGl0cyByZXNvdXJjZXMKLQkJQ29weUdyb3VwIGNvcHlHcm91cCA9IG5ldyBDb3B5R3JvdXAoKTsKLQkJY29weUdyb3VwLnNldFByZXNlcnZlSWRzKHRydWUpOwotCQlwcmVwYXJlUmVzb3VyY2VzRm9yQ29weShhbkFyY2hpdmUsIGNvcHlHcm91cCk7Ci0JCWNvcHlHcm91cC5hZGQoYW5BcmNoaXZlKTsKLQkJdGhpcy5jb3B5KGNvcHlHcm91cCk7Ci0KLQkJQXJjaGl2ZSBjb3BpZWRBcmNoaXZlID0gKEFyY2hpdmUpIGdldENvcHkoYW5BcmNoaXZlKTsKLQotCQlmaW5pc2hDb3B5KGFuQXJjaGl2ZSwgY29waWVkQXJjaGl2ZSwgY29weUdyb3VwKTsKLQkJcmV0dXJuIGNvcGllZEFyY2hpdmU7Ci0JfQotCi0JcHVibGljIE1vZHVsZUZpbGUgY29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCS8qKgotCQkgKiBUaW1pbmcgaXNzdWU7IGlmIHRoZSByZXNvdXJjZXMgY29udGFpbmluZyB0aGUgYmluZGluZ3MsIGV4dGVuc2lvbnMsIGFuZCBkZCBoYXZlIG5vdCB5ZXQKLQkJICogYmUgbG9hZGVkLCBmb3JjZSB0aGF0IGJlZm9yZSB0aGUgY29weSBvY2N1cnM7IG90aGVyd2lzZSwgdGhleSB3aWxsIGdldCBsb2FkZWQgYXMgdGhlCi0JCSAqIGFjY2Vzc29ycyBhcmUgaW52b2tlZCBkdXJpbmcgY29weS4gQmVjYXVzZSB0aGV5IHdpbGwgYmUgbG9hZGVkIGJ1dCBub3QgY29waWVkIGludG8gdGhlCi0JCSAqIG5ldyBhcmNoaXZlJ3MgY29udGV4dCwgdGhlbiBjaGFuZ2VzIHdpbGwgbm90IGdldCBzYXZlZC4gQnkgZm9yY2luZyB0aGUgbG9hZCBiZWZvcmUgdGhlCi0JCSAqIGNvcHkgY29tbWVuY2VzLCB0aGUgbG9hZGVkIHJlc291cmNlcyB3aWxsIGFsc28gYmUgY29waWVkIHRvIHRoZSBuZXcgYXJjaGl2ZQotCQkgKi8KLQkJYU1vZHVsZUZpbGUuZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCS8qCi0JCSAqIFJMUy04LzEyLzIwMDIgSGFjayB0byBmaXggYm90cCBkZWZlY3QgIjE0MTY0MC1mYWlsZWQgdG8gaW5zdGFsbCAud2FyIGZpbGUgd2l0aAotCQkgKiBmaWx0ZXItbWFwcGluZyIgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGVyZSBpcyBhIHRyYW5zaWVudCBmaWVsZCBvbiB0aGUgZmlsdGVyIG1hcHBpbmcKLQkJICogY2xhc3MgZm9yIHRoZSBzZXJ2bGV0IG5hbWUgdGhlIHJlbGF0aW9uc2hpcCB0byB0aGUgc2VydmxldCBpcyBsYXppbHkgcG9wdWxhdGVkIHRoZSBmaXJzdAotCQkgKiB0aW1lIGl0IGlzIHJlcXVlc3RlZC4gSWYgd2UgZG9uJ3QgdHJpcCBpdCwgdGhlbiBpdCB3b24ndCBnZXQgY29waWVkLgotCQkgKi8KLQotCQlpZiAoYU1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCUxpc3QgZmlsdGVyTWFwcGluZ3MgPSAoKFdBUkZpbGUpIGFNb2R1bGVGaWxlKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpbHRlck1hcHBpbmdzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlck1hcHBpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJKChGaWx0ZXJNYXBwaW5nKSBmaWx0ZXJNYXBwaW5ncy5nZXQoaSkpLmdldFNlcnZsZXQoKTsKLQkJCX0KLQkJfQotCQlNb2R1bGVGaWxlIGNvcGllZCA9IChNb2R1bGVGaWxlKSBjb3B5KChBcmNoaXZlKSBhTW9kdWxlRmlsZSk7Ci0KLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyB3ZXJlIHB1bGxlZCBvdXQgb2YgRXRvb2xzQ29weVV0aWxpdHkgc28gd2UgY2FuIG92ZXItcmlkZSB0aGUKLQkgKiBFdG9vbHNDb3B5U2Vzc2lvbiBvYmplY3Qgd2l0aCBvdXIgb3duIHN1Y2ggdGhhdCBkb2ljdHlwZXMgZG8gZ2V0IHByZXNlcnZlZCB3aXRoIFhNTAotCSAqIFJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJaWYgKGFHcm91cCAhPSBudWxsKSB7Ci0JCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkodGhpcyk7Ci0JCQlzZXNzaW9uLnNldFByZXNlcnZlSWRzKGFHcm91cC5nZXRQcmVzZXJ2ZUlkcygpKTsKLQkJCXNlc3Npb24uY29weShhR3JvdXApOwotCQkJc2Vzc2lvbi5mbHVzaCgpOwotCQl9Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkodGhpcyk7Ci0JCUVPYmplY3QgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkodGhpcyk7Ci0JCVJlc291cmNlIGNvcGllZCA9IHNlc3Npb24uY29weShhUmVzb3VyY2UsIG5ld1VyaSk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5SW1wb3J0U3RyYXRlZ3lJZk5lY2Vzc2FyeShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlLCBNb2R1bGVGaWxlIGNvcHkpIHsKLQkJaWYgKCFhTW9kdWxlRmlsZS5pc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkpCi0JCQljb3B5LnNldEltcG9ydFN0cmF0ZWd5KGFNb2R1bGVGaWxlLmdldEltcG9ydFN0cmF0ZWd5KCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3koYU1vZHVsZUZpbGUsIGNvcHkpKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjb3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKLQkJRU9iamVjdCBjb3BpZWQgPSBzZXNzaW9uLmNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlBcmNoaXZlQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBBcmNoaXZlQ29weVV0aWxpdHkoKTsKLQkJdXRpbGl0eS5jb3B5KGFHcm91cCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoQ29weShBcmNoaXZlIHNvdXJjZSwgQXJjaGl2ZSBjb3B5LCBDb3B5R3JvdXAgZ3JvdXApIHsKLQotCQljb3B5LnNldExvYWRTdHJhdGVneShnZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVtcHR5TG9hZFN0cmF0ZWd5KCkpOwotCQljb3B5LnNldEV4dHJhQ2xhc3NwYXRoKHNvdXJjZS5nZXRFeHRyYUNsYXNzcGF0aCgpKTsKLQkJY29weS5zZXRYbWxFbmNvZGluZyhzb3VyY2UuZ2V0WG1sRW5jb2RpbmcoKSk7Ci0JCWlmIChzb3VyY2UuaXNNYW5pZmVzdFNldCgpKSB7Ci0JCQljb3B5LnNldE1hbmlmZXN0KGNvcHkoc291cmNlLmdldE1hbmlmZXN0KCkpKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJRmlsZSBtYW5pZmVzdFRvQ29weSA9IHNvdXJjZS5nZXRGaWxlKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJCQlpZiAobWFuaWZlc3RUb0NvcHkgIT0gbnVsbCkgewotCQkJCQlGaWxlIGNvcGllZE1hbmlmZXN0ID0gKEZpbGUpIGdldENvcHkobWFuaWZlc3RUb0NvcHkpOwotCQkJCQljb3BpZWRNYW5pZmVzdC5zZXRMb2FkaW5nQ29udGFpbmVyKG1hbmlmZXN0VG9Db3B5LmdldExvYWRpbmdDb250YWluZXIoKSk7Ci0JCQkJCWNvcHkuYWRkQ29weShjb3BpZWRNYW5pZmVzdCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfSBjYXRjaCAoRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCXJldHJpZXZlUmVzb3VyY2VzRnJvbUNvcHkoY29weSwgZ3JvdXApOwotCi0JCWlmIChzb3VyY2UuaXNNb2R1bGVGaWxlKCkpCi0JCQljb3B5SW1wb3J0U3RyYXRlZ3lJZk5lY2Vzc2FyeSgoTW9kdWxlRmlsZSkgc291cmNlLCAoTW9kdWxlRmlsZSkgY29weSk7Ci0KLQkJTGlzdCBmaWxlcyA9IHNvdXJjZS5nZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCUZpbGUgY29waWVkRmlsZSA9IChGaWxlKSBnZXRDb3B5KGFGaWxlKTsKLQkJCWNvcGllZEZpbGUuc2V0TG9hZGluZ0NvbnRhaW5lcihhRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCkpOwotCQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpKQotCQkJCWZpbmlzaE5lc3RlZENvcHkoKEFyY2hpdmUpIGFGaWxlLCAoQXJjaGl2ZSkgY29waWVkRmlsZSk7Ci0JCX0KLQkJLy9Ob3RpZmljYXRpb24gd2FzIHN1c3BlbmRlZCBkdXJpbmcgY29weTsgdGhlcmVmb3JlIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBmaWxlcwotCQkvL0luIHRoZSBhcmNoaXZlIGdldCBpbmRleGVkCi0JCWNvcHkucmVidWlsZEZpbGVJbmRleCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmlzaE5lc3RlZENvcHkoQXJjaGl2ZSBzb3VyY2UsIEFyY2hpdmUgY29weSkgewotCi0JCUNvcHlHcm91cCBncm91cCA9IG5ldyBDb3B5R3JvdXAoKTsKLQkJcHJlcGFyZVJlc291cmNlc0ZvckNvcHkoc291cmNlLCBncm91cCk7Ci0JCWNvcHkoZ3JvdXApOwotCQlmaW5pc2hDb3B5KHNvdXJjZSwgY29weSwgZ3JvdXApOwotCX0KLQotCXByaXZhdGUgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVzb3VyY2VzRm9yQ29weShBcmNoaXZlIGFuQXJjaGl2ZSwgQ29weUdyb3VwIGNvcHlHcm91cCkgewotCQlJdGVyYXRvciBpdGVyID0gYW5BcmNoaXZlLmdldExvYWRlZE1vZlJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFBcmNoaXZlVXRpbC5pc0phdmFSZXNvdXJjZShyZXNvdXJjZSkpCi0JCQkJY29weUdyb3VwLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXRyaWV2ZVJlc291cmNlc0Zyb21Db3B5KEFyY2hpdmUgY29waWVkQXJjaGl2ZSwgQ29weUdyb3VwIGNvcHlHcm91cCkgewotCi0JCUxpc3QgcmVzb3VyY2VzID0gY29weUdyb3VwLmdldENvcGllZFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgY29waWVkUmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQljb3BpZWRBcmNoaXZlLmFkZE9yUmVwbGFjZU1vZlJlc291cmNlKGNvcGllZFJlc291cmNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1ZmQ2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGsuSmF2YUpES0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk1hbmlmZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVvcGVuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlppcFN0cmVhbVNhdmVTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQ2xhc3NwYXRoVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUltcGwgZXh0ZW5kcyBDb250YWluZXJJbXBsIGltcGxlbWVudHMgQXJjaGl2ZSB7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlcygpIDxlbT5UeXBlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0VHlwZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0eXBlcyA9IG51bGw7Ci0KLQkvKiogT3VyIHNwZWNpYWxpemVkIG1hbmlmZXN0ICovCi0JcHJvdGVjdGVkIEFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdDsKLQotCS8qKiBJbXBsZW1lbnRlciBmb3Igc2F2aW5nIHRoaXMgYXJjaGl2ZSAqLwotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgc2F2ZVN0cmF0ZWd5OwotCi0JLyoqCi0JICogT3B0aW9uYWwgZmlsdGVyIGZvciBzYXZpbmcgYSBzdWJzZXQgb2YgZmlsZXM7IGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgZm9yIGFsbCBzYXZlIGFuZCBleHRyYWN0Ci0JICogaW52b2thdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZUZpbHRlciBzYXZlRmlsdGVyOwotCi0JLyoqIEVuY29kaW5nIHRvIGJlIHVzZWQgZm9yIGFsbCB4bWkgcmVzb3VyY2VzIGFuZCB4bWwgZGRzOyBkZWZhdWx0cyB0byBVVEYtOCAqLwotCXByb3RlY3RlZCBTdHJpbmcgeG1sRW5jb2RpbmcgPSBKMkVFQ29uc3RhbnRzLkRFRkFVTFRfWE1MX0VOQ09ESU5HOwotCi0JLyoqIEN1c3RvbSBjbGFzcyBsb2FkZXIgdXNlZCB0byBsb2FkIGNsYXNzZXMgZnJvbSB0aGUgYXJjaGl2ZSAqLwotCXByb3RlY3RlZCBDbGFzc0xvYWRlciBhcmNoaXZlQ2xhc3NMb2FkZXI7Ci0KLQkvKioKLQkgKiBwYXRoIG9mIHRoZSBzdGFuZGFyZCBjbGFzc3BhdGggZm9ybWF0IHdoZXJlIHRoZSBhcmNoaXZlIG1heSBsb29rIGZvciBjbGFzc2VzIG5vdCBmb3VuZCBpbiB0aGUKLQkgKiBzeXN0ZW0gY2xhc3NwYXRoIG9yIGluIHRoZSBhcmNoaXZlIC0gdXNlZCBmb3IgamF2YSByZWZsZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRyYUNsYXNzcGF0aDsKLQotCXByb3RlY3RlZCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zOwotCi0JcHVibGljIEFyY2hpdmVJbXBsKCkgewotCQlzdXBlcigpOwotCQlnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmFyY2hpdmVPcGVuZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFR5cGVzKCkgewotCQlpZiAodHlwZXMgPT0gbnVsbCkgewotCQkJdHlwZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0NPTlRBSU5FUjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldExhc3RNb2RpZmllZCgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fU0laRToKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0U2l6ZSgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc0RpcmVjdG9yeUVudHJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIGdldE9yaWdpbmFsVVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCXJldHVybiBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTOgotCQkJCXJldHVybiBnZXRUeXBlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1VSSToKLQkJCQlzZXRVUkkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1NJWkU6Ci0JCQkJdW5zZXRTaXplKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJdW5zZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBpc1NldExhc3RNb2RpZmllZCgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19TSVpFOgotCQkJCXJldHVybiBpc1NldFNpemUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gT1JJR0lOQUxfVVJJX0VERUZBVUxUID09IG51bGwgPyBvcmlnaW5hbFVSSSAhPSBudWxsIDogIU9SSUdJTkFMX1VSSV9FREVGQVVMVC5lcXVhbHMob3JpZ2luYWxVUkkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lciAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX0ZJTEVTOgotCQkJCXJldHVybiBmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFSQ0hJVkVfX1RZUEVTOgotCQkJCXJldHVybiB0eXBlcyAhPSBudWxsICYmICF0eXBlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBhZGRDb3B5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWNoZWNrQWRkVmFsaWQoYW5BcmNoaXZlKTsKLQkJQXJjaGl2ZSBjb3B5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jb3B5KGFuQXJjaGl2ZSk7Ci0JCWdldEZpbGVzKCkuYWRkKGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZSBBZGRzIGEgY29weSBvZiB0aGUgcGFyYW1ldGVyIHRvIHRoaXMgYXJjaGl2ZQotCSAqIEB0aHJvd3MgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGFyY2hpdmUgYWxyZWFkeSBjb250YWlucyBhIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHVyaQotCSAqLwotCXB1YmxpYyBGaWxlIGFkZENvcHkoRmlsZSBhRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpIHsKLQkJCWFkZENvcHkoKFJlYWRPbmx5RGlyZWN0b3J5KSBhRmlsZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQljaGVja0FkZFZhbGlkKGFGaWxlKTsKLQkJRmlsZSBjb3B5ID0gY29weShhRmlsZSk7Ci0JCWdldEZpbGVzKCkuYWRkKGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBmbGF0dGVuZWQgbGlzdCBmcm9tIHRoZSBkaXJlY3RvcnksIHRoZW4gYWRkQ29weSB0aGUgbGlzdAotCSAqIAotCSAqIEB0aHJvd3MgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBmaWxlIHdpdGggYSB1cmkgdGhhdCBlcXVhbHMgb25lIG9mIHRoZSBuZXN0ZWQgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBleGlzdHMKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IHRoZSBjb3BpZWQgZmlsZXMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBhcmNoaXZlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGFkZENvcHkoUmVhZE9ubHlEaXJlY3RvcnkgZGlyKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhZGRDb3B5RmlsZXMoZGlyLmdldEZpbGVzUmVjdXJzaXZlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIExpc3QgYWRkQ29weUZpbGVzKGphdmEudXRpbC5MaXN0IGxpc3QpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJLy9PcHRpbWl6YXRpb24gLSBtYWtlIHN1cmUgdGhlIGZpbGVJbmRleCBpcyBhbHJlYWR5IGJ1aWx0IHRvIHNwZWVkIHVwCi0JCS8vIGNvbnRhaW5zRmlsZQotCQlnZXRGaWxlcygpOwotCQlMaXN0IGNvcHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgbGlzdC5nZXQoaSk7Ci0JCQljaGVja0FkZFZhbGlkKGFGaWxlKTsKLQkJCWNvcHlMaXN0LmFkZChjb3B5KGFGaWxlKSk7Ci0JCX0KLQkJZ2V0RmlsZXMoKS5hZGRBbGwoY29weUxpc3QpOwotCQlyZXR1cm4gY29weUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRPclJlcGxhY2VNb2ZSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWdldExvYWRTdHJhdGVneSgpLmFkZE9yUmVwbGFjZU1vZlJlc291cmNlKGFSZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCl9Ci0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5DbG9zZSgpIHsKLQkJcmV0dXJuICFnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmdldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKHRoaXMpLmlzRW1wdHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0FkZFZhbGlkKEZpbGUgYUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQljaGVja0FkZFZhbGlkKGFGaWxlLmdldFVSSSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0FkZFZhbGlkKFN0cmluZyBhVXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZiA9IGdldEZpbGUoYVVyaSk7Ci0JCQlpZiAoZiAhPSBudWxsKQotCQkJCXRocm93IG5ldyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImR1cGxpY2F0ZV9maWxlX0VYQ18iLCAobmV3IE9iamVjdFtde2dldFVSSSgpLCBhVXJpfSkpLCBmKTsgLy8kTk9OLU5MUy0xJCA9ICJUaGUgYXJjaGl2ZSBuYW1lZCB7MH0gYWxyZWFkeSBjb250YWlucyBhIGZpbGUgbmFtZWQgezF9IgotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gb2spIHsKLQkJCS8vSWdub3JlCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgYVVyaSwgamF2YS5pby5GaWxlIG9yaWdpbmFsLCBqYXZhLmlvLkZpbGUgZGVzdGluYXRpb25GaWxlKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCi0JCWNoZWNrV3JpdGVhYmxlKG9yaWdpbmFsKTsKLQkJYm9vbGVhbiBkZWxldGVXb3JrZWQgPSBmYWxzZTsKLQkJaWYgKG9yaWdpbmFsLmlzRGlyZWN0b3J5KCkgJiYgIWlzUmVuYW1lYWJsZShvcmlnaW5hbCkpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygidW5hYmxlX3JlcGxhY2VfRVhDXyIsIChuZXcgT2JqZWN0W117b3JpZ2luYWwuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIlVuYWJsZSB0byByZXBsYWNlIG9yaWdpbmFsIGFyY2hpdmUgIgotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpZiAoQXJjaGl2ZVV0aWwuZGVsZXRlKG9yaWdpbmFsKSkgewotCQkJCWRlbGV0ZVdvcmtlZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIFRPRE8gTWFqb3IgaGFjayBoZXJlOyB0aGUgcHJvYmxlbSBpcyB0aGF0IGEgcHJldmlvdXMgY2FsbAotCQkJCS8vIHRvIGNsb3NlIHRoZSBzb3VyY2UgZmlsZSBtYXkgbm90IHlldCBoYXZlCi0JCQkJLy9iZWVuIHJlZmxlY3RlZCBpbiB0aGUgb3Mvdm07IHRoZXJlZm9yZSBhIHN1YnNlcXVlbnQgY2FsbAotCQkJCS8vIHRvIGRlbGV0ZSBmYWlscy4gVG8gZ2V0IGFyb3VuZCB0aGlzLAotCQkJCS8vd2FpdCBmb3IgYSBiaXQgYW5kIHJldHJ5OyBpZiBpdCBjb250aW51ZXMgdG8gZmFpbCwgdGhlbgotCQkJCS8vIHRpbWUgb3V0IGFuZCB0aHJvdyBhbiBleGNlcHRpb24KLQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCWlmIChkZWxldGVXb3JrZWQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCWlmIChkZXN0aW5hdGlvbkZpbGUucmVuYW1lVG8ob3JpZ2luYWwpKQotCQkJCQlyZXR1cm47Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoInVuYWJsZV9yZXBsYWNlX0VYQ18iLCAobmV3IE9iamVjdFtde29yaWdpbmFsLmdldEFic29sdXRlUGF0aCgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJVbmFibGUgdG8gcmVwbGFjZSBvcmlnaW5hbCBhcmNoaXZlICIKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlnZXRMb2FkU3RyYXRlZ3koKS5jbG9zZSgpOwotCQlyZWxlYXNlQ2xhc3NMb2FkZXIoKTsKLQkJZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5hcmNoaXZlQ2xvc2VkKHRoaXMpOwotCQlpZiAoaXNJbmRleGVkKCkpIHsKLQkJCUxpc3QgYXJjaGl2ZXMgPSBnZXRBcmNoaXZlRmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJjaGl2ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkoKEFyY2hpdmUpIGFyY2hpdmVzLmdldChpKSkuY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBGaWxlIGNvcHkoRmlsZSBhRmlsZSkgewotCQlGaWxlIGNvcHkgPSBudWxsOwotCQlpZiAoYUZpbGUuaXNBcmNoaXZlKCkpCi0JCQljb3B5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jb3B5KChBcmNoaXZlKSBhRmlsZSk7Ci0JCWVsc2UKLQkJCWNvcHkgPSAoRmlsZSkgRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weShhRmlsZSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXByb3RlY3RlZCBMb2FkU3RyYXRlZ3kgY3JlYXRlTG9hZFN0cmF0ZWd5Rm9yUmVvcGVuKEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSA9IG51bGw7Ci0JCUxvb3NlQXJjaGl2ZSBsb29zZSA9IGdldExvYWRTdHJhdGVneSgpLmdldExvb3NlQXJjaGl2ZSgpOwotCi0JCWlmIChsb29zZSAhPSBudWxsKSB7Ci0JCQlhTG9hZFN0cmF0ZWd5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVMb2FkU3RyYXRlZ3kobG9vc2UuZ2V0QmluYXJpZXNQYXRoKCkpOwotCQkJYUxvYWRTdHJhdGVneS5zZXRMb29zZUFyY2hpdmUobG9vc2UpOwotCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBudWxsKQotCQkJYUxvYWRTdHJhdGVneSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlTG9hZFN0cmF0ZWd5KGdldFVSSSgpKTsKLQkJZWxzZQotCQkJYUxvYWRTdHJhdGVneSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQ2hpbGRMb2FkU3RyYXRlZ3koZ2V0VVJJKCksIHBhcmVudC5nZXRMb2FkU3RyYXRlZ3koKSk7Ci0KLQkJcmV0dXJuIGFMb2FkU3RyYXRlZ3k7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoU3RyaW5nIGFic29sdXRlUGF0aCkgewotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbCgpOwotCQllbnRyeS5zZXRBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYWxsIHRoZSBjbGFzc3BhdGggZW50cmllcyB0byBhYnNvbHV0ZSBwYXRocwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyaWVzKFN0cmluZ1tdIGVudHJpZXMsIFN0cmluZyBwYXJlbnRQYXRoKSB7Ci0KLQkJTGlzdCBhTGlzdCA9IG5ldyBBcnJheUxpc3QoZW50cmllcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkvKgotCQkJICogQWRkZWQgZm9yIGxvb3NlIG1vZHVsZSBzdXBwb3J0IC0gaWYgdGhlIGNhbmFub25pY2FsaXplZCBlbnRyeSByZXNvbHZlcyB0byBhbiBhcmNoaXZlCi0JCQkgKiBpbiB0aGUgY29udGFpbmluZyBlYXIsIHRoZW4gYWRkIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoYXQgYXJjaGl2ZQotCQkJICovCi0JCQlBcmNoaXZlIGRlcGVuZGVudEphciA9IHJlc29sdmVDbGFzc3BhdGhFbnRyeUluRUFSKGVudHJ5KTsKLQkJCWlmIChkZXBlbmRlbnRKYXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBydW5FbnRyeSA9IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShkZXBlbmRlbnRKYXIuZ2V0QmluYXJpZXNQYXRoKCksIGVudHJ5KTsKLQkJCQkJcnVuRW50cnkuc2V0UmVmZXJlbmNlZEFyY2hpdmUoZGVwZW5kZW50SmFyKTsKLQkJCQkJYUxpc3QuYWRkKHJ1bkVudHJ5KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHNob3VsZG50SGFwcGVuSW5SdW50aW1lKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQkJLy9PdGhlcndpc2UsIGNvbXB1dGUgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGVudHJ5IHJlbGF0aXZlIHRvCi0JCQkvLyB0aGlzIGphcgotCQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShlbnRyeSk7Ci0JCQlTdHJpbmcgYWJzUGF0aCA9IG51bGw7Ci0JCQlpZiAoYUZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJCWFic1BhdGggPSBhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCWVsc2UgewotCQkJCWFic1BhdGggPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShwYXJlbnRQYXRoLCBlbnRyeSk7Ci0JCQkJYWJzUGF0aCA9IENsYXNzcGF0aFV0aWwubm9ybWFsaXplUGF0aChhYnNQYXRoKTsKLQkJCX0KLQkJCWFMaXN0LmFkZChjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoYWJzUGF0aCwgZW50cnkpKTsKLQkJfQotCi0JCXJldHVybiBhTGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShTdHJpbmcgYWJzb2x1dGVQYXRoLCBTdHJpbmcgbWFuaWZlc3RWYWx1ZSkgewotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoYWJzb2x1dGVQYXRoKTsKLQkJZW50cnkuc2V0TWFuaWZlc3RWYWx1ZShtYW5pZmVzdFZhbHVlKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5Rm9yRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBkaXIsIGludCBleHBhbnNpb25GbGFncykgewotCQlyZXR1cm4gbmV3IERpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoZGlyLmdldEFic29sdXRlUGF0aCgpLCBleHBhbnNpb25GbGFncyk7Ci0JfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JEaXJlY3RvcnkoU3RyaW5nIGFVcmksIGludCBleHBhbnNpb25GbGFncykgewotCQlyZXR1cm4gbmV3IERpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwoYVVyaSwgZXhwYW5zaW9uRmxhZ3MpOwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5Rm9ySmFyKGphdmEuaW8uRmlsZSBhRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlpZiAoYUZpbGUuZXhpc3RzKCkgJiYgYUZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZmlsZV9leGlzdF9hc19kaXJfRVhDXyIsIChuZXcgT2JqZWN0W117YUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KSkpOy8vJE5PTi1OTFMtMSQgPSAiQSBmaWxlIG5hbWVkIHswfSBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5IgotCQlqYXZhLmlvLkZpbGUgcGFyZW50ID0gYUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCWphdmEuaW8uT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oYUZpbGUpOwotCQlyZXR1cm4gbmV3IFppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwob3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGV4dHJhY3QoaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIFJlb3BlbkV4Y2VwdGlvbiB7Ci0JCWV4dHJhY3ROb1Jlb3BlbihleHBhbnNpb25GbGFncyk7Ci0JCXJlb3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdE5vUmVvcGVuKGludCBleHBhbnNpb25GbGFncykgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGFVcmkgPSBnZXRVUkkoKTsKLQkJamF2YS5pby5GaWxlIGFEaXIgPSBuZXcgamF2YS5pby5GaWxlKGFVcmkpOwotCQlib29sZWFuIGluVXNlID0gZ2V0TG9hZFN0cmF0ZWd5KCkuaXNVc2luZyhhRGlyKTsKLQotCQl0cnkgewotCQkJamF2YS5pby5GaWxlIGRlc3RpbmF0aW9uRGlyID0gaW5Vc2UgPyBBcmNoaXZlVXRpbC5jcmVhdGVUZW1wRGlyZWN0b3J5KGFVcmksIGFEaXIuZ2V0Q2Fub25pY2FsRmlsZSgpLmdldFBhcmVudEZpbGUoKSkgOiBhRGlyOwotCQkJU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kgPSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JEaXJlY3RvcnkoZGVzdGluYXRpb25EaXIsIGV4cGFuc2lvbkZsYWdzKTsKLQkJCXNhdmUoYVNhdmVTdHJhdGVneSk7Ci0JCQlhU2F2ZVN0cmF0ZWd5LmNsb3NlKCk7Ci0JCQljbG9zZSgpOwotCQkJaWYgKGluVXNlKSB7Ci0JCQkJY2xlYW51cEFmdGVyVGVtcFNhdmUoYVVyaSwgYURpciwgZGVzdGluYXRpb25EaXIpOwotCQkJfQotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3NhdmluZ19FWENfIiwgKG5ldyBPYmplY3RbXXt1cml9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvciBzYXZpbmcgIgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0VG8oamF2YS5sYW5nLlN0cmluZyBhVXJpLCBpbnQgZXhwYW5zaW9uRmxhZ3MpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWphdmEuaW8uRmlsZSBhRGlyID0gbmV3IGphdmEuaW8uRmlsZShhVXJpKTsKLQkJaWYgKGdldExvYWRTdHJhdGVneSgpLmlzVXNpbmcoYURpcikpCi0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkV4dHJhY3RfZGVzdGluYXRpb25faXNfdGhlX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXh0cmFjdCBkZXN0aW5hdGlvbiBpcyB0aGUgc2FtZSBwYXRoIGFzIHNvdXJjZSBmaWxlIgotCi0JCXRyeSB7Ci0JCQlTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSA9IGNyZWF0ZVNhdmVTdHJhdGVneUZvckRpcmVjdG9yeShhRGlyLCBleHBhbnNpb25GbGFncyk7Ci0JCQlzYXZlKGFTYXZlU3RyYXRlZ3kpOwotCQkJYVNhdmVTdHJhdGVneS5jbG9zZSgpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3NhdmluZ19FWENfIiwgKG5ldyBPYmplY3RbXXthVXJpfSkpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3Igc2F2aW5nICIKLQkJfQotCi0JfQotCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGZpbHRlckZpbGVzQnlQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gZmlsdGVyRmlsZXMocHJlZml4LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZmlsdGVyRmlsZXMoU3RyaW5nIHByZWZpeCwgU3RyaW5nW10gc3VmZml4ZXMpIHsKLQkJTGlzdCBzdWJzZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGhlRmlsZXMgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIHRoZUZpbGVzLmdldChpKTsKLQkJCWlmICghYUZpbGUuaXNEaXJlY3RvcnlFbnRyeSgpICYmIGFGaWxlLmdldFVSSSgpLnN0YXJ0c1dpdGgocHJlZml4KSkKLQkJCQlpZiAoc3VmZml4ZXMgPT0gbnVsbCB8fCBoYXNTdWZmaXgoYUZpbGUuZ2V0VVJJKCksIHN1ZmZpeGVzKSkKLQkJCQkJc3Vic2V0LmFkZChhRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHN1YnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIHN1ZmZpeGVzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNTdWZmaXgoU3RyaW5nIGFVcmksIFN0cmluZ1tdIHN1ZmZpeGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VmZml4ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhVXJpLmVuZHNXaXRoKHN1ZmZpeGVzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGZpbHRlckZpbGVzV2l0aG91dFByZWZpeChTdHJpbmdbXSBwcmVmaXhlcykgewotCQlMaXN0IHN1YnNldCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0aGVGaWxlcyA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgdGhlRmlsZXMuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSkKLQkJCQljb250aW51ZTsKLQkJCWJvb2xlYW4gc2hvdWxkQWRkID0gdHJ1ZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJlZml4ZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoYUZpbGUuZ2V0VVJJKCkuc3RhcnRzV2l0aChwcmVmaXhlc1tqXSkpIHsKLQkJCQkJc2hvdWxkQWRkID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzaG91bGRBZGQpCi0JCQkJc3Vic2V0LmFkZChhRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHN1YnNldDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRBcmNoaXZlQ2xhc3NMb2FkZXIoKSB7Ci0JCWlmIChhcmNoaXZlQ2xhc3NMb2FkZXIgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCQlyZXR1cm4gYXJjaGl2ZUNsYXNzTG9hZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEFyY2hpdmVGaWxlcygpIHsKLQkJTGlzdCBhcmNoaXZlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZUxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpKSB7Ci0JCQkJYXJjaGl2ZXMuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJjaGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIG1hbmlmZXN0IGNsYXNzIHBhdGggYW5kIHRoZSBleHRyYSBjbGFzcyBwYXRoLCBhbmQgaW5zdGFudGlhdGUgYSBVUkwgY2xhc3Nsb2FkZXIsCi0JICogd2l0aCBhIHBhcmVudCBvZiB0aGUgYXJjaGl2ZUNsYXNzTG9hZGVyCi0JICovCi0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldENsYXNzUGF0aENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudENsKSB7Ci0KLQkJTGlzdCBjbGFzc1BhdGhDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZ2V0TWFuaWZlc3QoKSAhPSBudWxsKQotCQkJY2xhc3NQYXRoQ29tcG9uZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpKSk7Ci0JCVN0cmluZyBleHRyYUNwID0gZ2V0RXh0cmFDbGFzc3BhdGgoKTsKLQkJaWYgKGV4dHJhQ3AgIT0gbnVsbCkKLQkJCWNsYXNzUGF0aENvbXBvbmVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoQXJjaGl2ZVV0aWwuZ2V0VG9rZW5zKGV4dHJhQ3AsICI7IikpKTsvLyROT04tTkxTLTEkCi0KLQkJamF2YS5uZXQuVVJMW10gdXJsQXJyYXkgPSBBcmNoaXZlVXRpbC50b0xvY2FsVVJMcyhjbGFzc1BhdGhDb21wb25lbnRzLCBnZXRSb290Rm9yUmVsYXRpdmVEZXBlbmRlbnRKYXJzKCkpOwotCQlyZXR1cm4gbmV3IGphdmEubmV0LlVSTENsYXNzTG9hZGVyKHVybEFycmF5LCBwYXJlbnRDbCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgcGFyZW50IGZvciB0aGUgY3VzdG9tIGNsYXNzIGxvYWRlciB1c2VkIGJ5IHRoaXMgYXJjaGl2ZQotCSAqLwotCXByb3RlY3RlZCBDbGFzc0xvYWRlciBnZXREZWZhdWx0Q2xhc3NMb2FkZXIoKSB7Ci0JCUNsYXNzTG9hZGVyIHBsdWdpbkNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQlyZXR1cm4gcGx1Z2luQ2xhc3NMb2FkZXIgPT0gbnVsbCA/IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkgOiBwbHVnaW5DbGFzc0xvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuU2V0IGdldERlcGVuZGVudE9wZW5BcmNoaXZlcygpIHsKLQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24odGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhbGwgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIHRvIGFic29sdXRlIHBhdGhzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RW50cmllc0FzQWJzb2x1dGVQYXRocyhTdHJpbmdbXSBlbnRyaWVzLCBTdHJpbmcgcGFyZW50UGF0aCkgewotCi0JCUxpc3QgYUxpc3QgPSBuZXcgQXJyYXlMaXN0KGVudHJpZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJLyoKLQkJCSAqIEFkZGVkIGZvciBsb29zZSBtb2R1bGUgc3VwcG9ydCAtIGlmIHRoZSBjYW5hbm9uaWNhbGl6ZWQgZW50cnkgcmVzb2x2ZXMgdG8gYW4gYXJjaGl2ZQotCQkJICogaW4gdGhlIGNvbnRhaW5pbmcgZWFyLCB0aGVuIGFkZCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGF0IGFyY2hpdmUKLQkJCSAqLwotCQkJQXJjaGl2ZSBkZXBlbmRlbnRKYXIgPSByZXNvbHZlQ2xhc3NwYXRoRW50cnlJbkVBUihlbnRyeSk7Ci0JCQlpZiAoZGVwZW5kZW50SmFyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlhTGlzdC5hZGQoZGVwZW5kZW50SmFyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHNob3VsZG50SGFwcGVuSW5SdW50aW1lKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQkJLy9PdGhlcndpc2UsIGNvbXB1dGUgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGVudHJ5IHJlbGF0aXZlIHRvCi0JCQkvLyB0aGlzIGphcgotCQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShlbnRyeSk7Ci0JCQlpZiAoYUZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJCWFMaXN0LmFkZChhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQllbHNlCi0JCQkJYUxpc3QuYWRkKEFyY2hpdmVVdGlsLmdldE9TVXJpKHBhcmVudFBhdGgsIGVudHJ5KSk7Ci0JCX0KLQotCQlyZXR1cm4gYUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dHJhQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gZXh0cmFDbGFzc3BhdGg7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBmcmFtZXdvcmssIHNwZWNpZmljYWxseSBhcyBhbiBvcHRpbWl6YXRpb24gd2hlbiBzYXZpbmcvZXhwbG9kaW5nCi0JICogYXJjaGl2ZXMgd2l0aCBuZXN0ZWQgYXJjaGl2ZXMKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3IgZ2V0RmlsZXNGb3JTYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldEZpbGVJdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlpZiAoZ2V0TG9hZGluZ0NvbnRhaW5lcigpICE9IG51bGwgfHwgZ2V0TG9hZFN0cmF0ZWd5KCkgPT0gbnVsbCB8fCBnZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIHN1cGVyLmdldElucHV0U3RyZWFtKCk7Ci0KLQkJLy9UaGlzIGFyY2hpdmUgd2FzIGNvcGllZCBpbjsgdGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IKLQkJLy8gbW9kdWxlIGZpbGVzCi0JCWlmIChpc01vZHVsZUZpbGUoKSB8fCAhZ2V0T3B0aW9ucygpLmlzU2F2ZUxpYnJhcmllc0FzRmlsZXMoKSkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5kZWZpbmVkIHN0YXRlIG9mIG5lc3RlZCBhcmNoaXZlIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvL1dlIGhhdmUgdG8gZmluZCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgb3JpZ2luYWwgYXJjaGl2ZSBmcm9tIHdoaWNoCi0JCS8vIHRoaXMgd2FzIGNvcGllZCwKLQkJLy9pZiBpdCBpcyBrbm93bgotCi0JCUxpc3QgbGlzdCA9IGdldEZpbGVzKCk7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBsaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc0FyY2hpdmUoKSkKLQkJCQljb250aW51ZTsKLQkJCWFic29sdXRlUGF0aCA9IGFGaWxlLmdldExvYWRpbmdDb250YWluZXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGFic29sdXRlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMb2FkU3RyYXRlZ3kjZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIGFVcmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRSZXNvdXJjZUlucHV0U3RyZWFtKGFVcmkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhSkRLQWRhcHRlckZhY3RvcnkgZ2V0SmF2YUFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKEphdmFKREtBZGFwdGVyRmFjdG9yeSkgRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KGdldExvYWRTdHJhdGVneSgpLmdldFJlc291cmNlU2V0KCkuZ2V0QWRhcHRlckZhY3RvcmllcygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUgcmV0dXJucyBhbiBpbW11dGFibGUgY29sbGVjdGlvbiBvZiB0aGUgbG9hZGVkCi0JICogICAgICByZXNvdXJjZXMgaW4gdGhlIHJlc291cmNlIHNldAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZE1vZlJlc291cmNlcygpIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldExvYWRlZE1vZlJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICovCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdCBnZXRNYW5pZmVzdCgpIHsKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW4gPSBnZXRJbnB1dFN0cmVhbShKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCQkJbWFrZU1hbmlmZXN0KGluKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJCW1ha2VNYW5pZmVzdCgpOwotCQkJfSBjYXRjaCAoUmVzb3VyY2UuSU9XcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJV3JhcHBlZEV4Y2VwdGlvbiB3cmFwRXggPSBuZXcgV3JhcHBlZEV4Y2VwdGlvbigoZXgpLmdldFdyYXBwZWRFeGNlcHRpb24oKSk7Ci0JCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmdldEZpbGVOb3RGb3VuZERldGVjdG9yKCkuaXNGaWxlTm90Rm91bmQod3JhcEV4KSkKLQkJCQkJbWFrZU1hbmlmZXN0KCk7Ci0JCQkJZWxzZQotCQkJCQl0aHJvdyBuZXcgTWFuaWZlc3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImlvX2V4X21hbmlmZXN0X0VYQ18iLCAobmV3IE9iamVjdFtde2dldFVSSSgpfSkpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiQW4gSU9FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyB0aGUgbWFuaWZlc3Q6ICIKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJpb19leF9tYW5pZmVzdF9FWENfIiwgKG5ldyBPYmplY3RbXXtnZXRVUkkoKX0pKSwgZXgpOyAvLyROT04tTkxTLTEkID0gIkFuIElPRXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgdGhlIG1hbmlmZXN0OiAiCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy9UaGlzIGlzIGEgaGFjayBiZWNhdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIG1hbmlmZXN0IGRvZXMgbm90Ci0JCS8vIHNlcmlhbGl6ZSBjb3JyZWN0bHkgaWYKLQkJLy9UaGUgdmVyc2lvbiBpcyBub3Qgc2V0LiBJbiBhZGRpdGlvbiB0byBzYXZlcywgdGhlIHNlcmlhbGl6YXRpb24gaXMKLQkJLy8gdXNlZCBmb3IgY29weQotCQlpZiAobWFuaWZlc3QuZ2V0TWFuaWZlc3RWZXJzaW9uKCkgPT0gbnVsbCB8fCBtYW5pZmVzdC5nZXRNYW5pZmVzdFZlcnNpb24oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQltYW5pZmVzdC5zZXRNYW5pZmVzdFZlcnNpb24oIjEuMCIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG1hbmlmZXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRNb2ZSZXNvdXJjZShhVXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoU3RyaW5nIGFVcmkpIHsKLQkJaWYgKGdldExvYWRTdHJhdGVneSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQl0cnkgewotCQkJcmVzb3VyY2UgPSBnZXRNb2ZSZXNvdXJjZShhVXJpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UgPSBtYWtlTW9mUmVzb3VyY2UoYVVyaSk7Ci0JCQl9IGNhdGNoIChEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gZG94KSB7Ci0JCQkJLy9XZSBqdXN0IGNoZWNrZWQgZm9yIHRoaXM7IGl0IHdvbid0IGhhcHBlbgotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9ucyBnZXRPcHRpb25zKCkgewotCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogV2hlbiBsb29raW5nIGF0IHRoZSBjbGFzcyBwYXRoIG9mIHRoaXMgamFyIChmcm9tIHRoZSBtYW5pZmVzdCksIHNvbWUgb2YgdGhlIGVsZW1lbnRzIG1heSBoYXZlCi0JICogYSByZWxhdGl2ZSBwYXRoLCB0aHVzIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbnN0YWxsIGxvY2F0aW9uIG9mIHRoaXMgamFyLiBJZiB0aGUgYWJzb2x1dGUKLQkgKiBwYXRoIGZyb20gd2hpY2ggdGhlIGFyY2hpdmUgd2FzIGxvYWRlZCwgcmV0dXJuIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoYXQgcGF0aDsgb3RoZXJ3aXNlLAotCSAqIHNlZSBpZiB0aGUgY29udGFpbmluZyBhcmNoaXZlIGhhcyBhbiBhYnNvbHV0ZSBwYXRoOyBpZiBuZWl0aGVyIHdvcmssIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQKLQkgKiB3b3JraW5nIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdEZvclJlbGF0aXZlRGVwZW5kZW50SmFycygpIHsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQlDb250YWluZXIgdGhlQ29udGFpbmVyID0gdGhpczsKLQkJd2hpbGUgKHRoZUNvbnRhaW5lciAhPSBudWxsICYmIHBhdGggPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwYXRoID0gdGhlQ29udGFpbmVyLmdldEFic29sdXRlUGF0aCgpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJCXRoZUNvbnRhaW5lciA9IHRoZUNvbnRhaW5lci5nZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCX0KLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCS8vQXQgdGhpcyBwb2ludCB3aGF0IGVsc2UgY2FuIHdlIGRvPwotCQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShwYXRoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFJ1bnRpbWVDbGFzc1BhdGgoKSB7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aDsKLQkJdHJ5IHsKLQkJCWFic29sdXRlUGF0aCA9IGdldEJpbmFyaWVzUGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVudHJpZXMuYWRkKGFic29sdXRlUGF0aCk7Ci0KLQkJU3RyaW5nIHBhcmVudFBhdGggPSBuZXcgamF2YS5pby5GaWxlKGFic29sdXRlUGF0aCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlTdHJpbmdbXSBtZkVudHJpZXMgPSBnZXRNYW5pZmVzdCgpLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQllbnRyaWVzLmFkZEFsbChnZXRFbnRyaWVzQXNBYnNvbHV0ZVBhdGhzKG1mRW50cmllcywgcGFyZW50UGF0aCkpOwotCi0JCXJldHVybiAoU3RyaW5nW10pIGVudHJpZXMudG9BcnJheShuZXcgU3RyaW5nW2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogT3B0aW9uYWwgZmlsdGVyIGZvciBzYXZpbmcgYSBzdWJzZXQgb2YgZmlsZXM7IGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgZm9yIGFsbCBzYXZlIGFuZCBleHRyYWN0Ci0JICogaW52b2thdGlvbnMKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIGdldFNhdmVGaWx0ZXIoKSB7Ci0JCXJldHVybiBzYXZlRmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA0LzAwIDM6MzE6MzIgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3kgZ2V0U2F2ZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gc2F2ZVN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCXJldHVybiB4bWxFbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nOyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZSBhcyBuZWNlc3NhcnkKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBZnRlck9wZW4oKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDbGFzc0xvYWRlcigpIHsKLQkJLy9Tb21lIGxvYWQgc3RyYXRlZ2llcyBtYXkgcHJvdmlkZSBhIG1vZiBjb250ZXh0IGZvciB3aGljaAotCQkvL2FuIGFsdGVybmF0ZSBjbGFzcyBsb2FkZXIgaXMgbm90IG5lY2Vzc2FyeQotCQlpZiAoIXNob3VsZFVzZUphdmFSZWZsZWN0aW9uKCkpCi0JCQlyZXR1cm47Ci0JCUNsYXNzTG9hZGVyIGV4dHJhQ2wgPSBudWxsOwotCQlDbGFzc0xvYWRlciBkZWZhdWx0Q2wgPSBnZXREZWZhdWx0Q2xhc3NMb2FkZXIoKTsKLQkJaWYgKGdldENvbnRhaW5lcigpID09IG51bGwgfHwgIWdldENvbnRhaW5lcigpLmlzRUFSRmlsZSgpKQotCQkJZXh0cmFDbCA9IGdldENsYXNzUGF0aENsYXNzTG9hZGVyKGRlZmF1bHRDbCk7Ci0JCUNsYXNzTG9hZGVyIGNsID0gY3JlYXRlRHluYW1pY0NsYXNzTG9hZGVyKGRlZmF1bHRDbCwgZXh0cmFDbCk7Ci0JCXNldEFyY2hpdmVDbGFzc0xvYWRlcihjbCk7Ci0JCUphdmFKREtBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0SmF2YUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWZhY3Rvcnkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsKTsKLQkJZmFjdG9yeS5mbHVzaEFsbCgpOwotCX0KLQotCXB1YmxpYyBDbGFzc0xvYWRlciBjcmVhdGVEeW5hbWljQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wpIHsKLQkJcmV0dXJuIG5ldyBBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlcih0aGlzLCBwYXJlbnRDbCwgZXh0cmFDbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FyY2hpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEdXBsaWNhdGUoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7Ci0JCXJldHVybiBjb250YWluc0ZpbGUoYVVyaSkgfHwgaXNNb2ZSZXNvdXJjZUxvYWRlZChhVXJpKSB8fCBKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSS5lcXVhbHMoYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmlmZXN0U2V0KCkgewotCQlyZXR1cm4gbWFuaWZlc3QgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9mUmVzb3VyY2VMb2FkZWQoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5pc01vZlJlc291cmNlTG9hZGVkKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQganVzdCB0ZXN0IHRoZSBleHRlbnNpb24gb2YgdGhlIHVyaSBmb3Igb25lIG9mIHRoZSBrbm93biBhcmNoaXZlIHR5cGVzOyBzdWJjbGFzc2VzCi0JICogbWF5IHdoaWNoIHRvIG92ZXJyaWRlLgotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRBcmNoaXZlKGphdmEubGFuZy5TdHJpbmcgYVVyaSkgewotCQkvLzExMDM5MC4zIEVycm9yIGxvYWRpbmcgYWx0LWJpbmRpbmdzCi0JCS8qCi0JCSAqIERvbid0IGluZmVyIHRoYXQgYSBmb2xkZXIgd2hpY2ggZW5kcyB3aXRoIC5qYXIgaXMgYW4gZXhwbG9kZWQgYXJjaGl2ZTsgRUFSIGZpbGUgd2lsbCBkbwotCQkgKiB0aGF0IElGIHRoZSBmb2xkZXIgaXMgZGVjbGFyZWQgYXMgYSBtb2R1bGUgaW4gdGhlIEVBUgotCQkgKi8KLQkJaWYgKGdldExvYWRTdHJhdGVneSgpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShnZXRBYnNvbHV0ZVBhdGgoKSwgYVVyaSk7Ci0JCQkJamF2YS5pby5GaWxlIGlvRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aCk7Ci0JCQkJaWYgKCFpb0ZpbGUuZXhpc3RzKCkgfHwgKGlvRmlsZS5pc0RpcmVjdG9yeSgpICYmIGFVcmkuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLkFMVF9JTkYpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5LklOU1RBTkNFLmlzS25vd25BcmNoaXZlVHlwZShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpICE9IG51bGwgJiYgZ2V0TG9hZFN0cmF0ZWd5KCkuaXNPcGVuKCk7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVNYW5pZmVzdCBtYWtlTWFuaWZlc3QoKSB7Ci0JCUFyY2hpdmVNYW5pZmVzdCBtZiA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKCk7Ci0JCXNldE1hbmlmZXN0KG1mKTsKLQkJcmV0dXJuIG1mOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3QgbWFrZU1hbmlmZXN0KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChpbik7Ci0JCXNldE1hbmlmZXN0KG1mKTsKLQkJcmV0dXJuIG1mOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIGFVcmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlyZXR1cm4gbWFrZU1vZlJlc291cmNlKGFVcmksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlI21ha2VNb2ZSZXNvdXJjZShTdHJpbmcsIEVMaXN0KQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIGFVcmksIEVMaXN0IGV4dGVudCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0R1cGxpY2F0ZShhVXJpKSkKLQkJCXRocm93IG5ldyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImR1cGxpY2F0ZV9lbnRyeV9FWENfIiwgKG5ldyBPYmplY3RbXXthVXJpLCBnZXRVUkkoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiQSBmaWxlIG9yIHJlc291cmNlIHdpdGggdXJpIHswfSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZSBuYW1lZCB7MX0iCi0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5tYWtlTW9mUmVzb3VyY2UoYVVyaSwgZXh0ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShTdHJpbmcgYVVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3Blbk5lc3RlZEFyY2hpdmUoYVVyaSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBcmNoaXZlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoTG9vc2VBcmNoaXZlIGxvb3NlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5vcGVuTmVzdGVkQXJjaGl2ZShsb29zZSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXh0cmEgY2xhc3MgcGF0aCB3aXRoIG5vIHJlZnJlc2ggb2YgdGhlIGNsYXNzIGxvYWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TZXRFeHRyYUNsYXNzcGF0aChqYXZhLmxhbmcuU3RyaW5nIG5ld0V4dHJhQ2xhc3NwYXRoKSB7Ci0JCWV4dHJhQ2xhc3NwYXRoID0gbmV3RXh0cmFDbGFzc3BhdGg7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIGFyY2hpdmUgY2xhc3MgbG9hZGVyIHRvIHByZXZlbnQgZ2MgcHJvYmxlbXMgb3IgcHJvYmxlbXMgd2l0aCB0ZW1wCi0JICogZmlsZXMgbm90IGdldHRpbmcgZGVsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDbGFzc0xvYWRlcigpIHsKLQkJaWYgKGFyY2hpdmVDbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0JCQlzZXRBcmNoaXZlQ2xhc3NMb2FkZXIobnVsbCk7Ci0JCQlnZXRKYXZhQWRhcHRlckZhY3RvcnkoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShGaWxlIGFGaWxlKSB7Ci0JCWdldEZpbGVzKCkucmVtb3ZlKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbigpIHRocm93cyBSZW9wZW5FeGNlcHRpb24gewotCQlyZW9wZW4obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW9wZW4oQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBSZW9wZW5FeGNlcHRpb24gewotCQlMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhTG9hZFN0cmF0ZWd5ID0gY3JlYXRlTG9hZFN0cmF0ZWd5Rm9yUmVvcGVuKHBhcmVudCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUmVvcGVuRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJpb19leF9yZW9wZW5fRVhDXyIsIChuZXcgT2JqZWN0W117Z2V0VVJJKCl9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSByZW9wZW5pbmcgIgotCQl9Ci0JCS8vUFE1NDU3MgotCQlMb2FkU3RyYXRlZ3kgY3VycmVudCA9IGdldExvYWRTdHJhdGVneSgpOwotCQlpZiAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQlhTG9hZFN0cmF0ZWd5LnNldFJlc291cmNlU2V0KGN1cnJlbnQucHJpbUdldFJlc291cmNlU2V0KCkpOwotCQkJLyoKLQkJCSAqIGZpeGluZyBwcm9ibGVtIHdpdGggb3JwaGFuZWQgbG9hZCBzdHJhdGVneSBsaXN0ZW5pbmcgdG8gdGhlIHJlc291cmNlIHNldAotCQkJICovCi0JCQljdXJyZW50LnNldFJlc291cmNlU2V0KG51bGwpOwotCQl9Ci0KLQkJc2V0TG9hZFN0cmF0ZWd5KGFMb2FkU3RyYXRlZ3kpOwotCQlpbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQkJaWYgKCFpc0luZGV4ZWQoKSkKLQkJCXJldHVybjsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgZiA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlmLnNldE9yaWdpbmFsVVJJKGYuZ2V0VVJJKCkpOwotCQkJZi5zZXRMb2FkaW5nQ29udGFpbmVyKHRoaXMpOwotCQkJaWYgKGYuaXNBcmNoaXZlKCkpCi0JCQkJKChBcmNoaXZlKSBmKS5yZW9wZW4odGhpcyk7Ci0JCX0KLQkJZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5hcmNoaXZlT3BlbmVkKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VSb290KFJlc291cmNlIGFSZXNvdXJjZSwgRU9iamVjdCByb290KSB7Ci0JCWlmIChhUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRUxpc3QgZXh0ZW50ID0gYVJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCUVPYmplY3QgZXhpc3RpbmdSb290ID0gbnVsbDsKLQkJaWYgKCFleHRlbnQuaXNFbXB0eSgpKSB7Ci0JCQlleGlzdGluZ1Jvb3QgPSAoRU9iamVjdCkgZXh0ZW50LmdldCgwKTsKLQkJCWlmIChleGlzdGluZ1Jvb3QgPT0gcm9vdCkKLQkJCQlyZXR1cm47Ci0JCQlleHRlbnQucmVtb3ZlKDApOwotCQl9Ci0JCWlmIChyb290ICE9IG51bGwpCi0JCQlleHRlbnQuYWRkKDAsIHJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIHJlc29sdmVDbGFzc3BhdGhFbnRyeUluRUFSKFN0cmluZyBlbnRyeSkgewotCQkvKgotCQkgKiBBZGRlZCB0byBzdXBwb3J0IHJ1bnRpbWUgY2xhc3NwYXRoIGZvciBsb29zZSBtb2R1bGVzCi0JCSAqLwotCQlDb250YWluZXIgcGFyZW50ID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCAhcGFyZW50LmlzRUFSRmlsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGFVcmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShlbnRyeSwgdGhpcyk7Ci0JCWlmIChhVXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlGaWxlIGFGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFGaWxlID0gcGFyZW50LmdldEZpbGUoYVVyaSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gYUZpbGUuaXNBcmNoaXZlKCkgPyAoQXJjaGl2ZSkgYUZpbGUgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgUmVvcGVuRXhjZXB0aW9uIHsKLQkJc2F2ZUFzKGdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5IGFTdHJhdGVneSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJc2V0U2F2ZVN0cmF0ZWd5KGFTdHJhdGVneSk7Ci0JCVNhdmVGaWx0ZXIgZXhpc3RpbmdGaWx0ZXIgPSBhU3RyYXRlZ3kuZ2V0RmlsdGVyKCk7Ci0JCWJvb2xlYW4gb2xkRGVsaXZlcnkgPSBlRGVsaXZlcigpOwotCQl0cnkgewotCQkJaWYgKGdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkpCi0JCQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJYVN0cmF0ZWd5LnNldEZpbHRlcihnZXRTYXZlRmlsdGVyKCkpOwotCQkJYVN0cmF0ZWd5LnNhdmUoKTsKLQkJCXRyeSB7Ci0JCQkJYVN0cmF0ZWd5LmZpbmlzaCgpOwotCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oZ2V0VVJJKCksIGlveCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvL1dlIGhhdmUgdG8gbGVhdmUgdGhlIGZpbGUgaW5kZXggaWYgd2UgYXJlIGEgZGlyZWN0b3J5IGJlY2F1c2Ugd2UKLQkJCS8vIG1pZ2h0IGhhdmUKLQkJCS8vb3BlbiBmaWxlIGhhbmRsZXMgdG8gYXJjaGl2ZXMKLQkJCWlmIChnZXRPcHRpb25zKCkuaXNSZWFkT25seSgpICYmICFnZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJZmlsZXMuY2xlYXIoKTsKLQkJCQkvLygoQmFzaWNFTGlzdClmaWxlcykuc2V0TGlzdEltcGxlbWVudGF0aW9uKG5ldyBBcnJheUxpc3QoMCkpOwotCQkJCWVTZXREZWxpdmVyKG9sZERlbGl2ZXJ5KTsKLQkJCQllQWRhcHRlcnMoKS5yZW1vdmUoZ2V0RmlsZUluZGV4QWRhcHRlcigpKTsKLQkJCQlmaWxlSW5kZXhBZGFwdGVyID0gbnVsbDsKLQkJCQlmaWxlSW5kZXggPSBudWxsOwotCQkJfQotCQkJc2V0U2F2ZVN0cmF0ZWd5KG51bGwpOwotCQkJYVN0cmF0ZWd5LnNldEZpbHRlcihleGlzdGluZ0ZpbHRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVBcyhTdHJpbmcgYVVyaSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBSZW9wZW5FeGNlcHRpb24gewotCQlzYXZlQXNOb1Jlb3BlbihhVXJpKTsKLQkJcmVvcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgY2FuIHJlbmFtZSBpdCB0aGVuIHdlIGNhbiBkZWxldGUgaXQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbmFtZWFibGUoamF2YS5pby5GaWxlIG9yaWcpIHsKLQkJamF2YS5pby5GaWxlIG9yaWdDb3B5MSA9IG51bGw7Ci0JCWphdmEuaW8uRmlsZSBvcmlnQ29weTIgPSBudWxsOwotCQl0cnkgewotCQkJb3JpZ0NvcHkxID0gb3JpZy5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQlvcmlnQ29weTIgPSBvcmlnLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJU3RyaW5nIGJhc2VOYW1lID0gInNhdmUudG1wIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaWYgKG9yaWcuZ2V0UGFyZW50KCkgIT0gbnVsbCkKLQkJCQliYXNlTmFtZSA9IG5ldyBqYXZhLmlvLkZpbGUob3JpZy5nZXRQYXJlbnQoKSwgYmFzZU5hbWUpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJamF2YS5pby5GaWxlIHRlbXAgPSBudWxsOwotCQlpbnQgaW5kZXggPSAwOwotCQlkbyB7Ci0JCQluYW1lID0gYmFzZU5hbWUgKyBpbmRleDsKLQkJCXRlbXAgPSBuZXcgamF2YS5pby5GaWxlKG5hbWUpOwotCQkJaW5kZXgrKzsKLQkJfSB3aGlsZSAodGVtcC5leGlzdHMoKSk7Ci0JCXJldHVybiBvcmlnQ29weTEucmVuYW1lVG8odGVtcCkgJiYgdGVtcC5yZW5hbWVUbyhvcmlnQ29weTIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrV3JpdGVhYmxlKGphdmEuaW8uRmlsZSBkZXN0KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlMaXN0IGxvY2tlZCA9IEFyY2hpdmVVdGlsLmdldFdyaXRlUHJvdGVjdGVkRmlsZXMoZGVzdCwgbnVsbCk7Ci0JCWlmIChsb2NrZWQuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCW1zZy5hcHBlbmQoIkNhbm5vdCB3cml0ZSB0byBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQltc2cuYXBwZW5kKGRlc3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQltc2cuYXBwZW5kKCdcbicpOwotCQltc2cuYXBwZW5kKCJPbmUgb3IgbW9yZSBmaWxlcyBpcyB3cml0ZSBwcm90ZWN0ZWQgb3IgbG9ja2VkOiIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoJ1xuJyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9ja2VkLnNpemUoKTsgaSsrKSB7Ci0JCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSAoamF2YS5pby5GaWxlKSBsb2NrZWQuZ2V0KGkpOwotCQkJbXNnLmFwcGVuZChhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQltc2cuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihtc2cudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXNOb1Jlb3BlbihTdHJpbmcgYVVyaSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShhVXJpKTsKLQkJY2hlY2tXcml0ZWFibGUoYUZpbGUpOwotCQlib29sZWFuIGZpbGVFeGlzdGVkID0gYUZpbGUuZXhpc3RzKCk7Ci0JCS8vYm90cCAxNDIxNDkKLQkJLy9ib29sZWFuIGluVXNlID0gZ2V0TG9hZFN0cmF0ZWd5KCkuaXNVc2luZyhhRmlsZSk7Ci0JCVNhdmVTdHJhdGVneSBhU2F2ZVN0cmF0ZWd5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJamF2YS5pby5GaWxlIGRlc3RpbmF0aW9uRmlsZSA9IGZpbGVFeGlzdGVkID8gQXJjaGl2ZVV0aWwuY3JlYXRlVGVtcEZpbGUoYVVyaSwgYUZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpLmdldFBhcmVudEZpbGUoKSkgOiBhRmlsZTsKLQkJCQlhU2F2ZVN0cmF0ZWd5ID0gY3JlYXRlU2F2ZVN0cmF0ZWd5Rm9ySmFyKGRlc3RpbmF0aW9uRmlsZSk7Ci0JCQkJc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJCQlhU2F2ZVN0cmF0ZWd5LmNsb3NlKCk7Ci0JCQkJdGhpcy5jbG9zZSgpOwotCQkJCWlmIChmaWxlRXhpc3RlZCkgewotCQkJCQljbGVhbnVwQWZ0ZXJUZW1wU2F2ZShhVXJpLCBhRmlsZSwgZGVzdGluYXRpb25GaWxlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJlcnJvcl9zYXZpbmdfRVhDXyIsIChuZXcgT2JqZWN0W117YVVyaX0pKSwgZXgpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIHNhdmluZyAiCi0JCQl9Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsdXJlRXhjZXB0aW9uIGZhaWx1cmUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGFTYXZlU3RyYXRlZ3kgIT0gbnVsbCkKLQkJCQkJYVNhdmVTdHJhdGVneS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gd2VUcmllZCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQlpZiAoIWZpbGVFeGlzdGVkKQotCQkJCWFGaWxlLmRlbGV0ZSgpOwotCQkJdGhyb3cgZmFpbHVyZTsKLQkJfQotCi0JCXNldFVSSShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVOb1Jlb3BlbigpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXNhdmVBc05vUmVvcGVuKGdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdBcmNoaXZlQ2xhc3NMb2FkZXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmVDbGFzc0xvYWRlcihqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgbmV3QXJjaGl2ZUNsYXNzTG9hZGVyKSB7Ci0JCWFyY2hpdmVDbGFzc0xvYWRlciA9IG5ld0FyY2hpdmVDbGFzc0xvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHRyYUNsYXNzcGF0aAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dHJhQ2xhc3NwYXRoKGphdmEubGFuZy5TdHJpbmcgbmV3RXh0cmFDbGFzc3BhdGgpIHsKLQkJcHJpbVNldEV4dHJhQ2xhc3NwYXRoKG5ld0V4dHJhQ2xhc3NwYXRoKTsKLQkJLy9PcHRpbWl6YXRpb24gLSBvbmx5IHJlIGluaXQgaWYgYSBjbCBleGlzdHM7IG90aGVyd2lzZSBpdCB3aWxsIGluaXQgb24KLQkJLy8gZGVtYW5kCi0JCWlmIChhcmNoaXZlQ2xhc3NMb2FkZXIgIT0gbnVsbCkKLQkJCWluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI5LzAwIDY6MzU6MDggUE0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3QoQXJjaGl2ZU1hbmlmZXN0IG5ld01hbmlmZXN0KSB7Ci0JCW1hbmlmZXN0ID0gbmV3TWFuaWZlc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChqYXZhLnV0aWwuamFyLk1hbmlmZXN0IGFNYW5pZmVzdCkgewotCQlzZXRNYW5pZmVzdCgoQXJjaGl2ZU1hbmlmZXN0KSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsKGFNYW5pZmVzdCkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIENsYXNzLXBhdGggbWFuaWZlc3QgZW50cnksIHJlYnVpbGRzIHRoZSBjbGFzcyBsb2FkZXIsIGFuZCByZWZyZXNoZXMgYW55IHJlZmxlY3RlZAotCSAqIGphdmEgY2xhc3NlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0Q2xhc3NQYXRoQW5kUmVmcmVzaChTdHJpbmcgY2xhc3NwYXRoKSB7Ci0JCUFyY2hpdmVNYW5pZmVzdCBtZiA9IGdldE1hbmlmZXN0KCk7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0JCQltYWtlTWFuaWZlc3QoKTsKLQkJfQotCQltZi5zZXRDbGFzc1BhdGgoY2xhc3NwYXRoKTsKLQkJLy9PcHRpbWl6YXRpb24gLSBvbmx5IHJlIGluaXQgaWYgYSBjbCBleGlzdHM7IG90aGVyd2lzZSBpdCB3aWxsIGluaXQgb24KLQkJLy8gZGVtYW5kCi0JCWlmIChhcmNoaXZlQ2xhc3NMb2FkZXIgIT0gbnVsbCkKLQkJCWluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbnMob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9ucyBuZXdPcHRpb25zKSB7Ci0JCW9wdGlvbnMgPSBuZXdPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIE9wdGlvbmFsIGZpbHRlciBmb3Igc2F2aW5nIGEgc3Vic2V0IG9mIGZpbGVzOyBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIGZvciBhbGwgc2F2ZSBhbmQgZXh0cmFjdAotCSAqIGludm9rYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZUZpbHRlcihvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgbmV3U2F2ZUZpbHRlcikgewotCQlzYXZlRmlsdGVyID0gbmV3U2F2ZUZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNC8wMCAzOjMxOjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTYXZlU3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZVN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneSBuZXdTYXZlU3RyYXRlZ3kpIHsKLQkJc2F2ZVN0cmF0ZWd5ID0gbmV3U2F2ZVN0cmF0ZWd5OwotCQlpZiAobmV3U2F2ZVN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCW5ld1NhdmVTdHJhdGVneS5zZXRBcmNoaXZlKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3WG1sRW5jb2RpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYbWxFbmNvZGluZyhqYXZhLmxhbmcuU3RyaW5nIG5ld1htbEVuY29kaW5nKSB7Ci0JCXhtbEVuY29kaW5nID0gbmV3WG1sRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgamF2YSByZWZsZWN0aW9uIHNob3VsZCBiZSBzZXQgdXAgZm9yIHRoaXMgYXJjaGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUphdmFSZWZsZWN0aW9uKCkgewotCQlyZXR1cm4gZ2V0T3B0aW9ucygpLnVzZUphdmFSZWZsZWN0aW9uKCkgJiYgZ2V0TG9hZFN0cmF0ZWd5KCkuaXNDbGFzc0xvYWRlck5lZWRlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRocm93UmVzb3VyY2VMb2FkRXhjZXB0aW9uKFN0cmluZyByZXNvdXJjZVVyaSwgRXhjZXB0aW9uIGV4KSB0aHJvd3MgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFJlc291cmNlTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygibG9hZF9yZXNvdXJjZV9FWENfIiwgKG5ldyBPYmplY3RbXXtyZXNvdXJjZVVyaSwgZ2V0VVJJKCl9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJDb3VsZCBub3QgbG9hZCByZXNvdXJjZSAiezB9IiBpbiBhcmNoaXZlICJ7MX0iIgotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0UmVzb3VyY2VzUGF0aCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmluYXJpZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb2FkU3RyYXRlZ3koKS5nZXRCaW5hcmllc1BhdGgoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW1wdHlDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5WzBdOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgaW50ZXJuYWxHZXRCaW5hcmllc1BhdGgoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IHJldHVybiBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGlzIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0TG9jYWxSdW50aW1lQ2xhc3NQYXRoKCkgewotCi0JCVN0cmluZyBhYnNvbHV0ZVBhdGggPSBpbnRlcm5hbEdldEJpbmFyaWVzUGF0aCgpOwotCQlpZiAoYWJzb2x1dGVQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZW1wdHlDbGFzc3BhdGgoKTsKLQkJcmV0dXJuIG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXXtjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkoYWJzb2x1dGVQYXRoKX07Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldERlcGVuZGVuY3lDbGFzc1BhdGhBdFRoaXNMZXZlbCgpIHsKLQkJU3RyaW5nIGFic29sdXRlUGF0aCA9IGludGVybmFsR2V0QmluYXJpZXNQYXRoKCk7Ci0JCWlmIChhYnNvbHV0ZVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBlbXB0eUNsYXNzcGF0aCgpOwotCQlTdHJpbmcgcGFyZW50UGF0aCA9IG5ldyBqYXZhLmlvLkZpbGUoYWJzb2x1dGVQYXRoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCVN0cmluZ1tdIG1mRW50cmllcyA9IGdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCWlmIChtZkVudHJpZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZW1wdHlDbGFzc3BhdGgoKTsKLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbnRyaWVzLmFkZEFsbChjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cmllcyhtZkVudHJpZXMsIHBhcmVudFBhdGgpKTsKLQotCQlyZXR1cm4gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRGdWxsUnVudGltZUNsYXNzUGF0aCgpIHsKLQkJcmV0dXJuIGNvbmNhdChnZXRMb2NhbFJ1bnRpbWVDbGFzc1BhdGgoKSwgZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gY29uY2F0KFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGFycmF5MSwgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gYXJyYXkyKSB7Ci0JCUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGVtcC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcnJheTEpKTsKLQkJdGVtcC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQkJcmV0dXJuIChSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgdGVtcC50b0FycmF5KG5ldyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbdGVtcC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aCgpIHsKLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCVNldCBwcm9jZXNzZWRFbnRyaWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJdmlzaXRlZC5hZGQodGhpcyk7Ci0JCWdldERlcGVuZGVuY3lDbGFzc1BhdGgodmlzaXRlZCwgZW50cmllcywgcHJvY2Vzc2VkRW50cmllcywgdGhpcyk7Ci0JCXJldHVybiAoUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2V0RGVwZW5kZW5jeUNsYXNzUGF0aChTZXQgdmlzaXRlZEFyY2hpdmVzLCBMaXN0IGVudHJpZXMsIFNldCBwcm9jZXNzZWRFbnRyaWVzLCBBcmNoaXZlIGN1cnJlbnQpIHsKLQotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBsb2NhbCA9ICgoQXJjaGl2ZUltcGwpIGN1cnJlbnQpLmdldERlcGVuZGVuY3lDbGFzc1BhdGhBdFRoaXNMZXZlbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsLmxlbmd0aDsgaSsrKSB7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBsb2NhbFtpXTsKLQkJCWlmICghcHJvY2Vzc2VkRW50cmllcy5jb250YWlucyhlbnRyeSkpIHsKLQkJCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQkJcHJvY2Vzc2VkRW50cmllcy5hZGQoZW50cnkpOwotCQkJfQotCQkJQXJjaGl2ZSByZXNvbHZlZCA9IGVudHJ5LmdldFJlZmVyZW5jZWRBcmNoaXZlKCk7Ci0JCQlpZiAocmVzb2x2ZWQgPT0gbnVsbCkKLQkJCQlDbGFzc3BhdGhVdGlsLnByb2Nlc3NNYW5pZmVzdChlbnRyeS5nZXRBYnNvbHV0ZVBhdGgoKSwgZW50cmllcywgcHJvY2Vzc2VkRW50cmllcyk7Ci0JCQllbHNlIGlmICghdmlzaXRlZEFyY2hpdmVzLmNvbnRhaW5zKHJlc29sdmVkKSkgewotCQkJCXZpc2l0ZWRBcmNoaXZlcy5hZGQocmVzb2x2ZWQpOwotCQkJCWdldERlcGVuZGVuY3lDbGFzc1BhdGgodmlzaXRlZEFyY2hpdmVzLCBlbnRyaWVzLCBwcm9jZXNzZWRFbnRyaWVzLCByZXNvbHZlZCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBFQVJGaWxlIGdldEVBUkZpbGUoKSB7Ci0JCUNvbnRhaW5lciBwYXJlbnQgPSBnZXRDb250YWluZXIoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8ICEocGFyZW50IGluc3RhbmNlb2YgRUFSRmlsZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFQVJGaWxlKSBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgZ2V0UmVzb2x2ZWRBcmNoaXZlKFN0cmluZyBtZlZhbHVlLCBFQVJGaWxlIGVhcikgewotCQlTdHJpbmcgYVVyaSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKG1mVmFsdWUsIHRoaXMpOwotCQlpZiAoYVVyaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKEFyY2hpdmUpIGVhci5nZXRGaWxlKGFVcmkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlI2hhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhBcmNoaXZlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhBcmNoaXZlIG90aGVyKSB7Ci0JCWlmIChvdGhlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFQVJGaWxlIGVhciA9IGdldEVBUkZpbGUoKTsKLQkJaWYgKGVhciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJldHVybiBoYXNDbGFzc3BhdGhWaXNpYmlsaXR5VG8ob3RoZXIsIHZpc2l0ZWQsIGVhcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2xhc3NwYXRoVmlzaWJpbGl0eVRvKEFyY2hpdmUgb3RoZXIsIFNldCB2aXNpdGVkLCBFQVJGaWxlIGVhcikgewotCQlpZiAodGhpcyA9PSBvdGhlcikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAodmlzaXRlZC5jb250YWlucyh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdmlzaXRlZC5hZGQodGhpcyk7Ci0JCVN0cmluZ1tdIG1mRW50cmllcyA9IGdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWZFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IGdldFJlc29sdmVkQXJjaGl2ZShtZkVudHJpZXNbaV0sIGVhcik7Ci0JCQlpZiAoYW5BcmNoaXZlICE9IG51bGwgJiYgYW5BcmNoaXZlLmhhc0NsYXNzcGF0aFZpc2liaWxpdHlUbyhvdGhlciwgdmlzaXRlZCwgZWFyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5BcmNoaXZlI2lzVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHlwZShTdHJpbmcgdHlwZSkgewotCi0JCXJldHVybiAodHlwZXMgIT0gbnVsbCAmJiBnZXRUeXBlcygpLmNvbnRhaW5zKHR5cGUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ2xpZW50TW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9DbGllbnRNb2R1bGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NmNlYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9DbGllbnRNb2R1bGVSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ2xpZW50TW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRNb2R1bGVSZWZJbXBsIGV4dGVuZHMgTW9kdWxlUmVmSW1wbCBpbXBsZW1lbnRzIENsaWVudE1vZHVsZVJlZiwgTW9kdWxlUmVmIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xpZW50TW9kdWxlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xpZW50TW9kdWxlUmVmKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19FQVJfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlMsIEVBUkZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlRmlsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZUZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNb2R1bGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNb2R1bGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJc2V0RWFyRmlsZSgoRUFSRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXNldE1vZHVsZSgoTW9kdWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXNldE1vZHVsZUZpbGUoKE1vZHVsZUZpbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJc2V0RWFyRmlsZSgoRUFSRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DTElFTlRfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZUZpbGUgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlyZXR1cm4gbW9kdWxlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBsaWNhdGlvbkNsaWVudCgpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzQ2xpZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsaWVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19IC8vQ2xpZW50TW9kdWxlUmVmSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMzUxYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5DbGllbnRNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbm5lY3Rvck1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5BcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkRpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5OZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5OdWxsTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5SYXJJbXBvcnRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlRlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5XYXIyMkltcG9ydFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIENvbW1vbmFyY2hpdmVGYWN0b3J5IHsKLQotCi0JcHJvdGVjdGVkIE1hcCBvcGVuQXJjaGl2ZXM7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWxlZ2F0ZU5lZWRzSW5pdCA9IHRydWU7Ci0JcHJpdmF0ZSBDb21tb25hcmNoaXZlRmFjdG9yeSBkZWxlZ2F0ZSA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQlpbml0UHJlcmVxcygpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCQlpbml0RGVsZWdhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlTmVlZHNJbml0KSB7Ci0JCQlkZWxlZ2F0ZU5lZWRzSW5pdCA9IGZhbHNlOwotCQkJZGVsZWdhdGUgPSBuZXcgQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsKCkgewotCi0JCQkJcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVHZW4oKTsKLQkJCQl9Ci0KLQotCQkJCXB1YmxpYyBDbGllbnRNb2R1bGVSZWYgY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlQ2xpZW50TW9kdWxlUmVmR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIENvbm5lY3Rvck1vZHVsZVJlZiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWZHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlRUFSRmlsZUdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGUoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVFSkJKYXJGaWxlR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIEVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWYoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVFSkJNb2R1bGVSZWZHZW4oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgUkFSRmlsZSBjcmVhdGVSQVJGaWxlKCkgewotCQkJCQlyZXR1cm4gY3JlYXRlUkFSRmlsZUdlbigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBXQVJGaWxlIGNyZWF0ZVdBUkZpbGUoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVXQVJGaWxlR2VuKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFdlYk1vZHVsZVJlZiBjcmVhdGVXZWJNb2R1bGVSZWYoKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVXZWJNb2R1bGVSZWZHZW4oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRTogcmV0dXJuIGNyZWF0ZUZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRTogcmV0dXJuIGNyZWF0ZUFyY2hpdmUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFOiByZXR1cm4gY3JlYXRlRUpCSmFyRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRTogcmV0dXJuIGNyZWF0ZVdBUkZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEU6IHJldHVybiBjcmVhdGVFQVJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFOiByZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUlk6IHJldHVybiBjcmVhdGVSZWFkT25seURpcmVjdG9yeSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRTogcmV0dXJuIGNyZWF0ZVJBUkZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUY6IHJldHVybiBjcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUY6IHJldHVybiBjcmVhdGVXZWJNb2R1bGVSZWYoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUY6IHJldHVybiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUY6IHJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIGFyY2hpdmVDbG9zZWQoQXJjaGl2ZSBhQ2xvc2VkQXJjaGl2ZSkgewotCQlnZXRPcGVuQXJjaGl2ZXMoKS5yZW1vdmUoYUNsb3NlZEFyY2hpdmUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIGFyY2hpdmVPcGVuZWQoQXJjaGl2ZSBhbk9wZW5BcmNoaXZlKSB7Ci0JCWdldE9wZW5BcmNoaXZlcygpLnB1dChhbk9wZW5BcmNoaXZlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRPcGVuQXJjaGl2ZXNEZXBlbmRpbmdPbihBcmNoaXZlKX0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5DbG9zZShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlyZXR1cm4gIWdldE9wZW5BcmNoaXZlc0RlcGVuZGluZ09uKGFuQXJjaGl2ZSkuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlT3BlbkFyY2hpdmVzKCkgewotCQlpZiAoZ2V0T3BlbkFyY2hpdmVzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlMaXN0IG9wZW5lZCA9IG5ldyBBcnJheUxpc3QoZ2V0T3BlbkFyY2hpdmVzKCkuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXRPcGVuQXJjaGl2ZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlvcGVuZWQuYWRkKGl0Lm5leHQoKSk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVuZWQuc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gKEFyY2hpdmUpIG9wZW5lZC5nZXQoaSk7Ci0JCQlhbkFyY2hpdmUuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIG5ldyBBcmNoaXZlQ29weVV0aWxpdHkoKS5jb3B5KGFuQXJjaGl2ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgY29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCXJldHVybiBuZXcgQXJjaGl2ZUNvcHlVdGlsaXR5KCkuY29weShhTW9kdWxlRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgY2xpZW50RmlsZSA9IGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCQlpbml0aWFsaXplTmV3QXBwbGljYXRpb25DbGllbnRGaWxlKGNsaWVudEZpbGUsIHVyaSk7Ci0JCXJldHVybiBjbGllbnRGaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUFyY2hpdmVJbml0aWFsaXplZChqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IGNyZWF0ZUFyY2hpdmUoKTsKLQkJaW5pdGlhbGl6ZU5ld0FyY2hpdmUoYW5BcmNoaXZlLCB1cmkpOwotCQlyZXR1cm4gYW5BcmNoaXZlOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEFyY2hpdmUgY3JlYXRlQXJjaGl2ZUluaXRpYWxpemVkKEFyY2hpdmVPcHRpb25zIG9wdGlvbnMsIGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gY3JlYXRlQXJjaGl2ZSgpOwotCQlpbml0aWFsaXplTmV3QXJjaGl2ZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0KLQl9Ci0KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZUNoaWxkTG9hZFN0cmF0ZWd5KFN0cmluZyB1cmksIExvYWRTdHJhdGVneSBwYXJlbnQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0KLQkJTG9hZFN0cmF0ZWd5IGNoaWxkU3RyYXRlZ3kgPSBudWxsOwotCQlpZiAocGFyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZyBkaXJOYW1lID0gKChEaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5KSBwYXJlbnQpLmdldERpcmVjdG9yeVVyaSgpOwotCQkJU3RyaW5nIHF1YWxpZmllZFVyaSA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKGRpck5hbWUsIHVyaSk7Ci0JCQljaGlsZFN0cmF0ZWd5ID0gY3JlYXRlTG9hZFN0cmF0ZWd5KHF1YWxpZmllZFVyaSk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZFN0cmF0ZWd5ID0gY3JlYXRlTmVzdGVkTG9hZFN0cmF0ZWd5KHVyaSwgcGFyZW50KTsKLQkJfQotCQlyZXR1cm4gY2hpbGRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJRUFSRmlsZSBlYXJGaWxlID0gY3JlYXRlRUFSRmlsZSgpOwotCQlpbml0aWFsaXplTmV3RUFSRmlsZShlYXJGaWxlLCB1cmkpOwotCQlyZXR1cm4gZWFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJRUFSRmlsZSBlYXJGaWxlID0gY3JlYXRlRUFSRmlsZSgpOwotCQlpbml0aWFsaXplTmV3RUFSRmlsZShlYXJGaWxlLCB1cmksIG9wdGlvbnMpOwotCQlyZXR1cm4gZWFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gY3JlYXRlRUpCSmFyRmlsZSgpOwotCQlpbml0aWFsaXplTmV3RUpCSmFyRmlsZShlamJKYXJGaWxlLCB1cmkpOwotCQlyZXR1cm4gZWpiSmFyRmlsZTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIGNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZChBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBjcmVhdGVFSkJKYXJGaWxlKCk7Ci0JCWluaXRpYWxpemVOZXdFSkJKYXJGaWxlKGVqYkphckZpbGUsIHVyaSwgb3B0aW9ucyk7Ci0JCXJldHVybiBlamJKYXJGaWxlOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIE51bGxMb2FkU3RyYXRlZ3lJbXBsOyB1c2VkIGZvciBuZXcgYXJjaGl2ZXMKLQkgKi8KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZUVtcHR5TG9hZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IE51bGxMb2FkU3RyYXRlZ3lJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBkeW5hbWljYWxseSBidWlsZCBhIGxvYWQgc3RyYXRlZ3kgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uIERldGVybWluZXMgd2hldGhlcgotCSAqIHRoZSB1cmkgcG9pbnRzIHRvIGEgamFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBMb2FkU3RyYXRlZ3kgY3JlYXRlTG9hZFN0cmF0ZWd5KFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gdXJpLnJlcGxhY2UoJy8nLCBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZmlsZV9ub3RfZm91bmRfRVhDXyIsIChuZXcgT2JqZWN0W117dXJpLCBmaWxlLmdldEFic29sdXRlUGF0aCgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJVUkkgTmFtZTogezB9OyBGaWxlIG5hbWU6IHsxfSIKLQkJfQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm4gbmV3IERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbChmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBsb2FkIHN0cmF0ZWd5IGZvciBhIG5lc3RlZCBhcmNoaXZlOyBieSBkZWZhdWx0IHdpbGwgZXh0cmFjdCB0aGUgbmVzdGVkIGFyY2hpdmUgdG8gYQotCSAqIHRlbXAgZmlsZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gVGhpcyBpcyBiZWNhdXNlIHJhbmRvbSBhY2Nlc3MgdG8gdGhlIHppcCBlbnRyaWVzIGluIGEKLQkgKiBuZXN0ZWQgYXJjaGl2ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2UsIGFuZCBpZiB0aGUgYXJjaGl2ZSdzIGNvbnRlbnRzCi0JICogYXJlIGJlaW5nIG1vZGlmaWVkLCBjb3BpZWQsIGV0YywgdGhpcyBpcyBtdWNoIGZhc3Rlci4gSWYgYSB0ZW1wIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkLCBvcgotCSAqIGlmIHRoZSBhcmNoaXZlIGlzIG9wZW5lZCByZWFkIG9ubHkgKGZvciBydW50aW1lKSwgdGhlbiB1c2UgYSBOZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5LCB3aGljaAotCSAqIHJldHJpZXZlcyB0aGUgY29udGVudHMgb2YgYSB6aXAgZW50cnkgYnkgc2VxdWVudGlhbGx5IHNlYXJjaGluZyBhIHppcCBpbnB1dCBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZU5lc3RlZExvYWRTdHJhdGVneShTdHJpbmcgdXJpLCBMb2FkU3RyYXRlZ3kgcGFyZW50KSB7Ci0JCUxvYWRTdHJhdGVneSBsb2FkU3RyYXRlZ3kgPSBudWxsOwotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gKChBcmNoaXZlKSBwYXJlbnQuZ2V0Q29udGFpbmVyKCkpLmdldE9wdGlvbnMoKTsKLQotCQlpZiAoIW9wdGlvbnMuaXNSZWFkT25seSh1cmkpKQotCQkJbG9hZFN0cmF0ZWd5ID0gY3JlYXRlVGVtcFppcEZpbGVTdHJhdGVneUlmUG9zc2libGUodXJpLCBwYXJlbnQpOwotCi0JCWlmIChsb2FkU3RyYXRlZ3kgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwocGFyZW50KTsKLQkJcmV0dXJuIGxvYWRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUkFSRmlsZSBjcmVhdGVSQVJGaWxlSW5pdGlhbGl6ZWQoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJUkFSRmlsZSByYXJGaWxlID0gY3JlYXRlUkFSRmlsZSgpOwotCQlpbml0aWFsaXplTmV3UkFSRmlsZShyYXJGaWxlLCB1cmkpOwotCQlyZXR1cm4gcmFyRmlsZTsKLQl9Ci0KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5IGNyZWF0ZVRlbXBaaXBGaWxlU3RyYXRlZ3lJZlBvc3NpYmxlKFN0cmluZyB1cmksIExvYWRTdHJhdGVneSBwYXJlbnQpIHsKLQotCQlpZiAoIUFyY2hpdmVVdGlsLnNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0cnkgewotCQkJamF2YS5pby5GaWxlIHRlbXBGaWxlID0gQXJjaGl2ZVV0aWwuY3JlYXRlVGVtcEZpbGUodXJpKTsKLQkJCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBwYXJlbnQuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0JCQlBcmNoaXZlVXRpbC5jb3B5KGluLCBvdXQpOwotCQkJcmV0dXJuIG5ldyBUZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwodGVtcEZpbGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJQXJjaGl2ZVV0aWwuaW5mb3JtKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJtYWtlX3RlbXBfZmlsZV9XQVJOXyIsIChuZXcgT2JqZWN0W117dXJpfSkpICsgZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCA9ICJXYXJuaW5nOiBVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZSBmb3IgezB9LiAgVGhpcyB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZS4iCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFdBUkZpbGUgY3JlYXRlV0FSRmlsZUluaXRpYWxpemVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCVdBUkZpbGUgd2FyRmlsZSA9IGNyZWF0ZVdBUkZpbGUoKTsKLQkJaW5pdGlhbGl6ZU5ld1dBUkZpbGUod2FyRmlsZSwgdXJpKTsKLQkJcmV0dXJuIHdhckZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmVPcHRpb25zIGRlZmF1bHRPcHRpb25zKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5KSB7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXRMb2FkU3RyYXRlZ3koYUxvYWRTdHJhdGVneSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QWN0aXZlRmFjdG9yeSgpIHsKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gZ2V0UGFja2FnZSgpOwotCQlpZiAocGtnICE9IG51bGwpCi0JCQlyZXR1cm4gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TWFuaWZlc3RDbGFzc1BhdGhWYWx1ZXMoamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlTdHJpbmdbXSByZXN1bHQgPSBhbkFyY2hpdmUuZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjMvMDEgMjozNTo1NSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLk1hcCBnZXRPcGVuQXJjaGl2ZXMoKSB7Ci0JCWlmIChvcGVuQXJjaGl2ZXMgPT0gbnVsbCkKLQkJCW9wZW5BcmNoaXZlcyA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCQlyZXR1cm4gb3BlbkFyY2hpdmVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBTZXQgZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJU2V0IGRlcGVuZGVudHMgPSBuZXcgSGFzaFNldCgpOwotCQlJdGVyYXRvciBvcGVuZWQgPSBnZXRPcGVuQXJjaGl2ZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAob3BlbmVkLmhhc05leHQoKSkgewotCQkJQXJjaGl2ZSBvcGVuZWRBcmNoaXZlID0gKEFyY2hpdmUpIG9wZW5lZC5uZXh0KCk7Ci0JCQlpZiAob3BlbmVkQXJjaGl2ZSA9PSBhbkFyY2hpdmUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIW9wZW5lZEFyY2hpdmUuaXNJbmRleGVkKCkpCi0JCQkJLy8qKioqKioqKioqT3B0aW1pemF0aW9uKioqKioqKioqKioKLQkJCQkvL0lmIHRoZSBmaWxlIGxpc3QgaGFzIG5ldmVyIGJlZW4gYnVpbHQgZm9yIHRoZSBhcmNoaXZlLCB3ZSBkb24ndCB3YW50IHRvIHRyaWdnZXIKLQkJCQkvLyBpdCBub3csCi0JCQkJLy9hbmQgd2UgYXJlIHN1cmUgdGhhdCB0aGUgYXJjaGl2ZSBpcyBub3QgcHJldmVudGluZyB0aGUgcGFyYW1ldGVyIGZyb20gY2xvc2luZwotCQkJCWNvbnRpbnVlOwotCQkJTGlzdCBmaWxlcyA9IG9wZW5lZEFyY2hpdmUuZ2V0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCQlpZiAoYUZpbGUuZ2V0TG9hZGluZ0NvbnRhaW5lcigpID09IGFuQXJjaGl2ZSkgewotCQkJCQlBcmNoaXZlIG91dGVybW9zdCA9IG9wZW5lZEFyY2hpdmU7Ci0JCQkJCUNvbnRhaW5lciBjID0gb3BlbmVkQXJjaGl2ZS5nZXRDb250YWluZXIoKTsKLQkJCQkJd2hpbGUgKGMgIT0gbnVsbCAmJiBjLmlzQXJjaGl2ZSgpKSB7Ci0JCQkJCQlvdXRlcm1vc3QgPSAoQXJjaGl2ZSkgYzsKLQkJCQkJCWMgPSBjLmdldENvbnRhaW5lcigpOwotCQkJCQl9Ci0JCQkJCWRlcGVuZGVudHMuYWRkKG91dGVybW9zdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vRWxlbWVudHMgZnJvbSBvbmUgb2YgdGhlIGNoaWxkcmVuIChlLmcuLCBhIG1vZHVsZSBmaWxlIGluIGFuIGVhcikgbWF5IGhhdmUgYmVlbiBjb3BpZWQgdG8KLQkJLy9hbm90aGVyIGFyY2hpdmUKLQkJTGlzdCBuZXN0ZWRBcmNoaXZlcyA9IGFuQXJjaGl2ZS5nZXRBcmNoaXZlRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRBcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJZGVwZW5kZW50cy5hZGRBbGwoZ2V0T3BlbkFyY2hpdmVzRGVwZW5kaW5nT24oKEFyY2hpdmUpIG5lc3RlZEFyY2hpdmVzLmdldChpKSkpOwotCQl9Ci0JCXJldHVybiBkZXBlbmRlbnRzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0UHJlcmVxcygpIHsKLQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdC5pbnZva2VQcmVyZXFJbml0cyh0cnVlKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJZGlzYy5hZGRDaGlsZChFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCkpOwotCQlkaXNjLmFkZENoaWxkKFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKSk7Ci0JCWRpc2MuYWRkQ2hpbGQoQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpKTsKLQkJZGlzYy5hZGRDaGlsZChSYXJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpKTsKLQkJZGlzYy5hZGRDaGlsZChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0FyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJYW5BcmNoaXZlLnNldFVSSSh1cmkpOwotCQlhbkFyY2hpdmUuc2V0U2l6ZSgwKTsKLQkJYW5BcmNoaXZlLnNldExhc3RNb2RpZmllZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFuQXJjaGl2ZS5zZXREaXJlY3RvcnlFbnRyeShmYWxzZSk7Ci0JCWFuQXJjaGl2ZS5zZXRMb2FkU3RyYXRlZ3koY3JlYXRlRW1wdHlMb2FkU3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0VBUkZpbGUoRUFSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmkpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdFSkJKYXJGaWxlKEVKQkphckZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3TW9kdWxlRmlsZShNb2R1bGVGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3QXJjaGl2ZShhbkFyY2hpdmUsIHVyaSk7Ci0JCWFuQXJjaGl2ZS5tYWtlRGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdSQVJGaWxlKFJBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3V0FSRmlsZShXQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSkgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld0FwcGxpY2F0aW9uQ2xpZW50RmlsZShBcHBsaWNhdGlvbkNsaWVudEZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3QXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpZiAob3B0aW9ucy5nZXRMb2FkU3RyYXRlZ3koKSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW9wdGlvbnMuc2V0TG9hZFN0cmF0ZWd5KGNyZWF0ZUVtcHR5TG9hZFN0cmF0ZWd5KCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCX0KLQkJfQotCi0JCWFuQXJjaGl2ZS5zZXRVUkkodXJpKTsKLQkJYW5BcmNoaXZlLnNldFNpemUoMCk7Ci0JCWFuQXJjaGl2ZS5zZXRMYXN0TW9kaWZpZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhbkFyY2hpdmUuc2V0RGlyZWN0b3J5RW50cnkoZmFsc2UpOwotCQlhbkFyY2hpdmUuc2V0TG9hZFN0cmF0ZWd5KG9wdGlvbnMuZ2V0TG9hZFN0cmF0ZWd5KCkpOwotCQlhbkFyY2hpdmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOZXdFQVJGaWxlKEVBUkZpbGUgYW5BcmNoaXZlLCBTdHJpbmcgdXJpLCBBcmNoaXZlT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWluaXRpYWxpemVOZXdNb2R1bGVGaWxlKGFuQXJjaGl2ZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3RUpCSmFyRmlsZShFSkJKYXJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoTW9kdWxlRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaW5pdGlhbGl6ZU5ld0FyY2hpdmUoYW5BcmNoaXZlLCB1cmksIG9wdGlvbnMpOwotCQlhbkFyY2hpdmUubWFrZURlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmV3UkFSRmlsZShSQVJGaWxlIGFuQXJjaGl2ZSwgU3RyaW5nIHVyaSwgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucykgewotCQlpbml0aWFsaXplTmV3TW9kdWxlRmlsZShhbkFyY2hpdmUsIHVyaSwgb3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU5ld1dBUkZpbGUoV0FSRmlsZSBhbkFyY2hpdmUsIFN0cmluZyB1cmksIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMpIHsKLQkJaW5pdGlhbGl6ZU5ld01vZHVsZUZpbGUoYW5BcmNoaXZlLCB1cmksIG9wdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIG9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgb3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZSh1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlyZXR1cm4gb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIFJvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuQXJjaGl2ZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUoYUxvYWRTdHJhdGVneSwgdXJpKTsKLQkJcmV0dXJuIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKSk7Ci0JfQotCi0JLyoqCi0JICogb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgLSBvcGVuIHRoZSBhcmNoaXZlIGJ5IHRoZSBwYXNzZWQgbmFtZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBzdHJhdGVnaWVzLiBOYW1lIG1heSBiZSBhIHBhdGggdG8gYSBqYXIsIGEgemlwLCBvciBhIGRpcmVjdG9yeSByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIEFyY2hpdmUKLQkgKiB0eXBlCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCXJldHVybiBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5BcmNoaXZlKFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJYW5BcmNoaXZlLnNldEV4dHJhQ2xhc3NwYXRoKGV4dHJhQ2xhc3NQYXRoKTsKLQkJcmV0dXJuIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKSk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIEVBUkZpbGUgb3BlbkVBUkZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUFSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFQVJGaWxlIG9wZW5FQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChFQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVBUkZpbGUgb3BlbkVBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUFSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkIxMUphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCMTFKYXJGaWxlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShvcHRpb25zLCB1cmkpOwotCQlSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYyA9IChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwpIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCVJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBkaXNjID0gKFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCkgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLnNpbmdsZXRvbigpOwotCQlyZXR1cm4gKEVKQkphckZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRUpCSmFyRmlsZSBvcGVuRUpCSmFyRmlsZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSwgU3RyaW5nIGV4dHJhQ2xhc3NQYXRoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlhbkFyY2hpdmUuc2V0RXh0cmFDbGFzc3BhdGgoZXh0cmFDbGFzc1BhdGgpOwotCQlSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYyA9IChSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwpIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5zaW5nbGV0b24oKTsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIEVKQkphckZpbGUgb3BlbkVKQkphckZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGRpc2MgPSAoUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKSBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJGaWxlIG9wZW5FSkJKYXJGaWxlKFN0cmluZyB1cmksIFN0cmluZyBleHRyYUNsYXNzUGF0aCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJYW5BcmNoaXZlLnNldEV4dHJhQ2xhc3NwYXRoKGV4dHJhQ2xhc3NQYXRoKTsKLQkJUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGRpc2MgPSAoUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKSBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuc2luZ2xldG9uKCk7Ci0JCXJldHVybiAoRUpCSmFyRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKExvb3NlQXJjaGl2ZSBsb29zZSwgQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmkgPSBsb29zZS5nZXRVcmkoKTsKLQkJdHJ5IHsKLQkJCWlmKGxvb3NlLmdldEJpbmFyaWVzUGF0aCgpID09IG51bGwpewotCQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib3Blbl9uZXN0ZWRfRVhDXyIsIChuZXcgT2JqZWN0W10ge3VyaSxwYXJlbnQuZ2V0VVJJKCl9KSksIG51bGwpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCBvcGVuIHRoZSBuZXN0ZWQgYXJjaGl2ZSAiezB9IiBpbiAiezF9IiIKLQkJCX0KLQkJCUxvYWRTdHJhdGVneSBjaGlsZFN0cmF0ZWd5ID0gY3JlYXRlTG9hZFN0cmF0ZWd5KGxvb3NlLmdldEJpbmFyaWVzUGF0aCgpKTsKLQkJCWNoaWxkU3RyYXRlZ3kuc2V0TG9vc2VBcmNoaXZlKGxvb3NlKTsKLQkJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBwYXJlbnQuZ2V0T3B0aW9ucygpLmNsb25lV2l0aChjaGlsZFN0cmF0ZWd5LCBsb29zZS5nZXRVcmkoKSk7Ci0JCQlyZXR1cm4gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9wZW5fbmVzdGVkX0VYQ18iLCAobmV3IE9iamVjdFtde3VyaSwgcGFyZW50LmdldFVSSSgpfSkpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iIgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyB1cmksIEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJTG9hZFN0cmF0ZWd5IGNoaWxkU3RyYXRlZ3kgPSBjcmVhdGVDaGlsZExvYWRTdHJhdGVneSh1cmksIHBhcmVudC5nZXRMb2FkU3RyYXRlZ3koKSk7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gcGFyZW50LmdldE9wdGlvbnMoKS5jbG9uZVdpdGgoY2hpbGRTdHJhdGVneSwgdXJpKTsKLQkJCWlmIChvcHRpb25zLnNob3VsZERpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzKCkpCi0JCQkJcmV0dXJuIG9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCQlyZXR1cm4gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9wZW5fbmVzdGVkX0VYQ18iLCAobmV3IE9iamVjdFtde3VyaSwgcGFyZW50LmdldFVSSSgpfSkpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiQ291bGQgbm90IG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlICJ7MH0iIGluICJ7MX0iIgotCQl9Ci0JfQotCi0JLyoqCi0JICogb3BlbiB0aGUgYXJjaGl2ZSwgc2V0dGluZyB1cCB0aGUgYXBwcm9wcmlhdGUgc3RyYXRlZ2llcywgdXNpbmcgdGhlIGxvYWRTdHJhdGVneSBwYXNzZWQgaW47Ci0JICogVVJJIHN0aWxsIG5lY2Vzc2FyeSBzbyB0aGUgYXJjaGl2ZSBoYXMgYSBuYW1lLCBidXQgaXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgaW8uCi0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucywgamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChSQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoTG9hZFN0cmF0ZWd5IGFMb2FkU3RyYXRlZ3ksIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gcHJpbU9wZW5BcmNoaXZlKGFMb2FkU3RyYXRlZ3ksIHVyaSk7Ci0JCUFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBkaXNjID0gUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChSQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFJBUkZpbGUgb3BlblJBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBSYXJJbXBvcnRTdHJhdGVneUltcGwuZ2V0RGlzY3JpbWluYXRvcigpOwotCQlyZXR1cm4gKFJBUkZpbGUpIG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCBkaXNjKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuUmVhZE9ubHlEaXJlY3RvcnkgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlYWRPbmx5RGlyZWN0b3J5IG9wZW5SZWFkT25seURpcmVjdG9yeShqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHVyaSk7Ci0JCWlmICghYUZpbGUuZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJjb3VsZF9ub3RfZmluZF9kaXJfRVhDXyIsIChuZXcgT2JqZWN0W117dXJpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJVbmFibGUgdG8gb3BlbiBkaXJlY3RvcnkgIgotCQlpZiAoIWFGaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm5vdF9hX2Rpcl9FWENfIiwgKG5ldyBPYmplY3RbXXt1cml9KSkpOyAvLyROT04tTkxTLTEkID0gIlVuYWJsZSB0byBvcGVuIGRpcmVjdG9yeSBiZWNhdXNlIGZpbGUgaXMgbm90IGEgZGlyZWN0b3J5IDoiCi0JCUxvYWRTdHJhdGVneSBzdHJhdGVneSA9IG5ldyBSZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwodXJpKTsKLQkJUmVhZE9ubHlEaXJlY3RvcnkgY29udGFpbmVyID0gY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnkoKTsKLQkJY29udGFpbmVyLnNldFVSSSh1cmkpOwotCQljb250YWluZXIuc2V0TG9hZFN0cmF0ZWd5KHN0cmF0ZWd5KTsKLQkJY29udGFpbmVyLnNldExhc3RNb2RpZmllZChhRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogVGFrZSB0aGUgcHJpbWl0aXZlIGFyY2hpdmUgYW5kIHJ1biBpdCB0aHJvdWdoIHRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3JzIHRvIGNvbnZlcnQgaXQgdG8gdGhlCi0JICogY29ycmVjdCBzcGVjaWFsaXplZCB0eXBlOyBhZnRlciBhZnRlciBjb252ZXJzaW9uLCB0ZWxsIHRoZSBhcmNoaXZlIHRvIGluaXRhbGl6ZSBpdHNlbGYgaWYKLQkgKiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3BlblNwZWNpZmljQXJjaGl2ZShBcmNoaXZlIGFuQXJjaGl2ZSwgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmICghZGlzYy5jYW5JbXBvcnQoYW5BcmNoaXZlKSkgewotCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oZGlzYy5nZXRVbmFibGVUb09wZW5NZXNzYWdlKCkpOwotCQl9Ci0JCUFyY2hpdmUgc3BlY2lmaWNBcmNoaXZlID0gZGlzYy5vcGVuQXJjaGl2ZShhbkFyY2hpdmUpOwotCQlzcGVjaWZpY0FyY2hpdmUuaW5pdGlhbGl6ZUFmdGVyT3BlbigpOwotCQlyZXR1cm4gc3BlY2lmaWNBcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIFNwZWNpYWwgY2FzZSBmb3IgZWpiIGphciBmaWxlcywgYmVjYXVzZSBvZiB0aGUgbmVlZCB0byBzdXBwb3J0IG5vbi1jb21wbGlhbnQgMS4wIGphcnMKLQkgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuU3BlY2lmaWNBcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlLCBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZGlzYykgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBzcGVjaWZpYyA9IG9wZW5TcGVjaWZpY0FyY2hpdmUoYW5BcmNoaXZlLCAoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yKSBkaXNjKTsKLQkJaWYgKHNwZWNpZmljID09IGFuQXJjaGl2ZSkgewotCQkJLy9UaGUgZGlzY3JpbWluYXRvciBmYWlsZWQgdG8gY29udmVydCB0aGUgYXJjaHZlIHRvIGFuIGVqYiBqYXIgZmlsZQotCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oZGlzYy5nZXRVbmFibGVUb09wZW5NZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBzcGVjaWZpYzsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIHRoZSBhcmNoaXZlLCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLCB1c2luZyB0aGUgbG9hZFN0cmF0ZWd5IHBhc3NlZCBpbjsKLQkgKiBVUkkgc3RpbGwgbmVjZXNzYXJ5IHNvIHRoZSBhcmNoaXZlIGhhcyBhIG5hbWUsIGJ1dCBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBpby4KLQkgKi8KLQlwdWJsaWMgV0FSRmlsZSBvcGVuV0FSRmlsZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUob3B0aW9ucywgdXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoV0FSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5Db21tb25hcmNoaXZlRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQVJGaWxlIG9wZW5XQVJGaWxlKExvYWRTdHJhdGVneSBhTG9hZFN0cmF0ZWd5LCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IHByaW1PcGVuQXJjaGl2ZShhTG9hZFN0cmF0ZWd5LCB1cmkpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZGlzYyA9IFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmdldERpc2NyaW1pbmF0b3IoKTsKLQkJcmV0dXJuIChXQVJGaWxlKSBvcGVuU3BlY2lmaWNBcmNoaXZlKGFuQXJjaGl2ZSwgZGlzYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkNvbW1vbmFyY2hpdmVGYWN0b3J5Ci0JICovCi0JcHVibGljIFdBUkZpbGUgb3BlbldBUkZpbGUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBwcmltT3BlbkFyY2hpdmUodXJpKTsKLQkJQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGRpc2MgPSBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCk7Ci0JCXJldHVybiAoV0FSRmlsZSkgb3BlblNwZWNpZmljQXJjaGl2ZShhbkFyY2hpdmUsIGRpc2MpOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShBcmNoaXZlT3B0aW9ucyBvcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucy5nZXRMb2FkU3RyYXRlZ3koKSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW9wdGlvbnMuc2V0TG9hZFN0cmF0ZWd5KGNyZWF0ZUxvYWRTdHJhdGVneSh1cmkpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IE9wZW5GYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJjb3VsZF9ub3Rfb3Blbl9FWENfIiwgKG5ldyBPYmplY3RbXXt1cml9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJDb3VsZCBub3Qgb3BlbiAiCi0JCQl9Ci0JCX0KLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBjcmVhdGVBcmNoaXZlKCk7Ci0JCWFuQXJjaGl2ZS5zZXRVUkkodXJpKTsKLQkJYW5BcmNoaXZlLnNldE9yaWdpbmFsVVJJKHVyaSk7Ci0JCWFuQXJjaGl2ZS5zZXRMb2FkU3RyYXRlZ3kob3B0aW9ucy5nZXRMb2FkU3RyYXRlZ3koKSk7Ci0JCWFuQXJjaGl2ZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmNvbnRyaWJ1dGVUeXBlcyhhbkFyY2hpdmUpOwotCQlyZXR1cm4gYW5BcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFyY2hpdmUsIHNldHRpbmcgdXAgdGhlIGFwcHJvcHJpYXRlIHN0cmF0ZWdpZXMsIHVzaW5nIHRoZSBsb2FkU3RyYXRlZ3kgcGFzc2VkIGluOwotCSAqIFVSSSBzdGlsbCBuZWNlc3Nhcnkgc28gdGhlIGFyY2hpdmUgaGFzIGEgbmFtZSwgYnV0IGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGlvLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIHByaW1PcGVuQXJjaGl2ZShMb2FkU3RyYXRlZ3kgYUxvYWRTdHJhdGVneSwgU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByaW1PcGVuQXJjaGl2ZShkZWZhdWx0T3B0aW9ucyhhTG9hZFN0cmF0ZWd5KSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29tbW9uYXJjaGl2ZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBwcmltT3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByaW1PcGVuQXJjaGl2ZShuZXcgQXJjaGl2ZU9wdGlvbnMoKSwgdXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPcGVuQXJjaGl2ZXMoamF2YS51dGlsLk1hcCBuZXdPcGVuQXJjaGl2ZXMpIHsKLQkJb3BlbkFyY2hpdmVzID0gbmV3T3BlbkFyY2hpdmVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXQVJGaWxlIGNyZWF0ZVdBUkZpbGVHZW4oKSB7Ci0JCVdBUkZpbGVJbXBsIHdhckZpbGUgPSBuZXcgV0FSRmlsZUltcGwoKTsKLQkJcmV0dXJuIHdhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZUdlbigpIHsKLQkJRUpCSmFyRmlsZUltcGwgZWpiSmFyRmlsZSA9IG5ldyBFSkJKYXJGaWxlSW1wbCgpOwotCQlyZXR1cm4gZWpiSmFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUdlbigpIHsKLQkJQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCBhcHBsaWNhdGlvbkNsaWVudEZpbGUgPSBuZXcgQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnRGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGVHZW4oKSB7Ci0JCUVBUkZpbGVJbXBsIGVhckZpbGUgPSBuZXcgRUFSRmlsZUltcGwoKTsKLQkJcmV0dXJuIGVhckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFJBUkZpbGUgY3JlYXRlUkFSRmlsZUdlbigpIHsKLQkJUkFSRmlsZUltcGwgcmFyRmlsZSA9IG5ldyBSQVJGaWxlSW1wbCgpOwotCQlyZXR1cm4gcmFyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRmlsZSBjcmVhdGVGaWxlKCkgewotCQlGaWxlSW1wbCBmaWxlID0gbmV3IEZpbGVJbXBsKCk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBSZWFkT25seURpcmVjdG9yeSBjcmVhdGVSZWFkT25seURpcmVjdG9yeSgpIHsKLQkJUmVhZE9ubHlEaXJlY3RvcnlJbXBsIHJlYWRPbmx5RGlyZWN0b3J5ID0gbmV3IFJlYWRPbmx5RGlyZWN0b3J5SW1wbCgpOwotCQlyZXR1cm4gcmVhZE9ubHlEaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbW1vbmFyY2hpdmVQYWNrYWdlIGdldENvbW1vbmFyY2hpdmVQYWNrYWdlKCkgewotCQlyZXR1cm4gKENvbW1vbmFyY2hpdmVQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25hcmNoaXZlUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFSkJNb2R1bGVSZWYgY3JlYXRlRUpCTW9kdWxlUmVmR2VuKCkgewotCQlFSkJNb2R1bGVSZWZJbXBsIGVqYk1vZHVsZVJlZiA9IG5ldyBFSkJNb2R1bGVSZWZJbXBsKCk7Ci0JCXJldHVybiBlamJNb2R1bGVSZWY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlYk1vZHVsZVJlZiBjcmVhdGVXZWJNb2R1bGVSZWZHZW4oKSB7Ci0JCVdlYk1vZHVsZVJlZkltcGwgd2ViTW9kdWxlUmVmID0gbmV3IFdlYk1vZHVsZVJlZkltcGwoKTsKLQkJcmV0dXJuIHdlYk1vZHVsZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xpZW50TW9kdWxlUmVmIGNyZWF0ZUNsaWVudE1vZHVsZVJlZkdlbigpIHsKLQkJQ2xpZW50TW9kdWxlUmVmSW1wbCBjbGllbnRNb2R1bGVSZWYgPSBuZXcgQ2xpZW50TW9kdWxlUmVmSW1wbCgpOwotCQlyZXR1cm4gY2xpZW50TW9kdWxlUmVmOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JNb2R1bGVSZWYgY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmR2VuKCkgewotCQlDb25uZWN0b3JNb2R1bGVSZWZJbXBsIGNvbm5lY3Rvck1vZHVsZVJlZiA9IG5ldyBDb25uZWN0b3JNb2R1bGVSZWZJbXBsKCk7Ci0JCXJldHVybiBjb25uZWN0b3JNb2R1bGVSZWY7Ci0JfQotCi0JcHVibGljIENsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoQXBwbGljYXRpb25DbGllbnRGaWxlIGNsaWVudEZpbGUpIHsKLQkJQ2xpZW50TW9kdWxlUmVmIHJlZiA9IGNyZWF0ZUNsaWVudE1vZHVsZVJlZigpOwotCQlyZWYuc2V0TW9kdWxlRmlsZShjbGllbnRGaWxlKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29tbW9uYXJjaGl2ZUZhY3RvcnkjY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKFJBUkZpbGUpCi0JICovCi0JcHVibGljIENvbm5lY3Rvck1vZHVsZVJlZiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoUkFSRmlsZSByYXJGaWxlKSB7Ci0JCUNvbm5lY3Rvck1vZHVsZVJlZiByZWYgPSBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQkJcmVmLnNldE1vZHVsZUZpbGUocmFyRmlsZSk7Ci0JCXJldHVybiByZWY7Ci0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29tbW9uYXJjaGl2ZUZhY3RvcnkjY3JlYXRlRUpCTW9kdWxlUmVmKEVKQkphckZpbGUpCi0JICovCi0JcHVibGljIEVKQk1vZHVsZVJlZiBjcmVhdGVFSkJNb2R1bGVSZWYoRUpCSmFyRmlsZSBlamJKYXJGaWxlKSB7Ci0JCUVKQk1vZHVsZVJlZiByZWYgPSBjcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQkJcmVmLnNldE1vZHVsZUZpbGUoZWpiSmFyRmlsZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbW1vbmFyY2hpdmVGYWN0b3J5I2NyZWF0ZVdlYk1vZHVsZVJlZihXQVJGaWxlKQotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGVSZWYgY3JlYXRlV2ViTW9kdWxlUmVmKFdBUkZpbGUgd2FyRmlsZSkgewotCQlXZWJNb2R1bGVSZWYgcmVmID0gY3JlYXRlV2ViTW9kdWxlUmVmKCk7Ci0JCXJlZi5zZXRNb2R1bGVGaWxlKHdhckZpbGUpOwotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUFyY2hpdmUoKSB7Ci0JCUFyY2hpdmVJbXBsIGFyY2hpdmUgPSBuZXcgQXJjaGl2ZUltcGwoKTsKLQkJcmV0dXJuIGFyY2hpdmU7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlKCk7Ci0JfQotCi0KLQlwdWJsaWMgQ2xpZW50TW9kdWxlUmVmIGNyZWF0ZUNsaWVudE1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDbGllbnRNb2R1bGVSZWYoKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQl9Ci0KLQlwdWJsaWMgRUFSRmlsZSBjcmVhdGVFQVJGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgRUpCSmFyRmlsZSBjcmVhdGVFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQl9Ci0KLQlwdWJsaWMgUkFSRmlsZSBjcmVhdGVSQVJGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVJBUkZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgV0FSRmlsZSBjcmVhdGVXQVJGaWxlKCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXZWJNb2R1bGVSZWYoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5MzEwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNsaWVudE1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db25uZWN0b3JNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbW1vbmFyY2hpdmVQYWNrYWdlLAotICogICAgICAgICAgRVBhY2thZ2Uge30KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbW1vbmFyY2hpdmVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXJjaGl2ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWpiSmFyRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2FyRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWFyRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25DbGllbnRGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtb2R1bGVGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250YWluZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlYWRPbmx5RGlyZWN0b3J5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByYXJGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtb2R1bGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYk1vZHVsZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViTW9kdWxlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjbGllbnRNb2R1bGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25hcmNoaXZlUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlDb21tb25hcmNoaXZlUGFja2FnZUltcGwgdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UgPSAoQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlMb29zZWNvbmZpZ1BhY2thZ2VJbXBsIHRoZUxvb3NlY29uZmlnUGFja2FnZSA9IChMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTG9vc2Vjb25maWdQYWNrYWdlLmVOU19VUkkpIDogTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUphdmFSZWZQYWNrYWdlSW1wbCB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmF2YVJlZlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkgOiBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVMb29zZWNvbmZpZ1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFSZWZQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVDb21tb25hcmNoaXZlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlTG9vc2Vjb25maWdQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YVJlZlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRhaW5lcl9GaWxlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0FSRmlsZSgpIHsKLQkJcmV0dXJuIHdhckZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V0FSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdhckZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiBtb2R1bGVGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUFSRmlsZSgpIHsKLQkJcmV0dXJuIGVhckZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVhckZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFQVJGaWxlX01vZHVsZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllYXJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNb2R1bGVSZWYoKSB7Ci0JCXJldHVybiBtb2R1bGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kdWxlUmVmX01vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltb2R1bGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2R1bGVSZWZfRWFyRmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1vZHVsZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1vZHVsZVJlZl9Nb2R1bGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltb2R1bGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQk1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIGVqYk1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlYk1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIHdlYk1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENsaWVudE1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIGNsaWVudE1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbm5lY3Rvck1vZHVsZVJlZigpIHsKLQkJcmV0dXJuIGNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVKQkphckZpbGUoKSB7Ci0JCXJldHVybiBlamJKYXJGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphckZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSQVJGaWxlKCkgewotCQlyZXR1cm4gcmFyRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UkFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJhckZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiBhcmNoaXZlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcmNoaXZlX1R5cGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJjaGl2ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZV9VUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZV9MYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZV9TaXplKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWxlX0RpcmVjdG9yeUVudHJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVfT3JpZ2luYWxVUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsZV9Mb2FkaW5nQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbGVfQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVhZE9ubHlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiByZWFkT25seURpcmVjdG9yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ29tbW9uYXJjaGl2ZUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlmaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpbGVFQ2xhc3MsIEZJTEVfX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZUVDbGFzcywgRklMRV9fTEFTVF9NT0RJRklFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZUVDbGFzcywgRklMRV9fU0laRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZUVDbGFzcywgRklMRV9fRElSRUNUT1JZX0VOVFJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWxlRUNsYXNzLCBGSUxFX19PUklHSU5BTF9VUkkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbGVFQ2xhc3MsIEZJTEVfX0xPQURJTkdfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWxlRUNsYXNzLCBGSUxFX19DT05UQUlORVIpOwotCi0JCWFyY2hpdmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJDSElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJjaGl2ZUVDbGFzcywgQVJDSElWRV9fVFlQRVMpOwotCi0JCWVqYkphckZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX0pBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJGaWxlRUNsYXNzLCBFSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0KLQkJd2FyRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2FyRmlsZUVDbGFzcywgV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0KLQkJZWFyRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWFyRmlsZUVDbGFzcywgRUFSX0ZJTEVfX01PRFVMRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlYXJGaWxlRUNsYXNzLCBFQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQotCQlhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUik7Ci0KLQkJbW9kdWxlRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RVTEVfRklMRSk7Ci0KLQkJY29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGFpbmVyRUNsYXNzLCBDT05UQUlORVJfX0ZJTEVTKTsKLQotCQlyZWFkT25seURpcmVjdG9yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUFEX09OTFlfRElSRUNUT1JZKTsKLQotCQlyYXJGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyYXJGaWxlRUNsYXNzLCBSQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKLQotCQltb2R1bGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTU9EVUxFX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobW9kdWxlUmVmRUNsYXNzLCBNT0RVTEVfUkVGX19NT0RVTEVfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobW9kdWxlUmVmRUNsYXNzLCBNT0RVTEVfUkVGX19FQVJfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobW9kdWxlUmVmRUNsYXNzLCBNT0RVTEVfUkVGX19NT0RVTEUpOwotCi0JCWVqYk1vZHVsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTU9EVUxFX1JFRik7Ci0KLQkJd2ViTW9kdWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9NT0RVTEVfUkVGKTsKLQotCQljbGllbnRNb2R1bGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0xJRU5UX01PRFVMRV9SRUYpOwotCi0JCWNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05ORUNUT1JfTU9EVUxFX1JFRik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJTG9vc2Vjb25maWdQYWNrYWdlSW1wbCB0aGVMb29zZWNvbmZpZ1BhY2thZ2UgPSAoTG9vc2Vjb25maWdQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VicGFja2FnZXMKLQkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZUxvb3NlY29uZmlnUGFja2FnZSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlhcmNoaXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGFpbmVyKCkpOwotCQllamJKYXJGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlRmlsZSgpKTsKLQkJd2FyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCWVhckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQlhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQltb2R1bGVGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QXJjaGl2ZSgpKTsKLQkJY29udGFpbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmlsZSgpKTsKLQkJcmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250YWluZXIoKSk7Ci0JCXJhckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQllamJNb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVSZWYoKSk7Ci0JCXdlYk1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKLQkJY2xpZW50TW9kdWxlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlUmVmKCkpOwotCQljb25uZWN0b3JNb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVSZWYoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhmaWxlRUNsYXNzLCBGaWxlLmNsYXNzLCAiRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9VUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIlVSSSIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVfTGFzdE1vZGlmaWVkKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAibGFzdE1vZGlmaWVkIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX1NpemUoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJzaXplIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX0RpcmVjdG9yeUVudHJ5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGlyZWN0b3J5RW50cnkiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVfT3JpZ2luYWxVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm9yaWdpbmFsVVJJIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsZV9Mb2FkaW5nQ29udGFpbmVyKCksIHRoaXMuZ2V0Q29udGFpbmVyKCksIG51bGwsICJsb2FkaW5nQ29udGFpbmVyIiwgbnVsbCwgMSwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsZV9Db250YWluZXIoKSwgdGhpcy5nZXRDb250YWluZXIoKSwgdGhpcy5nZXRDb250YWluZXJfRmlsZXMoKSwgImNvbnRhaW5lciIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcmNoaXZlRUNsYXNzLCBBcmNoaXZlLmNsYXNzLCAiQXJjaGl2ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJjaGl2ZV9UeXBlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZXMiLCBudWxsLCAwLCAtMSwgQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVqYkphckZpbGVFQ2xhc3MsIEVKQkphckZpbGUuY2xhc3MsICJFSkJKYXJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZUVqYlBhY2thZ2UuZ2V0RUpCSmFyKCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIEVKQkphckZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3YXJGaWxlRUNsYXNzLCBXQVJGaWxlLmNsYXNzLCAiV0FSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V0FSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuZ2V0V2ViQXBwKCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIFdBUkZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlYXJGaWxlRUNsYXNzLCBFQVJGaWxlLmNsYXNzLCAiRUFSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUFSRmlsZV9Nb2R1bGVSZWZzKCksIHRoaXMuZ2V0TW9kdWxlUmVmKCksIHRoaXMuZ2V0TW9kdWxlUmVmX0VhckZpbGUoKSwgIm1vZHVsZVJlZnMiLCBudWxsLCAxLCAtMSwgRUFSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UuZ2V0QXBwbGljYXRpb24oKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgRUFSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uQ2xpZW50RmlsZUVDbGFzcywgQXBwbGljYXRpb25DbGllbnRGaWxlLmNsYXNzLCAiQXBwbGljYXRpb25DbGllbnRGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlQ2xpZW50UGFja2FnZS5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBBcHBsaWNhdGlvbkNsaWVudEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtb2R1bGVGaWxlRUNsYXNzLCBNb2R1bGVGaWxlLmNsYXNzLCAiTW9kdWxlRmlsZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29udGFpbmVyRUNsYXNzLCBDb250YWluZXIuY2xhc3MsICJDb250YWluZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyX0ZpbGVzKCksIHRoaXMuZ2V0RmlsZSgpLCB0aGlzLmdldEZpbGVfQ29udGFpbmVyKCksICJmaWxlcyIsIG51bGwsIDAsIC0xLCBDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZWFkT25seURpcmVjdG9yeUVDbGFzcywgUmVhZE9ubHlEaXJlY3RvcnkuY2xhc3MsICJSZWFkT25seURpcmVjdG9yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHJhckZpbGVFQ2xhc3MsIFJBUkZpbGUuY2xhc3MsICJSQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZUpjYVBhY2thZ2UuZ2V0Q29ubmVjdG9yKCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIFJBUkZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtb2R1bGVSZWZFQ2xhc3MsIE1vZHVsZVJlZi5jbGFzcywgIk1vZHVsZVJlZiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNb2R1bGVSZWZfTW9kdWxlRmlsZSgpLCB0aGlzLmdldE1vZHVsZUZpbGUoKSwgbnVsbCwgIm1vZHVsZUZpbGUiLCBudWxsLCAxLCAxLCBNb2R1bGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZVJlZl9FYXJGaWxlKCksIHRoaXMuZ2V0RUFSRmlsZSgpLCB0aGlzLmdldEVBUkZpbGVfTW9kdWxlUmVmcygpLCAiZWFyRmlsZSIsIG51bGwsIDEsIDEsIE1vZHVsZVJlZi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlUmVmX01vZHVsZSgpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UuZ2V0TW9kdWxlKCksIG51bGwsICJtb2R1bGUiLCBudWxsLCAxLCAxLCBNb2R1bGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJNb2R1bGVSZWZFQ2xhc3MsIEVKQk1vZHVsZVJlZi5jbGFzcywgIkVKQk1vZHVsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdlYk1vZHVsZVJlZkVDbGFzcywgV2ViTW9kdWxlUmVmLmNsYXNzLCAiV2ViTW9kdWxlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY2xpZW50TW9kdWxlUmVmRUNsYXNzLCBDbGllbnRNb2R1bGVSZWYuY2xhc3MsICJDbGllbnRNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjb25uZWN0b3JNb2R1bGVSZWZFQ2xhc3MsIENvbm5lY3Rvck1vZHVsZVJlZi5jbGFzcywgIkNvbm5lY3Rvck1vZHVsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjUzZDZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIENvbm5lY3Rvck1vZHVsZVJlZkltcGwgZXh0ZW5kcyBNb2R1bGVSZWZJbXBsIGltcGxlbWVudHMgQ29ubmVjdG9yTW9kdWxlUmVmLCBNb2R1bGVSZWYgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3JNb2R1bGVSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUywgRUFSRmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNb2R1bGVGaWxlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TW9kdWxlRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZHVsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlzZXRFYXJGaWxlKChFQVJGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlzZXRFYXJGaWxlKChFQVJGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlyZXR1cm4gbW9kdWxlRmlsZSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEVhckZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXJldHVybiBtb2R1bGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlyZXR1cm4gKENvbm5lY3RvcikgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzQ29ubmVjdG9yKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RvcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19IC8vQ29ubmVjdG9yTW9kdWxlUmVmSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db250YWluZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjYTg0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250YWluZXJJbXBsIGV4dGVuZHMgRmlsZUltcGwgaW1wbGVtZW50cyBDb250YWluZXIgewotCi0KLQkvKioKLQkgKiBJbm5lciBjbGFzcyB3aGljaCBtYWludGFpbnMgdGhlIGluZGV4IGZvciB0aGUgZG9tYWluJ3MgY29sbGVjdGlvbiBvZiBub2RlcyBrZXllZCBieSBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBGaWxlTm90aWZpY2F0aW9uQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuICh0eXBlID09ICJGaWxlTm90aWZpY2F0aW9uQWRhcHRlciIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEluZGV4ZWRGaWxlKFN0cmluZyBuZXdWYWx1ZSwgTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJCWZpbGVJbmRleC5wdXQobmV3VmFsdWUsIG5vdGlmaWVyKTsKLQkJCWlmIChub3RpZmllci5lQWRhcHRlcnMoKSA9PSBudWxsIHx8ICFub3RpZmllci5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLQkJCQlub3RpZmllci5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVJbmRleGVkRmlsZShTdHJpbmcgb2xkVmFsdWUsIE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCQlmaWxlSW5kZXgucmVtb3ZlKG9sZFZhbHVlKTsKLQkJCW5vdGlmaWVyLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKGZpbGVJbmRleCA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvL0lmIHRoZSBuYW1lIGNoYW5nZWQsIHVwZGF0ZSB0aGUgaW5kZXgKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpLmVxdWFscyhDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsZV9VUkkoKSkgJiYgKChGaWxlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkuZ2V0Q29udGFpbmVyKCkgPT0gQ29udGFpbmVySW1wbC50aGlzKSB7Ci0JCQkJZmlsZUluZGV4LnJlbW92ZShub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJZmlsZUluZGV4LnB1dChub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJfQotCQkJLy9IYW5kbGUgYWRkcyBhbmQgcmVtb3ZlcwotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkuZXF1YWxzKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJfRmlsZXMoKSkgJiYgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgPT0gQ29udGFpbmVySW1wbC50aGlzKSB7Ci0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDogewotCQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQkJYWRkSW5kZXhlZEZpbGUoZmlsZS5nZXRVUkkoKSwgZmlsZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOiB7Ci0JCQkJCQlyZW1vdmVJbmRleGVkRmlsZSgoKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKS5nZXRVUkkoKSwgKEZpbGUpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDogewotCQkJCQkJZmlsZXNBZGRlZCgoTGlzdCkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOiB7Ci0JCQkJCQlmaWxlc1JlbW92ZWQoKExpc3QpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkUgOiB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQgOiB7Ci0JCQkJCQlpZiAobm90aWZpY2F0aW9uLmdldFBvc2l0aW9uKCkgIT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKSB7IC8vVGhpcyBpcyBub3cgYQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyByZXBsYWNlIGluCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1PRjIKLQkJCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQkJcmVtb3ZlSW5kZXhlZEZpbGUoKChGaWxlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkuZ2V0VVJJKCksIChGaWxlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQkJYWRkSW5kZXhlZEZpbGUoZmlsZS5nZXRVUkkoKSwgZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZpbGVzQWRkZWQoTGlzdCBuZXdGaWxlcykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBuZXdGaWxlcy5nZXQoaSk7Ci0JCQkJYWRkSW5kZXhlZEZpbGUoZmlsZS5nZXRVUkkoKSwgZmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmaWxlc1JlbW92ZWQoTGlzdCBvbGRGaWxlcykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBvbGRGaWxlcy5nZXQoaSk7Ci0JCQkJcmVtb3ZlSW5kZXhlZEZpbGUoZmlsZS5nZXRVUkkoKSwgZmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWJ1aWxkRmlsZUluZGV4KCkgewotCQkJcmVtb3ZlQWRhcHRlcnNJZk5lY2Vzc2FyeSgpOwotCQkJZmlsZUluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJLy8gSWYgdGhlIHByaW1hcnkgY29sbGVjdGlvbiBhbHJlYWR5IGhhcyBlbGVtZW50cywKLQkJCS8vJ3JlZmxlY3QgdGhlbSBpbiB0aGUgaW5kZXguLi4KLQkJCWlmIChnZXRGaWxlcygpLnNpemUoKSA+IDApIHsKLQkJCQlJdGVyYXRvciBpID0gZ2V0RmlsZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgaS5uZXh0KCk7Ci0JCQkJCWFkZEluZGV4ZWRGaWxlKGZpbGUuZ2V0VVJJKCksIGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFkYXB0ZXJzSWZOZWNlc3NhcnkoKSB7Ci0JCQlpZiAoZmlsZUluZGV4ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSXRlcmF0b3IgaXRlciA9IGZpbGVJbmRleC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBpdGVyLm5leHQoKTsKLQkJCQlhRmlsZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogSW1wbGVtZW50ZXIgZm9yIGxvYWRpbmcgZW50cmllcyBpbiB0aGlzIGNvbnRhaW5lciAqLwotCXByb3RlY3RlZCBMb2FkU3RyYXRlZ3kgbG9hZFN0cmF0ZWd5OwotCS8qKgotCSAqIEluZGV4IHRvIHByb3ZpZGUgZmFzdCBsb29rdXAgYnkgbmFtZSBvZiBmaWxlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGZpbGVJbmRleDsKLQkvKioKLQkgKiBBbiBhZGFwdGVyIHdoaWNoIG1haW50YWlucyB0aGUgZmlsZSBpbmRleAotCSAqLwotCXByb3RlY3RlZCBGaWxlTm90aWZpY2F0aW9uQWRhcHRlciBmaWxlSW5kZXhBZGFwdGVyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmaWxlcyA9IG51bGw7Ci0KLQlwdWJsaWMgQ29udGFpbmVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpbGUoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7Ci0JCVN0cmluZyBrZXkgPSBhVXJpLnN0YXJ0c1dpdGgoIi8iKSA/IEFyY2hpdmVVdGlsLnRydW5jYXRlRnJvbUZyb250SWdub3JlQ2FzZShhVXJpLCAiLyIpIDogYVVyaTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNJbmRleGVkKCkpCi0JCQlyZXR1cm4gZ2V0RmlsZUluZGV4KCkuY29udGFpbnNLZXkoa2V5KTsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmNvbnRhaW5zKGtleSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQ29udGFpbmVyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEZpbGUoU3RyaW5nIFVSSSkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0luZGV4ZWQoKSkgewotCQkJZ2V0RmlsZXMoKTsKLQkJfQotCQlGaWxlIGZpbGUgPSAoRmlsZSkgZ2V0RmlsZUluZGV4KCkuZ2V0KFVSSSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbihVUkkpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA1LzAwIDc6MjA6MjEgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5NYXAgZ2V0RmlsZUluZGV4KCkgewotCQlpZiAoZmlsZUluZGV4ID09IG51bGwpCi0JCQlnZXRGaWxlSW5kZXhBZGFwdGVyKCkucmVidWlsZEZpbGVJbmRleCgpOwotCQlyZXR1cm4gZmlsZUluZGV4OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA1LzAwIDc6MjA6MjEgUE0pCi0JICogCi0JICogQHJldHVybiBGaWxlTm90aWZpY2F0aW9uQWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCBGaWxlTm90aWZpY2F0aW9uQWRhcHRlciBnZXRGaWxlSW5kZXhBZGFwdGVyKCkgewotCQlpZiAoZmlsZUluZGV4QWRhcHRlciA9PSBudWxsKSB7Ci0JCQlmaWxlSW5kZXhBZGFwdGVyID0gbmV3IEZpbGVOb3RpZmljYXRpb25BZGFwdGVyKCk7Ci0JCQllQWRhcHRlcnMoKS5hZGQoZmlsZUluZGV4QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIGZpbGVJbmRleEFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogTGlzdCBpcyBidWlsdCBvbiBkZW1hbmQsIGJ5IHJlcXVlc3RpbmcgZnJvbSB0aGUgbG9hZCBzdHJhdGVneS4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RmlsZXMoKSB7Ci0JCUVMaXN0IGZpbGVzTGlzdCA9IHRoaXMuZ2V0RmlsZXNHZW4oKTsKLQkJaWYgKCFpc0luZGV4ZWQoKSkgewotCQkJaWYgKGZpbGVzTGlzdC5pc0VtcHR5KCkgJiYgZ2V0TG9hZFN0cmF0ZWd5KCkgIT0gbnVsbCkgewotCQkJCWZpbGVzTGlzdC5hZGRBbGwoZ2V0TG9hZFN0cmF0ZWd5KCkuY29sbGVjdEZpbGVzKCkpOwotCQkJfQotCQkJLy9DYXVzZXMgdGhlIGluZGV4IHRvIGJlIGJ1aWx0Ci0JCQlnZXRGaWxlSW5kZXgoKTsKLQkJfQotCQlyZXR1cm4gZmlsZXNMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlIExvb2tzIGZvciBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gdXJpLCBhbmQgcmV0dXJucyBhbgotCSAqICAgICAgaW5wdXQgc3RyZWFtOyBvcHRpbWl6YXRpb246IGlmIHRoZSBmaWxlIGxpc3QgaGFzIG5vdCBiZWVuIGJ1aWx0LCBnb2VzIGRpcmVjdGx5IHRvIHRoZQotCSAqICAgICAgbG9hZFN0cmF0ZWd5LgotCSAqLwotCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcgYVVyaSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlzSW5kZXhlZCgpKSB7Ci0JCQlyZXR1cm4gZ2V0RmlsZShhVXJpKS5nZXRJbnB1dFN0cmVhbSgpOwotCQl9Ci0JCXJldHVybiBwcmltR2V0SW5wdXRTdHJlYW0oYVVyaSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBnZXRMb2FkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBsb2FkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5kZXhlZCgpIHsKLQkJcmV0dXJuIGZpbGVJbmRleCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlIEdvZXMgZGlyZWN0bHkgdG8gdGhlIGxvYWRTdHJhdGVneS4KLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBwcmltR2V0SW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZyBhVXJpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0SW5wdXRTdHJlYW0oYVVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVidWlsZEZpbGVJbmRleCgpIHsKLQkJZ2V0RmlsZUluZGV4QWRhcHRlcigpLnJlYnVpbGRGaWxlSW5kZXgoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdMb2FkU3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneSBuZXdMb2FkU3RyYXRlZ3kpIHsKLQotCQlpZiAobmV3TG9hZFN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCW5ld0xvYWRTdHJhdGVneS5zZXRDb250YWluZXIodGhpcyk7Ci0JCQlpZiAobG9hZFN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQluZXdMb2FkU3RyYXRlZ3kuc2V0UmVuZGVyZXJUeXBlKGxvYWRTdHJhdGVneS5nZXRSZW5kZXJlclR5cGUoKSk7Ci0JCQkJbmV3TG9hZFN0cmF0ZWd5LnNldFJlYWRPbmx5KGxvYWRTdHJhdGVneS5pc1JlYWRPbmx5KCkpOwotCQkJCWxvYWRTdHJhdGVneS5zZXRDb250YWluZXIobnVsbCk7Ci0JCQkJbG9hZFN0cmF0ZWd5LmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJbG9hZFN0cmF0ZWd5ID0gbmV3TG9hZFN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpbGVzR2VuKCkgewotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJZmlsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChGaWxlLmNsYXNzLCB0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTLCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIpOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0NPTlRBSU5FUjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fVVJJOgotCQkJCXJldHVybiBnZXRVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fU0laRToKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0U2l6ZSgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzRGlyZWN0b3J5RW50cnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBnZXRPcmlnaW5hbFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCXJldHVybiBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgotCQkJCXJldHVybiBnZXRGaWxlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fVVJJOgotCQkJCXNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fTEFTVF9NT0RJRklFRDoKLQkJCQlzZXRMYXN0TW9kaWZpZWQoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXNldERpcmVjdG9yeUVudHJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fVVJJOgotCQkJCXNldFVSSShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19MQVNUX01PRElGSUVEOgotCQkJCXVuc2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX1NJWkU6Ci0JCQkJdW5zZXRTaXplKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQl1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSShPUklHSU5BTF9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fU0laRToKLQkJCQlyZXR1cm4gaXNTZXRTaXplKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBPUklHSU5BTF9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG9yaWdpbmFsVVJJICE9IG51bGwgOiAhT1JJR0lOQUxfVVJJX0VERUZBVUxULmVxdWFscyhvcmlnaW5hbFVSSSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXIgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6Ci0JCQkJcmV0dXJuIGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJGaWxlcygpIHsKLQkJYm9vbGVhbiBvbGREZWxpdmVyeSA9IGVEZWxpdmVyKCk7Ci0JCWZpbGVzLmNsZWFyKCk7Ci0JCWVTZXREZWxpdmVyKG9sZERlbGl2ZXJ5KTsKLQkJaWYgKGlzSW5kZXhlZCgpKSB7Ci0JCQllQWRhcHRlcnMoKS5yZW1vdmUoZmlsZUluZGV4QWRhcHRlcik7Ci0JCQlmaWxlSW5kZXhBZGFwdGVyID0gbnVsbDsKLQkJCWZpbGVJbmRleCA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VBUkZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjZlNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FQVJGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkFwcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJGaWxlSW1wbCBleHRlbmRzIE1vZHVsZUZpbGVJbXBsIGltcGxlbWVudHMgRUFSRmlsZSB7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbDsgY2xpZW50cyBzaG91bGQgdXNlIHtAbGluayAjZ2V0TW9kdWxlUmVmKE1vZHVsZSl9Ci0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZShNb2R1bGUgbW9kdWxlRGVzY3JpcHRvcikgewotCQlNb2R1bGVSZWYgcmVmID0gZ2V0TW9kdWxlUmVmKG1vZHVsZURlc2NyaXB0b3IpOwotCQlyZXR1cm4gKHJlZiA9PSBudWxsKSA/IG51bGwgOiByZWYuZ2V0TW9kdWxlRmlsZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUgYWRkQ29weShNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJT2JqZWN0IHJlc3VsdCA9IHByaW1BZGRDb3B5UmVmKGFNb2R1bGVGaWxlKTsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE1vZHVsZVJlZikKLQkJCXJldHVybiAoKE1vZHVsZVJlZikgcmVzdWx0KS5nZXRNb2R1bGVGaWxlKCk7Ci0KLQkJcmV0dXJuIChNb2R1bGVGaWxlKSByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGRlcGxveW1lbnREZXNjcmlwdG9yID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbW9kdWxlUmVmcyA9IG51bGw7Ci0KLQlwdWJsaWMgRUFSRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVBUkZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBhZGRDb3B5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3Mgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChhbkFyY2hpdmUuaXNNb2R1bGVGaWxlKCkpCi0JCQlyZXR1cm4gYWRkQ29weSgoTW9kdWxlRmlsZSkgYW5BcmNoaXZlKTsKLQkJQXJjaGl2ZSBjb3B5ID0gc3VwZXIuYWRkQ29weShhbkFyY2hpdmUpOwotCQljb3B5LmluaXRpYWxpemVDbGFzc0xvYWRlcigpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHByaW1BZGRDb3B5UmVmKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQkvL2ZvcmNlIHRoaXMgbGlzdCB0byBnZXQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBhZGQKLQkJRUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQotCQlpZiAoYU1vZHVsZUZpbGUuaXNFQVJGaWxlKCkpCi0JCQkvL0lmIGl0J3MgYW4gZWFyIHRoZW4ganVzdCB0cmVhdCBpdCBsaWtlIGFueSBvdGhlciBhcmNoaXZlCi0JCQlyZXR1cm4gKE1vZHVsZUZpbGUpIHN1cGVyLmFkZENvcHkoYU1vZHVsZUZpbGUpOwotCQljaGVja0FkZFZhbGlkKGFNb2R1bGVGaWxlKTsKLQkJTW9kdWxlRmlsZSBjb3B5ID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jb3B5KGFNb2R1bGVGaWxlKTsKLQkJTW9kdWxlIG5ld01vZHVsZSA9IGNyZWF0ZU1vZHVsZUZvckNvcHlpbmcoYU1vZHVsZUZpbGUpOwotCQlnZXRGaWxlcygpLmFkZChjb3B5KTsKLQkJY29weS5pbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQkJaWYgKCFjb3B5LmdldFVSSSgpLmVxdWFscyhuZXdNb2R1bGUuZ2V0VXJpKCkpKQotCQkJY29weS5zZXRVUkkobmV3TW9kdWxlLmdldFVyaSgpKTsKLQotCQlnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5hZGQobmV3TW9kdWxlKTsKLQkJTW9kdWxlUmVmIGFSZWYgPSBjcmVhdGVNb2R1bGVSZWYobmV3TW9kdWxlLCBjb3B5KTsKLQkJcmVmcy5hZGQoYVJlZik7Ci0JCXJldHVybiBhUmVmOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIE1vZHVsZVJlZiBhZGRDb3B5UmVmKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlPYmplY3QgcmVzdWx0ID0gcHJpbUFkZENvcHlSZWYoYU1vZHVsZUZpbGUpOwotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTW9kdWxlUmVmKQotCQkJcmV0dXJuIChNb2R1bGVSZWYpIHJlc3VsdDsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlIGFkZENvcHkoU2VjdXJpdHlSb2xlIGFSb2xlLCBNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCUVPYmplY3QgZGQgPSBudWxsOwotCQl0cnkgewotCQkJZGQgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihhTW9kdWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImRkX2luX2Vhcl9sb2FkX0VYQ18iLCAobmV3IE9iamVjdFtde2FNb2R1bGUuZ2V0VXJpKCksIGdldFVSSSgpfSkpLCBlKTsgLy8kTk9OLU5MUy0xJCA9ICJFeGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIG1vZHVsZSAiezB9IiBpbiBlYXIgZmlsZSAiezF9IiIKLQkJfQotCQlTdHJpbmcgcm9sZU5hbWUgPSBhUm9sZS5nZXRSb2xlTmFtZSgpOwotCQlTZWN1cml0eVJvbGUgY29weSA9IChTZWN1cml0eVJvbGUpIEV0b29sc0NvcHlVdGlsaXR5LmNyZWF0ZUNvcHkoYVJvbGUpOwotCQlpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0JCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcikgZGQ7Ci0JCQlpZiAoZWpiSmFyLmNvbnRhaW5zU2VjdXJpdHlSb2xlKHJvbGVOYW1lKSkKLQkJCQl0aHJvdyBuZXcgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkdXBfc2VjX3JvbGVfbW9kdWxlX0VYQ18iLCAobmV3IE9iamVjdFtde2FNb2R1bGUuZ2V0VXJpKCksIHJvbGVOYW1lfSkpLCBlamJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkuZ2V0U2VjdXJpdHlSb2xlTmFtZWQocm9sZU5hbWUpKTsgLy8kTk9OLU5MUy0xJCA9ICJEZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHswfSBhbHJlYWR5IGNvbnRhaW5zIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MX0iCi0JCQlnZXRBc3NlbWJseURlc2NyaXB0b3JBZGRJZk5lY2Vzc2FyeShlamJKYXIpLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoY29weSk7Ci0JCX0gZWxzZSBpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKSB7Ci0JCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgZGQ7Ci0JCQlpZiAod2ViQXBwLmNvbnRhaW5zU2VjdXJpdHlSb2xlKHJvbGVOYW1lKSkKLQkJCQl0aHJvdyBuZXcgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkdXBfc2VjX3JvbGVfbW9kdWxlX0VYQ18iLCAobmV3IE9iamVjdFtde2FNb2R1bGUuZ2V0VXJpKCksIHJvbGVOYW1lfSkpLCB3ZWJBcHAuZ2V0U2VjdXJpdHlSb2xlTmFtZWQocm9sZU5hbWUpKTsvLyROT04tTkxTLTEkID0gIkRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgezB9IGFscmVhZHkgY29udGFpbnMgYSBzZWN1cml0eSByb2xlIG5hbWVkIHsxfSIKLQkJCXdlYkFwcC5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKGNvcHkpOwotCQl9Ci0JCWFkZENvcHlJZk5vdEV4aXN0cyhhUm9sZSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZSBhZGRDb3B5SWZOb3RFeGlzdHMoU2VjdXJpdHlSb2xlIGFSb2xlKSB7Ci0JCUFwcGxpY2F0aW9uIGRkID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJU2VjdXJpdHlSb2xlIGNvcHkgPSBudWxsOwotCQlpZiAoIWRkLmNvbnRhaW5zU2VjdXJpdHlSb2xlKGFSb2xlLmdldFJvbGVOYW1lKCkpKSB7Ci0JCQljb3B5ID0gKFNlY3VyaXR5Um9sZSkgRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weShhUm9sZSk7Ci0JCQlkZC5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKGNvcHkpOwotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRHVwbGljYXRlKFN0cmluZyBhVXJpKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGlzRHVwbGljYXRlKGFVcmkpKQotCQkJdGhyb3cgbmV3IER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZHVwX3Jlc291cmNlX0VYQ18iLCAobmV3IE9iamVjdFtde2FVcmksIGdldFVSSSgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXNvdXJjZSBuYW1lZCAiezB9IiBhbHJlYWR5IGV4aXN0cyBpbiBhcmNoaXZlICJ7MX0iIgotCX0KLQotCi0JcHJvdGVjdGVkIE1vZHVsZSBjcmVhdGVNb2R1bGVGb3JDb3B5aW5nKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJTW9kdWxlIGFNb2R1bGUgPSBudWxsOwotCQlpZiAoYU1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCWFNb2R1bGUgPSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVXZWJNb2R1bGUoKTsKLQkJfSBlbHNlIGlmIChhTW9kdWxlRmlsZS5pc0VKQkphckZpbGUoKSkgewotCQkJYU1vZHVsZSA9IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZUVqYk1vZHVsZSgpOwotCQl9IGVsc2UgaWYgKGFNb2R1bGVGaWxlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpIHsKLQkJCWFNb2R1bGUgPSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCk7Ci0JCX0gZWxzZSBpZiAoYU1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpIHsKLQkJCWFNb2R1bGUgPSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKLQkJfQotCQlhTW9kdWxlLnNldFVyaShhTW9kdWxlRmlsZS5nZXRVUkkoKSk7Ci0JCXJldHVybiBhTW9kdWxlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3QgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFRha2VzIGludG8gYWNjb3VudAotCSAqIGFsdEREIGluZGlyZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gT25seSByZXR1cm4gbnVsbCBpZiBhbiBhbHRERCBpcyBub3QgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRBbHREZXBsb3ltZW50RGVzY3JpcHRvcihNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJLy8gTG9vayBmb3IgYWx0REQKLQkJU3RyaW5nIGFsdEREID0gYU1vZHVsZS5nZXRBbHRERCgpOwotCQlpZiAoQXJjaGl2ZVV0aWwuaXNOdWxsT3JFbXB0eShhbHRERCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFpc01vZlJlc291cmNlTG9hZGVkKGFsdERELnRyaW0oKSkpCi0JCQlyZWdpc3RlclJlc291cmNlRmFjdG9yeShhTW9kdWxlLCBhbHRERCk7Ci0JCVhNTFJlc291cmNlIGRkUmVzID0gKFhNTFJlc291cmNlKSBnZXRNb2ZSZXNvdXJjZShhbHRERC50cmltKCkpOwotCQlpZiAoIWRkUmVzLmlzQWx0KCkpIHsKLQkJCWRkUmVzLnNldElzQWx0KHRydWUpOwotCQkJZGRSZXMuc2V0QXBwbGljYXRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7Ci0JCX0KLQkJcmV0dXJuIEFyY2hpdmVVdGlsLmdldFJvb3QoZGRSZXMpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlcygpIHsKLQkJTGlzdCBjbGllbnRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZUxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpIHsKLQkJCQljbGllbnRGaWxlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbGllbnRGaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoQXBwbGljYXRpb25QYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkpLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yQWRkSWZOZWNlc3NhcnkoRUpCSmFyIGVqYkphcikgewotCQlBc3NlbWJseURlc2NyaXB0b3IgYWQgPSBlamJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWlmIChhZCA9PSBudWxsKSB7Ci0JCQlhZCA9ICgoRWpiUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJZWpiSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihhZCk7Ci0JCX0KLQkJcmV0dXJuIGFkOwotCX0KLQotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlBcHBsaWNhdGlvbiBkZCA9IHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQkJaWYgKGRkID09IG51bGwgJiYgY2FuTGF6eUluaXRpYWxpemUoKSkgewotCQkJdHJ5IHsKLQkJCQlnZXRJbXBvcnRTdHJhdGVneSgpLmltcG9ydE1ldGFEYXRhKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBUYWtlcyBpbnRvIGFjY291bnQKLQkgKiBhbHRERCBpbmRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGdldERlcGxveW1lbnREZXNjcmlwdG9yKENvbm5lY3Rvck1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlyZXR1cm4gKENvbm5lY3RvcikgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKE1vZHVsZSkgYU1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gVGFrZXMgaW50byBhY2NvdW50Ci0JICogYWx0REQgaW5kaXJlY3Rpb24uCi0JICovCi0JcHVibGljIEVKQkphciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihFamJNb2R1bGUgYU1vZHVsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChFSkJKYXIpIGdldERlcGxveW1lbnREZXNjcmlwdG9yKChNb2R1bGUpIGFNb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3QgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFRha2VzIGludG8gYWNjb3VudAotCSAqIGFsdEREIGluZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXREZXBsb3ltZW50RGVzY3JpcHRvcihKYXZhQ2xpZW50TW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpIGdldERlcGxveW1lbnREZXNjcmlwdG9yKChNb2R1bGUpIGFNb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3QgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFRha2VzIGludG8gYWNjb3VudAotCSAqIGFsdEREIGluZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yKE1vZHVsZSBhTW9kdWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlFT2JqZWN0IGRkID0gZ2V0QWx0RGVwbG95bWVudERlc2NyaXB0b3IoYU1vZHVsZSk7Ci0JCWlmIChkZCA9PSBudWxsKQotCQkJZGQgPSBnZXRNb2R1bGVGaWxlKGFNb2R1bGUpLmdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJcmV0dXJuIGRkOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3QgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFRha2VzIGludG8gYWNjb3VudAotCSAqIGFsdEREIGluZGlyZWN0aW9uLgotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoV2ViTW9kdWxlIGFNb2R1bGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoV2ViQXBwKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoTW9kdWxlKSBhTW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RUpCSmFyRmlsZXMoKSB7Ci0JCUxpc3QgZWpiSmFyRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc0VKQkphckZpbGUoKSkgewotCQkJCWVqYkphckZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVqYkphckZpbGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlCi0JICogcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICogUmV0dXJucyB0aGUgZmlyc3QgaGl0IGZvdW5kOyBhc3N1bXB0aW9uIHRoYXQgdGhlIGVqYiBuYW1lcyBhcmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlCi0JICogZWFyIGZpbGUuIFRoaXMgd2lsbCBsaWtlbHkgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciB3YXkgZm9yIGRlcmVmZXJlbmNpbmcgZWpiIHJlZnMuCi0JICogCi0JICogQ2FuIGJlIHVzZWQgd2l0aCBlamIgMS4xIHJlZmVyZW5jZXMgb25seS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB7QGxpbmsjZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoRWpiUmVmIHJlZiwgU3RyaW5nIG1vZHVsZVVyaSApCi0JICogQHBhcmFtIEVqYlJlZgotCSAqICAgICAgICAgICAgcmVmIC0gQW4gZWpiIHJlZmVyZW5jZQotCSAqIEByZXR1cm4gRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoRWpiUmVmIHJlZikgewotCQlTdHJpbmcgbGluayA9IHJlZi5nZXRMaW5rKCk7Ci0JCWlmIChsaW5rID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3QgamFyRmlsZXMgPSBnZXRFSkJKYXJGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphckZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKChFSkJKYXJGaWxlKSBqYXJGaWxlcy5nZXQoaSkpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChsaW5rKTsKLQkJCWlmIChiZWFuICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gYmVhbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZWQgYnkgdGhlIEVqYlJlZiwgaWYgb25lIGV4aXN0cy4gVGhlIGVqYi1saW5rIHZhbHVlIG9mIHRoZQotCSAqIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsgb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGhpdCBmb3VuZDsgYXNzdW1wdGlvbiB0aGF0IHRoZSBlamIgbmFtZXMgYXJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZQotCSAqIGVhciBmaWxlLiBUaGlzIHdpbGwgbGlrZWx5IGJlIHJlcGxhY2VkIHdpdGggYSBiZXR0ZXIgd2F5IGZvciBkZXJlZmVyZW5jaW5nIGVqYiByZWZzCi0JICogCi0JICogQ2FuIGJlIHVzZWQgd2l0aCBlamIgMS4xICYgZWpiIDIuMCByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBFamJSZWYKLQkgKiAgICAgICAgICAgIHJlZiAtIEFuIGVqYiByZWZlcmVuY2UKLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBtb2R1bGVVcmkgLSBUaGUgbW9kdWxlIHVyaQotCSAqIEByZXR1cm4gRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoRWpiUmVmIHJlZiwgU3RyaW5nIG1vZHVsZVVyaSkgewotCQlTdHJpbmcgbGluayA9IHJlZi5nZXRMaW5rKCk7Ci0JCWlmIChsaW5rID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ly8gaWYKLQotCQlpZiAobGluay5pbmRleE9mKCcjJykgPT0gLTEpIHsKLQkJCUVudGVycHJpc2VCZWFuIGxpbmtlZEVKQiA9IG51bGw7Ci0JCQlYTUxSZXNvdXJjZSByZXMgPSAoWE1MUmVzb3VyY2UpIHJlZi5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBFSkJSZXNvdXJjZSkgewotCQkJCS8vTXVzdCBiZSBpbiBhbiBFSkIgSkFSIHRvIGJlIGhlcmUKLQkJCQlFSkJKYXIgamFyID0gKChFSkJSZXNvdXJjZSkgcmVzKS5nZXRFSkJKYXIoKTsKLQkJCQlpZiAoamFyICE9IG51bGwpCi0JCQkJCWxpbmtlZEVKQiA9IGphci5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihyZWYpOwotCQkJfQotCQkJaWYgKGxpbmtlZEVKQiA9PSBudWxsKSB7Ci0JCQkJTGlzdCBqYXJGaWxlcyA9IGdldEVKQkphckZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCQlsaW5rZWRFSkIgPSAoKEVKQkphckZpbGUpIGphckZpbGVzLmdldChpKSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRFbnRlcnByaXNlQmVhbk5hbWVkKGxpbmspOwotCQkJCQlpZiAobGlua2VkRUpCICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBsaW5rZWRFSkI7Ci0JCQkJCX0vLyBpZgotCQkJCX0vLyBmb3IKLQkJCX0gZWxzZQotCQkJCXJldHVybiBsaW5rZWRFSkI7Ci0JCX0gZWxzZSB7Ci0JCQkvL0dyYWIgdGhlIGVqYiBuYW1lIGFuZCBlamIgamFyIG5hbWUgZnJvbSB0aGUgbGluawotCQkJU3RyaW5nIGVqYkJlYW5OYW1lID0gbGluay5zdWJzdHJpbmcobGluay5pbmRleE9mKCIjIikgKyAxLCBsaW5rLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVqYkphck5hbWUgPSBsaW5rLnN1YnN0cmluZygwLCBsaW5rLmluZGV4T2YoIiMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGVqYkJlYW5OYW1lICE9IG51bGwgJiYgZWpiSmFyTmFtZSAhPSBudWxsKSB7Ci0JCQkJLy9HZXQgdGhlIHVyaSBvZiB0aGUgamFyIG5hbWUuCi0JCQkJU3RyaW5nIGVqYkphclVyaSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKGVqYkphck5hbWUsIG1vZHVsZVVyaSk7Ci0JCQkJaWYgKGVqYkphclVyaSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvL0dldCB0aGUgYWN0dWFsIGphciBmaWxlCi0JCQkJCQlGaWxlIGFGaWxlID0gZ2V0RmlsZShlamJKYXJVcmkpOwotCQkJCQkJaWYgKGFGaWxlID09IG51bGwgfHwgIWFGaWxlLmlzRUpCSmFyRmlsZSgpKQotCQkJCQkJCXJldHVybiBudWxsOwotCi0JCQkJCQlFSkJKYXJGaWxlIGphckZpbGUgPSAoRUpCSmFyRmlsZSkgZ2V0RmlsZShlamJKYXJVcmkpOwotCQkJCQkJTGlzdCBlamJzID0gamFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQkJCQkJLy9DaGVjayBpZiBhbnkgb2YgdGhlIGJlYW5zIGluIHRoZSBsaXN0IG1hdGNoIHRoZSBnaXZlbiBlamIgYmVhbiBuYW1lIGdpdmUKLQkJCQkJCS8vIGluCi0JCQkJCQkvL3RoZSBsaW5rCi0JCQkJCQlpZiAoZWpicyAhPSBudWxsICYmICFlamJzLmlzRW1wdHkoKSkgewotCQkJCQkJCUl0ZXJhdG9yIGl0ID0gZWpicy5pdGVyYXRvcigpOwotCQkJCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiA9IChFbnRlcnByaXNlQmVhbikgaXQubmV4dCgpOwotCQkJCQkJCQlpZiAoZWpiQmVhbiAhPSBudWxsICYmIGVqYkJlYW4uZ2V0TmFtZSgpLmVxdWFscyhlamJCZWFuTmFtZSkpIHsKLQkJCQkJCQkJCXJldHVybiBlamJCZWFuOwotCQkJCQkJCQl9Ly8gaWYKLQkJCQkJCQl9Ly8gd2hpbGUKLQkJCQkJCX0vLyBpZgotCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZmUpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ly8gdHJ5Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gaWYKLQkJfS8vIGlmCi0JCXJldHVybiBudWxsOwotCX0vLyBnZXRFbnRlcnBpc2VCZWFuRnJvbVJlZgotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgYVVyaSwgU3RyaW5nIGFsdEREKSB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZShhVXJpLCBhbHRERCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlUmVmIGdldE1vZHVsZVJlZihNb2R1bGUgbW9kdWxlRGVzY3JpcHRvcikgewotCQlMaXN0IHJlZnMgPSBnZXRNb2R1bGVSZWZzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlUmVmIHJlZiA9IChNb2R1bGVSZWYpIHJlZnMuZ2V0KGkpOwotCQkJaWYgKHJlZi5nZXRNb2R1bGUoKSA9PSBtb2R1bGVEZXNjcmlwdG9yKQotCQkJCXJldHVybiByZWY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsdGVyZWQgbGlzdCBvZiB0aGUgYXJjaGl2ZXMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2R1bGVGaWxlcygpIHsKLQkJTGlzdCBtb2R1bGVGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IGdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZUxpc3QuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmlzTW9kdWxlRmlsZSgpKSB7Ci0JCQkJbW9kdWxlRmlsZXMuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kdWxlRmlsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmVPcHRpb25zIGdldE9wdGlvbnNGb3JPcGVuaW5nKFN0cmluZyBhVXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCUxvYWRTdHJhdGVneSBzdHJhdGVneSA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQ2hpbGRMb2FkU3RyYXRlZ3koYVVyaSwgZ2V0TG9hZFN0cmF0ZWd5KCkpOwotCQlyZXR1cm4gZ2V0T3B0aW9ucygpLmNsb25lV2l0aChzdHJhdGVneSwgYVVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmVPcHRpb25zIGdldE9wdGlvbnNGb3JPcGVuaW5nKExvb3NlQXJjaGl2ZSBsb29zZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbnsKLQkJaWYobG9vc2UuZ2V0QmluYXJpZXNQYXRoKCkgPT0gbnVsbCl7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9wZW5fbmVzdGVkX0VYQ18iLCAobmV3IE9iamVjdFtdIHtsb29zZS5nZXRVcmkoKSwgZ2V0VVJJKCl9KSksIG51bGwpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCBvcGVuIHRoZSBuZXN0ZWQgYXJjaGl2ZSAiezB9IiBpbiAiezF9IiIKLQkJfQotCQlMb2FkU3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUxvYWRTdHJhdGVneShsb29zZS5nZXRCaW5hcmllc1BhdGgoKSk7Ci0JCXN0cmF0ZWd5LnNldExvb3NlQXJjaGl2ZShsb29zZSk7Ci0JCXJldHVybiBnZXRPcHRpb25zKCkuY2xvbmVXaXRoKHN0cmF0ZWd5LCBsb29zZS5nZXRVcmkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UkFSRmlsZXMoKSB7Ci0JCUxpc3QgcmFyRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBnZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJCXJhckZpbGVzLmFkZChhRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJhckZpbGVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVzRnJvbUFsbE1vZHVsZXMoKSB7Ci0JCUVMaXN0IHJvbGVMaXN0ID0gbmV3IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0KCk7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IG1vZHVsZXMuc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJRUxpc3Qgcm9sZXMgPSBnZXRSb2xlc0Zyb21Nb2R1bGUoYU1vZHVsZSk7Ci0JCQlmb3IgKGludCBqID0gMCwgbSA9IHJvbGVzLnNpemUoKTsgaiA8IG07IGorKykgewotCQkJCXJvbGVMaXN0LmFkZChyb2xlcy5nZXQoaikpOwotCQkJfQotCQl9Ci0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlc0Zyb21Nb2R1bGUoTW9kdWxlIGFNb2R1bGUpIHsKLQkJRUxpc3Qgcm9sZUxpc3QgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWlmIChhTW9kdWxlLmlzV2ViTW9kdWxlKCkpCi0JCQkJcm9sZUxpc3QgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViTW9kdWxlKSBhTW9kdWxlKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQllbHNlIGlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpCi0JCQkJcm9sZUxpc3QgPSBnZXRBc3NlbWJseURlc2NyaXB0b3JBZGRJZk5lY2Vzc2FyeShnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRWpiTW9kdWxlKSBhTW9kdWxlKSkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZGRfaW5fZWFyX2xvYWRfRVhDXyIsIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgZ2V0VVJJKCl9KSksIGUpOyAvLyROT04tTkxTLTEkID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgbW9kdWxlICJ7MH0iIGluIGVhciBmaWxlICJ7MX0iIgotCQl9Ci0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERlcGxveWVtZW50RGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFdBUkZpbGVzKCkgewotCQlMaXN0IHdhckZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCQl3YXJGaWxlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3YXJGaWxlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWZ0ZXJPcGVuKCkgewotCQlzdXBlci5pbml0aWFsaXplQWZ0ZXJPcGVuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUkZpbGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHN1cGVyIHJldHVybnMgdHJ1ZSwgb3IgcmV0dXJuIHdoZXRoZXIgdGhlIGFwcCBkZCBjb250YWlucyBhIG1vZHVsZSBoYXZpbmcgdGhlCi0JICogdXJpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRBcmNoaXZlKFN0cmluZyBhVXJpKSB7Ci0JCWlmIChzdXBlci5pc05lc3RlZEFyY2hpdmUoYVVyaSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUoYVVyaSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJQXBwbGljYXRpb24gYXBwbCA9ICgoQXBwbGljYXRpb25QYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkpLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0JCXJlc291cmNlLnNldElEKGFwcGwsIEoyRUVDb25zdGFudHMuQVBQTF9JRCk7Ci0JCXNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGFwcGwpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChhcHBsKTsKLQkJcmV0dXJuIGFwcGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJTW9kdWxlIG0gPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKGxvb3NlLmdldFVyaSgpKTsKLQkJaWYgKG0gPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5vcGVuTmVzdGVkQXJjaGl2ZShsb29zZSk7Ci0KLQkJdHJ5IHsKLQkJCUFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zID0gZ2V0T3B0aW9uc0Zvck9wZW5pbmcobG9vc2UpOwotCQkJcmV0dXJuIG9wZW5OZXN0ZWRBcmNoaXZlKG0sIGFyY2hpdmVPcHRpb25zKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJLy9Qcm9iYWJseSB0aGUgZmlsZSBkaWQgbm90IGV4aXN0OyBzaWxlbnRseSBmYWlsLCBwZXIgcmVxdWVzdCBmcm9tIFdTIHJ1bnRpbWUKLQkJCS8vTW9yZSB0aGFuIGxpa2VseSBhIGZhaWx1cmUgaXMgZ29pbmcgdG8gb2NjdXIgZG93biB0aGUgcm9hZCB3aGVuIGEgTW9kdWxlRmlsZSBmb3IgYQotCQkJLy8gTW9kdWxlCi0JCQkvL2luIHRoZSBkZCBpcyByZXF1ZXN0ZWQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBBcmNoaXZlIG9wZW5OZXN0ZWRBcmNoaXZlKFN0cmluZyBhVXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCi0JCU1vZHVsZSBtID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRGaXJzdE1vZHVsZShhVXJpKTsKLQkJaWYgKG0gPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5vcGVuTmVzdGVkQXJjaGl2ZShhVXJpKTsKLQotCQl0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMgPSBnZXRPcHRpb25zRm9yT3BlbmluZyhhVXJpKTsKLQkJCXJldHVybiBvcGVuTmVzdGVkQXJjaGl2ZShtLCBhcmNoaXZlT3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCS8vUHJvYmFibHkgdGhlIGZpbGUgZGlkIG5vdCBleGlzdDsgc2lsZW50bHkgZmFpbCwgcGVyIHJlcXVlc3QgZnJvbSBXUyBydW50aW1lCi0JCQkvL01vcmUgdGhhbiBsaWtlbHkgYSBmYWlsdXJlIGlzIGdvaW5nIHRvIG9jY3VyIGRvd24gdGhlIHJvYWQgd2hlbiBhIE1vZHVsZUZpbGUgZm9yIGEKLQkJCS8vIE1vZHVsZQotCQkJLy9pbiB0aGUgZGQgaXMgcmVxdWVzdGVkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoTW9kdWxlIG0sIEFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgYVVyaSA9IG0uZ2V0VXJpKCk7Ci0KLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBTaW5jZSB3ZSBoYXZlIGEgY2x1ZSBhYm91dCB0aGUgdHlwZSBvZiBhcmNoaXZlIHRvIG9wZW4gVXNlIHRoZSBhcHByb3ByaWF0ZSBvcGVuCi0JCQkgKiBtZXRob2QsIHNvIGlmIGEgZmFpbHVyZSBvY2N1cnJzLCB3ZSBjYW4gZ2V0IGEgbW9yZSBzcGVjaWZpYyBtZXNzYWdlCi0JCQkgKi8KLQkJCWlmIChtLmlzV2ViTW9kdWxlKCkpCi0JCQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUoYXJjaGl2ZU9wdGlvbnMsIGFVcmkpOwotCQkJZWxzZSBpZiAobS5pc0VqYk1vZHVsZSgpKQotCQkJCXJldHVybiBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKGFyY2hpdmVPcHRpb25zLCBhVXJpKTsKLQkJCWVsc2UgaWYgKG0uaXNKYXZhTW9kdWxlKCkpCi0JCQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShhcmNoaXZlT3B0aW9ucywgYVVyaSk7Ci0JCQllbHNlIGlmIChtLmlzQ29ubmVjdG9yTW9kdWxlKCkpCi0JCQkJcmV0dXJuIGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkub3BlblJBUkZpbGUoYXJjaGl2ZU9wdGlvbnMsIGFVcmkpOwotCi0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgT3BlbkZhaWx1cmVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm5lc3RlZF9vcGVuX2ZhaWxfRVhDXyIsIChuZXcgT2JqZWN0W117YVVyaSwgZ2V0VVJJKCl9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCA9ICJVbmFibGUgdG8gb3BlbiBtb2R1bGUgZmlsZSAiezB9IiBpbiBFQVIgZmlsZSAiezF9IiIKLQkJfQotCQkvL1Nob3VsZCBuZXZlciByZWFjaCB0aGUgY29kZSBiZWxvdwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoRG93blJvbGUoU2VjdXJpdHlSb2xlIHJvbGUpIHsKLQkJaWYgKHJvbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlBhcmFtZXRlcl9zaG91bGRfbm90X2JlX251X0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQgPSAiUGFyYW1ldGVyIHNob3VsZCBub3QgYmUgbnVsbCIKLQotCQlMaXN0IG1vZHVsZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgbSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJcHVzaERvd25Sb2xlKHJvbGUsIG0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFQVJGaWxlCi0JICovCi0JcHVibGljIHZvaWQgcHVzaERvd25Sb2xlKFNlY3VyaXR5Um9sZSByb2xlLCBNb2R1bGUgYU1vZHVsZSkgewotCQl0cnkgewotCQkJaWYgKGFNb2R1bGUuaXNXZWJNb2R1bGUoKSkgewotCQkJCVdlYkFwcCBkZCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJNb2R1bGUpIGFNb2R1bGUpOwotCQkJCWlmIChkZC5nZXRTZWN1cml0eVJvbGVOYW1lZChyb2xlLmdldFJvbGVOYW1lKCkpID09IG51bGwpCi0JCQkJCWRkLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weShyb2xlKSk7Ci0JCQl9IGVsc2UgaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkgewotCQkJCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseSA9IGdldEFzc2VtYmx5RGVzY3JpcHRvckFkZElmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yKChFamJNb2R1bGUpIGFNb2R1bGUpKTsKLQkJCQlpZiAoYXNzZW1ibHkuZ2V0U2VjdXJpdHlSb2xlTmFtZWQocm9sZS5nZXRSb2xlTmFtZSgpKSA9PSBudWxsKQotCQkJCQlhc3NlbWJseS5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKEV0b29sc0NvcHlVdGlsaXR5LmNyZWF0ZUNvcHkocm9sZSkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZGRfaW5fZWFyX2xvYWRfRVhDXyIsIChuZXcgT2JqZWN0W117YU1vZHVsZS5nZXRVcmkoKSwgZ2V0VVJJKCl9KSksIGUpOyAvLyROT04tTkxTLTEkID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgbW9kdWxlICJ7MH0iIGluIGVhciBmaWxlICJ7MX0iIgotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gYWx0LWRkIGlzIGFib3V0IHRvIGJlIGxvYWRlZDsgcmVnaXN0ZXIgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGZhY3RvcnkgZm9yIHRoZSB1cmkgc28gaXQKLQkgKiB3aWxsIGdldCBsb2FkZWQgY29ycmVjdGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUmVzb3VyY2VGYWN0b3J5KE1vZHVsZSBhTW9kdWxlLCBTdHJpbmcgYVVyaSkgewotCQlvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkKLQkJCWZhY3RvcnkgPSBFSkJKYXJSZXNvdXJjZUZhY3RvcnkuZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKQotCQkJZmFjdG9yeSA9IFdlYkFwcFJlc291cmNlRmFjdG9yeS5nZXRSZWdpc3RlcmVkRmFjdG9yeSgpOwotCQllbHNlIGlmIChhTW9kdWxlLmlzSmF2YU1vZHVsZSgpKQotCQkJZmFjdG9yeSA9IEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmdldFJlZ2lzdGVyZWRGYWN0b3J5KCk7Ci0JCWVsc2UgaWYgKGFNb2R1bGUuaXNDb25uZWN0b3JNb2R1bGUoKSkKLQkJCWZhY3RvcnkgPSBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkuZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKTsKLQotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldCgpOwotCQkJKChKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkpIHNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpKS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChhVXJpLCBmYWN0b3J5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKE1vZHVsZVJlZiBhTW9kdWxlUmVmKSB7Ci0JCWlmIChhTW9kdWxlUmVmID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU1vZHVsZSBhTW9kdWxlID0gYU1vZHVsZVJlZi5nZXRNb2R1bGUoKTsKLQotCQlpZiAoYU1vZHVsZSAhPSBudWxsKQotCQkJZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCkucmVtb3ZlKGFNb2R1bGUpOwotCi0JCWdldE1vZHVsZVJlZnMoKS5yZW1vdmUoYU1vZHVsZVJlZik7Ci0JCWlmIChnZXRNb2R1bGVSZWZzKGFNb2R1bGVSZWYuZ2V0TW9kdWxlRmlsZSgpKS5pc0VtcHR5KCkpCi0JCQlnZXRGaWxlcygpLnJlbW92ZShhTW9kdWxlUmVmLmdldE1vZHVsZUZpbGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFQVJGaWxlCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlUmVmcyhNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSByZWZzLmdldChpKTsKLQkJCWlmIChyZWYuZ2V0TW9kdWxlRmlsZSgpID09IGFNb2R1bGVGaWxlKQotCQkJCXJlc3VsdC5hZGQocmVmKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbmFtZVJvbGVzSW5Nb2R1bGVERHMoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlMaXN0IG1vZHVsZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgbSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlpZiAobS5pc0VqYk1vZHVsZSgpKQotCQkJCQlnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRWpiTW9kdWxlKSBtKS5yZW5hbWVTZWN1cml0eVJvbGUoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotCQkJCWVsc2UgaWYgKG0uaXNXZWJNb2R1bGUoKSkKLQkJCQkJZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYk1vZHVsZSkgbSkucmVuYW1lU2VjdXJpdHlSb2xlKGV4aXN0aW5nUm9sZU5hbWUsIG5ld1JvbGVOYW1lKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZGRfaW5fZWFyX2xvYWRfRVhDXyIsIChuZXcgT2JqZWN0W117bS5nZXRVcmkoKSwgZ2V0VVJJKCl9KSksIGUpOyAvLyROT04tTkxTLTEkID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgbW9kdWxlICJ7MH0iIGluIGVhciBmaWxlICJ7MX0iIgotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkVBUkZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSkgdGhyb3dzIE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlBcHBsaWNhdGlvbiBhcHAgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlTZWN1cml0eVJvbGUgYVJvbGUgPSBhcHAuZ2V0U2VjdXJpdHlSb2xlTmFtZWQoZXhpc3RpbmdSb2xlTmFtZSk7Ci0JCWlmIChhUm9sZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJub19zZWNfcm9sZV9FWENfIiwgKG5ldyBPYmplY3RbXXtnZXRVUkkoKSwgZXhpc3RpbmdSb2xlTmFtZX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiOiBFQVIgRmlsZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgIgotCQlpZiAoYXBwLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5ld1JvbGVOYW1lKSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZHVwX3NlY19yb2xlX0VYQ18iLCAobmV3IE9iamVjdFtde2dldFVSSSgpLCBuZXdSb2xlTmFtZX0pKSwgYXBwLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5ld1JvbGVOYW1lKSk7IC8vJE5PTi1OTFMtMSQgPSAiOiBFQVIgRmlsZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxyZWFkeSBjb250YWlucyBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgIgotCi0JCWFSb2xlLnNldFJvbGVOYW1lKG5ld1JvbGVOYW1lKTsKLQotCQlyZW5hbWVSb2xlc0luTW9kdWxlRERzKGV4aXN0aW5nUm9sZU5hbWUsIG5ld1JvbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJvbGxVcFJvbGVzKCkgewotCQlMaXN0IG1vZHVsZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJcm9sbFVwUm9sZXMoYU1vZHVsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUFSRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJvbGxVcFJvbGVzKE1vZHVsZSBhTW9kdWxlKSB7Ci0JCUxpc3Qgc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKQotCQkJCXNlY3VyaXR5Um9sZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViTW9kdWxlKSBhTW9kdWxlKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCQllbHNlIGlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpCi0JCQkJc2VjdXJpdHlSb2xlcyA9IGdldEFzc2VtYmx5RGVzY3JpcHRvckFkZElmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yKChFamJNb2R1bGUpIGFNb2R1bGUpKS5nZXRTZWN1cml0eVJvbGVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkZF9pbl9lYXJfbG9hZF9FWENfIiwgKG5ldyBPYmplY3RbXXthTW9kdWxlLmdldFVyaSgpLCBnZXRVUkkoKX0pKSwgZSk7IC8vJE5PTi1OTFMtMSQgPSAiRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBtb2R1bGUgInswfSIgaW4gZWFyIGZpbGUgInsxfSIiCi0JCX0KLQotCQlpZiAoc2VjdXJpdHlSb2xlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY3VyaXR5Um9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWFkZENvcHlJZk5vdEV4aXN0cygoU2VjdXJpdHlSb2xlKSBzZWN1cml0eVJvbGVzLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbiBsKSB7Ci0JCXRoaXMuc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4obCk7Ci0JCXJlcGxhY2VSb290KGdldE1vZlJlc291cmNlTWFrZUlmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkpLCBsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19TSVpFOgotCQkJCXJldHVybiBpc1NldFNpemUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNTZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBPUklHSU5BTF9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG9yaWdpbmFsVVJJICE9IG51bGwgOiAhT1JJR0lOQUxfVVJJX0VERUZBVUxULmVxdWFscyhvcmlnaW5hbFVSSSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lciAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX1RZUEVTOgotCQkJCXJldHVybiB0eXBlcyAhPSBudWxsICYmICF0eXBlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQlyZXR1cm4gbW9kdWxlUmVmcyAhPSBudWxsICYmICFtb2R1bGVSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlzZXRMYXN0TW9kaWZpZWQoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCWdldFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQlnZXRNb2R1bGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNb2R1bGVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fVVJJOgotCQkJCXNldFVSSShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19TSVpFOgotCQkJCXVuc2V0U2l6ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQl1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgotCQkJCWdldE1vZHVsZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlzZXREZXBsb3ltZW50RGVzY3JpcHRvcigoQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCkgewotCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXBsb3ltZW50RGVzY3JpcHRvci5lSXNQcm94eSgpKSB7Ci0JCQlBcHBsaWNhdGlvbiBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSAoQXBwbGljYXRpb24pZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWRlcGxveW1lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBvbGREZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihBcHBsaWNhdGlvbiBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQlBcHBsaWNhdGlvbiBvbGREZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ld0RlcGxveW1lbnREZXNjcmlwdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNb2R1bGVSZWZzR2VuKCkgewotCQlpZiAobW9kdWxlUmVmcyA9PSBudWxsKSB7Ci0JCQltb2R1bGVSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTW9kdWxlUmVmLmNsYXNzLCB0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlUmVmczsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0TW9kdWxlUmVmcygpIHsKLQkJRUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnNHZW4oKTsKLQotCQlpZiAocmVmcy5pc0VtcHR5KCkpCi0JCQlpbml0UmVmcyhyZWZzKTsKLQotCQlyZXR1cm4gcmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNb2R1bGVSZWZzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1vZHVsZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTLCBDb250YWluZXIuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19TSVpFOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRTaXplKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc0RpcmVjdG9yeUVudHJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBnZXRPcmlnaW5hbFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX0ZJTEVTOgotCQkJCXJldHVybiBnZXRGaWxlcygpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIGdldFR5cGVzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlUmVmcygpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdFJlZnMoRUxpc3QgcmVmcykgewotCQlMaXN0IG1vZHVsZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlyZWZzLmFkZChjcmVhdGVNb2R1bGVSZWYobW9kdWxlLCBudWxsKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kdWxlUmVmIGNyZWF0ZU1vZHVsZVJlZihNb2R1bGUgYU1vZHVsZSwgTW9kdWxlRmlsZSBhRmlsZSkgewotCQlNb2R1bGVSZWYgbmV3UmVmID0gbnVsbDsKLQotCQlpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKQotCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc1dlYk1vZHVsZSgpKQotCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXZWJNb2R1bGVSZWYoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc0Nvbm5lY3Rvck1vZHVsZSgpKQotCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKLQkJZWxzZSBpZiAoYU1vZHVsZS5pc0phdmFNb2R1bGUoKSkKLQkJCW5ld1JlZiA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCk7Ci0KLQkJbmV3UmVmLnNldE1vZHVsZShhTW9kdWxlKTsKLQkJbmV3UmVmLnNldE1vZHVsZUZpbGUoYUZpbGUpOwotCi0JCXJldHVybiBuZXdSZWY7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0Q2xpZW50TW9kdWxlUmVmcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2xpZW50TW9kdWxlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmlzQ2xpZW50KCkpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0Q29ubmVjdG9yTW9kdWxlUmVmcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29ubmVjdG9yTW9kdWxlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmlzQ29ubmVjdG9yKCkpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0RUpCTW9kdWxlUmVmcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RUpCTW9kdWxlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmlzRUpCKCkpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0V2ViTW9kdWxlUmVmcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVmcyA9IGdldE1vZHVsZVJlZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgcmVmcy5nZXQoaSk7Ci0JCQlpZiAocmVmLmlzV2ViKCkpCi0JCQkJcmVzdWx0LmFkZChyZWYpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVBUkZpbGUjZ2V0RkFSRmlsZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZBUkZpbGVzKCkgewotCQlMaXN0IGZhckZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGZpbGVMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoYUZpbGUuaXNGQVJGaWxlKCkpIHsKLQkJCQlmYXJGaWxlcy5hZGQoYUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYXJGaWxlczsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5FQVJGaWxlI2dldEFyY2hpdmVzT2ZUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXJjaGl2ZXNPZlR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRFSkJSZWZlcmVuY2VzKGJvb2xlYW4gZmlsdGVyTGlua2VkUmVmZXJlbmNlcywgYm9vbGVhbiBmaWx0ZXJOb25MaW5rZWRSZWZlcmVuY2VzKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlpZiAoIWZpbHRlckxpbmtlZFJlZmVyZW5jZXMgfHwgIWZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMpIHsKLQkJCUFwcGxpY2F0aW9uIGFwcCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQlpZiAoYXBwICE9IG51bGwpIHsKLQkJCQlMaXN0IG1vZHVsZXMgPSBhcHAuZ2V0TW9kdWxlcygpOwotCQkJCU1vZHVsZSBtb2R1bGU7Ci0JCQkJTWFwIHJlZmVyZW5jZXMgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJCQltb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlZmVyZW5jZXMgPSBjb2xsZWN0RUpCUmVmZXJlbmNlcyhtb2R1bGUsIGZpbHRlckxpbmtlZFJlZmVyZW5jZXMsIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMsIHJlZmVyZW5jZXMpOwotCQkJCQl9IGNhdGNoIChSZXNvdXJjZUxvYWRFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9IGNhdGNoIChFbXB0eVJlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVmZXJlbmNlczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiBAcGFyYW0gZmlsdGVyTGlua2VkUmVmZXJlbmNlcwotCSAqIEBwYXJhbSBmaWx0ZXJOb25MaW5rZWRSZWZlcmVuY2VzCi0JICogQHBhcmFtIHJlZmVyZW5jZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNYXAgY29sbGVjdEVKQlJlZmVyZW5jZXMoTW9kdWxlIG1vZHVsZSwgYm9vbGVhbiBmaWx0ZXJMaW5rZWRSZWZlcmVuY2VzLCBib29sZWFuIGZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMsIE1hcCByZWZlcmVuY2VzKSB0aHJvd3MgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlNYXAgbXlSZWZlcmVuY2VzID0gcmVmZXJlbmNlczsKLQkJTGlzdCBtb2R1bGVSZWZlcmVuY2VzID0gZ2V0RUpCUmVmZXJuZWNlcyhtb2R1bGUpOwotCQlpZiAobW9kdWxlUmVmZXJlbmNlcyAhPSBudWxsICYmICFtb2R1bGVSZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJRWpiUmVmIHJlZiA9IG51bGw7Ci0JCQlMaXN0IGZpbHRlcmVkUmVmcyA9IG51bGw7Ci0JCQlTdHJpbmcgbGluayA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZWYgPSAoRWpiUmVmKSBtb2R1bGVSZWZlcmVuY2VzLmdldChpKTsKLQkJCQlsaW5rID0gcmVmLmdldExpbmsoKTsKLQkJCQlpZiAoKGxpbmsgIT0gbnVsbCAmJiBsaW5rLmxlbmd0aCgpID4gMCAmJiAhZmlsdGVyTGlua2VkUmVmZXJlbmNlcykgfHwgKGxpbmsgPT0gbnVsbCB8fCBsaW5rLmxlbmd0aCgpID09IDAgJiYgIWZpbHRlck5vbkxpbmtlZFJlZmVyZW5jZXMpKSB7Ci0JCQkJCWlmIChmaWx0ZXJlZFJlZnMgPT0gbnVsbCkKLQkJCQkJCWZpbHRlcmVkUmVmcyA9IG5ldyBBcnJheUxpc3QobW9kdWxlUmVmZXJlbmNlcy5zaXplKCkpOwotCQkJCQlmaWx0ZXJlZFJlZnMuYWRkKHJlZik7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZpbHRlcmVkUmVmcyAhPSBudWxsKSB7Ci0JCQkJaWYgKG15UmVmZXJlbmNlcyA9PSBudWxsKQotCQkJCQlteVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCW15UmVmZXJlbmNlcy5wdXQobW9kdWxlLCBmaWx0ZXJlZFJlZnMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBteVJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0RUpCUmVmZXJuZWNlcyhNb2R1bGUgbW9kdWxlKSB0aHJvd3MgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEVtcHR5UmVzb3VyY2VFeGNlcHRpb24gewotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCWlmIChtb2R1bGUuaXNFamJNb2R1bGUoKSkgewotCQkJCUVKQkphciBlamJKYXIgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigoRWpiTW9kdWxlKSBtb2R1bGUpOwotCQkJCXJldHVybiBnZXRFSkJSZWZlcmVuY2VzKGVqYkphcik7Ci0JCQl9IGVsc2UgaWYgKG1vZHVsZS5pc1dlYk1vZHVsZSgpKSB7Ci0JCQkJV2ViQXBwIHdlYkFwcCA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yKChXZWJNb2R1bGUpIG1vZHVsZSk7Ci0JCQkJaWYgKHdlYkFwcCAhPSBudWxsKQotCQkJCQlyZXR1cm4gd2ViQXBwLmdldEVqYlJlZnMoKTsKLQkJCX0gZWxzZSBpZiAobW9kdWxlLmlzSmF2YU1vZHVsZSgpKSB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEphdmFDbGllbnRNb2R1bGUpIG1vZHVsZSk7Ci0JCQkJaWYgKGFwcENsaWVudCAhPSBudWxsKQotCQkJCQlyZXR1cm4gYXBwQ2xpZW50LmdldEVqYlJlZmVyZW5jZXMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWpiSmFyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRFSkJSZWZlcmVuY2VzKEVKQkphciBlamJKYXIpIHsKLQkJaWYgKGVqYkphciAhPSBudWxsKSB7Ci0JCQlMaXN0IGVqYnMgPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCQlMaXN0IHJlZnMgPSBudWxsOwotCQkJRW50ZXJwcmlzZUJlYW4gZWpiID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWpicy5zaXplKCk7IGkrKykgewotCQkJCWVqYiA9IChFbnRlcnByaXNlQmVhbikgZWpicy5nZXQoaSk7Ci0JCQkJaWYgKHJlZnMgPT0gbnVsbCkKLQkJCQkJcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZWZzLmFkZEFsbChlamIuZ2V0RWpiUmVmcygpKTsKLQkJCX0KLQkJCWlmIChyZWZzICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlZnM7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VKQkphckZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VKQkphckZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOWM4N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJKYXJGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkRlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCSmFyRmlsZUltcGwgZXh0ZW5kcyBNb2R1bGVGaWxlSW1wbCBpbXBsZW1lbnRzIEVKQkphckZpbGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVKQkphciBkZXBsb3ltZW50RGVzY3JpcHRvciA9IG51bGw7Ci0KLQlwdWJsaWMgRUpCSmFyRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkphckZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciB0b29scyBwZXJmb3JtaW5nIHNlbGVjdGl2ZSBpbXBvcnQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBc3NvY2lhdGVkRmlsZXMoRW50ZXJwcmlzZUJlYW4gZWpiKSB7Ci0KLQkJTGlzdCBjbGFzc05hbWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlamIuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCkgewotCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldEhvbWVJbnRlcmZhY2VOYW1lKCkpOwotCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKSk7Ci0JCX0gZWxzZSBpZiAoZWpiLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsKLQkJCWlmIChlamIuaGFzUmVtb3RlQ2xpZW50KCkpIHsKLQkJCQljbGFzc05hbWVzLmFkZChlamIuZ2V0SG9tZUludGVyZmFjZU5hbWUoKSk7Ci0JCQkJY2xhc3NOYW1lcy5hZGQoZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoZWpiLmhhc0xvY2FsQ2xpZW50KCkpIHsKLQkJCQljbGFzc05hbWVzLmFkZChlamIuZ2V0TG9jYWxIb21lSW50ZXJmYWNlTmFtZSgpKTsKLQkJCQljbGFzc05hbWVzLmFkZChlamIuZ2V0TG9jYWxJbnRlcmZhY2VOYW1lKCkpOwotCQkJfQotCQl9Ci0JCWNsYXNzTmFtZXMuYWRkKGVqYi5nZXRFamJDbGFzc05hbWUoKSk7Ci0KLQkJaWYgKGVqYi5pc0VudGl0eSgpKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gKChFbnRpdHkpIGVqYikuZ2V0UHJpbWFyeUtleU5hbWUoKTsKLQkJCWlmICghY2xhc3NOYW1lLnN0YXJ0c1dpdGgoImphdmEiKSkvLyROT04tTkxTLTEkCi0JCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBjbGFzc05hbWVzLmdldChpKTsKLQkJCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBjbGFzc1VyaSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuY2xhc3NOYW1lVG9VcmkoY2xhc3NOYW1lKTsKLQkJCVN0cmluZyBqYXZhVXJpID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbC5jbGFzc05hbWVUb0phdmFVcmkoY2xhc3NOYW1lKTsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0LmFkZChnZXRGaWxlKGNsYXNzVXJpKSk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpb3gpIHsKLQkJCQkvL0RvIG5vdGhpbmcgLSB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGphciBmaWxlCi0JCQl9Ci0JCQl0cnkgewotCQkJCXJlc3VsdC5hZGQoZ2V0RmlsZShqYXZhVXJpKSk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpb3gpIHsKLQkJCQkvL0RvIG5vdGhpbmcgLSB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGphciBmaWxlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgaXMgYSBydW50aW1lIGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBjYW4ndCBvdmVycmlkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLQkgKiAgICAgICAgICAgICBtZXRob2RzCi0JICovCi0JcHVibGljIEVKQkphciBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlFSkJKYXIgZGQgPSB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JCWlmIChkZCA9PSBudWxsICYmIGNhbkxhenlJbml0aWFsaXplKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0SW1wb3J0U3RyYXRlZ3koKS5pbXBvcnRNZXRhRGF0YSgpOwotCQkJfSBjYXRjaCAoRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERlcGxveWVtZW50RGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTdGFuZGFyZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkJKYXJGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRUpCSmFyRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wb3J0ZWRGcm9tMTAoKSB7Ci0JCXJldHVybiBnZXRJbXBvcnRTdHJhdGVneSgpICE9IG51bGwgJiYgZ2V0SW1wb3J0U3RyYXRlZ3koKS5pc0VKQjEwKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUVKQkphciBlamJKYXIgPSAoKEVqYlBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkpLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJKYXIoKTsKLQkJcmVzb3VyY2Uuc2V0SUQoZWpiSmFyLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9JRCk7Ci0JCXNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKGVqYkphcik7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGVqYkphcik7Ci0KLQkJcmV0dXJuIGVqYkphcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKEVKQkphciBsKSB7Ci0JCXRoaXMuc2V0RGVwbG95bWVudERlc2NyaXB0b3JHZW4obCk7Ci0JCXJlcGxhY2VSb290KGdldE1vZlJlc291cmNlTWFrZUlmTmVjZXNzYXJ5KGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkpLCBsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19TSVpFOgotCQkJCXJldHVybiBpc1NldFNpemUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lciAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1RZUEVTOgotCQkJCXJldHVybiB0eXBlcyAhPSBudWxsICYmICF0eXBlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJc2V0TGFzdE1vZGlmaWVkKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19TSVpFOgotCQkJCXNldFNpemUoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKEVKQkphciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19VUkk6Ci0JCQkJc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJdW5zZXRMYXN0TW9kaWZpZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fU0laRToKLQkJCQl1bnNldFNpemUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXVuc2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKE9SSUdJTkFMX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCXNldERlcGxveW1lbnREZXNjcmlwdG9yKChFSkJKYXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVKQkphciBnZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpIHsKLQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGwgJiYgZGVwbG95bWVudERlc2NyaXB0b3IuZUlzUHJveHkoKSkgewotCQkJRUpCSmFyIG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCQlkZXBsb3ltZW50RGVzY3JpcHRvciA9IChFSkJKYXIpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWRlcGxveW1lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBvbGREZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SLCBvbGREZXBsb3ltZW50RGVzY3JpcHRvciwgZGVwbG95bWVudERlc2NyaXB0b3IpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJKYXIgYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKEVKQkphciBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcikgewotCQlFSkJKYXIgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXdEZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTLCBDb250YWluZXIuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldExhc3RNb2RpZmllZCgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19TSVpFOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRTaXplKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIGdldE9yaWdpbmFsVVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIGdldFR5cGVzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9KQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VKQk1vZHVsZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCTW9kdWxlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E5YWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCTW9kdWxlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci0KLQotcHVibGljIGNsYXNzIEVKQk1vZHVsZVJlZkltcGwgZXh0ZW5kcyBNb2R1bGVSZWZJbXBsIGltcGxlbWVudHMgRUpCTW9kdWxlUmVmLCBNb2R1bGVSZWYgewotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUpCTW9kdWxlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlUmVmKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19FQVJfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlMsIEVBUkZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlRmlsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZUZpbGUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNb2R1bGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNb2R1bGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJc2V0RWFyRmlsZSgoRUFSRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXNldE1vZHVsZSgoTW9kdWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXNldE1vZHVsZUZpbGUoKE1vZHVsZUZpbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJc2V0RWFyRmlsZSgoRUFSRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVKQl9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZUZpbGUgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlyZXR1cm4gbW9kdWxlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBFSkJKYXIgZ2V0RUpCSmFyKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChFSkJKYXIpIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc0VKQigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfSAvL0VKQk1vZHVsZVJlZkltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3NjFlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci0KLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZpbGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBGaWxlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVUkkoKSA8ZW0+VVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVyaSA9IFVSSV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFzdE1vZGlmaWVkKCkgPGVtPkxhc3QgTW9kaWZpZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXN0TW9kaWZpZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBMQVNUX01PRElGSUVEX0VERUZBVUxUID0gMEw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQgPSBMQVNUX01PRElGSUVEX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGFzdCBNb2RpZmllZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGFzdE1vZGlmaWVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpemUoKSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFNJWkVfRURFRkFVTFQgPSAwTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBsb25nIHNpemUgPSBTSVpFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2l6ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNpemVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEaXJlY3RvcnlFbnRyeSgpIDxlbT5EaXJlY3RvcnkgRW50cnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RpcmVjdG9yeUVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRElSRUNUT1JZX0VOVFJZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RpcmVjdG9yeUVudHJ5KCkgPGVtPkRpcmVjdG9yeSBFbnRyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGlyZWN0b3J5RW50cnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRpcmVjdG9yeUVudHJ5ID0gRElSRUNUT1JZX0VOVFJZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEaXJlY3RvcnkgRW50cnkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRpcmVjdG9yeUVudHJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWdpbmFsVVJJKCkgPGVtPk9yaWdpbmFsIFVSSTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE9yaWdpbmFsVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcmlnaW5hbFVSSSA9IE9SSUdJTkFMX1VSSV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGFpbmVyIGxvYWRpbmdDb250YWluZXIgPSBudWxsOwotCi0JcHVibGljIEZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGlyZWN0b3J5VVJJKCkgewotCQlyZXR1cm4gQXJjaGl2ZVV0aWwuZ2V0RmlsZU5hbWVQYXJlbnQoZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpLnByaW1HZXRJbnB1dFN0cmVhbShnZXRPcmlnaW5hbFVSSSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBBcmNoaXZlVXRpbC5nZXRGaWxlTmFtZVRhaWwoZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGlzQ29udGFpbmVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VBUkZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCSmFyRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JBUkZpbGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBpc1JlYWRPbmx5RGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV0FSRmlsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyBuZXdVUkkpIHsKLQkJU3RyaW5nIG9sZFVSSSA9IHVyaTsKLQkJdXJpID0gbmV3VVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19VUkksIG9sZFVSSSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiBsYXN0TW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIG5ld0xhc3RNb2RpZmllZCkgewotCQlsb25nIG9sZExhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLQkJbGFzdE1vZGlmaWVkID0gbmV3TGFzdE1vZGlmaWVkOwotCQlib29sZWFuIG9sZExhc3RNb2RpZmllZEVTZXQgPSBsYXN0TW9kaWZpZWRFU2V0OwotCQlsYXN0TW9kaWZpZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRCwgb2xkTGFzdE1vZGlmaWVkLCBsYXN0TW9kaWZpZWQsICFvbGRMYXN0TW9kaWZpZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGFzdE1vZGlmaWVkKCkgewotCQlsb25nIG9sZExhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLQkJYm9vbGVhbiBvbGRMYXN0TW9kaWZpZWRFU2V0ID0gbGFzdE1vZGlmaWVkRVNldDsKLQkJbGFzdE1vZGlmaWVkID0gTEFTVF9NT0RJRklFRF9FREVGQVVMVDsKLQkJbGFzdE1vZGlmaWVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xBU1RfTU9ESUZJRUQsIG9sZExhc3RNb2RpZmllZCwgTEFTVF9NT0RJRklFRF9FREVGQVVMVCwgb2xkTGFzdE1vZGlmaWVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExhc3RNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGxhc3RNb2RpZmllZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShsb25nIG5ld1NpemUpIHsKLQkJbG9uZyBvbGRTaXplID0gc2l6ZTsKLQkJc2l6ZSA9IG5ld1NpemU7Ci0JCWJvb2xlYW4gb2xkU2l6ZUVTZXQgPSBzaXplRVNldDsKLQkJc2l6ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19TSVpFLCBvbGRTaXplLCBzaXplLCAhb2xkU2l6ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTaXplKCkgewotCQlsb25nIG9sZFNpemUgPSBzaXplOwotCQlib29sZWFuIG9sZFNpemVFU2V0ID0gc2l6ZUVTZXQ7Ci0JCXNpemUgPSBTSVpFX0VERUZBVUxUOwotCQlzaXplRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1NJWkUsIG9sZFNpemUsIFNJWkVfRURFRkFVTFQsIG9sZFNpemVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHNpemVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeUVudHJ5KCkgewotCQlyZXR1cm4gZGlyZWN0b3J5RW50cnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcmVjdG9yeUVudHJ5KGJvb2xlYW4gbmV3RGlyZWN0b3J5RW50cnkpIHsKLQkJYm9vbGVhbiBvbGREaXJlY3RvcnlFbnRyeSA9IGRpcmVjdG9yeUVudHJ5OwotCQlkaXJlY3RvcnlFbnRyeSA9IG5ld0RpcmVjdG9yeUVudHJ5OwotCQlib29sZWFuIG9sZERpcmVjdG9yeUVudHJ5RVNldCA9IGRpcmVjdG9yeUVudHJ5RVNldDsKLQkJZGlyZWN0b3J5RW50cnlFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fRElSRUNUT1JZX0VOVFJZLCBvbGREaXJlY3RvcnlFbnRyeSwgZGlyZWN0b3J5RW50cnksICFvbGREaXJlY3RvcnlFbnRyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREaXJlY3RvcnlFbnRyeSgpIHsKLQkJYm9vbGVhbiBvbGREaXJlY3RvcnlFbnRyeSA9IGRpcmVjdG9yeUVudHJ5OwotCQlib29sZWFuIG9sZERpcmVjdG9yeUVudHJ5RVNldCA9IGRpcmVjdG9yeUVudHJ5RVNldDsKLQkJZGlyZWN0b3J5RW50cnkgPSBESVJFQ1RPUllfRU5UUllfRURFRkFVTFQ7Ci0JCWRpcmVjdG9yeUVudHJ5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWSwgb2xkRGlyZWN0b3J5RW50cnksIERJUkVDVE9SWV9FTlRSWV9FREVGQVVMVCwgb2xkRGlyZWN0b3J5RW50cnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGlyZWN0b3J5RW50cnkoKSB7Ci0JCXJldHVybiBkaXJlY3RvcnlFbnRyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsVVJJKCkgewotCQlyZXR1cm4gb3JpZ2luYWxVUkk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JpZ2luYWxVUkkoU3RyaW5nIG5ld09yaWdpbmFsVVJJKSB7Ci0JCVN0cmluZyBvbGRPcmlnaW5hbFVSSSA9IG9yaWdpbmFsVVJJOwotCQlvcmlnaW5hbFVSSSA9IG5ld09yaWdpbmFsVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19PUklHSU5BTF9VUkksIG9sZE9yaWdpbmFsVVJJLCBvcmlnaW5hbFVSSSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIENvbnRhaW5lciBnZXRMb2FkaW5nQ29udGFpbmVyKCkgewotCQlpZiAobG9hZGluZ0NvbnRhaW5lciAhPSBudWxsICYmIGxvYWRpbmdDb250YWluZXIuZUlzUHJveHkoKSkgewotCQkJQ29udGFpbmVyIG9sZExvYWRpbmdDb250YWluZXIgPSBsb2FkaW5nQ29udGFpbmVyOwotCQkJbG9hZGluZ0NvbnRhaW5lciA9IChDb250YWluZXIpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWxvYWRpbmdDb250YWluZXIpOwotCQkJaWYgKGxvYWRpbmdDb250YWluZXIgIT0gb2xkTG9hZGluZ0NvbnRhaW5lcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xPQURJTkdfQ09OVEFJTkVSLCBvbGRMb2FkaW5nQ29udGFpbmVyLCBsb2FkaW5nQ29udGFpbmVyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250YWluZXIgYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkaW5nQ29udGFpbmVyKENvbnRhaW5lciBuZXdMb2FkaW5nQ29udGFpbmVyKSB7Ci0JCUNvbnRhaW5lciBvbGRMb2FkaW5nQ29udGFpbmVyID0gbG9hZGluZ0NvbnRhaW5lcjsKLQkJbG9hZGluZ0NvbnRhaW5lciA9IG5ld0xvYWRpbmdDb250YWluZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0xPQURJTkdfQ09OVEFJTkVSLCBvbGRMb2FkaW5nQ29udGFpbmVyLCBsb2FkaW5nQ29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDb250YWluZXIpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIG5ld0NvbnRhaW5lcikgewotCQlpZiAobmV3Q29udGFpbmVyICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSICYmIG5ld0NvbnRhaW5lciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0NvbnRhaW5lcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Q29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnRhaW5lcikuZUludmVyc2VBZGQodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdDb250YWluZXIsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIsIG5ld0NvbnRhaW5lciwgbmV3Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTLCBDb250YWluZXIuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19TSVpFOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRTaXplKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzRGlyZWN0b3J5RW50cnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fU0laRToKLQkJCQlyZXR1cm4gaXNTZXRTaXplKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNTZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGxvYWRpbmdDb250YWluZXIgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19VUkk6Ci0JCQkJc2V0VVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlzZXRMYXN0TW9kaWZpZWQoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19TSVpFOgotCQkJCXNldFNpemUoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJc2V0RGlyZWN0b3J5RW50cnkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19VUkk6Ci0JCQkJc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXVuc2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19TSVpFOgotCQkJCXVuc2V0U2l6ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXVuc2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSShPUklHSU5BTF9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhc3RNb2RpZmllZDogIik7Ci0JCWlmIChsYXN0TW9kaWZpZWRFU2V0KSByZXN1bHQuYXBwZW5kKGxhc3RNb2RpZmllZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNpemU6ICIpOwotCQlpZiAoc2l6ZUVTZXQpIHJlc3VsdC5hcHBlbmQoc2l6ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpcmVjdG9yeUVudHJ5OiAiKTsKLQkJaWYgKGRpcmVjdG9yeUVudHJ5RVNldCkgcmVzdWx0LmFwcGVuZChkaXJlY3RvcnlFbnRyeSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9yaWdpbmFsVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmlnaW5hbFVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogQHNlZSBGaWxlI2lzRkFSRmlsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGQVJGaWxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWM4NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkV4cG9ydFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVGaWxlSW1wbCBleHRlbmRzIEFyY2hpdmVJbXBsIGltcGxlbWVudHMgTW9kdWxlRmlsZSB7Ci0KLQkvKiogSW1wbGVtZW50ZXIgZm9yIGV4dHJhY3RpbmcgbWV0YS1kYXRhIGZyb20gdGhpcyBhcmNoaXZlIGludG8gdGhlIHJvb3Qgb2JqZWN0ICovCi0JcHJvdGVjdGVkIEltcG9ydFN0cmF0ZWd5IGltcG9ydFN0cmF0ZWd5OwotCS8qKiBJbXBsZW1lbnRlciBmb3IgYWRkaW5nIG1ldGEtZGF0YSB0byBhbiBhYm91dC10by1iZS1leHBvcnRlZCBhcmNoaXZlICovCi0JcHJvdGVjdGVkIEV4cG9ydFN0cmF0ZWd5IGV4cG9ydFN0cmF0ZWd5OwotCi0JcHVibGljIE1vZHVsZUZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRNb2R1bGVGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fQ09OVEFJTkVSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUywgQ29udGFpbmVyLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fU0laRToKLQkJCQlyZXR1cm4gbmV3IExvbmcoZ2V0U2l6ZSgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlyZXR1cm4gZ2V0T3JpZ2luYWxVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCXJldHVybiBiYXNpY0dldExvYWRpbmdDb250YWluZXIoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0RmlsZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1RZUEVTOgotCQkJCXJldHVybiBnZXRUeXBlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19VUkk6Ci0JCQkJc2V0VVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJc2V0TGFzdE1vZGlmaWVkKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJc2V0RGlyZWN0b3J5RW50cnkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXNldE9yaWdpbmFsVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19GSUxFUzoKLQkJCQlnZXRGaWxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19VUkk6Ci0JCQkJc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQl1bnNldExhc3RNb2RpZmllZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1NJWkU6Ci0JCQkJdW5zZXRTaXplKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXVuc2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoT1JJR0lOQUxfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlzZXRMb2FkaW5nQ29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fQ09OVEFJTkVSOgotCQkJCXNldENvbnRhaW5lcigoQ29udGFpbmVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19UWVBFUzoKLQkJCQlnZXRUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19TSVpFOgotCQkJCXJldHVybiBpc1NldFNpemUoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNTZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBPUklHSU5BTF9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG9yaWdpbmFsVVJJICE9IG51bGwgOiAhT1JJR0lOQUxfVVJJX0VERUZBVUxULmVxdWFscyhvcmlnaW5hbFVSSSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gbG9hZGluZ0NvbnRhaW5lciAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fQ09OVEFJTkVSOgotCQkJCXJldHVybiBnZXRDb250YWluZXIoKSAhPSBudWxsOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfRklMRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEVfX1RZUEVTOgotCQkJCXJldHVybiB0eXBlcyAhPSBudWxsICYmICF0eXBlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkxhenlJbml0aWFsaXplKCkgewotCQlyZXR1cm4gZ2V0SW1wb3J0U3RyYXRlZ3koKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TW9mUmVzb3VyY2UoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLk1vZHVsZUZpbGUKLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBnZXRFQVJGaWxlKCkgewotCQlDb250YWluZXIgYUNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwotCQlpZiAoYUNvbnRhaW5lciA9PSBudWxsIHx8ICFhQ29udGFpbmVyLmlzRUFSRmlsZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKChFQVJGaWxlKSBhQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5FeHBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkV4cG9ydFN0cmF0ZWd5IGdldEV4cG9ydFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZXhwb3J0U3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjkvMDAgNjozNTowOCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgZ2V0SW1wb3J0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBpbXBvcnRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBmaWxlLCBvciBlbXB0eSBzdHJpbmcgaWYgdW5rbm93biB2ZXJzaW9uLiBGb3IKLQkgKiBleGFtcGxlLCAiMi4wIgotCSAqIAotCSAqIEBkZXByZWNhdGVkLCBVc2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY1ZlcnNpb24oKSB7Ci0JCWZsb2F0IHZlciA9IGdldFNwZWNWZXJzaW9uSUQoKTsKLQkJRmxvYXQgc3BlY1ZlcnNpb24gPSBuZXcgRmxvYXQodmVyIC8gMTApOwotCQlyZXR1cm4gc3BlY1ZlcnNpb24udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gSUQgb2YgdGhlIG1vZHVsZSBGb3IgZXhhbXBsZSwgIjIwIgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTcGVjVmVyc2lvbklEKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoWE1MUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkuZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKTsKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0JICovCi0JcHVibGljIGFic3RyYWN0IEVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlRGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJWE1MUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQl0cnkgewotCQkJcmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIG1ha2VNb2ZSZXNvdXJjZShnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpKTsKLQkJfSBjYXRjaCAoRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZFeCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXNldFNhdmVTdHJhdGVneShhU2F2ZVN0cmF0ZWd5KTsKLQkJaWYgKGdldEV4cG9ydFN0cmF0ZWd5KCkgIT0gbnVsbCkKLQkJCWdldEV4cG9ydFN0cmF0ZWd5KCkucHJlU2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJc3VwZXIuc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHBvcnRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5FeHBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRXhwb3J0U3RyYXRlZ3kgbmV3RXhwb3J0U3RyYXRlZ3kpIHsKLQkJZXhwb3J0U3RyYXRlZ3kgPSBuZXdFeHBvcnRTdHJhdGVneTsKLQkJaWYgKG5ld0V4cG9ydFN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCW5ld0V4cG9ydFN0cmF0ZWd5LnNldEFyY2hpdmUodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOS8wMCA2OjM1OjA4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdJbXBvcnRTdHJhdGVneQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcG9ydFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IG5ld0ltcG9ydFN0cmF0ZWd5KSB7Ci0JCWltcG9ydFN0cmF0ZWd5ID0gbmV3SW1wb3J0U3RyYXRlZ3k7Ci0JCWlmIChuZXdJbXBvcnRTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQluZXdJbXBvcnRTdHJhdGVneS5zZXRBcmNoaXZlKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLk1vZHVsZUZpbGUjc2V0SjJFRVZlcnNpb24oaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKGludCB2ZXJzaW9uSUQpIHsKLQkJdHJ5IHsKLQkJCSgoWE1MUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkuc2V0VmVyc2lvbklEKHZlcnNpb25JRCk7Ci0JCX0gY2F0Y2ggKFJlc291cmNlTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzRlMmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk5vTW9kdWxlRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkxvYWRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBNb2R1bGVSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNb2R1bGVSZWYsIEVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVGaWxlIG1vZHVsZUZpbGUgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsZSgpIDxlbT5Nb2R1bGU8L2VtPn0nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZSBtb2R1bGUgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldE1vZHVsZVJlZigpOwotCX0KLQotCXByb3RlY3RlZCBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nOyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZENvbXBvbmVudExpc3QoRUxpc3QgbGlzdCkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGVHZW4oKSB7Ci0JCWlmIChtb2R1bGVGaWxlICE9IG51bGwgJiYgbW9kdWxlRmlsZS5lSXNQcm94eSgpKSB7Ci0JCQlNb2R1bGVGaWxlIG9sZE1vZHVsZUZpbGUgPSBtb2R1bGVGaWxlOwotCQkJbW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCltb2R1bGVGaWxlKTsKLQkJCWlmIChtb2R1bGVGaWxlICE9IG9sZE1vZHVsZUZpbGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRSwgb2xkTW9kdWxlRmlsZSwgbW9kdWxlRmlsZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVGaWxlOwotCX0KLQotCXB1YmxpYyBNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGUoKSB7Ci0JCWlmIChtb2R1bGVGaWxlID09IG51bGwpCi0JCQlpbml0TW9kdWxlRmlsZUZyb21FQVIoKTsKLQkJcmV0dXJuIG1vZHVsZUZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlIGJhc2ljR2V0TW9kdWxlRmlsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZUZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE1vZHVsZUZpbGVGcm9tRUFSKCkgewotCQljaGVja0VBUkZpbGUoKTsKLQkJTW9kdWxlRmlsZSBhRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhRmlsZSA9IChNb2R1bGVGaWxlKSBnZXRFYXJGaWxlKCkuZ2V0RmlsZShtb2R1bGUuZ2V0VXJpKCkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCS8vSWdub3JlCi0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJLy9JZ25vcmUKLQkJfQotCQljaGVja1R5cGUobW9kdWxlLCBhRmlsZSk7Ci0JCXNldE1vZHVsZUZpbGUoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZHVsZUZpbGUoTW9kdWxlRmlsZSBuZXdNb2R1bGVGaWxlKSB7Ci0JCU1vZHVsZUZpbGUgb2xkTW9kdWxlRmlsZSA9IG1vZHVsZUZpbGU7Ci0JCW1vZHVsZUZpbGUgPSBuZXdNb2R1bGVGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRSwgb2xkTW9kdWxlRmlsZSwgbW9kdWxlRmlsZSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNBbHRERCgpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gIUFyY2hpdmVVdGlsLmlzTnVsbE9yRW1wdHkobW9kdWxlLmdldEFsdEREKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXJldHVybiBtb2R1bGVGaWxlICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXJldHVybiBtb2R1bGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlzZXRFYXJGaWxlKChFQVJGaWxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFX0ZJTEU6Ci0JCQkJc2V0TW9kdWxlRmlsZSgoTW9kdWxlRmlsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXNldEVhckZpbGUoKEVBUkZpbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJaWYgKGdldEVhckZpbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLmdldEFsdERlcGxveW1lbnREZXNjcmlwdG9yKGdldE1vZHVsZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlpZiAoZ2V0RWFyRmlsZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldEVhckZpbGUoKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcihnZXRNb2R1bGUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0RUFSRmlsZSgpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKLQkJaWYgKGdldE1vZHVsZUZpbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRNb2R1bGVGaWxlKCkuZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCX0KLQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNzZXRVUkkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKSB7Ci0JCWlmIChnZXRNb2R1bGVGaWxlKCkgIT0gbnVsbCkKLQkJCWdldE1vZHVsZUZpbGUoKS5zZXRVUkkodXJpKTsKLQotCQlpZiAoZ2V0TW9kdWxlKCkgIT0gbnVsbCkKLQkJCWdldE1vZHVsZSgpLnNldFVyaSh1cmkpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNDbGllbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZVJlZiNpc0Nvbm5lY3RvcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3IoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzRUpCKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVSZWYjaXNXZWIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUFSRmlsZSBnZXRFYXJGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRSkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRUFSRmlsZSllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhckZpbGUoRUFSRmlsZSBuZXdFYXJGaWxlKSB7Ci0JCWlmIChuZXdFYXJGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEUgJiYgbmV3RWFyRmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VhckZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0VhckZpbGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RWFyRmlsZSkuZUludmVyc2VBZGQodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTLCBFQVJGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFYXJGaWxlLCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRSwgbmV3RWFyRmlsZSwgbmV3RWFyRmlsZSkpOwotCX0KLQotCXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQlpZiAobW9kdWxlICE9IG51bGwgJiYgbW9kdWxlLmVJc1Byb3h5KCkpIHsKLQkJCU1vZHVsZSBvbGRNb2R1bGUgPSBtb2R1bGU7Ci0JCQltb2R1bGUgPSAoTW9kdWxlKSBFY29yZVV0aWwucmVzb2x2ZShtb2R1bGUsIHRoaXMpOwotCQkJaWYgKG1vZHVsZSAhPSBvbGRNb2R1bGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEUsIG9sZE1vZHVsZSwgbW9kdWxlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlIGJhc2ljR2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZHVsZShNb2R1bGUgbmV3TW9kdWxlKSB7Ci0JCU1vZHVsZSBvbGRNb2R1bGUgPSBtb2R1bGU7Ci0JCW1vZHVsZSA9IG5ld01vZHVsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fTU9EVUxFLCBvbGRNb2R1bGUsIG1vZHVsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUywgRUFSRmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZHVsZUZpbGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNb2R1bGVGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXJldHVybiBnZXRFYXJGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZHVsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1vZHVsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGlucHV0IHN0cmVhbSBmcm9tIHRoZSAicmVzb3VyY2VzIHBhdGgiIG9mIGVpdGhlciB0aGUgTW9kdWxlRmlsZSwgaWYgdGhlIG1vZHVsZSBkb2VzCi0JICogbm90IHVzZSBhbHQtZGQsIG9yIGZyb20gdGhlIGFsdFJvb3Qgb2YgdGhlIG1vZHVsZSwgZm91bmQgaW4gdGhlIHJlc291cmNlcyBwYXRoIG9mIHRoZSBFQVIKLQkgKiAKLQkgKiBAc2VlIExvYWRTdHJhdGVneSNnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodXNlc0FsdEREKCkpCi0JCQlyZXR1cm4gZ2V0QWx0UmVzb3VyY2VJbnB1dFN0cmVhbSh1cmkpOwotCQlyZXR1cm4gZ2V0TG9jYWxSZXNvdXJjZUlucHV0U3RyZWFtKHVyaSk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldExvY2FsUmVzb3VyY2VJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljaGVja01vZHVsZUZpbGUoKTsKLQkJcmV0dXJuIG1vZHVsZUZpbGUuZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbSh1cmkpOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBbHRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrRUFSRmlsZSgpOwotCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLmdldFJlc291cmNlSW5wdXRTdHJlYW0odXJpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2dldFVyaSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCXJldHVybiBtb2R1bGUuZ2V0VXJpKCk7Ci0JCWlmIChtb2R1bGVGaWxlICE9IG51bGwpCi0JCQlyZXR1cm4gbW9kdWxlRmlsZS5nZXRVUkkoKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNnZXRBbHRNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldEFsdE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7Ci0JCWNoZWNrRUFSRmlsZSgpOwotCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLmdldE1vZlJlc291cmNlKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0TG9jYWxNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldExvY2FsTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJY2hlY2tNb2R1bGVGaWxlKCk7Ci0JCXJldHVybiBtb2R1bGVGaWxlLmdldE1vZlJlc291cmNlKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2R1bGVSZWYjZ2V0TW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRNb2ZSZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQlpZiAodXNlc0FsdEREKCkpCi0JCQlyZXR1cm4gZ2V0QWx0TW9mUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIGdldExvY2FsTW9mUmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZHVsZVJlZiNtYWtlQWx0TW9mUmVzb3VyY2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBtYWtlQWx0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWNoZWNrRUFSRmlsZSgpOwotCQlyZXR1cm4gZ2V0RWFyRmlsZSgpLm1ha2VNb2ZSZXNvdXJjZSh1cmkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRUFSRmlsZSgpIHsKLQkJaWYgKGdldEVhckZpbGUoKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNb2R1bGVfbm90X2luX0VBUiIsIG5ldyBPYmplY3RbXXtnZXRVcmkoKX0pKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlUmVmI21ha2VMb2NhbE1vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZUxvY2FsTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWNoZWNrTW9kdWxlRmlsZSgpOwotCQlyZXR1cm4gbW9kdWxlRmlsZS5tYWtlTW9mUmVzb3VyY2UodXJpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrTW9kdWxlRmlsZSgpIHsKLQkJZ2V0TW9kdWxlRmlsZSgpOwotCQlpZiAobW9kdWxlRmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE5vTW9kdWxlRmlsZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTW9kdWxlX2ZpbGVfZG9lc19ub3RfZXhpc3RfMiIsIG5ldyBPYmplY3RbXXtnZXRVcmkoKX0pKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShNb2R1bGUgbW9kdWxlRGVzY3JpcHRvciwgRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQV9maWxlX2RvZXNfbm90X2V4aXN0X2Zvcl9tb2R1bGUiLCBuZXcgT2JqZWN0W117bW9kdWxlRGVzY3JpcHRvci5nZXRVcmkoKX0pOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgTm9Nb2R1bGVGaWxlRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCS8vQWRkZWQgZm9yIGRlZmVjdCAxMTM5MjkKLQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJU3RyaW5nIHR5cGUgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTW9kdWxlX2ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobW9kdWxlRGVzY3JpcHRvci5pc1dlYk1vZHVsZSgpICYmICFhRmlsZS5pc1dBUkZpbGUoKSkgewotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJdHlwZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBX1dBUl9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChtb2R1bGVEZXNjcmlwdG9yLmlzRWpiTW9kdWxlKCkgJiYgIWFGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl0eXBlID0gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX0VKQl9KQVJfZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobW9kdWxlRGVzY3JpcHRvci5pc0phdmFNb2R1bGUoKSAmJiAhYUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJdHlwZSA9IENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBbl9BcHBsaWNhdGlvbl9DbGllbnRfSkFSX2ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG1vZHVsZURlc2NyaXB0b3IuaXNDb25uZWN0b3JNb2R1bGUoKSAmJiAhYUZpbGUuaXNSQVJGaWxlKCkpIHsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCXR5cGUgPSBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQV9SQVJfZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoIWFGaWxlLmlzTW9kdWxlRmlsZSgpKQotCQkJaXNWYWxpZCA9IGZhbHNlOwotCi0JCWlmIChpc1ZhbGlkKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBlYXJVcmkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0RWFyRmlsZSgpICE9IG51bGwpCi0JCQllYXJVcmkgPSBnZXRFYXJGaWxlKCkuZ2V0VVJJKCk7Ci0JCVN0cmluZyBtZXNzYWdlID0gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZpbGVfbm90X2NvcnJlY3RfdHlwZSIsIG5ldyBPYmplY3RbXXthRmlsZS5nZXRVUkkoKSwgZWFyVXJpLCB0eXBlfSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBNb2R1bGVSZWYjbWFrZU1vZlJlc291cmNlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgbWFrZU1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAodXNlc0FsdEREKCkpCi0JCQlyZXR1cm4gbWFrZUFsdE1vZlJlc291cmNlKHVyaSk7Ci0JCXJldHVybiBtYWtlTG9jYWxNb2ZSZXNvdXJjZSh1cmkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SQVJGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SQVJGaWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGQyM2UxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUkFSRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUkFSRmlsZUltcGwgZXh0ZW5kcyBNb2R1bGVGaWxlSW1wbCBpbXBsZW1lbnRzIFJBUkZpbGUgewotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSA8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3IgZGVwbG95bWVudERlc2NyaXB0b3IgPSBudWxsOwotCi0JcHVibGljIFJBUkZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRSQVJGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBhZGRDb3B5Q2xhc3MoRmlsZSBhRmlsZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlpZiAoYUZpbGUuaXNSZWFkT25seURpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiYWRkX2NvcHlfY2xhc3NfZGlyX0VYQ18iLCAobmV3IE9iamVjdFtde2FGaWxlLmdldFVSSSgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJNZXRob2QgYWRkQ29weUNsYXNzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yaWVzIDoiCi0JCXJldHVybiBhZGRDb3B5RmlsZUFkZGluZ1ByZWZpeChhRmlsZSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGFkZENvcHlGaWxlQWRkaW5nUHJlZml4KEZpbGUgYUZpbGUsIFN0cmluZyB1cmlQcmVmaXgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQlTdHJpbmcgc3dpenpsZWRVcmkgPSBhRmlsZS5nZXRVUkkoKTsKLQkJaWYgKCFzd2l6emxlZFVyaS5zdGFydHNXaXRoKHVyaVByZWZpeCkpIHsKLQkJCXN3aXp6bGVkVXJpID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKHVyaVByZWZpeCwgc3dpenpsZWRVcmksICcvJyk7Ci0JCX0KLQkJY2hlY2tBZGRWYWxpZChzd2l6emxlZFVyaSk7Ci0JCUZpbGUgY29weSA9IGNvcHkoYUZpbGUpOwotCQljb3B5LnNldFVSSShzd2l6emxlZFVyaSk7Ci0JCWdldEZpbGVzKCkuYWRkKGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneUZvckNvbm5lY3RvckRpcmVjdG9yeShqYXZhLmlvLkZpbGUgZGlyLCBpbnQgZXhwYW5zaW9uRmxhZ3MpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgZXhwYW5zaW9uRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdFRvQ29ubmVjdG9yRGlyZWN0b3J5KGphdmEubGFuZy5TdHJpbmcgYVVyaSwgaW50IGV4cGFuc2lvbkZsYWdzKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlqYXZhLmlvLkZpbGUgYURpciA9IG5ldyBqYXZhLmlvLkZpbGUoYVVyaSk7Ci0JCWlmIChnZXRMb2FkU3RyYXRlZ3koKS5pc1VzaW5nKGFEaXIpKQotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFeHRyYWN0X2Rlc3RpbmF0aW9uX2lzX3RoZV9FWENfIikpOyAvLyROT04tTkxTLTEkID0gIkV4dHJhY3QgZGVzdGluYXRpb24gaXMgdGhlIHNhbWUgcGF0aCBhcyBzb3VyY2UgZmlsZSIKLQotCQl0cnkgewotCQkJU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kgPSBjcmVhdGVTYXZlU3RyYXRlZ3lGb3JDb25uZWN0b3JEaXJlY3RvcnkoYURpciwgZXhwYW5zaW9uRmxhZ3MpOwotCQkJc2F2ZShhU2F2ZVN0cmF0ZWd5KTsKLQkJCWFTYXZlU3RyYXRlZ3kuY2xvc2UoKTsKLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJlcnJvcl9zYXZpbmdfRVhDXyIsIChuZXcgT2JqZWN0W117dXJpfSkpLCBleCk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3Igc2F2aW5nICIKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLlJBUkZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIGZpbHRlckZpbGVzQnlQcmVmaXgoQXJjaGl2ZUNvbnN0YW50cy5SQVJfQ0xBU1NFU19VUkkpOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIC0KLQkgKiAgICAgICAgICAgICBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGNhbid0IG92ZXJyaWRlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGdlbmVyYXRlZAotCSAqICAgICAgICAgICAgIG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiB7Ci0JCUNvbm5lY3RvciBkZCA9IGRlcGxveW1lbnREZXNjcmlwdG9yOwotCQlpZiAoZGQgPT0gbnVsbCAmJiBjYW5MYXp5SW5pdGlhbGl6ZSgpKQotCQkJdHJ5IHsKLQkJCQlnZXRJbXBvcnRTdHJhdGVneSgpLmltcG9ydE1ldGFEYXRhKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbm5lY3RvciBiYXNpY0dldERlcGxveW1lbnREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuUkFSX0REX1VSSTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuV0FSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSZXNvdXJjZXMoKSB7Ci0JCVN0cmluZ1tdIHByZWZpeGVzID0ge0oyRUVDb25zdGFudHMuTUVUQV9JTkYsIEoyRUVDb25zdGFudHMuV0VCX0lORn07Ci0JCXJldHVybiBmaWx0ZXJGaWxlc1dpdGhvdXRQcmVmaXgocHJlZml4ZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRGVwbG95ZW1lbnREZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFN0YW5kYXJkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JBUkZpbGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvcihYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlKY2FQYWNrYWdlIHAgPSAoSmNhUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKTsKLQkJSmNhRmFjdG9yeSBmY3QgPSBwLmdldEpjYUZhY3RvcnkoKTsKLQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IGZjdC5jcmVhdGVDb25uZWN0b3IoKTsKLQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoY29ubmVjdG9yKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoY29ubmVjdG9yKTsKLQkJcmV0dXJuIGNvbm5lY3RvcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnREZXNjcmlwdG9yKENvbm5lY3RvciBsKSB7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yID0gbDsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldExhc3RNb2RpZmllZCgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldFNpemUoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzRGlyZWN0b3J5RW50cnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIGdldE9yaWdpbmFsVVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIHR5cGVzICE9IG51bGwgJiYgIXR5cGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlzZXRMYXN0TW9kaWZpZWQoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCWdldFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKENvbm5lY3RvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXVuc2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fU0laRToKLQkJCQl1bnNldFNpemUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJdW5zZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSShPUklHSU5BTF9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKENvbm5lY3RvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIENsYXNzTG9hZGVyIGNyZWF0ZUR5bmFtaWNDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewotCQlyZXR1cm4gbmV3IFJhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIodGhpcywgcGFyZW50Q2wsIGV4dHJhQ2wpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SZWFkT25seURpcmVjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUmVhZE9ubHlEaXJlY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTM2MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SZWFkT25seURpcmVjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seURpcmVjdG9yeUltcGwgZXh0ZW5kcyBDb250YWluZXJJbXBsIGltcGxlbWVudHMgUmVhZE9ubHlEaXJlY3RvcnkgewotCi0JcHVibGljIFJlYWRPbmx5RGlyZWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVhZE9ubHlEaXJlY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19DT05UQUlORVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0ZJTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpbGVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19DT05UQUlORVIsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19MQVNUX01PRElGSUVEOgotCQkJCXJldHVybiBuZXcgTG9uZyhnZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX1NJWkU6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldFNpemUoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlyZXR1cm4gaXNEaXJlY3RvcnlFbnRyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBnZXRPcmlnaW5hbFVSSSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0ZJTEVTOgotCQkJCXJldHVybiBnZXRGaWxlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19MQVNUX01PRElGSUVEOgotCQkJCXNldExhc3RNb2RpZmllZCgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoKExvbmcpbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fVVJJOgotCQkJCXNldFVSSShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fTEFTVF9NT0RJRklFRDoKLQkJCQl1bnNldExhc3RNb2RpZmllZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fU0laRToKLQkJCQl1bnNldFNpemUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQl1bnNldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoT1JJR0lOQUxfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUjoKLQkJCQlzZXRDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SRUFEX09OTFlfRElSRUNUT1JZX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzU2V0RGlyZWN0b3J5RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fT1JJR0lOQUxfVVJJOgotCQkJCXJldHVybiBPUklHSU5BTF9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG9yaWdpbmFsVVJJICE9IG51bGwgOiAhT1JJR0lOQUxfVVJJX0VERUZBVUxULmVxdWFscyhvcmlnaW5hbFVSSSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUllfX0NPTlRBSU5FUjoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWV9fRklMRVM6Ci0JCQkJcmV0dXJuIGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpbGUoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7Ci0JCWdldEZpbGVzKCk7Ci0JCXJldHVybiBnZXRGaWxlSW5kZXgoKS5jb250YWluc0tleShhVXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb250YWluc0ZpbGVJblJvb3RPclN1YmRpcmVjdG9yeSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpbGVJblNlbGZPclN1YmRpcmVjdG9yeShqYXZhLmxhbmcuU3RyaW5nIGFVcmkpIHsKLQkJcmV0dXJuIGdldExvYWRTdHJhdGVneSgpLmNvbnRhaW5zKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIGdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoIWNvbnRhaW5zRmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KGFVcmkpKQotCQkJdGhyb3cgbmV3IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGFVcmkpOwotCi0JCWlmIChjb250YWluc0ZpbGUoYVVyaSkpCi0JCQlyZXR1cm4gZ2V0RmlsZShhVXJpKTsKLQotCQlMaXN0IHN1YmRpcnMgPSBnZXRSZWFkT25seURpcmVjdG9yaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViZGlycy5zaXplKCk7IGkrKykgewotCQkJUmVhZE9ubHlEaXJlY3Rvcnkgc3ViZGlyID0gKFJlYWRPbmx5RGlyZWN0b3J5KSBzdWJkaXJzLmdldChpKTsKLQkJCWlmIChzdWJkaXIuY29udGFpbnNGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoYVVyaSkpCi0JCQkJcmV0dXJuIHN1YmRpci5nZXRGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoYVVyaSk7Ci0JCX0KLQkJdGhyb3cgbmV3IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBmbGF0IGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyBjb250YWluZWQgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIHN1YmRpcmVjdG9yaWVzLCB3aXRoIHRoZQotCSAqIGRpcmVjdG9yaWVzIGZpbHRlcmVkIG91dCwgYXMgdGhlIGxpc3Qgd291bGQgYXBwZWFyIGluIGFuIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXNSZWN1cnNpdmUoKSB7Ci0JCUxpc3QgYWxsRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZXNMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXNMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQkJYWxsRmlsZXMuYWRkQWxsKCgoUmVhZE9ubHlEaXJlY3RvcnkpIGFGaWxlKS5nZXRGaWxlc1JlY3Vyc2l2ZSgpKTsKLQkJCWVsc2UKLQkJCQlhbGxGaWxlcy5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiBhbGxGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWx0ZXJlZCBsaXN0IG9uIHRoZSBmaWxlcyB3aXRoIGp1c3QgdGhlIGluc3RhbmNlcyBvZiBSZWFkT25seURpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlYWRPbmx5RGlyZWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZXNMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXNMaXN0LmdldChpKTsKLQkJCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQkJZmlsdGVyZWQuYWRkKGFGaWxlKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyZWQ7Ci0JfQotCi0JLyoqCi0JICogaXNSZWFkT25seURpcmVjdG9yeSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzU2NzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDQvMDAgNToyNDo0NCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHNpbmdsZXRvbjsKLQotCS8qKgotCSAqIENvbW1vbkFyY2hpdmVGYWN0b3J5RGVzY3JpbWluYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjb252ZXJ0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBUaGlzIG5ldmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0JICogICAgICBpbXBsZW1lbnRlci4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBUaGlzIG5ldmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0JICogICAgICBpbXBsZW1lbnRlci4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG51bGwgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBnZXQgY2FsbGVkIGF0IHRoaXMgbGV2ZWwKLQkgKiAKLQkgKiBAc2VlIEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvciNnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzaW5nbGV0b24gPSBuZXcgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwoKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDlhY2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA0LzAwIDU6MjQ6NDQgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgc2luZ2xldG9uOwotCi0JLyoqCi0JICogQ29tbW9uQXJjaGl2ZUZhY3RvcnlEZXNjcmltaW5hdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJamF2YS51dGlsLkxpc3QgdGhlQ2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQgPSAoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yKSB0aGVDaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoY2hpbGQuY2FuSW1wb3J0KGFuQXJjaGl2ZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjb252ZXJ0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBhbkFyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBUaGlzIG5ldmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0JICogICAgICBpbXBsZW1lbnRlci4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLQkgKiAgICAgIGltcGxlbWVudGVyLgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBUaGlzIG5ldmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0JICogICAgICBpbXBsZW1lbnRlci4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG51bGwgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBnZXQgY2FsbGVkIGF0IHRoaXMgbGV2ZWwKLQkgKiAKLQkgKiBAc2VlIEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvciNnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQlTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJamF2YS51dGlsLkxpc3QgdGhlQ2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgY2hpbGQgPSAoQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yKSB0aGVDaGlsZHJlbi5nZXQoaSk7Ci0JCQltZXNzYWdlLmFwcGVuZChjaGlsZC5nZXRVbmFibGVUb09wZW5NZXNzYWdlKCkpOwotCQkJbWVzc2FnZS5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlhZGRDaGlsZChFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5nZXREaXNjcmltaW5hdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yI29wZW5BcmNoaXZlKEFyY2hpdmUpCi0JICovCi0JcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgcmVzdWx0ID0gc3VwZXIub3BlbkFyY2hpdmUoYW5BcmNoaXZlKTsKLQkJaWYgKHJlc3VsdCA9PSBhbkFyY2hpdmUpCi0JCQkvL0NvdWxkbid0IGNvbnZlcnQKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzaW5nbGV0b24gPSBuZXcgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dBUkZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZGFiMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XQVJGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5XYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdBUkZpbGVJbXBsIGV4dGVuZHMgTW9kdWxlRmlsZUltcGwgaW1wbGVtZW50cyBXQVJGaWxlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBXZWJBcHAgZGVwbG95bWVudERlc2NyaXB0b3IgPSBudWxsOwotCXByb3RlY3RlZCBMaXN0IHNvdXJjZUZpbGVzOwotCi0JcHVibGljIFdBUkZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRXQVJGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLldBUkZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBhZGRDb3B5Q2xhc3MoRmlsZSBhRmlsZSkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWlmIChhRmlsZS5pc1JlYWRPbmx5RGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJhZGRfY29weV9jbGFzc19kaXJfRVhDXyIsIChuZXcgT2JqZWN0W117YUZpbGUuZ2V0VVJJKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIk1ldGhvZCBhZGRDb3B5Q2xhc3Mgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3JpZXMgOiIKLQkJcmV0dXJuIGFkZENvcHlGaWxlQWRkaW5nUHJlZml4KGFGaWxlLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgYWRkQ29weUZpbGVBZGRpbmdQcmVmaXgoRmlsZSBhRmlsZSwgU3RyaW5nIHVyaVByZWZpeCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzd2l6emxlZFVyaSA9IGFGaWxlLmdldFVSSSgpOwotCQlpZiAoIXN3aXp6bGVkVXJpLnN0YXJ0c1dpdGgodXJpUHJlZml4KSkgewotCQkJc3dpenpsZWRVcmkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkodXJpUHJlZml4LCBzd2l6emxlZFVyaSwgJy8nKTsKLQkJfQotCQljaGVja0FkZFZhbGlkKHN3aXp6bGVkVXJpKTsKLQkJRmlsZSBjb3B5ID0gY29weShhRmlsZSk7Ci0JCWNvcHkuc2V0VVJJKHN3aXp6bGVkVXJpKTsKLQkJZ2V0RmlsZXMoKS5hZGQoY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIEZpbGUgYWRkQ29weUxpYihGaWxlIGFGaWxlKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmlzUmVhZE9ubHlEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImFkZF9jb3B5X2xpYl9kaXJfRVhDXyIsIChuZXcgT2JqZWN0W117YUZpbGUuZ2V0VVJJKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIk1ldGhvZCBhZGRDb3B5TGliIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yaWVzIDoiCi0JCXJldHVybiBhZGRDb3B5RmlsZUFkZGluZ1ByZWZpeChhRmlsZSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBjcmVhdGVMaWJDbGFzc3BhdGhFbnRyeShTdHJpbmcgbGliUGF0aCkgewotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjcmVhdGVSdW50aW1lQ2xhc3NwYXRoRW50cnkobGliUGF0aCk7Ci0JCWVudHJ5LnNldFdhckZpbGUodGhpcyk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHkgZm9yIGJ1aWxkaW5nIHRoZSBydW50aW1lIGNsYXNzIHBhdGgKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3Qgb2YgU3RyaW5ncywgdGhlIGFic29sdXRlIHBhdGhzIG9mIGFsbCBmaWxlIGVudHJpZXMgKG5vIGRpcmVjdG9yaWVzKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEFsbEZpbGVFbnRyaWVzUmVjdXJzaXZlKGphdmEuaW8uRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCkgewotCQlpZiAoIWFGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIGFMaXN0OwotCQkvL21vZGlmaWVkIGZvciBib3RwIDEyNjE0MCAwNS4yOS4wMgotCQlTdHJpbmcgbmFtZSA9IGFGaWxlLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUucmVnaW9uTWF0Y2hlcyh0cnVlLCBuYW1lLmxlbmd0aCgpIC0gNCwgIi5qYXIiLCAwLCA0KSkgey8vJE5PTi1OTFMtMSQKLQkJCWFMaXN0LmFkZChhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0gZWxzZSBpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJamF2YS5pby5GaWxlW10gY2hpbGRyZW4gPSBhRmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlnZXRBbGxGaWxlRW50cmllc1JlY3Vyc2l2ZShjaGlsZHJlbltpXSwgYUxpc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuV0FSRmlsZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDbGFzc2VzKCkgewotCQlyZXR1cm4gZmlsdGVyRmlsZXNCeVByZWZpeChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIGlzIGEgcnVudGltZSBleGNlcHRpb24sIGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCi0JICogICAgICAgICAgICAgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uIHsKLQkJV2ViQXBwIGRkID0gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwotCQlpZiAoZGQgPT0gbnVsbCAmJiBjYW5MYXp5SW5pdGlhbGl6ZSgpKQotCQkJdHJ5IHsKLQkJCQlnZXRJbXBvcnRTdHJhdGVneSgpLmltcG9ydE1ldGFEYXRhKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24oZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSwgZSk7Ci0JCQl9Ci0JCXJldHVybiB0aGlzLmdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldExpYnMoKSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlc0J5UHJlZml4KEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGliQXJjaGl2ZXMoKSB7Ci0JCXJldHVybiBmaWx0ZXJGaWxlcyhBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJLCBuZXcgU3RyaW5nW117ImphciIsICJ6aXAifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5XQVJGaWxlCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFJlc291cmNlcygpIHsKLQkJU3RyaW5nW10gcHJlZml4ZXMgPSB7SjJFRUNvbnN0YW50cy5NRVRBX0lORiwgSjJFRUNvbnN0YW50cy5XRUJfSU5GfTsKLQkJcmV0dXJuIGZpbHRlckZpbGVzV2l0aG91dFByZWZpeChwcmVmaXhlcyk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiBmcm9tIHN1cGVyY2xhc3MgdG8gaW5jbHVkZSB0aGUgY2xhc2VzZXMgYW5kIGxpYnMgb2YgYSBXQVJGaWxlIFRoZXJlIGFsc28gaXMgYW4KLQkgKiBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhbiBleHBsb2RlZCB3YXIgZmlsZSBUaGUgZm9sbG93aW5nIGlzIHdoYXQgc2hvdWxkIGJlIHJldHVybmVkOgotCSAqIAotCSAqIDEpIFdBUiBkaXJlY3RvcnkgKyAvV0VCLUlORi9jbGFzc2VzIDIpIGFsbCBKQVIgZmlsZXMgY29udGFpbmVkIGluIFtXQVIgZGlyZWN0b3J5ICsKLQkgKiAvV0VCLUlORi9saWJdIDMpIFdBUiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0TG9jYWxSdW50aW1lQ2xhc3NQYXRoKCkgewotCi0JCVN0cmluZyBhYnNvbHV0ZVBhdGg7Ci0JCXRyeSB7Ci0JCQlhYnNvbHV0ZVBhdGggPSBnZXRMb2FkU3RyYXRlZ3koKS5nZXRCaW5hcmllc1BhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5WzBdOwotCQl9Ci0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChnZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmcgY2xhc3Nlc1BhdGggPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShhYnNvbHV0ZVBhdGgsIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKLQkJCWVudHJpZXMuYWRkKGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShjbGFzc2VzUGF0aCkpOwotCQkJYWRkV2ViTGlicyhhYnNvbHV0ZVBhdGgsIGVudHJpZXMpOwotCQl9Ci0KLQkJZW50cmllcy5hZGQoY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KGFic29sdXRlUGF0aCkpOwotCQlyZXR1cm4gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoQXRUaGlzTGV2ZWwoKSB7Ci0KLQkJU3RyaW5nIGFic29sdXRlUGF0aCA9IGludGVybmFsR2V0QmluYXJpZXNQYXRoKCk7Ci0JCWlmIChhYnNvbHV0ZVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBlbXB0eUNsYXNzcGF0aCgpOwotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBtZkVudHJpZXMgPSBzdXBlci5nZXREZXBlbmRlbmN5Q2xhc3NQYXRoQXRUaGlzTGV2ZWwoKTsKLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQllbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1mRW50cmllcykpOwotCi0JCXJldHVybiAoUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2ViTGlicyhTdHJpbmcgYWJzb2x1dGVQYXRoLCBMaXN0IGVudHJpZXMpIHsKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJICogT3B0aW1pemF0aW9uKioqKioqKioqKiogV2UgY291bGQgaGF2ZSB1c2VkIHRoZSBoZWxwZXIgZ2V0bGlicyBoZXJlOyBob3dldmVyLCB0aGF0IGNvdWxkCi0JCSAqIGRyYWcgZG93biBwZXJmb3JtYW5jZSBhcyB0aGUgZnVsbCBmaWxlIGxpc3Qgd291bGQgaGF2ZSB0byBnZXQgYnVpbHQsIGFuZCB0aGlzIGlzIHJ1bnRpbWU7Ci0JCSAqIGlmIHRoZSBjbGFzc2VzIHBvcnRpb24gaXMgaHVnZSB0aGVuIGJ1aWxkaW5nIHRoZSBmaWxlIGxpc3Qgd291bGQgYmUgc2xvdzsgbW9yZW92ZXIsIHdlCi0JCSAqIHdvdWxkIHRoZW4gaGF2ZSB0byBjbGVhciB0aGUgaW5kZXggZnJvbSB0aGlzIHdhciBmaWxlLiB0aGVyZWZvcmUsIHdlJ2xsIGRvIGEgbGl0dGxlIGV4dHJhCi0JCSAqIHdvcmsgdG8gZ2V0IHRoZSBsaWJzCi0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoYWJzb2x1dGVQYXRoLCBBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSk7Ci0JCUxpc3QgbGlicyA9IGdldEFsbEZpbGVFbnRyaWVzUmVjdXJzaXZlKGFGaWxlLCBuZXcgQXJyYXlMaXN0KCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBsaWJQYXRoID0gKFN0cmluZykgbGlicy5nZXQoaSk7Ci0JCQllbnRyaWVzLmFkZChjcmVhdGVMaWJDbGFzc3BhdGhFbnRyeShsaWJQYXRoKSk7Ci0JCX0KLQkJYWRkTG9vc2VMaWJzVG9SdW50aW1lQ2xhc3NwYXRoKGVudHJpZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExvb3NlTGlic1RvUnVudGltZUNsYXNzcGF0aChMaXN0IGVudHJpZXMpIHsKLQkJTG9vc2VXQVJGaWxlIGxvb3NlID0gKExvb3NlV0FSRmlsZSkgZ2V0TG9hZFN0cmF0ZWd5KCkuZ2V0TG9vc2VBcmNoaXZlKCk7Ci0JCWlmIChsb29zZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUxpc3QgbG9vc2VMaWJzID0gbG9vc2UuZ2V0TG9vc2VMaWJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9vc2VMaWJzLnNpemUoKTsgaSsrKSB7Ci0JCQlMb29zZUxpYnJhcnkgbGliID0gKExvb3NlTGlicmFyeSkgbG9vc2VMaWJzLmdldChpKTsKLQkJCWVudHJpZXMuYWRkKGNyZWF0ZUxpYkNsYXNzcGF0aEVudHJ5KGxpYi5nZXRCaW5hcmllc1BhdGgoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FsY3VsYXRlU291cmNlQ2FuZGlkYXRlRmlsZXMoKSB7Ci0JCUxpc3QgZmlsZXNMaXN0ID0gZ2V0RmlsZXMoKTsKLQkJTGlzdCByZXRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmlsZXNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmlsZSBmaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGFVcmkgPSBmaWxlLmdldFVSSSgpOwotCQkJaWYgKGFVcmkuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLldFQl9JTkYpICYmICFhVXJpLnN0YXJ0c1dpdGgoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSkpCi0JCQkJcmV0RmlsZXMuYWRkKGZpbGUpOwotCQl9Ci0JCXJldHVybiByZXRGaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTb3VyY2VDYW5kaWRhdGVGaWxlcygpIHsKLQkJaWYgKHNvdXJjZUZpbGVzID09IG51bGwpIHsKLQkJCXNvdXJjZUZpbGVzID0gY2FsY3VsYXRlU291cmNlQ2FuZGlkYXRlRmlsZXMoKTsKLQkJfQotCQlyZXR1cm4gc291cmNlRmlsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBtYWtlUmVsYXRpdmUoU3RyaW5nIHBhdGhTdHJpbmcsIFN0cmluZyByZWxUb1BhdGhTdHJpbmcpIHsKLQotCQlpZiAocGF0aFN0cmluZy5zdGFydHNXaXRoKHJlbFRvUGF0aFN0cmluZykpCi0JCQlyZXR1cm4gQXJjaGl2ZVV0aWwudHJ1bmNhdGVGcm9tRnJvbnRJZ25vcmVDYXNlKHBhdGhTdHJpbmcsIHJlbFRvUGF0aFN0cmluZyk7Ci0KLQkJcmV0dXJuIHBhdGhTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VyY2UgZmlsZSB0aGF0IG1hdGNoZXMgdGhlIG91dHB1dCBmaWxlIHBhc3NlZCBpbgotCSAqIAotCSAqIEBwYXJhbSBhQ2xhc3NGaWxlCi0JICogICAgICAgICAgICBUaGUgLmNsYXNzIGZpbGUgb3Igb3RoZXIgb3V0cHV0IGZpbGUgdG8gZmluZCB0aGUgc291cmNlIGZvcgotCSAqIEByZXR1cm4gU3RyaW5nIFRoZSBtYXRjaGluZyBzb3VyY2UuIE51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc291cmNlIGZvdW5kCi0JICovCi0JcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZShGaWxlIGFDbGFzc0ZpbGUpIHsKLQkJTGlzdCBzb3VyY2VGaWxlc0xpc3QgPSBnZXRTb3VyY2VDYW5kaWRhdGVGaWxlcygpOwotCQlTdHJpbmcgY2xhc3NVUkkgPSBhQ2xhc3NGaWxlLmdldFVSSSgpOwotCQlTdHJpbmcgY29udmVydGVkQ2xhc3NVUkkgPSBjbGFzc1VSSTsKLQkJaWYgKGNsYXNzVVJJLmVuZHNXaXRoKCIuY2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJY29udmVydGVkQ2xhc3NVUkkgPSBBcmNoaXZlVXRpbC5jbGFzc1VyaVRvSmF2YVVyaShhQ2xhc3NGaWxlLmdldFVSSSgpKTsKLQkJZWxzZSAKLQkJCXJldHVybiBudWxsOwotCQljb252ZXJ0ZWRDbGFzc1VSSSA9IG1ha2VSZWxhdGl2ZShjb252ZXJ0ZWRDbGFzc1VSSSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwotCQlpbnQgYmVzdExlbmd0aCA9IDMyNzY3OwotCQlGaWxlIGJlc3RNYXRjaCA9IG51bGw7Ci0JCUZpbGUgZmlsZSA9IG51bGw7Ci0JCVN0cmluZyBhVXJpID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlRmlsZXNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJZmlsZSA9IChGaWxlKSBpdGVyLm5leHQoKTsKLQkJCWFVcmkgPSBmaWxlLmdldFVSSSgpOwotCQkJaWYgKGFVcmkuZW5kc1dpdGgoY29udmVydGVkQ2xhc3NVUkkpICYmICFhVXJpLmVxdWFscyhjbGFzc1VSSSkpIHsKLQkJCQlpbnQgZXhjZXNzTGVuZ3RoID0gYVVyaS5sZW5ndGgoKSAtIGNvbnZlcnRlZENsYXNzVVJJLmxlbmd0aCgpOwotCQkJCWlmIChleGNlc3NMZW5ndGggPCBiZXN0TGVuZ3RoKSB7Ci0JCQkJCWJlc3RNYXRjaCA9IGZpbGU7Ci0JCQkJCWJlc3RMZW5ndGggPSBleGNlc3NMZW5ndGg7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiZXN0TWF0Y2g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEZXBsb3llbWVudERlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U3RhbmRhcmREZXBsb3ltZW50RGVzY3JpcHRvcigpIHRocm93cyBEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkgewotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV0FSRmlsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVdlYkFwcCB3ZWJBcHAgPSAoKFdlYmFwcGxpY2F0aW9uUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpKS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVXZWJBcHAoKTsKLQkJcmVzb3VyY2Uuc2V0SUQod2ViQXBwLCBKMkVFQ29uc3RhbnRzLldFQkFQUF9JRCk7Ci0JCXNldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKHdlYkFwcCk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdlYkFwcCk7Ci0JCXJldHVybiB3ZWJBcHA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95bWVudERlc2NyaXB0b3IoV2ViQXBwIGwpIHsKLQkJdGhpcy5zZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihsKTsKLQkJcmVwbGFjZVJvb3QoZ2V0TW9mUmVzb3VyY2VNYWtlSWZOZWNlc3NhcnkoZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSksIGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlyZXR1cm4gaXNTZXRMYXN0TW9kaWZpZWQoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGlzU2V0U2l6ZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fRElSRUNUT1JZX0VOVFJZOgotCQkJCXJldHVybiBpc1NldERpcmVjdG9yeUVudHJ5KCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIE9SSUdJTkFMX1VSSV9FREVGQVVMVCA9PSBudWxsID8gb3JpZ2luYWxVUkkgIT0gbnVsbCA6ICFPUklHSU5BTF9VUklfRURFRkFVTFQuZXF1YWxzKG9yaWdpbmFsVVJJKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXJldHVybiBsb2FkaW5nQ29udGFpbmVyICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19GSUxFUzoKLQkJCQlyZXR1cm4gZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fVFlQRVM6Ci0JCQkJcmV0dXJuIHR5cGVzICE9IG51bGwgJiYgIXR5cGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fTEFTVF9NT0RJRklFRDoKLQkJCQlzZXRMYXN0TW9kaWZpZWQoKChMb25nKW5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fU0laRToKLQkJCQlzZXRTaXplKCgoTG9uZyluZXdWYWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RJUkVDVE9SWV9FTlRSWToKLQkJCQlzZXREaXJlY3RvcnlFbnRyeSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJc2V0T3JpZ2luYWxVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fTE9BRElOR19DT05UQUlORVI6Ci0JCQkJc2V0TG9hZGluZ0NvbnRhaW5lcigoQ29udGFpbmVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0ZJTEVTOgotCQkJCWdldEZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fVFlQRVM6Ci0JCQkJZ2V0VHlwZXMoKS5jbGVhcigpOwotCQkJCWdldFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX1VSSToKLQkJCQlzZXRVUkkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19MQVNUX01PRElGSUVEOgotCQkJCXVuc2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fU0laRToKLQkJCQl1bnNldFNpemUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJdW5zZXREaXJlY3RvcnlFbnRyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX09SSUdJTkFMX1VSSToKLQkJCQlzZXRPcmlnaW5hbFVSSShPUklHSU5BTF9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0xPQURJTkdfQ09OVEFJTkVSOgotCQkJCXNldExvYWRpbmdDb250YWluZXIoKENvbnRhaW5lciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJc2V0Q29udGFpbmVyKChDb250YWluZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fRklMRVM6Ci0JCQkJZ2V0RmlsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX1RZUEVTOgotCQkJCWdldFR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6Ci0JCQkJc2V0RGVwbG95bWVudERlc2NyaXB0b3IoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldERlcGxveW1lbnREZXNjcmlwdG9yR2VuKCkgewotCQlpZiAoZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXBsb3ltZW50RGVzY3JpcHRvci5lSXNQcm94eSgpKSB7Ci0JCQlXZWJBcHAgb2xkRGVwbG95bWVudERlc2NyaXB0b3IgPSBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQkJCWRlcGxveW1lbnREZXNjcmlwdG9yID0gKFdlYkFwcCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZGVwbG95bWVudERlc2NyaXB0b3IpOwotCQkJaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG9sZERlcGxveW1lbnREZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUiwgb2xkRGVwbG95bWVudERlc2NyaXB0b3IsIGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbihXZWJBcHAgbmV3RGVwbG95bWVudERlc2NyaXB0b3IpIHsKLQkJV2ViQXBwIG9sZERlcGxveW1lbnREZXNjcmlwdG9yID0gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3RGVwbG95bWVudERlc2NyaXB0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1IsIG9sZERlcGxveW1lbnREZXNjcmlwdG9yLCBkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0NPTlRBSU5FUiwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fRklMRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0NPTlRBSU5FUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19GSUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVMsIENvbnRhaW5lci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVUkkoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0xBU1RfTU9ESUZJRUQ6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldExhc3RNb2RpZmllZCgpKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX1NJWkU6Ci0JCQkJcmV0dXJuIG5ldyBMb25nKGdldFNpemUoKSk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ESVJFQ1RPUllfRU5UUlk6Ci0JCQkJcmV0dXJuIGlzRGlyZWN0b3J5RW50cnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19PUklHSU5BTF9VUkk6Ci0JCQkJcmV0dXJuIGdldE9yaWdpbmFsVVJJKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19MT0FESU5HX0NPTlRBSU5FUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvYWRpbmdDb250YWluZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19DT05UQUlORVI6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lcigpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fRklMRVM6Ci0JCQkJcmV0dXJuIGdldEZpbGVzKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZXMoKTsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCXB1YmxpYyBDbGFzc0xvYWRlciBjcmVhdGVEeW5hbWljQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wpIHsKLQkJcmV0dXJuIG5ldyBXYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyKHRoaXMsIHBhcmVudENsLCBleHRyYUNsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OTI0NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLXB1YmxpYyBjbGFzcyBXZWJNb2R1bGVSZWZJbXBsIGV4dGVuZHMgTW9kdWxlUmVmSW1wbCBpbXBsZW1lbnRzIFdlYk1vZHVsZVJlZiwgTW9kdWxlUmVmIHsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFdlYk1vZHVsZVJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYk1vZHVsZVJlZigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19FQVJfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTLCBFQVJGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZHVsZUZpbGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNb2R1bGVGaWxlKCk7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlyZXR1cm4gZ2V0RWFyRmlsZSgpOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TW9kdWxlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TW9kdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXNldE1vZHVsZUZpbGUoKE1vZHVsZUZpbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXNldEVhckZpbGUoKEVBUkZpbGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX01PRFVMRToKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19NT0RVTEVfRklMRToKLQkJCQlzZXRNb2R1bGVGaWxlKChNb2R1bGVGaWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX0VBUl9GSUxFOgotCQkJCXNldEVhckZpbGUoKEVBUkZpbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XRUJfTU9EVUxFX1JFRl9fTU9EVUxFOgotCQkJCXNldE1vZHVsZSgoTW9kdWxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0VCX01PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgotCQkJCXJldHVybiBtb2R1bGVGaWxlICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19FQVJfRklMRToKLQkJCQlyZXR1cm4gZ2V0RWFyRmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGX19NT0RVTEU6Ci0JCQkJcmV0dXJuIG1vZHVsZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2ViTW9kdWxlUmVmI2dldFdlYkFwcCgpCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gewotCQlyZXR1cm4gKFdlYkFwcCkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlUmVmI2lzV2ViKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19IC8vV2ViTW9kdWxlUmVmSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJFeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTU5MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJFeHBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBleHBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMiBBcHBsaWNhdGlvbiBDbGllbnQKLSAqLwotcHVibGljIGNsYXNzIEFwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBBcHBDbGllbnQxMkV4cG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFwcENsaWVudDEyRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTUxYmU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBpbXBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMiBBcHBsaWNhdGlvbiBDbGllbnQKLSAqLwotcHVibGljIGNsYXNzIEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgotCQkgKi8KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJCXJldHVybiBuZXcgQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5hYmxlVG9PcGVuTWVzc2FnZSgpIHsKLQkJCXJldHVybiBnZXRYbWxERE1lc3NhZ2UoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFwcGxpY2F0aW9uX0NsaWVudF9KYXJfRmlsIiksIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkkpOyAvLyROT04tTkxTLTEkID0gIkFwcGxpY2F0aW9uIENsaWVudCBKYXIgRmlsZSIKLQkJfQotCi0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yOwotCi0JLyoqCi0JICogQXBwQ2xpZW50MjJJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvcigpLmNyZWF0ZUltcG9ydFN0cmF0ZWd5KG9sZCwgbmV3QXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBnZXRBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnRGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3IgPT0gbnVsbCkgewotCQkJZGlzY3JpbWluYXRvciA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGNsaWVudCA9IG51bGw7Ci0KLQkJY2xpZW50ID0gKEFwcGxpY2F0aW9uQ2xpZW50KSBwcmltTG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlKCkuc2V0RGVwbG95bWVudERlc2NyaXB0b3IoY2xpZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcmNoaXZlU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNhZDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FyY2hpdmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHN1cGVydHlwZSBmb3IgYWxsIHRoZSBhcmNoaXZlIHN0cmF0ZWdpZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZVN0cmF0ZWd5IHsKLQlwdWJsaWMgQXJjaGl2ZSBnZXRBcmNoaXZlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKEFyY2hpdmUgYXJjaGl2ZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcmNoaXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcmNoaXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTI0OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXJjaGl2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci0KLS8qKgotICogVGhpcyBhbiBhYnN0cmFjdCB0eXBlIG9mZiB3aGljaCBhbnkgaW1wbGVtZW50ZXJzIG9mIHRoZSBhcmNoaXZlIHN0cmF0ZWd5IGNhbiBzdWJjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFyY2hpdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBBcmNoaXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBBcmNoaXZlIGFyY2hpdmU7Ci0KLQkvKioKLQkgKiBBcmNoaXZlU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBnZXRBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlhcmNoaXZlID0gbmV3QXJjaGl2ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NTg3ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBzYXZlIGFuIGFyY2hpdmVzIGNvbnRlbnRzIHRvIGEgZGlyZWN0b3J5IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIFNhdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBTYXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBTdHJpbmcgZGlyZWN0b3J5TmFtZTsKLQlwcm90ZWN0ZWQgVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlcjsKLQkvKiogSW5kaWNhdGVzIHdoaWNoIHR5cGUgb2YgYXJjaGl2ZXMgc2hvdWxkIGJlIGV4cGFuZGVkICovCi0JcHJvdGVjdGVkIGludCBleHBhbnNpb25GbGFnczsKLQotCS8qKgotCSAqIERpcmVjdG9yeUR1bXBTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpcmVjdG9yeUR1bXBTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKFN0cmluZyBkaXJOYW1lLCBpbnQgZmxhZ3MpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGlyZWN0b3J5TmFtZShkaXJOYW1lKTsKLQkJc2V0RXhwYW5zaW9uRmxhZ3MoZmxhZ3MpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkRGlyZWN0b3J5U3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJU3RyaW5nIHVyaSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZ2V0RGlyZWN0b3J5TmFtZSgpLCAiIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwodXJpLCBnZXRFeHBhbnNpb25GbGFncygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzaG91bGRFeHBhbmQoYW5BcmNoaXZlKSkKLQkJCXJldHVybiBjcmVhdGVOZXN0ZWREaXJlY3RvcnlTdHJhdGVneShhbkFyY2hpdmUpOwotCQlyZXR1cm4gY3JlYXRlTmVzdGVkWmlwU3RyYXRlZ3koYW5BcmNoaXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRaaXBTdHJhdGVneShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKGFuQXJjaGl2ZS5nZXRVUkkoKSkpOwotCQlyZXR1cm4gbmV3IFppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwob3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8wMCAyOjI2OjM3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiBkaXJlY3RvcnlOYW1lOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDEwOjE4OjIxIEFNKQotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFeHBhbnNpb25GbGFncygpIHsKLQkJcmV0dXJuIGV4cGFuc2lvbkZsYWdzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oYVJlc291cmNlLmdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wOC8wMCA0OjUwOjMyIFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyIGdldFVyaUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlBcmNoaXZlVVJJQ29udmVydGVySW1wbCBjb252ZXJ0ZXIgPSBuZXcgQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwoZ2V0QXJjaGl2ZSgpLCBnZXREaXJlY3RvcnlOYW1lKCkpOwotCQljb252ZXJ0ZXIuc2V0T3V0cHV0RmlsZXBhdGgoZ2V0RGlyZWN0b3J5TmFtZSgpKTsKLQkJc2V0VXJpQ29udmVydGVyKGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBta2RpcnMoU3RyaW5nIGRpcmVjdG9yeVBhdGgpIHsKLQkJRmlsZSBhRGlyZWN0b3J5ID0gbmV3IEZpbGUoZ2V0RGlyZWN0b3J5TmFtZSgpICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgZGlyZWN0b3J5UGF0aCk7Ci0JCWFEaXJlY3RvcnkubWtkaXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QgYU1hbmlmZXN0KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCQlhTWFuaWZlc3Qud3JpdGUob3V0KTsKLQkJCW91dC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSwgaW94KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUgYUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgZW50cnlOYW1lID0gYUZpbGUuZ2V0VVJJKCk7Ci0JCWlmIChhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkpCi0JCQlta2RpcnMoZW50cnlOYW1lKTsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShlbnRyeU5hbWUpKTsKLQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmNvcHkoaW4sIG91dCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYUZpbGUuZ2V0VVJJKCksIGlveCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9mUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5zYXZlTW9mUmVzb3VyY2UoYVJlc291cmNlLCBvcyk7Ci0JCW9zLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMTUvMDAgMjoyNjozNyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGlyZWN0b3J5TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcmVjdG9yeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdEaXJlY3RvcnlOYW1lKSB7Ci0JCWRpcmVjdG9yeU5hbWUgPSBuZXdEaXJlY3RvcnlOYW1lOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDEwOjE4OjIxIEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHBhbnNpb25GbGFncwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5zaW9uRmxhZ3MoaW50IG5ld0V4cGFuc2lvbkZsYWdzKSB7Ci0JCWV4cGFuc2lvbkZsYWdzID0gbmV3RXhwYW5zaW9uRmxhZ3M7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDgvMDAgNDo1MDozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VXJpQ29udmVydGVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpQ29udmVydGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIgbmV3VXJpQ29udmVydGVyKSB7Ci0JCXVyaUNvbnZlcnRlciA9IG5ld1VyaUNvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRFeHBhbmQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQotCQlpbnQgZmxhZyA9IDA7Ci0KLQkJaWYgKGFuQXJjaGl2ZS5pc1dBUkZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9XQVJfRklMRVM7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0VBUkZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9FQVJfRklMRVM7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0VKQkphckZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9FSkJKQVJfRklMRVM7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc1JBUkZpbGUoKSkKLQkJCWZsYWcgPSBBcmNoaXZlLkVYUEFORF9SQVJfRklMRVM7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0FQUENMSUVOVF9GSUxFUzsKLQkJZWxzZQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0FSQ0hJVkVTOwotCi0JCXJldHVybiAoZ2V0RXhwYW5zaW9uRmxhZ3MoKSAmIGZsYWcpICE9IDA7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTQ5YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotLyoqCi0gKiBTcGVjaWFsaXplZCBsb2FkIHN0cmF0ZWd5IHRoYXQgcmVhZHMgZW50cmllcyBpbiBhbiBhcmNoaXZlIGZyb20gYSBkaXJlY3Rvcnkgb24gdGhlIGZpbGUgc3lzdGVtCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneSBleHRlbmRzIExvYWRTdHJhdGVneSB7Ci0JcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlVcmkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTA2MDJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWdSZWdpc3RlcjsKLQotCi0vKioKLSAqIExvYWQgc3RyYXRlZ3kgdXNlZCBmb3IgcmVhZGluZyBleHBhbmRpbmcgYXJjaGl2ZXM7IHR5cGljYWxseSBpbiBhIHJ1bm5pbmcgc2VydmVyIHRoaXMgd291bGQgYmUgYW4KLSAqIEVBUiBvciBXQVIsIGFsdGhvdWdoIGl0IGNhbiBiZSBhbnkgQXJjaGl2ZQotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsIHsKLQotCi0KLQlwdWJsaWMgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwoU3RyaW5nIGFEaXJlY3RvcnlVcmkpIHsKLQkJc3VwZXIoYURpcmVjdG9yeVVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBhRmlsZSwgamF2YS51dGlsLkxpc3QgYUxpc3QpIHsKLQkJYWRkRmlsZXMoYUZpbGUsIGFMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGdldERpcmVjdG9yeUZvckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKTsKLQl9Ci0KLQotCi0JcHVibGljIExvb3NlQXJjaGl2ZSBnZXRMb29zZUFyY2hpdmUoKSB7Ci0JCWlmIChsb29zZUFyY2hpdmUgPT0gbnVsbCAmJiBnZXRDb250YWluZXIoKS5pc0VBUkZpbGUoKSkgewotCQkJU3RyaW5nIG9zU3RyaW5nID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZ2V0Q29udGFpbmVyKCkuZ2V0VVJJKCkpOwotCQkJc2V0TG9vc2VBcmNoaXZlKExvb3NlQ29uZmlnUmVnaXN0ZXIuc2luZ2xldG9uKCkuZmluZExvb3NlQXBwbGljYXRpb24ob3NTdHJpbmcpKTsKLQkJfQotCQlyZXR1cm4gbG9vc2VBcmNoaXZlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI5MDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byByZWFkIGZpbGVzIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIGFuZCB0cmVhdCB0aGVtIGFzIGZpbGUKLSAqIGVudHJpZXMgaW4gYW4gYXJjaGl2ZQotICogCi0gKiBAc2VlIERpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3kKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBMb2FkU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneSB7Ci0JLyoqCi0JICogVGhlIHJvb3QgdXJpIGZyb20gd2hpY2ggYWxsIHJlbGF0aXZlIGZpbGVzIGVudHJpZXMgYXJlIGxvYWRlZDsgbXVzdCBwb2ludCB0byBhIHZhbGlkIGxvY2FsCi0JICogZGlyZWN0b3J5Ci0JICovCi0Jc3RhdGljIGJvb2xlYW4gSVNfQUlYID0gIkFJWCIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlVcmk7Ci0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5OyB0aGUgZGlyZWN0b3J5IHVyaSB3aXRoIHRoZSBzeXN0ZW0gZGVwZW5kZW50IGZpbGUgc2VwYXJhdG9yIHJlcGxhY2VkIGJ5IGEKLQkgKiBmb3J3YXJkIHNsYXNoCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlVcmlBc1ppcFN0cmluZzsKLQlwcm90ZWN0ZWQgc3RhdGljIGNoYXIgU0VQQVJBVE9SX0NIQVIgPSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQotCXB1YmxpYyBEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsKFN0cmluZyBhRGlyZWN0b3J5VXJpKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERpcmVjdG9yeVVyaShhRGlyZWN0b3J5VXJpKTsKLQkJU3RyaW5nIG5vcm1hbGl6ZWQgPSBudWxsOwotCQl0cnkgewotCQkJbm9ybWFsaXplZCA9IG5ldyBGaWxlKGFEaXJlY3RvcnlVcmkpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQlub3JtYWxpemVkID0gYURpcmVjdG9yeVVyaTsKLQkJfQotCQlzZXREaXJlY3RvcnlVcmlBc1ppcFN0cmluZyhub3JtYWxpemVkLnJlcGxhY2UoU0VQQVJBVE9SX0NIQVIsICcvJykpOwotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRGlyZWN0b3J5KGphdmEuaW8uRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlKGphdmEuaW8uRmlsZSBhRmlsZSwgTGlzdCBhTGlzdCkgewotCi0JCVN0cmluZyB1cmkgPSBnZXRVUklGcm9tKGFGaWxlKTsKLQkJaWYgKGNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzLmNvbnRhaW5zS2V5KHVyaSkpCi0JCQlyZXR1cm47Ci0KLQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBjRmlsZSA9IGNyZWF0ZUZpbGUodXJpKTsKLQkJY0ZpbGUuc2V0U2l6ZShhRmlsZS5sZW5ndGgoKSk7Ci0JCWNGaWxlLnNldExhc3RNb2RpZmllZChhRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCWFMaXN0LmFkZChjRmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmlsZXMoamF2YS5pby5GaWxlIGFEaXJlY3RvcnksIExpc3QgYUxpc3QpIHsKLQotCQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBhRGlyZWN0b3J5Lmxpc3QoKTsKLQkJaWYgKGZpbGVOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKGFEaXJlY3RvcnkuZ2V0UGF0aCgpLCBmaWxlTmFtZXNbaV0sIFNFUEFSQVRPUl9DSEFSKTsKLQkJCWlmIChmaWxlTmFtZXNbaV0gPT0gbnVsbCB8fCAoSVNfQUlYICYmICIuYmFja3VwIi5lcXVhbHMoZmlsZU5hbWVzW2ldKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoZmlsZU5hbWUpOwotCQkJaWYgKCFhRmlsZS5leGlzdHMoKSkKLQkJCQljb250aW51ZTsKLQkJCS8vVGhpcyBjb3VsZCBvY2N1ciBvbiBzb21lIHdpbmRvd3MgbWFjaGluZXMsIGVnIEM6XHBhZ2VmaWxlLnN5cwotCQkJLy90aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igc2Nhbm5pbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSIpOwotCQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkgJiYgIWlzQXJjaGl2ZShnZXRVUklGcm9tKGFGaWxlKSkpIHsKLQkJCQlhZGREaXJlY3RvcnkoYUZpbGUsIGFMaXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRkRmlsZShhRmlsZSwgYUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShnZXRGaWxlTmFtZUZyb20odXJpKSkuZXhpc3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS5pby5GaWxlIGdldERpcmVjdG9yeUZvckxpc3QoKTsKLQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERpcmVjdG9yeVVyaSgpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeVVyaTsKLQl9Ci0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXJlY3RvcnlVcmlBc1ppcFN0cmluZygpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeVVyaUFzWmlwU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gT1MgZmlsZW5hbWUgZnJvbSBhIHJlbGF0aXZlIHVyaQotCSAqLwotCS8vIFRPRE8gRml4IHRoZSB0eXBlIGNhc2luZyBpbiB2Ni4wCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlTmFtZUZyb20oU3RyaW5nIHVyaSkgewotCQlMb29zZUFyY2hpdmUgYUxvb3NlQXJjaGl2ZSA9IGdldExvb3NlQXJjaGl2ZSgpOwotCQlpZiAoYUxvb3NlQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCXN3aXRjaCAoYUxvb3NlQXJjaGl2ZS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OIDoKLQkJCQkJcmVzdWx0ID0gZ2V0VVJJRnJvbUxvb3NlQXJjaGl2ZXNJZkF2YWlsYWJsZSgoKExvb3NlQXBwbGljYXRpb24pIGFMb29zZUFyY2hpdmUpLmdldExvb3NlQXJjaGl2ZXMoKSwgdXJpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEUgOgotCQkJCQlyZXN1bHQgPSBnZXRVUklGcm9tTG9vc2VBcmNoaXZlc0lmQXZhaWxhYmxlKCgoTG9vc2VXQVJGaWxlKSBhTG9vc2VBcmNoaXZlKS5nZXRMb29zZUxpYnMoKSwgdXJpKTsKLQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCVN0cmluZyBuYW1lID0gdXJpOwotCQlpZiAoU0VQQVJBVE9SX0NIQVIgIT0gJy8nKQotCQkJbmFtZSA9IG5hbWUucmVwbGFjZSgnLycsIFNFUEFSQVRPUl9DSEFSKTsKLQkJcmV0dXJuIGdldERpcmVjdG9yeVVyaSgpICsgU0VQQVJBVE9SX0NIQVIgKyBuYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVSSUZyb21Mb29zZUFyY2hpdmVzSWZBdmFpbGFibGUoTGlzdCBsb29zZUFyY2hpdmVzLCBTdHJpbmcgdXJpKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbG9vc2VBcmNoaXZlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUxvb3NlQXJjaGl2ZSBsb29zZUFyY2hpdmVFbGVtZW50ID0gKExvb3NlQXJjaGl2ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAodXJpLmVxdWFscyhsb29zZUFyY2hpdmVFbGVtZW50LmdldFVyaSgpKSkKLQkJCQlyZXR1cm4gbG9vc2VBcmNoaXZlRWxlbWVudC5nZXRCaW5hcmllc1BhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmEuaW8uRmlsZSBkaXJlY3RvcnkgPSBnZXREaXJlY3RvcnlGb3JMaXN0KCk7Ci0JCWFkZEZpbGVzKGRpcmVjdG9yeSwgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShnZXRGaWxlTmFtZUZyb20odXJpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHJlbGF0aXZlIHVyaSBmcm9tIHRoZSBqYXZhLmlvLkZpbGUsIHRvIGJlIHVzZWQgZm9yIGEgZmlsZSBlbnRyeTsgdGhlIHNlcGFyYXRvciB3aWxsCi0JICogYmUgdGhlIHppcCBzdGFuZGFyZCAoZm9yd2FyZCBzbGFzaCAoIi8iKSkuCi0JICovCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVSSUZyb20oRmlsZSBhRmlsZSkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZWxhdGl2ZSA9IG51bGw7Ci0JCVN0cmluZyByb290ID0gZ2V0RGlyZWN0b3J5VXJpQXNaaXBTdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCW5hbWUgPSBhRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQlyZWxhdGl2ZSA9IG1ha2VSZWxhdGl2ZShuYW1lLCByb290KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQluYW1lID0gbnVsbDsKLQkJfQotCQlpZiAocmVsYXRpdmUgPT0gbnVsbCkgewotCQkJbmFtZSA9IGFGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJcmVsYXRpdmUgPSBtYWtlUmVsYXRpdmUobmFtZSwgcm9vdCk7Ci0JCX0KLQkJaWYgKHJlbGF0aXZlID09IG51bGwpIHsKLQkJCW5hbWUgPSBhRmlsZS5nZXRQYXRoKCk7Ci0JCQlyb290ID0gcmVwbGFjZVNlcGFyYXRvcnMoZ2V0RGlyZWN0b3J5VXJpKCkpOwotCQkJcmVsYXRpdmUgPSBtYWtlUmVsYXRpdmUobmFtZSwgcm9vdCk7Ci0JCX0KLQkJcmV0dXJuIHJlbGF0aXZlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VTZXBhcmF0b3JzKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKQotCQkJcmV0dXJuIHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyByb290KSB7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsIHx8IHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWZvciAoOyByb290LmVuZHNXaXRoKCIvIik7IHJvb3QgPSBBcmNoaXZlVXRpbC50cnVuY2F0ZUlnbm9yZUNhc2Uocm9vdCwgIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQluYW1lID0gcmVwbGFjZVNlcGFyYXRvcnMoZmlsZU5hbWUpOwotCQlpZiAobmFtZS5zdGFydHNXaXRoKHJvb3QpKQotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKHJvb3QubGVuZ3RoKCkgKyAxKTsKLQkJZWxzZQotCQkJbmFtZSA9IG51bGw7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmcoamF2YS5pby5GaWxlIGFTeXN0ZW1GaWxlKSB7Ci0JCWphdmEuaW8uRmlsZSBkaXIgPSBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKTsKLQkJcmV0dXJuIGRpci5lcXVhbHMoYVN5c3RlbUZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpcmVjdG9yeVVyaShqYXZhLmxhbmcuU3RyaW5nIG5ld0RpcmVjdG9yeVVyaSkgewotCQlkaXJlY3RvcnlVcmkgPSBuZXdEaXJlY3RvcnlVcmk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VXJpQXNaaXBTdHJpbmcoamF2YS5sYW5nLlN0cmluZyBuZXdEaXJlY3RvcnlVcmlBc1ppcFN0cmluZykgewotCQlkaXJlY3RvcnlVcmlBc1ppcFN0cmluZyA9IG5ld0RpcmVjdG9yeVVyaUFzWmlwU3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlNmU3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotCi0KLS8qKgotICogSW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gc2F2ZSBhbiBhcmNoaXZlcyBjb250ZW50cyB0byBhIGRpcmVjdG9yeSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBTYXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgU2F2ZVN0cmF0ZWd5IHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRpcmVjdG9yeU5hbWU7Ci0JcHJvdGVjdGVkIFVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXI7Ci0JLyoqIEluZGljYXRlcyB3aGljaCB0eXBlIG9mIGFyY2hpdmVzIHNob3VsZCBiZSBleHBhbmRlZCAqLwotCXByb3RlY3RlZCBpbnQgZXhwYW5zaW9uRmxhZ3M7Ci0KLQkvKioKLQkgKiBEaXJlY3RvcnlEdW1wU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXJlY3RvcnlEdW1wU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbChTdHJpbmcgZGlyTmFtZSwgaW50IGZsYWdzKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERpcmVjdG9yeU5hbWUoZGlyTmFtZSk7Ci0JCXNldEV4cGFuc2lvbkZsYWdzKGZsYWdzKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZU5lc3RlZERpcmVjdG9yeVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCVN0cmluZyB1cmkgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmdldE9TVXJpKGdldERpcmVjdG9yeU5hbWUoKSwgYW5BcmNoaXZlLmdldFVSSSgpKTsKLQkJcmV0dXJuIG5ldyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsKHVyaSwgZ2V0RXhwYW5zaW9uRmxhZ3MoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc2hvdWxkRXhwYW5kKGFuQXJjaGl2ZSkpCi0JCQlyZXR1cm4gY3JlYXRlTmVzdGVkRGlyZWN0b3J5U3RyYXRlZ3koYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGNyZWF0ZU5lc3RlZFppcFN0cmF0ZWd5KGFuQXJjaGl2ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkWmlwU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShhbkFyY2hpdmUuZ2V0VVJJKCkpKTsKLQkJcmV0dXJuIG5ldyBaaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsKG91dCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMTUvMDAgMjoyNjozNyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREaXJlY3RvcnlOYW1lKCkgewotCQlyZXR1cm4gZGlyZWN0b3J5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOS8wMCAxMDoxODoyMSBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhwYW5zaW9uRmxhZ3MoKSB7Ci0JCXJldHVybiBleHBhbnNpb25GbGFnczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VXJpQ29udmVydGVyKCkuY3JlYXRlT3V0cHV0U3RyZWFtKGFSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDgvMDAgNDo1MDozMiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlciBnZXRVcmlDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB1cmlDb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwgY29udmVydGVyID0gbmV3IEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsKGdldEFyY2hpdmUoKSwgZ2V0RGlyZWN0b3J5TmFtZSgpKTsKLQkJY29udmVydGVyLnNldE91dHB1dEZpbGVwYXRoKGdldERpcmVjdG9yeU5hbWUoKSk7Ci0JCXNldFVyaUNvbnZlcnRlcihjb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWtkaXJzKFN0cmluZyBkaXJlY3RvcnlQYXRoKSB7Ci0JCUZpbGUgYURpcmVjdG9yeSA9IG5ldyBGaWxlKGdldERpcmVjdG9yeU5hbWUoKSArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGRpcmVjdG9yeVBhdGgpOwotCQlhRGlyZWN0b3J5Lm1rZGlycygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwotCQkJYU1hbmlmZXN0LndyaXRlKG91dCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJCWlmIChnZXRBcmNoaXZlKCkuZ2V0T3B0aW9ucygpLmlzUmVhZE9ubHkoKSkKLQkJCQlzZXRUaW1lc3RhbXBBZnRlclNhdmluZyhKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJLCBpb3gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBhRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlbnRyeU5hbWUgPSBhRmlsZS5nZXRVUkkoKTsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSkKLQkJCW1rZGlycyhlbnRyeU5hbWUpOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJT3V0cHV0U3RyZWFtIG91dCA9IGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKGVudHJ5TmFtZSkpOwotCQkJCUFyY2hpdmVVdGlsLmNvcHkoaW4sIG91dCk7Ci0JCQkJc2V0VGltZXN0YW1wQWZ0ZXJTYXZpbmcoYUZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKGFGaWxlLmdldFVSSSgpLCBpb3gpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZlJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBhUmVzb3VyY2UsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZU1vZlJlc291cmNlKGFSZXNvdXJjZSwgb3MpOwotCQlvcy5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzE1LzAwIDI6MjY6MzcgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0RpcmVjdG9yeU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3RGlyZWN0b3J5TmFtZSkgewotCQlkaXJlY3RvcnlOYW1lID0gbmV3RGlyZWN0b3J5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOS8wMCAxMDoxODoyMSBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXhwYW5zaW9uRmxhZ3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuc2lvbkZsYWdzKGludCBuZXdFeHBhbnNpb25GbGFncykgewotCQlleHBhbnNpb25GbGFncyA9IG5ld0V4cGFuc2lvbkZsYWdzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRpbWVzdGFtcEFmdGVyU2F2aW5nKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUgYUZpbGUpIHsKLQkJbG9uZyBsYXN0TW9kID0gYUZpbGUuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCWlmIChsYXN0TW9kID09IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBhYnNQYXRoID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoZ2V0RGlyZWN0b3J5TmFtZSgpLCBhRmlsZS5nZXRVUkkoKSk7Ci0JCUZpbGUgaW9GaWxlID0gbmV3IEZpbGUoYWJzUGF0aCk7Ci0JCWlvRmlsZS5zZXRMYXN0TW9kaWZpZWQobGFzdE1vZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGltZXN0YW1wQWZ0ZXJTYXZpbmcoU3RyaW5nIHVyaSkgewotCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlIGFGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFGaWxlID0gZ2V0QXJjaGl2ZSgpLmdldEZpbGUodXJpKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG11c3RCZUFOZXdFbnRyeSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFRpbWVzdGFtcEFmdGVyU2F2aW5nKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wOC8wMCA0OjUwOjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdVcmlDb252ZXJ0ZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmlDb252ZXJ0ZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlciBuZXdVcmlDb252ZXJ0ZXIpIHsKLQkJdXJpQ29udmVydGVyID0gbmV3VXJpQ29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEV4cGFuZChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCi0JCWludCBmbGFnID0gMDsKLQotCQlpZiAoYW5BcmNoaXZlLmlzV0FSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX1dBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUFSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0VBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzUkFSRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX1JBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUpCSmFyRmlsZSgpKQotCQkJZmxhZyA9IEFyY2hpdmUuRVhQQU5EX0VKQkpBUl9GSUxFUzsKLQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfQVBQQ0xJRU5UX0ZJTEVTOwotCQllbHNlCi0JCQlmbGFnID0gQXJjaGl2ZS5FWFBBTkRfQVJDSElWRVM7Ci0KLQkJcmV0dXJuIChnZXRFeHBhbnNpb25GbGFncygpICYgZmxhZykgIT0gMDsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEl0ZXJhdGVPdmVyKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBzdXBlci5zaG91bGRJdGVyYXRlT3ZlcihhbkFyY2hpdmUpIHx8IHNob3VsZEV4cGFuZChhbkFyY2hpdmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FYXIxMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAyZDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEyRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gZXhwb3J0IG1ldGEtZGF0YSBmb3IgYSAxLjIgQXBwbGljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEVhcjEyRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBFYXIxMkV4cG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVhcjEyRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjkxM2M5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBDb25jcmV0ZSBpbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byBpbXBvcnQgbWV0YS1kYXRhIGZvciBhIDEuMiBBcHBsaWNhdGlvbiBDbGllbnQKLSAqLwotcHVibGljIGNsYXNzIEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0JCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7Ci0JCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJCXJldHVybiBhbkFyY2hpdmUuY29udGFpbnNGaWxlKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQkJcmV0dXJuIG5ldyBFYXIxMkltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRUFSX0ZpbGUiKSwgSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOyAvLyROT04tTkxTLTEkID0gIkVBUiBGaWxlIgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBFYXIxMkltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCXJldHVybiBnZXREaXNjcmltaW5hdG9yKCkuY3JlYXRlSW1wb3J0U3RyYXRlZ3kob2xkLCBuZXdBcmNoaXZlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewotCQlpZiAoZGlzY3JpbWluYXRvciA9PSBudWxsKSB7Ci0JCQlkaXNjcmltaW5hdG9yID0gbmV3IERpc2NyaW1pbmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGlzY3JpbWluYXRvcjsKLQl9Ci0KLQlwdWJsaWMgRUFSRmlsZSBnZXRFQVJGaWxlKCkgewotCQlyZXR1cm4gKEVBUkZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRNZXRhRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXBwbGljYXRpb24gYXBwbCA9IG51bGw7Ci0KLQkJYXBwbCA9IChBcHBsaWNhdGlvbikgcHJpbUxvYWREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCWdldEVBUkZpbGUoKS5zZXREZXBsb3ltZW50RGVzY3JpcHRvcihhcHBsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFFeHBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NDRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGV4cG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4xIEVqYiBKYXIKLSAqLwotcHVibGljIGNsYXNzIEVqYkphcjExRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBFamJKYXIxMUV4cG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVqYkphcjExRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTAzMTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGltcG9ydCBtZXRhLWRhdGEgZm9yIGEgMS4xIEVqYiBKYXIKLSAqLwotcHVibGljIGNsYXNzIEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQkJcmV0dXJuIG5ldyBFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmFibGVUb09wZW5NZXNzYWdlKCkgewotCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRUpCX0phcl9GaWxlIiksIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSSk7IC8vJE5PTi1OTFMtMSQgPSAiRUpCIEphciBGaWxlIgotCQl9Ci0KLQkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKLQkJCXJldHVybiBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yOwotCi0JLyoqCi0JICogRWpiSmFyMTFJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvcigpLmNyZWF0ZUltcG9ydFN0cmF0ZWd5KG9sZCwgbmV3QXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3IgPT0gbnVsbCkgewotCQkJZGlzY3JpbWluYXRvciA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3I7Ci0JfQotCi0JcHVibGljIEVKQkphckZpbGUgZ2V0RUpCSmFyRmlsZSgpIHsKLQkJcmV0dXJuIChFSkJKYXJGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVKQkphciBlamJKYXIgPSBudWxsOwotCi0JCWVqYkphciA9IChFSkJKYXIpIHByaW1Mb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJZ2V0RUpCSmFyRmlsZSgpLnNldERlcGxveW1lbnREZXNjcmlwdG9yKGVqYkphcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRXhwb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FeHBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiZGY0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FeHBvcnRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5FeHBvcnRTdHJhdGVneTsKLQotCi0vKioKLSAqIEFic3RyYWN0IGltcGxlbWVudGVyIG9mZiB3aGljaCBvdGhlciBleHBvcnQgc3RyYXRlZ2llcyBjYW4gc3ViY2xhc3MKLSAqIAotICogQHNlZSBFeHBvcnRTdHJhdGVneQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgQXJjaGl2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIEV4cG9ydFN0cmF0ZWd5IHsKLQkvKiogVGhlIGxpc3Qgb2YgZmlsZXMgYWxyZWFkeSBzYXZlZCBieSB0aGlzIHN0cmF0ZWd5IGR1cmluZyBpbnZva2F0aW9uIG9mIHByZVNhdmUoKSAqLwotCXByb3RlY3RlZCBTZXQgc2F2ZWRGaWxlczsKLQotCXB1YmxpYyBFeHBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGphdmEudXRpbC5TZXQgZ2V0U2F2ZWRGaWxlcygpIHsKLQkJaWYgKHNhdmVkRmlsZXMgPT0gbnVsbCkKLQkJCXNhdmVkRmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCQlyZXR1cm4gc2F2ZWRGaWxlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTYXZlZChTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBzYXZlZEZpbGVzICE9IG51bGwgJiYgZ2V0U2F2ZWRGaWxlcygpLmNvbnRhaW5zKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZzsgc3ViY2xhc3NlcyBtYXkgd2lzaCB0byBvdmVycmlkZTsgdHlwaWNhbCBvcGVyYXRpb25zIHdvdWxkIGJlIHRvCi0JICogYWRkIGV4dHJhIGVsZW1lbnRzIHRvIHRoZSBvdXRnb2luZyBhcmNoaXZlLCB1c2luZyBTYXZlU3RyYXRlZ3kjc2F2ZShGaWxlLAotCSAqIGphdmEuaW8uSW5wdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgcHJlU2F2ZShTYXZlU3RyYXRlZ3kgYVNhdmVTdHJhdGVneSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCS8qKgotCSAqIFRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIHVyaSBoYXMganVzdCBiZWVuIHNhdmVkOyBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZiBzYXZlZCBmaWxlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVkKFN0cmluZyB1cmkpIHsKLQkJZ2V0U2F2ZWRGaWxlcygpLmFkZCh1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNhdmVkRmlsZXMoamF2YS51dGlsLlNldCBuZXdTYXZlZEZpbGVzKSB7Ci0JCXNhdmVkRmlsZXMgPSBuZXdTYXZlZEZpbGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0ltcG9ydFN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9JbXBvcnRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ4NWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0ltcG9ydFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLQotLyoqCi0gKiBJbXBvcnRTdHJhdGVneSBrbm93cyBob3cgdG8gaW50ZXJwcmV0IHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBhcmNoaXZlLCB1c3VhbGx5IGluIGRlcGxveW1lbnQKLSAqIGRlc2NyaXB0b3JzLCB0byBidWlsZCB1cCBhIG1vZGVsIG9mIHRoZSBjb250YWluZWQgb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbXBvcnRTdHJhdGVneSBleHRlbmRzIEFyY2hpdmVTdHJhdGVneSB7Ci0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB1c2VkIGZvciBjb3B5aW5nIGFyY2hpdmVzOyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBraW5kIG9mIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIEltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpOwotCi0JLyoqCi0JICogRG8gd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IHRvIGJyaW5nIGluIG1ldGFkYXRhIGZyb20gdGhlIGFyY2hpdmUgYW5kIHNldCB0aGUgZGVwbG95bWVudAotCSAqIGRlc2NyaXB0b3JzIHRvIHRoZSBzdGFuZGFyZCBmb3JtIHRoYXQgdGhlIGFwaXMgY2FuIHJlY29nbml6ZQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydE1ldGFEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIGlzRUpCMTAoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0ltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDYxNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZmYgd2hpY2ggb3RoZXIgaW1wb3J0IHN0cmF0ZWdpZXMgY2FuIHN1YmNsYXNzCi0gKiAKLSAqIEBzZWUgSW1wb3J0U3RyYXRlZ3kKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEltcG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIEFyY2hpdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBJbXBvcnRTdHJhdGVneSB7Ci0JLyoqCi0JICogQXJjaGl2ZUltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRDb21tb25BcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5JbXBvcnRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCMTAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0xvYWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDVjZjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0xvYWRTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci0KLQotLyoqCi0gKiBMb2FkU3RyYXRlZ3kga25vd3MgaG93IHRvIGxvYWQgb3IgcmVhZCB0aGUgY29udGVudHMgb2YgYSBjb250YWluZXIuIFRoaXMgcHJvdmlkZXMgYSBkZWxlZ2F0aW9uCi0gKiBtb2RlbCBmb3IgcmVhZGluZyBpbiB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBmaWxlLiBDbGllbnRzIGNhbiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGFuZAotICogInBsdWcgaW4iIHRvIGFuIGluc3RhbmNlIG9mIGFuIGFyY2hpdmUuIEV4YW1wbGVzIG1pZ2h0IGluY2x1ZGUgcmVhZGluZyBmcm9tIGEgemlwIGZpbGUsIGZyb20gYW4KLSAqIGlucHV0IHN0cmVhbSwgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0sIG9yIGZyb20gYSB3b3JrYmVuY2guCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9hZFN0cmF0ZWd5IHsKLQlwdWJsaWMgdm9pZCBhZGRPclJlcGxhY2VNb2ZSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpOwotCi0JLyoqCi0JICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQgYnkgdGhpcyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpOwotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhpcyBzdHJhdGVneSwgaWYgaXQgZXhpc3RzOyBjYXNlcyB3aGVyZSBpdCBtaWdodCBub3QgZXhpc3QgaXMgaWYKLQkgKiB0aGUgbG9hZCBzdHJhdGVneSBpcyAidmlydHVhbCIsIGUuZy4sIGEgamFyIHdpdGhpbiBhIGphcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcm9vdCBmcm9tIHdoaWNoIG1ldGEgcmVzb3VyY2VzIGdldCBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByb290IGZyb20gd2hpY2ggY2xhc3NlcyBhbmQgcHJvcGVydGllcyBhcmUgbG9hZGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCaW5hcmllc1BhdGgoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0KLQlwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpOwotCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCk7Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgcHJpbUdldFJlc291cmNlU2V0KCk7Ci0KLQkvKioKLQkgKiBVc2VkIGludGVybmFsbHk7IGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwKLQkgKi8KLQlwdWJsaWMgRmlsZUl0ZXJhdG9yIGdldEZpbGVJdGVyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVzZWQgYnkgYW4gYXJjaGl2ZSB0byBvYnRhaW4gYSBsaXN0IG9mIGl0J3MgZmlsZXMsIHdoaWNoIGlzIHVzdWFsbHkgZGVmZXJyZWQgdW50aWwgdGhlIGZpcnN0Ci0JICogdGltZSBpdCBpcyBpbnZva2VkLCBhcyBhbiBvcHRpbWl6YXRpb24uCi0JICovCi0JcHVibGljIExpc3QgY29sbGVjdEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBvbiBhbiBlbnRyeSBuYW1lZCBieSB0aGUgcGFyYW1ldGVyCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gb24gYW4gZW50cnkgbmFtZWQgYnkgdGhlIHBhcmFtZXRlciwgZnJvbSB0aGUgInJlc291cmNlcyBwYXRoIiBvZiB0aGUKLQkgKiBsb29zZSBhcmNoaXZlIGlmIGl0IGV4aXN0cywgT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSBzYW1lIGFzCi0JICoge0BsaW5rICNnZXRJbnB1dFN0cmVhbShTdHJpbmcpfQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZE1vZlJlc291cmNlcygpOwotCi0JcHVibGljIFJlc291cmNlIGdldEV4aXN0aW5nTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSk7Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQW4gYXJjaGl2ZSB1c2VzIGEgY3VzdG9tIGNsYXNzIGxvYWRlciBmb3IgamF2YSByZWZsZWN0aW9uIHdpdGhpbiBhIG1vZiByZXNvdXJjZVNldDsKLQkgKiBpbXBsZW1lbnRlcnMgb2YgTG9hZFN0cmF0ZWd5IG1heSBzdXBwbHkgYSBtb2YgcmVzb3VyY2VTZXQgZm9yIHdoaWNoIHRoaXMgY2xhc3MgbG9hZGVyIGlzIG5vdAotCSAqIG5lY2Vzc2FyeSwgb3IgY291bGQgZXZlbiBjYXVzZSBicmVha2FnZTsgdGhpcyB0ZXN0IGdpdmVzIHRoZSBzdHJhdGVneSB0aGUgY2hhbmNlIHRvICJvcHQgb3V0IgotCSAqIG9mIHRoZSBjbGFzcyBsb2FkaW5nIGdhbWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzTG9hZGVyTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhcmNoaXZlIGlzIHJlYWRpbmcgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeSBvbiB0aGUgZmlsZSBzeXN0ZW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNNb2ZSZXNvdXJjZUxvYWRlZChTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciByZXNvdXJjZXMgY2FuIGJlIHJlYWQgYnkgdGhpcyBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpOwotCi0JLyoqCi0JICogSXMgdGhlIHBhcmFtZXRlciBpbiB1c2UgYnkgdGhpcyBzdHJhdGVneT8gTmVlZGVkIGZvciB3aGVuIHRoZSBhcmNoaXZlIGlzIHNhdmVkIHRvIHRoZSBzYW1lCi0JICogbG9jYXRpb24gZnJvbSB3aGljaCBpdCB3YXMgcmVhZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmcoamF2YS5pby5GaWxlIGFTeXN0ZW1GaWxlKTsKLQotCS8qKgotCSAqIFVzZWQgZm9yIG9wdGltaXphdGlvbnMsIHdoZXJlIHRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBoYXZlIG5vdCBiZWVuIGNoYW5nZWQ7IGluc3RlYWQgb2YKLQkgKiBpdGVyYXRpbmcgZWFjaCBmaWxlIGluIHRoZSBhcmNoaXZlLCB3ZSBtYXkgYmUgYWJsZSB0byBidWxrIHNhdmUgdGhlIHdob2xlIHRoaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVxdWlyZXNJdGVyYXRpb25PblNhdmUoKTsKLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSwgRUxpc3QgZXh0ZW50KTsKLQotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgYUNvbnRhaW5lcik7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVNldChSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpOwotCi0JcHVibGljIExvb3NlQXJjaGl2ZSBnZXRMb29zZUFyY2hpdmUoKTsKLQotCXB1YmxpYyB2b2lkIHNldExvb3NlQXJjaGl2ZShMb29zZUFyY2hpdmUgYUxvb3NlQXJjaGl2ZSk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KTsKLQotCXB1YmxpYyBpbnQgZ2V0UmVuZGVyZXJUeXBlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlclR5cGUoaW50IGkpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTcwNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKi8KLQotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGsuSmF2YUpES0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ1JlZ2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotLyoqCi0gKiBBYnN0YWN0IGltcGxlbWVudGVyIG9mZiB3aGljaCBhbmQgbG9hZCBzdHJhdGVneSBtYXkgc3ViY2xhc3MKLSAqIAotICogQHNlZSBMb2FkU3RyYXRlZ3kKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIExvYWRTdHJhdGVneSB7Ci0KLQkvKiogZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHVuZGVybHlpbmcgcmVzb3VyY2VzIGhhdmUgYmVlbiBjbG9zZWQgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09wZW4gPSB0cnVlOwotCi0JLyoqIFRoZSBhcmNoaXZlIG9yIGRpcmVjdG9yeSB0byB3aGljaCB0aGlzIHN0cmF0ZWd5IGJlbG9uZ3MgKi8KLQlwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotCS8qKiBSZXNvdXJjZVNldCB1c2VkIGZvciBtb2YveG1pIHJlc291cmNlcyAqLwotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCXByb3RlY3RlZCBMb29zZUFyY2hpdmUgbG9vc2VBcmNoaXZlOwotCi0JcHJvdGVjdGVkIE1hcCBjb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlczsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0KLQlwcml2YXRlIGludCByZW5kZXJlclR5cGU7Ci0KLQlwdWJsaWMgTG9hZFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRPclJlcGxhY2VNb2ZSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJUmVzb3VyY2UgZXhpc3RpbmdSZXNvdXJjZSA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UoYVJlc291cmNlLmdldFVSSSgpLCBmYWxzZSk7Ci0JCWlmIChleGlzdGluZ1Jlc291cmNlICE9IG51bGwpCi0JCQlnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZShleGlzdGluZ1Jlc291cmNlKTsKLQkJZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNb2RpZmljYXRpb25UcmFja2luZyhSZXNvdXJjZSByZXMpIHsKLQkJYm9vbGVhbiB0cmFja2luZ01vZHMgPSByZXMuaXNUcmFja2luZ01vZGlmaWNhdGlvbigpOwotCQlib29sZWFuIGlzUmVhZE9ubHkgPSAoY29udGFpbmVyICE9IG51bGwpID8gKChBcmNoaXZlKSBjb250YWluZXIpLmdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkgOiBmYWxzZTsKLQkJYm9vbGVhbiBzaG91bGRUcmFja01vZHMgPSAhKGlzUmVhZE9ubHkgfHwgQXJjaGl2ZVV0aWwuaXNKYXZhUmVzb3VyY2UocmVzKSB8fCBBcmNoaXZlVXRpbC5pc1JlZ2lzdGVyZWRVUklNYXBwaW5nKHJlcykpOwotCQlpZiAoc2hvdWxkVHJhY2tNb2RzICYmICF0cmFja2luZ01vZHMpCi0JCQlyZXMuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIGJlaW5nIGhlbGQgYnkgdGhpcyBvYmplY3QgYW5kIHNldCB0aGUgc3RhdGUgdG8gY2xvc2VkLiBTdWJjbGFzc2VzCi0JICogc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlzZXRJc09wZW4oZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEBzZWUgTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHVyaSkgewotCQlpZiAoY29udGFpbnNVc2luZ0xvb3NlQXJjaGl2ZSh1cmkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBwcmltQ29udGFpbnModXJpKTsKLQl9Ci0KLQkvKgotCSAqIFRyeSB0aGUgcmVzb3VyY2VzIHBhdGggZmlyc3Q7IGlmIHRoYXQgZmFsc2UsIHNlZSBpZiB3ZSBoYXZlIGEgY2hpbGQgbG9vc2UgYXJjaGl2ZSB3aXRoIHRoZQotCSAqIHVyaQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zVXNpbmdMb29zZUFyY2hpdmUoU3RyaW5nIHVyaSkgewotCQlpZiAoZ2V0TG9vc2VBcmNoaXZlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlMb29zZUFyY2hpdmUgbG9vc2UgPSBnZXRMb29zZUFyY2hpdmUoKTsKLQkJaWYgKGxvb3NlLmdldFJlc291cmNlc1BhdGgoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUobG9vc2UuZ2V0UmVzb3VyY2VzUGF0aCgpLCB1cmkpOwotCQlpZiAoYUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gTG9vc2VDb25maWdSZWdpc3Rlci5zaW5nbGV0b24oKS5maW5kRmlyc3RMb29zZUNoaWxkKHVyaSwgbG9vc2UpICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgY3JlYXRlRmlsZShTdHJpbmcgdXJpKSB7Ci0JCUZpbGUgYUZpbGUgPSBudWxsOwotCQlpZiAoaXNBcmNoaXZlKHVyaSkpCi0JCQlhRmlsZSA9IG9wZW5OZXN0ZWRBcmNoaXZlKHVyaSk7Ci0JCWlmIChhRmlsZSA9PSBudWxsKSB7Ci0JCQlhRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRmlsZSgpOwotCQkJYUZpbGUuc2V0VVJJKHVyaSk7Ci0JCQlhRmlsZS5zZXRPcmlnaW5hbFVSSSh1cmkpOwotCQl9Ci0JCWFGaWxlLnNldExvYWRpbmdDb250YWluZXIoZ2V0Q29udGFpbmVyKCkpOwotCQlyZXR1cm4gYUZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBYnNvbHV0ZV9wYXRoX3Vua25vd25fRVhDXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJBYnNvbHV0ZSBwYXRoIHVua25vd24iCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb29zZUFyY2hpdmUoKSA9PSBudWxsID8gZ2V0QWJzb2x1dGVQYXRoKCkgOiBnZXRMb29zZUFyY2hpdmUoKS5nZXRSZXNvdXJjZXNQYXRoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmltR2V0UmVzb3VyY2VzUGF0aCgpIHsKLQkJcmV0dXJuIGdldExvb3NlQXJjaGl2ZSgpID09IG51bGwgPyBudWxsIDogZ2V0TG9vc2VBcmNoaXZlKCkuZ2V0UmVzb3VyY2VzUGF0aCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmluYXJpZXNQYXRoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRMb29zZUFyY2hpdmUoKSA9PSBudWxsID8gZ2V0QWJzb2x1dGVQYXRoKCkgOiBnZXRMb29zZUFyY2hpdmUoKS5nZXRCaW5hcmllc1BhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25BcmNoaXZlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHVibGljIFJlc291cmNlU2V0IHByaW1HZXRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIFNob3VsZCB3ZSBpdGVyYXRlIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUgYXMgcGFydCBvZiBzYXZpbmcsIG9yIGNhbiB3ZSB0cmVhdCB0aGUgYXJjaGl2ZQotCSAqIGFzIG9uZSBiaWcgZmlsZSBkdXJpbmcgc2F2ZT8gVGhlIGZvbGxvd2luZyBydWxlcyBhcHBseSwgaXRlcmF0aW5nIHRoZSBmaWxlcyBpZjogMSkgSWYgdGhlCi0JICogYXJjaGl2ZSBpcyBhIG1vZHVsZSBmaWxlIGFuZCBpdCBpcyBOT1QgcmVhZC1vbmx5IDIpIElmIHRoZSBsb2FkIHN0cmF0ZWd5IGlzIGEgZGlyZWN0b3J5IDMpIElmCi0JICogdGhlIGFyY2hpdmUgaXMgYSB1dGlsaXR5IEpBUiwgYW5kIHRoZSBmaWxlcyBsaXN0IGhhcyBuZXZlciBiZWVuIGluaXRpYWxpemVkLCBvciBpZiB0aGUKLQkgKiBsb2FkaW5nIGNvbnRhaW5lcnMgZm9yIGFsbCB0aGUgZmlsZXMgYXJlIHRoZSBzYW1lIEFORCBub3QgZGlyZWN0b3JpZXMsIEFORCB0aGUKLQkgKiB7QGxpbmsgQXJjaGl2ZU9wdGlvbnMjaXNTYXZlTGlicmFyaWVzQXNGaWxlcygpfW9mIHRoZSBhcmNoaXZlIGlzIHRydWUuCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneSNyZXF1aXJlc0l0ZXJhdGlvbk9uU2F2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVxdWlyZXNJdGVyYXRpb25PblNhdmUoKSB7Ci0JCWlmICghZ2V0Q29udGFpbmVyKCkuaXNBcmNoaXZlKCkgfHwgaXNEaXJlY3RvcnkoKSkKLQkJCXJldHVybiB0cnVlOwotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IChBcmNoaXZlKSBnZXRDb250YWluZXIoKTsKLQkJLy9XZSBzaG91bGQgbGVhdmUgdXRpbGl0eSBKQVJzIGludGFjdCwgdW5sZXNzIHdlcmUgdG9sZCBub3QgdG8KLQkJLy9UaGUgbWFuaWZlc3QgbWF5IGhhdmUgYmVlbiBzaWduZWQKLQkJaWYgKGFuQXJjaGl2ZS5pc01vZHVsZUZpbGUoKSkKLQkJCXJldHVybiAhYW5BcmNoaXZlLmdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCk7Ci0JCWVsc2UgaWYgKGFuQXJjaGl2ZS5nZXRPcHRpb25zKCkuaXNTYXZlTGlicmFyaWVzQXNGaWxlcygpICYmIGFuQXJjaGl2ZS5nZXRMb2FkaW5nQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJaWYgKGFuQXJjaGl2ZS5pc0luZGV4ZWQoKSkgewotCQkJCUxpc3QgZmlsZXMgPSBhbkFyY2hpdmUuZ2V0RmlsZXMoKTsKLQkJCQlGaWxlIGFGaWxlID0gbnVsbDsKLQkJCQlDb250YWluZXIgZmlyc3RDb250YWluZXIgPSBudWxsOwotCQkJCUNvbnRhaW5lciBsQ29udGFpbmVyID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJZmlyc3RDb250YWluZXIgPSBhRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCk7Ci0JCQkJCQlpZiAoZmlyc3RDb250YWluZXIuZ2V0TG9hZFN0cmF0ZWd5KCkuaXNEaXJlY3RvcnkoKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlsQ29udGFpbmVyID0gYUZpbGUuZ2V0TG9hZGluZ0NvbnRhaW5lcigpOwotCQkJCQlpZiAobENvbnRhaW5lciAhPSBmaXJzdENvbnRhaW5lcikKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplUmVzb3VyY2VTZXQoKTsKLQkJCXJlc291cmNlU2V0LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQl1cGRhdGVNb2RpZmljYXRpb25UcmFja2luZygoUmVzb3VyY2UpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCXVwZGF0ZU1vZGlmaWNhdGlvblRyYWNraW5nKChSZXNvdXJjZSkgbGlzdC5nZXQoaSkpOwotCQkJCX0KLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5OyBjbGllbnRzIHNob3VsZCBub3QgbmVlZCB0byBjYWxsCi0JICovCi0JcHVibGljIEZpbGVJdGVyYXRvciBnZXRGaWxlSXRlcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGVJdGVyYXRvckltcGwoZ2V0Q29udGFpbmVyKCkuZ2V0RmlsZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldEZpbGVzKCk7Ci0KLQlwdWJsaWMgTGlzdCBjb2xsZWN0RmlsZXMoKSB7Ci0JCS8vVGhlIGxvb3NlIGFyY2hpdmVzIG5lZWQgdG8gYmUgcmVhZCBmaXJzdAotCQljb2xsZWN0RmlsZXNGcm9tTG9vc2VBcmNoaXZlcygpOwotCQlMaXN0IGZpbGVzID0gZ2V0RmlsZXMoKTsKLQkJZmlsZXMuYWRkQWxsKGNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzLnZhbHVlcygpKTsKLQkJY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMgPSBudWxsOwotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEZpbGVzRnJvbUxvb3NlQXJjaGl2ZXMoKSB7Ci0JCWlmICghY2FuSGF2ZUxvb3NlQ2hpbGRyZW4oKSB8fCBnZXRMb29zZUFyY2hpdmUoKSA9PSBudWxsKSB7Ci0JCQljb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNvbGxlY3RlZExvb3NlQXJjaGl2ZUZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBjaGlsZHJlbiA9IExvb3NlQ29uZmlnUmVnaXN0ZXIuc2luZ2xldG9uKCkuZ2V0TG9vc2VDaGlsZHJlbihnZXRMb29zZUFyY2hpdmUoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJTG9vc2VBcmNoaXZlIGxvb3NlID0gKExvb3NlQXJjaGl2ZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJU3RyaW5nIHVyaSA9IGxvb3NlLmdldFVyaSgpOwotCQkJaWYgKCFjb2xsZWN0ZWRMb29zZUFyY2hpdmVGaWxlcy5jb250YWluc0tleSh1cmkpKSB7Ci0JCQkJQXJjaGl2ZSBhcmNoaXZlID0gb3Blbk5lc3RlZEFyY2hpdmUobG9vc2UpOwotCQkJCWlmIChhcmNoaXZlICE9IG51bGwpIHsKLQkJCQkJY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMucHV0KHVyaSwgYXJjaGl2ZSk7Ci0JCQkJCWFyY2hpdmUuc2V0TG9hZGluZ0NvbnRhaW5lcihnZXRDb250YWluZXIoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUgcmV0dXJucyBhbiBpbW11dGFibGUgY29sbGVjdGlvbiBvZiB0aGUgbG9hZGVkCi0JICogICAgICByZXNvdXJjZXMgaW4gdGhlIHJlc291cmNlIHNldAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZE1vZlJlc291cmNlcygpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZXMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzLmlzTG9hZGVkKCkpCi0JCQkJcmVzdWx0LmFkZChyZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0TW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd3JhcEV4KSB7Ci0JCQlpZiAoKEV4dGVuZGVkRWNvcmVVdGlsLmdldEZpbGVOb3RGb3VuZERldGVjdG9yKCkuaXNGaWxlTm90Rm91bmQod3JhcEV4KSkpIHsKLQkJCQlGaWxlTm90Rm91bmRFeGNlcHRpb24gZmlsZU5vdEZvdW5kRXggPSBFeHRlbmRlZEVjb3JlVXRpbC5nZXRJbm5lckZpbGVOb3RGb3VuZEV4Y2VwdGlvbih3cmFwRXgpOwotCQkJCXRocm93IGZpbGVOb3RGb3VuZEV4OwotCQkJfQotCQkJdGhyb3dSZXNvdXJjZUxvYWRFeGNlcHRpb24odXJpLCB3cmFwRXgpOwotCQkJcmV0dXJuIG51bGw7IC8vbmV2ZXIgaGFwcGVucyAtIGNvbXBpbGVyIGV4cGVjdHMgaXQgdGhvdWdoCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoKSB7Ci0JCS8vTm90IHRoZSBiZXN0IGRlc2lnbiBoZXJlLCBiZWNhdXNlIGEgbG9hZCBzdHJhdGVneSBzaG91bGQgb25seSBrbm93Ci0JCS8vIGFib3V0Ci0JCS8vY29udGFpbmVyOyBob3dldmVyLCB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgZ2V0IGNhbGxlZCB3aGVuIHRoZQotCQkvLyBjb250YWluZXIKLQkJLy9pcyBhbiBhcmNoaXZlCi0JCUFyY2hpdmUgYXJjaGl2ZSA9IChBcmNoaXZlKSBnZXRDb250YWluZXIoKTsKLQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBBcmNoaXZlVVJJQ29udmVydGVySW1wbChhcmNoaXZlLCBwcmltR2V0UmVzb3VyY2VzUGF0aCgpKTsKLQkJUmVzb3VyY2VTZXQgcnMgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgcmVnID0gY3JlYXRlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJcnMuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkocmVnKTsKLQkJc2V0UmVzb3VyY2VTZXQocnMpOwotCQlycy5zZXRVUklDb252ZXJ0ZXIoY29udmVydGVyKTsKLQkJaWYgKGFyY2hpdmUuc2hvdWxkVXNlSmF2YVJlZmxlY3Rpb24oKSkgewotCQkJcnMuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgSmF2YUpES0FkYXB0ZXJGYWN0b3J5KCkpOwotCQkJYXJjaGl2ZS5pbml0aWFsaXplQ2xhc3NMb2FkZXIoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5IGNyZWF0ZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJcmV0dXJuIG5ldyBKMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeSgpOwotCi0JCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotCQlzd2l0Y2ggKGdldFJlbmRlcmVyVHlwZSgpKSB7Ci0JCQljYXNlIEFyY2hpdmVPcHRpb25zLlNBWCA6Ci0JCQkJcmVnaXN0cnkgPSBuZXcgSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQXJjaGl2ZU9wdGlvbnMuRE9NIDoKLQkJCQlyZWdpc3RyeSA9IG5ldyBKMkVFUmVzb3VyY2VGYWN0b3J5RG9tUmVnaXN0cnkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQXJjaGl2ZU9wdGlvbnMuREVGQVVMVCA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZWdpc3RyeSA9IG5ldyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVuZGVyZXJUeXBlKCkgewotCQlyZXR1cm4gcmVuZGVyZXJUeXBlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQXJjaGl2ZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5pc05lc3RlZEFyY2hpdmUodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBBbiBhcmNoaXZlIHVzZXMgYSBjdXN0b20gY2xhc3MgbG9hZGVyIGZvciBqYXZhIHJlZmxlY3Rpb24gd2l0aGluIGEgbW9mIHJlc291cmNlU2V0OwotCSAqIGltcGxlbWVudGVycyBvZiBMb2FkU3RyYXRlZ3kgbWF5IHN1cHBseSBhIG1vZiByZXNvdXJjZVNldCBmb3Igd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgaXMgbm90Ci0JICogbmVjZXNzYXJ5LCBvciBjb3VsZCBldmVuIGNhdXNlIGJyZWFrYWdlOyB0aGlzIHRlc3QgZ2l2ZXMgdGhlIHN0cmF0ZWd5IHRoZSBjaGFuY2UgdG8gIm9wdCBvdXQiCi0JICogb2YgdGhlIGNsYXNzIGxvYWRpbmcgZ2FtZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3NMb2FkZXJOZWVkZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kgVGhlIGRlZmF1bHQgaXMgZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kjZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZShTdHJpbmcpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldEV4aXN0aW5nTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSksIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZlJlc291cmNlTG9hZGVkKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JCVJlc291cmNlIHJlcyA9IGdldEV4aXN0aW5nTW9mUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKLQkJcmV0dXJuIGlzT3BlbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5IHJldHVybiBmYWxzZSBieSBkZWZhdWx0OyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQotCSAqICAgICAgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZyhqYXZhLmlvLkZpbGUgYVN5c3RlbUZpbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBtYWtlTW9mUmVzb3VyY2UoU3RyaW5nIHVyaSwgRUxpc3QgZXh0ZW50KSB7Ci0JCVJlc291cmNlIGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdNb2ZSZXNvdXJjZSh1cmkpOwotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKLQkJCXJldHVybiBleGlzdGluZzsKLQkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShTdHJpbmcgdXJpKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5vcGVuTmVzdGVkQXJjaGl2ZSh1cmkpOwotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0NhdWdodCBhbiBleGNlcHRpb24gdHJ5aW5nIHRvIG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoTG9vc2VBcmNoaXZlIGxvb3NlKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5vcGVuTmVzdGVkQXJjaGl2ZShsb29zZSk7Ci0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCS8vQ2F1Z2h0IGFuIGV4Y2VwdGlvbiB0cnlpbmcgdG8gb3BlbiB0aGUgbmVzdGVkIGFyY2hpdmUKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIG5ld0NvbnRhaW5lcikgewotCQljb250YWluZXIgPSBuZXdDb250YWluZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VTZXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0IG5ld1Jlc291cmNlU2V0KSB7Ci0JCS8vIGZpeGVzIHByb2JsZW0gaW4gcmVvcGVuCi0JCWlmIChyZXNvdXJjZVNldCAhPSBuZXdSZXNvdXJjZVNldCkgewotCi0JCQkvLyByZW1vdmUgYWRhcHRlciBmcm9tIG9sZCByZXNvdXJjZSBzZXQKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKQotCQkJCXJlc291cmNlU2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQotCQkJLy8gYWRkIGFzIGFkYXB0ZXIgdG8gbmV3IHJlc291cmNlIHNldCBpZiBuZWNlc3NhcnkKLQkJCWlmIChuZXdSZXNvdXJjZVNldCAhPSBudWxsICYmICFuZXdSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLQkJCQluZXdSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0KLQkJCXJlc291cmNlU2V0ID0gbmV3UmVzb3VyY2VTZXQ7Ci0JCX0gLy8gbm8gbmVlZCB0byB1cGRhdGUgaWYgb2xkIHNldCBlcXVhbHMgbmV3IHNldCAoYnkgcmVmZXJlbmNlKQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldElzT3Blbihib29sZWFuIG5ld0lzT3BlbikgewotCQlpc09wZW4gPSBuZXdJc09wZW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGhyb3dSZXNvdXJjZUxvYWRFeGNlcHRpb24oU3RyaW5nIHJlc291cmNlVXJpLCBFeGNlcHRpb24gZXgpIHRocm93cyBSZXNvdXJjZUxvYWRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJsb2FkX3Jlc291cmNlX0VYQ18iLCAobmV3IE9iamVjdFtde3Jlc291cmNlVXJpLCBnZXRDb250YWluZXIoKS5nZXRVUkkoKX0pKSwgZXgpOyAvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCBsb2FkIHJlc291cmNlICJ7MH0iIGluIGFyY2hpdmUgInsxfSIiCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9vc2VBcmNoaXZlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExvb3NlQXJjaGl2ZQotCSAqLwotCXB1YmxpYyBMb29zZUFyY2hpdmUgZ2V0TG9vc2VBcmNoaXZlKCkgewotCQlyZXR1cm4gbG9vc2VBcmNoaXZlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvb3NlQXJjaGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbG9vc2VBcmNoaXZlCi0JICogICAgICAgICAgICBUaGUgbG9vc2VBcmNoaXZlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2VBcmNoaXZlKSB7Ci0JCXRoaXMubG9vc2VBcmNoaXZlID0gbG9vc2VBcmNoaXZlOwotCQljaGVja0xvb3NlUGF0aHNWYWxpZCgpOwotCX0KLQotCS8qCi0JICogQWRkZWQgdG8gc3VwcG9ydCBXQVMgcnVudGltZTsgdGhyb3cgYW4gQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gaWYgb25lIG9mIHRoZSBwYXRocyBpbiB0aGUKLQkgKiBsb29zZSBjb25maWcgZG9lcyBub3QgcG9pbnQgdG8gYW4gZXhpc3RpbmcgZmlsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrTG9vc2VQYXRoc1ZhbGlkKCkgewotCQlpZiAobG9vc2VBcmNoaXZlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHBhdGggPSBsb29zZUFyY2hpdmUuZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWphdmEuaW8uRmlsZSBpb0ZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpOwotCQkJaWYgKCFpb0ZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIGJpbmFyaWVzIHBhdGg6ICIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXBhdGggPSBsb29zZUFyY2hpdmUuZ2V0UmVzb3VyY2VzUGF0aCgpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlqYXZhLmlvLkZpbGUgaW9GaWxlID0gbmV3IGphdmEuaW8uRmlsZShwYXRoKTsKLQkJCWlmICghaW9GaWxlLmV4aXN0cygpKQotCQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCByZXNvdXJjZXMgcGF0aDogIiArIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5IYXZlTG9vc2VDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lci5pc0VBUkZpbGUoKSB8fCBjb250YWluZXIuaXNXQVJGaWxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZW5kZXJlclR5cGUKLQkgKiAgICAgICAgICAgIFRoZSByZW5kZXJlclR5cGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyVHlwZShpbnQgcmVuZGVyZXJUeXBlKSB7Ci0JCXRoaXMucmVuZGVyZXJUeXBlID0gcmVuZGVyZXJUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L05lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzIxMWRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L05lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk5lc3RlZEphckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkZpbGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLk5lc3RlZEFyY2hpdmVJdGVyYXRvcjsKLQotCi0vKioKLSAqIExvYWQgc3RyYXRlZ3kgdXNlZCBhcyBhIGxhc3QgcmVzb3J0IHRvIHJlYWQgZW50cmllcyBmcm9tIGphcnMgaW5zaWRlIG9mIGphcnMuIEl0IGlzIGEgbGFzdCByZXNvcnQKLSAqIGJlY2F1c2Ugb2YgdGhlIHBvb3IgcGVyZm9tYW5jZSBpbnZvbHZlZCwgYXMgdGhlIGNvbnRlbnRzIG9mIHRoZSB6aXAgZW50cmllcyBhcmUgbm90IGNhY2hlZCwgYW5kCi0gKiBzZXF1ZW50aWFsIHNjYW4gc2VhcmNoZXMgd2lsbCBjYXVzZSB0aGUgemlwIHN0cmVhbSB0byBiZSBpbmZsYXRlZCBvbiBlYWNoIHNlYXJjaC4gV2hlbmV2ZXIKLSAqIHBvc3NpYmxlLAotICogCi0gKiBAbGluayB7VGVtcEZpbGVMb2FkU3RyYXRlZ3l9IHNob3VsZCBiZSB1c2VkLgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBMb2FkU3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBJbmRleCB0byBpbXByb3ZlIGxvb2t1cCBwZXJmb3JtYW5jZSAtIG5vdCB1c2VkIGlmIGluIFJ1bnRpbWUgdG8gcmVkdWNlIGZvb3RwcmludAotCSAqLwotCXByb3RlY3RlZCBNYXAgdXJpc1RvUG9zaXRpb25zOwotCXByb3RlY3RlZCBMb2FkU3RyYXRlZ3kgcGFyZW50OwotCi0JLyoqCi0JICogTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwoTG9hZFN0cmF0ZWd5IHBhcmVudFN0cmF0ZWd5KSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFBhcmVudChwYXJlbnRTdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRJbmRleCgpIHsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRyeSB7Ci0JCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBnZXRaaXBJbnB1dFN0cmVhbSgpOwotCQkJWmlwRW50cnkgZW50cnkgPSBudWxsOwotCQkJbG9uZyBwb3NpdGlvbiA9IDA7Ci0JCQl3aGlsZSAoKGVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0JCQkJcG9zaXRpb24rKzsKLQkJCQltYXAucHV0KGVudHJ5LmdldE5hbWUoKSwgbmV3IExvbmcocG9zaXRpb24pKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvd05lc3RlZEphckV4Y2VwdGlvbihpb3gpOwotCQl9Ci0JCXNldFVyaXNUb1Bvc2l0aW9ucyhtYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltQ29udGFpbnMoU3RyaW5nIHVyaSkgewotCQlpZiAodXNpbmdJbmRleCgpKQotCQkJcmV0dXJuIGNvbnRhaW5zVXNpbmdJbmRleCh1cmkpOwotCQlyZXR1cm4gY29udGFpbnNTZXF1ZW50aWFsbHkodXJpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zU2VxdWVudGlhbGx5KFN0cmluZyB1cmkpIHsKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXppcyA9IGdldFppcElucHV0U3RyZWFtU2tpcHBlZFRvKHVyaSk7Ci0JCQlyZXR1cm4gemlzICE9IG51bGw7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoemlzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl6aXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zVXNpbmdJbmRleChTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBnZXRVcmlzVG9Qb3NpdGlvbnMoKS5jb250YWluc0tleSh1cmkpOwotCX0KLQotCi0JLyoqCi0JICogVXNlZCBpbnRlcm5hbGx5OyBjbGllbnRzIHNob3VsZCBub3QgbmVlZCB0byBjYWxsCi0JICovCi0JcHVibGljIEZpbGVJdGVyYXRvciBnZXRGaWxlSXRlcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoKChBcmNoaXZlKSBnZXRDb250YWluZXIoKSkuZ2V0T3B0aW9ucygpLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBuZXcgTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yKGdldENvbnRhaW5lcigpLmdldEZpbGVzKCksIGdldFppcElucHV0U3RyZWFtKCkpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZUl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGaWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCg1MDApOwotCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBudWxsOwotCQl0cnkgewotCQkJemlzID0gZ2V0WmlwSW5wdXRTdHJlYW0oKTsKLQkJCVppcEVudHJ5IGVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpOwotCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJRmlsZSBhRmlsZSA9IGNyZWF0ZUZpbGUoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQkJYUZpbGUuc2V0U2l6ZShlbnRyeS5nZXRTaXplKCkpOwotCQkJCQlhRmlsZS5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLQkJCQkJbGlzdC5hZGQoYUZpbGUpOwotCQkJCX0KLQkJCQllbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvd05lc3RlZEphckV4Y2VwdGlvbihpb3gpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHppcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJemlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2luZ0luZGV4KCkpCi0JCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW1Vc2luZ0luZGV4KHVyaSk7Ci0JCXJldHVybiBnZXRJbnB1dFN0cmVhbVNlcXVlbnRpYWxseSh1cmkpOwotCX0KLQotCXByb3RlY3RlZCBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtU2VxdWVudGlhbGx5KFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oZ2V0WmlwSW5wdXRTdHJlYW1Ta2lwcGVkVG8odXJpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW1Vc2luZ0luZGV4KFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJTG9uZyBwb3NpdGlvbiA9IChMb25nKSBnZXRVcmlzVG9Qb3NpdGlvbnMoKS5nZXQodXJpKTsKLQkJaWYgKHBvc2l0aW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7Ci0JCVppcElucHV0U3RyZWFtIHppcyA9IGdldFppcElucHV0U3RyZWFtKCk7Ci0JCWxvbmcgcG9zID0gcG9zaXRpb24ubG9uZ1ZhbHVlKCk7Ci0JCWZvciAobG9uZyBpID0gMDsgaSA8IHBvczsgaSsrKSB7Ci0JCQl6aXMuZ2V0TmV4dEVudHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oemlzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNy8wMCA2OjEyOjM2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8wNy8wMCA0OjM4OjIxIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLk1hcAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldFVyaXNUb1Bvc2l0aW9ucygpIHsKLQkJaWYgKHVzaW5nSW5kZXgoKSAmJiB1cmlzVG9Qb3NpdGlvbnMgPT0gbnVsbCkKLQkJCWJ1aWxkSW5kZXgoKTsKLQkJcmV0dXJuIHVyaXNUb1Bvc2l0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgWmlwSW5wdXRTdHJlYW0gZ2V0WmlwSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmkgPSBnZXRDb250YWluZXIoKS5nZXRVUkkoKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBnZXRQYXJlbnQoKS5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCQlyZXR1cm4gbmV3IFppcElucHV0U3RyZWFtKGluKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWmlwSW5wdXRTdHJlYW0gZ2V0WmlwSW5wdXRTdHJlYW1Ta2lwcGVkVG8oU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAodXJpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk51bGxfdXJpX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQgPSAiTnVsbCB1cmkiCi0JCVppcElucHV0U3RyZWFtIHppcyA9IG51bGw7Ci0JCVppcEVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXppcyA9IGdldFppcElucHV0U3RyZWFtKCk7Ci0JCQllbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKTsKLQkJCXdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJaWYgKHVyaS5lcXVhbHMoZW50cnkuZ2V0TmFtZSgpKSkKLQkJCQkJcmV0dXJuIHppczsKLQkJCQllbnRyeSA9IHppcy5nZXROZXh0RW50cnkoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGVudHJ5IHdhcyBub3QgZm91bmQgc28gY2xvc2UgdGhlIHN0cmVhbQotCQkJaWYgKGVudHJ5ID09IG51bGwgJiYgemlzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl6aXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzA3LzAwIDY6MTI6MzYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1BhcmVudAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5IG5ld1BhcmVudCkgewotCQlwYXJlbnQgPSBuZXdQYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMDcvMDAgNDozODoyMSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VXJpc1RvUG9zaXRpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpc1RvUG9zaXRpb25zKGphdmEudXRpbC5NYXAgbmV3VXJpc1RvUG9zaXRpb25zKSB7Ci0JCXVyaXNUb1Bvc2l0aW9ucyA9IG5ld1VyaXNUb1Bvc2l0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBBbiBleGNlcHRpb24gd2FzIGNhdWdodCByZWFkaW5nIHRoZSBuZXN0ZWQgamFyOyB0aHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRocm93TmVzdGVkSmFyRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24pIHsKLQkJdGhyb3cgbmV3IE5lc3RlZEphckV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygibmVzdGVkX2phcl9FWENfIiwgKG5ldyBPYmplY3RbXXtnZXRDb250YWluZXIoKS5nZXRVUkkoKSwgZ2V0UGFyZW50KCkuZ2V0Q29udGFpbmVyKCkuZ2V0VVJJKCl9KSksIGNhdWdodEV4Y2VwdGlvbik7Ly8kTk9OLU5MUy0xJCA9ICJBbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHswfSBmcm9tIHsxfSIKLQl9Ci0KLQkvKioKLQkgKiBEb24ndCB1c2UgdGhlIGluZGV4IGluIHRoZSBydW50aW1lIGVudmlyb25tZW50OyByZWR1Y2UgZm9vdHByaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gdXNpbmdJbmRleCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCQkvL3JldHVybiAhY29tLmlibS5ldG9vbHMuYXJjaGl2ZS51dGlsLkFyY2hpdmVVdGlsLmlzUnVudGltZSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OdWxsTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTnVsbExvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNjFjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OdWxsTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogTm8tb3AgaW1wbGVtZW50ZXIgdXNlZCBmb3IgbmV3IGFyY2hpdmUgaW5zdGFuY2VzLCB3aGljaCBoYXZlIHRoZWlyIGNvbnRlbnRzIGFkZGVkIGFuZCBjb3BpZWQgZnJvbQotICogb3RoZXIgc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgTnVsbExvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBMb2FkU3RyYXRlZ3lJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZW1wdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCS8qKgotCSAqIE51bGxMb2FkU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTnVsbExvYWRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewotCQlyZXR1cm4gZW1wdHlMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKLQkgKi8KLQlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SYXJFeHBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U3N2UzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGV4cG9ydCBtZXRhLWRhdGEgZm9yIGEgSjJDIFJlc291cmNlIEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFJhckV4cG9ydFN0cmF0ZWd5SW1wbCBleHRlbmRzIEV4cG9ydFN0cmF0ZWd5SW1wbCB7Ci0JLyoqCi0JICogUmFyRXhwb3J0U3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmFyRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzM1ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmFySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gaW1wb3J0IG1ldGEtZGF0YSBmb3IgYSBKMkMgUmVzb3VyY2UgQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgUmFySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCi0JCSAqLwotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQkJcmV0dXJuIG5ldyBSYXJJbXBvcnRTdHJhdGVneUltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5hYmxlVG9PcGVuTWVzc2FnZSgpIHsKLQkJCXJldHVybiBnZXRYbWxERE1lc3NhZ2UoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJBUl9GaWxlIiksIEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSk7IC8vJE5PTi1OTFMtMSQgPSAiUkFSIEZpbGUiCi0JCX0KLQotCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewotCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlUkFSRmlsZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEaXNjcmltaW5hdG9yIGRpc2NyaW1pbmF0b3I7Ci0KLQkvKioKLQkgKiBSYXJJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSYXJJbXBvcnRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3IoKS5jcmVhdGVJbXBvcnRTdHJhdGVneShvbGQsIG5ld0FyY2hpdmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGdldERpc2NyaW1pbmF0b3IoKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9yID09IG51bGwpIHsKLQkJCWRpc2NyaW1pbmF0b3IgPSBuZXcgRGlzY3JpbWluYXRvcigpOwotCQkJLy8gQ29ubmVjdG9ycyB1c2UgdGhlaXIgb3duIHNwZWNpYWwgZW50aXR5IHJlc29sdmVyIGZvciBub3cuLi4KLQkJCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzAsICJjb25uZWN0b3JfMV8wLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3I7Ci0JfQotCi0JcHVibGljIFJBUkZpbGUgZ2V0UkFSRmlsZSgpIHsKLQkJcmV0dXJuIChSQVJGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbm5lY3RvciBjb25uZWN0b3IgPSBudWxsOwotCi0JCWNvbm5lY3RvciA9IChDb25uZWN0b3IpIHByaW1Mb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJZ2V0UkFSRmlsZSgpLnNldERlcGxveW1lbnREZXNjcmlwdG9yKGNvbm5lY3Rvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvUmVhZE9ubHlEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwOGVkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwgZXh0ZW5kcyBEaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsIHsKLQlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIHN1YmRpcmVjdG9yeTsKLQotCS8qKgotCSAqIFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbChTdHJpbmcgYURpcmVjdG9yeVVyaSkgewotCQlzdXBlcihhRGlyZWN0b3J5VXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwoU3RyaW5nIHJvb3REaXJlY3RvcnlVcmksIGphdmEuaW8uRmlsZSBzdWJkaXIpIHsKLQkJc3VwZXIocm9vdERpcmVjdG9yeVVyaSk7Ci0JCXNldFN1YmRpcmVjdG9yeShzdWJkaXIpOwotCX0KLQotCS8qKgotCSAqIGFkZERpcmVjdG9yeSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXJlY3RvcnkoamF2YS5pby5GaWxlIGFGaWxlLCBqYXZhLnV0aWwuTGlzdCBhTGlzdCkgewotCQlSZWFkT25seURpcmVjdG9yeSBkaXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5KCk7Ci0JCWRpci5zZXRMYXN0TW9kaWZpZWQoYUZpbGUubGFzdE1vZGlmaWVkKCkpOwotCQlkaXIuc2V0VVJJKGdldFVSSUZyb20oYUZpbGUpKTsKLQkJZGlyLnNldExvYWRpbmdDb250YWluZXIoZ2V0Q29udGFpbmVyKCkpOwotCQlkaXIuc2V0TG9hZFN0cmF0ZWd5KG5ldyBSZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwoZ2V0RGlyZWN0b3J5VXJpKCksIGFGaWxlKSk7Ci0JCWFMaXN0LmFkZChkaXIpOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoamF2YS5sYW5nLlN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKHVyaSkgJiYgKGdldFN1YmRpcmVjdG9yeSgpID09IG51bGwgfHwgc3ViZGlyZWN0b3J5Q29udGFpbnModXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWphdmEuaW8uRmlsZSBzdWJkaXIgPSBnZXRTdWJkaXJlY3RvcnkoKTsKLQkJaWYgKHN1YmRpciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1YmRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREaXJlY3RvcnlGb3JMaXN0IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBqYXZhLmlvLkZpbGUgZ2V0RGlyZWN0b3J5Rm9yTGlzdCgpIHsKLQkJaWYgKGdldFN1YmRpcmVjdG9yeSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0U3ViZGlyZWN0b3J5KCk7Ci0JCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwMS8wOC8wMSAxOjEwOjQ3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5pby5GaWxlCi0JICovCi0JcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBnZXRTdWJkaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBzdWJkaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQWx3YXlzIHJldHVybiBmYWxzZSwgYmVjYXVzZSB3ZSB3YW50IHRvIHRyZWF0IHRoZSBlbnRyaWVzIGluIGEgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IGFzIGJhc2ljCi0JICogZmlsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FyY2hpdmUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDEvMDgvMDEgMToxMDo0NyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U3ViZGlyZWN0b3J5Ci0JICogICAgICAgICAgICBqYXZhLmlvLkZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdWJkaXJlY3RvcnkoamF2YS5pby5GaWxlIG5ld1N1YmRpcmVjdG9yeSkgewotCQlzdWJkaXJlY3RvcnkgPSBuZXdTdWJkaXJlY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ViZGlyZWN0b3J5Q29udGFpbnMoU3RyaW5nIHVyaSkgewotCQlpZiAoZ2V0U3ViZGlyZWN0b3J5KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShnZXRGaWxlTmFtZUZyb20odXJpKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlib29sZWFuIGNvbnRhaW5zID0gZmFsc2U7Ci0JCXdoaWxlIChhRmlsZSAhPSBudWxsICYmICFjb250YWlucykgewotCQkJaWYgKGdldFN1YmRpcmVjdG9yeSgpLmVxdWFscyhhRmlsZSkpIHsKLQkJCQljb250YWlucyA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWFGaWxlID0gYUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9TYXZlU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1NhdmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2JjZTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1NhdmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuRmlsZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlcjsKLQotCi0vKioKLSAqIEtub3dzIGhvdyB0byBleHBvcnQgdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgZmlsZS4gVGhpcyBwcm92aWRlcyBhIGRlbGVnYXRpb24gbW9kZWwgc2F2aW5nIHRoZQotICogYXJjaGl2ZS4gRXhhbXBsZXMgbWlnaHQgaW5jbHVkZSBleHBvcnRpbmcgdG8gYSB6aXAgb3V0cHV0IHN0cmVhbSwgdG8gdGhlIGZpbGUgc3lzdGVtLCBvciBpbnRvIGEKLSAqIHdvcmtiZW5jaC4KLSAqLwotcHVibGljIGludGVyZmFjZSBTYXZlU3RyYXRlZ3kgZXh0ZW5kcyBBcmNoaXZlU3RyYXRlZ3kgewotCS8qKgotCSAqIENsb3NlIGFuZCByZWxlYXNlIGFueSByZXNvdXJjZXMgYmVpbmcgaGVsZCBieSB0aGlzIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBOb3RpZnkgcmVzb3VyY2VzIGlmIG5lY2Vzc2FyeSB0aGF0IHNhdmUgaXMgY29tcGxldGUgZm9yIHRoaXMgYXJjaGl2ZSwgYmVpbmcgY2FyZWZ1bCBub3QgdG8KLQkgKiBjbG9zZSBhbnkgcmVzb3VyY2VzIHRoYXQgYSBwYXJlbnQgYXJjaGl2ZSBtaWdodCBzdGlsbCBiZSB1c2luZwotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JcHVibGljIFNhdmVGaWx0ZXIgZ2V0RmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhcmNoaXZlIGlzIHNhdmluZyBmaWxlcyB0byBhIGRpcmVjdG9yeSBvbiB0aGUgZmlsZSBzeXN0ZW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpOwotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEFyY2hpdmVNYW5pZmVzdCBhTWFuaWZlc3QpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgYUZpbGUsIEZpbGVJdGVyYXRvciBpdGVyYXRvcikgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBhRmlsZSwgamF2YS5pby5JbnB1dFN0cmVhbSBpbikgdGhyb3dzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNhdmVNb2ZSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU2F2ZUZpbHRlciBhRmlsdGVyKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1NhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1NhdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1NDljNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9TYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5GaWxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuU2F2ZUZpbHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJldmlzaXQ7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRlciBvZmYgd2hpY2ggYW55IHNhdmUgc3RyYXRlZ3kgY2FuIHN1YmNsYXNzCi0gKiAKLSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIEFyY2hpdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBTYXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBTYXZlRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIFNhdmVTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZVN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nIC0gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcgLSBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDAyLzI4LzAxIDQ6MTE6MjggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKQotCQkJZmlsdGVyID0gbmV3IFNhdmVGaWx0ZXJJbXBsKCk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2FkZWRSZXNvdXJjZU9yTWFuaWZlc3QoRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gZ2V0QXJjaGl2ZSgpLmlzTW9mUmVzb3VyY2VMb2FkZWQoYUZpbGUuZ2V0VVJJKCkpIHx8IGFGaWxlLmdldFVSSSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJc2F2ZU1hbmlmZXN0KCk7Ci0JCXNhdmVNb2ZSZXNvdXJjZXMoKTsKLQkJc2F2ZUZpbGVzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJU2F2ZVN0cmF0ZWd5IHN0cmF0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmF0ID0gY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KGFuQXJjaGl2ZSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYW5BcmNoaXZlLmdldFVSSSgpLCBpb3gpOwotCQl9Ci0JCWFuQXJjaGl2ZS5zYXZlKHN0cmF0KTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgYUZpbGUsIEZpbGVJdGVyYXRvciBpdGVyYXRvcikgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpICYmIHNob3VsZEl0ZXJhdGVPdmVyKChBcmNoaXZlKSBhRmlsZSkpCi0JCQlzYXZlKChBcmNoaXZlKSBhRmlsZSk7Ci0JCWVsc2UgewotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJaWYgKCFhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkpIHsKLQkJCQl0cnkgewotCQkJCQlpbiA9IGl0ZXJhdG9yLmdldElucHV0U3RyZWFtKGFGaWxlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYUZpbGUuZ2V0VVJJKCksIGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCQlzYXZlKGFGaWxlLCBpbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlKEZpbGUgYUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRmlsZXMoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJRmlsZUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0QXJjaGl2ZSgpLmdldEZpbGVzRm9yU2F2ZSgpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUZpbGUgYUZpbGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHNob3VsZFNhdmUoYUZpbGUpKQotCQkJCQlzYXZlKGFGaWxlLCBpdGVyYXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9vY2N1cnJlZF9pdGVyYXRpbmdfZl9FWENfIiksIGlveCk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3Igb2NjdXJyZWQgaXRlcmF0aW5nIGZpbGVzIgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1hbmlmZXN0KCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKCFzaG91bGRTYXZlKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSkKLQkJCXJldHVybjsKLQkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gZ2V0QXJjaGl2ZSgpLmdldE1hbmlmZXN0KCk7Ci0JCWlmIChtZi5nZXRNYW5pZmVzdFZlcnNpb24oKSA9PSBudWxsIHx8IG1mLmdldE1hbmlmZXN0VmVyc2lvbigpLmVxdWFscygiIikpLy8kTk9OLU5MUy0xJAotCQkJbWYuc2V0TWFuaWZlc3RWZXJzaW9uKCIxLjAiKTsvLyROT04tTkxTLTEkCi0JCXNhdmUobWYpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9mUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKCFzaG91bGRTYXZlKGFSZXNvdXJjZSkpCi0JCQlyZXR1cm47Ci0JCXNldEVuY29kaW5nKGFSZXNvdXJjZSk7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIHdhc01vZGlmaWVkID0gYVJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkJCU91dHB1dFN0cmVhbSBvcyA9IGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQlzYXZlTW9mUmVzb3VyY2UoYVJlc291cmNlLCBvcyk7Ci0JCQlhUmVzb3VyY2Uuc2V0TW9kaWZpZWQod2FzTW9kaWZpZWQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9mUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlhUmVzb3VyY2Uuc2F2ZShvcywgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9mUmVzb3VyY2VzKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRBcmNoaXZlKCkuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJLy9XZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhpcyBwcm9jZXNzIGJlY2F1c2UgamF2YSByZXNvdXJjZXMgY291bGQgZ2V0IGFkZGVkIGR1cmluZyB0aGUKLQkJLy9wcm9jZXNzIG9mIGl0ZXJhdGluZyBhbmQgc2F2aW5nLCBhbmQgYWRkaW5nIHRvIGEgY29sbGVjdGlvbiB3aGlsZSBpdGVyYXRpbmcgY2F1c2VzIGEKLQkJLy8gZmFpbHVyZQotCQlMaXN0IHhtaVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy9XZSB3aWxsIHNhdmUgdGhlIHhtaSByZXNvdXJjZXMgZmlyc3QsIHRoZW4gdGhlIHhtbCByZXNvdXJjZXMuIFRoaXMgd2F5IHRoZQotCQkvL2FueSBuZWNlc3NhcnkgaWQncyBmb3IgcmVmZXJlbmNlZCBvYmplY3RzIHdpbGwgaGF2ZSBiZWVuIGdlbmVyYXRlZCBwcmlvciB0byBzYXZlCi0JCUxpc3QgeG1sUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vCQlXZSBkb24ndCB3YW50IHRvIHNhdmUgdGhlIGphdmEgcmVmbGVjdGlvbiByZXNvdXJjZXMgb3IgdXJpIG1hcHBlZCByZXNvdXJjZXMKLQkJCWlmICghQXJjaGl2ZVV0aWwuaXNKYXZhUmVzb3VyY2UocmVzKSAmJiAhQXJjaGl2ZVV0aWwuaXNSZWdpc3RlcmVkVVJJTWFwcGluZyhyZXMpICYmICFBcmNoaXZlVXRpbC5pc1BsYXRmb3JtTWV0YVJlc291cmNlKHJlcykpIHsKLQkJCQlSZXZpc2l0LnJldmlzaXQoKTsKLQkJCQkvL0ZvciBub3csIGFsd2F5cyB1c2UgdGhlIG1vZjUgZm9ybWF0Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkKLQkJCQkJKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIHJlcykuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkJCQkJeG1sUmVzb3VyY2VzLmFkZChyZXMpOwotCQkJCWVsc2UgewotCQkJCQl4bWlSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJhc2ljU2F2ZU1vZlJlc291cmNlcyh4bWlSZXNvdXJjZXMpOwotCQliYXNpY1NhdmVNb2ZSZXNvdXJjZXMoeG1sUmVzb3VyY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NhdmVNb2ZSZXNvdXJjZXMoTGlzdCByZXNvdXJjZXMpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQlzYXZlTW9mUmVzb3VyY2UocmVzKTsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5jb2RpbmcoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlKQotCQkJKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlKSBhUmVzb3VyY2UpLnNldEVuY29kaW5nKGFyY2hpdmUuZ2V0WG1sRW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDIvMjgvMDEgNDoxMToyOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmlsdGVyCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5TYXZlRmlsdGVyIG5ld0ZpbHRlcikgewotCQlmaWx0ZXIgPSBuZXdGaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhlIG5lc3RlZCBhcmNoaXZlIG5lZWRzIHRvIGJlIHNhdmVkIG9uZSBmaWxlIGF0IGEgdGltZSwgb3IgaWYgd2UgY2FuIGJ1bGsKLQkgKiBzYXZlIGl0IGZyb20gdGhlIG9yaWdpbmFsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSXRlcmF0ZU92ZXIoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJcmV0dXJuIGFuQXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKS5yZXF1aXJlc0l0ZXJhdGlvbk9uU2F2ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoRmlsZSBhRmlsZSkgewotCQlib29sZWFuIGxvYWRlZCA9IGlzTG9hZGVkUmVzb3VyY2VPck1hbmlmZXN0KGFGaWxlKTsKLQkJaWYgKGxvYWRlZCkgewotCQkJUmVzb3VyY2UgcmVzID0gYXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKS5nZXRFeGlzdGluZ01vZlJlc291cmNlKGFGaWxlLmdldFVSSSgpKTsKLQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvL211c3QgYmUgbWFuaWZlc3QKLQkJCXJldHVybiAhc2hvdWxkU2F2ZShyZXMpOwotCQl9Ci0KLQkJaWYgKGdldEFyY2hpdmUoKS5pc01vZHVsZUZpbGUoKSkgewotCQkJTW9kdWxlRmlsZSBtID0gKE1vZHVsZUZpbGUpIGdldEFyY2hpdmUoKTsKLQkJCWlmIChtLmdldEV4cG9ydFN0cmF0ZWd5KCkgIT0gbnVsbCAmJiBtLmdldEV4cG9ydFN0cmF0ZWd5KCkuaGFzU2F2ZWQoYUZpbGUuZ2V0VVJJKCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc2hvdWxkU2F2ZShhRmlsZS5nZXRVUkkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShSZXNvdXJjZSByZXMpIHsKLQkJaWYgKCFyZXMuaXNNb2RpZmllZCgpICYmIGdldEFyY2hpdmUoKS5nZXRPcHRpb25zKCkuc2F2ZU9ubHlEaXJ0eU1vZlJlc291cmNlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzaG91bGRTYXZlKHJlcy5nZXRVUkkoKS50b1N0cmluZygpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG9uZSBtZXRob2QgdGhyb3VnaCB3aGljaCBhbGwgZWxlbWVudHMgb2YgYW4gYXJjaGl2ZSAoZmlsZSwgbmVzdGVkIGFyY2hpdmUsIG1vZgotCSAqIHJlc291cmNlLCBvciBtYW5pZmVzdCkgd2lsbCBiZSB0ZXN0ZWQgYmVmb3JlIHNhdmluZy4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gZG8gc29tZXRoaW5nCi0JICogbW9yZSBzcGVjaWZpYwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0RmlsdGVyKCkuc2hvdWxkU2F2ZSh1cmksIGdldEFyY2hpdmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9UZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhODVkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9UZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBVc2VkIGFzIGFuIG9wdGltaXphdGlvbiBmb3IgcmVhZGluZyBqYXJzIHdpdGhpbiBqYXJzLiBSZWFkaW5nIGZyb20gYSBaaXBGaWxlIGlzIG11Y2ggZmFzdGVyIHRoYW4KLSAqIGZyb20gYSBaaXBJbnB1dFN0cmVhbSwgdGhlcmVmb3JlLCB3aGVuIHBvc3NpYmxlLCBpdCBtYWtlcyBzZW5zZSB0byBjb3B5IHRoZSBuZXN0ZWQgamFyIHRvIGEgdGVtcAotICogZmlsZS4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHRlbXAgZmlsZSBnZXRzIGRlbGV0ZWQgb24gbm9ybWFsCi0gKiBzeXN0ZW0gZXhpdCwgdXNpbmcgdGhlIGhlbHBlciBtZXRob2Qgb24gamF2YS5pby5GaWxlLiBUaGlzIHN0cmF0ZWd5IHdpbGwgYWxzbyBkZWxldGUgdGhlIGZpbGUKLSAqIHdoZW4gY2xvc2VkIG9yIGZpbmFsaXplZC4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBUZW1wb3JhcnlaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUZW1wWmlwRmlsZUxvYWRTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGVtcG9yYXJ5WmlwRmlsZUxvYWRTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgamF2YS5pby5GaWxlCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsKGphdmEuaW8uRmlsZSBmaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlzdXBlci5jbG9zZSgpOwotCQlnZXRGaWxlKCkuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFic29sdXRlX3BhdGhfdW5rbm93bl9FWENfIikpOyAvLyROT04tTkxTLTEkID0gIkFic29sdXRlIHBhdGggdW5rbm93biIKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvV2FyMjJFeHBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMGVmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkV4cG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotCi0vKioKLSAqIENvbmNyZXRlIGltcGxlbWVudGVyIHRoYXQga25vd3MgaG93IHRvIGV4cG9ydCBtZXRhLWRhdGEgZm9yIGEgMi4yIFdlYiBhcHAKLSAqLwotcHVibGljIGNsYXNzIFdhcjIyRXhwb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgRXhwb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBXYXIyMkV4cG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdhcjIyRXhwb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE0ODcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gaW1wb3J0IG1ldGEtZGF0YSBmb3IgYSAyLjIgV2ViIGFwcAotICovCi1wdWJsaWMgY2xhc3MgV2FyMjJJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCQlyZXR1cm4gYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKLQkJICovCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7Ci0JCQlyZXR1cm4gbmV3IFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuYWJsZVRvT3Blbk1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRERNZXNzYWdlKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXQVJfRmlsZSIpLCBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpOyAvLyROT04tTkxTLTEkID0gIldBUiBGaWxlIgotCQl9Ci0KLQkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKLQkJCXJldHVybiBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGlzY3JpbWluYXRvciBkaXNjcmltaW5hdG9yOwotCi0JLyoqCi0JICogV2FyMjJJbXBvcnRTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuSW1wb3J0U3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewotCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvcigpLmNyZWF0ZUltcG9ydFN0cmF0ZWd5KG9sZCwgbmV3QXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKLQkJaWYgKGRpc2NyaW1pbmF0b3IgPT0gbnVsbCkgewotCQkJZGlzY3JpbWluYXRvciA9IG5ldyBEaXNjcmltaW5hdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3I7Ci0JfQotCi0JcHVibGljIFdBUkZpbGUgZ2V0V0FSRmlsZSgpIHsKLQkJcmV0dXJuIChXQVJGaWxlKSBnZXRBcmNoaXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkltcG9ydFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0TWV0YURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlcGxveW1lbnREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJV2ViQXBwIHdlYmFwcCA9IG51bGw7Ci0JCXdlYmFwcCA9IChXZWJBcHApIHByaW1Mb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlnZXRXQVJGaWxlKCkuc2V0RGVwbG95bWVudERlc2NyaXB0b3Iod2ViYXBwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9YbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2YmZlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9YbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBpbXBsZW1lbnRlciBmb3IgYXJjaGl2ZXMgdGhhdCB1c2UgeG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgSW1wb3J0U3RyYXRlZ3lJbXBsIHsKLQkvKioKLQkgKiBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhtbEJhc2VkSW1wb3J0U3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGUoKSB7Ci0JCXJldHVybiAoTW9kdWxlRmlsZSkgZ2V0QXJjaGl2ZSgpOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Mb2FkRGVwbG95bWVudERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0JCXJlc291cmNlID0gZ2V0TW9kdWxlRmlsZSgpLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJRU9iamVjdCByb290ID0gbnVsbDsKLQotCQlyb290ID0gQXJjaGl2ZVV0aWwuZ2V0Um9vdChyZXNvdXJjZSk7Ci0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMDNkYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3k7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlciB0aGF0IGtub3dzIGhvdyB0byByZWFkIGZpbGVzIGZyb20gYSB6aXAvamFyIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0gKiAKLSAqIEBzZWUgTG9hZFN0cmF0ZWd5Ci0gKi8KLQotcHVibGljIGNsYXNzIFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgTG9hZFN0cmF0ZWd5SW1wbCB7Ci0JcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBmaWxlOwotCXByb3RlY3RlZCBaaXBGaWxlIHppcEZpbGU7Ci0KLQkvKioKLQkgKiBaaXBGaWxlTG9hZFN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFppcEZpbGVMb2FkU3RyYXRlZ3kgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWmlwRmlsZUxvYWRTdHJhdGVneUltcGwoamF2YS5pby5GaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXNldEZpbGUoZmlsZSk7Ci0JCXNldFppcEZpbGUobmV3IFppcEZpbGUoZmlsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlzdXBlci5jbG9zZSgpOwotCQl0cnkgewotCQkJZ2V0WmlwRmlsZSgpLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KHVyaSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8yMC8wMCA0OjQwOjE0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5pby5GaWxlCi0JICovCi0JcHVibGljIGphdmEuaW8uRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBnZXRaaXBGaWxlKCkuZW50cmllcygpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghZW50cnkuaXNEaXJlY3RvcnkoKSAmJiAhY29sbGVjdGVkTG9vc2VBcmNoaXZlRmlsZXMuY29udGFpbnNLZXkoZW50cnkuZ2V0TmFtZSgpKSkgewotCQkJCUZpbGUgYUZpbGUgPSBjcmVhdGVGaWxlKGVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJYUZpbGUuc2V0U2l6ZShlbnRyeS5nZXRTaXplKCkpOwotCQkJCWFGaWxlLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotCQkJCWxpc3QuYWRkKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCi0JICovCi0JcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KHVyaSk7Ci0JCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHVyaSk7Ci0KLQkJCXJldHVybiBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKGdldFppcEZpbGUoKS5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gemlwQ2xvc2VkKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oemlwQ2xvc2VkLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMDEvMDAgMTE6Mjg6MTIgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuemlwLlppcEZpbGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLnppcC5aaXBGaWxlIGdldFppcEZpbGUoKSB7Ci0JCXJldHVybiB6aXBGaWxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nKGphdmEuaW8uRmlsZSBhU3lzdGVtRmlsZSkgewotCQlyZXR1cm4gZ2V0RmlsZSgpICE9IG51bGwgJiYgZ2V0RmlsZSgpLmVxdWFscyhhU3lzdGVtRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMjAvMDAgNDo0MDoxNCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmlsZQotCSAqICAgICAgICAgICAgamF2YS5pby5GaWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZShqYXZhLmlvLkZpbGUgbmV3RmlsZSkgewotCQlmaWxlID0gbmV3RmlsZTsKLQl9Ci0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzAxLzAwIDExOjI4OjEyIEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdaaXBGaWxlCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRaaXBGaWxlKGphdmEudXRpbC56aXAuWmlwRmlsZSBuZXdaaXBGaWxlKSB7Ci0JCXppcEZpbGUgPSBuZXdaaXBGaWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ1Yzg3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSBjb25jcmV0ZSBpbXBsZW50YXRpb24gb2YgU2F2ZVN0cmF0ZWd5LiBBbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlLCBpbmNsdWRpbmcgeG1pCi0gKiByZXNvdXJjZXMsIHdpbGwgYmUgb3V0cHV0IHRvIGEgWmlwT3V0cHV0U3RyZWFtLiBUaGUgb3V0cHV0IHN0cmVhbSBzaG91bGQgYmUgcGFzc2VkIGluIGJ5IHRoZQotICogY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIFNhdmVTdHJhdGVneUltcGwgaW1wbGVtZW50cyBTYXZlU3RyYXRlZ3kgewotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb25TdHJlYW07Ci0JLyoqIFVzZWQgaW50ZXJuYWxseSAqLwotCXByb3RlY3RlZCBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtOwotCi0JLyoqCi0JICogV3JhcHMgYSBuZXcgemlwIG91dHB1dCBzdHJlYW0gYXJvdW5kIHRoZSBwYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCXNldERlc3RpbmF0aW9uU3RyZWFtKG91dCk7Ci0JCXNldFppcE91dHB1dFN0cmVhbShuZXcgWmlwT3V0cHV0U3RyZWFtKG91dCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0RGVzdGluYXRpb25TdHJlYW0oKS5jbG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBuZXcgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChnZXRaaXBPdXRwdXRTdHJlYW0oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuZmluaXNoKCk7Ci0JCS8vSWYgdGhpcyBpcyBub3QgbmVzdGVkLCBjbG9zZSB0aGUgc3RyZWFtIHRvIGZyZWUgdXAgdGhlIHJlc291cmNlCi0JCS8vb3RoZXJ3aXNlLCBkb24ndCBjbG9zZSBpdCBiZWNhdXNlIHRoZSBwYXJlbnQgbWF5IG5vdCBiZSBkb25lCi0JCWlmICghKGdldERlc3RpbmF0aW9uU3RyZWFtKCkgaW5zdGFuY2VvZiBaaXBPdXRwdXRTdHJlYW0pKQotCQkJZ2V0RGVzdGluYXRpb25TdHJlYW0oKS5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5pby5PdXRwdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0RGVzdGluYXRpb25TdHJlYW0oKSB7Ci0JCXJldHVybiBkZXN0aW5hdGlvblN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCi0JICovCi0JcHJvdGVjdGVkIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0WmlwT3V0cHV0U3RyZWFtKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVTdHJhdGVneSNzYXZlTW9mUmVzb3VyY2UoUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZlJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUmV2aXNpdC5yZXZpc2l0KCk7Ci0JCVVSSSB1cmkgPSBhUmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCS8vRW5zdXJlIGNvbnRhaW5lciByZWxhdGl2ZSBVUkkKLQkJVVJJQ29udmVydGVyIGNvbnYgPSBnZXRBcmNoaXZlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaWYgKGNvbnYgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKQotCQkJdXJpID0gKChDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKSBjb252KS5kZU5vcm1hbGl6ZSh1cmkpOwotCQlaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeSh1cmkudG9TdHJpbmcoKSk7Ci0JCXppcE91dHB1dFN0cmVhbS5wdXROZXh0RW50cnkoZW50cnkpOwotCQlzdXBlci5zYXZlTW9mUmVzb3VyY2UoYVJlc291cmNlLCBvdXQpOwotCQl6aXBPdXRwdXRTdHJlYW0uY2xvc2VFbnRyeSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0KLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0gZ2V0WmlwT3V0cHV0U3RyZWFtKCkgewotCQlyZXR1cm4gemlwT3V0cHV0U3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCQlhTWFuaWZlc3Qud3JpdGUoZ2V0WmlwT3V0cHV0U3RyZWFtKCkpOwotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuY2xvc2VFbnRyeSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSwgaW94KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeShhbkFyY2hpdmUuZ2V0VVJJKCkpOwotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCXN1cGVyLnNhdmUoYW5BcmNoaXZlKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLmNsb3NlRW50cnkoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oYW5BcmNoaXZlLmdldFVSSSgpLCBpb3gpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShGaWxlIGFGaWxlLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBlbnRyeU5hbWUgPSBhRmlsZS5nZXRVUkkoKTsKLQkJCWlmIChhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkgJiYgIWVudHJ5TmFtZS5lbmRzV2l0aCgiLyIpKS8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeU5hbWUgPSBlbnRyeU5hbWUgKyAnLyc7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeShlbnRyeU5hbWUpOwotCQkJaWYgKGFGaWxlLmdldExhc3RNb2RpZmllZCgpID4gMCkKLQkJCQllbnRyeS5zZXRUaW1lKGFGaWxlLmdldExhc3RNb2RpZmllZCgpKTsKLQkJCWdldFppcE91dHB1dFN0cmVhbSgpLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCQlpZiAoIWFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSkgewotCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWwuY29weShpbiwgZ2V0WmlwT3V0cHV0U3RyZWFtKCkpOwotCQkJfQotCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuY2xvc2VFbnRyeSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihhRmlsZS5nZXRVUkkoKSwgaW94KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEZXN0aW5hdGlvblN0cmVhbQotCSAqICAgICAgICAgICAgamF2YS5pby5PdXRwdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvblN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSBuZXdEZXN0aW5hdGlvblN0cmVhbSkgewotCQlkZXN0aW5hdGlvblN0cmVhbSA9IG5ld0Rlc3RpbmF0aW9uU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdaaXBPdXRwdXRTdHJlYW0KLQkgKiAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0WmlwT3V0cHV0U3RyZWFtKGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtIG5ld1ppcE91dHB1dFN0cmVhbSkgewotCQl6aXBPdXRwdXRTdHJlYW0gPSBuZXdaaXBPdXRwdXRTdHJlYW07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTJhNzY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5BcmNoaXZlUnVudGltZUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIENsYXNzIGxvYWRlciB3aGljaCBsb2FkcyBhIGdpdmVuIHNldCBvZiBjbGFzc2VzIHN0b3JlZCBpbiBieXRlIGFycmF5cy4gKEFzc3VtcHRpb246IFN5c3RlbQotICogY2xhc3NlcyBhbmQgdGhvc2UgaW4gdGhlIHNldCBhcmUgdGhlIG9ubHkgY2xhc3NlcyBuZWVkZWQgdG8gcmVzb2x2ZSBlYWNoIG9uZSkKLSAqLwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7Ci0JcHJvdGVjdGVkIEFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIGV4dHJhQ2xhc3NMb2FkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5FQVJGaWxlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUFJPVE9DT0wgPSAiYXJjaGl2ZSI7Ci0JcHJpdmF0ZSBBcmNoaXZlVVJMU3RyZWFtSGFuZGxlciBoYW5kbGVyOwotCi0JcHVibGljIEFyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyKEFyY2hpdmUgYW5BcmNoaXZlLCBDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewotCQlzdXBlcihwYXJlbnRDbCk7Ci0JCXNldEFyY2hpdmUoYW5BcmNoaXZlKTsKLQkJc2V0RXh0cmFDbGFzc0xvYWRlcihleHRyYUNsKTsKLQkJaW5FQVJGaWxlID0gYW5BcmNoaXZlLmdldENvbnRhaW5lcigpICE9IG51bGwgJiYgYW5BcmNoaXZlLmdldENvbnRhaW5lcigpLmlzRUFSRmlsZSgpOwotCQloYW5kbGVyID0gbmV3IEFyY2hpdmVVUkxTdHJlYW1IYW5kbGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSBzcGVjaWZpZWQgY2xhc3MuIFRoaXMgZ2V0cyBjYWxsZWQgb25seSBhZnRlciB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciBoYXMgaGFkIGl0J3MKLQkgKiBjaGFuY2UsIGJhc2VkIG9uIHRoZSBKYXZhMiBkZWxlZ2F0aW9uIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCi0JCUNsYXNzIHJlc3VsdDsKLQkJLy8gTG9hZCBjbGFzcyBieXRlcyBmcm9tIGN1cnJlbnQgc2V0IG9mIGNsYXNzIGJ5dGVbXSdzCi0JCWJ5dGVbXSBieXRlcyA9IGdldENsYXNzQnl0ZXNGb3IobmFtZSk7Ci0KLQkJaWYgKGJ5dGVzICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGRlZmluZUNsYXNzKG5hbWUsIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0JCQl9IC8vIGVuZGlmCi0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLQkJfSAvLyBlbmRpZgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzAwIDk6NTk6NTcgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZSBnZXRBcmNoaXZlKCkgewotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwcml2YXRlIGJ5dGVbXSBnZXREYXRhKEZpbGUgZmlsZSkgewotCQlpZiAobnVsbCAhPSBmaWxlKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBBcmNoaXZlVXRpbC5pbnB1dFN0cmVhbVRvQnl0ZXMoZmlsZS5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJpb19leF9sb2FkaW5nX0VYQ18iLCAobmV3IE9iamVjdFtde2ZpbGUuZ2V0TmFtZSgpfSkpLCBlKTsgLy8kTk9OLU5MUy0xJCA9ICJBbiBJTyBleGNlcHRpb24gb2NjdXJyZWQgbG9hZGluZyAiCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0Q2xhc3NCeXRlc0ZvcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBDaGFuZ2UgdGhlIGNsYXNzIG5hbWUgdG8gYSBqYXIgZW50cnkgbmFtZQotCQlTdHJpbmcgamFyRW50cnlOYW1lID0gQXJjaGl2ZVV0aWwuY2xhc3NOYW1lVG9VcmkoY2xhc3NOYW1lKTsKLQkJcmV0dXJuIGdldERhdGEoZ2V0RmlsZShqYXJFbnRyeU5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUFSRmlsZSBnZXRFQVJGaWxlKCkgewotCQlyZXR1cm4gKEVBUkZpbGUpIGdldEFyY2hpdmUoKS5nZXRDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yMS8wMCA2OjU4OjA1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRFeHRyYUNsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gZXh0cmFDbGFzc0xvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBkeW5hbWljIGNsYXNzIGxvYWRpbmcgaW4gZGVwZW5kZW50IGphcnMgaW4gZWFyczsgdGhlIHNldCBpcyB1c2VkIHRvIHRlcm1pbmF0ZSBhCi0JICogY3ljbGUgaWYgb25lIGV4aXN0czsgdGhlIGN5Y2xlIGlzIGludmFsaWQsIGJ1dCB5b3UgbmV2ZXIga25vdyB3aGF0IHBlb3BsZSBtaWdodCB0cnkuLi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgU2V0IHZpc2l0ZWRBcmNoaXZlcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAodmlzaXRlZEFyY2hpdmVzLmNvbnRhaW5zKGdldEFyY2hpdmUoKSkpCi0JCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLQkJdmlzaXRlZEFyY2hpdmVzLmFkZChnZXRBcmNoaXZlKCkpOwotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBsb2FkQ2xhc3NJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIHZpc2l0ZWRBcmNoaXZlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIubG9hZENsYXNzKG5hbWUsIHJlc29sdmUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzcyBjID0gbG9hZENsYXNzSW5EZXBlbmRlbnRKYXIobmFtZSk7Ci0JCQlpZiAoYyAhPSBudWxsICYmIHJlc29sdmUpCi0JCQkJcmVzb2x2ZUNsYXNzKGMpOwotCQkJcmV0dXJuIGM7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzSW5EZXBlbmRlbnRKYXIoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlpZiAoaW5FQVJGaWxlKSB7Ci0JCQlyZXR1cm4gbG9hZENsYXNzSW5EZXBlbmRlbnRKYXJJbkVBUihuYW1lKTsKLQkJfSBlbHNlIGlmIChnZXRFeHRyYUNsYXNzTG9hZGVyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEV4dHJhQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobmFtZSk7Ci0JCX0KLQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzc0luRGVwZW5kZW50SmFySW5FQVIoU3RyaW5nIG5hbWUsIFNldCB2aXNpdGVkQXJjaGl2ZXMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG9iaiA9IGdldFJlc291cmNlSW5EZXBlbmRlbnRKYXJJbkVBUihuYW1lLCB2aXNpdGVkQXJjaGl2ZXMsIENMQVNTX1RZUEUpOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQl9Ci0JCXJldHVybiAoQ2xhc3MpIG9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzSW5EZXBlbmRlbnRKYXJJbkVBUihTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqID0gZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIENMQVNTX1RZUEUpOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotCQl9Ci0JCXJldHVybiAoQ2xhc3MpIG9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlRnJvbURlcGVuZGVudEphcihTdHJpbmcgbmFtZSkgewotCQlPYmplY3Qgb2JqID0gZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKG5hbWUsIEZJTEVfVFlQRSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJcmV0dXJuIChGaWxlKSBvYmo7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfVFlQRSA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFID0gMTsKLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKFN0cmluZyBuYW1lLCBpbnQgdHlwZSkgewotCQlTZXQgdmlzaXRlZEFyY2hpdmVzID0gbmV3IEhhc2hTZXQoNSk7Ci0JCXZpc2l0ZWRBcmNoaXZlcy5hZGQoZ2V0QXJjaGl2ZSgpKTsKLQkJcmV0dXJuIGdldFJlc291cmNlSW5EZXBlbmRlbnRKYXJJbkVBUihuYW1lLCB2aXNpdGVkQXJjaGl2ZXMsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UmVzb3VyY2VJbkRlcGVuZGVudEphckluRUFSKFN0cmluZyBuYW1lLCBTZXQgdmlzaXRlZEFyY2hpdmVzLCBpbnQgdHlwZSkgewotCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBhcmNoaXZlLmdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB1cmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShjbGFzc3BhdGhbaV0sIGFyY2hpdmUpOwotCQkJCWlmICh1cmkgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJRmlsZSBqYXJGaWxlID0gZ2V0RUFSRmlsZSgpLmdldEZpbGUodXJpKTsKLQkJCQlpZiAoamFyRmlsZS5pc0FyY2hpdmUoKSkgewotCQkJCQlBcmNoaXZlIGRlcCA9IChBcmNoaXZlKSBqYXJGaWxlOwotCQkJCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQkJCWNhc2UgQ0xBU1NfVFlQRSA6Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmV0dXJuICgoQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIpIGRlcC5nZXRBcmNoaXZlQ2xhc3NMb2FkZXIoKSkubG9hZENsYXNzKG5hbWUsIHZpc2l0ZWRBcmNoaXZlcyk7Ci0JCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBub0RpY2UpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJY2FzZSBGSUxFX1RZUEUgOgotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXJldHVybiBkZXAuZ2V0RmlsZShuYW1lKTsKLQkJCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gbm9EaWNlKSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGRlcEphck5vdEluRUFSKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMDAgOTo1OTo1NyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3QXJjaGl2ZQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZShBcmNoaXZlIG5ld0FyY2hpdmUpIHsKLQkJYXJjaGl2ZSA9IG5ld0FyY2hpdmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjEvMDAgNjo1ODowNSBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0cmFDbGFzc0xvYWRlcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0cmFDbGFzc0xvYWRlcihqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgbmV3RXh0cmFDbGFzc0xvYWRlcikgewotCQlleHRyYUNsYXNzTG9hZGVyID0gbmV3RXh0cmFDbGFzc0xvYWRlcjsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gZ2V0RmlsZShuYW1lKTsKLQkJCWlmIChudWxsICE9IGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImlvX2V4X2xvYWRpbmdfRVhDXyIsIChuZXcgT2JqZWN0W117bmFtZX0pKSwgZSk7IC8vJE5PTi1OTFMtMSQgPSAiQW4gSU8gZXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgIgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGdldEZpbGVGcm9tQXJjaGl2ZShTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEFyY2hpdmUoKS5nZXRGaWxlKG5hbWUpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IGdldEZpbGVGcm9tQXJjaGl2ZShuYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJZmlsZSA9IGdldEZpbGVGcm9tRGVwZW5kZW50SmFyKG5hbWUpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByb3RlY3RlZCBVUkwgZmluZFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChnZXRGaWxlKG5hbWUpICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwobnVsbCwgVVJMX1BST1RPQ09MICsgIjovLyIgKyBuYW1lLCBoYW5kbGVyKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEFyY2hpdmVVUkxTdHJlYW1IYW5kbGVyIGV4dGVuZHMgVVJMU3RyZWFtSGFuZGxlciB7Ci0JCXB1YmxpYyBBcmNoaXZlVVJMU3RyZWFtSGFuZGxlcigpIHsKLQkJfQotCi0JCXByb3RlY3RlZCBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IEFyY2hpdmVVUkxDb25uZWN0aW9uKHVybCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEFyY2hpdmVVUkxDb25uZWN0aW9uIGV4dGVuZHMgVVJMQ29ubmVjdGlvbiB7Ci0JCXByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKLQotCQlwcm90ZWN0ZWQgQXJjaGl2ZVVSTENvbm5lY3Rpb24oVVJMIHVybCkgewotCQkJc3VwZXIodXJsKTsKLQkJCXJlc291cmNlTmFtZSA9IHVybC50b1N0cmluZygpLnN1YnN0cmluZyhVUkxfUFJPVE9DT0wubGVuZ3RoKCkgKyAzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlTmFtZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwYzMwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSU1hcHBpbmdSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkVtcHR5UmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuR2VuZXJhbFhtbERvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5YbWxEb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0byBob2xkIGhlbHBlciBtZXRob2RzIGNvbW1vbiB0byBtdWx0aXBsZSBjbGFzc2VzIGluIHRoZSBhcmNoaXZlIHN1cHBvcnQKLSAqIHBhY2thZ2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NMQVNTID0gIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9KQVZBID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1NRTEogPSAiLnNxbGoiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pTUCA9ICIuanNwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzUnVudGltZSA9IGZhbHNlOwotCi0JLyoqCi0JICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0ZW1wIGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZCBmb3IgZXh0cmFjdGluZyBuZXN0ZWQgamFycyBmb3IKLQkgKiByZWFkOyBkZWZhdWx0cyB0byB0cnVlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkID0gdHJ1ZTsKLQotCS8qKgotCSAqIFNldHRhYmxlIG5hbWUgZm9yIHRoZSB0ZW1wIGRpcmVjdG9yeTsgbXVzdCByZXNvbHZlIHRvIGEgdmFsaWQgZmlsZSBvbiB0aGUgZmlsZSBzeXN0ZW07IGlmIG5vdAotCSAqIHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHRlbXBEaXJlY3RvcnlOYW1lOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBqYXZhLmlvLkZpbGUgdGVtcERpcmVjdG9yeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZVRvSmF2YVVyaShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJykuY29uY2F0KERPVF9KQVZBKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVUb1VyaShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJykuY29uY2F0KERPVF9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogRm9yIGEgZ2l2ZW4gdXJpIG9mIGEgLmNsYXNzIGZpbGUsIGRlcml2ZSB0aGUgdXJpIG9mIHRoZSAuamF2YSBmaWxlOyB0YWtlcyBpbnRvIGNvbnNpZGVyYXRpb24KLQkgKiBpbm5lciBjbGFzc2VzIGJ5IHNwbGl0dGluZyBvbiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAnJCcKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyBhIHVyaSBvciBudWxsIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIGRvZXNuJ3QgZW5kIHdpdGggIi5jbGFzcyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc1VyaVRvSmF2YVVyaShTdHJpbmcgY2xhc3NVcmkpIHsKLQkJaWYgKGNsYXNzVXJpID09IG51bGwgfHwgIWNsYXNzVXJpLmVuZHNXaXRoKERPVF9DTEFTUykpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdHJ1bmNhdGVkID0gdHJ1bmNhdGVJZ25vcmVDYXNlKGNsYXNzVXJpLCBET1RfQ0xBU1MpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cnVuY2F0ZWQsICIkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRvay5uZXh0VG9rZW4oKS5jb25jYXQoRE9UX0pBVkEpOwotCX0KLQotCS8qKgotCSAqIENvbmNhdGVuYXRlcyB0aGUgdHdvIHN0cmluZ3Mgd2l0aCBhIHNlcGFyYXRvciwgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2F0VXJpKFN0cmluZyBkaXJlY3RvcnluYW1lLCBTdHJpbmcgZmlsZW5hbWUsIGNoYXIgc2VwYXJhdG9yKSB7Ci0JCVN0cmluZyB1cmkgPSBkaXJlY3RvcnluYW1lOwotCQlpZiAoIWRpcmVjdG9yeW5hbWUuZW5kc1dpdGgoc2VwYXJhdG9yICsgIiIpICYmICFmaWxlbmFtZS5zdGFydHNXaXRoKHNlcGFyYXRvciArICIiKSkgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXVyaSA9IHVyaSArIHNlcGFyYXRvcjsKLQkJcmV0dXJuIHVyaSArIGZpbGVuYW1lOwotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgb3V0cHV0IHN0cmVhbSB1cCB1bnRpbCB0aGUgZmlyc3QgZW5kIG9mIGZpbGUKLQkgKiBjaGFyYWN0ZXIsIGFuZCBjbG9zZSB0aGUgdHdvIHN0cmVhbXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQl0cnkgewotCQkJaW50IG4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChidWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKCEoaW4gaW5zdGFuY2VvZiBaaXBJbnB1dFN0cmVhbSkpCi0JCQkJaW4uY2xvc2UoKTsKLQkJCWlmICghKG91dCBpbnN0YW5jZW9mIFppcE91dHB1dFN0cmVhbSkpCi0JCQkJb3V0LmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcERpcmVjdG9yeShTdHJpbmcgYmFzZU5hbWUsIEZpbGUgcGFyZW50RGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCUZpbGUgdGVtcEZpbGUgPSBjcmVhdGVUZW1wRmlsZShiYXNlTmFtZSwgcGFyZW50RGlyZWN0b3J5KTsKLQkJdGVtcEZpbGUuZGVsZXRlKCk7Ci0JCXRlbXBGaWxlLm1rZGlyKCk7Ci0JCXJldHVybiB0ZW1wRmlsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIGJhc2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVtcEZpbGUoYmFzZU5hbWUsIGdldFRlbXBEaXJlY3RvcnkoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBGaWxlKFN0cmluZyBiYXNlTmFtZSwgRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lVGFpbChiYXNlTmFtZSk7Ci0JCWlmIChmaWxlTmFtZS5sZW5ndGgoKSA8IDMpIHsKLQkJCWZpbGVOYW1lID0gIldTVE1QIiArIGZpbGVOYW1lOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZmlsZU5hbWUsIG51bGwsIGRpcmVjdG9yeSk7Ci0JCXJldHVybiB0ZW1wRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBkZWxldGVzIGEgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbTsgZm9yIGRpcmVjdG9yaWVzLCByZWN1cnNlIHRoZSBzdWJkaXJlY3RvcmllcyBhbmQgZGVsZXRlCi0JICogdGhlbSBhcyB3ZWxsCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWw7IGZhbHNlIGlmIGFueSBmaWxlIG9yIHN1YiBmaWxlIGNvdWxkIG5vdCBiZSBkZWxldGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZShGaWxlIGFGaWxlKSB7Ci0JCWlmIChhRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBhRmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIWRlbGV0ZShmaWxlc1tpXSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYUZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGZpbGVzLCByZWN1cnNpdmUsIHRoYXQgY2FuJ3QgYmUgd3JpdHRlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcml0ZVByb3RlY3RlZEZpbGVzKEZpbGUgYUZpbGUsIExpc3QgYUxpc3QpIHsKLQkJaWYgKGFMaXN0ID09IG51bGwpCi0JCQlhTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGFGaWxlLmV4aXN0cygpICYmICFhRmlsZS5jYW5Xcml0ZSgpKQotCQkJYUxpc3QuYWRkKGFGaWxlKTsKLQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGFGaWxlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWdldFdyaXRlUHJvdGVjdGVkRmlsZXMoZmlsZXNbaV0sIGFMaXN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogTGV2ZXJhZ2UgdGhlIGphdmEuaW8uRmlsZSBhcGlzIHRvIHJlc29sdmUgdGhpbmdzIGxpa2UgIi4veHh4IiBhbmQgIi4uL3h4eCIgaW50byB1cmlzIG9mCi0JICogZW50cmllcyBpbiB0aGUgZWFyIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NwYXRoRW50cnkgLQotCSAqICAgICAgICAgICAgYSBjbGFzc3BhdGggZW50cnkgZnJvbSB0aGUgbWFuaWZlc3Qgb2YKLQkgKiBAYW5BcmNoaXZlCi0JICogQHBhcmFtIGFuQXJjaGl2ZSAtCi0JICogICAgICAgICAgICB0aGUgYXJjaGl2ZSB0byB3aGljaCB0aGUgZGVwZW5kZW50IGphciBpcyByZWxhdGl2ZQotCSAqIAotCSAqIEByZXR1cm4gYSBjYW5hbm9uaWNhbGl6ZWQgcmVsYXRpdmUgdXJpIG9mIGFuIGVudHJ5IGluIGFuIGVhciBmaWxlIHJlcHJlc2VudGluZyB0aGUgZGVwZW5kZW50Ci0JICogICAgICAgICBqYXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXJpdmVFQVJSZWxhdGl2ZVVSSShTdHJpbmcgY2xhc3NwYXRoRW50cnksIEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCXJldHVybiBkZXJpdmVFQVJSZWxhdGl2ZVVSSShjbGFzc3BhdGhFbnRyeSwgYW5BcmNoaXZlLmdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBMZXZlcmFnZSB0aGUgamF2YS5pby5GaWxlIGFwaXMgdG8gcmVzb2x2ZSB0aGluZ3MgbGlrZSAiLi94eHgiIGFuZCAiLi4veHh4IiBpbnRvIHVyaXMgb2YKLQkgKiBlbnRyaWVzIGluIHRoZSBlYXIgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBjbGFzc3BhdGhFbnRyeSAtCi0JICogICAgICAgICAgICBhIGNsYXNzcGF0aCBlbnRyeSBmcm9tIHRoZSBtYW5pZmVzdCBvZiBhbiBhcmNoaXZlCi0JICogQHBhcmFtIFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgdXJpIG9mIHRoZSBhcmNoaXZlIHRvIHdoaWNoIHRoZSBkZXBlbmRlbnQgamFyIGlzIHJlbGF0aXZlCi0JICogCi0JICogQHJldHVybiBhIGNhbmFub25pY2FsaXplZCByZWxhdGl2ZSB1cmkgb2YgYW4gZW50cnkgaW4gYW4gZWFyIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBkZXBlbmRlbnQKLQkgKiAgICAgICAgIGphcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcml2ZUVBUlJlbGF0aXZlVVJJKFN0cmluZyBjbGFzc3BhdGhFbnRyeSwgU3RyaW5nIGFyY2hpdmVVcmkpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXJlbnQgPSBnZXRGaWxlTmFtZVBhcmVudChhcmNoaXZlVXJpKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXBhcmVudCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHdvcmtpbmdEaXIgPSBuZXcgamF2YS5pby5GaWxlKCIuIikuZ2V0Q2Fub25pY2FsUGF0aCgpOyAvLyROT04tTkxTLTEkCi0KLQkJCVN0cmluZyByZXNvbHZlZFBhdGggPSBuZXcgamF2YS5pby5GaWxlKHBhcmVudCwgY2xhc3NwYXRoRW50cnkpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCWlmICghcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgod29ya2luZ0RpcikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAocmVzb2x2ZWRQYXRoLmVxdWFscyh3b3JraW5nRGlyKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWludCBzdGFydCA9IHdvcmtpbmdEaXIuZW5kc1dpdGgoamF2YS5pby5GaWxlLnNlcGFyYXRvcikgPyB3b3JraW5nRGlyLmxlbmd0aCgpIDogd29ya2luZ0Rpci5sZW5ndGgoKSArIDE7Ci0JCQlyZXR1cm4gcmVzb2x2ZWRQYXRoLnN1YnN0cmluZyhzdGFydCwgcmVzb2x2ZWRQYXRoLmxlbmd0aCgpKS5yZXBsYWNlKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL2dldENhbm9uaWNhbFBhdGggY291bGQgdGhyb3cgdGhpcwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gIiIgaWYgdGhlcmUgaXMgbm8gZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWVFeHRlbnNpb24oU3RyaW5nIHVyaSkgewotCi0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBmcm9tIHRoZSB1cmksIG9yIHRoZSB0cnVuY2F0aW9uIG9mIHRoZSBzZWdtZW50IGFmdGVyIHRoZSBsYXN0Ci0JICogb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lUGFyZW50KFN0cmluZyB1cmkpIHsKLQkJU3RyaW5nIHRlbXBVUkkgPSB1cmkucmVwbGFjZSgnXFwnLCAnLycpOwotCQl3aGlsZSAodGVtcFVSSS5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQl0ZW1wVVJJID0gdGVtcFVSSS5zdWJzdHJpbmcoMCwgdGVtcFVSSS5sZW5ndGgoKSAtIDEpOwotCQlpbnQgbGFzdEluZGV4ID0gdGVtcFVSSS5sYXN0SW5kZXhPZignLycpOwotCQlpZiAobGFzdEluZGV4ID09IC0xKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGxhc3RJbmRleCA9PSAwKQotCQkJcmV0dXJuICIvIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdXJpLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHVyaSwgb3IgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lVGFpbChTdHJpbmcgdXJpKSB7Ci0JCVN0cmluZyB0ZW1wVVJJID0gdXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJd2hpbGUgKHRlbXBVUkkuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJdGVtcFVSSSA9IHRlbXBVUkkuc3Vic3RyaW5nKDAsIHRlbXBVUkkubGVuZ3RoKCkgLSAxKTsKLQkJaW50IGxhc3RJbmRleCA9IHRlbXBVUkkubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKGxhc3RJbmRleCA9PSAtMSkKLQkJCXJldHVybiB1cmk7Ci0JCXJldHVybiB1cmkuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEsIHRlbXBVUkkubGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIEZvciB0aGUgZ2l2ZW4gb2JqZWN0IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHJldHVybiB0aGUgb3duaW5nIG1vZHVsZSBmaWxlOyBmb3IKLQkgKiBleGFtcGxlLCByZXRyaWV2ZSB0aGUgRUpCSmFyRmlsZSB0aGF0IG93bnMgdGhlIEVKQkphci4gVGhpcyB3b3JrcyBldmVuIGZvciBhbHRzCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGUoRU9iamVjdCBkZE9iamVjdCkgewotCQlSZXNvdXJjZSByZXMgPSBkZE9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQXJjaGl2ZSBhcmNoaXZlID0gZ2V0QXJjaGl2ZShyZXMpOwotCQlpZiAoYXJjaGl2ZSA9PSBudWxsIHx8ICFhcmNoaXZlLmlzTW9kdWxlRmlsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCEocmVzIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJWE1MUmVzb3VyY2UgeG1sUmVzID0gKFhNTFJlc291cmNlKSByZXM7Ci0JCWlmICh4bWxSZXMuaXNBbHQoKSkKLQkJCXJldHVybiBnZXRNb2R1bGVGaWxlVXNpbmdBbHRERCgoRUFSRmlsZSkgYXJjaGl2ZSwgcmVzKTsKLQotCQlyZXR1cm4gKE1vZHVsZUZpbGUpIGFyY2hpdmU7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2R1bGVGaWxlIGdldE1vZHVsZUZpbGVVc2luZ0FsdEREKEVBUkZpbGUgZWFyLCBSZXNvdXJjZSByZXMpIHsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHVyaSA9IHJlcy5nZXRVUkkoKS50b1N0cmluZygpOwotCQlNb2R1bGUgbSA9IGVhci5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZUhhdmluZ0FsdEREKHVyaSk7Ci0JCWlmIChtID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTW9kdWxlUmVmIHJlZiA9IGVhci5nZXRNb2R1bGVSZWYobSk7Ci0JCWlmIChyZWYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiByZWYuZ2V0TW9kdWxlRmlsZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZUZpbGVUeXBlTmFtZShpbnQgbW9kdWxlVHlwZSkgewotCQlzd2l0Y2ggKG1vZHVsZVR5cGUpIHsKLQkJCWNhc2UgWE1MUmVzb3VyY2UuQVBQTElDQVRJT05fVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBX0FwcGxpY2F0aW9uX2ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBYTUxSZXNvdXJjZS5BUFBfQ0xJRU5UX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQW5fQXBwbGljYXRpb25fQ2xpZW50X0pBUl9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgWE1MUmVzb3VyY2UuRUpCX1RZUEUgOgotCQkJCXJldHVybiBDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQW5fRUpCX0pBUl9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgWE1MUmVzb3VyY2UuV0VCX0FQUF9UWVBFIDoKLQkJCQlyZXR1cm4gQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFfV0FSX2ZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBYTUxSZXNvdXJjZS5SQVJfVFlQRSA6Ci0JCQkJcmV0dXJuIENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBX1JBUl9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdGhlIGdpdmVuIHJlc291cmNlLCByZXR1cm4gdGhlIG93bmluZyBtb2R1bGUgZmlsZTsgZm9yIGV4YW1wbGUsIHJldHJpZXZlIHRoZSBFSkJKYXJGaWxlCi0JICogdGhhdCBvd25zIHRoZSBFSkJKYXIuIEluIHRoZSBjYXNlIG9mIGFsdHMsIHRoaXMgcmV0dXJucyB0aGUgRUFSRmlsZSBhbmQgbm90IHRoZSBtb2R1bGUgZmlsZS4KLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbDsgY2xpZW50cyBzaG91bGQgdXNlIHtAbGluayAjZ2V0TW9kdWxlRmlsZShFT2JqZWN0KX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFyY2hpdmUgZ2V0QXJjaGl2ZShSZXNvdXJjZSByZXMpIHsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJUmVzb3VyY2VTZXQgc2V0ID0gcmVzLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVVSSUNvbnZlcnRlciBjb252ID0gc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQlpZiAoY29udiA9PSBudWxsIHx8ICEoY29udiBpbnN0YW5jZW9mIEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoKEFyY2hpdmVVUklDb252ZXJ0ZXJJbXBsKSBjb252KS5nZXRBcmNoaXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gc3RyaW5ncyBhbmQgZW5zdXJlcyB0aGUgY29ycmVjdCBzZXBhcmF0b3IgaXMgdXNlZCBpbiB0aGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9TVXJpKFN0cmluZyB1cmkpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCWlmIChzZXAgIT0gJy8nKQotCQkJcmV0dXJuIHVyaS5yZXBsYWNlKCcvJywgc2VwKTsKLQkJcmV0dXJuIHVyaS5yZXBsYWNlKCdcXCcsIHNlcCk7Ci0JfQotCi0JLyoqCi0JICogQ29uY2F0ZW5hdGVzIHRoZSB0d28gc3RyaW5ncyBhbmQgZW5zdXJlcyB0aGUgY29ycmVjdCBzZXBhcmF0b3IgaXMgdXNlZCBpbiB0aGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9TVXJpKFN0cmluZyBkaXJlY3RvcnluYW1lLCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nIG9zRGlyTmFtZSA9IGdldE9TVXJpKGRpcmVjdG9yeW5hbWUpOwotCQlTdHJpbmcgb3NGaWxlTmFtZSA9IGdldE9TVXJpKGZpbGVuYW1lKTsKLQkJcmV0dXJuIGNvbmNhdFVyaShvc0Rpck5hbWUsIG9zRmlsZU5hbWUsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgZXh0ZW50IG9mIHRoZSByZXNvdXJjZQotCSAqIAotCSAqIEB0aHJvd3MgRW1wdHlSZXNvdXJjZUV4Y2VwdGlvbiAtCi0JICogICAgICAgICAgICAgdGhyb3duIGlmIHRoZSBleHRlbnQgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0Um9vdChSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBFbXB0eVJlc291cmNlRXhjZXB0aW9uIHsKLQkJRUxpc3QgZXh0ZW50ID0gYVJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCWlmIChleHRlbnQuc2l6ZSgpIDwgMSkgewotCQkJdGhyb3cgbmV3IEVtcHR5UmVzb3VyY2VFeGNlcHRpb24oYVJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiAoRU9iamVjdCkgZXh0ZW50LmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZSBnZXRUZW1wRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdGVtcERpcmVjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOS8wMCAxOjE2OjQ4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRUZW1wRGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIHRlbXBEaXJlY3RvcnlOYW1lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBnZXRUb2tlbnMoYVN0cmluZywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUb2tlbnMoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIpIHsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gKGRlbGltaXRlciA9PSBudWxsKSA/IG5ldyBTdHJpbmdUb2tlbml6ZXIoYVN0cmluZykgOiBuZXcgU3RyaW5nVG9rZW5pemVyKGFTdHJpbmcsIGRlbGltaXRlcik7Ci0JCWludCBzaXplID0gdG9rLmNvdW50VG9rZW5zKCk7Ci0JCVN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAmJiB0b2suaGFzTW9yZVRva2VucygpOyBpKyspIHsKLQkJCXRva2Vuc1tpXSA9IHRvay5uZXh0VG9rZW4oKTsKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlSWdub3JlS2V5Q2FzZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWVJZ25vcmVLZXlDYXNlKGphdmEubGFuZy5TdHJpbmcga2V5LCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMgYXR0cikgewotCQlJdGVyYXRvciBrZXlzQW5kVmFsdWVzID0gYXR0ci5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChrZXlzQW5kVmFsdWVzLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkga2V5c0FuZFZhbHVlcy5uZXh0KCk7Ci0JCQlTdHJpbmcgZW50cnlLZXkgPSBlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpOwotCQkJaWYgKGVudHJ5S2V5LmVxdWFsc0lnbm9yZUNhc2Uoa2V5KSkKLQkJCQlyZXR1cm4gZW50cnkuZ2V0VmFsdWUoKSA9PSBudWxsID8gbnVsbCA6IGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5mb3JtKFN0cmluZyBtZXNzYWdlKSB7Ci0JCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gdXAgdW50aWwgdGhlIGZpcnN0IGVuZCBvZiBmaWxlIGNoYXJhY3RlciwgYWRkIHRoaXMKLQkgKiBkYXRhIHRvIGEgYnl0ZSBhcnJheSwgYW5kIGNsb3NlIHRoZSBpbnB1dCBzdHJlYW07IHJldHVybnMgdGhlIGJ5dGUgYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBpbnB1dFN0cmVhbVRvQnl0ZXMoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWNvcHkoaW4sIG91dCk7Ci0JCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBKYXZhVVJMLmlzSmF2YVVSTChhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVnaXN0ZXJlZFVSSU1hcHBpbmcoUmVzb3VyY2UgcmVzKSB7Ci0JCXJldHVybiBVUklNYXBwaW5nUmVnaXN0cnlJbXBsLklOU1RBTkNFLmdldFVSSShyZXMuZ2V0VVJJKCkpICE9IHJlcy5nZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybU1ldGFSZXNvdXJjZShSZXNvdXJjZSByZXMpIHsKLQkJVVJJIHVyaSA9IHJlcy5nZXRVUkkoKTsKLQkJcmV0dXJuICJwbGF0Zm9ybSIuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgIm1ldGEiLmVxdWFscyh1cmkuc2VnbWVudCgwKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGxPckVtcHR5KFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBhU3RyaW5nID09IG51bGwgfHwgYVN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lKCkgewotCQlyZXR1cm4gaXNSdW50aW1lOwotCX0KLQotCS8qKgotCSAqIElzIGl0IHdpdGhpbiB0aGUgc3BlYyBmb3IgdGhlIEpBUiBvciBtb2R1bGUgZmlsZSB0byByZWZlcmVuY2UgdGhlIGFyY2hpdmUgdmlhIHRoZSBNYW5pZmVzdAotCSAqIENsYXNzLVBhdGg/Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWREZXBlbmRlbmN5KEFyY2hpdmUgcmVmZXJlbmNlZEpBUiwgQXJjaGl2ZSByZWZlcmVuY2luZ0pBUikgewotCQkvL05vIG90aGVyIG1vZHVsZXMgc2hvdWxkIHJlZmVyZW5jZSB3YXJzCi0JCWlmIChyZWZlcmVuY2VkSkFSLmlzV0FSRmlsZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChyZWZlcmVuY2VkSkFSID09IHJlZmVyZW5jaW5nSkFSKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vQ2xpZW50cyBjYW4gcmVmZXJlbmNlIGFsbCBidXQgdGhlIFdBUnMsIHdoaWNoIHdlJ3ZlIGFscmVhZHkgY292ZXJlZAotCQkvLyBhYm92ZTsgV0FScyBhbmQgRUpCIEpBUnMKLQkJLy9jYW4gcmVmZXJlbmNlIGFsbCBidXQgV0FScywgYWJvdmUsIG9yIEFwcGxpY2F0aW9uQ2xpZW50cwotCQlyZXR1cm4gcmVmZXJlbmNpbmdKQVIuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB8fCAhcmVmZXJlbmNlZEpBUi5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGEgcHJvcGVydGllcyBmaWxlIHdpdGggdGhlIGdpdmVuIHVyaSBmcm9tIHRoZSBnaXZlbiBhcmNoaXZlCi0JICogCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYXJjaGl2ZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzIHJlYWRpbmcgdGhlIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoQXJjaGl2ZSBhcmNoaXZlLCBTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gYXJjaGl2ZS5nZXRJbnB1dFN0cmVhbSh1cmkpOwotCQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXAubG9hZChpbik7Ci0JCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCWluLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SXNSdW50aW1lKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJaXNSdW50aW1lID0gYUJvb2xlYW47Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZChib29sZWFuIHZhbHVlKSB7Ci0JCXNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgMToyNjoyOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGVtcERpcmVjdG9yeQotCSAqICAgICAgICAgICAgamF2YS5pby5GaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFRlbXBEaXJlY3RvcnkoamF2YS5pby5GaWxlIG5ld1RlbXBEaXJlY3RvcnkpIHsKLQkJdGVtcERpcmVjdG9yeSA9IG5ld1RlbXBEaXJlY3Rvcnk7Ci0JCXRlbXBEaXJlY3RvcnlOYW1lID0gbmV3VGVtcERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZW1wIGRpcmVjdG9yeSB0byB0aGUgc3BlY2lmaWVkIHBhdGg7IGNyZWF0ZXMgaXQgYW5kIHNldHMgaXQgdG8gYmUgZGVsZXRlZCBvbiBleGl0Ci0JICogaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIG5ld1RlbXBEaXJlY3RvcnlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHRocm93cyBBcmNoaXZlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgdGhyb3duIGlmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgYW5kIGNhbiBub3QgYmUgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUZW1wRGlyZWN0b3J5TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld1RlbXBEaXJlY3RvcnlOYW1lKSB0aHJvd3MgQXJjaGl2ZUV4Y2VwdGlvbiB7Ci0JCWphdmEuaW8uRmlsZSBkaXIgPSBuZXcgamF2YS5pby5GaWxlKG5ld1RlbXBEaXJlY3RvcnlOYW1lKTsKLQkJaWYgKCFkaXIuZXhpc3RzKCkpIHsKLQkJCWRpci5ta2RpcnMoKTsKLQkJCWlmICghZGlyLmV4aXN0cygpKQotCQkJCXRocm93IG5ldyBBcmNoaXZlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJtYWtlX3RlbXBfZGlyX0VYQ18iLCAobmV3IE9iamVjdFtde25ld1RlbXBEaXJlY3RvcnlOYW1lfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJVbmFibGUgdG8gbWFrZSB0ZW1wIGRpcmVjdG9yeTogIgotCQkJZGlyLmRlbGV0ZU9uRXhpdCgpOwotCQl9Ci0JCXNldFRlbXBEaXJlY3RvcnkoZGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xOS8wMCAxOjA4OjIwIFBNKQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VUZW1wRGlyZWN0b3J5Rm9yUmVhZCgpIHsKLQkJcmV0dXJuIHNob3VsZFVzZVRlbXBEaXJlY3RvcnlGb3JSZWFkOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGxpc3Qgb2Ygc3RyaW5nIGVsZW1lbnRzIHRvIGFuIGFycmF5IG9mIGZpbGUgVVJMczsgaWYgYW4gZW50cnkgaXMgcmVsYXRpdmUsIG1ha2UKLQkgKiBpdCByZWxhdGl2ZSB0byB0aGUgdXJpIHJvb3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubmV0LlVSTFtdIHRvTG9jYWxVUkxzKExpc3QgZW50cmllcywgU3RyaW5nIHVyaVJvb3QpIHsKLQkJTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoRW50cnkgPSAoU3RyaW5nKSBlbnRyaWVzLmdldChpKTsKLQkJCWphdmEuaW8uRmlsZSBhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aEVudHJ5KTsKLQkJCWlmICghYUZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJcGF0aEVudHJ5ID0gZ2V0T1NVcmkodXJpUm9vdCwgcGF0aEVudHJ5KTsKLQkJCQlhRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGF0aEVudHJ5KTsKLQkJCX0KLQkJCWlmICghYUZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvL2luZm9ybSgiQ2xhc3NwYXRoIGVsZW1lbnQgIiArIHBhdGhFbnRyeSArICIgZG9lcyBub3QKLQkJCQkvLyBleGlzdCIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlpZiAoIXBhdGhFbnRyeS5lbmRzV2l0aChqYXZhLmlvLkZpbGUuc2VwYXJhdG9yKSkgewotCQkJCQlwYXRoRW50cnkgPSBwYXRoRW50cnkgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVppcEZpbGUgemlwID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl6aXAgPSBuZXcgWmlwRmlsZShhRmlsZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWluZm9ybShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiaW52YWxpZF9jbGFzc3BhdGhfV0FSTl8iLCAobmV3IE9iamVjdFtde3BhdGhFbnRyeX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiQ2xhc3NwYXRoIGVsZW1lbnQgInswfSIgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGEgWmlwIGZpbGUiCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmICh6aXAgIT0gbnVsbCkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJemlwLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCQkJCQkvL0lnbm9yZQotCQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJYUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhdGhFbnRyeSk7Ci0JCQkJamF2YS5uZXQuVVJMIGFVcmwgPSBhRmlsZS50b1VSTCgpOyAvLyROT04tTkxTLTEkCi0JCQkJdXJscy5hZGQoYVVybCk7Ci0JCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLQkJCQlpbmZvcm0oQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImludmFsaWRfY3BfZmlsZV9XQVJOXyIsIChuZXcgT2JqZWN0W117cGF0aEVudHJ5fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJDbGFzc3BhdGggZWxlbWVudCAiezB9IiBkb2VzIG5vdCBwb2ludCB0byBhIGxvY2FsIGZpbGUiCi0JCQl9Ci0JCX0KLQkJamF2YS5uZXQuVVJMW10gdXJsQXJyYXkgPSBuZXcgamF2YS5uZXQuVVJMW3VybHMuc2l6ZSgpXTsKLQkJcmV0dXJuIChqYXZhLm5ldC5VUkxbXSkgdXJscy50b0FycmF5KHVybEFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWJzdHJpbmcgb2YgdGhlIGZpcnN0IHBhcmFtZXRlciwgc3RhcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcHJlZml4Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ1bmNhdGVGcm9tRnJvbnRJZ25vcmVDYXNlKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgbGVhZGluZ1N1YlN0cmluZykgewotCQlpZiAoIWFTdHJpbmcudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGxlYWRpbmdTdWJTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQlyZXR1cm4gYVN0cmluZzsKLQkJcmV0dXJuIGFTdHJpbmcuc3Vic3RyaW5nKGxlYWRpbmdTdWJTdHJpbmcubGVuZ3RoKCksIGFTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1YnN0cmluZyBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyLCB1cCB0byB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2Vjb25kCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ1bmNhdGVJZ25vcmVDYXNlKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgdHJhaWxpbmdTdWJTdHJpbmcpIHsKLQkJaW50IGluZGV4ID0gYVN0cmluZy50b0xvd2VyQ2FzZSgpLmxhc3RJbmRleE9mKHRyYWlsaW5nU3ViU3RyaW5nLnRvTG93ZXJDYXNlKCkpOwotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlyZXR1cm4gYVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmlUb0NsYXNzTmFtZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiB0cnVuY2F0ZUlnbm9yZUNhc2UodXJpLnJlcGxhY2UoJy8nLCAnLicpLCBET1RfQ0xBU1MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0oyRUUxM0Zhc3RDaGVjayhNb2R1bGVGaWxlIG1vZHVsZUZpbGUpIHsKLQkJaWYgKG1vZHVsZUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkKLQkJCXJldHVybiB0cnVlOwotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCVN0cmluZyB1cmkgPSBtb2R1bGVGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCk7Ci0JCXRyeSB7Ci0JCQlpbiA9IG1vZHVsZUZpbGUuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQotCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBYbWxEb2N1bWVudFJlYWRlci5yZWFkRG9jdW1lbnRUeXBlKGluLCB1cmkpOwotCQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBpZHMgPSBnZXRKMkVFMTNQdWJsaWNBbmRTeXN0ZW1JZEZvcihtb2R1bGVGaWxlKTsKLQkJCWlmIChpZHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gaWRzWzBdLmVxdWFscyhkb2NUeXBlLmdldFB1YmxpY0lkKCkpICYmIGlkc1sxXS5lcXVhbHMoZG9jVHlwZS5nZXRTeXN0ZW1JZCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0SjJFRTEzUHVibGljQW5kU3lzdGVtSWRGb3IoTW9kdWxlRmlsZSBtb2R1bGVGaWxlKSB7Ci0JCWlmIChtb2R1bGVGaWxlLmlzRUFSRmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMywgSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzN9OwotCQllbHNlIGlmIChtb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8yXzAsIEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzJfMH07Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMywgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfM307Ci0JCWVsc2UgaWYgKG1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuV0VCQVBQX1BVQkxJQ0lEXzJfMywgSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zfTsKLQkJZWxzZSBpZiAobW9kdWxlRmlsZS5pc1JBUkZpbGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wLCBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzB9OwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvL1RPRE8gZG9pbmcgdGhlIHBhcnNlIHdpdGggU0FYIHdvdWxkIGJlIGZhc3RlcgotCXB1YmxpYyBzdGF0aWMgaW50IGdldEZhc3RTcGVjVmVyc2lvbihNb2R1bGVGaWxlIG1vZHVsZUZpbGUpIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlTdHJpbmcgdXJpID0gbW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclVyaSgpOwotCQl0cnkgewotCQkJaW4gPSBtb2R1bGVGaWxlLmdldElucHV0U3RyZWFtKHVyaSk7Ci0KLQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gbnVsbDsKLQotCQkJSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKGluKTsKLQkJCUdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBhUmVhZGVyID0gbmV3IFhtbERvY3VtZW50UmVhZGVyKHNvdXJjZSk7Ci0JCQlhUmVhZGVyLnNldFZhbGlkYXRlKGZhbHNlKTsKLQkJCURvY3VtZW50IGFEb2N1bWVudCA9IGFSZWFkZXIucGFyc2VEb2N1bWVudCgpOwotCQkJaWYgKGFEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZG9jVHlwZSA9IGFEb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCQl9Ci0JCQlpbnQgdmVyc2lvbiA9IC0xOwotCQkJaWYgKG51bGwgIT0gZG9jVHlwZSkgewotCQkJCVN0cmluZyBwdWJsaWNJRCA9IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJCQlTdHJpbmcgc3lzdGVtSUQgPSBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0JCQkJaWYgKHB1YmxpY0lEICE9IG51bGwgJiYgc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCQl2ZXJzaW9uID0gbG9va3VwVmVyc2lvbihtb2R1bGVGaWxlLCBwdWJsaWNJRCwgc3lzdGVtSUQpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh2ZXJzaW9uID09IC0xKSB7Ci0JCQkJU3RyaW5nIHNjaGVtYU5hbWUgPSBudWxsOwotCQkJCVN0cmluZyB2ZXJzaW9uU3RyaW5nID0gbnVsbDsKLQkJCQlpZiAoYURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJaWYgKG51bGwgPT0gZG9jVHlwZSkgewotCQkJCQkJTmFtZWROb2RlTWFwIG1hcCA9IGFEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlpZiAobnVsbCAhPSBtYXApIHsKLQkJCQkJCQlOb2RlIHNjaGVtYU5vZGUgPSBtYXAuZ2V0TmFtZWRJdGVtKCJ4c2k6c2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChudWxsICE9IHNjaGVtYU5vZGUpIHsKLQkJCQkJCQkJc2NoZW1hTmFtZSA9IHNjaGVtYU5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCU5vZGUgdmVyc2lvbk5vZGUgPSBtYXAuZ2V0TmFtZWRJdGVtKCJ2ZXJzaW9uIik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChudWxsICE9IHZlcnNpb25Ob2RlKSB7Ci0JCQkJCQkJCXZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uTm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG51bGwgIT0gc2NoZW1hTmFtZSkgewotCQkJCQl2ZXJzaW9uID0gbG9va3VwVmVyc2lvbihtb2R1bGVGaWxlLCBzY2hlbWFOYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKHZlcnNpb24gPT0gLTEpIHsKLQkJCQkJdmVyc2lvbiA9IHBhcnNlVmVyc2lvblN0cmluZyhtb2R1bGVGaWxlLCB2ZXJzaW9uU3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiB2ZXJzaW9uOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIC0xOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBwYXJzZVZlcnNpb25TdHJpbmcoTW9kdWxlRmlsZSBtb2R1bGVGaWxlLCBTdHJpbmcgdmVyc2lvbkF0dHIpIHsKLQkJaW50IHZlcnNpb24gPSAtMTsKLQkJaWYgKG1vZHVsZUZpbGUuaXNFQVJGaWxlKCkpIHsKLQkJCWlmIChudWxsID09IHZlcnNpb25BdHRyKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCWlmIChudWxsID09IHZlcnNpb25BdHRyKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMV9URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzBfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQlpZiAobnVsbCA9PSB2ZXJzaW9uQXR0cikgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwotCQkJfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzJfVEVYVCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQkJCX0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8zX1RFWFQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpIHsKLQkJCWlmIChudWxsID09IHZlcnNpb25BdHRyKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQl9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmVyc2lvbjsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBsb29rdXBWZXJzaW9uKE1vZHVsZUZpbGUgbW9kdWxlRmlsZSwgU3RyaW5nIHNjaGVtYU5hbWUpIHsKLQkJaW50IHZlcnNpb24gPSAtMTsKLQkJaWYgKG1vZHVsZUZpbGUuaXNFQVJGaWxlKCkpIHsKLQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV8xXzQpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCWlmICgoc2NoZW1hTmFtZS5pbmRleE9mKEoyRUVDb25zdGFudHMuRUpCSkFSX1NDSEVNQV8yXzFfTlMpKSAhPSAtMSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfMV80KSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU0NIRU1BXzJfNCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQlpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BXzFfNSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwVmVyc2lvbihNb2R1bGVGaWxlIG1vZHVsZUZpbGUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0JCWludCB2ZXJzaW9uID0gLTE7Ci0JCWlmIChtb2R1bGVGaWxlLmlzRUFSRmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8zKSAmJiBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzMpKSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzIpICYmIHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMikpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzRUpCSmFyRmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzJfMCkgJiYgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzJfMCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDsKLQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzFfMSkgJiYgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzFfMSkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobW9kdWxlRmlsZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzMpICYmIHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCX0gZWxzZSBpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzIpICYmIHN5c3RlbUlELmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8yKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCWlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8zKSAmJiBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOwotCQkJfSBlbHNlIGlmIChwdWJsaWNJRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8yKSAmJiBzeXN0ZW1JRC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8yKSkgewotCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2R1bGVGaWxlLmlzUkFSRmlsZSgpKSB7Ci0JCQlpZiAocHVibGljSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMCkgJiYgc3lzdGVtSUQuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMCkpIHsKLQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NsYXNzcGF0aFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ2xhc3NwYXRoVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYyNTgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ2xhc3NwYXRoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc01hbmlmZXN0KFN0cmluZyBpblBhdGgsIExpc3QgcnRDbGFzc3BhdGgsIFNldCBwcm9jZXNzZWRQYXRocykgewotCQlBcnJheUxpc3QgcGF0aHMgPSBnZXRNYW5pZmVzdFBhdGhzKGluUGF0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMuc2l6ZSgpOyBpKyspIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChSdW50aW1lQ2xhc3NwYXRoRW50cnkpIHBhdGhzLmdldChpKTsKLQkJCWlmICghcHJvY2Vzc2VkUGF0aHMuY29udGFpbnMoZW50cnkpKSB7Ci0JCQkJcHJvY2Vzc2VkUGF0aHMuYWRkKGVudHJ5KTsKLQkJCQlydENsYXNzcGF0aC5hZGQoZW50cnkpOwotCQkJCXByb2Nlc3NNYW5pZmVzdChlbnRyeS5nZXRBYnNvbHV0ZVBhdGgoKSwgcnRDbGFzc3BhdGgsIHByb2Nlc3NlZFBhdGhzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgUnVudGltZUNsYXNzcGF0aEVudHJ5IGNyZWF0ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShTdHJpbmcgYWJzb2x1dGVQYXRoLCBTdHJpbmcgbWFuaWZlc3RWYWx1ZSkgewotCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBuZXcgUnVudGltZUNsYXNzcGF0aEVudHJ5SW1wbCgpOwotCQllbnRyeS5zZXRBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTsKLQkJZW50cnkuc2V0TWFuaWZlc3RWYWx1ZShtYW5pZmVzdFZhbHVlKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgQXJyYXlMaXN0IGdldE1hbmlmZXN0UGF0aHMoU3RyaW5nIHBhdGgpIHsKLQkJQXJyYXlMaXN0IG1hbmlmZXN0UGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoZi5leGlzdHMoKSkgewotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotCQkJCUZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgIk1FVEEtSU5GIiArIEZpbGUuc2VwYXJhdG9yICsgIk1BTklGRVNULk1GIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpOwotCQkJCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaW5wdXRTdHJlYW0pOwotCQkJCQkJbWFuaWZlc3RQYXRocyA9IGdldE1hbmlmZXN0Q2xhc3NQYXRocyhtYW5pZmVzdCwgZi5nZXRQYXJlbnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vSWdub3JlCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAobnVsbCAhPSBpbnB1dFN0cmVhbSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUphckZpbGUgamFyRmlsZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJamFyRmlsZSA9IG5ldyBKYXJGaWxlKGYpOwotCQkJCQlNYW5pZmVzdCBtYW5pZmVzdCA9IGphckZpbGUuZ2V0TWFuaWZlc3QoKTsKLQkJCQkJaWYgKG1hbmlmZXN0ICE9IG51bGwpCi0JCQkJCQltYW5pZmVzdFBhdGhzID0gZ2V0TWFuaWZlc3RDbGFzc1BhdGhzKG1hbmlmZXN0LCBmLmdldFBhcmVudCgpKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGphckZpbGUgIT0gbnVsbCkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJamFyRmlsZS5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvL0lnbm9yZQotCQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWFuaWZlc3RQYXRoczsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEFycmF5TGlzdCBnZXRNYW5pZmVzdENsYXNzUGF0aHMoTWFuaWZlc3QgbWFuaWZlc3QsIFN0cmluZyBhcmNoaXZlUGF0aCkgewotCQlBcnJheUxpc3QgcGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUF0dHJpYnV0ZXMgbWFpbiA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCVN0cmluZyBjbGFzc1BhdGggPSBtYWluLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIKTsKLQkJaWYgKGNsYXNzUGF0aCAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzUGF0aCwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCQkJCVN0cmluZyBwYXRoID0gYXJjaGl2ZVBhdGggKyBGaWxlLnNlcGFyYXRvciArIHRva2VuOwotCQkJCXBhdGggPSBub3JtYWxpemVQYXRoKHBhdGgpOwotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5leGlzdHMoKSkgewotCQkJCQlwYXRoTGlzdC5hZGQoY3JlYXRlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgsIHRva2VuKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoTGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQl0cnkgewotCQkJZiA9IGYuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGYuZ2V0UGF0aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGZiYTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNsaWVudE1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db25uZWN0b3JNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgQ29tbW9uYXJjaGl2ZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIENvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSAoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgdHlwZSkuZUNsYXNzKCkuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1vbmFyY2hpdmVTd2l0Y2ggc3cgPSBuZXcgQ29tbW9uYXJjaGl2ZVN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyKENvbnRhaW5lciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250YWluZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VXQVJGaWxlKFdBUkZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV0FSRmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZUZpbGUoTW9kdWxlRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNb2R1bGVGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUFSRmlsZShFQVJGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVBUkZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphckZpbGUoRUpCSmFyRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFSkJKYXJGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUkFSRmlsZShSQVJGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJBUkZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcmNoaXZlKEFyY2hpdmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXJjaGl2ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUZpbGUoRmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlUmVhZE9ubHlEaXJlY3RvcnkoUmVhZE9ubHlEaXJlY3Rvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnlBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBzdy5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuIEl0J3MgdXNlZnVsIHRvCi0JICogaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250YWluZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0Q29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV0FSRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQVJGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJBUkZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcmNoaXZlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkNsaWVudEphckZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWFkT25seURpcmVjdG9yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQk1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYk1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNsaWVudE1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbW9uYXJjaGl2ZVN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBDb21tb25hcmNoaXZlU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlRmlsZShGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXJjaGl2ZShBcmNoaXZlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcmNoaXZlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRmlsZShFSkJKYXJGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJKYXJGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV0FSRmlsZShXQVJGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXQVJGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUFSRmlsZShFQVJGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFQVJGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlRmlsZShNb2R1bGVGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyKENvbnRhaW5lciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVhZE9ubHlEaXJlY3RvcnkoUmVhZE9ubHlEaXJlY3Rvcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlYWRPbmx5RGlyZWN0b3J5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUkFSRmlsZShSQVJGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSQVJGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlUmVmKE1vZHVsZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCTW9kdWxlUmVmKEVKQk1vZHVsZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCTW9kdWxlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViTW9kdWxlUmVmKFdlYk1vZHVsZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViTW9kdWxlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ2xpZW50TW9kdWxlUmVmKENsaWVudE1vZHVsZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2xpZW50TW9kdWxlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdG9yTW9kdWxlUmVmKENvbm5lY3Rvck1vZHVsZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuIEl0J3MgdXNlZnVsIHRvCi0JICogaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250YWluZXJBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdBUkZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUFSRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkphckZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSQVJGaWxlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJjaGl2ZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWFkT25seURpcmVjdG9yeUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0NvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNjZmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNsaWVudE1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db25uZWN0b3JNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tb25hcmNoaXZlU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21tb25hcmNoaXZlUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3Rvcnk7Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZVN3aXRjaCgpIHsKLQkJZmFjdG9yeSA9IChDb21tb25hcmNoaXZlRmFjdG9yeSkgQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCW1vZGVsUGFja2FnZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpICE9IG1vZGVsUGFja2FnZSkKLQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQotCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRSA6IHsKLQkJCQlXQVJGaWxlIGNhc3RlZE9iamVjdCA9IChXQVJGaWxlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV0FSRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VBcmNoaXZlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEUgOiB7Ci0JCQkJRUFSRmlsZSBjYXN0ZWRPYmplY3QgPSAoRUFSRmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVBUkZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQXJjaGl2ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFIDogewotCQkJCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjYXN0ZWRPYmplY3QgPSAoQXBwbGljYXRpb25DbGllbnRGaWxlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXBwbGljYXRpb25DbGllbnRGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUFyY2hpdmUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEUgOiB7Ci0JCQkJRUpCSmFyRmlsZSBjYXN0ZWRPYmplY3QgPSAoRUpCSmFyRmlsZSkgdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkphckZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQXJjaGl2ZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFIDogewotCQkJCVJBUkZpbGUgY2FzdGVkT2JqZWN0ID0gKFJBUkZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSQVJGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUFyY2hpdmUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VDb250YWluZXIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VGaWxlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFIDogewotCQkJCUFyY2hpdmUgY2FzdGVkT2JqZWN0ID0gKEFyY2hpdmUpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcmNoaXZlKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlQ29udGFpbmVyKGNhc3RlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRSA6IHsKLQkJCQlGaWxlIGNhc3RlZE9iamVjdCA9IChGaWxlKSB0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRmlsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkVBRF9PTkxZX0RJUkVDVE9SWSA6IHsKLQkJCQlSZWFkT25seURpcmVjdG9yeSBjYXN0ZWRPYmplY3QgPSAoUmVhZE9ubHlEaXJlY3RvcnkpIHRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZWFkT25seURpcmVjdG9yeShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUZpbGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9IC8vIGRvU3dpdGNoCi0KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXIoQ29udGFpbmVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VXQVJGaWxlKFdBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZUZpbGUoTW9kdWxlRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlRUFSRmlsZShFQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXJGaWxlKEVKQkphckZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZVJBUkZpbGUoUkFSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYXNlQXJjaGl2ZShBcmNoaXZlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWxlKEZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY2FzZVJlYWRPbmx5RGlyZWN0b3J5KFJlYWRPbmx5RGlyZWN0b3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZVJlZihNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQk1vZHVsZVJlZihFSkJNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYk1vZHVsZVJlZihXZWJNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNsaWVudE1vZHVsZVJlZihDbGllbnRNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbm5lY3Rvck1vZHVsZVJlZihDb25uZWN0b3JNb2R1bGVSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2hHZW4oRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRTogewotCQkJCUZpbGUgZmlsZSA9IChGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWxlKGZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVJDSElWRTogewotCQkJCUFyY2hpdmUgYXJjaGl2ZSA9IChBcmNoaXZlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcmNoaXZlKGFyY2hpdmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihhcmNoaXZlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKGFyY2hpdmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUpCX0pBUl9GSUxFOiB7Ci0JCQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gKEVKQkphckZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkphckZpbGUoZWpiSmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKGVqYkphckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihlamJKYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKGVqYkphckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEU6IHsKLQkJCQlXQVJGaWxlIHdhckZpbGUgPSAoV0FSRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV0FSRmlsZSh3YXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVGaWxlKHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFyY2hpdmUod2FyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKHdhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUod2FyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRTogewotCQkJCUVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFQVJGaWxlKGVhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShlYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIoZWFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShlYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFOiB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnRGaWxlIGFwcGxpY2F0aW9uQ2xpZW50RmlsZSA9IChBcHBsaWNhdGlvbkNsaWVudEZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50RmlsZShhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUoYXBwbGljYXRpb25DbGllbnRGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKGFwcGxpY2F0aW9uQ2xpZW50RmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKGFwcGxpY2F0aW9uQ2xpZW50RmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShhcHBsaWNhdGlvbkNsaWVudEZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX0ZJTEU6IHsKLQkJCQlNb2R1bGVGaWxlIG1vZHVsZUZpbGUgPSAoTW9kdWxlRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTW9kdWxlRmlsZShtb2R1bGVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcmNoaXZlKG1vZHVsZUZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihtb2R1bGVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWxlKG1vZHVsZUZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSOiB7Ci0JCQkJQ29udGFpbmVyIGNvbnRhaW5lciA9IChDb250YWluZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihjb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbGUoY29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJFQURfT05MWV9ESVJFQ1RPUlk6IHsKLQkJCQlSZWFkT25seURpcmVjdG9yeSByZWFkT25seURpcmVjdG9yeSA9IChSZWFkT25seURpcmVjdG9yeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVhZE9ubHlEaXJlY3RvcnkocmVhZE9ubHlEaXJlY3RvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRhaW5lcihyZWFkT25seURpcmVjdG9yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShyZWFkT25seURpcmVjdG9yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRTogewotCQkJCVJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSQVJGaWxlKHJhckZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZUZpbGUocmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXJjaGl2ZShyYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250YWluZXIocmFyRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsZShyYXJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUY6IHsKLQkJCQlNb2R1bGVSZWYgbW9kdWxlUmVmID0gKE1vZHVsZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTW9kdWxlUmVmKG1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfTU9EVUxFX1JFRjogewotCQkJCUVKQk1vZHVsZVJlZiBlamJNb2R1bGVSZWYgPSAoRUpCTW9kdWxlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJNb2R1bGVSZWYoZWpiTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVSZWYoZWpiTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldFQl9NT0RVTEVfUkVGOiB7Ci0JCQkJV2ViTW9kdWxlUmVmIHdlYk1vZHVsZVJlZiA9IChXZWJNb2R1bGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYk1vZHVsZVJlZih3ZWJNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZHVsZVJlZih3ZWJNb2R1bGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ0xJRU5UX01PRFVMRV9SRUY6IHsKLQkJCQlDbGllbnRNb2R1bGVSZWYgY2xpZW50TW9kdWxlUmVmID0gKENsaWVudE1vZHVsZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2xpZW50TW9kdWxlUmVmKGNsaWVudE1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTW9kdWxlUmVmKGNsaWVudE1vZHVsZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX1JFRjogewotCQkJCUNvbm5lY3Rvck1vZHVsZVJlZiBjb25uZWN0b3JNb2R1bGVSZWYgPSAoQ29ubmVjdG9yTW9kdWxlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb25uZWN0b3JNb2R1bGVSZWYoY29ubmVjdG9yTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNb2R1bGVSZWYoY29ubmVjdG9yTW9kdWxlUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJHZW4oQ29udGFpbmVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXQVJGaWxlR2VuKFdBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZUZpbGVHZW4oTW9kdWxlRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnRGaWxlR2VuKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUFSRmlsZUdlbihFQVJGaWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXJGaWxlR2VuKEVKQkphckZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJBUkZpbGVHZW4oUkFSRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJjaGl2ZUdlbihBcmNoaXZlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWxlR2VuKEZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlYWRPbmx5RGlyZWN0b3J5R2VuKFJlYWRPbmx5RGlyZWN0b3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlR2VuKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0NvbW1vbmFyY2hpdmVTd2l0Y2gKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRUFSRmlsZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRUFSRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2ZWE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0VBUkZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBFQVJGaWxlVXRpbCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRUFSRmlsZVV0aWwuCi0JICovCi0JcHJpdmF0ZSBFQVJGaWxlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbW9kdWxlIGZpbGVzIHdoaWNoIGFyZSBhIHNwZWMgbGV2ZWwgdG9vIGhpZ2ggZm9yIHRoZSBFQVIgZmlsZS4gSWYgdGhlCi0JICogRUFSIGlzIDEuMywgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiBPdGhlcndpc2UgcmV0dXJucyBhbnkgSjJFRSAxLjMgbW9kdWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0SW5jb21wYXRpYmxlMTNNb2R1bGVGaWxlcyhFQVJGaWxlIGVhckZpbGUpIHsKLQkJaWYgKGlzSjJFRTEzKGVhckZpbGUpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJTGlzdCBtb2R1bGVGaWxlcyA9IGVhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZUZpbGUgYU1vZHVsZUZpbGUgPSAoTW9kdWxlRmlsZSkgbW9kdWxlRmlsZXMuZ2V0KGkpOwotCQkJaWYgKGlzSjJFRTEzKGFNb2R1bGVGaWxlKSkKLQkJCQlyZXN1bHQuYWRkKGFNb2R1bGVGaWxlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBtb2R1bGUgZmlsZXMgd2hpY2ggYXJlIGEgc3BlYyBsZXZlbCB0b28gaGlnaCBmb3IgdGhlIEVBUiBmaWxlLiBJZiB0aGUKLQkgKiBFQVIgaXMgMS40LCByZXR1cm5zIGFuIGVtcHR5IGxpc3QuIE90aGVyd2lzZSByZXR1cm5zIGFueSBKMkVFIDEuNCBtb2R1bGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJbmNvbXBhdGlibGUxNE1vZHVsZUZpbGVzKEVBUkZpbGUgZWFyRmlsZSkgewotCQlpZiAoaXNKMkVFMTQoZWFyRmlsZSkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlMaXN0IG1vZHVsZUZpbGVzID0gZWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVGaWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKSBtb2R1bGVGaWxlcy5nZXQoaSk7Ci0JCQlpZiAoaXNKMkVFMTQoYU1vZHVsZUZpbGUpKQotCQkJCXJlc3VsdC5hZGQoYU1vZHVsZUZpbGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSjJFRTEzKE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUpIHsKLQkJdHJ5IHsKLQkJCVhNTFJlc291cmNlIHhtbFJlc291cmNlID0gKFhNTFJlc291cmNlKSBhTW9kdWxlRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQlyZXR1cm4geG1sUmVzb3VyY2UuZ2V0SjJFRVZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0oyRUUxNChNb2R1bGVGaWxlIGFNb2R1bGVGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlYTUxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgYU1vZHVsZUZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJcmV0dXJuIHhtbFJlc291cmNlLmdldEoyRUVWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVEdXBzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVEdXBzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjIwODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9GaWxlRHVwcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTA6Mjg6NDQgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEZpbGVEdXBzIHsKLQlwcml2YXRlIHN0YXRpYyBpbnQgc0ZpbGVzID0gMDsKLQlwcml2YXRlIHN0YXRpYyBpbnQgc0R1cHMgPSAwOwotCXByaXZhdGUgc3RhdGljIGludCBzSkFScyA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZXhjbHVkZWRFbnRyeU5hbWVzID0gbmV3IFN0cmluZ1tdeyJjb20vaWJtL2l2ai9lamIvcnVudGltZS9fQ29weUhlbHBlcl9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJvcmcvb21nL3N0dWIvamF2YXgvZWpiL19Ib21lSGFuZGxlX1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJIm9yZy9vbWcvc3R1Yi9qYXZheC9lamIvX0hhbmRsZV9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJvcmcvb21nL3N0dWIvamF2YXgvZWpiL19FSkJPYmplY3RfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3JnL29tZy9zdHViL2phdmF4L2VqYi9fRUpCSG9tZV9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJvcmcvb21nL3N0dWIvamF2YS9sYW5nL19DbG9uZWFibGVfU3R1Yi5jbGFzcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiY29tL2libS93ZWJzcGhlcmUvY3NpL19UcmFuc2FjdGlvbmFsT2JqZWN0X1N0dWIuY2xhc3MiLCAvLyROT04tTkxTLTEkCi0JCQkJImNvbS9pYm0vd2Vic3BoZXJlL2NzaS9fQ1NJU2VydmFudF9TdHViLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJjb20vaWJtL2Vqcy9jb250YWluZXIvX0VKU1dyYXBwZXJfVGllLmNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJjb20vaWJtL2Vqcy9jb250YWluZXIvX0VKU1dyYXBwZXJfU3R1Yi5jbGFzcyIgLy8kTk9OLU5MUy0xJAotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBleGNsdWRlZCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoZXhjbHVkZWRFbnRyeU5hbWVzKSk7Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeSwgTWFwIG1hcCwgU3RyaW5nIGphck5hbWUpIHsKLQkJc0ZpbGVzKys7Ci0KLQkJT2JqZWN0IGN1cnJlbnQgPSBtYXAuZ2V0KGVudHJ5KTsKLQkJaWYgKGN1cnJlbnQgPT0gbnVsbCkgewotCQkJLy8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGUgZW50cnkgaXMgZm91bmQKLQkJCW1hcC5wdXQoZW50cnksIGphck5hbWUpOwotCQl9IGVsc2UgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCS8vIFRoZXJlIGlzIG9uZSBvdGhlciBlbnRyeQotCQkJbWFwLnJlbW92ZShlbnRyeSk7Ci0KLQkJCVN0cmluZyBvdGhlciA9IChTdHJpbmcpIGN1cnJlbnQ7Ci0JCQlMaW5rZWRMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJbGlzdC5hZGRGaXJzdChvdGhlcik7Ci0JCQlsaXN0LmFkZEZpcnN0KGphck5hbWUpOwotCQkJbWFwLnB1dChlbnRyeSwgbGlzdCk7Ci0KLQkJCXNEdXBzKys7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBvdGhlciBpbnN0YW5jZXMKLQkJCUxpbmtlZExpc3QgbGlzdCA9IChMaW5rZWRMaXN0KSBjdXJyZW50OwotCQkJbGlzdC5hZGRGaXJzdChqYXJOYW1lKTsKLQotCQkJc0R1cHMrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggIT0gMSkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKCJGaWxlRHVwcyB1dGlsaXR5XHJcblxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKCJTeW5vcHNpczpcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZCgiQW5hbHl6ZXMgSkFSIGFuZCBaSVAgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZm9yIGR1cGxpY2F0ZSBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbmFtZS4gIFRoaXMgZXhjbHVkZXMgYWxsIGVudHJpZXMgaW4gdGhlIFwiTUVUQS1JTkZcIiBkaXJlY3Rvcnkgb2YgdGhlIGFyY2hpdmUuICBUaGlzIGRvZXMgbm90IGNoZWNrIHRpbWVzdGFtcHMgb3Igc2l6ZS5cclxuXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoIlVzYWdlOiBGaWxlRHVwcyBkaXJOYW1lXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUcmVlTWFwIG1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0KLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgcm9vdCA9IG5ldyBGaWxlKGFyZ3NbaV0pOwotCQkJCXByb2Nlc3NEaXJlY3Rvcnkocm9vdCwgbWFwKTsKLQkJCX0KLQotCQkJVHJlZU1hcCBvdXRwdXRNYXAgPSBuZXcgVHJlZU1hcCgpOwotCi0JCQlTZXQgc2V0ID0gbWFwLmVudHJ5U2V0KCk7Ci0JCQlJdGVyYXRvciBpdCA9IHNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBtZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgbyA9IG1lLmdldFZhbHVlKCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBMaW5rZWRMaXN0KSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBqYXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCQkJCUxpbmtlZExpc3QgbGlzdCA9IChMaW5rZWRMaXN0KSBvOwotCQkJCQlJdGVyYXRvciBlbnRyeUl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChlbnRyeUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlqYXJzLmFwcGVuZChlbnRyeUl0ZXIubmV4dCgpKTsKLQkJCQkJCWphcnMuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCUxpbmtlZExpc3Qgb3V0cHV0TGlzdCA9IChMaW5rZWRMaXN0KSBvdXRwdXRNYXAuZ2V0KGphcnMudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChvdXRwdXRMaXN0ID09IG51bGwpIHsKLQkJCQkJCW91dHB1dExpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJCQkJb3V0cHV0TWFwLnB1dChqYXJzLnRvU3RyaW5nKCksIG91dHB1dExpc3QpOwotCQkJCQl9Ci0JCQkJCW91dHB1dExpc3QuYWRkRmlyc3QobWUuZ2V0S2V5KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJU2V0IG91dFNldCA9IG91dHB1dE1hcC5lbnRyeVNldCgpOwotCQkJaXQgPSBvdXRTZXQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgbWUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGphcnMgPSAoU3RyaW5nKSBtZS5nZXRLZXkoKTsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihqYXJzLCAiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zLm5leHRUb2tlbigpKTsKLQkJCQl9Ci0KLQkJCQlMaW5rZWRMaXN0IGxpc3QgPSAoTGlua2VkTGlzdCkgbWUuZ2V0VmFsdWUoKTsKLQkJCQlJdGVyYXRvciBlbnRyeUl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGVudHJ5SXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgIiArIChTdHJpbmcpIGVudHJ5SXRlci5uZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5TZWFyY2hlZCAiICsgc0pBUnMgKyAiIGphcnMsIGZvdW5kICIgKyBzRHVwcyArICIgZHVwcyBpbiAiICsgc0ZpbGVzICsgIiBmaWxlcy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9IGNhdGNoIChFeGNlcHRpb24geCkgewotCQkJeC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0RpcmVjdG9yeShGaWxlIHJvb3QsIE1hcCBtYXApIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmID0gZmlsZXNbaV07Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKQotCQkJCXByb2Nlc3NEaXJlY3RvcnkoZiwgbWFwKTsKLQkJCWVsc2UgewotCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAobmFtZS5lbmRzV2l0aCgiLnppcCIpIHx8IG5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJewotCQkJCQlwcm9jZXNzRmlsZShmLCBtYXApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0ZpbGUoRmlsZSBmaWxlLCBNYXAgbWFwKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCUhhc2hTZXQgZmlsZXNJbkZpbGUgPSBuZXcgSGFzaFNldCgpOwotCi0JCXNKQVJzKys7Ci0JCVppcEZpbGUgemlwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXppcCA9IG5ldyBaaXBGaWxlKGZpbGUpOwotCQkJRW51bWVyYXRpb24gZU51bSA9IHppcC5lbnRyaWVzKCk7Ci0JCQl3aGlsZSAoZU51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlTnVtLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKCFuYW1lLnN0YXJ0c1dpdGgoIk1FVEEtSU5GIikgJiYgIWV4Y2x1ZGVkLmNvbnRhaW5zKG5hbWUpKSAvLyROT04tTkxTLTEkCi0JCQkJCWZpbGVzSW5GaWxlLmFkZChuYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKkVycm9yIHNlYXJjaGluZyBpbiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHppcCAhPSBudWxsKQotCQkJCQl6aXAuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaWdub3JlZCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQotCQkvLyBOb3cgYWRkIHRoZSBwYWNrYWdlcyB0byB0aGUgbWFwCi0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGUuZ2V0UGF0aCgpOwotCi0JCUl0ZXJhdG9yIGl0ID0gZmlsZXNJbkZpbGUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU3RyaW5nIGVudHJ5TmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWFkZEVudHJ5KGVudHJ5TmFtZSwgbWFwLCBmaWxlbmFtZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL09iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2FjOTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOwotaW1wb3J0IGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlciBleHRlbmRzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gewotCXByaXZhdGUgQ2xhc3NMb2FkZXIgY2w7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCi0JcHVibGljIE9iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIoSW5wdXRTdHJlYW0gaXMsIENsYXNzTG9hZGVyIGxvYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gewotCi0JCXN1cGVyKGlzKTsKLQotCQlpZiAobG9hZGVyICE9IG51bGwpCi0JCQljbCA9IGxvYWRlcjsKLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGphdmEgdHlwZSBjbGFzcyBnaXZlbiBhIHNpZ25hdHVyZSBsZXR0ZXIuCi0JICovCi0KLQlwcml2YXRlIENsYXNzIGdldFR5cGUoY2hhciB0eXBlKSB7Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlICdCJyA6Ci0JCQkJcmV0dXJuIGJ5dGUuY2xhc3M7Ci0JCQljYXNlICdDJyA6Ci0JCQkJcmV0dXJuIGNoYXIuY2xhc3M7Ci0JCQljYXNlICdEJyA6Ci0JCQkJcmV0dXJuIGRvdWJsZS5jbGFzczsKLQkJCWNhc2UgJ0YnIDoKLQkJCQlyZXR1cm4gZmxvYXQuY2xhc3M7Ci0JCQljYXNlICdJJyA6Ci0JCQkJcmV0dXJuIGludC5jbGFzczsKLQkJCWNhc2UgJ0onIDoKLQkJCQlyZXR1cm4gbG9uZy5jbGFzczsKLQkJCWNhc2UgJ1MnIDoKLQkJCQlyZXR1cm4gc2hvcnQuY2xhc3M7Ci0JCQljYXNlICdaJyA6Ci0JCQkJcmV0dXJuIGJvb2xlYW4uY2xhc3M7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVzb2x2ZUNsYXNzKCkgbWV0aG9kIHRvIHVzZSBhIGN1c3RvbSBjbGFzcyBsb2FkZXIuCi0JICovCi0KLQlwcm90ZWN0ZWQgQ2xhc3MgcmVzb2x2ZUNsYXNzKE9iamVjdFN0cmVhbUNsYXNzIGNsYXNzRGVzYykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NEZXNjLmdldE5hbWUoKTsKLQotCQkvL1V0aWxzVHJhY2UudHJhY2UoIiBPYmplY3RJbnB1dFN0cmVhbUN1c3RvbVJlc29sdmVyOiBSZXNvbHZpbmcgIiArIGNsYXNzTmFtZSk7Ci0KLQkJLy8gSGFuZGxlIGFycmF5cyBvZiBjbGFzc2VzIGRpZmZlcmVudGx5Ci0KLQkJaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCJbIikpIHsvLyROT04tTkxTLTEkCi0KLQkJCUNsYXNzIGNvbXBvbmVudCA9IG51bGw7Ci0JCQlpbnQgZGltTnVtOwotCi0JCQlmb3IgKGRpbU51bSA9IDE7IGNsYXNzTmFtZS5jaGFyQXQoZGltTnVtKSA9PSAnWyc7IGRpbU51bSsrKQotCi0JCQlpZiAoY2xhc3NOYW1lLmNoYXJBdChkaW1OdW0pID09ICdMJykgewotCQkJCWNvbXBvbmVudCA9IGNsLmxvYWRDbGFzcyhjbGFzc05hbWUuc3Vic3RyaW5nKGRpbU51bSArIDEsIGNsYXNzTmFtZS5sZW5ndGgoKSAtIDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSAhPSBkaW1OdW0gKyAxKQotCQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihjbGFzc05hbWUpOyAvLyBtYWxmb3JtZWQKLQkJCQljb21wb25lbnQgPSBnZXRUeXBlKGNsYXNzTmFtZS5jaGFyQXQoZGltTnVtKSk7Ci0JCQl9Ci0KLQkJCWludCBkaW1lbnNpb25zW10gPSBuZXcgaW50W2RpbU51bV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbU51bTsgaSsrKQotCQkJCWRpbWVuc2lvbnNbaV0gPSAwOwotCi0JCQlyZXR1cm4gQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50LCBkaW1lbnNpb25zKS5nZXRDbGFzcygpOwotCi0JCX0KLQkJcmV0dXJuIGNsLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOGE2ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci0KLQotcHVibGljIGNsYXNzIFJhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlciB7Ci0KLQlwdWJsaWMgUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlcihBcmNoaXZlIGFuQXJjaGl2ZSwgQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wpIHsKLQkJc3VwZXIoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewotCQlMaXN0IGNoaWxkcmVuID0gZ2V0UmFyRmlsZSgpLmdldEFyY2hpdmVGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEFyY2hpdmUpIGNoaWxkcmVuLmdldChpKSkuZ2V0RmlsZShuYW1lKTsKLQkJCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEZpbGVGcm9tRGVwZW5kZW50SmFyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgUkFSRmlsZSBnZXRSYXJGaWxlKCkgewotCQlyZXR1cm4gKFJBUkZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL1dhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDg5MTU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMjMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLQotCi0vKioKLSAqIEBhdXRob3IgZGZob2x0dHAKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dMb2FkaW5nRnJvbVdBUiA9IHRydWU7Ci0KLQlwdWJsaWMgV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlcihBcmNoaXZlIGFuQXJjaGl2ZSwgQ2xhc3NMb2FkZXIgcGFyZW50Q2wsIENsYXNzTG9hZGVyIGV4dHJhQ2wpIHsKLQkJc3VwZXIoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCk7Ci0JCWFsbG93TG9hZGluZ0Zyb21XQVIgPSBhbkFyY2hpdmUuZ2V0T3B0aW9ucygpLmdldENsYXNzTG9hZGluZ01vZGUoKSA9PSBBcmNoaXZlT3B0aW9ucy5MT0FEX01PREVfQ09NUEFUOwotCX0KLQotCXByb3RlY3RlZCBGaWxlIGdldEZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJLy9zZWFyY2ggY2xhc3NlcyBkaXJlY3RvcnkgZmlyc3QsIHRoZW4gd2FyLCB0aGVuIG5lc3RlZCBhcmNoaXZlcy4KLQkJLy9zZWFyY2ggY2xhc3NlcyBkaXJlY3RvcnkKLQkJU3RyaW5nIHN3aXp6bGVkTmFtZSA9IEFyY2hpdmVVdGlsLmNvbmNhdFVyaShBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSwgbmFtZSwgJy8nKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRXYXJGaWxlKCkuZ2V0RmlsZShzd2l6emxlZE5hbWUpOwotCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCS8vc2VhcmNoIHdhciBpZiBydW5uaW5nIHdpdGggY29tcGF0aWJpbGl0eQotCQlpZiAoYWxsb3dMb2FkaW5nRnJvbVdBUikgewotCQkJRmlsZSBmaWxlID0gZ2V0RmlsZUZyb21BcmNoaXZlKG5hbWUpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQl9Ci0JCS8vc2VhcmNoIG5lc3RlZCBhcmNoaXZlcwotCQlMaXN0IGNoaWxkcmVuID0gZ2V0V2FyRmlsZSgpLmdldExpYnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChBcmNoaXZlKSBjaGlsZHJlbi5nZXQoaSkpLmdldEZpbGUobmFtZSk7Ci0JCQl9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCS8vZmluYWxseSBzZWFyY2ggamFycyBpbiBlYXIKLQkJcmV0dXJuIGdldEZpbGVGcm9tRGVwZW5kZW50SmFyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgV0FSRmlsZSBnZXRXYXJGaWxlKCkgewotCQlyZXR1cm4gKFdBUkZpbGUpIGdldEFyY2hpdmUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VBcHBsaWNhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmUxNDNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotcHVibGljIGludGVyZmFjZSBMb29zZUFwcGxpY2F0aW9uIGV4dGVuZHMgTG9vc2VBcmNoaXZlIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTG9vc2VBcmNoaXZlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TG9vc2VBcmNoaXZlcygpOwotCi19IC8vTG9vc2VBcHBsaWNhdGlvbgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VBcmNoaXZlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUFyY2hpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkMzBlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUFyY2hpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlQXJjaGl2ZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFVyaSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSk7Ci0KLQlib29sZWFuIGlzRUFSKCk7Ci0KLQlib29sZWFuIGlzV0FSKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBCaW5hcmllc1BhdGggYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldEJpbmFyaWVzUGF0aCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEJpbmFyaWVzUGF0aCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEJpbmFyaWVzUGF0aChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVzb3VyY2VzUGF0aCBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzb3VyY2VzUGF0aCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJlc291cmNlc1BhdGggYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZXNQYXRoKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIExvb3NlQXBwIHJlZmVyZW5jZQotCSAqLwotCUxvb3NlQXBwbGljYXRpb24gZ2V0TG9vc2VBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvb3NlQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9vc2VBcHAoTG9vc2VBcHBsaWNhdGlvbiB2YWx1ZSk7Ci0KLQlib29sZWFuIGlzTW9kdWxlKCk7Ci0KLX0gLy9Mb29zZUFyY2hpdmUKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlnUmVnaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlnUmVnaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiZGNiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZUNvbmZpZ1JlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLQotCi0vKioKLSAqIFVzZWQgaW50ZXJuYWxseSBmb3IgbG9vc2UgbW9kdWxlIHN1cHBvcnQKLSAqLwotcHVibGljIGNsYXNzIExvb3NlQ29uZmlnUmVnaXN0ZXIgewotCi0JLyoqCi0JICogVGhlIHN5c3RlbSBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGxvb3NlIGNvbmZpZyBkb2N1bWVudDsKLQkgKiAid2FzLmxvb3NlLmNvbmZpZyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT09TRV9DT05GSUdfUFJPUEVSVFkgPSAid2FzLmxvb3NlLmNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgTG9vc2VDb25maWdSZWdpc3RlciBzaW5nbGV0b247Ci0KLQlwcm90ZWN0ZWQgTG9vc2VDb25maWd1cmF0aW9uIGxvb3NlQ29uZmlndXJhdGlvbjsKLQotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCS8qKiBIYXZlIHdlIHByZXZpb3VzbHkgbG9hZGVkIG9yIHRyaWVkIHRvIGxvYWQgdGhlIGxvb3NlIGNvbmZpZ3VyYXRpb24/ICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9hZEF0dGVtcHRlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBNYXAgbG9vc2VFYXJNYXA7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTG9vc2VDb25maWdSZWdpc3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VDb25maWdSZWdpc3RlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTG9vc2VDb25maWdSZWdpc3RlciBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBMb29zZUNvbmZpZ1JlZ2lzdGVyKCk7Ci0KLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgdGhlIGVhciBmaWxlIGluIHRoZSBmbHVmZmVkIExvb3NlQ29uZmlndXJhdGlvbiBvYmplY3QsIGFuZCBhdHRlbXB0cyB0byBsb2FkIHRoZQotCSAqIExvb3NlQXBwbGljYXRpb24gb24gZGVtYW5kIGZyb20gdGhlIGV4aXN0aW5nIG1hcHBpbmdzIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWFyRmlsZVVSSQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTG9vc2VBcHBsaWNhdGlvbiBmaW5kTG9vc2VBcHBsaWNhdGlvbihTdHJpbmcgZWFyRmlsZVVSSSkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uKFN0cmluZwotCQkvLyBlYXJGaWxlVVJJPVwiIitlYXJGaWxlVVJJKyJcIikiKTsKLQkJaWYgKGdldExvb3NlQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLQkJCUxpc3QgYXBwcyA9IGdldExvb3NlQ29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBzLnNpemUoKTsgaSsrKSB7Ci0JCQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSAoTG9vc2VBcHBsaWNhdGlvbikgYXBwcy5nZXQoaSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbigpOgotCQkJCS8vIGFwcFsiK2krIl0uZ2V0VVJJKCk9XCIiK2FwcC5nZXRVcmkoKSsiXCIiICk7Ci0JCQkJaWYgKGFwcC5nZXRVcmkoKS5lcXVhbHMoZWFyRmlsZVVSSSkpCi0JCQkJCXJldHVybiBhcHA7Ci0JCQl9Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbigpOiBkaWQgbm90IGZpbmQgbG9hZGVkCi0JCS8vIExvb3NlQXBwbGljYXRpb24sIGxvYWRpbmcgbmV3IHZhbHVlLiIgKTsKLQkJaWYgKGdldERvY3VtZW50VVJJKCkgPT0gbnVsbCB8fCBnZXREb2N1bWVudFVSSSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlVUkkgbG9vc2VDb25maWcgPSAoVVJJKSBnZXRMb29zZUVhck1hcCgpLmdldChlYXJGaWxlVVJJKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKTogbG9vc2VDb25maWcgVVJJCi0JCQkvLyBmcm9tIG1hcCBcIiIrbG9vc2VDb25maWcrIlwiIik7Ci0JCQlMb29zZUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gbG9hZExvb3NlQXBwbGljYXRpb24obG9vc2VDb25maWcpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5maW5kTG9vc2VBcHBsaWNhdGlvbigpOgotCQkJLy8gbG9vc2VBcHBsaWNhdGlvbj0iK2FwcGxpY2F0aW9uKTsKLQkJCWlmIChhcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0JCQkJTGlzdCBtb2R1bGVzID0gYXBwbGljYXRpb24uZ2V0TG9vc2VBcmNoaXZlcygpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKToKLQkJCQkvLyBsb29zZUFwcGxpY2F0aW9uIGNvbnRhaW5zICIgKyBtb2R1bGVzLnNpemUoKSArICIgbW9kdWxlcy4iKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuZmluZExvb3NlQXBwbGljYXRpb24oKToKLQkJCQkJLy8gbW9kdWxlcy5nZXQoIitpKyIpOiIrIG1vZHVsZXMuZ2V0KGkpKTsKLQkJCQkJZ2V0TG9vc2VDb25maWd1cmF0aW9uKCkuZ2V0QXBwbGljYXRpb25zKCkuYWRkKGFwcGxpY2F0aW9uKTsKLQkJCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiAgICAgICAgICAgIFRoZSBjb250YWluaW5nIEVBUiAtLSB0aGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gVVJJIHdpbGwgYmUgZGV0ZXJtaW5lZAotCSAqICAgICAgICAgICAgYXV0b21hdGljYWxseQotCSAqIEBwYXJhbSBsb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBmaWxlIHN5c3RlbSBVUkkgb2YgYSBkb2N1bWVudCBjb250YWluaW5nIGEgTG9vc2VBcHBsaWNhdGlvbiBhcyBpdHMKLQkgKiAgICAgICAgICAgIHJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMb29zZU1hcHBpbmcoQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSkgewotCQlpZiAoY29udGFpbmVyICE9IG51bGwpCi0JCQlhZGRMb29zZU1hcHBpbmcoQXJjaGl2ZVV0aWwuZ2V0T1NVcmkoY29udGFpbmVyLmdldFVSSSgpKSwgbG9vc2VBcHBsaWNhdGlvblJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWFyRmlsZVVSSQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIFVSSSBvZiB0aGUgRUFSIGZpbGUgb2YgdGhlIGdpdmVuIG1hcHBpbmcKLQkgKiBAcGFyYW0gbG9vc2VBcHBsaWNhdGlvblJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgZmlsZSBzeXN0ZW0gVVJJIG9mIGEgZG9jdW1lbnQgY29udGFpbmluZyBhIExvb3NlQXBwbGljYXRpb24gYXMgaXRzCi0JICogICAgICAgICAgICByb290Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9vc2VNYXBwaW5nKFN0cmluZyBlYXJGaWxlVVJJLCBTdHJpbmcgbG9vc2VBcHBsaWNhdGlvblJlc291cmNlKSB7Ci0JCWlmIChlYXJGaWxlVVJJICE9IG51bGwpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuYWRkTG9vc2VNYXBwaW5nKFN0cmluZwotCQkJLy8gZWFyRmlsZVVSST1cIiIrZWFyRmlsZVVSSSsiXCIsIFN0cmluZwotCQkJLy8gbG9vc2VBcHBsaWNhdGlvblJlc291cmNlPVwiIitsb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UrIlwiKSIpOwotCQkJaWYgKGdldExvb3NlRWFyTWFwKCkuY29udGFpbnNLZXkoZWFyRmlsZVVSSSkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmFkZExvb3NlTWFwcGluZygpOiBGb3VuZCBleGlzdGluZyBrZXkKLQkJCQkvLyB3aXRoIHNhbWUgZWFyRmlsZVVSSSwgbG9va2luZyBmb3IgbG9hZGVkIGFwcC4iKTsKLQkJCQlMb29zZUFwcGxpY2F0aW9uIGFwcCA9IGZpbmRMb29zZUFwcGxpY2F0aW9uSWZMb2FkZWQoZWFyRmlsZVVSSSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5hZGRMb29zZU1hcHBpbmcoKTogTG9hZGVkIGFwcD0iICsKLQkJCQkvLyBhcHApOwotCQkJCWlmIChhcHAgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZSByZXMgPSBsb2FkTG9vc2VBcHBsaWNhdGlvblJlc291cmNlKFVSSS5jcmVhdGVVUkkobG9vc2VBcHBsaWNhdGlvblJlc291cmNlKSk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIuYWRkTG9vc2VNYXBwaW5nKCk6IGNsZWFyaW5nCi0JCQkJCS8vIHJlc291cmNlOiIgKyByZXMpOwotCQkJCQlyZXMudW5sb2FkKCk7Ci0JCQkJCXJlbW92ZUxvb3NlQXBwbGljYXRpb24oYXBwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlnZXRMb29zZUVhck1hcCgpLnB1dChlYXJGaWxlVVJJLCBVUkkuY3JlYXRlVVJJKGxvb3NlQXBwbGljYXRpb25SZXNvdXJjZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVhckZpbGVVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExvb3NlQXBwbGljYXRpb24gZmluZExvb3NlQXBwbGljYXRpb25JZkxvYWRlZChTdHJpbmcgZWFyRmlsZVVSSSkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uSWZMb2FkZWQoU3RyaW5nCi0JCS8vIGVhckZpbGVVUkk9XCIiK2VhckZpbGVVUkkrIlwiKSIpOwotCQlpZiAoZ2V0TG9vc2VDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotCQkJTGlzdCBhcHBzID0gZ2V0TG9vc2VDb25maWd1cmF0aW9uKCkuZ2V0QXBwbGljYXRpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFwcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlMb29zZUFwcGxpY2F0aW9uIGFwcCA9IChMb29zZUFwcGxpY2F0aW9uKSBhcHBzLmdldChpKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmZpbmRMb29zZUFwcGxpY2F0aW9uSWZMb2FkZWQoKToKLQkJCQkvLyBhcHBbIitpKyJdLmdldFVSSSgpPVwiIithcHAuZ2V0VXJpKCkrIlwiIiApOwotCQkJCWlmIChhcHAuZ2V0VXJpKCkuZXF1YWxzKGVhckZpbGVVUkkpKQotCQkJCQlyZXR1cm4gYXBwOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFsbG93cyBhZGRpbmcgTG9vc2VBcHBsaWNhdGlvbnMgZHlubWljYWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gYXBwbGljYXRpb24KLQkgKiAgICAgICAgICAgIEFuIGFwcGxpY2F0aW9uIGNyZWF0ZWQgYW5kIHBlcnNpc3RlZCBieSBhbiBleHRlcm5hbCBlbnRpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMb29zZUFwcGxpY2F0aW9uKExvb3NlQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKLQkJZ2V0TG9vc2VDb25maWd1cmF0aW9uKCkuZ2V0QXBwbGljYXRpb25zKCkuYWRkKGFwcGxpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd3MgcmVtb3ZpbmcgTG9vc2VBcHBsaWNhdGlvbnMgZHlubWljYWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gYXBwbGljYXRpb24KLQkgKiAgICAgICAgICAgIEFuIGFwcGxpY2F0aW9uIGNyZWF0ZWQgYW5kIHBlcnNpc3RlZCBieSBhbiBleHRlcm5hbCBlbnRpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMb29zZUFwcGxpY2F0aW9uKExvb3NlQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5yZW1vdmVMb29zZUFwcGxpY2F0aW9uKExvb3NlQXBwbGljYXRpb24KLQkJLy8gYXBwbGljYXRpb249XCIiK2FwcGxpY2F0aW9uKyJcIikiKTsKLQkJZ2V0TG9vc2VDb25maWd1cmF0aW9uKCkuZ2V0QXBwbGljYXRpb25zKCkucmVtb3ZlKGFwcGxpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWFyRmlsZVVSSQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIGZpbGUgc3lzdGVtIFVSSSBvZiB0aGUgRUFSIGZpbGUgb2YgdGhlIGdpdmVuIG1hcHBpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMb29zZU1hcHBpbmcoU3RyaW5nIGVhckZpbGVVUkkpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5yZW1vdmVMb29zZU1hcHBpbmcoU3RyaW5nCi0JCS8vIGVhckZpbGVVUkk9XCIiK2VhckZpbGVVUkkrIlwiKSIpOwotCQlpZiAoZWFyRmlsZVVSSSAhPSBudWxsKQotCQkJZ2V0TG9vc2VFYXJNYXAoKS5yZW1vdmUoZWFyRmlsZVVSSSk7Ci0JfQotCi0JcHVibGljIExvb3NlTW9kdWxlIGZpbmRMb29zZU1vZHVsZShMb29zZUFwcGxpY2F0aW9uIGFwcCwgU3RyaW5nIHVyaSwgU3RyaW5nIGFsdEREKSB7Ci0JCUxpc3QgYXJjaGl2ZXMgPSBhcHAuZ2V0TG9vc2VBcmNoaXZlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlMb29zZUFyY2hpdmUgZWxlbWVudCA9IChMb29zZUFyY2hpdmUpIGFyY2hpdmVzLmdldChpKTsKLQkJCWlmICghZWxlbWVudC5pc01vZHVsZSgpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwodXJpLCBlbGVtZW50LmdldFVyaSgpKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChhbHRERCwgKChMb29zZU1vZHVsZSkgZWxlbWVudCkuZ2V0QWx0REQoKSkpCi0JCQkJcmV0dXJuIChMb29zZU1vZHVsZSkgZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTG9vc2VNb2R1bGUgZmluZExvb3NlTW9kdWxlKE1vZHVsZSBtLCBFQVJGaWxlIGVhcikgewotCQlMb29zZUFwcGxpY2F0aW9uIGFwcCA9IGZpbmRMb29zZUFwcGxpY2F0aW9uKGVhci5nZXRVUkkoKSk7Ci0JCXJldHVybiBhcHAgPT0gbnVsbCA/IG51bGwgOiBmaW5kTG9vc2VNb2R1bGUoYXBwLCBtLmdldFVyaSgpLCBtLmdldEFsdEREKCkpOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgbG9vc2UgY29uZmlndXJhdGlvbjsgdGhlIG5leHQgdGltZSBpdCBpcyByZXF1ZXN0ZWQgaXQgd2lsbCBiZSByZWxvYWRlZDsKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJbG9hZEF0dGVtcHRlZCA9IGZhbHNlOwotCQlsb29zZUNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlyZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlyZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkTG9vc2VDb25maWd1cmF0aW9uKCkgewotCQlSZXNvdXJjZSByZXMgPSBsb2FkTG9vc2VDb25maWd1cmF0aW9uUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyAhPSBudWxsICYmICFyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlzZXRMb29zZUNvbmZpZ3VyYXRpb24oKExvb3NlQ29uZmlndXJhdGlvbikgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQkJZWxzZQotCQkJLyoKLQkJCSAqIGlmIHRoZSBkb2N1bWVudCBpcyBlbXB0eSB0aGVuIGZsdWZmIHVwIGEgTG9vc2VDb25maWd1cmF0aW9uIG9iamVjdAotCQkJICovCi0JCQlzZXRMb29zZUNvbmZpZ3VyYXRpb24oTG9vc2Vjb25maWdGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMb29zZUNvbmZpZ3VyYXRpb24oKSk7Ci0JCWxvYWRBdHRlbXB0ZWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBsb2FkTG9vc2VDb25maWd1cmF0aW9uUmVzb3VyY2UoKSB7Ci0JCVN0cmluZyB1cmkgPSBnZXREb2N1bWVudFVSSSgpOwotCQlpZiAoQXJjaGl2ZVV0aWwuaXNOdWxsT3JFbXB0eSh1cmkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbiBvY2N1cnJlZCBsb2FkaW5nIGxvb3NlIGNvbmZpZ3VyYXRpb24iLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMb29zZUFwcGxpY2F0aW9uIGxvYWRMb29zZUFwcGxpY2F0aW9uKFVSSSBsb29zZUFwcFVSSSkgewotCQlSZXNvdXJjZSByZXMgPSBsb2FkTG9vc2VBcHBsaWNhdGlvblJlc291cmNlKGxvb3NlQXBwVVJJKTsKLQkJaWYgKHJlcyAhPSBudWxsICYmICFyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gKExvb3NlQXBwbGljYXRpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlIGxvYWRMb29zZUFwcGxpY2F0aW9uUmVzb3VyY2UoVVJJIGxvb3NlQ29uZmlnVVJJKSB7Ci0JCWlmIChsb29zZUNvbmZpZ1VSSSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UobG9vc2VDb25maWdVUkksIHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uIG9jY3VycmVkIGxvYWRpbmcgbG9vc2UgYXBwbGljYXRpb24iLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxvb3NlQ29uZmlndXJhdGlvbi4gQmFzaWMgYWNjZXNzb3Igd2l0aCBubyBpbml0aWFsaXphdGlvbgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExvb3NlQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZUNvbmZpZ3VyYXRpb24gcHJpbUdldExvb3NlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKiogVGhlIHZhbHVlIG9mIHRoZSBsb29zZSBjb25maWcgcHJvcGVydHkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERvY3VtZW50VVJJKCkgewotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KExPT1NFX0NPTkZJR19QUk9QRVJUWSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9vc2VDb25maWd1cmF0aW9uLiBUcmllcyB0byBsb2FkIGl0IHVzaW5nIHRoZSBzeXN0ZW0gcHJvcGVydHkgd2FzLmxvb3NlLmNvbmZpZywgaWYKLQkgKiBuZWNlc3NhcnkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTG9vc2VDb25maWd1cmF0aW9uIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgTG9vc2VDb25maWd1cmF0aW9uIGdldExvb3NlQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGxvb3NlQ29uZmlndXJhdGlvbiA9PSBudWxsICYmICFsb2FkQXR0ZW1wdGVkKQotCQkJbG9hZExvb3NlQ29uZmlndXJhdGlvbigpOwotCQlyZXR1cm4gbG9vc2VDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFzc3VtcHRpb246IHRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHR5cGUgdGhhdCBjYW4gaGF2ZSBjaGlsZHJlbiwgZS5nLiwgTG9vc2VXQVIgb3IKLQkgKiBMb29zZUFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIExpc3QgZ2V0TG9vc2VDaGlsZHJlbihMb29zZUFyY2hpdmUgbG9vc2UpIHsKLQkJaWYgKGxvb3NlICE9IG51bGwpIHsKLQkJCWlmIChsb29zZS5pc0VBUigpKQotCQkJCXJldHVybiAoKExvb3NlQXBwbGljYXRpb24pIGxvb3NlKS5nZXRMb29zZUFyY2hpdmVzKCk7Ci0JCQllbHNlIGlmIChsb29zZS5pc1dBUigpKQotCQkJCXJldHVybiAoKExvb3NlV0FSRmlsZSkgbG9vc2UpLmdldExvb3NlTGlicygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEFzc3VtcHRpb246IHRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHR5cGUgdGhhdCBjYW4gaGF2ZSBjaGlsZHJlbiwgZS5nLiwgTG9vc2VXQVIgb3IKLQkgKiBMb29zZUFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIExvb3NlQXJjaGl2ZSBmaW5kRmlyc3RMb29zZUNoaWxkKFN0cmluZyB1cmksIExvb3NlQXJjaGl2ZSBsb29zZSkgewotCQlMaXN0IGNoaWxkcmVuID0gZ2V0TG9vc2VDaGlsZHJlbihsb29zZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUxvb3NlQXJjaGl2ZSBjaGlsZCA9IChMb29zZUFyY2hpdmUpIGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbCh1cmksIGNoaWxkLmdldFVyaSgpKSkKLQkJCQlyZXR1cm4gbG9vc2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9vc2VDb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsb29zZUNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgICAgIFRoZSBsb29zZUNvbmZpZ3VyYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TG9vc2VDb25maWd1cmF0aW9uKExvb3NlQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJbG9vc2VDb25maWd1cmF0aW9uID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEhhdmUgd2UgcHJldmlvdXNseSBsb2FkZWQgb3IgdHJpZWQgdG8gbG9hZCB0aGUgbG9vc2UgY29uZmlndXJhdGlvbj8KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TG9hZEF0dGVtcHRlZCgpIHsKLQkJcmV0dXJuIGxvYWRBdHRlbXB0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb29zZUVhck1hcC4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldExvb3NlRWFyTWFwKCkgewotCQlpZiAobG9vc2VFYXJNYXAgPT0gbnVsbCkKLQkJCWxvb3NlRWFyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGxvb3NlRWFyTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDNjZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTG9vc2VDb25maWd1cmF0aW9uIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEFwcGxpY2F0aW9ucyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0QXBwbGljYXRpb25zKCk7Ci0KLX0gLy9Mb29zZUNvbmZpZ3VyYXRpb24KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlTGlicmFyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MzQyOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTG9vc2VMaWJyYXJ5IGV4dGVuZHMgTG9vc2VBcmNoaXZlIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIExvb3NlV0FSIHJlZmVyZW5jZQotCSAqLwotCUxvb3NlV0FSRmlsZSBnZXRMb29zZVdBUigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9vc2VXQVIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb29zZVdBUihMb29zZVdBUkZpbGUgdmFsdWUpOwotCi19IC8vTG9vc2VMaWJyYXJ5Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZU1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5NzBmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZU1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsOwotCi0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlTW9kdWxlIGV4dGVuZHMgTG9vc2VBcmNoaXZlIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBBbHRERCBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0QWx0REQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBbHRERCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEFsdEREKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy9Mb29zZU1vZHVsZQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2VXQVJGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZVdBUkZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5NzljZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZVdBUkZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotcHVibGljIGludGVyZmFjZSBMb29zZVdBUkZpbGUgZXh0ZW5kcyBMb29zZU1vZHVsZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIExvb3NlTGlicyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TG9vc2VMaWJzKCk7Ci0KLX0gLy9Mb29zZVdBUkZpbGUKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL0xvb3NlY29uZmlnRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzc5NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIExvb3NlY29uZmlnRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvb3NlY29uZmlnRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbC5Mb29zZWNvbmZpZ0ZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTG9vc2VBcHBsaWNhdGlvbiB2YWx1ZQotCSAqLwotCUxvb3NlQXBwbGljYXRpb24gY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIExvb3NlTGlicmFyeSB2YWx1ZQotCSAqLwotCUxvb3NlTGlicmFyeSBjcmVhdGVMb29zZUxpYnJhcnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBMb29zZVdBUkZpbGUgdmFsdWUKLQkgKi8KLQlMb29zZVdBUkZpbGUgY3JlYXRlTG9vc2VXQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTG9vc2VNb2R1bGUgdmFsdWUKLQkgKi8KLQlMb29zZU1vZHVsZSBjcmVhdGVMb29zZU1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIExvb3NlQ29uZmlndXJhdGlvbiB2YWx1ZQotCSAqLwotCUxvb3NlQ29uZmlndXJhdGlvbiBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUxvb3NlY29uZmlnUGFja2FnZSBnZXRMb29zZWNvbmZpZ1BhY2thZ2UoKTsKLQotfSAvL0xvb3NlY29uZmlnRmFjdG9yeQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ1BhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkODQyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgTG9vc2Vjb25maWdQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Uge30KLSAqLwotcHVibGljIGludGVyZmFjZSBMb29zZWNvbmZpZ1BhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibG9vc2Vjb25maWciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQVJDSElWRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0FSQ0hJVkVfX1VSSSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEggPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSCA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkxvb3NlIEFyY2hpdmU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX1VSSSA9IExPT1NFX0FSQ0hJVkVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX0JJTkFSSUVTX1BBVEggPSBMT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9BUFBMSUNBVElPTl9fUkVTT1VSQ0VTX1BBVEggPSBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FQUCA9IExPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMgPSBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TG9vc2UgQXBwbGljYXRpb248L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0FQUExJQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSBMT09TRV9BUkNISVZFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0xJQlJBUlkgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX19VUkkgPSBMT09TRV9BUkNISVZFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX0xJQlJBUllfX0JJTkFSSUVTX1BBVEggPSBMT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX19SRVNPVVJDRVNfUEFUSCA9IExPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9MSUJSQVJZX19MT09TRV9BUFAgPSBMT09TRV9BUkNISVZFX19MT09TRV9BUFA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSID0gTE9PU0VfQVJDSElWRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkxvb3NlIExpYnJhcnk8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX0xJQlJBUllfRkVBVFVSRV9DT1VOVCA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEUgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9NT0RVTEUgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9NT0RVTEVfX1VSSSA9IExPT1NFX0FSQ0hJVkVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19CSU5BUklFU19QQVRIID0gTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfTU9EVUxFX19SRVNPVVJDRVNfUEFUSCA9IExPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9NT0RVTEVfX0xPT1NFX0FQUCA9IExPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9NT0RVTEVfX0FMVF9ERCA9IExPT1NFX0FSQ0hJVkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Mb29zZSBNb2R1bGU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX01PRFVMRV9GRUFUVVJFX0NPVU5UID0gTE9PU0VfQVJDSElWRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9DT05GSUdVUkFUSU9OID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TID0gMDsKLQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Mb29zZSBDb25maWd1cmF0aW9uPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT09TRV9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19VUkkgPSBMT09TRV9NT0RVTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9PU0VfV0FSX0ZJTEVfX0JJTkFSSUVTX1BBVEggPSBMT09TRV9NT0RVTEVfX0JJTkFSSUVTX1BBVEg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19SRVNPVVJDRVNfUEFUSCA9IExPT1NFX01PRFVMRV9fUkVTT1VSQ0VTX1BBVEg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19MT09TRV9BUFAgPSBMT09TRV9NT0RVTEVfX0xPT1NFX0FQUDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMT09TRV9XQVJfRklMRV9fQUxUX0REID0gTE9PU0VfTU9EVUxFX19BTFRfREQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTID0gTE9PU0VfTU9EVUxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TG9vc2UgV0FSIEZpbGU8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPT1NFX1dBUl9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBMT09TRV9NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWcueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvb3NlY29uZmlnUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIExvb3NlQXBwbGljYXRpb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldExvb3NlQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TG9vc2VBcHBsaWNhdGlvbl9Mb29zZUFyY2hpdmVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTG9vc2VBcmNoaXZlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRMb29zZUFyY2hpdmUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9vc2VBcmNoaXZlX1VyaSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldExvb3NlQXJjaGl2ZV9SZXNvdXJjZXNQYXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvb3NlQXJjaGl2ZV9Mb29zZUFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIExvb3NlTGlicmFyeSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9vc2VMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvb3NlTGlicmFyeV9Mb29zZVdBUigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIExvb3NlV0FSRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9vc2VXQVJGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldExvb3NlV0FSRmlsZV9Mb29zZUxpYnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBMb29zZU1vZHVsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TG9vc2VNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TG9vc2VNb2R1bGVfQWx0REQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBMb29zZUNvbmZpZ3VyYXRpb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldExvb3NlQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlMb29zZWNvbmZpZ0ZhY3RvcnkgZ2V0TG9vc2Vjb25maWdGYWN0b3J5KCk7Ci0KLX0gLy9Mb29zZWNvbmZpZ1BhY2thZ2UKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VBcHBsaWNhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VBcHBsaWNhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwNWNhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXBwbGljYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBMb29zZUFwcGxpY2F0aW9uSW1wbCBleHRlbmRzIExvb3NlQXJjaGl2ZUltcGwgaW1wbGVtZW50cyBMb29zZUFwcGxpY2F0aW9uLCBMb29zZUFyY2hpdmUgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsb29zZUFyY2hpdmVzID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMb29zZUFwcGxpY2F0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFLmdldExvb3NlQXBwbGljYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRMb29zZUFyY2hpdmVzKCkgewotCQlpZiAobG9vc2VBcmNoaXZlcyA9PSBudWxsKSB7Ci0JCQlsb29zZUFyY2hpdmVzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTG9vc2VBcmNoaXZlLmNsYXNzLCB0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQKTsKLQkJfQotCQlyZXR1cm4gbG9vc2VBcmNoaXZlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FQUCwgbXNncyk7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvb3NlQXJjaGl2ZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFAsIG1zZ3MpOwotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb29zZUFyY2hpdmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIGdldEJpbmFyaWVzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgotCQkJCXJldHVybiBnZXRMb29zZUFyY2hpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJc2V0UmVzb3VyY2VzUGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVBQOgotCQkJCXNldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVM6Ci0JCQkJZ2V0TG9vc2VBcmNoaXZlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TG9vc2VBcmNoaXZlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aChCSU5BUklFU19QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJc2V0UmVzb3VyY2VzUGF0aChSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FQUDoKLQkJCQlzZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVM6Ci0JCQkJZ2V0TG9vc2VBcmNoaXZlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gQklOQVJJRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gYmluYXJpZXNQYXRoICE9IG51bGwgOiAhQklOQVJJRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMoYmluYXJpZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlyZXR1cm4gUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlc1BhdGggIT0gbnVsbCA6ICFSRVNPVVJDRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMocmVzb3VyY2VzUGF0aCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVBQOgotCQkJCXJldHVybiBnZXRMb29zZUFwcCgpICE9IG51bGw7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVM6Ci0JCQkJcmV0dXJuIGxvb3NlQXJjaGl2ZXMgIT0gbnVsbCAmJiAhbG9vc2VBcmNoaXZlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRUFSKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFyY2hpdmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXJjaGl2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2ZWY5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXJjaGl2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBMb29zZUFyY2hpdmVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBMb29zZUFyY2hpdmUsIEVPYmplY3QgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVyaSA9IFVSSV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmluYXJpZXNQYXRoKCkgPGVtPkJpbmFyaWVzIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCaW5hcmllc1BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkFSSUVTX1BBVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBiaW5hcmllc1BhdGggPSBCSU5BUklFU19QQVRIX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZXNQYXRoKCkgPGVtPlJlc291cmNlcyBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VzUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZXNQYXRoID0gUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2VBcmNoaXZlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFLmdldExvb3NlQXJjaGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fVVJJLCBvbGRVcmksIHVyaSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRUFSKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXQVIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmluYXJpZXNQYXRoKCkgewotCQlyZXR1cm4gYmluYXJpZXNQYXRoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJpbmFyaWVzUGF0aChTdHJpbmcgbmV3QmluYXJpZXNQYXRoKSB7Ci0JCVN0cmluZyBvbGRCaW5hcmllc1BhdGggPSBiaW5hcmllc1BhdGg7Ci0JCWJpbmFyaWVzUGF0aCA9IG5ld0JpbmFyaWVzUGF0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEgsIG9sZEJpbmFyaWVzUGF0aCwgYmluYXJpZXNQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlc1BhdGgoKSB7Ci0JCXJldHVybiByZXNvdXJjZXNQYXRoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlc1BhdGgoU3RyaW5nIG5ld1Jlc291cmNlc1BhdGgpIHsKLQkJU3RyaW5nIG9sZFJlc291cmNlc1BhdGggPSByZXNvdXJjZXNQYXRoOwotCQlyZXNvdXJjZXNQYXRoID0gbmV3UmVzb3VyY2VzUGF0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRILCBvbGRSZXNvdXJjZXNQYXRoLCByZXNvdXJjZXNQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTG9vc2VBcHBsaWNhdGlvbiBnZXRMb29zZUFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoTG9vc2VBcHBsaWNhdGlvbillQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlQXBwKExvb3NlQXBwbGljYXRpb24gbmV3TG9vc2VBcHApIHsKLQkJaWYgKG5ld0xvb3NlQXBwICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCAmJiBuZXdMb29zZUFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0xvb3NlQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdMb29zZUFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMb29zZUFwcCkuZUludmVyc2VBZGQodGhpcywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUywgTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3TG9vc2VBcHAsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCwgbmV3TG9vc2VBcHAsIG5ld0xvb3NlQXBwKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNb2R1bGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFAsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUywgTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIGdldEJpbmFyaWVzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlc1BhdGgoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VBcHAoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gQklOQVJJRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gYmluYXJpZXNQYXRoICE9IG51bGwgOiAhQklOQVJJRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMoYmluYXJpZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VzUGF0aCAhPSBudWxsIDogIVJFU09VUkNFU19QQVRIX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VBcHAoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlzZXRSZXNvdXJjZXNQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUDoKLQkJCQlzZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aChCSU5BUklFU19QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlzZXRSZXNvdXJjZXNQYXRoKFJFU09VUkNFU19QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19MT09TRV9BUFA6Ci0JCQkJc2V0TG9vc2VBcHAoKExvb3NlQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1cmk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmluYXJpZXNQYXRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiaW5hcmllc1BhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlc1BhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlc1BhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Mb29zZUFyY2hpdmVJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQ29uZmlndXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2JkZTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgTG9vc2VDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9vc2VDb25maWd1cmF0aW9uLCBFT2JqZWN0IHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXBwbGljYXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMb29zZUNvbmZpZ3VyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9vc2VDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXBwbGljYXRpb25zKCkgewotCQlpZiAoYXBwbGljYXRpb25zID09IG51bGwpIHsKLQkJCWFwcGxpY2F0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMb29zZUFwcGxpY2F0aW9uLmNsYXNzLCB0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gYXBwbGljYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXBwbGljYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlM6Ci0JCQkJZ2V0QXBwbGljYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRBcHBsaWNhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCWdldEFwcGxpY2F0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgotCQkJCXJldHVybiBhcHBsaWNhdGlvbnMgIT0gbnVsbCAmJiAhYXBwbGljYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vTG9vc2VDb25maWd1cmF0aW9uSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUxpYnJhcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTGlicmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlMmQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTGlicmFyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgTG9vc2VMaWJyYXJ5SW1wbCBleHRlbmRzIExvb3NlQXJjaGl2ZUltcGwgaW1wbGVtZW50cyBMb29zZUxpYnJhcnksIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIExvb3NlTGlicmFyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRS5nZXRMb29zZUxpYnJhcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBMb29zZVdBUkZpbGUgZ2V0TG9vc2VXQVIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKExvb3NlV0FSRmlsZSllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvb3NlV0FSKExvb3NlV0FSRmlsZSBuZXdMb29zZVdBUikgewotCQlpZiAobmV3TG9vc2VXQVIgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSICYmIG5ld0xvb3NlV0FSICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3TG9vc2VXQVIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0xvb3NlV0FSICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0xvb3NlV0FSKS5lSW52ZXJzZUFkZCh0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlMsIExvb3NlV0FSRmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3TG9vc2VXQVIsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiwgbmV3TG9vc2VXQVIsIG5ld0xvb3NlV0FSKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9BUFAsIG1zZ3MpOwotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX0FQUDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUywgTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlMsIExvb3NlV0FSRmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJcmV0dXJuIGdldEJpbmFyaWVzUGF0aCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlc1BhdGgoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VBcHAoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VXQVIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gQklOQVJJRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gYmluYXJpZXNQYXRoICE9IG51bGwgOiAhQklOQVJJRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMoYmluYXJpZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VzUGF0aCAhPSBudWxsIDogIVJFU09VUkNFU19QQVRIX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VBcHAoKSAhPSBudWxsOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCXJldHVybiBnZXRMb29zZVdBUigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJc2V0QmluYXJpZXNQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfQVBQOgotCQkJCXNldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6Ci0JCQkJc2V0TG9vc2VXQVIoKExvb3NlV0FSRmlsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aChCSU5BUklFU19QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19SRVNPVVJDRVNfUEFUSDoKLQkJCQlzZXRSZXNvdXJjZXNQYXRoKFJFU09VUkNFU19QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9BUFA6Ci0JCQkJc2V0TG9vc2VBcHAoKExvb3NlQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgotCQkJCXNldExvb3NlV0FSKChMb29zZVdBUkZpbGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0xvb3NlTGlicmFyeUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VNb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTZiMDExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VNb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBMb29zZU1vZHVsZUltcGwgZXh0ZW5kcyBMb29zZUFyY2hpdmVJbXBsIGltcGxlbWVudHMgTG9vc2VNb2R1bGUsIExvb3NlQXJjaGl2ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdEREKCkgPGVtPkFsdCBERDwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEFsdEREKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfRERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRERCA9IEFMVF9ERF9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMb29zZU1vZHVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRS5nZXRMb29zZU1vZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHRERCgpIHsKLQkJcmV0dXJuIGFsdEREOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdEREKFN0cmluZyBuZXdBbHRERCkgewotCQlTdHJpbmcgb2xkQWx0REQgPSBhbHRERDsKLQkJYWx0REQgPSBuZXdBbHRERDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0RELCBvbGRBbHRERCwgYWx0REQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19MT09TRV9BUFA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0xPT1NFX0FQUDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19MT09TRV9BUFAsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19MT09TRV9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVMsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0xPT1NFX0FQUDoKLQkJCQlyZXR1cm4gZ2V0TG9vc2VBcHAoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0REOgotCQkJCXJldHVybiBnZXRBbHRERCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gQklOQVJJRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gYmluYXJpZXNQYXRoICE9IG51bGwgOiAhQklOQVJJRVNfUEFUSF9FREVGQVVMVC5lcXVhbHMoYmluYXJpZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJcmV0dXJuIFJFU09VUkNFU19QQVRIX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZXNQYXRoICE9IG51bGwgOiAhUkVTT1VSQ0VTX1BBVEhfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlc1BhdGgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGdldExvb3NlQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0REOgotCQkJCXJldHVybiBBTFRfRERfRURFRkFVTFQgPT0gbnVsbCA/IGFsdEREICE9IG51bGwgOiAhQUxUX0REX0VERUZBVUxULmVxdWFscyhhbHRERCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX1VSSToKLQkJCQlzZXRVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19MT09TRV9BUFA6Ci0JCQkJc2V0TG9vc2VBcHAoKExvb3NlQXBwbGljYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0JJTkFSSUVTX1BBVEg6Ci0JCQkJc2V0QmluYXJpZXNQYXRoKEJJTkFSSUVTX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJc2V0UmVzb3VyY2VzUGF0aChSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19MT09TRV9BUFA6Ci0JCQkJc2V0TG9vc2VBcHAoKExvb3NlQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19BTFRfREQ6Ci0JCQkJc2V0QWx0REQoQUxUX0REX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFsdEREOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRERCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0xvb3NlTW9kdWxlSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZVdBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzMGRjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIExvb3NlV0FSRmlsZUltcGwgZXh0ZW5kcyBMb29zZU1vZHVsZUltcGwgaW1wbGVtZW50cyBMb29zZVdBUkZpbGUsIExvb3NlTW9kdWxlIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbG9vc2VMaWJzID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMb29zZVdBUkZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9vc2VXQVJGaWxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXQVIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldExvb3NlTGlicygpIHsKLQkJaWYgKGxvb3NlTGlicyA9PSBudWxsKSB7Ci0JCQlsb29zZUxpYnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChMb29zZUxpYnJhcnkuY2xhc3MsIHRoaXMsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUik7Ci0JCX0KLQkJcmV0dXJuIGxvb3NlTGliczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0FQUCwgbXNncyk7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TG9vc2VMaWJzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfQVBQLCBtc2dzKTsKLQkJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMb29zZUxpYnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0FQUDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUywgTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlc1BhdGgoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGdldExvb3NlQXBwKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fQUxUX0REOgotCQkJCXJldHVybiBnZXRBbHRERCgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJcmV0dXJuIGdldExvb3NlTGlicygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fQklOQVJJRVNfUEFUSDoKLQkJCQlzZXRCaW5hcmllc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX1JFU09VUkNFU19QQVRIOgotCQkJCXNldFJlc291cmNlc1BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0FQUDoKLQkJCQlzZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKLQkJCQlnZXRMb29zZUxpYnMoKS5jbGVhcigpOwotCQkJCWdldExvb3NlTGlicygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19CSU5BUklFU19QQVRIOgotCQkJCXNldEJpbmFyaWVzUGF0aChCSU5BUklFU19QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fUkVTT1VSQ0VTX1BBVEg6Ci0JCQkJc2V0UmVzb3VyY2VzUGF0aChSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0FQUDoKLQkJCQlzZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKEFMVF9ERF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6Ci0JCQkJZ2V0TG9vc2VMaWJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19CSU5BUklFU19QQVRIOgotCQkJCXJldHVybiBCSU5BUklFU19QQVRIX0VERUZBVUxUID09IG51bGwgPyBiaW5hcmllc1BhdGggIT0gbnVsbCA6ICFCSU5BUklFU19QQVRIX0VERUZBVUxULmVxdWFscyhiaW5hcmllc1BhdGgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX1JFU09VUkNFU19QQVRIOgotCQkJCXJldHVybiBSRVNPVVJDRVNfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VzUGF0aCAhPSBudWxsIDogIVJFU09VUkNFU19QQVRIX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZXNQYXRoKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9BUFA6Ci0JCQkJcmV0dXJuIGdldExvb3NlQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIEFMVF9ERF9FREVGQVVMVCA9PSBudWxsID8gYWx0REQgIT0gbnVsbCA6ICFBTFRfRERfRURFRkFVTFQuZXF1YWxzKGFsdEREKTsKLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTOgotCQkJCXJldHVybiBsb29zZUxpYnMgIT0gbnVsbCAmJiAhbG9vc2VMaWJzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vTG9vc2VXQVJGaWxlSW1wbAotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZWNvbmZpZ0ZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkZDM0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIExvb3NlY29uZmlnRmFjdG9yeSwgRUZhY3RvcnkgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZWNvbmZpZ0ZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT046IHJldHVybiBjcmVhdGVMb29zZUFwcGxpY2F0aW9uKCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZOiByZXR1cm4gY3JlYXRlTG9vc2VMaWJyYXJ5KCk7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEU6IHJldHVybiBjcmVhdGVMb29zZU1vZHVsZSgpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTjogcmV0dXJuIGNyZWF0ZUxvb3NlQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEU6IHJldHVybiBjcmVhdGVMb29zZVdBUkZpbGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZUFwcGxpY2F0aW9uIGNyZWF0ZUxvb3NlQXBwbGljYXRpb24oKSB7Ci0JCUxvb3NlQXBwbGljYXRpb25JbXBsIGxvb3NlQXBwbGljYXRpb24gPSBuZXcgTG9vc2VBcHBsaWNhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGxvb3NlQXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlTGlicmFyeSBjcmVhdGVMb29zZUxpYnJhcnkoKSB7Ci0JCUxvb3NlTGlicmFyeUltcGwgbG9vc2VMaWJyYXJ5ID0gbmV3IExvb3NlTGlicmFyeUltcGwoKTsKLQkJcmV0dXJuIGxvb3NlTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2VXQVJGaWxlIGNyZWF0ZUxvb3NlV0FSRmlsZSgpIHsKLQkJTG9vc2VXQVJGaWxlSW1wbCBsb29zZVdBUkZpbGUgPSBuZXcgTG9vc2VXQVJGaWxlSW1wbCgpOwotCQlyZXR1cm4gbG9vc2VXQVJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBMb29zZU1vZHVsZSBjcmVhdGVMb29zZU1vZHVsZSgpIHsKLQkJTG9vc2VNb2R1bGVJbXBsIGxvb3NlTW9kdWxlID0gbmV3IExvb3NlTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gbG9vc2VNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlQ29uZmlndXJhdGlvbiBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCUxvb3NlQ29uZmlndXJhdGlvbkltcGwgbG9vc2VDb25maWd1cmF0aW9uID0gbmV3IExvb3NlQ29uZmlndXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdQYWNrYWdlIGdldExvb3NlY29uZmlnUGFja2FnZSgpIHsKLQkJcmV0dXJuIChMb29zZWNvbmZpZ1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvb3NlY29uZmlnUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Mb29zZWNvbmZpZ0ZhY3RvcnlJbXBsCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDk3OWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIExvb3NlY29uZmlnUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBMb29zZWNvbmZpZ1BhY2thZ2UsCi0gKiAgICAgICAgICBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIExvb3NlY29uZmlnUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvb3NlQXBwbGljYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvb3NlQXJjaGl2ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9vc2VMaWJyYXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb29zZU1vZHVsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9vc2VDb25maWd1cmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb29zZVdBUkZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBMb29zZWNvbmZpZ0ZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBMb29zZWNvbmZpZ1BhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKExvb3NlY29uZmlnUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlMb29zZWNvbmZpZ1BhY2thZ2VJbXBsIHRoZUxvb3NlY29uZmlnUGFja2FnZSA9IChMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIExvb3NlY29uZmlnUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBMb29zZWNvbmZpZ1BhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCB0aGVDb21tb25hcmNoaXZlUGFja2FnZSA9IChDb21tb25hcmNoaXZlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKYXZhUmVmUGFja2FnZUltcGwgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFSZWZQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpIDogSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhUmVmUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlTG9vc2Vjb25maWdQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25hcmNoaXZlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFSZWZQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUxvb3NlY29uZmlnUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTG9vc2Vjb25maWdQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9vc2VBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGxvb3NlQXBwbGljYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9vc2VBcHBsaWNhdGlvbl9Mb29zZUFyY2hpdmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VBcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9vc2VBcmNoaXZlKCkgewotCQlyZXR1cm4gbG9vc2VBcmNoaXZlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvb3NlQXJjaGl2ZV9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9vc2VBcmNoaXZlX1Jlc291cmNlc1BhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb29zZUFyY2hpdmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlTGlicmFyeSgpIHsKLQkJcmV0dXJuIGxvb3NlTGlicmFyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb29zZUxpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlV0FSRmlsZSgpIHsKLQkJcmV0dXJuIGxvb3NlV0FSRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VXQVJGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb29zZU1vZHVsZSgpIHsKLQkJcmV0dXJuIGxvb3NlTW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvb3NlTW9kdWxlX0FsdEREKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbG9vc2VNb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvb3NlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9vc2VDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlY29uZmlnRmFjdG9yeSBnZXRMb29zZWNvbmZpZ0ZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTG9vc2Vjb25maWdGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJbG9vc2VBcHBsaWNhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9BUFBMSUNBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VBcHBsaWNhdGlvbkVDbGFzcywgTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTKTsKLQotCQlsb29zZUFyY2hpdmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfQVJDSElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvb3NlQXJjaGl2ZUVDbGFzcywgTE9PU0VfQVJDSElWRV9fQklOQVJJRVNfUEFUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19SRVNPVVJDRVNfUEFUSCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobG9vc2VBcmNoaXZlRUNsYXNzLCBMT09TRV9BUkNISVZFX19MT09TRV9BUFApOwotCi0JCWxvb3NlTGlicmFyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZUxpYnJhcnlFQ2xhc3MsIExPT1NFX0xJQlJBUllfX0xPT1NFX1dBUik7Ci0KLQkJbG9vc2VNb2R1bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9PU0VfTU9EVUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsb29zZU1vZHVsZUVDbGFzcywgTE9PU0VfTU9EVUxFX19BTFRfREQpOwotCi0JCWxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT09TRV9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZUNvbmZpZ3VyYXRpb25FQ2xhc3MsIExPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUyk7Ci0KLQkJbG9vc2VXQVJGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPT1NFX1dBUl9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb29zZVdBUkZpbGVFQ2xhc3MsIExPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlsb29zZUFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TG9vc2VBcmNoaXZlKCkpOwotCQlsb29zZUxpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZUFyY2hpdmUoKSk7Ci0JCWxvb3NlTW9kdWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TG9vc2VBcmNoaXZlKCkpOwotCQlsb29zZVdBUkZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZU1vZHVsZSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGxvb3NlQXBwbGljYXRpb25FQ2xhc3MsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsICJMb29zZUFwcGxpY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKSwgdGhpcy5nZXRMb29zZUFyY2hpdmUoKSwgdGhpcy5nZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKSwgImxvb3NlQXJjaGl2ZXMiLCBudWxsLCAwLCAtMSwgTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlQXJjaGl2ZUVDbGFzcywgTG9vc2VBcmNoaXZlLmNsYXNzLCAiTG9vc2VBcmNoaXZlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvb3NlQXJjaGl2ZV9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9vc2VBcmNoaXZlX0JpbmFyaWVzUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYmluYXJpZXNQYXRoIiwgbnVsbCwgMCwgMSwgTG9vc2VBcmNoaXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZUFyY2hpdmVfUmVzb3VyY2VzUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VzUGF0aCIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VBcmNoaXZlX0xvb3NlQXBwKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCB0aGlzLmdldExvb3NlQXBwbGljYXRpb25fTG9vc2VBcmNoaXZlcygpLCAibG9vc2VBcHAiLCBudWxsLCAwLCAxLCBMb29zZUFyY2hpdmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihsb29zZUFyY2hpdmVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNNb2R1bGUiKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlTGlicmFyeUVDbGFzcywgTG9vc2VMaWJyYXJ5LmNsYXNzLCAiTG9vc2VMaWJyYXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKSwgdGhpcy5nZXRMb29zZVdBUkZpbGUoKSwgdGhpcy5nZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCksICJsb29zZVdBUiIsIG51bGwsIDAsIDEsIExvb3NlTGlicmFyeS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlTW9kdWxlRUNsYXNzLCBMb29zZU1vZHVsZS5jbGFzcywgIkxvb3NlTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZU1vZHVsZV9BbHRERCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWx0REQiLCBudWxsLCAwLCAxLCBMb29zZU1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcywgTG9vc2VDb25maWd1cmF0aW9uLmNsYXNzLCAiTG9vc2VDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCBudWxsLCAiYXBwbGljYXRpb25zIiwgbnVsbCwgMCwgLTEsIExvb3NlQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlV0FSRmlsZUVDbGFzcywgTG9vc2VXQVJGaWxlLmNsYXNzLCAiTG9vc2VXQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCksIHRoaXMuZ2V0TG9vc2VMaWJyYXJ5KCksIHRoaXMuZ2V0TG9vc2VMaWJyYXJ5X0xvb3NlV0FSKCksICJsb29zZUxpYnMiLCBudWxsLCAwLCAtMSwgTG9vc2VXQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCX0KLQotfSAvL0xvb3NlY29uZmlnUGFja2FnZUltcGwKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZGZhMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7fQotICovCi1wdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExvb3NlY29uZmlnUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTG9vc2Vjb25maWdTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgTG9vc2Vjb25maWdTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFwcGxpY2F0aW9uKExvb3NlQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvb3NlQXBwbGljYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFyY2hpdmUoTG9vc2VBcmNoaXZlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUFyY2hpdmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUxpYnJhcnkoTG9vc2VMaWJyYXJ5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUxpYnJhcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZU1vZHVsZShMb29zZU1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9vc2VNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUNvbmZpZ3VyYXRpb24oTG9vc2VDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZVdBUkZpbGUoTG9vc2VXQVJGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb29zZVdBUkZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4gSXQncyB1c2VmdWwgdG8KLQkgKiBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlQXBwbGljYXRpb25BZGFwdGVyKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlQXJjaGl2ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvb3NlV0FSRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9vc2VNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb29zZUNvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC91dGlsL0xvb3NlY29uZmlnU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC91dGlsL0xvb3NlY29uZmlnU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjI1N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ1N3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZVdBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTG9vc2Vjb25maWdTd2l0Y2gge30KLSAqLwotcHVibGljIGNsYXNzIExvb3NlY29uZmlnU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMb29zZWNvbmZpZ1BhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExvb3NlY29uZmlnU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTjogewotCQkJCUxvb3NlQXBwbGljYXRpb24gbG9vc2VBcHBsaWNhdGlvbiA9IChMb29zZUFwcGxpY2F0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMb29zZUFwcGxpY2F0aW9uKGxvb3NlQXBwbGljYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxvb3NlQXJjaGl2ZShsb29zZUFwcGxpY2F0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFOiB7Ci0JCQkJTG9vc2VBcmNoaXZlIGxvb3NlQXJjaGl2ZSA9IChMb29zZUFyY2hpdmUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlQXJjaGl2ZShsb29zZUFyY2hpdmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUlk6IHsKLQkJCQlMb29zZUxpYnJhcnkgbG9vc2VMaWJyYXJ5ID0gKExvb3NlTGlicmFyeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9vc2VMaWJyYXJ5KGxvb3NlTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTG9vc2VBcmNoaXZlKGxvb3NlTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFOiB7Ci0JCQkJTG9vc2VNb2R1bGUgbG9vc2VNb2R1bGUgPSAoTG9vc2VNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvb3NlTW9kdWxlKGxvb3NlTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMb29zZUFyY2hpdmUobG9vc2VNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0NPTkZJR1VSQVRJT046IHsKLQkJCQlMb29zZUNvbmZpZ3VyYXRpb24gbG9vc2VDb25maWd1cmF0aW9uID0gKExvb3NlQ29uZmlndXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9vc2VDb25maWd1cmF0aW9uKGxvb3NlQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEU6IHsKLQkJCQlMb29zZVdBUkZpbGUgbG9vc2VXQVJGaWxlID0gKExvb3NlV0FSRmlsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9vc2VXQVJGaWxlKGxvb3NlV0FSRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTG9vc2VNb2R1bGUobG9vc2VXQVJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMb29zZUFyY2hpdmUobG9vc2VXQVJGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFwcGxpY2F0aW9uKExvb3NlQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvb3NlQXJjaGl2ZShMb29zZUFyY2hpdmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvb3NlTGlicmFyeShMb29zZUxpYnJhcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvb3NlV0FSRmlsZShMb29zZVdBUkZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvb3NlTW9kdWxlKExvb3NlTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUNvbmZpZ3VyYXRpb24oTG9vc2VDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0xvb3NlY29uZmlnU3dpdGNoCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY2MmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24iPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbXBsIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24iPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24iPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EiPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIiPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uIj48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50Ij48L3BhY2thZ2U+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudCI+PC9wYWNrYWdlPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AiPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC51dGlsIj48L3BhY2thZ2U+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vYXBwbGljYXRpb25jbGllbnR2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDE5OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZHMgYWxsIHRoZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgdGhlIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0Ci0jCi0jIDpCZWdpbjogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6QmVnaW46Ci0jQ09NUE9ORU5UUFJFRklYIENIS0oKLSNDT01QT05FTlROQU1FRk9SIENIS0ogSUJNIFdlYlNwaGVyZSBWYWxpZGF0aW9uCi0jQ01WQ1BBVEhOQU1FIG5jZi9zcmMvamF2YS9jb20vaWJtL3dlYnNwaGVyZS92YWxpZGF0aW9uL2FwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLQotCi1FUlJPUl9BUFBMSUNBVElPTkNMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFPUNIS0oxMDAwRTogVmFsaWRhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGZpbGUgaXMgbm90IHZhbGlkLiBFbnN1cmUgdGhhdCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIHZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1FUlJPUl9BUFBDTElFTlRfVkFMSURBVElPTl9GQUlMRUQ9Q0hLSjEwMDFFOiBWYWxpZGF0aW9uIGZhaWxlZDoKLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotRVJST1JfRUpCX1JFRlM9Q0hLSjEwMDJFOiBVbnJlc29sdmFibGUgRUpCIHJlZmVyZW5jZXMgaW4gezB9OwotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1JTlZBTElEX0REPUNIS0oxMDAzRTogVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IGhhcyBhbiBpbnZhbGlkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9BUFBDTElFTlRfTUlTU0lOR19VUkk9Q0hLSjEwMDRFOiBUaGUgVVJJLCB7MH0sIGRvZXMgbm90IG1hdGNoIGFueXRoaW5nIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZmlsZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkVDT0w9Q0hLSjEwMDVFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezB9LCBjb2x1bW4gezF9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRERfUEFSU0VfTElORT1DSEtKMTAwNkU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gYW4gdW5rbm93biBzeW50YXggZXJyb3IuIFRoZSBiYWQgc2VjdGlvbiBzdGFydHMgYXQgbGluZSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMDdFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIHVua25vd24gc3ludGF4IGVycm9yLiBUaGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gaGVscCBpZGVudGlmeSB0aGUgYmFkIHNlY3Rpb24uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAwOEU6IFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlIGJlY2F1c2UgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjYW5ub3QgYmUgb3BlbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfRFVQX1JFU19FTlZfUkVGX0VSUk9SXz1JV0FFMDAwMkUgRHVwbGljYXRlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSAiezB9IiBpbiBhcHBsaWNhdGlvbi1jbGllbnQueG1sLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1BUFBDTElFTlRfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl89SVdBRTAwMDNFIERvY3VtZW50IHR5cGUgdmVyc2lvbiAiezB9IiBmb3IgYXBwbGljYXRpb24tY2xpZW50LnhtbCBpbiBwcm9qZWN0ICJ7MX0iIG5lZWRzIHRvIGJlIHZlcnNpb24gInsyfSIuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUFQUENMSUVOVF9EVVBfRUpCX1JFRl9FUlJPUl89SVdBRTAwMDRFIER1cGxpY2F0ZSBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlICJ7MH0iIGluIGFwcGxpY2F0aW9uLWNsaWVudC54bWwuCi1BUFBDTElFTlRfTUFJTl9DTEFTU19FUlJPUl89SVdBRTAwMzVFIFRoZSBNYWluLUNsYXNzIGF0dHJpYnV0ZSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzY4ZmE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZCBhbGwgdGhlIGV4dGVybmFsaXNlZCBzdHJpbmdzIGZvciBlVG9vbHMgCi0jIEVBUiBWYWxpZGF0aW9uIHByb2plY3QKLSMKLSMgTWVzc2FnZXMgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGF0IAotIyAgIGh0dHA6Ly9oYW55LmF1c3Rpbi5pYm0uY29tL21lc3NhZ2VzL2luZGV4Lmh0bWwKLSMKLSMgQnJpZWZseToKLSMgICAgIE1FU1NBR0VfSUQ9PENvbXBvbmVudFByZWZpeD48TWVzc2FnZU51bWJlcj48VHlwZUNvZGU+OiA8TWVzc2FnZVRleHQ+Ci0jCi0jIFRoZSBwcmVmaXggZm9yIHRoaXMgY29tcG9uZW50IGlzOgotIyAgICAgQ0hLVyAoSUJNIFdlYlNwaGVyZSBWYWxpZGF0aW9uKQotIwotIyBNZXNzYWdlIG51bWJlcnMgYXJlIGZvdXIgZGlnaXQgbnVtYmVycywgZnJvbSAnMDAwMCcgdG8gJzk5OTknLCBpbmNsdXNpdmUuCi0jIE1lc3NhZ2UgbnVtYmVycyBhcmUgZmlsbGVkIHRvIHRoZSBsZWZ0IHdpdGggJzAnLCB0byBhIHdpZHRoIG9mIDQuCi0jCi0jIFZhbGlkIG1lc3NhZ2UgdHlwZSBjb2RlcyBhcmU6Ci0jICAgICBJIChJbmZvcm1hdGlvbmFsKQotIyAgICAgVyAoV2FybmluZykKLSMgICAgIEUgKEVycm9yKQotIwotIyBOb3RlIHRoZSAiOiAiIHRoYXQgYXBwZWFycyBiZXR3ZWVuIHRoZSB0eXBlIGNvZGUgYW5kIHRoZSBtZXNzYWdlIHRleHQuCi0jCi0jIDpCZWdpbjogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6QmVnaW46Ci0jQ09NUE9ORU5UUFJFRklYIENIS0oKLSNDT01QT05FTlROQU1FRk9SIENIS0ogSUJNIFdlYlNwaGVyZSBWYWxpZGF0aW9uCi0jQ01WQ1BBVEhOQU1FIG5jZi9zcmMvamF2YS9jb20vaWJtL3dlYnNwaGVyZS92YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcwotIyA6RW5kOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpFbmQ6Ci0jCi0jIDI5LUp1bmUtMjAwMToKLSMgIFRoaXMgZmlsZSBoYXMgYmVlbiB0ZXN0ZWQgdXNpbmcgdGhlIFByb2Nlc3NNc2dGaWxlIHRvb2wsIHdyaXR0ZW4gYnkgCi0jICBIYW55IFNhbGVtIGFuZCBvd25lZCBieSBEZW5uaXMgSGViZXJ0LiAgQW55IGZ1dHVyZSBjaGFuZ2VzIHNob3VsZCAKLSMgIGFsc28gYmUgdmVyaWZpZWQgdXNpbmcgdGhpcyB0b29sLiAgUGxlYXNlIGNvbnRhY3QgRGVubmlzIAotIyAgKGhlYmVydEB1cy5pYm0uY29tIG9yIFQvTCA1NDMtMjUyMCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jTk9UQU1TRwotdmFsaWRhdG9yLm5hbWU9RUFSIFZhbGlkYXRvcgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfVkFMSURBVElPTl9GQUlMRUQ9Q0hLSjEwMDBFOiBFQVIgVmFsaWRhdGlvbiBmYWlsZWQ6IHswfQotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfSU5WQUxJRF9FQVJfRklMRT1DSEtKMTAwMUU6IFRoZSBFQVIgcHJvamVjdCB7MH0gaXMgaW52YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUz1DSEtKMTAwMkU6IER1cGxpY2F0ZSBzZWN1cml0eSByb2xlIG5hbWVkIHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9FQVJfTk9fTU9EVUxFX1VSST1DSEtKMTAwM0U6IEEgbW9kdWxlIGhhcyBiZWVuIGRlZmluZWQgd2l0aCBubyBVUkkuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfRUFSX01JU1NJTkdfVVJJPUNIS0oxMDA0RTogVGhlIFVSSSwgezB9LCBkb2VzIG5vdCBtYXRjaCBhbnl0aGluZyBpbiB0aGUgRUFSIGZpbGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVBUl9ERF9QQVJTRV9MSU5FQ09MPUNIS0oxMDA1RTogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgc3RhcnQgb2YgdGhlIGJhZCBzZWN0aW9uIGlzIGF0IGxpbmUgezB9LCBjb2x1bW4gezF9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FQVJfRERfUEFSU0VfTElORT1DSEtKMTAwNkU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIHN0YXJ0IG9mIHRoZSBiYWQgc2VjdGlvbiBpcyBhdCBsaW5lIHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRUFSX0REX1BBUlNFX05PSU5GTz1DSEtKMTAwN0U6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRUFSX0REX0NBTk5PVF9PUEVOX0REPUNIS0oxMDA4RTogQ2Fubm90IG9wZW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVmFsaWRhdGlvbiBjYW5ub3QgY29tcGxldGUuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgZXJyb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVVJJX0NPTlRBSU5TX1NQQUNFU19FUlJPUl89SVdBRTAwMDVFIFRoZSBVUkkgezB9IGNvbnRhaW5zIGEgc3BhY2UuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGJlY2F1c2UgaXQgY2Fubm90IGJlIHJlZmVyZW5jZWQgZnJvbSBhIG1hbmlmZXN0IGZpbGUuCi1NRVNTQUdFX0VBUl9EVVBMSUNBVEVfVVJJX0VSUk9SXz1JV0FFMDAwNkUgVGhlIG1vZHVsZSB7MH0gaGFzIGR1cGxpY2F0ZSB1cmkgaW4gRUFSOiB7MX0uCi1NRVNTQUdFX0VBUl9EVVBJQ0FURV9ST09UQ09OVEVYVF9FUlJPUl89SVdBRTAwMDdFIFNhbWUgY29udGV4dCByb290ICJ7MH0iIGV4aXN0cyBpbiBXZWIgbW9kdWxlcyAiezF9IiBhbmQgInsyfSIuCi1NRVNTQUdFX0VNUFRZX0FMVF9ERF9FUlJPUl89SVdBRTAwMDlFIFRoZSBtb2R1bGUgezB9IGhhcyBlbXB0eSA8YWx0LWRkPiB0YWcgaW4gRUFSIHsxfS4gIFRoZSB0YWcgc2hvdWxkIGJlIHJlbW92ZWQgb3IgdGhlIHZhbHVlIHNob3VsZCBiZSB2YWxpZC4KLURVUExJQ0FURV9VVElMSkFSX0ZPUl9QUk9KRUNUX05BTUVfRVJST1JfPUlXQUUwMDEwRSA9VGhlIHByb2plY3QgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIGR1cGxpY2F0ZSB1dGlsaXR5IEpBUiBVUkkgezJ9LgotRFVQTElDQVRFX01PRFVMRV9GT1JfUFJPSkVDVF9OQU1FX0VSUk9SXz1JV0FFMDAxMUUgVGhlIHByb2plY3QgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIGR1cGxpY2F0ZSBtb2R1bGUgbmFtZSB7Mn0uCi1NRVNTQUdFX1VUSUxfVVJJX05BTUVfQ09MTElTSU9OX0VSUk9SXz1JV0FFMDAxMkUgVGhlIG1vZHVsZSB7MH0gaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBoYXMgc2FtZSBuYW1lIGFzIHV0aWxpdHkgSkFSIFVSSS4KLU1FU1NBR0VfVVRJTF9QUk9KRUNUX05BTUVfQ09MTElTSU9OX0VSUk9SXz1JV0FFMDAxM0UgVGhlIG1vZHVsZSB7MH0gaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBoYXMgc2FtZSBuYW1lIGFzIHV0aWxpdHkgSkFSIHByb2plY3QgbmFtZS4KLUVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRVJST1JfPUlXQUUwMDE0RSBBbiBlcnJvciBvY2N1cnJlZCB2YWxpZGF0aW5nIHRoZSBNQU5JRkVTVC5NRiBmaWxlIGluIGFyY2hpdmUgezB9LgotTUFOSUZFU1RfTElORV9FTkRfRVJST1JfPUlXQUUwMDE1RSBUaGUgTUFOSUZFU1QuTUYgZmlsZSBpbiBhcmNoaXZlIHswfSBkb2VzIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCi1NQU5JRkVTVF9MSU5FX0VYQ0VFRFNfTEVOR1RIX0VSUk9SXz1JV0FFMDAxNkUgTGluZSB7MH0gaW4gdGhlIE1BTklGRVNULk1GIGZpbGUgaW4gYXJjaGl2ZSB7MX0gZXhjZWVkcyB0aGUgc3BlY2lmaWNhdGlvbiBsaW1pdCBvZiA3MiBieXRlcy4KLQotSU5WQUxJRF9VUklfRk9SX01PRFVMRV9FUlJPUl89SVdBRTAwMTdFIFRoZSBtb2R1bGUgezB9IGhhcyBhIHdyb25nIGRlZmF1bHQgZXh0ZW5zaW9uICguamFyIGZvciBFSkIgbW9kdWxlcyBhbmQgLndhciBmb3IgV2ViIG1vZHVsZXMpLgotRUFSX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfPUlXQUUwMDE4RSBEb2N1bWVudCB0eXBlIHZlcnNpb24gInswfSIgZm9yIGFwcGxpY2F0aW9uLnhtbCBpbiBwcm9qZWN0ICJ7MX0iIG5lZWRzIHRvIGJlIHZlcnNpb24gInsyfSIuCi0KLU1PRFVMRV9ERF9QQVJTRV9MSU5FQ09MX0VSUk9SXz1JV0FFMDAxOUUgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBvZiBtb2R1bGUgezB9IGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRoZSBiYWQgc2VjdGlvbiBzdGFydHMgYXQgbGluZSB7MX0sIGNvbHVtbiB7Mn0uCi1NT0RVTEVfRERfUEFSU0VfTElORV9FUlJPUl89SVdBRTAwMjBFIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgbW9kdWxlIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezF9Ci1NT0RVTEVfRERfUEFSU0VfTk9JTkZPX0VSUk9SXz1JV0FFMDAyMUUgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBvZiBtb2R1bGUgezB9IGNvdWxkIG5vdCBiZSBsb2FkZWQuCi1FSkJfQkVBTl9FSkJfTElOS19JTlRFRkFDRV9NSVNNQVRDSF9FUlJPUl89SVdBRTAwMzdFIFRoZSBpbnRlcmZhY2VzIG9mIHRoZSBsaW5rZWQgZW50ZXJwcmlzZSBiZWFuIHswfSBkbyBub3QgbWF0Y2ggdGhvc2UgaW4gRUpCIHJlZiB7MX0gaW4gbW9kdWxlIHsyfS4KLQotIyB3YXJuaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJOSU5HX01FVEFGT0xERVJfTUlTU0lORz1JV0FKMDAwMFc6IE1ldGEgZm9sZGVyIHswfSBtdXN0IGV4aXN0IGluIHByb2plY3QgezF9LgotV0FSTklOR19GSUxFX01JU1NJTkc9SVdBSjAwMDFXOiB7MH0gbXVzdCBleGlzdCBpbiBwcm9qZWN0IHsxfS4KLU1FU1NBR0VfSU5WQUxJRF9BTFRfRERfV0FSTl89SVdBRTAwMjJXIFRoZSBtb2R1bGUgezB9IGhhcyBhbHQtZGQgezF9LCBidXQgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0IGluIEVBUiB7Mn0uCi1JTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9PTkVfV0FSTl89SVdBRTAwMjNXIFRoZSBNYW5pZmVzdCBDbGFzcy1QYXRoIGluIGFyY2hpdmUgezB9IGNvbnRhaW5zIGFuIGVudHJ5IHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBFQVI6IHsxfS4KLUlOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX1RXT19XQVJOXz1JV0FFMDAyNFcgVGhlIE1hbmlmZXN0IENsYXNzLVBhdGggZm9yIGFyY2hpdmUgezB9IGNvbnRhaW5zIGFuIGVudHJ5LCB7MX0sIHRoYXQgaXMgbm90IHJlc29sdmFibGUgdG8gYSBmaWxlIG9yIG1vZHVsZSBpbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbjogezJ9LgotSU5WQUxJRF9NQU5JRkVTVF9DTEFTU1BBVEhfREVQRU5ERU5DWV9XQVJOXz1JV0FFMDAyNVcgVGhlIE1hbmlmZXN0IENsYXNzLVBhdGggaW4gbW9kdWxlIHswfSBjb250YWlucyBhbiBlbnRyeSwgezF9LCB0aGF0IHJlc29sdmVzIHRvIGFyY2hpdmUgezJ9LiAgVGhpcyBkZXBlbmRlbmN5IGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBKMkVFIHNwZWNpZmljYXRpb24uCi1QUk9KRUNUX0lTX0NMT1NFRF9XQVJOXz1JV0FFMDAyNlcgRUFSIFZhbGlkYXRpb24gY2Fubm90IHJ1biBvbiBjbG9zZWQgcHJvamVjdDogezB9LiBPcGVuIHRoZSBwcm9qZWN0LCBhbmQgdHJ5IGFnYWluLgotUFJPSkVDVF9ET0VTX05PVF9FWElTVF9XQVJOXz1JV0FFMDAyN1cgVGhlIHByb2plY3QgezB9IGZvciBtb2R1bGUgb3IgdXRpbGl0eSBKQVIgezF9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7Mn0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLU1JU1NJTkdfV0VCTkFUVVJFX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAyOFcgVGhlIHdlYiBtb2R1bGUgezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MX0gaXMgbm90IGEgSjJFRSBXZWIgcHJvamVjdC4KLURFUFJFQ0FURURfQUJTUEFUSFNfV0FSTl89SVdBRTAwMjlXIFRoZSBJQk0gZXh0ZW5zaW9ucyBmaWxlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MH0gY29udGFpbnMgZGVwcmVjYXRlZCBhYnNvbHV0ZSBwYXRocy4gIFVzZSB0aGUgYXBwbGljYXRpb24gZWRpdG9yIHRvIGNsZWFuIHVwIHRoZSBmaWxlLgotSU5WQUxJRF9DT05URVhUUk9PVF9XRUJNT0RVTEVfV0FSTl89SVdBRTAwMzBXIFRoZSBjb250ZXh0IHJvb3QgZm9yIFdlYiBtb2R1bGU6IHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q6IHsxfSBkb2VzIG5vdCBtYXRjaCB0aGUgY29udGV4dCByb290IGluIHdlYiBwcm9qZWN0IHNldHRpbmdzIG9mIHsyfS4KLU1JU1NJTkdfQ0xJRU5UTkFUVVJFX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAzMVcgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDp7MX0gaXMgbm90IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0LgotTUlTU0lOR19FSkJOQVRVUkVfRk9STU9EVUxFX1dBUk5fPUlXQUUwMDMyVyBUaGUgRUpCIG1vZHVsZSB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBpcyBub3QgYW4gRUpCIHByb2plY3QuCi1NSVNTSU5HX1BST0pFQ1RfRk9STU9EVUxFX1dBUk5fPUlXQUUwMDMzVyBUaGUgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezF9IGlzIG5vdCBtYXBwZWQgdG8gYSB3b3JrYmVuY2ggcHJvamVjdC4gIFVzZSB0aGUgYXBwbGljYXRpb24gZWRpdG9yIHRvIGNvcnJlY3QuCi1JTlZBTElEX0NBU0VfRk9SX01BTklGRVNUX0VSUk9SXz1JV0FFMDAzOEUgVGhlIGNhc2Ugb2YgdGhlIG1hbmlmZXN0IGZpbGUgbmFtZSAiezB9IiBpbiBhcmNoaXZlIHsxfSBpbiBpbmNvcnJlY3QuICBGaWxlIG5hbWUgbXVzdCBiZSAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiLCBjYXNlIHNlbnNpdGl2ZS4KLVVSSV9BTFJFQURZX0VYSVNUU19JTl9FQVJfV0FSTl89SVdBRTAwMzlXIFByb2plY3QgdXRpbGl0eSBKQVIgVVJJIHswfSBjb2xsaWRlcyB3aXRoIGFuIGV4aXN0aW5nIGZpbGUgaW4gcHJvamVjdCB7MX0uCi1NSVNTSU5HX01PRFVMRV9FWFRFTlNJT05fRVJST1JfPUlXQUUwMDQwRSBUaGUgYXBwbGljYXRpb24gZXh0ZW5zaW9uIGluIEVBUiBwcm9qZWN0OiB7MH0gaXMgbWlzc2luZyBtb2R1bGUgZXh0ZW5zaW9uIGZvciBtb2R1bGUgcHJvamVjdDogezF9LgotUFJPSkVDVF9TRVJWRVJfVEFSR0VUX0RPRVNfTk9UX01BVENIX0VBUj1UaGUgdGFyZ2V0IHNlcnZlciBvZiB0aGUgbW9kdWxlIHByb2plY3QgInswfSIgZG9lcyBub3QgbWF0Y2ggdGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIGNvbnRhaW5pbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0ICJ7MX0iCi1OT19TRVJWRVJfVEFSR0VUX01PRFVMRV9JTl9FQVJfV0lUSF9TRVJWRVJfVEFSR0VUPVRoZSBtb2R1bGUgcHJvamVjdCAiezB9IiB3aXRoIG5vIHRhcmdldCBzZXJ2ZXIgYmVsb25ncyB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgInsxfSIgdGhhdCBoYXMgYSB0YXJnZXQgc2VydmVyCi1OT19TRVJWRVJfVEFSR0VUX09OX0VBUl9XSVRIX01PRFVMRV9TRVJWRVJfVEFSR0VUUz1UaGUgZWFyIHByb2plY3QgInswfSIgd2l0aCBubyB0YXJnZXQgc2VydmVyIGhhcyBtb2R1bGUgcHJvamVjdCAiezF9IiB0aGF0IGhhcyBhIHRhcmdldCBzZXJ2ZXIKLUlOVkFMSURfRUFSX1NFUlZFUl9UQVJHRVRfRk9SXzE0X1NQRUNfTEVWRUw9VGhlIEoyRUUgMS40IHNwZWNpZmljYXRpb24gRUFSIHByb2plY3QgInswfSIgaGFzIGFuIGluY29tcGF0aWJsZSB0YXJnZXQgc2VydmVyICJ7MX0iCi1JTlZBTElEX01PRFVMRV9TRVJWRVJfVEFSR0VUX0ZPUl8xNF9TUEVDX0xFVkVMPVRoZSBKMkVFIDEuNCBzcGVjaWZpY2F0aW9uIG1vZHVsZSBwcm9qZWN0ICJ7MH0iIGhhcyBhbiBpbmNvbXBhdGlibGUgdGFyZ2V0IHNlcnZlciAiezF9Ii4KLU1FU1NBR0VfSU5DT01QQVRJQkxFX1NQRUNfV0FSTklOR189SVdBRTAwMDhFIFRoZSBtb2R1bGUgInswfSIgaXMgYXQgYW4gaW5jb21wYXRpYmxlIEoyRUUgc3BlY2lmaWNhdGlvbiBsZXZlbCB0aGFuIHRoYXQgb2YgdGhlICJ7MX0iIEVudGVycHJpc2UgQXBwbGljYXRpb24uCi1FQVJfVkFMSURBVElPTl9JTlRFUk5BTF9FUlJPUl9VSV89SVdBRTAwNTNFIEFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZCBydW5uaW5nIHZhbGlkYXRpb24gb24gcHJvamVjdDp7MH0sIGNoZWNrIHRoZSBsb2cgZmlsZSBmb3IgZGV0YWlscwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lamJ2YWxpZGF0b3IucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWpidmFsaWRhdG9yLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTMyZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lamJ2YWxpZGF0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyAgICAgKiBDb2RlIG9yaWVudGVkIGluc3RydWN0aW9uczoKLSMgICAgICoKLSMgICAgICogSW4gdGhlIHN0cmluZywgeW91IG1heSBzZWUgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHNlcXVlbmNlczoKLSMgICAgICogYSkge259ICB3aGVyZSBuIGlzIGEgbnVtYmVyLiBUaGVzZSBhcmUgcmVwbGFjZWFibGUgcGFyYW1ldGVycy4KLSMgICAgICogYikgJycgIEluIC5wcm9wZXJ0aWVzIGZpbGVzLCBpbiBvcmRlciB0byBzZWUgb25lIGFwb3N0cm9waGUgKCcpIGluIHRoZSBmaW5hbAotIyAgICAgKiAgICBzdHJpbmcsIHNvbWV0aW1lcyB0d28gYXBvc3Ryb3BoZXMgbXVzdCBiZSBlbnRlcmVkIGluIHRoZSBzdHJpbmcuIEluIHRoZSB0cmFuc2xhdGVkCi0jICAgICAqICAgIHN0cmluZywgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHtufSBpbiB0aGUgc3RyaW5nLCB0aGVuIHRvIHNob3cgb25lIGFwb3N0cm9waGUKLSMgICAgICogICAgdG8gdGhlIHVzZXIsIHB1dCB0d28gYXBvc3Ryb3BoZXMgaW4gdGhlIHN0cmluZy4gSWYgdGhlcmUgYXJlIG5vIHtufSBpbiB0aGUgc3RyaW5nLAotIyAgICAgKiAgICB0aGVuIHB1dCBvbmUgYXBvc3Ryb3BoZS4KLSMgICAgICogICAgRm9yIGV4YW1wbGUsIHNheSB0aGF0IHlvdSB3YW50IHRoZSB1c2VyIHRvIHJlYWQgIkdlb3JnZSdzIGZpbGUiLiAKLSMgICAgICogICAgICAgIEdFT1JHRT1HZW9yZ2UncyBmaWxlIHdhcyBvbiB0aGUgZGVzay4KLSMgICAgICogICAgICAgIEdFT1JHRTI9R2VvcmdlJydzIGZpbGUgYW5kIHswfSB3ZXJlIG9uIHRoZSBkZXNrLgotIyAgICAgKiAgICBHRU9SR0UgdXNlcyBvbmUgYXBvc3Ryb3BoZSBiZWNhdXNlIHRoZXJlIGFyZSBubyB7bn0gYW5kIEdFT1JHRTIKLSMgICAgICogICAgdXNlcyB0d28gYXBvc3Ryb3BoZXMgYmVjYXVzZSB0aGVyZSBpcyBhIHtufS4KLSMgICAgICogYykgJycgdGV4dCAnJyB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgZG91YmxlCi0jICAgICAqICAgIGFwb3N0cm9waGVzIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gCi0jICAgICAqIGQpIDx0ZXh0PiB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgYW5nbGUKLSMgICAgICogICAgYnJhY2tldHMgc2hvdWxkIE5PVCBiZSB0cmFuc2xhdGVkLgotIyAgICAgKiBlKSAidGV4dCIgd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIHF1b3RhdGlvbiAKLSMgICAgICogICAgbWFya3Mgc2hvdWxkIE5PVCBiZSB0cmFuc2xhdGVkLgotIyAgICAgKiAgICAKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICAgICogT3RoZXIgaW5zdHJ1Y3Rpb25zCi0jICAgICAqIGEpIERvIG5vdCB0cmFuc2xhdGUgYW55IHRleHQgdGhhdCBpcyBvbiBhIGxpbmUgd2hpY2ggYmVnaW5zIHdpdGggYSBjb21tZW50IAotIyAgICAgKiAgICBzeW1ib2wgKCMpLgotIyAgICAgKiBiKSBEbyBub3QgdHJhbnNsYXRlIHRoZXNlIHdvcmRzOiAKLSMgICAgICogICAgICAgIHNjaGVtYSwgRUpCLCBSREIsIEpBUiwgUk1JLCBCTVAsIENNUCwgT09TUUwKLSMgICAgICogYykgUGxlYXNlIHJldHVybiB0aGUgLnByb3BlcnRpZXMgZmlsZXMgdXNpbmcgdGhlIHNhbWUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLSMgICAgICogICAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0d28gb2YgdGhlIGZpbGVzIGhhdmUgdGhlIHNhbWUgbmFtZS4KLSMgICAgICoKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQW55IG90aGVyIGNvbW1lbnRzIHRvIHRoZSB0cmFuc2xhdG9ycyBhcmUgb24gbGluZXMgd2hpY2ggc3RhcnQgbGlrZSB0aGlzOiAgIyAyVEM6Ci0jCi0jIFZlcnNpb24gMS40MgotIwotCi0jCi0jIEJlZ2luIEVKQiBWYWxpZGF0b3Igc3RyaW5ncy4KLSMKLSMgVGhlIHB1cnBvc2Ugb2YKLSMgSURzOgotIyAgICBTVEFUVVM9U3RhdHVzIG1lc3NhZ2UKLSMgICAgTE9DPVRleHQgZGVzY3JpcHRpb24gb2YgYSBsb2NhdGlvbiAoaWRlbnRpZmllcyB0aGUgc291cmNlIG9mIHRoZSBwcm9ibGVtIHdoZW4gbm8gbGluZSBudW1iZXIgaXMgYXZhaWxhYmxlKQotIyAgICBDSEtKPUVKQiB2YWxpZGF0aW9uIG1lc3NhZ2UKLSMKLQotIwotIyBTdGFydCBvZiBzdGF0dXMgbWVzc2FnZXMKLSMKLVNUQVRVU19WQUxJREFUSU5HPVZhbGlkYXRpbmcgezB9LgotCi1MT0NfQ0xBU1M9Q2xhc3M6IHswfQotTE9DX0ZJRUxEPUZpZWxkOiB7MH0sIENsYXNzOiB7MX0KLUxPQ19NRVRIT0Q9TWV0aG9kOiB7MH0sIENsYXNzOiB7MX0KLUxPQ19CRUFOPUVudGVycHJpc2UgYmVhbjogezB9Ci1MT0NfUk9MRT08bG9jYWxSZWxhdGlvbnNoaXBSb2xlcz46IHswfSwgRW50ZXJwcmlzZSBiZWFuOiB7MX0KLUxPQ19ST0xFUkVGPTxzZWN1cml0eS1yb2xlLXJlZj46IHswfQotTE9DX01FVEhPREVMRU1FTlQ9PG1ldGhvZD4gZWxlbWVudDogezB9Ci1MT0NfTUVUSE9EUEVSTUlTU0lPTj08bWV0aG9kLXBlcm1pc3Npb24+IGVsZW1lbnQ6IHswfQotTE9DX01FVEhPRFRSQU5TQUNUSU9OPTxjb250YWluZXItdHJhbnNhY3Rpb24+IGVsZW1lbnQ6IHswfQotTE9DX0VKQlJFTEFUSU9OPTxlamItcmVsYXRpb24+OiB7MH0KLUxPQ19FSkJSRUxBVElPTlNISVBST0xFPTxlamItcmVsYXRpb25zaGlwLXJvbGU+OiB7MH0sIDxlamItcmVsYXRpb24+OiB7MX0KLSMKLSMgZW5kIG9mIHN0YXR1cyBtZXNzYWdlcwotIwotCi0jCi0jIFN0YXJ0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMKLSMKLSMgQWxsIHVuaXF1ZSBlcnJvciBpZHMgZm9sbG93IHRoaXMgZm9ybWF0OgotIwotIyAgICBDSEtKbm5ubltzXQotIwotIyB3aGVyZQotIyAgICAtIENIS0ogaXMgdGhlIGZvdXIgY2hhcmFjdGVyIHVuaXF1ZSBjb21wb25lbnQgcHJlZml4Ci0jICAgIC0gbm5ubiBpcyB0aGUgbnVtZXJpY2FsIGlkLCB1bmlxdWUgd2l0aGluIEVKQiBWYWxpZGF0b3IKLSMgICAgLSBbc10gaXMgdGhlIHNldmVyaXR5IGluZGljYXRvcjogRSAoZXJyb3IpLCBXICh3YXJuaW5nKSwgb3IgSSAoaW5mb3JtYXRpb24pLgotIwotIyBubm5uIHJhbmdlcyBmcm9tIDIwMDAgLSAyOTk5Ci0jICAgIDIwMDAgLSAyMDk5IE1lc3NhZ2VzIG9uIGEgY2xhc3MKLSMgICAgMjEwMCAtIDIxOTkgTWVzc2FnZXMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIFdlYnNwaGVyZSBvciBXU0EgKGkuZS4sIG5vdCBtZW50aW9uZWQgaW4gRUpCIHNwZWNpZmljYXRpb24sIHN1Y2ggYXMgYXNzb2NpYXRpb25zICYgZmluZGVycykKLSMgICAgMjIwMCAtIDIzOTkgTWVzc2FnZXMgb24gYSBmaWVsZAotIyAgICAyNDAwIC0gMjc5OSBNZXNzYWdlcyBvbiBhIG1ldGhvZAotIyAgICAyODAwIC0gMjg5OSBNZXNzYWdlcyBvbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0jICAgIDI5MDAgLSAyOTk5IE1pc2NlbGxhbmVvdXMKLSMKLQotIyAKLSMgTWVzc2FnZXMgY29tbW9uIGFjcm9zcyBFSkIgc3BlY2lmaWNhdGlvbnMKLSMKLUNIS0oyOTAwPUNIS0oyOTAwSTogSW50ZXJuYWwgZXJyb3Igd2hlbiBydW5uaW5nIEVKQiB2YWxpZGF0b3IuIFJlYWQgdGhlIGxvZyBmb3IgZGV0YWlscy4KLUNIS0oyODUyPUNIS0oyODUyVzogSW50ZXJuYWwgZXJyb3Igd2hpbGUgdmFsaWRhdGluZyB7MH0uIFRoZSBiZWFuIGJlaW5nIHZhbGlkYXRlZCB3YXMgezF9LgotQ0hLSjI0MzM9Q0hLSjI0MzNXOiBDYW5ub3QgdmFsaWRhdGUgezB9IGJlY2F1c2UgezF9IGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjkwNz1DSEtKMjkwN0U6IFR5cGUgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjkwNT1DSEtKMjkwNVc6IFRoZSBFSkIgVmFsaWRhdG9yIGRpZCBub3QgcnVuIGJlY2F1c2UgZWpiLWphci54bWwgY291bGQgbm90IGJlIGxvYWRlZC4gUnVuIHRoZSBYTUwgdmFsaWRhdG9yIGZvciBtb3JlIGluZm9ybWF0aW9uLgotQ0hLSjIwNDE9Q0hLSjIwNDFJOiBQZXJtYW5lbnQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBzaG91bGQgYmUgaW4gYSBuYW1lZCBwYWNrYWdlLiAoSkxTIDIuMDogNy40LjIpLgotCi1DSEtKMjQ1Ni5pPUNIS0oyNDU2VzogezB9IHNob3VsZCB0aHJvdyB7MX0gZm9yIHsyfSBvciB0aGVyZSBtYXkgYmUgY29tcGlsZSBlcnJvcnMgaW4gdGhlIGRlcGxveW1lbnQgY29kZS4KLUNIS0oyNDU2Lm09Q0hLSjI0NTZXOiBUaGlzIG1ldGhvZCBzaG91bGQgdGhyb3cgezB9IGZvciB7MX0gb3IgdGhlcmUgbWF5IGJlIGNvbXBpbGUgZXJyb3JzIGluIHRoZSBkZXBsb3ltZW50IGNvZGUuCi0KLSMKLSMgZW5kIG9mIGNvbW1vbiBtZXNzYWdlcwotIwotCi0jCi0jIE1lc3NhZ2VzIGZvciB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uCi0jCi1DSEtKMjAwMS5lYi5lamIxMT1DSEtKMjAwMVc6IFRoZSB7MH0ga2V5IGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSB7MX0gbWV0aG9kLiAoRUpCIDEuMTogOS4yLjkpCi1DSEtKMjAwMi5lYi5pLmVqYjExPUNIS0oyMDAyVzogVGhpcyBjbGFzcyBzaG91bGQgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9yIHswfS4gKEVKQiAxLjE6IDkuMi40KQotQ0hLSjIwMDIuZWIubS5lamIxMT1DSEtKMjAwMlc6IFRoaXMgY2xhc3Mgc2hvdWxkIGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvciB0aGlzIG1ldGhvZC4gKEVKQiAxLjE6IDkuMi40KQotQ0hLSjIwMDNFLmVqYjExPUNIS0oyMDAzRTogVGhpcyBjbGFzcyBtdXN0IG5vdCBpbXBsZW1lbnQgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24uIChFSkIgMS4xOiA2LjUuMykuCi1DSEtKMjAwM0kuZWpiMTE9Q0hLSjIwMDNJOiBCZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gc3RhdGVmdWwgc2Vzc2lvbiBiZWFucyBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24uIChFSkIgMS4xOiA2LjUuMykuCi1DSEtKMjAwNC5lYi5pLmVqYjExPUNIS0oyMDA0VzogVGhlIHsxfSBiZWFuIGNsYXNzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoZSB7MH0gZWpiRmluZCBtZXRob2QuIChFSkIgMS4xOiA5LjQuNikKLUNIS0oyMDA0LmViLm0uZWpiMTE9Q0hLSjIwMDRXOiBUaGUgezB9IGJlYW4gY2xhc3Mgc2hvdWxkIG5vdCBpbXBsZW1lbnQgYW4gZWpiRmluZCBtZXRob2QuIChFSkIgMS4xOiA5LjQuNikKLUNIS0oyMDA1LmVoLmkuZWpiMTE9Q0hLSjIwMDVFOiB7MH0gbXVzdCBiZSBlaXRoZXIgYSBjcmVhdGUgbWV0aG9kIG9yIGEgZmluZCBtZXRob2QuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDA1LmVoLm0uZWpiMTE9Q0hLSjIwMDVFOiBUaGUgbWV0aG9kIG11c3QgYmUgZWl0aGVyIGEgY3JlYXRlIG1ldGhvZCBvciBhIGZpbmQgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAwNi5zYi5lamIxMT1DSEtKMjAwNkU6IFRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIChFSkIgMS4xOiA2LjEwLjIpCi1DSEtKMjAwNi5lYi5lamIxMT1DSEtKMjAwNkU6IFRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuIChFSkIgMS4xOiA5LjIuMikKLUNIS0oyMDA3LnNiLmVqYjExPUNIS0oyMDA3VzogezB9IHNob3VsZCBub3QgZGVjbGFyZSB0aGUgZmluYWxpemUoKSBtZXRob2QuIChFSkIgMS4xOiA2LjEwLjIpCi1DSEtKMjAwNy5lYi5lamIxMT1DSEtKMjAwN1c6IHswfSBzaG91bGQgbm90IGRlY2xhcmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjIpCi1DSEtKMjAwOC5zYi5lamIxMT1DSEtKMjAwOEU6IFRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVqYkNyZWF0ZSBtZXRob2QuIChFSkIgMS4xOiA2LjUuNSwgNi4xMC4zKQotQ0hLSjIwMDkuZWIuZWpiMTE9Q0hLSjIwMDlFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gKEVKQiAxLjE6IDkuMi41KQotQ0hLSjIwMTAuc2guZWpiMTE9Q0hLSjIwMTBFOiBUaGUgezB9IGhvbWUgaW50ZXJmYWNlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY3JlYXRlIG1ldGhvZC4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyMDExLmVoLmVqYjExPUNIS0oyMDExRTogVGhlIHswfSBob21lIGludGVyZmFjZSBtdXN0IGNvbnRhaW4gb25lIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAxMi5zci5lamIxMT1DSEtKMjAxMkU6IFRoaXMgdHlwZSBtdXN0IGJlIGFuIGludGVyZmFjZS4gKEVKQiAxLjE6IDYuMTAuNSkuCi1DSEtKMjAxMi5zaC5lamIxMT1DSEtKMjAxMkU6IFRoaXMgdHlwZSBtdXN0IGJlIGFuIGludGVyZmFjZS4gKEVKQiAxLjE6IDYuMTAuNikuCi1DSEtKMjAxMi5lci5lamIxMT1DSEtKMjAxMkU6IFRoaXMgdHlwZSBtdXN0IGJlIGFuIGludGVyZmFjZS4gKEVKQiAxLjE6IDkuMi43KS4KLUNIS0oyMDEyLmVoLmVqYjExPUNIS0oyMDEyRTogVGhpcyB0eXBlIG11c3QgYmUgYW4gaW50ZXJmYWNlLiAoRUpCIDEuMTogOS4yLjgpLgotQ0hLSjIwMTMuc2IuZWpiMTE9Q0hLSjIwMTNFOiBUaGUgezB9IGJlYW4gY2xhc3MgbXVzdCBpbXBsZW1lbnQgezF9LiAoRUpCIDEuMTogNi4xMC4yKS4KLUNIS0oyMDEzLmViLmVqYjExPUNIS0oyMDEzRTogVGhlIHswfSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IHsxfS4gKEVKQiAxLjE6IDkuMi4yKS4KLUNIS0oyMDE0LnNiLmVqYjExPUNIS0oyMDE0RTogVGhlIHswfSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBhYnN0cmFjdC4gKEVKQiAxLjE6IDYuMTAuMikKLUNIS0oyMDE0LmViLmVqYjExPUNIS0oyMDE0RTogVGhlIHswfSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBhYnN0cmFjdC4gKEVKQiAxLjE6IDkuMi4yKQotQ0hLSjIwMTUuc2IuZWpiMTE9Q0hLSjIwMTVFOiBUaGUgezB9IGJlYW4gY2xhc3MgY2Fubm90IGJlIGZpbmFsLiAoRUpCIDEuMTogNi4xMC4yKQotQ0hLSjIwMTUuZWIuZWpiMTE9Q0hLSjIwMTVFOiBUaGUgezB9IGJlYW4gY2xhc3MgY2Fubm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjIpCi1DSEtKMjAxNy5zci5lamIxMT1DSEtKMjAxN0U6IEludGVyZmFjZSBtdXN0IGV4dGVuZCB7MH0uIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjAxNy5zaC5lamIxMT1DSEtKMjAxN0U6IEludGVyZmFjZSBtdXN0IGV4dGVuZCB7MH0uIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjAxNy5lci5lamIxMT1DSEtKMjAxN0U6IEludGVyZmFjZSBtdXN0IGV4dGVuZCB7MH0uIChFSkIgMS4xOiA5LjIuNykKLUNIS0oyMDE3LmVoLmVqYjExPUNIS0oyMDE3RTogSW50ZXJmYWNlIG11c3QgZXh0ZW5kIHswfS4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMTkuZWIuZWpiMTE9Q0hLSjIwMTlJOiBUaGUgezB9IGtleSBjbGFzcyBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogOS4yLjkpIChSTUkgMS4zOiAyLjYpLgotCi0KLUNIS0oyMDIwLmViLmVqYjExPUNIS0oyMDIwRTogVGhlIHswfSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjQuNy4yKQotQ0hLSjIwMjEuZWIuZWpiMTE9Q0hLSjIwMjFFOiBUaGUgezB9IGtleSBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAoRUpCIDEuMTogOS40LjcuMikKLUNIS0oyMDIyLnNiLmVqYjExPUNIS0oyMDIyRTogezB9IGJlYW4gY2xhc3MgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA2LjEwLjIpCi1DSEtKMjAyMi5lYi5lamIxMT1DSEtKMjAyMkU6IHswfSBiZWFuIGNsYXNzIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjIpCi1DSEtKMjAyMy5zci5pLmVqYjExPUNIS0oyMDIzRTogezB9IG11c3QgaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjAyMy5zci5tLmVqYjExPUNIS0oyMDIzRTogVGhpcyBtZXRob2QgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MH0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDYuMTAuNSkKLUNIS0oyMDIzLmVyLmkuZWpiMTE9Q0hLSjIwMjNFOiB7MH0gbXVzdCBoYXZlIGEgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MX0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi43KQotQ0hLSjIwMjMuZXIubS5lamIxMT1DSEtKMjAyM0U6IFRoaXMgbWV0aG9kIG11c3QgaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezB9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuNykKLUNIS0oyMDI0LnNoLmkuZWpiMTE9Q0hLSjIwMjRFOiB7MH0gbXVzdCBub3QgZXhpc3QuIE9ubHkgY3JlYXRlKCkgbWF5IGV4aXN0IChFSkIgMS4xOiA2LjgpLgotQ0hLSjIwMjQuc2gubS5lamIxMT1DSEtKMjAyNEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0LiBPbmx5IGNyZWF0ZSgpIG1heSBleGlzdCAoRUpCIDEuMTogNi44KS4KLUNIS0oyMDI1LnNiLmkuZWpiMTE9Q0hLSjIwMjVFOiB7MH0gbXVzdCBub3QgZXhpc3QuIE9ubHkgZWpiQ3JlYXRlKCkgbWF5IGV4aXN0IChFSkIgMS4xOiA2LjgpLgotQ0hLSjIwMjUuc2IubS5lamIxMT1DSEtKMjAyNUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0LiBPbmx5IGVqYkNyZWF0ZSgpIG1heSBleGlzdCAoRUpCIDEuMTogNi44KS4KLUNIS0oyMDI2LnNoLmkuZWpiMTE9Q0hLSjIwMjZFOiBCZWFuIGNsYXNzIHsxfSBtdXN0IGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgZm9yIHswfS4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyMDI2LnNoLm0uZWpiMTE9Q0hLSjIwMjZFOiBCZWFuIGNsYXNzIHswfSBtdXN0IGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgZm9yIHRoaXMgbWV0aG9kLiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjIwMjYuZWguaS5lamIxMT1DSEtKMjAyNkU6IEJlYW4gY2xhc3MgezF9IG11c3QgaW1wbGVtZW50IGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBmb3IgezB9LiAoRUpCIDEuMTogOS4yLjgpCi1DSEtKMjAyNi5laC5tLmVqYjExPUNIS0oyMDI2RTogQmVhbiBjbGFzcyB7MH0gbXVzdCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGZvciB0aGlzIG1ldGhvZC4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjIwMjguZWIuaS5lamIxMT1DSEtKMjAyOFc6IHswfSB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBpcyBkZWZpbmVkLiAoRUpCIDEuMTogOS4xLjUuMSkKLUNIS0oyMDI4LmViLm0uZWpiMTE9Q0hLSjIwMjhXOiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZCBpcyBkZWZpbmVkLiAoRUpCIDEuMTogOS4xLjUuMSkKLUNIS0oyMDI5LmViLmkuZWpiMTE9Q0hLSjIwMjlXOiB7MH0gY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9uIHRoZSBob21lIGludGVyZmFjZSB7MX0uIChFSkIgMS4xOiA5LjIuMykKLUNIS0oyMDI5LmViLm0uZWpiMTE9Q0hLSjIwMjlXOiBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGhvbWUgaW50ZXJmYWNlIHswfS4gKEVKQiAxLjE6IDkuMi4zKQotQ0hLSjIwMzAuZWguaS5lamIxMT1DSEtKMjAzMEU6IHswfSBtdXN0IGhhdmUgYSBtYXRjaGluZyBlamJGaW5kIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDMwLmVoLm0uZWpiMTE9Q0hLSjIwMzBFOiBUaGlzIG1ldGhvZCBtdXN0IGhhdmUgYSBtYXRjaGluZyBlamJGaW5kIG1ldGhvZCBpbiB0aGUgezB9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyMDMyLmViLmVqYjExPUNIS0oyMDMyVzogQmVhbiBjbGFzcyB7MH0gbXVzdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4gKEVKQiAxLjE6IDkuNC43KQotQ0hLSjIwMzMuZWIuZWpiMTE9Q0hLSjIwMzNXOiBUaGUgc2V0RW50aXR5Q29udGV4dChFbnRpdHlDb250ZXh0IGljKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzNC5lYi5lamIxMT1DSEtKMjAzNFc6IFRoZSB1bnNldEVudGl0eUNvbnRleHQoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzNS5lYi5lamIxMT1DSEtKMjAzNVc6IFRoZSBlamJBY3RpdmF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0LiAoRUpCIDEuMTogOS4xLjUuMSkKLUNIS0oyMDM2LmViLmVqYjExPUNIS0oyMDM2VzogVGhlIGVqYlBhc3NpdmF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0LiAoRUpCIDEuMTogOS4xLjUuMSkKLUNIS0oyMDM3LmViLmVqYjExPUNIS0oyMDM3VzogVGhlIGVqYlJlbW92ZSgpIG1ldGhvZCBtdXN0IGV4aXN0LiAoRUpCIDEuMTogOS4xLjUuMSkKLUNIS0oyMDM4LmViLmVqYjExPUNIS0oyMDM4VzogVGhlIGVqYkxvYWQoKSBtZXRob2QgbXVzdCBleGlzdC4gKEVKQiAxLjE6IDkuMS41LjEpCi1DSEtKMjAzOS5lYi5lamIxMT1DSEtKMjAzOVc6IFRoZSBlamJTdG9yZSgpIG1ldGhvZCBtdXN0IGV4aXN0LiAoRUpCIDEuMTogOS4xLjUuMSkKLQotQ0hLSjIwNDAuc2IuZWpiMTE9Q0hLSjIwNDBJOiAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdC4gKEVKQiAxLjE6IDYuMTAuMikKLQotQ0hLSjIxMDAuZWpiMTE9Q0hLSjIxMDBFOiBCb3RoIGVuZHMgb2YgdGhlIHJvbGUgbXVzdCB1c2UgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuCi1DSEtKMjEwMS5lamIxMT1DSEtKMjEwMUU6IEJvdGggZW5kcyBvZiB0aGUgcm9sZSBtdXN0IHVzZSB0aGUgc2FtZSB0eXBlLgotQ0hLSjIxMDIuZWguZWpiMTE9Q0hLSjIxMDJFOiBFaXRoZXIgYSBmaW5kZXIgZGVzY3JpcHRvciwgb3IgYSBtYXRjaGluZyBjdXN0b20gZmluZGVyIG1ldGhvZCBvbiB0aGUgezB9IGNsYXNzLCBtdXN0IGJlIGRlZmluZWQuCi1DSEtKMjEwMy5lamIxMT1DSEtKMjEwM0U6IEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIHswfSBiZWFuIGNsYXNzIG11c3QgaW5oZXJpdCB7MX0uIChFSkIgMS4xOiBCLjIpCi1DSEtKMjEwNC5lamIxMT1DSEtKMjEwNEU6IEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIHswfSBob21lIGludGVyZmFjZSBtdXN0IG5vdCBpbmhlcml0IHsxfS4gKEVKQiAxLjE6IEIuMikKLUNIS0oyMTA1LmVqYjExPUNIS0oyMTA1RTogSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgezB9IHJlbW90ZSBpbnRlcmZhY2UgbXVzdCBpbmhlcml0IHsxfS4gKEVKQiAxLjE6IEIuMikKLUNIS0oyMTA2LmVqYjExPUNIS0oyMTA2RTogQmVhbiB7MH0gbXVzdCB1c2UgezF9IGFzIGl0cyA8cHJpbS1rZXktY2xhc3M+IChFSkIgMS4xOiBCLjIpLgotCi1DSEtKMjIwMC5pLmVqYjExPUNIS0oyMjAwVzogVGhlIHswfSBzdGF0aWMgZmllbGQgc2hvdWxkIGJlIGZpbmFsLiAoRUpCIDEuMTogMTguMS4yKQotQ0hLSjIyMDAubS5lamIxMT1DSEtKMjIwMFc6IFRoaXMgc3RhdGljIGZpZWxkIHNob3VsZCBiZSBmaW5hbC4gKEVKQiAxLjE6IDE4LjEuMikKLUNIS0oyMjAxLmViLmkuZWpiMTE9Q0hLSjIyMDFFOiB7MH0gbXVzdCBub3QgYmUgdHJhbnNpZW50LiAoRUpCIDEuMTogOS40LjEpCi1DSEtKMjIwMS5lYi5tLmVqYjExPUNIS0oyMjAxRTogVGhlIGZpZWxkIG11c3Qgbm90IGJlIHRyYW5zaWVudC4gKEVKQiAxLjE6IDkuNC4xKQotQ0hLSjIyMDIuZWIuaS5lamIxMT1DSEtKMjIwMlc6IFRoZSBmaWVsZCB0eXBlIG9mIGZpZWxkIHswfSBpcyBpbnZhbGlkIGZvciBhIENNUCBiZWFuLiAoRUpCIDEuMTogOS40LjEpCi1DSEtKMjIwMi5lYi5tLmVqYjExPUNIS0oyMjAyVzogVGhlIGZpZWxkIHR5cGUgaXMgaW52YWxpZCBmb3IgYSBDTVAgYmVhbi4gKEVKQiAxLjE6IDkuNC4xKQotQ0hLSjIyMDMuZWIuaS5lamIxMT1DSEtKMjIwM0U6IHswfSBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuNC4xKQotQ0hLSjIyMDMuZWIubS5lamIxMT1DSEtKMjIwM0U6IFRoZSBmaWVsZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuNC4xKQotQ0hLSjIyMDUuZWIuaS5lamIxMT1DSEtKMjIwNVc6IFRoZSBwcmltYXJ5IGtleSBmaWVsZCBuYW1lZCB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjQuNy4yKQotQ0hLSjIyMDUuZWIubS5lamIxMT1DSEtKMjIwNVc6IFRoZSBwcmltYXJ5IGtleSBmaWVsZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuNC43LjIpCi1DSEtKMjIwNi5lYi5pLmVqYjExPUNIS0oyMjA2VzogezB9IG11c3QgYmUgYSA8Y21wLWZpZWxkPiBvZiB7MX0gYW5kIGEgZmllbGQgb2YgYmVhbiBjbGFzcyB7Mn0uIChFSkIgMS4xOiA5LjQuNy4yKS4KLUNIS0oyMjA2LmViLm0uZWpiMTE9Q0hLSjIyMDZXOiBUaGlzIGZpZWxkIG11c3QgYmUgYSA8Y21wLWZpZWxkPiBvZiB7MH0gYW5kIGEgZmllbGQgb2YgYmVhbiBjbGFzcyB7MX0uIChFSkIgMS4xOiA5LjQuNy4yKS4KLUNIS0oyMjA3LmViLmVqYjExPUNIS0oyMjA3RTogS2V5IGZpZWxkIHswfSBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHByaW1hcnkga2V5LCB7MX0uIChFSkIgMS4xOiA5LjQuNy4xKS4KLQotQ0hLSjI0MDAuZWpiQ3JlYXRlLnNiLmkuZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiBvbiBtZXRob2QgezB9LiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDAwLmVqYkNyZWF0ZS5zYi5tLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MDAuYnVzLnNiLmkuZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiBvbiBtZXRob2QgezB9LiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDAwLmJ1cy5zYi5tLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MDAuZWpiQ3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiBvbiB7MH0uIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQwMC5lamJDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwMFc6IERlcHJlY2F0ZWQgdXNlIG9mIGEgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDAuZWpiUG9zdENyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gezB9LiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDAuZWpiUG9zdENyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQwMC5lamJGaW5kLmViLmkuZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiBvbiB7MH0uIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwMC5lamJGaW5kLmViLm0uZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDAwLmJ1cy5lYi5pLmVqYjExPUNIS0oyNDAwVzogRGVwcmVjYXRlZCB1c2Ugb2YgYSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gb24gezB9LiAoRUpCIDEuMTogOS4yLjYpLgotQ0hLSjI0MDAuYnVzLmViLm0uZWpiMTE9Q0hLSjI0MDBXOiBEZXByZWNhdGVkIHVzZSBvZiBhIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gKEVKQiAxLjE6IDkuMi42KS4KLQotQ0hLSjI0MDEuc2IuaS5lamIxMT1DSEtKMjQwMUU6IHswfSBtdXN0IHJldHVybiB2b2lkLiAoRUpCIDEuMTogNi4xMC4zKQotQ0hLSjI0MDEuc2IubS5lamIxMT1DSEtKMjQwMUU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQuIChFSkIgMS4xOiA2LjEwLjMpCi1DSEtKMjQwMi5zaC5pLmVqYjExPUNIS0oyNDAyVzogezB9IG11c3QgcmV0dXJuIHRoZSB7MX0gcmVtb3RlIGludGVyZmFjZSB0eXBlLiAgKEVKQiAxLjE6IDYuMTAuNikuCi1DSEtKMjQwMi5zaC5tLmVqYjExPUNIS0oyNDAyVzogVGhpcyBjcmVhdGUgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSB7MH0gcmVtb3RlIGludGVyZmFjZSB0eXBlLiAgKEVKQiAxLjE6IDYuMTAuNikuCi1DSEtKMjQwMi5laC5pLmVqYjExPUNIS0oyNDAyVzogezB9IG11c3QgcmV0dXJuIHRoZSB7MX0gcmVtb3RlIGludGVyZmFjZSB0eXBlLiAgKEVKQiAxLjE6IDkuMi44KS4KLUNIS0oyNDAyLmVoLm0uZWpiMTE9Q0hLSjI0MDJXOiBUaGlzIGNyZWF0ZSBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHswfSByZW1vdGUgaW50ZXJmYWNlIHR5cGUuICAoRUpCIDEuMTogOS4yLjgpLgotQ0hLSjI0MDMuZWguaS5lamIxMT1DSEtKMjQwM1c6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YuIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyNDAzLmVoLm0uZWpiMTE9Q0hLSjI0MDNXOiBUaGUgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZi4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjI0MDUuZWguaS5lamIxMT1DSEtKMjQwNVc6IFRoZSBvcmRlciBhbmQgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyBpbiB7MH0gbXVzdCBtYXRjaCB0aGUgb3JkZXIgYW5kIHR5cGVzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHsxfSBrZXkgY2xhc3MuIChFSkIgMS4xOiA5LjIuOCwgOS40LjcuMywgMTYuNSkKLUNIS0oyNDA1LmVoLm0uZWpiMTE9Q0hLSjI0MDVXOiBUaGUgb3JkZXIgYW5kIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgbXVzdCBtYXRjaCB0aGUgb3JkZXIgYW5kIHR5cGVzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHswfSBrZXkgY2xhc3MuIChFSkIgMS4xOiA5LjIuOCwgOS40LjcuMywgMTYuNSkKLUNIS0oyNDA2LmViLmkuZWpiMTE9Q0hLSjI0MDZXOiB7MH0gc2hvdWxkIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgdHlwZSB7MX0uIChFSkIgMS4xOiA5LjIuMywgOS40LjIsIDkuNC43LjMpLgotQ0hLSjI0MDYuZWIubS5lamIxMT1DSEtKMjQwNlc6IFRoZSBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgdHlwZSB7MH0uIChFSkIgMS4xOiA5LjIuMywgOS40LjIsIDkuNC43LjMpLgotQ0hLSjI0MDcuZWIuaS5lamIxMT1DSEtKMjQwN1c6IHswfSBzaG91bGQgcmV0dXJuIGVpdGhlciB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YuICAoRUpCIDEuMTogOS4yLjUpCi1DSEtKMjQwNy5lYi5tLmVqYjExPUNIS0oyNDA3VzogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBlaXRoZXIgezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAgKEVKQiAxLjE6IDkuMi41KQotCi1DSEtKMjQwOC5lamJDcmVhdGUuc2IuaS5lamIxMT1DSEtKMjQwOEU6IHswfSBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQwOC5lamJDcmVhdGUuc2IubS5lamIxMT1DSEtKMjQwOEU6IFRoZSBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA2LjEwLjMpLgotQ0hLSjI0MDguYnVzLnNiLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MDguYnVzLnNiLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQwOC5lamJDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQwOEU6IHswfSBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDA4LmVqYkNyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDA4RTogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQwOC5lamJQb3N0Q3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQwOC5lamJQb3N0Q3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MDhFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi40KS4KLUNIS0oyNDA4LmVqYkZpbmQuZWIuaS5lamIxMT1DSEtKMjQwOEU6IHswfSBtdXN0IGJlIHB1YmxpYy4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDA4LmVqYkZpbmQuZWIubS5lamIxMT1DSEtKMjQwOEU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MDguYnVzLmViLmkuZWpiMTE9Q0hLSjI0MDhFOiB7MH0gbXVzdCBiZSBwdWJsaWMuIChFSkIgMS4xOiA5LjIuNikuCi1DSEtKMjQwOC5idXMuZWIubS5lamIxMT1DSEtKMjQwOEU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAoRUpCIDEuMTogOS4yLjYpLgotCi1DSEtKMjQwOS5lamJDcmVhdGUuc2IuaS5lamIxMT1DSEtKMjQwOUU6IHswfSBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDYuMTAuMykuCi1DSEtKMjQwOS5lamJDcmVhdGUuc2IubS5lamIxMT1DSEtKMjQwOUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDA5LmJ1cy5zYi5pLmVqYjExPUNIS0oyNDA5RTogezB9IG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogNi4xMC40KS4KLUNIS0oyNDA5LmJ1cy5zYi5tLmVqYjExPUNIS0oyNDA5RTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA2LjEwLjQpLgotQ0hLSjI0MDkuZWpiQ3JlYXRlLmViLmkuZWpiMTE9Q0hLSjI0MDlFOiB7MH0gbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQwOS5lamJDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQwOUU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjMpLgotQ0hLSjI0MDkuZWpiUG9zdENyZWF0ZS5lYi5pLmVqYjExPUNIS0oyNDA5RTogezB9IG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjQpLgotQ0hLSjI0MDkuZWpiUG9zdENyZWF0ZS5lYi5tLmVqYjExPUNIS0oyNDA5RTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQwOS5lamJGaW5kLmViLmkuZWpiMTE9Q0hLSjI0MDlFOiB7MH0gbXVzdCBub3QgYmUgZmluYWwuIChFSkIgMS4xOiA5LjIuNSkuCi1DSEtKMjQwOS5lamJGaW5kLmViLm0uZWpiMTE9Q0hLSjI0MDlFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi41KS4KLUNIS0oyNDA5LmJ1cy5lYi5pLmVqYjExPUNIS0oyNDA5RTogezB9IG11c3Qgbm90IGJlIGZpbmFsLiAoRUpCIDEuMTogOS4yLjYpLgotQ0hLSjI0MDkuYnVzLmViLm0uZWpiMTE9Q0hLSjI0MDlFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gKEVKQiAxLjE6IDkuMi42KS4KLQotQ0hLSjI0MTAuZWpiQ3JlYXRlLnNiLmkuZWpiMTE9Q0hLSjI0MTBFOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDEwLmVqYkNyZWF0ZS5zYi5tLmVqYjExPUNIS0oyNDEwRTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogNi4xMC4zKS4KLUNIS0oyNDEwLmJ1cy5zYi5pLmVqYjExPUNIS0oyNDEwRTogezB9IG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQxMC5idXMuc2IubS5lamIxMT1DSEtKMjQxMEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDYuMTAuNCkuCi1DSEtKMjQxMC5lamJDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQxMEU6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuMykuCi1DSEtKMjQxMC5lamJDcmVhdGUuZWIubS5lamIxMT1DSEtKMjQxMEU6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gKEVKQiAxLjE6IDkuMi4zKS4KLUNIS0oyNDEwLmVqYlBvc3RDcmVhdGUuZWIuaS5lamIxMT1DSEtKMjQxMEU6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQxMC5lamJQb3N0Q3JlYXRlLmViLm0uZWpiMTE9Q0hLSjI0MTBFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuNCkuCi1DSEtKMjQxMC5lamJGaW5kLmViLmkuZWpiMTE9Q0hLSjI0MTBFOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MTAuZWpiRmluZC5lYi5tLmVqYjExPUNIS0oyNDEwRTogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjUpLgotQ0hLSjI0MTAuYnVzLmViLmkuZWpiMTE9Q0hLSjI0MTBFOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljLiAoRUpCIDEuMTogOS4yLjYpLgotQ0hLSjI0MTAuYnVzLmViLm0uZWpiMTE9Q0hLSjI0MTBFOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIChFSkIgMS4xOiA5LjIuNikuCi0KLUNIS0oyNDExLnNiLmkuZWpiMTE9Q0hLSjI0MTFFOiBUaGUgbmFtZSBvZiB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIi4gKEVKQiAxLjE6IDYuMTAuNCkKLUNIS0oyNDExLnNiLm0uZWpiMTE9Q0hLSjI0MTFFOiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIChFSkIgMS4xOiA2LjEwLjQpCi1DSEtKMjQxMS5lYi5pLmVqYjExPUNIS0oyNDExRTogVGhlIG5hbWUgb2YgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIChFSkIgMS4xOiA5LjIuNikKLUNIS0oyNDExLmViLm0uZWpiMTE9Q0hLSjI0MTFFOiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIChFSkIgMS4xOiA5LjIuNikKLQotQ0hLSjI0MTIuc2IuaS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA2LjEwKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLnNiLm0uZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA2LjEwKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLmViLmkuZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogOS4yKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLmViLm0uZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA5LjIpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuc3IuaS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA2LjEwLjUpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuc3IubS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDYuMTAuNSkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5lci5pLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDkuMi43KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLmVyLm0uZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gIChFSkIgMS4xOiA5LjIuNykgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5zaC5pLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDYuMTAuNikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMi5zaC5tLmVqYjExPUNIS0oyNDEySTogVGhlIHJldHVybiB0eXBlIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogNi4xMC42KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEyLmVoLmkuZWpiMTE9Q0hLSjI0MTJJOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuICAoRUpCIDEuMTogOS4yLjgpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTIuZWgubS5lamIxMT1DSEtKMjQxMkk6IFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAgKEVKQiAxLjE6IDkuMi44KSAoUk1JIDEuMzogMi42KS4KLQotQ0hLSjI0MTMuc2IuaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDYuMTApIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuc2IubS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogNi4xMCkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5lYi5pLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezF9IG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogOS4yKSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLmViLm0uZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5zci5pLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezF9IG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogNi4xMC41KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLnNyLm0uZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDYuMTAuNSkgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5lci5pLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezF9IG9mIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogOS4yLjcpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuZXIubS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAoRUpCIDEuMTogOS4yLjcpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuc2guaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDYuMTAuNikgKFJNSSAxLjM6IDIuNikuCi1DSEtKMjQxMy5zaC5tLmVqYjExPUNIS0oyNDEzSTogQXJndW1lbnQgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIChFSkIgMS4xOiA2LjEwLjYpIChSTUkgMS4zOiAyLjYpLgotQ0hLSjI0MTMuZWguaS5lamIxMT1DSEtKMjQxM0k6IEFyZ3VtZW50IHsxfSBvZiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMi44KSAoUk1JIDEuMzogMi42KS4KLUNIS0oyNDEzLmVoLm0uZWpiMTE9Q0hLSjI0MTNJOiBBcmd1bWVudCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gKEVKQiAxLjE6IDkuMi44KSAoUk1JIDEuMzogMi42KS4KLQotQ0hLSjI0MTQuc2guaS5lamIxMT1DSEtKMjQxNEU6IHswfSBtdXN0IHRocm93IHsxfS4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyNDE0LnNoLm0uZWpiMTE9Q0hLSjI0MTRFOiBUaGUgbWV0aG9kIG11c3QgdGhyb3cgezB9LiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjI0MTQuZWguaS5lamIxMT1DSEtKMjQxNEU6IHswfSBtdXN0IHRocm93IHsxfS4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjI0MTQuZWgubS5lamIxMT1DSEtKMjQxNEU6IFRoZSBtZXRob2QgbXVzdCB0aHJvdyB7MH0uIChFSkIgMS4xOiA5LjIuOCkKLUNIS0oyNDE0LnNyLmkuZWpiMTE9Q0hLSjI0MTRFOiB7MH0gbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA2LjEwLjUpCi1DSEtKMjQxNC5zci5tLmVqYjExPUNIS0oyNDE0RTogVGhlIG1ldGhvZCBtdXN0IHRocm93IHswfS4gKEVKQiAxLjE6IDYuMTAuNSkKLUNIS0oyNDE0LmVyLmkuZWpiMTE9Q0hLSjI0MTRFOiB7MH0gbXVzdCB0aHJvdyB7MX0uIChFSkIgMS4xOiA5LjIuNykKLUNIS0oyNDE0LmVyLm0uZWpiMTE9Q0hLSjI0MTRFOiBUaGUgbWV0aG9kIG11c3QgdGhyb3cgezB9LiAoRUpCIDEuMTogOS4yLjcpCi0KLUNIS0oyNDE1LnNyLmkuZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MX0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsyfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogNi4xMC41KQotQ0hLSjI0MTUuc3IubS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezB9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MX0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDYuMTAuNSkKLUNIS0oyNDE1LmVyLmkuZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgb2YgezB9IG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MX0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsyfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjQxNS5lci5tLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCB7MH0sIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgaW4gdGhlIHsxfSBiZWFuIGNsYXNzLiAoRUpCIDEuMTogOS4yLjcpCi1DSEtKMjQxNS5zaC5pLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezF9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7Mn0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDYuMTAuNikKLUNIS0oyNDE1LnNoLm0uZWpiMTE9Q0hLSjI0MTVFOiBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsIHswfSwgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCBpbiB0aGUgezF9IGJlYW4gY2xhc3MuIChFSkIgMS4xOiA2LjEwLjYpCi1DSEtKMjQxNS5laC5pLmVqYjExPUNIS0oyNDE1RTogVGhlIHJldHVybiB0eXBlIG9mIHswfSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezF9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7Mn0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi44KQotQ0hLSjI0MTUuZWgubS5lamIxMT1DSEtKMjQxNUU6IFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgezB9LCBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIGluIHRoZSB7MX0gYmVhbiBjbGFzcy4gKEVKQiAxLjE6IDkuMi44KQotCi1DSEtKMjQxOC5lYi5pLmVqYjExPUNIS0oyNDE4RTogezB9IG11c3QgcmV0dXJuIHZvaWQuIChFSkIgMS4xOiA5LjIuNCkKLUNIS0oyNDE4LmViLm0uZWpiMTE9Q0hLSjI0MThFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiAoRUpCIDEuMTogOS4yLjQpCi1DSEtKMjQxOS5zaC5pLmVqYjExPUNIS0oyNDE5RTogezB9IG11c3QgYmUgYSBjcmVhdGUgbWV0aG9kLiAoRUpCIDEuMTogNi4xMC42KQotQ0hLSjI0MTkuc2gubS5lamIxMT1DSEtKMjQxOUU6IFRoaXMgbWV0aG9kIG11c3QgYmUgYSBjcmVhdGUgbWV0aG9kLiAoRUpCIDEuMTogNi4xMC42KQotCi1DSEtKMjQyMC5zYi5pLmVqYjExPUNIS0oyNDIwRTogezF9IG11c3QgYmUgdGhyb3duIGJ5IHswfScncyBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgezJ9IGhvbWUgaW50ZXJmYWNlLiAoRUpCIDEuMTogNi4xMC42LCAxMi4yLjEsIDEyLjIuMikKLUNIS0oyNDIwLnNiLm0uZWpiMTE9Q0hLSjI0MjBFOiB7MH0gbXVzdCBiZSB0aHJvd24gYnkgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7MX0gaG9tZSBpbnRlcmZhY2UuIChFSkIgMS4xOiA2LjEwLjYsIDEyLjIuMSwgMTIuMi4yKQotQ0hLSjI0MjAuZWIuaS5lamIxMT1DSEtKMjQyMEU6IHsxfSBtdXN0IGJlIHRocm93biBieSB7MH0nJ3MgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHsyfSBob21lIGludGVyZmFjZS4gKEVKQiAxLjE6IDkuMi44LCAxMi4yLjEsIDEyLjIuMikKLUNIS0oyNDIwLmViLm0uZWpiMTE9Q0hLSjI0MjBFOiB7MH0gbXVzdCBiZSB0aHJvd24gYnkgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7MX0gaG9tZSBpbnRlcmZhY2UuIChFSkIgMS4xOiA5LjIuOCwgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQzMi5zYi5pLmVqYjExPUNIS0oyNDMyRTogezB9JydzIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7MX0gcmVtb3RlIGludGVyZmFjZSBtdXN0IHRocm93IHsyfS4gKEVKQiAxLjE6IDYuMTAuNSwgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQzMi5zYi5tLmVqYjExPUNIS0oyNDMyRTogVGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7MH0gcmVtb3RlIGludGVyZmFjZSBtdXN0IHRocm93IHsxfS4gKEVKQiAxLjE6IDYuMTAuNSwgMTIuMi4xLCAxMi4yLjIpCi1DSEtKMjQzMi5lYi5pLmVqYjExPUNIS0oyNDMyRTogezB9JydzIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG9uIHRoZSB7MX0gcmVtb3RlIGludGVyZmFjZSBtdXN0IHRocm93IHsyfS4gKEVKQiAxLjE6IDkuMi43LCAxMi4yLjEsIDEyLjIuMikKLUNIS0oyNDMyLmViLm0uZWpiMTE9Q0hLSjI0MzJFOiBUaGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHswfSByZW1vdGUgaW50ZXJmYWNlIG11c3QgdGhyb3cgezF9LiAoRUpCIDEuMTogOS4yLjcsIDEyLjIuMSwgMTIuMi4yKQotCi1DSEtKMjgwMS5lamIxMT1DSEtKMjgwMUU6IFRoZSB2YWx1ZSBvZiB0aGUgPGVqYi1uYW1lPiBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkLiAoRUpCIDEuMTogMTYuMiwgMTYuNSkKLUNIS0oyODAyLm5hbWVkLmVqYjExPUNIS0oyODAyRTogPGVqYi1jbGFzcz4gY2xhc3MgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwMi51bm5hbWVkLmVqYjExPUNIS0oyODAyRTogVW5rbm93biBjbGFzcyBzcGVjaWZpZWQgaW4gdGhlIDxlamItY2xhc3M+IGVsZW1lbnQuIChFSkIgMS4xOiAxNi4yLCAxNi41KS4KLUNIS0oyODAzLm5hbWVkLmVqYjExPUNIS0oyODAzRTogPGhvbWU+IGludGVyZmFjZSB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODAzLnVubmFtZWQuZWpiMTE9Q0hLSjI4MDNFOiBVbmtub3duIGludGVyZmFjZSBzcGVjaWZpZWQgaW4gdGhlIDxob21lPiBlbGVtZW50LiAoRUpCIDEuMTogMTYuMiwgMTYuNSkuCi1DSEtKMjgwNC5uYW1lZC5lamIxMT1DSEtKMjgwNEU6IDxyZW1vdGU+IGludGVyZmFjZSB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODA0LnVubmFtZWQuZWpiMTE9Q0hLSjI4MDRFOiBVbmtub3duIGludGVyZmFjZSBzcGVjaWZpZWQgaW4gdGhlIDxyZW1vdGU+IGVsZW1lbnQuIChFSkIgMS4xOiAxNi4yLCAxNi41KS4KLUNIS0oyODA2LmVqYjExPUNIS0oyODA2RTogVGhlIHZhbHVlIG9mIHRoZSA8cmVlbnRyYW50PiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJUcnVlIiBvciAiRmFsc2UiLiAoRUpCIDEuMTogMTYuMiwgMTYuNSkKLUNIS0oyODA3LmVqYjExPUNIS0oyODA3RTogVGhlIHZhbHVlIG9mIHRoZSA8c2Vzc2lvbi10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJTdGF0ZWZ1bCIgb3IgIlN0YXRlbGVzcyIuIChFSkIgMS4xOiAxNi4yLCAxNi41KQotQ0hLSjI4MDguZWpiMTE9Q0hLSjI4MDhFOiBUaGUgdmFsdWUgb2YgdGhlIDx0cmFuc2FjdGlvbi10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJDb250YWluZXIiIG9yICJCZWFuIi4gKEVKQiAxLjE6IDExLjMuNSwgMTYuMiwsIDE2LjUpCi1DSEtKMjgwOS5lamIxMT1DSEtKMjgwOUU6IFRoZSB2YWx1ZSBvZiB0aGUgPHBlcnNpc3RlbmNlLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIkNvbnRhaW5lciIgb3IgIkJlYW4iLiAgKEVKQiAxLjE6IDE2LjIsIDE2LjUpCi1DSEtKMjgxMC5uYW1lZC5lamIxMT1DSEtKMjgxMEU6IDxwcmltLWtleS1jbGFzcz4gY2xhc3MgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgxMC51bm5hbWVkLmVqYjExPUNIS0oyODEwRTogVW5rbm93biBjbGFzcyBzcGVjaWZpZWQgaW4gdGhlIDxwcmltLWtleS1jbGFzcz4gZWxlbWVudC4gIChFSkIgMS4xOiAxNi4yLCAxNi41KS4KLUNIS0oyODExLm5hbWVkLmVqYjExPUNIS0oyODExRTogPGZpZWxkLW5hbWU+IHswfSBjYW5ub3QgYmUgbG9jYXRlZCBvbiBiZWFuIGNsYXNzIHsxfS4gKEVKQiAxLjE6IDE2LjUpLgotQ0hLSjI4MTEudW5uYW1lZC5lamIxMT1DSEtKMjgxMUU6IDxjbXAtZmllbGQ+IG11c3Qgc3BlY2lmeSBhIDxmaWVsZC1uYW1lPi4gKEVKQiAxLjE6IDE2LjUpLgotQ0hLSjI4MTIuZWpiMTE9Q0hLSjI4MTJFOiBCZWFuIGNsYXNzIHswfSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mIGl0cyBmaWVsZHMgYXMgYSA8Y21wLWZpZWxkPi4gKEVKQiAxLjE6IDE2LjUpCi1DSEtKMjgxNC5lamIxMT1DSEtKMjgxNFc6IDxlamItbmFtZT4sIGluIDxtZXRob2Q+LCBzaG91bGQgc3BlY2lmeSBhIGtub3duIGVudGVycHJpc2UgYmVhbi4gKEVKQiAxLjE6IDExLjQuMSwgMTUuMy4yLCAxNi41KQotCi1DSEtKMjgyMC5lamIxMT1DSEtKMjgyMFc6IFRoZSBzZWN1cml0eSByb2xlIHJlZiBtdXN0IGJlIGRlZmluZWQgb25seSBvbmNlLgotQ0hLSjI4MjIuZWpiMTE9Q0hLSjI4MjJXOiA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQgZm9yIGJlYW4gezB9IHNob3VsZCBkZWZpbmUgdGhlIDxyb2xlLW5hbWU+IGVsZW1lbnQuIChFSkIgMS4xOiAxNS4yLjUuMykKLUNIS0oyODIzLmVqYjExPUNIS0oyODIzVzogPHNlY3VyaXR5LXJvbGUtcmVmPiBlbGVtZW50IHNob3VsZCBkZWZpbmUgdGhlIDxyb2xlLWxpbms+IGVsZW1lbnQuIChFSkIgMS4xOiAxNS4zLjMpCi1DSEtKMjgyNC5lamIxMT1DSEtKMjgyNFc6IDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudCByZWZlcnMgdG8gdW5rbm93biByb2xlIHswfS4gKEVKQiAxLjE6IDE1LjMuMykKLUNIS0oyODI1LmVqYjExPUNIS0oyODI1VzogPHNlY3VyaXR5LXJvbGU+IGVsZW1lbnQgaW4gZWpiLWphci54bWwgc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbmFtZT4gZWxlbWVudC4gKEVKQiAxLjE6IDE1LjMuMSkKLUNIS0oyODI2LmVqYjExPUNIS0oyODI2VzogVGhlIHNlY3VyaXR5LXJvbGUgbmFtZSBtdXN0IGJlIHVuaXF1ZS4gKEVKQiAxLjE6IDE1LjMuMSkKLUNIS0oyODI3LmVqYjExPUNIS0oyODI3VzogQ2Fubm90IHVzZSBhIDxyb2xlLWxpbms+IGVsZW1lbnQgd2l0aG91dCA8c2VjdXJpdHktcm9sZT4gZWxlbWVudHMuIChFSkIgMS4xOiAxNS4yLjUuMywgMTUuMy4xLCAxNS4zLjMpCi1DSEtKMjgyOC5lamIxMT1DSEtKMjgyOEU6IENhbm5vdCB1c2UgYSA8cHJpbWtleS1maWVsZD4gZWxlbWVudCB3aXRob3V0IGEgcHJpbWl0aXZlIHByaW1hcnkga2V5LiAoRUpCIDEuMTogOS40LjcsIDE2LjUpCi1DSEtKMjgyOS5lamIxMT1DSEtKMjgyOUU6IEtleSBjbGFzcyB7MH0gZG9lcyBub3QgbWFwIHRvIGFueSBmaWVsZHMgaW4gZW50ZXJwcmlzZSBiZWFuIHsxfS4gKEVKQiAxLjE6IDkuNC43LCAxNi41KQotCi1DSEtKMjgzMC5lamIxMT1DSEtKMjgzMFc6IFRoZSB0eXBlIG9mIHRoZSB7MH0gZmllbGQgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODMxLmVqYjExPUNIS0oyODMxVzogezB9IG11c3QgYmUgZGVjbGFyZWQgaW4gYSA8Y21wLWZpZWxkPiBlbGVtZW50LiAoRUpCIDEuMTogOS40LjcuMikKLUNIS0oyODMyLmVqYjExPUNIS0oyODMySTogSG9tZSB7MH0sIHNwZWNpZmllZCBpbiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gKEVKQiAxLjE6IDE0LjMuMS4yKQotQ0hLSjI4MzMuZWpiMTE9Q0hLSjI4MzNJOiBSZW1vdGUgezB9LCBzcGVjaWZpZWQgaW4gdGhlIDxlamItcmVmPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIChFSkIgMS4xOiAxNC4zLjEuMikKLUNIS0oyODM0LmVqYjExPUNIS0oyODM0STogQmVhbiB7MH0sIHNwZWNpZmllZCBpbiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQsIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gKEVKQiAxLjE6IDE0LjMuMikKLUNIS0oyODM1LmVqYjExPUNIS0oyODM1STogQmVhbiB7MH0gaXMgYSB7MX0gdHlwZS4gVXBkYXRlIHRoZSA8ZWpiLXJlZi10eXBlPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudC4gKEVKQiAxLjE6IDE0LjMuMikKLUNIS0oyODM2LmVqYjExPUNIS0oyODM2STogQmVhbiB7MH0gdXNlcyBob21lIHsxfS4gVXBkYXRlIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIChFSkIgMS4xOiAxNC4zLjIpCi1DSEtKMjgzNy5lamIxMT1DSEtKMjgzN0k6IEJlYW4gezB9IHVzZXMgcmVtb3RlIHsxfS4gVXBkYXRlIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIChFSkIgMS4xOiAxNC4zLjIpLgotQ0hLSjI4MzguZWpiMTE9Q0hLSjI4MzhJOiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCByZWZlcmVuY2VzIHRvIGVudGVycHJpc2UgYmVhbnMgYmUgb3JnYW5pemVkIGluIHRoZSAiZWpiIiBzdWJjb250ZXh0LiAoRUpCIDEuMTogMTQuMy4xLjEpLgotQ0hLSjI4MzkuZWpiMTE9Q0hLSjI4MzlXOiBUaGUgPGVudi1lbnRyeS1uYW1lPiBlbGVtZW50LCBvZiB0aGUgPGVudi1lbnRyeT4gZWxlbWVudCwgaXMgaW52YWxpZC4gKEVKQiAxLjE6IDE0LjIuMS4yKQotCi1DSEtKMjg0MC5lamIxMT1DSEtKMjg0MFc6IFRoZSA8ZW52LWVudHJ5LXR5cGU+IGVsZW1lbnQsIG9mIHRoZSA8ZW52LWVudHJ5PiBlbGVtZW50LCBpcyBpbnZhbGlkLiAoRUpCIDEuMTogMTQuMi4xLjIpLgotQ0hLSjI4NDEuZWpiMTE9Q0hLSjI4NDFXOiBUaGUgezB9IG5hbWUsIGluIHRoZSA8ZW52LWVudHJ5LW5hbWU+IGVsZW1lbnQsIGNhbiBiZSB1c2VkIG9ubHkgb25jZSBpbiB0aGUgYmVhbi4gKEVKQiAxLjE6IDE0LjIuMS4yKS4KLUNIS0oyODQyLmVqYjExPUNIS0oyODQyVzogPG1ldGhvZC1wYXJhbXM+IGlzIGlnbm9yZWQgd2hlbiA8bWV0aG9kLW5hbWU+IGlzICIqIi4gKEVKQiAxLjE6IDExLjQuMSwgMTUuMy4yKS4KLUNIS0oyODQzLmVqYjExPUNIS0oyODQzVzogTm8gbWV0aG9kcywgb24gezB9LCBtYXRjaCB0aGlzIDxtZXRob2Q+LiAoRUpCIDEuMTogMTEuNC4xLCAxNS4zLjIpLgotQ0hLSjI4NDQuZWpiMTE9Q0hLSjI4NDRXOiBBdCBsZWFzdCBvbmUgPG1ldGhvZD4gc2hvdWxkIGJlIHNldCBpbiBhIDxtZXRob2QtcGVybWlzc2lvbj4uIChFSkIgMS4xOiAxMS40LjEsIDE1LjMuMikuCi1DSEtKMjg0NS5lamIxMT1DSEtKMjg0NVc6IEF0IGxlYXN0IG9uZSA8cm9sZS1uYW1lPiBzaG91bGQgYmUgc2V0IGluIGEgPG1ldGhvZC1wZXJtaXNzaW9uPi4gKEVKQiAxLjE6IDExLjQuMSwgMTUuMy4yKS4KLUNIS0oyODQ2LmVqYjExPUNIS0oyODQ2VzogTm8gbWV0aG9kcyBjYW4gYmUgZm91bmQgZm9yIHRoaXMgPG1ldGhvZC1wZXJtaXNzaW9uPi4gKEVKQiAxLjE6IDE1LjMuMikuCi1DSEtKMjg0Ny5lamIxMT1DSEtKMjg0N1c6IE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxjb250YWluZXItdHJhbnNhY3Rpb24+LiAoRUpCIDEuMTogMTEuNC4xKS4KLUNIS0oyODQ5LmVqYjExPUNIS0oyODQ5VzogQ2Fubm90IHZhbGlkYXRlIGNvbXBvbmVudCBpbmhlcml0YW5jZSBvZiB7MH0gYmVjYXVzZSB7MX0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODUwLmVqYjExPUNIS0oyODUwVzogQ2Fubm90IHZhbGlkYXRlIDxtZXRob2Q+IGJlY2F1c2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjg1MS5lamIxMT1DSEtKMjg1MVc6IENhbm5vdCB2YWxpZGF0ZSB7MH0gYmVjYXVzZSB7MX0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODUyLmVqYjExPUNIS0oyODUyVzogVGhyb3dhYmxlIGNhdWdodCB3aGlsZSB2YWxpZGF0aW5nIHRoZSBlamItamFyLnhtbC4gVGhlIGJlYW4gYmVpbmcgdmFsaWRhdGVkIHdhcyB7MH0uCi1DSEtKMjg1My5lamIxMT1DSEtKMjg1M1c6IFRocm93YWJsZSBjYXVnaHQgd2hpbGUgdmFsaWRhdGluZyB0aGUgaWJtLWVqYi1qYXItZXh0LnhtaS4gVGhlIGJlYW4gYmVpbmcgdmFsaWRhdGVkIHdhcyB7MH0uCi0KLUNIS0oyOTA4LmVqYjExPUNIS0oyOTA4VzogQW4gZW50ZXJwcmlzZSBiZWFuIGNhbm5vdCBiZSByZWZsZWN0ZWQgcHJvcGVybHkuIFJ1biB0aGUgWE1MIHZhbGlkYXRvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQ0hLSjI4OTUuZWpiMTE9Q0hLSjI4OTVXOiA8ZWpiLW5hbWU+IHswfSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUgKEVKQiAxLjE6IDE2LjUpLgotQ0hLSjI4NzUuZWpiMTE9Q0hLSjI4NzVFOiA8ZWpiLWNsaWVudC1qYXI+IHswfSBtdXN0IGV4aXN0IGluIGV2ZXJ5IEVBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhpcyBFSkIgbW9kdWxlIChFSkIgMS4xOiAxNi41LCAxNy40KS4KLQotCi0jIEVKQl9NRVRIT0RfQkVBTl9OVUxMPUNIS0oyNDM0VzogVmFsaWRhdGlvbiBvZiB0aGlzIG1ldGhvZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBiZWFuIGNsYXNzJycgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX01FVEhPRF9IT01FX05VTEw9Q0hLSjI0MzVXOiBWYWxpZGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGhvbWUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBob21lIGludGVyZmFjZScncyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfTUVUSE9EX1JFTU9URV9OVUxMPUNIS0oyNDM2VzogVmFsaWRhdGlvbiBvZiB0aGlzIG1ldGhvZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSByZW1vdGUgaW50ZXJmYWNlIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlJydzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9NRVRIT0RfTlVMTD1DSEtKMjQzN1c6IFZhbGlkYXRpb24gb2YgdGhpcyBtZXRob2Qgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNhbm5vdCBiZSBmb3VuZC4KLSMgRUpCX01FVEhPRF9LRVlfTlVMTD1DSEtKMjQzOFc6IFZhbGlkYXRpb24gb2YgdGhpcyBtZXRob2Qgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgcHJpbWFyeSBrZXkgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGtleSBjbGFzcycnIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9SRU1PVEVfTlVMTD1DSEtKMjkwNEU6IFZhbGlkYXRpb24gb2YgezB9IHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIHJlbW90ZSBpbnRlcmZhY2UgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgaXRzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9OVUxMPUNIS0oyOTAzRTogVmFsaWRhdGlvbiB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBlbnRlcnByaXNlIGJlYW4gY2Fubm90IGJlIGZvdW5kLgotIyBFSkJfTk9UUkVGTEVDVEVEX0pBVkFDTEFTUz1DSEtKMjkwN0U6IENhbm5vdCB2YWxpZGF0ZSBiZWNhdXNlIHRoZSB7MH0gdHlwZSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBFbnN1cmUgdGhhdCBpdCwgYW5kIGFsbCBvZiBpdHMgZGVwZW5kZW5jaWVzLCBhcmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzcGF0aC4KLSMgRUpCX0ZJRUxEX0NBTk5PVF9SRUZMRUNUPUNIS0oyMjA4VzogVHlwZSB7MH0gb2YgZmllbGQgezF9IGNhbm5vdCBiZSByZWZsZWN0ZWQuIEVuc3VyZSB0aGF0IHswfSwgYW5kIGFsbCBvZiBpdHMgZGVwZW5kZW5jaWVzLCBhcmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzcGF0aC4KLSMgRUpCX0ZJRUxEX0JFQU5fTlVMTD1DSEtKMjIwOVc6IFZhbGlkYXRpb24gb2YgdGhpcyBmaWVsZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBiZWFuIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBiZWFuIGNsYXNzJycgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX0ZJRUxEX0hPTUVfTlVMTD1DSEtKMjIxMFc6IFZhbGlkYXRpb24gb2YgdGhpcyBmaWVsZCB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBob21lIGludGVyZmFjZSBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiB0aGUgaG9tZSBpbnRlcmZhY2UnJ3MgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX0ZJRUxEX1JFTU9URV9OVUxMPUNIS0oyMjExVzogVmFsaWRhdGlvbiBvZiB0aGlzIGZpZWxkIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIHJlbW90ZSBpbnRlcmZhY2UgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIHJlbW90ZSBpbnRlcmZhY2UnJ3MgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX0ZJRUxEX05VTEw9Q0hLSjIyMTJXOiBWYWxpZGF0aW9uIG9mIHRoaXMgZmllbGQgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNhbm5vdCBiZSBmb3VuZC4KLSMgRUpCX0ZJRUxEX0tFWV9OVUxMPUNIS0oyMjEzVzogVmFsaWRhdGlvbiBvZiB0aGlzIGZpZWxkIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIHByaW1hcnkga2V5IGNhbm5vdCBiZSBmb3VuZC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBrZXkgY2xhc3MnJyBuYW1lIGluIHRoZSBlamItamFyLnhtbCBmaWxlLgotIyBFSkJfSEFTX01VTFRJUExFX1BLX01FVEhPRFM9Q0hLSjIwMDBXOiBUaGUgezB9IGhvbWUgaW50ZXJmYWNlIG11c3QgY29udGFpbiBvbmx5IG9uZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gKEVKQiAxLjE6IDkuMi44KQotIyBFSkJfSE9NRV9OVUxMPUNIS0oyOTAxRTogVmFsaWRhdGlvbiBvZiB7MH0gd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgaG9tZSBpbnRlcmZhY2UgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgaXRzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9LRVlfTlVMTD1DSEtKMjkwMkU6IFZhbGlkYXRpb24gb2YgezB9IHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGtleSBjbGFzcyBjYW5ub3QgYmUgZm91bmQuIENoZWNrIHRoZSBzcGVsbGluZyBvZiBpdHMgbmFtZSBpbiB0aGUgZWpiLWphci54bWwgZmlsZS4KLSMgRUpCX0JFQU5fTlVMTD1DSEtKMjkwMEU6IFZhbGlkYXRpb24gb2YgezB9IHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGJlYW4gY2xhc3MgY2Fubm90IGJlIGZvdW5kLiBDaGVjayB0aGUgc3BlbGxpbmcgb2YgaXRzIG5hbWUgaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUuCi0jIEVKQl9CTVBfTk9GSUVMRFM9Q0hLSjIwNDJXOiBUbyBoYXZlIGEgcHJpbWFyeSBrZXksIHRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGRlY2xhcmUgYXQgbGVhc3Qgb25lIGZpZWxkLiAoRUpCIDEuMTogOS4xLjUuMSkKLSMgRUpCX0REX0NBTk5PVF9PUEVOX0REPUNIS0oyODIxRTogQ2Fubm90IG9wZW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVmFsaWRhdGlvbiBjYW5ub3QgY29tcGxldGUuCi0jIEVKQl9ERF9NRVRIVFJBTlNBQ1RJT05fTk9fVFJBTlNBQ1RJT049Q0hLSjI4NDhXOiBBdCBsZWFzdCBvbmUgPHRyYW5zLWF0dHJpYnV0ZT4gbXVzdCBiZSBzZXQgaW4gYSA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPi4gKEVKQiAxLjE6IDExLjQuMSkKLQotIwotIyBlbmQgb2YgbWVzc2FnZXMgZm9yIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24KLSMKLQotIwotIyBNZXNzYWdlcyBmb3IgRUpCIDIuMCBzcGVjaWZpY2F0aW9uCi0jCi1DSEtKMjgyOC5lamIyMD1DSEtKMjgyOEU6IENhbm5vdCB1c2UgYSA8cHJpbWtleS1maWVsZD4gd2l0aG91dCBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSAoRUpCIDIuMDogMTAuOC4xLCAyMi41KS4KLUNIS0oyODI5LmVqYjIwPUNIS0oyODI5RTogS2V5IGNsYXNzIHswfSBkb2VzIG5vdCBtYXAgdG8gYW55IGZpZWxkcyBpbiBlbnRlcnByaXNlIGJlYW4gezF9LiAoRUpCIDIuMDogMTAuOCwgMjIuNSkuCi1DSEtKMjgzOS5lamIyMD1DSEtKMjgzOVc6IFRoZSA8ZW52LWVudHJ5LW5hbWU+IGVsZW1lbnQsIG9mIHRoZSA8ZW52LWVudHJ5PiBlbGVtZW50LCBpcyBpbnZhbGlkLiAoRUpCIDIuMDogMjAuMi4xLjIpLgotQ0hLSjI4NDAuZWpiMjA9Q0hLSjI4NDBXOiBUaGUgPGVudi1lbnRyeS10eXBlPiBlbGVtZW50LCBvZiB0aGUgPGVudi1lbnRyeT4gZWxlbWVudCwgaXMgaW52YWxpZC4gKEVKQiAyLjA6IDIwLjIuMS4yKS4KLUNIS0oyODQxLmVqYjIwPUNIS0oyODQxVzogVGhlIHswfSBuYW1lLCBpbiB0aGUgPGVudi1lbnRyeS1uYW1lPiBlbGVtZW50LCBjYW4gYmUgdXNlZCBvbmx5IG9uY2UgaW4gdGhlIGJlYW4uIChFSkIgMi4wOiAyMC4yLjEuMikuCi1DSEtKMjgzMC5lamIyMD1DSEtKMjgzMFc6IFRoZSB0eXBlIG9mIHRoZSB7MH0gZmllbGQgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODMxLmVqYjIwPUNIS0oyODMxVzogezB9IG11c3QgYmUgZGVjbGFyZWQgaW4gYSA8Y21wLWZpZWxkPiBlbGVtZW50LiAoRUpCIDIuMDogMTAuOC4yKS4KLUNIS0oyODAxLmVqYjIwPUNIS0oyODAxRTogVGhlIHZhbHVlIG9mIHRoZSA8ZWpiLW5hbWU+IGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQuIChFSkIgMi4wIDIyLjIsIDIyLjUpLgotQ0hLSjI4MDkuZWpiMjA9Q0hLSjI4MDlFOiBUaGUgdmFsdWUgb2YgdGhlIDxwZXJzaXN0ZW5jZS10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJDb250YWluZXIiIG9yICJCZWFuIi4gIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLUNIS0oyODA2LmVqYjIwPUNIS0oyODA2RTogVGhlIHZhbHVlIG9mIHRoZSA8cmVlbnRyYW50PiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJUcnVlIiBvciAiRmFsc2UiLiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgwNy5lamIyMD1DSEtKMjgwN0U6IFRoZSB2YWx1ZSBvZiB0aGUgPHNlc3Npb24tdHlwZT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiU3RhdGVmdWwiIG9yICJTdGF0ZWxlc3MiLiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgwOC5lamIyMD1DSEtKMjgwOEU6IFRoZSB2YWx1ZSBvZiB0aGUgPHRyYW5zYWN0aW9uLXR5cGU+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIkNvbnRhaW5lciIgb3IgIkJlYW4iLiAoRUpCIDIuMDogMTcuMy42LCAyMi4yLCAyMi41KS4KLUNIS0oyODE0LmVqYjIwPUNIS0oyODE0VzogPGVqYi1uYW1lPiwgaW4gPG1ldGhvZD4sIHNob3VsZCBzcGVjaWZ5IGEga25vd24gZW50ZXJwcmlzZSBiZWFuLiAoRUpCIDIuMDogMTcuNC4xLCAyMS4zLjIsIDIyLjUpLgotQ0hLSjI4NDIuZWpiMjA9Q0hLSjI4NDJXOiA8bWV0aG9kLXBhcmFtcz4gaXMgaWdub3JlZCB3aGVuIDxtZXRob2QtbmFtZT4gaXMgIioiLiAoRUpCIDIuMDogMTcuNC4xLCAyMS4zLjIpLgotQ0hLSjI4NDMuZWpiMjA9Q0hLSjI4NDNXOiBObyBtZXRob2RzLCBvbiB7MH0sIG1hdGNoIHRoaXMgPG1ldGhvZD4uIChFSkIgMi4wOiAxNy40LjEsIDIxLjMuMikuCi1DSEtKMjg0NC5lamIyMD1DSEtKMjg0NFc6IEF0IGxlYXN0IG9uZSA8bWV0aG9kPiBzaG91bGQgYmUgc2V0IGluIGEgPG1ldGhvZC1wZXJtaXNzaW9uPi4gKEVKQiAyLjA6IDE3LjQuMSwgMjEuMy4yKS4KLUNIS0oyODQ1LmVqYjIwPUNIS0oyODQ1VzogQSA8cm9sZS1uYW1lPiBvciBhbiA8dW5jaGVja2VkPiBlbGVtZW50IHNob3VsZCBiZSBzZXQgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAoRUpCIDIuMDogMTcuNC4xLCAyMS4zLjIpLgotQ0hLSjI4NDYuZWpiMjA9Q0hLSjI4NDZXOiBObyBtZXRob2RzIGNhbiBiZSBmb3VuZCBmb3IgdGhpcyA8bWV0aG9kLXBlcm1pc3Npb24+LiAoRUpCIDIuMDogMjEuMy4yKS4KLUNIS0oyODQ3LmVqYjIwPUNIS0oyODQ3VzogTm8gbWV0aG9kcyBjYW4gYmUgZm91bmQgZm9yIHRoaXMgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4uIChFSkIgMi4wOiAxNy40LjEpLgotQ0hLSjI4MTIuZWpiMjA9Q0hLSjI4MTJFOiBCZWFuIGNsYXNzIHswfSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIG9mIGl0cyBmaWVsZHMgYXMgYSA8Y21wLWZpZWxkPi4gKEVKQiAyLjA6IDIyLjUpLgotQ0hLSjI4MzIuZWpiMjA9Q0hLSjI4MzJJOiBIb21lIHswfSwgc3BlY2lmaWVkIGluIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBFSkIgbW9kdWxlLiAoRUpCIDIuMDogMjAuMy4xLjIpLgotQ0hLSjI4MzMuZWpiMjA9Q0hLSjI4MzNJOiBSZW1vdGUgezB9LCBzcGVjaWZpZWQgaW4gdGhlIDxlamItcmVmPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIChFSkIgMi4wOiAyMC4zLjEuMikuCi1DSEtKMjgzNC5lamIyMD1DSEtKMjgzNEk6IEJlYW4gezB9LCBzcGVjaWZpZWQgaW4gdGhlIDxlamItcmVmPiBlbGVtZW50LCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIChFSkIgMi4wOiAyMC4zLjIpLgotQ0hLSjI4MzUuZWpiMjA9Q0hLSjI4MzVJOiBCZWFuIHswfSBpcyBhIHsxfSB0eXBlLiBVcGRhdGUgdGhlIDxlamItcmVmLXR5cGU+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDIuMDogMjAuMy4yKS4KLUNIS0oyODM2LmVqYjIwPUNIS0oyODM2STogQmVhbiB7MH0gdXNlcyBob21lIHsxfS4gVXBkYXRlIHRoZSA8ZWpiLXJlZj4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIChFSkIgMi4wOiAyMC4zLjIpLgotQ0hLSjI4MzcuZWpiMjA9Q0hLSjI4MzdJOiBCZWFuIHswfSB1c2VzIHJlbW90ZSB7MX0uIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50LiAoRUpCIDIuMDogMjAuMy4yKS4KLUNIS0oyODM4LmVqYjIwPUNIS0oyODM4STogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIGJlYW5zIGJlIG9yZ2FuaXplZCBpbiB0aGUgImVqYiIgc3ViY29udGV4dC4gKEVKQiAyLjA6IDIwLjMuMS4xKS4KLUNIS0oyODIwLmVqYjIwPUNIS0oyODIwVzogVGhlIHNlY3VyaXR5IHJvbGUgcmVmIGlzIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UuCi1DSEtKMjgyMi5lamIyMD1DSEtKMjgyMlc6IDxzZWN1cml0eS1yb2xlLXJlZj4gZWxlbWVudCBmb3IgYmVhbiB7MH0gc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbmFtZT4gZWxlbWVudC4gKEVKQiAyLjA6IDIxLjIuNS4zKS4KLUNIS0oyODIzLmVqYjIwPUNIS0oyODIzVzogPHNlY3VyaXR5LXJvbGUtcmVmPiBlbGVtZW50IHNob3VsZCBkZWZpbmUgdGhlIDxyb2xlLWxpbms+IGVsZW1lbnQuIChFSkIgMi4wOiAyMS4zLjMpLgotQ0hLSjI4MjQuZWpiMjA9Q0hLSjI4MjRXOiA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQgcmVmZXJzIHRvIHVua25vd24gcm9sZSB7MH0uIChFSkIgMi4wOiAyMS4zLjMpLgotQ0hLSjI4MjUuZWpiMjA9Q0hLSjI4MjVXOiA8c2VjdXJpdHktcm9sZT4gZWxlbWVudCBpbiBlamItamFyLnhtbCBzaG91bGQgZGVmaW5lIHRoZSA8cm9sZS1uYW1lPiBlbGVtZW50LiAoRUpCIDIuMDogMjEuMy4xKS4KLUNIS0oyODI2LmVqYjIwPUNIS0oyODI2VzogVGhlIHNlY3VyaXR5LXJvbGUgbmFtZSBtdXN0IGJlIHVuaXF1ZS4gKEVKQiAyLjA6IDIxLjMuMSkuCi1DSEtKMjgyNy5lamIyMD1DSEtKMjgyN1c6IENhbm5vdCB1c2UgYSA8cm9sZS1saW5rPiBlbGVtZW50IHdpdGhvdXQgPHNlY3VyaXR5LXJvbGU+IGVsZW1lbnRzLiAoRUpCIDIuMDogMjEuMi41LjMsIDIxLjMuMSwgMjEuMy4zKS4KLUNIS0oyODUwLmVqYjIwPUNIS0oyODUwVzogQ2Fubm90IHZhbGlkYXRlIDxtZXRob2Q+IGJlY2F1c2UgdGhlIHswfSB0eXBlIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjg1MS5lamIyMD1DSEtKMjg1MVc6IENhbm5vdCB2YWxpZGF0ZSB7MH0gYmVjYXVzZSB0eXBlIHsxfSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4NzUuZWpiMjA9Q0hLSjI4NzVFOiA8ZWpiLWNsaWVudC1qYXI+IHswfSBtdXN0IGV4aXN0IGluIGV2ZXJ5IEVBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhpcyBFSkIgbW9kdWxlIChFSkIgMi4wOiAyMi41LCAyMy40LCAyMy42KS4KLQotQ0hLSjIwMDNFLmVqYjIwPUNIS0oyMDAzRTogVGhpcyBjbGFzcyBtdXN0IG5vdCBpbXBsZW1lbnQgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gKEVKQiAyLjA6IDcuNS4zLCA3LjEwLjIsIDE3LjMuNC4xKS4KLUNIS0oyMDAzSS5lamIyMD1DSEtKMjAwM0k6IEJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW5zIG5lZWQgbm90IGltcGxlbWVudCBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiAoRUpCIDIuMDogNy41LjMsIDcuMTAuMiwgMTcuMy40LjEpLgotQ0hLSjI4MDIubmFtZWQuZWpiMjA9Q0hLSjI4MDJFOiA8ZWpiLWNsYXNzPiBjbGFzcyB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODAyLnVubmFtZWQuZWpiMjA9Q0hLSjI4MDJFOiBUaGUgYmVhbiBjbGFzcywgaWRlbnRpZmllZCBieSB0aGUgPGVqYi1jbGFzcz4gZWxlbWVudCwgY2Fubm90IGJlIGZvdW5kLiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgwMy5uYW1lZC5lamIyMD1DSEtKMjgwM0U6IDxob21lPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwMy51bm5hbWVkLmVqYjIwPUNIS0oyODAzRTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudC4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDQubmFtZWQuZWpiMjA9Q0hLSjI4MDRFOiA8cmVtb3RlPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwNC51bm5hbWVkLmVqYjIwPUNIS0oyODA0RTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8cmVtb3RlPiBlbGVtZW50LiAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgwNS5uYW1lZC5lamIyMD1DSEtKMjgwNUU6IDxsb2NhbC1ob21lPiBpbnRlcmZhY2UgezB9LCBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi1DSEtKMjgwNS51bm5hbWVkLmVqYjIwPUNIS0oyODA1RTogVW5rbm93biBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSA8bG9jYWwtaG9tZT4gZWxlbWVudC4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MDAubmFtZWQuZWpiMjA9Q0hLSjI4MDBFOiA8bG9jYWw+IGludGVyZmFjZSB7MH0sIG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcywgY2Fubm90IGJlIHJlZmxlY3RlZC4gQ2hlY2sgdGhlIGNsYXNzcGF0aC4KLUNIS0oyODAwLnVubmFtZWQuZWpiMjA9Q0hLSjI4MDBFOiBVbmtub3duIGludGVyZmFjZSBzcGVjaWZpZWQgaW4gdGhlIDxsb2NhbD4gZWxlbWVudC4gKEVKQiAyLjA6IDIyLjIsIDIyLjUpLgotQ0hLSjI4MTAubmFtZWQuZWpiMjA9Q0hLSjI4MTBFOiA8cHJpbS1rZXktY2xhc3M+IGNsYXNzIHswfSwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLgotQ0hLSjI4MTAudW5uYW1lZC5lamIyMD1DSEtKMjgxMEU6IFVua25vd24gY2xhc3Mgc3BlY2lmaWVkIGluIHRoZSA8cHJpbS1rZXktY2xhc3M+IGVsZW1lbnQuICAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjgxMS5lamIyMD1DSEtKMjgxMUU6IDxmaWVsZC1uYW1lPiB7MH0gY2Fubm90IGJlIGxvY2F0ZWQgb24gYmVhbiBjbGFzcyB7MX0uIChFSkIgMi4wOiAyMi41KS4KLQotQ0hLSjIxMDMuZWpiMjA9Q0hLSjIxMDNFOiBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSB7MH0gYmVhbiBjbGFzcyBtdXN0IGluaGVyaXQgezF9IChFSkIgMi4wOiBELjIpCi1DSEtKMjEwNC5lamIyMD1DSEtKMjEwNEU6IEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIHswfSBob21lIGludGVyZmFjZSBtdXN0IG5vdCBpbmhlcml0IHsxfS4gKEVKQiAyLjA6IEQuMikuCi1DSEtKMjEwNS5lamIyMD1DSEtKMjEwNUU6IEluIGNvbXBvbmVudCBpbmhlcml0YW5jZSwgdGhlIHswfSBjb21wb25lbnQgaW50ZXJmYWNlIG11c3QgaW5oZXJpdCB7MX0uIChFSkIgMi4wOiBELjIpLgotQ0hLSjIxMDYuZWpiMjA9Q0hLSjIxMDZFOiAgQmVhbiB7MH0gbXVzdCB1c2UgezF9IGFzIGl0cyA8cHJpbS1rZXktY2xhc3M+IChFSkIgMi4wOiBELjIpLgotQ0hLSjI4NDkuZWpiMjA9Q0hLSjI4NDlXOiBDYW5ub3QgdmFsaWRhdGUgY29tcG9uZW50IGluaGVyaXRhbmNlIG9mIHswfSBiZWNhdXNlIHRoZSB7MX0gdHlwZSwgb3Igb25lIG9mIGl0cyBkZXBlbmRlbmNpZXMsIGNhbm5vdCBiZSByZWZsZWN0ZWQuIENoZWNrIHRoZSBjbGFzc3BhdGguCi0KLUNIS0oyODk1LmVqYjIwPUNIS0oyODk1VzogPGVqYi1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyLnhtbCBmaWxlIChFSkIgMi4wOiAyMi41KS4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgY2xhc3MvaW50ZXJmYWNlIGNoZWNrcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgaW1wbGVtZW50IFNlc3Npb25CZWFuL0VudGl0eUJlYW4vTWVzc2FnZURyaXZlbkJlYW4vTWVzc2FnZUxpc3RlbmVyCi1DSEtKMjAxNy5zYi5lamIyMD1DSEtKMjAxN0U6IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgezB9IChFSkIgMi4wOiA3LjUuMSwgNy4xMC4yKS4KLUNIS0oyMDE3Lm1iLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB7MH0gKEVKQiAyLjA6IDE1LjQuMSwgMTUuNy4yKS4KLUNIS0oyMDE3LmNiLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB7MH0gKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjAxNy5iYi5lamIyMD1DSEtKMjAxN0U6IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgezB9IChFSkIgMi4wOiAxMi4yLjIpLgotCi0jIGltcGxlbWVudCBFSkJIb21lCi1DSEtKMjAxNy5zcmguZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCSG9tZSAoRUpCIDIuMDogNi4zLCA3LjEwLjYpLgotQ0hLSjIwMTcuY3JoLmVqYjIwPUNIS0oyMDE3RTogVGhpcyBpbnRlcmZhY2UgbXVzdCBleHRlbmQgamF2YXguZWpiLkVKQkhvbWUgKEVKQiAyLjA6IDkuNSwgMTAuNi4xMCkuCi1DSEtKMjAxNy5icmguZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCSG9tZSAoRUpCIDIuMDogOS41LCAxMi4yLjkpLgotCi0jIGltcGxlbWVudCBFSkJMb2NhbEhvbWUKLUNIS0oyMDE3LnNsaC5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJMb2NhbEhvbWUgKEVKQiAyLjA6IDYuNCwgNy4xMC44KS4KLUNIS0oyMDE3LmNsaC5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJMb2NhbEhvbWUgKEVKQiAyLjA6IDkuNiwgMTAuNi4xMikuCi1DSEtKMjAxNy5ibGguZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxIb21lIChFSkIgMi4wOiA5LjYsIDEyLjIuMTEpLgotCi0jIGltcGxlbWVudCBFSkJPYmplY3QKLUNIS0oyMDE3LnNyYy5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJPYmplY3QgKEVKQiAyLjA6IDYuNSwgNy4xMC41KS4KLUNIS0oyMDE3LmNyYy5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJPYmplY3QgKEVKQiAyLjA6IDkuOSwgMTAuNi45KS4KLUNIS0oyMDE3LmJyYy5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJPYmplY3QgKEVKQiAyLjA6IDkuOSwgMTIuMi44KS4KLQotIyBpbXBsZW1lbnQgRUpCTG9jYWxPYmplY3QKLUNIS0oyMDE3LnNsYy5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyMDE3LmNsYy5lamIyMD1DSEtKMjAxN0U6IFRoaXMgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIGphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCAoRUpCIDIuMDogOS4xMCwgMTAuNi4xMCkuCi1DSEtKMjAxNy5ibGMuZWpiMjA9Q0hLSjIwMTdFOiBUaGlzIGludGVyZmFjZSBtdXN0IGV4dGVuZCBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgKEVKQiAyLjA6IDkuMTAsIDEyLjIuMTApLgotCi0jIGltcGwgY29tcG9uZW50IGludGVyZmFjZQotQ0hLSjIwNDAuY2IuZWpiMjA9Q0hLSjIwNDBJOiAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdCAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyMDQwLmJiLmVqYjIwPUNIS0oyMDQwSTogInRoaXMiIG11c3Qgbm90IGJlIHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjA0MC5zYi5lamIyMD1DSEtKMjA0MEk6ICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiA3LjEwLjIpLgotCi0jIGJlYW4gY2xhc3MKLUNIS0oyMDE0LmNiLmVqYjIwPUNIS0oyMDE0VzogVGhpcyBjbGFzcyBtdXN0IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMC4zLjEsIDEwLjQuMSwgMTAuNi4yKS4KLUNIS0oyMDE0Lm1iLmVqYjIwPUNIS0oyMDE0VzogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTUuNy4yKS4KLUNIS0oyMDE0LmJiLmVqYjIwPUNIS0oyMDE0VzogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTIuMi4yKS4KLUNIS0oyMDE0LnNiLmVqYjIwPUNIS0oyMDE0VzogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogNy4xMC4xKS4KLQotQ0hLSjIwMjIuY2IuZWpiMjA9Q0hLSjIwMjJXOiBUaGlzIGNsYXNzIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjIwMjIubWIuZWpiMjA9Q0hLSjIwMjJXOiBUaGlzIGNsYXNzIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxNS43LjIpLgotQ0hLSjIwMjIuYmIuZWpiMjA9Q0hLSjIwMjJXOiBUaGlzIGNsYXNzIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjIpLgotQ0hLSjIwMjIuc2IuZWpiMjA9Q0hLSjIwMjJXOiBUaGlzIGNsYXNzIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiA3LjEwLjEpLgotQ0hLSjIwMjIua2MuZWpiMjA9Q0hLSjIwMjJXOiBUaGlzIGNsYXNzIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC44LjIpLgotCi1DSEtKMjAxNS5jYi5lamIyMD1DSEtKMjAxNVc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuMikuCi1DSEtKMjAxNS5tYi5lamIyMD1DSEtKMjAxNVc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDE1LjcuMikuCi1DSEtKMjAxNS5iYi5lamIyMD1DSEtKMjAxNVc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjIuMikuCi1DSEtKMjAxNS5zYi5lamIyMD1DSEtKMjAxNVc6IFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuMTAuMSkuCi0KLSMgZGVwZW5kZW50IHZhbHVlIGNsYXNzCi1DSEtKMjAxOC5lamIyMD1DSEtKMjAxOFc6IFRoaXMgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUgKEVKQiAyLjA6IDEwLjMuMywgMTAuNi4zKS4KLUNIS0oyMDQzLmVqYjIwPUNIS0oyMDQzVzogVGhpcyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi4zKS4KLUNIS0oyMDQ0LmVqYjIwPUNIS0oyMDQ0VzogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTAuNi4zKS4KLQotIyBrZXkgY2xhc3MKLUNIS0oyMDE5LmtjLmVqYjIwPUNIS0oyMDE5VzogVGhpcyBjbGFzcyBtdXN0IGJlIGEgbGVnYWwgVmFsdWUgVHlwZSBpbiBSTUktSUlPUCAoRUpCIDIuMDogOS44LCAxMC42LjEzKS4KLUNIS0oyMDE5LmtiLmVqYjIwPUNIS0oyMDE5VzogVGhpcyBjbGFzcyBtdXN0IGJlIGEgbGVnYWwgVmFsdWUgVHlwZSBpbiBSTUktSUlPUCAoRUpCIDIuMDogOS44LCAxMi4yLjEyKS4KLQotCi0jIyMKLSMgbWV0aG9kcyB3aGljaCBtdXN0IGV4aXN0Ci0jIyMKLSMgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXJzCi1DSEtKMjA1MC5jb25zdHIuc2IuZWpiMjA9Q0hLSjIwNTBXOiBwdWJsaWMgezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuMikuCi1DSEtKMjA1MC5jb25zdHIuY2IuZWpiMjA9Q0hLSjIwNTBXOiBwdWJsaWMgezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4yKS4KLUNIS0oyMDUwLmNvbnN0ci5iYi5lamIyMD1DSEtKMjA1MFc6IHB1YmxpYyB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEsIDEyLjIuMikuCi1DSEtKMjA1MC5jb25zdHIubWIuZWpiMjA9Q0hLSjIwNTBXOiBwdWJsaWMgezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDE1LjcuMikuCi1DSEtKMjA1MC5jb25zdHIua2MuZWpiMjA9Q0hLSjIwNTBXOiBwdWJsaWMgezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjguMikuCi0KLQotIyBhY2Nlc3NvciBtZXRob2QKLUNIS0oyMDUwLmFjYy5jYi5lamIyMD1DSEtKMjA1MEU6IFRoaXMgY2xhc3MgbXVzdCBkZWZpbmUgezB9IChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjA1MC5vbk1lc3NhZ2UubWIuZWpiMjA9Q0hLSjIwNTBXOiBvbk1lc3NhZ2UoamF2YXguam1zLk1lc3NhZ2UpIG11c3QgZXhpc3QgKEVKQiAyLjA6IDE1LjQuMiwgMTUuNy40KS4KLQotQ0hLSjIwNTAuZWpiQ3JlYXRlLnNmYi5lamIyMD1DSEtKMjA1MFc6IEF0IGxlYXN0IG9uZSBlamJDcmVhdGUgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDcuNS41KS4KLUNIS0oyMDUwLmVqYkNyZWF0ZS5zc2IuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiQ3JlYXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDcuOCkuCi1DSEtKMjA1MC5lamJDcmVhdGUubWIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiQ3JlYXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDE1LjQuNCwgMTUuNy4yKS4KLQotQ0hLSjIwNTAuZWpiRmluZEJ5UHJpbWFyeUtleS5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4yLjUpLgotCi1DSEtKMjA1MC5zZXRFbnRpdHlDb250ZXh0LmNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIHNldEVudGl0eUNvbnRleHQoRW50aXR5Q29udGV4dCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5zZXRFbnRpdHlDb250ZXh0LmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIHNldEVudGl0eUNvbnRleHQoRW50aXR5Q29udGV4dCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLQotQ0hLSjIwNTAudW5zZXRFbnRpdHlDb250ZXh0LmNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIHVuc2V0RW50aXR5Q29udGV4dCgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAudW5zZXRFbnRpdHlDb250ZXh0LmJiLmVqYjIwPUNIS0oyMDUwVzogVGhlIHVuc2V0RW50aXR5Q29udGV4dCgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyMDUwLmVqYkFjdGl2YXRlLmNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkFjdGl2YXRlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJBY3RpdmF0ZS5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJBY3RpdmF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyMDUwLmVqYlBhc3NpdmF0ZS5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJQYXNzaXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLmVqYlBhc3NpdmF0ZS5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJQYXNzaXZhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjIwNTAuZWpiUGFzc2l2YXRlLnNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlBhc3NpdmF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjUuMSkuCi0KLUNIS0oyMDUwLmVqYlJlbW92ZS5jYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJSZW1vdmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLmVqYlJlbW92ZS5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJSZW1vdmUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjIwNTAuZWpiUmVtb3ZlLm1iLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlJlbW92ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjIwNTAuZWpiUmVtb3ZlLnNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlJlbW92ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA0LjIuMiwgNy41LjEpLgotCi1DSEtKMjA1MC5lamJMb2FkLmNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYkxvYWQoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyMDUwLmVqYkxvYWQuYmIuZWpiMjA9Q0hLSjIwNTBXOiBUaGUgZWpiTG9hZCgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyMDUwLmVqYlN0b3JlLmNiLmVqYjIwPUNIS0oyMDUwVzogVGhlIGVqYlN0b3JlKCkgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjA1MC5lamJTdG9yZS5iYi5lamIyMD1DSEtKMjA1MFc6IFRoZSBlamJTdG9yZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyMDUwLmNyZWF0ZS5zc3JoLmVqYjIwPUNIS0oyMDUwVzogVGhlIGNyZWF0ZSgpIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA3LjgsIDcuMTAuNikuCi1DSEtKMjA1MC5jcmVhdGUuc3NsaC5lamIyMD1DSEtKMjA1MFc6IFRoZSBjcmVhdGUoKSBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogNy44LCA3LjEwLjgpLgotCi1DSEtKMjA1MC5jcmVhdGUuc3JoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGNyZWF0ZSBtZXRob2QgKEVKQiAyLjA6IDYuMy4xLCA3LjEwLjYpLgotQ0hLSjIwNTAuY3JlYXRlLnNsaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBjcmVhdGUgbWV0aG9kIChFSkIgMi4wOiA2LjQuMSwgNy4xMC44KS4KLQotQ0hLSjIwNTAuZmluZC5jcmguZWpiMjA9Q0hLSjIwNTBXOiBBdCBsZWFzdCBvbmUgZmluZGVyIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjUuMikuCi1DSEtKMjA1MC5maW5kLmJyaC5lamIyMD1DSEtKMjA1MFc6IEF0IGxlYXN0IG9uZSBmaW5kZXIgbWV0aG9kIG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNS4yKS4KLUNIS0oyMDUwLmZpbmQuY2xoLmVqYjIwPUNIS0oyMDUwVzogQXQgbGVhc3Qgb25lIGZpbmRlciBtZXRob2QgbXVzdCBleGlzdCAoRUpCIDIuMDogOS42LjIpLgotQ0hLSjIwNTAuZmluZC5ibGguZWpiMjA9Q0hLSjIwNTBXOiBBdCBsZWFzdCBvbmUgZmluZGVyIG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjYuMikuCi0KLUNIS0oyMDUwLmhvbWUuY3JoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjUuNCkuCi1DSEtKMjA1MC5ob21lLmJyaC5lamIyMD1DSEtKMjA1MFc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBob21lIG1ldGhvZCAoRUpCIDIuMDogOS41LjQpLgotQ0hLSjIwNTAuaG9tZS5jbGguZWpiMjA9Q0hLSjIwNTBXOiBUaGlzIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgaG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNi40KS4KLUNIS0oyMDUwLmhvbWUuYmxoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGhvbWUgbWV0aG9kIChFSkIgMi4wOiA5LjYuNCkuCi0KLUNIS0oyMDUwLmVqYkhvbWUuY3JoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgZWpiSG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNS40KS4KLUNIS0oyMDUwLmVqYkhvbWUuYnJoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgZWpiSG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNS40KS4KLUNIS0oyMDUwLmVqYkhvbWUuY2xoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgZWpiSG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNi40KS4KLUNIS0oyMDUwLmVqYkhvbWUuYmxoLmVqYjIwPUNIS0oyMDUwVzogVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgZWpiSG9tZSBtZXRob2QgKEVKQiAyLjA6IDkuNi40KS4KLQotQ0hLSjIwNTAuaGFzaENvZGUua2IuZWpiMjA9Q0hLSjIwNTBXOiBoYXNoQ29kZSgpIG11c3QgZXhpc3Qgb24gdGhpcyBjbGFzcyAoRUpCIDIuMDogMTIuMi4xMikuCi1DSEtKMjA1MC5oYXNoQ29kZS5rYy5lamIyMD1DSEtKMjA1MFc6IGhhc2hDb2RlKCkgbXVzdCBleGlzdCBvbiB0aGlzIGNsYXNzIChFSkIgMi4wOiAxMC42LjEzKS4KLQotQ0hLSjIwNTAuZXF1YWxzLmtiLmVqYjIwPUNIS0oyMDUwVzogZXF1YWxzKE9iamVjdCkgbXVzdCBleGlzdCBvbiB0aGlzIGNsYXNzIChFSkIgMi4wOiAxMi4yLjEyKS4KLUNIS0oyMDUwLmVxdWFscy5rYy5lamIyMD1DSEtKMjA1MFc6IGVxdWFscyhPYmplY3QpIG11c3QgZXhpc3Qgb24gdGhpcyBjbGFzcyAoRUpCIDIuMDogMTAuNi4xMykuCi0KLSMgZWpiU2VsZWN0IC0gbmVlZGVkPyBwbDE3NCBzYXlzIHplcm8gb3IgbW9yZSwgcC4xOTMgc2F5cyBvbmUgb3IgbW9yZQotQ0hLSjIwNTAuZWpiU2VsZWN0LmNiLmVqYjIwPUNIS0oyMDUwVzogQW4gZWpiU2VsZWN0IG1ldGhvZCBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjYuNykuCi0KLUNIS0oyMDUwLmZpbmRCeVByaW1hcnlLZXkuY3JoLmVqYjIwPUNIS0oyMDUwVzogZmluZEJ5UHJpbWFyeUtleSBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjA1MC5maW5kQnlQcmltYXJ5S2V5LmNsaC5lamIyMD1DSEtKMjA1MFc6IGZpbmRCeVByaW1hcnlLZXkgbXVzdCBleGlzdCAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotQ0hLSjIwNTAuZmluZEJ5UHJpbWFyeUtleS5ibGguZWpiMjA9Q0hLSjIwNTBXOiBmaW5kQnlQcmltYXJ5S2V5IG11c3QgZXhpc3QgKEVKQiAyLjA6IDkuNi4yLCAxMi4yLjExKS4KLUNIS0oyMDUwLmZpbmRCeVByaW1hcnlLZXkuYnJoLmVqYjIwPUNIS0oyMDUwVzogZmluZEJ5UHJpbWFyeUtleSBtdXN0IGV4aXN0IChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLQotIyBlamJGaW5kCi1DSEtKMjA1MC5lamJGaW5kLmJiLmVqYjIwPUNIS0oyMDUwVzogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLQotQ0hLSjIwNTAuZWpiUG9zdENyZWF0ZS5jYi5lamIyMD1DSEtKMjA1MEU6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjIwNTAuZWpiUG9zdENyZWF0ZS5iYi5lamIyMD1DSEtKMjA1MEU6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAxMi4xLjQuMSwgMTIuMi40KS4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBtZXRob2QgY2hlY2tzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhcHBsaWNhdGlvbiBleGNlcHRpb24KLUNIS0oyNDA0LmkuZWpiMjA9Q0hLSjI0MDRXOiBBcHBsaWNhdGlvbiBleGNlcHRpb24gezF9IG9uIHswfSBtdXN0IGV4dGVuZCBqYXZhLmxhbmcuRXhjZXB0aW9uIChFSkIgMi4wOiAxOC4xLjEsIDE4LjIuMSkuCi1DSEtKMjQwNC5tLmVqYjIwPUNIS0oyNDA0VzogQXBwbGljYXRpb24gZXhjZXB0aW9uIHswfSBtdXN0IGV4dGVuZCBqYXZhLmxhbmcuRXhjZXB0aW9uIChFSkIgMi4wOiAxOC4xLjEsIDE4LjIuMSkuCi1DSEtKMjQxNi5pLmVqYjIwPUNIS0oyNDE2VzogQXBwbGljYXRpb24gZXhjZXB0aW9uIHsxfSBvbiB7MH0gbXVzdCBub3QgZXh0ZW5kIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIChFSkIgMi4wOiAxOC4xLjEsIDE4LjIuMSkuCi1DSEtKMjQxNi5tLmVqYjIwPUNIS0oyNDE2VzogQXBwbGljYXRpb24gZXhjZXB0aW9uIHswfSBtdXN0IG5vdCBleHRlbmQgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gKEVKQiAyLjA6IDE4LjEuMSwgMTguMi4xKS4KLQotIyBlamJSZW1vdmUKLUNIS0oyNDkyLm1iLmkuZWpiMjA9Q0hLSjI0OTJXOiB7MH0gb24gezF9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI0OTIubWIubS5lamIyMD1DSEtKMjQ5Mlc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI0OTIuY2IuaS5lamIyMD1DSEtKMjQ5Mlc6IHswfSBvbiB7MX0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjQ5Mi5jYi5tLmVqYjIwPUNIS0oyNDkyVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjQ5Mi5iYi5pLmVqYjIwPUNIS0oyNDkyVzogezB9IG9uIHsxfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0OTIuYmIubS5lamIyMD1DSEtKMjQ5Mlc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjQ5Mi5zYi5pLmVqYjIwPUNIS0oyNDkyVzogezB9IG9uIHsxfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy42KS4KLUNIS0oyNDkyLnNiLm0uZWpiMjA9Q0hLSjI0OTJXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy42KS4KLQotQ0hLSjI0OTMubWIuaS5lamIyMD1DSEtKMjQ5M1c6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDkzLm1iLm0uZWpiMjA9Q0hLSjI0OTNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDkzLmNiLmkuZWpiMjA9Q0hLSjI0OTNXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjQ5My5jYi5tLmVqYjIwPUNIS0oyNDkzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjUuMikuCi1DSEtKMjQ5My5iYi5pLmVqYjIwPUNIS0oyNDkzVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjQ5My5iYi5tLmVqYjIwPUNIS0oyNDkzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEyLjEuNC4xKS4KLUNIS0oyNDkzLnNiLmkuZWpiMjA9Q0hLSjI0OTNXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuNikuCi1DSEtKMjQ5My5zYi5tLmVqYjIwPUNIS0oyNDkzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuNikuCi0KLUNIS0oyNDk0Lm1iLmkuZWpiMjA9Q0hLSjI0OTRXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxNS43LjUpLgotQ0hLSjI0OTQubWIubS5lamIyMD1DSEtKMjQ5NFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTUuNy41KS4KLUNIS0oyNDk0LmNiLmkuZWpiMjA9Q0hLSjI0OTRXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI0OTQuY2IubS5lamIyMD1DSEtKMjQ5NFc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNS4yKS4KLUNIS0oyNDk0LmJiLmkuZWpiMjA9Q0hLSjI0OTRXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjQ5NC5iYi5tLmVqYjIwPUNIS0oyNDk0VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjQ5NC5zYi5pLmVqYjIwPUNIS0oyNDk0VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogNy42KS4KLUNIS0oyNDk0LnNiLm0uZWpiMjA9Q0hLSjI0OTRXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDcuNikuCi0KLUNIS0oyNTA1LmVqYlJlbW92ZS5tYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjUwNS5lamJSZW1vdmUubWIubS5lamIyMD1DSEtKMjUwNVc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDE1LjcuNSkuCi1DSEtKMjUwNS5lamJSZW1vdmUuY2IuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLmNiLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMC41LjIpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLmJiLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLmJiLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMi4xLjQuMSkuCi1DSEtKMjUwNS5lamJSZW1vdmUuc2IuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiA3LjYpLgotQ0hLSjI1MDUuZWpiUmVtb3ZlLnNiLm0uZWpiMjA9Q0hLSjI1MDVXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiA3LjYpLgotCi0jIGVqYkNyZWF0ZQotQ0hLSjI0MjEubWIuaS5lamIyMD1DSEtKMjQyMVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy4zKS4KLUNIS0oyNDIxLmNiLmkuZWpiMjA9Q0hLSjI0MjFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMS5iYi5pLmVqYjIwPUNIS0oyNDIxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjEuc2IuaS5lamIyMD1DSEtKMjQyMVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDIxLm1iLm0uZWpiMjA9Q0hLSjI0MjFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTUuNy4zKS4KLUNIS0oyNDIxLmNiLm0uZWpiMjA9Q0hLSjI0MjFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDIxLmJiLm0uZWpiMjA9Q0hLSjI0MjFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIxLnNiLm0uZWpiMjA9Q0hLSjI0MjFXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogNy4xMC4zKS4KLQotQ0hLSjI0MjIuc2IuaS5lamIyMD1DSEtKMjQyMlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDIyLmNiLmkuZWpiMjA9Q0hLSjI0MjJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQyMi5iYi5pLmVqYjIwPUNIS0oyNDIyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjIubWIuaS5lamIyMD1DSEtKMjQyMlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy4zKS4KLUNIS0oyNDIyLnNiLm0uZWpiMjA9Q0hLSjI0MjJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDIyLmNiLm0uZWpiMjA9Q0hLSjI0MjJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDIyLmJiLm0uZWpiMjA9Q0hLSjI0MjJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNDIyLm1iLm0uZWpiMjA9Q0hLSjI0MjJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTUuNy4zKS4KLQotQ0hLSjI0MjMuc2IuaS5lamIyMD1DSEtKMjQyM1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjQyMy5jYi5pLmVqYjIwPUNIS0oyNDIzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDIzLmJiLmkuZWpiMjA9Q0hLSjI0MjNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjMubWIuaS5lamIyMD1DSEtKMjQyM1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDE1LjcuMykuCi1DSEtKMjQyMy5zYi5tLmVqYjIwPUNIS0oyNDIzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI0MjMuY2IubS5lamIyMD1DSEtKMjQyM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDIzLmJiLm0uZWpiMjA9Q0hLSjI0MjNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyMy5tYi5tLmVqYjIwPUNIS0oyNDIzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxNS43LjMpLgotCi1DSEtKMjQyNC5jYi5pLmVqYjIwPUNIS0oyNDI0VzogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDI0LmJiLmkuZWpiMjA9Q0hLSjI0MjRXOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiAxMi4yLjMpLgotQ0hLSjI0MjQuc2IuaS5lamIyMD1DSEtKMjQyNFc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiA3LjEwLjMpLgotQ0hLSjI0MjQubWIuaS5lamIyMD1DSEtKMjQyNFc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjMpLgotQ0hLSjI0MjQuY2IubS5lamIyMD1DSEtKMjQyNFc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNDI0LmJiLm0uZWpiMjA9Q0hLSjI0MjRXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEyLjIuMykuCi1DSEtKMjQyNC5zYi5tLmVqYjIwPUNIS0oyNDI0VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNDI0Lm1iLm0uZWpiMjA9Q0hLSjI0MjRXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxNS43LjMpLgotCi0KLQotIyBlamJDcmVhdGUncyBtZXRob2QgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGUKLUNIS0oyNTAwLmVqYkNyZWF0ZS5zYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC4zKS4KLUNIS0oyNTAwLmVqYkNyZWF0ZS5jYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi40KS4KLUNIS0oyNTAwLmVqYkNyZWF0ZS5iYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi4zKS4KLUNIS0oyNTAwLmVqYkNyZWF0ZS5zYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuMykuCi1DSEtKMjUwMC5lamJDcmVhdGUuY2IubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjQpLgotQ0hLSjI1MDAuZWpiQ3JlYXRlLmJiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi4zKS4KLQotQ0hLSjI0OTcuY2IuaS5lamIyMD1DSEtKMjQ5N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNCkuCi1DSEtKMjQ5Ny5jYi5tLmVqYjIwPUNIS0oyNDk3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjQpLgotCi1DSEtKMjUwMS5lamJDcmVhdGUubWIuaS5lamIyMD1DSEtKMjUwMUk6IHswfSBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIChFSkIgMi4wOiAxNS43LjMsIDE4LjEuMSwgMTguMi4xLCAxOC4zLjIpLgotQ0hLSjI1MDEuZWpiQ3JlYXRlLm1iLm0uZWpiMjA9Q0hLSjI1MDFJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIChFSkIgMi4wOiAxNS43LjMsIDE4LjEuMSwgMTguMi4xLCAxOC4zLjIpLgotQ0hLSjI1MDEuZWpiUmVtb3ZlLm1iLmkuZWpiMjA9Q0hLSjI1MDFJOiB7MH0gbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucyAoRUpCIDIuMDogMTUuNy41LCAxOC4xLjEsIDE4LjIuMSwgMTguMy4yKS4KLUNIS0oyNTAxLmVqYlJlbW92ZS5tYi5tLmVqYjIwPUNIS0oyNTAxSTogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucyAoRUpCIDIuMDogMTUuNy41LCAxOC4xLjEsIDE4LjIuMSwgMTguMy4yKS4KLUNIS0oyNTAxLm9uTWVzc2FnZS5tYi5pLmVqYjIwPUNIS0oyNTAxSTogezB9IG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKEVKQiAyLjA6IDE1LjQuMTAsIDE1LjcuNCwgMTguMS4xLCAxOC4yLjEsIDE4LjMuMikuCi1DSEtKMjUwMS5vbk1lc3NhZ2UubWIubS5lamIyMD1DSEtKMjUwMUk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKEVKQiAyLjA6IDE1LjQuMTAsIDE1LjcuNCwgMTguMS4xLCAxOC4yLjEsIDE4LjMuMikuCi0KLQotQ0hLSjI1MDMuZWpiQ3JlYXRlLnNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjMsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJDcmVhdGUuY2IuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkNyZWF0ZS5iYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi4zLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiQ3JlYXRlLnNiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuMywgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkNyZWF0ZS5jYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjQsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5lamJDcmVhdGUuYmIubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi4zLCAxOC4zLjgsIDE4LjYpLgotCi0jIGVqYlBvc3RDcmVhdGUKLUNIS0oyNDI2LmNiLmkuZWpiMjA9Q0hLSjI0MjZXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjQyNi5iYi5pLmVqYjIwPUNIS0oyNDI2VzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjQpLgotQ0hLSjI0MjYuY2IubS5lamIyMD1DSEtKMjQyNlc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjYuYmIubS5lamIyMD1DSEtKMjQyNlc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMi4yLjQpLgotCi1DSEtKMjQyNy5jYi5pLmVqYjIwPUNIS0oyNDI3VzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjUpLgotQ0hLSjI0MjcuYmIuaS5lamIyMD1DSEtKMjQyN1c6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi40KS4KLUNIS0oyNDI3LmNiLm0uZWpiMjA9Q0hLSjI0MjdXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNDI3LmJiLm0uZWpiMjA9Q0hLSjI0MjdXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi40KS4KLQotQ0hLSjI0MjguY2IuaS5lamIyMD1DSEtKMjQyOFc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjQyOC5iYi5pLmVqYjIwPUNIS0oyNDI4VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi40KS4KLUNIS0oyNDI4LmNiLm0uZWpiMjA9Q0hLSjI0MjhXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuNSkuCi1DSEtKMjQyOC5iYi5tLmVqYjIwPUNIS0oyNDI4VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjQpLgotCi1DSEtKMjUwNS5lamJQb3N0Q3JlYXRlLmNiLmkuZWpiMjA9Q0hLSjI1MDVXOiB7MH0gbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNTA1LmVqYlBvc3RDcmVhdGUuYmIuaS5lamIyMD1DSEtKMjUwNVc6IHswfSBtdXN0IHJldHVybiB2b2lkIChFSkIgMi4wOiAxMi4yLjQpLgotQ0hLSjI1MDUuZWpiUG9zdENyZWF0ZS5jYi5tLmVqYjIwPUNIS0oyNTA1VzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZCAoRUpCIDIuMDogMTAuNi41KS4KLUNIS0oyNTA1LmVqYlBvc3RDcmVhdGUuYmIubS5lamIyMD1DSEtKMjUwNVc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDEyLjIuNCkuCi0KLUNIS0oyNTAzLmVqYlBvc3RDcmVhdGUuY2IuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYlBvc3RDcmVhdGUuYmIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYlBvc3RDcmVhdGUuY2IubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi41LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiUG9zdENyZWF0ZS5iYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjQsIDE4LjMuOCwgMTguNikuCi0KLQotIyBlamJIb21lCi1DSEtKMjQzMC5jYi5pLmVqYjIwPUNIS0oyNDMwSTogezF9IG11c3QgZXhpc3QgZm9yIHswfSB0byBiZSBjYWxsZWQgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi42KS4KLUNIS0oyNDMwLmJiLmkuZWpiMjA9Q0hLSjI0MzBJOiB7MX0gbXVzdCBleGlzdCBmb3IgezB9IHRvIGJlIGNhbGxlZCAoRUpCIDIuMDogMTIuMS40LjEpLgotQ0hLSjI0MzAuY2IubS5lamIyMD1DSEtKMjQzMEk6IHswfSBtdXN0IGV4aXN0IGZvciB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi42KS4KLUNIS0oyNDMwLmJiLm0uZWpiMjA9Q0hLSjI0MzBJOiB7MH0gbXVzdCBleGlzdCBmb3IgdGhpcyBtZXRob2QgdG8gYmUgY2FsbGVkIChFSkIgMi4wOiAxMi4xLjQuMSkuCi0KLUNIS0oyNDMxLmNiLmkuZWpiMjA9Q0hLSjI0MzFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNikuCi1DSEtKMjQzMS5iYi5pLmVqYjIwPUNIS0oyNDMxVzogezB9IG11c3QgYmUgcHVibGljLiAgKEVKQiAyLjA6IDEyLjIuNikuCi1DSEtKMjQzMS5jYi5tLmVqYjIwPUNIS0oyNDMxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuNikuCi1DSEtKMjQzMS5iYi5tLmVqYjIwPUNIS0oyNDMxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuICAoRUpCIDIuMDogMTIuMi42KS4KLQotQ0hLSjI0MzkuY2IuaS5lamIyMD1DSEtKMjQzOVc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuNikuCi1DSEtKMjQzOS5iYi5pLmVqYjIwPUNIS0oyNDM5VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTIuMi42KS4KLUNIS0oyNDM5LmNiLm0uZWpiMjA9Q0hLSjI0MzlXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuNikuCi1DSEtKMjQzOS5iYi5tLmVqYjIwPUNIS0oyNDM5VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjYpLgotCi1DSEtKMjUwMC5lamJIb21lLmNiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI1MDAuZWpiSG9tZS5iYi5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTIuMi42KS4KLUNIS0oyNTAwLmVqYkhvbWUuY2IubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjYpLgotQ0hLSjI1MDAuZWpiSG9tZS5iYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuNikuCi0KLUNIS0oyNTAzLmVqYkhvbWUuY2IuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkhvbWUuYmIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmVqYkhvbWUuY2IubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi42LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiSG9tZS5iYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjYsIDE4LjMuOCwgMTguNikuCi0KLSMgZWpiRmluZAotQ0hLSjI0NTcuYmIuaS5lamIyMD1DSEtKMjQ1N1c6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi41KS4KLUNIS0oyNDU3LmJiLm0uZWpiMjA9Q0hLSjI0NTdXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTIuMi41KS4KLQotQ0hLSjI0NTguYmIuaS5lamIyMD1DSEtKMjQ1OFc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi41KS4KLUNIS0oyNDU4LmJiLm0uZWpiMjA9Q0hLSjI0NThXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi41KS4KLQotQ0hLSjI0NTkuYmIuaS5lamIyMD1DSEtKMjQ1OVc6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEyLjIuNSkuCi1DSEtKMjQ1OS5iYi5tLmVqYjIwPUNIS0oyNDU5VzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjUpLgotCi1DSEtKMjUwMC5lamJGaW5kLmJiLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MH0gb24gbWV0aG9kIHsxfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMi4yLjUpLgotQ0hLSjI1MDAuZWpiRmluZC5iYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuNSkuCi0KLUNIS0oyNDA3LmJiLmkuZWpiMjA9Q0hLSjI0MDdXOiB7MH0gbXVzdCByZXR1cm4gezF9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiAxMi4yLjUpLgotQ0hLSjI0MDcuYmIubS5lamIyMD1DSEtKMjQwN1c6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogMTIuMi41KS4KLQotQ0hLSjI1MDMuZWpiRmluZC5iYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi41LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZWpiRmluZC5iYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4yLjUsIDE4LjMuOCwgMTguNikuCi0KLUNIS0oyNDk4LmJiLmkuZWpiMjA9Q0hLSjI0OThXOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDk4LmJiLm0uZWpiMjA9Q0hLSjI0OThXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotCi0KLSMKLSMgbWV0aG9kcyB3aGljaCBtdXN0IG5vdCBleGlzdAotIwotQ0hLSjI1MDIuZWpiRmluZC5jYi5pLmVqYjIwPUNIS0oyNTAySTogezB9IG11c3Qgbm90IGV4aXN0LiBUaGUgY29udGFpbmVyIHByb3ZpZGVzIHRoaXMgbWV0aG9kIGltcGxlbWVudGF0aW9uIChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMikuCi1DSEtKMjUwMi5lamJGaW5kLmNiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gVGhlIGNvbnRhaW5lciBwcm92aWRlcyB0aGlzIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjIpLgotCi1DSEtKMjUwMi5lamJTZWxlY3QuYmIuaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdC4gT25seSBDTVAgYmVhbnMgbWF5IGhhdmUgZWpiU2VsZWN0IG1ldGhvZHMgKEVKQiAyLjA6IDEyLjEuNSkuCi1DSEtKMjUwMi5lamJTZWxlY3QuYmIubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0LiBPbmx5IENNUCBiZWFucyBtYXkgaGF2ZSBlamJTZWxlY3QgbWV0aG9kcyAgKEVKQiAyLjA6IDEyLjEuNSkuCi1DSEtKMjUwMi5lamJTZWxlY3Quc2ZiLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzIChFSkIgMi4wOiA3LjYuMSkuCi1DSEtKMjUwMi5lamJTZWxlY3Quc2ZiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gT25seSBDTVAgYmVhbnMgbWF5IGhhdmUgZWpiU2VsZWN0IG1ldGhvZHMgIChFSkIgMi4wOiA3LjYuMSkuCi1DSEtKMjUwMi5lamJTZWxlY3Quc3NiLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QuIE9ubHkgQ01QIGJlYW5zIG1heSBoYXZlIGVqYlNlbGVjdCBtZXRob2RzIChFSkIgMi4wOiA3LjguMikuCi1DSEtKMjUwMi5lamJTZWxlY3Quc3NiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gT25seSBDTVAgYmVhbnMgbWF5IGhhdmUgZWpiU2VsZWN0IG1ldGhvZHMgIChFSkIgMi4wOiA3LjguMikuCi1DSEtKMjUwMi5lamJTZWxlY3QuY3JoLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNS43KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5jcmgubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY2xoLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNS43KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5jbGgubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY3JjLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNS43KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5jcmMubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi1DSEtKMjUwMi5lamJTZWxlY3QuY2xjLmkuZWpiMjA9Q0hLSjI1MDJJOiB7MH0gbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDEwLjUuMiwgMTAuNS43KS4KLUNIS0oyNTAyLmVqYlNlbGVjdC5jbGMubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC41LjIsIDEwLjUuNykuCi0KLSMgZmluYWxpemUKLUNIS0oyNTAyLmZpbmFsaXplLmNiLmkuZWpiMjA9Q0hLSjI1MDJJOiBmaW5hbGl6ZSgpIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjI1MDIuZmluYWxpemUuY2IubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiAxMC42LjIpLgotQ0hLSjI1MDIuZmluYWxpemUubWIuaS5lamIyMD1DSEtKMjUwMkk6IGZpbmFsaXplKCkgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDE1LjcuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5tYi5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDE1LjcuMikuCi1DSEtKMjUwMi5maW5hbGl6ZS5iYi5pLmVqYjIwPUNIS0oyNTAySTogZmluYWxpemUoKSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTIuMi4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLmJiLm0uZWpiMjA9Q0hLSjI1MDJJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMTIuMi4yKS4KLUNIS0oyNTAyLmZpbmFsaXplLnNiLmkuZWpiMjA9Q0hLSjI1MDJJOiBmaW5hbGl6ZSgpIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiA3LjEwLjIpLgotQ0hLSjI1MDIuZmluYWxpemUuc2IubS5lamIyMD1DSEtKMjUwMkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IChFSkIgMi4wOiA3LjEwLjIpLgotCi1DSEtKMjUwMi5zbGguaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNTAyLnNsaC5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjUwMi5zcmguaS5lamIyMD1DSEtKMjUwMkk6IHswfSBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAyLnNyaC5tLmVqYjIwPUNIS0oyNTAySTogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3QgKEVKQiAyLjA6IDcuMTAuNikuCi0KLQotIyBidXNpbmVzcwotQ0hLSjI0MTEuc2IuaS5lamIyMD1DSEtKMjQxMVc6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDExLmNiLmkuZWpiMjA9Q0hLSjI0MTFXOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQxMS5iYi5pLmVqYjIwPUNIS0oyNDExVzogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIChFSkIgMi4wOiAxMi4yLjcpLgotQ0hLSjI0MTEuc2IubS5lamIyMD1DSEtKMjQxMVc6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZWpiIiAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDExLmNiLm0uZWpiMjA9Q0hLSjI0MTFXOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQxMS5iYi5tLmVqYjIwPUNIS0oyNDExVzogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIChFSkIgMi4wOiAxMi4yLjcpLgotCi1DSEtKMjQ0MS5zYi5pLmVqYjIwPUNIS0oyNDQxVzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI0NDEuY2IuaS5lamIyMD1DSEtKMjQ0MVc6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDQxLmJiLmkuZWpiMjA9Q0hLSjI0NDFXOiB7MH0gbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuNykuCi1DSEtKMjQ0MS5zYi5tLmVqYjIwPUNIS0oyNDQxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQ0MS5jYi5tLmVqYjIwPUNIS0oyNDQxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0MS5iYi5tLmVqYjIwPUNIS0oyNDQxVzogVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEyLjIuNykuCi0KLUNIS0oyNDQyLnNiLmkuZWpiMjA9Q0hLSjI0NDJXOiB7MH0gbXVzdCBub3QgYmUgZmluYWwgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQ0Mi5jYi5pLmVqYjIwPUNIS0oyNDQyVzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxMC42LjgpLgotQ0hLSjI0NDIuYmIuaS5lamIyMD1DSEtKMjQ0Mlc6IHswfSBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi43KS4KLUNIS0oyNDQyLnNiLm0uZWpiMjA9Q0hLSjI0NDJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDQyLmNiLm0uZWpiMjA9Q0hLSjI0NDJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDQyLmJiLm0uZWpiMjA9Q0hLSjI0NDJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbCAoRUpCIDIuMDogMTIuMi43KS4KLQotQ0hLSjI0NDMuc2IuaS5lamIyMD1DSEtKMjQ0M1c6IHswfSBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjQ0My5jYi5pLmVqYjIwPUNIS0oyNDQzVzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNDQzLmJiLmkuZWpiMjA9Q0hLSjI0NDNXOiB7MH0gbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjcpLgotQ0hLSjI0NDMuc2IubS5lamIyMD1DSEtKMjQ0M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogNy4xMC40KS4KLUNIS0oyNDQzLmNiLm0uZWpiMjA9Q0hLSjI0NDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjQ0My5iYi5tLmVqYjIwPUNIS0oyNDQzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljIChFSkIgMi4wOiAxMi4yLjcpLgotCi1DSEtKMjUwMC5idXMuc2IuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNCkuCi1DSEtKMjUwMC5idXMuY2IuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEwLjYuOCkuCi1DSEtKMjUwMC5idXMuYmIuaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuNykuCi1DSEtKMjUwMC5idXMuc2IubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjQpLgotQ0hLSjI1MDAuYnVzLmNiLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi44KS4KLUNIS0oyNTAwLmJ1cy5iYi5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuNykuCi0KLUNIS0oyNTAzLmJ1cy5zYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC40LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmNiLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjgsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuYmIuaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNywgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5zYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjQsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuY2IubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNi44LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmJiLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuNywgMTguMy44LCAxOC42KS4KLQotIyBvbk1lc3NhZ2UKLUNIS0oyNTAzLm9uTWVzc2FnZS5tYi5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTUuNC4xMCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLm9uTWVzc2FnZS5tYi5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxNS40LjEwLCAxOC4zLjgsIDE4LjYpLgotCi1DSEtKMjQ0NS5tYi5pLmVqYjIwPUNIS0oyNDQ1VzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxNS43LjQpLgotQ0hLSjI0NDUubWIubS5lamIyMD1DSEtKMjQ0NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxNS43LjQpLgotCi1DSEtKMjQ0Ni5tYi5pLmVqYjIwPUNIS0oyNDQ2VzogezB9IG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxNS43LjQpLgotQ0hLSjI0NDYubWIubS5lamIyMD1DSEtKMjQ0Nlc6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsIChFSkIgMi4wOiAxNS43LjQpLgotCi1DSEtKMjQ0Ny5tYi5pLmVqYjIwPUNIS0oyNDQ3VzogezB9IG11c3Qgbm90IGJlIHN0YXRpYyAoRUpCIDIuMDogMTUuNy40KS4KLUNIS0oyNDQ3Lm1iLm0uZWpiMjA9Q0hLSjI0NDdXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMgKEVKQiAyLjA6IDE1LjcuNCkuCi0KLUNIS0oyNTA1Lm9uTWVzc2FnZS5tYi5pLmVqYjIwPUNIS0oyNTA1VzogezB9IG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDE1LjcuNCkuCi1DSEtKMjUwNS5vbk1lc3NhZ2UubWIubS5lamIyMD1DSEtKMjUwNVc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQgKEVKQiAyLjA6IDE1LjcuNCkuCi0KLSMgYWNjZXNzb3IgbWV0aG9kCi1DSEtKMjQ0OS5jYi5pLmVqYjIwPUNIS0oyNDQ5VzogezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC4zLjEpLgotQ0hLSjI0NDkuY2IubS5lamIyMD1DSEtKMjQ0OVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjQ1MC5jYi5pLmVqYjIwPUNIS0oyNDUwVzogezB9IG11c3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEwLjMuMSwgMTAuNi4yKS4KLUNIS0oyNDUwLmNiLm0uZWpiMjA9Q0hLSjI0NTBXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGFic3RyYWN0IChFSkIgMi4wOiAxMC4zLjEsIDEwLjYuMikuCi0KLSMgZ2V0ICYgc2V0IG1ldGhvZHMgb2YgY21yIGZpZWxkcwotQ0hLSjI0NzMuY3JjLmkuZWpiMjA9Q0hLSjI0NzNXOiB7MH0gbXVzdCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzMuY3JjLm0uZWpiMjA9Q0hLSjI0NzNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi1DSEtKMjQ3My5jcmguaS5lamIyMD1DSEtKMjQ3M1c6IHswfSBtdXN0IG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi1DSEtKMjQ3My5jcmgubS5lamIyMD1DSEtKMjQ3M1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLQotIyBob21lCi1DSEtKMjQ2MS5ob21lLmJyaC5lamIyMD1DSEtKMjQ2MVc6IFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcyAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNDYxLmhvbWUuY3JoLmVqYjIwPUNIS0oyNDYxVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzIChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNDYxLmhvbWUuc3JoLmVqYjIwPUNIS0oyNDYxVzogVGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzIChFSkIgMi4wOiA3LjEwLjYpLgotCi1DSEtKMjQ2Mi5jbGguaS5lamIyMD1DSEtKMjQ2Mkk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI0NjIuYnJoLmkuZWpiMjA9Q0hLSjI0NjJJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI0NjIuY3JoLmkuZWpiMjA9Q0hLSjI0NjJJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyKS4KLUNIS0oyNDYyLmJsaC5pLmVqYjIwPUNIS0oyNDYySTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi4xMSkuCi1DSEtKMjQ2Mi5jbGgubS5lamIyMD1DSEtKMjQ2Mkk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiY3JlYXRlIiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI0NjIuYnJoLm0uZWpiMjA9Q0hLSjI0NjJJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI0NjIuY3JoLm0uZWpiMjA9Q0hLSjI0NjJJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImNyZWF0ZSIgKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyKS4KLUNIS0oyNDYyLmJsaC5tLmVqYjIwPUNIS0oyNDYySTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi4xMSkuCi0KLUNIS0oyNDYzLmNsaC5pLmVqYjIwPUNIS0oyNDYzSTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI0NjMuYnJoLmkuZWpiMjA9Q0hLSjI0NjNJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNDYzLmNyaC5pLmVqYjIwPUNIS0oyNDYzSTogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS42LjQsIDEwLjYuMTIpLgotQ0hLSjI0NjMuYmxoLmkuZWpiMjA9Q0hLSjI0NjNJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggImZpbmQiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi4xMSkuCi1DSEtKMjQ2My5jbGgubS5lamIyMD1DSEtKMjQ2M0k6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNDYzLmJyaC5tLmVqYjIwPUNIS0oyNDYzSTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjQ2My5jcmgubS5lamIyMD1DSEtKMjQ2M0k6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiZmluZCIgKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyKS4KLUNIS0oyNDYzLmJsaC5tLmVqYjIwPUNIS0oyNDYzSTogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIiAoRUpCIDIuMDogOS41LjQsIDEyLjIuMTEpLgotCi1DSEtKMjQ2NC5jbGguaS5lamIyMD1DSEtKMjQ2NEk6IFRoZSBuYW1lIG9mIG1ldGhvZCB7MH0gbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI0NjQuYnJoLmkuZWpiMjA9Q0hLSjI0NjRJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI0NjQuY3JoLmkuZWpiMjA9Q0hLSjI0NjRJOiBUaGUgbmFtZSBvZiBtZXRob2QgezB9IG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyKS4KLUNIS0oyNDY0LmJsaC5pLmVqYjIwPUNIS0oyNDY0STogVGhlIG5hbWUgb2YgbWV0aG9kIHswfSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi4xMSkuCi1DSEtKMjQ2NC5jbGgubS5lamIyMD1DSEtKMjQ2NEk6IFRoaXMgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI0NjQuYnJoLm0uZWpiMjA9Q0hLSjI0NjRJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI0NjQuY3JoLm0uZWpiMjA9Q0hLSjI0NjRJOiBUaGlzIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggInJlbW92ZSIgKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyKS4KLUNIS0oyNDY0LmJsaC5tLmVqYjIwPUNIS0oyNDY0STogVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJyZW1vdmUiIChFSkIgMi4wOiA5LjUuNCwgMTIuMi4xMSkuCi0KLUNIS0oyNTAzLmhvbWUuYnJoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI1MDMuaG9tZS5jcmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDMuaG9tZS5zcmguaS5lamIyMD1DSEtKMjUwM0U6IHswfSBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAzLmhvbWUuYmxoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuNCwgMTIuMi4xMSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmhvbWUuY2xoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuNCwgMTAuNi4xMiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmhvbWUuc2xoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5ob21lLmJyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS40LCAxMi4yLjkpLgotQ0hLSjI1MDMuaG9tZS5jcmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMy5ob21lLnNyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMy5ob21lLmJsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuNCwgMTIuMi4xMSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmhvbWUuY2xoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi40LCAxMC42LjEyLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuaG9tZS5zbGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44LCAxOC4zLjgsIDE4LjYpLgotCi0KLSMgY3JlYXRlCi1DSEtKMjUwMy5jcmVhdGUuYnJoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMi4yLjkpLgotQ0hLSjI1MDMuY3JlYXRlLmNyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTAuNi4xMCkuCi1DSEtKMjUwMy5jcmVhdGUuc3JoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMy5jcmVhdGUuYmxoLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTIuMi4xMSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5jbGguaS5lamIyMD1DSEtKMjUwM1c6IHswfSBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMC42LjEyLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuY3JlYXRlLnNsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuY3JlYXRlLmJyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMi4yLjkpLgotQ0hLSjI1MDMuY3JlYXRlLmNyaC5tLmVqYjIwPUNIS0oyNTAzRTogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4xLCAxMC42LjEwKS4KLUNIS0oyNTAzLmNyZWF0ZS5zcmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuY3JlYXRlLmJsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTIuMi4xMSwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmNyZWF0ZS5jbGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjEsIDEwLjYuMTIsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5jcmVhdGUuc2xoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLQotQ0hLSjI0Njcuc3JoLmkuZWpiMjA9Q0hLSjI0NjdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI0Njcuc2xoLmkuZWpiMjA9Q0hLSjI0NjdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI0NjcuY3JoLmkuZWpiMjA9Q0hLSjI0NjdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTAuNi4xMCkuCi1DSEtKMjQ2Ny5jbGguaS5lamIyMD1DSEtKMjQ2N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMC42LjEyKS4KLUNIS0oyNDY3LmJyaC5pLmVqYjIwPUNIS0oyNDY3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEyLjIuOSkuCi1DSEtKMjQ2Ny5ibGguaS5lamIyMD1DSEtKMjQ2N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMi4yLjExKS4KLUNIS0oyNDY3LnNyaC5tLmVqYjIwPUNIS0oyNDY3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI0Njcuc2xoLm0uZWpiMjA9Q0hLSjI0NjdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjQ2Ny5jcmgubS5lamIyMD1DSEtKMjQ2N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI0NjcuY2xoLm0uZWpiMjA9Q0hLSjI0NjdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4xLCAxMC42LjEyKS4KLUNIS0oyNDY3LmJyaC5tLmVqYjIwPUNIS0oyNDY3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMSwgMTIuMi45KS4KLUNIS0oyNDY3LmJsaC5tLmVqYjIwPUNIS0oyNDY3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMSwgMTIuMi4xMSkuCi0KLUNIS0oyNDAyLnNmcmguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDYuMy4xLCA3LjEwLjYpLgotQ0hLSjI0MDIuc2ZsaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNi40LjEsIDcuMTAuOCkuCi1DSEtKMjQwMi5zc3JoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA2LjMuMSwgNy44LCA3LjEwLjYpLgotQ0hLSjI0MDIuc3NsaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogNi40LjEsIDcuOCwgNy4xMC44KS4KLUNIS0oyNDAyLmNyaC5pLmVqYjIwPUNIS0oyNDAyRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS41LjEsIDEwLjYuMTApLgotQ0hLSjI0MDIuY2xoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjYuMSwgMTAuNi4xMikuCi1DSEtKMjQwMi5icmguaS5lamIyMD1DSEtKMjQwMkU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNS4xLCAxMi4yLjkpLgotQ0hLSjI0MDIuYmxoLmkuZWpiMjA9Q0hLSjI0MDJFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjYuMSwgMTIuMi4xMSkuCi1DSEtKMjQwMi5zZnJoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDYuMy4xLCA3LjEwLjYpLgotQ0hLSjI0MDIuc2ZsaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA2LjQuMSwgNy4xMC44KS4KLUNIS0oyNDAyLnNzcmgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogNi4zLjEsIDcuOCwgNy4xMC42KS4KLUNIS0oyNDAyLnNzbGgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogNi40LjEsIDcuOCwgNy4xMC44KS4KLUNIS0oyNDAyLmNyaC5tLmVqYjIwPUNIS0oyNDAyRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjUuMSwgMTAuNi4xMCkuCi1DSEtKMjQwMi5jbGgubS5lamIyMD1DSEtKMjQwMkU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS42LjEsIDEwLjYuMTIpLgotQ0hLSjI0MDIuYnJoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNS4xLCAxMi4yLjkpLgotQ0hLSjI0MDIuYmxoLm0uZWpiMjA9Q0hLSjI0MDJFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNi4xLCAxMi4yLjExKS4KLQotQ0hLSjI0NzYuc3JoLmkuZWpiMjA9Q0hLSjI0NzZFOiB7MH0gbXVzdCBiZSB0aGUgY3JlYXRlKCkgbWV0aG9kIChFSkIgMi4wOiA3LjgsIDcuMTAuNikuCi1DSEtKMjQ3Ni5zbGguaS5lamIyMD1DSEtKMjQ3NkU6IHswfSBtdXN0IGJlIHRoZSBjcmVhdGUoKSBtZXRob2QgKEVKQiAyLjA6IDcuOCwgNy4xMC44KS4KLUNIS0oyNDc2LnNyaC5tLmVqYjIwPUNIS0oyNDc2RTogVGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgY3JlYXRlKCkgbWV0aG9kIChFSkIgMi4wOiA3LjgsIDcuMTAuNikuCi1DSEtKMjQ3Ni5zbGgubS5lamIyMD1DSEtKMjQ3NkU6IFRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIGNyZWF0ZSgpIG1ldGhvZCAoRUpCIDIuMDogNy44LCA3LjEwLjgpLgotQ0hLSjI0NzYuc3NiLmkuZWpiMjA9Q0hLSjI0NzZFOiB7MH0gbXVzdCBiZSB0aGUgZWpiQ3JlYXRlKCkgbWV0aG9kIChFSkIgMi4wOiA3LjgpLgotQ0hLSjI0NzYuc3NiLm0uZWpiMjA9Q0hLSjI0NzZFOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBlamJDcmVhdGUoKSBtZXRob2QgKEVKQiAyLjA6IDcuOCkuCi0KLQotIyByZW1vdGUgY3JlYXRlCi1DSEtKMjUwNC5jcmVhdGUuc3JoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDQuY3JlYXRlLnNsaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogNy4xMC44KS4KLUNIS0oyNTA0LmNyZWF0ZS5jcmguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI1MDQuY3JlYXRlLmNsaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTAuNi4xMikuCi1DSEtKMjUwNC5jcmVhdGUuYnJoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI1MDQuY3JlYXRlLmJsaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTIuMi4xMSkuCi1DSEtKMjUwNC5jcmVhdGUuc3JoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTA0LmNyZWF0ZS5zbGgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiA3LjEwLjgpLgotQ0hLSjI1MDQuY3JlYXRlLmNyaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI1MDQuY3JlYXRlLmNsaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjYuMTIpLgotQ0hLSjI1MDQuY3JlYXRlLmJyaC5tLmVqYjIwPUNIS0oyNTA0VzogVGhlIHswfSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjUwNC5jcmVhdGUuYmxoLm0uZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezB9IG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTIuMi4xMSkuCi0KLUNIS0oyNTAwLmNyZWF0ZS5zcmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMC5jcmVhdGUuY3JoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5jcmVhdGUuYnJoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNTAwLmNyZWF0ZS5zcmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDAuY3JlYXRlLmNyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAwLmNyZWF0ZS5icmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLQotIyBob21lIG1ldGhvZAotQ0hLSjI1MDQuaG9tZS5jcmguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEwLjUuMiwgMTAuNi4xMCkuCi1DSEtKMjUwNC5ob21lLmNsaC5pLmVqYjIwPUNIS0oyNTA0VzogVGhlIHsxfSBtYXRjaGluZyBtZXRob2QgZm9yIHswfSBtdXN0IGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTAuNS4yLCAxMC42LjEyKS4KLUNIS0oyNTA0LmhvbWUuYnJoLmkuZWpiMjA9Q0hLSjI1MDRXOiBUaGUgezF9IG1hdGNoaW5nIG1ldGhvZCBmb3IgezB9IG11c3QgZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI1MDQuaG9tZS5ibGguaS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MX0gbWF0Y2hpbmcgbWV0aG9kIGZvciB7MH0gbXVzdCBleGlzdCBvbiB7Mn0gKEVKQiAyLjA6IDEyLjIuMTEpLgotQ0hLSjI1MDQuaG9tZS5jcmgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMTApLgotQ0hLSjI1MDQuaG9tZS5jbGgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC41LjIsIDEwLjYuMTIpLgotQ0hLSjI1MDQuaG9tZS5icmgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI1MDQuaG9tZS5ibGgubS5lamIyMD1DSEtKMjUwNFc6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjExKS4KLQotCi0jIGZpbmQgbWV0aG9kCi1DSEtKMjUwMy5maW5kLmJyaC5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNTAzLmZpbmQuY3JoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNTAzLmZpbmQuc3JoLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMy5maW5kLmJsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5maW5kLmNsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5maW5kLnNsaC5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogNy4xMC44LCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuZmluZC5icmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNTAzLmZpbmQuY3JoLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI1MDMuZmluZC5zcmgubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDMuZmluZC5ibGgubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5maW5kLmNsaC5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMiwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmZpbmQuc2xoLm0uZWpiMjA9Q0hLSjI1MDNXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuOCwgMTguMy44LCAxOC42KS4KLQotQ0hLSjI0NzcuY3JoLmkuZWpiMjA9Q0hLSjI0NzdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNDc3LmJyaC5pLmVqYjIwPUNIS0oyNDc3VzogezB9IG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEpLgotQ0hLSjI0NzcuY2xoLmkuZWpiMjA9Q0hLSjI0NzdXOiB7MH0gbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTAuNi4xMCkuCi1DSEtKMjQ3Ny5ibGguaS5lamIyMD1DSEtKMjQ3N1c6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLUNIS0oyNDc3LmNyaC5tLmVqYjIwPUNIS0oyNDc3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNDc3LmJyaC5tLmVqYjIwPUNIS0oyNDc3VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiA5LjYuMiwgMTIuMi4xMSkuCi1DSEtKMjQ3Ny5jbGgubS5lamIyMD1DSEtKMjQ3N1c6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI0NzcuYmxoLm0uZWpiMjA9Q0hLSjI0NzdXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDkuNi4yLCAxMC42LjEyKS4KLQotQ0hLSjI0NzguY3JoLmkuZWpiMjA9Q0hLSjI0NzhJOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjUuOC40KS4KLUNIS0oyNDc4LmNyaC5tLmVqYjIwPUNIS0oyNDc4STogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjUuOC40KS4KLUNIS0oyNDc4LmNsaC5pLmVqYjIwPUNIS0oyNDc4STogezB9IG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5jbGgubS5lamIyMD1DSEtKMjQ3OEk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMC41LjguNCkuCi1DSEtKMjQ3OC5icmguaS5lamIyMD1DSEtKMjQ3OEk6IHswfSBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotQ0hLSjI0NzguYnJoLm0uZWpiMjA9Q0hLSjI0NzhJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotQ0hLSjI0NzguYmxoLmkuZWpiMjA9Q0hLSjI0NzhJOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDc4LmJsaC5tLmVqYjIwPUNIS0oyNDc4STogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjEuOC40KS4KLUNIS0oyNDc4LmNiLmkuZWpiMjA9Q0hLSjI0NzhJOiB7MH0gbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjUuOC40KS4KLUNIS0oyNDc4LmNiLm0uZWpiMjA9Q0hLSjI0NzhJOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTAuNS44LjQpLgotQ0hLSjI0NzguYmIuaS5lamIyMD1DSEtKMjQ3OEk6IHswfSBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMS44LjQpLgotQ0hLSjI0NzguYmIubS5lamIyMD1DSEtKMjQ3OEk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIChFSkIgMi4wOiAxMi4xLjguNCkuCi0KLUNIS0oyNDAzLmJyaC5pLmVqYjIwPUNIS0oyNDAzVzogezB9IG11c3QgcmV0dXJuIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS41LjIsIDEyLjEuNywgMTIuMi45KS4KLUNIS0oyNDAzLmJsaC5pLmVqYjIwPUNIS0oyNDAzVzogezB9IG11c3QgcmV0dXJuIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS42LjIsIDEyLjEuNywgMTIuMi4xMSkuCi1DSEtKMjQwMy5jcmguaS5lamIyMD1DSEtKMjQwM1c6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNS4yLCAxMC41LjYsIDEwLjYuMTAsIDExLjIuMikuCi1DSEtKMjQwMy5jbGguaS5lamIyMD1DSEtKMjQwM1c6IHswfSBtdXN0IHJldHVybiB7MX0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNi4yLCAxMC41LjYsIDEwLjYuMTIsIDExLjIuMikuCi1DSEtKMjQwMy5icmgubS5lamIyMD1DSEtKMjQwM1c6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogOS41LjIsIDEyLjEuNywgMTIuMi45KS4KLUNIS0oyNDAzLmJsaC5tLmVqYjIwPUNIS0oyNDAzVzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjYuMiwgMTIuMS43LCAxMi4yLjExKS4KLUNIS0oyNDAzLmNyaC5tLmVqYjIwPUNIS0oyNDAzVzogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChFSkIgMi4wOiA5LjUuMiwgMTAuNS42LCAxMC42LjEwLCAxMS4yLjIpLgotQ0hLSjI0MDMuY2xoLm0uZWpiMjA9Q0hLSjI0MDNXOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKEVKQiAyLjA6IDkuNi4yLCAxMC41LjYsIDEwLjYuMTIsIDExLjIuMikuCi0KLSMgcmVtb3RlIGZpbmQKLUNIS0oyNTA0LmZpbmQuYnJoLmkuZWpiMjA9Q0hLSjI1MDRXOiB7MX0gbXVzdCBleGlzdCBvbiB7Mn0gZm9yIHswfSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNTA0LmZpbmQuY3JoLmkuZWpiMjA9Q0hLSjI1MDRXOiB7MX0gbXVzdCBleGlzdCBvbiB7Mn0gZm9yIHswfSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjUwNC5maW5kLmJyaC5tLmVqYjIwPUNIS0oyNTA0VzogezB9IG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI1MDQuZmluZC5jcmgubS5lamIyMD1DSEtKMjUwNFc6IHswfSBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNi4xMCkuCi0KLSMgbG9jYWwgZmluZAotQ0hLSjI1MDQuZmluZC5ibGguaS5lamIyMD1DSEtKMjUwNFc6IHsxfSBtdXN0IGV4aXN0IG9uIHsyfSBmb3IgezB9IChFSkIgMi4wOiAxMi4yLjExKS4KLUNIS0oyNTA0LmZpbmQuY2xoLmkuZWpiMjA9Q0hLSjI1MDRXOiB7MX0gbXVzdCBleGlzdCBvbiB7Mn0gZm9yIHswfSAoRUpCIDIuMDogMTAuNi4yKS4KLUNIS0oyNTA0LmZpbmQuYmxoLm0uZWpiMjA9Q0hLSjI1MDRXOiB7MH0gbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuMTEpLgotQ0hLSjI1MDQuZmluZC5jbGgubS5lamIyMD1DSEtKMjUwNFc6IHswfSBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogMTAuNi4yKS4KLQotCi1DSEtKMjUwMC5maW5kLnNyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAwLmZpbmQuY3JoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTAuNi4xMCkuCi1DSEtKMjUwMC5maW5kLmJyaC5pLmVqYjIwPUNIS0oyNTAwSTogezF9IGluIG1ldGhvZCB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi1DSEtKMjUwMC5maW5kLnNyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjUwMC5maW5kLmNyaC5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAwLmZpbmQuYnJoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEyLjIuOSkuCi0KLUNIS0oyNDk1LmNsaC5pLmVqYjIwPUNIS0oyNDk1STogezB9IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuNS42LCAxMC42LjE0KS4KLUNIS0oyNDk1LmNsaC5tLmVqYjIwPUNIS0oyNDk1STogVGhpcyBtZXRob2QgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC41LjYsIDEwLjYuMTQpLgotQ0hLSjI0OTUuY3JoLmkuZWpiMjA9Q0hLSjI0OTVJOiB7MH0gbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sIChFSkIgMi4wOiAxMC41LjYsIDEwLjYuMTQpLgotQ0hLSjI0OTUuY3JoLm0uZWpiMjA9Q0hLSjI0OTVJOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjUuNiwgMTAuNi4xNCkuCi0KLQotIyBtZXRob2Qgb24gYSBjb21wb25lbnQgaW50ZXJmYWNlCi1DSEtKMjUwMy5idXMuc3JjLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjUwMy5idXMuc2xjLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjcsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuYnJjLmkuZWpiMjA9Q0hLSjI1MDNFOiB7MH0gbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjUwMy5idXMuYmxjLmkuZWpiMjA9Q0hLSjI1MDNXOiB7MH0gbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjEwLCAxMi4yLjEwLCAxOC4zLjgsIDE4LjYpLgotQ0hLSjI1MDMuYnVzLmNyYy5pLmVqYjIwPUNIS0oyNTAzRTogezB9IG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI1MDMuYnVzLmNsYy5pLmVqYjIwPUNIS0oyNTAzVzogezB9IG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS4xMCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5zcmMubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI1MDMuYnVzLnNsYy5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA3LjEwLjcsIDE4LjMuOCwgMTguNikuCi1DSEtKMjUwMy5idXMuYnJjLm0uZWpiMjA9Q0hLSjI1MDNFOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyNTAzLmJ1cy5ibGMubS5lamIyMD1DSEtKMjUwM1c6IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAoRUpCIDIuMDogOS4xMCwgMTIuMi4xMCwgMTguMy44LCAxOC42KS4KLUNIS0oyNTAzLmJ1cy5jcmMubS5lamIyMD1DSEtKMjUwM0U6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI1MDMuYnVzLmNsYy5tLmVqYjIwPUNIS0oyNTAzVzogVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIChFSkIgMi4wOiA5LjEwLCAxOC4zLjgsIDE4LjYpLgotCi0jIG1ldGhvZCBvbiBhIGhvbWUgaW50ZXJmYWNlCi1DSEtKMjQ2NS5icmguaS5lamIyMD1DSEtKMjQ2NVc6IHswfSBtdXN0IHRocm93IHsxfSBmb3IgezJ9IChFSkIgMi4wOiAxMi4yLjkpLgotQ0hLSjI0NjUuYmxoLmkuZWpiMjA9Q0hLSjI0NjVXOiB7MH0gbXVzdCB0aHJvdyB7MX0gZm9yIHsyfSAoRUpCIDIuMDogMTIuMi4xMSkuCi1DSEtKMjQ2NS5jcmguaS5lamIyMD1DSEtKMjQ2NVc6IHswfSBtdXN0IHRocm93IHsxfSBmb3IgezJ9IChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNDY1LmNsaC5pLmVqYjIwPUNIS0oyNDY1VzogezB9IG11c3QgdGhyb3cgezF9IGZvciB7Mn0gKEVKQiAyLjA6IDEwLjYuMTIpLgotQ0hLSjI0NjUuc3JoLmkuZWpiMjA9Q0hLSjI0NjVXOiB7MH0gbXVzdCB0aHJvdyB7MX0gZm9yIHsyfSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNDY1LnNsaC5pLmVqYjIwPUNIS0oyNDY1VzogezB9IG11c3QgdGhyb3cgezF9IGZvciB7Mn0gKEVKQiAyLjA6IDcuMTAuOCkuCi1DSEtKMjQ2NS5icmgubS5lamIyMD1DSEtKMjQ2NVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IGZvciB7MX0gKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjQ2NS5ibGgubS5lamIyMD1DSEtKMjQ2NVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IGZvciB7MX0gKEVKQiAyLjA6IDEyLjIuMTEpLgotQ0hLSjI0NjUuY3JoLm0uZWpiMjA9Q0hLSjI0NjVXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSBmb3IgezF9IChFSkIgMi4wOiAxMC42LjEwKS4KLUNIS0oyNDY1LmNsaC5tLmVqYjIwPUNIS0oyNDY1VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gZm9yIHsxfSAoRUpCIDIuMDogMTAuNi4xMikuCi1DSEtKMjQ2NS5zcmgubS5lamIyMD1DSEtKMjQ2NVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IGZvciB7MX0gKEVKQiAyLjA6IDcuMTAuNikuCi1DSEtKMjQ2NS5zbGgubS5lamIyMD1DSEtKMjQ2NVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IGZvciB7MX0gKEVKQiAyLjA6IDcuMTAuOCkuCi0KLSMgbWV0aG9kIG9uIGEgcmVtb3RlIGhvbWUKLUNIS0oyNTAwLmhvbWUuc3JoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjYpLgotQ0hLSjI1MDAuaG9tZS5jcmguaS5lamIyMD1DSEtKMjUwMEk6IHsxfSBpbiBtZXRob2QgezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDkuNS40LCAxMC42LjEwKS4KLUNIS0oyNTAwLmhvbWUuYnJoLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MX0gaW4gbWV0aG9kIHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLUNIS0oyNTAwLmhvbWUuc3JoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC42KS4KLUNIS0oyNTAwLmhvbWUuY3JoLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogOS41LjQsIDEwLjYuMTApLgotQ0hLSjI1MDAuaG9tZS5icmgubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA5LjUuNCwgMTIuMi45KS4KLQotQ0hLSjI0NjYuc3JjLmkuZWpiMjA9Q0hLSjI0NjZJOiB7MH0gbXVzdCBub3QgZXhwb3NlIHRoZSB7MX0gdHlwZSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDY2LmNyaC5pLmVqYjIwPUNIS0oyNDY2STogezB9IG11c3Qgbm90IGV4cG9zZSB0aGUgezF9IHR5cGUgKEVKQiAyLjA6IDEwLjYuMTApLgotQ0hLSjI0NjYuYnJoLmkuZWpiMjA9Q0hLSjI0NjZJOiB7MH0gbXVzdCBub3QgZXhwb3NlIHRoZSB7MX0gdHlwZSAoRUpCIDIuMDogMTIuMi45KS4KLUNIS0oyNDY2LmNyaC5tLmVqYjIwPUNIS0oyNDY2STogVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZSAoRUpCIDIuMDogMTAuNi4xMCkuCi1DSEtKMjQ2Ni5icmgubS5lamIyMD1DSEtKMjQ2Nkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUgKEVKQiAyLjA6IDEyLjIuOSkuCi1DSEtKMjQ2Ni5zcmMubS5lamIyMD1DSEtKMjQ2Nkk6IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUgKEVKQiAyLjA6IDcuMTAuNSkuCi0KLSMgbWV0aG9kIG9uIGEgcmVtb3RlIGNvbXBvbmVudAotQ0hLSjI0Njguc3JjLmVqYjIwPUNIS0oyNDY4VzogVGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzIChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI0NjguY3JjLmVqYjIwPUNIS0oyNDY4VzogVGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzIChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI0NjguYnJjLmVqYjIwPUNIS0oyNDY4VzogVGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzIChFSkIgMi4wOiAxMi4yLjgpLgotCi1DSEtKMjUwMC5idXMuc3JjLmkuZWpiMjA9Q0hLSjI1MDBJOiB7MH0gaW4gbWV0aG9kIHsxfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI1MDAuYnVzLmNyYy5pLmVqYjIwPUNIS0oyNTAwSTogezB9IGluIG1ldGhvZCB7MX0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyNTAwLmJ1cy5icmMuaS5lamIyMD1DSEtKMjUwMEk6IHswfSBpbiBtZXRob2QgezF9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjUwMC5idXMuc3JjLm0uZWpiMjA9Q0hLSjI1MDBJOiB7MH0gbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNTAwLmJ1cy5jcmMubS5lamIyMD1DSEtKMjUwMEk6IHswfSBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lIChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI1MDAuYnVzLmJyYy5tLmVqYjIwPUNIS0oyNTAwSTogezB9IG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUgKEVKQiAyLjA6IDEyLjIuOCkuCi0KLUNIS0oyNDcyLnNyaC5pLmVqYjIwPUNIS0oyNDcyVzogezF9IGluIG1ldGhvZCB7MH0gY2Fubm90IGJlIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCB0eXBlIChFSkIgMi4wOiA2LjcuMikuCi1DSEtKMjQ3Mi5icmMuaS5lamIyMD1DSEtKMjQ3Mlc6IHswfSBtdXN0IG5vdCBwYXNzIHsxfSBhcyBhbiBhcmd1bWVudCBvciByZXN1bHQgKEVKQiAyLjA6IDkuNy4yLCAxMi4yLjgpLgotQ0hLSjI0NzIuY3JjLmkuZWpiMjA9Q0hLSjI0NzJXOiB7MH0gbXVzdCBub3QgcGFzcyB7MX0gYXMgYW4gYXJndW1lbnQgb3IgcmVzdWx0IChFSkIgMi4wOiA5LjcuMiwgMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzIuYnJjLm0uZWpiMjA9Q0hLSjI0NzJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBwYXNzIHswfSBhcyBhbiBhcmd1bWVudCBvciByZXN1bHQgKEVKQiAyLjA6IDkuNy4yLCAxMi4yLjgpLgotQ0hLSjI0NzIuY3JjLm0uZWpiMjA9Q0hLSjI0NzJXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBwYXNzIHswfSBhcyBhbiBhcmd1bWVudCBvciByZXN1bHQgKEVKQiAyLjA6IDkuNy4yLCAxMC4zLjEsIDEwLjMuMTAuMSkuCi1DSEtKMjQ3Mi5zcmgubS5lamIyMD1DSEtKMjQ3Mlc6IHswfSBjYW5ub3QgYmUgYW4gYXJndW1lbnQgb3IgcmVzdWx0IHR5cGUgKEVKQiAyLjA6IDYuNy4yKS4KLQotIyBtZXRob2Qgb24gYSByZW1vdGUgY29tcG9uZW50IENNUAotQ0hLSjI0NzQuY3JjLmkuZWpiMjA9Q0hLSjI0NzRXOiB7MH0gbXVzdCBub3QgZXhwb3NlIHsxfSAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotQ0hLSjI0NzQuY3JjLm0uZWpiMjA9Q0hLSjI0NzRXOiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleHBvc2UgezB9IChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTAuMSkuCi0KLUNIS0oyNDkwLmNyYy5pLmVqYjIwPUNIS0oyNDkwVzogezB9IG11c3Qgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMC4xKS4KLUNKS0oyNDkwLmNyYy5tLmVqYjIwPUNIS0oyNDkwVzogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZXhwb3NlZCAoRUpCIDIuMDogMTAuMy4xLCAxMC4zLjEwLjEpLgotCi0jIGVqYlNlbGVjdCBtZXRob2QKLUNIS0oyNDg1LmNiLmkuZWpiMjA9Q0hLSjI0ODVXOiB7MH0gbXVzdCBiZSBhYnN0cmFjdCAoRUpCIDIuMDogMTAuNS43LCAxMC42LjcpLgotQ0hLSjI0ODUuY2IubS5lamIyMD1DSEtKMjQ4NVc6IFRoaXMgbWV0aG9kIG11c3QgYmUgYWJzdHJhY3QgKEVKQiAyLjA6IDEwLjUuNywgMTAuNi43KS4KLQotQ0hLSjI0ODcuY2IuaS5lamIyMD1DSEtKMjQ4N1c6IHswfSBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi43KS4KLUNIS0oyNDg3LmNiLm0uZWpiMjA9Q0hLSjI0ODdXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYyAoRUpCIDIuMDogMTAuNi43KS4KLQotQ0hLSjI0ODguY2IuaS5lamIyMD1DSEtKMjQ4OFc6IHswfSBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24gKEVKQiAyLjA6IDEwLjYuNykuCi1DSEtKMjQ4OC5jYi5tLmVqYjIwPUNIS0oyNDg4VzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIChFSkIgMi4wOiAxMC42LjcpLgotCi1DSEtKMjQ4Ni5jYi5pLmVqYjIwPUNIS0oyNDg2VzogezB9IG11c3QgcmV0dXJuIHsxfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogMTAuNS43LCAxMS4yLjIpLgotQ0hLSjI0ODYuY2IubS5lamIyMD1DSEtKMjQ4Nlc6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogMTAuNS43LCAxMS4yLjIpLgotCi1DSEtKMjQ5Ni5jYi5pLmVqYjIwPUNIS0oyNDk2VzogezB9IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbCAoRUpCIDIuMDogMTAuNS43LCAxMC42LjE0KS4KLUNIS0oyNDk2LmNiLm0uZWpiMjA9Q0hLSjI0OTZXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjUuNywgMTAuNi4xNCkuCi0KLSMgY29tcG9uZW50IG1hdGNoaW5nIG1ldGhvZAotQ0hLSjIwMjMuc3JjLmkuZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBuZWVkcyB7MX0gdG8gZXhpc3Qgb24gezJ9IChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjIwMjMuc2xjLmkuZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBuZWVkcyB7MX0gdG8gZXhpc3Qgb24gezJ9IChFSkIgMi4wOiA3LjEwLjcpLgotQ0hLSjIwMjMuYnJjLmkuZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBuZWVkcyB7MX0gdG8gZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMi4yLjgpLgotQ0hLSjIwMjMuYmxjLmkuZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBuZWVkcyB7MX0gdG8gZXhpc3Qgb24gezJ9IChFSkIgMi4wOiAxMi4yLjEwKS4KLUNIS0oyMDIzLmNyYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTAuNi45KS4KLUNIS0oyMDIzLmNsYy5pLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbmVlZHMgezF9IHRvIGV4aXN0IG9uIHsyfSAoRUpCIDIuMDogMTAuNi4xMSkuCi1DSEtKMjAyMy5zcmMubS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjIwMjMuc2xjLm0uZWpiMjA9Q0hLSjIwMjNXOiBUaGUgezB9IG1ldGhvZCBtdXN0IGV4aXN0IG9uIHsxfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyMDIzLmJyYy5tLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjAyMy5ibGMubS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMi4yLjEwKS4KLUNIS0oyMDIzLmNyYy5tLmVqYjIwPUNIS0oyMDIzVzogVGhlIHswfSBtZXRob2QgbXVzdCBleGlzdCBvbiB7MX0gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjAyMy5jbGMubS5lamIyMD1DSEtKMjAyM1c6IFRoZSB7MH0gbWV0aG9kIG11c3QgZXhpc3Qgb24gezF9IChFSkIgMi4wOiAxMC42LjExKS4KLQotQ0hLSjI0NzAuc3JjLmkuZWpiMjA9Q0hLSjI0NzBFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI0NzAuc2xjLmkuZWpiMjA9Q0hLSjI0NzBFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA3LjEwLjcpLgotQ0hLSjI0NzAuY3JjLmkuZWpiMjA9Q0hLSjI0NzBFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI0NzAuY2xjLmkuZWpiMjA9Q0hLSjI0NzBFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiAxMC42LjExKS4KLUNIS0oyNDcwLmJyYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyNDcwLmJsYy5pLmVqYjIwPUNIS0oyNDcwRTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogMTIuMi4xMCkuCi1DSEtKMjQ3MC5zcmMubS5lamIyMD1DSEtKMjQ3MEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogNy4xMC41KS4KLUNIS0oyNDcwLnNsYy5tLmVqYjIwPUNIS0oyNDcwRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA3LjEwLjcpLgotQ0hLSjI0NzAuY3JjLm0uZWpiMjA9Q0hLSjI0NzBFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjQ3MC5jbGMubS5lamIyMD1DSEtKMjQ3MEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogMTAuNi4xMSkuCi1DSEtKMjQ3MC5icmMubS5lamIyMD1DSEtKMjQ3MEU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogMTIuMi44KS4KLUNIS0oyNDcwLmJsYy5tLmVqYjIwPUNIS0oyNDcwRTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiAxMi4yLjEwKS4KLQotQ0hLSjI0NzEuc3JjLmkuZWpiMjA9Q0hLSjI0NzFXOiB7MH0gbXVzdCB0aHJvdyB7MX0gKEVKQiAyLjA6IDcuMTAuNSkuCi1DSEtKMjQ3MS5zbGMuaS5lamIyMD1DSEtKMjQ3MVc6IHswfSBtdXN0IHRocm93IHsxfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyNDcxLmNyYy5pLmVqYjIwPUNIS0oyNDcxVzogezB9IG11c3QgdGhyb3cgezF9IChFSkIgMi4wOiAxMC42LjkpLgotQ0hLSjI0NzEuY2xjLmkuZWpiMjA9Q0hLSjI0NzFXOiB7MH0gbXVzdCB0aHJvdyB7MX0gKEVKQiAyLjA6IDEwLjYuMTEpLgotQ0hLSjI0NzEuYnJjLmkuZWpiMjA9Q0hLSjI0NzFXOiB7MH0gbXVzdCB0aHJvdyB7MX0gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjQ3MS5ibGMuaS5lamIyMD1DSEtKMjQ3MVc6IHswfSBtdXN0IHRocm93IHsxfSAoRUpCIDIuMDogMTIuMi4xMCkuCi1DSEtKMjQ3MS5zcmMubS5lamIyMD1DSEtKMjQ3MVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IChFSkIgMi4wOiA3LjEwLjUpLgotQ0hLSjI0NzEuc2xjLm0uZWpiMjA9Q0hLSjI0NzFXOiBUaGlzIG1ldGhvZCBtdXN0IHRocm93IHswfSAoRUpCIDIuMDogNy4xMC43KS4KLUNIS0oyNDcxLmNyYy5tLmVqYjIwPUNIS0oyNDcxVzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gKEVKQiAyLjA6IDEwLjYuOSkuCi1DSEtKMjQ3MS5jbGMubS5lamIyMD1DSEtKMjQ3MVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IChFSkIgMi4wOiAxMC42LjExKS4KLUNIS0oyNDcxLmJyYy5tLmVqYjIwPUNIS0oyNDcxVzogVGhpcyBtZXRob2QgbXVzdCB0aHJvdyB7MH0gKEVKQiAyLjA6IDEyLjIuOCkuCi1DSEtKMjQ3MS5ibGMubS5lamIyMD1DSEtKMjQ3MVc6IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgezB9IChFSkIgMi4wOiAxMi4yLjEwKS4KLQotIyBFSkJPYmplY3QsIEVKQkxvY2FsT2JqZWN0IG1ldGhvZHMKLUNIS0oyNDY5LnNyYy5pLmVqYjIwPUNIS0oyNDY5VzogezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDYuNSkuCi1DSEtKMjQ2OS5zbGMuaS5lamIyMD1DSEtKMjQ2OVc6IHswfSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA2LjUpLgotQ0hLSjI0NjkuY3JjLmkuZWpiMjA9Q0hLSjI0NjlXOiB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS45KS4KLUNIS0oyNDY5LmNsYy5pLmVqYjIwPUNIS0oyNDY5VzogezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuMTApLgotQ0hLSjI0NjkuYnJjLmkuZWpiMjA9Q0hLSjI0NjlXOiB7MH0gaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS45KS4KLUNIS0oyNDY5LmJsYy5pLmVqYjIwPUNIS0oyNDY5VzogezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIgKEVKQiAyLjA6IDkuMTApLgotQ0hLSjI0Njkuc3JjLm0uZWpiMjA9Q0hLSjI0NjlXOiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA2LjUpLgotQ0hLSjI0Njkuc2xjLm0uZWpiMjA9Q0hLSjI0NjlXOiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA2LjUpLgotQ0hLSjI0NjkuY3JjLm0uZWpiMjA9Q0hLSjI0NjlXOiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjkpLgotQ0hLSjI0NjkuY2xjLm0uZWpiMjA9Q0hLSjI0NjlXOiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyIChFSkIgMi4wOiA5LjEwKS4KLUNIS0oyNDY5LmJyYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS45KS4KLUNIS0oyNDY5LmJsYy5tLmVqYjIwPUNIS0oyNDY5VzogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciAoRUpCIDIuMDogOS4xMCkuCi0KLSMgZmluZEJ5UHJpbWFyeUtleQotQ0hLSjI0NzUuY3JoLmkuZWpiMjA9Q0hLSjI0NzVXOiB7MH0gbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHsxfSkgKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNDc1LmNsaC5pLmVqYjIwPUNIS0oyNDc1VzogezB9IG11c3QgYmUgZmluZEJ5UHJpbWFyeUtleSh7MX0pIChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi1DSEtKMjQ3NS5jcmhkLmkuZWpiMjA9Q0hLSjI0NzVXOiB7MH0gbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KE9iamVjdCkgKEVKQiAyLjA6IDEwLjguMykuCi1DSEtKMjQ3NS5jbGhkLmkuZWpiMjA9Q0hLSjI0NzVXOiB7MH0gbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KE9iamVjdCkgKEVKQiAyLjA6IDEwLjguMykuCi1DSEtKMjQ3NS5icmguaS5lamIyMD1DSEtKMjQ3NVc6IHswfSBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezF9KSAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3NS5ibGguaS5lamIyMD1DSEtKMjQ3NVc6IHswfSBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezF9KSAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEpLgotQ0hLSjI0NzUuY3JoLm0uZWpiMjA9Q0hLSjI0NzVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezB9KSAoRUpCIDIuMDogOS41LjIsIDEwLjYuMTApLgotQ0hLSjI0NzUuY2xoLm0uZWpiMjA9Q0hLSjI0NzVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezB9KSAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotQ0hLSjI0NzUuY3JoZC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KE9iamVjdCkgKEVKQiAyLjA6IDEwLjguMykuCi1DSEtKMjQ3NS5jbGhkLm0uZWpiMjA9Q0hLSjI0NzVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoT2JqZWN0KSAoRUpCIDIuMDogMTAuOC4zKS4KLUNIS0oyNDc1LmJyaC5tLmVqYjIwPUNIS0oyNDc1VzogVGhpcyBtZXRob2QgbXVzdCBiZSBmaW5kQnlQcmltYXJ5S2V5KHswfSkgKEVKQiAyLjA6IDkuNS4yLCAxMi4yLjkpLgotQ0hLSjI0NzUuYmxoLm0uZWpiMjA9Q0hLSjI0NzVXOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGZpbmRCeVByaW1hcnlLZXkoezB9KSAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEpLgotCi1DSEtKMjQ3OS5jcmguaS5lamIyMD1DSEtKMjQ3OUU6IHswfSBtdXN0IHJldHVybiB7MX0gKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNDc5LmNsaC5pLmVqYjIwPUNIS0oyNDc5RTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS42LjIsIDEwLjYuMTIpLgotQ0hLSjI0NzkuYnJoLmkuZWpiMjA9Q0hLSjI0NzlFOiB7MH0gbXVzdCByZXR1cm4gezF9IChFSkIgMi4wOiA5LjUuMiwgMTIuMi45KS4KLUNIS0oyNDc5LmJsaC5pLmVqYjIwPUNIS0oyNDc5RTogezB9IG11c3QgcmV0dXJuIHsxfSAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEpLgotQ0hLSjI0NzkuY3JoLm0uZWpiMjA9Q0hLSjI0NzlFOiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB7MH0gKEVKQiAyLjA6IDkuNS4yLCAxMC42LjEwKS4KLUNIS0oyNDc5LmNsaC5tLmVqYjIwPUNIS0oyNDc5RTogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gezB9IChFSkIgMi4wOiA5LjYuMiwgMTAuNi4xMikuCi1DSEtKMjQ3OS5icmgubS5lamIyMD1DSEtKMjQ3OUU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS41LjIsIDEyLjIuOSkuCi1DSEtKMjQ3OS5ibGgubS5lamIyMD1DSEtKMjQ3OUU6IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSAoRUpCIDIuMDogOS42LjIsIDEyLjIuMTEpLgotCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmllbGQgY2hlY2tzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ0hLSjI0NTIuc2IuaS5lamIyMD1DSEtKMjQ1Mlc6IFRyYW5zaWVudCBmaWVsZCB7MH0gc2hvdWxkIG5vdCBiZSB0aGUgezF9IHR5cGUgKEVKQiAyLjA6IDcuNC4xKS4KLUNIS0oyNDUyLnNiLm0uZWpiMjA9Q0hLSjI0NTJXOiBBIHRyYW5zaWVudCBmaWVsZCBzaG91bGQgbm90IGJlIHRoZSB7MH0gdHlwZSAoRUpCIDIuMDogNy40LjEpLgotCi1DSEtKMjQ1My5zYi5pLmVqYjIwPUNIS0oyNDUzVzogVHJhbnNpZW50IGZpZWxkcyAoezB9KSBhcmUgZGlzY291cmFnZWQgKEVKQiAyLjA6IDcuNC4xKS4KLUNIS0oyNDUzLnNiLm0uZWpiMjA9Q0hLSjI0NTNXOiBUcmFuc2llbnQgZmllbGRzIGFyZSBkaXNjb3VyYWdlZCAoRUpCIDIuMDogNy40LjEpLgotCi0jIENNUiBhbmQgQ01QIGZpZWxkcyBtdXN0IE5PVCBiZSBkZWZpbmVkIG9uIHRoZSBiZWFuIGNsYXNzLgotQ0hLSjI0NTQuY2IuaS5lamIyMD1DSEtKMjQ1NFc6IHswfSBtdXN0IG5vdCBiZSBkZWZpbmVkIChFSkIgMi4wOiAxMC4zLjEpLgotQ0hLSjI0NTQuY2IubS5lamIyMD1DSEtKMjQ1NFc6IHswfSBtdXN0IG5vdCBiZSBkZWZpbmVkIChFSkIgMi4wOiAxMC4zLjEpLgotCi1DSEtKMjQ4MC5jYi5pLmVqYjIwPUNIS0oyNDgwSTogezB9IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgKEVKQiAyLjA6IDEwLjMuMSkuCi1DSEtKMjQ4MC5jYi5tLmVqYjIwPUNIS0oyNDgwSTogezB9IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyNDgxLmNiLmkuZWpiMjA9Q0hLSjI0ODFXOiB7MH0gbXVzdCBiZSBkZWNsYXJlZCBhcyBhIDxjbXAtZmllbGQ+IChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTMpLgotQ0hLSjI0ODEuY2IubS5lamIyMD1DSEtKMjQ4MVc6IHswfSBtdXN0IGJlIGRlY2xhcmVkIGFzIGEgPGNtcC1maWVsZD4gKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMykuCi0KLUNIS0oyNDgyLmNiLmkuZWpiMjA9Q0hLSjI0ODJXOiB7MH0gbXVzdCBiZSBkZWNsYXJlZCBhcyBhIDxjbXItZmllbGQ+IChFSkIgMi4wOiAxMC4zLjEsIDEwLjMuMTMpLgotQ0hLSjI0ODIuY2IubS5lamIyMD1DSEtKMjQ4Mlc6IHswfSBtdXN0IGJlIGRlY2xhcmVkIGFzIGEgPGNtci1maWVsZD4gKEVKQiAyLjA6IDEwLjMuMSwgMTAuMy4xMykuCi0KLUNIS0oyNDgzLmNiLmkuZWpiMjA9Q0hLSjI0ODNXOiB7MH0gc2hvdWxkIG5vdCBiZSBleHBvc2VkIChFSkIgMi4wOiAxMC4zLjEpLgotQ0hLSjI0ODMuY2IubS5lamIyMD1DSEtKMjQ4M1c6IHswfSBzaG91bGQgbm90IGJlIGV4cG9zZWQgKEVKQiAyLjA6IDEwLjMuMSkuCi0KLUNIS0oyNDg0LmNiLmkuZWpiMjA9Q0hLSjI0ODRXOiB7MH0gbXVzdCBiZSBlaXRoZXIgYSBwcmltaXRpdmUgb3IgYSBzZXJpYWxpemFibGUgdHlwZSAoRUpCIDIuMDogMTAuMy4xKS4KLUNIS0oyNDg0LmNiLm0uZWpiMjA9Q0hLSjI0ODRXOiB7MH0gbXVzdCBiZSBlaXRoZXIgYSBwcmltaXRpdmUgb3IgYSBzZXJpYWxpemFibGUgdHlwZSAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjI0ODkuY2IuaS5lamIyMD1DSEtKMjQ4OVc6IEZpZWxkIHswfSBtdXN0IGJlIHRoZSB7MX0gdHlwZSAoRUpCIDIuMDogMTAuOC4xKS4KLUNIS0oyNDg5LmNiLm0uZWpiMjA9Q0hLSjI0ODlXOiBUaGlzIGZpZWxkIG11c3QgYmUgdGhlIHswfSB0eXBlIChFSkIgMi4wOiAxMC44LjEpLgotCi1DSEtKMjIwNS5rYy5pLmVqYjIwPUNIS0oyMjA1VzogRmllbGQgezB9IG11c3QgYmUgcHVibGljIChFSkIgMi4wOiAxMC44LjIpLgotQ0hLSjIyMDUua2MubS5lamIyMD1DSEtKMjIwNVc6IFRoaXMgZmllbGQgbXVzdCBiZSBwdWJsaWMgKEVKQiAyLjA6IDEwLjguMikuCi0KLUNIS0oyMjA2LmtjLmkuZWpiMjA9Q0hLSjIyMDZXOiBGaWVsZCB7MH0gbXVzdCBiZSBhIDxjbXAtZmllbGQ+IChFSkIgMi4wOiAxMC44LjIpLgotQ0hLSjIyMDYua2MubS5lamIyMD1DSEtKMjIwNlc6IFRoaXMgZmllbGQgbXVzdCBiZSBhIDxjbXAtZmllbGQ+IChFSkIgMi4wOiAxMC44LjIpLgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgREQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ0hLSjI4ODAucy5lamIyMD1DSEtKMjg4MFc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWwtaG9tZT4gKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjg4MS5zLmVqYjIwPUNIS0oyODgxVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxob21lPiAoRUpCIDIuMDogNy4xMC4xKS4KLUNIS0oyODgyLnMuZWpiMjA9Q0hLSjI4ODJXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsPiAoRUpCIDIuMDogNy4xMC4xKS4KLUNIS0oyODgzLnMuZWpiMjA9Q0hLSjI4ODNXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPHJlbW90ZT4gKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjg4NC5zLmVqYjIwPUNIS0oyODg0VzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWwtaG9tZT4gb3IgYSA8aG9tZT4gKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjg4NS5zLmVqYjIwPUNIS0oyODg1VzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWw+IG9yIGEgPHJlbW90ZT4gKEVKQiAyLjA6IDcuMTAuMSkuCi1DSEtKMjg4MC5jLmVqYjIwPUNIS0oyODgwVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbC1ob21lPiAoRUpCIDIuMDogMTAuNi4xKS4KLUNIS0oyODgxLmMuZWpiMjA9Q0hLSjI4ODFXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGhvbWU+IChFSkIgMi4wOiAxMC42LjEpLgotQ0hLSjI4ODIuYy5lamIyMD1DSEtKMjg4Mlc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWw+IChFSkIgMi4wOiAxMC42LjEpLgotQ0hLSjI4ODMuYy5lamIyMD1DSEtKMjg4M1c6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8cmVtb3RlPiAoRUpCIDIuMDogMTAuNi4xKS4KLUNIS0oyODg0LmMuZWpiMjA9Q0hLSjI4ODRXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbC1ob21lPiBvciBhIDxob21lPiAoRUpCIDIuMDogMTAuNi4xKS4KLUNIS0oyODg1LmMuZWpiMjA9Q0hLSjI4ODVXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbD4gb3IgYSA8cmVtb3RlPiAoRUpCIDIuMDogMTAuNi4xKS4KLUNIS0oyODgwLmIuZWpiMjA9Q0hLSjI4ODBXOiBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsLWhvbWU+IChFSkIgMi4wOiAxMi4yLjEpLgotQ0hLSjI4ODEuYi5lamIyMD1DSEtKMjg4MVc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8aG9tZT4gKEVKQiAyLjA6IDEyLjIuMSkuCi1DSEtKMjg4Mi5iLmVqYjIwPUNIS0oyODgyVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxsb2NhbD4gKEVKQiAyLjA6IDEyLjIuMSkuCi1DSEtKMjg4My5iLmVqYjIwPUNIS0oyODgzVzogVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxyZW1vdGU+IChFSkIgMi4wOiAxMi4yLjEpLgotQ0hLSjI4ODQuYi5lamIyMD1DSEtKMjg4NFc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsLWhvbWU+IG9yIGEgPGhvbWU+IChFSkIgMi4wOiAxMi4yLjEpLgotQ0hLSjI4ODUuYi5lamIyMD1DSEtKMjg4NVc6IFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgPGxvY2FsPiBvciBhIDxyZW1vdGU+IChFSkIgMi4wOiAxMi4yLjEpLgotCi1DSEtKMjgxMy5lamIyMD1DSEtKMjgxM0k6IDxlamItbmFtZT4gezB9IG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIgKEVKQiAyLjA6IDEwLjMuMTMsIDExLjIuNi4xKS4KLUNIS0oyODE5LmVqYjIwPUNIS0oyODE5STogPGFic3RyYWN0LXNjaGVtYS1uYW1lPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciAoRUpCIDIuMDogMTAuMy4xMywgMTAuNi4xNCwgMTEuMi42LjEpLgotQ0hLSjI4NTQuZWpiMjA9Q0hLSjI4NTRFOiA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IHswfSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIueG1sIGZpbGUgKEVKQiAyLjA6IDEwLjMuMTMsIDEwLjYuMTQsIDExLjIuMikuCi1DSEtKMjg1OC5lamIyMD1DSEtKMjg1OFc6IDxhYnN0cmFjdC1zY2hlbWEtbmFtZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi1DSEtKMjg1OS5lamIyMD1DSEtKMjg1OVc6IFJlc2VydmVkIGlkZW50aWZpZXIgezB9IGNhbm5vdCBiZSB1c2VkIGFzIGFuIDxlamItbmFtZT4gKEVKQiAyLjA6IDEwLjYuMTQsIDExLjIuNi4xKS4KLUNIS0oyODYwLmVqYjIwPUNIS0oyODYwVzogUmVzZXJ2ZWQgaWRlbnRpZmllciB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gPGFic3RyYWN0LXNjaGVtYS1uYW1lPiAoRUpCIDIuMDogMTAuNi4xNCwgMTEuMi42LjEpLgotCi1DSEtKMjg2MS5lamIyMD1DSEtKMjg2MUk6IDxjbXAtZmllbGQ+IHswfSBtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIGFuZCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciAoRUpCIDIuMDogMTAuMy4xLCAxMS4yLjYuMSkuCi1DSEtKMjg1Ny5lamIyMD1DSEtKMjg1N0k6IDxjbXItZmllbGQ+IHswfSBtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIGFuZCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciAoRUpCIDIuMDogMTAuMy4xLCAxMS4yLjYuMSkuCi0KLUNIS0oyODYyLmVqYjIwPUNIS0oyODYySTogPGNtcC1maWVsZD4gezB9IG11c3QgaGF2ZSBhIHNldCBtZXRob2QgKEVKQiAyLjA6IDEwLjMuMSwgMTAuNi4yKS4KLUNIS0oyODYzLmVqYjIwPUNIS0oyODYzSTogPGNtcC1maWVsZD4gezB9IG11c3QgaGF2ZSBhIGdldCBtZXRob2QgKEVKQiAyLjA6IDEwLjMuMSwgMTAuNi4yKS4KLUNIS0oyODY0LmVqYjIwPUNIS0oyODY0STogPGNtci1maWVsZD4gezB9IG11c3QgaGF2ZSBhIHNldCBtZXRob2QgKEVKQiAyLjA6IDEwLjMuMSwgMTAuNi4yKS4KLUNIS0oyODY1LmVqYjIwPUNIS0oyODY1STogPGNtci1maWVsZD4gezB9IG11c3QgaGF2ZSBhIGdldCBtZXRob2QgKEVKQiAyLjA6IDEwLjMuMSwgMTAuNi4yKS4KLUNIS0oyODU1LmVqYjIwPUNIS0oyODU1STogPGNtcC1maWVsZD4gezB9IG11c3QgYmUgYSBKYXZhIHByaW1pdGl2ZSBvciBhIEphdmEgc2VyaWFsaXphYmxlIHR5cGUgKEVKQiAyLjA6IDEwLjMuMSkuCi1DSEtKMjg1Ni5lamIyMD1DSEtKMjg1Nkk6IDxjbXItZmllbGQ+IHswfSBtdXN0IGJlIHRoZSB7MX0gdHlwZSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoRUpCIDIuMDogMTAuMy4xKS4KLQotQ0hLSjI4MTUuZWpiMjA9Q0hLSjI4MTVXOiBEZXBlbmRlbnQgdmFsdWUgY2xhc3MgezB9IGNhbm5vdCBiZSBhIDxjbXItZmllbGQ+IChFSkIgMi4wOiAxMC4zLjMpLgotCi1DSEtKMjgxNi5lamIyMD1DSEtKMjgxNkk6IDxlamItcmVsYXRpb24tbmFtZT4gbXVzdCBiZSB1bmlxdWUgaW4gZWpiLWphci54bWwgKEVKQiAyLjA6IDEwLjMuMiwgMTAuMy4xMywgMjIuNSkuCi1DSEtKMjgxNy5lamIyMD1DSEtKMjgxN0k6IDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4gbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIDxlamItcmVsYXRpb24+IChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMsIDIyLjUpLgotQ0hLSjI4MTguZWpiMjA9Q0hLSjI4MThJOiBUaGUgdmFsdWUgb2YgdGhlIDxtdWx0aXBsaWNpdHk+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIk9uZSIgb3IgIk1hbnkiIChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMsIDIyLjUpLgotQ0hLSjI4MjEuZWpiMjA9Q0hLSjI4MjFJOiA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPiBpbiByb2xlIHswfSBtdXN0IHJlZmVyIHRvIGFuIGV4aXN0aW5nIENNUCBiZWFuIChFSkIgMi4wOiAxMC4zLjIsIDIyLjUpLgotQ0hLSjI4NDguZWpiMjA9Q0hLSjI4NDhJOiA8Y2FzY2FkZS1kZWxldGU+IG11c3QgYmUgdXNlZCB3aXRoIGEgPG11bHRpcGxpY2l0eT4gb2YgIk9uZSIgKEVKQiAyLjA6IDEwLjMuNC4yLCAyMi41KS4KLUNIS0oyODY2LmVqYjIwPUNIS0oyODY2STogPGNtci1maWVsZD4gezB9IG11c3QgYmUgZGVmaW5lZCBvbiB7MX0gKEVKQiAyLjA6IDEwLjMuMiwgMjIuNSkuCi1DSEtKMjg2Ny5lamIyMD1DSEtKMjg2N0k6IFRoaXMgYmVhbiBjYW4gaGF2ZSBvbmx5IHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgYmVhbnMgKEVKQiAyLjA6IDEwLjMuMikuCi1DSEtKMjg2OC5lamIyMD1DSEtKMjg2OEk6IFRoZSB2YWx1ZSBvZiB0aGUgPGNtci1maWVsZC10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIgb3IgImphdmEudXRpbC5TZXQiIChFSkIgMi4wOiAxMC4zLjEzLCAyMi41KS4KLUNIS0oyODY5LmVqYjIwPUNIS0oyODY5STogQXQgbGVhc3Qgb25lIDxlamItcmVsYXRpb25zaGlwLXJvbGU+IG11c3QgZGVmaW5lIGEgPGNtci1maWVsZD4gKEVKQiAyLjA6IDEwLjMuMiwgMTAuMy4xMywgMjIuNSkuCi1DSEtKMjg3MC5lamIyMD1DSEtKMjg3MEk6IDxlamItbmFtZT4gezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDEwLjMuMTMpLgotQ0hLSjI4NzEuZWpiMjA9Q0hLSjI4NzFJOiA8ZWpiLW5hbWU+IHswfSBtdXN0IHJlZmVyIHRvIGEgQ01QIGJlYW4gKEVKQiAyLjA6IDEwLjMuMiwgMTAuMy4xMykuCi0KLUNIS0oyODcyLmVqYjIwPUNIS0oyODcyRTogVGhlIHZhbHVlIG9mIHRoZSA8Y21wLXZlcnNpb24+IGVsZW1lbnQgbXVzdCBiZSBlaXRoZXIgIjEueCIgb3IgIjIueCIgKEVKQiAyLjA6IDIyLjUpLgotQ0hLSjI4NzMuZWpiMjA9Q0hLSjI4NzNXOiBNaWdyYXRlIHRoaXMgYmVhbidzIGRhdGFzb3VyY2UgYmluZGluZyB0byBhIENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZy4KLUNIS0oyODc0LmVqYjIwPUNIS0oyODc0VzogTWlncmF0ZSB0aGlzIEVKQiBtb2R1bGUncyBkZWZhdWx0IGRhdGFzb3VyY2UgYmluZGluZyB0byBhIGRlZmF1bHQgQ01QIENvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgMlRDOiBEbyBub3QgdHJhbnNsYXRlIGFueXRoaW5nIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4gVGhlc2Ugc3RyaW5ncwotIyAgICAgIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBJZ25vcmUgdGhlc2UgbWVzc2FnZXMgZm9yIG5vdzsgdGhlIEVKQiBRTCB2YWxpZGF0b3IgbWF5IHRha2UgY2FyZSBvZiB0aGlzLgotIyBJZiBub3QsIGFkZCB0aGlzIHZhbGlkYXRpb24gaW50byB0aGUgRUpCSmFyVlJ1bGUgY2xhc3MuCi0jCi0jCi0jIElkZW50aWZpY2F0aW9uIHZhcmlhYmxlcwotIwotIyBJV0FENDkyNy5lamIyMD1JV0FENDkyN1c6IElkZW50aWZpY2F0aW9uIHZhcmlhYmxlIHswfSBtdXN0IGJlIGRlY2xhcmVkIGluIHRoZSBGUk9NIGNsYXVzZSAoRUpCIDIuMDogMTEuMi42LjIpLgotIyBJV0FENDkyOC5lamIyMD1JV0FENDkyOFc6IFJlc2VydmVkIGlkZW50aWZpZXIgezB9IGNhbm5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIChFSkIgMi4wOiAxMS4yLjYuMikuCi0jIElXQUQ0OTI5LmVqYjIwPUlXQUQ0OTI5VzogPGFic3RyYWN0LXNjaGVtYS1uYW1lPiB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgKEVKQiAyLjA6IDExLjIuNi4yKS4KLSMgSVdBRDQ5MzAuZWpiMjA9SVdBRDQ5MzBXOiA8ZWpiLW5hbWU+IHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSAoRUpCIDIuMDogMTEuMi42LjIpLgotCi0jCi0jIHF1ZXJ5IHN0YXRlbWVudAotIwotIyBJV0FENDkxOC5lamIyMD1JV0FENDkxOFc6IFRoaXMgcXVlcnkgbXVzdCBjb250YWluIGEgU0VMRUNUIGNsYXVzZSAoRUpCIDIuMDogMTEuMSkuCi0jIElXQUQ0OTE5LmVqYjIwPUlXQUQ0OTE5VzogVGhpcyBxdWVyeSBtdXN0IGNvbnRhaW4gYSBGUk9NIGNsYXVzZSAoRUpCIDIuMDogMTEuMSkuCi0jIElXQUQ0OTIwLmVqYjIwPUlXQUQ0OTIwVzogVGhpcyBxdWVyeSBoYXMgYSBzeW50YXggZXJyb3IgKEVKQiAyLjA6IDExLjIpLgotIwotCi0KLSMgSVdBRDQ4MDguZWpiMjA9SVdBRDQ4MDhXOiBUaGlzIGJlYW4gbXVzdCB1c2UgY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gKEVKQiAyLjA6IDE3LjMuMSwgMTcuMy4zKS4KLSMgSVdBRDQ4MDkuZWpiMjA9SVdBRDQ4MDlXOiBTcGVjaWZ5IGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGZvciB0aGlzIG1ldGhvZCAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ4MTAuZWpiMjA9SVdBRDQ4MTBXOiBBIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBtdXN0IG5vdCBleGlzdCBmb3IgdGhpcyBtZXRob2QgKEVKQiAyLjA6IDE3LjQuMSkuCi0KLSMgSVdBRDQ4MTEuZWpiMjA9SVdBRDQ4MTFXOiBBdCBsZWFzdCBvbmUgPG1ldGhvZD4gbXVzdCBleGlzdCBpbiBhIDxjb250YWluZXItdHJhbnNhY3Rpb24+IChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDkwMC5lamIyMD1JV0FENDkwMFc6IFRoaXMgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4gbXVzdCByZWZlcmVuY2Ugb25seSBvbmUgYmVhbiAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ5MDEuZWpiMjA9SVdBRDQ5MDFXOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMTcuNC4xKQotIyBJV0FENDgxNS5lamIyMD1JV0FENDgxNVc6IE5vIG1ldGhvZHMgb24gezB9IG1hdGNoIHRoaXMgPG1ldGhvZD4gKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0ODE3LmVqYjIwPUlXQUQ0ODE3VzogPHRyYW5zLWF0dHJpYnV0ZT4gaXMgdW5rbm93biAoRUpCIDIuMDogMTcuNC4xKS4KLSMgSVdBRDQ4MTguZWpiMjA9SVdBRDQ4MThXOiBPbmx5IG9uZSBTdHlsZSAxIDxjb250YWluZXItdHJhbnNhY3Rpb24+IG1heSBleGlzdCBmb3IgezB9IChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDgxOS5lamIyMD1JV0FENDgxOVc6IE9ubHkgb25lIFN0eWxlIDIgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4gbWF5IGV4aXN0IGZvciB7MH0gKEVKQiAyLjA6IDE3LjQuMSkuCi0jIElXQUQ0ODIwLmVqYjIwPUlXQUQ0ODIwVzogQXQgbGVhc3Qgb25lIDxtZXRob2QtcGFyYW0+IG11c3QgZXhpc3QgaW4gYSA8bWV0aG9kLXBhcmFtcz4uCi0KLSMgSVdBRDQ4MjEuZWpiMjA9SVdBRDQ4MjFXOiA8ZW52LWVudHJ5LXZhbHVlPiBtdXN0IGJlIGEgezB9IChFSkIgMi4wOiAyMC4yLjEuMiwgMjIuNSkuCi0jIElXQUQ0ODIyLmVqYjIwPUlXQUQ0ODIyVzogPGVudi1lbnRyeS1uYW1lPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4yLjEuMiwgMjIuNSkuCi0jIElXQUQ0ODIzLmVqYjIwPUlXQUQ0ODIzVzogPGVudi1lbnRyeS10eXBlPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4yLjEuMiwgMjIuNSkuCi0jIElXQUQ0ODI0LmVqYjIwPUlXQUQ0ODI0VzogPGVudi1lbnRyeS1uYW1lPiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gezB9IChFSkIgMi4wOiAyMC4yLjEuMikuCi0jIElXQUQ0ODI1LmVqYjIwPUlXQUQ0ODI1VzogPGVudi1lbnRyeS10eXBlPiBtdXN0IGJlIGEgbGVnYWwgdHlwZSAoRUpCIDIuMDogMjAuMi4xLjIsIDIyLjUpLgotIyBJV0FENDgyNi5lamIyMD1JV0FENDgyNlc6IDxlbnYtZW50cnktdmFsdWU+IG11c3QgYmUgYSBTdHJpbmcgb3IgYSBjaGFyYWN0ZXIgKEVKQiAyLjA6IDIwLjIuMS4yKS4KLQotIyBJV0FENDgyOC5lamIyMD1JV0FENDgyOFc6IENvbnZlbnRpb25hbGx5IHRoaXMgcmVmZXJlbmNlIGlzIGxvY2F0ZWQgaW4gdGhlICJlamIiIHN1YmNvbnRleHQgKEVKQiAyLjA6IDIwLjMuMS4xLCAyMi41KS4KLSMgSVdBRDQ4MjkuZWpiMjA9SVdBRDQ4MjlXOiBUaGlzIDxlbnYtZW50cnk+IHNob3VsZCBiZSBpbiBhbiA8ZWpiLXJlZj4gKEVKQiAyLjA6IDIwLjMuMS4yKS4KLSMgSVdBRDQ4MzAuZWpiMjA9SVdBRDQ4MzBXOiBUaGlzIDxlbnYtZW50cnk+IHNob3VsZCBiZSBpbiBhbiA8ZWpiLWxvY2FsLXJlZj4gKEVKQiAyLjA6IDIwLjMuMS4yKS4KLSMgSVdBRDQ4MzEuZWpiMjA9SVdBRDQ4MzFXOiA8ZWpiLXJlZi10eXBlPiBtdXN0IGJlIHswfSAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODMyLmVqYjIwPUlXQUQ0ODMyVzogPGVqYi1yZWY+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzMy5lamIyMD1JV0FENDgzM1c6IDxlamItbG9jYWwtcmVmPiBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4MzQuZWpiMjA9SVdBRDQ4MzRXOiA8aG9tZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMy4xLjIsIDIwLjMuMikuCi0jIElXQUQ0ODM1LmVqYjIwPUlXQUQ0ODM1VzogPGxvY2FsLWhvbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzNi5lamIyMD1JV0FENDgzNlc6IDxyZW1vdGU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzNy5lamIyMD1JV0FENDgzN1c6IDxsb2NhbC1yZW1vdGU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDgzOC5lamIyMD1JV0FENDgzOFc6IDxlamItcmVmPiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gezB9IChFSkIgMi4wOiAyMC4zLjEuMikuCi0jIElXQUQ0ODM5LmVqYjIwPUlXQUQ0ODM5VzogPGVqYi1sb2NhbC1yZWY+IG11c3QgYmUgdW5pcXVlIHdpdGhpbiB7MH0gKEVKQiAyLjA6IDIwLjMuMS4yKS4KLSMgSVdBRDQ4NDAuZWpiMjA9SVdBRDQ4NDBXOiA8aG9tZT4gezB9IGlzIG5vdCB1c2VkIGJ5IGJlYW4gezF9IChFSkIgMi4wOiAyMC4zLjEuMiwgMjAuMy4yKS4KLSMgSVdBRDQ4NDEuZWpiMjA9SVdBRDQ4NDFXOiA8cmVtb3RlPiB7MH0gaXMgbm90IHVzZWQgYnkgYmVhbiB7MX0gKEVKQiAyLjA6IDIwLjMuMS4yLCAyMC4zLjIpLgotIyBJV0FENDg0Mi5lamIyMD1JV0FENDg0Mlc6IDxlamItbGluaz4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjAuMy4xLjIpLgotCi0jIElXQUQ0ODQzLmVqYjIwPUlXQUQ0ODQzVzogVGhpcyA8ZW52LWVudHJ5PiBtdXN0IGJlIGEgPHJlc291cmNlLXJlZj4gKEVKQiAyLjA6IDIwLjQuMS4yKS4KLSMgSVdBRDQ4NDQuZWpiMjA9SVdBRDQ4NDRXOiA8cmVzLXJlZi1uYW1lPiBzaG91bGQgbm90IGluY2x1ZGUgdGhlICJqYXZhOmNvbS9lbnYvIiBzdHJpbmcgKEVKQiAyLjA6IDIwLjQuMS4yKS4KLSMgSVdBRDQ4NDUuZWpiMjA9SVdBRDQ4NDVXOiA8cmVzLWF1dGg+IG11c3QgYmUgIkFwcGxpY2F0aW9uIiBvciAiQ29udGFpbmVyIiAoRUpCIDIuMDogMjAuNC4xLjIpLgotIyBJV0FENDg0Ni5lamIyMD1JV0FENDg0Nlc6IDxyZXMtc2hhcmluZy1zY29wZT4gbXVzdCBiZSAiU2hhcmVhYmxlIiBvciAiVW5zaGFyZWFibGUiIChFSkIgMi4wOiAyMC40LjEuMikuCi0jIElXQUQ0ODQ3LmVqYjIwPUlXQUQ0ODQ3VzogPHJlc291cmNlLXJlZj4gbXVzdCBiZSB1bmlxdWUgaW4gYmVhbiB7MH0gKEVKQiAyLjA6IDIwLjQuMS4yKS4KLQotIyBJV0FENDg0OC5lamIyMD1JV0FENDg0OFc6IENvbnZlbnRpb25hbGx5IHRoaXMgaXMgbG9jYXRlZCBpbiB0aGUgImphdmE6Y29tcC9lbnYvamRiYyIgc3ViY29udGV4dCAoRUpCIDIuMDogMjAuNC4xLjMsIDIwLjUuMS4xKS4KLSMgSVdBRDQ4NDkuZWpiMjA9SVdBRDQ4NDlXOiBDb252ZW50aW9uYWxseSB0aGlzIGlzIGxvY2F0ZWQgaW4gdGhlICJqYXZhOmNvbXAvZW52L2ptcyIgc3ViY29udGV4dCAoRUpCIDIuMDogMjAuNC4xLjMsIDIwLjUuMS4xKS4KLSMgSVdBRDQ4NTAuZWpiMjA9SVdBRDQ4NTBXOiBDb252ZW50aW9uYWxseSB0aGlzIGlzIGxvY2F0ZWQgaW4gdGhlICJqYXZhOmNvbXAvZW52L21haWwiIHN1YmNvbnRleHQgKEVKQiAyLjA6IDIwLjQuMS4zLCAyMC41LjEuMSkuCi0jIElXQUQ0ODUxLmVqYjIwPUlXQUQ0ODUxVzogQ29udmVudGlvbmFsbHkgdGhpcyBpcyBsb2NhdGVkIGluIHRoZSAiamF2YTpjb21wL2Vudi91cmwiIHN1YmNvbnRleHQgKEVKQiAyLjA6IDIwLjQuMS4zLCAyMC41LjEuMSkuCi0KLSMgSVdBRDQ4NTIuZWpiMjA9SVdBRDQ4NTJXOiBUaGlzIDxlbnYtZW50cnk+IG11c3QgYmUgYSA8cmVzb3VyY2UtZW52LXJlZj4gKEVKQiAyLjA6IDIwLjUuMS4yKS4KLSMgSVdBRDQ4NTMuZWpiMjA9SVdBRDQ4NTNXOiA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPiBzaG91bGQgbm90IGluY2x1ZGUgdGhlICJqYXZhOmNvbXAvZW52IiBzdHJpbmcgKEVKQiAyLjA6IDIwLjUuMS4yKS4KLSMgSVdBRDQ4NTQuZWpiMjA9SVdBRDQ4NTRXOiBBIEpNUyBEZXN0aW5hdGlvbiB2YWx1ZSBtdXN0IGJlIGVpdGhlciBqYXZheC5qbXMuUXVldWUgb3IgamF2YXguam1zLlRvcGljIChFSkIgMi4wOiAyMC41LjEuMikuCi0jIElXQUQ0ODU1LmVqYjIwPUlXQUQ0ODU1VzogPHJlc291cmNlLWVudi1yZWYtbmFtZT4gbXVzdCBiZSB1bmlxdWUgaW4gYmVhbiB7MH0gKEVKQiAyLjA6IDIwLjUuMS4yKS4KLQotIyBJV0FENDg1Ni5lamIyMD1JV0FENDg1Nlc6IEEgPHJvbGUtbmFtZT4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMi41LjMpLgotIyBJV0FENDg1Ny5lamIyMD1JV0FENDg1N1c6IDxyb2xlLW5hbWU+IHswfSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYmVhbiB7MX0gKEVKQiAyLjA6IDIxLjIuNS4zKS4KLSMgSVdBRDQ4NTguZWpiMjA9SVdBRDQ4NThXOiBBIDxyb2xlLW5hbWU+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuMSkuCi0jIElXQUQ0ODU5LmVqYjIwPUlXQUQ0ODU5VzogPHJvbGUtbmFtZT4gezB9IG11c3QgYmUgdW5pcXVlIHdpdGhpbiBiZWFuIHsxfSAoRUpCIDIuMDogMjEuMy4xKS4KLSMgSVdBRDQ4NjAuZWpiMjA9SVdBRDQ4NjBXOiBTZWN1cml0eSByb2xlcyBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4zLjEpLgotCi0jIElXQUQ0OTMxLmVqYjIwPUlXQUQ0OTMxVzogQXQgbGVhc3Qgb25lIDxtZXRob2Q+IG11c3QgZXhpc3QgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+IChFSkIgMi4wOiAyMS4zLjIpLgotIyBJV0FENDkzMi5lamIyMD1JV0FENDkzMlc6IHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4zLjIpIChFSkIgMi4wOiAxNy40LjEpLgotIyBJV0FENDkzMy5lamIyMD1JV0FENDkzM1c6IE5vIG1ldGhvZHMgb24gezB9IG1hdGNoIHRoaXMgPG1ldGhvZD4gKEVKQiAyLjA6IDIxLjMuMikuCi0jIElXQUQ0OTM0LmVqYjIwPUlXQUQ0OTM0VzogQXQgbGVhc3Qgb25lIDxtZXRob2QtcGFyYW0+IG11c3QgZXhpc3QgaW4gYSA8bWV0aG9kLXBhcmFtcz4uCi0KLSMgSVdBRDQ4NjYuZWpiMjA9SVdBRDQ4NjZXOiBBIDxyb2xlLWxpbms+IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIxLjMuMykuCi0jIElXQUQ0ODY3LmVqYjIwPUlXQUQ0ODY3VzogVGhpcyA8cm9sZS1saW5rPiBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMjEuMy4zKS4KLSMgSVdBRDQ4NjguZWpiMjA9SVdBRDQ4NjhXOiB7MH0gbXVzdCBleGlzdCAoRUpCIDIuMDogMjEuMy4zKS4KLQotIyBJV0FENDg2OS5lamIyMD1JV0FENDg2OVc6IDxzZWN1cml0eS1pZGVudGl0eT4gbXVzdCBiZSBlaXRoZXIgInVzZS1jYWxsZXItaWRlbnRpdHkiIG9yICJydW4tYXMiIChFSkIgMi4wOiAyMS4zLjQpLgotIyBJV0FENDg3MC5lamIyMD1JV0FENDg3MFc6IDxzZWN1cml0eS1pZGVudGl0eT4gbXVzdCBiZSAicnVuLWFzIiAoRUpCIDIuMDogMjEuMy40KS4KLSMgSVdBRDQ4NzEuZWpiMjA9SVdBRDQ4NzFXOiBTZWN1cml0eSByb2xlIHswfSBtdXN0IGV4aXN0IChFSkIgMi4wOiAyMS4zLjQuMSkuCi0KLSMgSVdBRDQ4NzUuZWpiMjA9SVdBRDQ4NzVXOiA8c2Vzc2lvbi10eXBlPiBtdXN0IGJlIGVpdGhlciAiU3RhdGVmdWwiIG9yICJTdGF0ZWxlc3MiIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLSMgSVdBRDQ4NzYuZWpiMjA9SVdBRDQ4NzZXOiA8dHJhbnNhY3Rpb24tdHlwZT4gbXVzdCBiZSBlaXRoZXIgIkJlYW4iIG9yICJDb250YWluZXIiIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLSMgSVdBRDQ4NzcuZWpiMjA9SVdBRDQ4NzdXOiA8cGVyc2lzdGVuY2UtdHlwZT4gbXVzdCBiZSBlaXRoZXIgIkJlYW4iIG9yICJDb250YWluZXIiIChFSkIgMi4wOiAyMi4yLCAyMi41KS4KLSMgSVdBRDQ4NzkuZWpiMjA9SVdBRDQ4NzlXOiBBdCBsZWFzdCBvbmUgPGNtcC1maWVsZD4gbXVzdCBleGlzdCAoRUpCIDIuMDogMjIuMiwgMjIuNSkuCi0KLSMgSVdBRDQ4ODAuZWpiMjA9SVdBRDQ4ODBXOiA8YWNrbm93bGVkZ2UtbW9kZT4gbXVzdCBiZSBlaXRoZXIgIkF1dG8tYWNrbm93bGVkZ2UiIG9yICJEdXBzLW9rLWFja25vd2xlZGdlIiAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODgxLmVqYjIwPUlXQUQ0ODgxVzogPGNhc2NhZGUtZGVsZXRlPiBtdXN0IG5vdCBleGlzdCAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODgyLmVqYjIwPUlXQUQ0ODgyVzogPGNtcC12ZXJzaW9uPiBtdXN0IGJlIGVpdGhlciAiMS54IiBvciAiMi54IiAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODgzLmVqYjIwPUlXQUQ0ODgzVzogPGNtci1maWVsZC1uYW1lPiBtdXN0IGV4aXN0IG9uIHswfSAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODg0LmVqYjIwPUlXQUQ0ODg0VzogPGNtci1maWVsZC10eXBlPiBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgYXMgezB9IChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4ODUuZWpiMjA9SVdBRDQ4ODVXOiA8Y21yLWZpZWxkLXR5cGU+IG11c3QgYmUgZWl0aGVyIGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQgKEVKQiAyLjA6IDIyLjUpLgotCi0jIElXQUQ0ODg2LmVqYjIwPUlXQUQ0ODg2VzogPGNtci1maWVsZC1uYW1lPiBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4ODcuZWpiMjA9SVdBRDQ4ODdXOiA8ZGVzdGluYXRpb24tdHlwZT4gbXVzdCBiZSBlaXRoZXIgamF2YXguam1zLlF1ZXVlIG9yIGphdmF4Lmptcy5Ub3BpYyAoRUpCIDIuMDogMjIuNSkuCi0jIElXQUQ0ODg5LmVqYjIwPUlXQUQ0ODg5VzogezB9IG11c3QgZXhpc3QgKEVKQiAyLjA6IDIyLjUpLgotIyBJV0FENDg5MC5lamIyMD1JV0FENDg5MFc6IDxlamItcmVmLW5hbWU+IG11c3QgYmUgdW5pcXVlIGluIGJlYW4gezB9IChFSkIgMi4wOiAyMi41KS4KLSMgSVdBRDQ4OTEuZWpiMjA9SVdBRDQ4OTFXOiA8ZWpiLXJlZi10eXBlPiBtdXN0IGJlICJFbnRpdHkiIG9yICJTZXNzaW9uIiAoRUpCIDIuMDogMjIuNSkuCi0KLSMgSVdBRDQ4NjIuZWpiMjA9SVdBRDQ4NjJXOiA8cmVzdWx0LXR5cGUtbWFwcGluZz4gbXVzdCBiZSAiUmVtb3RlIiAoRUpCIDIuMDogMTAuNS43KS4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgMlRDOiBlbmQgb2YgbWVzc2FnZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgZW5kIG9mIG1lc3NhZ2VzIGZvciB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uCi0jCi0KLSMKLSMgZW5kIG9mIHZhbGlkYXRpb24gbWVzc2FnZXMKLSMKLQotIwotIyBFbmQgRUpCIFZhbGlkYXRpb24gc3RyaW5ncwotIwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VyZWZ2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL2VyZWZ2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGY0ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1RoaXMgcHJvcGVydGllcyBmaWxlIGhvbGQgYWxsIHRoZSBleHRlcm5hbGlzZWQgc3RyaW5ncyBmb3IgZVRvb2xzIEoyRUUgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQ6Ci0jICAgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS0ogKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi9lcmVmdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLSMKLSMgMTQtT2N0b2Jlci0yMDAxOgotIwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRT1DSEtKMzAwOUU6IEluIG1vZHVsZSB7MX0sICcnZWpiLXJlZi1uYW1lJycgZWxlbWVudCBpbiAgZWpiLXJlZjogezB9IGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9JTlZBTElEX0VSRUZUWVBFPUNIS0ozMDEwRTogSW4gbW9kdWxlIHsxfSwgJydlamItcmVmLXR5cGUnJyBlbGVtZW50IGluIGVqYi1yZWY6IHswfSBpcyBpbnZhbGlkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGVFlQRT1DSEtKMzAxNEU6IEluIG1vZHVsZSB7MX0sICcnZWpiLXJlZi10eXBlJycgZWxlbWVudCBpbiBlamItcmVmOiB7MH0gaXMgbWlzc2luZy4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRT1DSEtKMzAxMUU6IEluIG1vZHVsZSB7MX0sIEhvbWUgaW50ZXJmYWNlIGlzIG1pc3NpbmcgZnJvbSBlamItcmVmOiB7MH0gZWxlbWVudC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX01JU1NJTkdfRVJFRlJFTU9URT1DSEtKMzAxMkU6IEluIG1vZHVsZSB7MX0sIFJlbW90ZSBpbnRlcmZhY2UgaXMgbWlzc2luZyBmcm9tIGVqYi1yZWY6IHswfSBlbGVtZW50LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRT1DSEtKMjgyN1c6ICcnc2VjdXJpdHktcm9sZS1yZWYnJyBlbGVtZW50IHswfSBkZWZpbmVzIHRoZSAnJ3JvbGUtbGluaycnIGVsZW1lbnQgYnV0IG5vICcnc2VjdXJpdHktcm9sZScnIGVsZW1lbnRzIGluIHRoZSBhcHBsaWNhdGlvbiBkZXNjcmlwdG9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JFU1JFRj1DSEtKMzAxM0U6IER1cGxpY2F0ZSAnJ3Jlc291cmNlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIG5ldyBzdHJpbmcgYWRkZWQgZm9yIHZlcnNpb24gNSBXU0FECi1VTlJFU09MVkVEX0VKQl9SRUZfV0FSTl89SVdBRTAwMzRXIEVKQiBsaW5rIGVsZW1lbnQgezB9IGlzIHVucmVzb2x2YWJsZSBpbiBtb2R1bGUgezF9IGFuZCBFQVIgezJ9LgotCi1FUlJPUl9FQVJfRFVQTElDQVRFX1NFUlZJQ0VSRUY9Q0hLSjMwMTVFOiBEdXBsaWNhdGUgJydzZXJ2aWNlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUY9Q0hLSjMwMTZFOiBEdXBsaWNhdGUgJydzZWN1cml0eSByb2xlLXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUY9Q0hLSjMwMTdFOiBEdXBsaWNhdGUgJydlamItcmVmJycgZWxlbWVudCBuYW1lZCB7MH0uCi1FUlJPUl9FQVJfRFVQTElDQVRFX1JFU0VOVlJFRj1DSEtKMzAxOEU6IER1cGxpY2F0ZSAnJ3Jlc291cmNlIGVudmlyb25tZW50LXJlZicnIGVsZW1lbnQgbmFtZWQgezB9LgotRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGPUNIS0ozMDE5RTogRHVwbGljYXRlICcnbWVzc2FnZSBkZXN0aW5hdGlvbi1yZWYnJyBlbGVtZW50IG5hbWVkIHswfS4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCTVBIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQk1QSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjJmNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCTVBIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBQk1QSG9tZVZSdWxlIGV4dGVuZHMgQUVudGl0eUhvbWVWUnVsZSB7Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBob21lTWV0aG9kLCBNZXRob2QgYmVhbk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQlpZigobWV0aG9kVHlwZSAmIEZJTkQpICE9IEZJTkQpIHsKLQkJCXN1cGVyLnZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyh2YywgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIGJlYW5NZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCUphdmFIZWxwZXJzIGhvbWVSZXRUeXBlID0gaG9tZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlKYXZhSGVscGVycyBiZWFuUmV0VHlwZSA9IGJlYW5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShob21lUmV0VHlwZSwgYmVhblJldFR5cGUpKSB7Ci0JCQkJLy8gZW1pdCB0aGUgZXJyb3Igb25seSBpZiBpdCdzIGEgbXVsdGktZmluZGVyLiBTaW5nbGUtZmluZGVycyBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzIG9uIHRoZSBob21lICYgYmVhbiBjbGFzcy4KLQkJCQlib29sZWFuIGhvbWVSZXRUeXBlSXNSZW1vdGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShob21lUmV0VHlwZSwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQkJYm9vbGVhbiBob21lUmV0VHlwZUlzTG9jYWwgPSAgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZVJldFR5cGUsIGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSk7Ci0JCQkJYm9vbGVhbiBiZWFuUmV0VHlwZUlzS2V5ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oYmVhblJldFR5cGUsICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSk7Ci0JCQkJaWYoISgoaG9tZVJldFR5cGVJc1JlbW90ZSB8fCBob21lUmV0VHlwZUlzTG9jYWwpICYmIGJlYW5SZXRUeXBlSXNLZXkpKSB7Ci0JCQkJCVN0cmluZyByZXRUeXBlTmFtZSA9IG51bGw7Ci0JCQkJCWlmKGJlYW5SZXRUeXBlSXNLZXkpIHsKLQkJCQkJCWlmKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCQkJCQlyZXRUeXBlTmFtZSA9IChiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1JFTU9URSA6IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkuZ2V0SmF2YU5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldFR5cGVOYW1lID0gKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9MT0NBTCA6IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKS5nZXRKYXZhTmFtZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0VHlwZU5hbWUgPSAoYmVhblJldFR5cGUgPT0gbnVsbCkgPyAiPyIgOiBiZWFuUmV0VHlwZS5nZXRKYXZhTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBuZXcgU3RyaW5nW10geyByZXRUeXBlTmFtZX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODZiNzlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBVHlwZVZSdWxlIGltcGxlbWVudHMgSUVKQlR5cGUgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgbG9uZ1tdIEJBU0VfVFlQRVMgPSBuZXcgbG9uZ1tde0lUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1R9OwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWSA9IElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HOyAvLyBEZXByZWNhdGVkIHVzZSBvZiBSZW1vdGVFeGNlcHRpb24uCi0JCi0JcHVibGljIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBCQVNFX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldEVqYkNsYXNzKCk7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldERlZmF1bHRNZXRob2RUeXBlKCkgewotCQlyZXR1cm4gSEVMUEVSOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFmb2xsb3dBYnN0cmFjdFJ1bGVzKGNsYXp6KSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFmb2xsb3dQdWJsaWNSdWxlcyhjbGF6eikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMjIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYoIWZvbGxvd0ZpbmFsUnVsZXMoY2xhenopKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldFJlbW90ZUhvbWVNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbMF07Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRMb2NhbEhvbWVNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbMV07Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRSZW1vdGVDb21wb25lbnRNZXRob2RzRXh0ZW5kZWQoTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHsKLQkJcmV0dXJuIG1ldGhvZHNFeHRlbmRlZExpc3RbMl07Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRMb2NhbENvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFszXTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBMaXN0IGdldEJlYW5DbGFzc01ldGhvZHNFeHRlbmRlZChMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlyZXR1cm4gbWV0aG9kc0V4dGVuZGVkTGlzdFs0XTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gQSBiZWFuIGNsYXNzIG5lZWRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcycgZXh0ZW5kZWQgbWV0aG9kczoKLQkJLy8gICAgMS4gcmVtb3RlIGhvbWUKLQkJLy8gICAgMi4gbG9jYWwgaG9tZQotCQkvLyAgICAzLiByZW1vdGUgY29tcG9uZW50Ci0JCS8vICAgIDQuIGxvY2FsIGNvbXBvbmVudAotCQkvLyAgICA1LiBiZWFuIGNsYXNzICh3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXRjaGluZyBlamJQb3N0Q3JlYXRlIG1ldGhvZCkuCi0JCS8vIElmIGEgcGFydGljdWxhciBiZWFuIGRvZXNuJ3QgdXNlIGEgcmVtb3RlIHZpZXcgb3IgbG9jYWwgdmlldywKLQkJLy8gdGhlbiB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgYXJyYXkgd2lsbCBiZSBudWxsLiAKLQkJTGlzdFtdIHJlc3VsdCA9IG5ldyBMaXN0WzVdOwotCQlKYXZhQ2xhc3MgcmVtb3RlSG9tZSA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlpZihyZW1vdGVIb21lICE9IG51bGwpIHsKLQkJCXJlc3VsdFswXSA9IHJlbW90ZUhvbWUuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMF0gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgbG9jYWxIb21lID0gYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJaWYobG9jYWxIb21lICE9IG51bGwpIHsKLQkJCXJlc3VsdFsxXSA9IGxvY2FsSG9tZS5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFsxXSA9IG51bGw7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyByZW1vdGVDb21wb25lbnQgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlpZihyZW1vdGVDb21wb25lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0WzJdID0gcmVtb3RlQ29tcG9uZW50LmdldE1ldGhvZHNFeHRlbmRlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0WzJdID0gbnVsbDsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGxvY2FsQ29tcG9uZW50ID0gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpOwotCQlpZihsb2NhbENvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbM10gPSBsb2NhbENvbXBvbmVudC5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFszXSA9IG51bGw7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCWlmKGJlYW5DbGFzcyAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbNF0gPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbNF0gPSBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBiZWFuIGNsYXNzJyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eik7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkQmVQdWJsaWMoSmF2YUNsYXNzIGNsYXp6KTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eik7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpOwotCXByb3RlY3RlZCBhYnN0cmFjdCBKYXZhSGVscGVycyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb247Ci0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdFamJIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1ldGhvZCBtZXRob2QpIHsKLQkJLy8gU2VjdGlvbiBudW1iZXIgc3RhdGluZyB0aGlzIG5hbWUgY29udmVudGlvbj8KLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCQkvLyBTdHJpcCB0aGUgImVqYkhvbWUiIG9mZiwgc3RyaXAgb2ZmIHRoZSBuZXh0IGNoYXJhY3RlciwgYW5kIHJlcGxhY2UgdGhhdCBjaGFyYWN0ZXIgd2l0aCBhIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIHRoYXQgY2hhcmFjdGVyCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtZXRob2ROYW1lLmNoYXJBdCgwKSkpOwotCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDgpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nRWpiQ3JlYXRlTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE1ldGhvZCBtZXRob2QpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9DKTsKLQkJLy8gU3RyaXAgdGhlICJlamJDIiBvZmYgb2YgImNyZWF0ZSIgYW5kIHJlcGxhY2Ugd2l0aCAiYyIKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXRob2QgbWV0aG9kKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfQyk7Ci0JCS8vIFN0cmlwIHRoZSAiZWpiUG9zdEMiIG9mZiBvZiAiY3JlYXRlIiBhbmQgcmVwbGFjZSB3aXRoICJjIgotCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDgpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nRWpiRmluZE1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXRob2QgbWV0aG9kKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRik7Ci0JCS8vIFN0cmlwIHRoZSAiZWpiRiIgb2ZmIG9mICJlamJGaW5kIiBhbmQgcmVwbGFjZSB3aXRoICJmIgotCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nQnVzaW5lc3NNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyoKLQkgKiBUaGUgZ2l2ZW4gbWV0aG9kIGlzIG5vdCBzdXBwb3NlZCB0byBoYXZlIGEgbWF0Y2hpbmcgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBudWxsOyAvLyBub3Qgc3VwcG9zZWQgdG8gaGF2ZSBhIG1hdGNoaW5nIG1ldGhvZAotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGZvbGxvd0ZpbmFsUnVsZXMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCWlmKHNob3VsZEJlRmluYWwoY2xhenopKSB7Ci0JCQlyZXR1cm4gY2xhenouaXNGaW5hbCgpOwotCQl9Ci0JCXJldHVybiAhY2xhenouaXNGaW5hbCgpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dQdWJsaWNSdWxlcyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJaWYoc2hvdWxkQmVQdWJsaWMoY2xhenopKSB7Ci0JCQlyZXR1cm4gY2xhenouaXNQdWJsaWMoKTsKLQkJfQotCQlyZXR1cm4gIWNsYXp6LmlzUHVibGljKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGZvbGxvd0Fic3RyYWN0UnVsZXMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCWlmKHNob3VsZEJlQWJzdHJhY3QoY2xhenopKSB7Ci0JCQlyZXR1cm4gY2xhenouaXNBYnN0cmFjdCgpOwotCQl9Ci0JCXJldHVybiAhY2xhenouaXNBYnN0cmFjdCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZihtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZihtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDIzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IGdldEVqYkNyZWF0ZVJldHVyblR5cGUoYmVhbiwgbWV0aG9kKTsKLQkJaWYoKHJldFR5cGUgPT0gbnVsbCkgfHwgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCByZXRUeXBlKSkpIHsKLQkJCVN0cmluZyByZXRUeXBlTmFtZSA9IChyZXRUeXBlID09IG51bGwpID8gZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoYmVhbiwgbWV0aG9kKSA6IHJldFR5cGUuZ2V0SmF2YU5hbWUoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQyNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtyZXRUeXBlTmFtZX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCXZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0cnVlKTsKLQotCQlpZih2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZEV4Y2VwdGlvbnMoKSkgewotCQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQyNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQyNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MjgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZighbWV0aG9kLmlzVm9pZCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUVqYkhvbWVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDMxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQzOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCXZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0cnVlKTsKLQotCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYkhvbWUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vICJlamJIb21lIiBpcyA3IGNoYXJhY3RlcnMKLQkJLy8gbWV0aG9kIHdpbGwgZm9sbG93IHRoZSBjb252ZW50aW9uLCAiZWpiSG9tZSIgKyBDaGFyLnRvVXBwZXIoMCkgKyBzdWJzdHJpbmcoMSksIHNvIHJldmVyc2UgdGhhdCBjb252ZW50aW9uIGhlcmUKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWV0aG9kLmdldE5hbWUoKS5jaGFyQXQoNykpKTsgLy8gcHV0IHRoZSBjaGFyYWN0ZXIgYmFjayBpbnRvIGxvd2VyLWNhc2UKLQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZyg4KSk7IC8vIHN1YnN0cmluZyBzdGFydHMgYXQgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgImVqYkhvbWUiIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIC0tIHN1YnN0cmluZyBpcyAwIGluZGV4ZWQKLQkJU3RyaW5nIG1ldGhvZFRvTWF0Y2hOYW1lID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQotCQlNZXRob2QgbWF0Y2hpbmdSZW1vdGVIb21lTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIG1ldGhvZFRvTWF0Y2hOYW1lLCBnZXRSZW1vdGVIb21lTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKG1hdGNoaW5nUmVtb3RlSG9tZU1ldGhvZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU1ldGhvZCBtYXRjaGluZ0xvY2FsSG9tZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2RUb01hdGNoTmFtZSwgZ2V0TG9jYWxIb21lTWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7Ci0JCWlmKG1hdGNoaW5nTG9jYWxIb21lTWV0aG9kICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDMwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21ldGhvZFRvTWF0Y2hOYW1lfSwgdGhpcyk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIElXQUQ0MDQ4ID0gQnVzaW5lc3MgbWV0aG9kcyBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiBSZWFkIHNlY3Rpb24gNy4xMC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjAxID0gVGhpcyBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiBSZWFkIHNlY3Rpb24gMTAuNi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzE3ID0gVGhlIG1ldGhvZCBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIuIFJlYWQgc2VjdGlvbiAxMi4yLjcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQxMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDA0OSA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gNy4xMC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjAyID0gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxMC42Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQzMTggPSBUaGUgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTIuMi43IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0MDUwID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiA3LjEwLjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyMDMgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gUmVhZCBzZWN0aW9uIDEwLjYuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMxOSA9IFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxMi4yLjcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0MDUxID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gNy4xMC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjA0ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTAuNi44IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzIwID0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIFJlYWQgc2VjdGlvbiAxMi4yLjcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ0MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDA1MiA9IHswfSBtdXN0IGJlIGEgbGVnYWwgUk1JLUlJT1AgdHlwZS4gUmVhZCBzZWN0aW9uIDcuMTAuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDIwNSA9IHswfSBtdXN0IGJlIGEgbGVnYWwgUk1JLUlJT1AgdHlwZS4gUmVhZCBzZWN0aW9uIDEwLjYuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMyMSA9IHswfSBtdXN0IGJlIGEgbGVnYWwgdHlwZSBmb3IgUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiAxMi4yLjcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRydWUpOwotCQkKLQkJLy8gSVdBRDQwNTMgPSBUaGlzIG1ldGhvZCBjYW5ub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gNy4xMC40LCAxOC4zLjgsIDE4LjYgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyMDYgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMC42LjgsIDE4LjMuOCwgMTguNiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMyMiA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEyLjIuNywgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfYnVzLCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlTWF0Y2hpbmdDb21wb25lbnRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIElXQUQ0NDAyID0gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxNS43LjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQ0MDMgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gUmVhZCBzZWN0aW9uIDE1LjcuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZihtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsJCQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQ0MDQgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIFJlYWQgc2VjdGlvbiAxNS43LjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ5NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQotCQkvLyBJV0FENDQwNSA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQuIFJlYWQgc2VjdGlvbiAxNS43LjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIW1ldGhvZC5pc1ZvaWQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA1X2VqYlJlbW92ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUNsYXNzVlJ1bGUjdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBKYXZhQ2xhc3MsIEZpZWxkKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgTGlzdFtdIGZpZWxkRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIElXQUQ0MDI0ID0gQSB0cmFuc2llbnQgZmllbGQgc2hvdWxkIG5vdCBiZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiA3LjQuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDAyNSA9IFRyYW5zaWVudCBmaWVsZHMgYXJlIGRpc2NvdXJhZ2VkLiBSZWFkIHNlY3Rpb24gNy40LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQxMTUgPSB7MH0gbXVzdCBub3QgYmUgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLiBSZWFkIHNlY3Rpb24gMTAuMy4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MjU5ID0gPGNtcC1maWVsZD4gZmllbGQgbXVzdCBiZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiAxMS4yLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyNjAgPSA8Y21yLWZpZWxkPiBmaWVsZCBtdXN0IGJlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDExLjIuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZihzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkpIHsKLQkJCXZhbGlkYXRlVHJhbnNpZW50RmllbGQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVUcmFuc2llbnRGaWVsZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBCeSBkZWZhdWx0IGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0RmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVYQ0xVREVEX0ZJRUxEOwotCQl9Ci0JCWVsc2UgaWYoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSB7Ci0JCQlyZXR1cm4gU0VSSUFMVkVSU0lPTlVJRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBPVEhFUl9GSUVMRDsKLQkJfQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nTWV0aG9kRXhjZXB0aW9ucyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgSmF2YUNsYXNzIG1hdGNoaW5nQ2xhenosIE1ldGhvZCBtYXRjaGluZ01ldGhvZCkgewotCQkvLyBFdmVyeSBleGNlcHRpb24gdGhyb3duIG9uIHRoZSBiZWFuIGNsYXNzJyBtZXRob2QgbXVzdCBiZSB0aHJvd24gb24gdGhlIGNvbXBvbmVudC9ob21lIG1ldGhvZAotCQkvKiBEb24ndCBjaGVjayBmb3IgdGhpcyBoZXJlIC0gbGV0IHRoZSBob21lICYgY29tcG9uZW50IGRvIGl0LgotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgbWF0Y2hpbmdNZXRob2QpOwotCQlJdGVyYXRvciBlaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGVpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJfQotCQkqLwotCQkKLQkJLy8gRXZlcnkgZXhjZXB0aW9uIHRocm93biBieSB0aGUgY29tcG9uZW50L2hvbWUgbWV0aG9kIHNob3VsZCBiZSB0aHJvd24gb3IgdGhlcmUgbWF5IGJlIGNvbXBpbGUgZXJyb3JzCi0JCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldFN1YnR5cGVFeGNlcHRpb25zKGJlYW4sIG1hdGNoaW5nTWV0aG9kLCBtZXRob2QpOwotCQlJdGVyYXRvciBlaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGVpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWVpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDU2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2V4Y2VwdGlvbi5nZXRKYXZhTmFtZSgpLCBtYXRjaGluZ0NsYXp6LmdldEphdmFOYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0hvbWVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlNZXRob2QgcmVtb3RlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZChtZXRob2QsIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSwgZ2V0UmVtb3RlSG9tZU1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihyZW1vdGVNZXRob2QgIT0gbnVsbCkgewotCQkJdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpLCByZW1vdGVNZXRob2QpOwotCQl9Ci0JCQotCQlNZXRob2QgbG9jYWxNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpLCBnZXRMb2NhbEhvbWVNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYobG9jYWxNZXRob2QgIT0gbnVsbCkgewotCQkJdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCksIGxvY2FsTWV0aG9kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQ29tcG9uZW50TWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJTWV0aG9kIHJlbW90ZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2QuZ2V0TmFtZSgpLCBnZXRSZW1vdGVDb21wb25lbnRNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYocmVtb3RlTWV0aG9kICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlTWF0Y2hpbmdNZXRob2RFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpLCByZW1vdGVNZXRob2QpOwotCQl9Ci0JCQotCQlNZXRob2QgbG9jYWxNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgZ2V0TG9jYWxDb21wb25lbnRNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYobG9jYWxNZXRob2QgIT0gbnVsbCkgewotCQkJdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSwgbG9jYWxNZXRob2QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcHBlbmRpeEIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgdGhpc0VqYk9iamVjdCkgewotCQkvLyBUaGUgSmF2YSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGUgRUpCIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KLQkJLy8gZS5nLiBpZiBFSkIgQiBpcyBhIGNoaWxkIG9mIEVKQiBBLCB0aGVuIGNsYXNzIEIgbXVzdCBiZSBhIGNoaWxkIG9mIGNsYXNzIEEuCi0JCS8vIEIgY291bGQgYmUgYSBncmFuZGNoaWxkIChvciBncmVhdC1ncmFuZGNoaWxkIG9yIC4uLikgb2YgQS4KLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4gc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlKYXZhQ2xhc3MgcGFyZW50RWpiT2JqZWN0ID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRFamJPYmplY3QgPSBzdXBlcnR5cGUuZ2V0RWpiQ2xhc3MoKTsKLQotCQkJLy8gRUpCT2JqZWN0IGEgWGNoaWxkIG9mIHBhcmVudCBFSkJPYmplY3QgKFggPSBjaGlsZCwgZ3JhbmRjaGlsZCwgZ3JlYXQtZ3JhbmRjaGlsZCwgZXRjLikKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHRoaXNFamJPYmplY3QpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRFamJPYmplY3QpOwotCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0VqYk9iamVjdCwgcGFyZW50RWpiT2JqZWN0KSkgewotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0gbmV3IFN0cmluZ1tdIHsgdGhpc0VqYk9iamVjdC5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudEVqYk9iamVjdC5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMTAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXNFamJPYmplY3QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBiZWFuLmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIHsKLQkJLy8gbXVzdCBub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uCi0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZG9lc05vdFRocm93UmVtb3RlRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FDTVBIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ01QSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDUzYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FDTVBIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBQ01QSG9tZVZSdWxlIGV4dGVuZHMgQUVudGl0eUhvbWVWUnVsZSB7Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJCi0JCS8vIENoZWNrIHRoYXQgdGhpcyBtZXRob2QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbAotCQkvLyBmaW5kQnlQcmltYXJ5S2V5IGRvZXMgbm90IG5lZWQgYSBxdWVyeSBlbGVtZW50ICgxMC41LjYpCi0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJaWYoKG1ldGhvZFR5cGUgJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklOREJZUFJJTUFSWUtFWSkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkRCWVBSSU1BUllLRVkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzb2NpYXRlZFdpdGhRdWVyeShjbXAsIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ5NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGZpbmRNYXRjaGluZ01ldGhvZChsb25nIG1ldGhvZFR5cGUpIHsKLQkJaWYoKG1ldGhvZFR5cGUgJiBGSU5EKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklORCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5maW5kTWF0Y2hpbmdNZXRob2QobWV0aG9kVHlwZSk7Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLmNvcmUuZWpiLmVqYjIwLnJ1bGVzLmltcGwuQUhvbWVWUnVsZSNyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlT3JDb2xsZWN0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcywgTWV0aG9kKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldHVybnNDb21wb25lbnRJbnRlcmZhY2VPckNvbGxlY3Rpb24oSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihyZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUphdmFIZWxwZXJzIHJldHVyblBhcm0gPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlKYXZhSGVscGVycyBqYXZhVXRpbENvbGxlY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5QYXJtLCBqYXZhVXRpbENvbGxlY3Rpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhvbWVNZXRob2QsIE1ldGhvZCBiZWFuTWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpOwotCQlpZigobWV0aG9kVHlwZSAmIEZJTkQpICE9IEZJTkQpIHsKLQkJCXN1cGVyLnZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyh2YywgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIGJlYW5NZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQl9Ci0JCS8vIGRvIG5vdCB2YWxpZGF0ZSB0aGUgcmV0dXJuIHR5cGUgb2YgZmluZCBtZXRob2RzIGJlY2F1c2UgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgYmVhbiBjbGFzcwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwZWQ0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUNvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUludGVyZmFjZVR5cGVWUnVsZSB7Ci0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmKChpc1JlbW90ZSgpICYgUkVNT1RFKSA9PSBSRU1PVEUpIHsKLQkJCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCX0KLQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRMb2NhbEludGVyZmFjZSgpOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIEJVU0lORVNTOwotCX0KLQkKLQlwdWJsaWMgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighZm9sbG93Uk1JX0lJT1BJbmhlcml0YW5jZVJ1bGVzKGJlYW4sIGNsYXp6KSkgewotCQkJLy8gSVdBRDQwNTcgPSB7MH0gbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzLiBSZWFkIHNlY3Rpb24gNy4xMC41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDIxMCA9IHswfSBtdXN0IGZvbGxvdyBSTUktSUlPUCBydWxlcyBmb3IgcmVtb3RlIGludGVyZmFjZXMuIFJlYWQgc2VjdGlvbiAxMC42Ljkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MzI2ID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDEyLjIuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDY4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7IC8vIGNoZWNrIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMKLQkJCi0JCWlmKGlzRUpCSW50ZXJmYWNlTWV0aG9kKGJlYW4sIG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0MDIxID0gezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIuIFJlYWQgc2VjdGlvbiA2LjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTEwID0gezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIuIFJlYWQgc2VjdGlvbiA5Ljkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTEyID0gezB9IGlzIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIuIFJlYWQgc2VjdGlvbiA5LjEwIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCU1ldGhvZCBtYXRjaCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2QuZ2V0TmFtZSgpLCBnZXRCZWFuQ2xhc3NNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYobWF0Y2ggPT0gbnVsbCkgewotCQkJLy8gSVdBRDQwNTggPSB7MH0gbXVzdCBleGlzdCBvbiB7MX0uIFJlYWQgc2VjdGlvbiA3LjEwLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNpYXRpb24uCi0JCQkvLyBJV0FENDA3MCA9IHswfSBtdXN0IGV4aXN0IG9uIHsxfS4gUmVhZCBzZWN0aW9uIDcuMTAuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQzMjcgPSB7MH0gbXVzdCBleGlzdCBvbiB7MX0uIFJlYWQgc2VjdGlvbiAxMi4yLjggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MzU0ID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gMTIuMi4xMCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMTEgPSB7MH0gbXVzdCBleGlzdCBvbiB7MX0uIFJlYWQgc2VjdGlvbiAxMC42Ljkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MjI3ID0gezB9IG11c3QgZXhpc3Qgb24gezF9LiBSZWFkIHNlY3Rpb24gMTAuNi4xMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAyMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXttZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBiZWFuLmdldEVqYkNsYXNzKCkuZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBtYXRjaC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0JCQkJLy8gSVdBRDQyMTIgPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgc2FtZSB0eXBlIGFzIHswfS4gUmVhZCBzZWN0aW9uIDEwLjYuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCS8vIElXQUQ0MjI4ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHNhbWUgdHlwZSBhcyB7MH0uIFJlYWQgc2VjdGlvbiAxMC42LjExIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJLy8gSVdBRDQzMjggPSBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aGUgc2FtZSB0eXBlIGFzIHswfSBvbiB7MX0uIFJlYWQgc2VjdGlvbiAxMi4yLjggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkvLyBJV0FENDM1NSA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfS4gUmVhZCBzZWN0aW9uIDEyLjIuMTAgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21hdGNoLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCQotCQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtYXRjaCwgbWV0aG9kKTsKLQkJCUl0ZXJhdG9yIGVpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGVpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcyllaXRlcmF0b3IubmV4dCgpOwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtleGNlcHRpb24uZ2V0SmF2YU5hbWUoKSwgbWF0Y2guZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoIWZvbGxvd1JlbW90ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0MDU2ID0gVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiA3LjEwLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MDY5ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gNy4xMC43LCAxOC4zLjgsIDE4LjYgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MzI1ID0gVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMi4yLjggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MzUzID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMi4xMCwgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDIwOSA9IFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfYnVzLCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDA1NSA9IHswfSBtdXN0IGJlIGEgbGVnYWwgdHlwZSBmb3IgUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiA3LjEwLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQyMDggPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgZm9yIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTAuNi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIElXQUQ0MzI0ID0gezB9IG11c3QgYmUgYSBsZWdhbCB0eXBlIGZvciBSTUktSUlPUC4gUmVhZCBzZWN0aW9uIDEyLjIuOCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQl2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdHJ1ZSk7Ci0JCQotCQlKYXZhSGVscGVycyBvZSA9IGdldE92ZXJFeHBvc2VkTG9jYWxUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQlpZihvZSAhPSBudWxsKSB7Ci0JCQkvLyBJV0FENDA1OSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiA3LjEwLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTA3ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDkuNy4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDMzMCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiAxMi4yLjggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTI4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIHRoZSB7MH0gdHlwZS4gUmVhZCBzZWN0aW9uIDEwLjMuMSwgMTAuMy4xMC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117b2UuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNDb21wb25lbnQpIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIHN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJSmF2YUNsYXNzIHBhcmVudENvbXBvbmVudCA9IG51bGw7Ci0JCWlmIChzdXBlcnR5cGUgIT0gbnVsbCkgewotCQkJcGFyZW50Q29tcG9uZW50ID0gZ2V0Q29tcG9uZW50SW50ZXJmYWNlKHN1cGVydHlwZSk7Ci0KLQkJCWlmKHBhcmVudENvbXBvbmVudCA9PSBudWxsKSB7Ci0JCQkJLy8gY2hpbGQgdXNlcyBlaXRoZXIgbG9jYWwsIG9yIHJlbW90ZSwgYnV0IG5vdCBib3RoIGludGVyZmFjZXMKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCS8vIENvbXBvbmVudCBhIFhjaGlsZCBvZiBwYXJlbnQgQ29tcG9uZW50Ci0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0aGlzQ29tcG9uZW50KTsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocGFyZW50Q29tcG9uZW50KTsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHRoaXNDb21wb25lbnQsIHBhcmVudENvbXBvbmVudCkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IHRoaXNDb21wb25lbnQuZ2V0UXVhbGlmaWVkTmFtZSgpLCBwYXJlbnRDb21wb25lbnQuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzQ29tcG9uZW50LCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCQotLy8JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBzdXBlcnR5cGUsIHBhcmVudENvbXBvbmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlCZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTQ4NTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5QmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFFbnRpdHlCZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFCZWFuQ2xhc3NWUnVsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1pc3NpbmdNZXRob2RUZW1wbGF0ZSA9ICJ7MH0oezF9KSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQotCQl2YWxpZGF0ZU1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgbWF0Y2hpbmdNZXRob2ROYW1lID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUE9TVENSRUFURSArIG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDkpOyAvLyAiZWpiQ3JlYXRlIiBpcyA5IGNoYXJhY3RlcnMgbG9uZywgc28gc3RyaXAgb2ZmIGNoYXJhY3RlcnMgMC4uOCBpbmNsdXNpdmUKLQkJTWV0aG9kIGVqYlBvc3RDcmVhdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWF0Y2hpbmdNZXRob2ROYW1lLCBnZXRCZWFuQ2xhc3NNZXRob2RzRXh0ZW5kZWQobWV0aG9kc0V4dGVuZGVkTGlzdHMpKTsKLQkJaWYoZWpiUG9zdENyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbWlzc2luZ01ldGhvZCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1pc3NpbmdNZXRob2RUZW1wbGF0ZSwgbmV3IFN0cmluZ1tde21hdGNoaW5nTWV0aG9kTmFtZSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFBhcm1zQXNTdHJpbmcobWV0aG9kKX0pOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21pc3NpbmdNZXRob2R9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc0MmZjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUVudGl0eUhvbWVWUnVsZSBleHRlbmRzIEFIb21lVlJ1bGUgewotCS8qKgotCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgaXNuJ3QgbGlzdGVkIGluIHRoZSBLTk9XTl9NRVRIT0RTLCB3aGF0IHR5cGUgb2YgbWV0aG9kIGlzIGl0Ci0JICogY29uc2lkZXJlZCB0byBiZT8KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIEhPTUU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUphdmFDbGFzcyBrZXkgPSAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCUphdmFQYXJhbWV0ZXJbXSBwYXJtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJaWYoKHBhcm1zLmxlbmd0aCAhPSAxKSB8fCAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGtleSwgcGFybXNbMF0uZ2V0SmF2YVR5cGUoKSkpKSB7Ci0JCQlTdHJpbmcga2V5TmFtZSA9IChrZXkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBrZXkuZ2V0SmF2YU5hbWUoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtrZXlOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5mb2xsb3dzRmluZGVyRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmZvbGxvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCXZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQlpZighcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCQlKYXZhQ2xhc3MgY29tcG9uZW50SW50ZXJmYWNlID0gZ2V0Q29tcG9uZW50SW50ZXJmYWNlKGJlYW4pOwotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotCQkJCWlmKGNvbXBvbmVudEludGVyZmFjZSAhPSBudWxsKSB7Ci0JCQkJCWNsYXNzTmFtZSA9IGNvbXBvbmVudEludGVyZmFjZS5nZXRKYXZhTmFtZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJCQkJY2xhc3NOYW1lID0gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1JFTU9URTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNsYXNzTmFtZSA9IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9MT0NBTDsKLQkJCQkJfQotCQkJCX0KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2NsYXNzTmFtZX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZighcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZU9yQ29sbGVjdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2dldENvbXBvbmVudEludGVyZmFjZShiZWFuKS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlSG9tZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDM1MCA9IFRoZSByZXR1cm4gdHlwZSBtdXN0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiB7MH0uIFJlYWQgc2VjdGlvbiAxMi4yLjkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gVGhlIGFib3ZlIGNoZWNrIGlzIGRvbmUgaW4gdGhlICJ2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkgbWV0aG9kLgotCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDYyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRklORCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2MywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9SRU1PVkUpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGNhYjkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFIb21lVlJ1bGUgZXh0ZW5kcyBBSW50ZXJmYWNlVHlwZVZSdWxlIHsKLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYoKGlzUmVtb3RlKCkgJiBSRU1PVEUpID09IFJFTU9URSkgewotCQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCX0KLQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gQnkgZGVmYXVsdCwgZG8gbm90aGluZy4KLQkJLy8gTGV0IHRoZSBlbnRpdHkgcnVsZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGFuZCB0aGUgc2Vzc2lvbiBkb24ndCBkbyBhbnl0aGluZwotCQkvLyBiZWNhdXNlIHZhbGlkYXRlTWV0aG9kTXVzdE5vdEV4aXN0IGRvZXMgd2hhdCB0aGUgc2Vzc2lvbnMgbmVlZC4JCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBmb2xsb3dzQ3JlYXRlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQ3JlYXRlRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BJbmhlcml0YW5jZShjbGF6eikpIHsKLQkJCS8vIElXQUQ0MzM0ID0gezB9IG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gUmVhZCBzZWN0aW9uIDEyLjIuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQyMTcgPSB7MH0gbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzLiBSZWFkIHNlY3Rpb24gMTAuNi4xMCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQwNjIgPSB7MH0gbXVzdCBmb2xsb3cgUk1JLUlJT1AgcnVsZXMgZm9yIHJlbW90ZSBpbnRlcmZhY2VzLiBSZWFkIHNlY3Rpb24gNy4xMC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NjEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgYmVhbiwgY2xhenopOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsgLy8gY2hlY2sgYXBwbGljYXRpb24gZXhjZXB0aW9ucwotCQkKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJU3RyaW5nIG5hbWVPZk1ldGhvZFRvRmluZCA9IG1ldGhvZC5nZXROYW1lKCk7Ci0JCWJvb2xlYW4gdmFsaWRhdGVSZXR1cm5UeXBlTWF0Y2hlcyA9IGZhbHNlOwotCQlpZigobWV0aG9kVHlwZSAmIENSRUFURSkgPT0gQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCQyk7Ci0JCQkvLyBTdHJpcCB0aGUgImMiIG9mZiBvZiAiY3JlYXRlIiBhbmQgcmVwbGFjZSB3aXRoICJlamJDIgotCQkJYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZygxKSk7Ci0JCQluYW1lT2ZNZXRob2RUb0ZpbmQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRklORCkgPT0gRklORCkgewotCQkJdmFsaWRhdGVGaW5kTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCRik7Ci0JCQkvLyBTdHJpcCB0aGUgImYiIG9mZiBvZiAiZmluZCIgYW5kIHJlcGxhY2Ugd2l0aCAiZWpiRiIKLQkJCWJ1ZmZlci5hcHBlbmQobWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoMSkpOwotCQkJbmFtZU9mTWV0aG9kVG9GaW5kID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkKLQkJCXZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBIT01FKSA9PSBIT01FKSB7Ci0JCQkvLyByZW1vdmUgaXMgYSBzcGVjaWFsIG1ldGhvZC4gU2VlIDkuNS4zIGZvciBhbiBleGFtcGxlCi0JCi0JCQl2YWxpZGF0ZUhvbWVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQkJCi0JCQkvLyBTZWN0aW9uIG51bWJlciBzdGF0aW5nIHRoaXMgbmFtZSBjb252ZW50aW9uPwotCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkJIT01FKTsKLQkJCWJ1ZmZlci5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG1ldGhvZE5hbWUuY2hhckF0KDApKSk7Ci0JCQlidWZmZXIuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDEpKTsKLQkJCW5hbWVPZk1ldGhvZFRvRmluZCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCi0JCQl2YWxpZGF0ZVJldHVyblR5cGVNYXRjaGVzID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBzaG91bGRuJ3QgYmUgaGVyZS4gQVR5cGVWUnVsZSB3aWxsIGNhdGNoLgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZighZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1ldGhvZFR5cGUgbVR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCWlmKG1UeXBlID09IG51bGwpIHsKLQkJCQkvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkFIb21lVlJ1bGUgLSB2YWxpZGF0ZSBtZXRob2Qgd2hpY2ggbXVzdCBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJNZXRob2QgdHlwZSBpcyBudWxsOiAiICsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpICsgIjo6IiArIG1ldGhvZC5nZXROYW1lKCkgKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtVHlwZS5nZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpLCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCXZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCAoKG1ldGhvZFR5cGUgJiBGSU5EKSAhPSBGSU5EKSk7IC8vIGRvIG5vdCBjaGVjayB0aGF0IHRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmQgbWV0aG9kIGlzIHNlcmlhbGl6YWJsZS4gSWYgaXQncyBDb2xsZWN0aW9uIG9yIFNldCBpdCB3b24ndCBiZSBzZXJpYWxpemFibGUsIGFuZCBpZiBpdCBkb2Vzbid0IHJldHVybiBDb2xsZWN0aW9uLCBTZXQsIG9yIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHRoZW4gdGhlIHJldHVybiB0eXBlIHdpbGwgYmUgZmxhZ2dlZC4KLQkJCi0JCUphdmFIZWxwZXJzIGxvY2FsID0gZ2V0T3ZlckV4cG9zZWRMb2NhbFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCWlmKGxvY2FsICE9IG51bGwpIHsKLQkJCS8vIElXQUQ0MDIzID0gezB9IGNhbm5vdCBiZSBhbiBhcmd1bWVudCBvciByZXN1bHQgdHlwZS4gUmVhZCBzZWN0aW9uIDYuNy4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDIyNSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiAxMC42LjEwIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkvLyBJV0FENDM1MSA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4cG9zZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiAxMi4yLjkgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtsb2NhbC5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKGZpbmRNYXRjaGluZ01ldGhvZChtZXRob2RUeXBlKSkgewotCQkJdmFsaWRhdGVNYXRjaGluZ0JlYW5NZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5hbWVPZk1ldGhvZFRvRmluZCwgdmFsaWRhdGVSZXR1cm5UeXBlTWF0Y2hlcywgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGZpbmRNYXRjaGluZ01ldGhvZChsb25nIG1ldGhvZFR5cGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdCZWFuTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBTdHJpbmcgbmFtZU9mTWV0aG9kVG9GaW5kLCBib29sZWFuIHZhbGlkYXRlUmV0dXJuVHlwZU1hdGNoZXMsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBtYXRjaCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBuYW1lT2ZNZXRob2RUb0ZpbmQsIGdldEJlYW5DbGFzc01ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwotCQlpZihtYXRjaCA9PSBudWxsKSB7Ci0JCQlJTWV0aG9kVHlwZSBtVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGUoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkJaWYobVR5cGUgPT0gbnVsbCkgewotCQkJCS8vIG9vcHMKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiQUhvbWVWUnVsZSAtIHZhbGlkYXRlIG1ldGhvZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIk1ldGhvZCB0eXBlIGlzIG51bGw6ICIgKyBiZWFuLmdldE5hbWUoKSArICI6OiIgKyBjbGF6ei5nZXRKYXZhTmFtZSgpICsgIjo6IiArIG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJCQlTdHJpbmcgYmVhbkNsYXNzTmFtZSA9IChiZWFuQ2xhc3MgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfQkVBTl9DTEFTUyA6IGJlYW5DbGFzcy5nZXRKYXZhTmFtZSgpOwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgbVR5cGUuZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtuYW1lT2ZNZXRob2RUb0ZpbmQsIGJlYW5DbGFzc05hbWV9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYodmFsaWRhdGVSZXR1cm5UeXBlTWF0Y2hlcykgewotCQkJCXZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWF0Y2gsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJCX0KLQotCQkJU2V0IGV4Y2VwdGlvbnMgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhiZWFuLCBtYXRjaCwgbWV0aG9kKTsKLQkJCUl0ZXJhdG9yIGVpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGVpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcyllaXRlcmF0b3IubmV4dCgpOwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtleGNlcHRpb24uZ2V0SmF2YU5hbWUoKSwgbWF0Y2guZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nUmV0dXJuVHlwZU1hdGNoZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBob21lTWV0aG9kLCBNZXRob2QgYmVhbk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZE1ldGhvZCkgewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGJlYW5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgbmV3IFN0cmluZ1tde2JlYW5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighZm9sbG93c0NyZWF0ZUV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ2NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoIXJldHVybnNDb21wb25lbnRJbnRlcmZhY2UodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7Ci0JCQlKYXZhQ2xhc3MgY29tcG9uZW50SW50ZXJmYWNlID0gZ2V0Q29tcG9uZW50SW50ZXJmYWNlKGJlYW4pOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0JCQlpZihjb21wb25lbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotCQkJCWNsYXNzTmFtZSA9IGNvbXBvbmVudEludGVyZmFjZS5nZXRKYXZhTmFtZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJCQljbGFzc05hbWUgPSBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2xhc3NOYW1lID0gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX0xPQ0FMOwotCQkJCX0KLQkJCX0KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2NsYXNzTmFtZX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUhvbWVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSVdBRDQzNTAgPSBUaGUgcmV0dXJuIHR5cGUgbXVzdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgezB9LiBSZWFkIHNlY3Rpb24gMTIuMi45IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIFRoZSBhYm92ZSBjaGVjayBpcyBkb25lIGluIHRoZSAidmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpIG1ldGhvZC4KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCUphdmFDbGFzcyBjb21wb25lbnRJbnRlcmZhY2UgPSBnZXRDb21wb25lbnRJbnRlcmZhY2UoYmVhbik7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBjb21wb25lbnRJbnRlcmZhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXR1cm5zQ29tcG9uZW50SW50ZXJmYWNlT3JDb2xsZWN0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYocmV0dXJuc0NvbXBvbmVudEludGVyZmFjZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyByZXR1cm5QYXJtID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxFbnVtZXJhdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5QYXJtLCBqYXZhVXRpbEVudW1lcmF0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUphdmFIZWxwZXJzIGphdmFVdGlsQ29sbGVjdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTiwgYmVhbik7Ci0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblBhcm0sIGphdmFVdGlsQ29sbGVjdGlvbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcHBlbmRpeEIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgdGhpc0hvbWUpIHsKLQkJLy8gVGhlIEphdmEgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIG11c3QgbWF0Y2ggdGhlIEVKQiBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuCi0JCS8vIGUuZy4gaWYgRUpCIEIgaXMgYSBjaGlsZCBvZiBFSkIgQSwgdGhlbiBjbGFzcyBCIG11c3QgYmUgYSBjaGlsZCBvZiBjbGFzcyBBLgotCQkvLyBCIGNvdWxkIGJlIGEgZ3JhbmRjaGlsZCAob3IgZ3JlYXQtZ3JhbmRjaGlsZCBvciAuLi4pIG9mIEEuCi0JCQotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCS8vIGJlYW4gaGFzIG5vIHN1cGVydHlwZQotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIHN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJSmF2YUNsYXNzIHBhcmVudEhvbWUgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIHRoaXMgQ01QJ3Mgc3VwZXJ0eXBlCi0JCQlwYXJlbnRIb21lID0gZ2V0SG9tZUludGVyZmFjZShzdXBlcnR5cGUpOwotCi0JCQlpZihwYXJlbnRIb21lID09IG51bGwpIHsKLQkJCQkvLyBjaGlsZCB1c2VzIGVpdGhlciBsb2NhbCwgb3IgcmVtb3RlLCBidXQgbm90IGJvdGggaW50ZXJmYWNlcwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gSG9tZSBhIFhjaGlsZCBvZiBwYXJlbnQgSG9tZQotCQkJLy8gSW4gb3VyIEVKQiBjb21wb25lbnQgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLCB3aGlsZSBpdCBpcyBsZWdhbCBmb3IKLQkJCS8vIGEgaG9tZSB0byBpbmhlcml0IGZyb20gYW5vdGhlciBob21lLCAoc2VjdGlvbiBCLjIpLCBpdCBpcyBub3QgbGVnYWwKLQkJCS8vIGZvciBXU0EgY29tcG9uZW50IGluaGVyaXRhbmNlIHN0cnVjdHVyZS4gCi0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0aGlzSG9tZSk7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHBhcmVudEhvbWUpOwotCQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0aGlzSG9tZSwgcGFyZW50SG9tZSkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IHRoaXNIb21lLmdldFF1YWxpZmllZE5hbWUoKSwgcGFyZW50SG9tZS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMTA0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXNIb21lLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBlLmdldEphdmFDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSwgYmVhbi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCQotLy8JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBzdXBlcnR5cGUsIHBhcmVudEhvbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSW50ZXJmYWNlVHlwZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUludGVyZmFjZVR5cGVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmQwYzE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSW50ZXJmYWNlVHlwZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotCi0KLS8qCi0gKiBUaGlzIGNsYXNzIGlzIGEgaGFjayBhcm91bmQgdGhlIEphdmEgbGFjayBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLSAqIEFsbCBpZiBzdGF0ZW1lbnRzIHdoaWNoIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZyB3b3VsZCBub3JtYWxseSByZXBsYWNlCi0gKiBhcmUgY29udGFpbmVkIGluIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBSW50ZXJmYWNlVHlwZVZSdWxlIGV4dGVuZHMgQVR5cGVWUnVsZSBpbXBsZW1lbnRzIElFSkJJbnRlcmZhY2VUeXBlIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzBdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEEgaG9tZSBvciBjb21wb25lbnQgY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgotCQkvLyAgICAxLiBiZWFuIGNsYXNzCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCWlmKGJlYW5DbGFzcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkJTGlzdFtdIHJlc3VsdCA9IG5ldyBMaXN0WzFdOwotCQlyZXN1bHRbMF0gPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGhvbWUgb3IgY29tcG9uZW50J3MgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVBcHBsaWNhdGlvbkV4Y2VwdGlvblJ1bGVzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFSkJJbnRlcmZhY2VNZXRob2QoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWxvbmdbXSBzdXBlclR5cGVzID0gZ2V0U3VwZXJ0eXBlcygpOwotCQlmb3IoaW50IGk9MDsgaTxzdXBlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihDbGFzc1V0aWxpdHkuZ2V0VXRpbGl0eSgpLmlzQ2xhc3NUeXBlKGJlYW4sIG1ldGhvZC5nZXRKYXZhQ2xhc3MoKSwgc3VwZXJUeXBlc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBKYXZhSGVscGVycyBnZXRPdmVyRXhwb3NlZExvY2FsVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJLy8gbmVlZCB0byBjaGVjayB0aGF0IHRoZSBtZXRob2QgZG9lc24ndCBleHBvc2UgYW55IG9mIHRoZSBsb2NhbCB0eXBlcyBvZiB0aGUgYmVhbgotCQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJaWYocGFybXMgIT0gbnVsbCkgewotCQkJCWZvcihpbnQgaT0wOyBpPHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IHBhcm1zW2ldOwotCQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMb2NhbFR5cGUoYmVhbiwgcGFybS5nZXRKYXZhVHlwZSgpKSkgewotCQkJCQkJcmV0dXJuIHBhcm0uZ2V0SmF2YVR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gTm93IGNoZWNrIHRoZSByZXR1cm4gdHlwZQotCQkJSmF2YUhlbHBlcnMgcGFybSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMb2NhbFR5cGUoYmVhbiwgcGFybSkpIHsKLQkJCQlyZXR1cm4gcGFybTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldEZpZWxkVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCWlmKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybiBFWENMVURFRF9GSUVMRDsKLQkJfQotCQllbHNlIGlmKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkgewotCQkJcmV0dXJuIFNFUklBTFZFUlNJT05VSUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gT1RIRVJfRklFTEQ7Ci0JCX0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQXBwbGljYXRpb25FeGNlcHRpb25SdWxlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiAgewotCQlMaXN0IGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJaWYoZXhjZXB0aW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBJV0FENDQxOSA9IHswfSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgamF2YS5sYW5nLkV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDE4LjEuMSwgMTguMi4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgamF2YUxhbmdFeGNlcHRpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX0VYQ0VQVElPTiwgYmVhbik7Ci0JCQlKYXZhSGVscGVycyBqYXZhTGFuZ1J1bnRpbWVFeGNlcHRpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04sIGJlYW4pOwotCQkJCi0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0FwcGxpY2F0aW9uRXhjZXB0aW9uKGV4Y2VwdGlvbiwgYmVhbikpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShleGNlcHRpb24sIGphdmFMYW5nRXhjZXB0aW9uKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MDQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117ZXhjZXB0aW9uLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkKLQkJCQkJLy8gbm8gcG9pbnQgY2hlY2tpbmcgdGhlIHJlc3QKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCS8vIElXQUQ0NDIwID0gezB9IG11c3Qgbm90IGJlIGEgc3ViY2xhc3Mgb2YgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxOC4xLjEsIDE4LjIuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGV4Y2VwdGlvbiwgamF2YUxhbmdSdW50aW1lRXhjZXB0aW9uKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0MTYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117ZXhjZXB0aW9uLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyB2Yy5hZGRNZXNzYWdlKCJDYW5ub3QgdmFsaWRhdGUgZXhjZXB0aW9ucyBiZWNhdXNlIHRoZSB7MH0gdHlwZSBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLiIpOwotCQkJLy8gRG9uJ3QgYWRkIGFueSBtZXNzYWdlIG90aGVyIHRoYW4gdGhlICJjYW5ub3QgdmFsaWRhdGUiIG1lc3NhZ2UuCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUtleUNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BS2V5Q2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzEzNGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BS2V5Q2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUtleUNsYXNzVlJ1bGUgZXh0ZW5kcyBBVHlwZVZSdWxlIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGxvbmdbXSBCQVNFX1RZUEVTID0gbmV3IGxvbmdbXXtJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUfTsKLQkKLQlwdWJsaWMgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIEJBU0VfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBrZXkgY2xhc3MnIG1ldGhvZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MgCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEga2V5IGNsYXNzJyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUNsYXNzVlJ1bGUjdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBFbnRlcnByaXNlQmVhbiwgSmF2YUNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gQ0hLSjIxMDggPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiA5Ljggb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gQ0hLSjIyNDEgPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AuIFJlYWQgc2VjdGlvbiAxMC42LjEzIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIENIS0oyMzc2ID0gezB9IG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTIuMi4xMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUFR5cGUoYmVhbiwgY2xhenopKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRVhDTFVERURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZihmaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpIHsKLQkJCXJldHVybiBTRVJJQUxWRVJTSU9OVUlEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE9USEVSX0ZJRUxEOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TWV0aG9kVHlwZSgpIHsKLQkJcmV0dXJuIE5PX01FVEhPRFM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCS8vIERvZXNuJ3QgbWF0dGVyIGlmIHRoZSBrZXkgY2xhc3MgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiBvciBub3QKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTY4MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBQmVhbkNsYXNzVlJ1bGUgewotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlVHJhbnNpZW50RmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoZmllbGQuaXNUcmFuc2llbnQoKSkgewotCQkJLy8gSVdBRDQwMjUgPSBUcmFuc2llbnQgZmllbGRzIGFyZSBkaXNjb3VyYWdlZC4gUmVhZCBzZWN0aW9uIDcuNC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwkJCi0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCi0JCQlKYXZhSGVscGVycyBqYXZheEVqYlNlc3Npb25Db250ZXh0ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQ09OVEVYVCwgYmVhbik7Ci0JCQlKYXZhSGVscGVycyBqYXZheFRyYW5zYWN0aW9uVXNlcnRyYW5zYWN0aW9uID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX1RSQU5TQUNUSU9OX1VTRVJUUkFOU0FDVElPTiwgYmVhbik7Ci0JCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCksIGphdmF4RWpiU2Vzc2lvbkNvbnRleHQpIHx8Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLCBqYXZheFRyYW5zYWN0aW9uVXNlcnRyYW5zYWN0aW9uKSB8fAotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xvY2FsVHlwZShiZWFuLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCkpIHx8Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzSk5ESU5hbWluZ0NvbnRleHQoZmllbGQpKQotCQkJewotCQkJCS8vIElXQUQ0MDI0ID0gQSB0cmFuc2llbnQgZmllbGQgc2hvdWxkIG5vdCBiZSB0aGUgezB9IHR5cGUuIFJlYWQgc2VjdGlvbiA3LjQuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7CQkKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVNlc3Npb25Ib21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1OWVmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVNlc3Npb25Ib21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFTZXNzaW9uSG9tZVZSdWxlIGV4dGVuZHMgQUhvbWVWUnVsZSB7Ci0JLyoqCi0JICogSWYgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBpc24ndCBsaXN0ZWQgaW4gdGhlIEtOT1dOX01FVEhPRFMsIHdoYXQgdHlwZSBvZiBtZXRob2QgaXMgaXQKLQkgKiBjb25zaWRlcmVkIHRvIGJlPwotCSAqLwotCXB1YmxpYyBsb25nIGdldERlZmF1bHRNZXRob2RUeXBlKCkgewotCQkvLyBJZiBpdCdzIG5vdCBhIGNyZWF0ZSBtZXRob2QsIHRoZW4gaXQgc2hvdWxkbid0IGJlIHRoZXJlLgotCQlyZXR1cm4gRVhDTFVERURfTUVUSE9EOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU3RhdGVsZXNzSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVN0YXRlbGVzc0hvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdlM2ViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU3RhdGVsZXNzSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVN0YXRlbGVzc0hvbWVWUnVsZSBleHRlbmRzIEFTZXNzaW9uSG9tZVZSdWxlIHsKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBjcmVhdGUoKSBtZXRob2QuCi0JCWlmKChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoICE9IDApIHx8ICghSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ3NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci52YWxpZGF0ZUNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVR5cGVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FUeXBlVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4MDFiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVR5cGVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVR5cGVWUnVsZSBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSBpbXBsZW1lbnRzIElDbGFzc1ZSdWxlLCBJRUpCVHlwZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0ZJRUxEUyA9IDA7Ci0KLQlwcml2YXRlIGxvbmcgX21ldGhvZExpc3QgPSBOT19NRVRIT0RTOwotCXByaXZhdGUgbG9uZyBfZmllbGRMaXN0ID0gTk9fRklFTERTOwotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXZjLnN1YnRhc2soSUVKQlZhbGlkYXRvckNvbnN0YW50cy5TVEFUVVNfVkFMSURBVElORywgbmV3IFN0cmluZ1tdeygoSmF2YUNsYXNzKSB0YXJnZXQpLmdldEphdmFOYW1lKCl9KTsKLQotCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGV4dChnZXRDbGFzcygpLmdldE5hbWUoKSArICI6OnZhbGlkYXRlKCIgKyB0YXJnZXRQYXJlbnQgKyAiLCAiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCX0KLQotCQl0cnkgewotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbikgdGFyZ2V0UGFyZW50OwotCQkJSmF2YUNsYXNzIGNsYXp6ID0gKEphdmFDbGFzcykgdGFyZ2V0OwotCi0JCQl0cnkgewotCQkJCS8vY2xlYW4gdXAgb2xkIHJlZmxlY3Rpb24gZXJyb3Igb24gdGhlIGNsYXp6IHRoYXQgaXMgZ2V0dGluZyB2YWxpZGF0ZWQKLQkJCQl2Yy5yZW1vdmVNZXNzYWdlcyhjbGF6eik7Ci0JCQkJLy8gQ2hlY2sgdGhhdCBhbGwgb2YgdGhlIHR5cGVzIGluIHRoZSBiZWFuIHJlZmxlY3RlZCBjb3JyZWN0bHksCi0JCQkJLy8gYW5kIHRoYXQgdGhlIHR5cGVzJyBwYXJlbnRzIHJlZmxlY3RlZCBjb3JyZWN0bHkgdG9vLgotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBjbGF6eik7Ci0JCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJcmVmbGVjdGlvbkVycm9yKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVW5uYW1lZFBhY2thZ2UoY2xhenouZ2V0SmF2YVBhY2thZ2UoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KTsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQkJTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QgPSBnZXRNZXRob2RzRXh0ZW5kZWQodmMsIGJlYW4sIGNsYXp6KTsKLQkJCQl2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGNsYXp6Lmxpc3RNZXRob2RFeHRlbmRlZCgpLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQkJTGlzdFtdIGZpZWxkc0V4dGVuZGVkTGlzdCA9IGdldEZpZWxkc0V4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBjbGF6ei5saXN0RmllbGRFeHRlbmRlZCgpLCBmaWVsZHNFeHRlbmRlZExpc3QpOwotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCQl2YWxpZGF0ZVN1cGVydHlwZXModmMsIGJlYW4sIGNsYXp6KTsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQkJdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0RXhpc3QodmMsIGJlYW4sIGNsYXp6KTsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCXJlZmxlY3Rpb25FcnJvcih2YywgYmVhbiwgY2xhenopOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIHJlbW92ZSBhbnkgZXhpc3RpbmcgbWVzc2FnZXMgc2luY2UgdGhleSBtYXkgYmUgZmF1bHR5Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGRbXSBmaWVsZHMsIExpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQkJZmllbGQgPSBmaWVsZHNbaV07Ci0JCQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCMjBWYWxpZGF0b3IgLSB2YWxpZGF0ZSBmaWVsZHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGV4dCgiQSBmaWVsZCBpcyBudWxsIG9uICIgKyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUgZmllbGRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRleHQoIlZhbGlkYXRpbmcgZmllbGQgIiArIGZpZWxkLmdldE5hbWUoKSArICJvbiBjbGF6eiAiICsgY2xhenogKyAiIGFuZCBpc1ZhbGlkIHJldHVybnMgIiArIGlzVmFsaWQoYmVhbiwgY2xhenosIGZpZWxkKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaXNWYWxpZChiZWFuLCBjbGF6eiwgZmllbGQpKSB7Ci0JCQkJCQlyZWdpc3Rlcih2YywgYmVhbiwgY2xhenosIGZpZWxkLCBmaWVsZHNFeHRlbmRlZExpc3RzKTsKLQkJCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGZpZWxkc0V4dGVuZGVkTGlzdHMpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJcmVmbGVjdGlvbldhcm5pbmcodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZSk7Ci0JCQkJfQotCQkJfQotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIHJlbW92ZSBhbnkgZXhpc3RpbmcgbWVzc2FnZXMgc2luY2UgdGhleSBtYXkgYmUgZmF1bHR5Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzVmFsaWQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNPd25lZEJ5QmFzZShiZWFuLCBtZXRob2QpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gKChnZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSAmIEVYQ0xVREVEX01FVEhPRCkgIT0gRVhDTFVERURfTUVUSE9EKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc093bmVkQnlCYXNlKEVudGVycHJpc2VCZWFuIGJlYW4sIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWxvbmdbXSBiYXNlVHlwZXMgPSBnZXRCYXNlVHlwZXMoKTsKLQkJaWYgKGJhc2VUeXBlcyA9PSBudWxsKSB7Ci0JCQkvLyBubyBwYXJlbnRzCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2VUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKENsYXNzVXRpbGl0eS5nZXRVdGlsaXR5KCkuaXNDbGFzc1R5cGUoYmVhbiwgZmllbGQuZ2V0SmF2YUNsYXNzKCksIGJhc2VUeXBlc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNPd25lZEJ5QmFzZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlsb25nW10gYmFzZVR5cGVzID0gZ2V0QmFzZVR5cGVzKCk7Ci0JCWlmIChiYXNlVHlwZXMgPT0gbnVsbCkgewotCQkJLy8gbm8gcGFyZW50cwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChDbGFzc1V0aWxpdHkuZ2V0VXRpbGl0eSgpLmlzQ2xhc3NUeXBlKGJlYW4sIG1ldGhvZC5nZXRKYXZhQ2xhc3MoKSwgYmFzZVR5cGVzW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNPd25lZEJ5QmFzZShiZWFuLCBmaWVsZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiAoKGdldEZpZWxkVHlwZShiZWFuLCBjbGF6eiwgZmllbGQpICYgRVhDTFVERURfRklFTEQpICE9IEVYQ0xVREVEX0ZJRUxEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kW10gbWV0aG9kcywgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQkJbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCQkJLy8gTm8gcG9pbnQgYWRkaW5nIGEgdmFsaWRhdGlvbiBtZXNzYWdlLCBiZWNhdXNlIHRoZSB1c2VyIGNhbid0IGRvIGFueXRoaW5nLgotCQkJCQkvLyBMb2cgdGhpcyBjb25kaXRpb24uCi0JCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUgbWV0aG9kcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUZXh0KCJPbiAiICsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpICsgIiwgdGhlcmUgaXMgYSBudWxsIG1ldGhvZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUgbWV0aG9kcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUZXh0KCJWYWxpZGF0aW5nIG1ldGhvZCAiICsgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSArICIgb24gY2xhenogIiArIGNsYXp6ICsgIiBhbmQgaXNWYWxpZCByZXR1cm5zICIgKyBpc1ZhbGlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaXNWYWxpZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cykpIHsKLQkJCQkJCXJlZ2lzdGVyKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCQkJCQlpZiAoaXNNZXRob2RBbGxvd2VkVG9FeGlzdChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cykpIHsKLQkJCQkJCQl2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl2YWxpZGF0ZU1ldGhvZFdoaWNoTXVzdE5vdEV4aXN0KHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIWlzT3duZWRCeUJhc2UoYmVhbiwgbWV0aG9kKSkgewotCQkJCQkJCWlmICgoTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKSAmIEVYQ0xVREVEX01FVEhPRCkgPT0gRVhDTFVERURfTUVUSE9EKSB7Ci0JCQkJCQkJCS8vIHVuaWRlbnRpZmllZCBtZXRob2QgZXhjbHVkZWQKLQkJCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21ldGhvZC5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQlyZWZsZWN0aW9uV2FybmluZyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQl9IGNhdGNoIChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGV4YykgewotCQkJLy8gcmVtb3ZlIGFueSBleGlzdGluZyBtZXNzYWdlcyBzaW5jZSB0aGV5IG1heSBiZSBmYXVsdHkKLQkJfQotCi0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgcmVnaXN0ZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJX2ZpZWxkTGlzdCA9IChfZmllbGRMaXN0IHwgZ2V0RmllbGRUeXBlKGJlYW4sIGNsYXp6LCBmaWVsZCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRDb25zdHJ1Y3Rvcihsb25nIG1ldGhvZFR5cGUpIHsKLQkJcmV0dXJuICgobWV0aG9kVHlwZSAmIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DT05TVFJVQ1RPUl9OT1BBUk0pID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DT05TVFJVQ1RPUl9OT1BBUk0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkb2VzUHVibGljRGVmYXVsdENvbnN0cnVjdG9yRXhpc3QoKSB7Ci0JCWlmICgoX21ldGhvZExpc3QgJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNKSA9PSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0Q29uc3RydWN0b3JJbnNlcnRlZEJ5Q29tcGlsZXIoKSB7Ci0JCS8vIElmIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG5vdCBpbiB0aGUgbGlzdCwgYW5kIGlmIHRoZXJlIGFyZSBubyBjb25zdHJ1Y3RvcnMsCi0JCS8vIHRoZSBKYXZhIGNvbXBpbGVyIHdpbGwgaW5zZXJ0IGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkJaWYgKChfbWV0aG9kTGlzdCAmIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DT05TVFJVQ1RPUikgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SKSB7Ci0JCQkvLyBUaGVyZSBpcyBhIGNvbnN0cnVjdG9yLCBzbyByZXR1cm4gZmFsc2UuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc01ldGhvZEFsbG93ZWRUb0V4aXN0KEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCWxvbmdbXSBtZXRob2RzID0gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCk7Ci0JCWlmIChtZXRob2RzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCWxvbmcgbWV0aG9kVHlwZSA9IG1ldGhvZHNbaV07Ci0JCQkJbG9uZyBleGlzdGluZ01ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkJCWlmICgoZXhpc3RpbmdNZXRob2RUeXBlICYgbWV0aG9kVHlwZSkgPT0gbWV0aG9kVHlwZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZ1tdIG1ldGhvZHMgPSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKTsKLQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbG9uZyBtZXRob2RUeXBlID0gbWV0aG9kc1tpXTsKLQkJCQlib29sZWFuIGVtaXRXYXJuaW5nID0gZmFsc2U7Ci0JCQkJaWYgKGlzRGVmYXVsdENvbnN0cnVjdG9yKG1ldGhvZFR5cGUpKSB7Ci0JCQkJCWlmICghZG9lc1B1YmxpY0RlZmF1bHRDb25zdHJ1Y3RvckV4aXN0KCkgJiYgIWlzRGVmYXVsdENvbnN0cnVjdG9ySW5zZXJ0ZWRCeUNvbXBpbGVyKCkpIHsKLQkJCQkJCWVtaXRXYXJuaW5nID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVtaXRXYXJuaW5nID0gIWV4aXN0cyhtZXRob2RUeXBlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZW1pdFdhcm5pbmcpIHsKLQkJCQkJLy8gSVdBRDQwNDEgPSBUaGlzIGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHdoaWNoIHRha2VzIG5vCi0JCQkJCS8vIHBhcmFtZXRlcnMuIFJlYWQgc2VjdGlvbiA3LjEwLjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQxNDIgPSB7MH0gbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDEwLjUuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDE3MyA9IHswfSBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTAuNi4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MjcxID0gezB9IG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxMi4xLjQuMSBvZiB0aGUgRUpCIDIuMAotCQkJCQkvLyBzcGVjaWZpY2F0aW9uLgotCQkJCQkvLyBJV0FENDI5MCA9IHswfSBtdXN0IGV4aXN0LiBSZWFkIHNlY3Rpb24gMTIuMi4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0Mzg4ID0gezB9IG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxNS43LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJSU1ldGhvZFR5cGUgbVR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlKG1ldGhvZFR5cGUpOwotCQkJCQlpZiAobVR5cGUgPT0gbnVsbCkgewotCQkJCQkJLy8gdW1tbW0uLi4ub29wcy4gVGhpcyBjYXNlIHNob3VsZCBuZXZlciBoYXBwZW4uCi0JCQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUgbWV0aG9kcyB3aGljaCBtdXN0IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllbnRyeS5zZXRUZXh0KCJNZXRob2QgdHlwZSBpcyBudWxsOiAiICsgbWV0aG9kVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgbVR5cGUuZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tde21UeXBlLmdldE1ldGhvZE5hbWUoYmVhbiwgY2xhenosIG51bGwpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVNZXRob2RXaGljaE11c3ROb3RFeGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSU1ldGhvZFR5cGUgbVR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJaWYgKG1UeXBlID09IG51bGwpIHsKLQkJCS8vIHdoYXQgaGFwcGVuZWQ/Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUgbWV0aG9kIHdoaWNoIG11c3Qgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJNZXRob2QgdHlwZSBpcyBudWxsOiAiICsgTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcykpOyAvLyROT04tTkxTLTEkCi0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG1UeXBlLmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117bVR5cGUuZ2V0TWV0aG9kTmFtZShiZWFuLCBjbGF6eiwgbWV0aG9kKX0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBsb25nIGdldEZpZWxkVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBsb25nW10gZ2V0QmFzZVR5cGVzKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpOyAvLyBpcyBhIG1pc3NpbmcgKG9yIHByZXNlbnQpCi0JCQkJCQkJCQkJCQkJCQkgLy8gUmVtb3RlRXhjZXB0aW9uIGEgd2FybmluZyBvciBhbgotCQkJCQkJCQkJCQkJCQkJIC8vIGVycm9yPyBTZWUgSUxvY2FsVHlwZSBhbmQKLQkJCQkJCQkJCQkJCQkJCSAvLyBJUmVtb3RlVHlwZS4KLQotCXB1YmxpYyBmaW5hbCBsb25nIGdldE1ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBFWENMVURFRF9NRVRIT0Q7Ci0JCX0KLQkJbG9uZyBpZCA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJaWYgKChpZCAmIENMSU5JVCkgPT0gQ0xJTklUKSB7Ci0JCQlyZXR1cm4gRVhDTFVERURfTUVUSE9EOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCByZWdpc3RlcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlfbWV0aG9kTGlzdCA9IChfbWV0aG9kTGlzdCB8IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVTdXBlcnR5cGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVTaG91bGRCZVN1cGVyVHlwZXModmMsIGJlYW4sIGNsYXp6KTsKLQkJdmFsaWRhdGVTaG91bGROb3RCZVN1cGVyVHlwZXModmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmMKLQkgKiBAcGFyYW0gYmVhbgotCSAqIEBwYXJhbSBjbGF6egotCSAqIEB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTaG91bGROb3RCZVN1cGVyVHlwZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlsb25nW10gdHlwZXM7Ci0JCS8vIFRlc3QgZm9yIHR5cGVzIHdoaWNoIGNhbiBiZSBzdXBlcnR5cGVzLCB0aG91Z2ggaXQncyBlaXRoZXIgbm90IHJlY29tbWVuZGVkIG9yIHNob3VsZCBiZQotCQkvLyBjb2RlZCB3aXRoIGNhdXRpb24KLQkJdHlwZXMgPSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKTsKLQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKYXZhSGVscGVycyBzdXBlclR5cGUgPSBDbGFzc1V0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldFN1cGVydHlwZShiZWFuLCB0eXBlc1tpXSk7Ci0JCQkJaWYgKHN1cGVyVHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIG5vIHN1cGVydHlwZQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oY2xhenosIHN1cGVyVHlwZSkpIHsKLQkJCQkJLy8gSVdBRDQxNzkgPSBCZWNhdXNlIHRoaXMgY2xhc3MgaW1wbGVtZW50cyB7MH0sICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYQotCQkJCQkvLyBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0LiBSZWFkIHNlY3Rpb24gMTAuNi4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MjkyID0gQmVjYXVzZSB7MH0gaW1wbGVtZW50cyB7MX0sICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYSBtZXRob2QKLQkJCQkJLy8gYXJndW1lbnQgb3IgcmVzdWx0LiBSZWFkIHNlY3Rpb24gMTIuMi4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MDQzID0gQmVjYXVzZSB7MH0gaW1wbGVtZW50cyB7MX0sICJ0aGlzIiBtdXN0IG5vdCBiZSBwYXNzZWQgYXMgYSBtZXRob2QKLQkJCQkJLy8gYXJndW1lbnQgb3IgcmVzdWx0LiBSZWFkIHNlY3Rpb24gNy4xMC4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwNDAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZjCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2hvdWxkQmVTdXBlclR5cGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJbG9uZ1tdIHR5cGVzID0gZ2V0U3VwZXJ0eXBlcygpOwotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCUphdmFIZWxwZXJzIHN1cGVyVHlwZSA9IENsYXNzVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0U3VwZXJ0eXBlKGJlYW4sIHR5cGVzW2ldKTsKLQkJCQlpZiAoc3VwZXJUeXBlID09IG51bGwpIHsKLQkJCQkJLy8gbm8gc3VwZXJ0eXBlCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oY2xhenosIHN1cGVyVHlwZSkpIHsKLQkJCQkJLy8gSVdBRDQwMjYgPSBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uQmVhbi4gUmVhZCBzZWN0aW9uCi0JCQkJCS8vIDcuNS4xLCA3LjEwLjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQzNzkgPSBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IGphdmF4LmVqYi5NZXNzYWdlRHJpdmVuQmVhbi4gUmVhZAotCQkJCQkvLyBzZWN0aW9uIDE1LjQuMSwgMTUuNy4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCS8vIElXQUQ0MzgwID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCBqYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyLiBSZWFkIHNlY3Rpb24KLQkJCQkJLy8gMTUuNC4xLCAxNS43LjIgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQxNzAgPSBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IGphdmEuZWpiLkVudGl0eUJlYW4uIFJlYWQgc2VjdGlvbiAxMC42LjIKLQkJCQkJLy8gb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJLy8gSVdBRDQyODYgPSBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IGphdmEuZWpiLkVudGl0eUJlYW4uIFJlYWQgc2VjdGlvbiAxMi4yLjIKLQkJCQkJLy8gb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tde3N1cGVyVHlwZS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9tZXRob2RMaXN0ID0gTk9fTUVUSE9EUzsKLQkJX2ZpZWxkTGlzdCA9IE5PX0ZJRUxEUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWZsZWN0aW9uRXJyb3IoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW117Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIHsKLQkJdmMucmVtb3ZlTWVzc2FnZXMoZmllbGQpOwotCQl2Yy5yZW1vdmVNZXNzYWdlcyhjbGF6eiwgZmllbGQuZ2V0TmFtZSgpKTsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IGdldFJlZmxlY3Rpb25XYXJuaW5nKHZjLCBleGMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQl2Yy5yZW1vdmVNZXNzYWdlcyhtZXRob2QpOwotCQl2Yy5yZW1vdmVNZXNzYWdlcyhjbGF6eiwgbWV0aG9kLmdldFNpZ25hdHVyZSgpKTsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IGdldFJlZmxlY3Rpb25XYXJuaW5nKHZjLCBleGMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJTWVzc2FnZSBnZXRSZWZsZWN0aW9uV2FybmluZyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRU9iamVjdCBmaWVsZE9yTWV0aG9kKSB7Ci0JCWlmIChleGMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKYXZhQ2xhc3MgYmFkQ2xhenogPSBleGMuZ2V0SmF2YUNsYXNzKCk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IChiYWRDbGF6eiA9PSBudWxsKSA/ICI/IiA6IGJhZENsYXp6LmdldFF1YWxpZmllZE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQlJTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLQotCQlpZiAoZmllbGRPck1ldGhvZCBpbnN0YW5jZW9mIEZpZWxkKSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoRmllbGQpIGZpZWxkT3JNZXRob2QpLmdldE5hbWUoKTsKLQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgKEZpZWxkKSBmaWVsZE9yTWV0aG9kLCBuZXcgU3RyaW5nW117bmFtZSwgdHlwZU5hbWV9LCB0aGlzKTsKLQkJfSBlbHNlIGlmIChmaWVsZE9yTWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kKSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoTWV0aG9kKSBmaWVsZE9yTWV0aG9kKS5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCk7Ci0JCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIChNZXRob2QpIGZpZWxkT3JNZXRob2QsIG5ldyBTdHJpbmdbXXtuYW1lLCB0eXBlTmFtZX0sIHRoaXMpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSAoKFhNSVJlc291cmNlKSBmaWVsZE9yTWV0aG9kLmVSZXNvdXJjZSgpKS5nZXRJRChmaWVsZE9yTWV0aG9kKTsKLQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tde25hbWUsIHR5cGVOYW1lfSwgdGhpcyk7Ci0JCX0KLQkJaWYgKGJhZENsYXp6ID09IG51bGwpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiZ2V0TWVzc2FnZUlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBib29sZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgiSW52YWxpZElucHV0RXhjZXB0aW9uIHRocm93biBvbiB1bmtub3duIGNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBKYXZhQ2xhc3MgZ2V0Q29tcG9uZW50SW50ZXJmYWNlKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKChpc1JlbW90ZSgpICYgSUVKQlR5cGUuUkVNT1RFKSA9PSBJRUpCVHlwZS5SRU1PVEUpIHsKLQkJCXJldHVybiBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXhpc3RzKGxvbmcgbWV0aG9kVHlwZSkgewotCQlyZXR1cm4gKChfbWV0aG9kTGlzdCAmIG1ldGhvZFR5cGUpID09IG1ldGhvZFR5cGUpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBKYXZhQ2xhc3MgZ2V0SG9tZUludGVyZmFjZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmICgoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQlyZXR1cm4gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7Ci0JCWlmICgoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQkvLyBtdXN0IHRocm93IFJlbW90ZUV4Y2VwdGlvbiBvciBvbmUgb2YgaXRzIHBhcmVudHMgKElPRXhjZXB0aW9uIG9yIEV4Y2VwdGlvbikKLQkJCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzUmVtb3RlRXhjZXB0aW9uT3JQYXJlbnQoYmVhbiwgbWV0aG9kKTsKLQkJfSBlbHNlIGlmICgoaXNSZW1vdGUoKSAmIElFSkJUeXBlLkxPQ0FMKSA9PSBJRUpCVHlwZS5MT0NBTCkgewotCQkJLy8gbXVzdCBub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uCi0JCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmRvZXNOb3RUaHJvd1JlbW90ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVSTUlfSUlPUFR5cGVSdWxlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QsIGJvb2xlYW4gY2hlY2tSZXR1cm5UeXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQlpZiAoKGlzUmVtb3RlKCkgJiBJRUpCVHlwZS5SRU1PVEUpID09IElFSkJUeXBlLlJFTU9URSkgewotCQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YVBhcmFtZXRlciBwYXJtID0gcGFybXNbaV07Ci0JCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNMZWdhbFJNSV9JSU9QVHlwZShiZWFuLCBwYXJtLmdldEphdmFUeXBlKCkpKSB7Ci0JCQkJCUlNZXRob2RUeXBlIG10ID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJCQkJaWYgKG10ID09IG51bGwpIHsKLQkJCQkJCS8vIGxvZwotCQkJCQl9IGVsc2UgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtdC5nZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde3Bhcm0uZ2V0SmF2YVR5cGUoKS5nZXRKYXZhTmFtZSgpfSwgdGhpcyk7IC8vIENhbid0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdXNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gbmFtZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gZmllbGQsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gYmVjYXVzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHdoZW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBpdCdzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gcmV0dXJuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdHlwZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gbWV0aG9kLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGl0J3MKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBjb25mdXNpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0bwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHNlZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vICJyZXN1bHQiCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gYXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBuYW1lCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBmaWVsZC4KLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaGVja1JldHVyblR5cGUpIHsKLQkJCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0JCQkJCUlNZXRob2RUeXBlIG10ID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0LCB0aGlzKTsKLQkJCQkJaWYgKG10ID09IG51bGwpIHsKLQkJCQkJCS8vIGxvZwotCQkJCQl9IGVsc2UgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBtdC5nZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0SmF2YU5hbWUoKX0sIHRoaXMpOyAvLyBDYW4ndAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB1c2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG5hbWUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGZpZWxkLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBiZWNhdXNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHdoZW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gaXQncwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gcmV0dXJuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHR5cGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG1ldGhvZCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gaXQncwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBjb25mdXNpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gdG8KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gc2VlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vICJyZXN1bHQiCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGFzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBuYW1lCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBmaWVsZC4KLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBkb24ndCBuZWVkIHRvIGNoZWNrCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dSTUlfSUlPUEluaGVyaXRhbmNlUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCWlmICgoaXNSZW1vdGUoKSAmIElFSkJUeXBlLlJFTU9URSkgPT0gSUVKQlR5cGUuUkVNT1RFKSB7Ci0JCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUEluaGVyaXRhbmNlKGNsYXp6KTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlcmlhbFZlcnNpb25VSUQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCS8qCi0JCSAqIEZvciBub3csIGRvIG5vdGhpbmcuIEluIGZ1dHVyZSwgY2hlY2sgaWYgdGhlIGZpZWxkIGlzIHB1YmxpYyAmIHN0YXRpYz8KLQkJICovCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5OTFiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBQZXJmb3JtcyB2YWxpZGF0aW9uIGNvbW1vbiB0byBzZXNzaW9uIGFuZCBlbnRpdHkgYmVhbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRUpCIHsKLQlwcm90ZWN0ZWQgSGFzaFNldCBjb21wb25lbnRQYXJlbnRzID0gbnVsbDsgLy8gVGhlIEphdmFDbGFzcyBpbnN0YW5jZXMgd2hpY2ggYXJlIHBhcmVudHMgb2YgdGhpcyBKYXZhQ2xhc3MgaW5zdGFuY2UsIGlmIHRoaXMgSmF2YUNsYXNzIGluc3RhbmNlIGlzIHBhcnQgb2YgYSBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCQotCXB1YmxpYyBBVmFsaWRhdGVCZWFuKCkgewotCQljb21wb25lbnRQYXJlbnRzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCWNvbXBvbmVudFBhcmVudHMuY2xlYXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb21wb25lbnRQYXJlbnRzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIHN1cGVydHlwZSA9IGdldFN1cGVyVHlwZShiZWFuKTsKLQkJaWYgKHN1cGVydHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjaGVjayB0aGlzIENNUCdzIHN1cGVydHlwZQotCQlKYXZhQ2xhc3MgdGhpc0VqYk9iamVjdCA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJSmF2YUNsYXNzIHBhcmVudEVqYk9iamVjdCA9IHN1cGVydHlwZS5nZXRFamJDbGFzcygpOwotCi0JCS8vIEVKQk9iamVjdCBhIFhjaGlsZCBvZiBwYXJlbnQgRUpCT2JqZWN0IChYID0gY2hpbGQsIGdyYW5kY2hpbGQsIGdyZWF0LWdyYW5kY2hpbGQsIGV0Yy4pCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0aGlzRWpiT2JqZWN0LCBwYXJlbnRFamJPYmplY3QpKSB7Ci0JCQljb21wb25lbnRQYXJlbnRzLmFkZChwYXJlbnRFamJPYmplY3QpOwotCQl9Ci0JCWJ1aWxkQ29tcG9uZW50UGFyZW50cyhzdXBlcnR5cGUpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKChFbnRlcnByaXNlQmVhbilwYXJlbnQpLmdldEVqYkNsYXNzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTGlzdCBnZXRSZW1vdGVIb21lTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzBdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzFdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3QgZ2V0QmVhbkNsYXNzTWV0aG9kc0V4dGVuZGVkKExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzJdOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBBIGJlYW4gY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgotCQkvLyAgICAxLiBob21lCi0JCS8vICAgIDIuIHJlbW90ZQotCQkvLyAgICAzLiBiZWFuIGNsYXNzICh3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXRjaGluZyBlamJQb3N0Q3JlYXRlIG1ldGhvZCkuCi0JCS8vIElmIGEgcGFydGljdWxhciBiZWFuIGRvZXNuJ3QgdXNlIGEgcmVtb3RlIHZpZXcgb3IgbG9jYWwgdmlldywKLQkJLy8gdGhlbiB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgYXJyYXkgd2lsbCBiZSBudWxsLiAKLQkJTGlzdFtdIHJlc3VsdCA9IG5ldyBMaXN0WzNdOwotCQlKYXZhQ2xhc3MgcmVtb3RlSG9tZSA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlpZihyZW1vdGVIb21lICE9IG51bGwpIHsKLQkJCXJlc3VsdFswXSA9IHJlbW90ZUhvbWUuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMF0gPSBudWxsOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgcmVtb3RlQ29tcG9uZW50ID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJaWYocmVtb3RlQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdFsxXSA9IHJlbW90ZUNvbXBvbmVudC5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFsxXSA9IG51bGw7Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCWlmKGJlYW5DbGFzcyAhPSBudWxsKSB7Ci0JCQlyZXN1bHRbMl0gPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMl0gPSBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBiZWFuIGNsYXNzJyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCQotCS8qKgotCSAqIEZvciB0aGUgY2hlY2sgdGhhdCB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBoYXMgYSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9uIHRoZSBob21lLAotCSAqIHRoaXMgbWV0aG9kLCBnaXZlbiB0aGUgYmVhbiBtZXRob2QsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaG9tZSBtZXRob2QuCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0JICogICAgIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotCSAqICAgICBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0JICogICAgIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKi8KLQlwdWJsaWMgZmluYWwgTWV0aG9kIGdldE1hdGNoaW5nSG9tZUNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUphdmFDbGFzcyBob21lSW50ZiA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgaG9tZUludGYpOwotCi0JCS8vIGNoZWNrIG9ubHkgdGhlIGN1cnJlbnQgY2xhc3MsIG5vdCB0aGUgcGFyZW50cyBpbiB0aGlzIGNhc2UuCi0JCS8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZSBoaWVyYXJjaHkgdGVzdHMuCi0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFLCBob21lSW50Zi5nZXRNZXRob2RzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgdGhlIGNoZWNrIHRoYXQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgaGFzIGEgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvbiB0aGUgaG9tZSwKLQkgKiB0aGlzIG1ldGhvZCwgZ2l2ZW4gdGhlIGJlYW4gbWV0aG9kLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhvbWUgbWV0aG9kLgotCSAqCi0JICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotCSAqICAgICB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLQkgKiAgICAgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCSAqICAgICBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKi4uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRNYXRjaGluZ0hvbWVDcmVhdGVNZXRob2RFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLiB0ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKYXZhQ2xhc3MgaG9tZUludGYgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGhvbWVJbnRmKTsKLQotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGhvbWVJbnRmLCBtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IHdoaWNoIHRoZSBiZWFuIG11c3QgaW1wbGVtZW50LgotCSAqIEZvciBlbnRpdHkgYmVhbnMsIGl0J3MgamF2YXguZWpiLkVudGl0eUJlYW4uCi0JICogRm9yIHNlc3Npb24gYmVhbnMsIGl0J3MgamF2YXguZWpiLlNlc3Npb25CZWFuLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIHBhc3NlZCBpbiBpcyBhIGJ1c2luZXNzIG1ldGhvZC4KLQkgKgotCSAqIEFsdGhvdWdoIHRoZSBFSkIgMS4xIHNwZWMgaW1wbGllcyB0aGF0IGFsbCBub24tZnJhbWV3b3JrIG1ldGhvZHMgYXJlIGJ1c2luZXNzIG1ldGhvZHMsCi0JICogZGV2ZWxvcGVycyBtYXkgY3JlYXRlIG1ldGhvZHMgb24gdGhlIGJlYW4gd2hpY2ggYXJlIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seS4gVGhpcwotCSAqIG1ldGhvZCAoaXNCdXNpbmVzc01ldGhvZCkgc2VwYXJhdGVzIHRoZSAiaW50ZXJuYWwgaGVscGVyIiBtZXRob2RzIGZyb20gdGhlIGJ1c2luZXNzCi0JICogbWV0aG9kcyBieSBjaGVja2luZyBpZiBhIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGV4aXN0cyBvbiB0aGUgcmVtb3RlIGludGVyZmFjZS4gSWYgaXQKLQkgKiBkb2VzLCBjb25zaWRlciB0aGlzIGEgYnVzaW5lc3MgbWV0aG9kLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0J1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0KLQkJaWYgKGlzRnJhbWV3b3JrTWV0aG9kKG5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gQ2hlY2sgaWYgdGhlcmUncyBhIG1hdGNoaW5nIG1ldGhvZCBvbiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSmF2YUNsYXNzIHJlbW90ZUludGVyZmFjZSA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZW1vdGVJbnRlcmZhY2UpOwotCQlNZXRob2QgcmVtb3RlSW50ZXJmYWNlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKHJlbW90ZUludGVyZmFjZSwgbmFtZSwgbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpKTsKLQkJaWYgKChyZW1vdGVJbnRlcmZhY2VNZXRob2QgPT0gbnVsbCkgfHwgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0VKQk9iamVjdE1ldGhvZChiZWFuLCByZW1vdGVJbnRlcmZhY2VNZXRob2QpKSkgewotCQkJLy8gbm8gbWF0Y2hpbmcgbWV0aG9kCi0JCQkvLyBmaWx0ZXIgb3V0IG1ldGhvZHMgZnJvbSBqYXZheC5lamIuRUpCT2JqZWN0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBwYXNzZWQgaW4gaXMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgaW4gYQotCSAqIGNvbXBvbmVudCBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wb25lbnRJbmhlcml0ZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGNvbXBvbmVudFBhcmVudHMgPT0gbnVsbCkgewotCQkJLy8gTm90IHBhcnQgb2YgYSBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gKGNvbXBvbmVudFBhcmVudHMuY29udGFpbnMobWV0aC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCkpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGcmFtZXdvcmtNZXRob2QoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkFDVElWQVRFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUEFTU0lWQVRFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUkVNT1ZFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCRklORCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5BTElaRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgZmllbGRzIChpLmUuLCBudWxsKSwgYW5kIGZpZWxkcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKHN1cGVyLmlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZmllbGRzRXh0ZW5kZWRMaXN0KSkgewotCQkJLy8gZXhjbHVkZSByb290IG9iamVjdCBtZXRob2RzCi0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzSmF2YUxhbmdPYmplY3RGaWVsZChiZWFuLCBmaWVsZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCS8vIGV4Y2x1ZGUgcm9vdCBvYmplY3QgbWV0aG9kcwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0phdmFMYW5nT2JqZWN0TWV0aG9kKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQkJcmV0dXJuIGlzVmFsaWRFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkJfQotCQkJZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUE9TVENSRUFURSkpIHsKLQkJCQlyZXR1cm4gaXNWYWxpZEVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBlamJDcmVhdGUgbWV0aG9kIHBhc3NlZCBpbiBpcyBub3QgaW5oZXJpdGVkIAotCSAqIGZyb20gYSBwYXJlbnQgaW4gYSBjb21wb25lbnQgaW5oZXJpdGFuY2UgaGllcmFyY2h5LCBvciBpcyBpbmhlcml0ZWQsCi0JICogYnV0IGlzIGFsc28gZGVmaW5lZCBvbiB0aGlzIGJlYW4ncyBob21lIGludGVyZmFjZS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZXhjbHVkZSBlamJDcmVhdGUgbWV0aG9kcyB3aGljaCBhcmUgaW5oZXJpdGVkCi0JICogZnJvbSBhIHBhcmVudCBpbiBhIGNvbXBvbmVudCBpbmhlcml0YW5jZSBoaWVyYXJjaHksIGFuZCBhcmUgbm90Ci0JICogZXhwb3NlZCBhbnl3aGVyZSBvbiB0aGlzIGJlYW4gY2xhc3MgaW5zdGFuY2UgaXRzZWxmLiAoaS5lLiwgaW5oZXJpdGVkLAotCSAqIGJ1dCBuZXZlciB1c2VkLikgU2luY2Ugd2UgZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIHRoZXNlIG1ldGhvZHMsIHdlCi0JICogc2hvdWxkIG5vdCBmbGFnIHRoZW0gYXMgd2FybmluZ3MuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNWYWxpZEVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGgsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCWJvb2xlYW4gaXNDb21wID0gaXNDb21wb25lbnRJbmhlcml0ZWQodmMsIGJlYW4sIGNsYXp6LCBtZXRoKTsKLQkJaWYgKGlzQ29tcCkgewotCQkJTWV0aG9kIGhvbWVNZXRoID0gZ2V0TWF0Y2hpbmdIb21lQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkJaWYgKGhvbWVNZXRoID09IG51bGwpIHsKLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0JCi0JLyoqCi0JICogMTguMS4yIFByb2dyYW1taW5nIHJlc3RyaWN0aW9ucwotCSAqLi4uCi0JICogICAgLSBBbiBlbnRlcnByaXNlIEJlYW4gbXVzdCBub3QgdXNlIHJlYWQvd3JpdGUgc3RhdGljIGZpZWxkcy4gVXNpbmcgcmVhZC1vbmx5IHN0YXRpYyBmaWVsZHMgaXMKLQkgKiAgIGFsbG93ZWQuIFRoZXJlZm9yZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc3RhdGljIGZpZWxkcyBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIGJlCi0JICogICBkZWNsYXJlZCBhcyBmaW5hbC4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvL3N1cGVyLnByaW1WYWxpZGF0ZShlamJNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJdmFsaWRhdGVTdGF0aWNGaWVsZCh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQl9Ci0JCi0JLyoqCi0JICogNi4xMC40IEJ1c2luZXNzIG1ldGhvZHMKLQkgKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JICoKLQkgKiA5LjIuNiBCdXNpbmVzcyBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBidXNpbmVzcyBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSwgYnV0IHRoZXkgbXVzdCBub3Qgc3RhcnQgd2l0aCAnZWpiJyB0byAKLQkgKiAgICAgICAgICBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB1c2VkIGJ5IHRoZSBFSkIgYXJjaGl0ZWN0dXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBUaGUgbWV0aG9kIG5hbWVzIGNhbiBiZSBhcmJpdHJhcnksIGJ1dCB0aGV5IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MTEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gU2VjdGlvbiA2LjEwLjUgKHNlc3Npb24pLCA5LjIuNyAoZW50aXR5KSwgZGVjbGFyZSB0aGF0IGFsbCBleGNlcHRpb25zIGRlY2xhcmVkCi0JCS8vIG9uIHRoZSBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YKLQkJLy8gdGhlIG1hdGNoaW5nIGNyZWF0ZSBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLQotCQlKYXZhQ2xhc3MgcmVtb3RlID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZSk7Ci0KLQkJTWV0aG9kIHJlbW90ZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChyZW1vdGUsIG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSk7Ci0JCWlmIChyZW1vdGVNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gVGhlbiB0aGlzIG1ldGhvZCBzaG91bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZDsgdW5sZXNzIHRoZSBtZXRob2QgZXhpc3RzIG9uIHRoZSByZW1vdGUsIHRoaXMgYmVhbiBtZXRob2QgaXNuJ3QgYSBidXNpbmVzcyBtZXRob2QuCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWV0aG9kLCByZW1vdGVNZXRob2QpOwotCQlpZiAoZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQzMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyByZW1vdGUuZ2V0UXVhbGlmaWVkTmFtZSgpLCBleGMuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLQkJdmFsaWRhdGVNYXRjaGluZ01ldGhvZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCksIHJlbW90ZU1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIDYuMTAuMiBTZXNzaW9uIGJlYW4gY2xhc3MKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBzZXNzaW9uIGJlYW4gY2xhc3M6Ci0JICogCQktIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5TZXNzaW9uQmVhbiAKLQkgKiAgICAgICAgaW50ZXJmYWNlLgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGFzIHB1YmxpYywgbXVzdCBub3QgYmUgZmluYWwsIGFuZCBtdXN0IG5vdCAKLQkgKiAgICAgICAgYmUgYWJzdHJhY3QuCi0JICogCQktIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgc2Vzc2lvbiBiZWFuJ3MgCi0JICogICAgICAgIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLQkgKiAJCS0gSWYgdGhlIGNsYXNzIGlzIGEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuLCBpdCBtYXkgb3B0aW9uYWxseSBpbXBsZW1lbnQgCi0JICogICAgICAgIHRoZSBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0JICogCQktIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIElmIHRoZSAKLQkgKiAgICAgICAgc2Vzc2lvbiBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZW4gdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSBlamJDcmVhdGUgbWV0aG9kcywgCi0JICogICAgICAgIHRoZSBtZXRob2RzIG9mIHRoZSBTZXNzaW9uQmVhbiBpbnRlcmZhY2UsIGFuZCB0aGUgbWV0aG9kcyBvZiB0aGUgb3B0aW9uYWwgCi0JICogICAgICAgIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlIG1heSBiZSBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MsIAotCSAqICAgICAgICBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKgotCSAqLi4uCi0JICogOS4yLjIgRW50ZXJwcmlzZSBiZWFuIGNsYXNzCi0JICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuRW50aXR5QmVhbiBpbnRlcmZhY2UuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGJlIGRlZmluZWQgYXMgcHVibGljIGFuZCBtdXN0IG5vdCBiZSBhYnN0cmFjdC4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZmluYWwuCi0JICouLi4KLQkgKiAgIC0gVGhlIGNsYXNzIG1heSwgYnV0IGlzIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgWzldLiAKLQkgKiAgICAgSWYgdGhlIGNsYXNzIGltcGxlbWVudHMgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBuby1vcCAKLQkgKiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGphdmF4LmVqYi5FSkJPYmplY3QgaW50ZXJmYWNlLiBUaGUgY29udGFpbmVyIAotCSAqICAgICB3aWxsIG5ldmVyIGludm9rZSB0aGVzZSBtZXRob2RzIG9uIHRoZSBiZWFuIGluc3RhbmNlcyBhdCBydW50aW1lLgotCSAqICAgLSBBIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgCi0JICogICAgIGRlZmluaW5nIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBhcyBhYnN0cmFjdC4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBidXNpbmVzcyBtZXRob2RzLCBhbmQgdGhlIAotCSAqICAgICBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUsIGFuZCBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBhcyBkZXNjcmliZWQgCi0JICogICAgIGxhdGVyIGluIHRoaXMgc2VjdGlvbi4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiAKLQkgKiAgICAgSWYgdGhlIGVudGl0eSBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzLCB0aGUgZmluZGVyIG1ldGhvZHMsIGFuZCB0aGUKLQkgKiAgICAgbWV0aG9kcyBvZiB0aGUgRW50aXR5QmVhbiBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGluIHRoZSAKLQkgKiAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgaXMgYWxsb3dlZCB0byBpbXBsZW1lbnQgb3RoZXIgbWV0aG9kcyAoZm9yIAotCSAqICAgICBleGFtcGxlIGhlbHBlciBtZXRob2RzIGludm9rZWQgaW50ZXJuYWxseSBieSB0aGUgYnVzaW5lc3MgbWV0aG9kcykgCi0JICogICAgIGluIGFkZGl0aW9uIHRvIHRoZSBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBFSkIgc3BlY2lmaWNhdGlvbi4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWJ1aWxkQ29tcG9uZW50UGFyZW50cyhiZWFuKTsKLQotCQkvLyBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuRW50aXR5QmVhbiAoZm9yIGVudGl0eSBiZWFucyksIAotCQkvLyBvciB0aGUgamF2YXguZWpiLlNlc3Npb25CZWFuIChmb3Igc2Vzc2lvbiBiZWFucyksIGludGVyZmFjZS4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShjbGF6eiwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZ2V0UGFyZW50TmFtZSgpLCBiZWFuKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAxMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHtjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCksIGdldFBhcmVudE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIEZvciBib3RoIGVudGl0eSBhbmQgc2Vzc2lvbiBiZWFucywgdGhlIGNsYXNzIG11c3QgYmUgcHVibGljLgotCQlpZiAoIWNsYXp6LmlzUHVibGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMjIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIEZvciBib3RoIGVudGl0eSBhbmQgc2Vzc2lvbiBiZWFucywgdGhlIGNsYXNzIG11c3Qgbm90IGJlIGFic3RyYWN0LgotCQlpZiAoY2xhenouaXNBYnN0cmFjdCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBGb3IgYm90aCBlbnRpdHkgYW5kIHNlc3Npb24gYmVhbnMsIHRoZSBjbGFzcyBtdXN0IG5vdCBiZSBmaW5hbC4KLQkJaWYgKGNsYXp6LmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAxNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1VubmFtZWRQYWNrYWdlKGNsYXp6LmdldEphdmFQYWNrYWdlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDQxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JLyoqCi0JICogOS4yLjMgZWpiQ3JlYXRlIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyAKLQkgKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0JICogICAgICAgLSBUaGUgbWV0aG9kIG5hbWUgbXVzdCBiZSBlamJDcmVhdGUuCi0JICogICAgICAgLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAgICAgLSBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0JICogICAgICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JICogICAgICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiQ3JlYXRlIG1ldGhvZCB0byB0aHJvdyB0aGUgCi0JICogICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotCSAqICAgICAgICAgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLQkgKiAgICAgICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JICogICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqICAgLSBUaGUgZW50aXR5IG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSBhIHVuaXF1ZSBwcmltYXJ5IGtleS4gCi0JICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgcHJpbWFyeSBrZXkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcHJpbWFyeSBrZXlzIG9mIGFsbCAKLQkgKiAgICAgdGhlIGV4aXN0aW5nIGVudGl0eSBvYmplY3RzIHdpdGhpbiB0aGUgc2FtZSBob21lLiBUaGUgZWpiQ3JlYXRlIG1ldGhvZCBzaG91bGQgCi0JICogICAgIHRocm93IHRoZSBEdXBsaWNhdGVLZXlFeGNlcHRpb24gb24gYW4gYXR0ZW1wdCB0byBjcmVhdGUgYW4gZW50aXR5IG9iamVjdCB3aXRoIAotCSAqICAgICBhIGR1cGxpY2F0ZSBwcmltYXJ5IGtleS4gSG93ZXZlciwgaXQgaXMgbGVnYWwgdG8gcmV1c2UgdGhlIHByaW1hcnkga2V5IG9mIGEKLQkgKiAgICAgcHJldmlvdXNseSByZW1vdmVkIGVudGl0eSBvYmplY3QuCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKi4uLgotCSAqCi0JICogOS40LjIgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlCi0JICouLi4KLQkgKiAgIC0gVGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIHRvIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgdHlwZS4gCi0JICogICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZWpiQ3JlYXRlKC4uLikgbWV0aG9kcyBzaG91bGQgYmUgY29kZWQgdG8gcmV0dXJuIGEgbnVsbC4gCi0JICogICAgIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBpZ25vcmVkIGJ5IHRoZSBDb250YWluZXIuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZF9ob21lRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIG11c3QgaGF2ZSBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTWV0aG9kIGNyZWF0ZU1ldGhvZCA9IGdldE1hdGNoaW5nSG9tZUNyZWF0ZU1ldGhvZEV4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJaWYgKGNyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBDYW4ndCBjaGVjayB0aGUgZXhjZXB0aW9ucyBvZiBhIG1ldGhvZCB3aGljaCBkb2Vzbid0IGV4aXN0LgotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gV2hldGhlciB0aGlzIGlzIGZyb20gYSBjb21wb25lbnQgaW5oZXJpdGFuY2Ugb3Igbm90LCBpZiB0aGUgbWV0aG9kIGV4aXN0cyBvbiB0aGUKLQkJLy8gaG9tZSwgY2hlY2sgdGhhdCB0aGUgbWV0aG9kIGZvbGxvd3MgdGhlIHNwZWMuCi0KLQkJLy8gU2VjdGlvbiA2LjEwLjYgKHNlc3Npb24pLCA5LjIuOCAoZW50aXR5KSwgZGVjbGFyZSB0aGF0IGFsbCBleGNlcHRpb25zIGRlY2xhcmVkCi0JCS8vIG9uIHRoZSBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YKLQkJLy8gdGhlIG1hdGNoaW5nIGNyZWF0ZSBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWV0aG9kLCBjcmVhdGVNZXRob2QpOwotCQlpZiAoZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQyMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBleGMuZ2V0UXVhbGlmaWVkTmFtZSgpLCBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVIZWxwZXJNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24oSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIFN0cmluZyBtZXNzYWdlUHJlZml4KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gRUpCIDIuMCBhZGRlZCAidGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiIgYWJvdmUKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmRvZXNOb3RUaHJvd1JlbW90ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIG1lc3NhZ2VQcmVmaXgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiAxOC4xLjIgUHJvZ3JhbW1pbmcgcmVzdHJpY3Rpb25zCi0JICouLi4KLQkgKiAgICAtIEFuIGVudGVycHJpc2UgQmVhbiBtdXN0IG5vdCB1c2UgcmVhZC93cml0ZSBzdGF0aWMgZmllbGRzLiBVc2luZyByZWFkLW9ubHkgc3RhdGljIGZpZWxkcyBpcwotCSAqICAgYWxsb3dlZC4gVGhlcmVmb3JlLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzdGF0aWMgZmllbGRzIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3MgYmUKLQkgKiAgIGRlY2xhcmVkIGFzIGZpbmFsLgotCSAqLi4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTdGF0aWNGaWVsZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSByZWFkL3dyaXRlIHN0YXRpYyBmaWVsZHMuIFVzaW5nIHJlYWQtb25seSBzdGF0aWMgZmllbGRzIGlzCi0JCS8vIGFsbG93ZWQuIFRoZXJlZm9yZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc3RhdGljIGZpZWxkcyBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIGJlCi0JCS8vIGRlY2xhcmVkIGFzIGZpbmFsLgotCQlpZiAoZmllbGQuaXNTdGF0aWMoKSAmJiAhZmllbGQuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIyMDAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nTWV0aG9kRXhjZXB0aW9ucyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgSmF2YUNsYXNzIG1hdGNoaW5nQ2xhenosIE1ldGhvZCBtYXRjaGluZ01ldGhvZCkgewotCQkvLyBFdmVyeSBleGNlcHRpb24gdGhyb3duIG9uIHRoZSBiZWFuIGNsYXNzJyBtZXRob2QgbXVzdCBiZSB0aHJvd24gb24gdGhlIGNvbXBvbmVudC9ob21lIG1ldGhvZAotCQkvKiBEb24ndCBjaGVjayBmb3IgdGhpcyBoZXJlIC0gbGV0IHRoZSBob21lICYgY29tcG9uZW50IGRvIGl0LgotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgbWF0Y2hpbmdNZXRob2QpOwotCQlJdGVyYXRvciBlaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGVpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJfQotCQkqLwotCQkKLQkJLy8gRXZlcnkgZXhjZXB0aW9uIHRocm93biBieSB0aGUgY29tcG9uZW50L2hvbWUgbWV0aG9kIHNob3VsZCBiZSB0aHJvd24gb3IgdGhlcmUgbWF5IGJlIGNvbXBpbGUgZXJyb3JzCi0JCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldFN1YnR5cGVFeGNlcHRpb25zKGJlYW4sIG1hdGNoaW5nTWV0aG9kLCBtZXRob2QpOwotCQlJdGVyYXRvciBlaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGVpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWVpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyNDU2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde2V4Y2VwdGlvbi5nZXRKYXZhTmFtZSgpLCBtYXRjaGluZ0NsYXp6LmdldEphdmFOYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcHBlbmRpeEIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgdGhpc0VqYk9iamVjdCkgewotCQkvLyBUaGUgSmF2YSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGUgRUpCIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KLQkJLy8gZS5nLiBpZiBFSkIgQiBpcyBhIGNoaWxkIG9mIEVKQiBBLCB0aGVuIGNsYXNzIEIgbXVzdCBiZSBhIGNoaWxkIG9mIGNsYXNzIEEuCi0JCS8vIEIgY291bGQgYmUgYSBncmFuZGNoaWxkIChvciBncmVhdC1ncmFuZGNoaWxkIG9yIC4uLikgb2YgQS4KLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50ZXJwcmlzZUJlYW4gc3VwZXJ0eXBlID0gZ2V0U3VwZXJUeXBlKGJlYW4pOwotCQlKYXZhQ2xhc3MgcGFyZW50RWpiT2JqZWN0ID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRFamJPYmplY3QgPSBzdXBlcnR5cGUuZ2V0RWpiQ2xhc3MoKTsKLQotCQkJLy8gRUpCT2JqZWN0IGEgWGNoaWxkIG9mIHBhcmVudCBFSkJPYmplY3QgKFggPSBjaGlsZCwgZ3JhbmRjaGlsZCwgZ3JlYXQtZ3JhbmRjaGlsZCwgZXRjLikKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHRoaXNFamJPYmplY3QpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRFamJPYmplY3QpOwotCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0VqYk9iamVjdCwgcGFyZW50RWpiT2JqZWN0KSkgewotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0gbmV3IFN0cmluZ1tdIHsgdGhpc0VqYk9iamVjdC5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudEVqYk9iamVjdC5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMTAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXNFamJPYmplY3QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBiZWFuLmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIHN1cGVydHlwZSwgcGFyZW50RWpiT2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRUpCLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRUpCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODg2NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVKQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvNS8wMSAxMTo1MTowOSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUVKQiBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSB7Ci0JcHJpdmF0ZSBMaXN0IHJvbGVNZXRob2ROYW1lczsKLQkKLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJaWYocm9sZU1ldGhvZE5hbWVzICE9IG51bGwpIHsKLQkJCXJvbGVNZXRob2ROYW1lcy5jbGVhcigpOwotCQkJcm9sZU1ldGhvZE5hbWVzID0gbnVsbDsgLy8gaW4gdGhpcyBjYXNlLCBjbGVhcmluZyB0aGUgbGlzdCBpc24ndCBlbm91Z2gsIGJlY2F1c2UgaXQgaXMgbGVnYWwgdG8gaGF2ZSB6ZXJvIHJvbGUgbmFtZXMuIE11c3QgYmUgbnVsbCBvciB3ZSdsbCBrZWVwIHRyeWluZyB0byByZWxvYWQgdGhlIHJvbGUgbmFtZXMganVzdCBiZWNhdXNlIHRoZXJlIGFyZSB6ZXJvIHJvbGUgbmFtZXMuCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICg5LzUvMjAwMSAxMjozNjozOSBQTSkKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0Um9sZU1ldGhvZE5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQl0cnkgewotCQkJaWYgKHJvbGVNZXRob2ROYW1lcyA9PSBudWxsICYmIGJlYW4gIT0gbnVsbCkgewotCQkJCXJvbGVNZXRob2ROYW1lcyA9IGdldFJvbGVNZXRob2ROYW1lc0V4dGVuZGVkKGJlYW4pOwotCQkJfQotCQkJcmV0dXJuIHJvbGVNZXRob2ROYW1lczsKLQkJfQotCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VqYlJlbGF0aW9uc2hpcFJvbGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IGFSb2xlTWV0aG9kTmFtZXMgPSBnZXRSb2xlTWV0aG9kTmFtZXModmMsIGJlYW4pOwotCQlpZihhUm9sZU1ldGhvZE5hbWVzICE9IG51bGwgJiYgIWFSb2xlTWV0aG9kTmFtZXMuaXNFbXB0eSgpKQotCQkgIHJldHVybiBhUm9sZU1ldGhvZE5hbWVzLmNvbnRhaW5zKG1ldGhvZC5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBjYW4sIGFuZCBzaG91bGQsIGJlIHZhbGlkYXRlZC4KLQkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBmaWVsZHMgKGkuZS4sIG51bGwpLCBhbmQgZmllbGRzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIExpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIGZvbGxvd2luZyBjYWxsIGNoZWNrcyBpZiB0aGUgdHlwZSByZWZsZWN0ZWQgcHJvcGVybHkKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSk7Ci0KLQkJaWYgKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgY2FuLCBhbmQgc2hvdWxkLCBiZSB2YWxpZGF0ZWQuCi0JICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCi0JICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLiBTaW5jZSBtYW55IG9mIHRoZSBjbGFzc2VzIGRvCi0JICogbm90IHZhbGlkYXRlIGZpZWxkcyBub3csIGltcGxlbWVudCB0aGlzIG1ldGhvZCBhcyBhIG5vLW9wIHNvIHRoYXQgdGhlCi0JICogY2xhc3NlcyBjb21waWxlLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFjdHVhbGx5IGRvZXMgdGhlIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgdGhlIGFjdHVhbCBjaGVja2luZyAoaWYgZWpiTWV0aG9kIGV4aXN0cykuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KTsKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWZsZWN0aW9uRXJyb3IoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQl2Yy5yZW1vdmVNZXNzYWdlcyhjbGF6eik7Ci0JCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXXtjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmbGVjdGlvbldhcm5pbmcoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkvLyBPbmUgb2YgdHdvIGNhc2VzIHdoZXJlIHdlIGNhcmUgaWYgdGhlIHR5cGUgaXMgb24gdGhpcyBjbGFzcyBvciBub3QgKGkuZS4sIG5vdCBsZWF2aW5nIGl0IHVwIHRvIE1lc3NhZ2VVdGlsaXR5KQotCQlTdHJpbmdbXSBtc2dQYXJtID0gbnVsbDsKLQkJU3RyaW5nIGphdmFDbGFzc05hbWUgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/ICI/IiA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBmaWVsZCkpIHsKLQkJCW1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10ge1N0cmluZy52YWx1ZU9mKGZpZWxkLmdldE5hbWUoKSksIFN0cmluZy52YWx1ZU9mKGphdmFDbGFzc05hbWUpfTsKLQkJfQotCQllbHNlIHsKLQkJCW1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10ge2phdmFDbGFzc05hbWV9OyAvLyBNZXNzYWdlVXRpbGl0eSB3aWxsIHN1YnN0aXR1dGUgaW4gdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JCX0KLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgbXNnUGFybSwgdGhpcyk7Ci0JCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZmxlY3Rpb25XYXJuaW5nKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkvLyBPbmUgb2YgdHdvIGNhc2VzIHdoZXJlIHdlIGNhcmUgaWYgdGhlIHR5cGUgaXMgb24gdGhpcyBjbGFzcyBvciBub3QgKGkuZS4sIG5vdCBsZWF2aW5nIGl0IHVwIHRvIE1lc3NhZ2VVdGlsaXR5KQotCQlTdHJpbmdbXSBtc2dQYXJtID0gbnVsbDsKLQkJU3RyaW5nIGphdmFDbGFzc05hbWUgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/ICI/IiA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBtZXRob2QpKSB7Ci0JCQltc2dQYXJtID0gbmV3IFN0cmluZ1tdIHttZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBqYXZhQ2xhc3NOYW1lfTsKLQkJfQotCQllbHNlIHsKLQkJCW1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10ge2phdmFDbGFzc05hbWV9OyAvLyBNZXNzYWdlVXRpbGl0eSB3aWxsIHN1YnN0aXR1dGUgaW4gdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JCX0KLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJCi0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGFyZ2V0UGFyZW50OwotCQlKYXZhQ2xhc3MgY2xhenogPSAoSmF2YUNsYXNzKXRhcmdldDsKLQkJCi0JCXRyeSB7Ci0JCQkvLyBjaGVjayBpZiBhbGwgb2YgdGhlIHR5cGVzIGluIHRoZSBiZWFuIHJlZmxlY3RlZCBwcm9wZXJseQotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGNsYXp6KTsKLQkJCQotCQkJdmMuc3VidGFzayhJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLlNUQVRVU19WQUxJREFUSU5HLCBuZXcgU3RyaW5nW117Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSk7Ci0JCQl2YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCQl2YWxpZGF0ZU1ldGhvZHModmMsIGJlYW4sIGNsYXp6KTsKLQkJCXZhbGlkYXRlRmllbGRzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXJlZmxlY3Rpb25FcnJvcih2YywgYmVhbiwgY2xhenopOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhdGNoKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdG8gYXZvaWQgdmFsaWRhdGluZyBhIEZpZWxkIG1vcmUKLQkgKiB0aGFuIG9uY2UuICBUaGlzIGlzIG5vdCB1c2VkIGZvciBjaGVja2luZyB0aGUgZXhpc3RlbmNlIG9mIGEgZmllbGQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZmllbGRzRXh0ZW5kZWRMaXN0KSkgewotCQkJcHJpbVZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdG8gYXZvaWQgdmFsaWRhdGluZyBhIE1ldGhvZCBtb3JlCi0JICogdGhhbiBvbmNlLiAgVGhpcyBpcyBub3QgdXNlZCBmb3IgY2hlY2tpbmcgdGhlIGV4aXN0ZW5jZSBvZiBhIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCXByaW1WYWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB2YWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKLQkJCXByaW1WYWxpZGF0ZUV4aXN0ZW5jZSh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUZpZWxkcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFdoZW5ldmVyIGxvb3Bpbmcgb3ZlciBhbiBlbnRpcmUgbGlzdCwgYWx3YXlzIHVzZSBhbiAKLQkJLy8gaXRlcmF0b3IgaW5zdGVhZCBvZiBhIGZvciBsb29wLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gCi0JCS8vIElmIHRoZSBsaXN0IGlzIGFuIGluc3RhbmNlIG9mIGEgbGlua2VkIGxpc3QsIGZvciBleGFtcGxlLAotCQkvLyB0aGUgZ2V0KGkpIGNhbGwgY2FuIHRha2UgIGEgbG9uZyB0aW1lLiAKLQkJTGlzdCBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCUxpc3RbXSBmaWVsZHNFeHRlbmRlZExpc3QgPSBnZXRGaWVsZHNFeHRlbmRlZCh2YywgYmVhbiwgY2xhenopOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJZmllbGQgPSAoRmllbGQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJBVmFsaWRhdGVFSkIudmFsaWRhdGVGaWVsZHMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkEgZmllbGQgaXMgbnVsbCBvbiAiICsgY2xhenopOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQsIGZpZWxkc0V4dGVuZGVkTGlzdCk7Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZWZsZWN0aW9uV2FybmluZyh2YywgYmVhbiwgY2xhenosIGZpZWxkLCBlKTsKLQkJCX0KLQkJfQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gbWV0aG9kIGlzIFJNSSBsZWdhbC4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiBmb3IgUk1JL0lJT1AsIGFuZCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTGVnYWxSTUlNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kV2l0aG91dEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBtZXRob2QgaXMgUk1JIGxlZ2FsLgotCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqIGZvciBSTUkvSUlPUCwgYW5kIHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEFyZ3VtZW50cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKYXZhUGFyYW1ldGVyW10gYXJncyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIGFyZ3NbaV0uZ2V0SmF2YVR5cGUoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW117YXJnc1tpXS5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBtZXRob2QgaXMgUk1JIGxlZ2FsLgotCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqIGZvciBSTUkvSUlPUCwgYW5kIHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEV4Y2VwdGlvbnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzUmVtb3RlRXhjZXB0aW9uT3JQYXJlbnQoYmVhbiwgbWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBtZXRob2QgaXMgUk1JIGxlZ2FsLCBidXQgZG9lc24ndCBjaGVjayB0aGUgZXhjZXB0aW9ucy4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1ldGhvZCdzIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JICogZm9yIFJNSS9JSU9QLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTGVnYWxSTUlNZXRob2RSZXR1cm5UeXBlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0xlZ2FsUk1JX0lJT1BUeXBlKGJlYW4sIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIGdpdmVuIG1ldGhvZCBpcyBSTUkgbGVnYWwsIGJ1dCBkb2Vzbid0IGNoZWNrIHRoZSBleGNlcHRpb25zLgotCSAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWV0aG9kJ3MgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiBmb3IgUk1JL0lJT1AuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFdpdGhvdXRFeGNlcHRpb25zKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEFyZ3VtZW50cyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RSZXR1cm5UeXBlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogRmluYWwgY2hlY2sgdG8gc2VlIGlmIHJlcXVpcmVkIG1ldGhvZHMgd2VyZSBkZXRlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZU1ldGhvZHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopICB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBXaGVuZXZlciBsb29waW5nIG92ZXIgYW4gZW50aXJlIGxpc3QsIGFsd2F5cyB1c2UgYW4gCi0JCS8vIGl0ZXJhdG9yIGluc3RlYWQgb2YgYSBmb3IgbG9vcCwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIAotCQkvLyBJZiB0aGUgbGlzdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGxpbmtlZCBsaXN0LCBmb3IgZXhhbXBsZSwKLQkJLy8gdGhlIGdldChpKSBjYWxsIGNhbiB0YWtlICBhIGxvbmcgdGltZS4gCi0JCU1ldGhvZFtdIGVqYk1ldGhvZHMgPSBjbGF6ei5saXN0TWV0aG9kRXh0ZW5kZWQoKTsKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0ID0gZ2V0TWV0aG9kc0V4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eik7Ci0JCWZvcihpbnQgaT0wOyBpPGVqYk1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQltZXRob2QgPSBlamJNZXRob2RzW2ldOwotCQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJLy8gTm8gcG9pbnQgYWRkaW5nIGEgdmFsaWRhdGlvbiBtZXNzYWdlLCBiZWNhdXNlIHRoZSB1c2VyIGNhbid0IGRvIGFueXRoaW5nLgotCQkJCS8vIExvZyB0aGlzIGNvbmRpdGlvbi4KLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkFWYWxpZGF0ZUVKQi52YWxpZGF0ZU1ldGhvZHMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIk9uICIgKyBjbGF6eiArICIsIHRoZXJlIGlzIGEgbnVsbCBtZXRob2QuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdGVFeGlzdGVuY2UodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwotCQkJCXZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCXJlZmxlY3Rpb25XYXJuaW5nKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBlKTsKLQkJCX0KLQkJfQotCQl2YWxpZGF0ZU1ldGhvZEV4aXN0cyh2YywgYmVhbiwgY2xhenopOwotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ1MThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkgYmVhbiBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKgotICogQWxsIDkuMi5YIHNlY3Rpb25zIGRlc2NyaWJlIEJNUCByZXF1aXJlbWVudHMuCi0gKiBJZiBhIENNUCByZXF1aXJlbWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVzZSwgdGhlbiB0aGUgZGlmZmVyZW5jZXMgYXJlCi0gKiBkb2N1bWVudGVkIGluIDkuNC5YIHNlY3Rpb25zLgotICoKLSAqIDkuMS41LjEgRW50aXR5IGJlYW4gaW5zdGFuY2UncyB2aWV3OiAuLi4gVGhlIGVudGl0eSBCZWFuIFByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlCi0gKiAgICBmb3IgaW1wbGVtZW50aW5nIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3M6Li4uCi0gKgotICogOS4yLjIgRW50ZXJwcmlzZSBiZWFuIGNsYXNzCi0gKiAgIC0gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgYW4gZW50aXR5IGJlYW4gY2xhc3M6Ci0gKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCB0aGUgamF2YXguZWpiLkVudGl0eUJlYW4gaW50ZXJmYWNlLgotICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGJlIGRlZmluZWQgYXMgcHVibGljIGFuZCBtdXN0IG5vdCBiZSBhYnN0cmFjdC4KLSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyBmaW5hbC4KLSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBkZWZpbmUgYSBwdWJsaWMgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuCi0gKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGRlZmluZSB0aGUgZmluYWxpemUoKSBtZXRob2QuCi0gKiAgIC0gVGhlIGNsYXNzIG1heSwgYnV0IGlzIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgWzldLiAKLSAqICAgICBJZiB0aGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLCB0aGUgY2xhc3MgbXVzdCBwcm92aWRlIG5vLW9wIAotICogICAgIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4gVGhlIGNvbnRhaW5lciAKLSAqICAgICB3aWxsIG5ldmVyIGludm9rZSB0aGVzZSBtZXRob2RzIG9uIHRoZSBiZWFuIGluc3RhbmNlcyBhdCBydW50aW1lLgotICogICAtIEEgbm8tb3AgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbWV0aG9kcyBpcyByZXF1aXJlZCB0byBhdm9pZCAKLSAqICAgICBkZWZpbmluZyB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgYWJzdHJhY3QuCi0gKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBidXNpbmVzcyBtZXRob2RzLCBhbmQgdGhlIAotICogICAgIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSwgYW5kIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGFzIGRlc2NyaWJlZCAKLSAqICAgICBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCi0gKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiAKLSAqICAgICBJZiB0aGUgZW50aXR5IGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSAKLSAqICAgICBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcywgdGhlIGZpbmRlciBtZXRob2RzLCBhbmQgdGhlCi0gKiAgICAgbWV0aG9kcyBvZiB0aGUgRW50aXR5QmVhbiBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGluIHRoZSAKLSAqICAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3IgaW4gYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0gKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIGlzIGFsbG93ZWQgdG8gaW1wbGVtZW50IG90aGVyIG1ldGhvZHMgKGZvciAKLSAqICAgICBleGFtcGxlIGhlbHBlciBtZXRob2RzIGludm9rZWQgaW50ZXJuYWxseSBieSB0aGUgYnVzaW5lc3MgbWV0aG9kcykgCi0gKiAgICAgaW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHMgcmVxdWlyZWQgYnkgdGhlIEVKQiBzcGVjaWZpY2F0aW9uLgotICoKLSAqIDkuMi4zIGVqYkNyZWF0ZSBtZXRob2RzCi0gKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyAKLSAqICAgICBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLSAqICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotICogICAgICAgLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogICAgICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLSAqICAgICAgIC0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZS4KLSAqICAgICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotICogICAgICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCAKLSAqICAgICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotICogICAgICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiQ3JlYXRlIG1ldGhvZCB0byB0aHJvdyB0aGUgCi0gKiAgICAgICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgCi0gKiAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0gKiAgICAgICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0gKiAgICAgICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0gKiAgIC0gVGhlIGVudGl0eSBvYmplY3QgY3JlYXRlZCBieSB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgYSB1bmlxdWUgcHJpbWFyeSBrZXkuIAotICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgcHJpbWFyeSBrZXkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcHJpbWFyeSBrZXlzIG9mIGFsbCAKLSAqICAgICB0aGUgZXhpc3RpbmcgZW50aXR5IG9iamVjdHMgd2l0aGluIHRoZSBzYW1lIGhvbWUuIFRoZSBlamJDcmVhdGUgbWV0aG9kIHNob3VsZCAKLSAqICAgICB0aHJvdyB0aGUgRHVwbGljYXRlS2V5RXhjZXB0aW9uIG9uIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGVudGl0eSBvYmplY3Qgd2l0aCAKLSAqICAgICBhIGR1cGxpY2F0ZSBwcmltYXJ5IGtleS4gSG93ZXZlciwgaXQgaXMgbGVnYWwgdG8gcmV1c2UgdGhlIHByaW1hcnkga2V5IG9mIGEKLSAqICAgICBwcmV2aW91c2x5IHJlbW92ZWQgZW50aXR5IG9iamVjdC4KLSAqCi0gKiA5LjIuNCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMKLSAqICAgLSBGb3IgZWFjaCBlamJDcmVhdGUoLi4uKSBtZXRob2QsIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIG1hdGNoaW5nIAotICogICAgIGVqYlBvc3RDcmVhdGUoLi4uKSBtZXRob2QsIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gKiAgICAgICAgLSBUaGUgbWV0aG9kIG5hbWUgbXVzdCBiZSBlamJQb3N0Q3JlYXRlLgotICogICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLSAqICAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotICogICAgICAgIC0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLSAqICAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnRzIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlKC4uLikgbWV0aG9kLgotICogICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotICogICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIHRvIHRocm93IHRoZSAKLSAqICAgICAgICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbnRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMQotICogICAgICAgICAgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotICogICAgICAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLSAqCi0gKiA5LjIuNSBlamJGaW5kIG1ldGhvZHMKLSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGFsc28gZGVmaW5lIGFkZGl0aW9uYWwgZWpiRmluZDxNRVRIT0Q+KC4uLikgZmluZGVyIG1ldGhvZHMuCi0gKiAgIC0gVGhlIHNpZ25hdHVyZXMgb2YgdGhlIGZpbmRlciBtZXRob2RzIG11c3QgZm9sbG93IHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gKiAgIC0gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotICogICAgIChlLmcuIGVqYkZpbmRCeVByaW1hcnlLZXksIGVqYkZpbmRMYXJnZUFjY291bnRzLCBlamJGaW5kTGF0ZVNoaXBtZW50cykuCi0gKiAgIC0gQSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotICogICAtIFRoZSBtZXRob2QgYXJndW1lbnQgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0gKiAgIC0gVGhlIHJldHVybiB0eXBlIG9mIGEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGUsIAotICogICAgIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGluY2x1ZGluZyAKLSAqICAgICB0aGUgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbi4KLSAqICAgLSBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0gKiAgICAgdGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgcHJpbWFyeSBrZXkgdHlwZSAoaS5lLiB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QgbXVzdCAKLSAqICAgICBiZSBhIHNpbmdsZS1vYmplY3QgZmluZGVyKS4KLSAqICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluZGVyIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotICogICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotICogICAgIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLSAqICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotICogICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0gKgotICogOS4yLjYgQnVzaW5lc3MgbWV0aG9kcwotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBidXNpbmVzcyBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0gKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0gKiAgICAgICAgLSBUaGUgbWV0aG9kIG5hbWVzIGNhbiBiZSBhcmJpdHJhcnksIGJ1dCB0aGV5IG11c3Qgbm90IHN0YXJ0IHdpdGggJ2VqYicgdG8gCi0gKiAgICAgICAgICBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB1c2VkIGJ5IHRoZSBFSkIgYXJjaGl0ZWN0dXJlLgotICogICAgICAgIC0gVGhlIGJ1c2luZXNzIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLSAqICAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotICogICAgICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotICogICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucy4KLSAqICAgICAgICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSAKLSAqICAgICAgICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgCi0gKiAgICAgICAgICBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotICogICAgICAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLSAqICAgICAgICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0gKi4uLgotICogOS4yLjkgRW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcwotICouLi4KLSAqICAtIFRoZSBwcmltYXJ5IGtleSB0eXBlIG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLgotICouLi4KLSAqCi0gKiA5LjQuMSBDb250YWluZXItbWFuYWdlZCBmaWVsZHMKLSAqLi4uCi0gKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLSAqICAgICBjb21wbGlhbnQgY29udGFpbmVyLgotICogICAgICAgIC0gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSB0eXBlcyAKLSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0gKiAgICAgICAgICBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHByaW1pdGl2ZSB0eXBlcywgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAKLSAqICAgICAgICAgIHNlcmlhbGl6YWJsZSB0eXBlcywgYW5kIHJlZmVyZW5jZXMgb2YgZW50ZXJwcmlzZSBiZWFucycgcmVtb3RlIG9yIGhvbWUgCi0gKiAgICAgICAgICBpbnRlcmZhY2VzLgotICogICAgICAgIC0gVGhlIENvbnRhaW5lciBQcm92aWRlciBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIHVzZSBKYXZhIHByb2dyYW1taW5nIAotICogICAgICAgICAgbGFuZ3VhZ2UgU2VyaWFsaXphdGlvbiB0byBzdG9yZSB0aGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIGluIHRoZSBkYXRhYmFzZS4gCi0gKiAgICAgICAgICBJZiB0aGUgY29udGFpbmVyIGNob29zZXMgYSBkaWZmZXJlbnQgYXBwcm9hY2gsIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGVxdWl2YWxlbnQgCi0gKiAgICAgICAgICB0byB0aGF0IG9mIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgU2VyaWFsaXphdGlvbi4gVGhlIENvbnRhaW5lciBtdXN0IGFsc28gYmUgCi0gKiAgICAgICAgICBjYXBhYmxlIG9mIHBlcnNpc3RpbmcgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgYW5kIGhvbWUgaW50ZXJmYWNlcyAKLSAqICAgICAgICAgIChmb3IgZXhhbXBsZSwgYnkgc3RvcmluZyB0aGVpciBoYW5kbGUgb3IgcHJpbWFyeSBrZXkpLgotICouLi4KLSAqCi0gKiA5LjQuMiBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUKLSAqLi4uCi0gKiAgIC0gVGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIHRvIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgdHlwZS4gCi0gKiAgICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHNob3VsZCBiZSBjb2RlZCB0byByZXR1cm4gYSBudWxsLiAKLSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotICouLi4KLSAqCi0gKiA5LjQuNiBmaW5kZXIgbWV0aG9kcwotICogICAtIFRoZSBlbnRpdHkgQmVhbiBQcm92aWRlciBkb2VzIG5vdCB3cml0ZSB0aGUgZmluZGVyIChlamJGaW5kPE1FVEhPRD4oLi4uKSkgbWV0aG9kcy4KLSAqLi4uCi0gKiA5LjQuNyBwcmltYXJ5IGtleSB0eXBlCi0gKiAgIC0gVGhlIGNvbnRhaW5lciBtdXN0IGJlIGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gVGhlcmVmb3JlLCAKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSAKLSAqICAgICBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgaW4gdGhpcyBzdWJzZWN0aW9uLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgaW4gCi0gKiAgICAgU3Vic2VjdGlvbiA5LjIuOS4KLSAqCi0gKiAgICAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjbGFzcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZToKLSAqICAgICAgICAtIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBhIHNpbmdsZSBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuCi0gKiAgICAgICAgLSBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcy4KLSAqICAgICBUaGUgc2Vjb25kIG1ldGhvZCBpcyBuZWNlc3NhcnkgZm9yIGltcGxlbWVudGluZyBjb21wb3VuZCBrZXlzLCBhbmQgdGhlIGZpcnN0IG1ldGhvZCBpcyBjb252ZW5pZW50IGZvcgotICogICAgIHNpbmdsZS1maWVsZCBrZXlzLiBXaXRob3V0IHRoZSBmaXJzdCBtZXRob2QsIHNpbXBsZSB0eXBlcyBzdWNoIGFzIFN0cmluZyB3b3VsZCBoYXZlIHRvIGJlIHdyYXBwZWQgaW4gYQotICogICAgIHVzZXItZGVmaW5lZCBjbGFzcy4KLSAqIAotICogICAgIDkuNC43LjEgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBCZWFuIFByb3ZpZGVyIHVzZXMgdGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHNwZWNpZnkgdGhlCi0gKiAgICAgY29udGFpbmVyLW1hbmFnZWQgZmllbGQgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkga2V5LiBUaGUgZmllbGQncyB0eXBlIG11c3QgYmUKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLSAqCi0gKiAgICAgOS40LjcuMiBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0gKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHRoZSBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotICoKLSAqICAgICA5LjQuNy4zIFNwZWNpYWwgY2FzZTogVW5rbm93biBwcmltYXJ5IGtleSBjbGFzcwotICogICAgIEluIHNwZWNpYWwgc2l0dWF0aW9ucywgdGhlIGVudGl0eSBCZWFuIFByb3ZpZGVyIG1heSBjaG9vc2Ugbm90IHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNsYXNzIGZvciBhbgotICogICAgIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIFRoaXMgY2FzZSB1c3VhbGx5IGhhcHBlbnMgd2hlbiB0aGUgZW50aXR5IGJlYW4gZG9lcwotICogICAgIG5vdCBoYXZlIGEgbmF0dXJhbCBwcmltYXJ5IGtleSwgYW5kIHRoZSBCZWFuIFByb3ZpZGVyIHdhbnRzIHRvIGFsbG93IHRoZSBEZXBsb3llciB0byBzZWxlY3QgdGhlIHByaW1hcnkKLSAqICAgICBrZXkgZmllbGRzIGF0IGRlcGxveW1lbnQgdGltZS4gVGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSB3aWxsIHVzdWFsbHkgYmUgZGVyaXZlZCBmcm9tIHRoZSBwcmltYXJ5Ci0gKiAgICAga2V5IHR5cGUgdXNlZCBieSB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBzeXN0ZW0gdGhhdCBzdG9yZXMgdGhlIGVudGl0eSBvYmplY3RzLiBUaGUgcHJpbWFyeSBrZXkKLSAqICAgICB1c2VkIGJ5IHRoZSBkYXRhYmFzZSBzeXN0ZW0gbWF5IG5vdCBiZSBrbm93biB0byB0aGUgQmVhbiBQcm92aWRlci4KLSAqICAgICBXaGVuIGRlZmluaW5nIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGVycHJpc2UgYmVhbiwgdGhlIERlcGxveWVyIG1heSBzb21ldGltZXMgbmVlZCB0byBzdWJjbGFzcwotICogICAgIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0byBhZGQgYWRkaXRpb25hbCBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgKHRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgZm9yIGVudGl0eSBiZWFucwotICogICAgIHRoYXQgZG8gbm90IGhhdmUgYSBuYXR1cmFsIHByaW1hcnkga2V5LCBhbmQgdGhlIHByaW1hcnkga2V5cyBhcmUgc3lzdGVtLWdlbmVyYXRlZCBieSB0aGUgdW5kZXJseWluZwotICogICAgIGRhdGFiYXNlIHN5c3RlbSB0aGF0IHN0b3JlcyB0aGUgZW50aXR5IG9iamVjdHMpLgotICogICAgIEluIHRoaXMgc3BlY2lhbCBjYXNlLCB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgb2YgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMKLSAqICAgICBqYXZhLmxhbmcuT2JqZWN0LCBhbmQgdGhlIHJldHVybiB2YWx1ZSBvZiBlamJDcmVhdGUoKSBtdXN0IGJlIGRlY2xhcmVkIGFzCi0gKiAgICAgamF2YS5sYW5nLk9iamVjdC4gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpbiB0aGUgZGVwbG95bWVudAotICogICAgIGRlc2NyaXB0b3IgYXMgb2YgdGhlIHR5cGUgamF2YS5sYW5nLk9iamVjdC4KLSAqICAgICBUaGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMgc3BlY2lmaWVkIGF0IGRlcGxveW1lbnQgdGltZSBpbiB0aGUgc2l0dWF0aW9ucyB3aGVuIHRoZSBCZWFuIFByb3ZpZGVyIGRldmVsb3BzCi0gKiAgICAgYW4gZW50aXR5IGJlYW4gdGhhdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgYmFjay1lbmRzIHRoYXQgcHJvdmlkZSBwZXJzaXN0ZW5jZSwgYW5kIHdoZW4KLSAqICAgICB0aGVzZSBtdWx0aXBsZSBiYWNrLWVuZHMgcmVxdWlyZSBkaWZmZXJlbnQgcHJpbWFyeSBrZXkgc3RydWN0dXJlcy4KLSAqICAgICBVc2Ugb2YgZW50aXR5IGJlYW5zIHdpdGggYSBkZWZlcnJlZCBwcmltYXJ5IGtleSB0eXBlIHNwZWNpZmljYXRpb24gbGltaXRzIHRoZSBjbGllbnQgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcKLSAqICAgICBtb2RlbCwgYmVjYXVzZSB0aGUgY2xpZW50cyB3cml0dGVuIHByaW9yIHRvIGRlcGxveW1lbnQgb2YgdGhlIGVudGl0eSBiZWFuIG1heSBub3QgdXNlLCBpbiBnZW5lcmFsLAotICogICAgIHRoZSBtZXRob2RzIHRoYXQgcmVseSBvbiB0aGUga25vd2xlZGdlIG9mIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotICogICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG1ldGhvZHMgbXVzdCBiZSBkb25lIGNhcmVmdWxseS4gRm9yIGV4YW1wbGUsIHRoZSBtZXRoLW9kcwotICogICAgIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBFbnRpdHlDb250ZXh0LmdldFByaW1hcnlLZXkoKSwgYmVjYXVzZQotICogICAgIHRoZSByZXR1cm4gdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBEZXBsb3llciBhZnRlciB0aGUgRUpCIGNsYXNzIGhhcyBiZWVuIHdyaXR0ZW4uCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRlRW50aXR5QmVhbiBleHRlbmRzIEFWYWxpZGF0ZUJlYW4gewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFYX0VKQl9FTlRJVFlCRUFOID0gImphdmF4LmVqYi5FbnRpdHlCZWFuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFVEVOVElUWUNPTlRFWFQgPSAic2V0RW50aXR5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBVTlNFVEVOVElUWUNPTlRFWFQgPSAidW5zZXRFbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQkxPQUQgPSAiZWpiTG9hZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFSkJTVE9SRSA9ICJlamJTdG9yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBWF9FSkJfRU5USVRZQ09OVEVYVCA9ICJqYXZheC5lamIuRW50aXR5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNBQ29uc3RydWN0b3IgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzU2V0RW50aXR5Q29udGV4dCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNVbnNldEVudGl0eUNvbnRleHQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRWpiQWN0aXZhdGUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRWpiUGFzc2l2YXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0VqYlJlbW92ZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNFamJMb2FkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0VqYlN0b3JlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGJlYW4ncyBlamJGaW5kIG1ldGhvZCwgcmV0dXJuIHRoZSBtYXRjaGluZyBmaW5kIG1ldGhvZCBmcm9tCi0JICogdGhlIGhvbWUsIGlmIGl0IGV4aXN0cy4gSWYgbm90LCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1hdGNoaW5nSG9tZUZpbmRNZXRob2RFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCksIG1ldGhvZCwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKTsKLQl9Ci0JLyoqCi0JICogZ2V0UGFyZW50TmFtZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCXJldHVybiBKQVZBWF9FSkJfRU5USVRZQkVBTjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGcmFtZXdvcmtNZXRob2QoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKHN1cGVyLmlzRnJhbWV3b3JrTWV0aG9kKG5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBjaGVjayBmb3IgZW50aXR5LXNwZWNpZmljIG1ldGhvZHMKLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCTE9BRCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlNUT1JFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfU0VURU5USVRZQ09OVEVYVCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1VOU0VURU5USVRZQ09OVEVYVCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgbWV0aG9kcyBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgZm9sbG93IHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLAotCSAqIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBtaXNzaW5nIHJlcXVpcmVkIG1ldGhvZHMuCi0JICoKLQkgKiA5LjIuMiBFbnRlcnByaXNlIGJlYW4gY2xhc3MKLQkgKi4uLgotCSAqICAgLSBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBhbiBlbnRpdHkgYmVhbiBjbGFzczoKLQkgKi4uLgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBkZWZpbmUgYSBwdWJsaWMgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotCSAqLi4uCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgYW5kIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlLCBhbmQgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgYXMgZGVzY3JpYmVkIAotCSAqICAgICBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gCi0JICogICAgIElmIHRoZSBlbnRpdHkgYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIAotCSAqICAgICBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcywgdGhlIGZpbmRlciBtZXRob2RzLCBhbmQgdGhlCi0JICogICAgIG1ldGhvZHMgb2YgdGhlIEVudGl0eUJlYW4gaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgCi0JICogICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIGlzIGFsbG93ZWQgdG8gaW1wbGVtZW50IG90aGVyIG1ldGhvZHMgKGZvciAKLQkgKiAgICAgZXhhbXBsZSBoZWxwZXIgbWV0aG9kcyBpbnZva2VkIGludGVybmFsbHkgYnkgdGhlIGJ1c2luZXNzIG1ldGhvZHMpIAotCSAqICAgICBpbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyByZXF1aXJlZCBieSB0aGUgRUpCIHNwZWNpZmljYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnByaW1WYWxpZGF0ZShlamJNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBlamJNZXRob2QuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUE9TVENSRUFURSkpCi0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQllbHNlIGlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5BTElaRSkpCi0JCQl2YWxpZGF0ZUZpbmFsaXplKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCRklORCkpCi0JCQl2YWxpZGF0ZUVqYkZpbmRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQllbHNlIGlmIChpc0J1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKSkKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCQllbHNlCi0JCQl2YWxpZGF0ZUhlbHBlck1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UoZWpiTWV0aG9kKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCVN0cmluZyBuYW1lID0gZWpiTWV0aG9kLmdldE5hbWUoKTsKLQkJaWYgKCFoYXNTZXRFbnRpdHlDb250ZXh0ICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zID0gZWpiTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJaWYgKHBhcmFtcy5sZW5ndGggPT0gMSkgewotCQkJCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShwYXJhbXNbMF0uZ2V0SmF2YVR5cGUoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FTlRJVFlDT05URVhULCBiZWFuKSkpIHsKLQkJCQkJaGFzU2V0RW50aXR5Q29udGV4dCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNVbnNldEVudGl0eUNvbnRleHQgJiYgbmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfVU5TRVRFTlRJVFlDT05URVhUKSkgewotCQkJaWYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCWhhc1Vuc2V0RW50aXR5Q29udGV4dCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VqYkFjdGl2YXRlICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkFDVElWQVRFKSkgewotCQkJaWYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCWhhc0VqYkFjdGl2YXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzRWpiUGFzc2l2YXRlICYmIG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBBU1NJVkFURSkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNFamJQYXNzaXZhdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNFamJSZW1vdmUgJiYgbmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUkVNT1ZFKSkgewotCQkJaWYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCWhhc0VqYlJlbW92ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIWhhc0VqYkxvYWQgJiYgbmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCTE9BRCkpIHsKLQkJCWlmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQloYXNFamJMb2FkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghaGFzRWpiU3RvcmUgJiYgbmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCU1RPUkUpKSB7Ci0JCQlpZiAoZWpiTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJaGFzRWpiU3RvcmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCFoYXNWYWxpZENvbnN0cnVjdG9yICYmIGVqYk1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCWhhc0FDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKGVqYk1ldGhvZCkgJiYgKGVqYk1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkpIHsKLQkJCQloYXNWYWxpZENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogOS4yLjYgQnVzaW5lc3MgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGRlZmluZSB6ZXJvIG9yIG1vcmUgYnVzaW5lc3MgbWV0aG9kcyB3aG9zZSBzaWduYXR1cmVzIAotCSAqICAgICBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAgICAgICAgLSBUaGUgbWV0aG9kIG5hbWVzIGNhbiBiZSBhcmJpdHJhcnksIGJ1dCB0aGV5IG11c3Qgbm90IHN0YXJ0IHdpdGggJ2VqYicgdG8gCi0JICogICAgICAgICAgYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLQkgKiAgICAgICAgLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkgKiAgICAgICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLgotCSAqICAgICAgICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSAKLQkgKiAgICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotCSAqICAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgICAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkgKiAgICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOyAvLyBtYWtlIHN1cmUgdGhhdCBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggJ2VqYicKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDhfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9idXMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9idXMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kV2l0aG91dEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMuCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSAKLQkJLy8gamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyAKLQkJLy8gcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLQkJLy8gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkJLy8gdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZE5vUmVtb3RlRXhjZXB0aW9uKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01ldGhvZE5vUmVtb3RlRXhjZXB0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gRUpCIDIuMCBhZGRlZCAidGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiIgYWJvdmUKLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9idXMpOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuMiBFbnRlcnByaXNlIGJlYW4gY2xhc3MKLQkgKiAgIC0gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgYW4gZW50aXR5IGJlYW4gY2xhc3M6Ci0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5FbnRpdHlCZWFuIGludGVyZmFjZS4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0LgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyBmaW5hbC4KLQkgKi4uLgotCSAqICAgLSBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSBbOV0uIAotCSAqICAgICBJZiB0aGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLCB0aGUgY2xhc3MgbXVzdCBwcm92aWRlIG5vLW9wIAotCSAqICAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuIFRoZSBjb250YWluZXIgCi0JICogICAgIHdpbGwgbmV2ZXIgaW52b2tlIHRoZXNlIG1ldGhvZHMgb24gdGhlIGJlYW4gaW5zdGFuY2VzIGF0IHJ1bnRpbWUuCi0JICogICAtIEEgbm8tb3AgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbWV0aG9kcyBpcyByZXF1aXJlZCB0byBhdm9pZCAKLQkgKiAgICAgZGVmaW5pbmcgdGhlIGVudGl0eSBiZWFuIGNsYXNzIGFzIGFic3RyYWN0LgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1c2luZXNzIG1ldGhvZHMsIGFuZCB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZSwgYW5kIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGFzIGRlc2NyaWJlZCAKLQkgKiAgICAgbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIAotCSAqICAgICBJZiB0aGUgZW50aXR5IGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMsIHRoZSBmaW5kZXIgbWV0aG9kcywgYW5kIHRoZQotCSAqICAgICBtZXRob2RzIG9mIHRoZSBFbnRpdHlCZWFuIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIAotCSAqICAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3IgaW4gYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBpcyBhbGxvd2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIChmb3IgCi0JICogICAgIGV4YW1wbGUgaGVscGVyIG1ldGhvZHMgaW52b2tlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidXNpbmVzcyBtZXRob2RzKSAKLQkgKiAgICAgaW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHMgcmVxdWlyZWQgYnkgdGhlIEVKQiBzcGVjaWZpY2F0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBBbGwgb2YgdGhlIGFib3ZlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IFZhbGlkYXRlQmVhbi4KLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCS8vIFBsdXMsIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIGZpZWxkIGV4aXN0cyBvbiB0aGUgYmVhbi4KLQkJdmVyaWZ5RmllbGRFeGlzdHModmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JLyoqCi0JICogOS4yLjMgZWpiQ3JlYXRlIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyAKLQkgKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0JICogICAgICAgLSBUaGUgbWV0aG9kIG5hbWUgbXVzdCBiZSBlamJDcmVhdGUuCi0JICogICAgICAgLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAgICAgLSBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0JICogICAgICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JICogICAgICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiQ3JlYXRlIG1ldGhvZCB0byB0aHJvdyB0aGUgCi0JICogICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotCSAqICAgICAgICAgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLQkgKiAgICAgICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JICogICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqICAgLSBUaGUgZW50aXR5IG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSBhIHVuaXF1ZSBwcmltYXJ5IGtleS4gCi0JICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgcHJpbWFyeSBrZXkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcHJpbWFyeSBrZXlzIG9mIGFsbCAKLQkgKiAgICAgdGhlIGV4aXN0aW5nIGVudGl0eSBvYmplY3RzIHdpdGhpbiB0aGUgc2FtZSBob21lLiBUaGUgZWpiQ3JlYXRlIG1ldGhvZCBzaG91bGQgCi0JICogICAgIHRocm93IHRoZSBEdXBsaWNhdGVLZXlFeGNlcHRpb24gb24gYW4gYXR0ZW1wdCB0byBjcmVhdGUgYW4gZW50aXR5IG9iamVjdCB3aXRoIAotCSAqICAgICBhIGR1cGxpY2F0ZSBwcmltYXJ5IGtleS4gSG93ZXZlciwgaXQgaXMgbGVnYWwgdG8gcmV1c2UgdGhlIHByaW1hcnkga2V5IG9mIGEKLQkgKiAgICAgcHJldmlvdXNseSByZW1vdmVkIGVudGl0eSBvYmplY3QuCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKi4uLgotCSAqCi0JICogOS40LjIgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlCi0JICouLi4KLQkgKiAgIC0gVGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIHRvIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgdHlwZS4gCi0JICogICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZWpiQ3JlYXRlKC4uLikgbWV0aG9kcyBzaG91bGQgYmUgY29kZWQgdG8gcmV0dXJuIGEgbnVsbC4gCi0JICogICAgIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBpZ25vcmVkIGJ5IHRoZSBDb250YWluZXIuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYkNyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOF9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEwX2VqYkNyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA5X2VqYkNyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JCS8vIEJ1dCBpZiB0aGUgYmVhbiB1c2VzIGphdmEubGFuZy5PYmplY3QgZm9yIGEga2V5LCBkb24ndCBjaGVjayBpZiBpdCdzIHNlcmlhbGl6YWJsZS4KLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShiZWFuKSkgewotCQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEFyZ3VtZW50cyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kV2l0aG91dEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9CQotCQkKLQkJLy8gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZTsgdW5sZXNzIHRoaXMgaXMKLQkJLy8gYSBDTVAsIGFuZCBhbiB1bmtvbnduIHByaW1hcnkga2V5IGNsYXNzIGlzIHVzZWQuIFJlYWQgc2VjdGlvbiA5LjQuNy4zLgotCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZF9rZXlEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCQkvLyBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyAKLQkJLy8gdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCQkvLyBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIAotCQkvLyBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIAotCQkvLyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgCi0JCS8vIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9lamJDcmVhdGUpOwotCi0JCS8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9yIHRoaXMgZWpiQ3JlYXRlIG1ldGhvZC4KLQkJTWV0aG9kIGVqYlBvc3RDcmVhdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUsIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKSk7Ci0JCWlmIChlamJQb3N0Q3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIENoZWNrIGZvciBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGhvbWUsIGFuZCB0aGF0IHRoZSBleGNlcHRpb25zIG9uCi0JCS8vIHRoaXMgbWV0aG9kIGFyZSBhIHN1YnNldCBvZiB0aGUgZXhjZXB0aW9ucyBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kIG9uIHRoZSBob21lLgotCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZF9ob21lRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogOS4yLjMgZWpiQ3JlYXRlIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyAKLQkgKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0JICogICAgICAgLSBUaGUgbWV0aG9kIG5hbWUgbXVzdCBiZSBlamJDcmVhdGUuCi0JICogICAgICAgLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAgICAgLSBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLgotCSAqICAgICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0JICogICAgICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JICogICAgICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiQ3JlYXRlIG1ldGhvZCB0byB0aHJvdyB0aGUgCi0JICogICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotCSAqICAgICAgICAgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLQkgKiAgICAgICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JICogICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqICAgLSBUaGUgZW50aXR5IG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSBhIHVuaXF1ZSBwcmltYXJ5IGtleS4gCi0JICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgcHJpbWFyeSBrZXkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcHJpbWFyeSBrZXlzIG9mIGFsbCAKLQkgKiAgICAgdGhlIGV4aXN0aW5nIGVudGl0eSBvYmplY3RzIHdpdGhpbiB0aGUgc2FtZSBob21lLiBUaGUgZWpiQ3JlYXRlIG1ldGhvZCBzaG91bGQgCi0JICogICAgIHRocm93IHRoZSBEdXBsaWNhdGVLZXlFeGNlcHRpb24gb24gYW4gYXR0ZW1wdCB0byBjcmVhdGUgYW4gZW50aXR5IG9iamVjdCB3aXRoIAotCSAqICAgICBhIGR1cGxpY2F0ZSBwcmltYXJ5IGtleS4gSG93ZXZlciwgaXQgaXMgbGVnYWwgdG8gcmV1c2UgdGhlIHByaW1hcnkga2V5IG9mIGEKLQkgKiAgICAgcHJldmlvdXNseSByZW1vdmVkIGVudGl0eSBvYmplY3QuCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKi4uLgotCSAqCi0JICogOS40LjIgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlCi0JICouLi4KLQkgKiAgIC0gVGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIHRvIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgdHlwZS4gCi0JICogICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZWpiQ3JlYXRlKC4uLikgbWV0aG9kcyBzaG91bGQgYmUgY29kZWQgdG8gcmV0dXJuIGEgbnVsbC4gCi0JICogICAgIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBpZ25vcmVkIGJ5IHRoZSBDb250YWluZXIuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZF9rZXlEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYkNyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFVua25vd24gcHJpbWFyeSBrZXkgY2xhc3MgKHNlY3Rpb24gOS40LjcuMykgaXMgYWxzbyB2YWxpZGF0ZWQgYnkgdGhpcwotCQkvLyBjaGVjaywgYmVjYXVzZSB0aGUgcHJpbWFyeSBrZXkgbXVzdCBiZSBvZiB0eXBlIGphdmEubGFuZy5PYmplY3QsIGFuZAotCQkvLyB0aGUgZWpiQ3JlYXRlIG11c3QgcmV0dXJuIGphdmEubGFuZy5PYmplY3QuCi0JCUphdmFIZWxwZXJzIHByaW1hcnlLZXkgPSBudWxsOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudXNlc1Vua25vd25QcmltYXJ5S2V5KGJlYW4pKSB7Ci0JCQlwcmltYXJ5S2V5ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QsIGJlYW4pOwotCQl9Ci0JCWVsc2UgewotCQkJcHJpbWFyeUtleSA9ICgoRW50aXR5KSBiZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCX0KLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLgotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShwYXJtVHlwZSwgcHJpbWFyeUtleSkpIHsKLQkJCS8vIGlmIHRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBqYXZhLmxhbmcuT2JqZWN0LCBjb3VsZCBiZSBzZWN0aW9uIDkuNC43LjMKLQkJCVN0cmluZyBrZXlOYW1lID0gKHByaW1hcnlLZXkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBwcmltYXJ5S2V5LmdldEphdmFOYW1lKCk7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0ge2tleU5hbWV9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDkuMi41IGVqYkZpbmQgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGFsc28gZGVmaW5lIGFkZGl0aW9uYWwgZWpiRmluZDxNRVRIT0Q+KC4uLikgZmluZGVyIG1ldGhvZHMuCi0JICogICAtIFRoZSBzaWduYXR1cmVzIG9mIHRoZSBmaW5kZXIgbWV0aG9kcyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCSAqICAgLSBBIGZpbmRlciBtZXRob2QgbmFtZSBtdXN0IHN0YXJ0IHdpdGggdGhlIHByZWZpeCAiZWpiRmluZCIgCi0JICogICAgIChlLmcuIGVqYkZpbmRCeVByaW1hcnlLZXksIGVqYkZpbmRMYXJnZUFjY291bnRzLCBlamJGaW5kTGF0ZVNoaXBtZW50cykuCi0JICogICAtIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAtIFRoZSBtZXRob2QgYXJndW1lbnQgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLQkgKiAgICAgb3IgYSBjb2xsZWN0aW9uIG9mIHByaW1hcnkga2V5cyAoc2VlIFNlY3Rpb24gU3Vic2VjdGlvbiA5LjEuOCkuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGluY2x1ZGluZyAKLQkgKiAgICAgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uCi0JICogICAtIEV2ZXJ5IGVudGl0eSBiZWFuIG11c3QgZGVmaW5lIHRoZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gVGhlIHJlc3VsdCB0eXBlIGZvciAKLQkgKiAgICAgdGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgcHJpbWFyeSBrZXkgdHlwZSAoaS5lLiB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QgbXVzdCAKLQkgKiAgICAgYmUgYSBzaW5nbGUtb2JqZWN0IGZpbmRlcikuCi0JICogICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5kZXIgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JICogICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCSAqICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JICogICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JICoKLQkgKiA5LjQuNiBmaW5kZXIgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IEJlYW4gUHJvdmlkZXIgZG9lcyBub3Qgd3JpdGUgdGhlIGZpbmRlciAoZWpiRmluZDxNRVRIT0Q+KC4uLikpIG1ldGhvZHMuCi0JICoKLQkgKiA5LjQuNy4zIChDTVApIFNwZWNpYWwgY2FzZTogVW5rbm93biBwcmltYXJ5IGtleSBjbGFzcy4KLQkgKiAgIC0gSW4gdGhpcyBzcGVjaWFsIGNhc2UsIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCBvZiB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QgCi0JICogICAgIG11c3QgYmUgZGVjbGFyZWQgYXMgamF2YS5sYW5nLk9iamVjdCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgb2YgZWpiQ3JlYXRlKCkgbXVzdCAKLQkgKiAgICAgYmUgZGVjbGFyZWQgYXMgamF2YS5sYW5nLk9iamVjdC4gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSAKLQkgKiAgICAgY2xhc3MgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhcyBvZiB0aGUgdHlwZSBqYXZhLmxhbmcuT2JqZWN0LgotCSAqICAoVGhpcyBkb2VzIG5vdCBuZWVkIHRvIGJlIHZhbGlkYXRlZCBkaXJlY3RseSwgc2luY2UgQ01QcyBkb24ndCBpbXBsZW1lbnQgZmluZGVyIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gVGhpcyBtZXRob2QgaXMgYSBuby1vcCBzbyB0aGF0IHRoZSBkZXBlbmRlbmN5IGNsYXNzZXMgZG9uJ3QgaGF2ZSB0byBpbXBsZW1lbnQgaXQuCi0JCS8vIChUaGlzIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGNhbGxlZCBpbiBhIGRlcGVuZGVuY3kgY2xhc3MuKQotCX0KLQkKLQkvKioKLQkgKiA5LjIuNSBlamJGaW5kIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBhbHNvIGRlZmluZSBhZGRpdGlvbmFsIGVqYkZpbmQ8TUVUSE9EPiguLi4pIGZpbmRlciBtZXRob2RzLgotCSAqICAgLSBUaGUgc2lnbmF0dXJlcyBvZiB0aGUgZmluZGVyIG1ldGhvZHMgbXVzdCBmb2xsb3cgdGhlIGZvbGxvd2luZyBydWxlczoKLQkgKiAgIC0gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotCSAqICAgICAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotCSAqICAgLSBBIGZpbmRlciBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSwgCi0JICogICAgIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCBpbmNsdWRpbmcgCi0JICogICAgIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLgotCSAqICAgLSBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0JICogICAgIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0JICogICAgIGJlIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLgotCSAqICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluZGVyIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotCSAqICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkgKiAgICAgVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotCSAqICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqCi0JICogOS40LjYgZmluZGVyIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBCZWFuIFByb3ZpZGVyIGRvZXMgbm90IHdyaXRlIHRoZSBmaW5kZXIgKGVqYkZpbmQ8TUVUSE9EPiguLi4pKSBtZXRob2RzLgotCSAqCi0JICogOS40LjcuMyAoQ01QKSBTcGVjaWFsIGNhc2U6IFVua25vd24gcHJpbWFyeSBrZXkgY2xhc3MuCi0JICogICAtIEluIHRoaXMgc3BlY2lhbCBjYXNlLCB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgb2YgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIAotCSAqICAgICBtdXN0IGJlIGRlY2xhcmVkIGFzIGphdmEubGFuZy5PYmplY3QsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIG9mIGVqYkNyZWF0ZSgpIG11c3QgCi0JICogICAgIGJlIGRlY2xhcmVkIGFzIGphdmEubGFuZy5PYmplY3QuIFRoZSBCZWFuIFByb3ZpZGVyIG11c3Qgc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgCi0JICogICAgIGNsYXNzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXMgb2YgdGhlIHR5cGUgamF2YS5sYW5nLk9iamVjdC4KLQkgKiAgKFRoaXMgZG9lcyBub3QgbmVlZCB0byBiZSB2YWxpZGF0ZWQgZGlyZWN0bHksIHNpbmNlIENNUHMgZG9uJ3QgaW1wbGVtZW50IGZpbmRlciBtZXRob2RzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZF9ob21lRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkJLy8gYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JCS8vIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkJLy8gKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JCS8vIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkJSmF2YUNsYXNzIGhvbWUgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGhvbWUpOwotCi0JCVN0cmluZyBtZXRob2ROYW1lID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GICsgbWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoNCk7IC8vIGUuZy4gaWYgdGhlIGhvbWUgbWV0aG9kIGlzIG5hbWVkIGZpbmRYLCB0aGVuIHRoZSBiZWFuIG1ldGhvZCB3aWxsIGJlIG5hbWVkIGVqYkZpbmRYCi0JCU1ldGhvZCBob21lTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGhvbWUsIG1ldGhvZCwgbWV0aG9kTmFtZSk7Ci0JCWlmIChob21lTWV0aG9kID09IG51bGwpIHsKLQkJCS8vIFRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQ7IHVubGVzcyB0aGUgbWV0aG9kIGV4aXN0cyBvbiB0aGUgcmVtb3RlLCB0aGlzIGJlYW4gbWV0aG9kIGlzbid0IGEgYnVzaW5lc3MgbWV0aG9kLgotCQkJcmV0dXJuOwotCQl9Ci0JCVNldCBleGNlcHRpb25zID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE5vdFN1YnNldEV4Y2VwdGlvbnMoYmVhbiwgbWV0aG9kLCBob21lTWV0aG9kKTsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBleGMuZ2V0UXVhbGlmaWVkTmFtZSgpLCBob21lLmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDIwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvbGxvd3MgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiA5LjIuNCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMKLQkgKiAtIEZvciBlYWNoIGVqYkNyZWF0ZSguLi4pIG1ldGhvZCwgdGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgbWF0Y2hpbmcgCi0JICogICBlamJQb3N0Q3JlYXRlKC4uLikgbWV0aG9kLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCSAqICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiUG9zdENyZWF0ZS4KLQkgKiAgICAtIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0JICogICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1hdGNoaW5nIAotCSAqICAgICAgZWpiQ3JlYXRlKC4uLikgbWV0aG9kLgotCSAqICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0JICogICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JICogICAgICBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgdG8gdGhyb3cgCi0JICogICAgICB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gCi0JICogICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIAotCSAqICAgICAgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciAKLQkgKiAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSAKLQkgKiAgICAgIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKi4uLgotCSovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJLy8gVGhlIG1ldGhvZCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCBoYXMgYWxyZWFkeSB0ZXN0ZWQgdGhhdCB0aGUgbWV0aG9kIG5hbWUgaXMgZWpiUG9zdENyZWF0ZS4KLQkJaWYgKG1ldGhvZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9lamJQb3N0Q3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChtZXRob2QuaXNGaW5hbCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDlfZWpiUG9zdENyZWF0ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0JCUphdmFIZWxwZXJzIHBhcm1UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJU3RyaW5nIHJldHVyblR5cGVOYW1lID0gKChwYXJtVHlwZSA9PSBudWxsKSA/ICIiIDogcGFybVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXJldHVyblR5cGVOYW1lLmVxdWFscyhJVHlwZUNvbnN0YW50cy5WT0lEKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIAotCQkvLyBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyAKLQkJLy8gdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCQkvLyBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIAotCQkvLyBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIAotCQkvLyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgCi0JCS8vIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9lamJQb3N0Q3JlYXRlKTsKLQotCQkvLyBWZXJpZnkgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgaGFzIGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIG1ldGhvZC4KLQkJTWV0aG9kIGVqYkNyZWF0ZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFLCBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCQlpZiAoZWpiQ3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyOCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCXZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZF9ob21lRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvbGxvd3MgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiA5LjIuNCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMKLQkgKiAtIEZvciBlYWNoIGVqYkNyZWF0ZSguLi4pIG1ldGhvZCwgdGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgbWF0Y2hpbmcgCi0JICogICBlamJQb3N0Q3JlYXRlKC4uLikgbWV0aG9kLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCSAqICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiUG9zdENyZWF0ZS4KLQkgKiAgICAtIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0JICogICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1hdGNoaW5nIAotCSAqICAgICAgZWpiQ3JlYXRlKC4uLikgbWV0aG9kLgotCSAqICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0JICogICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JICogICAgICBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgdG8gdGhyb3cgCi0JICogICAgICB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gCi0JICogICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIAotCSAqICAgICAgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciAKLQkgKiAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSAKLQkgKiAgICAgIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKi4uLgotCSovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kX2hvbWVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFRoZSBtZXRob2Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaGFzIGFscmVhZHkgdGVzdGVkIHRoYXQgdGhlIG1ldGhvZCBuYW1lIGlzIGVqYlBvc3RDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJTWV0aG9kIGNyZWF0ZU1ldGhvZCA9IGdldE1hdGNoaW5nSG9tZUNyZWF0ZU1ldGhvZEV4dGVuZGVkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJaWYgKGNyZWF0ZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQkvLyBJZiB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGNvbXBvbmVudCBwYXJlbnQsIGl0IGlzIGxpa2VseQotCQkJLy8gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGUgbWV0aG9kIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBob21lLgotCQkJLy8gU2luY2Ugb3VyIHRvb2xzIGdlbmVyYXRlIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UgY29kZSwgc3VwcHJlc3MgdGhpcyB3YXJuaW5nLgotCi0JCQkvLyBlamJDcmVhdGUgbWV0aG9kcyB3aGljaCBhcmUgaW5oZXJpdGVkIHZpYSBjb21wb25lbnQgaW5oZXJpdGFuY2UsIGJ1dCBkbyBub3QKLQkJCS8vIGhhdmUgYSBtZXRob2Qgb24gdGhlaXIgaW1tZWRpYXRlIGhvbWUsIGFyZSBmaWx0ZXJlZCBvdXQgdmlhIHRoZSBpc1ZhbGlkKE1ldGhvZCkgbWV0aG9kLgotCi0JCQkvLyBUaGUgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QgY2hlY2tzIGZvciBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2QsIGJ1dCBqdXN0IGluCi0JCQkvLyBjYXNlIHRoZSBlamJDcmVhdGUgbWV0aG9kIGlzIG1pc3NpbmcsIGNoZWNrIGZvciBpdCBoZXJlIHRvby4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IGhvbWVJbnRmLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQotCQkJLy8gQ2FuJ3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMgb2YgYSBtZXRob2Qgd2hpY2ggZG9lc24ndCBleGlzdC4KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFdoZXRoZXIgdGhpcyBpcyBmcm9tIGEgY29tcG9uZW50IGluaGVyaXRhbmNlIG9yIG5vdCwgaWYgdGhlIG1ldGhvZCBleGlzdHMgb24gdGhlCi0JCS8vIGhvbWUsIGNoZWNrIHRoYXQgdGhlIG1ldGhvZCBmb2xsb3dzIHRoZSBzcGVjLgotCi0JCS8vIFNlY3Rpb24gNi4xMC42IChzZXNzaW9uKSwgOS4yLjggKGVudGl0eSksIGRlY2xhcmUgdGhhdCBhbGwgZXhjZXB0aW9ucyBkZWNsYXJlZAotCQkvLyBvbiB0aGUgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mCi0JCS8vIHRoZSBtYXRjaGluZyBjcmVhdGUgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQlTZXQgZXhjZXB0aW9ucyA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXROb3RTdWJzZXRFeGNlcHRpb25zKGJlYW4sIG1ldGhvZCwgY3JlYXRlTWV0aG9kKTsKLQkJaWYgKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIGV4YyA9IChKYXZhQ2xhc3MpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBleGMuZ2V0UXVhbGlmaWVkTmFtZSgpLCBob21lSW50Zi5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQyMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIDkuMi4yIEVudGVycHJpc2UgYmVhbiBjbGFzcwotCSAqLi4uCi0JICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotCSAqLi4uCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotCSAqLi4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaW5hbGl6ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIElmIGl0J3MgImZpbmFsaXplKCkiLCB0aGUgZWpiIGJlYW4gc2hvdWxkbid0IGhhdmUgdGhlIG1ldGhvZC4KLQkJaWYgKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJLy8gVGhpcyBpcyBhIHdhcm5pbmcsIG5vdCBhbiBlcnJvciwgYmVjYXVzZSBFSkIgMS4wIGFsbG93ZWQgdGhlIGZpbmFsaXplKCkgbWV0aG9kIHRvIGJlIGNhbGxlZC4gRUpCIDEuMSAoc2VjdGlvbiA2LjEwLjIpIHNwZWNpZmljYWxseSBwcm9oaWJpdHMgaXQuCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogOS4yLjIgRW50ZXJwcmlzZSBiZWFuIGNsYXNzCi0JICouLi4KLQkgKiAgIC0gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgYW4gZW50aXR5IGJlYW4gY2xhc3M6Ci0JICouLi4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICoKLQkgKiBFSkIgc3BlYyAxLjEsIHAuIDEwNSBleHBsYWlucyB3aHkgdGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgZm9yIGF0IGxlYXN0IG9uZSBlamJDcmVhdGUgbWV0aG9kLgotCSAqICAgIFs2XSBBbiBlbnRpdHkgZW50ZXJwcmlzZSBCZWFuIGhhcyBubyBlamJDcmVhdGUoLi4uKSBhbmQgZWpiUG9zdENyZWF0ZSguLi4pIAotCSAqICAgIG1ldGhvZHMgaWYgaXQgZG9lcyBub3QgZGVmaW5lIGFueSBjcmVhdGUgbWV0aG9kcyBpbiBpdHMgaG9tZSBpbnRlcmZhY2UuIAotCSAqICAgIFN1Y2ggYW4gZW50aXR5IGVudGVycHJpc2UgQmVhbiBkb2VzIG5vdCBhbGxvdyB0aGUgY2xpZW50cyB0byBjcmVhdGUgbmV3IAotCSAqICAgIEVKQiBvYmplY3RzLiBUaGUgZW50ZXJwcmlzZSBCZWFuIHJlc3RyaWN0cyB0aGUgY2xpZW50cyB0byBhY2Nlc3NpbmcgZW50aXRpZXMgCi0JICogICAgdGhhdCB3ZXJlIGNyZWF0ZWQgdGhyb3VnaCBkaXJlY3QgZGF0YWJhc2UgaW5zZXJ0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZ1tdIG1vZGVsT2JqZWN0TmFtZSA9IG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX07Ci0JCWlmICghaGFzVmFsaWRDb25zdHJ1Y3RvciAmJiBoYXNBQ29uc3RydWN0b3IpIHsKLQkJCS8vIElmIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gYXJndW1lbnRzIGRvZXMgbm90IGV4aXN0IGV4cGxpY2l0bHksCi0JCQkvLyBKYXZhIHdpbGwgaW5zZXJ0IG9uZSBhcyBsb25nIGFzIHRoZXJlIGFyZSBubyBjb25zdHJ1Y3RvcnMgZGVmaW5lZCBpbiB0aGUKLQkJCS8vIGNsYXNzLiBJZiB0aGVyZSBpcyBhIGNvbnN0cnVjdG9yLCBKYXZhIGRvZXMgbm90IGluc2VydCBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNTZXRFbnRpdHlDb250ZXh0KSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNVbnNldEVudGl0eUNvbnRleHQpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0VqYkFjdGl2YXRlKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKCFoYXNFamJQYXNzaXZhdGUpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0VqYlJlbW92ZSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDM3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzRWpiTG9hZCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDM4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmICghaGFzRWpiU3RvcmUpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgZXhpc3RzIG9uIHRoZSBiZWFuIGNsYXNzLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHZlcmlmeUZpZWxkRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOwotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNWYWxpZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCWhhc0FDb25zdHJ1Y3RvciA9IGZhbHNlOwotCQloYXNTZXRFbnRpdHlDb250ZXh0ID0gZmFsc2U7Ci0JCWhhc1Vuc2V0RW50aXR5Q29udGV4dCA9IGZhbHNlOwotCQloYXNFamJBY3RpdmF0ZSA9IGZhbHNlOwotCQloYXNFamJQYXNzaXZhdGUgPSBmYWxzZTsKLQkJaGFzRWpiUmVtb3ZlID0gZmFsc2U7Ci0JCWhhc0VqYkxvYWQgPSBmYWxzZTsKLQkJaGFzRWpiU3RvcmUgPSBmYWxzZTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5SG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0NjZiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5SG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBob21lIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotICogICAtIFRoZSBpbnRlcmZhY2UgbXVzdCBleHRlbmQgdGhlIGphdmF4LmVqYi5FSkJIb21lIGludGVyZmFjZS4KLSAqICAgLSBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JLUlJT1AuIAotICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgZm9yIAotICogICAgIFJNSS1JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotICogICAtIFRoZSBob21lIGludGVyZmFjZSBpcyBhbGxvd2VkIHRvIGhhdmUgc3VwZXJpbnRlcmZhY2VzLiBVc2Ugb2YgaW50ZXJmYWNlIAotICogICAgIGluaGVyaXRhbmNlIGlzIHN1YmplY3QgdG8gdGhlIFJNSS1JSU9QIHJ1bGVzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiByZW1vdGUgaW50ZXJmYWNlcy4KLSAqICAgLSBFYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgICAtIEEgY3JlYXRlIG1ldGhvZC4KLSAqICAgICAgLSBBIGZpbmRlciBtZXRob2QuCi0gKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0gKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0gKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSB0eXBlLgotICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0gKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0gKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGNyZWF0ZSBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotICogICAtIEVhY2ggZmluZGVyIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJmaW5kPE1FVEhPRD4iIChlLmcuIGZpbmRMYXJnZUFjY291bnRzKSwgYW5kIGl0Ci0gKiAgICAgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotICogICAgIChlLmcuIGVqYkZpbmRMYXJnZUFjY291bnRzKS4gVGhlIG1hdGNoaW5nIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBoYXZlIHRoZSAKLSAqICAgICBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXkgYmUgZGlmZmVyZW50LikKLSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgZmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSAKLSAqICAgICBpbnRlcmZhY2UgdHlwZSAoZm9yIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLCBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoZm9yIGEgCi0gKiAgICAgbXVsdGktb2JqZWN0IGZpbmRlcikuCi0gKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLSAqICAgICBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIAotICogICAgIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0gKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotICogICAgIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGZpbmQgCi0gKiAgICAgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZUVudGl0eUhvbWUgZXh0ZW5kcyBBVmFsaWRhdGVIb21lIHsKLQlwcml2YXRlIEhhc2hTZXQgZmluZEJ5UEtNZXRob2RzID0gbnVsbDsKLQotCXB1YmxpYyBBVmFsaWRhdGVFbnRpdHlIb21lKCkgewotCQlmaW5kQnlQS01ldGhvZHMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOwotCQlmaW5kQnlQS01ldGhvZHMuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbmNyZW1lbnRGaW5kQnlQcmltYXJ5S2V5Q291bnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBOZWVkIHRvIHRyYWNrIG51bWJlciBvZiBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZHMgZm9yIHRoZQotCQkvLyB2YWxpZGF0ZU1ldGhvZEV4aXN0cygpIGNoZWNrcy4gRG8gbm90IGNoZWNrIG9ubHkgdGhlIGN1cnJlbnQKLQkJLy8gY2xhc3MsIG9yIGEgZmluZEJ5UHJpbWFyeUtleSB3aGljaCBpcyBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBpbnRlcmZhY2UKLQkJLy8gd2lsbCBub3QgYmUgZGV0ZWN0ZWQuCi0JCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5EQllQUklNQVJZS0VZKSkgewotCQkJZmluZEJ5UEtNZXRob2RzLmFkZChtZXRob2QpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIHJldHVybnMgdGhlIHJlbW90ZSBpbnRlcmZhY2UsCi0JICogYW5kIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZU9iamVjdEZpbmRlcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gVGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIGlzIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLgotCQlKYXZhQ2xhc3MgcmVtb3RlSW50ZiA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZW1vdGVJbnRmKTsKLQotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHJlbW90ZUludGYpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kIGlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhhdCB0aGUgZW50aXR5IGhvbWUncyBtZXRob2RzIGNvbXBseSB3aXRoIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICouLi4KLQkgKiAgIC0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS1JSU9QLiAKLQkgKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyBmb3IgCi0JICogICAgIFJNSS1JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCSAqLi4uCi0JICogICAtIEVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogICAgICAtIEEgY3JlYXRlIG1ldGhvZC4KLQkgKiAgICAgIC0gQSBmaW5kZXIgbWV0aG9kLgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSB0eXBlLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkgKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkgKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGNyZWF0ZSBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqICAgLSBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotCSAqICAgICBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0JICogICAgIChlLmcuIGVqYkZpbmRMYXJnZUFjY291bnRzKS4gVGhlIG1hdGNoaW5nIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBoYXZlIHRoZSAKLQkgKiAgICAgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotCSAqICAgICBpbnRlcmZhY2UgdHlwZSAoZm9yIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLCBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoZm9yIGEgCi0JICogICAgIG11bHRpLW9iamVjdCBmaW5kZXIpLgotCSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotCSAqICAgICBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIAotCSAqICAgICBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJGaW5kIG1ldGhvZCBvZiB0aGUgCi0JICogICAgIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGZpbmQgCi0JICogICAgIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgZmluZGVyIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uIAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhpTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvLyBzdXBlci5wcmltVmFsaWRhdGUoaGlNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBoaU1ldGhvZC5nZXROYW1lKCk7Ci0KLQkJLy8gRWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkJLy8gICAtIEEgY3JlYXRlIG1ldGhvZC4KLQkJLy8gICAtIEEgZmluZGVyIG1ldGhvZC4KLQkJaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpCi0JCQl2YWxpZGF0ZUNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIGhpTWV0aG9kKTsKLQkJZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRklORCkpCi0JCQl2YWxpZGF0ZUZpbmRNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCk7Ci0JCWVsc2UgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBoaU1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7Ci0KLQkJaWYgKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkuZXF1YWxzKGVqYk1ldGhvZC5nZXROYW1lKCkpKQotCQkJaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCSG9tZSBpbnRlcmZhY2UuCi0JICouLi4KLQkgKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UgCi0JICogICAgIGluaGVyaXRhbmNlIGlzIHN1YmplY3QgdG8gdGhlIFJNSS1JSU9QIHJ1bGVzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiByZW1vdGUgaW50ZXJmYWNlcy4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JCS8vIFRoZSBzdXBlcmNsYXNzIGNoZWNrcyB0aGF0IHRoZSBob21lIGV4dGVuZHMgamF2YXguZWpiLkVKQkhvbWUsCi0JCS8vIGFuZCB0aGF0IHRoZSBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgY29tcGxpZXMgd2l0aCBSTUktSUlPUCBydWxlcy4KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGNyZWF0ZSBtZXRob2Qgb24gdGhlIGVudGl0eSBob21lIGZvbGxvd3MgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIHR5cGUuCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJLy8KLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkJLy8gYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JCS8vIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkJLy8gKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JCS8vIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkJdmFsaWRhdGVDcmVhdGVNZXRob2RfYmVhbkRlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4KLQkJdmFsaWRhdGVDcmVhdGVNZXRob2RfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGNyZWF0ZSBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NDcmVhdGVFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9DUkVBVEVFWENFUFRJT04gfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JLUlJT1AuIAotCQkvLyBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIGZvciAKLQkJLy8gUk1JLUlJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBjcmVhdGUgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBmb2xsb3dzIHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSB0eXBlLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkgKiAgICAgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkgKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJc3VwZXIudmFsaWRhdGVDcmVhdGVNZXRob2RfYmVhbkRlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8KLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkJLy8gYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JCS8vIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkJLy8gKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JCS8vIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkJdmFsaWRhdGVNYXRjaGluZ0JlYW5Qb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogSW4gYWRkaXRpb24gdG8gcmVndWxhciBmaW5kIHJ1bGVzLCBmaW5kQnlQcmltYXJ5S2V5IG5lZWRzIHRvIGZvbGxvdyBzb21lIG90aGVyIHJ1bGVzLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqLi4uCi0JICogICAtIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JICogICAgIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JICogICAgIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kX2tleURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNWYWxpZEZCUEtNZXRob2QgPSBmYWxzZTsKLQkJRW50aXR5IGVudGl0eUJlYW4gPSAoRW50aXR5KSBiZWFuOyAvLyBiZWFuIGlzIGNoZWNrZWQgZm9yIG51bGwgaW4gQVZhbGlkYXRlRUpCLnZhbGlkYXRlKCkgbWV0aG9kLCBzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBpdCBoZXJlLgotCQlKYXZhQ2xhc3Mga2V5Q2xhc3MgPSBlbnRpdHlCZWFuLmdldFByaW1hcnlLZXkoKTsKLQkJCi0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBrZXlDbGFzcyk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkJLy8gVGhpcyBjaGVjayBhbHNvIHZhbGlkYXRlcyBjYXNlIDkuNC43LjMgKENNUCB1bmtub3duIHByaW1hcnkga2V5IGNsYXNzLAotCQkvLyB3aGljaCBtdXN0IGJlIGRlY2xhcmVkIGFzIGphdmEubGFuZy5PYmplY3QuKQotCQlKYXZhUGFyYW1ldGVyW10gcGFybXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCWlmIChwYXJtcy5sZW5ndGggPT0gMSkgewotCQkJSmF2YUhlbHBlcnMgdHlwZSA9IHBhcm1zWzBdLmdldEphdmFUeXBlKCk7Ci0JCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odHlwZSwga2V5Q2xhc3MpKSB7Ci0JCQkJLy8gY2hlY2sgdGhhdCBpdCdzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIKLQkJCQlpZiAoaXNTaW5nbGVPYmplY3RGaW5kZXIodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7Ci0JCQkJCWhhc1ZhbGlkRkJQS01ldGhvZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY2hlY2sgaWYgaXQncyBqYXZhLmxhbmcuT2JqZWN0LiBJZiBpdCBpcywgdGhpcyBjb3VsZCBiZSBhIGNhc2Ugb2YgOS40LjcuMy4KLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU2FtZVR5cGUodHlwZSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1QsIGVudGl0eUJlYW4pKSkgewotCQkJCQloYXNWYWxpZEZCUEtNZXRob2QgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghaGFzVmFsaWRGQlBLTWV0aG9kKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBrZXlDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW4gYWRkaXRpb24gdG8gcmVndWxhciBmaW5kIHJ1bGVzLCBmaW5kQnlQcmltYXJ5S2V5IG5lZWRzIHRvIGZvbGxvdyBzb21lIG90aGVyIHJ1bGVzLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqLi4uCi0JICogICAtIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JICogICAgIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JICogICAgIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kX3JlbW90ZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmICghaXNTaW5nbGVPYmplY3RGaW5kZXIodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7Ci0JCQlTdHJpbmcgcmVtb3RlSW50Zk5hbWUgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpLmdldE5hbWUoKTsgLy8gQ2FuIGFzc3VtZSB0aGF0IHJlbW90ZSBpbnRlcmZhY2UgaXNuJ3QgbnVsbCwgb3IgaXNTaW5nbGVPYmplY3RGaW5kZXIgd291bGQgaGF2ZSB0aHJvd24gYW4gSW52YWxpZElucHV0RXhjZXB0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQwMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7IHJlbW90ZUludGZOYW1lIH0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZmluZGVyIG1ldGhvZCBvbiB0aGUgZW50aXR5IGhvbWUgY2xhc3MgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqLi4uCi0JICogICAtIEVhY2ggZmluZGVyIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJmaW5kPE1FVEhPRD4iIChlLmcuIGZpbmRMYXJnZUFjY291bnRzKSwgYW5kIGl0Ci0JICogICAgIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLQkgKiAgICAgKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotCSAqICAgICBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXkgYmUgZGlmZmVyZW50LikKLQkgKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgCi0JICogICAgIGludGVyZmFjZSB0eXBlIChmb3IgYSBzaW5nbGUtb2JqZWN0IGZpbmRlciksIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChmb3IgYSAKLQkgKiAgICAgbXVsdGktb2JqZWN0IGZpbmRlcikuCi0JICouLi4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCSAqICAgICBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kIAotCSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBpbmNsdWRlIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotCQkvLyBpbnRlcmZhY2UgdHlwZSAoZm9yIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLCBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoZm9yIGEgCi0JCS8vIG11bHRpLW9iamVjdCBmaW5kZXIpLgotCQkvLwotCQkvLyBXaGV0aGVyIG9yIG5vdCB0aGUgcGFyYW1ldGVyIGlzIGEgdHlwZSBvciBhbiBhcnJheSBvZiB0eXBlcywgdGhlIGZvbGxvd2luZwotCQkvLyBjYWxsIHdpbGwgcmV0dXJuIHRoZSBiYXNlIHR5cGUuIGkuZS4sIGlmIGl0J3MgYW4gYXJyYXkgb2YgIk15Q2xhc3MiLAotCQkvLyB0aGUgcmV0dXJuVHlwZU5hbWUgd2lsbCBiZSBzZXQgdG8gIk15Q2xhc3MiLCBub3QgYW4gYXJyYXkgdHlwZS4KLQkJdmFsaWRhdGVGaW5kTWV0aG9kX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbi4gCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0ZpbmRlckV4Y2VwdGlvbihiZWFuLCBtZXRob2QpKSB7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0ZJTkRFUkVYQ0VQVElPTiB9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0JCS8vIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0JCS8vIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCWJvb2xlYW4gdmFsaWRhdGVSTUlQYXJhbWV0ZXJzID0gdHJ1ZTsgLy8gc2hvdWxkIHRoZSBwYXJhbWV0ZXJzIGJlIHZhbGlkYXRlZCB0byBzZWUgaWYgdGhleSBmb2xsb3cgUk1JLUlJT1AgcnVsZXM/Ci0JCWJvb2xlYW4gdmFsaWRhdGVSTUlSZXRUeXBlID0gdHJ1ZTsgLy8gc2hvdWxkIHRoZSByZXR1cm4gdHlwZSBiZSB2YWxpZGF0ZWQgdG8gc2VlIGlmIGl0IGZvbGxvd3MgUk1JLUlJT1AgcnVsZXM/Ci0JCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9GSU5EQllQUklNQVJZS0VZKSkgewotCQkJLy8gLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotCQkJLy8gYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkJCS8vIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCQkvLwotCQkJLy8gVGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIGlzIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLgotCQkJLy8gVGhlIGNhbGwgdG8gdmFsaWRhdGVGaW5kQnlQcmltYXJ5S2V5TWV0aG9kX3JlbW90ZURlcCBpcyBkb25lIGluCi0JCQkvLyB2YWxpZGF0ZUZpbmRNZXRob2RfcmVtb3RlRGVwKG1ldGhvZCk7Ci0JCQkvL3ZhbGlkYXRlRmluZEJ5UHJpbWFyeUtleU1ldGhvZF9yZW1vdGVEZXAobWV0aG9kKTsKLQotCQkJLy8gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIGFzIHRoZSBtZXRob2QgYXJndW1lbnQuCi0JCQl2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2Rfa2V5RGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShiZWFuKSkgewotCQkJCXZhbGlkYXRlUk1JUGFyYW1ldGVycyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCQkJCQotCQkvLyBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JLUlJT1AuIAotCQkvLyBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIGZvciAKLQkJLy8gUk1JLUlJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JCS8vIEhvd2V2ZXIsIHRoZSByZXR1cm4gdHlwZSBvZiAiRW51bWVyYXRpb24iIG9yICJDb2xsZWN0aW9uIiBpcyBleGVtcHRlZCBmcm9tIHRoaXMKLQkJLy8gY2hlY2ssIGJlY2F1c2UgdGhlIHNwZWMgc3RhdGVzLCBpbiA5LjEuOC4yLCB0aGF0IEVudW1lcmF0aW9uIG9yIENvbGxlY3Rpb24gbXVzdCBiZSByZXR1cm5lZAotCQkvLyBmb3IgbXVsdGktb2JqZWN0IGZpbmRlcnMuCi0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQl2YWxpZGF0ZVJNSVJldFR5cGUgPSAhKChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXRUeXBlLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0VOVU1FUkFUSU9OLCBiZWFuKSkpIHx8IAotCQkJCQkJCQkoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0VHlwZSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKSkpKTsKLQkJCi0JCWlmKHZhbGlkYXRlUk1JUGFyYW1ldGVycykgewotCQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZEFyZ3VtZW50cyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJCi0JCWlmKHZhbGlkYXRlUk1JUmV0VHlwZSkgewotCQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZFJldHVyblR5cGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kRXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBmaW5kZXIgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBjbGFzcyBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICouLi4KLQkgKiAgIC0gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkgKiAgICAgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCSAqICAgICAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JICogICAgIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgZmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSAKLQkgKiAgICAgaW50ZXJmYWNlIHR5cGUgKGZvciBhIHNpbmdsZS1vYmplY3QgZmluZGVyKSwgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKGZvciBhIAotCSAqICAgICBtdWx0aS1vYmplY3QgZmluZGVyKS4KLQkgKi4uLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJGaW5kIG1ldGhvZCBvZiB0aGUgCi0JICogICAgIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGZpbmQgCi0JICogICAgIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgZmluZGVyIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uIAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZF9yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotCQkvLyBpbnRlcmZhY2UgdHlwZSAoZm9yIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLCBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZiAoZm9yIGEgCi0JCS8vIG11bHRpLW9iamVjdCBmaW5kZXIpLgotCQkvLwotCQkvLyBXaGV0aGVyIG9yIG5vdCB0aGUgcGFyYW1ldGVyIGlzIGEgdHlwZSBvciBhbiBhcnJheSBvZiB0eXBlcywgdGhlIGZvbGxvd2luZwotCQkvLyBjYWxsIHdpbGwgcmV0dXJuIHRoZSBiYXNlIHR5cGUuIGkuZS4sIGlmIGl0J3MgYW4gYXJyYXkgb2YgIk15Q2xhc3MiLAotCQkvLyB0aGUgcmV0dXJuVHlwZU5hbWUgd2lsbCBiZSBzZXQgdG8gIk15Q2xhc3MiLCBub3QgYW4gYXJyYXkgdHlwZS4KLQkJSmF2YUNsYXNzIHJlbW90ZUludGYgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVtb3RlSW50Zik7Ci0KLQkJLy8gUGVyZm9ybSB0aGlzIGNoZWNrIGZvciBhbGwgZmluZGVycyBidXQgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLgotCQkvLyBUaGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIGJlY2F1c2UgdGhlIG1ldGhvZCBpcwotCQkvLyBhIHNpbmdsZS1vYmplY3QgZmluZGVyIG1ldGhvZDsgYnV0IG90aGVyIGZpbmRlcnMgbWF5IHJldHVybiBhIENvbGxlY3Rpb24gb3IgRW51bWVyYXRpb24uCi0JCWlmICghbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCi0JCQlpZiAoISAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb21Db2xsZWN0aW9uKHJldHVyblR5cGUsIGJlYW4pIHx8IAotCQkJICAgICAgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tRW51bWVyYXRpb24ocmV0dXJuVHlwZSwgYmVhbikgfHwgCi0JCQkgICAgICAgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuVHlwZSwgcmVtb3RlSW50ZikpKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgcmVtb3RlSW50Zi5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLQkJLy8gYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkJLy8gYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0ZJTkRCWVBSSU1BUllLRVkpKSB7Ci0JCQl2YWxpZGF0ZUZpbmRCeVByaW1hcnlLZXlNZXRob2RfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdCZWFuQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlzdXBlci52YWxpZGF0ZU1hdGNoaW5nQmVhbkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCU1ldGhvZCBlamJDcmVhdGVNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbkNsYXNzLCBtZXRob2QsIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURSk7Ci0JCWlmIChlamJDcmVhdGVNZXRob2QgPT0gbnVsbCkgewotCQkJLy8gYWxyZWFkeSByZXBvcnRlZCBpbiBzdXBlcgotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSBmaW5kZXIgbWV0aG9kIG9uIHRoZSBlbnRpdHkgaG9tZSBjbGFzcyBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggZmluZGVyIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJmaW5kPE1FVEhPRD4iIChlLmcuIGZpbmRMYXJnZUFjY291bnRzKSwgYW5kIGl0Ci0JICogICAgIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLQkgKiAgICAgKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotCSAqICAgICBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXkgYmUgZGlmZmVyZW50LikKLQkgKi4uLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJGaW5kIG1ldGhvZCBvZiB0aGUgCi0JICogICAgIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGZpbmQgCi0JICogICAgIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhbkZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBob21lTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlpZiAoaG9tZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotCQkvLyBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0JCS8vIChlLmcuIGVqYkZpbmRMYXJnZUFjY291bnRzKS4gVGhlIG1hdGNoaW5nIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBoYXZlIHRoZSAKLQkJLy8gc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0JCVN0cmluZyBmaW5kTWV0aG9kTmFtZSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCRiArIChob21lTWV0aG9kLmdldE5hbWUoKSkuc3Vic3RyaW5nKDEpOyAvLyBlLmcuIGlmIHRoZSBob21lIG1ldGhvZCBpcyBuYW1lZCBmaW5kWCwgdGhlbiB0aGUgYmVhbiBtZXRob2Qgd2lsbCBiZSBuYW1lZCBlamJGaW5kWAotCi0JCUphdmFDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuQ2xhc3MpOwotCi0JCU1ldGhvZCBiZWFuTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgaG9tZU1ldGhvZCwgZmluZE1ldGhvZE5hbWUpOwotCQlpZiAoYmVhbk1ldGhvZCA9PSBudWxsKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG5ldyBTdHJpbmdbXSB7IGJlYW5DbGFzcy5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDaGVjayBpZiByZXR1cm4gdHlwZXMgbWF0Y2gKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJSmF2YUhlbHBlcnMgaG9tZVJldFR5cGUgPSBob21lTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJSmF2YUhlbHBlcnMgYmVhblJldFR5cGUgPSBiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShob21lUmV0VHlwZSwgYmVhblJldFR5cGUpKSB7Ci0JCQkvLyBlbWl0IHRoZSBlcnJvciBvbmx5IGlmIGl0J3MgYSBtdWx0aS1maW5kZXIuIFNpbmdsZS1maW5kZXJzIGFyZSBzdXBwb3NlZCB0byBoYXZlIGRpZmZlcmVudCByZXR1cm4gdHlwZXMgb24gdGhlIGhvbWUgJiBiZWFuIGNsYXNzLgotCQkJYm9vbGVhbiBob21lUmV0VHlwZUlzUmVtb3RlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oaG9tZVJldFR5cGUsIGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCQkJYm9vbGVhbiBiZWFuUmV0VHlwZUlzS2V5ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oYmVhblJldFR5cGUsICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSk7Ci0JCQlpZighKGhvbWVSZXRUeXBlSXNSZW1vdGUgJiYgYmVhblJldFR5cGVJc0tleSkpIHsKLQkJCQlKYXZhSGVscGVycyByZXRUeXBlID0gKGJlYW5SZXRUeXBlSXNLZXkpID8gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSA6IGJlYW5SZXRUeXBlOyAvLyBpZiB0aGUgYmVhbiBjbGFzcyByZXR1cm5zIGEga2V5LCB0aGUgaG9tZSBtdXN0IHJldHVybiB0aGUgcmVtb3RlOyBpZiB0aGUgYmVhbiBjbGFzcyByZXR1cm5zIGEgQ29sbC9FbnVtLCB0aGUgaG9tZSBtdXN0IHJldHVybiB0aGUgc2FtZQotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgcmV0VHlwZS5nZXRKYXZhTmFtZSgpLCBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkJLy8gZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQkvKgotCQkvLyBEb24ndCBjaGVjayBmb3IgdGhlIGV4Y2VwdGlvbnMgaGVyZSAtIGxldCB0aGUgYmVhbiBjbGFzcyBkbyBpdC4gV2hlbiB0aGUgaG9tZQotCQkvLyBjaGFuZ2VzLCBhICJkZXBlbmRlbnQiIHZhbGlkYXRpb24gb2YgdGhlIGJlYW4ncyBjaGVja3Mgc2hvdWxkIGJlIGRvbmUgYXV0b21hdGljYWxseS4KLQkJLy8gSWYgaXQgaXMgY2hlY2tlZCBpbiB0aGlzIG1ldGhvZCBhcyB3ZWxsLCB0aGVyZSBhcmUgZHVwbGljYXRlIG1lc3NhZ2VzIG9uIHRoZSB0YXNrIGxpc3QuCi0JCUhhc2hTZXQgZXhjZXB0aW9ucyA9IGdldE5vdFN1YnNldEV4Y2VwdGlvbnMoaG9tZU1ldGhvZCwgYmVhbk1ldGhvZCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX01FVEhPRF9USFJPV19OT1RISV9FWENFUCwgbXNnUGFybSwgYmVhbk1ldGhvZCwgRUpCX0JFQU5fR1JPVVApOwotCQkJfQotCQl9CQotCQkqLwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgY3JlYXRlIG1ldGhvZCBvbiB0aGUgZW50aXR5IGhvbWUgaGFzIGEgbWF0Y2hpbmcgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG9uIHRoZSBiZWFuLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICouLi4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdCZWFuUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhvbWVNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWlmIChob21lTWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkJLy8gZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkJLy8gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW5DbGFzcyk7Ci0KLQkJTWV0aG9kIGJlYW5NZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbkNsYXNzLCBob21lTWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFKTsKLQkJaWYgKGJlYW5NZXRob2QgPT0gbnVsbCkgewotCQkJLy8gTGV0IHRoZSBiZWFuIGNsYXNzIHJlcG9ydCB0aGlzIG1lc3NhZ2UuIE90aGVyd2lzZSwgd2hlbiB0aGUgYmVhbiBjbGFzcyByZXBvcnRzIGl0LCB0aGlzIG1lc3NhZ2UgbG9va3MgbGlrZSBhIGR1cGxpY2F0ZS4KLQkJCS8qCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMzEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgaG9tZU1ldGhvZCwgbmV3IFN0cmluZ1tdIHsgYmVhbkNsYXNzLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCSovCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotCQkvLyBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLQkJLy8gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIAotCQkvLyAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLQkJLy8gb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotCQkvKgotCQkvLyBEb24ndCBjaGVjayBmb3IgdGhlIGV4Y2VwdGlvbnMgaGVyZSAtIGxldCB0aGUgYmVhbiBjbGFzcyBkbyBpdC4gV2hlbiB0aGUgaG9tZQotCQkvLyBjaGFuZ2VzLCBhICJkZXBlbmRlbnQiIHZhbGlkYXRpb24gb2YgdGhlIGJlYW4ncyBjaGVja3Mgc2hvdWxkIGJlIGRvbmUgYXV0b21hdGljYWxseS4KLQkJLy8gSWYgaXQgaXMgY2hlY2tlZCBpbiB0aGlzIG1ldGhvZCBhcyB3ZWxsLCB0aGVyZSBhcmUgZHVwbGljYXRlIG1lc3NhZ2VzIG9uIHRoZSB0YXNrIGxpc3QuCi0JCUhhc2hTZXQgZXhjZXB0aW9ucyA9IGdldE5vdFN1YnNldEV4Y2VwdGlvbnMoaG9tZU1ldGhvZCwgYmVhbk1ldGhvZCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX01FVEhPRF9USFJPV19OT1RISV9FWENFUCwgbXNnUGFybSwgYmVhbk1ldGhvZCwgRUpCX0JFQU5fR1JPVVApOwotCQkJfQotCQl9Ci0JCSovCi0JfQotCQotCS8qKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLQkgKiAgICAgYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkgKiAgICAgYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIC0gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYWx3YXlzIGluY2x1ZGUgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLCB3aGljaCBpcyAKLQkJLy8gYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLQkJLy8gYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLQkJaWYgKGZpbmRCeVBLTWV0aG9kcy5zaXplKCkgPT0gMCkgewotCQkJLy8gbXVzdCBoYXZlIG9uZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZAotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDExLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJLyoKLQkJLy8gTm90IHN1cmUgaWYgdGhpcyBjaGVjayBpcyB1c2VmdWwgb3Igbm90LCBiZWNhdXNlIGl0IGlzIGxlZ2FsIGZvciBhIGNoaWxkIGhvbWUgdG8gZGVjbGFyZSBhIGZpbmRCeVByaW1hcnlLZXksCi0JCS8vIGFuZCBhbHNvIGZvciBhIHBhcmVudCBob21lIHRvIGRlY2xhcmUgYSBmaW5kQnlQcmltYXJ5S2V5LgotCQllbHNlIGlmICggZmluZEJ5UEtNZXRob2RzLnNpemUoKSA+IDEgKSB7Ci0JCQkvLyBpZiB0aGUgaG9tZSBpbnRlcmZhY2UgaGFzIG11bHRpcGxlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kcyAoaW1wbGllZCBieSA5LjIuOCkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmluZEJ5UEtNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5FSkJfSEFTX01VTFRJUExFX1BLX01FVEhPRFMsIChNZXRob2QpaXRlcmF0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCQkqLwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVIb21lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTU5YzExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVIb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBob21lIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotICouLi4KLSAqIFRoZSBob21lIGludGVyZmFjZSBvZiBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gbXVzdCBoYXZlIG9uZSBjcmVhdGUgCi0gKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0gKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgc2luZ2xlIGVqYkNyZWF0ZSBtZXRob2QgdGhhdCB0YWtlcyAKLSAqIG5vIGFyZ3VtZW50cy4KLSAqLi4uCi0gKgotICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0gKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0gKiAgIC0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQkhvbWUgaW50ZXJmYWNlLgotICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUkvSUlPUC4gCi0gKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0gKiAgICAgZm9yIFJNSS9JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotICogICAtIFRoZSBob21lIGludGVyZmFjZSBpcyBhbGxvd2VkIHRvIGhhdmUgc3VwZXJpbnRlcmZhY2VzLiBVc2Ugb2YgaW50ZXJmYWNlIAotICogICAgIGluaGVyaXRhbmNlIGlzIHN1YmplY3QgdG8gdGhlIFJNSS9JSU9QIHJ1bGVzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiAKLSAqICAgICByZW1vdGUgaW50ZXJmYWNlcy4KLSAqICAgLSBBIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlIG11c3QgZGVmaW5lIG9uZSBvciBtb3JlIGNyZWF0ZSguLi4pIG1ldGhvZHMuCi0gKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLSAqICAgICB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLiBUaGUgbWF0Y2hpbmcgCi0gKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0gKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotICogICAgIGludGVyZmFjZSB0eXBlLgotICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0gKiAgICAgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotICogICAgIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotICouLi4KLSAqCi0gKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0gKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLSAqICAgLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCSG9tZSBpbnRlcmZhY2UuCi0gKiAgIC0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS1JSU9QLiAKLSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIGZvciAKLSAqICAgICBSTUktSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgaXMgYWxsb3dlZCB0byBoYXZlIHN1cGVyaW50ZXJmYWNlcy4gVXNlIG9mIGludGVyZmFjZSAKLSAqICAgICBpbmhlcml0YW5jZSBpcyBzdWJqZWN0IHRvIHRoZSBSTUktSUlPUCBydWxlcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgcmVtb3RlIGludGVyZmFjZXMuCi0gKiAgIC0gRWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICAgLSBBIGNyZWF0ZSBtZXRob2QuCi0gKiAgICAgIC0gQSBmaW5kZXIgbWV0aG9kLgotICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotICogICAgIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cy4gCi0gKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgdHlwZS4KLSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZWpiQ3JlYXRlIAotICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLSAqICAgICAoaS5lIHRoZSBzZXQgb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIGEgc3VwZXJzZXQKLSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0gKiAgIC0gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBjcmVhdGUgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqICAgLSBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotICogICAgIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLSAqICAgICAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0gKiAgICAgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0gKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgCi0gKiAgICAgaW50ZXJmYWNlIHR5cGUgKGZvciBhIHNpbmdsZS1vYmplY3QgZmluZGVyKSwgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKGZvciBhIAotICogICAgIG11bHRpLW9iamVjdCBmaW5kZXIpLgotICogICAtIFRoZSBob21lIGludGVyZmFjZSBtdXN0IGFsd2F5cyBpbmNsdWRlIHRoZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCwgd2hpY2ggaXMgCi0gKiAgICAgYWx3YXlzIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIuIFRoZSBtZXRob2QgbXVzdCBkZWNsYXJlIHRoZSBwcmltYXJ5IGtleSBjbGFzcyAKLSAqICAgICBhcyB0aGUgbWV0aG9kIGFyZ3VtZW50LgotICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLSAqICAgICBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kIAotICogICAgIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0gKiAgIC0gVGhlIHRocm93cyBjbGF1c2Ugb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgaW5jbHVkZSB0aGUgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbi4gCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVIb21lIGV4dGVuZHMgQVZhbGlkYXRlRUpCIHsKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gQSBob21lIG9yIGNvbXBvbmVudCBjbGFzcyBuZWVkcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMnIGV4dGVuZGVkIG1ldGhvZHM6Ci0JCS8vICAgIDEuIGJlYW4gY2xhc3MKLQkJTGlzdFtdIHJlc3VsdCA9IG5ldyBMaXN0WzFdOwotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlpZihiZWFuQ2xhc3MgPT0gbnVsbCkgewotCQkJcmVzdWx0WzBdID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdFswXSA9IGJlYW5DbGFzcy5nZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldEZpZWxkc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBob21lIG9yIGNvbXBvbmVudCdzIGZpZWxkIGlzIGRlZmluZWQgb24gYW5vdGhlciBjbGFzcwotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEZvciB0aGUgY2hlY2sgdGhhdCB0aGUgZWpiQ3JlYXRlIG1ldGhvZCBoYXMgYSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9uIHRoZSBob21lLAotCSAqIHRoaXMgbWV0aG9kLCBnaXZlbiB0aGUgYmVhbiBtZXRob2QsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaG9tZSBtZXRob2QuCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0JICogICAgIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotCSAqICAgICBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0JICogICAgIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICoKLQkgKiA5LjIuOCBFbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLiAKLQkgKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLQkgKiAgICAgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBCZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gCi0JICogICAgIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBjcmVhdGUgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZSAKLQkgKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0JICogICAgIG9mIHRoZSB1bmlvbiBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcykKLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1hdGNoaW5nQmVhbkVqYkNyZWF0ZU1ldGhvZEV4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChiZWFuLmdldEVqYkNsYXNzKCksIG1ldGhvZCwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBjYW4sIGFuZCBzaG91bGQsIGJlIHZhbGlkYXRlZC4KLQkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBtZXRob2RzIChpLmUuLCBudWxsKSwgYW5kIG1ldGhvZHMgd2hpY2gKLQkgKiBiZWxvbmcgdG8gdGhlIGJhc2UgdHlwZSwgd2hhdGV2ZXIgdGhhdCBpcy4gKGUuZy4gamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChzdXBlci5pc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KSkgewotCQkJLy8gRXhjbHVkZSByb290IHJlbW90ZSBpbnRlcmZhY2UgbWV0aG9kcwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0VKQkhvbWVNZXRob2QoYmVhbiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0NsaW5pdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIFRoZSBpbnRlcmZhY2UgbXVzdCBleHRlbmQgdGhlIGphdmF4LmVqYi5FSkJIb21lIGludGVyZmFjZS4KLQkgKi4uLgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCSG9tZSBpbnRlcmZhY2UuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBob21lIGludGVyZmFjZSBtdXN0IGJlIGFuIGludGVyZmFjZQotCQlpZiAoIWNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAxMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gaG9tZSBpbnRlcmZhY2UgbXVzdCBpbmhlcml0IGphdmF4LmVqYi5FSkJIb21lLmNsYXNzCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oY2xhenosIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCSE9NRSwgYmVhbikpKSB7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUUgfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNVbm5hbWVkUGFja2FnZShjbGF6ei5nZXRKYXZhUGFja2FnZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotCSAqLi4uCi0JICogVGhlIGhvbWUgaW50ZXJmYWNlIG9mIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbiBtdXN0IGhhdmUgb25lIGNyZWF0ZSAKLQkgKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkgKiBpbnRlcmZhY2UuIFRoZXJlIGNhbiBiZSBubyBvdGhlciBjcmVhdGUgbWV0aG9kcyBpbiB0aGUgaG9tZSBpbnRlcmZhY2UuIAotCSAqIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBzaW5nbGUgZWpiQ3JlYXRlIG1ldGhvZCB0aGF0IHRha2VzIAotCSAqIG5vIGFyZ3VtZW50cy4KLQkgKi4uLgotCSAqCi0JICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JL0lJT1AuIAotCSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiAgICAgZm9yIFJNSS9JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCSAqICAgLSBBIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlIG11c3QgZGVmaW5lIG9uZSBvciBtb3JlIGNyZWF0ZSguLi4pIG1ldGhvZHMuCi0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0JICogICAgIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0JICogICAgIGludGVyZmFjZSB0eXBlLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotCSAqICAgICBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0JICogICAgIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4gCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDcmVhdGVNZXRob2RfYmVhbkRlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkJLy8gdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JCS8vIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JCS8vIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkJLy8gbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQl2YWxpZGF0ZU1hdGNoaW5nQmVhbkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCQotCS8qKgotCSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotCSAqLi4uCi0JICogVGhlIGhvbWUgaW50ZXJmYWNlIG9mIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbiBtdXN0IGhhdmUgb25lIGNyZWF0ZSAKLQkgKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkgKiBpbnRlcmZhY2UuIFRoZXJlIGNhbiBiZSBubyBvdGhlciBjcmVhdGUgbWV0aG9kcyBpbiB0aGUgaG9tZSBpbnRlcmZhY2UuIAotCSAqIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBzaW5nbGUgZWpiQ3JlYXRlIG1ldGhvZCB0aGF0IHRha2VzIAotCSAqIG5vIGFyZ3VtZW50cy4KLQkgKi4uLgotCSAqCi0JICogNi4xMC42IFNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JL0lJT1AuIAotCSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiAgICAgZm9yIFJNSS9JSU9QLCBhbmQgdGhhdCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotCSAqICAgLSBBIHNlc3Npb24gYmVhbidzIGhvbWUgaW50ZXJmYWNlIG11c3QgZGVmaW5lIG9uZSBvciBtb3JlIGNyZWF0ZSguLi4pIG1ldGhvZHMuCi0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0JICogICAgIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0JICogICAgIGludGVyZmFjZSB0eXBlLgotCSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJDcmVhdGUgbWV0aG9kIAotCSAqICAgICBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0JICogICAgIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkgKgotCSAqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqICAgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqIC4uLgotCSAqICAgIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSB0eXBlLgotCSAqIC4uLgotCSAqIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSB0eXBlIChmb3IgYQotCSAqIHNpbmdsZS1vYmplY3QgZmluZGVyKSwgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgKGZvciBhIG11bHRpLW9iamVjdCBmaW5kZXIpLgotCSAqLi4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDcmVhdGVNZXRob2RfcmVtb3RlRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKYXZhQ2xhc3MgcmVtb3RlSW50ZiA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZW1vdGVJbnRmKTsKLQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSByZW1vdGUgaW50ZXJmYWNlIHR5cGUuCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSwgcmVtb3RlSW50ZikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyByZW1vdGVJbnRmLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEVhY2ggY3JlYXRlIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJjcmVhdGUiLCBhbmQgaXQgbXVzdCBtYXRjaCBvbmUgb2YgCi0JICogICAgIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLQkgKiAgICAgZWpiQ3JlYXRlIG1ldGhvZCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqLi4uCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICouLi4KLQkgKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCSAqICAgICAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCSAqLi4uCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBlamJDcmVhdGUgCi0JICogICAgIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIAotCSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0JICogICAgIChpLmUgdGhlIHNldCBvZiBleGNlcHRpb25zIGRlZmluZWQgZm9yIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSBzdXBlcnNldAotCSAqICAgICBvZiB0aGUgdW5pb24gb2YgZXhjZXB0aW9ucyBkZWZpbmVkIGZvciB0aGUgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5DcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgCi0JCS8vIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotCQkvLyAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBkaWZmZXJlbnQuKQotCQlKYXZhQ2xhc3MgYmVhbkNsYXNzID0gYmVhbi5nZXRFamJDbGFzcygpOwotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbkNsYXNzKTsKLQotCQlNZXRob2QgZWpiQ3JlYXRlTWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGJlYW5DbGFzcywgbWV0aG9kLCBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpOwotCQlpZiAoZWpiQ3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBiZWFuQ2xhc3MuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gU2VjdGlvbiA2LjEwLjYgKHNlc3Npb24pLCA5LjIuOCAoZW50aXR5KSwgZGVjbGFyZSB0aGF0IGFsbCBleGNlcHRpb25zIGRlY2xhcmVkCi0JCS8vIG9uIHRoZSBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUgbWV0aG9kcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YKLQkJLy8gdGhlIG1hdGNoaW5nIGNyZWF0ZSBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCS8qCi0JCS8vIERvbid0IGNoZWNrIGZvciB0aGUgZXhjZXB0aW9ucyBoZXJlIC0gbGV0IHRoZSBiZWFuIGNsYXNzIGRvIGl0LiBXaGVuIHRoZSBob21lCi0JCS8vIGNoYW5nZXMsIGEgImRlcGVuZGVudCIgdmFsaWRhdGlvbiBvZiB0aGUgYmVhbidzIGNoZWNrcyBzaG91bGQgYmUgZG9uZSBhdXRvbWF0aWNhbGx5LgotCQkvLyBJZiBpdCBpcyBjaGVja2VkIGluIHRoaXMgbWV0aG9kIGFzIHdlbGwsIHRoZXJlIGFyZSBkdXBsaWNhdGUgbWVzc2FnZXMgb24gdGhlIHRhc2sgbGlzdC4KLQkJSGFzaFNldCBleGNlcHRpb25zID0gZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhtZXRob2QsIGVqYkNyZWF0ZU1ldGhvZCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX01FVEhPRF9USFJPV19OT1RISV9FWENFUCwgbXNnUGFybSwgZWpiQ3JlYXRlTWV0aG9kLCBFSkJfSE9NRV9HUk9VUCk7IC8vIHNpbmNlIHdlJ3JlIGFkZGluZyB0aGUgbWVzc2FnZSB0byB0aGUgYmVhbiBjbGFzcywgd2UgbmVlZCB0byBtYXJrIGl0IGxpa2UgdGhlIGJlYW4gY2xhc3Mgd291bGQ7IGkuZS4sIGEgaG9tZS1kZXBlbmRlbnQgbWVzc2FnZQotCQkJfQotCQl9Ci0JCSovCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHRoaXNIb21lKSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQkKLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkvLyBiZWFuIGhhcyBubyBzdXBlcnR5cGUKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbglzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRIb21lID0gbnVsbDsKLQkJaWYgKHN1cGVydHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayB0aGlzIENNUCdzIHN1cGVydHlwZQotCQkJcGFyZW50SG9tZSA9IHN1cGVydHlwZS5nZXRIb21lSW50ZXJmYWNlKCk7Ci0KLQkJCS8vIEhvbWUgYSBYY2hpbGQgb2YgcGFyZW50IEhvbWUKLQkJCS8vIEluIG91ciBFSkIgY29tcG9uZW50IGluaGVyaXRhbmNlIHN0cnVjdHVyZSwgd2hpbGUgaXQgaXMgbGVnYWwgZm9yCi0JCQkvLyBhIGhvbWUgdG8gaW5oZXJpdCBmcm9tIGFub3RoZXIgaG9tZSwgKHNlY3Rpb24gQi4yKSwgaXQgaXMgbm90IGxlZ2FsCi0JCQkvLyBmb3IgV1NBIGNvbXBvbmVudCBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUuIAotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodGhpc0hvbWUpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRIb21lKTsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc0hvbWUsIHBhcmVudEhvbWUpKSB7Ci0JCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyB0aGlzSG9tZS5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudEhvbWUuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzSG9tZSwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGJlYW4uZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVLZXlDbGFzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUtleUNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYjk3NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUtleUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBrZXkgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHBhcmFncmFwaCBpcyB0YWtlbiBmcm9tCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIDkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBIDk0MzAzLCBVLlMuQS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogOS4yLjkgRW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcwotICogIC0gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY2xhc3MgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqICAtIFRoZSBwcmltYXJ5IGtleSB0eXBlIG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLgotICogIC0gVGhlIGNsYXNzIG11c3QgcHJvdmlkZSBzdWl0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGFzaENvZGUoKSBhbmQgCi0gKiAgICBlcXVhbHMoT2JqZWN0IG90aGVyKSBtZXRob2RzIHRvIHNpbXBsaWZ5IHRoZSBtYW5hZ2VtZW50IG9mIHRoZSBwcmltYXJ5IGtleXMgCi0gKiAgICBieSBjbGllbnQgY29kZS4KLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVZhbGlkYXRlS2V5Q2xhc3MgZXh0ZW5kcyBBVmFsaWRhdGVFSkIgewotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICgoRW50aXR5KSBwYXJlbnQpLmdldFByaW1hcnlLZXkoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEga2V5IGNsYXNzJyBtZXRob2QgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzIAotCQkvLyBvZiB0aGUgYmVhbi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKLQkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGtleSBjbGFzcycgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCi0JCS8vIG9mIHRoZSBiZWFuLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBjYW4sIGFuZCBzaG91bGQsIGJlIHZhbGlkYXRlZC4KLQkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBtZXRob2RzIChpLmUuLCBudWxsKSwgYW5kIG1ldGhvZHMgd2hpY2gKLQkgKiBiZWxvbmcgdG8gdGhlIGJhc2UgdHlwZSwgd2hhdGV2ZXIgdGhhdCBpcy4gKGUuZy4gamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChzdXBlci5pc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KSkgewotCQkJLy8gZXhjbHVkZSByb290IG9iamVjdCBtZXRob2RzCi0JCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0phdmFMYW5nT2JqZWN0TWV0aG9kKGJlYW4sIG1ldGhvZCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIDkuMi45IEVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MKLQkgKiAgLSBUaGUgQmVhbiBQcm92aWRlciBtdXN0IHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjbGFzcyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAoY2hlY2tlZCBieSB0aGUgTU9GIG1vZGVsKQotCSAqICAtIFRoZSBwcmltYXJ5IGtleSB0eXBlIG11c3QgYmUgYSBsZWdhbCBWYWx1ZSBUeXBlIGluIFJNSS1JSU9QLiAoZm9yIGtleSBmaWVsZHMsIGNoZWNrZWQgaW4gdGhlIFZhbGlkYXRlRW50aXR5QmVhbiBjbGFzcykKLQkgKiAgLSBUaGUgY2xhc3MgbXVzdCBwcm92aWRlIHN1aXRhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoYXNoQ29kZSgpIGFuZCAKLQkgKiAgICBlcXVhbHMoT2JqZWN0IG90aGVyKSBtZXRob2RzIHRvIHNpbXBsaWZ5IHRoZSBtYW5hZ2VtZW50IG9mIHRoZSBwcmltYXJ5IGtleXMgCi0JICogICAgYnkgY2xpZW50IGNvZGUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJdmFsaWRhdGVMZWdhbFJNSVR5cGUodmMsIGJlYW4sIGNsYXp6KTsKLQotCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVW5uYW1lZFBhY2thZ2UoY2xhenouZ2V0SmF2YVBhY2thZ2UoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwNDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBjbGFzcyBpcyBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AuCi0JICoKLQkgKiBKYXZhIFJlbW90ZSBNZXRob2RJbnZvY2F0aW9uCi0JICogU3BlY2lmaWNhdGlvbgotCSAqCi0JICogUmV2aXNpb24gMS43LCBKYXZhIDIgU0RLLCBTdGFuZGFyZCBFZGl0aW9uLCB2MS4zLjAsIERlY2VtYmVyIDE5OTkKLQkgKgotCSAqIDIuNiBQYXJhbWV0ZXIgUGFzc2luZyBpbiBSZW1vdGUgTWV0aG9kIEludm9jYXRpb24KLQkgKiAgIEFuIGFyZ3VtZW50IHRvLCBvciBhIHJldHVybiB2YWx1ZSBmcm9tLCBhIHJlbW90ZSBvYmplY3QgY2FuIGJlIGFueSBvYmplY3QgdGhhdAotCSAqICAgaXMgc2VyaWFsaXphYmxlLiBUaGlzIGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcywgcmVtb3RlIG9iamVjdHMsIGFuZCBub24tcmVtb3RlCi0JICogICBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBqYXZhLmlvLlNlcmlhbGl6YWJsZSBpbnRlcmZhY2UuIEZvciBtb3JlCi0JICogICBkZXRhaWxzIG9uIGhvdyB0byBtYWtlIGNsYXNzZXMgc2VyaWFsaXphYmxlLCBzZWUgdGhlIEphdmEgT2JqZWN0IFNlcmlhbGl6YXRpb24KLQkgKiAgIFNwZWNpZmljYXRpb24uIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTGVnYWxSTUlUeXBlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoY2xhenopOwotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzTGVnYWxSTUlfSUlPUFR5cGUoYmVhbiwgY2xhenopKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA5LjIuOSBFbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzCi0JICogIC0gVGhlIGNsYXNzIG11c3QgcHJvdmlkZSBzdWl0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGFzaENvZGUoKSBhbmQgCi0JICogICAgZXF1YWxzKE9iamVjdCBvdGhlcikgbWV0aG9kcyB0byBzaW1wbGlmeSB0aGUgbWFuYWdlbWVudCBvZiB0aGUgcHJpbWFyeSBrZXlzIAotCSAqICAgIGJ5IGNsaWVudCBjb2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIGNsYXNzIG11c3QgcHJvdmlkZSBzdWl0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGFzaENvZGUoKSBhbmQgCi0JCS8vIGVxdWFscyhPYmplY3Qgb3RoZXIpIG1ldGhvZHMgdG8gc2ltcGxpZnkgdGhlIG1hbmFnZW1lbnQgb2YgdGhlIHByaW1hcnkga2V5cyAKLQkJLy8gYnkgY2xpZW50IGNvZGUuCi0JCU1ldGhvZCBoYXNoQ29kZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfSEFTSENPREUsIG5ldyBKYXZhSGVscGVyc1swXSk7Ci0JCWlmICgoaGFzaENvZGVNZXRob2QgPT0gbnVsbCkgfHwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzSmF2YUxhbmdPYmplY3RNZXRob2QoYmVhbiwgaGFzaENvZGVNZXRob2QpKSB7Ci0JCQkvLyBFSkIgMS4wIGRpZCBub3QgcmVxdWlyZSB0aGlzIG1ldGhvZCwgc28gdGhpcyBpcyBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBlcnJvci4KLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKSwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRFNJR05BVFVSRV9IQVNIQ09ERX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJTWV0aG9kIGVxdWFsc01ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRVFVQUxTLCBuZXcgSmF2YUhlbHBlcnNbXXtWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgYmVhbil9KTsKLQkJaWYgKChlcXVhbHNNZXRob2QgPT0gbnVsbCkgfHwgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0phdmFMYW5nT2JqZWN0TWV0aG9kKGJlYW4sIGVxdWFsc01ldGhvZCkpKSB7Ci0JCQkvLyBFSkIgMS4wIGRpZCBub3QgcmVxdWlyZSB0aGlzIG1ldGhvZCwgc28gdGhpcyBpcyBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBlcnJvci4KLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKSwgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRFNJR05BVFVSRV9FUVVBTFMgfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVSZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVSZW1vdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5MGM3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlUmVtb3RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyByZW1vdGUgaW50ZXJmYWNlIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKiBUaGUgY2hlY2tzIGZvciBhIHNlc3Npb24gcmVtb3RlIGludGVyZmFjZSBhbmQgYW4gZW50aXR5IHJlbW90ZSBpbnRlcmZhY2UgYXJlIHRoZSBzYW1lCi0gKiBpbiBFSkIgMS4xLgotICoKLSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiA2LjEwLjUgU2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZQotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBpbnRlcmZhY2U6Ci0gKgkJLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4KLSAqCQktIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUkvSUlPUC4KLSAqICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLSAqICAgICAgICBmb3IgUk1JL0lJT1AsIGFuZCB0aGVpciB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotICoJCS0gVGhlIHJlbW90ZSBpbnRlcmZhY2UgaXMgYWxsb3dlZCB0byBoYXZlIHN1cGVyaW50ZXJmYWNlcy4gVXNlIG9mIGludGVyZmFjZQotICogICAgICAgIGluaGVyaXRhbmNlIGlzIHN1YmplY3QgdG8gdGhlIFJNSS9JSU9QIHJ1bGVzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiByZW1vdGUgaW50ZXJmYWNlcy4KLSAqCQktIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcKLSAqICAgICAgICBtZXRob2QgaW4gdGhlIHNlc3Npb24gYmVhbidzIGNsYXNzLiAKLSAqCQkJLSBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgaGF2ZToKLSAqCQkJCS0gVGhlIHNhbWUgbmFtZS4KLSAqCQkJCS0gVGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMsIGFuZCB0aGUgc2FtZSByZXR1cm4gdHlwZS4KLSAqCQkJCS0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIAotICogICAgICAgICAgICAgICAgbWV0aG9kIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgCi0gKiAgICAgICAgICAgICAgICBjbGF1c2Ugb2YgdGhlIG1ldGhvZCBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLSAqCi0gKiA5LjIuNyBFbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UKLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2U6Ci0gKiAJCS0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuCi0gKiAJCS0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS1JSU9QLiAKLSAqIAkJICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIHZhbGlkIHR5cGVzIGZvciBSTUktSUlPUCwgCi0gKiAJCSAgYW5kIHRoZWlyIHRocm93cyBjbGF1c2VzIG11c3QgaW5jbHVkZSB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uLgotICogCQktIFRoZSByZW1vdGUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgCi0gKgkJICBpcyBzdWJqZWN0IHRvIHRoZSBSTUktSUlPUCBydWxlcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgcmVtb3RlIGludGVyZmFjZXMuIAotICogCQktIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcgbWV0aG9kIAotICoJCSAgaW4gdGhlIGVudGl0eSBiZWFuJ3MgY2xhc3MuIFRoZSBtYXRjaGluZyBtZXRob2QgbXVzdCBoYXZlOgotICogCQkJLSBUaGUgc2FtZSBuYW1lLgotICoJCQktIFRoZSBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgaXRzIGFyZ3VtZW50cywgYW5kIHRoZSBzYW1lIHJldHVybiB0eXBlLgotICoJCQktIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgCi0gKgkJCSAgb2YgdGhlIGVudGVycHJpc2UgQmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgCi0gKgkJCSAgdGhlIG1ldGhvZCBvZiB0aGUgcmVtb3RlIGludGVyZmFjZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFWYWxpZGF0ZVJlbW90ZSBleHRlbmRzIEFWYWxpZGF0ZUVKQiB7Ci0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRNZXRob2RzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopICB7Ci0JCS8vIEEgaG9tZSBvciBjb21wb25lbnQgY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgotCQkvLyAgICAxLiBiZWFuIGNsYXNzCi0JCUxpc3RbXSByZXN1bHQgPSBuZXcgTGlzdFsxXTsKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYoYmVhbkNsYXNzID09IG51bGwpIHsKLQkJCXJlc3VsdFswXSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHRbMF0gPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgaG9tZSBvciBjb21wb25lbnQncyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKLQkJLy8gb2YgdGhlIGJlYW4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGNhbiwgYW5kIHNob3VsZCwgYmUgdmFsaWRhdGVkLgotCSAqIEZpbHRlciBvdXQgZmF1bHR5IG1ldGhvZHMgKGkuZS4sIG51bGwpLCBhbmQgbWV0aG9kcyB3aGljaAotCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKHN1cGVyLmlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpKSB7Ci0JCQkvLyBFeGNsdWRlIHJvb3QgcmVtb3RlIGludGVyZmFjZSBtZXRob2RzIAotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0VKQk9iamVjdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0NsaW5pdE1ldGhvZChiZWFuLCBtZXRob2QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGUgcmVtb3RlIGludGVyZmFjZSdzIG1ldGhvZHMgYWdhaW5zdCB0aGUgRUpCIDEuMSBzcGVjLgotCSAqIAotCSAqIDYuMTAuNSBTZXNzaW9uIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlCi0JICogLi4uCi0JICoJCS0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLgotCSAqICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiAgICAgICAgZm9yIFJNSS9JSU9QLCBhbmQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKiAuLi4KLQkgKgkJLSBGb3IgZWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSwgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nCi0JICogICAgICAgIG1ldGhvZCBpbiB0aGUgc2Vzc2lvbiBiZWFuJ3MgY2xhc3MuIAotCSAqCQkJLSBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgaGF2ZToKLQkgKgkJCQktIFRoZSBzYW1lIG5hbWUuCi0JICoJCQkJLSBUaGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cywgYW5kIHRoZSBzYW1lIHJldHVybiB0eXBlLgotCSAqCQkJCS0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIAotCSAqICAgICAgICAgICAgICAgIG1ldGhvZCBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIAotCSAqICAgICAgICAgICAgICAgIGNsYXVzZSBvZiB0aGUgbWV0aG9kIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCSAqIC4uLgotCSAqIDkuMi43IEVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZQotCSAqIC4uLgotCSAqIAkJLSBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JLUlJT1AuIAotCSAqIAkJICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIHZhbGlkIHR5cGVzIGZvciBSTUktSUlPUCwgCi0JICogCQkgIGFuZCB0aGVpciB0aHJvd3MgY2xhdXNlcyBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKiAuLi4KLQkgKiAJCS0gRm9yIGVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyBtZXRob2QgCi0JICoJCSAgaW4gdGhlIGVudGl0eSBiZWFuJ3MgY2xhc3MuIFRoZSBtYXRjaGluZyBtZXRob2QgbXVzdCBoYXZlOgotCSAqIAkJCS0gVGhlIHNhbWUgbmFtZS4KLQkgKgkJCS0gVGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLCBhbmQgdGhlIHNhbWUgcmV0dXJuIHR5cGUuCi0JICoJCQktIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgCi0JICoJCQkgIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIAotCSAqCQkJICB0aGUgbWV0aG9kIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCSAqIC4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIHJpTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvLyBzdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShyaU1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JL0lJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2QodmMsIGJlYW4sIGNsYXp6LCByaU1ldGhvZCk7Ci0KLQkJLy8gRm9yIGVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZwotCQkvLyBtZXRob2QgaW4gdGhlIHNlc3Npb24gYmVhbidzIGNsYXNzLiAKLQkJdmFsaWRhdGVNZXRob2RfYmVhbkRlcCh2YywgYmVhbiwgY2xhenosIHJpTWV0aG9kKTsKLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCS8vVGhlcmUgYXJlIG5vIHJlcXVpcmVkIG1ldGhvZHMuCi0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoYXQgdGhlIHJlbW90ZSBpbnRlcmZhY2UgY2xhc3MgZGVmaW5pdGlvbiBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWMuCi0JICoKLQkgKiBUaGUgZm9sbG93aW5nIHBhcmFncmFwaCBpcyB0YWtlbiBmcm9tCi0JICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotCSAqIFZlcnNpb246IDEuMQotCSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotCSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0JICogQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotCSAqIDkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBIDk0MzAzLCBVLlMuQS4KLQkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCSAqCi0JICogNi4xMC41IFNlc3Npb24gYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZToKLQkgKgkJLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4KLQkgKiAuLi4KLQkgKgkJLSBUaGUgcmVtb3RlIGludGVyZmFjZSBpcyBhbGxvd2VkIHRvIGhhdmUgc3VwZXJpbnRlcmZhY2VzLiBVc2Ugb2YgaW50ZXJmYWNlCi0JICogICAgICAgIGluaGVyaXRhbmNlIGlzIHN1YmplY3QgdG8gdGhlIFJNSS9JSU9QIHJ1bGVzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiByZW1vdGUgaW50ZXJmYWNlcy4KLQkgKiAuLi4KLQkgKiA5LjIuNyBFbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlOgotCSAqIAkJLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4KLQkgKiAuLi4KLQkgKiAJCS0gVGhlIHJlbW90ZSBpbnRlcmZhY2UgaXMgYWxsb3dlZCB0byBoYXZlIHN1cGVyaW50ZXJmYWNlcy4gVXNlIG9mIGludGVyZmFjZSBpbmhlcml0YW5jZSAKLQkgKgkJICBpcyBzdWJqZWN0IHRvIHRoZSBSTUktSUlPUCBydWxlcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgcmVtb3RlIGludGVyZmFjZXMuCi0JICogLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gSXQgbXVzdCBiZSBhbiBpbnRlcmZhY2UsIG5vdCBhIGNsYXNzLgotCQlpZiAoIWNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAxMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuCi0JCUphdmFIZWxwZXJzIGphdmF4RWpiT2JqZWN0ID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJPQkpFQ1QsIGJlYW4pOwotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBqYXZheEVqYk9iamVjdCkpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNUIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDE3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVW5uYW1lZFBhY2thZ2UoY2xhenouZ2V0SmF2YVBhY2thZ2UoKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwNDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKLQl9Ci0JCi0JLyoqCi0JICogNi4xMC41Ci0JICogRm9yIGVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyAKLQkgKiBtZXRob2QgaW4gdGhlIHNlc3Npb24gYmVhbidzIGNsYXNzLiBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgaGF2ZToKLQkgKiAgIC0gVGhlIHNhbWUgbmFtZS4KLQkgKiAgIC0gVGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMsIGFuZCB0aGUgc2FtZSByZXR1cm4gdHlwZS4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIG1ldGhvZCAKLQkgKiAgICAgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIAotCSAqICAgICBtZXRob2Qgb2YgdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0JICoKLQkgKiA5LjIuNwotCSAqIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcgCi0JICogbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGNsYXNzLiBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgaGF2ZToKLQkgKiAgIC0gVGhlIHNhbWUgbmFtZS4KLQkgKiAgIC0gVGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLCBhbmQgdGhlIHNhbWUgcmV0dXJuIHR5cGUuCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgCi0JICogICAgIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIAotCSAqICAgICB0aGUgbWV0aG9kIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hdGNoaW5nQmVhbk1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIHJlbW90ZU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChyZW1vdGVNZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW5DbGFzcyk7Ci0KLQkJTWV0aG9kIGJlYW5NZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoYmVhbkNsYXNzLCByZW1vdGVNZXRob2QsIHJlbW90ZU1ldGhvZC5nZXROYW1lKCkpOwotCQlpZiAoYmVhbk1ldGhvZCA9PSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBtc2dQYXJtID0geyBiZWFuQ2xhc3MuZ2V0TmFtZSgpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIwMjMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIHJlbW90ZU1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKHJlbW90ZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKTsKLQotCQl0cnkgewotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGJlYW5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBMZXQgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGJlYW4gY2xhc3MgcmVwb3J0IHRoZSByZWZsZWN0aW9uIHdhcm5pbmcuCi0JCQkvLyBEb24ndCBkbyBhbnkgdmFsaWRhdGlvbiBiYXNlZCBvbiB0aGF0IG1ldGhvZC4KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENoZWNrIGlmIHJldHVybiB0eXBlcyBtYXRjaAotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJlbW90ZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGJlYW5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDE1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCByZW1vdGVNZXRob2QsIG5ldyBTdHJpbmdbXSB7IGJlYW5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCksIGJlYW5DbGFzcy5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCi0JCS8vIFNlY3Rpb24gNi4xMC41IChzZXNzaW9uKSwgOS4yLjcgKGVudGl0eSksIGRlY2xhcmUgdGhhdCBhbGwgZXhjZXB0aW9ucyBkZWNsYXJlZAotCQkvLyBvbiB0aGUgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mCi0JCS8vIHRoZSBtYXRjaGluZyBjcmVhdGUgb2YgdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0JCS8qCi0JCS8vIERvbid0IGNoZWNrIGZvciB0aGUgZXhjZXB0aW9ucyBoZXJlIC0gbGV0IHRoZSBiZWFuIGNsYXNzIGRvIGl0LiBXaGVuIHRoZSByZW1vdGUKLQkJLy8gY2hhbmdlcywgYSAiZGVwZW5kZW50IiB2YWxpZGF0aW9uIG9mIHRoZSBiZWFuJ3MgY2hlY2tzIHNob3VsZCBiZSBkb25lIGF1dG9tYXRpY2FsbHkuCi0JCS8vIElmIGl0IGlzIGNoZWNrZWQgaW4gdGhpcyBtZXRob2QgYXMgd2VsbCwgdGhlcmUgYXJlIGR1cGxpY2F0ZSBtZXNzYWdlcyBvbiB0aGUgdGFzayBsaXN0LgotCQlIYXNoU2V0IGV4Y2VwdGlvbnMgPSBnZXROb3RTdWJzZXRFeGNlcHRpb25zKHJlbW90ZU1ldGhvZCwgYmVhbk1ldGhvZCk7Ci0JCWlmKGV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX01FVEhPRF9USFJPV19OT1RSSV9FWENFUCwgbXNnUGFybSwgYmVhbk1ldGhvZCwgRUpCX0JFQU5fR1JPVVApOwotCQkJfQotCQl9CQotCQkqLwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGUgcmVtb3RlIGludGVyZmFjZSdzIG1ldGhvZHMgYWdhaW5zdCB0aGUgRUpCIDEuMSBzcGVjLgotCSAqIAotCSAqIDYuMTAuNSBTZXNzaW9uIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlCi0JICogLi4uCi0JICoJCS0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLgotCSAqICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLQkgKiAgICAgICAgZm9yIFJNSS9JSU9QLCBhbmQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKiAuLi4KLQkgKgkJLSBGb3IgZWFjaCBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSwgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nCi0JICogICAgICAgIG1ldGhvZCBpbiB0aGUgc2Vzc2lvbiBiZWFuJ3MgY2xhc3MuIAotCSAqCQkJLSBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgaGF2ZToKLQkgKgkJCQktIFRoZSBzYW1lIG5hbWUuCi0JICoJCQkJLSBUaGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cywgYW5kIHRoZSBzYW1lIHJldHVybiB0eXBlLgotCSAqCQkJCS0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIAotCSAqICAgICAgICAgICAgICAgIG1ldGhvZCBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIAotCSAqICAgICAgICAgICAgICAgIGNsYXVzZSBvZiB0aGUgbWV0aG9kIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCSAqIC4uLgotCSAqIDkuMi43IEVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZQotCSAqIC4uLgotCSAqIAkJLSBUaGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIG11c3QgZm9sbG93IHRoZSBydWxlcyBmb3IgUk1JLUlJT1AuIAotCSAqIAkJICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIHZhbGlkIHR5cGVzIGZvciBSTUktSUlPUCwgCi0JICogCQkgIGFuZCB0aGVpciB0aHJvd3MgY2xhdXNlcyBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkgKiAuLi4KLQkgKiAJCS0gRm9yIGVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyBtZXRob2QgCi0JICoJCSAgaW4gdGhlIGVudGl0eSBiZWFuJ3MgY2xhc3MuIFRoZSBtYXRjaGluZyBtZXRob2QgbXVzdCBoYXZlOgotCSAqIAkJCS0gVGhlIHNhbWUgbmFtZS4KLQkgKgkJCS0gVGhlIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBpdHMgYXJndW1lbnRzLCBhbmQgdGhlIHNhbWUgcmV0dXJuIHR5cGUuCi0JICoJCQktIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBtZXRob2QgCi0JICoJCQkgIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIAotCSAqCQkJICB0aGUgbWV0aG9kIG9mIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCSAqIC4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWV0aG9kX2JlYW5EZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCByaU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIEZvciBlYWNoIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLCB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcKLQkJLy8gbWV0aG9kIGluIHRoZSBzZXNzaW9uIGJlYW4ncyBjbGFzcy4gCi0JCXZhbGlkYXRlTWF0Y2hpbmdCZWFuTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgcmlNZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5hbCBjaGVjayB0byBzZWUgaWYgcmVxdWlyZWQgbWV0aG9kcyB3ZXJlIGRldGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy9UaGVyZSBhcmUgbm8gcmVxdWlyZWQgbWV0aG9kcy4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFwcGVuZGl4QihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyB0aGlzUmVtb3RlKSB7Ci0JCS8vIFRoZSBKYXZhIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSBFSkIgaW5oZXJpdGFuY2Ugc3RydWN0dXJlLgotCQkvLyBlLmcuIGlmIEVKQiBCIGlzIGEgY2hpbGQgb2YgRUpCIEEsIHRoZW4gY2xhc3MgQiBtdXN0IGJlIGEgY2hpbGQgb2YgY2xhc3MgQS4KLQkJLy8gQiBjb3VsZCBiZSBhIGdyYW5kY2hpbGQgKG9yIGdyZWF0LWdyYW5kY2hpbGQgb3IgLi4uKSBvZiBBLgotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRSZW1vdGUgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCXBhcmVudFJlbW90ZSA9IHN1cGVydHlwZS5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQotCQkJLy8gUmVtb3RlIGEgWGNoaWxkIG9mIHBhcmVudCBSZW1vdGUKLQkJCXRyeSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHRoaXNSZW1vdGUpOwotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShwYXJlbnRSZW1vdGUpOwotCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odGhpc1JlbW90ZSwgcGFyZW50UmVtb3RlKSkgewotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0gbmV3IFN0cmluZ1tdIHsgdGhpc1JlbW90ZS5nZXRRdWFsaWZpZWROYW1lKCksIHBhcmVudFJlbW90ZS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMTA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXNSZW1vdGUsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBiZWFuLmdldE5hbWUoKX07Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRpb25SdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRpb25SdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTA1ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0aW9uUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0KLS8qKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGlvblJ1bGUgaW1wbGVtZW50cyBJVmFsaWRhdGlvblJ1bGUgewotCi0gICAgcHJpdmF0ZSBTZXQgX2RlcGVuZGVudHMgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXIgPSBudWxsOwotCi0gICAgLyoKLSAgICAgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNhZGREZXBlbmRlbnQoSVZhbGlkYXRpb25SdWxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZERlcGVuZGVudChJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotICAgICAgICBpZiAocnVsZSA9PSBudWxsKSB7IHJldHVybjsgfQotCi0gICAgICAgIGlmIChfZGVwZW5kZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfZGVwZW5kZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBfZGVwZW5kZW50cy5hZGQocnVsZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNnZXREZXBlbmRlbnRzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0IGdldERlcGVuZGVudHMoKSB7Ci0gICAgICAgIHJldHVybiBfZGVwZW5kZW50czsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGdldEVqYkV4dGVuc2lvbkhlbHBlcihPYmplY3QgY29udGV4dCkgewotICAgICAgICByZXR1cm4gSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLklOU1RBTkNFLmdldEVKQk1vZHVsZUV4dGVuc2lvbihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gRW50ZXJwcmlzZUJlYW4KLSAgICAgKiBAcmV0dXJuIEVudGVycHJpc2VCZWFuIHJldHVybiB0aGUgc3VwZXIgdHlwZSBvZiBhbiBFbnRlcnByaXNlQmVhbiBieQotICAgICAqICAgICAgICAgbG9hZGluZyB0aGUgZXh0bmVuc2lvbiBwbHVnaW4gaWYgZXh0ZW5zaW9uIHBsdWdpbiBmYWlscyB0byBsb2FkCi0gICAgICogICAgICAgICByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBFbnRlcnByaXNlQmVhbiBnZXRTdXBlclR5cGUoRW50ZXJwcmlzZUJlYW4gZW50ZXJwcmlzZUJlYW4pIHsKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gc3VwZXJUeXBlID0gbnVsbDsKLSAgICAgICAgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGFNb2RIZWxwZXIgPSBnZXRFamJFeHRlbnNpb25IZWxwZXIoZW50ZXJwcmlzZUJlYW4pOwotICAgICAgICBpZiAoYU1vZEhlbHBlciAhPSBudWxsKSBzdXBlclR5cGUgPSBhTW9kSGVscGVyLmdldFN1cGVyVHlwZShlbnRlcnByaXNlQmVhbik7Ci0gICAgICAgIHJldHVybiBzdXBlclR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIEVudGVycHJpc2VCZWFuCi0gICAgICogQHJldHVybiBTdHJpbmcgLSBzdXBlciB0eXBlIGZpbGUgbmFtZSByZXR1cm4gdGhlIHN1cGVyIHR5cGUgZmlsZSBvZiBhbgotICAgICAqICAgICAgICAgRW50ZXJwcmlzZUJlYW4gYnkgbG9hZGluZyB0aGUgZXh0bmVuc2lvbiBwbHVnaW4gaWYgZXh0ZW5zaW9uCi0gICAgICogICAgICAgICBwbHVnaW4gZmFpbHMgdG8gbG9hZCByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RUpCSW5oZXJpdGFuY2VGaWxlTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHN1cGVyVHlwZUZpbGVOYW1lID0gbnVsbDsKLSAgICAgICAgLy8gVE9ETyBNREUgUmV2aXNpdCB0aGlzIGFmdGVyIHRoZSBkcm9wCi0gICAgICAgIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBhTW9kSGVscGVyID0gZ2V0RWpiRXh0ZW5zaW9uSGVscGVyKG51bGwpOwotICAgICAgICBpZiAoYU1vZEhlbHBlciAhPSBudWxsKSBzdXBlclR5cGVGaWxlTmFtZSA9IGFNb2RIZWxwZXIuZ2V0RUpCSW5oZXJpdGFuY2VGaWxlTmFtZSgpOwotICAgICAgICByZXR1cm4gc3VwZXJUeXBlRmlsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIEVudGVycHJpc2VCZWFuCi0gICAgICogQHJldHVybiBMaXN0IC0gZXh0ZW5kZWQgcm9sZSBuYW1lcyByZXR1cm4gdGhlIGV4dGVuZGVkIHJvbGUgbWV0aG9kIG5hbWUKLSAgICAgKiAgICAgICAgIG9mIGFuIEVudGVycHJpc2VCZWFuIGJ5IGxvYWRpbmcgdGhlIGV4dG5lbnNpb24gcGx1Z2luIGlmCi0gICAgICogICAgICAgICBleHRlbnNpb24gcGx1Z2luIGZhaWxzIHRvIGxvYWQgcmV0dXJuIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgTGlzdCBnZXRSb2xlTWV0aG9kTmFtZXNFeHRlbmRlZChFbnRlcnByaXNlQmVhbiBlbnRlcnByaXNlQmVhbikgewotICAgICAgICBMaXN0IHJvbGVOYW1lRXh0ZW5kZWQgPSBudWxsOwotICAgICAgICBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgYU1vZEhlbHBlciA9IGdldEVqYkV4dGVuc2lvbkhlbHBlcihlbnRlcnByaXNlQmVhbik7Ci0gICAgICAgIGlmIChhTW9kSGVscGVyICE9IG51bGwgJiYgZW50ZXJwcmlzZUJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpCi0gICAgICAgICAgICAgICAgcm9sZU5hbWVFeHRlbmRlZCA9IGFNb2RIZWxwZXIuZ2V0Um9sZU1ldGhvZE5hbWVzRXh0ZW5kZWQoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGVudGVycHJpc2VCZWFuKTsKLSAgICAgICAgcmV0dXJuIHJvbGVOYW1lRXh0ZW5kZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkKLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgYWxsb2NhdGUgbm90aGluZy4KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Bvc3RWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBvc3RWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGFzc3VtZSB0aGF0IG5vdGhpbmcgd2FzIGFsbG9jYXRlZCBpbiBwcmVWYWxpZGF0ZS4KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgYXNzdW1lIHRoYXQgbm90aGluZyBuZWVkcyB0byBiZSByZXNldAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Fic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwNGQwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgRUpCIFZhbGlkYXRpb24gcnVsZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSgpIHsKLQkJLy9EZWZhdWx0Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEhhc2hNYXAgX3J1bGVMaXN0ID0gbnVsbDsKLQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLSAgICAJaWYocnVsZSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgCS8vIFNpbmNlIHdlIGRvbid0IHB1dCBhIGxvY2sgb24gdGhlIHJ1bGUgd2hlbiBpdCdzIGNoZWNrZWQgb3V0IHZpYSBnZXRSdWxlKE9iamVjdCksCi0gICAgCS8vIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBvdGhlciB0aGFuIHJlc2V0IHRoZSBydWxlIHRvIHByZXBhcmUgaXQgZm9yIHJldXNlLgotICAgIAlydWxlLnJlc2V0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEl0ZXJhdG9yIGFkZERlcGVuZGVudFJ1bGVUb1J1bGVMaXN0KCkgewotICAgIAlJdGVyYXRvciBpdGVyYXRvciA9IF9ydWxlTGlzdC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCUlWYWxpZGF0aW9uUnVsZSBydWxlID0gKElWYWxpZGF0aW9uUnVsZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgCQlPYmplY3RbXSBpZHMgPSBydWxlLmdldERlcGVuZHNPbigpOwotICAgIAkJaWYoaWRzID09IG51bGwpIHsKLSAgICAJCQljb250aW51ZTsKLSAgICAJCX0KLSAgICAJCQotICAgIAkJZm9yKGludCBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCQkJSVZhbGlkYXRpb25SdWxlIGRSdWxlID0gKElWYWxpZGF0aW9uUnVsZSlfcnVsZUxpc3QuZ2V0KGlkc1tpXSk7Ci0gICAgCQkJaWYoZFJ1bGUgIT0gbnVsbCkgewotICAgIAkJCQlkUnVsZS5hZGREZXBlbmRlbnQocnVsZSk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBpdGVyYXRvcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dBbGxEZXBlbmRlbnRSdWxlcygpIHsKLSAgICAJSXRlcmF0b3IgaXRlcmF0b3I7Ci0gICAgCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLSAgICAJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0gICAgCQlpdGVyYXRvciA9IF9ydWxlTGlzdC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAkJSXRlcmF0b3IgZGVwSXRlcmF0b3IgPSBudWxsOwotICAgIAkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCQkJSVZhbGlkYXRpb25SdWxlIHJ1bGUgPSAoSVZhbGlkYXRpb25SdWxlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQlTZXQgZGVwZW5kZW50cyA9IHJ1bGUuZ2V0RGVwZW5kZW50cygpOwotICAgIAkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgCQkJYnVmZmVyLmFwcGVuZCgibGlzdCBvZiBkZXBlbmRlbnRzIGZvciBydWxlOiIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJYnVmZmVyLmFwcGVuZChydWxlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJaWYoZGVwZW5kZW50cyAhPSBudWxsKSB7Ci0gICAgCQkJCWRlcEl0ZXJhdG9yID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOwotICAgIAkJCQl3aGlsZShkZXBJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCQkJCUlWYWxpZGF0aW9uUnVsZSBkUnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpZGVwSXRlcmF0b3IubmV4dCgpOwotICAgIAkJCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQkJYnVmZmVyLmFwcGVuZChkUnVsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpOwotCi0gICAgcHJvdGVjdGVkIEVKQkphciBnZXRFSkJKYXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB7Ci0gICAgCXJldHVybiAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgaWRlbnRpZmllZCBJVmFsaWRhdGlvblJ1bGUuCi0gICAgICogSWYgdGhlIHJ1bGVpZCBpcyBub3QgcmVnaXN0ZXJlZCwgb3IgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAgICogaW5zdGFudGlhdGluZyB0aGUgSVZhbGlkYXRpb25SdWxlLCB0aGVuIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVZhbGlkYXRpb25SdWxlIGdldFJ1bGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgcnVsZUlkKSB7Ci0gICAgCS8vIFRvIGF2b2lkIGxvYWRpbmcgYSBydWxlIHVudGlsIGl0IGlzIG5lZWRlZCwgaW50aWFsaXplCi0gICAgCS8vIHRoZSBsaXN0IHdpdGggYSBydWxlIGlkIGFzIHRoZSBrZXksIGFuZCBhIFN0cmluZyBjbGFzcyBuYW1lCi0gICAgCS8vIGFzIGEgdmFsdWUuIFdoZW4gYSBydWxlIGlzIGxvYWRlZCwgaWYgdGhlIHZhbHVlIGlzIGEgU3RyaW5nLAotICAgIAkvLyB0aGVuIHRoZSBJVmFsaWRhdGlvblJ1bGUgaGFzIG5vdCBiZWVuIGluc3RhbnRpYXRlZC4gQ3JlYXRlIGFuCi0gICAgCS8vIGluc3RhbmNlIGFuZCBzdG9yZSB0aGF0IGluIHBsYWNlIG9mIHRoZSBTdHJpbmcuIElmIHRoZSB2YWx1ZQotICAgIAkvLyBpcyBhbHJlYWR5IGFuIElWYWxpZGF0aW9uUnVsZSBpbnN0YW5jZSwgcmV0dXJuIGl0LgotICAgIAkKLSAgICAJT2JqZWN0IHJ1bGUgPSBfcnVsZUxpc3QuZ2V0KHJ1bGVJZCk7Ci0gICAgCWlmKHJ1bGUgPT0gbnVsbCkgewotICAgIAkJLy8gTm8gc3VjaCBydWxlSWQgcmVnaXN0ZXJlZC4KLSAgICAJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLSAgICAJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLSAgICAJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGUgZnJvbSBydWxlSWQ6ICIgKyBydWxlSWQpOyAvLyROT04tTkxTLTEkCi0gICAgCQl9Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIAkKLSAgICAJcmV0dXJuIChJVmFsaWRhdGlvblJ1bGUpcnVsZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BYnN0cmFjdEVKQlZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjlkNzBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BYnN0cmFjdEVKQlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI0LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUpCVmFsaWRhdG9yIGV4dGVuZHMgSjJFRVZhbGlkYXRvciB7Ci0JcHJvdGVjdGVkIE1hcCBfdmFsaWRhdGVkID0gbnVsbDsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFic3RyYWN0RUpCVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCQlfdmFsaWRhdGVkID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ1J1bGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgcnVsZUlkKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBydWxlSWQgKyAiID0gbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbnRlcm5hbEVycm9yTWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMpIHsKLQkJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKHZjLCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBUaHJvd2FibGUgZXhjKSB7Ci0JCUlNZXNzYWdlIG1zc2cgPSB2Yy5nZXRNZXNzYWdlKCk7Ci0JCW1zc2cuc2V0SWQoaW50ZXJuYWxFcnJvck1lc3NhZ2UoKSk7Ci0JCXZjLmFkZE1lc3NhZ2UobXNzZyk7Ci0JCWlmKGV4YyAhPSBudWxsKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBNYXAgcmVtb3ZlT2xkTWVzc2FnZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLE1hcCB0YXJnZXRzKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQlpZih2Yy5nZXRVUklzKCkgPT0gbnVsbCkgewotCQkJCS8vIEZ1bGwgdmFsaWRhdGlvbgotCQkJCXZjLnJlbW92ZUFsbE1lc3NhZ2VzKCk7IC8vIFJlbW92ZSBtZXNzYWdlcyBmcm9tIHRoZSBFSkJKYXIuCi0JCQkJdmMubG9hZE1vZGVsKHJlbW92ZU9sZE1lc3NhZ2VzU3RyaW5nKCksIG5ldyBPYmplY3RbXXt2Yy5nZXRSZXBvcnRlcigpLCBudWxsfSk7IC8vIFJlbW92ZSBtZXNzYWdlcyBmcm9tIGFueSBFSkIgY2xpZW50IEpBUiBmaWxlcyBvciBKYXZhIFV0aWxpdHkgSkFSIGZpbGVzLgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHJlUmVtb3ZlT2xkTWVzc2FnZXModmMsdGFyZ2V0cyk7IC8vIEdldCB0aGUgbGlzdCBvZiB0YXJnZXRzIHRvIGJlIHZhbGlkYXRlZCwgYW5kIHJlbW92ZSBtZXNzYWdlcyBmcm9tIGFsbCBvZiB0aGVtLgotCi0JCQkvLyBSZW1vdmUgdGhlIG1lc3NhZ2VzIGZyb20gYWxsIG9mIHRoZSBjaGFuZ2VkIGZpbGVzIGFuZCB0aGVpciBkZXBlbmRlbnRzLgotCQkJdmMubG9hZE1vZGVsKHJlbW92ZU9sZE1lc3NhZ2VzU3RyaW5nKCksIG5ldyBPYmplY3RbXXt2Yy5nZXRSZXBvcnRlcigpLCB0YXJnZXRzfSk7Ci0JCQlyZXR1cm4gdGFyZ2V0czsKLQkJfQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBkZWx0YQotCSAqIEBwYXJhbSB0YXJnZXRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlUmVtb3ZlT2xkTWVzc2FnZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLE1hcCB0YXJnZXRzKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdmVPbGRNZXNzYWdlc1N0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSogQHJldHVybgotCSovCi0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLklWYWxpZGF0b3IjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLklIZWxwZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuSVJlcG9ydGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLklGaWxlRGVsdGFbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JCXN1cGVyLnZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBydW4oSVZhbGlkYXRpb25SdWxlIHJ1bGUsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAJaWYoaXNWYWxpZGF0ZWQocnVsZS5nZXRJZCgpLCB0YXJnZXRQYXJlbnQsIHRhcmdldCkpIHsKLSAgICAJCS8vIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSBmdWxsIG9yIGluY3JlbWVudGFsIHJ1biwgZG9uJ3QgcmV2YWxpZGF0ZSB0aGlzIHRhcmdldAotICAgIAkJLy8gaWYgaXQgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQuIChlLmcuIGlmIGEgY2xhc3MgaXMgdXNlZCBieSBtb3JlIHRoYW4gb25lIGJlYW4sCi0gICAgCQkvLyBhbmQgc2F5IG9uZSBiZWFuIGlzIHN0YXRlbGVzcyBhbmQgb25lIGlzIHN0YXRlZnVsLCBhbmQgZXZlcnl0aGluZyBlbHNlIGFib3V0IHRoZQotICAgIAkJLy8gYmVhbnMgYXJlIGlkZW50aWNhbCwgZG9uJ3QgdmFsaWRhdGUgdGhhdCBjbGFzcyBhZ2Fpbi4pCi0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgCXRyeSB7Ci0gICAgCQlydWxlLnByZVZhbGlkYXRlKGdldFZhbGlkYXRpb25Db250ZXh0KCksIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLSAgICAJCXJ1bGUudmFsaWRhdGUoZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSwgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotICAgIAkJcnVsZS5wb3N0VmFsaWRhdGUoZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSwgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotICAgIAl9Ci0gICAgCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0gICAgCQkvLyBDbGVhbiB1cCB0aGUgbWVzc2FnZXMgd2hpY2ggYXJlIG9uIHRoZSB0YXNrIGxpc3Q/IE9yIGlzIGl0IG5pY2VyIHRvIGxlYXZlIHRoZW0gYmVoaW5kPwotICAgIAl9Ci0gICAgCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgIAkJdGhyb3cgZTsKLSAgICAJfQotICAgIAljYXRjaChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotICAgIAkJdGhyb3cgZTsKLSAgICAJfQotICAgIAljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0gICAgCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uQ29udGV4dCgpLCBleGMpOwotICAgIAl9Ci0gICAgCWZpbmFsbHkgewotICAgIAkJc2V0VmFsaWRhdGVkKHJ1bGUuZ2V0SWQoKSwgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotICAgIAkJcmVsZWFzZVJ1bGVzKHJ1bGUpOwotICAgIAl9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJ1bGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWxlYXNlUnVsZXMoSVZhbGlkYXRpb25SdWxlIHJ1bGUpOyAKLQotICAgIHByaXZhdGUgSUVKQlZhbGlkYXRpb25Db250ZXh0IF92YyA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgSUVKQlZhbGlkYXRpb25Db250ZXh0IGdldFZhbGlkYXRpb25Db250ZXh0KCkgewotICAgIAlyZXR1cm4gX3ZjOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWxpZGF0aW9uQ29udGV4dChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMpIHsKLSAgICAJX3ZjID0gdmM7Ci0gICAgfQotCQotCS8qKgotCSAqICBUaGlzIGNsYXNzIGlzIHB1YmxpYyBvbmx5IGZvciB0aGUgRUpCSGVscGVyLgotCSAqLwotCXB1YmxpYyBjbGFzcyBUYXJnZXRPYmplY3QgewotCQlwcml2YXRlIE9iamVjdCBfcGFyZW50ID0gbnVsbDsKLQkJcHJpdmF0ZSBPYmplY3QgX3RhcmdldCA9IG51bGw7Ci0JCQotCQlwdWJsaWMgVGFyZ2V0T2JqZWN0KCkgewotCQkJLy9EZWZhdWx0Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIF9wYXJlbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KCkgewotCQkJcmV0dXJuIF90YXJnZXQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFRhcmdldFBhcmVudChPYmplY3QgdHApIHsKLQkJCV9wYXJlbnQgPSB0cDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0KSB7Ci0JCQlfdGFyZ2V0ID0gdDsKLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWludCBwYXJlbnQgPSAoZ2V0VGFyZ2V0UGFyZW50KCkgPT0gbnVsbCkgPyAwIDogZ2V0VGFyZ2V0UGFyZW50KCkuaGFzaENvZGUoKTsKLQkJCWludCB0YXJnZXQgPSAoZ2V0VGFyZ2V0KCkgPT0gbnVsbCkgPyAwIDogZ2V0VGFyZ2V0KCkuaGFzaENvZGUoKTsKLQkJCXJldHVybiBwYXJlbnQgKyB0YXJnZXQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYobyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZih0aGlzID09IG8pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJaWYoIShvIGluc3RhbmNlb2YgVGFyZ2V0T2JqZWN0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJT2JqZWN0IHRoaXNQYXJlbnQgPSB0aGlzLmdldFRhcmdldFBhcmVudCgpOwotCQkJT2JqZWN0IG9QYXJlbnQgPSAoKFRhcmdldE9iamVjdClvKS5nZXRUYXJnZXRQYXJlbnQoKTsKLQkJCU9iamVjdCB0aGlzVGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXQoKTsKLQkJCU9iamVjdCBvVGFyZ2V0ID0gKChUYXJnZXRPYmplY3QpbykuZ2V0VGFyZ2V0KCk7Ci0JCQkKLQkJCWlmKCh0aGlzUGFyZW50ID09IG51bGwpICYmIChvUGFyZW50ID09IG51bGwpKSB7Ci0JCQkJLy8gY2hlY2sgdGFyZ2V0Ci0JCQl9Ci0JCQllbHNlIGlmKCh0aGlzUGFyZW50ICE9IG51bGwpICYmIChvUGFyZW50ICE9IG51bGwpKSB7Ci0JCQkJaWYodGhpc1BhcmVudC5lcXVhbHMob1BhcmVudCkpIHsKLQkJCQkJLy8gY2hlY2sgdGFyZ2V0Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZigodGhpc1RhcmdldCA9PSBudWxsKSAmJiAob1RhcmdldCA9PSBudWxsKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSBpZigodGhpc1RhcmdldCAhPSBudWxsKSAmJiAob1RhcmdldCAhPSBudWxsKSkgewotCQkJCXJldHVybiAodGhpc1RhcmdldC5lcXVhbHMob1RhcmdldCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZWQoT2JqZWN0IGtleSwgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgewotICAgIAlTZXQgZG9uZSA9IG51bGw7Ci0gICAgCWlmKF92YWxpZGF0ZWQuY29udGFpbnNLZXkoa2V5KSkgewotICAgIAkJZG9uZSA9IChTZXQpX3ZhbGlkYXRlZC5nZXQoa2V5KTsKLSAgICAJfQotICAgIAllbHNlIHsKLSAgICAJCWRvbmUgPSBuZXcgSGFzaFNldCgpOwotICAgIAl9Ci0gICAgCQotICAgIAlkb25lLmFkZChnZXRUYXJnZXRPYmplY3RQb29sKCkuZ2V0VGFyZ2V0T2JqZWN0KHRhcmdldFBhcmVudCwgdGFyZ2V0KSk7Ci0gICAgCV92YWxpZGF0ZWQucHV0KGtleSwgZG9uZSk7Ci0gICAgfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVGFyZ2V0T2JqZWN0UG9vbCB7Ci0JCXByaXZhdGUgaW50IF9ncm93U2l6ZSA9IDA7Ci0JCXByaXZhdGUgVmVjdG9yIF9wb29sID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBUYXJnZXRPYmplY3RQb29sKGludCBpbml0aWFsU2l6ZSkgewotCQkJX2dyb3dTaXplID0gaW5pdGlhbFNpemU7Ci0JCQlfcG9vbCA9IG5ldyBWZWN0b3IoaW5pdGlhbFNpemUsIF9ncm93U2l6ZSk7Ci0JCQlncm93KCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBncm93KCkgewotCQkJZm9yKGludCBpPTA7IGk8X2dyb3dTaXplOyBpKyspIHsKLQkJCQlfcG9vbC5hZGQobmV3IFRhcmdldE9iamVjdCgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIFRhcmdldE9iamVjdCBnZXRUYXJnZXRPYmplY3QoT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgewotCQkJaWYoX3Bvb2wuc2l6ZSgpIDw9IDApIHsKLQkJCQlncm93KCk7Ci0JCQl9Ci0JCQlUYXJnZXRPYmplY3Qgb2JqID0gKFRhcmdldE9iamVjdClfcG9vbC5yZW1vdmUoMCk7Ci0JCQlvYmouc2V0VGFyZ2V0UGFyZW50KHRhcmdldFBhcmVudCk7Ci0JCQlvYmouc2V0VGFyZ2V0KHRhcmdldCk7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZWxlYXNlKFRhcmdldE9iamVjdCBvYmopIHsKLQkJCW9iai5zZXRUYXJnZXRQYXJlbnQobnVsbCk7Ci0JCQlvYmouc2V0VGFyZ2V0KG51bGwpOwotCQkJX3Bvb2wuYWRkKG9iaik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFRhcmdldE9iamVjdFBvb2wgZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZWQoT2JqZWN0IGtleSwgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgewotICAgIAlpZighX3ZhbGlkYXRlZC5jb250YWluc0tleShrZXkpKSB7Ci0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAKLSAgICAKLSAgICAJU2V0IGRvbmUgPSAoU2V0KV92YWxpZGF0ZWQuZ2V0KGtleSk7Ci0gICAgCVRhcmdldE9iamVjdCB0ZW1wID0gZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpLmdldFRhcmdldE9iamVjdCh0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0gICAgCXRyeSB7Ci0gICAgCQlpZihkb25lLmNvbnRhaW5zKHRlbXApKSB7Ci0gICAgCQkJcmV0dXJuIHRydWU7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAJCXJldHVybiBmYWxzZTsKLSAgICAJfQotICAgIAlmaW5hbGx5IHsKLSAgICAJCWdldFRhcmdldE9iamVjdFBvb2woKS5yZWxlYXNlKHRlbXApOwotICAgIAl9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0gICAgCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3ZhbGlkYXRlZC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIAl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCVNldCBkb25lID0gKFNldClfdmFsaWRhdGVkLmdldChpdGVyYXRvci5uZXh0KCkpOwotICAgIAkJSXRlcmF0b3IgdG9JdGVyYXRvciA9IGRvbmUuaXRlcmF0b3IoKTsKLSAgICAJCXdoaWxlKHRvSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCQkJVGFyZ2V0T2JqZWN0IHRvID0gKFRhcmdldE9iamVjdCl0b0l0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQlnZXRUYXJnZXRPYmplY3RQb29sKCkucmVsZWFzZSh0byk7Ci0gICAgCQl9Ci0gICAgCQlkb25lLmNsZWFyKCk7Ci0gICAgCX0KLSAgICAJX3ZhbGlkYXRlZC5jbGVhcigpOwotICAgIAlzZXRWYWxpZGF0aW9uQ29udGV4dChudWxsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudE1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3M2I3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC85LzIwMDEgMTE6NDk6NDcgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX01PREVMX05BTUUgPSAiQVBQTElDQVRJT05DTElFTlRfVkFMSURBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0REID0gIklOVkFMSURfREQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUpCX1JFRlMgPSAiRVJST1JfRUpCX1JFRlMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05DTElFTlRfVkFMSURBVE9SX0lEID0gIkFQUExJQ0FUSU9OQ0xJRU5UX1ZBTElEQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9BUFBDTElFTlRfSU5WQUxJRF9BUFBDTElFTlRfRklMRSA9ICJFUlJPUl9BUFBMSUNBVElPTkNMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfQVBQQ0xJRU5UX01JU1NJTkdfVVJJID0gIk1FU1NBR0VfQVBQQ0xJRU5UX01JU1NJTkdfVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0FQUENMSUVOVF9WQUxJREFUSU9OX0ZBSUxFRCA9ICJFUlJPUl9BUFBDTElFTlRfVkFMSURBVElPTl9GQUlMRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkVDT0wgPSAiQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkVDT0wiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkUgPSAiQVBQQ0xJRU5UX0REX1BBUlNFX0xJTkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0REX0NBTk5PVF9PUEVOX0REID0gIkFQUENMSUVOVF9ERF9DQU5OT1RfT1BFTl9ERCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRERfUEFSU0VfTk9JTkZPID0gIkFQUENMSUVOVF9ERF9QQVJTRV9OT0lORk8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0RVUF9SRVNfRU5WX1JFRl9FUlJPUl8gPSAiQVBQQ0xJRU5UX0RVUF9SRVNfRU5WX1JFRl9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0RVUF9FSkJfUkVGX0VSUk9SXyA9ICJBUFBDTElFTlRfRFVQX0VKQl9SRUZfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9NQUlOX0NMQVNTX0VSUk9SXyA9ICJBUFBDTElFTlRfTUFJTl9DTEFTU19FUlJPUl8iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTFjZjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuVmFsaWRhdGVYbWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0KLS8qKgotICogVmFsaWRhdGVzIHRoZSBhcHBsaWNhdGluLWNsaWVudC54bWwKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFVmFsaWRhdG9yIGltcGxlbWVudHMgQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25DbGllbnRGaWxlIGFwcENsaWVudEZpbGU7Ci0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50IGFwcENsaWVudEREOwotCQotCS8qKgotIAkgKiBBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotIAkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfS8vIEFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yCi0JCi0JLyoqCi0gCSAqIDxwPkFuc3dlciB0aGUgaWQgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB3aGljaCBpcwotIAkgKiB1c2VkIGJ5IHRoZSByZWNlaXZlci48L3A+Ci0gCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0JCXJldHVybiBBUExJQ0FUSU9OQ0xJRU5UX0NBVEVHT1JZOwotCX0vLyBnZXRCYXNlTmFtZQotCQotCS8qKgotCSAqICBYTUwgVmFsaWRhdG9yIG5vdyBoYW5kbGVzIHZhbGlkYXRpb24gb2YgRGVwbG95bWVudCBEZXNjcmlwdG9yCi0JICogCi0JICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JICB2YWxpZGF0ZU1haW5DbGFzc0luTWFuaWZlc3QoKTsKLQl9Ly8gdmFsaWRhdGUKLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFpbkNsYXNzSW5NYW5pZmVzdCgpIHsKLQotCQlpZiAoYXBwQ2xpZW50RmlsZSAhPSBudWxsICYmIGFwcENsaWVudEZpbGUuZ2V0TWFuaWZlc3QoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWFpbkNsYXNzID0gYXBwQ2xpZW50RmlsZS5nZXRNYW5pZmVzdCgpLmdldE1haW5DbGFzcygpOwotCQkJaWYgKG1haW5DbGFzcyA9PSBudWxsIHx8IG1haW5DbGFzcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJT2JqZWN0IHRhcmdldCA9IGdldE1hbmlmZXN0VGFyZ2V0KCk7Ci0JCQkJYWRkRXJyb3IoZ2V0QmFzZU5hbWUoKSwgQVBQQ0xJRU5UX01BSU5fQ0xBU1NfRVJST1JfLCBuZXcgU3RyaW5nWzBdLCB0YXJnZXQpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE1hbmlmZXN0VGFyZ2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogRG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKQotCSAgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCSAgc3VwZXIudmFsaWRhdGUoaW5IZWxwZXIsIGluUmVwb3J0ZXIpOwotCSAgdHJ5IHsKLQkJc2V0QXBwQ2xpZW50RmlsZSggKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgaW5IZWxwZXIubG9hZE1vZGVsKEFQUENMSUVOVF9NT0RFTF9OQU1FKSApOwotCQlpZiAoIGFwcENsaWVudEZpbGUgIT0gbnVsbCApIHsKLQkJICBzZXRBcHBDbGllbnRERCggYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICk7Ci0JCSAgdmFsaWRhdGUoKTsKLQkJfSBlbHNlIHsKLQkJICBJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0FQUENMSUVOVF9JTlZBTElEX0FQUENMSUVOVF9GSUxFKTsKLQkJICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZyk7Ci0JCX0vLyBpZgotCSAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkgIHRocm93IGV4OwotCSAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9BUFBDTElFTlRfVkFMSURBVElPTl9GQUlMRUQpOwotCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0JICB9Ly8gdHJ5IAotCX0vLyB2YWxpZGF0ZQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbGlkYXRlIHhtbCBjb21tYW5kLgotCSAqIAotCSAqIEByZXR1cm4gQ29tbWFuZAotCSAqLwkKLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVWYWxpZGF0ZVhNTENvbW1hbmQoKSB7Ci0JCUNvbW1hbmQgY21kID0gbmV3IFZhbGlkYXRlWG1sQ29tbWFuZChhcHBDbGllbnRGaWxlKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ly8gY3JlYXRlVmFsaWRhdGVYTUxDb21tYW5kCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgYXBwQ2xpZW50RmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50RmlsZQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEZpbGUgZ2V0QXBwQ2xpZW50RmlsZSgpIHsKLQkJcmV0dXJuIGFwcENsaWVudEZpbGU7Ci0JfS8vIGdldEFwcENsaWVudEZpbGUKLQotCS8qKgotCSAqIFNldHMgdGhlIGFwcENsaWVudEZpbGUuCi0JICogCi0JICogQHBhcmFtIEFwcGxpY2F0b25DbGllbnRGaWxlIGFwcENsaWVudEZpbGUgLSBUaGUgYXBwQ2xpZW50RmlsZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBDbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlKSB7Ci0JCXRoaXMuYXBwQ2xpZW50RmlsZSA9IGFwcENsaWVudEZpbGU7Ci0JfS8vIHNldEFwcENsaWVudEZpbGUKLQotCS8qKgotCSAqIEdldHMgdGhlIGFwcENsaWVudERELgotCSAqIAotCSAqIEByZXR1cm4gQXBwbGljYXRpb25DbGllbnQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwQ2xpZW50REQoKSB7Ci0JCXJldHVybiBhcHBDbGllbnRERDsKLQl9Ly8gZ2V0QXBwQ2xpZW50REQKLQotCS8qKgotCSAqIFNldHMgdGhlIGFwcENsaWVudERELgotCSAqIAotCSAqIEBwYXJhbSBBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnRERCAtIFRoZSBhcHBDbGllbnRERCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBDbGllbnRERChBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnRERCkgewotCQl0aGlzLmFwcENsaWVudEREID0gYXBwQ2xpZW50REQ7Ci0JfS8vIHNldEFwcENsaWVudERECi0KLX0vLyBBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QQmVhbkNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4ZWI5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBRW50aXR5QmVhbkNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuYmIiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRU5USVRZQkVBTn07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtMT0NBTF9DT01QT05FTlRfSU5URVJGQUNFLCBSRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRX07Ci0JCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9BQlNUUkFDVCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfRklOQUwgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX1BVQkxJQyA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NPTlNUUlVDVE9SX05PUEFSTSwgRUpCRklOREJZUFJJTUFSWUtFWSwgU0VURU5USVRZQ09OVEVYVCwgVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTSwgRUpCQUNUSVZBVEVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJMT0FEX05PUEFSTSwgRUpCU1RPUkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtGSU5BTElaRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEUsIEVKQlBPU1RDUkVBVEUsIEVKQkhPTUUsIEZJTkFMSVpFX05PUEFSTSwgRUpCRklOREJZUFJJTUFSWUtFWSwgRUpCRklORCwgU0VURU5USVRZQ09OVEVYVCwgVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTSwgRUpCQUNUSVZBVEVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJMT0FEX05PUEFSTSwgRUpCU1RPUkVfTk9QQVJNLCBGSU5BTElaRV9OT1BBUk0sIEJVU0lORVNTfTsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTQsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE1LCBuZXcgU3RyaW5nW117Q0hLSjIwMTUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jb25zdHIsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jb25zdHIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJDcmVhdGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJGaW5kQnlQcmltYXJ5S2V5LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiRmluZEJ5UHJpbWFyeUtleStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3NldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQWN0aXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJBY3RpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkxvYWQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJMb2FkK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU3RvcmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTdG9yZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlNlbGVjdCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlNlbGVjdCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJGaW5kK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBvc3RDcmVhdGUrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMrU1BFQ30pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNytCRVhULCBDSEtKMjQwNytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDExLCBuZXcgU3RyaW5nW117Q0hLSjI0MTErQkVYVCwgQ0hLSjI0MTErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIxLCBuZXcgU3RyaW5nW117Q0hLSjI0MjErQkVYVCwgQ0hLSjI0MjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMitCRVhULCBDSEtKMjQyMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMywgbmV3IFN0cmluZ1tde0NIS0oyNDIzK0JFWFQsIENIS0oyNDIzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI0LCBuZXcgU3RyaW5nW117Q0hLSjI0MjQrQkVYVCwgQ0hLSjI0MjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNitCRVhULCBDSEtKMjQyNitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNywgbmV3IFN0cmluZ1tde0NIS0oyNDI3K0JFWFQsIENIS0oyNDI3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI4LCBuZXcgU3RyaW5nW117Q0hLSjI0MjgrQkVYVCwgQ0hLSjI0MjgrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMCwgbmV3IFN0cmluZ1tde0NIS0oyNDMwK0JFWFQsIENIS0oyNDMwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMxLCBuZXcgU3RyaW5nW117Q0hLSjI0MzErQkVYVCwgQ0hLSjI0MzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzksIG5ldyBTdHJpbmdbXXtDSEtKMjQzOStCRVhULCBDSEtKMjQzOStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQxLCBuZXcgU3RyaW5nW117Q0hLSjI0NDErQkVYVCwgQ0hLSjI0NDErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MitCRVhULCBDSEtKMjQ0MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MywgbmV3IFN0cmluZ1tde0NIS0oyNDQzK0JFWFQsIENIS0oyNDQzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU3LCBuZXcgU3RyaW5nW117Q0hLSjI0NTcrQkVYVCwgQ0hLSjI0NTcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1OCtCRVhULCBDSEtKMjQ1OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1OSwgbmV3IFN0cmluZ1tde0NIS0oyNDU5K0JFWFQsIENIS0oyNDU5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OCtCRVhULCBDSEtKMjQ3OCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkyLCBuZXcgU3RyaW5nW117Q0hLSjI0OTIrQkVYVCwgQ0hLSjI0OTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MytCRVhULCBDSEtKMjQ5MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NCwgbmV3IFN0cmluZ1tde0NIS0oyNDk0K0JFWFQsIENIS0oyNDk0K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZmluYWxpemUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9maW5hbGl6ZStCRVhULCBDSEtKMjUwMl9maW5hbGl6ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAzX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjUwM19lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkhvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJIb21lK0JFWFQsIENIS0oyNTAzX2VqYkhvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2VqYkZpbmQrQkVYVCwgQ0hLSjI1MDNfZWpiRmluZCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA1X2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlJlbW92ZStCRVhULCBDSEtKMjUwNV9lamJSZW1vdmUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfQUJTVFJBQ1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfRklOQUw7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX1BVQkxJQzsKLQl9Ci0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIE5FSVRIRVI7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFCZWFuQ2xhc3NWUnVsZSNmb2xsb3dFamJDcmVhdGVSZXR1cm5UeXBlUnVsZXMoTWV0aG9kKQotCSAqLwotCXB1YmxpYyBmaW5hbCBKYXZhSGVscGVycyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCUphdmFIZWxwZXJzIHJldFR5cGUgPSBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKGJlYW4sIG1ldGhvZCk7Ci0JCWlmKHJldFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9QUklNQVJZX0tFWTsKLQkJfQotCQlyZXR1cm4gcmV0VHlwZS5nZXRKYXZhTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlBPU1RDUkVBVEUpID09IEVKQlBPU1RDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQkZJTkQpID09IEVKQkZJTkQpIHsKLQkJCXZhbGlkYXRlRWpiRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJIT01FKSA9PSBFSkJIT01FKSB7Ci0JCQl2YWxpZGF0ZUVqYkhvbWVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJdmFsaWRhdGVFamJSZW1vdmVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYkNyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlBPU1RDUkVBVEUpID09IEVKQlBPU1RDUkVBVEUpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0VqYlBvc3RDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJGSU5EKSA9PSBFSkJGSU5EKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJGaW5kTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCSE9NRSkgPT0gRUpCSE9NRSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiSG9tZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4KLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZUVqYkZpbmRNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vICMgZWpiRmluZCBtZXRob2RzCi0JCS8vIElXQUQ0NTAyID0gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhpc3Qgb24gdGhpcyBjbGFzcy4gUmVhZCBzZWN0aW9uIDEwLjUuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDUwNyA9IFRoZSBjb250YWluZXIgcHJvdmlkZXMgdGhlIGVqYkZpbmQgbWV0aG9kIGltcGxlbWVudGF0aW9uLiBSZWFkIHNlY3Rpb24gMTAuNi4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCS8vIGNvdmVyZWQgYnkgdGhlICJtdXN0IG5vdCBleGlzdCIgY29kZT8KLQkJCi0JCS8vIElXQUQ0MzA1ID0gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxMi4yLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCQotCQkvLyBJV0FENDMwNiA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiBSZWFkIHNlY3Rpb24gMTIuMi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQzMDcgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIFJlYWQgc2VjdGlvbiAxMi4yLjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gSVdBRDQzMDggPSB7MH0gbXVzdCBiZSBhIGxlZ2FsIHR5cGUgZm9yIFJNSS1JSU9QLiBSZWFkIHNlY3Rpb24gMTIuMi41IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCXZhbGlkYXRlUk1JX0lJT1BUeXBlUnVsZXModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCBmYWxzZSk7IC8vIGRvIG5vdCBjaGVjayBpZiB0aGUgcmV0dXJuIHR5cGUgaXMgc2VyaWFsaXphYmxlCi0JCQotCQkvLyBJV0FENDMwOSA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfSBvciBhIGNvbGxlY3Rpb24gdGhlcmVvZi4gUmVhZCBzZWN0aW9uIDEyLjIuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDMxMiA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHswfS4gUmVhZCBzZWN0aW9uIDEyLjIuNSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQlKYXZhSGVscGVycyByZXRUeXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUobWV0aG9kLmdldFJldHVyblR5cGUoKSk7Ci0JCUphdmFIZWxwZXJzIGtleSA9ICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJaWYoIShWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKHJldFR5cGUsIGJlYW4pIHx8Ci0JCQkgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihyZXRUeXBlLCBiZWFuKSB8fAotCQkJICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShyZXRUeXBlLCBrZXkpCi0JCSAgICkpIHsKLQkJICAgCVN0cmluZyBrZXlOYW1lID0gKGtleSA9PSBudWxsKSA/IElFSkJWYWxpZGF0b3JDb25zdGFudHMuTlVMTF9QUklNQVJZX0tFWSA6IGtleS5nZXRKYXZhTmFtZSgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjQwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXXtrZXlOYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmZvbGxvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblJ1bGVzKGJlYW4sIG1ldGhvZCkpIHsKLQkJCS8vIElXQUQ0Mjg1ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgamF2YXguZWpiLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLiBSZWFkIHNlY3Rpb24gMTIuMS44LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCS8vIElXQUQ0MTY4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3cgT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMC41LjguNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBJV0FENDMxMCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEyLjIuNSwgMTguMy44LCAxOC42IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiRmluZCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBLZXlDbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QS2V5Q2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTc1ZDBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBLZXlDbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCTVBLZXlDbGFzc1ZSdWxlIGV4dGVuZHMgQUtleUNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJRUpCVHlwZSwgSVJlbW90ZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5rYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtIQVNIQ09ERV9OT1BBUk0sIEVRVUFMU307Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgSEFTSENPREVfTk9QQVJNLCBFUVVBTFMsIENPTlNUUlVDVE9SLCBDT05TVFJVQ1RPUl9OT1BBUk19OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2hhc2hDb2RlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfaGFzaENvZGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lcXVhbHMsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lcXVhbHMrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE5LCBuZXcgU3RyaW5nW117Q0hLSjIwMTkrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQkvLyBLZXkgbWV0aG9kcyBhcmUgbm90IGNoZWNrZWQgZm9yIFJlbW90ZUV4Y2VwdGlvbiwgYnV0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgVlJ1bGVzLi4uCi0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiAoKEVudGl0eSlwYXJlbnQpLmdldFByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcywgTWV0aG9kKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIHBhcmVudCwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZEV4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBEbyBub3QgcGVyZm9ybSBhbnkgdmFsaWRhdGlvbiBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIChvdGhlciB0aGFuIHRoZQotCQkvLyB2YWxpZGF0aW9uIHBlcmZvcm1lZCBpbiBBS2V5Q2xhc3NWUnVsZSdzIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGhhc2hDb2RlKCkKLQkJLy8gYW5kIGVxdWFscyhPYmplY3QpCi0JfQotCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcywgRmllbGQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gRG8gbm90IHBlcmZvcm0gYW55IHZhbGlkYXRpb24gb24gdGhlIGZpZWxkcyBvZiB0aGUgQk1QIGtleSBjbGFzcwotCQlsb25nIGZpZWxkVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldEZpZWxkVHlwZUlkKGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7Ci0JCWlmKChmaWVsZFR5cGUgJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuU0VSSUFMVkVSU0lPTlVJRCkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQpIHsKLQkJCXZhbGlkYXRlU2VyaWFsVmVyc2lvblVJRCh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWFmMDVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCTVBMb2NhbENvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSUVKQlR5cGUsIElMb2NhbFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuYmxjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVH07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkgCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNnZXREZXBlbmRzT24oKQotCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI2dldE1lc3NhZ2VJZHMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbEhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTI0MTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbEhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QTG9jYWxIb21lVlJ1bGUgZXh0ZW5kcyBBQk1QSG9tZVZSdWxlIGltcGxlbWVudHMgSUxvY2FsVHlwZSwgSUVKQlR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtdIHsgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUyB9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmJsaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tdIHsgSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRSB9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tdIHsgRklOREJZUFJJTUFSWUtFWSwgRklORCB9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXSB7Q0xJTklULCBDUkVBVEUsIEZJTkRCWVBSSU1BUllLRVksIEZJTkQsIEhPTUUgfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXSB7Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXSB7Q0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAyLCBuZXcgU3RyaW5nW10geyBDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDMsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MStCRVhULCBDSEtKMjQ2MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MiwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NjIrQkVYVCwgQ0hLSjI0NjIrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYzLCBuZXcgU3RyaW5nW10geyBDSEtKMjQ2MytCRVhULCBDSEtKMjQ2MytNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjQsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDY0K0JFWFQsIENIS0oyNDY0K01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NSwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY2LCBuZXcgU3RyaW5nW117Q0hLSjI0NjYrQkVYVCwgQ0hLSjI0NjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjcsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFQgfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc1LCBuZXcgU3RyaW5nW117Q0hLSjI0NzUrQkVYVCwgQ0hLSjI0NzUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzcsIG5ldyBTdHJpbmdbXSB7IENIS0oyNDc3K0JFWFQsIENIS0oyNDc3K01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OCwgbmV3IFN0cmluZ1tde0NIS0oyNDc4K0JFWFQsIENIS0oyNDc4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc5LCBuZXcgU3RyaW5nW10geyBDSEtKMjQ3OStCRVhULCBDSEtKMjQ3OStNRVhUIH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2ZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9maW5kK0JFWFQsIENIS0oyNTAwX2ZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXSB7IENIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2ZpbmQsIG5ldyBTdHJpbmdbXSB7IENIS0oyNTAzX2ZpbmQrQkVYVCwgQ0hLSjI1MDNfZmluZCtNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfaG9tZSwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI1MDNfaG9tZStCRVhULCBDSEtKMjUwM19ob21lK01FWFQgfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXSB7IENIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVCB9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2ZpbmQsIG5ldyBTdHJpbmdbXSB7IENIS0oyNTA0X2ZpbmQrQkVYVCwgQ0hLSjI1MDRfZmluZCtNRVhUIH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfaG9tZSwgbmV3IFN0cmluZ1tdIHsgQ0hLSjI1MDRfaG9tZStCRVhULCBDSEtKMjUwNF9ob21lK01FWFQgfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjcxNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCTVBSZW1vdGVDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJQ29tcG9uZW50VHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5icmMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklUfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OCtCRVhULCBDSEtKMjQ2OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OSwgbmV3IFN0cmluZ1tde0NIS0oyNDY5K0JFWFQsIENIS0oyNDY5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MCtCRVhULCBDSEtKMjQ3MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MSwgbmV3IFN0cmluZ1tde0NIS0oyNDcxK0JFWFQsIENIS0oyNDcxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcyLCBuZXcgU3RyaW5nW117Q0hLSjI0NzIrQkVYVCwgQ0hLSjI0NzIrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2J1c2luZXNzK0JFWFQsIENIS0oyNTAwX2J1c2luZXNzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzM5ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QUmVtb3RlSG9tZVZSdWxlIGV4dGVuZHMgQUJNUEhvbWVWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuYnJoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkhPTUV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtGSU5EQllQUklNQVJZS0VZLCBGSU5EfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEUsIEZJTkRCWVBSSU1BUllLRVksIEZJTkQsIEhPTUV9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmQrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYyLCBuZXcgU3RyaW5nW117Q0hLSjI0NjIrQkVYVCwgQ0hLSjI0NjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MytCRVhULCBDSEtKMjQ2MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NCwgbmV3IFN0cmluZ1tde0NIS0oyNDY0K0JFWFQsIENIS0oyNDY0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NStCRVhULCBDSEtKMjQ3NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NywgbmV3IFN0cmluZ1tde0NIS0oyNDc3K0JFWFQsIENIS0oyNDc3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzksIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OStCRVhULCBDSEtKMjQ3OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2ZpbmQrQkVYVCwgQ0hLSjI1MDBfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2ZpbmQrQkVYVCwgQ0hLSjI1MDNfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfaG9tZStCRVhULCBDSEtKMjUwM19ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2ZpbmQrQkVYVCwgQ0hLSjI1MDRfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfaG9tZStCRVhULCBDSEtKMjUwNF9ob21lK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QQmVhbkNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkMTQ5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENNUEJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQUVudGl0eUJlYW5DbGFzc1ZSdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmNiIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VOVElUWUJFQU59OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG5ldyBsb25nW117TE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRSwgUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0V9OwotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfQUJTVFJBQ1QgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfRklOQUwgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX1BVQkxJQyA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NPTlNUUlVDVE9SX05PUEFSTSwgU0VURU5USVRZQ09OVEVYVCwgVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTSwgRUpCQUNUSVZBVEVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJMT0FEX05PUEFSTSwgRUpCU1RPUkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtFSkJGSU5ELCBGSU5BTElaRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEUsIEVKQlBPU1RDUkVBVEUsIEVKQkhPTUUsIEZJTkFMSVpFX05PUEFSTSwgRUpCRklORCwgQUNDRVNTT1IsIEVKQkZJTkRCWVBSSU1BUllLRVksIFNFVEVOVElUWUNPTlRFWFQsIFVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTSwgRUpCTE9BRF9OT1BBUk0sIEVKQlNUT1JFX05PUEFSTSwgRUpCU0VMRUNULCBGSU5BTElaRV9OT1BBUk0sIEJVU0lORVNTfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCS8vIEFkZCB0aGVzZSBjaGVja3MgaW4gdGhlIGNvZGUgbGF0ZXIKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDgxLCBuZXcgU3RyaW5nW117Q0hLSjI0ODErQkVYVCwgQ0hLSjI0ODErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4MitCRVhULCBDSEtKMjQ4MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4MywgbmV3IFN0cmluZ1tde0NIS0oyNDgzK0JFWFQsIENIS0oyNDgzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg0LCBuZXcgU3RyaW5nW117Q0hLSjI0ODQrQkVYVCwgQ0hLSjI0ODQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODksIG5ldyBTdHJpbmdbXXtDSEtKMjQ4OStCRVhULCBDSEtKMjQ4OStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNSwgbmV3IFN0cmluZ1tde0NIS0oyMjA1K0JFWFQsIENIS0oyMjA1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjA2LCBuZXcgU3RyaW5nW117Q0hLSjIyMDYrQkVYVCwgQ0hLSjIyMDYrTUVYVH0pOwotCQkvLyBlbmQgYWRkIGxhdGVyCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNSwgbmV3IFN0cmluZ1tde0NIS0oyMDE1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfYWNjLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfYWNjK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY29uc3RyLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY29uc3RyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQ3JlYXRlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiRmluZEJ5UHJpbWFyeUtleSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfc2V0RW50aXR5Q29udGV4dCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkFjdGl2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQWN0aXZhdGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJQYXNzaXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJQYXNzaXZhdGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJSZW1vdmUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJMb2FkLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiTG9hZCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlN0b3JlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiU3RvcmUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTZWxlY3QrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiRmluZCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJQb3N0Q3JlYXRlK0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDExLCBuZXcgU3RyaW5nW117Q0hLSjI0MTErQkVYVCwgQ0hLSjI0MTErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIxLCBuZXcgU3RyaW5nW117Q0hLSjI0MjErQkVYVCwgQ0hLSjI0MjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMitCRVhULCBDSEtKMjQyMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMywgbmV3IFN0cmluZ1tde0NIS0oyNDIzK0JFWFQsIENIS0oyNDIzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI0LCBuZXcgU3RyaW5nW117Q0hLSjI0MjQrQkVYVCwgQ0hLSjI0MjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNitCRVhULCBDSEtKMjQyNitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNywgbmV3IFN0cmluZ1tde0NIS0oyNDI3K0JFWFQsIENIS0oyNDI3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI4LCBuZXcgU3RyaW5nW117Q0hLSjI0MjgrQkVYVCwgQ0hLSjI0MjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzAsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMCtCRVhULCBDSEtKMjQzMCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMSwgbmV3IFN0cmluZ1tde0NIS0oyNDMxK0JFWFQsIENIS0oyNDMxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDM5LCBuZXcgU3RyaW5nW117Q0hLSjI0MzkrQkVYVCwgQ0hLSjI0MzkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MSwgbmV3IFN0cmluZ1tde0NIS0oyNDQxK0JFWFQsIENIS0oyNDQxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQyLCBuZXcgU3RyaW5nW117Q0hLSjI0NDIrQkVYVCwgQ0hLSjI0NDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MytCRVhULCBDSEtKMjQ0MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0OSwgbmV3IFN0cmluZ1tde0NIS0oyNDQ5K0JFWFQsIENIS0oyNDQ5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTAsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1MCtCRVhULCBDSEtKMjQ1MCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NCwgbmV3IFN0cmluZ1tde0NIS0oyNDU0K0JFWFQsIENIS0oyNDU0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4MCwgbmV3IFN0cmluZ1tde0NIS0oyNDgwK0JFWFQsIENIS0oyNDgwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg1LCBuZXcgU3RyaW5nW117Q0hLSjI0ODUrQkVYVCwgQ0hLSjI0ODUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0ODYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ4NitCRVhULCBDSEtKMjQ4NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ4NywgbmV3IFN0cmluZ1tde0NIS0oyNDg3K0JFWFQsIENIS0oyNDg3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDg4LCBuZXcgU3RyaW5nW117Q0hLSjI0ODgrQkVYVCwgQ0hLSjI0ODgrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MiwgbmV3IFN0cmluZ1tde0NIS0oyNDkyK0JFWFQsIENIS0oyNDkyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5NiwgbmV3IFN0cmluZ1tde0NIS0oyNDk2K0JFWFQsIENIS0oyNDk2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk3LCBuZXcgU3RyaW5nW117Q0hLSjI0OTcrQkVYVCwgQ0hLSjI0OTcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJIb21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZWpiSG9tZStCRVhULCBDSEtKMjUwMF9lamJIb21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2VqYkZpbmQrQkVYVCwgQ0hLSjI1MDJfZWpiRmluZCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAzX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjUwM19lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2VqYkhvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJIb21lK0JFWFQsIENIS0oyNTAzX2VqYkhvbWUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjUwNV9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA1X2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlJlbW92ZStCRVhULCBDSEtKMjUwNV9lamJSZW1vdmUrTUVYVH0pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVBYnN0cmFjdChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9BQlNUUkFDVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVGaW5hbChKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9GSU5BTDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVQdWJsaWMoSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCXJldHVybiBTSE9VTERfQkVfUFVCTElDOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBORUlUSEVSOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBKYXZhSGVscGVycyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudXNlc1Vua25vd25QcmltYXJ5S2V5KGNtcCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBjbXApOwotCQkJfQotCQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcm9ibGVtcy4uLi4KLQkJCQkvLyBsZXQgdGhpcyBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgKGdldFByaW1hcnlLZXkoKSkKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IGdldEVqYkNyZWF0ZVJldHVyblR5cGUoYmVhbiwgbWV0aG9kKTsKLQkJaWYocmV0VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1BSSU1BUllfS0VZOwotCQl9Ci0JCXJldHVybiByZXRUeXBlLmdldEphdmFOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KTsKLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJCi0JCS8vIDEwLjMuMSwgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVudCBmaWVsZHMgYW5kIGNvbnRhaW5lci1tYW5hZ2VkIHJlbGF0aW9uc2hpcCAKLQkJLy8gZmllbGRzIG11c3QgKm5vdCogYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuIAotCQlMaXN0IGNtckZpZWxkcyA9IGNtcC5nZXRDTVJGaWVsZHMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjbXJGaWVsZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDTVJGaWVsZCBjbXJGaWVsZCA9IChDTVJGaWVsZClpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZigoY21yRmllbGQgIT0gbnVsbCkgJiYgKCFjbXJGaWVsZC5pc0Rlcml2ZWQoKSkpIHsKLQkJCQl2YWxpZGF0ZUNtckZpZWxkKHZjLCBjbXAsIGNsYXp6LCBjbXJGaWVsZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUxpc3QgY21wRmllbGRzID0gY21wLmdldEZpbHRlcmVkRmVhdHVyZXMoTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuc2luZ2xldG9uKCkpOwotCQlpZihjbXBGaWVsZHMgIT0gbnVsbCAmJiAhY21wRmllbGRzLmlzRW1wdHkoKSkgewotCQlpdGVyYXRvciA9IGNtcEZpZWxkcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUNNUEF0dHJpYnV0ZSBjbXBGaWVsZCA9IChDTVBBdHRyaWJ1dGUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoKGNtcEZpZWxkICE9IG51bGwpICYmICghY21wRmllbGQuaXNEZXJpdmVkKCkpKSB7Ci0JCQkJdmFsaWRhdGVDbXBGaWVsZCh2YywgY21wLCBjbGF6eiwgY21wRmllbGQpOwotCQkJfQotCQkgIH0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCk7Ci0JCQotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0NyZWF0ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0OTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGVFamJTZWxlY3RNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgcGFyZW50LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gIyBlamJTZWxlY3Q8TUVUSE9EPiBjaGVja3MKLQkJLy8gSVdBRDQxNTQgPSB7MH0gbXVzdCBleGlzdC4gUmVhZCBzZWN0aW9uIDEwLjUuMiBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDUwMiA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IGV4aXN0IG9uIHRoaXMgY2xhc3MuIFJlYWQgc2VjdGlvbiAxMC41LjUgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJLy8gSVdBRDQxOTcgPSBBbiBlamJTZWxlY3QgbWV0aG9kIG11c3QgZXhpc3QuIFJlYWQgc2VjdGlvbiAxMC42Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCi0JCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlKYXZhSGVscGVycyBqYXZhVXRpbENvbGxlY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20ocmV0dXJuVHlwZSwgYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpKSAmJgotCQkJIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIGphdmFVdGlsQ29sbGVjdGlvbikgKSB7Ci0JCQkvLyBJV0FENDE2MCA9IFR5cGUgezB9IGNhbm5vdCBiZSByZXR1cm5lZCBieSBhIHNlbGVjdCBtZXRob2QuIFJlYWQgc2VjdGlvbiAxMC41Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ4NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcmVudCwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJLy8gSVdBRDQxOTggPSBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gUmVhZCBzZWN0aW9uIDEwLjYuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDg3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFyZW50LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoIW1ldGhvZC5pc0Fic3RyYWN0KCkpIHsKLQkJCS8vIElXQUQ0MTk5ID0gVGhpcyBtZXRob2QgbXVzdCBiZSBhYnN0cmFjdC4gUmVhZCBzZWN0aW9uIDEwLjYuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQxNTggPSB7MH0gbXVzdCBiZSBhYnN0cmFjdC4gUmVhZCBzZWN0aW9uIDEwLjUuNyBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDg1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFyZW50LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NGaW5kZXJFeGNlcHRpb24oYmVhbiwgbWV0aG9kKSkgewotCQkJLy8gSVdBRDQyMDAgPSBUaGlzIG1ldGhvZCBtdXN0IHRocm93IGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMC42Ljcgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ4OCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcmVudCwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZm9sbG93c09iamVjdE5vdEZvdW5kRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewotCQkJLy8gSVdBRDQyODUgPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBqYXZheC5lamIuT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uIFJlYWQgc2VjdGlvbiAxMi4xLjguNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJLy8gSVdBRDQxNjggPSBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdyBPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDEwLjUuOC40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJlbnQsIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBDaGVjayBtZXRob2QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcXVlcnkgZWxlbWVudCBpbiBlamItamFyLnhtbC4KLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzb2NpYXRlZFdpdGhRdWVyeShjbXAsIG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ5NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcmVudCwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNtcEZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAsIEphdmFDbGFzcyBjbGF6eiwgQ01QQXR0cmlidXRlIGF0dHJpYikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSBhdHRyaWIuZ2V0TmFtZSgpOwotCQlpZigoZmllbGROYW1lID09IG51bGwpIHx8IChmaWVsZE5hbWUuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gbGV0IHRoZSBFSkJKYXJWUnVsZSByZXBvcnQgdGhpcwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZighQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGZpZWxkTmFtZS5jaGFyQXQoMCkpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0ODAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIGNsYXp6LCBhdHRyaWIuZ2V0RmllbGQoKSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBTZWN0aW9uIDEwLjguMwotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVW5rbm93blByaW1hcnlLZXkoYXR0cmliKSkgewotCQkJSmF2YUNsYXNzIGVqYkNsYXNzID0gY21wLmdldEVqYkNsYXNzKCk7Ci0JCQlNZXRob2QgZ2V0TWV0aG9kID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldE1ldGhvZEV4dGVuZGVkKGVqYkNsYXNzLCBhdHRyaWIuZ2V0R2V0dGVyTmFtZSgpLCBuZXcgSmF2YUhlbHBlcnNbMF0sIGF0dHJpYi5nZXRUeXBlKCkpOwotCQkJaWYoZ2V0TWV0aG9kID09IG51bGwpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfYWNjLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGNtcCwgY2xhenosIG5ldyBTdHJpbmdbXXthdHRyaWIuZ2V0R2V0dGVyTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZhbGlkYXRlQ01QQWNjZXNzb3JNZXRob2QodmMsIGNtcCwgY2xhenosIGdldE1ldGhvZCwgYXR0cmliKTsKLQkJCX0KLQkJCQotCQkJSmF2YUhlbHBlcnNbXSBzZXRNZXRob2RQYXJtcyA9IG5ldyBKYXZhSGVscGVyc1tde2F0dHJpYi5nZXRUeXBlKCl9OwotCQkJTWV0aG9kIHNldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChlamJDbGFzcywgYXR0cmliLmdldFNldHRlck5hbWUoKSwgc2V0TWV0aG9kUGFybXMpOwotCQkJaWYoc2V0TWV0aG9kID09IG51bGwpIHsKLQkJCQlTdHJpbmcgc2V0dGVyTmFtZSA9IGF0dHJpYi5nZXRTZXR0ZXJOYW1lKCkgKyAiKCIgKyBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0UGFybXNBc1N0cmluZyhzZXRNZXRob2RQYXJtcykgKyAiKSI7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfYWNjLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGNtcCwgY2xhenosIG5ldyBTdHJpbmdbXXtzZXR0ZXJOYW1lfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZhbGlkYXRlQ01QQWNjZXNzb3JNZXRob2QodmMsIGNtcCwgY2xhenosIHNldE1ldGhvZCwgYXR0cmliKTsKLQkJCX0KLQkJfQotCi0JCUZpZWxkIGZpZWxkID0gYXR0cmliLmdldEZpZWxkKCk7Ci0JCWlmICgoZmllbGQgIT0gbnVsbCkgJiYgKGNsYXp6LmdldEZpZWxkRXh0ZW5kZWQoYXR0cmliLmdldE5hbWUoKSkgIT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgY2xhenosIGZpZWxkLCBuZXcgU3RyaW5nW117YXR0cmliLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ21yRmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCwgSmF2YUNsYXNzIGNsYXp6LCBDTVJGaWVsZCBjbXJGaWVsZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSBjbXJGaWVsZC5nZXROYW1lKCk7Ci0JCWlmKChmaWVsZE5hbWUgPT0gbnVsbCkgfHwgKGZpZWxkTmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBsZXQgdGhlIEVKQkphclZSdWxlIHJlcG9ydCB0aGlzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKCFDaGFyYWN0ZXIuaXNMb3dlckNhc2UoZmllbGROYW1lLmNoYXJBdCgwKSkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ4MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgY2xhenosIGNtckZpZWxkLmdldEZpZWxkKCksIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGVqYkNsYXNzID0gY21wLmdldEVqYkNsYXNzKCk7Ci0JCUphdmFIZWxwZXJzIGxvY2FsVHlwZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRDTVJGaWVsZFR5cGUodmMsIGNtcCwgY2xhenosIGNtckZpZWxkKTsKLQkJaWYobG9jYWxUeXBlID09IG51bGwpIHsKLQkJCS8vIHVzZXIgbWFkZSBhIG1pc3Rha2UgaW4gZWpiLWphci54bWwgYnkgdHJ5aW5nIHRvIGNyZWF0ZSBhIHJlbGF0aW9uCi0JCQkvLyB0byBhIENNUCB3aGljaCBkb2Vzbid0IGhhdmUgYSBsb2NhbCBpbnRlcmZhY2UuCi0JCQkvLyBEb24ndCByZXBvcnQgYW4gZXJyb3IgaGVyZTsgbGV0IHRoZSBERCB2YWxpZGF0aW9uIHJlcG9ydCB0aGUgZXJyb3IuCi0JCQlyZXR1cm47Ci0JCX0KLQkJTWV0aG9kIGdldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChlamJDbGFzcywgY21yRmllbGQuZ2V0R2V0dGVyTmFtZSgpLCBuZXcgSmF2YUhlbHBlcnNbMF0sIGxvY2FsVHlwZSk7Ci0JCWlmKGdldE1ldGhvZCA9PSBudWxsKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfYWNjLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGNtcCwgY2xhenosIG5ldyBTdHJpbmdbXXtjbXJGaWVsZC5nZXRHZXR0ZXJOYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZGF0ZUNNUkFjY2Vzc29yTWV0aG9kKHZjLCBjbXAsIGNsYXp6LCBnZXRNZXRob2QsIGNtckZpZWxkKTsKLQkJfQotCQkKLQkJSmF2YUhlbHBlcnNbXSBzZXRNZXRob2RQYXJtcyA9IG5ldyBKYXZhSGVscGVyc1tde2xvY2FsVHlwZX07Ci0JCU1ldGhvZCBzZXRNZXRob2QgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kRXh0ZW5kZWQoZWpiQ2xhc3MsIGNtckZpZWxkLmdldFNldHRlck5hbWUoKSwgc2V0TWV0aG9kUGFybXMpOwotCQlpZihzZXRNZXRob2QgPT0gbnVsbCkgewotCQkJU3RyaW5nIHNldHRlck5hbWUgPSBjbXJGaWVsZC5nZXRTZXR0ZXJOYW1lKCkgKyAiKCIgKyBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0UGFybXNBc1N0cmluZyhzZXRNZXRob2RQYXJtcykgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBjbXAsIGNsYXp6LCBuZXcgU3RyaW5nW117c2V0dGVyTmFtZX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkYXRlQ01SQWNjZXNzb3JNZXRob2QodmMsIGNtcCwgY2xhenosIHNldE1ldGhvZCwgY21yRmllbGQpOwotCQl9Ci0JCQotCQlGaWVsZCBmaWVsZCA9IGNtckZpZWxkLmdldEZpZWxkKCk7Ci0JCWlmICgoZmllbGQgIT0gbnVsbCkgJiYgKGNsYXp6LmdldEZpZWxkRXh0ZW5kZWQoY21yRmllbGQuZ2V0TmFtZSgpKSAhPSBudWxsKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDU0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBjbGF6eiwgZmllbGQsIG5ldyBTdHJpbmdbXXtjbXJGaWVsZC5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDTVJBY2Nlc3Nvck1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgQ01SRmllbGQgZmllbGQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkJCSAKLQkJaWYoIW1ldGhvZC5pc0Fic3RyYWN0KCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNNUEFjY2Vzc29yTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBDTVBBdHRyaWJ1dGUgZmllbGQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHVibGljKG1ldGhvZCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ0OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkJCSAKLQkJaWYoIW1ldGhvZC5pc0Fic3RyYWN0KCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjQ1MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlBPU1RDUkVBVEUpID09IEVKQlBPU1RDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQkhPTUUpID09IEVKQkhPTUUpIHsKLQkJCXZhbGlkYXRlRWpiSG9tZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQl2YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEFDQ0VTU09SKSA9PSBBQ0NFU1NPUikgewotCQkJLy8gVGhpcyBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBpbiB0aGUgdmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KSBtZXRob2QKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQl2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4gTGV0IHRoZSB2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3ROb3RFeGlzdAotCQkJLy8gdGFrZSBjYXJlIG9mIGl0LgotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCSE9NRSkgPT0gRUpCSE9NRSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiSG9tZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQUNDRVNTT1IpID09IEFDQ0VTU09SKSB7Ci0JCQkvLyBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGluIHRoZSB2YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopIG1ldGhvZAotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0J1c2luZXNzTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiAKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBLZXlDbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QS2V5Q2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWU1YmQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBLZXlDbGFzc1ZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENNUEtleUNsYXNzVlJ1bGUgZXh0ZW5kcyBBS2V5Q2xhc3NWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJUmVtb3RlVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5rYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117SEFTSENPREVfTk9QQVJNLCBFUVVBTFMsIENPTlNUUlVDVE9SX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgSEFTSENPREVfTk9QQVJNLCBFUVVBTFMsIENPTlNUUlVDVE9SX05PUEFSTSwgQ09OU1RSVUNUT1J9OwotCi0JcHJpdmF0ZSBTZXQgX2tleUZpZWxkcyA9IG51bGw7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2hhc2hDb2RlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfaGFzaENvZGUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9lcXVhbHMsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lcXVhbHMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxOSwgbmV3IFN0cmluZ1tde0NIS0oyMDE5K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNSwgbmV3IFN0cmluZ1tde0NIS0oyMjA1K0JFWFQsIENIS0oyMjA1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjA2LCBuZXcgU3RyaW5nW117Q0hLSjIyMDYrQkVYVCwgQ0hLSjIyMDYrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyOSwgbmV3IFN0cmluZ1tde0NIS0oyODI5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQkvLyBLZXkgbWV0aG9kcyBhcmUgbm90IGNoZWNrZWQgZm9yIFJlbW90ZUV4Y2VwdGlvbiwgYnV0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgVlJ1bGVzLi4uCi0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpcGFyZW50OwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyBkbyBub3QgdmFsaWRhdGUgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkKLQkJfQotCQkKLQkJcmV0dXJuIGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcywgTWV0aG9kKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvLgotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0KLQkJLy8gSVdBRDQyNTEgPSBUaGlzIGNsYXNzIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTAuOC4yIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFjbGF6ei5pc1B1YmxpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMDIyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQkvLyBwcmltYXJ5IGtleSBtdXN0IG1hcCB0byBhdCBsZWFzdCBvbmUgZmllbGQgb24gdGhlIGJlYW4gCi0JCQkvLyBCdXQgaWYgaXQncyBhbiB1bmtub3duIGtleSwgdGhlcmUncyBubyBwb2ludCBjaGVja2luZyBqYXZhLmxhbmcuT2JqZWN0Ci0JCQlMaXN0IHByaW1LZXlGaWVsZHMgPSBjbXAuZ2V0S2V5QXR0cmlidXRlcygpOwotCQkJaWYgKChwcmltS2V5RmllbGRzID09IG51bGwpIHx8IChwcmltS2V5RmllbGRzLnNpemUoKSA9PSAwKSkgewotCQkJCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gY21wLmdldFByaW1hcnlLZXkoKTsgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUocHJpbWFyeUtleSksIGJlY2F1c2UgaXQncyBhbHJlYWR5IGJlZW4gY2FsbGVkIGluIHRoZSB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yIG1ldGhvZAotCQkJCVN0cmluZyBiZWFuTmFtZSA9IChjbXAuZ2V0TmFtZSgpID09IG51bGwpID8gIm51bGwiIDogY21wLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgY21wLCBwcmltYXJ5S2V5LCBuZXcgU3RyaW5nW10geyBwcmltYXJ5S2V5LmdldE5hbWUoKSwgYmVhbk5hbWUgfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU2V0IGdldEtleUZpZWxkcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZihfa2V5RmllbGRzID09IG51bGwpIHsKLQkJCS8vIEtub3cgdGhhdCB0aGUgdHJhdmVyc2FsIG9mIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgaXMgZG9uZSBzZXF1ZW50aWFsbHkuCi0JCQkvLyBpLmUuLCB0aGF0IGEgY2xhc3MgaXMgdmFsaWRhdGVkIGFjY29yZGluZyB0byBvbmUgYmVhbiBhdCBhdCB0aW1lLgotCQkJLy8gVGh1cywgd2UgY2FuIGNhY2hlIHRoZSBrZXkgZmllbGQgaW5mb3JtYXRpb24gdG8gc3BlZWQgdXAgc3Vic2VxdWVudCBjYWxscy4KLQkJCUxpc3QgZmllbGRzID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmllbGRzLml0ZXJhdG9yKCk7Ci0JCQlfa2V5RmllbGRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUNNUEF0dHJpYnV0ZSBhdHRyaWIgPSAoQ01QQXR0cmlidXRlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlfa2V5RmllbGRzLmFkZChhdHRyaWIuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX2tleUZpZWxkczsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElDbGFzc1ZSdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgRW50ZXJwcmlzZUJlYW4sIEphdmFDbGFzcywgRmllbGQpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBmaWVsZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRGaWVsZFR5cGVJZChiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQlpZigoZmllbGRUeXBlICYgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQpID09IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEKSB7Ci0JCQl2YWxpZGF0ZVNlcmlhbFZlcnNpb25VSUQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJV0FENDI1MyA9IFRoaXMgZmllbGQgbXVzdCBiZSBwdWJsaWMuIFJlYWQgc2VjdGlvbiAxMC44LjEgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMoZmllbGQpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjIwNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCQotCQkJU2V0IGtleUZpZWxkcyA9IGdldEtleUZpZWxkcygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuKTsKLQkJCWlmKCFrZXlGaWVsZHMuY29udGFpbnMoZmllbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vIElXQUQ0MjU0ID0gVGhpcyBmaWVsZCBpcyBub3QgYSA8Y21wLWZpZWxkPi4gUmVhZCBzZWN0aW9uIDEwLjguMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIyMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJaWYoX2tleUZpZWxkcyAhPSBudWxsKSB7Ci0JCQlfa2V5RmllbGRzLmNsZWFyKCk7Ci0JCQlfa2V5RmllbGRzID0gbnVsbDsgLy8gaW4gdGhpcyBjYXNlLCBjbGVhcmluZyB0aGUgU2V0IGlzbid0IGVub3VnaC4KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGNhY2UxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBMb2NhbENvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSUNvbXBvbmVudFR5cGUsIElMb2NhbFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jbGMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCU0VMRUNUfTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBFSkJTRUxFQ1R9OyAvLyBNdXN0IGtub3cgRUpCU0VMRUNUIHRvIGNoZWNrIHRoYXQgaXQncyBub3QgZXhwb3NlZCBvbiB0aGlzIGludGVyZmFjZQotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc0LCBuZXcgU3RyaW5nW117Q0hLSjI0NzQrQkVYVCwgQ0hLSjI0NzQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZWpiU2VsZWN0LCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZWpiU2VsZWN0K0JFWFQsIENIS0oyNTAyX2VqYlNlbGVjdCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19idXMrQkVYVCwgQ0hLSjI1MDNfYnVzK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhZWUyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxIb21lVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENNUExvY2FsSG9tZVZSdWxlIGV4dGVuZHMgQUNNUEhvbWVWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElIb21lVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJFWFR9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jbGgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117RklOREJZUFJJTUFSWUtFWSwgRklORH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCU0VMRUNUfTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEUsIEZJTkRCWVBSSU1BUllLRVksIEZJTkQsIEhPTUUsIEVKQlNFTEVDVH07IC8vIE11c3Qga25vdyBFSkJTRUxFQ1QgdG8gY2hlY2sgdGhhdCBpdCdzIG5vdCBleHBvc2VkIG9uIHRoaXMgaW50ZXJmYWNlCi0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZEJ5UHJpbWFyeUtleSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXkrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZmluZCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK0JFWFQsIENIS0oyNDAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDMrQkVYVCwgQ0hLSjI0MDMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MitCRVhULCBDSEtKMjQ2MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MywgbmV3IFN0cmluZ1tde0NIS0oyNDYzK0JFWFQsIENIS0oyNDYzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY0LCBuZXcgU3RyaW5nW117Q0hLSjI0NjQrQkVYVCwgQ0hLSjI0NjQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NSwgbmV3IFN0cmluZ1tde0NIS0oyNDc1K0JFWFQsIENIS0oyNDc1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc3LCBuZXcgU3RyaW5nW117Q0hLSjI0NzcrQkVYVCwgQ0hLSjI0NzcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzgsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OCtCRVhULCBDSEtKMjQ3OCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3OSwgbmV3IFN0cmluZ1tde0NIS0oyNDc5K0JFWFQsIENIS0oyNDc5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NStCRVhULCBDSEtKMjQ5NStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfZmluZCtCRVhULCBDSEtKMjUwMF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2VqYlNlbGVjdCwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2VqYlNlbGVjdCtCRVhULCBDSEtKMjUwMl9lamJTZWxlY3QrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZmluZCtCRVhULCBDSEtKMjUwM19maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19ob21lK0JFWFQsIENIS0oyNTAzX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9maW5kLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfZmluZCtCRVhULCBDSEtKMjUwNF9maW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9ob21lK0JFWFQsIENIS0oyNTA0X2hvbWUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRmMDBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBSZW1vdGVDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJQ29tcG9uZW50VHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5jcmMiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTX1NQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RUpCU0VMRUNUfTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBFSkJTRUxFQ1R9OyAvLyBNdXN0IGtub3cgRUpCU0VMRUNUIHRvIGNoZWNrIHRoYXQgaXQncyBub3QgZXhwb3NlZCBvbiB0aGlzIGludGVyZmFjZQotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MywgbmV3IFN0cmluZ1tde0NIS0oyNDczK0JFWFQsIENIS0oyNDczK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc0LCBuZXcgU3RyaW5nW117Q0hLSjI0NzQrQkVYVCwgQ0hLSjI0NzQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9idXNpbmVzcywgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2J1c2luZXNzK0JFWFQsIENIS0oyNTAwX2J1c2luZXNzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9lamJTZWxlY3QrQkVYVCwgQ0hLSjI1MDJfZWpiU2VsZWN0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KTsKLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJCi0JCS8vIDEwLjMuMSwgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVudCBmaWVsZHMgYW5kIGNvbnRhaW5lci1tYW5hZ2VkIHJlbGF0aW9uc2hpcCAKLQkJLy8gZmllbGRzIG11c3QgKm5vdCogYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuIAotCQlMaXN0IGNtckZpZWxkcyA9IGNtcC5nZXRDTVJGaWVsZHMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjbXJGaWVsZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDTVJGaWVsZCBjbXJGaWVsZCA9IChDTVJGaWVsZClpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZigoY21yRmllbGQgIT0gbnVsbCkgJiYgKCFjbXJGaWVsZC5pc0Rlcml2ZWQoKSkpIHsKLQotCQkJCUphdmFIZWxwZXJzIGxvY2FsVHlwZSA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRDTVJGaWVsZFR5cGUodmMsIGNtcCwgY2xhenosIGNtckZpZWxkKTsKLQkJCQlpZihsb2NhbFR5cGUgPT0gbnVsbCkgewotCQkJCQkvLyB1c2VyIG1hZGUgYSBtaXN0YWtlIGluIGVqYi1qYXIueG1sIGJ5IHRyeWluZyB0byBjcmVhdGUgYSByZWxhdGlvbgotCQkJCQkvLyB0byBhIENNUCB3aGljaCBkb2Vzbid0IGhhdmUgYSBsb2NhbCBpbnRlcmZhY2UuCi0JCQkJCS8vIERvbid0IHJlcG9ydCBhbiBlcnJvciBoZXJlOyBsZXQgdGhlIEREIHZhbGlkYXRpb24gcmVwb3J0IHRoZSBlcnJvci4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gQ2Fubm90IGV4cG9zZSBnZXQvc2V0IG1ldGhvZHMgb2YgQ01SIGZpZWxkcyBvbiB0aGUgcmVtb3RlIGhvbWUgb3IgaW50ZXJmYWNlCi0JCQkJTWV0aG9kIHJlbW90ZUdldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgY21yRmllbGQuZ2V0R2V0dGVyTmFtZSgpLCBuZXcgSmF2YUhlbHBlcnNbMF0sIGxvY2FsVHlwZSk7Ci0JCQkJaWYocmVtb3RlR2V0TWV0aG9kICE9IG51bGwpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDczLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBjbGF6eiwgcmVtb3RlR2V0TWV0aG9kLCBuZXcgU3RyaW5nW117Y21yRmllbGQuZ2V0R2V0dGVyTmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCi0JCQkJSmF2YUhlbHBlcnNbXSBzZXRNZXRob2RQYXJtcyA9IG5ldyBKYXZhSGVscGVyc1tde2xvY2FsVHlwZX07Ci0JCQkJTWV0aG9kIHJlbW90ZVNldE1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2RFeHRlbmRlZChjbGF6eiwgY21yRmllbGQuZ2V0U2V0dGVyTmFtZSgpLCBzZXRNZXRob2RQYXJtcyk7Ci0JCQkJaWYocmVtb3RlU2V0TWV0aG9kICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHNldHRlck5hbWUgPSBjbXJGaWVsZC5nZXRTZXR0ZXJOYW1lKCkgKyAiKCIgKyBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0UGFybXNBc1N0cmluZyhzZXRNZXRob2RQYXJtcykgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBjbXAsIGNsYXp6LCByZW1vdGVTZXRNZXRob2QsIG5ldyBTdHJpbmdbXXtzZXR0ZXJOYW1lfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZWMyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBSZW1vdGVIb21lVlJ1bGUgZXh0ZW5kcyBBQ01QSG9tZVZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElIb21lVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCRVhUfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuY3JoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCSE9NRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkRCWVBSSU1BUllLRVksIEZJTkR9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQlNFTEVDVH07Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFLCBGSU5EQllQUklNQVJZS0VZLCBGSU5ELCBIT01FLCBFSkJTRUxFQ1R9OyAvLyBNdXN0IGtub3cgRUpCU0VMRUNUIHRvIGNoZWNrIHRoYXQgaXQncyBub3QgZXhwb3NlZCBvbiB0aGlzIGludGVyZmFjZQotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXksIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9maW5kQnlQcmltYXJ5S2V5K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2ZpbmQrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYyLCBuZXcgU3RyaW5nW117Q0hLSjI0NjIrQkVYVCwgQ0hLSjI0NjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2MytCRVhULCBDSEtKMjQ2MytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NCwgbmV3IFN0cmluZ1tde0NIS0oyNDY0K0JFWFQsIENIS0oyNDY0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NStCRVhULCBDSEtKMjQ3NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NywgbmV3IFN0cmluZ1tde0NIS0oyNDc3K0JFWFQsIENIS0oyNDc3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc4LCBuZXcgU3RyaW5nW117Q0hLSjI0NzgrQkVYVCwgQ0hLSjI0NzgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzksIG5ldyBTdHJpbmdbXXtDSEtKMjQ3OStCRVhULCBDSEtKMjQ3OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk1LCBuZXcgU3RyaW5nW117Q0hLSjI0OTUrQkVYVCwgQ0hLSjI0OTUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2ZpbmQrQkVYVCwgQ0hLSjI1MDBfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9lamJTZWxlY3QsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9lamJTZWxlY3QrQkVYVCwgQ0hLSjI1MDJfZWpiU2VsZWN0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2ZpbmQrQkVYVCwgQ0hLSjI1MDNfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfaG9tZStCRVhULCBDSEtKMjUwM19ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfZmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2ZpbmQrQkVYVCwgQ0hLSjI1MDRfZmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfaG9tZStCRVhULCBDSEtKMjUwNF9ob21lK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DbGFzc1V0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DbGFzc1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0MjIzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ2xhc3NVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc1V0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgbG9uZyBzdXBlcnR5cGVfY291bnRlciA9IDB4MTsgLy8gdXNlZCBieSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuamF2YQotCXByaXZhdGUgbG9uZ1tdIF9jbGFzc1R5cGVJbmRleDsKLQlwcml2YXRlIEFDbGFzc1R5cGVbXSBfY2xhc3NOYW1lczsKLQkKLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIEFDbGFzc1R5cGUgewotCQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLQkJcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0SWQoKTsKLQotCQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0Q2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZ2V0TmFtZShiZWFuKSwgYmVhbik7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBJcyB0aGlzIGNsYXNzIHR5cGUgZXF1YWwgdG8gdGhlIGNsYXp6IHBhcmFtZXRlci4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJSmF2YUhlbHBlcnMgdGhpc0NsYXNzID0gZ2V0Q2xhc3MoYmVhbik7Ci0JCQlpZih0aGlzQ2xhc3MgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGNsYXp6LmVxdWFscyh0aGlzQ2xhc3MpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENsYXNzVXRpbGl0eSBfaW5zdCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBDbGFzc1V0aWxpdHkoKSB7Ci0JCWJ1aWxkVHlwZUxpc3QoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDbGFzc1V0aWxpdHkgZ2V0VXRpbGl0eSgpIHsKLQkJaWYoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgQ2xhc3NVdGlsaXR5KCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjbGF6eiBpcyB0aGUgc2FtZSBhcyB0aGUgY2xhc3MsIGlkZW50aWZpZWQgYnkgdGhlICJ0eXBlIgotCSAqIHBhcmFtZXRlciwgaW4gdGhlIGJlYW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzc1R5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBsb25nIHR5cGUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlBQ2xhc3NUeXBlIGN0ID0gZ2V0Q2xhc3NUeXBlKHR5cGUpOwotCQlpZihjdCA9PSBudWxsKSB7Ci0JCQkvLyBVbmtub3duIHR5cGUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIGN0LmVxdWFscyhiZWFuLCBjbGF6eik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgbG9uZyB0eXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJQUNsYXNzVHlwZSBjdCA9IGdldENsYXNzVHlwZSh0eXBlKTsKLQkJaWYoY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBjdC5nZXROYW1lKGJlYW4pOwotCX0KLQotCXB1YmxpYyBBQ2xhc3NUeXBlIGdldENsYXNzVHlwZShsb25nIHR5cGUpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChfY2xhc3NUeXBlSW5kZXgsIHR5cGUpOwotCQlpZihpbmRleCA+IF9jbGFzc05hbWVzLmxlbmd0aCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmKGluZGV4IDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmKF9jbGFzc05hbWVzW2luZGV4XS5nZXRJZCgpICE9IHR5cGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gX2NsYXNzTmFtZXNbaW5kZXhdOwotCX0KLQotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRTdXBlcnR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgbG9uZyB0eXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJQUNsYXNzVHlwZSBjdCA9IGdldENsYXNzVHlwZSh0eXBlKTsKLQkJaWYoY3QgPT0gbnVsbCkgewotCQkJLy8gTm8gc3VwZXJ0eXBlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIGN0LmdldENsYXNzKGJlYW4pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUeXBlTGlzdCgpIHsKLQkJaW50IHR5cGVDb3VudCA9IDEyOyAvLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgaWRlbnRpZmlhYmxlIGNsYXNzZXMgaW4gSVR5cGVDb25zdGFudHMKLQkJX2NsYXNzVHlwZUluZGV4ID0gbmV3IGxvbmdbdHlwZUNvdW50XTsKLQkJX2NsYXNzTmFtZXMgPSBuZXcgQUNsYXNzVHlwZVt0eXBlQ291bnRdOwotCQlpbnQgY291bnQgPSAwOwotCQkKLQkJLy8gVGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSBsb25nW10gaXMgZXF1YWwgdG8gdGhlCi0JCS8vIGluZGV4IG9mIHRoZSBJTWV0aG9kVHlwZSBpbiB0aGUgSU1ldGhvZFR5cGVbXS4gQnkgdXNpbmcKLQkJLy8gdGhpcyB0ZWNobmlxdWUgaW5zdGVhZCBvZiBhIEhhc2hNYXAsIHdlIGRvbid0IG5lZWQgdG8KLQkJLy8gY3JlYXRlIGFuIEludGVnZXIgZXZlcnkgdGltZSB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgCi0JCS8vIElNZXRob2RUeXBlLgotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuTE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRTsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJSmF2YUhlbHBlcnMgY2xhenogPSBnZXRDbGFzcyhiZWFuKTsKLQkJCQlpZihjbGF6eiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuTE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRTsKLQkJCX0KLQkJCQotCQkJcHVibGljIEphdmFIZWxwZXJzIGdldENsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlpZihiZWFuID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCkpKSB7Ci0JCQkJCUphdmFDbGFzcyByZXN1bHQgPSBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcmVzdWx0KTsKLQkJCQkJfQotCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCQotCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCUphdmFIZWxwZXJzIGNsYXp6ID0gZ2V0Q2xhc3MoYmVhbik7Ci0JCQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLlJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0Q2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCkpKSB7Ci0JCQkJCUphdmFDbGFzcyByZXN1bHQgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQkJCQl0cnkgewotCQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQkKLQkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FTlRJVFlCRUFOOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FTlRJVFlCRUFOOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VOVElUWUJFQU47Ci0JCQl9Ci0JCX07Ci0JCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCTE9DQUxIT01FOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTEhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCTE9DQUxIT01FOwotCQkJfQotCQl9OwotCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1Q7Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUOwotCQkJfQotCQl9OwotCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCSE9NRTsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCSE9NRTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJIT01FOwotCQkJfQotCQl9OwotCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCT0JKRUNUOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJPQkpFQ1Q7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCT0JKRUNUOwotCQkJfQotCQl9OwotCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfTEFOR19PQkpFQ1Q7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUOwotCQkJfQotCQl9OwotCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfTUVTU0FHRURSSVZFTkJFQU47Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOOwotCQkJfQotCQl9OwotCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSOwotCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFTElTVEVORVI7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSOwotCQkJfQotCQl9OwotCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfU0VTU0lPTkJFQU47Ci0JCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05CRUFOOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX1NFU1NJT05CRUFOOwotCQkJfQotCQl9OwotCi0JCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTjsKLQkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTjsKLQkJCX0KLQkJCQotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Db25uZWN0b3JNZXNzYWdlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yTWVzc2FnZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBkNDgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Db25uZWN0b3JNZXNzYWdlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JNZXNzYWdlQ29uc3RhbnRzIGV4dGVuZHMgSjJFRU1lc3NhZ2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfMV8zID0gIjEuMCI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV8xXzQgPSAiMS41IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9NT0RFTF9OQU1FID0gIkNPTk5FQ1RPUl9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXyA9ICJDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSU5WQUxJRF9DT05ORUNUT1JfRklMRSA9ICJFUlJPUl9JTlZBTElEX0NPTk5FQ1RPUl9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0NPTk5FQ1RPUl9WQUxJREFUSU9OX0ZBSUxFRCA9ICJFUlJPUl9DT05ORUNUT1JfVkFMSURBVElPTl9GQUlMRUQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjQ1OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3RvclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvclZhbGlkYXRvciBleHRlbmRzIEoyRUVWYWxpZGF0b3IgaW1wbGVtZW50cyBDb25uZWN0b3JNZXNzYWdlQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgUkFSRmlsZSByYXJGaWxlOwotCXByb3RlY3RlZCBDb25uZWN0b3IgY29ubmVjdG9yREQ7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbm5lY3RvclZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudmFsaWRhdGlvbi5KMkVFVmFsaWRhdG9yI2dldEJhc2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotCQlyZXR1cm4gInJhcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29ubmVjdG9yREQuCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3RvciBnZXRDb25uZWN0b3JERCgpIHsKLQkJcmV0dXJuIGNvbm5lY3RvckREOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb25uZWN0b3JERCBUaGUgY29ubmVjdG9yREQgdG8gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldENvbm5lY3RvckREKENvbm5lY3RvciBjb25uZWN0b3JERCkgewotCQl0aGlzLmNvbm5lY3RvckREID0gY29ubmVjdG9yREQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByYXJGaWxlLgotCSAqLwotCXByb3RlY3RlZCBSQVJGaWxlIGdldFJhckZpbGUoKSB7Ci0JCXJldHVybiByYXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByYXJGaWxlIFRoZSByYXJGaWxlIHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXJGaWxlKFJBUkZpbGUgcmFyRmlsZSkgewotCQl0aGlzLnJhckZpbGUgPSByYXJGaWxlOwotCX0KLQkJCi0JLyoqCi0JICogRG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKGluSGVscGVyLCBpblJlcG9ydGVyKTsKLQkJCi0JCS8vIEZpcnN0IHJlbW92ZSBhbGwgcHJldmlvdXMgbXNnLiBmb3IgdGhpcyBwcm9qZWN0Ci0JCV9yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBudWxsKTsgLy8gTm90ZSB0aGUgV2FySGVscGVyIHdpbGwgcmV0dXJuIHdlYi54bWwgd2l0aCBhIG51bGwgb2JqZWN0IGFzIHdlbGwKLQkKLQkJdHJ5IHsKLQkJCXNldFJhckZpbGUoKFJBUkZpbGUpIGluSGVscGVyLmxvYWRNb2RlbChDT05ORUNUT1JfTU9ERUxfTkFNRSkpOwotCQkJaWYgKHJhckZpbGUgIT0gbnVsbCkgewotCQkJCXNldENvbm5lY3RvckREKCByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgKTsKLQkJCQkvL3ZhbGlkYXRlSjJFRTE0RG9jVHlwZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEUpOwotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCX0KLQkKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX0NPTk5FQ1RPUl9WQUxJREFUSU9OX0ZBSUxFRCk7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0JCX0JCQotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUoyRUUxNERvY1R5cGUoKSB7Ci0JCi0JCWlmICggZ2V0Q29ubmVjdG9yREQoKS5nZXRWZXJzaW9uSUQoKSA8IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQlwYXJhbXNbMF0gPSBET0NUWVBFXzFfNDsKLQkJCS8vcGFyYW1zWzFdID0gaGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfMzsKLQkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIENPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXywgcGFyYW1zKTsKLQkJfSBlbHNlIGlmIChnZXRDb25uZWN0b3JERCgpLmdldFZlcnNpb25JRCgpICE9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQlwYXJhbXNbMF0gPSBET0NUWVBFXzFfMzsKLQkJCS8vcGFyYW1zWzFdID0gaGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfNDsKLQkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIENPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXywgcGFyYW1zKTsKLQkJfS8vIGlmCi0JfS8vIHZhbGlkYXRlRG9jVHlwZVZzTmF0dXJlCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRHVwbGljYXRlc1RhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRHVwbGljYXRlc1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDk4ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0R1cGxpY2F0ZXNUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEluIHNvbWUgcGxhY2VzIGluIHRoZSBjb2RlLCBpdCBpcyBuZWNlc3NhcnkgdG8gZmluZCBvdXQgaWYgdGhlcmUKLSAqIGFyZSBkdXBsaWNhdGVzIGluIGEgbGlzdCwgYW5kIGlmIHRoZXJlIGFyZSwgdG8gcmVnaXN0ZXIgYSB2YWxpZGF0aW9uCi0gKiBtZXNzYWdlIGFnYWluc3QgdGhlIGR1cGxpY2F0ZXMuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtYWtlIGZpbmRpbmcKLSAqIHRoZSBkdXBsaWNhdGVzIGVhc2llci4KLSAqLwotcHVibGljIGNsYXNzIER1cGxpY2F0ZXNUYWJsZSBleHRlbmRzIGphdmEudXRpbC5IYXNoTWFwIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gVU5JUVVFID0gQm9vbGVhbi5GQUxTRTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gRFVQTElDQVRFID0gQm9vbGVhbi5UUlVFOwotCXByb3RlY3RlZCBNYXAgX2R1cGxpY2F0ZXMgPSBudWxsOwotCi0JLyoqCi0JICogQWRkIGFuIG9iamVjdCB0byB0aGlzIHRhYmxlOyBpZiB0aGUgb2JqZWN0IGlzIGEgZHVwbGljYXRlLCBpdCB3aWxsIGJlCi0JICogbWFya2VkIHRvIGEgZHVwbGljYXRlIGluc3RlYWQgb2YgYmVpbmcgYWRkZWQgdHdpY2UgdG8gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotCQkvLyBCdWlsZCB1cCBoYXNodGFibGUgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBlbGVtZW50cy4KLQkJT2JqZWN0IGtleSA9IGdldChvKTsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQlwdXQobywgVU5JUVVFKTsKLQkJfQotCQllbHNlIHsKLQkJCXNhdmVEdXBsaWNhdGUobyk7Ci0JCQlwdXQobywgRFVQTElDQVRFKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEdXBsaWNhdGUoT2JqZWN0IG8pIHsKLQkJLy8gVGhlIGdpdmVuIG9iamVjdCBoYXMgYmVlbiBtYXJrZWQgYSBkdXBsaWNhdGUuCi0JCS8vIEdpdmVuIHRoYXQgdGhlIEhhc2hNYXAgY2FuIHN0b3JlIG9ubHkgb25lIG9iamVjdCB3aXRoIHRoZSBrZXksIAotCQkvLyBkdXBsaWNhdGVzIGFyZSBvdmVyd3JpdHRlbi4gVGhpcyBtZXRob2Qgc3RvcmVzIHRoZSBkdXBsaWNhdGVzCi0JCS8vIGVsc2V3aGVyZSBpbiBhIExpc3QuCi0JCWlmIChfZHVwbGljYXRlcyA9PSBudWxsKSB7Ci0JCQlfZHVwbGljYXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlMaXN0IGR1cExpc3QgPSAoTGlzdCkgX2R1cGxpY2F0ZXMuZ2V0KG8pOwotCQlpZiAoZHVwTGlzdCA9PSBudWxsKSB7Ci0JCQlkdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJZHVwTGlzdC5hZGQobyk7Ci0JCV9kdXBsaWNhdGVzLnB1dChvLCBkdXBMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgZHVwbGljYXRlcyBpbiB0aGlzIHRhYmxlLCByZXR1cm4gdHJ1ZTsgZWxzZSwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRHVwbGljYXRlcygpIHsKLQkJcmV0dXJuIGNvbnRhaW5zVmFsdWUoRFVQTElDQVRFKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIHVuaXF1ZSBlbGVtZW50cyBpbiB0aGlzIHRhYmxlLCByZXR1cm4gdHJ1ZTsgZWxzZSwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVW5pcXVlcygpIHsKLQkJcmV0dXJuIGNvbnRhaW5zVmFsdWUoVU5JUVVFKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgaW4gdGhpcyB0YWJsZSwgcmV0dXJuIGEgc2V0IG9mIHRoZSBkdXBsaWNhdGVzLgotCSAqIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IHNldC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREdXBsaWNhdGVzKCkgewotCQlpZiAoIWNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCS8vIEVsc2UsIGdldCB0aGUgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QKLQkJcmV0dXJuIGdldEVsZW1lbnRzKERVUExJQ0FURSk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoaXMgdGFibGUsIHJldHVybiBhIGxpc3Qgb2YgdGhlIGR1cGxpY2F0ZXMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gYW4gZW1wdHkgbGlzdC4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0RWxlbWVudHMoQm9vbGVhbiB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLy8gRWxzZSwgZ2V0IHRoZSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQlTZXQga2V5cyA9IGtleVNldCgpOwotCQlpZiAoa2V5cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0ga2V5cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qga2V5ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gZ2V0KGtleSk7Ci0JCQlpZiAodmFsdWUgPT0gdHlwZSkgewotCQkJCWVsZW1lbnRzLmFkZChrZXkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHR5cGUgPT0gRFVQTElDQVRFKSB7Ci0JCQkvLyBBbHNvIGFkZCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgImR1cGxpY2F0ZXMiIGxpc3QuCi0JCQlpZiAoX2R1cGxpY2F0ZXMgIT0gbnVsbCkgewotCQkJCWl0ZXJhdG9yID0gX2R1cGxpY2F0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUxpc3QgZHVwTGlzdCA9IChMaXN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChkdXBMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSB1bmlxdWUgZWxlbWVudHMgaW4gdGhpcyB0YWJsZSwgcmV0dXJuIGEgc2V0IG9mIHRoZSB1bmlxdWUgZWxlbWVudHMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gYW4gZW1wdHkgc2V0LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFVuaXF1ZXMoKSB7Ci0JCWlmICghY29udGFpbnNVbmlxdWVzKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLy8gRWxzZSwgZ2V0IHRoZSB1bmlxdWUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdAotCQlyZXR1cm4gZ2V0RWxlbWVudHMoVU5JUVVFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc3VwZXIuY2xlYXIoKTsKLQkJaWYoX2R1cGxpY2F0ZXMgIT0gbnVsbCkgewotCQkJX2R1cGxpY2F0ZXMuY2xlYXIoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FQVJNZXNzYWdlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUFSTWVzc2FnZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJlMGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FQVJNZXNzYWdlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLQotLyoqCi0gKiBNZXNzYWdlIGtleSBjb25zdGFudHMgZm9yIFdBUiB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVBUk1lc3NhZ2VDb25zdGFudHMgZXh0ZW5kcyBKMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX1ZBTElEQVRPUl9JRCA9ICJFQVJfVkFMSURBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9NT0RFTF9OQU1FID0gIkVBUl9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9WQUxJREFUSU9OX0ZBSUxFRCA9ICJFUlJPUl9FQVJfVkFMSURBVElPTl9GQUlMRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0lOVkFMSURfRUFSX0ZJTEUgPSAiRVJST1JfRUFSX0lOVkFMSURfRUFSX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUyA9ICJFUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRUFSX05PX01PRFVMRV9VUkkgPSAiTUVTU0FHRV9FQVJfTk9fTU9EVUxFX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0VBUl9NSVNTSU5HX1VSSSA9ICJNRVNTQUdFX0VBUl9NSVNTSU5HX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRERfUEFSU0VfTElORUNPTCA9ICJFQVJfRERfUEFSU0VfTElORUNPTCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRERfUEFSU0VfTElORUNPTCA9ICJNT0RVTEVfRERfUEFSU0VfTElORUNPTF9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0REX1BBUlNFX05PSU5GTyA9ICJNT0RVTEVfRERfUEFSU0VfTk9JTkZPX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRERfUEFSU0VfTElORSA9ICJNT0RVTEVfRERfUEFSU0VfTElORV9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0REX1BBUlNFX0xJTkUgPSAiRUFSX0REX1BBUlNFX0xJTkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0REX0NBTk5PVF9PUEVOX0REID0gIkVBUl9ERF9DQU5OT1RfT1BFTl9ERCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRERfUEFSU0VfTk9JTkZPID0gIkVBUl9ERF9QQVJTRV9OT0lORk8iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9FQVJfRFVQTElDQVRFX1VSSV9FUlJPUl8gPSAiTUVTU0FHRV9FQVJfRFVQTElDQVRFX1VSSV9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9JTlZBTElEX0FMVF9ERF9XQVJOXyA9ICJNRVNTQUdFX0lOVkFMSURfQUxUX0REX1dBUk5fIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRU1QVFlfQUxUX0REX0VSUk9SXyA9ICJNRVNTQUdFX0VNUFRZX0FMVF9ERF9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5SRVNPTFZFRF9FSkJfUkVGX1dBUk5fPSAiVU5SRVNPTFZFRF9FSkJfUkVGX1dBUk5fIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRVJST1JfID0gIkVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0xJTkVfRVhDRUVEU19MRU5HVEhfRVJST1JfID0gIk1BTklGRVNUX0xJTkVfRVhDRUVEU19MRU5HVEhfRVJST1JfIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0xJTkVfRU5EX0VSUk9SXyA9ICJNQU5JRkVTVF9MSU5FX0VORF9FUlJPUl8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9FQVJfRFVQSUNBVEVfUk9PVENPTlRFWFRfRVJST1JfID0gIk1FU1NBR0VfRUFSX0RVUElDQVRFX1JPT1RDT05URVhUX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfQ09OVEFJTlNfU1BBQ0VTX0VSUk9SXyA9ICJVUklfQ09OVEFJTlNfU1BBQ0VTX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0lOQ09NUEFUSUJMRV9TUEVDX1dBUk5JTkdfID0gIk1FU1NBR0VfSU5DT01QQVRJQkxFX1NQRUNfV0FSTklOR18iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0JFQU5fRUpCX0xJTktfSU5URUZBQ0VfTUlTTUFUQ0hfRVJST1JfID0gIkVKQl9CRUFOX0VKQl9MSU5LX0lOVEVGQUNFX01JU01BVENIX0VSUk9SXyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfVkFMSURBVElPTl9JTlRFUk5BTF9FUlJPUl9VSV8gPSJFQVJfVkFMSURBVElPTl9JTlRFUk5BTF9FUlJPUl9VSV8iOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCRXh0MjBWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkV4dDIwVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzZjVmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCRXh0MjBWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBWYWxpZGF0ZSB0aGUgV2ViU3BoZXJlLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIG5vbi1zcGVjIGZlYXR1cmVzLCBzdWNoCi0gKiBhcyBjb21wb25lbnQgaW5oZXJpdGFuY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJFeHQyMFZSdWxlIGV4dGVuZHMgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9NRVNTQUdFX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJKQVJ9OwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNiwgbmV3IFN0cmluZ1tde0NIS0oyMTA2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ5LCBuZXcgU3RyaW5nW117Q0hLSjI4NDkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjg1Mn0pOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRUpCRVhUOwotCX0KLQkKLQlwdWJsaWMgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGJlYW4gY29tcG9uZW50cyAoaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsIGJlYW4gY2xhc3MsIGFuZCBwcmltYXJ5Ci0JICoga2V5KSBjYW4gYWxsIGJlIGZvdW5kIGFuZCByZWZsZWN0ZWQsIHJldHVybiB0cnVlLiBMZXQgdGhlIEREVmFsaWRhdG9yCi0JICogcmVwb3J0IHRoZSBlcnJvciBtZXNzYWdlIGFnYWluc3QgdGhlIGJlYW4gaWYgb25lIG9mIHRoZXNlIHR5cGVzIGRvZXNuJ3QgcmVmbGVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhcmVCZWFuQ29tcG9uZW50c1JlZmxlY3RlZChFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhlIGJlYW4gaXMgbnVsbCwgYmVjYXVzZSB0aGlzIG1ldGhvZCB3aWxsCi0JCS8vIG5vdCBiZSBjYWxsZWQgaWYgaXQgaXMuCi0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihiZWFuIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbikgewotCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgcmVzdAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9ICgoRW50aXR5KSBiZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQl0cnkgewotCQkJCWlmKCgoRW50aXR5KWJlYW4pLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlfUHJpbWFyeUtleSgpKSkgewotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcHJpbWFyeUtleSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQjIwVmFsaWRhdG9yIC0gdmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGV4dChnZXRDbGFzcygpLmdldE5hbWUoKSArICI6OnZhbGlkYXRlKCIgKyB0YXJnZXRQYXJlbnQgKyAiLCAiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCX0KLQkJCi0JCUVKQkphciBlamJKYXIgPSBudWxsOwotCQlpZih0YXJnZXRQYXJlbnQgPT0gbnVsbCkgewotCQkJZWpiSmFyID0gKEVKQkphcil0YXJnZXQ7Ci0JCQl2YWxpZGF0ZSh2YywgZWpiSmFyKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHJ1bm5pbmcgYXMgYSBkZXBlbmRlbnQKLQkJCWVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbil0YXJnZXRQYXJlbnQ7Ci0JCQl2YWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVudGVycHJpc2VCZWFucy5pdGVyYXRvcigpOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQliZWFuID0gKEVudGVycHJpc2VCZWFuKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJCS8vIElmIGJlYW4gaXNuJ3QgdmFsaWQsIGRvbid0IHBlcmZvcm0gYW55IG9mIHRoZSBvdGhlcgotCQkJCS8vIHZhbGlkYXRpb24gY2hlY2tzIG9uIGl0LiBMZXQgRERWYWxpZGF0b3Igb3V0cHV0IHRoZSBlcnJvciBtZXNzYWdlLgotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBDaGVjayBpZiB0aGUgY2xhc3MgZXhpc3RzLCBldGMuCi0JCQlpZighYXJlQmVhbkNvbXBvbmVudHNSZWZsZWN0ZWQoYmVhbikpIHsKLQkJCQkvLyBTb21ldGhpbmcgZGlkbid0IHJlZmxlY3QgcHJvcGVybHksIHNvIGRvbid0IGNvbnRpbnVlIHdpdGggdGhlCi0JCQkJLy8gcmVzdCBvZiB0aGUgY2hlY2tzLiBTb21lIG1ldGFkYXRhIHdpbGwgYmUgbm9uc2Vuc2UuCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBDb21wb25lbnQgaW5oZXJpdGFuY2UgaXMgbm93IGNoZWNrZWQgaW4gZWFjaCBWUnVsZSBpbnN0ZWFkIG9mIGhlcmUuCi0JCQkvLyBUaGlzIHdhcyBuZWNlc3NhcnkgZm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb247IGlmIG9uZSBjbGFzcyBjaGFuZ2VkCi0JCQkvLyBpbiB0aGUgYmVhbiwgYW5kIHRoZSBiZWFuIHdhcyBhIG1lbWJlciBvZiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZW4KLQkJCS8vIG1lc3NhZ2VzIHdlcmUgYWRkZWQgbXVsdGlwbGUgdGltZXMgb250byB0aGUgY2xhc3NlcyB3aGljaCBoYWQgbm90IGNoYW5nZWQuCi0JCQkvLyBJbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZSBtZXNzYWdlcywgb25seSB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlIG9mCi0JCQkvLyB0aGUgY2xhc3Mgd2hpY2ggY2hhbmdlZCBzaG91bGQgYmUgcmV2YWxpZGF0ZWQgd2hlbiB0aGUgY2xhc3MgY2hhbmdlcy4KLQkJCXZhbGlkYXRlQXBwZW5kaXhCKHZjLCBlamJKYXIsIGJlYW4pOyAvLyB2YWxpZGF0ZSB0aGUga2V5IGNsYXNzIHNpbmNlIHRoYXQgbWVzc2FnZSBpcyByZWdpc3RlcmVkIGFnYWluc3QgZWpiLWphci54bWwKLQkJfQotCQljYXRjaChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQkJLyogdW5yZWFjaGFibGUgY2F0Y2ggYmxvY2sKLQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIElmIHRoZXJlJ3MgYSBwcm9ibGVtLCBwcm9jZWVkIHdpdGggdGhlIG5leHQgYmVhbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvckNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtBcmNoaXZlQ29uc3RhbnRzLkVKQkpBUl9FWFRFTlNJT05TX1NIT1JUX05BTUUsIGJlYW5OYW1lfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZXhjKTsKLQkJCX0KLQkJfQotCQkqLwotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4uCi0JCQlTdHJpbmcgc3VwZXJUeXBlTmFtZSA9IGdldEVKQkluaGVyaXRhbmNlRmlsZU5hbWUoKTsKLQkJCWlmKHN1cGVyVHlwZU5hbWUgPT0gbnVsbCkKLQkJCSAgc3VwZXJUeXBlTmFtZSA9ICJ1bmtub3duIHN1cGVyIHR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tde3N1cGVyVHlwZU5hbWUsIGJlYW4uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXBwZW5kaXhCKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBUaGUgSmF2YSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGUgRUpCIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4KLQkJLy8gZS5nLiBpZiBFSkIgQiBpcyBhIGNoaWxkIG9mIEVKQiBBLCB0aGVuIGNsYXNzIEIgbXVzdCBiZSBhIGNoaWxkIG9mIGNsYXNzIEEuCi0JCS8vIEIgY291bGQgYmUgYSBncmFuZGNoaWxkIChvciBncmVhdC1ncmFuZGNoaWxkIG9yIC4uLikgb2YgQS4KLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYoIWJlYW4uaXNFbnRpdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUphdmFDbGFzcyB0aGlzS2V5ID0gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQlFbnRlcnByaXNlQmVhbiBzdXBlcnR5cGUgPSBnZXRTdXBlclR5cGUoYmVhbik7Ci0JCUphdmFDbGFzcyBwYXJlbnRLZXkgPSBudWxsOwotCQlpZiAoc3VwZXJ0eXBlICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIHRoaXMgQ01QJ3Mgc3VwZXJ0eXBlCi0JCQkvLyBLZXkgYSBYY2hpbGQgb2YgcGFyZW50IEtleQotCQkJLy8gSW4gV1NBIEVKQiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSByb290IEVKQiBtdXN0IGRlZmluZSB0aGUga2V5LgotCQkJLy8gVGhlIGtleSBpcyB0aGUgc2FtZSBmb3IgYWxsIGNoaWxkIEVKQnMuCi0JCQlpZiAoc3VwZXJ0eXBlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcGFyZW50S2V5ID0gKChFbnRpdHkpIHN1cGVydHlwZSkuZ2V0UHJpbWFyeUtleSgpOwotCi0JCQkJaWYgKCh0aGlzS2V5ID09IG51bGwpIHx8IChwYXJlbnRLZXkgPT0gbnVsbCkgfHwgIXRoaXNLZXkuZXF1YWxzKHBhcmVudEtleSkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IG5ldyBTdHJpbmdbXSB7IGJlYW4uZ2V0TmFtZSgpLCBwYXJlbnRLZXkuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjEwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIHN1cGVydHlwZSwgcGFyZW50S2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMTFWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjExVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzODUyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMTFWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgZWpiLWphci54bWwgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogMTUuMi41LjMgRGVjbGFyYXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMgcmVmZXJlbmNlZCBmcm9tIHRoZSBiZWFuJ3MgY29kZQotICogVGhlIEJlYW4gUHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlY2xhcmluZyBpbiB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudHMgb2YgdGhlIGRlcGxveS1tZW50Ci0gKiBkZXNjcmlwdG9yIGFsbCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lcyB1c2VkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4gRGVjbGFyaW5nIHRoZSBzZWN1cml0eSByb2xlcwotICogcmVmZXJlbmNlcyBpbiB0aGUgY29kZSBhbGxvd3MgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBvciBEZXBsb3llciB0byBsaW5rIHRoZSBuYW1lcyBvZiB0aGUgc2VjdXJpdHkKLSAqIHJvbGVzIHVzZWQgaW4gdGhlIGNvZGUgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgZm9yIGFuIGFzc2VtYmxlZCBhcHBsaWNhdGlvbiB0aHJvdWdoIHRoZSBzZWN1LXJpdHktCi0gKiByb2xlIGVsZW1lbnRzLgotICogVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBkZWNsYXJlIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VkIGluIHRoZSBjb2RlIHVzaW5nIHRoZSBzZWN1LXJpdHktCi0gKiByb2xlLXJlZiBlbGVtZW50IGFzIGZvbGxvd3M6Ci0gKiAgICAgIERlY2xhcmUgdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIHJvbGUtbmFtZSBlbGVtZW50LiBUaGUgbmFtZSBtdXN0IGJlIHRoZQotICogc2VjdXJpdHkgcm9sZSBuYW1lIHRoYXQgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGUtTmFtZSkKLSAqIG1ldGhvZC4KLSAqICAgICAgT3B0aW9uYWw6IFByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSBpbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KLSAqIEEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UsIGluY2x1ZGluZyB0aGUgbmFtZSBkZWZpbmVkIGJ5IHRoZSByb2xlLW5hbWUgZWxlbWVudCwgaXMgc2NvcGVkIHRvIHRoZSBzZXMtc2lvbgotICogb3IgZW50aXR5IGJlYW4gZWxlbWVudCB3aG9zZSBkZWNsYXJhdGlvbiBjb250YWlucyB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KLSAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcyBhcmUgZGVjbGFyZWQgaW4KLSAqIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gKiAgICAuLi4KLSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICogICAgICAgLi4uCi0gKiAgICAgICA8ZW50aXR5PgotICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgICAgICBUaGlzIHNlY3VyaXR5IHJvbGUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZQotICogICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50IHdobyBhcmUKLSAqICAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIHVwZGF0ZSBlbXBsb3llZXMnIHNhbGFyaWVzLgotICogICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgPC9lbnRpdHk+Ci0gKiAgICAgICAuLi4KLSAqICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgIC4uLgotICoKLSAqIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWJvdmUgaW5kaWNhdGVzIHRoYXQgdGhlIGVudGVycHJpc2UgYmVhbiBBYXJkdmFya1BheXJvbGwgbWFrZXMgdGhlCi0gKiBzZWN1cml0eSBjaGVjayB1c2luZyBpc0NhbGxlckluUm9sZSgicGF5cm9sbCIpIGluIGl0cyBidXNpbmVzcyBtZXRob2QuCi0gKgotICoKLSAqIDE1LjMuMyBMaW5raW5nIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcwotICogSWYgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkZWZpbmVzIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGhlCi0gKiBvciBzaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbGlua2luZyBhbGwgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyBkZWNsYXJlZCBpbiB0aGUgc2VjdS1yaXR5LQotICogcm9sZS1yZWYgZWxlbWVudHMgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0gKiBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGxpbmtzIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgdG8gYSBzZWN1cml0eSByb2xlIHVzaW5nIHRoZSByb2xlLWxpbmsKLSAqIGVsZW1lbnQuIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4KLSAqIGEgc2VjdXJpdHktcm9sZSBlbGVtZW50LgotICogQSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHVzZWQgZXZlbiBpZiB0aGUgdmFsdWUgb2Ygcm9sZS1uYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUKLSAqIHJvbGUtbGluayByZWZlcmVuY2UuCi0gKiBUaGUgZm9sbG93aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBleGFtcGxlIHNob3dzIGhvdyB0byBsaW5rIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBuYW1lZAotICogcGF5cm9sbCB0byB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lZCBwYXlyb2xsLWRlcGFydG1lbnQuCi0gKiAgICAuLi4KLSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICogICAgICAgLi4uCi0gKiAgICAgICA8ZW50aXR5PgotICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAqICAgICAgICAgICAgICAgIFRoaXMgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICBlbXBsb3llZXMgb2YgdGhlIHBheXJvbGwgZGVwYXJ0bWVudC4KLSAqICAgICAgICAgICAgICAgIE1lbWJlcnMgb2YgdGhpcyByb2xlIGhhdmUgYWNjZXNzIHRvCi0gKiAgICAgICAgICAgICAgICBhbnlvbmUncyBwYXlyb2xsIHJlY29yZC4KLSAqCi0gKiAgICAgICAgICAgICAgICBUaGUgcm9sZSBoYXMgYmVlbiBsaW5rZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICBwYXlyb2xsLWRlcGFydG1lbnQgcm9sZS4KLSAqICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICA8cm9sZS1uYW1lPnBheXJvbGw8L3JvbGUtbmFtZT4KLSAqICAgICAgICAgICAgIDxyb2xlLWxpbms+cGF5cm9sbC1kZXBhcnRtZW50PC9yb2xlLWxpbms+Ci0gKiAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICA8L2VudGl0eT4KLSAqICAgICAgIC4uLgotICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICogICAgLi4uCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJKYXIxMVZSdWxlIGV4dGVuZHMgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBEdXBsaWNhdGVzVGFibGUgX2VqYk5hbWUgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfRUpCSkFSOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VKQkVYVH07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxNCwgbmV3IFN0cmluZ1tde0NIS0oyODE0ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNSwgbmV3IFN0cmluZ1tde0NIS0oyODI1ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjYsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNiArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MiArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQzLCBuZXcgU3RyaW5nW117Q0hLSjI4NDMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NCwgbmV3IFN0cmluZ1tde0NIS0oyODQ0ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDUsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ2LCBuZXcgU3RyaW5nW117Q0hLSjI4NDYgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NywgbmV3IFN0cmluZ1tde0NIS0oyODQ3ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1MCwgbmV3IFN0cmluZ1tde0NIS0oyODUwICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjg1Mn0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg3NSwgbmV3IFN0cmluZ1tde0NIS0oyODc1ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg5NSwgbmV3IFN0cmluZ1tde0NIS0oyODk1ICsgU1BFQ30pOwotCX0KLQkKLQlwdWJsaWMgRUpCSmFyMTFWUnVsZSgpIHsKLQkJX2VqYk5hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogMTUuMy4xIFNlY3VyaXR5IHJvbGVzCi0JICogVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW4gZGVmaW5lIG9uZSBvciBtb3JlIHNlY3VyaXR5IHJvbGVzIGluIAotCSAqIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgdGhlbiBhc3NpZ25zIAotCSAqIGdyb3VwcyBvZiBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zJyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcwotCSAqIHRvIHRoZSBzZWN1cml0eSByb2xlcyB0byBkZWZpbmUgdGhlIHNlY3VyaXR5IHZpZXcgb2YgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEJlY2F1c2UgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkb2VzIG5vdCwgaW4gZ2VuZXJhbCwga25vdyB0aGUgCi0JICogc2VjdXJpdHkgZW52aXJvbm1lbnQgb2YgdGhlIG9wZXJhdGlvbmFsIGVudmlyb25tZW50LCB0aGUgc2VjdXJpdHkgCi0JICogcm9sZXMgYXJlIG1lYW50IHRvIGJlIGxvZ2ljYWwgcm9sZXMgKG9yIGFjdG9ycyksIGVhY2ggcmVwcmVzZW50aW5nIAotCSAqIGEgdHlwZSBvZiB1c2VyIHRoYXQgc2hvdWxkIGhhdmUgdGhlIHNhbWUgYWNjZXNzIHJpZ2h0cyB0byB0aGUgCi0JICogYXBwbGljYXRpb24uIFRoZSBEZXBsb3llciB0aGVuIGFzc2lnbnMgdXNlciBncm91cHMgYW5kL29yIHVzZXIgCi0JICogYWNjb3VudHMgZGVmaW5lZCBpbiB0aGUgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIAotCSAqIGRlZmluZWQgYnkgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlci4KLQkgKiAgICBEZWZpbmluZyB0aGUgc2VjdXJpdHkgcm9sZXMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBbMTddCi0JICogZm9yIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIuICBUaGVpciBvbWlzc2lvbiBpbiB0aGUgZGVwbG95bWVudCAKLQkgKiBkZXNjcmlwdG9yIG1lYW5zIHRoYXQgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjaG9zZSBub3QgdG8gcGFzcyBhbnkgCi0JICogc2VjdXJpdHkgZGVwbG95bWVudCByZWxhdGVkIGluc3RydWN0aW9ucyB0byB0aGUgRGVwbG95ZXIgaW4gdGhlIAotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBpcyByZXNwb25zaWJsZSBmb3IgCi0JICogdGhlIGZvbGxvd2luZzoKLQkgKiAgICAtIERlZmluZSBlYWNoIHNlY3VyaXR5IHJvbGUgdXNpbmcgYSBzZWN1cml0eS1yb2xlIGVsZW1lbnQuCi0JICogICAgLSBVc2UgdGhlIHJvbGUtbmFtZSBlbGVtZW50IHRvIGRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VjdXJpdHkgcm9sZS4KLQkgKiAgICAtIE9wdGlvbmFsbHksIHVzZSB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCB0byBwcm92aWRlIGEgZGVzY3JpcHRpb24gb2YgCi0JICogICAgICBhIHNlY3VyaXR5IHJvbGUuCi0JICogVGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgYnkgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgYXJlIHNjb3BlZCB0byAKLQkgKiB0aGUgZWpiLWphciBmaWxlIGxldmVsLCBhbmQgYXBwbHkgdG8gYWxsIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSAKLQkgKiBlamItamFyIGZpbGUuCi0JICogWzE3XSBJZiB0aGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIGRvZXMgbm90IGRlZmluZSBzZWN1cml0eSByb2xlcyBpbiB0aGUgCi0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLCB0aGUgRGVwbG95ZXIgd2lsbCBoYXZlIHRvIGRlZmluZSBzZWN1cml0eQotCSAqIHJvbGVzIGF0IGRlcGxveW1lbnQgdGltZS4KLQkgKi4uLgotCSovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCS8vIFZhbGlkYXRlIHRoZSBzZWN1cml0eSByb2xlcywgaWYgdGhleSdyZSBkZWZpbmVkIGluIHRoZSBhc3NlbWJseS1kZXNjcmlwdG9yLgotCQlpZiAoZWpiSmFyID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gdmFsaWRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qKgotCQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcm9sZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkJICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgU2VjdXJpdHlSb2xlIGluc3RhbmNlLgotCQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkJICoKLQkJICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgU2VjdXJpdHlSb2wgaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JCSAqLwotCQljbGFzcyBSb2xlV3JhcHBlciB7Ci0JCQlwcml2YXRlIFNlY3VyaXR5Um9sZSBfcm9sZSA9IG51bGw7Ci0KLQkJCXB1YmxpYyBSb2xlV3JhcHBlcihTZWN1cml0eVJvbGUgcm9sZSkgewotCQkJCV9yb2xlID0gcm9sZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlV3JhcHBlcikgewotCQkJCQlSb2xlV3JhcHBlciBvdGhlciA9IChSb2xlV3JhcHBlcikgbzsKLQkJCQkJcmV0dXJuIF9yb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKG90aGVyLmdldFJvbGUoKS5nZXRSb2xlTmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU2VjdXJpdHlSb2xlIGdldFJvbGUoKSB7Ci0JCQkJcmV0dXJuIF9yb2xlOwotCQkJfQotCQl9Ci0KLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJaWYgKGFzc2VtYmx5RGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHZhbGlkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHJvbGVzID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJaWYgKHJvbGVzICE9IG51bGwpIHsKLQkJCUR1cGxpY2F0ZXNUYWJsZSByb2xlTmFtZXMgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCQlTZWN1cml0eVJvbGUgcm9sZSA9IG51bGw7Ci0JCQlJdGVyYXRvciByb2xlSXQgPSByb2xlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHJvbGVJdC5oYXNOZXh0KCkpIHsKLQkJCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkJCS8vIENoZWNrIHRoYXQgdGhlIHJvbGUtbmFtZSBlbGVtZW50IGhhcyBiZWVuIHNldAotCQkJCXJvbGUgPSAoU2VjdXJpdHlSb2xlKSByb2xlSXQubmV4dCgpOwotCQkJCWlmIChyb2xlID09IG51bGwpIHsKLQkJCQkJLy8gcm9sZS1uYW1lIG5vdCBzZXQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVqYkphciwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCghcm9sZS5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCkpKSB8fCAocm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gcm9sZS1uYW1lIG5vdCBzZXQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJvbGUsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQnVpbGQgdXAgaGFzaHRhYmxlIHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgcm9sZS1uYW1lcy4KLQkJCQkJcm9sZU5hbWVzLmFkZChuZXcgUm9sZVdyYXBwZXIocm9sZSkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIHJvbGUtbmFtZXMuICgxNS4zLjEpCi0JCQlpZiAocm9sZU5hbWVzLmNvbnRhaW5zRHVwbGljYXRlcygpKSB7Ci0JCQkJTGlzdCBkdXBsaWNhdGVzID0gcm9sZU5hbWVzLmdldER1cGxpY2F0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGR1cGxpY2F0ZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCAoKFJvbGVXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCkpLmdldFJvbGUoKSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJcm9sZU5hbWVzLmNsZWFyKCk7Ci0JCX0KLQotCQlMaXN0IG1ldGhUcmFucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQkJTWV0aG9kVHJhbnNhY3Rpb24gbXQgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1ldGhUcmFucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCQl0cnkgewotCQkJCW10ID0gKE1ldGhvZFRyYW5zYWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQkJfQotCQkJCW10ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKG10ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlQXNzZW1ibHlEZXNjcmlwdG9yRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIm10IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlib29sZWFuIGhhc1ZhbGlkTWV0aG9kID0gdmFsaWRhdGVNZXRob2RFbGVtZW50cyh2YywgZWpiSmFyLCBtdC5nZXRNZXRob2RFbGVtZW50cygpKTsKLQkJCWlmICghaGFzVmFsaWRNZXRob2QpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IG1ldGhvZFBlcm1pc3Npb25zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JCWl0ZXJhdG9yID0gbWV0aG9kUGVybWlzc2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWV0aG9kUGVybWlzc2lvbiBtcCA9IChNZXRob2RQZXJtaXNzaW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWJvb2xlYW4gaGFzVmFsaWRNZXRob2QgPSB2YWxpZGF0ZU1ldGhvZEVsZW1lbnRzKHZjLCBlamJKYXIsIG1wLmdldE1ldGhvZEVsZW1lbnRzKCkpOwotCQkJaWYgKCFoYXNWYWxpZE1ldGhvZCkgewotCQkJCS8vIDE1LjMuMiwgcC4gMjI5LCBhIDxtZXRob2QtcGVybWlzc2lvbj4gbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtZXRob2QgbGlzdGVkIChhbmQgdGhhdCBtZXRob2QgbXVzdCBiZSBmb3VuZCkKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCS8vIGF0IGxlYXN0IG9uZSBzZWN1cml0eS1yb2xlIG11c3QgYmUgZGVmaW5lZAotCQkJTGlzdCBtcHJvbGVzID0gbXAuZ2V0Um9sZXMoKTsKLQkJCWlmICgobXByb2xlcyA9PSBudWxsKSB8fCAobXByb2xlcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQ1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgbXAsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yIGlzIGNhbGxlZCBpZiB0aGUgRUpCSmFyIGNvdWxkIGxvYWQsIHdoaWNoIG1lYW5zCi0JICogdGhhdCB0aGUgc3ludGF4IG9mIHRoZSBKQVIgaXMgKG1vc3RseSkgY29ycmVjdC4KLQkgKgotCSAqIEVKQiBzcGVjIDEuMSwgc2VjdGlvbiBDLjQsICJBZGRlZCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBCZWFuIFByb3ZpZGVyIHRvIHNwZWNpZnkgd2hldGhlciB0aGUKLQkgKiBlbnRlcnByaXNlIGJlYW4gdXNlcyBhIGJlYW4tbWFuYWdlZCBvciBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbi4iCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKSB0YXJnZXQ7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVudGVycHJpc2VCZWFucy5pdGVyYXRvcigpOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJU3RyaW5nIGJlYW5OYW1lID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJcmVnaXN0ZXIodmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCQlPYmplY3QgaWQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VOVEVSUFJJU0VCRUFOOwotCQkJCUlWYWxpZGF0aW9uUnVsZSB2UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCWlmICh2UnVsZSA9PSBudWxsKSB7Ci0JCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LCBzbyBqdXN0Ci0JCQkJCS8vIG5lZWQgdG8gYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRoZSB0YXNrIGxpc3QuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQl2UnVsZS5wcmVWYWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQkJdlJ1bGUudmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJCXZSdWxlLnBvc3RWYWxpZGF0ZSh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCS8vIENsZWFuIHVwIHRoZSBtZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHRhc2sgbGlzdD8gT3IgaXMgaXQgbmljZXIgdG8gbGVhdmUgdGhlbSBiZWhpbmQ/Ci0JCQkJfQotCQkJCWNhdGNoKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJdGhyb3cgZXhjOwotCQkJCX0KLQkJCQljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMsIGV4Yyk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLnJlbGVhc2UodlJ1bGUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCS8vIElmIHRoZXJlJ3MgYSBwcm9ibGVtLCBwcm9jZWVkIHdpdGggdGhlIG5leHQgYmVhbi4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tdIHsgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgYmVhbk5hbWUgfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gU2luY2UgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IgaXMgbm90IHNwZWNpZmljIHRvIGEgYmVhbiwgdmFsaWRhdGUgaXQgb25jZSwgYWZ0ZXIgYWxsIGJlYW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KLQkJdmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50KHZjLCBlamJKYXIpOwotCQl2YWxpZGF0ZVVuaXF1ZUVqYk5hbWVzKHZjLCBlamJKYXIpOwotCQl2YWxpZGF0ZUNsaWVudEpBUih2YywgZWpiSmFyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9lamJOYW1lLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBUbyBjaGVjayBpZiBldmVyeSBiZWFuIG5hbWUgaXMgdW5pcXVlLCBuZWVkIHRvIGJ1aWxkIGEgbGlzdAotCQlfZWpiTmFtZS5hZGQobmV3IEVqYk5hbWVXcmFwcGVyKGJlYW4pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBUaHJvd2FibGUgZXhjKSB7Ci0JCUlNZXNzYWdlIG1zc2cgPSB2Yy5nZXRNZXNzYWdlKCk7Ci0JCW1zc2cuc2V0SWQoSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDApOwotCQl2Yy5hZGRNZXNzYWdlKG1zc2cpOwotCi0JCWlmKGV4YyAhPSBudWxsKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVW5pcXVlRWpiTmFtZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgbmFtZXMgPSBfZWpiTmFtZS5nZXREdXBsaWNhdGVzKCk7Ci0JCWlmKG5hbWVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFamJOYW1lV3JhcHBlciB3cmFwcGVyID0gKEVqYk5hbWVXcmFwcGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4OTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCB3cmFwcGVyLmdldEJlYW4oKSwgbmV3IFN0cmluZ1tde3dyYXBwZXIuZ2V0QmVhbigpLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ2xpZW50SkFSKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlTdHJpbmcgY2xpZW50SkFSTmFtZSA9IGVqYkphci5nZXRFamJDbGllbnRKYXIoKTsKLQkJaWYoY2xpZW50SkFSTmFtZSA9PSBudWxsKSB7Ci0JCQkvLyBObyBjbGllbnQgSkFSIHNwZWNpZmllZDsgZXZlcnl0aGluZydzIG9rYXkuCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUJvb2xlYW4gZXhpc3RzID0gKEJvb2xlYW4pdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfQ0xJRU5USkFSLCBuZXcgT2JqZWN0W117Y2xpZW50SkFSTmFtZX0pOwotCQlpZihleGlzdHMgPT0gbnVsbCkgewotCQkJLy8gSGVscGVyIGRvZXNuJ3Qgc3VwcG9ydCBsb2FkIG1vZGVsLiBXQVM/Ci0JCQkvLyBDYW4ndCBwZXJmb3JtIHRoaXMgY2hlY2ssIHNvIGp1c3QgcmV0dXJuLgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZighZXhpc3RzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODc1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGVqYkphciwgbmV3IFN0cmluZ1tde2NsaWVudEpBUk5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCb3RoIHNlY3Rpb24gMTEuNC4xIGFuZCAxNS4zLjIgbmVlZCB0aGUgPG1ldGhvZD4gZWxlbWVudC4gQWxzbyByZWZlcgotCSAqIHRvIDE2LjUgZm9yIHN5bnRheC4KLQkgKgotCSAqIFJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgbWV0aG9kcyByZWZlcmVuY2VkIGJ5IHRoaXMgbGlzdCBvZiAKLQkgKiBNZXRob2RFbGVtZW50IGNhbiBiZSBmb3VuZC4KLQkqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlTWV0aG9kRWxlbWVudHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBMaXN0IGVsZW1lbnRzKSB7Ci0JCWlmICgoZWxlbWVudHMgPT0gbnVsbCkgfHwgKGVsZW1lbnRzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNWYWxpZE1ldGhvZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gZWxlbWVudC5nZXRFbnRlcnByaXNlQmVhbigpOwotCQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCS8vIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgbWV0aG9kcyBvbiB0aGUgaG9tZSBvciByZW1vdGUgaW50ZXJmYWNlIGlmIHRoZXJlJwotCQkJCS8vIGJlZW4gYSBwcm9ibGVtIGxvY2F0aW5nIG9yIHJlZmxlY3RpbmcgdGhvc2UgdHlwZXMKLQkJCQlib29sZWFuIHJlZmxlY3RlZCA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlZmxlY3RlZCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gKGUuZ2V0SmF2YUNsYXNzKCkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfSE9NRSA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbGFzc05hbWUgfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQlyZWZsZWN0ZWQgPSBmYWxzZTsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gSUVKQlZhbGlkYXRvckNvbnN0YW50cy5OVUxMX1JFTU9URSA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBjbGFzc05hbWUgfTsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQkKLQkJCQlpZihyZWZsZWN0ZWQpIHsKLQkJCQkJLy8gVGhlICJlbGVtZW50LmdldE1ldGhvZHMoKSIgaGFzIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiB3aGVuIGl0IGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSBtZXRob2RzIGZyb20gdGhlIGhvbWUvcmVtb3RlIGludGVyZmFjZSwKLQkJCQkJLy8gaWYgZWl0aGVyIG9mIHRoZSBpbnRlcmZhY2VzIGRvbid0IGV4aXN0LgotCQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0JCQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBlbGVtZW50LmdldE1ldGhvZHMoKTsgLy8gZ2V0IGFsbCBtZXRob2RzIHdoaWNoIHdpbGwgYmUgcmV0cmlldmVkIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLXBlcm1pc3Npb24KLQkJCQkJYm9vbGVhbiBoYXNNZXRob2RzID0gKChtZXRob2RzICE9IG51bGwpICYmIChtZXRob2RzLmxlbmd0aCA+IDApKTsKLQotCQkJCQlpZiAoIWhhc01ldGhvZHMpIHsKLQkJCQkJCS8vIHdhcm5pbmcKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCBuZXcgU3RyaW5nW10geyBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWhhc1ZhbGlkTWV0aG9kID0gdHJ1ZTsgLy8gYSA8bWV0aG9kLXBlcm1pc3Npb24+IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWV0aG9kICgxNS4zLjIsIHAuMjI5KQotCQkJCQkJaWYgKG5hbWUuZXF1YWxzKCIqIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUxpc3QgcGFyYW1zID0gZWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLQkJCQkJCQlpZiAoKHBhcmFtcyAhPSBudWxsKSAmJiAocGFyYW1zLnNpemUoKSA+IDApKSB7Ci0JCQkJCQkJCS8vIHdhcm5pbmcKLQkJCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVsZW1lbnQsIHRoaXMpOwotCQkJCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVycm9yCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVsZW1lbnQsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaGFzVmFsaWRNZXRob2Q7Ci0JfQotCQotCS8qKgotCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSBFSkIgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2UuCi0JICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JICoKLQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JICovCi0JY2xhc3MgRWpiTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIEVudGVycHJpc2VCZWFuIF9iZWFuID0gbnVsbDsKLQotCQlwdWJsaWMgRWpiTmFtZVdyYXBwZXIoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJX2JlYW4gPSBiZWFuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVqYk5hbWVXcmFwcGVyKSB7Ci0JCQkJRWpiTmFtZVdyYXBwZXIgb3RoZXIgPSAoRWpiTmFtZVdyYXBwZXIpbzsKLQkJCQlpZigoX2JlYW4uZ2V0TmFtZSgpID09IG51bGwpICYmIChvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpID09IG51bGwpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmKF9iZWFuLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gX2JlYW4uZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWlmKChnZXRCZWFuKCkgIT0gbnVsbCkgJiYgKGdldEJlYW4oKS5nZXROYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0QmVhbigpLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0QmVhbigpIHsKLQkJCXJldHVybiBfYmVhbjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJKYXIyMFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMjBWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGUzMjRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJKYXIyMFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEVKQkphcjIwVlJ1bGUgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JcHJpdmF0ZSBEdXBsaWNhdGVzVGFibGUgX2VqYk5hbWUgPSBudWxsOwotCXByaXZhdGUgRHVwbGljYXRlc1RhYmxlIF9hc05hbWUgPSBudWxsOwotCXByaXZhdGUgRHVwbGljYXRlc1RhYmxlIF9yZWxhdGlvbnNoaXBOYW1lID0gbnVsbDsKLQlwcml2YXRlIER1cGxpY2F0ZXNUYWJsZSBfcmVsYXRpb25zaGlwUm9sZU5hbWUgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9NRVNTQUdFX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJFWFR9OwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAwX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAwX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMF9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAyX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDJfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDJfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAyX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDNfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwM19OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwM19VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDNfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA0X05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA0X1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNF9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA1X05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDVfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDVfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA1X1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDYsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNywgbmV3IFN0cmluZ1tde0NIS0oyODA3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA4LCBuZXcgU3RyaW5nW117Q0hLSjI4MDgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDksIG5ldyBTdHJpbmdbXXtDSEtKMjgwOStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMF9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODEwX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODEwX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMF9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODExX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTFfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxNiwgbmV3IFN0cmluZ1tde0NIS0oyODE2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODE3LCBuZXcgU3RyaW5nW117Q0hLSjI4MTcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTgsIG5ldyBTdHJpbmdbXXtDSEtKMjgxOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMCwgbmV3IFN0cmluZ1tde0NIS0oyODIwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIxLCBuZXcgU3RyaW5nW117Q0hLSjI4MjErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMywgbmV3IFN0cmluZ1tde0NIS0oyODIzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI0LCBuZXcgU3RyaW5nW117Q0hLSjI4MjQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjUsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNiwgbmV3IFN0cmluZ1tde0NIS0oyODI2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI3LCBuZXcgU3RyaW5nW117Q0hLSjI4MjcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjgyOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyOSwgbmV3IFN0cmluZ1tde0NIS0oyODI5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMwLCBuZXcgU3RyaW5nW117Q0hLSjI4MzArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMiwgbmV3IFN0cmluZ1tde0NIS0oyODMyK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMzLCBuZXcgU3RyaW5nW117Q0hLSjI4MzMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzQsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNSwgbmV3IFN0cmluZ1tde0NIS0oyODM1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM2LCBuZXcgU3RyaW5nW117Q0hLSjI4MzYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzcsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzOCwgbmV3IFN0cmluZ1tde0NIS0oyODM4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM5LCBuZXcgU3RyaW5nW117Q0hLSjI4MzkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MiwgbmV3IFN0cmluZ1tde0NIS0oyODQyK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQzLCBuZXcgU3RyaW5nW117Q0hLSjI4NDMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDQsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NSwgbmV3IFN0cmluZ1tde0NIS0oyODQ1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ2LCBuZXcgU3RyaW5nW117Q0hLSjI4NDYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDcsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0OCwgbmV3IFN0cmluZ1tde0NIS0oyODQ4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODUwLCBuZXcgU3RyaW5nW117Q0hLSjI4NTArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTQsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NSwgbmV3IFN0cmluZ1tde0NIS0oyODU1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU2LCBuZXcgU3RyaW5nW117Q0hLSjI4NTYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTcsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1OCwgbmV3IFN0cmluZ1tde0NIS0oyODU4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU5LCBuZXcgU3RyaW5nW117Q0hLSjI4NTkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NjAsIG5ldyBTdHJpbmdbXXtDSEtKMjg2MCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2NiwgbmV3IFN0cmluZ1tde0NIS0oyODY2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODY3LCBuZXcgU3RyaW5nW117Q0hLSjI4NjcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NjgsIG5ldyBTdHJpbmdbXXtDSEtKMjg2OCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2OSwgbmV3IFN0cmluZ1tde0NIS0oyODY5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODcxLCBuZXcgU3RyaW5nW117Q0hLSjI4NzErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjg3MitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg3MywgbmV3IFN0cmluZ1tde0NIS0oyODczK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODc0LCBuZXcgU3RyaW5nW117Q0hLSjI4NzQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NzUsIG5ldyBTdHJpbmdbXXtDSEtKMjg3NSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODk1LCBuZXcgU3RyaW5nW117Q0hLSjI4OTUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjg1Mn0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgRUpCSmFyMjBWUnVsZSgpIHsKLQkJX2VqYk5hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCV9hc05hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCV9yZWxhdGlvbnNoaXBOYW1lID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQlfcmVsYXRpb25zaGlwUm9sZU5hbWUgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCS8vIEVKQkphciBkb2Vzbid0IGRlcGVuZCBvbiBhbnl0aGluZyBlbHNlCi0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VKQkpBUjsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKLQkJLy8gU2luY2UgdGhpcyBydWxlIGRvZXNuJ3QgZGVwZW5kIG9uIGFub3RoZXIgcnVsZSwgdGhpcwotCQkvLyBtZXRob2QgKHdoaWNoIGlzIGNhbGxlZCBvbiBhIGRlcGVuZGVudCBydWxlKSB3aWxsIG5ldmVyCi0JCS8vIGJlIGNhbGxlZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9lamJOYW1lLmNsZWFyKCk7Ci0JCV9hc05hbWUuY2xlYXIoKTsKLQkJX3JlbGF0aW9uc2hpcE5hbWUuY2xlYXIoKTsKLQkJX3JlbGF0aW9uc2hpcFJvbGVOYW1lLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBUaHJvd2FibGUgZXhjKSB7Ci0JCUlNZXNzYWdlIG1zc2cgPSB2Yy5nZXRNZXNzYWdlKCk7Ci0JCW1zc2cuc2V0SWQoSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDApOwotCQl2Yy5hZGRNZXNzYWdlKG1zc2cpOwotCi0JCWlmKGV4YyAhPSBudWxsKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdSdWxlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHJ1bGVJZCkgewotCQlsb2codmMsIHJ1bGVJZCArICIgPSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMsIG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2coSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSN2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQkphcjIwVlJ1bGUgLSB2YWxpZGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQllbnRyeS5zZXRUZXh0KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjo6dmFsaWRhdGUoIiArIHRhcmdldFBhcmVudCArICIsICIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJfQotCQkKLQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpIHRhcmdldDsKLQkJTGlzdCBiZWFucyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBiZWFucy5pdGVyYXRvcigpOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQlyZWdpc3Rlcih2YywgZWpiSmFyLCBiZWFuKTsKLQkKLQkJCQlPYmplY3QgaWQgPSBudWxsOwkJCQotCQkJCXN3aXRjaChiZWFuLmdldFZlcnNpb25JRCgpKSB7Ci0JCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDoKLQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOgotCQkJCQkJaWQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VOVEVSUFJJU0VCRUFOOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDoKLQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiAKLQkJCQkJCWlkID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FTlRFUlBSSVNFQkVBTjsKLQkJCQkJCWJyZWFrOyAKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCS8vIFdoYXQgdmVyc2lvbiBpcyBpdCB0aGVuPwotCQkJCQkJaWYoYmVhbiBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIHsKLQkJCQkJCQl2YWxpZGF0ZUNNUFZlcnNpb25FbGVtZW50KHZjLCBlamJKYXIsIChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW4pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gbG9nCi0JCQkJCQkJbG9nKHZjLCAiIWJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgIWJlYW4uaXNWZXJzaW9uMl9YKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJfQkJCQkgCi0JCQkJCi0JCQkJSVZhbGlkYXRpb25SdWxlIHZSdWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCQkJaWYodlJ1bGUgPT0gbnVsbCkgewotCQkJCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJdlJ1bGUucHJlVmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJCXZSdWxlLnZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCQkJCQl2UnVsZS5wb3N0VmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JCQkJfQotCQkJCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCS8vIENsZWFuIHVwIHRoZSBtZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHRhc2sgbGlzdD8gT3IgaXMgaXQgbmljZXIgdG8gbGVhdmUgdGhlbSBiZWhpbmQ/Ci0JCQkJCXRocm93IGV4YzsKLQkJCQl9Ci0JCQkJY2F0Y2goTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UodmMsIGV4Yyk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLnJlbGVhc2UodlJ1bGUpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCWNhdGNoIChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQljYXRjaChWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2goVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQkvLyBzb21ldGhpbmcgZ29lcyB3cm9uZywganVzdCBwcm9jZWVkIHdpdGggdGhlIG5leHQgYmVhbgotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FLCBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gU2luY2UgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IgaXMgbm90IHNwZWNpZmljIHRvIGEgYmVhbiwgdmFsaWRhdGUgaXQgb25jZSwgYWZ0ZXIgYWxsIGJlYW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KLQkJdmFsaWRhdGVBc3NlbWJseURlc2NyaXB0b3JFbGVtZW50KHZjLCBlamJKYXIpOwotCQkvL1RPRE8gVGhlIERhdGFzb3VyY2UgdmFsaWRhdGlvbiB3aWxsIGJlIGRvbmUgYnkgdGhlIGV4dGVuc2lvbnMKLQkJdmFsaWRhdGVVbmlxdWVFamJOYW1lcyh2YywgZWpiSmFyKTsKLQkJdmFsaWRhdGVVbmlxdWVBYnN0cmFjdFNjaGVtYU5hbWVzKHZjLCBlamJKYXIpOwotCQl2YWxpZGF0ZVJlbGF0aW9uc2hpcHModmMsIGVqYkphcik7Ci0JCXZhbGlkYXRlQ2xpZW50SkFSKHZjLCBlamJKYXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gVG8gY2hlY2sgaWYgZXZlcnkgYmVhbiBuYW1lIGlzIHVuaXF1ZSwgbmVlZCB0byBidWlsZCBhIGxpc3QKLQkJX2VqYk5hbWUuYWRkKG5ldyBFamJOYW1lV3JhcHBlcihiZWFuKSk7Ci0JCQotCQlpZigoYmVhbiBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpICYmIGJlYW4uZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJLy8gVG8gY2hlY2sgaWYgZXZlcnkgYmVhbiBuYW1lIGlzIHVuaXF1ZSwgbmVlZCB0byBidWlsZCBhIGxpc3QKLQkJCV9hc05hbWUuYWRkKG5ldyBBU05hbWVXcmFwcGVyKChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW4pKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ01QVmVyc2lvbkVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZihjbXAuZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfVmVyc2lvbigpKSkgewotCQkJU3RyaW5nIHZlcnNpb24gPSBjbXAuZ2V0VmVyc2lvbigpOwotCQkJaWYoISAoQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWC5lcXVhbHModmVyc2lvbikgfHwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzJfWC5lcXVhbHModmVyc2lvbikpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODcyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGNtcCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQkJCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFzc2VtYmx5RGVzY3JpcHRvckVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVmFsaWRhdGUgdGhlIHNlY3VyaXR5IHJvbGVzLCBpZiB0aGV5J3JlIGRlZmluZWQgaW4gdGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IuCi0JCWlmIChlamJKYXIgPT0gbnVsbCkgewotCQkJLy8gbm90aGluZyB0byB2YWxpZGF0ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyoqCi0JCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSByb2xlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotCQkgKiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGR1cGxpY2F0ZSBTZWN1cml0eVJvbGUgaW5zdGFuY2UuCi0JCSAqIChXaXRob3V0IHRoZSBpbnN0YW5jZSwgd2UgY2Fubm90IGdldCBsaW5lIG51bWJlcnMuKQotCQkgKgotCQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBTZWN1cml0eVJvbCBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkJICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkJICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkJICovCi0JCWNsYXNzIFJvbGVXcmFwcGVyIHsKLQkJCXByaXZhdGUgU2VjdXJpdHlSb2xlIF9yb2xlID0gbnVsbDsKLQotCQkJcHVibGljIFJvbGVXcmFwcGVyKFNlY3VyaXR5Um9sZSByb2xlKSB7Ci0JCQkJX3JvbGUgPSByb2xlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVXcmFwcGVyKSB7Ci0JCQkJCVJvbGVXcmFwcGVyIG90aGVyID0gKFJvbGVXcmFwcGVyKSBvOwotCQkJCQlyZXR1cm4gX3JvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0Um9sZSgpLmdldFJvbGVOYW1lKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0Um9sZSgpIHsKLQkJCQlyZXR1cm4gX3JvbGU7Ci0JCQl9Ci0JCX0KLQotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlpZiAoYXNzZW1ibHlEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gdmFsaWRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3Qgcm9sZXMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQlpZiAocm9sZXMgIT0gbnVsbCkgewotCQkJRHVwbGljYXRlc1RhYmxlIHJvbGVOYW1lcyA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQkJCVNlY3VyaXR5Um9sZSByb2xlID0gbnVsbDsKLQkJCUl0ZXJhdG9yIHJvbGVJdCA9IHJvbGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAocm9sZUl0Lmhhc05leHQoKSkgewotCQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgaGFzIGJlZW4gc2V0Ci0JCQkJcm9sZSA9IChTZWN1cml0eVJvbGUpIHJvbGVJdC5uZXh0KCk7Ci0JCQkJaWYgKChyb2xlID09IG51bGwpIHx8ICghcm9sZS5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCkpKSB8fCAocm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gcm9sZS1uYW1lIG5vdCBzZXQKLQkJCQkJaWYocm9sZSA9PSBudWxsKSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcm9sZSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGFzc2VtYmx5RGVzY3JpcHRvciwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBCdWlsZCB1cCBoYXNodGFibGUgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSByb2xlLW5hbWVzLgotCQkJCQlyb2xlTmFtZXMuYWRkKG5ldyBSb2xlV3JhcHBlcihyb2xlKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgcm9sZS1uYW1lcy4gKDE1LjMuMSkKLQkJCWlmIChyb2xlTmFtZXMuY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCQlMaXN0IGR1cGxpY2F0ZXMgPSByb2xlTmFtZXMuZ2V0RHVwbGljYXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsICgoUm9sZVdyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0Um9sZSgpLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyb2xlTmFtZXMuY2xlYXIoKTsKLQkJfQotCi0JCUxpc3QgbWV0aFRyYW5zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9ucygpOwotCQlNZXRob2RUcmFuc2FjdGlvbiBtdCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0aFRyYW5zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJCXRyeSB7Ci0JCQkJbXQgPSAoTWV0aG9kVHJhbnNhY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZXhjKTsKLQkJCQl9Ci0JCQkJbXQgPSBudWxsOwotCQkJfQotCi0JCQlpZiAobXQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCSmFyMjBWUnVsZS52YWxpZGF0ZUFzc2VtYmx5RGVzY3JpcHRvckVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJtdCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYm9vbGVhbiBoYXNWYWxpZE1ldGhvZCA9IHZhbGlkYXRlTWV0aG9kRWxlbWVudHModmMsIGVqYkphciwgbXQuZ2V0TWV0aG9kRWxlbWVudHMoKSk7Ci0JCQlpZiAoIWhhc1ZhbGlkTWV0aG9kKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIG10LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBtZXRob2RQZXJtaXNzaW9ucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RQZXJtaXNzaW9ucygpOwotCQlpdGVyYXRvciA9IG1ldGhvZFBlcm1pc3Npb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1ldGhvZFBlcm1pc3Npb24gbXAgPSAoTWV0aG9kUGVybWlzc2lvbikgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlib29sZWFuIGhhc1ZhbGlkTWV0aG9kID0gdmFsaWRhdGVNZXRob2RFbGVtZW50cyh2YywgZWpiSmFyLCBtcC5nZXRNZXRob2RFbGVtZW50cygpKTsKLQkJCWlmICghaGFzVmFsaWRNZXRob2QpIHsKLQkJCQkvLyAxNS4zLjIsIHAuIDIyOSwgYSA8bWV0aG9kLXBlcm1pc3Npb24+IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWV0aG9kIGxpc3RlZCAoYW5kIHRoYXQgbWV0aG9kIG11c3QgYmUgZm91bmQpCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIG1wLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQkvLyBhdCBsZWFzdCBvbmUgc2VjdXJpdHktcm9sZSBtdXN0IGJlIGRlZmluZWQKLQkJCUxpc3QgbXByb2xlcyA9IG1wLmdldFJvbGVzKCk7Ci0JCQlpZiAoKChtcHJvbGVzID09IG51bGwpIHx8IChtcHJvbGVzLnNpemUoKSA9PSAwKSkgJiYgKCFtcC5pc1NldFVuY2hlY2tlZCgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBtcCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVW5pcXVlQWJzdHJhY3RTY2hlbWFOYW1lcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJTGlzdCBuYW1lcyA9IF9hc05hbWUuZ2V0RHVwbGljYXRlcygpOwotCQlpZihuYW1lcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQVNOYW1lV3JhcHBlciB3cmFwcGVyID0gKEFTTmFtZVdyYXBwZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODU0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIHdyYXBwZXIuZ2V0QmVhbigpLCBuZXcgU3RyaW5nW117d3JhcHBlci5nZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVVbmlxdWVFamJOYW1lcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIpIHsKLQkJTGlzdCBuYW1lcyA9IF9lamJOYW1lLmdldER1cGxpY2F0ZXMoKTsKLQkJaWYobmFtZXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVqYk5hbWVXcmFwcGVyIHdyYXBwZXIgPSAoRWpiTmFtZVdyYXBwZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg5NSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHdyYXBwZXIuZ2V0QmVhbigpLCBuZXcgU3RyaW5nW117d3JhcHBlci5nZXRCZWFuKCkuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWxhdGlvbnNoaXBzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcHMgPSBlamJKYXIuZ2V0UmVsYXRpb25zaGlwTGlzdCgpOwotCQlpZihyZWxhdGlvbnNoaXBzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBlamJSZWxhdGlvbkxpc3QgPSByZWxhdGlvbnNoaXBzLmdldEVqYlJlbGF0aW9ucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVqYlJlbGF0aW9uTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVKQlJlbGF0aW9uIHJlbGF0aW9uID0gKEVKQlJlbGF0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJX3JlbGF0aW9uc2hpcE5hbWUuYWRkKG5ldyBFSkJSZWxhdGlvbk5hbWVXcmFwcGVyKHJlbGF0aW9uKSk7Ci0JCQkKLQkJCWJvb2xlYW4gYXRMZWFzdE9uZUNtckZpZWxkRXhpc3RzID0gZmFsc2U7Ci0JCQlMaXN0IHJvbGVzID0gcmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQkJCUl0ZXJhdG9yIHJvbGVJdGVyYXRvciA9IHJvbGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShyb2xlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlID0gKEVKQlJlbGF0aW9uc2hpcFJvbGUpcm9sZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlfcmVsYXRpb25zaGlwUm9sZU5hbWUuYWRkKG5ldyBFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIocm9sZSkpOwotCi0JCQkJYm9vbGVhbiB2YWxpZE11bHRpcGxpY2l0eSA9IHJvbGUuaXNTZXRNdWx0aXBsaWNpdHkoKTsKLQkJCQlpZighdmFsaWRNdWx0aXBsaWNpdHkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODE4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQotCQkJCS8vIDEwLjMuNC4yIAotCQkJCS8vIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JCQkJLy8gZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaWYgdGhlICpvdGhlciogZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JCQkJLy8gZWxlbWVudCBpbiB0aGUgc2FtZSBlamItcmVsYXRpb24gZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgb3Bwb3NpdGVSb2xlID0gcm9sZS5nZXRPcHBvc2l0ZSgpOwotCQkJCWlmKHJvbGUuaXNTZXRDYXNjYWRlRGVsZXRlKCkpIHsKLQkJCQkJYm9vbGVhbiBpc090aGVyTXVsdGlwbGljaXR5T25lID0gKChvcHBvc2l0ZVJvbGUuaXNTZXRNdWx0aXBsaWNpdHkoKSkgJiYgKG9wcG9zaXRlUm9sZS5nZXRNdWx0aXBsaWNpdHkoKS5nZXRWYWx1ZSgpID09IE11bHRpcGxpY2l0eUtpbmQuT05FKSk7Ci0JCQkJCWlmKCFpc090aGVyTXVsdGlwbGljaXR5T25lKSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NDgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJQ01SRmllbGQgY21yRmllbGQgPSByb2xlLmdldENtckZpZWxkKCk7Ci0JCQkJaWYoY21yRmllbGQgIT0gbnVsbCkgewotCQkJCQlhdExlYXN0T25lQ21yRmllbGRFeGlzdHMgPSB0cnVlOwotCQkJCQlpZihjbXJGaWVsZC5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSkpIHsKLQkJCQkJCVN0cmluZyBjbXJGaWVsZFR5cGUgPSBjbXJGaWVsZC5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKTsKLQkJCQkJCWlmKCghSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLmVxdWFscyhjbXJGaWVsZFR5cGUpKSAmJgotCQkJCQkJCSghSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9TRVQuZXF1YWxzKGNtckZpZWxkVHlwZSkpKSB7Ci0JCQkJCQkJLy8gQ0hLSjI4Njg6IFRoZSB2YWx1ZSBvZiB0aGUgPGNtci1maWVsZC10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIgb3IgImphdmEudXRpbC5TZXQiIChFSkIgMi4wOiAxMC4zLjEzLCAyMi41KS4KLQkJCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NjgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCB0aGlzKTsKLQkJCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVJvbGVTb3VyY2Ugc291cmNlUm9sZVNvdXJjZSA9IHJvbGUuZ2V0U291cmNlKCk7Ci0JCQkJaWYoc291cmNlUm9sZVNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjgyMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIG5ldyBTdHJpbmdbXXtyb2xlLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlFbnRpdHkgc291cmNlRW50aXR5ID0gc291cmNlUm9sZVNvdXJjZS5nZXRFbnRpdHlCZWFuKCk7Ci0JCQkJaWYoc291cmNlRW50aXR5ID09IG51bGwpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODIxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgcm9sZSwgbmV3IFN0cmluZ1tde3JvbGUuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoc291cmNlRW50aXR5LmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCS8vIENIS0oyODY2OiA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSBkZWZpbmVkIG9uIHsxfSAoRUpCIDIuMDogMjIuNSkuCi0JCQkJCWlmKGNtckZpZWxkICE9IG51bGwpIHsKLQkJCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpc291cmNlRW50aXR5OwotCQkJCQkJTGlzdCBjbXJGaWVsZHMgPSBjbXAuZ2V0Q01SRmllbGRzKCk7Ci0JCQkJCQlib29sZWFuIGZvdW5kX2NtckZpZWxkID0gZmFsc2U7Ci0JCQkJCQlpZigoY21yRmllbGRzICE9IG51bGwpICYmIChjbXJGaWVsZHMuc2l6ZSgpID4gMCkpIHsKLQkJCQkJCQlmb3VuZF9jbXJGaWVsZCA9IGNtckZpZWxkcy5jb250YWlucyhjbXJGaWVsZCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmKCFmb3VuZF9jbXJGaWVsZCkgewotCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg2NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIHJvbGUsIG5ldyBTdHJpbmdbXXtjbXJGaWVsZC5nZXROYW1lKCksIHNvdXJjZUVudGl0eS5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBDSEtKMjg3MTogPGVqYi1uYW1lPiB7MH0gbXVzdCByZWZlciB0byBhIENNUCBiZWFuIChFSkIgMi4wOiAxMC4zLjIsIDEwLjMuMTMpLgotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NzEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByb2xlLCBuZXcgU3RyaW5nW117c291cmNlRW50aXR5LmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQkKLQkJCQlSb2xlU291cmNlIG9wcG9zaXRlUm9sZVNvdXJjZSA9IG9wcG9zaXRlUm9sZS5nZXRTb3VyY2UoKTsKLQkJCQlpZihvcHBvc2l0ZVJvbGVTb3VyY2UgPT0gbnVsbCkgewotCQkJCQkvLyBEbyBub3QgZW1pdCBhbiBlcnJvciBtZXNzYWdlIC0gd2hlbiB3ZSBpdGVyYXRlIHRvIHRoZSByb2xlIHdoZXJlCi0JCQkJCS8vIHRoaXMgaXMgdGhlIHNvdXJjZSwgdGhpcyBlcnJvciB3aWxsIGJlIGRldGVjdGVkLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gb3Bwb3NpdGVSb2xlU291cmNlLmdldEVudGl0eUJlYW4oKTsKLQkJCQlpZih0YXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJCQkvLyBEbyBub3QgZW1pdCBhbiBlcnJvciBtZXNzYWdlIC0gd2hlbiB3ZSBpdGVyYXRlIHRvIHRoZSByb2xlIHdoZXJlCi0JCQkJCS8vIHRoaXMgaXMgdGhlIHNvdXJjZSwgdGhpcyBlcnJvciB3aWxsIGJlIGRldGVjdGVkLgotCQkJCX0KLQkJCQllbHNlIGlmKHRhcmdldEVudGl0eS5nZXRMb2NhbEludGVyZmFjZSgpID09IG51bGwpIHsKLQkJCQkJLy8gRG9lcyB0aGUgdGFyZ2V0IG9mIHRoaXMgcm9sZSBoYXZlIGEgbG9jYWwgaW50ZXJmYWNlPwotCQkJCQkvLyBDSEtKMjg2NzogVGhpcyBiZWFuIGNhbiBoYXZlIG9ubHkgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0byBvdGhlciBiZWFucyAoRUpCIDIuMDogMTAuMy4yKS4KLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODY3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgb3Bwb3NpdGVSb2xlLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIFZlcmlmeSB1bmlxdWUgcm9sZSBuYW1lcyB3aXRoaW4gdGhlIDxlamItcmVsYXRpb24+Ci0JCQl2YWxpZGF0ZVVuaXF1ZVJlbGF0aW9uc2hpcFJvbGVOYW1lcyh2YywgZWpiSmFyKTsKLQkJCV9yZWxhdGlvbnNoaXBSb2xlTmFtZS5jbGVhcigpOwotCQkJCi0JCQlpZighYXRMZWFzdE9uZUNtckZpZWxkRXhpc3RzKSB7Ci0JCQkJLy8gQ0hLSjI4NjlJOiBBdCBsZWFzdCBvbmUgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4gbXVzdCBkZWZpbmUgYSA8Y21yLWZpZWxkPiAoRUpCIDIuMDogMTAuMy4yLCAxMC4zLjEzLCAyMi41KS4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NjksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCByZWxhdGlvbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLQkJdmFsaWRhdGVVbmlxdWVSZWxhdGlvbk5hbWVzKHZjLCBlamJKYXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVVuaXF1ZVJlbGF0aW9uTmFtZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyKSB7Ci0JCUxpc3QgbmFtZXMgPSBfcmVsYXRpb25zaGlwTmFtZS5nZXREdXBsaWNhdGVzKCk7Ci0JCWlmKG5hbWVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFSkJSZWxhdGlvbk5hbWVXcmFwcGVyIHdyYXBwZXIgPSAoRUpCUmVsYXRpb25OYW1lV3JhcHBlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MTYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCB3cmFwcGVyLmdldFJlbGF0aW9uKCksIG5ldyBTdHJpbmdbXXt3cmFwcGVyLmdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVW5pcXVlUmVsYXRpb25zaGlwUm9sZU5hbWVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlMaXN0IG5hbWVzID0gX3JlbGF0aW9uc2hpcFJvbGVOYW1lLmdldER1cGxpY2F0ZXMoKTsKLQkJaWYobmFtZXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlciB3cmFwcGVyID0gKEVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCB3cmFwcGVyLmdldFJlbGF0aW9uc2hpcFJvbGUoKSwgbmV3IFN0cmluZ1tde3dyYXBwZXIuZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBCb3RoIHNlY3Rpb24gMTEuNC4xIGFuZCAxNS4zLjIgbmVlZCB0aGUgPG1ldGhvZD4gZWxlbWVudC4gQWxzbyByZWZlcgotCSAqIHRvIDE2LjUgZm9yIHN5bnRheC4KLQkgKgotCSAqIFJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgbWV0aG9kcyByZWZlcmVuY2VkIGJ5IHRoaXMgbGlzdCBvZiAKLQkgKiBNZXRob2RFbGVtZW50IGNhbiBiZSBmb3VuZC4KLQkqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlTWV0aG9kRWxlbWVudHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBMaXN0IGVsZW1lbnRzKSB7Ci0JCWlmICgoZWxlbWVudHMgPT0gbnVsbCkgfHwgKGVsZW1lbnRzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNWYWxpZE1ldGhvZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gZWxlbWVudC5nZXRFbnRlcnByaXNlQmVhbigpOwotCQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0KLQkJCQlNZXRob2RbXSBtZXRob2RzID0gZWxlbWVudC5nZXRNZXRob2RzKCk7IC8vIGdldCBhbGwgbWV0aG9kcyB3aGljaCB3aWxsIGJlIHJldHJpZXZlZCBmb3IgdGhlIGdpdmVuIG1ldGhvZC1wZXJtaXNzaW9uCi0JCQkJYm9vbGVhbiBoYXNNZXRob2RzID0gKChtZXRob2RzICE9IG51bGwpICYmIChtZXRob2RzLmxlbmd0aCA+IDApKTsKLQotCQkJCWlmICghaGFzTWV0aG9kcykgewotCQkJCQkvLyB3YXJuaW5nCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCBuZXcgU3RyaW5nW10geyBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaGFzVmFsaWRNZXRob2QgPSB0cnVlOyAvLyBhIDxtZXRob2QtcGVybWlzc2lvbj4gbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtZXRob2QgKDE1LjMuMiwgcC4yMjkpCi0JCQkJCWlmIChuYW1lLmVxdWFscygiKiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUxpc3QgcGFyYW1zID0gZWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLQkJCQkJCWlmICgocGFyYW1zICE9IG51bGwpICYmIChwYXJhbXMuc2l6ZSgpID4gMCkpIHsKLQkJCQkJCQkvLyB3YXJuaW5nCi0JCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGVsZW1lbnQsIHRoaXMpOwotCQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBlcnJvcgotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NDQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBlbGVtZW50LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGhhc1ZhbGlkTWV0aG9kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ2xpZW50SkFSKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphcikgewotCQlTdHJpbmcgY2xpZW50SkFSTmFtZSA9IGVqYkphci5nZXRFamJDbGllbnRKYXIoKTsKLQkJaWYoY2xpZW50SkFSTmFtZSA9PSBudWxsKSB7Ci0JCQkvLyBObyBjbGllbnQgSkFSIHNwZWNpZmllZDsgZXZlcnl0aGluZydzIG9rYXkuCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUJvb2xlYW4gZXhpc3RzID0gKEJvb2xlYW4pdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfQ0xJRU5USkFSLCBuZXcgT2JqZWN0W117Y2xpZW50SkFSTmFtZX0pOwotCQlpZihleGlzdHMgPT0gbnVsbCkgewotCQkJLy8gSGVscGVyIGRvZXNuJ3Qgc3VwcG9ydCBsb2FkIG1vZGVsLiBXQVM/Ci0JCQkvLyBDYW4ndCBwZXJmb3JtIHRoaXMgY2hlY2ssIHNvIGp1c3QgcmV0dXJuLgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZighZXhpc3RzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODc1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGVqYkphciwgbmV3IFN0cmluZ1tde2NsaWVudEpBUk5hbWV9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgQVNOYW1lV3JhcHBlciB7Ci0JCXByaXZhdGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBfYmVhbiA9IG51bGw7Ci0KLQkJcHVibGljIEFTTmFtZVdyYXBwZXIoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFuKSB7Ci0JCQlfYmVhbiA9IGJlYW47Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgQVNOYW1lV3JhcHBlcikgewotCQkJCUFTTmFtZVdyYXBwZXIgb3RoZXIgPSAoQVNOYW1lV3JhcHBlcilvOwotCQkJCWlmKChfYmVhbi5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA9PSBudWxsKSAmJiAob3RoZXIuZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpID09IG51bGwpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmKF9iZWFuLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmKG90aGVyLmdldEJlYW4oKS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIF9iZWFuLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpLmVxdWFscyhvdGhlci5nZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWlmKChnZXRCZWFuKCkgIT0gbnVsbCkgJiYgKGdldEJlYW4oKS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSAhPSBudWxsKSkgewotCQkJCXJldHVybiBnZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0QmVhbigpIHsKLQkJCXJldHVybiBfYmVhbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSBFSkIgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2UuCi0JICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JICoKLQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JICovCi0JY2xhc3MgRWpiTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIEVudGVycHJpc2VCZWFuIF9iZWFuID0gbnVsbDsKLQotCQlwdWJsaWMgRWpiTmFtZVdyYXBwZXIoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJX2JlYW4gPSBiZWFuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVqYk5hbWVXcmFwcGVyKSB7Ci0JCQkJRWpiTmFtZVdyYXBwZXIgb3RoZXIgPSAoRWpiTmFtZVdyYXBwZXIpbzsKLQkJCQlpZigoX2JlYW4uZ2V0TmFtZSgpID09IG51bGwpICYmIChvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpID09IG51bGwpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmKF9iZWFuLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gX2JlYW4uZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXRCZWFuKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWlmKChnZXRCZWFuKCkgIT0gbnVsbCkgJiYgKGdldEJlYW4oKS5nZXROYW1lKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gZ2V0QmVhbigpLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0QmVhbigpIHsKLQkJCXJldHVybiBfYmVhbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSByZWxhdGlvbiBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkgKiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGR1cGxpY2F0ZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZS4KLQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkgKgotCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlIHNvIHRoYXQgdGhlIHdyYXBwZXIncwotCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkgKi8KLQljbGFzcyBFSkJSZWxhdGlvbk5hbWVXcmFwcGVyIHsKLQkJcHJpdmF0ZSBFSkJSZWxhdGlvbiBfcmVsYXRpb24gPSBudWxsOwotCi0JCXB1YmxpYyBFSkJSZWxhdGlvbk5hbWVXcmFwcGVyKEVKQlJlbGF0aW9uIHJlbCkgewotCQkJX3JlbGF0aW9uID0gcmVsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVKQlJlbGF0aW9uTmFtZVdyYXBwZXIpIHsKLQkJCQlFSkJSZWxhdGlvbk5hbWVXcmFwcGVyIG90aGVyID0gKEVKQlJlbGF0aW9uTmFtZVdyYXBwZXIpbzsKLQkJCQlpZigoX3JlbGF0aW9uLmdldE5hbWUoKSA9PSBudWxsKSAmJiAob3RoZXIuZ2V0UmVsYXRpb24oKS5nZXROYW1lKCkgPT0gbnVsbCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoX3JlbGF0aW9uLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihvdGhlci5nZXRSZWxhdGlvbigpLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIF9yZWxhdGlvbi5nZXROYW1lKCkuZXF1YWxzKG90aGVyLmdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWlmKChnZXRSZWxhdGlvbigpICE9IG51bGwpICYmIChnZXRSZWxhdGlvbigpLmdldE5hbWUoKSAhPSBudWxsKSkgewotCQkJCXJldHVybiBnZXRSZWxhdGlvbigpLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRUpCUmVsYXRpb24gZ2V0UmVsYXRpb24oKSB7Ci0JCQlyZXR1cm4gX3JlbGF0aW9uOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIHJlbGF0aW9uIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlLgotCSAqIChXaXRob3V0IHRoZSBpbnN0YW5jZSwgd2UgY2Fubm90IGdldCBsaW5lIG51bWJlcnMuKQotCSAqCi0JICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkgKiBzdGlsbCBiZSBhYmxlIHRvIGdldCB0aGUgcmVmIGZyb20gdGhlIGR1cGxpY2F0ZSBuYW1lLgotCSAqLwotCWNsYXNzIEVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlciB7Ci0JCXByaXZhdGUgRUpCUmVsYXRpb25zaGlwUm9sZSBfcmVsYXRpb25zaGlwUm9sZSA9IG51bGw7Ci0KLQkJcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlcihFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUpIHsKLQkJCV9yZWxhdGlvbnNoaXBSb2xlID0gcm9sZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIpIHsKLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlTmFtZVdyYXBwZXIgb3RoZXIgPSAoRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyKW87Ci0JCQkJaWYoKF9yZWxhdGlvbnNoaXBSb2xlLmdldFJvbGVOYW1lKCkgPT0gbnVsbCkgJiYgKG90aGVyLmdldFJlbGF0aW9uc2hpcFJvbGUoKS5nZXRSb2xlTmFtZSgpID09IG51bGwpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmKF9yZWxhdGlvbnNoaXBSb2xlLmdldFJvbGVOYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYob3RoZXIuZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBfcmVsYXRpb25zaGlwUm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscyhvdGhlci5nZXRSZWxhdGlvbnNoaXBSb2xlKCkuZ2V0Um9sZU5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZigoZ2V0UmVsYXRpb25zaGlwUm9sZSgpICE9IG51bGwpICYmIChnZXRSZWxhdGlvbnNoaXBSb2xlKCkuZ2V0Um9sZU5hbWUoKSAhPSBudWxsKSkgewotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBSb2xlKCkuZ2V0Um9sZU5hbWUoKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSZWxhdGlvbnNoaXBSb2xlKCkgewotCQkJcmV0dXJuIF9yZWxhdGlvbnNoaXBSb2xlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0OTZlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJWYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIElFSkJWYWxpZGF0aW9uQ29udGV4dCB7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIF92YWxpZGF0b3IgPSBudWxsOwotCXByaXZhdGUgSVZhbGlkYXRpb25Db250ZXh0IF9oZWxwZXIgPSBudWxsOwotCXByaXZhdGUgSVJlcG9ydGVyIF9yZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBMb2dFbnRyeSBsb2dFbnRyeSA9IG51bGw7Ci0vLwlwcml2YXRlIElNZXNzYWdlIF9tZXNzYWdlID0gbnVsbDsKLQkKLQlwdWJsaWMgRUpCVmFsaWRhdGlvbkNvbnRleHQoSVZhbGlkYXRvciB2LCBJVmFsaWRhdGlvbkNvbnRleHQgaCwgSVJlcG9ydGVyIHIpIHsKLQkJc2V0VmFsaWRhdG9yKHYpOwotCQlzZXRIZWxwZXIoaCk7Ci0JCXNldFJlcG9ydGVyKHIpOwotCX0KLQkKLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSVZhbGlkYXRvciB2KSB7Ci0JCV92YWxpZGF0b3IgPSB2OwotCX0KLQkKLQlwdWJsaWMgSVZhbGlkYXRpb25Db250ZXh0IGdldEhlbHBlcigpIHsKLQkJcmV0dXJuIF9oZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihJVmFsaWRhdGlvbkNvbnRleHQgaCkgewotCQlfaGVscGVyID0gaDsKLQl9Ci0JCi0JcHVibGljIElSZXBvcnRlciBnZXRSZXBvcnRlcigpIHsKLQkJcmV0dXJuIF9yZXBvcnRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoSVJlcG9ydGVyIHIpIHsKLQkJX3JlcG9ydGVyID0gcjsKLQl9Ci0JCi0gCS8qCi0gCSAqIFJldHVybnMgYW4gZW1wdHkgTWVzc2FnZSB3aGljaCBjYW4gYmUgcmV1c2VkLgotIAkgKi8KLSAJcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoKSB7Ci0gCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKLSAJCW1lc3NhZ2Uuc2V0QnVuZGxlTmFtZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLSAJCXJldHVybiBtZXNzYWdlOwotIAkJLyoKLSAJCWlmKF9tZXNzYWdlID09IG51bGwpIHsKLSAJCQlfbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7Ci0gCQl9Ci0gCQkKLSAJCXJlc2V0KF9tZXNzYWdlKTsKLSAJCV9tZXNzYWdlLnNldEJ1bmRsZU5hbWUoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSk7Ci0gCQkKLQkJcmV0dXJuIF9tZXNzYWdlOwotCQkqLwotCX0KLQkKLQkJLyoqCi0JICogSWYsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbiBJTWVzc2FnZSBpcyByZXVzZWQgaW5zdGVhZCBvZiBjcmVhdGluZwotCSAqIGEgbmV3IG9uZSBlYWNoIHRpbWUsIHRoaXMgbWV0aG9kIHJlc2V0cyB0aGUgaW50ZXJuYWwgZmllbGRzIHRvIHRoZSBkZWZhdWx0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZWFsbHkgYmUgb24gdGhlIElNZXNzYWdlIGltcGxlbWVudGF0aW9uIGl0c2VsZiwgYnV0Ci0JICogdGhpcydsbCBkbyBmb3Igbm93LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0KElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJbWVzc2FnZS5zZXRJZChudWxsKTsKLQkJbWVzc2FnZS5zZXRQYXJhbXMobnVsbCk7Ci0JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoTWVzc2FnZUZpbHRlci5BTllfU0VWRVJJVFkpOwotCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChudWxsKTsKLQkJbWVzc2FnZS5zZXRCdW5kbGVOYW1lKG51bGwpOwotCQltZXNzYWdlLnNldEdyb3VwTmFtZShudWxsKTsKLQkJbWVzc2FnZS5zZXRMaW5lTm8oSU1lc3NhZ2UuTElORU5PX1VOU0VUKTsKLQkJbWVzc2FnZS5zZXRPZmZzZXQoSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgoSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKTsKLQl9Ci0JCi0JCi0JCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCXJldHVybiBMb2dnZXIuZ2V0TG9nZ2VyKElFSkJWYWxpZGF0b3JDb25zdGFudHMuSjJFRV9DT1JFX1BMVUdJTik7Ci0JfQotCQotCXB1YmxpYyBMb2dFbnRyeSBnZXRMb2dFbnRyeSgpIHsKLQkgICAgaWYobG9nRW50cnkgPT0gbnVsbCkKLQkgICAgICAgIGxvZ0VudHJ5ID0gbmV3IExvZ0VudHJ5KElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUpOwotCQlyZXR1cm4gbG9nRW50cnk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gZ2V0SGVscGVyKCkubG9hZE1vZGVsKHN5bWJvbGljTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKSB7Ci0JCXJldHVybiBnZXRIZWxwZXIoKS5sb2FkTW9kZWwoc3ltYm9saWNOYW1lLCBwYXJtcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKCkgewotCQlnZXRSZXBvcnRlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKGdldFZhbGlkYXRvcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZXMoT2JqZWN0IHRhcmdldCkgewotCQlnZXRSZXBvcnRlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKGdldFZhbGlkYXRvcigpLCB0YXJnZXQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlcyhPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBJZGVudGlmaWVyKSB7Ci0JCWdldFJlcG9ydGVyKCkucmVtb3ZlTWVzc2FnZVN1YnNldChnZXRWYWxpZGF0b3IoKSwgdGFyZ2V0LCBncm91cElkZW50aWZpZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQlpZihtZXNzYWdlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlnZXRSZXBvcnRlcigpLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCkgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCk7Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcykgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCxwYXJtcyk7Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9ICBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCxudWxsLHRhcmdldCk7Ci0JCWdldFJlcG9ydGVyKCkuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldCkgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSAgbmV3IE1lc3NhZ2UoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5CVU5ETEVfTkFNRSxzZXZlcml0eSxtZXNzYWdlSWQscGFybXMsdGFyZ2V0KTsKLQkJZ2V0UmVwb3J0ZXIoKS5hZGRNZXNzYWdlKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb24gewotCQlJTWVzc2FnZSBtZXNzYWdlID0gIG5ldyBNZXNzYWdlKElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUsc2V2ZXJpdHksbWVzc2FnZUlkLG51bGwsdGFyZ2V0LGdyb3VwTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FLHNldmVyaXR5LG1lc3NhZ2VJZCxwYXJtcyx0YXJnZXQsZ3JvdXBOYW1lKTsKLQkJZ2V0UmVwb3J0ZXIoKS5hZGRNZXNzYWdlKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVJZkNhbmNlbGxlZCgpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIHsKLQkJaWYoZ2V0UmVwb3J0ZXIoKS5pc0NhbmNlbGxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3VidGFzayhTdHJpbmcgbWVzc2FnZUlkKSB7Ci0JCXN1YnRhc2sobWVzc2FnZUlkLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3VidGFzayhTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcykgewotCQlpZigobWVzc2FnZUlkID09IG51bGwpIHx8IChtZXNzYWdlSWQuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0JCW1lc3NhZ2Uuc2V0SWQobWVzc2FnZUlkKTsKLQkJbWVzc2FnZS5zZXRQYXJhbXMocGFybXMpOwotCQlnZXRSZXBvcnRlcigpLmRpc3BsYXlTdWJ0YXNrKGdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjJiZjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIENvcmUgRUpCIFZhbGlkYXRpb24gcnVsZXMKLSAqLwotcHVibGljIGNsYXNzIEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkgX2luc3QgPSBudWxsOwotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0JCi0JcHVibGljIEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeSgpIHsKLQkJY3JlYXRlUnVsZUxpc3QoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJaWYoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQlwcm90ZWN0ZWQgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpewotCSAgICBpZihsb2dnZXIgPT0gbnVsbCkKLQkgICAgICAgIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5KMkVFX0NPUkVfUExVR0lOKTsKLQkgICAgcmV0dXJuIGxvZ2dlcjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJ1bGVMaXN0KCkgewotCQlfcnVsZUxpc3QgPSBuZXcgSGFzaE1hcCgpOwotCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FSkJKQVIsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkVKQkphcjExVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9FSkJKQVIsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkVKQkphcjIwVlJ1bGUoKSk7Ci0JCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FTlRFUlBSSVNFQkVBTiwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uRW50ZXJwcmlzZUJlYW4xMVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRU5URVJQUklTRUJFQU4sIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkVudGVycHJpc2VCZWFuMjBWUnVsZSgpKTsKLQkJCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVTZXNzaW9uQmVhbigpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZVNlc3Npb25SZW1vdGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlU2Vzc2lvbkhvbWUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5TdGF0ZWxlc3NTZXNzaW9uQmVhbkNsYXNzVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9SRU1PVEUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlbGVzc1Nlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlbGVzc1Nlc3Npb25SZW1vdGVIb21lVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTCwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVsZXNzU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlbGVzc1Nlc3Npb25Mb2NhbEhvbWVWUnVsZSgpKTsKLQkJCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUUsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlZnVsU2Vzc2lvblJlbW90ZUhvbWVWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUwsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlN0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uU3RhdGVmdWxTZXNzaW9uTG9jYWxIb21lVlJ1bGUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVDTVBCZWFuKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVDTVBSZW1vdGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfS0VZQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRlQ01QS2V5KCkpOwotCQkKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUEJlYW5DbGFzc1ZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ01QUmVtb3RlSG9tZVZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5DTVBMb2NhbENvbXBvbmVudFZSdWxlKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQ01QTG9jYWxIb21lVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfS0VZQ0xBU1MsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNNUEtleUNsYXNzVlJ1bGUoKSk7Ci0JCQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVCTVBCZWFuKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX1JFTU9URSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVCTVBSZW1vdGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfSE9NRSwgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGVCTVBIb21lKCkpOwotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0ZUJNUEtleSgpKTsKLQotCQlfcnVsZUxpc3QucHV0KElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QQmVhbkNsYXNzVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5CTVBSZW1vdGVDb21wb25lbnRWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5CTVBSZW1vdGVIb21lVlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUwsIG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkJNUExvY2FsQ29tcG9uZW50VlJ1bGUoKSk7Ci0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FLCBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5CTVBMb2NhbEhvbWVWUnVsZSgpKTsKLQkJX3J1bGVMaXN0LnB1dChJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQk1QS2V5Q2xhc3NWUnVsZSgpKTsKLQkJCi0JCV9ydWxlTGlzdC5wdXQoSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9NRVNTQUdFX0JFQU5DTEFTUywgbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uTWVzc2FnZURyaXZlbkJlYW5DbGFzc1ZSdWxlKCkpOwotCQkKLQkJYWRkRGVwZW5kZW50UnVsZVRvUnVsZUxpc3QoKTsKLQkJbG9nQWxsRGVwZW5kZW50UnVsZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIElGaWxlRGVsdGEgcmVwcmVzZW50cyBhIHN0YXRpYyBsb2FkIG1vZGVsIChpLmUuLCB0aGUgZmlsZSBuYW1lIGlzIGFsd2F5cyB0aGUgc2FtZSksCi0JICogdGhlbiByZXR1cm4gdGhlIEludGVnZXIgd2hpY2ggbG9hZHMgdGhhdCBtb2RlbC4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyAgT2JqZWN0IGdldFJ1bGVJZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIFN0cmluZyBmaWxlTmFtZSkgewotCQlpZihmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGFMb2dnZXIgIT0gbnVsbCAmJiBhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZSBmcm9tIGZpbGVOYW1lOiAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUVKQkphciBlamJKYXIgPSBnZXRFSkJKYXIodmMpOwotCi0JCWlmKGZpbGVOYW1lLmVuZHNXaXRoKEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUpKSB7Ci0JCQlpZihlamJKYXIuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCkgewotCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0VKQkpBUjsKLQkJCX0KLQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0VKQkpBUjsKLQkJfQotCQlyZXR1cm4gbnVsbDsgLy8gbXVzdCBiZSBhIEphdmFDbGFzcwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgSUZpbGVEZWx0YSByZXByZXNlbnRzIGEgZHluYW1pYyBsb2FkIG1vZGVsIChpLmUuLCB0aGUgZmlsZSBuYW1lIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZQotCSAqIHVzZXIpLCB0aGVuIHJldHVybiB0aGUgSW50ZWdlciB3aGljaCBsb2FkcyB0aGF0IG1vZGVsLiBSZXR1cm4gbnVsbCBpZiBubyBzdWNoIG1vZGVsIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldFJ1bGVJZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEphdmFDbGFzcyBjbGF6eiwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBSZXR1cm4gdGhlIHJ1bGUgaWQgd2hpY2ggd2lsbCB2YWxpZGF0ZSB0aGUgSmF2YUNsYXNzIGFzIHRoZSAKLQkJLy8gdHlwZSB3aGljaCBpdCBpcyB1c2VkIGFzIGJ5IHRoZSBFbnRlcnByaXNlQmVhbi4KLQkJaWYoKGNsYXp6ID09IG51bGwpIHx8IChiZWFuID09IG51bGwpKSB7Ci0JCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGFMb2dnZXIgIT0gbnVsbCAmJiBhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZSBiZWNhdXNlIGVpdGhlciBiZWFuICgiICsgYmVhbiArICIpIG9yIGNsYXNzICgiICsgY2xhenogKyAiKSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlib29sZWFuIGlzU3RhdGVsZXNzU2Vzc2lvbiA9IChiZWFuLmlzU2Vzc2lvbigpICYmIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlbGVzcyhiZWFuKSk7Ci0JCWJvb2xlYW4gaXNTdGF0ZWZ1bFNlc3Npb24gPSAoYmVhbi5pc1Nlc3Npb24oKSAmJiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWZ1bChiZWFuKSk7Ci0JCQotCQlpZihiZWFuLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsKLQkJCWlmKGNsYXp6LmVxdWFscyhiZWFuLmdldEVqYkNsYXNzKCkpKSB7Ci0JCQkJaWYoaXNTdGF0ZWxlc3NTZXNzaW9uKSB7Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXNTdGF0ZWZ1bFNlc3Npb24pIHsKLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTUzsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNNZXNzYWdlRHJpdmVuKCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfTUVTU0FHRV9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlciAhPSBudWxsICYmIGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMl9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0RWpiQ2xhc3MoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoaXNTdGF0ZWxlc3NTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihpc1N0YXRlZnVsU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX1JFTU9URTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXp6LmVxdWFscyhiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlpZihpc1N0YXRlbGVzc1Nlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihpc1N0YXRlZnVsU2Vzc2lvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlpZihpc1N0YXRlbGVzc1Nlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGlzU3RhdGVmdWxTZXNzaW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0xPQ0FMSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMl9YKCkgJiYgY2xhenouZXF1YWxzKGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2xhenouZXF1YWxzKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSkpIHsKLQkJCQlpZihpc1N0YXRlbGVzc1Nlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUw7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXNTdGF0ZWZ1bFNlc3Npb24pIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTDsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTDsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUw7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24yX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGJlYW4gaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlpZihjbGF6ei5lcXVhbHMoKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpKSkgewotCQkJCQlpZihiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWJlYW47Ci0JCQkJCQkvLyBJZiBpdCdzIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5LCBpdCdzIGV4ZW1wdCBmcm9tIHRoZXNlIGNoZWNrcy4KLQkJCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ByaW1pdGl2ZVByaW1hcnlLZXkoY21wKSkgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudXNlc1Vua25vd25QcmltYXJ5S2V5KGNtcCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTUzsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1M7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYgKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjJfWCgpICYmIGNsYXp6LmVxdWFscygoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgIkNhbm5vdCBsb2FkIHJ1bGU6IGJlYW4uaXNWZXJzaW9uMl9YKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZWxzZSBpZihiZWFuLmdldFZlcnNpb25JRCgpIDw9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpIHsKLQkJCWlmKGNsYXp6LmVxdWFscyhiZWFuLmdldEVqYkNsYXNzKCkpKSB7Ci0JCQkJaWYoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfQkVBTkNMQVNTOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1M7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24xX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRFamJDbGFzcygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNsYXp6LmVxdWFscyhiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpKSkgewotCQkJCWlmKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfUkVNT1RFOwotCQkJCX0KLQkJCQllbHNlIGlmKGJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24xX1goKSAmJiBjbGF6ei5lcXVhbHMoYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihjbGF6ei5lcXVhbHMoYmVhbi5nZXRIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJaWYoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfSE9NRTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBhTG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkUsICJDYW5ub3QgbG9hZCBydWxlOiBiZWFuLmlzVmVyc2lvbjFfWCgpICYmIGNsYXp6LmVxdWFscyhiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZihiZWFuIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJaWYoY2xhenouZXF1YWxzKCgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKSkpIHsKLQkJCQkJaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuOwotCQkJCQkJLy8gSWYgaXQncyBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSwgaXQncyBleGVtcHQgZnJvbSB0aGVzZSBjaGVja3MuCi0JCQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfS0VZQ0xBU1M7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiZWFuLmlzQmVhbk1hbmFnZWRFbnRpdHkoKSkgewotCQkJCQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCWlmIChhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogYmVhbi5pc1ZlcnNpb24xX1goKSAmJiBjbGF6ei5lcXVhbHMoKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlMb2dnZXIgYUxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCAiQ2Fubm90IGxvYWQgcnVsZTogIWJlYW4uaXNWZXJzaW9uMV9YKCkgJiYgIWJlYW4uaXNWZXJzaW9uMl9YKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyZTI2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVKQlZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRUpCVmFsaWRhdG9yIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBUYXJnZXRPYmplY3RQb29sIF90YXJnZXRPYmplY3RQb29sU2luZ2xldG9uID0gbnVsbDsKLQlwcml2YXRlIExvZ0VudHJ5IGxvZ0VudHJ5ID0gbnVsbDsKLQkKLQkKLQlwdWJsaWMgRUpCVmFsaWRhdG9yKCkgewotCQlfaW5zdCA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRUpCVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQlwcml2YXRlIExvZ0VudHJ5IGdldExvZ0VudHJ5KCl7Ci0JICAgIGlmKGxvZ0VudHJ5ID09IG51bGwpCi0JICAgICAgICBsb2dFbnRyeSA9IG5ldyBMb2dFbnRyeShJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLQkgICAgcmV0dXJuIGxvZ0VudHJ5OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotCQlyZXR1cm4gImVqYnZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciN2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQsIElSZXBvcnRlciwgSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKElFSkJWYWxpZGF0b3JDb25zdGFudHMuSjJFRV9DT1JFX1BMVUdJTik7Ci0JCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQllbnRyeS5zZXRTb3VyY2VJRCgiRUpCVmFsaWRhdG9yOjp2YWxpZGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQllbnRyeS5zZXRUZXh0KCJ2YWxpZGF0ZSB0b29rICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtaWxsaXNlY29uZHMuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZW50cnkpOwotCQl9Ci0JCQotCQlFSkJWYWxpZGF0aW9uQ29udGV4dCB2YyA9IG5ldyBFSkJWYWxpZGF0aW9uQ29udGV4dCh0aGlzLCBoZWxwZXIsIHJlcG9ydGVyKTsKLQkJc2V0VmFsaWRhdGlvbkNvbnRleHQodmMpOwotCQlpZihpc0Z1bGxWYWxpZGF0ZSh2YykpIHsKLQkJCWZ1bGxWYWxpZGF0ZSh2Yyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbmNyZW1lbnRhbFZhbGlkYXRlKHZjKTsKLQkJfQotCQlpZihsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVIpKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIkVKQlZhbGlkYXRvcjo6dmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGV4dCgidmFsaWRhdGUgdG9vayAiICsgKGVuZCAtIHN0YXJ0KSArICIgbWlsbGlzZWNvbmRzLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGVudHJ5KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Z1bGxWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMpIHsKLQkJU3RyaW5nW10gZmlsZVVSSXMgPSB2Yy5nZXRVUklzKCk7Ci0JCWlmKGZpbGVVUklzID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmKGZpbGVVUklzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8ZmlsZVVSSXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB1cmkgPSBmaWxlVVJJc1tpXTsKLQkJCWlmKHVyaS5lbmRzV2l0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bkRlcGVuZGVudHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSwgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJZiBhIGNsYXNzIGlzIGJlaW5nIHJ1biBvbmx5IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIHJ1bGUgd2hpY2ggaGFzIGNoYW5nZWQsCi0JCS8vIGkuZS4sIGl0J3MgYSBkZXBlbmRlbnQsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBydW4gaXRzIGRlcGVuZGVudHMgYmVjYXVzZSB0aGUKLQkJLy8gY2xhc3MgaXRzZWxmIGhhc24ndCBjaGFuZ2VkLgotCQlTZXQgZGVwZW5kZW50cyA9IHJ1bGUuZ2V0RGVwZW5kZW50cygpOwotCQlpZihkZXBlbmRlbnRzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBlbmRlbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQlJVmFsaWRhdGlvblJ1bGUgZFJ1bGUgPSAoSVZhbGlkYXRpb25SdWxlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlPYmplY3QgZFJ1bGVUYXJnZXQgPSBkUnVsZS5nZXRUYXJnZXQodGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQkJCWlmKGRSdWxlVGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJcnVuKGRSdWxlLCB0YXJnZXRQYXJlbnQsIGRSdWxlVGFyZ2V0KTsgLy8gZmFsc2U9bm90IGZ1bGwgdmFsaWRhdGlvbgotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2goTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25Db250ZXh0KCksIGV4Yyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLnJlbGVhc2UocnVsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBpbnRlcm5hbEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTAwOwotCX0KLQkKLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2dNaXNzaW5nUnVsZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBydWxlSWQpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIHJ1bGVJZCArICIgPSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhZGRJbnRlcm5hbEVycm9yTWVzc2FnZSh2Yyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByZVJlbW92ZU9sZE1lc3NhZ2VzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgTWFwIHRhcmdldHMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU2V0IHZhbGlkYXRlZENsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCQkKLQkJdHJ5IHsJCi0JCQlTdHJpbmdbXSB1cmlzID0gdmMuZ2V0VVJJcygpOwotCQkJZm9yKGludCBpPTA7IGk8dXJpcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB1cmlJbnN0ID0gdXJpc1tpXTsKLQkJCQlpZigodXJpSW5zdCA9PSBudWxsKSB8fCAodXJpSW5zdC5sZW5ndGgoKSA9PSAwKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJT2JqZWN0IGlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIHVyaUluc3QpOwotCQkJCWlmKGlkID09IG51bGwpIHsKLQkJCQkJT2JqZWN0W10gY2xhenpBbmRCZWFuID0gKE9iamVjdFtdKXZjLmxvYWRNb2RlbCh1cmlJbnN0LCBudWxsKTsgLy8gRG9uJ3QgbmVlZCBhIHNlY29uZCBwYXJhbWV0ZXIsIGJ1dCBjYW4ndCBjYXN0IGEgUmVmT2JqZWN0IHRvIGFuIE9iamVjdFtdLCBzbyB1c2UgdGhlIHNlY29uZCBsb2FkIG1ldGhvZC4KLQkJCQkJaWYoY2xhenpBbmRCZWFuID09IG51bGwpIHsKLQkJCQkJCS8vIExvZywgYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRhc2sgbGlzdCwgYW5kIHJldHVybi4KLQkJCQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBpZCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQotCQkJCQkvLyBJbiB0aGUgY2xhenpBbmRCZWFuIG9iamVjdCBhcnJheSwgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBKYXZhQ2xhc3MsCi0JCQkJCS8vIGFuZCB0aGUgcmVzdCBvZiB0aGUgZW50cmllcyBhcmUgdGhlIEVudGVycHJpc2VCZWFuIGluc3RhbmNlcyB3aGljaCAKLQkJCQkJLy8gdXNlIHRoZSBKYXZhQ2xhc3MuCi0JCQkJCUphdmFDbGFzcyBjbGF6eiA9IChKYXZhQ2xhc3MpY2xhenpBbmRCZWFuWzBdOwotCQkJCQlMaXN0IGJlYW5zID0gKExpc3QpY2xhenpBbmRCZWFuWzFdOwotCi0JCQkJCS8vIFRoZSB2YWxpZGF0ZWRDbGFzcyBzZXQga2VlcHMgdHJhY2sgb2YgSmF2YUNsYXNzZXMgCi0JCQkJCS8vIHRoYXQgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhpcyBzZXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgCi0JCQkJCS8vIHdob3NlIGNoaWxkcmVuIG5lZWQgdG8gYmUgZm91bmQgYW5kIHZhbGlkYXRlZC4gCi0JCQkJCS8vIFZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGFmdGVyIGFsbCBvZiB0aGUgY2hhbmdlZCBmaWxlcyAKLQkJCQkJLy8gYXJlIHZhbGlkYXRlZCBzbyB0aGF0IGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgYWxsIG9mCi0JCQkJCS8vIHRoZSBjaGFuZ2VkIGZpbGVzIGNhbiBiZSBzZWFyY2hlZCBmb3IgYXQgb25jZS4gU2VhcmNoaW5nCi0JCQkJCS8vIG9uY2Ugb24gYSBncm91cCBwcm9kdWNlcyBwZXJmb3JtYW5jZSBzYXZpbmdzIGJlY2F1c2UKLQkJCQkJLy8gdGhlIHR5cGUgaGllcmFyY2h5IG1ldGhvZCB0YWtlcyBhIG5vbi10cml2aWFsIGFtb3VudAotCQkJCQkvLyBvZiB0aW1lIHdoZW4gdGhlcmUncyBhIGxhcmdlIGdyb3VwIG9mIGRlbHRhcy4KLQkJCQkJdmFsaWRhdGVkQ2xhc3Nlcy5hZGQoY2xhenopOwotCi0JCQkJCWlmKChiZWFucyA9PSBudWxsKSB8fCAoYmVhbnMuc2l6ZSgpID09IDApKSB7Ci0JCQkJCQkvLyBUaGUgSmF2YUNsYXNzIGl0c2VsZiBpcyBub3QgcGFydCBvZiBhbiBlbnRlcnByaXNlIGJlYW4sIGJ1dCBvbmUgb2YgaXRzIGNoaWxkcmVuIG1heSBiZS4KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYmVhbnMuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4paXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIGNsYXp6LCBiZWFuKTsKLQkJCi0JCQkJCQkJSVZhbGlkYXRpb25SdWxlIGNsYXp6UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCQkJCWlmKGNsYXp6UnVsZSA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IChpZiBpdCdzCi0JCQkJCQkJCS8vIGFuIGVycm9yIC0gdGhpcyBpcyBleHBlY3RlZCBpZiB0aGUga2V5IGlzIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5KS4KLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkKLQkJCQkJCQlzZXRWYWxpZGF0ZWQoY2xhenpSdWxlLmdldElkKCksIGJlYW4sIGNsYXp6KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJCQkJaWYoZWpiSmFyID09IG51bGwpIHsKLQkJCQkJCS8vIExvZywgYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRhc2sgbGlzdCwgYW5kIHJldHVybi4KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlJVmFsaWRhdGlvblJ1bGUgZWpiRXh0UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCQlpZihlamJFeHRSdWxlID09IG51bGwpIHsKLQkJCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LCBzbyBqdXN0Ci0JCQkJCQkvLyBuZWVkIHRvIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0aGUgdGFzayBsaXN0LgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXNldFZhbGlkYXRlZChlamJFeHRSdWxlLmdldElkKCksIG51bGwsIGVqYkphcik7Ci0JCQkJfQotCQkJfSAvLyBlbmQgZm9yCi0JCQkKLQkJCS8vIEFsd2F5cyB2YWxpZGF0ZSBlamItamFyLnhtbCwgYmVjYXVzZSBhIGNoYW5nZSB0byBvbmUgb2YgdGhlIGZpbGVzIGl0IHJlZmVyZW5jZXMKLQkJCS8vIG1heSBtZWFuIHRoYXQgaXQgbmVlZHMgdG8gYmUgcmV2YWxpZGF0ZWQuCQotCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQkJaWYoZWpiSmFyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgaWQgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGVJZCh2YywgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSk7Ci0JCQkJaWYoaWQgPT0gbnVsbCkgewotCQkJCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBpZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJVmFsaWRhdGlvblJ1bGUgZWpiSmFyUnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCQlpZihlamJKYXJSdWxlID09IG51bGwpIHsKLQkJCQkJCWxvZ01pc3NpbmdSdWxlKHZjLCBpZCk7Ci0JCQkJCX0KLQkJCQkJc2V0VmFsaWRhdGVkKGVqYkphclJ1bGUuZ2V0SWQoKSwgbnVsbCwgZWpiSmFyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKHZhbGlkYXRlZENsYXNzZXMuc2l6ZSgpID4gMCkgewotCQkJCS8vIENoZWNrIHRoZSBjaGlsZHJlbiBvZiB0aGUgY2hhbmdlZCBjbGFzc2VzLgotCQkJCS8vIFRoaXMgY2hlY2sgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZGVwZW5kZW50cywgYmVjYXVzZQotCQkJCS8vIHRoZSBkZXBlbmRlbnRzIG9mIHRoZSBjaGlsZHJlbiBjbGFzc2VzIG11c3QgYmUgY2hlY2tlZAotCQkJCS8vIGFzIHdlbGwuCi0KLQkJCQkvLyBDbGFzcyBuZXZlciB2YWxpZGF0ZWQgYmVmb3JlLCBzbyBjaGVjayBpdHMgY2hpbGRyZW4KLQkJCQlKYXZhQ2xhc3NbXSBjaGlsZHJlbiA9IChKYXZhQ2xhc3NbXSl2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkNISUxEUkVOLCBuZXcgT2JqZWN0W117dmMuZ2V0UmVwb3J0ZXIoKSwgdmFsaWRhdGVkQ2xhc3Nlc30pOwotCQkJCXZhbGlkYXRlZENsYXNzZXMuY2xlYXIoKTsgLy8gRG9uJ3QgbmVlZCB0aGlzIGNhY2hlIGFueSBtb3JlOyBmcmVlIHRoZSBtZW1vcnkuCi0JCQkJaWYoKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5sZW5ndGggPiAwKSkgewotCQkJCQlJdGVyYXRvciBiY2l0ZXJhdG9yID0gbnVsbDsKLQkJCQkJT2JqZWN0IGlkID0gbnVsbDsKLQkJCQkJZm9yKGludCBjPTA7IGM8Y2hpbGRyZW4ubGVuZ3RoOyBjKyspIHsKLQkJCQkJCUphdmFDbGFzcyBjaGlsZCA9IGNoaWxkcmVuW2NdOwotCQkJCQkJTGlzdCBiZWFucyA9IChMaXN0KXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCLCBuZXcgT2JqZWN0W117Y2hpbGR9KTsKLQkJCQkJCWlmKChiZWFucyA9PSBudWxsKSB8fCAoYmVhbnMuc2l6ZSgpID09IDApKSB7Ci0JCQkJCQkJLy8gVGhlIGNoaWxkIGlzIG5vdCBhIG1lbWJlciBvZiBhbiBlbnRlcnByaXNlIGJlYW4uCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWJjaXRlcmF0b3IgPSBiZWFucy5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUoYmNpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKWJjaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIGNoaWxkLCBiZWFuKTsKLQkJCi0JCQkJCQkJSVZhbGlkYXRpb25SdWxlIGNsYXp6UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCQkJCWlmKGNsYXp6UnVsZSA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LCBzbyBqdXN0Ci0JCQkJCQkJCS8vIG5lZWQgdG8gYWRkICJDYW5ub3QgdmFsaWRhdGUiIHRvIHRoZSB0YXNrIGxpc3QuCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCi0JCQkJCQkJc2V0VmFsaWRhdGVkKGNsYXp6UnVsZS5nZXRJZCgpLCBiZWFuLCBjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIE5vdywgdmFsaWRhdGUgdGhlIGRlcGVuZGVudHMuCi0JCQl0YXJnZXRzLnB1dEFsbChfdmFsaWRhdGVkKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFyZ2V0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGlkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCUlWYWxpZGF0aW9uUnVsZSBydWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7Ci0JCQkJaWYocnVsZSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlTZXQgY29udGV4dHMgPSAoU2V0KXRhcmdldHMuZ2V0KGlkKTsKLQkJCQlpZihjb250ZXh0cyA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlJdGVyYXRvciBjSXRlcmF0b3IgPSBjb250ZXh0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJVGFyZ2V0T2JqZWN0IHRvID0gKFRhcmdldE9iamVjdCljSXRlcmF0b3IubmV4dCgpOwotCQkJCQlPYmplY3QgdGFyZ2V0UGFyZW50ID0gdG8uZ2V0VGFyZ2V0UGFyZW50KCk7Ci0JCQkJCU9iamVjdCB0YXJnZXQgPSB0by5nZXRUYXJnZXQoKTsKLQkJCQkJU2V0IGRlcGVuZGVudHMgPSBydWxlLmdldERlcGVuZGVudHMoKTsKLQkJCQkJaWYoZGVwZW5kZW50cyA9PSBudWxsKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSXRlcmF0b3IgZEl0ZXJhdG9yID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZShkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlWYWxpZGF0aW9uUnVsZSBkUnVsZSA9IChJVmFsaWRhdGlvblJ1bGUpZEl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgZFJ1bGVUYXJnZXQgPSBkUnVsZS5nZXRUYXJnZXQodGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQkJCQkJCWlmKGRSdWxlVGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJCQkJc2V0VmFsaWRhdGVkKGRSdWxlLmdldElkKCksIHRhcmdldFBhcmVudCwgZFJ1bGVUYXJnZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChNZXNzYWdlTGltaXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCQkJYWRkSW50ZXJuYWxFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkNvbnRleHQoKSwgZXhjKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCUVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkucmVsZWFzZShydWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIE5vIG1hdHRlciB3aGF0LCBjbGVhciB0aGUgdGVtcG9yYXJ5IGNhY2hlcy4KLQkJCXRhcmdldHMuY2xlYXIoKTsKLQkJCXZhbGlkYXRlZENsYXNzZXMuY2xlYXIoKTsKLQkJCQotCQkJLy8gTm93IHB1dCB0aGUgInZhbGlkYXRlZCIgcmVzdWx0cyBpbiAiZG9uZSIsIGJlY2F1c2UgdGhleSB3ZXJlbid0Ci0JCQkvLyByZWFsbHkgdmFsaWRhdGVkOyBpdCB3YXMganVzdCBhIHRyYWNraW5nIG1lY2hhbmlzbS4KLQkJCXRhcmdldHMucHV0QWxsKF92YWxpZGF0ZWQpOwotCQkJX3ZhbGlkYXRlZC5jbGVhcigpOyAvLyBDbGVhciB0aGUgInZhbGlkYXRlZCIgY2FjaGUgYmVjYXVzZSB0aGUgdGFyZ2V0cyB3ZXJlbid0IHJlYWxseSB2YWxpZGF0ZWQ7IHRoZXkgd2VyZSBqdXN0IHRyYWNrZWQuCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdmVPbGRNZXNzYWdlc1N0cmluZygpIHsKLQkJcmV0dXJuIEVKQlZhbGlkYXRvck1vZGVsRW51bS5SRU1PVkVfT0xEX01FU1NBR0VTOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmdWxsVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJlbW92ZU9sZE1lc3NhZ2VzKHZjLG51bGwpOyAvLyBudWxsID09IG5vIElGaWxlRGVsdGEsIG51bGwgPSBkb24ndCB0cmFjayB0YXJnZXRzCi0JCQotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCWlmKGVqYkphciA9PSBudWxsKSB7Ci0JCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQkvLyBFSkJQcm9qZWN0UmVzb3VyY2VzIHdpbGwgYWxyZWFkeSBoYXZlIGxvZ2dlZCB0aGUgcHJvYmxlbS4KLQkJCQotCQkJSU1lc3NhZ2UgbXNzZyA9IHZjLmdldE1lc3NhZ2UoKTsKLQkJCW1zc2cuc2V0SWQoSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI5MDUpOwotCQkJdmMuYWRkTWVzc2FnZShtc3NnKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IGlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUpOwotCQlpZihpZCA9PSBudWxsKSB7Ci0JCQkvLyBMb2csIGFkZCAiQ2Fubm90IHZhbGlkYXRlIiB0byB0YXNrIGxpc3QsIGFuZCByZXR1cm4uCi0JCQlsb2dNaXNzaW5nUnVsZSh2YywgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVZhbGlkYXRpb25SdWxlIGVqYkphclJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJaWYoZWpiSmFyUnVsZSA9PSBudWxsKSB7Ci0JCQlsb2dNaXNzaW5nUnVsZSh2YywgaWQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXJ1bihlamJKYXJSdWxlLCBudWxsLCBlamJKYXIpOyAvLyB0cnVlPSBmdWxsIHZhbGlkYXRpb24KLQotCQlMaXN0IGJlYW5zID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGJlYW5zLml0ZXJhdG9yKCk7Ci0JCWlkID0gbnVsbDsKLQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4paXRlcmF0b3IubmV4dCgpOwotCQkJSmF2YUNsYXNzW10gY2xhc3NlcyA9IGdldEphdmFDbGFzcyhiZWFuKTsKLQkJCWZvcihpbnQgaT0wOyBpPGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKYXZhQ2xhc3MgY2xhenogPSBjbGFzc2VzW2ldOwotCQkJCWlkID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlSWQodmMsIGNsYXp6LCBiZWFuKTsKLQkJCi0JCQkJSVZhbGlkYXRpb25SdWxlIGNsYXp6UnVsZSA9IEVKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5nZXRGYWN0b3J5KCkuZ2V0UnVsZSh2YywgaWQpOwotCQkJCWlmKGNsYXp6UnVsZSA9PSBudWxsKSB7Ci0JCQkJCS8vIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYnkgdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5IChpZiBpdCdzCi0JCQkJCS8vIGFuIGVycm9yIC0gdGhpcyBpcyBleHBlY3RlZCBpZiB0aGUga2V5IGlzIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5KS4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkKLQkJCQlydW4oY2xhenpSdWxlLCBiZWFuLCBjbGF6eik7IC8vIHRydWUgPSBmdWxsIHZhbGlkYXRpb24KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzW10gZ2V0SmF2YUNsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJSmF2YUNsYXNzW10gY2xhc3NlcyA9IG5ldyBKYXZhQ2xhc3NbNl07Ci0JCQotCQlKYXZhQ2xhc3MgZWpiQ2xhc3MgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCWlmKChlamJDbGFzcyAhPSBudWxsKSAmJiAoZWpiQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkpIHsKLQkJCWNsYXNzZXNbY291bnQrK10gPSBlamJDbGFzczsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIHJlbW90ZUNsYXNzID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJaWYoKHJlbW90ZUNsYXNzICE9IG51bGwpICYmIChyZW1vdGVDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJY2xhc3Nlc1tjb3VudCsrXSA9IHJlbW90ZUNsYXNzOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgbG9jYWxDbGFzcyA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJaWYoKGxvY2FsQ2xhc3MgIT0gbnVsbCkgJiYgKGxvY2FsQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkpIHsKLQkJCWNsYXNzZXNbY291bnQrK10gPSBsb2NhbENsYXNzOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgaG9tZUNsYXNzID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCWlmKChob21lQ2xhc3MgIT0gbnVsbCkgJiYgKGhvbWVDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJY2xhc3Nlc1tjb3VudCsrXSA9IGhvbWVDbGFzczsKLQkJfQotCQkKLQkJSmF2YUNsYXNzIGxvY2FsSG9tZUNsYXNzID0gYmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJaWYoKGxvY2FsSG9tZUNsYXNzICE9IG51bGwpICYmIChsb2NhbEhvbWVDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSkgewotCQkJY2xhc3Nlc1tjb3VudCsrXSA9IGxvY2FsSG9tZUNsYXNzOwotCQl9Ci0JCQotCQlpZihiZWFuIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlKYXZhQ2xhc3Mga2V5ID0gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQkJaWYoKGtleSAhPSBudWxsKSAmJiAoa2V5LmlzRXhpc3RpbmdUeXBlKCkpKSB7Ci0JCQkJY2xhc3Nlc1tjb3VudCsrXSA9IGtleTsKLQkJCX0KLQkJfQotCi0JCWlmKGNvdW50ID09IDYpIHsKLQkJCXJldHVybiBjbGFzc2VzOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3NbXSByZXN1bHQgPSBuZXcgSmF2YUNsYXNzW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShjbGFzc2VzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRhbFZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlNYXAgdGFyZ2V0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRyeSB7Ci0JCQlyZW1vdmVPbGRNZXNzYWdlcyh2Yyx0YXJnZXRzKTsKLQkJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXJnZXRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgaWQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSVZhbGlkYXRpb25SdWxlIHJ1bGUgPSBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmdldFJ1bGUodmMsIGlkKTsKLQkJCQlpZihydWxlID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCVNldCBjb250ZXh0cyA9IChTZXQpdGFyZ2V0cy5nZXQoaWQpOwotCQkJCWlmKGNvbnRleHRzID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCUl0ZXJhdG9yIGNJdGVyYXRvciA9IGNvbnRleHRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoY0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlUYXJnZXRPYmplY3QgdG8gPSAoVGFyZ2V0T2JqZWN0KWNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXJ1bihydWxlLCB0by5nZXRUYXJnZXRQYXJlbnQoKSwgdG8uZ2V0VGFyZ2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRhcmdldHMuY2xlYXIoKTsKLQkJCXRhcmdldHMgPSBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUYXJnZXRPYmplY3RQb29sIGdldFRhcmdldE9iamVjdFBvb2woKSB7Ci0JCWlmKF90YXJnZXRPYmplY3RQb29sU2luZ2xldG9uID09IG51bGwpIHsKLQkJCV90YXJnZXRPYmplY3RQb29sU2luZ2xldG9uID0gbmV3IFRhcmdldE9iamVjdFBvb2woMTAwKTsKLQkJfQotCQlyZXR1cm4gX3RhcmdldE9iamVjdFBvb2xTaW5nbGV0b247Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudmFsaWRhdGlvbi5BYnN0cmFjdEVKQlZhbGlkYXRvciNyZWxlYXNlUnVsZXMob3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudmFsaWRhdGlvbi5lamIuSVZhbGlkYXRpb25SdWxlKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbGVhc2VSdWxlcyhJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotICAgICAgICBFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLnJlbGVhc2UocnVsZSk7Ci0gICAgICAgIAotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0b3JNb2RlbEVudW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0b3JNb2RlbEVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0ODI0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yTW9kZWxFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lcyBvZiB0aGUgbW9kZWxzIHdoaWNoIHRoZQotICogRUpCVmFsaWRhdG9yIG5lZWRzLCBhbmQgdGhlIElWYWxpZGF0aW9uQ29udGV4dCB0aGF0IGlzIHVzZWQgaW4gdGhlIEVKQlZhbGlkYXRvcidzCi0gKiB2YWxpZGF0ZSBtZXRob2QgbXVzdCBzdXBwb3J0IHRoZXNlIHN5bWJvbGljIG5hbWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQlZhbGlkYXRvck1vZGVsRW51bSB7Ci0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX01PREVMID0gIkVKQl9NT0RFTCI7IC8vIHJldHVybiBhbiBFSkJKYXIgb2JqZWN0IC8vJE5PTi1OTFMtMSQKLQkgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFSkJfRklMRSA9ICJFSkJfRklMRSI7IC8vIHJldHVybiBhIE1vZHVsZUZpbGUgb2JqZWN0IChlaXRoZXIgRUpCSmFyRmlsZSBvciBFQVJGaWxlKSAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCID0gIkVKQiI7IC8vIEdpdmVuIGEgSmF2YUNsYXNzIGluc3RhbmNlLCByZXR1cm4gYSBqYXZhLnV0aWwuTGlzdCBvZiBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZXMgdGhhdCB1c2UgdGhhdCBKYXZhQ2xhc3MgYXMgcGFydCBvZiB0aGUgYmVhbi4gLy8kTk9OLU5MUy0xJAotCSAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENISUxEUkVOID0gImNoaWxkcmVuIjsgLy8gR2l2ZW4gYSBKYXZhQ2xhc3MgaW5zdGFuY2UsIHJldHVybiBhIEphdmFDbGFzc1tdIG9mIHRoZSBKYXZhQ2xhc3NlcyB0aGF0IGluaGVyaXQgb3IgZXh0ZW5kIHRoZSBpbnN0YW5jZS4gLy8kTk9OLU5MUy0xJAotCSAgIC8vVGhlIEVKQl9CSU5ESU5HIHN5bWJvbHMgaXMgV0FTIHNwZWNpZmljIGFuZCBuZWVkIHRvIGJlIG1vdmVkIHRvIFdBUyBFeHQgbGF5ZXIKLQkgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFSkJfQklORElORyA9ICJFSkJfQklORElORyI7IC8vIHJldHVybiB0aGUgRUpCSmFyQmluZGluZyBmb3IgdGhlIEVKQkphciAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUpCX0NMSUVOVEpBUiA9ICJFSkJfQ0xJRU5USkFSIjsgLy8gSWYgdGhlIEVKQiB1c2VzIGEgY2xpZW50IEpBUiwgZ2l2ZW4gdGhlIG5hbWUgb2YgdGhlIEpBUiwgdGhpcyBtZXRob2QgcmV0dXJucyBhIEJvb2xlYW4uVFJVRSBpZiB0aGUgY2xpZW50IEpBUiBjYW4gYmUgZm91bmQgYW5kIGxvYWRlZCBzdWNjZXNzZnVsbHkuIElmIGl0IGNhbid0IGJlIGZvdW5kIGFuZCBsb2FkZWQsIHJldHVybiBCb29sZWFuLkZBTFNFLiAvLyROT04tTkxTLTEkCi0JICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX09MRF9NRVNTQUdFUyA9ICJSRU1PVkVfT0xEX01FU1NBR0VTIjsgLy8gUmVtb3ZlIGFsbCBNZXNzYWdlcyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGdpdmVuIE9iamVjdHMgaW4gdGhlIGFycmF5LiAvLyROT04tTkxTLTEkCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzYjk0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRWFyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5WYWxpZGF0ZVhtbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5Ob01vZHVsZUZpbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzYvMjAwMCAxMTowODo1NSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVhclZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIEVBUk1lc3NhZ2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19SRUZfR1JPVVBfTkFNRSA9ICJSRVNfUkVGX0dST1VQX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTX0VOVl9SRUZfR1JPVVBfTkFNRSA9ICJSRVNfRU5WX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUkVGX0dST1VQX05BTUUgPSAiU0VSVklDRV9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUkVGX0dST1VQX05BTUUgPSAiRUpCX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ19ST0xFX1JFRl9HUk9VUF9OQU1FID0gIlNFQ19ST0xFX1JFRl9HUk9VUF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfUkVGX0dST1VQX05BTUUgPSAiTUVTU0FHRV9SRUZfR1JPVVBfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgRUFSRmlsZSBlYXJGaWxlOwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbiBhcHBERDsKLQkKLQkvKioKLQkgKiBSZWxhdGlvbnNoaXBNYXBWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRWFyVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0vLyBFYXJWYWxpZGF0b3IKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbGlkYXRlWE1MIGNvbW1hbmQuCi0JICogCi0JICogQHJldHVybiBDb21tYW5kCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlVmFsaWRhdGVYTUxDb21tYW5kKCkgewotCQlDb21tYW5kIGNtZCA9IG5ldyBWYWxpZGF0ZVhtbENvbW1hbmQoZWFyRmlsZSk7Ci0JCXJldHVybiBjbWQ7Ci0JfS8vIGNyZWF0ZVZhbGlkYXRlWE1MQ29tbWFuZAotCQotCS8qKgotCSAqIDxwPkFuc3dlciB0aGUgaWQgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB3aGljaCBpcwotCSAqIHVzZWQgYnkgdGhlIHJlY2VpdmVyLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0JCXJldHVybiBFQVJfQ0FURUdPUlk7Ci0JfS8vIGdldEJhc2VOYW1lCi0JCi0JLyoqCi0JICogWE1MIFZhbGlkYXRpb24gbm93IGhhbmRsZXMgdmFsaWRhdGlvbiBvZiBEZXBsb3ltZW50IERlc2NyaXB0b3IKLQkgKiAKLQkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkgIHZhbGlkYXRlTW9kdWxlcyhhcHBERC5nZXRNb2R1bGVzKCkpOwotCSAgdmFsaWRhdGVTZWN1cml0eSgpOwotCSAgdmFsaWRhdGVSZWZzKCk7Ci0JICB2YWxpZGF0ZVdlYkNvbnRleHRzKCk7Ci0JICB2YWxpZGF0ZVNwZWNMZXZlbCgpOwotCX0vLyB2YWxpZGF0ZQotCQotCS8qKgotCSAqIERvZXMgdGhlIHZhbGlkYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWluUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0JCXN1cGVyLnZhbGlkYXRlKGluSGVscGVyLCBpblJlcG9ydGVyKTsKLQkJdHJ5IHsKLQkJCWVhckZpbGUgPSAoRUFSRmlsZSkgX2hlbHBlci5sb2FkTW9kZWwoRUFSX01PREVMX05BTUUpOwotCQkJaWYgKGVhckZpbGUgIT0gbnVsbCkgewotCQkJCWFwcEREID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCWlmIChhcHBERCAhPSBudWxsICYmIGFwcERELmVSZXNvdXJjZSgpICE9IG51bGwgJiYgYXBwREQuZVJlc291cmNlKCkuaXNMb2FkZWQoKSkKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQllbHNlIHsKLQkJCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFQVJfRERfQ0FOTk9UX09QRU5fREQsIG5ldyBTdHJpbmdbXSB7IGdldFJlc291cmNlTmFtZSgpfSk7Ci0JCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfRUFSX0lOVkFMSURfRUFSX0ZJTEUsIG5ldyBTdHJpbmdbXSB7IGdldFJlc291cmNlTmFtZSgpfSk7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2cpOwotCQkJfSAvLyBpZgotCQl9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ1tdIHBhcmFtID0gbmV3IFN0cmluZ1sxXTsKLQkJCWlmIChlYXJGaWxlICE9IG51bGwpCi0JCQkJcGFyYW1bMF0gPSBlYXJGaWxlLmdldE5hbWUoKTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRUFSX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1JfVUlfLCBwYXJhbSk7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZywgZSk7Ci0JCX0gLy8gdHJ5IAotCX0gLy8gdmFsaWRhdGUKLQotCQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgewotCQlyZXR1cm4gZWFyRmlsZS5nZXRVUkkoKTsKLQl9Ly8gZ2V0UmVzb3VyY2VOYW1lCi0JCi0JLyoqCi0JICogdmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzCi0JICogCi0JICogQHBhcmFtIEVMaXN0IGVhclJvbGVMaXN0IC0gTGlzdCBvZiBlYXIgcm9sZXMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFYXJSb2xlcyhFTGlzdCBlYXJSb2xlTGlzdCkgewotCQlTZXQgcyA9IG5ldyBIYXNoU2V0KGVhclJvbGVMaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUm9sZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUgPSAoU2VjdXJpdHlSb2xlKSBlYXJSb2xlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoIShzLmFkZChzZWN1cml0eVJvbGUuZ2V0Um9sZU5hbWUoKSkpKSB7Ci0JCQkJU3RyaW5nIHJvbGVOYW1lID0gc2VjdXJpdHlSb2xlLmdldFJvbGVOYW1lKCk7Ci0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJhbXNbMF0gPSByb2xlTmFtZTsKLQkJCQlhZGRXYXJuaW5nKGdldEJhc2VOYW1lKCksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMsIHBhcmFtcywgYXBwREQgKTsKLQkJCX0vLyBpZgotCQl9Ly8gZm9yCi0JfS8vIHZhbGlkYXRlRWFyUm9sZXMKLQkKLQkvKioKLQkgKiB2YWxpZGF0ZVJlZnMoV2ViQXBwKSAtIHZhbGlkYXRlIEVKQiAgcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBFamJSZWYgZXJlZiAtIEFuIGVqYiByZWYuCi0JICogQHBhcmFtIFN0aW5nIHVyaSAtIFRoZSB1cmkgb2YgdGhlIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVKQlJlZk1hbmRhdG9yeUVsZW1lbnRzKExpc3QgZWpiUmVmcywgU3RyaW5nIHVyaSkgewotCSBmb3IoaW50IGkgPSAwOyBpIDwgZWpiUmVmcy5zaXplKCk7IGkrKykgewotCSAgRWpiUmVmIGVyZWYgPSAoRWpiUmVmKSBlamJSZWZzLmdldChpKTsKLQkgIFN0cmluZyByZWZOYW1lID0gZXJlZi5nZXROYW1lKCk7Ci0JICBTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzJdOwotCSAgcGFyYW1zWzBdID0gcmVmTmFtZTsKLQkgIHBhcmFtc1sxXSA9IHVyaTsKLQkgIAotCSAgaWYgKChlcmVmLmdldE5hbWUoKS50cmltKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZOQU1FLCBwYXJhbXMpOwotCSAgfS8vIGlmCi0JICBpZiAoZXJlZi5pc1NldFR5cGUoKSkKLQkgICAge2lmKGVyZWYuZ2V0VHlwZSgpID09IG51bGwgKSAKLQkJICBhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9JTlZBTElEX0VSRUZUWVBFLCBwYXJhbXMpO30KLQkgIGVsc2UgCi0JICAJIGFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEUsIHBhcmFtcyk7Ci0JICAvLyBpZgotCSAgaWYgKChlcmVmLmdldEhvbWUoKSA9PSBudWxsKSB8fCAoZXJlZi5nZXRIb21lKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCWFkZFdhcm5pbmcoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUsIHBhcmFtcyk7Ci0JICB9Ly8gaWYKLQkgIGlmICgoZXJlZi5nZXRSZW1vdGUoKSA9PSBudWxsKSB8fCAoZXJlZi5nZXRSZW1vdGUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFLCBwYXJhbXMpOwotCSAgfQotCSB9Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdGhlIGVqYiBpbnRlcmZhY2VzIHRvIGNoZWNrIGlmIHRoZXkgYXJlIHNpbWlsYXIuCi0JICogCi0JICogQHBhcmFtIEVqYlJlZiBlcmVmIC0gVGhlIGVqYiByZWZlcmVuY2UuCi0JICogQHBhcmFtIEVudGVycHJpc2VCZWFuIGVqYiAtIFRoZSBlbnRlcnByaXNlIGJlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbWlsYXJFSkJJbnRlcmZhY2UoRWpiUmVmIGVyZWYsIEVudGVycHJpc2VCZWFuIGVqYikgewotCQkKLQkJaWYoIGVyZWYuaXNMb2NhbCgpICkgewotCQkJaWYoIGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkgPT0gbnVsbCB8fAotCQkJCWVqYi5nZXRMb2NhbEludGVyZmFjZU5hbWUoKSA9PSBudWxsIHx8IAotCQkJCSgoRUpCTG9jYWxSZWYpZXJlZikuZ2V0TG9jYWxIb21lKCkgPT0gbnVsbCAgfHwgCi0JCQkJKChFSkJMb2NhbFJlZillcmVmKS5nZXRMb2NhbCgpID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfS8vIGlmCi0JCQkKLQkJCWJvb2xlYW4gaXNIb21lTG9jYWxPayA9IGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkuZXF1YWxzKCgoRUpCTG9jYWxSZWYpZXJlZikuZ2V0TG9jYWxIb21lKCkpOwotCQkJYm9vbGVhbiBpc1JlbW90ZUxvY2FsT2sgPSAgZWpiLmdldExvY2FsSW50ZXJmYWNlTmFtZSgpLmVxdWFscygoKEVKQkxvY2FsUmVmKWVyZWYpLmdldExvY2FsKCkpOwotCQkgCXJldHVybiBpc0hvbWVMb2NhbE9rICYmIGlzUmVtb3RlTG9jYWxPazsKLQkJfS8vIGlmCi0JCQotCQlpZiggZWpiLmdldEhvbWVJbnRlcmZhY2VOYW1lKCkgPT0gbnVsbCB8fAotCQkJZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKSA9PSBudWxsIHx8IAotCQkJZXJlZi5nZXRIb21lKCkgPT0gbnVsbCAgfHwgCi0JCQllcmVmLmdldFJlbW90ZSgpID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0vLyBpZgotCQkKLQkJYm9vbGVhbiBpc0hvbWVPayA9IGVqYi5nZXRIb21lSW50ZXJmYWNlTmFtZSgpLmVxdWFscyggZXJlZi5nZXRIb21lKCkgKTsKLQkJYm9vbGVhbiBpc1JlbW90ZU9rID0gZWpiLmdldFJlbW90ZUludGVyZmFjZU5hbWUoKS5lcXVhbHMoIGVyZWYuZ2V0UmVtb3RlKCkgKTsKLQkJCi0JCXJldHVybiBpc0hvbWVPayAmJiBpc1JlbW90ZU9rOwotCX0vLyBpc1NpbWlsYXJFSkJJbnRlcmZhY2UKLQkJCi0JLyoqCi0JICogdmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzCi0JICogCi0JICogQHBhcmFtIExpc3QgZWpiUmVmcyAtIExpc3Qgb2YgZWpiIHJlZnMuCi0JICogQHBhcmFtIFN0cmluZyB1cmkgLSBUaGUgdXJpIG9mIHRoZSBtb2R1bGUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFSkJSZWZzKExpc3QgZWpiUmVmcywgU3RyaW5nIHVyaSkgewotCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJSZWZzLnNpemUoKTsgaSsrKSB7Ci0JICAJICBFamJSZWYgZXJlZiA9IChFamJSZWYpIGVqYlJlZnMuZ2V0KGkpOwotCQkgIGlmKCBlcmVmICE9IG51bGwgJiYgZXJlZi5nZXRMaW5rKCkgIT0gbnVsbCAmJiBlcmVmLmdldExpbmsoKS5sZW5ndGgoKSA+IDApIHsKLQkJICAJRW50ZXJwcmlzZUJlYW4gZWpiID0gZWFyRmlsZS5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZiggZXJlZiwgdXJpICk7Ci0JCSAgCWlmKCBlamIgPT0gbnVsbCApIHsKLQkJICAJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQkJcGFyYW1zWzBdID0gZXJlZi5nZXROYW1lKCk7Ci0JCQkJcGFyYW1zWzFdID0gdXJpOwotCQkJCXBhcmFtc1syXSA9IGVhckZpbGUuZ2V0TmFtZSgpOwotCQkgIAkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLFVOUkVTT0xWRURfRUpCX1JFRl9XQVJOXyxwYXJhbXMpOwotCQkgIAl9IGVsc2UgewotCQkgIAkJaWYoICFpc1NpbWlsYXJFSkJJbnRlcmZhY2UoIGVyZWYsIGVqYiApICkgewotCQkgIAkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQkJCXBhcmFtc1swXSA9IGVqYi5nZXROYW1lKCk7Ci0JCQkJCXBhcmFtc1sxXSA9IGVyZWYuZ2V0TmFtZSgpOwotCQkJCQlwYXJhbXNbMl0gPSB1cmk7Ci0JCSAgCQkJYWRkRXJyb3IoIGdldEJhc2VOYW1lKCksIEVKQl9CRUFOX0VKQl9MSU5LX0lOVEVGQUNFX01JU01BVENIX0VSUk9SXywgcGFyYW1zLCBhcHBERCk7Ci0JCSAgCQl9Ci0JCSAgCX0KLQkJICB9Ci0JICB9Ci0JfQotCQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBleGlzdGFuY2Ugb2YgdGhlIEVKQiBSb2xlcyBpbiB0aGUgRUFSIFJvbGVzIGFuZCBkdXBsaWNhdGVzIGliIEVKQiBSb2xlcwotCSAqIAotCSAqIEBwYXJhbSBFTGlzdCBlYXJSb2xlTGlzdCAtIExpc3Qgb2YgZWFyIHJvbGVzLgotCSAqIEBwYXJhbSBFTGlzdCBlamJSb2xlcyAtIExpc3Qgb2YgZWpiIHJvbGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUm9sZXNXaXRoRUFSUm9sZXMoRUxpc3QgZWFyUm9sZUxpc3QsIEVMaXN0IGVqYlJvbGVzKSB7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IGVqYlJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCWlmICghKGVhclJvbGVMaXN0LmNvbnRhaW5zKGVqYlJvbGVzLmdldChpKSkpKSB7Ci0JCSAgU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1sxXTsKLQkJICBwYXJhbXNbMF0gPSAoKFNlY3VyaXR5Um9sZSkgKGVqYlJvbGVzLmdldChpKSkpLmdldFJvbGVOYW1lKCk7CQkgICAgICAgICAgCi0JCSAgYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRSwgcGFyYW1zKTsKLQkJfS8vIGlmCi0JICB9Ly8gZm9yCi0JfS8vIHZhbGlkYXRlRUpCUm9sZXNXaXRoRUFSUm9sZXMKLQkKLQkvKioKLQkgKiBGb3IgZWFjaCBtb2R1bGUsIG1ha2Ugc3VyZSBpdHMgYXJjaGl2ZSBleGlzdHMKLQkgKihhIHZlcnkgZXhwZW5zaXZlLCBidXQgbW9yZSBtZWFuaW5nZnVsIHRlc3Qgd291bGQgYmUgdG8gYWxzbyBtYWtlIHN1cmUgdGhleSBjYW4gYmUgbG9hZGVkKQotCSAqIAotCSAqIEBwYXJhbSBFTGlzdCBtb2R1bGVzTGlzdCAtIExpc3Qgb2YgbW9kdWxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTW9kdWxlcyhFTGlzdCBtb2R1bGVzTGlzdCkgewotLy8JCVN0cmluZyBlcnJvclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUhhc2hTZXQgZHVwbGljYXRlVVJJID0gbmV3IEhhc2hTZXQoKTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzTGlzdC5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIG0gPSAoTW9kdWxlKSBtb2R1bGVzTGlzdC5nZXQoaSk7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBtLmdldFVyaSgpOwotCQkJaWYgKChmaWxlbmFtZSA9PSBudWxsKSB8fCAoZmlsZW5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBNRVNTQUdFX0VBUl9OT19NT0RVTEVfVVJJLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9jaGVjayBpZiB0aGUgVVJJIGhhcyBhbnkgc3BhY2VzCi0JCQkJaWYoICBmaWxlbmFtZS5pbmRleE9mKCAiICIgKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcmFtc1swXSA9IGZpbGVuYW1lOwotCQkJCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBVUklfQ09OVEFJTlNfU1BBQ0VTX0VSUk9SXywgcGFyYW1zLCBhcHBERCk7Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gaWYKLQkJCVN0cmluZyBhbHRERCA9IG0uZ2V0QWx0REQoKTsKLQkJCWlmIChhbHRERCAhPSBudWxsKQotCQkJCWFsdEREID0gYWx0REQudHJpbSgpOwotCQkJdmFsaWRhdGVBbHRERChtLCBhbHRERCk7Ci0JCQlTdHJpbmcga2V5ID0gYWx0REQgPT0gbnVsbCA/IGZpbGVuYW1lICsgYWx0REQgOiBmaWxlbmFtZTsKLQkJCWlmICghZHVwbGljYXRlVVJJLmFkZChrZXkpKSB7Ci0JCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1syXTsKLQkJCQlwYXJhbXNbMF0gPSBtLmdldFVyaSgpOwotCQkJCXBhcmFtc1sxXSA9IGVhckZpbGUuZ2V0TmFtZSgpOwotCQkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIE1FU1NBR0VfRUFSX0RVUExJQ0FURV9VUklfRVJST1JfLCBwYXJhbXMsIGFwcEREKTsKLQkJCX0vLyBpZgotCQotCQl9Ly8gZm9yCi0JCi0JfS8vIHZhbGlkYXRlTW9kdWxlcwotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBhbHQgZGQKLQkgKiAKLQkgKiBAcGFyYW0gTW9kdWxlIG0gLSBBIG1vZHVsZS4KLQkgKiBAcGFyYW0gU3RyaW5nIGFsdEREIC0gQW4gYWx0REQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFsdEREKE1vZHVsZSBtLCBTdHJpbmcgYWx0REQpIHsKLQkJLy9pc0R1cGxpY2F0ZSB3aWxsIHRlc3QgaWYgaXQgaXMgYSBmaWxlIG9yIGEgbG9hZGVkIHJlc291cmNlCi0JCWlmICgiIi5lcXVhbHMoYWx0REQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMl07Ci0JCQlwYXJhbXNbMF0gPSBtLmdldFVyaSgpOwotCQkJcGFyYW1zWzFdID0gZWFyRmlsZS5nZXROYW1lKCk7Ci0JCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBNRVNTQUdFX0VNUFRZX0FMVF9ERF9FUlJPUl8sIHBhcmFtcywgYXBwREQpOwotCQl9IGVsc2UgaWYgKGFsdEREICE9IG51bGwgJiYgIWVhckZpbGUuaXNEdXBsaWNhdGUoYWx0REQpKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotCQkJcGFyYW1zWzBdID0gbS5nZXRVcmkoKTsKLQkJCXBhcmFtc1sxXSA9IGFsdEREOwotCQkJcGFyYW1zWzJdID0gZWFyRmlsZS5nZXROYW1lKCk7Ci0JCQlhZGRXYXJuaW5nKGdldEJhc2VOYW1lKCksIE1FU1NBR0VfSU5WQUxJRF9BTFRfRERfV0FSTl8sIHBhcmFtcywgYXBwREQpOwotCQl9Ly8gaWYKLQl9Ly8gdmFsaWRhdGVBbHRERAotCQotCS8qKgotCSAqIHZhbGlkYXRlIEVKQiBhbmQgcmVzb3VyY2UgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUmVmcygpIHsKLQkJTGlzdCBtb2R1bGVMaXN0ID0gZWFyRmlsZS5nZXRNb2R1bGVSZWZzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCi0JCQlNb2R1bGVSZWYgcmVmID0gKE1vZHVsZVJlZikgbW9kdWxlTGlzdC5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWlmKHJlZi5pc1dlYigpKSB7Ci0JCQkJCXZhbGlkYXRlV2ViQXBwUmVmcyhyZWYpOwkJCQl9ICAKLQkJCQllbHNlIGlmKCByZWYuaXNFSkIoKSApIHsKLQkJCQkgICAgdmFsaWRhdGVFSkJNb2R1bGVSZWZzKHJlZik7Ci0JCQkJfSBlbHNlIGlmKHJlZi5pc0NsaWVudCgpKQotCQkJCQl2YWxpZGF0ZUFwcENsaWVudFJlZnMocmVmKTsKLQkJCX0gY2F0Y2ggKEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4LmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQkJCWlmICghKG5lc3RlZCBpbnN0YW5jZW9mIE5vTW9kdWxlRmlsZUV4Y2VwdGlvbikpIAotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCS8vb3RoZXJ3aXNlIGlnbm9yZSBpdDsgdGhlcmUgYXJlIG90aGVyIHZhbGlkYXRpb25zIGZvciB0aGlzCi0JCQl9IAotCQkJCi0JCX0KLQl9CQotCQotCS8qKgotCSAqIEBwYXJhbSByZWYKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVBcHBDbGllbnRSZWZzKE1vZHVsZVJlZiByZWYpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50IGFwcENsaWVudCA9IChBcHBsaWNhdGlvbkNsaWVudEltcGwpcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCUxpc3QgZWpiUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgZWpiUmVmcy5hZGRBbGwoYXBwQ2xpZW50LmdldEVqYlJlZmVyZW5jZXMoKSk7Ci0JCXZhbGlkYXRlRUpCUmVmTWFuZGF0b3J5RWxlbWVudHMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKLQkJdmFsaWRhdGVFSkJSZWZzKGVqYlJlZnMsIHJlZi5nZXRVcmkoKSk7Ci0JCWlmIChhcHBDbGllbnQgIT0gbnVsbCAmJiBhcHBDbGllbnQuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpIHsKLQkJCVNldCBhbGxSZWZzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUxpc3QgcmVzb3VyY2VSZWZzID0gYXBwQ2xpZW50LmdldFJlc291cmNlUmVmcygpOwotCQkJTGlzdCByZXNvdXJjZUVudlJlZnMgPSBhcHBDbGllbnQuZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQlMaXN0IHNlcnZpY2VSZWZzID0gYXBwQ2xpZW50LmdldFNlcnZpY2VSZWZzKCk7Ci0JCQkgICAgCi0JCQl2YWxpZGF0ZUR1cGxpY2F0ZUVKQlJlZnMoYWxsUmVmcyxlamJSZWZzKTsKLQkJCXZhbGlkYXRlRHVwbGljYXRlUmVzb3VyY2VSZWZzKGFsbFJlZnMscmVzb3VyY2VSZWZzKTsKLQkJCXZhbGlkYXRlRHVwbGljYXRlUmVzb3VyY2VFbnZSZWZzKGFsbFJlZnMscmVzb3VyY2VFbnZSZWZzKTsKLQkJCXZhbGlkYXRlRHVwbGljYXRlU2VydmljZVJlZnMoYWxsUmVmcyxzZXJ2aWNlUmVmcyk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZgotCSAqIEB0aHJvd3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVXZWJBcHBSZWZzKE1vZHVsZVJlZiByZWYpIHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKXJlZi5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlMaXN0IGVqYlJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIGVqYlJlZnMuYWRkQWxsKHdlYkFwcC5nZXRFamJSZWZzKCkpOwotCSAgICBlamJSZWZzLmFkZEFsbCh3ZWJBcHAuZ2V0RWpiTG9jYWxSZWZzKCkpOwotCQl2YWxpZGF0ZUVKQlJlZk1hbmRhdG9yeUVsZW1lbnRzKGVqYlJlZnMsIHJlZi5nZXRVcmkoKSk7Ci0JCXZhbGlkYXRlRUpCUmVmcyhlamJSZWZzLCByZWYuZ2V0VXJpKCkpOwotCQlpZiAod2ViQXBwICE9IG51bGwgJiYgd2ViQXBwLmdldFZlcnNpb25JRCgpIDw9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpIHsKLQkJCVNldCBhbGxSZWZzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUxpc3QgcmVzb3VyY2VSZWZzID0gd2ViQXBwLmdldFJlc291cmNlUmVmcygpOwotCQkJTGlzdCByZXNvdXJjZUVudlJlZnMgPSB3ZWJBcHAuZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQlMaXN0IHNlcnZpY2VSZWZzID0gd2ViQXBwLmdldFNlcnZpY2VSZWZzKCk7Ci0JCQkKLQkJCXZhbGlkYXRlRHVwbGljYXRlRUpCUmVmcyhhbGxSZWZzLGVqYlJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZVJlZnMoYWxsUmVmcyxyZXNvdXJjZVJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZUVudlJlZnMoYWxsUmVmcyxyZXNvdXJjZUVudlJlZnMpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVTZXJ2aWNlUmVmcyhhbGxSZWZzLHNlcnZpY2VSZWZzKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAcGFyYW0gcmVmCi0JICogQHRocm93cyBBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUVKQk1vZHVsZVJlZnMoTW9kdWxlUmVmIHJlZikgdGhyb3dzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIHsKLQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpcmVmLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCWlmKCBlamJKYXIgIT0gbnVsbCApIHsKLQkJCUxpc3QgZWpiQ29sbGVjdGlvbiA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsJCQkKLQkJCWlmKCBlamJDb2xsZWN0aW9uICE9IG51bGwgfHwgIWVqYkNvbGxlY3Rpb24uaXNFbXB0eSgpICkgewotCQkJCVJlc291cmNlIHJlcyA9IGVqYkphci5lUmVzb3VyY2UoKTsKLQkJCQljbGVhblVwQWxsUmVmU3ViVGFza01lc3NhZ2VzKHJlcyk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJDb2xsZWN0aW9uLml0ZXJhdG9yKCk7CQotCQkJCXdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSB7Ci0JCQkJCUVudGVycHJpc2VCZWFuIGVqYkJlYW4gPSAoRW50ZXJwcmlzZUJlYW4paXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiggZWpiQmVhbiAhPSBudWxsICkgewotCQkJCQkgICAgTGlzdCBlamJSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkgICAgZWpiUmVmcy5hZGRBbGwoZWpiQmVhbi5nZXRFamJSZWZzKCkpOwotCQkJCQkgICAgZWpiUmVmcy5hZGRBbGwoZWpiQmVhbi5nZXRFamJMb2NhbFJlZnMoKSk7Ci0JCQkJCQl2YWxpZGF0ZUVKQlJlZk1hbmRhdG9yeUVsZW1lbnRzKGVqYlJlZnMsIHJlZi5nZXRVcmkoKSk7Ci0JCQkJCQl2YWxpZGF0ZUVKQlJlZnMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKLQkJCQkJCWlmKGVqYkphci5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0JCQkJCQkJU2V0IGFsbFJlZnMgPSBuZXcgSGFzaFNldCgpOwotCQkJCQkJCUxpc3QgcmVzb3VyY2VSZWZzID0gZWpiQmVhbi5nZXRSZXNvdXJjZVJlZnMoKTsKLQkJCQkJCQlMaXN0IHJlc291cmNlRW52UmVmcyA9IGVqYkJlYW4uZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQkJCQkJTGlzdCBzZWNSb2xlUmVmcyA9IGVqYkJlYW4uZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJCQkJCUxpc3Qgc2VydmljZVJlZnMgPSBlamJCZWFuLmdldFNlcnZpY2VSZWZzKCk7Ci0JCQkJCQkJTGlzdCBtZXNzYWdlRGVzdFJlZnMgPSBlamJCZWFuLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCQkJCQkgICAgCi0JCQkJCQkJdmFsaWRhdGVEdXBsaWNhdGVFSkJSZWZzKGFsbFJlZnMsZWpiUmVmcyk7Ci0JCQkJCQkJdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZVJlZnMoYWxsUmVmcyxyZXNvdXJjZVJlZnMpOwotCQkJCQkJCXZhbGlkYXRlRHVwbGljYXRlUmVzb3VyY2VFbnZSZWZzKGFsbFJlZnMscmVzb3VyY2VFbnZSZWZzKTsKLQkJCQkJCQl2YWxpZGF0ZUR1cGxpY2F0ZVNlY3VyaXR5Um9sZVJlZnMoYWxsUmVmcyxzZWNSb2xlUmVmcyk7Ci0JCQkJCQkJdmFsaWRhdGVEdXBsaWNhdGVTZXJ2aWNlUmVmcyhhbGxSZWZzLHNlcnZpY2VSZWZzKTsKLQkJCQkJCQl2YWxpZGF0ZUR1cGxpY2F0ZU1lc3NhZ2VEZXN0UmVmcyhhbGxSZWZzLG1lc3NhZ2VEZXN0UmVmcyk7Ci0JCQkJCSAgIH0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCSAKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWxsUmVmcwotCSAqIEBwYXJhbSBzZXJ2aWNlUmVmcwotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZVNlcnZpY2VSZWZzKFNldCBhbGxSZWZzLCBMaXN0IHNlcnZpY2VSZWZzKSB7Ci0JCWlmICghc2VydmljZVJlZnMuaXNFbXB0eSgpKSB7Ci0JCQlTZXJ2aWNlUmVmIGZpcnN0UmVmID0gKFNlcnZpY2VSZWYpKHNlcnZpY2VSZWZzLmdldCgwKSk7Ci0JCWlmKCEoZmlyc3RSZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pKQotCQkJY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhmaXJzdFJlZik7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBzZXJ2aWNlUmVmcy5zaXplKCk7IHJlZk5vKyspIHsKLQkJCVNlcnZpY2VSZWYgcmVmID0gKFNlcnZpY2VSZWYpIChzZXJ2aWNlUmVmcy5nZXQocmVmTm8pKTsKLQkJCVN0cmluZyByZWZOYW1lID0gcmVmLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShhbGxSZWZzLmFkZChyZWZOYW1lKSkpCi0JCQkgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfU0VSVklDRVJFRiwgcGFybXMscmVmLFNFUlZJQ0VfUkVGX0dST1VQX05BTUUpOwotCQl9Ci0JICB9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFsbFJlZnMKLQkgKiBAcGFyYW0gc2VjUm9sZVJlZnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVTZWN1cml0eVJvbGVSZWZzKFNldCBhbGxSZWZzLCBMaXN0IHNlY1JvbGVSZWZzKSB7Ci0JCWlmICghc2VjUm9sZVJlZnMuaXNFbXB0eSgpKSB7Ci0JCQlTZWN1cml0eVJvbGVSZWYgZmlyc3RSZWYgPSAoU2VjdXJpdHlSb2xlUmVmKShzZWNSb2xlUmVmcy5nZXQoMCkpOwotCQlpZighKGZpcnN0UmVmLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSkKLQkJCWNsZWFuVXBTdWJUYXNrTWVzc2FnZXMoZmlyc3RSZWYpOwotCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgc2VjUm9sZVJlZnMuc2l6ZSgpOyByZWZObysrKSB7Ci0JCQlTZWN1cml0eVJvbGVSZWYgcmVmID0gKFNlY3VyaXR5Um9sZVJlZikgKHNlY1JvbGVSZWZzLmdldChyZWZObykpOwotCQkJU3RyaW5nIHJlZk5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJcGFybXNbMF0gPSByZWZOYW1lOwotCQkJaWYgKCEoYWxsUmVmcy5hZGQocmVmTmFtZSkpKQotCQkJICBhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfRFVQTElDQVRFX1NFQ1VSSVRZUk9MRVJFRiwgcGFybXMscmVmLFNFQ19ST0xFX1JFRl9HUk9VUF9OQU1FKTsKLQkJfQotCSAgfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbGxSZWZzCi0JICogQHBhcmFtIHJlc291cmNlRW52UmVmcwotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZVJlc291cmNlRW52UmVmcyhTZXQgYWxsUmVmcywgTGlzdCByZXNvdXJjZUVudlJlZnMpIHsKLQkJaWYgKCFyZXNvdXJjZUVudlJlZnMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZUVudlJlZiBmaXJzdFJlZiA9IChSZXNvdXJjZUVudlJlZikocmVzb3VyY2VFbnZSZWZzLmdldCgwKSk7Ci0JCWlmKCEoZmlyc3RSZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pKQotCQkJY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhmaXJzdFJlZik7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCByZXNvdXJjZUVudlJlZnMuc2l6ZSgpOyByZWZObysrKSB7Ci0JCQlSZXNvdXJjZUVudlJlZiByZWYgPSAoUmVzb3VyY2VFbnZSZWYpIChyZXNvdXJjZUVudlJlZnMuZ2V0KHJlZk5vKSk7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShhbGxSZWZzLmFkZChyZWZOYW1lKSkpCi0JCQkgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTRU5WUkVGLCBwYXJtcyxyZWYsUkVTX0VOVl9SRUZfR1JPVVBfTkFNRSk7Ci0JCX0KLQkgIH0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWxsUmVmcwotCSAqIEBwYXJhbSByZXNvdXJjZVJlZnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVSZXNvdXJjZVJlZnMoU2V0IGFsbFJlZnMsIExpc3QgcmVzb3VyY2VSZWZzKSB7Ci0JCWlmICghcmVzb3VyY2VSZWZzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VSZWYgZmlyc3RSZWYgPSAoUmVzb3VyY2VSZWYpKHJlc291cmNlUmVmcy5nZXQoMCkpOwotCQlpZighKGZpcnN0UmVmLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSkKLQkJCWNsZWFuVXBTdWJUYXNrTWVzc2FnZXMoZmlyc3RSZWYpOwotCQlmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgcmVzb3VyY2VSZWZzLnNpemUoKTsgcmVmTm8rKykgewotCQkJUmVzb3VyY2VSZWYgcmVmID0gKFJlc291cmNlUmVmKSAocmVzb3VyY2VSZWZzLmdldChyZWZObykpOwotCQkJU3RyaW5nIHJlZk5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJcGFybXNbMF0gPSByZWZOYW1lOwotCQkJaWYgKCEoYWxsUmVmcy5hZGQocmVmTmFtZSkpKQotCQkJICBhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfRFVQTElDQVRFX1JFU1JFRiwgcGFybXMscmVmLFJFU19SRUZfR1JPVVBfTkFNRSk7Ci0JCX0KLQkgIH0KLQl9Ci0JLyoqCi0JICogQHBhcmFtIGFsbFJlZnMKLQkgKiBAcGFyYW0gZWpiUmVmcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlRUpCUmVmcyhTZXQgYWxsUmVmcywgTGlzdCBlamJSZWZzKSB7Ci0JCWlmICghZWpiUmVmcy5pc0VtcHR5KCkpIHsKLQkJCUVqYlJlZiBmaXJzdFJlZiA9IChFamJSZWYpKGVqYlJlZnMuZ2V0KDApKTsKLQkJaWYoIShmaXJzdFJlZi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikpCi0JCQljbGVhblVwU3ViVGFza01lc3NhZ2VzKGZpcnN0UmVmKTsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IGVqYlJlZnMuc2l6ZSgpOyByZWZObysrKSB7Ci0JCQlFamJSZWYgcmVmID0gKEVqYlJlZkltcGwpIChlamJSZWZzLmdldChyZWZObykpOwotCQkJU3RyaW5nIHJlZk5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJcGFybXNbMF0gPSByZWZOYW1lOwotCQkJaWYgKCEoYWxsUmVmcy5hZGQocmVmTmFtZSkpKQotCQkJICBhZGRFcnJvcihFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfRFVQTElDQVRFX0VKQlJFRiwgcGFybXMsIHJlZiwgRUpCX1JFRl9HUk9VUF9OQU1FKTsKLQkJIH0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYWxsUmVmcwotCSAqIEBwYXJhbSBlamJSZWZzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVNZXNzYWdlRGVzdFJlZnMoU2V0IGFsbFJlZnMsIExpc3QgbWVzc2FnZURlc3RSZWZzKSB7Ci0JCWlmICghbWVzc2FnZURlc3RSZWZzLmlzRW1wdHkoKSkgewotCQkJTWVzc2FnZURlc3RpbmF0aW9uUmVmIGZpcnN0UmVmID0gKE1lc3NhZ2VEZXN0aW5hdGlvblJlZikobWVzc2FnZURlc3RSZWZzLmdldCgwKSk7Ci0JCWlmKCEoZmlyc3RSZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pKQotCQkJY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhmaXJzdFJlZik7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBtZXNzYWdlRGVzdFJlZnMuc2l6ZSgpOyByZWZObysrKSB7Ci0JCQlNZXNzYWdlRGVzdGluYXRpb25SZWYgcmVmID0gKE1lc3NhZ2VEZXN0aW5hdGlvblJlZikgKG1lc3NhZ2VEZXN0UmVmcy5nZXQocmVmTm8pKTsKLQkJCVN0cmluZyByZWZOYW1lID0gcmVmLmdldE5hbWUoKTsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gcmVmTmFtZTsKLQkJCWlmICghKGFsbFJlZnMuYWRkKHJlZk5hbWUpKSkKLQkJCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGLCBwYXJtcyxyZWYsIE1FU1NBR0VfUkVGX0dST1VQX05BTUUpOwotCQkgfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpcnN0UmVmCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhFT2JqZWN0IHJlZikgewotCQkvL05vIE9wIC0gc3ViY2xhc3Mgb3ZlcnJpZGVzIAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwQWxsUmVmU3ViVGFza01lc3NhZ2VzKFJlc291cmNlIHJlcykgewotCQkvL05vIE9wIC0gc3ViY2xhc3Mgb3ZlcnJpZGVzIAotCX0KLQotCS8qKgotCSAqIEVqYiByZWZzIHRvIHRoZSBydW5uaW5nIGxpc3Qgb2YgZWpiIHJlZnMuCi0JICogCi0JICogQHBhcmFtIExpc3QgY3VycmVudFJlZnMgLSBMaXN0IG9mIGN1cnJlbnQgZWpiIHJlZnMgdG8gYmUgYWRkZWQuCi0JICogQHBhcmFtIExpc3QgZWpiUmVmcyAtIGNvbGxlY3Rpb24gb2YgcnVubmluZyBlamJyZWZzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRUpCUmVmcyggTGlzdCBjdXJyZW50UmVmcywgTGlzdCBlamJSZWZzICkgewkJCi0JCWlmKCBjdXJyZW50UmVmcyA9PSBudWxsIHx8IGVqYlJlZnMgPT0gbnVsbCApCi0JCQlyZXR1cm47Ci0JCQotCQllamJSZWZzLmFkZEFsbCggY3VycmVudFJlZnMgKTsJCQkJCQkJCQkKLQl9Ly8gYWRkRUpCUmVmcwotCi0JLyoqCi0JICogdmFsaWRhdGUgc2VjdXJpdHkgY29uc3RyYWludHMsIHJvbGVzLCBhbmQgc2VjdXJpdHkgcm9sZSByZWZzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlU2VjdXJpdHkoKSB7Ci0JCUVMaXN0IGVhclJvbGVMaXN0ID0gYXBwREQuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQlpZiAoIWVhclJvbGVMaXN0LmlzRW1wdHkoKSkKLQkJCXZhbGlkYXRlRWFyUm9sZXMoZWFyUm9sZUxpc3QpOwotCQlFTGlzdCBtb2R1bGVMaXN0ID0gYXBwREQuZ2V0TW9kdWxlcygpOwotCQlpZiAoIW1vZHVsZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlNb2R1bGUgbSA9IChNb2R1bGUpIG1vZHVsZUxpc3QuZ2V0KGkpOwotCQkJCWlmIChtLmlzRWpiTW9kdWxlKCkpIHsKLQkJCQkJRUxpc3QgZWpiUm9sZXMgPSBtLmdldEFwcGxpY2F0aW9uKCkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJCQlpZiAoIWVqYlJvbGVzLmlzRW1wdHkoKSkKLQkJCQkJCXZhbGlkYXRlRUpCUm9sZXNXaXRoRUFSUm9sZXMoZWFyUm9sZUxpc3QsIGVqYlJvbGVzKTsKLQkJCQl9Ly8gaWYKLQkJCQlpZiAobS5pc1dlYk1vZHVsZSgpKSB7Ci0JCQkJCUVMaXN0IHdlYlJvbGVzID0gbS5nZXRBcHBsaWNhdGlvbigpLmdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCQkJaWYgKCF3ZWJSb2xlcy5pc0VtcHR5KCkpCi0JCQkJCQl2YWxpZGF0ZVdFQlJvbGVzV2l0aEVBUlJvbGVzKGVhclJvbGVMaXN0LCB3ZWJSb2xlcyk7Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gZm9yCi0JCX0vLyBpZgotCX0vLyB2YWxpZGF0ZVNlY3VyaXR5Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIGFuIGVhciBmb3IgZHVwbGljYXRlIHdlYiBjb250ZXh0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVdlYkNvbnRleHRzKCkgewotCQkKLQkJRUxpc3QgbW9kdWxlTGlzdCA9IGFwcERELmdldE1vZHVsZXMoKTsKLQkgIAlNYXAgdmlzaXRlZFdlYkNvbnRleHQgPSBuZXcgSGFzaE1hcCgpOwotCSAgCQotCSAgCWlmKCAhbW9kdWxlTGlzdC5pc0VtcHR5KCkgKSB7CQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlTGlzdC5pdGVyYXRvcigpOwkJCi0JCQl3aGlsZSggaXRlcmF0b3IuaGFzTmV4dCgpICkgewotCQkgIAkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpaXRlcmF0b3IubmV4dCgpOwotCQkgIAkJaWYoIG1vZHVsZS5pc1dlYk1vZHVsZSgpICkgewotCQkgIAkJCQotCQkgIAkJCVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoV2ViTW9kdWxlKW1vZHVsZTsKLQkJCSAgCQkJCi0JCQkgIAkJaWYoIHdlYk1vZHVsZSAhPSBudWxsICkgewotCQkJICAJCQlpZiggdmlzaXRlZFdlYkNvbnRleHQuY29udGFpbnNLZXkoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpICkgKSB7Ci0JCQkgIAkJCQlXZWJNb2R1bGUgdGVtcFdlYk1vZHVsZSA9IChXZWJNb2R1bGUpdmlzaXRlZFdlYkNvbnRleHQuZ2V0KCB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKSApOwotCQkJCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0JCQkJCQkJcGFyYW1zWzBdID0gd2ViTW9kdWxlLmdldENvbnRleHRSb290KCk7Ci0JCQkJCQkJcGFyYW1zWzFdID0gd2ViTW9kdWxlLmdldFVyaSgpOwotCQkJCQkJCXBhcmFtc1syXSA9IHRlbXBXZWJNb2R1bGUuZ2V0VXJpKCk7Ci0JCQkgIAkJCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBNRVNTQUdFX0VBUl9EVVBJQ0FURV9ST09UQ09OVEVYVF9FUlJPUl8sIHBhcmFtcywgYXBwREQpOwotCQkJICAJCQl9IGVsc2UgewotCQkJICAJCQkJdmlzaXRlZFdlYkNvbnRleHQucHV0KCB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKSwgd2ViTW9kdWxlICk7Ci0JCQkgIAkJCX0vLyBpZgotCQkJICAJCQkJCi0JCQkgIAkJfS8vIGlmCi0JCSAgCQkJCi0JCSAgCQl9Ly8gaWYKLQkJCX0vLyB3aGlsZQotCSAgCX0vLyBpZgotCX0vLyB2YWxpZGF0ZVdlYkNvbnRleHRzCi0JCi0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBtb2R1bGVzIGFyZSBhIHNwZWMgbGV2ZWwgdG9vIGhpZ2ggZm9yIHRoZSBFQVIgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTcGVjTGV2ZWwoKSB7Ci0JCWludCBlYXJWZXJzaW9uID0gZ2V0VmVyc2lvbklEKGVhckZpbGUpOwotCQlMaXN0IG1vZHVsZXMgPSBlYXJGaWxlLmdldE1vZHVsZUZpbGVzKCk7Ci0JCQotCQlpZiggIW1vZHVsZXMuaXNFbXB0eSgpICkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVzLml0ZXJhdG9yKCk7Ci0JCQlNb2R1bGVGaWxlIG1vZHVsZUZpbGUgPSBudWxsOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkgIAkJbW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKWl0ZXJhdG9yLm5leHQoKTsKLQkJICAJCWlmIChtb2R1bGVGaWxlICE9IG51bGwgJiYgZ2V0VmVyc2lvbklEKG1vZHVsZUZpbGUpID4gZWFyVmVyc2lvbikgewotCQkJICAJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbXSB7bW9kdWxlRmlsZS5nZXRVUkkoKSwgZWFyRmlsZS5nZXROYW1lKCl9OwotCQkJCQlhZGRXYXJuaW5nKGdldEJhc2VOYW1lKCksIE1FU1NBR0VfSU5DT01QQVRJQkxFX1NQRUNfV0FSTklOR18sIHBhcmFtcywgYXBwREQpOwotCQkgIAkJfQotCQkJfQkJICAJCQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbW9kdWxlRmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRWZXJzaW9uSUQoTW9kdWxlRmlsZSBtb2R1bGVGaWxlKSB7Ci0JCVhNTFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXMgPSAoWE1MUmVzb3VyY2UpIG1vZHVsZUZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQl9IGNhdGNoIChSZXNvdXJjZUxvYWRFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsJCi0JCQkvL0lnbm9yZQotCQl9Ci0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCXJldHVybiByZXMuZ2V0SjJFRVZlcnNpb25JRCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotfS8vIEVhclZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMTFWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMTFWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU1ZmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbnRlcnByaXNlQmVhbjExVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVqYi1qYXIueG1sIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIDE1LjIuNS4zIERlY2xhcmF0aW9uIG9mIHNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZWQgZnJvbSB0aGUgYmVhbidzIGNvZGUKLSAqIFRoZSBCZWFuIFByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNsYXJpbmcgaW4gdGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ktbWVudAotICogZGVzY3JpcHRvciBhbGwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZXMgdXNlZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuIERlY2xhcmluZyB0aGUgc2VjdXJpdHkgcm9sZXMKLSAqIHJlZmVyZW5jZXMgaW4gdGhlIGNvZGUgYWxsb3dzIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgb3IgRGVwbG95ZXIgdG8gbGluayB0aGUgbmFtZXMgb2YgdGhlIHNlY3VyaXR5Ci0gKiByb2xlcyB1c2VkIGluIHRoZSBjb2RlIHRvIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGZvciBhbiBhc3NlbWJsZWQgYXBwbGljYXRpb24gdGhyb3VnaCB0aGUgc2VjdS1yaXR5LQotICogcm9sZSBlbGVtZW50cy4KLSAqIFRoZSBCZWFuIFByb3ZpZGVyIG11c3QgZGVjbGFyZSBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlZCBpbiB0aGUgY29kZSB1c2luZyB0aGUgc2VjdS1yaXR5LQotICogcm9sZS1yZWYgZWxlbWVudCBhcyBmb2xsb3dzOgotICogICAgICBEZWNsYXJlIHRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSByb2xlIHVzaW5nIHRoZSByb2xlLW5hbWUgZWxlbWVudC4gVGhlIG5hbWUgbXVzdCBiZSB0aGUKLSAqIHNlY3VyaXR5IHJvbGUgbmFtZSB0aGF0IGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIGlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlLU5hbWUpCi0gKiBtZXRob2QuCi0gKiAgICAgIE9wdGlvbmFsOiBQcm92aWRlIGEgZGVzY3JpcHRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgaW4gdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQuCi0gKiBBIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlLCBpbmNsdWRpbmcgdGhlIG5hbWUgZGVmaW5lZCBieSB0aGUgcm9sZS1uYW1lIGVsZW1lbnQsIGlzIHNjb3BlZCB0byB0aGUgc2VzLXNpb24KLSAqIG9yIGVudGl0eSBiZWFuIGVsZW1lbnQgd2hvc2UgZGVjbGFyYXRpb24gY29udGFpbnMgdGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQuCi0gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IGFuIGVudGVycHJpc2UgYmVhbidzIHJlZmVyZW5jZXMgdG8gc2VjdXJpdHkgcm9sZXMgYXJlIGRlY2xhcmVkIGluCi0gKiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogICAgLi4uCi0gKiAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgICAgIC4uLgotICogICAgICAgPGVudGl0eT4KLSAqICAgICAgICAgIDxlamItbmFtZT5BYXJkdmFya1BheXJvbGw8L2VqYi1uYW1lPgotICogICAgICAgICAgPGVqYi1jbGFzcz5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsQmVhbjwvZWpiLWNsYXNzPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gKiAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICAgICAgVGhpcyBzZWN1cml0eSByb2xlIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICBlbXBsb3llZXMgb2YgdGhlIHBheXJvbGwgZGVwYXJ0bWVudCB3aG8gYXJlCi0gKiAgICAgICAgICAgICAgICAgYWxsb3dlZCB0byB1cGRhdGUgZW1wbG95ZWVzJyBzYWxhcmllcy4KLSAqICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICA8cm9sZS1uYW1lPnBheXJvbGw8L3JvbGUtbmFtZT4KLSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gKiAgICAgICAgICAuLi4KLSAqICAgICAgIDwvZW50aXR5PgotICogICAgICAgLi4uCi0gKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gKiAgICAuLi4KLSAqCi0gKiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFib3ZlIGluZGljYXRlcyB0aGF0IHRoZSBlbnRlcnByaXNlIGJlYW4gQWFyZHZhcmtQYXlyb2xsIG1ha2VzIHRoZQotICogc2VjdXJpdHkgY2hlY2sgdXNpbmcgaXNDYWxsZXJJblJvbGUoInBheXJvbGwiKSBpbiBpdHMgYnVzaW5lc3MgbWV0aG9kLgotICoKLSAqCi0gKiAxNS4zLjMgTGlua2luZyBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMgdG8gc2VjdXJpdHkgcm9sZXMKLSAqIElmIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgZGVmaW5lcyB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBoZQotICogb3Igc2hlIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGxpbmtpbmcgYWxsIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMgZGVjbGFyZWQgaW4gdGhlIHNlY3Utcml0eS0KLSAqIHJvbGUtcmVmIGVsZW1lbnRzIHRvIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotICogVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBsaW5rcyBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEgc2VjdXJpdHkgcm9sZSB1c2luZyB0aGUgcm9sZS1saW5rCi0gKiBlbGVtZW50LiBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluCi0gKiBhIHNlY3VyaXR5LXJvbGUgZWxlbWVudC4KLSAqIEEgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB1c2VkIGV2ZW4gaWYgdGhlIHZhbHVlIG9mIHJvbGUtbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgb2YgdGhlCi0gKiByb2xlLWxpbmsgcmVmZXJlbmNlLgotICogVGhlIGZvbGxvd2luZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZXhhbXBsZSBzaG93cyBob3cgdG8gbGluayB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgbmFtZWQKLSAqIHBheXJvbGwgdG8gdGhlIHNlY3VyaXR5IHJvbGUgbmFtZWQgcGF5cm9sbC1kZXBhcnRtZW50LgotICogICAgLi4uCi0gKiAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgICAgIC4uLgotICogICAgICAgPGVudGl0eT4KLSAqICAgICAgICAgIDxlamItbmFtZT5BYXJkdmFya1BheXJvbGw8L2VqYi1uYW1lPgotICogICAgICAgICAgPGVqYi1jbGFzcz5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsQmVhbjwvZWpiLWNsYXNzPgotICogICAgICAgICAgLi4uCi0gKiAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gKiAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICAgICBUaGlzIHJvbGUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZQotICogICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQuCi0gKiAgICAgICAgICAgICAgICBNZW1iZXJzIG9mIHRoaXMgcm9sZSBoYXZlIGFjY2VzcyB0bwotICogICAgICAgICAgICAgICAgYW55b25lJ3MgcGF5cm9sbCByZWNvcmQuCi0gKgotICogICAgICAgICAgICAgICAgVGhlIHJvbGUgaGFzIGJlZW4gbGlua2VkIHRvIHRoZQotICogICAgICAgICAgICAgICAgcGF5cm9sbC1kZXBhcnRtZW50IHJvbGUuCi0gKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICogICAgICAgICAgICAgPHJvbGUtbmFtZT5wYXlyb2xsPC9yb2xlLW5hbWU+Ci0gKiAgICAgICAgICAgICA8cm9sZS1saW5rPnBheXJvbGwtZGVwYXJ0bWVudDwvcm9sZS1saW5rPgotICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAqICAgICAgICAgIC4uLgotICogICAgICAgPC9lbnRpdHk+Ci0gKiAgICAgICAuLi4KLSAqICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAqICAgIC4uLgotICovCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUJlYW4xMVZSdWxlIGV4dGVuZHMgQVZhbGlkYXRpb25SdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9FTlRFUlBSSVNFQkVBTjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfS0VZQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBMaXN0IF9zZWN1cml0eVJvbGVzID0gbnVsbDsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDEsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAyX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDJfTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMl9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDJfVU5OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAzX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDNfTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwM19VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDNfVU5OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA0X05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDRfTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDRfVU5OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA2LCBuZXcgU3RyaW5nW117Q0hLSjI4MDYgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNywgbmV3IFN0cmluZ1tde0NIS0oyODA3ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDgsIG5ldyBTdHJpbmdbXXtDSEtKMjgwOCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA5LCBuZXcgU3RyaW5nW117Q0hLSjI4MDkgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODEwX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTBfTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTBfVU5OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODExX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTFfTkFNRUQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMV9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTFfVU5OQU1FRCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODEyLCBuZXcgU3RyaW5nW117Q0hLSjI4MTIgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIwLCBuZXcgU3RyaW5nW117Q0hLSjI4MjAgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMiwgbmV3IFN0cmluZ1tde0NIS0oyODIyICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMyArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI0LCBuZXcgU3RyaW5nW117Q0hLSjI4MjQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNywgbmV3IFN0cmluZ1tde0NIS0oyODI3ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjgyOCArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzAsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMCArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMxLCBuZXcgU3RyaW5nW117Q0hLSjI4MzEgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMiwgbmV3IFN0cmluZ1tde0NIS0oyODMyICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMyArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM0LCBuZXcgU3RyaW5nW117Q0hLSjI4MzQgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNSwgbmV3IFN0cmluZ1tde0NIS0oyODM1ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzYsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNiArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM3LCBuZXcgU3RyaW5nW117Q0hLSjI4MzcgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzOCwgbmV3IFN0cmluZ1tde0NIS0oyODM4ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzksIG5ldyBTdHJpbmdbXXtDSEtKMjgzOSArIFNQRUN9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0MCwgbmV3IFN0cmluZ1tde0NIS0oyODQwICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjg1Mn0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA4LCBuZXcgU3RyaW5nW117Q0hLSjI5MDggKyBTUEVDfSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQkvLyBJZiBjYWxsZWQgYXMgYSBkZXBlbmRlbnQsIHBhcmVudCB3aWxsIGJlIHRoaXMgRW50ZXJwcmlzZUJlYW4uCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogNi41LjMgVGhlIG9wdGlvbmFsIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlCi0JICouLi4KLQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCSAqIGltcGxlbWVudCB0aGUgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0JICouLi4KLQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkgKiBzeW5jaHJvbml6YXRpb24gY2FsbCBiYWNrcyBiZWNhdXNlIHRoZSBiZWFuIGlzIGluIGNvbnRyb2wgb2YgdGhlIGNvbW1pdCB0aGUgYmVhbiAKLQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkU2Vzc2lvblR5cGVFbGVtZW50KFNlc3Npb24gc2Vzc2lvbikgewotCQkvLyBjaGVjayBzeW50YXgKLQkJaWYgKCFzZXNzaW9uLmlzU2V0U2Vzc2lvblR5cGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKS5nZXRWYWx1ZSgpID09IFNlc3Npb25UeXBlLlNUQVRFRlVMKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChzZXNzaW9uLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUxFU1MpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkVHJhbnNhY3Rpb25UeXBlRWxlbWVudChTZXNzaW9uIHNlc3Npb25CZWFuKSB7Ci0JCWlmICghc2Vzc2lvbkJlYW4uaXNTZXRUcmFuc2FjdGlvblR5cGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKHNlc3Npb25CZWFuLmdldFRyYW5zYWN0aW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gVHJhbnNhY3Rpb25UeXBlLkJFQU4pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHNlc3Npb25CZWFuLmdldFRyYW5zYWN0aW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gVHJhbnNhY3Rpb25UeXBlLkNPTlRBSU5FUikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIElmIHRoZSBiZWFuIGNvbXBvbmVudHMgKGhvbWUgaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLCBiZWFuIGNsYXNzLCBhbmQgcHJpbWFyeQotCSAqIGtleSkgY2FuIGFsbCBiZSBmb3VuZCBhbmQgcmVmbGVjdGVkLCByZXR1cm4gdHJ1ZS4gRWxzZSwgYWRkIGEgdmFsaWRhdGlvbiBlcnJvcgotCSAqIGFnYWluc3QgdGhlIGJlYW4sIGFuZCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCZWFuQ29tcG9uZW50cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBpZiB0aGUgYmVhbiBpcyBudWxsLCBiZWNhdXNlIHRoaXMgbWV0aG9kIHdpbGwKLQkJLy8gbm90IGJlIGNhbGxlZCBpZiBpdCBpcy4KLQkJdHJ5IHsKLQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldEVqYkNsYXNzKCkpOwotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlpZiAoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fRWpiQ2xhc3MoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAyX05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwMl9VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJaWYgKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAzX05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IGJlYW4uZ2V0SG9tZUludGVyZmFjZU5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAzX1VOTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCWlmIChiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA0X05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDRfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJSmF2YUNsYXNzIHByaW1hcnlLZXkgPSAoKEVudGl0eSkgYmVhbikuZ2V0UHJpbWFyeUtleSgpOwotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgcHJpbWFyeUtleSk7Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCWlmICgoKEVudGl0eSkgYmVhbikuZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eV9QcmltYXJ5S2V5KCkpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTBfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tdIHsgKChFbnRpdHkpIGJlYW4pLmdldFByaW1hcnlLZXlOYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTBfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNNUEZpZWxkRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gaW5zdGFuY2VvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5KSB7Ci0JCQkvLyBjaGVjayBzeW50YXggb2YgdGFnIGlzIG9rYXkKLQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQlMaXN0IGZpZWxkcyA9IGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQkJaWYgKChmaWVsZHMgPT0gbnVsbCkgfHwgKGZpZWxkcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODEyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IGJlYW4uZ2V0RWpiQ2xhc3NOYW1lKCl9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJYm9vbGVhbiBtYXBzVG9NdWx0aXBsZUZpZWxkcyA9ICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmllbGRzLml0ZXJhdG9yKCk7Ci0JCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCQlMaXN0IGZpZWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KGZpZWxkcy5zaXplKCkpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUNNUEF0dHJpYnV0ZSBhdHRyaWIgPSAoQ01QQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRERWYWxpZGF0b3IudmFsaWRhdGVDTVBGaWVsZEVsZW1lbnQoRW50ZXJwcmlzZUJlYW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRleHQoIkNNUEF0dHJpYnV0ZSBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZmllbGQgPSBhdHRyaWIuZ2V0RmllbGQoKTsKLQkJCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJCQlpZiAoYXR0cmliLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODExX05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IGF0dHJpYi5nZXROYW1lKCksIGJlYW4uZ2V0RWpiQ2xhc3NOYW1lKCl9LCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODExX1VOTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSUVMRE5BTUVfU0VSSUFMVkVSU0lPTlVJRCkpIHsKLQkJCQkJLy8gbm90IGEgY3VzdG9tZXItZW50ZXJlZCBmaWVsZAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlmaWVsZE5hbWVzLmFkZChmaWVsZC5nZXROYW1lKCkpOwotCi0JCQkJdHJ5IHsKLQkJCQkJLy8gSWYgdGhlIGZpZWxkIGlzIG5vdCBhIHZhbGlkIHR5cGUKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCS8vIGZpZWxkIG5vdCBpZGVudGlmaWVkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW10geyBmaWVsZC5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIDkuNC43LjIKLQkJCWlmIChtYXBzVG9NdWx0aXBsZUZpZWxkcyAmJiAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7Ci0JCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldFByaW1hcnlLZXkoKS5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCi0JCQkJLy8gKDkuNC43LjEgaXMgdmFsaWRhdGVkIGluIHZhbGlkYXRlUHJpbUtleUNsYXNzRWxlbWVudChiZWFuKQotCQkJCS8vIGNoZWNrIGlmIHRoZSBwcmltYXJ5IGtleSBjbGFzcycgZmllbGRzIGV4aXN0IGluIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQkJCQlpdGVyYXRvciA9IHByaW1LZXlGaWVsZHMuaXRlcmF0b3IoKTsKLQotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJRmllbGQga2V5RmllbGQgPSAoRmllbGQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKChrZXlGaWVsZC5nZXROYW1lKCkgIT0gbnVsbCkgJiYgKGtleUZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkpIHsKLQkJCQkJCS8vIG5vdCBhIGN1c3RvbWVyLWVudGVyZWQgZmllbGQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFmaWVsZE5hbWVzLmNvbnRhaW5zKGtleUZpZWxkLmdldE5hbWUoKSkpIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW10geyBrZXlGaWVsZC5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHZhbGlkYXRlRGVwbG95bWVudERlc2NyaXB0b3IgaXMgY2FsbGVkIGlmIHRoZSBFSkJKYXIgY291bGQgbG9hZCwgd2hpY2ggbWVhbnMKLQkgKiB0aGF0IHRoZSBzeW50YXggb2YgdGhlIEpBUiBpcyAobW9zdGx5KSBjb3JyZWN0LgotCSAqCi0JICogRUpCIHNwZWMgMS4xLCBzZWN0aW9uIEMuNCwgIkFkZGVkIHRoZSByZXF1aXJlbWVudCBmb3IgdGhlIEJlYW4gUHJvdmlkZXIgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZQotCSAqIGVudGVycHJpc2UgYmVhbiB1c2VzIGEgYmVhbi1tYW5hZ2VkIG9yIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uLiIKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHsKLQkJRUpCSmFyIGVqYkphciA9IG51bGw7Ci0JCWlmKHRhcmdldFBhcmVudCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSB7Ci0JCQkvLyBydW5uaW5nIGFzIGEgZGVwZW5kZW50Ci0JCQllamJKYXIgPSAoRUpCSmFyKXZjLmxvYWRNb2RlbChFSkJWYWxpZGF0b3JNb2RlbEVudW0uRUpCX01PREVMKTsKLQkJfQotCQllbHNlIHsKLQkJCWVqYkphciA9IChFSkJKYXIpdGFyZ2V0UGFyZW50OwotCQl9Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGFyZ2V0OwotCQkKLQkJdmFsaWRhdGUodmMsIGVqYkphciwgYmVhbik7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyOTA4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCi0JCQkvLyBJZiBiZWFuIGlzbid0IHZhbGlkLCBkb24ndCBwZXJmb3JtIGFueSBvZiB0aGUgb3RoZXIKLQkJCS8vIHZhbGlkYXRpb24gY2hlY2tzIG9uIGl0LgotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIENoZWNrIGlmIHRoZSBjbGFzcyBleGlzdHMsIGV0Yy4KLQkJCWJvb2xlYW4gcmVmbGVjdGVkID0gdmFsaWRhdGVCZWFuQ29tcG9uZW50cyh2YywgZWpiSmFyLCBiZWFuKTsgLy8gYXNzdW1lIGV2ZXJ5dGhpbmcgd2lsbCByZWZsZWN0IHByb3Blcmx5Ci0KLQkJCXZhbGlkYXRlRW50ZXJwcmlzZVR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVFSkJOYW1lRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlUmVlbnRyYW50RWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlU2Vzc2lvblR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVUcmFuc2FjdGlvblR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVQZXJzaXN0ZW5jZVR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVFbnZpcm9ubWVudEVudHJpZXModmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCWlmICghcmVmbGVjdGVkKSB7Ci0JCQkJLy8gU29tZXRoaW5nIGRpZG4ndCByZWZsZWN0IHByb3Blcmx5LCBzbyBkb24ndCBjb250aW51ZSB3aXRoIHRoZQotCQkJCS8vIHJlc3Qgb2YgdGhlIGNoZWNrcy4gU29tZSBtZXRhZGF0YSB3aWxsIGJlIG5vbnNlbnNlLgotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkJCWlmIChjbXAuZ2V0UHJpbUtleUZpZWxkKCkgIT0gbnVsbCAmJiAhY21wLmdldFByaW1LZXlGaWVsZCgpLmVJc1Byb3h5KCkpIHsKLQkJCQkJLy8gRG9uJ3QgdmFsaWRhdGUgdGhlIGZpZWxkcyBpZiBpdCdzIG5laXRoZXIgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkgbm9yIGEgY29tcG91bmQgcHJpbWFyeSBrZXkuCi0JCQkJCS8vIElmIHRoZSB1c2VyIHdhcyBhdHRlbXB0aW5nIGEgcHJpbWl0aXZlIHByaW1hcnkga2V5LCBidXQgZGlkIGEgdHlwbyBpbiBlamItamFyLnhtbCwKLQkJCQkJLy8gdGhlIHVzZXIgd2lsbCBzZWUgYSBsb3Qgb2Ygc3RyYW5nZSBtZXNzYWdlcyBsb2dnZWQgYWdhaW5zdCB0aGUgZmllbGRzIGluIHRoZSBwcmltaXRpdmUgcHJpbWFyeSBrZXkuCi0JCQkJCXZhbGlkYXRlQ01QRmllbGRFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJCX0KLQkJCX0KLQotCQkJdmFsaWRhdGVQcmltS2V5Q2xhc3NFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVFSkJSZWYodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZVNlY3VyaXR5Um9sZVJlZkVsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCX0KLQkJY2F0Y2ggKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoKFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCQkvKiB1bnJlYWNoYWJsZSBjYXRjaCBibG9jawotCQljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJLy8gSWYgdGhlcmUncyBhIHByb2JsZW0sIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBiZWFuLgotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tdIHsgYmVhbi5nZXROYW1lKCkgfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJTXNnTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVIsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCS8vIElmIHRoZXJlJ3MgYSBwcm9ibGVtLCBwcm9jZWVkIHdpdGggdGhlIG5leHQgYmVhbi4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW10geyBiZWFuLmdldE5hbWUoKSB9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCTmFtZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gYmVhbi5nZXROYW1lKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSBzZWN0aW9uIDE0LjMgb2YgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDE0LjMgRUpCIFJlZmVyZW5jZXMKLQkgKiAgIDE0LjMuMSBCZWFuIFByb3ZpZGVyJ3MgcmVzcG9uc2liaWxpdGllcwotCSAqICAgICAxNC4zLjEuMSBFSkIgcmVmZXJlbmNlIHByb2dyYW1taW5nIGludGVyZmFjZXMKLQkgKiAgICAgMTQuMy4xLjIgRGVjbGFyYXRpb24gb2YgRUpCIHJlZmVyZW5jZXMgaW4gZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogICAxNC4zLjIgQXBwbGljYXRpb24gQXNzZW1ibGVyJ3MgcmVzcG9uc2liaWxpdGllcwotCSAqICAgMTQuMy4zIERlcGxveWVyJ3MgcmVzcG9uc2liaWxpdHkKLQkgKiAgIDE0LjMuNCBDb250YWluZXIgUHJvdmlkZXIncyByZXNwb25zaWJpbGl0eQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUmVmKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGVqYlJlZnMgPSBiZWFuLmdldEVqYlJlZnMoKTsKLQkJaWYgKChlamJSZWZzID09IG51bGwpIHx8IChlamJSZWZzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJSZWZzLml0ZXJhdG9yKCk7Ci0JCUVqYlJlZiByZWYgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZWYgPSAoRWpiUmVmKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocmVmID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlRUpCUmVmKEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkVqYlJlZiBpcyBudWxsIGluICIgKyBiZWFuLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIDE0LjMuMS4xCi0JCQkvLyBJbmZvIG1zc2cuICJFSkIgc3BlYyByZWNvbW1lbmRzIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gb3RoZXIgZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlIGVqYiBzdWJjb250ZXh0IG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQiCi0JCQlFbnRlcnByaXNlQmVhbiBuYW1lZEVqYiA9IG51bGw7Ci0JCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfTGluaygpKSkgewotCQkJCS8vIExvYWQgdGhlIEVKQiBpZGVudGlmaWVkIGJ5IHRoZSByZWZlcmVuY2UsIGlmIGl0IGV4aXN0cy4KLQkJCQluYW1lZEVqYiA9IGVqYkphci5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihyZWYpOwotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIGlmIGl0J3MgbnVsbCwgbGV0IHRoZSBFQVIgdmFsaWRhdG9yIHJlcG9ydCBpdAotCQkJCQlJbnRlZ2VyIGVqYlR5cGUgPSBuZXcgSW50ZWdlcihyZWYuZ2V0VHlwZSgpLmdldFZhbHVlKCkpOwotCQkJCQlib29sZWFuIHdyb25nVHlwZSA9IGZhbHNlOyAvLyBpcyB0aGUgRUpCLCBpZGVudGlmaWVkIGJ5IGVqYi1saW5rLCBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50PwotCQkJCQlTdHJpbmcgdHlwZSA9IChuYW1lZEVqYiBpbnN0YW5jZW9mIFNlc3Npb24pID8gIlNlc3Npb24iIDogIkVudGl0eSI7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYgKGVqYlR5cGUgPT0gbnVsbCkgewotCQkJCQkJLy8gTmVpdGhlciBzZXNzaW9uIG5vciBlbnRpdHk/Ci0JCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVqYlR5cGUuaW50VmFsdWUoKSA9PSBFamJSZWZUeXBlLlNFU1NJT04pIHsKLQkJCQkJCWlmICghKG5hbWVkRWpiIGluc3RhbmNlb2YgU2Vzc2lvbikpIHsKLQkJCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVqYlR5cGUuaW50VmFsdWUoKSA9PSBFamJSZWZUeXBlLkVOVElUWSkgewotCQkJCQkJaWYgKCEobmFtZWRFamIgaW5zdGFuY2VvZiBFbnRpdHkpKSB7Ci0JCQkJCQkJd3JvbmdUeXBlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKHdyb25nVHlwZSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSB7IG5hbWVkRWpiLmdldE5hbWUoKSwgdHlwZSB9OwotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzNSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcm1zLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIDE0LjMuMS4yLCAxNC4zLjIsIDE0LjMuNAotCQkJLy8gQ2hlY2sgdGhhdCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwgaG9tZSwgYW5kIHJlbW90ZSBoYXZlIGJlZW4gZGVmaW5lZCwgYW5kIGV4aXN0Ci0JCQl2YWxpZGF0ZUhvbWVSZWYodmMsIGVqYkphciwgcmVmLCBuYW1lZEVqYik7Ci0JCQl2YWxpZGF0ZVJlbW90ZVJlZih2YywgZWpiSmFyLCByZWYsIG5hbWVkRWpiKTsKLQotCQkJLy8gMTQuMy4xLjEKLQkJCS8vIEluZm8gbXNzZy4gIkVKQiBzcGVjIHJlY29tbWVuZHMgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byBvdGhlciBlbnRlcnByaXNlIGJlYW5zIGJlIG9yZ2FuaXplZCBpbiB0aGUgZWpiIHN1YmNvbnRleHQgb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCIKLQkJCWlmIChyZWYuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkvLyBJZiBlamIgbmFtZSBpc24ndCBzZXQsIHRoYXQgZXJyb3Igd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBvbmUgb2YgdGhlIHZhbGlkYXRlUmVmIG1ldGhvZHMKLQkJCQkvLyBEb24ndCBkdXBsaWNhdGUgdGhhdCBlZmZvcnQgaGVyZS4KLQkJCQlTdHJpbmcgZWpiTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJaWYgKCFlamJOYW1lLnN0YXJ0c1dpdGgoImVqYi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFbnRlcnByaXNlVHlwZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIEF0dGVtcHQgaW4gdmFpbiB0byB2YWxpZGF0ZSB0aGUgZW50ZXJwcmlzZSB0eXBlIGVsZW1lbnQgaGVyZSwgYmVjYXVzZSAKLQkJLy8gaWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGVyZSdzIGEgc3ludGF4IGVycm9yLCBhbmQgdGhlIAotCQkvLyB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElSZXBvcnRlciwgSVZhbGlkYXRpb25Db250ZXh0KSB3b3VsZCBoYXZlIGJlZW4gCi0JCS8vIGNhbGxlZCBpbnN0ZWFkLgotCQkvKgotCQlpZighIChiZWFuLmlzU2Vzc2lvbigpIHx8IGJlYW4uaXNFbnRpdHkoKSApKSB7Ci0JCQkvLyBubyB0YWcgc3BlY2lmaWVkCi0JCQlTdHJpbmcgYmVhbk5hbWUgPSAoYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgPyAiIiA6IGJlYW4uZ2V0TmFtZSgpOwotCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkVKQl9ERF9JTlZBTElEX0VOVEVSUFJJU0VUWVBFLCBuZXcgU3RyaW5nW117YmVhbk5hbWV9LCBiZWFuKTsKLQkJfQotCQkqLwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSBzZWN0aW9uIDE0LjMgb2YgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDE0LjIuMS4yIERlY2xhcmF0aW9uIG9mIGVudmlyb25tZW50IGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBlbnZFbnRyaWVzID0gYmVhbi5nZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQkJaWYgKChlbnZFbnRyaWVzID09IG51bGwpIHx8IChlbnZFbnRyaWVzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRW52RW50cnkgZW52RW50cnkgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVudkVudHJpZXMuaXRlcmF0b3IoKTsKLQkJRHVwbGljYXRlc1RhYmxlIGVudk5hbWVzID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQllbnZFbnRyeSA9IChFbnZFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVudkVudHJ5ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlRW52aXJvbm1lbnRFbnRyaWVzKEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkVqYkVudHJ5IGlzIG51bGwgaW4gIiArIGJlYW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoZW52RW50cnkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQllbnZOYW1lcy5hZGQoZW52RW50cnkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAoZW52RW50cnkuaXNTZXRUeXBlKCkpIHsKLQkJCQkvLyAxNC4yLjEuMjsgdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGVzZSB0eXBlczogU3RyaW5nLCBJbnRlZ2VyLCBCb29sZWFuLCBEb3VibGUsIEJ5dGUsIFNob3J0LCBMb25nLCBhbmQgRmxvYXQuCi0JCQkJaW50IHR5cGUgPSBlbnZFbnRyeS5nZXRUeXBlKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoISgodHlwZSA9PSBFbnZFbnRyeVR5cGUuQk9PTEVBTikgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLkJZVEUpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5ET1VCTEUpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5GTE9BVCkgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLklOVEVHRVIpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5MT05HKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuU0hPUlQpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5TVFJJTkcpKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZW52TmFtZXMuY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCUl0ZXJhdG9yIGR1cHMgPSBlbnZOYW1lcy5nZXREdXBsaWNhdGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChkdXBzLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZHVwcy5uZXh0KCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IG5hbWUgfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgRWpiUmVmIGlzIG5vdCB2YWxpZCwgYWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlLgotCSAqCi0JICogQHBhcm0gRWpiUmVmIFRoZSA8ZWpiLXJlZj4gZWxlbWVudCB0aGlzIG1ldGhvZCB2YWxpZGF0ZXMuCi0JICogQHBhcm0gRW50ZXJwcmlzZUJlYW4gSWYgdGhlIDxlamItcmVmPiB1c2VzIGFuIDxlamItbGluaz4sIHRoaXMgaXMgdGhlIGVudGVycHJpc2UgYmVhbiBpZGVudGlmaWVkIGJ5IHRoYXQgbGluay4gSWYgdGhlIGxpbmsgZG9lc24ndCBleGlzdCwgb3IgaWYgdGhlIHVzZXIgaGFzIGlkZW50aWZpZWQgYSBiZWFuIHdoaWNoIGRvZXNuJ3QgZXhpc3QsIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhvbWVSZWYoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFamJSZWYgcmVmLCBFbnRlcnByaXNlQmVhbiBuYW1lZEVqYikgewotCQlib29sZWFuIHZhbGlkVHlwZSA9IHRydWU7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pcmVmLmVDb250YWluZXIoKTsKLQkJaWYgKHJlZi5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX0hvbWUoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGhvbWVOYW1lID0gcmVmLmdldEhvbWUoKTsKLQkJCQlKYXZhSGVscGVycyB0eXBlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoaG9tZU5hbWUsIGJlYW4pOwotCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudCBvZiB0aGUgPGVqYi1yZWY+IGVsZW1lbnQKLQkJCQkvLyBleGlzdHMuCi0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKHR5cGUpOwotCi0JCQkJaWYgKG5hbWVkRWpiICE9IG51bGwpIHsKLQkJCQkJLy8gQ2hlY2sgdGhhdCB0aGUgaG9tZSBzcGVjaWZpZWQgaW4gdGhlIDxob21lPiBlbGVtZW50Ci0JCQkJCS8vIGlzIGFzc2lnbmFibGUgdG8gdGhlIGhvbWUgdXNlZCBieSB0aGUgbmFtZWQgRUpCIGluIHRoZQotCQkJCQkvLyA8ZWpiLWxpbms+IGVsZW1lbnQuCi0JCQkJCUphdmFDbGFzcyBpbnRmVHlwZSA9IG5hbWVkRWpiLmdldEhvbWVJbnRlcmZhY2UoKTsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGludGZUeXBlKTsKLQotCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaWRlbnRpZmllZCBob21lL3JlbW90ZSBpbnRlcmZhY2UgaW4gdGhlIGVqYi1yZWYKLQkJCQkJLy8gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb25lIHVzZWQgYnkgdGhlIGJlYW4uCi0JCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odHlwZS5nZXRXcmFwcGVyKCksIGludGZUeXBlKSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSB7IG5hbWVkRWpiLmdldE5hbWUoKSwgaW50ZlR5cGUuZ2V0TmFtZSgpfTsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkVHlwZSA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKCF2YWxpZFR5cGUpIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0geyByZWYuZ2V0SG9tZSgpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUGVyc2lzdGVuY2VUeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJLy8gQXR0ZW1wdCBpbiB2YWluIHRvIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW5jZSB0eXBlIGVsZW1lbnQgaGVyZSwgYmVjYXVzZSAKLQkJLy8gaWYgaXQncyBub3Qgc3BlY2lmaWVkLCB0aGVyZSdzIGEgc3ludGF4IGVycm9yLCBhbmQgdGhlIAotCQkvLyB2YWxpZGF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElSZXBvcnRlciwgSVZhbGlkYXRpb25Db250ZXh0KSB3b3VsZCBoYXZlIGJlZW4gCi0JCS8vIGNhbGxlZCBpbnN0ZWFkLgotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCUVudGl0eSBlbnRpdHlCZWFuID0gKEVudGl0eSkgYmVhbjsKLQkJCWlmICghKGVudGl0eUJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgfHwgZW50aXR5QmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIElmIHRoZSBwcmltYXJ5IGtleSBjbGFzcyByZWZsZWN0ZWQgcHJvcGVybHksIHJldHVybiB0cnVlLiBFbHNlLCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVQcmltS2V5Q2xhc3NFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCWlmIChiZWFuIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJSmF2YUNsYXNzIGNsYXMgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQkJCWlmIChjbGFzICE9IG51bGwgJiYgIWNsYXMuZUlzUHJveHkoKSAmJiAhaXNWYWxpZFByaW1LZXlGaWVsZChjbXAsY2xhcykpIHsKLQkJCQkJLy8gOS40LjcuMQotCQkJCQkvLyB1c2VyIGhhcyBzcGVjaWZpZWQgYm90aCBhIHByaW0ta2V5LWNsYXNzIGFuZCBhIHByaW1rZXktZmllbGQKLQkJCQkJLy8gY2FuJ3QgdXNlIHRoZSBDTVBBdHRyaWJ1dGUncyBmaWVsZCdzIG5hbWUsIGJlY2F1c2UgdGhlIHByaW1pdGl2ZSBwcmltYXJ5IGtleSByZXR1cm5lZCBpcyBudWxsCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBwcmltYXJ5IGtleSBpcyBzcGVjaWZpZWQgaW4gdGhlIHhtbCwgYW5zd2VyIHdoZXRoZXIgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGRlcml2ZWQgcHJpbWFyeUtleUF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUHJpbUtleUZpZWxkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBKYXZhQ2xhc3MgY2xhcykgewotCQlyZXR1cm4gY21wLmdldFByaW1hcnlLZXlOYW1lKCkuZXF1YWxzKGNsYXMuZ2V0SmF2YU5hbWUoKSk7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVJlZW50cmFudEVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGJlYW47Ci0JCQlpZiAoIWVudGl0eS5pc1NldFJlZW50cmFudCgpKSB7Ci0JCQkJLy8gQ2FuIG9ubHkgdGVzdCBpZiB0aGUgcmVlbnRyYW50IGF0dHJpYnV0ZSBpcyBzZXQsIGJlY2F1c2UgdGhlIG1vZGVsIGRlZmF1bHRzIGl0Ci0JCQkJLy8gdG8gc29tZSBib29sZWFuIHZhbHVlIGlmIGl0IGlzbid0IHNldC4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIG1ldGFkYXRhIGZyb20gdGhlIEVqYlJlZiBpcyBub3QgdmFsaWQsIGFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZS4KLQkgKgotCSAqIEBwYXJtIEVqYlJlZiBUaGUgcmVmIHdob3NlIGhvbWUgdGhpcyBtZXRob2QgY2hlY2tzLgotCSAqIEBwYXJtIEVudGVycHJpc2VCZWFuIElmIHRoZSBFamJSZWYgdXNlcyBhbiA8ZWpiLWxpbms+IGVsZW1lbnQsIHRoaXMgaXMgdGhlIGVudGVycHJpc2UgYmVhbiBpZGVudGlmaWVkIGJ5IHRoYXQgZWxlbWVudC4gSXQgbWF5IGJlIG51bGwsIGlmIHRoZSB1c2VyIGhhcyBtYWRlIGEgbWlzdGFrZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlbW90ZVJlZihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVqYlJlZiByZWYsIEVudGVycHJpc2VCZWFuIG5hbWVkRWpiKSB7Ci0JCWJvb2xlYW4gdmFsaWRUeXBlID0gdHJ1ZTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbilyZWYuZUNvbnRhaW5lcigpOwotCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCkpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyByZW1vdGVOYW1lID0gcmVmLmdldFJlbW90ZSgpOwotCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShyZW1vdGVOYW1lLCBiZWFuKTsKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50Ci0JCQkJLy8gZXhpc3RzLgotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0eXBlKTsKLQotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudAotCQkJCQkvLyBpcyBhc3NpZ25hYmxlIHRvIHRoZSBob21lIHVzZWQgYnkgdGhlIG5hbWVkIEVKQiBpbiB0aGUKLQkJCQkJLy8gPGVqYi1saW5rPiBlbGVtZW50LgotCQkJCQlKYXZhQ2xhc3MgaW50ZlR5cGUgPSBuYW1lZEVqYi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGludGZUeXBlKTsKLQotCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaWRlbnRpZmllZCBob21lL3JlbW90ZSBpbnRlcmZhY2UgaW4gdGhlIGVqYi1yZWYKLQkJCQkJLy8gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb25lIHVzZWQgYnkgdGhlIGJlYW4uCi0JCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odHlwZS5nZXRXcmFwcGVyKCksIGludGZUeXBlKSkgewotCQkJCQkJU3RyaW5nW10gcGFybXMgPSB7IG5hbWVkRWpiLmdldE5hbWUoKSwgaW50ZlR5cGUuZ2V0TmFtZSgpfTsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBwYXJtcywgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkVHlwZSA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKCF2YWxpZFR5cGUpIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0geyByZWYuZ2V0UmVtb3RlKCl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcm1zLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogMTUuMi41LjMgRGVjbGFyYXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMgcmVmZXJlbmNlZCBmcm9tIHRoZSBiZWFuJ3MgY29kZQotCSAqIFRoZSBCZWFuIFByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNsYXJpbmcgaW4gdGhlIHNlY3VyaXR5LXJvbGUtcmVmIAotCSAqIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxsIHRoZSBzZWN1cml0eSByb2xlIG5hbWVzIHVzZWQgCi0JICogaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLiBEZWNsYXJpbmcgdGhlIHNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZXMgaW4KLQkgKiB0aGUgY29kZSBhbGxvd3MgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBvciBEZXBsb3llciB0byBsaW5rIHRoZSBuYW1lcyAKLQkgKiBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgY29kZSB0byB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBmb3IgCi0JICogYW4gYXNzZW1ibGVkIGFwcGxpY2F0aW9uIHRocm91Z2ggdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICogVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBkZWNsYXJlIGVhY2ggc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VkIGluIHRoZSBjb2RlCi0JICogdXNpbmcgdGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQgYXMgZm9sbG93czoKLQkgKiAgICAgIERlY2xhcmUgdGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIHJvbGUtbmFtZSBlbGVtZW50LiAKLQkgKiBUaGUgbmFtZSBtdXN0IGJlIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdGhhdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIAotCSAqIHRoZSBpc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZS1OYW1lKSBtZXRob2QuCi0JICogICAgICBPcHRpb25hbDogUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIGluIHRoZSAKLQkgKiBkZXNjcmlwdGlvbiBlbGVtZW50LiBBIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlLCBpbmNsdWRpbmcgdGhlIG5hbWUgZGVmaW5lZCAKLQkgKiBieSB0aGUgcm9sZS1uYW1lIGVsZW1lbnQsIGlzIHNjb3BlZCB0byB0aGUgc2Vzc2lvbiBvciBlbnRpdHkgYmVhbiBlbGVtZW50IAotCSAqIHdob3NlIGRlY2xhcmF0aW9uIGNvbnRhaW5zIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LiBUaGUgZm9sbG93aW5nIAotCSAqIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IGFuIGVudGVycHJpc2UgYmVhbidzIHJlZmVyZW5jZXMgdG8gc2VjdXJpdHkgcm9sZXMgCi0JICogYXJlIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICogICAgLi4uCi0JICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0JICogICAgICAgLi4uCi0JICogICAgICAgPGVudGl0eT4KLQkgKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLQkgKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotCSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICAgICAgVGhpcyBzZWN1cml0eSByb2xlIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQgd2hvIGFyZQotCSAqICAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIHVwZGF0ZSBlbXBsb3llZXMnIHNhbGFyaWVzLgotCSAqICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JICogICAgICAgICAgICAgPHJvbGUtbmFtZT5wYXlyb2xsPC9yb2xlLW5hbWU+Ci0JICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICA8L2VudGl0eT4KLQkgKiAgICAgICAuLi4KLQkgKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0JICogICAgLi4uCi0JICoKLQkgKiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFib3ZlIGluZGljYXRlcyB0aGF0IHRoZSBlbnRlcnByaXNlIGJlYW4gCi0JICogQWFyZHZhcmtQYXlyb2xsIG1ha2VzIHRoZSBzZWN1cml0eSBjaGVjayB1c2luZyBpc0NhbGxlckluUm9sZSgicGF5cm9sbCIpCi0JICogaW4gaXRzIGJ1c2luZXNzIG1ldGhvZC4KLQkgKgotCSAqCi0JICogMTUuMy4zIExpbmtpbmcgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzCi0JICogSWYgdGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBkZWZpbmVzIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIGluIHRoZSAKLQkgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGhlIG9yIHNoZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBsaW5raW5nIGFsbCB0aGUgCi0JICogc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzIGRlY2xhcmVkIGluIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50cyB0byB0aGUgCi0JICogc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4gVGhlIEFwcGxpY2F0aW9uIAotCSAqIEFzc2VtYmxlciBsaW5rcyBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEgc2VjdXJpdHkgcm9sZSB1c2luZyB0aGUgCi0JICogcm9sZS1saW5rIGVsZW1lbnQuIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiAKLQkgKiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gYSBzZWN1cml0eS1yb2xlIGVsZW1lbnQuCi0JICogQSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHVzZWQgZXZlbiBpZiB0aGUgdmFsdWUgb2Ygcm9sZS1uYW1lIGlzIHRoZSAKLQkgKiBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1saW5rIHJlZmVyZW5jZS4KLQkgKiBUaGUgZm9sbG93aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBleGFtcGxlIHNob3dzIGhvdyB0byBsaW5rIHRoZSBzZWN1cml0eSAKLQkgKiByb2xlIHJlZmVyZW5jZSBuYW1lZCBwYXlyb2xsIHRvIHRoZSBzZWN1cml0eSByb2xlIG5hbWVkIHBheXJvbGwtZGVwYXJ0bWVudC4KLQkgKiAgICAuLi4KLQkgKiAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLQkgKiAgICAgICAuLi4KLQkgKiAgICAgICA8ZW50aXR5PgotCSAqICAgICAgICAgIDxlamItbmFtZT5BYXJkdmFya1BheXJvbGw8L2VqYi1uYW1lPgotCSAqICAgICAgICAgIDxlamItY2xhc3M+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEJlYW48L2VqYi1jbGFzcz4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgICAgIFRoaXMgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgZW1wbG95ZWVzIG9mIHRoZSBwYXlyb2xsIGRlcGFydG1lbnQuCi0JICogICAgICAgICAgICAgICAgTWVtYmVycyBvZiB0aGlzIHJvbGUgaGF2ZSBhY2Nlc3MgdG8KLQkgKiAgICAgICAgICAgICAgICBhbnlvbmUncyBwYXlyb2xsIHJlY29yZC4KLQkgKgotCSAqICAgICAgICAgICAgICAgIFRoZSByb2xlIGhhcyBiZWVuIGxpbmtlZCB0byB0aGUKLQkgKiAgICAgICAgICAgICAgICBwYXlyb2xsLWRlcGFydG1lbnQgcm9sZS4KLQkgKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotCSAqICAgICAgICAgICAgIDxyb2xlLWxpbms+cGF5cm9sbC1kZXBhcnRtZW50PC9yb2xlLWxpbms+Ci0JICogICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAuLi4KLQkgKiAgICAgICA8L2VudGl0eT4KLQkgKiAgICAgICAuLi4KLQkgKiAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0JICogICAgLi4uCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlY3VyaXR5Um9sZVJlZkVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qKgotCQkgKiBOZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBkdXBsaWNhdGUgcm9sZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLQkJICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgU2VjdXJpdHlSb2xlUmVmIGluc3RhbmNlLgotCQkgKiAoV2l0aG91dCB0aGUgaW5zdGFuY2UsIHdlIGNhbm5vdCBnZXQgbGluZSBudW1iZXJzLikKLQkJICoKLQkJICogVGhpcyBjbGFzcyB3cmFwcGVycyB0aGUgU2VjdXJpdHlSb2xSZWYgaW5zdGFuY2Ugc28gdGhhdCB0aGUgd3JhcHBlcidzCi0JCSAqIGltcGxlbWVudGlvbiBvZiBlcXVhbHMgY29tcGFyZXMgdGhlIG5hbWVzLCBidXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aWxsCi0JCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JCSAqLwotCQljbGFzcyBSb2xlUmVmV3JhcHBlciB7Ci0JCQlwcml2YXRlIFNlY3VyaXR5Um9sZVJlZiBfcmVmID0gbnVsbDsKLQotCQkJcHVibGljIFJvbGVSZWZXcmFwcGVyKFNlY3VyaXR5Um9sZVJlZiByZWYpIHsKLQkJCQlfcmVmID0gcmVmOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVSZWZXcmFwcGVyKSB7Ci0JCQkJCVJvbGVSZWZXcmFwcGVyIG90aGVyID0gKFJvbGVSZWZXcmFwcGVyKSBvOwotCQkJCQlyZXR1cm4gX3JlZi5nZXROYW1lKCkuZXF1YWxzKG90aGVyLmdldFJvbGVSZWYoKS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTZWN1cml0eVJvbGVSZWYgZ2V0Um9sZVJlZigpIHsKLQkJCQlyZXR1cm4gX3JlZjsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gYXJlU1JvbGVzRGVmaW5lZCA9ICgoX3NlY3VyaXR5Um9sZXMgIT0gbnVsbCkgJiYgKF9zZWN1cml0eVJvbGVzLnNpemUoKSA+IDApKTsKLQotCQlMaXN0IHNlY3VyaXR5Um9sZVJlZnMgPSBiZWFuLmdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJaWYgKChzZWN1cml0eVJvbGVSZWZzICE9IG51bGwpICYmIChzZWN1cml0eVJvbGVSZWZzLnNpemUoKSAhPSAwKSkgewotCQkJLy8gQ2hlY2sgdGhhdCBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmIHJlZmVycyB0byBhIHNlY3VyaXR5IHJvbGUsCi0JCQkvLyBpZiBzZWN1cml0eSByb2xlcyBhcmUgZGVmaW5lZCBpbiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciwKLQkJCS8vIGFuZCB0aGF0IGVhY2ggcmVmZXJlbmNlZCBzZWN1cml0eSByb2xlIGV4aXN0cy4KLQkJCUR1cGxpY2F0ZXNUYWJsZSByb2xlUmVmTmFtZXMgPSBuZXcgRHVwbGljYXRlc1RhYmxlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY3VyaXR5Um9sZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTZWN1cml0eVJvbGVSZWYgcmVmID0gKFNlY3VyaXR5Um9sZVJlZikgc2VjdXJpdHlSb2xlUmVmcy5nZXQoaSk7Ci0KLQkJCQkvLyBDaGVjayB0aGF0IHRoZSByb2xlIG5hbWUgaXMgc2V0ICgxNS4yLjUuMykKLQkJCQlTdHJpbmcgcm9sZU5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJCWlmICgocm9sZU5hbWUgPT0gbnVsbCkgfHwgKHJvbGVOYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcm9sZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgYmVhbk5hbWUgPSAoYmVhbi5nZXROYW1lKCkgPT0gbnVsbCkgPyAiIiA6IGJlYW4uZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByZWYsIG5ldyBTdHJpbmdbXSB7IGJlYW5OYW1lIH0sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQnVpbGQgdXAgdGhlIGxpc3Qgb2YgbmFtZXMsIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJCXJvbGVSZWZOYW1lcy5hZGQobmV3IFJvbGVSZWZXcmFwcGVyKHJlZikpOwotCQkJCX0KLQotCQkJCS8vIENoZWNrIHRoYXQgdGhlIHJvbGUgbGluayBpcyBzZXQgKDE1LjMuMykKLQkJCQlTdHJpbmcgcm9sZUxpbmsgPSByZWYuZ2V0TGluaygpOwotCQkJCWJvb2xlYW4gaXNMaW5rRGVmaW5lZCA9ICgocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVSZWZfTGluaygpKSkgJiYgKHJvbGVMaW5rICE9IG51bGwpICYmICghcm9sZUxpbmsuZXF1YWxzKCIiKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlpZiAoKGFyZVNSb2xlc0RlZmluZWQpICYmICghaXNMaW5rRGVmaW5lZCkpIHsKLQkJCQkJLy8gbXVzdCBoYXZlIHJvbGUgbGluayBkZWZpbmVkICgxNS4zLjMpCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByZWYsIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmICgoIWFyZVNSb2xlc0RlZmluZWQpICYmIChpc0xpbmtEZWZpbmVkKSkgewotCQkJCQkvLyBtdXN0IG5vdCBoYXZlIHJvbGUgbGluayBkZWZpbmVkICgxNS4yLjUuMykKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJlZiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGFyZVNSb2xlc0RlZmluZWQgJiYgaXNMaW5rRGVmaW5lZCkgewotCQkJCQkvLyBjaGVjayB0aGF0IHRoZSByb2xlIGxpc3RlZCBpbiB0aGUgbGluayBleGlzdHMuICgxNS4zLjMpCi0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3NlY3VyaXR5Um9sZXMuaXRlcmF0b3IoKTsKLQkJCQkJYm9vbGVhbiByb2xlRXhpc3RzID0gZmFsc2U7Ci0JCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJU2VjdXJpdHlSb2xlIHJvbGUgPSAoU2VjdXJpdHlSb2xlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMocm9sZUxpbmspKSB7Ci0JCQkJCQkJcm9sZUV4aXN0cyA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFyb2xlRXhpc3RzKSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI0LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcmVmLCBuZXcgU3RyaW5nW10geyByb2xlTmFtZSB9LCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkvLyBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgcm9sZS1uYW1lcy4gKDE1LjMuMSkKLQkJCWlmIChyb2xlUmVmTmFtZXMuY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCQlMaXN0IGR1cGxpY2F0ZXMgPSByb2xlUmVmTmFtZXMuZ2V0RHVwbGljYXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZHVwbGljYXRlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsICgoUm9sZVJlZldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0Um9sZVJlZigpLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyb2xlUmVmTmFtZXMuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkgKi4uLgotCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkgKi4uLgotCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCSAqIGtub3dzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCBhbmQgaXQga25vd3MgdGhlIG91dGNvbWUgb2YgdGhlIAotCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlU2Vzc2lvblR5cGVFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pIGJlYW47Ci0KLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJYm9vbGVhbiBpc1ZhbGlkU2VzcyA9IGlzVmFsaWRTZXNzaW9uVHlwZUVsZW1lbnQoc2Vzc2lvbik7Ci0JCQlpZiAoIWlzVmFsaWRTZXNzKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBzZXNzaW9uLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJU2Vzc2lvbiBzZXNzaW9uQmVhbiA9IChTZXNzaW9uKSBiZWFuOwotCQkJaWYgKCFpc1ZhbGlkVHJhbnNhY3Rpb25UeXBlRWxlbWVudChzZXNzaW9uQmVhbikpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9zZWN1cml0eVJvbGVzID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0KLQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpdmMubG9hZE1vZGVsKEVKQlZhbGlkYXRvck1vZGVsRW51bS5FSkJfTU9ERUwpOwotCQlpZihlamJKYXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihlamJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCV9zZWN1cml0eVJvbGVzID0gZWpiSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4yMFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4yMFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Mjc2YmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMjBWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIEVudGVycHJpc2VCZWFuMjBWUnVsZSBleHRlbmRzIEFWYWxpZGF0aW9uUnVsZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgTGlzdCBfc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URX07Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAwX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDBfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDBfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAwX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDEsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwMl9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAyX05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAyX1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwMl9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODAzX05BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDNfTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDNfVU5OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODAzX1VOTkFNRUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDRfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNF9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MDRfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwNV9OQU1FRCwgbmV3IFN0cmluZ1tde0NIS0oyODA1X05BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA1X1VOTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNV9VTk5BTUVEK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA2LCBuZXcgU3RyaW5nW117Q0hLSjI4MDYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjgwNytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgwOCwgbmV3IFN0cmluZ1tde0NIS0oyODA4K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODA5LCBuZXcgU3RyaW5nW117Q0hLSjI4MDkrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MTBfTkFNRUQsIG5ldyBTdHJpbmdbXXtDSEtKMjgxMF9OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMF9VTk5BTUVELCBuZXcgU3RyaW5nW117Q0hLSjI4MTBfVU5OQU1FRCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgxMywgbmV3IFN0cmluZ1tde0NIS0oyODEzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODIwLCBuZXcgU3RyaW5nW117Q0hLSjI4MjArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjIsIG5ldyBTdHJpbmdbXXtDSEtKMjgyMitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyMywgbmV3IFN0cmluZ1tde0NIS0oyODIzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI0LCBuZXcgU3RyaW5nW117Q0hLSjI4MjQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjUsIG5ldyBTdHJpbmdbXXtDSEtKMjgyNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgyNiwgbmV3IFN0cmluZ1tde0NIS0oyODI2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODI3LCBuZXcgU3RyaW5nW117Q0hLSjI4MjcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjgyOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMCwgbmV3IFN0cmluZ1tde0NIS0oyODMwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODMxLCBuZXcgU3RyaW5nW117Q0hLSjI4MzErU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzIsIG5ldyBTdHJpbmdbXXtDSEtKMjgzMitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzMywgbmV3IFN0cmluZ1tde0NIS0oyODMzK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM0LCBuZXcgU3RyaW5nW117Q0hLSjI4MzQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzUsIG5ldyBTdHJpbmdbXXtDSEtKMjgzNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzNiwgbmV3IFN0cmluZ1tde0NIS0oyODM2K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODM3LCBuZXcgU3RyaW5nW117Q0hLSjI4MzcrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MzgsIG5ldyBTdHJpbmdbXXtDSEtKMjgzOCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjgzOSwgbmV3IFN0cmluZ1tde0NIS0oyODM5K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQwLCBuZXcgU3RyaW5nW117Q0hLSjI4NDArU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjg0MStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg0NSwgbmV3IFN0cmluZ1tde0NIS0oyODQ1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODQ2LCBuZXcgU3RyaW5nW117Q0hLSjI4NDYrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NDcsIG5ldyBTdHJpbmdbXXtDSEtKMjg0NytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1MiwgbmV3IFN0cmluZ1tde0NIS0oyODUyfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NCwgbmV3IFN0cmluZ1tde0NIS0oyODU0K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU1LCBuZXcgU3RyaW5nW117Q0hLSjI4NTUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjg1NitTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg1NywgbmV3IFN0cmluZ1tde0NIS0oyODU3K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODU4LCBuZXcgU3RyaW5nW117Q0hLSjI4NTgrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4NTksIG5ldyBTdHJpbmdbXXtDSEtKMjg1OStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjg2MCwgbmV3IFN0cmluZ1tde0NIS0oyODYwK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODgwLCBuZXcgU3RyaW5nW117IkNIS0oyODgwLnMiK1NQRUMsICJDSEtKMjg4MC5iIitTUEVDLCAiQ0hLSjI4ODAuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODgxLCBuZXcgU3RyaW5nW117IkNIS0oyODgxLnMiK1NQRUMsICJDSEtKMjg4MS5iIitTUEVDLCAiQ0hLSjI4ODEuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODgyLCBuZXcgU3RyaW5nW117IkNIS0oyODgyLnMiK1NQRUMsICJDSEtKMjg4Mi5iIitTUEVDLCAiQ0hLSjI4ODIuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODgzLCBuZXcgU3RyaW5nW117IkNIS0oyODgzLnMiK1NQRUMsICJDSEtKMjg4My5iIitTUEVDLCAiQ0hLSjI4ODMuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODg0LCBuZXcgU3RyaW5nW117IkNIS0oyODg0LnMiK1NQRUMsICJDSEtKMjg4NC5iIitTUEVDLCAiQ0hLSjI4ODQuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyODg1LCBuZXcgU3RyaW5nW117IkNIS0oyODg1LnMiK1NQRUMsICJDSEtKMjg4NS5iIitTUEVDLCAiQ0hLSjI4ODUuYyIrU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2U7IG5lZWQgZGlmZiBzcGVjIG51bWJlciBmb3IgZWFjaCB0eXBlIG9mIGJlYW4gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJLy8gRUpCSmFyIGRvZXNuJ3QgZGVwZW5kIG9uIGFueXRoaW5nIGVsc2UKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfRU5URVJQUklTRUJFQU47Ci0JfQotCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNsYXp6KSB7Ci0JCXJldHVybiBwYXJlbnQ7IC8vIFRoZSBwYXJlbnQgd2lsbCBiZSBhbiBFbnRlcnByaXNlQmVhbi4KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IHZjLmdldExvZ0VudHJ5KCk7Ci0JCQllbnRyeS5zZXRTb3VyY2VJRCgiRW50ZXJwcmlzZUJlYW4yMFZSdWxlIC0gdmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGV4dChnZXRDbGFzcygpLmdldE5hbWUoKSArICI6OnZhbGlkYXRlKCIgKyB0YXJnZXRQYXJlbnQgKyAiLCAiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCX0KLQkJCi0JCUVKQkphciBlamJKYXIgPSBudWxsOwotCQlpZih0YXJnZXRQYXJlbnQgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbikgewotCQkJLy8gcnVubmluZyBhcyBhIGRlcGVuZGVudAotCQkJZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllamJKYXIgPSAoRUpCSmFyKXRhcmdldFBhcmVudDsKLQkJfQotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXRhcmdldDsKLQkJCi0JCXZhbGlkYXRlKHZjLCBlamJKYXIsIGJlYW4pOwotCX0KLQkJCQotCQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IHZjLmdldE1zZ0xvZ2dlcigpOwotCQl0cnkgewotCQkJLy8gQ2hlY2sgaWYgdGhlIGJlYW4gcGFydHMgYXJlIHJlZmxlY3RlZC4gU29tZSBydWxlcyBjYW4gYmUgdmFsaWRhdGVkCi0JCQkvLyB3aGV0aGVyIG9yIG5vdCB0aGUgYmVhbiBpcyByZWZsZWN0ZWQuCi0JCQlib29sZWFuIHJlZmxlY3RlZCA9IHZhbGlkYXRlQmVhbkNvbXBvbmVudHNSZWZsZWN0ZWQodmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCS8vIFRoZXNlIHJ1bGVzIGNhbiBiZSB2YWxpZGF0ZWQgd2hldGhlciBvciBub3QgdGhlIGJlYW4gaXMgcmVmbGVjdGVkLgotCQkJdmFsaWRhdGVFSkJOYW1lRWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlUmVlbnRyYW50RWxlbWVudCh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlU2Vzc2lvblR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVUcmFuc2FjdGlvblR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVQZXJzaXN0ZW5jZVR5cGVFbGVtZW50KHZjLCBlamJKYXIsIGJlYW4pOwotCQkJdmFsaWRhdGVFbnZpcm9ubWVudEVudHJpZXModmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCS8vIFRoZSByZXN0IG9mIHRoZSBydWxlcyBjYW5ub3QgYmUgdmFsaWRhdGVkIGJlY2F1c2UgdGhlIGJlYW4gaXNuJ3QgcmVmbGVjdGVkLgotCQkJaWYgKCFyZWZsZWN0ZWQpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCXZhbGlkYXRlTG9jYWxQYWlycyh2YywgZWpiSmFyLCBiZWFuKTsKLQkJCXZhbGlkYXRlUmVtb3RlUGFpcnModmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZUxvY2FsT3JSZW1vdGUodmMsIGVqYkphciwgYmVhbik7Ci0KLQkJCWlmIChiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCQlpZigoY21wLmdldFByaW1LZXlGaWVsZCgpICE9IG51bGwpICYmICFjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZUlzUHJveHkoKSkgewotCQkJCQkvLyBEb24ndCB2YWxpZGF0ZSB0aGUgZmllbGRzIGlmIGl0J3MgbmVpdGhlciBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleSBub3IgYSBjb21wb3VuZCBwcmltYXJ5IGtleS4KLQkJCQkJLy8gSWYgdGhlIHVzZXIgd2FzIGF0dGVtcHRpbmcgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIGJ1dCBkaWQgYSB0eXBvIGluIGVqYi1qYXIueG1sLAotCQkJCQkvLyB0aGUgdXNlciB3aWxsIHNlZSBhIGxvdCBvZiBzdHJhbmdlIG1lc3NhZ2VzIGxvZ2dlZCBhZ2FpbnN0IHRoZSBmaWVsZHMgaW4gdGhlIHByaW1pdGl2ZSBwcmltYXJ5IGtleS4KLQkJCQkJdmFsaWRhdGVDTVBGaWVsZEVsZW1lbnQodmMsIGVqYkphciwgY21wKTsKLQkJCQl9Ci0JCQkJdmFsaWRhdGVBYnN0cmFjdFNjaGVtYU5hbWVFbGVtZW50KHZjLCBlamJKYXIsIGNtcCk7Ci0JCQkJdmFsaWRhdGVKYXZhSWRlbnRpZmllcih2YywgZWpiSmFyLCBjbXApOwotCQkJfQotCi0JCQl2YWxpZGF0ZVByaW1LZXlDbGFzc0VsZW1lbnQodmMsIGVqYkphciwgYmVhbik7Ci0JCQl2YWxpZGF0ZUVKQlJlZih2YywgZWpiSmFyLCBiZWFuKTsKLQkJfQotCQljYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2goVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCS8qIHVucmVhY2hhYmxlIGNhdGNoIGJsb2NrCi0JCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBleGM7Ci0JCX0KLQkJKi8KLQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4NTIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBuZXcgU3RyaW5nW117SjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgYmVhbi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGJlYW4gY29tcG9uZW50cyAoaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsIGJlYW4gY2xhc3MsIGFuZCBwcmltYXJ5Ci0JICoga2V5KSBjYW4gYWxsIGJlIGZvdW5kIGFuZCByZWZsZWN0ZWQsIHJldHVybiB0cnVlLiBMZXQgdGhlIEREVmFsaWRhdG9yCi0JICogcmVwb3J0IHRoZSBlcnJvciBtZXNzYWdlIGFnYWluc3QgdGhlIGJlYW4gaWYgb25lIG9mIHRoZXNlIHR5cGVzIGRvZXNuJ3QgcmVmbGVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJlYW5Db21wb25lbnRzUmVmbGVjdGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHRoZSBiZWFuIGlzIG51bGwsIGJlY2F1c2UgdGhpcyBtZXRob2Qgd2lsbAotCQkvLyBub3QgYmUgY2FsbGVkIGlmIGl0IGlzLgotCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQl0cnkgewotCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0RWpiQ2xhc3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fRWpiQ2xhc3MoKSkpIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAyX05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXXtiZWFuLmdldEVqYkNsYXNzTmFtZSgpfSwgdGhpcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAyX1VOTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQl9Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJaXNWYWxpZCA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZihiZWFuIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbikgewotCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgcmVzdAotCQkJcmV0dXJuIGlzVmFsaWQ7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSkgewotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDNfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tde2JlYW4uZ2V0SG9tZUludGVyZmFjZU5hbWUoKX0sIHRoaXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwM19VTk5BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJfQotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkpIHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoYmVhbiwgYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNF9OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBuZXcgU3RyaW5nW117YmVhbi5nZXRSZW1vdGVJbnRlcmZhY2VOYW1lKCl9LCB0aGlzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDRfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCX0KLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYoYmVhbi5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkpKSB7Ci0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MDVfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tde2JlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlTmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MDVfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlpZihiZWFuLmVJc1NldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpKSkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLQkJCWlmKGJlYW4uZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODAwX05BTUVELCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIG5ldyBTdHJpbmdbXXtiZWFuLmdldExvY2FsSW50ZXJmYWNlTmFtZSgpfSwgdGhpcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MDBfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCX0KLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9ICgoRW50aXR5KSBiZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQl0cnkgewotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBwcmltYXJ5S2V5KTsKLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0JCQkJaWYoKChFbnRpdHkpYmVhbikuZUlzU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eV9QcmltYXJ5S2V5KCkpKSB7Ci0JCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTBfTkFNRUQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbmV3IFN0cmluZ1tdeygoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXlOYW1lKCl9LCB0aGlzKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MTBfVU5OQU1FRCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl9Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNNUEZpZWxkRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCS8vIGNoZWNrIHN5bnRheCBvZiB0YWcgaXMgb2theQotCQlMaXN0IGZpZWxkcyA9IGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQlpZiAoKGZpZWxkcyA9PSBudWxsKSB8fCAoZmllbGRzLnNpemUoKSA9PSAwKSkgewotCQkJLy8gdW5saWtlIEVKQiAxLjEgQ01QcywgdGhpcyBpcyBsZWdhbC4KLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gbWFwc1RvTXVsdGlwbGVGaWVsZHMgPSAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotLy8JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJTGlzdCBmaWVsZE5hbWVzID0gbmV3IEFycmF5TGlzdChmaWVsZHMuc2l6ZSgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQ01QQXR0cmlidXRlIGF0dHJpYiA9IChDTVBBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhdHRyaWIgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSB2Yy5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSB2Yy5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRERWYWxpZGF0b3IudmFsaWRhdGVDTVBGaWVsZEVsZW1lbnQoRW50ZXJwcmlzZUJlYW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGV4dCgiQ01QQXR0cmlidXRlIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZmllbGROYW1lcy5hZGQoYXR0cmliLmdldE5hbWUoKSk7Ci0KLQkJCUphdmFIZWxwZXJzIGZpZWxkVHlwZSA9IGF0dHJpYi5nZXRUeXBlKCk7Ci0JCQl0cnkgewotCQkJCS8vIElmIHRoZSBmaWVsZCBpcyBub3QgYSB2YWxpZCB0eXBlCi0JCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGZpZWxkVHlwZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCS8vIGZpZWxkIG5vdCBpZGVudGlmaWVkCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzMCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgbmV3IFN0cmluZ1tdIHsgYXR0cmliLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJY29udGludWU7IC8vIGlmIHlvdSBjYW4ndCByZWZsZWN0IGl0LCB0aGVuIHlvdSBjYW4ndCB2YWxpZGF0ZSBpdAotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCWlmKCFmaWVsZFR5cGUuaXNQcmltaXRpdmUoKSAmJiAKLQkJCQkgICAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU2VyaWFsaXphYmxlKGZpZWxkVHlwZSwgY21wKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NTUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIG5ldyBTdHJpbmdbXSB7IGF0dHJpYi5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/IG5ldyBTdHJpbmdbXXt9IDogbmV3IFN0cmluZ1tde2UuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gOS40LjcuMgotCQlpZiAobWFwc1RvTXVsdGlwbGVGaWVsZHMgJiYgIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldFByaW1hcnlLZXkoKS5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCi0JCQkvLyAoOS40LjcuMSBpcyB2YWxpZGF0ZWQgaW4gdmFsaWRhdGVQcmltS2V5Q2xhc3NFbGVtZW50KGJlYW4pCi0JCQkvLyBjaGVjayBpZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MnIGZpZWxkcyBleGlzdCBpbiB0aGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JCQlpdGVyYXRvciA9IHByaW1LZXlGaWVsZHMuaXRlcmF0b3IoKTsKLQotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUZpZWxkIGtleUZpZWxkID0gKEZpZWxkKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKChrZXlGaWVsZC5nZXROYW1lKCkgIT0gbnVsbCkgJiYgKGtleUZpZWxkLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJRUxETkFNRV9TRVJJQUxWRVJTSU9OVUlEKSkpIHsKLQkJCQkJLy8gbm90IGEgY3VzdG9tZXItZW50ZXJlZCBmaWVsZAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoIWZpZWxkTmFtZXMuY29udGFpbnMoa2V5RmllbGQuZ2V0TmFtZSgpKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCBuZXcgU3RyaW5nW10geyBrZXlGaWVsZC5nZXROYW1lKCl9LCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNNUkZpZWxkRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCWlmIChjbXAgPT0gbnVsbCkKLQkJCXJldHVybjsgCi0JCXN3aXRjaChjbXAuZ2V0VmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDoKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDoKLQkJCQlicmVhazsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDoKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDogZGVmYXVsdDoKLQkJCQlMaXN0IGZpZWxkcyA9IGNtcC5nZXRDTVJGaWVsZHMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlDTVJGaWVsZCBmaWVsZCA9IChDTVJGaWVsZClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBmaWVsZE5hbWUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCQkJCWlmKChmaWVsZE5hbWUgPT0gbnVsbCkgfHwgKGZpZWxkTmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIG5ldyBTdHJpbmdbXSB7IGZpZWxkLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCWNvbnRpbnVlOyAvLyBkb24ndCBsb29rIGZvciB0aGUgZ2V0IG1ldGhvZHMKLQkJCQkJfQotCQkJCQlpZighVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRKYXZhSWRlbnRpZmllcihmaWVsZE5hbWUpKSB7Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4NTcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBjbXAsIG5ldyBTdHJpbmdbXSB7IGZpZWxkLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCUphdmFIZWxwZXJzIGZpZWxkVHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJCQkJCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShmaWVsZFR5cGUsIGNtcC5nZXRMb2NhbEludGVyZmFjZSgpKSAmJgotCQkJCQkJICAgICFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24oZmllbGRUeXBlLCBjbXApICYmCi0JCQkJCQkgICAgIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tU2V0KGZpZWxkVHlwZSwgY21wKSkgewotCQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1NiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgbmV3IFN0cmluZ1tdIHsgZmllbGQuZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IChlLmdldEphdmFDbGFzcygpID09IG51bGwpID8gbmV3IFN0cmluZ1tde30gOiBuZXcgU3RyaW5nW117ZS5nZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGNtcCwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCTmFtZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gYmVhbi5nZXROYW1lKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODAxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSAmJiBiZWFuLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHsJCQotCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkSmF2YUlkZW50aWZpZXIobmFtZSkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4MTMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQotCQkJLy8gcC4gNDY2Ci0JCQkvLyAiVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54IG11c3QgY29uZm9ybQotCQkJLy8gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uIFRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JCQkvLyBjbXAtdmVyc2lvbiAyLnggbXVzdCBub3QgYmUgYSByZXNlcnZlZCBsaXRlcmFsIGluIEVKQiBRTC4KLQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1Jlc2VydmVkV29yZChuYW1lKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg1OSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVBYnN0cmFjdFNjaGVtYU5hbWVFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYgKGNtcCA9PSBudWxsKQotCQkJcmV0dXJuOyAKLQkJc3dpdGNoKGNtcC5nZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOgotCQkJCWJyZWFrOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiBkZWZhdWx0OgotCi0JCQkJU3RyaW5nIG5hbWUgPSBjbXAuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0JCQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkSmF2YUlkZW50aWZpZXIobmFtZSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyODU4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgY21wLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgbmFtZSBpcyBub3QgYSByZXNlcnZlZCB3b3JkCi0JCQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUmVzZXJ2ZWRXb3JkKG5hbWUpKSB7Ci0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg2MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGNtcCwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwkJCQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlSmF2YUlkZW50aWZpZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQkvKgotCQkgKiBEb24ndCBkdXBsaWNhdGUgdGhlIEVKQiBRTCB2YWxpZGF0b3IncyBmdW5jdGlvbi4KLQkJTGlzdCBxdWVyaWVzID0gY21wLmdldFF1ZXJpZXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBxdWVyaWVzLml0ZXJhdG9yKCk7Ci0JCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJKi8KLQl9Ci0JCi0KLQkvKioKLQkgKiBWYWxpZGF0ZSBzZWN0aW9uIDE0LjMgb2YgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDE0LjMgRUpCIFJlZmVyZW5jZXMKLQkgKiAgIDE0LjMuMSBCZWFuIFByb3ZpZGVyJ3MgcmVzcG9uc2liaWxpdGllcwotCSAqICAgICAxNC4zLjEuMSBFSkIgcmVmZXJlbmNlIHByb2dyYW1taW5nIGludGVyZmFjZXMKLQkgKiAgICAgMTQuMy4xLjIgRGVjbGFyYXRpb24gb2YgRUpCIHJlZmVyZW5jZXMgaW4gZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICogICAxNC4zLjIgQXBwbGljYXRpb24gQXNzZW1ibGVyJ3MgcmVzcG9uc2liaWxpdGllcwotCSAqICAgMTQuMy4zIERlcGxveWVyJ3MgcmVzcG9uc2liaWxpdHkKLQkgKiAgIDE0LjMuNCBDb250YWluZXIgUHJvdmlkZXIncyByZXNwb25zaWJpbGl0eQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUmVmKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGVqYlJlZnMgPSBiZWFuLmdldEVqYlJlZnMoKTsKLQkJaWYgKChlamJSZWZzID09IG51bGwpIHx8IChlamJSZWZzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJSZWZzLml0ZXJhdG9yKCk7Ci0JCUVqYlJlZiByZWYgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZWYgPSAoRWpiUmVmKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocmVmID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlRUpCUmVmKEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkVqYlJlZiBpcyBudWxsIGluICIgKyBiZWFuLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIDE0LjMuMS4xCi0JCQkvLyBJbmZvIG1zc2cuICJFSkIgc3BlYyByZWNvbW1lbmRzIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gb3RoZXIgZW50ZXJwcmlzZSBiZWFucyBiZSBvcmdhbml6ZWQgaW4gdGhlIGVqYiBzdWJjb250ZXh0IG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQiCi0JCQlFbnRlcnByaXNlQmVhbiBuYW1lZEVqYiA9IG51bGw7Ci0JCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfTGluaygpKSkgewotCQkJCS8vIExvYWQgdGhlIEVKQiBpZGVudGlmaWVkIGJ5IHRoZSByZWZlcmVuY2UsIGlmIGl0IGV4aXN0cy4KLQkJCQluYW1lZEVqYiA9IGVqYkphci5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihyZWYpOwotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIGlmIHRoZSBuYW1lZCBFSkIgaXMgbnVsbCBpdCBjb3VsZCBiZSBpbiBhbm90aGVyIEVKQkphcgotCQkJCQlJbnRlZ2VyIGVqYlR5cGUgPSBuZXcgSW50ZWdlcihyZWYuZ2V0VHlwZSgpLmdldFZhbHVlKCkpOwotCQkJCQlib29sZWFuIHdyb25nVHlwZSA9IGZhbHNlOyAvLyBpcyB0aGUgRUpCLCBpZGVudGlmaWVkIGJ5IGVqYi1saW5rLCBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50PwotCQkJCQlTdHJpbmcgdHlwZSA9IChuYW1lZEVqYiBpbnN0YW5jZW9mIFNlc3Npb24pID8gIlNlc3Npb24iIDogIkVudGl0eSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAoZWpiVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBOZWl0aGVyIHNlc3Npb24gbm9yIGVudGl0eT8KLQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZWpiVHlwZS5pbnRWYWx1ZSgpID09IEVqYlJlZlR5cGUuU0VTU0lPTikgewotCQkJCQkJaWYgKCEobmFtZWRFamIgaW5zdGFuY2VvZiBTZXNzaW9uKSkgewotCQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZWpiVHlwZS5pbnRWYWx1ZSgpID09IEVqYlJlZlR5cGUuRU5USVRZKSB7Ci0JCQkJCQlpZiAoIShuYW1lZEVqYiBpbnN0YW5jZW9mIEVudGl0eSkpIHsKLQkJCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJd3JvbmdUeXBlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAod3JvbmdUeXBlKSB7Ci0JCQkJCQlTdHJpbmdbXSBwYXJtcyA9IHsgbmFtZWRFamIuZ2V0TmFtZSgpLCB0eXBlIH07Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gMTQuMy4xLjIsIDE0LjMuMiwgMTQuMy40Ci0JCQkvLyBDaGVjayB0aGF0IGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLCBob21lLCBhbmQgcmVtb3RlIGhhdmUgYmVlbiBkZWZpbmVkLCBhbmQgZXhpc3QKLQkJCXZhbGlkYXRlSG9tZVJlZih2YywgZWpiSmFyLCByZWYsIG5hbWVkRWpiKTsKLQkJCXZhbGlkYXRlUmVtb3RlUmVmKHZjLCBlamJKYXIsIHJlZiwgbmFtZWRFamIpOwotCi0JCQkvLyAxNC4zLjEuMQotCQkJLy8gSW5mbyBtc3NnLiAiRUpCIHNwZWMgcmVjb21tZW5kcyB0aGF0IGFsbCByZWZlcmVuY2VzIHRvIG90aGVyIGVudGVycHJpc2UgYmVhbnMgYmUgb3JnYW5pemVkIGluIHRoZSBlamIgc3ViY29udGV4dCBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IgotCQkJaWYgKHJlZi5lSXNTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX05hbWUoKSkpIHsKLQkJCQkvLyBJZiBlamIgbmFtZSBpc24ndCBzZXQsIHRoYXQgZXJyb3Igd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBvbmUgb2YgdGhlIHZhbGlkYXRlUmVmIG1ldGhvZHMKLQkJCQkvLyBEb24ndCBkdXBsaWNhdGUgdGhhdCBlZmZvcnQgaGVyZS4KLQkJCQlTdHJpbmcgZWpiTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJaWYgKCFlamJOYW1lLnN0YXJ0c1dpdGgoImVqYi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBzZWN0aW9uIDE0LjMgb2YgdGhlIEVKQiAxLjEgc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDE0LjIuMS4yIERlY2xhcmF0aW9uIG9mIGVudmlyb25tZW50IGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBlbnZFbnRyaWVzID0gYmVhbi5nZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQkJaWYgKChlbnZFbnRyaWVzID09IG51bGwpIHx8IChlbnZFbnRyaWVzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRW52RW50cnkgZW52RW50cnkgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVudkVudHJpZXMuaXRlcmF0b3IoKTsKLQkJRHVwbGljYXRlc1RhYmxlIGVudk5hbWVzID0gbmV3IER1cGxpY2F0ZXNUYWJsZSgpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQllbnZFbnRyeSA9IChFbnZFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVudkVudHJ5ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlciAhPSBudWxsICYmIGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gdmMuZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkREVmFsaWRhdG9yLnZhbGlkYXRlRW52aXJvbm1lbnRFbnRyaWVzKEVudGVycHJpc2VCZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIkVqYkVudHJ5IGlzIG51bGwgaW4gIiArIGJlYW4uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoZW52RW50cnkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQllbnZOYW1lcy5hZGQoZW52RW50cnkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MzksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAoZW52RW50cnkuaXNTZXRUeXBlKCkpIHsKLQkJCQkvLyAxNC4yLjEuMjsgdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGVzZSB0eXBlczogU3RyaW5nLCBJbnRlZ2VyLCBCb29sZWFuLCBEb3VibGUsIEJ5dGUsIFNob3J0LCBMb25nLCBhbmQgRmxvYXQuCi0JCQkJaW50IHR5cGUgPSBlbnZFbnRyeS5nZXRUeXBlKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoISgodHlwZSA9PSBFbnZFbnRyeVR5cGUuQk9PTEVBTikgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLkJZVEUpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5ET1VCTEUpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5GTE9BVCkgfHwgKHR5cGUgPT0gRW52RW50cnlUeXBlLklOVEVHRVIpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5MT05HKSB8fCAodHlwZSA9PSBFbnZFbnRyeVR5cGUuU0hPUlQpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5TVFJJTkcpIHx8ICh0eXBlID09IEVudkVudHJ5VHlwZS5DSEFSQUNURVIpKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODQwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZW52TmFtZXMuY29udGFpbnNEdXBsaWNhdGVzKCkpIHsKLQkJCUl0ZXJhdG9yIGR1cHMgPSBlbnZOYW1lcy5nZXREdXBsaWNhdGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChkdXBzLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZHVwcy5uZXh0KCk7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg0MSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXSB7IG5hbWUgfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBFamJSZWYgaXMgbm90IHZhbGlkLCBhZGQgYSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0JICoKLQkgKiBAcGFybSBFamJSZWYgVGhlIDxlamItcmVmPiBlbGVtZW50IHRoaXMgbWV0aG9kIHZhbGlkYXRlcy4KLQkgKiBAcGFybSBFbnRlcnByaXNlQmVhbiBJZiB0aGUgPGVqYi1yZWY+IHVzZXMgYW4gPGVqYi1saW5rPiwgdGhpcyBpcyB0aGUgZW50ZXJwcmlzZSBiZWFuIGlkZW50aWZpZWQgYnkgdGhhdCBsaW5rLiBJZiB0aGUgbGluayBkb2Vzbid0IGV4aXN0LCBvciBpZiB0aGUgdXNlciBoYXMgaWRlbnRpZmllZCBhIGJlYW4gd2hpY2ggZG9lc24ndCBleGlzdCwgdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSG9tZVJlZihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVqYlJlZiByZWYsIEVudGVycHJpc2VCZWFuIG5hbWVkRWpiKSB7Ci0JCWJvb2xlYW4gdmFsaWRUeXBlID0gdHJ1ZTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbilyZWYuZUNvbnRhaW5lcigpOwotCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfSG9tZSgpKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaG9tZU5hbWUgPSByZWYuZ2V0SG9tZSgpOwotCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShob21lTmFtZSwgYmVhbik7Ci0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgaG9tZSBzcGVjaWZpZWQgaW4gdGhlIDxob21lPiBlbGVtZW50IG9mIHRoZSA8ZWpiLXJlZj4gZWxlbWVudAotCQkJCS8vIGV4aXN0cy4KLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUodHlwZSk7Ci0KLQkJCQlpZiAobmFtZWRFamIgIT0gbnVsbCkgewotCQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQKLQkJCQkJLy8gaXMgYXNzaWduYWJsZSB0byB0aGUgaG9tZSB1c2VkIGJ5IHRoZSBuYW1lZCBFSkIgaW4gdGhlCi0JCQkJCS8vIDxlamItbGluaz4gZWxlbWVudC4KLQkJCQkJSmF2YUNsYXNzIGludGZUeXBlID0gbmFtZWRFamIuZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoaW50ZlR5cGUpOwotCi0JCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBpZGVudGlmaWVkIGhvbWUvcmVtb3RlIGludGVyZmFjZSBpbiB0aGUgZWpiLXJlZgotCQkJCQkvLyBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvbmUgdXNlZCBieSB0aGUgYmVhbi4KLQkJCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbSh0eXBlLCBpbnRmVHlwZSkpIHsKLQkJCQkJCVN0cmluZ1tdIHBhcm1zID0geyBuYW1lZEVqYi5nZXROYW1lKCksIGludGZUeXBlLmdldE5hbWUoKX07Ci0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODM2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJdmFsaWRUeXBlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZFR5cGUgPSBmYWxzZTsKLQkJfQotCi0JCWlmICghdmFsaWRUeXBlKSB7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IHsgcmVmLmdldEhvbWUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgYmVhbiBwcm92aWRlcyBhIGxvY2FsIHZpZXcsIGJvdGggcGFydHMgb2YgdGhlIHZpZXcgbXVzdCBleGlzdC4KLQkgKiBJZiB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQsIHRoZW4gYWxsIHBhcnRzIG9mIHRoZSBiZWFuIGFyZSByZWZsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMb2NhbFBhaXJzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZihiZWFuIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbikgewotCQkJLy8gTWVzc2FnZSBkcml2ZW4gYmVhbnMgZG9uJ3QgdXNlIGxvY2FsIG9yIHJlbW90ZSB2aWV3cwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgbG9jYWwgPSBiZWFuLmdldExvY2FsSW50ZXJmYWNlKCk7Ci0JCUphdmFDbGFzcyBsb2NhbEhvbWUgPSBiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCQlpZigobG9jYWwgIT0gbnVsbCApICYmIChsb2NhbEhvbWUgPT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKChsb2NhbCA9PSBudWxsKSAmJiAobG9jYWxIb21lICE9IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODIsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIGVpdGhlciBib3RoIGFyZSBzZXQgb3IgYm90aCBhcmUgdW5zZXQsIGFuZCB0aGF0J3MgZmluZS4KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgYmVhbiBwcm92aWRlcyBhIHJlbW90ZSB2aWV3LCBib3RoIHBhcnRzIG9mIHRoZSB2aWV3IG11c3QgZXhpc3QuCi0JICogSWYgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkLCB0aGVuIGFsbCBwYXJ0cyBvZiB0aGUgYmVhbiBhcmUgcmVmbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVtb3RlUGFpcnMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuKSB7Ci0JCQkvLyBNZXNzYWdlIGRyaXZlbiBiZWFucyBkb24ndCB1c2UgbG9jYWwgb3IgcmVtb3RlIHZpZXdzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyByZW1vdGUgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlKYXZhQ2xhc3MgaG9tZSA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCQlpZigocmVtb3RlICE9IG51bGwpICYmIChob21lID09IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSBpZigocmVtb3RlID09IG51bGwpICYmIChob21lICE9IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIGVpdGhlciBib3RoIGFyZSBzZXQgb3IgYm90aCBhcmUgdW5zZXQsIGFuZCB0aGF0J3MgZmluZS4KLQl9Ci0KLQkvKioKLQkgKiBUaGUgYmVhbiBtdXN0IHByb3ZpZGUgZWl0aGVyIGEgbG9jYWwgdmlldywgb3IgYSByZW1vdGUgdmlldywgb3IgYm90aC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxvY2FsT3JSZW1vdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuKSB7Ci0JCQkvLyBNZXNzYWdlIGRyaXZlbiBiZWFucyBkb24ndCB1c2UgbG9jYWwgb3IgcmVtb3RlIHZpZXdzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUphdmFDbGFzcyBsb2NhbCA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJSmF2YUNsYXNzIGxvY2FsSG9tZSA9IGJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCUphdmFDbGFzcyByZW1vdGUgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpOwotCQlKYXZhQ2xhc3MgcmVtb3RlSG9tZSA9IGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpOwotCi0JCWlmKChsb2NhbEhvbWUgPT0gbnVsbCkgJiYgKHJlbW90ZUhvbWUgPT0gbnVsbCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjg4NCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCWlmKChsb2NhbCA9PSBudWxsKSAmJiAocmVtb3RlID09IG51bGwpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI4ODUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVBlcnNpc3RlbmNlVHlwZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCS8vIEF0dGVtcHQgaW4gdmFpbiB0byB2YWxpZGF0ZSB0aGUgcGVyc2lzdGVuY2UgdHlwZSBlbGVtZW50IGhlcmUsIGJlY2F1c2UgCi0JCS8vIGlmIGl0J3Mgbm90IHNwZWNpZmllZCwgdGhlcmUncyBhIHN5bnRheCBlcnJvciwgYW5kIHRoZSAKLQkJLy8gdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihJUmVwb3J0ZXIsIElWYWxpZGF0aW9uQ29udGV4dCkgd291bGQgaGF2ZSBiZWVuIAotCQkvLyBjYWxsZWQgaW5zdGVhZC4KLQkJaWYgKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJLy8gY2hlY2sgc3ludGF4Ci0JCQlFbnRpdHkgZW50aXR5QmVhbiA9IChFbnRpdHkpIGJlYW47Ci0JCQlpZiAoIShlbnRpdHlCZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpIHx8IGVudGl0eUJlYW4uaXNCZWFuTWFuYWdlZEVudGl0eSgpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZSBwcmltYXJ5IGtleSBjbGFzcyByZWZsZWN0ZWQgcHJvcGVybHksIHJldHVybiB0cnVlLiBFbHNlLCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVQcmltS2V5Q2xhc3NFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCWlmIChiZWFuIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJQ01QQXR0cmlidXRlIGF0dHIgPSBjbXAuZ2V0UHJpbUtleUZpZWxkKCk7Ci0JCQkJaWYoKGF0dHIgIT0gbnVsbCkgJiYgIWF0dHIuZUlzUHJveHkoKSAmJiAhaXNWYWxpZFByaW1LZXlGaWVsZChjbXAsYXR0cikpICB7Ci0JCQkJCS8vIDkuNC43LjEKLQkJCQkJLy8gdXNlciBoYXMgc3BlY2lmaWVkIGJvdGggYSBwcmltLWtleS1jbGFzcyBhbmQgYSBwcmlta2V5LWZpZWxkCi0JCQkJCS8vIGNhbid0IHVzZSB0aGUgQ01QQXR0cmlidXRlJ3MgZmllbGQncyBuYW1lLCBiZWNhdXNlIHRoZSBwcmltaXRpdmUgcHJpbWFyeSBrZXkgcmV0dXJuZWQgaXMgbnVsbAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI4LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgcHJpbSBrZXkgaXMgc3BlY2lmaWVkIGluIHRoZSB4bWwsIGFuc3dlciB3aGV0aGVyIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBkZXJpdmVkIHByaW1hcnlLZXlBdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkUHJpbUtleUZpZWxkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBDTVBBdHRyaWJ1dGUgYXR0cikgewotCQlyZXR1cm4gY21wLmdldFByaW1hcnlLZXlOYW1lKCkuZXF1YWxzKGF0dHIuZ2V0VHlwZSgpLmdldEphdmFOYW1lKCkpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVJlZW50cmFudEVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCS8vIGNoZWNrIHN5bnRheAotCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGJlYW47Ci0JCQlpZiAoIWVudGl0eS5lSXNTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1JlZW50cmFudCgpKSkgewotCQkJCS8vIENhbiBvbmx5IHRlc3QgaWYgdGhlIHJlZW50cmFudCBhdHRyaWJ1dGUgaXMgc2V0LCBiZWNhdXNlIHRoZSBtb2RlbCBkZWZhdWx0cyBpdAotCQkJCS8vIHRvIHNvbWUgYm9vbGVhbiB2YWx1ZSBpZiBpdCBpc24ndCBzZXQuCi0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIG1ldGFkYXRhIGZyb20gdGhlIEVqYlJlZiBpcyBub3QgdmFsaWQsIGFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZS4KLQkgKgotCSAqIEBwYXJtIEVqYlJlZiBUaGUgcmVmIHdob3NlIGhvbWUgdGhpcyBtZXRob2QgY2hlY2tzLgotCSAqIEBwYXJtIEVudGVycHJpc2VCZWFuIElmIHRoZSBFamJSZWYgdXNlcyBhbiA8ZWpiLWxpbms+IGVsZW1lbnQsIHRoaXMgaXMgdGhlIGVudGVycHJpc2UgYmVhbiBpZGVudGlmaWVkIGJ5IHRoYXQgZWxlbWVudC4gSXQgbWF5IGJlIG51bGwsIGlmIHRoZSB1c2VyIGhhcyBtYWRlIGEgbWlzdGFrZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlbW90ZVJlZihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVqYlJlZiByZWYsIEVudGVycHJpc2VCZWFuIG5hbWVkRWpiKSB7Ci0JCWJvb2xlYW4gdmFsaWRUeXBlID0gdHJ1ZTsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbilyZWYuZUNvbnRhaW5lcigpOwotCQlpZiAocmVmLmVJc1NldChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCkpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyByZW1vdGVOYW1lID0gcmVmLmdldFJlbW90ZSgpOwotCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShyZW1vdGVOYW1lLCBiZWFuKTsKLQkJCQkvLyBDaGVjayB0aGF0IHRoZSBob21lIHNwZWNpZmllZCBpbiB0aGUgPGhvbWU+IGVsZW1lbnQgb2YgdGhlIDxlamItcmVmPiBlbGVtZW50Ci0JCQkJLy8gZXhpc3RzLgotCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSh0eXBlKTsKLQotCQkJCWlmIChuYW1lZEVqYiAhPSBudWxsKSB7Ci0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGhvbWUgc3BlY2lmaWVkIGluIHRoZSA8aG9tZT4gZWxlbWVudAotCQkJCQkvLyBpcyBhc3NpZ25hYmxlIHRvIHRoZSBob21lIHVzZWQgYnkgdGhlIG5hbWVkIEVKQiBpbiB0aGUKLQkJCQkJLy8gPGVqYi1saW5rPiBlbGVtZW50LgotCQkJCQlKYXZhQ2xhc3MgaW50ZlR5cGUgPSBuYW1lZEVqYi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlKGludGZUeXBlKTsKLQotCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaWRlbnRpZmllZCBob21lL3JlbW90ZSBpbnRlcmZhY2UgaW4gdGhlIGVqYi1yZWYKLQkJCQkJLy8gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb25lIHVzZWQgYnkgdGhlIGJlYW4uCi0JCQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20odHlwZSwgaW50ZlR5cGUpKSB7Ci0JCQkJCQlTdHJpbmdbXSBwYXJtcyA9IHsgbmFtZWRFamIuZ2V0TmFtZSgpLCBpbnRmVHlwZS5nZXROYW1lKCl9OwotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgzNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIHBhcm1zLCB0aGlzKTsKLQkJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJCXZhbGlkVHlwZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRUeXBlID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIXZhbGlkVHlwZSkgewotCQkJU3RyaW5nW10gcGFybXMgPSB7IHJlZi5nZXRSZW1vdGUoKX07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODMzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgcGFybXMsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDE1LjIuNS4zIERlY2xhcmF0aW9uIG9mIHNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZWQgZnJvbSB0aGUgYmVhbidzIGNvZGUKLQkgKiBUaGUgQmVhbiBQcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgZGVjbGFyaW5nIGluIHRoZSBzZWN1cml0eS1yb2xlLXJlZiAKLQkgKiBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFsbCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lcyB1c2VkIAotCSAqIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4gRGVjbGFyaW5nIHRoZSBzZWN1cml0eSByb2xlcyByZWZlcmVuY2VzIGluCi0JICogdGhlIGNvZGUgYWxsb3dzIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgb3IgRGVwbG95ZXIgdG8gbGluayB0aGUgbmFtZXMgCi0JICogb2YgdGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIGNvZGUgdG8gdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgZm9yIAotCSAqIGFuIGFzc2VtYmxlZCBhcHBsaWNhdGlvbiB0aHJvdWdoIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCSAqIFRoZSBCZWFuIFByb3ZpZGVyIG11c3QgZGVjbGFyZSBlYWNoIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlZCBpbiB0aGUgY29kZQotCSAqIHVzaW5nIHRoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50IGFzIGZvbGxvd3M6Ci0JICogICAgICBEZWNsYXJlIHRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSByb2xlIHVzaW5nIHRoZSByb2xlLW5hbWUgZWxlbWVudC4gCi0JICogVGhlIG5hbWUgbXVzdCBiZSB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHRoYXQgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byAKLQkgKiB0aGUgaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGUtTmFtZSkgbWV0aG9kLgotCSAqICAgICAgT3B0aW9uYWw6IFByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSBpbiB0aGUgCi0JICogZGVzY3JpcHRpb24gZWxlbWVudC4gQSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSwgaW5jbHVkaW5nIHRoZSBuYW1lIGRlZmluZWQgCi0JICogYnkgdGhlIHJvbGUtbmFtZSBlbGVtZW50LCBpcyBzY29wZWQgdG8gdGhlIHNlc3Npb24gb3IgZW50aXR5IGJlYW4gZWxlbWVudCAKLQkgKiB3aG9zZSBkZWNsYXJhdGlvbiBjb250YWlucyB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4gVGhlIGZvbGxvd2luZyAKLQkgKiBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyBhbiBlbnRlcnByaXNlIGJlYW4ncyByZWZlcmVuY2VzIHRvIHNlY3VyaXR5IHJvbGVzIAotCSAqIGFyZSBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCSAqICAgIC4uLgotCSAqICAgIDxlbnRlcnByaXNlLWJlYW5zPgotCSAqICAgICAgIC4uLgotCSAqICAgICAgIDxlbnRpdHk+Ci0JICogICAgICAgICAgPGVqYi1uYW1lPkFhcmR2YXJrUGF5cm9sbDwvZWpiLW5hbWU+Ci0JICogICAgICAgICAgPGVqYi1jbGFzcz5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsQmVhbjwvZWpiLWNsYXNzPgotCSAqICAgICAgICAgIC4uLgotCSAqICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLQkgKiAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0JICogICAgICAgICAgICAgICAgIFRoaXMgc2VjdXJpdHkgcm9sZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50IHdobyBhcmUKLQkgKiAgICAgICAgICAgICAgICAgYWxsb3dlZCB0byB1cGRhdGUgZW1wbG95ZWVzJyBzYWxhcmllcy4KLQkgKiAgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotCSAqICAgICAgICAgICAgIDxyb2xlLW5hbWU+cGF5cm9sbDwvcm9sZS1uYW1lPgotCSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgPC9lbnRpdHk+Ci0JICogICAgICAgLi4uCi0JICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotCSAqICAgIC4uLgotCSAqCi0JICogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhYm92ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50ZXJwcmlzZSBiZWFuIAotCSAqIEFhcmR2YXJrUGF5cm9sbCBtYWtlcyB0aGUgc2VjdXJpdHkgY2hlY2sgdXNpbmcgaXNDYWxsZXJJblJvbGUoInBheXJvbGwiKQotCSAqIGluIGl0cyBidXNpbmVzcyBtZXRob2QuCi0JICoKLQkgKgotCSAqIDE1LjMuMyBMaW5raW5nIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyB0byBzZWN1cml0eSByb2xlcwotCSAqIElmIHRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgZGVmaW5lcyB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBpbiB0aGUgCi0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLCBoZSBvciBzaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbGlua2luZyBhbGwgdGhlIAotCSAqIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcyBkZWNsYXJlZCBpbiB0aGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudHMgdG8gdGhlIAotCSAqIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuIFRoZSBBcHBsaWNhdGlvbiAKLQkgKiBBc3NlbWJsZXIgbGlua3MgZWFjaCBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSB0byBhIHNlY3VyaXR5IHJvbGUgdXNpbmcgdGhlIAotCSAqIHJvbGUtbGluayBlbGVtZW50LiBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2YgCi0JICogb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIGEgc2VjdXJpdHktcm9sZSBlbGVtZW50LgotCSAqIEEgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBiZSB1c2VkIGV2ZW4gaWYgdGhlIHZhbHVlIG9mIHJvbGUtbmFtZSBpcyB0aGUgCi0JICogc2FtZSBhcyB0aGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayByZWZlcmVuY2UuCi0JICogVGhlIGZvbGxvd2luZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZXhhbXBsZSBzaG93cyBob3cgdG8gbGluayB0aGUgc2VjdXJpdHkgCi0JICogcm9sZSByZWZlcmVuY2UgbmFtZWQgcGF5cm9sbCB0byB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lZCBwYXlyb2xsLWRlcGFydG1lbnQuCi0JICogICAgLi4uCi0JICogICAgPGVudGVycHJpc2UtYmVhbnM+Ci0JICogICAgICAgLi4uCi0JICogICAgICAgPGVudGl0eT4KLQkgKiAgICAgICAgICA8ZWpiLW5hbWU+QWFyZHZhcmtQYXlyb2xsPC9lamItbmFtZT4KLQkgKiAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxCZWFuPC9lamItY2xhc3M+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotCSAqICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICAgICBUaGlzIHJvbGUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZQotCSAqICAgICAgICAgICAgICAgIGVtcGxveWVlcyBvZiB0aGUgcGF5cm9sbCBkZXBhcnRtZW50LgotCSAqICAgICAgICAgICAgICAgIE1lbWJlcnMgb2YgdGhpcyByb2xlIGhhdmUgYWNjZXNzIHRvCi0JICogICAgICAgICAgICAgICAgYW55b25lJ3MgcGF5cm9sbCByZWNvcmQuCi0JICoKLQkgKiAgICAgICAgICAgICAgICBUaGUgcm9sZSBoYXMgYmVlbiBsaW5rZWQgdG8gdGhlCi0JICogICAgICAgICAgICAgICAgcGF5cm9sbC1kZXBhcnRtZW50IHJvbGUuCi0JICogICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLQkgKiAgICAgICAgICAgICA8cm9sZS1uYW1lPnBheXJvbGw8L3JvbGUtbmFtZT4KLQkgKiAgICAgICAgICAgICA8cm9sZS1saW5rPnBheXJvbGwtZGVwYXJ0bWVudDwvcm9sZS1saW5rPgotCSAqICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0JICogICAgICAgICAgLi4uCi0JICogICAgICAgPC9lbnRpdHk+Ci0JICogICAgICAgLi4uCi0JICogICAgPC9lbnRlcnByaXNlLWJlYW5zPgotCSAqICAgIC4uLgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWN1cml0eVJvbGVSZWZFbGVtZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCSmFyIGVqYkphciwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKioKLQkJICogTmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZHVwbGljYXRlIHJvbGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JCSAqIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgZHVwbGljYXRlIFNlY3VyaXR5Um9sZVJlZiBpbnN0YW5jZS4KLQkJICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JCSAqCi0JCSAqIFRoaXMgY2xhc3Mgd3JhcHBlcnMgdGhlIFNlY3VyaXR5Um9sZVJlZiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkJICogaW1wbGVtZW50aW9uIG9mIGVxdWFscyBjb21wYXJlcyB0aGUgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdpbGwKLQkJICogc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJlZiBmcm9tIHRoZSBkdXBsaWNhdGUgbmFtZS4KLQkJICovCi0JCWNsYXNzIFJvbGVSZWZXcmFwcGVyIHsKLQkJCXByaXZhdGUgU2VjdXJpdHlSb2xlUmVmIF9yZWYgPSBudWxsOwotCi0JCQlwdWJsaWMgUm9sZVJlZldyYXBwZXIoU2VjdXJpdHlSb2xlUmVmIHJlZikgewotCQkJCV9yZWYgPSByZWY7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJCWlmIChvIGluc3RhbmNlb2YgUm9sZVJlZldyYXBwZXIpIHsKLQkJCQkJUm9sZVJlZldyYXBwZXIgb3RoZXIgPSAoUm9sZVJlZldyYXBwZXIpIG87Ci0JCQkJCXJldHVybiBfcmVmLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0Um9sZVJlZigpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFNlY3VyaXR5Um9sZVJlZiBnZXRSb2xlUmVmKCkgewotCQkJCXJldHVybiBfcmVmOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBhcmVTUm9sZXNEZWZpbmVkID0gKChfc2VjdXJpdHlSb2xlcyAhPSBudWxsKSAmJiAoX3NlY3VyaXR5Um9sZXMuc2l6ZSgpID4gMCkpOwotCi0JCUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IGJlYW4uZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQlpZiAoKHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCkgJiYgKHNlY3VyaXR5Um9sZVJlZnMuc2l6ZSgpICE9IDApKSB7Ci0JCQkvLyBDaGVjayB0aGF0IGVhY2ggc2VjdXJpdHkgcm9sZSByZWYgcmVmZXJzIHRvIGEgc2VjdXJpdHkgcm9sZSwKLQkJCS8vIGlmIHNlY3VyaXR5IHJvbGVzIGFyZSBkZWZpbmVkIGluIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yLAotCQkJLy8gYW5kIHRoYXQgZWFjaCByZWZlcmVuY2VkIHNlY3VyaXR5IHJvbGUgZXhpc3RzLgotCQkJRHVwbGljYXRlc1RhYmxlIHJvbGVSZWZOYW1lcyA9IG5ldyBEdXBsaWNhdGVzVGFibGUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlUmVmcy5zaXplKCk7IGkrKykgewotCQkJCVNlY3VyaXR5Um9sZVJlZiByZWYgPSAoU2VjdXJpdHlSb2xlUmVmKSBzZWN1cml0eVJvbGVSZWZzLmdldChpKTsKLQotCQkJCS8vIENoZWNrIHRoYXQgdGhlIHJvbGUgbmFtZSBpcyBzZXQgKDE1LjIuNS4zKQotCQkJCVN0cmluZyByb2xlTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJaWYgKChyb2xlTmFtZSA9PSBudWxsKSB8fCAocm9sZU5hbWUuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyb2xlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBiZWFuTmFtZSA9IChiZWFuLmdldE5hbWUoKSA9PSBudWxsKSA/ICIiIDogYmVhbi5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJlZiwgbmV3IFN0cmluZ1tdIHsgYmVhbk5hbWUgfSwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBCdWlsZCB1cCB0aGUgbGlzdCBvZiBuYW1lcywgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJcm9sZVJlZk5hbWVzLmFkZChuZXcgUm9sZVJlZldyYXBwZXIocmVmKSk7Ci0JCQkJfQotCi0JCQkJLy8gQ2hlY2sgdGhhdCB0aGUgcm9sZSBsaW5rIGlzIHNldCAoMTUuMy4zKQotCQkJCVN0cmluZyByb2xlTGluayA9IHJlZi5nZXRMaW5rKCk7Ci0JCQkJYm9vbGVhbiBpc0xpbmtEZWZpbmVkID0gKChyZWYuZUlzU2V0KENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCkpKSAmJiAocm9sZUxpbmsgIT0gbnVsbCkgJiYgKCFyb2xlTGluay5lcXVhbHMoIiIpKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmICgoYXJlU1JvbGVzRGVmaW5lZCkgJiYgKCFpc0xpbmtEZWZpbmVkKSkgewotCQkJCQkvLyBtdXN0IGhhdmUgcm9sZSBsaW5rIGRlZmluZWQgKDE1LjMuMykKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjgyMywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIHJlZiwgdGhpcyk7Ci0JCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCghYXJlU1JvbGVzRGVmaW5lZCkgJiYgKGlzTGlua0RlZmluZWQpKSB7Ci0JCQkJCS8vIG11c3Qgbm90IGhhdmUgcm9sZSBsaW5rIGRlZmluZWQgKDE1LjIuNS4zKQotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgcmVmLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXJlU1JvbGVzRGVmaW5lZCAmJiBpc0xpbmtEZWZpbmVkKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHJvbGUgbGlzdGVkIGluIHRoZSBsaW5rIGV4aXN0cy4gKDE1LjMuMykKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfc2VjdXJpdHlSb2xlcy5pdGVyYXRvcigpOwotCQkJCQlib29sZWFuIHJvbGVFeGlzdHMgPSBmYWxzZTsKLQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTZWN1cml0eVJvbGUgcm9sZSA9IChTZWN1cml0eVJvbGUpaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYocm9sZS5nZXRSb2xlTmFtZSgpLmVxdWFscyhyb2xlTGluaykpIHsKLQkJCQkJCQlyb2xlRXhpc3RzID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXJvbGVFeGlzdHMpIHsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MjQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCByZWYsIG5ldyBTdHJpbmdbXSB7IHJvbGVOYW1lIH0sIHRoaXMpOwotCQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCS8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSByb2xlLW5hbWVzLiAoMTUuMy4xKQotCQkJaWYgKHJvbGVSZWZOYW1lcy5jb250YWluc0R1cGxpY2F0ZXMoKSkgewotCQkJCUxpc3QgZHVwbGljYXRlcyA9IHJvbGVSZWZOYW1lcy5nZXREdXBsaWNhdGVzKCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODIwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgKChSb2xlUmVmV3JhcHBlcikgaXRlcmF0b3IubmV4dCgpKS5nZXRSb2xlUmVmKCksIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCXJvbGVSZWZOYW1lcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogNi41LjMgVGhlIG9wdGlvbmFsIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlCi0JICouLi4KLQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCSAqIGltcGxlbWVudCB0aGUgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0JICouLi4KLQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkgKiBzeW5jaHJvbml6YXRpb24gY2FsbCBiYWNrcyBiZWNhdXNlIHRoZSBiZWFuIGlzIGluIGNvbnRyb2wgb2YgdGhlIGNvbW1pdCB0aGUgYmVhbiAKLQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JICouLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlc3Npb25UeXBlRWxlbWVudChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVKQkphciBlamJKYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYgKGJlYW4uaXNTZXNzaW9uKCkpIHsKLQkJCVNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKSBiZWFuOwotCi0JCQkvLyBjaGVjayBzeW50YXgKLQkJCWJvb2xlYW4gaXNWYWxpZFNlc3MgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFNlc3Npb25UeXBlRWxlbWVudChzZXNzaW9uKTsKLQkJCWlmICghaXNWYWxpZFNlc3MpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIHNlc3Npb24sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZUVsZW1lbnQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFSkJKYXIgZWpiSmFyLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmIChiZWFuLmlzU2Vzc2lvbigpKSB7Ci0JCQkvLyBjaGVjayBzeW50YXgKLQkJCVNlc3Npb24gc2Vzc2lvbkJlYW4gPSAoU2Vzc2lvbikgYmVhbjsKLQkJCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUcmFuc2FjdGlvblR5cGVFbGVtZW50KHNlc3Npb25CZWFuKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI4MDgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJX3NlY3VyaXR5Um9sZXMgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQotCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcil2Yy5sb2FkTW9kZWwoRUpCVmFsaWRhdG9yTW9kZWxFbnVtLkVKQl9NT0RFTCk7Ci0JCWlmKGVqYkphciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKGVqYkphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJX3NlY3VyaXR5Um9sZXMgPSBlamJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGR1cGxpY2F0ZSBFSkIgbmFtZXMsIGJ1dCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlCi0JICogbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBkdXBsaWNhdGUgRW50ZXJwcmlzZUJlYW4gaW5zdGFuY2UuCi0JICogKFdpdGhvdXQgdGhlIGluc3RhbmNlLCB3ZSBjYW5ub3QgZ2V0IGxpbmUgbnVtYmVycy4pCi0JICoKLQkgKiBUaGlzIGNsYXNzIHdyYXBwZXJzIHRoZSBFbnRlcnByaXNlQmVhbiBpbnN0YW5jZSBzbyB0aGF0IHRoZSB3cmFwcGVyJ3MKLQkgKiBpbXBsZW1lbnRpb24gb2YgZXF1YWxzIGNvbXBhcmVzIHRoZSBuYW1lcywgYnV0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2lsbAotCSAqIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByZWYgZnJvbSB0aGUgZHVwbGljYXRlIG5hbWUuCi0JICovCi0JY2xhc3MgRWpiTmFtZVdyYXBwZXIgewotCQlwcml2YXRlIEVudGVycHJpc2VCZWFuIF9iZWFuID0gbnVsbDsKLQotCQlwdWJsaWMgRWpiTmFtZVdyYXBwZXIoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQkJX2JlYW4gPSBiZWFuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSB7Ci0JCQkJRW50ZXJwcmlzZUJlYW4gb3RoZXIgPSAoRW50ZXJwcmlzZUJlYW4pIG87Ci0JCQkJcmV0dXJuIF9iZWFuLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRCZWFuKCkgewotCQkJcmV0dXJuIF9iZWFuOwotCQl9Ci0JfQotCi0JY2xhc3MgQVNOYW1lV3JhcHBlciB7Ci0JCXByaXZhdGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBfYmVhbiA9IG51bGw7Ci0KLQkJcHVibGljIEFTTmFtZVdyYXBwZXIoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFuKSB7Ci0JCQlfYmVhbiA9IGJlYW47Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb3RoZXIgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbzsKLQkJCQlyZXR1cm4gX2JlYW4uZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkuZXF1YWxzKG90aGVyLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRCZWFuKCkgewotCQkJcmV0dXJuIF9iZWFuOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lDbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUNsYXNzVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlMTNlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzVlJ1bGUgZXh0ZW5kcyBJVmFsaWRhdGlvblJ1bGUgewotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0JLy8gQmVjYXVzZSBjYWxsaW5nIEphdmFDbGFzczo6Z2V0TWV0aG9kc0V4dGVuZGVkKCkgaXMgYW4gZXhwZW5zaXZlIGNhbGwsIG5lZWQgdG8gY2FsbCBpdCBvbmNlCi0JLy8gcGVyIGNsYXNzIGluc3RlYWQgb2YgbXVsdGlwbGUgdGltZXMgcGVyIGNsYXNzLiBIb3dldmVyLCBlYWNoIGNsYXNzIGluIHRoZSBiZWFuIG5lZWRzIGRpZmZlcmVudAotCS8vIGxpc3RzOgotCS8vICAgMS4gS2V5IGNsYXNzIG5lZWRzIG5vIGxpc3RzLgotCS8vICAgMi4gSG9tZSBpbnRlcmZhY2UgKHJlbW90ZSAmIGxvY2FsKSBuZWVkcyB0aGUgYmVhbiBjbGFzcycgZ2V0TWV0aG9kc0V4dGVuZGVkIGxpc3QuCi0JLy8gICAzLiBDb21wb25lbnQgaW50ZXJmYWNlIChyZW1vdGUgJiBsb2NhbCkgbmVlZHMgdGhlIGJlYW4gY2xhc3MnIGdldE1ldGhvZHNFeHRlbmRlZCBsaXN0LgotCS8vICAgNC4gQmVhbiBjbGFzcyBuZWVkcyB0aGUgcmVtb3RlIGhvbWUsIGxvY2FsIGhvbWUsIHJlbW90ZSBjb21wb25lbnQsIGFuZCBsb2NhbCBjb21wb25lbnQncyBnZXRNZXRob2RzRXh0ZW5kZWQgbGlzdC4KLQkvLyBHaXZlbiB0aGF0IHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgY2xhc3MgaW1wbGVtZW50YXRpb24sIGFkZCBhIExpc3RbXSBhcyBhIGZpbmFsIHBhcmFtZXRlciwgYW5kIGVhY2gKLQkvLyBpbXBsZW1lbnRhdGlvbiBjYW4gZmlndXJlIG91dCB3aGF0IHRoZSBMaXN0W10gbmVlZHMgdG8gYmUgcG9wdWxhdGVkIHdpdGgsIGlmIGFueXRoaW5nLiAoaS5lLiwgdGhlCi0JLy8ga2V5IGNsYXNzIHdpbGwgcHJvYmFibHkgcGFzcyBpbiBhIG51bGwgaW5zdGVhZCBvZiBhbiBlbXB0eSBMaXN0LikKLQkvLyAKLQkvLyBTaW1pbGFyIHJlYXNvbmluZyBmb3IgdGhlIExpc3RbXSBvZiBnZXRGaWVsZHNFeHRlbmRlZCgpLgotCXB1YmxpYyBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCXB1YmxpYyBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0JcHVibGljIHZvaWQgcmVnaXN0ZXIoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUNvbXBvbmVudFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JQ29tcG9uZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQwZmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JQ29tcG9uZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRUeXBlIGV4dGVuZHMgSUVKQkludGVyZmFjZVR5cGUgewotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SG9tZUludGVyZmFjZShFbnRlcnByaXNlQmVhbiBiZWFuKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCSW50ZXJmYWNlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJJbnRlcmZhY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Mzg0MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJJbnRlcmZhY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLSAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFSkJJbnRlcmZhY2VUeXBlIGV4dGVuZHMgSUVKQlR5cGUgewotCXB1YmxpYyBib29sZWFuIGlzRUpCSW50ZXJmYWNlTWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci0JcHVibGljIEphdmFIZWxwZXJzIGdldE92ZXJFeHBvc2VkTG9jYWxUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uUnVsZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVJNSV9JSU9QVHlwZVJ1bGVzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMsIGJvb2xlYW4gY2hlY2tSZXR1cm5UeXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBNZXNzYWdlTGltaXRFeGNlcHRpb247Ci0JcHVibGljIGJvb2xlYW4gZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLQlwdWJsaWMgYm9vbGVhbiBmb2xsb3dSTUlfSUlPUEluaGVyaXRhbmNlUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkZDQ5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQlR5cGUgZXh0ZW5kcyBJVHlwZUNvbnN0YW50cywgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGludCBSRU1PVEUgPSAweDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgTE9DQUwgPSAweDI7Ci0JcHVibGljIHN0YXRpYyBpbnQgTkVJVEhFUiA9IDB4NDsKLQkKLQlwdWJsaWMgbG9uZ1tdIGdldFN1cGVydHlwZXMoKTsKLQlwdWJsaWMgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpOwotCQotCS8qKgotCSAqIElmIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9lcyBub3QgbWF0Y2ggb25lIG9mIHRoZSBtZXRob2QgbmFtZXMgd2hpY2ggdGhpcwotCSAqIHJ1bGUgdmFsaWRhdGVzLCB3aGF0IHR5cGUgc2hvdWxkIHRoZSBtZXRob2QgYmUgY29uc2lkZXJlZD8gKGUuZy4gaG9tZSBvciBidXNpbmVzcykuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0RGVmYXVsdE1ldGhvZFR5cGUoKTsKLQlwdWJsaWMgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKTsKLQotCXB1YmxpYyBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCk7Ci0JcHVibGljIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKTsKLQkKLQlwdWJsaWMgaW50IGlzUmVtb3RlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUVKQlZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWZkNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJRUpCVmFsaWRhdGlvbkNvbnRleHQgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCi0JCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCk7Ci0JcHVibGljIElWYWxpZGF0aW9uQ29udGV4dCBnZXRIZWxwZXIoKTsKLQlwdWJsaWMgSVJlcG9ydGVyIGdldFJlcG9ydGVyKCk7Ci0JCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoKTsgLy8gcmV0dXJucyBhbiBlbXB0eSBJTWVzc2FnZSB3aGljaCBjYW4gYmUgcmV1c2VkCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKTsKLQkKLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGVJZkNhbmNlbGxlZCgpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotCQotCXB1YmxpYyBMb2dFbnRyeSBnZXRMb2dFbnRyeSgpOwotCQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUpOwotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKTsKLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcygpOwotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VzKE9iamVjdCB0YXJnZXQpOwotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VzKE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cElkZW50aWZpZXIpOwotCQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSU1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCkgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBNZXNzYWdlTGltaXRFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKSB0aHJvd3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgdGhyb3dzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgdm9pZCBzdWJ0YXNrKFN0cmluZyBtZXNzYWdlSWQpOwotCXB1YmxpYyB2b2lkIHN1YnRhc2soU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCVmFsaWRhdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjg4ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQlZhbGlkYXRvckNvbnN0YW50cyB7Ci0JLy8gTmFtZSBvZiAucHJvcGVydGllcyBmaWxlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiZWpidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIE5hbWUgb2YgbG9nZ2VyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HTkFNRSA9ICJFSkJWYWxpZGF0b3JMb2ciOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gU3RhdHVzIGNvbnN0YW50cyB3aGljaCBkbyBub3QgcmVxdWlyZSBhIG1lc3NhZ2UgcHJlZml4IChlLmcuIEFCQ0QwMDAwRSkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfVkFMSURBVElORyA9ICJTVEFUVVNfVkFMSURBVElORyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1BSSU1BUllfS0VZID0gIjxwcmltYXJ5LWtleT4iOyAvLyB3aGVuIGEga2V5IGNsYXNzIG5hbWUgbmVlZHMgdG8gYmUgZGlzcGxheWVkLCBidXQgdGhhdCBjbGFzcyBpcyBudWxsLCBkaXNwbGF5IHRoaXMgaW5zdGVhZCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9CRUFOX0NMQVNTID0gIjxlamItY2xhc3M+IjsgLy8gd2hlbiBhIGJlYW4gY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0xPQ0FMX0hPTUUgPSAiPGxvY2FsLWhvbWU+IjsgLy8gd2hlbiBhIGxvY2FsLWhvbWUgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0xPQ0FMID0gIjxsb2NhbD4iOyAvLyB3aGVuIGEgbG9jYWwgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0hPTUUgPSAiPGhvbWU+IjsgLy8gd2hlbiBhIGhvbWUgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1JFTU9URSA9ICI8cmVtb3RlPiI7IC8vIHdoZW4gYSByZW1vdGUgY2xhc3MgbmFtZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGF0IGNsYXNzIGlzIG51bGwsIGRpc3BsYXkgdGhpcyBpbnN0ZWFkIC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBXZSB1c2UgYSBzdHJpbmcgaGVyZSBiZWNhdXNlIHRoaXMgaW50ZXJmYWNlIGlzIHNoaXBwZWQgd2l0aCBXQVMsIGJ1dAotCS8vIEoyRUVDb3JlUGx1Z2luIGlzIG5vdC4gVGhlcmVmb3JlIGhhdmluZyB0aGUgSjJFRUNvcmVQbHVnaW4uUExVR0lOX0lEIAotCS8vIGRlcGVuZGVuY3kgd29ya3MgZmluZSBpbiB0aGUgdG9vbGluZyBlbnYsIGJ1dCB3aWxsIHJlc3VsdCBpbiBOb0NsYXNzRGVmRm91bmQgaW4gV0FTCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfQ09SRV9QTFVHSU4gPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZSI7IC8vICROT04tTkxTLTEkIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGVkYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaG9sZHMgdGhlIG1lc3NhZ2UgY29uc3RhbnRzIHRoYXQgYXJlIGNvbW1vbiBhY3Jvc3MKLSAqIHNwZWNpZmljYXRpb25zLiAoZS5nLiBpbnRlcm5hbCBlcnJvciBtZXNzYWdlcywgY2hlY2tzIHRoYXQgYXJlIHRoZSBzYW1lLikKLSAqLwotcHVibGljIGludGVyZmFjZSBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cyB7Ci0JLy8gQ29uc3RhbnRzIHVzZWQgaW4gbWVzc2FnZSBpZHMKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE9OX0JBU0UgPSAiLmkiOyAvLyBTdHJpbmcgdG8gYmUgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgYmFzZSB0eXBlLCBub3QgdGhlIEphdmFDbGFzcyBiZWluZyB2YWxpZGF0ZWQuIChJbmhlcml0ZWQgbWV0aG9kLikgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT05fVEhJUyA9ICIubSI7IC8vIFN0cmluZyB0byBiZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIEphdmFDbGFzcyBiZWluZyB2YWxpZGF0ZWQuIChNZXRob2QgaW1wbCBvbiBKYXZhQ2xhc3MgaXRzZWxmLikgLy8kTk9OLU5MUy0xJAotCi0JLy8gSW50ZXJuYWwgZXJyb3JzIGFuZCBzdWNoCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA0MSA9ICJDSEtKMjA0MSI7IC8vIHVubmFtZWQgcGFja2FnZSAoSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uKSAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQzMyA9ICJDSEtKMjQzMyI7IC8vIGNhbm5vdCByZWZsZWN0IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDU2ID0gIkNIS0oyNDU2IjsgLy8gU2hvdWxkIHRocm93IFggb3IgdGhlcmUgbWF5IGJlIGNvbXBpbGUgZXJyb3JzIGluIHRoZSBkZXBsb3kgY29kZS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTIgPSAiQ0hLSjI4NTIiOyAvLyBUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHZhbGlkYXRpbmcgZWpiLWphci54bWwgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI5MDAgPSAiQ0hLSjI5MDAiOyAvLyBJbnRlcm5hbCBlcnJvciB3aGlsZSBydW5uaW5nIEVKQiB2YWxpZGF0b3IgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI5MDUgPSAiQ0hLSjI5MDUiOyAvLyBFSkIgVmFsaWRhdG9yIGNvdWxkIG5vdCBydW4gYmVjYXVzZSBlamItamFyLnhtbCBjb3VsZCBub3QgYmUgbG9hZGVkLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjkwNyA9ICJDSEtKMjkwNyI7IC8vIFR5cGUgWCwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiBDaGVjayB0aGUgY2xhc3NwYXRoLiAvLyROT04tTkxTLTEkCi0KLQkvLyBTcGVjaWZpY2F0aW9uIHJ1bGVzCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwM0UgPSAiQ0hLSjIwMDNFIjsgLy8gaW1wbGVtZW50IGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIChjYW4gYmUgZXJyb3Igb3IgaW5mbyBkZXBlbmRpbmcgb24gY29udGV4dCkgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDNJID0gIkNIS0oyMDAzSSI7IC8vIGltcGxlbWVudCBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiAoY2FuIGJlIGVycm9yIG9yIGluZm8gZGVwZW5kaW5nIG9uIGNvbnRleHQpIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTQgPSAiQ0hLSjIwMTQiOyAvLyBjbGFzcyBtdXN0IGJlLCBvciBtdXN0IG5vdCBiZSwgYWJzdHJhY3QgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTUgPSAiQ0hLSjIwMTUiOyAvLyBjbGFzcyBtdXN0IGJlLCBvciBtdXN0IG5vdCBiZSwgZmluYWwgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTcgPSAiQ0hLSjIwMTciOyAvLyBjbGFzcy9pbnRlcmZhY2UgbXVzdCBleHRlbmQvaW1wbGVtZW50IFggLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTkgPSAiQ0hLSjIwMTkiOyAvLyBrZXkgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUvYSBsZWdhbCB2YWx1ZSB0eXBlIGluIFJNSS1JSU9QIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjIgPSAiQ0hLSjIwMjIiOyAvLyBjbGFzcyBtdXN0IGJlIHB1YmxpYyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyMyA9ICJDSEtKMjAyMyI7IC8vIGEgbWF0Y2hpbmcgbWV0aG9kIChmb3IgdGhpcyBjb21wb25lbnQgbWV0aG9kKSBtdXN0IGV4aXN0IG9uIHRoZSBiZWFuIGNsYXNzIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNDAgPSAiQ0hLSjIwNDAiOyAvLyAidGhpcyIgbXVzdCBub3QgYmUgcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdCAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMTAzID0gIkNIS0oyMTAzIjsgLy8gSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgYmVhbiBjbGFzcyBtdXN0IGluaGVyaXQgWC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDQgPSAiQ0hLSjIxMDQiOyAvLyBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSBob21lIGNsYXNzIG11c3Qgbm90IGluaGVyaXQgWC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIxMDUgPSAiQ0hLSjIxMDUiOyAvLyBJbiBjb21wb25lbnQgaW5oZXJpdGFuY2UsIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIFguIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMTA2ID0gIkNIS0oyMTA2IjsgLy8gSW4gY29tcG9uZW50IGluaGVyaXRhbmNlLCB0aGUgYmVhbiBtdXN0IHVzZSBYIGFzIGl0cyBwcmltYXJ5IGtleS4gLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjIwNSA9ICJDSEtKMjIwNSI7IC8vIHByaW1hcnkga2V5IGZpZWxkIFggbXVzdCBiZSBwdWJsaWMgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIyMDYgPSAiQ0hLSjIyMDYiOyAvLyBwcmltYXJ5IGtleSBmaWVsZCBYIG11c3QgYmUgYSA8Y21wLWZpZWxkPiAoYW5kIGluIEVKQiAxLjEsIGFsc28gYSBmaWVsZCBvZiB0aGUgYmVhbiBjbGFzcykgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwMiA9ICJDSEtKMjQwMiI7IC8vIFRoZSBjcmVhdGUgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSByZW1vdGUgaW50ZXJmYWNlIHR5cGUgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDMgPSAiQ0hLSjI0MDMiOyAvLyBUaGUgZmluZGVyIG1ldGhvZCBtdXN0IHJldHVybiBYIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwNyA9ICJDSEtKMjQwNyI7IC8vIFRoZSBlamJGaW5kIG1ldGhvZCBtdXN0IHJldHVybiBYIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDExID0gIkNIS0oyNDExIjsgLy8gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAxID0gIkNIS0oyODAxIjsgLy8gbWlzc2luZyA8ZWpiLW5hbWU+IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAyX05BTUVEID0gIkNIS0oyODAyLm5hbWVkIjsvLyA8ZWpiLWNsYXNzPiBjYW5ub3QgYmUgcmVmbGVjdGVkIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAyX1VOTkFNRUQgPSAiQ0hLSjI4MDIudW5uYW1lZCI7Ly8gdW5rbm93biA8ZWpiLWNsYXNzPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwM19OQU1FRCA9ICJDSEtKMjgwMy5uYW1lZCI7Ly8gPGhvbWU+IGNhbm5vdCBiZSByZWZsZWN0ZWQgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDNfVU5OQU1FRCA9ICJDSEtKMjgwMy51bm5hbWVkIjsvLyB1bmtub3duIDxob21lPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwNF9OQU1FRCA9ICJDSEtKMjgwNC5uYW1lZCI7Ly8gPHJlbW90ZT4gY2Fubm90IGJlIHJlZmxlY3RlZCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwNF9VTk5BTUVEID0gIkNIS0oyODA0LnVubmFtZWQiOy8vIHVua25vd24gPHJlbW90ZT4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDYgPSAiQ0hLSjI4MDYiOy8vIDxyZWVudHJhbnQ+IG11c3QgYmUgZWl0aGVyICJUcnVlIiBvciAiRmFsc2UiIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODA3ID0gIkNIS0oyODA3IjsgLy8gPHNlc3Npb24tdHlwZT4gbXVzdCBiZSBlaXRoZXIgIlN0YXRlZnVsIiBvciAiU3RhdGVsZXNzIiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwOCA9ICJDSEtKMjgwOCI7IC8vIDx0cmFuc2FjdGlvbi10eXBlPiBtdXN0IGJlIGVpdGhlciAiQmVhbiIgb3IgIkNvbnRhaW5lciIgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDkgPSAiQ0hLSjI4MDkiOyAvLyA8cGVyc2lzdGVuY2UtdHlwZT4gbXVzdCBiZSBlaXRoZXIgIkJlYW4iIG9yICJDb250YWluZXIiIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTBfTkFNRUQgPSAiQ0hLSjI4MTAubmFtZWQiOy8vIDxwcmltLWtleS1jbGFzcz4gY2Fubm90IGJlIHJlZmxlY3RlZCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMF9VTk5BTUVEID0gIkNIS0oyODEwLnVubmFtZWQiOy8vIHVua25vd24gPHByaW0ta2V5LWNsYXNzPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMV9OQU1FRCA9ICJDSEtKMjgxMS5uYW1lZCI7Ly8gPGZpZWxkLW5hbWU+IG11c3QgZXhpc3Qgb24gdGhlIGJlYW4gY2xhc3MgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTFfVU5OQU1FRCA9ICJDSEtKMjgxMS51bm5hbWVkIjsvLyA8ZmllbGQtbmFtZT4gbXVzdCBleGlzdCAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxMiA9ICJDSEtKMjgxMiI7IC8vIEJlYW4gY2xhc3MgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBvZiBpdHMgZmllbGRzIGFzIGEgPGNtcC1maWVsZD4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTQgPSAiQ0hLSjI4MTQiOyAvLyA8bWV0aG9kPidzIDxlamItbmFtZT4gc2hvdWxkIHNwZWNpZnkgYSBrbm93biBlbnRlcnByaXNlIGJlYW4gLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyMCA9ICJDSEtKMjgyMCI7IC8vIDxzZWN1cml0eS1yb2xlLXJlZj4gbXVzdCBiZSB1bmlxdWUuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODIyID0gIkNIS0oyODIyIjsgLy8gPHNlY3VyaXR5LXJvbGUtcmVmPiBtdXN0IGRlZmluZSBhIDxyb2xlLW5hbWU+IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODIzID0gIkNIS0oyODIzIjsgLy8gPHNlY3VyaXR5LXJvbGUtcmVmPiBzaG91bGQgZGVmaW5lIGEgPHJvbGUtbGluaz4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjQgPSAiQ0hLSjI4MjQiOyAvLyA8c2VjdXJpdHktcm9sZS1yZWY+IG11c3QgaWRlbnRpZnkgYSBrbm93biA8c2VjdXJpdHktcm9sZT4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjUgPSAiQ0hLSjI4MjUiOyAvLyA8c2VjdXJpdHktcm9sZT4gc2hvdWxkIGRlZmluZSB0aGUgPHJvbGUtbmFtZT4gZWxlbWVudC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjYgPSAiQ0hLSjI4MjYiOyAvLyA8c2VjdXJpdHktcm9sZT4gbmFtZSBzaG91bGQgYmUgdW5pcXVlLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgyNyA9ICJDSEtKMjgyNyI7IC8vIENhbm5vdCB1c2UgYSA8cm9sZS1saW5rPiB3aXRob3V0IDxzZWN1cml0eS1yb2xlPiBlbGVtZW50cy4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjggPSAiQ0hLSjI4MjgiOyAvLyBDYW5ub3QgdXNlIGEgPHByaW1rZXktZmllbGQ+IGVsZW1lbnQgd2l0aG91dCBhIHByaW1pdGl2ZSBwcmltYXJ5IGtleS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MjkgPSAiQ0hLSjI4MjkiOyAvLyBFdmVyeSBmaWVsZCBpbiB0aGUgcHJpbWFyeSBrZXkgbXVzdCBleGlzdCBvbiB0aGUgYmVhbiBjbGFzcy4gLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgzMCA9ICJDSEtKMjgzMCI7IC8vIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCBjYW5ub3QgYmUgcmVmbGVjdGVkLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgzMSA9ICJDSEtKMjgzMSI7IC8vIFggbXVzdCBiZSBkZWNsYXJlZCBhcyBhIDxjbXAtZmllbGQ+IGVsZW1lbnQuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODMyID0gIkNIS0oyODMyIjsgLy8gPGVqYi1yZWY+J3MgaG9tZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIEVKQiBtb2R1bGUuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODMzID0gIkNIS0oyODMzIjsgLy8gPGVqYi1yZWY+J3MgcmVtb3RlIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzQgPSAiQ0hLSjI4MzQiOyAvLyA8ZWpiLXJlZj4ncyBiZWFuIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgRUpCIG1vZHVsZS4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzUgPSAiQ0hLSjI4MzUiOyAvLyBCZWFuIFggaXMgYSBZIHR5cGUuIFVwZGF0ZSB0aGUgPGVqYi1yZWYtdHlwZT4gZWxlbWVudC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzYgPSAiQ0hLSjI4MzYiOyAvLyBCZWFuIFggdXNlcyBob21lIFkuIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODM3ID0gIkNIS0oyODM3IjsgLy8gQmVhbiBYIHVzZXMgcmVtb3RlIFkuIFVwZGF0ZSB0aGUgPGVqYi1yZWY+IGVsZW1lbnQuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODM4ID0gIkNIS0oyODM4IjsgLy8gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIGJlYW5zIGJlIG9yZ2FuaXplZCBpbiB0aGUgImVqYiIgc3ViY29udGV4dC4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MzkgPSAiQ0hLSjI4MzkiOyAvLyA8ZW52LWVudHJ5LW5hbWU+IG9mIHRoZSA8ZW52LWVudHJ5PiBlbGVtZW50IG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NDAgPSAiQ0hLSjI4NDAiOyAvLyA8ZW52LWVudHJ5LXR5cGU+IG9mIHRoZSA8ZW52LWVudHJ5PiBlbGVtZW50IG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQxID0gIkNIS0oyODQxIjsgLy8gVGhlIFggbmFtZSwgaW4gdGhlIDxlbnYtZW50cnk+IGVsZW1lbnQsIG11c3QgYmUgdW5pcXVlIGluIHRoZSBiZWFuLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0MiA9ICJDSEtKMjg0MiI7IC8vIDxtZXRob2QtcGFyYW1zPiBpcyBpZ25vcmVkIHdoZW4gPG1ldGhvZC1uYW1lPiBpcyAiKiIgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NDMgPSAiQ0hLSjI4NDMiOyAvLyA8bWV0aG9kPiBYIG11c3QgZXhpc3Qgb24gYmVhbiBZLiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0NCA9ICJDSEtKMjg0NCI7IC8vIEF0IGxlYXN0IG9uZSA8bWV0aG9kPiBzaG91bGQgZXhpc3QgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0NSA9ICJDSEtKMjg0NSI7IC8vIEF0IGxlYXN0IG9uZSA8cm9sZS1uYW1lPiBzaG91bGQgZXhpc3QgaW4gYSA8bWV0aG9kLXBlcm1pc3Npb24+LiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0NiA9ICJDSEtKMjg0NiI7IC8vIE5vIG1ldGhvZHMgY2FuIGJlIGZvdW5kIGZvciB0aGlzIDxtZXRob2QtcGVybWlzc2lvbj4gLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NDcgPSAiQ0hLSjI4NDciOyAvLyBObyBtZXRob2RzIGNhbiBiZSBmb3VuZCBmb3IgdGhpcyA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPiAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg0OSA9ICJDSEtKMjg0OSI7IC8vIENhbm5vdCB2YWxpZGF0ZSBjb21wb25lbnQgaW5oZXJpdGFuY2Ugb2YgWCBiZWNhdXNlIFkgY2Fubm90IGJlIHJlZmxlY3RlZC4gLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzUgPSAiQ0hLSjI4NzUiOyAvLyBFSkIgQ2xpZW50IEpBUiBtdXN0IGV4aXN0IGFuZCBiZSBpbiB0aGUgc2FtZSBFQVIgYXMgdGhpcyBFSkIgSkFSLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODUwID0gIkNIS0oyODUwIjsgLy8gQ2Fubm90IHZhbGlkYXRlIDxtZXRob2Q+IGJlY2F1c2UgWCwgb3Igb25lIG9mIGl0cyBzdXBlcnR5cGVzLCBjYW5ub3QgYmUgcmVmbGVjdGVkLiAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODk1ID0gIkNIS0oyODk1IjsgLy8gZHVwbGljYXRlIDxlamItbmFtZT4gLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lGaWVsZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JRmllbGRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NmY3MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lGaWVsZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIElGaWVsZFR5cGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX01FU1NBR0VfUFJFRklYID0gIiI7IC8vIEZvciB0aGUgdHdvIGdldE1lc3NhZ2VJZF9YIG1ldGhvZHMsIGlmIHRoZSBtZXRob2QgbmV2ZXIgcmVxdWlyZXMgdGhhdCBwYXJ0aWN1bGFyIG1lc3NhZ2UsIHJldHVybiB0aGlzIG1lc3NhZ2UgcHJlZml4IGluc3RlYWQgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBsb25nIGdldElkKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUhvbWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUhvbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjU5NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lIb21lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIb21lVHlwZSBleHRlbmRzIElFSkJJbnRlcmZhY2VUeXBlIHsKLQlwdWJsaWMgSmF2YUNsYXNzIGdldENvbXBvbmVudEludGVyZmFjZShFbnRlcnByaXNlQmVhbiBiZWFuKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTG9jYWxUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSUxvY2FsVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmNkY2ZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTG9jYWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9jYWxUeXBlIHsKLQlwdWJsaWMgaW50IElTX1JFTU9URSA9IElFSkJUeXBlLkxPQ0FMOwotCXB1YmxpYyBpbnQgTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZID0gSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkc7IC8vIElmIGEgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbiB3aGVuIGl0IHNob3VsZG4ndCwgdGhhdCdzIGEgZGVwcmVjYXRlZCB1c2UsIGhlbmNlIGEgd2FybmluZy4KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDgyM2Y4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaG9sZHMgdGhlIG1lc3NhZ2UgY29uc3RhbnRzIHRoYXQgYXJlIHNwZWNpZmljCi0gKiB0byB0aGUgRUpCIDEuMSBzcGVjaWZpY2F0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgZXh0ZW5kcyBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cyB7Ci0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDID0gIi5lamIxMSI7IC8vIEVKQiBzcGVjaWZpY2F0aW9uIGJlaW5nIHZhbGlkYXRlZCAvLyROT04tTkxTLTEkCi0JCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwMSA9ICJDSEtKMjAwMSI7IC8vIFRoZSBrZXkgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIFggbWV0aG9kLiAgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMDIgPSAiQ0hLSjIwMDIiOyAvLyBUaGlzIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgYSBtYXRjaGluZyBlamJQb3N0Q3JlYXRlIG1ldGhvZCBmb3IgdGhpcyBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDA0ID0gIkNIS0oyMDA0IjsgLy8gVGhlIGJlYW4gY2xhc3Mgc2hvdWxkIG5vdCBpbXBsZW1lbnQgdGhlIGVqYkZpbmQgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwNSA9ICJDSEtKMjAwNSI7IC8vIFRoZSBtZXRob2QgbXVzdCBiZSBlaXRoZXIgYSBjcmVhdGUgbWV0aG9kIG9yIGEgZmluZCBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDA2ID0gIkNIS0oyMDA2IjsgLy8gVGhlIGJlYW4gY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwNyA9ICJDSEtKMjAwNyI7IC8vIFRoZSBiZWFuIGNsYXNzIHNob3VsZCBub3QgZGVjbGFyZSB0aGUgZmluYWxpemUoKSBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDA4ID0gIkNIS0oyMDA4IjsgLy8gVGhlIGJlYW4gY2xhc3MgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlamJDcmVhdGUgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAwOSA9ICJDSEtKMjAwOSI7IC8vIFRoZSBiZWFuIGNsYXNzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDEwID0gIkNIS0oyMDEwIjsgLy8gVGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY3JlYXRlIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTEgPSAiQ0hLSjIwMTEiOyAvLyBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBmaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMTIgPSAiQ0hLSjIwMTIiOyAvLyBUaGlzIHR5cGUgbXVzdCBiZSBhbiBpbnRlcmZhY2UuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDEzID0gIkNIS0oyMDEzIjsgLy8gVGhlIGJlYW4gY2xhc3MgbXVzdCBpbXBsZW1lbnQgWC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjAgPSAiQ0hLSjIwMjAiOyAvLyBUaGUga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyMSA9ICJDSEtKMjAyMSI7IC8vIFRoZSBrZXkgY2xhc3MgbXVzdCBkZWZpbmUgYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjQgPSAiQ0hLSjIwMjQiOyAvLyBYIG11c3Qgbm90IGV4aXN0LiBPbmx5IGNyZWF0ZSgpIG1heSBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjUgPSAiQ0hLSjIwMjUiOyAvLyBYIG11c3Qgbm90IGV4aXN0LiBPbmx5IGVqYkNyZWF0ZSgpIG1heSBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMjYgPSAiQ0hLSjIwMjYiOyAvLyBUaGUgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCBhIG1hdGNoaW5nIGVqYkNyZWF0ZSBtZXRob2QgZm9yIHRoaXMgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAyOCA9ICJDSEtKMjAyOCI7IC8vIFRoaXMgbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgYSBtYXRjaGluZyBlamJDcmVhdGUgbWV0aG9kIGlzIGRlZmluZWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDI5ID0gIkNIS0oyMDI5IjsgLy8gVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyBhIG1hdGNoaW5nIGNyZWF0ZSBtZXRob2QgaXMgZGVmaW5lZCBvbiB0aGUgaG9tZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzAgPSAiQ0hLSjIwMzAiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IGhhdmUgYSBtYXRjaGluZyBlamJGaW5kIG1ldGhvZCBpbiB0aGUgYmVhbiBjbGFzcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzIgPSAiQ0hLSjIwMzIiOyAvLyBCZWFuIGNsYXNzIFggbXVzdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzMgPSAiQ0hLSjIwMzMiOyAvLyBUaGUgc2V0RW50aXR5Q29udGV4dCBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzQgPSAiQ0hLSjIwMzQiOyAvLyBUaGUgdW5zZXRFbnRpdHlDb250ZXh0IG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzNSA9ICJDSEtKMjAzNSI7IC8vIFRoZSBlamJBY3RpdmF0ZSBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwMzYgPSAiQ0hLSjIwMzYiOyAvLyBUaGUgZWpiUGFzc2l2YXRlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjAzNyA9ICJDSEtKMjAzNyI7IC8vIFRoZSBlamJSZW1vdmUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDM4ID0gIkNIS0oyMDM4IjsgLy8gVGhlIGVqYkxvYWQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDM5ID0gIkNIS0oyMDM5IjsgLy8gVGhlIGVqYlN0b3JlIG1ldGhvZCBtdXN0IGV4aXN0LiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMTAwID0gIkNIS0oyMTAwIjsgLy8gQm90aCBlbmRzIG9mIHRoZSByb2xlIG11c3QgdXNlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjEwMSA9ICJDSEtKMjEwMSI7IC8vIEJvdGggZW5kcyBvZiB0aGUgcm9sZSBtdXN0IHVzZSB0aGUgc2FtZSB0eXBlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjEwMiA9ICJDSEtKMjEwMiI7IC8vIEVpdGhlciBhIGZpbmRlciBkZXNjcmlwdG9yLCBvciBhIG1hdGNoaW5nIGN1c3RvbSBmaW5kZXIgbWV0aG9kLCBtdXN0IGJlIGRlZmluZWQuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIyMDAgPSAiQ0hLSjIyMDAiOyAvLyBUaGUgc3RhdGljIGZpZWxkIG11c3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMjAxID0gIkNIS0oyMjAxIjsgLy8gVGhlIGZpZWxkIG11c3Qgbm90IGJlIHRyYW5zaWVudC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIyMDIgPSAiQ0hLSjIyMDIiOyAvLyBUaGUgZmllbGQgdHlwZSBpcyBpbnZhbGlkIGZvciBhIDxjbXAtZmllbGQ+LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjIwMyA9ICJDSEtKMjIwMyI7IC8vIFRoZSBmaWVsZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIyMDcgPSAiQ0hLSjIyMDciOyAvLyBGaWVsZCBYIG9uIGJlYW4gWSBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIDxwcmlta2V5LWZpZWxkPi4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwMF9idXMgPSAiQ0hLSjI0MDAuYnVzIjsgLy8gRGVwcmVjYXRlZCB1c2Ugb2YgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwMF9lamJDcmVhdGUgPSAiQ0hLSjI0MDAuZWpiQ3JlYXRlIjsgLy8gRGVwcmVjYXRlZCB1c2Ugb2YgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwMF9lamJGaW5kID0gIkNIS0oyNDAwLmVqYkZpbmQiOyAvLyBEZXByZWNhdGVkIHVzZSBvZiBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDAwX2VqYlBvc3RDcmVhdGUgPSAiQ0hLSjI0MDAuZWpiUG9zdENyZWF0ZSI7IC8vIERlcHJlY2F0ZWQgdXNlIG9mIFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDEgPSAiQ0hLSjI0MDEiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwNSA9ICJDSEtKMjQwNSI7IC8vIGZpbmRCeVByaW1hcnlLZXkgbXVzdCBoYXZlIHRoZSA8cHJpbS1rZXktY2xhc3M+IGFzIGl0cyBhcmd1bWVudC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDYgPSAiQ0hLSjI0MDYiOyAvLyBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBwcmltYXJ5IGtleSB0eXBlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwOF9idXMgPSAiQ0hLSjI0MDguYnVzIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA4X2VqYkNyZWF0ZSA9ICJDSEtKMjQwOC5lamJDcmVhdGUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDhfZWpiRmluZCA9ICJDSEtKMjQwOC5lamJGaW5kIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA4X2VqYlBvc3RDcmVhdGUgPSAiQ0hLSjI0MDguZWpiUG9zdENyZWF0ZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwOV9idXMgPSAiQ0hLSjI0MDkuYnVzIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDA5X2VqYkNyZWF0ZSA9ICJDSEtKMjQwOS5lamJDcmVhdGUiOyAvL1RoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQwOV9lamJGaW5kID0gIkNIS0oyNDA5LmVqYkZpbmQiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDlfZWpiUG9zdENyZWF0ZSA9ICJDSEtKMjQwOS5lamJQb3N0Q3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDEwX2J1cyA9ICJDSEtKMjQxMC5idXMiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDEwX2VqYkNyZWF0ZSA9ICJDSEtKMjQxMC5lamJDcmVhdGUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDEwX2VqYkZpbmQgPSAiQ0hLSjI0MTAuZWpiRmluZCI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTBfZWpiUG9zdENyZWF0ZSA9ICJDSEtKMjQxMC5lamJQb3N0Q3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxMiA9ICJDSEtKMjQxMiI7IC8vIFRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxMyA9ICJDSEtKMjQxMyI7IC8vIFRoZSBhcmd1bWVudCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQxNCA9ICJDSEtKMjQxNCI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgZXhjZXB0aW9uIFguIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDE1ID0gIkNIS0oyNDE1IjsgLy8gVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtYXRjaGluZyBtZXRob2QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDE4ID0gIkNIS0oyNDE4IjsgLy8gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MTkgPSAiQ0hLSjI0MTkiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGEgY3JlYXRlIG1ldGhvZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjAgPSAiQ0hLSjI0MjAiOyAvLyBYIG11c3QgYmUgdGhyb3duIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgaG9tZSBpbnRlcmZhY2UuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDMyID0gIkNIS0oyNDMyIjsgLy8gWCBtdXN0IGJlIHRocm93biBieSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIHJlbW90ZSBpbnRlcmZhY2UuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI5MDggPSAiQ0hLSjI5MDgiOyAvLyBBbiBlbnRlcnByaXNlIGJlYW4gY2Fubm90IGJlIHJlZmxlY3RlZC4gUnVuIHRoZSBYTUwgdmFsaWRhdG9yLiAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjM2I2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBob2xkcyB0aGUgbWVzc2FnZSBjb25zdGFudHMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlCi0gKiBFSkIgMi4wIHNwZWNpZmljYXRpb24gKGUuZy4gTURCLW9ubHkgbWVzc2FnZXMpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgZXh0ZW5kcyBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cyB7Ci0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDID0gIi5lamIyMCI7IC8vIEVKQiBzcGVjaWZpY2F0aW9uIGJlaW5nIHZhbGlkYXRlZCAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBPTl9CQVNFX1NQRUMgPSBPTl9CQVNFICsgU1BFQzsgCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBPTl9USElTX1NQRUMgPSBPTl9USElTICsgU1BFQzsKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0ogPSBudWxsOyAvLyBQbGFjZWhvbGRlciBmb3IgYSBtZXNzYWdlIGlkIHdoZW4gdGhlIGlkIGhhc24ndCBiZWVuIGNyZWF0ZWQgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDE4ID0gIkNIS0oyMDE4IjsgLy8gVGhpcyBkZXBlbmRlbnQgdmFsdWUgY2xhc3MgbXVzdCBiZSBzZXJpYWxpemFibGUuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNDMgPSAiQ0hLSjIwNDMiOyAvLyBUaGlzIGRlcGVuZGVudCB2YWx1ZSBjbGFzcyBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNDQgPSAiQ0hLSjIwNDQiOyAvLyBUaGlzIGRlcGVuZGVudCB2YWx1ZSBjbGFzcyBtdXN0IG5vdCBiZSBhYnN0cmFjdC4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjA1MF9hY2MgPSAiQ0hLSjIwNTAuYWNjIjsgLy8gQW4gYWNjZXNzb3IgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2NvbnN0ciA9ICJDSEtKMjA1MC5jb25zdHIiOyAvLyBBIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2NyZWF0ZSA9ICJDSEtKMjA1MC5jcmVhdGUiOyAvLyBBIGNyZWF0ZSBtZXRob2QgbXVzdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjIwNTBfZWpiQWN0aXZhdGUgPSAiQ0hLSjIwNTAuZWpiQWN0aXZhdGUiOyAvLyBUaGUgZWpiQWN0aXZhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkNyZWF0ZSA9ICJDSEtKMjA1MC5lamJDcmVhdGUiOyAvLyBBbiBlamJDcmVhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkZpbmQgPSAiQ0hLSjIwNTAuZWpiRmluZCI7IC8vIEFuIGVqYkZpbmQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXkgPSAiQ0hLSjIwNTAuZWpiRmluZEJ5UHJpbWFyeUtleSI7IC8vIEFuIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkhvbWUgPSAiQ0hLSjIwNTAuZWpiSG9tZSI7IC8vIEFuIGVqYkhvbWUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYkxvYWQgPSAiQ0hLSjIwNTAuZWpiTG9hZCI7IC8vIEFuIGVqYkxvYWQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlBhc3NpdmF0ZSA9ICJDSEtKMjA1MC5lamJQYXNzaXZhdGUiOyAvLyBBbiBlamJQYXNzaXZhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlBvc3RDcmVhdGUgPSAiQ0hLSjIwNTAuZWpiUG9zdENyZWF0ZSI7IC8vIEFuIGVqYlBvc3RDcmVhdGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlJlbW92ZSA9ICJDSEtKMjA1MC5lamJSZW1vdmUiOyAvLyBBbiBlamJSZW1vdmUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlNlbGVjdCA9ICJDSEtKMjA1MC5lamJTZWxlY3QiOyAvLyBBbiBlamJTZWxlY3QgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VqYlN0b3JlID0gIkNIS0oyMDUwLmVqYlN0b3JlIjsgLy8gQW4gZWpiU3RvcmUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2VxdWFscyA9ICJDSEtKMjA1MC5lcXVhbHMiOyAvLyBBbiBlcXVhbHMgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2ZpbmQgPSAiQ0hLSjIwNTAuZmluZCI7IC8vIEFuIGZpbmQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXkgPSAiQ0hLSjIwNTAuZmluZEJ5UHJpbWFyeUtleSI7IC8vIEFuIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2hhc2hDb2RlID0gIkNIS0oyMDUwLmhhc2hDb2RlIjsgLy8gQW4gaGFzaENvZGUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX2hvbWUgPSAiQ0hLSjIwNTAuaG9tZSI7IC8vIEFuIGhvbWUgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX29uTWVzc2FnZSA9ICJDSEtKMjA1MC5vbk1lc3NhZ2UiOyAvLyBBbiBvbk1lc3NhZ2UgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX3NldEVudGl0eUNvbnRleHQgPSAiQ0hLSjIwNTAuc2V0RW50aXR5Q29udGV4dCI7IC8vIEFuIHNldEVudGl0eUNvbnRleHQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dCA9ICJDSEtKMjA1MC51bnNldEVudGl0eUNvbnRleHQiOyAvLyBBbiB1bnNldEVudGl0eUNvbnRleHQgbWV0aG9kIG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MDQgPSAiQ0hLSjI0MDQiOyAvLyBBcHBsaWNhdGlvbiBleGNlcHRpb24gWCBtdXN0IGV4dGVuZCBqYXZhLmxhbmcuRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDE2ID0gIkNIS0oyNDE2IjsgLy8gQXBwbGljYXRpb24gZXhjZXB0aW9uIFggbXVzdCBub3QgZXh0ZW5kIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQyMSA9ICJDSEtKMjQyMSI7IC8vIGVqYkNyZWF0ZSBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjIgPSAiQ0hLSjI0MjIiOyAvLyBlamJDcmVhdGUgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDIzID0gIkNIS0oyNDIzIjsgLy8gZWpiQ3JlYXRlIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjQgPSAiQ0hLSjI0MjQiOyAvLyBlamJDcmVhdGUgbXVzdCByZXR1cm4gdm9pZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MjYgPSAiQ0hLSjI0MjYiOyAvLyBlamJQb3N0Q3JlYXRlIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQyNyA9ICJDSEtKMjQyNyI7IC8vIGVqYlBvc3RDcmVhdGUgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDI4ID0gIkNIS0oyNDI4IjsgLy8gZWpiUG9zdENyZWF0ZSBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDMwID0gIkNIS0oyNDMwIjsgLy8gWCBtdXN0IGV4aXN0IGZvciB0aGlzIGVqYkhvbWUgbWV0aG9kIHRvIGJlIGNhbGxlZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0MzEgPSAiQ0hLSjI0MzEiOyAvLyBlamJIb21lIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQzOSA9ICJDSEtKMjQzOSI7IC8vIGVqYkhvbWUgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ0MSA9ICJDSEtKMjQ0MSI7IC8vIGJ1c2luZXNzIG1ldGhvZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NDIgPSAiQ0hLSjI0NDIiOyAvLyBidXNpbmVzcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDQzID0gIkNIS0oyNDQzIjsgLy8gYnVzaW5lc3MgbWV0aG9kIG11c3Qgbm90IGJlIHN0YXRpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NDUgPSAiQ0hLSjI0NDUiOyAvLyBvbk1lc3NhZ2UgbXVzdCBiZSBwdWJsaWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDQ2ID0gIkNIS0oyNDQ2IjsgLy8gb25NZXNzYWdlIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ0NyA9ICJDSEtKMjQ0NyI7IC8vIG9uTWVzc2FnZSBtdXN0IG5vdCBiZSBzdGF0aWMuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDQ5ID0gIkNIS0oyNDQ5IjsgLy8gYWNjZXNzb3IgbWV0aG9kIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ1MCA9ICJDSEtKMjQ1MCI7IC8vIGFjY2Vzc29yIG1ldGhvZCBtdXN0IGJlIGFic3RyYWN0IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDUyID0gIkNIS0oyNDUyIjsgLy8gQSB0cmFuc2llbnQgZmllbGQgc2hvdWxkIG5vdCBiZSB0aGUgezB9IHR5cGUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDUzID0gIkNIS0oyNDUzIjsgLy8gVHJhbnNpZW50IGZpZWxkcyBhcmUgZGlzY291cmFnZWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDU0ID0gIkNIS0oyNDU0IjsgLy8gQ01SIGFuZCBDTVAgZmllbGRzIG11c3Qgbm90IGJlIGRlZmluZWQgb24gdGhlIGJlYW4gY2xhc3MuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDU3ID0gIkNIS0oyNDU3IjsgLy8gZWpiRmluZCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NTggPSAiQ0hLSjI0NTgiOyAvLyBlamJGaW5kIG11c3Qgbm90IGJlIGZpbmFsLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ1OSA9ICJDSEtKMjQ1OSI7IC8vIGVqYkZpbmQgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2MSA9ICJDSEtKMjQ2MSI7IC8vIFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciBpbnRlcmZhY2VzLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2MiA9ICJDSEtKMjQ2MiI7IC8vIFRoZSBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJjcmVhdGUiLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2MyA9ICJDSEtKMjQ2MyI7IC8vIFRoZSBtZXRob2QgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICJmaW5kIi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjQgPSAiQ0hLSjI0NjQiOyAvLyBUaGUgbWV0aG9kIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAicmVtb3ZlIiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2NSA9ICJDSEtKMjQ2NSI7IC8vIGhvbWUgbWV0aG9kIFggbXVzdCB0aHJvdyBZIGZvciBaLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2NiA9ICJDSEtKMjQ2NiI7IC8vIHJlbW90ZSBob21lIG1ldGhvZCBYIG11c3Qgbm90IGV4cG9zZSB0aGUgWSB0eXBlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2NyA9ICJDSEtKMjQ2NyI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgQ3JlYXRlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ2OCA9ICJDSEtKMjQ2OCI7IC8vIFRoaXMgaW50ZXJmYWNlIG11c3QgZm9sbG93IFJNSS1JSU9QIHJ1bGVzIGZvciByZW1vdGUgaW50ZXJmYWNlcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0NjkgPSAiQ0hLSjI0NjkiOyAvLyBUaGlzIG1ldGhvZCAoRUpCT2JqZWN0IG9yIEVKQkxvY2FsT2JqZWN0KSBpcyBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3MCA9ICJDSEtKMjQ3MCI7IC8vIFRoaXMgY29tcG9uZW50IG1hdGNoaW5nIG1ldGhvZCBtdXN0IHJldHVybiBYLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3MSA9ICJDSEtKMjQ3MSI7IC8vIFRoaXMgY29tcG9uZW50IG1hdGNoaW5nIG1ldGhvZCBtdXN0IHRocm93IFguIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDcyID0gIkNIS0oyNDcyIjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgcGFzcyBYIGFzIGFuIGFyZ3VtZW50IG9yIHJlc3VsdCB0eXBlLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3MyA9ICJDSEtKMjQ3MyI7IC8vIFRoaXMgKENNUikgbWV0aG9kIG11c3Qgbm90IGJlIGV4cG9zZWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDc0ID0gIkNIS0oyNDc0IjsgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgZXhwb3NlIFguIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDc1ID0gIkNIS0oyNDc1IjsgLy8gZmluZEJ5UHJpbWFyeUtleSdzIGFyZ3VtZW50IG11c3QgYmUgdGhlIHByaW1hcnkga2V5LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3NiA9ICJDSEtKMjQ3NiI7IC8vIFRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIGNyZWF0ZS9lamJDcmVhdGUgbWV0aG9kLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3NyA9ICJDSEtKMjQ3NyI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cgRmluZGVyRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3OCA9ICJDSEtKMjQ3OCI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IE9iamVjdE5vdEZvdW5kRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ3OSA9ICJDSEtKMjQ3OSI7IC8vIGZpbmRCeVByaW1hcnlLZXkgbXVzdCByZXR1cm4gWC4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODAgPSAiQ0hLSjI0ODAiOyAvLyBDTVAvQ01SIGZpZWxkIG5hbWUgbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODEgPSAiQ0hLSjI0ODEiOyAvLyBmaWVsZCBYIG11c3QgYmUgYSA8Y21wLWZpZWxkPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ4MiA9ICJDSEtKMjQ4MiI7IC8vIGZpZWxkIFggbXVzdCBiZSBhIDxjbXItZmllbGQ+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDgzID0gIkNIS0oyNDgzIjsgLy8gQ01QL0NNUiBmaWVsZCBzaG91bGQgbm90IGJlIGV4cG9zZWQgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODQgPSAiQ0hLSjI0ODQiOyAvLyBDTVAvQ01SIGZpZWxkIG11c3QgYmUgZWl0aGVyIGEgcHJpbWl0aXZlIG9yIGEgc2VyaWFsaXphYmxlIHR5cGUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDg1ID0gIkNIS0oyNDg1IjsgLy8gZWpiU2VsZWN0IG1ldGhvZCBtdXN0IGJlIGFic3RyYWN0LiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ4NiA9ICJDSEtKMjQ4NiI7IC8vIGVqYlNlbGVjdCBtdXN0IHJldHVybiBYIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ4NyA9ICJDSEtKMjQ4NyI7IC8vIGVqYlNlbGVjdCBtdXN0IGJlIHB1YmxpYy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODggPSAiQ0hLSjI0ODgiOyAvLyBlamJTZWxlY3QgbXVzdCB0aHJvdyBGaW5kZXJFeGNlcHRpb24gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0ODkgPSAiQ0hLSjI0ODkiOyAvLyBGaWVsZCBtdXN0IGJlIHRoZSBwcmltYXJ5IGtleSB0eXBlLiAvLyROT04tTkxTLTEkCi0JCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5MCA9ICJDSEtKMjQ5MCI7IC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGV4cG9zZWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDkyID0gIkNIS0oyNDkyIjsgLy8gZWpiUmVtb3ZlIG11c3QgYmUgcHVibGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5MyA9ICJDSEtKMjQ5MyI7IC8vIGVqYlJlbW92ZSBtdXN0IG5vdCBiZSBmaW5hbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI0OTQgPSAiQ0hLSjI0OTQiOyAvLyBlamJSZW1vdmUgbXVzdCBub3QgYmUgc3RhdGljLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5NSA9ICJDSEtKMjQ5NSI7IC8vIFRoaXMgZmluZCBtZXRob2QgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjQ5NiA9ICJDSEtKMjQ5NiI7IC8vIFRoaXMgZWpiU2VsZWN0IG1ldGhvZCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNDk3ID0gIkNIS0oyNDk3IjsgLy8gZWpiQ3JlYXRlIG11c3QgdGhyb3cgQ3JlYXRlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2VqYkNyZWF0ZSA9ICJDSEtKMjUwMC5lamJDcmVhdGUiOyAvLyBYIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2VqYkhvbWUgPSAiQ0hLSjI1MDAuZWpiSG9tZSI7IC8vIFggbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDBfZWpiRmluZCA9ICJDSEtKMjUwMC5lamJGaW5kIjsgLy8gWCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwMF9idXNpbmVzcyA9ICJDSEtKMjUwMC5idXMiOyAvLyBYIG11c3QgYmUgc2VyaWFsaXphYmxlIGF0IHJ1bnRpbWUuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAwX2hvbWUgPSAiQ0hLSjI1MDAuaG9tZSI7IC8vIFggbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDBfY3JlYXRlID0gIkNIS0oyNTAwLmNyZWF0ZSI7IC8vIFggbXVzdCBiZSBzZXJpYWxpemFibGUgYXQgcnVudGltZS4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDBfZmluZCA9ICJDSEtKMjUwMC5maW5kIjsgLy8gWCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhdCBydW50aW1lLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAxX2VqYkNyZWF0ZSA9ICJDSEtKMjUwMS5lamJDcmVhdGUiOyAvLyBlamJDcmVhdGUgbXVzdCBub3QgdGhyb3cgYXBwbGljYXRpb24gZXhjZXB0aW9ucy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDFfZWpiUmVtb3ZlID0gIkNIS0oyNTAxLmVqYlJlbW92ZSI7IC8vIGVqYlJlbW92ZSBtdXN0IG5vdCB0aHJvdyBhcHBsaWNhdGlvbiBleGNlcHRpb25zLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwMV9vbk1lc3NhZ2UgPSAiQ0hLSjI1MDEub25NZXNzYWdlIjsgLy8gZWpiUmVtb3ZlIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDJfZWpiRmluZCA9ICJDSEtKMjUwMi5lamJGaW5kIjsgLy8gZWpiRmluZCBtdXN0IG5vdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDJfZWpiU2VsZWN0ID0gIkNIS0oyNTAyLmVqYlNlbGVjdCI7IC8vIGVqYlNlbGVjdCBtdXN0IG5vdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDJfZmluYWxpemUgPSAiQ0hLSjI1MDIuZmluYWxpemUiOyAvLyBmaW5hbGl6ZSBtdXN0IG5vdCBleGlzdC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDIgPSAiQ0hLSjI1MDIiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCBleGlzdC4gIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfYnVzID0gIkNIS0oyNTAzLmJ1cyI7IC8vIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19jcmVhdGUgPSAiQ0hLSjI1MDMuY3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19lamJDcmVhdGUgPSAiQ0hLSjI1MDMuZWpiQ3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19lamJGaW5kID0gIkNIS0oyNTAzLmVqYkZpbmQiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93L25vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAzX2VqYkhvbWUgPSAiQ0hLSjI1MDMuZWpiSG9tZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfZWpiUG9zdENyZWF0ZSA9ICJDSEtKMjUwMy5lamJQb3N0Q3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCB0aHJvdy9ub3QgdGhyb3cgUmVtb3RlRXhjZXB0aW9uLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwM19maW5kID0gIkNIS0oyNTAzLmZpbmQiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHRocm93L25vdCB0aHJvdyBSZW1vdGVFeGNlcHRpb24uIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTAzX2hvbWUgPSAiQ0hLSjI1MDMuaG9tZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDNfb25NZXNzYWdlID0gIkNIS0oyNTAzLm9uTWVzc2FnZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgdGhyb3cvbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbi4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwNF9idXNpbmVzcyA9ICJDSEtKMjUwNC5idXNpbmVzcyI7IC8vIFRoZSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB0aGUgYmVhbiBjbGFzcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDRfY3JlYXRlID0gIkNIS0oyNTA0LmNyZWF0ZSI7IC8vIFRoZSBtYXRjaGluZyBtZXRob2QgbXVzdCBleGlzdCBvbiB0aGUgYmVhbiBjbGFzcy4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDRfZmluZCA9ICJDSEtKMjUwNC5maW5kIjsgLy8gVGhlIG1hdGNoaW5nIG1ldGhvZCBtdXN0IGV4aXN0IG9uIHRoZSBiZWFuIGNsYXNzLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjUwNF9ob21lID0gIkNIS0oyNTA0LmhvbWUiOyAvLyBUaGUgbWF0Y2hpbmcgbWV0aG9kIG11c3QgZXhpc3Qgb24gdGhlIGJlYW4gY2xhc3MuIC8vJE5PTi1OTFMtMSQKLQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDVfZWpiUG9zdENyZWF0ZSA9ICJDSEtKMjUwNS5lamJQb3N0Q3JlYXRlIjsgLy8gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI1MDVfb25NZXNzYWdlID0gIkNIS0oyNTA1Lm9uTWVzc2FnZSI7IC8vIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHZvaWQuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyNTA1X2VqYlJlbW92ZSA9ICJDSEtKMjUwNS5lamJSZW1vdmUiOyAvLyBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB2b2lkLiAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODAwX05BTUVEID0gIkNIS0oyODAwLm5hbWVkIjsgLy8gPGxvY2FsPiBjYW5ub3QgYmUgcmVmbGVjdGVkLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgwMF9VTk5BTUVEID0gIkNIS0oyODAwLnVubmFtZWQiOyAvLyA8bG9jYWw+IG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODA1X05BTUVEID0gIkNIS0oyODA1Lm5hbWVkIjsgLy8gPGxvY2FsLWhvbWU+IGNhbm5vdCBiZSByZWZsZWN0ZWQgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MDVfVU5OQU1FRCA9ICJDSEtKMjgwNS51bm5hbWVkIjsgLy8gPGxvY2FsLWhvbWU+IG11c3QgZXhpc3QuIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODEzID0gIkNIS0oyODEzIjsgLy8gPGVqYi1uYW1lPiBYIG11c3QgYmUgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIuIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODE2ID0gIkNIS0oyODE2IjsgLy8gPGVqYi1yZWxhdGlvbi1uYW1lPiBtdXN0IGJlIHVuaXF1ZSBpbiBlamItamFyLnhtbC4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTcgPSAiQ0hLSjI4MTciOyAvLyA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+IG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiA8ZWpiLXJlbGF0aW9uPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjgxOCA9ICJDSEtKMjgxOCI7IC8vIFRoZSB2YWx1ZSBvZiB0aGUgPG11bHRpcGxpY2l0eT4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiT25lIiBvciAiTWFueSIgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4MTkgPSAiQ0hLSjI4MTkiOyAvLyA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IHswfSBtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODIxID0gIkNIS0oyODIxIjsgLy8gPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4gezB9IG11c3QgZXhpc3QgaW4gdGhlIG1vZHVsZSAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODQ4ID0gIkNIS0oyODQ4IjsgLy8gPGNhc2NhZGUtZGVsZXRlPiBtdXN0IGJlIHVzZWQgd2l0aCBhIDxtdWx0aXBsaWNpdHk+IG9mICJPbmUiIC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODU0ID0gIkNIS0oyODU0IjsgLy8gPGFic3RyYWN0LXNjaGVtYS1uYW1lPiB7MH0gbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyLnhtbCBmaWxlIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODU1ID0gIkNIS0oyODU1IjsgLy8gPGNtcC1maWVsZD4gezB9IG11c3QgYmUgYSBKYXZhIHByaW1pdGl2ZSBvciBhIEphdmEgc2VyaWFsaXphYmxlIHR5cGUgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTYgPSAiQ0hLSjI4NTYiOyAvLyA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSB0aGUgezF9IHR5cGUgb3IgYSBjb2xsZWN0aW9uIHRoZXJlb2YgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTcgPSAiQ0hLSjI4NTciOyAvLyA8Y21yLWZpZWxkPiB7MH0gbXVzdCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBhbmQgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTggPSAiQ0hLSjI4NTgiOyAvLyA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+IG11c3QgZXhpc3QgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NTkgPSAiQ0hLSjI4NTkiOyAvLyBSZXNlcnZlZCBpZGVudGlmaWVyIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiA8ZWpiLW5hbWU+IC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODYwID0gIkNIS0oyODYwIjsgLy8gUmVzZXJ2ZWQgaWRlbnRpZmllciB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYW4gPGFic3RyYWN0LXNjaGVtYS1uYW1lPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg2NiA9ICJDSEtKMjg2NiI7IC8vIDxjbXItZmllbGQ+IHswfSBtdXN0IGJlIGRlZmluZWQgb24gezF9IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODY3ID0gIkNIS0oyODY3IjsgLy8gVGhpcyBiZWFuIGNhbiBoYXZlIG9ubHkgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0byBvdGhlciBiZWFucyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg2OCA9ICJDSEtKMjg2OCI7IC8vIFRoZSB2YWx1ZSBvZiB0aGUgPGNtci1maWVsZC10eXBlPiBlbGVtZW50IG11c3QgYmUgZWl0aGVyICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIgb3IgImphdmEudXRpbC5TZXQiIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODY5ID0gIkNIS0oyODY5IjsgLy8gQXQgbGVhc3Qgb25lIDxlamItcmVsYXRpb25zaGlwLXJvbGU+IG11c3QgZGVmaW5lIGEgPGNtci1maWVsZD4gLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg3MCA9ICJDSEtKMjg3MCI7IC8vIDxlamItbmFtZT4gezB9IG11c3QgZXhpc3QgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzEgPSAiQ0hLSjI4NzEiOyAvLyA8ZWpiLW5hbWU+IHswfSBtdXN0IHJlZmVyIHRvIGEgQ01QIGJlYW4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4NzIgPSAiQ0hLSjI4NzIiOyAvLyBUaGUgdmFsdWUgb2YgdGhlIDxjbXAtdmVyc2lvbj4gZWxlbWVudCBtdXN0IGJlIGVpdGhlciAiMS54IiBvciAiMi54IiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg3MyA9ICJDSEtKMjg3MyI7IC8vIE1pZ3JhdGUgdGhpcyBiZWFuJ3MgZGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgQ01QIENvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nLiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg3NCA9ICJDSEtKMjg3NCI7IC8vIE1pZ3JhdGUgdGhpcyBFSkIgbW9kdWxlJ3MgZGVmYXVsdCBkYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZy4gLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4ODAgPSAiQ0hLSjI4ODAiOyAvLyBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGEgPGxvY2FsLWhvbWU+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODgxID0gIkNIS0oyODgxIjsgLy8gVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxob21lPiAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDSEtKMjg4MiA9ICJDSEtKMjg4MiI7IC8vIFRoaXMgYmVhbiBtdXN0IHByb3ZpZGUgYSA8bG9jYWw+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODgzID0gIkNIS0oyODgzIjsgLy8gVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBhIDxyZW1vdGU+IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENIS0oyODg0ID0gIkNIS0oyODg0IjsgLy8gVGhpcyBiZWFuIG11c3QgcHJvdmlkZSBlaXRoZXIgYSA8bG9jYWwtaG9tZT4gb3IgYSA8aG9tZT4gLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hLSjI4ODUgPSAiQ0hLSjI4ODUiOyAvLyBUaGlzIGJlYW4gbXVzdCBwcm92aWRlIGVpdGhlciBhIDxsb2NhbD4gb3IgYSA8cmVtb3RlPiAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzZmMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXRob2RBbmRGaWVsZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTk9fTUVUSE9EUyA9IDB4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRVhDTFVERURfTUVUSE9EID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlcjsgLy8gMHgxICgxKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFWENMVURFRF9GSUVMRCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8gMHgyICgyKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPVEhFUl9GSUVMRCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8gMHg0ICg0KQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ0NFU1NPUiA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDggKDgpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJVU0lORVNTID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MTAgKDE2KQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIENMSU5JVCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDIwICgzMikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQ09OU1RSVUNUT1IgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg0MCAoNjQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIENPTlNUUlVDVE9SX05PUEFSTSA9ICBDT05TVFJVQ1RPUiB8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8gMHg0MHwweDgwICgxOTIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIENSRUFURSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDEwMCAoMjU2KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBDUkVBVEVfTk9QQVJNID0gQ1JFQVRFIHwgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAgLy8weDEwMHwweDIwMCAoNzY4KQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJBQ1RJVkFURV9OT1BBUk0gPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg0MDAgKDEwMjQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQkNSRUFURSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDgwMCAoMjA0OCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCQ1JFQVRFX05PUEFSTSA9IEVKQkNSRUFURSB8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsvLzB4ODAwfDB4MTAwMCAoNjE0NCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCRklORCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgIC8vMHgyMDAwICg4MTkyKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJGSU5EQllQUklNQVJZS0VZID0gRUpCRklORCB8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDIwMDB8MHg0MDAwICgyNDU3NikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCSE9NRSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDgwMDAgKDMyNzY4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJMT0FEX05PUEFSTSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDEwMDAwICg2NTUzNikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCUEFTU0lWQVRFX05PUEFSTSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDIwMDAwICgxMzEsMDcyKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBFSkJQT1NUQ1JFQVRFID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4NDAwMDAgKDI2MiwxNDQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQlJFTU9WRV9OT1BBUk0gPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg4MDAwMCAoNTI0LDI4OCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUpCU0VMRUNUID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MTAwMDAwICgxLDA0OCw1NzYpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVKQlNUT1JFX05PUEFSTSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsvLzB4MjAwMDAwICgyLDA5NywxNTIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVRVUFMUyA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgIC8vMHg0MDAwMDAgKDQsMTk0LDMwNCkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRklORCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDgwMDAwMCAoOCwzODgsNjA4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGSU5EQllQUklNQVJZS0VZID0gRklORCB8IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDEwMDAwMDAgKDI1LDE2NSw4MjQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZJTkFMSVpFX05PUEFSTSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDIwMDAwMDAgKDMzLDU1NCw0MzIpCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEhBU0hDT0RFX05PUEFSTSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDQwMDAwMDAgKDY3LDEwOCw4NjQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEhFTFBFUiA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDgwMDAwMDAgKDEzNCwyMTcsNzI4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBIT01FID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5tZXRob2RfYW5kX2ZpZWxkX2NvdW50ZXIgPDw9IDEpOyAvLzB4MTAwMDAwMDAgKDI2OCw0MzUsNDU2KQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPTk1FU1NBR0UgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHgyMDAwMDAwMCAoNTM2LDg3MCw5MTIpCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFNFUklBTFZFUlNJT05VSUQgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg0MDAwMDAwMCAoMSwwNzMsNzQxLDgyNCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgU0VUU0VTU0lPTkNPTlRFWFQgPSAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5Lm1ldGhvZF9hbmRfZmllbGRfY291bnRlciA8PD0gMSk7IC8vMHg4MDAwMDAwMCAoMiwxNDcsNDgzLDY0OCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgU0VURU5USVRZQ09OVEVYVCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDEwMDAwMDAwMCAoNCwyOTQsOTY3LDI5NikKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTSA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkubWV0aG9kX2FuZF9maWVsZF9jb3VudGVyIDw8PSAxKTsgLy8weDIwMDAwMDAwMCAoOCw1ODksOTM0LDU5MikKLQkKLQotCS8vIHByZWZpeGVzIG9mIHNvbWUgbWV0aG9kIG5hbWVzCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQyA9ICJjIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VKQiA9ICJlamIiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRUpCQyA9ICJlamJDIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VKQkYgPSAiZWpiRiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FSkJGSU5EID0gImVqYkZpbmQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRUpCSE9NRSA9ICJlamJIb21lIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VKQlNFTEVDVCA9ICJlamJTZWxlY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRiA9ICJmIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZJTkQgPSAiZmluZCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9HRVQgPSAiZ2V0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1NFTEVDVCA9ICJzZWxlY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfU0VUID0gInNldCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1ldGhvZCBuYW1lcwkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfQ1JFQVRFID0gImNyZWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRUpCQUNUSVZBVEUgPSAiZWpiQWN0aXZhdGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VKQkNSRUFURSA9ICJlamJDcmVhdGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VKQkZJTkRCWVBSSU1BUllLRVkgPSAiZWpiRmluZEJ5UHJpbWFyeUtleSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRUpCTE9BRCA9ICJlamJMb2FkIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FSkJQQVNTSVZBVEUgPSAiZWpiUGFzc2l2YXRlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFID0gImVqYlBvc3RDcmVhdGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VKQlJFTU9WRSA9ICJlamJSZW1vdmUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX0VKQlNUT1JFID0gImVqYlN0b3JlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9FUVVBTFMgPSAiZXF1YWxzIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9GSU5BTElaRSA9ICJmaW5hbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSA9ICJmaW5kQnlQcmltYXJ5S2V5IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9ETkFNRV9IQVNIQ09ERSA9ICJoYXNoQ29kZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfT05NRVNTQUdFID0gIm9uTWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfUkVNT1ZFID0gInJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfU0VUU0VTU0lPTkNPTlRFWFQgPSAic2V0U2Vzc2lvbkNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQgPSAic2V0RW50aXR5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUVfVU5TRVRFTlRJVFlDT05URVhUID0gInVuc2V0RW50aXR5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBmaWVsZCBuYW1lcwotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQgPSAic2VyaWFsVmVyc2lvblVJRCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBGb3Igc3Vic3RpdHV0aW9uIGludG8gc3RyaW5ncwotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EU0lHTkFUVVJFX0VRVUFMUyA9ICJlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RTSUdOQVRVUkVfSEFTSENPREUgPSAiaGFzaENvZGUoKSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JTWV0aG9kVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXRob2RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDMxYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lNZXRob2RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLSAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgSU1ldGhvZFR5cGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpOwotCi0JcHVibGljIGxvbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCB0eXBlIGlzIGEgZGVmYXVsdCB0eXBlIGZvciBhbiBlbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4KLQkgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1ldGhvZCBvbiB0aGUgaG9tZSBpcyBuZWl0aGVyIGEgY3JlYXRlIG5vciBhIGZpbmQgbWV0aG9kLCB0aGVuCi0JICogaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgZGVmYXVsdCB0eXBlLCBhIGhvbWUgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKTsgLy8gcmVxdWlyZWQgbWV0aG9kIGlzIG1pc3NpbmcKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCk7IC8vIG1ldGhvZCBzaG91bGQgbm90IGV4aXN0Ci0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpOyAvLyBtZXRob2QgdGhyb3dzIChvciBkb2Vzbid0IHRocm93KSBSZW1vdGVFeGNlcHRpb24KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCk7IC8vIG1ldGhvZCBpcyBtaXNzaW5nIGl0cyBtYXRjaGluZyBtZXRob2Qgb24gdGhlIGJlYW4gY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCk7IC8vIHBhcmFtZXRlciBvciByZXR1cm4gdHlwZSBpcyBub3QgYSBsZWdhbCBSTUktSUlPUCB0eXBlCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVJlbW90ZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JUmVtb3RlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODUxMWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JUmVtb3RlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZVR5cGUgewotCXB1YmxpYyBpbnQgSVNfUkVNT1RFID0gSUVKQlR5cGUuUkVNT1RFOwotCXB1YmxpYyBpbnQgTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZID0gSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SOyAvLyBJZiBhIG1ldGhvZCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBpdCBzaG91bGQsIFJNSUMgYmxvd3MgdXAsIGhlbmNlIHRoaXMgc2l0dWF0aW9uIGlzIGFuIGVycm9yLgotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lUeXBlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVR5cGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ZWYxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVR5cGVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUeXBlQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGxvbmcgTk9fU1VQRVJUWVBFID0gMHgwOwotCQotCXB1YmxpYyBzdGF0aWMgbG9uZyBMT0NBTF9DT01QT05FTlRfSU5URVJGQUNFID0gQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyOyAvLyAweDEgKDEpCi0JcHVibGljIHN0YXRpYyBsb25nIFJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vIDB4MiAoMikKLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX0VOVElUWUJFQU4gPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsgLy8gMHg0ICg0KQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfRUpCTE9DQUxIT01FID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vMHg4ICg4KQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1QgPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsvLzB4MTAgKDE2KQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfRUpCSE9NRSA9IChDbGFzc1V0aWxpdHkuc3VwZXJ0eXBlX2NvdW50ZXIgPDw9IDEpOyAvLzB4MjAgKDMyKQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfRUpCT0JKRUNUID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vMHg0MCAoNjQpCi0JCi0JcHVibGljIHN0YXRpYyBsb25nIEpBVkFfTEFOR19PQkpFQ1QgPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsvLzB4ODAgKDEyOCkKLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOID0gKENsYXNzVXRpbGl0eS5zdXBlcnR5cGVfY291bnRlciA8PD0gMSk7IC8vMHgxMDAgKDI1NikKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUiA9IChDbGFzc1V0aWxpdHkuc3VwZXJ0eXBlX2NvdW50ZXIgPDw9IDEpOyAgLy8weDIwMCAoNTEyKQotCQotCXB1YmxpYyBzdGF0aWMgbG9uZyBKQVZBWF9FSkJfU0VTU0lPTkJFQU4gPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsgLy8weDQwMCAoMTAyNCkKLQlwdWJsaWMgc3RhdGljIGxvbmcgSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04gPSAoQ2xhc3NVdGlsaXR5LnN1cGVydHlwZV9jb3VudGVyIDw8PSAxKTsgLy8gMHg4MDAgKDIwNDgpCi0JCi0JLy8gcHJpbWl0aXZlIHR5cGVzCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEID0gInZvaWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gY2xhc3MgYW5kIGludGVyZmFjZSB0eXBlcwotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfSU9fSU9FWENFUFRJT04gPSAiamF2YS5pby5JT0V4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX0lPX1NFUklBTElaQUJMRSA9ICJqYXZhLmlvLlNlcmlhbGl6YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUID0gImphdmEubGFuZy5PYmplY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQV9MQU5HX0VYQ0VQVElPTiA9ICJqYXZhLmxhbmcuRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfTEFOR19SVU5USU1FRVhDRVBUSU9OID0gImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URSA9ICJqYXZhLnJtaS5SZW1vdGUiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OID0gImphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX1VUSUxfQ09MTEVDVElPTiA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04gPSAiamF2YS51dGlsLkVudW1lcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFfVVRJTF9TRVQgPSAiamF2YS51dGlsLlNldCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfQ1JFQVRFRVhDRVBUSU9OID0gImphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUJFQU4gPSAiamF2YXguZWpiLkVudGl0eUJlYW4iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0VKQkVYQ0VQVElPTiA9ICJqYXZheC5lamIuRUpCRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJIT01FID0gImphdmF4LmVqYi5FSkJIb21lIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTEhPTUUgPSAiamF2YXguZWpiLkVKQkxvY2FsSG9tZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfRUpCT0JKRUNUID0gImphdmF4LmVqYi5FSkJPYmplY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNUID0gImphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQ09OVEVYVCA9ICJqYXZheC5lamIuRW50aXR5Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfRklOREVSRVhDRVBUSU9OID0gImphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOID0gImphdmF4LmVqYi5NZXNzYWdlRHJpdmVuQmVhbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfT0JKRUNUTk9URk9VTkRFWENFUFRJT04gPSAiamF2YXguZWpiLk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQkVBTiA9ICJqYXZheC5lamIuU2Vzc2lvbkJlYW4iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05DT05URVhUID0gImphdmF4LmVqYi5TZXNzaW9uQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTiA9ICJqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRSA9ICJqYXZheC5qbXMuTWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSID0gImphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfSkFWQVhfVFJBTlNBQ1RJT05fVVNFUlRSQU5TQUNUSU9OID0gImphdmF4LnRyYW5zYWN0aW9uLlVzZXJUcmFuc2FjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVmFsaWRhdGlvblJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JVmFsaWRhdGlvblJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhNjUwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVZhbGlkYXRpb25SdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uUnVsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydWxlLiBHaXZlbiB0aGlzIGlkLCB0aGlzIHJ1bGUgY2FuIGJlIGxvYWRlZCBmcm9tCi0JICogdGhlIEFic3RyYWN0RUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZHMgb2YgdGhlIHJ1bGVzIHdoaWNoIHRoaXMgcnVsZSBkZXBlbmRzIG9uLiAoVGhhdCBpcywKLQkgKiBpZiBvbmUgb2YgdGhlc2UgcnVsZXMgcnVucywgdGhlbiB0aGlzIHJ1bGUgbmVlZHMgdG8gYmUgcnVuLikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgdmFsaWRhdGlvbiBydWxlIHdoaWNoIG5lZWRzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhpcyBydWxlIGlzIHJ1bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREZXBlbmRlbnQoSVZhbGlkYXRpb25SdWxlIHJ1bGUpOwotCQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhlIElWYWxpZGF0aW9uUnVsZXMgd2hpY2ggZGVwZW5kIG9uIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldERlcGVuZGVudHMoKTsKLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgdGFyZ2V0J3MgcGFyZW50IGFuZCB0aGUgY2hhbmdlZCB0YXJnZXQsIHJldHVybiB0aGUgdGFyZ2V0IHdoaWNoIAotCSAqIHRoaXMgcnVsZSBzaG91bGQgdmFsaWRhdGUuIEZvciBleGFtcGxlLCBpZiBhIGJlYW4gY2xhc3MgY2hhbmdlcywgdGhlbiB0aGUgCi0JICogdGFyZ2V0IHBhcmVudCB3b3VsZCBiZSB0aGUgRW50ZXJwcmlzZUJlYW4sIGFuZCB0aGlzIHJ1bGUgY291bGQgcmV0dXJuCi0JICogdGhlIGhvbWUgaW50ZXJmYWNlLCBvciB0aGUgY29tcG9uZW50IGludGVyZmFjZSwgb3IgdGhlIGtleSBjbGFzcywgZXRjLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpOwotCi0JLyoqCi0JICogSWYgYW55IGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQgYmVmb3JlIHRoZSB2YWxpZGF0ZSBtZXRob2QgaXMgY2FsbGVkLAotCSAqIHRoZW4gdGhhdCBpbmZvcm1hdGlvbiBzaG91bGQgYmUgY2FsY3VsYXRlZCBoZXJlLiBUaGlzIGNhY2hlZCBpbmZvcm1hdGlvbiBzaG91bGQKLQkgKiBiZSBjbGVhbmVkIHVwIGluIHRoZSBwb3N0VmFsaWRhdGUgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIHRhcmdldCBvYmplY3QuIFJlcG9ydCBhbGwgbWVzc2FnZXMsIGxvYWQgbW9kZWxzLCBldGMuCi0JICogdGhyb3VnaCB0aGUgSVZhbGlkdGlvbkNvbnRleHQgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2xlYW5zIHVwIGFueSByZXNvdXJjZXMgY2FsY3VsYXRlZCBvciBjYWNoZWQgaW4gdGhlIHByZVZhbGlkYXRlIG1ldGhvZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHZhbGlkYXRlIG1ldGhvZCBoYXMgY29tcGxldGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFRvIGVuYWJsZSB0aGlzIHJ1bGUgZm9yIHJldXNlLCByZXNldCBhbnkgc3RvcmVkIHZhbHVlcyAod2hpY2ggd2VyZSBjYWxjdWxhdGVkIAotCSAqIGR1cmluZyB2YWxpZGF0aW9uKSB0byB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpOwotCQotCS8qKgotCSAqIFJldHVybiBhIG1hcHBpbmcgb2YgQ0hLSiBtZXNzYWdlIGlkIHRvIHRoZSBtZXNzYWdlIGlkIGluIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICovCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlSWRzKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVZhbGlkYXRpb25SdWxlTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0lWYWxpZGF0aW9uUnVsZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljMzkwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSVZhbGlkYXRpb25SdWxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25SdWxlTGlzdCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfRUpCSkFSID0gbmV3IEludGVnZXIoMSk7IC8vIEVKQiAxLjEgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9FSkJFWFQgPSBuZXcgSW50ZWdlcigyKTsgLy8gRUpCIDEuMSBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0VKQkpBUiA9IG5ldyBJbnRlZ2VyKDMpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfRUpCRVhUID0gbmV3IEludGVnZXIoNCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9FTlRFUlBSSVNFQkVBTiA9IG5ldyBJbnRlZ2VyKDUpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9FTlRFUlBSSVNFQkVBTiA9IG5ldyBJbnRlZ2VyKDYpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1MgPSBuZXcgSW50ZWdlcig3KTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfU0VTU0lPTl9SRU1PVEUgPSBuZXcgSW50ZWdlcig4KTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfU0VTU0lPTl9IT01FID0gbmV3IEludGVnZXIoOSk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0NNUF9CRUFOQ0xBU1MgPSBuZXcgSW50ZWdlcigxMCk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0NNUF9SRU1PVEUgPSBuZXcgSW50ZWdlcigxMSk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0NNUF9IT01FID0gbmV3IEludGVnZXIoMTIpOyAvLyBFSkIgMS4xIG9yIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIxMV9DTVBfS0VZQ0xBU1MgPSBuZXcgSW50ZWdlcigxMyk7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfQk1QX0JFQU5DTEFTUyA9IG5ldyBJbnRlZ2VyKDE0KTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfQk1QX1JFTU9URSA9IG5ldyBJbnRlZ2VyKDE1KTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMTFfQk1QX0hPTUUgPSBuZXcgSW50ZWdlcigxNik7IC8vIEVKQiAxLjEgb3IgRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjExX0JNUF9LRVlDTEFTUyA9IG5ldyBJbnRlZ2VyKDE3KTsgLy8gRUpCIDEuMSBvciBFSkIgMi4wIHByb2plY3RzCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1MgPSBuZXcgSW50ZWdlcigxOCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9SRU1PVEUgPSBuZXcgSW50ZWdlcigxOSk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9IT01FID0gbmV3IEludGVnZXIoMjApOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwgPSBuZXcgSW50ZWdlcigyMSk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUUgPSBuZXcgSW50ZWdlcigyMik7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUyA9IG5ldyBJbnRlZ2VyKDIzKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFID0gbmV3IEludGVnZXIoMjQpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FID0gbmV3IEludGVnZXIoMjUpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTCA9IG5ldyBJbnRlZ2VyKDI2KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FID0gbmV3IEludGVnZXIoMjcpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQ01QX0JFQU5DTEFTUyA9IG5ldyBJbnRlZ2VyKDI4KTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0NNUF9SRU1PVEUgPSBuZXcgSW50ZWdlcigyOSk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9DTVBfSE9NRSA9IG5ldyBJbnRlZ2VyKDMwKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0NNUF9MT0NBTCA9IG5ldyBJbnRlZ2VyKDMxKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0NNUF9MT0NBTEhPTUUgPSBuZXcgSW50ZWdlcigzMik7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9DTVBfS0VZQ0xBU1MgPSBuZXcgSW50ZWdlcigzMyk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEVKQjIwX0JNUF9CRUFOQ0xBU1MgPSBuZXcgSW50ZWdlcigzNCk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9CTVBfUkVNT1RFID0gbmV3IEludGVnZXIoMzUpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQk1QX0hPTUUgPSBuZXcgSW50ZWdlcigzNik7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9CTVBfTE9DQUwgPSBuZXcgSW50ZWdlcigzNyk7IC8vIEVKQiAyLjAgcHJvamVjdHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9CTVBfTE9DQUxIT01FID0gbmV3IEludGVnZXIoMzgpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRUpCMjBfQk1QX0tFWUNMQVNTID0gbmV3IEludGVnZXIoMzkpOyAvLyBFSkIgMi4wIHByb2plY3RzCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFSkIyMF9NRVNTQUdFX0JFQU5DTEFTUyA9IG5ldyBJbnRlZ2VyKDQwKTsgLy8gRUpCIDIuMCBwcm9qZWN0cwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0ludmFsaWRJbnB1dEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0ludmFsaWRJbnB1dEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ1ZDMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLS8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gZWl0aGVyIGEgdHlwZSBjYW5ub3QgYmUgcmVmbGVjdGVkCi0gKiBvciB3aGVuIGV4cGVjdGVkIGlucHV0IChlLmcuIHRoZSByZW1vdGUgaW50ZXJmYWNlKSBpcyBudWxsLgotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZElucHV0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQlwcml2YXRlIEphdmFDbGFzcyBfY2xhc3MgPSBudWxsOwotCQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uCi0JICogYXZhaWxhYmxlIHRvIGlkZW50aWZ5IHdoYXQgaXMgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgSW52YWxpZElucHV0RXhjZXB0aW9uKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgd2hlbiB0aGUgZ2l2ZW4gdHlwZSBjYW5ub3QgYmUgcmVmbGVjdGVkLgotCSAqLwotCXB1YmxpYyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCV9jbGFzcyA9IGNsYXp6OwotCX0KLQkKLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIF9jbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRU1lc3NhZ2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFTWVzc2FnZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjcyMTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFTWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogTWVzc2FnZSBrZXkgY29uc3RhbnRzIGZvciBKMkVFIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRU1lc3NhZ2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSRUZfQ0FURUdPUlkgPSAiZXJlZnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0NBVEVHT1JZID0gIndhcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NBVEVHT1JZID0gImVhcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCSkFSX0NBVEVHT1JZID0gImVqYmphcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBMSUNBVElPTkNMSUVOVF9DQVRFR09SWSA9ICJhcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX05BTUUgPSAidmFsaWRhdG9yLm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRVJFRk5BTUUgPSAiRVJST1JfRUFSX01JU1NJTkdfRVJFRk5BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEUgPSAiRVJST1JfRUFSX01JU1NJTkdfRVJFRlRZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0lOVkFMSURfRVJFRlRZUEUgPSAiRVJST1JfRUFSX0lOVkFMSURfRVJFRlRZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUgPSAiRVJST1JfRUFSX01JU1NJTkdfRVJFRkhPTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX01JU1NJTkdfRVJFRlJFTU9URSA9ICJFUlJPUl9FQVJfTUlTU0lOR19FUkVGUkVNT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFID0gIkVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGID0gIkVSUk9SX0VBUl9EVVBMSUNBVEVfUkVTUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfU0VSVklDRVJFRiA9ICJFUlJPUl9FQVJfRFVQTElDQVRFX1NFUlZJQ0VSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUYgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9TRUNVUklUWVJPTEVSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUYgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9FSkJSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUYgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9SRVNFTlZSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRUFSX0RVUExJQ0FURV9NRVNTU0FHRURFU1RJTkFUSU9OUkVGID0gIkVSUk9SX0VBUl9EVVBMSUNBVEVfTUVTU1NBR0VERVNUSU5BVElPTlJFRiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWI4NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBoYW5kbGVycyA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKCk7Ci0JcHJvdGVjdGVkIENsYXNzTG9hZGVyIHJlc291cmNlQ2xhc3NMb2FkZXI7Ci0JcHJvdGVjdGVkIGphdmEudXRpbC5Mb2NhbGUgbG9jYWxlID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1bmRsZU5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLS8qKgotICogUmVzb3VyY2VIYW5kbGVyIGNvbnN0cnVjdG9yLiAgVGhpcyBjb25zdHJ1Y3RvciB1c2VzIHRoZSBkZWZhdWx0IGxvY2FsZS4KLSAqCi0gKi8KLXB1YmxpYyBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBSZXNvdXJjZUhhbmRsZXIgY29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIFRoZSBMb2NhbGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxvY2FsZSB0byBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICovCi1wdWJsaWMgSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIoTG9jYWxlIGxvY2FsZSkgewotCXN1cGVyKCk7Ci0Jc2V0TG9jYWxlKGxvY2FsZSk7Ci19Ci0vKioKLSAqIEdldHRlciBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZSBwcm9wZXJ0eS4gIFRoaXMgcHJvcGVydHkgaXMgbGF6aWx5IGluaXRpYWxpemVkIHVzaW5nIHRoZQotICogbG9jYWxlIHByb3BlcnR5OyBzbyB0aGF0IHByb3BlcnR5IG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICoKLSAqIEByZXR1cm4gVGhlIFJlc291cmNlQnVuZGxlIG9iamVjdCBjb250YWluaW5nIHRoZSBtZXNzYWdlcyB0byBiZSBoYW5kbGVkIGJ5IHRoaXMgaW5zdGFuY2UuCi0gKi8KLXB1YmxpYyBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKCkgewotCWlmICh0aGlzLmJ1bmRsZSA9PSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0UmVzb3VyY2VDbGFzc0xvYWRlcigpID09IG51bGwpCi0JCQkJdGhpcy5idW5kbGUgPSBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSxnZXRMb2NhbGUoKSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5idW5kbGUgPSBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSxnZXRMb2NhbGUoKSwgZ2V0UmVzb3VyY2VDbGFzc0xvYWRlcigpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHJldHJpZXZpbmcgYnVuZGxlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsvLyROT04tTkxTLTEkCi0JCQkJIiB1c2luZyBsb2NhbGU6ICIgKyBnZXRMb2NhbGUoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IC8vIGVuZHRyeQotCX0gLy8gZW5kaWYKLQlyZXR1cm4gdGhpcy5idW5kbGU7Ci19Ci0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvNS8wMSAyOjI2OjI0IFBNKQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JcmV0dXJuIGJ1bmRsZU5hbWU7Ci19Ci0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKi8KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcykgewotCQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MpLmdldE1lc3NhZ2Uoa2V5KTsKLQkKLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGFycmF5LgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnIFRoZSBPYmplY3QgYXJyYXkgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywgT2JqZWN0IGFyZ1tdKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcykuZ2V0TWVzc2FnZShrZXksIGFyZyk7Ci19Ci0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbmQgZm9ybWF0IHRoZSBtZXNzYWdlIHVzaW5nCi0gKiB0aGUgc3BlY2lmaWVkIE9iamVjdCBhcnJheS4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZyBUaGUgT2JqZWN0IGFycmF5IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlLgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcga2V5LCBDbGFzcyBhQ2xhc3MsIE9iamVjdCBhcmdbXSwgTG9jYWxlIGxvY2FsZSkgewotCQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MsIGxvY2FsZSkuZ2V0TWVzc2FnZShrZXksIGFyZyk7Ci19Ci0vKioKLSAqIEdldCB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBhbmQgZm9ybWF0IHRoZSBtZXNzYWdlIHVzaW5nCi0gKiB0aGUgc3BlY2lmaWVkIFN0cmluZyBhcmd1bWVudC4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywgU3RyaW5nIGFyZzEpIHsKLQkKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzKS5nZXRNZXNzYWdlKGtleSwgYXJnMSk7Ci0KLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcga2V5LCBDbGFzcyBhQ2xhc3MsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikgewotCQotCXJldHVybiBnZXRIYW5kbGVyKGZpbGVOYW1lLCBhQ2xhc3MpLmdldE1lc3NhZ2Uoa2V5LCBhcmcxLCBhcmcyKTsKLQotfQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAyLgotICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDMuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGtleSwgQ2xhc3MgYUNsYXNzLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcykuZ2V0TWVzc2FnZShrZXksIGFyZzEsIGFyZzIsIGFyZzMpOwotCQotfQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMS4KLSAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAyLgotICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDMuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcga2V5LCBDbGFzcyBhQ2xhc3MsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMsIFN0cmluZyBhcmc0KSB7Ci0KLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzKS5nZXRNZXNzYWdlKGtleSwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0KLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAzLgotICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDQuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEBwYXJhbSBhcmc1IFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSA1LgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBrZXksIENsYXNzIGFDbGFzcywKLQkJCQkJCSBTdHJpbmcgYXJnMSwgCi0JCQkJCQkgU3RyaW5nIGFyZzIsIAotCQkJCQkJIFN0cmluZyBhcmczLCAKLQkJCQkJCSBTdHJpbmcgYXJnNCwgCi0JCQkJCQkgU3RyaW5nIGFyZzUpIHsKLQkKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSwgYUNsYXNzKS5nZXRNZXNzYWdlKGtleSwKLQkJCQkJCSBhcmcxLCAKLQkJCQkJCSBhcmcyLCAKLQkJCQkJCSBhcmczLCAKLQkJCQkJCSBhcmc0LCAKLQkJCQkJCSBhcmc1KTsKLQkKLX0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gKgotICogQHBhcmFtIGZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqLwotCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGtleSwgQ2xhc3MgYUNsYXNzLCBMb2NhbGUgbG9jYWxlKSB7Ci0JCi0JcmV0dXJuIGdldEhhbmRsZXIoZmlsZU5hbWUsIGFDbGFzcywgbG9jYWxlKS5nZXRNZXNzYWdlKGtleSk7Ci0JCi19Ci0vKioKLSAqIEdldCB0aGUgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcGFzc2VkIHByb3BlcnR5IGZpbGUuCi0gKgotICogQHJldHVybiBUaGUgcmVzb3VyY2UgaGFuZGxlciBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gb2J0YWluIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgc3RhdGljIEoyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIGdldEhhbmRsZXIoU3RyaW5nIGZpbGVOYW1lLCBDbGFzcyBhQ2xhc3MpIHsKLQlyZXR1cm4gZ2V0SGFuZGxlcihmaWxlTmFtZSxhQ2xhc3MsTG9jYWxlLmdldERlZmF1bHQoKSk7Ci19Ci0vKioKLSAqIEdldCB0aGUgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcGFzc2VkIHByb3BlcnR5IGZpbGUuCi0gKgotICogQHJldHVybiBUaGUgcmVzb3VyY2UgaGFuZGxlciBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8gb2J0YWluIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgc3RhdGljIEoyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIGdldEhhbmRsZXIoU3RyaW5nIGZpbGVOYW1lLCBDbGFzcyBhQ2xhc3MsIExvY2FsZSBsb2NhbGUpIHsKLQlTdHJpbmcgaGFuZGxlcktleSA9IGdldEhhbmRsZXJLZXkoZmlsZU5hbWUsIGxvY2FsZSk7Ci0JaWYgKGhhbmRsZXJzLmdldChoYW5kbGVyS2V5KSA9PSBudWxsKSB7Ci0JCUoyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIHRlbXAgPSBuZXcgSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIobG9jYWxlKTsKLQkJdGVtcC5zZXRSZXNvdXJjZUNsYXNzTG9hZGVyKGFDbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQkJdGVtcC5zZXRCdW5kbGVOYW1lKGZpbGVOYW1lKTsKLQkJaGFuZGxlcnMucHV0KGhhbmRsZXJLZXksdGVtcCk7Ci0JfQotCQotCXJldHVybiAoSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIpKGhhbmRsZXJzLmdldChoYW5kbGVyS2V5KSk7Ci19Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIYW5kbGVyS2V5KFN0cmluZyBfYmFzZU5hbWUsIExvY2FsZSBsb2NhbGUpIHsKLQlTdHJpbmdCdWZmZXIgbG9jYWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIl8iKS5hcHBlbmQobG9jYWxlLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQlpZiAobG9jYWxlLnRvU3RyaW5nKCkuZXF1YWxzKCIiKSkvLyROT04tTkxTLTEkCi0JICBsb2NhbGVOYW1lLnNldExlbmd0aCgwKTsKLQlyZXR1cm4gX2Jhc2VOYW1lICsgbG9jYWxlTmFtZS50b1N0cmluZygpOwotICB9ICAgICAgCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxLzI2LzIwMDEgMTowNDo1MCBQTSkKLSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0UmVzb3VyY2VDbGFzc0xvYWRlcigpIHsKLQlyZXR1cm4gcmVzb3VyY2VDbGFzc0xvYWRlcjsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvMjYvMjAwMSAxOjA0OjUwIFBNKQotICogQHBhcmFtIG5ld1Jlc291cmNlQ2xhc3NMb2FkZXIgamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0gKi8KLXB1YmxpYyB2b2lkIHNldFJlc291cmNlQ2xhc3NMb2FkZXIoamF2YS5sYW5nLkNsYXNzTG9hZGVyIG5ld1Jlc291cmNlQ2xhc3NMb2FkZXIpIHsKLQlyZXNvdXJjZUNsYXNzTG9hZGVyID0gbmV3UmVzb3VyY2VDbGFzc0xvYWRlcjsKLX0KLQotLyoqCi0gKiBTZXR0ZXIgZm9yIHRoZSBsb2NhbGUgcHJvcGVydHkuCi0gKgotICogQHBhcmFtIFRoZSBsb2NhbGUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7Ci0JdGhpcy5sb2NhbGUgPSBsb2NhbGU7Ci19Ci0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvNS8wMSAyOjI2OjI0IFBNKQotICogQHBhcmFtIG5ld0J1bmRsZU5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgdm9pZCBzZXRCdW5kbGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3QnVuZGxlTmFtZSkgewotCWJ1bmRsZU5hbWUgPSBuZXdCdW5kbGVOYW1lOwotfQotCi0KLS8qKgotICogR2V0dGVyIGZvciB0aGUgbG9jYWxlIHByb3BlcnR5LgotICoKLSAqIEByZXR1cm4gVGhlIGxvY2FsZS4KLSAqLwotcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7Ci0JaWYgKGxvY2FsZSA9PSBudWxsKQotCQlsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCXJldHVybiBsb2NhbGU7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gKgotICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQuCi0gKi8KLQotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJdGVtcCA9IGdldEJ1bmRsZSgpLmdldFN0cmluZyhrZXkpOwotCX0KLQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRXhjZXB0aW9uOiAiICsgZXgpOy8vJE5PTi1OTFMtMSQKLQkJdGVtcCA9ICI8PEtleTogIiArIGtleSArICIgbm90IGZvdW5kIGluIHJlc291cmNlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsgIj4+IjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIHRlbXA7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGFycmF5LgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZyBUaGUgT2JqZWN0IGFycmF5IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlLgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3QgYXJnW10pIHsKLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJdGVtcCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEJ1bmRsZSgpLmdldFN0cmluZyhrZXkpLCBhcmcpOwotCX0KLQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRXhjZXB0aW9uOiAiICsgZXgpOy8vJE5PTi1OTFMtMSQKLQkJdGVtcCA9ICI8PEtleTogIiArIGtleSArICIgbm90IGZvdW5kIGluIHJlc291cmNlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsgIj4+IjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIHRlbXA7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50LgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcxKSB7Ci0KLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKGFyZzEgIT0gbnVsbCkgewotCQkJT2JqZWN0IG1zZ29ialtdID0gbmV3IE9iamVjdFsxXTsKLQkJCW1zZ29ialswXSA9IGFyZzE7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXksIG1zZ29iaik7Ci0JCX0gCi0JCWVsc2UgewotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5KTsKLQkJfQotCX0KLQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgRXhjZXB0aW9uOiAiICsgZXgpOy8vJE5PTi1OTFMtMSQKLQkJdGVtcCA9ICI8PEtleTogIiArIGtleSArICIgbm90IGZvdW5kIGluIHJlc291cmNlOiAiICsgZ2V0QnVuZGxlTmFtZSgpICsgIj4+IjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0JcmV0dXJuIHRlbXA7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAxLgotICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDIuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotCi1wdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB7Ci0JU3RyaW5nIHRlbXAgPSBudWxsOwotCXRyeSB7Ci0JCWlmICgoYXJnMSAhPSBudWxsKSAmJiAoYXJnMiAhPSBudWxsKSkgewotCQkJT2JqZWN0IG1zZ29ialtdID0gbmV3IE9iamVjdFsyXTsKLQkJCW1zZ29ialswXSA9IGFyZzE7Ci0JCQltc2dvYmpbMV0gPSBhcmcyOwotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5LCBtc2dvYmopOwotCQl9IAotCQllbHNlIHsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIEV4Y2VwdGlvbjogIiArIGV4KTsvLyROT04tTkxTLTEkCi0JCXRlbXAgPSAiPDxLZXk6ICIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiByZXNvdXJjZTogIiArIGdldEJ1bmRsZU5hbWUoKSArICI+PiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiB0ZW1wOwotCi19Ci0KLS8qKgotICogR2V0IHRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGFuZCBmb3JtYXQgdGhlIG1lc3NhZ2UgdXNpbmcKLSAqIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAxLgotICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDIuCi0gKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMy4KLSAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugc3RyaW5nLgotICovCi0KLXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKSB7Ci0JU3RyaW5nIHRlbXAgPSBudWxsOwotCXRyeSB7Ci0JCWlmICgoYXJnMSAhPSBudWxsKSAmJiAoYXJnMiAhPSBudWxsKSAmJiAoYXJnMyAhPSBudWxsKSkgewotCQkJT2JqZWN0IG1zZ29ialtdID0gbmV3IE9iamVjdFszXTsKLQkJCW1zZ29ialswXSA9IGFyZzE7Ci0JCQltc2dvYmpbMV0gPSBhcmcyOwotCQkJbXNnb2JqWzJdID0gYXJnMzsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSwgbXNnb2JqKTsKLQkJfSAKLQkJZWxzZSB7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXkpOwotCQl9Ci0JfQotCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBFeGNlcHRpb246ICIgKyBleCk7Ly8kTk9OLU5MUy0xJAotCQl0ZW1wID0gIjw8S2V5OiAiICsga2V5ICsgIiBub3QgZm91bmQgaW4gcmVzb3VyY2U6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKyAiPj4iOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gdGVtcDsKLQkKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAzLgotICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDQuCi0gKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHN0cmluZy4KLSAqLwotCi1wdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywgU3RyaW5nIGFyZzQpIHsKLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKChhcmcxICE9IG51bGwpICYmIChhcmcyICE9IG51bGwpICYmIChhcmczICE9IG51bGwpICYmIChhcmc0ICE9IG51bGwpKSB7Ci0JCQlPYmplY3QgbXNnb2JqW10gPSBuZXcgT2JqZWN0WzRdOwotCQkJbXNnb2JqWzBdID0gYXJnMTsKLQkJCW1zZ29ialsxXSA9IGFyZzI7Ci0JCQltc2dvYmpbMl0gPSBhcmczOwotCQkJbXNnb2JqWzNdID0gYXJnNDsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSwgbXNnb2JqKTsKLQkJfSAKLQkJZWxzZSB7Ci0JCQl0ZW1wID0gZ2V0TWVzc2FnZShrZXkpOwotCQl9Ci0JfQotCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBFeGNlcHRpb246ICIgKyBleCk7Ly8kTk9OLU5MUy0xJAotCQl0ZW1wID0gIjw8S2V5OiAiICsga2V5ICsgIiBub3QgZm91bmQgaW4gcmVzb3VyY2U6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKyAiPj4iOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQlyZXR1cm4gdGVtcDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIGZvcm1hdCB0aGUgbWVzc2FnZSB1c2luZwotICogdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDEuCi0gKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgMi4KLSAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSAzLgotICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIHZhcmlhYmxlIDQuCi0gKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUgNC4KLSAqIEBwYXJhbSBhcmc1IFRoZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSB2YXJpYWJsZSA1LgotICogQHJldHVybiBUaGUgbWVzc2FnZSBzdHJpbmcuCi0gKi8KLQotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksCi0JCQkJCQkgU3RyaW5nIGFyZzEsIAotCQkJCQkJIFN0cmluZyBhcmcyLCAKLQkJCQkJCSBTdHJpbmcgYXJnMywgCi0JCQkJCQkgU3RyaW5nIGFyZzQsIAotCQkJCQkJIFN0cmluZyBhcmc1KSB7Ci0KLQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKChhcmcxICE9IG51bGwpICYmIChhcmcyICE9IG51bGwpICYmIChhcmczICE9IG51bGwpICYmIAotCQkJCShhcmc0ICE9IG51bGwpICYmIChhcmc1ICE9IG51bGwpICkgewotCQkJT2JqZWN0IG1zZ29ialtdID0gbmV3IE9iamVjdFs1XTsKLQkJCW1zZ29ialswXSA9IGFyZzE7Ci0JCQltc2dvYmpbMV0gPSBhcmcyOwotCQkJbXNnb2JqWzJdID0gYXJnMzsKLQkJCW1zZ29ialszXSA9IGFyZzQ7Ci0JCQltc2dvYmpbNF0gPSBhcmc1OwotCQkJdGVtcCA9IGdldE1lc3NhZ2Uoa2V5LCBtc2dvYmopOwotCQl9IAotCQllbHNlIHsKLQkJCXRlbXAgPSBnZXRNZXNzYWdlKGtleSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIEV4Y2VwdGlvbjogIiArIGV4KTsvLyROT04tTkxTLTEkCi0JCXRlbXAgPSAiPDxLZXk6ICIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiByZXNvdXJjZTogIiArIGdldEJ1bmRsZU5hbWUoKSArICI+PiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiB0ZW1wOwotCQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjdhYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuU2VjdXJpdHlSb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgzLzkvMjAwMSAzOjM0OjM5IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IsIEoyRUVNZXNzYWdlQ29uc3RhbnRzIHsKLSAgcHJvdGVjdGVkIElSZXBvcnRlciBfcmVwb3J0ZXI7Ci0gIHByb3RlY3RlZCBJVmFsaWRhdGlvbkNvbnRleHQgX2hlbHBlcjsKLQotCXB1YmxpYyBKMkVFVmFsaWRhdG9yKCkKLQl7Ci0gIAkgICAgaW5pdGlhbGl6ZSgpOwotCX0KLS8qKgotICogPHA+Q3JlYXRlIGFtIDxlbT5lcnJvcjwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZQotICogY2FjaGVkIHJlcG9ydGVyLiAgVGhpcyBmb3JtIG9mIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcwotICogZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLjwvcD4KLSAqCi0gKiBAcGFyYW0gbXNnSWQgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0gKi8KLSAKLXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtc2dJZCkKLXsKLSAgYWRkRXJyb3IoZ2V0QmFzZU5hbWUoKSwgbXNnSWQsIG51bGwpOwotfQotLyoqCi0gKiA8cD5DcmVhdGUgYW0gPGVtPmVycm9yPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlCi0gKiBjYWNoZWQgcmVwb3J0ZXIuICBUaGlzIGZvcm0gb2YgPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzCi0gKiBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuPC9wPgotICoKLSAqIEBwYXJhbSBtc2dJZCBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLSAqLwotIAotcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzKQotewotICBhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBtc2dJZCwgbXNnQXJncyk7Ci19Ci0vKioKLSAqIDxwPkNyZWF0ZSBhbSA8ZW0+ZXJyb3I8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUKLSAqIGNhY2hlZCByZXBvcnRlci4gIFRoaXMgZm9ybSBvZiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMKLSAqIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG5vIGFyZ3VtZW50cy48L3A+Ci0gKgotICogQHBhcmFtIG1zZ0NhdGVnb3J5IFRoZSBiYXNlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgYnVuZGxlIHRvIHVzZS4KLSAqIEBwYXJhbSBtc2dJZCBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLSAqLwotIAotcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1zZ0NhdGVnb3J5LCBTdHJpbmcgbXNnSWQpCi17Ci0gIGFkZEVycm9yKG1zZ0NhdGVnb3J5LCBtc2dJZCwgbnVsbCk7Ci19Ci0vKioKLSAqIDxwPkNyZWF0ZSBhbiA8ZW0+ZXJyb3I8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0bwotICogdGhlIGNhY2hlZCByZXBvcnRlci4gIFRoaXMgZm9ybSBvZiA8Y29kZT5hZGRFcnJvcjwvY29kZT4KLSAqIGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG9uZSBvciBtb3JlIGFyZ3VtZW50cy48L3A+Ci0gKgotICogQHBhcmFtIG1zZ0NhdGVnb3J5IFRoZSBiYXNlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgYnVuZGxlIHRvIHVzZS4KLSAqIEBwYXJhbSBtc2dJZCBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLSAqIEBwYXJhbSBtc2dBcmdzIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLSAqLwotCi1wdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzKQotewotCXRoaXMuYWRkRXJyb3IoYnVuZGxlTmFtZSwgbXNnSWQsIG1zZ0FyZ3MsIG51bGwpOwotfQotLyoqCi0gKiA8cD5DcmVhdGUgYW4gPGVtPmVycm9yPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8KLSAqIHRoZSBjYWNoZWQgcmVwb3J0ZXIuICBUaGlzIGZvcm0gb2YgPGNvZGU+YWRkRXJyb3I8L2NvZGU+Ci0gKiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBvbmUgb3IgbW9yZSBhcmd1bWVudHMuPC9wPgotICoKLSAqIEBwYXJhbSBtc2dDYXRlZ29yeSBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0gKiBAcGFyYW0gbXNnSWQgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0gKiBAcGFyYW0gbXNnQXJncyBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UuCi0gKi8KLQotcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgT2JqZWN0IHRhcmdldCkKLXsKLSAgX3JlcG9ydGVyLmFkZE1lc3NhZ2UoIHRoaXMsCi0JICBuZXcgTWVzc2FnZSgKLQkJICAJYnVuZGxlTmFtZSwgCi0JICAJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCSAgCW1zZ0lkLCAKLQkJICAgIG1zZ0FyZ3MsCi0JCSAgICB0YXJnZXQpKTsKLX0KLXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUpIHsKLQlJTWVzc2FnZSBtZXNzYWdlID0gIG5ldyBNZXNzYWdlKAotCQkgIAlidW5kbGVOYW1lLCAKLQkgIAkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJICAJbXNnSWQsIAotCQkgICAgbXNnQXJncywKLQkJICAgIHRhcmdldCk7Ci0JbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLX0KLXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MsIE9iamVjdCB0YXJnZXQsIFN0cmluZyBncm91cE5hbWUsIGludCBsaW5lTnVtYmVyKQotewotCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgKLQkJICAJYnVuZGxlTmFtZSwgCi0JICAJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCSAgCW1zZ0lkLCAKLQkJICAgIG1zZ0FyZ3MsCi0JCSAgICB0YXJnZXQpOwotCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwkKLQltZXNzYWdlLnNldEdyb3VwTmFtZShncm91cE5hbWUpOwotCQotICBfcmVwb3J0ZXIuYWRkTWVzc2FnZSggdGhpcywgbWVzc2FnZSk7Ci0JICAKLX0KLS8qKgotICogPHA+Q3JlYXRlIGFuIDxlbT5pbmZvcm1hdGlvbmFsPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQKLSAqIHRvIHRoZSBjYWNoZWQgcmVwb3J0ZXIuICBUaGlzIGZvcm0gb2YgPGNvZGU+YWRkRXJyb3I8L2NvZGU+Ci0gKiBpcyBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuPC9wPgotICoKLSAqIEBwYXJhbSBtc2dJZCBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLSAqLwotCi1wdWJsaWMgdm9pZCBhZGRJbmZvKFN0cmluZyBtc2dJZCkKLXsKLSAgYWRkSW5mbyhnZXRCYXNlTmFtZSgpLCBtc2dJZCwgbnVsbCk7Ci19Ci0vKioKLSAqIDxwPkNyZWF0ZSBhbiA8ZW0+aW5mb3JtYXRpb25hbDwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0Ci0gKiB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiAgVGhpcyBmb3JtIG9mIDxjb2RlPmFkZEVycm9yPC9jb2RlPgotICogaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLjwvcD4KLSAqCi0gKiBAcGFyYW0gbXNnSWQgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0gKiBAcGFyYW0gbXNnQXJncyBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UuCi0gKi8KLQotcHVibGljIHZvaWQgYWRkSW5mbyhTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MpCi17Ci0gIGFkZEluZm8oZ2V0QmFzZU5hbWUoKSwgbXNnSWQsIG1zZ0FyZ3MpOwotfQotLyoqCi0gKiA8cD5DcmVhdGUgYW4gPGVtPmluZm9ybWF0aW9uYWw8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdAotICogdG8gdGhlIGNhY2hlZCByZXBvcnRlci4gIFRoaXMgZm9ybSBvZiA8Y29kZT5hZGRFcnJvcjwvY29kZT4KLSAqIGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG5vIGFyZ3VtZW50cy48L3A+Ci0gKgotICogQHBhcmFtIG1zZ0NhdGVnb3J5IFRoZSBiYXNlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgYnVuZGxlIHRvIHVzZS4KLSAqIEBwYXJhbSBtc2dJZCBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLSAqLwotCi1wdWJsaWMgdm9pZCBhZGRJbmZvKFN0cmluZyBtc2dDYXRlZ29yeSwgU3RyaW5nIG1zZ0lkKQotewotICBhZGRJbmZvKG1zZ0NhdGVnb3J5LCBtc2dJZCwgbnVsbCk7Ci19Ci0vKioKLSAqIDxwPkNyZWF0ZSBhbiA8ZW0+aW5mb3JtYXRpb25hbDwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlCi0gKiBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiAgVGhpcyBmb3JtIG9mIDxjb2RlPmFkZEVycm9yPC9jb2RlPgotICogaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgb25lIG9yIG1vcmUgYXJndW1lbnRzLjwvcD4KLSAqCi0gKiBAcGFyYW0gbXNnQ2F0ZWdvcnkgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotICogQHBhcmFtIG1zZ0lkIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotICogQHBhcmFtIG1zZ0FyZ3MgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotICovCi0KLXB1YmxpYyB2b2lkIGFkZEluZm8oU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncykKLXsKLSAgYWRkSW5mbyhidW5kbGVOYW1lLCBtc2dJZCwgbXNnQXJncywgbnVsbCk7Ci19Ci0vKioKLSAqIDxwPkNyZWF0ZSBhbiA8ZW0+aW5mb3JtYXRpb25hbDwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlCi0gKiBpdCB0byB0aGUgY2FjaGVkIHJlcG9ydGVyLiAgVGhpcyBmb3JtIG9mIDxjb2RlPmFkZEVycm9yPC9jb2RlPgotICogaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgb25lIG9yIG1vcmUgYXJndW1lbnRzLjwvcD4KLSAqCi0gKiBAcGFyYW0gbXNnQ2F0ZWdvcnkgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotICogQHBhcmFtIG1zZ0lkIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotICogQHBhcmFtIG1zZ0FyZ3MgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotICovCi0KLXB1YmxpYyB2b2lkIGFkZEluZm8oU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgT2JqZWN0IHRhcmdldCkKLXsKLSAgX3JlcG9ydGVyLmFkZE1lc3NhZ2UoIHRoaXMsCi0JICBuZXcgTWVzc2FnZSgKLQkJICAJYnVuZGxlTmFtZSwgCi0JICAJCUlNZXNzYWdlLkxPV19TRVZFUklUWSwKLQkJICAJbXNnSWQsIAotCQkgICAgbXNnQXJncywKLQkJICAgIHRhcmdldCkpOwotfQotLyoqCi0gKiA8cD5DcmVhdGUgYSA8ZW0+d2FybmluZzwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvIHRoZQotICogY2FjaGVkIHJlcG9ydGVyLiAgVGhpcyBmb3JtIG9mIDxjb2RlPmFkZEVycm9yPC9jb2RlPiBpcwotICogZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgbm8gYXJndW1lbnRzLjwvcD4KLSAqCi0gKiBAcGFyYW0gbXNnSWQgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0gKi8KLSAKLXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1zZ0lkKQotewotICBhZGRXYXJuaW5nKGdldEJhc2VOYW1lKCksIG1zZ0lkLCBudWxsKTsKLX0KLS8qKgotICogPHA+Q3JlYXRlIGEgPGVtPndhcm5pbmc8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0byB0aGUKLSAqIGNhY2hlZCByZXBvcnRlci4gIFRoaXMgZm9ybSBvZiA8Y29kZT5hZGRFcnJvcjwvY29kZT4gaXMKLSAqIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG5vIGFyZ3VtZW50cy48L3A+Ci0gKgotICogQHBhcmFtIG1zZ0lkIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotICogQHBhcmFtIG1zZ0FyZ3MgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotICovCi0gCi1wdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncykKLXsKLSAgYWRkV2FybmluZyhnZXRCYXNlTmFtZSgpLCBtc2dJZCwgbXNnQXJncyk7Ci19Ci0vKioKLSAqIDxwPkNyZWF0ZSBhIDxlbT53YXJuaW5nPC9lbT4gbWVzc2FnZSBhbmQgcm91dGUgaXQgdG8gdGhlCi0gKiBjYWNoZWQgcmVwb3J0ZXIuICBUaGlzIGZvcm0gb2YgPGNvZGU+YWRkRXJyb3I8L2NvZGU+IGlzCi0gKiBmb3IgbWVzc2FnZXMgd2hpY2ggcmVxdWlyZSBubyBhcmd1bWVudHMuPC9wPgotICoKLSAqIEBwYXJhbSBtc2dDYXRlZ29yeSBUaGUgYmFzZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGJ1bmRsZSB0byB1c2UuCi0gKiBAcGFyYW0gbXNnSWQgVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGNyZWF0ZWQuCi0gKi8KLSAKLXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1zZ0NhdGVnb3J5LCBTdHJpbmcgbXNnSWQpCi17Ci0gIGFkZFdhcm5pbmcobXNnQ2F0ZWdvcnksIG1zZ0lkLCBudWxsKTsKLX0KLS8qKgotICogPHA+Q3JlYXRlIGEgPGVtPndhcm5pbmc8L2VtPiBtZXNzYWdlIGFuZCByb3V0ZSBpdCB0bwotICogdGhlIGNhY2hlZCByZXBvcnRlci4gIFRoaXMgZm9ybSBvZiA8Y29kZT5hZGRFcnJvcjwvY29kZT4KLSAqIGlzIGZvciBtZXNzYWdlcyB3aGljaCByZXF1aXJlIG9uZSBvciBtb3JlIGFyZ3VtZW50cy48L3A+Ci0gKgotICogQHBhcmFtIG1zZ0NhdGVnb3J5IFRoZSBiYXNlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgYnVuZGxlIHRvIHVzZS4KLSAqIEBwYXJhbSBtc2dJZCBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgY3JlYXRlZC4KLSAqIEBwYXJhbSBtc2dBcmdzIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbWVzc2FnZS4KLSAqLwotCi1wdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgbXNnSWQsIFN0cmluZ1tdIG1zZ0FyZ3MpCi17Ci0gIGFkZFdhcm5pbmcoYnVuZGxlTmFtZSwgbXNnSWQsIG1zZ0FyZ3MsIG51bGwpOwotfQotLyoqCi0gKiA8cD5DcmVhdGUgYSA8ZW0+d2FybmluZzwvZW0+IG1lc3NhZ2UgYW5kIHJvdXRlIGl0IHRvCi0gKiB0aGUgY2FjaGVkIHJlcG9ydGVyLiAgVGhpcyBmb3JtIG9mIDxjb2RlPmFkZEVycm9yPC9jb2RlPgotICogaXMgZm9yIG1lc3NhZ2VzIHdoaWNoIHJlcXVpcmUgb25lIG9yIG1vcmUgYXJndW1lbnRzLjwvcD4KLSAqCi0gKiBAcGFyYW0gbXNnQ2F0ZWdvcnkgVGhlIGJhc2UgbmFtZSBvZiB0aGUgbWVzc2FnZSBidW5kbGUgdG8gdXNlLgotICogQHBhcmFtIG1zZ0lkIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBjcmVhdGVkLgotICogQHBhcmFtIG1zZ0FyZ3MgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlLgotICovCi0KLXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgT2JqZWN0IHRhcmdldCkKLXsKLSAgX3JlcG9ydGVyLmFkZE1lc3NhZ2UoIHRoaXMsCi0JICBuZXcgTWVzc2FnZSgKLQkJICAJYnVuZGxlTmFtZSwgCi0JICAJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJICAJbXNnSWQsIAotCQkgICAgbXNnQXJncywKLQkJICAgIHRhcmdldCkpOwotfQotcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIG1zZ0lkLCBTdHJpbmdbXSBtc2dBcmdzLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lKQotewotCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgKLQkJICAJYnVuZGxlTmFtZSwgCi0JICAJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJICAJbXNnSWQsIAotCQkgICAgbXNnQXJncywKLQkJICAgIHRhcmdldCk7Ci0JbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsJCSAgIAotfQotLyoqCi0gKiBQZXJmb3JtIGFueSByZXNvdXJjZSBjbGVhbnVwIG9uY2UgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS4gCi0gKi8KLXB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0JLy9EZWZhdWx0Ci19Ci0vKioKLSAqIFBlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAgb25jZSB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLiBJZiBjbGVhbnVwIHdpbGwKLSAqIHRha2Ugc29tZSB0aW1lLCB0aGUgSVZhbGlkYXRvciBzaG91bGQgcmVwb3J0IHN1YnRhc2sgaW5mb3JtYXRpb24gdG8gdGhlCi0gKiB1c2VyIHRocm91Z2ggdGhlIElSZXBvcnRlciBwYXJhbWV0ZXIuIFRoZSBBUmVwb3J0ZXIgcGFyYW1ldGVyIHdpbGwgbm90IGJlCi0gKiBudWxsLgotICogQGRlcHJlY2F0ZWQgVXNlIGNsZWFudXAoKQotICovCi1wdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCS8vRGVmYXVsdAotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLgotICogVGhlIFZhbGlkYXRpb25CdWlsZGVyIHVzZXMgdGhpcyBzdHJpbmcgYXMgaW5wdXQgdG8gdGhlIElQcm9ncmVzc01vbml0b3IuCi0gKiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLCB0aGUgVmFsaWRhdGlvbiBCdWlsZGVyCi0gKiB3aWxsIG91dHB1dCB0aGlzIHN0cmluZzogInswfSBpcyB2YWxpZGF0aW5nIHsxfS4iLCB3aGVyZSB7MH0gaXMgdGhlIHN0cmluZwotICogdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zLCBhbmQgezF9IGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHJlc291cmNlLgotICovCi1wdWJsaWMgU3RyaW5nW10gZ2V0MVBhcmFtKFN0cmluZyBzdHJpbmcxKXsKLQkgU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCSBwYXJtc1swXSA9IHN0cmluZzE7Ci0JIHJldHVybiBwYXJtczsKLQkgfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJLgotICogVGhlIFZhbGlkYXRpb25CdWlsZGVyIHVzZXMgdGhpcyBzdHJpbmcgYXMgaW5wdXQgdG8gdGhlIElQcm9ncmVzc01vbml0b3IuCi0gKiBpLmUuLCBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLCB0aGUgVmFsaWRhdGlvbiBCdWlsZGVyCi0gKiB3aWxsIG91dHB1dCB0aGlzIHN0cmluZzogInswfSBpcyB2YWxpZGF0aW5nIHsxfS4iLCB3aGVyZSB7MH0gaXMgdGhlIHN0cmluZwotICogdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zLCBhbmQgezF9IGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHJlc291cmNlLgotICovCi1wdWJsaWMgU3RyaW5nW10gZ2V0MlBhcmFtKFN0cmluZyBzdHJpbmcxLFN0cmluZyBzdHJpbmcyKXsKLQkgU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzJdOwotCSBwYXJtc1swXSA9IHN0cmluZzE7Ci0JIHBhcm1zWzFdID0gc3RyaW5nMjsKLQkgcmV0dXJuIHBhcm1zOwotCSB9Ci0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFZhbGlkYXRvciwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkuCi0gKiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIgdXNlcyB0aGlzIHN0cmluZyBhcyBpbnB1dCB0byB0aGUgSVByb2dyZXNzTW9uaXRvci4KLSAqIGkuZS4sIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIKLSAqIHdpbGwgb3V0cHV0IHRoaXMgc3RyaW5nOiAiezB9IGlzIHZhbGlkYXRpbmcgezF9LiIsIHdoZXJlIHswfSBpcyB0aGUgc3RyaW5nCi0gKiB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsIGFuZCB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBTdHJpbmdbXSBnZXQzUGFyYW0oU3RyaW5nIHN0cmluZzEsU3RyaW5nIHN0cmluZzIsU3RyaW5nIHN0cmluZzMpewotCSBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMl07Ci0JIHBhcm1zWzBdID0gc3RyaW5nMTsKLQkgcGFybXNbMV0gPSBzdHJpbmcyOwotCSBwYXJtc1syXSA9IHN0cmluZzM7Ci0JIHJldHVybiBwYXJtczsKLQkgfQotLyoqCi0gKiA8cD5BbnN3ZXIgdGhlIGlkIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggaXMKLSAqIHVzZWQgYnkgdGhlIHJlY2VpdmVyLjwvcD4KLSAqLwotIAotcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOwotLyoqCi0gKiBSZXR1cm5zIGEgbG9jYWxpemVkIG1lc3NhZ2UgZnJvbSBhIHJlc291cmNlIGJ1bmRsZS4KLSAqIEBwYXJhbSBtc2dDYXRlZ29yeSBUaGUgYmFzZU5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSAoZmlsZW5hbWUgbWludXMgYW55IGxvY2FsZSBzdWZmaXgpCi0gKiBAcGFyYW0gbXNnSWQgVGhlIGtleSBvZiB0aGUgbWVzc2FnZSB0byBsb29rdXAgZnJvbSB0aGUgYnVuZGxlLgotICogQHBhcmFtIG1zZ0FyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCBpbnRvIGFueSBtZXNzYWdlIGFyZ3VtZW50cyBpbiB0aGUgbWVzc2FnZSdzIHZhbHVlLgotICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIHRvIHJldHJpZXZlIHRoZSBtZXNzYWdlIHRleHQgZnJvbS4gCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbXNnQ2F0ZWdvcnksIFN0cmluZyBtc2dJZCwgU3RyaW5nW10gbXNnQXJncywgTG9jYWxlIGxvY2FsZSkgewotICByZXR1cm4gSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShtc2dDYXRlZ29yeSwgbXNnSWQsIGdldENsYXNzKCksIG1zZ0FyZ3MsIGxvY2FsZSk7Ci19Ci0vKioKLSAqIFJldHVybnMgYSBsb2NhbGl6ZWQgbWVzc2FnZSBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlLgotICogQHBhcmFtIG1zZ0NhdGVnb3J5IFRoZSBiYXNlTmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIChmaWxlbmFtZSBtaW51cyBhbnkgbG9jYWxlIHN1ZmZpeCkKLSAqIEBwYXJhbSBtc2dJZCBUaGUga2V5IG9mIHRoZSBtZXNzYWdlIHRvIGxvb2t1cCBmcm9tIHRoZSBidW5kbGUuCi0gKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgdG8gcmV0cmlldmUgdGhlIG1lc3NhZ2UgdGV4dCBmcm9tLiAKLSAqLwotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dDYXRlZ29yeSwgU3RyaW5nIG1zZ0lkLCBMb2NhbGUgbG9jYWxlKSB7Ci0gIHJldHVybiBKMkVFVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKG1zZ0NhdGVnb3J5LCBtc2dJZCwgZ2V0Q2xhc3MoKSwgbG9jYWxlKTsKLX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQKLQkgKiBpbiB0aGUgVUkuICAgVGhlIFZhbGlkYXRpb25CdWlsZGVyIHVzZXMgdGhpcyBzdHJpbmcgYXMgaW5wdXQgdG8KLQkgKiB0aGUgSVByb2dyZXNzTW9uaXRvci4gIGkuZS4sIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uCi0JICogcHJvY2VzcywgdGhlIFZhbGlkYXRpb24gQnVpbGRlciB3aWxsIG91dHB1dCB0aGlzIHN0cmluZzoKLQkgKiAgICAgInswfSBpcyB2YWxpZGF0aW5nIHsxfS4iLAotCSAqIHdoZXJlCi0JICogICAgIHswfSBpcyB0aGUgc3RyaW5nIHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucywKLQkgKiBhbmQKLQkgKiAgICAgezF9IGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpewotCQlyZXR1cm4gZ2V0TmFtZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQl9Ci0KLS8qKgotICogPHA+UmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgVmFsaWRhdG9yLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkCi0gKiBpbiB0aGUgVUkuICAgVGhlIFZhbGlkYXRpb25CdWlsZGVyIHVzZXMgdGhpcyBzdHJpbmcgYXMgaW5wdXQgdG8KLSAqIHRoZSBJUHJvZ3Jlc3NNb25pdG9yLiAgaS5lLiwgQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIHZhbGlkYXRpb24KLSAqIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgd2lsbCBvdXRwdXQgdGhpcyBzdHJpbmc6PC9wPgotICogPHByZT4KLSAqICAgICAiezB9IGlzIHZhbGlkYXRpbmcgezF9LiIsCi0gKiA8L3ByZT4KLSAqIDxwPndoZXJlPC9wPgotICogPHByZT4KLSAqICAgICB7MH0gaXMgdGhlIHN0cmluZyB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsCi0gKiA8L3ByZT4KLSAqIDxwPmFuZDwvcD4KLSAqIDxwcmU+Ci0gKiAgICAgezF9IGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHJlc291cmNlLgotICogPC9wcmU+Ci0gKgotICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIG5hbWUgdGV4dC4KLSAqLwotCi1wdWJsaWMgU3RyaW5nIGdldE5hbWUoTG9jYWxlIGxvY2FsZSkKLXsKLSAgcmV0dXJuIGdldE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgVkFMSURBVE9SX05BTUUsIGxvY2FsZSk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFZhbGlkYXRvciwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkuCi0gKiBUaGUgVmFsaWRhdGlvbkJ1aWxkZXIgdXNlcyB0aGlzIHN0cmluZyBhcyBpbnB1dCB0byB0aGUgSVByb2dyZXNzTW9uaXRvci4KLSAqIGkuZS4sIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MsIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIKLSAqIHdpbGwgb3V0cHV0IHRoaXMgc3RyaW5nOiAiezB9IGlzIHZhbGlkYXRpbmcgezF9LiIsIHdoZXJlIHswfSBpcyB0aGUgc3RyaW5nCi0gKiB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMsIGFuZCB7MX0gaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbTEoU3RyaW5nIHN0cmluZzEpewotCSBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JIHBhcm1zWzBdID0gc3RyaW5nMTsKLQkgcmV0dXJuIHBhcm1zOwotCSB9Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpewotCQkvL0RlZmF1bHQKLQl9Ci0vKioKLSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgTU9GIG1vZGVsLgotICogPGJyPjxicj4KLSAqIDxjb2RlPmhlbHBlcjwvY29kZT4gYW5kIDxjb2RlPnJlcG9ydGVyPC9jb2RlPiBtYXkgbm90IGJlIG51bGwuIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4gbWF5IGJlIG51bGwsIGlmIGEgZnVsbAotICogYnVpbGQgaXMgZGVzaXJlZC4KLSAqIDxicj48YnI+Ci0gKiA8Y29kZT5oZWxwZXI8L2NvZGU+IGxvYWRzIGEgRU9iamVjdC4gVGhlIEVPYmplY3QgaXMgdGhlIHJvb3Qgb2YgdGhlIAotICogTU9GIG1vZGVsIGFib3V0IHRvIGJlIHZhbGlkYXRlZC4gV2hlbiB0aGlzIG9iamVjdCBpcyB0cmF2ZXJzZWQsCi0gKiB5b3UgY2FuIHJlYWNoIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIE1PRiBtb2RlbCB3aGljaCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQuCi0gKiA8YnI+PGJyPgotICogPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IGlzIGFuIGluc3RhbmNlIG9mIGFuIElSZXBvcnRlciBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgZm9yIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuCi0gKiA8YnI+PGJyPgotICogPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPiBpcyBhbiBhcnJheSBvZiBmaWxlIG5hbWVzIHdoaWNoIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB2YWxpZGF0aW9uLiAKLSAqIElmIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4gaXMgbnVsbCwgb3IgaWYgaXQgaXMgYW4gZW1wdHkgYXJyYXksIHRoZW4gYSBmdWxsIGJ1aWxkCi0gKiBpcyBwZXJmb3JtZWQuIE90aGVyd2lzZSwgdmFsaWRhdGlvbiBvbiBqdXN0IHRoZSBmaWxlcyBsaXN0ZWQgaW4gdGhlIFZlY3RvciBpcyBwZXJmb3JtZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQotICBfaGVscGVyID0gaW5IZWxwZXI7Ci0gIF9yZXBvcnRlciA9IGluUmVwb3J0ZXI7Ci0gIGlmICgoaW5IZWxwZXIgPT0gbnVsbCkgfHwgKGluUmVwb3J0ZXIgPT0gbnVsbCkpIHsKLQlyZXR1cm47Ci0gIH0KLX0KLS8qKgotICAgKiBWYWxpZGF0ZSBFSkIgcmVmZXJlbmNlcy4KLSAgICovCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZUVKQlJlZk1hbmFkYXRvcnlFbGVtZW50cyhFamJSZWYgZXJlZiwgU3RyaW5nIG93bmVyTmFtZSkgewotCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1syXTsKLQlwYXJtc1swXSA9IGVyZWYuZ2V0TmFtZSgpOwotCXBhcm1zWzFdID0gb3duZXJOYW1lOwotCQotCWlmICgoZXJlZi5nZXROYW1lKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGTkFNRSwgcGFybXMsIGVyZWYpOwotCWlmIChlcmVmLmlzU2V0VHlwZSgpKSB7Ci0JCWlmIChlcmVmLmdldFR5cGUoKSA9PSBudWxsKQotCQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfSU5WQUxJRF9FUkVGVFlQRSwgcGFybXMpOwotCX0gZWxzZQotCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZUWVBFLCBwYXJtcyk7Ci0JCQotCVN0cmluZyByZWZIb21lID0gZXJlZi5nZXRIb21lKCk7Ci0JaWYgKChyZWZIb21lID09IG51bGwpIHx8IChyZWZIb21lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJYWRkV2FybmluZyhFUkVGX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FUkVGSE9NRSwgcGFybXMsIGVyZWYpOwotCQkKLQlpZiAoKGVyZWYuZ2V0UmVtb3RlKCkgPT0gbnVsbCkgfHwgKGVyZWYuZ2V0UmVtb3RlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKQotCQlhZGRXYXJuaW5nKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZSRU1PVEUsIHBhcm1zLCBlcmVmKTsKLX0KLS8qKgotICAgKiBWYWxpZGF0ZSBmb3IgZHVwbGljYXRlcyBpbiBFQVIgUm9sZXMuCi0gICAqLwotcHVibGljIHZvaWQgdmFsaWRhdGVSZXNvdXJjZVJlZnMoTGlzdCByZXNvdXJjZVJlZnMpIHsKLQotICBpbnQgbnVtUmVmcyA9IHJlc291cmNlUmVmcy5zaXplKCk7Ci0gIFNldCByZWZTZXQgPSBuZXcgSGFzaFNldChudW1SZWZzKTsKLQotICBmb3IgKGludCByZWZObyA9IDA7IHJlZk5vIDwgbnVtUmVmczsgcmVmTm8rKykgewotCVN0cmluZyByZWZOYW1lID0gKChSZXNvdXJjZVJlZkltcGwpIChyZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSkpLmdldE5hbWUoKTsKLQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JcGFybXNbMF0gPSByZWZOYW1lOwotCWlmICghKHJlZlNldC5hZGQocmVmTmFtZSkpKQotCSAgYWRkRXJyb3IoRVJFRl9DQVRFR09SWSwgRVJST1JfRUFSX0RVUExJQ0FURV9SRVNSRUYsIHBhcm1zLCByZXNvdXJjZVJlZnMuZ2V0KHJlZk5vKSk7Ci0gIH0KLX0KLS8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZXhpc3RhbmNlIG9mIFdlYiBSb2xlcyB3aXRoaW4gdGhlIEVBUiBSb2xlcyBhbmQKLSAgICogZHVwbGljYXRlcyBpbiBXZWIgUm9sZXMuCi0gICAqLwotcHVibGljIHZvaWQgdmFsaWRhdGVXRUJSb2xlc1dpdGhFQVJSb2xlcyhFTGlzdCBlYXJSb2xlTGlzdCwgRUxpc3Qgd2FyUm9sZXMpIHsKLSAgaW50IG51bVJvbGVzID0gd2FyUm9sZXMuc2l6ZSgpOwotCi0gIC8vIFRGQiBUaGlzIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGEgJ3NtYWxsJyBsaXN0IG9mIHdhclJvbGVzLgotICAvLyBJZiAnd2FyUm9sZXMnIGdldHMgdG9vIGJpZyB0aGVuIGFub3RoZXIgaW1wbGVtZW50YXRpb24KLSAgLy8gd2lsbCBiZSBuZWNlc3NhcnkuCi0KLSAgZm9yIChpbnQgcm9sZU5vID0gMDsgcm9sZU5vIDwgbnVtUm9sZXM7IHJvbGVObysrKSB7Ci0JU2VjdXJpdHlSb2xlSW1wbCBuZXh0Um9sZSA9IChTZWN1cml0eVJvbGVJbXBsKSAod2FyUm9sZXMuZ2V0KHJvbGVObykpOwotCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQlwYXJtc1swXSA9IG5leHRSb2xlLmdldFJvbGVOYW1lKCk7Ci0JaWYgKCEoZWFyUm9sZUxpc3QuY29udGFpbnMobmV4dFJvbGUpKSkKLQkgIGFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBFUlJPUl9FQVJfTUlTU0lOR19FSkJfUk9MRSwgcGFybXMsIG5leHRSb2xlKTsKLSAgfQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzE1NGMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFCZWFuQ2xhc3NWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5tYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOLCBKQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgSVNfUkVNT1RFID0gTkVJVEhFUjsKLQkKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtPTk1FU1NBR0UsIENPTlNUUlVDVE9SX05PUEFSTSwgRUpCQ1JFQVRFX05PUEFSTSwgRUpCUkVNT1ZFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117RklOQUxJWkVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgT05NRVNTQUdFLCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEVfTk9QQVJNLCBFSkJDUkVBVEUsIEVKQlJFTU9WRV9OT1BBUk0sIEZJTkFMSVpFX05PUEFSTX07Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NvbnN0ciwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NvbnN0citFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX29uTWVzc2FnZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX29uTWVzc2FnZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYkNyZWF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX3NldEVudGl0eUNvbnRleHQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0LCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfdW5zZXRFbnRpdHlDb250ZXh0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQWN0aXZhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJBY3RpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYkxvYWQsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJMb2FkK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiU3RvcmUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9lamJTdG9yZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNywgbmV3IFN0cmluZ1tde0NIS0oyNDI3K0JFWFQsIENIS0oyNDI3K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI4LCBuZXcgU3RyaW5nW117Q0hLSjI0MjgrQkVYVCwgQ0hLSjI0MjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0NStCRVhULCBDSEtKMjQ0NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0NiwgbmV3IFN0cmluZ1tde0NIS0oyNDQ2K0JFWFQsIENIS0oyNDQ2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQ3LCBuZXcgU3RyaW5nW117Q0hLSjI0NDcrQkVYVCwgQ0hLSjI0NDcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDFfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDFfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAxX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMV9lamJSZW1vdmUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMV9lamJSZW1vdmUrQkVYVCwgQ0hLSjI1MDFfZWpiUmVtb3ZlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAxX29uTWVzc2FnZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAxX29uTWVzc2FnZStCRVhULCBDSEtKMjUwMV9vbk1lc3NhZ2UrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MiwgbmV3IFN0cmluZ1tde0NIS0oyNDkyK0JFWFQsIENIS0oyNDkyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyX2ZpbmFsaXplLCBuZXcgU3RyaW5nW117Q0hLSjI1MDJfZmluYWxpemUrQkVYVCwgQ0hLSjI1MDJfZmluYWxpemUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19vbk1lc3NhZ2UsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19vbk1lc3NhZ2UrQkVYVCwgQ0hLSjI1MDNfb25NZXNzYWdlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUmVtb3ZlK0JFWFQsIENIS0oyNTA1X2VqYlJlbW92ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNV9vbk1lc3NhZ2UsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNV9vbk1lc3NhZ2UrQkVYVCwgQ0hLSjI1MDVfb25NZXNzYWdlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewotCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93RWpiQ3JlYXRlUmV0dXJuVHlwZVJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIG1ldGhvZC5pc1ZvaWQoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLlZPSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKLQkJCi0JCWlmKChtZXRob2RUeXBlICYgT05NRVNTQUdFKSA9PSBPTk1FU1NBR0UpIHsKLQkJCXZhbGlkYXRlT25NZXNzYWdlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCQ1JFQVRFKSA9PSBFSkJDUkVBVEUpIHsKLQkJCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXZhbGlkYXRlRWpiUmVtb3ZlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQkKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKG1ldGhvZCwgYmVhbikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMV9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJSZW1vdmVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCQotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQXBwbGljYXRpb25FeGNlcHRpb24obWV0aG9kLCBiZWFuKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAxX2VqYlJlbW92ZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kRXhjZXB0aW9ucygpIHsKLQkJLy8gRG9uJ3QgY2hlY2sgZm9yIENyZWF0ZUV4Y2VwdGlvbgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSBiZWFuCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNob3VsZEJlU3VwZXJUeXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHx8IChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpKXsJCQotCQkJSmF2YUNsYXNzIGpjbGFzcyA9ICgoTWVzc2FnZURyaXZlbiliZWFuKS5nZXRNZXNzYWdpbmdUeXBlKCk7Ci0JCQlpZiggamNsYXNzICE9IG51bGwgKXsKLQkJCQlpZiAoamNsYXNzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFTElTVEVORVIpKXsKLQkJCQkJc3VwZXIudmFsaWRhdGVTaG91bGRCZVN1cGVyVHlwZXModmMsYmVhbixjbGF6eik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uZWpiLmVqYjIwcnVsZXMuaW1wbC5BVHlwZVZSdWxlI3ZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4sIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotICAgIAlpZigoYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB8fCAoYmVhbi5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEKSl7CQkKLQkJCUphdmFDbGFzcyBqY2xhc3MgPSAoKE1lc3NhZ2VEcml2ZW4pYmVhbikuZ2V0TWVzc2FnaW5nVHlwZSgpOwotCQkJaWYoIGpjbGFzcyAhPSBudWxsICl7Ci0JCQkJaWYgKGpjbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9KTVNfTUVTU0FHRUxJU1RFTkVSKSl7Ci0JCQkJICAgIHN1cGVyLnZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdEV4aXN0KHZjLCBiZWFuLCBjbGF6eik7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAKLSAgICB9Ci0JcHVibGljIHZvaWQgdmFsaWRhdGVPbk1lc3NhZ2VNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBJV0FENDM5NiA9IFRoaXMgbWV0aG9kIG11c3QgYmUgcHVibGljLiBSZWFkIHNlY3Rpb24gMTUuNy40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk3ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgZmluYWwuIFJlYWQgc2VjdGlvbiAxNS43LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYobWV0aG9kLmlzRmluYWwoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDQ2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CQkKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk4ID0gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgc3RhdGljLiBSZWFkIHNlY3Rpb24gMTUuNy40IG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCWlmKG1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI0NDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIElXQUQ0Mzk5ID0gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdm9pZC4gUmVhZCBzZWN0aW9uIDE1LjcuNCBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkvLyBJV0FENDQwMCA9IFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuIFJlYWQgc2VjdGlvbiAxNS43LjQgb2YgdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQkJaWYoIW1ldGhvZC5pc1ZvaWQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA1X29uTWVzc2FnZSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQkKLQkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0FwcGxpY2F0aW9uRXhjZXB0aW9uKG1ldGhvZCwgYmVhbikpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMV9vbk1lc3NhZ2UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCWlmKCFmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhiZWFuLCBtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfb25NZXNzYWdlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjYmY5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlVXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fTUVTU0FHRV9JRCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZVV0aWxpdHkgaW5zdCA9IG51bGw7Ci0KLQlwcml2YXRlIE1lc3NhZ2VVdGlsaXR5KCkgewotCQkvL0RlZmF1bHQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlVXRpbGl0eSBnZXRVdGlsaXR5KCkgewotCQlpZihpbnN0ID09IG51bGwpIHsKLQkJCWluc3QgPSBuZXcgTWVzc2FnZVV0aWxpdHkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBOYW1lKE9iamVjdCB0YXJnZXRQYXJlbnQpIHsKLQkJaWYodGFyZ2V0UGFyZW50ID09IG51bGwpIHsKLQkJCS8vIE5vIGNvbnRleHQgdG8gYXNzb2NpYXRlIHRoZSBtZXNzYWdlIHdpdGgKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvLyBTbyBmYXIsIHRoZSBvbmx5IHRhcmdldCBwYXJlbnQgd2hpY2ggaXMgdXNlZCBhcyBhIGdyb3VwIG5hbWUgaXMgdGhlIEVudGVycHJpc2VCZWFuCi0JCWlmKHRhcmdldFBhcmVudCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSB7Ci0JCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKXRhcmdldFBhcmVudDsKLQkJCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlpZihiZWFuLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGJlYW4uZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuICgoWE1JUmVzb3VyY2UpYmVhbi5lUmVzb3VyY2UoKSkuZ2V0SUQoYmVhbik7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1lc3NhZ2VJZChPYmplY3QgbWVzc2FnZU51bWJlciwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYobWVzc2FnZU51bWJlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTk9fTUVTU0FHRV9JRDsKLQkJfQotCQkKLQkJTWFwIGlkcyA9IHJ1bGUuZ2V0TWVzc2FnZUlkcygpOwotCQlpZigoaWRzID09IG51bGwpIHx8IChpZHMuc2l6ZSgpID09IDApKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZU51bWJlci50b1N0cmluZygpOwotCQl9Ci0JCQotCQlpbnQgaW5kZXggPSAtMTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSAoU3RyaW5nW10paWRzLmdldChtZXNzYWdlTnVtYmVyKTsKLQkJaWYocmVzdWx0ID09IG51bGwpIHsKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZihyZXN1bHQubGVuZ3RoID09IDEpIHsKLQkJCWlmKHJlc3VsdFswXS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbWVzc2FnZU51bWJlci50b1N0cmluZygpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIEJ5IGNvbnZlbnRpb24sIHRoaXMgaXMgdGhlIG9yZGVyIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBTdHJpbmdbXQotCQkJaWYoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJCWluZGV4ID0gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCWluZGV4ID0gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYmVhbi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQlpbmRleCA9IDI7Ci0JCQl9Ci0JCQllbHNlIGlmKGJlYW4uaXNNZXNzYWdlRHJpdmVuKCkpIHsKLQkJCQlpbmRleCA9IDM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3aGF0IHRoZSBoZWNrIGlzIGl0PwotCQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCi0JCQlpZigocmVzdWx0Lmxlbmd0aCA8PSBpbmRleCkgfHwgKHJlc3VsdFtpbmRleF0uZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiByZXN1bHRbaW5kZXhdOwotCQl9Ci0JfQotCQotCS8qCi0JICogVXNlIHRoaXMgbWV0aG9kIHdoZW4gdGhlIG1lc3NhZ2UgaXMgbm90IHJlZ2lzdGVyZWQgb24gYSBtZXRob2QuCi0JICovCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZUlkKE9iamVjdCBtZXNzYWdlTnVtYmVyLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlpZihtZXNzYWdlTnVtYmVyID09IG51bGwpIHsKLQkJCXJldHVybiBOT19NRVNTQUdFX0lEOwotCQl9Ci0JCQotCQlNYXAgaWRzID0gcnVsZS5nZXRNZXNzYWdlSWRzKCk7Ci0JCWlmKChpZHMgPT0gbnVsbCkgfHwgKGlkcy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHJlc3VsdCA9IChTdHJpbmdbXSlpZHMuZ2V0KG1lc3NhZ2VOdW1iZXIpOwotCQlpZigocmVzdWx0ID09IG51bGwpIHx8IChyZXN1bHQubGVuZ3RoID09IDApIHx8IChyZXN1bHRbMF0uZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG1lc3NhZ2VOdW1iZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQkKLQkvKgotCSAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHRoZSBtZXNzYWdlIGlzIHJlZ2lzdGVyZWQgb24gYSBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlSWQoT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIElWYWxpZGF0aW9uUnVsZSBydWxlLCBib29sZWFuIGlzTWV0aG9kT25DbGFzcykgewotCQlpZihtZXNzYWdlTnVtYmVyID09IG51bGwpIHsKLQkJCXJldHVybiBOT19NRVNTQUdFX0lEOwotCQl9Ci0JCQotCQlNYXAgaWRzID0gcnVsZS5nZXRNZXNzYWdlSWRzKCk7Ci0JCWlmKChpZHMgPT0gbnVsbCkgfHwgKGlkcy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBtZXNzYWdlTnVtYmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gKFN0cmluZ1tdKWlkcy5nZXQobWVzc2FnZU51bWJlcik7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZihtZXNzYWdlcyAhPSBudWxsKSB7Ci0JCQlpZihpc01ldGhvZE9uQ2xhc3MgJiYgbWVzc2FnZXMubGVuZ3RoID09IDIpIHsKLQkJCQlyZXN1bHQgPSBtZXNzYWdlc1sxXTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+PSAxKSB7Ci0JCQkJcmVzdWx0ID0gbWVzc2FnZXNbMF07Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbWVzc2FnZU51bWJlci50b1N0cmluZygpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIGludCBzZXZlcml0eSwgU3RyaW5nIGlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gdmMuZ2V0TWVzc2FnZSgpOwotCQltZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJbWVzc2FnZS5zZXRJZChpZCk7Ci0JCW1lc3NhZ2Uuc2V0UGFyYW1zKHBhcm1zKTsKLQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QodGFyZ2V0KTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCS8qKiAKLQkgKiBGb3IgdXNlIG9ubHkgYnkgdGhlIEREIFZSdWxlcy4KLQkgKi8KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQkphciB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIFNlY3VyaXR5Um9sZSB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIFNlY3VyaXR5Um9sZVJlZiB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIE1ldGhvZEVsZW1lbnQgdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBNZXRob2RUcmFuc2FjdGlvbiB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIE1ldGhvZFBlcm1pc3Npb24gdGFyZ2V0LCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIG51bGwsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFSkJSZWxhdGlvbnNoaXBSb2xlIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSB0YXJnZXQsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgdGFyZ2V0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQlJlbGF0aW9uIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgQXNzZW1ibHlEZXNjcmlwdG9yIHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCS8qKiAKLQkgKiBGb3IgdXNlIG9ubHkgYnkgdGhlIEREIFZSdWxlcy4KLQkgKi8KLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVKQkphciB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgTWV0aG9kRWxlbWVudCB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRUpCUmVsYXRpb25zaGlwUm9sZSB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgU2VjdXJpdHlSb2xlUmVmIHRhcmdldCwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFSkJSZWxhdGlvbiB0YXJnZXQsIFN0cmluZ1tdIHBhcm1zLCBJVmFsaWRhdGlvblJ1bGUgcnVsZSkgewotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSk7Ci0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBzZXZlcml0eSwgaWQsIHBhcm1zLCB0YXJnZXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgT2JqZWN0IHRhcmdldCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCB0YXJnZXQsIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmdbXSBwYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBwYXJtcywgdGFyZ2V0LCBnZXRHcm91cE5hbWUoYmVhbikpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIGJlYW4sIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBudWxsLCBiZWFuLCBnZXRHcm91cE5hbWUoYmVhbikpOwotCX0KLQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgU3RyaW5nW10gcGFybXMsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBiZWFuLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIGJlYW4sIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlTnVtYmVyLCBydWxlKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgbnVsbCwgY2xhenosIGdldEdyb3VwTmFtZShiZWFuKSk7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIFN0cmluZ1tdIGFkZGl0aW9uYWxQYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2Yywgc2V2ZXJpdHksIGlkLCBhZGRpdGlvbmFsUGFybXMsIGNsYXp6LCBnZXRHcm91cE5hbWUoYmVhbikpOwotCX0KLQkKLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgYmVhbiwgY2xhenosIHJ1bGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0TWVzc2FnZSh2YywgbWVzc2FnZU51bWJlciwgc2V2ZXJpdHksIG51bGwsIGNsYXp6LCBtZXRob2QsIG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBtZXRob2QpLCBnZXRHcm91cE5hbWUoYmVhbiksIHJ1bGUpOwotCX0KLQkJCi0JcHVibGljIElNZXNzYWdlIGdldE1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgbWVzc2FnZU51bWJlciwgaW50IHNldmVyaXR5LCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIFN0cmluZ1tdIGFkZGl0aW9uYWxQYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgYmVhbiwgY2xhenosIGFkZGl0aW9uYWxQYXJtcywgcnVsZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgYWRkaXRpb25hbFBhcm1zLCBjbGF6eiwgbWV0aG9kLCBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkub25DbGFzcyhjbGF6eiwgbWV0aG9kKSwgZ2V0R3JvdXBOYW1lKGJlYW4pLCBydWxlKTsKLQl9Ci0JCQotCXB1YmxpYyBJTWVzc2FnZSBnZXRNZXNzYWdlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IG1lc3NhZ2VOdW1iZXIsIGludCBzZXZlcml0eSwgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCwgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBiZWFuLCBjbGF6eiwgcnVsZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRNZXNzYWdlKHZjLCBtZXNzYWdlTnVtYmVyLCBzZXZlcml0eSwgbnVsbCwgY2xhenosIGZpZWxkLCBmaWVsZC5nZXROYW1lKCksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5vbkNsYXNzKGNsYXp6LCBmaWVsZCksIGdldEdyb3VwTmFtZShiZWFuKSwgcnVsZSk7Ci0JfQotCQkKLQlwdWJsaWMgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIFN0cmluZ1tdIGFkZGl0aW9uYWxQYXJtcywgSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBiZWFuLCBjbGF6eiwgYWRkaXRpb25hbFBhcm1zLCBydWxlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIG1lc3NhZ2VOdW1iZXIsIHNldmVyaXR5LCBhZGRpdGlvbmFsUGFybXMsIGNsYXp6LCBmaWVsZCwgZmllbGQuZ2V0TmFtZSgpLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkub25DbGFzcyhjbGF6eiwgZmllbGQpLCBnZXRHcm91cE5hbWUoYmVhbiksIHJ1bGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgZ2V0TWVzc2FnZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCBtZXNzYWdlTnVtYmVyLCBpbnQgc2V2ZXJpdHksIFN0cmluZ1tdIGFkZGl0aW9uYWxQYXJtcywgSmF2YUNsYXNzIGNsYXp6LCBFT2JqZWN0IGZpZWxkT3JNZXRob2QsIFN0cmluZyBmaWVsZE9yTWV0aG9kTmFtZSwgYm9vbGVhbiBpc01ldGhvZE9uQ2xhc3MsIFN0cmluZyBncm91cE5hbWUsIElWYWxpZGF0aW9uUnVsZSBydWxlKSB7Ci0JCWlmKGZpZWxkT3JNZXRob2QgPT0gbnVsbCkgewotCQkJU3RyaW5nIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VOdW1iZXIsIHJ1bGUpOwotCQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgYWRkaXRpb25hbFBhcm1zLCBjbGF6eiwgZ3JvdXBOYW1lKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gcGFybXMgPSBudWxsOwotCQlFT2JqZWN0IHRhcmdldCA9IG51bGw7Ci0JCWlmKGlzTWV0aG9kT25DbGFzcykgewotCQkJLy8gbGVhdmUgcGFybXMgbnVsbCBzaW5jZSBubyBwYXJtcyBhcmUgbmVlZGVkCi0JCQl0YXJnZXQgPSBmaWVsZE9yTWV0aG9kOwotCQkJcGFybXMgPSBhZGRpdGlvbmFsUGFybXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihhZGRpdGlvbmFsUGFybXMgPT0gbnVsbCkgewotCQkJCXBhcm1zID0gbmV3IFN0cmluZ1tde2ZpZWxkT3JNZXRob2ROYW1lfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcm1zID0gbmV3IFN0cmluZ1thZGRpdGlvbmFsUGFybXMubGVuZ3RoICsgMV07Ci0JCQkJcGFybXNbMF0gPSBmaWVsZE9yTWV0aG9kTmFtZTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFkZGl0aW9uYWxQYXJtcywgMCwgcGFybXMsIDEsIGFkZGl0aW9uYWxQYXJtcy5sZW5ndGgpOwotCQkJfQotCQkJdGFyZ2V0ID0gY2xheno7Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZU51bWJlciwgcnVsZSwgaXNNZXRob2RPbkNsYXNzKTsKLQkJcmV0dXJuIGdldE1lc3NhZ2UodmMsIHNldmVyaXR5LCBpZCwgcGFybXMsIHRhcmdldCwgZ3JvdXBOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWV0aG9kVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01ldGhvZFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0MDhiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWV0aG9kVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZFV0aWxpdHkgewotCXByaXZhdGUgc3RhdGljIE1ldGhvZFV0aWxpdHkgX2luc3QgPSBudWxsOwotCXByaXZhdGUgbG9uZ1tdIF9tZXRob2RUeXBlSW5kZXg7Ci0JcHJpdmF0ZSBJTWV0aG9kVHlwZVtdIF9tZXRob2RUeXBlczsKLQlwcml2YXRlIGxvbmdbXSBfZmllbGRUeXBlSW5kZXg7Ci0JcHJpdmF0ZSBJRmllbGRUeXBlW10gX2ZpZWxkVHlwZXM7Ci0JCi0JcHJpdmF0ZSBNZXRob2RVdGlsaXR5KCkgewotCQlidWlsZFR5cGVMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kVXRpbGl0eSBnZXRVdGlsaXR5KCkgewotCQlpZihfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IG5ldyBNZXRob2RVdGlsaXR5KCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1ldGhvZFR5cGVbXSBnZXRNZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIF9tZXRob2RUeXBlczsKLQl9Ci0KLQlwdWJsaWMgSUZpZWxkVHlwZSBnZXRGaWVsZFR5cGUobG9uZyB0eXBlKSB7Ci0JCWludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goX2ZpZWxkVHlwZUluZGV4LCB0eXBlKTsKLQkJaWYoaW5kZXggPiBfZmllbGRUeXBlcy5sZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZihfZmllbGRUeXBlc1tpbmRleF0uZ2V0SWQoKSAhPSB0eXBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIF9maWVsZFR5cGVzW2luZGV4XTsKLQl9Ci0KLQlwdWJsaWMgSU1ldGhvZFR5cGUgZ2V0TWV0aG9kVHlwZShsb25nIHR5cGUpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChfbWV0aG9kVHlwZUluZGV4LCB0eXBlKTsKLQkJaWYoaW5kZXggPiBfbWV0aG9kVHlwZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYoaW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYoX21ldGhvZFR5cGVzW2luZGV4XS5nZXRJZCgpICE9IHR5cGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gX21ldGhvZFR5cGVzW2luZGV4XTsKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0TWV0aG9kVHlwZUlkKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzLCBJRUpCVHlwZSBydWxlKSB7Ci0JCUlNZXRob2RUeXBlIG1UeXBlID0gZ2V0TWV0aG9kVHlwZShiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgcnVsZSk7Ci0JCWlmKG1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBydWxlLmdldERlZmF1bHRNZXRob2RUeXBlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBtVHlwZS5nZXRJZCgpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldEZpZWxkVHlwZUlkKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIElFSkJUeXBlIHJ1bGUpIHsKLQkJSUZpZWxkVHlwZSBtVHlwZSA9IGdldEZpZWxkVHlwZShiZWFuLCBjbGF6eiwgZmllbGQsIHJ1bGUpOwotCQlpZihtVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVYQ0xVREVEX0ZJRUxEOwotCQl9Ci0JCQotCQlyZXR1cm4gbVR5cGUuZ2V0SWQoKTsKLQl9Ci0JCi0JcHVibGljIElGaWVsZFR5cGUgZ2V0RmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQsIElFSkJUeXBlIHJ1bGUpIHsKLQkJSUZpZWxkVHlwZVtdIGtub3duRmllbGRUeXBlcyA9IF9maWVsZFR5cGVzOwotCQlpZihrbm93bkZpZWxkVHlwZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPGtub3duRmllbGRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJSUZpZWxkVHlwZSBtdCA9IGtub3duRmllbGRUeXBlc1tpXTsKLQkJCWlmKG10ID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYobXQuaXNGaWVsZFR5cGUoYmVhbiwgY2xhenosIGZpZWxkKSkgewotCQkJCXJldHVybiBtdDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gSWYgaXQncyBub3Qgb25lIG9mIHRoZSByZWNvZ25pemVkIG1ldGhvZHMsIHdoaWNoIGR5bmFtaWNhbGx5LW5hbWVkCi0JCS8vIG1ldGhvZCB0eXBlIGlzIGl0PwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElNZXRob2RUeXBlIGdldE1ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMsIElFSkJUeXBlIHJ1bGUpIHsKLQkJbG9uZ1tdIGtub3duTWV0aG9kVHlwZXMgPSBydWxlLmdldEtub3duTWV0aG9kVHlwZXMoKTsKLQkJaWYoa25vd25NZXRob2RUeXBlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8a25vd25NZXRob2RUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJSU1ldGhvZFR5cGUgbXQgPSBnZXRNZXRob2RUeXBlKGtub3duTWV0aG9kVHlwZXNbaV0pOwotCQkJaWYobXQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihtdC5pc0RlZmF1bHRUeXBlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYobXQuaXNNZXRob2RUeXBlKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgewotCQkJCXJldHVybiBtdDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gSWYgaXQncyBub3Qgb25lIG9mIHRoZSByZWNvZ25pemVkIG1ldGhvZHMsIHdoaWNoIGR5bmFtaWNhbGx5LW5hbWVkCi0JCS8vIG1ldGhvZCB0eXBlIGlzIGl0PwotCQlyZXR1cm4gZ2V0TWV0aG9kVHlwZShydWxlLmdldERlZmF1bHRNZXRob2RUeXBlKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUeXBlTGlzdCgpIHsKLQkJaW50IHR5cGVDb3VudCA9IDI5OyAvLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgaWRlbnRpZmlhYmxlIG1ldGhvZHMgaW4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzCi0JCV9tZXRob2RUeXBlSW5kZXggPSBuZXcgbG9uZ1t0eXBlQ291bnRdOwotCQlfbWV0aG9kVHlwZXMgPSBuZXcgSU1ldGhvZFR5cGVbdHlwZUNvdW50XTsKLQkJaW50IGNvdW50ID0gMDsKLQkJCi0JCWludCBmaWVsZFR5cGVDb3VudCA9IDE7IC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBpZGVudGlmaWFibGUgZmllbGRzIGluIElNZXRob2RBbmRGaWVsZENvbnN0YW50cwotCQlfZmllbGRUeXBlSW5kZXggPSBuZXcgbG9uZ1tmaWVsZFR5cGVDb3VudF07Ci0JCV9maWVsZFR5cGVzID0gbmV3IElGaWVsZFR5cGVbZmllbGRUeXBlQ291bnRdOwotCQlpbnQgZmllbGRDb3VudCA9IDA7Ci0JCQotCQkvLyBUaGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIGxvbmdbXSBpcyBlcXVhbCB0byB0aGUKLQkJLy8gaW5kZXggb2YgdGhlIElNZXRob2RUeXBlIGluIHRoZSBJTWV0aG9kVHlwZVtdLiBCeSB1c2luZwotCQkvLyB0aGlzIHRlY2huaXF1ZSBpbnN0ZWFkIG9mIGEgSGFzaE1hcCwgd2UgZG9uJ3QgbmVlZCB0bwotCQkvLyBjcmVhdGUgYW4gSW50ZWdlciBldmVyeSB0aW1lIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSAKLQkJLy8gSU1ldGhvZFR5cGUuCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkFDQ0VTU09SOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkFDQ0VTU09SOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyB0aGlzIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGNhbGxlZCAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2FjYzsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBleGlzdHMKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQUNDRVNTT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkFDQ0VTU09SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkFDQ0VTU09SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkFDQ0VTU09SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQlVTSU5FU1M7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQlVTSU5FU1M7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCS8vIE5ldmVyIGNoZWNrIHRvIHNlZSBpZiBhIGJ1c2luZXNzIG1ldGhvZCBpcyBtaXNzaW5nCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkJVU0lORVNTOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIGEgYnVzaW5lc3MgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQlVTSU5FU1M6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfYnVzOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9idXNpbmVzczsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfYnVzaW5lc3M7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJLy8gSXQncyBhIGJ1c2luZXNzIG1ldGhvZCBpZiBpdCdzIGV4cG9zZWQgb24gdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UuCi0JCQkJLy8gSEFDSyAuLi4gZGVwZW5kcyBvbiB0aGUgZmFjdCB0aGF0IEFCZWFuQ2xhc3NWUnVsZSwgYW5kIGl0cyBzdWJ0eXBlcywgYXJlIHRoZSBvbmx5IGNsYXNzZXMgdGhhdCB3aWxsIGV2ZXIgaGF2ZSBhIEJVU0lORVNTIG1ldGhvZC4KLQkJCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0TWV0aG9kKG1ldGhvZCwgbWV0aG9kLmdldE5hbWUoKSwgQUJlYW5DbGFzc1ZSdWxlLmdldFJlbW90ZUNvbXBvbmVudE1ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtZXRob2QuZ2V0TmFtZSgpLCBBQmVhbkNsYXNzVlJ1bGUuZ2V0UmVtb3RlQ29tcG9uZW50TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHNFeHRlbmRlZExpc3RzKSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gaW50ZXJuYWwgaGVscGVyIG1ldGhvZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DTElOSVQ7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ0xJTklUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjbGluaXQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCS8vIE5ldmVyIGNoZWNrIHRvIHNlZSBpZiA8Y2xpbml0PiBpcyBtaXNzaW5nCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ0xJTklUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNMSU5JVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDTElOSVQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoIjxjbGluaXQ+IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQkJCi0JCS8vIEJlIGNhcmVmdWwgdG8ga2VlcCB0aGUgb3JkZXIgb2YgdGhlc2UgZGVjbGFyYXRpb25zIHRoZSBzYW1lIGFzIHRoZXkgYXJlIGluIAotCQkvLyBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuIEVhY2ggbWV0aG9kIHR5cGUgaXMgYW4gYXNjZW5kaW5nIG51bWJlciwgYW5kIGlmIHRoZXkKLQkJLy8gZ28gb3V0IG9mIG9yZGVyLCB0aGUgYmluYXJ5IHNlYXJjaCBjYW4ndCBmaW5kIHRoZSBtZXRob2QgdHlwZS4KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1I7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1I7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9jb25zdHI7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ09OU1RSVUNUT1I6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ09OU1RSVUNUT1JfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkNPTlNUUlVDVE9SX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBjbGF6ei5nZXROYW1lKCkgKyAiKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2NvbnN0cjsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDT05TVFJVQ1RPUl9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNPTlNUUlVDVE9SX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDT05TVFJVQ1RPUl9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiQ09OU1RSVUNUT1JfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJLy8gVGhpcyBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBubyBwYXJhbWV0ZXJzLiBSZWFkIHNlY3Rpb24gNy4xMC4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQkJCQlpZihtZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DUkVBVEU7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ1JFQVRFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjcmVhdGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2NyZWF0ZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9jcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2NyZWF0ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuQ1JFQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5DUkVBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJjcmVhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfY3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkNSRUFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2NyZWF0ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfY3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCQkKLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCQUNUSVZBVEVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkFDVElWQVRFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiQWN0aXZhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQWN0aXZhdGU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQUNUSVZBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJBQ1RJVkFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQUNUSVZBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkFDVElWQVRFX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJBQ1RJVkFURSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkNSRUFURTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJDUkVBVEU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImVqYkNyZWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQ3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkNSRUFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9lamJDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCQ1JFQVRFKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCQ1JFQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJDUkVBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJDcmVhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiQ3JlYXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkNSRUFURV9OT1BBUk06OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiQ3JlYXRlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCQ1JFQVRFX05PUEFSTTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJDUkVBVEVfTk9QQVJNOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQkJCWlmKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJGSU5EOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkZJTkQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYkZpbmQiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJGaW5kOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZWpiRmluZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYkZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJGSU5EOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDBfZWpiRmluZDsKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQkZJTkQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkZJTkRCWVBSSU1BUllLRVk7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCRklOREJZUFJJTUFSWUtFWTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJlamJGaW5kQnlQcmltYXJ5S2V5KCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHBrTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYoYmVhbiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCQlKYXZhQ2xhc3MgcGsgPSAoKEVudGl0eSliZWFuKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCQkJCXBrTmFtZSA9ICgocGsgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfUFJJTUFSWV9LRVkgOiBway5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKHBrTmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYkZpbmRCeVByaW1hcnlLZXk7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCRklOREJZUFJJTUFSWUtFWTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19lamJGaW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCRklOREJZUFJJTUFSWUtFWTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJGSU5EQllQUklNQVJZS0VZOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9FSkJGSU5EKSkgewotCQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJIT01FOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYkhvbWUiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9lamJIb21lOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkhPTUU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDNfZWpiSG9tZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkhPTUU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwMF9lamJIb21lOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5QUkVGSVhfRUpCSE9NRSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCTE9BRF9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCTE9BRF9OT1BBUk07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImVqYkxvYWQoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiTG9hZDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJMT0FEOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJMT0FEOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQkxPQUQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCTE9BRDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJMT0FEKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUEFTU0lWQVRFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJQQVNTSVZBVEVfTk9QQVJNOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJQYXNzaXZhdGUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiUGFzc2l2YXRlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBBU1NJVkFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUEFTU0lWQVRFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBBU1NJVkFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJQQVNTSVZBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRUpCUEFTU0lWQVRFKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUE9TVENSRUFURTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJQT1NUQ1JFQVRFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJlamJQb3N0Q3JlYXRlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQkvLyBDYW4gb25seSBkeW5hbWljYWxseSBjaGVjayBpZiBlamJQb3N0Q3JlYXRlIGlzIG1pc3NpbmcsIAotCQkJCS8vIGJhc2VkIG9uIHdoYXQgdHlwZSBvZiBlamJDcmVhdGUgbWV0aG9kcyBleGlzdC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUE9TVENSRUFURTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBPU1RDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAzX2VqYlBvc3RDcmVhdGU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJQT1NUQ1JFQVRFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlBPU1RDUkVBVEU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlBPU1RDUkVBVEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlJFTU9WRV9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCUkVNT1ZFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiUmVtb3ZlKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlJlbW92ZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJSRU1PVkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlJFTU9WRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJSRU1PVkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCUkVNT1ZFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlJFTU9WRSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlNFTEVDVDsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5FSkJTRUxFQ1Q7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gImVqYlNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlNlbGVjdDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZWpiU2VsZWN0OwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNFTEVDVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFSkJTRUxFQ1Q6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCU0VMRUNUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuUFJFRklYX0VKQlNFTEVDVCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRUpCU1RPUkVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVKQlNUT1JFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZWpiU3RvcmUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjIwNTBfZWpiU3RvcmU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRUpCU1RPUkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSgpIHsKLQkJCQkvLyBUaGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBtZXRob2QuCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVKQlNUT1JFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQlNUT1JFKSkgewotCQkJCQlpZihtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRVFVQUxTOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkVRVUFMUzsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZXF1YWxzKE9iamVjdCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VxdWFsczsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFUVVBTFM6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkVRVUFMUzo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJFUVVBTFM6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRVFVQUxTOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FUVVBTFMpKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUphdmFIZWxwZXJzIG9iamVjdCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNULCBiZWFuKTsKLQkJCQkJCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IHBhcm1bMF0uZ2V0SmF2YVR5cGUoKTsKLQkJCQkJCQkKLQkJCQkJCQlpZihvYmplY3QuZXF1YWxzKHBhcm1UeXBlKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkQ7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklORDsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAiZmluZCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2ZpbmQ7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklORDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19maW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5GSU5EQllQUklNQVJZS0VZOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkRCWVBSSU1BUllLRVk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImZpbmRCeVByaW1hcnlLZXkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2ZpbmRCeVByaW1hcnlLZXk7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19maW5kOwotCQkJfSAKLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmdNYXRjaGluZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwNF9maW5kOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2ZpbmQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlBSRUZJWF9GSU5EKSkgewotCQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOREJZUFJJTUFSWUtFWSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklOQUxJWkVfTk9QQVJNOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkFMSVpFX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAiZmluYWxpemUoKSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZU1pc3NpbmcoKSB7Ci0JCQkJLy8gTmV2ZXIgY2hlY2sgdG8gc2VlIGlmIGZpbmFsaXplIGlzIG1pc3NpbmcKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0JCQkJcmV0dXJuIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMuQ0hLSjI1MDJfZmluYWxpemU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiRklOQUxJWkU6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRUeXBlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQkJCWlmKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKSB7Ci0JCQkJCWlmKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0wKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkhBU0hDT0RFX05PUEFSTTsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5IQVNIQ09ERV9OT1BBUk07Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImhhc2hDb2RlKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2hhc2hDb2RlOwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIkhBU0hDT0RFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZVJlbW90ZUV4Y2VwdGlvbigpIHsKLQkJCQkvLyBEb24ndCBuZWVkIHRvIGtub3cgaWYgdGhpcyBtZXRob2QgdGhyb3dzIGEgUmVtb3RlRXhjZXB0aW9uLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJIQVNIQ09ERTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQotCQkJcHVibGljIGJvb2xlYW4gaXNNZXRob2RUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCQkJaWYobWV0aG9kID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9IQVNIQ09ERSkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5IT01FOwotCQlfbWV0aG9kVHlwZXNbY291bnQrK10gPSBuZXcgSU1ldGhvZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkhPTUU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gImhvbWUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2hvbWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzKCkgewotCQkJCS8vIE5ldmVyIHN0YXRpY2FsbHkgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWV0aG9kIGlzIHByZXNlbnQKLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiSE9NRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24oKSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBrbm93IGlmIHRoaXMgbWV0aG9kIHRocm93cyBhIFJlbW90ZUV4Y2VwdGlvbi4KLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjUwM19ob21lOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTA0X2hvbWU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNTAwX2hvbWU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFR5cGUoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKLQkJCX0KLQkJfTsKLQotCQlfbWV0aG9kVHlwZUluZGV4W2NvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5PTk1FU1NBR0U7Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuT05NRVNTQUdFOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJvbk1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX29uTWVzc2FnZTsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJPTk1FU1NBR0U6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIk9OTUVTU0FHRTo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJPTk1FU1NBR0U6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiT05NRVNTQUdFOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX09OTUVTU0FHRSkpIHsKLQkJCQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtcy5sZW5ndGggPT0gMSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKYXZhSGVscGVycyBqbXNNZXNzYWdlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFLCBiZWFuKTsKLQkJCQkJCQlKYXZhSGVscGVycyBwYXJtVHlwZSA9IHBhcm1zWzBdLmdldEphdmFUeXBlKCk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYoam1zTWVzc2FnZS5lcXVhbHMocGFybVR5cGUpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJX21ldGhvZFR5cGVJbmRleFtjb3VudF0gPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuU0VURU5USVRZQ09OVEVYVDsKLQkJX21ldGhvZFR5cGVzW2NvdW50KytdID0gbmV3IElNZXRob2RUeXBlKCkgewotCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVRFTlRJVFlDT05URVhUOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuICJzZXRFbnRpdHlDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZygpIHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cy5DSEtKMjA1MF9zZXRFbnRpdHlDb250ZXh0OwotCQkJfQotCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWRfbWVzc2FnZUV4aXN0cygpIHsKLQkJCQkvLyBOZXZlciBzdGF0aWNhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBpcyBwcmVzZW50Ci0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiU0VURU5USVRZQ09OVEVYVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmciOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VSTUlfSUlPUFBhcm0oKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJTRVRFTlRJVFlDT05URVhUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVEVOVElUWUNPTlRFWFQpKSB7Ci0JCQkJCUphdmFQYXJhbWV0ZXJbXSBwYXJtID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQlpZihwYXJtLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUphdmFIZWxwZXJzIGVudGl0eUNvbnRleHQgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VOVElUWUNPTlRFWFQsIGJlYW4pOwotCQkJCQkJCUphdmFIZWxwZXJzIHBhcm1UeXBlID0gcGFybVswXS5nZXRKYXZhVHlwZSgpOwotCQkJCQkJCQotCQkJCQkJCWlmKGVudGl0eUNvbnRleHQuZXF1YWxzKHBhcm1UeXBlKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9tZXRob2RUeXBlSW5kZXhbY291bnRdID0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlVOU0VURU5USVRZQ09OVEVYVF9OT1BBUk07Ci0JCV9tZXRob2RUeXBlc1tjb3VudCsrXSA9IG5ldyBJTWV0aG9kVHlwZSgpIHsKLQkJCXB1YmxpYyBsb25nIGdldElkKCkgewotCQkJCXJldHVybiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuVU5TRVRFTlRJVFlDT05URVhUX05PUEFSTTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiAidW5zZXRFbnRpdHlDb250ZXh0KCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nKCkgewotCQkJCXJldHVybiBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX3Vuc2V0RW50aXR5Q29udGV4dDsKLQkJCX0KLQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VFeGlzdHMoKSB7Ci0JCQkJLy8gTmV2ZXIgc3RhdGljYWxseSBjaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgaXMgcHJlc2VudAotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJVTlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlRXhpc3RzIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUmVtb3RlRXhjZXB0aW9uKCkgewotCQkJCS8vIERvbid0IG5lZWQgdG8ga25vdyBpZiB0aGlzIG1ldGhvZCB0aHJvd3MgYSBSZW1vdGVFeGNlcHRpb24uCi0vLwkJCQlyZXR1cm4gTk9fTUVTU0FHRV9QUkVGSVg7Ci0JCQkJLy8gQmVjYXVzZSBpdCdzIGRpZmZpY3VsdCB0byBmaW5kIG91dCB3aGljaCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHVuZXhwZWN0ZWRseSwKLQkJCQkvLyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBzdHJpbmcgZm9yIGFsbCBOT19NRVNTQUdFX1BSRUZJWCBjYXNlcywKLQkJCQkvLyBpbnN0ZWFkIHJldHVybiBhIG1lc3NhZ2UgaWQgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyB3aGljaCBtZXRob2Qgd2FzIGNhbGxlZC4KLQkJCQlyZXR1cm4gIlVOU0VURU5USVRZQ09OVEVYVDo6Z2V0TWVzc2FnZUlkX21lc3NhZ2VSZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkX21lc3NhZ2VNaXNzaW5nTWF0Y2hpbmcoKSB7Ci0JCQkJLy8gVGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgbWV0aG9kLgotLy8JCQkJcmV0dXJuIE5PX01FU1NBR0VfUFJFRklYOwotCQkJCS8vIEJlY2F1c2UgaXQncyBkaWZmaWN1bHQgdG8gZmluZCBvdXQgd2hpY2ggbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB1bmV4cGVjdGVkbHksCi0JCQkJLy8gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgTk9fTUVTU0FHRV9QUkVGSVggY2FzZXMsCi0JCQkJLy8gaW5zdGVhZCByZXR1cm4gYSBtZXNzYWdlIGlkIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgd2hpY2ggbWV0aG9kIHdhcyBjYWxsZWQuCi0JCQkJcmV0dXJuICJVTlNFVEVOVElUWUNPTlRFWFQ6OmdldE1lc3NhZ2VJZF9tZXNzYWdlTWlzc2luZ01hdGNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZF9tZXNzYWdlUk1JX0lJT1BQYXJtKCkgewotCQkJCS8vIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIG1ldGhvZC4KLS8vCQkJCXJldHVybiBOT19NRVNTQUdFX1BSRUZJWDsKLQkJCQkvLyBCZWNhdXNlIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQgb3V0IHdoaWNoIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdW5leHBlY3RlZGx5LAotCQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBzYW1lIHN0cmluZyBmb3IgYWxsIE5PX01FU1NBR0VfUFJFRklYIGNhc2VzLAotCQkJCS8vIGluc3RlYWQgcmV0dXJuIGEgbWVzc2FnZSBpZCB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzIHdoaWNoIG1ldGhvZCB3YXMgY2FsbGVkLgotCQkJCXJldHVybiAiVU5TRVRFTlRJVFlDT05URVhUOjpnZXRNZXNzYWdlSWRfbWVzc2FnZVJNSV9JSU9QUGFybSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VHlwZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKLQkJCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1VOU0VURU5USVRZQ09OVEVYVCkpIHsKLQkJCQkJaWYobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JCV9maWVsZFR5cGVJbmRleFtmaWVsZENvdW50XSA9IElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5TRVJJQUxWRVJTSU9OVUlEOwotCQlfZmllbGRUeXBlc1tmaWVsZENvdW50KytdID0gbmV3IElGaWVsZFR5cGUoKSB7Ci0JCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQ7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKLQkJCQlpZihmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuRklFTEROQU1FX1NFUklBTFZFUlNJT05VSUQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwotCQkJfQotCQl9OwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1JvbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0NDZhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBjb3B5IG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5jb2RlZ2VuLmhlbHBlcnMuUm9sZUhlbHBlci4KLSAqIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5jb2RlZ2VuLmhlbHBlcnMuUm9sZUhlbHBlciBjYW5ub3QgYmUgdXNlZAotICogZGlyZWN0bHkgYnkgdGhlIEVKQiBWYWxpZGF0b3IgKHRvIGNhbGN1bGF0ZSByb2xlIG1ldGhvZCBuYW1lcykgYmVjYXVzZQotICogaXQgdXNlcyBjbGFzc2VzIHdoaWNoIGFyZSBub3QgdXNlZCBieSBXZWJTcGhlcmUuIFVudGlsIHRoZSBsb25nLXRlcm0KLSAqIGZpeCBjYW4gYmUgcHV0IGluLCB0aGlzIGNsYXNzIHdpbGwgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFJvbGVIZWxwZXIgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0dFVFRFUl9OQU1FX1BBVFRFUk4gPSAiZ2V0ezB9S2V5IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVEVSX05BTUVfUEFUVEVSTiA9ICJwcml2YXRlU2V0ezB9S2V5IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0dFVFRFUl9OQU1FX1BBVFRFUk4gPSAiZ2V0ezB9TGluayI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX05BTUVfUFJFRklYID0gImFkZCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUVEVSX05BTUVfUFJFRklYID0gImdldCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9OQU1FX1BSRUZJWCA9ICJyZW1vdmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9BRERfTkFNRV9QUkVGSVggPSAic2Vjb25kYXJ5QWRkIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfUkVNT1ZFX05BTUVfUFJFRklYID0gInNlY29uZGFyeVJlbW92ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1NFVFRFUl9OQU1FX1BSRUZJWCA9ICJzZWNvbmRhcnlTZXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRFUl9OQU1FX1BSRUZJWCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXI7Ci0vKioKLSAqIFJvbGVIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFJvbGVIZWxwZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogQ29sbGVjdCB0aGUgbmFtZXMgb2YgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBiZWFuIGNsYXNzCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHJvbGUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0Um9sZU1ldGhvZE5hbWVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUsIExpc3QgYUxpc3QpIHsKLQlpZiAoYVJvbGUgPT0gbnVsbCB8fCBhTGlzdCA9PSBudWxsKSByZXR1cm47Ci0JYUxpc3QuYWRkKGdldExpbmtHZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JaWYgKGFSb2xlLmlzRm9yd2FyZCgpKSB7Ci0JCWFMaXN0LmFkZChnZXRLZXlHZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCWFMaXN0LmFkZChnZXRLZXlTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JfQotCWlmIChhUm9sZS5pc05hdmlnYWJsZSgpKQotCQlhTGlzdC5hZGQoZ2V0R2V0dGVyTmFtZShhUm9sZSkpOwotCWlmICghaXNNYW55KGFSb2xlKSkgewotCQl0cnkgewotCQkJaWYoYVJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpLmlzS2V5KCkpCi0JCQkJCWFMaXN0LmFkZChnZXRTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCQkJaWYgKCFhUm9sZS5pc0tleSgpKSB7Ci0JCQkJCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlTZXR0ZXJOYW1lKGFSb2xlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJLy8gSWYgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyBjYXVnaHQsIGFzc3VtZSB0aGF0IHRoZSByb2xlIGlzbid0IGEga2V5LgotCQkJLy8gSnVzdCBjb250aW51ZS4KLQkJfQotCX0gZWxzZSB7Ci0JCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlBZGROYW1lKGFSb2xlKSk7Ci0JCWFMaXN0LmFkZChnZXRTZWNvbmRhcnlSZW1vdmVOYW1lKGFSb2xlKSk7Ci0JCWlmIChhUm9sZS5pc05hdmlnYWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmKGFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkgIT0gbnVsbCkgewotCQkJCQlpZiAoIWFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNLZXkoKSkgewotCQkJCQkJYUxpc3QuYWRkKGdldEFkZE5hbWUoYVJvbGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIElmIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhyb3duLCBqdXN0IGFzc3VtZSB0aGF0IHRoZSBvcHBvc2l0ZSBpc24ndCBhIGtleS4KLQkJCX0KLQkJCWlmIChhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpICE9IG51bGwgJiYgIWFSb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNSZXF1aXJlZCgpKQotCQkJCWFMaXN0LmFkZChnZXRSZW1vdmVOYW1lKGFSb2xlKSk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFJldHVybiBhU3RyaW5nIHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgdXBwZXJjYXNlZC4KLSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmlyc3RBc1VwcGVyY2FzZShTdHJpbmcgYVN0cmluZykgewotCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+MCAmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGFTdHJpbmcuY2hhckF0KDApKSkgewotCQljaGFyW10gY2hhcnMgPSBhU3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJzWzBdKTsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoYXJzKTsKLQl9Ci0JcmV0dXJuIGFTdHJpbmc7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZ1tdIHJlcGxhY2VtZW50cykgewotCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgcmVwbGFjZW1lbnRzKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBhZGQgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAiYWRke2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogYWRkRGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWRkTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIEFERF9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBnZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAiZ2V0e2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogZ2V0RGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIEdFVFRFUl9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXkgZ2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgImdldHthUm9sZSBuYW1lfUtleSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIGdldERlcGFydG1lbnRLZXkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleUdldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3JtYXQoS0VZX0dFVFRFUl9OQU1FX1BBVFRFUk4sIG5ldyBTdHJpbmdbXXthcmd9KTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBrZXkgc2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInByaXZhdGVTZXR7YVJvbGUgbmFtZX1LZXkiLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBwcml2YXRlU2V0RGVwYXJ0bWVudEtleS4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2V5U2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIGZvcm1hdChLRVlfU0VUVEVSX05BTUVfUEFUVEVSTiwgbmV3IFN0cmluZ1tde2FyZ30pOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGxpbmsgZ2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgImdldHthUm9sZSBuYW1lfUxpbmsiLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBnZXREZXBhcnRtZW50TGluay4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGlua0dldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBmb3JtYXQoTElOS19HRVRURVJfTkFNRV9QQVRURVJOLCBuZXcgU3RyaW5nW117YXJnfSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcmVtb3ZlIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInJlbW92ZXthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHJlbW92ZURlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbW92ZU5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBSRU1PVkVfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2Vjb25kYXJ5IGFkZCBtZXRob2QgbmFtZSBmb3IgQGFSb2xlLgotICogSXQgd2lsbCBiZSBpbiB0aGUgZm9ybWF0ICJzZWNvbmRhcnlBZGR7YVJvbGUgbmFtZX0iLgotICogRm9yIGV4YW1wbGUsIGEgcm9sZSBuYW1lZCAiZGVwYXJ0bWVudCIgd291bGQgcmV0dXJuCi0gKiBzZWNvbmRhcnlBZGREZXBhcnRtZW50LgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWNvbmRhcnlBZGROYW1lKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLQlpZiAoYVJvbGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JU3RyaW5nIGFyZyA9IGZpcnN0QXNVcHBlcmNhc2UoYVJvbGUuZ2V0TmFtZSgpKTsKLQlyZXR1cm4gU0VDT05EQVJZX0FERF9OQU1FX1BSRUZJWCArIGFyZzsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBzZWNvbmRhcnkgcmVtb3ZlIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInNlY29uZGFyeVJlbW92ZXthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHNlY29uZGFyeVJlbW92ZURlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlY29uZGFyeVJlbW92ZU5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBTRUNPTkRBUllfUkVNT1ZFX05BTUVfUFJFRklYICsgYXJnOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHNlY29uZGFyeSBzZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIEBhUm9sZS4KLSAqIEl0IHdpbGwgYmUgaW4gdGhlIGZvcm1hdCAic2Vjb25kYXJ5U2V0e2FSb2xlIG5hbWV9Ii4KLSAqIEZvciBleGFtcGxlLCBhIHJvbGUgbmFtZWQgImRlcGFydG1lbnQiIHdvdWxkIHJldHVybgotICogc2Vjb25kYXJ5U2V0RGVwYXJ0bWVudC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vjb25kYXJ5U2V0dGVyTmFtZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlID09IG51bGwpIHJldHVybiBudWxsOwotCVN0cmluZyBhcmcgPSBmaXJzdEFzVXBwZXJjYXNlKGFSb2xlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIFNFQ09OREFSWV9TRVRURVJfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgc2V0dGVyIG1ldGhvZCBuYW1lIGZvciBAYVJvbGUuCi0gKiBJdCB3aWxsIGJlIGluIHRoZSBmb3JtYXQgInNldHthUm9sZSBuYW1lfSIuCi0gKiBGb3IgZXhhbXBsZSwgYSByb2xlIG5hbWVkICJkZXBhcnRtZW50IiB3b3VsZCByZXR1cm4KLSAqIHNldERlcGFydG1lbnQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNldHRlck5hbWUoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWlmIChhUm9sZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlTdHJpbmcgYXJnID0gZmlyc3RBc1VwcGVyY2FzZShhUm9sZS5nZXROYW1lKCkpOwotCXJldHVybiBTRVRURVJfTkFNRV9QUkVGSVggKyBhcmc7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBtdWx0aXBsaWNpdHkgaXMgbWFueS4KLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFueShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JcmV0dXJuIGFSb2xlICE9IG51bGwgJiYgYVJvbGUuaXNNYW55KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQxZjY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEV9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTVNTR0lEID0gIi5zZmIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfU0VTU0lPTkJFQU59OwotCQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG5ldyBsb25nW117TE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRSwgUkVNT1RFX0NPTVBPTkVOVF9JTlRFUkZBQ0V9OwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfQUJTVFJBQ1QgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0ZJTkFMID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9QVUJMSUMgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0VKQkNSRUFURSwgQ09OU1RSVUNUT1JfTk9QQVJNLCBFSkJSRU1PVkVfTk9QQVJNLCBFSkJQQVNTSVZBVEVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXtGSU5BTElaRV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDT05TVFJVQ1RPUl9OT1BBUk0sIENPTlNUUlVDVE9SLCBFSkJDUkVBVEUsIEVKQkNSRUFURV9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRklOQUxJWkVfTk9QQVJNLCBCVVNJTkVTU307Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDNJLCBuZXcgU3RyaW5nW117Q0hLSjIwMDNJK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNSwgbmV3IFN0cmluZ1tde0NIS0oyMDE1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY29uc3RyLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY29uc3RyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQ3JlYXRlICsgU01TU0dJRCArIFNQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzdGF0ZWZ1bCBtZXNzYWdlIGRpZmZlcnMgZnJvbSBzdGF0ZWxlc3MgbWVzc2FnZSkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlJlbW92ZStFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2VqYlBhc3NpdmF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2VqYlBhc3NpdmF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjEwMytTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjEsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMStCRVhULCBDSEtKMjQyMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMiwgbmV3IFN0cmluZ1tde0NIS0oyNDIyK0JFWFQsIENIS0oyNDIyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIzLCBuZXcgU3RyaW5nW117Q0hLSjI0MjMrQkVYVCwgQ0hLSjI0MjMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjQsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNCtCRVhULCBDSEtKMjQyNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNiwgbmV3IFN0cmluZ1tde0NIS0oyNDI2K0JFWFQsIENIS0oyNDI2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI3LCBuZXcgU3RyaW5nW117Q0hLSjI0MjcrQkVYVCwgQ0hLSjI0MjcrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjgsIG5ldyBTdHJpbmdbXXtDSEtKMjQyOCtCRVhULCBDSEtKMjQyOCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMxLCBuZXcgU3RyaW5nW117Q0hLSjI0MzErQkVYVCwgQ0hLSjI0MzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzksIG5ldyBTdHJpbmdbXXtDSEtKMjQzOStCRVhULCBDSEtKMjQzOStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQxLCBuZXcgU3RyaW5nW117Q0hLSjI0NDErQkVYVCwgQ0hLSjI0NDErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MitCRVhULCBDSEtKMjQ0MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MywgbmV3IFN0cmluZ1tde0NIS0oyNDQzK0JFWFQsIENIS0oyNDQzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1MitCRVhULCBDSEtKMjQ1MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1MywgbmV3IFN0cmluZ1tde0NIS0oyNDUzK0JFWFQsIENIS0oyNDUzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDU2LCBuZXcgU3RyaW5nW117Q0hLSjI0NTYrT05fQkFTRSwgQ0hLSjI0NTYrT05fVEhJU30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDkzLCBuZXcgU3RyaW5nW117Q0hLSjI0OTMrQkVYVCwgQ0hLSjI0OTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5NCtCRVhULCBDSEtKMjQ5NCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjUwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMl9maW5hbGl6ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAyX2ZpbmFsaXplK0JFWFQsIENIS0oyNTAyX2ZpbmFsaXplK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDNfZWpiQ3JlYXRlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDVfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDVfZWpiUmVtb3ZlK0JFWFQsIENIS0oyNTA1X2VqYlJlbW92ZStNRVhUfSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZFZhbGlkYXRlVHJhbnNpZW50RmllbGQoKSB7Ci0JCXJldHVybiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIE5FSVRIRVI7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuVk9JRDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJdmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJdmFsaWRhdGVFamJQb3N0Q3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJdmFsaWRhdGVFamJSZW1vdmVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiBMZXQgdGhlIHZhbGlkYXRlTWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0Ci0JCQkvLyB0YWtlIGNhcmUgb2YgaXQuCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewotCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwotCQkKLQkJaWYoKG1ldGhvZFR5cGUgJiBFSkJDUkVBVEUpID09IEVKQkNSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiQ3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUE9TVENSRUFURSkgPT0gRUpCUE9TVENSRUFURSkgewotCQkJcmV0dXJuIGdldE1hdGNoaW5nRWpiUG9zdENyZWF0ZU1ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEVKQlJFTU9WRV9OT1BBUk0pID09IEVKQlJFTU9WRV9OT1BBUk0pIHsKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgQlVTSU5FU1MpID09IEJVU0lORVNTKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdCdXNpbmVzc01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBNZXRob2QgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgaGVyZS4gCi0JCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuZWpiLmVqYjIwLnJ1bGVzLklDbGFzc1ZSdWxlI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuY29yZS5lamIuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCVNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKWJlYW47Ci0JCWJvb2xlYW4gaXNCZWFuTWFuYWdlZFN0YXRlZnVsID0gKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHJhbnNhY3Rpb25UeXBlRWxlbWVudChzZXNzaW9uKSAmJiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNCZWFuTWFuYWdlZFNlc3Npb24oc2Vzc2lvbikgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVmdWwoc2Vzc2lvbikpOwotCi0JCWlmIChpc0JlYW5NYW5hZ2VkU3RhdGVmdWwpIHsKLQkJCS8qCi0JCQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkJCSAqLi4uCi0JCQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCQkJICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkJCSAqLi4uCi0JCQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkJCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCQkJICoga25vd3Mgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWJvdXQgdG8gYmUgY29tbWl0dGVkIGFuZCBpdCBrbm93cyB0aGUgb3V0Y29tZSBvZiB0aGUgCi0JCQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JCQkgKi4uLgotCQkJICovCi0JCQl0cnkgewotCQkJCUphdmFIZWxwZXJzIHNzID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKTsKLQkJCQlpZiAoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oYmVhbi5nZXRFamJDbGFzcygpLCBzcykpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0ksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBiZWFuLmdldEVqYkNsYXNzKCksIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRRdWFsaWZpZWROYW1lKGJlYW4uZ2V0RWpiQ2xhc3MoKSksIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRRdWFsaWZpZWROYW1lKGUuZ2V0SmF2YUNsYXNzKCkpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGEzMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJTG9jYWxUeXBlLCBJQ29tcG9uZW50VHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0xPQ0FMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2xjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25Mb2NhbEhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NmQwYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWZ1bFNlc3Npb25Mb2NhbEhvbWVWUnVsZSBleHRlbmRzIEFTZXNzaW9uSG9tZVZSdWxlIGltcGxlbWVudHMgSUxvY2FsVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUxIT01FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNsaCI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRk1TU0dJRCA9ICIuc2ZsaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJMT0NBTEhPTUV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBuZXcgbG9uZ1tde0NSRUFURX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEV9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NyZWF0ZStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK1NGTVNTR0lEK09OX0JBU0UrU1BFQywgQ0hLSjI0MDIrU0ZNU1NHSUQrT05fVEhJUytTUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoZGlmZiBzdHJpbmcgdGhhbiBzdGF0ZWxlc3MgYmVhbikKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMiwgbmV3IFN0cmluZ1tde0NIS0oyNTAyK0JFWFQsIENIS0oyNTAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUfSk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3ZDM4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlZnVsU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSVJlbW90ZVR5cGUsIElDb21wb25lbnRUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUZVTF9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc3JjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCT0JKRUNUfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklUfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNStTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNCwgbmV3IFN0cmluZ1tde0NIS0oyNDA0K09OX0JBU0VfU1BFQywgQ0hLSjI0MDQrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNitPTl9CQVNFX1NQRUMsIENIS0oyNDE2K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfY3JlYXRlK0JFWFQsIENIS0oyNTAwX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9ob21lLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfaG9tZStCRVhULCBDSEtKMjUwMF9ob21lK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfYnVzaW5lc3MrQkVYVCwgQ0hLSjI1MDBfYnVzaW5lc3MrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTVVBFUlRZUEVTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGlzUmVtb3RlKCkgewotCQlyZXR1cm4gSVNfUkVNT1RFOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVDsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMDM0MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlIGV4dGVuZHMgQVNlc3Npb25Ib21lVlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5zcmgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNGTVNTR0lEID0gIi5zZnJoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQkhPTUV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtDUkVBVEV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVCwgQ1JFQVRFfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jcmVhdGUrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitTRk1TU0dJRCtPTl9CQVNFK1NQRUMsIENIS0oyNDAyK1NGTVNTR0lEK09OX1RISVMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAyLCBuZXcgU3RyaW5nW117Q0hLSjI1MDIrQkVYVCwgQ0hLSjI1MDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfY3JlYXRlK0JFWFQsIENIS0oyNTAzX2NyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwNF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwNF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDRfY3JlYXRlK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKLQkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU1VQRVJUWVBFUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRTaG91bGROb3RCZVN1cGVydHlwZXMoKSB7Ci0JCXJldHVybiBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIElTX1JFTU9URTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEtub3duTWV0aG9kVHlwZXMoKSB7Ci0JCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGM2MzIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFTZXNzaW9uQmVhbkNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2IiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU1NHSUQgPSAiLnNzYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9TRVNTSU9OQkVBTn07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtMT0NBTF9DT01QT05FTlRfSU5URVJGQUNFLCBSRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtFSkJDUkVBVEVfTk9QQVJNLCBDT05TVFJVQ1RPUl9OT1BBUk0sIEVKQlJFTU9WRV9OT1BBUk0sIEVKQlBBU1NJVkFURV9OT1BBUk19OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde0ZJTkFMSVpFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENPTlNUUlVDVE9SX05PUEFSTSwgRUpCQ1JFQVRFX05PUEFSTSwgQ09OU1RSVUNUT1IsIEVKQlJFTU9WRV9OT1BBUk0sIEVKQkFDVElWQVRFX05PUEFSTSwgRUpCUEFTU0lWQVRFX05PUEFSTSwgRklOQUxJWkVfTk9QQVJNLCBCVVNJTkVTU307Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX0JFX0FCU1RSQUNUID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIFNIT1VMRF9CRV9GSU5BTCA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBTSE9VTERfQkVfUFVCTElDID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRCA9IHRydWU7Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDNFLCBuZXcgU3RyaW5nW117Q0hLSjIwMDNFK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE0LCBuZXcgU3RyaW5nW117Q0hLSjIwMTQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNSwgbmV3IFN0cmluZ1tde0NIS0oyMDE1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjIsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMitFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDAsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MCtFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfY29uc3RyLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfY29uc3RyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiQ3JlYXRlK1NNU1NHSUQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUmVtb3ZlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUmVtb3ZlK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNTBfZWpiUGFzc2l2YXRlLCBuZXcgU3RyaW5nW117Q0hLSjIwNTBfZWpiUGFzc2l2YXRlK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzK1NQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMSwgbmV3IFN0cmluZ1tde0NIS0oyNDExK0JFWFQsIENIS0oyNDExK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMSwgbmV3IFN0cmluZ1tde0NIS0oyNDIxK0JFWFQsIENIS0oyNDIxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIyLCBuZXcgU3RyaW5nW117Q0hLSjI0MjIrQkVYVCwgQ0hLSjI0MjIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjMsIG5ldyBTdHJpbmdbXXtDSEtKMjQyMytCRVhULCBDSEtKMjQyMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyNCwgbmV3IFN0cmluZ1tde0NIS0oyNDI0K0JFWFQsIENIS0oyNDI0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDI2LCBuZXcgU3RyaW5nW117Q0hLSjI0MjYrQkVYVCwgQ0hLSjI0MjYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MjcsIG5ldyBTdHJpbmdbXXtDSEtKMjQyNytCRVhULCBDSEtKMjQyNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyOCwgbmV3IFN0cmluZ1tde0NIS0oyNDI4K0JFWFQsIENIS0oyNDI4K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMStCRVhULCBDSEtKMjQzMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzOSwgbmV3IFN0cmluZ1tde0NIS0oyNDM5K0JFWFQsIENIS0oyNDM5K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NDEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ0MStCRVhULCBDSEtKMjQ0MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ0MiwgbmV3IFN0cmluZ1tde0NIS0oyNDQyK0JFWFQsIENIS0oyNDQyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDQzLCBuZXcgU3RyaW5nW117Q0hLSjI0NDMrQkVYVCwgQ0hLSjI0NDMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1MiwgbmV3IFN0cmluZ1tde0NIS0oyNDUyK0JFWFQsIENIS0oyNDUyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDUzLCBuZXcgU3RyaW5nW117Q0hLSjI0NTMrQkVYVCwgQ0hLSjI0NTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3NitTTVNTR0lEICsgT05fQkFTRStTUEVDLCBDSEtKMjQ3NitTTVNTR0lEK09OX1RISVMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0OTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ5MitCRVhULCBDSEtKMjQ5MitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ5MywgbmV3IFN0cmluZ1tde0NIS0oyNDkzK0JFWFQsIENIS0oyNDkzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDk0LCBuZXcgU3RyaW5nW117Q0hLSjI0OTQrQkVYVCwgQ0hLSjI0OTQrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI1MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2J1c2luZXNzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDBfYnVzaW5lc3MrQkVYVCwgQ0hLSjI1MDBfYnVzaW5lc3MrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDJfZmluYWxpemUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMl9maW5hbGl6ZStCRVhULCBDSEtKMjUwMl9maW5hbGl6ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNTAzX2VqYkNyZWF0ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA1X2VqYlJlbW92ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA1X2VqYlJlbW92ZStCRVhULCBDSEtKMjUwNV9lamJSZW1vdmUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZFZhbGlkYXRlVHJhbnNpZW50RmllbGQoKSB7Ci0JCXJldHVybiBTSE9VTERfVkFMSURBVEVfVFJBTlNJRU5UX0ZJRUxEOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldFNob3VsZE5vdEJlU3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBpc1JlbW90ZSgpIHsKLQkJcmV0dXJuIE5FSVRIRVI7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRNZXRob2RzV2hpY2hNdXN0RXhpc3QoKSB7Ci0JCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1Q7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdE5vdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLlZPSUQsIGJlYW4pOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJVHlwZUNvbnN0YW50cy5WT0lEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0S25vd25NZXRob2RUeXBlcygpIHsKLQkJcmV0dXJuIEtOT1dOX01FVEhPRF9UWVBFUzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQl2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJSRU1PVkVfTk9QQVJNKSA9PSBFSkJSRU1PVkVfTk9QQVJNKSB7Ci0JCQl2YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZigobWV0aG9kVHlwZSAmIEJVU0lORVNTKSA9PSBCVVNJTkVTUykgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTWV0aG9kIGlzbid0IHN1cHBvc2VkIHRvIGJlIGhlcmUuIExldCB0aGUgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0Tm90RXhpc3QKLQkJCS8vIHRha2UgY2FyZSBvZiBpdC4KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7Ci0JCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7Ci0JCQotCQlpZigobWV0aG9kVHlwZSAmIEVKQkNSRUFURSkgPT0gRUpCQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJDcmVhdGVNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBFSkJQT1NUQ1JFQVRFKSA9PSBFSkJQT1NUQ1JFQVRFKSB7Ci0JCQlyZXR1cm4gZ2V0TWF0Y2hpbmdFamJQb3N0Q3JlYXRlTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIGlmKChtZXRob2RUeXBlICYgRUpCUkVNT1ZFX05PUEFSTSkgPT0gRUpCUkVNT1ZFX05PUEFSTSkgewotCQkJcmV0dXJuIGdldE5vTWF0Y2hpbmdNZXRob2ROYW1lKHZjLCBtZXRob2QpOwotCQl9Ci0JCWVsc2UgaWYoKG1ldGhvZFR5cGUgJiBCVVNJTkVTUykgPT0gQlVTSU5FU1MpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ0J1c2luZXNzTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIE1ldGhvZCBpc24ndCBzdXBwb3NlZCB0byBiZSBoZXJlLiAKLQkJCXJldHVybiBnZXROb01hdGNoaW5nTWV0aG9kTmFtZSh2YywgbWV0aG9kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggIT0gMCkgfHwgKCFJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLnZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLmVqYi5lamIyMC5ydWxlcy5JQ2xhc3NWUnVsZSN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuZWpiLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVudGVycHJpc2VCZWFuLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7Ci0JCS8qCi0JCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCQkgKi4uLgotCQkgKiBPbmx5IGEgc3RhdGVmdWwgU2Vzc2lvbiBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gbWF5IAotCQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCQkgKi4uLgotCQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBhIFNlc3Npb24gYmVhbiB3aXRoIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiB0byByZWx5IG9uIHRoZSAKLQkJICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JCSAqIGtub3dzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCBhbmQgaXQga25vd3MgdGhlIG91dGNvbWUgb2YgdGhlIAotCQkgKiB0cmFuc2FjdGlvbiBjb21taXQuCi0JCSAqLi4uCi0JCSAqLwotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgc3MgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT04sIGJlYW4pOwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgc3MpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFF1YWxpZmllZE5hbWUoYmVhbi5nZXRFamJDbGFzcygpKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFF1YWxpZmllZE5hbWUoZS5nZXRKYXZhQ2xhc3MoKSl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjkwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjYzNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlIGV4dGVuZHMgQUNvbXBvbmVudFZSdWxlIGltcGxlbWVudHMgSUxvY2FsVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2xjIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTVVBFUlRZUEVTID0gbmV3IGxvbmdbXXtKQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1R9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfRVhJU1QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVR9OwotCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1K1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2OCwgbmV3IFN0cmluZ1tde0NIS0oyNDY4K0JFWFQsIENIS0oyNDY4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY5LCBuZXcgU3RyaW5nW117Q0hLSjI0NjkrQkVYVCwgQ0hLSjI0NjkrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MCwgbmV3IFN0cmluZ1tde0NIS0oyNDcwK0JFWFQsIENIS0oyNDcwK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcxLCBuZXcgU3RyaW5nW117Q0hLSjI0NzErQkVYVCwgQ0hLSjI0NzErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MitCRVhULCBDSEtKMjQ3MitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2J1cytCRVhULCBDSEtKMjUwM19idXMrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiODNiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUgZXh0ZW5kcyBBU3RhdGVsZXNzSG9tZVZSdWxlIGltcGxlbWVudHMgSUxvY2FsVHlwZSwgSUhvbWVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0xPQ0FMSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2xoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU1NHSUQgPSAiLnNzbGgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJMT0NBTEhPTUV9OwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUID0gbmV3IGxvbmdbXXtDUkVBVEVfTk9QQVJNfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUID0gbmV3IGxvbmdbXXt9OwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gS05PV05fTUVUSE9EX1RZUEVTID0gbmV3IGxvbmdbXXtDTElOSVQsIENSRUFURV9OT1BBUk0sIENSRUFURSwgRklOQUxJWkVfTk9QQVJNfTsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA1MF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjA1MF9jcmVhdGUrU01TU0dJRCtTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA0LCBuZXcgU3RyaW5nW117Q0hLSjIxMDQrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitTTVNTR0lEK09OX0JBU0UrU1BFQywgQ0hLSjI0MDIrU01TU0dJRCtPTl9USElTK1NQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA0LCBuZXcgU3RyaW5nW117Q0hLSjI0MDQrT05fQkFTRV9TUEVDLCBDSEtKMjQwNCtPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNiwgbmV3IFN0cmluZ1tde0NIS0oyNDE2K09OX0JBU0VfU1BFQywgQ0hLSjI0MTYrT05fVEhJU19TUEVDfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2MSwgbmV3IFN0cmluZ1tde0NIS0oyNDYxK0JFWFQsIENIS0oyNDYxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY1LCBuZXcgU3RyaW5nW117Q0hLSjI0NjUrQkVYVCwgQ0hLSjI0NjUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NitCRVhULCBDSEtKMjQ2NitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NywgbmV3IFN0cmluZ1tde0NIS0oyNDY3K0JFWFQsIENIS0oyNDY3K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3NiwgbmV3IFN0cmluZ1tde0NIS0oyNDc2K0JFWFQsIENIS0oyNDc2K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMitCRVhULCBDSEtKMjUwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwM19jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwM19jcmVhdGUrQkVYVCwgQ0hLSjI1MDNfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTA0X2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTA0X2NyZWF0ZStCRVhULCBDSEtKMjUwNF9jcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZDZmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSUNvbXBvbmVudFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9TVEFURUxFU1NfU0VTU0lPTl9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLnNyYyI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0VfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVNfU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCi0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU1VQRVJUWVBFUyA9IG5ldyBsb25nW117SkFWQVhfRUpCX0VKQk9CSkVDVH07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1QgPSBuZXcgbG9uZ1tde307Ci0KLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBLTk9XTl9NRVRIT0RfVFlQRVMgPSBuZXcgbG9uZ1tde0NMSU5JVH07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY4LCBuZXcgU3RyaW5nW117Q0hLSjI0NjgrQkVYVCwgQ0hLSjI0NjgrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjksIG5ldyBTdHJpbmdbXXtDSEtKMjQ2OStCRVhULCBDSEtKMjQ2OStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDcwLCBuZXcgU3RyaW5nW117Q0hLSjI0NzArQkVYVCwgQ0hLSjI0NzArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NzEsIG5ldyBTdHJpbmdbXXtDSEtKMjQ3MStCRVhULCBDSEtKMjQ3MStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ3MiwgbmV3IFN0cmluZ1tde0NIS0oyNDcyK0JFWFQsIENIS0oyNDcyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfYnVzaW5lc3MsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9idXNpbmVzcytCRVhULCBDSEtKMjUwMF9idXNpbmVzcytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMF9jcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9jcmVhdGUrQkVYVCwgQ0hLSjI1MDBfY3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2hvbWUsIG5ldyBTdHJpbmdbXXtDSEtKMjUwMF9ob21lK0JFWFQsIENIS0oyNTAwX2hvbWUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDNfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI1MDNfYnVzK0JFWFQsIENIS0oyNTAzX2J1cytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewotCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjViMTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlIGV4dGVuZHMgQVN0YXRlbGVzc0hvbWVWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJSG9tZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc3JoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRV9TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJU19TUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU1NHSUQgPSAiLnNzcmgiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIFNVUEVSVFlQRVMgPSBuZXcgbG9uZ1tde0pBVkFYX0VKQl9FSkJIT01FfTsKLQlwcml2YXRlIGZpbmFsIGxvbmdbXSBTSE9VTERfTk9UX0JFX1NVUEVSVFlQRVMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgbG9uZ1tdIE1FVEhPRFNfV0hJQ0hfTVVTVF9FWElTVCA9IG5ldyBsb25nW117Q1JFQVRFX05PUEFSTX07Ci0JcHJpdmF0ZSBmaW5hbCBsb25nW10gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVCA9IG5ldyBsb25nW117fTsKLQotCXByaXZhdGUgZmluYWwgbG9uZ1tdIEtOT1dOX01FVEhPRF9UWVBFUyA9IG5ldyBsb25nW117Q0xJTklULCBDUkVBVEVfTk9QQVJNLCBDUkVBVEUsIEZJTkFMSVpFX05PUEFSTX07Ci0KLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQwLCBuZXcgU3RyaW5nW117Q0hLSjIwNDArRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDUwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyMDUwX2NyZWF0ZStTTVNTR0lEK1NQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDQsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNCtTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK1NNU1NHSUQrT05fQkFTRStTUEVDLCBDSEtKMjQwMitTTVNTR0lEK09OX1RISVMrU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNCtPTl9CQVNFX1NQRUMsIENIS0oyNDA0K09OX1RISVNfU1BFQ30pOyAvLyBzcGVjaWFsIGNhc2UgKHNoYXJlZCBieSBhbGwgdHlwZXMpCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE2LCBuZXcgU3RyaW5nW117Q0hLSjI0MTYrT05fQkFTRV9TUEVDLCBDSEtKMjQxNitPTl9USElTX1NQRUN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDYxLCBuZXcgU3RyaW5nW117Q0hLSjI0NjErQkVYVCwgQ0hLSjI0NjErTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NjUsIG5ldyBTdHJpbmdbXXtDSEtKMjQ2NStCRVhULCBDSEtKMjQ2NStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ2NiwgbmV3IFN0cmluZ1tde0NIS0oyNDY2K0JFWFQsIENIS0oyNDY2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDY3LCBuZXcgU3RyaW5nW117Q0hLSjI0NjcrQkVYVCwgQ0hLSjI0NjcrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDc2LCBuZXcgU3RyaW5nW117Q0hLSjI0NzYrQkVYVCwgQ0hLSjI0NzYrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAwX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2NyZWF0ZStCRVhULCBDSEtKMjUwMF9jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDBfaG9tZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAwX2hvbWUrQkVYVCwgQ0hLSjI1MDBfaG9tZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjUwMiwgbmV3IFN0cmluZ1tde0NIS0oyNTAyK0JFWFQsIENIS0oyNTAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNTAzX2NyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNTAzX2NyZWF0ZStCRVhULCBDSEtKMjUwM19jcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI1MDRfY3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI1MDRfY3JlYXRlK0JFWFQsIENIS0oyNTA0X2NyZWF0ZStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKLQkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U3VwZXJ0eXBlcygpIHsKLQkJcmV0dXJuIFNVUEVSVFlQRVM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewotCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgaXNSZW1vdGUoKSB7Ci0JCXJldHVybiBJU19SRU1PVEU7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0TWV0aG9kc1doaWNoTXVzdEV4aXN0KCkgewotCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX0VYSVNUOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldE1ldGhvZHNXaGljaE11c3ROb3RFeGlzdCgpIHsKLQkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7Ci0JfQotCi0JcHVibGljIGZpbmFsIGxvbmdbXSBnZXRLbm93bk1ldGhvZFR5cGVzKCkgewotCQlyZXR1cm4gS05PV05fTUVUSE9EX1RZUEVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjODUyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBiZWFuIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqCi0gKiBBbGwgOS4yLlggc2VjdGlvbnMgZGVzY3JpYmUgQk1QIHJlcXVpcmVtZW50cy4KLSAqIElmIGEgQ01QIHJlcXVpcmVtZW50IGlzIGRpZmZlcmVudCB0aGFuIHRoZXNlLCB0aGVuIHRoZSBkaWZmZXJlbmNlcyBhcmUKLSAqIGRvY3VtZW50ZWQgaW4gOS40Llggc2VjdGlvbnMuCi0gKgotICoKLSAqIDkuMi4yIEVudGVycHJpc2UgYmVhbiBjbGFzcwotICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5FbnRpdHlCZWFuIGludGVyZmFjZS4KLSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGFzIHB1YmxpYyBhbmQgbXVzdCBub3QgYmUgYWJzdHJhY3QuCi0gKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZmluYWwuCi0gKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLgotICogICAgICAtIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotICogICAtIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIFs5XS4gCi0gKiAgICAgSWYgdGhlIGNsYXNzIGltcGxlbWVudHMgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBuby1vcCAKLSAqICAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgamF2YXguZWpiLkVKQk9iamVjdCBpbnRlcmZhY2UuIFRoZSBjb250YWluZXIgCi0gKiAgICAgd2lsbCBuZXZlciBpbnZva2UgdGhlc2UgbWV0aG9kcyBvbiB0aGUgYmVhbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KLSAqICAgLSBBIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgCi0gKiAgICAgZGVmaW5pbmcgdGhlIGVudGl0eSBiZWFuIGNsYXNzIGFzIGFic3RyYWN0LgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgYW5kIHRoZSAKLSAqICAgICBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUsIGFuZCBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBhcyBkZXNjcmliZWQgCi0gKiAgICAgbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gCi0gKiAgICAgSWYgdGhlIGVudGl0eSBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgCi0gKiAgICAgZWpiQ3JlYXRlIGFuZCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMsIHRoZSBmaW5kZXIgbWV0aG9kcywgYW5kIHRoZQotICogICAgIG1ldGhvZHMgb2YgdGhlIEVudGl0eUJlYW4gaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgCi0gKiAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBpcyBhbGxvd2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIChmb3IgCi0gKiAgICAgZXhhbXBsZSBoZWxwZXIgbWV0aG9kcyBpbnZva2VkIGludGVybmFsbHkgYnkgdGhlIGJ1c2luZXNzIG1ldGhvZHMpIAotICogICAgIGluIGFkZGl0aW9uIHRvIHRoZSBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBFSkIgc3BlY2lmaWNhdGlvbi4KLSAqCi0gKiA5LjIuMyBlamJDcmVhdGUgbWV0aG9kcwotICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0gKiAgICAgbXVzdCBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0gKiAgICAgICAtIFRoZSBtZXRob2QgbmFtZSBtdXN0IGJlIGVqYkNyZWF0ZS4KLSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLSAqICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0gKiAgICAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IHR5cGUuCi0gKiAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLSAqICAgICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0gKiAgICAgICAgIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGVqYkNyZWF0ZSBtZXRob2QgdG8gdGhyb3cgdGhlIAotICogICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotICogICAgICAgICBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotICogICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotICogICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICogICAtIFRoZSBlbnRpdHkgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGVqYkNyZWF0ZSBtZXRob2QgbXVzdCBoYXZlIGEgdW5pcXVlIHByaW1hcnkga2V5LiAKLSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHByaW1hcnkga2V5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIHByaW1hcnkga2V5cyBvZiBhbGwgCi0gKiAgICAgdGhlIGV4aXN0aW5nIGVudGl0eSBvYmplY3RzIHdpdGhpbiB0aGUgc2FtZSBob21lLiBUaGUgZWpiQ3JlYXRlIG1ldGhvZCBzaG91bGQgCi0gKiAgICAgdGhyb3cgdGhlIER1cGxpY2F0ZUtleUV4Y2VwdGlvbiBvbiBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhbiBlbnRpdHkgb2JqZWN0IHdpdGggCi0gKiAgICAgYSBkdXBsaWNhdGUgcHJpbWFyeSBrZXkuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHJldXNlIHRoZSBwcmltYXJ5IGtleSBvZiBhCi0gKiAgICAgcHJldmlvdXNseSByZW1vdmVkIGVudGl0eSBvYmplY3QuCi0gKgotICogOS4yLjQgZWpiUG9zdENyZWF0ZSBtZXRob2RzCi0gKiAgIC0gRm9yIGVhY2ggZWpiQ3JlYXRlKC4uLikgbWV0aG9kLCB0aGUgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBtYXRjaGluZyAKLSAqICAgICBlamJQb3N0Q3JlYXRlKC4uLikgbWV0aG9kLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICogICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiUG9zdENyZWF0ZS4KLSAqICAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLSAqICAgICAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSguLi4pIG1ldGhvZC4KLSAqICAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLSAqICAgICAgICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyB0aGUgCi0gKiAgICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb250byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEKLSAqICAgICAgICAgIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLSAqICAgICAgICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0gKgotICogOS4yLjUgZWpiRmluZCBtZXRob2RzCi0gKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBhbHNvIGRlZmluZSBhZGRpdGlvbmFsIGVqYkZpbmQ8TUVUSE9EPiguLi4pIGZpbmRlciBtZXRob2RzLgotICogICAtIFRoZSBzaWduYXR1cmVzIG9mIHRoZSBmaW5kZXIgbWV0aG9kcyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICogICAtIEEgZmluZGVyIG1ldGhvZCBuYW1lIG11c3Qgc3RhcnQgd2l0aCB0aGUgcHJlZml4ICJlamJGaW5kIiAKLSAqICAgICAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotICogICAtIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLSAqICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLSAqICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotICogICAtIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLSAqICAgICBvciBhIGNvbGxlY3Rpb24gb2YgcHJpbWFyeSBrZXlzIChzZWUgU2VjdGlvbiBTdWJzZWN0aW9uIDkuMS44KS4KLSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCBpbmNsdWRpbmcgCi0gKiAgICAgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uCi0gKiAgIC0gRXZlcnkgZW50aXR5IGJlYW4gbXVzdCBkZWZpbmUgdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiBUaGUgcmVzdWx0IHR5cGUgZm9yIAotICogICAgIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0gKiAgICAgYmUgYSBzaW5nbGUtb2JqZWN0IGZpbmRlcikuCi0gKiAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGZpbmRlciBtZXRob2RzIHRvIHRocm93IHRoZSAKLSAqICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLSAqICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0gKiAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLSAqICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICoKLSAqIDkuMi42IEJ1c2luZXNzIG1ldGhvZHMKLSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGRlZmluZSB6ZXJvIG9yIG1vcmUgYnVzaW5lc3MgbWV0aG9kcyB3aG9zZSBzaWduYXR1cmVzIAotICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotICogICAgICAgIC0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoIGVqYiB0byAKLSAqICAgICAgICAgIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0gKiAgICAgICAgLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0gKiAgICAgICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0gKiAgICAgICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLgotICogICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotICogICAgICAgICAgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyAKLSAqICAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0gKiAgICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotICogICAgICAgICAgdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLSAqLi4uCi0gKiA5LjIuOSBFbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzCi0gKi4uLgotICogIC0gVGhlIHByaW1hcnkga2V5IHR5cGUgbXVzdCBiZSBhIGxlZ2FsIFZhbHVlIFR5cGUgaW4gUk1JLUlJT1AuCi0gKi4uLgotICogMTguMS4yIFByb2dyYW1taW5nIHJlc3RyaWN0aW9ucwotICogIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHByb2dyYW1taW5nIHJlc3RyaWN0aW9ucyB0aGF0IGEgQmVhbiBQcm92aWRlciBtdXN0IGZvbGxvdyB0byBlbnN1cmUgdGhhdCB0aGUKLSAqICBlbnRlcnByaXNlIGJlYW4gaXMgcG9ydGFibGUgYW5kIGNhbiBiZSBkZXBsb3llZCBpbiBhbnkgY29tcGxpYW50IEVKQiBDb250YWluZXIuIFRoZSByZXN0cmljdGlvbnMgYXBwbHkKLSAqICB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1c2luZXNzIG1ldGhvZHMuIFNlY3Rpb24gMTguMiwgd2hpY2ggZGVzY3JpYmVzIHRoZSBDb250YWluZXIncyB2aWV3IG9mCi0gKiAgdGhlc2UgcmVzdHJpY3Rpb25zLCBkZWZpbmVzIHRoZSBwcm9ncmFtbWluZyBlbnZpcm9ubWVudCB0aGF0IGFsbCBFSkIgQ29udGFpbmVycyBtdXN0IHByb3ZpZGUuCi0gKgotICogIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSByZWFkL3dyaXRlIHN0YXRpYyBmaWVsZHMuIFVzaW5nIHJlYWQtb25seSBzdGF0aWMgZmllbGRzIGlzCi0gKiAgICBhbGxvd2VkLiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBiZQotICogICAgZGVjbGFyZWQgYXMgZmluYWwuCi0gKi4uLgotICogIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSB0aHJlYWQgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgdG8gc3luY2hyb25pemUgZXhlY3V0aW9uIG9mCi0gKiAgICBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKi4uLgotICogIC0gQW4gZW50ZXJwcmlzZSBCZWFuIG11c3Qgbm90IHVzZSB0aGUgQVdUIGZ1bmN0aW9uYWxpdHkgdG8gYXR0ZW1wdCB0byBvdXRwdXQgaW5mb3JtYXRpb24gdG8gYQotICogICAgZGlzcGxheSwgb3IgdG8gaW5wdXQgaW5mb3JtYXRpb24gZnJvbSBhIGtleWJvYXJkLgotICouLi4KLSAqICAtIEFuIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCB1c2UgdGhlIGphdmEuaW8gcGFja2FnZSB0byBhdHRlbXB0IHRvIGFjY2VzcyBmaWxlcyBhbmQgZGlyZWN0by1yaWVzCi0gKiAgICBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKi4uLgotICogIC0gQW4gZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gbGlzdGVuIG9uIGEgc29ja2V0LCBhY2NlcHQgY29ubmVjdGlvbnMgb24gYSBzb2NrZXQsIG9yCi0gKiAgICB1c2UgYSBzb2NrZXQgZm9yIG11bHRpY2FzdC4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gcXVlcnkgYSBjbGFzcyB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlY2xhcmVkCi0gKiAgICBtZW1iZXJzIHRoYXQgYXJlIG5vdCBvdGhlcndpc2UgYWNjZXNzaWJsZSB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGJlY2F1c2Ugb2YgdGhlIHNlY3VyaXR5IHJ1bGVzCi0gKiAgICBvZiB0aGUgSmF2YSBsYW5ndWFnZS4gVGhlIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCBhdHRlbXB0IHRvIHVzZSB0aGUgUmVmbGVjdGlvbiBBUEkgdG8gYWNjZXNzCi0gKiAgICBpbmZvcm1hdGlvbiB0aGF0IHRoZSBzZWN1cml0eSBydWxlcyBvZiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBtYWtlIHVuYXZhaWxhYmxlLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBjcmVhdGUgYSBjbGFzcyBsb2FkZXI7IG9idGFpbiB0aGUgY3VycmVudCBjbGFzcyBsb2FkZXI7Ci0gKiAgICBzZXQgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyOyBzZXQgc2VjdXJpdHkgbWFuYWdlcjsgY3JlYXRlIGEgbmV3IHNlY3VyaXR5IG1hbmFnZXI7IHN0b3AgdGhlCi0gKiAgICBKVk07IG9yIGNoYW5nZSB0aGUgaW5wdXQsIG91dHB1dCwgYW5kIGVycm9yIHN0cmVhbXMuCi0gKi4uLgotICogIC0gVGhlIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCBhdHRlbXB0IHRvIHNldCB0aGUgc29ja2V0IGZhY3RvcnkgdXNlZCBieSBTZXJ2ZXJTb2NrZXQsIFNvY2tldCwgb3IKLSAqICAgIHRoZSBzdHJlYW0gaGFuZGxlciBmYWN0b3J5IHVzZWQgYnkgVVJMLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBtYW5hZ2UgdGhyZWFkcy4gVGhlIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCBhdHRlbXB0Ci0gKiAgICB0byBzdGFydCwgc3RvcCwgc3VzcGVuZCwgb3IgcmVzdW1lIGEgdGhyZWFkOyBvciB0byBjaGFuZ2UgYSB0aHJlYWQncyBwcmlvcml0eSBvciBuYW1lLiBUaGUgZW50ZXItcHJpc2UKLSAqICAgIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBtYW5hZ2UgdGhyZWFkIGdyb3Vwcy4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gZGlyZWN0bHkgcmVhZCBvciB3cml0ZSBhIGZpbGUgZGVzY3JpcHRvci4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gb2J0YWluIHRoZSBzZWN1cml0eSBwb2xpY3kgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhcgotICogICAgY29kZSBzb3VyY2UuCi0gKi4uLgotICogIC0gVGhlIGVudGVycHJpc2UgYmVhbiBtdXN0IG5vdCBhdHRlbXB0IHRvIGxvYWQgYSBuYXRpdmUgbGlicmFyeS4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gZ2FpbiBhY2Nlc3MgdG8gcGFja2FnZXMgYW5kIGNsYXNzZXMgdGhhdCB0aGUgdXN1YWwgcnVsZXMKLSAqICAgIG9mIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIG1ha2UgdW5hdmFpbGFibGUgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4KLSAqLi4uCi0gKiAgLSBUaGUgZW50ZXJwcmlzZSBiZWFuIG11c3Qgbm90IGF0dGVtcHQgdG8gZGVmaW5lIGEgY2xhc3MgaW4gYSBwYWNrYWdlLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBhY2Nlc3Mgb3IgbW9kaWZ5IHRoZSBzZWN1cml0eSBjb25maWd1cmF0aW9uIG9iamVjdHMKLSAqICAgIChQb2xpY3ksIFNlY3VyaXR5LCBQcm92aWRlciwgU2lnbmVyLCBhbmQgSWRlbnRpdHkpLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byB1c2UgdGhlIHN1YmNsYXNzIGFuZCBvYmplY3Qgc3Vic3RpdHV0aW9uIGZlYXR1cmVzIG9mIHRoZQotICogICAgSmF2YSBTZXJpYWxpemF0aW9uIFByb3RvY29sLgotICouLi4KLSAqICAtIFRoZSBlbnRlcnByaXNlIGJlYW4gbXVzdCBub3QgYXR0ZW1wdCB0byBwYXNzIHRoaXMgYXMgYW4gYXJndW1lbnQgb3IgbWV0aG9kIHJlc3VsdC4gVGhlCi0gKiAgICBlbnRlcnByaXNlIGJlYW4gbXVzdCBwYXNzIHRoZSByZXN1bHQgb2YgU2Vzc2lvbkNvbnRleHQuZ2V0RUpCT2JqZWN0KCkgb3IgRW50aXR5Q29udGV4dC4KLSAqICAgIGdldEVKQk9iamVjdCgpIGluc3RlYWQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5QmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmViIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX1JFTU9URSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9CTVBfS0VZQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlib29sZWFuIGhhc1BLTWV0aG9kID0gZmFsc2U7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAyLCBuZXcgU3RyaW5nW117Q0hLSjIwMDIrQkVYVCwgQ0hLSjIwMDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDYsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA3LCBuZXcgU3RyaW5nW117Q0hLSjIwMDcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwOSwgbmV3IFN0cmluZ1tde0NIS0oyMDA5K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjgsIG5ldyBTdHJpbmdbXXtDSEtKMjAyOCtCRVhULCBDSEtKMjAyOCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyOSwgbmV3IFN0cmluZ1tde0NIS0oyMDI5K0JFWFQsIENIS0oyMDI5K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzMywgbmV3IFN0cmluZ1tde0NIS0oyMDMzK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzQsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM1LCBuZXcgU3RyaW5nW117Q0hLSjIwMzUrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzNiwgbmV3IFN0cmluZ1tde0NIS0oyMDM2K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzcsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM4LCBuZXcgU3RyaW5nW117Q0hLSjIwMzgrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzOSwgbmV3IFN0cmluZ1tde0NIS0oyMDM5K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTAzLCBuZXcgU3RyaW5nW117Q0hLSjIxMDMgKyBTUEVDfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMCwgbmV3IFN0cmluZ1tde0NIS0oyMjAwK09OX0JBU0UrU1BFQywgQ0hLSjIyMDArT05fVEhJUytTUEVDfSk7IC8vIENIS0oyMjAwIGlzIGEgc3BlY2lhbCBjYXNlLiBJdCdzIHNoYXJlZCBieSBhbGwgYmVhbiB0eXBlcy4KLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9idXMrQkVYVCwgQ0hLSjI0MDBfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYkZpbmQrQkVYVCwgQ0hLSjI0MDBfZWpiRmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwMF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA2LCBuZXcgU3RyaW5nW117Q0hLSjI0MDYrQkVYVCwgQ0hLSjI0MDYrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNytCRVhULCBDSEtKMjQwNytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOF9idXMrQkVYVCwgQ0hLSjI0MDhfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiRmluZCwgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2VqYkZpbmQrQkVYVCwgQ0hLSjI0MDhfZWpiRmluZCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiRmluZCtCRVhULCBDSEtKMjQwOV9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiRmluZCtCRVhULCBDSEtKMjQxMF9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxOCwgbmV3IFN0cmluZ1tde0NIS0oyNDE4K0JFWFQsIENIS0oyNDE4K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQyMCwgbmV3IFN0cmluZ1tde0NIS0oyNDIwK0JFWFQsIENIS0oyNDIwK01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMiwgbmV3IFN0cmluZ1tde0NIS0oyNDMyK0JFWFQsIENIS0oyNDMyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWhhc1BLTWV0aG9kID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci5wcmltVmFsaWRhdGVFeGlzdGVuY2UodmMsIGJlYW4sIGNsYXp6LCBlamJNZXRob2QpOwotCi0JCS8vIEJNUHMgbXVzdCBpbXBsZW1lbnQgZWpiRmluZEJ5UHJpbWFyeUtleS4gSWYgaXQgaXNuJ3QgaW1wbGVtZW50ZWQsIHZhbGlkYXRlTWV0aG9kRXhpc3RzKCkgd2lsbAotCQkvLyBvdXRwdXQgYW4gZXJyb3IuIChoYXNQS01ldGhvZCA9IHRydWUgaW1wbGllcyBpbXBsZW1lbnRlZCwgb3RoZXJ3aXNlIG5vdCBpbXBsZW1lbnRlZCkKLQkJaWYgKCFoYXNQS01ldGhvZCAmJiBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJGSU5EQllQUklNQVJZS0VZLmVxdWFscyhlamJNZXRob2QuZ2V0TmFtZSgpKSkgewotCQkJaW5jcmVtZW50RmluZEJ5UHJpbWFyeUtleUNvdW50KHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuNiBCdXNpbmVzcyBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBidXNpbmVzcyBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSwgYnV0IHRoZXkgbXVzdCBub3Qgc3RhcnQgd2l0aCAnZWpiJyB0byAKLQkgKiAgICAgICAgICBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB1c2VkIGJ5IHRoZSBFSkIgYXJjaGl0ZWN0dXJlLgotCSAqICAgICAgICAtIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgICAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAgICAgIC0gVGhlIG1ldGhvZCBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgICAgICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMuCi0JICogICAgICAgIC0gQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotCSAqICAgICAgICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgCi0JICogICAgICAgICAgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgYmVhbiAKLQkgKiAgICAgICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICAgICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIFBlcmZvcm0gY29tbW9uIEJNUC9DTVAgYnVzaW5lc3MgbWV0aG9kIGNoZWNrcwotCQlzdXBlci52YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBObyBzcGVjaWZpYyBCTVAgYnVzaW5lc3MgbWV0aG9kIGNoZWNrcy4KLQkJLy8gQWxsIG9mIHRoZSBwb2ludHMgaW4gOS4yLjYgYXJlIGNvbW1vbiB0byBib3RoIEJNUHMgJiBDTVBzLgotCX0KLQkKLQkvKioKLQkgKiA5LjIuMiBFbnRlcnByaXNlIGJlYW4gY2xhc3MKLQkgKiAgIC0gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgYW4gZW50aXR5IGJlYW4gY2xhc3M6Ci0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5FbnRpdHlCZWFuIGludGVyZmFjZS4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0LgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyBmaW5hbC4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBub3QgZGVmaW5lIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4KLQkgKiAgIC0gVGhlIGNsYXNzIG1heSwgYnV0IGlzIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UgWzldLiAKLQkgKiAgICAgSWYgdGhlIGNsYXNzIGltcGxlbWVudHMgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZSwgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBuby1vcCAKLQkgKiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGphdmF4LmVqYi5FSkJPYmplY3QgaW50ZXJmYWNlLiBUaGUgY29udGFpbmVyIAotCSAqICAgICB3aWxsIG5ldmVyIGludm9rZSB0aGVzZSBtZXRob2RzIG9uIHRoZSBiZWFuIGluc3RhbmNlcyBhdCBydW50aW1lLgotCSAqICAgLSBBIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgCi0JICogICAgIGRlZmluaW5nIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBhcyBhYnN0cmFjdC4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBidXNpbmVzcyBtZXRob2RzLCBhbmQgdGhlIAotCSAqICAgICBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUsIGFuZCBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBhcyBkZXNjcmliZWQgCi0JICogICAgIGxhdGVyIGluIHRoaXMgc2VjdGlvbi4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiAKLQkgKiAgICAgSWYgdGhlIGVudGl0eSBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgCi0JICogICAgIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzLCB0aGUgZmluZGVyIG1ldGhvZHMsIGFuZCB0aGUKLQkgKiAgICAgbWV0aG9kcyBvZiB0aGUgRW50aXR5QmVhbiBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGluIHRoZSAKLQkgKiAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgaXMgYWxsb3dlZCB0byBpbXBsZW1lbnQgb3RoZXIgbWV0aG9kcyAoZm9yIAotCSAqICAgICBleGFtcGxlIGhlbHBlciBtZXRob2RzIGludm9rZWQgaW50ZXJuYWxseSBieSB0aGUgYnVzaW5lc3MgbWV0aG9kcykgCi0JICogICAgIGluIGFkZGl0aW9uIHRvIHRoZSBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBFSkIgc3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQWxsIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSB0aGUgcGFyZW50LgotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIDkuMi41IGVqYkZpbmQgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IGJlYW4gY2xhc3MgbWF5IGFsc28gZGVmaW5lIGFkZGl0aW9uYWwgZWpiRmluZDxNRVRIT0Q+KC4uLikgZmluZGVyIG1ldGhvZHMuCi0JICogICAtIFRoZSBzaWduYXR1cmVzIG9mIHRoZSBmaW5kZXIgbWV0aG9kcyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCSAqICAgLSBBIGZpbmRlciBtZXRob2QgbmFtZSBtdXN0IHN0YXJ0IHdpdGggdGhlIHByZWZpeCAiZWpiRmluZCIgCi0JICogICAgIChlLmcuIGVqYkZpbmRCeVByaW1hcnlLZXksIGVqYkZpbmRMYXJnZUFjY291bnRzLCBlamJGaW5kTGF0ZVNoaXBtZW50cykuCi0JICogICAtIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgIC0gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JICogICAtIFRoZSBtZXRob2QgYXJndW1lbnQgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLQkgKiAgICAgb3IgYSBjb2xsZWN0aW9uIG9mIHByaW1hcnkga2V5cyAoc2VlIFNlY3Rpb24gU3Vic2VjdGlvbiA5LjEuOCkuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbnMsIGluY2x1ZGluZyAKLQkgKiAgICAgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uCi0JICogICAtIEV2ZXJ5IGVudGl0eSBiZWFuIG11c3QgZGVmaW5lIHRoZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZC4gVGhlIHJlc3VsdCB0eXBlIGZvciAKLQkgKiAgICAgdGhpcyBtZXRob2QgbXVzdCBiZSB0aGUgcHJpbWFyeSBrZXkgdHlwZSAoaS5lLiB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QgbXVzdCAKLQkgKiAgICAgYmUgYSBzaW5nbGUtb2JqZWN0IGZpbmRlcikuCi0JICogICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5kZXIgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JICogICAgIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCSAqICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JICogICAgIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotCQkvLyAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBhYm92ZSBjaGVjay4KLQotCQkvLyBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0JCS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0JCS8vIGJlIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLgotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCS8vIEEgZmluZGVyIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMobWV0aG9kKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDA4X2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBmaW5hbCBvciBzdGF0aWMuCi0JCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyNDEwX2VqYkZpbmQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJGaW5kLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnQgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JLUlJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RBcmd1bWVudHModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIFRoZSByZXR1cm4gdHlwZSBvZiBhIGZpbmRlciBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSB0eXBlLCAKLQkJLy8gb3IgYSBjb2xsZWN0aW9uIG9mIHByaW1hcnkga2V5cyAoc2VlIFNlY3Rpb24gU3Vic2VjdGlvbiA5LjEuOCkuCi0JCXZhbGlkYXRlRWpiRmluZE1ldGhvZF9rZXkodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBmaW5kZXIgbWV0aG9kcyB0byB0aHJvdyB0aGUgCi0JCS8vIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIAotCQkvLyBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JCS8vIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSBDb250YWluZXIgKHNlZSBTZWN0aW9uIDEyLjIuMikuCi0JCXZhbGlkYXRlTm9SZW1vdGVFeGNlcHRpb24odmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDBfZWpiRmluZCk7Ci0KLQkJdmFsaWRhdGVFamJGaW5kTWV0aG9kX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuNSBlamJGaW5kIG1ldGhvZHMKLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIG1heSBhbHNvIGRlZmluZSBhZGRpdGlvbmFsIGVqYkZpbmQ8TUVUSE9EPiguLi4pIGZpbmRlciBtZXRob2RzLgotCSAqICAgLSBUaGUgc2lnbmF0dXJlcyBvZiB0aGUgZmluZGVyIG1ldGhvZHMgbXVzdCBmb2xsb3cgdGhlIGZvbGxvd2luZyBydWxlczoKLQkgKiAgIC0gQSBmaW5kZXIgbWV0aG9kIG5hbWUgbXVzdCBzdGFydCB3aXRoIHRoZSBwcmVmaXggImVqYkZpbmQiIAotCSAqICAgICAoZS5nLiBlamJGaW5kQnlQcmltYXJ5S2V5LCBlamJGaW5kTGFyZ2VBY2NvdW50cywgZWpiRmluZExhdGVTaGlwbWVudHMpLgotCSAqICAgLSBBIGZpbmRlciBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50IHR5cGVzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS1JSU9QLgotCSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSwgCi0JICogICAgIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotCSAqICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCBpbmNsdWRpbmcgCi0JICogICAgIHRoZSBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLgotCSAqICAgLSBFdmVyeSBlbnRpdHkgYmVhbiBtdXN0IGRlZmluZSB0aGUgZWpiRmluZEJ5UHJpbWFyeUtleSBtZXRob2QuIFRoZSByZXN1bHQgdHlwZSBmb3IgCi0JICogICAgIHRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUgKGkuZS4gdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgCi0JICogICAgIGJlIGEgc2luZ2xlLW9iamVjdCBmaW5kZXIpLgotCSAqICAgLSBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluZGVyIG1ldGhvZHMgdG8gdGhyb3cgdGhlIAotCSAqICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkgKiAgICAgVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIAotCSAqICAgICBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgotCSAqICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZF9rZXkoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUaGUgcmV0dXJuIHR5cGUgb2YgYSBmaW5kZXIgbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSwgCi0JCS8vIG9yIGEgY29sbGVjdGlvbiBvZiBwcmltYXJ5IGtleXMgKHNlZSBTZWN0aW9uIFN1YnNlY3Rpb24gOS4xLjgpLgotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCi0JCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gKChFbnRpdHkpIGJlYW4pLmdldFByaW1hcnlLZXkoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHByaW1hcnlLZXkpOwotCi0JCWlmKCAhKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKHJldHVyblR5cGUsIHByaW1hcnlLZXkpIHx8Ci0JCQkgIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tQ29sbGVjdGlvbihyZXR1cm5UeXBlLCBiZWFuKSB8fAotCQkJICBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbUVudW1lcmF0aW9uKHJldHVyblR5cGUsIGJlYW4pCi0JCSAgICkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBwcmltYXJ5S2V5LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KLQkgKgotCSAqIDkuMi40IGVqYlBvc3RDcmVhdGUgbWV0aG9kcwotCSAqIC0gRm9yIGVhY2ggZWpiQ3JlYXRlKC4uLikgbWV0aG9kLCB0aGUgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBtYXRjaGluZyAKLQkgKiAgIGVqYlBvc3RDcmVhdGUoLi4uKSBtZXRob2QsIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0JICogICAgLSBUaGUgbWV0aG9kIG5hbWUgbXVzdCBiZSBlamJQb3N0Q3JlYXRlLgotCSAqICAgIC0gVGhlIG1ldGhvZCBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkgKiAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgIC0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkgKiAgICAtIFRoZSBtZXRob2QgYXJndW1lbnRzIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWF0Y2hpbmcgCi0JICogICAgICBlamJDcmVhdGUoLi4uKSBtZXRob2QuCi0JICogICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLCAKLQkgKiAgICAgIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkgKiAgICAgIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCB0byB0aHJvdyAKLQkgKiAgICAgIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiAKLQkgKiAgICAgIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50IGVudGVycHJpc2UgCi0JICogICAgICBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIAotCSAqICAgICAgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gdG8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIAotCSAqICAgICAgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLi4uCi0JKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGNoZWNrcwotCQlzdXBlci52YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIE5vIHNwZWNpZmljIEJNUCBlamJQb3N0Q3JlYXRlIG1ldGhvZCBjaGVja3MuCi0JCS8vIEFsbCBvZiB0aGUgcG9pbnRzIGluIDkuMi40IGFyZSBjb21tb24gdG8gYm90aCBCTVBzICYgQ01Qcy4KLQl9Ci0JCi0JLyoqCi0JICogOS4yLjUgZWpiRmluZCBtZXRob2RzCi0JICouLi4KLQkgKiAgIC0gRXZlcnkgZW50aXR5IGJlYW4gbXVzdCBkZWZpbmUgdGhlIGVqYkZpbmRCeVByaW1hcnlLZXkgbWV0aG9kLiBUaGUgcmVzdWx0IHR5cGUgZm9yIAotCSAqICAgICB0aGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBwcmltYXJ5IGtleSB0eXBlIChpLmUuIHRoZSBlamJGaW5kQnlQcmltYXJ5S2V5IG1ldGhvZCBtdXN0IAotCSAqICAgICBiZSBhIHNpbmdsZS1vYmplY3QgZmluZGVyKS4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVNZXRob2RFeGlzdHModmMsIGJlYW4sIGNsYXp6KTsKLQotCQlpZiAoIWhhc1BLTWV0aG9kKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2ZXJpZnlGaWVsZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8qCi0JCS8vIFBsdXMsIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIGZpZWxkIGV4aXN0cyBvbiB0aGUgYmVhbi4KLQkJTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHMoKTsKLQkJaWYoKGZpZWxkcyA9PSBudWxsKSB8fCAoZmllbGRzLnNpemUoKSA9PSAwKSkgewotCQkJYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuRUpCX0JNUF9OT0ZJRUxEUywgbmV3IFN0cmluZ1tdIHtnZXRNb2RlbE9iamVjdE5hbWUoKX0sIGdldE1vZGVsT2JqZWN0KCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCSovCi0JfQotCQotCS8qCi0JICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKLQkJaGFzUEtNZXRob2QgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEhvbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3NmM0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBIb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBiZWFuIG1hbmFnZWQgZW50aXR5IGhvbWUgY2xhc3NlcyBmb3IgZXJyb3JzIG9yIHBvdGVudGlhbCBlcnJvcnMuCi0gKiBJZiBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLCBhbiBlcnJvciwgd2FybmluZywgb3IgaW5mbyBtYXJrZXIgaXMgYWRkZWQgdG8gdGhlIHRhc2sgbGlzdC4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHBhcmFncmFwaCBpcyB0YWtlbiBmcm9tCi0gKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0gKiBWZXJzaW9uOiAxLjEKLSAqIFN0YXR1czogRmluYWwgUmVsZWFzZQotICogUmVsZWFzZTogMTIvMTcvOTkKLSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIDkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBIDk0MzAzLCBVLlMuQS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0gKiAgIC0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQkhvbWUgaW50ZXJmYWNlLgotICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUktSUlPUC4gCi0gKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyBmb3IgCi0gKiAgICAgUk1JLUlJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0gKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UgCi0gKiAgICAgaW5oZXJpdGFuY2UgaXMgc3ViamVjdCB0byB0aGUgUk1JLUlJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHJlbW90ZSBpbnRlcmZhY2VzLgotICogICAtIEVhY2ggbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgIC0gQSBjcmVhdGUgbWV0aG9kLgotICogICAgICAtIEEgZmluZGVyIG1ldGhvZC4KLSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIHRoZSAKLSAqICAgICBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIAotICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0gKiAgIC0gVGhlIHJldHVybiB0eXBlIGZvciBhIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIHR5cGUuCi0gKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIGVqYkNyZWF0ZSAKLSAqICAgICBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIEJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiAKLSAqICAgICB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgCi0gKiAgICAgKGkuZSB0aGUgc2V0IG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIHN1cGVyc2V0Ci0gKiAgICAgb2YgdGhlIHVuaW9uIG9mIGV4Y2VwdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGVqYkNyZWF0ZSBhbmQgZWpiUG9zdENyZWF0ZSBtZXRob2RzKQotICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0gKiAgIC0gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLSAqICAgICBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0gKiAgICAgKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotICogICAgIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBmaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgYmUgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIAotICogICAgIGludGVyZmFjZSB0eXBlIChmb3IgYSBzaW5nbGUtb2JqZWN0IGZpbmRlciksIG9yIGEgY29sbGVjdGlvbiB0aGVyZW9mIChmb3IgYSAKLSAqICAgICBtdWx0aS1vYmplY3QgZmluZGVyKS4KLSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAotICogICAgIGFsd2F5cyBhIHNpbmdsZS1vYmplY3QgZmluZGVyLiBUaGUgbWV0aG9kIG11c3QgZGVjbGFyZSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgCi0gKiAgICAgYXMgdGhlIG1ldGhvZCBhcmd1bWVudC4KLSAqICAgLSBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhbiBlamJGaW5kIG1ldGhvZCBvZiB0aGUgCi0gKiAgICAgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZCAKLSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG9mIGEgZmluZGVyIG1ldGhvZCBtdXN0IGluY2x1ZGUgdGhlIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24uIAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBIb21lIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5SG9tZSBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU1NHSUQgPSAiLmVoIjsgLy8gSW4gbWVzc2FnZXMsIHRvIGlkZW50aWZ5IHdoaWNoIG1lc3NhZ2UgdmVyc2lvbiBiZWxvbmdzIHRvIHRoZSBCTVAgYmVhbiBjbGFzcywgdGhpcyBpZCBpcyB1c2VkLiAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVCA9IE1TU0dJRCArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIG5vbi1tZXRob2QsIG5vbi1maWVsZCBtZXNzYWdlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRVhUID0gTVNTR0lEICsgT05fQkFTRSArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGluaGVyaXRlZCBmcm9tIGEgYmFzZSB0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWFQgPSBNU1NHSUQgKyBPTl9USElTICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgdHlwZQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0hPTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNSwgbmV3IFN0cmluZ1tde0NIS0oyMDA1K0JFWFQsIENIS0oyMDA1K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMSwgbmV3IFN0cmluZ1tde0NIS0oyMDExK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTIsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDI2LCBuZXcgU3RyaW5nW117Q0hLSjIwMjYrQkVYVCwgQ0hLSjIwMjYrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDMwLCBuZXcgU3RyaW5nW117Q0hLSjIwMzArQkVYVCwgQ0hLSjIwMzArTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0ICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDIsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMitCRVhULCBDSEtKMjQwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMywgbmV3IFN0cmluZ1tde0NIS0oyNDAzK0JFWFQsIENIS0oyNDAzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA1LCBuZXcgU3RyaW5nW117Q0hLSjI0MDUrQkVYVCwgQ0hLSjI0MDUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNSwgbmV3IFN0cmluZ1tde0NIS0oyNDE1K0JFWFQsIENIS0oyNDE1K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCS8qKgotCSAqIDkuMi44IEVudGl0eSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkgKiAgICAgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCSAqICAgICAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JICogICAgIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCSAqLi4uCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkgKiAgICAgZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZCAKLQkgKiAgICAgbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnZhbGlkYXRlRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGUgdmVyaWZ5TWF0Y2hpbmdCZWFuRmluZE1ldGhvZCBjaGVja3MgZm9yIHRoZSB0d28gZm9sbG93aW5nIHJlcXVpcmVtZW50czoKLQkJLy8gCi0JCS8vIEVhY2ggZmluZGVyIG1ldGhvZCBtdXN0IGJlIG5hbWVkICJmaW5kPE1FVEhPRD4iIChlLmcuIGZpbmRMYXJnZUFjY291bnRzKSwgYW5kIGl0Ci0JCS8vIG11c3QgbWF0Y2ggb25lIG9mIHRoZSBlamJGaW5kPE1FVEhPRD4gbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyAKLQkJLy8gKGUuZy4gZWpiRmluZExhcmdlQWNjb3VudHMpLiBUaGUgbWF0Y2hpbmcgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZCBtdXN0IGhhdmUgdGhlIAotCQkvLyBzYW1lIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzLiAoTm90ZSB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXkgYmUgZGlmZmVyZW50LikKLQkJLy8gCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkZpbmQgbWV0aG9kIG9mIHRoZSAKLQkJLy8gZW50aXR5IGJlYW4gY2xhc3MgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgbWF0Y2hpbmcgZmluZAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQl2YWxpZGF0ZUZpbmRNZXRob2RfYmVhbkRlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogOS4yLjggRW50aXR5IGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCSAqICAgLSBFYWNoIGZpbmRlciBtZXRob2QgbXVzdCBiZSBuYW1lZCAiZmluZDxNRVRIT0Q+IiAoZS5nLiBmaW5kTGFyZ2VBY2NvdW50cyksIGFuZCBpdAotCSAqICAgICBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgCi0JICogICAgIChlLmcuIGVqYkZpbmRMYXJnZUFjY291bnRzKS4gVGhlIG1hdGNoaW5nIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2QgbXVzdCBoYXZlIHRoZSAKLQkgKiAgICAgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgbWF5IGJlIGRpZmZlcmVudC4pCi0JICouLi4KLQkgKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCSAqICAgICBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kIAotCSAqICAgICBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kX2JlYW5EZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZSB2ZXJpZnlNYXRjaGluZ0JlYW5GaW5kTWV0aG9kIGNoZWNrcyBmb3IgdGhlIHR3byBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOgotCQkvLyAKLQkJLy8gRWFjaCBmaW5kZXIgbWV0aG9kIG11c3QgYmUgbmFtZWQgImZpbmQ8TUVUSE9EPiIgKGUuZy4gZmluZExhcmdlQWNjb3VudHMpLCBhbmQgaXQKLQkJLy8gbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGVqYkZpbmQ8TUVUSE9EPiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzIAotCQkvLyAoZS5nLiBlamJGaW5kTGFyZ2VBY2NvdW50cykuIFRoZSBtYXRjaGluZyBlamJGaW5kPE1FVEhPRD4gbWV0aG9kIG11c3QgaGF2ZSB0aGUgCi0JCS8vIHNhbWUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMuIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIG1heSBiZSBkaWZmZXJlbnQuKQotCQkvLyAKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiRmluZCBtZXRob2Qgb2YgdGhlIAotCQkvLyBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyBmaW5kCi0JCS8vIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCXZhbGlkYXRlTWF0Y2hpbmdCZWFuRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBLZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc5NWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIFZhbGlkYXRlIGEgQk1QIGtleS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQk1QS2V5IGV4dGVuZHMgQVZhbGlkYXRlS2V5Q2xhc3MgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQk1QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDEsIG5ldyBTdHJpbmdbXXtDSEtKMjAwMStFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTksIG5ldyBTdHJpbmdbXXtDSEtKMjAxOStFWFR9KTsKLQotLy9Eb24ndCB1c2UgdGhhdCBBVmFsaWRhdGVFSkIgbWV0aG9kCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitFWFR9KTsKLS8vRG9uJ3QgdXNlIHRoYXQgQVZhbGlkYXRlRUpCIG1ldGhvZAkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrRVhUfSk7Ci0vL0Rvbid0IHVzZSB0aGF0IEFWYWxpZGF0ZUVKQiBtZXRob2QJCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWN0dWFsbHkgZG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJLy9Ob3RoaW5nIHRvIGRvLgotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBSZW1vdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUFJlbW90ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ2NDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUFJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0vKioKLSAqIFZhbGlkYXRlcyB0aGUgcmVtb3RlIGludGVyZmFjZSBvZiBhIEJNUCBiZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVCTVBSZW1vdGUgZXh0ZW5kcyBBVmFsaWRhdGVSZW1vdGUgIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuZXIiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0JNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEyLCBuZXcgU3RyaW5nW117Q0hLSjIwMTIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNywgbmV3IFN0cmluZ1tde0NIS0oyMDE3K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMywgbmV3IFN0cmluZ1tde0NIS0oyMDIzK0JFWFQsIENIS0oyMDIzK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIxMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjEwNSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTIsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMitCRVhULCBDSEtKMjQxMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMywgbmV3IFN0cmluZ1tde0NIS0oyNDEzK0JFWFQsIENIS0oyNDEzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE0LCBuZXcgU3RyaW5nW117Q0hLSjI0MTQrQkVYVCwgQ0hLSjI0MTQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNStCRVhULCBDSEtKMjQxNStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4Y2JmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBlbnRpdHkgYmVhbiBjbGFzc2VzIGZvciBlcnJvcnMgb3IgcG90ZW50aWFsIGVycm9ycy4KLSAqIElmIGFueSBwcm9ibGVtcyBhcmUgZm91bmQsIGFuIGVycm9yLCB3YXJuaW5nLCBvciBpbmZvIG1hcmtlciBpcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotICoKLSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLSAqIFZlcnNpb246IDEuMQotICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0gKiBSZWxlYXNlOiAxMi8xNy85OQotICogQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKgotICogQWxsIDkuMi5YIHNlY3Rpb25zIGRlc2NyaWJlIEJNUCByZXF1aXJlbWVudHMuCi0gKiBJZiBhIENNUCByZXF1aXJlbWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGVzZSwgdGhlbiB0aGUgZGlmZmVyZW5jZXMgYXJlCi0gKiBkb2N1bWVudGVkIGluIDkuNC5YIHNlY3Rpb25zLgotICoKLSAqCi0gKiA5LjQuMSBDb250YWluZXItbWFuYWdlZCBmaWVsZHMKLSAqLi4uCi0gKiBUaGUgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgCi0gKiBkZWZpbmVkIGFzIHRyYW5zaWVudC4KLSAqLi4uCi0gKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLSAqICAgICBjb21wbGlhbnQgY29udGFpbmVyLgotICogICAgICAgIC0gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSB0eXBlcyAKLSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0gKiAgICAgICAgICBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHByaW1pdGl2ZSB0eXBlcywgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAKLSAqICAgICAgICAgIHNlcmlhbGl6YWJsZSB0eXBlcywgYW5kIHJlZmVyZW5jZXMgb2YgZW50ZXJwcmlzZSBiZWFucycgcmVtb3RlIG9yIGhvbWUgCi0gKiAgICAgICAgICBpbnRlcmZhY2VzLgotICogICAgICAgIC0gVGhlIENvbnRhaW5lciBQcm92aWRlciBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIHVzZSBKYXZhIHByb2dyYW1taW5nIAotICogICAgICAgICAgbGFuZ3VhZ2UgU2VyaWFsaXphdGlvbiB0byBzdG9yZSB0aGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIGluIHRoZSBkYXRhYmFzZS4gCi0gKiAgICAgICAgICBJZiB0aGUgY29udGFpbmVyIGNob29zZXMgYSBkaWZmZXJlbnQgYXBwcm9hY2gsIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGVxdWl2YWxlbnQgCi0gKiAgICAgICAgICB0byB0aGF0IG9mIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgU2VyaWFsaXphdGlvbi4gVGhlIENvbnRhaW5lciBtdXN0IGFsc28gYmUgCi0gKiAgICAgICAgICBjYXBhYmxlIG9mIHBlcnNpc3RpbmcgcmVmZXJlbmNlcyB0byBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgYW5kIGhvbWUgaW50ZXJmYWNlcyAKLSAqICAgICAgICAgIChmb3IgZXhhbXBsZSwgYnkgc3RvcmluZyB0aGVpciBoYW5kbGUgb3IgcHJpbWFyeSBrZXkpLgotICouLi4KLSAqCi0gKiA5LjQuMiBlamJDcmVhdGUsIGVqYlBvc3RDcmVhdGUKLSAqLi4uCi0gKiAgIC0gVGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIHRvIHJldHVybiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgdHlwZS4gCi0gKiAgICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHNob3VsZCBiZSBjb2RlZCB0byByZXR1cm4gYSBudWxsLiAKLSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotICouLi4KLSAqCi0gKiA5LjQuNiBmaW5kZXIgbWV0aG9kcwotICogICAtIFRoZSBlbnRpdHkgQmVhbiBQcm92aWRlciBkb2VzIG5vdCB3cml0ZSB0aGUgZmluZGVyIChlamJGaW5kPE1FVEhPRD4oLi4uKSkgbWV0aG9kcy4KLSAqLi4uCi0gKiA5LjQuNyBwcmltYXJ5IGtleSB0eXBlCi0gKiAgIC0gVGhlIGNvbnRhaW5lciBtdXN0IGJlIGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gVGhlcmVmb3JlLCAKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSAKLSAqICAgICBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgaW4gdGhpcyBzdWJzZWN0aW9uLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgaW4gCi0gKiAgICAgU3Vic2VjdGlvbiA5LjIuOS4KLSAqCi0gKiAgICAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjbGFzcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZToKLSAqICAgICAgICAtIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBhIHNpbmdsZSBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuCi0gKiAgICAgICAgLSBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcy4KLSAqICAgICBUaGUgc2Vjb25kIG1ldGhvZCBpcyBuZWNlc3NhcnkgZm9yIGltcGxlbWVudGluZyBjb21wb3VuZCBrZXlzLCBhbmQgdGhlIGZpcnN0IG1ldGhvZCBpcyBjb252ZW5pZW50IGZvcgotICogICAgIHNpbmdsZS1maWVsZCBrZXlzLiBXaXRob3V0IHRoZSBmaXJzdCBtZXRob2QsIHNpbXBsZSB0eXBlcyBzdWNoIGFzIFN0cmluZyB3b3VsZCBoYXZlIHRvIGJlIHdyYXBwZWQgaW4gYQotICogICAgIHVzZXItZGVmaW5lZCBjbGFzcy4KLSAqIAotICogICAgIDkuNC43LjEgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBCZWFuIFByb3ZpZGVyIHVzZXMgdGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHNwZWNpZnkgdGhlCi0gKiAgICAgY29udGFpbmVyLW1hbmFnZWQgZmllbGQgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkga2V5LiBUaGUgZmllbGQncyB0eXBlIG11c3QgYmUKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLSAqCi0gKiAgICAgOS40LjcuMiBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0gKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHRoZSBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotICoKLSAqICAgICA5LjQuNy4zIFNwZWNpYWwgY2FzZTogVW5rbm93biBwcmltYXJ5IGtleSBjbGFzcwotICogICAgIEluIHNwZWNpYWwgc2l0dWF0aW9ucywgdGhlIGVudGl0eSBCZWFuIFByb3ZpZGVyIG1heSBjaG9vc2Ugbm90IHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNsYXNzIGZvciBhbgotICogICAgIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIFRoaXMgY2FzZSB1c3VhbGx5IGhhcHBlbnMgd2hlbiB0aGUgZW50aXR5IGJlYW4gZG9lcwotICogICAgIG5vdCBoYXZlIGEgbmF0dXJhbCBwcmltYXJ5IGtleSwgYW5kIHRoZSBCZWFuIFByb3ZpZGVyIHdhbnRzIHRvIGFsbG93IHRoZSBEZXBsb3llciB0byBzZWxlY3QgdGhlIHByaW1hcnkKLSAqICAgICBrZXkgZmllbGRzIGF0IGRlcGxveW1lbnQgdGltZS4gVGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgdHlwZSB3aWxsIHVzdWFsbHkgYmUgZGVyaXZlZCBmcm9tIHRoZSBwcmltYXJ5Ci0gKiAgICAga2V5IHR5cGUgdXNlZCBieSB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBzeXN0ZW0gdGhhdCBzdG9yZXMgdGhlIGVudGl0eSBvYmplY3RzLiBUaGUgcHJpbWFyeSBrZXkKLSAqICAgICB1c2VkIGJ5IHRoZSBkYXRhYmFzZSBzeXN0ZW0gbWF5IG5vdCBiZSBrbm93biB0byB0aGUgQmVhbiBQcm92aWRlci4KLSAqICAgICBXaGVuIGRlZmluaW5nIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGVycHJpc2UgYmVhbiwgdGhlIERlcGxveWVyIG1heSBzb21ldGltZXMgbmVlZCB0byBzdWJjbGFzcwotICogICAgIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0byBhZGQgYWRkaXRpb25hbCBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgKHRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgZm9yIGVudGl0eSBiZWFucwotICogICAgIHRoYXQgZG8gbm90IGhhdmUgYSBuYXR1cmFsIHByaW1hcnkga2V5LCBhbmQgdGhlIHByaW1hcnkga2V5cyBhcmUgc3lzdGVtLWdlbmVyYXRlZCBieSB0aGUgdW5kZXJseWluZwotICogICAgIGRhdGFiYXNlIHN5c3RlbSB0aGF0IHN0b3JlcyB0aGUgZW50aXR5IG9iamVjdHMpLgotICogICAgIEluIHRoaXMgc3BlY2lhbCBjYXNlLCB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgb2YgdGhlIGZpbmRCeVByaW1hcnlLZXkgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMKLSAqICAgICBqYXZhLmxhbmcuT2JqZWN0LCBhbmQgdGhlIHJldHVybiB2YWx1ZSBvZiBlamJDcmVhdGUoKSBtdXN0IGJlIGRlY2xhcmVkIGFzCi0gKiAgICAgamF2YS5sYW5nLk9iamVjdC4gVGhlIEJlYW4gUHJvdmlkZXIgbXVzdCBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpbiB0aGUgZGVwbG95bWVudAotICogICAgIGRlc2NyaXB0b3IgYXMgb2YgdGhlIHR5cGUgamF2YS5sYW5nLk9iamVjdC4KLSAqICAgICBUaGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMgc3BlY2lmaWVkIGF0IGRlcGxveW1lbnQgdGltZSBpbiB0aGUgc2l0dWF0aW9ucyB3aGVuIHRoZSBCZWFuIFByb3ZpZGVyIGRldmVsb3BzCi0gKiAgICAgYW4gZW50aXR5IGJlYW4gdGhhdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgYmFjay1lbmRzIHRoYXQgcHJvdmlkZSBwZXJzaXN0ZW5jZSwgYW5kIHdoZW4KLSAqICAgICB0aGVzZSBtdWx0aXBsZSBiYWNrLWVuZHMgcmVxdWlyZSBkaWZmZXJlbnQgcHJpbWFyeSBrZXkgc3RydWN0dXJlcy4KLSAqICAgICBVc2Ugb2YgZW50aXR5IGJlYW5zIHdpdGggYSBkZWZlcnJlZCBwcmltYXJ5IGtleSB0eXBlIHNwZWNpZmljYXRpb24gbGltaXRzIHRoZSBjbGllbnQgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcKLSAqICAgICBtb2RlbCwgYmVjYXVzZSB0aGUgY2xpZW50cyB3cml0dGVuIHByaW9yIHRvIGRlcGxveW1lbnQgb2YgdGhlIGVudGl0eSBiZWFuIG1heSBub3QgdXNlLCBpbiBnZW5lcmFsLAotICogICAgIHRoZSBtZXRob2RzIHRoYXQgcmVseSBvbiB0aGUga25vd2xlZGdlIG9mIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotICogICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG1ldGhvZHMgbXVzdCBiZSBkb25lIGNhcmVmdWxseS4gRm9yIGV4YW1wbGUsIHRoZSBtZXRoLW9kcwotICogICAgIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBFbnRpdHlDb250ZXh0LmdldFByaW1hcnlLZXkoKSwgYmVjYXVzZQotICogICAgIHRoZSByZXR1cm4gdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBEZXBsb3llciBhZnRlciB0aGUgRUpCIGNsYXNzIGhhcyBiZWVuIHdyaXR0ZW4uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVDTVBCZWFuIGV4dGVuZHMgQVZhbGlkYXRlRW50aXR5QmVhbiBpbXBsZW1lbnRzIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMgewotCXByaXZhdGUgTGlzdCBfY29udGFpbmVyTWFuYWdlZEZpZWxkcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0JFQU5DTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDIsIG5ldyBTdHJpbmdbXXtDSEtKMjAwMitCRVhULCBDSEtKMjAwMitNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNCwgbmV3IFN0cmluZ1tde0NIS0oyMDA0K0JFWFQsIENIS0oyMDA0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA2LCBuZXcgU3RyaW5nW117Q0hLSjIwMDYrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwNywgbmV3IFN0cmluZ1tde0NIS0oyMDA3K0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDEzLCBuZXcgU3RyaW5nW117Q0hLSjIwMTMrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxNCwgbmV3IFN0cmluZ1tde0NIS0oyMDE0K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTUsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMiwgbmV3IFN0cmluZ1tde0NIS0oyMDIyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjgsIG5ldyBTdHJpbmdbXXtDSEtKMjAyOCtCRVhULCBDSEtKMjAyOCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyOSwgbmV3IFN0cmluZ1tde0NIS0oyMDI5K0JFWFQsIENIS0oyMDI5K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzMiwgbmV3IFN0cmluZ1tde0NIS0oyMDMyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzMsIG5ldyBTdHJpbmdbXXtDSEtKMjAzMytFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM0LCBuZXcgU3RyaW5nW117Q0hLSjIwMzQrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzNSwgbmV3IFN0cmluZ1tde0NIS0oyMDM1K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzYsIG5ldyBTdHJpbmdbXXtDSEtKMjAzNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDM3LCBuZXcgU3RyaW5nW117Q0hLSjIwMzcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAzOCwgbmV3IFN0cmluZ1tde0NIS0oyMDM4K0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMzksIG5ldyBTdHJpbmdbXXtDSEtKMjAzOStFWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDAsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMCtPTl9CQVNFK1NQRUMsIENIS0oyMjAwK09OX1RISVMrU1BFQ30pOyAvLyBDSEtKMjIwMCBpcyBhIHNwZWNpYWwgY2FzZS4gSXQncyBzaGFyZWQgYnkgYWxsIGJlYW4gdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwMSwgbmV3IFN0cmluZ1tde0NIS0oyMjAxK0JFWFQsIENIS0oyMjAxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjAyLCBuZXcgU3RyaW5nW117Q0hLSjIyMDIrQkVYVCwgQ0hLSjIyMDIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDMsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMytCRVhULCBDSEtKMjIwMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNywgbmV3IFN0cmluZ1tde0NIS0oyMjA3K0VYVCwgQ0hLSjIyMDcrRVhUfSk7IC8vIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgbWVzc2FnZSBpZCBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBtZXRob2QgaXMgaW5oZXJpdGVkCi0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfYnVzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfYnVzK0JFWFQsIENIS0oyNDAwX2J1cytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMF9lamJDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiQ3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2VqYkZpbmQsIG5ldyBTdHJpbmdbXXtDSEtKMjQwMF9lamJGaW5kK0JFWFQsIENIS0oyNDAwX2VqYkZpbmQrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2VqYlBvc3RDcmVhdGUrQkVYVCwgQ0hLSjI0MDBfZWpiUG9zdENyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwNiwgbmV3IFN0cmluZ1tde0NIS0oyNDA2K0JFWFQsIENIS0oyNDA2K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2J1cytCRVhULCBDSEtKMjQwOF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA4X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOF9lamJQb3N0Q3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiUG9zdENyZWF0ZStCRVhULCBDSEtKMjQwOF9lamJQb3N0Q3JlYXRlK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2J1cytCRVhULCBDSEtKMjQwOV9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDlfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MDlfZWpiRmluZCtCRVhULCBDSEtKMjQwOV9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDA5X2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2J1cytCRVhULCBDSEtKMjQxMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9lamJGaW5kLCBuZXcgU3RyaW5nW117Q0hLSjI0MTBfZWpiRmluZCtCRVhULCBDSEtKMjQxMF9lamJGaW5kK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYlBvc3RDcmVhdGUsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9lamJQb3N0Q3JlYXRlK0JFWFQsIENIS0oyNDEwX2VqYlBvc3RDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxOCwgbmV3IFN0cmluZ1tde0NIS0oyNDE4K0JFWFQsIENIS0oyNDE4K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIwLCBuZXcgU3RyaW5nW117Q0hLSjI0MjArQkVYVCwgQ0hLSjI0MjArTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzIsIG5ldyBTdHJpbmdbXXtDSEtKMjQzMitCRVhULCBDSEtKMjQzMitNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0NTYsIG5ldyBTdHJpbmdbXXtDSEtKMjQ1NitPTl9CQVNFLCBDSEtKMjQ1NitPTl9USElTfSk7IC8vIHNwZWNpYWwgY2FzZSAoc2hhcmVkIGJ5IGFsbCB0eXBlcykKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9jb250YWluZXJNYW5hZ2VkRmllbGRzID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgewotCQlyZXR1cm4gX2NvbnRhaW5lck1hbmFnZWRGaWVsZHM7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NvbnRhaW5lck1hbmFnZWRGaWVsZCgpIHsKLQkJcmV0dXJuIChnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgIT0gbnVsbCAmJiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkuc2l6ZSgpID4gMCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkgIT0gbnVsbCAmJiBnZXRDb250YWluZXJNYW5hZ2VkRmllbGRzKCkuY29udGFpbnMoZmllbGQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogOS40LjEgQ29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICouLi4KLQkgKiBUaGUgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgCi0JICogZGVmaW5lZCBhcyB0cmFuc2llbnQuCi0JICouLi4KLQkgKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLQkgKiAgICAgY29tcGxpYW50IGNvbnRhaW5lci4KLQkgKiAgICAgICAgLSBUaGUgQmVhbiBQcm92aWRlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHR5cGVzIAotCSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0JICogICAgICAgICAgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBwcmltaXRpdmUgdHlwZXMsIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgCi0JICogICAgICAgICAgc2VyaWFsaXphYmxlIHR5cGVzLCBhbmQgcmVmZXJlbmNlcyBvZiBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgb3IgaG9tZSAKLQkgKiAgICAgICAgICBpbnRlcmZhY2VzLgotCSAqLi4uCi0JICoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEhvbWVfaG9tZURlcChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSmF2YUNsYXNzIGhvbWVJbnRmID0gYmVhbi5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBob21lSW50Zik7Ci0KLQkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKGZpZWxkKSwgaG9tZUludGYpOwotCX0KLQkKLQkvKioKLQkgKiA5LjQuMSBDb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQkgKi4uLgotCSAqIFRoZSBmaWVsZHMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyBhcyBwdWJsaWMsIGFuZCBtdXN0IG5vdCBiZSAKLQkgKiBkZWZpbmVkIGFzIHRyYW5zaWVudC4KLQkgKi4uLgotCSAqICAgLSBUaGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBlbnN1cmUgdGhhdCBhbiBlbnRpdHkgYmVhbiBjYW4gYmUgZGVwbG95ZWQgaW4gYW55IAotCSAqICAgICBjb21wbGlhbnQgY29udGFpbmVyLgotCSAqICAgICAgICAtIFRoZSBCZWFuIFByb3ZpZGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdHlwZXMgCi0JICogICAgICAgICAgYXNzaWduZWQgdG8gdGhlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyBhcmUgcmVzdHJpY3RlZCB0byB0aGUgZm9sbG93aW5nOiAKLQkgKiAgICAgICAgICBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHByaW1pdGl2ZSB0eXBlcywgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAKLQkgKiAgICAgICAgICBzZXJpYWxpemFibGUgdHlwZXMsIGFuZCByZWZlcmVuY2VzIG9mIGVudGVycHJpc2UgYmVhbnMnIHJlbW90ZSBvciBob21lIAotCSAqICAgICAgICAgIGludGVyZmFjZXMuCi0JICouLi4KLQkgKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpcyB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRSZW1vdGVfcmVtb3RlRGVwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlKYXZhQ2xhc3MgcmVtb3RlSW50ZiA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCByZW1vdGVJbnRmKTsKLQotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoZmllbGQpLCByZW1vdGVJbnRmKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGxvYWRDb250YWluZXJNYW5hZ2VkRmllbGRzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7Ci0JCS8vIFRoZSB2YWxpZGF0aW9uIGluIHRoaXMgY2xhc3MsIG9mIHRoZSBmaWVsZHMsIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZQotCQkvLyBjb250YWluZXItbWFuYWdlZCBmaWVsZHMsIG5vdCB0aGUgZmllbGRzIG9mIHRoaXMgY2xhc3MgZGlyZWN0bHkuCi0JCWlmIChiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJTGlzdCBmaWVsZHMgPSBudWxsOwotCQl0cnkgewotCQkJTGlzdCBjbXBBdHRyaWJ1dGVzID0gKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQkJaWYgKGNtcEF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhY21wQXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKLQkJCQlmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KGNtcEF0dHJpYnV0ZXMuc2l6ZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNtcEF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspCi0JCQkJCWZpZWxkcy5hZGQoKChDTVBBdHRyaWJ1dGUpIGNtcEF0dHJpYnV0ZXMuZ2V0KGkpKS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVSKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZXhjKTsKLQkJCX0KLQkJCWZpZWxkcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiAxOC4xLjIgUHJvZ3JhbW1pbmcgcmVzdHJpY3Rpb25zCi0JICouLi4KLQkgKiAgICAtIEFuIGVudGVycHJpc2UgQmVhbiBtdXN0IG5vdCB1c2UgcmVhZC93cml0ZSBzdGF0aWMgZmllbGRzLiBVc2luZyByZWFkLW9ubHkgc3RhdGljIGZpZWxkcyBpcwotCSAqICAgYWxsb3dlZC4gVGhlcmVmb3JlLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzdGF0aWMgZmllbGRzIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3MgYmUKLQkgKiAgIGRlY2xhcmVkIGFzIGZpbmFsLgotCSAqLi4uCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByaW1WYWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXZhbGlkYXRlQ29udGFpbmVyTWFuYWdlZEZpZWxkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpOwotCX0KLQkKLQkvKioKLQkgKiA5LjIuNiBCdXNpbmVzcyBtZXRob2RzCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgZGVmaW5lIHplcm8gb3IgbW9yZSBidXNpbmVzcyBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgCi0JICogICAgIG11c3QgZm9sbG93IHRoZXNlIHJ1bGVzOgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSwgYnV0IHRoZXkgbXVzdCBub3Qgc3RhcnQgd2l0aCBlamIgdG8gCi0JICogICAgICAgICAgYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLQkgKiAgICAgICAgLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqICAgICAgICAtIFRoZSBtZXRob2QgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUktSUlPUC4KLQkgKiAgICAgICAgLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBleGNlcHRpb25zLgotCSAqICAgICAgICAtIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSAKLQkgKiAgICAgICAgICBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIAotCSAqICAgICAgICAgIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gCi0JICogICAgICAgICAgc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkgKiAgICAgICAgICB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGJ1c2luZXNzIG1ldGhvZCBjaGVja3MKLQkJaWYgKCFpc0VqYlJlbGF0aW9uc2hpcFJvbGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKQotCQkJc3VwZXIudmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gTm8gc3BlY2lmaWMgQ01QIGJ1c2luZXNzIG1ldGhvZCBjaGVja3MuCi0JCS8vIEFsbCBvZiB0aGUgcG9pbnRzIGluIDkuMi42IGFyZSBjb21tb24gdG8gYm90aCBCTVBzICYgQ01Qcy4KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCdXNpbmVzc01ldGhvZE5vUmVtb3RlRXhjZXB0aW9uKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKCFpc0VqYlJlbGF0aW9uc2hpcFJvbGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKQotCQkJc3VwZXIudmFsaWRhdGVCdXNpbmVzc01ldGhvZE5vUmVtb3RlRXhjZXB0aW9uKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsgLy8gRUpCIDIuMCBhZGRlZCAidGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBhYm92ZSIKLQl9Ci0JCi0JLyoqCi0JICogOS4yLjIgRW50ZXJwcmlzZSBiZWFuIGNsYXNzCi0JICogICAtIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIGFuIGVudGl0eSBiZWFuIGNsYXNzOgotCSAqICAgICAgLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuRW50aXR5QmVhbiBpbnRlcmZhY2UuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGJlIGRlZmluZWQgYXMgcHVibGljIGFuZCBtdXN0IG5vdCBiZSBhYnN0cmFjdC4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZmluYWwuCi0JICogICAgICAtIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cy4KLQkgKiAgICAgIC0gVGhlIGNsYXNzIG11c3Qgbm90IGRlZmluZSB0aGUgZmluYWxpemUoKSBtZXRob2QuCi0JICogICAtIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlIFs5XS4gCi0JICogICAgIElmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UsIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgbm8tb3AgCi0JICogICAgIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBqYXZheC5lamIuRUpCT2JqZWN0IGludGVyZmFjZS4gVGhlIGNvbnRhaW5lciAKLQkgKiAgICAgd2lsbCBuZXZlciBpbnZva2UgdGhlc2UgbWV0aG9kcyBvbiB0aGUgYmVhbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KLQkgKiAgIC0gQSBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBtZXRob2RzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIAotCSAqICAgICBkZWZpbmluZyB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgYWJzdHJhY3QuCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgYW5kIHRoZSAKLQkgKiAgICAgZWpiQ3JlYXRlLCBlamJQb3N0Q3JlYXRlLCBhbmQgZWpiRmluZDxNRVRIT0Q+IG1ldGhvZHMgYXMgZGVzY3JpYmVkIAotCSAqICAgICBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCi0JICogICAtIFRoZSBlbnRpdHkgYmVhbiBjbGFzcyBtYXkgaGF2ZSBzdXBlcmNsYXNzZXMgYW5kL29yIHN1cGVyaW50ZXJmYWNlcy4gCi0JICogICAgIElmIHRoZSBlbnRpdHkgYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIAotCSAqICAgICBlamJDcmVhdGUgYW5kIGVqYlBvc3RDcmVhdGUgbWV0aG9kcywgdGhlIGZpbmRlciBtZXRob2RzLCBhbmQgdGhlCi0JICogICAgIG1ldGhvZHMgb2YgdGhlIEVudGl0eUJlYW4gaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgCi0JICogICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKiAgIC0gVGhlIGVudGl0eSBiZWFuIGNsYXNzIGlzIGFsbG93ZWQgdG8gaW1wbGVtZW50IG90aGVyIG1ldGhvZHMgKGZvciAKLQkgKiAgICAgZXhhbXBsZSBoZWxwZXIgbWV0aG9kcyBpbnZva2VkIGludGVybmFsbHkgYnkgdGhlIGJ1c2luZXNzIG1ldGhvZHMpIAotCSAqICAgICBpbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyByZXF1aXJlZCBieSB0aGUgRUpCIHNwZWNpZmljYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEFsbCBvZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgdGhlIHBhcmVudC4KLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCXZhbGlkYXRlUHJpbWl0aXZlUHJpbWFyeUtleSh2YywgYmVhbiwgY2xhenopOyAvLyBpZiB0aGlzIGNsYXNzIHVzZXMgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXksIHRoZSB0eXBlIG9mIHRoZSBrZXkgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLQl9Ci0JCi0JLyoqCi0JICogOS40LjEgQ29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICouLi4KLQkgKiBUaGUgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgCi0JICogZGVmaW5lZCBhcyB0cmFuc2llbnQuCi0JICouLi4KLQkgKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLQkgKiAgICAgY29tcGxpYW50IGNvbnRhaW5lci4KLQkgKiAgICAgICAgLSBUaGUgQmVhbiBQcm92aWRlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHR5cGVzIAotCSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0JICogICAgICAgICAgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBwcmltaXRpdmUgdHlwZXMsIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgCi0JICogICAgICAgICAgc2VyaWFsaXphYmxlIHR5cGVzLCBhbmQgcmVmZXJlbmNlcyBvZiBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgb3IgaG9tZSAKLQkgKiAgICAgICAgICBpbnRlcmZhY2VzLgotCSAqLi4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb250YWluZXJNYW5hZ2VkRmllbGQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKGlzQ29udGFpbmVyTWFuYWdlZEZpZWxkKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpKSB7Ci0JCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMoZmllbGQpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMjAzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQotCQkJaWYgKGZpZWxkLmlzVHJhbnNpZW50KCkpIHsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIyMDEsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCi0JCQkvLyBDaGVjayBpZiBpdCdzIGEgcmVmZXJlbmNlIHRvIHRoZSBob21lIG9yIHJlbW90ZSBpbnRlcmZhY2UuCi0JCQl2YWxpZGF0ZUNvbnRhaW5lck1hbmFnZWRGaWVsZF9kZXBlbmRlbnQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogOS40LjEgQ29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICouLi4KLQkgKiBUaGUgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgYXMgcHVibGljLCBhbmQgbXVzdCBub3QgYmUgCi0JICogZGVmaW5lZCBhcyB0cmFuc2llbnQuCi0JICouLi4KLQkgKiAgIC0gVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZW5zdXJlIHRoYXQgYW4gZW50aXR5IGJlYW4gY2FuIGJlIGRlcGxveWVkIGluIGFueSAKLQkgKiAgICAgY29tcGxpYW50IGNvbnRhaW5lci4KLQkgKiAgICAgICAgLSBUaGUgQmVhbiBQcm92aWRlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHR5cGVzIAotCSAqICAgICAgICAgIGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGZvbGxvd2luZzogCi0JICogICAgICAgICAgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBwcmltaXRpdmUgdHlwZXMsIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgCi0JICogICAgICAgICAgc2VyaWFsaXphYmxlIHR5cGVzLCBhbmQgcmVmZXJlbmNlcyBvZiBlbnRlcnByaXNlIGJlYW5zJyByZW1vdGUgb3IgaG9tZSAKLQkgKiAgICAgICAgICBpbnRlcmZhY2VzLgotCSAqLi4uCi0JICoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgZWl0aGVyIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLCAKLQkgKiBvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb250YWluZXJNYW5hZ2VkRmllbGRfZGVwZW5kZW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKYXZhSGVscGVycyBmaWVsZFR5cGUgPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShmaWVsZCk7Ci0KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTZXJpYWxpemFibGUoZmllbGRUeXBlLCBiZWFuKSkgewotCQkJLy8gSWYgaXQgd2VyZSBwcmltaXRpdmUsIGl0IHdvdWxkIGJlIHNlcmlhbGl6YWJsZSwgc28gdHdvIGNoZWNrcyB3ZXJlIGRvbmUgaW4gdGhhdCBvbmUgbGluZSBvZiBjb2RlLgotCQkJLy8gCi0JCQkvLyBDaGVjayBpZiBpdCdzIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgb3IgaG9tZSBpbnRlcmZhY2UKLQkJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCQlpZiAoIShpc0NvbnRhaW5lck1hbmFnZWRIb21lX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCkpIHx8IChpc0NvbnRhaW5lck1hbmFnZWRSZW1vdGVfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eiwgZmllbGQpKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjIwMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBmaWVsZCwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA5LjQuNiBmaW5kZXIgbWV0aG9kcwotCSAqICAgLSBUaGUgZW50aXR5IEJlYW4gUHJvdmlkZXIgZG9lcyBub3Qgd3JpdGUgdGhlIGZpbmRlciAoZWpiRmluZDxNRVRIT0Q+KC4uLikpIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQkvLyBPbmx5IEJNUHMgaW1wbGVtZW50IGZpbmRlciBtZXRob2RzLgotCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGZvbGxvd3MgdGhlIEVKQiAxLjEuIHNwZWNpZmljYXRpb24uCi0JICoKLQkgKiA5LjIuNCBlamJQb3N0Q3JlYXRlIG1ldGhvZHMKLQkgKiAtIEZvciBlYWNoIGVqYkNyZWF0ZSguLi4pIG1ldGhvZCwgdGhlIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgbWF0Y2hpbmcgCi0JICogICBlamJQb3N0Q3JlYXRlKC4uLikgbWV0aG9kLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCSAqICAgIC0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiUG9zdENyZWF0ZS4KLQkgKiAgICAtIFRoZSBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAgICAtIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0JICogICAgLSBUaGUgbWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1hdGNoaW5nIAotCSAqICAgICAgZWpiQ3JlYXRlKC4uLikgbWV0aG9kLgotCSAqICAgIC0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9ucywgCi0JICogICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uCi0JICogICAgICBDb21wYXRpYmlsaXR5IE5vdGU6IEVKQiAxLjAgYWxsb3dlZCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgdG8gdGhyb3cgCi0JICogICAgICB0aGUgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gCi0JICogICAgICBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudCBlbnRlcnByaXNlIAotCSAqICAgICAgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciAKLQkgKiAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHRvIGluZGljYXRlIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb25zIHRvIHRoZSAKLQkgKiAgICAgIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKi4uLgotCSAqIDkuNC4yIGVqYkNyZWF0ZSwgZWpiUG9zdENyZWF0ZQotCSAqLi4uCi0JICogICAtIFRoZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHByaW1hcnkga2V5IGNsYXNzIHR5cGUuIAotCSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGVqYkNyZWF0ZSguLi4pIG1ldGhvZHMgc2hvdWxkIGJlIGNvZGVkIHRvIHJldHVybiBhIG51bGwuIAotCSAqICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaWdub3JlZCBieSB0aGUgQ29udGFpbmVyLgotCSAqLi4uCi0JKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGNoZWNrcwotCQlzdXBlci52YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCS8vIE5vIHNwZWNpZmljIENNUCBlamJQb3N0Q3JlYXRlTWV0aG9kIGNoZWNrcy4KLQkJLy8gQWxsIG9mIHRoZSBwb2ludHMgaW4gOS4yLjQgYXJlIGNvbW1vbiB0byBib3RoIEJNUHMgJiBDTVBzLgotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByaW1pdGl2ZVByaW1hcnlLZXkoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOyAvLyBiZWFuIGlzIGNoZWNrZWQgZm9yIG51bGwgaW4gQVZhbGlkYXRlRUpCLnZhbGlkYXRlKCkgbWV0aG9kLCBzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBpdCBoZXJlLgotCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCS8vIHByaW1pdGl2ZSBwcmltYXJ5IGtleQotCi0JCQkvLyBwcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gYSBzaW5nbGUgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzCi0JCQkvLyBUaGUgZmllbGQncyB0eXBlIG11c3QgYmUgdGhlIHByaW1hcnkga2V5IHR5cGUuCi0JCQlDTVBBdHRyaWJ1dGUga2V5QXR0cmlidXRlID0gY21wLmdldFByaW1LZXlGaWVsZCgpOwotCQkJRmllbGQga2V5RmllbGQgPSAoa2V5QXR0cmlidXRlID09IG51bGwpID8gbnVsbCA6IGtleUF0dHJpYnV0ZS5nZXRGaWVsZCgpOwotCQkJSmF2YUNsYXNzIHByaW1hcnlLZXkgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQkJaWYgKChrZXlGaWVsZCA9PSBudWxsKSB8fCAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzQXNzaWduYWJsZUZyb20oKEphdmFIZWxwZXJzKWtleUZpZWxkLmdldEVUeXBlKCksIHByaW1hcnlLZXkpKSB7Ci0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHsga2V5QXR0cmlidXRlLmdldE5hbWUoKSwgcHJpbWFyeUtleS5nZXROYW1lKCl9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjIwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwga2V5RmllbGQsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgZXhpc3RzIG9uIHRoZSBiZWFuLgotCSAqLwotCXB1YmxpYyB2b2lkIHZlcmlmeUZpZWxkRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKCFoYXNDb250YWluZXJNYW5hZ2VkRmllbGQoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDMyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCV9jb250YWluZXJNYW5hZ2VkRmllbGRzID0gbG9hZENvbnRhaW5lck1hbmFnZWRGaWVsZHModmMsIChFbnRlcnByaXNlQmVhbil0YXJnZXRQYXJlbnQsIChKYXZhQ2xhc3MpdGFyZ2V0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEtleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOGI2YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGVudGl0eSBiZWFuIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqCi0gKiBBbGwgOS4yLlggc2VjdGlvbnMgZGVzY3JpYmUgQk1QIHJlcXVpcmVtZW50cy4gKEFuZCB0aGUgYnVsayBvZiB0aG9zZQotICogYXJlIGltcGxlbWVudGVkIGluIFZhbGlkYXRlS2V5Q2xhc3MuKQotICogSWYgYSBDTVAgcmVxdWlyZW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gdGhlc2UsIHRoZW4gdGhlIGRpZmZlcmVuY2VzIGFyZQotICogZG9jdW1lbnRlZCBpbiA5LjQuWCBzZWN0aW9ucy4KLSAqCi0gKiA5LjQuNyBwcmltYXJ5IGtleSB0eXBlCi0gKiAgIC0gVGhlIGNvbnRhaW5lciBtdXN0IGJlIGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gVGhlcmVmb3JlLCAKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSAKLSAqICAgICBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgaW4gdGhpcyBzdWJzZWN0aW9uLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgaW4gCi0gKiAgICAgU3Vic2VjdGlvbiA5LjIuOS4KLSAqCi0gKiAgICAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjbGFzcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZToKLSAqICAgICAgICAtIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBhIHNpbmdsZSBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuCi0gKiAgICAgICAgLSBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcy4KLSAqICAgICBUaGUgc2Vjb25kIG1ldGhvZCBpcyBuZWNlc3NhcnkgZm9yIGltcGxlbWVudGluZyBjb21wb3VuZCBrZXlzLCBhbmQgdGhlIGZpcnN0IG1ldGhvZCBpcyBjb252ZW5pZW50IGZvcgotICogICAgIHNpbmdsZS1maWVsZCBrZXlzLiBXaXRob3V0IHRoZSBmaXJzdCBtZXRob2QsIHNpbXBsZSB0eXBlcyBzdWNoIGFzIFN0cmluZyB3b3VsZCBoYXZlIHRvIGJlIHdyYXBwZWQgaW4gYQotICogICAgIHVzZXItZGVmaW5lZCBjbGFzcy4KLSAqIAotICogICAgIDkuNC43LjEgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBCZWFuIFByb3ZpZGVyIHVzZXMgdGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHNwZWNpZnkgdGhlCi0gKiAgICAgY29udGFpbmVyLW1hbmFnZWQgZmllbGQgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkga2V5LiBUaGUgZmllbGQncyB0eXBlIG11c3QgYmUKLSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLSAqCi0gKiAgICAgOS40LjcuMiBQcmltYXJ5IGtleSB0aGF0IG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0gKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0gKiAgICAgVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHRoZSBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotICouLi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQ01QS2V5IGV4dGVuZHMgQVZhbGlkYXRlS2V5Q2xhc3MgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgU2V0IF9iZWFuRmllbGROYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNTR0lEID0gIi5lYiI7IC8vIEluIG1lc3NhZ2VzLCB0byBpZGVudGlmeSB3aGljaCBtZXNzYWdlIHZlcnNpb24gYmVsb25ncyB0byB0aGUgQk1QIGJlYW4gY2xhc3MsIHRoaXMgaWQgaXMgdXNlZC4gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFQgPSBNU1NHSUQgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBub24tbWV0aG9kLCBub24tZmllbGQgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVYVCA9IE1TU0dJRCArIE9OX0JBU0UgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgdHlwZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVhUID0gTVNTR0lEICsgT05fVEhJUyArIFNQRUM7IC8vIEV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIGEgbWV0aG9kL2ZpZWxkIG1lc3NhZ2Ugd2hlbiB0aGUgbWV0aG9kL2ZpZWxkIGlzIGltcGxlbWVudGVkIG9uIHRoZSBjdXJyZW50IHR5cGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfQ01QX0tFWUNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9DTVBfQkVBTkNMQVNTfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7Ci0JCi0Jc3RhdGljIHsKLQkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAxLCBuZXcgU3RyaW5nW117Q0hLSjIwMDErRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE5LCBuZXcgU3RyaW5nW117Q0hLSjIwMTkrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIwLCBuZXcgU3RyaW5nW117Q0hLSjIwMjArRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyMSwgbmV3IFN0cmluZ1tde0NIS0oyMDIxK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjIwNSwgbmV3IFN0cmluZ1tde0NIS0oyMjA1K0JFWFQsIENIS0oyMjA1K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMjA2LCBuZXcgU3RyaW5nW117Q0hLSjIyMDYrQkVYVCwgQ0hLSjIyMDYrTUVYVH0pOyAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIGlkIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbWV0aG9kIGlzIGluaGVyaXRlZCBvciBub3QKLQkJCi0vL0FWYWxpZGF0ZUVKQiBtZXRob2Qgbm90IHVzZWQJCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLS8vQVZhbGlkYXRlRUpCIG1ldGhvZCBub3QgdXNlZAkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotLy9BVmFsaWRhdGVFSkIgbWV0aG9kIG5vdCB1c2VkCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI4MjksIG5ldyBTdHJpbmdbXXtDSEtKMjgyOSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7Ci0JCV9iZWFuRmllbGROYW1lcy5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjbGF6eikgewotCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpcGFyZW50OwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQcmltaXRpdmVQcmltYXJ5S2V5KGNtcCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyBkbyBub3QgdmFsaWRhdGUgYSBwcmltaXRpdmUgcHJpbWFyeSBrZXkKLQkJfQotCQkKLQkJcmV0dXJuIGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQkvKgotCSAqIDkuNC43LjEgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotCSAqICAgICBUaGUgQmVhbiBQcm92aWRlciB1c2VzIHRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBzcGVjaWZ5IHRoZQotCSAqICAgICBjb250YWluZXItbWFuYWdlZCBmaWVsZCBvZiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb250YWlucyB0aGUgcHJpbWFyeSBrZXkuIFRoZSBmaWVsZCdzIHR5cGUgbXVzdCBiZQotCSAqICAgICB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQkgKgotCSAqIDkuNC43LjIgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcyBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLQkgKiAgICAgVGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycy4KLQkgKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgIFRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiB0aGUgY29udGFpbmVyLW1hbmFnZWQKLQkgKiAgICAgZmllbGRzLiAoVGhpcyBhbGxvd3MgdGhlIGNvbnRhaW5lciB0byBleHRyYWN0IHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgZnJvbSBhbiBpbnN0YW5jZSdzIGNvbnRhaW5lci1tYW5hZ2VkCi0JICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkRmllbGROYW1lTGlzdChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewotCQkvLyBCdWlsZCB1cCB0aGUgbGlzdCBvZiBmaWVsZCBuYW1lcyB0byBiZSB1c2VkIGluIHRoZSBmaWVsZCB2YWxpZGF0aW9uLgotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCWlmIChjbXAgPT0gbnVsbCkgewotCQkJLy8gTGV0IHRoZSBjbGFzcyB2YWxpZGF0aW9uIHRocm93IHRoZSBleGNlcHRpb24KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzUHJpbWl0aXZlUHJpbWFyeUtleShjbXApKSB7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBudWxsOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIFRoZXNlIGFyZSBkaWZmZXJlbnQgZmllbGRzIHRoYW4gdGhlIG9uZXMgdmFsaWRhdGVkIGJ5IHRoaXMKLQkJCQkJLy8gdmFsSW1wbCBjbGFzcywgc28gZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBkdXBsaWNhdGUgcmVmbGVjdGlvbgotCQkJCQkvLyB3YXJuaW5ncyBsb2dnZWQgYWdhaW5zdCB0aGUgc2FtZSBvYmplY3QuCi0JCQkJCVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZShhdHRyaWJ1dGUuZ2V0VHlwZSgpKTsKLQkJCQkJX2JlYW5GaWVsZE5hbWVzLmFkZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vVE9ETyAoRGFuKSBDaGFuZ2UgdG8gdXNlIHRoZSBhdHRyaWJ1dGUgZGlyZWN0bHkgYW5kIG5vdCB0aGUgZmllbGQuCi0JCQkJCXJlZmxlY3Rpb25XYXJuaW5nKHZjLCBiZWFuLCBjbGF6eiAsIGF0dHJpYnV0ZS5nZXRGaWVsZCgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWN0dWFsbHkgZG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKgotCSAqIDkuNC43LjIgUHJpbWFyeSBrZXkgdGhhdCBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcyBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MKLQkgKiAgICAgVGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQgbXVzdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycy4KLQkgKiAgICAgQWxsIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogICAgIFRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiB0aGUgY29udGFpbmVyLW1hbmFnZWQKLQkgKiAgICAgZmllbGRzLiAoVGhpcyBhbGxvd3MgdGhlIGNvbnRhaW5lciB0byBleHRyYWN0IHRoZSBwcmltYXJ5IGtleSBmaWVsZHMgZnJvbSBhbiBpbnN0YW5jZSdzIGNvbnRhaW5lci1tYW5hZ2VkCi0JICogICAgIGZpZWxkcywgYW5kIHZpY2UgdmVyc2EuKQotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBBbGwgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMoZmllbGQpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyMjA1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgY2xhenosIGZpZWxkLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQkvLyBUaGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgdGhlIGNvbnRhaW5lci1tYW5hZ2VkCi0JCS8vIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotCQkvLyBmaWVsZHMsIGFuZCB2aWNlIHZlcnNhLikKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBpZiBjbXAgaXMgbnVsbCwgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBieSB2YWxpZGF0ZUZpZWxkcygpLAotCQkvLyBhbmQgdmFsaWRhdGVGaWVsZHMoKSB3b24ndCBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZSBiZWFuIGlzIG51bGwuCi0KLQkJaWYgKCFfYmVhbkZpZWxkTmFtZXMuY29udGFpbnMoZmllbGQuZ2V0TmFtZSgpKSkgewotCQkJSmF2YUNsYXNzIGVqYkNsYXNzID0gY21wLmdldEVqYkNsYXNzKCk7Ci0JCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGUoZWpiQ2xhc3MpOwotCQkJU3RyaW5nW10gbXNnUGFybSA9IHsgY21wLmdldE5hbWUoKSwgY21wLmdldEVqYkNsYXNzKCkuZ2V0TmFtZSgpfTsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIyMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBjbGF6eiwgZmllbGQsIG1zZ1Bhcm0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy8gc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJLy9Ob3RoaW5nIHRvIGRvLgotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwotCi0JCWlmIChlamJNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkvLyBUaGVzZSBib29sZWFucyBhcmUgdXNlZCBpbiB0aGUgdmFsaWRhdGVNZXRob2RFeGlzdHMoKSBjaGVja3MuCi0JCQloYXNBQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhlamJNZXRob2QpICYmIChlamJNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApKSB7Ci0JCQkJaGFzRGVmYXVsdENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA5LjQuNy4yIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzCi0JICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0JICogICAgIEFsbCBmaWVsZHMgaW4gdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqICAgICBUaGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgdGhlIGNvbnRhaW5lci1tYW5hZ2VkCi0JICogICAgIGZpZWxkcy4gKFRoaXMgYWxsb3dzIHRoZSBjb250YWluZXIgdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZyb20gYW4gaW5zdGFuY2UncyBjb250YWluZXItbWFuYWdlZAotCSAqICAgICBmaWVsZHMsIGFuZCB2aWNlIHZlcnNhLikKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJLy8gVGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljCi0JCWlmICghY2xhenouaXNQdWJsaWMoKSkgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDIwLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlidWlsZEZpZWxkTmFtZUxpc3QodmMsIGJlYW4sIGNsYXp6KTsKLQotCQkvLyBEb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgZm9yIGNtcCBrZXkgYXR0cmlidXRlcyBpZiBpdCdzIG5vdCBhIHZhbGlkIHByaW0ga2V5IGZpZWxkLgotCQkvLyBwcmltYXJ5IGtleSBtdXN0IG1hcCB0byBhdCBsZWFzdCBvbmUgZmllbGQgb24gdGhlIGJlYW4gCi0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKLQkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS51c2VzVW5rbm93blByaW1hcnlLZXkoY21wKSkgewotCQkJLy8gcHJpbWFyeSBrZXkgbXVzdCBtYXAgdG8gYXQgbGVhc3Qgb25lIGZpZWxkIG9uIHRoZSBiZWFuIAotCQkJLy8gQnV0IGlmIGl0J3MgYW4gdW5rbm93biBrZXksIHRoZXJlJ3Mgbm8gcG9pbnQgY2hlY2tpbmcgamF2YS5sYW5nLk9iamVjdAotCQkJTGlzdCBwcmltS2V5RmllbGRzID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCWlmICgocHJpbUtleUZpZWxkcyA9PSBudWxsKSB8fCAocHJpbUtleUZpZWxkcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlKYXZhQ2xhc3MgcHJpbWFyeUtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7IC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgTU9GSGVscGVyLmlzVmFsaWRUeXBlKHByaW1hcnlLZXkpLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGNhbGxlZCBpbiB0aGUgdmFsaWRhdGVEZXBsb3ltZW50RGVzY3JpcHRvciBtZXRob2QKLQkJCQlTdHJpbmcgYmVhbk5hbWUgPSAoY21wLmdldE5hbWUoKSA9PSBudWxsKSA/ICJudWxsIiA6IGNtcC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODI5LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIHByaW1hcnlLZXksIG5ldyBTdHJpbmdbXSB7IHByaW1hcnlLZXkuZ2V0TmFtZSgpLCBiZWFuTmFtZSB9LCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqICA5LjQuNy4yIFByaW1hcnkga2V5IHRoYXQgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMgaW4gdGhlIGVudGl0eSBiZWFuIGNsYXNzCi0JICogICAgIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlzdXBlci52YWxpZGF0ZU1ldGhvZEV4aXN0cyh2YywgYmVhbiwgY2xhenopOwotCi0JCS8vIElmIHRoZSBjbGFzcyBoYXMgbm8gY29uc3RydWN0b3JzIGRlZmluZWQsIEphdmEgaW5zZXJ0cyBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZ3VtZW50cy4KLQkJLy8gQnV0IGlmIHRoZSBjbGFzcyBoYXMgYXQgbGVhc3Qgb25lIGNvbnN0cnVjdG9yIGRlZmluZWQsIEphdmEgd2lsbCBub3QgaW5zZXJ0IGEgY29uc3RydWN0b3IuCi0JCWlmICghaGFzRGVmYXVsdENvbnN0cnVjdG9yICYmIGhhc0FDb25zdHJ1Y3RvcikgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDIxLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNBQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJaGFzRGVmYXVsdENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QUmVtb3RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBSZW1vdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1ZWQ5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBSZW1vdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIHJlbW90ZSBpbnRlcmZhY2Ugb2YgYSBDTVAgYmVhbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlQ01QUmVtb3RlIGV4dGVuZHMgQVZhbGlkYXRlUmVtb3RlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuZXIiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9SRU1PVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG5ldyBPYmplY3RbXXtJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX0NNUF9CRUFOQ0xBU1N9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTIsIG5ldyBTdHJpbmdbXXtDSEtKMjAxMitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE3LCBuZXcgU3RyaW5nW117Q0hLSjIwMTcrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIzLCBuZXcgU3RyaW5nW117Q0hLSjIwMjMrQkVYVCwgQ0hLSjIwMjMrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNSwgbmV3IFN0cmluZ1tde0NIS0oyMTA1ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNSwgbmV3IFN0cmluZ1tde0NIS0oyNDE1K0JFWFQsIENIS0oyNDE1K01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25CZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGMyOTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBTZXNzaW9uIGhvbWUgaW50ZXJmYWNlIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotICouLi4KLSAqIFRoZSBob21lIGludGVyZmFjZSBvZiBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gbXVzdCBoYXZlIG9uZSBjcmVhdGUgCi0gKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0gKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgc2luZ2xlIGVqYkNyZWF0ZSBtZXRob2QgdGhhdCB0YWtlcyAKLSAqIG5vIGFyZ3VtZW50cy4KLSAqLi4uCi0gKgotICogNi4xMC4yIFNlc3Npb24gYmVhbiBjbGFzcwotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3Igc2Vzc2lvbiBiZWFuIGNsYXNzOgotICogCQktIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5TZXNzaW9uQmVhbiAKLSAqICAgICAgICBpbnRlcmZhY2UuCi0gKiAJCS0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgCi0gKiAgICAgICAgYmUgYWJzdHJhY3QuCi0gKiAJCS0gVGhlIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIHBhcmFtZXRlcnMuIFRoZSAKLSAqICAgICAgICBDb250YWluZXIgdXNlcyB0aGlzIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4KLSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBub3QgZGVmaW5lIHRoZSBmaW5hbGl6ZSgpIG1ldGhvZC4KLSAqIAkJLSBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIHNlc3Npb24gYmVhbidzIAotICogICAgICAgIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgYW5kIHRoZSBlamJDcmVhdGUgbWV0aG9kcy4KLSAqIAkJLSBJZiB0aGUgY2xhc3MgaXMgYSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4sIGl0IG1heSBvcHRpb25hbGx5IGltcGxlbWVudCAKLSAqICAgICAgICB0aGUgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotICogCQktIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIElmIHRoZSAKLSAqICAgICAgICBzZXNzaW9uIGJlYW4gaGFzIHN1cGVyY2xhc3NlcywgdGhlbiB0aGUgYnVzaW5lc3MgbWV0aG9kcywgdGhlIGVqYkNyZWF0ZSBtZXRob2RzLCAKLSAqICAgICAgICB0aGUgbWV0aG9kcyBvZiB0aGUgU2Vzc2lvbkJlYW4gaW50ZXJmYWNlLCBhbmQgdGhlIG1ldGhvZHMgb2YgdGhlIG9wdGlvbmFsIAotICogICAgICAgIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlIG1heSBiZSBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MsIAotICogICAgICAgIG9yIGluIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotICogCQktIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgaXMgYWxsb3dlZCB0byBpbXBsZW1lbnQgb3RoZXIgbWV0aG9kcyAoZm9yIGV4YW1wbGUgCi0gKiAgICAgICAgaGVscGVyIG1ldGhvZHMgaW52b2tlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidXNpbmVzcyBtZXRob2RzKSBpbiBhZGRpdGlvbiB0byAKLSAqICAgICAgICB0aGUgbWV0aG9kcyByZXF1aXJlZCBieSB0aGUgRUpCIHNwZWNpZmljYXRpb24uCi0gKgotICoJCVs0XSBJZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGRvZXMgaW1wbGVtZW50IHRoZSByZW1vdGUgaW50ZXJmYWNlLCBjYXJlIG11c3QgCi0gKiAgICAgICAgICBiZSB0YWtlbiB0byBhdm9pZCBwYXNzaW5nIG9mIHRoaXMgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0LiBUaGlzIAotICogICAgICAgICAgcG90ZW50aWFsIGVycm9yIGNhbiBiZSBhdm9pZGVkIGJ5IGNob29zaW5nIG5vdCB0byBpbXBsZW1lbnQgdGhlIHJlbW90ZSAKLSAqICAgICAgICAgIGludGVyZmFjZSBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLgotICoKLSAqIDYuMTAuMyBlamJDcmVhdGUgbWV0aG9kcwotICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdAotICogZm9sbG93IHRoZXNlIHJ1bGVzOgotICogCQktIFRoZSBtZXRob2QgbmFtZSBtdXN0IGJlIGVqYkNyZWF0ZS4KLSAqIAkJLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogCQktIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotICogCQktIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHZvaWQuCi0gKiAJCS0gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0gKiAJCS0gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gZXhjZXB0aW9ucywgcG9zc2libHkgCi0gKiAgICAgICAgaW5jbHVkaW5nIHRoZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLiAKLSAqIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJDcmVhdGUgbWV0aG9kIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0gKiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgCi0gKiBjb21wbGlhbnQgZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gCi0gKiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICoKLSAqIDYuMTAuNCBCdXNpbmVzcyBtZXRob2RzCi0gKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLSAqIAkJLSBUaGUgbWV0aG9kIG5hbWVzIGNhbiBiZSBhcmJpdHJhcnksIGJ1dCB0aGV5IG11c3Qgbm90IHN0YXJ0IHdpdGggImVqYiIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIGNhbGxiYWNrIG1ldGhvZHMgdXNlZCBieSB0aGUgRUpCIGFyY2hpdGVjdHVyZS4KLSAqIAkJLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotICogCQktIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotICogCQktIFRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlIHR5cGVzIGZvciBhIG1ldGhvZCBtdXN0IGJlIGxlZ2FsIHR5cGVzIGZvciBSTUkvSUlPUC4KLSAqIAkJLSBUaGUgdGhyb3dzIGNsYXVzZSBtYXkgZGVmaW5lIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBleGNlcHRpb25zLgotICogQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAKLSAqIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQKLSAqIGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBSdW50aW1lRXhjZXB0aW9uIHRvCi0gKiBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTZXNzaW9uQmVhbiBleHRlbmRzIEFWYWxpZGF0ZUJlYW4gaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRDb25zdHJ1Y3RvciA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNBQ29uc3RydWN0b3IgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9IGZhbHNlOwotCXByaXZhdGUgU2V0IGNyZWF0ZU1ldGhvZHMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2IiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fQkVBTkNMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEV9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAzSSwgbmV3IFN0cmluZ1tde0NIS0oyMDAzSSArIFNQRUN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDAzRSwgbmV3IFN0cmluZ1tde0NIS0oyMDAzRSArIFNQRUN9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDYsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNitFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDA3LCBuZXcgU3RyaW5nW117Q0hLSjIwMDcrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAwOCwgbmV3IFN0cmluZ1tde0NIS0oyMDA4K0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMywgbmV3IFN0cmluZ1tde0NIS0oyMDEzK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTQsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNCtFWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDE1LCBuZXcgU3RyaW5nW117Q0hLSjIwMTUrRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDIyLCBuZXcgU3RyaW5nW117Q0hLSjIwMjIrRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyNSwgbmV3IFN0cmluZ1tde0NIS0oyMDI1K0JFWFQsIENIS0oyMDI1K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MCwgbmV3IFN0cmluZ1tde0NIS0oyMDQwK0VYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwMywgbmV3IFN0cmluZ1tde0NIS0oyMTAzICsgU1BFQ30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIyMDAsIG5ldyBTdHJpbmdbXXtDSEtKMjIwMCtPTl9CQVNFK1NQRUMsIENIS0oyMjAwK09OX1RISVMrU1BFQ30pOyAvLyBDSEtKMjIwMCBpcyBhIHNwZWNpYWwgY2FzZS4gSXQncyBzaGFyZWQgYnkgYWxsIGJlYW4gdHlwZXMuCi0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAwX2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDAwX2J1cytCRVhULCBDSEtKMjQwMF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDBfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDBfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDAwX2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMSwgbmV3IFN0cmluZ1tde0NIS0oyNDAxK0JFWFQsIENIS0oyNDAxK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA4X2J1cywgbmV3IFN0cmluZ1tde0NIS0oyNDA4X2J1cytCRVhULCBDSEtKMjQwOF9idXMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDhfZWpiQ3JlYXRlLCBuZXcgU3RyaW5nW117Q0hLSjI0MDhfZWpiQ3JlYXRlK0JFWFQsIENIS0oyNDA4X2VqYkNyZWF0ZStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwOV9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQwOV9idXMrQkVYVCwgQ0hLSjI0MDlfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDA5X2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDA5X2VqYkNyZWF0ZStCRVhULCBDSEtKMjQwOV9lamJDcmVhdGUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMF9idXMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMF9idXMrQkVYVCwgQ0hLSjI0MTBfYnVzK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEwX2VqYkNyZWF0ZSwgbmV3IFN0cmluZ1tde0NIS0oyNDEwX2VqYkNyZWF0ZStCRVhULCBDSEtKMjQxMF9lamJDcmVhdGUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTEsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMStCRVhULCBDSEtKMjQxMStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxMiwgbmV3IFN0cmluZ1tde0NIS0oyNDEyK0JFWFQsIENIS0oyNDEyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEzLCBuZXcgU3RyaW5nW117Q0hLSjI0MTMrQkVYVCwgQ0hLSjI0MTMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTQsIG5ldyBTdHJpbmdbXXtDSEtKMjQxNCtCRVhULCBDSEtKMjQxNCtNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDIwLCBuZXcgU3RyaW5nW117Q0hLSjI0MjArQkVYVCwgQ0hLSjI0MjArTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMiwgbmV3IFN0cmluZ1tde0NIS0oyNDMyK0JFWFQsIENIS0oyNDMyK01FWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwNDEsIG5ldyBTdHJpbmdbXXtDSEtKMjA0MX0pOyAvLyBzcGVjaWFsIGNhc2UuIFNoYXJlZCBieSBhbGwgdHlwZXMuCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQzMywgbmV3IFN0cmluZ1tde0NIS0oyNDMzfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQ1NiwgbmV3IFN0cmluZ1tde0NIS0oyNDU2K09OX0JBU0UsIENIS0oyNDU2K09OX1RISVN9KTsgLy8gc3BlY2lhbCBjYXNlIChzaGFyZWQgYnkgYWxsIHR5cGVzKQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJY3JlYXRlTWV0aG9kcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBNYXAgZ2V0TWVzc2FnZUlkcygpIHsKLQkJcmV0dXJuIE1FU1NBR0VfSURTOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0W10gZ2V0RGVwZW5kc09uKCkgewotCQlyZXR1cm4gREVQRU5EU19PTjsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0ZVNlc3Npb25CZWFuKCkgewotCQljcmVhdGVNZXRob2RzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQkVBTjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ3JlYXRlTWV0aG9kKCkgewotCQlpZiAoaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9PSB0cnVlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChjcmVhdGVNZXRob2RzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluY3JlbWVudENyZWF0ZU1ldGhvZENvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApICYmICghaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCkpIHsKLQkJCWhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYWRkIGl0IHRvIHRoZSBsaXN0LCBmb3IgcmVwb3J0aW5nIGV4dHJhbmVvdXMgY3JlYXRlIG1ldGhvZHMsIGZvciBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucyAoc2VjdGlvbiA2LjgpCi0JCQljcmVhdGVNZXRob2RzLmFkZChtZXRob2QpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGcmFtZXdvcmtNZXRob2QoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHN1cGVyLmlzRnJhbWV3b3JrTWV0aG9kKG5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGNoZWNrIGZvciBzZXNzaW9uLXNwZWNpZmljIG1ldGhvZHMKLQkJaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX1NFVFNFU1NJT05DT05URVhUKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMgYW5kIGJ1c2luZXNzIG1ldGhvZHMgZm9sbG93IHRoZSBFSkIgMS4xIHNwZWMuCi0JICoKLQkgKgotCSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotCSAqLi4uCi0JICogVGhlIGhvbWUgaW50ZXJmYWNlIG9mIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbiBtdXN0IGhhdmUgb25lIGNyZWF0ZSAKLQkgKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkgKiBpbnRlcmZhY2UuIFRoZXJlIGNhbiBiZSBubyBvdGhlciBjcmVhdGUgbWV0aG9kcyBpbiB0aGUgaG9tZSBpbnRlcmZhY2UuIAotCSAqIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBkZWZpbmUgYSBzaW5nbGUgZWpiQ3JlYXRlIG1ldGhvZCB0aGF0IHRha2VzIAotCSAqIG5vIGFyZ3VtZW50cy4KLQkgKi4uLgotCSAqCi0JICogNi4xMC4yIFNlc3Npb24gYmVhbiBjbGFzcwotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHNlc3Npb24gYmVhbiBjbGFzczoKLQkgKiAuLi4KLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIHBhcmFtZXRlcnMuIFRoZSAKLQkgKiAgICAgICAgQ29udGFpbmVyIHVzZXMgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JICogCQktIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotCSAqIC4uLgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgYW5kIHRoZSBlamJDcmVhdGUgbWV0aG9kcy4KLQkgKiAuLi4KLQkgKiAJCS0gVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBpcyBhbGxvd2VkIHRvIGltcGxlbWVudCBvdGhlciBtZXRob2RzIChmb3IgZXhhbXBsZSAKLQkgKiAgICAgICAgaGVscGVyIG1ldGhvZHMgaW52b2tlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidXNpbmVzcyBtZXRob2RzKSBpbiBhZGRpdGlvbiB0byAKLQkgKiAgICAgICAgdGhlIG1ldGhvZHMgcmVxdWlyZWQgYnkgdGhlIEVKQiBzcGVjaWZpY2F0aW9uLgotCSAqIC4uLgotCSAqCi0JICogNi4xMC4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdAotCSAqIGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAJCS0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkgKiAJCS0gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JICogCQktIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMsIHBvc3NpYmx5IAotCSAqICAgICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCSAqIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJDcmVhdGUgbWV0aG9kIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JICogdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIAotCSAqIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgUnVudGltZUV4Y2VwdGlvbiAKLQkgKiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqCi0JICogNi4xMC40IEJ1c2luZXNzIG1ldGhvZHMKLQkgKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JICogCQktIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogCQktIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqIAkJLSBUaGUgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBmb3IgYSBtZXRob2QgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JICogCQktIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuCi0JICogQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAKLQkgKiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50Ci0JICogZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkgKiBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKLQkJLy8gc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7Ci0KLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQlTdHJpbmcgbmFtZSA9IGVqYk1ldGhvZC5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFscyhJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUpKSB7Ci0JCQl2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfRklOQUxJWkUpKSB7Ci0JCQl2YWxpZGF0ZUZpbmFsaXplTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCQllbHNlIGlmIChlamJNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQl2YWxpZGF0ZUNvbnN0cnVjdG9yKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQkJfQotCQllbHNlIGlmIChpc0J1c2luZXNzTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKSkgewotCQkJdmFsaWRhdGVCdXNpbmVzc01ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQkJZWxzZSBpZiAoIWlzRnJhbWV3b3JrTWV0aG9kKG5hbWUpKSB7Ci0JCQl2YWxpZGF0ZUhlbHBlck1ldGhvZCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCX0KLQotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7Ci0KLQkJaWYgKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0VKQkNSRUFURS5lcXVhbHMoZWpiTWV0aG9kLmdldE5hbWUoKSkpCi0JCQlpbmNyZW1lbnRDcmVhdGVNZXRob2RDb3VudCh2YywgYmVhbiwgY2xhenosIGVqYk1ldGhvZCk7Ci0JCWVsc2UgaWYgKGVqYk1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCi0JCQl2YWxpZGF0ZUNvbnN0cnVjdG9yKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSBzdXBwbGllZCBidXNpbmVzcyBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjIHJ1bGVzLgotCSAqCi0JICogNi4xMC40IEJ1c2luZXNzIG1ldGhvZHMKLQkgKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBkZWZpbmUgemVybyBvciBtb3JlIGJ1c2luZXNzIG1ldGhvZHMgd2hvc2Ugc2lnbmF0dXJlcyBtdXN0IGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lcyBjYW4gYmUgYXJiaXRyYXJ5LCBidXQgdGhleSBtdXN0IG5vdCBzdGFydCB3aXRoICJlamIiIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBjYWxsYmFjayBtZXRob2RzIHVzZWQgYnkgdGhlIEVKQiBhcmNoaXRlY3R1cmUuCi0JICogCQktIFRoZSBidXNpbmVzcyBtZXRob2QgbXVzdCBiZSBkZWNsYXJlZCBhcyBwdWJsaWMuCi0JICogCQktIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCSAqIAkJLSBUaGUgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSB0eXBlcyBmb3IgYSBtZXRob2QgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JICogCQktIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuCi0JICogQ29tcGF0aWJpbGl0eSBOb3RlOiBFSkIgMS4wIGFsbG93ZWQgdGhlIGJ1c2luZXNzIG1ldGhvZHMgdG8gdGhyb3cgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAKLQkgKiB0byBpbmRpY2F0ZSBhIG5vbi1hcHBsaWNhdGlvbiBleGNlcHRpb24uIFRoaXMgcHJhY3RpY2UgaXMgZGVwcmVjYXRlZCBpbiBFSkIgMS4xIC0tIGFuIEVKQiAxLjEgY29tcGxpYW50Ci0JICogZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkgKiBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCi0JCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOyAvLyBjaGVjayBtZXRob2QgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICdlamInCQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JCXZhbGlkYXRlTGVnYWxSTUlNZXRob2RXaXRob3V0RXhjZXB0aW9ucyh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gVGhlIHJlc3Qgb2YgdGhlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGluIHRoZSB2YWxpZGF0ZU1ldGhvZCBtZXRob2QuCi0JCXZhbGlkYXRlQnVzaW5lc3NNb2RpZmllcnNBbmRFeGNlcHRpb25zKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGRlZmluaXRpb24gZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqCi0JICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotCSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLQkgKiBWZXJzaW9uOiAxLjEKLQkgKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLQkgKiBSZWxlYXNlOiAxMi8xNy85OQotCSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLQkgKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0JICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQkgKgotCSAqIDYuMTAuMiBTZXNzaW9uIGJlYW4gY2xhc3MKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBzZXNzaW9uIGJlYW4gY2xhc3M6Ci0JICogCQktIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgdGhlIGphdmF4LmVqYi5TZXNzaW9uQmVhbiAKLQkgKiAgICAgICAgaW50ZXJmYWNlLgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGFzIHB1YmxpYywgbXVzdCBub3QgYmUgZmluYWwsIGFuZCBtdXN0IG5vdCAKLQkgKiAgICAgICAgYmUgYWJzdHJhY3QuCi0JICogCQktIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgc2Vzc2lvbiBiZWFuJ3MgCi0JICogICAgICAgIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLQkgKiAJCS0gSWYgdGhlIGNsYXNzIGlzIGEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuLCBpdCBtYXkgb3B0aW9uYWxseSBpbXBsZW1lbnQgCi0JICogICAgICAgIHRoZSBqYXZheC5lamIuU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UuCi0JICogCQktIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIElmIHRoZSAKLQkgKiAgICAgICAgc2Vzc2lvbiBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZW4gdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSBlamJDcmVhdGUgbWV0aG9kcywgCi0JICogICAgICAgIHRoZSBtZXRob2RzIG9mIHRoZSBTZXNzaW9uQmVhbiBpbnRlcmZhY2UsIGFuZCB0aGUgbWV0aG9kcyBvZiB0aGUgb3B0aW9uYWwgCi0JICogICAgICAgIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlIG1heSBiZSBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MsIAotCSAqICAgICAgICBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkgKgotCSAqCQlbNF0gSWYgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBkb2VzIGltcGxlbWVudCB0aGUgcmVtb3RlIGludGVyZmFjZSwgY2FyZSBtdXN0IAotCSAqICAgICAgICAgIGJlIHRha2VuIHRvIGF2b2lkIHBhc3Npbmcgb2YgdGhpcyBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQuIFRoaXMgCi0JICogICAgICAgICAgcG90ZW50aWFsIGVycm9yIGNhbiBiZSBhdm9pZGVkIGJ5IGNob29zaW5nIG5vdCB0byBpbXBsZW1lbnQgdGhlIHJlbW90ZSAKLQkgKiAgICAgICAgICBpbnRlcmZhY2UgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwotCQkvLyBzdXBlci52YWxpZGF0ZUNsYXNzKCkgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBjaGVja3M6Ci0JCS8vIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuU2Vzc2lvbkJlYW4gCi0JCS8vICAgICAgICBpbnRlcmZhY2UuCi0JCS8vICAgCS0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgCi0JCS8vICAgICAgICBiZSBhYnN0cmFjdC4KLQotCQkvLyBJZiB0aGUgY2xhc3MgaXMgYSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4sIGl0IG1heSBvcHRpb25hbGx5IGltcGxlbWVudCAKLQkJLy8gdGhlIGphdmF4LmVqYi5TZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQotCQlTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbiliZWFuOwotCQlib29sZWFuIGlzU3RhdGVsZXNzID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVsZXNzKGJlYW4pOwotCQlib29sZWFuIGlzQmVhbk1hbmFnZWRTdGF0ZWZ1bCA9IChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNCZWFuTWFuYWdlZFNlc3Npb24oc2Vzc2lvbikgJiYgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzU3RhdGVmdWwoc2Vzc2lvbikpOwotCi0JCWlmIChpc1N0YXRlbGVzcykgewotCQkJLyoKLQkJCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCQkJICouLi4KLQkJCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JCQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCQkJICouLi4KLQkJCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCQkJICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JCQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkJCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkJCSAqLi4uCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0UsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgYmVhbi5nZXRFamJDbGFzcygpLCB0aGlzKTsKLQkJCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgYmVhbkNsYXNzTmFtZSA9IChiZWFuLmdldEVqYkNsYXNzKCkgPT0gbnVsbCkgPyBJRUpCVmFsaWRhdG9yQ29uc3RhbnRzLk5VTExfQkVBTl9DTEFTUyA6IGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRKYXZhTmFtZSgpOwotCQkJCVN0cmluZyBlQ2xhc3MgPSAoZS5nZXRKYXZhQ2xhc3MoKSA9PSBudWxsKSA/IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTlNZTkNIUk9OSVpBVElPTiA6IGUuZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKTsgLy8gU2luY2Ugb25seSBnZXRUeXBlIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIHRoaXMgY2Fubm90IGhhdmUgYmVlbiB0aHJvd24gYmVjYXVzZSBvZiB0aGUgYmVhbiBjbGFzcwotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGJlYW5DbGFzc05hbWUsIGVDbGFzcyB9OwotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjI0MzMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5XQVJOSU5HLCBiZWFuLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzQmVhbk1hbmFnZWRTdGF0ZWZ1bCkgewotCQkJLyoKLQkJCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQotCQkJICouLi4KLQkJCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JCQkgKiBpbXBsZW1lbnQgdGhlIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCQkJICouLi4KLQkJCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCQkJICogc3luY2hyb25pemF0aW9uIGNhbGwgYmFja3MgYmVjYXVzZSB0aGUgYmVhbiBpcyBpbiBjb250cm9sIG9mIHRoZSBjb21taXQgdGhlIGJlYW4gCi0JCQkgKiBrbm93cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQgYW5kIGl0IGtub3dzIHRoZSBvdXRjb21lIG9mIHRoZSAKLQkJCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkJCSAqLi4uCi0JCQkgKi8KLQkJCXRyeSB7Ci0JCQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKGJlYW4uZ2V0RWpiQ2xhc3MoKSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OLCBiZWFuKSkpIHsKLQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjAwM0ksIElFSkJWYWxpZGF0aW9uQ29udGV4dC5JTkZPLCBiZWFuLCBiZWFuLmdldEVqYkNsYXNzKCksIHRoaXMpOwotCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGJlYW4uZ2V0RWpiQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCksIGUuZ2V0SmF2YUNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyOTA3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbXNnUGFybSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCS8vIFRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbWF5IGhhdmUgc3VwZXJjbGFzc2VzIGFuZC9vciBzdXBlcmludGVyZmFjZXMuIElmIHRoZSAKLQkJLy8gc2Vzc2lvbiBiZWFuIGhhcyBzdXBlcmNsYXNzZXMsIHRoZW4gdGhlIGJ1c2luZXNzIG1ldGhvZHMsIHRoZSBlamJDcmVhdGUgbWV0aG9kcywgCi0JCS8vIHRoZSBtZXRob2RzIG9mIHRoZSBTZXNzaW9uQmVhbiBpbnRlcmZhY2UsIGFuZCB0aGUgbWV0aG9kcyBvZiB0aGUgb3B0aW9uYWwgCi0JCS8vIFNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlIG1heSBiZSBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MsIAotCQkvLyBvciBpbiBhbnkgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLQkJLy8gIC0gdGhpcyBpcyB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBFSkIgTU9GIG1vZGVsLiBXaGVuIGFza2VkIGlmIGEgSmF2YUNsYXNzIGhhcyBhIG1ldGhvZCwKLQkJLy8gICAgdGhlIG1vZGVsIGNoZWNrcyB0aGUgY2xhc3MnIHBhcmVudHMgdG9vLgotCi0JCS8vIFRoZSBjbGFzcyBtYXksIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8sIGltcGxlbWVudCB0aGUgc2Vzc2lvbiBiZWFuJ3MgCi0JCS8vIHJlbW90ZSBpbnRlcmZhY2UgWzRdIC4KLQkJLy8gWzRdIElmIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgZG9lcyBpbXBsZW1lbnQgdGhlIHJlbW90ZSBpbnRlcmZhY2UsIGNhcmUgbXVzdCAKLQkJLy8gYmUgdGFrZW4gdG8gYXZvaWQgcGFzc2luZyBvZiB0aGlzIGFzIGEgbWV0aG9kIGFyZ3VtZW50IG9yIHJlc3VsdC4gVGhpcyAKLQkJLy8gcG90ZW50aWFsIGVycm9yIGNhbiBiZSBhdm9pZGVkIGJ5IGNob29zaW5nIG5vdCB0byBpbXBsZW1lbnQgdGhlIHJlbW90ZSAKLQkJLy8gaW50ZXJmYWNlIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JCXZhbGlkYXRlQ2xhc3NfcmVtb3RlRGVwKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoYXQgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBkZWZpbml0aW9uIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlYy4KLQkgKgotCSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0JICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotCSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0JICoKLQkgKiA2LjEwLjIgU2Vzc2lvbiBiZWFuIGNsYXNzCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHJlcXVpcmVtZW50cyBmb3Igc2Vzc2lvbiBiZWFuIGNsYXNzOgotCSAqIAkJLSBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBqYXZheC5lamIuU2Vzc2lvbkJlYW4gCi0JICogICAgICAgIGludGVyZmFjZS4KLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBhcyBwdWJsaWMsIG11c3Qgbm90IGJlIGZpbmFsLCBhbmQgbXVzdCBub3QgCi0JICogICAgICAgIGJlIGFic3RyYWN0LgotCSAqIAkJLSBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIHNlc3Npb24gYmVhbidzIAotCSAqICAgICAgICByZW1vdGUgaW50ZXJmYWNlIFs0XSAuCi0JICogCQktIElmIHRoZSBjbGFzcyBpcyBhIHN0YXRlZnVsIHNlc3Npb24gYmVhbiwgaXQgbWF5IG9wdGlvbmFsbHkgaW1wbGVtZW50IAotCSAqICAgICAgICB0aGUgamF2YXguZWpiLlNlc3Npb25TeW5jaHJvbml6YXRpb24gaW50ZXJmYWNlLgotCSAqIAkJLSBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG1heSBoYXZlIHN1cGVyY2xhc3NlcyBhbmQvb3Igc3VwZXJpbnRlcmZhY2VzLiBJZiB0aGUgCi0JICogICAgICAgIHNlc3Npb24gYmVhbiBoYXMgc3VwZXJjbGFzc2VzLCB0aGVuIHRoZSBidXNpbmVzcyBtZXRob2RzLCB0aGUgZWpiQ3JlYXRlIG1ldGhvZHMsIAotCSAqICAgICAgICB0aGUgbWV0aG9kcyBvZiB0aGUgU2Vzc2lvbkJlYW4gaW50ZXJmYWNlLCBhbmQgdGhlIG1ldGhvZHMgb2YgdGhlIG9wdGlvbmFsIAotCSAqICAgICAgICBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZSBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLCAKLQkgKiAgICAgICAgb3IgaW4gYW55IG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICoKLQkgKgkJWzRdIElmIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgZG9lcyBpbXBsZW1lbnQgdGhlIHJlbW90ZSBpbnRlcmZhY2UsIGNhcmUgbXVzdCAKLQkgKiAgICAgICAgICBiZSB0YWtlbiB0byBhdm9pZCBwYXNzaW5nIG9mIHRoaXMgYXMgYSBtZXRob2QgYXJndW1lbnQgb3IgcmVzdWx0LiBUaGlzIAotCSAqICAgICAgICAgIHBvdGVudGlhbCBlcnJvciBjYW4gYmUgYXZvaWRlZCBieSBjaG9vc2luZyBub3QgdG8gaW1wbGVtZW50IHRoZSByZW1vdGUgCi0JICogICAgICAgICAgaW50ZXJmYWNlIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzc19yZW1vdGVEZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwotCQkvLyBUaGUgY2xhc3MgbWF5LCBidXQgaXMgbm90IHJlcXVpcmVkIHRvLCBpbXBsZW1lbnQgdGhlIHNlc3Npb24gYmVhbidzIAotCQkvLyByZW1vdGUgaW50ZXJmYWNlIFs0XSAuCi0JCS8vIFs0XSBJZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGRvZXMgaW1wbGVtZW50IHRoZSByZW1vdGUgaW50ZXJmYWNlLCBjYXJlIG11c3QgCi0JCS8vIGJlIHRha2VuIHRvIGF2b2lkIHBhc3Npbmcgb2YgdGhpcyBhcyBhIG1ldGhvZCBhcmd1bWVudCBvciByZXN1bHQuIFRoaXMgCi0JCS8vIHBvdGVudGlhbCBlcnJvciBjYW4gYmUgYXZvaWRlZCBieSBjaG9vc2luZyBub3QgdG8gaW1wbGVtZW50IHRoZSByZW1vdGUgCi0JCS8vIGludGVyZmFjZSBpbiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzLgotCQlKYXZhQ2xhc3MgcmVtb3RlID0gYmVhbi5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHJlbW90ZSk7Ci0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShjbGF6eiwgcmVtb3RlKSkgewotCQkJU3RyaW5nW10gbXNnUGFybSA9IHtjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCksIHJlbW90ZS5nZXRRdWFsaWZpZWROYW1lKCl9OwotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjA0MCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LklORk8sIGJlYW4sIGNsYXp6LCBtc2dQYXJtLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnN0cnVjdG9yKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaGFzQUNvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJaWYgKCFoYXNWYWxpZENvbnN0cnVjdG9yICYmIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpICYmIChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApKSB7Ci0JCQloYXNWYWxpZENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIHN1cHBsaWVkIGVqYkNyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjIHJ1bGVzLgotCSAqCi0JICogNi4xMC4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdAotCSAqIGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKiAJCS0gVGhlIG1ldGhvZCBuYW1lIG11c3QgYmUgZWpiQ3JlYXRlLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAJCS0gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkgKiAJCS0gVGhlIG1ldGhvZCBhcmd1bWVudHMgbXVzdCBiZSBsZWdhbCB0eXBlcyBmb3IgUk1JL0lJT1AuCi0JICogCQktIFRoZSB0aHJvd3MgY2xhdXNlIG1heSBkZWZpbmUgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMsIHBvc3NpYmx5IAotCSAqICAgICAgICBpbmNsdWRpbmcgdGhlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotCSAqIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBlamJDcmVhdGUgbWV0aG9kIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JICogdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIAotCSAqIGNvbXBsaWFudCBlbnRlcnByaXNlIGJlYW4gc2hvdWxkIHRocm93IHRoZSBqYXZheC5lamIuRUpCRXhjZXB0aW9uIG9yIGFub3RoZXIgUnVudGltZUV4Y2VwdGlvbiAKLQkgKiB0byBpbmRpY2F0ZSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9ucyB0byB0aGUgQ29udGFpbmVyIChzZWUgU2VjdGlvbiAxMi4yLjIpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQotCQkvLyBUaGUgbWV0aG9kIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IHRlc3RlZCB0aGF0IHRoZSBtZXRob2QgbmFtZSBpcyBlamJDcmVhdGUuCi0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVGhlIHJldHVybiB0eXBlIG11c3QgYmUgdm9pZC4KLQkJSmF2YUhlbHBlcnMgcGFybVR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSAoKHBhcm1UeXBlID09IG51bGwpID8gIiIgOiBwYXJtVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKCFyZXR1cm5UeXBlTmFtZS5lcXVhbHMoSVR5cGVDb25zdGFudHMuVk9JRCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBuZXcgU3RyaW5nW10ge2NsYXp6LmdldFF1YWxpZmllZE5hbWUoKX0sIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgYXJndW1lbnRzIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS9JSU9QLgotCQl2YWxpZGF0ZUxlZ2FsUk1JTWV0aG9kQXJndW1lbnRzKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQl2YWxpZGF0ZUVqYkNyZWF0ZU1vZGlmaWVyc0FuZEV4Y2VwdGlvbnModmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCi0JCXZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kX2hvbWVEZXAodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwotCX0KLQkKLQkvKioKLQkgKi4uLgotCSAqIDYuMTAuMiBTZXNzaW9uIGJlYW4gY2xhc3MKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciBzZXNzaW9uIGJlYW4gY2xhc3M6Ci0JICogLi4uCi0JICogCQktIFRoZSBjbGFzcyBtdXN0IG5vdCBkZWZpbmUgdGhlIGZpbmFsaXplKCkgbWV0aG9kLgotCSAqIC4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmluYWxpemVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBUaGlzIGlzIGEgd2FybmluZywgbm90IGFuIGVycm9yLCBiZWNhdXNlIEVKQiAxLjAgYWxsb3dlZCB0aGUgZmluYWxpemUoKSBtZXRob2QgdG8gYmUgY2FsbGVkLiBFSkIgMS4xIChzZWN0aW9uIDYuMTAuMikgc3BlY2lmaWNhbGx5IHByb2hpYml0cyBpdC4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotCSAqLi4uCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JICogbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICogNi4xMC4yIFNlc3Npb24gYmVhbiBjbGFzcwotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHNlc3Npb24gYmVhbiBjbGFzczoKLQkgKiAuLi4KLQkgKiAJCS0gVGhlIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIG5vIHBhcmFtZXRlcnMuIFRoZSAKLQkgKiAgICAgICAgQ29udGFpbmVyIHVzZXMgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuCi0JICogLi4uCi0JICogNi4xMC4zIGVqYkNyZWF0ZSBtZXRob2RzCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSBlamJDcmVhdGUoLi4uKSBtZXRob2RzIHdob3NlIHNpZ25hdHVyZXMgbXVzdAotCSAqIGZvbGxvdyB0aGVzZSBydWxlczoKLQkgKi4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nW10gbW9kZWxPYmplY3ROYW1lID0gbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfTsKLQkJaWYgKCFoYXNWYWxpZENvbnN0cnVjdG9yICYmIGhhc0FDb25zdHJ1Y3RvcikgewotCQkJLy8gSWYgYSBwdWJsaWMgY29uc3RydWN0b3Igd2l0aCBubyBhcmd1bWVudHMgZG9lcyBub3QgZXhpc3QgZXhwbGljaXRseSwKLQkJCS8vIEphdmEgd2lsbCBpbnNlcnQgb25lIGFzIGxvbmcgYXMgdGhlcmUgYXJlIG5vIGNvbnN0cnVjdG9ycyBkZWZpbmVkIGluIHRoZQotCQkJLy8gY2xhc3MuIElmIHRoZXJlIGlzIGEgY29uc3RydWN0b3IsIEphdmEgZG9lcyBub3QgaW5zZXJ0IGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAwNiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgbW9kZWxPYmplY3ROYW1lLCB0aGlzKTsKLQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQotCQlpZiAoIWhhc0NyZWF0ZU1ldGhvZCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMDgsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JCS8vIG5vIGFyZ3VtZW50cy4KLQkJaWYgKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1N0YXRlbGVzcyhiZWFuKSAmJiAoY3JlYXRlTWV0aG9kcy5zaXplKCkgPiAwKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjcmVhdGVNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzLkNIS0oyMDI1LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCAoTWV0aG9kKSBpdGVyYXRvci5uZXh0KCksIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIHN1cHBsaWVkIG1ldGhvZCBmb2xsb3dzIHRoZSBFSkIgMS4xIHNwZWMgcnVsZXMuCi0JICoKLQkgKiBlamJDcmVhdGUgYW5kIGJ1c2luZXNzIG1ldGhvZHMgZm9sbG93IHNvbWUgb2YgdGhlIHNhbWUgcnVsZXMuIFRoaXMgbWV0aG9kIGNoZWNrcyB0aG9zZSBydWxlcy4KLQkgKiAoUGFydCBvZiBzZWN0aW9ucyA2LjEwLjMgYW5kIDYuMTAuNCkKLQkgKgotCSAqIAkJLSBUaGUgYnVzaW5lc3MgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCSAqIAkJLSBUaGUgbWV0aG9kIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGZpbmFsIG9yIHN0YXRpYy4KLQkgKiAJCS0gVGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgdHlwZXMgZm9yIGEgbWV0aG9kIG11c3QgYmUgbGVnYWwgdHlwZXMgZm9yIFJNSS9JSU9QLgotCSAqIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JICogdG8gaW5kaWNhdGUgYSBub24tYXBwbGljYXRpb24gZXhjZXB0aW9uLiBUaGlzIHByYWN0aWNlIGlzIGRlcHJlY2F0ZWQgaW4gRUpCIDEuMSAtLSBhbiBFSkIgMS4xIGNvbXBsaWFudAotCSAqIGVudGVycHJpc2UgYmVhbiBzaG91bGQgdGhyb3cgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gb3IgYW5vdGhlciBSdW50aW1lRXhjZXB0aW9uIHRvCi0JICogaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTW9kaWZpZXJzQW5kRXhjZXB0aW9ucyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24iIGFib3ZlCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDhfYnVzLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9idXMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9idXMsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gZXhjZXB0aW9ucywgcG9zc2libHkgCi0JCS8vIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4gCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JCS8vIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQKLQkJLy8gZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkJLy8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9idXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTW9kaWZpZXJzQW5kRXhjZXB0aW9ucyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCS8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24iIGFib3ZlCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUaGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgcHVibGljLgotCQlpZiAoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1B1YmxpYyhtZXRob2QpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MDhfZWpiQ3JlYXRlLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCS8vIFRoZSBtZXRob2QgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgZmluYWwgb3Igc3RhdGljLgotCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxMF9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJaWYgKG1ldGhvZC5pc0ZpbmFsKCkpIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwOV9lamJDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIHRocm93cyBjbGF1c2UgbWF5IGRlZmluZSBhcmJpdHJhcnkgYXBwbGljYXRpb24gZXhjZXB0aW9ucywgcG9zc2libHkgCi0JCS8vIGluY2x1ZGluZyB0aGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4gCi0JCS8vIENvbXBhdGliaWxpdHkgTm90ZTogRUpCIDEuMCBhbGxvd2VkIHRoZSBidXNpbmVzcyBtZXRob2RzIHRvIHRocm93IHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gCi0JCS8vIHRvIGluZGljYXRlIGEgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4gVGhpcyBwcmFjdGljZSBpcyBkZXByZWNhdGVkIGluIEVKQiAxLjEgLS0gYW4gRUpCIDEuMSBjb21wbGlhbnQKLQkJLy8gZW50ZXJwcmlzZSBiZWFuIHNob3VsZCB0aHJvdyB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBvciBhbm90aGVyIFJ1bnRpbWVFeGNlcHRpb24gdG8KLQkJLy8gaW5kaWNhdGUgbm9uLWFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgdG8gdGhlIENvbnRhaW5lciAoc2VlIFNlY3Rpb24gMTIuMi4yKS4KLQkJdmFsaWRhdGVOb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQwMF9lamJDcmVhdGUpOwotCX0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7Ci0JCWhhc1ZhbGlkQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCWhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25Ib21lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWIyODlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25Ib21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBTZXNzaW9uIGhvbWUgaW50ZXJmYWNlIGNsYXNzZXMgZm9yIGVycm9ycyBvciBwb3RlbnRpYWwgZXJyb3JzLgotICogSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgYW4gZXJyb3IsIHdhcm5pbmcsIG9yIGluZm8gbWFya2VyIGlzIGFkZGVkIHRvIHRoZSB0YXNrIGxpc3QuCi0gKgotICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotICogRW50ZXJwcmlzZSBKYXZhQmVhbnMgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotICogVmVyc2lvbjogMS4xCi0gKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLSAqIFJlbGVhc2U6IDEyLzE3Lzk5Ci0gKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIDYuOCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucwotICouLi4KLSAqIFRoZSBob21lIGludGVyZmFjZSBvZiBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4gbXVzdCBoYXZlIG9uZSBjcmVhdGUgCi0gKiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0gKiBUaGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgZGVmaW5lIGEgc2luZ2xlIGVqYkNyZWF0ZSBtZXRob2QgdGhhdCB0YWtlcyAKLSAqIG5vIGFyZ3VtZW50cy4KLSAqLi4uCi0gKgotICogNi4xMC42IFNlc3Npb24gYmVhbnMgaG9tZSBpbnRlcmZhY2UKLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLSAqICAgLSBUaGUgaW50ZXJmYWNlIG11c3QgZXh0ZW5kIHRoZSBqYXZheC5lamIuRUpCSG9tZSBpbnRlcmZhY2UuCi0gKiAgIC0gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLiAKLSAqICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZXMgbXVzdCBiZSBvZiB2YWxpZCB0eXBlcyAKLSAqICAgICBmb3IgUk1JL0lJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0gKiAgIC0gVGhlIGhvbWUgaW50ZXJmYWNlIGlzIGFsbG93ZWQgdG8gaGF2ZSBzdXBlcmludGVyZmFjZXMuIFVzZSBvZiBpbnRlcmZhY2UgCi0gKiAgICAgaW5oZXJpdGFuY2UgaXMgc3ViamVjdCB0byB0aGUgUk1JL0lJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIAotICogICAgIHJlbW90ZSBpbnRlcmZhY2VzLgotICogICAtIEEgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlKC4uLikgbWV0aG9kcy4KLSAqICAgLSBFYWNoIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBuYW1lZCAiY3JlYXRlIiwgYW5kIGl0IG11c3QgbWF0Y2ggb25lIG9mIAotICogICAgIHRoZSBlamJDcmVhdGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MuIFRoZSBtYXRjaGluZyAKLSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0gKiAgICAgKE5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgZGlmZmVyZW50LikKLSAqICAgLSBUaGUgcmV0dXJuIHR5cGUgZm9yIGEgY3JlYXRlIG1ldGhvZCBtdXN0IGJlIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0gKiAgICAgaW50ZXJmYWNlIHR5cGUuCi0gKiAgIC0gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYW4gZWpiQ3JlYXRlIG1ldGhvZCAKLSAqICAgICBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgCi0gKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0gKiAgIC0gVGhlIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24uIAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTZXNzaW9uSG9tZSBleHRlbmRzIEFWYWxpZGF0ZUhvbWUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjExQ29uc3RhbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9IGZhbHNlOwotCXByaXZhdGUgU2V0IGNyZWF0ZU1ldGhvZHMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc2giOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fSE9NRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMTFfU0VTU0lPTl9SRU1PVEV9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKLQkKLQlzdGF0aWMgewotCQlNRVNTQUdFX0lEUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMDUsIG5ldyBTdHJpbmdbXXtDSEtKMjAwNStCRVhULCBDSEtKMjAwNStNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMCwgbmV3IFN0cmluZ1tde0NIS0oyMDEwK0VYVH0pOwotCQkKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDExLCBuZXcgU3RyaW5nW117Q0hLSjIwMTErRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMiwgbmV3IFN0cmluZ1tde0NIS0oyMDEyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjQsIG5ldyBTdHJpbmdbXXtDSEtKMjAyNCtCRVhULCBDSEtKMjAyNCtNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAyNiwgbmV3IFN0cmluZ1tde0NIS0oyMDI2K0JFWFQsIENIS0oyMDI2K01FWFR9KTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjEwNCwgbmV3IFN0cmluZ1tde0NIS0oyMTA0ICsgU1BFQ30pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQwMiwgbmV3IFN0cmluZ1tde0NIS0oyNDAyK0JFWFQsIENIS0oyNDAyK01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDAzLCBuZXcgU3RyaW5nW117Q0hLSjI0MDMrQkVYVCwgQ0hLSjI0MDMrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MDUsIG5ldyBTdHJpbmdbXXtDSEtKMjQwNStCRVhULCBDSEtKMjQwNStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEyLCBuZXcgU3RyaW5nW117Q0hLSjI0MTIrQkVYVCwgQ0hLSjI0MTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMytCRVhULCBDSEtKMjQxMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0JFWFQsIENIS0oyNDE0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE1LCBuZXcgU3RyaW5nW117Q0hLSjI0MTUrQkVYVCwgQ0hLSjI0MTUrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTksIG5ldyBTdHJpbmdbXXtDSEtKMjQxOStCRVhULCBDSEtKMjQxOStNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMDQxLCBuZXcgU3RyaW5nW117Q0hLSjIwNDF9KTsgLy8gc3BlY2lhbCBjYXNlLiBTaGFyZWQgYnkgYWxsIHR5cGVzLgotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MzMsIG5ldyBTdHJpbmdbXXtDSEtKMjQzM30pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJc3VwZXIucmVzZXQoKTsKLQkJY3JlYXRlTWV0aG9kcy5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgTWFwIGdldE1lc3NhZ2VJZHMoKSB7Ci0JCXJldHVybiBNRVNTQUdFX0lEUzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdFtdIGdldERlcGVuZHNPbigpIHsKLQkJcmV0dXJuIERFUEVORFNfT047Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGVTZXNzaW9uSG9tZSgpIHsKLQkJY3JlYXRlTWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ3JlYXRlTWV0aG9kKCkgewotCQlpZiAoaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCA9PSB0cnVlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChjcmVhdGVNZXRob2RzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluY3JlbWVudENyZWF0ZU1ldGhvZENvdW50KElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDApICYmICghaGFzRGVmYXVsdENyZWF0ZU1ldGhvZCkpIHsKLQkJCWhhc0RlZmF1bHRDcmVhdGVNZXRob2QgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYWRkIGl0IHRvIHRoZSBsaXN0LCBmb3IgcmVwb3J0aW5nIGV4dHJhbmVvdXMgY3JlYXRlIG1ldGhvZHMsIGZvciBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucyAoc2VjdGlvbiA2LjgpCi0JCQljcmVhdGVNZXRob2RzLmFkZChtZXRob2QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdGhlIHNlc3Npb24gaG9tZSBpbnRlcmZhY2UncyBtZXRob2RzIGZvbGxvdyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqIAotCSAqIFRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoIGlzIHRha2VuIGZyb20KLQkgKiBFbnRlcnByaXNlIEphdmFCZWFucyBTcGVjaWZpY2F0aW9uICgiU3BlY2lmaWNhdGlvbiIpCi0JICogVmVyc2lvbjogMS4xCi0JICogU3RhdHVzOiBGaW5hbCBSZWxlYXNlCi0JICogUmVsZWFzZTogMTIvMTcvOTkKLQkgKiBDb3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0JICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgOTQzMDMsIFUuUy5BLgotCSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0JICogCi0JICogNi44IFN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zCi0JICouLi4KLQkgKiBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotCSAqIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotCSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JICogbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogLi4uCi0JICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUkvSUlPUC4gCi0JICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqICAgICBmb3IgUk1JL0lJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICogLi4uCi0JICogICAtIEEgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlKC4uLikgbWV0aG9kcy4KLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkgKiAgICAgdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkgKiAgICAgaW50ZXJmYWNlIHR5cGUuCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCSAqIC4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhpTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAotCQkvLyBzdXBlci5wcmltVmFsaWRhdGUoaGlNZXRob2QpOwotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBoaU1ldGhvZC5nZXROYW1lKCk7Ci0JCS8vIEhvbWUgaW50ZXJmYWNlIHNob3VsZCBvbmx5IGRlY2xhcmUgY3JlYXRlIG1ldGhvZHMKLQkJaWYgKG5hbWUuZXF1YWxzKElNZXRob2RBbmRGaWVsZENvbnN0YW50cy5NRVRIT0ROQU1FX0NSRUFURSkpIHsKLQkJCXZhbGlkYXRlQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgaGlNZXRob2QpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSG9tZSBpbnRlcmZhY2Ugc2hvdWxkIG9ubHkgZGVjbGFyZSBjcmVhdGUgbWV0aG9kcwotCQkJLy8gKE5vIG1ldGhvZHMgb3RoZXIgdGhhbiBjcmVhdGUgbWV0aG9kcyBhcmUgbGlzdGVkIGluIHNlY3Rpb24gNi4xMC42LAotCQkJLy8gYnV0IG90aGVyIHNlY3Rpb25zIG9mIHRoZSBzcGVjLCBlLmcuIDkuMi4yLCBleHBsaWNpdGx5IGxpc3QgZWFjaCB0eXBlCi0JCQkvLyBvZiBtZXRob2Qgd2hpY2ggY2FuIGJlIG9uIGEgY2xhc3MvaW50ZXJmYWNlLikKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjQxOSwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgaGlNZXRob2QsIHRoaXMpOwotCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJfQotCi0JCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCi0JCS8vc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UoZWpiTWV0aG9kKTsKLQotCQlpZiAoSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLk1FVEhPRE5BTUVfQ1JFQVRFLmVxdWFscyhlamJNZXRob2QuZ2V0TmFtZSgpKSkKLQkJCWluY3JlbWVudENyZWF0ZU1ldGhvZENvdW50KHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgc2Vzc2lvbiBob21lIGNsYXNzIGRlZmluaXRpb24gZm9sbG93cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqCi0JICogVGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggaXMgdGFrZW4gZnJvbQotCSAqIEVudGVycHJpc2UgSmF2YUJlYW5zIFNwZWNpZmljYXRpb24gKCJTcGVjaWZpY2F0aW9uIikKLQkgKiBWZXJzaW9uOiAxLjEKLQkgKiBTdGF0dXM6IEZpbmFsIFJlbGVhc2UKLQkgKiBSZWxlYXNlOiAxMi8xNy85OQotCSAqIENvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLQkgKiA5MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSA5NDMwMywgVS5TLkEuCi0JICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQkgKgotCSAqIDYuMTAuNiBTZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZQotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGludGVyZmFjZToKLQkgKiAgIC0gVGhlIGludGVyZmFjZSBtdXN0IGV4dGVuZCB0aGUgamF2YXguZWpiLkVKQkhvbWUgaW50ZXJmYWNlLgotCSAqIC4uLgotCSAqICAgLSBUaGUgaG9tZSBpbnRlcmZhY2UgaXMgYWxsb3dlZCB0byBoYXZlIHN1cGVyaW50ZXJmYWNlcy4gVXNlIG9mIGludGVyZmFjZSAKLQkgKiAgICAgaW5oZXJpdGFuY2UgaXMgc3ViamVjdCB0byB0aGUgUk1JL0lJT1AgcnVsZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIAotCSAqICAgICByZW1vdGUgaW50ZXJmYWNlcy4KLQkgKiAuLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKLQkJLy8gQm90aCBvZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgdGhlIFZhbGlkYXRlSG9tZSBjbGFzcydzIHZhbGlkYXRlQ2xhc3MgbWV0aG9kLgotCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7Ci0JfQotCi0JLyoqCi0JICogNi44IFN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zCi0JICouLi4KLQkgKiBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotCSAqIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotCSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JICogbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIFRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIGZvciBSTUkvSUlPUC4gCi0JICogICAgIFRoaXMgbWVhbnMgdGhhdCB0aGVpciBhcmd1bWVudCBhbmQgcmV0dXJuIHZhbHVlcyBtdXN0IGJlIG9mIHZhbGlkIHR5cGVzIAotCSAqICAgICBmb3IgUk1JL0lJT1AsIGFuZCB0aGF0IHRoZWlyIHRocm93cyBjbGF1c2UgbXVzdCBpbmNsdWRlIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JICogICAtIEEgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlKC4uLikgbWV0aG9kcy4KLQkgKiAgIC0gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkgKiAgICAgdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCSAqICAgICBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JICogICAgIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JICogICAtIFRoZSByZXR1cm4gdHlwZSBmb3IgYSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSAKLQkgKiAgICAgaW50ZXJmYWNlIHR5cGUuCi0JICogICAtIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JICogICAgIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkgKiAgICAgbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JICogICAtIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZSBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIFJNSS9JSU9QLiAKLQkJLy8gVGhpcyBtZWFucyB0aGF0IHRoZWlyIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWVzIG11c3QgYmUgb2YgdmFsaWQgdHlwZXMgCi0JCS8vIGZvciBSTUkvSUlPUCwgYW5kIHRoYXQgdGhlaXIgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgdGhlIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbi4KLQkJdmFsaWRhdGVMZWdhbFJNSU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0KLQkJLy8gRWFjaCBjcmVhdGUgbWV0aG9kIG11c3QgYmUgbmFtZWQgImNyZWF0ZSIsIGFuZCBpdCBtdXN0IG1hdGNoIG9uZSBvZiAKLQkJLy8gdGhlIGVqYkNyZWF0ZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlc3Npb24gYmVhbiBjbGFzcy4gVGhlIG1hdGNoaW5nIAotCQkvLyBlamJDcmVhdGUgbWV0aG9kIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cy4gCi0JCS8vIChOb3RlIHRoYXQgdGhlIHJldHVybiB0eXBlIGlzIGRpZmZlcmVudC4pCi0JCS8vIEFsbCB0aGUgZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIGFuIGVqYkNyZWF0ZSBtZXRob2QgCi0JCS8vIG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSAKLQkJLy8gbWF0Y2hpbmcgY3JlYXRlIG1ldGhvZCBvZiB0aGUgaG9tZSBpbnRlcmZhY2UuCi0JCS8vIFRoZSB0aHJvd3MgY2xhdXNlIG11c3QgaW5jbHVkZSBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uLgotCQl2YWxpZGF0ZUNyZWF0ZU1ldGhvZF9iZWFuRGVwKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKTsKLQotCQkvLyBUaGUgdGhyb3dzIGNsYXVzZSBtdXN0IGluY2x1ZGUgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbi4KLQkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkudGhyb3dzQ3JlYXRlRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCkpIHsKLQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfQ1JFQVRFRVhDRVBUSU9OIH07Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjI0MTQsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbXNnUGFybSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gUGVyZm9ybSB0aGUgY2hlY2tzIHdoaWNoIGRlcGVuZCBvbiBhbm90aGVyIGNsYXNzIGluIHRoZSBlbnRlcnByaXNlIGJlYW4uCi0JCXZhbGlkYXRlQ3JlYXRlTWV0aG9kX3JlbW90ZURlcCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogNi44IFN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zCi0JICouLi4KLQkgKiBUaGUgaG9tZSBpbnRlcmZhY2Ugb2YgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIG11c3QgaGF2ZSBvbmUgY3JlYXRlIAotCSAqIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIAotCSAqIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0JICogVGhlIHNlc3Npb24gYmVhbiBjbGFzcyBtdXN0IGRlZmluZSBhIHNpbmdsZSBlamJDcmVhdGUgbWV0aG9kIHRoYXQgdGFrZXMgCi0JICogbm8gYXJndW1lbnRzLgotCSAqLi4uCi0JICoKLQkgKiA2LjEwLjYgU2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UKLQkgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0JICogICAtIEEgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgb25lIG9yIG1vcmUgY3JlYXRlKC4uLikgbWV0aG9kcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZ1tdIG1vZGVsT2JqZWN0TmFtZSA9IG5ldyBTdHJpbmdbXSB7IGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKX07Ci0KLQkJLy8gQSBzZXNzaW9uIGJlYW4ncyBob21lIG11c3QgZGVmaW5lIG9uZSBvciBtb3JlIGNyZWF0ZSBtZXRob2RzLgotCQlpZiAoIWhhc0NyZWF0ZU1ldGhvZCgpKSB7Ci0JCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIwMTAsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1vZGVsT2JqZWN0TmFtZSwgdGhpcyk7Ci0JCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLy8gVGhlIGhvbWUgaW50ZXJmYWNlIG9mIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbiBtdXN0IGhhdmUgb25lIGNyZWF0ZSAKLQkJLy8gbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgCi0JCS8vIGludGVyZmFjZS4gVGhlcmUgY2FuIGJlIG5vIG90aGVyIGNyZWF0ZSBtZXRob2RzIGluIHRoZSBob21lIGludGVyZmFjZS4gCi0JCWlmIChWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNTdGF0ZWxlc3MoYmVhbikgJiYgKGNyZWF0ZU1ldGhvZHMuc2l6ZSgpID4gMCkpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY3JlYXRlTWV0aG9kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAyNCwgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwgKE1ldGhvZCkgaXRlcmF0b3IubmV4dCgpLCBtb2RlbE9iamVjdE5hbWUsIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoKLQkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwotCQloYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uUmVtb3RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uUmVtb3RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjIwNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvblJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi0KLS8qKgotICogVmFsaWRhdGVzIHRoZSByZW1vdGUgaW50ZXJmYWNlIG9mIGEgU2Vzc2lvbiBiZWFuLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTZXNzaW9uUmVtb3RlIGV4dGVuZHMgQVZhbGlkYXRlUmVtb3RlIGltcGxlbWVudHMgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TU0dJRCA9ICIuc3IiOyAvLyBJbiBtZXNzYWdlcywgdG8gaWRlbnRpZnkgd2hpY2ggbWVzc2FnZSB2ZXJzaW9uIGJlbG9uZ3MgdG8gdGhlIEJNUCBiZWFuIGNsYXNzLCB0aGlzIGlkIGlzIHVzZWQuIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUID0gTVNTR0lEICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gbm9uLW1ldGhvZCwgbm9uLWZpZWxkIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFWFQgPSBNU1NHSUQgKyBPTl9CQVNFICsgU1BFQzsgLy8gRXh0ZW5zaW9uIHRvIGJlIHVzZWQgb24gYSBtZXRob2QvZmllbGQgbWVzc2FnZSB3aGVuIHRoZSBtZXRob2QvZmllbGQgaXMgaW5oZXJpdGVkIGZyb20gYSBiYXNlIHR5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYVCA9IE1TU0dJRCArIE9OX1RISVMgKyBTUEVDOyAvLyBFeHRlbnNpb24gdG8gYmUgdXNlZCBvbiBhIG1ldGhvZC9maWVsZCBtZXNzYWdlIHdoZW4gdGhlIG1ldGhvZC9maWVsZCBpcyBpbXBsZW1lbnRlZCBvbiB0aGUgY3VycmVudCB0eXBlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjExX1NFU1NJT05fUkVNT1RFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIxMV9TRVNTSU9OX0JFQU5DTEFTU307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwotCQotCXN0YXRpYyB7Ci0JCU1FU1NBR0VfSURTID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjAxMiwgbmV3IFN0cmluZ1tde0NIS0oyMDEyK0VYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMTcsIG5ldyBTdHJpbmdbXXtDSEtKMjAxNytFWFR9KTsKLQotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjIwMjMsIG5ldyBTdHJpbmdbXXtDSEtKMjAyMytCRVhULCBDSEtKMjAyMytNRVhUfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyMTA1LCBuZXcgU3RyaW5nW117Q0hLSjIxMDUgKyBTUEVDfSk7Ci0KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDEyLCBuZXcgU3RyaW5nW117Q0hLSjI0MTIrQkVYVCwgQ0hLSjI0MTIrTUVYVH0pOwotCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI0MTMsIG5ldyBTdHJpbmdbXXtDSEtKMjQxMytCRVhULCBDSEtKMjQxMytNRVhUfSk7Ci0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjQxNCwgbmV3IFN0cmluZ1tde0NIS0oyNDE0K0JFWFQsIENIS0oyNDE0K01FWFR9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDE1LCBuZXcgU3RyaW5nW117Q0hLSjI0MTUrQkVYVCwgQ0hLSjI0MTUrTUVYVH0pOwotCi0JCU1FU1NBR0VfSURTLnB1dChDSEtKMjA0MSwgbmV3IFN0cmluZ1tde0NIS0oyMDQxfSk7IC8vIHNwZWNpYWwgY2FzZS4gU2hhcmVkIGJ5IGFsbCB0eXBlcy4KLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyNDMzLCBuZXcgU3RyaW5nW117Q0hLSjI0MzN9KTsKLQkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE1hcCBnZXRNZXNzYWdlSWRzKCkgewotCQlyZXR1cm4gTUVTU0FHRV9JRFM7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3RbXSBnZXREZXBlbmRzT24oKSB7Ci0JCXJldHVybiBERVBFTkRTX09OOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldElkKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjkyMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLS8qKgotICogVGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiB0aGUgdXNlciBjYW5jZWxzIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JcHVibGljIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJmOTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUnVsZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkxvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25SdWxlVXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyBsb25nIG1ldGhvZF9hbmRfZmllbGRfY291bnRlciA9IDB4MTsgLy8gdXNlZCBieSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuamF2YQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIF9yZXNlcnZlZFdvcmRzID0gbmV3IFN0cmluZ1tdeyJTRUxFQ1QiLCAiRlJPTSIsICJXSEVSRSIsICJESVNUSU5DVCIsICJPQkpFQ1QiLCAiTlVMTCIsICJUUlVFIiwgIkZBTFNFIiwgIk5PVCIsICJBTkQiLCAiT1IiLCAiQkVUV0VFTiIsICJMSUtFIiwgIklOIiwgIkFTIiwgIlVOS05PV04iLCAiRU1QVFkiLCAiTUVNQkVSIiwgIk9GIiwgIklTIn07IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJCAvLyROT04tTkxTLTExJCAvLyROT04tTkxTLTEyJCAvLyROT04tTkxTLTEzJCAvLyROT04tTkxTLTE0JCAvLyROT04tTkxTLTE1JCAvLyROT04tTkxTLTE2JCAvLyROT04tTkxTLTE3JCAvLyROT04tTkxTLTE4JCAvLyROT04tTkxTLTE5JCAvLyROT04tTkxTLTIwJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQSA9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIExvZ0VudHJ5IGxvZ0VudHJ5ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIEphdmFDbGFzcyBnZXRDTVJGaWVsZFR5cGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIENNUkZpZWxkIGZpZWxkKSB7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IGZpZWxkLmdldFJvbGUoKTsKLQkJaWYoIXJvbGUuaXNNYW55KCkpIHsKLQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gcm9sZS5nZXRUeXBlRW50aXR5KCk7Ci0JCQlpZihjbXAgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlKYXZhQ2xhc3MgbG9jYWwgPSBjbXAuZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJCS8vIElmIHRoZSB1c2VyIGhhcyBtYWRlIGEgbWlzdGFrZSBpbiBlamItamFyLnhtbCwgYW5kIHRoZXkgYXJlIHRyeWluZyB0byBtYWtlCi0JCQkvLyBhIHJlbGF0aW9uc2hpcCB0byBhIGNtcCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgaW50ZXJmYWNlLCBhbiBJbnZhbGlkSW5wdXRFeGNlcHRpb24KLQkJCS8vIHdpbGwgYmUgdGhyb3duLiBMZXQgdGhlIEREIHZhbGlkYXRpb24gY2F0Y2ggdGhhdCBlcnJvcjsganVzdCByZXR1cm4KLQkJCS8vIHdoZW4gdGhpcyBoYXBwZW5zLgotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkoY21wLCBsb2NhbCk7Ci0JCQl9Ci0JCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGxvY2FsOwotCQl9Ci0JCQkvLyA8Y21yLWZpZWxkLXR5cGU+IGlzIGVpdGhlciBhIGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGEgamF2YS51dGlsLlNldCAocC4gNDY0KQotCQkJcmV0dXJuIGZpZWxkLmdldENvbGxlY3Rpb25UeXBlKCk7Ci0JfQotCi0JCi0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZm9sbG93c0ZpbmRlckV4Y2VwdGlvblJ1bGVzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c0ZpbmRlckV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBmb2xsb3dzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25SdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxFbnVtZXJhdGlvbiA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfRU5VTUVSQVRJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBqYXZhVXRpbEVudW1lcmF0aW9uKSkgewotCQkJLy8gT25seSBzaW5nbGUgb2JqZWN0IGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgbWF5IHRocm93IHRoaXMgZXhjZXB0aW9uCi0JCQlyZXR1cm4gIVZhbGlkYXRpb25SdWxlVXRpbGl0eS50aHJvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwotCQl9Ci0JCQotCQlKYXZhSGVscGVycyBqYXZhVXRpbENvbGxlY3Rpb24gPSBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9VVElMX0NPTExFQ1RJT04sIGJlYW4pOwotCQlpZihWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBqYXZhVXRpbENvbGxlY3Rpb24pKSB7Ci0JCQkvLyBPbmx5IHNpbmdsZSBvYmplY3QgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBtYXkgdGhyb3cgdGhpcyBleGNlcHRpb24KLQkJCXJldHVybiAhVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnRocm93c09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCk7Ci0JCX0KLQkJCi0JCS8vIEl0J3MgYSBzaW5nbGUgZmluZGVyL3NlbGVjdCBtZXRob2QsIHNvIGl0IGNhbiB0aHJvdyB0aGUgZXhjZXB0aW9uLCB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkIHRvLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgTWV0aG9kIGZyb20gdGhlIG1ldGhvZCBsaXN0IHdoaWNoIGhhcyB0aGUgZ2l2ZW4KLQkgKiBuYW1lIGFuZCBwYXJhbWV0ZXIgdHlwZXMgKGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcnJheSBlbGVtZW50cykuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIFN0cmluZ1tdKS4KLQkgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIGNvZGUgd2FzIGR1cGxpY2F0ZWQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZQotCSAqIEphdmFQYXJhbWV0ZXJbXSBpbnRvIGEgU3RyaW5nW10uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgSmF2YVBhcmFtZXRlcltdIHBhcmFtZXRlclR5cGVzLCBMaXN0IG1ldGhvZExpc3QpIHsKLQkJaWYobWV0aG9kTGlzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUphdmFQYXJhbWV0ZXJbXSBwYXJhbXMgPSBudWxsOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwYXJhbXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCQkJCi0JCQkJaWYgKHBhcmFtcy5sZW5ndGggPT0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsgLy9NYXliZTsgd2UgbmVlZCBtb3JlIGluZm8KLQkJCQkJCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkvL2lmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgZG9lc24ndCBtYXRjaCB0aGVuIGZsaXAgYmFjayB0byBmYWxzZQotCQkJCQkJSmF2YUhlbHBlcnMgcGFybSA9ICgoSmF2YUhlbHBlcnMpcGFyYW1zW2pdLmdldEVUeXBlKCkpOwotCQkJCQkJSmF2YUhlbHBlcnMgdHlwZSA9ICgoSmF2YUhlbHBlcnMpcGFyYW1ldGVyVHlwZXNbal0uZ2V0RVR5cGUoKSk7Ci0JCQkJCQlpZighaXNTYW1lVHlwZShwYXJtLCB0eXBlKSkgewotCQkJCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChmb3VuZCkgewotCQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgSmF2YUhlbHBlcnNbXSBwYXJhbWV0ZXJUeXBlcywgTGlzdCBtZXRob2RMaXN0KSB7Ci0JCWlmKG1ldGhvZExpc3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1ldGhvZExpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCQotCQkJCWlmIChwYXJhbXMubGVuZ3RoID09IHBhcmFtZXRlclR5cGVzLmxlbmd0aCkgewotCQkJCQlmb3VuZCA9IHRydWU7IC8vTWF5YmU7IHdlIG5lZWQgbW9yZSBpbmZvCi0JCQkJCQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykgewotCQkJCQkJLy9pZiBhbnkgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGRvZXNuJ3QgbWF0Y2ggdGhlbiBmbGlwIGJhY2sgdG8gZmFsc2UKLQkJCQkJCUphdmFIZWxwZXJzIHBhcm0gPSAoKEphdmFIZWxwZXJzKXBhcmFtc1tqXS5nZXRFVHlwZSgpKTsKLQkJCQkJCUphdmFIZWxwZXJzIHR5cGUgPSBwYXJhbWV0ZXJUeXBlc1tqXTsKLQkJCQkJCWlmKCFpc1NhbWVUeXBlKHBhcm0sIHR5cGUpKSB7Ci0JCQkJCQkJZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBGcm9tIEphdmFDbGFzcyBjbGF6eiwgcmV0dXJuIGEgbWV0aG9kLCBuYW1lZCBtZXRob2ROYW1lVG9GaW5kLAotCSAqIHdoaWNoIGhhcyBleGFjdGx5IHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBtZXRob2RUb01hdGNoLgotCSAqCi0JICogSWYgbm8gbWV0aG9kIGV4aXN0cyB3aXRoIHRoYXQgbmFtZSBhbmQgYXJndW1lbnQgbGlzdCwgcmV0dXJuIG51bGwuCi0JICogCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdGhlIGV4Y2VwdGlvbnMgb3IgcmV0dXJuIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKE1ldGhvZCBtZXRob2RUb01hdGNoLCBTdHJpbmcgbWV0aG9kTmFtZVRvRmluZCwgTGlzdCBtZXRob2RzRXh0ZW5kZWRMaXN0KSB7Ci0JCWlmKG1ldGhvZHNFeHRlbmRlZExpc3QgPT0gbnVsbCkgewotCQkJLy8gSXQgaXMgbm90IGludmFsaWQgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aXRoIGEgbnVsbCBMaXN0LiBBIG51bGwgTGlzdAotCQkJLy8gbWVhbnMgdGhhdCBhIHR5cGUgd2hvc2UgbWV0aG9kcyBuZWVkIHRvIGJlIHNlYXJjaGVkIGRvZXNuJ3QgZXhpc3QsCi0JCQkvLyBzdWNoIGFzIHNlYXJjaGluZyBhIGxvY2FsIHZpZXcsIGJ1dCB0aGUgYmVhbiBoYXMgb25seSBhIHJlbW90ZSB2aWV3LgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldE1ldGhvZChtZXRob2ROYW1lVG9GaW5kLCBtZXRob2RUb01hdGNoLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogRnJvbSBKYXZhQ2xhc3MgY2xhenosIHJldHVybiBhIG1ldGhvZCwgbmFtZWQgbWV0aG9kTmFtZVRvRmluZCwKLQkgKiB3aGljaCBoYXMgZXhhY3RseSB0aGUgc2FtZSBhcmd1bWVudHMgYXMgbWV0aG9kVG9NYXRjaC4KLQkgKgotCSAqIElmIG5vIG1ldGhvZCBleGlzdHMgd2l0aCB0aGF0IG5hbWUgYW5kIGFyZ3VtZW50IGxpc3QsIHJldHVybiBudWxsLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIHRoZSBleGNlcHRpb25zIG9yIHJldHVybiB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZFRvTWF0Y2gsIFN0cmluZyBtZXRob2ROYW1lVG9GaW5kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYgKChjbGF6eiA9PSBudWxsKSB8fCAobWV0aG9kVG9NYXRjaCA9PSBudWxsKSB8fCAobWV0aG9kTmFtZVRvRmluZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWVUb0ZpbmQsIG1ldGhvZFRvTWF0Y2gubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgZHVwbGljYXRlIG9mIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZywgU3RyaW5nW10pLgotCSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgY29kZSB3YXMgZHVwbGljYXRlZCBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgdGhlCi0JICogSmF2YVBhcmFtZXRlcltdIGludG8gYSBTdHJpbmdbXS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhUGFyYW1ldGVyW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJaWYgKGNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKLQkJCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJCXJldHVybiBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCS8vIENoZWNrIHRoZSBjdXJyZW50IGNsYXNzIGZpcnN0LiBJZiB0aGUgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiwKLQkJLy8gZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHBhcmVudCdzIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCdzLgotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gbnVsbDsKLQkJZG8gewotCQkJbWV0aG9kcyA9IGNsYXp6LmdldE1ldGhvZHMoKTsKLQkJCW1ldGhvZCA9IGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgbWV0aG9kcyk7Ci0JCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCi0JCQkvLyBlbHNlLCBzZWFyY2ggdGhlIHBhcmVudAkKLQkJCWNsYXp6ID0gY2xhenouZ2V0U3VwZXJ0eXBlKCk7Ci0JCX0KLQkJd2hpbGUgKChtZXRob2QgPT0gbnVsbCkgJiYgKGNsYXp6ICE9IG51bGwpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIEphdmFQYXJhbWV0ZXJbXSkuCi0JICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUKLQkgKiBKYXZhSGVscGVyc1tdIGludG8gYSBKYXZhUGFyYW1ldGVyW10uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kRXh0ZW5kZWQoSmF2YUNsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgSmF2YUhlbHBlcnNbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RFeHRlbmRlZChTdHJpbmcsIEphdmFQYXJhbWV0ZXJbXSkuCi0JICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluc3RlYWQgb2YgY29udmVydGluZyB0aGUKLQkgKiBKYXZhSGVscGVyc1tdIGludG8gYSBKYXZhUGFyYW1ldGVyW10uCi0JICogCi0JICogSWYgcmV0VHlwZSBpcyBudWxsIGl0IG1lYW5zIHRoYXQgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgZG9lc24ndCBuZWVkIHRvIGJlIGNoZWNrZWQuCi0JICogT3RoZXJ3aXNlLCBjaGVjayB0aGF0IHRoZSByZXR1cm4gdHlwZSBtYXRjaGVzIHRvby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhSGVscGVyc1tdIHBhcmFtZXRlclR5cGVzLCBKYXZhSGVscGVycyByZXRUeXBlKSB7Ci0JCWlmIChjbGF6ei5pc0ludGVyZmFjZSgpKSB7Ci0JCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCQkvLyBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgcGFyZW50J3MgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNoaWxkJ3MuCi0JCQlyZXR1cm4gZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IG51bGw7Ci0JCWRvIHsKLQkJCW1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7Ci0JCQltZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIG1ldGhvZHMpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJaWYocmV0VHlwZSAhPSBudWxsKSB7Ci0JCQkJCUphdmFIZWxwZXJzIG1ldGhSZXRUeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQkJaWYoaXNBc3NpZ25hYmxlRnJvbShtZXRoUmV0VHlwZSwgcmV0VHlwZSkpIHsKLQkJCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBlbHNlLCBzZWFyY2ggdGhlIHBhcmVudAkKLQkJCWNsYXp6ID0gY2xhenouZ2V0U3VwZXJ0eXBlKCk7Ci0JCX0KLQkJd2hpbGUgKChtZXRob2QgPT0gbnVsbCkgJiYgKGNsYXp6ICE9IG51bGwpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGR1cGxpY2F0ZSBvZiBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChTdHJpbmcsIFN0cmluZ1tdLCBKYXZhQ2xhc3MpLgotCSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgY29kZSB3YXMgZHVwbGljYXRlZCBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgdGhlCi0JICogSmF2YVBhcmFtZXRlcltdIGludG8gYSBTdHJpbmdbXS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChKYXZhQ2xhc3MgY2xhenosIFN0cmluZyBtZXRob2ROYW1lLCBKYXZhUGFyYW1ldGVyW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJaWYgKGNsYXp6ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGN1cnJlbnQgY2xhc3MgZmlyc3QuIElmIHRoZSBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGVuLAotCQkvLyBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgcGFyZW50J3MgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGNoaWxkJ3MuCi0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGNsYXp6LmdldE1ldGhvZHMoKSk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQkvLyBjaGVjayBwYXJlbnRzCi0JCUxpc3QgY2xhc3Nlc1RvQ2hlY2sgPSBjbGF6ei5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCQlJdGVyYXRvciBjbGF6ekl0ZXJhdG9yID0gY2xhc3Nlc1RvQ2hlY2suaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNsYXp6SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQljbGF6eiA9IChKYXZhQ2xhc3MpIGNsYXp6SXRlcmF0b3IubmV4dCgpOwotCQkJbWV0aG9kID0gZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoY2xhenosIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kSW50ZXJmYWNlRXh0ZW5kZWQoSmF2YUNsYXNzIGNsYXp6LCBTdHJpbmcgbWV0aG9kTmFtZSwgSmF2YUhlbHBlcnNbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBDaGVjayB0aGUgY3VycmVudCBjbGFzcyBmaXJzdC4gSWYgdGhlIG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4sCi0JCS8vIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBwYXJlbnQncyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgY2hpbGQncy4KLQkJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgY2xhenouZ2V0TWV0aG9kcygpKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCS8vIGNoZWNrIHBhcmVudHMKLQkJTGlzdCBjbGFzc2VzVG9DaGVjayA9IGNsYXp6LmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCUl0ZXJhdG9yIGNsYXp6SXRlcmF0b3IgPSBjbGFzc2VzVG9DaGVjay5pdGVyYXRvcigpOwotCQl3aGlsZSAoY2xhenpJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWNsYXp6ID0gKEphdmFDbGFzcykgY2xhenpJdGVyYXRvci5uZXh0KCk7Ci0JCQltZXRob2QgPSBnZXRNZXRob2RJbnRlcmZhY2VFeHRlbmRlZChjbGF6eiwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgZXhjZXB0aW9ucyB0aHJvd24gYnkgbWV0aG9kIGJ1dCBub3QgbWV0aG9kVG9NYXRjaC4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBleGNlcHRpb25zLCByZXR1cm4gbnVsbC4gKENoZWNrIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMKLQkgKiBpbiB0aGUgbWV0aG9kIGZvciBlYWNoIGV4Y2VwdGlvbiwgb3IgYSBwYXJlbnQgb2YgdGhlIGV4Y2VwdGlvbi4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgZ2V0Tm90U3Vic2V0RXhjZXB0aW9ucyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kLCBNZXRob2QgbWV0aG9kVG9NYXRjaCkgewotCQlpZigobWV0aG9kVG9NYXRjaCA9PSBudWxsKSB8fCAobWV0aG9kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JCQotCQkvLyBBbGwgdGhlIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgdGhyb3dzIGNsYXVzZSBvZiBhIG1ldGhvZCBvZiB0aGUgCi0JCS8vIGVudGl0eSBiZWFuIGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlIG1hdGNoaW5nIAotCQkvLyBtZXRob2Qgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLgotCQkvLwotCQkvLyBTZWN0aW9uIDEyLjIuMgotCQkvLyBbMTVdIEEgY2hlY2tlZCBleGNlcHRpb24gaXMgb25lIHRoYXQgaXMgbm90IGEgc3ViY2xhc3Mgb2YgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLQkJLy8gIk5vdGUgdGhhdCB0aGUgamF2YXguZWpiLkVKQkV4Y2VwdGlvbiBpcyBhIHN1YmNsYXNzIG9mIHRoZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiwKLQkJLy8gYW5kIHRoZXJlZm9yZSBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGxpc3RlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZXMgb2YgdGhlIGJ1c2luZXNzCi0JCS8vIG1ldGhvZHMuIgotCQlIYXNoU2V0IGV4Y2VwdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IG1ldGhUb01hdGNoRXhjZXB0aW9ucyA9IG1ldGhvZFRvTWF0Y2guZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJTGlzdCBmb3VuZE1ldGhFeGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgZm91bmRNZXRoRXhjZXB0aW9ucy5zaXplKCk7IGkrKyApIHsKLQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWZvdW5kTWV0aEV4Y2VwdGlvbnMuZ2V0KGkpOwotCQkJaWYgKCAhaXNSdW50aW1lRXhjZXB0aW9uKGV4YywgYmVhbikgJiYgIWlzUmVtb3RlRXhjZXB0aW9uKGV4YywgYmVhbikgJiYgIWlzRXhjZXB0aW9uSW5MaXN0KGV4YywgbWV0aFRvTWF0Y2hFeGNlcHRpb25zKSApIHsKLQkJCQlleGNlcHRpb25zLmFkZChleGMpOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBleGNlcHRpb25zOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IG1ldGhvZCBidXQgbm90IG1ldGhvZFRvTWF0Y2guCi0JICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggZXhjZXB0aW9ucywgcmV0dXJuIG51bGwuIChDaGVjayB0aGUgbGlzdCBvZiBleGNlcHRpb25zCi0JICogaW4gdGhlIG1ldGhvZCBmb3IgZWFjaCBleGNlcHRpb24sIG9yIGEgY2hpbGQgb2YgdGhlIGV4Y2VwdGlvbi4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgZ2V0Tm90U3Vic2V0U3VidHlwZUV4Y2VwdGlvbnMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgTWV0aG9kIG1ldGhvZFRvTWF0Y2gpIHsKLQkJaWYoKG1ldGhvZFRvTWF0Y2ggPT0gbnVsbCkgfHwgKG1ldGhvZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCQkKLQkJLy8gQWxsIHRoZSBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYSBtZXRob2Qgb2YgdGhlIAotCQkvLyBlbnRpdHkgYmVhbiBjbGFzcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtYXRjaGluZyAKLQkJLy8gbWV0aG9kIG9mIHRoZSBob21lIGludGVyZmFjZS4KLQkJLy8KLQkJLy8gU2VjdGlvbiAxMi4yLjIKLQkJLy8gWzE1XSBBIGNoZWNrZWQgZXhjZXB0aW9uIGlzIG9uZSB0aGF0IGlzIG5vdCBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCi0JCS8vICJOb3RlIHRoYXQgdGhlIGphdmF4LmVqYi5FSkJFeGNlcHRpb24gaXMgYSBzdWJjbGFzcyBvZiB0aGUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24sCi0JCS8vIGFuZCB0aGVyZWZvcmUgaXQgZG9lcyBub3QgaGF2ZSB0byBiZSBsaXN0ZWQgaW4gdGhlIHRocm93cyBjbGF1c2VzIG9mIHRoZSBidXNpbmVzcwotCQkvLyBtZXRob2RzLiIKLQkJSGFzaFNldCBleGNlcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCBtZXRoVG9NYXRjaEV4Y2VwdGlvbnMgPSBtZXRob2RUb01hdGNoLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCUxpc3QgZm91bmRNZXRoRXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRKYXZhRXhjZXB0aW9ucygpOwotCQlmb3IoIGludCBpID0gMDsgaSA8IGZvdW5kTWV0aEV4Y2VwdGlvbnMuc2l6ZSgpOyBpKysgKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylmb3VuZE1ldGhFeGNlcHRpb25zLmdldChpKTsKLQkJCWlmICggIWlzUnVudGltZUV4Y2VwdGlvbihleGMsIGJlYW4pICYmICFpc1JlbW90ZUV4Y2VwdGlvbihleGMsIGJlYW4pICYmICFpc1N1YnR5cGVFeGNlcHRpb25Jbkxpc3QoZXhjLCBtZXRoVG9NYXRjaEV4Y2VwdGlvbnMpICkgewotCQkJCWV4Y2VwdGlvbnMuYWRkKGV4Yyk7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIGV4Y2VwdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIAlFeGNsdWRlIHJvb3QgaG9tZSBpbnRlcmZhY2UgbWV0aG9kcyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFSkJIb21lTWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGlzU2FtZVR5cGUoYmVhbiwgbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJIT01FKTsKLQl9Ci0JCi0JLyoqCi0JICogCUV4Y2x1ZGUgcm9vdCByZW1vdGUgaW50ZXJmYWNlIG1ldGhvZHMgCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCT2JqZWN0TWV0aG9kKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGlzU2FtZVR5cGUoYmVhbiwgbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJPQkpFQ1QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhjZXB0aW9uLCBvciBhIHBhcmVudCBvZiB0aGUgZXhjZXB0aW9uLCBpcyBpbiB0aGUgbGlzdCBvZiBleGNlcHRpb25zLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNFeGNlcHRpb25Jbkxpc3QoSmF2YUNsYXNzIGV4YywgTGlzdCBleGNlcHRpb25MaXN0KSB7Ci0JICAgICAgIGlmKChleGMgPT0gbnVsbCkgfHwgKGV4Y2VwdGlvbkxpc3QgPT0gbnVsbCkpIHsKLQkgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgfQotCSAgICAgICAKLQkgICAgICAgaWYoIWV4Yy5pc0V4aXN0aW5nVHlwZSgpKSB7Ci0JICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgIH0KLQkgICAgICAgCi0JICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9uTGlzdC5pdGVyYXRvcigpOwotCSAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkgICAgICAgICAgICAgIEphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkgICAgICAgICAgICAgIGlmKGlzQXNzaWduYWJsZUZyb20oZXhjLCBleGNlcHRpb24pKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWZsZWN0aW9uIHByb2JsZW0sIGRvIG5vdCBzd2FsbG93IHRoZSBleGNlcHRpb24gb3IgYQotCSAgICAgICAgICAgICAgICAgICAgIC8vIGZhdWx0eSBtZXNzYWdlIG1heSBhcHBlYXIuIChpLmUuLCAiZXhjIiBpcyBub3QgdGhyb3duIGJ5ICJmb28iIHdoZW4gaXQKLQkgICAgICAgICAgICAgICAgICAgICAvLyByZWFsbHkgaXMgYnV0IG9uZSBvZiBmb28ncyBleGNlcHRpb25zIHdhc24ndCByZWZsZWN0ZWQuCi0JICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgICAgICAgICAgICB9Ci0JICAgICAgIH0KLQkgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhjZXB0aW9uLCBvciBhIGNoaWxkIG9mIHRoZSBleGNlcHRpb24sIGlzIGluIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1N1YnR5cGVFeGNlcHRpb25Jbkxpc3QoSmF2YUNsYXNzIGV4YywgTGlzdCBleGNlcHRpb25MaXN0KSB7Ci0JICAgICAgIGlmKChleGMgPT0gbnVsbCkgfHwgKGV4Y2VwdGlvbkxpc3QgPT0gbnVsbCkpIHsKLQkgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgfQotCSAgICAgICAKLQkgICAgICAgaWYoIWV4Yy5pc0V4aXN0aW5nVHlwZSgpKSB7Ci0JICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgIH0KLQkgICAgICAgCi0JICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9uTGlzdC5pdGVyYXRvcigpOwotCSAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkgICAgICAgICAgICAgIEphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkgICAgICAgICAgICAgIGlmKGlzQXNzaWduYWJsZUZyb20oZXhjZXB0aW9uLCBleGMpKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWZsZWN0aW9uIHByb2JsZW0sIGRvIG5vdCBzd2FsbG93IHRoZSBleGNlcHRpb24gb3IgYQotCSAgICAgICAgICAgICAgICAgICAgIC8vIGZhdWx0eSBtZXNzYWdlIG1heSBhcHBlYXIuIChpLmUuLCAiZXhjIiBpcyBub3QgdGhyb3duIGJ5ICJmb28iIHdoZW4gaXQKLQkgICAgICAgICAgICAgICAgICAgICAvLyByZWFsbHkgaXMgYnV0IG9uZSBvZiBmb28ncyBleGNlcHRpb25zIHdhc24ndCByZWZsZWN0ZWQuCi0JICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgICAgICAgICAgICB9Ci0JICAgICAgIH0KLQkgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE9mdGVuLCBmb3IgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBjb250YWlucwotCSAqIHRoZSBuYW1lIG9mIGEgY2xhc3MuIEJ1dCwgc29tZXRpbWVzLCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIGlzCi0JICogYmVpbmcgZ2VuZXJhdGVkIGJlY2F1c2UgYSBjbGFzcyBpcyBudWxsIHdoZW4gaXQgc2hvdWxkbid0IGJlLgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgaGVscGVyIG1ldGhvZCB3aGljaCBtYWtlcyB0aGUgY29uc3RydWN0aW9uIG9mCi0JICogdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBhIGxpdHRsZSBsZXNzIGNsdXR0ZXJlZCAoaS5lLiwgaW5zdGVhZAotCSAqIG9mIGNoZWNraW5nIGlmIHRoZSBjbGFzcyBpcyBudWxsIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlCi0JICogbWVzc2FnZSwganVzdCBjYWxsIHRoaXMgbWV0aG9kLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKEphdmFIZWxwZXJzIGhlbHBlcikgewotCQlpZihoZWxwZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGhlbHBlci5nZXRKYXZhTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVycyBpbiBhIGRpc3BsYXlhYmxlIGZvcm1hdC4gZS5nLiwgaWYKLQkgKiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBpcyAicHVibGljIEludGVnZXIgZm9vKFN0cmluZyBhLCBTdHJpbmcgYiwgU3RyaW5nIGMpIgotCSAqIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyAiU3RyaW5nLCBTdHJpbmcsIFN0cmluZyIuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFBhcm1zQXNTdHJpbmcoTWV0aG9kIG1ldGhvZCkgewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBnZXRQYXJtc0FzU3RyaW5nKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyYW1ldGVycyBpbiBhIGRpc3BsYXlhYmxlIGZvcm1hdC4gCi0JICogQHNlZSBnZXRQYXJtc0FzU3RyaW5nKE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRQYXJtc0FzU3RyaW5nKEphdmFQYXJhbWV0ZXJbXSBwYXJtKSB7Ci0JCWlmKHBhcm0ubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IoaW50IGk9MDsgaTxwYXJtLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyB0eXBlID0gcGFybVtpXS5nZXRKYXZhVHlwZSgpOwotCQkJYnVmZmVyLmFwcGVuZCgoKHR5cGUgPT0gbnVsbCkgPyAibnVsbCIgOiB0eXBlLmdldEphdmFOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChDT01NQSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci5zdWJzdHJpbmcoMCwgYnVmZmVyLmxlbmd0aCgpIC0gMik7IC8vIHNpbmNlICJDT01NQSIgaXMgMiBjaGFyIGxvbmcsIGFuZCB0aGUgbGFzdCBDT01NQSBpc24ndCBuZWVkZWQgYXQgdGhlIGVuZCwgcmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgbGFzdCBDT01NQQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyYW1ldGVycyBpbiBhIGRpc3BsYXlhYmxlIGZvcm1hdC4gCi0JICogQHNlZSBnZXRQYXJtc0FzU3RyaW5nKE1ldGhvZCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRQYXJtc0FzU3RyaW5nKEphdmFIZWxwZXJzW10gcGFybSkgewotCQlpZihwYXJtLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGludCBpPTA7IGk8cGFybS5sZW5ndGg7IGkrKykgewotCQkJSmF2YUhlbHBlcnMgdHlwZSA9IHBhcm1baV07Ci0JCQlidWZmZXIuYXBwZW5kKCgodHlwZSA9PSBudWxsKSA/ICJudWxsIiA6IHR5cGUuZ2V0SmF2YU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKENPTU1BKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnN1YnN0cmluZygwLCBidWZmZXIubGVuZ3RoKCkgLSAyKTsgLy8gc2luY2UgIkNPTU1BIiBpcyAyIGNoYXIgbG9uZywgYW5kIHRoZSBsYXN0IENPTU1BIGlzbid0IG5lZWRlZCBhdCB0aGUgZW5kLCByZXR1cm4gZXZlcnl0aGluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBsYXN0IENPTU1BCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHR5cGUsIGUuZy4gImNvbS5pYm0uZm9vLk15Rm9vIgotCSAqIElmIHRoZSB0eXBlIGlzIGFuIGFycmF5LCB0aGUgYXJyYXkgdHlwZSB3aWxsIGJlIHJldHVybmVkLgotCSAqIGUuZy4gaWYgdGhlIHR5cGUgaXMgamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLmxhbmcuU3RyaW5nW10gd2lsbAotCSAqIGJlIHJldHVybmVkLCBub3QgdGhlIGphdmEubGFuZy5TdHJpbmcgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFIZWxwZXJzIGdldFR5cGUoRUNsYXNzaWZpZXIgY2xhc3NpZmllcikgewotCQlpZihjbGFzc2lmaWVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JCUphdmFIZWxwZXJzIHR5cGUgPSAoKEphdmFIZWxwZXJzKWNsYXNzaWZpZXIpOwotCQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBqYXZhQ2xhc3NOYW1lIG11c3QgYmUgZnVsbHkgcXVhbGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRUeXBlKFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBFbnRlcnByaXNlQmVhbiBlamIpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZigoamF2YUNsYXNzTmFtZSA9PSBudWxsKSAgfHwgKGphdmFDbGFzc05hbWUuZXF1YWxzKCIiKSB8fCAoZWpiID09IG51bGwpKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlamIuZVJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQotCQlyZXR1cm4gZ2V0VHlwZShqYXZhQ2xhc3NOYW1lLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogamF2YUNsYXNzTmFtZSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgZ2V0VHlwZShTdHJpbmcgamF2YUNsYXNzTmFtZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHlwZShqYXZhQ2xhc3NOYW1lLCByZXNvdXJjZVNldCwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIGphdmFDbGFzc05hbWUgbXVzdCBiZSBmdWxseSBxdWFsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFIZWxwZXJzIGdldFR5cGUoU3RyaW5nIGphdmFDbGFzc05hbWUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBib29sZWFuIHRocm93RXhjSWZOb3RWYWxpZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKChqYXZhQ2xhc3NOYW1lID09IG51bGwpICB8fCAoamF2YUNsYXNzTmFtZS5lcXVhbHMoIiIpIHx8IChyZXNvdXJjZVNldCA9PSBudWxsKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyIGFMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoU3RyaW5nLCBSZXNvdXJjZVNldCwgYm9vbGVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoImludmFsaWQgcGFyYW1ldGVyOyBqYXZhQ2xhc3NOYW1lID0gezB9IGFuZCByZXNvdXJjZVNldCA9IHsxfSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VG9rZW5zKG5ldyBTdHJpbmdbXXtqYXZhQ2xhc3NOYW1lLCBTdHJpbmcudmFsdWVPZihyZXNvdXJjZVNldCl9KTsKLQkJCQllbnRyeS5hcHBlbmRTdGFja1RyYWNlKCk7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQotCQkvLyBJZiB0aGUgY2xhc3MgZG9lc24ndCBleGlzdCwgaXQgd2lsbCBiZSByZWZsZWN0ZWQKLQkJSmF2YUhlbHBlcnMgaGVscGVyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGphdmFDbGFzc05hbWUsIHJlc291cmNlU2V0KTsKLQkJaWYodGhyb3dFeGNJZk5vdFZhbGlkKSB7Ci0JCQlpc1ZhbGlkVHlwZShoZWxwZXIpOyAvLyBjaGVjayB0aGF0IHRoZSB0eXBlIGhhcyBiZWVuIHJlZmxlY3RlZCBwcm9wZXJseQotCQl9Ci0JCQotCQlyZXR1cm4gaGVscGVyOwotCX0KLQkKLQkvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nRW50cnkgZ2V0TG9nRW50cnkoKSB7Ci0JCWlmKGxvZ0VudHJ5ID09IG51bGwpIHsKLQkJICAgIGxvZ0VudHJ5ID0gbmV3IExvZ0VudHJ5KElFSkJWYWxpZGF0b3JDb25zdGFudHMuQlVORExFX05BTUUpOwotCQl9Ci0JCWxvZ0VudHJ5LnJlc2V0KCk7IC8vIHJlc2V0IHRoZSB2YWx1ZXMgc28gdGhhdCB3ZSdyZSBub3QgbG9nZ2luZyBzdGFsZSBkYXRhCi0JCXJldHVybiBsb2dFbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLSAgICAgICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgICAgICAgICBsb2dnZXIgPSBKMkVFQ29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLSAgICAgICAgcmV0dXJuIGxvZ2dlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFIZWxwZXJzIGdldFR5cGUoRmllbGQgZmllbGQpIHsKLQkJaWYoZmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiAoSmF2YUhlbHBlcnMpZmllbGQuZ2V0RVR5cGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIEphdmFDbGFzcyBwYXNzZWQgaW4gaGFzIHRoZSBNZXRob2QgZGVmaW5lZAotCSAqIG9uIGl0LiBSZXR1cm4gZmFsc2UgaWYgdGhlIE1ldGhvZCBpcyBkZWZpbmVkIG9uIGEgc3VwZXJ0eXBlIG9yIAotCSAqIGlzIG5vdCBkZWZpbmVkIG9uIHRoZSBjbGFzcyBhdCBhbGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIG9uQ2xhc3MoSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAobWV0aG9kID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBjbGF6ei5lcXVhbHMobWV0aG9kLmdldEphdmFDbGFzcygpKTsgCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBKYXZhQ2xhc3MgcGFzc2VkIGluIGhhcyB0aGUgRmllbGQgZGVmaW5lZAotCSAqIG9uIGl0LiBSZXR1cm4gZmFsc2UgaWYgdGhlIEZpZWxkIGlzIGRlZmluZWQgb24gYSBzdXBlcnR5cGUgb3IgCi0JICogaXMgbm90IGRlZmluZWQgb24gdGhlIGNsYXNzIGF0IGFsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gb25DbGFzcyhKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAoZmllbGQgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIGNsYXp6LmVxdWFscyhmaWVsZC5nZXRKYXZhQ2xhc3MoKSk7IAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkV4Y2VwdGlvbihKYXZhQ2xhc3MgZXhjZXB0aW9uLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGV4Y2VwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIEV4ZW1wdCBFSkJFeGNlcHRpb24gZnJvbSB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIGNoZWNrIGJlY2F1c2UgaXQnbGwgZHJpdmUgdXNlcnMgY3JhenkgdG8gc2VlIAotCQkvLyBpdCBmbGFnZ2VkIGFzIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4KLQkJdHJ5IHsKLQkJCWlmKFZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1NhbWVUeXBlKGV4Y2VwdGlvbiwgZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkVYQ0VQVElPTiwgYmVhbikpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2dnZWQgaW4gZ2V0VHlwZSgpCi0JCQkvLyBpZiBFSkJFeGNlcHRpb24gY2FuJ3QgYmUgZm91bmQsIHRoZW4gdGhlcmUncyBwcm9iYWJseSBhIHN5c3RlbSBKQVIgbWlzc2luZwotCQl9Ci0JCQotCQkvLyAxOC4xLjEgQXBwbGljYXRpb24gZXhjZXB0aW9ucwotCQkvLyBBbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gaXMgYW4gZXhjZXB0aW9uIGRlZmluZWQgaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYSBtZXRob2Qgb2YgdGhlIGVudGVycHJpc2UKLQkJLy8gQmVhbidzIGhvbWUgYW5kIGNvbXBvbmVudCBpbnRlcmZhY2VzLCBvdGhlciB0aGFuIHRoZSBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24uCi0JCXJldHVybiAhaXNSZW1vdGVFeGNlcHRpb24oZXhjZXB0aW9uLCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUmVtb3RlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBqYXZhUm1pUmVtb3RlID0gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URSwgYmVhbik7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBqYXZhUm1pUmVtb3RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUmVzZXJ2ZWRXb3JkKFN0cmluZyBuYW1lKSB7Ci0JCWlmKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlTdHJpbmcgdXBwZXJOYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQlmb3IoaW50IGk9MDsgaTxfcmVzZXJ2ZWRXb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJaWYodXBwZXJOYW1lLmVxdWFscyhfcmVzZXJ2ZWRXb3Jkc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1J1bnRpbWVFeGNlcHRpb24oSmF2YUNsYXNzIGNsYXp6LCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGNsYXp6ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIHJ1bnRpbWVFeGMgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTiwgYmVhbik7Ci0JCQlyZXR1cm4gaXNFeGNlcHRpb24oY2xhenosIHJ1bnRpbWVFeGMuZ2V0V3JhcHBlcigpKTsKLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1JlbW90ZUV4Y2VwdGlvbihKYXZhQ2xhc3MgY2xhenosIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSmF2YUhlbHBlcnMgcmVtb3RlRXhjID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9STUlfUkVNT1RFRVhDRVBUSU9OLCBiZWFuKTsKLQkJCXJldHVybiBpc0V4Y2VwdGlvbihjbGF6eiwgcmVtb3RlRXhjLmdldFdyYXBwZXIoKSk7Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjbGF6eiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNFeGNlcHRpb24oSmF2YUNsYXNzIGNsYXp6LCBKYXZhQ2xhc3MgZXhjZXB0aW9uKSB7Ci0JCWlmKChjbGF6eiA9PSBudWxsKSB8fCAoZXhjZXB0aW9uID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKGNsYXp6LCBleGNlcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yIGEgdHlwZSB3aGljaCBpbmhlcml0cy9leHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9uLgotCSAqIFRoZSBiZWFuIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgamF2YS51dGlsLkNvbGxlY3Rpb24gdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24oSmF2YUhlbHBlcnMgdHlwZSwgRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCUphdmFIZWxwZXJzIGphdmFVdGlsQ29sbGVjdGlvbiA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9DT0xMRUNUSU9OLCBiZWFuKTsKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20odHlwZSwgamF2YVV0aWxDb2xsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgZWl0aGVyIGphdmEudXRpbC5FbnVtZXJhdGlvbiwgb3IgYSB0eXBlIHdoaWNoIGluaGVyaXRzL2V4dGVuZHMgamF2YS51dGlsLkVudW1lcmF0aW9uLgotCSAqIFRoZSBiZWFuIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgamF2YS51dGlsLkVudW1lcmF0aW9uIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb21FbnVtZXJhdGlvbihKYXZhSGVscGVycyB0eXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxFbnVtZXJhdGlvbiA9IGdldFR5cGUoSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfVVRJTF9FTlVNRVJBVElPTiwgYmVhbik7Ci0JCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKHR5cGUsIGphdmFVdGlsRW51bWVyYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBlaXRoZXIgamF2YS51dGlsLlNldCwgb3IgYSB0eXBlIHdoaWNoIGluaGVyaXRzL2V4dGVuZHMgamF2YS51dGlsLlNldC4KLQkgKiBUaGUgYmVhbiBpcyBuZWVkZWQgdG8gcmV0cmlldmUgdGhlIGphdmEudXRpbC5TZXQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbVNldChKYXZhSGVscGVycyB0eXBlLCBFbnRlcnByaXNlQmVhbiBiZWFuKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJSmF2YUhlbHBlcnMgamF2YVV0aWxTZXQgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1VUSUxfU0VULCBiZWFuKTsKLQkJcmV0dXJuIGlzQXNzaWduYWJsZUZyb20odHlwZSwgamF2YVV0aWxTZXQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgZWl0aGVyIHRoZSBjb21wYXJlIHR5cGUsIG9yIGluaGVyaXRzL2V4dGVuZHMgdGhlIGNvbXBhcmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShKYXZhSGVscGVycyB0eXBlLCBKYXZhSGVscGVycyBjb21wYXJlVHlwZSkgewotCQlpZigodHlwZSA9PSBudWxsKSB8fCAoY29tcGFyZVR5cGUgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlpZih0eXBlLmlzUHJpbWl0aXZlKCkgfHwgY29tcGFyZVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJaWYodHlwZS5pc1ByaW1pdGl2ZSgpICYmIGNvbXBhcmVUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQlyZXR1cm4gdHlwZS5nZXRQcmltaXRpdmUoKS5lcXVhbHMoY29tcGFyZVR5cGUuZ2V0UHJpbWl0aXZlKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYodHlwZS5pc0FycmF5KCkgJiYgY29tcGFyZVR5cGUuaXNBcnJheSgpKSB7Ci0JCQlKYXZhQ2xhc3MgY2xhc3NUeXBlID0gdHlwZS5nZXRXcmFwcGVyKCk7Ci0JCQlKYXZhQ2xhc3MgY2xhc3NDb21wYXJlVHlwZSA9IGNvbXBhcmVUeXBlLmdldFdyYXBwZXIoKTsKLQkJCWlmKChjbGFzc1R5cGUgPT0gbnVsbCkgfHwgKGNvbXBhcmVUeXBlID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJSmF2YUhlbHBlcnMgZmluYWxUeXBlID0gKChBcnJheVR5cGUpY2xhc3NUeXBlKS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJCUphdmFIZWxwZXJzIGZpbmFsQ29tcGFyZVR5cGUgPSAoKEFycmF5VHlwZSljbGFzc0NvbXBhcmVUeXBlKS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJCXJldHVybiBpc0Fzc2lnbmFibGVGcm9tKGZpbmFsVHlwZSwgZmluYWxDb21wYXJlVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gY29tcGFyZVR5cGUuZ2V0V3JhcHBlcigpLmlzQXNzaWduYWJsZUZyb20odHlwZS5nZXRXcmFwcGVyKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBhc3NvY2lhdGVkIHdpdGggYSBxdWVyeSBlbGVtZW50IGluIGVqYi1qYXIueG1sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0Fzc29jaWF0ZWRXaXRoUXVlcnkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAsIE1ldGhvZCBtZXRob2QpIHsKLQkJLy8gQ2hlY2sgbWV0aG9kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHF1ZXJ5IGVsZW1lbnQgaW4gZWpiLWphci54bWwuCi0JCUxpc3QgcXVlcmllcyA9IGNtcC5nZXRRdWVyaWVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcXVlcmllcy5pdGVyYXRvcigpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUXVlcnkgcXVlcnkgPSAoUXVlcnkpaXRlcmF0b3IubmV4dCgpOwotCQkJUXVlcnlNZXRob2QgcXVlcnlNZXRob2QgPSBxdWVyeS5nZXRRdWVyeU1ldGhvZCgpOwotCQkJaWYocXVlcnlNZXRob2QgPT0gbnVsbCkgewotCQkJCS8vIExldCB0aGUgRUpCSmFyVlJ1bGUgcmVwb3J0IHRoaXMKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYoKHF1ZXJ5TWV0aG9kLmdldE5hbWUoKSA9PSBudWxsKSB8fCBxdWVyeU1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gTGV0IHRoZSBFSkJKYXJWUnVsZSByZXBvcnQgdGhpcwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihxdWVyeU1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0JlYW5NYW5hZ2VkU2Vzc2lvbihFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCWlmKGJlYW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihiZWFuLmlzRW50aXR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gKCgoU2Vzc2lvbiliZWFuKS5nZXRUcmFuc2FjdGlvblR5cGUoKS5nZXRWYWx1ZSgpID09IFRyYW5zYWN0aW9uVHlwZS5CRUFOKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2QgaXMgdGhlIHN0YXRpYyBpbml0aWFsaXplciB1c2VkIGZvciBpbnRlcmZhY2VzICgiPGNsaW5pdD4iKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsaW5pdE1ldGhvZChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCI8Y2xpbml0PiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSk5ESU5hbWluZ0NvbnRleHQoRmllbGQgZmllbGQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpcyBkZWZpbmVkIG9uIGphdmEubGFuZy5PYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUxhbmdPYmplY3RGaWVsZChFbnRlcnByaXNlQmVhbiBiZWFuLCBGaWVsZCBmaWVsZCkgewotCQlyZXR1cm4gaXNTYW1lVHlwZShiZWFuLCBmaWVsZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCksIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBkZWZpbmVkIG9uIG5hbWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc093bmVkQnkoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNTYW1lVHlwZShiZWFuLCBtZXRob2QuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpLCBjbGFzc05hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBjbGFzcyBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZWQgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2FtZVR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIG93bmVyLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBoZWxwZXIgPSBnZXRUeXBlKGNsYXNzTmFtZSwgYmVhbik7Ci0JCQlpZihoZWxwZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJSmF2YUNsYXNzIG9iamVjdCA9IGhlbHBlci5nZXRXcmFwcGVyKCk7Ci0JCQkKLQkJCXJldHVybiBpc1NhbWVUeXBlKG93bmVyLCBvYmplY3QpOwotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgZ2l2ZW4gY2xhc3MgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NhbWVUeXBlKEphdmFIZWxwZXJzIG93bmVyLCBKYXZhSGVscGVycyBvYmplY3QpIHsKLQkJaWYob3duZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihvYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihvd25lci5pc1ByaW1pdGl2ZSgpICYmIG9iamVjdC5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkvLyBCb3RoIGFyZSBKYXZhRGF0YVR5cGUKLQkJCXJldHVybiBvd25lci5nZXRQcmltaXRpdmUoKS5lcXVhbHMob2JqZWN0LmdldFByaW1pdGl2ZSgpKTsKLQkJfQotCQllbHNlIGlmKG93bmVyLmlzQXJyYXkoKSAmJiBvYmplY3QuaXNBcnJheSgpKSB7Ci0JCQkvLyBCb3RoIGFyZSBBcnJheVR5cGUKLQkJCUFycmF5VHlwZSBvd25lckFycmF5ID0gKEFycmF5VHlwZSlvd25lcjsKLQkJCUFycmF5VHlwZSBvYmplY3RBcnJheSA9IChBcnJheVR5cGUpb2JqZWN0OwotCQkJcmV0dXJuIGlzU2FtZVR5cGUob3duZXJBcnJheS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKSwgb2JqZWN0QXJyYXkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCkpOwotCQl9Ci0JCWVsc2UgaWYoKG93bmVyLmdldFdyYXBwZXIoKSAhPSBudWxsKSAmJiAob2JqZWN0LmdldFdyYXBwZXIoKSAhPSBudWxsKSkgewotCQkJLy8gQm90aCBhcmUgSmF2YUNsYXNzCi0JCQlyZXR1cm4gb3duZXIuZ2V0V3JhcHBlcigpLmVxdWFscyhvYmplY3QuZ2V0V3JhcHBlcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG1pc21hdGNoaW5nIEphdmFIZWxwZXJzIHR5cGUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGRlZmluZWQgb24gamF2YS5sYW5nLk9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhTGFuZ09iamVjdE1ldGhvZChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBpc1NhbWVUeXBlKGJlYW4sIG1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCksIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX0xBTkdfT0JKRUNUKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTGVnYWxSTUlfSUlPUEluaGVyaXRhbmNlKEphdmFDbGFzcyBjbGF6eikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTGVnYWxSTUlfSUlPUFR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUhlbHBlcnMgaGVscGVyKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYoaGVscGVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gaXNTZXJpYWxpemFibGUoaGVscGVyLCBiZWFuKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTG9jYWxUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFIZWxwZXJzIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCWlmKGlzU2FtZVR5cGUodHlwZSwgZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgYmVhbikpKSB7Ci0JCQkJLy8gSWYgdGhlcmUncyBhbiB1bmRlZmluZWQgcHJpbWFyeSBrZXkgKGphdmEubGFuZy5PYmplY3QpLCBkb24ndCBmbGFnIGl0IGFzIGEgbG9jYWwgdHlwZS4KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIExldCB0aGUgREQgdmFsaWRhdGlvbiByZXBvcnQgdGhpcy4KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoaXNBc3NpZ25hYmxlRnJvbShiZWFuLmdldExvY2FsSW50ZXJmYWNlKCksIHR5cGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYoaXNBc3NpZ25hYmxlRnJvbShiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpLCB0eXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCS8vIEJpdCBvZiBhIHBlcmZvcm1hbmNlIGhhY2sgaGVyZS4KLQkJLy8gRG9uJ3Qgd2FudCB0byBsb2FkIGFuZCBwYXJzZSB0aGUgZW50aXJlIEVKQkphciBqdXN0IHRvIGNoZWNrIGlmCi0JCS8vIHRoaXMgdHlwZSBpcyBsb2NhbCwgc28gYXNzdW1lIHRoYXQgaWYgdGhlIGV4dGVuZHMgCi0JCS8vIGphdmF4LmVqYi5FSkJMb2NhbEhvbWUgb3IgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0LCB0aGVuIGl0J3MgbG9jYWwuCi0JCXRyeSB7Ci0JCQlKYXZhSGVscGVycyBlamJMb2NhbEhvbWUgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCTE9DQUxIT01FLCBiZWFuKTsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZWpiTG9jYWxIb21lLCB0eXBlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIGlnbm9yZSBhbmQgdHJ5IG90aGVyIHR5cGUKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCUphdmFIZWxwZXJzIGVqYkxvY2FsT2JqZWN0ID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkxPQ0FMT0JKRUNULCBiZWFuKTsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZWpiTG9jYWxPYmplY3QsIHR5cGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGV4YykgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlc1Vua25vd25QcmltYXJ5S2V5KEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJcmV0dXJuIHVzZXNVbmtub3duUHJpbWFyeUtleSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSliZWFuKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VzVW5rbm93blByaW1hcnlLZXkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYoY21wID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWlmKGlzU2FtZVR5cGUoY21wLmdldFByaW1hcnlLZXkoKSwgZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgY21wKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQkJLy8gSWYgamF2YS5sYW5nLk9iamVjdCBjYW4ndCBiZSBmb3VuZCwgdGhlcmUncyBiaWdnZXIgcHJvYmxlbXMgdGhhbiB2YWxpZGF0aW5nCi0JCQkvLyBpdCBtaXN0YWtlbmx5Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZihjbXAuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJTGlzdCBjbXBGaWVsZHMgPSBjbXAuZ2V0RmlsdGVyZWRGZWF0dXJlcyhMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5zaW5nbGV0b24oKSk7Ci0JCQlpZihjbXBGaWVsZHMgIT0gbnVsbCAmJiAhY21wRmllbGRzLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjbXBGaWVsZHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUNNUEF0dHJpYnV0ZSBhdHRyaWIgPSAoQ01QQXR0cmlidXRlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihpc1Vua25vd25QcmltYXJ5S2V5KGF0dHJpYikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkgIH0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1VuaWRpcmVjdGlvbmFsUmVsYXRpb25zaGlwKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlKSB7Ci0JCS8vIFBhZ2UgMTMxIG9mIEVKQiAyLjA6Ci0JCS8vIEEgdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGlzIGltcGxlbWVudGVkIHdpdGggYSBjbXItZmllbGQgb24gdGhlIGVudGl0eSBiZWFuIGluc3RhbmNlIGZyb20gd2hpY2gKLQkJLy8gbmF2aWdhdGlvbiBjYW4gdGFrZSBwbGFjZSwgYW5kIG5vIHJlbGF0ZWQgY21yLWZpZWxkIG9uIHRoZSBlbnRpdHkgYmVhbiBpbnN0YW5jZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlCi0JCS8vIHJlbGF0aW9uc2hpcC4gVW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBhcmUgdHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgQmVhbiBQcm92aWRlciB3aXNoZXMgdG8gcmVzdHJpY3QKLQkJLy8gdGhlIHZpc2liaWxpdHkgb2YgYSByZWxhdGlvbnNoaXAuCi0JCUVudGl0eSBzb3VyY2VFbnRpdHkgPSByb2xlLmdldFNvdXJjZSgpLmdldEVudGl0eUJlYW4oKTsKLQkJaWYoc291cmNlRW50aXR5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIXNvdXJjZUVudGl0eS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlDTVJGaWVsZCBzb3VyY2VDTVJGaWVsZCA9IHJvbGUuZ2V0Q21yRmllbGQoKTsKLQkJaWYoc291cmNlQ01SRmllbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlFSkJSZWxhdGlvbnNoaXBSb2xlIG9wcG9zaXRlID0gcm9sZS5nZXRPcHBvc2l0ZSgpOwotCQlpZihvcHBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUNNUkZpZWxkIG9wcG9zaXRlQ01SRmllbGQgPSBvcHBvc2l0ZS5nZXRDbXJGaWVsZCgpOwotCQlpZihvcHBvc2l0ZUNNUkZpZWxkICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JCQotCX0KLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNVbmtub3duUHJpbWFyeUtleShDTVBBdHRyaWJ1dGUgYXR0cmliKSB7Ci0JCWlmKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIFNlY3Rpb24gMTAuOC4zCi0JCS8vIEJ5IGRlZmluaXRpb24sIHRoZSBkZXBsb3llcidzIGdlbmVyYXRlZCBDTVAgZmllbGQncyBuYW1lIGlzIGRlZmluZWQgaW4gdGhlIAotCQkvLyBDb250YWluZXJNYW5hZ2VkRW50aXR5LldBU19HRU5FUkFURURfU1RSSU5HX0ZJRUxEIGNvbnN0YW50LgotCQlyZXR1cm4gQ29udGFpbmVyTWFuYWdlZEVudGl0eS5XQVNfR0VORVJBVEVEX1NUUklOR19GSUVMRC5lcXVhbHMoYXR0cmliLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ByaW1pdGl2ZVByaW1hcnlLZXkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYoY21wID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlpZigoY21wLmdldFByaW1LZXlGaWVsZCgpICE9IG51bGwpICYmICFjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZUlzUHJveHkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaWMoRmllbGQgZmllbGQpIHsKLQkJaWYgKCBmaWVsZCA9PSBudWxsICkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCA9PSBmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaWMoIE1ldGhvZCBtZXRob2QgKSB7Ci0JCWlmICggbWV0aG9kID09IG51bGwgKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMID09IG1ldGhvZC5nZXRKYXZhVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgZ2l2ZW4gQ2xhc3MgdHlwZSBpcyBzZXJpYWxpemFibGUuCi0JICoKLQkgKiBSTUkgMS4zIHNwZWNpZmljYXRpb24KLQkgKiAyLjYgUGFyYW1ldGVyIFBhc3NpbmcgaW4gUmVtb3RlIE1ldGhvZCBJbnZvY2F0aW9uCi0JICogQW4gYXJndW1lbnQgdG8sIG9yIGEgcmV0dXJuIHZhbHVlIGZyb20sIGEgcmVtb3RlIG9iamVjdCBjYW4gYmUgYW55IG9iamVjdCB0aGF0Ci0JICogaXMgc2VyaWFsaXphYmxlLiBUaGlzIGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcywgcmVtb3RlIG9iamVjdHMsIGFuZCBub24tcmVtb3RlCi0JICogb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgamF2YS5pby5TZXJpYWxpemFibGUgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1NlcmlhbGl6YWJsZShKYXZhSGVscGVycyBjbCwgRW50ZXJwcmlzZUJlYW4gYmVhbikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKGNsID09IG51bGwpIHsKLQkJCS8vIGFzc3VtZSBpdCdzIHZvaWQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCi0JCS8vIENoZWNrIGlmIHRoZSB0eXBlIHJlZmxlY3RlZCBwcm9wZXJseQotCQlpc1ZhbGlkVHlwZShjbCk7Ci0JCQotCQlpZiAoIGNsLmlzUHJpbWl0aXZlKCkgKSB7Ci0JCQkvLyBKYXZhSGVscGVycyBpcyBhIEphdmFEYXRhVHlwZQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZihjbC5pc0FycmF5KCkpIHsKLQkJCUFycmF5VHlwZSBhcnJheSA9IChBcnJheVR5cGUpY2w7Ci0JCQlpZihhcnJheS5pc1ByaW1pdGl2ZUFycmF5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCS8vIGVsc2UsIG5vdCBwcmltaXRpdmUsIHNvIGNoZWNrIGl0cyBjb250ZW50cwotCQkJY2wgPSBhcnJheS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQotCQlKYXZhSGVscGVycyByZW1vdGUgPSBnZXRUeXBlKElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBX1JNSV9SRU1PVEUsIGJlYW4pOwotCQlpZihpc0Fzc2lnbmFibGVGcm9tKGNsLCByZW1vdGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSmF2YUhlbHBlcnMgc2VyaWFsID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9JT19TRVJJQUxJWkFCTEUsIGJlYW4pOwotCQlyZXR1cm4gaXNBc3NpZ25hYmxlRnJvbShjbCwgc2VyaWFsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU3RhdGVmdWwoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZihiZWFuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoYmVhbi5pc0VudGl0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcmV0dXJuICgoKFNlc3Npb24pYmVhbikuZ2V0U2Vzc2lvblR5cGUoKS5nZXRWYWx1ZSgpID09IFNlc3Npb25UeXBlLlNUQVRFRlVMKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU3RhdGVsZXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKGJlYW4uaXNFbnRpdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCXJldHVybiAoKChTZXNzaW9uKWJlYW4pLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUxFU1MpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5uYW1lZFBhY2thZ2UoSmF2YVBhY2thZ2UgcGtnKSB7Ci0JCWlmKHBrZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJU3RyaW5nIHBrZ05hbWUgPSBwa2cuZ2V0TmFtZSgpOwotCQlyZXR1cm4gKChwa2dOYW1lID09IG51bGwpIHx8IChwa2dOYW1lLmVxdWFscygiIikpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZEphdmFJZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0JCWlmKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQljaGFyW10gbmFtZUNoYXIgPSBuYW1lLnRvQ2hhckFycmF5KCk7Ci0JCWlmKG5hbWVDaGFyLmxlbmd0aCA8IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQobmFtZUNoYXJbMF0pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYm9vbGVhbiBpc1ZhbGlkSmF2YUlkZW50aWZpZXIgPSB0cnVlOwotCQlmb3IoaW50IGk9MTsgaTxuYW1lQ2hhci5sZW5ndGg7IGkrKykgewotCQkJaWYoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChuYW1lQ2hhcltpXSkpIHsKLQkJCQlpc1ZhbGlkSmF2YUlkZW50aWZpZXIgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNWYWxpZEphdmFJZGVudGlmaWVyOwotCX0KLQkKLQkvKioKLQkgKiA2LjUuMyBUaGUgb3B0aW9uYWwgU2Vzc2lvblN5bmNocm9uaXphdGlvbiBpbnRlcmZhY2UKLQkgKi4uLgotCSAqIE9ubHkgYSBzdGF0ZWZ1bCBTZXNzaW9uIGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBtYXkgCi0JICogaW1wbGVtZW50IHRoZSBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZS4KLQkgKi4uLgotCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgU2Vzc2lvbiBiZWFuIHdpdGggYmVhbi1tYW5hZ2VkIHRyYW5zYWN0aW9uIHRvIHJlbHkgb24gdGhlIAotCSAqIHN5bmNocm9uaXphdGlvbiBjYWxsIGJhY2tzIGJlY2F1c2UgdGhlIGJlYW4gaXMgaW4gY29udHJvbCBvZiB0aGUgY29tbWl0IHRoZSBiZWFuIAotCSAqIGtub3dzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCBhbmQgaXQga25vd3MgdGhlIG91dGNvbWUgb2YgdGhlIAotCSAqIHRyYW5zYWN0aW9uIGNvbW1pdC4KLQkgKi4uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkU2Vzc2lvblR5cGVFbGVtZW50KFNlc3Npb24gc2Vzc2lvbikgewotCQlpZihzZXNzaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gY2hlY2sgc3ludGF4Ci0JCWlmKCFzZXNzaW9uLmlzU2V0U2Vzc2lvblR5cGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihzZXNzaW9uLmdldFNlc3Npb25UeXBlKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZihzZXNzaW9uLmdldFNlc3Npb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBTZXNzaW9uVHlwZS5TVEFURUZVTCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKS5nZXRWYWx1ZSgpID09IFNlc3Npb25UeXBlLlNUQVRFTEVTUykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZFRyYW5zYWN0aW9uVHlwZUVsZW1lbnQoU2Vzc2lvbiBzZXNzaW9uQmVhbikgewotCQlpZihzZXNzaW9uQmVhbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKCFzZXNzaW9uQmVhbi5pc1NldFRyYW5zYWN0aW9uVHlwZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb25CZWFuLmdldFRyYW5zYWN0aW9uVHlwZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoc2Vzc2lvbkJlYW4uZ2V0VHJhbnNhY3Rpb25UeXBlKCkuZ2V0VmFsdWUoKSA9PSBUcmFuc2FjdGlvblR5cGUuQkVBTikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmKHNlc3Npb25CZWFuLmdldFRyYW5zYWN0aW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gVHJhbnNhY3Rpb25UeXBlLkNPTlRBSU5FUikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHR5cGUgaXMgbm90IHJlZmxlY3RlZCBwcm9wZXJseSwgdGhyb3cgYW4gSW52YWxpZElucHV0RXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBpc1ZhbGlkVHlwZShKYXZhSGVscGVycyB0eXBlKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQkvLyBDaGVhdGluZyBoZXJlLiBTaG91bGQgdGVjaG5pY2FsbHkgYWNjZXNzIHRoZSBNc2dMb2dnZXIgZnJvbSB0aGUgSUVKQlZhbGlkYXRpb25Db250ZXh0Ci0JCQkvLyB0eXBlLCBidXQgd2hlbiBJIHN0YXJ0ZWQgY2hhbmdpbmcgdGhpcyBtZXRob2QgYW5kIHRoZSBpc1ZhbGlkVHlwZUhpZXJhcmNoeSBtZXRob2QsCi0JCQkvLyBJIGVuZGVkIHVwIGNoYW5naW5nIDQyIGZpbGVzIGJlY2F1c2UgdGhlc2UgdHdvIG1ldGhvZHMgYXJlIGNhbGxlZCBkaXJlY3RseSBvcgotCQkJLy8gaW5kaXJlY3RseSBmcm9tIGFsbW9zdCBldmVyeXdoZXJlLiBUaGF0IHdhcyB0b28gbXVjaCBjaGFuZ2UsIHNvIEkgY2hlYXRlZC4KLQkJCUxvZ2dlciBhTG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihhTG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc1ZhbGlkVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgidHlwZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5hcHBlbmRTdGFja1RyYWNlKCk7Ci0JCQkJYUxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKLQkJfQotCQotCQlpZih0eXBlLmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgdHlwZSByZWZsZWN0ZWQgcHJvcGVybHkuIElmIHRoZXJlJ3MgYW55IGNvbXBpbGUgZXJyb3JzLCBvciByZWZlcmVuY2VzIHRvIHVucmVzb2x2ZWQKLQkJCS8vIGNsYXNzZXMsIGNhbiBvdXRwdXQgc29tZSBtaXN0YWtlbiBlcnJvciBtZXNzYWdlcy4KLQkJCS8vIGUuZy4gY2xhc3MgaXMgbm90IHNlcmlhbGl6YWJsZQotCQkJSmF2YUNsYXNzIHdyYXBwZXIgPSB0eXBlLmdldFdyYXBwZXIoKTsKLQkJCWlmKHR5cGUuaXNBcnJheSgpKSB7Ci0JCQkJQXJyYXlUeXBlIGFycmF5ID0gKEFycmF5VHlwZSl0eXBlOwotCQkJCWlzVmFsaWRUeXBlKGFycmF5LmdldEZpbmFsQ29tcG9uZW50VHlwZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKCF3cmFwcGVyLmlzRXhpc3RpbmdUeXBlKCkpIHsKLQkJCQkJTG9nZ2VyIGFMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IGdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRleHQoIiF3cmFwcGVyLmlzRXhpc3RpbmdUeXBlKCk7IHR5cGUgaXMgIiArIHdyYXBwZXIuZ2V0SmF2YU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJCQl9Ci0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24od3JhcHBlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSB0eXBlIGlzIG5vdCByZWZsZWN0ZWQgcHJvcGVybHksIHRocm93IGFuIEludmFsaWRJbnB1dEV4Y2VwdGlvbi4KLQkgKiBUaGlzIG1ldGhvZCwgdW5saWtlIGlzVmFsaWRUeXBlLCBhbHNvIGNoZWNrcyBldmVyeSBpbnRlcmZhY2UgYW5kIGNsYXNzCi0JICogcGFyZW50IG9mIHRoZSBwYXNzZWQtaW4gdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgaXNWYWxpZFR5cGVIaWVyYXJjaHkoRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUhlbHBlcnMgdHlwZSkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCWlmKHR5cGUgPT0gbnVsbCkgewotCQkJLy8gQ2hlYXRpbmcgaGVyZS4gU2hvdWxkIHRlY2huaWNhbGx5IGFjY2VzcyB0aGUgTXNnTG9nZ2VyIGZyb20gdGhlIElFSkJWYWxpZGF0aW9uQ29udGV4dAotCQkJLy8gdHlwZSwgYnV0IHdoZW4gSSBzdGFydGVkIGNoYW5naW5nIHRoaXMgbWV0aG9kIGFuZCB0aGUgaXNWYWxpZFR5cGUgbWV0aG9kLAotCQkJLy8gSSBlbmRlZCB1cCBjaGFuZ2luZyA0MiBmaWxlcyBiZWNhdXNlIHRoZXNlIHR3byBtZXRob2RzIGFyZSBjYWxsZWQgZGlyZWN0bHkgb3IKLQkJCS8vIGluZGlyZWN0bHkgZnJvbSBhbG1vc3QgZXZlcnl3aGVyZS4gVGhhdCB3YXMgdG9vIG11Y2ggY2hhbmdlLCBzbyBJIGNoZWF0ZWQuCi0JCQlMb2dnZXIgYUxvZ2dlciA9IGdldE1zZ0xvZ2dlcigpOwotCQkJaWYoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNWYWxpZFR5cGVIaWVyYXJjaHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoInR5cGUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuYXBwZW5kU3RhY2tUcmFjZSgpOwotCQkJCWFMb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7Ci0JCX0KLQkKLQkJLy8gRmlyc3QsIGNoZWNrIHRoaXMgaGVscGVyIGl0c2VsZi4KLQkJaXNWYWxpZFR5cGUodHlwZSk7Ci0JCUphdmFIZWxwZXJzIGphdmFMYW5nT2JqZWN0ID0gZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVCwgYmVhbik7Ci0JCWlmKGlzU2FtZVR5cGUodHlwZSwgamF2YUxhbmdPYmplY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIElmIHRoaXMgaGVscGVyIGV4aXN0cywgYW5kIGlzIG5vdCBqYXZhLmxhbmcuT2JqZWN0LCB0aGVuIGNoZWNrIGV2ZXJ5IHN1cGVydHlwZS4KLQkJSmF2YUNsYXNzIGNsYXNzVHlwZSA9IHR5cGUuZ2V0V3JhcHBlcigpOwotCQlpZihjbGFzc1R5cGUgPT0gbnVsbCkgewotCQkJTG9nZ2VyIGFMb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGFMb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmlzVmFsaWRUeXBlSGllcmFyY2h5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJ0eXBlLmdldFdyYXBwZXIoKSByZXR1cm5zIG51bGw7IHR5cGUgaXMgIiArIHR5cGUuZ2V0SmF2YU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhTG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOwotCQl9Ci0JCi0JCS8vIENoZWNrIHRoZSBzdXBlcmNsYXNzLiBTaW5jZSB0eXBlIGlzIG5vdCBqYXZhLmxhbmcuT2JqZWN0LCB0aGVyZSBpcyBhdCBsZWFzdAotCQkvLyB0aGUgamF2YS5sYW5nLk9iamVjdCBzdXBlcmNsYXNzLgotCQlpZighY2xhc3NUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLQkJCUphdmFDbGFzcyBzdXBlclR5cGUgPSBjbGFzc1R5cGUuZ2V0U3VwZXJ0eXBlKCk7Ci0JCQlpc1ZhbGlkVHlwZUhpZXJhcmNoeShiZWFuLCBzdXBlclR5cGUpOwotCQl9Ci0JCi0JCS8vIENoZWNrIHRoZSBzdXBlcmludGVyZmFjZXMsIGlmIHRoZXkgZXhpc3QuCi0JCUxpc3Qgc3VwZXJJbnRlcmZhY2VzID0gY2xhc3NUeXBlLmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCWlmKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHN1cGVySW50ZXJmYWNlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSmF2YUNsYXNzIHN1cGVySW50ZiA9IChKYXZhQ2xhc3MpaXRlcmF0b3IubmV4dCgpOwotCQkJCWlzVmFsaWRUeXBlSGllcmFyY2h5KGJlYW4sIHN1cGVySW50Zik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUk1JIDEuMyBwYWdlIDYgc2VjdGlvbiAyLjQuMSwgCi0JICogICAgQSByZW1vdGUgbWV0aG9kIGRlY2xhcmF0aW9uIG11c3QgaW5jbHVkZSB0aGUgZXhjZXB0aW9uIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiAob3Igb25lCi0JICogICAgb2YgaXRzIHVwc2VyY2xhc3NlcyBzdWNoIGFzIGphdmEuaW8uSU9FeGNlcHRpb24gb3IgamF2YS5sYW5nLkV4Y2VwdGlvbikgaW4gaXRzIHRocm93cwotCSAqICAgIGNsYXVzZSwgaW4gYWRkaXRpb24gdG8gYW55IGFwcGxpY2F0aW9uLXNwZWNpZmljIGV4Y2VwdGlvbnMgKG5vdGUgdGhhdCBhcHBsaWNhdGlvbiAKLQkgKiAgICBzcGVjaWZpYyBleGNlcHRpb25zIGRvIG5vdCBoYXZlIHRvIGV4dGVuZCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NSZW1vdGVFeGNlcHRpb25PclBhcmVudChFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRocm93c0V4Y2VwdGlvbk9yUGFyZW50KGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URUVYQ0VQVElPTik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGNoZWNrcyBpZiBSZW1vdGVFeGNlcHRpb24gKGV4YWN0bHksIG5vdCBFeGNlcHRpb24gb3IgSU9FeGNlcHRpb24pCi0JICogaXMgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkb2VzTm90VGhyb3dSZW1vdGVFeGNlcHRpb24oRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAhdGhyb3dzRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFfUk1JX1JFTU9URUVYQ0VQVElPTik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRocm93c0V4Y2VwdGlvbihiZWFuLCBtZXRob2QsIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfT0JKRUNUTk9URk9VTkRFWENFUFRJT04pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzRmluZGVyRXhjZXB0aW9uKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhyb3dzRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9GSU5ERVJFWENFUFRJT04pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzQ3JlYXRlRXhjZXB0aW9uKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhyb3dzRXhjZXB0aW9uKGJlYW4sIG1ldGhvZCwgSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9DUkVBVEVFWENFUFRJT04pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzQXBwbGljYXRpb25FeGNlcHRpb24oTWV0aG9kIG1ldGhvZCwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlMaXN0IGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJaWYoZXhjZXB0aW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBDSEtKMjQxOSA9IHswfSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgamF2YS5sYW5nLkV4Y2VwdGlvbi4gUmVhZCBzZWN0aW9uIDE4LjEuMSwgMTguMi4xIG9mIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYoaXNBcHBsaWNhdGlvbkV4Y2VwdGlvbihleGNlcHRpb24sIGJlYW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2QgdGhyb3dzIHRoZSBuYW1lZCBleGNlcHRpb24gb3IgYSBjbGFzcyB3aGljaCBleHRlbmRzIHRoZSBuYW1lZCBleGNlcHRpb24uCi0JICovCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0aHJvd3NFeGNlcHRpb24oRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGV4Y2VwdGlvbk5hbWUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlMaXN0IGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7Ci0JCUphdmFDbGFzcyBleGNlcHRpb24gPSBnZXRUeXBlKGV4Y2VwdGlvbk5hbWUsIGJlYW4pLmdldFdyYXBwZXIoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQ2xhc3MgZXhjID0gKEphdmFDbGFzcylpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihpc0Fzc2lnbmFibGVGcm9tKGV4YywgZXhjZXB0aW9uKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lZCBleGNlcHRpb24sIGFuIGV4Y2VwdGlvbiB3aGljaCBleHRlbmRzIHRoZSBuYW1lZCBleGNlcHRpb24sIG9yIG9uZSBvZiB0aGUgcGFyZW50cyBvZiB0aGUgbmFtZWQgZXhjZXB0aW9uIChlLmcuIGphdmEubGFuZy5FeGNlcHRpb24pLgotCSAqIFVzZSB0aGlzIG1ldGhvZCBpZiBpdCBuZWVkcyB0byBiZSBkZXRlY3RlZCB0aGF0IGFuIGV4Y2VwdGlvbiBjYW4gYmUgdGhyb3duIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHNvbWV0aGluZyBnZW5lcmljIGxpa2UgamF2YS5sYW5nLkV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGhyb3dzRXhjZXB0aW9uT3JQYXJlbnQoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIGV4Y2VwdGlvbk5hbWUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewotCQlpZihtZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlKYXZhQ2xhc3MgZXhjZXB0aW9uID0gZ2V0VHlwZShleGNlcHRpb25OYW1lLCBiZWFuKS5nZXRXcmFwcGVyKCk7Ci0KLQkJTGlzdCBleGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUphdmFDbGFzcyBleGMgPSAoSmF2YUNsYXNzKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZXhjLCBleGNlcHRpb24pKSB7Ci0JCQkJLy8gQXNzaWduYWJsZSBmcm9tIHRoZSBuYW1lZCBleGNlcHRpb24sIGUuZy4gUmVtb3RlRXhjZXB0aW9uIG9yIGEgY2hpbGQgb2YgUmVtb3RlRXhjZXB0aW9uCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWlmKGlzQXNzaWduYWJsZUZyb20oZXhjZXB0aW9uLCBleGMpKSB7Ci0JCQkJLy8gVGhlIG5hbWVkIGV4Y2VwdGlvbiBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIG1ldGhvZCBleGNlcHRpb24sIGUuZy4gamF2YS5sYW5nLkV4Y2VwdGlvbgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VzQ29sbGVjdGlvbkNsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKLQkJaWYoKGJlYW4gPT0gbnVsbCkgfHwgKG1ldGhvZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlKYXZhUGFyYW1ldGVyW10gcGFybXMgPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JCWlmKHBhcm1zICE9IG51bGwpIHsKLQkJCWZvcihpbnQgaT0wOyBpPHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSmF2YVBhcmFtZXRlciBwYXJtID0gcGFybXNbaV07Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoaXNBc3NpZ25hYmxlRnJvbUNvbGxlY3Rpb24ocGFybS5nZXRKYXZhVHlwZSgpLCBiZWFuKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlIGFuZCB0ZXN0IG5leHQgcGFybQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIE5vdyBjaGVjayB0aGUgcmV0dXJuIHR5cGUKLQkJdHJ5IHsKLQkJCWlmKGlzQXNzaWduYWJsZUZyb21Db2xsZWN0aW9uKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGJlYW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VzTG9jYWxUeXBlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7Ci0JCWlmKChiZWFuID09IG51bGwpIHx8IChtZXRob2QgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJSmF2YVBhcmFtZXRlcltdIHBhcm1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZihwYXJtcyAhPSBudWxsKSB7Ci0JCQlmb3IoaW50IGk9MDsgaTxwYXJtcy5sZW5ndGg7IGkrKykgewotCQkJCUphdmFQYXJhbWV0ZXIgcGFybSA9IHBhcm1zW2ldOwotCQkJCWlmKGlzTG9jYWxUeXBlKGJlYW4sIHBhcm0uZ2V0SmF2YVR5cGUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gTm93IGNoZWNrIHRoZSByZXR1cm4gdHlwZQotCQlpZihpc0xvY2FsVHlwZShiZWFuLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSTWVzc2FnZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dBUk1lc3NhZ2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyYzAwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSTWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotCi0KLS8qKgotICogTWVzc2FnZSBrZXkgY29uc3RhbnRzIGZvciBXQVIgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBXQVJNZXNzYWdlQ29uc3RhbnRzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFTWVzc2FnZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX1ZBTElEQVRPUl9JRCA9ICJXQVJfVkFMSURBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9NT0RFTF9OQU1FID0gIldBUl9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRCA9ICJFUlJPUl9XQVJfVkFMSURBVElPTl9GQUlMRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TTUFMTF9JQ09OID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU01BTExfSUNPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0xBUkdFX0lDT04gPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9MQVJHRV9JQ09OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX1NFUlZMRVRfTUFQUElORyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX0pTUCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfSlNQIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19UTEQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1RMRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XRUxDT01FX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVVJMIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9NQVBQSU5HID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX01BUFBJTkciIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfU0VSVkxFVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FSkJfUkVGIiA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlkgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlkiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlkgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRSIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSFRUUF9DTUQiIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9UUkFOU1BPUlQgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1RSQU5TUE9SVCIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0pTUEZJTEVfUkVGID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRiIgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1dFTENPTUVfRklMRSA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0UgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0UiIDsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfQVVUSF9NRVRIT0QgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0FVVEhfTUVUSE9EIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lHTk9SRV9GT1JNX0xPR0lOIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMiA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIyIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIzIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIyID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMiIgOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMyA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjMiIDsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9GSUxURVIgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRklMVEVSIiA7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkcgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkciIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVMgPSAiRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OID0gIkVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSU5WQUxJRF9XQVJfRklMRSA9ICJFUlJPUl9JTlZBTElEX1dBUl9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9QQVJTRV9MSU5FQ09MID0gIldBUl9ERF9QQVJTRV9MSU5FQ09MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9QQVJTRV9MSU5FID0gIldBUl9ERF9QQVJTRV9MSU5FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9ERF9DQU5OT1RfT1BFTl9ERCA9ICJXQVJfRERfQ0FOTk9UX09QRU5fREQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0REX1BBUlNFX05PSU5GTyA9ICJXQVJfRERfUEFSU0VfTk9JTkZPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0VBUl9JTlZBTElEX0NPTlRFWFRfUk9PVCA9ICJFUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1JFU19TSEFSSU5HX1NDT1BFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9SRVNfU0hBUklOR19TQ09QRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRU5WX0VOVFJZID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FTlZfRU5UUlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX0NPREUJID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9DT0RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XTFBfUFJPSkVDVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0xQX1BST0pFQ1QiOyAvLyROT04tTkxTLTEkCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVhDRVBUSU9OX1RZUEUgPSAiTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVCA9ICJNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0NPTkZMSUNUSU5HX1dMUF9QUk9KRUNUIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFID0gIk1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FSkJfUkVGX1RZUEUiOyAgLy8kTk9OLU5MUy0xJAotCS8vSjJFRSAxNCBNZXNzYWdlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOID0gIk1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCQotCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdlMWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIndhcnZhbGlkYXRpb24iKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBpbnQgeCkgewotCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV2FyVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV2FyVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTRhMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dhclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRUpCTG9jYWxSZWZJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4ubmxzLlJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFdhclZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uSjJFRVZhbGlkYXRvciBpbXBsZW1lbnRzIFdBUk1lc3NhZ2VDb25zdGFudHMgewotICBwcm90ZWN0ZWQgV0FSRmlsZSB3YXJGaWxlOwotICBwcm90ZWN0ZWQgV2ViQXBwIHdlYkREOwotICBwcml2YXRlICAgSGFzaHRhYmxlIGh0dHBNZXRob2RzID0gbnVsbCA7Ci0KLSAgLy8gT3B0aW9uYWwgY2hpbGQgdmFsaWRhdG9ycwotICAvL3Byb3RlY3RlZCBXZWJFeHRWYWxpZGF0b3Igd2ViRXh0VmFsaWRhdG9yOwotICAvL3Byb3RlY3RlZCBXZWJCbmRWYWxpZGF0b3Igd2ViQm5kVmFsaWRhdG9yOwotCi0KLQkvKioKLQkgKiBSZWxhdGlvbnNoaXBNYXBWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgV2FyVmFsaWRhdG9yKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotLyoqCi0gKiBXaWxsIGNvbnN0cnVjdCBhIEhhc2hUYWJsZSBvZiByb2xlcywgYW5kIGNoZWNrIGZvciBkdXBsaWNhdGVzIAotICogYW5kIG51bGwgZW50cmllcwotICogQHJldHVybiBqYXZhLnV0aWwuSGFzaHRhYmxlCi0gKiBAcGFyYW0gcm9sZXMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ci0gKi8KLXB1YmxpYyBIYXNodGFibGUgZ2V0QW5kVmFsaWRhdGVTZWN1cml0eVJvbGVzKEVMaXN0IHJvbGVzKSB7Ci0KLQlIYXNodGFibGUgc2VjUm9sZXMgPSBuZXcgSGFzaHRhYmxlKCkgOwotCWlmIChyb2xlcy5pc0VtcHR5KCkpIHJldHVybiAoc2VjUm9sZXMpIDsKLQotCUl0ZXJhdG9yIHNSb2xlcyAgPSByb2xlcy5pdGVyYXRvcigpIDsKLQkKLQl3aGlsZSAoc1JvbGVzLmhhc05leHQoKSkgewotCSAgU2VjdXJpdHlSb2xlIHJvbGUgPSAoU2VjdXJpdHlSb2xlKSBzUm9sZXMubmV4dCgpIDsKLQkJCi0KLQkgIFN0cmluZyBuYW1lID0gcm9sZS5nZXRSb2xlTmFtZSgpIDsKLQkgIGlmIChuYW1lICE9IG51bGwpCi0JCQkgbmFtZSA9IG5hbWUudHJpbSgpIDsKLQkgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJICBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCSAgcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib2ZfVHlwZV9TZWN1cml0eV9Sb2xlX05hbWVfNiIpIDsgLy8kTk9OLU5MUy0xJAotCQkgIGFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMscm9sZSk7Ci0JCSAgY29udGludWUgOyAgICAgICAgICAKLQkgIH0KLQkgIGlmIChzZWNSb2xlcy5nZXQobmFtZSkhPW51bGwpIHsgICAvLyBDaGVjayBmb3IgZHVwcwotCi0JCSAgU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkgIHBhcm1zWzBdID0gbmFtZSA7Ci0JCSAgYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcyxyb2xlKTsKLQkJICBjb250aW51ZSA7Ci0JICB9Ci0JICBzZWNSb2xlcy5wdXQobmFtZSwiWWVhIikgOyAgICAgIC8vJE5PTi1OTFMtMSQKLQl9IAotCQotCQotCXJldHVybiBzZWNSb2xlczsKLX0KLS8qKgotICogPHA+QW5zd2VyIHRoZSBpZCBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGlzCi0gKiB1c2VkIGJ5IHRoZSByZWNlaXZlci48L3A+Ci0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKXsKLQlyZXR1cm4gV0FSX0NBVEVHT1JZOwotfQotCS8vIE1lc3NhZ2luZyBoZWxwZXJzIC4uLgotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgVmFsaWRhdG9yLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluCi0JICogdGhlIFVJLgotCSAqCi0JICogQHNlZSBKMkVFVmFsaWRhdG9yI2dldE5hbWUKLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYl9BcmNoaXZlX1ZhbGlkYXRvcl84Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLy8gTWVzc2FnaW5nIGhlbHBlcnMgLi4uCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBWYWxpZGF0b3IsIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4KLQkgKiB0aGUgVUkuCi0JICoKLQkgKiBAc2VlIEoyRUVWYWxpZGF0b3IjZ2V0TmFtZQotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKExvY2FsZSBsb2NhbGUpCi0JewotCQlyZXR1cm4gZ2V0TWVzc2FnZShudWxsLCJ3ZWJBcmNoaXZlVmFsaWRhdG9yLm5hbWUiLCBsb2NhbGUpOyAvLyROT04tTkxTLTEkCi0JfQotLyoqCi0gKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IHRoZSB2YWxpZGF0ZVNlY3VyaXR5Q29uc3RyYWludHMuCi0gKiAKLSAqIEByZXR1cm4gYm9vbGVhbgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0h0dHBNZXRob2QoU3RyaW5nIG1ldGhvZCkgewotCi0KLQlpZiAoaHR0cE1ldGhvZHMgPT0gbnVsbCkgeyAgLy8gTmVlZCB0byBjb25zdHJ1Y3QgdGhlIEhhc2h0YWJsZSwgb25jZQotCQlTdHJpbmcgW10gbUxpc3QgPSB7IkdFVCIsICJQVVQiLCAiSEVBRCIsICJUUkFDRSIsICJQT1NUIiwgIkRFTEVURSIsICJPUFRJT05TIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQKLQkJCi0JCWh0dHBNZXRob2RzID0gbmV3IEhhc2h0YWJsZSgpIDsKLQkJZm9yIChpbnQgaSA9IDA7IGk8bUxpc3QubGVuZ3RoOyBpKyspCi0JCSAgIGh0dHBNZXRob2RzLnB1dCAobUxpc3RbaV0sImJsYSIpIDsgLy8kTk9OLU5MUy0xJAotCX0KLQlTdHJpbmcgY29tcGFyZSA9IG1ldGhvZC50cmltKCkgOwotCXJldHVybiAoaHR0cE1ldGhvZHMuZ2V0KGNvbXBhcmUpICE9IG51bGwpIDsgICAgICAgICAKLX0KLS8qKgotICogIFdBUiB2YWxpZGF0aW9uIGlzIGRyaXZlbiBieSAzIHByb25nIGFwcHJvYWNoOgotICogIG8gWE1ML0RURCB2YWxpZGF0aW9uICh0aGlzIGlzIG5vdyBoYW5kbGVkIGJ5IHRoZSBYTUwgVmFsaWRhdG9yKQotICogIG8gQ29uc2lzdGVudCB3ZWIueG1sIGRhdGEgZW50cnkgdmFsaWRhdGlvbiBiZXlvbmQgRFRECi0gKiAgICAgIGUuZy4sIGR1cGxpY2F0ZSBlbnRyaWVzLCBudWxsIGVudHJpZXMgZXRjLiBUaGlzIGlzIGFsc28KLSAqICAgICAgZHJpdmVuIGJ5IHRoaXMgdmFsaWRhdG9yLgotICogIG8gd2ViLnhtbCByZWZlcmVuY2UgdG8gcmVzb3VyY2VzIGluIHRoZSAiZmlsZSBzeXN0ZW0iLiAgVGhpcwotICogICAgICB3aWxsIG5vdCBiZSBwcm92aWRlZCBieSB0aGlzIHZhbGlkYXRvci4gIEluIHRoZSB3b3JrYmVuY2gKLSAqICAgICAgdGhpcyBmdW5jdGlvbiBpcyBhbHJlYWR5IHByb3ZpZGVkIGJ5IHRoZSBsaW5rIGJ1aWxkZXIuCi0gKiAgICAgCi0gKi8KLXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb257Ci0JCXZhbGlkYXRlTWltZU1hcHBpbmcoKSA7Ci0JCXZhbGlkYXRlQ29udGV4dFBhcmFtZXRlcnMoKSA7Ci0JCXZhbGlkYXRlVGFnTGlicygpOwotCQl2YWxpZGF0ZVNlcnZsZXRNYXBwaW5ncyh3ZWJERC5nZXRTZXJ2bGV0TWFwcGluZ3MoKSk7Ci0JCXZhbGlkYXRlV2VsY29tZUZpbGVMaXN0KHdlYkRELmdldEZpbGVMaXN0KCkpOwotCQl2YWxpZGF0ZUVycm9yUGFnZXMod2ViREQuZ2V0RXJyb3JQYWdlcygpKTsKLQkJdmFsaWRhdGVTZWN1cml0eUFuZFNlcnZsZXRzKCk7Ci0JCXZhbGlkYXRlRmlsdGVycyh3ZWJERC5nZXRGaWx0ZXJzKCkpOwotCQl2YWxpZGF0ZUZpbHRlck1hcHBpbmdzKHdlYkRELmdldEZpbHRlck1hcHBpbmdzKCkpOwotCQl2YWxpZGF0ZVJlZnMoKTsKLQkJdmFsaWRhdGVMb2dpbkNvbmZpZyggd2ViREQuZ2V0TG9naW5Db25maWcoKSApOwotCQl2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyggd2ViREQuZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkgKTsKLQkJdmFsaWRhdGVPdGhlcigpIDsKLQkJdmFsaWRhdGUxNCgpOwotCX0KLS8qKgotICogCi0gKi8KLXByaXZhdGUgdm9pZCB2YWxpZGF0ZTE0KCkgewotCWludCB2ZXJzaW9uSWQgPSB3ZWJERC5nZXRWZXJzaW9uSUQoKTsKLQlpZih2ZXJzaW9uSWQgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCkgewotCQl2YWxpZGF0ZVVybFBhdHRlcm4oKTsKLQl9Ci19Ci0vKioKLSAqIAotICovCi1wcml2YXRlIHZvaWQgdmFsaWRhdGVVcmxQYXR0ZXJuKCkgewotCUxpc3Qgc2VydmxldE1hcHBpbmdzID0gd2ViREQuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0JZm9yKGludCBpID0gMDsgaSA8IHNlcnZsZXRNYXBwaW5ncy5zaXplKCk7IGkrKykgewotCQlTZXJ2bGV0TWFwcGluZyBtYXBwaW5nID0gKFNlcnZsZXRNYXBwaW5nKXNlcnZsZXRNYXBwaW5ncy5nZXQoaSk7Ci0JCVN0cmluZyB1cmxQYXR0ZXJuID0gbWFwcGluZy5nZXRVcmxQYXR0ZXJuKCk7Ci0JCWludCBuZXdMaW5lQ2hhciA9IHVybFBhdHRlcm4uaW5kZXhPZihDaGFyYWN0ZXIuTElORV9TRVBBUkFUT1IpOwotCQlpZihuZXdMaW5lQ2hhciAhPSAtMSkgewotCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzJdOwotCQkJcGFybXNbMF0gPSB1cmxQYXR0ZXJuIDsKLQkJCXBhcm1zWzFdID0gbWFwcGluZy5nZXRTZXJ2bGV0KCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9VUkxfUEFUVEVSTl9FTkRfV0lUSF9DQVJSQUlHRV9SRVRVUk4scGFybXMsbWFwcGluZyk7Ci0JCX0KLQl9Ci0JCi19Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBNT0YgbW9kZWwuCi0gKiA8YnI+PGJyPgotICogPGNvZGU+aGVscGVyPC9jb2RlPiBhbmQgPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IG1heSBub3QgYmUgbnVsbC4gPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPiBtYXkgYmUgbnVsbCwgaWYgYSBmdWxsCi0gKiBidWlsZCBpcyBkZXNpcmVkLgotICogPGJyPjxicj4KLSAqIDxjb2RlPmhlbHBlcjwvY29kZT4gbG9hZHMgYSBFT2JqZWN0LiBUaGUgRU9iamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUgCi0gKiBNT0YgbW9kZWwgYWJvdXQgdG8gYmUgdmFsaWRhdGVkLiBXaGVuIHRoaXMgb2JqZWN0IGlzIHRyYXZlcnNlZCwKLSAqIHlvdSBjYW4gcmVhY2ggZXZlcnkgZWxlbWVudCBpbiB0aGUgTU9GIG1vZGVsIHdoaWNoIG5lZWRzIHRvIGJlIHZhbGlkYXRlZC4KLSAqIDxicj48YnI+Ci0gKiA8Y29kZT5yZXBvcnRlcjwvY29kZT4gaXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4KLSAqIDxicj48YnI+Ci0gKiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+IGlzIGFuIGFycmF5IG9mIGZpbGUgbmFtZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHZhbGlkYXRpb24uIAotICogSWYgPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPiBpcyBudWxsLCBvciBpZiBpdCBpcyBhbiBlbXB0eSBhcnJheSwgdGhlbiBhIGZ1bGwgYnVpbGQKLSAqIGlzIHBlcmZvcm1lZC4gT3RoZXJ3aXNlLCB2YWxpZGF0aW9uIG9uIGp1c3QgdGhlIGZpbGVzIGxpc3RlZCBpbiB0aGUgVmVjdG9yIGlzIHBlcmZvcm1lZC4KLSAqLwotCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0Jc3VwZXIudmFsaWRhdGUoaW5IZWxwZXIsIGluUmVwb3J0ZXIpOwotCQotCS8vIEZpcnN0IHJlbW92ZSBhbGwgcHJldmlvdXMgbXNnLiBmb3IgdGhpcyBwcm9qZWN0Ci0JX3JlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIG51bGwpOyAvLyBOb3RlIHRoZSBXYXJIZWxwZXIgd2lsbCByZXR1cm4gd2ViLnhtbCB3aXRoIGEgbnVsbCBvYmplY3QgYXMgd2VsbAotCi0Jd2FyRmlsZSA9IChXQVJGaWxlKSBfaGVscGVyLmxvYWRNb2RlbChXQVJfTU9ERUxfTkFNRSk7Ci0JdHJ5IHsKLQkJaWYgKHdhckZpbGUgIT0gbnVsbCkgewotCQkJd2ViREQgPSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQl2YWxpZGF0ZSgpOwotCQl9IGVsc2UgewotCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9JTlZBTElEX1dBUl9GSUxFKTsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGVycm9yTXNnKTsKLQkJfQotCi0JfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotCQl0aHJvdyBleDsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCXBhcm1zWzBdID0gZS50b1N0cmluZygpOwotCQlJTWVzc2FnZSBlcnJvck1zZyA9IG5ldyBNZXNzYWdlKGdldEJhc2VOYW1lKCksIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRCwgcGFybXMgKTsKLQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oZXJyb3JNc2csIGUpOwotCX0KLX0KLQotLyoqCi0gKiBUaGlzIHZhbGlkYXRvciBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiB3aGVuIHRoZSByZXBvcnRlciBhbmQgaGVscGVyIGhhdmUKLSAqIGJlZW4gc3VwcGxpZWQgdmlhIHRoZSBjb25zdHJ1Y3Rvci4KLSAqLwotcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGFXYXJGaWxlKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgdHJ5IHsKLQl3YXJGaWxlID0gKFdBUkZpbGUpIGFXYXJGaWxlOwotCXdlYkREID0gd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JdmFsaWRhdGUoKTsKLQotICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JcGFybXNbMF0gPSBlLnRvU3RyaW5nKCk7ICAJCi0JSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9XQVJfVkFMSURBVElPTl9GQUlMRUQsIHBhcm1zKTsKLQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZyk7Ci0gIH0gCi19Ci0vKioKLSAqIFRoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQKLSAqIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZSB1c2VkIGhlcmUKLSAqIG11c3QgYXBwZWFyIGluIGEgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KLSAqIDwhRUxFTUVOVCBhdXRoLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKik+Ci0gKiBUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotICogPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+Ci0gKiBDcmVhdGlvbiBkYXRlOiAoNy82LzIwMDEgMzozOTozNCBQTSkKLSAqIEBwYXJhbSBhdXRoQ29uc3RyYWludCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludAotICovCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50LCBIYXNodGFibGUgc2VjUm9sZXMpIHsKLQkKLQlFTGlzdCByb2xlTGlzdCA9IGF1dGhDb25zdHJhaW50LmdldFJvbGVzKCkgOwotCi0JaWYgKHJvbGVMaXN0ICE9IG51bGwgJiYgIXJvbGVMaXN0LmlzRW1wdHkoKSkgewotCQlJdGVyYXRvciBhdXRoUm9sZXMgPSByb2xlTGlzdC5pdGVyYXRvcigpIDsKLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSAoKSA7Ci0JCXdoaWxlIChhdXRoUm9sZXMuaGFzTmV4dCgpKSB7ICAKLQkJCVN0cmluZyByb2xlID0gKFN0cmluZylhdXRoUm9sZXMubmV4dCgpIDsKLQkJCWlmIChyb2xlID09IG51bGwgfHwgcm9sZS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfUm9sZV9OYW1lXzE5IikgOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLGF1dGhDb25zdHJhaW50KTsKLQkJCQljb250aW51ZSA7ICAgICAgICAgICAgICAKLQkJCX0KLQkJCWlmIChyZW1lbWJlci5nZXQgKHJvbGUudHJpbSgpKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gcm9sZSA7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcyxhdXRoQ29uc3RyYWludCk7Ci0JCQkJY29udGludWUgOyAgICAgICAgICAgICAgCi0JCQl9Ci0JCQlyZW1lbWJlci5wdXQocm9sZS50cmltKCksIlllYSIpIDsgICAgICAvLyROT04tTkxTLTEkCi0JCQl2YWxpZGF0ZUF1dGhTZWNSb2xlKCIiLHJvbGUsc2VjUm9sZXMsYXV0aENvbnN0cmFpbnQpIDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfSAgIAotfSAKLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDcvNS8yMDAxIDI6MjA6MDIgUE0pCi0gKi8KLXB1YmxpYyB2b2lkIHZhbGlkYXRlQ29udGV4dFBhcmFtZXRlcnMoKSB7Ci0KLQkvLyB3ZSBtdXN0IHZlcmlmeSB0aGF0IGV2ZXJ5IHBhcmFtLW5hbWUgaXMgdW5pcXVlOwotCS8vIHBhcmFtLW5hbWUgYXBwZWFycyBpbiBjb250ZXh0IHBhcmFtZXRlcnMsIGZpbHRlcgotCS8vIGFuZCBzZXJ2bGV0cy4gIFdlIG11c3QgY2hlY2sgZWFjaC4KLQlIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvLyBjaGVjayBjb250ZXh0IHBhcmFtZXRlcnMgLSBlYWNoIHBhcmFtLW5hbWUgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotCUl0ZXJhdG9yIGNwYXJhbXMgPSB3ZWJERC5nZXRDb250ZXh0cygpLml0ZXJhdG9yKCk7Ci0Jd2hpbGUgKGNwYXJhbXMuaGFzTmV4dCgpKSB7Ci0JCUNvbnRleHRQYXJhbSBjb250ZXh0ID0gKENvbnRleHRQYXJhbSkgY3BhcmFtcy5uZXh0KCk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBjb250ZXh0LmdldFBhcmFtTmFtZSgpOwotCQlpZiAobmFtZSAhPSBudWxsKQotCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCi0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpICkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzI1Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBjb250ZXh0KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8vaWYgKHJlbWVtYmVyLmdldChuYW1lICsgdmFsdWUpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKLQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCi0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzI1IikgKyAiOiAiICsgbmFtZTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgY29udGV4dCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkvL3JlbWVtYmVyLnB1dChuYW1lICsgdmFsdWUsICJZZWEiKTsKLQkJcmVtZW1iZXIucHV0KG5hbWUsICJZZWEiKTsgLy8kTk9OLU5MUy0xJAotCX0gCi0KLQotCS8vIGNoZWNrIHNlcnZsZXQgaW5pdC1wYXJhbSAtIGVhY2ggcGFyYW0tbmFtZSBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbiBhIHNlcnZsZXQKLQlJdGVyYXRvciBzZXJ2bGV0cyA9IHdlYkRELmdldFNlcnZsZXRzKCkuaXRlcmF0b3IoKTsKLQl3aGlsZSAoc2VydmxldHMuaGFzTmV4dCgpKSB7Ci0JCVNlcnZsZXQgbmV4dFNlcnZsZXQgPSAoU2VydmxldCkgc2VydmxldHMubmV4dCgpOwotCQlJdGVyYXRvciBwYXJhbXMgPSBuZXh0U2VydmxldC5nZXRQYXJhbXMoKS5pdGVyYXRvcigpOwotCQlyZW1lbWJlci5jbGVhcigpOwotCQl3aGlsZSAocGFyYW1zLmhhc05leHQoKSkgewotCQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIHBhcmFtcy5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGluaXRQYXJhbS5nZXRQYXJhbU5hbWUoKTsKLQotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQluYW1lID0gbmFtZS50cmltKCk7Ci0KLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpICkgeyAvLyROT04tTkxTLTEkIAotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzMyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIGluaXRQYXJhbSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVtZW1iZXIuZ2V0KG5hbWUpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKLQotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX1BhcmFtZXRlcl9OYW1lXzI1IikgKyAiOiAiICsgIG5hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIGluaXRQYXJhbSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZW1lbWJlci5wdXQobmFtZSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyBjaGVjayBmaWx0ZXIgaW5pdC1wYXJhbSAtIGVhY2ggcGFyYW0tbmFtZSBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbiBhIGZpbHRlcgotCUl0ZXJhdG9yIGZpbHRlcnMgPSB3ZWJERC5nZXRGaWx0ZXJzKCkuaXRlcmF0b3IoKTsKLQl3aGlsZSAoZmlsdGVycy5oYXNOZXh0KCkpIHsKLQkJRmlsdGVyIG5leHRGaWx0ZXIgPSAoRmlsdGVyKSBmaWx0ZXJzLm5leHQoKTsKLQkJSXRlcmF0b3IgcGFyYW1zID0gbmV4dEZpbHRlci5nZXRJbml0UGFyYW1zKCkuaXRlcmF0b3IoKTsKLQkJcmVtZW1iZXIuY2xlYXIoKTsKLQkJd2hpbGUgKHBhcmFtcy5oYXNOZXh0KCkpIHsKLQkJCUluaXRQYXJhbSBpbml0UGFyYW0gPSAoSW5pdFBhcmFtKSBwYXJhbXMubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCk7Ci0KLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCi0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSApIHsgLy8kTk9OLU5MUy0xJCAKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zOSIpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBpbml0UGFyYW0pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjUiKSArICI6ICIgKyAgbmFtZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgaW5pdFBhcmFtKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLX0KLS8qKgotICAgKiBWYWxpZGF0ZSBFSkIgcmVmZXJlbmNlcy4KLSAgICovCi0KLXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCUmVmcyhFamJSZWZJbXBsIGVyZWYpIHsKLS8vICB0cnkgewotICAJCi0gIAlFQVJGaWxlIGVhckZpbGUgPSB3YXJGaWxlLmdldEVBUkZpbGUoKTsKLSAgCUVudGVycHJpc2VCZWFuIGViID0gbnVsbDsKLSAgCQotICAJaWYgKGVhckZpbGUgIT0gbnVsbCkgCi0JCWViID0gZWFyRmlsZS5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihlcmVmLCB3YXJGaWxlLmdldFVSSSgpKTsKLQotCWlmICghKGViID09IG51bGwpKSB7Ci0JICBMaXN0IGVqYlJlZnMgPSBlYi5nZXRFamJSZWZzKCk7Ci0KLQkgIGludCBudW1SZWZzID0gZWpiUmVmcy5zaXplKCk7Ci0KLQkgIFNldCByZWZTZXQgPSBuZXcgSGFzaFNldChudW1SZWZzKTsKLQotCSAgZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG51bVJlZnM7IHJlZk5vKyspIHsKLQkJU3RyaW5nIG5leHROYW1lID0gKChFamJSZWZJbXBsKSAoZWpiUmVmcy5nZXQocmVmTm8pKSkuZ2V0TmFtZSgpOwotCi0JCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJcGFybXNbMF0gPSBlYi5nZXROYW1lKCk7Ci0JCWlmICghKHJlZlNldC5hZGQobmV4dE5hbWUpKSkgewotCQkgIGFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBFUlJPUl9FQVJfRFVQTElDQVRFX1JPTEVTLCBwYXJtcyxlamJSZWZzLmdldChyZWZObykpOwotCQl9Ci0JICB9Ci0JfQotCi0vLyAgfSBjYXRjaCAoVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uIHVlKSB7Ci0vLwlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0vLwlwYXJtc1swXSA9IHdhckZpbGUuZ2V0TmFtZSgpOwotLy8gIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT04sIHBhcm1zKTsKLS8vICB9Ci19Ci0JLyoqCi0JICogdmFsaWRhdGUgZm9yIGR1cGxpY2F0ZXMgaW4gRUFSIFJvbGVzCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVKQlJlZnMoTGlzdCBlamJSZWZzKQotCXsKLQkJaW50IG51bVJlZnMgPSBlamJSZWZzLnNpemUoKTsKLQkJSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpIDsKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG51bVJlZnM7IHJlZk5vKyspIHsKLQkJCUVqYlJlZkltcGwgZXJlZiA9IChFamJSZWZJbXBsKSBlamJSZWZzLmdldChyZWZObyk7Ci0JCQlpZiAoZXJlZi5pc1NldFR5cGUoKSkgewotCQkJCVN0cmluZyB0eXBlID0gZXJlZi5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCQkJCWlmICggdHlwZSA9PSBudWxsICkgewotCQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VKQl9SRUZfVFlQRSwgbnVsbCxlcmVmKTsJLy8gVHlwZSBtdXN0IGJlIG9mIEVOVElUWSBvciBGT08JCQkJCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZXJlZi5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyAgbmFtZSA9IGVyZWYuZ2V0TmFtZSgpOwotCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQotCQkJCWlmIChuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfZWpiLXJlZi1uYW1lXzQ0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLGVyZWYpOwotCQkJCQljb250aW51ZSA7Ci0JCQkJfSAgICAgICAgICAgCi0JCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7ICAvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCXBhcm1zWzBdID0gbmFtZSA7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FSkJfUkVGLCBwYXJtcyxlcmVmKTsKLQkJCQkJY29udGludWUgOwotCQkJCX0KLQkJCQlyZW1lbWJlci5wdXQobmFtZSwiWWVhIikgOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX2VqYi1yZWYtbmFtZV80NCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLGVyZWYpOwotCQkJCWNvbnRpbnVlIDsKLQkJCX0KLQotCi0JCQl2YWxpZGF0ZUVKQlJlZnMoZXJlZik7Ci0JCQl2YWxpZGF0ZUVKQlJlZk1hbmFkYXRvcnlFbGVtZW50cyhlcmVmLCB3ZWJERC5nZXREaXNwbGF5TmFtZSgpKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiB2YWxpZGF0ZSBmb3IgZHVwbGljYXRlcyBpbiBFQVIgUm9sZXMKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlRUpCTG9jYWxSZWZzKExpc3QgZWpiUmVmcykKLQl7Ci0JCWludCBudW1SZWZzID0gZWpiUmVmcy5zaXplKCk7Ci0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKSA7Ci0JCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBudW1SZWZzOyByZWZObysrKSB7Ci0JCQlFSkJMb2NhbFJlZkltcGwgZXJlZiA9IChFSkJMb2NhbFJlZkltcGwpIGVqYlJlZnMuZ2V0KHJlZk5vKTsKLQkJCWlmIChlcmVmLmlzU2V0VHlwZSgpKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBlcmVmLmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKCB0eXBlID09IG51bGwgKSB7Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFLCBudWxsLGVyZWYpOwkvLyBUeXBlIG11c3QgYmUgb2YgRU5USVRZIG9yIEZPTwkJCQkJCQkJCQotCQkJCX0KLQkJCX0KLQkJCWlmIChlcmVmLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nICBuYW1lID0gZXJlZi5nZXROYW1lKCk7Ci0JCQkJbmFtZSA9IG5hbWUudHJpbSgpIDsKLQkKLQkJCQlpZiAobmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX2VqYi1yZWYtbmFtZV80NCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZLCBwYXJtcyxlcmVmKTsKLQkJCQkJY29udGludWUgOwotCQkJCX0KLQkJCQlpZiAocmVtZW1iZXIuZ2V0KG5hbWUpICE9IG51bGwpIHsgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBuYW1lIDsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VKQl9SRUYsIHBhcm1zLGVyZWYpOwotCQkJCQljb250aW51ZSA7Ci0JCQkJfQotCQkJCXJlbWVtYmVyLnB1dChuYW1lLCJZZWEiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfZWpiLXJlZi1uYW1lXzQ0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsZXJlZik7Ci0JCQkJY29udGludWUgOwotCQkJfQotCi0KLS8vCQkJdmFsaWRhdGVFSkJSZWZzKGVyZWYpOwotLy8JCQl2YWxpZGF0ZUVKQlJlZk1hbmFkYXRvcnlFbGVtZW50cyhlcmVmLCB3ZWJERC5nZXREaXNwbGF5TmFtZSgpKTsKLQkJfQotCX0JCi0JCi0vKioKLSAgICogTGluayBidWlsZCBzaG91bGQgdmVyaWZ5IGxvY2F0aW9uIG9mIGV4Y2VwdGlvbiBjbGFzcwotICAgKi8KLQotcHVibGljIHZvaWQgdmFsaWRhdGVFcnJvclBhZ2VzKEVMaXN0IGVycm9yUGFnZUxpc3QpIHsKLSAgSXRlcmF0b3IgZXJyb3JQYWdlcyA9IGVycm9yUGFnZUxpc3QuaXRlcmF0b3IoKTsKLQotICBpZiAoZXJyb3JQYWdlTGlzdCA9PSBudWxsIHx8IGVycm9yUGFnZUxpc3QuaXNFbXB0eSgpKSByZXR1cm4gOwotCi0gIHdoaWxlIChlcnJvclBhZ2VzLmhhc05leHQoKSkgewotCUVycm9yUGFnZSBuZXh0UGFnZSA9IChFcnJvclBhZ2UpIGVycm9yUGFnZXMubmV4dCgpOwotCVN0cmluZyBsb2NhdGlvbiA9IG5leHRQYWdlLmdldExvY2F0aW9uKCkgOwotCWlmIChsb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDciKSA7IC8vJE5PTi1OTFMtMSQKLQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLG5leHRQYWdlKTsKLQl9Ci0JaWYgKCFsb2NhdGlvbi5zdGFydHNXaXRoKCIvIikpeyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib2ZfVHlwZV9FcnJvcl9Mb2NhdGlvbl80OSIpIDsgLy8kTk9OLU5MUy0xJAotCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX1BBR0UsIHBhcm1zLG5leHRQYWdlKTsKLQl9Ci0KLQotCS8vIGNoZWNrIGZvciB2YWxpZCBIVFRQIGVycm9yIGNvZGUgLSBtdXN0IGJlIGFuIEludGVnZXIsIDMgZGlnaXRzLCBhbmQgdGhlIHN0YXJ0aW5nCi0JLy8gZGlnaXQgbXVzdCBiZSBhIDEsMiwzLDQsIG9yIDUuCi0JaWYgKG5leHRQYWdlLmlzRXJyb3JDb2RlKCkpIHsKLQkJRXJyb3JDb2RlRXJyb3JQYWdlIGVjZXAgPSAoRXJyb3JDb2RlRXJyb3JQYWdlKSBuZXh0UGFnZTsKLQkJU3RyaW5nIGVycm9yQ29kZSA9IGVjZXAuZ2V0RXJyb3JDb2RlKCk7Ci0JCQotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCWlmICggZXJyb3JDb2RlLmxlbmd0aCgpID09IDMgKSB7Ci0JCQl0cnkgewotCQkJCUludGVnZXIgdGVtcEludCA9IG5ldyBJbnRlZ2VyKGVycm9yQ29kZSk7Ci0JCQkJLy8gb2ssIGl0J3MgYSB2YWxpZCAzLWRpZ2l0IGludGVnZXIKLQkJCQlpbnQgY29kZSA9IHRlbXBJbnQuaW50VmFsdWUoKTsKLQkJCQlpZiAoIGNvZGUgPj0gMTAwICYmIGNvZGUgPCA2MDAgKSB7Ci0JCQkJCS8vIHZhbGlkIEhUVFAgc3RhdHVzIGNvZGUgLSBzdGFydGluZyBkaWdpdCBtdXN0IGJlIGJldHdlZW4gMS01CQkJCi0JCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlpZiAoICF2YWxpZCApIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gZXJyb3JDb2RlOwotCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9DT0RFLCBwYXJtcywgZWNlcCk7CQkJCQkJCQkJCi0JCX0KLQkJCi0JfQotCQotCS8vIElmIGV4Y2VwdGlvbi10eXBlLi4uICB0aGUgc3BlY2lmaWVkIGNsYXNzIG11c3QgYmUgb3IgaW5oZXJpdCBmcm9tIGphdmEubGFuZy5UaHJvd2FibGUKLQllbHNlIGlmIChuZXh0UGFnZS5pc0V4Y2VwdGlvblR5cGUoKSkgewotCQlFeGNlcHRpb25UeXBlRXJyb3JQYWdlIGV0ZXAgPSAoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSluZXh0UGFnZTsKLQkJSmF2YUNsYXNzIGphdmFUeXBlID0gZXRlcC5nZXRFeGNlcHRpb25UeXBlKCk7Ci0JCVN0cmluZyBleGNlcHRpb25UeXBlID0gImphdmEubGFuZy5UaHJvd2FibGUiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNwZWNpZmllZENsYXNzTmFtZSA9IGV0ZXAuZ2V0RXhjZXB0aW9uVHlwZU5hbWUoKTsKLQkJaWYgKCBqYXZhVHlwZSAhPSBudWxsICkgewotCQkJUmVzb3VyY2VTZXQgbG9va3VwU2V0ID0gamF2YVR5cGUuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsJCQotCQkJaWYgKGxvb2t1cFNldCAhPSBudWxsKSAKLQkJCXsKLQkJCQlpZiAoIWphdmFUeXBlLmluaGVyaXRzRnJvbShKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoZXhjZXB0aW9uVHlwZSwgbG9va3VwU2V0KS5nZXRXcmFwcGVyKCkpKSB7CQkJCQkJCQkKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IHNwZWNpZmllZENsYXNzTmFtZTsKLQkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FWENFUFRJT05fVFlQRSwgcGFybXMsIGV0ZXApOwotCQkJCX0JCQkJCQkJCQkKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FWENFUFRJT05fVFlQRSwgcGFybXMsIGV0ZXApOwotCQl9CQkgCi0JCS8vIFRCRAotCX0KLQllbHNlIHsgIC8vIEVycm9yIENvZGUKLQkJLy8gVEJECi0JfQotCi0JLy8gVEJEIHJlbWVtYmVyIGxvY2F0aW9uL2NvZGUvZXhjZXB0aW9uIGR1cHMgICAgCi0gIH0KLQotfQotCi0vKioKLSAqIFZhbGlkYXRlIHRoZSBsb2dpbkNvbmZpZyBzZWN0aW9uIGlzIGNvcnJlY3QKLSAqLwotcHVibGljIHZvaWQgdmFsaWRhdGVMb2dpbkNvbmZpZyggTG9naW5Db25maWcgbG9naW5Db25maWcgKSB7Ci0JLy9jb20uaWJtLmV0b29scy52YWxpZGF0ZS5WYWxpZGF0b3JNYW5hZ2VyLnNldFJlc291cmNlVXRpbENsYXNzKGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLnVpLlVJUmVzb3VyY2VVdGlsLmNsYXNzKTsKLQotCWlmICggbG9naW5Db25maWcgIT0gbnVsbCApIHsKLQkJU3RyaW5nIGF1dGggPSBsb2dpbkNvbmZpZy5nZXRBdXRoTWV0aG9kKCkuZ2V0TmFtZSgpOwotCQotCQlpZiAoIGF1dGggPT0gbnVsbCApIHsKLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1swXTsKLQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfQVVUSF9NRVRIT0QsIHBhcm1zLGxvZ2luQ29uZmlnKTsKLQkJfQotCQkvLyBHaXZlIGEgd2FybmluZyBpZiBmb3JtIGVsZW1lbnRzIGFyZSBzdXBwbGllZCBidXQgRk9STSBhdXRoIG1ldGhvZCBpcyBub3QgdXNlZAotCQllbHNlIGlmICggIWF1dGguZXF1YWxzKCAiRk9STSIgKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJRm9ybUxvZ2luQ29uZmlnIGNmZyA9IGxvZ2luQ29uZmlnLmdldEZvcm1Mb2dpbkNvbmZpZygpOwkJCQotCQkJaWYgKCBjZmcgIT0gbnVsbCApIHsJCQkKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBhdXRoIDsKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JR05PUkVfRk9STV9MT0dJTiwgcGFybXMsbG9naW5Db25maWcpOwkJCi0JCQl9CQkJCi0JCX0KLQl9Ci19Ci0KLS8qKgotICogVmFsaWRhdGUgdGhlIGxvZ2luQ29uZmlnIHNlY3Rpb24gaXMgY29ycmVjdAotICovCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZUVudmlyb25tZW50RW50cmllcyggRUxpc3QgZW52RW50cmllcyApIHsKLSAgaWYgKGVudkVudHJpZXMuaXNFbXB0eSgpKSByZXR1cm4gOwotIAotICAvL2Jvb2xlYW4gaXNWZXJzaW9uMjIgPSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuaXNWZXJzaW9uMl8yRGVzY3JpcHRvcigpOyAKLSAgSXRlcmF0b3IgZW50cmllcyA9IGVudkVudHJpZXMuaXRlcmF0b3IoKTsKLSAgSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpIDsKLSAKLSAgd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7Ci0gIAlFbnZFbnRyeSBlbnRyeSA9IChFbnZFbnRyeSllbnRyaWVzLm5leHQoKTsKLSAgCWlmICggZW50cnkuZ2V0VHlwZSgpLmdldE5hbWUoKSA9PSBudWxsICkgewotCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VOVl9FTlRSWSwgbnVsbCxlbnRyeSk7CQkJCQkgIAkJCQotICAJfQotICAJCi0gIAkvLyBjaGVjayBmb3IgZHVwbGljYXRlIGVudi1lbnRyeS1uYW1lJ3MKLSAgCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAJaWYgKCBuYW1lICE9IG51bGwgKSB7Ci0gIAkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7ICAgLy8gQ2hlY2sgZm9yIGR1cHMKLQkJICBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCSAgcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib2ZfVHlwZV9FbnZfRW50cnlfTmFtZV9fXzg4IikgKyAgIjogIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJICBhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlksIHBhcm1zLGVudHJ5KTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgIAkgIHJlbWVtYmVyLnB1dChuYW1lLCJZZWEiKSA7ICAgICAgICAgLy8kTk9OLU5MUy0xJAotCSAgICB9Ci0gIAl9CQkgCQotICB9Ci0KLX0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg3LzUvMjAwMSAxMjoxMToyMyBQTSkKLSAqLwotcHVibGljIHZvaWQgdmFsaWRhdGVNaW1lTWFwcGluZygpIHsKLQotCWlmICh3ZWJERC5nZXRNaW1lTWFwcGluZ3MoKS5pc0VtcHR5KCkpIHJldHVybiA7Ci0JCi0JSXRlcmF0b3IgbWltZXMgPSB3ZWJERC5nZXRNaW1lTWFwcGluZ3MoKS5pdGVyYXRvcigpIDsKLQlIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCkgOwotCQotCXdoaWxlIChtaW1lcy5oYXNOZXh0KCkpIHsgICAKLQkgIE1pbWVNYXBwaW5nIG1pbWVNYXAgPSAoTWltZU1hcHBpbmcpIG1pbWVzLm5leHQoKTsKLQkgIAotCSAgU3RyaW5nIGV4dCA9IG1pbWVNYXAuZ2V0RXh0ZW5zaW9uKCkgOwotCSAgU3RyaW5nIG10eXBlID0gbWltZU1hcC5nZXRNaW1lVHlwZSgpIDsKLQkgIGlmIChleHQgIT0gbnVsbCkKLQkJICBleHQgPSBleHQudHJpbSgpIDsKLQkgIGlmIChtdHlwZSAhPSBudWxsKQotCQkgIG10eXBlID0gbXR5cGUudHJpbSgpIDsKLQkgIAotCSAgaWYgKGV4dCA9PSBudWxsIHx8IGV4dC5lcXVhbHMoIiIpIHx8IG10eXBlID09IG51bGwgfHwgbXR5cGUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCSAgaWYgKGV4dCA9PSBudWxsIHx8IGV4dC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJIHBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfTWltZV9FeHRlbnNpb25fNTQiKSA7ICAgIC8vJE5PTi1OTFMtMSQKLQkJICBlbHNlCi0JCQkgcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib2ZfVHlwZV9NaW1lX1R5cGVfNTUiKSA7IC8vJE5PTi1OTFMtMSQKLQkJICBhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsbWltZU1hcCk7Ci0JCSAgY29udGludWUgOyAgICAgICAgICAKLQkgIH0KLQkgIGlmIChyZW1lbWJlci5nZXQoZXh0KSAhPSBudWxsKSB7ICAgLy8gQ2hlY2sgZm9yIGR1cHMKLQotCQkgIFN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJICBwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX01pbWVfRXh0ZW5zaW9uX19fNTYiKSArICI6ICIgKyBleHQgOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCSAgYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcyxtaW1lTWFwKTsKLQkJICBjb250aW51ZSA7Ci0JICB9Ci0JICByZW1lbWJlci5wdXQoZXh0LCJZZWEiKSA7ICAgICAgICAgLy8kTk9OLU5MUy0xJAotCX0KLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDcvNS8yMDAxIDExOjQ2OjU4IEFNKQotICovCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZU90aGVyKCkgewotCi0JIFNlc3Npb25Db25maWcgc2Vzc2lvbkNmZyA9IHdlYkRELmdldFNlc3Npb25Db25maWcoKSA7Ci0JIGlmIChzZXNzaW9uQ2ZnICE9IG51bGwpIHsKLQkJaW50IHRpbWVvdXQgPSBzZXNzaW9uQ2ZnLmdldFNlc3Npb25UaW1lb3V0KCkgOwotCQlpZiAodGltZW91dCA9PSAwKSB7Ci0JCSAgIGFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVCwgbnVsbCxzZXNzaW9uQ2ZnKTsKLQkJfQotCSB9Ci0JCi0JCi0JCi19Ci0vKioKLSAqIHZhbGlkYXRlUmVmcyhXZWJBcHApCi0gKiAgICAgLSB2YWxpZGF0ZSBFSkIgYW5kIHJlc291cmNlIHJlZmVyZW5jZXMKLSAqICAgICAtIGRldGFpbHMgdGJkCi0gKi8KLQotcHVibGljIHZvaWQgdmFsaWRhdGVSZWZzKCkgewotCUVMaXN0IGVqYlJlZnMgPSB3ZWJERC5nZXRFamJSZWZzKCk7Ci0KLQlpZiAoIWVqYlJlZnMuaXNFbXB0eSgpKQotCQl2YWxpZGF0ZUVKQlJlZnMoZWpiUmVmcyk7Ci0KLQotCUVMaXN0IGVqYmxvY2FsUmVmcyA9IHdlYkRELmdldEVqYkxvY2FsUmVmcygpOwotCi0JaWYgKCFlamJsb2NhbFJlZnMuaXNFbXB0eSgpKQotCQl2YWxpZGF0ZUVKQkxvY2FsUmVmcyhlamJsb2NhbFJlZnMpOwotCi0KLQlFTGlzdCByZXNvdXJjZVJlZnMgPSB3ZWJERC5nZXRSZXNvdXJjZVJlZnMoKTsKLQotCWlmICghcmVzb3VyY2VSZWZzLmlzRW1wdHkoKSkgewotCQkvL3ZhbGlkYXRlUmVzb3VyY2VSZWZzKHJlc291cmNlUmVmcyk7ICAvLyB3ZSB3YW50IHRvIGRvIGFkZGl0aW9uYWwgY2hlY2tzIGhlcmUKLQotCQlpbnQgbnVtUmVmcyA9IHJlc291cmNlUmVmcy5zaXplKCk7Ci0JCVNldCByZWZTZXQgPSBuZXcgSGFzaFNldChudW1SZWZzKTsKLQkJYm9vbGVhbiBpc1ZlcnNpb24yMiA9IHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotCQkKLQkJZm9yIChpbnQgcmVmTm8gPSAwOyByZWZObyA8IG51bVJlZnM7IHJlZk5vKyspIHsKLQkJCVJlc291cmNlUmVmSW1wbCByZWYgPSAoUmVzb3VyY2VSZWZJbXBsKSAocmVzb3VyY2VSZWZzLmdldChyZWZObykpOwotCQkJU3RyaW5nIGF1dGggPSByZWYuZ2V0QXV0aCgpLmdldE5hbWUoKTsKLQotCQkJLy8gQ2hlY2s6IGEgcmVzLWF1dGggZWxlbWVudCBjb250YWluaW5nIENvbnRhaW5lciBvciBBcHBsaWNhdGlvbiBtdXN0IGJlIHN1cHBsaWVkCi0JCQlpZiAoYXV0aCA9PSBudWxsIHx8ICFyZWYuaXNTZXRBdXRoKCkpIHsKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSByZWYuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBtc2dJZCA9IGlzVmVyc2lvbjIyID8gTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMiA6IE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjM7CQotCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgbXNnSWQsIHBhcm1zLHJlZik7CQkKLQkJCX0gZWxzZQotCQkJaWYgKGlzVmVyc2lvbjIyICYmIGF1dGguZXF1YWxzKCJBcHBsaWNhdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSByZWYuZ2V0TmFtZSgpOwotCQkJCWFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIyLCBwYXJtcyxyZWYpOwotCQkJfSBlbHNlCi0JCQlpZiAoIWlzVmVyc2lvbjIyICYmIGF1dGguZXF1YWxzKCJTRVJWTEVUIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IHJlZi5nZXROYW1lKCk7Ci0JCQkJYWRkRXJyb3IoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjMsIHBhcm1zLHJlZik7Ci0JCQl9Ci0KLQkJCS8vIHZhbGlkYXRlIHJlcy1zaGFyaW5nLXNjb3BlIGlzIGFsbG93YWJsZSB2YWx1ZQotCQkJU3RyaW5nIHNoYXJpbmdTY29wZSA9IHJlZi5nZXRSZXNTaGFyaW5nU2NvcGUoKS5nZXROYW1lKCk7Ci0JCQlpZiAoICFpc1ZlcnNpb24yMiApIHsKLQkJCQlpZiAoIHNoYXJpbmdTY29wZSA9PSBudWxsIHx8ICFyZWYuaXNTZXRSZXNTaGFyaW5nU2NvcGUoKSkgewotCQkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMF07Ci0JCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfUkVTX1NIQVJJTkdfU0NPUEUsIHBhcm1zLCByZWYpOwkJCQkJCi0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgcmVmTmFtZSA9IHJlZi5nZXROYW1lKCk7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IHJlZk5hbWU7Ci0JCQlpZiAoIShyZWZTZXQuYWRkKHJlZk5hbWUpKSkKLQkJCQlhZGRFcnJvcigKLQkJCQkJRVJFRl9DQVRFR09SWSwKLQkJCQkJRVJST1JfRUFSX0RVUExJQ0FURV9SRVNSRUYsCi0JCQkJCXBhcm1zLAotCQkJCQlyZWYpOwotCQl9Ci0JfQotCi19Ci0JCi0JCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg3LzYvMjAwMSA0OjExOjA5IFBNKQotICogQHJldHVybiBib29sZWFuCi0gKiBAcGFyYW0gcm9sZSBqYXZhLmxhbmcuU3RyaW5nCi0gKiBAcGFyYW0gZGVmaW5lUm9sZXMgamF2YS51dGlsLkhhc2h0YWJsZQotICogCi0gKiBUaGUgYXV0aC1jb25zdHJhaW50IG9ubHkgbmVlZHMgdG8gaGF2ZSByb2xlLW5hbWUgc3BlY2lmaWVkLgotICogCQk8YXV0aC1jb25zdHJhaW50PgotICoJCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gKgkJCTxyb2xlLW5hbWU+Z3Vlc3Q8L3JvbGUtbmFtZT4gCi0gKgkJPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gKiAKLSAqLwotcHJvdGVjdGVkICB2b2lkIHZhbGlkYXRlQXV0aFNlY1JvbGUoU3RyaW5nIGxpbmssIFN0cmluZyByb2xlLCBIYXNodGFibGUgZGVmaW5lZFJvbGVzLCBFT2JqZWN0IHRhcmdldE9iamVjdCkgewotCVN0cmluZyByTmFtZSA9IHJvbGUgOwotCVN0cmluZyBsTmFtZSA9IGxpbms7Ci0vLwlib29sZWFuIHZhbGlkUm9sZSA9IHRydWU7Ci0vLwlib29sZWFuIHZhbGlkTGluayA9IHRydWU7Ci0JCi0JaWYgKHJOYW1lIT0gbnVsbCkgck5hbWU9IHJOYW1lLnRyaW0oKSA7Ci0JaWYgKGxOYW1lIT0gbnVsbCkgbE5hbWU9IGxOYW1lLnRyaW0oKSA7CQotCQotCWlmICggck5hbWUgIT0gbnVsbCApIHsKLQkJaWYgKCFyTmFtZS5lcXVhbHMoIioiKSAmJiAhck5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCQlpZiAoZGVmaW5lZFJvbGVzLmdldChyTmFtZSkgPT0gbnVsbCAmJiBkZWZpbmVkUm9sZXMuZ2V0KGxOYW1lKSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gck5hbWU7Ci0JCQkJYWRkRXJyb3IoCi0JCQkJCVdBUl9DQVRFR09SWSwKLQkJCQkJTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUsCi0JCQkJCXBhcm1zLAotCQkJCQl0YXJnZXRPYmplY3QpOwotCQkJfQotCQl9Ci0JfQotfQkKLQkKLQkKLQkKLQkKLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDcvNi8yMDAxIDQ6MTE6MDkgUE0pCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBwYXJhbSByb2xlIGphdmEubGFuZy5TdHJpbmcKLSAqIEBwYXJhbSBkZWZpbmVSb2xlcyBqYXZhLnV0aWwuSGFzaHRhYmxlCi0gKiAKLSAqIAotICogdGhlIHNlY3VyaXR5LXJvbGUtcmVmIG11c3QgaGF2ZSBhIG5vbi1udWxsIHJvbGUtbmFtZSBhbmQgdGhlIHJvbGUtbGluawotICogbXVzdCBjb250YWluIHRoZSBuYW1lIG9mIGEgcm9sZSBzcGVjaWZpZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgc2VjdGlvbgotICogCQk8c2VjdXJpdHktcm9sZS1yZWY+IAotICoJCQk8cm9sZS1uYW1lPk15TmFtZTwvcm9sZS1uYW1lPgotICoJCQk8cm9sZS1saW5rPkV4aXN0aW5nUm9sZTwvcm9sZS1saW5rPiAKLSAqCQk8L3NlY3VyaXR5LXJvbGUtcmVmPgotICogCi0gKiAKLSAqLwotcHJvdGVjdGVkICB2b2lkIHZhbGlkYXRlU2VjUm9sZShTdHJpbmcgbGluaywgU3RyaW5nIHJvbGUsIEhhc2h0YWJsZSBkZWZpbmVkUm9sZXMsIEVPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JU3RyaW5nIHJOYW1lID0gcm9sZSA7Ci0JU3RyaW5nIGxOYW1lID0gbGluazsKLS8vCWJvb2xlYW4gdmFsaWRSb2xlID0gdHJ1ZTsKLS8vCWJvb2xlYW4gdmFsaWRMaW5rID0gdHJ1ZTsKLQkKLQlpZiAock5hbWUhPSBudWxsKSByTmFtZT0gck5hbWUudHJpbSgpIDsKLQlpZiAobE5hbWUhPSBudWxsKSBsTmFtZT0gbE5hbWUudHJpbSgpIDsJCi0KLQotCS8vIHRoZSBzZWN1cml0eSByb2xlLW5hbWUgY2Fubm90IGJlIG51bGwKLQlpZiAoIChyTmFtZSA9PSBudWxsIHx8IHJOYW1lLmVxdWFscygiIikpICkgewkgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCXBhcm1zWzBdID0gck5hbWU7Ci0JCWFkZEVycm9yKAotCQkJV0FSX0NBVEVHT1JZLAotCQkJTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUUsCi0JCQlwYXJtcywKLQkJCXRhcmdldE9iamVjdCk7Ci0JfQkJCQkJCQotCi0JaWYgKHJOYW1lID09IG51bGwgfHwgIXJOYW1lLmVxdWFscygiKiIpICkgeyAvLyROT04tTkxTLTEkCQkKLQkJLy8gY2hlY2sgdGhhdCBzZWN1cml0eSByb2xlLWxpbmsgbWF0Y2hlcyBhIGRlZmluZXMgc2VjdXJpdHkgcm9sZQotCQlpZiAobE5hbWUgIT0gbnVsbCAmJiBkZWZpbmVkUm9sZXMuZ2V0KGxOYW1lKSA9PSBudWxsKSB7Ci0KLQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCXBhcm1zWzBdID0gbE5hbWU7Ci0JCQlhZGRFcnJvcigKLQkJCQlXQVJfQ0FURUdPUlksCi0JCQkJTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFLAotCQkJCXBhcm1zLAotCQkJCXRhcmdldE9iamVjdCk7Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICAgKiB2YWxpZGF0ZVNlY3VyaXR5KFdlYkFwcCkKLSAgICogICAgIC0gdmFsaWRhdGUgc2VjdXJpdHkgY29uc3RyYWludHMsIHJvbGVzLCBhbmQgc2VjdXJpdHkgcm9sZSByZWZzCi0gICAqICAgICAtIGRldGFpbHMgdGJkCi0gICAqLwotCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZVNlY3VyaXR5QW5kU2VydmxldHMoKSB7Ci0KLQkgIAotCUVMaXN0IHdlYlJvbGVzID0gd2ViREQuZ2V0U2VjdXJpdHlSb2xlcygpOwotCi0JLy8gVmFsaWRhdGUgc2VjdXJpdHkgcm9sZXMKLQlIYXNodGFibGUgc2VjUm9sZXMgPSBnZXRBbmRWYWxpZGF0ZVNlY3VyaXR5Um9sZXMod2ViUm9sZXMpIDsKLQotCS8vIFZhbGlkYXRlIFNlcnZsZXRzL0pTUHMgYW5kIHRoZWlyIHJvbGUgcmVmLgotCXZhbGlkYXRlU2VydmxldHMod2ViREQuZ2V0U2VydmxldHMoKSxzZWNSb2xlcyk7Ci0KLQl2YWxpZGF0ZVNlY3VyaXR5Q29uc3RyYWludHMod2ViREQuZ2V0Q29uc3RyYWludHMoKSwgc2VjUm9sZXMpIDsKLQotLy8JdHJ5IHsKLQkgaWYgKCEod2ViUm9sZXMuaXNFbXB0eSgpKSkgewotCSAgRUFSRmlsZSBtb2R1bGUgPSB3YXJGaWxlLmdldEVBUkZpbGUoKTsKLQkgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkgIEVMaXN0IGVhclJvbGVMaXN0ID0gbW9kdWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkgIHZhbGlkYXRlV0VCUm9sZXNXaXRoRUFSUm9sZXMoZWFyUm9sZUxpc3QsIHdlYlJvbGVzKTsKLQkgIH0KLQkgfQotLy8JfSBjYXRjaCAoVW5jb250YWluZWRNb2R1bGVGaWxlRXhjZXB0aW9uIHVlKSB7Ci0vLwkgIFN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLS8vCSAgcGFybXNbMF0gPSB3YXJGaWxlLmdldE5hbWUoKTsKLS8vICAgIGFkZEVycm9yKEVSRUZfQ0FURUdPUlksIEVSUk9SX0VBUl9VTkNPTlRBSU5FRF9NT0RVTEVfRklMRV9FWENFUFRJT04sIHBhcm1zKTsKLS8vCX0KLX0KLS8qKgotICogVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eQotICogY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbnMKLSAqIDwhRUxFTUVOVCBzZWN1cml0eS1jb25zdHJhaW50ICh3ZWItcmVzb3VyY2UtY29sbGVjdGlvbissCi0gKiAgICAgICAgICAgYXV0aC1jb25zdHJhaW50PywgdXNlci1kYXRhLWNvbnN0cmFpbnQ/KT4KLSAqIAotICogQHBhcmFtIGNvbnN0cmFpbnRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdAotICovCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZVNlY3VyaXR5Q29uc3RyYWludHMoRUxpc3QgY29uc3RyYWludHMsIEhhc2h0YWJsZSBzZWNSb2xlcykgewotCQotICBpZiAoY29uc3RyYWludHMuaXNFbXB0eSgpKSByZXR1cm4gOwotIAotICBJdGVyYXRvciBjb25zdExpc3QgPSBjb25zdHJhaW50cy5pdGVyYXRvcigpOwotICB3aGlsZSAoY29uc3RMaXN0Lmhhc05leHQoKSkgewotCSAgU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnQgPSAoU2VjdXJpdHlDb25zdHJhaW50KSBjb25zdExpc3QubmV4dCgpIDsKLQotCSAgRUxpc3Qgd2ViUmVzb3VyY2VMaXN0ID0gY29uc3RyYWludC5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkgOwotCSAgaWYgKHdlYlJlc291cmNlTGlzdCA9PSBudWxsIHx8IHdlYlJlc291cmNlTGlzdC5pc0VtcHR5KCkpIHsKLQkJICBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCSAgcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib2ZfVHlwZV9XZWJfUmVzb3VyY2VfQ29sbGVjdGlvbl82NCIpIDsgLy8kTk9OLU5MUy0xJAotCQkgIGFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsY29uc3RyYWludCk7Ci0JCSAgY29udGludWUgOyAgICAgICAgICAKLQkgIH0gICAKLQkgIHZhbGlkYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9ucyAod2ViUmVzb3VyY2VMaXN0KSA7Ci0KLQkgIEF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50ID0gY29uc3RyYWludC5nZXRBdXRoQ29uc3RyYWludCgpIDsKLQkgIGlmIChhdXRoQ29uc3RyYWludCAhPSBudWxsKSAgdmFsaWRhdGVBdXRoQ29uc3RyYWludChhdXRoQ29uc3RyYWludCxzZWNSb2xlcykgOwotCi0JICBVc2VyRGF0YUNvbnN0cmFpbnQgZGF0YUNvbnN0cmFpbnQgPSBjb25zdHJhaW50LmdldFVzZXJEYXRhQ29uc3RyYWludCgpIDsKLQkgIGlmIChkYXRhQ29uc3RyYWludCAhPSBudWxsICYmIGRhdGFDb25zdHJhaW50LmdldFRyYW5zcG9ydEd1YXJhbnRlZSgpICE9IG51bGwpIHsKLQkJIC8vICAgPCFFTEVNRU5UIHVzZXItZGF0YS1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHRyYW5zcG9ydC1ndWFyYW50ZWUpPgotCQkgLy8gVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotCQkgLy8gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi0JCSAvLyBDT05GSURFTlRJQUwuIAotCi0vLwkJICBFRW51bUxpdGVyYWwgdHJhbnNwb3J0ID0gZGF0YUNvbnN0cmFpbnQuZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCSAgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSB0cmFuc3BvcnQgPSBkYXRhQ29uc3RyYWludC5nZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQkJICBpZiAodHJhbnNwb3J0ID09IG51bGwgfHwgIWRhdGFDb25zdHJhaW50LmlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgKSB7Ci0JCQkgICBhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9UUkFOU1BPUlQsIG5ldyBTdHJpbmdbMF0sIGRhdGFDb25zdHJhaW50KTsKLQkJIH0KLQkgIH0KLSAgfSAgICAgICAgCi19Ci0KLXB1YmxpYyB2b2lkIHZhbGlkYXRlRmlsdGVycyhFTGlzdCBmaWx0ZXJMaXN0KXsKLQkJaWYgKGZpbHRlckxpc3QuaXNFbXB0eSgpKSByZXR1cm4gOwotCQkKLQkJSXRlcmF0b3IgZmlsdGVycyA9IGZpbHRlckxpc3QuaXRlcmF0b3IoKTsKLQotCQlIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCkgOwotCi0JCXdoaWxlIChmaWx0ZXJzLmhhc05leHQoKSkgewotCQkJRmlsdGVyIG5leHRGaWx0ZXIgPSAoRmlsdGVyKSBmaWx0ZXJzLm5leHQoKTsKLQkJCVN0cmluZyAgbmFtZSA9IG5leHRGaWx0ZXIuZ2V0TmFtZSgpIDsKLQkJCWlmIChuYW1lICE9IG51bGwpICBuYW1lID0gbmFtZS50cmltKCkgOwotCi0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfRmlsdGVyX05hbWVfNjYiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsbmV4dEZpbHRlcik7Ci0JCQkJY29udGludWUgOwotCQkJfSAgICAgICAgICAgCi0JCQlpZiAocmVtZW1iZXIuZ2V0KG5hbWUpICE9IG51bGwpIHsgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gbmFtZSA7Ci0JCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0ZJTFRFUiwgcGFybXMsbmV4dEZpbHRlcik7Ci0JCQkJY29udGludWUgOwotCQkJfQotCQkJcmVtZW1iZXIucHV0KG5hbWUsIlllYSIpIDsgLy8kTk9OLU5MUy0xJAotCQl9Ci19Ci0KLS8qKgotICAgKiB2YWxpZGF0ZUZpbHRlck1hcHBpbmdzKEVsaXN0KEZpbHRlcnMncykpCi0gICAqICAgICAtIGZvciBlYWNoIGZpbHRlciBtYXBwaW5nLCBtYWtlIHN1cmUgdGhlIG5hbWVkIGZpbHRlciBleGlzdHMKLSAgICovCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbHRlck1hcHBpbmdzKEVMaXN0IGZpbHRlck1hcHBpbmdzTGlzdCkgewotCi0gIGlmIChmaWx0ZXJNYXBwaW5nc0xpc3QuaXNFbXB0eSgpKSByZXR1cm4gOwotIAotICBJdGVyYXRvciBmaWx0ZXJNYXBwaW5ncyA9IGZpbHRlck1hcHBpbmdzTGlzdC5pdGVyYXRvcigpOwotICB3aGlsZSAoZmlsdGVyTWFwcGluZ3MuaGFzTmV4dCgpKSB7Ci0JRmlsdGVyTWFwcGluZyBuZXh0TWFwcGluZyA9IChGaWx0ZXJNYXBwaW5nKSBmaWx0ZXJNYXBwaW5ncy5uZXh0KCk7Ci0KLQkvLyBNYXBwaW5nIGNhbiBiZSBlaXRoZXIgc2VydmxldCBvciB1cmwJCi0JaWYgKCBuZXh0TWFwcGluZy5nZXRVcmxQYXR0ZXJuKCkgIT0gbnVsbCApIHsKLQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQlTdHJpbmcgdXJsID0gbmV4dE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpOwotCQlwYXJtc1swXSA9IHVybCA7Ci0JCWlmICggdXJsID09IG51bGwgKSB7Ci0JCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCwgcGFybXMsbmV4dE1hcHBpbmcpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCBuZXh0TWFwcGluZy5nZXRGaWx0ZXIoKSA9PSBudWxsIHx8IG5leHRNYXBwaW5nLmdldEZpbHRlcigpLmVxdWFscygiIiApICkgeyAvLyROT04tTkxTLTEkCi0JCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkcsIHBhcm1zLG5leHRNYXBwaW5nKTsJCQotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCS8vIElzIGlzIGEgdmFsaWQgVVJJIG5vdGF0aW9uID8KLQkJdHJ5IHsKLQkJICAgaWYgKHVybC5lcXVhbHMoIiIpKSB0aHJvdyBuZXcgRXhjZXB0aW9uKFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbnZhbGlkX1VSTF83MCIpKSA7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLyBZb3UgY2FuJ3QgdXNlIGNvbS5pYm0ud2VidG9vbHMuVVJJIGhlcmUuLi4KLQkJLy8gICAgICAgY29tLmlibS5pd3Qud2VidG9vbHMuVVJJIHVyaSA9IG5ldyBjb20uaWJtLml3dC53ZWJ0b29scy5VUkkodXJsKSA7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkgIHBhcm1zWzBdID0gbmV4dE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpOwotCQkgIGFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCwgcGFybXMsbmV4dE1hcHBpbmcpOwotCQkgIGNvbnRpbnVlIDsKLQkJfQkJCQotCX0KLQllbHNlIGlmICggbmV4dE1hcHBpbmcuZ2V0U2VydmxldE5hbWUoKSAhPSBudWxsICkgewotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCVN0cmluZyBzZXJ2bGV0TmFtZSA9IG5leHRNYXBwaW5nLmdldFNlcnZsZXROYW1lKCk7Ci0JCXBhcm1zWzBdID0gc2VydmxldE5hbWUgOwotCQlpZiAoIG5leHRNYXBwaW5nLmdldFNlcnZsZXQoKSA9PSBudWxsICkgewotCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fQlJPS0VOX1NFUlZMRVRfTUFQUElORywgcGFybXMsbmV4dE1hcHBpbmcpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCBuZXh0TWFwcGluZy5nZXRGaWx0ZXIoKSA9PSBudWxsIHx8IG5leHRNYXBwaW5nLmdldEZpbHRlcigpLmVxdWFscygiIiApICkgeyAvLyROT04tTkxTLTEkCi0JCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkcsIHBhcm1zLG5leHRNYXBwaW5nKTsJCQotCQkJY29udGludWU7Ci0JCX0JCi0JfQotLy8JZWxzZSB7Ci0vLwkJLy8gb3RoZXJ3aXNlIG5laXRoZXIgc2VydmxldC1uYW1lIG9yIHVybC1tYXBwaW5nIGlzIGRlZmluZWQgLSB0aGlzIGdldHMgZmxhZ2dlZCBieSB0aGUgeG1sIHZhbGlkYXRvcgotLy8JCS8vIGFzIHRoaXMgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgRFRECi0vLwkJCi0vLwl9CQotCi0KLSAgfQotCi19Ci0KLQotCi0KLQotCi0vKioKLSAgICogdmFsaWRhdGVTZXJ2bGV0cyhFbGlzdChTZXJ2bGV0J3MpKQotICAgKiAgICAgLSBmb3IgZWFjaCBzZXJ2bGV0IG1hcHBpbmcsIG1ha2Ugc3VyZSB0aGUgbmFtZWQgc2VydmxldCBleGlzdHMKLSAgICovCi0KLXB1YmxpYyB2b2lkIHZhbGlkYXRlU2VydmxldE1hcHBpbmdzKEVMaXN0IHNlcnZsZXRNYXBwaW5nc0xpc3QpIHsKLQotICBpZiAoc2VydmxldE1hcHBpbmdzTGlzdC5pc0VtcHR5KCkpIHJldHVybiA7Ci0gCi0gIEl0ZXJhdG9yIHNlcnZsZXRNYXBwaW5ncyA9IHNlcnZsZXRNYXBwaW5nc0xpc3QuaXRlcmF0b3IoKTsKLQotICBIYXNodGFibGUgcmVtZW1iZXIgPSBuZXcgSGFzaHRhYmxlKCkgOwotICB3aGlsZSAoc2VydmxldE1hcHBpbmdzLmhhc05leHQoKSkgewotCVNlcnZsZXRNYXBwaW5nIG5leHRNYXBwaW5nID0gKFNlcnZsZXRNYXBwaW5nKSBzZXJ2bGV0TWFwcGluZ3MubmV4dCgpOwotCVN0cmluZyB1cmwgPSBuZXh0TWFwcGluZy5nZXRVcmxQYXR0ZXJuKCkgOwotCi0JLy8gQ2hlY2sgZm9yIG51bGwgc2VydmxldCwgaWYgdGhlIG5hbWUgaXMgcmlnaHQgdGhlIHJlZmxlY3Rpb24KLQkvLyBoYXMgYWxyZWFkeSByZXNvbHZlZCBpdC4KLQotCWlmICh1cmwgIT0gbnVsbCkgeyAgICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGUgZmlyc3QsIG5vIG5lZWQgdG8gcmVwZWF0IGVhcmxpZXIgZXJyb3IsCi0JICB1cmwgPSB1cmwudHJpbSAoKSA7Ci0JICBpZiAocmVtZW1iZXIuZ2V0KHVybCkhPW51bGwpIHsKLQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQlwYXJtc1swXSA9IG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX01BUFBJTkcsIHBhcm1zLG5leHRNYXBwaW5nKTsKLQkJY29udGludWUgOwotCSAgfQotCSAgcmVtZW1iZXIucHV0KG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKSwiWWVhIikgOyAvLyROT04tTkxTLTEkCi0JfQotCSAgCi0KLQlpZiAodXJsID09IG51bGwgfHwgbmV4dE1hcHBpbmcuZ2V0U2VydmxldCgpID09IG51bGwgfHwgbmV4dE1hcHBpbmcuZ2V0U2VydmxldCgpLmVxdWFscygiIikpeyAvLyROT04tTkxTLTEkCi0JICBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JICBwYXJtc1swXSA9IHVybCA7Ci0JICBpZiAodXJsID09IG51bGwpCi0JCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfVVJMLCBwYXJtcyxuZXh0TWFwcGluZyk7Ci0JICBlbHNlCi0JCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkcsIHBhcm1zLG5leHRNYXBwaW5nKTsKLQkgIGNvbnRpbnVlIDsKLQl9Ci0KLQkvLyBJcyBpcyBhIHZhbGlkIFVSSSBub3RhdGlvbiA/Ci0JdHJ5IHsKLQkgICBpZiAodXJsLmVxdWFscygiIikpIHRocm93IG5ldyBFeGNlcHRpb24oV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkludmFsaWRfVVJMXzc1IikpIDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLS8vCi0vLyBUaGUgc3BlYyBkb2VzIG5vdCBwcm9oaWJpdCB3aGl0ZXNwYWNlIGluIHRoZSB1cmwtcGF0dGVybnMKLS8vCSAgIAotLy8JICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBVUkwtIGhhcyBubyB3aGl0ZSBzcGFjZQotLy8JICAgY2hhcltdIGNoYXJzID0gdXJsLnRvQ2hhckFycmF5KCk7Ci0vLwkgICBpbnQgbGVuID0gY2hhcnMubGVuZ3RoOwotLy8JICAgZm9yIChpbnQgY250ID0gMDsgY250IDwgY2hhcnMubGVuZ3RoOyBjbnQrKykKLS8vCSAgIHsKLS8vCSAgIAkgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2NudF0pKQotLy8JICAgCSAgCXRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgVVJMIikgOwotLy8JICAgfQotLy8gWW91IGNhbid0IHVzZSBjb20uaWJtLndlYnRvb2xzLlVSSSBoZXJlLi4uCi0vLyAgICAgICBjb20uaWJtLml3dC53ZWJ0b29scy5VUkkgdXJpID0gbmV3IGNvbS5pYm0uaXd0LndlYnRvb2xzLlVSSSh1cmwpIDsKLQl9Ci0JY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JICBwYXJtc1swXSA9IG5leHRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLQkgIGFkZEVycm9yKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTCwgcGFybXMsbmV4dE1hcHBpbmcpOwotCSAgY29udGludWUgOwotCX0KLSAgfQotCi19Ci0JLyoqCi0JICogdmFsaWRhdGVTZXJ2bGV0cyhFbGlzdChTZXJ2bGV0J3MpKQotCSAqICAgICAtIGlmIGl0J3MgYSBKU1AsIHZlcmlmeSB0aGUgZmlsZSBleGlzdHMKLQkgKiAgICAgLSB2YWxpZGF0ZSBvcHRpb25hbCBzZWN1cml0eSByb2xlIHJlZnMgZm9yIGV4aXN0ZW5jZSBvZgotCSAqICAgICAgIHRoZSBzZWN1cml0eSByb2xlCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlcnZsZXRzKEVMaXN0IHNlcnZsZXRMaXN0LCBIYXNodGFibGUgc2VjUm9sZXMpCi0JewotCQlpZiAoc2VydmxldExpc3QuaXNFbXB0eSgpKSByZXR1cm4gOwotCQkKLQkJSXRlcmF0b3Igc2VydmxldHMgPSBzZXJ2bGV0TGlzdC5pdGVyYXRvcigpOwotCi0JCUhhc2h0YWJsZSByZW1lbWJlciA9IG5ldyBIYXNodGFibGUoKSA7Ci0KLQkJd2hpbGUgKHNlcnZsZXRzLmhhc05leHQoKSkgewotCQkJU2VydmxldCBuZXh0U2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0cy5uZXh0KCk7Ci0JCQlTdHJpbmcgIG5hbWUgPSBuZXh0U2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpIDsKLQkJCWlmIChuYW1lICE9IG51bGwpICBuYW1lID0gbmFtZS50cmltKCkgOwotCi0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfU2VydmxldF9OYW1lXzc3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsbmV4dFNlcnZsZXQpOwotCQkJCWNvbnRpbnVlIDsKLQkJCX0gICAgICAgICAgIAotCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7ICAvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IG5hbWUgOwotCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9TRVJWTEVULCBwYXJtcyxuZXh0U2VydmxldCk7Ci0JCQkJY29udGludWUgOwotCQkJfQotCQkJcmVtZW1iZXIucHV0KG5hbWUsIlllYSIpIDsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBWYWxpZGF0ZSBzZXJ2bGV0IHJvbGVzCi0JCQlFTGlzdCByb2xlc0xpc3QgPSBuZXh0U2VydmxldC5nZXRTZWN1cml0eVJvbGVSZWZzKCkgOwotCQkJaWYgKCFyb2xlc0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkgICBJdGVyYXRvciByb2xlcyA9IHJvbGVzTGlzdC5pdGVyYXRvcigpIDsKLQkJCSAgIHdoaWxlIChyb2xlcy5oYXNOZXh0KCkpIHsKLQkJCQkgICBTZWN1cml0eVJvbGVSZWYgcm9sZSA9IChTZWN1cml0eVJvbGVSZWYpIHJvbGVzLm5leHQoKSA7Ci0JCQkJICAgdmFsaWRhdGVTZWNSb2xlKHJvbGUuZ2V0TGluaygpLCByb2xlLmdldE5hbWUoKSxzZWNSb2xlcyxyb2xlKSA7Ci0JCQkgICB9Ci0JCQl9Ci0KLQkJCS8vIGlmIGl0J3MgYSBKU1AsIHRoZSBqc3AtZmlsZSBhdHRyaWJ1dGUgTVVTVCBiZSBhIGZ1bGwtcGF0aCwgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2bGV0IDIuMiBzcGVjCi0JCQlpZiAoIG5leHRTZXJ2bGV0LmdldFdlYlR5cGUoKS5pc0pzcFR5cGUoKSApIHsKLQkJCQlKU1BUeXBlIGpzcFR5cGUgPSAoSlNQVHlwZSkobmV4dFNlcnZsZXQuZ2V0V2ViVHlwZSgpKTsKLQkJCQkKLQkJCQlTdHJpbmcganNwRmlsZU5hbWUgPSBqc3BUeXBlLmdldEpzcEZpbGUoKTsKLQkJCQlpZiAoIGpzcEZpbGVOYW1lID09IG51bGwgfHwgIShqc3BGaWxlTmFtZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1syXTsKLQkJCQkJcGFybXNbMF0gPSBqc3BGaWxlTmFtZTsKLQkJCQkJcGFybXNbMV0gPSBuYW1lOwotCQkJCQlhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRiwgcGFybXMsbmV4dFNlcnZsZXQpOwotCQkJCX0gIAotCQkJfQotCi0JCSAgIC8qICBObyBuZWVkIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIEpTUHMgb3IgU2VydmxldHMuICB0aGUgTGlua0J1aWxkZXIgd2lsbCBkbyB0aGlzICovICAgICAgICAgICAgCi0JCQkKLQkJfQotCX0KLQkKLXB1YmxpYyB2b2lkIHZhbGlkYXRlVGFnTGlicygpewotCQotCWlmICh3ZWJERC5nZXRUYWdMaWJzKCkuaXNFbXB0eSgpKQotCQlyZXR1cm47Ci0KLQlJdGVyYXRvciB0YWdzID0gd2ViREQuZ2V0VGFnTGlicygpLml0ZXJhdG9yKCk7Ci0JSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0Jd2hpbGUgKHRhZ3MuaGFzTmV4dCgpKSB7Ci0JCQotCQlUYWdMaWJSZWYgdGFnbGliID0gKFRhZ0xpYlJlZikgdGFncy5uZXh0KCk7IC8vIENsYXNzQ2FzdEV4Y2VwdGlvbiBhdCBydW50aW1lCi0JCVN0cmluZyB1cmkgPSB0YWdsaWIuZ2V0VGFnbGliVVJJKCk7Ci0JCQotCQlpZiAodXJpICE9IG51bGwpCi0JCQl1cmkgPSB1cmkudHJpbSgpOwotCi0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX1RhZ2xpYl84MCIpOyAvLyROT04tTkxTLTEkCi0JCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWSwgcGFybXMsIHRhZ2xpYik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocmVtZW1iZXIuZ2V0KHVyaSkgIT0gbnVsbCkgeyAvLyBDaGVjayBmb3IgZHVwcwotCi0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJvZl9UeXBlX1RhZ0xpYl9fXzgxIikgKyAiOiAiICsgdXJpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQlhZGRXYXJuaW5nKFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlksIHBhcm1zLCB0YWdsaWIpOwotCQkJY29udGludWU7Ci0JCX0KLQkJcmVtZW1iZXIucHV0KHVyaSwgIlllYSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQotCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbnMoRUxpc3Qgd2ViUmVzb3VyY2VMaXN0KSB7Ci0KLQotCSAgSXRlcmF0b3IgcmVzb3VyY2VMaXN0ID0gd2ViUmVzb3VyY2VMaXN0Lml0ZXJhdG9yICgpIDsKLQkgIHdoaWxlIChyZXNvdXJjZUxpc3QuaGFzTmV4dCgpKSB7ICAvLyBDaGVjayB0aGUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zCi0JCSAgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHJlc291cmNlID0gKFdlYlJlc291cmNlQ29sbGVjdGlvbikgcmVzb3VyY2VMaXN0Lm5leHQoKSA7Ci0KLQkJICBTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldFdlYlJlc291cmNlTmFtZSgpIDsKLQkJICBpZiAobmFtZSAhPSBudWxsKSBuYW1lID0gbmFtZS50cmltKCkgOwotCQkgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7ICAvLyBzaG91bGQgaGF2ZSBhIG5hbWUgLy8kTk9OLU5MUy0xJAotCQkJICBTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkgIHBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm9mX1R5cGVfV2ViX1Jlc291cmNlX05hbWVfODQiKSA7IC8vJE5PTi1OTFMtMSQKLQkJCSAgYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlkgLCBwYXJtcyxyZXNvdXJjZSk7ICAgICAgICAgICAgIAotCQkgIH0KLQotCQkgIC8vIENoZWNrIHRoYXQgdGhlIGh0dHAgbWV0aG9kcywgaWYgYW55IGlzIGNvcnJlY3QKLQkJICBFTGlzdCBodHRwTGlzdCA9IHJlc291cmNlLmdldEhUVFBzKCkgOwotCQkgIGlmICghaHR0cExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkgIEl0ZXJhdG9yIGh0dHBzID0gaHR0cExpc3QuaXRlcmF0b3IgKCkgOwotCQkJICB3aGlsZSAoaHR0cHMuaGFzTmV4dCgpKSB7Ci0JCQkJICBIVFRQTWV0aG9kVHlwZSBodHRwTWV0aG9kID0gKEhUVFBNZXRob2RUeXBlKSBodHRwcy5uZXh0KCkgOwotCQkJCSAgU3RyaW5nIG1ldGhvZCA9IGh0dHBNZXRob2QuZ2V0SHR0cE1ldGhvZCgpIDsKLQotCQkJCSAgaWYgKG1ldGhvZCA9PSBudWxsIHx8IWlzSHR0cE1ldGhvZChtZXRob2QpKSB7Ci0JCQkJCSAgU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQkgIHBhcm1zWzBdID0gbWV0aG9kIDsKLQkJCQkJICBhZGRFcnJvcihXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRCAsIHBhcm1zLGh0dHBNZXRob2QpOyAgICAgICAgICAgIAotCQkJCSAgfQotCi0JCQkJICAKLQkJCSAgfQotCQkgIH0KLQkgIH0KLX0KLS8qKgotICAgKiB2YWxpZGF0ZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QpCi0gICAqICAgICAtIHdhbGsgdGhyb3VnaCB0aGUgZmlsZXMgYW5kIHZlcmlmeSB0aGV5IGV4aXN0Ci0gICAqLwotCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3QgZmlsZUxpc3QpIHsKLSAgaWYgKGZpbGVMaXN0ID09IG51bGwpCi0JcmV0dXJuOwotCi0gIEl0ZXJhdG9yIGZpbGVzID0gZmlsZUxpc3QuZ2V0RmlsZSgpLml0ZXJhdG9yKCk7Ci0KLSAgSGFzaHRhYmxlIHJlbWVtYmVyID0gbmV3IEhhc2h0YWJsZSgpIDsKLSAgd2hpbGUgKGZpbGVzLmhhc05leHQoKSkgewotCVdlbGNvbWVGaWxlIG5leHRGaWxlID0gKFdlbGNvbWVGaWxlKSBmaWxlcy5uZXh0KCk7Ci0JU3RyaW5nIGZpbGVOYW1lID0gbmV4dEZpbGUuZ2V0V2VsY29tZUZpbGUoKTsKLQotCWlmICgoZmlsZU5hbWUgPT0gbnVsbCkgfHwgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApICkgewotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMF07Ci0JCWFkZFdhcm5pbmcoIFdBUl9DQVRFR09SWSwgTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEUscGFybXMsbmV4dEZpbGUgKTsJCQotCX0KLQllbHNlIGlmICggKGZpbGVOYW1lLnN0YXJ0c1dpdGgoIi8iKSApIHx8IChmaWxlTmFtZS5lbmRzV2l0aCgiLyIpICkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1swXTsKLQkJYWRkV2FybmluZyggV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFLHBhcm1zLG5leHRGaWxlICk7Ci0JfQotCWZpbGVOYW1lID0gZmlsZU5hbWUudHJpbSgpIDsKLQlpZiAocmVtZW1iZXIuZ2V0KGZpbGVOYW1lKSAhPSBudWxsKSB7Ci0JCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygib2ZfVHlwZV9XZWxjb21lX0ZpbGVfTmFtZV9fODciKSArICI6ICIgKyBmaWxlTmFtZSA7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcyxuZXh0RmlsZSk7Ci0JCWNvbnRpbnVlIDsgICAgICAKLQl9Ci0JcmVtZW1iZXIucHV0KGZpbGVOYW1lLCJZZWEiKSA7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9yYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjZjZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXz1JV0FFMDA1NEUgRG9jdW1lbnQgdHlwZSB2ZXJzaW9uICJ7MH0iIGZvciByYXIueG1sIGluIHByb2plY3QgInsxfSIgbmVlZHMgdG8gYmUgdmVyc2lvbiAiezJ9Ii4KLUVSUk9SX0lOVkFMSURfQ09OTkVDVE9SX0ZJTEU9IkludmFsaWQgUkFSIEZpbGUiLgotRVJST1JfQ09OTkVDVE9SX1ZBTElEQVRJT05fRkFJTEVEPSJSQVIgVmFsaWRhdGlvbiBmYWlsZWQiLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5MGU5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZCBhbGwgdGhlIGV4dGVybmFsaXNlZCBzdHJpbmdzIGZvciBlVG9vbHMgV0FSIFZhbGlkYXRpb24gcHJvamVjdAotIyBWYWxpZGF0aW9uIHByb2plY3QKLSMKLSMgTWVzc2FnZXMgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGF0OgotIyAgICAgaHR0cDovL2hhbnkuYXVzdGluLmlibS5jb20vbWVzc2FnZXMvaW5kZXguaHRtbAotIwotIyBCcmllZmx5OgotIyAgICAgTUVTU0FHRV9JRD08Q29tcG9uZW50UHJlZml4PjxNZXNzYWdlTnVtYmVyPjxUeXBlQ29kZT46IDxNZXNzYWdlVGV4dD4KLSMKLSMgVGhlIHByZWZpeCBmb3IgdGhpcyBjb21wb25lbnQgaXM6Ci0jICAgICBDSEtKIChJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24pCi0jCi0jIE5vdGUgdGhlICI6ICIgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIHR5cGUgY29kZSBhbmQgdGhlIG1lc3NhZ2UgdGV4dC4KLSMKLSMgOkJlZ2luOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpCZWdpbjoKLSNDT01QT05FTlRQUkVGSVggQ0hLSgotI0NPTVBPTkVOVE5BTUVGT1IgQ0hLSiBJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24KLSNDTVZDUEFUSE5BTUUgbmNmL3NyYy9qYXZhL2NvbS9pYm0vd2Vic3BoZXJlL3ZhbGlkYXRpb24vd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLSMKLQotIyAyLUp1bHktMjAwMToKLSMgIFRoaXMgZmlsZSBoYXMgYmVlbiB0ZXN0ZWQgdXNpbmcgdGhlIFByb2Nlc3NNc2dGaWxlIHRvb2wsIHdyaXR0ZW4gYnkgCi0jICBIYW55IFNhbGVtIGFuZCBvd25lZCBieSBEZW5uaXMgSGViZXJ0LiAgQW55IGZ1dHVyZSBjaGFuZ2VzIHNob3VsZCAKLSMgIGFsc28gYmUgdmVyaWZpZWQgdXNpbmcgdGhpcyB0b29sLiAgUGxlYXNlIGNvbnRhY3QgRGVubmlzIAotIyAgKGhlYmVydEB1cy5pYm0uY29tIG9yIFQvTCA1NDMtMjUyMCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0jCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRD1DSEtKMzAwMEU6IFdBUiBWYWxpZGF0aW9uIEZhaWxlZDogezB9Ci0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUz1DSEtKMTAwMkU6IER1cGxpY2F0ZSBzZWN1cml0eSByb2xlIG5hbWVkIHswfS4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19KU1A9Q0hLSjMwMDFFOiBUaGUgSlNQIGZpbGUsIHswfSwgZm9yIHRoZSBzZXJ2bGV0IFwiezF9XCIgaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TTUFMTF9JQ09OPUNIS0ozMDAyRTogVGhlIDxzbWFsbC1pY29uPiBmaWxlLCB7MH0sIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTEFSR0VfSUNPTj1DSEtKMzAwM0U6IFRoZSA8bGFyZ2UtaWNvbj4gZmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkc9Q0hLSjMwMDRXOiBUaGUgc2VydmxldCBtYXBwaW5nIFwiezB9XCIgcmVmZXJzIHRvIGEgc2VydmxldCB0aGF0IGlzIG5vdCBkZWZpbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX05PX1dFTENPTUVfRklMRT1DSEtKMzAwNUU6IEVtcHR5IHdlbGNvbWUgZmlsZSBsaXN0IGVudHJ5LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFPUNIS0ozMDA2RTogV2VsY29tZSBmaWxlIHswfSBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfVExEPUNIS0ozMDA3RTogVGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgRmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9JTlZBTElEX1dBUl9GSUxFPUNIS0ozMDA4RTogTWlzc2luZyBvciBpbnZhbGlkIFdBUiBmaWxlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9GSUxURVJfTUFQUElORz1DSEtKMzAwOUU6IFRoZSBmaWx0ZXIgbWFwcGluZyBcInswfVwiIHJlZmVycyB0byBhIGZpbHRlciB0aGF0IGlzIG5vdCBkZWZpbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFPUNIS0ozMDEwVzogV2VsY29tZSBGaWxlcyBjYW5ub3QgYmVnaW4gb3IgZW5kIHdpdGggYSAvLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfUEFSU0VfTElORUNPTD1DSEtKMTAwOUU6IFBhcnNpbmcgRXJyb3I6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX0xJTkU9Q0hLSjEwMTBFOiBEZXBsb3ltZW50IERlc2NyaXB0b3IgUGFyc2luZyBlcnJvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX05PSU5GTz1DSEtKMTAxMUU6IERlcGxveW1lbnQgRGVzY3JpcHRvciBQYXJzaW5nIGVycm9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfQ0FOTk9UX09QRU5fREQ9Q0hLSjEwMTJFOiBDYW5ub3Qgb3BlbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBWYWxpZGF0aW9uIGNhbm5vdCBjb21wbGV0ZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTD1DSEtKMzAxM0U6IFRoZSBVUkwgTWFwcGluZyBcInswfVwiIGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRT1DSEtKMzAxNEU6IEludmFsaWQgU2VjdXJpdHkgcm9sZS1saW5rOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRD1DSEtKMzAxNUU6IEludmFsaWQgSFRUUCBtZXRob2Q6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1RSQU5TUE9SVD1DSEtKMzAxNkU6IEludmFsaWQgVHJhbnNwb3J0IEd1cmFyYW50ZWUuICBWYWxpZCB2YWx1ZXMgYXJlIFwiTk9ORVwiLCBcIklOVEVHUkFMXCIsIG9yIFwiQ09ORklERU5USUFMXCIuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRj1DSEtKMzAxOEU6IFRoZSBqc3AtZmlsZSBcInswfVwiIHJlZmVyZW5jZWQgYnkgc2VydmxldCB7MX0gbXVzdCBiZSBhIGZ1bGwgYWJzb2x1dGUgcGF0aC4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1Q9Q0hLSjMwMTdFOiBXZWIgUHJvamVjdDogezB9IGlzIG1hcHBlZCB0byBhbiBpbnZhbGlkIENvbnRleHQgcm9vdDogezF9IGluIEVBUiBQcm9qZWN0OiB7Mn0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9QQUdFPUlXQUUwMDAxRSBDSEtKMzAxOUU6IFRoZSBMb2NhdGlvbiBvZiB0aGUgRXJyb3IgUGFnZSBNdXN0IEJlZ2luIHdpdGggYSAvLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEVfTkFNRT1DSEtKMzAyMEU6IEludmFsaWQgU2VjdXJpdHkgcm9sZS1uYW1lOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9BVVRIX01FVEhPRD1DSEtKMzAyMUU6IEludmFsaWQgYXV0aCBtZXRob2QuICBWYWxpZCB2YWx1ZXMgYXJlOiBcIkJBU0lDXCIsIFwiRElHRVNUXCIsIFwiRk9STVwiLCBvciBcIkNMSUVOVC1DRVJUXCIuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSUdOT1JFX0ZPUk1fTE9HSU49Q0hLSjMwMjJFOiAgQXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHswfS4gIFRoZSBmb3JtLWxvZ2luLWNvbmZpZyB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB1c2luZyBGT1JNIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMj1DSEtKMzAyM0U6ICBSZXNvdXJjZSByZWYgezB9IG11c3QgY29udGFpbiByZXMtYXV0aCBvZiAiU0VSVkxFVCIgb3IgIkNPTlRBSU5FUiIuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIzPUNIS0ozMDI0RTogIFJlc291cmNlIHJlZiB7MH0gbXVzdCBjb250YWluIHJlcy1hdXRoIG9mICJBcHBsaWNhdGlvbiIgb3IgIkNvbnRhaW5lciIuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjI9Q0hLSjMwMjVFOiAgXCJBcHBsaWNhdGlvblwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvci5yZXMtYXV0aCBpbiBhIDIuMiBsZXZlbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBVc2UgXCJTRVJWTEVUXCIgaW5zdGVhZC4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMz1DSEtKMzAyNkU6ICBcIlNFUlZMRVRcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IucmVzLWF1dGggaW4gYSAyLjIgbGV2ZWwgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVXNlIFwiQXBwbGljYXRpb25cIiBpbnN0ZWFkLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVhDRVBUSU9OX1RZUEU9Q0hLSjMwMjdFOiAgSW52YWxpZCBFeGNlcHRpb24gVHlwZSB7MH0uICBUaGUgZXhjZXB0aW9uIHR5cGUgbXVzdCBjb250YWluIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfTUFQUElORz1DSEtKNDAxMFc6IER1cGxpY2F0ZSBVUkwgbWFwcGluZyB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQ9Q0hLSjQwMTFXOiBEdXBsaWNhdGUgU2VydmxldCBFbnRyeSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU0VTU0lPTl9USU1FT1VUPUNIS0o0MDEyVzogU2Vzc2lvbiBUaW1lb3V0IGlzIG5vdCB2YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlk9Q0hLSjQwMTNXOiBEdXBsaWNhdGUgRW50cnkgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZPUNIS0o0MDE0VzogRW1wdHkgRW50cnkgezB9LgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9GSUxURVI9Q0hLSjQwMTVXOiBEdXBsaWNhdGUgRmlsdGVyIEVudHJ5IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRj1DSEtKNDAxNlc6IER1cGxpY2F0ZSBlamItcmVmIGVsZW1lbnQgbmFtZWQgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIFRoaXMgd2FzIG1pc3NpbmcuICBJdCdzIGRlZmluZWQgaW4gY29uc3RhbnRzLi4uCi1FUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OPUNIS0o0MDE3VzogRVJST1IgRUFSIFVOQ09OVEFJTkVEIE1PRFVMRSBGSUxFIEVYQ0VQVElPTgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfQ09ERT1JV0FFMDAzNkUgQ0hLSjQwMThXOiBVbmtub3duIEVycm9yIENvZGU6IHswfS4gIGVycm9yLWNvZGUgbXVzdCBjb250YWluIGEgdmFsaWQgSFRUUCBzdGF0dXMgY29kZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1JFU19TSEFSSU5HX1NDT1BFPUNIS0o0MDE5VzogSW52YWxpZCByZXMtc2hhcmluZy1zY29wZTsgdmFsaWQgdmFsdWVzIGFyZSBcIlNoYXJlYWJsZVwiIG9yIFwiVW5zaGFyZWFibGVcIi4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FTlZfRU5UUlk9Q0hLSjQwMjBXOiBJbnZhbGlkIEVudmlyb25tZW50IEVudHJ5IFR5cGUuIFZhbGlkIHZhbHVlcyBhcmUgXCJqYXZhLmxhbmcuVFlQRVwiLCB3aGVyZSBUWVBFIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBCb29sZWFuLCBCeXRlLCBDaGFyYWN0ZXIsIFN0cmluZywgU2hvcnQsIEludGVnZXIsIExvbmcsIEZsb2F0LCBvciBEb3VibGUuIgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dMUF9QUk9KRUNUPUNIS0o0MDIxVzogTWlzc2luZyBXZWIgTGlicmFyeSBQcm9qZWN0ICh7MH0pLiAgQ2hlY2sgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBwcm9qZWN0IHRvIGZpeCB0aGlzIHByb2JsZW0uCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0NPTkZMSUNUSU5HX1dMUF9QUk9KRUNUPUNIS0o0MDIyVzogVGhlIFdlYiBMaWJyYXJ5IFByb2plY3QgSkFSICh7MH0pIGNvbmZsaWN0cyB3aXRoIGFuIGFjdHVhbCBKQVIgaW4gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4KLU1TR19TRVJWRVJfVEFSR0VUX01JU01BVENIPUNIS0o0MDIzVzogVGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIFdlYiBMaWJyYXJ5IFByb2plY3QgKHsxfSkgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiB0aGlzIFdlYiBQcm9qZWN0ICh7MH0pLiAgUnVuIHZhbGlkYXRpb24gb24gdGhlIFdlYiBQcm9qZWN0IGlmIHlvdSB0aGluayB0aGF0IGlzIG5vdCB0aGUgY2FzZS4KLU1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOPVRoZSBVUkwgcGF0dGVybiBzdHJpbmcgInswfSIgZW5kcyB3aXRoIGEgaW52YWxpZCBjYXJyYWlnZSByZXR1cm4gZm9yIHNlcnZsZXQgezF9Ci0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FSkJfUkVGX1RZUEU9Q0hLSjQwMjNXOiBlamItcmVmLXR5cGUgbXVzdCBiZSAnRW50aXR5JyBvciAnU2Vzc2lvbicuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFPUNIS0oyODI3VzogJydzZWN1cml0eS1yb2xlLXJlZicnIGVsZW1lbnQgezB9IGRlZmluZXMgdGhlICcncm9sZS1saW5rJycgZWxlbWVudCBidXQgbm8gJydzZWN1cml0eS1yb2xlJycgZWxlbWVudHMgaW4gdGhlIGFwcGxpY2F0aW9uIGRlc2NyaXB0b3IuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLW9mX1R5cGVfU2VjdXJpdHlfUm9sZV9OYW1lXzY9b2YgVHlwZSBTZWN1cml0eSBSb2xlIE5hbWUKLVdlYl9BcmNoaXZlX1ZhbGlkYXRvcl84PVdlYiBBcmNoaXZlIFZhbGlkYXRvcgotb2ZfVHlwZV9Sb2xlX05hbWVfMTk9b2YgVHlwZSBSb2xlIE5hbWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjU9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMjY9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzI9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMzM9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzk9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfNDA9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfZWpiLXJlZi1uYW1lXzQ0PW9mIFR5cGUgZWpiLXJlZi1uYW1lCi1vZl9UeXBlX0Vycm9yX0xvY2F0aW9uXzQ3PW9mIFR5cGUgRXJyb3IgTG9jYXRpb24KLW9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDk9b2YgVHlwZSBFcnJvciBMb2NhdGlvbgotb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl81ND1vZiBUeXBlIE1pbWUgRXh0ZW5zaW9uCi1vZl9UeXBlX01pbWVfVHlwZV81NT1vZiBUeXBlIE1pbWUgVHlwZQotb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl9fXzU2PW9mIFR5cGUgTWltZSBFeHRlbnNpb246Ci1vZl9UeXBlX1dlYl9SZXNvdXJjZV9Db2xsZWN0aW9uXzY0PW9mIFR5cGUgV2ViIFJlc291cmNlIENvbGxlY3Rpb24KLW9mX1R5cGVfRmlsdGVyX05hbWVfNjY9b2YgVHlwZSBGaWx0ZXIgTmFtZQotSW52YWxpZF9VUkxfNzA9SW52YWxpZCBVUkwKLUludmFsaWRfVVJMXzc1PUludmFsaWQgVVJMCi1vZl9UeXBlX1NlcnZsZXRfTmFtZV83Nz1vZiBUeXBlIFNlcnZsZXQgTmFtZQotb2ZfVHlwZV9UYWdsaWJfODA9b2YgVHlwZSBUYWdsaWIKLW9mX1R5cGVfVGFnTGliX19fODE9b2YgVHlwZSBUYWdMaWI6Ci1vZl9UeXBlX1dlYl9SZXNvdXJjZV9OYW1lXzg0PW9mIFR5cGUgV2ViIFJlc291cmNlIE5hbWUKLW9mX1R5cGVfV2VsY29tZV9GaWxlX05hbWVfXzg3PW9mIFR5cGUgV2VsY29tZSBGaWxlIE5hbWUKLW9mX1R5cGVfRW52X0VudHJ5X05hbWVfX184OD1vZiBUeXBlIEVudmlyb25tZW50IEVudHJ5IE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9FY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWYwN2IxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9FY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjksIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZUNvbXBhcmF0b3I7Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciBpbXBsZW1lbnRzIElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBTb3J0ZWRTZXQgZXh0ZW5zaW9uSGVscGVyczsKLSAgICAKLSAgICAvKgotICAgICAqIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05BTUUgPSAiZSI7IC8vJE5PTi1OTFMtMSQgc3RhdGljIGZpbmFsCi0gICAgICogU3RyaW5nIEVMRU1FTlRfSjJFRU1PRFVMRV9FWFRFTlNJT04gPSAiajJlZU1vZHVsZUV4dGVuc2lvbkhlbHBlciI7Ci0gICAgICogLy8kTk9OLU5MUy0xJCBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9FWFRFTlNJT05fQ0xBU1MgPQotICAgICAqICJleHRlbnNpb25DbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgKi8KLQotICAgIHByaXZhdGUgc3RhdGljIEVjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgSU5TVEFOQ0UgPSBudWxsOwotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXNjcmlwdG9yIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlIHsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTU9ERUxfRVhURU5ERVIgPSAiZWpiTW9kZWxFeHRlbmRlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9FSkJfRVhURU5TSU9OX0NMQVNTID0gImV4dGVuc2lvbkNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBsb2FkT3JkZXI7Ci0KLSAgICAgICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQotICAgICAgICBwcml2YXRlIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBpbnN0YW5jZTsKLQotICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICAgICAgQXNzZXJ0LmlzTGVnYWwoRUpCX01PREVMX0VYVEVOREVSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIElDb25maWd1cmF0aW9uRWxlbWVudCB1c2VkIHRvIGNyZWF0ZSBFY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLkRlc2NyaXB0b3IuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotICAgICAgICAgICAgdGhpcy5sb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZSNnZXRMb2FkT3JkZXIoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRMb2FkT3JkZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9hZE9yZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IChFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIpIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0VKQl9FWFRFTlNJT05fQ0xBU1MpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEVjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIoKSB7Ci0gICAgICAgIHN1cGVyKEoyRUVDb3JlUGx1Z2luLlBMVUdJTl9JRCwgRGVzY3JpcHRvci5FSkJfTU9ERUxfRVhURU5ERVIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYgKElOU1RBTkNFID09IG51bGwpIHsKLSAgICAgICAgICAgIElOU1RBTkNFID0gbmV3IEVjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIoKTsKLSAgICAgICAgICAgIElOU1RBTkNFLnJlYWRSZWdpc3RyeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgdy8gYW4gZXh0ZW5zaW9uIGxpa2U6IDxlYXJNb2R1bGVFeHRlbnNpb24KLSAgICAgKiBleHRlbnNpb25DbGFzcyA9ICJjb20uaWJtLmV0b29scy53ZWIucGx1Z2luLldlYk1vZHVsZUV4dGVuc2lvbkltcGwiLz4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhEZXNjcmlwdG9yLkVKQl9NT0RFTF9FWFRFTkRFUikpIHJldHVybiBmYWxzZTsKLQotICAgICAgICBhZGRNb2R1bGVFeHRlbnNpb24obmV3IERlc2NyaXB0b3IoZWxlbWVudCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRNb2R1bGVFeHRlbnNpb24oRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGdldEV4dGVuc2lvbkhlbHBlcnMoKS5hZGQoZGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb3JlLm1vZHVsZWV4dGVuc2lvbi5oZWxwZXIuSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciNnZXRFSkJNb2R1bGVFeHRlbnNpb24oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGdldEVKQk1vZHVsZUV4dGVuc2lvbihPYmplY3QgY29udGV4dCkgewotICAgICAgICAvL0lQcm9qZWN0IHByb2plY3QgPSBudWxsOyAvLyBUT0RPIE1ERSBHZXQgdGhlIHByb2plY3QgdXNpbmcgUHJvamVjdCBVdGlsaXRpZXMgKGFkZCBkZXBlbmQgdG8gZW1mLndvcmtiZW5jaCA/KQotICAgIAlpZiAoZ2V0RXh0ZW5zaW9uSGVscGVycygpLmlzRW1wdHkoKSkKLSAgICAJCXJldHVybiBudWxsOwotICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcikgZ2V0RXh0ZW5zaW9uSGVscGVycygpLmZpcnN0KCk7Ci0gICAgICAgIGlmKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZS5tb2R1bGVleHRlbnNpb24uaGVscGVyLklFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIjaGFzRUpCTW9kdWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRUpCTW9kdWxlRXh0ZW5zaW9uKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuc2lvbkhlbHBlcnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNvcnRlZFNldCBnZXRFeHRlbnNpb25IZWxwZXJzKCkgeyAKLSAgICAgICAgaWYgKGV4dGVuc2lvbkhlbHBlcnMgPT0gbnVsbCkgZXh0ZW5zaW9uSGVscGVycyA9IG5ldyBUcmVlU2V0KElkZW50aWZpYWJsZUNvbXBhcmF0b3IuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25IZWxwZXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9KMkVFQ29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0oyRUVDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTM2OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0oyRUVDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBKMkVFQ29yZVBsdWdpbiBpbnN0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBudWxsOwotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEoyRUVDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5zdD09bnVsbCkgaW5zdCA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuSU5TVEFOQ0Uuc2V0UHJvdmlkZXIoRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5nZXRJbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKMkVFQ29yZVBsdWdpbiBnZXRQbHVnaW4oKXsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldFBsdWdpbklEKCkpOwotCQkJc2V0UmVuZGVyZXIobG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYUxvZ2dlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlbmRlcmVyKExvZ2dlciBhTG9nZ2VyKSB7Ci0JCW5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihhTG9nZ2VyKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvYXBwbGljYXRpb24uZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvYXBwbGljYXRpb24uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWU3ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2FwcGxpY2F0aW9uLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iYXBwbGljYXRpb24iCi0gICAgbnNVUkk9ImFwcGxpY2F0aW9uLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcHBsaWNhdGlvbiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXBwbGljYXRpb25UeXBlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUmI3hEOyYjeEE7YXBwbGljYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40ICYjeEQ7JiN4QTtUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuNC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdXJpdHlSb2xlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiBzZWN1cml0eSByb2xlcyB3aGljaCBhcmUmI3hEOyYjeEE7Z2xvYmFsIHRvIHRoZSBhcHBsaWNhdGlvbi4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZHVsZXMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTW9kdWxlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Nb2R1bGUvYXBwbGljYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUmI3hEOyYjeEE7ICAgICAgICBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFIG1vZHVsZSBpbiB0aGUmI3hEOyYjeEE7ICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQmI3hEOyYjeEE7ICAgICAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZHVsZSI+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+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb24uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYjJhMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJjb21tb24iCi0gICAgbnNVUkk9ImNvbW1vbi54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24iPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVqYlJlZiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlJiN4RDsmI3hBO2RlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSYjeEQ7JiN4QTtkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uJiN4RDsmI3hBOyAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiYjeEQ7JiN4QTsgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlJiN4RDsmI3hBOyAgICAgIGJlYW4mI3hEOyYjeEE7ICAgIC0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuJiN4RDsmI3hBOyAgICAtIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZCYjeEQ7JiN4QTsgICAgICBlbnRlcnByaXNlIGJlYW4mI3hEOyYjeEE7ICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGlzIGlzIHRoZSBKTkRJIG5hbWUgdGhhdCB0aGUgc2VydmxldCBjb2RlIHVzZXMgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4uJiN4RDsmI3hBO0V4YW1wbGU6ICZsdDtlamItcmVmLW5hbWU+ZWpiL1BheXJvbGwmbHQ7L2VqYi1yZWYtbmFtZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL0VqYlJlZlR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLiBUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzomI3hEOyYjeEE7Jmx0O2VqYi1yZWYtdHlwZT5FbnRpdHkmbHQ7L2VqYi1yZWYtdHlwZT4mI3hEOyYjeEE7Jmx0O2VqYi1yZWYtdHlwZT5TZXNzaW9uJmx0Oy9lamItcmVmLXR5cGU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhvbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFu4oCZcyBob21lIGludGVyZmFjZS4mI3hEOyYjeEE7RXhhbXBsZTogJmx0O2hvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWUmbHQ7L2hvbWU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbW90ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbuKAmXMgcmVtb3RlIGludGVyZmFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBlbmNvbXBhc3NpbmcgSjJFRSBBcHBsaWNhdGlvbiBwYWNrYWdlLiBUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIEoyRUUgQXBwbGljYXRpb24gcGFja2FnZS4gJiN4RDsmI3hBO0V4YW1wbGU6ICZsdDtlamItbGluaz5FbXBsb3llZVJlY29yZCZsdDsvZWpiLWxpbms+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVudkVudHJ5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncyYjeEQ7JiN4QTtlbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsJiN4RDsmI3hBO2Rlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiYjeEQ7JiN4QTtvcHRpb25hbCB2YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUmI3hEOyYjeEE7c3VwcGxpZWQgZHVyaW5nIGRlcGxveW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtJdCBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEmI3hEOyYjeEE7ICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUmI3hEOyYjeEE7ICAgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiYjeEQ7JiN4QTsgICAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSYjeEQ7JiN4QTsgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcyYjeEQ7JiN4QTsgICAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGRlY2xhcmVkJiN4RDsmI3hBOyAgICAgICAgY29udGV4dC4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmx0O2Vudi1lbnRyeS1uYW1lPm1pbkFtb3VudCZsdDsvZW52LWVudHJ5LW5hbWU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVudi1lbnRyeS12YWx1ZSBkZXNpZ25hdGVzIHRoZSB2YWx1ZSBvZiBhJiN4RDsmI3hBOyAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlJiN4RDsmI3hBOyAgICAgICAgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUmI3hEOyYjeEE7ICAgICAgICBjb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhJiN4RDsmI3hBOyAgICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLCYjeEQ7JiN4QTsgICAgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgJmx0O2Vudi1lbnRyeS12YWx1ZT4xMDAuMDAmbHQ7L2Vudi1lbnRyeS12YWx1ZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL0VudkVudHJ5VHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnTigJlzIGNvZGUuIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6IGphdmEubGFuZy5Cb29sLWVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsIGphdmEubGFuZy5Mb25nLCBhbmQgamF2YS5sYW5nLkZsb2F0LiAmI3hEOyYjeEE7RXhhbXBsZTogJmx0O2Vudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuJmx0Oy9lbnYtZW50cnktdHlwZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VSZWYiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSYjeEQ7JiN4QTtEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQmI3hEOyYjeEE7Y29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyJiN4RDsmI3hBO2Nvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlJiN4RDsmI3hBO3Jlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlJiN4RDsmI3hBO0RlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uJiN4RDsmI3hBOyhBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiYjeEQ7JiN4QTt0aGUgc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlJiN4RDsmI3hBOyhTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyZsdDtyZXNvdXJjZS1yZWY+JiN4RDsmI3hBOyAgICAmbHQ7cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQiZsdDsvcmVzLXJlZi1uYW1lPiYjeEQ7JiN4QTsgICAgJmx0O3Jlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlJmx0Oy9yZXMtdHlwZT4mI3hEOyYjeEE7ICAgICZsdDtyZXMtYXV0aD5Db250YWluZXImbHQ7L3Jlcy1hdXRoPiYjeEQ7JiN4QTsgICAgJmx0O3Jlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZSZsdDsvcmVzLXNoYXJpbmctc2NvcGU+JiN4RDsmI3hBOyZsdDsvcmVzb3VyY2UtcmVmPiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhJiN4RDsmI3hBOyAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiYjeEQ7JiN4QTsgICAgICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSYjeEQ7JiN4QTsgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4mI3hEOyYjeEE7ICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IEZpbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEmI3hEOyYjeEE7ICAgICAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkJiN4RDsmI3hBOyAgICAgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UmI3hEOyYjeEE7ICAgICAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGgiIGVUeXBlPSIjLy9SZXNBdXRoVHlwZUJhc2UiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzLWF1dGggZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGJlYW4uIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlIERlcGxveWVyLiAgVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzomI3hEOyYjeEE7Jmx0O3Jlcy1hdXRoPkFwcGxpY2F0aW9uJmx0Oy9yZXMtYXV0aD4mI3hEOyYjeEE7Jmx0O3Jlcy1hdXRoPkNvbnRhaW5lciZsdDsvcmVzLWF1dGg+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzU2hhcmluZ1Njb3BlIiBlVHlwZT0iIy8vUmVzU2hhcmluZ1Njb3BlVHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkJiN4RDsmI3hBO3Rocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUmI3hEOyYjeEE7c2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZSYjeEQ7JiN4QTt0d28gZm9sbG93aW5nOiAgU2hhcmVhYmxlLCBVbnNoYXJlYWJsZSYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkVudkVudHJ5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuMyBhZGRlZCBDaGFyYWN0ZXImI3hEOyYjeEE7U3RyaW5nPTAmI3hEOyYjeEE7SW50ZWdlcj0xJiN4RDsmI3hBO0Jvb2xlYW49MiYjeEQ7JiN4QTtEb3VibGU9MyYjeEQ7JiN4QTtCeXRlPTQmI3hEOyYjeEE7U2hvcnQ9NSYjeEQ7JiN4QTtMb25nPTYmI3hEOyYjeEE7RmxvYXQ9NyYjeEQ7JiN4QTtDaGFyYWN0ZXI9OCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU3RyaW5nIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJbnRlZ2VyIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQm9vbGVhbiIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRvdWJsZSIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJ5dGUiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTaG9ydCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxvbmciIHZhbHVlPSI2Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJGbG9hdCIgdmFsdWU9IjciLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNoYXJhY3RlciIgdmFsdWU9IjgiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdXJpdHlSb2xlUmVmIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhJiN4RDsmI3hBO3NlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3Mgb3IgYSYjeEQ7JiN4QTtEZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiYjeEQ7JiN4QTtvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZSYjeEQ7JiN4QTtjb2RlLCBhbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZSYjeEQ7JiN4QTtzZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbiYjeEQ7JiN4QTthcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZCYjeEQ7JiN4QTsgICAgICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlJiN4RDsmI3hBOyAgICAgICAgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZCBvciB0aGUmI3hEOyYjeEE7ICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkJiN4RDsmI3hBOyAgICAgICAgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiYjeEQ7JiN4QTsgICAgICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUmI3hEOyYjeEE7ICAgICAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlJlc0F1dGhUeXBlQmFzZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ09OVEFJTkVSPTAmI3hEOyYjeEE7Q29udGFpbmVyPTEmI3hEOyYjeEE7QXBwbGljYXRpb249MiYjeEQ7JiN4QTtTRVJWTEVUPTMmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDb250YWluZXIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFwcGxpY2F0aW9uIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VSVkxFVCIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJFamJSZWZUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXNzaW9uPTAmI3hEOyYjeEE7RW50aXR5PTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNlc3Npb24iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkVudGl0eSIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdXJpdHlSb2xlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eSYjeEQ7JiN4QTtyb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUmI3hEOyYjeEE7c2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICZsdDtzZWN1cml0eS1yb2xlPiYjeEQ7JiN4QTsgICAgJmx0O2Rlc2NyaXB0aW9uPiYjeEQ7JiN4QTsgICAgICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZCYjeEQ7JiN4QTsgICAgICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4mI3hEOyYjeEE7ICAgICZsdDsvZGVzY3JpcHRpb24+JiN4RDsmI3hBOyAgICAmbHQ7cm9sZS1uYW1lPmVtcGxveWVlJmx0Oy9yb2xlLW5hbWU+JiN4RDsmI3hBOyAgICAmbHQ7L3NlY3VyaXR5LXJvbGU+Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQgU2VlIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHJvbGUuIFRoaXMgZWxlbWVudCBtdXN0IGNvbnRhaW4gYSBub24tZW1wdHkgc3RyaW5nLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZUVudlJlZiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lJiN4RDsmI3hBO3Jlc291cmNlLWVudi10eXBlIGVsZW1lbnRzLiAgSXQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhJiN4RDsmI3hBO0RlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QmI3hEOyYjeEE7YXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MmI3hEOyYjeEE7ZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlJiN4RDsmI3hBO3Jlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiYjeEQ7JiN4QTt0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlJiN4RDsmI3hBO0RlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Jmx0O3Jlc291cmNlLWVudi1yZWY+JiN4RDsmI3hBOyAgICAmbHQ7cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlJiN4RDsmI3hBOyAgICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtbmFtZT4mI3hEOyYjeEE7ICAgICZsdDtyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlJiN4RDsmI3hBOyAgICAmbHQ7L3Jlc291cmNlLWVudi1yZWYtdHlwZT4mI3hEOyYjeEE7Jmx0Oy9yZXNvdXJjZS1lbnYtcmVmPiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcmVzb3VyY2UgZW52IHJlZi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lJiN4RDsmI3hBOyAgICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyYjeEQ7JiN4QTsgICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4mI3hEOyYjeEE7ICAgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSYjeEQ7JiN4QTsgICAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCYjeEQ7JiN4QTsgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUmI3hEOyYjeEE7ICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZSYjeEQ7JiN4QTsgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciYjeEQ7JiN4QTsgICAgICAgIGludGVyZmFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlJlc1NoYXJpbmdTY29wZVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNoYXJlYWJsZT0wJiN4RDsmI3hBO1Vuc2hhcmVhYmxlPTEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNoYXJlYWJsZSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVW5zaGFyZWFibGUiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVKQkxvY2FsUmVmIiBlU3VwZXJUeXBlcz0iIy8vRWpiUmVmIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS4zJiN4RDsmI3hBO1RoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yJiN4RDsmI3hBO3RoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCYjeEQ7JiN4QTtob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQmI3hEOyYjeEE7ICAgICAgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuJiN4RDsmI3hBOyAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbiYjeEQ7JiN4QTsgICAgLSB0aGUgZXhwZWN0ZWQgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvZiB0aGUmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4mI3hEOyYjeEE7ICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYWxIb21lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2FsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkiIGVTdXBlclR5cGVzPSIjLy9TZWN1cml0eUlkZW50aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgICAgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlkZW50aXR5IiBlVHlwZT0iIy8vSWRlbnRpdHkiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3B0aW9uYWwgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJZGVudGl0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHJ1biBhcyBpZGVudGl0eS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJY29uVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgaWNvbiB0eXBlIGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMmI3hEOyYjeEE7dGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yJiN4RDsmI3hBO0pQRUcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEmI3hEOyYjeEE7R1VJIHRvb2wuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgeG1sOmxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlJiN4RDsmI3hBO2ljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAmcXVvdDtlbiZxdW90OyAoRW5nbGlzaCkmI3hEOyYjeEE7YnkgZGVmYXVsdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic21hbGxJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUmI3hEOyYjeEE7ICAgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlJiN4RDsmI3hBOyAgICAgICAgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50JiN4RDsmI3hBOyAgICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LiYjeEQ7JiN4QTsgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAmbHQ7c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGcmbHQ7L3NtYWxsLWljb24+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhcmdlSWNvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlJiN4RDsmI3hBOyAgICAgICAgY29udGFpbmluZyBhIGxhcmdlJiN4RDsmI3hBOyAgICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSYjeEQ7JiN4QTsgICAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQmI3hEOyYjeEE7ICAgICAgICBGaWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LiYjeEQ7JiN4QTsgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAmbHQ7bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGcmbHQ7L2xhcmdlLWljb24+JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc3BsYXlOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCYjeEQ7JiN4QTt0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQgYnkgZGlzcGxheS1uYW1lJiN4RDsmI3hBO2VsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Li4uJiN4RDsmI3hBOyAgICZsdDtkaXNwbGF5LW5hbWUgeG1sOmxhbmc9JnF1b3Q7ZW4mcXVvdDs+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlJmx0Oy9kaXNwbGF5LW5hbWU+JiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAmcXVvdDtlbiZxdW90OyAoRW5nbGlzaCkgYnkgZGVmYXVsdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFuZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXNzYWdlRGVzdGluYXRpb25SZWYiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiYjeEQ7JiN4QTtvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24mI3hEOyYjeEE7YXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncyYjeEQ7JiN4QTtlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24mI3hEOyYjeEE7ICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lJiN4RDsmI3hBOyAgICAgICAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlJiN4RDsmI3hBOyAgICAgICAgLSBhIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlciB0aGUmI3hEOyYjeEE7ICAgICAgICAgIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yJiN4RDsmI3hBOyAgICAgICAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoJiN4RDsmI3hBOyAgICAgICAgLSBhIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGVzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7Jmx0O21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPiYjeEQ7JiN4QTsgICAgICAgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlJiN4RDsmI3hBOyAgICAgICAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPiYjeEQ7JiN4QTsgICAgICAgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlJiN4RDsmI3hBOyAgICAgICAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+JiN4RDsmI3hBOyAgICAgICAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+JiN4RDsmI3hBOyAgICAgICAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4mI3hEOyYjeEE7Jmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlIiBlVHlwZT0iIy8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXNzYWdlRGVzdGluYXRpb24iIGVTdXBlclR5cGVzPSIjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZSYjeEQ7JiN4QTtkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMmI3hEOyYjeEE7ZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uJiN4RDsmI3hBOyAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUmI3hEOyYjeEE7ICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24mI3hEOyYjeEE7ICAgICAgICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlJiN4RDsmI3hBOyAgICAgICAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZSYjeEQ7JiN4QTsgICAgICAgICAgRGVwbG95bWVudCBGaWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyZsdDttZXNzYWdlLWRlc3RpbmF0aW9uPiYjeEQ7JiN4QTsgICAgICAgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzJiN4RDsmI3hBOyAgICAgICAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+JiN4RDsmI3hBOyZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbj4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSYjeEQ7JiN4QTsgICAgICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlJiN4RDsmI3hBOyAgICAgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucyYjeEQ7JiN4QTsgICAgICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYXJhbVZhbHVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUmI3hEOyYjeEE7cGFyYW1ldGVyL3ZhbHVlIGxpc3RzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBkZXNjcmlwdGlvbiByZWxhdGVkJiN4RDsmI3hBO2VsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaWNvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSWNvblR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc3BsYXlOYW1lcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaXNwbGF5TmFtZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKTkRJRW52UmVmc0dyb3VwIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudCYjeEQ7JiN4QTtyZWZlcmVuY2UgZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnZpcm9ubWVudFByb3BlcnRpZXMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRW52RW50cnkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZVJlZiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWpiUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FamJSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlRW52UmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZUVudlJlZiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGxpc3Qgb2YgZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZXMgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJMb2NhbFJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRUpCTG9jYWxSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN1cml0eUlkZW50aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQmI3hEOyYjeEE7Y29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVc2VDYWxsZXJJZGVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL1NlY3VyaXR5SWRlbnRpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8mI3hEOyYjeEE7cHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzJiN4RDsmI3hBO3RoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUmI3hEOyYjeEE7RGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cyYjeEQ7JiN4QTt0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyYjeEQ7JiN4QTtEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlJiN4RDsmI3hBO3Rvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkmI3hEOyYjeEE7dGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCYjeEQ7JiN4QTtjb250YWlucyB0aGUgZGVzY3JpcHRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUmI3hEOyYjeEE7ZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICZxdW90O2VuJnF1b3Q7IChFbmdsaXNoKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFuZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDb25zdW1lcyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUHJvZHVjZXMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDb25zdW1lc1Byb2R1Y2VzIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJRTmFtZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhbFBhcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tYmluZWRRTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnRlcm5hbFByZWZpeE9yTnNVUkkiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGlzdGVuZXIiIGVTdXBlclR5cGVzPSIjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBtb3ZlZCBmcm9tIHdlYmFwcCYjeEQ7JiN4QTsmI3hEOyYjeEE7RGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxpc3RlbmVyQ2xhc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic21hbGxJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhcmdlSWNvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNwbGF5TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY29tbW9uQXJjaGl2ZS5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb25BcmNoaXZlLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWU1NTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb25BcmNoaXZlLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIgbW9kZWxOYW1lPSJDb21tb25BcmNoaXZlIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUucHJvdmlkZXIuQ29tbW9uQXJjaGl2ZUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUucHJlc2VudGF0aW9uLkNvbW1vbkFyY2hpdmVFZGl0b3JQbHVnaW4iCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLnJvc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgajJlZS5nZW5tb2RlbCMvL3dzY2xpZW50IGoyZWUuZ2VubW9kZWwjLy9jb21tb24gajJlZS5nZW5tb2RlbCMvL3dlYmFwcGxpY2F0aW9uIGoyZWUuZ2VubW9kZWwjLy9lamIgajJlZS5nZW5tb2RlbCMvL2pzcCBqMmVlLmdlbm1vZGVsIy8vYXBwbGljYXRpb24gajJlZS5nZW5tb2RlbCMvL2NsaWVudCBqMmVlLmdlbm1vZGVsIy8vamNhIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwjLy9qYXZhIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXGNvbW1vbkFyY2hpdmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V09SS1NQQUNFX1JPT1Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJDb21tb25hcmNoaXZlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGludGVyZmFjZVBhY2thZ2VTdWZmaXg9ImludGVybmFsIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRmlsZS9VUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0ZpbGUvbGFzdE1vZGlmaWVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9GaWxlL3NpemUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0ZpbGUvZGlyZWN0b3J5RW50cnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0ZpbGUvb3JpZ2luYWxVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0ZpbGUvbG9hZGluZ0NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0ZpbGUvY29udGFpbmVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vQXJjaGl2ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9BcmNoaXZlL3R5cGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRUpCSmFyRmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9FSkJKYXJGaWxlL2RlcGxveW1lbnREZXNjcmlwdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vV0FSRmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9XQVJGaWxlL2RlcGxveW1lbnREZXNjcmlwdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRUFSRmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRUFSRmlsZS9tb2R1bGVSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9FQVJGaWxlL2RlcGxveW1lbnREZXNjcmlwdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnRGaWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50RmlsZS9kZXBsb3ltZW50RGVzY3JpcHRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL01vZHVsZUZpbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0NvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vQ29udGFpbmVyL2ZpbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vUmVhZE9ubHlEaXJlY3RvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL1JBUkZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vUkFSRmlsZS9kZXBsb3ltZW50RGVzY3JpcHRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL01vZHVsZVJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9Nb2R1bGVSZWYvbW9kdWxlRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL01vZHVsZVJlZi9lYXJGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9Nb2R1bGVSZWYvbW9kdWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vRUpCTW9kdWxlUmVmIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9XZWJNb2R1bGVSZWYiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL0NsaWVudE1vZHVsZVJlZiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vQ29ubmVjdG9yTW9kdWxlUmVmIi8+Ci0gICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iTG9vc2Vjb25maWciIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZSIKLSAgICAgICAgaW50ZXJmYWNlUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwiIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiCi0gICAgICAgIGVjb3JlUGFja2FnZT0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZyI+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQXBwbGljYXRpb24iPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VBcHBsaWNhdGlvbi9sb29zZUFyY2hpdmVzIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZS91cmkiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlL2JpbmFyaWVzUGF0aCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUvcmVzb3VyY2VzUGF0aCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VBcmNoaXZlL2xvb3NlQXBwIi8+Ci0gICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZS9pc01vZHVsZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUjLy9sb29zZWNvbmZpZy9Mb29zZUxpYnJhcnkiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VMaWJyYXJ5L2xvb3NlV0FSIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlTW9kdWxlIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VNb2R1bGUvYWx0REQiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VDb25maWd1cmF0aW9uIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlQ29uZmlndXJhdGlvbi9hcHBsaWNhdGlvbnMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbmFyY2hpdmVjb3JlLmVjb3JlIy8vbG9vc2Vjb25maWcvTG9vc2VXQVJGaWxlIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb25hcmNoaXZlY29yZS5lY29yZSMvL2xvb3NlY29uZmlnL0xvb3NlV0FSRmlsZS9sb29zZUxpYnMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8L25lc3RlZEdlblBhY2thZ2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb25hcmNoaXZlY29yZS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9jb21tb25hcmNoaXZlY29yZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkYjhlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvY29tbW9uYXJjaGl2ZWNvcmUuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJjb21tb25hcmNoaXZlY29yZSIKLSAgICBuc1VSST0iY29tbW9uYXJjaGl2ZS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZSI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmlsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IlVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXN0TW9kaWZpZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpemUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpcmVjdG9yeUVudHJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmlnaW5hbFVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb2FkaW5nQ29udGFpbmVyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0NvbnRhaW5lciIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0NvbnRhaW5lci9maWxlcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcmNoaXZlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVKQkphckZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgZWpiLmVjb3JlIy8vRUpCSmFyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldBUkZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUFSRmlsZSIgZVN1cGVyVHlwZXM9IiMvL01vZHVsZUZpbGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVSZWZzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01vZHVsZVJlZiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTW9kdWxlUmVmL2VhckZpbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcHBsaWNhdGlvbkNsaWVudEZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTW9kdWxlRmlsZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BcmNoaXZlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0ZpbGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GaWxlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9GaWxlL2NvbnRhaW5lciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWFkT25seURpcmVjdG9yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRhaW5lciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJBUkZpbGUiIGVTdXBlclR5cGVzPSIjLy9Nb2R1bGVGaWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVwbG95bWVudERlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgamNhLmVjb3JlIy8vQ29ubmVjdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZHVsZVJlZiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVGaWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTW9kdWxlRmlsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlYXJGaWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRUFSRmlsZSIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0VBUkZpbGUvbW9kdWxlUmVmcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUpCTW9kdWxlUmVmIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlUmVmIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2ViTW9kdWxlUmVmIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlUmVmIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2xpZW50TW9kdWxlUmVmIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlUmVmIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29ubmVjdG9yTW9kdWxlUmVmIiBlU3VwZXJUeXBlcz0iIy8vTW9kdWxlUmVmIi8+Ci0gIDxlU3VicGFja2FnZXMgbmFtZT0ibG9vc2Vjb25maWciIG5zVVJJPSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnIj4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikxvb3NlQXBwbGljYXRpb24iIGVTdXBlclR5cGVzPSIjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxvb3NlQXJjaGl2ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZS9sb29zZUFwcCIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9vc2VBcmNoaXZlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNNb2R1bGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmluYXJpZXNQYXRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VzUGF0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxvb3NlQXBwIiBlVHlwZT0iIy8vbG9vc2Vjb25maWcvTG9vc2VBcHBsaWNhdGlvbiIKLSAgICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vbG9vc2Vjb25maWcvTG9vc2VBcHBsaWNhdGlvbi9sb29zZUFyY2hpdmVzIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMb29zZUxpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9sb29zZWNvbmZpZy9Mb29zZUFyY2hpdmUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxvb3NlV0FSIiBlVHlwZT0iIy8vbG9vc2Vjb25maWcvTG9vc2VXQVJGaWxlIgotICAgICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9sb29zZWNvbmZpZy9Mb29zZVdBUkZpbGUvbG9vc2VMaWJzIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMb29zZU1vZHVsZSIgZVN1cGVyVHlwZXM9IiMvL2xvb3NlY29uZmlnL0xvb3NlQXJjaGl2ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0REQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikxvb3NlQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXBwbGljYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vbG9vc2Vjb25maWcvTG9vc2VBcHBsaWNhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikxvb3NlV0FSRmlsZSIgZVN1cGVyVHlwZXM9IiMvL2xvb3NlY29uZmlnL0xvb3NlTW9kdWxlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb29zZUxpYnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9sb29zZWNvbmZpZy9Mb29zZUxpYnJhcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL2xvb3NlY29uZmlnL0xvb3NlTGlicmFyeS9sb29zZVdBUiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvZWpiLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2VqYi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyMWUwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvZWpiLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImVqYiIKLSAgICBuc1VSST0iZWpiLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGFpbmVyTWFuYWdlZEVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL0VudGl0eSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIueCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QGludmFyaWFudCBUaGUgY21wLXZlcnNpb24gZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogMS54ICwgMi54JiN4RDsmI3hBO0BkZWZhdWx0IDIueCYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWJzdHJhY3RTY2hlbWFOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4mI3hEOyYjeEE7JiN4RDsmI3hBO0ZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcyBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW50QXR0cmlidXRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9DTVBBdHRyaWJ1dGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImtleUF0dHJpYnV0ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ01QQXR0cmlidXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1F1ZXJ5L2VudGl0eSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgbW92ZWQgZnJvbSBDTUUmI3hEOyYjeEE7VGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uJiN4RDsmI3hBOyYjeEQ7JiN4QTtAaW52YXJpYW50IHNlZSBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iQ01QQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NNUEF0dHJpYnV0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltS2V5RmllbGQiIGVUeXBlPSIjLy9DTVBBdHRyaWJ1dGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGVybWlzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMsIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLiAgVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kL29yIGhvbWUgaW50ZXJmYWNlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5jaGVja2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NlbWJseURlc2NyaXB0b3IiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Bc3NlbWJseURlc2NyaXB0b3IiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Bc3NlbWJseURlc2NyaXB0b3IvbWV0aG9kUGVybWlzc2lvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50cyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXNzZW1ibHlEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXNzZW1ibHktZGVzY3JpcHRvciBlbGVtZW50IGNvbnRhaW5zIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFydHM6IHRoZSBkZWZpbml0aW9uIG9mIHNlY3VyaXR5IHJvbGVzLCB0aGUgZGVmaW5pdGlvbiBvZiBtZXRob2QgcGVybWlzc2lvbnMsIGFuZCB0aGUgZGVmaW5pdGlvbiBvZiB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciBlbnRlcnByaXNlIGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24uIEFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LiBQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQZXJtaXNzaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQZXJtaXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXRob2RQZXJtaXNzaW9uL2Fzc2VtYmx5RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RUcmFuc2FjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kVHJhbnNhY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01ldGhvZFRyYW5zYWN0aW9uL2Fzc2VtYmx5RGVzY3JpcHRvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBUaGUgZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJKYXIiIGVUeXBlPSIjLy9FSkJKYXIiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJKYXIvYXNzZW1ibHlEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3VyaXR5Um9sZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhjbHVkZUxpc3QiIGVUeXBlPSIjLy9FeGNsdWRlTGlzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWVzc2FnZURlc3RpbmF0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kVHJhbnNhY3Rpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvbkF0dHJpYnV0ZSIgZVR5cGU9IiMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+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+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTdGF0ZWZ1bCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU3RhdGVsZXNzIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJNZXRob2RDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbGlkIEVKQiBtZXRob2QgY2F0ZWdvcnkgbmFtZXMgYXJlOiBFSkJIT01FTUVUSE9ELCBFSkJDUkVBVEVNRVRIT0QsIEVKQkZJTkRFUk1FVEhPRCwgRUpCUkVNT1RFTUVUSE9ELiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJKYXIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZTsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlJiN4RDsmI3hBO25hbWU7IG1hbmRhdG9yeSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZCBlbnRlcnByaXNlIGJlYW5zOyBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsIGlmIGFueTsgYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcjsgYW5kIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlIGVqYi1qYXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVqYkNsaWVudEphciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4gVGhlIERlcGxveWVyIHNob3VsZCBtYWtlIHRoZSBlamItY2xpZW50IEpBUiBmaWxlIGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4gIEV4YW1wbGU6Jmx0O2VqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphciZsdDsvZWpiLWNsaWVudC1qYXI+JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlJiN4RDsmI3hBOyAgICBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBpbnN0YW5jZSBkb2N1bWVudCBtdXN0JiN4RDsmI3hBOyAgICBjb21wbHkgd2l0aC4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveW1lbnQgdG9vbHMmI3hEOyYjeEE7ICAgIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciBFSkIgRGVwbG95bWVudCYjeEQ7JiN4QTsgICAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkImI3hEOyYjeEE7ICAgIHNjaGVtYS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZW1ibHlEZXNjcmlwdG9yIiBlVHlwZT0iIy8vQXNzZW1ibHlEZXNjcmlwdG9yIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Bc3NlbWJseURlc2NyaXB0b3IvZWpiSmFyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGVycHJpc2VCZWFucyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FbnRlcnByaXNlQmVhbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRW50ZXJwcmlzZUJlYW4vZWpiSmFyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlbGF0aW9uc2hpcExpc3QiIGVUeXBlPSIjLy9SZWxhdGlvbnNoaXBzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWxhdGlvbnNoaXBzL2VqYkphciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZWxhdGlvbnNoaXBzIGNvbGxlY3Rpb24gZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlIGVudGl0eSBiZWFucyBhbmQgZGVwZW5kZW50IG9iamVjdHMgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGEgbGlzdCBvZiBlamItZW50aXR5LXJlZiBlbGVtZW50cyAocmVmZXJlbmNlcyB0byBlbnRpdHkgYmVhbnMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzIGJ1dCB3aG9zZSBhYnN0cmFjdCBwZXJzaXN0ZW5jZSBzY2hlbWFzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGVqYi1qYXIgZmlsZSk7JiN4RDsmI3hBO2FuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MmI3hEOyYjeEE7aG9tZSBvciByZW1vdGUgaW50ZXJmYWNlLCBvciBhIHNldCBvZiBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudCYjeEQ7JiN4QTttdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiBkZWNsYXJlZCBpbiB0aGUmI3hEOyYjeEE7ZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8mI3hEOyYjeEE7ZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIGRlZmluZWQgaW4mI3hEOyYjeEE7Ym90aCB0aGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZTsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzJiN4RDsmI3hBO3RoZSBtZXRob2QgbmFtZTsgYW5kIHRoZSBvcHRpb25hbCBtZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IGEmI3hEOyYjeEE7c2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBtZXRob2QgbmFtZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHN5bnRheDomI3hEOyYjeEE7JiN4RDsmI3hBOzEuICYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FSkJOQU1FJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7ICAgJiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT4qJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmbHQ7L21ldGhvZD4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNwZWNpZmllZCYjeEQ7JiN4QTsgICBlbnRlcnByaXNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcy4mI3hEOyYjeEE7JiN4RDsmI3hBOzIuICYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FSkJOQU1FJmx0Oy9lamItbmFtZT4mI3hEOyYjeEE7ICAgJiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT5NRVRIT0QmbHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyZsdDsvbWV0aG9kPj4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUmI3hEOyYjeEE7ICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aCYjeEQ7JiN4QTsgICB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzIHRvJiN4RDsmI3hBOyAgIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7My4gJiN4OTsmbHQ7bWV0aG9kPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVKQk5BTUUmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsgICAmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPk1FVEhPRCZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7ICAgJiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5QQVJBTS0xJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyAgICYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+UEFSQU0tMiZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsgICAgICAgICAgJiN4OTsmI3g5OyYjeDk7Li4uJiN4RDsmI3hBOyAgICYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+UEFSQU0tbiZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyZsdDttZXRob2Q+JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mJiN4RDsmI3hBOyAgIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1uIGFyZSB0aGUmI3hEOyYjeEE7ICAgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmJiN4RDsmI3hBOyAgIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCYjeEQ7JiN4QTsgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUmI3hEOyYjeEE7ICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlJiN4RDsmI3hBOyAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uIGFuZCBjb250YWluZXItdHJhbnNhY3Rpb24mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGVzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXM6JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT4qJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDsvbWV0aG9kPiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTtTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIGNyZWF0ZSYjeEQ7JiN4QTsmI3g5OyYjeDk7bWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAmI3g5OyYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtbmFtZT5jcmVhdGUmbHQ7L21ldGhvZC1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7Jmx0Oy9tZXRob2Q+JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5O1N0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZSYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZSYjeEQ7JiN4QTsmI3g5OyAmI3g5O0VtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgJiN4OTsmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDsvbWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDsvbWV0aG9kPiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTtUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aCYjeEQ7JiN4QTsmI3g5O21vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Zm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikmI3hEOyYjeEE7ICAgICAgICB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgJiN4OTsmI3g5OyZsdDttZXRob2Q+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDtlamItbmFtZT5FbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+Zm9vYmFyJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5jaGFyJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5pbnQmbHQ7L21ldGhvZC1wYXJhbT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLXBhcmFtPmludFtdJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzcyZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDsvbWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDsvbWV0aG9kPiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTtUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMmI3hEOyYjeEE7ICAgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lJiN4RDsmI3hBOyAgIGludGVyZmFjZSBhbmQgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBpcyYjeEQ7JiN4QTsgICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTtGb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCBlbGVtZW50JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAmI3g5OyYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtaW50Zj5SZW1vdGUmbHQ7L21ldGhvZC1pbnRmPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7bWV0aG9kLW5hbWU+Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDsvbWV0aG9kLXBhcmFtcz4mI3hEOyYjeEE7JiN4OTsmI3g5OyZsdDsvbWV0aG9kPiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTtjYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCYjeEQ7JiN4QTsgICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykmI3hEOyYjeEE7ICAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIGhvbWUgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAmI3g5OyYjeDk7Jmx0O21ldGhvZD4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O2VqYi1uYW1lPkVtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtaW50Zj5Ib21lJmx0Oy9tZXRob2QtaW50Zj4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Jmx0O21ldGhvZC1uYW1lPmNyZWF0ZSZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW1zPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyZsdDttZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZyZsdDsvbWV0aG9kLXBhcmFtPiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmbHQ7L21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyYjeDk7JiN4OTsmbHQ7L21ldGhvZD4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZCwmI3hEOyYjeEE7b3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcyB1c2VkIHdoZW4gdGhlIGVsZW1lbnQmI3hEOyYjeEE7ZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGFuZCBob21lJiN4RDsmI3hBO2ludGVyZmFjZXMuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJtcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgYSBsaXN0IG9mIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycy4gIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoaXMgaXMgYSBzcGFjZSBkZWxpbWl0dGVkIFN0cmluZy4gIEEgbnVsbCBzdHJpbmcgaW5kaWNhdGVzIGEgZ2VuZXJpYyBtZXRob2QgZWxlbWVudCB0aGF0IGNhbiBhcHBseSB0byBtdWx0aXBsZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZS4gIEFuIGVtcHR5IHN0cmluZyBpbmRpY2F0ZXMgYSBtZXRob2Qgd2l0aCB6ZXJvIHBhcmFtZXRlcnMuICBJbiBmdXR1cmUgaW1wbGVtZW50YXRpb25zIChwb3N0IFY1KSwgdGhpcyBmaWVsZCB3aWxsIGJlIGRlcHJlY2F0ZWQgYW5kIG1pZ3JhdGVkIHRvIHVzZSB0aGUgbXVsdGktdmFsdWVkIHBhcmFtcyBmaWVsZCBhbmQgdGhlIGlzWmVyb1BhcmFtcyBmbGFnLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnRLaW5kIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGVycHJpc2VCZWFuIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRW50ZXJwcmlzZUJlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJNZXRob2RFbGVtZW50S2luZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBhZGRlZCBTZXJ2aWNlRW5kcG9pbnQmI3hEOyYjeEE7VW5zcGVjaWZpZWQ9MCYjeEQ7JiN4QTtSZW1vdGU9MSYjeEQ7JiN4QTtIb21lPTImI3hEOyYjeEE7TG9jYWw9MyYjeEQ7JiN4QTtMb2NhbEhvbWU9NCYjeEQ7JiN4QTtTZXJ2aWNlRW5kcG9pbnQ9NSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVW5zcGVjaWZpZWQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJlbW90ZSIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkhvbWUiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMb2NhbCIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxvY2FsSG9tZSIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNlcnZpY2VFbmRwb2ludCIgdmFsdWU9IjUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ01QQXR0cmlidXRlIiBlU3VwZXJUeXBlcz0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VBdHRyaWJ1dGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUgZmllbGQgZWxlbWVudCBpbmNsdWRlcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgY21yIGZpZWxkLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlbGF0aW9uc2hpcHMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZWxhdGlvbnNoaXBzIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbiB3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBjb2xsZWN0aW9uIG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJKYXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FSkJKYXIiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJKYXIvcmVsYXRpb25zaGlwTGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlamJSZWxhdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRUpCUmVsYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0VKQlJlbGF0aW9uL3JlbGF0aW9uc2hpcExpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUXVlcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBxdWVyeSBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeTsgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QgbWV0aG9kIGl0IGlzIHVzZWQgYnk7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmV0dXJuIHR5cGUgbWFwcGluZywgaWYgYW55LCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZDsgYW5kIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuIFF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSYjeEQ7JiN4QTtpcyBub3QgZXhwcmVzc2libGUgaW4gRUpCIFFMLCB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgYmUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50IHNob3VsZCBiZSBlbXB0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO1RoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHF1ZXJ5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWpiUUwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250YWlucyB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBUaGlzIGVsZW1lbnQgaXMgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgcXVlcnkgZWxlbWVudCB3aG9zZSBjb250ZW50cyBzcGVjaWZ5IHRoZSBmaW5kZXIgb3IgdGhlIHNlbGVjdCBtZXRob2QgdGhhdCB1c2VzIHRoZSBxdWVyeS4gVGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBlbnRpdHkgYmVhbiBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4gVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwuJiN4RDsmI3hBOyYjeEQ7JiN4QTtAaW52YXJpYW50IFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgRUpCIFFMIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGVudGl0eSBiZWFuIG9yIGRlcGVuZGVudCBvYmplY3QgY2xhc3MgZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuJiN4RDsmI3hBO0BpbnZhcmlhbnQgVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmbHQ7cXVlcnk+JiN4RDsmI3hBOyZsdDtxdWVyeS1tZXRob2Q+JiN4RDsmI3hBOyZsdDttZXRob2QtbmFtZT5lamJTZWxlY3RQZW5kaW5nTGluZWl0ZW1zJmx0Oy9tZXRob2QtbmFtZT4mI3hEOyYjeEE7Jmx0O21ldGhvZC1wYXJhbXMvPiYjeEQ7JiN4QTsmbHQ7L3F1ZXJ5LW1ldGhvZD4mI3hEOyYjeEE7Jmx0O2VqYi1xbD5TRUxFQ1QgRU5USVRZKGwpJiN4RDsmI3hBO0ZST00gTGluZUl0ZW1zIGwmI3hEOyYjeEE7V0hFUkUgbC5zaGlwcGVkIGlzIEZBTFNFJiN4RDsmI3hBOyZsdDsvZWpiLXFsPiYjeEQ7JiN4QTsmbHQ7L3F1ZXJ5PiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXR1cm5UeXBlTWFwcGluZyIgZVR5cGU9IiMvL1JldHVyblR5cGVNYXBwaW5nIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvIHNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSB0aGF0IGlzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IgRUpCT2JqZWN0IHR5cGUuICBUaGUgdmFsdWUgb2YgdGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCwgaWYgc3BlY2lmaWVkIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InF1ZXJ5TWV0aG9kIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUXVlcnlNZXRob2QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1F1ZXJ5TWV0aG9kL3F1ZXJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWV0aG9kIChEQi9TUi9DTS0mcXVvdDtvbiB0aGUgaG9tZSZxdW90OykgZm9yIGEgZmluZGVyIG9yJiN4RDsmI3hBO3NlbGVjdCBxdWVyeS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QmI3hEOyYjeEE7bWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzIG9yIGEgc2VsZWN0IG1ldGhvZCBpbiYjeEQ7JiN4QTt0aGUgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4mI3hEOyYjeEE7JiN4RDsmI3hBO0VhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlJiN4RDsmI3hBO21ldGhvZC1wYXJhbXMgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHF1ZXJ5JiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZTomI3hEOyYjeEE7Jmx0O3F1ZXJ5PiYjeEQ7JiN4QTsgICZsdDtkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzJmx0Oy9kZXNjcmlwdGlvbj4mI3hEOyYjeEE7ICAmbHQ7cXVlcnktbWV0aG9kPiYjeEQ7JiN4QTsgICAgJmx0O21ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVycyZsdDsvbWV0aG9kLW5hbWU+JiN4RDsmI3hBOyAgICAmbHQ7bWV0aG9kLXBhcmFtcz4mbHQ7L21ldGhvZC1wYXJhbXM+JiN4RDsmI3hBOyAgJmx0Oy9xdWVyeS1tZXRob2Q+JiN4RDsmI3hBOyAgJmx0O2VqYi1xbD5TRUxFQ1QgRU5USVRZKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmYW1wO2d0OyAxMDAwJmx0Oy9lamItcWw+JiN4RDsmI3hBOyZsdDsvcXVlcnk+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eSIgZVR5cGU9IiMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5L3F1ZXJpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRUpCUmVsYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjMmI3hEOyYjeEE7VGhlIGVqYi1yZWxhdGlvbiBlbGVtZW50IGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZS4gQW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlcy4gVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtAaW52YXJpYW50IFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLiYjeEQ7JiN4QTtAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXMuc2l6ZSA9PSAyJiN4RDsmI3hBO0BpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlc1swXS5uYW1lICE9IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMV0ubmFtZSYjeEQ7JiN4QTsmI3hEOyYjeEE7QG1pZ3JhdGlvbiBFSkIxLjEgTW92ZWQgZnJvbSBlamJleHQ6OkVqYlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIHVuZGVyIGVqYmV4dDo6RUpCSmFyRXh0ZW5zaW9uJiN4RDsmI3hBO0BtaWdyYXRpb24gRUpCMS4xIGFkZGVkIG9wdGlvbmFsIGF0dHJpYnV0ZSwgZGVzY3JpcHRpb246U3RyaW5nJiN4RDsmI3hBO0BtaWdyYXRpb24gRUpCMS4xIGFkZGVkIG9wdGlvbmFsIGF0dHJpYnV0ZSwgbmFtZTpTdHJpbmcgKE1heSBoYXZlIGJlZW4gaW5oZXJpdGVkIGZyb20gUmVmQmFzZU9iamVjdCBwcmV2aW91c2x5KSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgZWpiIHJlbGF0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIElmIHNwZWNpZmllZCwgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuJiN4RDsmI3hBO0BpbnZhcmlhbnQgc2VsZi5uYW1lIHVuaXF1ZSB3aXRoaW4gU2V0Jmx0O2NvbGxlY3QoZWpiSmFyLmVqYlJlbGF0aW9ucy5uYW1lKT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVsYXRpb25zaGlwTGlzdCIgZVR5cGU9IiMvL1JlbGF0aW9uc2hpcHMiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWxhdGlvbnNoaXBzL2VqYlJlbGF0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWxhdGlvbnNoaXBSb2xlcyIgbG93ZXJCb3VuZD0iMiIKLSAgICAgICAgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0VKQlJlbGF0aW9uc2hpcFJvbGUiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0VKQlJlbGF0aW9uc2hpcFJvbGUvcmVsYXRpb25zaGlwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgZXhhY3RseSB0d28gcmVsYXRpb25zaGlwIHJvbGVzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QG1pZ3JhdGlvbiBFSkIxLjEgQ29udGFpbm1lbnQgdXNlZCB0byBiZSBieSByZWZlcmVuY2Ugb24gcmVsYXRpb24tLW5vdyBieSB2YWx1ZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFSkJSZWxhdGlvbnNoaXBSb2xlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS4zJiN4RDsmI3hBO1RoZSBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhIHJlbGF0aW9uc2hpcC4mI3hEOyYjeEE7VGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4gVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOyB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eS1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kIHRoYXQgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcyAmcXVvdDtub3QgYXdhcmUmcXVvdDsgb2YgdGhlIHJlbGF0aW9uc2hpcC4mI3hEOyYjeEE7JiN4RDsmI3hBO0BpbnZhcmlhbnQgbXVsdGlwbGljaXR5ICE9IG51bGwmI3hEOyYjeEE7QGludmFyaWFudCByb2xlU291cmNlICE9IG51bGwmI3hEOyYjeEE7QGludmFyaWFudCBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgaW4gYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IGluIHdoaWNoIHRoZSByb2xlU291cmNlIGVsZW1lbnQgc3BlY2lmaWVzIGEgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4gJiN4RDsmI3hBO0BpbnZhcmlhbnQgQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJyZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIgRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtFeGFtcGxlOiYjeEQ7JiN4QTsmbHQ7ZWpiLXJlbGF0aW9uPiYjeEQ7JiN4QTsgICZsdDtlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtJmx0Oy9lamItcmVsYXRpb24tbmFtZT4mI3hEOyYjeEE7ICAmbHQ7ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPiYjeEQ7JiN4QTsgICAgJmx0O2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnByb2R1Y3QtaGFzLWxpbmVpdGVtcyZsdDsvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+JiN4RDsmI3hBOyAgICAmbHQ7bXVsdGlwbGljaXR5Pk9uZSZsdDsvbXVsdGlwbGljaXR5PiYjeEQ7JiN4QTsgICAgJmx0O3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4mI3hEOyYjeEE7ICAgICAgJmx0O2VqYi1uYW1lPlByb2R1Y3RFSkImbHQ7L2VqYi1uYW1lPiYjeEQ7JiN4QTsgICAgJmx0Oy9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+JiN4RDsmI3hBOyAgJmx0Oy9lamItcmVsYXRpb25zaGlwLXJvbGU+JiN4RDsmI3hBOy4uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgZWpiIHJlbGF0aW9uc2hpcCByb2xlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGEgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbiBlamItcmVsYXRpb24uIERpZmZlcmVudCByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgYSByb2xlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibXVsdGlwbGljaXR5IiBlVHlwZT0iIy8vTXVsdGlwbGljaXR5S2luZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgbXVsdGlwbGljaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6JiN4RDsmI3hBOyAgICAgT25lJiN4RDsmI3hBOyAgICAgTWFueSYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZURlbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhhdCwgd2l0aGluIGEgcGFydGljdWxhciByZWxhdGlvbnNoaXAsIHRoZSBsaWZldGltZSBvZiBvbmUgb3IgbW9yZSBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50IHVwb24gdGhlIGxpZmV0aW1lIG9mIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbiBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIEVKQlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIGluIGFuIEVKQnJlbGF0aW9uIGluIHdoaWNoIHRoZSBvdGhlciBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVsYXRpb25zaGlwIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRUpCUmVsYXRpb24iIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJSZWxhdGlvbi9yZWxhdGlvbnNoaXBSb2xlcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xlU291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Sb2xlU291cmNlL3JvbGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uJiN4RDsmI3hBO0BtaWdyYXRpb24gRUpCMS4xOiB3YXMgaWJtZWpiZXh0OjpFamJSZWxhdGlvbnNoaXBSb2xlOjpzb3VyY2VFSkJOYW1lLCBidXQgdGhhdCBtYXkgbm90IGJlIHN1ZmZpY2llbnQsIGFzIHRoaXMgY2FuIG5vdyByZWZlciB0byBkZXBlbmRlbnQgY2xhc3MgbmFtZXMgb3IgZWpiIHJlZnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY21yRmllbGQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9DTVJGaWVsZCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQ01SRmllbGQvcm9sZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVjbGFyYXRpb24gb2YgdGhlIENNUkZpZWxkLCBpZiBhbnksIGJ5IG1lYW5zIG9mIHdoaWNoIHRoZSBvdGhlciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlJiN4RDsmI3hBOyYjeEQ7JiN4QTtAbWlncmF0aW9uIEVKQjEuMTogVXNlZCB0byBiZSBoYW5kbGVkIHZpYSBpYm1lamJleHQ6OkVqYlJvbGU6OmF0dHJpYnV0ZXMgbGlzdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNvdXJjZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLiYjeEQ7JiN4QTtAaW52YXJpYW50IFRoZSBjb250ZW50IG9mIGVhY2ggcm9sZS1zb3VyY2UgZWxlbWVudCBzaGFsbCByZWZlciB0byBhbiBleGlzdGluZyBlbnRpdHkgYmVhbiwgZW50aXR5IGJlYW4gcmVmZXJlbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0VKQlJlbGF0aW9uc2hpcFJvbGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL3NvdXJjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlCZWFuIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ01SRmllbGQiIGVTdXBlclR5cGVzPSIjLy9DTVBBdHRyaWJ1dGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjMmI3hEOyYjeEE7RGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZiBhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBhbmQgdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEgcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjpuYW1lIGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yIG1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBDTVJGaWVsZDo6dHlwZSBlbGVtZW50IGlzIHVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgQ01SRmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkIChhIGphdmEgY2xhc3MgbmFtZSkuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZSIgZVR5cGU9IiMvL0VKQlJlbGF0aW9uc2hpcFJvbGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL2NtckZpZWxkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbGxlY3Rpb25UeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VEcml2ZW4iIGVTdXBlclR5cGVzPSIjLy9FbnRlcnByaXNlQmVhbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbiYjeEQ7JiN4QTtiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZSYjeEQ7JiN4QTsgICAgICBpY29uIGZpbGUgbmFtZS4mI3hEOyYjeEE7ICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4mI3hEOyYjeEE7ICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciYjeEQ7JiN4QTsgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnaW5nJiN4RDsmI3hBOyAgICAgIHR5cGUmI3hEOyYjeEE7ICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyYjeEQ7JiN4QTsgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyYjeEQ7JiN4QTsgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyYjeEQ7JiN4QTsgICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50JiN4RDsmI3hBOyAgICAgIGVudHJpZXMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQiYjeEQ7JiN4QTsgICAgICByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UmI3hEOyYjeEE7ICAgICAgcmVmZXJlbmNlcyYjeEQ7JiN4QTsgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkmI3hEOyYjeEE7ICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzJiN4RDsmI3hBOyAgICAgIG1ldGhvZHMmI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyYjeEQ7JiN4QTsgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSYjeEQ7JiN4QTsgICAgICByZWZlcmVuY2VzJiN4RDsmI3hBOyAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UmI3hEOyYjeEE7ICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4mI3hEOyYjeEE7ICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlJiN4RDsmI3hBOyAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNhY3Rpb25UeXBlIiBlVHlwZT0iIy8vVHJhbnNhY3Rpb25UeXBlIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogQmVhbiwgQ29udGFpbmVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1lc3NhZ2VTZWxlY3RvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXNzYWdlLXNlbGVjdG9yIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBKTVMgbWVzc2FnZSYjeEQ7JiN4QTtzZWxlY3RvciB0byBiZSB1c2VkIGluIGRldGVybWluaW5nIHdoaWNoIG1lc3NhZ2VzIGEgbWVzc2FnZS1kcml2ZW4mI3hEOyYjeEE7YmVhbiBpcyB0byByZWNlaXZlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZSB2YWx1ZTogJiN4RDsmI3hBO0pNU1R5cGUgPSBgY2FyJyBBTkQgY29sb3IgPSBgYmx1ZScgQU5EIHdlaWdodCA+IDI1MDAmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFja25vd2xlZGdlTW9kZSIgZVR5cGU9IiMvL0Fja25vd2xlZGdlTW9kZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9ImFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBhY2tub3dsZWRnbWVudCBtb2RlIGZvciB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBpZiBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gaXMgdXNlZCAoaWUuIHNlbGYudHJhbnNhY3Rpb25UeXBlID0gQmVhbikmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhY2tub3dsZWRnZS1tb2RlIHNwZWNpZmllcyB3aGV0aGVyIEpNUyBBVVRPX0FDS05PV0xFREdFIG9yIERVUFNfT0tfQUNLTk9XTEVER0UgbWVzc2FnZSBhY2tub3dsZWRnbWVudCBzZW1hbnRpY3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBvbk1lc3NhZ2UgbWVzc2FnZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdGhhdCB1c2VzIGJlYW4gbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhY2tub3dsZWRnZS1tb2RlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAgQXV0by1hY2tub3dsZWRnZSwgRHVwcy1vay1hY2tub3dsZWRnZSYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MmI3hEOyYjeEE7JiN4OTsgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc3RpbmF0aW9uIiBlVHlwZT0iIy8vTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24vYmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBhY3RpdmF0aW9uQ29uZmlnJiN4RDsmI3hBO0FuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbiB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2YXRpb25Db25maWciIGVUeXBlPSIjLy9BY3RpdmF0aW9uQ29uZmlnIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWVzc2FnZURlc3RpbmF0aW9uIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdpbmdUeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UmI3hEOyYjeEE7ICAgICAgICBsaXN0ZW5lciBpbnRlcmZhY2Ugb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4uIElmJiN4RDsmI3hBOyAgICAgICAgdGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMmI3hEOyYjeEE7ICAgICAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYWR2aWNlIHRvIHRoZSBEZXBsb3llciBhcyB0byB3aGV0aGVyIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiBpcyBpbnRlbmRlZCBmb3IgYSBRdWV1ZSBvciBhIFRvcGljLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW50ZW5kZWQgZGVzdGluYXRpb24gYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHdoZXRoZXIgYSBkdXJhYmxlIG9yIG5vbi1kdXJhYmxlIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUgZGVzdGluYXRpb24tdHlwZSBpcyBqYXZheC5qbXMuVG9waWMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9EZXN0aW5hdGlvblR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgSk1TIGRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6IGphdmF4Lmptcy5RdWV1ZSwgamF2YXguam1zLlRvcGljIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YnNjcmlwdGlvbkR1cmFiaWxpdHkiCi0gICAgICAgIGVUeXBlPSIjLy9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGEgSk1TIHRvcGljIHN1YnNjcmlwdGlvbiBpcyBpbnRlbmRlZCB0byBiZSBkdXJhYmxlIG9yIG5vbmR1cmFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogIER1cmFibGUsIE5vbkR1cmFibGUmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJlYW4iIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9NZXNzYWdlRHJpdmVuIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWVzc2FnZURyaXZlbi9kZXN0aW5hdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkFja25vd2xlZGdlTW9kZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXV0by1hY2tub3dsZWRnZT0wJiN4RDsmI3hBO0R1cHMtb2stYWNrbm93bGVkZ2U9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQXV0b0Fja25vd2xlZGdlIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJEdXBzT2tBY2tub3dsZWRnZSIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRHVyYWJsZT0wJiN4RDsmI3hBO05vbkR1cmFibGU9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRHVyYWJsZSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTm9uRHVyYWJsZSIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJSZXR1cm5UeXBlTWFwcGluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTG9jYWw9MCYjeEQ7JiN4QTtSZW1vdGU9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTG9jYWwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJlbW90ZSIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhjbHVkZUxpc3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGNsdWRlIGxpc3QgZWxlbWVudCBkZWZpbmVzIGEgc2V0IG9mIG1ldGhvZHMgd2hpY2ggdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLiBJdCBjb250YWlucyBvbmUgb3IgbW9yZSBtZXRob2RzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIG11c3QgY29uc2lkZXIgdGhvc2UgbWV0aG9kcyB0byBiZSB1bmNhbGxhYmxlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZEVsZW1lbnRzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRlc3RpbmF0aW9uVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUXVldWU9MCYjeEQ7JiN4QTtUb3BpYz0xIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJRdWV1ZSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVG9waWMiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlF1ZXJ5TWV0aG9kIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InF1ZXJ5IiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUXVlcnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9RdWVyeS9xdWVyeU1ldGhvZCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik11bHRpcGxpY2l0eUtpbmQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik9uZT0wJiN4RDsmI3hBO01hbnk9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT25lIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJNYW55IiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUmI3hEOyYjeEE7Y29uZmlndXJhdGlvbiBwcm9wZXJ0eSBwYWlyIGZvciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXImI3hEOyYjeEE7bWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQmI3hEOyYjeEE7ICAgICAgICBjb250YWlucyB0aGUgdmFsdWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiYjeEQ7JiN4QTsgICAgICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIGVsZW1lbnQgY29udGFpbnMmI3hEOyYjeEE7ICAgICAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mJiN4RDsmI3hBOyAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBGb3IgSk1TIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLCB0aGUgZm9sbG93aW5nIHByb3BlcnR5JiN4RDsmI3hBOyAgICAgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwmI3hEOyYjeEE7ICAgICAgICBtZXNzYWdlU2VsZWN0b3IsIGRlc3RpbmF0aW9uVHlwZSwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3RpdmF0aW9uQ29uZmlnIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBhY3RpdmF0aW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUmI3hEOyYjeEE7ZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJiN4RDsmI3hBO2luIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbiYjeEQ7JiN4QTthYm91dCBtZXNzYWdlIGFja25vd2xlZGdlbWVudCwgbWVzc2FnZSBzZWxlY3RvciwgZXhwZWN0ZWQmI3hEOyYjeEE7ZGVzdGluYXRpb24gdHlwZSwgZXRjLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mJiN4RDsmI3hBO25hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyJiN4RDsmI3hBO21lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25maWdQcm9wZXJ0aWVzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2oyZWUuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvajJlZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwNzBkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvajJlZS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDg5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIgbW9kZWxOYW1lPSJKMmVlIiB0ZXN0c0RpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzIgotICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5yb3NlIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YU1vZGVsLmdlbm1vZGVsIy8vamF2YSI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxqMmVlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPldPUktTUEFDRV9ST09UPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+RDpcd29ya1xNNTwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJDbGllbnQiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iY2xpZW50LmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImNsaWVudC5lY29yZSMvL1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjbGllbnQuZWNvcmUjLy9SZXNBdXRoQXBwbGljYXRpb25UeXBlL0FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNsaWVudC5lY29yZSMvL1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUvQ29udGFpbmVyIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC9yZXNvdXJjZVJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY2xpZW50LmVjb3JlIy8vQXBwbGljYXRpb25DbGllbnQvZW52aXJvbm1lbnRQcm9wcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC9lamJSZWZlcmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L3Jlc291cmNlRW52UmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L2NhbGxiYWNrSGFuZGxlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC9zZXJ2aWNlUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjbGllbnQuZWNvcmUjLy9BcHBsaWNhdGlvbkNsaWVudC9tZXNzYWdlRGVzdGluYXRpb25SZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNsaWVudC5lY29yZSMvL0FwcGxpY2F0aW9uQ2xpZW50L21lc3NhZ2VEZXN0aW5hdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkFwcGxpY2F0aW9uIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9ImFwcGxpY2F0aW9uLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFwcGxpY2F0aW9uLmVjb3JlIy8vQXBwbGljYXRpb24vdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBhcHBsaWNhdGlvbi5lY29yZSMvL0FwcGxpY2F0aW9uL3NlY3VyaXR5Um9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXBwbGljYXRpb24uZWNvcmUjLy9BcHBsaWNhdGlvbi9tb2R1bGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZS9hbHRERCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZS9hcHBsaWNhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYk1vZHVsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXBwbGljYXRpb24uZWNvcmUjLy9XZWJNb2R1bGUvY29udGV4dFJvb3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9KYXZhQ2xpZW50TW9kdWxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9FamJNb2R1bGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL0Nvbm5lY3Rvck1vZHVsZSIvPgotICAgIDxuZXN0ZWRHZW5QYWNrYWdlcyBwcmVmaXg9IkFwcGxpY2F0aW9uIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iYXBwbGljYXRpb24uZWNvcmUjLyI+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL0FwcGxpY2F0aW9uIiBsYWJlbEZlYXR1cmU9IiMvL2NvbW1vbi9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC9kaXNwbGF5TmFtZSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcHBsaWNhdGlvbi5lY29yZSMvL0FwcGxpY2F0aW9uL3ZlcnNpb24iLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBhcHBsaWNhdGlvbi5lY29yZSMvL0FwcGxpY2F0aW9uL3NlY3VyaXR5Um9sZXMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBhcHBsaWNhdGlvbi5lY29yZSMvL0FwcGxpY2F0aW9uL21vZHVsZXMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImFwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlIiBsYWJlbEZlYXR1cmU9IiMvL2FwcGxpY2F0aW9uL2FwcGxpY2F0aW9uL01vZHVsZS91cmkiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXBwbGljYXRpb24uZWNvcmUjLy9Nb2R1bGUvdXJpIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcHBsaWNhdGlvbi5lY29yZSMvL01vZHVsZS9hbHRERCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGFwcGxpY2F0aW9uLmVjb3JlIy8vTW9kdWxlL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYk1vZHVsZSIgbGFiZWxGZWF0dXJlPSIjLy9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi9Nb2R1bGUvdXJpIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViTW9kdWxlL2NvbnRleHRSb290Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcHBsaWNhdGlvbi5lY29yZSMvL0phdmFDbGllbnRNb2R1bGUiIGxhYmVsRmVhdHVyZT0iIy8vYXBwbGljYXRpb24vYXBwbGljYXRpb24vTW9kdWxlL3VyaSIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9FamJNb2R1bGUiIGxhYmVsRmVhdHVyZT0iIy8vYXBwbGljYXRpb24vYXBwbGljYXRpb24vTW9kdWxlL3VyaSIvPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXBwbGljYXRpb24uZWNvcmUjLy9Db25uZWN0b3JNb2R1bGUiIGxhYmVsRmVhdHVyZT0iIy8vYXBwbGljYXRpb24vYXBwbGljYXRpb24vTW9kdWxlL3VyaSIvPgotICAgIDwvbmVzdGVkR2VuUGFja2FnZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkNvbW1vbiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJjb21tb24uZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL1N0cmluZyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvSW50ZWdlciIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvQm9vbGVhbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvRG91YmxlIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9CeXRlIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5VHlwZS9TaG9ydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvTG9uZyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FbnZFbnRyeVR5cGUvRmxvYXQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRW52RW50cnlUeXBlL0NoYXJhY3RlciIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iY29tbW9uLmVjb3JlIy8vUmVzQXV0aFR5cGVCYXNlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vUmVzQXV0aFR5cGVCYXNlL0NvbnRhaW5lciIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9SZXNBdXRoVHlwZUJhc2UvQXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vUmVzQXV0aFR5cGVCYXNlL1NFUlZMRVQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImNvbW1vbi5lY29yZSMvL0VqYlJlZlR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9FamJSZWZUeXBlL1Nlc3Npb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vRWpiUmVmVHlwZS9FbnRpdHkiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImNvbW1vbi5lY29yZSMvL1Jlc1NoYXJpbmdTY29wZVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9SZXNTaGFyaW5nU2NvcGVUeXBlL1NoYXJlYWJsZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9SZXNTaGFyaW5nU2NvcGVUeXBlL1Vuc2hhcmVhYmxlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUvQ29uc3VtZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlL1Byb2R1Y2VzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS9Db25zdW1lc1Byb2R1Y2VzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9FamJSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VqYlJlZi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRWpiUmVmL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FamJSZWYvaG9tZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VqYlJlZi9yZW1vdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FamJSZWYvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VqYlJlZi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9FamJSZWYvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0VudkVudHJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FbnZFbnRyeS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VudkVudHJ5L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FbnZFbnRyeS92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0VudkVudHJ5L3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vRW52RW50cnkvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VSZWYvYXV0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlUmVmL2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9SZXNvdXJjZVJlZi9yZXNTaGFyaW5nU2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VSZWYvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZVJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlUmVmL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGVSZWYvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGVSZWYvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGVSZWYvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlL3JvbGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5Um9sZS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VFbnZSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlRW52UmVmL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VFbnZSZWYvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL1Jlc291cmNlRW52UmVmL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vUmVzb3VyY2VFbnZSZWYvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0VKQkxvY2FsUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FSkJMb2NhbFJlZi9sb2NhbEhvbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9FSkJMb2NhbFJlZi9sb2NhbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9SdW5Bc1NwZWNpZmllZElkZW50aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vUnVuQXNTcGVjaWZpZWRJZGVudGl0eS9pZGVudGl0eSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9JZGVudGl0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vSWRlbnRpdHkvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9JZGVudGl0eS9yb2xlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9JZGVudGl0eS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vSWNvblR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0ljb25UeXBlL3NtYWxsSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0ljb25UeXBlL2xhcmdlSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0ljb25UeXBlL2xhbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vRGlzcGxheU5hbWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0Rpc3BsYXlOYW1lL2xhbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25SZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvblJlZi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uUmVmL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25SZWYvdXNhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25SZWYvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb25SZWYvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL01lc3NhZ2VEZXN0aW5hdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vTWVzc2FnZURlc3RpbmF0aW9uL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZS92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vUGFyYW1WYWx1ZS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uR3JvdXAvaWNvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25Hcm91cC9kaXNwbGF5TmFtZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25Hcm91cC9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cC9lbnZpcm9ubWVudFByb3BlcnRpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cC9yZXNvdXJjZVJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vSk5ESUVudlJlZnNHcm91cC9lamJSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAvcmVzb3VyY2VFbnZSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAvZWpiTG9jYWxSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAvbWVzc2FnZURlc3RpbmF0aW9uUmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9KTkRJRW52UmVmc0dyb3VwL3NlcnZpY2VSZWZzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1NlY3VyaXR5SWRlbnRpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL1NlY3VyaXR5SWRlbnRpdHkvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlJZGVudGl0eS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vVXNlQ2FsbGVySWRlbnRpdHkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24vbGFuZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uL3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9RTmFtZS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9RTmFtZS9sb2NhbFBhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9RTmFtZS9jb21iaW5lZFFOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vUU5hbWUvaW50ZXJuYWxQcmVmaXhPck5zVVJJIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0xpc3RlbmVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21tb24uZWNvcmUjLy9MaXN0ZW5lci9saXN0ZW5lckNsYXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC9zbWFsbEljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC9sYXJnZUljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwL2Rpc3BsYXlOYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJFamIiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iZWpiLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS9Ob3RTdXBwb3J0ZWQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlL1N1cHBvcnRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS9SZXF1aXJlZCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUvUmVxdWlyZXNOZXciLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlL01hbmRhdG9yeSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUvTmV2ZXIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uVHlwZS9CZWFuIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1RyYW5zYWN0aW9uVHlwZS9Db250YWluZXIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL1Nlc3Npb25UeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vU2Vzc2lvblR5cGUvU3RhdGVmdWwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vU2Vzc2lvblR5cGUvU3RhdGVsZXNzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50S2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL1Vuc3BlY2lmaWVkIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL1JlbW90ZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50S2luZC9Ib21lIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL0xvY2FsIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnRLaW5kL0xvY2FsSG9tZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50S2luZC9TZXJ2aWNlRW5kcG9pbnQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL0Fja25vd2xlZGdlTW9kZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL0Fja25vd2xlZGdlTW9kZS9BdXRvQWNrbm93bGVkZ2UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vQWNrbm93bGVkZ2VNb2RlL0R1cHNPa0Fja25vd2xlZGdlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJlamIuZWNvcmUjLy9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL1N1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kL0R1cmFibGUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWpiLmVjb3JlIy8vU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQvTm9uRHVyYWJsZSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iZWpiLmVjb3JlIy8vUmV0dXJuVHlwZU1hcHBpbmciPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9SZXR1cm5UeXBlTWFwcGluZy9Mb2NhbCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9SZXR1cm5UeXBlTWFwcGluZy9SZW1vdGUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL0Rlc3RpbmF0aW9uVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVqYi5lY29yZSMvL0Rlc3RpbmF0aW9uVHlwZS9RdWV1ZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9EZXN0aW5hdGlvblR5cGUvVG9waWMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImVqYi5lY29yZSMvL011bHRpcGxpY2l0eUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9NdWx0aXBsaWNpdHlLaW5kL09uZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlamIuZWNvcmUjLy9NdWx0aXBsaWNpdHlLaW5kL01hbnkiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkvYWJzdHJhY3RTY2hlbWFOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0NvbnRhaW5lck1hbmFnZWRFbnRpdHkvcGVyc2lzdGVudEF0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5L2tleUF0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eS9xdWVyaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQ29udGFpbmVyTWFuYWdlZEVudGl0eS9DTVBBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Db250YWluZXJNYW5hZ2VkRW50aXR5L3ByaW1LZXlGaWVsZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kUGVybWlzc2lvbi91bmNoZWNrZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kUGVybWlzc2lvbi9hc3NlbWJseURlc2NyaXB0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXRob2RQZXJtaXNzaW9uL3JvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZFBlcm1pc3Npb24vbWV0aG9kRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kUGVybWlzc2lvbi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yL21ldGhvZFBlcm1pc3Npb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0Fzc2VtYmx5RGVzY3JpcHRvci9tZXRob2RUcmFuc2FjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yL2VqYkphciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Bc3NlbWJseURlc2NyaXB0b3Ivc2VjdXJpdHlSb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Bc3NlbWJseURlc2NyaXB0b3IvZXhjbHVkZUxpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQXNzZW1ibHlEZXNjcmlwdG9yL21lc3NhZ2VEZXN0aW5hdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01ldGhvZFRyYW5zYWN0aW9uL3RyYW5zYWN0aW9uQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kVHJhbnNhY3Rpb24vYXNzZW1ibHlEZXNjcmlwdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZFRyYW5zYWN0aW9uL21ldGhvZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZFRyYW5zYWN0aW9uL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9TZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9TZXNzaW9uL3RyYW5zYWN0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL1Nlc3Npb24vc2Vzc2lvblR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9TZXNzaW9uL3NlcnZpY2VFbmRwb2ludCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9FbnRpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VudGl0eS9yZWVudHJhbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRpdHkvcHJpbWFyeUtleSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL3NlY3VyaXR5Um9sZVJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9lamJDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL2hvbWVJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9yZW1vdGVJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRW50ZXJwcmlzZUJlYW4vZWpiSmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VudGVycHJpc2VCZWFuL3NlY3VyaXR5SWRlbnRpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9sb2NhbEhvbWVJbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FbnRlcnByaXNlQmVhbi9sb2NhbEludGVyZmFjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9FSkJNZXRob2RDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VKQkphciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRUpCSmFyL2VqYkNsaWVudEphciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VKQkphci92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VKQkphci9hc3NlbWJseURlc2NyaXB0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCSmFyL2VudGVycHJpc2VCZWFucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJKYXIvcmVsYXRpb25zaGlwTGlzdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXRob2RFbGVtZW50L3Bhcm1zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudC90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01ldGhvZEVsZW1lbnQvZW50ZXJwcmlzZUJlYW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vQ01QQXR0cmlidXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9DTVBBdHRyaWJ1dGUvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vQ01QQXR0cmlidXRlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9SZWxhdGlvbnNoaXBzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9SZWxhdGlvbnNoaXBzL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JlbGF0aW9uc2hpcHMvZWpiSmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JlbGF0aW9uc2hpcHMvZWpiUmVsYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JlbGF0aW9uc2hpcHMvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL1F1ZXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9RdWVyeS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL1F1ZXJ5L2VqYlFMIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vUXVlcnkvcmV0dXJuVHlwZU1hcHBpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUXVlcnkvcXVlcnlNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vUXVlcnkvZW50aXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1F1ZXJ5L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9FSkJSZWxhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0VKQlJlbGF0aW9uL3JlbGF0aW9uc2hpcExpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb24vcmVsYXRpb25zaGlwUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb24vZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0VKQlJlbGF0aW9uc2hpcFJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0VKQlJlbGF0aW9uc2hpcFJvbGUvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL3JvbGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9tdWx0aXBsaWNpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL2Nhc2NhZGVEZWxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9yZWxhdGlvbnNoaXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vRUpCUmVsYXRpb25zaGlwUm9sZS9jbXJGaWVsZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9FSkJSZWxhdGlvbnNoaXBSb2xlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9Sb2xlU291cmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9Sb2xlU291cmNlL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JvbGVTb3VyY2Uvcm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1JvbGVTb3VyY2UvZW50aXR5QmVhbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9Sb2xlU291cmNlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9DTVJGaWVsZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0NNUkZpZWxkL3JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9DTVJGaWVsZC9jb2xsZWN0aW9uVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL3RyYW5zYWN0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4vbWVzc2FnZVNlbGVjdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbi9hY2tub3dsZWRnZU1vZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbi9kZXN0aW5hdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL2FjdGl2YXRpb25Db25maWciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuL21lc3NhZ2VEZXN0aW5hdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW4vbWVzc2FnaW5nVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uL3N1YnNjcmlwdGlvbkR1cmFiaWxpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWpiLmVjb3JlIy8vTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uL2JlYW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vRXhjbHVkZUxpc3QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVqYi5lY29yZSMvL0V4Y2x1ZGVMaXN0L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0V4Y2x1ZGVMaXN0L21ldGhvZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0V4Y2x1ZGVMaXN0L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlamIuZWNvcmUjLy9RdWVyeU1ldGhvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL1F1ZXJ5TWV0aG9kL3F1ZXJ5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVqYi5lY29yZSMvL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWpiLmVjb3JlIy8vQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWpiLmVjb3JlIy8vQWN0aXZhdGlvbkNvbmZpZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVqYi5lY29yZSMvL0FjdGl2YXRpb25Db25maWcvY29uZmlnUHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlamIuZWNvcmUjLy9BY3RpdmF0aW9uQ29uZmlnL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iVGFnbGliIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBpbnRlcmZhY2VQYWNrYWdlU3VmZml4PSJpbnRlcm5hbCIgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIKLSAgICAgIGVjb3JlUGFja2FnZT0idGFnbGliLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InRhZ2xpYi5lY29yZSMvL0JvZHlDb250ZW50VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InRhZ2xpYi5lY29yZSMvL0JvZHlDb250ZW50VHlwZS90YWdkZXBlbmRlbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idGFnbGliLmVjb3JlIy8vQm9keUNvbnRlbnRUeXBlL0pTUCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ0YWdsaWIuZWNvcmUjLy9Cb2R5Q29udGVudFR5cGUvZW1wdHkiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idGFnbGliLmVjb3JlIy8vQm9keUNvbnRlbnRUeXBlL3NjcmlwdGxlc3MiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InRhZ2xpYi5lY29yZSMvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ0YWdsaWIuZWNvcmUjLy9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlL05FU1RFRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ0YWdsaWIuZWNvcmUjLy9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlL0FUX0JFR0lOIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InRhZ2xpYi5lY29yZSMvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUvQVRfRU5EIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9UYWdMaWIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0xpYi90YWdMaWJWZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vVGFnTGliL2pzcFZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvc2hvcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vVGFnTGliL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvdGFncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvdmFsaWRhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1RhZ0xpYi9saXN0ZW5lcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vVGFnTGliL2Z1bmN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdMaWIvdGFnbGliRXh0ZW5zaW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9KU1BUYWciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy9ib2R5Q29udGVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy9leGFtcGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BUYWcvZHluYW1pY0F0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnL2F0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnL3ZhcmlhYmxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy90YWdDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZy90ZWlDbGFzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9KU1BUYWdBdHRyaWJ1dGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFRhZ0F0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL3JlcXVpcmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL3J0RXhwclZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL2ZyYWdtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVGFnQXR0cmlidXRlL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ0YWdsaWIuZWNvcmUjLy9WYWxpZGF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1ZhbGlkYXRvci92YWxpZGF0b3JDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9WYWxpZGF0b3IvaW5pdFBhcmFtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9WYWxpZGF0b3IvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BWYXJpYWJsZS9uYW1lR2l2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BWYXJpYWJsZS9uYW1lRnJvbUF0dHJpYnV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlL2RlY2xhcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9KU1BWYXJpYWJsZS9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL0pTUFZhcmlhYmxlL3ZhcmlhYmxlQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vSlNQVmFyaWFibGUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL0Z1bmN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9GdW5jdGlvbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vRnVuY3Rpb24vc2lnbmF0dXJlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdGFnbGliLmVjb3JlIy8vRnVuY3Rpb24vZXhhbXBsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL0Z1bmN0aW9uL2Z1bmN0aW9uQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdGFnbGliLmVjb3JlIy8vRnVuY3Rpb24vZnVuY3Rpb25FeHRlbnNpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUvcGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHRhZ2xpYi5lY29yZSMvL1RhZ0ZpbGUvZXhhbXBsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB0YWdsaWIuZWNvcmUjLy9UYWdGaWxlL3RhZ0V4dGVuc2lvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idGFnbGliLmVjb3JlIy8vVGxkRXh0ZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9UbGRFeHRlbnNpb24vbmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHRhZ2xpYi5lY29yZSMvL1RsZEV4dGVuc2lvbi9leHRlbnNpb25FbGVtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InRhZ2xpYi5lY29yZSMvL0V4dGVuc2libGVUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB0YWdsaWIuZWNvcmUjLy9FeHRlbnNpYmxlVHlwZS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV2ViYXBwbGljYXRpb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0id2ViYXBwbGljYXRpb24uZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9SZXNBdXRoU2VydmxldFR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1Jlc0F1dGhTZXJ2bGV0VHlwZS9DT05UQUlORVIiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9SZXNBdXRoU2VydmxldFR5cGUvU0VSVkxFVCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0iPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9HRVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0vUE9TVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9QVVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0vREVMRVRFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSFRUUE1ldGhvZFR5cGVFbnVtL0hFQUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZUVudW0vT1BUSU9OUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0hUVFBNZXRob2RUeXBlRW51bS9UUkFDRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlL05PTkUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlL0lOVEVHUkFMIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVHJhbnNwb3J0R3VhcmFudGVlVHlwZS9DT05GSURFTlRJQUwiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRGlzcGF0Y2hlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Rpc3BhdGNoZXJUeXBlL0ZPUldBUkQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9EaXNwYXRjaGVyVHlwZS9JTkNMVURFIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRGlzcGF0Y2hlclR5cGUvUkVRVUVTVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Rpc3BhdGNoZXJUeXBlL0VSUk9SIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhNZXRob2RLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9BdXRoTWV0aG9kS2luZC9VTlNQRUNJRklFRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhNZXRob2RLaW5kL0JBU0lDIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aE1ldGhvZEtpbmQvRElHRVNUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQXV0aE1ldGhvZEtpbmQvRk9STSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhNZXRob2RLaW5kL0NMSUVOVF9DRVJUIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvZGlzdHJpYnV0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvY29udGV4dHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvZXJyb3JQYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9maWxlTGlzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC90YWdMaWJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2NvbnN0cmFpbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2xvZ2luQ29uZmlnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL21pbWVNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9zZXNzaW9uQ29uZmlnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL3NlcnZsZXRNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9zZXJ2bGV0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYkFwcC9zZWN1cml0eVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2ZpbHRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvZmlsdGVyTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvbGlzdGVuZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL2NvbnRleHRQYXJhbXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvanNwQ29uZmlnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViQXBwL21lc3NhZ2VEZXN0aW5hdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJBcHAvbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vQ29udGV4dFBhcmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0NvbnRleHRQYXJhbS9wYXJhbU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0NvbnRleHRQYXJhbS9wYXJhbVZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Db250ZXh0UGFyYW0vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Db250ZXh0UGFyYW0vd2ViQXBwIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0L3NlcnZsZXROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0L2xvYWRPblN0YXJ0dXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0L3dlYkFwcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvd2ViVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvcGFyYW1zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldC9zZWN1cml0eVJvbGVSZWZzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VydmxldC9ydW5BcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXQvaW5pdFBhcmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nL3VybFBhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0TWFwcGluZy93ZWJBcHAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlcnZsZXRNYXBwaW5nL3NlcnZsZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXNzaW9uQ29uZmlnIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1Nlc3Npb25Db25maWcvc2Vzc2lvblRpbWVvdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXNzaW9uQ29uZmlnL3dlYkFwcCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL01pbWVNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL01pbWVNYXBwaW5nL2V4dGVuc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTWltZU1hcHBpbmcvbWltZVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9NaW1lTWFwcGluZy93ZWJBcHAiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWxjb21lRmlsZUxpc3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlbGNvbWVGaWxlTGlzdC93ZWJBcHAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWxjb21lRmlsZUxpc3QvZmlsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Vycm9yUGFnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9FcnJvclBhZ2UvbG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9FcnJvclBhZ2Uvd2ViQXBwIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVGFnTGliUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RhZ0xpYlJlZi90YWdsaWJVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RhZ0xpYlJlZi90YWdsaWJMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1RhZ0xpYlJlZi93ZWJBcHAiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZWN1cml0eUNvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L2Rpc3BsYXlOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L3dlYkFwcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlY3VyaXR5Q29uc3RyYWludC93ZWJSZXNvdXJjZUNvbGxlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L2F1dGhDb25zdHJhaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vU2VjdXJpdHlDb25zdHJhaW50L3VzZXJEYXRhQ29uc3RyYWludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1NlY3VyaXR5Q29uc3RyYWludC9kaXNwbGF5TmFtZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL3dlYlJlc291cmNlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vdXJsUGF0dGVybiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL2h0dHBNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vc2VjQ29uc3RyYWludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYlJlc291cmNlQ29sbGVjdGlvbi9VUkxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL2Rlc2NyaXB0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlYlJlc291cmNlQ29sbGVjdGlvbi9IVFRQcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhDb25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhDb25zdHJhaW50L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9BdXRoQ29uc3RyYWludC9yb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0F1dGhDb25zdHJhaW50L3NlY0NvbnN0cmFpbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9BdXRoQ29uc3RyYWludC9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9Vc2VyRGF0YUNvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVXNlckRhdGFDb25zdHJhaW50L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Vc2VyRGF0YUNvbnN0cmFpbnQvdHJhbnNwb3J0R3VhcmFudGVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vVXNlckRhdGFDb25zdHJhaW50L3NlY0NvbnN0cmFpbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Vc2VyRGF0YUNvbnN0cmFpbnQvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWcvYXV0aE1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWcvcmVhbG1OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Mb2dpbkNvbmZpZy9hdXRob3JpemF0aW9uTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWcvd2ViQXBwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9naW5Db25maWcvZm9ybUxvZ2luQ29uZmlnIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRm9ybUxvZ2luQ29uZmlnIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Zvcm1Mb2dpbkNvbmZpZy9mb3JtTG9naW5QYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Gb3JtTG9naW5Db25maWcvZm9ybUVycm9yUGFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Zvcm1Mb2dpbkNvbmZpZy9sb2dpbkNvbmZpZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0luaXRQYXJhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Jbml0UGFyYW0vcGFyYW1OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Jbml0UGFyYW0vcGFyYW1WYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vSW5pdFBhcmFtL2Rlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9XZWJUeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9TZXJ2bGV0VHlwZS9jbGFzc05hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9KU1BUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0pTUFR5cGUvanNwRmlsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1VSTFBhdHRlcm5UeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1VSTFBhdHRlcm5UeXBlL3VybFBhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9VUkxQYXR0ZXJuVHlwZS9yZXNDb2xsZWN0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vUm9sZU5hbWVUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1JvbGVOYW1lVHlwZS9yb2xlTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlbGNvbWVGaWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL1dlbGNvbWVGaWxlL3dlbGNvbWVGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vV2VsY29tZUZpbGUvZmlsZUxpc3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9FeGNlcHRpb25UeXBlRXJyb3JQYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2UvZXhjZXB0aW9uVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0Vycm9yQ29kZUVycm9yUGFnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9FcnJvckNvZGVFcnJvclBhZ2UvZXJyb3JDb2RlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXJNYXBwaW5nL3VybFBhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0ZpbHRlck1hcHBpbmcvZGlzcGF0Y2hlclR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0ZpbHRlck1hcHBpbmcvZmlsdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXJNYXBwaW5nL3NlcnZsZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd2ViYXBwbGljYXRpb24uZWNvcmUjLy9GaWx0ZXIvaW5pdFBhcmFtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyL2ZpbHRlckNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vRmlsdGVyL2luaXRQYXJhbVZhbHVlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0L2xvY2FsRW5jb2RpbmdNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3ZWJhcHBsaWNhdGlvbi5lY29yZSMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nL2xvY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdlYmFwcGxpY2F0aW9uLmVjb3JlIy8vTG9jYWxFbmNvZGluZ01hcHBpbmcvZW5jb2RpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9IVFRQTWV0aG9kVHlwZS9odHRwTWV0aG9kIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJKY2EiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iamNhLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS9CYXNpY1Bhc3N3b3JkIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS9LZXJidjUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImpjYS5lY29yZSMvL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqY2EuZWNvcmUjLy9UcmFuc2FjdGlvblN1cHBvcnRLaW5kL05vVHJhbnNhY3Rpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamNhLmVjb3JlIy8vVHJhbnNhY3Rpb25TdXBwb3J0S2luZC9Mb2NhbFRyYW5zYWN0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImpjYS5lY29yZSMvL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQvWEFUcmFuc2FjdGlvbiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0b3IvdmVuZG9yTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rvci9zcGVjVmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rvci9laXNUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdG9yL3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vQ29ubmVjdG9yL2xpY2Vuc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vQ29ubmVjdG9yL3Jlc291cmNlQWRhcHRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9jb25uZWN0aW9uSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2Nvbm5lY3Rpb25JbXBsQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9SZXNvdXJjZUFkYXB0ZXIvdHJhbnNhY3Rpb25TdXBwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL3JlYXV0aGVudGljYXRpb25TdXBwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL3Jlc291cmNlQWRhcHRlckNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9zZWN1cml0eVBlcm1pc3Npb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL2NvbmZpZ1Byb3BlcnRpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVzb3VyY2VBZGFwdGVyL291dGJvdW5kUmVzb3VyY2VBZGFwdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9pbmJvdW5kUmVzb3VyY2VBZGFwdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1Jlc291cmNlQWRhcHRlci9hZG1pbk9iamVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20vYXV0aGVudGljYXRpb25NZWNoYW5pc20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS9jcmVkZW50aWFsSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20vY3VzdG9tQXV0aE1lY2hUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtL2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9Db25maWdQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29uZmlnUHJvcGVydHkvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25maWdQcm9wZXJ0eS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29uZmlnUHJvcGVydHkvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0NvbmZpZ1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL0NvbmZpZ1Byb3BlcnR5L2Rlc2NyaXB0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9TZWN1cml0eVBlcm1pc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1NlY3VyaXR5UGVybWlzc2lvbi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1NlY3VyaXR5UGVybWlzc2lvbi9zcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL1NlY3VyaXR5UGVybWlzc2lvbi9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vTGljZW5zZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vTGljZW5zZS9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0xpY2Vuc2UvcmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vTGljZW5zZS9kZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vSW5ib3VuZFJlc291cmNlQWRhcHRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL0luYm91bmRSZXNvdXJjZUFkYXB0ZXIvbWVzc2FnZUFkYXB0ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyL3JlYXV0aGVudGljYXRpb25TdXBwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIvdHJhbnNhY3Rpb25TdXBwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyL2Nvbm5lY3Rpb25EZWZpbml0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9PdXRib3VuZFJlc291cmNlQWRhcHRlci9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vTWVzc2FnZUFkYXB0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9NZXNzYWdlQWRhcHRlci9tZXNzYWdlTGlzdGVuZXJzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL0Nvbm5lY3Rpb25EZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0aW9uRGVmaW5pdGlvbi9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0Nvbm5lY3Rpb25EZWZpbml0aW9uL2Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdGlvbkRlZmluaXRpb24vY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9Db25uZWN0aW9uRGVmaW5pdGlvbi9jb25uZWN0aW9uSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQ29ubmVjdGlvbkRlZmluaXRpb24vY29ubmVjdGlvbkltcGxDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9Db25uZWN0aW9uRGVmaW5pdGlvbi9jb25maWdQcm9wZXJ0aWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpjYS5lY29yZSMvL0FkbWluT2JqZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqY2EuZWNvcmUjLy9BZG1pbk9iamVjdC9hZG1pbk9iamVjdEludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL0FkbWluT2JqZWN0L2FkbWluT2JqZWN0Q2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vQWRtaW5PYmplY3QvY29uZmlnUHJvcGVydGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9NZXNzYWdlTGlzdGVuZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL01lc3NhZ2VMaXN0ZW5lci9tZXNzYWdlTGlzdGVuZXJUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpjYS5lY29yZSMvL01lc3NhZ2VMaXN0ZW5lci9hY3RpdmF0aW9uU3BlYyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqY2EuZWNvcmUjLy9BY3RpdmF0aW9uU3BlYyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamNhLmVjb3JlIy8vQWN0aXZhdGlvblNwZWMvYWN0aXZhdGlvblNwZWNDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqY2EuZWNvcmUjLy9BY3RpdmF0aW9uU3BlYy9yZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamNhLmVjb3JlIy8vUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpjYS5lY29yZSMvL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamNhLmVjb3JlIy8vUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUvZGVzY3JpcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXZWJzZXJ2aWNlX2NsaWVudCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiCi0gICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIgotICAgICAgZWNvcmVQYWNrYWdlPSJ3c2NsaWVudC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NsaWVudC5lY29yZSMvL1NlcnZpY2VSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vU2VydmljZVJlZi9zZXJ2aWNlSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL3NlcnZpY2VSZWZOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL3dzZGxGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL2pheHJwY01hcHBpbmdGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vU2VydmljZVJlZi9wb3J0Q29tcG9uZW50UmVmcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2NsaWVudC5lY29yZSMvL1NlcnZpY2VSZWYvaGFuZGxlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9TZXJ2aWNlUmVmL3NlcnZpY2VRbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NsaWVudC5lY29yZSMvL1BvcnRDb21wb25lbnRSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY2xpZW50LmVjb3JlIy8vUG9ydENvbXBvbmVudFJlZi9wb3J0Q29tcG9uZW50TGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vUG9ydENvbXBvbmVudFJlZi9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NsaWVudC5lY29yZSMvL0hhbmRsZXIvaGFuZGxlck5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NsaWVudC5lY29yZSMvL0hhbmRsZXIvc29hcFJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyL3BvcnROYW1lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vSGFuZGxlci9oYW5kbGVyQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyL2luaXRQYXJhbXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9IYW5kbGVyL3NvYXBIZWFkZXJzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY2xpZW50LmVjb3JlIy8vV2ViU2VydmljZXNDbGllbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2NsaWVudC5lY29yZSMvL1dlYlNlcnZpY2VzQ2xpZW50L2NvbXBvbmVudFNjb3BlZFJlZnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NjbGllbnQuZWNvcmUjLy9XZWJTZXJ2aWNlc0NsaWVudC9zZXJ2aWNlUmVmcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NsaWVudC5lY29yZSMvL0NvbXBvbmVudFNjb3BlZFJlZnMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY2xpZW50LmVjb3JlIy8vQ29tcG9uZW50U2NvcGVkUmVmcy9jb21wb25lbnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY2xpZW50LmVjb3JlIy8vQ29tcG9uZW50U2NvcGVkUmVmcy9zZXJ2aWNlUmVmcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iSnNwIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9ImpzcC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqc3AuZWNvcmUjLy9KU1BDb25maWciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqc3AuZWNvcmUjLy9KU1BDb25maWcvdGFnTGlicyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqc3AuZWNvcmUjLy9KU1BDb25maWcvcHJvcGVydHlHcm91cHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ianNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cC91cmxQYXR0ZXJuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vSlNQUHJvcGVydHlHcm91cC9lbElnbm9yZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqc3AuZWNvcmUjLy9KU1BQcm9wZXJ0eUdyb3VwL3BhZ2VFbmNvZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL0pTUFByb3BlcnR5R3JvdXAvc2NyaXB0aW5nSW52YWxpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL0pTUFByb3BlcnR5R3JvdXAvaXNYTUwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqc3AuZWNvcmUjLy9KU1BQcm9wZXJ0eUdyb3VwL2luY2x1ZGVQcmVsdWRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL0pTUFByb3BlcnR5R3JvdXAvaW5jbHVkZUNvZGFzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpzcC5lY29yZSMvL1RhZ0xpYlJlZlR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpzcC5lY29yZSMvL1RhZ0xpYlJlZlR5cGUvdGFnbGliVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUganNwLmVjb3JlIy8vVGFnTGliUmVmVHlwZS90YWdsaWJMb2NhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV3Njb21tb24iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIiB1dGlsaXR5UGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwudXRpbCIgZWNvcmVQYWNrYWdlPSJ3c2NvbW1vbi5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NvbW1vbi5lY29yZSMvL0luaXRQYXJhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3Njb21tb24uZWNvcmUjLy9Jbml0UGFyYW0vcGFyYW1OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3Njb21tb24uZWNvcmUjLy9Jbml0UGFyYW0vcGFyYW1WYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzY29tbW9uLmVjb3JlIy8vSW5pdFBhcmFtL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzY29tbW9uLmVjb3JlIy8vSW5pdFBhcmFtL2Rlc2NyaXB0aW9uVHlwZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3Njb21tb24uZWNvcmUjLy9TT0FQSGVhZGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3Njb21tb24uZWNvcmUjLy9TT0FQUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3Njb21tb24uZWNvcmUjLy9TT0FQUm9sZS9zb2FwUm9sZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2NvbW1vbi5lY29yZSMvL1BvcnROYW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2NvbW1vbi5lY29yZSMvL1BvcnROYW1lL3BvcnROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25UeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3Njb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZVR5cGUiLz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV3NkZCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9IndzZGQuZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1dlYlNlcnZpY2VzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VzL3dlYlNlcnZpY2VEZXNjcmlwdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi9qYXhycGNNYXBwaW5nRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vd2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vd3NkbEZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL3NtYWxsSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vbGFyZ2VJY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9XZWJTZXJ2aWNlRGVzY3JpcHRpb24vZGlzcGxheU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi9wb3J0Q29tcG9uZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL2Rlc2NyaXB0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL2Rpc3BsYXlOYW1lVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZURlc2NyaXB0aW9uL2ljb25UeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9wb3J0Q29tcG9uZW50TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L3NlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L3NtYWxsSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2xhcmdlSWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvZGlzcGxheU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvd3NkbFBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvc2VydmljZUltcGxCZWFuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2hhbmRsZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2Rlc2NyaXB0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9kaXNwbGF5TmFtZVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvaWNvblR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1dTRExQb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL1NlcnZpY2VJbXBsQmVhbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9TZXJ2aWNlSW1wbEJlYW4vZUVKQkxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1NlcnZpY2VJbXBsQmVhbi9lU2VydmxldExpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1NlcnZpY2VJbXBsQmVhbi9iZWFuTGluayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vU2VydmxldExpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9TZXJ2bGV0TGluay9zZXJ2bGV0TGluayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vRUpCTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL0VKQkxpbmsvZWpiTGluayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vSGFuZGxlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL0hhbmRsZXIvaGFuZGxlck5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vSGFuZGxlci9oYW5kbGVyQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL0hhbmRsZXIvaW5pdFBhcmFtcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vSGFuZGxlci9zb2FwSGVhZGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vSGFuZGxlci9zb2FwUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkZC5lY29yZSMvL0JlYW5MaW5rIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pheHJwY21hcC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qYXhycGNtYXAuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YmIyZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pheHJwY21hcC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJqYXhycGNtYXAiCi0gICAgbnNVUkk9ImpheHJwY21hcC54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVdTRExNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgbWFwcGluZyB0byBhIGtub3duIFdTREwgZG9jdW1lbnQuSXQgY29udGFpbnMgdGhlIG1hcHBpbmcgYmV0d2VlbiBwYWNrYWdlIG5hbWVzIGFuZCBYTUwgbmFtZXNwYWNlcywgJiN4RDsmI3hBO1dTREwgcm9vdCB0eXBlcyBhbmQgSmF2YSBhcnRpZmFjdHMsIGFuZCB0aGUgc2V0IG9mIG1hcHBpbmdzIGZvciBzZXJ2aWNlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFja2FnZU1hcHBpbmdzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BhY2thZ2VNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXZhWE1MVHlwZU1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFYTUxUeXBlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhjZXB0aW9uTWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXhjZXB0aW9uTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlTWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSW50ZXJmYWNlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZU1hcHBpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwYWNrYWdlLW1hcHBpbmcgaW5kaWNhdGVzIHRoZSBtYXBwaW5nIGJldHdlZW4gamF2YS1wYWNrYWdlLW5hbWUgYW5kIFhNTCBuYW1lc3BhY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwYWNrYWdlLXR5cGUgaW5kaWNhdGVzIHRoZSBKYXZhIHBhY2thZ2UgbmFtZS4gSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogcGFja2FnZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhWE1MVHlwZU1hcHBpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqYXZhLXhtbC10eXBlLW1hcHBpbmcgZWxlbWVudCBjb250YWlucyBhIGNsYXNzLXR5cGUgdGhhdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MsIFFOYW1lIG9mIHRoZSBYTUwgcm9vdCB0eXBlLCB0aGUgV1NETCB0eXBlIHNjb3BlIHRoZSBRTmFtZSBhcHBsaWVzIHRvIGFuZCB0aGUgc2V0IG9mIHZhcmlhYmxlICYjeEQ7JiN4QTttYXBwaW5ncyBmb3IgZWFjaCBwdWJsaWMgdmFyaWFibGUgd2l0aGluIHRoZSBKYXZhIGNsYXNzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNsYXNzLXR5cGUgZWxlbWVudCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGNsYXNzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFuYW1lU2NvcGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcW5hbWUtc2NvcGUgZWxlbWVudHMgc2NvcGVzIHRoZSByZWZlcmVuY2Ugb2YgYSBRTmFtZSB0byB0aGUgV1NETCBlbGVtZW50IHR5cGUgaXQgYXBwbGllcyB0by4gVGhlIHZhbHVlIG9mIHFuYW1lLXNjb3BlIG1heSBiZSBzaW1wbGVUeXBlLCBjb21wbGV4VHlwZSwgb3IgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbm9ueW1vdXNUeXBlUW5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9vdFR5cGVRbmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jvb3RUeXBlUW5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmxlTWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFyaWFibGVNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGNlcHRpb25NYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhjZXB0aW9uLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uIHR5cGVzIGFuZCB0aGUgd3NkbCBmYXVsdHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUmI3hEOyYjeEE7bWFwcGluZyBiZXR3ZWVuIGEgbWV0aG9kIGFuZCBhbiBvcGVyYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhlIG1hcHBpbmcgY29udGV4dC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjZXB0aW9uVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGNlcHRpb24tdHlwZSBlbGVtZW50IGRlZmluZXMgSmF2YSB0eXBlIG9mIHRoZSBleGNlcHRpb24uIEl0IG1heSBiZSBhIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogZXhjZXB0aW9uLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbE1lc3NhZ2VQYXJ0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsTWVzc2FnZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dTRExNZXNzYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIgotICAgICAgICBlVHlwZT0iIy8vQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmljZUludGVyZmFjZU1hcHBpbmciIGVTdXBlclR5cGVzPSIjLy9JbnRlcmZhY2VNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgaG93IGEgSmF2YSB0eXBlIGZvciB0aGUgc2VydmljZSBpbnRlcmZhY2UgbWFwcyB0byBhIFdTREwgc2VydmljZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJ2aWNlSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIGZvciB0aGUgc2VydmljZS4gRm9yIHN0YXRpYyBzZXJ2aWNlcywgaXQgaXMgamF2YXgueG1sLnJwYy5TZXJ2aWNlIGludGVyZmFjZS4gRm9yIGdlbmVyYXRlZCBzZXJ2aWNlLCBpdCB3b3VsZCBiZSB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsU2VydmljZU5hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMU2VydmljZU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvcnRNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qb3J0TWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIgZVN1cGVyVHlwZXM9IiMvL0ludGVyZmFjZU1hcHBpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIGRlZmluZXMgYSB0dXBsZSYjeEQ7JiN4QTt0byBzcGVjaWZ5IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBXU0RMIHBvcnQgdHlwZXMgYW5kIFdTREwgYmluZGluZ3MuJiN4RDsmI3hBOyYjeEQ7JiN4QTtBbiBpbnRlcmZhY2UgbWF5IGJlIG1hcHBlZCB0byBhIHBvcnQtdHlwZSBhbmQgYmluZGluZyBtdWx0aXBsZSB0aW1lcy4gVGhpcyBoYXBwZW5zIHJhcmVseS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBmb3IgdGhlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsUG9ydFR5cGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMUG9ydFR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxCaW5kaW5nIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV1NETEJpbmRpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvb3RUeXBlUW5hbWUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJvb3QtdHlwZS1xbmFtZSBpZGVudGlmaWVzIHRoZSBXU0RMIFFOYW1lIG9mIGFuIFhNTCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmxlTWFwcGluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhYmxlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGEgSmF2YSBjbGFzcyBkYXRhIG1lbWJlciBvciBKYXZhQmVhbnMgcHJvcGVydHkgdG8gYW4gWE1MIGVsZW1lbnQgbmFtZSBvZiBhbiBYTUwgcm9vdCB0eXBlLiBJZiB0aGUgZGF0YS1tZW1iZXIgZWxlbWVudCBpcyBwcmVzZW50LCB0aGUgSmF2YSB2YXJpYWJsZSBuYW1lIGlzIGEgcHVibGljIGRhdGEgbWVtYmVyLiAgSWYgZGF0YS1tZW1iZXImI3hEOyYjeEE7aXMgbm90IHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBKYXZhQmVhbnMgcHJvcGVydHkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YVZhcmlhYmxlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqYXZhLXZhcmlhYmxlLW5hbWUgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIHB1YmxpYyBkYXRhIG1lbWJlciBvciAgSmF2YUJlYW5zIHByb3BlcnR5IHdpdGhpbiBhIEphdmEgY2xhc3MuICYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogdmFyaWFibGUtbWFwcGluZyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieG1sRWxlbWVudE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgeG1sLWVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBXU0RMIGVsZW1lbnQgd2l0aGluIGEgcm9vdCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogdmFyaWFibGUtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhTWVtYmVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4bWxBdHRyaWJ1dGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhtbFdpbGRjYXJkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMTWVzc2FnZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd3NkbC1tZXNzYWdlICBlbGVtZW50IGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgYnkgYSBRTkFNRS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nLCB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIgZWxlbWVudCBkZWZpbmVzIHRoZSBvcmRlciB0aGF0IGNvbXBsZXhUeXBlIGVsZW1lbnQgdmFsdWVzIGFyZSBhcHBsaWVkIHRvIGEgSmF2YSBleGNlcHRpb24gY29uc3RydWN0b3IuIEVsZW1lbnQgbmFtZXMgYXJlIHNwZWNpZmllZCBmb3IgZWFjaCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgZWxlbWVudCBuYW1lcyBvZiBpbmhlcml0ZWQgdHlwZXMgaWYgbmVjZXNzYXJ5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogZXhjZXB0aW9uLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudE5hbWVzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VsZW1lbnROYW1lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50TmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIG5hbWUgb2YgYSBjb21wbGV4VHlwZSBlbGVtZW50IG5hbWUgYXR0cmlidXRlIHZhbHVlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETFNlcnZpY2VOYW1lIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vUU5hbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3c2RsLXNlcnZpY2UtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgc2VydmljZSBuYW1lIGJ5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIHNlcnZpY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcnRNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1tYXBwaW5nIGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgdGhlIFdTREwgcG9ydCBuYW1lIGF0dHJpYnV0ZSB0byB0aGUgSmF2YSBuYW1lIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QgZ2V0Jmx0O2phdmEtbmFtZT4uJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvcnQtbmFtZSBpcyB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIGEgbmFtZSBhdHRyaWJ1dGUgb2YgYSBXU0RMIHBvcnQgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHBvcnQtbWFwcGluZyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YVBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGphdmEtcG9ydC1uYW1lIGVsZW1lbnQgaXMgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHBvcnQgbmFtZSBpbiBKYXZhLiAgSXQgaXMgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBHZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UgbWV0aG9kJiN4RDsmI3hBO2dldCZsdDtqYXZhLXBvcnQtbmFtZT4uJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBwb3J0LW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETFBvcnRUeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vUU5hbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3c2RsLXBvcnQtdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgcG9ydCB0eXBlJiN4RDsmI3hBO2J5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIHBvcnQgdHlwZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETEJpbmRpbmciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtYmluZGluZyBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgYmluZGluZyYjeEQ7JiN4QTtieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBiaW5kaW5nLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgSmF2YSBtZXRob2RzIHRvIG9wZXJhdGlvbnMgKHdoaWNoIGFyZSBub3QgdW5pcXVlbHkgcXVhbGlmaWVkIGJ5IHFuYW1lcykuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgd3NkbC1vcGVyYXRpb24gc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgcG9ydFR5cGUgYW5kIGJpbmRpbmcgaW4gd2hpY2ggdGhpcyBkZWZpbml0aW9uIGlzIGVtYmVkZGVkIHdpdGhpbi4gU2VlIHRoZSBkZWZpbml0aW9ucyBmb3Igc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBhbmQgJiN4RDsmI3hBO3NlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcgdG8gYWNxdWlyZSB0aGUgcHJvcGVyIGNvbnRleHQuIFRoZSB3cmFwcGVkLWVsZW1lbnQgaW5kaWNhdG9yIHNob3VsZCBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIGEgV1NETCBtZXNzYWdlIHdyYXBzIGFuIGVsZW1lbnQgdHlwZS4gIFRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIGlzIG5vdCBzcGVjaWZpZWQgZm9yIG9uZS13YXkgb3BlcmF0aW9ucy4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YU1ldGhvZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgamF2YS1tZXRob2QtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIG5hbWUgb2YgYSBKYXZhIG1ldGhvZCB3aXRoaW4gYW4gaW50ZXJmYWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsT3BlcmF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdzZGwtb3BlcmF0aW9uIGVsZW1lbnQgZGVmaW5lcyBhbiBvcGVyYXRpb24gd2l0aGluIGEgV1NETCBkb2N1bWVudC4gSXQgbXVzdCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSBwb3J0IHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndyYXBwZWRFbGVtZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxSZXR1cm5WYWx1ZU1hcHBpbmciCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMT3BlcmF0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbE9wZXJhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYXJhbVBhcnRzTWFwcGluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgSmF2YSBtZXRob2QgcGFyYW1ldGVycyBhbmQgYSB3c2RsLW1lc3NhZ2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtUG9zaXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFyYW0tcG9zaXRpb24gZWxlbWVudCBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gIEl0IG11c3QgYmUgYW4gaW50ZWdlciBzdGFydGluZyBmcm9tIDAuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJhbVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGFyYW0tdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gSXQgbXVzdCBiZSBkZWZpbmVkIGJ5IGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcy4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3c2RsTWVzc2FnZU1hcHBpbmciIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMTWVzc2FnZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExSZXR1cm5WYWx1ZU1hcHBpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nICBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUuIEl0IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIGFuZCBpdHMgcGFydC4gIFRvZ2V0aGVyIHRoZXkgZGVmaW5lIHVuaXF1ZWx5IHRoZSBtYXBwaW5nIGZvciBhIHNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZSBjb250ZXh0IGFyZSB1bmlxdWVseSAmI3hEOyYjeEE7aWRlbnRpZmllZCB3aXRoIHRoZWlyIG5hbWVzLiBUaGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBpcyBub3QmI3hEOyYjeEE7c3BlY2lmaWVkIGlmIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBvciBPVVQgcGFyYW1ldGVycy4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kUmV0dXJuVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWV0aG9kLXJldHVybi12YWx1ZSAgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3Igdm9pZCB0eXBlIGZvciB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxNZXNzYWdlUGFydE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbnRlcnByZXRhdGlvbiBvZiB0aGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBlbGVtZW50IGRlcGVuZHMgb24gd2hldGhlciBvciBub3Qgd3JhcHBlZC1lbGVtZW50IGhhcyBiZWVuIGRlZmluZWQgaW4gdGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcuICBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIHBhcnQuIEl0IHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZXIgd2l0aCByZXNwZWN0IHRvIGEgd3NkbC1tZXNzYWdlIGVsZW1lbnQuIElmIHdyYXBwZWQtZWxlbWVudCBpcyBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgcmVmZXJzIHRvIGFuIGVsZW1lbnQmI3hEOyYjeEE7bmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id3NkbE1lc3NhZ2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9XU0RMTWVzc2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETE1lc3NhZ2VNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd3NkbC1tZXNzYWdlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIHRvIGEgc3BlY2lmaWMgbWVzc2FnZSBhbmQgaXRzIHBhcnQuIFRvZ2V0aGVyIHRoZXkgZGVmaW5lIHVuaXF1ZWx5IHRoZSBtYXBwaW5nIGZvciBhIHNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZSBjb250ZXh0IGFyZSB1bmlxdWVseSAmI3hEOyYjeEE7aWRlbnRpZmllZCB3aXRoIHRoZWlyIG5hbWVzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHBhcmFtZXRlci1tb2RlIGlzIGRlZmluZWQgYnkgdGhlIG1hcHBpbmcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgbWFwcGluZyB3aWxsIGJlIElOLCBPVVQsIG9yIElOT1VULi4gIFRoZSBwcmVzZW5jZSBvZiB0aGUgc29hcC1oZWFkZXImI3hEOyYjeEE7ZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFyYW1ldGVyIGlzIG1hcHBlZCB0byBhIHNvYXAgaGVhZGVyIG9ubHkuIFdoZW4gYWJzZW50LCBpdCBtZWFucyB0aGF0IHRoZSB3c2RsLW1lc3NhZ2UgaXMgbWFwcGVkIHRvIGEgSmF2YSBwYXJhbWV0ZXIuIFRoZSBzb2FwIGhlYWRlcnMgYXJlIGludGVycHJldGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSYjeEQ7JiN4QTtwcm92aWRlZCBpbiB0aGUgbWFwcGluZy4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxNZXNzYWdlUGFydE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbnRlcnByZXRhdGlvbiBvZiB0aGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBlbGVtZW50IGRlcGVuZHMgb24gd2hldGhlciBvciBub3Qgd3JhcHBlZC1lbGVtZW50IGhhcyBiZWVuIGRlZmluZWQgaW4gdGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcuICBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIHBhcnQuIEl0IHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZXIgd2l0aCByZXNwZWN0IHRvIGEgd3NkbC1tZXNzYWdlIGVsZW1lbnQuIElmIHdyYXBwZWQtZWxlbWVudCBpcyBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgcmVmZXJzIHRvIGFuIGVsZW1lbnQmI3hEOyYjeEE7bmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1ldGVyTW9kZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwYXJhbWV0ZXItbW9kZSAgZWxlbWVudCBkZWZpbmVzIHRoZSBtb2RlIG9mIHRoZSBwYXJhbWV0ZXIuIEl0IGNhbiBoYXZlIG9ubHkgdGhyZWUgdmFsdWVzLCBJTiwgT1VULCBJTk9VVC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBIZWFkZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxNZXNzYWdlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV1NETE1lc3NhZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExNZXNzYWdlUGFydE5hbWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsTWVzc2FnZVBhcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkludGVyZmFjZU1hcHBpbmciLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvamNhLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pjYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlNGNkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvamNhLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImpjYSIKLSAgICBuc1VSST0iamNhLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGVsZW1lbnQgaW5jbHVkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiAtIHZlbmRvciBuYW1lLCB2ZXJzaW9uLCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gc3VwcG9ydGVkLCBpY29uIC0gIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXIuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZW5kb3JOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgdmVuZG9yLiYjeEQ7JiN4QTtFeGFtcGxlOiBXb21iYXQgQ29ycC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY1ZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3llciB0byBjb25maWd1cmUgdGhlIHJlc291cmNlIGFkYXB0ZXIgdG8gc3VwcG9ydCBkZXBsb3ltZW50IGFuZCBydW50aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlaXNUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCYjeEQ7JiN4QTt0aGlzIHJlc291cmNlIGFkYXB0ZXIuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIGEgc3RyaW5nLWJhc2VkIHZlcnNpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlci4mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGU6IDEuNSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaWNlbnNlIiBlVHlwZT0iIy8vTGljZW5zZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YmI3hEOyYjeEE7Y29ubmVjdGlvbiByZXN0cmljdGlvbnMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZUFkYXB0ZXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZUFkYXB0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlQWRhcHRlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mIGNsYXNzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZiB0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0IHByb3ZpZGVkLCBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcywgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBzdXBwb3J0ZWQgYW5kIGFkZGl0aW9uYWwmI3hEOyYjeEE7cmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtJZiB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVkIGFzIHBhcnQgb2YmI3hEOyYjeEE7cmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QmI3hEOyYjeEE7c3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcyBwYXJ0JiN4RDsmI3hBO29mIHNlY3VyaXR5IGNvbnRyYWN0LiBUaGUgYXBwbGljYXRpb24gc2VydmVyIGlnbm9yZXMgdGhlIHNlY3VyaXR5JiN4RDsmI3hBO3BhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzJiN4RDsmI3hBO1NwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZC1Db25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UmI3hEOyYjeEE7U3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNvbm5lY3Rpb25EZWZpbml0aW9ucy5jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyYjeEQ7JiN4QTtTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbm5lY3Rpb25JbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY29ubmVjdGlvbkRlZmluaXRpb25zLmNvbm5lY3Rpb25JbnRlcmZhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29ubmVjdGlvbkltcGxDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5jb25uZWN0aW9uRGVmaW5pdGlvbnMuY29ubmVjdGlvbkltcGxDbGFzcyYjeEQ7JiN4QTtTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRyYW5zYWN0aW9uU3VwcG9ydCIgZVR5cGU9IiMvL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIudHJhbnNhY3Rpb25TdXBwb3J0JiN4RDsmI3hBO1RoZSB0cmFuc2FjdGlvbi1zdXBwb3J0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZiB0cmFuc2FjdGlvbiYjeEQ7JiN4QTtzdXBwb3J0IHByb3ZpZGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiYjeEQ7JiN4QTtUaGUgdmFsdWUgb2YgdHJhbnNhY3Rpb24tc3VwcG9ydCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiYjeEQ7JiN4QTsgIE5vVHJhbnNhY3Rpb24mI3hEOyYjeEE7ICBMb2NhbFRyYW5zYWN0aW9uJiN4RDsmI3hBOyAgWEFUcmFuc2FjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIucmVhdXRoZW50aWNhdGlvblN1cHBvcnQmI3hEOyYjeEE7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC1Db25uZWN0aW9uIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gYW5kIG5vdCBmb3IgdGhlIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZUFkYXB0ZXJDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlJiN4RDsmI3hBOyAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyYjeEQ7JiN4QTsgICAgICAgIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuUmVzb3VyY2VBZGFwdGVyJiN4RDsmI3hBOyAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZiYjeEQ7JiN4QTsgICAgICAgIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3ImI3hEOyYjeEE7ICAgICAgICBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uJiN4RDsmI3hBOyAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN1cml0eVBlcm1pc3Npb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlY3VyaXR5UGVybWlzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXV0aGVudGljYXRpb25NZWNoYW5pc20iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmZpZ1Byb3BlcnRpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29uZmlnUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIgotICAgICAgICBlVHlwZT0iIy8vT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlJiN4RDsmI3hBOyAgICAgICAgdW5pcXVlIGluIHRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIuIE11bHRpcGxlIGNvbm5lY3Rpb24tZGVmaW5pdGlvbnMmI3hEOyYjeEE7ICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBjb25uZWN0aW9uZmFjdG9yeS10eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmJvdW5kUmVzb3VyY2VBZGFwdGVyIgotICAgICAgICBlVHlwZT0iIy8vSW5ib3VuZFJlc291cmNlQWRhcHRlciIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkbWluT2JqZWN0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9BZG1pbk9iamVjdCIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVzIGFuIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIE5vdGUgdGhhdCB0aGlzIHN1cHBvcnQgaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIHNwZWNpZmllcyBhbnkgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyByZXF1aXJlbWVudCBmb3IgdGhlIHN1cHBvcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QgYW5kIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4mI3hEOyYjeEE7JiN4RDsmI3hBO05vdGUgdGhhdCBCYXNpY1Bhc3N3b3JkIG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZSYjeEQ7JiN4QTtqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIGludGVyZmFjZS4mI3hEOyYjeEE7VGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUmI3hEOyYjeEE7amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiCi0gICAgICAgIGVUeXBlPSIjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCBTZWUgYXV0aGVudGljYXRpb25NZWNoYW5pc20mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSBzcGVjaWZpZXMgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOiYjeEQ7JiN4QTsgIC0gQmFzaWNQYXNzd29yZCYjeEQ7JiN4QTsgIC0gS2VyYnY1JiN4RDsmI3hBOyYjeEQ7JiN4QTtBbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUmI3hEOyYjeEE7Q29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlZGVudGlhbEludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydCBvZiB0aGUgc2VjdXJpdHkgY29udHJhY3QuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgcG9zc2libGUgdmFsdWVzIGFyZTomI3hEOyYjeEE7ICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCYjeEQ7JiN4QTsgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1c3RvbUF1dGhNZWNoVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQmI3hEOyYjeEE7VGhpcyBpcyBhbiBpbnRlcm5hbCB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBBdGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSB3aGVuIGl0IGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIEJhc2ljUGFzc3dvcmQgb3IgS2VyYnY1LiAgQXV0aGVudGljYXRpb25NZWNhbmlzbVR5cGUgaXMgc2V0IHRvICdDdXN0b20nIGluIHRob3NlIGNhc2VzLiAgVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHJ1bnRpbWUuICBJdCBpcyBvbmx5IHVzZWQgYnkgdGhlIHdyaXRlciB0byB3cml0ZSBiYWNrIG91dCB0aGUgY3VzdG9tIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBzdHJpbmcgaW4gdGhlIGNhc2Ugb2YgY3VzdG9tIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSdzLiAgJiN4RDsmI3hBO1RoaXMgdmFyaWFibGUgaXMgaW50ZXJuYWwsIHVzZWQgb25seSBieSB0aGUgcmVhZGVyL3dyaXRlciBjbGFzc2VzLCBhbmQgY2FuIGNoYW5nZSBvciBkaXNhcHBlYXIgd2l0aG91dCBub3RpY2UuICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO0Jhc2ljUGFzc3dvcmQ9MCYjeEQ7JiN4QTtLZXJidjU9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQmFzaWNQYXNzd29yZCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iS2VyYnY1IiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25maWdQcm9wZXJ0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbmZpZyBwcm9wZXJ0eSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlJiN4RDsmI3hBO2NvbmZpZ3VyYXRpb24gcHJvcGVydHkgZm9yIGEgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7RWFjaCBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UgY3JlYXRlcyBjb25uZWN0aW9ucyB0byBhIHNwZWNpZmljIEVJUyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIG9uIHRoZSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuIFRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIG9ubHkgb25jZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBldmVuIHRob3VnaCBhIHJlc291cmNlIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIG11bHRpcGxlIE1hbmFnZWRDb25ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlcyAodGhhdCBjcmVhdGUgY29ubmVjdGlvbnMgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBFSVMpLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLCB0eXBlJiN4RDsmI3hBO2FuZCBhbiBvcHRpb25hbCB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gSWYgdGhlIHJlc291cmNlJiN4RDsmI3hBO2FkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4gdGhlIGRlcGxveWVyIGlzJiN4RDsmI3hBO3Jlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7QW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkIHByb3BlcnRpZXMgYWxsIG9mIHR5cGUgamF2YS5sYW5nLlN0cmluZy4gVGhlc2UgYXJlIGFzIGZvbGxvd3M6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgIFNlcnZlck5hbWUmI3hEOyYjeEE7ICAgICBQb3J0TnVtYmVyJiN4RDsmI3hBOyAgICAgVXNlck5hbWUmI3hEOyYjeEE7ICAgICBQYXNzd29yZCYjeEQ7JiN4QTsgICAgIENvbm5lY3Rpb25VUkwmI3hEOyYjeEE7JiN4RDsmI3hBO0EgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciBjYW4gZXh0ZW5kIHRoaXMgcHJvcGVydHkgc2V0IHRvIGluY2x1ZGUgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzIHVuZGVybHlpbmcgRUlTLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhcyByZXF1aXJlZCBieSBNYW5hZ2VkQ29ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBjb25maWctcHJvcGVydHktdHlwZTomI3hEOyYjeEE7ICAgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCYjeEQ7JiN4QTsgICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LCYjeEQ7JiN4QTsgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZSYjeEQ7JiN4QTsgICAgICAgIG9mIGEgY29uZmlndXJhdGlvbiBlbnRyeS4gTm90ZSwgaXQgaXMgcG9zc2libGUgZm9yIGEmI3hEOyYjeEE7ICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGRlcGxveWVyIHRvIG92ZXJyaWRlIHRoaXMmI3hEOyYjeEE7ICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGR1cmluZyBkZXBsb3ltZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsgICAgICAgICZsdDtjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyJmx0Oy9jb25maWctcHJvcGVydHktdmFsdWU+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN1cml0eVBlcm1pc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyBhIHNlY3VyaXR5IHBlcm1pc3Npb24gdGhhdCBpcyByZXF1aXJlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlciBjb2RlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXJlIG9uZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgcmVxdWlyZWQgYnkgdGhlIGRlZmF1bHQgcGVybWlzc2lvbiBzZXQgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3Igc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljIHJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbiBzZWN1cml0eSBwZXJtaXNzaW9uLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmljYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBwZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiBiYXNlZCBvbiB0aGUgU2VjdXJpdHkgcG9saWN5IGZpbGUgc3ludGF4LiAmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMaWNlbnNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBTcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiBjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQgUmVwbGFjZWQgd2l0aCBkZXNjcmlwdGlvbnMmI3hEOyYjeEE7VGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGxpY2Vuc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcXVpcmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTm9UcmFuc2FjdGlvbiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTG9jYWxUcmFuc2FjdGlvbiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlhBVHJhbnNhY3Rpb24iIHZhbHVlPSIyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24mI3hEOyYjeEE7YWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uJiN4RDsmI3hBO3NwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciYjeEQ7JiN4QTtsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBtZXNzYWdlYWRhcHRlciBlbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlQWRhcHRlciIgZVR5cGU9IiMvL01lc3NhZ2VBZGFwdGVyIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXNzYWdlbGlzdGVuZXItdHlwZSBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSYjeEQ7JiN4QTsgICAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycyYjeEQ7JiN4QTsgICAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIG1lc3NhZ2VsaXN0ZW5lci10eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRib3VuZFJlc291cmNlQWRhcHRlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQmI3hEOyYjeEE7YW4gb3V0Ym91bmQgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5JiN4RDsmI3hBO3F1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZiYjeEQ7JiN4QTt0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzIGZvciYjeEQ7JiN4QTtjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQmI3hEOyYjeEE7cHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkJiN4RDsmI3hBO2FuZCBhZGRpdGlvbmFsIHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mJiN4RDsmI3hBO3Jlc291cmNlIGFkYXB0ZXIgZWxlbWVudCB0aGVuIHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90JiN4RDsmI3hBO3N1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMmI3hEOyYjeEE7cGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzJiN4RDsmI3hBO3RoZSBzZWN1cml0eSBwYXJ0IG9mIHRoZSBzeXN0ZW0gY29udHJhY3RzIGluIHRoaXMgY2FzZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhdXRoZW50aWNhdGlvblN1cHBvcnQiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcyYjeEQ7JiN4QTsgICAgICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMmI3hEOyYjeEE7ICAgICAgICByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLSBDb25uZWN0aW9uJiN4RDsmI3hBOyAgICAgICAgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUmI3hEOyYjeEE7ICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZSYjeEQ7JiN4QTsgICAgICAgIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGlzIGVsZW1lbnQgbXVzdCBoYXZlJiN4RDsmI3hBOyAgICAgICAgZWl0aGVyIGEgJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDtmYWxzZSZxdW90OyB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNhY3Rpb25TdXBwb3J0IiBlVHlwZT0iIy8vVHJhbnNhY3Rpb25TdXBwb3J0S2luZCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25uZWN0aW9uRGVmaW5pdGlvbnMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29ubmVjdGlvbkRlZmluaXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZUFkYXB0ZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlJiN4RDsmI3hBO21lc3NhZ2luZyBjYXBhYmlsaXRpZXMgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMmI3hEOyYjeEE7Y29udGFpbnMgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSYjeEQ7JiN4QTtyZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlJiN4RDsmI3hBO21lc3NhZ2VsaXN0ZW5lciBlbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlTGlzdGVuZXJzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01lc3NhZ2VMaXN0ZW5lciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29ubmVjdGlvbkRlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uJiN4RDsmI3hBO2ludGVyZmFjZXMgYW5kIGNsYXNzZXMgcGVydGFpbmluZyB0byBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbiYjeEQ7JiN4QTt0eXBlLiBUaGlzIGFsc28gaW5jbHVkZXMgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yJiN4RDsmI3hBO01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0JiN4RDsmI3hBO29mIHRoaXMgc2V0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBzcGVjaWZpZXMmI3hEOyYjeEE7ICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCYjeEQ7JiN4QTsgICAgICAgIGltcGxlbWVudHMgdGhlJiN4RDsmI3hBOyAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuJiN4RDsmI3hBOyAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UmI3hEOyYjeEE7ICAgICAgICBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSYjeEQ7JiN4QTsgICAgICAgIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzJiN4RDsmI3hBOyAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7ICAgICAgICAmbHQ7bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPiYjeEQ7JiN4QTsgICAgICAgICAgICBjb20ud29tYmF0Lk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUltcGwmI3hEOyYjeEE7ICAgICAgICAmbHQ7L21hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzJiN4RDsmI3hBOyAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSYjeEQ7JiN4QTsgICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyAgICAgICAgJmx0O2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5JiN4RDsmI3hBOyAgICAgICAgJmx0Oy9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIE9SJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICZsdDtjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5JiN4RDsmI3hBOyAgICAgICAgJmx0Oy9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyBzcGVjaWZpZXMmI3hEOyYjeEE7ICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5JiN4RDsmI3hBOyAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXImI3hEOyYjeEE7ICAgICAgICBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgICZsdDtjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnlJbXBsJiN4RDsmI3hBOyAgICAgICAgJmx0Oy9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbm5lY3Rpb24taW50ZXJmYWNlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSYjeEQ7JiN4QTsgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQmI3hEOyYjeEE7ICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgICAgICZsdDtjb25uZWN0aW9uLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbiYjeEQ7JiN4QTsgICAgICAgICAgICAmbHQ7L2Nvbm5lY3Rpb24taW50ZXJmYWNlPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uSW1wbENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzc1R5cGUgc3BlY2lmaWVzIHRoZSBmdWxseSYjeEQ7JiN4QTsgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGNsYXNzIHRoYXQmI3hEOyYjeEE7ICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbiYjeEQ7JiN4QTsgICAgICAgIGludGVyZmFjZS4gIEl0IGlzIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24taW1wbC1jbGFzcyYjeEQ7JiN4QTsgICAgICAgIGVsZW1lbnRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAgICAgJmx0O2Nvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsJiN4RDsmI3hBOyAgICAgICAgICAgICZsdDsvY29ubmVjdGlvbi1pbXBsLWNsYXNzPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25maWdQcm9wZXJ0aWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBZG1pbk9iamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgYWRtaW5vYmplY3RUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhbiYjeEQ7JiN4QTthZG1pbmlzdGVyZWQgb2JqZWN0LiAgQWRtaW5pc3RlcmVkIG9iamVjdHMgYXJlIHNwZWNpZmljIHRvIGEmI3hEOyYjeEE7bWVzc2FnaW5nIHN0eWxlIG9yIG1lc3NhZ2UgcHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zJiN4RDsmI3hBO2luZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSYjeEQ7JiN4QTthbiBhZG1pbmlzdGVyZWQgb2JqZWN0LCBpdHMgSmF2YSBjbGFzcyBuYW1lIGFuZCBpdHMmI3hEOyYjeEE7Y29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZG1pbk9iamVjdEludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWludGVyZmFjZSBzcGVjaWZpZXMgdGhlJiN4RDsmI3hBOyAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiB0aGUmI3hEOyYjeEE7ICAgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7ICAgICAgICAgICZsdDthZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uJiN4RDsmI3hBOyAgICAgICAgICAmbHQ7L2FkbWlub2JqZWN0LWludGVyZmFjZT4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRtaW5PYmplY3RDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkmI3hEOyYjeEE7ICAgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyAgICAgICAgICAgICZsdDthZG1pbm9iamVjdC1jbGFzcz5jb20ud29tYmF0LkRlc3RpbmF0aW9uSW1wbCYjeEQ7JiN4QTsgICAgICAgICAgICAmbHQ7L2FkbWlub2JqZWN0LWNsYXNzPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25maWdQcm9wZXJ0aWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXNzYWdlTGlzdGVuZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7VGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEmI3hEOyYjeEE7c3BlY2lmaWMgbWVzc2FnZSBsaXN0ZW5lciBzdXBwb3J0ZWQgYnkgdGhlIG1lc3NhZ2luZyYjeEQ7JiN4QTtyZXNvdXJjZSBhZGFwdGVyLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlJiN4RDsmI3hBO29mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbiYjeEQ7JiN4QTtzcGVjaWZpY2F0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXNzYWdlTGlzdGVuZXJUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVsZW1lbnQgbWVzc2FnZWxpc3RlbmVyLXR5cGUgc3BlY2lmaWVzIHRoZSBmdWxseSYjeEQ7JiN4QTsgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgYSBtZXNzYWdlJiN4RDsmI3hBOyAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICBFeGFtcGxlOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgICAgICAgICZsdDttZXNzYWdlbGlzdGVuZXItdHlwZT5qYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyJiN4RDsmI3hBOyAgICAgICAgICAmbHQ7L21lc3NhZ2VsaXN0ZW5lci10eXBlPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhY3RpdmF0aW9uU3BlYyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0FjdGl2YXRpb25TcGVjIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3RpdmF0aW9uU3BlYyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgYWN0aXZhdGlvbnNwZWNUeXBlIHNwZWNpZmllcyBhbiBhY3RpdmF0aW9uJiN4RDsmI3hBO3NwZWNpZmljYXRpb24uICBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkJiN4RDsmI3hBO0phdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mJiN4RDsmI3hBO3JlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2YXRpb25TcGVjQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWxlbWVudCBhY3RpdmF0aW9uc3BlYy1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5JiN4RDsmI3hBOyAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZhdGlvbiYjeEQ7JiN4QTsgICAgICAgIHNwZWNpZmljYXRpb24gY2xhc3MuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlJiN4RDsmI3hBOyAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLkFjdGl2YXRpb25TcGVjIGludGVyZmFjZS4gVGhlJiN4RDsmI3hBOyAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhJiN4RDsmI3hBOyAgICAgICAgSmF2YUJlYW4uJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIEV4YW1wbGU6JiN4RDsmI3hBOyAgICAgICAgICAgICZsdDthY3RpdmF0aW9uc3BlYy1jbGFzcz5jb20ud29tYmF0LkFjdGl2YXRpb25TcGVjSW1wbCYjeEQ7JiN4QTsgICAgICAgICAgICAmbHQ7L2FjdGl2YXRpb25zcGVjLWNsYXNzPiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSByZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24mI3hEOyYjeEE7b2YgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEmI3hEOyYjeEE7cmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lLiBJdCBpcyB1c2VkJiN4RDsmI3hBO2J5IHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSBlbGVtZW50cy4mI3hEOyYjeEE7JiN4RDsmI3hBO0V4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsmbHQ7cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PkRlc3RpbmF0aW9uJmx0Oy9yZXF1aXJlZC1jb25maWctcHJvcGVydHk+Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pzcC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC9qc3AuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjFiMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2pzcC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImpzcCIKLSAgICBuc1VSST0ianNwLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSlNQQ29uZmlnIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40JiN4RDsmI3hBO1RoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24mI3hEOyYjeEE7aW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcyYjeEQ7JiN4QTt0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWdMaWJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RhZ0xpYlJlZlR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5R3JvdXBzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0pTUFByb3BlcnR5R3JvdXAiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpTUFByb3BlcnR5R3JvdXAiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUganNwLXByb3BlcnR5LWdyb3VwVHlwZSBpcyB1c2VkIHRvIGdyb3VwIGEgbnVtYmVyIG9mJiN4RDsmI3hBO2ZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4mI3hEOyYjeEE7QWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gVGhlJiN4RDsmI3hBO2ZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDomI3hEOyYjeEE7JiN4RDsmI3hBOy0gQ29udHJvbCBlbmFibGluZyBvZiBFTCBldmFsdWF0aW9uLiAtIENvbnRyb2wgZW5hYmxpbmcmI3hEOyYjeEE7b2YgU2NyaXB0aW5nIGVsZW1lbnRzLiAtIEluZGljYXRlIHBhZ2VFbmNvZGluZyYjeEQ7JiN4QTtpbmZvcm1hdGlvbi4gLSBJbmRpY2F0aW5nIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCYjeEQ7JiN4QTtkb2N1bWVudCAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmxQYXR0ZXJuIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbElnbm9yZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQmI3hEOyYjeEE7JiN4OTtwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gQnkgZGVmYXVsdCwmI3hEOyYjeEE7JiN4OTt0aGUgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWImI3hEOyYjeEE7JiN4OTtBcHBsaWNhdGlvbnMgdXNpbmcgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyJiN4RDsmI3hBOyYjeDk7d2ViLnhtbCwgYW5kIGRpc2FibGVkIG90aGVyd2lzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFnZUVuY29kaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbGlkIHZhbHVlcyBvZiBwYWdlLWVuY29kaW5nIGFyZSB0aG9zZSBvZiYjeEQ7JiN4QTsmI3g5O3RoZSBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuIEl0IGlzIGEmI3hEOyYjeEE7JiN4OTt0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50JiN4RDsmI3hBOyYjeDk7ZW5jb2RpbmdzIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSYjeEQ7JiN4QTsmI3g5O3BhZ2UgZGlyZWN0aXZlIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQJiN4RDsmI3hBOyYjeDk7Y29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBwYWdlLiBJdCBpcyYjeEQ7JiN4QTsmI3g5O2Fsc28gYSB0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50JiN4RDsmI3hBOyYjeDk7ZW5jb2RpbmdzIGluIHRoZSBwcm9sb2cgb2YgYSBkb2N1bWVudCBpbiBYTUwmI3hEOyYjeEE7JiN4OTtzeW50YXggYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudCYjeEQ7JiN4QTsmI3g5O21hdGNoaW5nIHRoZSBkb2N1bWVudC4gSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUmI3hEOyYjeEE7JiN4OTtzYW1lIGVuY29kaW5nIHRocm91Z2ggbXVsaXRwbGUgbWVjaGFuaXNtcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NyaXB0aW5nSW52YWxpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYSYjeEQ7JiN4QTsmI3g5O2dyb3VwIG9mIEpTUCBwYWdlcy4gQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzJiN4RDsmI3hBOyYjeDk7ZW5hYmxlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNYTUwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzJiN4RDsmI3hBOyYjeDk7dGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsJiN4RDsmI3hBOyYjeDk7YW5kIHRodXMgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBYTUwgZG9jdW1lbnRzLiYjeEQ7JiN4QTsmI3g5O0lmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdCBiZSYjeEQ7JiN4QTsmI3g5O0pTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyIHByb3BlcnR5JiN4RDsmI3hBOyYjeDk7Z3JvdXAgdGhhdCBpbmRpY2F0ZXMgb3RoZXJ3aXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbmNsdWRlUHJlbHVkZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEmI3hEOyYjeEE7JiN4OTtjb250ZXh0LXJlbGF0aXZlIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8mI3hEOyYjeEE7JiN4OTthbiBlbGVtZW50IGluIHRoZSBXZWIgQXBwbGljYXRpb24uIFdoZW4gdGhlJiN4RDsmI3hBOyYjeDk7ZWxlbWVudCBpcyBwcmVzZW50LCB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlJiN4RDsmI3hBOyYjeDk7YXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMgaW4gYW4gaW5jbHVkZSYjeEQ7JiN4QTsmI3g5O2RpcmVjdGl2ZSkgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIEpTUCBwYWdlIGluJiN4RDsmI3hBOyYjeDk7dGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluY2x1ZGVDb2RhcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlJiN4RDsmI3hBOyYjeDk7cGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZSYjeEQ7JiN4QTsmI3g5O1dlYiBBcHBsaWNhdGlvbi4gV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LCYjeEQ7JiN4QTsmI3g5O3RoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCYjeEQ7JiN4QTsmI3g5OyhhcyBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoJiN4RDsmI3hBOyYjeDk7SlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhZ0xpYlJlZlR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQmI3hEOyYjeEE7QSB0YWdsaWIgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhIHRhZyYjeEQ7JiN4QTtsaWJyYXJ5IHRoYXQgaXMgdXNlZCBieSBhIEpTUCBwYWdlIHdpdGhpbiB0aGUgV2ViJiN4RDsmI3hBO0FwcGxpY2F0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWdsaWJVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEmI3hEOyYjeEE7ICAgICAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keSYjeEQ7JiN4QTsgICAgICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbiYjeEQ7JiN4QTsgICAgICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4mI3hEOyYjeEE7ICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlJiN4RDsmI3hBOyAgICAgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWdsaWJMb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9InRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24mI3hEOyYjeEE7ICAgICAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViJiN4RDsmI3hBOyAgICAgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5JiN4RDsmI3hBOyAgICAgICAgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvdGFnbGliLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3RhZ2xpYi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2MDVkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvdGFnbGliLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InRhZ2xpYiIKLSAgICBuc1VSST0idGFnbGliLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFnTGliIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7ZGVzY3JpcHRpb24gICAgIGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAmcXVvdDt1c2UmcXVvdDsgb2YgdGhpcyB0YWdsaWIsJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZSYjeEQ7JiN4QTsmI3hEOyYjeEE7ZGlzcGxheS1uYW1lICAgIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBieSB0b29scyYjeEQ7JiN4QTsmI3hEOyYjeEE7aWNvbiAgICAgICAgICAgIG9wdGlvbmFsIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scyYjeEQ7JiN4QTsmI3hEOyYjeEE7dGxpYi12ZXJzaW9uICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7c2hvcnQtbmFtZSAgICAgIGEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICB1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4JiN4RDsmI3hBOyAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcyYjeEQ7JiN4QTsmI3hEOyYjeEE7dXJpICAgICAgICAgICAgIGEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliJiN4RDsmI3hBOyYjeEQ7JiN4QTt2YWxpZGF0b3IgICAgICAgb3B0aW9uYWwgVGFnTGlicmFyeVZhbGlkYXRvciBpbmZvcm1hdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7bGlzdGVuZXIgICAgICAgIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIHNwZWNpZmljYXRpb24mI3hEOyYjeEE7JiN4RDsmI3hBO3RhZyAgICAgICAgICAgICBvbmUgb3IgbW9yZSB0YWdzIGluIHRoZSB0YWcgbGlicmFyeSYjeEQ7JiN4QTsmI3hEOyYjeEE7dGFnLWZpbGUgICAgICAgIG9uZSBvciBtb3JlIHRhZyBmaWxlcyBpbiB0aGUgdGFnIGxpYnJhcnkmI3hEOyYjeEE7JiN4RDsmI3hBO2Z1bmN0aW9uICAgICAgICB6ZXJvIG9yIG1vcmUgRUwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgdGFnIGxpYnJhcnkmI3hEOyYjeEE7JiN4RDsmI3hBO3RhZ2xpYi1leHRlbnNpb24gemVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhJiN4RDsmI3hBOyYjeDk7JiN4OTtpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZ2xpYiwgZm9yIHRvb2wmI3hEOyYjeEE7JiN4OTsmI3g5O2NvbnN1bXB0aW9uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhZ0xpYlZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIG51bWJlciBvZiB0aGUgdGFnIGxpYnJhcnkgKGRld2V5IGRlY2ltYWwpLiYjeEQ7JiN4QTtAcmVnZXhwIFswLTldKnsgJnF1b3Q7LiZxdW90O1swLTldIH0wLi4zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImpzcFZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnIGxpYnJhcnkgcmVxdWlyZXMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpLiAgRGVmYXVsdCBpcyAxLjImI3hEOyYjeEE7QHJlZ2V4cCBbMC05XSp7ICZxdW90Oy4mcXVvdDtbMC05XSB9MC4uMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaG9ydE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHNob3J0LW5hbWUgZWxlbWVudCBpcyBhIG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzLiBEbyBub3QgdXNlIHdoaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzIG9yIHVuZGVyc2NvcmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgdXJpIGVsZW1lbnQgaXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZXhhY3Qgc2VtYW50aWNzIG9mIHRoaXMgdGFnbGlicmFyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFncyIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KU1BUYWciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkYXRvciIgZVR5cGU9IiMvL1ZhbGlkYXRvciIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imxpc3RlbmVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vTGlzdGVuZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZ1bmN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GdW5jdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhZ2xpYkV4dGVuc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGxkRXh0ZW5zaW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKU1BUYWciIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFnIGVsZW1lbnQgZGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeS4gVGhlIHRhZyBlbGVtZW50IGhhcyBvbmUgYXR0cmlidXRlLCBpZC4mI3hEOyYjeEE7VGhlIHRhZyBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6JiN4RDsmI3hBO25hbWUgLS0gVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZSYjeEQ7JiN4QTt0YWctY2xhc3MgLS0gVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZyBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnJiN4RDsmI3hBO3RlaS1jbGFzcyAtLSBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvJiN4RDsmI3hBO2JvZHktY29udGVudCAtLSBUaGUgYm9keSBjb250ZW50IHR5cGUmI3hEOyYjeEE7ZGlzcGxheS1uYW1lIC0tIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scyYjeEQ7JiN4QTtzbWFsbC1pY29uIC0tIE9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scyYjeEQ7JiN4QTtsYXJnZS1pY29uIC0tIE9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scyYjeEQ7JiN4QTtkZXNjcmlwdGlvbiAtLSBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24mI3hEOyYjeEE7dmFyaWFibGUgLS0gT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uJiN4RDsmI3hBO2F0dHJpYnV0ZSAtLSBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbiYjeEQ7JiN4QTtleGFtcGxlIC0tIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBhY3Rpb24uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib2R5Q29udGVudCIgZVR5cGU9IiMvL0JvZHlDb250ZW50VHlwZSIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5IGludGVuZGVkIGZvciB1c2UgYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scy5UaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6JiN4RDsmI3hBOyYjeEQ7JiN4QTt0YWdkZXBlbmRlbnQgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcgaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYSYjeDk7JiN4OTtkaWZmZXJlbnQgJnF1b3Q7bGFuZ2FnZSZxdW90OywgZS5nIGVtYmVkZGVkIFNRTCBzdGF0ZW1lbnRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7SlNQIC0gVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheCYjeEQ7JiN4QTsmI3hEOyYjeEE7ZW1wdHkgLSBUaGUgYm9keSBtdXN0IGJlIGVtcHR5VGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGFtcGxlIGVsZW1lbnQgcHJvdmlkZXMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR5bmFtaWNBdHRyaWJ1dGVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdHRyaWJ1dGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0pTUFRhZ0F0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFibGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0pTUFZhcmlhYmxlIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYWJsZSBlbGVtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIGRlZmluZWQgYnkgdGhpcyB0YWcuJiN4RDsmI3hBO0l0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhbiBhY3Rpb24gdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuJiN4RDsmI3hBO1RoZSBzdWJlbGVtZW50cyBvZiB2YXJpYWJsZSBhcmUgb2YgdGhlIGZvcm06JiN4RDsmI3hBO25hbWUtZ2l2ZW4gLS0gVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudCYjeEQ7JiN4QTtuYW1lLWZyb20tYXR0cmlidXRlIC0tIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLiYjeEQ7JiN4QTt2YXJpYWJsZS1jbGFzcyAtLSBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuIGphdmEubGFuZy5TdHJpbmcgaXMgZGVmYXVsdC4mI3hEOyYjeEE7ZGVjbGFyZSAtLSBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBvciBub3QuIFRydWUgaXMgdGhlIGRlZmF1bHQuJiN4RDsmI3hBO3Njb3BlIC0tIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGRlZmluZWQuIE5FU1RFRCBpcyBkZWZhdWx0LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFnQ2xhc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFnLWNsYXNzIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuVGFnIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIFRoaXMgZWxlbWVudCBpcyByZXF1aXJlZC4mI3hEOyYjeEE7QHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWlDbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0ZWktY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yIHRoaXMgdGFnLiBUaGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGF0IHRyYW5zbGF0aW9uIHRpbWUuIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbC4mI3hEOyYjeEE7QHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpTUFRhZ0F0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nIGRlZmluZWQgKHJlcXVpcmVkKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVxdWlyZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJ0RXhwclZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXNhIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWRhdCByZXF1ZXN0IHRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbnRpbWUuIChvcHRpb25hbCkmI3hEOyYjeEE7RGVmYXVsdCA9IGZhbHNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyYWdtZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLiYjeEQ7JiN4QTtGb3Igc3RhdGljIHZhbHVlcyAodGhvc2UgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbiB0aW1lKSB0aGUgdHlwZSBpcyBhbHdheXMgamF2YS5sYW5nLlN0cmluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQm9keUNvbnRlbnRUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40LCBhZGRlZCBUQUdERVBFTkRFTlQsRU1QVFksc2NyaXB0bGVzcyxTQ1JJUFRMRVNTJiN4RDsmI3hBO1Byb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4mI3hEOyYjeEE7UHJpbWFyaWx5IGludGVuZGVkIGZvciB1c2UgYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scy4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZXJlIGFyZSBjdXJyZW50bHkgZm91ciB2YWx1ZXMgc3BlY2lmaWVkOiYjeEQ7JiN4QTsmI3hEOyYjeEE7dGFnZGVwZW5kZW50ICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZyYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIGluIGEgZGlmZmVyZW50ICZxdW90O2xhbmdhZ2UmcXVvdDssIGUuZyBlbWJlZGRlZCBTUUwmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHN0YXRlbWVudHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtKU1AgICAgICAgICAgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBzeW50YXguJiN4RDsmI3hBOyYjeEQ7JiN4QTtlbXB0eSAgICAgICAgICAgVGhlIGJvZHkgbXVzdCBiZSBlbXB0eSYjeEQ7JiN4QTsmI3hEOyYjeEE7c2NyaXB0bGVzcyAgICAgIFRoZSBib2R5IGFjY2VwdHMgb25seSB0ZW1wbGF0ZSB0ZXh0LCBFTCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgRXhwcmVzc2lvbnMsIGFuZCBKU1AgYWN0aW9uIGVsZW1lbnRzLiAgTm8mI3hEOyYjeEE7ICAgICAgICAgICAgICAgIHNjcmlwdGluZyBlbGVtZW50cyBhcmUgYWxsb3dlZC4mI3hEOyYjeEE7SlNQPTAmI3hEOyYjeEE7ZW1wdHk9MSYjeEQ7JiN4QTt0YWdkZXBlbmRlbnQ9MiYjeEQ7JiN4QTtUQUdERVBFTkRFTlQ9MyYjeEQ7JiN4QTtFTVBUWT00JiN4RDsmI3hBO3NjcmlwdGxlc3M9NSYjeEQ7JiN4QTtTQ1JJUFRMRVNTPTYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InRhZ2RlcGVuZGVudCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSlNQIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZW1wdHkiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzY3JpcHRsZXNzIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWxpZGF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWxpZGF0b3IgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRhdG9yQ2xhc3MiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJkZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlJiN4RDsmI3hBO3VzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdFBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd2ViYXBwbGljYXRpb24uZWNvcmUjLy9Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKU1BWYXJpYWJsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVHaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lLWdpdmVuIGVsZW1lbnQgcHJvdmlkZXMgdGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lRnJvbUF0dHJpYnV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVjbGFyZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIGRlY2xhcmUgZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQgb3Igbm90LiBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiYjeEQ7JiN4QTtUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBkZWZhdWx0IGlzIHRydWUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFibGVDbGFzcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik5FU1RFRD0wJiN4RDsmI3hBO0FUX0JFR0lOPTEmI3hEOyYjeEE7QVRfRU5EPTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5FU1RFRCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVRfQkVHSU4iIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBVF9FTkQiIHZhbHVlPSIyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZ1bmN0aW9uIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaCYjeEQ7JiN4QTtmdW5jdGlvbiBpbiB0aGUgdGFnIGxpYnJhcnkgdGhhdCBpcyB0byBiZSBleHBvc2VkIHRvIHRoZSBFTC4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBmdW5jdGlvbiBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6JiN4RDsmI3hBOyYjeEQ7JiN4QTtkZXNjcmlwdGlvbiAgICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbiYjeEQ7JiN4QTsmI3hEOyYjeEE7ZGlzcGxheS1uYW1lICAgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCBieSB0b29scyYjeEQ7JiN4QTsmI3hEOyYjeEE7aWNvbiAgICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGJ5IHRvb2xzJiN4RDsmI3hBOyYjeEQ7JiN4QTtuYW1lICAgICAgICAgICAgICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24mI3hEOyYjeEE7JiN4RDsmI3hBO2Z1bmN0aW9uLWNsYXNzICAgICAgUHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uJiN4RDsmI3hBOyYjeEQ7JiN4QTtmdW5jdGlvbi1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgb2YgdGhlIEphdmEmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBtZXRob2QgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGltcGxlbWVudCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBO2V4YW1wbGUgICAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgZnVuY3Rpb24iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaWduYXR1cmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YSBMYW5ndWFnZSYjeEQ7JiN4QTsgICAgICAgIFNwZWNpZmljYXRpb24sIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcyYjeEQ7JiN4QTsgICAgICAgIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbi4mI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgRXhhbXBsZTomI3hEOyYjeEE7JiN4RDsmI3hBOyAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24mI3hEOyYjeEE7ICAgICAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZnVuY3Rpb25DbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YSYjeEQ7JiN4QTsgICAgICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzJiN4RDsmI3hBOyAgICAgICAgdGhlIGZ1bmN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmdW5jdGlvbkV4dGVuc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGxkRXh0ZW5zaW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYWdGaWxlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQmI3hEOyYjeEE7YXMgYSAudGFnIGZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgdGFnLWZpbGUgZWxlbWVudCBoYXMgdHdvIHJlcXVpcmVkIHN1YmVsZW1lbnRzOiYjeEQ7JiN4QTsmI3hEOyYjeEE7bmFtZSAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lJiN4RDsmI3hBOyYjeEQ7JiN4QTtwYXRoICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcyYjeEQ7JiN4QTsgICAgICAgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBvciYjeEQ7JiN4QTsmI3g5O3RoZSByb290IG9mIHRoZSBKQVIgZmlsZSBmb3IgYSB0YWcgbGlicmFyeSBwYWNrYWdlZCBpbiYjeEQ7JiN4QTsmI3g5O2EgSkFSLiAgVGhpcyBtdXN0IGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZyYjeEQ7JiN4QTsmI3g5O2ZpbGUgcmVzaWRlcyBpbiB0aGUgV0FSLCBvciAvTUVUQS1JTkYvdGFncyBpZiB0aGUgLnRhZyYjeEQ7JiN4QTsmI3g5O2ZpbGUgcmVzaWRlcyBpbiBhIEpBUi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4YW1wbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFnRXh0ZW5zaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UbGRFeHRlbnNpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRsZEV4dGVuc2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbnNpb25FbGVtZW50cyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeHRlbnNpYmxlVHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5zaWJsZVR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dlYmFwcGxpY2F0aW9uLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dlYmFwcGxpY2F0aW9uLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzdkOTI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93ZWJhcHBsaWNhdGlvbi5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ3ZWJhcHBsaWNhdGlvbiIKLSAgICBuc1VSST0id2ViYXBwbGljYXRpb24ueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24iPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlYkFwcCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0pORElFbnZSZWZzR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3ImI3hEOyYjeEE7YSB3ZWIgYXBwbGljYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc3RyaWJ1dGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpc3RyaWJ1dGFibGUgZWxlbWVudCwgYnkgaXRzIHByZXNlbmNlIGluIGEgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMgcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0IGNvbnRhaW5lciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRleHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRleHRQYXJhbSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQ29udGV4dFBhcmFtL3dlYkFwcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIHNlZSBjb250ZXh0UGFyYW1zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVycm9yUGFnZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXJyb3JQYWdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9FcnJvclBhZ2Uvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpbGVMaXN0IiBlVHlwZT0iIy8vV2VsY29tZUZpbGVMaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWxjb21lRmlsZUxpc3Qvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhZ0xpYnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGFnTGliUmVmIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9UYWdMaWJSZWYvd2ViQXBwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQgU2VlIGpzcDo6VGFnTGliUmVmJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25zdHJhaW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN1cml0eUNvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludC93ZWJBcHAiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibG9naW5Db25maWciIGVUeXBlPSIjLy9Mb2dpbkNvbmZpZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTG9naW5Db25maWcvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1pbWVNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NaW1lTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWltZU1hcHBpbmcvd2ViQXBwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlc3Npb25Db25maWciIGVUeXBlPSIjLy9TZXNzaW9uQ29uZmlnIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZXNzaW9uQ29uZmlnL3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2bGV0TWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU2VydmxldE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlcnZsZXRNYXBwaW5nL3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2bGV0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZXJ2bGV0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZXJ2bGV0L3dlYkFwcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN1cml0eVJvbGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9TZWN1cml0eVJvbGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpbHRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRmlsdGVyIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWx0ZXJNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GaWx0ZXJNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZpbHRlciBtYXBwaW5ncyBkZWZpbmVkIGZvciB0aGUgd2ViIGFwcCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaXN0ZW5lcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0xpc3RlbmVyIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaXN0ZW5lcnMgY29sbGVjdGlvbiBjb250YWlucyBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW5zIGluIHRoZSB3ZWIgYXBwLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZXh0UGFyYW1zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9QYXJhbVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqc3BDb25maWciIGVUeXBlPSJlY29yZTpFQ2xhc3MganNwLmVjb3JlIy8vSlNQQ29uZmlnIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlRGVzdGluYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9NZXNzYWdlRGVzdGluYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIKLSAgICAgICAgZVR5cGU9IiMvL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGV4dFBhcmFtIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQmI3hEOyYjeEE7VGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQmI3hEOyYjeEE7VGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1WYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkJiN4RDsmI3hBO1RoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvY29udGV4dHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmxldCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEgc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZsZXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgc2VydmxldC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9hZE9uU3RhcnR1cCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludGVnZXJPYmplY3QiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlIGVsZW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gTG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZCBiZWZvcmUgaGlnaGVyIGludGVnZXJzLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgaXQgYXQgYW55IHRpbWUgaW4gdGhlIHN0YXJ0dXAgc2VxdWVuY2UuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvc2VydmxldHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViVHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dlYlR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGluaXRQYXJhbXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdXJpdHlSb2xlUmVmcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vU2VjdXJpdHlSb2xlUmVmIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJydW5BcyIgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9SdW5Bc1NwZWNpZmllZElkZW50aXR5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGRlZmluZWQgZm9yIGEgc2VydmxldCwgb3ZlcnJpZGVzIHRoZSBzZWN1cml0eSBpZGVudGl0eSB1c2VkIHRvIGNhbGwgYW4gRUpCIGJ5IHRoYXQgc2VydmxldCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHJvbGUtbmFtZSBpcyBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRQYXJhbXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZsZXRNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIHNlcnZsZXQgYW5kIGEgdXJsIHBhdHRlcm4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJsUGF0dGVybiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gTXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSYjeEQ7JiN4QTtzZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWImI3hEOyYjeEE7YXBwbGljYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYkFwcCIgZVR5cGU9IiMvL1dlYkFwcCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlYkFwcC9zZXJ2bGV0TWFwcGluZ3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmxldCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlcnZsZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2Vzc2lvbkNvbmZpZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2Vzc2lvblRpbWVvdXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdCYjeEQ7JiN4QTsgICAgICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQmI3hEOyYjeEE7ICAgICAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0JiN4RDsmI3hBOyAgICAgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4mI3hEOyYjeEE7ICAgICAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcyYjeEQ7JiN4QTsgICAgICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lJiN4RDsmI3hBOyAgICAgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lciYjeEQ7JiN4QTsgICAgICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvc2Vzc2lvbkNvbmZpZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaW1lTWFwcGluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uIGFuZCBhIG1pbWUgdHlwZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVuc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGV4dGVuc2lvbi4gZXhhbXBsZTogJnF1b3Q7dHh0JnF1b3Q7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6ICZxdW90O3RleHQvcGxhaW4mcXVvdDsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL21pbWVNYXBwaW5ncyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWxjb21lRmlsZUxpc3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZSBmaWxlcyBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL2ZpbGVMaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZpbGUiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV2VsY29tZUZpbGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlbGNvbWVGaWxlL2ZpbGVMaXN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVycm9yUGFnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlIG9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJBcHAiIGVUeXBlPSIjLy9XZWJBcHAiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9XZWJBcHAvZXJyb3JQYWdlcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYWdMaWJSZWYiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBqc3A6OlRhZ0xpYlJlZiYjeEQ7JiN4QTtUaGUgdGFnbGliIGVsZW1lbnQgaXMgdXNlZCB0byBkZXNjcmliZSBhIEpTUCB0YWcgbGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFnbGliVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQgU2VlIGpzcDo6VGFnTGliUmVmJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYiBBcHBsaWNhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFnbGliTG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCBTZWUganNwOjpUYWdMaWJSZWYmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYmFyeSBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYkFwcCIgZVR5cGU9IiMvL1dlYkFwcCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlYkFwcC90YWdMaWJzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3VyaXR5Q29uc3RyYWludCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNwbGF5TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkaXNwbGF5TmFtZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL2NvbnN0cmFpbnRzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYlJlc291cmNlQ29sbGVjdGlvbnMiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9XZWJSZXNvdXJjZUNvbGxlY3Rpb24vc2VjQ29uc3RyYWludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdXRoQ29uc3RyYWludCIgZVR5cGU9IiMvL0F1dGhDb25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BdXRoQ29uc3RyYWludC9zZWNDb25zdHJhaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InVzZXJEYXRhQ29uc3RyYWludCIgZVR5cGU9IiMvL1VzZXJEYXRhQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVXNlckRhdGFDb25zdHJhaW50L3NlY0NvbnN0cmFpbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzcGxheU5hbWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0IG9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3ZWJSZXNvdXJjZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJsUGF0dGVybiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh0dHBNZXRob2QiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSFRUUE1ldGhvZFR5cGVFbnVtIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWNDb25zdHJhaW50IiBlVHlwZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50L3dlYlJlc291cmNlQ29sbGVjdGlvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVVJMcyIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9VUkxQYXR0ZXJuVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVVJMUGF0dGVyblR5cGUvcmVzQ29sbGVjdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyB1cmxQYXR0ZXJuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlc2NyaXB0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJIVFRQcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9IVFRQTWV0aG9kVHlwZSIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgaHR0cE1ldGhvZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdXRoQ29uc3RyYWludCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQmI3hEOyYjeEE7c2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSYjeEQ7JiN4QTtjb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kJiN4RDsmI3hBO3RvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzJiN4RDsmI3hBO2RlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5JiN4RDsmI3hBO3Jlc2VydmVkIHJvbGUtbmFtZSAmcXVvdDsqJnF1b3Q7IHRoYXQgaXMgYSBjb21wYWN0IHN5bnRheCBmb3ImI3hEOyYjeEE7aW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAmcXVvdDsqJnF1b3Q7JiN4RDsmI3hBO2FuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwmI3hEOyYjeEE7cm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcyYjeEQ7JiN4QTt0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUmI3hEOyYjeEE7Y29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzJiN4RDsmI3hBO3JvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40IGRlcHJlY2F0ZWQsIGJlY29tZXMgZGVzY3JpcHRpb25zJiN4RDsmI3hBO0EgZGVzY3JpcHRpb24gb2YgdGhlIGF1dGggY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBsaXN0IG9mIHJvbGUgbmFtZXMgZm9yIHRoZSBhdXRoIGNvbnN0cmFpbnQuICBFYWNoIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZSAoYSBTdHJpbmcpLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjQ29uc3RyYWludCIgZVR5cGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlY3VyaXR5Q29uc3RyYWludC9hdXRoQ29uc3RyYWludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVXNlckRhdGFDb25zdHJhaW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUgcHJvdGVjdGVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRlc2NyaXB0aW9ucyYjeEQ7JiN4QTtBIGRlc2NyaXB0aW9uIGZvciB0aGUgdXNlciBkYXRhIGNvbnN0cmFpbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRyYW5zcG9ydEd1YXJhbnRlZSIgZVR5cGU9IiMvL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvciBDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkmI3hEOyYjeEE7dHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlIGNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IgQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzIHJlcXVpcmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWNDb25zdHJhaW50IiBlVHlwZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VjdXJpdHlDb25zdHJhaW50L3VzZXJEYXRhQ29uc3RyYWludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXNjcmlwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9naW5Db25maWciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4mI3hEOyYjeEE7bWVjaGFuaXNtLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRoTWV0aG9kIiBlVHlwZT0iIy8vQXV0aE1ldGhvZEtpbmQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAdmVyc2lvbiBKMkVFMS40ICBkZXByZWNhdGVkLCBiZWNvbWVzIGluaXRQYXJhbVZhbHVlcyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhdXRoLW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgJnF1b3Q7QkFTSUMmcXVvdDssICZxdW90O0RJR0VTVCZxdW90OywgJnF1b3Q7Rk9STSZxdW90Oywgb3IgJnF1b3Q7Q0xJRU5ULUNFUlQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWxtTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9yaXphdGlvbk1ldGhvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViQXBwIiBlVHlwZT0iIy8vV2ViQXBwIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViQXBwL2xvZ2luQ29uZmlnIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZvcm1Mb2dpbkNvbmZpZyIgZVR5cGU9IiMvL0Zvcm1Mb2dpbkNvbmZpZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRm9ybUxvZ2luQ29uZmlnL2xvZ2luQ29uZmlnIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZvcm1Mb2dpbkNvbmZpZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm0tbG9naW4tY29uZmlnIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IgcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZm9ybUxvZ2luUGFnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZm9ybUVycm9yUGFnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsb2dpbkNvbmZpZyIgZVR5cGU9IiMvL0xvZ2luQ29uZmlnIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTG9naW5Db25maWcvZm9ybUxvZ2luQ29uZmlnIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluaXRQYXJhbSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkJiN4RDsmI3hBO1RoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQGRlcHJlY2F0ZWQmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJAZGVwcmVjYXRlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkBkZXByZWNhdGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUmVzQXV0aFNlcnZsZXRUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDT05UQUlORVI9MCYjeEQ7JiN4QTtTRVJWTEVUPTEmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDT05UQUlORVIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNFUlZMRVQiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlYlR5cGUiIGFic3RyYWN0PSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmxldFR5cGUiIGVTdXBlclR5cGVzPSIjLy9XZWJUeXBlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpTUFR5cGUiIGVTdXBlclR5cGVzPSIjLy9XZWJUeXBlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ianNwRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVSTFBhdHRlcm5UeXBlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJsUGF0dGVybiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNDb2xsZWN0aW9uIiBlVHlwZT0iIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vV2ViUmVzb3VyY2VDb2xsZWN0aW9uL1VSTHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJIVFRQTWV0aG9kVHlwZUVudW0iPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iR0VUIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIChHRVQgfCBQT1NUIHwuLi4pIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBPU1QiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQVVQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJERUxFVEUiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJIRUFEIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1BUSU9OUyIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlRSQUNFIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlTmFtZVR5cGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWxjb21lRmlsZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3ZWxjb21lRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWxlTGlzdCIgZVR5cGU9IiMvL1dlbGNvbWVGaWxlTGlzdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dlbGNvbWVGaWxlTGlzdC9maWxlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVHJhbnNwb3J0R3VhcmFudGVlVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTk9ORT0xJiN4RDsmI3hBO0lOVEVHUkFMPTImI3hEOyYjeEE7Q09ORklERU5USUFMPTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOVEVHUkFMIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09ORklERU5USUFMIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGNlcHRpb25UeXBlRXJyb3JQYWdlIiBlU3VwZXJUeXBlcz0iIy8vRXJyb3JQYWdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhjZXB0aW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleGNlcHRpb24gdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXJyb3JDb2RlRXJyb3JQYWdlIiBlU3VwZXJUeXBlcz0iIy8vRXJyb3JQYWdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXJyb3JDb2RlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGaWx0ZXJNYXBwaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvIGEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uIHNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhIHNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgJmx0O2ZpbHRlcm5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlICZsdDtmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QGludmFyaWFudCBUaGUgZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlcjo6bmFtZSBvZiBvbmUgb2YgdGhlIEZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVybFBhdHRlcm4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzcGF0Y2hlclR5cGUiIHVwcGVyQm91bmQ9IjQiCi0gICAgICAgIGVUeXBlPSIjLy9EaXNwYXRjaGVyVHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWx0ZXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9GaWx0ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmlsdGVyIGJlaW5nIG1hcHBlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2bGV0IiBlVHlwZT0iIy8vU2VydmxldCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG9wdGlvbmFsIHNlcnZsZXQgdGhhdCBpcyBtYXBwZWQgYnkgYSBmaWx0ZXIgbWFwcGluZy4gIHNlcnZsZXROYW1lIGlzIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc2VydmxldCByZWZlcmVuY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZpbHRlciIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWNsYXJlcyBhIGZpbHRlciBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZSBmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlci4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZSBmaWx0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRQYXJhbXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSW5pdFBhcmFtIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBpbml0UGFyYW1WYWx1ZXMmI3hEOyYjeEE7VGhlIGluaXQtcGFyYW1zIGNvbnRhaW4gYSBuYW1lL3ZhbHVlIHBhaXJzIGFzIGluaXRpYWxpemF0aW9uIHBhcmFtcyBmb3IgdGhlIGZpbHRlciYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmlsdGVyQ2xhc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbml0UGFyYW1WYWx1ZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQHZlcnNpb24gSjJFRTEuNCYjeEQ7JiN4QTtUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzJiN4RDsmI3hBOyAgICAgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRpc3BhdGNoZXJUeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkZPUldBUkQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOQ0xVREUiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSRVFVRVNUIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRVJST1IiIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxvY2FsRW5jb2RpbmdNYXBwaW5ncyIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Mb2NhbEVuY29kaW5nTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9jYWxFbmNvZGluZ01hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUE1ldGhvZFR5cGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJodHRwTWV0aG9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQXV0aE1ldGhvZEtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVU5TUEVDSUZJRUQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJBU0lDIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRElHRVNUIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRk9STSIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNMSUVOVF9DRVJUIiB2YWx1ZT0iNCIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd2Vic2VydmljZS1qMmVlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dlYnNlcnZpY2UtajJlZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkMGM1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd2Vic2VydmljZS1qMmVlLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIgbW9kZWxOYW1lPSJXZWJzZXJ2aWNlLWoyZWUiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5yb3NlIgotICAgIHVzZWRHZW5QYWNrYWdlcz0iajJlZS5nZW5tb2RlbCMvL2NsaWVudCBqMmVlLmdlbm1vZGVsIy8vYXBwbGljYXRpb24gajJlZS5nZW5tb2RlbCMvL2NvbW1vbiBqMmVlLmdlbm1vZGVsIy8vZWpiIGoyZWUuZ2VubW9kZWwjLy93ZWJhcHBsaWNhdGlvbiBqMmVlLmdlbm1vZGVsIy8vd3NjbGllbnQgajJlZS5nZW5tb2RlbCMvL2pzcCBqMmVlLmdlbm1vZGVsIy8vd3Njb21tb24gajJlZS5nZW5tb2RlbCMvL3dzZGQgLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhTW9kZWwuZ2VubW9kZWwjLy9qYXZhIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXHdlYnNlcnZpY2UtajJlZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5XT1JLU1BBQ0VfUk9PVDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPkQ6XHdvcmtcTTU8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iSmF4cnBjbWFwIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiIGVjb3JlUGFja2FnZT0iamF4cnBjbWFwLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL0phdmFXU0RMTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0phdmFXU0RMTWFwcGluZy9wYWNrYWdlTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nL2phdmFYTUxUeXBlTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVdTRExNYXBwaW5nL2V4Y2VwdGlvbk1hcHBpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0phdmFXU0RMTWFwcGluZy9pbnRlcmZhY2VNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9QYWNrYWdlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vUGFja2FnZU1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9QYWNrYWdlTWFwcGluZy9wYWNrYWdlVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1BhY2thZ2VNYXBwaW5nL25hbWVzcGFjZVVSSSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9KYXZhWE1MVHlwZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0phdmFYTUxUeXBlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0phdmFYTUxUeXBlTWFwcGluZy9jbGFzc1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9KYXZhWE1MVHlwZU1hcHBpbmcvcW5hbWVTY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0phdmFYTUxUeXBlTWFwcGluZy9hbm9ueW1vdXNUeXBlUW5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVhNTFR5cGVNYXBwaW5nL3Jvb3RUeXBlUW5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vSmF2YVhNTFR5cGVNYXBwaW5nL3ZhcmlhYmxlTWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vRXhjZXB0aW9uTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vRXhjZXB0aW9uTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0V4Y2VwdGlvbk1hcHBpbmcvZXhjZXB0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0V4Y2VwdGlvbk1hcHBpbmcvd3NkbE1lc3NhZ2VQYXJ0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9FeGNlcHRpb25NYXBwaW5nL3dzZGxNZXNzYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0V4Y2VwdGlvbk1hcHBpbmcvY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUludGVyZmFjZU1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy9zZXJ2aWNlSW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nL3dzZGxTZXJ2aWNlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy9wb3J0TWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcvc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcvd3NkbFBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcvd3NkbEJpbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy9zZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9Sb290VHlwZVFuYW1lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vVmFyaWFibGVNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9WYXJpYWJsZU1hcHBpbmcvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9WYXJpYWJsZU1hcHBpbmcvamF2YVZhcmlhYmxlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1ZhcmlhYmxlTWFwcGluZy94bWxFbGVtZW50TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1ZhcmlhYmxlTWFwcGluZy9kYXRhTWVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vVmFyaWFibGVNYXBwaW5nL3htbEF0dHJpYnV0ZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9WYXJpYWJsZU1hcHBpbmcveG1sV2lsZGNhcmQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGpheHJwY21hcC5lY29yZSMvL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIvZWxlbWVudE5hbWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL0VsZW1lbnROYW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9FbGVtZW50TmFtZS9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL0VsZW1lbnROYW1lL3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETFNlcnZpY2VOYW1lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vUG9ydE1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1BvcnRNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vUG9ydE1hcHBpbmcvcG9ydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9Qb3J0TWFwcGluZy9qYXZhUG9ydE5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETFBvcnRUeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETEJpbmRpbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy9qYXZhTWV0aG9kTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcvd3NkbE9wZXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcvd3JhcHBlZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy9tZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy93c2RsUmV0dXJuVmFsdWVNYXBwaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImpheHJwY21hcC5lY29yZSMvL1dTRExPcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExPcGVyYXRpb24vaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMT3BlcmF0aW9uL3dzZGxPcGVyYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcvcGFyYW1Qb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nL3BhcmFtVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9NZXRob2RQYXJhbVBhcnRzTWFwcGluZy93c2RsTWVzc2FnZU1hcHBpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETFJldHVyblZhbHVlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETFJldHVyblZhbHVlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmcvbWV0aG9kUmV0dXJuVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nL3dzZGxNZXNzYWdlUGFydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF4cnBjbWFwLmVjb3JlIy8vV1NETFJldHVyblZhbHVlTWFwcGluZy93c2RsTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlTWFwcGluZy9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlTWFwcGluZy93c2RsTWVzc2FnZVBhcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VNYXBwaW5nL3BhcmFtZXRlck1vZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZU1hcHBpbmcvc29hcEhlYWRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXhycGNtYXAuZWNvcmUjLy9XU0RMTWVzc2FnZU1hcHBpbmcvd3NkbE1lc3NhZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VQYXJ0TmFtZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF4cnBjbWFwLmVjb3JlIy8vV1NETE1lc3NhZ2VQYXJ0TmFtZS9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGpheHJwY21hcC5lY29yZSMvL1dTRExNZXNzYWdlUGFydE5hbWUvd3NkbE1lc3NhZ2VQYXJ0TmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXhycGNtYXAuZWNvcmUjLy9JbnRlcmZhY2VNYXBwaW5nIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzY2xpZW50LmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL3dzY2xpZW50LmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGJkNGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2NsaWVudC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ3c2NsaWVudCIKLSAgICBuc1VSST0id2Vic2VydmljZV9jbGllbnQueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmljZVJlZiIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIHJlZmVyZW5jZSB0byBhIFdlYiYjeEQ7JiN4QTsgICAgc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQmI3hEOyYjeEE7ICAgIGljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwmI3hEOyYjeEE7ICAgIGFuIG9wdGlvbmFsIFdTREwgZG9jdW1lbnQgbG9jYXRpb24sIGFuIG9wdGlvbmFsIHNldCYjeEQ7JiN4QTsgICAgb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsJiN4RDsmI3hBOyAgICBhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkJiN4RDsmI3hBOyAgICBieSB0aGUgY29udGFpbmVyIHRvIGEgV1NETCBwb3J0LCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGhhbmRsZXJzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlSW50ZXJmYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmplbS9tb2RlbC9qYXZhLmVjb3JlIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyYjeEQ7JiN4QTsgICAgICAgIG5hbWUgb2YgdGhlIEpBWC1SUEMgU2VydmljZSBpbnRlcmZhY2UgdGhlIGNsaWVudCBkZXBlbmRzIG9uLiYjeEQ7JiN4QTsgICAgICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDJiN4RDsmI3hBOyAgICAgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmljZVJlZk5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZSYjeEQ7JiN4QTsgICAgICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0JiN4RDsmI3hBOyAgICAgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aCYjeEQ7JiN4QTsgICAgICAgICZxdW90O3NlcnZpY2UvJnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwgZmlsZS4gVGhlJiN4RDsmI3hBOyAgICAgICAgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF4cnBjTWFwcGluZ0ZpbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0JiN4RDsmI3hBOyAgICAgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieSYjeEQ7JiN4QTsgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gIFRoZSYjeEQ7JiN4QTsgICAgICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9ydENvbXBvbmVudFJlZnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUG9ydENvbXBvbmVudFJlZiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeSYjeEQ7JiN4QTsgICAgICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlJiN4RDsmI3hBOyAgICAgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludCYjeEQ7JiN4QTsgICAgICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQmI3hEOyYjeEE7ICAgICAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhhbmRsZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0hhbmRsZXIiIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSYjeEQ7JiN4QTsgICAgICAgIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZiYjeEQ7JiN4QTsgICAgICAgIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQmI3hEOyYjeEE7ICAgICAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZVFuYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1FOYW1lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0Q29tcG9uZW50UmVmIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeSYjeEQ7JiN4QTsgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UmI3hEOyYjeEE7ICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQmI3hEOyYjeEE7ICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQmI3hEOyYjeEE7ICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydENvbXBvbmVudExpbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1jb21wb25lbnQtbGluayBlbGVtZW50IGxpbmtzIGEgcG9ydC1jb21wb25lbnQtcmVmIHRvIGEmI3hEOyYjeEE7ICAgICAgICBzcGVjaWZpYyBwb3J0LWNvbXBvbmVudCByZXF1aXJlZCB0byBiZSBtYWRlIGF2YWlsYWJsZSBieSBhIHNlcnZpY2UmI3hEOyYjeEE7ICAgICAgICByZWZlcmVuY2UuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgICAgIFRoZSB2YWx1ZSBvZiBhIHBvcnQtY29tcG9uZW50LWxpbmsgbXVzdCBiZSB0aGUgcG9ydC1jb21wb25lbnQtbmFtZSYjeEQ7JiN4QTsgICAgICAgIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lJiN4RDsmI3hBOyAgICAgICAgYXBwbGljYXRpb24gdW5pdC4gVGhlIHN5bnRheCBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXgmI3hEOyYjeEE7ICAgICAgICBkZWZpbmVkIGZvciBlamItbGluayBpbiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkJiN4RDsmI3hBOyAgICAgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEmI3hEOyYjeEE7ICAgICAgICBXU0RMIHBvcnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhhbmRsZXIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlJiN4RDsmI3hBOyAgICBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYmI3hEOyYjeEE7ICAgIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQmI3hEOyYjeEE7ICAgIHdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7ICAgIFVzZWQgaW46IHNlcnZpY2UtcmVmIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhhbmRsZXJOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBtb2R1bGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBSb2xlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3J0TmFtZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYSBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhhbmRsZXJDbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaXRQYXJhbXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL1BhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvYXBIZWFkZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBjb21tb24uZWNvcmUjLy9RTmFtZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2ViU2VydmljZXNDbGllbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21wb25lbnRTY29wZWRSZWZzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbXBvbmVudFNjb3BlZFJlZnMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VSZWZzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvbmVudFNjb3BlZFJlZnMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wb25lbnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VSZWZzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlcnZpY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2NvbW1vbi5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2NvbW1vbi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3NzFiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd3Njb21tb24uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ3c2NvbW1vbiIKLSAgICBuc1VSST0id3Njb21tb24ueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5pdFBhcmFtIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmFtVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25UeXBlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXNjcmlwdGlvblR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBIZWFkZXIiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBoYW5kbGVyLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUFJvbGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwUm9sZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0TmFtZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0aW9uVHlwZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0Rlc2NyaXB0aW9uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzcGxheU5hbWVUeXBlIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vRGlzcGxheU5hbWUiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd3NkZC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2RkLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTllY2MwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2RkLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9IndzZGQiCi0gICAgbnNVUkk9IndzZGQueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWJTZXJ2aWNlcyIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQgc2VydmljZXMuJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2ViU2VydmljZURlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbiBlbGVtZW50IGRlZmluZXMgYSBXU0RMIGRvY3VtZW50IGZpbGUgYW5kIHRoZSBzZXQgb2YgUG9ydCBjb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgV1NETCBwb3J0cyBkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb25zIGRlZmluZWQgd2l0aGluIGEgbW9kdWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7QWxsIFdTREwgZmlsZSBwb3J0cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgZGVmaW5lZC4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHdlYnNlcnZpY2VzJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXhycGNNYXBwaW5nRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZiBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDIG1hcHBpbmcuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIFdTREwgZmlsZSBpbiB0aGUgbW9kdWxlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNtYWxsSWNvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXJnZUljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzcGxheU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9ydENvbXBvbmVudHMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9ydENvbXBvbmVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25UeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25UeXBlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNwbGF5TmFtZVR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3Njb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZVR5cGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imljb25UeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0ljb25UeXBlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0Q29tcG9uZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1jb21wb25lbnQgZWxlbWVudCBhc3NvY2lhdGVzIGEgV1NETCBwb3J0IHdpdGggYSBXZWIgc2VydmljZSBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhIGNvbXBvbmVudCwgb3B0aW9uYWwgZGVzY3JpcHRpb24sIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgaWNvbmljIHJlcHJlc2VudGF0aW9ucywgV1NETCBwb3J0IFFOYW1lLCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSwgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydENvbXBvbmVudE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQgY29tcG9uZW50J3MgbmFtZS4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZSBtb2R1bGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBvcnQgY29tcG9uZW50J3MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzbWFsbEljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFyZ2VJY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc3BsYXlOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndzZGxQb3J0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV1NETFBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VJbXBsQmVhbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlcnZpY2VJbXBsQmVhbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFuZGxlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSGFuZGxlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVzY3JpcHRpb25UeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzY29tbW9uLmVjb3JlIy8vRGVzY3JpcHRpb25UeXBlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNwbGF5TmFtZVR5cGUiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3Njb21tb24uZWNvcmUjLy9EaXNwbGF5TmFtZVR5cGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imljb25UeXBlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGNvbW1vbi5lY29yZSMvL0ljb25UeXBlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMUG9ydCIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL1FOYW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwgcG9ydCBRTmFtZS4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZpY2VJbXBsQmVhbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgZGVmaW5lcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBhbiBFSkIgYmVhbiBjbGFzcyBvciBKQVgtUlBDIHdlYiBjb21wb25lbnQuIEV4aXN0aW5nIEVKQiBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cG9zZWQgYXMgYSBXZWIgc2VydmljZSB1c2luZyBhbiBlamItbGluay4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHBvcnQtY29tcG9uZW50JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlRUpCTGluayIgZVR5cGU9IiMvL0VKQkxpbmsiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVTZXJ2bGV0TGluayIgZVR5cGU9IiMvL1NlcnZsZXRMaW5rIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiZWFuTGluayIgZVR5cGU9IiMvL0JlYW5MaW5rIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2bGV0TGluayIgZVN1cGVyVHlwZXM9IiMvL0JlYW5MaW5rIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VydmxldC1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSB2YWx1ZSBvZiB0aGUgc2VydmxldC1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2VydmxldC1uYW1lIG9mIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50IGluIHRoZSBzYW1lIFdBUiBmaWxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZsZXRMaW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVKQkxpbmsiIGVTdXBlclR5cGVzPSIjLy9CZWFuTGluayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIFdlYiBTZXJ2aWNlIEVuZHBvaW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbiYjeEQ7JiN4QTsmI3hEOyYjeEE7RXhhbXBsZXM6JiN4RDsmI3hBOyZsdDtlamItbGluaz5FbXBsb3llZVJlY29yZCZsdDsvZWpiLWxpbms+JiN4RDsmI3hBOyYjeDk7Jmx0O2VqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkImbHQ7L2VqYi1saW5rPiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWpiTGluayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIYW5kbGVyIiBlU3VwZXJUeXBlcz0iY29tbW9uLmVjb3JlIy8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4mI3hEOyYjeEE7JiN4RDsmI3hBO1VzZWQgaW46IHBvcnQtY29tcG9uZW50JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYW5kbGVyTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYW5kbGVyQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdFBhcmFtcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3Njb21tb24uZWNvcmUjLy9Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvYXBIZWFkZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2NvbW1vbi5lY29yZSMvL1NPQVBIZWFkZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvYXBSb2xlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3Njb21tb24uZWNvcmUjLy9TT0FQUm9sZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmVhbkxpbmsiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9lamIucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2VqYi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYxOTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2VqYi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRWpiX3Byb3ZpZGVyX3BsdWdpbl9wcm9iPUVqYiBwcm92aWRlciBwbHVnaW4gc3RhcnR1cCAtIFByb2JsZW0gaW5pdGlhbGl6aW5nIHBsdWdpbgotRWpiZXh0X3Byb3ZpZGVyX3BsdWdpbl9wcm9iPUVqYmV4dCBwcm92aWRlciBwbHVnaW4gc3RhcnR1cCAtIFByb2JsZW0gaW5pdGlhbGl6aW5nIHBsdWdpbgotRUpCX1VJX1NUQVJUVVA9RUpCIFVJIFNUQVJUVVAKLUVKQl9QYXRoX189RUpCIFBhdGg6Ci1TaXplX189U2l6ZToKLUVkaXRfdGhlX2JlYW5fY2xhc3M9RWRpdCB0aGUgYmVhbiBjbGFzcwotRUpCX1RyZWU9RUpCIFRyZWUKLUVKQl9KYXJfQ29tcG9uZW50cz1FSkIgSkFSIENvbXBvbmVudHMKLUVKQl9Nb2RlbHM9RUpCIE1vZGVscwotRUpCX0ZlYXR1cmVzPUVKQiBGZWF0dXJlcwotRXhjZXB0aW9uX2xvYWRpbmdfcGx1Z2luPUV4Y2VwdGlvbiBsb2FkaW5nIHBsdWdpbgotQ3JlYXRlPUNyZWF0ZQotQ3JlYXRlX0F0dHJpYnV0ZS4uLj1DcmVhdGUgQXR0cmlidXRlLi4uCi1jcmVhdGVBdHRyaWJ1dGU9Y3JlYXRlQXR0cmlidXRlCi1FZGl0PUVkaXQKLUFkZF9Ub19LZXk9QWRkIFRvIEtleQotZGVsZXRlPWRlbGV0ZQotVW5rbm93bj1Vbmtub3duCi1SZW1vdmVfRnJvbV9LZXk9UmVtb3ZlIEZyb20gS2V5Ci1EZWxldGU9RGVsZXRlCi1EZWxldGVfQXR0cmlidXRlLi4uPURlbGV0ZSBBdHRyaWJ1dGUuLi4KLWFkZGl0aW9ucz1hZGRpdGlvbnMKLUNNRFNfQ2Fubm90X3JlZmxlY3RfSmF2YUNsYXNzX0VSUk9SXz1JV0FFMDA2OEUgQ2Fubm90IHJlZmxlY3QgSmF2YUNsYXNzIGJlY2F1c2UgaXRzIG5hbWUgaXMgbm90IHNldCBmb3IKLUNNRFNfQ0xBU1NfU0VUX0ZBSUxFRF9TVFJJTkdfRVJST1JfPUlXQUUwMDY5RSBUaGUgSmF2YSB0eXBlIG5hbWVkIHswfSBjb3VsZCBub3QgYmUgc2V0IGZvciB0aGUgezF9IGJlY2F1c2UgaXRzIEVKQiBpcyBudWxsLgotQ01EU19DYW5ub3RfcGVyZm9ybV9JTkZPXz1JV0FFMDA3MEkgQ2Fubm90IHBlcmZvcm0gdGhlIGNvbW1hbmQgcmVxdWVzdCBiZWNhdXNlIHRoZSBFSkIgaXMgbnVsbCBmb3IgdGhlIGNvbW1hbmQ6Ci1DTURTX0Nhbm5vdF9hZGRfdGhlX2ZlYXRfSU5GT189SVdBRTAwNzFJIENhbm5vdCBhZGQgdGhlIGZlYXR1cmUgdG8gdGhlIGtleSBiZWNhdXNlIHRoZSBmZWF0dXJlIGlzIG51bGwgZm9yIHRoZSBjb21tYW5kOgotQ01EU19DYW5ub3RfcmVtb3ZlX3RoZV9JTkZPXz1JV0FFMDA3MkkgQ2Fubm90IHJlbW92ZSB0aGUgZmVhdHVyZSBmcm9tIHRoZSBrZXkgYmVjYXVzZSB0aGUgZmVhdHVyZSBpcyBudWxsIGZvciB0aGUgY29tbWFuZDoKLUNNRFNfSW5pdGlhbGl6aW5nX1VJXz0tLSBKYXZhIEdlbmVyYXRpb24gOjogSW5pdGlhbGl6aW5nLi4uCi1DTURTX0dlbmVyYXRpbmdfVUlfPS0tIEphdmEgR2VuZXJhdGlvbiA6OiBHZW5lcmF0aW5nLi4uCi1DTURTX0ZpbmlzaGluZ19VSV89LS0gSmF2YSBHZW5lcmF0aW9uIDo6IEZpbmlzaGluZy4uLgotQ01EU19BbmFseXppbmdfVUlfPS0tIEphdmEgR2VuZXJhdGlvbiA6OiBBbmFseXppbmcuLi4KLUNNRFNfQ2FuY2VsbGVkX1dBUk5JTkdfPUNhbmNlbGxlZAotQ01EU19NdWx0aXBsZV9FbnRlcnByaXNlQmVhbl9VcF9JTkZPXz1JV0FFMDA3M0kgTXVsdGlwbGUgRW50ZXJwcmlzZUJlYW4gVXBkYXRlcwotQ01EU19DUkVBVElOR19UQVNLX1VJXz1DcmVhdGluZyBiZWFuIG5hbWVkICJ7MH0iCi1DTURTX1VQREFUSU5HX1RBU0tfVUlfPVVwZGF0aW5nIGJlYW4gbmFtZWQgInswfSIKLUNNRFNfREVMRVRJTkdfVEFTS19VSV89RGVsZXRpbmcgYmVhbiBuYW1lZCAiezB9IgotQ01EU19VcGRhdGluZ19NZXRhZGF0YS4uLl9VSV89LS0gVXBkYXRpbmcgTWV0YWRhdGEuLi4KLVVwZGF0aW5nPVVwZGF0aW5nCi1OZXdfa2V5X2F0dHJpYnV0ZV9hZGRlZF93aT1OZXcga2V5IGF0dHJpYnV0ZSBhZGRlZCB3aXRob3V0IGF0dHJpYnV0ZSBoZWxwZXIuCi1FcnJvcl9oYXNfb2NjdXJyZWQ9RXJyb3IgaGFzIG9jY3VycmVkCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2oyZWVwbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL2oyZWVwbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzMTk0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9qMmVlcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Db3VsZF9ub3RfZmluZF9yb290X29iamVjdF9FUlJPUl89SVdBRTAwNzRFIENvdWxkIG5vdCBmaW5kIHJvb3Qgb2JqZWN0IGluIHJlc291cmNlOiB7MH0KLUFuX2Vycm9yX29jY3VycmVkX3doaWxlX3NhX0VSUk9SXz1JV0FFMDA3NUUgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nLgotQ2Fubm90X3J1bl9KMkVFVUlXb3JraW5nQ29fRVJST1JfPUlXQUUwMDc2RSBDYW5ub3QgcnVuIEoyRUVVSVdvcmtpbmdDb3B5TWFuYWdlciBvcGVyYXRpb24gYmVjYXVzZSB0aGUgV29ya3NwYWNlIHRyZWUgaXMgbG9ja2VkLgotVW5hYmxlX3RvX3NhdmVfcmVhZC1vbmx5X2ZfRVJST1JfPUlXQUUwMDc3RSBVbmFibGUgdG8gc2F2ZSByZWFkLW9ubHkgZmlsZTogezB9Ci1UaGVfZm9sbG93aW5nX3Jlc291cmNlc19uZV9VSV89VGhlIGZvbGxvd2luZyByZXNvdXJjZXMgbmVlZCB0byBiZSBzYXZlZCBidXQgYXJlIGN1cnJlbnRseSBzaGFyZWQsIGRvIHlvdSB3YW50IHRvIHNhdmUgbm93PwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9qMmVleG1sLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9qMmVleG1sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmY3YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvajJlZXhtbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcmFyX2R0ZF9ub3RfZm91bmRfRVhDXz1JV0FFMDA3OEUgUkFSIGZpbGUgc3VwcG9ydDogRFREIGZpbGUgbm90IGZvdW5kOiB7MH0KLWlvX2V4X3NhdmluZ19FWENfPUlXQUUwMDc5RSBJT0V4Y2VwdGlvbiBvY2N1cnJlZCBzYXZpbmcgezB9Ci1jb3VsZF9ub3RfY3JlYXRlX2ZpbGVfRVhDXz1JV0FFMDA4MEUgQ291bGQgbm90IGNyZWF0ZSB0aGUgZmlsZSBuYW1lZCB7MH0KLXVuc3VwcG9ydGVkX2VuY29kaW5nX0VYQ189SVdBRTAwODFFIHswfSBpcyBub3QgYSBzdXBwb3J0ZWQgZW5jb2Rpbmcgb24gdGhpcyBwbGF0Zm9ybQotdW5zdXBwb3J0ZWRfdHlwZV9FWENfPUlXQUUwMDgyRSBUeXBlIGlzIHVucmVjb2duaXplZCBvciBub3QgeWV0IHN1cHBvcnRlZDogUFVCTElDX0lEPXswfSBTWVNURU1fSUQ9ezF9Ci1kdGRfbm90X2ZvdW5kX0VYQ189SVdBRTAwODNFIENvdWxkIG5vdCBwYXJzZSB4bWwgYmVjYXVzZSB0aGUgcmVzb2x2ZWQgcmVzb3VyY2UgInswfSIgY291bGQgbm90IGJlIGZvdW5kIGluIGNsYXNzcGF0aAotbXVzdF9iZV9ib29sZWFuX0VYQ189SVdBRTAwODRFIEV4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHswfS4gIFZhbHVlIG11c3QgYmUgYSBib29sZWFuOiBTdHJpbmcgdmFsdWUgPSB7MX0KLW11c3RfYmVfaW50X0VYQ189SVdBRTAwODVFIEV4Y2VwdGlvbiBvY2N1cnJlZCByZWFkaW5nIHswfS4gIFZhbHVlIG11c3QgYmUgYW4gaW50ZWdlcjogU3RyaW5nIHZhbHVlID0gezF9Ci1lbXB0eV9jb2xsZWN0aW9uX0VYQ189SVdBRTAwODZFIEVtcHR5IGNvbGxlY3Rpb24gZm9yIHswfSBpbiB7MX0KLW1pc3NpbmdfcmVxX2ZpZWxkX0VYQ189SVdBRTAwODdFIE1pc3NpbmcgcmVxdWlyZWQgZmllbGQgezB9IGluIHsxfQotQW5fRXhjZXB0aW9uX29jY3VycmVkX3doaWxfRVhDXz1JV0FFMDA4OEUgQW4gRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgeG1sCi1Ob3Rfc3VwcG9ydGVkX2luX3RoaXNfcmVsZV9FWENfPUlXQUUwMDg5RSBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgcmVsZWFzZQotUkFSX2ZpbGVfc3VwcG9ydF9fSU9fZXhjZXBfRVhDXz1JV0FFMDA5MEUgUkFSIGZpbGUgc3VwcG9ydDogSU8gZXhjZXB0aW9uIGluIGN1c3RvbSBEVEQgcmVzb2x2ZXIuCi1Bbl9JT19FeGNlcHRpb25fb2NjdXJyZWRfd19FWENfPUlXQUUwMDkxRSBBbiBJTyBFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgd3JpdGluZyB4bWwKLUZhaWx1cmVfb2NjdXJyZWRfcmVhZGluZ194X0VYQ189SVdBRTAwOTJFIEZhaWx1cmUgb2NjdXJyZWQgcmVhZGluZyB4bWw6Ci1JbnZhbGlkX3ZhbHVlX2Zvcl9fRVhDXz1JV0FFMDA5M0UgSW52YWxpZCB2YWx1ZSBmb3IKLVZhbGlkX3ZhbHVlc19hcmVfX19FWENfPUlXQUUwMDk0RSBWYWxpZCB2YWx1ZXMgYXJlOgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9tb2ZqMmVlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9tb2ZqMmVlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NDVkOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvbW9majJlZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2U9U3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoKLUVSUk9SPUVycm9yOgotV0FSTklORz1XYXJuaW5nOgotSU5GTz1JbmZvOgotREVGQVVMVF9DT01QTEVURURfU1RBVFVTX01TRz1NaWdyYXRpb24gd2FzIGNvbXBsZXRlZCBmb3IgezB9LgotREVGQVVMVF9OT1RfTkVFREVEX1NUQVRVU19NU0c9TWlncmF0aW9uIHdhcyBub3QgcmVxdWlyZWQgZm9yIHswfS4KLURFRkFVTFRfTk9UX1BPU1NJQkxFX1NUQVRVU19NU0c9TWlncmF0aW9uIHdhcyBub3QgcG9zc2libGUgZm9yIHswfS4KLURFRkFVTFRfRVJST1JfU1RBVFVTX01TRz1JV0FFMDEwMEUgRXJyb3IgbWlncmF0aW5nIHswfS4KLVJFTU9WRURfTE9DQUxfQ0xJRU5UX01TRz1SZW1vdmVkIGxvY2FsIGNsaWVudCB2aWV3IGZvciBFSkIgezB9LgotUkVNT1ZFRF9BQ0NFU1NfSU5URU5UU19NU0c9UmVtb3ZlZCB7MH0gMS4xIG1ldGhvZCBhY2Nlc3MgaW50ZW50KHMpIGZyb20gQ01QIGJlYW4gezF9LgotUkVNT1ZFRF9JU09MQVRJT05fTEVWRUxTX01TRz1SZW1vdmVkIHswfSAxLjEgbWV0aG9kIGlzb2xhdGlvbiBsZXZlbChzKSBmcm9tIENNUCBiZWFuIHsxfS4KLUNPTlZFUlRFRF9GSU5ERVJfTVNHPUNvbnZlcnRlZCBmaW5kZXIgZGVzY3JpcHRlciBmb3IgezB9IGluIENNUCBiZWFuIHsxfS4gIFVzZSB0aGUgRUpCIGVkaXRvciB0byB1cGRhdGUgdGhlIHF1ZXJ5IEVKQiBRTC4KLVVOTkFNRURfRUpCPTxVbm5hbWVkIENNUCBiZWFuPgotQ09OVkVSVEVEX1FVRVJZX0RFU0NSSVBUSU9OPUNvbnZlcnRlZCBmcm9tIElCTSB2ZXJzaW9uIDEuMSBleHRlbnNpb25zLgotTUlHUkFURURfREVGQVVMVF9EQVRBU09VUkNFX0pBUl9NU0c9TWlncmF0ZWQgZGVmYXVsdCBEYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZyBmb3IgRUpCIEpBUiBcInswfVwiLgotTUlHUkFURURfREVGQVVMVF9EQVRBU09VUkNFX01TRz1NaWdyYXRlZCBkZWZhdWx0IERhdGFzb3VyY2UgYmluZGluZyB0byBhIGRlZmF1bHQgQ01QIENvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nIGZvciBFSkIgSkFSLgotSjJFRV9WRVJTSU9OX05VTExfRVJST1I9VW5hYmxlIHRvIGdldCBKMkVFIHZlcnNpb24gb2Ygb2JqZWN0IGJlY2F1c2UgaXQgaXMgbm90IGNvbnRhaW5lZCBieSBhIGRvY3VtZW50LgotSjJFRV9WRVJTSU9OX1BST1hZX0VSUk9SPVVuYWJsZSB0byBnZXQgSjJFRSB2ZXJzaW9uIG9mIHJlZmVyZW5jZWQgb2JqZWN0IGJlY2F1c2UgdGhlIHByb3h5IGNhbm5vdCBiZSByZXNvbHZlZC4gIENoZWNrIHRoZSBpZHMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcy4gIEhSRUYgPSB7MH0uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NDExYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbiBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2VjdXJpdHlSb2xlKFN0cmluZyBuYW1lKTsKLS8qKgotICogUmV0dXJucyB0aGUgZmlyc3QgbW9kdWxlIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgdXJpIGFuZCBhbHRERAotICovCi1wdWJsaWMgTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgdXJpLCBTdHJpbmcgYWx0REQpOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGZpcnN0IG1vZHVsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHVyaQotICogQGRlcHJlY2F0ZWQgcHJlZmVyYWJseSB1c2Uge0BsaW5rICNnZXRNb2R1bGUoU3RyaW5nLCBTdHJpbmcpfSBvciB7QGxpbmsgI2dldEZpcnN0TW9kdWxlKFN0cmluZyl9Ci0gKiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgbW9kdWxlcyB3aXRoIHRoZSBzYW1lIHVyaSBidXQgZGlmZmVyZW50IGFsdC1kZHMKLSAqKi8KLXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmkpOwotLyoqCi0gKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLSAqLwotcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0vKioKLSAqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuICBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGZpcnN0IG1vZHVsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHVyaQotICovCi1wdWJsaWMgTW9kdWxlIGdldEZpcnN0TW9kdWxlKFN0cmluZyB1cmkpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBtb2R1bGUgd2hlcmUgdGhlIGFsdCBkZCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdXJpCi0gKi8KLXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlSGF2aW5nQWx0REQoU3RyaW5nIHVyaSk7Ci1wdWJsaWMgU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZU5hbWVkKFN0cmluZyBuYW1lKTsKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEFwcGxpY2F0aW9uIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsY2F0aW9uMS4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKTsKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEFwcGxpY2F0aW9uIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsaWNhdGlvbjEuMyBjb21wbGlhbnQgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzNEZXNjcmlwdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40IAotCSAqIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS40LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgU2VjdXJpdHlSb2xlcyByZWZlcmVuY2VzCi0JICogQ29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHNlY3VyaXR5IHJvbGVzIHdoaWNoIGFyZQotCSAqIGdsb2JhbCB0byB0aGUgYXBwbGljYXRpb24uIAotCSAqLwotCUVMaXN0IGdldFNlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTW9kdWxlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TW9kdWxlcygpOwotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI4ZGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25GYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhdGlvbkZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25GYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBcHBsaWNhdGlvbiB2YWx1ZQotCSAqLwotCUFwcGxpY2F0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1vZHVsZSB2YWx1ZQotCSAqLwotCU1vZHVsZSBjcmVhdGVNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViTW9kdWxlIHZhbHVlCi0JICovCi0JV2ViTW9kdWxlIGNyZWF0ZVdlYk1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhQ2xpZW50TW9kdWxlIHZhbHVlCi0JICovCi0JSmF2YUNsaWVudE1vZHVsZSBjcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVqYk1vZHVsZSB2YWx1ZQotCSAqLwotCUVqYk1vZHVsZSBjcmVhdGVFamJNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29ubmVjdG9yTW9kdWxlIHZhbHVlCi0JICovCi0JQ29ubmVjdG9yTW9kdWxlIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JQXBwbGljYXRpb25QYWNrYWdlIGdldEFwcGxpY2F0aW9uUGFja2FnZSgpOwotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvblBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTZkZGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLQotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvblBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJhcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTiA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9fTU9EVUxFUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfX1VSSSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9fQUxUX0REID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTU9EVUxFX19BUFBMSUNBVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEVfX1VSSSA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX01PRFVMRV9fQUxUX0REID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfTU9EVUxFX19BUFBMSUNBVElPTiA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWIgTW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTElFTlRfTU9EVUxFID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTElFTlRfTU9EVUxFX19VUkkgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xJRU5UX01PRFVMRV9fQUxUX0REID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMSUVOVF9NT0RVTEVfX0FQUExJQ0FUSU9OID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkphdmEgQ2xpZW50IE1vZHVsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMSUVOVF9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01PRFVMRSA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NT0RVTEVfX1VSSSA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX01PRFVMRV9fQUxUX0REID0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTU9EVUxFX19BUFBMSUNBVElPTiA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FamIgTW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEUgPSA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfTU9EVUxFX19VUkkgPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfX0FMVF9ERCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX01PRFVMRV9fQVBQTElDQVRJT04gPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjsKLQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db25uZWN0b3IgTW9kdWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RPUl9NT0RVTEVfRkVBVFVSRV9DT1VOVCA9IEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImFwcGxpY2F0aW9uLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYXRpb25QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNb2R1bGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNb2R1bGVfVXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9BbHRERCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNb2R1bGVfQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViTW9kdWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXZWJNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFDbGllbnRNb2R1bGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFDbGllbnRNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRWpiTW9kdWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFamJNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29ubmVjdG9yTW9kdWxlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb25uZWN0b3JNb2R1bGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQotfSAvL0FwcGxpY2F0aW9uUGFja2FnZQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYThmNGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvblJlc291cmNlIGV4dGVuZHMgWE1MUmVzb3VyY2UgewotcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9Db25uZWN0b3JNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0Nvbm5lY3Rvck1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2VkNTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0Nvbm5lY3Rvck1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JNb2R1bGUgZXh0ZW5kcyBNb2R1bGV7Ci0JLy9Db25uZWN0b3JNb2R1bGUKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9FamJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0VqYk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRhZWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0VqYk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWpiTW9kdWxlIGV4dGVuZHMgTW9kdWxlewotCS8vRWpiTW9kdWxlCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vSmF2YUNsaWVudE1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vSmF2YUNsaWVudE1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGExYTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL0phdmFDbGllbnRNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotCi0vKioKLSAqIHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNsaWVudE1vZHVsZSBleHRlbmRzIE1vZHVsZXsKLQkvL0phdmFDbGllbnRNb2R1bGUKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzM1YWY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL01vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIFRoZSBtb2R1bGUgZWxlbWVudCByZXByZXNlbnRzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhbiBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBNb2R1bGUgZXh0ZW5kcyBFT2JqZWN0ewotCi1wdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3Rvck1vZHVsZSgpOwotcHVibGljIGJvb2xlYW4gaXNFamJNb2R1bGUoKTsKLXB1YmxpYyBib29sZWFuIGlzSmF2YU1vZHVsZSgpOwotcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGUoKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgVVJJIG9mIGEgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAqIHBhY2thZ2UuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICogVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZgotCSAqIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEoyRUUgbW9kdWxlLiBUaGUgVVJJIG11c3QKLQkgKiBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUKLQkgKiBhcHBsaWNhdGlvbidzIHJvb3QgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QKLQkgKiByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVmYXVsdCBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIAotCSAqIGJ5IHRoZSByZXNwZWN0aXZlIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLgotCi0JICovCi0JU3RyaW5nIGdldEFsdEREKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWx0REQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBbHRERChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQXBwbGljYXRpb24gcmVmZXJlbmNlCi0JICovCi0JQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFwcGxpY2F0aW9uIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gdmFsdWUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vV2ViTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9XZWJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlZTJkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9XZWJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbjsKLQotCi0vKioKLSAqIENvbnRhaW5zIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViTW9kdWxlIGV4dGVuZHMgTW9kdWxlewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBDb250ZXh0Um9vdCBhdHRyaWJ1dGUKLQkgKiBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24KLQotCSAqLwotCVN0cmluZyBnZXRDb250ZXh0Um9vdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENvbnRleHRSb290IGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q29udGV4dFJvb3QoU3RyaW5nIHZhbHVlKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGZmNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkZhY3Rvcnl7Ci0gCi0JcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7IAkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OOiByZXR1cm4gY3JlYXRlQXBwbGljYXRpb24oKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRTogcmV0dXJuIGNyZWF0ZU1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRTogcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFOiByZXR1cm4gY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuRUpCX01PRFVMRTogcmV0dXJuIGNyZWF0ZUVqYk1vZHVsZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRTogcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi1wdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBY3RpdmVGYWN0b3J5KCkgewotCXJldHVybiAoQXBwbGljYXRpb25GYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpIHsKLQkJQXBwbGljYXRpb25JbXBsIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1vZHVsZSBjcmVhdGVNb2R1bGUoKSB7Ci0JCU1vZHVsZUltcGwgbW9kdWxlID0gbmV3IE1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgV2ViTW9kdWxlIGNyZWF0ZVdlYk1vZHVsZSgpIHsKLQkJV2ViTW9kdWxlSW1wbCB3ZWJNb2R1bGUgPSBuZXcgV2ViTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gd2ViTW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xpZW50TW9kdWxlIGNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKSB7Ci0JCUphdmFDbGllbnRNb2R1bGVJbXBsIGphdmFDbGllbnRNb2R1bGUgPSBuZXcgSmF2YUNsaWVudE1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIGphdmFDbGllbnRNb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVqYk1vZHVsZSBjcmVhdGVFamJNb2R1bGUoKSB7Ci0JCUVqYk1vZHVsZUltcGwgZWpiTW9kdWxlID0gbmV3IEVqYk1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIGVqYk1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpIHsKLQkJQ29ubmVjdG9yTW9kdWxlSW1wbCBjb25uZWN0b3JNb2R1bGUgPSBuZXcgQ29ubmVjdG9yTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gY29ubmVjdG9yTW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvblBhY2thZ2UgZ2V0QXBwbGljYXRpb25QYWNrYWdlKCkgewotCQlyZXR1cm4gKEFwcGxpY2F0aW9uUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTAwNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5TdHJpbmdVdGlsOwotCi0KLS8qKgotICogVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEoyRUUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvbnsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtb2R1bGVzID0gbnVsbDsKLQlwdWJsaWMgQXBwbGljYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb24oKTsKLQl9Ci0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbgotICovCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1NlY3VyaXR5Um9sZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmFtZSkgIT0gbnVsbDsKLX0KLXB1YmxpYyBNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB1cmkpIHsKLQlyZXR1cm4gZ2V0Rmlyc3RNb2R1bGUodXJpKTsKLX0KLQotcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHVyaSwgU3RyaW5nIGFsdEREKSB7Ci0JTGlzdCBhbGxNb2R1bGVzID0gZ2V0TW9kdWxlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTW9kdWxlcy5zaXplKCk7IGkrKykgewotCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIGFsbE1vZHVsZXMuZ2V0KGkpOwotCQlpZiAoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwodXJpLCBhTW9kdWxlLmdldFVyaSgpKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChhbHRERCwgYU1vZHVsZS5nZXRBbHRERCgpKSkKLQkJCXJldHVybiBhTW9kdWxlOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBtb2R1bGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cmkKLQkgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgYSBtb2R1bGUgdG8gZmluZC4KLQkgKiBAcmV0dXJuIFRoZSBmaXJzdCBtYXRjaGluZyBtb2R1bGUgb3IgbnVsbCBpZiBubyBtb2R1bGUgaXMgZm91bmQuCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRGaXJzdE1vZHVsZShTdHJpbmcgdXJpKXsKLQkJaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJamF2YS51dGlsLkl0ZXJhdG9yIGFsbE1vZHVsZXMgPSBnZXRNb2R1bGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbE1vZHVsZXMuaGFzTmV4dCgpKXsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSlhbGxNb2R1bGVzLm5leHQoKTsKLQkJCWlmKHVyaS5lcXVhbHMoYU1vZHVsZS5nZXRVcmkoKSkpIHJldHVybiBhTW9kdWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbgotICovCi1wdWJsaWMgTW9kdWxlIGdldE1vZHVsZUhhdmluZ0FsdEREKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7Ci0JaWYgKHVyaSA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQlMaXN0IGFNb2R1bGVzID0gZ2V0TW9kdWxlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgYU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBhTW9kdWxlcy5nZXQoaSk7Ci0JCWlmICh1cmkuZXF1YWxzKGFNb2R1bGUuZ2V0QWx0REQoKSkpCi0JCQlyZXR1cm4gYU1vZHVsZTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZU5hbWVkKFN0cmluZyByb2xlTmFtZSkgewotCWphdmEudXRpbC5MaXN0IHRlbXBSb2xlcyA9IGdldFNlY3VyaXR5Um9sZXMoKTsKLQlTZWN1cml0eVJvbGUgcm9sZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBSb2xlcy5zaXplKCk7IGkrKykgewotCQlyb2xlID0gKFNlY3VyaXR5Um9sZSkgdGVtcFJvbGVzLmdldChpKTsKLQkJaWYgKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMocm9sZU5hbWUpKQotCQkJcmV0dXJuIHJvbGU7Ci0JfQotCXJldHVybiBudWxsOwotfQotCQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxjYXRpb24xLjIgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8yRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMik7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiB3YXMgcG9wdWxhdGVkIGZyb20gYW4gQXBwbGljYXRpb24xLjMgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8zRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMyk7Ci19Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCVRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQkvKioKLQkgKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiBzZWN1cml0eSByb2xlcyB3aGljaCBhcmUKLQkgKiBnbG9iYWwgdG8gdGhlIGFwcGxpY2F0aW9uLiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZXMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNb2R1bGVzKCkgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKSB7Ci0JCQltb2R1bGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoTW9kdWxlLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVMsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNb2R1bGVzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JQ09OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1vZHVsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJcmV0dXJuIGdldE1vZHVsZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZXMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUzoKLQkJCQlyZXR1cm4gbW9kdWxlcyAhPSBudWxsICYmICFtb2R1bGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgotCQkJCWdldE1vZHVsZXMoKS5jbGVhcigpOwotCQkJCWdldE1vZHVsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJZ2V0TW9kdWxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0NWY5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQ29ubmVjdG9yTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25QYWNrYWdlLCBFUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlYk1vZHVsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqYXZhQ2xpZW50TW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYk1vZHVsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25uZWN0b3JNb2R1bGVFQ2xhc3MgPSBudWxsOwotCi0JCSAgIC8qKgotCQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkJICovCi0JcHJpdmF0ZSBBcHBsaWNhdGlvblBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBBcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQXBwbGljYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEFwcGxpY2F0aW9uUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2VJbXBsLmluaXQoKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQXBwbGljYXRpb25QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1vZHVsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX0FsdEREKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWJNb2R1bGUoKSB7Ci0JCXJldHVybiB3ZWJNb2R1bGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViTW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhQ2xpZW50TW9kdWxlKCkgewotCQlyZXR1cm4gamF2YUNsaWVudE1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVqYk1vZHVsZSgpIHsKLQkJcmV0dXJuIGVqYk1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbm5lY3Rvck1vZHVsZSgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rvck1vZHVsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYXBwbGljYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fVkVSU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19NT0RVTEVTKTsKLQotCQltb2R1bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTU9EVUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fQUxUX0REKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fQVBQTElDQVRJT04pOwotCi0JCXdlYk1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfTU9EVUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJNb2R1bGVFQ2xhc3MsIFdFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVCk7Ci0KLQkJamF2YUNsaWVudE1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0NMSUVOVF9NT0RVTEUpOwotCi0JCWVqYk1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTU9EVUxFKTsKLQotCQljb25uZWN0b3JNb2R1bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OTkVDVE9SX01PRFVMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXdlYk1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSk7Ci0JCWphdmFDbGllbnRNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCQllamJNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCQljb25uZWN0b3JNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25FQ2xhc3MsIEFwcGxpY2F0aW9uLmNsYXNzLCAiQXBwbGljYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCksICJtb2R1bGVzIiwgbnVsbCwgMSwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobW9kdWxlRUNsYXNzLCBNb2R1bGUuY2xhc3MsICJNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0FsdEREKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhbHRERCIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldEFwcGxpY2F0aW9uKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSwgImFwcGxpY2F0aW9uIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2ViTW9kdWxlRUNsYXNzLCBXZWJNb2R1bGUuY2xhc3MsICJXZWJNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYk1vZHVsZV9Db250ZXh0Um9vdCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29udGV4dFJvb3QiLCBudWxsLCAwLCAxLCBXZWJNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhQ2xpZW50TW9kdWxlRUNsYXNzLCBKYXZhQ2xpZW50TW9kdWxlLmNsYXNzLCAiSmF2YUNsaWVudE1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGVqYk1vZHVsZUVDbGFzcywgRWpiTW9kdWxlLmNsYXNzLCAiRWpiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29ubmVjdG9yTW9kdWxlRUNsYXNzLCBDb25uZWN0b3JNb2R1bGUuY2xhc3MsICJDb25uZWN0b3JNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JfQotCi19IC8vQXBwbGljYXRpb25QYWNrYWdlSW1wbAotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGIxMWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IHsKLQotCS8qKgotCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8yLCAiYXBwbGljYXRpb25fMV8yLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMywgImFwcGxpY2F0aW9uXzFfMy5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfTE9DXzFfNCwgImFwcGxpY2F0aW9uXzFfNC54c2QiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBtb3ZlZCB0byB0aGUgd2ViIHN2Y3MgSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TQ0hFTUFfTE9DXzFfMSwgImoyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuSjJFRV8xXzRfWFNEX1NIT1JUX05BTUUsIEoyRUVDb25zdGFudHMuSjJFRV8xXzRfWFNEX1NIT1JUX05BTUUpOyAKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotICAgICAgICBzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyKQotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgQXBwbGljYXRpb25SZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwotICAgIH0KLQkvKioKLQkgKiBSZWdpc3RlciBteXNlbGYgd2l0aCB0aGUgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSV9PQkopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWM5NGVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uUmVzb3VyY2UgewotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiBAcGFyYW0gYVJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIEFwcGxpY2F0aW9uUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotICAgICAgICBzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0gICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFSZW5kZXJlcgotICAgICAqLwotICAgIHB1YmxpYyBBcHBsaWNhdGlvblJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLSAgICAgICAgc3VwZXIoYVJlbmRlcmVyKTsKLSAgICB9Ci0JLyoqCi0JKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb24pIGdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEFQUExJQ0FUSU9OX1RZUEU7Ci0JfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7Ci0gICAgCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JCQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRE9DVFlQRTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotICAgIH0KLQkvKiBBcHAgdmVyc2lvbiBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIEoyRUUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLSAgICBwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uVHJhbnNsYXRvci5JTlNUQU5DRTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NZU1RFTUlEXzFfMjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU1lTVEVNSURfMV8zOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9QVUJMSUNJRF8xXzM7Ci0JfQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIChKMkVFXzFfNF9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJfQotCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCX0KLQkJLyoKLQkJICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24oU2FtZSBhcyBKMkVFIFZlcnNpb24gZm9yIEFwcGxpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQkJcHJpbVNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQkJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkJfQotCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCQl9Ci0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5pbXBsLlhNTFJlc291cmNlSW1wbCNzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKSB7Ci0JCUFwcGxpY2F0aW9uIGFwcCA9IGdldEFwcGxpY2F0aW9uKCk7Ci0JCWlmIChhcHAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZyB2ZXJzaW9uID0gYXBwLmdldFZlcnNpb24oKTsKLQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBnZXRNb2R1bGVWZXJzaW9uU3RyaW5nKCk7Ci0JCWlmICghbmV3VmVyc2lvbi5lcXVhbHModmVyc2lvbikpCi0JCQlhcHAuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JNb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMTQ4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotCi0vKioKLSAqIFNwZWNpZmllcyB0aGUgVVJJIG9mIGEgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JNb2R1bGVJbXBsIGV4dGVuZHMgTW9kdWxlSW1wbCBpbXBsZW1lbnRzIENvbm5lY3Rvck1vZHVsZSwgTW9kdWxlewotCi0JcHVibGljIENvbm5lY3Rvck1vZHVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JNb2R1bGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9fQVBQTElDQVRJT04sIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQXBwbGljYXRpb25QYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfX0FQUExJQ0FUSU9OLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUywgQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gZ2V0QWx0REQoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfX1VSSToKLQkJCQlzZXRVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX19BTFRfREQ6Ci0JCQkJc2V0QWx0REQoQUxUX0REX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRV9fQUxUX0REOgotCQkJCXJldHVybiBBTFRfRERfRURFRkFVTFQgPT0gbnVsbCA/IGFsdEREICE9IG51bGwgOiAhQUxUX0REX0VERUZBVUxULmVxdWFscyhhbHRERCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5DT05ORUNUT1JfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdG9yTW9kdWxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLX0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0VqYk1vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRWpiTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTAzYzk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRWpiTW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkVqYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci0KLS8qKgotICogU3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJNb2R1bGVJbXBsIGV4dGVuZHMgTW9kdWxlSW1wbCBpbXBsZW1lbnRzIEVqYk1vZHVsZSwgTW9kdWxlIHsKLQotCXB1YmxpYyBFamJNb2R1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiTW9kdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuRUpCX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQXBwbGljYXRpb25QYWNrYWdlLkVKQl9NT0RVTEVfX0FQUExJQ0FUSU9OLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkVKQl9NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFX19BUFBMSUNBVElPTiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkVKQl9NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVMsIEFwcGxpY2F0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkVKQl9NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIGdldEFsdEREKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkVKQl9NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5FSkJfTU9EVUxFX19VUkk6Ci0JCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuRUpCX01PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKEFMVF9ERF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuRUpCX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJc2V0QXBwbGljYXRpb24oKEFwcGxpY2F0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuRUpCX01PRFVMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkVKQl9NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gQUxUX0REX0VERUZBVUxUID09IG51bGwgPyBhbHRERCAhPSBudWxsIDogIUFMVF9ERF9FREVGQVVMVC5lcXVhbHMoYWx0REQpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuRUpCX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi1wdWJsaWMgYm9vbGVhbiBpc0VqYk1vZHVsZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0phdmFDbGllbnRNb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0phdmFDbGllbnRNb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYTQzYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KYXZhQ2xpZW50TW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotCi0vKioKLSAqIHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ2xpZW50TW9kdWxlSW1wbCBleHRlbmRzIE1vZHVsZUltcGwgaW1wbGVtZW50cyBKYXZhQ2xpZW50TW9kdWxlLCBNb2R1bGUgewotCi0JcHVibGljIEphdmFDbGllbnRNb2R1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsaWVudE1vZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkpBVkFfQ0xJRU5UX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgQXBwbGljYXRpb25QYWNrYWdlLkpBVkFfQ0xJRU5UX01PRFVMRV9fQVBQTElDQVRJT04sIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFX19BUFBMSUNBVElPTiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkpBVkFfQ0xJRU5UX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUywgQXBwbGljYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFX19BTFRfREQ6Ci0JCQkJcmV0dXJuIGdldEFsdEREKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5KQVZBX0NMSUVOVF9NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkpBVkFfQ0xJRU5UX01PRFVMRV9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5KQVZBX0NMSUVOVF9NT0RVTEVfX0FMVF9ERDoKLQkJCQlzZXRBbHRERCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5KQVZBX0NMSUVOVF9NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChBcHBsaWNhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkpBVkFfQ0xJRU5UX01PRFVMRV9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkpBVkFfQ0xJRU5UX01PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKEFMVF9ERF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5KQVZBX0NMSUVOVF9NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5KQVZBX0NMSUVOVF9NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gQUxUX0REX0VERUZBVUxUID09IG51bGwgPyBhbHRERCAhPSBudWxsIDogIUFMVF9ERF9FREVGQVVMVC5lcXVhbHMoYWx0REQpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGlzSmF2YU1vZHVsZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzE1NzVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotCi0KLS8qKgotICogVGhlIG1vZHVsZSBlbGVtZW50IHJlcHJlc2VudHMgYSBzaW5nbGUgSjJFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGFuIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUgbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbiBvcHRpb25hbCBhbHQtZGQgZWxlbWVudCwgd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFIG1vZHVsZSBpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTW9kdWxlLCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRk9SV0FSRF9TTEFTSCA9ICcvJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgQkFDS1dBUkRfU0xBU0ggPSAnXFwnOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRERCgpIDxlbT5BbHQgREQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdEREKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRfRERfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRERCA9IEFMVF9ERF9FREVGQVVMVDsKLQlwdWJsaWMgTW9kdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldE1vZHVsZSgpOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3JNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyogUmV0dXJucyBmYWxzZSBieSBkZWZhdWx0Ci0gKgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0VqYk1vZHVsZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKiAKLSAqIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdAotICovCi1wdWJsaWMgYm9vbGVhbiBpc0phdmFNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyogCi0gKiBSZXR1cm5zIGZhbHNlIGJ5IGRlZmF1bHQKLSAqLwotcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgVVJJIG9mIGEgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gVGhlIFVSSSBtdXN0IHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbidzIHJvb3QgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0REQoKSB7Ci0JCXJldHVybiBhbHRERDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRERChTdHJpbmcgbmV3QWx0REQpIHsKLQkJU3RyaW5nIG9sZEFsdEREID0gYWx0REQ7Ci0JCWFsdEREID0gbmV3QWx0REQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERCwgb2xkQWx0REQsIGFsdEREKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXBwbGljYXRpb24pZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBuZXdBcHBsaWNhdGlvbikgewotCQlpZiAobmV3QXBwbGljYXRpb24gIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTiAmJiBuZXdBcHBsaWNhdGlvbiAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0FwcGxpY2F0aW9uKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdBcHBsaWNhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBcHBsaWNhdGlvbikuZUludmVyc2VBZGQodGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTLCBBcHBsaWNhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3QXBwbGljYXRpb24sIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OLCBuZXdBcHBsaWNhdGlvbiwgbmV3QXBwbGljYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT04sIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVMsIEFwcGxpY2F0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fVVJJOgotCQkJCXJldHVybiBnZXRVcmkoKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOgotCQkJCXJldHVybiBnZXRBbHRERCgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gQUxUX0REX0VERUZBVUxUID09IG51bGwgPyBhbHRERCAhPSBudWxsIDogIUFMVF9ERF9FREVGQVVMVC5lcXVhbHMoYWx0REQpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQUxUX0REOgotCQkJCXNldEFsdEREKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJc2V0QXBwbGljYXRpb24oKEFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk6Ci0JCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BTFRfREQ6Ci0JCQkJc2V0QWx0REQoQUxUX0REX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChBcHBsaWNhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVyaTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJpKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbHRERDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWx0REQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYk1vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBlMTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotCi0KLS8qKgotICogQ29udGFpbnMgdGhlIHdlYi11cmkgYW5kIGNvbnRleHQtcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBtb2R1bGUuCi0KLSAqLwotcHVibGljIGNsYXNzIFdlYk1vZHVsZUltcGwgZXh0ZW5kcyBNb2R1bGVJbXBsIGltcGxlbWVudHMgV2ViTW9kdWxlLCBNb2R1bGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRleHRSb290KCkgPGVtPkNvbnRleHQgUm9vdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGV4dFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUk9PVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHRSb290ID0gQ09OVEVYVF9ST09UX0VERUZBVUxUOwotCXB1YmxpYyBXZWJNb2R1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViTW9kdWxlKCk7Ci0JfQotCi1wdWJsaWMgYm9vbGVhbiBpc1dlYk1vZHVsZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKSB7Ci0JCXJldHVybiBjb250ZXh0Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0Um9vdChTdHJpbmcgbmV3Q29udGV4dFJvb3QpIHsKLQkJU3RyaW5nIG9sZENvbnRleHRSb290ID0gY29udGV4dFJvb3Q7Ci0JCWNvbnRleHRSb290ID0gbmV3Q29udGV4dFJvb3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19DT05URVhUX1JPT1QsIG9sZENvbnRleHRSb290LCBjb250ZXh0Um9vdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19BUFBMSUNBVElPTiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQVBQTElDQVRJT04sIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTLCBBcHBsaWNhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQUxUX0REOgotCQkJCXJldHVybiBnZXRBbHRERCgpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19DT05URVhUX1JPT1Q6Ci0JCQkJcmV0dXJuIGdldENvbnRleHRSb290KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0FMVF9ERDoKLQkJCQlyZXR1cm4gQUxUX0REX0VERUZBVUxUID09IG51bGwgPyBhbHRERCAhPSBudWxsIDogIUFMVF9ERF9FREVGQVVMVC5lcXVhbHMoYWx0REQpOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCkgIT0gbnVsbDsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVDoKLQkJCQlyZXR1cm4gQ09OVEVYVF9ST09UX0VERUZBVUxUID09IG51bGwgPyBjb250ZXh0Um9vdCAhPSBudWxsIDogIUNPTlRFWFRfUk9PVF9FREVGQVVMVC5lcXVhbHMoY29udGV4dFJvb3QpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19BTFRfREQ6Ci0JCQkJc2V0QWx0REQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQVBQTElDQVRJT046Ci0JCQkJc2V0QXBwbGljYXRpb24oKEFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19DT05URVhUX1JPT1Q6Ci0JCQkJc2V0Q29udGV4dFJvb3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19BTFRfREQ6Ci0JCQkJc2V0QWx0REQoQUxUX0REX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UOgotCQkJCXNldENvbnRleHRSb290KENPTlRFWFRfUk9PVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb250ZXh0Um9vdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29udGV4dFJvb3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGYyNDIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLQotCi0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEFwcGxpY2F0aW9uUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KXR5cGUpLmVDbGFzcygpLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBBcHBsaWNhdGlvblN3aXRjaCBzdyA9IG5ldyBBcHBsaWNhdGlvblN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb24oQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNb2R1bGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlV2ViTW9kdWxlKFdlYk1vZHVsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXZWJNb2R1bGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlSmF2YUNsaWVudE1vZHVsZShKYXZhQ2xpZW50TW9kdWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGllbnRNb2R1bGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlRWpiTW9kdWxlKEVqYk1vZHVsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFamJNb2R1bGVBZGFwdGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdG9yTW9kdWxlKENvbm5lY3Rvck1vZHVsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKXN3LmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqLwotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhQ2xpZW50TW9kdWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWpiTW9kdWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29ubmVjdG9yTW9kdWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGVHZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEFwcGxpY2F0aW9uU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb24oQXBwbGljYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViTW9kdWxlKFdlYk1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViTW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YUNsaWVudE1vZHVsZShKYXZhQ2xpZW50TW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhQ2xpZW50TW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRWpiTW9kdWxlKEVqYk1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRWpiTW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdG9yTW9kdWxlKENvbm5lY3Rvck1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29ubmVjdG9yTW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25fTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25fTW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXJHZW4oKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYk1vZHVsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFDbGllbnRNb2R1bGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFamJNb2R1bGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0b3JNb2R1bGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUgPGVtPk1vZHVsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25fTW9kdWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0FwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OGI4MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFwcGxpY2F0aW9uUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OOiB7Ci0JCQkJQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoQXBwbGljYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChhcHBsaWNhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChhcHBsaWNhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFOiB7Ci0JCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEU6IHsKLQkJCQlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKFdlYk1vZHVsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2ViTW9kdWxlKHdlYk1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXBwbGljYXRpb25fTW9kdWxlKHdlYk1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuSkFWQV9DTElFTlRfTU9EVUxFOiB7Ci0JCQkJSmF2YUNsaWVudE1vZHVsZSBqYXZhQ2xpZW50TW9kdWxlID0gKEphdmFDbGllbnRNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFDbGllbnRNb2R1bGUoamF2YUNsaWVudE1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXBwbGljYXRpb25fTW9kdWxlKGphdmFDbGllbnRNb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkVKQl9NT0RVTEU6IHsKLQkJCQlFamJNb2R1bGUgZWpiTW9kdWxlID0gKEVqYk1vZHVsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRWpiTW9kdWxlKGVqYk1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXBwbGljYXRpb25fTW9kdWxlKGVqYk1vZHVsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQ09OTkVDVE9SX01PRFVMRTogewotCQkJCUNvbm5lY3Rvck1vZHVsZSBjb25uZWN0b3JNb2R1bGUgPSAoQ29ubmVjdG9yTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb25uZWN0b3JNb2R1bGUoY29ubmVjdG9yTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbl9Nb2R1bGUoY29ubmVjdG9yTW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBNb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIE1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2ViTW9kdWxlKFdlYk1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgQ2xpZW50IE1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIENsaWVudCBNb2R1bGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUphdmFDbGllbnRNb2R1bGUoSmF2YUNsaWVudE1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVqYiBNb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWpiIE1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRWpiTW9kdWxlKEVqYk1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbm5lY3RvciBNb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdG9yIE1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdG9yTW9kdWxlKENvbm5lY3Rvck1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25fTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQXBwbGljYXRpb25Td2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmJhYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBtb2RlbCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSBqMmVlIEFwcGxpY2F0aW9uIG1vZHVsZSBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYW4gQXBwbGljYXRpb24KLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQXBwbGljYXRpb25DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkZjUzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQXBwbGljYXRpb25DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cyBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ2xpZW50IGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXB7Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKCk7Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiBDbGllbnQgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxpY2F0aW9uIENsaWVudCAxLjIgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8yRGVzY3JpcHRvcigpOwotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgQXBwbGljYXRpb24gY2xpZW50IHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgMS4zIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfM0Rlc2NyaXB0b3IoKTsKLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzREZXNjcmlwdG9yKCk7Ci1wdWJsaWMgdm9pZCBzZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoU3RyaW5nIGNhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBSZXNvdXJjZVJlZnMgcmVmZXJlbmNlcwotCSAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50cydzIHJlZmVyZW5jZXMgdG8gYW4gZXh0ZXJuYWwKLQkgKiByZXNvdXJjZXMuCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCS8qKgotCSAqVGhpcyByZXR1cm5zIHRoZSBqMmVlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgajJlZSBsZXZlbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFbnZpcm9ubWVudFByb3BzIHJlZmVyZW5jZXMKLQkgKiBUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi0JICogZW52aXJvbm1lbnQgZW50cmllcy4gRWFjaCBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi0JICogbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLQkgKi8KLQlFTGlzdCBnZXRFbnZpcm9ubWVudFByb3BzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVqYlJlZmVyZW5jZXMgcmVmZXJlbmNlcwotCSAqIENvbnRhaW5zIGEgbGlzdCBvZiBlamItcmVmIGVsZW1lbnRzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotCSAqIGFuIGVudGVycHJpc2UKLQkgKiBiZWFuJ3MgaG9tZS4gCi0JICovCi0JRUxpc3QgZ2V0RWpiUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBSZXNvdXJjZUVudlJlZnMgcmVmZXJlbmNlcwotCSAqIFRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotCSAqIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLQkgKiBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUKLQkgKiByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuCi0JICogCi0JICogVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0JICogCi0JICogRXhhbXBsZToKLQkgKiAKLQkgKiA8cmVzb3VyY2UtZW52LXJlZj4KLQkgKiAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvL1N0b2NrUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0JICogICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC8vcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAqIDwvL3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgKi8KLQlFTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIENhbGxiYWNrSGFuZGxlciByZWZlcmVuY2UKLQkgKiBBIGNsYXNzIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIAotCSAqIGFuZCBtdXN0IGltcGxlbWVudCB0aGUgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIgaW50ZXJmYWNlLiAgCi0JICogVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5Ci0JICogdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0JICovCi0JSmF2YUNsYXNzIGdldENhbGxiYWNrSGFuZGxlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ2FsbGJhY2tIYW5kbGVyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0Q2FsbGJhY2tIYW5kbGVyKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFNlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUKLQkgKiAgICAgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgKiAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUKLQkgKiAgICAgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICogICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlCi0JICogICAgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTI0ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSBleHRlbmRzIFhNTFJlc291cmNlIHsKLXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBnZXRBcHBsaWNhdGlvbkNsaWVudCgpIDsKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQ2xpZW50RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0NsaWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzMmM3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvQ2xpZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNsaWVudEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudEZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50IHZhbHVlCi0JICovCi0JQXBwbGljYXRpb25DbGllbnQgY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUNsaWVudFBhY2thZ2UgZ2V0Q2xpZW50UGFja2FnZSgpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0NsaWVudFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9DbGllbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDA0ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L0NsaWVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJjbGllbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVCA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRkVSRU5DRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LlJlc0F1dGhBcHBsaWNhdGlvblR5cGUgPGVtPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5SZXNBdXRoQXBwbGljYXRpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbCNnZXRSZXNBdXRoQXBwbGljYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEUgPSAxOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJjbGllbnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2xpZW50UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRTZXJ2aWNlUmVmcygpCi0JICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSA8ZW0+UmVzIEF1dGggQXBwbGljYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRSZXNBdXRoQXBwbGljYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlDbGllbnRGYWN0b3J5IGdldENsaWVudEZhY3RvcnkoKTsKLQotfSAvL0NsaWVudFBhY2thZ2UKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9SZXNBdXRoQXBwbGljYXRpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvUmVzQXV0aEFwcGxpY2F0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTFhZTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9SZXNBdXRoQXBwbGljYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNBdXRoQXBwbGljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVBQTElDQVRJT05fTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJBcHBsaWNhdGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVJfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJDb250YWluZXIiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFJTkVSID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVBQTElDQVRJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUgQVBQTElDQVRJT05fTElURVJBTCA9IG5ldyBSZXNBdXRoQXBwbGljYXRpb25UeXBlKEFQUExJQ0FUSU9OLCAiQXBwbGljYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBSZXNBdXRoQXBwbGljYXRpb25UeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggQXBwbGljYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNBdXRoQXBwbGljYXRpb25UeXBlW10gewotCQkJQVBQTElDQVRJT05fTElURVJBTCwKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNBdXRoQXBwbGljYXRpb25UeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIEFwcGxpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQVBQTElDQVRJT046IHJldHVybiBBUFBMSUNBVElPTl9MSVRFUkFMOwotCQkJY2FzZSBDT05UQUlORVI6IHJldHVybiBDT05UQUlORVJfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9SZXNBdXRoQXBwbGljYXRpb25UeXBlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzMyMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci0KLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cyBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25DbGllbnQgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52aXJvbm1lbnRQcm9wcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZmVyZW5jZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgY2FsbGJhY2tIYW5kbGVyID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLQl9Ci0KLS8qKgotICogY3JlYXRlQ2xhc3NSZWYgLSByZXR1cm4gYSBKYXZhVVJMIHJlZmVyZW5jZSB0byB0aGUgbmFtZWQgSmF2YSBjbGFzcwotICovCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKCkgewotCWdldENhbGxiYWNrSGFuZGxlcigpOwotCXJldHVybiAoY2FsbGJhY2tIYW5kbGVyID09IG51bGwpID8gbnVsbCA6IGNhbGxiYWNrSGFuZGxlci5nZXRRdWFsaWZpZWROYW1lKCk7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBBcHBsaWNhdGlvbiBDbGllbnQgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEFwcGxpY2F0aW9uIENsaWVudCAxLjIgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8yRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8yKTsKLX0KLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEFwcGxpY2F0aW9uIGNsaWVudCB3YXMgcG9wdWxhdGVkIGZyb20gYW4gQXBwbGljYXRpb24gQ2xpZW50IDEuMyBjb21wbGlhbnQgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzNEZXNjcmlwdG9yKCkgewotCUNvbW1vblV0aWwuY2hlY2tERE9iamVjdEZvclZlcnNpb24odGhpcyk7Ci0JU3RyaW5nIHN5c3RlbUlkID0gKChYTUxSZXNvdXJjZSllUmVzb3VyY2UoKSkuZ2V0U3lzdGVtSWQoKTsKLQlyZXR1cm4gc3lzdGVtSWQgPT0gbnVsbCA/IGZhbHNlIDogc3lzdGVtSWQuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzMpOwotfQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb24xXzREZXNjcmlwdG9yKCkgewotCXJldHVybiB2ZXJzaW9uICE9IG51bGwgJiYgSjJFRUNvbnN0YW50cy5KMkVFXzFfNF9URVhULmVxdWFscyh2ZXJzaW9uKTsKLX0KLXB1YmxpYyB2b2lkIHNldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZShTdHJpbmcgY2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKSB7Ci0JZVNldChDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKSwgY3JlYXRlQ2xhc3NSZWYoY2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKSk7Ci19Ci0vKioKLSAqVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotfQotLyoqCi0gKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLSAqLwotcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JaWYgKHJlcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JcmV0dXJuIHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci19Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGllbnRzJ3MgcmVmZXJlbmNlcyB0byBhbiBleHRlcm5hbAotCSAqIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2VSZWZzKCkgewotCQlpZiAocmVzb3VyY2VSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZVJlZi5jbGFzcywgdGhpcywgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotCSAqIGVudmlyb25tZW50IGVudHJpZXMuIEVhY2ggZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotCSAqIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudmlyb25tZW50UHJvcHMoKSB7Ci0JCWlmIChlbnZpcm9ubWVudFByb3BzID09IG51bGwpIHsKLQkJCWVudmlyb25tZW50UHJvcHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRW52RW50cnkuY2xhc3MsIHRoaXMsIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZJUk9OTUVOVF9QUk9QUyk7Ci0JCX0KLQkJcmV0dXJuIGVudmlyb25tZW50UHJvcHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgYSBsaXN0IG9mIGVqYi1yZWYgZWxlbWVudHMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCi0JICogYW4gZW50ZXJwcmlzZQotCSAqIGJlYW4ncyBob21lLiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RWpiUmVmZXJlbmNlcygpIHsKLQkJaWYgKGVqYlJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZWpiUmVmZXJlbmNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJSZWYuY2xhc3MsIHRoaXMsIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGRVJFTkNFUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi0JICogcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlCi0JICogYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotCSAqIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIHRoZQotCSAqIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4KLQkgKiAKLQkgKiBVc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLQkgKiAKLQkgKiBFeGFtcGxlOgotCSAqIAotCSAqIDxyZXNvdXJjZS1lbnYtcmVmPgotCSAqICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy8vU3RvY2tRdWV1ZTwvL3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLQkgKiAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8Ly9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0JICogPC8vcmVzb3VyY2UtZW52LXJlZj4KLQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKSB7Ci0JCWlmIChyZXNvdXJjZUVudlJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFbnZSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlRW52UmVmLmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQSBjbGFzcyBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGUgY2xhc3MgbXVzdCBoYXZlIGEgbm8gYXJncyBjb25zdHJ1Y3RvciBhbmQgbXVzdCBpbXBsZW1lbnQgdGhlIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyIGludGVyZmFjZS4gIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvbnRhaW5lciBhbmQgdXNlZCBieSB0aGUgY29udGFpbmVyIHRvIGNvbGxlY3QgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldENhbGxiYWNrSGFuZGxlcigpIHsKLQkJaWYgKGNhbGxiYWNrSGFuZGxlciAhPSBudWxsICYmIGNhbGxiYWNrSGFuZGxlci5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkQ2FsbGJhY2tIYW5kbGVyID0gY2FsbGJhY2tIYW5kbGVyOwotCQkJY2FsbGJhY2tIYW5kbGVyID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpY2FsbGJhY2tIYW5kbGVyKTsKLQkJCWlmIChjYWxsYmFja0hhbmRsZXIgIT0gb2xkQ2FsbGJhY2tIYW5kbGVyKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIsIG9sZENhbGxiYWNrSGFuZGxlciwgY2FsbGJhY2tIYW5kbGVyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhbGxiYWNrSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0Q2FsbGJhY2tIYW5kbGVyKCkgewotCQlyZXR1cm4gY2FsbGJhY2tIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGxiYWNrSGFuZGxlcihKYXZhQ2xhc3MgbmV3Q2FsbGJhY2tIYW5kbGVyKSB7Ci0JCWlmICgoY2FsbGJhY2tIYW5kbGVyID09IG51bGwgfHwgY2FsbGJhY2tIYW5kbGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PSBudWxsKQotCQkJCSYmIChuZXdDYWxsYmFja0hhbmRsZXIgPT0gbnVsbCB8fCBuZXdDYWxsYmFja0hhbmRsZXIuZ2V0UXVhbGlmaWVkTmFtZSgpID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSmF2YUNsYXNzIG9sZENhbGxiYWNrSGFuZGxlciA9IGNhbGxiYWNrSGFuZGxlcjsKLQkJY2FsbGJhY2tIYW5kbGVyID0gbmV3Q2FsbGJhY2tIYW5kbGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUiwgb2xkQ2FsbGJhY2tIYW5kbGVyLCBjYWxsYmFja0hhbmRsZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VydmljZVJlZnMoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gc2VydmljZVJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25SZWZzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCB0aGlzLCBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvbnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsIHRoaXMsIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUNPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52aXJvbm1lbnRQcm9wcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRkVSRU5DRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmZXJlbmNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZJUk9OTUVOVF9QUk9QUzoKLQkJCQlyZXR1cm4gZ2V0RW52aXJvbm1lbnRQcm9wcygpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRkVSRU5DRVM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVI6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRDYWxsYmFja0hhbmRsZXIoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRDYWxsYmFja0hhbmRsZXIoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIExBUkdFX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IGxhcmdlSWNvbiAhPSBudWxsIDogIUxBUkdFX0lDT05fRURFRkFVTFQuZXF1YWxzKGxhcmdlSWNvbik7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZJUk9OTUVOVF9QUk9QUzoKLQkJCQlyZXR1cm4gZW52aXJvbm1lbnRQcm9wcyAhPSBudWxsICYmICFlbnZpcm9ubWVudFByb3BzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZFUkVOQ0VTOgotCQkJCXJldHVybiBlamJSZWZlcmVuY2VzICE9IG51bGwgJiYgIWVqYlJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRW52UmVmcyAhPSBudWxsICYmICFyZXNvdXJjZUVudlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fQ0FMTEJBQ0tfSEFORExFUjoKLQkJCQlyZXR1cm4gY2FsbGJhY2tIYW5kbGVyICE9IG51bGw7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmcyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25SZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WSVJPTk1FTlRfUFJPUFM6Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRkVSRU5DRVM6Ci0JCQkJZ2V0RWpiUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmZXJlbmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVI6Ci0JCQkJc2V0Q2FsbGJhY2tIYW5kbGVyKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZJUk9OTUVOVF9QUk9QUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGRVJFTkNFUzoKLQkJCQlnZXRFamJSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVI6Ci0JCQkJc2V0Q2FsbGJhY2tIYW5kbGVyKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjMDNjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkgewotCi0JLyoqCi0JICogTWV0aG9kIHJlZ2lzdGVyRHRkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgewotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMiwgImFwcGxpY2F0aW9uLWNsaWVudF8xXzIuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzMsICJhcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BX0xPQ18xXzQsICJhcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCIpOyAvLyROT04tTkxTLTEkCi0JCQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS4KLQkgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSwgUmVuZGVyZXIpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCWFSZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJX09CSik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZDFjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VJbXBsLgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gYVJlbmRlcmVyCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VJbXBsLgotCSAqIEBwYXJhbSBhUmVuZGVyZXIKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwbGljYXRpb25DbGllbnQoKSB7Ci0JCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpIGdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLQkKLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBBUFBfQ0xJRU5UX1RZUEU7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzI7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMzsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIHsKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgkKLQkJCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0RPQ1RZUEU7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldFJvb3RUcmFuc2xhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uQ2xpZW50VHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQkvKiBBcHAgY2xpZW50IHZlcnNpb24gaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBKMkVFIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0JLyogCi0JICogVGhpcyBkaXJlY3RseSBzZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpIHsKLQkJc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKLQkJc3dpdGNoIChpZCkgewotCQkJCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JfQotCQkvKgotCQkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbihTYW1lIGFzIEoyRUUgVmVyc2lvbiBmb3IgQXBwIGNsaWVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXByaW1TZXRWZXJzaW9uSUQoaWQpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJCX0KLQkJCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uaW1wbC5YTUxSZXNvdXJjZUltcGwjc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkgewotCQlBcHBsaWNhdGlvbkNsaWVudCBjbHQgPSBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCQlpZiAoY2x0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCVN0cmluZyB2ZXJzaW9uID0gY2x0LmdldFZlcnNpb24oKTsKLQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBnZXRNb2R1bGVWZXJzaW9uU3RyaW5nKCk7Ci0JCWlmICghbmV3VmVyc2lvbi5lcXVhbHModmVyc2lvbikpCi0JCQljbHQuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50RmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0NsaWVudEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MmZkMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50RmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIENsaWVudEZhY3Rvcnl7Ci0gCi0JcHVibGljIENsaWVudEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOyAJCQotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVDogcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDbGllbnRQYWNrYWdlLlJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEU6IHsKLQkJCQlSZXNBdXRoQXBwbGljYXRpb25UeXBlIHJlc3VsdCA9IFJlc0F1dGhBcHBsaWNhdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuUkVTX0FVVEhfQVBQTElDQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotcHVibGljIHN0YXRpYyBDbGllbnRGYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIChDbGllbnRGYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudCBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJQXBwbGljYXRpb25DbGllbnRJbXBsIGFwcGxpY2F0aW9uQ2xpZW50ID0gbmV3IEFwcGxpY2F0aW9uQ2xpZW50SW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYXRpb25DbGllbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENsaWVudFBhY2thZ2UgZ2V0Q2xpZW50UGFja2FnZSgpIHsKLQkJcmV0dXJuIChDbGllbnRQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGllbnRQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0NsaWVudFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9DbGllbnRQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQ0ZTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0NsaWVudFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5SZXNBdXRoQXBwbGljYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDbGllbnRQYWNrYWdlLCBFUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXBwbGljYXRpb25DbGllbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSByZXNBdXRoQXBwbGljYXRpb25UeXBlRUVudW0gPSBudWxsOwotCi0JCSAgIC8qKgotCQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkJICovCi0JcHJpdmF0ZSBDbGllbnRQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgQ2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xpZW50UGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQ2xpZW50UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IENsaWVudFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0JCUphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUNsaWVudFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUNsaWVudFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRW52aXJvbm1lbnRQcm9wcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UmVzQXV0aEFwcGxpY2F0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHJlc0F1dGhBcHBsaWNhdGlvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xpZW50RmFjdG9yeSBnZXRDbGllbnRGYWN0b3J5KCkgewotCQlyZXR1cm4gKENsaWVudEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYXBwbGljYXRpb25DbGllbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT05fQ0xJRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19FTlZJUk9OTUVOVF9QUk9QUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRkVSRU5DRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlyZXNBdXRoQXBwbGljYXRpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShSRVNfQVVUSF9BUFBMSUNBVElPTl9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZUltcGwgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICJBcHBsaWNhdGlvbkNsaWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZpcm9ubWVudFByb3BzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudmlyb25tZW50UHJvcHMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZmVyZW5jZXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRFamJSZWYoKSwgbnVsbCwgImVqYlJlZmVyZW5jZXMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImNhbGxiYWNrSGFuZGxlciIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpLCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHJlc0F1dGhBcHBsaWNhdGlvblR5cGVFRW51bSwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZS5jbGFzcywgIlJlc0F1dGhBcHBsaWNhdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhBcHBsaWNhdGlvblR5cGVFRW51bSwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZS5BUFBMSUNBVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhBcHBsaWNhdGlvblR5cGVFRW51bSwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZS5DT05UQUlORVJfTElURVJBTCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL0NsaWVudFBhY2thZ2VJbXBsCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvdXRpbC9DbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL3V0aWwvQ2xpZW50QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlM2M5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvdXRpbC9DbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgQ2xpZW50UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwdWJsaWMgQ2xpZW50QWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gKENsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KXR5cGUpLmVDbGFzcygpLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDbGllbnRTd2l0Y2ggc3cgPSBuZXcgQ2xpZW50U3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudChBcHBsaWNhdGlvbkNsaWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpc3cuZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGllbnRTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQ2xpZW50U3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEFkYXB0ZXJHZW4oKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQ2xpZW50QWRhcHRlckZhY3RvcnkKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvdXRpbC9DbGllbnRTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVlMWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENsaWVudFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDbGllbnRQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2xpZW50U3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UOiB7Ci0JCQkJQXBwbGljYXRpb25DbGllbnQgYXBwbGljYXRpb25DbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50KGFwcGxpY2F0aW9uQ2xpZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChhcHBsaWNhdGlvbkNsaWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChhcHBsaWNhdGlvbkNsaWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0NsaWVudFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2QxZjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgajJlZSBBcHBsaWNhdGlvbiBDbGllbnQgbW9kdWxlIG1vZGVsIGFwaS4gVXNpbmcgdGhpcyBhcGkgdGhlIGFydGlmYWN0cyBvZiBhbiBBcHBsaWNhdGlvbiBDbGllbnQgYXBwCi0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21tb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tbW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhjNDZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21tb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbW1vbkZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vbkZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVqYiBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVqYiBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVqYlJlZiBjcmVhdGVFamJSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW52IEVudHJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnYgRW50cnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVudkVudHJ5IGNyZWF0ZUVudkVudHJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZVJlZiBjcmVhdGVSZXNvdXJjZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3VyaXR5Um9sZVJlZiBjcmVhdGVTZWN1cml0eVJvbGVSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdXJpdHlSb2xlIGNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZUVudlJlZiBjcmVhdGVSZXNvdXJjZUVudlJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgTG9jYWwgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgTG9jYWwgUmVmPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFSkJMb2NhbFJlZiBjcmVhdGVFSkJMb2NhbFJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSdW5Bc1NwZWNpZmllZElkZW50aXR5IGNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklkZW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJZGVudGl0eSBjcmVhdGVJZGVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JY29uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkljb24gVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSWNvblR5cGUgY3JlYXRlSWNvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpc3BsYXlOYW1lIGNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWVzc2FnZURlc3RpbmF0aW9uUmVmIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXNzYWdlRGVzdGluYXRpb24gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFyYW1WYWx1ZSBjcmVhdGVQYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRpb25Hcm91cCBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdXJpdHlJZGVudGl0eSBjcmVhdGVTZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVzZUNhbGxlcklkZW50aXR5IGNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UU5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlFOYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlRTmFtZSBjcmVhdGVRTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGlzdGVuZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbW1vblBhY2thZ2UgZ2V0Q29tbW9uUGFja2FnZSgpOwotCi19IC8vQ29tbW9uRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0NvbW1vblBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21tb25QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDlkNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0NvbW1vblBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vblBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJjb21tb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRSA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRiA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUYgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVGX19OQU1FID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFRl9fVFlQRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfX0hPTUUgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVGX19SRU1PVEUgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVGX19MSU5LID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFRl9fREVTQ1JJUFRJT04gPSA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUZfX0RFU0NSSVBUSU9OUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVqYiBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFRl9GRUFUVVJFX0NPVU5UID0gNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRiA9IDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVl9FTlRSWSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVl9FTlRSWV9fREVTQ1JJUFRJT04gPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlZfRU5UUllfX05BTUUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlZfRU5UUllfX1ZBTFVFID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5WX0VOVFJZX19UWVBFID0gMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfX0RFU0NSSVBUSU9OUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudiBFbnRyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlZfRU5UUllfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fTkFNRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fVFlQRSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fQVVUSCA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fTElOSyA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUgPSA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TID0gNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVzb3VyY2UgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX1JFRl9GRUFUVVJFX0NPVU5UID0gNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX1JFRiA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9SRUZfX0xJTksgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX1JFRl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRSA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJVTl9BU19TUEVDSUZJRURfSURFTlRJVFkgPSA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWSA9IDE2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVU0VfQ0FMTEVSX0lERU5USVRZID0gMTc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElERU5USVRZID0gODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRiA9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9FTlZfUkVGX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX05BTUUgPSBFSkJfUkVGX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19UWVBFID0gRUpCX1JFRl9fVFlQRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fSE9NRSA9IEVKQl9SRUZfX0hPTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX1JFTU9URSA9IEVKQl9SRUZfX1JFTU9URTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fTElOSyA9IEVKQl9SRUZfX0xJTks7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OID0gRUpCX1JFRl9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT05TID0gRUpCX1JFRl9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FID0gRUpCX1JFRl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9MT0NBTF9SRUZfX0xPQ0FMID0gRUpCX1JFRl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RUpCIExvY2FsIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX0ZFQVRVUkVfQ09VTlQgPSBFSkJfUkVGX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT05TID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfSURFTlRJVFlfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fREVTQ1JJUFRJT04gPSBTRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19ERVNDUklQVElPTlMgPSBTRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZID0gU0VDVVJJVFlfSURFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfRkVBVFVSRV9DT1VOVCA9IFNFQ1VSSVRZX0lERU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElERU5USVRZX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElERU5USVRZX19ST0xFX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSURFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklkZW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElERU5USVRZX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5JY29uVHlwZUltcGwgPGVtPkljb24gVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkljb25UeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUNPTl9UWVBFID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUNPTl9UWVBFX19TTUFMTF9JQ09OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUNPTl9UWVBFX19MQVJHRV9JQ09OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUNPTl9UWVBFX19MQU5HID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SWNvbiBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElDT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU1BMQVlfTkFNRSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfX0xBTkcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTUExBWV9OQU1FX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNQTEFZX05BTUVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0xJTksgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT04gPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwgPGVtPlBhcmFtIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFSQU1fVkFMVUUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25Hcm91cEltcGwgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25Hcm91cEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERlc2NyaXB0aW9uR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fR1JPVVAgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUCA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUyA9IERFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTID0gREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMgPSBERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT04gPSBERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX1NNQUxMX0lDT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19MQVJHRV9JQ09OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9fVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJBTV9WQUxVRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwgPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGwjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKTkRJX0VOVl9SRUZTX0dST1VQID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+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+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVU0VfQ0FMTEVSX0lERU5USVRZX19ERVNDUklQVElPTiA9IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVTRV9DQUxMRVJfSURFTlRJVFlfX0RFU0NSSVBUSU9OUyA9IFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFX0NBTExFUl9JREVOVElUWV9GRUFUVVJFX0NPVU5UID0gU0VDVVJJVFlfSURFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX19MQU5HID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGwgPGVtPlFOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBRTkFNRSA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRTkFNRV9fTkFNRVNQQUNFX1VSSSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFOQU1FX19MT0NBTF9QQVJUID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFOQU1FX19DT01CSU5FRF9RTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UU5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUU5BTUVfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbCA8ZW0+TGlzdGVuZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5MaXN0ZW5lckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsI2dldExpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExJU1RFTkVSID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19JQ09OUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19ESVNQTEFZX05BTUVTID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19ERVNDUklQVElPTlMgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19TTUFMTF9JQ09OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0xBUkdFX0lDT04gPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0RFU0NSSVBUSU9OID0gQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElTVEVORVJfX0RJU1BMQVlfTkFNRSA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX19MSVNURU5FUl9DTEFTUyA9IENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkxpc3RlbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJU1RFTkVSX0ZFQVRVUkVfQ09VTlQgPSBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUZfVFlQRSA9IDI0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlZfRU5UUllfVFlQRSA9IDIyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNfQVVUSF9UWVBFX0JBU0UgPSAyMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTX1NIQVJJTkdfU0NPUEVfVFlQRSA9IDI1OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFID0gMjY7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImNvbW1vbi54bWkiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21tb25QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2VjdXJpdHlSb2xlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTZWN1cml0eVJvbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGUjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmVzb3VyY2VSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFJlc291cmNlUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9BdXRoKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX0xpbmsoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVqYlJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RWpiUmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9Ib21lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVqYlJlZl9SZW1vdGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0xpbmsoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEVqYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJMb2NhbFJlZiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCTG9jYWxSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmI2dldExvY2FsSG9tZSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2FsIEhvbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWYjZ2V0TG9jYWxIb21lKCkKLQkgKiBAc2VlICNnZXRFSkJMb2NhbFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCTG9jYWxSZWZfTG9jYWxIb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZiNnZXRMb2NhbCA8ZW0+TG9jYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZiNnZXRMb2NhbCgpCi0JICogQHNlZSAjZ2V0RUpCTG9jYWxSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQkxvY2FsUmVmX0xvY2FsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVudkVudHJ5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFbnZFbnRyeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudkVudHJ5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudkVudHJ5X1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnkjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEVudkVudHJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2VjdXJpdHlSb2xlUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTZWN1cml0eVJvbGVSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFNlY3VyaXR5Um9sZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSdW5Bc1NwZWNpZmllZElkZW50aXR5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfSWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2VjdXJpdHlJZGVudGl0eSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdXJpdHlJZGVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHkjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlJZGVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVXNlQ2FsbGVySWRlbnRpdHkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFVzZUNhbGxlcklkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24jZ2V0TGFuZygpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0aW9uX0xhbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRpb25fVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UU5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFFOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQHNlZSAjZ2V0UU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFFOYW1lX05hbWVzcGFjZVVSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TG9jYWxQYXJ0IDxlbT5Mb2NhbCBQYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYWwgUGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRMb2NhbFBhcnQoKQotCSAqIEBzZWUgI2dldFFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRRTmFtZV9Mb2NhbFBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldENvbWJpbmVkUU5hbWUgPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tYmluZWQgUU5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0Q29tYmluZWRRTmFtZSgpCi0JICogQHNlZSAjZ2V0UU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFFOYW1lX0NvbWJpbmVkUU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldEludGVybmFsUHJlZml4T3JOc1VSSSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkKLQkgKiBAc2VlICNnZXRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIgPGVtPkxpc3RlbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxpc3RlbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIjZ2V0TGlzdGVuZXJDbGFzcyA8ZW0+TGlzdGVuZXIgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5MaXN0ZW5lciBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lciNnZXRMaXN0ZW5lckNsYXNzKCkKLQkgKiBAc2VlICNnZXRMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIDxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldFNtYWxsSWNvbigpCi0JICogQHNlZSAjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRMYXJnZUljb24oKQotCSAqIEBzZWUgI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBzZWUgI2dldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBJZGVudGl0eSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SWRlbnRpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHkjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldElkZW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJZGVudGl0eV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkljb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SWNvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNtYWxsIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0U21hbGxJY29uKCkKLQkgKiBAc2VlICNnZXRJY29uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SWNvblR5cGVfU21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldExhcmdlSWNvbigpCi0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEljb25UeXBlX0xhcmdlSWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0TGFuZygpCi0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEljb25UeXBlX0xhbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lI2dldExhbmcoKQotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNwbGF5TmFtZV9MYW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc3BsYXlOYW1lX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRVc2FnZSA8ZW0+VXNhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VXNhZ2UoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1VzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldExpbmsoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUgPGVtPlBhcmFtIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQYXJhbVZhbHVlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdGlvbkdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JY29uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldEljb25zKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZXNjcmlwdGlvbkdyb3VwX0ljb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbkdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCA8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEpORElFbnZSZWZzR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMgPGVtPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldEpORElFbnZSZWZzR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0UmVzb3VyY2VSZWZzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgUmVmczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldEVqYlJlZnMoKQotCSAqIEBzZWUgI2dldEpORElFbnZSZWZzR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0RWpiTG9jYWxSZWZzKCkKLQkgKiBAc2VlICNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0VqYkxvY2FsUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCi0JICogQHNlZSAjZ2V0Sk5ESUVudlJlZnNHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBzZWUgI2dldEpORElFbnZSZWZzR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmVzb3VyY2VFbnZSZWYgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFJlc291cmNlRW52UmVmKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VFbnZSZWZfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFamJSZWZUeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldEVqYlJlZlR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRW52RW50cnlUeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldEVudkVudHJ5VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSZXNBdXRoVHlwZUJhc2Ugb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0UmVzQXV0aFR5cGVCYXNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJlc1NoYXJpbmdTY29wZVR5cGUgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JQ29tbW9uRmFjdG9yeSBnZXRDb21tb25GYWN0b3J5KCk7Ci0KLX0gLy9Db21tb25QYWNrYWdlCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTgzNjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTbWFsbEljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNtYWxsSWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHZhbHVlKTsKLQotCXZvaWQgc2V0U21hbGxJY29uR2VuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhcmdlSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgdmFsdWUpOwotCi0Jdm9pZCBzZXRMYXJnZUljb25HZW4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCXZvaWQgc2V0RGVzY3JpcHRpb25HZW4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlzcGxheU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgdmFsdWUpOwotCi0Jdm9pZCBzZXREaXNwbGF5TmFtZUdlbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVwbG95bWVudEV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0RlcGxveW1lbnRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2MzQxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVwbG95bWVudEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlcGxveW1lbnQgRXh0ZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXBsb3ltZW50RXh0ZW5zaW9uI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRGVwbG95bWVudEV4dGVuc2lvbiNpc011c3RVbmRlcnN0YW5kIDxlbT5NdXN0IFVuZGVyc3RhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXBsb3ltZW50RXh0ZW5zaW9uI2dldEV4dGVuc2lvbkVsZW1lbnRzIDxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlcGxveW1lbnRFeHRlbnNpb24oKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcGxveW1lbnRFeHRlbnNpb24gZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWVzcGFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXBsb3ltZW50RXh0ZW5zaW9uX05hbWVzcGFjZSgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRGVwbG95bWVudEV4dGVuc2lvbiNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVzdCBVbmRlcnN0YW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdXN0IFVuZGVyc3RhbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVzdCBVbmRlcnN0YW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNdXN0VW5kZXJzdGFuZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9NdXN0VW5kZXJzdGFuZCgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTXVzdFVuZGVyc3RhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5EZXBsb3ltZW50RXh0ZW5zaW9uI2lzTXVzdFVuZGVyc3RhbmQgPGVtPk11c3QgVW5kZXJzdGFuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVzdCBVbmRlcnN0YW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc011c3RVbmRlcnN0YW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNdXN0VW5kZXJzdGFuZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuc2lvbiBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5FeHRlbnNpYmxlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXBsb3ltZW50RXh0ZW5zaW9uX0V4dGVuc2lvbkVsZW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkV4dGVuc2libGVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuc2lvbkVsZW1lbnRzKCk7Ci0KLX0gLy8gRGVwbG95bWVudEV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNzlmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLSAqIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cwotICogdGhhdCB1c2UgdGhpcyB0eXBlIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotICogRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotICogdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIERlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUKLSAqIHRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLSAqIHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLSAqIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLSAqIAotICogVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0gKiBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaXB0aW9uIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25fTGFuZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24jZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFuZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREZXNjcmlwdGlvbl9WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVzY3JpcHRpb25Hcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0Rlc2NyaXB0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMzBjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGVzY3JpcHRpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb24gR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIGRlc2NyaXB0aW9uIHJlbGF0ZWQKLSAqIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uR3JvdXAoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRpb25Hcm91cCBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uR3JvdXBfSWNvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJY29ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfSAvLyBEZXNjcmlwdGlvbkdyb3VwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRGlzcGxheU5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9EaXNwbGF5TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDc2MjlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9EaXNwbGF5TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLSAqIHRvIGJlIGRpc3BsYXllZCBieSB0b29scy4gSXQgaXMgdXNlZCBieSBkaXNwbGF5LW5hbWUKLSAqIGVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0gKiAKLSAqIEV4YW1wbGU6Ci0gKiAKLSAqIC4uLgotICogICAgPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPkVtcGxveWVlIFNlbGYgU2VydmljZTwvZGlzcGxheS1uYW1lPgotICogCi0gKiBUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXREaXNwbGF5TmFtZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNwbGF5TmFtZSBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFuZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldERpc3BsYXlOYW1lX0xhbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGFuZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lI2dldExhbmcgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0RGlzcGxheU5hbWVfVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEaXNwbGF5TmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VKQkxvY2FsUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRUpCTG9jYWxSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmODRlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRUpCTG9jYWxSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLQotCi0KLS8qKgotICogVGhlIGVqYi1sb2NhbC1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgcmVmZXJlbmNpbmcgZW50ZXJwcmlzZSBiZWFuOyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgYW5kIGFuIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLiBUaGUgb3B0aW9uYWwgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotICogVXNlZCBpbjogZW50aXR5LCBzZXNzaW9uLCBtZXNzYWdlLWRyaXZlbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkxvY2FsUmVmIGV4dGVuZHMgRWpiUmVmewotCi0JLyoqCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExvY2FsIGF0dHJpYnV0ZQotCSAqIFRoZSBMb2NhbCBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWwoKTsKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWxIb21lIGF0dHJpYnV0ZQotCSAqIFRoZSBsb2NhbCBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQkgKiBFeGFtcGxlOiA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvL2hvbWU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbEhvbWUoKTsKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgbG9jYWwgYXR0cmlidXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoU3RyaW5nIHZhbHVlKTsKLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgbG9jYWxIb21lIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsSG9tZShTdHJpbmcgdmFsdWUpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhODA4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRWpiUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIFRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjbGllbnQ7IHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgYW5kIGFuIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLiBUaGUgb3B0aW9uYWwgIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBFamJSZWYgZXh0ZW5kcyBFT2JqZWN0ewotCi0vKioKLSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gKiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsgb3RoZXJ3aXNlIAotICogcmV0dXJuIG51bGwKLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldExpbmtlZEVqYihFSkJKYXIgZWpiSmFyKTsvKioKLSAqIFJldHVybiBhbiBlbnRlcnByaXNlIGJlYW4gcmVmZXJlbmNlZCBieSB0aGUgRWpiUmVmLCBpZiBvbmUgZXhpc3RzLCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gKiBUaGUgZWpiLWxpbmsgdmFsdWUgb2YgdGhlIHJlZiBtdXN0IGVxdWF0ZSB0byBhIG5hbWVkIGVudGVycHJpc2UgYmVhbiBjb250YWluZWQgaW4gdGhlIGphcjsgb3RoZXJ3aXNlIAotICogcmV0dXJuIG51bGwKLSAqLyAgCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBuYW1lLCBob21lLCByZW1vdGUsIGFuZCBsaW5rIGFyZSBlcXVpdmFsZW50LgotICovCi1ib29sZWFuIGlzRXF1aXZhbGVudChFamJSZWYgYW5FamJSZWYpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyByZWZlcmVuY2UgaXMgcGh5c2ljYWxseSBsaW5rZWQgdG8KLSAqIEBhbkVKQi4KLSAqLwotYm9vbGVhbiBpc0xpbmtlZChFbnRlcnByaXNlQmVhbiBhbkVKQikgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWpicmVmIGlzIGZvciBhIGxvY2FsIGVqYiBpbnRlcmZhY2UuCi0gKi8KLWJvb2xlYW4gaXNMb2NhbCgpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGlzIGlzIHRoZQotCSAqIEpOREkgbmFtZSB0aGF0IHRoZSBzZXJ2bGV0IGNvZGUgdXNlcyB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4KLQkgKiBFeGFtcGxlOiA8ZWpiLXJlZi1uYW1lPmVqYi8vUGF5cm9sbDwvL2VqYi1yZWYtbmFtZT4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQKLQkgKiBlbnRlcnByaXNlIGJlYW4uIFRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSAqIDxlamItcmVmLXR5cGU+RW50aXR5PC8vZWpiLXJlZi10eXBlPgotCSAqIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvL2VqYi1yZWYtdHlwZT4KLQkgKi8KLQlFamJSZWZUeXBlIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmVHlwZQotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjdW5zZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEVqYlJlZlR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShFamJSZWZUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBzZWUgI3NldFR5cGUoRWpiUmVmVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBIb21lIGF0dHJpYnV0ZQotCSAqIFRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotCSAqIGhvbWUgaW50ZXJmYWNlLgotCSAqIEV4YW1wbGU6IDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC8vaG9tZT4KLQkgKi8KLQlTdHJpbmcgZ2V0SG9tZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEhvbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRIb21lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVtb3RlIGF0dHJpYnV0ZQotCSAqIFRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzCi0JICogcmVtb3RlIGludGVyZmFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UmVtb3RlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVtb3RlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UmVtb3RlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGluayBhdHRyaWJ1dGUKLQkgKiBUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQgotCSAqIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBlbmNvbXBhc3NpbmcgSjJFRSBBcHBsaWNhdGlvbgotCSAqIHBhY2thZ2UuIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotCSAqIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBKMkVFIEFwcGxpY2F0aW9uIHBhY2thZ2UuIAotCSAqIEV4YW1wbGU6IDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvL2VqYi1saW5rPgotCSAqLwotCVN0cmluZyBnZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTGluayBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldExpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0Ci0JICogZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkKLQkgKiBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLQkgKiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlCi0JICogZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQKLQkgKiBlbGVtZW50LgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEVqYlJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWZUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRWpiUmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRlZDhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgRWpiUmVmVHlwZSB7fQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRWpiUmVmVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWT0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNlc3Npb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TZXNzaW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFU1NJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVqYlJlZlR5cGUgU0VTU0lPTl9MSVRFUkFMID0gbmV3IEVqYlJlZlR5cGUoU0VTU0lPTiwgIlNlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VOVElUWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZSBFTlRJVFlfTElURVJBTCA9IG5ldyBFamJSZWZUeXBlKEVOVElUWSwgIkVudGl0eSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEVqYlJlZlR5cGVbXSB7Ci0JCQlTRVNTSU9OX0xJVEVSQUwsCi0JCQlFTlRJVFlfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVqYiBSZWYgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlJlZlR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlFamJSZWZUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVqYlJlZlR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNFU1NJT046IHJldHVybiBTRVNTSU9OX0xJVEVSQUw7Ci0JCQljYXNlIEVOVElUWTogcmV0dXJuIEVOVElUWV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFamJSZWZUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0VqYlJlZlR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FbnZFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWE5OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJpZXMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW52RW50cnkgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0Ci0JICogZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkKLQkgKiBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLQkgKiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlCi0JICogZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQKLQkgKiBlbGVtZW50LgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi0JICogZW52aXJvbm1lbnQgZW50cnkuIAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBWYWx1ZSBhdHRyaWJ1dGUKLQkgKiBUaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi0JICogZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZSBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBjb25zdHJ1Y3RvciAKLQkgKiBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyLgotCSAqIFVzZWQgaW46IGVudi1lbnRyeQotCSAqIEV4YW1wbGU6Ci0JICogPGVudi1lbnRyeS12YWx1ZT4vL2RhdGFzb3VyY2VzLy9NeURhdGFiYXNlPC8vZW52LWVudHJ5LXZhbHVlPgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFZhbHVlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQotCSAqIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGNvZGUuIFRoZQotCSAqIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZTogamF2YS5sYW5nLkJvb2wtZWFuLAotCSAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwKLQkgKiBqYXZhLmxhbmcuU2hvcnQsIGphdmEubGFuZy5Mb25nLCBhbmQgamF2YS5sYW5nLkZsb2F0LiAKLQkgKiBFeGFtcGxlOiA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48Ly9lbnYtZW50cnktdHlwZT4KLQkgKi8KLQlFbnZFbnRyeVR5cGUgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5VHlwZQotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjdW5zZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEVudkVudHJ5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBzZWUgI3NldFR5cGUoRW52RW50cnlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnkjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShFbnZFbnRyeVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FbnZFbnRyeVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FbnZFbnRyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5ZmEyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRW52RW50cnlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgRW52RW50cnlUeXBlIHt9Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnZFbnRyeVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVI9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9PTEVBTj0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1VCTEU9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQllURT0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVD0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT05HPSA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUPSA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQVJBQ1RFUj0gODsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0cmluZzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0cmluZzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVFJJTkcKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBTVFJJTkdfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoU1RSSU5HLCAiU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkludGVnZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JbnRlZ2VyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVHRVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBJTlRFR0VSX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKElOVEVHRVIsICJJbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJvb2xlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Cb29sZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0JPT0xFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBCT09MRUFOX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEJPT0xFQU4sICJCb29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRvdWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNET1VCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBET1VCTEVfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoRE9VQkxFLCAiRG91YmxlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJ5dGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CeXRlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0JZVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBCWVRFX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEJZVEUsICJCeXRlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNob3J0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2hvcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0hPUlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBTSE9SVF9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShTSE9SVCwgIlNob3J0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb25nPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPTkcKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBMT05HX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKExPTkcsICJMb25nIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZsb2F0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RmxvYXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRkxPQVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBGTE9BVF9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShGTE9BVCwgIkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNoYXJhY3RlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNoYXJhY3RlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEFSQUNURVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBDSEFSQUNURVJfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoQ0hBUkFDVEVSLCAiQ2hhcmFjdGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEVudkVudHJ5VHlwZVtdIHsKLQkJCVNUUklOR19MSVRFUkFMLAotCQkJSU5URUdFUl9MSVRFUkFMLAotCQkJQk9PTEVBTl9MSVRFUkFMLAotCQkJRE9VQkxFX0xJVEVSQUwsCi0JCQlCWVRFX0xJVEVSQUwsCi0JCQlTSE9SVF9MSVRFUkFMLAotCQkJTE9OR19MSVRFUkFMLAotCQkJRkxPQVRfTElURVJBTCwKLQkJCUNIQVJBQ1RFUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnYgRW50cnkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudkVudHJ5VHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUVudkVudHJ5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudkVudHJ5VHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgU1RSSU5HOiByZXR1cm4gU1RSSU5HX0xJVEVSQUw7Ci0JCQljYXNlIElOVEVHRVI6IHJldHVybiBJTlRFR0VSX0xJVEVSQUw7Ci0JCQljYXNlIEJPT0xFQU46IHJldHVybiBCT09MRUFOX0xJVEVSQUw7Ci0JCQljYXNlIERPVUJMRTogcmV0dXJuIERPVUJMRV9MSVRFUkFMOwotCQkJY2FzZSBCWVRFOiByZXR1cm4gQllURV9MSVRFUkFMOwotCQkJY2FzZSBTSE9SVDogcmV0dXJuIFNIT1JUX0xJVEVSQUw7Ci0JCQljYXNlIExPTkc6IHJldHVybiBMT05HX0xJVEVSQUw7Ci0JCQljYXNlIEZMT0FUOiByZXR1cm4gRkxPQVRfTElURVJBTDsKLQkJCWNhc2UgQ0hBUkFDVEVSOiByZXR1cm4gQ0hBUkFDVEVSX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVudkVudHJ5VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9FbnZFbnRyeVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FeHRlbnNpYmxlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0V4dGVuc2libGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2RlYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0V4dGVuc2libGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2libGUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRXh0ZW5zaWJsZVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRFeHRlbnNpYmxlVHlwZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJsZVR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEV4dGVuc2libGVUeXBlX1ZhbHVlKCkKLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkV4dGVuc2libGVUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEV4dGVuc2libGVUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSWNvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JY29uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDkwZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JY29uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWNvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzCi0gKiB0aGF0IHNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBsYXJnZSBHSUYgb3IKLSAqIEpQRUcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEKLSAqIEdVSSB0b29sLgotICogCi0gKiBUaGUgeG1sOmxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0gKiBpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkKLSAqIGJ5IGRlZmF1bHQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlI2dldExhbmcgPGVtPkxhbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEljb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEljb25UeXBlIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICogICAgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0JICogICAgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKLQkgKiAgICAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4KLQkgKiAKLQkgKiAgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi0JICogICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICA8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNtYWxsSWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRJY29uVHlwZV9TbWFsbEljb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotCSAqICAgICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0JICogICAgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0JICogICAgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50Ci0JICogICAgICAgICBGaWxlLgotCSAqIAotCSAqICAgICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLQkgKiAgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAgICAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEljb25UeXBlX0xhcmdlSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZSNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0SWNvblR5cGVfTGFuZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMYW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFuZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFuZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEljb25UeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vSWRlbnRpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JZGVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzJmNTcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9JZGVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogU3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSWRlbnRpdHkgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBydW4gYXMgaWRlbnRpdHkuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICogVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQkgKiAKLQkgKiBUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0JICovCi0JU3RyaW5nIGdldFJvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0pORElFbnZSZWZzR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9KTkRJRW52UmVmc0dyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTE0ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0pORElFbnZSZWZzR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KTkRJIEVudiBSZWZzIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBKTkRJIGVudmlyb25tZW50Ci0gKiByZWZlcmVuY2UgZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwI2dldEVudmlyb25tZW50UHJvcGVydGllcyA8ZW0+RW52aXJvbm1lbnQgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0UmVzb3VyY2VFbnZSZWZzIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKTkRJRW52UmVmc0dyb3VwIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52aXJvbm1lbnQgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnZpcm9ubWVudCBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52aXJvbm1lbnQgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXNvdXJjZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVqYlJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBsaXN0IG9mIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VzIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldEpORElFbnZSZWZzR3JvdXBfUmVzb3VyY2VFbnZSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFamJMb2NhbFJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotfSAvLyBKTkRJRW52UmVmc0dyb3VwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU2NzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLS8qKgotICogRGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQotLyoqCi0gKiBHZXQgdGhlIEphdmFDbGFzcyBmb3IgdGhlIGxpc3RlbmVyLgotICovCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgTGlzdGVuZXJDbGFzcyByZWZlcmVuY2UKLQkgKiBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlCi0JICogcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotCSAqLwotCUphdmFDbGFzcyBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0KLS8qKgotICogR2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGxpc3RlbmVyLgotICovCi1wdWJsaWMgU3RyaW5nIGdldExpc3RlbmVyQ2xhc3NOYW1lKCk7Ci0vKioKLSAqIFNldHMgdGhlIGxpc3RlbmVyIGNsYXNzIG5hbWUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3NOYW1lKFN0cmluZyBsaXN0ZW5lckNsYXNzTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTGlzdGVuZXJDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldExpc3RlbmVyQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4ZDAyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vTWVzc2FnZURlc3RpbmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCi0gKiBkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKLSAqIGVsZW1lbnQgaXMgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZGVzdGluYXRpb24gYnkgdGhlIERlcGxveWVyLgotICogCi0gKiBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOgotICogCi0gKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKLSAqICAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uCi0gKiAgICAgICAgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUKLSAqICAgICAgICAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQotICogICAgICAgICAgIERlcGxveW1lbnQgRmlsZS4KLSAqIAotICogRXhhbXBsZToKLSAqIAotICogPG1lc3NhZ2UtZGVzdGluYXRpb24+Ci0gKiAgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzCi0gKiAgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgotICogPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VEZXN0aW5hdGlvbiBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhCi0JICogICAgICAgICBuYW1lIGZvciBhIG1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIG5hbWUgbXVzdCBiZQotCSAqICAgICAgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotCSAqICAgICAgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWVzc2FnZURlc3RpbmF0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vTWVzc2FnZURlc3RpbmF0aW9uUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vTWVzc2FnZURlc3RpbmF0aW9uUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZThiN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICogb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0gKiBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0gKiBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0gKiAKLSAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogICAgICAgICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lCi0gKiAgICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotICogICAgICAgICAtIGEgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyIHRoZQotICogICAgICAgICAgIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yCi0gKiAgICAgICAgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aAotICogICAgICAgICAtIGEgbGluayB0byB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbgotICogCi0gKiBFeGFtcGxlczoKLSAqIAotICogPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+Ci0gKiAgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gKiAgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT5Db25zdW1lcwotICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Ci0gKiAgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzCi0gKiAgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPgotICogPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRVc2FnZSA8ZW0+VXNhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0TGluayA8ZW0+TGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+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+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19IC8vIE1lc3NhZ2VEZXN0aW5hdGlvblJlZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTVjZGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db25zdW1lczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlNVTUVTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0iQ29uc3VtZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1VNRVMgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUk9EVUNFU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IlByb2R1Y2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0RVQ0VTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzIFByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJDb25zdW1lc1Byb2R1Y2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNVTUVTX1BST0RVQ0VTID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBDT05TVU1FU19MSVRFUkFMID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShDT05TVU1FUywgIkNvbnN1bWVzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPRFVDRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBQUk9EVUNFU19MSVRFUkFMID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShQUk9EVUNFUywgIlByb2R1Y2VzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzIFByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29uc3VtZXMgUHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVNfUFJPRFVDRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBDT05TVU1FU19QUk9EVUNFU19MSVRFUkFMID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShDT05TVU1FU19QUk9EVUNFUywgIkNvbnN1bWVzUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZVtdIHsKLQkJCUNPTlNVTUVTX0xJVEVSQUwsCi0JCQlQUk9EVUNFU19MSVRFUkFMLAotCQkJQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIENPTlNVTUVTOiByZXR1cm4gQ09OU1VNRVNfTElURVJBTDsKLQkJCWNhc2UgUFJPRFVDRVM6IHJldHVybiBQUk9EVUNFU19MSVRFUkFMOwotCQkJY2FzZSBDT05TVU1FU19QUk9EVUNFUzogcmV0dXJuIENPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9QYXJhbVZhbHVlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUGFyYW1WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg2MjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9QYXJhbVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCi0gKiBwYXJhbWV0ZXIvdmFsdWUgbGlzdHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRQYXJhbVZhbHVlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmFtVmFsdWUgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRQYXJhbVZhbHVlX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFBhcmFtVmFsdWVfVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCwgYmVjb21lcyBkZXNjcmlwdGlvbnMKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFBhcmFtVmFsdWVfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFBhcmFtVmFsdWVfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0gLy8gUGFyYW1WYWx1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1FOYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlMmNlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRMb2NhbFBhcnQgPGVtPkxvY2FsIFBhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXRDb21iaW5lZFFOYW1lIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldEludGVybmFsUHJlZml4T3JOc1VSSSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UU5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUU5hbWUgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZXNwYWNlVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFFOYW1lX05hbWVzcGFjZVVSSSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBQYXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIFBhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2FsUGFydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRRTmFtZV9Mb2NhbFBhcnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYWxQYXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUjZ2V0TG9jYWxQYXJ0IDxlbT5Mb2NhbCBQYXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBQYXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhbFBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2FsUGFydChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21iaW5lZFFOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFFOYW1lX0NvbWJpbmVkUU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tYmluZWRRTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldENvbWJpbmVkUU5hbWUgPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21iaW5lZCBRTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tYmluZWRRTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tYmluZWRRTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSW50ZXJuYWwgZmllbGQgdXNlZCBieSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiAgQ2xpZW50cyBzaG91bGQgdXNlIAotCSAqIHtAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCl9LgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lI2dldEludGVybmFsUHJlZml4T3JOc1VSSSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogSW50ZXJuYWwgZmllbGQgdXNlZCBieSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiAgQ2xpZW50cyBzaG91bGQgdXNlIAotCSAqIHtAbGluayAjc2V0VmFsdWVzKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludGVybmFsUHJlZml4T3JOc1VSSShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyBhbGwgdGhlIHZhbHVlcyBmb3IgdGhpcyBxTmFtZQotCSAqIEBwYXJhbSBwcmVmaXggICAgLSBUaGUgbmFtZXNwYWNlIHByZWZpeAotCSAqIEBwYXJhbSBuc1VSSSAgICAgLSBUaGUgbmFtZXNwYWNlIFVSSQotCSAqIEBwYXJhbSBsb2NhbFBhcnQgLSBUaGUgbG9jYWwgcGFydAotCSAqLwotCXZvaWQgc2V0VmFsdWVzKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuc1VSSSwgU3RyaW5nIGxvY2FsUGFydCk7Ci0JCi0KLX0gLy8gUU5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNBdXRoVHlwZUJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNBdXRoVHlwZUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4NTI1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzQXV0aFR5cGVCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UmVzIEF1dGggVHlwZSBCYXNlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENPTlRBSU5FUj0wCi0gKiBDb250YWluZXI9MQotICogQXBwbGljYXRpb249MgotICogU0VSVkxFVD0zCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UmVzQXV0aFR5cGVCYXNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzQXV0aFR5cGVCYXNlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UQUlORVJfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJDb250YWluZXIiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFJTkVSID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVBQTElDQVRJT05fTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJBcHBsaWNhdGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVJWTEVUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VSVkxFVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVkxFVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZUJhc2UgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgUmVzQXV0aFR5cGVCYXNlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FQUExJQ0FUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZUJhc2UgQVBQTElDQVRJT05fTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZUJhc2UoQVBQTElDQVRJT04sICJBcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVJWTEVUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VSVkxFVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWTEVUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZUJhc2UgU0VSVkxFVF9MSVRFUkFMID0gbmV3IFJlc0F1dGhUeXBlQmFzZShTRVJWTEVULCAiU0VSVkxFVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZSBCYXNlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNBdXRoVHlwZUJhc2VbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgUmVzQXV0aFR5cGVCYXNlW10gewotCQkJQ09OVEFJTkVSX0xJVEVSQUwsCi0JCQlBUFBMSUNBVElPTl9MSVRFUkFMLAotCQkJU0VSVkxFVF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFR5cGUgQmFzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZSBCYXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFR5cGVCYXNlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzQXV0aFR5cGVCYXNlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggVHlwZSBCYXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc0F1dGhUeXBlQmFzZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ09OVEFJTkVSOiByZXR1cm4gQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCQljYXNlIEFQUExJQ0FUSU9OOiByZXR1cm4gQVBQTElDQVRJT05fTElURVJBTDsKLQkJCWNhc2UgU0VSVkxFVDogcmV0dXJuIFNFUlZMRVRfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUmVzQXV0aFR5cGVCYXNlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL1Jlc0F1dGhUeXBlQmFzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYmVlNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBSZXNTaGFyaW5nU2NvcGVUeXBlIHt9Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNTaGFyaW5nU2NvcGVUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVJFQUJMRT0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNIQVJFQUJMRT0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTSEFSRUFCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGUgU0hBUkVBQkxFX0xJVEVSQUwgPSBuZXcgUmVzU2hhcmluZ1Njb3BlVHlwZShTSEFSRUFCTEUsICJTaGFyZWFibGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VW5zaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VbnNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVTlNIQVJFQUJMRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzU2hhcmluZ1Njb3BlVHlwZSBVTlNIQVJFQUJMRV9MSVRFUkFMID0gbmV3IFJlc1NoYXJpbmdTY29wZVR5cGUoVU5TSEFSRUFCTEUsICJVbnNoYXJlYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzU2hhcmluZ1Njb3BlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBSZXNTaGFyaW5nU2NvcGVUeXBlW10gewotCQkJU0hBUkVBQkxFX0xJVEVSQUwsCi0JCQlVTlNIQVJFQUJMRV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzU2hhcmluZ1Njb3BlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzU2hhcmluZ1Njb3BlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgU0hBUkVBQkxFOiByZXR1cm4gU0hBUkVBQkxFX0xJVEVSQUw7Ci0JCQljYXNlIFVOU0hBUkVBQkxFOiByZXR1cm4gVU5TSEFSRUFCTEVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUmVzU2hhcmluZ1Njb3BlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9SZXNTaGFyaW5nU2NvcGVUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzb3VyY2VFbnZSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNvdXJjZUVudlJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjc5MjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNvdXJjZUVudlJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLS8qKgotICogVGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4KLSAqIAotICogRXhhbXBsZXM6Ci0gKiAKLSAqIDxyZXNvdXJjZS1lbnYtcmVmPgotICogICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zLy9TdG9ja1F1ZXVlPC8vcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICogICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC8vcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICogPC8vcmVzb3VyY2UtZW52LXJlZj4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUVudlJlZiBleHRlbmRzIEVPYmplY3R7Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyBjbGFzc05hbWUpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSByZXNvdXJjZSBlbnYgcmVmLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyCi0JICogd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLgotCSAqIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlCi0JICogZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICogZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBUeXBlIHJlZmVyZW5jZQotCSAqIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIFNlZSB0aGUgY2xhc3MKLQkgKiBkZXNjcmlwdGlvbiBmb3IgYW4gZXhhbXBsZS4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFR5cGUoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZSNnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNvdXJjZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZGM2M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc291cmNlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhcHBsaWNhdGlvbiBjbGllbnRzJ3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIHRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGNvZGUsIGFuZCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiAoYmVhbiBvciBjb250YWluZXIpLgotICogRXhhbXBsZToKLSAqIDxyZXNvdXJjZS1yZWY+Ci0gKiA8cmVzLXJlZi1uYW1lPkVtcGxveWVlQXBwREI8Ly9yZXMtcmVmLW5hbWU+Ci0gKiA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8Ly9yZXMtdHlwZT4KLSAqIDxyZXMtYXV0aD5Db250YWluZXI8Ly9yZXMtYXV0aD4KLSAqIDwvL3Jlc291cmNlLXJlZj4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVJlZiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UKLQkgKiBuYW1lLiBUaGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24KLQkgKiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyeSB3aG9zZSB2YWx1ZSBjb250YWlucyB0aGUgSk5ESSBuYW1lIG9mIHRoZSBkYXRhCi0JICogc291cmNlLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlIGlzCi0JICogc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSAob3IgY2xhc3MpIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZQotCSAqIGRhdGEgc291cmNlLgotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVHlwZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBBdXRoIGF0dHJpYnV0ZQotCSAqIFRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSBzaWducyBvbgotCSAqIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gCi0JICogdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBiZWFuLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQotCSAqIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlIERlcGxveWVyLiAgVGhlIHZhbHVlIG9mIHRoaXMgCi0JICogZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkgKiA8cmVzLWF1dGg+QXBwbGljYXRpb248Ly9yZXMtYXV0aD4KLQkgKiA8cmVzLWF1dGg+Q29udGFpbmVyPC8vcmVzLWF1dGg+Ci0JICovCi0JUmVzQXV0aFR5cGVCYXNlIGdldEF1dGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZiNnZXRBdXRoIDxlbT5BdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNBdXRoVHlwZUJhc2UKLQkgKiBAc2VlICNpc1NldEF1dGgoKQotCSAqIEBzZWUgI3Vuc2V0QXV0aCgpCi0JICogQHNlZSAjZ2V0QXV0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aChSZXNBdXRoVHlwZUJhc2UgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWYjZ2V0QXV0aCA8ZW0+QXV0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBdXRoKCkKLQkgKiBAc2VlICNnZXRBdXRoKCkKLQkgKiBAc2VlICNzZXRBdXRoKFJlc0F1dGhUeXBlQmFzZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEF1dGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldEF1dGggPGVtPkF1dGg8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGg8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEF1dGgoKQotCSAqIEBzZWUgI2dldEF1dGgoKQotCSAqIEBzZWUgI3NldEF1dGgoUmVzQXV0aFR5cGVCYXNlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXV0aCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExpbmsgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldExpbmsoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaW5rIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJlc1NoYXJpbmdTY29wZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZAotCSAqIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUKLQkgKiBzaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlCi0JICogdHdvIGZvbGxvd2luZzogIFNoYXJlYWJsZSwgVW5zaGFyZWFibGUKLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLQkgKi8KLQlSZXNTaGFyaW5nU2NvcGVUeXBlIGdldFJlc1NoYXJpbmdTY29wZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldFJlc1NoYXJpbmdTY29wZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNTaGFyaW5nU2NvcGVUeXBlCi0JICogQHNlZSAjaXNTZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI3Vuc2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAc2VlICNnZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc1NoYXJpbmdTY29wZShSZXNTaGFyaW5nU2NvcGVUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmI2dldFJlc1NoYXJpbmdTY29wZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAc2VlICNnZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI3NldFJlc1NoYXJpbmdTY29wZShSZXNTaGFyaW5nU2NvcGVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzU2hhcmluZ1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZiNnZXRSZXNTaGFyaW5nU2NvcGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAc2VlICNnZXRSZXNTaGFyaW5nU2NvcGUoKQotCSAqIEBzZWUgI3NldFJlc1NoYXJpbmdTY29wZShSZXNTaGFyaW5nU2NvcGVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzU2hhcmluZ1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUnVuQXNTcGVjaWZpZWRJZGVudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5ZWNjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUnVuQXNTcGVjaWZpZWRJZGVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotCi0KLS8qKgotICogVGhlIHNlY3VyaXR5LWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzIGlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0ICAgIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBSdW5Bc1NwZWNpZmllZElkZW50aXR5IGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eXsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBJZGVudGl0eSByZWZlcmVuY2UKLQkgKiBPcHRpb25hbCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCSAqIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZQotCSAqIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCSAqLwotCUlkZW50aXR5IGdldElkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBJZGVudGl0eSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldElkZW50aXR5KElkZW50aXR5IHZhbHVlKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eUlkZW50aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlJZGVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2ZiY2EyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eUlkZW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQKLSAqIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBTZWN1cml0eUlkZW50aXR5IGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCWJvb2xlYW4gaXNSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0JCi0JYm9vbGVhbiBpc1VzZUNhbGxlcklkZW50aXR5KCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlSb2xlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vU2VjdXJpdHlSb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYWFmNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1NlY3VyaXR5Um9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogQSBzZW1hbnRpYyBncm91cGluZyBvZiBvcGVyYXRpb25zIHRoYXQgbWF5IGJlIHBlcmZvcm1lZCBieSBhIHN1YmplY3QuCi0gKiBUaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5IHJvbGUgd2hpY2ggaXMgdXNlZCBpbiB0aGUgc2VjdXJpdHktY29uc3RyYWludHMgcGxhY2VkIG9uIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdXJpdHlSb2xlIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJvbGVOYW1lIGF0dHJpYnV0ZQotCSAqIFRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHJvbGUuIFRoaXMgZWxlbWVudCBtdXN0IGNvbnRhaW4gYQotCSAqIG5vbi1lbXB0eSBzdHJpbmcuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFJvbGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1NlY3VyaXR5Um9sZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1NlY3VyaXR5Um9sZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGNkNDJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9TZWN1cml0eVJvbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3VyaXR5Um9sZVJlZiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQKLQkgKiBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueQotCSAqIGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotCSAqIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUKLQkgKiBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudAotCSAqIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExpbmsgYXR0cmlidXRlCi0JICogVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIHVzZWQgdG8gbGluayBhIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotCSAqIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotCSAqIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICovCi0JU3RyaW5nIGdldExpbmsoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMaW5rIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9Vc2VDYWxsZXJJZGVudGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1VzZUNhbGxlcklkZW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDI4MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1VzZUNhbGxlcklkZW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uOwotCi0KLQotLyoqCi0gKiBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBiZSB1c2VkIGFzIHRoZSBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVzZUNhbGxlcklkZW50aXR5IGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eXsKLQkvL1VzZUNhbGxlcklkZW50aXR5Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tbW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYWEwZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tbW9uRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNTaGFyaW5nU2NvcGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQ29tbW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbW9uRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGOiByZXR1cm4gY3JlYXRlRWpiUmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZOiByZXR1cm4gY3JlYXRlRW52RW50cnkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUY6IHJldHVybiBjcmVhdGVSZXNvdXJjZVJlZigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGOiByZXR1cm4gY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRTogcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUY6IHJldHVybiBjcmVhdGVSZXNvdXJjZUVudlJlZigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUY6IHJldHVybiBjcmVhdGVFSkJMb2NhbFJlZigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFk6IHJldHVybiBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFk6IHJldHVybiBjcmVhdGVJZGVudGl0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRTogcmV0dXJuIGNyZWF0ZUljb25UeXBlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FOiByZXR1cm4gY3JlYXRlRGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT046IHJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRTogcmV0dXJuIGNyZWF0ZVBhcmFtVmFsdWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUDogcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWTogcmV0dXJuIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5VU0VfQ0FMTEVSX0lERU5USVRZOiByZXR1cm4gY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTjogcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUU6IHJldHVybiBjcmVhdGVRTmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSOiByZXR1cm4gY3JlYXRlTGlzdGVuZXIoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQOiByZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6IHsKLQkJCQlFbnZFbnRyeVR5cGUgcmVzdWx0ID0gRW52RW50cnlUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTX0FVVEhfVFlQRV9CQVNFOiB7Ci0JCQkJUmVzQXV0aFR5cGVCYXNlIHJlc3VsdCA9IFJlc0F1dGhUeXBlQmFzZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfVFlQRTogewotCQkJCUVqYlJlZlR5cGUgcmVzdWx0ID0gRWpiUmVmVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU19TSEFSSU5HX1NDT1BFX1RZUEU6IHsKLQkJCQlSZXNTaGFyaW5nU2NvcGVUeXBlIHJlc3VsdCA9IFJlc1NoYXJpbmdTY29wZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEU6IHsKLQkJCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgcmVzdWx0ID0gTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9UWVBFOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU19BVVRIX1RZUEVfQkFTRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX1RZUEU6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEU6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiUmVmIGNyZWF0ZUVqYlJlZigpIHsKLQkJRWpiUmVmSW1wbCBlamJSZWYgPSBuZXcgRWpiUmVmSW1wbCgpOwotCQlyZXR1cm4gZWpiUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnZFbnRyeSBjcmVhdGVFbnZFbnRyeSgpIHsKLQkJRW52RW50cnlJbXBsIGVudkVudHJ5ID0gbmV3IEVudkVudHJ5SW1wbCgpOwotCQlyZXR1cm4gZW52RW50cnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlUmVmIGNyZWF0ZVJlc291cmNlUmVmKCkgewotCQlSZXNvdXJjZVJlZkltcGwgcmVzb3VyY2VSZWYgPSBuZXcgUmVzb3VyY2VSZWZJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpIHsKLQkJU2VjdXJpdHlSb2xlUmVmSW1wbCBzZWN1cml0eVJvbGVSZWYgPSBuZXcgU2VjdXJpdHlSb2xlUmVmSW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGUgY3JlYXRlU2VjdXJpdHlSb2xlKCkgewotCQlTZWN1cml0eVJvbGVJbXBsIHNlY3VyaXR5Um9sZSA9IG5ldyBTZWN1cml0eVJvbGVJbXBsKCk7Ci0JCXJldHVybiBzZWN1cml0eVJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlRW52UmVmIGNyZWF0ZVJlc291cmNlRW52UmVmKCkgewotCQlSZXNvdXJjZUVudlJlZkltcGwgcmVzb3VyY2VFbnZSZWYgPSBuZXcgUmVzb3VyY2VFbnZSZWZJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCTG9jYWxSZWYgY3JlYXRlRUpCTG9jYWxSZWYoKSB7Ci0JCUVKQkxvY2FsUmVmSW1wbCBlamJMb2NhbFJlZiA9IG5ldyBFSkJMb2NhbFJlZkltcGwoKTsKLQkJcmV0dXJuIGVqYkxvY2FsUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSdW5Bc1NwZWNpZmllZElkZW50aXR5IGNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKSB7Ci0JCVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgPSBuZXcgUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwoKTsKLQkJcmV0dXJuIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElkZW50aXR5IGNyZWF0ZUlkZW50aXR5KCkgewotCQlJZGVudGl0eUltcGwgaWRlbnRpdHkgPSBuZXcgSWRlbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBpZGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSWNvblR5cGUgY3JlYXRlSWNvblR5cGUoKSB7Ci0JCUljb25UeXBlSW1wbCBpY29uVHlwZSA9IG5ldyBJY29uVHlwZUltcGwoKTsKLQkJcmV0dXJuIGljb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNwbGF5TmFtZSBjcmVhdGVEaXNwbGF5TmFtZSgpIHsKLQkJRGlzcGxheU5hbWVJbXBsIGRpc3BsYXlOYW1lID0gbmV3IERpc3BsYXlOYW1lSW1wbCgpOwotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWYoKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwgbWVzc2FnZURlc3RpbmF0aW9uUmVmID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwoKTsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKLQkJTWVzc2FnZURlc3RpbmF0aW9uSW1wbCBtZXNzYWdlRGVzdGluYXRpb24gPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJhbVZhbHVlIGNyZWF0ZVBhcmFtVmFsdWUoKSB7Ci0JCVBhcmFtVmFsdWVJbXBsIHBhcmFtVmFsdWUgPSBuZXcgUGFyYW1WYWx1ZUltcGwoKTsKLQkJcmV0dXJuIHBhcmFtVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uR3JvdXAgY3JlYXRlRGVzY3JpcHRpb25Hcm91cCgpIHsKLQkJRGVzY3JpcHRpb25Hcm91cEltcGwgZGVzY3JpcHRpb25Hcm91cCA9IG5ldyBEZXNjcmlwdGlvbkdyb3VwSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRpb25Hcm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlJZGVudGl0eSBjcmVhdGVTZWN1cml0eUlkZW50aXR5KCkgewotCQlTZWN1cml0eUlkZW50aXR5SW1wbCBzZWN1cml0eUlkZW50aXR5ID0gbmV3IFNlY3VyaXR5SWRlbnRpdHlJbXBsKCk7Ci0JCXJldHVybiBzZWN1cml0eUlkZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVc2VDYWxsZXJJZGVudGl0eSBjcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpIHsKLQkJVXNlQ2FsbGVySWRlbnRpdHlJbXBsIHVzZUNhbGxlcklkZW50aXR5ID0gbmV3IFVzZUNhbGxlcklkZW50aXR5SW1wbCgpOwotCQlyZXR1cm4gdXNlQ2FsbGVySWRlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0aW9uKCkgewotCQlEZXNjcmlwdGlvbkltcGwgZGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWUoKSB7Ci0JCVFOYW1lSW1wbCBxTmFtZSA9IG5ldyBRTmFtZUltcGwoKTsKLQkJcmV0dXJuIHFOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IExpc3RlbmVySW1wbCgpOwotCQlyZXR1cm4gbGlzdGVuZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkgewotCQlDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSBuZXcgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsKCk7Ci0JCXJldHVybiBjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbW9uUGFja2FnZSBnZXRDb21tb25QYWNrYWdlKCkgewotCQlyZXR1cm4gKENvbW1vblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vQ29tbW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21tb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzU2NjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vblBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNTaGFyaW5nU2NvcGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIENvbW1vblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29tbW9uUGFja2FnZSwgRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYlJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnZFbnRyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZVJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eVJvbGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlc291cmNlRW52UmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYkxvY2FsUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdXJpdHlJZGVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpZGVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpY29uVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNwbGF5TmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhcmFtVmFsdWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRpb25Hcm91cEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqbmRpRW52UmVmc0dyb3VwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHVzZUNhbGxlcklkZW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHFOYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxpc3RlbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZW52RW50cnlUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSByZXNBdXRoVHlwZUJhc2VFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGVqYlJlZlR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgQ29tbW9uUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vblBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDb21tb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCQlKYXZhUmVmUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVDb21tb25QYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVDb21tb25QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdXJpdHlSb2xlKCkgewotCQlyZXR1cm4gc2VjdXJpdHlSb2xlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5Um9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5Um9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlUmVmKCkgewotCQlyZXR1cm4gcmVzb3VyY2VSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX0F1dGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX0xpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVqYlJlZigpIHsKLQkJcmV0dXJuIGVqYlJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0hvbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfUmVtb3RlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0xpbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFamJSZWZfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFSkJMb2NhbFJlZigpIHsKLQkJcmV0dXJuIGVqYkxvY2FsUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkxvY2FsUmVmX0xvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkxvY2FsUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCTG9jYWxSZWZfTG9jYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllamJMb2NhbFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RW52RW50cnkoKSB7Ci0JCXJldHVybiBlbnZFbnRyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudkVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVudkVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RW52RW50cnlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnZFbnRyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudkVudHJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN1cml0eVJvbGVSZWYoKSB7Ci0JCXJldHVybiBzZWN1cml0eVJvbGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVJvbGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVJvbGVSZWZfTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5Um9sZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eVJvbGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKSB7Ci0JCXJldHVybiBydW5Bc1NwZWNpZmllZElkZW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfSWRlbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlydW5Bc1NwZWNpZmllZElkZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN1cml0eUlkZW50aXR5KCkgewotCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlJZGVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlJZGVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VXNlQ2FsbGVySWRlbnRpdHkoKSB7Ci0JCXJldHVybiB1c2VDYWxsZXJJZGVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRpb25fTGFuZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UU5hbWUoKSB7Ci0JCXJldHVybiBxTmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlxTmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFFOYW1lX0xvY2FsUGFydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXFOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UU5hbWVfQ29tYmluZWRRTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXFOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcU5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbGlzdGVuZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpIHsKLQkJcmV0dXJuIGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SWRlbnRpdHkoKSB7Ci0JCXJldHVybiBpZGVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJZGVudGl0eV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWlkZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpZGVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlkZW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJY29uVHlwZSgpIHsKLQkJcmV0dXJuIGljb25UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEljb25UeXBlX1NtYWxsSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWljb25UeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJY29uVHlwZV9MYW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaWNvblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfTGFuZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc3BsYXlOYW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNwbGF5TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgewotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVXNhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHBhcmFtVmFsdWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhcmFtVmFsdWVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwYXJhbVZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBhcmFtVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBhcmFtVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0aW9uR3JvdXAoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbkdyb3VwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlc2NyaXB0aW9uR3JvdXBfSWNvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKTkRJRW52UmVmc0dyb3VwKCkgewotCQlyZXR1cm4gam5kaUVudlJlZnNHcm91cEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upam5kaUVudlJlZnNHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZUVudlJlZigpIHsKLQkJcmV0dXJuIHJlc291cmNlRW52UmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUVudlJlZl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VFbnZSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRFamJSZWZUeXBlKCkgewotCQlyZXR1cm4gZWpiUmVmVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRFbnZFbnRyeVR5cGUoKSB7Ci0JCXJldHVybiBlbnZFbnRyeVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UmVzQXV0aFR5cGVCYXNlKCkgewotCQlyZXR1cm4gcmVzQXV0aFR5cGVCYXNlRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldFJlc1NoYXJpbmdTY29wZVR5cGUoKSB7Ci0JCXJldHVybiByZXNTaGFyaW5nU2NvcGVUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb21tb25GYWN0b3J5IGdldENvbW1vbkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoQ29tbW9uRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQllamJSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUpCX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fSE9NRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19SRU1PVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYlJlZkVDbGFzcywgRUpCX1JFRl9fTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWpiUmVmRUNsYXNzLCBFSkJfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCWVudkVudHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVl9FTlRSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19ERVNDUklQVElPTlMpOwotCi0JCXJlc291cmNlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0FVVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCXNlY3VyaXR5Um9sZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNVUklUWV9ST0xFX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTRUNVUklUWV9ST0xFX1JFRl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJc2VjdXJpdHlSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1VSSVRZX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZUVDbGFzcywgU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5Um9sZUVDbGFzcywgU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eVJvbGVFQ2xhc3MsIFNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJcmVzb3VyY2VFbnZSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfRU5WX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlMpOwotCi0JCWVqYkxvY2FsUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9MT0NBTF9SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fTE9DQUwpOwotCi0JCXJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzcywgUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFkpOwotCi0JCWlkZW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKElERU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpZGVudGl0eUVDbGFzcywgSURFTlRJVFlfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpZGVudGl0eUVDbGFzcywgSURFTlRJVFlfX1JPTEVfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaWRlbnRpdHlFQ2xhc3MsIElERU5USVRZX19ERVNDUklQVElPTlMpOwotCi0JCWljb25UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElDT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fU01BTExfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fTEFSR0VfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaWNvblR5cGVFQ2xhc3MsIElDT05fVFlQRV9fTEFORyk7Ci0KLQkJZGlzcGxheU5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNwbGF5TmFtZUVDbGFzcywgRElTUExBWV9OQU1FX19MQU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNwbGF5TmFtZUVDbGFzcywgRElTUExBWV9OQU1FX19WQUxVRSk7Ci0KLQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfREVTVElOQVRJT05fUkVGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TKTsKLQotCQltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9ERVNUSU5BVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FKTsKLQotCQlwYXJhbVZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUkFNX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYXJhbVZhbHVlRUNsYXNzLCBQQVJBTV9WQUxVRV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGFyYW1WYWx1ZUVDbGFzcywgUEFSQU1fVkFMVUVfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwYXJhbVZhbHVlRUNsYXNzLCBQQVJBTV9WQUxVRV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHBhcmFtVmFsdWVFQ2xhc3MsIFBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMpOwotCi0JCWRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT05fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIERFU0NSSVBUSU9OX0dST1VQX19JQ09OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVzY3JpcHRpb25Hcm91cEVDbGFzcywgREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIERFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMpOwotCi0JCWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSk5ESV9FTlZfUkVGU19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MsIEpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUVudlJlZnNHcm91cEVDbGFzcywgSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlMpOwotCi0JCXNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfSURFTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5SWRlbnRpdHlFQ2xhc3MsIFNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlJZGVudGl0eUVDbGFzcywgU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJdXNlQ2FsbGVySWRlbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVNFX0NBTExFUl9JREVOVElUWSk7Ci0KLQkJZGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVElPTl9fTEFORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUSU9OX19WQUxVRSk7Ci0KLQkJcU5hbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUU5BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHFOYW1lRUNsYXNzLCBRTkFNRV9fTkFNRVNQQUNFX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocU5hbWVFQ2xhc3MsIFFOQU1FX19MT0NBTF9QQVJUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxTmFtZUVDbGFzcywgUU5BTUVfX0NPTUJJTkVEX1FOQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShxTmFtZUVDbGFzcywgUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkpOwotCi0JCWxpc3RlbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJU1RFTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaXN0ZW5lckVDbGFzcywgTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTKTsKLQotCQljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcywgQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLCBDT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRSk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWVudkVudHJ5VHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRU5WX0VOVFJZX1RZUEUpOwotCQlyZXNBdXRoVHlwZUJhc2VFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU19BVVRIX1RZUEVfQkFTRSk7Ci0JCWVqYlJlZlR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVKQl9SRUZfVFlQRSk7Ci0JCXJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU19TSEFSSU5HX1NDT1BFX1RZUEUpOwotCQltZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUphdmFSZWZQYWNrYWdlSW1wbCB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFamJSZWYoKSk7Ci0JCXJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTZWN1cml0eUlkZW50aXR5KCkpOwotCQltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJam5kaUVudlJlZnNHcm91cEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQl1c2VDYWxsZXJJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JCWxpc3RlbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGVqYlJlZkVDbGFzcywgRWpiUmVmLmNsYXNzLCAiRWpiUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX1R5cGUoKSwgdGhpcy5nZXRFamJSZWZUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9Ib21lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJob21lIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfUmVtb3RlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZW1vdGUiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFamJSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnZFbnRyeUVDbGFzcywgRW52RW50cnkuY2xhc3MsICJFbnZFbnRyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X1R5cGUoKSwgdGhpcy5nZXRFbnZFbnRyeVR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VSZWZFQ2xhc3MsIFJlc291cmNlUmVmLmNsYXNzLCAiUmVzb3VyY2VSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfQXV0aCgpLCB0aGlzLmdldFJlc0F1dGhUeXBlQmFzZSgpLCAiYXV0aCIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCksIHRoaXMuZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpLCAicmVzU2hhcmluZ1Njb3BlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAiU2VjdXJpdHlSb2xlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVSZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlY3VyaXR5Um9sZUVDbGFzcywgU2VjdXJpdHlSb2xlLmNsYXNzLCAiU2VjdXJpdHlSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZXNvdXJjZUVudlJlZkVDbGFzcywgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICJSZXNvdXJjZUVudlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VFbnZSZWZfVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInR5cGUiLCBudWxsLCAxLCAxLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJMb2NhbFJlZi5jbGFzcywgIkVKQkxvY2FsUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJMb2NhbFJlZl9Mb2NhbEhvbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2FsSG9tZSIsIG51bGwsIDAsIDEsIEVKQkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJMb2NhbFJlZl9Mb2NhbCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYWwiLCBudWxsLCAwLCAxLCBFSkJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlFQ2xhc3MsIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkuY2xhc3MsICJSdW5Bc1NwZWNpZmllZElkZW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5X0lkZW50aXR5KCksIHRoaXMuZ2V0SWRlbnRpdHkoKSwgbnVsbCwgImlkZW50aXR5IiwgbnVsbCwgMCwgMSwgUnVuQXNTcGVjaWZpZWRJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGlkZW50aXR5RUNsYXNzLCBJZGVudGl0eS5jbGFzcywgIklkZW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJZGVudGl0eV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWRlbnRpdHlfUm9sZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldElkZW50aXR5X0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpY29uVHlwZUVDbGFzcywgSWNvblR5cGUuY2xhc3MsICJJY29uVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvblR5cGVfU21hbGxJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBJY29uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBJY29uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvblR5cGVfTGFuZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFuZyIsIG51bGwsIDAsIDEsIEljb25UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGlzcGxheU5hbWVFQ2xhc3MsIERpc3BsYXlOYW1lLmNsYXNzLCAiRGlzcGxheU5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX0xhbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxhbmciLCBudWxsLCAwLCAxLCBEaXNwbGF5TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVXNhZ2UoKSwgdGhpcy5nZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKSwgInVzYWdlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGluayIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocGFyYW1WYWx1ZUVDbGFzcywgUGFyYW1WYWx1ZS5jbGFzcywgIlBhcmFtVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIERlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICJEZXNjcmlwdGlvbkdyb3VwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbkdyb3VwX0ljb25zKCksIHRoaXMuZ2V0SWNvblR5cGUoKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIERlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWVzKCksIHRoaXMuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICJKTkRJRW52UmVmc0dyb3VwIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudmlyb25tZW50UHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpLCB0aGlzLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJSZWZzKCksIHRoaXMuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfUmVzb3VyY2VFbnZSZWZzKCksIHRoaXMuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX0VqYkxvY2FsUmVmcygpLCB0aGlzLmdldEVKQkxvY2FsUmVmKCksIG51bGwsICJlamJMb2NhbFJlZnMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKSwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eUlkZW50aXR5RUNsYXNzLCBTZWN1cml0eUlkZW50aXR5LmNsYXNzLCAiU2VjdXJpdHlJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN1cml0eUlkZW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHVzZUNhbGxlcklkZW50aXR5RUNsYXNzLCBVc2VDYWxsZXJJZGVudGl0eS5jbGFzcywgIlVzZUNhbGxlcklkZW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRpb25FQ2xhc3MsIERlc2NyaXB0aW9uLmNsYXNzLCAiRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX0xhbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxhbmciLCBudWxsLCAwLCAxLCBEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhxTmFtZUVDbGFzcywgUU5hbWUuY2xhc3MsICJRTmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UU5hbWVfTG9jYWxQYXJ0KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhbFBhcnQiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UU5hbWVfQ29tYmluZWRRTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tYmluZWRRTmFtZSIsIG51bGwsIDAsIDEsIFFOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRRTmFtZV9JbnRlcm5hbFByZWZpeE9yTnNVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImludGVybmFsUHJlZml4T3JOc1VSSSIsIG51bGwsIDAsIDEsIFFOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobGlzdGVuZXJFQ2xhc3MsIExpc3RlbmVyLmNsYXNzLCAiTGlzdGVuZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExpc3RlbmVyX0xpc3RlbmVyQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsaXN0ZW5lckNsYXNzIiwgbnVsbCwgMSwgMSwgTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcywgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICJDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNwbGF5TmFtZSIsIG51bGwsIDAsIDEsIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLmNsYXNzLCAiRW52RW50cnlUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLlNUUklOR19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSU5URUdFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuQk9PTEVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuRE9VQkxFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5CWVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5TSE9SVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuTE9OR19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuRkxPQVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkNIQVJBQ1RFUl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmVzQXV0aFR5cGVCYXNlRUVudW0sIFJlc0F1dGhUeXBlQmFzZS5jbGFzcywgIlJlc0F1dGhUeXBlQmFzZSIpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFR5cGVCYXNlRUVudW0sIFJlc0F1dGhUeXBlQmFzZS5DT05UQUlORVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLkFQUExJQ0FUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFR5cGVCYXNlRUVudW0sIFJlc0F1dGhUeXBlQmFzZS5TRVJWTEVUX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShlamJSZWZUeXBlRUVudW0sIEVqYlJlZlR5cGUuY2xhc3MsICJFamJSZWZUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlamJSZWZUeXBlRUVudW0sIEVqYlJlZlR5cGUuU0VTU0lPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5FTlRJVFlfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5jbGFzcywgIlJlc1NoYXJpbmdTY29wZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5TSEFSRUFCTEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0sIFJlc1NoYXJpbmdTY29wZVR5cGUuVU5TSEFSRUFCTEVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuQ09OU1VNRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLlBST0RVQ0VTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19QUk9EVUNFU19MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vQ29tbW9uUGFja2FnZUltcGwKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDJmMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQUxMX0lDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzbWFsbEljb24gPSBTTUFMTF9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBUkdFX0lDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFyZ2VJY29uKCkgPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsYXJnZUljb24gPSBMQVJHRV9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheU5hbWUgPSBESVNQTEFZX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWVBZGFwdGVycygpLmFkZChuZXcgRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSAKLQkJCXJldHVybiBnZXRTbWFsbEljb25HZW4oKTsKLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXJldHVybiBnZXRTbWFsbEljb25HZW4oKTsgCi0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQlkZWZhdWx0IDoKLQkJCWlmIChnZXRJY29ucygpLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuICgoSWNvblR5cGUpZ2V0SWNvbnMoKS5nZXQoMCkpLmdldFNtYWxsSWNvbigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIG5ld1NtYWxsSWNvbikgewotCQlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlzZXRTbWFsbEljb25HZW4obmV3U21hbGxJY29uKTsKLQkJCWludGVybmFsU2V0U21hbGxJY29uSW5MaXN0KG5ld1NtYWxsSWNvbik7IAotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlzZXRTbWFsbEljb25HZW4obmV3U21hbGxJY29uKTsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6IAotCQkJaW50ZXJuYWxTZXRTbWFsbEljb25Jbkxpc3QobmV3U21hbGxJY29uKTsgCi0JCQlicmVhazsKLQkJfQotCX0KLQkvKioKLQkgKiBAcGFyYW0gbmV3U21hbGxJY29uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXRTbWFsbEljb25Jbkxpc3QoU3RyaW5nIG5ld1NtYWxsSWNvbikgewotCQlJY29uVHlwZSBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldEljb25zKCkuc2l6ZSgpID4gMCkgewotCQkJbmV3VmFsdWUgPSAoSWNvblR5cGUpIGdldEljb25zKCkuZ2V0KDApOwotCQkJbmV3VmFsdWUuc2V0U21hbGxJY29uKG5ld1NtYWxsSWNvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdWYWx1ZSA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUljb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRTbWFsbEljb24obmV3U21hbGxJY29uKTsKLQkJCWdldEljb25zKCkuYWRkKG5ld1ZhbHVlKTsgCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbkdlbigpIHsKLQkJcmV0dXJuIHNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb25HZW4oU3RyaW5nIG5ld1NtYWxsSWNvbikgewotCQlTdHJpbmcgb2xkU21hbGxJY29uID0gc21hbGxJY29uOwotCQlzbWFsbEljb24gPSBuZXdTbWFsbEljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTiwgb2xkU21hbGxJY29uLCBzbWFsbEljb24pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZ2V0TGFyZ2VJY29uR2VuKCk7Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlyZXR1cm4gZ2V0TGFyZ2VJY29uR2VuKCk7IAotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6Ci0JCQlpZiAoZ2V0SWNvbnMoKS5zaXplKCkgPiAwKQotCQkJCXJldHVybiAoKEljb25UeXBlKWdldEljb25zKCkuZ2V0KDApKS5nZXRMYXJnZUljb24oKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0JCQlpbnRlcm5hbFNldExhcmdlSWNvbkluTGlzdChuZXdMYXJnZUljb24pOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQlzZXRMYXJnZUljb25HZW4obmV3TGFyZ2VJY29uKTsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6IAotCQkJaW50ZXJuYWxTZXRMYXJnZUljb25Jbkxpc3QobmV3TGFyZ2VJY29uKTsgCi0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdMYXJnZUljb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFNldExhcmdlSWNvbkluTGlzdChTdHJpbmcgbmV3TGFyZ2VJY29uKSB7Ci0JCUljb25UeXBlIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYoZ2V0SWNvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQluZXdWYWx1ZSA9IChJY29uVHlwZSkgZ2V0SWNvbnMoKS5nZXQoMCk7Ci0JCQluZXdWYWx1ZS5zZXRMYXJnZUljb24obmV3TGFyZ2VJY29uKTsKLQkJfQotCQllbHNlIHsKLQkJCW5ld1ZhbHVlID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldExhcmdlSWNvbihuZXdMYXJnZUljb24pOwotCQkJZ2V0SWNvbnMoKS5hZGQobmV3VmFsdWUpOyAKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbkdlbigpIHsKLQkJcmV0dXJuIGxhcmdlSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXJnZUljb25HZW4oU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlTdHJpbmcgb2xkTGFyZ2VJY29uID0gbGFyZ2VJY29uOwotCQlsYXJnZUljb24gPSBuZXdMYXJnZUljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTiwgb2xkTGFyZ2VJY29uLCBsYXJnZUljb24pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSAKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbkdlbigpOwotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uR2VuKCk7IAotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6Ci0JCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkuc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gKChEZXNjcmlwdGlvbilnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCkpLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlzZXREZXNjcmlwdGlvbkdlbihuZXdEZXNjcmlwdGlvbik7Ci0JCQlpbnRlcm5hbFNldERlc2NyaXB0aW9uSW5MaXN0KG5ld0Rlc2NyaXB0aW9uKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJc2V0RGVzY3JpcHRpb25HZW4obmV3RGVzY3JpcHRpb24pOwotCQkJYnJlYWs7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQlkZWZhdWx0IDoKLQkJCWludGVybmFsU2V0RGVzY3JpcHRpb25Jbkxpc3QobmV3RGVzY3JpcHRpb24pOyAKLQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBuZXdEZXNjcmlwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0RGVzY3JpcHRpb25Jbkxpc3QoU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCURlc2NyaXB0aW9uIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYoZ2V0RGVzY3JpcHRpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJbmV3VmFsdWUgPSAoRGVzY3JpcHRpb24pIGdldERlc2NyaXB0aW9ucygpLmdldCgwKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rlc2NyaXB0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCW5ld1ZhbHVlID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rlc2NyaXB0aW9uKTsKLQkJCWdldERlc2NyaXB0aW9ucygpLmFkZChuZXdWYWx1ZSk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbkdlbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uR2VuKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVHZW4oKTsKLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXJldHVybiBnZXREaXNwbGF5TmFtZUdlbigpOyAKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOgotCQkJaWYgKGdldERpc3BsYXlOYW1lcygpLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuICgoRGlzcGxheU5hbWUpZ2V0RGlzcGxheU5hbWVzKCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjc2V0RGlzcGxheU5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0RGlzcGxheU5hbWVHZW4obmV3RGlzcGxheU5hbWUpOwotCQkJaW50ZXJuYWxTZXREaXNwbGF5TmFtZUluTGlzdChuZXdEaXNwbGF5TmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXNldERpc3BsYXlOYW1lR2VuKG5ld0Rpc3BsYXlOYW1lKTsKLQkJCWJyZWFrOwotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLQkJZGVmYXVsdCA6Ci0JCQlpbnRlcm5hbFNldERpc3BsYXlOYW1lSW5MaXN0KG5ld0Rpc3BsYXlOYW1lKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0Rpc3BsYXlOYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXREaXNwbGF5TmFtZUluTGlzdChTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJRGlzcGxheU5hbWUgbmV3VmFsdWUgPSBudWxsOwotCQlpZihnZXREaXNwbGF5TmFtZXMoKS5zaXplKCkgPiAwKSB7Ci0JCQluZXdWYWx1ZSA9IChEaXNwbGF5TmFtZSkgZ2V0RGlzcGxheU5hbWVzKCkuZ2V0KDApOwotCQkJbmV3VmFsdWUuc2V0VmFsdWUobmV3RGlzcGxheU5hbWUpOwotCQl9Ci0JCWVsc2UgIHsKLQkJCW5ld1ZhbHVlID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rpc3BsYXlOYW1lKTsKLQkJCWdldERpc3BsYXlOYW1lcygpLmFkZChuZXdWYWx1ZSk7Ci0JCX0JCQkgIAotCQkKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lR2VuKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWVHZW4oU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCVN0cmluZyBvbGREaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQlkaXNwbGF5TmFtZSA9IG5ld0Rpc3BsYXlOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRSwgb2xkRGlzcGxheU5hbWUsIGRpc3BsYXlOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIExBUkdFX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IGxhcmdlSWNvbiAhPSBudWxsIDogIUxBUkdFX0lDT05fRURFRkFVTFQuZXF1YWxzKGxhcmdlSWNvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzbWFsbEljb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNtYWxsSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFyZ2VJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXJnZUljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGxheU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpc3BsYXlOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkdyb3VwQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlNzU1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkdyb3VwQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotCi0KLQotLyoqCi0JICogQGF1dGhvciBjYnJpZGdoYQotCSAqCi0JICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0JICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0ljb25zKCkgfHwKLQkJCQkJbXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJY29uVHlwZV9MYXJnZUljb24oKSB8fAotCQkJCQltc2cuZ2V0RmVhdHVyZSgpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEljb25UeXBlX1NtYWxsSWNvbigpKSB7Ci0JCQkJCXN5bmNoSWNvbnMoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCWVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSB8fAotCQkJCQltc2cuZ2V0RmVhdHVyZSgpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0aW9uX1ZhbHVlKCkpIHsKLQkJCQkJc3luY2hEZXNjcmlwdGlvbigpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpIHx8Ci0JCQkJCW1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSkgewotCQkJCQlzeW5jaERpc3BsYXlOYW1lKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzeW5jaERlc2NyaXB0aW9uKCkgewotCQkJQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgbXlUYXJnZXQgPSAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAobXlUYXJnZXQuZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKQotCQkJCW15VGFyZ2V0LnNldERlc2NyaXB0aW9uR2VuKG51bGwpOwotCQkJZWxzZSB7Ci0JCQkJRGVzY3JpcHRpb24gYURlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKW15VGFyZ2V0LmdldERlc2NyaXB0aW9ucygpLmdldCgwKTsKLQkJCQlpZiAoIWFEZXNjcmlwdGlvbi5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLQkJCQkJYURlc2NyaXB0aW9uLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCQllbHNlIAotCQkJCQlteVRhcmdldC5zZXREZXNjcmlwdGlvbkdlbihhRGVzY3JpcHRpb24uZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc3luY2hEaXNwbGF5TmFtZSgpIHsKLQkJCUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG15VGFyZ2V0ID0gKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKWdldFRhcmdldCgpOwotCQkJaWYgKG15VGFyZ2V0LmdldERpc3BsYXlOYW1lcygpLmlzRW1wdHkoKSkKLQkJCQlteVRhcmdldC5zZXREaXNwbGF5TmFtZUdlbihudWxsKTsKLQkJCWVsc2UgewotCQkJCURpc3BsYXlOYW1lIGFEaXNwbGF5TmFtZSA9IChEaXNwbGF5TmFtZSlteVRhcmdldC5nZXREaXNwbGF5TmFtZXMoKS5nZXQoMCk7Ci0JCQkJaWYgKCFhRGlzcGxheU5hbWUuZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJCWFEaXNwbGF5TmFtZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJbXlUYXJnZXQuc2V0RGlzcGxheU5hbWVHZW4oYURpc3BsYXlOYW1lLmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHN5bmNoSWNvbnMoKSB7Ci0JCQlDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBteVRhcmdldCA9IChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cClnZXRUYXJnZXQoKTsKLQkJCWlmIChteVRhcmdldC5nZXRJY29ucygpLmlzRW1wdHkoKSkgewotCQkJCW15VGFyZ2V0LnNldExhcmdlSWNvbkdlbihudWxsKTsKLQkJCQlteVRhcmdldC5zZXRTbWFsbEljb25HZW4obnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJY29uVHlwZSBhbkljb24gPSAoSWNvblR5cGUpbXlUYXJnZXQuZ2V0SWNvbnMoKS5nZXQoMCk7Ci0JCQkJaWYgKCFhbkljb24uZUFkYXB0ZXJzKCkuY29udGFpbnModGhpcykpCi0JCQkJCWFuSWNvbi5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW15VGFyZ2V0LnNldExhcmdlSWNvbkdlbihhbkljb24uZ2V0TGFyZ2VJY29uKCkpOwotCQkJCQlteVRhcmdldC5zZXRTbWFsbEljb25HZW4oYW5JY29uLmdldFNtYWxsSWNvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJaWYgKG5ld1RhcmdldCBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKQotCQkJc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQ1Y2E5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+QW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkdyb3VwSW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGVzY3JpcHRpb25Hcm91cEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkdyb3VwSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRGVzY3JpcHRpb25Hcm91cCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0SWNvbnMoKSBAZ2VuZXJhdGVkIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lcygpIEBnZW5lcmF0ZWQgQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkgQGdlbmVyYXRlZCBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT48IS0tIGVuZC11c2VyLWRvYyAtLT5AZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uR3JvdXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+QGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+QGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJY29ucygpIHsKLQkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb25UeXBlLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUyk7Ci0JCX0KLQkJcmV0dXJuIGljb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+QGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheU5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+QGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT48IS0tIGVuZC11c2VyLWRvYyAtLT5AZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+PCEtLSBlbmQtdXNlci1kb2MgLS0+QGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT48IS0tIGVuZC11c2VyLWRvYyAtLT5AZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPkBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT48IS0tIGVuZC11c2VyLWRvYyAtLT5AZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAjZ2V0SjJFRVZlcnNpb25JRCgpCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCQotCQl0cnkgewotCQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJcmV0dXJuIHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJfQotCQkKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvbkdyb3VwSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxMzJlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbCNnZXRMYW5nIDxlbT5MYW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhbmcoKSA8ZW0+TGFuZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFuZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFuZyA9IExBTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpIHsKLQkJcmV0dXJuIGxhbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZyhTdHJpbmcgbmV3TGFuZykgewotCQlTdHJpbmcgb2xkTGFuZyA9IGxhbmc7Ci0JCWxhbmcgPSBuZXdMYW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HLCBvbGRMYW5nLCBsYW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKLQkJCQlyZXR1cm4gZ2V0TGFuZygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJc2V0TGFuZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKLQkJCQlyZXR1cm4gTEFOR19FREVGQVVMVCA9PSBudWxsID8gbGFuZyAhPSBudWxsIDogIUxBTkdfRURFRkFVTFQuZXF1YWxzKGxhbmcpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxhbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlYzM5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZUltcGwjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlOYW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRGlzcGxheU5hbWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhbmcgPSBMQU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzcGxheU5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzcGxheU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBsYW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIG5ld0xhbmcpIHsKLQkJU3RyaW5nIG9sZExhbmcgPSBsYW5nOwotCQlsYW5nID0gbmV3TGFuZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkcsIG9sZExhbmcsIGxhbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJcmV0dXJuIGdldExhbmcoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJc2V0TGFuZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORzoKLQkJCQlzZXRMYW5nKExBTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGFuZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFuZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlzcGxheU5hbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FSkJMb2NhbFJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VKQkxvY2FsUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjI3ODhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VKQkxvY2FsUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZlR5cGU7Ci0KLS8qKgotICogVGhlIGVqYi1sb2NhbC1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgcmVmZXJlbmNpbmcgZW50ZXJwcmlzZSBiZWFuOyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgYW5kIGFuIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLiBUaGUgb3B0aW9uYWwgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotICogVXNlZCBpbjogZW50aXR5LCBzZXNzaW9uLCBtZXNzYWdlLWRyaXZlbgotICovCi1wdWJsaWMgY2xhc3MgRUpCTG9jYWxSZWZJbXBsIGV4dGVuZHMgRWpiUmVmSW1wbCBpbXBsZW1lbnRzIEVKQkxvY2FsUmVmLCBFamJSZWZ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxIb21lKCkgPGVtPkxvY2FsIEhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsSG9tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfSE9NRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEhvbWUoKSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxIb21lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsSG9tZSA9IExPQ0FMX0hPTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWwoKSA8ZW0+TG9jYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbCgpIDxlbT5Mb2NhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYWwgPSBMT0NBTF9FREVGQVVMVDsKLQotCXB1YmxpYyBFSkJMb2NhbFJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTG9jYWxSZWYoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsSG9tZSgpIHsKLQkJcmV0dXJuIGxvY2FsSG9tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWUoU3RyaW5nIG5ld0xvY2FsSG9tZSkgewotCQlTdHJpbmcgb2xkTG9jYWxIb21lID0gbG9jYWxIb21lOwotCQlsb2NhbEhvbWUgPSBuZXdMb2NhbEhvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSwgb2xkTG9jYWxIb21lLCBsb2NhbEhvbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsKCkgewotCQlyZXR1cm4gbG9jYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoU3RyaW5nIG5ld0xvY2FsKSB7Ci0JCVN0cmluZyBvbGRMb2NhbCA9IGxvY2FsOwotCQlsb2NhbCA9IG5ld0xvY2FsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMLCBvbGRMb2NhbCwgbG9jYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19IT01FOgotCQkJCXJldHVybiBnZXRIb21lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fUkVNT1RFOgotCQkJCXJldHVybiBnZXRSZW1vdGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MSU5LOgotCQkJCXJldHVybiBnZXRMaW5rKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgotCQkJCXJldHVybiBnZXRMb2NhbEhvbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTDoKLQkJCQlyZXR1cm4gZ2V0TG9jYWwoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19UWVBFOgotCQkJCXNldFR5cGUoKEVqYlJlZlR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19IT01FOgotCQkJCXNldEhvbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX1JFTU9URToKLQkJCQlzZXRSZW1vdGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xJTks6Ci0JCQkJc2V0TGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUU6Ci0JCQkJc2V0TG9jYWxIb21lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTDoKLQkJCQlzZXRMb2NhbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fVFlQRToKLQkJCQl1bnNldFR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSE9NRToKLQkJCQlzZXRIb21lKEhPTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKFJFTU9URV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xJTks6Ci0JCQkJc2V0TGluayhMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRToKLQkJCQlzZXRMb2NhbEhvbWUoTE9DQUxfSE9NRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMOgotCQkJCXNldExvY2FsKExPQ0FMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRUeXBlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSE9NRToKLQkJCQlyZXR1cm4gSE9NRV9FREVGQVVMVCA9PSBudWxsID8gaG9tZSAhPSBudWxsIDogIUhPTUVfRURFRkFVTFQuZXF1YWxzKGhvbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX1JFTU9URToKLQkJCQlyZXR1cm4gUkVNT1RFX0VERUZBVUxUID09IG51bGwgPyByZW1vdGUgIT0gbnVsbCA6ICFSRU1PVEVfRURFRkFVTFQuZXF1YWxzKHJlbW90ZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gTElOS19FREVGQVVMVCA9PSBudWxsID8gbGluayAhPSBudWxsIDogIUxJTktfRURFRkFVTFQuZXF1YWxzKGxpbmspOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRToKLQkJCQlyZXR1cm4gTE9DQUxfSE9NRV9FREVGQVVMVCA9PSBudWxsID8gbG9jYWxIb21lICE9IG51bGwgOiAhTE9DQUxfSE9NRV9FREVGQVVMVC5lcXVhbHMobG9jYWxIb21lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTDoKLQkJCQlyZXR1cm4gTE9DQUxfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsICE9IG51bGwgOiAhTE9DQUxfRURFRkFVTFQuZXF1YWxzKGxvY2FsKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2FsSG9tZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9jYWxIb21lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9jYWwpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGVqYnJlZiBpcyBmb3IgYSBsb2NhbCBlamIgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCl7Ci0JcmV0dXJuIHRydWU7Ci19Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkVqYlJlZiNnZXRSZW1vdGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlKCkgewotCQlyZXR1cm4gZ2V0TG9jYWwoKTsgLy9mb3J3YXJkIHRvIHRoZSBsb2NhbAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRWpiUmVmI3NldFJlbW90ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZShTdHJpbmcgdmFsdWUpIHsKLQkJc2V0TG9jYWwodmFsdWUpOyAvL2ZvcndhcmQgdG8gdGhlIGxvY2FsCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5FamJSZWYjZ2V0SG9tZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb21lKCkgewotCQlyZXR1cm4gZ2V0TG9jYWxIb21lKCk7IC8vZm9yd2FyZCB0byB0aGUgbG9jYWwgaG9tZQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRWpiUmVmI3NldEhvbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyB2YWx1ZSkgewotCQlzZXRMb2NhbEhvbWUodmFsdWUpOyAvL2ZvcndhcmQgdG8gdGhlIGxvY2FsIGhvbWUKLQl9Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRWpiUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRWpiUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU2OTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VqYlJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotLyoqCi0gKiBUaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gY2xpZW50OyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47IGFuZCBhbiBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbi4gVGhlIG9wdGlvbmFsICBlamItbGluayBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJSZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFamJSZWYsIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIFRZUEVfRURFRkFVTFQgPSBFamJSZWZUeXBlLlNFU1NJT05fTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFamJSZWZUeXBlIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb21lKCkgPGVtPkhvbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob21lID0gSE9NRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtb3RlKCkgPGVtPlJlbW90ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtb3RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZW1vdGUgPSBSRU1PVEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBMSU5LX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgRWpiUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWYoKTsKLQl9Ci0KLS8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMsIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmFtZXRlci4KLSAqIFRoZSBlamItbGluayB2YWx1ZSBvZiB0aGUgcmVmIG11c3QgZXF1YXRlIHRvIGEgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGNvbnRhaW5lZCBpbiB0aGUgamFyOyBvdGhlcndpc2UgCi0gKiByZXR1cm4gbnVsbAotICovCi1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0TGlua2VkRWpiKEVKQkphciBlamJKYXIpIHsKLQlpZiAoZ2V0TGluaygpID09IG51bGwpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBlamJKYXIuZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYodGhpcyk7Ci19LyoqCi0gKiBSZXR1cm4gYW4gZW50ZXJwcmlzZSBiZWFuIHJlZmVyZW5jZWQgYnkgdGhlIEVqYlJlZiwgaWYgb25lIGV4aXN0cywgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgcGFyYW1ldGVyLgotICogVGhlIGVqYi1saW5rIHZhbHVlIG9mIHRoZSByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7IG90aGVyd2lzZSAKLSAqIHJldHVybiBudWxsCi0gKi8gIAotcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KEVqYlJlZiBhbkVqYlJlZikgewotCWlmIChhbkVqYlJlZiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JYm9vbGVhbiBlcXVpdiA9IHRydWU7Ci0JZXF1aXYgPSBnZXROYW1lKCkgPT0gYW5FamJSZWYuZ2V0TmFtZSgpIHx8IChnZXROYW1lKCkgIT0gbnVsbCAmJiBnZXROYW1lKCkuZXF1YWxzKGFuRWpiUmVmLmdldE5hbWUoKSkpOwotCWlmIChlcXVpdikKLQkJZXF1aXYgPSBnZXRIb21lKCkgPT0gYW5FamJSZWYuZ2V0SG9tZSgpIHx8IChnZXRIb21lKCkgIT0gbnVsbCAmJiBnZXRIb21lKCkuZXF1YWxzKGFuRWpiUmVmLmdldEhvbWUoKSkpOwotCWlmIChlcXVpdikKLQkJZXF1aXYgPSBnZXRSZW1vdGUoKSA9PSBhbkVqYlJlZi5nZXRSZW1vdGUoKSB8fCAoZ2V0UmVtb3RlKCkgIT0gbnVsbCAmJiBnZXRSZW1vdGUoKS5lcXVhbHMoYW5FamJSZWYuZ2V0UmVtb3RlKCkpKTsKLQlpZiAoZXF1aXYpCi0JCWVxdWl2ID0gZ2V0TGluaygpID09IGFuRWpiUmVmLmdldExpbmsoKSB8fCAoZ2V0TGluaygpICE9IG51bGwgJiYgZ2V0TGluaygpLmVxdWFscyhhbkVqYlJlZi5nZXRMaW5rKCkpKTsKLQlyZXR1cm4gZXF1aXY7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0xpbmtlZChFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCWlmIChnZXRMaW5rKCkgPT0gbnVsbCkKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiBnZXRMaW5rKCkuZXF1YWxzKGFuRUpCLmdldE5hbWUoKSk7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBlamJyZWYgaXMgZm9yIGEgbG9jYWwgZWpiIGludGVyZmFjZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNMb2NhbCgpewotCXJldHVybiBmYWxzZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhpcyBpcyB0aGUgSk5ESSBuYW1lIHRoYXQgdGhlIHNlcnZsZXQgY29kZSB1c2VzIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZW50ZXJwcmlzZSBiZWFuLgotCSAqIEV4YW1wbGU6IDxlamItcmVmLW5hbWU+ZWpiLy9QYXlyb2xsPC8vZWpiLXJlZi1uYW1lPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLiBUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkgKiA8ZWpiLXJlZi10eXBlPkVudGl0eTwvL2VqYi1yZWYtdHlwZT4KLQkgKiA8ZWpiLXJlZi10eXBlPlNlc3Npb248Ly9lamItcmVmLXR5cGU+Ci0JICovCi0JcHVibGljIEVqYlJlZlR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShFamJSZWZUeXBlIG5ld1R5cGUpIHsKLQkJRWpiUmVmVHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19UWVBFLCBvbGRUeXBlLCB0eXBlLCAhb2xkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFR5cGUoKSB7Ci0JCUVqYlJlZlR5cGUgb2xkVHlwZSA9IHR5cGU7Ci0JCWJvb2xlYW4gb2xkVHlwZUVTZXQgPSB0eXBlRVNldDsKLQkJdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JCXR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19UWVBFLCBvbGRUeXBlLCBUWVBFX0VERUZBVUxULCBvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lIGludGVyZmFjZS4KLQkgKiBFeGFtcGxlOiA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvL2hvbWU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb21lKCkgewotCQlyZXR1cm4gaG9tZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyBuZXdIb21lKSB7Ci0JCVN0cmluZyBvbGRIb21lID0gaG9tZTsKLQkJaG9tZSA9IG5ld0hvbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fSE9NRSwgb2xkSG9tZSwgaG9tZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGUoKSB7Ci0JCXJldHVybiByZW1vdGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlKFN0cmluZyBuZXdSZW1vdGUpIHsKLQkJU3RyaW5nIG9sZFJlbW90ZSA9IHJlbW90ZTsKLQkJcmVtb3RlID0gbmV3UmVtb3RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9SRUZfX1JFTU9URSwgb2xkUmVtb3RlLCByZW1vdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZW5jb21wYXNzaW5nIEoyRUUgQXBwbGljYXRpb24gcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBKMkVFIEFwcGxpY2F0aW9uIHBhY2thZ2UuIAotCSAqIEV4YW1wbGU6IDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvL2VqYi1saW5rPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbmV3TGluaykgewotCQlTdHJpbmcgb2xkTGluayA9IGxpbms7Ci0JCWxpbmsgPSBuZXdMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0xJTkssIG9sZExpbmssIGxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiBUaGUKLQkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvCi0JICogICAgICAgICAgICBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuIFRoZSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlCi0JICogICAgICAgICAgICBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlCi0JICogICAgICAgICAgICAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZQotCSAqICAgICAgICAgICAgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbgotCSAqICAgICAgICAgICAgcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uID0gZC5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fSE9NRToKLQkJCQlyZXR1cm4gZ2V0SG9tZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX1JFTU9URToKLQkJCQlyZXR1cm4gZ2V0UmVtb3RlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gZ2V0TGluaygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19UWVBFOgotCQkJCXJldHVybiBpc1NldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19IT01FOgotCQkJCXJldHVybiBIT01FX0VERUZBVUxUID09IG51bGwgPyBob21lICE9IG51bGwgOiAhSE9NRV9FREVGQVVMVC5lcXVhbHMoaG9tZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFOgotCQkJCXJldHVybiBSRU1PVEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlbW90ZSAhPSBudWxsIDogIVJFTU9URV9FREVGQVVMVC5lcXVhbHMocmVtb3RlKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19MSU5LOgotCQkJCXJldHVybiBMSU5LX0VERUZBVUxUID09IG51bGwgPyBsaW5rICE9IG51bGwgOiAhTElOS19FREVGQVVMVC5lcXVhbHMobGluayk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoRWpiUmVmVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0hPTUU6Ci0JCQkJc2V0SG9tZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fUkVNT1RFOgotCQkJCXNldFJlbW90ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fVFlQRToKLQkJCQl1bnNldFR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fSE9NRToKLQkJCQlzZXRIb21lKEhPTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19SRU1PVEU6Ci0JCQkJc2V0UmVtb3RlKFJFTU9URV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX0xJTks6Ci0JCQkJc2V0TGluayhMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhvbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW90ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtb3RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FbnZFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY4Yzk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5VHlwZTsKLQotLyoqCi0gKiBUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJpZXMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZFbnRyeUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudkVudHJ5LCBFT2JqZWN0ewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgVFlQRV9FREVGQVVMVCA9IEVudkVudHJ5VHlwZS5TVFJJTkdfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFbnZFbnRyeVR5cGUgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEVudkVudHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnZFbnRyeSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlci4KLQkgKiBVc2VkIGluOiBlbnYtZW50cnkKLQkgKiBFeGFtcGxlOgotCSAqIDxlbnYtZW50cnktdmFsdWU+Ly9kYXRhc291cmNlcy8vTXlEYXRhYmFzZTwvL2Vudi1lbnRyeS12YWx1ZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOiBqYXZhLmxhbmcuQm9vbC1lYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LCBqYXZhLmxhbmcuTG9uZywgYW5kIGphdmEubGFuZy5GbG9hdC4gCi0JICogRXhhbXBsZTogPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC8vZW52LWVudHJ5LXR5cGU+Ci0JICovCi0JcHVibGljIEVudkVudHJ5VHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEVudkVudHJ5VHlwZSBuZXdUeXBlKSB7Ci0JCUVudkVudHJ5VHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1RZUEUsIG9sZFR5cGUsIHR5cGUsICFvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHlwZSgpIHsKLQkJRW52RW50cnlUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGUgPSBUWVBFX0VERUZBVUxUOwotCQl0eXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19UWVBFLCBvbGRUeXBlLCBUWVBFX0VERUZBVUxULCBvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHlwZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19UWVBFOgotCQkJCXNldFR5cGUoKEVudkVudHJ5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fVFlQRToKLQkJCQl1bnNldFR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJaWYgKHR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSWNvblR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JY29uVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4ZTg1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JY29uVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWNvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5JY29uVHlwZUltcGwjZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5JY29uVHlwZUltcGwjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5JY29uVHlwZUltcGwjZ2V0TGFuZyA8ZW0+TGFuZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEljb25UeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSWNvblR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTTUFMTF9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc21hbGxJY29uID0gU01BTExfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJHRV9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFyZ2VJY29uID0gTEFSR0VfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYW5nKCkgPGVtPkxhbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFuZygpIDxlbT5MYW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhbmcgPSBMQU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEljb25UeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEljb25UeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7Ci0JCXJldHVybiBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJU3RyaW5nIG9sZFNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQkJc21hbGxJY29uID0gbmV3U21hbGxJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fU01BTExfSUNPTiwgb2xkU21hbGxJY29uLCBzbWFsbEljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJcmV0dXJuIGxhcmdlSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oU3RyaW5nIG5ld0xhcmdlSWNvbikgewotCQlTdHJpbmcgb2xkTGFyZ2VJY29uID0gbGFyZ2VJY29uOwotCQlsYXJnZUljb24gPSBuZXdMYXJnZUljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQVJHRV9JQ09OLCBvbGRMYXJnZUljb24sIGxhcmdlSWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpIHsKLQkJcmV0dXJuIGxhbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZyhTdHJpbmcgbmV3TGFuZykgewotCQlTdHJpbmcgb2xkTGFuZyA9IGxhbmc7Ci0JCWxhbmcgPSBuZXdMYW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFORywgb2xkTGFuZywgbGFuZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQU5HOgotCQkJCXJldHVybiBnZXRMYW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFORzoKLQkJCQlzZXRMYW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19MQU5HOgotCQkJCXNldExhbmcoTEFOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JQ09OX1RZUEVfX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNtYWxsSWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc21hbGxJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXJnZUljb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhcmdlSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFuZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFuZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0ljb25UeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSWRlbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MzBmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JZGVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLklkZW50aXR5OwotCi0KLS8qKgotICogU3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIElkZW50aXR5LCBFT2JqZWN0ewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZSgpIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZSA9IFJPTEVfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgSWRlbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldElkZW50aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcnVuIGFzIGlkZW50aXR5LgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0JICogCi0JICogVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7Ci0JCXJldHVybiByb2xlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJvbGVOYW1lID0gcm9sZU5hbWU7Ci0JCXJvbGVOYW1lID0gbmV3Um9sZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX1JPTEVfTkFNRSwgb2xkUm9sZU5hbWUsIHJvbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FOgotCQkJCXJldHVybiBnZXRSb2xlTmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX1JPTEVfTkFNRToKLQkJCQlyZXR1cm4gUk9MRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyByb2xlTmFtZSAhPSBudWxsIDogIVJPTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMocm9sZU5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fUk9MRV9OQU1FOgotCQkJCXNldFJvbGVOYW1lKFJPTEVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVSZXNvdWNlRmFjdG9yeVNheFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTc2MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDExLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkFwcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJTQVhSZW5kZXJlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUKLSAqIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkgZXh0ZW5kcyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgewotICAgIHB1YmxpYyBzdGF0aWMgSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEoyRUVSZXNvdWNlRmFjdG9yeVNheFJlZ2lzdHJ5KCk7Ci0KLSAgICBwdWJsaWMgSjJFRVJlc291Y2VGYWN0b3J5U2F4UmVnaXN0cnkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGluaXRSZWdpc3RyYXRpb24oKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXRSZWdpc3RyYXRpb24oKSB7Ci0gICAgCUVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0Uuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIG5ldyBFSkJKYXJSZXNvdXJjZUZhY3RvcnkoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9TSE9SVF9OQU1FLCBuZXcgV2ViQXBwUmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSwgbmV3IEFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5SQVJfU0hPUlRfTkFNRSwgbmV3IENvbm5lY3RvclJlc291cmNlRmFjdG9yeShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TSE9SVE5BTUUsIG5ldyBXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FLCBuZXcgV3NkZFJlc291cmNlRmFjdG9yeShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5RG9tUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NDIwZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyMCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyU0FYUmVuZGVyZXJGYWN0b3J5OwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeQotICAgICAgICBleHRlbmRzIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5KCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0UmVnaXN0cmF0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbml0UmVnaXN0cmF0aW9uKCkgewotICAgIAlFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FLCBuZXcgRUpCSmFyUmVzb3VyY2VGYWN0b3J5KEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLSAgICAgICAgcmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfU0hPUlRfTkFNRSwgbmV3IFdlYkFwcFJlc291cmNlRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9TSE9SVF9OQU1FLCBuZXcgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1NIT1JUX05BTUUsIG5ldyBBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0gICAgICAgIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuUkFSX1NIT1JUX05BTUUsIG5ldyBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU0hPUlROQU1FLCBuZXcgV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotICAgICAgICByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSwgbmV3IFdzZGRSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxZDI1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHsKLQkKLQlwdWJsaWMgc3RhdGljIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQotCXB1YmxpYyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGRlbGVnYXRlZEdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlpZiAoSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFID09IHRoaXMpCi0JCQlyZXR1cm4gc3VwZXIuZGVsZWdhdGVkR2V0RmFjdG9yeSh1cmkpOwotCQlyZXR1cm4gSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkodXJpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSk5ESUVudlJlZnNHcm91cEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0pORElFbnZSZWZzR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzhiNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSk5ESUVudlJlZnNHcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KTkRJIEVudiBSZWZzIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KTkRJRW52UmVmc0dyb3VwSW1wbCNnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMgPGVtPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsI2dldFJlc291cmNlUmVmcyA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSk5ESUVudlJlZnNHcm91cEltcGwjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpORElFbnZSZWZzR3JvdXBJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgSk5ESUVudlJlZnNHcm91cCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkgPGVtPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52aXJvbm1lbnRQcm9wZXJ0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlUmVmcygpIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZzKCkgPGVtPkVqYiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRW52UmVmcygpIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUVudlJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTG9jYWxSZWZzKCkgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYkxvY2FsUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSk5ESUVudlJlZnNHcm91cEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudmlyb25tZW50UHJvcGVydGllcygpIHsKLQkJaWYgKGVudmlyb25tZW50UHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQllbnZpcm9ubWVudFByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRW52RW50cnkuY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGVudmlyb25tZW50UHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2VSZWZzKCkgewotCQlpZiAocmVzb3VyY2VSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZVJlZi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFamJSZWZzKCkgewotCQlpZiAoZWpiUmVmcyA9PSBudWxsKSB7Ci0JCQllamJSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVqYlJlZi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIGVqYlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlc291cmNlRW52UmVmcygpIHsKLQkJaWYgKHJlc291cmNlRW52UmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUVudlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VFbnZSZWYuY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfRU5WX1JFRlMpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUVudlJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVqYkxvY2FsUmVmcygpIHsKLQkJaWYgKGVqYkxvY2FsUmVmcyA9PSBudWxsKSB7Ci0JCQllamJMb2NhbFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRUpCTG9jYWxSZWYuY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX0xPQ0FMX1JFRlMpOwotCQl9Ci0JCXJldHVybiBlamJMb2NhbFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25SZWZzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlcnZpY2VSZWZzKCkgewotCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fSUNPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudmlyb25tZW50UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVJlZnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiTG9jYWxSZWZzKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCWdldEVudmlyb25tZW50UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCWdldEVudmlyb25tZW50UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGVudmlyb25tZW50UHJvcGVydGllcyAhPSBudWxsICYmICFlbnZpcm9ubWVudFByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTOgotCQkJCXJldHVybiBlamJSZWZzICE9IG51bGwgJiYgIWVqYlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZWpiTG9jYWxSZWZzICE9IG51bGwgJiYgIWVqYkxvY2FsUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9KTkRJRW52UmVmc0dyb3VwSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTGlzdGVuZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9MaXN0ZW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkNGI3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9MaXN0ZW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLSAqLwotcHVibGljIGNsYXNzIExpc3RlbmVySW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGxpc3RlbmVyQ2xhc3MgPSBudWxsOwotCQkvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByb3RlY3RlZCBMaXN0ZW5lckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJaWYgKGxpc3RlbmVyQ2xhc3MgIT0gbnVsbCAmJiBsaXN0ZW5lckNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRMaXN0ZW5lckNsYXNzID0gbGlzdGVuZXJDbGFzczsKLQkJCWxpc3RlbmVyQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClsaXN0ZW5lckNsYXNzKTsKLQkJCWlmIChsaXN0ZW5lckNsYXNzICE9IG9sZExpc3RlbmVyQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUywgb2xkTGlzdGVuZXJDbGFzcywgbGlzdGVuZXJDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0ZW5lckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckNsYXNzKEphdmFDbGFzcyBuZXdMaXN0ZW5lckNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRMaXN0ZW5lckNsYXNzID0gbGlzdGVuZXJDbGFzczsKLQkJbGlzdGVuZXJDbGFzcyA9IG5ld0xpc3RlbmVyQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTLCBvbGRMaXN0ZW5lckNsYXNzLCBsaXN0ZW5lckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19JQ09OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TGlzdGVuZXJDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldExpc3RlbmVyQ2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTOgotCQkJCXJldHVybiBsaXN0ZW5lckNsYXNzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19MSVNURU5FUl9DTEFTUzoKLQkJCQlzZXRMaXN0ZW5lckNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6Ci0JCQkJc2V0TGlzdGVuZXJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLS8qKgotICogY3JlYXRlQ2xhc3NSZWYgLSByZXR1cm4gYSBKYXZhVVJMIHJlZmVyZW5jZSB0byB0aGUgbmFtZWQgSmF2YSBjbGFzcwotICovCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLX0KLS8qKgotICogR2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGxpc3RlbmVyLgotICovCi1wdWJsaWMgU3RyaW5nIGdldExpc3RlbmVyQ2xhc3NOYW1lKCkgewotCWdldExpc3RlbmVyQ2xhc3MoKTsKLQlyZXR1cm4gKGxpc3RlbmVyQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGxpc3RlbmVyIGNsYXNzIG5hbWUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3NOYW1lKFN0cmluZyBsaXN0ZW5lckNsYXNzTmFtZSkgewotCWVTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCBjcmVhdGVDbGFzc1JlZihsaXN0ZW5lckNsYXNzTmFtZSkpOwotfQotfSAvL0xpc3RlbmVySW1wbAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTlmN2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBNZXNzYWdlRGVzdGluYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2EyMTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0VXNhZ2UgPGVtPlVzYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsI2dldExpbmsgPGVtPkxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXNzYWdlRGVzdGluYXRpb25SZWYgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2UoKSA8ZW0+VXNhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBVU0FHRV9FREVGQVVMVCA9IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2UoKSA8ZW0+VXNhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHVzYWdlID0gVVNBR0VfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRoIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzZUVTZXQgPSBmYWxzZTsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsaW5rID0gTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiB1c2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgbmV3VXNhZ2UpIHsKLQkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG9sZFVzYWdlID0gdXNhZ2U7Ci0JCXVzYWdlID0gbmV3VXNhZ2UgPT0gbnVsbCA/IFVTQUdFX0VERUZBVUxUIDogbmV3VXNhZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFLCBvbGRVc2FnZSwgdXNhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VXNhZ2UoKSB7Ci0JCU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBvbGRVc2FnZSA9IHVzYWdlOwotCQlib29sZWFuIG9sZFVzYWdlRVNldCA9IHVzZUVTZXQ7Ci0JCXVzYWdlID0gVVNBR0VfRURFRkFVTFQ7Ci0JCXVzZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRSwgb2xkVXNhZ2UsIFVTQUdFX0VERUZBVUxULCBvbGRVc2FnZUVTZXQpKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVzZSgpIHsKLQkJcmV0dXJuIHVzZUVTZXQ7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbmV3TGluaykgewotCQlTdHJpbmcgb2xkTGluayA9IGxpbms7Ci0JCWxpbmsgPSBuZXdMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19MSU5LLCBvbGRMaW5rLCBsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fVVNBR0U6Ci0JCQkJcmV0dXJuIGdldFVzYWdlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0xJTks6Ci0JCQkJcmV0dXJuIGdldExpbmsoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFOgotCQkJCXNldFVzYWdlKChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19VU0FHRToKLQkJCQlzZXRVc2FnZShVU0FHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX1VTQUdFOgotCQkJCXJldHVybiB1c2FnZSAhPSBVU0FHRV9FREVGQVVMVDsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTElOSzoKLQkJCQlyZXR1cm4gTElOS19FREVGQVVMVCA9PSBudWxsID8gbGluayAhPSBudWxsIDogIUxJTktfRURFRkFVTFQuZXF1YWxzKGxpbmspOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNhZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVzYWdlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmM2FjOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmFtIFZhbHVlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlBhcmFtVmFsdWVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUGFyYW1WYWx1ZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUGFyYW1WYWx1ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhcmFtVmFsdWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYW1WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QYXJhbVZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUU5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9RTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmMWJmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9RTmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXRMb2NhbFBhcnQgPGVtPkxvY2FsIFBhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbCNnZXRDb21iaW5lZFFOYW1lIDxlbT5Db21iaW5lZCBRTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsI2dldEludGVybmFsUHJlZml4T3JOc1VSSSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFFOYW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUU5hbWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbFBhcnQoKSA8ZW0+TG9jYWwgUGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9QQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsUGFydCgpIDxlbT5Mb2NhbCBQYXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbFBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYWxQYXJ0ID0gTE9DQUxfUEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21iaW5lZFFOYW1lKCkgPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21iaW5lZFFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01CSU5FRF9RTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21iaW5lZFFOYW1lKCkgPGVtPkNvbWJpbmVkIFFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21iaW5lZFFOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbWJpbmVkUU5hbWUgPSBDT01CSU5FRF9RTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKSA8ZW0+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVybmFsUHJlZml4T3JOc1VSSSgpIDxlbT5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW50ZXJuYWxQcmVmaXhPck5zVVJJID0gSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBRTmFtZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJR2VuKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0JCQlyZXR1cm4gbmFtZXNwYWNlVVJJOwotCQlTdHJpbmcgcmVzb2x2ZWQgPSBOYW1lc3BhY2VBZGFwdGVyLmdldFJlc29sdmVkTmFtZXNwYWNlVVJJKGludGVybmFsUHJlZml4T3JOc1VSSSwgdGhpcyk7Ci0JCXJldHVybiByZXNvbHZlZCA9PSBudWxsID8gaW50ZXJuYWxQcmVmaXhPck5zVVJJIDogcmVzb2x2ZWQ7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSUdlbihTdHJpbmcgbmV3TmFtZXNwYWNlVVJJKSB7Ci0JCVN0cmluZyBvbGROYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0JCW5hbWVzcGFjZVVSSSA9IG5ld05hbWVzcGFjZVVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSSwgb2xkTmFtZXNwYWNlVVJJLCBuYW1lc3BhY2VVUkkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5ld05hbWVzcGFjZVVSSSkgewotCSAgICBTdHJpbmcgcHJlZml4ID0gZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0JICAgIFN0cmluZyBvbGROc1VSSSA9IGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCSAgICBpZiAoIVN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHByZWZpeCwgb2xkTnNVUkkpKQotCSAgICAgICAgc2V0VmFsdWVzKHByZWZpeCwgbmV3TmFtZXNwYWNlVVJJLCBnZXRMb2NhbFBhcnQoKSk7Ci0JICAgIGVsc2UgewotCSAgICAgICAgc2V0TmFtZXNwYWNlVVJJR2VuKG5ld05hbWVzcGFjZVVSSSk7Ci0JICAgICAgICBzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkobmV3TmFtZXNwYWNlVVJJKTsKLQkgICAgfQotCQkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7Ci0JCXJldHVybiBsb2NhbFBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxQYXJ0R2VuKFN0cmluZyBuZXdMb2NhbFBhcnQpIHsKLQkJU3RyaW5nIG9sZExvY2FsUGFydCA9IGxvY2FsUGFydDsKLQkJbG9jYWxQYXJ0ID0gbmV3TG9jYWxQYXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJULCBvbGRMb2NhbFBhcnQsIGxvY2FsUGFydCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsUGFydChTdHJpbmcgbmV3TG9jYWxQYXJ0KSB7Ci0JCXNldExvY2FsUGFydEdlbihuZXdMb2NhbFBhcnQpOwotCQl1cGRhdGVDb21iaW5lKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21iaW5lZFFOYW1lKCkgewotCQlyZXR1cm4gY29tYmluZWRRTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21iaW5lZFFOYW1lR2VuKFN0cmluZyBuZXdDb21iaW5lZFFOYW1lKSB7Ci0JCVN0cmluZyBvbGRDb21iaW5lZFFOYW1lID0gY29tYmluZWRRTmFtZTsKLQkJY29tYmluZWRRTmFtZSA9IG5ld0NvbWJpbmVkUU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FLCBvbGRDb21iaW5lZFFOYW1lLCBjb21iaW5lZFFOYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tYmluZWRRTmFtZShTdHJpbmcgbmV3Q29tYmluZWRRTmFtZSkgewotCQlzZXRDb21iaW5lZFFOYW1lR2VuKG5ld0NvbWJpbmVkUU5hbWUpOwotCQl1cGRhdGVQYXJzZSgpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgY29tYmluZWQgbmFtZSBpbnRvIHRoZSBjb21wb25lbnRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhcnNlKCkgewotCQlTdHJpbmcgbnMgPSBudWxsOwotCQlTdHJpbmcgbHAgPSBudWxsOwotCQlpZiAoY29tYmluZWRRTmFtZSAhPSBudWxsIHx8IGNvbWJpbmVkUU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbnQgaW5kZXggPSBjb21iaW5lZFFOYW1lLmxhc3RJbmRleE9mKCc6Jyk7Ci0JCQkKLQkJCWlmIChpbmRleCA8IDApIHsgLy9ObyBzZXBhcmF0b3IKLQkJCQlucyA9IGNvbWJpbmVkUU5hbWU7Ci0JCQl9IGVsc2UgaWYgKGluZGV4ID09IDApIHsgLy9GaXJzdCBjaGFyCi0JCQkJbHAgPSBjb21iaW5lZFFOYW1lLnN1YnN0cmluZygxKTsgCi0JCQl9IGVsc2UgaWYgKGluZGV4ID09IGNvbWJpbmVkUU5hbWUubGVuZ3RoKCktMSkgeyAvL0xhc3QgY2hhcgotCQkJCW5zID0gY29tYmluZWRRTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJfSBlbHNlIHsgLy9JbiB0aGUgbWlkZGxlLCB3aGljaCBpcyB3aGF0IGl0IHNob3VsZCBiZQotCQkJCW5zID0gY29tYmluZWRRTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCWxwID0gY29tYmluZWRRTmFtZS5zdWJzdHJpbmcoaW5kZXgrMSwgY29tYmluZWRRTmFtZS5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0KLQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJR2VuKG5zKTsKLQkJc2V0TG9jYWxQYXJ0R2VuKGxwKTsKLQl9Ci0JCQotCS8qKgotCSAqIHVwZGF0ZXMgdGhlIGNvbWJpbmVkIG5hbWUgZnJvbSB0aGUgY29tcG9uZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb21iaW5lKCkgewotCQlTdHJpbmcgY24gPSBudWxsOwotCQlpZiAoaW50ZXJuYWxQcmVmaXhPck5zVVJJICE9IG51bGwgfHwgbG9jYWxQYXJ0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBucyA9IGludGVybmFsUHJlZml4T3JOc1VSSSA9PSBudWxsID8gIiIgOiBpbnRlcm5hbFByZWZpeE9yTnNVUkk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBscCA9IGxvY2FsUGFydCA9PSBudWxsID8gIiIgOiBsb2NhbFBhcnQ7IC8vJE5PTi1OTFMtMSQKLQkJCWNuID0gbnMrJzonK2xwOwotCQl9Ci0JCXNldENvbWJpbmVkUU5hbWVHZW4oY24pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkgewotCQlyZXR1cm4gaW50ZXJuYWxQcmVmaXhPck5zVVJJOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVybmFsUHJlZml4T3JOc1VSSUdlbihTdHJpbmcgbmV3SW50ZXJuYWxQcmVmaXhPck5zVVJJKSB7Ci0JCVN0cmluZyBvbGRJbnRlcm5hbFByZWZpeE9yTnNVUkkgPSBpbnRlcm5hbFByZWZpeE9yTnNVUkk7Ci0JCWludGVybmFsUHJlZml4T3JOc1VSSSA9IG5ld0ludGVybmFsUHJlZml4T3JOc1VSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSwgb2xkSW50ZXJuYWxQcmVmaXhPck5zVVJJLCBpbnRlcm5hbFByZWZpeE9yTnNVUkkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoU3RyaW5nIG5ld0ludGVybmFsUHJlZml4T3JOc1VSSSkgewotCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUklHZW4obmV3SW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLQkJdXBkYXRlQ29tYmluZSgpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBnZXRMb2NhbFBhcnQoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU6Ci0JCQkJcmV0dXJuIGdldENvbWJpbmVkUU5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOgotCQkJCXNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ6Ci0JCQkJc2V0TG9jYWxQYXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU6Ci0JCQkJc2V0Q29tYmluZWRRTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDoKLQkJCQlzZXRMb2NhbFBhcnQoTE9DQUxfUEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKENPTUJJTkVEX1FOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIGVJc1NldCBmb3IgbmFtZXNwYWNlIHVyaSBtdXN0IGJlIGRlcml2ZWQgaWYgbnVsbCBzbyBuYW1lc3BhY2VVUkkgISA9IG51bGwgYW5kIGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIG11c3QgYm90aCBiZSBjaGVjay4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyAobmFtZXNwYWNlVVJJICE9IG51bGwgfHwgaW50ZXJuYWxQcmVmaXhPck5zVVJJICE9IG51bGwpIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIExPQ0FMX1BBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsUGFydCAhPSBudWxsIDogIUxPQ0FMX1BBUlRfRURFRkFVTFQuZXF1YWxzKGxvY2FsUGFydCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBDT01CSU5FRF9RTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY29tYmluZWRRTmFtZSAhPSBudWxsIDogIUNPTUJJTkVEX1FOQU1FX0VERUZBVUxULmVxdWFscyhjb21iaW5lZFFOYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCA9PSBudWxsID8gaW50ZXJuYWxQcmVmaXhPck5zVVJJICE9IG51bGwgOiAhSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVC5lcXVhbHMoaW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWVzcGFjZVVSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZXNwYWNlVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbFBhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2FsUGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29tYmluZWRRTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29tYmluZWRRTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW50ZXJuYWxQcmVmaXhPck5zVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbnRlcm5hbFByZWZpeE9yTnNVUkkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uUU5hbWUjc2V0VmFsdWVzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuc1VSSSwgU3RyaW5nIGxvY2FsUGFydCkgewotCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUklHZW4ocHJlZml4KTsKLQkJc2V0TG9jYWxQYXJ0R2VuKGxvY2FsUGFydCk7Ci0JCVN0cmluZyBleGlzdGluZ1VSSSA9IE5hbWVzcGFjZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwocHJlZml4LCB0aGlzKTsKLQkJYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0JCWlmIChleGlzdGluZ1VSSSAhPSBudWxsICYmICFleGlzdGluZ1VSSS5lcXVhbHMobnNVUkkpKSB7Ci0JCQlOYW1lc3BhY2VBZGFwdGVyLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgsIHRoaXMpOwotCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCX0gCi0JCWlmIChleGlzdGluZ1VSSSA9PSBudWxsIHx8IHJlbW92ZWQpCi0JCQlOYW1lc3BhY2VBZGFwdGVyLmFkZE5hbWVzcGFjZShwcmVmaXgsIG5zVVJJLCB0aGlzKTsKLQkJdXBkYXRlQ29tYmluZSgpOwotCX0KLQotCi19IC8vUU5hbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1Jlc291cmNlRW52UmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmJjZTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1Jlc291cmNlRW52UmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotCi0vKioKLSAqIFRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuCi0gKiAKLSAqIEV4YW1wbGVzOgotICogCi0gKiA8cmVzb3VyY2UtZW52LXJlZj4KLSAqICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy8vU3RvY2tRdWV1ZTwvL3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAqICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvL3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAqIDwvL3Jlc291cmNlLWVudi1yZWY+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUVudlJlZkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlRW52UmVmLCBFT2JqZWN0ewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHR5cGUgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBSZXNvdXJjZUVudlJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWYoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDbGFzc1JlZiAtIHJldHVybiBhIEphdmFVUkwgcmVmZXJlbmNlIHRvIHRoZSBuYW1lZCBKYXZhIGNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHRhcmdldE5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCWdldFR5cGUoKTsKLQkJcmV0dXJuIHR5cGUgPT0gbnVsbCA/IG51bGwgOiB0eXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWVTZXQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfVHlwZSgpLCBjcmVhdGVDbGFzc1JlZihjbGFzc05hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChnZXREZXNjcmlwdGlvbnMoKSAhPSBudWxsICYmICFnZXREZXNjcmlwdGlvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCURlc2NyaXB0aW9uIGQgPSAoRGVzY3JpcHRpb24pIGdldERlc2NyaXB0aW9ucygpLmdldCgwKTsKLQkJCWlmIChkICE9IG51bGwpCi0JCQkJZC5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCX0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwgJiYgIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IGQuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzCi0JICogICAgICAgICAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBlbnRlcnByaXNlCi0JICogICAgICAgICAgICBiZWFuIGNvZGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIFNlZSB0aGUgY2xhc3MgZGVzY3JpcHRpb24gZm9yIGFuIGV4YW1wbGUuCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRUeXBlKCkgewotCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZFR5cGUgPSB0eXBlOwotCQkJdHlwZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXR5cGUpOwotCQkJaWYgKHR5cGUgIT0gb2xkVHlwZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEphdmFDbGFzcyBuZXdUeXBlKSB7Ci0JCUphdmFDbGFzcyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VHlwZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IG51bGw7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19UWVBFOgotCQkJCXNldFR5cGUoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fVFlQRToKLQkJCQlzZXRUeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1Jlc291cmNlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWNjOTkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1Jlc291cmNlUmVmSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNTaGFyaW5nU2NvcGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhcHBsaWNhdGlvbiBjbGllbnRzJ3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIHRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGNvZGUsIGFuZCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiAoYmVhbiBvciBjb250YWluZXIpLgotICogRXhhbXBsZToKLSAqIDxyZXNvdXJjZS1yZWY+Ci0gKiA8cmVzLXJlZi1uYW1lPkVtcGxveWVlQXBwREI8Ly9yZXMtcmVmLW5hbWU+Ci0gKiA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8Ly9yZXMtdHlwZT4KLSAqIDxyZXMtYXV0aD5Db250YWluZXI8Ly9yZXMtYXV0aD4KLSAqIDwvL3Jlc291cmNlLXJlZj4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VSZWYsIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aCgpIDxlbT5BdXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBBVVRIX0VERUZBVUxUID0gUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJlc0F1dGhUeXBlQmFzZSBhdXRoID0gQVVUSF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dGggYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dGhFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGluayA9IExJTktfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc1NoYXJpbmdTY29wZSgpIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGUgUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQgPSBSZXNTaGFyaW5nU2NvcGVUeXBlLlNIQVJFQUJMRV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJlc1NoYXJpbmdTY29wZVR5cGUgcmVzU2hhcmluZ1Njb3BlID0gUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXMgU2hhcmluZyBTY29wZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzU2hhcmluZ1Njb3BlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFJlc291cmNlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGdldERlc2NyaXB0aW9ucygpICE9IG51bGwgJiYgIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOwotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlkLnNldFZhbHVlKG5ld0Rlc2NyaXB0aW9uKTsKLQkJfQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uID0gZC5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLiBUaGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cnkgd2hvc2UgdmFsdWUgY29udGFpbnMgdGhlIEpOREkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSAob3IgY2xhc3MpIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcmVzLWF1dGggZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGJlYW4uIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlIERlcGxveWVyLiAgVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkgKiA8cmVzLWF1dGg+QXBwbGljYXRpb248Ly9yZXMtYXV0aD4KLQkgKiA8cmVzLWF1dGg+Q29udGFpbmVyPC8vcmVzLWF1dGg+Ci0JICovCi0JcHVibGljIFJlc0F1dGhUeXBlQmFzZSBnZXRBdXRoKCkgewotCQlyZXR1cm4gYXV0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRoKFJlc0F1dGhUeXBlQmFzZSBuZXdBdXRoKSB7Ci0JCVJlc0F1dGhUeXBlQmFzZSBvbGRBdXRoID0gYXV0aDsKLQkJYXV0aCA9IG5ld0F1dGggPT0gbnVsbCA/IEFVVEhfRURFRkFVTFQgOiBuZXdBdXRoOwotCQlib29sZWFuIG9sZEF1dGhFU2V0ID0gYXV0aEVTZXQ7Ci0JCWF1dGhFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0FVVEgsIG9sZEF1dGgsIGF1dGgsICFvbGRBdXRoRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QXV0aCgpIHsKLQkJUmVzQXV0aFR5cGVCYXNlIG9sZEF1dGggPSBhdXRoOwotCQlib29sZWFuIG9sZEF1dGhFU2V0ID0gYXV0aEVTZXQ7Ci0JCWF1dGggPSBBVVRIX0VERUZBVUxUOwotCQlhdXRoRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19BVVRILCBvbGRBdXRoLCBBVVRIX0VERUZBVUxULCBvbGRBdXRoRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0aCgpIHsKLQkJcmV0dXJuIGF1dGhFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbmV3TGluaykgewotCQlTdHJpbmcgb2xkTGluayA9IGxpbms7Ci0JCWxpbmsgPSBuZXdMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTElOSywgb2xkTGluaywgbGluaykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkCi0JICogdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQotCSAqIHNoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLQkgKiB0d28gZm9sbG93aW5nOiAgU2hhcmVhYmxlLCBVbnNoYXJlYWJsZQotCSAqIAotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotCSAqLwotCXB1YmxpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGdldFJlc1NoYXJpbmdTY29wZSgpIHsKLQkJcmV0dXJuIHJlc1NoYXJpbmdTY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNTaGFyaW5nU2NvcGUoUmVzU2hhcmluZ1Njb3BlVHlwZSBuZXdSZXNTaGFyaW5nU2NvcGUpIHsKLQkJUmVzU2hhcmluZ1Njb3BlVHlwZSBvbGRSZXNTaGFyaW5nU2NvcGUgPSByZXNTaGFyaW5nU2NvcGU7Ci0JCXJlc1NoYXJpbmdTY29wZSA9IG5ld1Jlc1NoYXJpbmdTY29wZSA9PSBudWxsID8gUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQgOiBuZXdSZXNTaGFyaW5nU2NvcGU7Ci0JCWJvb2xlYW4gb2xkUmVzU2hhcmluZ1Njb3BlRVNldCA9IHJlc1NoYXJpbmdTY29wZUVTZXQ7Ci0JCXJlc1NoYXJpbmdTY29wZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUsIG9sZFJlc1NoYXJpbmdTY29wZSwgcmVzU2hhcmluZ1Njb3BlLCAhb2xkUmVzU2hhcmluZ1Njb3BlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzU2hhcmluZ1Njb3BlKCkgewotCQlSZXNTaGFyaW5nU2NvcGVUeXBlIG9sZFJlc1NoYXJpbmdTY29wZSA9IHJlc1NoYXJpbmdTY29wZTsKLQkJYm9vbGVhbiBvbGRSZXNTaGFyaW5nU2NvcGVFU2V0ID0gcmVzU2hhcmluZ1Njb3BlRVNldDsKLQkJcmVzU2hhcmluZ1Njb3BlID0gUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQ7Ci0JCXJlc1NoYXJpbmdTY29wZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fUkVTX1NIQVJJTkdfU0NPUEUsIG9sZFJlc1NoYXJpbmdTY29wZSwgUkVTX1NIQVJJTkdfU0NPUEVfRURFRkFVTFQsIG9sZFJlc1NoYXJpbmdTY29wZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlc1NoYXJpbmdTY29wZSgpIHsKLQkJcmV0dXJuIHJlc1NoYXJpbmdTY29wZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0FVVEg6Ci0JCQkJcmV0dXJuIGdldEF1dGgoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0xJTks6Ci0JCQkJcmV0dXJuIGdldExpbmsoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFOgotCQkJCXJldHVybiBnZXRSZXNTaGFyaW5nU2NvcGUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19BVVRIOgotCQkJCXJldHVybiBpc1NldEF1dGgoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0xJTks6Ci0JCQkJcmV0dXJuIExJTktfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmsgIT0gbnVsbCA6ICFMSU5LX0VERUZBVUxULmVxdWFscyhsaW5rKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFOgotCQkJCXJldHVybiBpc1NldFJlc1NoYXJpbmdTY29wZSgpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fQVVUSDoKLQkJCQlzZXRBdXRoKChSZXNBdXRoVHlwZUJhc2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0xJTks6Ci0JCQkJc2V0TGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19SRVNfU0hBUklOR19TQ09QRToKLQkJCQlzZXRSZXNTaGFyaW5nU2NvcGUoKFJlc1NoYXJpbmdTY29wZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0FVVEg6Ci0JCQkJdW5zZXRBdXRoKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fTElOSzoKLQkJCQlzZXRMaW5rKExJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFOgotCQkJCXVuc2V0UmVzU2hhcmluZ1Njb3BlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGg6ICIpOwotCQlpZiAoYXV0aEVTZXQpIHJlc3VsdC5hcHBlbmQoYXV0aCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc1NoYXJpbmdTY29wZTogIik7Ci0JCWlmIChyZXNTaGFyaW5nU2NvcGVFU2V0KSByZXN1bHQuYXBwZW5kKHJlc1NoYXJpbmdTY29wZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjMjU5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLklkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotCi0KLS8qKgotICogVGhlIHNlY3VyaXR5LWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzIGlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0ICAgIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLSAqLwotcHVibGljIGNsYXNzIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsIGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eUltcGwgaW1wbGVtZW50cyBSdW5Bc1NwZWNpZmllZElkZW50aXR5LCBTZWN1cml0eUlkZW50aXR5ewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIElkZW50aXR5IGlkZW50aXR5ID0gbnVsbDsKLQlwdWJsaWMgUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIE9wdGlvbmFsIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHkgZ2V0SWRlbnRpdHkoKSB7Ci0JCXJldHVybiBpZGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJZGVudGl0eShJZGVudGl0eSBuZXdJZGVudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlJZGVudGl0eSBvbGRJZGVudGl0eSA9IGlkZW50aXR5OwotCQlpZGVudGl0eSA9IG5ld0lkZW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZLCBvbGRJZGVudGl0eSwgbmV3SWRlbnRpdHkpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkZW50aXR5KElkZW50aXR5IG5ld0lkZW50aXR5KSB7Ci0JCWlmIChuZXdJZGVudGl0eSAhPSBpZGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaWRlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaWRlbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJZGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJZGVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SWRlbnRpdHkobmV3SWRlbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWSwgbmV3SWRlbnRpdHksIG5ld0lkZW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0SWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKLQkJCQlyZXR1cm4gZ2V0SWRlbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKLQkJCQlyZXR1cm4gaWRlbnRpdHkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFk6Ci0JCQkJc2V0SWRlbnRpdHkoKElkZW50aXR5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZOgotCQkJCXNldElkZW50aXR5KChJZGVudGl0eSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlJZGVudGl0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5SWRlbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTE4NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlJZGVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQKLSAqIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5SWRlbnRpdHlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZWN1cml0eUlkZW50aXR5LCBFT2JqZWN0ewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBTZWN1cml0eUlkZW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUlkZW50aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHkjaXNVc2VDYWxsZXJJZGVudGl0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2VDYWxsZXJJZGVudGl0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2ZDEwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuV29ya2JlbmNoVXRpbDsKLQotLyoqCi0gKiBBIHNlbWFudGljIGdyb3VwaW5nIG9mIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgcGVyZm9ybWVkIGJ5IGEgc3ViamVjdC4KLSAqIFRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdXJpdHkgcm9sZSB3aGljaCBpcyB1c2VkIGluIHRoZSBzZWN1cml0eS1jb25zdHJhaW50cyBwbGFjZWQgb24gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5Um9sZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Um9sZSwgRU9iamVjdHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCXN0YXRpYyBib29sZWFuIGluRWNsaXBzZSA9IFdvcmtiZW5jaFV0aWwud29ya2JlbmNoSXNSdW5uaW5nKCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZSgpIDxlbT5Sb2xlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZSA9IFJPTEVfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgU2VjdXJpdHlSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGUoKTsKLQl9Ci0KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCWlmIChpbkVjbGlwc2UpCi0JCXJldHVybiBzdXBlci5lcXVhbHMobyk7Ci0JCQotCWlmIChvIGluc3RhbmNlb2YgU2VjdXJpdHlSb2xlSW1wbCkgewotCQlTdHJpbmcgcjEgPSBnZXRSb2xlTmFtZSgpOwotCQlTdHJpbmcgcjIgPSAoKFNlY3VyaXR5Um9sZSkgbykuZ2V0Um9sZU5hbWUoKTsKLQkJaWYgKChyMSAhPSBudWxsKSAmJiAocjIgIT0gbnVsbCkpIHsKLQkJCWlmIChyMS5lcXVhbHMocjIpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocjEgPT0gbnVsbCAmJiByMiA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQlpZiAoaW5FY2xpcHNlIHx8IGdldFJvbGVOYW1lKCkgPT0gbnVsbCkKLQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JcmV0dXJuIGdldFJvbGVOYW1lKCkuaGFzaENvZGUoKTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JU3RyaW5nIG5hbWUgPSBnZXRSb2xlTmFtZSgpID09IG51bGwgPyAiPHVua25vd24+IiA6IGdldFJvbGVOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKCIgKyBuYW1lICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSByb2xlLiBUaGlzIGVsZW1lbnQgbXVzdCBjb250YWluIGEgbm9uLWVtcHR5IHN0cmluZy4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7Ci0JCXJldHVybiByb2xlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgbmV3Um9sZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJvbGVOYW1lID0gcm9sZU5hbWU7Ci0JCXJvbGVOYW1lID0gbmV3Um9sZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fUk9MRV9OQU1FLCBvbGRSb2xlTmFtZSwgcm9sZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Um9sZU5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIFJPTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZU5hbWUgIT0gbnVsbCA6ICFST0xFX05BTUVfRURFRkFVTFQuZXF1YWxzKHJvbGVOYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZShST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQ2NTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5Um9sZVJlZkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5Um9sZVJlZnsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpbmsgPSBMSU5LX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBTZWN1cml0eVJvbGVSZWZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZVJlZigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCAmJiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWQuc2V0VmFsdWUobmV3RGVzY3JpcHRpb24pOwotCQl9Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChnZXREZXNjcmlwdGlvbnMoKSAhPSBudWxsICYmICFnZXREZXNjcmlwdGlvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCURlc2NyaXB0aW9uIGQgPSAoRGVzY3JpcHRpb24pIGdldERlc2NyaXB0aW9ucygpLmdldCgwKTsKLQkJCWlmIChkICE9IG51bGwpCi0JCQkJZGVzY3JpcHRpb24gPSBkLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIGxpbmsgYSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5rKCkgewotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rKFN0cmluZyBuZXdMaW5rKSB7Ci0JCVN0cmluZyBvbGRMaW5rID0gbGluazsKLQkJbGluayA9IG5ld0xpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0xJTkssIG9sZExpbmssIGxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0xJTks6Ci0JCQkJcmV0dXJuIGdldExpbmsoKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0xJTks6Ci0JCQkJcmV0dXJuIExJTktfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmsgIT0gbnVsbCA6ICFMSU5LX0VERUZBVUxULmVxdWFscyhsaW5rKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19MSU5LOgotCQkJCXNldExpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0xJTks6Ci0JCQkJc2V0TGluayhMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvVXNlQ2FsbGVySWRlbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwNjc0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlVzZUNhbGxlcklkZW50aXR5OwotCi0KLS8qKgotICogVGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZHMuCi0KLSAqLwotcHVibGljIGNsYXNzIFVzZUNhbGxlcklkZW50aXR5SW1wbCBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHlJbXBsIGltcGxlbWVudHMgVXNlQ2FsbGVySWRlbnRpdHksIFNlY3VyaXR5SWRlbnRpdHl7Ci0KLQlwdWJsaWMgVXNlQ2FsbGVySWRlbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFVzZUNhbGxlcklkZW50aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21tb25QYWNrYWdlLlVTRV9DQUxMRVJfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlVTRV9DQUxMRVJfSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLlVTRV9DQUxMRVJfSURFTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLlVTRV9DQUxMRVJfSURFTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5VU0VfQ0FMTEVSX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuVVNFX0NBTExFUl9JREVOVElUWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5VU0VfQ0FMTEVSX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5VU0VfQ0FMTEVSX0lERU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5VU0VfQ0FMTEVSX0lERU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5I2lzVXNlQ2FsbGVySWRlbnRpdHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlQ2FsbGVySWRlbnRpdHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvWE1MUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDQ2OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvWE1MUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNpbmNlIDQvMjIvMjAwMwotICogVGhpcyBpcyByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIGltcGxlbWVudGVycyBvZiB7QGxpbmsgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnl9Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotLyoqCi0gKiBFSkJKYXJSZXNvdXJjZUZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFhNTFJlc291cmNlRmFjdG9yeSgpIHsKLQkvL1RPRE86IERlbGV0ZSB0aGlzIGNsYXNzCi0Jc3VwZXIoKTsKLX0KLQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsI2NyZWF0ZVJlc291cmNlKFVSSSkKLSAqLwotcHVibGljIGZpbmFsIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQlYTUxSZXNvdXJjZSByZXNvdXJjZSA9IHByaW1DcmVhdGVSZXNvdXJjZSh1cmkpOwotCXJlc291cmNlLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgcmVzb3VyY2UuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UuT1BUSU9OX0xJTkVfV0lEVEgsIG5ldyBJbnRlZ2VyKDgwKSk7Ci0gICAgcmV0dXJuIHJlc291cmNlOwotfQotCi0vKioKLSAqIE1ldGhvZCBwcmltQ3JlYXRlUmVzb3VyY2UuCi0gKiBAcGFyYW0gdXJpCi0gKiBAcmV0dXJuIFhNTFJlc291cmNlCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBYTUxSZXNvdXJjZSBwcmltQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgOwotCi19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGJhNzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxSZXNvdXJjZUltcGwgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgWE1MUmVzb3VyY2UsSjJFRVZlcnNpb25SZXNvdXJjZSB7Ci0JLyoqIEluZGljYXRvciB0byBkZXRlcm1pbmUgaWYgdGhpcyByZXNvdXJjZSB3YXMgbG9hZGVkIGFzIGFuIGFsdC1kZCAoZnJvbSBhbiBlYXIpLAotCSAgKiBkZWZhdWx0IGlzIGZhbHNlICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbHQgPSBmYWxzZTsKLQkvKiogVGhlIGFwcGxpY2F0aW9uIHdoaWNoIGRlY2xhcmVkIHRoZSBhbHQtZGQgZm9yIHRoaXMgcmVzb3VyY2U7IGV4aXN0cyBvbmx5IGlmIHRoaXMgcmVzb3VyY2UgaXMgYW5kCi0JICAqIGFsdCBkZCAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ldyA9IHRydWU7Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdFZlcnNpb25BZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfVFlQRSA9IFJvb3RWZXJzaW9uQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUkVTT1VSQ0VfX0NPTlRFTlRTICYmCi0JCQkJbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpIHsKLQkJCQkJKChYTUxSZXNvdXJjZUltcGwpbXNnLmdldE5vdGlmaWVyKCkpLnN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JCQkJCSgoTm90aWZpZXIpbXNnLmdldE5vdGlmaWVyKCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCQl9Ci0JCX0KLQkJCi0JCQotCi0JCi0JfQotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yayAKLQkgKi8KLQlwdWJsaWMgWE1MUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yayAKLQkgKi8KLQlwdWJsaWMgWE1MUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0JCi0JcHVibGljIFhNTFJlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIodXJpLCBhUmVuZGVyZXIpOwotCX0KLQotCXB1YmxpYyBYTUxSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKGFSZW5kZXJlcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2luaXRpYWxpemVDb250ZW50cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRzKCkgewotCQlzdXBlci5pbml0aWFsaXplQ29udGVudHMoKTsKLQkJZUFkYXB0ZXJzKCkuYWRkKG5ldyBSb290VmVyc2lvbkFkYXB0ZXIoKSk7Ci0JfQotCi0JCi0JLyoqCi0JICogSXMgdGhpcyBhIHJlc291cmNlIGxvYWRlZCBhcyBhbiBhbHRlcm5hdGUgZGVwbG95bWVudCBkZXNjcmlwdG9yPwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWx0KCkgewotCQlyZXR1cm4gaXNBbHQ7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCWFwcGxpY2F0aW9uID0gbmV3QXBwbGljYXRpb247Ci0JfQotCS8qKgotCSAqIElzIHRoaXMgYSByZXNvdXJjZSBsb2FkZWQgYXMgYW4gYWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0FsdChib29sZWFuIGlzQWx0ZXJuYXRlREQpIHsKLQkJaXNBbHQgPSBpc0FsdGVybmF0ZUREOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0VmVyc2lvbklEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBKMkVFXzFfNF9JRDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2Ujc2V0RG9jdHlwZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqIFRoaXMgaXMgc2V0dGluZyB0aGUgbW9kdWxlIHZlcnNpb24gb24gdGhlIHJlc291cmNlLCB3aGVyZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCB0aGF0IHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlpbnQgdmVyc2lvbiA9IEoyRUVfMV80X0lEOwotCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkgCi0JCQl2ZXJzaW9uID0gSjJFRV8xXzRfSUQ7Ci0JCWVsc2UgaWYgKHN5c3RlbUlkLmVxdWFscyhnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKSkKLQkJCXZlcnNpb24gPSBKMkVFXzFfM19JRDsKLQkJZWxzZSBpZiAoc3lzdGVtSWQuZXF1YWxzKGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpKQotCQkJdmVyc2lvbiA9IEoyRUVfMV8yX0lEOwotCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCXNldEoyRUVWZXJzaW9uSUQodmVyc2lvbik7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSN1c2VzRFREKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1c2VzRFREKCkgewotCQlyZXR1cm4gZ2V0VmVyc2lvbklEKCkgIT0gSjJFRV8xXzRfSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI3NldFZlcnNpb25JRChpbnQpCi0JICogQGRlcHJlY2F0ZWQsIFVzZSBzZXRKMkVFVmVyc2lvbklEKCkgdG8gc2V0IG1vZHVsZSB2ZXJzaW9uIGJhc2VkIG9uIGoyZWUgdmVyc2lvbgotCSAqKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXNldEoyRUVWZXJzaW9uSUQoaWQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2V0VmVyc2lvbklEKGludCBpZCkgewotCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgYVB1YmxpY0lkLCBTdHJpbmcgYVN5c3RlbUlkKSB7Ci0JCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoYVB1YmxpY0lkLGFTeXN0ZW1JZCk7Ci0JfQotCS8qCi0JICogU2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gYmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKTsKLQkvKgotCSAqIFNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGRpcmVjdGx5Ci0JICogKi8KLQkgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuWE1MUmVzb3VyY2UjaXNKMkVFMV8zKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0oyRUUxXzMoKSB7Ci0JCXJldHVybiBnZXRWZXJzaW9uSUQoKSA9PSBKMkVFXzFfM19JRDsKLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0VmVyc2lvbklEKGludCl9LCAKLQkgKiB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoU3RyaW5nLCBTdHJpbmcpfQotCSAqIFNldHMgdGhlIHN5c3RlbSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgaWQpIHsKLQkJc2V0RG9jdHlwZVZhbHVlcyhpZCwgZ2V0U3lzdGVtSWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldFZlcnNpb25JRChpbnQpfSwKLQkgKiB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoU3RyaW5nLCBTdHJpbmcpfQotCSAqIFNldHMgdGhlIHB1YmxpYyBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgaWQpIHsKLQkJc2V0RG9jdHlwZVZhbHVlcyhnZXRQdWJsaWNJZCgpLCBpZCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFB1YmxpY0lkKCkgewotCQlzd2l0Y2ggKGdldFZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCXJldHVybiBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpOwotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JCQkJcmV0dXJuIGdldEoyRUVfMV8zX1B1YmxpY0lEKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQkKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKLQkJc3dpdGNoIChnZXRWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQlyZXR1cm4gZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKTsKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpOwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKTsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCk7Ci0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpOwotCQotCQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlc291cmNlU2V0KFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgTm90aWZpY2F0aW9uQ2hhaW4gbm90aWZpY2F0aW9ucykgewotCQlpZiAoYVJlc291cmNlU2V0ID09IG51bGwgJiYgdGhpcy5yZXNvdXJjZVNldCAhPSBudWxsKQotCQkJcHJlRGVsZXRlKCk7Ci0JCXJldHVybiBzdXBlci5iYXNpY1NldFJlc291cmNlU2V0KGFSZXNvdXJjZVNldCwgbm90aWZpY2F0aW9ucyk7Ci0JfQotCQkKLQlwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0SjJFRVZlcnNpb25JRCgpIGFuZCBnZXRNb2R1bGVWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gZ2V0SjJFRVZlcnNpb25JRCgpOwotCX0KLQkKLQlwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0U7Ci0JfQkKLQkvKiBBbGwgc3ViY2xhc3NlcyB3aWxsIGRlcml2ZSB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZWlyIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRKMkVFVmVyc2lvbklEKCk7Ci0KLQkKLQotCS8qIFRoaXMgd2lsbCBiZSBjb21wdXRlZCBkdXJpbmcgbG9hZHMgb2YgdGhlIHJlc291cmNlCi0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRWZXJzaW9uSUQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZVZlcnNpb25TdHJpbmcoKSB7Ci0JCWZsb2F0IHZlciA9IGdldE1vZHVsZVZlcnNpb25JRCgpOwotCQlGbG9hdCBzcGVjVmVyc2lvbiA9IG5ldyBGbG9hdCh2ZXIvMTApOwotCQlyZXR1cm4gc3BlY1ZlcnNpb24udG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU1MzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlVzZUNhbGxlcklkZW50aXR5OwotCi0KLQotcHVibGljIGNsYXNzIENvbW1vbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIENvbW1vblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIENvbW1vbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCl0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVqYlJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkxvY2FsUmVmQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW52RW50cnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlJZGVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVzZUNhbGxlcklkZW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUVudlJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tb25Td2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQ29tbW9uU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlRWpiUmVmKEVqYlJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRWpiUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRW52RW50cnkoRW52RW50cnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VSZWYoUmVzb3VyY2VSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlUmVmKFNlY3VyaXR5Um9sZVJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlSb2xlUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlKFNlY3VyaXR5Um9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlSb2xlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VFbnZSZWYoUmVzb3VyY2VFbnZSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlRW52UmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCTG9jYWxSZWYoRUpCTG9jYWxSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQkxvY2FsUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUnVuQXNTcGVjaWZpZWRJZGVudGl0eShSdW5Bc1NwZWNpZmllZElkZW50aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSWRlbnRpdHkoSWRlbnRpdHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlkZW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSWNvblR5cGUoSWNvblR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUljb25UeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc3BsYXlOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURlc3RpbmF0aW9uKE1lc3NhZ2VEZXN0aW5hdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSk5ESUVudlJlZnNHcm91cChKTkRJRW52UmVmc0dyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVXNlQ2FsbGVySWRlbnRpdHkoVXNlQ2FsbGVySWRlbnRpdHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVVzZUNhbGxlcklkZW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVFOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTGlzdGVuZXIoTGlzdGVuZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZVJlZkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVqYlJlZkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkxvY2FsUmVmQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW52RW50cnlBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlJZGVudGl0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVzZUNhbGxlcklkZW50aXR5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lciA8ZW0+TGlzdGVuZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlkZW50aXR5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSWNvblR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNwbGF5TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb24gPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cCA8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAgPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSk5ESUVudlJlZnNHcm91cEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlRW52UmVmQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQ29tbW9uQWRhcHRlckZhY3RvcnkKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25Td2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vblN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGRlYzEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vblN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25Td2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tbW9uUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1vblN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUY6IHsKLQkJCQlFamJSZWYgZWpiUmVmID0gKEVqYlJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRWpiUmVmKGVqYlJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWTogewotCQkJCUVudkVudHJ5IGVudkVudHJ5ID0gKEVudkVudHJ5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbnZFbnRyeShlbnZFbnRyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRjogewotCQkJCVJlc291cmNlUmVmIHJlc291cmNlUmVmID0gKFJlc291cmNlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZVJlZihyZXNvdXJjZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGOiB7Ci0JCQkJU2VjdXJpdHlSb2xlUmVmIHNlY3VyaXR5Um9sZVJlZiA9IChTZWN1cml0eVJvbGVSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Um9sZVJlZihzZWN1cml0eVJvbGVSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFOiB7Ci0JCQkJU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZSA9IChTZWN1cml0eVJvbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Um9sZShzZWN1cml0eVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGOiB7Ci0JCQkJUmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYgPSAoUmVzb3VyY2VFbnZSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRjogewotCQkJCUVKQkxvY2FsUmVmIGVqYkxvY2FsUmVmID0gKEVKQkxvY2FsUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJMb2NhbFJlZihlamJMb2NhbFJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWpiUmVmKGVqYkxvY2FsUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWTogewotCQkJCVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgcnVuQXNTcGVjaWZpZWRJZGVudGl0eSA9IChSdW5Bc1NwZWNpZmllZElkZW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSdW5Bc1NwZWNpZmllZElkZW50aXR5KHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNlY3VyaXR5SWRlbnRpdHkocnVuQXNTcGVjaWZpZWRJZGVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZOiB7Ci0JCQkJSWRlbnRpdHkgaWRlbnRpdHkgPSAoSWRlbnRpdHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUlkZW50aXR5KGlkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuSUNPTl9UWVBFOiB7Ci0JCQkJSWNvblR5cGUgaWNvblR5cGUgPSAoSWNvblR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUljb25UeXBlKGljb25UeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FOiB7Ci0JCQkJRGlzcGxheU5hbWUgZGlzcGxheU5hbWUgPSAoRGlzcGxheU5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6IHsKLQkJCQlNZXNzYWdlRGVzdGluYXRpb25SZWYgbWVzc2FnZURlc3RpbmF0aW9uUmVmID0gKE1lc3NhZ2VEZXN0aW5hdGlvblJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKG1lc3NhZ2VEZXN0aW5hdGlvblJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT046IHsKLQkJCQlNZXNzYWdlRGVzdGluYXRpb24gbWVzc2FnZURlc3RpbmF0aW9uID0gKE1lc3NhZ2VEZXN0aW5hdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZURlc3RpbmF0aW9uKG1lc3NhZ2VEZXN0aW5hdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAobWVzc2FnZURlc3RpbmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKG1lc3NhZ2VEZXN0aW5hdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFOiB7Ci0JCQkJUGFyYW1WYWx1ZSBwYXJhbVZhbHVlID0gKFBhcmFtVmFsdWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQOiB7Ci0JCQkJRGVzY3JpcHRpb25Hcm91cCBkZXNjcmlwdGlvbkdyb3VwID0gKERlc2NyaXB0aW9uR3JvdXApdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoZGVzY3JpcHRpb25Hcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVA6IHsKLQkJCQlKTkRJRW52UmVmc0dyb3VwIGpuZGlFbnZSZWZzR3JvdXAgPSAoSk5ESUVudlJlZnNHcm91cCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSk5ESUVudlJlZnNHcm91cChqbmRpRW52UmVmc0dyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChqbmRpRW52UmVmc0dyb3VwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKGpuZGlFbnZSZWZzR3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWTogewotCQkJCVNlY3VyaXR5SWRlbnRpdHkgc2VjdXJpdHlJZGVudGl0eSA9IChTZWN1cml0eUlkZW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eUlkZW50aXR5KHNlY3VyaXR5SWRlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5VU0VfQ0FMTEVSX0lERU5USVRZOiB7Ci0JCQkJVXNlQ2FsbGVySWRlbnRpdHkgdXNlQ2FsbGVySWRlbnRpdHkgPSAoVXNlQ2FsbGVySWRlbnRpdHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVzZUNhbGxlcklkZW50aXR5KHVzZUNhbGxlcklkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTZWN1cml0eUlkZW50aXR5KHVzZUNhbGxlcklkZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT046IHsKLQkJCQlEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRTogewotCQkJCVFOYW1lIHFOYW1lID0gKFFOYW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VRTmFtZShxTmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkxJU1RFTkVSOiB7Ci0JCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSAoTGlzdGVuZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChsaXN0ZW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChsaXN0ZW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVA6IHsKLQkJCQlDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9IChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVqYiBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVqYlJlZihFamJSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnYgRW50cnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW52IEVudHJ5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbnZFbnRyeShFbnZFbnRyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlUmVmKFJlc291cmNlUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRW52UmVmKFJlc291cmNlRW52UmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIExvY2FsIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgTG9jYWwgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJMb2NhbFJlZihFSkJMb2NhbFJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUnVuQXNTcGVjaWZpZWRJZGVudGl0eShSdW5Bc1NwZWNpZmllZElkZW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklkZW50aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJZGVudGl0eShJZGVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkljb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JY29uIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUljb25UeXBlKEljb25UeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURlc3RpbmF0aW9uKE1lc3NhZ2VEZXN0aW5hdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQYXJhbVZhbHVlKFBhcmFtVmFsdWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKTkRJRW52UmVmc0dyb3VwKEpORElFbnZSZWZzR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVVzZUNhbGxlcklkZW50aXR5KFVzZUNhbGxlcklkZW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UU5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UU5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlzdGVuZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlzdGVuZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxpc3RlbmVyKExpc3RlbmVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQ29tbW9uU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODNhOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvQ29tbW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWE1MUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uVXRpbCB7Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoRU9iamVjdCBvKSB7Ci0JcmV0dXJuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8sIHRydWUpOwotfQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KEVPYmplY3QgbywgYm9vbGVhbiBpbmNsdWRlRWFycykgewotCUVPYmplY3QgbWV0YSA9IG8uZUNsYXNzKCk7Ci0JcmV0dXJuIChpbmNsdWRlRWFycyAmJiBtZXRhID09IGVDbGFzc0FwcGxpY2F0aW9uKCkpIHx8Ci0JCW1ldGEgPT0gZUNsYXNzQXBwbGljYXRpb25DbGllbnQoKSB8fAotCQltZXRhID09IGVDbGFzc0VKQkphcigpIHx8Ci0JCW1ldGEgPT0gZUNsYXNzV2ViQXBwKCkgfHwKLQkJbWV0YSA9PSBlQ2xhc3NDb25uZWN0b3IoKTsKLX0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChPYmplY3QgbykgewotCXJldHVybiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChvLCB0cnVlKTsKLX0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChPYmplY3QgbywgYm9vbGVhbiBpbmNsdWRlRUFScykgewotCWlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJcmV0dXJuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KChFT2JqZWN0KW8sIGluY2x1ZGVFQVJzKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci1wcm90ZWN0ZWQgc3RhdGljIEVDbGFzcyBlQ2xhc3NBcHBsaWNhdGlvbigpIHsKLQlyZXR1cm4gQXBwbGljYXRpb25GYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXBwbGljYXRpb24oKTsKLX0KLXByb3RlY3RlZCBzdGF0aWMgRUNsYXNzIGVDbGFzc0FwcGxpY2F0aW9uQ2xpZW50KCkgewotCXJldHVybiBDbGllbnRGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLX0KLXByb3RlY3RlZCBzdGF0aWMgRUNsYXNzIGVDbGFzc0VKQkphcigpIHsKLQlyZXR1cm4gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEVKQkphcigpOwotfQotcHJvdGVjdGVkIHN0YXRpYyBFQ2xhc3MgZUNsYXNzV2ViQXBwKCkgewotCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRXZWJBcHAoKTsKLX0KLQotcHJvdGVjdGVkIHN0YXRpYyBFQ2xhc3MgZUNsYXNzQ29ubmVjdG9yKCkgewotCXJldHVybiBKY2FGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0Q29ubmVjdG9yKCk7Ci19Ci0vKioKLSAqIFNhZmV0eSBjaGVjayBtZXRob2QgdG8gZW5zdXJlIHRoYXQgdGhlIHZlcnNpb24gb2YgdGhlIGRkIG9iamVjdCBjYW4gYmUgY29tcHV0ZWQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0RET2JqZWN0Rm9yVmVyc2lvbihFT2JqZWN0IGRkKSB7Ci0JaWYgKGRkLmVJc1Byb3h5KCkpIHsKLQkJU3RyaW5nIHByb3h5VXJpID0gKChJbnRlcm5hbEVPYmplY3QpZGQpLmVQcm94eVVSSSgpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBtZXNzYWdlID0gSjJFRVhNTFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkoyRUVfVkVSU0lPTl9QUk9YWV9FUlJPUiIsIG5ldyBPYmplY3RbXXtwcm94eVVyaX0pOyAvLyROT04tTkxTLTEkCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obWVzc2FnZSk7Ci0JfSBlbHNlIGlmIChkZC5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gSjJFRVhNTFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkoyRUVfVkVSU0lPTl9OVUxMX0VSUk9SIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlKTsKLQl9Ci19Ci0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0RlZmF1bHRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTBiOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCBmb3Igb2JqZWN0cyB0aGF0IGNhbiBiZSAiZmx1ZmZlZCB1cCIgb24gZGVtYW5kLCBidXQgbm90IHNlcmlhbGl6ZWQgdW5sZXNzIG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVmYXVsdGFibGUgZXh0ZW5kcyBOb3RpZmllciB7Ci1wdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKTsKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0ZWRBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdGVkQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MDc4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0ZWRBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDMvMjIvMDEgMTA6NTQ6MjIgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZhdWx0ZWRBZGFwdGVySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFEQVBURVJfS0VZID0gIkRFRkFVTFRFRF9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBib29sZWFuIGZOb3RpZnkgPSB0cnVlOwotLyoqCi0gKiBEZWZhdWx0ZWRBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBEZWZhdWx0ZWRBZGFwdGVySW1wbCgpIHsKLQlzdXBlcigpOwotfQotcHVibGljIGFic3RyYWN0IEVPYmplY3QgZGVmYXVsdENvbnRhaW5lcigpOwotcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCXJldHVybiBBREFQVEVSX0tFWS5lcXVhbHModHlwZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZhdWx0KERlZmF1bHRhYmxlIG9iamVjdCkgewotCURlZmF1bHRvciBkZWZhdWx0b3IgPSAoRGVmYXVsdG9yKSByZXRyaWV2ZURlZmF1bHRDb250YWluZXJGb3Iob2JqZWN0KTsKLQlyZXR1cm4gZGVmYXVsdG9yICE9IG51bGwgJiYgZGVmYXVsdG9yLmlzRGVmYXVsdChvYmplY3QpOwotfQotCQkKLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvMTMvMjAwMSA4OjQzOjQxIFBNKQotICogQHJldHVybiBib29sZWFuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzTm90aWZ5KCkgewotCXJldHVybiBmTm90aWZ5OwotfQotcHVibGljIHN0YXRpYyBEZWZhdWx0ZWRBZGFwdGVySW1wbCByZXRyaWV2ZUFkYXB0ZXJGb3IoRGVmYXVsdGFibGUgbm90aWZpZXIpIHsKLQlyZXR1cm4gKERlZmF1bHRlZEFkYXB0ZXJJbXBsKUVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIobm90aWZpZXIsQURBUFRFUl9LRVkpOwotfQotcHVibGljIHN0YXRpYyBFT2JqZWN0IHJldHJpZXZlRGVmYXVsdENvbnRhaW5lckZvcihEZWZhdWx0YWJsZSBub3RpZmllcikgewotCURlZmF1bHRlZEFkYXB0ZXJJbXBsIGFkYXB0ZXIgPSByZXRyaWV2ZUFkYXB0ZXJGb3Iobm90aWZpZXIpOwotCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5kZWZhdWx0Q29udGFpbmVyKCk7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzEzLzIwMDEgODo0Mzo0MSBQTSkKLSAqIEBwYXJhbSBuZXdOb3RpZnkgYm9vbGVhbgotICovCi1wdWJsaWMgdm9pZCBzZXROb3RpZnkoYm9vbGVhbiBuZXdOb3RpZnkpIHsKLQlmTm90aWZ5ID0gbmV3Tm90aWZ5OwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0RlZmF1bHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzI5OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzE1LzIwMDEgNDo1ODoxNSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWZhdWx0b3IgewotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3RzIGNyZWF0ZSBAYURlZmF1bHRhYmxlIGFuZCBpdCBpcyBzdGlsbAotICogY3VycmVudGx5IGRlZmF1bHQgYW5kIG5vdCBjb250YWluZWQuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNi8xNS8yMDAxIDQ6NTk6MjggUE0pCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBwYXJhbSBhRGVmYXVsdGFibGUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLnV0aWwuRGVmYXVsdGFibGUKLSAqLwotYm9vbGVhbiBpc0RlZmF1bHQoRGVmYXVsdGFibGUgYURlZmF1bHRhYmxlKTsKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9JRFV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0lEVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGUxZDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0lEVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSURVdGlsOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhbmQgc2V0dGluZyB1bmlxdWUgaWQncyBmb3IgcmVmIG9iamVjdHMgY29udGFpbmVkIHdpdGhpbiBhIHJlc291cmNlLiAgVGhpcyBpcyBuZWVkZWQKLSAqIHNvbWV0aW1lcyB3aGVuIGEgcmVmb2JqZWN0IGlzIHJlZmVyZW5jZWQgYnkgYW4gb2JqZWN0IGluIGEgc2VwYXJhdGUgcmVzb3VyY2UuICBUaGlzIHV0aWxpdHkgd2lsbCBmb3JjZSB0aGUgcmVmb2JqZWN0IAotICogdG8gbm90aWZ5IGFmdGVyIHRoZSBpZCBnZXRzIHNldCwgdXNpbmcgdGhlIHN0YXRpYyBmZWF0dXJlIG9uIHRoaXMgY2xhc3MuICBUaGUgb2JqZWN0IG11c3QgYmUgY29udGFpbmVkIGluIGEgcmVzb3VyY2UKLSAqIGZvciB0aGUgdXRpbGl0eSBtZXRob2RzIHRvIHdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBJRFV0aWxpdHkgewotCi0vKioKLSAqIElEVXRpbGl0eSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSURVdGlsaXR5KCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEdlbmVyYXRlIGEgZGVmYXVsdCBpZCBhbmQgbm90aWZ5LgotICovCi1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBwcmltU2V0RGVmYXVsdElEKEVPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIElEVXRpbC5nZXRPckFzc2lnbklEKG9iamVjdCk7Ci19Ci0JCi0vKioKLSAqIEdlbmVyYXRlIGEgZGVmYXVsdCBpZCBhbmQgbm90aWZ5LgotICogSGVscGVyIGZvciBkZWZhdWx0IGlkIGdlbmVyYXRpb24gdG8gc3VwcG9ydCBjcm9zcyBkb2N1bWVudCByZWZlcmVuY2VzIHRvIG5vbiB4bWkgcmVzb3VyY2VzCi0gKiAoZWcsIHhtbCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzKTsgY2FsbGVkIGZyb20gb3ZlcnJpZGVuIGFjY2Vzc29ycyBpbiBzZWxlY3RlZCBvYmplY3RzOyAgCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldERlZmF1bHRJRChFT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZVJlc291cmNlKCkgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIHByaW1TZXREZWZhdWx0SUQob2JqZWN0KTsKLX0KLQkKLS8qKgotICogR2VuZXJhdGUgYSBkZWZhdWx0IGlkIGFuZCBub3RpZnksIGZvciB0aGlzIG9iamVjdCBhbmQgZm9yIGFsbCByZWZlcmVuY2VkIG9iamVjdHMgdGhhdCBhcmUgY29udGFpbmVkCi0gKiB3aXRoaW4gdGhlIHNhbWUgcmVzb3VyY2UuICBIZWxwZXIgZm9yIGRlZmF1bHQgaWQgZ2VuZXJhdGlvbiB0byBzdXBwb3J0IGNyb3NzIGRvY3VtZW50IHJlZmVyZW5jZXMgdG8gbm9uIHhtaSByZXNvdXJjZXMKLSAqIChlZywgeG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMpOyB1c2VmdWwgZm9yIHBvc3QgY29weS9hZGQgIAotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBzZXREZWZhdWx0SUQoRU9iamVjdCBvYmplY3QsIGJvb2xlYW4gcmVjdXJzZUNoaWxkcmVuKSB7Ci0JaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lUmVzb3VyY2UoKSA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQkJCi0JU3RyaW5nIHJlc3VsdCA9IHByaW1TZXREZWZhdWx0SUQob2JqZWN0KTsKLQotCWlmIChyZWN1cnNlQ2hpbGRyZW4pCi0JCXNldERlZmF1bHRJREZvckNoaWxkcmVuKG9iamVjdCk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCQotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldERlZmF1bHRJREZvckNoaWxkcmVuKEVPYmplY3Qgb2JqZWN0KSB7Ci0KLQlMaXN0IG9iamVjdHMgPSBvYmplY3QuZUNvbnRlbnRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLnNpemUoKTsgaSsrKXsKLQkJRU9iamVjdCBvID0gKEVPYmplY3Qpb2JqZWN0cy5nZXQoaSk7Ci0JCXByaW1TZXREZWZhdWx0SUQobyk7Ci0JfQotfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9YbWxTcGVjaWZpZWREYXRhQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvWG1sU3BlY2lmaWVkRGF0YUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1OGI2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9YbWxTcGVjaWZpZWREYXRhQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDYvMDQvMDEgNzo1NjoyMiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFhtbFNwZWNpZmllZERhdGFBZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURBUFRFUl9LRVkgPSAiWE1MX1NQRUNJRklFRF9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotLyoqCi0gKiBYbWxTcGVjaWZpZWREYXRhQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgWG1sU3BlY2lmaWVkRGF0YUFkYXB0ZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQlyZXR1cm4gQURBUFRFUl9LRVkuZXF1YWxzKHR5cGUpOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkOTFkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgYXBpIHRoZSBjb21tb24gbW9kZWwgYXJ0aWZhY3RzIHRoYXQgaW5jbHVkZSAoUmVzb3VyY2UgUmVmZXJlbmNlcywgRUpCIFJlZmVyZW5jZXMsIERpc3BsYXkgTmFtZSwgRGVzY3JpcHRpb24gR3JvdXAsIFNlY3VyaXR5IHJvbGVzLCBFbnZpcm9ubWVudCB2YXJpYWJsZXMpLiAKLSAgICAgICAgIFVzaW5nIHRoaXMgYXBpIHRoZSBjb21tb24gbW9kZWwgYXJ0aWZhY3RzIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZCBpbiBhbnkgajJlZSBtb2R1bGVzIChFbnRlcnByaXNlIEFwcGxpY2F0aW9uLCBBcHBsaWNhdGlvbiBDbGllbnQsIFdlYiBBcHAsIEVKQiBBcHAsIENvbm5lY3RvcnMpLgotICAgICAgICBjYW4gYmUgY3JlYXRlZCBhbmQgYWNjZXNzZWQuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWNrbm93bGVkZ2VNb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQWNrbm93bGVkZ2VNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YmVlN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Fja25vd2xlZGdlTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEFja25vd2xlZGdlTW9kZSB7fQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQWNrbm93bGVkZ2VNb2RlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fQUNLTk9XTEVER0U9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVQU19PS19BQ0tOT1dMRURHRT0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkF1dG8gQWNrbm93bGVkZ2U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BdXRvIEFja25vd2xlZGdlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FVVE9fQUNLTk9XTEVER0UKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWNrbm93bGVkZ2VNb2RlIEFVVE9fQUNLTk9XTEVER0VfTElURVJBTCA9IG5ldyBBY2tub3dsZWRnZU1vZGUoQVVUT19BQ0tOT1dMRURHRSwgIkF1dG8tYWNrbm93bGVkZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RHVwcyBPayBBY2tub3dsZWRnZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkR1cHMgT2sgQWNrbm93bGVkZ2U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRFVQU19PS19BQ0tOT1dMRURHRQotCSAqVE9ETzogZ2VuZXJhdGUgY29ycmVjdGx5Ci0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFja25vd2xlZGdlTW9kZSBEVVBTX09LX0FDS05PV0xFREdFX0xJVEVSQUwgPSBuZXcgQWNrbm93bGVkZ2VNb2RlKERVUFNfT0tfQUNLTk9XTEVER0UsICJEdXBzLW9rLWFja25vd2xlZGdlIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5BY2tub3dsZWRnZSBNb2RlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2tub3dsZWRnZU1vZGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQWNrbm93bGVkZ2VNb2RlW10gewotCQkJQVVUT19BQ0tOT1dMRURHRV9MSVRFUkFMLAotCQkJRFVQU19PS19BQ0tOT1dMRURHRV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkFja25vd2xlZGdlIE1vZGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFja25vd2xlZGdlIE1vZGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBY2tub3dsZWRnZU1vZGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlBY2tub3dsZWRnZU1vZGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BY2tub3dsZWRnZSBNb2RlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFja25vd2xlZGdlTW9kZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQVVUT19BQ0tOT1dMRURHRTogcmV0dXJuIEFVVE9fQUNLTk9XTEVER0VfTElURVJBTDsKLQkJCWNhc2UgRFVQU19PS19BQ0tOT1dMRURHRTogcmV0dXJuIERVUFNfT0tfQUNLTk9XTEVER0VfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQWNrbm93bGVkZ2VNb2RlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0Fja25vd2xlZGdlTW9kZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0FjdGl2YXRpb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGQ4ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0FjdGl2YXRpb25Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICogZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0gKiBpbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24KLSAqIGFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotICogZGVzdGluYXRpb24gdHlwZSwgZXRjLgotICogCi0gKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLSAqIG5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotICogCi0gKiBUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLSAqIG1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldENvbmZpZ1Byb3BlcnRpZXMgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3RpdmF0aW9uQ29uZmlnIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maWcgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdfQ29uZmlnUHJvcGVydGllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29uZmlnUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0gLy8gQWN0aXZhdGlvbkNvbmZpZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjE5NWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUKLSAqIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgcGFpciBmb3IgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotICogCi0gKiBUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLSAqIG1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUgZWxlbWVudAotCSAqICAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUgZWxlbWVudCBjb250YWlucwotCSAqICAgICAgICAgdGhlIG5hbWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBvZgotCSAqICAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCSAqIAotCSAqICAgICAgICAgRm9yIEpNUyBtZXNzYWdlLWRyaXZlbiBiZWFucywgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eQotCSAqICAgICAgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLQkgKiAgICAgICAgIG1lc3NhZ2VTZWxlY3RvciwgZGVzdGluYXRpb25UeXBlLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQXNzZW1ibHlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQXNzZW1ibHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOWU2OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Fzc2VtYmx5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotCi0vKioKLSAqIFRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4gQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzZW1ibHlEZXNjcmlwdG9yIGV4dGVuZHMgRU9iamVjdHsKLQotLyoqCi0gKiBSZXR1cm4gdGhlIGZpcnN0IG1ldGhvZCBwZXJtaXNzaW9uIHRoYXQgY29udGFpbnMgYWxsIHRoZSByb2xlcyBpbiBzZWN1cml0eVJvbGVzIGFuZAotICogaXMgdGhlIHNhbWUgc2l6ZQotICovCi1NZXRob2RQZXJtaXNzaW9uIGdldE1ldGhvZFBlcm1pc3Npb24oTGlzdCBzZWN1cml0eVJvbGVzKTsKLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyBmb3IgQGFuRUpCIGdvaW5nCi0gKiB0aHJvdWdoIHRoZSBNZXRob2RQZXJtaXNzaW9ucy4KLSAqLwotTGlzdCBnZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyBmb3IgQGFuRUpCIGdvaW5nCi0gKiB0aHJvdWdoIHRoZSBNZXRob2RUcmFuc2FjdGlvbnMuCi0gKi8KLUxpc3QgZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgOwotCXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0U2VjdXJpdHlSb2xlTmFtZWQoU3RyaW5nIHJvbGVOYW1lKTsKLQotLyoqCi0gKiBSZW5hbWUgdGhlIHNlY3VyaXR5IHJvbGUsIGlmIGl0IGV4aXN0cwotICovCi1wdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNZXRob2RQZXJtaXNzaW9ucyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kVHJhbnNhY3Rpb25zIHJlZmVyZW5jZXMKLQkgKiBTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZQotCSAqIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBUaGUgZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYQotCSAqIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuVGhlIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZQotCSAqIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLQkgKi8KLQlFTGlzdCBnZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEVqYkphciByZWZlcmVuY2UKLQkgKi8KLQlFSkJKYXIgZ2V0RWpiSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFamJKYXIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRFamJKYXIoRUpCSmFyIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgU2VjdXJpdHlSb2xlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRXhjbHVkZUxpc3QgcmVmZXJlbmNlCi0JICovCi0JRXhjbHVkZUxpc3QgZ2V0RXhjbHVkZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEV4Y2x1ZGVMaXN0IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RXhjbHVkZUxpc3QoRXhjbHVkZUxpc3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgTWV0aG9kRWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNpbmcgQGFuRUpCLgotCSAqLwotCXZvaWQgcmVtb3ZlRGF0YShFbnRlcnByaXNlQmVhbiBhbkVKQikgOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NNUEF0dHJpYnV0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NNUEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTUyNTI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9DTVBBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci0vKioKLSAqIERlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUgZmllbGQgZWxlbWVudCBpbmNsdWRlcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBDTVBBdHRyaWJ1dGUgZXh0ZW5kcyBFQXR0cmlidXRlewotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gV2l0aCBFSkIgMi4wLCBhc3N1bWluZyBhIEphdmEgZmllbGQgaXMgbm8gbG9uZ2VyIHNhZmUuCi0gKiAJCVVzZSBnZXRUeXBlKCkgYW5kIGdldE5hbWUoKSB0byBnZXQgdGhlIG1vc3QgY29tbW9uIGZpZWxkIGluZm8uCi0gKgkJT3IgdXNlIGdldEVqYkNsYXNzKCkgdG8gZ2V0IGFkZGl0aW9uYWwgSmF2YSBpbmZvLgotICovCi0KLUZpZWxkIGdldEZpZWxkKCkgOwotU3RyaW5nIGdldEdldHRlck5hbWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgYXR0cmlidXRlIGluIGl0cyBvcmlnaW5hbCBmb3JtIChpLmUuLCB1bndyYXBwZWQgaWYKLSAqIHRoZSB0eXBlIGhhcyBiZWVuIHdyYXBwZWQpLgotICovCi1wdWJsaWMgSmF2YUhlbHBlcnMgZ2V0T3JpZ2luYXRpbmdUeXBlKCkgOwotU3RyaW5nIGdldFNldHRlck5hbWUoKTsKLUphdmFIZWxwZXJzIGdldFR5cGUoKSA7Ci1ib29sZWFuIGlzQ01SRmllbGQoKSA7Ci1ib29sZWFuIGlzS2V5KCkgOwotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmaWVsZCBpcyBhIHByaW1rZXktZmllbGQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAqIEByZXR1cm4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNQcmltS2V5RmllbGQoKTsKLXB1YmxpYyB2b2lkIHNldE9yaWdpbmF0aW5nVHlwZShKYXZhSGVscGVycyBuZXdPcmlnaW5hdGluZ1R5cGUpIDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyAKLQkgKiB0aGUgY21yIGZpZWxkLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyCi0JICogd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLgotCSAqIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlCi0JICogZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYSB0YXJnZXRBdHRyaWJ1dGUgZXhpc3RzLgotCSAqLwotCWJvb2xlYW4gaXNEZXJpdmVkKCk7Ci0JCi0Jdm9pZCBzZXREZXJpdmVkKGJvb2xlYW4gYUJvb2xlYW4pOwotCQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NNUkZpZWxkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ01SRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmNWVkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ01SRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0vKioKLSAqIERlc2NyaWJlcyB0aGUgYmVhbiBwcm92aWRlcidzIHZpZXcgb2YgYSByZWxhdGlvbnNoaXAuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhIHJvbGUgb2YgYSByZWxhdGlvbnNoaXAuIFRoZSBDTVJGaWVsZDo6bmFtZSBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHVzZWQgZm9yIHRoZSBnZXQgYW5kIHNldCBhY2Nlc3NvciBtZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgQ01SRmllbGQ6OnR5cGUgZWxlbWVudCBpcyB1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkIENNUkZpZWxkcy4gSXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZCAoYSBqYXZhIGNsYXNzIG5hbWUpLgotICogCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBDTVJGaWVsZCBleHRlbmRzIENNUEF0dHJpYnV0ZXsKLQotICBwdWJsaWMgIFN0cmluZyBnZXRDb2xsZWN0aW9uVHlwZU5hbWUoKTsgIAotcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvblR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUm9sZSByZWZlcmVuY2UKLQkgKi8KLQlFSkJSZWxhdGlvbnNoaXBSb2xlIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJvbGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQ29sbGVjdGlvblR5cGUgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldENvbGxlY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb2xsZWN0aW9uVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldENvbGxlY3Rpb25UeXBlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29tbW9uUmVsYXRpb25zaGlwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29tbW9uUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWU5MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbW1vblJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC8yNi8yMDAxIDk6MjQ6MjcgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uUmVsYXRpb25zaGlwIGV4dGVuZHMgRU9iamVjdCB7Ci1wdWJsaWMgRUxpc3QgZ2V0Q29tbW9uUm9sZXMoKTsKLXB1YmxpYyBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGdldEZpcnN0Q29tbW9uUm9sZSgpOwotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0U2Vjb25kQ29tbW9uUm9sZSgpOwotcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci1wdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29tbW9uUmVsYXRpb25zaGlwUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0NvbW1vblJlbGF0aW9uc2hpcFJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4YjBmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29tbW9uUmVsYXRpb25zaGlwUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMjYvMjAwMSA5OjI0OjI3IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZXh0ZW5kcyBFT2JqZWN0IHsKLS8qKgotICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlcyBmcm9tIG15IEVudGl0eSB0aGF0IGFyZSB1c2VkCi0gKiBieSB0aGlzIHJvbGUuCi0gKi8KLQotcHVibGljIEVMaXN0IGdldEF0dHJpYnV0ZXMoKTsKLS8qKgotICogUmV0dXJuIG91ciBwYXJlbnQgcmVsYXRpb25zaGlwIGFzIGEgQ29tbW9uUmVsYXRpb25zaGlwCi0gKi8KLQotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcCBnZXRDb21tb25SZWxhdGlvbnNoaXAoKTsKLQotCi0vKioKLSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotICogRGVmaW5lcyBhIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZSBzYW1lIG5hbWUgZm9yIGEgcm9sZS4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotLyoqCi0gKiBSZXR1cm4gdGhlIGFjdHVhbCBuYW1lIG9mIHRoaXMgcm9sZS4gIFRoaXMgaXMgdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgRGVwbG95bWVudAotICogRGVzY3JpcHRvci4gIFlvdSBzaG91bGQgdXNlIDxjb2RlPmdldE5hbWUoKTwvY29kZT4gZm9yIHRoZSBuYW1lIHRvIHVzZSBpbiBjb2RlCi0gKiBnZW5lcmF0aW9uLgotICovCi1TdHJpbmcgZ2V0Um9sZU5hbWUoKTsKLS8qKgotICogUmV0dXJuIHRoZSBvdGhlciByb2xlLgotICovCi0KLUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSA7Ci0vKioKLSAqIEByZXR1cm4gVGhlIFNvdXJjZSBlamIKLSAqIENvbXB1dGUgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIAotICovCi1wdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRTb3VyY2VFbnRpdHkoKTsKLQotLyoqCi0gKiBAcmV0dXJuIFRoZSB0eXBlIGVqYgotICogQ29tcHV0ZSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB3aGljaCBpcyB0aGUgdHlwZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIAotICovCi1wdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRUeXBlRW50aXR5KCk7Ci0vKioKLSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgb2YgdGhlIGlzRm9yd2FyZCBhdHRyaWJ1dGUKLSogU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyByb2xlIHNob3VsZCBiZSBtYXBwZWQgdG8gYSBwZXJzaXN0ZW50IHJlZmVyZW5jZSwgc3VjaCBhcyBhIGZvcmVpZ24ga2V5LgotKi8KLXB1YmxpYyBib29sZWFuIGlzRm9yd2FyZCgpOwotLyoqCi0qIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIGlzS2V5Ci0qLwotcHVibGljIGJvb2xlYW4gaXNLZXkoKTsKLQotLyoqCi0gKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBhcyBhIGhpbnQgYWJvdXQgdGhlIGtleSBzdGF0dXMgb2YgdGhlIHJvbGUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldEtleShib29sZWFuIGFCb29sZWFuKSA7Ci0vKioKLSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgaXNNYW55Ci0qIFJldHVybnMgd2hldGhlciB0aGUgdXBwZXIgbGltaXQgb2Ygb3VyIG11bHRpcGxpY2l0eSBpcyA+IDEKLSovCi1wdWJsaWMgYm9vbGVhbiBpc01hbnkoKTsKLQotLyoqCi0qIAotKiBzZXRzIHRoZSB1cHBlciBsaW1pdCBvZiBvdXIgbXVsdGlwbGljaXR5Ci0qLwotcHVibGljIHZvaWQgc2V0VXBwZXIoaW50IHVwcGVyQm91bmQpOwotCi0vKioKLSogCi0qIHNldHMgdGhlIGxvd2VyIGxpbWl0IG9mIG91ciBtdWx0aXBsaWNpdHkKLSovCi1wdWJsaWMgdm9pZCBzZXRMb3dlcihpbnQgbG93ZXJCb3VuZCk7Ci0KLS8qKgotKiBAcmV0dXJuIFRoZSBjb21wdXRlZCB2YWx1ZSBvZiB0aGUgaXNOYXZpZ2FibGUgYXR0cmlidXRlCi0qIFNwZWNpZmllcyB0aGF0IGFjY2Vzc29ycyBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIHJlbGF0aW9uc2hpcCByb2xlLgotKi8KLXB1YmxpYyBib29sZWFuIGlzTmF2aWdhYmxlKCk7Ci1wdWJsaWMgU3RyaW5nIGdldFRhcmdldEF0dHJpYnV0ZU5hbWUoQ01QQXR0cmlidXRlIHJvbGVBdHRyaWJ1dGUpOwotCi12b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoKTsKLQkvKioKLQkgKiBNZXRob2QgaXNSZXF1aXJlZC4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvQ29udGFpbmVyTWFuYWdlZEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4MWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGV4dGVuZHMgRW50aXR5ewotCi0JU3RyaW5nIFZFUlNJT05fMV9YID0gIjEueCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkVSU0lPTl8yX1ggPSAiMi54IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXQVNfR0VORVJBVEVEX1NUUklOR19LRVkgPSAiY29tLmlibS53cy5lamJwZXJzaXN0ZW5jZS5kYXRhYWNjZXNzLkdlbmVyYXRlZFN0cmluZ1BLIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXQVNfR0VORVJBVEVEX1NUUklOR19GSUVMRCA9ICJ3YXNHZW5Vbmtub3dua2V5VmFsdWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVOS05PV05fUFJJTUFSWV9LRVkgPSAiamF2YS5sYW5nLk9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9MQU5HX1NUUklORyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCWludCBERVJJVkVEX0ZMQUdfQ0hBTkdFID0gMzAxOwotcHVibGljIENNUEF0dHJpYnV0ZSBhZGRLZXlBdHRyaWJ1dGVOYW1lKFN0cmluZyBhTmFtZSk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBDTVBBdHRyaWJ1dGUgYWRkUGVyc2lzdGVudEF0dHJpYnV0ZShGaWVsZCBhRmllbGQpIDsKLXB1YmxpYyBhYnN0cmFjdCBDTVBBdHRyaWJ1dGUgYWRkUGVyc2lzdGVudEF0dHJpYnV0ZU5hbWUoU3RyaW5nIGFOYW1lKSA7Ci0vKioKLSAqIFJldHVybiB0aGUga2V5QXR0cmlidXRlIHdpdGggYU5hbWUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC84LzIwMDAgOToyNToyNyBQTSkKLSAqIEByZXR1cm4gRVN0cnVjdHVyYWxGZWF0dXJlCi0gKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1DTVBBdHRyaWJ1dGUgZ2V0S2V5QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgOwotLyoqCi0gKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgd2l0aCBhTmFtZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzgvMjAwMCA5OjI1OjI3IFBNKQotICogQHJldHVybiBFU3RydWN0dXJhbEZlYXR1cmUKLSAqIEBwYXJhbSBhTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLUNNUEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgOwotLyoqCi0gKiBJZiBhIHByaW1hcnkga2V5IGV4aXN0cywgcmV0dXJuIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZTsgdGhlIHByaW1hcnkga2V5IGlzIGRlZmluZWQgYXMgb25lIGFuZCBvbmx5IG9uZQotICoga2V5IGF0dHJpYnV0ZSwgd2hvc2UgdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUga2V5IGNsYXNzCi0gKiBAZGVwcmVjYXRlZCAtIFVzZSBnZXRQcmltS2V5RmllbGQoKQotICovCi1DTVBBdHRyaWJ1dGUgZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpOwotCi1wdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfWCgpOwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl9YKCk7Ci1wdWJsaWMgYm9vbGVhbiBpc0tleUF0dHJpYnV0ZShDTVBBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpOwotLyoKLSAqIFJldHVybiB3aGV0aGVyIHRoaXMgYmVhbiByZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIHRoZSAidW5rbm93biBwcmltYXJ5IGtleSIgY2FzZQotICogZGVzY3JpYmVkIGluIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhpcyBpcyBpZGVudGlmaWVkIGJ5IHRoZSBwcmltYXJ5IGtleSBjbGFzcwotICogYmVpbmcgc3BlY2lmaWVkIGFzICJqYXZhLmxhbmcuT2JqZWN0Ii4KLSAqIEluIG9yZGVyIHRvIGRlcGxveSBhbiB1bmtub3duIHByaW1hcnkga2V5IGJlYW4sIHdlIG11c3Qgc3Vic3RpdHV0ZSBhIHJlYWwga2V5LAotICogYW5kIGFkZCBhIGNvcnJlc3BvbmRpbmcgZmllbGQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVW5rbm93blByaW1hcnlLZXkoKTsKLXB1YmxpYyBTdHJpbmdbXSBsaXN0UGVyc2lzdGVudEZpZWxkTmFtZXMoKTsKLQotQ01QQXR0cmlidXRlIHJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoRmllbGQgYUZpZWxkKSA7Ci0vKioKLSAqIFJlbW92ZSB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lZCBhTmFtZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzIvMjAwMCA4OjU5OjMyIFBNKQotICogQHBhcmFtIGFOYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotQ01QQXR0cmlidXRlIHJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSA7Ci0vKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQkgKiAKLQkgKiBAaW52YXJpYW50IFRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAxLnggLCAyLngKLQkgKiBAZGVmYXVsdCAyLngKLQotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JKi8KLQlwdWJsaWMgaW50IGdldENNUFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBBYnN0cmFjdFNjaGVtYU5hbWUgYXR0cmlidXRlCi0JICogVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSAKLQkgKiBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4KLQkgKiAKLQkgKiBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UKLQkgKiBpcyBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4KLQkgKiAKLQotCSAqLwotCVN0cmluZyBnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBYnN0cmFjdFNjaGVtYU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBYnN0cmFjdFNjaGVtYU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgUGVyc2lzdGVudEF0dHJpYnV0ZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEtleUF0dHJpYnV0ZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEtleUF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnl9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBtb3ZlZCBmcm9tIENNRQotCSAqIFRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZCBxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhlIGVudGl0eSBiZWFuLgotCSAqIAotCSAqIEBpbnZhcmlhbnQgc2VlIGRlc2NyaXB0aW9uCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkiIG9wcG9zaXRlPSJlbnRpdHkiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRRdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DTVAgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DTVAgQXR0cmlidXRlPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q01QQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltIEtleSBGaWVsZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1LZXlGaWVsZChDTVBBdHRyaWJ1dGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ByaW1LZXlGaWVsZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNNUEF0dHJpYnV0ZSBnZXRQcmltS2V5RmllbGQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldFByaW1LZXlGaWVsZCA8ZW0+UHJpbSBLZXkgRmllbGQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW0gS2V5IEZpZWxkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmltS2V5RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByaW1LZXlGaWVsZChDTVBBdHRyaWJ1dGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBRdWVyeSBtZXRob2RzIGZvciB0aGUgSG9tZSBhbmQgTG9jYWwgSG9tZSBpbnRlcmZhY2VzLgotCSAqLwotCUxpc3QgZ2V0QXZhaWxhYmxlRmluZFF1ZXJ5TWV0aG9kcygpIDsKLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIFF1ZXJ5IG1ldGhvZHMgZm9yIHRoZSBCZWFuIGNsYXNzLgotCSAqLwotCUxpc3QgZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCk7Ci0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCwgc29ydGVkIGJ5IHNpZ25hdHVyZSwgb2YgYWxsIHRoZSBhdmFpbGFibGUgUXVlcnkgbWV0aG9kcyAKLQkgKiBvbiB0aGUgcmVtb3RlIEhvbWUsIGxvY2FsIEhvbWUsIG9yIGVqYlNlbGVjdCBtZXRob2RzIG9uIHRoZSBiZWFuIGNsYXNzCi0JICovCi0JTGlzdCBnZXRBbGxBdmFpbGFibGVRdWVyeU1ldGhvZHMoKTsKLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEZlYXR1cmVzKEVKQkV4dGVuc2lvbkZpbHRlciBhRmlsdGVyKTsKLQlwdWJsaWMgdm9pZCBtYWtlUHJpbUtleUZpZWxkUHJveHkoKTsKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGFsbCBDTVIgZmllbGRzIGZvciB0aGlzIGJlYW4uCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q01SRmllbGRzKCk7Ci0JLyoqCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBhbGwgcm9sZXMgd2hlcmUgdGhpcyBiZWFuIGlzIHRoZSBzb3VyY2UuCi0JICogQGxpbmsgQ29tbW9uUmVsYXRpb25zaGlwUm9sZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzcGVjaWZpYyBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHdoaWNoIGhhcyBhIG5hbWVkIHJvbGUKLQkgKiB0aGF0IGlzIGVxdWFsIHRvIDxjb2RlPnJvbGVOYW1lPC9jb2RlPi4KLQkgKiBAc2VlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLQkgKi8KLQlwdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBnZXRSb2xlKFN0cmluZyByb2xlTmFtZSk7Ci0JCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRGVzdGluYXRpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRGVzdGluYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMTdmODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Rlc3RpbmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIERlc3RpbmF0aW9uVHlwZSB7fQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVzdGluYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVVFPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUElDPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UXVldWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5RdWV1ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNRVUVVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFFVRVVFX0xJVEVSQUwgPSBuZXcgRGVzdGluYXRpb25UeXBlKFFVRVVFLCAiUXVldWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VG9waWM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Ub3BpYzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUT1BJQwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFRPUElDX0xJVEVSQUwgPSBuZXcgRGVzdGluYXRpb25UeXBlKFRPUElDLCAiVG9waWMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlc3RpbmF0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBEZXN0aW5hdGlvblR5cGVbXSB7Ci0JCQlRVUVVRV9MSVRFUkFMLAotCQkJVE9QSUNfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EZXN0aW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZXN0aW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVzdGluYXRpb25UeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRGVzdGluYXRpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEZXN0aW5hdGlvblR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFFVRVVFOiByZXR1cm4gUVVFVUVfTElURVJBTDsKLQkJCWNhc2UgVE9QSUM6IHJldHVybiBUT1BJQ19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEZXN0aW5hdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vRGVzdGluYXRpb25UeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCRXh0ZW5zaW9uRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCRXh0ZW5zaW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZWM0NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQkV4dGVuc2lvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA1OjMxOjUzIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkV4dGVuc2lvbkZpbHRlciB7Ci1MaXN0IGZpbHRlcihFbnRlcnByaXNlQmVhbiBlamIpIDsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCSmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCSmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTM2Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQkphci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci0KLS8qKgotICogVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZTsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlCi0gKiBuYW1lOyBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQgZW50ZXJwcmlzZSBiZWFuczsgYSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLCBpZiBhbnk7IGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3I7IGFuZCBhbiBvcHRpb25hbCBuYW1lIG9mIGFuIGVqYi1jbGllbnQtamFyIGZpbGUgZm9yIHRoZSBlamItamFyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkphciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqLwotYm9vbGVhbiBjb250YWluc0NvbnRhaW5lck1hbmFnZWRCZWFucygpIDsKLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2VjdXJpdHlSb2xlKFN0cmluZyBuYW1lKTsKLS8qKgotICogUmV0dXJuIExpc3Qgb2YgQmVhbk1hbmFnZWQgYmVhbnMgaW4gdGhpcyBqYXIuCi0gKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gKi8KLUxpc3QgZ2V0QmVhbk1hbmFnZWRCZWFucygpIDsKLS8qKgotICogUmV0dXJuIExpc3Qgb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotTGlzdCBnZXRDb250YWluZXJNYW5hZ2VkQmVhbnMoKSA7Ci0vKioKLSAqIFJldHVybiBMaXN0IG9mIEVKQiAxLjEgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotTGlzdCBnZXRFSkIxMUNvbnRhaW5lck1hbmFnZWRCZWFucygpIDsKLS8qKgotICogUmV0dXJuIExpc3Qgb2YgRUpCIDIuMCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1MaXN0IGdldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgOwotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBNZXNzYWdlRHJpdmVuIGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1MaXN0IGdldE1lc3NhZ2VEcml2ZW5CZWFucygpIDsKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVqYlJlbGF0aW9ucyByZWZlcmVuY2VzCi0JICogQSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJSZWxhdGlvbnMoKTsKLS8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMuICBUaGUgZWpiLWxpbmsgdmFsdWUKLSAqIG9mIHRoZSByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7IG90aGVyd2lzZSByZXR1cm4KLSAqIG51bGwKLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYpOwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnByaXNlQmVhbk5hbWVkKFN0cmluZyBlamJOYW1lKTsKLS8qKgotICogUmV0dXJuIEFMTCBFbnRlcnByaXNlQmVhbihzKSB0aGF0IGFyZSByZWZlcmVuY2luZyBAYUphdmFDbGFzcyBhcyBhCi0gKiBob21lLCByZW1vdGUsIGJlYW4gY2xhc3MsIG9yIGtleSBjbGFzcy4KLSAqLwotTGlzdCBnZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSA7Ci0vKioKLSAqIFJldHVybiB0aGUgKkZJUlNUKiBFbnRlcnByaXNlQmVhbiB0aGF0IGlzIHJlZmVyZW5jaW5nIEBhSmF2YUNsYXNzIGFzIGl0cwotICogaG9tZSwgcmVtb3RlLCBiZWFuIGNsYXNzLCBvciBrZXkgY2xhc3MuCi0gKi8KLUVudGVycHJpc2VCZWFuIGdldEVudGVycHJpc2VCZWFuV2l0aFJlZmVyZW5jZShKYXZhQ2xhc3MgYUphdmFDbGFzcykgOwotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBTZXNzaW9uIGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1MaXN0IGdldFNlc3Npb25CZWFucygpIDsKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIEVKQiBKQVIgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIEVKQiAxLjEgZGVzY3JpcHRvcgotICogQHJldHVybiBib29sZWFuCi0gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VmVyc2lvbklEKCkgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotICovCi1ib29sZWFuIGlzVmVyc2lvbjFfMURlc2NyaXB0b3IoKSA7Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBFSkIgSkFSIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBFSkIgMi4wIGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotYm9vbGVhbiBpc1ZlcnNpb24yXzBEZXNjcmlwdG9yKCkgOwotLyoqCi0gKiBSZW5hbWUgdGhlIHNlY3VyaXR5IHJvbGUgY29udGFpbmVkIGluIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yOyBmb3IgZWFjaCBlbnRlcnByaXNlIGJlYW4sIGZpeCB0aGUgcm9sZS1saW5rIG9uIGFueSBjb250YWluZWQgcm9sZQotICogcmVmcwotICovCi1wdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSk7Ci0JLyoqCi0JICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRWpiQ2xpZW50SmFyIGF0dHJpYnV0ZQotCSAqIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhlCi0JICogY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbgotCSAqIHRoZSBlamItamFyIGZpbGUuIFRoZSBEZXBsb3llciBzaG91bGQgbWFrZSB0aGUgZWpiLWNsaWVudCBKQVIgZmlsZSBhY2Nlc3NpYmxlCi0JICogdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4gCi0JICogRXhhbXBsZTo8ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyPC8vZWpiLWNsaWVudC1qYXI+Ci0KLQkgKi8KLQlTdHJpbmcgZ2V0RWpiQ2xpZW50SmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWpiQ2xpZW50SmFyIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RWpiQ2xpZW50SmFyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiBUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlCi0JICogICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLQkgKiAgICAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzCi0JICogICAgIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciBFSkIgRGVwbG95bWVudAotCSAqICAgICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotCSAqICAgICBzY2hlbWEuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX1ZlcnNpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQXNzZW1ibHlEZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFzc2VtYmx5RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBFbnRlcnByaXNlQmVhbnMgcmVmZXJlbmNlcwotCSAqIFRoZSBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBvbmUgb3IgbW9yZQotCSAqIGVudGVycHJpc2UgYmVhbnMuCi0JICovCi0JRUxpc3QgZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZWxhdGlvbnNoaXBMaXN0IHJlZmVyZW5jZQotCSAqIFRoZSByZWxhdGlvbnNoaXBzIGNvbGxlY3Rpb24gZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoIGNvbnRhaW5lcgotCSAqIG1hbmFnZWQgcGVyc2lzdGVuY2UgZW50aXR5IGJlYW5zIGFuZCBkZXBlbmRlbnQgb2JqZWN0cyBwYXJ0aWNpcGF0ZS4gVGhlCi0JICogcmVsYXRpb25zaGlwcyBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhIGxpc3Qgb2YKLQkgKiBlamItZW50aXR5LXJlZiBlbGVtZW50cyAocmVmZXJlbmNlcyB0byBlbnRpdHkgYmVhbnMgdGhhdCBwYXJ0aWNpcGF0ZSBpbgotCSAqIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMgYnV0IHdob3NlIGFic3RyYWN0IHBlcnNpc3RlbmNlIHNjaGVtYXMgYXJlIG5vdAotCSAqIGluY2x1ZGVkIGluIHRoZSBlamItamFyIGZpbGUpOwotCSAqIGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZAotCSAqIHJlbGF0aW9uc2hpcHMuCi0JICovCi0JUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZWxhdGlvbnNoaXBMaXN0IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVsYXRpb25zaGlwTGlzdChSZWxhdGlvbnNoaXBzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRUpCUmVsYXRpb25zaGlwUm9sZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgPGNvZGU+YVJvbGVOYW1lPC9jb2RlPgotCSAqIHRoYXQgaGFzIDxjb2RlPnNvdXJjZUNNUDwvY29kZT4gYXMgaXRzIHNvdXJjZSBiZWFuLgotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0UmVsYXRpb25zaGlwUm9sZShTdHJpbmcgYVJvbGVOYW1lLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IHNvdXJjZUNNUCkgOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgRUpCUmVsYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIDxjb2RlPmFSZWxhdGlvbk5hbWU8L2NvZGU+LgotCSAqLwotCUVKQlJlbGF0aW9uIGdldEVKQlJlbGF0aW9uKFN0cmluZyBhUmVsYXRpb25OYW1lKSA7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBFSkJSZWxhdGlvbiBvYmplY3RzIHRoYXQgaGF2ZSBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIHdpdGggYQotCSAqIHNvdXJjZSBFSkIgb2YgPGNvZGU+Y21wPC9jb2RlPi4KLQkgKi8KLQlMaXN0IGdldEVKQlJlbGF0aW9uc0ZvclNvdXJjZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iamVjdHMgdGhhdCBoYXZlIGFuIEVKQlJlbGF0aW9uc2hpcFJvbGUgd2l0aCBhCi0JICogdHlwZSBFSkIgb2YgPGNvZGU+Y21wPC9jb2RlPi4KLQkgKi8KLQlMaXN0IGdldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgOwotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQk1ldGhvZENhdGVnb3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCTWV0aG9kQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjZTdkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCTWV0aG9kQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogVGhlIHZhbGlkIEVKQiBtZXRob2QgY2F0ZWdvcnkgbmFtZXMgYXJlOiBFSkJIT01FTUVUSE9ELCBFSkJDUkVBVEVNRVRIT0QsIEVKQkZJTkRFUk1FVEhPRCwgRUpCUkVNT1RFTUVUSE9ELgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQk1ldGhvZENhdGVnb3J5IGV4dGVuZHMgRU9iamVjdHsKLQkvL0VKQk1ldGhvZENhdGVnb3J5Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlbGF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkYTBiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBUaGUgZWpiLXJlbGF0aW9uIGVsZW1lbnQgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHBlcnNpc3RlbmNlLiBBbiBlamItcmVsYXRpb24gZWxlbWVudCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28gcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVzLiBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLSAqIAotICogQGludmFyaWFudCBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLSAqIEBpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlcy5zaXplID09IDIKLSAqIEBpbnZhcmlhbnQgc2VsZi5yZWxhdGlvbnNoaXBSb2xlc1swXS5uYW1lICE9IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMV0ubmFtZQotICogCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBNb3ZlZCBmcm9tIGVqYmV4dDo6RWpiUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgdW5kZXIgZWpiZXh0OjpFSkJKYXJFeHRlbnNpb24KLSAqIEBtaWdyYXRpb24gRUpCMS4xIGFkZGVkIG9wdGlvbmFsIGF0dHJpYnV0ZSwgZGVzY3JpcHRpb246U3RyaW5nCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIG5hbWU6U3RyaW5nIChNYXkgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIEVPYmplY3QgcHJldmlvdXNseSkKLSAqLwotcHVibGljIGludGVyZmFjZSBFSkJSZWxhdGlvbiBleHRlbmRzIEVPYmplY3QsQ29tbW9uUmVsYXRpb25zaGlwewotCi1ib29sZWFuIGNvbnRhaW5zUmVsYXRpb25zaGlwUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSA7Ci1FSkJSZWxhdGlvbnNoaXBSb2xlIGdldEZpcnN0Um9sZSgpIDsKLS8qKgotICogUmV0dXJuIHRoZSBvdGhlciByb2xlLgotICovCi0KLUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0T3Bwb3NpdGVSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIDsKLUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0U2Vjb25kUm9sZSgpIDsKLS8qKgotICogU2V0IHRoZSBmb3J3YXJkIHJvbGUuCi0gKi8KLQotdm9pZCBzZXRGb3dhcmQoRUpCUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBlamIgcmVsYXRpb24uCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBJZiBzcGVjaWZpZWQsIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotCSAqIGZpbGUuCi0JICogQGludmFyaWFudCBzZWxmLm5hbWUgdW5pcXVlIHdpdGhpbiBTZXQ8Y29sbGVjdChlamJKYXIuZWpiUmVsYXRpb25zLm5hbWUpPgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFJlbGF0aW9uc2hpcExpc3QgcmVmZXJlbmNlCi0JICovCi0JUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZWxhdGlvbnNoaXBMaXN0IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVsYXRpb25zaGlwTGlzdChSZWxhdGlvbnNoaXBzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgUmVsYXRpb25zaGlwUm9sZXMgcmVmZXJlbmNlcwotCSAqIEEgY29sbGVjdGlvbiBjb250YWluaW5nIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlcy4KLQkgKiAKLQkgKiBAbWlncmF0aW9uIEVKQjEuMSBDb250YWlubWVudCB1c2VkIHRvIGJlIGJ5IHJlZmVyZW5jZSBvbiByZWxhdGlvbi0tbm93IGJ5IHZhbHVlLgotCi0JICovCi0JRUxpc3QgZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBFSkJSZWxhdGlvbnNoaXBSb2xlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyA8Y29kZT5hUm9sZU5hbWU8L2NvZGU+LgotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0UmVsYXRpb25zaGlwUm9sZShTdHJpbmcgYVJvbGVOYW1lKSA7Ci19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVsYXRpb25zaGlwUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VKQlJlbGF0aW9uc2hpcFJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5ZDc5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVsYXRpb25zaGlwUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLQotLyoqCi0gKiBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgZGVzY3JpYmVzIGEgcm9sZSB3aXRoaW4gYSByZWxhdGlvbnNoaXAuCi0gKiBUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLiBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgY2FzY2FkZS1kZWxldGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7IHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlIGNtci1maWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZS4gVGhlIG11bHRpcGxpY2l0eSBhbmQgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4gVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5LWJlYW4gYnkgbWVhbnMgb2YgYW4gZWpiLW5hbWUgZWxlbWVudC4gRm9yIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcywgYm90aCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBtdXN0IGRlY2xhcmUgYSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZCBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkLiBUaGUgbGFjayBvZiBhIGNtci1maWVsZCBlbGVtZW50IGluIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBzcGVjaWZpZXMgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQgdGhhdCBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gKiAKLSAqIEBpbnZhcmlhbnQgbXVsdGlwbGljaXR5ICE9IG51bGwKLSAqIEBpbnZhcmlhbnQgcm9sZVNvdXJjZSAhPSBudWxsCi0gKiBAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbiBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIHJvbGVTb3VyY2UgZWxlbWVudCBzcGVjaWZpZXMgYSBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzLiAKLSAqIEBpbnZhcmlhbnQgQ2FzY2FkZSBkZWxldGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBFSkJSZWxhdGlvbnNoaXBSb2xlIGNvbnRhaW5lZCBpbiBhbiBFSkJyZWxhdGlvbiBpbiB3aGljaCB0aGUgb3RoZXIgRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0gKiAKLSAqIEV4YW1wbGU6Ci0gKiA8ZWpiLXJlbGF0aW9uPgotICogICA8ZWpiLXJlbGF0aW9uLW5hbWU+UHJvZHVjdC1MaW5lSXRlbTwvL2VqYi1yZWxhdGlvbi1uYW1lPgotICogICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICogICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXM8Ly9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAqICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvL211bHRpcGxpY2l0eT4KLSAqICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICogICAgICAgPGVqYi1uYW1lPlByb2R1Y3RFSkI8Ly9lamItbmFtZT4KLSAqICAgICA8Ly9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gKiAgIDwvL2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAqIC4uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQlJlbGF0aW9uc2hpcFJvbGUgZXh0ZW5kcyBFT2JqZWN0LENvbW1vblJlbGF0aW9uc2hpcFJvbGV7Ci0KLS8qKgotICogQHJldHVybiBUaGUgbG9naWNhbCBuYW1lIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBuYW1pbmcgdGhpcyByb2xlLgotICogUmVxdWlyZWQgdG8gYmUgdW5pcXVlIHdpdGhpbiBhIEpBUi4KLSAqIElmIGEgY21yLWZpZWxkIGlzIGRlZmluZWQsIHRoZW4gYSBuYW1lIGluIHRoZSBmb3JtICVzb3VyY2UtZWpiLW5hbWUlXyVjbXItZmllbGQtbmFtZSUgaXMgY29tcHV0ZWQuCi0gKiBPdGhlcndpc2UgYSBkZWZhdWx0IElEIGlzIGdlbmVyYXRlZC4KLSAqLwotcHVibGljIFN0cmluZyBnZXRMb2dpY2FsTmFtZSgpOwotLyoqCi0gKiBSZXR1cm4gdGhlIG90aGVyIHJvbGUuCi0gKi8KLQotRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRPcHBvc2l0ZSgpIDsKLS8qKgotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nIHRoZSB1bmlxdWUgbmFtZSBmb3IgdGhpcyByb2xlCi0gKiAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpOwotLyoqCi0gKiBAcmV0dXJuIFRoZSBTb3VyY2UgZWpiCi0gKiBDb21wdXRlIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiAKLSAqLwotcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0U291cmNlRW50aXR5KCk7Ci0vKioKLSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgb2YgdGhlIGlzRm9yd2FyZCBhdHRyaWJ1dGUKLSogU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyByb2xlIHNob3VsZCBiZSBtYXBwZWQgdG8gYSBwZXJzaXN0ZW50IHJlZmVyZW5jZSwgc3VjaCBhcyBhIGZvcmVpZ24ga2V5LgotKi8KLXB1YmxpYyBib29sZWFuIGlzRm9yd2FyZCgpOwotLyoqCi0qIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIGlzTWFueQotKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVwcGVyIGxpbWl0IG9mIG91ciBtdWx0aXBsaWNpdHkgaXMgPiAxCi0qLwotcHVibGljIGJvb2xlYW4gaXNNYW55KCk7Ci0vKioKLSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgb2YgdGhlIGlzTmF2aWdhYmxlIGF0dHJpYnV0ZQotKiBTcGVjaWZpZXMgdGhhdCBhY2Nlc3NvcnMgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyByZWxhdGlvbnNoaXAgcm9sZS4KLSovCi1wdWJsaWMgYm9vbGVhbiBpc05hdmlnYWJsZSgpOwotLyoqCi0gKiBTZXQgdGhpcyByb2xlIHRvIGJlIHRoZSBmb3J3YXJkIHJvbGUuCi0gKi8KLQotdm9pZCBzZXRGb3dhcmQoKSA7Ci0KLXB1YmxpYyB2b2lkIHNldE5hbWUoamF2YS5sYW5nLlN0cmluZyB1bmlxdWVOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyAKLQkgKiB0aGUgZWpiIHJlbGF0aW9uc2hpcCByb2xlLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyCi0JICogd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLgotCSAqIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlCi0JICogZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJvbGVOYW1lIGF0dHJpYnV0ZQotCSAqIERlZmluZXMgYSBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50Ci0JICogcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZSBzYW1lIG5hbWUgZm9yIGEgcm9sZS4KLQotCSAqLwotCVN0cmluZyBnZXRSb2xlTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJvbGVOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11bHRpcGxpY2l0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uLgotCSAqIAotCSAqIFRoZSBtdWx0aXBsaWNpdHkgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkgKiAgICAgIE9uZQotCSAqICAgICAgTWFueQotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsaWNpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQKLQkgKiBAc2VlICNpc1NldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI3NldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNdWx0aXBsaWNpdHlLaW5kIGdldE11bHRpcGxpY2l0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0TXVsdGlwbGljaXR5IDxlbT5NdWx0aXBsaWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxpY2l0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTXVsdGlwbGljaXR5S2luZAotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICN1bnNldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjZ2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldE11bHRpcGxpY2l0eSA8ZW0+TXVsdGlwbGljaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjZ2V0TXVsdGlwbGljaXR5KCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE11bHRpcGxpY2l0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNnZXRNdWx0aXBsaWNpdHkgPGVtPk11bHRpcGxpY2l0eTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGljaXR5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsaWNpdHkoKQotCSAqIEBzZWUgI2dldE11bHRpcGxpY2l0eSgpCi0JICogQHNlZSAjc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNdWx0aXBsaWNpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBDYXNjYWRlRGVsZXRlIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYSBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0JICogZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZiBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUKLQkgKiBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbiBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuCi0JICogRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCcmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyCi0JICogRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0JICogCi0JICogCi0KLQkgKi8KLQlib29sZWFuIGlzQ2FzY2FkZURlbGV0ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENhc2NhZGVEZWxldGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlRGVsZXRlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZSNpc0Nhc2NhZGVEZWxldGUgPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDYXNjYWRlRGVsZXRlKCkKLQkgKiBAc2VlICNpc0Nhc2NhZGVEZWxldGUoKQotCSAqIEBzZWUgI3NldENhc2NhZGVEZWxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXRDYXNjYWRlRGVsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2lzQ2FzY2FkZURlbGV0ZSA8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q2FzY2FkZURlbGV0ZSgpCi0JICogQHNlZSAjaXNDYXNjYWRlRGVsZXRlKCkKLQkgKiBAc2VlICNzZXRDYXNjYWRlRGVsZXRlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzU2V0Q2FzY2FkZURlbGV0ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUmVsYXRpb25zaGlwIHJlZmVyZW5jZQotCSAqLwotCUVKQlJlbGF0aW9uIGdldFJlbGF0aW9uc2hpcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVsYXRpb25zaGlwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVsYXRpb25zaGlwKEVKQlJlbGF0aW9uIHZhbHVlKTsKLQotCXZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiBpc1JlcXVpcmVkKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTb3VyY2UgcmVmZXJlbmNlCi0JICogRGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQQotCSAqIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uCi0JICogQG1pZ3JhdGlvbiBFSkIxLjE6IHdhcyBpYm1lamJleHQ6OkVqYlJlbGF0aW9uc2hpcFJvbGU6OnNvdXJjZUVKQk5hbWUsIGJ1dCB0aGF0Ci0JICogbWF5IG5vdCBiZSBzdWZmaWNpZW50LCBhcyB0aGlzIGNhbiBub3cgcmVmZXIgdG8gZGVwZW5kZW50IGNsYXNzIG5hbWVzIG9yIGVqYgotCSAqIHJlZnMKLQkgKi8KLQlSb2xlU291cmNlIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU291cmNlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0U291cmNlKFJvbGVTb3VyY2UgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQ21yRmllbGQgcmVmZXJlbmNlCi0JICogQSBkZWNsYXJhdGlvbiBvZiB0aGUgQ01SRmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlCi0JICogcmVsYXRpb25zaGlwIGlzIGFjY2Vzc2VkIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSByb2xlIHNvdXJjZQotCSAqIAotCSAqIEBtaWdyYXRpb24gRUpCMS4xOiBVc2VkIHRvIGJlIGhhbmRsZWQgdmlhIGlibWVqYmV4dDo6RWpiUm9sZTo6YXR0cmlidXRlcyBsaXN0Ci0JICovCi0JQ01SRmllbGQgZ2V0Q21yRmllbGQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENtckZpZWxkIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0Q21yRmllbGQoQ01SRmllbGQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgcm9sZSBpcyBwYXJ0IG9mIHRoZSBrZXkgb2YgdGhlIHNvdXJjZSBFSkIuCi0JICovCi0JYm9vbGVhbiBpc0tleSgpOwotCQotCS8qKgotCSAqIFRoaXMgYWxsb3dzIHlvdSB0byBzZXQgdGhlIFJvbGUgYXMgYmVpbmcga2V5IHNvIGl0IHdpbGwKLQkgKiBub3QgdHJhdmVyc2UgaXQgYXR0cmlidXRlcyB0byBkZXRlcm1pbmUgaWYgaXQgaXMga2V5LgotCSAqLwotCXZvaWQgc2V0S2V5KGJvb2xlYW4gYUJvb2xlYW4pIDsKLQkKLQl2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoKSA7Ci19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRUpCUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmYzYThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FSkJSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBFSkJSZXNvdXJjZSBleHRlbmRzIFhNTFJlc291cmNlIHsKLQlFSkJKYXIgZ2V0RUpCSmFyKCk7Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZSBzdXBwb3J0cyB0aGUgRUpCIDEuMSBzcGVjLgotCSAqLwotCWJvb2xlYW4gaXNFSkIxXzEoKTsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIHN1cHBvcnRzIHRoZSBFSkIgMi4wIHNwZWMuCi0JICovCi0JYm9vbGVhbiBpc0VKQjJfMCgpOwotCS8qKgotCSAqIFNldHMgdGhlIGJhdGNoTW9kZS4KLQkgKiBAcGFyYW0gYmF0Y2hNb2RlIFRoZSBiYXRjaE1vZGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hNb2RlKGJvb2xlYW4gaXNCYXRjaCk7Ci0JLyoqCi0JICogR2V0cyB0aGUgYmF0Y2htb2RlIC0gZnJvbSB0aGUgcmVuZGVyZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JhdGNoTW9kZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5YWNmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVqYkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWpiRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGwoKTsKLQotTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KFN0cmluZyBhU2lnbmF0dXJlKSA7Ci1NZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKE1ldGhvZCBtZXRob2QpIDsKLU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudEZyb20oamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCkgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kUGVybWlzc2lvbiB2YWx1ZQotCSAqLwotCU1ldGhvZFBlcm1pc3Npb24gY3JlYXRlTWV0aG9kUGVybWlzc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBc3NlbWJseURlc2NyaXB0b3IgdmFsdWUKLQkgKi8KLQlBc3NlbWJseURlc2NyaXB0b3IgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZFRyYW5zYWN0aW9uIHZhbHVlCi0JICovCi0JTWV0aG9kVHJhbnNhY3Rpb24gY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRW50aXR5IHZhbHVlCi0JICovCi0JRW50aXR5IGNyZWF0ZUVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb250YWluZXJNYW5hZ2VkRW50aXR5IHZhbHVlCi0JICovCi0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENNUEF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCUNNUEF0dHJpYnV0ZSBjcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ01SRmllbGQgdmFsdWUKLQkgKi8KLQlDTVJGaWVsZCBjcmVhdGVDTVJGaWVsZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJSZWxhdGlvbnNoaXBSb2xlIHZhbHVlCi0JICovCi0JRUpCUmVsYXRpb25zaGlwUm9sZSBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVKQlJlbGF0aW9uIHZhbHVlCi0JICovCi0JRUpCUmVsYXRpb24gY3JlYXRlRUpCUmVsYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmVsYXRpb25zaGlwcyB2YWx1ZQotCSAqLwotCVJlbGF0aW9uc2hpcHMgY3JlYXRlUmVsYXRpb25zaGlwcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJKYXIgdmFsdWUKLQkgKi8KLQlFSkJKYXIgY3JlYXRlRUpCSmFyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJvbGVTb3VyY2UgdmFsdWUKLQkgKi8KLQlSb2xlU291cmNlIGNyZWF0ZVJvbGVTb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUXVlcnkgdmFsdWUKLQkgKi8KLQlRdWVyeSBjcmVhdGVRdWVyeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBRdWVyeU1ldGhvZCB2YWx1ZQotCSAqLwotCVF1ZXJ5TWV0aG9kIGNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25Db25maWcgY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHZhbHVlCi0JICovCi0JTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEV4Y2x1ZGVMaXN0IHZhbHVlCi0JICovCi0JRXhjbHVkZUxpc3QgY3JlYXRlRXhjbHVkZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2Vzc2lvbiB2YWx1ZQotCSAqLwotCVNlc3Npb24gY3JlYXRlU2Vzc2lvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXNzYWdlRHJpdmVuIHZhbHVlCi0JICovCi0JTWVzc2FnZURyaXZlbiBjcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiB2YWx1ZQotCSAqLwotCU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCTWV0aG9kQ2F0ZWdvcnkgdmFsdWUKLQkgKi8KLQlFSkJNZXRob2RDYXRlZ29yeSBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRWpiUGFja2FnZSBnZXRFamJQYWNrYWdlKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJNZXRob2RFbGVtZW50Q29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYThiYTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FamJNZXRob2RFbGVtZW50Q29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQlzdGF0aWMgZmluYWwgaW50IEhPTUUgPSBNZXRob2RFbGVtZW50S2luZC5IT01FOwotCXN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFID0gTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFOwotCXN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfSE9NRSA9IE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUU7Ci0Jc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMOwotCXN0YXRpYyBmaW5hbCBpbnQgVU5TUEVDSUZJRUQgPSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbXBhcmF0b3IjY29tcGFyZShPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJcmV0dXJuIGNvbXBhcmUoKE1ldGhvZEVsZW1lbnQpIG8xLCAoTWV0aG9kRWxlbWVudCkgbzIpOwotCX0KLQkvKioKLQkgKiBTb3J0IGJ5IHR5cGUgZmlyc3QgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLQkgKiBIb21lLCBSZW1vdGUsIExvY2FsSG9tZSwgTG9jYWwsIFVuc3BlY2lmaWVkCi0JICogVGhlbiBhbHBoYWJldGljYWxseSBvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXBhcmUoTWV0aG9kRWxlbWVudCBtZTEsIE1ldGhvZEVsZW1lbnQgbWUyKSB7Ci0JCWludCB0eXBlMSwgdHlwZTI7Ci0JCXR5cGUxID0gbWUxLmdldFR5cGUoKS5nZXRWYWx1ZSgpOwotCQl0eXBlMiA9IG1lMi5nZXRUeXBlKCkuZ2V0VmFsdWUoKTsKLQkJaWYgKHR5cGUxID09IHR5cGUyKQotCQkJcmV0dXJuIGNvbXBhcmVTaWduYXR1cmVzKG1lMSwgbWUyKTsKLQkJcmV0dXJuIGNvbXBhcmVUeXBlcyh0eXBlMSwgdHlwZTIpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgY29tcGFyZVR5cGVzKGludCB0eXBlMSwgaW50IHR5cGUyKSB7Ci0JCWlmICh0eXBlMSA9PSBIT01FKQotCQkJcmV0dXJuIC0xOwotCQlpZiAodHlwZTEgPT0gUkVNT1RFKSB7Ci0JCQlpZiAodHlwZTIgPT0gSE9NRSkKLQkJCQlyZXR1cm4gMTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodHlwZTEgPT0gTE9DQUxfSE9NRSkgewotCQkJaWYgKHR5cGUyID09IEhPTUUgfHwgdHlwZTIgPT0gUkVNT1RFKQotCQkJCXJldHVybiAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICh0eXBlMSA9PSBMT0NBTCkgewotCQkJaWYgKHR5cGUyID09IEhPTUUgfHwgdHlwZTIgPT0gUkVNT1RFIHx8IHR5cGUyID09IExPQ0FMX0hPTUUpCi0JCQkJcmV0dXJuIDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKHR5cGUxID09IFVOU1BFQ0lGSUVEKSB7Ci0JCQlpZiAodHlwZTIgPT0gSE9NRSB8fCB0eXBlMiA9PSBSRU1PVEUgfHwgdHlwZTIgPT0gTE9DQUxfSE9NRSB8fCB0eXBlMiA9PSBMT0NBTCkKLQkJCQlyZXR1cm4gMTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCXByb3RlY3RlZCBpbnQgY29tcGFyZVNpZ25hdHVyZXMoTWV0aG9kRWxlbWVudCBtZTEsIE1ldGhvZEVsZW1lbnQgbWUyKSB7Ci0JCVN0cmluZyBzaWcxLCBzaWcyOwotCQlzaWcxID0gbWUxLmdldFNpZ25hdHVyZSgpOwotCQlzaWcyID0gbWUyLmdldFNpZ25hdHVyZSgpOwotCQlyZXR1cm4gc2lnMS5jb21wYXJlVG8oc2lnMik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiTWV0aG9kRWxlbWVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYk1ldGhvZEVsZW1lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwMjJlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiTWV0aG9kRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVqYk1ldGhvZEVsZW1lbnRIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9NRVRIT0RTID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT01FX01FVEhPRFMgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NRVRIT0RTID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEVfTUVUSE9EUyA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfTUVUSE9EUyA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfSE9NRV9NRVRIT0RTID0gNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9SRU1PVEVfTUVUSE9EUyA9IDY7Ci0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGRlZmF1bHRNRUNvbXBhcmF0b3I7Ci0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGRlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvcjsKLQlwcml2YXRlIHN0YXRpYyBFamJNZXRob2RFbGVtZW50SGVscGVyIHNpbmdsZXRvbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01FVEhPRF9OQU1FID0gIioiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0VMRU1FTlRfTkFNRSA9ICJNZXRob2RFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBFamJNZXRob2RFbGVtZW50SGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgc3RhdGljIEVqYk1ldGhvZEVsZW1lbnRIZWxwZXIgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgRWpiTWV0aG9kRWxlbWVudEhlbHBlcigpOwotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEVsZW1lbnRzRXF1YWwoTWV0aG9kRWxlbWVudCBtZTEsIE1ldGhvZEVsZW1lbnQgbWUyKSB7Ci0JCXJldHVybiAobWUxLmdldFNpZ25hdHVyZSgpLmVxdWFscyhtZTIuZ2V0U2lnbmF0dXJlKCkpIAotCQkJCSYmIG1lMS5nZXRFbnRlcnByaXNlQmVhbigpID09IG1lMi5nZXRFbnRlcnByaXNlQmVhbigpIAotCQkJCSYmIG1lMS5nZXRNZXRob2RQYXJhbXMoKS5lcXVhbHMobWUyLmdldE1ldGhvZFBhcmFtcygpKSAKLQkJCQkmJiBtZTEuZ2V0VHlwZSgpID09IG1lMi5nZXRUeXBlKCkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEVsZW1lbnRpbkxpc3QoTGlzdCBtZUxpc3QsIE9iamVjdCBtZSkgewotCQlpZiAoISAobWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChtZUxpc3QuZ2V0KGkpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBtZUxpc3QuZ2V0KGkpOwotCQkJCWlmIChpc01ldGhvZEVsZW1lbnRzRXF1YWwoZWxlbWVudCwgKE1ldGhvZEVsZW1lbnQpbWUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXByb3RlY3RlZCBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvciBnZXREZWZhdWx0TUVDb21wYXJhdG9yKCkgewotCQlpZiAoZGVmYXVsdE1FQ29tcGFyYXRvciA9PSBudWxsKQotCQkJZGVmYXVsdE1FQ29tcGFyYXRvciA9IG5ldyBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpOwotCQlyZXR1cm4gZGVmYXVsdE1FQ29tcGFyYXRvcjsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZXhjbHVkZVF1ZXJ5TWV0aG9kcyhMaXN0IHJlc3VsdCwgTGlzdCBzb21lUXVlcmllcykgewotCQlpZiAoc29tZVF1ZXJpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlpbnQgc2l6ZSA9IHNvbWVRdWVyaWVzLnNpemUoKTsKLQkJTGlzdCBtZXRob2RzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJUXVlcnkgcXVlcnkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcXVlcnkgPSAoUXVlcnkpIHNvbWVRdWVyaWVzLmdldChpKTsKLQkJCW1ldGhvZHMuYWRkKHF1ZXJ5LmdldFF1ZXJ5TWV0aG9kKCkpOwotCQl9Ci0JCWV4Y2x1ZGVNZXRob2RFbGVtZW50cyhyZXN1bHQsIG1ldGhvZHMpOwotCX0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVTZWxlY3RRdWVyeU1ldGhvZHNFeGNsdWRpbmdFeGlzdGluZyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlpZiAoY21wID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCByZXN1bHQgPSBjbXAuZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCk7Ci0JCUxpc3QgZXhpc3RpbmcgPSBjbXAuZ2V0UXVlcmllcygpOwotCQlleGNsdWRlUXVlcnlNZXRob2RzKHJlc3VsdCwgZXhpc3RpbmcpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVGaW5kUXVlcnlNZXRob2RzRXhjbHVkaW5nRXhpc3RpbmcoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJaWYgKGNtcCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgcmVzdWx0ID0gY21wLmdldEF2YWlsYWJsZUZpbmRRdWVyeU1ldGhvZHMoKTsKLQkJTGlzdCBleGlzdGluZyA9IGNtcC5nZXRRdWVyaWVzKCk7Ci0JCWV4Y2x1ZGVRdWVyeU1ldGhvZHMocmVzdWx0LCBleGlzdGluZyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBMaXN0IGdldEV4aXN0aW5nT3JBdmFpbGFibGVUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKEVPYmplY3Qgb2JqZWN0LCBFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZU1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhiZWFuKSk7Ci0JCXVuaW9uTWV0aG9kRWxlbWVudHMocmVzdWx0LCBnZXRFeGlzdGluZ01ldGhvZEVsZW1lbnRzKG9iamVjdCwgYmVhbikpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgZ2V0RGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IgZ2V0RGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCkgewotCQlpZiAoZGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yID09IG51bGwpCi0JCQlkZWZhdWx0TWV0aG9kRWxlbWVudENvbXBhcmF0b3IgPSBuZXcgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKTsKLQkJcmV0dXJuIGRlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvcjsKLQl9Ci0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdNZXRob2RFbGVtZW50cyhFT2JqZWN0IHJlZk9iamVjdCwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAocmVmT2JqZWN0ICE9IG51bGwpIHsKLQkJCUVqYlBhY2thZ2UgcGFjayA9IGdldEVqYlBhY2thZ2UoKTsKLQkJCWlmIChyZWZPYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRNZXRob2RUcmFuc2FjdGlvbigpKQotCQkJCXJldHVybiAoKE1ldGhvZFRyYW5zYWN0aW9uKSByZWZPYmplY3QpLmdldE1ldGhvZEVsZW1lbnRzKGJlYW4pOwotCQkJaWYgKHJlZk9iamVjdC5lQ2xhc3MoKSA9PSBwYWNrLmdldE1ldGhvZFBlcm1pc3Npb24oKSkKLQkJCQlyZXR1cm4gKChNZXRob2RQZXJtaXNzaW9uKSByZWZPYmplY3QpLmdldE1ldGhvZEVsZW1lbnRzKGJlYW4pOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCB1bmlvbk1ldGhvZEVsZW1lbnRzKExpc3Qgc291cmNlTWV0aG9kRWxlbWVudHMsIExpc3QgYWRkaXRpb25hbE1ldGhvZEVsZW1lbnRzKSB7Ci0JCU1ldGhvZEVsZW1lbnQgc291cmNlTUUsIGFkZGl0aW9uYWxNRTsKLQkJaW50IHNvdXJjZVNpemUsIGFkZFNpemU7Ci0JCXNvdXJjZVNpemUgPSBzb3VyY2VNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCWFkZFNpemUgPSBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlMaXN0IGZvdW5kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KGFkZFNpemUpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkU2l6ZTsgaSsrKSB7Ci0JCQlmb3VuZCA9IGZhbHNlOwotCQkJYWRkaXRpb25hbE1FID0gKE1ldGhvZEVsZW1lbnQpIGFkZGl0aW9uYWxNZXRob2RFbGVtZW50cy5nZXQoaSk7Ci0JCQlzb3VyY2VNRSA9IG51bGw7Ci0JCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgc291cmNlU2l6ZTsgaWkrKykgewotCQkJCXNvdXJjZU1FID0gKE1ldGhvZEVsZW1lbnQpIHNvdXJjZU1ldGhvZEVsZW1lbnRzLmdldChpaSk7Ci0JCQkJaWYgKHNvdXJjZU1FLmlzRXF1aXZhbGVudChhZGRpdGlvbmFsTUUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKQotCQkJCWZvdW5kRWxlbWVudHMuYWRkKHNvdXJjZU1FKTsKLQkJfQotCQlzb3VyY2VNZXRob2RFbGVtZW50cy5yZW1vdmVBbGwoZm91bmRFbGVtZW50cyk7Ci0JCXNvdXJjZU1ldGhvZEVsZW1lbnRzLmFkZEFsbChhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpOwotCX0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWx0ZXJlZE1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChiZWFuLmlzRW50aXR5KCkpIHsKLQkJCWlmIChiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJlZE1ldGhvZHMgPSBiZWFuLmdldFJlbW90ZUludGVyZmFjZSgpLmdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIGdldEVudGl0eU1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRNZXRob2RzKChFbnRpdHkpIGJlYW4sIFJFTU9URV9NRVRIT0RTKSk7Ci0JCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVNZXRob2RFbGVtZW50cyhnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhmaWx0ZXJlZE1ldGhvZHMpLCBNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCwgYmVhbikpOwotCQkJfQotCQkJaWYgKGJlYW4uZ2V0SG9tZUludGVyZmFjZSgpICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJlZE1ldGhvZHMgPSBiZWFuLmdldEhvbWVJbnRlcmZhY2UoKS5nZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBnZXRFbnRpdHlNZXRob2RUcmFuc2FjdGlvbkV4Y2x1ZGVkTWV0aG9kcygoRW50aXR5KSBiZWFuLCBIT01FX01FVEhPRFMpKTsKLQkJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGZpbHRlcmVkTWV0aG9kcyksIE1ldGhvZEVsZW1lbnRLaW5kLkhPTUVfTElURVJBTCwgYmVhbikpOwotCQkJfQotCQkJaWYgKGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKSAhPSBudWxsKSB7Ci0JCQkJZmlsdGVyZWRNZXRob2RzID0gYmVhbi5nZXRMb2NhbEludGVyZmFjZSgpLmdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIGdldEVudGl0eU1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRNZXRob2RzKChFbnRpdHkpIGJlYW4sIExPQ0FMX01FVEhPRFMpKTsKLQkJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGZpbHRlcmVkTWV0aG9kcyksIE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwsIGJlYW4pKTsKLQkJCX0KLQkJCWlmIChiZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldEF2YWlsYWJsZUxvY2FsSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMoKSk7Ci0JCX0gZWxzZSBpZiAoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJaWYgKGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkgIT0gbnVsbCkgewotCQkJCWZpbHRlcmVkTWV0aG9kcyA9IGJlYW4uZ2V0UmVtb3RlSW50ZXJmYWNlKCkuZ2V0TWV0aG9kc0V4dGVuZGVkV2l0aEZpbHRlcnMoZ2V0U2Vzc2lvbk1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRDbGFzc2VzKChTZXNzaW9uKSBiZWFuLCBSRU1PVEVfTUVUSE9EUyksIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTWV0aG9kRWxlbWVudHMoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoZmlsdGVyZWRNZXRob2RzKSwgTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFX0xJVEVSQUwsIGJlYW4pKTsKLQkJCX0KLQkJCWlmIChiZWFuLmdldExvY2FsSW50ZXJmYWNlKCkgIT0gbnVsbCkgewotCQkJCWZpbHRlcmVkTWV0aG9kcyA9IGJlYW4uZ2V0TG9jYWxJbnRlcmZhY2UoKS5nZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhnZXRTZXNzaW9uTWV0aG9kVHJhbnNhY3Rpb25FeGNsdWRlZENsYXNzZXMoKFNlc3Npb24pIGJlYW4sIExPQ0FMX01FVEhPRFMpLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGZpbHRlcmVkTWV0aG9kcyksIE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwsIGJlYW4pKTsKLQkJCX0KLQkJCXJlc3VsdC5hZGQoYmVhbi5nZXRBdmFpbGFibGVVbnNwZWNpZmllZE1ldGhvZEVsZW1lbnRzKCkuZ2V0KDApKTsKLQkJfSBlbHNlIGlmIChiZWFuLmlzTWVzc2FnZURyaXZlbigpKSB7Ci0JCQlmaWx0ZXJlZE1ldGhvZHMgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXtnZXRNZXRob2QoYmVhbi5nZXRFamJDbGFzcygpLCBnZXRNREJNZXRob2RfU2lnKCkpfSk7Ci0JCQlyZXN1bHQuYWRkQWxsKGJlYW4uY3JlYXRlTWV0aG9kRWxlbWVudHMoZmlsdGVyZWRNZXRob2RzLCBiZWFuLmdldEVqYkNsYXNzKCkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhMaXN0IG1ldGhvZHMpIHsKLQkJTGlzdCBzaWduYXR1cmVzLCBzYW1lTmFtZXM7Ci0JCXNhbWVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2lnbmF0dXJlcyA9IG5ldyBBcnJheUxpc3QobWV0aG9kcy5zaXplKCkgKyAxKTsKLQkJc2lnbmF0dXJlcy5hZGQoREVGQVVMVF9NRVRIT0RfTkFNRSk7Ci0JCUl0ZXJhdG9yIGl0ID0gbWV0aG9kcy5pdGVyYXRvcigpOwotCQlNZXRob2QgYU1ldGhvZDsKLQkJU3RyaW5nIG1ldGhvZE5hbWU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWFNZXRob2QgPSAoTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQltZXRob2ROYW1lID0gYU1ldGhvZC5nZXROYW1lKCk7Ci0JCQlpZiAoc2FtZU5hbWVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKSB7Ci0JCQkJaWYgKCFzaWduYXR1cmVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKQotCQkJCQlzaWduYXR1cmVzLmFkZChtZXRob2ROYW1lKTsKLQkJCX0gZWxzZQotCQkJCXNhbWVOYW1lcy5hZGQobWV0aG9kTmFtZSk7Ci0JCQlzaWduYXR1cmVzLmFkZChhTWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChzaWduYXR1cmVzKTsKLQkJcmV0dXJuIHNpZ25hdHVyZXM7Ci0JfQotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRzKExpc3Qgc2lnbmF0dXJlcywgRW51bWVyYXRvciBhVHlwZSwgRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudHMoTUVUSE9EX0VMRU1FTlRfTkFNRSwgc2lnbmF0dXJlcywgYVR5cGUsIGJlYW4pOwotCX0KLQlwcm90ZWN0ZWQgRWpiUGFja2FnZSBnZXRFamJQYWNrYWdlKCkgewotCQlyZXR1cm4gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCX0KLQlwcm90ZWN0ZWQgRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCkgewotCQlyZXR1cm4gKChFamJQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpKS5nZXRFamJGYWN0b3J5KCk7Ci0JfQotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRzKFN0cmluZyBtZVR5cGVOYW1lLCBMaXN0IHNpZ25hdHVyZXMsIEVudW1lcmF0b3IgYVR5cGUsIEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJaW50IHNpemUgPSBzaWduYXR1cmVzLnNpemUoKTsKLQkJTGlzdCBtZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCVN0cmluZyBzaWduYXR1cmU7Ci0JCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzaWduYXR1cmUgPSAoU3RyaW5nKSBzaWduYXR1cmVzLmdldChpKTsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIGdldEVqYkZhY3RvcnkoKS5jcmVhdGUoKEVDbGFzcykgZ2V0RWpiUGFja2FnZSgpLmdldEVDbGFzc2lmaWVyKG1lVHlwZU5hbWUpKTsKLQkJCW1lLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZSk7Ci0JCQltZS5zZXRFbnRlcnByaXNlQmVhbihiZWFuKTsKLQkJCW1lLnNldFR5cGUoKE1ldGhvZEVsZW1lbnRLaW5kKSBhVHlwZSk7Ci0JCQltZXRob2RFbGVtZW50cy5hZGQobWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50czsKLQl9Ci0JcHJvdGVjdGVkIExpc3QgZ2V0RW50aXR5TWV0aG9kVHJhbnNhY3Rpb25FeGNsdWRlZE1ldGhvZHMoRW50aXR5IGVudGl0eSwgaW50IHR5cGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSAoUkVNT1RFX01FVEhPRFMpIDoKLQkJCQl7Ci0JCQkJCUphdmFDbGFzcyBhQ2xhc3MgPSBnZXRFSkJPYmplY3RDbGFzcyhlbnRpdHkpOwotCQkJCQlhQ2xhc3MuZ2V0Q2xhc3NJbXBvcnQoKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChleGNsdWRlTWV0aG9kcyhhQ2xhc3MsIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtde2dldE1ldGhvZChhQ2xhc3MsIGdldFJlbW90ZVJlbW92ZU1ldGhvZF9TaWcoKSl9KSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQljYXNlIChIT01FX01FVEhPRFMpIDoKLQkJCQl7Ci0JCQkJCUphdmFDbGFzcyBhQ2xhc3MgPSBnZXRFSkJIb21lQ2xhc3MoZW50aXR5KTsKLQkJCQkJYUNsYXNzLmdldENsYXNzSW1wb3J0KCk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117Z2V0TWV0aG9kKGFDbGFzcywgZ2V0RWpiR2V0TWV0YURhdGFNZXRob2RfU2lnKCkpLCBnZXRNZXRob2QoYUNsYXNzLCBnZXRFamJHZXRIb21lSGFuZGxlTWV0aG9kX1NpZygpKX0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJY2FzZSAoTE9DQUxfTUVUSE9EUykgOgotCQkJCXsKLQkJCQkJSmF2YUNsYXNzIGFDbGFzcyA9IGdldEVKQkxvY2FsT2JqZWN0Q2xhc3MoZW50aXR5KTsKLQkJCQkJYUNsYXNzLmdldENsYXNzSW1wb3J0KCk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZXhjbHVkZU1ldGhvZHMoYUNsYXNzLCBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXtnZXRNZXRob2QoYUNsYXNzLCBnZXRMb2NhbFJlbW92ZU1ldGhvZF9TaWcoKSl9KSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIExpc3QgZ2V0U2Vzc2lvbk1ldGhvZFRyYW5zYWN0aW9uRXhjbHVkZWRDbGFzc2VzKFNlc3Npb24gc2Vzc2lvbiwgaW50IHR5cGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGFsbEludGVyZmFjZXM7Ci0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSAoUkVNT1RFX01FVEhPRFMpIDoKLQkJCQl7Ci0JCQkJCWNsYXNzTmFtZSA9IGdldEVKQk9iamVjdENsYXNzTmFtZSgpOwotCQkJCQlhbGxJbnRlcmZhY2VzID0gc2Vzc2lvbi5nZXRSZW1vdGVJbnRlcmZhY2UoKS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLnRvQXJyYXkoKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChnZXRJbnRlcmZhY2VzKGFsbEludGVyZmFjZXMsIGNsYXNzTmFtZSkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQljYXNlIChMT0NBTF9NRVRIT0RTKSA6Ci0JCQkJewotCQkJCQljbGFzc05hbWUgPSBnZXRFSkJMb2NhbE9iamVjdENsYXNzTmFtZSgpOwotCQkJCQlhbGxJbnRlcmZhY2VzID0gc2Vzc2lvbi5nZXRMb2NhbEludGVyZmFjZSgpLmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkudG9BcnJheSgpOwotCQkJCQlyZXN1bHQuYWRkQWxsKGdldEludGVyZmFjZXMoYWxsSW50ZXJmYWNlcywgY2xhc3NOYW1lKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgTGlzdCBleGNsdWRlTWV0aG9kcyhKYXZhQ2xhc3MgYUNsYXNzLCBMaXN0IG1ldGhvZHMpIHsKLQkJTGlzdCBjdXJyZW50TWV0aG9kcyA9IGFDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCUxpc3QgcmVzdWx0TWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50TWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJaWYgKCFtZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2RzLmdldChpKSkpCi0JCQkJcmVzdWx0TWV0aG9kcy5hZGQoY3VycmVudE1ldGhvZHMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0TWV0aG9kczsKLQl9Ci0JcHJvdGVjdGVkIE1ldGhvZCBnZXRNZXRob2QoSmF2YUNsYXNzIGFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJTGlzdCBjdXJyZW50TWV0aG9kcyA9IGFDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudE1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBjdXJyZW50TWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kTmFtZS5lcXVhbHMobWV0aG9kLmdldFNpZ25hdHVyZSgpKSkKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgTWV0aG9kIGdldE1ldGhvZFVzaW5nTWV0aG9kU2lnKEphdmFDbGFzcyBhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCUxpc3QgY3VycmVudE1ldGhvZHMgPSBhQ2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgY3VycmVudE1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZE5hbWUuZXF1YWxzKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkpCi0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIExpc3QgZ2V0SW50ZXJmYWNlcyhPYmplY3RbXSBpbnRlcmZhY2VzLCBTdHJpbmcgYUVqYk9iamVjdENsYXNzTmFtZSkgewotCQlMaXN0IGV4dHJhY3RlZEludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCgoSmF2YUNsYXNzKSBpbnRlcmZhY2VzW2ldKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGFFamJPYmplY3RDbGFzc05hbWUpKQotCQkJCWV4dHJhY3RlZEludGVyZmFjZXMuYWRkKGludGVyZmFjZXNbaV0pOwotCQl9Ci0JCXJldHVybiBleHRyYWN0ZWRJbnRlcmZhY2VzOwotCX0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50c0V4Y2x1ZGluZ0V4aXN0aW5nKEVudGVycHJpc2VCZWFuIGVqYiwgTGlzdCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgRVJlZmVyZW5jZSBtZXRob2RFbGVtZW50UmVmZXJlbmNlLCBpbnQgdXNhZ2VGbGFnKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50c0V4Y2x1ZGluZ0V4aXN0aW5nKGVqYiwgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UsIGdldERlZmF1bHRNRUNvbXBhcmF0b3IoKSwgdXNhZ2VGbGFnKTsKLQl9Ci0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhFbnRlcnByaXNlQmVhbiBlamIsIExpc3Qgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIEVSZWZlcmVuY2UgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHNFeGNsdWRpbmdFeGlzdGluZyhlamIsIHNvbWVNZXRob2RFbGVtZW50T3duZXJzLCBtZXRob2RFbGVtZW50UmVmZXJlbmNlLCBnZXREZWZhdWx0TUVDb21wYXJhdG9yKCkpOwotCX0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50c0V4Y2x1ZGluZ0V4aXN0aW5nKEVudGVycHJpc2VCZWFuIGVqYiwgTGlzdCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgRVJlZmVyZW5jZSBtZXRob2RFbGVtZW50UmVmZXJlbmNlLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzRXhjbHVkaW5nRXhpc3RpbmcoZWpiLCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSwgY29tcGFyYXRvciwgQUxMX01FVEhPRFMpOwotCX0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ01ldGhvZEVsZW1lbnRzKExpc3Qgc29tZU1ldGhvZEVsZW1lbnRPd25lcnMsIEVSZWZlcmVuY2UgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSkgewotCQlpZiAoc29tZU1ldGhvZEVsZW1lbnRPd25lcnMgPT0gbnVsbCB8fCBzb21lTWV0aG9kRWxlbWVudE93bmVycy5pc0VtcHR5KCkgfHwgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSA9PSBudWxsIHx8ICFtZXRob2RFbGVtZW50UmVmZXJlbmNlLmlzTWFueSgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc2l6ZSA9IHNvbWVNZXRob2RFbGVtZW50T3duZXJzLnNpemUoKTsKLQkJRU9iamVjdCBvd25lciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlvd25lciA9IChFT2JqZWN0KSBzb21lTWV0aG9kRWxlbWVudE93bmVycy5nZXQoaSk7Ci0JCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvd25lci5lR2V0KG1ldGhvZEVsZW1lbnRSZWZlcmVuY2UpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50c0V4Y2x1ZGluZ0V4aXN0aW5nKEVudGVycHJpc2VCZWFuIGVqYiwgTGlzdCBzb21lTWV0aG9kRWxlbWVudE93bmVycywgRVJlZmVyZW5jZSBtZXRob2RFbGVtZW50UmVmZXJlbmNlLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IsIGludCB1c2FnZUZsYWcpIHsKLQkJaWYgKGVqYiA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIHNob3dIb21lcyA9IHVzYWdlRmxhZyA9PSBBTExfTUVUSE9EUyB8fCB1c2FnZUZsYWcgPT0gSE9NRV9NRVRIT0RTOwotCQlib29sZWFuIHNob3dDbGllbnRzID0gdXNhZ2VGbGFnID09IEFMTF9NRVRIT0RTIHx8IHVzYWdlRmxhZyA9PSBDTElFTlRfTUVUSE9EUzsKLQkJaWYgKHNob3dIb21lcykKLQkJCXJlc3VsdC5hZGRBbGwoZWpiLmdldEF2YWlsYWJsZUhvbWVNZXRob2RFbGVtZW50cygpKTsKLQkJaWYgKHNob3dDbGllbnRzKQotCQkJcmVzdWx0LmFkZEFsbChlamIuZ2V0QXZhaWxhYmxlUmVtb3RlTWV0aG9kRWxlbWVudHMoKSk7Ci0JCWlmIChzaG93SG9tZXMpCi0JCQlyZXN1bHQuYWRkQWxsKGVqYi5nZXRBdmFpbGFibGVMb2NhbEhvbWVNZXRob2RFbGVtZW50cygpKTsKLQkJaWYgKHNob3dDbGllbnRzKQotCQkJcmVzdWx0LmFkZEFsbChlamIuZ2V0QXZhaWxhYmxlTG9jYWxNZXRob2RFbGVtZW50cygpKTsKLQkJcmVzdWx0LmFkZEFsbChlamIuZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpKTsKLQkJZXhjbHVkZU1ldGhvZEVsZW1lbnRzKHJlc3VsdCwgZ2V0RXhpc3RpbmdNZXRob2RFbGVtZW50cyhzb21lTWV0aG9kRWxlbWVudE93bmVycywgbWV0aG9kRWxlbWVudFJlZmVyZW5jZSkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgY29tcGFyYXRvcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGV4Y2x1ZGVNZXRob2RFbGVtZW50cyhMaXN0IHNvdXJjZU1ldGhvZEVsZW1lbnRzLCBMaXN0IGV4aXN0aW5nTWV0aG9kRWxlbWVudHMpIHsKLQkJTWV0aG9kRWxlbWVudCBzb3VyY2VNRSwgZXhpc3RpbmdNRTsKLQkJaW50IHNvdXJjZVNpemUsIGV4aXN0aW5nU2l6ZTsKLQkJc291cmNlU2l6ZSA9IHNvdXJjZU1ldGhvZEVsZW1lbnRzLnNpemUoKTsKLQkJZXhpc3RpbmdTaXplID0gZXhpc3RpbmdNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCUxpc3QgZm91bmRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZXhpc3RpbmdTaXplKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4aXN0aW5nU2l6ZTsgaSsrKSB7Ci0JCQlmb3VuZCA9IGZhbHNlOwotCQkJZXhpc3RpbmdNRSA9IChNZXRob2RFbGVtZW50KSBleGlzdGluZ01ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCXNvdXJjZU1FID0gbnVsbDsKLQkJCWZvciAoaW50IGlpID0gMDsgaWkgPCBzb3VyY2VTaXplOyBpaSsrKSB7Ci0JCQkJc291cmNlTUUgPSAoTWV0aG9kRWxlbWVudCkgc291cmNlTWV0aG9kRWxlbWVudHMuZ2V0KGlpKTsKLQkJCQlpZiAoZXhpc3RpbmdNRSAhPSBudWxsICYmIGV4aXN0aW5nTUUuZ2V0TmFtZSgpICE9IG51bGwgJiYgc291cmNlTUUuZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKGV4aXN0aW5nTUUuZ2V0U2lnbmF0dXJlKCkpICYmIHNvdXJjZU1FLmdldFR5cGVKYXZhQ2xhc3MoKSA9PSBleGlzdGluZ01FLmdldFR5cGVKYXZhQ2xhc3MoKSkgewotCQkJCQlpZiAoc291cmNlTUUuZ2V0VHlwZUphdmFDbGFzcygpICE9IG51bGwpIHsgLy9pdCByZXR1cm5zCi0JCQkJCQkvLyBudWxsIGlmIHRoZQotCQkJCQkJLy8gbWV0aG9kIGlzICoKLQkJCQkJCS8vIGFuZCBpdCBpcyBub3QKLQkJCQkJCS8vIGEgbWVzc2FnZQotCQkJCQkJLy8gYmVhbgotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoc291cmNlTUUuZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRFamJDbGFzcygpID09IGV4aXN0aW5nTUUuZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRFamJDbGFzcygpKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCkKLQkJCQlmb3VuZEVsZW1lbnRzLmFkZChzb3VyY2VNRSk7Ci0JCX0KLQkJc291cmNlTWV0aG9kRWxlbWVudHMucmVtb3ZlQWxsKGZvdW5kRWxlbWVudHMpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRFamJHZXRIb21lSGFuZGxlTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJQdWJsaWMgYWJzdHJhY3QgamF2YXguZWpiLkhvbWVIYW5kbGUgamF2YXguZWpiLkVKQkhvbWUuZ2V0SG9tZUhhbmRsZSgpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24iOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldEVqYkdldE1ldGFEYXRhTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJQdWJsaWMgYWJzdHJhY3QgamF2YXguZWpiLkVKQk1ldGFEYXRhIGphdmF4LmVqYi5FSkJIb21lLmdldEVKQk1ldGFEYXRhKCkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVtb3RlUmVtb3ZlTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJQdWJsaWMgYWJzdHJhY3Qgdm9pZCBqYXZheC5lamIuRUpCT2JqZWN0LnJlbW92ZSgpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24samF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiI7IC8vbm9uLW5scyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldExvY2FsUmVtb3ZlTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJQdWJsaWMgYWJzdHJhY3Qgdm9pZCBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QucmVtb3ZlKCkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbixqYXZheC5lamIuUmVtb3ZlRXhjZXB0aW9uIjsgLy9ub24tbmxzIC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0TURCTWV0aG9kX1NpZygpIHsKLQkJcmV0dXJuICJwdWJsaWMgdm9pZCBvbk1lc3NhZ2UoamF2YXguam1zLk1lc3NhZ2UgbXNnKSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0RUpCT2JqZWN0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gImphdmF4LmVqYi5FSkJPYmplY3QiOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldEVKQkxvY2FsT2JqZWN0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gImphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBKYXZhQ2xhc3MgZ2V0RUpCT2JqZWN0Q2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlSZXNvdXJjZSByZXMgPSBiZWFuLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZVNldCBzZXQgPSByZXMgIT0gbnVsbCA/IHJlcy5nZXRSZXNvdXJjZVNldCgpIDogbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YXguZWpiIiwgIkVKQk9iamVjdCIsIHNldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwcml2YXRlIEphdmFDbGFzcyBnZXRFSkJMb2NhbE9iamVjdENsYXNzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJUmVzb3VyY2UgcmVzID0gYmVhbi5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gcmVzICE9IG51bGwgPyByZXMuZ2V0UmVzb3VyY2VTZXQoKSA6IG51bGw7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmF4LmVqYiIsICJFSkJMb2NhbE9iamVjdCIsIHNldCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwcml2YXRlIEphdmFDbGFzcyBnZXRFSkJIb21lQ2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlSZXNvdXJjZSByZXMgPSBiZWFuLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZVNldCBzZXQgPSByZXMgIT0gbnVsbCA/IHJlcy5nZXRSZXNvdXJjZVNldCgpIDogbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiamF2YXguZWpiIiwgIkVKQkhvbWUiLCBzZXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VqYlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3ZGQ3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRWpiUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotcHVibGljIGludGVyZmFjZSBFamJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiZWpiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1IgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfVFJBTlNBQ1RJT04gPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU4gPSA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19JQ09OUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19SRVNPVVJDRV9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19SRVNPVVJDRV9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0VKQl9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FSkJfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfRU5WX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0xPQ0FMX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9MT0NBTF9SRUZTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX1NFUlZJQ0VfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fU0VSVklDRV9SRUZTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fTkFNRSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUiA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9JREVOVElUWSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19MT0NBTF9IT01FX0lOVEVSRkFDRSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnRlcnByaXNlIEJlYW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZID0gNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9fSUNPTlMgPSBFTlRFUlBSSVNFX0JFQU5fX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9fRElTUExBWV9OQU1FUyA9IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9fREVTQ1JJUFRJT05TID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19TTUFMTF9JQ09OID0gRU5URVJQUklTRV9CRUFOX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0xBUkdFX0lDT04gPSBFTlRFUlBSSVNFX0JFQU5fX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fREVTQ1JJUFRJT04gPSBFTlRFUlBSSVNFX0JFQU5fX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0RJU1BMQVlfTkFNRSA9IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0VOVklST05NRU5UX1BST1BFUlRJRVMgPSBFTlRFUlBSSVNFX0JFQU5fX0VOVklST05NRU5UX1BST1BFUlRJRVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fUkVTT1VSQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19FSkJfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0VKQl9MT0NBTF9SRUZTID0gRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRU5USVRZX19TRVJWSUNFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1NFUlZJQ0VfUkVGUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX05BTUUgPSBFTlRFUlBSSVNFX0JFQU5fX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fU0VDVVJJVFlfUk9MRV9SRUZTID0gRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fRUpCX0NMQVNTID0gRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1M7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX1JFTU9URV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fRUpCX0pBUiA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRU5USVRZX19TRUNVUklUWV9JREVOVElUWSA9IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVOVElUWV9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX0xPQ0FMX0lOVEVSRkFDRSA9IEVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWVudHJhbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTlRJVFlfX1JFRU5UUkFOVCA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFTlRJVFlfX1BSSU1BUllfS0VZID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVOVElUWV9GRUFUVVJFX0NPVU5UID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0lDT05TID0gRU5USVRZX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RJU1BMQVlfTkFNRVMgPSBFTlRJVFlfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RFU0NSSVBUSU9OUyA9IEVOVElUWV9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU01BTExfSUNPTiA9IEVOVElUWV9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MQVJHRV9JQ09OID0gRU5USVRZX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RFU0NSSVBUSU9OID0gRU5USVRZX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ESVNQTEFZX05BTUUgPSBFTlRJVFlfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTID0gRU5USVRZX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFU09VUkNFX1JFRlMgPSBFTlRJVFlfX1JFU09VUkNFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX1JFRlMgPSBFTlRJVFlfX0VKQl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFU09VUkNFX0VOVl9SRUZTID0gRU5USVRZX19SRVNPVVJDRV9FTlZfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfTE9DQUxfUkVGUyA9IEVOVElUWV9fRUpCX0xPQ0FMX1JFRlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBFTlRJVFlfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VSVklDRV9SRUZTID0gRU5USVRZX19TRVJWSUNFX1JFRlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19OQU1FID0gRU5USVRZX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IEVOVElUWV9fU0VDVVJJVFlfUk9MRV9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9DTEFTUyA9IEVOVElUWV9fRUpCX0NMQVNTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0hPTUVfSU5URVJGQUNFID0gRU5USVRZX19IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRU1PVEVfSU5URVJGQUNFID0gRU5USVRZX19SRU1PVEVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9KQVIgPSBFTlRJVFlfX0VKQl9KQVI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VDVVJJVFlfSURFTlRJVFkgPSBFTlRJVFlfX1NFQ1VSSVRZX0lERU5USVRZOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xPQ0FMX0hPTUVfSU5URVJGQUNFID0gRU5USVRZX19MT0NBTF9IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MT0NBTF9JTlRFUkZBQ0UgPSBFTlRJVFlfX0xPQ0FMX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVlbnRyYW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRUVOVFJBTlQgPSBFTlRJVFlfX1JFRU5UUkFOVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1BUllfS0VZID0gRU5USVRZX19QUklNQVJZX0tFWTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0FCU1RSQUNUX1NDSEVNQV9OQU1FID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BFUlNJU1RFTlRfQVRUUklCVVRFUyA9IEVOVElUWV9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUyA9IEVOVElUWV9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DTVAgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEUgPSBFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbSBLZXkgRmllbGQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1fS0VZX0ZJRUxEID0gRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db250YWluZXIgTWFuYWdlZCBFbnRpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBFTlRJVFlfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRCA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BFUk1JU1NJT05fRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUyA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUyA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NFTUJMWV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTiA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT05TID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWV0aG9kIFRyYW5zYWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9UUkFOU0FDVElPTl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVBfQVRUUklCVVRFID0gMTA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENNUl9GSUVMRCA9IDE2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEUgPSAxNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OID0gMTM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFMgPSAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUiA9IDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfU09VUkNFID0gMTU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZID0gMTI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX01FVEhPRCA9IDIwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVCA9IDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0xVREVfTElTVCA9IDE5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OID0gNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fX0lDT05TID0gRU5URVJQUklTRV9CRUFOX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX19ESVNQTEFZX05BTUVTID0gRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9fREVTQ1JJUFRJT05TID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fU01BTExfSUNPTiA9IEVOVEVSUFJJU0VfQkVBTl9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fTEFSR0VfSUNPTiA9IEVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fREVTQ1JJUFRJT04gPSBFTlRFUlBSSVNFX0JFQU5fX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19ESVNQTEFZX05BTUUgPSBFTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA9IEVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fUkVTT1VSQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fRUpCX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19SRVNPVVJDRV9FTlZfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0VKQl9MT0NBTF9SRUZTID0gRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVNTSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fX1NFUlZJQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fU0VSVklDRV9SRUZTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX05BTUUgPSBFTlRFUlBSSVNFX0JFQU5fX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19FSkJfQ0xBU1MgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19SRU1PVEVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19SRU1PVEVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19FSkJfSkFSID0gRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX19TRUNVUklUWV9JREVOVElUWSA9IEVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX0xPQ0FMX0hPTUVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19MT0NBTF9IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9fTE9DQUxfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEUgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fX1NFU1NJT05fVFlQRSA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VTU0lPTl9GRUFUVVJFX0NPVU5UID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOID0gMTc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OID0gMTg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9NRVRIT0RfQ0FURUdPUlkgPSA3OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RUpCIE1ldGhvZCBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfTUVUSE9EX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9KQVJfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX0pBUl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9KQVJfX0VKQl9DTElFTlRfSkFSID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RUpCIEphcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX05BTUUgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fUEFSTVMgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fVFlQRSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTiA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU4gPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX01BTlkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fQ0hBTkdFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX1ZPTEFUSUxFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1ZPTEFUSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19UUkFOU0lFTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuc2V0dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19VTlNFVFRBQkxFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VOU0VUVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVyaXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0RFUklWRUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fREVSSVZFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgQ01QX0FUVFJJQlVURV9fSUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01QX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVBfQVRUUklCVVRFX19ERVNDUklQVElPTiA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUyA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DTVAgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENNUF9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQU19fRUpCX0pBUiA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUxBVElPTlNISVBTX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX19FSkJfUUwgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORyA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX19RVUVSWV9NRVRIT0QgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9fRU5USVRZID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX19ERVNDUklQVElPTlMgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5RdWVyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBRVUVSWV9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX19OQU1FID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVKQl9SRUxBVElPTl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ST0xFX05BTUUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEUgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlMgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfU09VUkNFX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJPTEVfU09VUkNFX19ST0xFID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUk9MRV9TT1VSQ0VfX0VOVElUWV9CRUFOID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU09VUkNFX19ERVNDUklQVElPTlMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Sb2xlIFNvdXJjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NPVVJDRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+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+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTVJfRklFTERfX0RFU0NSSVBUSU9OUyA9IENNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVJfRklFTERfX1JPTEUgPSBDTVBfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDTVJfRklFTERfX0NPTExFQ1RJT05fVFlQRSA9IENNUF9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DTVIgRmllbGQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ01SX0ZJRUxEX0ZFQVRVUkVfQ09VTlQgPSBDTVBfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fSUNPTlMgPSBFTlRFUlBSSVNFX0JFQU5fX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19ESVNQTEFZX05BTUVTID0gRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0RFU0NSSVBUSU9OUyA9IEVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19TTUFMTF9JQ09OID0gRU5URVJQUklTRV9CRUFOX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTEFSR0VfSUNPTiA9IEVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0RFU0NSSVBUSU9OID0gRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0RJU1BMQVlfTkFNRSA9IEVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA9IEVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1JFU09VUkNFX1JFRlMgPSBFTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FSkJfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19SRVNPVVJDRV9FTlZfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FSkJfTE9DQUxfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fRUpCX0xPQ0FMX1JFRlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1NFUlZJQ0VfUkVGUyA9IEVOVEVSUFJJU0VfQkVBTl9fU0VSVklDRV9SRUZTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19OQU1FID0gRU5URVJQUklTRV9CRUFOX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fU0VDVVJJVFlfUk9MRV9SRUZTID0gRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FSkJfQ0xBU1MgPSBFTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0hPTUVfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX1JFTU9URV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19FSkJfSkFSID0gRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fU0VDVVJJVFlfSURFTlRJVFkgPSBFTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0UgPSBFTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTE9DQUxfSU5URVJGQUNFID0gRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19UUkFOU0FDVElPTl9UWVBFID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9TRUxFQ1RPUiA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREUgPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTElOSyA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04gPSBFTlRFUlBSSVNFX0JFQU5fRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHID0gRU5URVJQUklTRV9CRUFOX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9ERVNUSU5BVElPTiA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdpbmcgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRSA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWVzc2FnZSBEcml2ZW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fRkVBVFVSRV9DT1VOVCA9IEVOVEVSUFJJU0VfQkVBTl9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19TVUJTQ1JJUFRJT05fRFVSQUJJTElUWSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWVzc2FnZSBEcml2ZW4gRGVzdGluYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVhDTFVERV9MSVNUX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9fTUVUSE9EX0VMRU1FTlRTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQ0xVREVfTElTVF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19QQVJNUyA9IE1FVEhPRF9FTEVNRU5UX19QQVJNUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX19UWVBFID0gTUVUSE9EX0VMRU1FTlRfX1RZUEU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fRU5URVJQUklTRV9CRUFOID0gTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFFVRVJZX01FVEhPRF9fREVTQ1JJUFRJT05TID0gTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBRVUVSWV9NRVRIT0RfX1FVRVJZID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUVVFUllfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCA8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFkgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEUgPSAyMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTVVMVElQTElDSVRZX0tJTkQgPSAzMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVUVVJOX1RZUEVfTUFQUElORyA9IDI5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9LSU5EID0gMjY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRSQU5TQUNUSU9OX1RZUEUgPSAyNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQUNLTk9XTEVER0VfTU9ERSA9IDI3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBERVNUSU5BVElPTl9UWVBFID0gMzA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNVQlNDUklQVElPTl9EVVJBQklMSVRZX0tJTkQgPSAyODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VTU0lPTl9UWVBFID0gMjU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiZWpiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVqYlBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2RQZXJtaXNzaW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQZXJtaXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGVybWlzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXNzZW1ibHlEZXNjcmlwdG9yIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RUcmFuc2FjdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0VqYkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpCi0JICogQHNlZSAjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXRob2RUcmFuc2FjdGlvbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fVHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFRyYW5zYWN0aW9uX01ldGhvZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb24jZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RUcmFuc2FjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVudGVycHJpc2VCZWFuIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFbnRlcnByaXNlQmVhbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4jZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZUJlYW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVudGVycHJpc2VCZWFuX05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9FamJDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9Ib21lSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9FamJKYXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlJZGVudGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRW50aXR5IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eSNpc1JlZW50cmFudCA8ZW0+UmVlbnRyYW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVlbnRyYW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eSNpc1JlZW50cmFudCgpCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbnRpdHlfUmVlbnRyYW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVudGl0eV9QcmltYXJ5S2V5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQWJzdHJhY3RTY2hlbWFOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9LZXlBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0UXVlcmllcyA8ZW0+UXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UXVlcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldFF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldENNUEF0dHJpYnV0ZSA8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldENNUEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9DTVBBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0UHJpbUtleUZpZWxkIDxlbT5QcmltIEtleSBGaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByaW0gS2V5IEZpZWxkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0UHJpbUtleUZpZWxkKCkKLQkgKiBAc2VlICNnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ByaW1LZXlGaWVsZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDTVBBdHRyaWJ1dGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENNUEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0Q01QQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIENNUkZpZWxkIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDTVJGaWVsZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDTVJGaWVsZF9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JvbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGUjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRUpCUmVsYXRpb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQlJlbGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVKQlJlbGF0aW9uX05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbiNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RUpCUmVsYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSZWxhdGlvbnNoaXBzIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwc19FamJKYXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwcyNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHMjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAc2VlICNnZXRSZWxhdGlvbnNoaXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJKYXIgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEVKQkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldEVKQkphcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RUpCSmFyX1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJvbGVTb3VyY2Ugb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFJvbGVTb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZVNvdXJjZV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlU291cmNlX1JvbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZVNvdXJjZV9FbnRpdHlCZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2UjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0Um9sZVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZVNvdXJjZV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUXVlcnkgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFF1ZXJ5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFF1ZXJ5X0VqYlFMKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFF1ZXJ5X1JldHVyblR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFF1ZXJ5X0VudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFF1ZXJ5X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBRdWVyeU1ldGhvZCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0UXVlcnlNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UXVlcnlNZXRob2RfUXVlcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZhdGlvbkNvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldENvbmZpZ1Byb3BlcnRpZXMgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25maWcgUHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldENvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2YXRpb25Db25maWdfQ29uZmlnUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfUGFybXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudCNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEV4Y2x1ZGVMaXN0IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRFeGNsdWRlTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeGNsdWRlTGlzdF9NZXRob2RFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0I2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0RXhjbHVkZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXNzaW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRTZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25fVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlc3Npb25fU2Vzc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0U2VydmljZUVuZHBvaW50IDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFNlcnZpY2VFbmRwb2ludCgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbl9TZXJ2aWNlRW5kcG9pbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWVzc2FnZURyaXZlbiBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TWVzc2FnZURyaXZlbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuX1RyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2VTZWxlY3RvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuX0Fja25vd2xlZGdlTW9kZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuX0Rlc3RpbmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldEFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCi0JICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlRGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRMaW5rKCkKLQkgKiBAc2VlICNnZXRNZXNzYWdlRHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuX0xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TWVzc2FnaW5nVHlwZSA8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldE1lc3NhZ2luZ1R5cGUoKQotCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnaW5nVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fQmVhbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFSkJNZXRob2RDYXRlZ29yeSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUpCTWV0aG9kQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBNdWx0aXBsaWNpdHlLaW5kIG9iamVjdAotCSAqLwotCUVFbnVtIGdldE11bHRpcGxpY2l0eUtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gUmV0dXJuVHlwZU1hcHBpbmcgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudEtpbmQgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0TWV0aG9kRWxlbWVudEtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVHJhbnNhY3Rpb25UeXBlIG9iamVjdAotCSAqLwotCUVFbnVtIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBY2tub3dsZWRnZU1vZGUgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIERlc3RpbmF0aW9uVHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXREZXN0aW5hdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2Vzc2lvblR5cGUgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0U2Vzc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpOwotCi19IC8vRWpiUGFja2FnZQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FbnRlcnByaXNlQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VudGVycHJpc2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzVkYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VudGVycHJpc2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBFbnRlcnByaXNlSmF2YUJlYW4gaXMgYSBjbGFzcy4gIEl0IGNhbiBoYXZlIGluc3RhbmNlcywgc29tZW9uZSBjb3VsZCB3cml0ZSBhbiBpbnN0YW5jZSBkb2N1bWVudCBjb250YWluaW5nIERlcGFydG1lbnRzIGFuZCBFbXBsb3llZXMuICBJdCBhbHNvIGhhcyBhdHRyaWJ1dGVzLCBvcGVyYXRpb25zLCBhbmQgYXNzb2NpYXRpb25zLiAgVGhlc2UgYXJlIGFjdHVhbGx5IGRlcml2ZWQvL2ZpbHRlcmVkIGZyb20gaXRzIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuICBGb3IgbWFwcGluZyBhbmQgYnJvd3NpbmcgcHVycG9zZXMsIHRob3VnaCwgeW91IHdvdWxkIGxpa2UgdGhlIEVKQiB0byBhcHBlYXIgYXMgYSBjbGFzcy4gIAotICogCi0gKiBJbiB0aGlzIGxpZ2h0LCBldmVuIFNlc3Npb24gQmVhbnMgY2FuIGhhdmUgYXNzb2NpYXRpb25zIGFuZCBwcm9wZXJ0aWVzIGltcGxlbWVudGVkIGJ5IHRoZWlyIGJlYW4uICBGb3IgZXhhbXBsZSwgaXQgd291bGQgYmUgbWVhbmluZ2Z1bCB0byBkZXNjcmliZSBhc3NvY2lhdGlvbnMgZnJvbSBhIFNlc3Npb24gdG8gdGhlIEVudGl0aWVzIHdoaWNoIGl0IHVzZXMgdG8gcGVyZm9ybSBpdHMgd29yay4KLSAqIEBleHRlbmRzIEVOYW1lZEVsZW1lbnQKLSAqCi0gKiovCi1wdWJsaWMgaW50ZXJmYWNlIEVudGVycHJpc2VCZWFuIGV4dGVuZHMgSk5ESUVudlJlZnNHcm91cCwgRU5hbWVkRWxlbWVudHsKLQotLyoqCi0gKiBDcmVhdGVzIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyB0aGF0IHJlcHJlc2VudCB0aGUKLSAqIE1ldGhvZHMgZnJvbSBAc29tZU1ldGhvZHMgcG9pbnRpbmcgdG8gdGhpcyBFSkIuICBJdCBpcwotICogYXNzdW1lZCB0aGF0IGFsbCBvZiB0aGUgbWV0aG9kcyBiZWxvbmcgdG8gQGFuSW50ZXJmYWNlLgotICovCi1MaXN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRzKExpc3Qgc29tZU1ldGhvZHMsIEphdmFDbGFzcyBhbkludGVyZmFjZSkgOwotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotICogdGhhdCByZXByZXNlbnQgYWxsIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50cyB0aGF0IGNhbiBiZSBjcmVhdGVkCi0gKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKiBAZGVwcmVjYXRlZCB1c2VkIGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMKLSAqLwotTGlzdCBnZXRBdmFpbGFibGVDb21tb25NZXRob2RFbGVtZW50cygpIDsKLQotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotICogdGhhdCByZXByZXNlbnQgYWxsIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50cyB0aGF0IGNhbiBiZSBjcmVhdGVkCi0gKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHNpZ25hdHVyZXMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogYW5kIGFyZSBjb21tb24gdG8gYm90aCB0aGUgSG9tZSBhbmQgUmVtb3RlIGludGVyZmFjZXMuCi0gKiBAZGVwcmVjYXRlZCB1c2VkIGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMKLSAqLwotTGlzdCBnZXRBdmFpbGFibGVDb21tb25NZXRob2RFbGVtZW50U2lnbmF0dXJlcygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHNpZ25hdHVyZXMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogYW5kIGFyZSBjb21tb24gdG8gYm90aCB0aGUgSG9tZSBhbmQgUmVtb3RlIGludGVyZmFjZXMuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogZm9yIHRoZSBIb21lIGludGVyZmFjZS4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkgOwotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotICogdGhhdCByZXByZXNlbnQgYWxsIHRoZSBwb3NzaWJsZSBNZXRob2RFbGVtZW50cyB0aGF0IGNhbiBiZSBjcmVhdGVkCi0gKiBmb3IgdGhlIExvY2FsIEhvbWUgaW50ZXJmYWNlLiAgVGhlc2UgTWV0aG9kRWxlbWVudHMgYXJlIG5vdCBjb250YWluZWQgYW5kIHdpbGwKLSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLSAqLwotTGlzdCBnZXRBdmFpbGFibGVMb2NhbEhvbWVNZXRob2RFbGVtZW50cygpIDsKLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotICogZm9yIHRoZSBMb2NhbCBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0gKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotICovCi1MaXN0IGdldEF2YWlsYWJsZUxvY2FsTWV0aG9kRWxlbWVudHMoKSA7Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgTGlzdCBvZiBuZXdseSBjcmVhdGVkIE1ldGhvZEVsZW1lbnRzCi0gKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLSAqIGZvciB0aGUgUmVtb3RlIGludGVyZmFjZS4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0gKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0gKi8KLUxpc3QgZ2V0QXZhaWxhYmxlUmVtb3RlTWV0aG9kRWxlbWVudHMoKSA7Ci0vKioKLSAqIFJldHVybiBhIExpc3Qgb2YgYWxsIGF2YWlsYWJsZSBNZXRob2RFbGVtZW50cyBmb3IgYWxsIHR5cGVzIGFzIHdlbGwgYXMgdGhlCi0gKiBleGlzdGluZyBNZXRob2RFbGVtZW50cyBmcm9tIHRoZSA8Y29kZT5yZWZPYmplY3Q8L2NvZGU+LiAgVGhlIHBhcmFtZXRlcgotICogd2lsbCBiZSBlaXRoZXIgYSBNZXRob2RUcmFuc2FjdGlvbiBvciBhIE1ldGhvZFBlcm1pc3Npb24uICBUaGUgTGlzdCB3aWxsIGJlCi0gKiBzb3J0ZWQgYmFzZWQgb24gdGhlIHBhc3NlZCBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcgotICovCi1wdWJsaWMgTGlzdCBnZXRFeGlzdGluZ09yQXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoRU9iamVjdCByZWZPYmplY3QsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgOwotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIGFsbCBhdmFpbGFibGUgTWV0aG9kRWxlbWVudHMgZm9yIGFsbCB0eXBlcyBhcyB3ZWxsIGFzIHRoZQotICogZXhpc3RpbmcgTWV0aG9kRWxlbWVudHMgZnJvbSB0aGUgPGNvZGU+cmVmT2JqZWN0PC9jb2RlPi4gIFRoZSBwYXJhbWV0ZXIKLSAqIHdpbGwgYmUgZWl0aGVyIGEgTWV0aG9kVHJhbnNhY3Rpb24gb3IgYSBNZXRob2RQZXJtaXNzaW9uLiAgVGhlIExpc3Qgd2lsbCBiZQotICogc29ydGVkIGJhc2VkIG9uIHRoZSBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcgotICovCi1wdWJsaWMgTGlzdCBnZXRFeGlzdGluZ09yQXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoRU9iamVjdCByZWZPYmplY3QpIDsKLXB1YmxpYyBTdHJpbmcgZ2V0RWpiQ2xhc3NOYW1lKCk7Ci0vKioKLSAqIFJldHVybiBhbiBFamJSZWYgY29udGFpbmVkIGJ5IHRoaXMgYmVhbiB3aGljaCBpcwotICogZXF1aXZhbGVudCB0byBAYW5FamJSZWYuCi0gKi8KLUVqYlJlZiBnZXRFcXVpdmFsZW50RWpiUmVmKEVqYlJlZiBhbkVqYlJlZikgOwotLyoqCi0gKiBNZXRob2QgZ2V0RXF1aXZhbGVudEVKQkxvY2FsUmVmLgotICogQHBhcmFtIGFuRWpiTG9jYWxSZWYKLSAqIEByZXR1cm4gRUpCTG9jYWxSZWYKLSAqLwotRUpCTG9jYWxSZWYgZ2V0RXF1aXZhbGVudEVKQkxvY2FsUmVmKEVKQkxvY2FsUmVmIGFuRWpiTG9jYWxSZWYpOwotCi1wdWJsaWMgU3RyaW5nIGdldEhvbWVJbnRlcmZhY2VOYW1lKCk7Ci1wdWJsaWMgTWV0aG9kW10gZ2V0SG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCk7Ci0vKioKLSAqIFJldHVybiBhbiBFamJSZWYgdGhhdCBpcyBwaHlzaWNhbGx5IGxpbmtlZCB0byBAYW5FSkIuCi0gKi8KLUVqYlJlZiBnZXRMaW5rZWRFSkJSZWZlcmVuY2UoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLS8qKgotICogUmV0dXJuIGFuIEVKQkxvY2FsUmVmIHRoYXQgaXMgcGh5c2ljYWxseSBsaW5rZWQgdG8gQGFuRUpCLgotICovCi1FSkJMb2NhbFJlZiBnZXRMaW5rZWRFSkJMb2NhbFJlZmVyZW5jZShFbnRlcnByaXNlQmVhbiBhbkVKQikgOwotcHVibGljIFN0cmluZyBnZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCk7Ci1wdWJsaWMgTWV0aG9kW10gZ2V0TG9jYWxIb21lTWV0aG9kc0ZvckRlcGxveW1lbnQoKTsKLXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJbnRlcmZhY2VOYW1lKCk7Ci1wdWJsaWMgU3RyaW5nIGdldFJlbW90ZUludGVyZmFjZU5hbWUoKTsKLXB1YmxpYyBNZXRob2RbXSBnZXRSZW1vdGVNZXRob2RzRm9yRGVwbG95bWVudCgpOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiBAYUphdmFDbGFzcyBhcyBlcXVhbCB0byB0aGUKLSAqIGhvbWUsIHJlbW90ZSwgYmVhbiBjbGFzcywgb3Iga2V5IGNsYXNzLgotICovCi1ib29sZWFuIGhhc0phdmFSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBlamIgaGFzIEJlYW5NYW5hZ2VkUGVyc2lzdGFuY2UuCi0gKi8KLWJvb2xlYW4gaXNCZWFuTWFuYWdlZEVudGl0eSgpIDsKLXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotcHVibGljIGJvb2xlYW4gaXNFbnRpdHkoKTsKLXB1YmxpYyBib29sZWFuIGlzTWVzc2FnZURyaXZlbigpOwotcHVibGljIGJvb2xlYW4gaXNTZXNzaW9uKCk7Ci0KLS8qKgotICogcmV0dXJucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgYmVhbiBpbiB0aGUgRUpCSmFyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCk7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSBVc2Uge0BsaW5rICNnZXRWZXJzaW9uSUQoKX0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHMKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV9YKCkgOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gVXNlIHtAbGluayAjZ2V0VmVyc2lvbklEKCl9Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfWCgpIDsKLQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIEVKQiBoYXMgYSBsb2NhbCBpbnRlcmZhY2UgYW5kIGEgbG9jYWwgaG9tZQotICogaW50ZXJmYWNlLgotICovCi1wdWJsaWMgYm9vbGVhbiBoYXNMb2NhbENsaWVudCgpOwotCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgRUpCIGhhcyBhIHJlbW90ZSBpbnRlcmZhY2UgYW5kIGEgaG9tZQotICogaW50ZXJmYWNlLgotICovCi1wdWJsaWMgYm9vbGVhbiBoYXNSZW1vdGVDbGllbnQoKTsKLQotLyoqCi0gKiBGaXggdGhlIHJvbGUtbGluayBvbiBhbnkgY29udGFpbmVkIHJvbGUgcmVmcwotICovCi1wdWJsaWMgdm9pZCByZVN5bmNTZWN1cml0eVJvbGVSZWYoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSk7Ci1wdWJsaWMgdm9pZCBzZXRFamJDbGFzc05hbWUoU3RyaW5nIGVqYkNsYXNzTmFtZSk7Ci1wdWJsaWMgdm9pZCBzZXRIb21lSW50ZXJmYWNlTmFtZShTdHJpbmcgaG9tZUludGVyZmFjZU5hbWUpOwotcHVibGljIHZvaWQgc2V0TG9jYWxIb21lSW50ZXJmYWNlTmFtZShTdHJpbmcgbG9jYWxIb21lSW50ZXJmYWNlTmFtZSk7Ci1wdWJsaWMgdm9pZCBzZXRMb2NhbEludGVyZmFjZU5hbWUoU3RyaW5nIGxvY2FsSW50ZXJmYWNlTmFtZSk7Ci1wdWJsaWMgdm9pZCBzZXRSZW1vdGVJbnRlcmZhY2VOYW1lKFN0cmluZyByZW1vdGVJbnRlcmZhY2VOYW1lKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0RW50ZXJwcmlzZUJlYW5fTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVJvbGVSZWZzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFamJDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RWpiQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVqYkNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RWpiQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEhvbWVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldEhvbWVJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEhvbWVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRIb21lSW50ZXJmYWNlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZW1vdGVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldFJlbW90ZUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVtb3RlSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVtb3RlSW50ZXJmYWNlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFamJKYXIgcmVmZXJlbmNlCi0JICovCi0JRUpCSmFyIGdldEVqYkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWpiSmFyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RWpiSmFyKEVKQkphciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZWN1cml0eUlkZW50aXR5IHJlZmVyZW5jZQotCSAqIFRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eQotCSAqIGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvcgotCSAqIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQKLQkgKiBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAqIHRvIGJlIHVzZWQuCi0JICovCi0JU2VjdXJpdHlJZGVudGl0eSBnZXRTZWN1cml0eUlkZW50aXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZWN1cml0eUlkZW50aXR5IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0U2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIExvY2FsSG9tZUludGVyZmFjZSByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBMb2NhbEhvbWVJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb2NhbEhvbWVJbnRlcmZhY2UoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIExvY2FsSW50ZXJmYWNlIHJlZmVyZW5jZQotCSAqLwotCUphdmFDbGFzcyBnZXRMb2NhbEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9jYWxJbnRlcmZhY2UgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb2NhbEludGVyZmFjZShKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRW50aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NmRlOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLS8qKgotICogVGhlIGVudGl0eSBlbGVtZW50IGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBvcHRpb25hbCBkaXNwbGF5IG5hbWU7IG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZTsgYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLCBpZiBhbnk7IHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGU7IHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWU7IGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeTsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbjsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBhYnN0cmFjdCBzY2hlbWEgbmFtZTsgYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHM7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotICogVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kIGNtcC12ZXJzaW9uIDIueC4gVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLSAqIFRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlIGVudGl0eSBiZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLSAqIFRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotICogVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uCi0gKiBUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIEF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYKLSAqIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudGl0eSBleHRlbmRzIEVudGVycHJpc2VCZWFuewotCi1wdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlOYW1lKCk7Ci1wdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQotcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleU5hbWUoU3RyaW5nIHByaW1hcnlLZXlOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNSZWVudHJhbnQgYXR0cmlidXRlCi0JICogVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eSBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0KLQkgKi8KLQlib29sZWFuIGlzUmVlbnRyYW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5I2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZW50cmFudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZWVudHJhbnQoKQotCSAqIEBzZWUgI3Vuc2V0UmVlbnRyYW50KCkKLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVlbnRyYW50KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5I2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlZW50cmFudCgpCi0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBzZWUgI3NldFJlZW50cmFudChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCB1bnNldFJlZW50cmFudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5I2lzUmVlbnRyYW50IDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWVudHJhbnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlZW50cmFudCgpCi0JICogQHNlZSAjaXNSZWVudHJhbnQoKQotCSAqIEBzZWUgI3NldFJlZW50cmFudChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldFJlZW50cmFudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUHJpbWFyeUtleSByZWZlcmVuY2UKLQkgKiBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQKLQkgKiBmb3IgYW4gZW50aXR5IHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBUaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlCi0JICogb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNtcC1maWVsZAotCSAqIGVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4gCi0JICogVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeSBrZXkgbWFwcyB0byBtdWx0aXBsZQotCSAqIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgKiBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQgdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIAotCSAqIHRvIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCSAqIEV4YW1wbGVzOjxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC8vcHJpbS1rZXktY2xhc3M+Ci0JICogCTxwcmltLWtleS1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVJRDwvL3ByaW0ta2V5LWNsYXNzPgotCSAqIAk8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLk9iamVjdDwvL3ByaW0ta2V5LWNsYXNzPgotCi0JICovCi0JSmF2YUNsYXNzIGdldFByaW1hcnlLZXkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFByaW1hcnlLZXkgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRQcmltYXJ5S2V5KEphdmFDbGFzcyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9FeGNsdWRlTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMGVjMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIFRoZSBleGNsdWRlIGxpc3QgZWxlbWVudCBkZWZpbmVzIGEgc2V0IG9mIG1ldGhvZHMgd2hpY2ggdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLiBJdCBjb250YWlucyBvbmUgb3IgbW9yZSBtZXRob2RzLgotICogCi0gKiBJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgbXVzdCBjb25zaWRlciB0aG9zZSBtZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBFeGNsdWRlTGlzdCBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kRWxlbWVudHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyB0aGF0IHBvaW50IHRvCi0JKiBAYW5FSkIuCi0JKi8KLQlMaXN0IGdldE1ldGhvZEVsZW1lbnRzKEVudGVycHJpc2VCZWFuIGFuRUpCKTsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0lSb2xlU2hhcGVTdHJhdGVneS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0lSb2xlU2hhcGVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQyY2ZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9JUm9sZVNoYXBlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvNi8yMDAwIDExOjQwOjE2IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSb2xlU2hhcGVTdHJhdGVneSB7Ci0JU3RyaW5nIEFUVFJJQlVURV9OQU1FX0pPSU5FUiA9ICJfIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBST0xFX0dFVF9QUkVGSVggPSAiZ2V0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBST0xFX1NFVF9QUkVGSVggPSAic2V0IjsgLy8kTk9OLU5MUy0xJAotYm9vbGVhbiBpc0ZsYXQoKTsKLWJvb2xlYW4gaXNSb3VuZCgpOwotdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKExpc3Qgcm9sZUF0dHJpYnV0ZXMpIDsKLWJvb2xlYW4gdXNlc0F0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSA7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01lc3NhZ2VEcml2ZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXNzYWdlRHJpdmVuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDgzMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01lc3NhZ2VEcml2ZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLQotCi0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZURyaXZlbiBleHRlbmRzIEVudGVycHJpc2VCZWFuewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUcmFuc2FjdGlvblR5cGUgYXR0cmlidXRlCi0JICogVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24KLQkgKiBtYW5hZ2VtZW50IHR5cGUuCi0JICogCi0JICogVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogQmVhbiwgQ29udGFpbmVyCi0JICovCi0JVHJhbnNhY3Rpb25UeXBlIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvblR5cGUKLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTWVzc2FnZVNlbGVjdG9yIGF0dHJpYnV0ZQotCSAqIFRoZSBtZXNzYWdlLXNlbGVjdG9yIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBKTVMgbWVzc2FnZQotCSAqIHNlbGVjdG9yIHRvIGJlIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hpY2ggbWVzc2FnZXMgYSBtZXNzYWdlLWRyaXZlbgotCSAqIGJlYW4gaXMgdG8gcmVjZWl2ZS4KLQkgKiAKLQkgKiBFeGFtcGxlIHZhbHVlOiAKLQkgKiBKTVNUeXBlID0gYGNhcicgQU5EIGNvbG9yID0gYGJsdWUnIEFORCB3ZWlnaHQgPiAyNTAwCi0KLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnZVNlbGVjdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTWVzc2FnZVNlbGVjdG9yIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TWVzc2FnZVNlbGVjdG9yKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQWNrbm93bGVkZ2VNb2RlIGF0dHJpYnV0ZQotCSAqIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBhY2tub3dsZWRnbWVudCBtb2RlIGZvciB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotCSAqIGlmIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBpcyB1c2VkIChpZS4gc2VsZi50cmFuc2FjdGlvblR5cGUgPQotCSAqIEJlYW4pCi0JICogCi0JICogVGhlIGFja25vd2xlZGdlLW1vZGUgc3BlY2lmaWVzIHdoZXRoZXIgSk1TIEFVVE9fQUNLTk9XTEVER0Ugb3IKLQkgKiBEVVBTX09LX0FDS05PV0xFREdFIG1lc3NhZ2UgYWNrbm93bGVkZ21lbnQgc2VtYW50aWNzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUKLQkgKiBvbk1lc3NhZ2UgbWVzc2FnZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdGhhdCB1c2VzIGJlYW4gbWFuYWdlZCB0cmFuc2FjdGlvbgotCSAqIGRlbWFyY2F0aW9uLgotCSAqIAotCSAqIFRoZSBhY2tub3dsZWRnZS1tb2RlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAgQXV0by1hY2tub3dsZWRnZSwKLQkgKiBEdXBzLW9rLWFja25vd2xlZGdlCi0KLQkgKi8KLQlBY2tub3dsZWRnZU1vZGUgZ2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRBY2tub3dsZWRnZU1vZGUgPGVtPkFja25vd2xlZGdlIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFja25vd2xlZGdlIE1vZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFja25vd2xlZGdlTW9kZQotCSAqIEBzZWUgI2lzU2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAc2VlICN1bnNldEFja25vd2xlZGdlTW9kZSgpCi0JICogQHNlZSAjZ2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY2tub3dsZWRnZU1vZGUoQWNrbm93bGVkZ2VNb2RlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0QWNrbm93bGVkZ2VNb2RlIDxlbT5BY2tub3dsZWRnZSBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFja25vd2xlZGdlTW9kZSgpCi0JICogQHNlZSAjZ2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAc2VlICNzZXRBY2tub3dsZWRnZU1vZGUoQWNrbm93bGVkZ2VNb2RlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldEFja25vd2xlZGdlTW9kZSA8ZW0+QWNrbm93bGVkZ2UgTW9kZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNrbm93bGVkZ2UgTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QWNrbm93bGVkZ2VNb2RlKCkKLQkgKiBAc2VlICNnZXRBY2tub3dsZWRnZU1vZGUoKQotCSAqIEBzZWUgI3NldEFja25vd2xlZGdlTW9kZShBY2tub3dsZWRnZU1vZGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBY2tub3dsZWRnZU1vZGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIERlc3RpbmF0aW9uIHJlZmVyZW5jZQotCSAqIEFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbiB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbgotCSAqIGJlYW4KLQkgKi8KLQlNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gZ2V0RGVzdGluYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc3RpbmF0aW9uIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RGVzdGluYXRpb24oTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvbkNvbmZpZyBnZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRBY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25Db25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWVzc2FnZURlc3RpbmF0aW9uKEphdmFDbGFzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldE1lc3NhZ2VEZXN0aW5hdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbihKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGluazwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICogCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluawotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5fTGluaygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbiNnZXRMaW5rIDxlbT5MaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdpbmcgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQotCSAqICAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZgotCSAqICAgICAgICAgdGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMKLQkgKiAgICAgICAgIGFzc3VtZWQgdG8gYmUgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1lc3NhZ2luZ1R5cGUoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdpbmdUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YUNsYXNzIGdldE1lc3NhZ2luZ1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuI2dldE1lc3NhZ2luZ1R5cGUgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWVzc2FnaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWVzc2FnaW5nVHlwZShKYXZhQ2xhc3MgdmFsdWUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMyZGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogVGhlIG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYWR2aWNlIHRvIHRoZSBEZXBsb3llciBhcyB0byB3aGV0aGVyIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiBpcyBpbnRlbmRlZCBmb3IgYSBRdWV1ZSBvciBhIFRvcGljLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW50ZW5kZWQgZGVzdGluYXRpb24gYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHdoZXRoZXIgYSBkdXJhYmxlIG9yIG5vbi1kdXJhYmxlIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUgZGVzdGluYXRpb24tdHlwZSBpcyBqYXZheC5qbXMuVG9waWMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgSk1TIGRlc3RpbmF0aW9uLiBUaGUKLQkgKiB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlCi0JICogZGVzdGluYXRpb24uCi0JICogCi0JICogVGhlIGRlc3RpbmF0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogamF2YXguam1zLlF1ZXVlLCAKLQkgKiBqYXZheC5qbXMuVG9waWMKLQkgKi8KLQlEZXN0aW5hdGlvblR5cGUgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5EZXN0aW5hdGlvblR5cGUKLQkgKiBAc2VlICNpc1NldFR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShEZXN0aW5hdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShEZXN0aW5hdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQHNlZSAjc2V0VHlwZShEZXN0aW5hdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSBhdHRyaWJ1dGUKLQkgKiBUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIEpNUyB0b3BpYyBzdWJzY3JpcHRpb24KLQkgKiBpcyBpbnRlbmRlZCB0byBiZSBkdXJhYmxlIG9yIG5vbmR1cmFibGUuCi0JICogCi0JICogVGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6ICBEdXJhYmxlLCAKLQkgKiBOb25EdXJhYmxlCi0KLQkgKi8KLQlTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPGVtPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQKLQkgKiBAc2VlICNpc1NldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBzZWUgI3Vuc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eShTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb24jZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjZ2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpCi0JICogQHNlZSAjc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eShTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiNnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5IDxlbT5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBzZWUgI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBzZWUgI3NldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBCZWFuIHJlZmVyZW5jZQotCSAqLwotCU1lc3NhZ2VEcml2ZW4gZ2V0QmVhbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQmVhbiByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEJlYW4oTWVzc2FnZURyaXZlbiB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU3MDUxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLS8qKgotICogVGhlIG1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi0gKiBob21lIG9yIHJlbW90ZSBpbnRlcmZhY2UsIG9yIGEgc2V0IG9mIG1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50Ci0gKiBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiBkZWNsYXJlZCBpbiB0aGUKLSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvCi0gKiBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgZGVmaW5lZCBpbgotICogYm90aCB0aGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZTsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0gKiB0aGUgbWV0aG9kIG5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhCi0gKiBzaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG1ldGhvZCBuYW1lLgotICogCi0gKiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHRoZSBtZXRob2QgZWxlbWVudCBzeW50YXg6Ci0gKiAKLSAqIDEuIAk8bWV0aG9kPgotICogCQk8ZWpiLW5hbWU+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+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJPC8vbWV0aG9kLXBhcmFtcz4KLSAqIAkJPC8vbWV0aG9kPgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudCBleHRlbmRzIEVPYmplY3R7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSUdIVF9QQVJFTiA9ICIoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfUEFSRU4gPSAiKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQSA9ICIsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBhcmFtcyhTdHJpbmcgcGFyYW0pOwotLyoqCi0gKiBTZXQgdGhlIHBhcmFtcyBmb3IgdGhpcyBtZXRob2QgZWxlbWVudCB0byBhbiBlbXB0eSBhcnJheSwgYXMgb3Bwb3NlZAotICogdG8gbnVsbC4KLSAqLwotcHVibGljIHZvaWQgYXBwbHlaZXJvUGFyYW1zKCk7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCBhbmQgQGFub3RoZXJNZXRob2RFbGVtZW50Ci0gKiBoYXZlIHRoZSBzYW1lIG5hbWUsIHBhcmFtZXRlcnMsIGFuZCB0eXBlLgotICovCi1ib29sZWFuIGVxdWFsU2lnbmF0dXJlKE1ldGhvZEVsZW1lbnQgYW5vdGhlck1ldGhvZEVsZW1lbnQpIDsKLQlqYXZhLnV0aWwuTGlzdCBnZXRNZXRob2RQYXJhbXMoKSA7LyoqCi0gKiBBbnN3ZXIgd2hldGhlciBtZXRob2QgcGFyYW1zIGFwcGx5IHRvIHRoaXMgbWV0aG9kLCBlLmcuLCBpdCBpcyBzcGVjaWZpYyB0byBvbmUKLSAqIG92ZXJsb2FkZWQgbWV0aG9kLCBldmVuIGlmIHRoZSBtZXRob2QgaXMgYSB6ZXJvIHBhcmFtZXRlciBtZXRob2QuICBBbnN3ZXIgZmFsc2UgaWYgbm8KLSAqIHBhcmFtZXRlcnMgYXBwbHksIHRoYXQgaXMsIHRoZSBtZXRob2QgZWxlbWVudCBhcHBsaWVzIHRvIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgd2l0aCB0aGlzIG5hbWUKLSAqLyAKLS8qKgotICogQW5zd2VyIGEgbGlzdCBvZiBhbGwgdGhlIG1ldGhvZHMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIGVsZW1lbnQgYXBwbGllcy4gIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIHVzZWQ6Ci0gKgotICogMSkgIElmIHRoZSBtZXRob2QgZWxlbWVudCB0eXBlIGlzIHVuc3BlY2lmaWVkLCB0aGUgbWV0aG9kcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgcmVtb3RlIGludGVyZmFjZSBvZiB0aGUgZWpiOwotICoJCUlmIGl0IGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgYXBwcm9wcmlhdGUgaW50ZXJmYWNlIGlzIHVzZWQKLSAqCi0gKiAyKSAgSWYgdGhlIG1ldGhvZCBuYW1lID0gIioiLCB0aGVuIGFsbCB0aGUgUFVCTElDIG1ldGhvZHMgZm9yIHRoYXQgaW50ZXJmYWNlIGFyZSByZXR1cm5lZAotICoKLSAqIDMpICBJZiB0aGUgbWV0aG9kIG5hbWUgaXMgc3BlY2lmaWVkLCBhbmQgbm8gbWV0aG9kIHBhcmFtcyBhcmUgc3BlY2lmaWVkLCB0aGVuIGFsbCBwdWJsaWMgbWV0aG9kcyBmb3IgdGhlIGludGVyZmFjZQotICogICAgICBoYXZpbmcgdGhlIHNhbWUgbmFtZSBhcmUgcmV0dXJuZWQuCi0gKgotICogNCkgIElmIHRoZSBtZXRob2QgbmFtZSBhbmQgcGFyYW1zIGFyZSBzcGVjaWZpZWQsIHRoZW4gYSB6ZXJvIG9yIG9uZSBlbGVtZW50IGFycmF5IGlzIHJldHVybmVkLCBjb250YWluaW5nIHRoZSBvbmUgYW5kIG9ubHkgbWV0aG9kCi0gKiAgICAgIG9uIHRoZSBpbnRlcmZhY2Ugd2l0aCB0aGUgYXBwcm9wcmlhdGUgc2lnbmF0dXJlLCBpZiBpdCBleGlzdHMKLSAqLwotcHVibGljIE1ldGhvZFtdIGdldE1ldGhvZHMoKTsKLS8qKgotICogUmV0dXJuIHRoZSBNZXRob2RFbGVtZW50IHRoYXQgaXMgbW9zdCBzcGVjaWZpYy4KLSAqLwotTWV0aG9kRWxlbWVudCBnZXRNb3N0U3BlY2lmaWMoTWV0aG9kRWxlbWVudCBhTWV0aG9kRWxlbWVudCwgSmF2YUNsYXNzIGFKYXZhQ2xhc3MpOwotLyoqCi0gKiBSZXR1cm4gdGhlIHNpZ25hdHVyZS4KLSAqIEZvciBleGFtcGxlOiAgc2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAqLwotU3RyaW5nIGdldFNpZ25hdHVyZSgpIDsKLS8qKgotICogUmV0dXJuIHRoZSB0eXBlIGNhc3QgdG8gYSBKYXZhQ2xhc3MuCi0gKi8KLUphdmFDbGFzcyBnZXRUeXBlSmF2YUNsYXNzKCkgOwotcHVibGljIGJvb2xlYW4gaGFzTWV0aG9kUGFyYW1zKCk7Ci0vKioKLSAqIFBhcnNlIEBhU2lnbmF0dXJlIHNldHRpbmcgdGhlIG5hbWUgYW5kIHRoZSBwYXJhbXMuCi0gKiBBIHNpZ25hdHVyZSBleGFtcGxlOiAgc2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAqLwotdm9pZCBpbml0aWFsaXplRnJvbVNpZ25hdHVyZShTdHJpbmcgYVNpZ25hdHVyZSkgOwotYm9vbGVhbiBpc0RlZmF1bHQoKTsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IGFuZCBAYW5vdGhlck1ldGhvZEVsZW1lbnQKLSAqIHJlcHJlc2VudCB0aGUgc2FtZSBleGFjdCBtZXRob2RzLgotICovCi1ib29sZWFuIGlzRXF1aXZhbGVudChNZXRob2RFbGVtZW50IGFub3RoZXJNZXRob2RFbGVtZW50KSA7Ci1ib29sZWFuIGlzSG9tZSgpIDsKLWJvb2xlYW4gaXNSZW1vdGUoKSA7Ci1ib29sZWFuIGlzVW5zcGVjaWZpZWQoKSA7Ci1ib29sZWFuIGlzTG9jYWxIb21lKCkgOwotYm9vbGVhbiBpc0xvY2FsKCkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZEVsZW1lbnQgcmVwcmVzZW50cyBvbmUgb3IgbW9yZQotICogbWV0aG9kcy4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IGhhcyB0aGUgc2FtZSBiYXNpYyBzaWduYXR1cmUgYXMKLSAqIEBhTWV0aG9kLCBpZ25vcmluZyB0aGUgcmV0dXJuIHR5cGUsIHRocm93biBleGNlcHRpb25zLCBhbmQgZGVjbGFyaW5nIGNsYXNzIG9mIAotICogdGhpcyBpbnN0YW5jZSBvciBAYU1ldGhvZC4gIFJldHVybiBmYWxzZSwgaWYgcGFyYW1zIGlzIG51bGwKLSAqLwotcHVibGljIGJvb2xlYW4gbmFtZUFuZFBhcmFtc0VxdWFscyhNZXRob2QgYU1ldGhvZCk7Ci0JcHVibGljIHZvaWQgcmVtb3ZlTWV0aG9kUGFyYW1zKFN0cmluZyBwYXJhbSk7Ci1ib29sZWFuIHJlcHJlc2VudHMoTWV0aG9kIGFNZXRob2QpOwotcHVibGljIHZvaWQgc2V0SWRUb1JlYWRhYmxlU3RyaW5nKCk7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzCi0gKiBAYU1ldGhvZC4gIFJldHVybiBmYWxzZSwgZXZlbiBpZiB0aGUgTWV0aG9kRWxlbWVudCByZXByZXNlbnRzCi0gKiBAYU1ldGhvZCAoaS5lLiwgQGFNZXRob2QgaXMgY29udGFpbmVkIGluIGl0cyBsaXN0IG9mIG1ldGhvZHMpLgotICovCi1ib29sZWFuIHVuaXF1ZWx5SWRlbnRpZmllcyhNZXRob2QgYU1ldGhvZCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBtZXRob2QsCi0JICogb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcyB1c2VkIHdoZW4gdGhlIGVsZW1lbnQKLQkgKiBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kIGhvbWUKLQkgKiBpbnRlcmZhY2VzLgotCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFBhcm1zIGF0dHJpYnV0ZQotCSAqIFRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgYSBsaXN0IG9mIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlCi0JICogbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLiAgSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdGhpcyBpcyBhIHNwYWNlCi0JICogZGVsaW1pdHRlZCBTdHJpbmcuICBBIG51bGwgc3RyaW5nIGluZGljYXRlcyBhIGdlbmVyaWMgbWV0aG9kIGVsZW1lbnQgdGhhdCBjYW4KLQkgKiBhcHBseSB0byBtdWx0aXBsZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZS4gIEFuIGVtcHR5IHN0cmluZyBpbmRpY2F0ZXMgYQotCSAqIG1ldGhvZCB3aXRoIHplcm8gcGFyYW1ldGVycy4gIAotCSAqLwotCVN0cmluZyBnZXRQYXJtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFBhcm1zIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UGFybXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqLwotCU1ldGhvZEVsZW1lbnRLaW5kIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kCi0JICogQHNlZSAjaXNTZXRUeXBlKCkKLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBzZWUgI3NldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFR5cGUoKQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBzZWUgI3NldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dAotCSAqIGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55Ci0JICogaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi0JICogdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZQotCSAqIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50Ci0JICogZWxlbWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFbnRlcnByaXNlQmVhbiByZWZlcmVuY2UKLQkgKi8KLQlFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnByaXNlQmVhbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRW50ZXJwcmlzZUJlYW4gcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlQmVhbihFbnRlcnByaXNlQmVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RFbGVtZW50S2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnRLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzFmNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZEVsZW1lbnRLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudEtpbmQge30KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZEVsZW1lbnRLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1BFQ0lGSUVEID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTUUgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9IT01FID0gNDsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9IlNlcnZpY2VFbmRwb2ludCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0VORFBPSU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVuc3BlY2lmaWVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VW5zcGVjaWZpZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVU5TUEVDSUZJRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIFVOU1BFQ0lGSUVEX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoVU5TUEVDSUZJRUQsICJVbnNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVNT1RFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBSRU1PVEVfTElURVJBTCA9IG5ldyBNZXRob2RFbGVtZW50S2luZChSRU1PVEUsICJSZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSE9NRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgSE9NRV9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKEhPTUUsICJIb21lIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIExPQ0FMX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoTE9DQUwsICJMb2NhbCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgSG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9IT01FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBMT0NBTF9IT01FX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoTE9DQUxfSE9NRSwgIkxvY2FsSG9tZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWSUNFX0VORFBPSU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoU0VSVklDRV9FTkRQT0lOVCwgIlNlcnZpY2VFbmRwb2ludCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgTWV0aG9kRWxlbWVudEtpbmRbXSB7Ci0JCQlVTlNQRUNJRklFRF9MSVRFUkFMLAotCQkJUkVNT1RFX0xJVEVSQUwsCi0JCQlIT01FX0xJVEVSQUwsCi0JCQlMT0NBTF9MSVRFUkFMLAotCQkJTE9DQUxfSE9NRV9MSVRFUkFMLAotCQkJU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50S2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCU1ldGhvZEVsZW1lbnRLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50S2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgVU5TUEVDSUZJRUQ6IHJldHVybiBVTlNQRUNJRklFRF9MSVRFUkFMOwotCQkJY2FzZSBSRU1PVEU6IHJldHVybiBSRU1PVEVfTElURVJBTDsKLQkJCWNhc2UgSE9NRTogcmV0dXJuIEhPTUVfTElURVJBTDsKLQkJCWNhc2UgTE9DQUw6IHJldHVybiBMT0NBTF9MSVRFUkFMOwotCQkJY2FzZSBMT0NBTF9IT01FOiByZXR1cm4gTE9DQUxfSE9NRV9MSVRFUkFMOwotCQkJY2FzZSBTRVJWSUNFX0VORFBPSU5UOiByZXR1cm4gU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50S2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50S2luZAotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kUGVybWlzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU4OTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci0KLS8qKgotICogVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMsIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLiAgVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kLy9vciBob21lIGludGVyZmFjZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kUGVybWlzc2lvbiBleHRlbmRzIEVPYmplY3R7Ci0KLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyB0aGF0IHBvaW50IHRvCi0gKiBAYW5FSkIuCi0gKi8KLUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLS8qKgotICogUmV0dXJuIHRoZSBTZWN1cml0eVJvbGUgbmFtZWQgQGFSb2xlTmFtZS4KLSAqLwotU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZShTdHJpbmcgYVJvbGVOYW1lKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcGVybWlzc2lvbiBjb250YWlucyBAYVNlY3VyaXR5Um9sZQotICovCi1ib29sZWFuIGhhc1NlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgYVNlY3VyaXR5Um9sZSkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBlcm1pc3Npb24gY29udGFpbnMgYSBTZWN1cml0eVJvbGUKLSAqIG5hbWVkIEBhUm9sZU5hbWUuCi0gKi8KLWJvb2xlYW4gaGFzU2VjdXJpdHlSb2xlKFN0cmluZyBhUm9sZU5hbWUpIDsKLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RQZXJtaXNzaW9uIGFuZCBAYW5vdGhlck1ldGhvZFBlcm1pc3Npb24KLSAqIGhhdmUgdGhlIHNhbWUgcm9sZXMuCi0gKi8KLWJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZFBlcm1pc3Npb24gYW5vdGhlck1ldGhvZFBlcm1pc3Npb24pIDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dAotCSAqIGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55Ci0JICogaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi0JICogdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZQotCSAqIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50Ci0JICogZWxlbWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVW5jaGVja2VkIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNVbmNoZWNrZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVbmNoZWNrZWQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVbmNoZWNrZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uI2lzVW5jaGVja2VkIDxlbT5VbmNoZWNrZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VW5jaGVja2VkKCkKLQkgKiBAc2VlICNpc1VuY2hlY2tlZCgpCi0JICogQHNlZSAjc2V0VW5jaGVja2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRVbmNoZWNrZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb24jaXNVbmNoZWNrZWQgPGVtPlVuY2hlY2tlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5jaGVja2VkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVbmNoZWNrZWQoKQotCSAqIEBzZWUgI2lzVW5jaGVja2VkKCkKLQkgKiBAc2VlICNzZXRVbmNoZWNrZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFVuY2hlY2tlZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgQXNzZW1ibHlEZXNjcmlwdG9yIHJlZmVyZW5jZQotCSAqLwotCUFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEFzc2VtYmx5RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBSb2xlcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kRWxlbWVudHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL01ldGhvZFRyYW5zYWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kVHJhbnNhY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2NGYwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kVHJhbnNhY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotLyoqCi0gKiBTcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RUcmFuc2FjdGlvbiBleHRlbmRzIEVPYmplY3R7Ci0KLS8qKgotICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RFbGVtZW50cyB0aGF0IHBvaW50IHRvCi0gKiBAYW5FSkIuCi0gKi8KLUxpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIDsKLU1ldGhvZEVsZW1lbnQgZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudChNZXRob2QgYU1ldGhvZCkgOwotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBhcmUgdGhlIHNhbWUuCi0gKi8KLWJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZFRyYW5zYWN0aW9uIGFub3RoZXJNZXRob2RUcmFuc2FjdGlvbikgOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUcmFuc2FjdGlvbkF0dHJpYnV0ZSBhdHRyaWJ1dGUKLQkgKiBUaGUgdHJhbnMtYXR0cmlidXRlIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRoZQotCSAqIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZQotCSAqIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLQkgKi8KLQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbiNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZQotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb24jZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbiNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0Ci0JICogZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkKLQkgKiBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLQkgKiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlCi0JICogZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQKLQkgKiBlbGVtZW50LgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEFzc2VtYmx5RGVzY3JpcHRvciByZWZlcmVuY2UKLQkgKi8KLQlBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBc3NlbWJseURlc2NyaXB0b3IgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kRWxlbWVudHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRNZXRob2RUcmFuc2FjdGlvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NdWx0aXBsaWNpdHlLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTXVsdGlwbGljaXR5S2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTM2NWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NdWx0aXBsaWNpdHlLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgTXVsdGlwbGljaXR5S2luZCB7fQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTXVsdGlwbGljaXR5S2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkU9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOWT0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9uZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9uZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE11bHRpcGxpY2l0eUtpbmQgT05FX0xJVEVSQUwgPSBuZXcgTXVsdGlwbGljaXR5S2luZChPTkUsICJPbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUFOWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTXVsdGlwbGljaXR5S2luZCBNQU5ZX0xJVEVSQUwgPSBuZXcgTXVsdGlwbGljaXR5S2luZChNQU5ZLCAiTWFueSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE11bHRpcGxpY2l0eUtpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgTXVsdGlwbGljaXR5S2luZFtdIHsKLQkJCU9ORV9MSVRFUkFMLAotCQkJTUFOWV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk11bHRpcGxpY2l0eSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE11bHRpcGxpY2l0eUtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlNdWx0aXBsaWNpdHlLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXVsdGlwbGljaXR5S2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgT05FOiByZXR1cm4gT05FX0xJVEVSQUw7Ci0JCQljYXNlIE1BTlk6IHJldHVybiBNQU5ZX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE11bHRpcGxpY2l0eUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vTXVsdGlwbGljaXR5S2luZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1F1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmNjJmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIFRoZSBxdWVyeSBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeTsgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QgbWV0aG9kIGl0IGlzIHVzZWQgYnk7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmV0dXJuIHR5cGUgbWFwcGluZywgaWYgYW55LCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZDsgYW5kIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuIFF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeQotICogaXMgbm90IGV4cHJlc3NpYmxlIGluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudCBzaG91bGQgYmUgZW1wdHkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnkgZXh0ZW5kcyBFT2JqZWN0ewotCi0JcHVibGljIGJvb2xlYW4gaXNMb2NhbFJlc3VsdE1hcHBpbmcoKTsKLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW90ZVJlc3VsdE1hcHBpbmcoKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyAKLQkgKiB0aGUgcXVlcnkuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRWpiUUwgYXR0cmlidXRlCi0JICogQ29udGFpbnMgdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gVGhpcwotCSAqIGVsZW1lbnQgaXMgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgcXVlcnkgZWxlbWVudCB3aG9zZSBjb250ZW50cyBzcGVjaWZ5Ci0JICogdGhlIGZpbmRlciBvciB0aGUgc2VsZWN0IG1ldGhvZCB0aGF0IHVzZXMgdGhlIHF1ZXJ5LiBUaGUgY29udGVudCBtdXN0IGJlIGEKLQkgKiB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nIGZvciB0aGUgZW50aXR5IGJlYW4gZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuIAotCSAqIFRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4KLQkgKiBFSkIgUUwuCi0JICogCi0JICogQGludmFyaWFudCBUaGUgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBlbnRpdHkgYmVhbiBvciAKLQkgKiBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzIGZvciB3aGljaCB0aGUgcXVlcnkgaXMgc3BlY2lmaWVkLgotCSAqIEBpbnZhcmlhbnQgVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZQotCSAqIGV4cHJlc3NpYmxlIGluIEVKQiBRTC4KLQkgKiAKLQkgKiBFeGFtcGxlOgotCSAqIDxxdWVyeT4KLQkgKiA8cXVlcnktbWV0aG9kPgotCSAqIDxtZXRob2QtbmFtZT5lamJTZWxlY3RQZW5kaW5nTGluZWl0ZW1zPC8vbWV0aG9kLW5hbWU+Ci0JICogPG1ldGhvZC1wYXJhbXMvLz4KLQkgKiA8Ly9xdWVyeS1tZXRob2Q+Ci0JICogPGVqYi1xbD5TRUxFQ1QgRU5USVRZKGwpCi0JICogRlJPTSBMaW5lSXRlbXMgbAotCSAqIFdIRVJFIGwuc2hpcHBlZCBpcyBGQUxTRQotCSAqIDwvL2VqYi1xbD4KLQkgKiA8Ly9xdWVyeT4KLQkgKi8KLQlTdHJpbmcgZ2V0RWpiUUwoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBFamJRTCBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEVqYlFMKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmV0dXJuVHlwZU1hcHBpbmcgYXR0cmlidXRlCi0JICogVGhlIHJldHVybi10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvIHNwZWNpZnkgd2hldGhlciAKLQkgKiBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSB0aGF0IGlzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0bwotCSAqIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvciBFSkJPYmplY3QgdHlwZS4gIFRoZSB2YWx1ZSBvZiB0aGUKLQkgKiByZXR1cm4tdHlwZS1tYXBwaW5nIGVsZW1lbnQsIGlmIHNwZWNpZmllZCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLgotCSAqLwotCVJldHVyblR5cGVNYXBwaW5nIGdldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkjZ2V0UmV0dXJuVHlwZU1hcHBpbmcgPGVtPlJldHVybiBUeXBlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBUeXBlIE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJldHVyblR5cGVNYXBwaW5nCi0JICogQHNlZSAjaXNTZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQHNlZSAjdW5zZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQHNlZSAjZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJldHVyblR5cGVNYXBwaW5nKFJldHVyblR5cGVNYXBwaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldFJldHVyblR5cGVNYXBwaW5nIDxlbT5SZXR1cm4gVHlwZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJldHVyblR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQHNlZSAjc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnkjZ2V0UmV0dXJuVHlwZU1hcHBpbmcgPGVtPlJldHVybiBUeXBlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBUeXBlIE1hcHBpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJldHVyblR5cGVNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRSZXR1cm5UeXBlTWFwcGluZygpCi0JICogQHNlZSAjc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXR1cm5UeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgUXVlcnlNZXRob2QgcmVmZXJlbmNlCi0JICogVGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWV0aG9kIChEQi8vU1IvL0NNLSJvbiB0aGUKLQkgKiBob21lIikgZm9yIGEgZmluZGVyIG9yCi0JICogc2VsZWN0IHF1ZXJ5LgotCSAqIAotCSAqIFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QKLQkgKiBtZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3Mgb3IgYSBzZWxlY3QgbWV0aG9kIGluCi0JICogdGhlIGRlcGVuZGVudCBvYmplY3QgY2xhc3MuCi0JICogCi0JICogRWFjaCBtZXRob2QtcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGZvciBhIHF1ZXJ5LW1ldGhvZCB1c2luZyB0aGUKLQkgKiBtZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0JICogCi0JICogVXNlZCBpbjogcXVlcnkKLQkgKiAKLQkgKiBFeGFtcGxlOgotCSAqIAotCSAqIEV4YW1wbGU6Ci0JICogPHF1ZXJ5PgotCSAqICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8Ly9kZXNjcmlwdGlvbj4KLQkgKiAgIDxxdWVyeS1tZXRob2Q+Ci0JICogICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8Ly9tZXRob2QtbmFtZT4KLQkgKiAgICAgPG1ldGhvZC1wYXJhbXM+PC8vbWV0aG9kLXBhcmFtcz4KLQkgKiAgIDwvL3F1ZXJ5LW1ldGhvZD4KLQkgKiAgIDxlamItcWw+U0VMRUNUIEVOVElUWShvKSBGUk9NIE9yZGVyIG8gV0hFUkUgby5hbW91bnQgJmd0OyAxMDAwPC8vZWpiLXFsPgotCSAqIDwvL3F1ZXJ5PgotCSAqLwotCVF1ZXJ5TWV0aG9kIGdldFF1ZXJ5TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBRdWVyeU1ldGhvZCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEVudGl0eSByZWZlcmVuY2UKLQkgKi8KLQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5I2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0UXVlcnlfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUXVlcnlNZXRob2QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9RdWVyeU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDk4MGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9RdWVyeU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5TWV0aG9kIGV4dGVuZHMgTWV0aG9kRWxlbWVudHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfUFJFRklYID0gImVqYlNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5EX1BSRUZJWCA9ICJmaW5kIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFF1ZXJ5IHJlZmVyZW5jZQotCSAqLwotCVF1ZXJ5IGdldFF1ZXJ5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBRdWVyeSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFF1ZXJ5KFF1ZXJ5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBKYXZhQ2xhc3NlcyBvZiBhbGwgdGhlIGludGVyZmFjZXMgb3IgYmVhbiBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIHByZXNlbnRlZAotCSAqIHRvIGEgY2xpZW50LiAgSWYgaXQgaXMgYW4gZWpiU2VsZWN0Li4uIG9uIHRoZSBiZWFuIGNsYXNzIHdpbGwgYmUgcmV0dXJuZWQgYW5kIGlmCi0JICogaXQgaWYgYSBmaW5kIGJvdGggaG9tZSBpbnRlcmZhY2VzIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhleSBleGlzdC4KLQkgKiAKLQkgKiBNYXkgcmV0dXJuIG51bGwuCi0JICovCi0JSmF2YUNsYXNzW10gZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCkgOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUmVsYXRpb25zaGlwcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQ4OTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBUaGUgcmVsYXRpb25zaGlwcyBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcHMgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIAotCSAqIHRoZSBjb2xsZWN0aW9uIG9mIHJlbGF0aW9uc2hpcHMuCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIKLQkgKiB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuCi0JICogVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUKLQkgKiBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFamJKYXIgcmVmZXJlbmNlCi0JICovCi0JRUpCSmFyIGdldEVqYkphcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRWpiSmFyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RWpiSmFyKEVKQkphciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVqYlJlbGF0aW9ucyByZWZlcmVuY2VzCi0JICogQSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQKLQkgKiByZWxhdGlvbnNoaXBzLgotCSAqLwotCUVMaXN0IGdldEVqYlJlbGF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZXR1cm5UeXBlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1JldHVyblR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzU3NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1JldHVyblR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgUmV0dXJuVHlwZU1hcHBpbmcge30KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJldHVyblR5cGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMPSAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1RFPSAxOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldHVyblR5cGVNYXBwaW5nIExPQ0FMX0xJVEVSQUwgPSBuZXcgUmV0dXJuVHlwZU1hcHBpbmcoTE9DQUwsICJMb2NhbCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVNT1RFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXR1cm5UeXBlTWFwcGluZyBSRU1PVEVfTElURVJBTCA9IG5ldyBSZXR1cm5UeXBlTWFwcGluZyhSRU1PVEUsICJSZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJldHVybiBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJldHVyblR5cGVNYXBwaW5nW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFJldHVyblR5cGVNYXBwaW5nW10gewotCQkJTE9DQUxfTElURVJBTCwKLQkJCVJFTU9URV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJldHVybiBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJldHVybiBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXR1cm5UeXBlTWFwcGluZyBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVJldHVyblR5cGVNYXBwaW5nIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmV0dXJuIFR5cGUgTWFwcGluZzwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXR1cm5UeXBlTWFwcGluZyBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTE9DQUw6IHJldHVybiBMT0NBTF9MSVRFUkFMOwotCQkJY2FzZSBSRU1PVEU6IHJldHVybiBSRU1PVEVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUmV0dXJuVHlwZU1hcHBpbmcoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vUmV0dXJuVHlwZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Sb2xlU291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUm9sZVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJhNWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9Sb2xlU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uCi0gKiBAaW52YXJpYW50IFRoZSBjb250ZW50IG9mIGVhY2ggcm9sZS1zb3VyY2UgZWxlbWVudCBzaGFsbCByZWZlciB0byBhbiBleGlzdGluZyBlbnRpdHkgYmVhbiwgZW50aXR5IGJlYW4gcmVmZXJlbmNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVTb3VyY2UgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSb2xlIHJlZmVyZW5jZQotCSAqLwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUm9sZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBFbnRpdHlCZWFuIHJlZmVyZW5jZQotCSAqLwotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0RW50aXR5QmVhbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2UjZ2V0RW50aXR5QmVhbiA8ZW0+RW50aXR5IEJlYW48L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBCZWFuPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHlCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHlCZWFuKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2UjZ2V0Um9sZVNvdXJjZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGEyMmQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLQotCi0KLS8qKgotICogVGhlIHNlc3Npb24gZWxlbWVudCBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIG5hbWUgYXNzaWduZWQKLSAqIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb247IHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzLCBpZiBhbnk7IHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzczsgdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZTsgdGhlIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZTsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCBlbnRyaWVzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQiByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlczsgYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4gVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZXNzaW9uIGV4dGVuZHMgRW50ZXJwcmlzZUJlYW57Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFRyYW5zYWN0aW9uVHlwZSBhdHRyaWJ1dGUKLQkgKiBUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyB0cmFuc2FjdGlvbgotCSAqIG1hbmFnZW1lbnQgdHlwZS4KLQkgKiAKLQotCSAqLwotCVRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNlc3Npb25UeXBlIGF0dHJpYnV0ZQotCSAqLwotCVNlc3Npb25UeXBlIGdldFNlc3Npb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbiNnZXRTZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlCi0JICogQHNlZSAjaXNTZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjdW5zZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0U2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI3NldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2Vzc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb24jZ2V0U2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTZXNzaW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvblR5cGUoKQotCSAqIEBzZWUgI3NldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2Vzc2lvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICogICAgICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3Mgd2ViCi0JICogICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLQkgKiAgICAgICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcwotCSAqICAgICAgICAgc2Vzc2lvbiBiZWFuLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBtdXN0IGJlIGEKLQkgKiAgICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VFbmRwb2ludChKYXZhQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZSNnZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnQoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gc2V0IEphdmEgQ2xhc3MgbmFtZSB2aWEgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50TmFtZShTdHJpbmcgc2VydmljZUVuZHBvaW50TmFtZSk7Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBTZXNzaW9uIGJlYW4gaGFzIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKLQkgKiBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU2VydmljZUVuZHBvaW50KCkgOwotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IEphdmEgQ2xhc3MgbmFtZSAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludE5hbWUoKTsKLQkKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU2Vzc2lvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzlhZGQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIFNlc3Npb25UeXBlIHt9Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXNzaW9uVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcnsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURUZVTD0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURUxFU1M9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGF0ZWZ1bDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXRlZnVsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFRlVMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTVEFURUZVTF9MSVRFUkFMID0gbmV3IFNlc3Npb25UeXBlKFNUQVRFRlVMLCAiU3RhdGVmdWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhdGVsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhdGVsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFTEVTUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2Vzc2lvblR5cGUgU1RBVEVMRVNTX0xJVEVSQUwgPSBuZXcgU2Vzc2lvblR5cGUoU1RBVEVMRVNTLCAiU3RhdGVsZXNzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlc3Npb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFNlc3Npb25UeXBlW10gewotCQkJU1RBVEVGVUxfTElURVJBTCwKLQkJCVNUQVRFTEVTU19MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2Vzc2lvblR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlTZXNzaW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXNzaW9uVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgU1RBVEVGVUw6IHJldHVybiBTVEFURUZVTF9MSVRFUkFMOwotCQkJY2FzZSBTVEFURUxFU1M6IHJldHVybiBTVEFURUxFU1NfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2Vzc2lvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vU2Vzc2lvblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1N1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjZhNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1N1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQge30KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUkFCTEU9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OX0RVUkFCTEU9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5EdXJhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RHVyYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNEVVJBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBEVVJBQkxFX0xJVEVSQUwgPSBuZXcgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoRFVSQUJMRSwgIkR1cmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tm9uIER1cmFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Ob24gRHVyYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05fRFVSQUJMRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgTk9OX0RVUkFCTEVfTElURVJBTCA9IG5ldyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZChOT05fRFVSQUJMRSwgIk5vbkR1cmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kW10gewotCQkJRFVSQUJMRV9MSVRFUkFMLAotCQkJTk9OX0RVUkFCTEVfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlN1YnNjcmlwdGlvbiBEdXJhYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIERVUkFCTEU6IHJldHVybiBEVVJBQkxFX0xJVEVSQUw7Ci0JCQljYXNlIE5PTl9EVVJBQkxFOiByZXR1cm4gTk9OX0RVUkFCTEVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNWRlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIHt9Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1NVUFBPUlRFRD0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBQT1JUUz0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRD0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFU19ORVc9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOREFUT1JZPSA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVkVSPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tm90IFN1cHBvcnRlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5vdCBTdXBwb3J0ZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9UX1NVUFBPUlRFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIE5PVF9TVVBQT1JURURfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTk9UX1NVUFBPUlRFRCwgIk5vdFN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdXBwb3J0czwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN1cHBvcnRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NVUFBPUlRTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgU1VQUE9SVFNfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoU1VQUE9SVFMsICJTdXBwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVJUkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgUkVRVUlSRURfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoUkVRVUlSRUQsICJSZXF1aXJlZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXF1aXJlcyBOZXc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SZXF1aXJlcyBOZXc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVRVUlSRVNfTkVXCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgUkVRVUlSRVNfTkVXX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFJFUVVJUkVTX05FVywgIlJlcXVpcmVzTmV3Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1hbmRhdG9yeTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1hbmRhdG9yeTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNQU5EQVRPUlkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBNQU5EQVRPUllfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTUFOREFUT1JZLCAiTWFuZGF0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5ldmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TmV2ZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkVWRVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBORVZFUl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShORVZFUiwgIk5ldmVyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZVtdIHsKLQkJCU5PVF9TVVBQT1JURURfTElURVJBTCwKLQkJCVNVUFBPUlRTX0xJVEVSQUwsCi0JCQlSRVFVSVJFRF9MSVRFUkFMLAotCQkJUkVRVUlSRVNfTkVXX0xJVEVSQUwsCi0JCQlNQU5EQVRPUllfTElURVJBTCwKLQkJCU5FVkVSX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOT1RfU1VQUE9SVEVEOiByZXR1cm4gTk9UX1NVUFBPUlRFRF9MSVRFUkFMOwotCQkJY2FzZSBTVVBQT1JUUzogcmV0dXJuIFNVUFBPUlRTX0xJVEVSQUw7Ci0JCQljYXNlIFJFUVVJUkVEOiByZXR1cm4gUkVRVUlSRURfTElURVJBTDsKLQkJCWNhc2UgUkVRVUlSRVNfTkVXOiByZXR1cm4gUkVRVUlSRVNfTkVXX0xJVEVSQUw7Ci0JCQljYXNlIE1BTkRBVE9SWTogcmV0dXJuIE1BTkRBVE9SWV9MSVRFUkFMOwotCQkJY2FzZSBORVZFUjogcmV0dXJuIE5FVkVSX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmZTBhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgVHJhbnNhY3Rpb25UeXBlIHt9Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVBTj0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UQUlORVI9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QmVhbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCRUFOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgQkVBTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uVHlwZShCRUFOLCAiQmVhbiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25UeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFRyYW5zYWN0aW9uVHlwZVtdIHsKLQkJCUJFQU5fTElURVJBTCwKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zYWN0aW9uVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQkVBTjogcmV0dXJuIEJFQU5fTElURVJBTDsKLQkJCWNhc2UgQ09OVEFJTkVSOiByZXR1cm4gQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9UcmFuc2FjdGlvblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzczNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA3OjA2OjQ5IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0vKioKLSAqIEFic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIGZpbHRlciBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIExpc3QgZmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotCUl0ZXJhdG9yIGl0ID0gZ2V0U291cmNlUm9sZXMoY21wKS5pdGVyYXRvcigpOwotCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgaXQubmV4dCgpOwotCQlhdHRyaWJ1dGVzLmFkZEFsbChyb2xlLmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCXJldHVybiBhdHRyaWJ1dGVzOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIHJvbGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgYWJzdHJhY3QgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXBFeHQpIDsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BYnN0cmFjdFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhYWI2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BYnN0cmFjdFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC8xNS8yMDAxIDExOjM3OjE5IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLS8qKgotICogQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEFic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIGZpbHRlciBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIExpc3QgZmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlMaXN0IGFsbFJvbGVzID0gZ2V0Um9sZXNUb0ZpbHRlcihjbXApOwotCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgYWxsUm9sZXMuZ2V0KGkpOwotCQlpZiAoc2hvdWxkQWRkRmlsdGVyZWRSZXN1bHQocm9sZSkpCi0JCQlyb2xlcy5hZGQocm9sZSk7Ci0JfQotCXJldHVybiByb2xlczsKLX0KLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRSb2xlc1RvRmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBtdWx0aXBsaWNpdHkgZm9yIEBhUm9sZSBpcyByZXF1aXJlZC4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWRkRmlsdGVyZWRSZXN1bHQoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCWJvb2xlYW4gcmVxdWlyZWQgPSBhUm9sZS5pc1JlcXVpcmVkKCk7Ci0JaWYgKHJlcXVpcmVkKSB7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgb3Bwb3NpdGUgPSBhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpOwotCQlpZiAob3Bwb3NpdGUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlLmlzUmVxdWlyZWQoKSAmJiAhYVJvbGUuaXNLZXkoKSkgewotCQkJCWlmIChvcHBvc2l0ZS5pc0tleSgpIHx8IGFSb2xlLmlzTWFueSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKCFvcHBvc2l0ZS5pc01hbnkoKSkKLQkJCQkJLy9ib3RoIGFyZSBzaW5nbGUgYW5kIG5vdCBrZXkKLQkJCQkJcmV0dXJuIGFSb2xlLmlzRm9yd2FyZCgpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXF1aXJlZDsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIyYzdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQWN0aXZhdGlvbkNvbmZpZ0ltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uQ29uZmlnSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQWN0aXZhdGlvbkNvbmZpZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydGllcygpIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29uZmlnUHJvcGVydGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZhdGlvbkNvbmZpZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uQ29uZmlnKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCWlmIChjb25maWdQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCWNvbmZpZ1Byb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0Q29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXMgIT0gbnVsbCAmJiAhY29uZmlnUHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0FjdGl2YXRpb25Db25maWdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWRmYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNjU3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3NlbWJseURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotCi0vKioKLSAqIFRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4gQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlbWJseURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBc3NlbWJseURlc2NyaXB0b3IsIEVPYmplY3QgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZFBlcm1pc3Npb25zID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kVHJhbnNhY3Rpb25zID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEV4Y2x1ZGVMaXN0IGV4Y2x1ZGVMaXN0ID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIGZpcnN0IG1ldGhvZCBwZXJtaXNzaW9uIHRoYXQgY29udGFpbnMgYWxsIHRoZSByb2xlcyBpbiBzZWN1cml0eVJvbGVzIGFuZAotICogaXMgdGhlIHNhbWUgc2l6ZQotICovCi0KLXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uIGdldE1ldGhvZFBlcm1pc3Npb24oTGlzdCBzZWN1cml0eVJvbGVzTGlzdCkgewotCUxpc3QgcGVybWlzc2lvbnMgPSBnZXRNZXRob2RQZXJtaXNzaW9ucygpOwotCU1ldGhvZFBlcm1pc3Npb24gdGVtcCA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJtaXNzaW9ucy5zaXplKCk7IGkrKykgewotCQl0ZW1wID0gKE1ldGhvZFBlcm1pc3Npb24pIHBlcm1pc3Npb25zLmdldChpKTsKLQkJaWYgKHRlbXAuZ2V0Um9sZXMoKS5jb250YWluc0FsbChzZWN1cml0eVJvbGVzTGlzdCkgJiYgdGVtcC5nZXRSb2xlcygpLnNpemUoKSA9PSBzZWN1cml0eVJvbGVzTGlzdC5zaXplKCkpCi0JCQlyZXR1cm4gdGVtcDsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgTGlzdCBnZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQlMaXN0IGFsbE1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCUxpc3QgcGVybWlzc2lvbnMgPSBnZXRNZXRob2RQZXJtaXNzaW9ucygpOwotCU1ldGhvZFBlcm1pc3Npb24gcGVybWlzc2lvbjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBlcm1pc3Npb25zLnNpemUoKTsgaSsrKXsKLQkJcGVybWlzc2lvbiA9IChNZXRob2RQZXJtaXNzaW9uKSBwZXJtaXNzaW9ucy5nZXQoaSk7Ci0JCWFsbE1ldGhvZEVsZW1lbnRzLmFkZEFsbChwZXJtaXNzaW9uLmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKSk7IAotCX0KLQlyZXR1cm4gYWxsTWV0aG9kRWxlbWVudHM7Ci19Ci0JCi0KLXB1YmxpYyBMaXN0IGdldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQlMaXN0IGFsbE1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCUxpc3QgdHJhbnNhY3Rpb25zID0gZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0JTWV0aG9kVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb247Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2FjdGlvbnMuc2l6ZSgpOyBpKyspewotCQl0cmFuc2FjdGlvbiA9IChNZXRob2RUcmFuc2FjdGlvbikgdHJhbnNhY3Rpb25zLmdldChpKTsKLQkJYWxsTWV0aG9kRWxlbWVudHMuYWRkQWxsKHRyYW5zYWN0aW9uLmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKSk7IAotCX0KLQlyZXR1cm4gYWxsTWV0aG9kRWxlbWVudHM7Ci19Ci0JCi1wdWJsaWMgU2VjdXJpdHlSb2xlIGdldFNlY3VyaXR5Um9sZU5hbWVkKFN0cmluZyByb2xlTmFtZSkgewotCWphdmEudXRpbC5MaXN0IHRlbXBSb2xlcyA9IGdldFNlY3VyaXR5Um9sZXMoKTsKLQlTZWN1cml0eVJvbGUgcm9sZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBSb2xlcy5zaXplKCk7IGkrKykgewotCQlyb2xlID0gKFNlY3VyaXR5Um9sZSkgdGVtcFJvbGVzLmdldChpKTsKLQkJaWYgKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMocm9sZU5hbWUpKQotCQkJcmV0dXJuIHJvbGU7Ci0JfQotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcgotICovCi1wdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JU2VjdXJpdHlSb2xlIHJvbGUgPSBnZXRTZWN1cml0eVJvbGVOYW1lZChleGlzdGluZ1JvbGVOYW1lKTsKLQlyb2xlLnNldFJvbGVOYW1lKG5ld1JvbGVOYW1lKTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSB7Ci0JCWlmIChtZXRob2RQZXJtaXNzaW9ucyA9PSBudWxsKSB7Ci0JCQltZXRob2RQZXJtaXNzaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TLCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGVybWlzc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UKLQkgKiBiZWFuJ3MgbWV0aG9kIGludm9jYXRpb25zLiAgVGhlIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEKLQkgKiBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUKLQkgKiBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZFRyYW5zYWN0aW9ucygpIHsKLQkJaWYgKG1ldGhvZFRyYW5zYWN0aW9ucyA9PSBudWxsKSB7Ci0JCQltZXRob2RUcmFuc2FjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TLCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFRyYW5zYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUpCSmFyIGdldEVqYkphcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFSkJKYXIpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJKYXIoRUpCSmFyIG5ld0VqYkphcikgewotCQlpZiAobmV3RWpiSmFyICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSICYmIG5ld0VqYkphciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VqYkphcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RWpiSmFyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphcikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SLCBFSkJKYXIuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphciwgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUiwgbmV3RWpiSmFyLCBuZXdFamJKYXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZXMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFeGNsdWRlTGlzdCBnZXRFeGNsdWRlTGlzdCgpIHsKLQkJcmV0dXJuIGV4Y2x1ZGVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IG5ld0V4Y2x1ZGVMaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUV4Y2x1ZGVMaXN0IG9sZEV4Y2x1ZGVMaXN0ID0gZXhjbHVkZUxpc3Q7Ci0JCWV4Y2x1ZGVMaXN0ID0gbmV3RXhjbHVkZUxpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNULCBvbGRFeGNsdWRlTGlzdCwgbmV3RXhjbHVkZUxpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IG5ld0V4Y2x1ZGVMaXN0KSB7Ci0JCWlmIChuZXdFeGNsdWRlTGlzdCAhPSBleGNsdWRlTGlzdCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhjbHVkZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhjbHVkZUxpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhjbHVkZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhjbHVkZUxpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeGNsdWRlTGlzdChuZXdFeGNsdWRlTGlzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVCwgbmV3RXhjbHVkZUxpc3QsIG5ld0V4Y2x1ZGVMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCWlmIChtZXNzYWdlRGVzdGluYXRpb25zID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBlcm1pc3Npb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RUcmFuc2FjdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBlcm1pc3Npb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RUcmFuc2FjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUiwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4Y2x1ZGVMaXN0KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVI6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgRUpCSmFyLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1ZGVMaXN0KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCXJldHVybiBtZXRob2RQZXJtaXNzaW9ucyAhPSBudWxsICYmICFtZXRob2RQZXJtaXNzaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1RSQU5TQUNUSU9OUzoKLQkJCQlyZXR1cm4gbWV0aG9kVHJhbnNhY3Rpb25zICE9IG51bGwgJiYgIW1ldGhvZFRyYW5zYWN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVMaXN0ICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgotCQkJCWdldE1ldGhvZFBlcm1pc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQZXJtaXNzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9UUkFOU0FDVElPTlM6Ci0JCQkJZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RUcmFuc2FjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVDoKLQkJCQlzZXRFeGNsdWRlTGlzdCgoRXhjbHVkZUxpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlnZXRNZXRob2RQZXJtaXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9UUkFOU0FDVElPTlM6Ci0JCQkJZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VYQ0xVREVfTElTVDoKLQkJCQlzZXRFeGNsdWRlTGlzdCgoRXhjbHVkZUxpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIE1ldGhvZEVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jaW5nIEBhbkVKQi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEYXRhKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCWlmIChhbkVKQiAhPSBudWxsKSB7Ci0JCQlyZW1vdmVNZXRob2RQZXJtaXNzaW9uRGF0YShhbkVKQik7Ci0JCQlyZW1vdmVNZXRob2RUcmFuc2FjdGlvbkRhdGEoYW5FSkIpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJlbW92ZSB0aGUgTWV0aG9kRWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNpbmcgQGFuRUpCLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1ldGhvZFBlcm1pc3Npb25EYXRhKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCUxpc3QgbWVzID0gZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKLQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJTWV0aG9kUGVybWlzc2lvbiBtcDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXMuc2l6ZSgpOyBpKyspewotCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgbWVzLmdldChpKTsKLQkJCW1wID0gKE1ldGhvZFBlcm1pc3Npb24pbWUuZUNvbnRhaW5lcigpOwotCQkJaWYgKG1wLmdldE1ldGhvZEVsZW1lbnRzKCkuc2l6ZSgpID09IDEpewotCQkJCUV4dGVuZGVkRWNvcmVVdGlsLmJlY29tZVByb3h5KG1wLCBtcC5lUmVzb3VyY2UoKSk7Ci0JCQkJZ2V0TWV0aG9kUGVybWlzc2lvbnMoKS5yZW1vdmUobXApOwotCQkJfQotCQkJZWxzZXsKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5iZWNvbWVQcm94eShtZSwgbWUuZVJlc291cmNlKCkpOwotCQkJCW1wLmdldE1ldGhvZEVsZW1lbnRzKCkucmVtb3ZlKG1lKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIE1ldGhvZEVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jaW5nIEBhbkVKQi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNZXRob2RUcmFuc2FjdGlvbkRhdGEoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJTGlzdCBtZXMgPSBnZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKLQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJTWV0aG9kVHJhbnNhY3Rpb24gbXQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzLnNpemUoKTsgaSsrKXsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIG1lcy5nZXQoaSk7Ci0JCQltdCA9IChNZXRob2RUcmFuc2FjdGlvbiltZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAobXQuZ2V0TWV0aG9kRWxlbWVudHMoKS5zaXplKCkgPT0gMSl7Ci0JCQkJRXh0ZW5kZWRFY29yZVV0aWwuYmVjb21lUHJveHkobXQsIG10LmVSZXNvdXJjZSgpKTsKLQkJCQlnZXRNZXRob2RUcmFuc2FjdGlvbnMoKS5yZW1vdmUobXQpOwotCQkJfQotCQkJZWxzZXsKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5iZWNvbWVQcm94eShtZSwgbWUuZVJlc291cmNlKCkpOwkKLQkJCQltdC5nZXRNZXRob2RFbGVtZW50cygpLnJlbW92ZShtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVBBdHRyaWJ1dGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVBBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzZiZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ01QQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZSBmaWVsZCBlbGVtZW50IGluY2x1ZGVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQotICovCi1wdWJsaWMgY2xhc3MgQ01QQXR0cmlidXRlSW1wbCBleHRlbmRzIEVBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgQ01QQXR0cmlidXRlLCBFQXR0cmlidXRlewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBKYXZhSGVscGVycyBvcmlnaW5hdGluZ1R5cGU7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBDTVBBdHRyaWJ1dGUgdGFyZ2V0QXR0cmlidXRlOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXJpdmVkOwotCQotCXB1YmxpYyBDTVBBdHRyaWJ1dGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENNUEF0dHJpYnV0ZSgpOwotCX0KLQotcHJvdGVjdGVkIEZpZWxkIGZpbmRFeGlzdGluZ0ZpZWxkKCkgewotCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRFamJDbGFzcygpOwotCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkKLQkJcmV0dXJuIGphdmFDbGFzcy5nZXRGaWVsZEV4dGVuZGVkKGdldE5hbWUoKSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyIGdldEFjY2Vzc29yVHlwZSgpIHsKLQlpZiAoZ2V0RWpiQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCU1ldGhvZCBnZXR0ZXIgPSBnZXRFamJDbGFzcygpLmdldE1ldGhvZEV4dGVuZGVkKGdldEdldHRlck5hbWUoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCWlmIChnZXR0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBnZXR0ZXIuZ2V0UmV0dXJuVHlwZSgpOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldENNUEVudGl0eSgpIHsKLQlyZXR1cm4gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGVDb250YWluZXIoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBFamJDbGFzcyBmcm9tIHRoZSBDTVAgRW50aXR5LgotICovCi0KLXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0RWpiQ2xhc3MoKSB7Ci0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlamIgPSBnZXRDTVBFbnRpdHkoKTsKLQlyZXR1cm4gZWpiID09IG51bGwgPyBudWxsIDogZWpiLmdldEVqYkNsYXNzKCk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgS2V5Q2xhc3MgZnJvbSB0aGUgQ01QIEVudGl0eS4KLSAqLwotCi1wcm90ZWN0ZWQgSmF2YUNsYXNzIGdldEtleUNsYXNzKCkgewotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZWpiID0gZ2V0Q01QRW50aXR5KCk7Ci0JcmV0dXJuIGVqYiA9PSBudWxsID8gbnVsbCA6IGVqYi5nZXRQcmltYXJ5S2V5KCk7Ci19Ci0vKioKLSAqIEBkZXByZWNhdGVkIC0gV2l0aCBFSkIgMi4wLCBhc3N1bWluZyBhIEphdmEgZmllbGQgaXMgbm8gbG9uZ2VyIHNhZmUuCi0gKiAJCVVzZSBnZXRUeXBlKCkgYW5kIGdldE5hbWUoKSB0byBnZXQgdGhlIG1vc3QgY29tbW9uIGZpZWxkIGluZm8uCi0gKgkJT3IgdXNlIGdldEVqYkNsYXNzKCkgdG8gZ2V0IGFkZGl0aW9uYWwgSmF2YSBpbmZvLgotICovCi0KLSBwdWJsaWMgRmllbGQgZ2V0RmllbGQoKSB7Ci0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlamIgPSBnZXRDTVBFbnRpdHkoKTsKLQkKLQlpZihlamIgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0KLQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0Jc3dpdGNoKGVqYi5nZXRWZXJzaW9uSUQoKSkgewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDoKLQkJCWZpZWxkID0gZmluZEV4aXN0aW5nRmllbGQoKTsKLQkJCS8vU2V0IHRoZSBmaWVsZCB0eXBlIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGUgdHlwZSBpZiBuZWNlc3NhcnkKLQkJCWlmIChmaWVsZCAhPSBudWxsICYmIGdldEVUeXBlKCkgIT0gbnVsbCAmJiBmaWVsZC5nZXRFVHlwZSgpID09IG51bGwpCi0JCQkJZmllbGQuc2V0RVR5cGUoZ2V0RVR5cGUoKSk7IAotCQkJYnJlYWs7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDoKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiBkZWZhdWx0OgotCQkJZmllbGQgPSAoKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpKS5nZXRKYXZhUmVmRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci0JCQlmaWVsZC5zZXROYW1lKGdldE5hbWUoKSk7Ci0JCQlmaWVsZC5zZXRFVHlwZShnZXRBY2Nlc3NvclR5cGUoKSk7Ci0JCQlicmVhazsgCi0JfQotCXJldHVybiBmaWVsZDsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0R2V0dGVyTmFtZSgpIHsKLQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigiZ2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYi5hcHBlbmQobmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSkuYXBwZW5kKG5hbWUubGVuZ3RoKCkgPiAxID8gbmFtZS5zdWJzdHJpbmcoMSkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGIudG9TdHJpbmcoKTsKLQl9Ci0JcmV0dXJuIG5hbWU7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpbiBpdHMgb3JpZ2luYWwgZm9ybSAoaS5lLiwgdW53cmFwcGVkIGlmCi0gKiB0aGUgdHlwZSBoYXMgYmVlbiB3cmFwcGVkKS4KLSAqLwotcHVibGljIEphdmFIZWxwZXJzIGdldE9yaWdpbmF0aW5nVHlwZSgpIHsKLQlyZXR1cm4gb3JpZ2luYXRpbmdUeXBlOwotfQotcHVibGljIFN0cmluZyBnZXRTZXR0ZXJOYW1lKCkgewotCXJldHVybiAic2V0IiArIGdldE5hbWUoKS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIChnZXROYW1lKCkubGVuZ3RoKCkgPiAxID8gZ2V0TmFtZSgpLnN1YnN0cmluZygxKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi19Ci1wdWJsaWMgSmF2YUhlbHBlcnMgZ2V0VHlwZSgpIHsKLQlpZiAoZ2V0RVR5cGUoKSAhPSBudWxsKQotCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBnZXRFVHlwZSgpOwotCS8vIEJlIHNlbnNpdGl2ZSB0byBDTVAgMi4wIGJlYW5zLCBnZXQgdHlwZSBmcm9tIGZpZWxkIG9yIGdldCBhY2Nlc3NvciB0eXBlCi0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlamIgPSBnZXRDTVBFbnRpdHkoKTsKLQlSZXNvdXJjZSByZXMgPSBlUmVzb3VyY2UoKTsKLQlib29sZWFuIG1vZEZsYWcgPSByZXMgPT0gbnVsbCA/IGZhbHNlIDogcmVzLmlzTW9kaWZpZWQoKTsKLQlib29sZWFuIGRlbGl2ZXJ5RmxhZyA9IGVEZWxpdmVyKCk7Ci0JdHJ5IHsKLQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQlpZihlamIgIT0gbnVsbCkgewotCQkJc3dpdGNoKGVqYi5nZXRWZXJzaW9uSUQoKSkgewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDoKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQkJCXNldEVUeXBlKGdldFR5cGVGcm9tQmVhbkZpZWxkKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOiBkZWZhdWx0OgotCQkJCQlzZXRFVHlwZShnZXQyMFR5cGUoKSk7Ci0JCQkJCWJyZWFrOyAKLQkJCX0gCi0JCX0KLQl9IGZpbmFsbHkgewotCQllU2V0RGVsaXZlcihkZWxpdmVyeUZsYWcpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSkKLQkJCXJlcy5zZXRNb2RpZmllZChtb2RGbGFnKTsKLQl9Ci0JcmV0dXJuIChKYXZhSGVscGVycykgZ2V0RVR5cGUoKTsKLX0KLXByb3RlY3RlZCBFQ2xhc3NpZmllciBnZXRUeXBlRnJvbUJlYW5GaWVsZCgpIHsKLQlFQ2xhc3NpZmllciB0eXBlID0gbnVsbDsKLQlGaWVsZCBmaWVsZCA9IGdldEZpZWxkKCk7Ci0JaWYgKGZpZWxkICE9IG51bGwpCi0JCXR5cGUgPSBmaWVsZC5nZXRFVHlwZSgpOwotCWlmICh0eXBlID09IG51bGwpCi0JCXR5cGUgPSBnZXRLZXlGaWVsZFR5cGVGcm9tS2V5Q2xhc3MoKTsKLQlyZXR1cm4gdHlwZTsKLX0KLXB1YmxpYyBFQ2xhc3NpZmllciBnZXQyMFR5cGUoKSB7Ci0JRUNsYXNzaWZpZXIgdHlwZSA9IG51bGw7Ci0JaWYgKGdldEVqYkNsYXNzKCkgIT0gbnVsbCkgewotCQlTdHJpbmcgZ2V0dGVyTmFtZSA9IGdldEdldHRlck5hbWUoKTsKLQkJaWYgKGdldHRlck5hbWUgIT0gbnVsbCAmJiBnZXR0ZXJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJTWV0aG9kIGdldHRlciA9IGdldEVqYkNsYXNzKCkuZ2V0TWV0aG9kRXh0ZW5kZWQoZ2V0dGVyTmFtZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCQlpZiAoZ2V0dGVyICE9IG51bGwpCi0JCQkJdHlwZSA9IGdldHRlci5nZXRSZXR1cm5UeXBlKCk7Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgPT0gbnVsbCkKLQkJdHlwZSA9IGdldEtleUZpZWxkVHlwZUZyb21LZXlDbGFzcygpOwotCXJldHVybiB0eXBlOwkKLX0KLS8qKgotICogQHJldHVybgotICovCi1wcml2YXRlIEVDbGFzc2lmaWVyIGdldEtleUZpZWxkVHlwZUZyb21LZXlDbGFzcygpIHsKLQlpZiAoaXNLZXkoKSkgewotCQlKYXZhQ2xhc3Mga2V5ID0gZ2V0Q01QRW50aXR5KCkuZ2V0UHJpbWFyeUtleSgpOwotCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmdldFF1YWxpZmllZE5hbWUoKSAhPSBudWxsICYmICFrZXkuZ2V0UXVhbGlmaWVkTmFtZSgpLnN0YXJ0c1dpdGgoImphdmEubGFuZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpZWxkIGZpZWxkID0ga2V5LmdldEZpZWxkRXh0ZW5kZWQoZ2V0TmFtZSgpKTsKLQkJCWlmIChmaWVsZCAhPSBudWxsKQotCQkJCXJldHVybiBmaWVsZC5nZXRFVHlwZSgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBrZXk7Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIGJvb2xlYW4gaXNDTVJGaWVsZCgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0tleSgpIHsKLQlyZXR1cm4gZ2V0Q01QRW50aXR5KCkgPT0gbnVsbCA/IGZhbHNlIDogZ2V0Q01QRW50aXR5KCkuaXNLZXlBdHRyaWJ1dGUodGhpcyk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzUHJpbUtleUZpZWxkKCl7Ci0JcmV0dXJuIGdldENNUEVudGl0eSgpID09IG51bGwgPyBmYWxzZSA6IGdldENNUEVudGl0eSgpLmdldFByaW1LZXlGaWVsZCgpID09IHRoaXM7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE9yaWdpbmF0aW5nVHlwZShKYXZhSGVscGVycyBuZXdPcmlnaW5hdGluZ1R5cGUpIHsKLQlvcmlnaW5hdGluZ1R5cGUgPSBuZXdPcmlnaW5hdGluZ1R5cGU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgY21yIGZpZWxkLgotCSAqIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBsaXN0IG9mIGRlcGVuZGVudHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1MsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUywgRUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19PUkRFUkVEOgotCQkJCXJldHVybiBpc09yZGVyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fVU5JUVVFOgotCQkJCXJldHVybiBpc1VuaXF1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19VUFBFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VXBwZXJCb3VuZCgpKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fRVRZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gaXNDaGFuZ2VhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX1ZPTEFUSUxFOgotCQkJCXJldHVybiBpc1ZvbGF0aWxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gaXNUcmFuc2llbnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWVMaXRlcmFsKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fVU5TRVRUQUJMRToKLQkJCQlyZXR1cm4gaXNVbnNldHRhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFUklWRUQ6Ci0JCQkJcmV0dXJuIGlzRGVyaXZlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0lEOgotCQkJCXJldHVybiBpc0lEKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RUF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19FQU5OT1RBVElPTlM6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFlQW5ub3RhdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19PUkRFUkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIE9SREVSRURfRUZMQUcpICE9IDApICE9IE9SREVSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fVU5JUVVFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOSVFVRV9FRkxBRykgIT0gMCkgIT0gVU5JUVVFX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBsb3dlckJvdW5kICE9IExPV0VSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EOgotCQkJCXJldHVybiB1cHBlckJvdW5kICE9IFVQUEVSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX01BTlk6Ci0JCQkJcmV0dXJuIGlzTWFueSgpICE9IE1BTllfRURFRkFVTFQ7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19FVFlQRToKLQkJCQlyZXR1cm4gZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19DSEFOR0VBQkxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIENIQU5HRUFCTEVfRUZMQUcpICE9IDApICE9IENIQU5HRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fVk9MQVRJTEU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDApICE9IFZPTEFUSUxFX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDApICE9IFRSQU5TSUVOVF9FREVGQVVMVDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVkFMVUVfTElURVJBTF9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFZhbHVlTGl0ZXJhbCAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfTElURVJBTF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFZhbHVlTGl0ZXJhbCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhnZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fVU5TRVRUQUJMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTlNFVFRBQkxFX0VGTEFHKSAhPSAwKSAhPSBVTlNFVFRBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFUklWRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgREVSSVZFRF9FRkxBRykgIT0gMCkgIT0gREVSSVZFRF9FREVGQVVMVDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fSUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSURfRUZMQUcpICE9IDApICE9IElEX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gYmFzaWNHZXRFQXR0cmlidXRlVHlwZSgpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX09SREVSRUQ6Ci0JCQkJc2V0T3JkZXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQ6Ci0JCQkJc2V0TG93ZXJCb3VuZCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0NIQU5HRUFCTEU6Ci0JCQkJc2V0Q2hhbmdlYWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fVk9MQVRJTEU6Ci0JCQkJc2V0Vm9sYXRpbGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX1RSQU5TSUVOVDoKLQkJCQlzZXRUcmFuc2llbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDoKLQkJCQlzZXREZWZhdWx0VmFsdWVMaXRlcmFsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19VTlNFVFRBQkxFOgotCQkJCXNldFVuc2V0dGFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFUklWRUQ6Ci0JCQkJc2V0RGVyaXZlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fSUQ6Ci0JCQkJc2V0SUQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKE9SREVSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKFVOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EOgotCQkJCXNldExvd2VyQm91bmQoTE9XRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fRVRZUEU6Ci0JCQkJc2V0RVR5cGUoKEVDbGFzc2lmaWVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19DSEFOR0VBQkxFOgotCQkJCXNldENoYW5nZWFibGUoQ0hBTkdFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX1ZPTEFUSUxFOgotCQkJCXNldFZvbGF0aWxlKFZPTEFUSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fVFJBTlNJRU5UOgotCQkJCXNldFRyYW5zaWVudChUUkFOU0lFTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbChERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19VTlNFVFRBQkxFOgotCQkJCXNldFVuc2V0dGFibGUoVU5TRVRUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFUklWRUQ6Ci0JCQkJc2V0RGVyaXZlZChERVJJVkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fSUQ6Ci0JCQkJc2V0SUQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIDo6ICIgKyBnZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGEgdGFyZ2V0QXR0cmlidXRlIGlzIGJlaW5nIHVzZWQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVyaXZlZCgpIHsKLQkJcmV0dXJuIGRlcml2ZWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERlcml2ZWQoYm9vbGVhbiBhQm9vbGVhbikgewotCQlpZiAoYUJvb2xlYW4gJiYgZ2V0RVR5cGUoKSA9PSBudWxsKQotCQkJZ2V0VHlwZSgpOyAvL1RoaXMgZW5zdXJlcyB0aGF0IHRoZSB0eXBlIGlzIHNldC4KLQkJZGVyaXZlZCA9IGFCb29sZWFuOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUkZpZWxkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTU3Nzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUkZpZWxkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mIGEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYSByb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgQ01SRmllbGQ6Om5hbWUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IgbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIENNUkZpZWxkOjp0eXBlIGVsZW1lbnQgaXMgdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBDTVJGaWVsZHMuIEl0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQgKGEgamF2YSBjbGFzcyBuYW1lKS4KLSAqIAotCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVJGaWVsZEltcGwgZXh0ZW5kcyBDTVBBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgQ01SRmllbGQsIENNUEF0dHJpYnV0ZXsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgY29sbGVjdGlvblR5cGUgPSBudWxsOwotCXB1YmxpYyBDTVJGaWVsZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q01SRmllbGQoKTsKLQl9Ci0KLS8qKgotICogY3JlYXRlQ2xhc3NSZWYgLSByZXR1cm4gYSBKYXZhVVJMIHJlZmVyZW5jZSB0byB0aGUgbmFtZWQgSmF2YSBjbGFzcwotICovCi1wdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCWdldENvbGxlY3Rpb25UeXBlKCk7Ci0JcmV0dXJuIGNvbGxlY3Rpb25UeXBlID09IG51bGwgPyBudWxsIDogY29sbGVjdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotfSAgICAgICAgICAKLQotcHVibGljIGJvb2xlYW4gaXNQcmltS2V5RmllbGQoKXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQ01SRmllbGQoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci1wdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uVHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDTVJGaWVsZF9Db2xsZWN0aW9uVHlwZSgpLCBjcmVhdGVDbGFzc1JlZih0eXBlTmFtZSkpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldFJvbGUoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFSkJSZWxhdGlvbnNoaXBSb2xlKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUpIHsKLQkJaWYgKG5ld1JvbGUgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSAmJiBuZXdSb2xlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3Um9sZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3Um9sZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb2xlKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxELCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdSb2xlLCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSwgbmV3Um9sZSwgbmV3Um9sZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0Q29sbGVjdGlvblR5cGUoKSB7Ci0JCWlmIChjb2xsZWN0aW9uVHlwZSAhPSBudWxsICYmIGNvbGxlY3Rpb25UeXBlLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRDb2xsZWN0aW9uVHlwZSA9IGNvbGxlY3Rpb25UeXBlOwotCQkJY29sbGVjdGlvblR5cGUgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCljb2xsZWN0aW9uVHlwZSk7Ci0JCQlpZiAoY29sbGVjdGlvblR5cGUgIT0gb2xkQ29sbGVjdGlvblR5cGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFLCBvbGRDb2xsZWN0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sbGVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldENvbGxlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29sbGVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvblR5cGUoSmF2YUNsYXNzIG5ld0NvbGxlY3Rpb25UeXBlKSB7Ci0JCUphdmFDbGFzcyBvbGRDb2xsZWN0aW9uVHlwZSA9IGNvbGxlY3Rpb25UeXBlOwotCQljb2xsZWN0aW9uVHlwZSA9IG5ld0NvbGxlY3Rpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFLCBvbGRDb2xsZWN0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FQU5OT1RBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBFamJQYWNrYWdlLkNNUl9GSUVMRF9fRUNPTlRBSU5JTkdfQ0xBU1MsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fRUFOTk9UQVRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRWpiUGFja2FnZS5DTVJfRklFTERfX0VDT05UQUlOSU5HX0NMQVNTLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fRUNPTlRBSU5JTkdfQ0xBU1M6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTLCBFQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX09SREVSRUQ6Ci0JCQkJcmV0dXJuIGlzT3JkZXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1VOSVFVRToKLQkJCQlyZXR1cm4gaXNVbmlxdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19MT1dFUl9CT1VORDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1VQUEVSX0JPVU5EOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRVcHBlckJvdW5kKCkpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fTUFOWToKLQkJCQlyZXR1cm4gaXNNYW55KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NIQU5HRUFCTEU6Ci0JCQkJcmV0dXJuIGlzQ2hhbmdlYWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1ZPTEFUSUxFOgotCQkJCXJldHVybiBpc1ZvbGF0aWxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fVFJBTlNJRU5UOgotCQkJCXJldHVybiBpc1RyYW5zaWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFRkFVTFRfVkFMVUVfTElURVJBTDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19VTlNFVFRBQkxFOgotCQkJCXJldHVybiBpc1Vuc2V0dGFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVJJVkVEOgotCQkJCXJldHVybiBpc0Rlcml2ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fSUQ6Ci0JCQkJcmV0dXJuIGlzSUQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FQVRUUklCVVRFX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFQXR0cmlidXRlVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DT0xMRUNUSU9OX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRDb2xsZWN0aW9uVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldENvbGxlY3Rpb25UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fRUFOTk9UQVRJT05TOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZUFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX09SREVSRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgT1JERVJFRF9FRkxBRykgIT0gMCkgIT0gT1JERVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1VOSVFVRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0xPV0VSX0JPVU5EOgotCQkJCXJldHVybiBsb3dlckJvdW5kICE9IExPV0VSX0JPVU5EX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fVVBQRVJfQk9VTkQ6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19NQU5ZOgotCQkJCXJldHVybiBpc01hbnkoKSAhPSBNQU5ZX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0VUWVBFOgotCQkJCXJldHVybiBlVHlwZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBDSEFOR0VBQkxFX0VGTEFHKSAhPSAwKSAhPSBDSEFOR0VBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fVk9MQVRJTEU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDApICE9IFZPTEFUSUxFX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fVFJBTlNJRU5UOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMCkgIT0gVFJBTlNJRU5UX0VERUZBVUxUOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZUxpdGVyYWwgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWYWx1ZUxpdGVyYWwpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVGQVVMVF9WQUxVRToKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhnZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19VTlNFVFRBQkxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFVOU0VUVEFCTEVfRUZMQUcpICE9IDApICE9IFVOU0VUVEFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVJJVkVEOgotCQkJCXJldHVybiAoKGVGbGFncyAmIERFUklWRURfRUZMQUcpICE9IDApICE9IERFUklWRURfRURFRkFVTFQ7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FQ09OVEFJTklOR19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19JRDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJRF9FRkxBRykgIT0gMCkgIT0gSURfRURFRkFVTFQ7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RUF0dHJpYnV0ZVR5cGUoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRToKLQkJCQlyZXR1cm4gZ2V0Um9sZSgpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DT0xMRUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbGxlY3Rpb25UeXBlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19PUkRFUkVEOgotCQkJCXNldE9yZGVyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fVVBQRVJfQk9VTkQ6Ci0JCQkJc2V0VXBwZXJCb3VuZCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0VUWVBFOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ0hBTkdFQUJMRToKLQkJCQlzZXRDaGFuZ2VhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1ZPTEFUSUxFOgotCQkJCXNldFZvbGF0aWxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1RSQU5TSUVOVDoKLQkJCQlzZXRUcmFuc2llbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fVU5TRVRUQUJMRToKLQkJCQlzZXRVbnNldHRhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFUklWRUQ6Ci0JCQkJc2V0RGVyaXZlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19JRDoKLQkJCQlzZXRJRCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEU6Ci0JCQkJc2V0Um9sZSgoRUpCUmVsYXRpb25zaGlwUm9sZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ09MTEVDVElPTl9UWVBFOgotCQkJCXNldENvbGxlY3Rpb25UeXBlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FQU5OT1RBVElPTlM6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fT1JERVJFRDoKLQkJCQlzZXRPcmRlcmVkKE9SREVSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19MT1dFUl9CT1VORDoKLQkJCQlzZXRMb3dlckJvdW5kKExPV0VSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19VUFBFUl9CT1VORDoKLQkJCQlzZXRVcHBlckJvdW5kKFVQUEVSX0JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19FVFlQRToKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fQ0hBTkdFQUJMRToKLQkJCQlzZXRDaGFuZ2VhYmxlKENIQU5HRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX1ZPTEFUSUxFOgotCQkJCXNldFZvbGF0aWxlKFZPTEFUSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19UUkFOU0lFTlQ6Ci0JCQkJc2V0VHJhbnNpZW50KFRSQU5TSUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19VTlNFVFRBQkxFOgotCQkJCXNldFVuc2V0dGFibGUoVU5TRVRUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVSSVZFRDoKLQkJCQlzZXREZXJpdmVkKERFUklWRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0lEOgotCQkJCXNldElEKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRToKLQkJCQlzZXRSb2xlKChFSkJSZWxhdGlvbnNoaXBSb2xlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0NPTExFQ1RJT05fVFlQRToKLQkJCQlzZXRDb2xsZWN0aW9uVHlwZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkNNUEF0dHJpYnV0ZUltcGwjZ2V0Q01QRW50aXR5KCkKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRDTVBFbnRpdHkoKSB7Ci0JCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IGdldFJvbGUoKTsKLQkJaWYgKHJvbGUgIT0gbnVsbCkKLQkJCXJldHVybiByb2xlLmdldFNvdXJjZUVudGl0eSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjk0MjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkV4dGVuc2lvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNjoyODozOSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgaW1wbGVtZW50cyBFSkJFeHRlbnNpb25GaWx0ZXIgewotIAotCi0gICAgLyoqCi0gICAgICogQXR0cmlidXRlRmlsdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZmlsdGVyIG1ldGhvZCBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0IGZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgQ01QQXR0cmlidXRlRmlsdGVycyBvbmx5IG9wZXJhdGUgb24gQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbgotICAgICAqIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZmlsdGVyKEVudGVycHJpc2VCZWFuIGVqYikgewotICAgICAgICBpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpIGVqYikuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHJldHVybiBmaWx0ZXIoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGVqYik7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsdGVyUm9sZUF0dHJpYnV0ZXNCeU5hbWUoTGlzdCBhbGxBdHRyaWJ1dGVzLCBMaXN0IHJvbGVBdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmICghcm9sZUF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbnQgYWxsU2l6ZSwgcm9sZVNpemU7Ci0gICAgICAgICAgICByb2xlU2l6ZSA9IHJvbGVBdHRyaWJ1dGVzLnNpemUoKTsKLSAgICAgICAgICAgIENNUEF0dHJpYnV0ZSByb2xlQXR0LCBhbGxBdHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvbGVTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICByb2xlQXR0ID0gKENNUEF0dHJpYnV0ZSkgcm9sZUF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGFsbFNpemUgPSBhbGxBdHRyaWJ1dGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gYWxsU2l6ZSAtIDE7IGogIT0gLTE7IGotLSkgewotICAgICAgICAgICAgICAgICAgICBhbGxBdHQgPSAoQ01QQXR0cmlidXRlKSBhbGxBdHRyaWJ1dGVzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVBdHQgPT0gYWxsQXR0IHx8IHJvbGVBdHQuZ2V0TmFtZSgpLmVxdWFscyhhbGxBdHQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxsQXR0cmlidXRlcy5yZW1vdmUoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0RWpiTW9kdWxlRXh0SGVscGVyKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKGNvbnRleHQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIG1vZGVsRXh0ZW5kZXIgPSBudWxsOwotICAgICAgICBpZiAoY21wLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpCi0gICAgICAgICAgICByZXR1cm4gY21wLmdldFJvbGVzKCk7Ci0gICAgICAgIGVsc2UgaWYgKCAobW9kZWxFeHRlbmRlciA9IGdldEVqYk1vZHVsZUV4dEhlbHBlcihjbXApKSAhPSBudWxsICl7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWxFeHRlbmRlci5nZXRMb2NhbFJlbGF0aW9uc2hpcFJvbGVzX2NtcDExKGNtcCk7Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRSZWxhdGlvbnNoaXBSb2xlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgeyAKLSAgICAgICAgTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsgCi0gICAgICAgIGNvbGxlY3RSZWxhdGlvbnNoaXBSb2xlcyhjbXAsIGdldEVqYk1vZHVsZUV4dEhlbHBlcihjbXApLCByb2xlcyk7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJvbGVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29sbGVjdFJlbGF0aW9uc2hpcFJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZXh0ZW5zaW9uSGVscGVyLCBMaXN0IGNvbnRhaW5lckxpc3QpIHsKLSAgICAgICAgaWYoY21wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNvbnRhaW5lckxpc3QuYWRkQWxsKGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXMoY21wKSk7Ci0gICAgICAgIGlmKGV4dGVuc2lvbkhlbHBlciAhPSBudWxsKQotICAgICAgICAgICAgY29sbGVjdFJlbGF0aW9uc2hpcFJvbGVzKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBleHRlbnNpb25IZWxwZXIuZ2V0U3VwZXJUeXBlKGNtcCksIGV4dGVuc2lvbkhlbHBlciwgY29udGFpbmVyTGlzdCk7ICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0YTM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCRXh0ZW5zaW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwuQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsIGV4dGVuZHMgRW50aXR5SW1wbCBpbXBsZW1lbnRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjEueCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBFQ2xhc3NpZmllciBmR2VuZXJhdGVkSWRUeXBlID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTX0ZFQVRVUkVfQ0hOR19OT1RJRklFUiA9ICJQZXJzaXN0ZW50RmVhdHVyZUNoYW5nZU5vdGlmaWNhdGlvbkFkYXB0ZXIiOwkgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX01FVEhPRF9OQU1FID0gIlF1ZXJ5TWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkRfQllfUFJJTV9LRVlfTUVUSE9EX05BTUUgPSAiZmluZEJ5UHJpbWFyeUtleSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSA8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFic3RyYWN0U2NoZW1hTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJTVFJBQ1RfU0NIRU1BX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhYnN0cmFjdFNjaGVtYU5hbWUgPSBBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBrZXlBdHRyaWJ1dGVzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyaWVzKCkgPGVtPlF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHF1ZXJpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q01QQXR0cmlidXRlKCkgPGVtPkNNUCBBdHRyaWJ1dGU8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q01QQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY21wQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW1LZXlGaWVsZCgpIDxlbT5QcmltIEtleSBGaWVsZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpbUtleUZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ01QQXR0cmlidXRlIHByaW1LZXlGaWVsZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXR0cmlidXRlRXh0biB3aXRoIGFOYW1lIGFuZCBhZGQgaXQgdG8gdGhlIGtleUZlYXR1cmVzLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMi8yMDAwIDk6MTE6MTMgUE0pCi0gKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotICogQHJldHVybiBDTVBBdHRyaWJ1dGUKLSAqLwotcHVibGljIENNUEF0dHJpYnV0ZSBhZGRLZXlBdHRyaWJ1dGVOYW1lKFN0cmluZyBhTmFtZSkgewotCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKGFOYW1lKTsKLQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJTGlzdCBrZXlzID0gZ2V0S2V5QXR0cmlidXRlcygpOwotCQlDTVBBdHRyaWJ1dGUga2V5OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMuc2l6ZSgpOyBpKyspIHsKLQkJCWtleSA9IChDTVBBdHRyaWJ1dGUpIGtleXMuZ2V0KGkpOwotCQkJaWYgKGFOYW1lLmVxdWFscyhrZXkuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gYXR0cmlidXRlOwotCQl9Ci0JCWtleXMuYWRkKGF0dHJpYnV0ZSk7Ci0JfQotCXJldHVybiBhdHRyaWJ1dGU7Ci19Ci0vKioKLSAqIFJldHVybiBhIExpc3Qgb2Ygb25lIG9mIHRoZSBwcm9wZXJ0aWVzIHVzaW5nIGFGaWx0ZXIuCi0qLwotcHVibGljIExpc3QgZ2V0RmlsdGVyZWRGZWF0dXJlcyhFSkJFeHRlbnNpb25GaWx0ZXIgYUZpbHRlcikgewotCQlyZXR1cm4gYUZpbHRlci5maWx0ZXIodGhpcyk7Ci0JfQotLyoqCi0gKiBBZGQgYSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5hbWUgZm9yIGFGaWVsZC4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzMvMjAwMCA4OjMwOjQyIEFNKQotICogQHBhcmFtIGFGaWVsZCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5GaWVsZAotICogQHJldHVybiBDTVBBdHRyaWJ1dGUKLSAqLwotcHVibGljIENNUEF0dHJpYnV0ZSBhZGRQZXJzaXN0ZW50QXR0cmlidXRlKEZpZWxkIGFGaWVsZCkgewotCWlmIChhRmllbGQgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIGFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVOYW1lKGFGaWVsZC5nZXROYW1lKCkpOwotfQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXR0cmlidXRlRXh0biB3aXRoIGFOYW1lIGFuZCBhZGQgaXQgdG8gdGhlIHBlcnNpc3RlbnRGZWF0dXJlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzIvMjAwMCA5OjExOjEzIFBNKQotICogQHBhcmFtIGFOYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqIEByZXR1cm4gQ01QQXR0cmlidXRlCi0gKi8KLXB1YmxpYyBDTVBBdHRyaWJ1dGUgYWRkUGVyc2lzdGVudEF0dHJpYnV0ZU5hbWUoU3RyaW5nIGFOYW1lKSB7Ci0JQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYU5hbWUpOwotCWlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotCQlhdHRyaWJ1dGUgPSBjcmVhdGVQZXJzaXN0ZW50QXR0cmlidXRlKGFOYW1lKTsKLQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5hZGQoYXR0cmlidXRlKTsKLQl9Ci0JcmV0dXJuIGF0dHJpYnV0ZTsKLX0KLXByb3RlY3RlZCBDTVBBdHRyaWJ1dGUgY3JlYXRlUGVyc2lzdGVudEF0dHJpYnV0ZShTdHJpbmcgYU5hbWUpIHsKLQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkpLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQlhdHRyaWJ1dGUuc2V0TmFtZShhTmFtZSk7Ci0JcmV0dXJuIGF0dHJpYnV0ZTsKLX0KLXB1YmxpYyBMaXN0IGdldEFsbEF2YWlsYWJsZVF1ZXJ5TWV0aG9kcygpIHsKLQlTZXQgc2lncyA9IG5ldyBIYXNoU2V0KCk7Ci0JTGlzdCBqYXZhTWV0aG9kcyA9IGdldEF2YWlsYWJsZVNlbGVjdFF1ZXJ5SmF2YU1ldGhvZHMoKTsKLQlzaWdzLmFkZEFsbChnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhqYXZhTWV0aG9kcykpOwotCWphdmFNZXRob2RzID0gZ2V0QXZhaWxhYmxlTG9jYWxRdWVyeUphdmFNZXRob2RzKCk7Ci0Jc2lncy5hZGRBbGwoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoamF2YU1ldGhvZHMpKTsKLQlqYXZhTWV0aG9kcyA9IGdldEF2YWlsYWJsZVJlbW90ZVF1ZXJ5SmF2YU1ldGhvZHMoKTsKLQlzaWdzLmFkZEFsbChnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhqYXZhTWV0aG9kcykpOwotCUxpc3Qgc2lnbmF0dXJlcyA9IG5ldyBBcnJheUxpc3Qoc2lncyk7Ci0JcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kcyhzaWduYXR1cmVzKTsKLX0KLXByb3RlY3RlZCBMaXN0IGNyZWF0ZVF1ZXJ5TWV0aG9kcyhMaXN0IHNpZ25hdHVyZXMpIHsKLQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCUVudW1lcmF0b3IgZW51bWVyYXRvciA9IE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUw7Ci0JcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKFFVRVJZX01FVEhPRF9OQU1FLCBzaWduYXR1cmVzLCBlbnVtZXJhdG9yKTsKLX0KLQotcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCkgewotCUxpc3QgbWV0aG9kcyA9IGdldEF2YWlsYWJsZVNlbGVjdFF1ZXJ5SmF2YU1ldGhvZHMoKTsKLQlMaXN0IHNpZ3MgPSBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyhtZXRob2RzKTsKLQlyZXR1cm4gY3JlYXRlUXVlcnlNZXRob2RzKHNpZ3MpOwotfQotcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlKYXZhTWV0aG9kcygpIHsKLQlKYXZhQ2xhc3MgYmVhbiA9IGdldEVqYkNsYXNzKCk7Ci0JaWYgKGJlYW4gPT0gbnVsbCkKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JcmV0dXJuIGJlYW4uZ2V0T25seVNwZWNpZmljTWV0aG9kcygiZWpiU2VsZWN0IiwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CSAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUZpbmRRdWVyeU1ldGhvZHMoKSB7Ci0JU2V0IHNpZ3MgPSBuZXcgSGFzaFNldCgpOwotCUxpc3QgamF2YU1ldGhvZHMgPSBnZXRBdmFpbGFibGVSZW1vdGVRdWVyeUphdmFNZXRob2RzKCk7Ci0Jc2lncy5hZGRBbGwoZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoamF2YU1ldGhvZHMpKTsKLQlqYXZhTWV0aG9kcyA9IGdldEF2YWlsYWJsZUxvY2FsUXVlcnlKYXZhTWV0aG9kcygpOwotCXNpZ3MuYWRkQWxsKGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKGphdmFNZXRob2RzKSk7Ci0JTGlzdCBzaWduYXR1cmVzID0gbmV3IEFycmF5TGlzdChzaWdzKTsKLQlyZXR1cm4gY3JlYXRlUXVlcnlNZXRob2RzKHNpZ25hdHVyZXMpOwotfQotcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlTG9jYWxRdWVyeUphdmFNZXRob2RzKCkgewotCXJldHVybiBnZXRBdmFpbGFibGVRdWVyeUphdmFNZXRob2RzKGdldExvY2FsSG9tZUludGVyZmFjZSgpKTsKLX0KLS8qKgotKiBUaGlzIHJldHVybnMgdGhlIENNUCB2ZXJzaW9uIGlkIGJ5IHVzaW5nIHRoZSBtb2R1bGUgaWQgYW5kIHRoZSA8Y21wLXZlcnNpb24+LiAKLSogQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBDTVAgbGV2ZWwKLSogVGhpcyB3aWxsIGhlbHAgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIDIuMCwyLjEsLi4uICAgcmF0aGVyIHRoYW4gIjIueCIKLSovCi1wdWJsaWMgaW50IGdldENNUFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCS8qIElmIHJlc291cmNlIGlzIG51bGwgd2Ugd2lsbCByZXR1cm4gYmFzZWQgb24gQ01QIHZlcnNpb24uLi4uKi8KLQlpZiAocmVzID09IG51bGwpIHsKLQkJaWYgKGdldFZlcnNpb24oKS5lcXVhbHMoQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCkpCi0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ7Ci0JfQotCWludCBjbXBWZXJzaW9uOwotCXN3aXRjaCAocmVzLmdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCA6Ci0JCQlpZiAoZ2V0VmVyc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoVkVSU0lPTl8yX1gpKQotCQkJCWNtcFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEOwotCQkJZWxzZQotCQkJCWNtcFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQkJYnJlYWs7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCA6Ci0JCQkJCWlmIChnZXRWZXJzaW9uKCkuZXF1YWxzSWdub3JlQ2FzZShWRVJTSU9OXzJfWCkpCi0JCQkJCQljbXBWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLQkJCQkJZWxzZQotCQkJCQkJY21wVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCQkJCWJyZWFrOwotCi0JCWRlZmF1bHQgOgotCQkJY21wVmVyc2lvbiA9IHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0JcmV0dXJuIGNtcFZlcnNpb247Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVudGVycHJpc2VCZWFuI2dldFZlcnNpb25JRCgpCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCXJldHVybiBnZXRDTVBWZXJzaW9uSUQoKTsKLX1wcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVSZW1vdGVRdWVyeUphdmFNZXRob2RzKCkgewotCXJldHVybiBnZXRBdmFpbGFibGVRdWVyeUphdmFNZXRob2RzKGdldEhvbWVJbnRlcmZhY2UoKSk7Ci19Ci0KLXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZVF1ZXJ5SmF2YU1ldGhvZHMoSmF2YUNsYXNzIGhvbWUpIHsKLQlpZiAoaG9tZSA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQlMaXN0IGV4Y2x1ZGVkID0gbmV3IEFycmF5TGlzdCgxKTsKLQlleGNsdWRlZC5hZGQoImZpbmRCeVByaW1hcnlLZXkiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBob21lLmdldE9ubHlTcGVjaWZpY01ldGhvZHMoImZpbmQiLCBleGNsdWRlZCk7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHJvdGVjdGVkIEVDbGFzc2lmaWVyIGdldEdlbmVyYXRlZElkVHlwZSgpIHsKLQlpZiAoZkdlbmVyYXRlZElkVHlwZSA9PSBudWxsKSB7Ci0JCWZHZW5lcmF0ZWRJZFR5cGUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoSkFWQV9MQU5HX1NUUklORywgdGhpcyk7Ci0JfQotCXJldHVybiBmR2VuZXJhdGVkSWRUeXBlOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGtleUF0dHJpYnV0ZSB3aXRoIGFOYW1lLgotICogQ3JlYXRpb24gZGF0ZTogKDgvOC8yMDAwIDk6MjU6MjcgUE0pCi0gKiBAcmV0dXJuIEVTdHJ1Y3R1cmFsRmVhdHVyZQotICogQHBhcmFtIGFOYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIENNUEF0dHJpYnV0ZSBnZXRLZXlBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7Ci0JaWYgKGFOYW1lICE9IG51bGwpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRLZXlBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJQ01QQXR0cmlidXRlIG5leHQ7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5leHQgPSAoQ01QQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYU5hbWUuZXF1YWxzKG5leHQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gbmV4dDsKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlIHdpdGggYU5hbWUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC84LzIwMDAgOToyNToyNyBQTSkKLSAqIEByZXR1cm4gRVN0cnVjdHVyYWxGZWF0dXJlCi0gKiBAcGFyYW0gYU5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgQ01QQXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7Ci0JaWYgKGFOYW1lICE9IG51bGwpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUNNUEF0dHJpYnV0ZSBuZXh0OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gKENNUEF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQkJaWYgKGFOYW1lLmVxdWFscyhuZXh0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG5leHQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogSWYgYSBwcmltYXJ5IGtleSBleGlzdHMsIHJldHVybiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGU7IHRoZSBwcmltYXJ5IGtleSBpcyBkZWZpbmVkIGFzIG9uZSBhbmQgb25seSBvbmUKLSAqIGtleSBhdHRyaWJ1dGUsIHdob3NlIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGtleSBjbGFzcwotICogQGRlcHJlY2F0ZWQgdXNlIGdldFByaW1LZXlGaWVsZCgpCi0gKi8KLXB1YmxpYyBDTVBBdHRyaWJ1dGUgZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpIHsKLQlyZXR1cm4gZ2V0UHJpbUtleUZpZWxkKCk7Ci19Ci0KLQotLyoqCi0gKiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzS2V5QXR0cmlidXRlKENNUEF0dHJpYnV0ZSBhbkF0dHJpYnV0ZSkgewotCWphdmEudXRpbC5MaXN0IGF0dHJpYnV0ZXMgPSBnZXRLZXlBdHRyaWJ1dGVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKXsKLQkJaWYgKGF0dHJpYnV0ZXMuZ2V0KGkpID09IGFuQXR0cmlidXRlKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLS8qCi0gKiBSZXR1cm4gd2hldGhlciB0aGlzIGJlYW4gcmVwcmVzZW50cyBhbiBpbnN0YW5jZSBvZiB0aGUgInVua25vd24gcHJpbWFyeSBrZXkiIGNhc2UKLSAqIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoaXMgaXMgaWRlbnRpZmllZCBieSB0aGUgcHJpbWFyeSBrZXkgY2xhc3MKLSAqIGJlaW5nIHNwZWNpZmllZCBhcyAiamF2YS5sYW5nLk9iamVjdCIuCi0gKiBJbiBvcmRlciB0byBkZXBsb3kgYW4gdW5rbm93biBwcmltYXJ5IGtleSBiZWFuLCB3ZSBtdXN0IHN1YnN0aXR1dGUgYSByZWFsIGtleSwKLSAqIGFuZCBhZGQgYSBjb3JyZXNwb25kaW5nIGZpZWxkLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1Vua25vd25QcmltYXJ5S2V5KCkgewotCVN0cmluZyBrZXlOYW1lID0gZ2V0UHJpbWFyeUtleU5hbWUoKTsKLQlpZiAoa2V5TmFtZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy90ZXN0IHdoZXRoZXIgaXQgaXMgdW5rbm93biBvciB3ZSBoYXZlIHRoZSBXQVMgZ2VuZXJhdGVkIGtleSBmb3IgdGhlIHVua25vd24gcHJpbSBrZXkKLQlib29sZWFuIGdlblRlc3QgPSBrZXlOYW1lLmVxdWFscyhVTktOT1dOX1BSSU1BUllfS0VZKSB8fCBrZXlOYW1lLmVxdWFscyhXQVNfR0VORVJBVEVEX1NUUklOR19LRVkpOwotCWlmIChnZW5UZXN0KSByZXR1cm4gdHJ1ZTsKLQkvL0xhc3RseSwgdGVzdCBmb3IgdGhlIGZpbmRCeVByaW1hcnlLZXkoT2JqZWN0KSBtZXRob2Qgb24gdGhlIGhvbWUuCi0JSmF2YUNsYXNzIGhvbWUgPSBnZXRIb21lSW50ZXJmYWNlKCk7Ci0JaWYgKGhvbWUgPT0gbnVsbCkKLQkJaG9tZSA9IGdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCWlmIChob21lID09IG51bGwpIHJldHVybiBmYWxzZTsKLQlMaXN0IHBhcm1UeXBlID0gbmV3IEFycmF5TGlzdCgxKTsKLSAgICBwYXJtVHlwZS5hZGQoVU5LTk9XTl9QUklNQVJZX0tFWSk7Ci0gICAJcmV0dXJuIGhvbWUuZ2V0TWV0aG9kRXh0ZW5kZWQoRklORF9CWV9QUklNX0tFWV9NRVRIT0RfTkFNRSwgcGFybVR5cGUpICE9IG51bGw7Ci19Ci0vKioKLSAqIGlzVmVyc2lvbjFfWCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV9YKCkgewotCXJldHVybiBnZXRWZXJzaW9uKCkuZXF1YWxzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotfQotLyoqCi0gKiBpc1ZlcnNpb24yX1ggbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfWCgpIHsKLQlyZXR1cm4gZ2V0VmVyc2lvbigpLmVxdWFscyhDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YKTsKLX0KLS8qIAotICogbGlzdFBlcnNpc3RlbnRGaWVsZE5hbWVzIC0gcmV0dXJuIHRoZSBuYW1lcyBvZiBvdXIgQ01QIGZpZWxkcy4gZGVyaXZlZCBmcm9tIHBlcnNpc3RlbnRGZWF0dXJlcwotICovCi1wdWJsaWMgU3RyaW5nW10gbGlzdFBlcnNpc3RlbnRGaWVsZE5hbWVzKCkgewotCWphdmEudXRpbC5MaXN0IGF0dHJpYnV0ZXMgPSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1thdHRyaWJ1dGVzLnNpemUoKV07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCW5hbWVzW2ldID0gKChDTVBBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpKS5nZXROYW1lKCk7Ci0JfQotCXJldHVybiBuYW1lczsKLX0KLQotLyoqCi0gKiBSZW1vdmUgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBGaWVsZCdzIG5hbWUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8zLzIwMDAgODozMzowMSBBTSkKLSAqIEBwYXJhbSBhRmllbGQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuRmllbGQKLSAqLwotcHVibGljIENNUEF0dHJpYnV0ZSByZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKEZpZWxkIGFGaWVsZCkgewotCWlmIChhRmllbGQgIT0gbnVsbCkKLQkJcmV0dXJuIHJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoYUZpZWxkLmdldE5hbWUoKSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJlbW92ZSB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lZCBhTmFtZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzIvMjAwMCA4OjU5OjMyIFBNKQotICogQHBhcmFtIGFOYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIENNUEF0dHJpYnV0ZSByZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgewotCWlmIChhTmFtZSAhPSBudWxsKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlDTVBBdHRyaWJ1dGUgbmV4dDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJbmV4dCA9IChDTVBBdHRyaWJ1dGUpIGl0Lm5leHQoKTsKLQkJCWlmIChhTmFtZS5lcXVhbHMobmV4dC5nZXROYW1lKCkpKSB7Ci0JCQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5yZW1vdmUobmV4dCk7Ci0JCQkJcmV0dXJuIG5leHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQkgKiAKLQkgKiBAaW52YXJpYW50IFRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiAxLnggLCAyLngKLQkgKiBAZGVmYXVsdCAyLngKLQkgKiBSZXR1cm5zICIxLngiIGlmIGluIGEgMS4xIEphciAoRm9yIGNvbXBhdGliaWxpdHkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4KLQkgKiAKLQkgKiBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UgaXMgY29tLmFjbWUuY29tbWVyY2UuT3JkZXIgbWlnaHQgYmUgT3JkZXIuCi0JICogCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFic3RyYWN0U2NoZW1hTmFtZSgpIHsKLQkJcmV0dXJuIGFic3RyYWN0U2NoZW1hTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBYnN0cmFjdFNjaGVtYU5hbWUoU3RyaW5nIG5ld0Fic3RyYWN0U2NoZW1hTmFtZSkgewotCQlTdHJpbmcgb2xkQWJzdHJhY3RTY2hlbWFOYW1lID0gYWJzdHJhY3RTY2hlbWFOYW1lOwotCQlhYnN0cmFjdFNjaGVtYU5hbWUgPSBuZXdBYnN0cmFjdFNjaGVtYU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19BQlNUUkFDVF9TQ0hFTUFfTkFNRSwgb2xkQWJzdHJhY3RTY2hlbWFOYW1lLCBhYnN0cmFjdFNjaGVtYU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChDTVBBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QRVJTSVNURU5UX0FUVFJJQlVURVMpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfSkFSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfSkFSLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFF1ZXJpZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fSUNPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudmlyb25tZW50UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VSVklDRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX0pBUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX0pBUiwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJCXJldHVybiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcGVydGllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlRW52UmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVqYkNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEhvbWVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFTU9URV9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2NhbEludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldExvY2FsSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRUVOVFJBTlQ6Ci0JCQkJcmV0dXJuIGlzUmVlbnRyYW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQcmltYXJ5S2V5KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UHJpbWFyeUtleSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJcmV0dXJuIGdldEFic3RyYWN0U2NoZW1hTmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fS0VZX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldFF1ZXJpZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldENNUEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQcmltS2V5RmllbGQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQcmltS2V5RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIExBUkdFX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IGxhcmdlSWNvbiAhPSBudWxsIDogIUxBUkdFX0lDT05fRURFRkFVTFQuZXF1YWxzKGxhcmdlSWNvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZW52aXJvbm1lbnRQcm9wZXJ0aWVzICE9IG51bGwgJiYgIWVudmlyb25tZW50UHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZVJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9SRUZTOgotCQkJCXJldHVybiBlamJSZWZzICE9IG51bGwgJiYgIWVqYlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRW52UmVmcyAhPSBudWxsICYmICFyZXNvdXJjZUVudlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYkxvY2FsUmVmcyAhPSBudWxsICYmICFlamJMb2NhbFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBzZXJ2aWNlUmVmcyAhPSBudWxsICYmICFzZXJ2aWNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGVqYkNsYXNzICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19IT01FX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gaG9tZUludGVyZmFjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gcmVtb3RlSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCXJldHVybiBsb2NhbEhvbWVJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xPQ0FMX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gbG9jYWxJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFRU5UUkFOVDoKLQkJCQlyZXR1cm4gaXNTZXRSZWVudHJhbnQoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1BUllfS0VZOgotCQkJCXJldHVybiBwcmltYXJ5S2V5ICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19BQlNUUkFDVF9TQ0hFTUFfTkFNRToKLQkJCQlyZXR1cm4gQUJTVFJBQ1RfU0NIRU1BX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGFic3RyYWN0U2NoZW1hTmFtZSAhPSBudWxsIDogIUFCU1RSQUNUX1NDSEVNQV9OQU1FX0VERUZBVUxULmVxdWFscyhhYnN0cmFjdFNjaGVtYU5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlcyAhPSBudWxsICYmICFwZXJzaXN0ZW50QXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4ga2V5QXR0cmlidXRlcyAhPSBudWxsICYmICFrZXlBdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIHF1ZXJpZXMgIT0gbnVsbCAmJiAhcXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19DTVBfQVRUUklCVVRFOgotCQkJCXJldHVybiBjbXBBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhY21wQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1fS0VZX0ZJRUxEOgotCQkJCXJldHVybiBwcmltS2V5RmllbGQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudmlyb25tZW50UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0SG9tZUludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRU1PVEVfSU5URVJGQUNFOgotCQkJCXNldFJlbW90ZUludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MT0NBTF9IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXNldExvY2FsSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFRU5UUkFOVDoKLQkJCQlzZXRSZWVudHJhbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJc2V0UHJpbWFyeUtleSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQUJTVFJBQ1RfU0NIRU1BX05BTUU6Ci0JCQkJc2V0QWJzdHJhY3RTY2hlbWFOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BFUlNJU1RFTlRfQVRUUklCVVRFUzoKLQkJCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTOgotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVM6Ci0JCQkJZ2V0UXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fQ01QX0FUVFJJQlVURToKLQkJCQlnZXRDTVBBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldENNUEF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTV9LRVlfRklFTEQ6Ci0JCQkJc2V0UHJpbUtleUZpZWxkKChDTVBBdHRyaWJ1dGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCWdldEVudmlyb25tZW50UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9DTEFTUzoKLQkJCQlzZXRFamJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0hPTUVfSU5URVJGQUNFOgotCQkJCXNldEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRU1PVEVfSU5URVJGQUNFOgotCQkJCXNldFJlbW90ZUludGVyZmFjZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0VKQl9KQVI6Ci0JCQkJc2V0RWpiSmFyKChFSkJKYXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0eSgoU2VjdXJpdHlJZGVudGl0eSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MT0NBTF9IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19SRUVOVFJBTlQ6Ci0JCQkJdW5zZXRSZWVudHJhbnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0FCU1RSQUNUX1NDSEVNQV9OQU1FOgotCQkJCXNldEFic3RyYWN0U2NoZW1hTmFtZShBQlNUUkFDVF9TQ0hFTUFfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUzoKLQkJCQlnZXRLZXlBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTOgotCQkJCWdldFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEU6Ci0JCQkJZ2V0Q01QQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRDoKLQkJCQlzZXRQcmltS2V5RmllbGQoKENNUEF0dHJpYnV0ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFic3RyYWN0U2NoZW1hTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWJzdHJhY3RTY2hlbWFOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldEtleUF0dHJpYnV0ZXNHZW4oKSB7Ci0JCWlmIChrZXlBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWtleUF0dHJpYnV0ZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENNUEF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0tFWV9BVFRSSUJVVEVTKTsKLQkJfQotCQlyZXR1cm4ga2V5QXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0S2V5QXR0cmlidXRlcygpIHsKLQkgICAgaWYoa2V5QXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCSAgICBDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyIHN5bmNBZGFwdGVyID0gKENNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIpICBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHRoaXMsIENNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIuQURBUFRFUl9UWVBFKTsKLQkJCWlmKHN5bmNBZGFwdGVyICE9IG51bGwpIAotCQkJICAgIHN5bmNBZGFwdGVyLmluaXRpYWxpemVLZXlBdHRyaWJ1dGVzKCk7IAotCSAgICB9Ci0JCXJldHVybiBnZXRLZXlBdHRyaWJ1dGVzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFF1ZXJpZXMoKSB7Ci0JCWlmIChxdWVyaWVzID09IG51bGwpIHsKLQkJCXF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChRdWVyeS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1FVRVJJRVMsIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSk7Ci0JCX0KLQkJcmV0dXJuIHF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENNUEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGNtcEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQljbXBBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KENNUEF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX0NNUF9BVFRSSUJVVEUpOwotCQl9Ci0JCXJldHVybiBjbXBBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENNUEF0dHJpYnV0ZSBnZXRQcmltS2V5RmllbGQoKSB7Ci0JCWlmIChwcmltS2V5RmllbGQgIT0gbnVsbCAmJiBwcmltS2V5RmllbGQuZUlzUHJveHkoKSkgewotCQkJQ01QQXR0cmlidXRlIG9sZFByaW1LZXlGaWVsZCA9IHByaW1LZXlGaWVsZDsKLQkJCXByaW1LZXlGaWVsZCA9IChDTVBBdHRyaWJ1dGUpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXByaW1LZXlGaWVsZCk7Ci0JCQlpZiAocHJpbUtleUZpZWxkICE9IG9sZFByaW1LZXlGaWVsZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRCwgb2xkUHJpbUtleUZpZWxkLCBwcmltS2V5RmllbGQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJpbUtleUZpZWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VQcmltS2V5RmllbGRQcm94eSgpIHsKLQkJaWYgKHByaW1LZXlGaWVsZCA9PSBudWxsKSByZXR1cm47Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSBwcmltS2V5RmllbGQuZ2V0TmFtZSgpOwotCQlpZiAoZmllbGROYW1lID09IG51bGwpIGZpZWxkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXByaW1LZXlGaWVsZCA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQkoKEludGVybmFsRU9iamVjdClwcmltS2V5RmllbGQpLmVTZXRQcm94eVVSSShVUkkuY3JlYXRlVVJJKGZpZWxkTmFtZSkpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ01QQXR0cmlidXRlIGJhc2ljR2V0UHJpbUtleUZpZWxkKCkgewotCQlyZXR1cm4gcHJpbUtleUZpZWxkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1LZXlGaWVsZChDTVBBdHRyaWJ1dGUgbmV3UHJpbUtleUZpZWxkKSB7Ci0JCUNNUEF0dHJpYnV0ZSBvbGRQcmltS2V5RmllbGQgPSBwcmltS2V5RmllbGQ7Ci0JCXByaW1LZXlGaWVsZCA9IG5ld1ByaW1LZXlGaWVsZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFlfX1BSSU1fS0VZX0ZJRUxELCBvbGRQcmltS2V5RmllbGQsIHByaW1LZXlGaWVsZCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5I2dldENNUkZpZWxkcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q01SRmllbGRzKCkgewotCQlMaXN0IG15Um9sZXMgPSBnZXRSb2xlcygpOwotCQlMaXN0IGNtckZpZWxkcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmIChteVJvbGVzICE9IG51bGwgJiYgIW15Um9sZXMuaXNFbXB0eSgpKSB7Ci0JCQljbXJGaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBpID0gbXlSb2xlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlID0gKEVKQlJlbGF0aW9uc2hpcFJvbGUpIGkubmV4dCgpOwotCQkJCUNNUkZpZWxkIGZpZWxkID0gcm9sZS5nZXRDbXJGaWVsZCgpOwotCQkJCWlmIChmaWVsZCAhPSBudWxsKQotCQkJCQljbXJGaWVsZHMuYWRkKGZpZWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY21yRmllbGRzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VsZlJlZmVyZW5jaW5nKEVKQlJlbGF0aW9uIHJlbCkgewotCQlpZiAocmVsLmdldFNlY29uZFJvbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHJlbC5nZXRGaXJzdFJvbGUoKS5nZXRTb3VyY2VFbnRpdHkoKSA9PSB0aGlzKSAmJgotCQkJKHJlbC5nZXRTZWNvbmRSb2xlKCkuZ2V0U291cmNlRW50aXR5KCkgPT0gdGhpcyk7Ci0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHkjZ2V0Um9sZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVzKCkgewotCQlpZiAoZ2V0RWpiSmFyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGFsbFJvbGVzID0gZ2V0RWpiSmFyKCkuZ2V0RWpiUmVsYXRpb25zKCk7Ci0JCUxpc3QgbXlSb2xlcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmIChhbGxSb2xlcyAhPSBudWxsICYmICFhbGxSb2xlcy5pc0VtcHR5KCkpIHsKLQkJCW15Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBpID0gYWxsUm9sZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUVKQlJlbGF0aW9uIHJlbCA9IChFSkJSZWxhdGlvbikgaS5uZXh0KCk7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlID0gcmVsLmdldEZpcnN0Um9sZSgpOwotCQkJCWlmIChpc1NlbGZSZWZlcmVuY2luZyhyZWwpKSB7Ci0JCQkJCW15Um9sZXMuYWRkKHJlbC5nZXRGaXJzdFJvbGUoKSk7Ci0JCQkJCW15Um9sZXMuYWRkKHJlbC5nZXRTZWNvbmRSb2xlKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICgocm9sZSAhPSBudWxsKSAmJiByb2xlLmdldFNvdXJjZUVudGl0eSgpID09IHRoaXMpIHsKLQkJCQkJbXlSb2xlcy5hZGQocm9sZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcm9sZSA9IHJlbC5nZXRTZWNvbmRSb2xlKCk7Ci0JCQkJCWlmICgocm9sZSAhPSBudWxsKSAmJiAocm9sZS5nZXRTb3VyY2VFbnRpdHkoKSA9PSB0aGlzKSkKLQkJCQkJCW15Um9sZXMuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbXlSb2xlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eSNnZXRSb2xlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZShTdHJpbmcgcm9sZU5hbWUpIHsKLQkJTGlzdCByb2xlcyA9IGdldFJvbGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxyb2xlcy5zaXplKCk7IGkrKykgewotCQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpcm9sZXMuZ2V0KGkpOwotCQkJaWYgKHJvbGUuZ2V0TmFtZSgpLmVxdWFscyhyb2xlTmFtZSkpCi0JCQkJcmV0dXJuIHJvbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYWFmZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCMjBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5JUm9sZVNoYXBlU3RyYXRlZ3k7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS82LzIwMDAgMTE6NDE6MzMgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5IGV4dGVuZHMgUm9sZVNoYXBlU3RyYXRlZ3kgewotCS8qKgotCSAqIEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVKQjIwRmxhdHRlbmVkUm9sZVNoYXBlU3RyYXRlZ3koQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQlzdXBlcihhUm9sZSk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGNhbkNvbnRpbnVlKCkgewotCQlyZXR1cm4gIWJ1c3kgJiYgcm9sZS5nZXROYW1lKCkgIT0gbnVsbCAmJiAocm9sZS5pc0ZvcndhcmQoKSB8fAotCQkJKHJvbGUuaXNNYW55KCkgJiYgKHJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSA9PSBudWxsIHx8Ci0JCQlyb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCkuaXNNYW55KCkpKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHVzZXNBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlpZiAoYXR0cmlidXRlTmFtZSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBhdHRyaWJ1dGVOYW1lLmluZGV4T2YoSVJvbGVTaGFwZVN0cmF0ZWd5LkFUVFJJQlVURV9OQU1FX0pPSU5FUik7Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCXJldHVybiBnZXRSb2xlKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSb2xlU2hhcGVTdHJhdGVneSNyZWNvbmNpbGVBdHRyaWJ1dGVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUsIFN0cmluZywgTGlzdCwgTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGFMaXN0LCBMaXN0IGNvbXB1dGVkTmFtZXMpIHsKLQkJCi0JCVJlc291cmNlIHJlcyA9IGFSb2xlLmVSZXNvdXJjZSgpOwotCQlib29sZWFuIGRpcnR5RmxhZyA9IHJlcyAhPSBudWxsID8gcmVzLmlzTW9kaWZpZWQoKSA6IGZhbHNlOwotCQl0cnkgewkJCi0JCQlpZiAoYVJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSAhPSBudWxsKSB7Ci0JCQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBhUm9sZS5nZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCQkvLwlDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHJvbGVUeXBlID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24pZ2V0VHlwZUV4dGVuc2lvbihhUm9sZSk7Ci0JCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJY29sbGVjdEF0dHJpYnV0ZXMoZW50aXR5LCBhdHRyaWJ1dGVOYW1lLCBhTGlzdCwgY29tcHV0ZWROYW1lcyk7Ci0JCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQlyZXMuc2V0TW9kaWZpZWQoZGlydHlGbGFnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5GbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneSNzZXREZXJpdmVkQXR0cmlidXRlVHlwZShDTVBBdHRyaWJ1dGUsIEphdmFIZWxwZXJzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERlcml2ZWRBdHRyaWJ1dGVUeXBlKENNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIENNUEF0dHJpYnV0ZSB0YXJnZXRBdHRyaWJ1dGUsIGJvb2xlYW4gaXNOZXcpIHsKLQkJaWYgKHRhcmdldEF0dHJpYnV0ZSA9PSBudWxsKSByZXR1cm47Ci0JCUphdmFIZWxwZXJzIGZpZWxkVHlwZSA9IHRhcmdldEF0dHJpYnV0ZS5nZXRUeXBlKCk7Ci0JCWlmIChmaWVsZFR5cGUgIT0gbnVsbCkgewotCQkJaW50IHNpbmdsZVJvbGVOYW1lU2l6ZSA9IGdldFJvbGUoKS5nZXROYW1lKCkubGVuZ3RoKCkgKyB0YXJnZXRBdHRyaWJ1dGUuZ2V0TmFtZSgpLmxlbmd0aCgpICsgMTsgLy9vbmUgZm9yIHRoZSB1bmRlcnNjb3JlCi0JCQlpZiAoIShhdHRyaWJ1dGUuZ2V0TmFtZSgpLmxlbmd0aCgpID4gc2luZ2xlUm9sZU5hbWVTaXplKSkgLy9kb24ndCBzZXQgdGhlIG9yaWdpbmF0aW5nIHR5cGUgc2luY2Ugd2UgYXJlIGRlcml2ZWQgZnJvbSBhbm90aGVyIGRlcml2ZWQgYXR0cmlidXRlCi0JCQkJYXR0cmlidXRlLnNldE9yaWdpbmF0aW5nVHlwZShmaWVsZFR5cGUpOwotCQkJYXR0cmlidXRlLnNldEVUeXBlKGZpZWxkVHlwZS5nZXRXcmFwcGVyKCkpOwotCQl9Ci0JCWlmIChpc05ldyAmJiAhZ2V0Um9sZSgpLmlzS2V5KCkpCi0JCQlhdHRyaWJ1dGUuc2V0RGVyaXZlZCh0cnVlKTsKLQl9Ci0JLyoqCi0JICogZ2V0RmllbGRzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgdHlwZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgYUxpc3QsIExpc3QgY29tcHV0ZWROYW1lcykgewotCQljb2xsZWN0S2V5TW9kZWxsZWRBdHRyaWJ1dGVzKHR5cGUsIGF0dHJpYnV0ZU5hbWUsIGFMaXN0LCBjb21wdXRlZE5hbWVzKTsKLQkJY29sbGVjdEtleVJvbGVBdHRyaWJ1dGVzKHR5cGUsIGF0dHJpYnV0ZU5hbWUsIGFMaXN0LCBjb21wdXRlZE5hbWVzKTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEF0dHJpYnV0ZXMoQ01QQXR0cmlidXRlIHR5cGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGFMaXN0LCBMaXN0IGNvbXB1dGVkTmFtZXMpIHsKLQkJYm9vbGVhbiBpc05ld0F0dHJpYnV0ZSA9IGZhbHNlOwotCQlhdHRyaWJ1dGVOYW1lID0gYXBwZW5kTmFtZShhdHRyaWJ1dGVOYW1lLCB0eXBlLmdldE5hbWUoKSk7Ci0JCWNvbXB1dGVkTmFtZXMuYWRkKGF0dHJpYnV0ZU5hbWUpOwotCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0Q01QRW50aXR5KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGUgPSBjcmVhdGVQZXJzaXN0ZW50QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCQkJaXNOZXdBdHRyaWJ1dGUgPSB0cnVlOwotCQl9Ci0JCS8vVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGNvZGUgZ2VuZXJhdGlvbgotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSB0eXBlLmVDb250YWluZXIoKTsKLQkJaWYgKGVudGl0eSAhPSBudWxsKQotCQkJc2V0RGVyaXZlZEF0dHJpYnV0ZVR5cGUoYXR0cmlidXRlLCB0eXBlLCBpc05ld0F0dHJpYnV0ZSk7Ci0JCWlmIChpc05ld0F0dHJpYnV0ZSkgewotCQkJaWYgKGdldFJvbGUoKS5pc0tleSgpKQotCQkJCWdldENNUEVudGl0eSgpLmdldEtleUF0dHJpYnV0ZXMoKS5hZGQoYXR0cmlidXRlKTsKLQkJCWFMaXN0LmFkZChhdHRyaWJ1dGUpOwotCQkJZ2V0Q01QRW50aXR5KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5hZGQoYXR0cmlidXRlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghYUxpc3QuY29udGFpbnMoYXR0cmlidXRlKSkKLQkJCQlhTGlzdC5hZGQoYXR0cmlidXRlKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgQ01QQXR0cmlidXRlIGNyZWF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7Ci0JCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQlhdHRyaWJ1dGUuc2V0TmFtZShhTmFtZSk7Ci0JCWF0dHJpYnV0ZS5zZXREZXNjcmlwdGlvbigiR2VuZXJhdGVkIHRvIHN1cHBvcnQgcmVsYXRpb25zaGlwcy4gIERvIE5PVCBkZWxldGUuIik7Ci0JCXJldHVybiBhdHRyaWJ1dGU7Ci0JfQotCS8qKgotCSAqIGdldEZpZWxkcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0S2V5TW9kZWxsZWRBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBpdCA9IGVudGl0eS5nZXRGaWx0ZXJlZEZlYXR1cmVzKE1vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyLnNpbmdsZXRvbigpKS5pdGVyYXRvcigpOwotCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQljb2xsZWN0QXR0cmlidXRlcyhhdHRyaWJ1dGUsIGF0dHJpYnV0ZU5hbWUsIGFMaXN0LCBjb21wdXRlZE5hbWVzKTsKLQkJfQotCX0KLQkvKioKLQkgKiBnZXRGaWVsZHMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEtleVJvbGVBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JCWlmKHZpc2l0ZWRLZXlUeXBlcy5jb250YWlucyhlbnRpdHkpKXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJLZXkgcm9sZSBjeWNsZSBkZXRlY3RlZCIpOwotCQl9Ci0JCXZpc2l0ZWRLZXlUeXBlcy5hZGQoZW50aXR5KTsKLQkJamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gZW50aXR5LmdldEZpbHRlcmVkRmVhdHVyZXMoS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5zaW5nbGV0b24oKSkuaXRlcmF0b3IoKTsKLQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYVJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGF0dE5hbWUgPSBhcHBlbmROYW1lKGF0dHJpYnV0ZU5hbWUsIGFSb2xlLmdldE5hbWUoKSk7Ci0JCQlyZWNvbmNpbGVBdHRyaWJ1dGVzKGFSb2xlLCBhdHROYW1lLCBhTGlzdCwgY29tcHV0ZWROYW1lcyk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0Q01QRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0Um9sZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDY2OTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotCi0vKioKLSAqIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGU7IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZQotICogbmFtZTsgbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkIGVudGVycHJpc2UgYmVhbnM7IGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywgaWYgYW55OyBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yOyBhbmQgYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4KLSAqLwotcHVibGljIGNsYXNzIEVKQkphckltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBFSkJKYXIgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkNsaWVudEphcigpIDxlbT5FamIgQ2xpZW50IEphcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiQ2xpZW50SmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ0xJRU5UX0pBUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVqYkNsaWVudEphciA9IEVKQl9DTElFTlRfSkFSX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcExpc3QgPSBudWxsOwotCXB1YmxpYyBFSkJKYXJJbXBsKCkgewotCQlzdXBlcigpOwotLy8JCXNldFJlZklkKGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZUNvbnN0YW50cy5FSkJKQVJfSUQpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkphcigpOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IENvbnRhaW5lck1hbmFnZWRFbnRpdHkgYmVhbnMgaW4gdGhpcyBqYXIuCi0gKi8KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCUl0ZXJhdG9yIGl0ID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCkuaXRlcmF0b3IoKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4paXQubmV4dCgpOwotCQlpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpZWpiKS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVKQkphcgotICovCi1wdWJsaWMgYm9vbGVhbiBjb250YWluc1NlY3VyaXR5Um9sZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLQlBc3NlbWJseURlc2NyaXB0b3IgYWQgPSBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQlyZXR1cm4gKGFkICE9IG51bGwpICYmIChhZC5nZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lKSAhPSBudWxsKTsKLX0KLS8qKgotICogUmV0dXJuIExpc3Qgb2YgQk1QIGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1wdWJsaWMgTGlzdCBnZXRCZWFuTWFuYWdlZEJlYW5zKCkgewotCUxpc3QgYWxsQmVhbnMsIGJlYW5zOwotCWFsbEJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JaW50IHNpemUgPSBhbGxCZWFucy5zaXplKCk7Ci0JYmVhbnMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCUVudGVycHJpc2VCZWFuIGVqYjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4pIGFsbEJlYW5zLmdldChpKTsKLQkJaWYgKGVqYi5pc0JlYW5NYW5hZ2VkRW50aXR5KCkpCi0JCQliZWFucy5hZGQoZWpiKTsKLQl9Ci0JcmV0dXJuIGJlYW5zOwotfQotLyoqCi0gKiBSZXR1cm4gTGlzdCBvZiBDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW5zIGluIHRoaXMgamFyLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1wdWJsaWMgTGlzdCBnZXRDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0JTGlzdCBjbXBzID0gbmV3IEFycmF5TGlzdChnZXRFbnRlcnByaXNlQmVhbnMoKS5zaXplKCkpOwotCUl0ZXJhdG9yIGl0ID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCkuaXRlcmF0b3IoKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4paXQubmV4dCgpOwotCQlpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpZWpiKS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkKLQkJCWNtcHMuYWRkKGVqYik7Ci0JfQotCXJldHVybiBjbXBzOwotfQotCi0vKioKLSAqIFJldHVybiBMaXN0IG9mIEVKQiAxLjEgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0RUpCMTFDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0JTGlzdCBjbXBzID0gbmV3IEFycmF5TGlzdChnZXRFbnRlcnByaXNlQmVhbnMoKS5zaXplKCkpOwotCUl0ZXJhdG9yIGl0ID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCkuaXRlcmF0b3IoKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4paXQubmV4dCgpOwotCQlpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpZWpiKS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSAmJiBlamIuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCkKLQkJCWNtcHMuYWRkKGVqYik7Ci0JfQotCXJldHVybiBjbXBzOwotfQotCi0vKioKLSAqIFJldHVybiBMaXN0IG9mIEVKQiAyLjAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0RUpCMjBDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0JTGlzdCBjbXBzID0gbmV3IEFycmF5TGlzdChnZXRFbnRlcnByaXNlQmVhbnMoKS5zaXplKCkpOwotCUl0ZXJhdG9yIGl0ID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCkuaXRlcmF0b3IoKTsKLQlFbnRlcnByaXNlQmVhbiBlamI7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4paXQubmV4dCgpOwotCQlpZiAoZWpiLmlzRW50aXR5KCkgJiYgKChFbnRpdHkpZWpiKS5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSAmJiBlamIuZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkKLQkJCWNtcHMuYWRkKGVqYik7Ci0JfQotCXJldHVybiBjbXBzOwotfQotCS8qCi0JICogQHNlZSBFSkJKYXIjZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKSB7Ci0JCUxpc3QgZWpicyA9IGdldEVudGVycHJpc2VCZWFucygpOwotCQlpbnQgc2l6ZSA9IGVqYnMuc2l6ZSgpOwotCQlMaXN0IG1kYnMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlFbnRlcnByaXNlQmVhbiBlamI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQllamIgPSAoRW50ZXJwcmlzZUJlYW4pZWpicy5nZXQoaSk7Ci0JCQlpZiAoZWpiLmlzTWVzc2FnZURyaXZlbigpKQotCQkJCW1kYnMuYWRkKGVqYik7Ci0JCX0KLQkJcmV0dXJuIG1kYnM7Ci0JfQotLyoqCi0gKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVqYlJlbGF0aW9ucyByZWZlcmVuY2VzCi0gKiBBIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotICovCi1wdWJsaWMgTGlzdCBnZXRFamJSZWxhdGlvbnMoKSB7Ci0JcmV0dXJuIGdldFJlbGF0aW9uc2hpcExpc3QoKSA9PSBudWxsID8gbnVsbCA6IGdldFJlbGF0aW9uc2hpcExpc3QoKS5nZXRFamJSZWxhdGlvbnMoKTsKLX0KLS8qKgotICogUmV0dXJuIGFuIGVudGVycHJpc2UgYmVhbiByZWZlcmVuY2VkIGJ5IHRoZSBFamJSZWYsIGlmIG9uZSBleGlzdHMuICBUaGUgZWpiLWxpbmsgdmFsdWUKLSAqIG9mIHRoZSByZWYgbXVzdCBlcXVhdGUgdG8gYSBuYW1lZCBlbnRlcnByaXNlIGJlYW4gY29udGFpbmVkIGluIHRoZSBqYXI7IG90aGVyd2lzZSByZXR1cm4KLSAqIG51bGwKLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycGlzZUJlYW5Gcm9tUmVmKEVqYlJlZiByZWYpIHsKLQlTdHJpbmcgbGluayA9IHJlZi5nZXRMaW5rKCk7Ci0JaWYgKGxpbmsgPT0gbnVsbCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGdldEVudGVycHJpc2VCZWFuTmFtZWQobGluayk7Ci19Ci1wdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChTdHJpbmcgZWpiTmFtZSkgewotCWlmIChlamJOYW1lID09IG51bGwpCi0JCXJldHVybiBudWxsOwotCUVMaXN0IGJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JRW50ZXJwcmlzZUJlYW4gYmVhbjsKLQlmb3IgKGludCBpID0gMDsgaSA8IGJlYW5zLnNpemUoKTsgaSsrKSB7Ci0JCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGJlYW5zLmdldChpKTsKLQkJaWYgKGVqYk5hbWUuZXF1YWxzKGJlYW4uZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBiZWFuOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUmV0dXJuIEFMTCBFbnRlcnByaXNlQmVhbihzKSB0aGF0IGFyZSByZWZlcmVuY2luZyBAYUphdmFDbGFzcyBhcyBhCi0gKiBob21lLCByZW1vdGUsIGJlYW4gY2xhc3MsIG9yIGtleSBjbGFzcy4KLSAqLwotcHVibGljIGphdmEudXRpbC5MaXN0IGdldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQlMaXN0IGJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBiZWFucy5zaXplKCk7IGkrKyl7Ci0JCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGJlYW5zLmdldChpKTsKLQkJaWYgKGJlYW4uaGFzSmF2YVJlZmVyZW5jZShhSmF2YUNsYXNzKSkKLQkJCXJlc3VsdC5hZGQoYmVhbik7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgKkZJUlNUKiBFbnRlcnByaXNlQmVhbiB0aGF0IGlzIHJlZmVyZW5jaW5nIEBhSmF2YUNsYXNzIGFzIGl0cwotICogaG9tZSwgcmVtb3RlLCBiZWFuIGNsYXNzLCBvciBrZXkgY2xhc3MuCi0gKi8KLXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnByaXNlQmVhbldpdGhSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQlMaXN0IGJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBiZWFucy5zaXplKCk7IGkrKyl7Ci0JCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGJlYW5zLmdldChpKTsKLQkJaWYgKGJlYW4uaGFzSmF2YVJlZmVyZW5jZShhSmF2YUNsYXNzKSkKLQkJCXJldHVybiBiZWFuOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUmV0dXJuIExpc3Qgb2YgU2Vzc2lvbiBiZWFucyBpbiB0aGlzIGphci4KLSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLSAqLwotcHVibGljIExpc3QgZ2V0U2Vzc2lvbkJlYW5zKCkgewotCUxpc3QgYWxsQmVhbnMsIGJlYW5zOwotCWFsbEJlYW5zID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JaW50IHNpemUgPSBhbGxCZWFucy5zaXplKCk7Ci0JYmVhbnMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCUVudGVycHJpc2VCZWFuIGVqYjsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQllamIgPSAoRW50ZXJwcmlzZUJlYW4pIGFsbEJlYW5zLmdldChpKTsKLQkJaWYgKGVqYi5pc1Nlc3Npb24oKSkKLQkJCWJlYW5zLmFkZChlamIpOwotCX0KLQlyZXR1cm4gYmVhbnM7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBFSkIgSkFSIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBFSkIgMS4xIGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV8xRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCUVKQlJlc291cmNlIGVqYlJlcyA9IChFSkJSZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JcmV0dXJuIGVqYlJlcy5pc0VKQjFfMSgpOwotfQotLyoqCi0gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgRUpCIEpBUiB3YXMgcG9wdWxhdGVkIGZyb20gYW4gRUpCIDIuMCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfMERlc2NyaXB0b3IoKSAgewotCUNvbW1vblV0aWwuY2hlY2tERE9iamVjdEZvclZlcnNpb24odGhpcyk7Ci0JRUpCUmVzb3VyY2UgZWpiUmVzID0gKEVKQlJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQlyZXR1cm4gZWpiUmVzLmlzRUpCMl8wKCk7Ci19Ci0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVKQkphcgotICovCi1wdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JQXNzZW1ibHlEZXNjcmlwdG9yIGFkID0gZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JaWYgKGFkICE9IG51bGwpCi0JCWFkLnJlbmFtZVNlY3VyaXR5Um9sZShleGlzdGluZ1JvbGVOYW1lLCBuZXdSb2xlTmFtZSk7Ci0JTGlzdCBlamJzID0gZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLnNpemUoKTsgaSsrKSB7Ci0JCUVudGVycHJpc2VCZWFuIGVqYiA9IChFbnRlcnByaXNlQmVhbikgZWpicy5nZXQoaSk7Ci0JCWVqYi5yZVN5bmNTZWN1cml0eVJvbGVSZWYoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotCX0KLX0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlzdXBlci5zZXREaXNwbGF5TmFtZShuZXdEaXNwbGF5TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4gVGhlIERlcGxveWVyIHNob3VsZCBtYWtlIHRoZSBlamItY2xpZW50IEpBUiBmaWxlIGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4gIEV4YW1wbGU6PGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcjwvL2VqYi1jbGllbnQtamFyPgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJDbGllbnRKYXIoKSB7Ci0JCXJldHVybiBlamJDbGllbnRKYXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWpiQ2xpZW50SmFyKFN0cmluZyBuZXdFamJDbGllbnRKYXIpIHsKLQkJU3RyaW5nIG9sZEVqYkNsaWVudEphciA9IGVqYkNsaWVudEphcjsKLQkJZWpiQ2xpZW50SmFyID0gbmV3RWpiQ2xpZW50SmFyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX0VKQl9DTElFTlRfSkFSLCBvbGRFamJDbGllbnRKYXIsIGVqYkNsaWVudEphcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlKMkVFVmVyc2lvblJlc291cmNlIGVqYlJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkJaWYgKGVqYlJlcyA9PSBudWxsKSB7Ci0JCQkvLyBmaXggZGVmZWN0IDMyNzYsIHdoZW4gcmVzb3VyY2UgaXMgdW5sb2FkZWQKLQkJCWlmICh2ZXJzaW9uID09IG51bGwpIAotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi4xIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi4wIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMS4xIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRDsKLQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMS4wIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRDsKLQkJfQotCQlyZXR1cm4gZWpiUmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQkvKioKLQkgKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiWE1MUmVzb3VyY2UgaXMgbnVsbCIpOwotCQlyZXR1cm4gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBvbGRBc3NlbWJseURlc2NyaXB0b3IgPSBhc3NlbWJseURlc2NyaXB0b3I7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvciA9IG5ld0Fzc2VtYmx5RGVzY3JpcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SLCBvbGRBc3NlbWJseURlc2NyaXB0b3IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBhc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhc3NlbWJseURlc2NyaXB0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRUpCX0pBUiwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdBc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzZW1ibHlEZXNjcmlwdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVIsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IobmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yLCBuZXdBc3NlbWJseURlc2NyaXB0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2Ygb25lIG9yIG1vcmUKLQkgKiBlbnRlcnByaXNlIGJlYW5zLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnRlcnByaXNlQmVhbnMoKSB7Ci0JCWlmIChlbnRlcnByaXNlQmVhbnMgPT0gbnVsbCkgewotCQkJZW50ZXJwcmlzZUJlYW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRW50ZXJwcmlzZUJlYW4uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUywgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVIpOwotCQl9Ci0JCXJldHVybiBlbnRlcnByaXNlQmVhbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlbGF0aW9uc2hpcHMgY29sbGVjdGlvbiBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggY29udGFpbmVyIG1hbmFnZWQgcGVyc2lzdGVuY2UgZW50aXR5IGJlYW5zIGFuZCBkZXBlbmRlbnQgb2JqZWN0cyBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYSBsaXN0IG9mIGVqYi1lbnRpdHktcmVmIGVsZW1lbnRzIChyZWZlcmVuY2VzIHRvIGVudGl0eSBiZWFucyB0aGF0IHBhcnRpY2lwYXRlIGluIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMgYnV0IHdob3NlIGFic3RyYWN0IHBlcnNpc3RlbmNlIHNjaGVtYXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgZWpiLWphciBmaWxlKTsKLQkgKiBhbmQgYSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwcyBnZXRSZWxhdGlvbnNoaXBMaXN0KCkgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWxhdGlvbnNoaXBMaXN0KFJlbGF0aW9uc2hpcHMgbmV3UmVsYXRpb25zaGlwTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZWxhdGlvbnNoaXBzIG9sZFJlbGF0aW9uc2hpcExpc3QgPSByZWxhdGlvbnNoaXBMaXN0OwotCQlyZWxhdGlvbnNoaXBMaXN0ID0gbmV3UmVsYXRpb25zaGlwTGlzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVCwgb2xkUmVsYXRpb25zaGlwTGlzdCwgbmV3UmVsYXRpb25zaGlwTGlzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwTGlzdChSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcExpc3QpIHsKLQkJaWYgKG5ld1JlbGF0aW9uc2hpcExpc3QgIT0gcmVsYXRpb25zaGlwTGlzdCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVsYXRpb25zaGlwTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWxhdGlvbnNoaXBMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVIsIFJlbGF0aW9uc2hpcHMuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1JlbGF0aW9uc2hpcExpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVsYXRpb25zaGlwTGlzdCkuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlbGF0aW9uc2hpcExpc3QobmV3UmVsYXRpb25zaGlwTGlzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNULCBuZXdSZWxhdGlvbnNoaXBMaXN0LCBuZXdSZWxhdGlvbnNoaXBMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJCWlmIChhc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhc3NlbWJseURlc2NyaXB0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvcilvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW50ZXJwcmlzZUJlYW5zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJCWlmIChyZWxhdGlvbnNoaXBMaXN0ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVsYXRpb25zaGlwTGlzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JQ09OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJCXJldHVybiBiYXNpY1NldEFzc2VtYmx5RGVzY3JpcHRvcihudWxsLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnRlcnByaXNlQmVhbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmVsYXRpb25zaGlwTGlzdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNUOgotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIExBUkdFX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IGxhcmdlSWNvbiAhPSBudWxsIDogIUxBUkdFX0lDT05fRURFRkFVTFQuZXF1YWxzKGxhcmdlSWNvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVI6Ci0JCQkJcmV0dXJuIEVKQl9DTElFTlRfSkFSX0VERUZBVUxUID09IG51bGwgPyBlamJDbGllbnRKYXIgIT0gbnVsbCA6ICFFSkJfQ0xJRU5UX0pBUl9FREVGQVVMVC5lcXVhbHMoZWpiQ2xpZW50SmFyKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKLQkJCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW5zICE9IG51bGwgJiYgIWVudGVycHJpc2VCZWFucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJcmV0dXJuIHJlbGF0aW9uc2hpcExpc3QgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlzZXRFamJDbGllbnRKYXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlzZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJZ2V0RW50ZXJwcmlzZUJlYW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRlcnByaXNlQmVhbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlzZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKLQkJCQlzZXRFamJDbGllbnRKYXIoRUpCX0NMSUVOVF9KQVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJc2V0QXNzZW1ibHlEZXNjcmlwdG9yKChBc3NlbWJseURlc2NyaXB0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6Ci0JCQkJZ2V0RW50ZXJwcmlzZUJlYW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJc2V0UmVsYXRpb25zaGlwTGlzdCgoUmVsYXRpb25zaGlwcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYkNsaWVudEphcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWpiQ2xpZW50SmFyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0UmVsYXRpb25zaGlwUm9sZShTdHJpbmcgYVJvbGVOYW1lLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IHNvdXJjZUNNUCkgewotCQlpZiAoYVJvbGVOYW1lID09IG51bGwgfHwgc291cmNlQ01QID09IG51bGwpIHJldHVybiBudWxsOwotCQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSBudWxsOwotCQlpZiAoZ2V0UmVsYXRpb25zaGlwTGlzdCgpICE9IG51bGwpIHsKLQkJCUxpc3QgcmVsYXRpb25zID0gZ2V0UmVsYXRpb25zaGlwTGlzdCgpLmdldEVqYlJlbGF0aW9ucygpOwotCQkJaW50IHNpemUgPSByZWxhdGlvbnMuc2l6ZSgpOwotCQkJRUpCUmVsYXRpb24gcmVsID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJcmVsID0gKEVKQlJlbGF0aW9uKSByZWxhdGlvbnMuZ2V0KGkpOwotCQkJCXJvbGUgPSByZWwuZ2V0UmVsYXRpb25zaGlwUm9sZShhUm9sZU5hbWUpOwotCQkJCWlmIChyb2xlICE9IG51bGwgJiYgcm9sZS5nZXRTb3VyY2VFbnRpdHkoKSA9PSBzb3VyY2VDTVApCi0JCQkJCXJldHVybiByb2xlOwkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEVKQlJlbGF0aW9uIGdldEVKQlJlbGF0aW9uKFN0cmluZyBhUmVsYXRpb25OYW1lKSB7Ci0JCVJlbGF0aW9uc2hpcHMgcmVsTGlzdCA9IGdldFJlbGF0aW9uc2hpcExpc3QoKTsKLQkJaWYgKHJlbExpc3QgIT0gbnVsbCkgewotCQkJTGlzdCByZWxzID0gcmVsTGlzdC5nZXRFamJSZWxhdGlvbnMoKTsKLQkJCWludCBzaXplID0gcmVscy5zaXplKCk7Ci0JCQlFSkJSZWxhdGlvbiByZWwgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlyZWwgPSAoRUpCUmVsYXRpb24pIHJlbHMuZ2V0KGkpOwotCQkJCWlmIChyZWwgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJaWYgKGFSZWxhdGlvbk5hbWUuZXF1YWxzKHJlbC5nZXROYW1lKCkpKQotCQkJCQlyZXR1cm4gcmVsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAc2VlIEVKQkphciNnZXRFSkJSZWxhdGlvbnNGb3JTb3VyY2UoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFSkJSZWxhdGlvbnNGb3JTb3VyY2UoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJUmVsYXRpb25zaGlwcyByZWxMaXN0ID0gZ2V0UmVsYXRpb25zaGlwTGlzdCgpOwotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWxMaXN0ICE9IG51bGwpIHsKLQkJCUxpc3QgcmVscyA9IHJlbExpc3QuZ2V0RWpiUmVsYXRpb25zKCk7Ci0JCQlpbnQgc2l6ZSA9IHJlbHMuc2l6ZSgpOwotCQkJRUpCUmVsYXRpb24gcmVsID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJcmVsID0gKEVKQlJlbGF0aW9uKSByZWxzLmdldChpKTsKLQkJCQlpZiAocmVsID09IG51bGwpIGNvbnRpbnVlOwotCQkJCUxpc3Qgcm9sZXMgPSByZWwuZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByb2xlcy5zaXplKCk7IGorKykgewotCQkJCQlyb2xlID0gKEVKQlJlbGF0aW9uc2hpcFJvbGUpIHJvbGVzLmdldChqKTsKLQkJCQkJaWYgKHJvbGUuZ2V0U291cmNlRW50aXR5KCkgPT0gY21wKSB7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcmVzdWx0LmFkZChyZWwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0RUpCUmVsYXRpb25zaGlwUm9sZXNGb3JUeXBlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCVJlbGF0aW9uc2hpcHMgcmVsTGlzdCA9IGdldFJlbGF0aW9uc2hpcExpc3QoKTsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlpZiAocmVsTGlzdCAhPSBudWxsKSB7Ci0JCQlMaXN0IHJlbHMgPSByZWxMaXN0LmdldEVqYlJlbGF0aW9ucygpOwotCQkJaW50IHNpemUgPSByZWxzLnNpemUoKTsKLQkJCUVKQlJlbGF0aW9uIHJlbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXJlbCA9IChFSkJSZWxhdGlvbikgcmVscy5nZXQoaSk7Ci0JCQkJaWYgKHJlbCA9PSBudWxsKSBjb250aW51ZTsKLQkJCQlMaXN0IHJvbGVzID0gcmVsLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9sZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJcm9sZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlKSByb2xlcy5nZXQoaik7Ci0JCQkJCWlmIChjbXAuZXF1YWxzKCgoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgcm9sZSkuZ2V0VHlwZUVudGl0eSgpKSkgewotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJlc3VsdC5hZGQocm9sZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphclJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmU4MjM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphclJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRUpCSmFyUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzFfMSwgImVqYi1qYXJfMV8xLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLkVKQkpBUl9TWVNURU1JRF8yXzAsICJlamItamFyXzJfMC5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5FSkJfSkFSX1NDSEVNQV9MT0NfMl8xLCAiZWpiLWphcl8yXzEueHNkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlbmRlcmVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBFSkJKYXJSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IEVKQlJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgbmV3IEVKQkphclJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRSZWdpc3RlcmVkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSV9PQkopOwotCX0KLQkKLQkvKioKLQkgKiByZWdpc3RlciB1c2luZyB0aGUgZGVmYXVsdCByZW5kZXJlciBmYWN0b3J5LgotCSAqIEBzZWUgI3JlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKCkgewotCQlyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGFSZWdpc3RyeSkgewotCQlhUmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfU0hPUlRfTkFNRSwgbmV3IEVKQkphclJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJNZXRob2RDYXRlZ29yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQk1ldGhvZENhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGZmOGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQk1ldGhvZENhdGVnb3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTWV0aG9kQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLS8qKgotICogVGhlIHZhbGlkIEVKQiBtZXRob2QgY2F0ZWdvcnkgbmFtZXMgYXJlOiBFSkJIT01FTUVUSE9ELCBFSkJDUkVBVEVNRVRIT0QsIEVKQkZJTkRFUk1FVEhPRCwgRUpCUkVNT1RFTUVUSE9ELgotICovCi1wdWJsaWMgY2xhc3MgRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFSkJNZXRob2RDYXRlZ29yeSwgRU9iamVjdCB7Ci0KLQlwdWJsaWMgRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQk1ldGhvZENhdGVnb3J5KCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY4OWZhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci0KLS8qKgotICogVGhlIGVqYi1yZWxhdGlvbiBlbGVtZW50IGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZS4gQW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlcy4gVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0gKiAKLSAqIEBpbnZhcmlhbnQgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0gKiBAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXMuc2l6ZSA9PSAyCi0gKiBAaW52YXJpYW50IHNlbGYucmVsYXRpb25zaGlwUm9sZXNbMF0ubmFtZSAhPSBzZWxmLnJlbGF0aW9uc2hpcFJvbGVzWzFdLm5hbWUKLSAqIAotICogQG1pZ3JhdGlvbiBFSkIxLjEgTW92ZWQgZnJvbSBlamJleHQ6OkVqYlJlbGF0aW9uc2hpcFJvbGUgY29udGFpbmVkIHVuZGVyIGVqYmV4dDo6RUpCSmFyRXh0ZW5zaW9uCi0gKiBAbWlncmF0aW9uIEVKQjEuMSBhZGRlZCBvcHRpb25hbCBhdHRyaWJ1dGUsIGRlc2NyaXB0aW9uOlN0cmluZwotICogQG1pZ3JhdGlvbiBFSkIxLjEgYWRkZWQgb3B0aW9uYWwgYXR0cmlidXRlLCBuYW1lOlN0cmluZyAoTWF5IGhhdmUgYmVlbiBpbmhlcml0ZWQgZnJvbSBFT2JqZWN0IHByZXZpb3VzbHkpCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJSZWxhdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVKQlJlbGF0aW9uLCBFT2JqZWN0LCBDb21tb25SZWxhdGlvbnNoaXB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWxhdGlvbnNoaXBSb2xlcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEVKQlJlbGF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbigpOwotCX0KLQotcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgYVJvbGUpIHsKLQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKS5jb250YWlucyhhUm9sZSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcm9sZXMuCi0gKi8KLXB1YmxpYyBFTGlzdCBnZXRDb21tb25Sb2xlcygpIHsKLQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBmaXJzdCByb2xlLgotICovCi1wdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBnZXRGaXJzdENvbW1vblJvbGUoKSB7Ci0JcmV0dXJuIGdldEZpcnN0Um9sZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGZpcnN0IHJvbGUuCi0gKi8KLXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldEZpcnN0Um9sZSgpIHsKLQlMaXN0IGxpc3QgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotCWlmIChsaXN0LnNpemUoKSA9PSAwKQotCQlyZXR1cm4gbnVsbDsKLQlyZXR1cm4gKEVKQlJlbGF0aW9uc2hpcFJvbGUpIGxpc3QuZ2V0KDApOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG90aGVyIHJvbGUuCi0gKi8KLXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldE9wcG9zaXRlUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JaWYgKGFSb2xlICE9IG51bGwpIHsKLQkJaWYgKGFSb2xlID09IGdldEZpcnN0Um9sZSgpKQotCQkJcmV0dXJuIGdldFNlY29uZFJvbGUoKTsKLQkJaWYgKGFSb2xlID09IGdldFNlY29uZFJvbGUoKSkKLQkJCXJldHVybiBnZXRGaXJzdFJvbGUoKTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgZmlyc3Qgcm9sZS4KLSAqLwotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0U2Vjb25kQ29tbW9uUm9sZSgpIHsKLQlyZXR1cm4gZ2V0U2Vjb25kUm9sZSgpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHNlY29uZCByb2xlLgotICovCi1wdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRTZWNvbmRSb2xlKCkgewotCUxpc3QgbGlzdCA9IGdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JaWYgKGxpc3Quc2l6ZSgpIDwgMikKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIChFSkJSZWxhdGlvbnNoaXBSb2xlKSBsaXN0LmdldCgxKTsKLX0KLS8qKgotICogU2V0IHRoZSBmb3J3YXJkIHJvbGUuICBJbXBsZW1lbnRlZCBieSBlbnN1cmluZyB0aGF0IHRoZSBwYXNzZWQgcm9sZSBpcyB0aGUgZmlyc3Qgcm9sZSAKLSAqIHdoaWNoIGlzIHRoZSAidGllYnJlYWtlciIgaW4gY2FzZSBvZiB1bmNsZWFyIHJlbGF0aW9uc2hpcHMsIHN1Y2ggYXMgMToxLgotICovCi1wdWJsaWMgdm9pZCBzZXRGb3dhcmQoRUpCUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQotCUVMaXN0IHJvbGVzID0gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQlpbnQgY3VycmVudEluZGV4ID0gcm9sZXMuaW5kZXhPZihhUm9sZSk7Ci0JaWYgKGN1cnJlbnRJbmRleCAhPSAwKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPiAtMSkKLQkJCXJvbGVzLm1vdmUoMCwgYVJvbGUpOwotCQllbHNlCi0JCQlyb2xlcy5zZXQoMCwgYVJvbGUpOwotCX0KLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBlamIgcmVsYXRpb24uCi0JICogCi0JICogVGhlIGRlc2NyaXB0aW9uIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIGxpc3Qgb2YgZGVwZW5kZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIElmIHNwZWNpZmllZCwgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0JICogQGludmFyaWFudCBzZWxmLm5hbWUgdW5pcXVlIHdpdGhpbiBTZXQ8Y29sbGVjdChlamJKYXIuZWpiUmVsYXRpb25zLm5hbWUpPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBSZWxhdGlvbnNoaXBzIGdldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVsYXRpb25zaGlwcyllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcExpc3QoUmVsYXRpb25zaGlwcyBuZXdSZWxhdGlvbnNoaXBMaXN0KSB7Ci0JCWlmIChuZXdSZWxhdGlvbnNoaXBMaXN0ICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUICYmIG5ld1JlbGF0aW9uc2hpcExpc3QgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSZWxhdGlvbnNoaXBMaXN0KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdSZWxhdGlvbnNoaXBMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlbGF0aW9uc2hpcExpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUywgUmVsYXRpb25zaGlwcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3UmVsYXRpb25zaGlwTGlzdCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVCwgbmV3UmVsYXRpb25zaGlwTGlzdCwgbmV3UmVsYXRpb25zaGlwTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgY29sbGVjdGlvbiBjb250YWluaW5nIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlcy4KLQkgKiAKLQkgKiBAbWlncmF0aW9uIEVKQjEuMSBDb250YWlubWVudCB1c2VkIHRvIGJlIGJ5IHJlZmVyZW5jZSBvbiByZWxhdGlvbi0tbm93IGJ5IHZhbHVlLgotCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlbGF0aW9uc2hpcFJvbGVzKCkgewotCQlpZiAocmVsYXRpb25zaGlwUm9sZXMgPT0gbnVsbCkgewotCQkJcmVsYXRpb25zaGlwUm9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQKTsKLQkJfQotCQlyZXR1cm4gcmVsYXRpb25zaGlwUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNULCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVsYXRpb25zaGlwUm9sZXMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNULCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVsYXRpb25zaGlwUm9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcExpc3QoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTGlzdCgpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVM6Ci0JCQkJcmV0dXJuIHJlbGF0aW9uc2hpcFJvbGVzICE9IG51bGwgJiYgIXJlbGF0aW9uc2hpcFJvbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1Q6Ci0JCQkJc2V0UmVsYXRpb25zaGlwTGlzdCgoUmVsYXRpb25zaGlwcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCWdldFJlbGF0aW9uc2hpcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZWxhdGlvbnNoaXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVDoKLQkJCQlzZXRSZWxhdGlvbnNoaXBMaXN0KChSZWxhdGlvbnNoaXBzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUzoKLQkJCQlnZXRSZWxhdGlvbnNoaXBSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSZWxhdGlvbnNoaXBSb2xlKFN0cmluZyBhUm9sZU5hbWUpIHsKLQkJaWYgKGFSb2xlTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJTGlzdCByb2xlcyA9IGdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJvbGUgPSAoRUpCUmVsYXRpb25zaGlwUm9sZSkgcm9sZXMuZ2V0KGkpOwotCQkJaWYgKGFSb2xlTmFtZS5lcXVhbHMocm9sZS5nZXROYW1lKCkpKQotCQkJCXJldHVybiByb2xlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25zaGlwUm9sZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmE1MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25zaGlwUm9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5JUm9sZVNoYXBlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklEVXRpbDsKLS8qKgotICogVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGRlc2NyaWJlcyBhIHJvbGUgd2l0aGluIGEgcmVsYXRpb25zaGlwLgotICogVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4gVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOyB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eS1iZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMsIGJvdGggcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgbXVzdCBkZWNsYXJlIGEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgc3BlY2lmaWVzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kIHRoYXQgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcyAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotICogCi0gKiBAaW52YXJpYW50IG11bHRpcGxpY2l0eSAhPSBudWxsCi0gKiBAaW52YXJpYW50IHJvbGVTb3VyY2UgIT0gbnVsbAotICogQGludmFyaWFudCBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgaW4gYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IGluIHdoaWNoIHRoZSByb2xlU291cmNlIGVsZW1lbnQgc3BlY2lmaWVzIGEgZGVwZW5kZW50IG9iamVjdCBjbGFzcy4gCi0gKiBAaW52YXJpYW50IENhc2NhZGUgZGVsZXRlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCUmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyIEVKQlJlbGF0aW9uc2hpcFJvbGUgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotICogCi0gKiBFeGFtcGxlOgotICogPGVqYi1yZWxhdGlvbj4KLSAqICAgPGVqYi1yZWxhdGlvbi1uYW1lPlByb2R1Y3QtTGluZUl0ZW08Ly9lamItcmVsYXRpb24tbmFtZT4KLSAqICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAqICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zPC8vZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gKiAgICAgPG11bHRpcGxpY2l0eT5PbmU8Ly9tdWx0aXBsaWNpdHk+Ci0gKiAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAqICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC8vZWpiLW5hbWU+Ci0gKiAgICAgPC8vcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICogICA8Ly9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gKiAuLi4KLSAqLwotcHVibGljIGNsYXNzIEVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFSkJSZWxhdGlvbnNoaXBSb2xlLCBFT2JqZWN0LCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHsKLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVMaXN0IEVNUFRZX0VMSVNUID0gbmV3IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0KDApOwotCi0JLy8gTmVlZCB0byBjYWNoZSB0aGUgY29tcHV0ZWQgYXR0cmlidXRlcyBzbyB0aGF0IHRoZXkgbWFpbnRhaW4gaWRlbnRpdHkKLQlwcm90ZWN0ZWQgRUxpc3QgZkF0dHJpYnV0ZXMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZk5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBJUm9sZVNoYXBlU3RyYXRlZ3kgcm9sZVNoYXBlU3RyYXRlZ3k7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfU1RSQVRFR1lfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fUk9MRV9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIENsYXNzIENPTU1PTl9ST0xFX0NMQVNTOwotCXByaXZhdGUgc3RhdGljIENsYXNzIFJPTEVfU1RSQVRFR1lfQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3IgUk9MRV9TVFJBVEVHWV9DT05TVFJVQ1RPUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TVUZGSVggPSAiSW52ZXJzZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gdG9TdHJpbmdHdWFyZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZU5hbWUgPSBST0xFX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11bHRpcGxpY2l0eSgpIDxlbT5NdWx0aXBsaWNpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11bHRpcGxpY2l0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlLaW5kIE1VTFRJUExJQ0lUWV9FREVGQVVMVCA9IE11bHRpcGxpY2l0eUtpbmQuT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTXVsdGlwbGljaXR5S2luZCBtdWx0aXBsaWNpdHkgPSBNVUxUSVBMSUNJVFlfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNdWx0aXBsaWNpdHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11bHRpcGxpY2l0eUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVEZWxldGUoKSA8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZURlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfREVMRVRFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlRGVsZXRlID0gQ0FTQ0FERV9ERUxFVEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDYXNjYWRlIERlbGV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlRGVsZXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTb3VyY2Ugc291cmNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ01SRmllbGQgY21yRmllbGQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiB3YXNGb3J3YXJkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHdhc01hbnkgPSBmYWxzZTsKLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gaXNLZXlTZXQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4ga2V5ID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSB0cmFuc2llbnQgQm9vbGVhbiByZXF1aXJlZCA9IG51bGw7Ci0KLQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSBteSBFbnRpdHkgdGhhdCBhcmUgdXNlZAotCSAqIGJ5IHRoaXMgcm9sZS4KLQkgKi8KLQkKLQlwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWZBdHRyaWJ1dGVzID0gbmV3IEJhc2ljRUxpc3QoMSk7Ci0JCX0KLQkJaWYgKGZBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgewotCQkJZ2V0Um9sZVNoYXBlU3RyYXRlZ3koKS5yZWNvbmNpbGVBdHRyaWJ1dGVzKGZBdHRyaWJ1dGVzKTsKLQkJfQotCQlyZXR1cm4gZkF0dHJpYnV0ZXM7Ci0JfQotCS8qKgotCSAqIFJldHVybiBvdXIgcGFyZW50IHJlbGF0aW9uc2hpcCBhcyBhIENvbW1vblJlbGF0aW9uc2hpcAotCSAqLwotCi0JcHVibGljIENvbW1vblJlbGF0aW9uc2hpcCBnZXRDb21tb25SZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiBnZXRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0JcHJvdGVjdGVkIElSb2xlU2hhcGVTdHJhdGVneSBnZXREZWZhdWx0Um9sZVNoYXBlU3RyYXRlZ3koKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElSb2xlU2hhcGVTdHJhdGVneSkgZ2V0Um9sZVN0cmF0ZWd5Q29uc3RydWN0b3IodGhpcykubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgdGhpcyB9KTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRUpCUmVsYXRpb25zaGlwUm9sZUltcGw6Q291bGQgbm90IGluc3RhbnRpYXRlIHJvbGUgc2hhcGUgc3RyYXRlZ3k7IHRoaXMgcmVxdWlyZXMgZXh0ZW5zaW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IodCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBsb2dpY2FsIG5hbWUgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG5hbWluZyB0aGlzIHJvbGUuCi0JICogUmVxdWlyZWQgdG8gYmUgdW5pcXVlIHdpdGhpbiBhIEpBUi4KLQkgKiBJZiBhIGNtci1maWVsZCBpcyBkZWZpbmVkLCB0aGVuIGEgbmFtZSBpbiB0aGUgZm9ybSAlc291cmNlLWVqYi1uYW1lJV8lY21yLWZpZWxkLW5hbWUlIGlzIGNvbXB1dGVkLgotCSAqIE90aGVyd2lzZSBhIGRlZmF1bHQgSUQgaXMgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9naWNhbE5hbWUoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgcXVhbGlmaWVyID0gZ2V0Q21yRmllbGQoKS5nZXROYW1lKCk7Ci0JCWlmIChxdWFsaWZpZXIgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0U291cmNlKCkuZ2V0RW50aXR5QmVhbigpLmdldE5hbWUoKSArICJfIiArIHF1YWxpZmllcjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJLy8gQXBwbHkgYSBkZWZhdWx0IElECi0JCQlyZXN1bHQgPSBJRFV0aWwuZ2V0T3JBc3NpZ25JRCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBuYW1lIGZvciB0aGlzIHJvbGUsIGRlcml2ZWQgZnJvbSB0aGUgQ01SLWZpZWxkIG5hbWUKLQkgKiBVc2VkIHRvIGRldGVybWluZSB0aGUgbmFtZSB1c2VkIGluIHF1ZXJ5aW5nIHRoaXMgcm9sZSBhcyB3ZWxsIGFzIHRoZSBhY2Nlc3NvciBtZXRob2QgbmFtZXMgd2hpY2ggaW1wbGVtZW50IGl0LgotCSAqIE5vdGU6IG1heSByZXR1cm4gdGhlIFhNSSBJRCBmb3Igbm9uLW5hdmlnYWJsZSByb2xlcywgaWUgLSB3aGVyZSB0aGVyZSBpcyBubyBDTVItZmllbGQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZk5hbWUgPT0gbnVsbCkgewotCQkJaWYgKGdldENtckZpZWxkKCkgIT0gbnVsbCkKLQkJCQlmTmFtZSA9IGdldENtckZpZWxkKCkuZ2V0TmFtZSgpOwotCQkJZWxzZSBpZiAoZ2V0T3Bwb3NpdGUoKSAhPSBudWxsKSB7Ci0JCQkJRUpCUmVsYXRpb25zaGlwUm9sZSBvcCA9IGdldE9wcG9zaXRlKCk7Ci0JCQkJaWYgKG9wLmdldENtckZpZWxkKCkgIT0gbnVsbCkKLQkJCQkJZk5hbWUgPSBvcC5nZXRDbXJGaWVsZCgpLmdldE5hbWUoKSArIG9wLmdldFNvdXJjZUVudGl0eSgpLmdldE5hbWUoKSArIE5BTUVfU1VGRklYOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZUdldElkKCkgPT0gbnVsbCkgCi0JCQkJCWVTZXRJZCgpOwotCQkJCWZOYW1lID0gZUdldElkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZOYW1lOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG90aGVyIHJvbGUuCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uc2hpcFJvbGUgZ2V0T3Bwb3NpdGUoKSB7Ci0JCWlmIChnZXRSZWxhdGlvbnNoaXAoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcCgpLmdldE9wcG9zaXRlUm9sZSh0aGlzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgb3RoZXIgcm9sZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBnZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpIHsKLQkJcmV0dXJuIGdldE9wcG9zaXRlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8xNS8yMDAwIDY6NTA6MzAgUE0pCi0JICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLklSb2xlU2hhcGVTdHJhdGVneQotCSAqLwotCXB1YmxpYyBJUm9sZVNoYXBlU3RyYXRlZ3kgZ2V0Um9sZVNoYXBlU3RyYXRlZ3koKSB7Ci0JCWlmIChyb2xlU2hhcGVTdHJhdGVneSA9PSBudWxsKQotCQkJcm9sZVNoYXBlU3RyYXRlZ3kgPSBnZXREZWZhdWx0Um9sZVNoYXBlU3RyYXRlZ3koKTsKLQkJcmV0dXJuIHJvbGVTaGFwZVN0cmF0ZWd5OwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBTb3VyY2UgZWpiCi0JICogQ29tcHV0ZSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB3aGljaCBpcyB0aGUgc291cmNlIG9mIGEgcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0U291cmNlRW50aXR5KCkgewotCQlpZihudWxsID09IGdldFNvdXJjZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0U291cmNlKCkuZ2V0RW50aXR5QmVhbigpOwotCX0KLQkvKioKLQkqIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBpc0ZvcndhcmQgYXR0cmlidXRlCi0JKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHJvbGUgc2hvdWxkIGJlIG1hcHBlZCB0byBhIHBlcnNpc3RlbnQgcmVmZXJlbmNlLCBzdWNoIGFzIGEgZm9yZWlnbiBrZXkuCi0JKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpczoKLQkqIC0gaWYgdGhlIHJvbGUgaXMgbWFueSwgaXQgY2Fubm90IGJlIGZvcndhcmQKLQkqIC0gaWYgdGhlIHJvbGUgaXMgc2luZ2xlIGFuZCBub3QgbmF2aWdhYmxlLCBpdCBjYW5ub3QgYmUgZm9yd2FyZAotCSogLSBhbGwgb3RoZXIgdGhpbmdzIGJlaW5nIGVxdWFsLCB0aGUgZmlyc3Qgcm9sZSBpcyBjb25zaWRlcmVkIHRvIGJlIGZvcndhcmQKLQkqIC0gY2xpZW50cyBjYW4gbWFuaXB1bGF0ZSB0aGlzIGJ5IHNldHRpbmcgYW4gYW1iaWd1b3VzIHJvbGUgdG8gYmUgZndkIChieSBtYW5pcHVsYXRpbmcgdGhlIHJvbGUgb3JkZXIgdW5kZXIgdGhlIGNvdmVycykuCi0JKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcndhcmQoKSB7Ci0JCWlmICh0aGlzLmlzTWFueSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIHdhc0ZvcndhcmQ7Ci0JCWlmIChnZXRPcHBvc2l0ZUFzQ29tbW9uUm9sZSgpLmlzTWFueSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JICAgLy8gaWYgKCF0aGlzLmlzTmF2aWdhYmxlKCkpICByZW1vdmVkIHRvIGFsbG93IG5vbi1uYXZpZ2FibGUgcm9sZSBpbiBrZXkKLQkgICAvLyAgICByZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRSZWxhdGlvbnNoaXAoKSA9PSBudWxsKQotCQkJcmV0dXJuIHdhc0ZvcndhcmQ7Ci0JCXJldHVybiAoZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Rmlyc3RSb2xlKCkgPT0gdGhpcyk7Ci0JfQotCS8qKgotCSogQHJldHVybiBUaGUgY29tcHV0ZWQgdmFsdWUgaXNLZXkKLQkqLwotCXB1YmxpYyBib29sZWFuIGlzS2V5KCkgewotCQlpZiAoaXNLZXlTZXQpCi0JCQlyZXR1cm4ga2V5OwotCQlyZXR1cm4gaXNLZXlGcm9tQXR0cmlidXRlcygpOwotCX0KLSAgICAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleUZyb21BdHRyaWJ1dGVzKCkgewotCQlMaXN0IGxpc3QgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpIGl0Lm5leHQoKTsKLQkJCWlmICghYXR0cmlidXRlLmlzS2V5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBSb2xlIGFzIGJlaW5nIGtleSBzbyBpdCB3aWxsCi0JICogbm90IHRyYXZlcnNlIGl0IGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGtleS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoYm9vbGVhbiBhQm9vbGVhbikgewotCQlrZXkgPSBhQm9vbGVhbjsKLQkJaXNLZXlTZXQgPSB0cnVlOwotCX0gCi0gCi0JLyoqCi0JICogSGFuZHdyaXR0ZW4gdmVyc2lvbiBvZiBpc01hbnkoKToKLQkgKi8KLSAKLSAKLQlwdWJsaWMgYm9vbGVhbiBpc01hbnkoKSAgeyAKLQkJaWYgKGdldE9wcG9zaXRlKCkgPT0gbnVsbCkgCi0JCQkgcmV0dXJuIHdhc01hbnk7ICAKLQkJcmV0dXJuIGdldE9wcG9zaXRlKCkuZ2V0TXVsdGlwbGljaXR5KCkgPT0gTXVsdGlwbGljaXR5S2luZC5NQU5ZX0xJVEVSQUw7ICAKLQl9IAotIAotICAgICAgICAgCi0KLQkvKioKLQkqIEByZXR1cm4gVGhlIGNvbXB1dGVkIHZhbHVlIG9mIHRoZSBpc05hdmlnYWJsZSBhdHRyaWJ1dGUKLQkqIFNwZWNpZmllcyB0aGF0IGFjY2Vzc29ycyBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGlzIHJlbGF0aW9uc2hpcCByb2xlLgotCSogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyB0byB0ZXN0IHdoZXRoZXIgb3Igbm90IGEgQ01SIGZpZWxkIGV4aXN0cy4KLQkqLwotCXB1YmxpYyBib29sZWFuIGlzTmF2aWdhYmxlKCkgewotCQlyZXR1cm4gZ2V0Q21yRmllbGQoKSAhPSBudWxsOwotCX0KLQotCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcygpIHsKLQkJaWYgKGZBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlnZXRSb2xlU2hhcGVTdHJhdGVneSgpLnJlY29uY2lsZUF0dHJpYnV0ZXMoZkF0dHJpYnV0ZXMpOwotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoaXMgcm9sZSB0byBiZSB0aGUgZm9yd2FyZCByb2xlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvd2FyZCgpIHsKLQkJZ2V0UmVsYXRpb25zaGlwKCkuc2V0Rm93YXJkKHRoaXMpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKGphdmEubGFuZy5TdHJpbmcgdW5pcXVlTmFtZSkgewotCQlmTmFtZSA9IHVuaXF1ZU5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh0b1N0cmluZ0d1YXJkKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCXRvU3RyaW5nR3VhcmQgPSB0cnVlOwotCQkJU3RyaW5nIG9wcG9zaXRlVHlwZSA9IGdldE9wcG9zaXRlKCkgIT0gbnVsbCA/IGdldFR5cGVFbnRpdHkoKS5nZXROYW1lKCkgOiAiPDx1bmtub3duPj4iOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0TmFtZSgpICsgIigiICsgb3Bwb3NpdGVUeXBlICsgIikiICsgKGlzTWFueSgpID8gIiAqIiA6ICIgMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS50b1N0cmluZygpOwotCQl9IGZpbmFsbHkgewotCQkJdG9TdHJpbmdHdWFyZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0Q29tbW9uUm9sZUNsYXNzKE9iamVjdCBjYWxsZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQotCQlpZiAoQ09NTU9OX1JPTEVfQ0xBU1MgPT0gbnVsbCkgewotCQkJQ09NTU9OX1JPTEVfQ0xBU1MgPSBsb2FkQ2xhc3MoQ09NTU9OX1JPTEVfQ0xBU1NfTkFNRSwgY2FsbGVyKTsKLQkJfQotCQlyZXR1cm4gQ09NTU9OX1JPTEVfQ0xBU1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBPYmplY3QgY2FsbGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUNsYXNzTG9hZGVyIGNsID0gY2FsbGVyLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJaWYgKGNsICE9IG51bGwpCi0JCQlyZXR1cm4gY2wubG9hZENsYXNzKG5hbWUpOwotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRSb2xlU3RyYXRlZ3lDbGFzcyhPYmplY3QgY2FsbGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChST0xFX1NUUkFURUdZX0NMQVNTID09IG51bGwpCi0JCQlST0xFX1NUUkFURUdZX0NMQVNTID0gbG9hZENsYXNzKFJPTEVfU1RSQVRFR1lfQ0xBU1NfTkFNRSwgY2FsbGVyKTsKLQkJcmV0dXJuIFJPTEVfU1RSQVRFR1lfQ0xBU1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3IgZ2V0Um9sZVN0cmF0ZWd5Q29uc3RydWN0b3IoT2JqZWN0IGNhbGxlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCWlmIChST0xFX1NUUkFURUdZX0NPTlNUUlVDVE9SID09IG51bGwpIHsKLQkJCUNsYXNzW10gcGFybVR5cGVzID0gbmV3IENsYXNzW10geyBnZXRDb21tb25Sb2xlQ2xhc3MoY2FsbGVyKX07Ci0JCQlST0xFX1NUUkFURUdZX0NPTlNUUlVDVE9SID0gZ2V0Um9sZVN0cmF0ZWd5Q2xhc3MoY2FsbGVyKS5nZXRDb25zdHJ1Y3RvcihwYXJtVHlwZXMpOwotCQl9Ci0JCXJldHVybiBST0xFX1NUUkFURUdZX0NPTlNUUlVDVE9SOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgCi0JICogdGhlIGVqYiByZWxhdGlvbnNoaXAgcm9sZS4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlcgotCSAqIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4KLQkgKiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZQotCSAqIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVmaW5lcyBhIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQKLQkgKiByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkUm9sZU5hbWUgPSByb2xlTmFtZTsKLQkJcm9sZU5hbWUgPSBuZXdSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRSwgb2xkUm9sZU5hbWUsIHJvbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE11bHRpcGxpY2l0eUtpbmQgZ2V0TXVsdGlwbGljaXR5KCkgewotCQlyZXR1cm4gbXVsdGlwbGljaXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHlLaW5kIG5ld011bHRpcGxpY2l0eSkgewotCQlNdWx0aXBsaWNpdHlLaW5kIG9sZE11bHRpcGxpY2l0eSA9IG11bHRpcGxpY2l0eTsKLQkJbXVsdGlwbGljaXR5ID0gbmV3TXVsdGlwbGljaXR5ID09IG51bGwgPyBNVUxUSVBMSUNJVFlfRURFRkFVTFQgOiBuZXdNdWx0aXBsaWNpdHk7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGljaXR5RVNldCA9IG11bHRpcGxpY2l0eUVTZXQ7Ci0JCW11bHRpcGxpY2l0eUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZLCBvbGRNdWx0aXBsaWNpdHksIG11bHRpcGxpY2l0eSwgIW9sZE11bHRpcGxpY2l0eUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE11bHRpcGxpY2l0eSgpIHsKLQkJTXVsdGlwbGljaXR5S2luZCBvbGRNdWx0aXBsaWNpdHkgPSBtdWx0aXBsaWNpdHk7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGljaXR5RVNldCA9IG11bHRpcGxpY2l0eUVTZXQ7Ci0JCW11bHRpcGxpY2l0eSA9IE1VTFRJUExJQ0lUWV9FREVGQVVMVDsKLQkJbXVsdGlwbGljaXR5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFksIG9sZE11bHRpcGxpY2l0eSwgTVVMVElQTElDSVRZX0VERUZBVUxULCBvbGRNdWx0aXBsaWNpdHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNdWx0aXBsaWNpdHkoKSB7Ci0JCXJldHVybiBtdWx0aXBsaWNpdHlFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYSBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0JICogZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZiBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUKLQkgKiBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbiBDYXNjYWRlIGRlbGV0ZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuCi0JICogRUpCUmVsYXRpb25zaGlwUm9sZSBjb250YWluZWQgaW4gYW4gRUpCcmVsYXRpb24gaW4gd2hpY2ggdGhlIG90aGVyCi0JICogRUpCUmVsYXRpb25zaGlwUm9sZSBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0JICogCi0JICogCi0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVEZWxldGUoKSB7Ci0JCXJldHVybiBjYXNjYWRlRGVsZXRlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVEZWxldGUoYm9vbGVhbiBuZXdDYXNjYWRlRGVsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZURlbGV0ZSA9IGNhc2NhZGVEZWxldGU7Ci0JCWNhc2NhZGVEZWxldGUgPSBuZXdDYXNjYWRlRGVsZXRlOwotCQlib29sZWFuIG9sZENhc2NhZGVEZWxldGVFU2V0ID0gY2FzY2FkZURlbGV0ZUVTZXQ7Ci0JCWNhc2NhZGVEZWxldGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFLCBvbGRDYXNjYWRlRGVsZXRlLCBjYXNjYWRlRGVsZXRlLCAhb2xkQ2FzY2FkZURlbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHVuc2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQkJYm9vbGVhbiBvbGRDYXNjYWRlRGVsZXRlID0gY2FzY2FkZURlbGV0ZTsKLQkJYm9vbGVhbiBvbGRDYXNjYWRlRGVsZXRlRVNldCA9IGNhc2NhZGVEZWxldGVFU2V0OwotCQljYXNjYWRlRGVsZXRlID0gQ0FTQ0FERV9ERUxFVEVfRURFRkFVTFQ7Ci0JCWNhc2NhZGVEZWxldGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFLCBvbGRDYXNjYWRlRGVsZXRlLCBDQVNDQURFX0RFTEVURV9FREVGQVVMVCwgb2xkQ2FzY2FkZURlbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQkJcmV0dXJuIGNhc2NhZGVEZWxldGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFSkJSZWxhdGlvbiBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEVKQlJlbGF0aW9uKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcChFSkJSZWxhdGlvbiBuZXdDb250YWluZXIpIHsKLQkJaWYgKG5ld0NvbnRhaW5lciA9PSBudWxsICYmIGdldFJlbGF0aW9uc2hpcCgpICE9IG51bGwpIHsKLQkJCXVwZGF0ZUNhY2hlZFNldHRpbmdzKCk7Ci0JCQlFSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCByb2xlT3Bwb3NpdGUgPSAoRUpCUmVsYXRpb25zaGlwUm9sZUltcGwpIGdldE9wcG9zaXRlKCk7Ci0JCQlpZiAocm9sZU9wcG9zaXRlICE9IG51bGwpCi0JCQkJcm9sZU9wcG9zaXRlLnVwZGF0ZUNhY2hlZFNldHRpbmdzKCk7Ci0JCX0gZWxzZQotCQkJd2FzRm9yd2FyZCA9IGZhbHNlOwotCQlzZXRSZWxhdGlvbnNoaXBHZW4obmV3Q29udGFpbmVyKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGUjZ2V0VGFyZ2V0QXR0cmlidXRlTmFtZShvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuQ01QQXR0cmlidXRlKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0QXR0cmlidXRlTmFtZShDTVBBdHRyaWJ1dGUgcm9sZUF0dHJpYnV0ZSkgewotCQlpbnQgcm9sZU5hbWVTaXplID0gZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQlyZXR1cm4gcm9sZUF0dHJpYnV0ZS5nZXROYW1lKCkuc3Vic3RyaW5nKHJvbGVOYW1lU2l6ZSArIDEpOwotCX0KLQkvKioKLQkgKiBNZXRob2QgdXBkYXRlQ2FjaGVkU2V0dGluZ3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGVkU2V0dGluZ3MoKSB7Ci0JCXdhc0ZvcndhcmQgPSBpc0ZvcndhcmQoKTsKLQkJd2FzTWFueSA9IGlzTWFueSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIERlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLQkgKiByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLgotCSAqIEBtaWdyYXRpb24gRUpCMS4xOiB3YXMgaWJtZWpiZXh0OjpFamJSZWxhdGlvbnNoaXBSb2xlOjpzb3VyY2VFSkJOYW1lLCBidXQgdGhhdAotCSAqIG1heSBub3QgYmUgc3VmZmljaWVudCwgYXMgdGhpcyBjYW4gbm93IHJlZmVyIHRvIGRlcGVuZGVudCBjbGFzcyBuYW1lcyBvciBlamIKLQkgKiByZWZzCi0JICovCi0JcHVibGljIFJvbGVTb3VyY2UgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNvdXJjZShSb2xlU291cmNlIG5ld1NvdXJjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSb2xlU291cmNlIG9sZFNvdXJjZSA9IHNvdXJjZTsKLQkJc291cmNlID0gbmV3U291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFLCBvbGRTb3VyY2UsIG5ld1NvdXJjZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFJvbGVTb3VyY2UgbmV3U291cmNlKSB7Ci0JCWlmIChuZXdTb3VyY2UgIT0gc291cmNlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc291cmNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFLCBSb2xlU291cmNlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdTb3VyY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U291cmNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFLCBSb2xlU291cmNlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNvdXJjZShuZXdTb3VyY2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRSwgbmV3U291cmNlLCBuZXdTb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBBIGRlY2xhcmF0aW9uIG9mIHRoZSBDTVJGaWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKLQkgKiByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlCi0JICogCi0JICogQG1pZ3JhdGlvbiBFSkIxLjE6IFVzZWQgdG8gYmUgaGFuZGxlZCB2aWEgaWJtZWpiZXh0OjpFamJSb2xlOjphdHRyaWJ1dGVzIGxpc3QKLQkgKi8KLQlwdWJsaWMgQ01SRmllbGQgZ2V0Q21yRmllbGQoKSB7Ci0JCXJldHVybiBjbXJGaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDbXJGaWVsZChDTVJGaWVsZCBuZXdDbXJGaWVsZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDTVJGaWVsZCBvbGRDbXJGaWVsZCA9IGNtckZpZWxkOwotCQljbXJGaWVsZCA9IG5ld0NtckZpZWxkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxELCBvbGRDbXJGaWVsZCwgbmV3Q21yRmllbGQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENtckZpZWxkKENNUkZpZWxkIG5ld0NtckZpZWxkKSB7Ci0JCWlmIChuZXdDbXJGaWVsZCAhPSBjbXJGaWVsZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY21yRmllbGQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY21yRmllbGQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFLCBDTVJGaWVsZC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3Q21yRmllbGQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q21yRmllbGQpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFLCBDTVJGaWVsZC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDbXJGaWVsZChuZXdDbXJGaWVsZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxELCBuZXdDbXJGaWVsZCwgbmV3Q21yRmllbGQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFOgotCQkJCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc291cmNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRSwgbnVsbCwgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldFNvdXJjZSgoUm9sZVNvdXJjZSlvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCQlpZiAoY21yRmllbGQgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljbXJGaWVsZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19DTVJfRklFTEQsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRDbXJGaWVsZCgoQ01SRmllbGQpb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVAsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0U291cmNlKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q21yRmllbGQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9ST0xFUywgRUpCUmVsYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19NVUxUSVBMSUNJVFk6Ci0JCQkJcmV0dXJuIGdldE11bHRpcGxpY2l0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEU6Ci0JCQkJcmV0dXJuIGlzQ2FzY2FkZURlbGV0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKLQkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXJldHVybiBnZXRDbXJGaWVsZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlyZXR1cm4gUk9MRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyByb2xlTmFtZSAhPSBudWxsIDogIVJPTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMocm9sZU5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZOgotCQkJCXJldHVybiBpc1NldE11bHRpcGxpY2l0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEU6Ci0JCQkJcmV0dXJuIGlzU2V0Q2FzY2FkZURlbGV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQOgotCQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXAoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFOgotCQkJCXJldHVybiBzb3VyY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRDoKLQkJCQlyZXR1cm4gY21yRmllbGQgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ST0xFX05BTUU6Ci0JCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fTVVMVElQTElDSVRZOgotCQkJCXNldE11bHRpcGxpY2l0eSgoTXVsdGlwbGljaXR5S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ0FTQ0FERV9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZURlbGV0ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVA6Ci0JCQkJc2V0UmVsYXRpb25zaGlwKChFSkJSZWxhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoUm9sZVNvdXJjZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXNldENtckZpZWxkKChDTVJGaWVsZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZShST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX01VTFRJUExJQ0lUWToKLQkJCQl1bnNldE11bHRpcGxpY2l0eSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgotCQkJCXVuc2V0Q2FzY2FkZURlbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKLQkJCQlzZXRSZWxhdGlvbnNoaXAoKEVKQlJlbGF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKFJvbGVTb3VyY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fQ01SX0ZJRUxEOgotCQkJCXNldENtckZpZWxkKChDTVJGaWVsZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtdWx0aXBsaWNpdHk6ICIpOwotCQlpZiAobXVsdGlwbGljaXR5RVNldCkgcmVzdWx0LmFwcGVuZChtdWx0aXBsaWNpdHkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlRGVsZXRlOiAiKTsKLQkJaWYgKGNhc2NhZGVEZWxldGVFU2V0KSByZXN1bHQuYXBwZW5kKGNhc2NhZGVEZWxldGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUjZ2V0VHlwZUVudGl0eSgpCi0JICovCi0JcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0VHlwZUVudGl0eSgpIHsKLQkJaWYgKGdldE9wcG9zaXRlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRPcHBvc2l0ZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbW1vblJlbGF0aW9uc2hpcFJvbGUjaXNSZXF1aXJlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJaWYgKHJlcXVpcmVkIT1udWxsKQotCQkJcmV0dXJuIHJlcXVpcmVkLmJvb2xlYW5WYWx1ZSgpOwotCQlyZXR1cm4gaXNLZXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBpc1JlcXVpcmVkIGZsYWcgZm9yIGJvdHRvbSB1cAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gaXNSZXF1aXJlZCkgewotCQlyZXF1aXJlZCA9IGlzUmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwR2VuKEVKQlJlbGF0aW9uIG5ld1JlbGF0aW9uc2hpcCkgewotCQlpZiAobmV3UmVsYXRpb25zaGlwICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCAmJiBuZXdSZWxhdGlvbnNoaXAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSZWxhdGlvbnNoaXApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1JlbGF0aW9uc2hpcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZWxhdGlvbnNoaXApLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfUk9MRVMsIEVKQlJlbGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdSZWxhdGlvbnNoaXAsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUCwgbmV3UmVsYXRpb25zaGlwLCBuZXdSZWxhdGlvbnNoaXApKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlI3NldExvd2VyKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb3dlcihpbnQgbG93ZXJCb3VuZCkgewotCQkvLyBEbyBub3RoaW5nLi4uICBPbmx5IHVwcGVyYm91bmQgaXMgcmVsZXZhbnQgaGVyZQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGUjc2V0VXBwZXIoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwcGVyKGludCB1cHBlckJvdW5kKSB7Ci0JCXN3aXRjaCAodXBwZXJCb3VuZCkgewotCQkJY2FzZSBNdWx0aXBsaWNpdHlLaW5kLk9ORSA6Ci0JCQkJc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQuT05FX0xJVEVSQUwpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQuTUFOWV9MSVRFUkFMKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQkvKioKLQkgIEdldHMgdGhlIE1PRiBYTUkgcmVmIGlkIGZvciB0aGlzIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBlR2V0SWQoKSB7Ci0JCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSllUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZXMuZ2V0SUQodGhpcyk7Ci0JfQotCi0JCi0JLyoqCi0JICogU2V0IGFuZCByZXR1cm4gVGhlIGlkIG9mIHRoaXMgZWxlbWVudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGVTZXRJZCgpIHsKLQotCi0JCUlEVXRpbC5nZXRPckFzc2lnbklEKHRoaXMpOwotCi0JCXJldHVybiBlR2V0SWQoKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiYmNiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkVKQkphclRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBFSkJSZXNvdXJjZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIGFSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBFSkJSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlbmRlcmVyCi0JICovCi0JcHVibGljIEVKQlJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUpCUmVzb3VyY2UjaXNFSkIxXzEoKQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIGdldE1vZHVsZVZlcnNpb25JRCgpIGFuZCBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCMV8xKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCkgPT0gRUpCXzFfMV9JRDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRUpCUmVzb3VyY2UjaXNFSkIyXzAoKQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIGdldE1vZHVsZVZlcnNpb25JRCgpIGFuZCBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCMl8wKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCkgPT0gRUpCXzJfMF9JRDsKLQl9Ci0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBYTUxSZXNvdXJjZS5FSkJfVFlQRTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXREb2N0eXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7Ci0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JCQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX0RPQ1RZUEU7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzFfMTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzFfMTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzJfMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzJfMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXRSb290VHJhbnNsYXRvcigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBFSkJKYXJUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQkKLQkvKiBSZXR1cm4gSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCWRlZmF1bHQgOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIEVKQkphciBnZXRFSkJKYXIoKSB7Ci0JCXJldHVybiAoRUpCSmFyKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpIHsKLQkJcmVuZGVyZXIuc2V0QmF0Y2hNb2RlKGlzQmF0Y2gpOwotCi0JfQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0JCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCQljYXNlIChFSkJfMl8xX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEVKQl8yXzBfSUQpIDoKLQkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoRUpCXzFfMV9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChFSkJfMV8wX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkJCQotCQkJfQotCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCX0KLQkvKgotCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQlzd2l0Y2ggKGlkKSB7Ci0JCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKEVKQl8yXzFfSUQpOwotCQkJCQlicmVhazsKLQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoRUpCXzJfMF9JRCk7Ci0JCQkJCWJyZWFrOwotCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfMV8xX0lEKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gRUpCXzJfMV9JRDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKLQkJRUpCSmFyIGVqYkphciA9IGdldEVKQkphcigpOwotCQlpZiAoZWpiSmFyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcgdmVyc2lvbiA9IGVqYkphci5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBuZXdWZXJzaW9uID0gZ2V0TW9kdWxlVmVyc2lvblN0cmluZygpOwotCQlpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKHZlcnNpb24pKQotCQkJZWpiSmFyLnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCYXRjaE1vZGUoKSB7Ci0JCXJldHVybiByZW5kZXJlci5pc0JhdGNoTW9kZSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkZmI0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFja25vd2xlZGdlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkRlc3RpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJNZXRob2RDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJldHVyblR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLkNNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQWRhcHRlckZhY3RvcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBFamJGYWN0b3J5ewotCXByaXZhdGUgc3RhdGljIExpc3QgQ01QX0FEQVBURVJfRkFDVE9SSUVTID0gbmV3IEFycmF5TGlzdCgxKTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IENNUF9BREFQVEVSX0ZBQ1RPUllfREVTQ1JJUFRPUlMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCXByaXZhdGUgc3RhdGljIExpc3QgRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SSUVTID0gbmV3IEFycmF5TGlzdCgxKTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IEVKQl9SRUxBVElPTl9BREFQVEVSX0ZBQ1RPUllfREVTQ1JJUFRPUlMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCXByaXZhdGUgc3RhdGljIExpc3QgUkVMQVRJT05TSElQU19BREFQVEVSX0ZBQ1RPUklFUyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBSRUxBVElPTlNISVBTX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU1fVkVSU0lPTiA9ICIxLjEiOyAgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVkQWRhcHRlckZhY3RvcmllcyA9IGZhbHNlOwotCi0JcHVibGljIEVqYkZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOyAKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfTUFOQUdFRF9FTlRJVFk6IHJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT046IHJldHVybiBjcmVhdGVNZXRob2RQZXJtaXNzaW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUjogcmV0dXJuIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTjogcmV0dXJuIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTjogcmV0dXJuIGNyZWF0ZVNlc3Npb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFk6IHJldHVybiBjcmVhdGVFbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfTUVUSE9EX0NBVEVHT1JZOiByZXR1cm4gY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSOiByZXR1cm4gY3JlYXRlRUpCSmFyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURTogcmV0dXJuIGNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFM6IHJldHVybiBjcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUlk6IHJldHVybiBjcmVhdGVRdWVyeSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTjogcmV0dXJuIGNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFOiByZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFOiByZXR1cm4gY3JlYXRlUm9sZVNvdXJjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRDogcmV0dXJuIGNyZWF0ZUNNUkZpZWxkKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU46IHJldHVybiBjcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT046IHJldHVybiBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1Q6IHJldHVybiBjcmVhdGVFeGNsdWRlTGlzdCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRDogcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFk6IHJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJRzogcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWcoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEU6IHsKLQkJCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmVzdWx0ID0gVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fVFlQRTogewotCQkJCVRyYW5zYWN0aW9uVHlwZSByZXN1bHQgPSBUcmFuc2FjdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX1RZUEU6IHsKLQkJCQlTZXNzaW9uVHlwZSByZXN1bHQgPSBTZXNzaW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX0tJTkQ6IHsKLQkJCQlNZXRob2RFbGVtZW50S2luZCByZXN1bHQgPSBNZXRob2RFbGVtZW50S2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkFDS05PV0xFREdFX01PREU6IHsKLQkJCQlBY2tub3dsZWRnZU1vZGUgcmVzdWx0ID0gQWNrbm93bGVkZ2VNb2RlLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfS0lORDogewotCQkJCVN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIHJlc3VsdCA9IFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVUVVJOX1RZUEVfTUFQUElORzogewotCQkJCVJldHVyblR5cGVNYXBwaW5nIHJlc3VsdCA9IFJldHVyblR5cGVNYXBwaW5nLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuREVTVElOQVRJT05fVFlQRTogewotCQkJCURlc3RpbmF0aW9uVHlwZSByZXN1bHQgPSBEZXN0aW5hdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5NVUxUSVBMSUNJVFlfS0lORDogewotCQkJCU11bHRpcGxpY2l0eUtpbmQgcmVzdWx0ID0gTXVsdGlwbGljaXR5S2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9UWVBFOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fVFlQRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9LSU5EOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkFDS05PV0xFREdFX01PREU6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfS0lORDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkRFU1RJTkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX0tJTkQ6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLXB1YmxpYyBNZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnQoU3RyaW5nIGFTaWduYXR1cmUpIHsKLQlNZXRob2RFbGVtZW50IG1lID0gY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCW1lLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKGFTaWduYXR1cmUpOwotCXJldHVybiBtZTsKLX0KLS8qKgotICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBNZXRob2RFbGVtZW50IGZyb20gYSBqYXZhIG1ldGhvZC4gICBEZWZhdWx0cyB0aGUgdHlwZSB0byAiVW5zcGVjaWZpZWQiLgotICovCi1wdWJsaWMgTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50RnJvbSgKLQlNZXRob2QgbWV0aG9kKSB7Ci0KLQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JZWxlbWVudC5zZXROYW1lKG1ldGhvZC5nZXROYW1lKCkpOwotCWVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLQotCUphdmFQYXJhbWV0ZXJbXSBwYXJhbXMgPSAKLQkJbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCWlmIChwYXJhbXMubGVuZ3RoID09IDApCi0JCWVsZW1lbnQuYXBwbHlaZXJvUGFyYW1zKCk7Ci0JZWxzZSB7IAotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotCQkJSmF2YUhlbHBlcnMgaGVscGVyID0gKEphdmFIZWxwZXJzKSBwYXJhbXNbaV0uZ2V0RVR5cGUoKTsKLQkJCWVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKGhlbHBlci5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JfQotCXJldHVybiBlbGVtZW50OwotfSAKLS8qKgotICogSGVscGVyIG1ldGhvZCB0byByZWZsZWN0IHRoZSBtZXRob2QgYW5kIGNyZWF0ZSBhIE1ldGhvZEVsZW1lbnQuICBJZiB0aGUgcGFyYW1ldGVyIGlzIG51bGwsIGNyZWF0ZXMgYW4gZWxlbWVudAotICogd2l0aCBhIG5hbWUgb2YgIioiLiAgRGVmYXVsdHMgdGhlIHR5cGUgdG8gIlVuc3BlY2lmaWVkIi4KLSAqLwotcHVibGljIE1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudEZyb20oamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCkgewotCi0JU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QgPT0gbnVsbCA/ICIqIiA6IG1ldGhvZC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQlNZXRob2RFbGVtZW50IG1lID0gY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCW1lLnNldE5hbWUobWV0aG9kTmFtZSk7Ci0JbWUuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJQ2xhc3NbXSB0eXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQltZS5hZGRNZXRob2RQYXJhbXMoZ2V0VHlwZU5hbWUodHlwZXNbaV0pKTsKLQkJfQotCX0KLQlyZXR1cm4gbWU7Ci19Ci1wdWJsaWMgc3RhdGljIEVqYkZhY3RvcnkgZ2V0QWN0aXZlRmFjdG9yeSgpIHsKLQlyZXR1cm4gKEVqYkZhY3RvcnkpIGdldFBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci19Ci0vKgotICogVXRpbGl0eSByb3V0aW5lIHRvIHBhcGVyIG92ZXIgYXJyYXkgdHlwZSBuYW1lcwotICogQm9ycm93ZWQgZnJvbSBhIHBhY2thZ2UtdmlzaWJpbGl0eSBoZWxwZXIgb24gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQKLSAqLwotc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShDbGFzcyB0eXBlKSB7Ci0JaWYgKHR5cGUuaXNBcnJheSgpKSB7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBjbCA9IHR5cGU7Ci0JCQlpbnQgZGltZW5zaW9ucyA9IDA7Ci0JCQl3aGlsZSAoY2wuaXNBcnJheSgpKSB7Ci0JCQkJZGltZW5zaW9ucysrOwotCQkJCWNsID0gY2wuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJfQotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKGNsLmdldE5hbWUoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgewotCQkJCXNiLmFwcGVuZCgiW10iKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsgLypGQUxMVEhSVSovCi0JCX0KLQl9Ci0JcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotfQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGVybWlzc2lvbiBjcmVhdGVNZXRob2RQZXJtaXNzaW9uKCkgewotCQlNZXRob2RQZXJtaXNzaW9uSW1wbCBtZXRob2RQZXJtaXNzaW9uID0gbmV3IE1ldGhvZFBlcm1pc3Npb25JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQZXJtaXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlBc3NlbWJseURlc2NyaXB0b3JJbXBsIGFzc2VtYmx5RGVzY3JpcHRvciA9IG5ldyBBc3NlbWJseURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiBhc3NlbWJseURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1ldGhvZFRyYW5zYWN0aW9uIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCkgewotCQlNZXRob2RUcmFuc2FjdGlvbkltcGwgbWV0aG9kVHJhbnNhY3Rpb24gPSBuZXcgTWV0aG9kVHJhbnNhY3Rpb25JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RUcmFuc2FjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRW50aXR5IGNyZWF0ZUVudGl0eSgpIHsKLQkJRW50aXR5SW1wbCBlbnRpdHkgPSBuZXcgRW50aXR5SW1wbCgpOwotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlHZW4oKSB7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsIGNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBuZXcgQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0JfQotCi0gIAlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotICAJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUdlbigpOwotICAJCWFkYXB0TmV3KGNtcCwgQ01QX0FEQVBURVJfRkFDVE9SSUVTKTsKLSAgCQlhZGRLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyKGNtcCk7Ci0gIAkJcmV0dXJuIGNtcDsKLSAgCX0KLSAgCQotCS8qKgotCSAqIEBwYXJhbSBjbXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkS2V5U3luY2hyb25pemF0aW9uQWRhcHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCQlDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyIGNtcEFkYXB0ZXIgPSBuZXcgQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlcihjbXApOwotCQlBZGFwdGVyIGxvYWRpbmdBZGFwdGVyID0gRXh0ZW5kZWRFY29yZVV0aWwuY3JlYXRlQWRhcHRlckZvckxvYWRpbmcoY21wQWRhcHRlcixjbXApOwotCQljbXAuZUFkYXB0ZXJzKCkuYWRkKGxvYWRpbmdBZGFwdGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENNUEF0dHJpYnV0ZSBjcmVhdGVDTVBBdHRyaWJ1dGUoKSB7Ci0JCUNNUEF0dHJpYnV0ZUltcGwgY21wQXR0cmlidXRlID0gbmV3IENNUEF0dHJpYnV0ZUltcGwoKTsKLQkJcmV0dXJuIGNtcEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ01SRmllbGQgY3JlYXRlQ01SRmllbGQoKSB7Ci0JCUNNUkZpZWxkSW1wbCBjbXJGaWVsZCA9IG5ldyBDTVJGaWVsZEltcGwoKTsKLQkJcmV0dXJuIGNtckZpZWxkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFSkJSZWxhdGlvbnNoaXBSb2xlIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKSB7Ci0JCUVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsIGVqYlJlbGF0aW9uc2hpcFJvbGUgPSBuZXcgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwoKTsKLQkJcmV0dXJuIGVqYlJlbGF0aW9uc2hpcFJvbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQlJlbGF0aW9uIGNyZWF0ZUVKQlJlbGF0aW9uR2VuKCkgewotCQlFSkJSZWxhdGlvbkltcGwgZWpiUmVsYXRpb24gPSBuZXcgRUpCUmVsYXRpb25JbXBsKCk7Ci0JCXJldHVybiBlamJSZWxhdGlvbjsKLQl9Ci0KLSAgCXB1YmxpYyBFSkJSZWxhdGlvbiBjcmVhdGVFSkJSZWxhdGlvbigpIHsKLSAgCQlFSkJSZWxhdGlvbiByZWwgPSBjcmVhdGVFSkJSZWxhdGlvbkdlbigpOwotICAJCWFkYXB0TmV3KHJlbCwgRUpCX1JFTEFUSU9OX0FEQVBURVJfRkFDVE9SSUVTKTsKLSAgCQlyZXR1cm4gcmVsOwotICAJfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFJlbGF0aW9uc2hpcHMgY3JlYXRlUmVsYXRpb25zaGlwc0dlbigpIHsKLQkJUmVsYXRpb25zaGlwc0ltcGwgcmVsYXRpb25zaGlwcyA9IG5ldyBSZWxhdGlvbnNoaXBzSW1wbCgpOwotCQlyZXR1cm4gcmVsYXRpb25zaGlwczsKLQl9Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwcyBjcmVhdGVSZWxhdGlvbnNoaXBzKCkgewotCQlSZWxhdGlvbnNoaXBzIHJlbCA9IGNyZWF0ZVJlbGF0aW9uc2hpcHNHZW4oKTsKLQkJYWRhcHROZXcocmVsLCBSRUxBVElPTlNISVBTX0FEQVBURVJfRkFDVE9SSUVTKTsKLQkJcmV0dXJuIHJlbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVKQkphciBjcmVhdGVFSkJKYXIoKSB7Ci0JCUVKQkphckltcGwgZWpiSmFyID0gbmV3IEVKQkphckltcGwoKTsKLQkJcmV0dXJuIGVqYkphcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUm9sZVNvdXJjZSBjcmVhdGVSb2xlU291cmNlKCkgewotCQlSb2xlU291cmNlSW1wbCByb2xlU291cmNlID0gbmV3IFJvbGVTb3VyY2VJbXBsKCk7Ci0JCXJldHVybiByb2xlU291cmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBRdWVyeSBjcmVhdGVRdWVyeSgpIHsKLQkJUXVlcnlJbXBsIHF1ZXJ5ID0gbmV3IFF1ZXJ5SW1wbCgpOwotCQlyZXR1cm4gcXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFF1ZXJ5TWV0aG9kIGNyZWF0ZVF1ZXJ5TWV0aG9kKCkgewotCQlRdWVyeU1ldGhvZEltcGwgcXVlcnlNZXRob2QgPSBuZXcgUXVlcnlNZXRob2RJbXBsKCk7Ci0JCXJldHVybiBxdWVyeU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpIHsKLQkJQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPSBuZXcgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnIGNyZWF0ZUFjdGl2YXRpb25Db25maWcoKSB7Ci0JCUFjdGl2YXRpb25Db25maWdJbXBsIGFjdGl2YXRpb25Db25maWcgPSBuZXcgQWN0aXZhdGlvbkNvbmZpZ0ltcGwoKTsKLQkJcmV0dXJuIGFjdGl2YXRpb25Db25maWc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudCgpIHsKLQkJTWV0aG9kRWxlbWVudEltcGwgbWV0aG9kRWxlbWVudCA9IG5ldyBNZXRob2RFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXhjbHVkZUxpc3QgY3JlYXRlRXhjbHVkZUxpc3QoKSB7Ci0JCUV4Y2x1ZGVMaXN0SW1wbCBleGNsdWRlTGlzdCA9IG5ldyBFeGNsdWRlTGlzdEltcGwoKTsKLQkJcmV0dXJuIGV4Y2x1ZGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oKSB7Ci0JCVNlc3Npb25JbXBsIHNlc3Npb24gPSBuZXcgU2Vzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHNlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1lc3NhZ2VEcml2ZW4gY3JlYXRlTWVzc2FnZURyaXZlbigpIHsKLQkJTWVzc2FnZURyaXZlbkltcGwgbWVzc2FnZURyaXZlbiA9IG5ldyBNZXNzYWdlRHJpdmVuSW1wbCgpOwotCQlyZXR1cm4gbWVzc2FnZURyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIGNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpIHsKLQkJTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbCBtZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gPSBuZXcgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gbWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFSkJNZXRob2RDYXRlZ29yeSBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeSgpIHsKLQkJRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsIGVqYk1ldGhvZENhdGVnb3J5ID0gbmV3IEVKQk1ldGhvZENhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gZWpiTWV0aG9kQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVqYlBhY2thZ2UgZ2V0RWpiUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFamJQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFamJQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW50ZXJuYWxSZWdpc3RlckNNUEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBjb25maWcpIHsKLQkJQ01QX0FEQVBURVJfRkFDVE9SWV9ERVNDUklQVE9SUy5hZGQoY29uZmlnKTsKLQkJCi0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnRlcm5hbFJlZ2lzdGVyRUpCUmVsYXRpb25BZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgY29uZmlnKSB7Ci0JCUVKQl9SRUxBVElPTl9BREFQVEVSX0ZBQ1RPUllfREVTQ1JJUFRPUlMuYWRkKGNvbmZpZyk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnRlcm5hbFJlZ2lzdGVyUmVsYXRpb25zaGlwc0FkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBjb25maWcpIHsKLQkJUkVMQVRJT05TSElQU19BREFQVEVSX0ZBQ1RPUllfREVTQ1JJUFRPUlMuYWRkKGNvbmZpZyk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBZGFwdGVyRmFjdG9yaWVzKCkgewotCQljcmVhdGVkQWRhcHRlckZhY3RvcmllcyA9IHRydWU7Ci0JCUFkYXB0ZXJGYWN0b3J5VXRpbC5jcmVhdGVBZGFwdGVyRmFjdG9yaWVzKENNUF9BREFQVEVSX0ZBQ1RPUllfREVTQ1JJUFRPUlMsIENNUF9BREFQVEVSX0ZBQ1RPUklFUyk7Ci0JCUFkYXB0ZXJGYWN0b3J5VXRpbC5jcmVhdGVBZGFwdGVyRmFjdG9yaWVzKEVKQl9SRUxBVElPTl9BREFQVEVSX0ZBQ1RPUllfREVTQ1JJUFRPUlMsIEVKQl9SRUxBVElPTl9BREFQVEVSX0ZBQ1RPUklFUyk7Ci0JCUFkYXB0ZXJGYWN0b3J5VXRpbC5jcmVhdGVBZGFwdGVyRmFjdG9yaWVzKFJFTEFUSU9OU0hJUFNfQURBUFRFUl9GQUNUT1JZX0RFU0NSSVBUT1JTLCBSRUxBVElPTlNISVBTX0FEQVBURVJfRkFDVE9SSUVTKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkYXB0TmV3KE5vdGlmaWVyIG5vdGlmaWVyLCBMaXN0IGZhY3RvcmllcykgewotCQlpZiAoIWNyZWF0ZWRBZGFwdGVyRmFjdG9yaWVzKQotCQkJY3JlYXRlQWRhcHRlckZhY3RvcmllcygpOwotCQlBZGFwdGVyRmFjdG9yeVV0aWwuYWRhcHROZXcobm90aWZpZXIsIGZhY3Rvcmllcyk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwYTQ5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY2tub3dsZWRnZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5EZXN0aW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTWV0aG9kQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmV0dXJuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBFamJQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEVqYlBhY2thZ2UsIEVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVudGVycHJpc2VCZWFuRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYk1ldGhvZENhdGVnb3J5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYkphckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNtcEF0dHJpYnV0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZWxhdGlvbnNoaXBzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHF1ZXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYlJlbGF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVNvdXJjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjbXJGaWVsZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXNzYWdlRHJpdmVuRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleGNsdWRlTGlzdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBxdWVyeU1ldGhvZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHJhbnNhY3Rpb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBzZXNzaW9uVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gbWV0aG9kRWxlbWVudEtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGFja25vd2xlZGdlTW9kZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHJldHVyblR5cGVNYXBwaW5nRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkZXN0aW5hdGlvblR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG11bHRpcGxpY2l0eUtpbmRFRW51bSA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIEVqYlBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBFamJGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFamJQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgRWpiUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2VJbXBsLmluaXQoKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/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+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZUltcGwgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbnRpdHkoKSk7Ci0JCXNlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbnRlcnByaXNlQmVhbigpKTsKLQkJZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSk7Ci0JCWVudGVycHJpc2VCZWFuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Sk5ESUVudlJlZnNHcm91cCgpKTsKLQkJZWpiSmFyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWNtcEF0dHJpYnV0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUF0dHJpYnV0ZSgpKTsKLQkJY21yRmllbGRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDTVBBdHRyaWJ1dGUoKSk7Ci0JCW1lc3NhZ2VEcml2ZW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbnRlcnByaXNlQmVhbigpKTsKLQkJcXVlcnlNZXRob2RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoY29udGFpbmVyTWFuYWdlZEVudGl0eUVDbGFzcywgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsICIyLngiLCAwLCAxLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0Fic3RyYWN0U2NoZW1hTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWJzdHJhY3RTY2hlbWFOYW1lIiwgbnVsbCwgMCwgMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpLCB0aGlzLmdldENNUEF0dHJpYnV0ZSgpLCBudWxsLCAicGVyc2lzdGVudEF0dHJpYnV0ZXMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9LZXlBdHRyaWJ1dGVzKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJrZXlBdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpLCB0aGlzLmdldFF1ZXJ5KCksIHRoaXMuZ2V0UXVlcnlfRW50aXR5KCksICJxdWVyaWVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJDTVBBdHRyaWJ1dGUiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QcmltS2V5RmllbGQoKSwgdGhpcy5nZXRDTVBBdHRyaWJ1dGUoKSwgbnVsbCwgInByaW1LZXlGaWVsZCIsIG51bGwsIDAsIDEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAiTWV0aG9kUGVybWlzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuY2hlY2tlZCIsIG51bGwsIDAsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSwgImFzc2VtYmx5RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRTZWN1cml0eVJvbGUoKSwgbnVsbCwgInJvbGVzIiwgbnVsbCwgMSwgLTEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kRWxlbWVudHMoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJtZXRob2RFbGVtZW50cyIsIG51bGwsIDEsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAiQXNzZW1ibHlEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSwgdGhpcy5nZXRNZXRob2RQZXJtaXNzaW9uKCksIHRoaXMuZ2V0TWV0aG9kUGVybWlzc2lvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgIm1ldGhvZFBlcm1pc3Npb25zIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpLCB0aGlzLmdldE1ldGhvZFRyYW5zYWN0aW9uKCksIHRoaXMuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fQXNzZW1ibHlEZXNjcmlwdG9yKCksICJtZXRob2RUcmFuc2FjdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfRWpiSmFyKCksIHRoaXMuZ2V0RUpCSmFyKCksIHRoaXMuZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCAiZWpiSmFyIiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpLCB0aGlzLmdldEV4Y2x1ZGVMaXN0KCksIG51bGwsICJleGNsdWRlTGlzdCIsIG51bGwsIDAsIDEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kVHJhbnNhY3Rpb25FQ2xhc3MsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAiTWV0aG9kVHJhbnNhY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFRyYW5zYWN0aW9uX1RyYW5zYWN0aW9uQXR0cmlidXRlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCksICJ0cmFuc2FjdGlvbkF0dHJpYnV0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUcmFuc2FjdGlvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCksICJhc3NlbWJseURlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJtZXRob2RFbGVtZW50cyIsIG51bGwsIDEsIC0xLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlc3Npb25FQ2xhc3MsIFNlc3Npb24uY2xhc3MsICJTZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uX1RyYW5zYWN0aW9uVHlwZSgpLCB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZSgpLCAidHJhbnNhY3Rpb25UeXBlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uX1Nlc3Npb25UeXBlKCksIHRoaXMuZ2V0U2Vzc2lvblR5cGUoKSwgInNlc3Npb25UeXBlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludCIsIG51bGwsIDAsIDEsIFNlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnRpdHlFQ2xhc3MsIEVudGl0eS5jbGFzcywgIkVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5X1JlZW50cmFudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlZW50cmFudCIsIG51bGwsIDAsIDEsIEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlfUHJpbWFyeUtleSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInByaW1hcnlLZXkiLCBudWxsLCAxLCAxLCBFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnRlcnByaXNlQmVhbkVDbGFzcywgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICJFbnRlcnByaXNlQmVhbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRlcnByaXNlQmVhbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZnMiLCBudWxsLCAwLCAtMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZWpiQ2xhc3MiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImhvbWVJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAicmVtb3RlSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0VqYkphcigpLCB0aGlzLmdldEVKQkphcigpLCB0aGlzLmdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSwgImVqYkphciIsIG51bGwsIDEsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eUlkZW50aXR5KCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlJZGVudGl0eSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsb2NhbEhvbWVJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsb2NhbEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiTWV0aG9kQ2F0ZWdvcnlFQ2xhc3MsIEVKQk1ldGhvZENhdGVnb3J5LmNsYXNzLCAiRUpCTWV0aG9kQ2F0ZWdvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhlamJKYXJFQ2xhc3MsIEVKQkphci5jbGFzcywgIkVKQkphciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWpiQ2xpZW50SmFyIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9FamJKYXIoKSwgImFzc2VtYmx5RGVzY3JpcHRvciIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpLCB0aGlzLmdldEVudGVycHJpc2VCZWFuKCksIHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW5fRWpiSmFyKCksICJlbnRlcnByaXNlQmVhbnMiLCBudWxsLCAxLCAtMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfUmVsYXRpb25zaGlwTGlzdCgpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHMoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBzX0VqYkphcigpLCAicmVsYXRpb25zaGlwTGlzdCIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICJNZXRob2RFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X1Bhcm1zKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJtcyIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfVHlwZSgpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnRLaW5kKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZEVsZW1lbnRfRW50ZXJwcmlzZUJlYW4oKSwgdGhpcy5nZXRFbnRlcnByaXNlQmVhbigpLCBudWxsLCAiZW50ZXJwcmlzZUJlYW4iLCBudWxsLCAxLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNtcEF0dHJpYnV0ZUVDbGFzcywgQ01QQXR0cmlidXRlLmNsYXNzLCAiQ01QQXR0cmlidXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ01QQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDTVBBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDTVBBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZWxhdGlvbnNoaXBzRUNsYXNzLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAiUmVsYXRpb25zaGlwcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0VqYkphcigpLCB0aGlzLmdldEVKQkphcigpLCB0aGlzLmdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCksICJlamJKYXIiLCBudWxsLCAxLCAxLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpLCB0aGlzLmdldEVKQlJlbGF0aW9uKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwTGlzdCgpLCAiZWpiUmVsYXRpb25zIiwgbnVsbCwgMCwgLTEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocXVlcnlFQ2xhc3MsIFF1ZXJ5LmNsYXNzLCAiUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeV9FamJRTCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWpiUUwiLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfUmV0dXJuVHlwZU1hcHBpbmcoKSwgdGhpcy5nZXRSZXR1cm5UeXBlTWFwcGluZygpLCAicmV0dXJuVHlwZU1hcHBpbmciLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCB0aGlzLmdldFF1ZXJ5TWV0aG9kKCksIHRoaXMuZ2V0UXVlcnlNZXRob2RfUXVlcnkoKSwgInF1ZXJ5TWV0aG9kIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X0VudGl0eSgpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSwgdGhpcy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKSwgImVudGl0eSIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQlJlbGF0aW9uLmNsYXNzLCAiRUpCUmVsYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcExpc3QoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBzKCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKSwgInJlbGF0aW9uc2hpcExpc3QiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9SZWxhdGlvbnNoaXAoKSwgInJlbGF0aW9uc2hpcFJvbGVzIiwgbnVsbCwgMiwgMiwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAiRUpCUmVsYXRpb25zaGlwUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfTXVsdGlwbGljaXR5KCksIHRoaXMuZ2V0TXVsdGlwbGljaXR5S2luZCgpLCAibXVsdGlwbGljaXR5IiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJjYXNjYWRlRGVsZXRlIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcCgpLCB0aGlzLmdldEVKQlJlbGF0aW9uKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKSwgInJlbGF0aW9uc2hpcCIsIG51bGwsIDEsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfU291cmNlKCksIHRoaXMuZ2V0Um9sZVNvdXJjZSgpLCB0aGlzLmdldFJvbGVTb3VyY2VfUm9sZSgpLCAic291cmNlIiwgbnVsbCwgMSwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpLCB0aGlzLmdldENNUkZpZWxkKCksIHRoaXMuZ2V0Q01SRmllbGRfUm9sZSgpLCAiY21yRmllbGQiLCBudWxsLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVTb3VyY2VFQ2xhc3MsIFJvbGVTb3VyY2UuY2xhc3MsICJSb2xlU291cmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJvbGVTb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpLCAicm9sZSIsIG51bGwsIDEsIDEsIFJvbGVTb3VyY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfRW50aXR5QmVhbigpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSwgbnVsbCwgImVudGl0eUJlYW4iLCBudWxsLCAxLCAxLCBSb2xlU291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUm9sZVNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNtckZpZWxkRUNsYXNzLCBDTVJGaWVsZC5jbGFzcywgIkNNUkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDTVJGaWVsZF9Sb2xlKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ21yRmllbGQoKSwgInJvbGUiLCBudWxsLCAwLCAxLCBDTVJGaWVsZC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJjb2xsZWN0aW9uVHlwZSIsIG51bGwsIDAsIDEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZURyaXZlbkVDbGFzcywgTWVzc2FnZURyaXZlbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fVHJhbnNhY3Rpb25UeXBlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlKCksICJ0cmFuc2FjdGlvblR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZVNlbGVjdG9yKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtZXNzYWdlU2VsZWN0b3IiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuX0Fja25vd2xlZGdlTW9kZSgpLCB0aGlzLmdldEFja25vd2xlZGdlTW9kZSgpLCAiYWNrbm93bGVkZ2VNb2RlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuX0Rlc3RpbmF0aW9uKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX0JlYW4oKSwgImRlc3RpbmF0aW9uIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbl9BY3RpdmF0aW9uQ29uZmlnKCksIHRoaXMuZ2V0QWN0aXZhdGlvbkNvbmZpZygpLCBudWxsLCAiYWN0aXZhdGlvbkNvbmZpZyIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdpbmdUeXBlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibWVzc2FnaW5nVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1R5cGUoKSwgdGhpcy5nZXREZXN0aW5hdGlvblR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSwgdGhpcy5nZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCgpLCAic3Vic2NyaXB0aW9uRHVyYWJpbGl0eSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fQmVhbigpLCB0aGlzLmdldE1lc3NhZ2VEcml2ZW4oKSwgdGhpcy5nZXRNZXNzYWdlRHJpdmVuX0Rlc3RpbmF0aW9uKCksICJiZWFuIiwgbnVsbCwgMSwgMSwgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjbHVkZUxpc3RFQ2xhc3MsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAiRXhjbHVkZUxpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9NZXRob2RFbGVtZW50cygpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSwgbnVsbCwgIm1ldGhvZEVsZW1lbnRzIiwgbnVsbCwgMSwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocXVlcnlNZXRob2RFQ2xhc3MsIFF1ZXJ5TWV0aG9kLmNsYXNzLCAiUXVlcnlNZXRob2QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5TWV0aG9kX1F1ZXJ5KCksIHRoaXMuZ2V0UXVlcnkoKSwgdGhpcy5nZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCAicXVlcnkiLCBudWxsLCAxLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcywgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAiQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICJBY3RpdmF0aW9uQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uQ29uZmlnX0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAxLCAtMSwgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuY2xhc3MsICJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuU1VQUE9SVFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFU19ORVdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk1BTkRBVE9SWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTkVWRVJfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQkVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5jbGFzcywgIlNlc3Npb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLlNUQVRFTEVTU19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuY2xhc3MsICJNZXRob2RFbGVtZW50S2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5jbGFzcywgIkFja25vd2xlZGdlTW9kZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5BVVRPX0FDS05PV0xFREdFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5EVVBTX09LX0FDS05PV0xFREdFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5jbGFzcywgIlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5EVVJBQkxFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmRFRW51bSwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQuTk9OX0RVUkFCTEVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLmNsYXNzLCAiUmV0dXJuVHlwZU1hcHBpbmciKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLkxPQ0FMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmV0dXJuVHlwZU1hcHBpbmdFRW51bSwgUmV0dXJuVHlwZU1hcHBpbmcuUkVNT1RFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLmNsYXNzLCAiRGVzdGluYXRpb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLlFVRVVFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGVzdGluYXRpb25UeXBlRUVudW0sIERlc3RpbmF0aW9uVHlwZS5UT1BJQ19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLmNsYXNzLCAiTXVsdGlwbGljaXR5S2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG11bHRpcGxpY2l0eUtpbmRFRW51bSwgTXVsdGlwbGljaXR5S2luZC5NQU5ZX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9FamJQYWNrYWdlSW1wbAotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGVycHJpc2VCZWFuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMDc3NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEVudGVycHJpc2VKYXZhQmVhbiBpcyBhIGNsYXNzLiAgSXQgY2FuIGhhdmUgaW5zdGFuY2VzLCBzb21lb25lIGNvdWxkIHdyaXRlIGFuIGluc3RhbmNlIGRvY3VtZW50IGNvbnRhaW5pbmcgRGVwYXJ0bWVudHMgYW5kIEVtcGxveWVlcy4gIEl0IGFsc28gaGFzIGF0dHJpYnV0ZXMsIG9wZXJhdGlvbnMsIGFuZCBhc3NvY2lhdGlvbnMuICBUaGVzZSBhcmUgYWN0dWFsbHkgZGVyaXZlZC8vZmlsdGVyZWQgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4gIEZvciBtYXBwaW5nIGFuZCBicm93c2luZyBwdXJwb3NlcywgdGhvdWdoLCB5b3Ugd291bGQgbGlrZSB0aGUgRUpCIHRvIGFwcGVhciBhcyBhIGNsYXNzLiAgCi0gKiAKLSAqIEluIHRoaXMgbGlnaHQsIGV2ZW4gU2Vzc2lvbiBCZWFucyBjYW4gaGF2ZSBhc3NvY2lhdGlvbnMgYW5kIHByb3BlcnRpZXMgaW1wbGVtZW50ZWQgYnkgdGhlaXIgYmVhbi4gIEZvciBleGFtcGxlLCBpdCB3b3VsZCBiZSBtZWFuaW5nZnVsIHRvIGRlc2NyaWJlIGFzc29jaWF0aW9ucyBmcm9tIGEgU2Vzc2lvbiB0byB0aGUgRW50aXRpZXMgd2hpY2ggaXQgdXNlcyB0byBwZXJmb3JtIGl0cyB3b3JrLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW50ZXJwcmlzZUJlYW5JbXBsIGV4dGVuZHMgSk5ESUVudlJlZnNHcm91cEltcGwgaW1wbGVtZW50cyBFbnRlcnByaXNlQmVhbiB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIE1ldGhvZFtdIEVNUFRZX01FVEhPRF9BUlJBWSA9IG5ldyBNZXRob2RbMF07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0VMRU1FTlRfTkFNRSA9ICJNZXRob2RFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZVJlZnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZWpiQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgaG9tZUludGVyZmFjZSA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyByZW1vdGVJbnRlcmZhY2UgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eUlkZW50aXR5IHNlY3VyaXR5SWRlbnRpdHkgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgbG9jYWxIb21lSW50ZXJmYWNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGxvY2FsSW50ZXJmYWNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3IgZGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yOwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDbGFzc1JlZiAtIHJldHVybiBhIEphdmFVUkwgcmVmZXJlbmNlIHRvIHRoZSBuYW1lZCBKYXZhIGNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBjcmVhdGVDbGFzc1JlZihTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQlyZXR1cm4gZ2V0SmF2YVJlZkZhY3RvcnkoKS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhMaXN0IHNpZ25hdHVyZXMsIEVudW1lcmF0b3IgYVR5cGUpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKE1FVEhPRF9FTEVNRU5UX05BTUUsIHNpZ25hdHVyZXMsIGFUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlTWV0aG9kRWxlbWVudHMoU3RyaW5nIG1lVHlwZU5hbWUsIExpc3Qgc2lnbmF0dXJlcywgRW51bWVyYXRvciBhVHlwZSkgewotCQlpbnQgc2l6ZSA9IHNpZ25hdHVyZXMuc2l6ZSgpOwotCQlMaXN0IG1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJU3RyaW5nIHNpZ25hdHVyZTsKLQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXNpZ25hdHVyZSA9IChTdHJpbmcpIHNpZ25hdHVyZXMuZ2V0KGkpOwotCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZSgoRUNsYXNzKWdldEVqYlBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcihtZVR5cGVOYW1lKSk7Ci0JCQltZS5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUpOwotCQkJbWUuc2V0RW50ZXJwcmlzZUJlYW4odGhpcyk7Ci0JCQltZS5zZXRUeXBlKChNZXRob2RFbGVtZW50S2luZClhVHlwZSk7Ci0JCQltZXRob2RFbGVtZW50cy5hZGQobWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBjcmVhdGVNZXRob2RFbGVtZW50cyhMaXN0IHNvbWVNZXRob2RzLCBKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKE1FVEhPRF9FTEVNRU5UX05BTUUsIHNvbWVNZXRob2RzLCBhbkludGVyZmFjZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRzKFN0cmluZyBtZVR5cGVOYW1lLCBMaXN0IHNvbWVNZXRob2RzLCBKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJaWYgKGFuSW50ZXJmYWNlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBzaWduYXR1cmVzID0gZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoc29tZU1ldGhvZHMpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCQlFbnVtZXJhdG9yIGVudW1lcmF0b3IgPSBnZXRNZXRob2RFbGVtZW50S2luZExpdGVyYWwoYW5JbnRlcmZhY2UpOwotCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudHMobWVUeXBlTmFtZSwgc2lnbmF0dXJlcywgZW51bWVyYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCBFbnVtZXJhdG9yIGdldE1ldGhvZEVsZW1lbnRLaW5kTGl0ZXJhbChKYXZhQ2xhc3MgYW5JbnRlcmZhY2UpIHsKLQkJRW51bWVyYXRvciBlbnVtZXJhdG9yID0gTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTDsKLQkJaWYgKGFuSW50ZXJmYWNlID09IGdldEhvbWVJbnRlcmZhY2UoKSkKLQkJCWVudW1lcmF0b3IgPSBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUw7Ci0JCWVsc2UgaWYgKGFuSW50ZXJmYWNlID09IGdldFJlbW90ZUludGVyZmFjZSgpKQotCQkJZW51bWVyYXRvciA9IE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMOwotCQllbHNlIGlmIChhbkludGVyZmFjZSA9PSBnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSkKLQkJCWVudW1lcmF0b3IgPSBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUw7Ci0JCWVsc2UgaWYgKGFuSW50ZXJmYWNlID09IGdldExvY2FsSW50ZXJmYWNlKCkpCi0JCQllbnVtZXJhdG9yID0gTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTDsKLQkJcmV0dXJuIGVudW1lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKExpc3Qgc29tZU1ldGhvZHMpIHsKLQkJaW50IHNpemUgPSBzb21lTWV0aG9kcy5zaXplKCk7Ci0JCUxpc3Qgc2lnbmF0dXJlcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBzb21lTWV0aG9kcy5nZXQoaSk7Ci0JCQlzaWduYXR1cmVzLmFkZChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkJfQotCQlyZXR1cm4gc2lnbmF0dXJlczsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0JICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0JICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbW1vbk1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGFuZCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIEhvbWUgYW5kIFJlbW90ZSBpbnRlcmZhY2VzLiAgVGhlc2UgTWV0aG9kRWxlbWVudHMgYXJlIG5vdCBjb250YWluZWQgYW5kIHdpbGwKLQkgKiBub3QgYmUgc2VyaWFsaXplZCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgbW9kZWwuICBUaGVpciBpbnRlbnRpb24gaXMKLQkgKiBzb2xlbHkgZm9yIGNvbXBhcmluZyB3aXRoIGFjdHVhbCBNZXRob2RFbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudHMoKSB7Ci0JCUxpc3QgY29tbW9uU2lncyA9IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKTsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKGNvbW1vblNpZ3MsIE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotCX0KLQlwcm90ZWN0ZWQgTGlzdCBnYXRoZXJDb21tb25TaWduYXR1cmVzKExpc3Qgc2lnQ29sbGVjdGlvbnMpIHsKLQkJaWYgKHNpZ0NvbGxlY3Rpb25zLmlzRW1wdHkoKSkgcmV0dXJuIHNpZ0NvbGxlY3Rpb25zOwotCQlMaXN0IGZpcnN0ID0gKExpc3Qpc2lnQ29sbGVjdGlvbnMuZ2V0KDApOwotCQlpZiAoc2lnQ29sbGVjdGlvbnMuc2l6ZSgpID09IDEpIHJldHVybiBmaXJzdDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGZpcnN0LnNpemUoKSk7Ci0JCXNpZ0NvbGxlY3Rpb25zLnJlbW92ZSgwKTsKLQkJU3RyaW5nIHNpZyA9IG51bGw7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdC5zaXplKCk7IGkrKykgewotCQkJY29udGFpbnMgPSBmYWxzZTsKLQkJCXNpZyA9IChTdHJpbmcpIGZpcnN0LmdldChpKTsKLQkJCUxpc3QgbGlzdCA9IG51bGw7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpZ0NvbGxlY3Rpb25zLnNpemUoKTsgaisrKSB7Ci0JCQkJbGlzdCA9IChMaXN0KSBzaWdDb2xsZWN0aW9ucy5nZXQoaik7Ci0JCQkJaWYgKGxpc3QuY29udGFpbnMoc2lnKSkKLQkJCQkJY29udGFpbnMgPSB0cnVlOwotCQkJfQotCQkJaWYgKGNvbnRhaW5zKQotCQkJCXJlc3VsdC5hZGQoc2lnKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHRoYXQgYXJlIHNldCBmb3IgYSBwYXJ0aWN1bGFyIEVPYmplY3QKLQkgKiB3aGljaCBjYW4gYmUgYSBNZXRob2RUcmFuc2FjdGlvbiBvciBhIE1ldGhvZFBlcm1pc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdNZXRob2RFbGVtZW50cyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlpZiAocmVmT2JqZWN0ICE9IG51bGwpIHsKLQkJCUVqYlBhY2thZ2UgcGFjayA9IGdldEVqYlBhY2thZ2UoKTsKLQkJCWlmIChyZWZPYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRNZXRob2RUcmFuc2FjdGlvbigpKQotCQkJCXJldHVybiAoKE1ldGhvZFRyYW5zYWN0aW9uKXJlZk9iamVjdCkuZ2V0TWV0aG9kRWxlbWVudHModGhpcyk7Ci0JCQlpZiAocmVmT2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0TWV0aG9kUGVybWlzc2lvbigpKQotCQkJCXJldHVybiAoKE1ldGhvZFBlcm1pc3Npb24pcmVmT2JqZWN0KS5nZXRNZXRob2RFbGVtZW50cyh0aGlzKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIE1ldGhvZEVsZW1lbnRzIHNpZ25hdHVyZXMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBhbmQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBIb21lIGFuZCBSZW1vdGUgaW50ZXJmYWNlcy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbW1vbk1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgTWV0aG9kRWxlbWVudHMgc2lnbmF0dXJlcwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGFuZCBhcmUgY29tbW9uIHRvIGJvdGggdGhlIEhvbWUgYW5kIFJlbW90ZSBpbnRlcmZhY2VzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSB7Ci0JCUxpc3Qgc2lnQ29sbGVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChnZXRIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRIb21lSW50ZXJmYWNlKCkuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSk7Ci0JCWlmIChnZXRSZW1vdGVJbnRlcmZhY2UoKSAhPSBudWxsKQotCQkJc2lnQ29sbGVjdGlvbnMuYWRkKGdldFJlbW90ZUludGVyZmFjZSgpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkpOwotCQlpZiAoZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKS5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpKTsKLQkJaWYgKGdldExvY2FsSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCXNpZ0NvbGxlY3Rpb25zLmFkZChnZXRMb2NhbEludGVyZmFjZSgpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzKCkpOwkKLQkJcmV0dXJuIGdhdGhlckNvbW1vblNpZ25hdHVyZXMoc2lnQ29sbGVjdGlvbnMpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGZvciB0aGUgSG9tZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoZ2V0SG9tZUludGVyZmFjZSgpLCBNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgbmV3bHkgY3JlYXRlZCBNZXRob2RFbGVtZW50cwotCSAqIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudHMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIGZvciB0aGUgTG9jYWwgSG9tZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBmb3IgdGhlIExvY2FsIGludGVyZmFjZS4gIFRoZXNlIE1ldGhvZEVsZW1lbnRzIGFyZSBub3QgY29udGFpbmVkIGFuZCB3aWxsCi0JICogbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1vZGVsLiAgVGhlaXIgaW50ZW50aW9uIGlzCi0JICogc29sZWx5IGZvciBjb21wYXJpbmcgd2l0aCBhY3R1YWwgTWV0aG9kRWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoZ2V0TG9jYWxJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlU2VydmljZUVuZHBvaW50TWV0aG9kRWxlbWVudHMoKXsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKGdldFNlcnZpY2VFbmRwb2ludCgpLCBNZXRob2RFbGVtZW50S2luZC5TRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhKYXZhQ2xhc3MgYW5JbnRlcmZhY2UsIEVudW1lcmF0b3IgYVR5cGUpIHsKLQkJaWYgKGFuSW50ZXJmYWNlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCBzaWduYXR1cmVzID0gYW5JbnRlcmZhY2UuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKTsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRzKHNpZ25hdHVyZXMsIGFUeXBlKTsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBMaXN0IG9mIG5ld2x5IGNyZWF0ZWQgTWV0aG9kRWxlbWVudHMKLQkgKiB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIHBvc3NpYmxlIE1ldGhvZEVsZW1lbnRzIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiBmb3IgdGhlIFJlbW90ZSBpbnRlcmZhY2UuICBUaGVzZSBNZXRob2RFbGVtZW50cyBhcmUgbm90IGNvbnRhaW5lZCBhbmQgd2lsbAotCSAqIG5vdCBiZSBzZXJpYWxpemVkIGFuZCBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtb2RlbC4gIFRoZWlyIGludGVudGlvbiBpcwotCSAqIHNvbGVseSBmb3IgY29tcGFyaW5nIHdpdGggYWN0dWFsIE1ldGhvZEVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUmVtb3RlTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVNZXRob2RFbGVtZW50cyhnZXRSZW1vdGVJbnRlcmZhY2UoKSwgTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFX0xJVEVSQUwpOwotCX0KLQkKLQkvKgotCSAqIFNlZSBFbnRlcnByaXNlQmVhbiNnZXRFeGlzdGluZ09yQXZhaWxhYmxlTWV0aG9kRWxlbWVudHMoRU9iamVjdCwgQ29tcGFyYXRvcik7Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKEVPYmplY3QgcmVmT2JqZWN0LCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZUxvY2FsSG9tZU1ldGhvZEVsZW1lbnRzKCkpOwotCQlyZXN1bHQuYWRkQWxsKGdldEF2YWlsYWJsZUxvY2FsTWV0aG9kRWxlbWVudHMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlU2VydmljZUVuZHBvaW50TWV0aG9kRWxlbWVudHMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0QXZhaWxhYmxlVW5zcGVjaWZpZWRNZXRob2RFbGVtZW50cygpKTsKLQkJdW5pb25NZXRob2RFbGVtZW50cyhyZXN1bHQsIGdldEV4aXN0aW5nTWV0aG9kRWxlbWVudHMocmVmT2JqZWN0KSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoKLQkgKiBTZWUgRW50ZXJwcmlzZUJlYW4jZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKEVPYmplY3QpOwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4aXN0aW5nT3JBdmFpbGFibGVNZXRob2RFbGVtZW50cyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlyZXR1cm4gZ2V0RXhpc3RpbmdPckF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKHJlZk9iamVjdCwgZ2V0RGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCkpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yIGdldERlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpIHsKLQkJaWYgKGRlZmF1bHRNZXRob2RFbGVtZW50Q29tcGFyYXRvciA9PSBudWxsKQotCQkJZGVmYXVsdE1ldGhvZEVsZW1lbnRDb21wYXJhdG9yID0gbmV3IEVqYk1ldGhvZEVsZW1lbnRDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBkZWZhdWx0TWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHVuaW9uTWV0aG9kRWxlbWVudHMoTGlzdCBzb3VyY2VNZXRob2RFbGVtZW50cywgTGlzdCBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpIHsKLQkJTWV0aG9kRWxlbWVudCBzb3VyY2VNRSwgYWRkaXRpb25hbE1FOwotCQlpbnQgc291cmNlU2l6ZSwgYWRkU2l6ZTsKLQkJc291cmNlU2l6ZSA9IHNvdXJjZU1ldGhvZEVsZW1lbnRzLnNpemUoKTsKLQkJYWRkU2l6ZSA9IGFkZGl0aW9uYWxNZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCUxpc3QgZm91bmRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWRkU2l6ZSk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRTaXplOyBpKyspewotCQkJZm91bmQgPSBmYWxzZTsKLQkJCWFkZGl0aW9uYWxNRSA9IChNZXRob2RFbGVtZW50KSBhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMuZ2V0KGkpOwotCQkJc291cmNlTUUgPSBudWxsOwotCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHNvdXJjZVNpemU7IGlpKyspewotCQkJCXNvdXJjZU1FID0gKE1ldGhvZEVsZW1lbnQpIHNvdXJjZU1ldGhvZEVsZW1lbnRzLmdldChpaSk7Ci0JCQkJaWYgKHNvdXJjZU1FLmlzRXF1aXZhbGVudChhZGRpdGlvbmFsTUUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKQotCQkJCWZvdW5kRWxlbWVudHMuYWRkKHNvdXJjZU1FKTsKLQkJfQotCQlzb3VyY2VNZXRob2RFbGVtZW50cy5yZW1vdmVBbGwoZm91bmRFbGVtZW50cyk7Ci0JCXNvdXJjZU1ldGhvZEVsZW1lbnRzLmFkZEFsbChhZGRpdGlvbmFsTWV0aG9kRWxlbWVudHMpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEVqYkNsYXNzTmFtZSgpIHsKLQkJZ2V0RWpiQ2xhc3MoKTsKLQkJcmV0dXJuIChlamJDbGFzcyA9PSBudWxsKSA/IG51bGwgOiBlamJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCXByb3RlY3RlZCBFamJQYWNrYWdlIGdldEVqYlBhY2thZ2UoKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCXByb3RlY3RlZCBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0JCXJldHVybiAoKEVqYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSkuZ2V0RWpiRmFjdG9yeSgpOwotCX0KLQlwdWJsaWMgRWpiUmVmIGdldEVxdWl2YWxlbnRFamJSZWYoRWpiUmVmIGFuRWpiUmVmKSB7Ci0JCXJldHVybiBnZXRFcXVpdmFsZW50RWpiUmVmKGFuRWpiUmVmLCBnZXRFamJSZWZzKCkpOwotCX0KLQlwdWJsaWMgRUpCTG9jYWxSZWYgZ2V0RXF1aXZhbGVudEVKQkxvY2FsUmVmKEVKQkxvY2FsUmVmIGFuRWpiTG9jYWxSZWYpIHsKLQkJcmV0dXJuIChFSkJMb2NhbFJlZikgZ2V0RXF1aXZhbGVudEVqYlJlZihhbkVqYkxvY2FsUmVmLCBnZXRFamJMb2NhbFJlZnMoKSk7Ci0JfQotCXByaXZhdGUgRWpiUmVmIGdldEVxdWl2YWxlbnRFamJSZWYoRWpiUmVmIGFuRWpiUmVmLCBMaXN0IHNvbWVSZWZzKSB7Ci0JCWlmIChhbkVqYlJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gc29tZVJlZnMuc2l6ZSgpOwotCQlFamJSZWYgcmVmOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmID0gKEVqYlJlZikgc29tZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJlZi5pc0VxdWl2YWxlbnQoYW5FamJSZWYpKQotCQkJCXJldHVybiByZWY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0SG9tZUludGVyZmFjZU5hbWUoKSB7Ci0JCWdldEhvbWVJbnRlcmZhY2UoKTsKLQkJcmV0dXJuIGhvbWVJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiBob21lSW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogU2VlIDxjb2RlPmdldE1ldGhvZHM8Y29kZT4gZm9yIGNvbW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kW10gZ2V0SG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCkgewotCQlyZXR1cm4gKGdldEhvbWVJbnRlcmZhY2UoKSAhPSBudWxsID8gZ2V0TWV0aG9kcyhnZXRIb21lSW50ZXJmYWNlKCkpIDogRU1QVFlfTUVUSE9EX0FSUkFZKTsKLQl9Ci0JcHJpdmF0ZSBKYXZhUmVmRmFjdG9yeSBnZXRKYXZhUmVmRmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkpLmdldEphdmFSZWZGYWN0b3J5KCk7Ci0JfQotCXB1YmxpYyBFamJSZWYgZ2V0TGlua2VkRUpCUmVmZXJlbmNlKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXJldHVybiBnZXRMaW5rZWRFSkJSZWZlcmVuY2UoYW5FSkIsIGdldEVqYlJlZnMoKSk7Ci0JfQotCXB1YmxpYyBFSkJMb2NhbFJlZiBnZXRMaW5rZWRFSkJMb2NhbFJlZmVyZW5jZShFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlyZXR1cm4gKEVKQkxvY2FsUmVmKSBnZXRMaW5rZWRFSkJSZWZlcmVuY2UoYW5FSkIsIGdldEVqYkxvY2FsUmVmcygpKTsKLQl9Ci0JcHJpdmF0ZSBFamJSZWYgZ2V0TGlua2VkRUpCUmVmZXJlbmNlKEVudGVycHJpc2VCZWFuIGFuRUpCLCBMaXN0IHNvbWVSZWZzKSB7Ci0JCWlmIChhbkVKQiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gc29tZVJlZnMuc2l6ZSgpOwotCQlFamJSZWYgcmVmOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmID0gKEVqYlJlZikgc29tZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJlZi5pc0xpbmtlZChhbkVKQikpCi0JCQkJcmV0dXJuIHJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKCkgewotCQlnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJcmV0dXJuIGxvY2FsSG9tZUludGVyZmFjZSA9PSBudWxsID8gbnVsbCA6IGxvY2FsSG9tZUludGVyZmFjZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCS8qKgotCSAqIFNlZSA8Y29kZT5nZXRNZXRob2RzPGNvZGU+IGZvciBjb21tZW50Ci0JICovCi0JcHVibGljIE1ldGhvZFtdIGdldExvY2FsSG9tZU1ldGhvZHNGb3JEZXBsb3ltZW50KCkgewotCQlyZXR1cm4gKGdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGwgPyBnZXRNZXRob2RzKGdldExvY2FsSG9tZUludGVyZmFjZSgpKSA6IEVNUFRZX01FVEhPRF9BUlJBWSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJbnRlcmZhY2VOYW1lKCkgewotCQlnZXRMb2NhbEludGVyZmFjZSgpOwotCQlyZXR1cm4gbG9jYWxJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiBsb2NhbEludGVyZmFjZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCS8qKgotCSAqIFJldHJpZXZlIGFuIG9yZGVyZWQgbGlzdCBvZiBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gSmF2YUNsYXNzLgotCSAqIFRoZSBsaXN0IHNob3VsZCBpbmNsdWRlIGFsbCBub24tc3RhdGljLCBwdWJsaWMgbWV0aG9kcyB0aGF0IGFyZQotCSAqIG5vdCBpbmhlcml0ZWQgZnJvbSBqYXZheC5lamIuRUpCT2JqZWN0Ci0JICogVGhpcyB1c2VzIHRoZSBhbGdvcml0aG0gdGhhdCB3ZWIgc3BoZXJlIGN1cnJlbnRseSB1c2VzLCBhbmQgY291bGQKLQkgKiBiZSBzdWJqZWN0IHRvIGNoYW5nZQotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzIxLzAwIDE6NDE6MDMgUE0pCi0JICogQHBhcmFtIGludGYgSmF2YUNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBnZXRNZXRob2RzKEphdmFDbGFzcyBpbnRmKSB7Ci0JCU1ldGhvZFtdIGFsbE1ldGhvZHMgPSBpbnRmLmxpc3RNZXRob2RFeHRlbmRlZCgpOwotCQlqYXZhLnV0aWwuVmVjdG9yIHJlc3VsdFZlY3RvciA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKGFsbE1ldGhvZHMubGVuZ3RoKTsKLQkJamF2YS51dGlsLkhhc2h0YWJsZSBtZXRob2ROYW1lVGFibGUgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBJdGVyYXRlIG92ZXIgdGhlIGxpc3QgcmV0dXJuZWQgYnkgImxpc3RNZXRob2RFeHRlbmRlZCIgYW5kCi0JCS8vIGZpbHRlciBvdXQgbWV0aG9kcyBiZWxvbmdpbmcgdG8gdGhlIEVKQk9iamVjdCBpbnRlcmZhY2UKLQkJLy8gYW5kIG1ldGhvZCBzeW5vbnltcy4gCi0JCS8vCi0JCS8vIE1ldGhvZCBzeW5vbnltcyBjb3JyZXNwb25kIHRvIG92ZXJyaWRlcy4gRm9yIGFsbCBzeW5vbnltcwotCQkvLyBrZWVwIHRoZSBtZXRob2QgaW5zdGFuY2UgZGVjbGFyZWQgb24gdGhlIG1vc3Qgc3BlY2lmaWMgY2xhc3MuIAotCQkvLyBIb3cgZG8geW91IGRldGVybWluZSB0aGUgbW9zdCBzcGVjaWZpYyBjbGFzcz8gRG9uJ3Qga25vdy4KLQkJLy8gRm9yIG5vdywgaWYgdGhlIG1ldGhvZCBpcyBkZWNsYXJlZCBvbiB0aGUgaW50ZXJmYWNlIGNsYXNzCi0JCS8vIGl0IGFsd2F5cyBvdmVycmlkZXMgb3RoZXJzLgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlNZXRob2RbXSByZXN1bHQgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIG0gPSBhbGxNZXRob2RzW2ldOwotCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gRmlsdGVyIG91dCBzdGF0aWMgbWV0aG9kcwotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQkJaWYgKG0uaXNTdGF0aWMoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTdHJpbmcgbUtleSA9IG1ldGhvZEtleShtKTsKLQotCQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSBtLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpOwotCQkJaWYgKCFpbnRlcmZhY2VOYW1lLmVxdWFscygiamF2YXguZWpiLkVKQk9iamVjdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXRob2Qgc3lub255bSA9IChNZXRob2QpIG1ldGhvZE5hbWVUYWJsZS5nZXQobUtleSk7Ci0JCQkJaWYgKHN5bm9ueW0gPT0gbnVsbCkgewotCQkJCQltZXRob2ROYW1lVGFibGUucHV0KG1LZXksIG0pOwotCQkJCQlyZXN1bHRWZWN0b3IuYWRkRWxlbWVudChtKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCQkvLyBNZXRob2QgZGVjbGFyZWQgb24gbW9zdCBzcGVjaWZpYyBjbGFzcyB3aW5zCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJCUphdmFDbGFzcyBtQ2xhc3MgPSBtLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJCQkJSmF2YUNsYXNzIHNDbGFzcyA9IHN5bm9ueW0uZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpOwotCQkJCQlpZiAoc0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UobUNsYXNzKSkgewotCQkJCQkJcmVzdWx0VmVjdG9yLnJlbW92ZUVsZW1lbnQoc3lub255bSk7Ci0JCQkJCQltZXRob2ROYW1lVGFibGUucHV0KG1LZXksIG0pOwotCQkJCQkJcmVzdWx0VmVjdG9yLmFkZEVsZW1lbnQobSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXN1bHQgPSBuZXcgTWV0aG9kW3Jlc3VsdFZlY3Rvci5zaXplKCldOwotCQlyZXN1bHRWZWN0b3IuY29weUludG8ocmVzdWx0KTsKLQkJcmV0dXJuIHNvcnRNZXRob2RzKHJlc3VsdCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSW50ZXJmYWNlTmFtZSgpIHsKLQkJZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCXJldHVybiByZW1vdGVJbnRlcmZhY2UgPT0gbnVsbCA/IG51bGwgOiByZW1vdGVJbnRlcmZhY2UuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkvKioKLQkgKiBTZWUgPGNvZGU+Z2V0TWV0aG9kczxjb2RlPiBmb3IgY29tbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RbXSBnZXRSZW1vdGVNZXRob2RzRm9yRGVwbG95bWVudCgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZHMoZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBAYUphdmFDbGFzcyBhcyBlcXVhbCB0byB0aGUKLQkgKiBob21lLCByZW1vdGUsIGJlYW4gY2xhc3MsIG9yIGtleSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNKYXZhUmVmZXJlbmNlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JCWlmIChhSmF2YUNsYXNzICE9IG51bGwpIHsKLQkJCXJldHVybiBhSmF2YUNsYXNzLmVxdWFscyhnZXRFamJDbGFzcygpKXx8Ci0JCQkJCWFKYXZhQ2xhc3MuZXF1YWxzKGdldFJlbW90ZUludGVyZmFjZSgpKSB8fCAKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0SG9tZUludGVyZmFjZSgpKSB8fCAKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0TG9jYWxJbnRlcmZhY2UoKSkgfHwKLQkJCQkJYUphdmFDbGFzcy5lcXVhbHMoZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBlamIgaGFzIEJlYW5NYW5hZ2VkUGVyc2lzdGFuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCZWFuTWFuYWdlZEVudGl0eSgpIHsKLQkJcmV0dXJuIGlzRW50aXR5KCkgJiYgIWlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLQkvKioKLQkgKiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8vUmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQKLQlwdWJsaWMgYm9vbGVhbiBpc0VudGl0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvL1JldHVybiBmYWxzZSBieSBkZWZhdWx0Ci0JcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlRHJpdmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8vUmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQKLQlwdWJsaWMgYm9vbGVhbiBpc1Nlc3Npb24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0RWpiSmFyKCkuZ2V0VmVyc2lvbklEKCkKLQkgKiBpc1ZlcnNpb24xX1ggbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMV9YKCkgewotCQlpZiAoZ2V0RWpiSmFyKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRFamJKYXIoKS5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwotCQlSZXZpc2l0LnJldmlzaXQoKTsgLy9qc2hvbGwgdGhpcyBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uLiBpZiB0aGVyZSBpcyBub3QgSkFSIHRoZW4gdGhlIHZlcnNpb24gaXMgdW5kZWZpbmVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0RWpiSmFyKCkuZ2V0VmVyc2lvbklEKCkKLQkgKiBpc1ZlcnNpb24yX1ggbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl9YKCkgewotCQlpZiAoZ2V0RWpiSmFyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVqYkphcigpLmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ7Ci0JCX0KLQkJUmV2aXNpdC5yZXZpc2l0KCk7IC8vanNob2xsIHRoaXMgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbi4gaWYgdGhlcmUgaXMgbm90IEpBUiB0aGVuIHRoZSB2ZXJzaW9uIGlzIHVuZGVmaW5lZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbiNnZXRWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpIGVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkKLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jaGFzTG9jYWxDbGllbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xvY2FsQ2xpZW50KCkgewotCQlyZXR1cm4gZ2V0TG9jYWxJbnRlcmZhY2UoKSAhPSBudWxsICYmIGdldExvY2FsSG9tZUludGVyZmFjZSgpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVudGVycHJpc2VCZWFuI2hhc1JlbW90ZUNsaWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVtb3RlQ2xpZW50KCkgewotCQlyZXR1cm4gZ2V0UmVtb3RlSW50ZXJmYWNlKCkgIT0gbnVsbCAmJiBnZXRIb21lSW50ZXJmYWNlKCkgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogIEdldCBtZXRob2QgbmFtZSBzdHJpbmcgb2YgZm9ybTogCi0JICogIG1ldGhvZE5hbWUoY2xhc3MgbmFtZSBvZiBhcmcxLGNsYXNzIG5hbWUgb2YgYXJnMiwuLi4pCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjQvMDAgMToyMToxMCBQTSkKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBwYXJhbSBtIE1ldGhvZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXRob2RLZXkoTWV0aG9kIG0pIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobS5nZXROYW1lKCkpOwotCi0JCXJlc3VsdC5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWphdmEudXRpbC5MaXN0IGFyZ3MgPSBtLmdldFBhcmFtZXRlcnMoKTsKLQkJSmF2YVBhcmFtZXRlciBhcmc7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotCQkJYXJnID0gKEphdmFQYXJhbWV0ZXIpIGFyZ3MuZ2V0KGkpOwotCQkJcmVzdWx0LmFwcGVuZCgoKEphdmFIZWxwZXJzKSBhcmcuZ2V0RVR5cGUoKSkuZ2V0SmF2YU5hbWUoKSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXN1bHQuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoKChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZSkuZ2V0RmVhdHVyZUlEKCksICgoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmUpLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTiA6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUUgOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU01BTExfSUNPTiA6Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTiA6Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUyA6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGdldFJlbW90ZUludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcGVydGllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTIDoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX1JFRlMgOgotCQkJCXJldHVybiBnZXRFamJSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUyA6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMgOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlJZGVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTkFNRSA6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZVN5bmNTZWN1cml0eVJvbGVSZWYoamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JCUxpc3Qgcm9sZVJlZnMgPSBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCVNlY3VyaXR5Um9sZVJlZiByb2xlUmVmID0gKFNlY3VyaXR5Um9sZVJlZikgcm9sZVJlZnMuZ2V0KGkpOwotCQkJaWYgKHJvbGVSZWYuZ2V0TGluaygpICE9IG51bGwgJiYgcm9sZVJlZi5nZXRMaW5rKCkuZXF1YWxzKGV4aXN0aW5nUm9sZU5hbWUpKQotCQkJCXJvbGVSZWYuc2V0TGluayhuZXdSb2xlTmFtZSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2V0RWpiQ2xhc3NOYW1lKFN0cmluZyBlamJDbGFzc05hbWUpIHsKLQkJZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9FamJDbGFzcygpLCBjcmVhdGVDbGFzc1JlZihlamJDbGFzc05hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SG9tZUludGVyZmFjZU5hbWUoU3RyaW5nIGhvbWVJbnRlcmZhY2VOYW1lKSB7Ci0JCWVTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihob21lSW50ZXJmYWNlTmFtZSkpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWVJbnRlcmZhY2VOYW1lKFN0cmluZyBsb2NhbEhvbWVJbnRlcmZhY2VOYW1lKSB7Ci0JCWVTZXQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCksIGNyZWF0ZUNsYXNzUmVmKGxvY2FsSG9tZUludGVyZmFjZU5hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0TG9jYWxJbnRlcmZhY2VOYW1lKFN0cmluZyBsb2NhbEludGVyZmFjZU5hbWUpIHsKLQkJZVNldChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihsb2NhbEludGVyZmFjZU5hbWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UmVtb3RlSW50ZXJmYWNlTmFtZShTdHJpbmcgcmVtb3RlSW50ZXJmYWNlTmFtZSkgewotCQllU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpLCBjcmVhdGVDbGFzc1JlZihyZW1vdGVJbnRlcmZhY2VOYW1lKSk7Ci0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yNC8wMCAxOjMyOjEzIFBNKQotCSAqIEByZXR1cm4gTWV0aG9kW10KLQkgKiBAcGFyYW0gbWV0aG9kcyBNZXRob2RbXQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1ldGhvZFtdIHNvcnRNZXRob2RzKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQkJTWV0aG9kIHJlc3VsdFtdID0gbmV3IE1ldGhvZFttZXRob2RzLmxlbmd0aF07Ci0KLQkJLyoqCi0JCSAqICBJbnNlcnQgZWFjaCBlbGVtZW50IG9mIGdpdmVuIGxpc3Qgb2YgbWV0aG9kcyBpbnRvIHJlc3VsdAotCQkgKiAgYXJhcnkgaW4gc29ydGVkIG9yZGVyCi0JCSAqLwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kIGN1cnJNZXRob2QgPSBtZXRob2RzW2ldOwotCQkJU3RyaW5nIGN1cnJNZXRob2ROYW1lID0gY3Vyck1ldGhvZC5nZXRTaWduYXR1cmUoKTsKLQkJCWludCBpbnNlcnRJbmRleCA9IDA7Ci0JCQl3aGlsZSAoaW5zZXJ0SW5kZXggPCBpKSB7Ci0JCQkJaWYgKGN1cnJNZXRob2ROYW1lLmNvbXBhcmVUbyhyZXN1bHRbaW5zZXJ0SW5kZXhdLmdldFNpZ25hdHVyZSgpKSA8PSAwKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpbnNlcnRJbmRleCsrOwotCQkJfQotCi0JCQlmb3IgKGludCBqID0gaW5zZXJ0SW5kZXg7IGogPD0gaTsgaisrKSB7Ci0JCQkJTWV0aG9kIHRtcE1ldGhvZCA9IHJlc3VsdFtqXTsKLQkJCQlyZXN1bHRbal0gPSBjdXJyTWV0aG9kOwotCQkJCWN1cnJNZXRob2QgPSB0bXBNZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZVJlZnMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGVSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVJvbGVSZWZzOwotCX0KLQotICAgIC8qKgotICAgICAqIEhhbmR3cml0dGVuIHZlcnNpb24gb2YgZ2V0RWpiQ2xhc3MoKToKLSAgICAgKi8KLSAKLSAKLSAgICBwdWJsaWMgSmF2YUNsYXNzIGdldEVqYkNsYXNzKCkgIHsgCi0gICAgICAgaWYgKGVqYkNsYXNzICE9IG51bGwgJiYgZWpiQ2xhc3MuZUlzUHJveHkoKSkgeyAKLSAgICAgICAgICBKYXZhQ2xhc3Mgb2xkRWpiQ2xhc3MgPSBlamJDbGFzczsgCi0gICAgICAgICAgSmF2YUNsYXNzIHJlc29sdmVkID0gKEphdmFDbGFzcylFY29yZVV0aWwucmVzb2x2ZShlamJDbGFzcywgdGhpcyk7IAotICAgICAgICAgIHJlc29sdmVkKHRoaXMuZWpiQ2xhc3MsIHJlc29sdmVkKTsKLSAgICAgICAgICB0aGlzLmVqYkNsYXNzID0gcmVzb2x2ZWQ7Ci0gICAgICAgICAgaWYgKGVqYkNsYXNzICE9IG9sZEVqYkNsYXNzKSB7IAotICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgCi0gICAgICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1MsIG9sZEVqYkNsYXNzLCBlamJDbGFzcykpOyAKLSAgICAgICAgICB9IAotICAgICAgIH0gCi0gICAgICAgcmV0dXJuIGVqYkNsYXNzOyAKLSAgICB9IAotIAotICAgICAgICAgCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJDbGFzcyhKYXZhQ2xhc3MgbmV3RWpiQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEVqYkNsYXNzID0gZWpiQ2xhc3M7Ci0JCWVqYkNsYXNzID0gbmV3RWpiQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1MsIG9sZEVqYkNsYXNzLCBlamJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SG9tZUludGVyZmFjZSgpIHsKLQkJaWYgKGhvbWVJbnRlcmZhY2UgIT0gbnVsbCAmJiBob21lSW50ZXJmYWNlLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRIb21lSW50ZXJmYWNlID0gaG9tZUludGVyZmFjZTsKLQkJCWhvbWVJbnRlcmZhY2UgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClob21lSW50ZXJmYWNlKTsKLQkJCWlmIChob21lSW50ZXJmYWNlICE9IG9sZEhvbWVJbnRlcmZhY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UsIG9sZEhvbWVJbnRlcmZhY2UsIGhvbWVJbnRlcmZhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaG9tZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0SG9tZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGhvbWVJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9tZUludGVyZmFjZShKYXZhQ2xhc3MgbmV3SG9tZUludGVyZmFjZSkgewotCQlKYXZhQ2xhc3Mgb2xkSG9tZUludGVyZmFjZSA9IGhvbWVJbnRlcmZhY2U7Ci0JCWhvbWVJbnRlcmZhY2UgPSBuZXdIb21lSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0UsIG9sZEhvbWVJbnRlcmZhY2UsIGhvbWVJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFJlbW90ZUludGVyZmFjZSgpIHsKLQkJaWYgKHJlbW90ZUludGVyZmFjZSAhPSBudWxsICYmIHJlbW90ZUludGVyZmFjZS5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkUmVtb3RlSW50ZXJmYWNlID0gcmVtb3RlSW50ZXJmYWNlOwotCQkJcmVtb3RlSW50ZXJmYWNlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcmVtb3RlSW50ZXJmYWNlKTsKLQkJCWlmIChyZW1vdGVJbnRlcmZhY2UgIT0gb2xkUmVtb3RlSW50ZXJmYWNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UsIG9sZFJlbW90ZUludGVyZmFjZSwgcmVtb3RlSW50ZXJmYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW90ZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0UmVtb3RlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gcmVtb3RlSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZUludGVyZmFjZShKYXZhQ2xhc3MgbmV3UmVtb3RlSW50ZXJmYWNlKSB7Ci0JCUphdmFDbGFzcyBvbGRSZW1vdGVJbnRlcmZhY2UgPSByZW1vdGVJbnRlcmZhY2U7Ci0JCXJlbW90ZUludGVyZmFjZSA9IG5ld1JlbW90ZUludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0UsIG9sZFJlbW90ZUludGVyZmFjZSwgcmVtb3RlSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVKQkphciBnZXRFamJKYXIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFSkJKYXIpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFamJKYXIoRUpCSmFyIG5ld0VqYkphcikgewotCQlpZiAobmV3RWpiSmFyICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVIgJiYgbmV3RWpiSmFyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RWpiSmFyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFamJKYXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RWpiSmFyKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3RWpiSmFyLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUiwgbmV3RWpiSmFyLCBuZXdFamJKYXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgc2VjdXJpdHktaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQKLQkgKiBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotCSAqLwotCXB1YmxpYyBTZWN1cml0eUlkZW50aXR5IGdldFNlY3VyaXR5SWRlbnRpdHkoKSB7Ci0JCXJldHVybiBzZWN1cml0eUlkZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eSBuZXdTZWN1cml0eUlkZW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlY3VyaXR5SWRlbnRpdHkgb2xkU2VjdXJpdHlJZGVudGl0eSA9IHNlY3VyaXR5SWRlbnRpdHk7Ci0JCXNlY3VyaXR5SWRlbnRpdHkgPSBuZXdTZWN1cml0eUlkZW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFksIG9sZFNlY3VyaXR5SWRlbnRpdHksIG5ld1NlY3VyaXR5SWRlbnRpdHkpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3VyaXR5SWRlbnRpdHkoU2VjdXJpdHlJZGVudGl0eSBuZXdTZWN1cml0eUlkZW50aXR5KSB7Ci0JCWlmIChuZXdTZWN1cml0eUlkZW50aXR5ICE9IHNlY3VyaXR5SWRlbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlY3VyaXR5SWRlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VjdXJpdHlJZGVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9JREVOVElUWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U2VjdXJpdHlJZGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZWN1cml0eUlkZW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobmV3U2VjdXJpdHlJZGVudGl0eSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFksIG5ld1NlY3VyaXR5SWRlbnRpdHksIG5ld1NlY3VyaXR5SWRlbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldExvY2FsSG9tZUludGVyZmFjZSgpIHsKLQkJaWYgKGxvY2FsSG9tZUludGVyZmFjZSAhPSBudWxsICYmIGxvY2FsSG9tZUludGVyZmFjZS5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkTG9jYWxIb21lSW50ZXJmYWNlID0gbG9jYWxIb21lSW50ZXJmYWNlOwotCQkJbG9jYWxIb21lSW50ZXJmYWNlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpbG9jYWxIb21lSW50ZXJmYWNlKTsKLQkJCWlmIChsb2NhbEhvbWVJbnRlcmZhY2UgIT0gb2xkTG9jYWxIb21lSW50ZXJmYWNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFLCBvbGRMb2NhbEhvbWVJbnRlcmZhY2UsIGxvY2FsSG9tZUludGVyZmFjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhbEhvbWVJbnRlcmZhY2U7Ci0JfQotCi0JcHVibGljIEphdmFDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TG9jYWxIb21lSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gbG9jYWxIb21lSW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsSG9tZUludGVyZmFjZShKYXZhQ2xhc3MgbmV3TG9jYWxIb21lSW50ZXJmYWNlKSB7Ci0JCUphdmFDbGFzcyBvbGRMb2NhbEhvbWVJbnRlcmZhY2UgPSBsb2NhbEhvbWVJbnRlcmZhY2U7Ci0JCWxvY2FsSG9tZUludGVyZmFjZSA9IG5ld0xvY2FsSG9tZUludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFLCBvbGRMb2NhbEhvbWVJbnRlcmZhY2UsIGxvY2FsSG9tZUludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0TG9jYWxJbnRlcmZhY2UoKSB7Ci0JCWlmIChsb2NhbEludGVyZmFjZSAhPSBudWxsICYmIGxvY2FsSW50ZXJmYWNlLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRMb2NhbEludGVyZmFjZSA9IGxvY2FsSW50ZXJmYWNlOwotCQkJbG9jYWxJbnRlcmZhY2UgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClsb2NhbEludGVyZmFjZSk7Ci0JCQlpZiAobG9jYWxJbnRlcmZhY2UgIT0gb2xkTG9jYWxJbnRlcmZhY2UpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFLCBvbGRMb2NhbEludGVyZmFjZSwgbG9jYWxJbnRlcmZhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9jYWxJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldExvY2FsSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gbG9jYWxJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxJbnRlcmZhY2UoSmF2YUNsYXNzIG5ld0xvY2FsSW50ZXJmYWNlKSB7Ci0JCUphdmFDbGFzcyBvbGRMb2NhbEludGVyZmFjZSA9IGxvY2FsSW50ZXJmYWNlOwotCQlsb2NhbEludGVyZmFjZSA9IG5ld0xvY2FsSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFLCBvbGRMb2NhbEludGVyZmFjZSwgbG9jYWxJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVIsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcGVydGllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlRW52UmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVqYkNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEhvbWVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2NhbEludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldExvY2FsSW50ZXJmYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGVudmlyb25tZW50UHJvcGVydGllcyAhPSBudWxsICYmICFlbnZpcm9ubWVudFByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VSZWZzICE9IG51bGwgJiYgIXJlc291cmNlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZWpiUmVmcyAhPSBudWxsICYmICFlamJSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiBlamJMb2NhbFJlZnMgIT0gbnVsbCAmJiAhZWpiTG9jYWxSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmcyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25SZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiBzZWN1cml0eVJvbGVSZWZzICE9IG51bGwgJiYgIXNlY3VyaXR5Um9sZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTOgotCQkJCXJldHVybiBlamJDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGhvbWVJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFTU9URV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIHJlbW90ZUludGVyZmFjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXJldHVybiBzZWN1cml0eUlkZW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9IT01FX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gbG9jYWxIb21lSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGxvY2FsSW50ZXJmYWNlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTOgotCQkJCXNldEVqYkNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0hPTUVfSU5URVJGQUNFOgotCQkJCXNldEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJc2V0U2VjdXJpdHlJZGVudGl0eSgoU2VjdXJpdHlJZGVudGl0eSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0xPQ0FMX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXNldExvY2FsSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdHZW4oKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUHJlc2VydmUgYWRhcHRlcnMgd2hlbiBvYmplY3QgaXMgcmVzb2x2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZWQoRU9iamVjdCBvcmlnaW5hbE9iamVjdCwgRU9iamVjdCByZXNvbHZlZE9iamVjdCkgewotCQlpZiAob3JpZ2luYWxPYmplY3QgIT0gbnVsbCAmJiByZXNvbHZlZE9iamVjdCAhPSBudWxsICYmIG9yaWdpbmFsT2JqZWN0ICE9IHJlc29sdmVkT2JqZWN0KSB7Ci0JCQlDb2xsZWN0aW9uIGNvbCA9IG9yaWdpbmFsT2JqZWN0LmVBZGFwdGVycygpOwotCQkJaWYgKCFjb2wuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3IgaXQgPSBjb2wuaXRlcmF0b3IoKTsKLQkJCQlBZGFwdGVyIGE7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlhID0gKEFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGEgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJCXJlc29sdmVkT2JqZWN0LmVBZGFwdGVycygpLmFkZChhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRFamJDbGFzc0dlbigpIHsKLQkJaWYgKGVqYkNsYXNzICE9IG51bGwgJiYgZWpiQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZEVqYkNsYXNzID0gZWpiQ2xhc3M7Ci0JCQllamJDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVqYkNsYXNzKTsKLQkJCWlmIChlamJDbGFzcyAhPSBvbGRFamJDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19FSkJfQ0xBU1MsIG9sZEVqYkNsYXNzLCBlamJDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlamJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0RWpiQ2xhc3MoKSB7Ci0JCXJldHVybiBlamJDbGFzczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudCNnZXRFQW5ub3RhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFQW5ub3RhdGlvbiBnZXRFQW5ub3RhdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQjZ2V0RUFubm90YXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RUFubm90YXRpb25zKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZkNTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLQotLyoqCi0gKiBUaGUgZW50aXR5IGVsZW1lbnQgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnk7IHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UsIGlmIGFueTsgdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3M7IHRoZSBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZTsgdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZTsgYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyByZWVudHJhbmN5OyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIGNtcC12ZXJzaW9uOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIGFic3RyYWN0IHNjaGVtYSBuYW1lOyBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkczsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQ7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQgZW50cmllczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucyBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0gKiBUaGUgb3B0aW9uYWwgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQgY21wLXZlcnNpb24gMi54LiBUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIFRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gSWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LgotICogVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5IGJlYW4gY21wLXZlcnNpb24gaXMgMS54LgotICogVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0gKiBUaGUgb3B0aW9uYWwgcXVlcnkgZWxlbWVudHMgbXVzdCBiZSBwcmVzZW50IGlmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQgcXVlcnkgbWV0aG9kcyBvdGhlciB0aGFuIGZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIHRoZSBlbnRpdHkgYmVhbi4KLSAqIFRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4gQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZgotICogdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlJbXBsIGV4dGVuZHMgRW50ZXJwcmlzZUJlYW5JbXBsIGltcGxlbWVudHMgRW50aXR5LCBFbnRlcnByaXNlQmVhbiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWVudHJhbnQoKSA8ZW0+UmVlbnRyYW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFRU5UUkFOVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWVudHJhbnQoKSA8ZW0+UmVlbnRyYW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlZW50cmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVlbnRyYW50ID0gUkVFTlRSQU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZWVudHJhbnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVlbnRyYW50RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBwcmltYXJ5S2V5ID0gbnVsbDsKLQlwdWJsaWMgRW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHkoKTsKLQl9Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleU5hbWUoKSB7Ci0JZ2V0UHJpbWFyeUtleSgpOwotCXJldHVybiBwcmltYXJ5S2V5ID09IG51bGwgPyBudWxsIDogcHJpbWFyeUtleS5nZXRRdWFsaWZpZWROYW1lKCk7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIEBhSmF2YUNsYXNzIGFzIGVxdWFsIHRvIHRoZQotICogaG9tZSwgcmVtb3RlLCBiZWFuIGNsYXNzLCBvciBrZXkgY2xhc3MuCi0gKi8KLXB1YmxpYyBib29sZWFuIGhhc0phdmFSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLmhhc0phdmFSZWZlcmVuY2UoYUphdmFDbGFzcyk7Ci0JaWYgKCFyZXN1bHQgJiYgYUphdmFDbGFzcyAhPSBudWxsKQotCQlyZXN1bHQgPSBhSmF2YUNsYXNzLmVxdWFscyhnZXRQcmltYXJ5S2V5KCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0vL1JldHVybiBmYWxzZSBieSBkZWZhdWx0Ci1wdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIGJvb2xlYW4gaXNFbnRpdHkoKSB7Ci0JcmV0dXJuIHRydWU7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBwcmltR2V0SXNSZWVudHJhbnQoKSB7Ci0gICByZXR1cm4gaXNSZWVudHJhbnQoKTsKLX0KLXByb3RlY3RlZCBKYXZhQ2xhc3MgcHJpbUdldFByaW1hcnlLZXkoKSB7Ci0JcmV0dXJuIGdldFByaW1hcnlLZXkoKTsKLX0KLQotcHVibGljIGphdmEubGFuZy5PYmplY3QgcHJpbVJlZlZhbHVlKEVPYmplY3QgZmVhdHVyZSkgewotCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKCgoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmUpLmdldEZlYXR1cmVJRCgpLCAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlKS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6IHJldHVybiBuZXcgQm9vbGVhbihpc1JlZW50cmFudCgpKTsKLQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUFJJTUFSWV9LRVk6IHJldHVybiBnZXRQcmltYXJ5S2V5KCk7Ci0JfQotCXJldHVybiBzdXBlci5wcmltUmVmVmFsdWUoZmVhdHVyZSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5TmFtZShTdHJpbmcgcHJpbWFyeUtleU5hbWUpIHsKLQllU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eV9QcmltYXJ5S2V5KCksIGNyZWF0ZUNsYXNzUmVmKHByaW1hcnlLZXlOYW1lKSk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eSBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZW50cmFudCgpIHsKLQkJcmV0dXJuIHJlZW50cmFudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWVudHJhbnQoYm9vbGVhbiBuZXdSZWVudHJhbnQpIHsKLQkJYm9vbGVhbiBvbGRSZWVudHJhbnQgPSByZWVudHJhbnQ7Ci0JCXJlZW50cmFudCA9IG5ld1JlZW50cmFudDsKLQkJYm9vbGVhbiBvbGRSZWVudHJhbnRFU2V0ID0gcmVlbnRyYW50RVNldDsKLQkJcmVlbnRyYW50RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQsIG9sZFJlZW50cmFudCwgcmVlbnRyYW50LCAhb2xkUmVlbnRyYW50RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXRSZWVudHJhbnQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVlbnRyYW50ID0gcmVlbnRyYW50OwotCQlib29sZWFuIG9sZFJlZW50cmFudEVTZXQgPSByZWVudHJhbnRFU2V0OwotCQlyZWVudHJhbnQgPSBSRUVOVFJBTlRfRURFRkFVTFQ7Ci0JCXJlZW50cmFudEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5ULCBvbGRSZWVudHJhbnQsIFJFRU5UUkFOVF9FREVGQVVMVCwgb2xkUmVlbnRyYW50RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXRSZWVudHJhbnQoKSB7Ci0JCXJldHVybiByZWVudHJhbnRFU2V0OwotCX0KLQotICAgIC8qKgotICAgICAqIEhhbmR3cml0dGVuIHZlcnNpb24gb2YgZ2V0UHJpbWFyeUtleSgpOgotICAgICAqLwotIAotIAotICAgIHB1YmxpYyBKYXZhQ2xhc3MgZ2V0UHJpbWFyeUtleSgpICB7IAotICAgICAgIGlmIChwcmltYXJ5S2V5ICE9IG51bGwgJiYgcHJpbWFyeUtleS5lSXNQcm94eSgpKSB7IAotICAgICAgICAgIEphdmFDbGFzcyBvbGRQcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsgCi0gICAgICAgICAgSmF2YUNsYXNzIHJlc29sdmVkID0gKEphdmFDbGFzcylFY29yZVV0aWwucmVzb2x2ZShwcmltYXJ5S2V5LCB0aGlzKTsgCi0gICAgICAgICAgcmVzb2x2ZWQodGhpcy5wcmltYXJ5S2V5LCByZXNvbHZlZCk7Ci0gICAgICAgICAgdGhpcy5wcmltYXJ5S2V5ID0gcmVzb2x2ZWQ7Ci0gICAgICAgICAgaWYgKHByaW1hcnlLZXkgIT0gb2xkUHJpbWFyeUtleSkgeyAKLSAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIAotICAgICAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fRUpCX0NMQVNTLCBvbGRQcmltYXJ5S2V5LCBwcmltYXJ5S2V5KSk7IAotICAgICAgICAgIH0gCi0gICAgICAgfSAKLSAgICAgICByZXR1cm4gcHJpbWFyeUtleTsgCi0gICAgfSAKLSAKLSAgICAgICAgIAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShKYXZhQ2xhc3MgbmV3UHJpbWFyeUtleSkgewotCQlKYXZhQ2xhc3Mgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCXByaW1hcnlLZXkgPSBuZXdQcmltYXJ5S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkVOVElUWV9fUFJJTUFSWV9LRVksIG9sZFByaW1hcnlLZXksIHByaW1hcnlLZXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfSkFSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfSkFSLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1JFU09VUkNFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9MT0NBTF9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1NFUlZJQ0VfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9KQVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9KQVIsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50UHJvcGVydGllcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlRW52UmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVqYkNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RWpiQ2xhc3MoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEhvbWVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1JFTU9URV9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZW1vdGVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2NhbEludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldExvY2FsSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6Ci0JCQkJcmV0dXJuIGlzUmVlbnRyYW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRQcmltYXJ5S2V5KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UHJpbWFyeUtleSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBlbnZpcm9ubWVudFByb3BlcnRpZXMgIT0gbnVsbCAmJiAhZW52aXJvbm1lbnRQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYlJlZnMgIT0gbnVsbCAmJiAhZWpiUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzICE9IG51bGwgJiYgIXJlc291cmNlRW52UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZWpiTG9jYWxSZWZzICE9IG51bGwgJiYgIWVqYkxvY2FsUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9DTEFTUzoKLQkJCQlyZXR1cm4gZWpiQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0hPTUVfSU5URVJGQUNFOgotCQkJCXJldHVybiBob21lSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRU1PVEVfSU5URVJGQUNFOgotCQkJCXJldHVybiByZW1vdGVJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGxvY2FsSG9tZUludGVyZmFjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXJldHVybiBsb2NhbEludGVyZmFjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOgotCQkJCXJldHVybiBpc1NldFJlZW50cmFudCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJcmV0dXJuIHByaW1hcnlLZXkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudmlyb25tZW50UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0SG9tZUludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRU1PVEVfSU5URVJGQUNFOgotCQkJCXNldFJlbW90ZUludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19MT0NBTF9IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXNldExvY2FsSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1JFRU5UUkFOVDoKLQkJCQlzZXRSZWVudHJhbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJc2V0UHJpbWFyeUtleSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfUkVGUzoKLQkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXNldExvY2FsSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOgotCQkJCXVuc2V0UmVlbnRyYW50KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJc2V0UHJpbWFyeUtleSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVlbnRyYW50OiAiKTsKLQkJaWYgKHJlZW50cmFudEVTZXQpIHJlc3VsdC5hcHBlbmQocmVlbnRyYW50KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZAotCSAqIGZvciBhbiBlbnRpdHkgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUKLQkgKiBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY21wLWZpZWxkCi0JICogZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLiAKLQkgKiBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5IGtleSBtYXBzIHRvIG11bHRpcGxlCi0JICogY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotCSAqIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZCB0aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgCi0JICogdG8gdGhlIGZpZWxkIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0JICogRXhhbXBsZXM6PHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8Ly9wcmltLWtleS1jbGFzcz4KLQkgKiAJPHByaW0ta2V5LWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZUlEPC8vcHJpbS1rZXktY2xhc3M+Ci0JICogCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuT2JqZWN0PC8vcHJpbS1rZXktY2xhc3M+Ci0KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFByaW1hcnlLZXlHZW4oKSB7Ci0JCWlmIChwcmltYXJ5S2V5ICE9IG51bGwgJiYgcHJpbWFyeUtleS5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCQlwcmltYXJ5S2V5ID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcHJpbWFyeUtleSk7Ci0JCQlpZiAocHJpbWFyeUtleSAhPSBvbGRQcmltYXJ5S2V5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5FTlRJVFlfX1BSSU1BUllfS0VZLCBvbGRQcmltYXJ5S2V5LCBwcmltYXJ5S2V5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByaW1hcnlLZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiBwcmltYXJ5S2V5OwotCX0KLQotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FeGNsdWRlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjVjNTk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkV4Y2x1ZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoZSBleGNsdWRlIGxpc3QgZWxlbWVudCBkZWZpbmVzIGEgc2V0IG9mIG1ldGhvZHMgd2hpY2ggdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLiBJdCBjb250YWlucyBvbmUgb3IgbW9yZSBtZXRob2RzLgotICogCi0gKiBJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgbXVzdCBjb25zaWRlciB0aG9zZSBtZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLSAqLwotcHVibGljIGNsYXNzIEV4Y2x1ZGVMaXN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXhjbHVkZUxpc3QsIEVPYmplY3QgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RFbGVtZW50cyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEV4Y2x1ZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNsdWRlTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCkgewotCQlpZiAobWV0aG9kRWxlbWVudHMgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kRWxlbWVudC5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRzICE9IG51bGwgJiYgIW1ldGhvZEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZEVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCWdldE1ldGhvZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1ldGhvZEVsZW1lbnRzKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCWlmIChhbkVKQiA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGVsZW1lbnRzID0gZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKGFuRUpCLmVxdWFscyhtZS5nZXRFbnRlcnByaXNlQmVhbigpKSkKLQkJCQlyZXN1bHQuYWRkKG1lKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvS2V5UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvS2V5UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmU2NWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0tleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGtleUF0dHJpYnV0ZXMgKHRoaXMgaW5jbHVkZXMgaW5oZXJpdGVkIAotICoga2V5IGF0dHJpYnV0ZXMpIGZyb20gdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGtleSBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgcG9pbnRlZCB0byBieSBhbiBFamJSZWxhdGlvbnNoaXBSb2xlLgotICogVGh1cywgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBjb250YWluIGtleSBhdHRyaWJ1dGVzIChpbmNsdWRpbmcgaW5oZXJpdGVkIGtleSBhdHRyaWJ1dGVzKSB0aGF0IG9ubHkKLSAqIGJlbG9uZyB0byByb2xlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDc6MjM6MjIgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBLZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQlyZXR1cm4gY21wLmdldEZpbHRlcmVkRmVhdHVyZXMoS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5zaW5nbGV0b24oKSk7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAgUE0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuS2V5UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIEtleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJc2luZ2xldG9uID0gbmV3IEtleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIoKTsKLQlyZXR1cm4gc2luZ2xldG9uOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTkwNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQotCi0vKioKLSAqIFRoaXMgZmlsdGVyIHdpbGwgcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSByZWxhdGlvbnNoaXBSb2xlcyAodGhpcyBpbmNsdWRlcwotICogaW5oZXJpdGVkIEVqYlJlbGF0aW9uc2hpcFJvbGVzKSBmcm9tIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uCi0gKiB0aGF0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgZmlsdGVyIG1ldGhvZC4gSXQgd2lsbCByZW1vdmUgYW55Ci0gKiBFamJSZWxhdGlvbnNoaXBSb2xlIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIGtleS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAKLSAqIDc6MTQ6NTcgUE0pIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEtleVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIEtleVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uOwotCi0gICAgLyoqCi0gICAgICogZmlsdGVyIG1ldGhvZCBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBmaWx0ZXIoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgTGlzdCBrZXlSb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApLml0ZXJhdG9yKCk7Ci0gICAgICAgIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocm9sZS5pc0tleSgpKSBrZXlSb2xlcy5hZGQocm9sZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGtleVJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzoxNTozNwotICAgICAqIFBNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBLZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHNpbmdsZXRvbigpIHsKLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKSBzaW5nbGV0b24gPSBuZXcgS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsS2V5QXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbEtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRkNTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0vKioKLSAqIFRoaXMgZmlsdGVyIHdpbGwgcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBrZXlBdHRyaWJ1dGVzIGZyb20gdGhlIAotICogQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiB0aGF0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgZmlsdGVyIG1ldGhvZC4KLSAqIEl0IHdpbGwgcmVtb3ZlIGFueSBrZXlQZXJzaXN0ZW50QXR0cmlidXRlcyB0aGF0IGFyZSBpbmhlcml0ZWQgYnkgYW55IHN1cGVydHlwZXMuCi0gKiBUaGF0IG1lYW5zIHRoZSByZXR1cm5lZCBsaXN0IG9mIENNUEF0dHJpYnV0ZXMgd2lsbCBiZSBrZXkgYXR0cmlidXRlcyB0aGF0IHdlcmUgZGVmaW5lZCBsb2NhbGx5Ci0gKiBmb3IgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgaGVsZCBieSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiBwbHVzIGtleSBhdHRyaWJ1dGVzCi0gKiB0aGF0IHdlcmUgYWRkZWQgZnJvbSBFamJSZWxhdGlvbnNoaXBSb2xlcyB0aGF0IGFyZSBoZWxkIGJ5IHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNjoyNDozMyBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIExvY2FsS2V5QXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBMb2NhbEtleUF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b247Ci0vKioKLSAqIFJldHVybiB0aGUgcHJvcGVyIGxpc3Qgb2YgYXR0cmlidXRlcyBmcm9tIGNtcEV4dC4KLSAqLwotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQlyZXR1cm4gbmV3IEFycmF5TGlzdChjbXAuZ2V0S2V5QXR0cmlidXRlcygpKTsKLX0KLS8qKgotICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYW5BdHRyaWJ1dGUgYWxzbyBleGlzdHMgaW4gdGhlIHN1cGVyRW50aXR5LgotICogRm9yIHRoaXMgZmlsdGVyLCBvbmx5IHRoZSBuYW1lIGhhcyB0byBiZSB0aGUgc2FtZS4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBlcnR5cGVBdHRyaWJ1dGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBzdXBlckVudGl0eSwgQ01QQXR0cmlidXRlIGFuQXR0cmlidXRlKSB7Ci0JQ01QQXR0cmlidXRlIGZvdW5kID0gc3VwZXJFbnRpdHkuZ2V0S2V5QXR0cmlidXRlKGFuQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JcmV0dXJuIGZvdW5kICE9IG51bGw7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAgUE0pCi0gKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuTG9jYWxLZXlBdHRyaWJ1dGVGaWx0ZXIKLSAqLwotcHVibGljIHN0YXRpYyBMb2NhbEtleUF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgTG9jYWxLZXlBdHRyaWJ1dGVGaWx0ZXIoKTsKLQlyZXR1cm4gc2luZ2xldG9uOwotfQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyYmE3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0vKioKLSAqIFRoaXMgZmlsdGVyIHdpbGwgcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlcyBmcm9tIHRoZQotICogQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiB0aGF0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgZmlsdGVyCi0gKiBtZXRob2QuIEl0IHdpbGwgcmVtb3ZlIGFueSBpbmhlcml0ZWQgcGVyc2lzdGVudEF0dHJpYnV0ZXMgYW5kIGFueQotICogcGVyc2lzdGVudEF0dHJpYnV0ZXMgdGhhdCBhcmUgaGVsZCBieSBFamJSZWxhdGlvbnNoaXBSb2xlIG9iamVjdHMgKGluY2x1ZGluZwotICogaW5oZXJpdGVkIEVqYlJlbGF0aW9uc2hpcFJvbGUgYXR0cmlidXRlcykuIFRoYXQgbWVhbnMgdGhlIHJldHVybmVkIGxpc3Qgb2YKLSAqIENNUEF0dHJpYnV0ZXMgd2lsbCBiZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBkZWZpbmVkIGxvY2FsbHkgbWludXMgYWxsCi0gKiBpbmhlcml0ZWQgYXR0cmlidXRlcyBhbmQgbWludXMgYW55IGF0dHJpYnV0ZXMgcG9pbnRlZCB0byBieQotICogRWpiUmVsYXRpb25zaGlwUm9sZXMsIHRodXMgdGhlIGF0dHJpYnV0ZXMgd2lsbCBvbmx5IGJlIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlCi0gKiBkZWZpbmVkIGxvY2FsbHkgYnkgdGhlIHVzZXIuIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDc6MzE6NDIgUE0pIEBhdXRob3I6Ci0gKiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIFN1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvcGVyIGxpc3Qgb2YgYXR0cmlidXRlcyBmcm9tIGNtcEV4dC4gUmV0dXJuIGxvY2FsCi0JICogYXR0cmlidXRlcyBtaW51cyB0aG9zZSBhZGRlZCBkdWUgdG8gUmVsYXRpb25zaGlwIFJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRTb3VyY2VBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCWphdmEudXRpbC5MaXN0IGxvY2FsID0gbnVsbCwgbG9jYWxSb2xlQXR0cmlidXRlczsgCi0JCWxvY2FsID0gY21wLmdldEZpbHRlcmVkRmVhdHVyZXMoTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLnNpbmdsZXRvbigpKTsKLQkJbG9jYWxSb2xlQXR0cmlidXRlcyA9IGNtcC5nZXRGaWx0ZXJlZEZlYXR1cmVzKExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5zaW5nbGV0b24oKSk7Ci0JCWlmKGxvY2FsICE9IG51bGwpCi0JCSAgbG9jYWwucmVtb3ZlQWxsKGxvY2FsUm9sZUF0dHJpYnV0ZXMpOwotCQlyZXR1cm4gbG9jYWw7Ci0JfQotCS8qKgotCSAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFuQXR0cmlidXRlIGFsc28gZXhpc3RzIGluIHRoZQotCSAqIHN1cGVyRW50aXR5LiBGb3IgdGhpcyBmaWx0ZXIsIG9ubHkgdGhlIG5hbWUgaGFzIHRvIGJlIHRoZSBzYW1lLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VwZXJ0eXBlQXR0cmlidXRlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJFbnRpdHksIENNUEF0dHJpYnV0ZSBhbkF0dHJpYnV0ZSkgewotCQlDTVBBdHRyaWJ1dGUgZm91bmQgPSBzdXBlckVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKGFuQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmb3VuZCAhPSBudWxsOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzY6MDAKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LmltcGwuTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQkJc2luZ2xldG9uID0gbmV3IExvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyKCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsT3Bwb3NpdGVSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYmM0NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcmVsYXRpb25zaGlwUm9sZXMgKHRoaXMgaW5jbHVkZXMKLSAqIGluaGVyaXRlZCBFamJSZWxhdGlvbnNoaXBSb2xlcykgZnJvbSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbgotICogdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGZpbHRlciBtZXRob2QuIEl0IHdpbGwgcmVtb3ZlIGFueQotICogRWpiUmVsYXRpb25zaGlwUm9sZSB0aGF0IGlzIGluaGVyaXRlZCBhbmQgaXQgd2lsbCByZXR1cm4gdGhlIG9wcG9zaXRlIHJvbGUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA3OjE0OjU3IFBNKSBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgTGlzdCB3aXRoIHRoZSBvcHBvc2l0ZSByb2xlcyBmb3IgdGhlIGxvY2FsIHJlbGF0aW9uc2hpcCByb2xlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBmaWx0ZXIoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgICAgICAgTGlzdCBvcHBvc2l0ZVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXMoY21wKS5pdGVyYXRvcigpOwotICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGUsIG9wcG9zaXRlOwotICAgICAgICB3aGlsZSAoaXQgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgb3Bwb3NpdGUgPSByb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCk7Ci0gICAgICAgICAgICBpZiAob3Bwb3NpdGUgIT0gbnVsbCkgb3Bwb3NpdGVSb2xlcy5hZGQob3Bwb3NpdGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcHBvc2l0ZVJvbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzoxNTozNwotICAgICAqIFBNKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Mb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uKCkgewotICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHNpbmdsZXRvbiA9IG5ldyBMb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTBjMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGVzIGZyb20gdGhlIAotICogQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiB0aGF0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgZmlsdGVyIG1ldGhvZC4KLSAqIEl0IHdpbGwgcmVtb3ZlIGFueSBwZXJzaXN0ZW50QXR0cmlidXRlcyB0aGF0IGFyZSBpbmhlcml0ZWQgYnkgYW55IHN1cGVydHlwZXMuCi0gKiBUaGF0IG1lYW5zIHRoZSByZXR1cm5lZCBsaXN0IG9mIENNUEF0dHJpYnV0ZXMgd2lsbCBiZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBkZWZpbmVkIGxvY2FsbHkKLSAqIGZvciB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBoZWxkIGJ5IHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHBsdXMgYXR0cmlidXRlcwotICogdGhhdCB3ZXJlIGFkZGVkIGZyb20gRWpiUmVsYXRpb25zaGlwUm9sZXMgdGhhdCBhcmUgaGVsZCBieSB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbi4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDU6MzU6MDMgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgZXh0ZW5kcyBTdXBlcnR5cGVDTVBBdHRyaWJ1dGVGaWx0ZXIgewotCXByaXZhdGUgc3RhdGljIExvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b247Ci0vKioKLSAqIFJldHVybiB0aGUgcHJvcGVyIGxpc3Qgb2YgYXR0cmlidXRlcyBmcm9tIGNtcEV4dC4KLSAqLwotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQlyZXR1cm4gbmV3IEFycmF5TGlzdChjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKSk7Ci19Ci0vKioKLSAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFuQXR0cmlidXRlIGFsc28gZXhpc3RzIGluIHRoZSBzdXBlckVudGl0eS4KLSAqIEZvciB0aGlzIGZpbHRlciwgb25seSB0aGUgbmFtZSBoYXMgdG8gYmUgdGhlIHNhbWUuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGlzU3VwZXJ0eXBlQXR0cmlidXRlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJFbnRpdHksIENNUEF0dHJpYnV0ZSBhbkF0dHJpYnV0ZSkgewotCUNNUEF0dHJpYnV0ZSBmb3VuZCA9IHN1cGVyRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYW5BdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQlyZXR1cm4gZm91bmQgIT0gbnVsbDsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMCBQTSkKLSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Mb2NhbFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIKLSAqLwotcHVibGljIHN0YXRpYyBMb2NhbFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJc2luZ2xldG9uID0gbmV3IExvY2FsUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcigpOwotCXJldHVybiBzaW5nbGV0b247Ci19Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGQ1MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSB0aGUgCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCBwb2ludGVkIHRvIGJ5IGFuIEVqYlJlbGF0aW9uc2hpcFJvbGUgYW5kCi0gKiBpdCB3aWxsIGZ1cnRoZXIgcmVtb3ZlIGF0dHJpYnV0ZXMgcG9pbnRlZCB0byBieSBpbmhlcml0ZWQgRWpiUmVsYXRpb25zaGlwUm9sZXMuCi0gKiBUaHVzLCB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGNvbnRhaW4gYXR0cmlidXRlcyB0aGF0IG9ubHkgYmVsb25nIHRvIGxvY2FsCi0gKiBFamJSZWxhdGlvbnNoaXBSb2xlcyAobm90IGluY2x1ZGluZyBpaGVyaXRlZCByb2xlcykuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA2OjQ2OjA4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBMb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIHJvbGVzIGZyb20gY21wRXh0LgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLSAgIHJldHVybiBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApOyAKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMCBQTSkKLSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5Mb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIKLSAqLwotcHVibGljIHN0YXRpYyBMb2NhbFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJc2luZ2xldG9uID0gbmV3IExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlcigpOwotCXJldHVybiBzaW5nbGV0b247Ci19Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTFiMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMb2NhbFJlbGF0aW9uc2hpcFJvbGVLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotCi1wdWJsaWMgc3RhdGljIExvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgTG9jYWxSZWxhdGlvbnNoaXBSb2xlS2V5QXR0cmlidXRlRmlsdGVyKCk7Ci0JcmV0dXJuIHNpbmdsZXRvbjsKLX0KLQotLyoqCi0gKiBmaWx0ZXIgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBMaXN0IGZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlJdGVyYXRvciBpdCA9IGdldFNvdXJjZVJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKLQlDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0Jd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQlyb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIGl0Lm5leHQoKTsKLQkJaWYgKHJvbGUuaXNLZXkoKSkKLQkJCWF0dHJpYnV0ZXMuYWRkQWxsKHJvbGUuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JcmV0dXJuIGF0dHJpYnV0ZXM7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNzc4NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkRlc3RpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZDsKLQotLyoqCi0gKiBUaGUgbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24gZWxlbWVudCBwcm92aWRlcyBhZHZpY2UgdG8gdGhlIERlcGxveWVyIGFzIHRvIHdoZXRoZXIgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlzIGludGVuZGVkIGZvciBhIFF1ZXVlIG9yIGEgVG9waWMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjogdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbnRlbmRlZCBkZXN0aW5hdGlvbiBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2Ygd2hldGhlciBhIGR1cmFibGUgb3Igbm9uLWR1cmFibGUgc3Vic2NyaXB0aW9uIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBkZXN0aW5hdGlvbi10eXBlIGlzIGphdmF4Lmptcy5Ub3BpYy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiwgRU9iamVjdHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFRZUEVfRURFRkFVTFQgPSBEZXN0aW5hdGlvblR5cGUuUVVFVUVfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEZXN0aW5hdGlvblR5cGUgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSA8ZW0+U3Vic2NyaXB0aW9uIER1cmFiaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfRURFRkFVTFQgPSBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5EVVJBQkxFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA9IFNVQlNDUklQVElPTl9EVVJBQklMSVRZX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3Vic2NyaXB0aW9uIER1cmFiaWxpdHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgSk1TIGRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KLQkgKiAKLQkgKiBUaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiBqYXZheC5qbXMuUXVldWUsIGphdmF4Lmptcy5Ub3BpYwotCSAqLwotCXB1YmxpYyBEZXN0aW5hdGlvblR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShEZXN0aW5hdGlvblR5cGUgbmV3VHlwZSkgewotCQlEZXN0aW5hdGlvblR5cGUgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlID09IG51bGwgPyBUWVBFX0VERUZBVUxUIDogbmV3VHlwZTsKLQkJYm9vbGVhbiBvbGRUeXBlRVNldCA9IHR5cGVFU2V0OwotCQl0eXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEUsIG9sZFR5cGUsIHR5cGUsICFvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHlwZSgpIHsKLQkJRGVzdGluYXRpb25UeXBlIG9sZFR5cGUgPSB0eXBlOwotCQlib29sZWFuIG9sZFR5cGVFU2V0ID0gdHlwZUVTZXQ7Ci0JCXR5cGUgPSBUWVBFX0VERUZBVUxUOwotCQl0eXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEUsIG9sZFR5cGUsIFRZUEVfRURFRkFVTFQsIG9sZFR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBKTVMgdG9waWMgc3Vic2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIGR1cmFibGUgb3Igbm9uZHVyYWJsZS4KLQkgKiAKLQkgKiBUaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzogIER1cmFibGUsIE5vbkR1cmFibGUKLQotCSAqLwotCXB1YmxpYyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBnZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkgewotCQlyZXR1cm4gc3Vic2NyaXB0aW9uRHVyYWJpbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIG5ld1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkpIHsKLQkJU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSA9IHN1YnNjcmlwdGlvbkR1cmFiaWxpdHk7Ci0JCXN1YnNjcmlwdGlvbkR1cmFiaWxpdHkgPSBuZXdTdWJzY3JpcHRpb25EdXJhYmlsaXR5ID09IG51bGwgPyBTVUJTQ1JJUFRJT05fRFVSQUJJTElUWV9FREVGQVVMVCA6IG5ld1N1YnNjcmlwdGlvbkR1cmFiaWxpdHk7Ci0JCWJvb2xlYW4gb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQgPSBzdWJzY3JpcHRpb25EdXJhYmlsaXR5RVNldDsKLQkJc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19TVUJTQ1JJUFRJT05fRFVSQUJJTElUWSwgb2xkU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSwgIW9sZFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5KCkgewotCQlTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBvbGRTdWJzY3JpcHRpb25EdXJhYmlsaXR5ID0gc3Vic2NyaXB0aW9uRHVyYWJpbGl0eTsKLQkJYm9vbGVhbiBvbGRTdWJzY3JpcHRpb25EdXJhYmlsaXR5RVNldCA9IHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0OwotCQlzdWJzY3JpcHRpb25EdXJhYmlsaXR5ID0gU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFlfRURFRkFVTFQ7Ci0JCXN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFksIG9sZFN1YnNjcmlwdGlvbkR1cmFiaWxpdHksIFNVQlNDUklQVElPTl9EVVJBQklMSVRZX0VERUZBVUxULCBvbGRTdWJzY3JpcHRpb25EdXJhYmlsaXR5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpIHsKLQkJcmV0dXJuIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRHJpdmVuIGdldEJlYW4oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4pIHJldHVybiBudWxsOwotCQlyZXR1cm4gKE1lc3NhZ2VEcml2ZW4pZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCZWFuKE1lc3NhZ2VEcml2ZW4gbmV3QmVhbikgewotCQlpZiAobmV3QmVhbiAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4gJiYgbmV3QmVhbiAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0JlYW4pKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0JlYW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QmVhbikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04sIE1lc3NhZ2VEcml2ZW4uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0JlYW4sIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTiwgbmV3QmVhbiwgbmV3QmVhbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTiwgTWVzc2FnZURyaXZlbi5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fU1VCU0NSSVBUSU9OX0RVUkFCSUxJVFk6Ci0JCQkJcmV0dXJuIGdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlyZXR1cm4gZ2V0QmVhbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZOgotCQkJCXJldHVybiBpc1NldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlyZXR1cm4gZ2V0QmVhbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZSgoRGVzdGluYXRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZOgotCQkJCXNldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU46Ci0JCQkJc2V0QmVhbigoTWVzc2FnZURyaXZlbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRToKLQkJCQl1bnNldFR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1NVQlNDUklQVElPTl9EVVJBQklMSVRZOgotCQkJCXVuc2V0U3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fQkVBTjoKLQkJCQlzZXRCZWFuKChNZXNzYWdlRHJpdmVuKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7Ci0JCWlmICh0eXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0eXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eTogIik7Ci0JCWlmIChzdWJzY3JpcHRpb25EdXJhYmlsaXR5RVNldCkgcmVzdWx0LmFwcGVuZChzdWJzY3JpcHRpb25EdXJhYmlsaXR5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDcwMzNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFja25vd2xlZGdlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRHJpdmVuSW1wbCBleHRlbmRzIEVudGVycHJpc2VCZWFuSW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VEcml2ZW57Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA9IFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSA9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZVNlbGVjdG9yKCkgPGVtPk1lc3NhZ2UgU2VsZWN0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VTZWxlY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9TRUxFQ1RPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2VTZWxlY3RvciA9IE1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFja25vd2xlZGdlTW9kZSgpIDxlbT5BY2tub3dsZWRnZSBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2tub3dsZWRnZU1vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQWNrbm93bGVkZ2VNb2RlIEFDS05PV0xFREdFX01PREVfRURFRkFVTFQgPSBBY2tub3dsZWRnZU1vZGUuQVVUT19BQ0tOT1dMRURHRV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEFja25vd2xlZGdlTW9kZSBhY2tub3dsZWRnZU1vZGUgPSBBQ0tOT1dMRURHRV9NT0RFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQWNrbm93bGVkZ2UgTW9kZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNrbm93bGVkZ2VNb2RlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rKCkgPGVtPkxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGluayA9IExJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIGRlc3RpbmF0aW9uID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uQ29uZmlnKCkgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZhdGlvbkNvbmZpZyBhY3RpdmF0aW9uQ29uZmlnID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgbWVzc2FnZURlc3RpbmF0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2luZ1R5cGUoKSA8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgbWVzc2FnaW5nVHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgTWVzc2FnZURyaXZlbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbigpOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlRHJpdmVuKCkgewotCXJldHVybiB0cnVlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQkgKiAKLQkgKiBUaGUgdHJhbnNhY3Rpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOiBCZWFuLCBDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlIGdldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlIG5ld1RyYW5zYWN0aW9uVHlwZSkgewotCQlUcmFuc2FjdGlvblR5cGUgb2xkVHJhbnNhY3Rpb25UeXBlID0gdHJhbnNhY3Rpb25UeXBlOwotCQl0cmFuc2FjdGlvblR5cGUgPSBuZXdUcmFuc2FjdGlvblR5cGUgPT0gbnVsbCA/IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQgOiBuZXdUcmFuc2FjdGlvblR5cGU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25UeXBlRVNldCA9IHRyYW5zYWN0aW9uVHlwZUVTZXQ7Ci0JCXRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIHRyYW5zYWN0aW9uVHlwZSwgIW9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlID0gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEUsIG9sZFRyYW5zYWN0aW9uVHlwZSwgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCwgb2xkVHJhbnNhY3Rpb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbWVzc2FnZS1zZWxlY3RvciBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgSk1TIG1lc3NhZ2UKLQkgKiBzZWxlY3RvciB0byBiZSB1c2VkIGluIGRldGVybWluaW5nIHdoaWNoIG1lc3NhZ2VzIGEgbWVzc2FnZS1kcml2ZW4KLQkgKiBiZWFuIGlzIHRvIHJlY2VpdmUuCi0JICogCi0JICogRXhhbXBsZSB2YWx1ZTogCi0JICogSk1TVHlwZSA9IGBjYXInIEFORCBjb2xvciA9IGBibHVlJyBBTkQgd2VpZ2h0ID4gMjUwMAotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlU2VsZWN0b3IoKSB7Ci0JCXJldHVybiBtZXNzYWdlU2VsZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVNlbGVjdG9yKFN0cmluZyBuZXdNZXNzYWdlU2VsZWN0b3IpIHsKLQkJU3RyaW5nIG9sZE1lc3NhZ2VTZWxlY3RvciA9IG1lc3NhZ2VTZWxlY3RvcjsKLQkJbWVzc2FnZVNlbGVjdG9yID0gbmV3TWVzc2FnZVNlbGVjdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX1NFTEVDVE9SLCBvbGRNZXNzYWdlU2VsZWN0b3IsIG1lc3NhZ2VTZWxlY3RvcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBhY2tub3dsZWRnbWVudCBtb2RlIGZvciB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBpZiBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gaXMgdXNlZCAoaWUuIHNlbGYudHJhbnNhY3Rpb25UeXBlID0gQmVhbikKLQkgKiAKLQkgKiBUaGUgYWNrbm93bGVkZ2UtbW9kZSBzcGVjaWZpZXMgd2hldGhlciBKTVMgQVVUT19BQ0tOT1dMRURHRSBvciBEVVBTX09LX0FDS05PV0xFREdFIG1lc3NhZ2UgYWNrbm93bGVkZ21lbnQgc2VtYW50aWNzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgb25NZXNzYWdlIG1lc3NhZ2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIHRoYXQgdXNlcyBiZWFuIG1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24uCi0JICogCi0JICogVGhlIGFja25vd2xlZGdlLW1vZGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6ICBBdXRvLWFja25vd2xlZGdlLCBEdXBzLW9rLWFja25vd2xlZGdlCi0KLQkgKi8KLQlwdWJsaWMgQWNrbm93bGVkZ2VNb2RlIGdldEFja25vd2xlZGdlTW9kZSgpIHsKLQkJcmV0dXJuIGFja25vd2xlZGdlTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2tub3dsZWRnZU1vZGUoQWNrbm93bGVkZ2VNb2RlIG5ld0Fja25vd2xlZGdlTW9kZSkgewotCQlBY2tub3dsZWRnZU1vZGUgb2xkQWNrbm93bGVkZ2VNb2RlID0gYWNrbm93bGVkZ2VNb2RlOwotCQlhY2tub3dsZWRnZU1vZGUgPSBuZXdBY2tub3dsZWRnZU1vZGUgPT0gbnVsbCA/IEFDS05PV0xFREdFX01PREVfRURFRkFVTFQgOiBuZXdBY2tub3dsZWRnZU1vZGU7Ci0JCWJvb2xlYW4gb2xkQWNrbm93bGVkZ2VNb2RlRVNldCA9IGFja25vd2xlZGdlTW9kZUVTZXQ7Ci0JCWFja25vd2xlZGdlTW9kZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ0tOT1dMRURHRV9NT0RFLCBvbGRBY2tub3dsZWRnZU1vZGUsIGFja25vd2xlZGdlTW9kZSwgIW9sZEFja25vd2xlZGdlTW9kZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFja25vd2xlZGdlTW9kZSgpIHsKLQkJQWNrbm93bGVkZ2VNb2RlIG9sZEFja25vd2xlZGdlTW9kZSA9IGFja25vd2xlZGdlTW9kZTsKLQkJYm9vbGVhbiBvbGRBY2tub3dsZWRnZU1vZGVFU2V0ID0gYWNrbm93bGVkZ2VNb2RlRVNldDsKLQkJYWNrbm93bGVkZ2VNb2RlID0gQUNLTk9XTEVER0VfTU9ERV9FREVGQVVMVDsKLQkJYWNrbm93bGVkZ2VNb2RlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREUsIG9sZEFja25vd2xlZGdlTW9kZSwgQUNLTk9XTEVER0VfTU9ERV9FREVGQVVMVCwgb2xkQWNrbm93bGVkZ2VNb2RlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWNrbm93bGVkZ2VNb2RlKCkgewotCQlyZXR1cm4gYWNrbm93bGVkZ2VNb2RlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBBbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgaW50ZW5kZWQgZGVzdGluYXRpb24gdHlwZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotCSAqLwotCXB1YmxpYyBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gZ2V0RGVzdGluYXRpb24oKSB7Ci0JCXJldHVybiBkZXN0aW5hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREZXN0aW5hdGlvbihNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gbmV3RGVzdGluYXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIG9sZERlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JCWRlc3RpbmF0aW9uID0gbmV3RGVzdGluYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OLCBvbGREZXN0aW5hdGlvbiwgbmV3RGVzdGluYXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBuZXdEZXN0aW5hdGlvbikgewotCQlpZiAobmV3RGVzdGluYXRpb24gIT0gZGVzdGluYXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlc3RpbmF0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOLCBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0Rlc3RpbmF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Rlc3RpbmF0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOLCBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGVzdGluYXRpb24obmV3RGVzdGluYXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT04sIG5ld0Rlc3RpbmF0aW9uLCBuZXdEZXN0aW5hdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnIGdldEFjdGl2YXRpb25Db25maWcoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyBuZXdBY3RpdmF0aW9uQ29uZmlnLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUFjdGl2YXRpb25Db25maWcgb2xkQWN0aXZhdGlvbkNvbmZpZyA9IGFjdGl2YXRpb25Db25maWc7Ci0JCWFjdGl2YXRpb25Db25maWcgPSBuZXdBY3RpdmF0aW9uQ29uZmlnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRywgb2xkQWN0aXZhdGlvbkNvbmZpZywgbmV3QWN0aXZhdGlvbkNvbmZpZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG5ld0FjdGl2YXRpb25Db25maWcpIHsKLQkJaWYgKG5ld0FjdGl2YXRpb25Db25maWcgIT0gYWN0aXZhdGlvbkNvbmZpZykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWN0aXZhdGlvbkNvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY3RpdmF0aW9uQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjdGl2YXRpb25Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWN0aXZhdGlvbkNvbmZpZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjdGl2YXRpb25Db25maWcobmV3QWN0aXZhdGlvbkNvbmZpZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRywgbmV3QWN0aXZhdGlvbkNvbmZpZywgbmV3QWN0aXZhdGlvbkNvbmZpZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uICE9IG51bGwgJiYgbWVzc2FnZURlc3RpbmF0aW9uLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRNZXNzYWdlRGVzdGluYXRpb24gPSBtZXNzYWdlRGVzdGluYXRpb247Ci0JCQltZXNzYWdlRGVzdGluYXRpb24gPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCltZXNzYWdlRGVzdGluYXRpb24pOwotCQkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvbiAhPSBvbGRNZXNzYWdlRGVzdGluYXRpb24pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OLCBvbGRNZXNzYWdlRGVzdGluYXRpb24sIG1lc3NhZ2VEZXN0aW5hdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldE1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb24oSmF2YUNsYXNzIG5ld01lc3NhZ2VEZXN0aW5hdGlvbikgewotCQlKYXZhQ2xhc3Mgb2xkTWVzc2FnZURlc3RpbmF0aW9uID0gbWVzc2FnZURlc3RpbmF0aW9uOwotCQltZXNzYWdlRGVzdGluYXRpb24gPSBuZXdNZXNzYWdlRGVzdGluYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT04sIG9sZE1lc3NhZ2VEZXN0aW5hdGlvbiwgbWVzc2FnZURlc3RpbmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5rKCkgewotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rKFN0cmluZyBuZXdMaW5rKSB7Ci0JCVN0cmluZyBvbGRMaW5rID0gbGluazsKLQkJbGluayA9IG5ld0xpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xJTkssIG9sZExpbmssIGxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldE1lc3NhZ2luZ1R5cGUoKSB7Ci0JCWlmIChtZXNzYWdpbmdUeXBlICE9IG51bGwgJiYgbWVzc2FnaW5nVHlwZS5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkTWVzc2FnaW5nVHlwZSA9IG1lc3NhZ2luZ1R5cGU7Ci0JCQltZXNzYWdpbmdUeXBlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpbWVzc2FnaW5nVHlwZSk7Ci0JCQlpZiAobWVzc2FnaW5nVHlwZSAhPSBvbGRNZXNzYWdpbmdUeXBlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHSU5HX1RZUEUsIG9sZE1lc3NhZ2luZ1R5cGUsIG1lc3NhZ2luZ1R5cGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWVzc2FnaW5nVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0TWVzc2FnaW5nVHlwZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2luZ1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnaW5nVHlwZShKYXZhQ2xhc3MgbmV3TWVzc2FnaW5nVHlwZSkgewotCQlKYXZhQ2xhc3Mgb2xkTWVzc2FnaW5nVHlwZSA9IG1lc3NhZ2luZ1R5cGU7Ci0JCW1lc3NhZ2luZ1R5cGUgPSBuZXdNZXNzYWdpbmdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRSwgb2xkTWVzc2FnaW5nVHlwZSwgbWVzc2FnaW5nVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0pBUjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19FSkJfSkFSLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OOgotCQkJCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZXN0aW5hdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OLCBudWxsLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RGVzdGluYXRpb24oKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbilvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0VKQl9KQVIsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJCXJldHVybiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RGVzdGluYXRpb24obnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0VKQl9SRUZTOgotCQkJCXJldHVybiBnZXRFamJSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19FSkJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFamJDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldEVqYkNsYXNzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEhvbWVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlbW90ZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldFJlbW90ZUludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19FSkJfSkFSOgotCQkJCXJldHVybiBnZXRFamJKYXIoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTE9DQUxfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRMb2NhbEludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9TRUxFQ1RPUjoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZVNlbGVjdG9yKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREU6Ci0JCQkJcmV0dXJuIGdldEFja25vd2xlZGdlTW9kZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19MSU5LOgotCQkJCXJldHVybiBnZXRMaW5rKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OOgotCQkJCXJldHVybiBnZXREZXN0aW5hdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0QWN0aXZhdGlvbkNvbmZpZygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0lOR19UWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWVzc2FnaW5nVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldE1lc3NhZ2luZ1R5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGVudmlyb25tZW50UHJvcGVydGllcyAhPSBudWxsICYmICFlbnZpcm9ubWVudFByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZVJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYlJlZnMgIT0gbnVsbCAmJiAhZWpiUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYkxvY2FsUmVmcyAhPSBudWxsICYmICFlamJMb2NhbFJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0NMQVNTOgotCQkJCXJldHVybiBlamJDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19IT01FX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gaG9tZUludGVyZmFjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19SRU1PVEVfSU5URVJGQUNFOgotCQkJCXJldHVybiByZW1vdGVJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5SWRlbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGxvY2FsSG9tZUludGVyZmFjZSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGxvY2FsSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfU0VMRUNUT1I6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2VTZWxlY3RvciAhPSBudWxsIDogIU1FU1NBR0VfU0VMRUNUT1JfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VTZWxlY3Rvcik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREU6Ci0JCQkJcmV0dXJuIGlzU2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xJTks6Ci0JCQkJcmV0dXJuIExJTktfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmsgIT0gbnVsbCA6ICFMSU5LX0VERUZBVUxULmVxdWFscyhsaW5rKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT046Ci0JCQkJcmV0dXJuIGRlc3RpbmF0aW9uICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDVElWQVRJT05fQ09ORklHOgotCQkJCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlyZXR1cm4gbWVzc2FnaW5nVHlwZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudmlyb25tZW50UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXNldExvY2FsSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlzZXRUcmFuc2FjdGlvblR5cGUoKFRyYW5zYWN0aW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX1NFTEVDVE9SOgotCQkJCXNldE1lc3NhZ2VTZWxlY3RvcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0FDS05PV0xFREdFX01PREU6Ci0JCQkJc2V0QWNrbm93bGVkZ2VNb2RlKChBY2tub3dsZWRnZU1vZGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTElOSzoKLQkJCQlzZXRMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fREVTVElOQVRJT046Ci0JCQkJc2V0RGVzdGluYXRpb24oKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ1RJVkFUSU9OX0NPTkZJRzoKLQkJCQlzZXRBY3RpdmF0aW9uQ29uZmlnKChBY3RpdmF0aW9uQ29uZmlnKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHSU5HX1RZUEU6Ci0JCQkJc2V0TWVzc2FnaW5nVHlwZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1JFU09VUkNFX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0NMQVNTOgotCQkJCXNldEVqYkNsYXNzKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19SRU1PVEVfSU5URVJGQUNFOgotCQkJCXNldFJlbW90ZUludGVyZmFjZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1NFQ1VSSVRZX0lERU5USVRZOgotCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19MT0NBTF9IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0xPQ0FMX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEludGVyZmFjZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQl1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fTUVTU0FHRV9TRUxFQ1RPUjoKLQkJCQlzZXRNZXNzYWdlU2VsZWN0b3IoTUVTU0FHRV9TRUxFQ1RPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19BQ0tOT1dMRURHRV9NT0RFOgotCQkJCXVuc2V0QWNrbm93bGVkZ2VNb2RlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19MSU5LOgotCQkJCXNldExpbmsoTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTjoKLQkJCQlzZXREZXN0aW5hdGlvbigoTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fQUNUSVZBVElPTl9DT05GSUc6Ci0JCQkJc2V0QWN0aXZhdGlvbkNvbmZpZygoQWN0aXZhdGlvbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX01FU1NBR0VfREVTVElOQVRJT046Ci0JCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19NRVNTQUdJTkdfVFlQRToKLQkJCQlzZXRNZXNzYWdpbmdUeXBlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0cmFuc2FjdGlvblR5cGU6ICIpOwotCQlpZiAodHJhbnNhY3Rpb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc2FjdGlvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXNzYWdlU2VsZWN0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1lc3NhZ2VTZWxlY3Rvcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWNrbm93bGVkZ2VNb2RlOiAiKTsKLQkJaWYgKGFja25vd2xlZGdlTW9kZUVTZXQpIHJlc3VsdC5hcHBlbmQoYWNrbm93bGVkZ2VNb2RlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogQHNlZSBFbnRlcnByaXNlQmVhbiNnZXRBdmFpbGFibGVMb2NhbEhvbWVNZXRob2RFbGVtZW50cygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogQHNlZSBFbnRlcnByaXNlQmVhbiNnZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jZ2V0QXZhaWxhYmxlUmVtb3RlTWV0aG9kRWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW5JbXBsI2dldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSB7Ci0JCS8vVGhlcmUgaXMgb25seSB0aGUgb25NZXNzYWdlIG1ldGhvZAotCQlMaXN0IHNpZ3MgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlzaWdzLmFkZCgib25NZXNzYWdlKGphdmF4Lmptcy5NZXNzYWdlKSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzaWdzOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc0NDRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLk1ldGhvZEVsZW1lbnRIZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLSAqIGhvbWUgb3IgcmVtb3RlIGludGVyZmFjZSwgb3IgYSBzZXQgb2YgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQKLSAqIG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIGRlY2xhcmVkIGluIHRoZQotICogZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8KLSAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBkZWZpbmVkIGluCi0gKiBib3RoIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLSAqIHRoZSBtZXRob2QgbmFtZTsgYW5kIHRoZSBvcHRpb25hbCBtZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IGEKLSAqIHNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbWV0aG9kIG5hbWUuCi0gKiAKLSAqIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHN5bnRheDoKLSAqIAotICogMS4gCTxtZXRob2Q+Ci0gKiAJCTxlamItbmFtZT5FSkJOQU1FPC8vZWpiLW5hbWU+Ci0gKiAgICAJCTxtZXRob2QtbmFtZT4qPC8vbWV0aG9kLW5hbWU+Ci0gKiAJPC8vbWV0aG9kPgotICogCi0gKiAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQKLSAqICAgIGVudGVycHJpc2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLgotICogCi0gKiAyLiAJPG1ldGhvZD4KLSAqIAkJPGVqYi1uYW1lPkVKQk5BTUU8Ly9lamItbmFtZT4KLSAqICAgIAkJPG1ldGhvZC1uYW1lPk1FVEhPRDwvL21ldGhvZC1uYW1lPgotICogCTwvL21ldGhvZD4+Ci0gKiAKLSAqICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUKLSAqICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIHdpdGgKLSAqICAgIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMgdG8KLSAqICAgIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuCi0gKiAKLSAqIAotICogCi0gKiAKLSAqIAotICogMy4gCTxtZXRob2Q+Ci0gKiAJCTxlamItbmFtZT5FSkJOQU1FPC8vZWpiLW5hbWU+Ci0gKiAgICAJCTxtZXRob2QtbmFtZT5NRVRIT0Q8Ly9tZXRob2QtbmFtZT4KLSAqIAkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAgICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLTE8Ly9tZXRob2QtcGFyYW0+Ci0gKiAgICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLTI8Ly9tZXRob2QtcGFyYW0+Ci0gKiAgICAgICAgICAgCQkJLi4uCi0gKiAgICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLW48Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJPG1ldGhvZD4JCi0gKiAKLSAqICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mCi0gKiAgICBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2ggUEFSQU0tbiBhcmUgdGhlCi0gKiAgICBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYKLSAqICAgIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAotICogICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gKiAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUKLSAqICAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLgotICogCi0gKiAKLSAqIFVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uIGFuZCBjb250YWluZXItdHJhbnNhY3Rpb24KLSAqIAotICogRXhhbXBsZXM6Ci0gKiAKLSAqICAgICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgb2YKLSAqIAkJdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXM6Ci0gKiAKLSAqIAkJPG1ldGhvZD4KLSAqIAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8Ly9lamItbmFtZT4KLSAqIAkJCTxtZXRob2QtbmFtZT4qPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIAotICogCVN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgY3JlYXRlCi0gKiAJCW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0gKiAKLSAqICAgICAJCTxtZXRob2Q+Ci0gKiAJCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC8vZWpiLW5hbWU+Ci0gKiAJCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC8vbWV0aG9kLW5hbWU+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIAotICogCVN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotICogCQljcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi0gKiAJIAlFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotICogCi0gKiAgICAgCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvL21ldGhvZC1uYW1lPgotICogCQkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIAotICogCQotICogCVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi0gKiAJbW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZAotICogCQkJZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwKLSAqIAkJCQlteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikKLSAqICAgICAgICAgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotICogCi0gKiAgICAgCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1uYW1lPmZvb2JhcjwvL21ldGhvZC1uYW1lPgotICogCQkJPG1ldGhvZC1wYXJhbXM+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5jaGFyPC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+aW50PC8vbWV0aG9kLXBhcmFtPgotICogCQkJCTxtZXRob2QtcGFyYW0+aW50W108Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQkJPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCTwvL21ldGhvZC1wYXJhbXM+Ci0gKiAJCTwvL21ldGhvZD4KLSAqIAotICogCVRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcwotICogICAgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lCi0gKiAgICBpbnRlcmZhY2UgYW5kIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIHRoYXQgaXMKLSAqICAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0gKiAKLSAqIAlGb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqICAgIAkJPG1ldGhvZD4KLSAqIAkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8Ly9lamItbmFtZT4KLSAqIAkJCTxtZXRob2QtaW50Zj5SZW1vdGU8Ly9tZXRob2QtaW50Zj4KLSAqIAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8Ly9tZXRob2QtbmFtZT4KLSAqIAkJCTxtZXRob2QtcGFyYW1zPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQk8Ly9tZXRob2QtcGFyYW1zPgotICogCQk8Ly9tZXRob2Q+Ci0gKiAKLSAqIAljYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZAotICogICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBmcm9tIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpCi0gKiAgICBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLSAqIAotICogICAgCQk8bWV0aG9kPgotICogCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvL2VqYi1uYW1lPgotICogCQkJPG1ldGhvZC1pbnRmPkhvbWU8Ly9tZXRob2QtaW50Zj4KLSAqIAkJCTxtZXRob2QtbmFtZT5jcmVhdGU8Ly9tZXRob2QtbmFtZT4KLSAqIAkJCTxtZXRob2QtcGFyYW1zPgotICogCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvL21ldGhvZC1wYXJhbT4KLSAqIAkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8Ly9tZXRob2QtcGFyYW0+Ci0gKiAJCQk8Ly9tZXRob2QtcGFyYW1zPgotICogCQk8Ly9tZXRob2Q+Ci0KLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXRob2RFbGVtZW50IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFybXMoKSA8ZW0+UGFybXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcm1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcm1zID0gUEFSTVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIFRZUEVfRURFRkFVTFQgPSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRLaW5kIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRW50ZXJwcmlzZUJlYW4gZW50ZXJwcmlzZUJlYW4gPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBNZXRob2RFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi1wdWJsaWMgdm9pZCBhZGRNZXRob2RQYXJhbXMoU3RyaW5nIHBhcmFtKSB7IAotCVN0cmluZyBvbGRQYXJtcyA9IGdldFBhcm1zKCk7Ci0JaWYgKG9sZFBhcm1zID09IG51bGwpIHsKLQkJc2V0UGFybXMocGFyYW0pOwotCX0gZWxzZSB7Ci0JCXNldFBhcm1zKG9sZFBhcm1zLmNvbmNhdCgiICIpLmNvbmNhdChwYXJhbSkpOyAvLyROT04tTkxTLTEkCi0JfQotfQotLyoqCi0gKiBTZXQgdGhlIHBhcmFtcyBmb3IgdGhpcyBtZXRob2QgZWxlbWVudCB0byBhbiBlbXB0eSBhcnJheSwgYXMgb3Bwb3NlZAotICogdG8gbnVsbC4KLSAqLwotcHVibGljIHZvaWQgYXBwbHlaZXJvUGFyYW1zKCkgewotCXNldFBhcm1zKCIiKTsgLy8kTk9OLU5MUy0xJAotfQotcHVibGljIGJvb2xlYW4gZXF1YWxTaWduYXR1cmUoTWV0aG9kRWxlbWVudCBhbm90aGVyTWV0aG9kRWxlbWVudCkgewotCWJvb2xlYW4gZXF1YWwgPSBnZXROYW1lKCkuZXF1YWxzKGFub3RoZXJNZXRob2RFbGVtZW50LmdldE5hbWUoKSk7Ci0JaWYgKGVxdWFsKSB7Ci0JCWVxdWFsID0gcGFybXNFcXVhbChhbm90aGVyTWV0aG9kRWxlbWVudCk7Ci0JCWlmIChlcXVhbCkgewotCQkJaWYgKGdldFR5cGUoKSA9PSBudWxsKQotCQkJCWVxdWFsID0gYW5vdGhlck1ldGhvZEVsZW1lbnQuZ2V0VHlwZSgpID09IG51bGw7Ci0JCQllbHNlCi0JCQkJZXF1YWwgPSBnZXRUeXBlKCkuZXF1YWxzKGFub3RoZXJNZXRob2RFbGVtZW50LmdldFR5cGUoKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVxdWFsOwotfQotcHVibGljIGphdmEudXRpbC5MaXN0IGdldE1ldGhvZFBhcmFtcygpIHsgCi0JU3RyaW5nVG9rZW5pemVyIHRvayA9IGdldE1ldGhvZFBhcmFtc1Rva2VuaXplcigpOwotCWphdmEudXRpbC5MaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JamF2YS51dGlsLkxpc3QgcGFyYW1zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlTdHJpbmcgY3VycmVudCA9IG51bGw7Ci0JaWYgKHRvayAhPSBudWxsKSB7Ci0JCXdoaWxlIChjdXJyZW50ICE9IG51bGwgfHwgdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHBlZWsgPSBudWxsOwotCQkJaWYgKGN1cnJlbnQgPT0gbnVsbCkKLQkJCQljdXJyZW50ID0gdG9rLm5leHRUb2tlbigpOwotCQkJaWYgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlwZWVrID0gdG9rLm5leHRUb2tlbigpOwotCQkJCWlmIChwZWVrLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWN1cnJlbnQgKz0gcGVlazsKLQkJCQkJcGVlayA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJdi5hZGQoY3VycmVudCk7Ci0JCQlpZiAocGVlayAhPSBudWxsKQotCQkJCWN1cnJlbnQgPSBwZWVrOwotCQkJZWxzZQotCQkJCWN1cnJlbnQgPSBudWxsOwotCQl9Ci0KLQl9Ci0JCi0JLyoKLQkJICogVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgZm9yIG9sZCBYTUkgZ2VuZXJhdGVkIGZpbGVzLCB0aGF0IHZlbiBpZiB0aGVyZSB3YXMgJywnIHNlcGFyYXRlZCAKLQkJICogcGFyYW1zLCBpdCBwYXJzZXMgdGhlbSBiYWNrIG91dCByaWdodC4gIFRvIHN1cHBvcnQgNC4wLlggQUFUIGdlbmVyYXRlZCBYTUkgZmlsZXMgd2l0aCBydW5BcyByb2xlcyAKLQkJICogZm9yIG1ldGhvZHMuCi0JCSAqLwotCWZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykKLQl7Ci0JCXRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoKFN0cmluZyl2LmdldChpKSwiLCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0b2sgIT0gbnVsbCkKLQkJewotCQkJd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpCi0JCQl7Ci0JCQkJcGFyYW1zTGlzdC5hZGQodG9rLm5leHRUb2tlbigpKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gcGFyYW1zTGlzdDsKLX0KLXByaXZhdGUgU3RyaW5nVG9rZW5pemVyIGdldE1ldGhvZFBhcmFtc1Rva2VuaXplcigpIHsKLQkvL1RoaXMgbWV0aG9kIGlzIGEgaGFjayBmb3Igbm93OyB0aGUgY2FyZGluYWxpdHkgaXMgd3JvbmcgZm9yIHRoZSBwYXJhbXMKLQlTdHJpbmcgYVBhcm1zID0gZ2V0UGFybXMoKTsKLQlpZiAoYVBhcm1zID09IG51bGwgfHwgYVBhcm1zLmxlbmd0aCgpID09IDApIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBuZXcgU3RyaW5nVG9rZW5pemVyKGdldFBhcm1zKCkpOwotfQotLyoqCi0gKiBBbnN3ZXIgYSBsaXN0IG9mIGFsbCB0aGUgbWV0aG9kcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QgZWxlbWVudCBhcHBsaWVzLiAgVGhlIGZvbGxvd2luZyBydWxlcyBhcmUgdXNlZDoKLSAqCi0gKiAxKSAgSWYgdGhlIG1ldGhvZCBlbGVtZW50IHR5cGUgaXMgdW5zcGVjaWZpZWQsIHRoZSBtZXRob2RzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSBlamI7Ci0gKgkJSWYgaXQgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBhcHByb3ByaWF0ZSBpbnRlcmZhY2UgaXMgdXNlZAotICoKLSAqIDIpICBJZiB0aGUgbWV0aG9kIG5hbWUgPSAiKiIsIHRoZW4gYWxsIHRoZSBQVUJMSUMgbWV0aG9kcyBmb3IgdGhhdCBpbnRlcmZhY2UgYXJlIHJldHVybmVkCi0gKgotICogMykgIElmIHRoZSBtZXRob2QgbmFtZSBpcyBzcGVjaWZpZWQsIGFuZCBubyBtZXRob2QgcGFyYW1zIGFyZSBzcGVjaWZpZWQsIHRoZW4gYWxsIHB1YmxpYyBtZXRob2RzIGZvciB0aGUgaW50ZXJmYWNlCi0gKiAgICAgIGhhdmluZyB0aGUgc2FtZSBuYW1lIGFyZSByZXR1cm5lZC4KLSAqCi0gKiA0KSAgSWYgdGhlIG1ldGhvZCBuYW1lIGFuZCBwYXJhbXMgYXJlIHNwZWNpZmllZCwgdGhlbiBhIHplcm8gb3Igb25lIGVsZW1lbnQgYXJyYXkgaXMgcmV0dXJuZWQsIGNvbnRhaW5pbmcgdGhlIG9uZSBhbmQgb25seSBtZXRob2QKLSAqICAgICAgb24gdGhlIGludGVyZmFjZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzaWduYXR1cmUsIGlmIGl0IGV4aXN0cwotICovCi1wdWJsaWMgTWV0aG9kW10gZ2V0TWV0aG9kcygpIHsKLQlFbnRlcnByaXNlQmVhbiBlamIgPSBnZXRFbnRlcnByaXNlQmVhbigpOwotCWlmKGVqYiA9PSBudWxsKQotCSAgICByZXR1cm4gbmV3IE1ldGhvZFswXTsKLQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0Jc3dpdGNoIChnZXRUeXBlKCkuZ2V0VmFsdWUoKSkgewotCQljYXNlIE1ldGhvZEVsZW1lbnRLaW5kLkhPTUUgOgotCQkJewotCQkJCXJlc3VsdCA9IGdldE1ldGhvZHMoZWpiLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFIDoKLQkJCXsKLQkJCQlyZXN1bHQgPSBnZXRNZXRob2RzKGVqYi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRSA6Ci0JCQl7Ci0JCQkJcmVzdWx0ID0gZ2V0TWV0aG9kcyhlamIuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMIDoKLQkJCXsKLQkJCQlyZXN1bHQgPSBnZXRNZXRob2RzKGVqYi5nZXRMb2NhbEludGVyZmFjZSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBNZXRob2RFbGVtZW50S2luZC5TRVJWSUNFX0VORFBPSU5UIDoKLQkJICAgewotCQkgICAgCWlmKGVqYi5pc1Nlc3Npb24oKSkgewotCQkgICAgCSAgICByZXN1bHQgPSBnZXRNZXRob2RzKCgoU2Vzc2lvbillamIpLmdldFNlcnZpY2VFbmRwb2ludCgpKTsKLQkJICAgIAkgICAgYnJlYWs7Ci0JCSAgICAJfQotCQkgICB9Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRUQgOgotCQkJewotCQkJCWlmIChlamIuaXNNZXNzYWdlRHJpdmVuKCkpCi0JCQkJCXJlc3VsdCA9IGdldE1ldGhvZHMoZWpiLmdldEVqYkNsYXNzKCkpOwotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZ2V0TWV0aG9kcyhlamIuZ2V0SG9tZUludGVyZmFjZSgpKSk7Ci0JCQkJCXJlc3VsdC5hZGRBbGwoZ2V0TWV0aG9kcyhlamIuZ2V0UmVtb3RlSW50ZXJmYWNlKCkpKTsKLQkJCQkJcmVzdWx0LmFkZEFsbChnZXRNZXRob2RzKGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSkpOwotCQkJCQlyZXN1bHQuYWRkQWxsKGdldE1ldGhvZHMoZWpiLmdldExvY2FsSW50ZXJmYWNlKCkpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCXJldHVybiAoTWV0aG9kW10pIHJlc3VsdC50b0FycmF5KG5ldyBNZXRob2RbcmVzdWx0LnNpemUoKV0pOwotfQotLyoqCi0gKiBBbnN3ZXIgYSBsaXN0IG9mIGFsbCB0aGUgbWV0aG9kcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QgZWxlbWVudCBhcHBsaWVzLiAgVGhlIGZvbGxvd2luZyBydWxlcyBhcmUgdXNlZDoKLSAqCi0gKiAxKSAgSWYgdGhlIG1ldGhvZCBlbGVtZW50IHR5cGUgaXMgdW5zcGVjaWZpZWQsIHRoZSBtZXRob2RzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSBlamI7Ci0gKgkJSWYgaXQgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBhcHByb3ByaWF0ZSBpbnRlcmZhY2UgaXMgdXNlZAotICoKLSAqIDIpICBJZiB0aGUgbWV0aG9kIG5hbWUgPSAiKiIsIHRoZW4gYWxsIHRoZSBQVUJMSUMgbWV0aG9kcyBmb3IgdGhhdCBpbnRlcmZhY2UgYXJlIHJldHVybmVkCi0gKgotICogMykgIElmIHRoZSBtZXRob2QgbmFtZSBpcyBzcGVjaWZpZWQsIGFuZCBubyBtZXRob2QgcGFyYW1zIGFyZSBzcGVjaWZpZWQsIHRoZW4gYWxsIHB1YmxpYyBtZXRob2RzIGZvciB0aGUgaW50ZXJmYWNlCi0gKiAgICAgIGhhdmluZyB0aGUgc2FtZSBuYW1lIGFyZSByZXR1cm5lZC4KLSAqCi0gKiA0KSAgSWYgdGhlIG1ldGhvZCBuYW1lIGFuZCBwYXJhbXMgYXJlIHNwZWNpZmllZCwgdGhlbiBhIHplcm8gb3Igb25lIGVsZW1lbnQgYXJyYXkgaXMgcmV0dXJuZWQsIGNvbnRhaW5pbmcgdGhlIG9uZSBhbmQgb25seSBtZXRob2QKLSAqICAgICAgb24gdGhlIGludGVyZmFjZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzaWduYXR1cmUsIGlmIGl0IGV4aXN0cwotICovCi1wcml2YXRlIExpc3QgZ2V0TWV0aG9kcyhKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JaWYgKGphdmFDbGFzcyA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXROYW1lKCkudHJpbSgpOwotCWlmIChuYW1lLmVxdWFscygiKiIpKSAgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkKCk7Ci0JZWxzZSBpZiAoaGFzTWV0aG9kUGFyYW1zKCkpIHsKLQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlNZXRob2QgbWV0aG9kID0gamF2YUNsYXNzLmdldFB1YmxpY01ldGhvZEV4dGVuZGVkKG5hbWUsIGdldE1ldGhvZFBhcmFtcygpKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJcmVzdWx0LmFkZChtZXRob2QpOwotCX0gZWxzZQotIAkJcmVzdWx0ID0gamF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHNFeHRlbmRlZE5hbWVkKG1ldGhvZE5hbWUpOwotIAotIAlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIE1ldGhvZEVsZW1lbnQgdGhhdCBpcyBtb3N0IHNwZWNpZmljLgotICovCi1wdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNb3N0U3BlY2lmaWMoTWV0aG9kRWxlbWVudCBhTWV0aG9kRWxlbWVudCwgSmF2YUNsYXNzIGFDbGFzcykgewotCWlmIChhTWV0aG9kRWxlbWVudCA9PSBudWxsKSByZXR1cm4gdGhpczsKLQlpZiAoYU1ldGhvZEVsZW1lbnQuaXNEZWZhdWx0KCkgJiYgIWlzRGVmYXVsdCgpKQotCQlyZXR1cm4gdGhpczsKLQlpZiAoIWFNZXRob2RFbGVtZW50LmlzRGVmYXVsdCgpICYmIGlzRGVmYXVsdCgpKQotCQlyZXR1cm4gYU1ldGhvZEVsZW1lbnQ7Ci0JaWYgKGFNZXRob2RFbGVtZW50Lmhhc01ldGhvZFBhcmFtcygpICYmICFoYXNNZXRob2RQYXJhbXMoKSkKLQkJcmV0dXJuIGFNZXRob2RFbGVtZW50OwotCWlmICghYU1ldGhvZEVsZW1lbnQuaGFzTWV0aG9kUGFyYW1zKCkgJiYgaGFzTWV0aG9kUGFyYW1zKCkpCi0JCXJldHVybiB0aGlzOwotCWlmIChpc1Vuc3BlY2lmaWVkKCkgJiYgIWFNZXRob2RFbGVtZW50LmlzVW5zcGVjaWZpZWQoKSkKLQkJcmV0dXJuIGFNZXRob2RFbGVtZW50OwotCXJldHVybiB0aGlzOwotfQotcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1vc3RTcGVjaWZpY01ldGhvZEVsZW1lbnQoTGlzdCBtZXRob2RFbGVtZW50cywgTWV0aG9kIGFNZXRob2QpIHsKLQlNZXRob2RFbGVtZW50IHNwZWNpZmljTUUgPSBudWxsOwotCWlmIChhTWV0aG9kICE9IG51bGwpIHsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RFbGVtZW50cy5pdGVyYXRvcigpOwotCQlNZXRob2RFbGVtZW50IG1lOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQltZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAobWUucmVwcmVzZW50cyhhTWV0aG9kKSkgewotCQkJCWlmIChtZS51bmlxdWVseUlkZW50aWZpZXMoYU1ldGhvZCkpCi0JCQkJCXJldHVybiBtZTsKLQkJCQllbHNlIGlmIChzcGVjaWZpY01FID09IG51bGwpCi0JCQkJCXNwZWNpZmljTUUgPSBtZTsKLQkJCQllbHNlCi0JCQkJCXNwZWNpZmljTUUgPSBzcGVjaWZpY01FLmdldE1vc3RTcGVjaWZpYyhtZSwgYU1ldGhvZC5nZXRKYXZhQ2xhc3MoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHNwZWNpZmljTUU7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nIGdldFBhcm1zU3RyaW5nKCkgewotCVN0cmluZyBwYXJtU3RyaW5nID0gZ2V0UGFybXMoKTsKLQlpZiAocGFybVN0cmluZyA9PSBudWxsKQotCQlwYXJtU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gcGFybVN0cmluZzsKLX0KLS8qKgotICogUmV0dXJuIGEgU3RyaW5nIGFycmF5IGZvciB0aGUgcG9zc2libGUgTWV0aG9kRWxlbWVudCB0eXBlIG5hbWVzLgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBvc3NpYmxlVHlwZU5hbWVzKCkgewotCUVqYlBhY2thZ2UgcGFjayA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKTsKLQlMaXN0IGxpdGVyYWxzID0gcGFjay5nZXRNZXRob2RFbGVtZW50S2luZCgpLmdldEVMaXRlcmFscygpOwotCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tsaXRlcmFscy5zaXplKCldOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGl0ZXJhbHMuc2l6ZSgpOyBpKyspCi0JCW5hbWVzW2ldID0gbGl0ZXJhbHMuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JcmV0dXJuIG5hbWVzOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHNpZ25hdHVyZS4KLSAqIEZvciBleGFtcGxlOiAgc2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7Ci0JaWYgKGlzRGVmYXVsdCgpKQotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmLmFwcGVuZChnZXROYW1lKCkpOwotCWlmIChoYXNNZXRob2RQYXJhbXMoKSl7Ci0JCWJ1Zi5hcHBlbmQoUklHSFRfUEFSRU4pOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gZ2V0TWV0aG9kUGFyYW1zVG9rZW5pemVyKCk7Ci0JCWlmICh0b2sgIT0gbnVsbCkgewotCQkJd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlidWYuYXBwZW5kKHRvay5uZXh0VG9rZW4oKSk7Ci0JCQkJaWYgKHRvay5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJCWJ1Zi5hcHBlbmQoQ09NTUEpOwkJCi0JCQl9CQkJCi0JCX0KLQkJYnVmLmFwcGVuZChMRUZUX1BBUkVOKTsKLQl9Ci0JcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotfQotLy8gUmV0dXJucyBudWxsIGlmIHRoZSBFRW51bSBpcyBVTlNQRUNJRklFRAotLy8gdW5sZXNzIGl0IGlzIGEgTWVzc2FnZURyaXZlbiBiZWFuLgotcHVibGljIEphdmFDbGFzcyBnZXRUeXBlSmF2YUNsYXNzKCkgewotCWlmIChpc0hvbWUoKSkKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFuKCkuZ2V0SG9tZUludGVyZmFjZSgpOwotCWVsc2UgaWYgKGlzUmVtb3RlKCkpCi0JCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbigpLmdldFJlbW90ZUludGVyZmFjZSgpOwotCWVsc2UgaWYgKGlzTG9jYWxIb21lKCkpCi0JCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbigpLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCWVsc2UgaWYgKGlzTG9jYWwoKSkKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFuKCkuZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQllbHNlIGlmIChpc1Vuc3BlY2lmaWVkKCkgJiYgZ2V0RW50ZXJwcmlzZUJlYW4oKS5pc01lc3NhZ2VEcml2ZW4oKSkKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFuKCkuZ2V0RWpiQ2xhc3MoKTsKLQllbHNlCi0JCXJldHVybiBudWxsOwotfQotCS8qKgotICogQW5zd2VyIHdoZXRoZXIgbWV0aG9kIHBhcmFtcyBhcHBseSB0byB0aGlzIG1ldGhvZCwgZS5nLiwgaXQgaXMgc3BlY2lmaWMgdG8gb25lCi0gKiBvdmVybG9hZGVkIG1ldGhvZCwgZXZlbiBpZiB0aGUgbWV0aG9kIGlzIGEgemVybyBwYXJhbWV0ZXIgbWV0aG9kLiAgQW5zd2VyIGZhbHNlIGlmIG5vCi0gKiBwYXJhbWV0ZXJzIGFwcGx5LCB0aGF0IGlzLCB0aGUgbWV0aG9kIGVsZW1lbnQgYXBwbGllcyB0byBhbGwgb3ZlcmxvYWRlZCBtZXRob2RzIHdpdGggdGhpcyBuYW1lCi0gKi8KLXB1YmxpYyBib29sZWFuIGhhc01ldGhvZFBhcmFtcygpIHsKLQlyZXR1cm4gZ2V0UGFybXMoKSAhPSBudWxsOwotfQotLyoqCi0gKiBQYXJzZSBAYVNpZ25hdHVyZSBzZXR0aW5nIHRoZSBuYW1lIGFuZCB0aGUgcGFyYW1zLgotICogQSBzaWduYXR1cmUgZXhhbXBsZTogIHNldFR3b1BhcmFtTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tU2lnbmF0dXJlKFN0cmluZyBhU2lnbmF0dXJlKSB7Ci0JcGFyc2VTaWduYXR1cmUoYVNpZ25hdHVyZSk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0gICAgcmV0dXJuIEphdmFDbGFzcy5ERUZBVUxUX01FVEhPRF9OQU1FLmVxdWFscyhnZXROYW1lKCkpOwotfQotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIE1ldGhvZEVsZW1lbnQgYW5kIEBhbm90aGVyTWV0aG9kRWxlbWVudAotICogcmVwcmVzZW50IHRoZSBzYW1lIGV4YWN0IG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudChNZXRob2RFbGVtZW50IGFub3RoZXJNZXRob2RFbGVtZW50KSB7Ci0JYm9vbGVhbiBlcXVhbCA9IGVxdWFsU2lnbmF0dXJlKGFub3RoZXJNZXRob2RFbGVtZW50KTsKLQlpZiAoZXF1YWwpCi0JCWVxdWFsID0gZ2V0RW50ZXJwcmlzZUJlYW4oKSA9PSBhbm90aGVyTWV0aG9kRWxlbWVudC5nZXRFbnRlcnByaXNlQmVhbigpOwotCXJldHVybiBlcXVhbDsKLX0KLXB1YmxpYyBib29sZWFuIGlzSG9tZSgpIHsKLQlyZXR1cm4gZ2V0VHlwZSgpLmdldFZhbHVlKCkgPT0gTWV0aG9kRWxlbWVudEtpbmQuSE9NRTsKLX0KLXB1YmxpYyBib29sZWFuIGlzUmVtb3RlKCkgewotCXJldHVybiBnZXRUeXBlKCkuZ2V0VmFsdWUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5SRU1PVEU7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1Vuc3BlY2lmaWVkKCkgewotCXJldHVybiBnZXRUeXBlKCkuZ2V0VmFsdWUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRDsKLX0KLXB1YmxpYyBib29sZWFuIGlzTG9jYWxIb21lKCkgewotCXJldHVybiBnZXRUeXBlKCkuZ2V0VmFsdWUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FOwotfQotcHVibGljIGJvb2xlYW4gaXNMb2NhbCgpIHsKLQlyZXR1cm4gZ2V0VHlwZSgpLmdldFZhbHVlKCkgPT0gTWV0aG9kRWxlbWVudEtpbmQuTE9DQUw7Ci19Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoaXMgTWV0aG9kRWxlbWVudCByZXByZXNlbnRzIG9uZSBvciBtb3JlCi0gKiBtZXRob2RzLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCXJldHVybiBnZXRNZXRob2RzKCkubGVuZ3RoID4gMDsKLX0KLS8qKgotICogUmV0dXJuIHRydWUgb25seSBpZiBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEBhTWV0aG9kCi0gKiBtYXRjaGVzIHRoZSBuYW1lcyBpbiB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzLgotICovCi1wdWJsaWMgYm9vbGVhbiBtYXRjaGVzUGFyYW1zKE1ldGhvZCBhTWV0aG9kKSB7Ci0JaWYgKGFNZXRob2QgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCUxpc3QgcGFyYW1zID0gZ2V0TWV0aG9kUGFyYW1zKCk7Ci0JSmF2YVBhcmFtZXRlcltdIG1ldGhvZFBhcmFtcyA9IGFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgIT0gbWV0aG9kUGFyYW1zLmxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kUGFyYW1zLmxlbmd0aDsgaSsrKXsKLQkJU3RyaW5nIHBhcmFtZXRlclR5cGUgPSAoKEphdmFIZWxwZXJzKW1ldGhvZFBhcmFtc1tpXS5nZXRFVHlwZSgpKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCWlmICghcGFyYW1zLmdldChpKS5lcXVhbHMocGFyYW1ldGVyVHlwZSkpIAotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IGhhcyB0aGUgc2FtZSBiYXNpYyBzaWduYXR1cmUgYXMKLSAqIEBhTWV0aG9kLCBpZ25vcmluZyB0aGUgcmV0dXJuIHR5cGUsIHRocm93biBleGNlcHRpb25zLCBhbmQgZGVjbGFyaW5nIGNsYXNzIG9mIAotICogdGhpcyBpbnN0YW5jZSBvciBAYU1ldGhvZC4gIFJldHVybiBmYWxzZSwgaWYgcGFyYW1zIGlzIG51bGwKLSAqLwotcHVibGljIGJvb2xlYW4gbmFtZUFuZFBhcmFtc0VxdWFscyhNZXRob2QgYU1ldGhvZCkgewotCWlmIChhTWV0aG9kICE9IG51bGwpIHsKLQkJaWYgKGdldE5hbWUoKS5lcXVhbHMoYU1ldGhvZC5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCQkJcmV0dXJuIG1hdGNoZXNQYXJhbXMoYU1ldGhvZCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotcHJvdGVjdGVkIGJvb2xlYW4gcGFybXNFcXVhbChNZXRob2RFbGVtZW50IG1lKSB7Ci0JaWYgKG1lID09IG51bGwpIHJldHVybiBmYWxzZTsKLQlMaXN0IG15UGFybXMsIG90aGVyUGFybXM7Ci0JbXlQYXJtcyA9IGdldE1ldGhvZFBhcmFtcygpOwotCW90aGVyUGFybXMgPSBtZS5nZXRNZXRob2RQYXJhbXMoKTsKLQlpZiAobXlQYXJtcy5zaXplKCkgIT0gb3RoZXJQYXJtcy5zaXplKCkpIHJldHVybiBmYWxzZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG15UGFybXMuc2l6ZSgpOyBpKyspewotCQlpZiAoIW15UGFybXMuZ2V0KGkpLmVxdWFscyhvdGhlclBhcm1zLmdldChpKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBQYXJzZSBAYVNpZ25hdHVyZSBzZXR0aW5nIHRoZSBuYW1lIGFuZCB0aGUgcGFyYW1zLgotICogQSBzaWduYXR1cmUgZXhhbXBsZTogIHNldFR3b1BhcmFtTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXByb3RlY3RlZCB2b2lkIHBhcnNlU2lnbmF0dXJlKFN0cmluZyBhU2lnbmF0dXJlKSB7Ci0JaW50IGluZGV4ID0gYVNpZ25hdHVyZS5pbmRleE9mKFJJR0hUX1BBUkVOKTsKLQotCWludCBlbmRJbmRleCA9IGFTaWduYXR1cmUuaW5kZXhPZihMRUZUX1BBUkVOKTsKLQlpZiAoZW5kSW5kZXggPCAwKQotCXsKLQkJZW5kSW5kZXggPSBhU2lnbmF0dXJlLmxlbmd0aCgpIC0gMTsJCi0JfQkKLQotCWlmIChpbmRleCA8IDApewotCQlzZXROYW1lKGFTaWduYXR1cmUpOwotCQlzZXRQYXJtcyhudWxsKTsgLy9UaGVyZSBhcmUgbm8gcGFyYW1ldGVycyBpbiB0aGUgc2lnIHNvIHNldCB0byBudWxsCi0JfQotCWVsc2UgewotCQlTdHJpbmcgc2lnTmFtZSA9IGFTaWduYXR1cmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQlzZXROYW1lKHNpZ05hbWUpOwotCQlTdHJpbmcgc2lnUGFybXMgPSBhU2lnbmF0dXJlLnN1YnN0cmluZyhpbmRleCArIDEsIGVuZEluZGV4KTsKLQotCQlpZiAoc2lnUGFybXMubGVuZ3RoKCkgPiAwKSB7Ci0JCQljaGFyIGNvbW1hQ2hhciA9IENPTU1BLmNoYXJBdCgwKTsKLQkJCWNoYXJbXSBzaWdQYXJtc0NoYXJzID0gc2lnUGFybXMudG9DaGFyQXJyYXkoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpZ1Bhcm1zQ2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2lnUGFybXNDaGFyc1tpXSAhPSBjb21tYUNoYXIpIHsKLQkJCQkJYnVmLmFwcGVuZChzaWdQYXJtc0NoYXJzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRNZXRob2RQYXJhbXMoYnVmLnRvU3RyaW5nKCkpOwotCQkJCQlidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJfQotCQkJfQotCQkJYWRkTWV0aG9kUGFyYW1zKGJ1Zi50b1N0cmluZygpKTsKLQkJfSBlbHNlCi0JCQlhcHBseVplcm9QYXJhbXMoKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCByZW1vdmVNZXRob2RQYXJhbXMoU3RyaW5nIHBhcmFtKSB7IAotCVN0cmluZyBteVBhcmFtcyA9IGdldFBhcm1zKCk7Ci0JaWYgKG15UGFyYW1zID09IG51bGwgfHwgbXlQYXJhbXMubGVuZ3RoKCkgPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG15UGFyYW1zKTsKLQlTdHJpbmdCdWZmZXIgbmV3UGFybXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0Jd2hpbGUgKHRvay5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlTdHJpbmcgdG9rZW4gPSB0b2submV4dFRva2VuKCk7Ci0JCWlmICghdG9rZW4uZXF1YWxzKHBhcmFtKSkgewotCQkJbmV3UGFybXMuYXBwZW5kKHRva2VuKTsKLQkJCW5ld1Bhcm1zLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0Jc2V0UGFybXMobmV3UGFybXMudG9TdHJpbmcoKS50cmltKCkpOwotfQotLyoqCi0gKiByZXByZXNlbnRzIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiByZXByZXNlbnRzKE1ldGhvZCBhTWV0aG9kKSB7Ci0JaWYgKGFNZXRob2QgIT0gbnVsbCkgewotCQlpZiAoaXNVbnNwZWNpZmllZCgpIHx8IHR5cGVDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoYU1ldGhvZC5nZXRKYXZhQ2xhc3MoKSkpIHsKLQkJCWlmIChpc0RlZmF1bHQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UgCi0JCQkJaWYgKGdldE5hbWUoKS5lcXVhbHMoYU1ldGhvZC5nZXROYW1lKCkpKSB7Ci0JCQkJCWlmIChoYXNNZXRob2RQYXJhbXMoKSkKLQkJCQkJCXJldHVybiBtYXRjaGVzUGFyYW1zKGFNZXRob2QpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCX0KLQl9CQkJCQkKLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGlkIHRvIGJlIFtNZXRob2RUcmFuc2FjdGlvbklEfCBNZXRob2RQZXJtaXNzaW9uSURdX0VKQk5BTUVfTWV0aG9kTmFtZSwKLSAqIG9yIFtNZXRob2RUcmFuc2FjdGlvbklEfCBNZXRob2RQZXJtaXNzaW9uSURdX0VKQk5BTUVfTWV0aG9kTmFtZV9QYXJtcywgaWYgcGFybXMgZXhpc3QKLSAqLwotcHVibGljIHZvaWQgc2V0SWRUb1JlYWRhYmxlU3RyaW5nKCkgeyAKLQlTdHJpbmcgYVBhcm1zID0gZ2V0UGFybXMoKSA9PSBudWxsID8gIiIgOiAiXyIrZ2V0UGFybXMoKS5yZXBsYWNlKCcgJywgJ18nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JU3RyaW5nIHByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3dpdGNoIChNZXRob2RFbGVtZW50SGVscGVyLmdldENvbnRhaW5lZFR5cGUodGhpcykpIHsKLQkJY2FzZSBNZXRob2RFbGVtZW50SGVscGVyLk1FVEhPRF9QRVJNSVNTSU9OIDoJCi0JCQlwcmVmaXggPSAoKFhNSVJlc291cmNlKWVDb250YWluZXIuZVJlc291cmNlKCkpLmdldElEKGVDb250YWluZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTWV0aG9kRWxlbWVudEhlbHBlci5NRVRIT0RfVFJBTlNBQ1RJT04gOgotCQkJcHJlZml4ID0gKChYTUlSZXNvdXJjZSllQ29udGFpbmVyLmVSZXNvdXJjZSgpKS5nZXRJRChlQ29udGFpbmVyKTsKLQkJCWJyZWFrOwotCX0KLQkoKFhNSVJlc291cmNlKWVSZXNvdXJjZSgpKS5zZXRJRCh0aGlzLHByZWZpeCArICJfIiArIGdldEVudGVycHJpc2VCZWFuKCkuZ2V0TmFtZSgpICsgIl8iICsgZ2V0TmFtZSgpICsgYVBhcm1zKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi19Ci1wcm90ZWN0ZWQgYm9vbGVhbiB0eXBlQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKEphdmFDbGFzcyBhbkludGVyZmFjZSkgewotCWlmIChnZXRUeXBlSmF2YUNsYXNzKCkgPT0gbnVsbCB8fCBhbkludGVyZmFjZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGdldFR5cGVKYXZhQ2xhc3MoKS5pbXBsZW1lbnRzSW50ZXJmYWNlKGFuSW50ZXJmYWNlKTsKLX0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RFbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMKLSAqIEBhTWV0aG9kLiAgUmV0dXJuIGZhbHNlLCBldmVuIGlmIHRoZSBNZXRob2RFbGVtZW50IHJlcHJlc2VudHMKLSAqIEBhTWV0aG9kIChpLmUuLCBAYU1ldGhvZCBpcyBjb250YWluZWQgaW4gaXRzIGxpc3Qgb2YgbWV0aG9kcykuCi0gKi8KLXB1YmxpYyBib29sZWFuIHVuaXF1ZWx5SWRlbnRpZmllcyhNZXRob2QgYU1ldGhvZCkgewotCWlmIChhTWV0aG9kICE9IG51bGwpIHsKLQkJaWYgKGdldFR5cGVKYXZhQ2xhc3MoKSAhPSBudWxsICYmIAotCSAgICAgICAgdHlwZUNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShhTWV0aG9kLmdldEphdmFDbGFzcygpKSAmJiAKLQkgICAgICAgIGdldE5hbWUoKS5lcXVhbHMoYU1ldGhvZC5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCQkJcmV0dXJuIG1hdGNoZXNQYXJhbXMoYU1ldGhvZCk7Ci0JCQlyZXR1cm4gYU1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGg9PTA7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gbWV0aG9kLAotCSAqIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMgdXNlZCB3aGVuIHRoZSBlbGVtZW50Ci0JICogZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGFuZCBob21lCi0JICogaW50ZXJmYWNlcy4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJtcygpIHsKLQkJcmV0dXJuIHBhcm1zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcm1zKFN0cmluZyBuZXdQYXJtcykgewotCQlTdHJpbmcgb2xkUGFybXMgPSBwYXJtczsKLQkJcGFybXMgPSBuZXdQYXJtczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUEFSTVMsIG9sZFBhcm1zLCBwYXJtcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50S2luZCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kIG5ld1R5cGUpIHsKLQkJTWV0aG9kRWxlbWVudEtpbmQgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlID09IG51bGwgPyBUWVBFX0VERUZBVUxUIDogbmV3VHlwZTsKLQkJYm9vbGVhbiBvbGRUeXBlRVNldCA9IHR5cGVFU2V0OwotCQl0eXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1RZUEUsIG9sZFR5cGUsIHR5cGUsICFvbGRUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHlwZSgpIHsKLQkJTWV0aG9kRWxlbWVudEtpbmQgb2xkVHlwZSA9IHR5cGU7Ci0JCWJvb2xlYW4gb2xkVHlwZUVTZXQgPSB0eXBlRVNldDsKLQkJdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0JCXR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fVFlQRSwgb2xkVHlwZSwgVFlQRV9FREVGQVVMVCwgb2xkVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRFbnRlcnByaXNlQmVhbigpIHsKLQkJaWYgKGVudGVycHJpc2VCZWFuICE9IG51bGwgJiYgZW50ZXJwcmlzZUJlYW4uZUlzUHJveHkoKSkgewotCQkJRW50ZXJwcmlzZUJlYW4gb2xkRW50ZXJwcmlzZUJlYW4gPSBlbnRlcnByaXNlQmVhbjsKLQkJCWVudGVycHJpc2VCZWFuID0gKEVudGVycHJpc2VCZWFuKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllbnRlcnByaXNlQmVhbik7Ci0JCQlpZiAoZW50ZXJwcmlzZUJlYW4gIT0gb2xkRW50ZXJwcmlzZUJlYW4pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU4sIG9sZEVudGVycHJpc2VCZWFuLCBlbnRlcnByaXNlQmVhbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRlcnByaXNlQmVhbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gYmFzaWNHZXRFbnRlcnByaXNlQmVhbigpIHsKLQkJcmV0dXJuIGVudGVycHJpc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGVycHJpc2VCZWFuKEVudGVycHJpc2VCZWFuIG5ld0VudGVycHJpc2VCZWFuKSB7Ci0JCUVudGVycHJpc2VCZWFuIG9sZEVudGVycHJpc2VCZWFuID0gZW50ZXJwcmlzZUJlYW47Ci0JCWVudGVycHJpc2VCZWFuID0gbmV3RW50ZXJwcmlzZUJlYW47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTiwgb2xkRW50ZXJwcmlzZUJlYW4sIGVudGVycHJpc2VCZWFuKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TOgotCQkJCXJldHVybiBnZXRQYXJtcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU46Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFbnRlcnByaXNlQmVhbigpOwotCQkJCXJldHVybiBiYXNpY0dldEVudGVycHJpc2VCZWFuKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TOgotCQkJCXJldHVybiBQQVJNU19FREVGQVVMVCA9PSBudWxsID8gcGFybXMgIT0gbnVsbCA6ICFQQVJNU19FREVGQVVMVC5lcXVhbHMocGFybXMpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFOgotCQkJCXJldHVybiBpc1NldFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0VOVEVSUFJJU0VfQkVBTjoKLQkJCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW4gIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUEFSTVM6Ci0JCQkJc2V0UGFybXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19UWVBFOgotCQkJCXNldFR5cGUoKE1ldGhvZEVsZW1lbnRLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fRU5URVJQUklTRV9CRUFOOgotCQkJCXNldEVudGVycHJpc2VCZWFuKChFbnRlcnByaXNlQmVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BBUk1TOgotCQkJCXNldFBhcm1zKFBBUk1TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1RZUEU6Ci0JCQkJdW5zZXRUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19FTlRFUlBSSVNFX0JFQU46Ci0JCQkJc2V0RW50ZXJwcmlzZUJlYW4oKEVudGVycHJpc2VCZWFuKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJtczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFybXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGVybWlzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODNmMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGVybWlzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotCi0vKioKLSAqIFRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlIHNlY3VyaXR5IHJvbGVzIGFyZSBhbGxvd2VkIHRvIGludm9rZSBvbmUgb3IgbW9yZSBlbnRlcnByaXNlIGJlYW4gbWV0aG9kcy4gVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBzZWN1cml0eSByb2xlIG5hbWVzLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4gIFRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCB0aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGFuZC8vb3IgaG9tZSBpbnRlcmZhY2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGVybWlzc2lvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBlcm1pc3Npb24sIEVPYmplY3QgewotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5jaGVja2VkKCkgPGVtPlVuY2hlY2tlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVbmNoZWNrZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTkNIRUNLRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVuY2hlY2tlZCA9IFVOQ0hFQ0tFRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVuY2hlY2tlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdW5jaGVja2VkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kRWxlbWVudHMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXB1YmxpYyBNZXRob2RQZXJtaXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQZXJtaXNzaW9uKCk7Ci0JfQotCi1wdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCWlmIChhbkVKQiA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlMaXN0IGVsZW1lbnRzID0gZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQlNZXRob2RFbGVtZW50IG1lOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspewotCQltZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50cy5nZXQoaSk7Ci0JCWlmIChhbkVKQi5lcXVhbHMobWUuZ2V0RW50ZXJwcmlzZUJlYW4oKSkpCi0JCQlyZXN1bHQuYWRkKG1lKTsJCQkKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0U2VjdXJpdHlSb2xlKFN0cmluZyBhUm9sZU5hbWUpIHsKLQlpZiAoYVJvbGVOYW1lID09IG51bGwpIHJldHVybiBudWxsOwotCUxpc3QgbXlSb2xlcyA9IGdldFJvbGVzKCk7Ci0JaW50IHNpemUgPSBteVJvbGVzLnNpemUoKTsKLQlTZWN1cml0eVJvbGUgcm9sZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKyl7Ci0JCXJvbGUgPSAoU2VjdXJpdHlSb2xlKSBteVJvbGVzLmdldChpKTsKLQkJaWYgKGFSb2xlTmFtZS5lcXVhbHMocm9sZS5nZXRSb2xlTmFtZSgpKSkKLQkJCXJldHVybiByb2xlOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBwZXJtaXNzaW9uIGNvbnRhaW5zIEBhU2VjdXJpdHlSb2xlCi0gKi8KLXB1YmxpYyBib29sZWFuIGhhc1NlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgYVNlY3VyaXR5Um9sZSkgewotCWlmIChhU2VjdXJpdHlSb2xlID09IG51bGwpCi0JCXJldHVybiBmYWxzZTsKLQlMaXN0IG15Um9sZXMgPSBnZXRSb2xlcygpOwotCWludCBzaXplID0gbXlSb2xlcy5zaXplKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJaWYgKGFTZWN1cml0eVJvbGUgPT0gbXlSb2xlcy5nZXQoaSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIGJvb2xlYW4gaGFzU2VjdXJpdHlSb2xlKFN0cmluZyBhUm9sZU5hbWUpIHsKLQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlKGFSb2xlTmFtZSkgIT0gbnVsbDsKLX0KLS8qKgotICogUmV0dXJuIHRydWUgaWYgdGhpcyBNZXRob2RQZXJtaXNzaW9uIGFuZCBAYW5vdGhlck1ldGhvZFBlcm1pc3Npb24KLSAqIGhhdmUgdGhlIHNhbWUgcm9sZXMuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudChNZXRob2RQZXJtaXNzaW9uIGFub3RoZXJNZXRob2RQZXJtaXNzaW9uKSB7Ci0JaWYgKGFub3RoZXJNZXRob2RQZXJtaXNzaW9uID09IG51bGwpIHJldHVybiBmYWxzZTsKLQlyZXR1cm4gZ2V0Um9sZXMoKS5zaXplKCkgPT0gYW5vdGhlck1ldGhvZFBlcm1pc3Npb24uZ2V0Um9sZXMoKS5zaXplKCkgJiYKLQkJCWdldFJvbGVzKCkuY29udGFpbnNBbGwoYW5vdGhlck1ldGhvZFBlcm1pc3Npb24uZ2V0Um9sZXMoKSk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZSAoaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VuY2hlY2tlZCgpIHsKLQkJcmV0dXJuIHVuY2hlY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmNoZWNrZWQoYm9vbGVhbiBuZXdVbmNoZWNrZWQpIHsKLQkJYm9vbGVhbiBvbGRVbmNoZWNrZWQgPSB1bmNoZWNrZWQ7Ci0JCXVuY2hlY2tlZCA9IG5ld1VuY2hlY2tlZDsKLQkJYm9vbGVhbiBvbGRVbmNoZWNrZWRFU2V0ID0gdW5jaGVja2VkRVNldDsKLQkJdW5jaGVja2VkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRCwgb2xkVW5jaGVja2VkLCB1bmNoZWNrZWQsICFvbGRVbmNoZWNrZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRVbmNoZWNrZWQoKSB7Ci0JCWJvb2xlYW4gb2xkVW5jaGVja2VkID0gdW5jaGVja2VkOwotCQlib29sZWFuIG9sZFVuY2hlY2tlZEVTZXQgPSB1bmNoZWNrZWRFU2V0OwotCQl1bmNoZWNrZWQgPSBVTkNIRUNLRURfRURFRkFVTFQ7Ci0JCXVuY2hlY2tlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQsIG9sZFVuY2hlY2tlZCwgVU5DSEVDS0VEX0VERUZBVUxULCBvbGRVbmNoZWNrZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRVbmNoZWNrZWQoKSB7Ci0JCXJldHVybiB1bmNoZWNrZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBc3NlbWJseURlc2NyaXB0b3IpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikgewotCQlpZiAobmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiAmJiBuZXdBc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdBc3NlbWJseURlc2NyaXB0b3IpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBc3NlbWJseURlc2NyaXB0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SLCBuZXdBc3NlbWJseURlc2NyaXB0b3IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSb2xlcygpIHsKLQkJaWYgKHJvbGVzID09IG51bGwpIHsKLQkJCXJvbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gcm9sZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCkgewotCQlpZiAobWV0aG9kRWxlbWVudHMgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kRWxlbWVudC5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfUEVSTUlTU0lPTlMsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJcmV0dXJuIGlzVW5jaGVja2VkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFJvbGVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0VW5jaGVja2VkKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTOgotCQkJCXJldHVybiByb2xlcyAhPSBudWxsICYmICFyb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gbWV0aG9kRWxlbWVudHMgIT0gbnVsbCAmJiAhbWV0aG9kRWxlbWVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1VOQ0hFQ0tFRDoKLQkJCQlzZXRVbmNoZWNrZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXNldEFzc2VtYmx5RGVzY3JpcHRvcigoQXNzZW1ibHlEZXNjcmlwdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX1JPTEVTOgotCQkJCWdldFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZEVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEOgotCQkJCXVuc2V0VW5jaGVja2VkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXNldEFzc2VtYmx5RGVzY3JpcHRvcigoQXNzZW1ibHlEZXNjcmlwdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fUk9MRVM6Ci0JCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCWdldE1ldGhvZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1bmNoZWNrZWQ6ICIpOwotCQlpZiAodW5jaGVja2VkRVNldCkgcmVzdWx0LmFwcGVuZCh1bmNoZWNrZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kVHJhbnNhY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUcmFuc2FjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhNDIwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUcmFuc2FjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlOwotCi0vKioKLSAqIFNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZCBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVHJhbnNhY3Rpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXRob2RUcmFuc2FjdGlvbiwgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxUID0gVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk5PVF9TVVBQT1JURURfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgdHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSBUUkFOU0FDVElPTl9BVFRSSUJVVEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBBdHRyaWJ1dGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyYW5zYWN0aW9uQXR0cmlidXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RFbGVtZW50cyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIE1ldGhvZFRyYW5zYWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RUcmFuc2FjdGlvbigpOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gYW4gYXJyYXkgb2YgU3RyaW5ncyBmb3IgYWxsIHRoZSBFRW51bUxpdGVyYWwgdmFsdWVzCi0gKiBmb3IgdGhlIHRyYW5zYWN0aW9uQXR0cmlidXRlIGVudW1lcmF0aW9uLgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZVRyYW5zYWN0aW9uQXR0cmlidXRlTmFtZXMoKSB7Ci0JTGlzdCBsID0gZ2V0QXZhaWxhYmxlVHJhbnNhY3Rpb25BdHRyaWJ1dGVzKCk7Ci0JU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2wuc2l6ZSgpXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGwuc2l6ZSgpOyBpKyspCi0JCW5hbWVzW2ldID0gKChFRW51bUxpdGVyYWwpbC5nZXQoaSkpLnRvU3RyaW5nKCk7Ci0JcmV0dXJuIG5hbWVzOwotfQotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIHRoZSBhbGwgdGhlIEVFbnVtTGl0ZXJhbCB2YWx1ZXMKLSAqIGZvciB0aGUgdHJhbnNhY3Rpb25BdHRyaWJ1dGUgZW51bWVyYXRpb24uCi0gKiBUaGUgdG9TdHJpbmcoKSBtZXRob2QgZm9yIGEgRUVudW1MaXRlcmFsIHdpbGwgZGlzcGxheQotICogdGhlIFN0cmluZyB2YWx1ZSBmb3IgdGhlIGVudW1lcmF0aW9uIHZhbHVlLgotICovCi1wdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlVHJhbnNhY3Rpb25BdHRyaWJ1dGVzKCkgewotCUVqYlBhY2thZ2UgcGFjayA9IChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSk7Ci0JcmV0dXJuIHBhY2suZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCkuZ2V0RUxpdGVyYWxzKCk7Ci19Ci1wdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCUxpc3QgZWxlbWVudHMgPSBnZXRNZXRob2RFbGVtZW50cygpOwotCU1ldGhvZEVsZW1lbnQgbWU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKyl7Ci0JCW1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJaWYgKG1lLmdldEVudGVycHJpc2VCZWFuKCkgIT0gbnVsbCAmJiBtZS5nZXRFbnRlcnByaXNlQmVhbigpLmVxdWFscyhhbkVKQikpCi0JCQlyZXN1bHQuYWRkKG1lKTsJCQkKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1vc3RTcGVjaWZpY01ldGhvZEVsZW1lbnQoTWV0aG9kIGFNZXRob2QpIHsKLSAgIHJldHVybiBNZXRob2RFbGVtZW50SW1wbC5nZXRNb3N0U3BlY2lmaWNNZXRob2RFbGVtZW50KGdldE1ldGhvZEVsZW1lbnRzKCksIGFNZXRob2QpOwotfQotcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KE1ldGhvZFRyYW5zYWN0aW9uIGFub3RoZXJNZXRob2RUcmFuc2FjdGlvbikgewotCXJldHVybiBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpID09IGFub3RoZXJNZXRob2RUcmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0cmFucy1hdHRyaWJ1dGUgZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBuZXdUcmFuc2FjdGlvbkF0dHJpYnV0ZSkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZTsKLQkJdHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSBuZXdUcmFuc2FjdGlvbkF0dHJpYnV0ZSA9PSBudWxsID8gVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25BdHRyaWJ1dGU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0ID0gdHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0OwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFLCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZSwgdHJhbnNhY3Rpb25BdHRyaWJ1dGUsICFvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgb2xkVHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSB0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQ7Ci0JCXRyYW5zYWN0aW9uQXR0cmlidXRlID0gVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFLCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZSwgVFJBTlNBQ1RJT05fQVRUUklCVVRFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBlamItamFyIGZpbGUgKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3IgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQXNzZW1ibHlEZXNjcmlwdG9yKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IpIHsKLQkJaWYgKG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SICYmIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Fzc2VtYmx5RGVzY3JpcHRvcikuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciwgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZEVsZW1lbnRzKCkgewotCQlpZiAobWV0aG9kRWxlbWVudHMgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kRWxlbWVudC5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX01FVEhPRF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1IsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVRIT0RfVFJBTlNBQ1RJT05TLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBnZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX01FVEhPRF9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFOgotCQkJCXJldHVybiBpc1NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRzICE9IG51bGwgJiYgIW1ldGhvZEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEU6Ci0JCQkJc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlzZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fTUVUSE9EX0VMRU1FTlRTOgotCQkJCWdldE1ldGhvZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFOgotCQkJCXVuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKLQkJCQlzZXRBc3NlbWJseURlc2NyaXB0b3IoKEFzc2VtYmx5RGVzY3JpcHRvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19NRVRIT0RfRUxFTUVOVFM6Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNhY3Rpb25BdHRyaWJ1dGU6ICIpOwotCQlpZiAodHJhbnNhY3Rpb25BdHRyaWJ1dGVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uQXR0cmlidXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTYxMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUga2V5QXR0cmlidXRlcyBmcm9tIHRoZSAKLSAqIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIGZpbHRlciBtZXRob2QuCi0gKiBJdCB3aWxsIHJlbW92ZSBhbnkga2V5QXR0cmlidXRlcyB0aGF0IGFyZSBoZWxkIGJ5IEVqYlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0cyAoaW5jbHVkaW5nCi0gKiBpbmhlcml0ZWQgRWpiUmVsYXRpb25zaGlwUm9sZSBhdHRyaWJ1dGVzKS4KLSAqIFRoYXQgbWVhbnMgdGhlIHJldHVybmVkIGxpc3Qgb2YgQ01QQXR0cmlidXRlcyB3aWxsIGJlIGtleSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBkZWZpbmVkIGxvY2FsbHkKLSAqIGFuZCBhbGwgaW5oZXJpdGVkIGtleSBhdHRyaWJ1dGVzIG1pbnVzIGFueSBrZXkgYXR0cmlidXRlcyBwb2ludGVkIHRvIGJ5IEVqYlJlbGF0aW9uc2hpcFJvbGVzLCB0aHVzIHRoZQotICoga2V5IGF0dHJpYnV0ZXMgd2lsbCBvbmx5IGJlIGtleSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgODowOToxMCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwotLyoqCi0gKiBmaWx0ZXIgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBMaXN0IGZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCXJldHVybiBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcHJvcGVyIGxpc3Qgb2YgYXR0cmlidXRlcyBmcm9tIGNtcEV4dC4KLSAqIFJldHVybiBhbGwgYXR0cmlidXRlcyBtaW51cyB0aG9zZSBhZGRlZCBkdWUgdG8gUmVsYXRpb25zaGlwIFJvbGVzLgotICovCi1wcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlQXR0cmlidXRlcyhDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotCWphdmEudXRpbC5MaXN0IGFsbCwgbG9jYWxSb2xlS2V5QXR0cmlidXRlczsKLQlhbGwgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdChjbXAuZ2V0S2V5QXR0cmlidXRlcygpKTsKLQlsb2NhbFJvbGVLZXlBdHRyaWJ1dGVzID0gY21wLmdldEZpbHRlcmVkRmVhdHVyZXMoS2V5UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5zaW5nbGV0b24oKSk7Ci0JZmlsdGVyUm9sZUF0dHJpYnV0ZXNCeU5hbWUoYWxsLCBsb2NhbFJvbGVLZXlBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gYWxsOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA1OjM2OjAwIFBNKQotICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLk1vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyCi0gKi8KLXB1YmxpYyBzdGF0aWMgTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uKCkgewotCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJc2luZ2xldG9uID0gbmV3IE1vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyKCk7Ci0JcmV0dXJuIHNpbmdsZXRvbjsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Nb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4YzdiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Nb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIHJldHVybiBhIHN1YnNldCBvZiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZXMgZnJvbSB0aGUgCi0gKiBDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IHBlcnNpc3RlbnRBdHRyaWJ1dGVzIHRoYXQgYXJlIGhlbGQgYnkgRWpiUmVsYXRpb25zaGlwUm9sZSBvYmplY3RzIChpbmNsdWRpbmcKLSAqIGluaGVyaXRlZCBFamJSZWxhdGlvbnNoaXBSb2xlIGF0dHJpYnV0ZXMpLgotICogVGhhdCBtZWFucyB0aGUgcmV0dXJuZWQgbGlzdCBvZiBDTVBBdHRyaWJ1dGVzIHdpbGwgYmUgYXR0cmlidXRlcyB0aGF0IHdlcmUgZGVmaW5lZCBsb2NhbGx5Ci0gKiBhbmQgYWxsIGluaGVyaXRlZCBhdHRyaWJ1dGVzIG1pbnVzIGFueSBhdHRyaWJ1dGVzIHBvaW50ZWQgdG8gYnkgRWpiUmVsYXRpb25zaGlwUm9sZXMsIHRodXMgdGhlCi0gKiBhdHRyaWJ1dGVzIHdpbGwgb25seSBiZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNzozMTo0MiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewotCXByaXZhdGUgc3RhdGljIE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b247Ci0vKioKLSAqIGZpbHRlciBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIExpc3QgZmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JcmV0dXJuIGdldFNvdXJjZUF0dHJpYnV0ZXMoY21wKTsKLX0KLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgotICogUmV0dXJuIGFsbCBhdHRyaWJ1dGVzIG1pbnVzIHRob3NlIGFkZGVkIGR1ZSB0byBSZWxhdGlvbnNoaXAgUm9sZXMuCi0gKi8KLXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRTb3VyY2VBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JamF2YS51dGlsLkxpc3QgYWxsLCByb2xlQXR0cmlidXRlczsKLQlhbGwgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdChjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKSk7Ci0Jcm9sZUF0dHJpYnV0ZXMgPSBjbXAuZ2V0RmlsdGVyZWRGZWF0dXJlcyhSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLnNpbmdsZXRvbigpKTsKLQlmaWx0ZXJSb2xlQXR0cmlidXRlc0J5TmFtZShhbGwsIHJvbGVBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gYWxsOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA1OjM2OjAwIFBNKQotICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLk1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyKCk7Ci0JcmV0dXJuIHNpbmdsZXRvbjsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTm9uS2V5UmVxdWlyZWRSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2M2E0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDUsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250YWluZXJNYW5hZ2VkRW50aXR5RmlsdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE5vbktleVJlcXVpcmVkUm9sZUZpbHRlciBzaW5nbGV0b247Ci0KLSAgICAvKioKLSAgICAgKiBmaWx0ZXIgbWV0aG9kIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0gICAgICAgIExpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZ2V0UmVsYXRpb25zaGlwUm9sZXMoY21wKS5pdGVyYXRvcigpOwotICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFyb2xlLmlzS2V5KCkgJiYgcm9sZS5pc1JlcXVpcmVkKCkpIHJvbGVzLmFkZChyb2xlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9sZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA3OjE1OjM3Ci0gICAgICogUE0pCi0gICAgICogCi0gICAgICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLktleVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5vbktleVJlcXVpcmVkUm9sZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkgc2luZ2xldG9uID0gbmV3IE5vbktleVJlcXVpcmVkUm9sZUZpbHRlcigpOwotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzYyMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZXR1cm5UeXBlTWFwcGluZzsKLQotLyoqCi0gKiBUaGUgcXVlcnkgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnk7IHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmaW5kZXIgb3Igc2VsZWN0IG1ldGhvZCBpdCBpcyB1c2VkIGJ5OyBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHJldHVybiB0eXBlIG1hcHBpbmcsIGlmIGFueSwgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2Q7IGFuZCB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LiBRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkKLSAqIGlzIG5vdCBleHByZXNzaWJsZSBpbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHF1ZXJ5IGFuZCB0aGUgZWpiLXFsIGVsZW1lbnQgc2hvdWxkIGJlIGVtcHR5LgotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBRdWVyeSwgRU9iamVjdHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUUwoKSA8ZW0+RWpiIFFMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFamJRTCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1FMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWpiUUwgPSBFSkJfUUxfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldHVyblR5cGVNYXBwaW5nKCkgPGVtPlJldHVybiBUeXBlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldHVyblR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJldHVyblR5cGVNYXBwaW5nIFJFVFVSTl9UWVBFX01BUFBJTkdfRURFRkFVTFQgPSBSZXR1cm5UeXBlTWFwcGluZy5MT0NBTF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFJldHVyblR5cGVNYXBwaW5nIHJldHVyblR5cGVNYXBwaW5nID0gUkVUVVJOX1RZUEVfTUFQUElOR19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJldHVybiBUeXBlIE1hcHBpbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldHVyblR5cGVNYXBwaW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFF1ZXJ5TWV0aG9kIHF1ZXJ5TWV0aG9kID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgUXVlcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldFF1ZXJ5KCk7Ci0JfQotCi1wdWJsaWMgYm9vbGVhbiBpc0xvY2FsUmVzdWx0TWFwcGluZygpIHsKLQkvLyBvdmVycmlkZSBidWcgaW4gdGhlIG1vZGVsIHdoaWNoIG1hZGUgUmVtb3RlIHRoZSBkZWZhdWx0Ci0JcmV0dXJuIGdldFJldHVyblR5cGVNYXBwaW5nKCkuZ2V0VmFsdWUoKSA9PSBSZXR1cm5UeXBlTWFwcGluZy5MT0NBTDsKLX0KLXB1YmxpYyBib29sZWFuIGlzUmVtb3RlUmVzdWx0TWFwcGluZygpIHsKLQlyZXR1cm4gZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKS5nZXRWYWx1ZSgpID09IFJldHVyblR5cGVNYXBwaW5nLlJFTU9URTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gaXMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBxdWVyeS4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBDb250YWlucyB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBUaGlzIGVsZW1lbnQgaXMgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgcXVlcnkgZWxlbWVudCB3aG9zZSBjb250ZW50cyBzcGVjaWZ5IHRoZSBmaW5kZXIgb3IgdGhlIHNlbGVjdCBtZXRob2QgdGhhdCB1c2VzIHRoZSBxdWVyeS4gVGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBlbnRpdHkgYmVhbiBmb3Igd2hpY2ggdGhlIHF1ZXJ5IGlzIHNwZWNpZmllZC4gVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwuCi0JICogCi0JICogQGludmFyaWFudCBUaGUgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBlbnRpdHkgYmVhbiBvciBkZXBlbmRlbnQgb2JqZWN0IGNsYXNzIGZvciB3aGljaCB0aGUgcXVlcnkgaXMgc3BlY2lmaWVkLgotCSAqIEBpbnZhcmlhbnQgVGhlIGVqYi1xbCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbGwgcXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwuCi0JICogCi0JICogRXhhbXBsZToKLQkgKiA8cXVlcnk+Ci0JICogPHF1ZXJ5LW1ldGhvZD4KLQkgKiA8bWV0aG9kLW5hbWU+ZWpiU2VsZWN0UGVuZGluZ0xpbmVpdGVtczwvL21ldGhvZC1uYW1lPgotCSAqIDxtZXRob2QtcGFyYW1zLy8+Ci0JICogPC8vcXVlcnktbWV0aG9kPgotCSAqIDxlamItcWw+U0VMRUNUIEVOVElUWShsKQotCSAqIEZST00gTGluZUl0ZW1zIGwKLQkgKiBXSEVSRSBsLnNoaXBwZWQgaXMgRkFMU0UKLQkgKiA8Ly9lamItcWw+Ci0JICogPC8vcXVlcnk+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRFamJRTCgpIHsKLQkJcmV0dXJuIGVqYlFMOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYlFMKFN0cmluZyBuZXdFamJRTCkgewotCQlTdHJpbmcgb2xkRWpiUUwgPSBlamJRTDsKLQkJZWpiUUwgPSBuZXdFamJRTDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fRUpCX1FMLCBvbGRFamJRTCwgZWpiUUwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcmV0dXJuLXR5cGUtbWFwcGluZyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8gc3BlY2lmeSB3aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHRoYXQgaXMgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvciBFSkJPYmplY3QgdHlwZS4gIFRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuLXR5cGUtbWFwcGluZyBlbGVtZW50LCBpZiBzcGVjaWZpZWQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZy4KLQkgKi8KLQlwdWJsaWMgUmV0dXJuVHlwZU1hcHBpbmcgZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiByZXR1cm5UeXBlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZyBuZXdSZXR1cm5UeXBlTWFwcGluZykgewotCQlSZXR1cm5UeXBlTWFwcGluZyBvbGRSZXR1cm5UeXBlTWFwcGluZyA9IHJldHVyblR5cGVNYXBwaW5nOwotCQlyZXR1cm5UeXBlTWFwcGluZyA9IG5ld1JldHVyblR5cGVNYXBwaW5nID09IG51bGwgPyBSRVRVUk5fVFlQRV9NQVBQSU5HX0VERUZBVUxUIDogbmV3UmV0dXJuVHlwZU1hcHBpbmc7Ci0JCWJvb2xlYW4gb2xkUmV0dXJuVHlwZU1hcHBpbmdFU2V0ID0gcmV0dXJuVHlwZU1hcHBpbmdFU2V0OwotCQlyZXR1cm5UeXBlTWFwcGluZ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HLCBvbGRSZXR1cm5UeXBlTWFwcGluZywgcmV0dXJuVHlwZU1hcHBpbmcsICFvbGRSZXR1cm5UeXBlTWFwcGluZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJldHVyblR5cGVNYXBwaW5nKCkgewotCQlSZXR1cm5UeXBlTWFwcGluZyBvbGRSZXR1cm5UeXBlTWFwcGluZyA9IHJldHVyblR5cGVNYXBwaW5nOwotCQlib29sZWFuIG9sZFJldHVyblR5cGVNYXBwaW5nRVNldCA9IHJldHVyblR5cGVNYXBwaW5nRVNldDsKLQkJcmV0dXJuVHlwZU1hcHBpbmcgPSBSRVRVUk5fVFlQRV9NQVBQSU5HX0VERUZBVUxUOwotCQlyZXR1cm5UeXBlTWFwcGluZ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HLCBvbGRSZXR1cm5UeXBlTWFwcGluZywgUkVUVVJOX1RZUEVfTUFQUElOR19FREVGQVVMVCwgb2xkUmV0dXJuVHlwZU1hcHBpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHJldHVyblR5cGVNYXBwaW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgcXVlcnktbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtZXRob2QgKERCLy9TUi8vQ00tIm9uIHRoZSBob21lIikgZm9yIGEgZmluZGVyIG9yCi0JICogc2VsZWN0IHF1ZXJ5LgotCSAqIAotCSAqIFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QKLQkgKiBtZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3Mgb3IgYSBzZWxlY3QgbWV0aG9kIGluCi0JICogdGhlIGRlcGVuZGVudCBvYmplY3QgY2xhc3MuCi0JICogCi0JICogRWFjaCBtZXRob2QtcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGZvciBhIHF1ZXJ5LW1ldGhvZCB1c2luZyB0aGUKLQkgKiBtZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0JICogCi0JICogVXNlZCBpbjogcXVlcnkKLQkgKiAKLQkgKiBFeGFtcGxlOgotCSAqIAotCSAqIEV4YW1wbGU6Ci0JICogPHF1ZXJ5PgotCSAqICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8Ly9kZXNjcmlwdGlvbj4KLQkgKiAgIDxxdWVyeS1tZXRob2Q+Ci0JICogICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8Ly9tZXRob2QtbmFtZT4KLQkgKiAgICAgPG1ldGhvZC1wYXJhbXM+PC8vbWV0aG9kLXBhcmFtcz4KLQkgKiAgIDwvL3F1ZXJ5LW1ldGhvZD4KLQkgKiAgIDxlamItcWw+U0VMRUNUIEVOVElUWShvKSBGUk9NIE9yZGVyIG8gV0hFUkUgby5hbW91bnQgJmd0OyAxMDAwPC8vZWpiLXFsPgotCSAqIDwvL3F1ZXJ5PgotCSAqLwotCXB1YmxpYyBRdWVyeU1ldGhvZCBnZXRRdWVyeU1ldGhvZCgpIHsKLQkJcmV0dXJuIHF1ZXJ5TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG5ld1F1ZXJ5TWV0aG9kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVF1ZXJ5TWV0aG9kIG9sZFF1ZXJ5TWV0aG9kID0gcXVlcnlNZXRob2Q7Ci0JCXF1ZXJ5TWV0aG9kID0gbmV3UXVlcnlNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRCwgb2xkUXVlcnlNZXRob2QsIG5ld1F1ZXJ5TWV0aG9kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdWVyeU1ldGhvZChRdWVyeU1ldGhvZCBuZXdRdWVyeU1ldGhvZCkgewotCQlpZiAobmV3UXVlcnlNZXRob2QgIT0gcXVlcnlNZXRob2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHF1ZXJ5TWV0aG9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXF1ZXJ5TWV0aG9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlksIFF1ZXJ5TWV0aG9kLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdRdWVyeU1ldGhvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdRdWVyeU1ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZLCBRdWVyeU1ldGhvZC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRRdWVyeU1ldGhvZChuZXdRdWVyeU1ldGhvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0QsIG5ld1F1ZXJ5TWV0aG9kLCBuZXdRdWVyeU1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEVudGl0eSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDb250YWluZXJNYW5hZ2VkRW50aXR5KWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5KENvbnRhaW5lck1hbmFnZWRFbnRpdHkgbmV3RW50aXR5KSB7Ci0JCWlmIChuZXdFbnRpdHkgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFkgJiYgbmV3RW50aXR5ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RW50aXR5KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUVVFUklFUywgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3RW50aXR5LCBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZLCBuZXdFbnRpdHksIG5ld0VudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJCWlmIChxdWVyeU1ldGhvZCAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXF1ZXJ5TWV0aG9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9ELCBudWxsLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UXVlcnlNZXRob2QoKFF1ZXJ5TWV0aG9kKW90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWToKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5TWV0aG9kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEVqYlBhY2thZ2UuUVVFUllfX0VOVElUWSwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFk6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19RVUVSSUVTLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlyZXR1cm4gZ2V0RWpiUUwoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORzoKLQkJCQlyZXR1cm4gZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9EOgotCQkJCXJldHVybiBnZXRRdWVyeU1ldGhvZCgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFk6Ci0JCQkJcmV0dXJuIGdldEVudGl0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlyZXR1cm4gRUpCX1FMX0VERUZBVUxUID09IG51bGwgPyBlamJRTCAhPSBudWxsIDogIUVKQl9RTF9FREVGQVVMVC5lcXVhbHMoZWpiUUwpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19SRVRVUk5fVFlQRV9NQVBQSU5HOgotCQkJCXJldHVybiBpc1NldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKLQkJCQlyZXR1cm4gcXVlcnlNZXRob2QgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZOgotCQkJCXJldHVybiBnZXRFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlzZXRFamJRTCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1JFVFVSTl9UWVBFX01BUFBJTkc6Ci0JCQkJc2V0UmV0dXJuVHlwZU1hcHBpbmcoKFJldHVyblR5cGVNYXBwaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKLQkJCQlzZXRRdWVyeU1ldGhvZCgoUXVlcnlNZXRob2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZOgotCQkJCXNldEVudGl0eSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0VKQl9RTDoKLQkJCQlzZXRFamJRTChFSkJfUUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fUkVUVVJOX1RZUEVfTUFQUElORzoKLQkJCQl1bnNldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19RVUVSWV9NRVRIT0Q6Ci0JCQkJc2V0UXVlcnlNZXRob2QoKFF1ZXJ5TWV0aG9kKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZOgotCQkJCXNldEVudGl0eSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlamJRTDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWpiUUwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJldHVyblR5cGVNYXBwaW5nOiAiKTsKLQkJaWYgKHJldHVyblR5cGVNYXBwaW5nRVNldCkgcmVzdWx0LmFwcGVuZChyZXR1cm5UeXBlTWFwcGluZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeU1ldGhvZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc3ZTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlNZXRob2RJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBRdWVyeU1ldGhvZHsKLQotCXB1YmxpYyBRdWVyeU1ldGhvZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UXVlcnlNZXRob2QoKTsKLQl9Ci0KLS8qKgotICogRm9yIFF1ZXJ5IG1ldGhvZHMsIHRoZWlyIGVudGVycHJpc2UgYmVhbiBtdXN0IGJlIGRlcml2ZWQuCi0gKiBJdCBpcyB0aGUgRW50aXR5IHdoaWNoIGNvbnRhaW5zIHRoZSBRdWVyeS4KLSAqLwotcHVibGljIEVudGVycHJpc2VCZWFuIGdldEVudGVycHJpc2VCZWFuKCkgewotCWlmIChlbnRlcnByaXNlQmVhbiA9PSBudWxsKSB7Ci0JCWlmIChnZXRRdWVyeSgpICE9IG51bGwpCi0JCQllbnRlcnByaXNlQmVhbiA9IGdldFF1ZXJ5KCkuZ2V0RW50aXR5KCk7Ci0JfQotCXJldHVybiBlbnRlcnByaXNlQmVhbjsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBtZXRob2QgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIGVsZW1lbnQgYXBwbGllcyBpbiB0aGUgSE9NRSBJTlRFUkZBQ0UuCi0gKi8KLXByb3RlY3RlZCBNZXRob2QgZ2V0SG9tZU1ldGhvZCgpIHsKLQlNZXRob2QgcmVzdWx0ID0gbnVsbDsKLQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gZ2V0TmFtZSgpLnRyaW0oKTsKLQkJaWYgKGhhc01ldGhvZFBhcmFtcygpKQotCQkJcmVzdWx0ID0gamF2YUNsYXNzLmdldFB1YmxpY01ldGhvZEV4dGVuZGVkKG1ldGhvZE5hbWUsIGdldE1ldGhvZFBhcmFtcygpKTsKLQkJZWxzZSB7Ci0JCQlMaXN0IG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkTmFtZWQobWV0aG9kTmFtZSk7Ci0JCQlpZiAoIW1ldGhvZHMuaXNFbXB0eSgpKQotCQkJCXJlc3VsdCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KDApOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIEFuc3dlciB0aGUgbWV0aG9kIGZvciB3aGljaCB0aGlzIG1ldGhvZCBlbGVtZW50IGFwcGxpZXMgaW4gdGhlIExPQ0FMIEhPTUUgSU5URVJGQUNFLgotICovCi1wcm90ZWN0ZWQgTWV0aG9kIGdldExvY2FsSG9tZU1ldGhvZCgpIHsKLQlNZXRob2QgcmVzdWx0ID0gbnVsbDsKLQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gZ2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKTsKLQlpZiAoamF2YUNsYXNzICE9IG51bGwpIHsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXROYW1lKCkudHJpbSgpOwotCQlpZiAoaGFzTWV0aG9kUGFyYW1zKCkpCi0JCQlyZXN1bHQgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQobWV0aG9kTmFtZSwgZ2V0TWV0aG9kUGFyYW1zKCkpOwotCQllbHNlIHsKLQkJCUxpc3QgbWV0aG9kcyA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWROYW1lZChtZXRob2ROYW1lKTsKLQkJCWlmICghbWV0aG9kcy5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0ID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0KLXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZElmTm90TnVsbChMaXN0IGFMaXN0LCBNZXRob2QgYU1ldGhvZCkgewotCWlmIChhTWV0aG9kICE9IG51bGwpCi0JCWFMaXN0LmFkZChhTWV0aG9kKTsKLX0KLS8qKgotICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSB6ZXJvLWxlbmd0aCBNZXRob2RbXSBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBtZXRob2QKLSAqIG9uIHRoZSBob21lLCBsb2NhbCBob21lLCBvciBiZWFuIGNsYXNzLiAgSXQgd2lsbCByZXR1cm4gZXhhY3RseSBvbmUgbWV0aG9kCi0gKiBmb3IgZWpiU2VsZWN0LCBhbmQgb25lIG9yIHR3byBtZXRob2RzIGZvciBmaW5kZXJzLiAgVGhlIHR3byBtZXRob2QgY2FzZSBvY2N1cnMKLSAqIHdoZW4gdGhlIHNhbWUgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGV4aXN0cyBvbiBib3RoIHRoZSBob21lIGFuZAotICogbG9jYWwgaG9tZS4KLSAqLwotcHVibGljIE1ldGhvZFtdIGdldE1ldGhvZHMoKSB7Ci0JTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDIpOwotCWlmIChnZXROYW1lKCkuc3RhcnRzV2l0aCgiZWpiU2VsZWN0IikpIHsgLy8kTk9OLU5MUy0xJAotCQlhZGRNZXRob2RJZk5vdE51bGwocmVzdWx0LCBnZXRTZWxlY3RNZXRob2QoKSk7Ci0JfSBlbHNlIHsKLQkJYWRkTWV0aG9kSWZOb3ROdWxsKHJlc3VsdCwgZ2V0SG9tZU1ldGhvZCgpKTsKLQkJYWRkTWV0aG9kSWZOb3ROdWxsKHJlc3VsdCwgZ2V0TG9jYWxIb21lTWV0aG9kKCkpOwotCX0KLQlyZXR1cm4gKE1ldGhvZFtdKXJlc3VsdC50b0FycmF5KG5ldyBNZXRob2RbcmVzdWx0LnNpemUoKV0pOwotfQotLyoqCi0gKiBBbnN3ZXIgdGhlIG1ldGhvZCBmb3Igd2hpY2ggdGhpcyBtZXRob2QgZWxlbWVudCBhcHBsaWVzIGluIHRoZSBIT01FIElOVEVSRkFDRS4KLSAqLwotcHJvdGVjdGVkIE1ldGhvZCBnZXRTZWxlY3RNZXRob2QoKSB7Ci0JTWV0aG9kIHJlc3VsdCA9IG51bGw7Ci0JSmF2YUNsYXNzIGphdmFDbGFzcyA9IGdldEVudGVycHJpc2VCZWFuKCkuZ2V0RWpiQ2xhc3MoKTsKLQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldE5hbWUoKS50cmltKCk7Ci0JaWYgKGhhc01ldGhvZFBhcmFtcygpKQotCQlyZXN1bHQgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQobmFtZSwgZ2V0TWV0aG9kUGFyYW1zKCkpOwotCWVsc2UgewotCQlMaXN0IG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkTmFtZWQobWV0aG9kTmFtZSk7Ci0JCWlmICghbWV0aG9kcy5pc0VtcHR5KCkpCi0JCQlyZXN1bHQgPSAoTWV0aG9kKSBtZXRob2RzLml0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBRdWVyeSBnZXRRdWVyeSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChRdWVyeSllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFF1ZXJ5IG5ld1F1ZXJ5KSB7Ci0JCWlmIChuZXdRdWVyeSAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSAmJiBuZXdRdWVyeSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1F1ZXJ5KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdRdWVyeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdRdWVyeSkuZUludmVyc2VBZGQodGhpcywgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9ELCBRdWVyeS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnksIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlksIG5ld1F1ZXJ5LCBuZXdRdWVyeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWToKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlksIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWToKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5RVUVSWV9fUVVFUllfTUVUSE9ELCBRdWVyeS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19QQVJNUzoKLQkJCQlyZXR1cm4gZ2V0UGFybXMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fRU5URVJQUklTRV9CRUFOOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRlcnByaXNlQmVhbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXJldHVybiBnZXRRdWVyeSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1BBUk1TOgotCQkJCXJldHVybiBQQVJNU19FREVGQVVMVCA9PSBudWxsID8gcGFybXMgIT0gbnVsbCA6ICFQQVJNU19FREVGQVVMVC5lcXVhbHMocGFybXMpOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRUeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0VOVEVSUFJJU0VfQkVBTjoKLQkJCQlyZXR1cm4gZW50ZXJwcmlzZUJlYW4gIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWToKLQkJCQlyZXR1cm4gZ2V0UXVlcnkoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1BBUk1TOgotCQkJCXNldFBhcm1zKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoTWV0aG9kRWxlbWVudEtpbmQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0VOVEVSUFJJU0VfQkVBTjoKLQkJCQlzZXRFbnRlcnByaXNlQmVhbigoRW50ZXJwcmlzZUJlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlk6Ci0JCQkJc2V0UXVlcnkoKFF1ZXJ5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1BBUk1TOgotCQkJCXNldFBhcm1zKFBBUk1TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19UWVBFOgotCQkJCXVuc2V0VHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19FTlRFUlBSSVNFX0JFQU46Ci0JCQkJc2V0RW50ZXJwcmlzZUJlYW4oKEVudGVycHJpc2VCZWFuKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgotCQkJCXNldFF1ZXJ5KChRdWVyeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogWW91IHNob3VsZCB1c2UgZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzIHRvIGVuc3VyZSB5b3UgcGljayB1cCBib3RoIGhvbWUgaW50ZXJmYWNlcwotCSAqIGlmIHRoZXkgZXhpc3QuCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRUeXBlSmF2YUNsYXNzKCkgewotCQlKYXZhQ2xhc3NbXSByZXN1bHQgPSBnZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPiAwKQotCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBKYXZhQ2xhc3NlcyBvZiBhbGwgdGhlIGludGVyZmFjZXMgb3IgYmVhbiBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIHByZXNlbnRlZAotCSAqIHRvIGEgY2xpZW50LiAgSWYgaXQgaXMgYW4gZWpiU2VsZWN0Li4uIG9uIHRoZSBiZWFuIGNsYXNzIHdpbGwgYmUgcmV0dXJuZWQgYW5kIGlmCi0JICogaXQgaWYgYSBmaW5kIGJvdGggaG9tZSBpbnRlcmZhY2VzIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhleSBleGlzdC4KLQkgKiAKLQkgKiBNYXkgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIEphdmFDbGFzc1tdIGdldENsaWVudFR5cGVKYXZhQ2xhc3NlcygpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsIHx8IGdldEVudGVycHJpc2VCZWFuKCkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUVudGVycHJpc2VCZWFuIGVqYiA9IGdldEVudGVycHJpc2VCZWFuKCk7Ci0JCWlmIChnZXROYW1lKCkuc3RhcnRzV2l0aChTRUxFQ1RfUFJFRklYKSkKLQkJCXJldHVybiBuZXcgSmF2YUNsYXNzW117ZWpiLmdldEVqYkNsYXNzKCl9OwotCQkvL05leHQgY2FzZSBpcyB0b3VnaGVyIHNpbmNlIHlvdSBjb3VsZCBoYXZlIGJvdGggYSByZW1vdmUgYW5kIGxvY2FsIGNsaWVudAotCQkvL1dlIHdhbnQgdG8gcmV0dXJuIHRoZSBob21lIGludGVyZmFjZSBpbiB0aGlzIGNhc2UuCi0JCWlmIChnZXROYW1lKCkuc3RhcnRzV2l0aChGSU5EX1BSRUZJWCkpIHsKLQkJCWlmIChlamIuaGFzTG9jYWxDbGllbnQoKSAmJiAhZWpiLmhhc1JlbW90ZUNsaWVudCgpKQotCQkJCXJldHVybiBuZXcgSmF2YUNsYXNzW117Z2V0RW50ZXJwcmlzZUJlYW4oKS5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKX07Ci0JCQlpZiAoZWpiLmhhc1JlbW90ZUNsaWVudCgpICYmICFlamIuaGFzTG9jYWxDbGllbnQoKSkKLQkJCQlyZXR1cm4gbmV3IEphdmFDbGFzc1tde2VqYi5nZXRIb21lSW50ZXJmYWNlKCl9OwotCQkJaWYgKGVqYi5oYXNSZW1vdGVDbGllbnQoKSAmJiBlamIuaGFzTG9jYWxDbGllbnQoKSkKLQkJCQlyZXR1cm4gbmV3IEphdmFDbGFzc1tde2VqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSwgZWpiLmdldEhvbWVJbnRlcmZhY2UoKX07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWRiYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgd2lsbCByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGVzICh0aGlzIGluY2x1ZGVzIGluaGVyaXRlZCAKLSAqIGF0dHJpYnV0ZXMpIGZyb20gdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gdGhhdCBpcyBwYXNzZWQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBmaWx0ZXIgbWV0aG9kLgotICogSXQgd2lsbCByZW1vdmUgYW55IGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCBwb2ludGVkIHRvIGJ5IGFuIEVqYlJlbGF0aW9uc2hpcFJvbGUuCi0gKiBUaHVzLCB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGNvbnRhaW4gYXR0cmlidXRlcyAoaW5jbHVkaW5nIGluaGVyaXRlZCBhdHRyaWJ1dGVzKSB0aGF0IG9ubHkKLSAqIGJlbG9uZyB0byByb2xlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS8yOC8yMDAwIDY6NDY6MDggUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKLS8qKgotICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiByb2xlcyBmcm9tIGNtcEV4dC4KLSAqLwotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZVJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7IAotCSAgIHJldHVybiBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApOyAKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzI4LzIwMDAgNTozNjowMCBQTSkKLSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5SZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyCi0gKi8KLXB1YmxpYyBzdGF0aWMgUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlciBzaW5nbGV0b24oKSB7Ci0JaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQlzaW5nbGV0b24gPSBuZXcgUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlcigpOwotCXJldHVybiBzaW5nbGV0b247Ci19Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZmY2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotCi0vKioKLSAqIFRoZSByZWxhdGlvbnNoaXBzIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbiB3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXIgbWFuYWdlZCBwZXJzaXN0ZW5jZSBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHMgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVsYXRpb25zaGlwcywgRU9iamVjdHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiUmVsYXRpb25zID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVsYXRpb25zaGlwcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGNvbGxlY3Rpb24gb2YgcmVsYXRpb25zaGlwcy4KLQkgKiAKLQkgKiBUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlIChpLmUuIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZiBkZXBlbmRlbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFSkJKYXIgZ2V0RWpiSmFyKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEVKQkphcillQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYkphcihFSkJKYXIgbmV3RWpiSmFyKSB7Ci0JCWlmIChuZXdFamJKYXIgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVIgJiYgbmV3RWpiSmFyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RWpiSmFyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFamJKYXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RWpiSmFyKS5lSW52ZXJzZUFkZCh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNULCBFSkJKYXIuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0VqYkphciwgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX0pBUiwgbmV3RWpiSmFyLCBuZXdFamJKYXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBBIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaCBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZAotCSAqIHJlbGF0aW9uc2hpcHMuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVqYlJlbGF0aW9ucygpIHsKLQkJaWYgKGVqYlJlbGF0aW9ucyA9PSBudWxsKSB7Ci0JCQllamJSZWxhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChFSkJSZWxhdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fUkVMQVRJT05TSElQX0xJU1QpOwotCQl9Ci0JCXJldHVybiBlamJSZWxhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX0pBUiwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVsYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX0pBUiwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVsYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX1JFTEFUSU9OU0hJUF9MSVNULCBFSkJKYXIuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlbGF0aW9ucygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6Ci0JCQkJcmV0dXJuIGdldEVqYkphcigpICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUzoKLQkJCQlyZXR1cm4gZWpiUmVsYXRpb25zICE9IG51bGwgJiYgIWVqYlJlbGF0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX0pBUjoKLQkJCQlzZXRFamJKYXIoKEVKQkphciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6Ci0JCQkJZ2V0RWpiUmVsYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWxhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TOgotCQkJCWdldEVqYlJlbGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkTG9jYWxSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzFmYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMTUvMjAwMSAxMTozNTowMCBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJlcXVpcmVkTG9jYWxSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgewotCXByaXZhdGUgc3RhdGljIFJlcXVpcmVkTG9jYWxSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHNpbmdsZXRvbjsKLXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRSb2xlc1RvRmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0gICAgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIG1vZEhlbHBlciA9IGdldEVqYk1vZHVsZUV4dEhlbHBlcihjbXApOwotCWlmKG1vZEhlbHBlciAhPSBudWxsKQotCSAgcmV0dXJuIG1vZEhlbHBlci5nZXRMb2NhbFJlbGF0aW9uc2hpcFJvbGVzX2NtcDExKGNtcCk7Ci0JcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzYvMjAwMSAxMToyNzoyNSBBTSkKLSAqIEByZXR1cm4gY29tLmlibS5lanMubW9kZWxzLmJhc2UuZXh0ZW5zaW9ucy5lamJleHQuaW1wbC5SZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlcgotICovCi1wdWJsaWMgc3RhdGljIFJlcXVpcmVkTG9jYWxSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHNpbmdsZXRvbigpIHsKLQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCXNpbmdsZXRvbiA9IG5ldyBSZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlcigpOwotCXJldHVybiBzaW5nbGV0b247Ci19Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDhkNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db21tb25SZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvNi8yMDAxIDExOjI2OjEwIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uOwotCi0gICAgLyoqCi0gICAgICogZmlsdGVyIG1ldGhvZCBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewotICAgICAgICBMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGdldFJlbGF0aW9uc2hpcFJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKLSAgICAgICAgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByb2xlID0gKENvbW1vblJlbGF0aW9uc2hpcFJvbGUpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRBZGRGaWx0ZXJlZFJlc3VsdChyb2xlKSkgcm9sZXMuYWRkKHJvbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb2xlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbXVsdGlwbGljaXR5IGZvciBAYVJvbGUgaXMgcmVxdWlyZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWRkRmlsdGVyZWRSZXN1bHQoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotICAgICAgICByZXR1cm4gYVJvbGUuaXNSZXF1aXJlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvNi8yMDAxIDExOjI3OjI1Ci0gICAgICogQU0pCi0gICAgICogCi0gICAgICogQHJldHVybiBjb20uaWJtLmVqcy5tb2RlbHMuYmFzZS5leHRlbnNpb25zLmVqYmV4dC5pbXBsLlJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHNpbmdsZXRvbigpIHsKLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKSBzaW5nbGV0b24gPSBuZXcgUmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyKCk7Ci0gICAgICAgIHJldHVybiBzaW5nbGV0b247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNoYXBlU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTaGFwZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNGNkY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNoYXBlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuSVJvbGVTaGFwZVN0cmF0ZWd5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMS82LzIwMDAgMTE6NDE6MzMgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSb2xlU2hhcGVTdHJhdGVneSBpbXBsZW1lbnRzIElSb2xlU2hhcGVTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYnVzeSA9IGZhbHNlOwotCXByb3RlY3RlZCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7Ci0JcHJvdGVjdGVkIEFycmF5TGlzdCB2aXNpdGVkS2V5VHlwZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotLyoqCi0gKiBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgUm9sZVNoYXBlU3RyYXRlZ3koQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCXN1cGVyKCk7Ci0Jc2V0Um9sZShhUm9sZSk7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nIGFwcGVuZE5hbWUoU3RyaW5nIGZ1bGxOYW1lLCBTdHJpbmcgYWRkaXRpb25hbE5hbWUpIHsKLQlyZXR1cm4gZnVsbE5hbWUgKyBBVFRSSUJVVEVfTkFNRV9KT0lORVIgKyBhZGRpdGlvbmFsTmFtZTsKLX0KLXByb3RlY3RlZCBib29sZWFuIGNhbkNvbnRpbnVlKCkgewotCXJldHVybiAhYnVzeSAmJiByb2xlLmlzRm9yd2FyZCgpICYmIHJvbGUuZ2V0TmFtZSgpICE9IG51bGw7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db21wdXRlTmFtZXMoKSB7Ci0JLy9yZXR1cm4gZ2V0Um9sZSgpLmdldE9wcG9zaXRlKCkgIT0gbnVsbDsKLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzE2LzAwIDk6MTk6MjcgUE0pCi0gKiBAcmV0dXJuIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLSAqLwotcHVibGljIENvbW1vblJlbGF0aW9uc2hpcFJvbGUgZ2V0Um9sZSgpIHsKLQlyZXR1cm4gcm9sZTsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDExLzE2LzAwIDk6MTk6MjcgUE0pCi0gKiBAcmV0dXJuIENvbW1vblJlbGF0aW9uc2hpcFJvbGUKLSAqLwotCi1wdWJsaWMgYm9vbGVhbiBpc0ZsYXQgKCkgewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzUm91bmQgKCkgewotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogQ3JlYXRlcyBhbiBhcHBlbmRlZCBuYW1lIHdoaWxlIHVwcGVyY2FzaW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIHNlY29uZE5hbWUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VKYXZhTmFtZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgc2Vjb25kTmFtZSkgewotCVN0cmluZ0J1ZmZlciBuYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmaXJzdE5hbWUpOwotCW5hbWVCdWZmZXIuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzZWNvbmROYW1lLmNoYXJBdCgwKSkpOwotCWZvciAoaW50IGkgPSAxOyBpIDwgc2Vjb25kTmFtZS5sZW5ndGgoKTsgaSsrKQotCQluYW1lQnVmZmVyLmFwcGVuZChzZWNvbmROYW1lLmNoYXJBdChpKSk7Ci0JcmV0dXJuIG5hbWVCdWZmZXIudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoTGlzdCByb2xlQXR0cmlidXRlcykgewotCWlmIChjYW5Db250aW51ZSgpKSB7Ci0JCWJ1c3kgPSB0cnVlOwotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGdldFJvbGUoKS5nZXROYW1lKCk7Ci0JCUxpc3QgY29tcHV0ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNhbkNvbXB1dGVOYW1lcygpKXsKLQkJCXZpc2l0ZWRLZXlUeXBlcy5jbGVhcigpOwotCQkJcmVjb25jaWxlQXR0cmlidXRlcyhnZXRSb2xlKCksIGF0dHJpYnV0ZU5hbWUsIHJvbGVBdHRyaWJ1dGVzLCBjb21wdXRlZE5hbWVzKTsKLQkJfQotCQlyZW1vdmVFeHRyYUF0dHJpYnV0ZXMoY29tcHV0ZWROYW1lcyk7Ci0JCWJ1c3kgPSBmYWxzZTsKLQl9Ci19Ci0vKioKLSAqIGdldEZpZWxkcyBtZXRob2QgY29tbWVudC4KLSAqLwotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKTsKLS8qKgotICogUmVtb3ZlIGF0dHJpYnV0ZXMgZnJvbSBvdXIgcm9sZSB3aG9zZSBuYW1lIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YKLSAqIEBjb21wdXRlZE5hbWVzLiAgQWxzbywgcmVtb3ZlIGZyb20gdGhlIHJvbGUncyBzb3VyY2UgRUpCLgotICovCi1wcm90ZWN0ZWQgdm9pZCByZW1vdmVFeHRyYUF0dHJpYnV0ZXMoTGlzdCBjb21wdXRlZE5hbWVzKSB7Ci0JaWYgKCFnZXRSb2xlKCkuZ2V0QXR0cmlidXRlcygpLmlzRW1wdHkoKSkgewotCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBnZXRSb2xlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gZ2V0Um9sZSgpLmdldFNvdXJjZUVudGl0eSgpOwotCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29tcHV0ZWROYW1lcy5jb250YWlucyhhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkKLQkJCQljb250aW51ZTsKLQkJCWl0LnJlbW92ZSgpOwotCQkJY21wLmdldEtleUF0dHJpYnV0ZXMoKS5yZW1vdmUoYXR0cmlidXRlKTsKLQkJCWNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLnJlbW92ZShhdHRyaWJ1dGUpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMTYvMDAgOToxOToyNyBQTSkKLSAqIEBwYXJhbSBuZXdSb2xlIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuZWpiZXh0LkVqYlJlbGF0aW9uc2hpcFJvbGUKLSAqLwotcHVibGljIHZvaWQgc2V0Um9sZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUpIHsKLQlyb2xlID0gbmV3Um9sZTsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYjU3NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotCi0vKioKLSAqIERlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdW5pcXVlbHkgaWRlbnRpZmllcyBhbiBlbnRpdHkgYmVhbi4KLSAqIEBpbnZhcmlhbnQgVGhlIGNvbnRlbnQgb2YgZWFjaCByb2xlLXNvdXJjZSBlbGVtZW50IHNoYWxsIHJlZmVyIHRvIGFuIGV4aXN0aW5nIGVudGl0eSBiZWFuLCBlbnRpdHkgYmVhbiByZWZlcmVuY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU291cmNlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUm9sZVNvdXJjZSwgRU9iamVjdHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHlCZWFuID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgUm9sZVNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSb2xlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFSkJSZWxhdGlvbnNoaXBSb2xlKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUpIHsKLQkJaWYgKG5ld1JvbGUgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFICYmIG5ld1JvbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSb2xlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdSb2xlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JvbGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19TT1VSQ0UsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1JvbGUsIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRSwgbmV3Um9sZSwgbmV3Um9sZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEVudGl0eUJlYW4oKSB7Ci0JCWlmIChlbnRpdHlCZWFuICE9IG51bGwgJiYgZW50aXR5QmVhbi5lSXNQcm94eSgpKSB7Ci0JCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IG9sZEVudGl0eUJlYW4gPSBlbnRpdHlCZWFuOwotCQkJZW50aXR5QmVhbiA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllbnRpdHlCZWFuKTsKLQkJCWlmIChlbnRpdHlCZWFuICE9IG9sZEVudGl0eUJlYW4pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTiwgb2xkRW50aXR5QmVhbiwgZW50aXR5QmVhbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRpdHlCZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250YWluZXJNYW5hZ2VkRW50aXR5IGJhc2ljR2V0RW50aXR5QmVhbigpIHsKLQkJcmV0dXJuIGVudGl0eUJlYW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5QmVhbihDb250YWluZXJNYW5hZ2VkRW50aXR5IG5ld0VudGl0eUJlYW4pIHsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvbGRFbnRpdHlCZWFuID0gZW50aXR5QmVhbjsKLQkJZW50aXR5QmVhbiA9IG5ld0VudGl0eUJlYW47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0VOVElUWV9CRUFOLCBvbGRFbnRpdHlCZWFuLCBlbnRpdHlCZWFuKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRSwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRSwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fU09VUkNFLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fRU5USVRZX0JFQU46Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFbnRpdHlCZWFuKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RW50aXR5QmVhbigpOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTjoKLQkJCQlyZXR1cm4gZW50aXR5QmVhbiAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6Ci0JCQkJc2V0Um9sZSgoRUpCUmVsYXRpb25zaGlwUm9sZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTjoKLQkJCQlzZXRFbnRpdHlCZWFuKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fUk9MRToKLQkJCQlzZXRSb2xlKChFSkJSZWxhdGlvbnNoaXBSb2xlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fRU5USVRZX0JFQU46Ci0JCQkJc2V0RW50aXR5QmVhbigoQ29udGFpbmVyTWFuYWdlZEVudGl0eSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjc1N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKLQotLyoqCi0gKiBUaGUgc2Vzc2lvbiBlbGVtZW50IGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgbmFtZSBhc3NpZ25lZAotICogdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbjsgdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlOyB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzLiBUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkltcGwgZXh0ZW5kcyBFbnRlcnByaXNlQmVhbkltcGwgaW1wbGVtZW50cyBTZXNzaW9uLCBFbnRlcnByaXNlQmVhbiB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA9IFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSA9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vzc2lvblR5cGUoKSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXNzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTRVNTSU9OX1RZUEVfRURFRkFVTFQgPSBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlc3Npb25UeXBlIHNlc3Npb25UeXBlID0gU0VTU0lPTl9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2Vzc2lvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludCgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3Mgc2VydmljZUVuZHBvaW50ID0gbnVsbDsKLQotCXB1YmxpYyBTZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXNzaW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXNzaW9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotCSAqIAotCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJdHJhbnNhY3Rpb25UeXBlID0gbmV3VHJhbnNhY3Rpb25UeXBlID09IG51bGwgPyBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25UeXBlOwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OwotCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIHRyYW5zYWN0aW9uVHlwZSwgIW9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJVHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKLQkJdHJhbnNhY3Rpb25UeXBlID0gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVDsKLQkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRSwgb2xkVHJhbnNhY3Rpb25UeXBlLCBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvblR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTZXNzaW9uVHlwZSBnZXRTZXNzaW9uVHlwZSgpIHsKLQkJcmV0dXJuIHNlc3Npb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25UeXBlKFNlc3Npb25UeXBlIG5ld1Nlc3Npb25UeXBlKSB7Ci0JCVNlc3Npb25UeXBlIG9sZFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCXNlc3Npb25UeXBlID0gbmV3U2Vzc2lvblR5cGUgPT0gbnVsbCA/IFNFU1NJT05fVFlQRV9FREVGQVVMVCA6IG5ld1Nlc3Npb25UeXBlOwotCQlib29sZWFuIG9sZFNlc3Npb25UeXBlRVNldCA9IHNlc3Npb25UeXBlRVNldDsKLQkJc2Vzc2lvblR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEUsIG9sZFNlc3Npb25UeXBlLCBzZXNzaW9uVHlwZSwgIW9sZFNlc3Npb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2Vzc2lvblR5cGUoKSB7Ci0JCVNlc3Npb25UeXBlIG9sZFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCWJvb2xlYW4gb2xkU2Vzc2lvblR5cGVFU2V0ID0gc2Vzc2lvblR5cGVFU2V0OwotCQlzZXNzaW9uVHlwZSA9IFNFU1NJT05fVFlQRV9FREVGQVVMVDsKLQkJc2Vzc2lvblR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEUsIG9sZFNlc3Npb25UeXBlLCBTRVNTSU9OX1RZUEVfRURFRkFVTFQsIG9sZFNlc3Npb25UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2Vzc2lvblR5cGUoKSB7Ci0JCXJldHVybiBzZXNzaW9uVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCAmJiBzZXJ2aWNlRW5kcG9pbnQuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZFNlcnZpY2VFbmRwb2ludCA9IHNlcnZpY2VFbmRwb2ludDsKLQkJCXNlcnZpY2VFbmRwb2ludCA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VFbmRwb2ludCk7Ci0JCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG9sZFNlcnZpY2VFbmRwb2ludCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBzZXJ2aWNlRW5kcG9pbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50KEphdmFDbGFzcyBuZXdTZXJ2aWNlRW5kcG9pbnQpIHsKLQkJSmF2YUNsYXNzIG9sZFNlcnZpY2VFbmRwb2ludCA9IHNlcnZpY2VFbmRwb2ludDsKLQkJc2VydmljZUVuZHBvaW50ID0gbmV3U2VydmljZUVuZHBvaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fX1NFUlZJQ0VfRU5EUE9JTlQsIG9sZFNlcnZpY2VFbmRwb2ludCwgc2VydmljZUVuZHBvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VKQl9KQVI6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRWpiUGFja2FnZS5TRVNTSU9OX19FSkJfSkFSLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19JQ09OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19FSkJfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVJWSUNFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VKQl9KQVI6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRWpiUGFja2FnZS5TRVNTSU9OX19FSkJfSkFSLCBtc2dzKTsKLQkJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJCXJldHVybiBiYXNpY1NldFNlY3VyaXR5SWRlbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19FSkJfSkFSOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlMsIEVKQkphci5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYlJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRUpCX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RWpiQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFamJDbGFzcygpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0hPTUVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0SG9tZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEhvbWVJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19SRU1PVEVfSU5URVJGQUNFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UmVtb3RlSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VDVVJJVFlfSURFTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19MT0NBTF9IT01FX0lOVEVSRkFDRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldExvY2FsSG9tZUludGVyZmFjZSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0xPQ0FMX0lOVEVSRkFDRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldExvY2FsSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TG9jYWxJbnRlcmZhY2UoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFNlc3Npb25UeXBlKCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VSVklDRV9FTkRQT0lOVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludCgpOwotCQkJCXJldHVybiBiYXNpY0dldFNlcnZpY2VFbmRwb2ludCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGVudmlyb25tZW50UHJvcGVydGllcyAhPSBudWxsICYmICFlbnZpcm9ubWVudFByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VKQl9SRUZTOgotCQkJCXJldHVybiBlamJSZWZzICE9IG51bGwgJiYgIWVqYlJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiByZXNvdXJjZUVudlJlZnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VFbnZSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZWpiTG9jYWxSZWZzICE9IG51bGwgJiYgIWVqYkxvY2FsUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gc2VydmljZVJlZnMgIT0gbnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRUpCX0NMQVNTOgotCQkJCXJldHVybiBlamJDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0hPTUVfSU5URVJGQUNFOgotCQkJCXJldHVybiBob21lSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gcmVtb3RlSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRUpCX0pBUjoKLQkJCQlyZXR1cm4gZ2V0RWpiSmFyKCkgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlyZXR1cm4gc2VjdXJpdHlJZGVudGl0eSAhPSBudWxsOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0xPQ0FMX0hPTUVfSU5URVJGQUNFOgotCQkJCXJldHVybiBsb2NhbEhvbWVJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGxvY2FsSW50ZXJmYWNlICE9IG51bGw7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0U2Vzc2lvblR5cGUoKTsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVJWSUNFX0VORFBPSU5UOgotCQkJCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCWdldEVudmlyb25tZW50UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VKQl9DTEFTUzoKLQkJCQlzZXRFamJDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0SG9tZUludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fUkVNT1RFX0lOVEVSRkFDRToKLQkJCQlzZXRSZW1vdGVJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VKQl9KQVI6Ci0JCQkJc2V0RWpiSmFyKChFSkJKYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fTE9DQUxfSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxIb21lSW50ZXJmYWNlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19MT0NBTF9JTlRFUkZBQ0U6Ci0JCQkJc2V0TG9jYWxJbnRlcmZhY2UoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJc2V0VHJhbnNhY3Rpb25UeXBlKChUcmFuc2FjdGlvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRVNTSU9OX1RZUEU6Ci0JCQkJc2V0U2Vzc2lvblR5cGUoKFNlc3Npb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VSVklDRV9FTkRQT0lOVDoKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnQoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX0VKQl9SRUZTOgotCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19FSkJfQ0xBU1M6Ci0JCQkJc2V0RWpiQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fSE9NRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0SG9tZUludGVyZmFjZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19SRU1PVEVfSU5URVJGQUNFOgotCQkJCXNldFJlbW90ZUludGVyZmFjZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19FSkJfSkFSOgotCQkJCXNldEVqYkphcigoRUpCSmFyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19TRUNVUklUWV9JREVOVElUWToKLQkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19MT0NBTF9IT01FX0lOVEVSRkFDRToKLQkJCQlzZXRMb2NhbEhvbWVJbnRlcmZhY2UoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fTE9DQUxfSU5URVJGQUNFOgotCQkJCXNldExvY2FsSW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJdW5zZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VTU0lPTl9UWVBFOgotCQkJCXVuc2V0U2Vzc2lvblR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fU0VSVklDRV9FTkRQT0lOVDoKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnQoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRyYW5zYWN0aW9uVHlwZTogIik7Ci0JCWlmICh0cmFuc2FjdGlvblR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25UeXBlOiAiKTsKLQkJaWYgKHNlc3Npb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZChzZXNzaW9uVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuU2Vzc2lvbiNzZXRTZXJ2aWNlRW5kcG9pbnROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50TmFtZShTdHJpbmcgc2VydmljZUVuZHBvaW50TmFtZSkgewotICAgICAgICBlU2V0KEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldFNlc3Npb25fU2VydmljZUVuZHBvaW50KCksIGNyZWF0ZUNsYXNzUmVmKHNlcnZpY2VFbmRwb2ludE5hbWUpKTsKLSAgICB9Ci0JLyoKLQkgKiBAc2VlIEVudGVycHJpc2VCZWFuI2hhc0xvY2FsQ2xpZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0JCXJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnQoKSAhPSBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludE5hbWUoKSB7Ci0JCWdldFNlcnZpY2VFbmRwb2ludCgpOwotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50ID09IG51bGwgPyBudWxsIDogc2VydmljZUVuZHBvaW50LmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9TdXBlcnR5cGVDTVBBdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3N2NkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9TdXBlcnR5cGVDTVBBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlcjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMjgvMjAwMCA2OjU0OjI2IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyTWFuYWdlZEVudGl0eUZpbHRlciB7Ci0vKioKLSAqIFN1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIGZpbHRlciBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIExpc3QgZmlsdGVyKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBzdXBlcnR5cGUgPSBudWxsOwotCUVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBleHRlbnNpb25IZWxwZXIgPSBnZXRFamJNb2R1bGVFeHRIZWxwZXIoY21wKTsKLQlpZihleHRlbnNpb25IZWxwZXIgIT0gbnVsbCkKLQkgICBzdXBlcnR5cGUgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSlleHRlbnNpb25IZWxwZXIuZ2V0U3VwZXJUeXBlKGNtcCk7Ci0JaWYgKHN1cGVydHlwZSA9PSBudWxsKQotCQlyZXR1cm4gZ2V0U291cmNlQXR0cmlidXRlcyhjbXApOwotCXJldHVybiBmaWx0ZXJVc2luZ1N1cGVydHlwZShjbXAsIHN1cGVydHlwZSk7Ci19Ci0vKioKLSAqIGZpbHRlciBtZXRob2QgY29tbWVudC4KLSAqLwotcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGZpbHRlclVzaW5nU3VwZXJ0eXBlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wLCBDb250YWluZXJNYW5hZ2VkRW50aXR5IHN1cGVydHlwZSkgewotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJFbnRpdHkgPSBzdXBlcnR5cGU7Ci0JTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JSXRlcmF0b3IgaXQgPSBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCkuaXRlcmF0b3IoKTsKLQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlOwotCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQlpZiAoIWlzU3VwZXJ0eXBlQXR0cmlidXRlKHN1cGVyRW50aXR5LCBhdHRyaWJ1dGUpKQotCQkJcmVzdWx0LmFkZChhdHRyaWJ1dGUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIGF0dHJpYnV0ZXMgZnJvbSBjbXBFeHQuCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdCBnZXRTb3VyY2VBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSA7Ci0vKioKLSAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFuQXR0cmlidXRlIGFsc28gZXhpc3RzIGluIHRoZSBzdXBlckVudGl0eS4KLSAqLwotcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNTdXBlcnR5cGVBdHRyaWJ1dGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBzdXBlckVudGl0eSwgQ01QQXR0cmlidXRlIGFuQXR0cmlidXRlKSA7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NNUEZpZWxkRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QRmllbGREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNGFlOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QRmllbGREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogQSBwYXJhbWV0ZXIgZGVzY3JpcHRvciBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgbWV0aG9kIHBhcmFtZXRlci4KLSAqIEl0IGhvbGRzIHRoZSBwYXJhbWV0ZXIgbmFtZSBhbmQgdHlwZS4gIFRoZSB0eXBlIGlzIGhlbGQgaW4KLSAqIEphdmEgcmVhZGFibGUgZm9ybSAobm90IGEgc2lnbmF0dXJlKS4KLSAqLwotcHVibGljIGNsYXNzIENNUEZpZWxkRGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZOYW1lID0gbnVsbDsKLS8qKgotICogSmF2YVBhcmFtZXRlckRlc2NyaXB0b3IgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAqLwotcHVibGljIENNUEZpZWxkRGVzY3JpcHRvcigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgbmFtZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCXJldHVybiBmTmFtZTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUuCi0gKiBAcmV0dXJuIFRoZSBwYXJhbWV0ZXIgdHlwZSBpbiBKYXZhIHJlYWRhYmxlIGZvcm0gKG5vdCBhIHNpZ25hdHVyZSkKLSAqLwotcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCXJldHVybiBmVHlwZTsKLX0KLS8qKgotICogU2V0cyB0aGUgcGFyYW1ldGVyIG5hbWUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQlmTmFtZSA9IChuZXdOYW1lID09IG51bGwpID8gbnVsbCA6IG5ld05hbWUudHJpbSgpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBwYXJhbWV0ZXIgdHlwZS4KLSAqIEBwYXJhbSBuZXdUeXBlIFRoZSBwYXJhbWV0ZXIgbmFtZSBpbiBKYXZhIHJlYWRhYmxlIGZvcm0gKG5vdCBhIHNpZ25hdHVyZSkKLSAqLwotcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCWZUeXBlID0gKG5ld1R5cGUgPT0gbnVsbCkgPyBudWxsIDogbmV3VHlwZS50cmltKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgInR5cGUgbmFtZSIuICBUaGUge0BsaW5rIEphdmFQYXJhbWV0ZXJEZXNjcmlwdG9yI2dldFR5cGUoKX0KLSAqIGFuZCB7QGxpbmsgSmF2YVBhcmFtZXRlckRlc2NyaXB0b3IjZ2V0TmFtZSgpfSBtZXRob2RzIGFyZSB1c2VkCi0gKiB0byBidWlsZCB0aGUgcmVzdWx0LgotICovCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQlzYi5hcHBlbmQoZ2V0VHlwZSgpKTsKLQlzYi5hcHBlbmQoJyAnKTsKLQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzODIyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgQ01QSGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVQgPSAiZ2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wYXJhdG9yIG1ldGhvZENvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJLyoqCi0JCSAqIEBzZWUgQ29tcGFyYXRvciNjb21wYXJlKE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlNZXRob2QgbTEgPSAoTWV0aG9kKSBvMTsKLQkJCU1ldGhvZCBtMiA9IChNZXRob2QpIG8yOwotCQkJU3RyaW5nIHMxID0gbTEuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHMyID0gbTIuZ2V0TmFtZSgpOwotCQkJaWYgKHMxID09IG51bGwpCi0JCQkJcmV0dXJuICIiLmNvbXBhcmVUbyhzMik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBzMS5jb21wYXJlVG8oczIpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENNUEZpZWxkRXhpc3RUZXN0ZXIgewotCQlib29sZWFuIGlzRXhpc3RpbmcoRmllbGQgYUZpZWxkKTsKLQkJYm9vbGVhbiBpc0V4aXN0aW5nKE1ldGhvZCBhTWV0aG9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01QSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDIuMCBiZWFucywgdGhlIGJlYW4gY2xhc3MgaXMgYWJzdHJhY3QgYW5kCi0JICogY29udGFpbnMgYWJzdHJhY3QgZ2V0L3NldCBtZXRob2RzIGZvciB0aGUgZmllbGRzCi0JICogVGhpcyBpbmZlcnMgdGhlIHRob3NlIGZpZWxkcyBiYXNlZCBvbiB0aGUgZ2V0L3NldCBtZXRob2RzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiB7QGxpbmsgQ01QRmllbGREZXNjcmlwdG9yfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdmFpbGFibGVDTVAyMEZpZWxkRGVzY3JpcHRvcnMoSmF2YUNsYXNzIGJlYW5DbGFzcykgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ01QMjBGaWVsZERlc2NyaXB0b3JzKGJlYW5DbGFzcywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEZvciBDTVAgMi4wIGJlYW5zLCB0aGUgYmVhbiBjbGFzcyBpcyBhYnN0cmFjdCBhbmQKLQkgKiBjb250YWlucyBhYnN0cmFjdCBnZXQvc2V0IG1ldGhvZHMgZm9yIHRoZSBmaWVsZHMKLQkgKiBUaGlzIGluZmVycyB0aGUgdGhvc2UgZmllbGRzIGJhc2VkIG9uIHRoZSBnZXQvc2V0IG1ldGhvZHMKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIHtAbGluayBDTVBGaWVsZERlc2NyaXB0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUNNUDIwRmllbGREZXNjcmlwdG9ycyhKYXZhQ2xhc3MgYmVhbkNsYXNzLCBDTVBIZWxwZXIuQ01QRmllbGRFeGlzdFRlc3RlciBmaWVsZFRlc3RlcikgewotCQlpZiAoYmVhbkNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBnZXR0ZXJzID0gbmV3IEhhc2hNYXAoKTsJCi0JCUxpc3QgbWV0aG9kcyA9IGJlYW5DbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChtZXRob2RzLCBtZXRob2RDb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgYU1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKGlzR2V0dGVyKGFNZXRob2QpICYmIGFNZXRob2QuaXNBYnN0cmFjdCgpICYmICFhTWV0aG9kLmlzU3RhdGljKCkgJiYgCi0JCQkJKGZpZWxkVGVzdGVyID09IG51bGwgfHwgZmllbGRUZXN0ZXIuaXNFeGlzdGluZyhhTWV0aG9kKSkpIAotCQkJCWdldHRlcnMucHV0KGdldEZpZWxkTmFtZShhTWV0aG9kKSwgYU1ldGhvZCk7Ci0JCQllbHNlIGlmIChpc1NldHRlcihhTWV0aG9kKSAmJiBhTWV0aG9kLmlzQWJzdHJhY3QoKSAmJiAhYU1ldGhvZC5pc1N0YXRpYygpKSB7Ci0JCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShhTWV0aG9kKTsKLQkJCQlNZXRob2QgZ2V0dGVyID0gKE1ldGhvZCkgZ2V0dGVycy5nZXQoZmllbGROYW1lKTsKLQkJCQlpZiAodHlwZXNBZ3JlZShnZXR0ZXIsIGFNZXRob2QpKSB7Ci0JCQkJCVN0cmluZyB0eXBlTmFtZSA9IGdldFJldHVyblR5cGVOYW1lKGdldHRlcik7Ci0JCQkJCWlmICh0eXBlTmFtZSAhPSBudWxsICYmIChmaWVsZFRlc3RlciA9PSBudWxsIHx8IGZpZWxkVGVzdGVyLmlzRXhpc3RpbmcoZ2V0dGVyKSkpCi0JCQkJCQlyZXN1bHQuYWRkKGNyZWF0ZUZpZWxkRGVzY3JpcHRvcihmaWVsZE5hbWUsIHR5cGVOYW1lKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDEuMSBiZWFucywgdGhlIGxpc3QgaXMgc2ltcGx5IHRoZSBmaWVsZHMsIGV4dGVuZGVkLCAKLQkgKiBvbiB0aGUgYmVhbiBjbGFzcwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2Yge0BsaW5rIENNUEZpZWxkRGVzY3JpcHRvcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlQ01QMTFGaWVsZERlc2NyaXB0b3JzKEphdmFDbGFzcyBiZWFuQ2xhc3MpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDExRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgQ01QIDEuMSBiZWFucywgdGhlIGxpc3QgaXMgc2ltcGx5IHRoZSBmaWVsZHMsIGV4dGVuZGVkLCAKLQkgKiBvbiB0aGUgYmVhbiBjbGFzcwotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2Yge0BsaW5rIENNUEZpZWxkRGVzY3JpcHRvcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXZhaWxhYmxlQ01QMTFGaWVsZERlc2NyaXB0b3JzKEphdmFDbGFzcyBiZWFuQ2xhc3MsIENNUEhlbHBlci5DTVBGaWVsZEV4aXN0VGVzdGVyIGZpZWxkVGVzdGVyKSB7Ci0JCWlmIChiZWFuQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGZpZWxkcyA9IGJlYW5DbGFzcy5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpZWxkIGFGaWVsZCA9IChGaWVsZCkgZmllbGRzLmdldChpKTsKLQkJCWlmICghaXNQdWJsaWMoYUZpZWxkKSB8fCBhRmllbGQuaXNTdGF0aWMoKSB8fCBhRmllbGQuaXNUcmFuc2llbnQoKSB8fAotCQkJKGZpZWxkVGVzdGVyICE9IG51bGwgJiYgIWZpZWxkVGVzdGVyLmlzRXhpc3RpbmcoYUZpZWxkKSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbmFtZSA9IGFGaWVsZC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZShhRmllbGQpOwotCQkJaWYgKHR5cGVOYW1lICE9IG51bGwgJiYgbmFtZSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGQoY3JlYXRlRmllbGREZXNjcmlwdG9yKG5hbWUsIHR5cGVOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CQotCQotCS8qKgotCSAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNtcCBmaWVsZHMgZm9yIHRoZSBDTVAgYmVhbjsgaWYgdGhlIGJlYW4KLQkgKiBpcyB2MS4xLCB0aGlzIGlzIHRoZSBmaWVsZHMgb24gdGhlIGJlYW4gY2xhc3M7IGlmIGl0IGlzIDIuMCwgdGhpcyAKLQkgKiBpcyBkZWZpbmVkIGJ5IHRoZSBhYnN0cmFjdCBnZXQvc2V0IG1ldGhvZHMgb24gdGhlIGJlYW4gY2xhc3MKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIHtAbGluayBDTVBGaWVsZERlc2NyaXB0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUNNUEZpZWxkRGVzY3JpcHRvcnMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXBCZWFuKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDTVBGaWVsZERlc2NyaXB0b3JzKGNtcEJlYW4sIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjbXAgZmllbGRzIGZvciB0aGUgQ01QIGJlYW47IGlmIHRoZSBiZWFuCi0JICogaXMgdjEuMSwgdGhpcyBpcyB0aGUgZmllbGRzIG9uIHRoZSBiZWFuIGNsYXNzOyBpZiBpdCBpcyAyLjAsIHRoaXMgCi0JICogaXMgZGVmaW5lZCBieSB0aGUgYWJzdHJhY3QgZ2V0L3NldCBtZXRob2RzIG9uIHRoZSBiZWFuIGNsYXNzCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdCBvZiB7QGxpbmsgQ01QRmllbGREZXNjcmlwdG9yfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdmFpbGFibGVDTVBGaWVsZERlc2NyaXB0b3JzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wQmVhbiwgQ01QSGVscGVyLkNNUEZpZWxkRXhpc3RUZXN0ZXIgZmllbGRUZXN0ZXIpIHsKLQkJSmF2YUNsYXNzIGJlYW5DbGFzcyA9IGNtcEJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJaWYgKGJlYW5DbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXN3aXRjaChjbXBCZWFuLmdldFZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDExRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIGZpZWxkVGVzdGVyKTsgCi0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ6IGRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUNNUDIwRmllbGREZXNjcmlwdG9ycyhiZWFuQ2xhc3MsIGZpZWxkVGVzdGVyKTsgCi0JCX0gIAotCX0KLQkKLQkvKioKLQkgKiBEb2VzIHRoZSBtZXRob2QgbmFtZSBzdGFydCB3aXRoICJnZXQiLCBhbmQgaXMgdGhlIG1ldGhvZCBhIHplcm8gYXJnCi0JICogbWV0aG9kLCB0aGF0IGRvZXMgbm90IHJldHVybiB2b2lkPwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0dldHRlcihNZXRob2QgYU1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IGFNZXRob2QuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZSAhPSBudWxsICYmCi0JCQluYW1lLnN0YXJ0c1dpdGgoR0VUKSAmJgotCQkJbmFtZS5sZW5ndGgoKSA+IDMgJiYKLQkJCWFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoPT0wICYmCi0JCQkhYU1ldGhvZC5pc1ZvaWQoKTsJCQotCX0KLQkKLQkKLQkvKioKLQkgKiBEb2VzIHRoZSBtZXRob2QgbmFtZSBzdGFydCB3aXRoICJnZXQiLCBhbmQgaXMgdGhlIG1ldGhvZCBhIG9uZSBhcmcKLQkgKiBtZXRob2QsIHRoYXQgaXMgdm9pZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1NldHRlcihNZXRob2QgYU1ldGhvZCkgewotCQlTdHJpbmcgbmFtZSA9IGFNZXRob2QuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZSAhPSBudWxsICYmCi0JCQluYW1lLnN0YXJ0c1dpdGgoU0VUKSAmJgotCQkJbmFtZS5sZW5ndGgoKSA+IDMgJiYKLQkJCWFNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID09IDEgJiYKLQkJCWFNZXRob2QuaXNWb2lkKCk7Ci0JfQotCQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RmllbGROYW1lKE1ldGhvZCBhTWV0aG9kKSB7Ci0JCWlmIChhTWV0aG9kID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlyZXR1cm4gZ2V0RmllbGROYW1lKGFNZXRob2QuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmllbGROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCWlmIChtZXRob2ROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihtZXRob2ROYW1lKTsKLQkJc2IuZGVsZXRlKDAsIDMpOwotCQljaGFyIGxvd2VyID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNiLmNoYXJBdCgwKSk7Ci0JCXNiLnNldENoYXJBdCgwLCBsb3dlcik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRSZXR1cm5UeXBlTmFtZShNZXRob2QgZ2V0dGVyKSB7Ci0JCWlmIChnZXR0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlKYXZhSGVscGVycyByZXRUeXBlID0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsKLQkJcmV0dXJuIGdldFR5cGVOYW1lKHJldFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShGaWVsZCBhRmllbGQpIHsKLQkJaWYgKGFGaWVsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUphdmFIZWxwZXJzIHR5cGUgPSAoSmF2YUhlbHBlcnMpYUZpZWxkLmdldEVUeXBlKCk7Ci0JCXJldHVybiBnZXRUeXBlTmFtZSh0eXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoSmF2YUhlbHBlcnMgaGVscGVycykgewotCQlpZiAoaGVscGVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBoZWxwZXJzLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogUHJlY29uZGl0aW9uOiBzZXR0ZXIgbXVzdCB0YWtlIG9uZSBwYXJhbWV0ZXIsIGFuZCBnZXR0ZXIgbXVzdCByZXR1cm4KLQkgKiBhIHR5cGUsIG5vdCB2b2lkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHR5cGVzQWdyZWUoTWV0aG9kIGdldHRlciwgTWV0aG9kIHNldHRlcikgewotCQlpZiAoZ2V0dGVyID09IG51bGwgfHwgZ2V0dGVyLmlzVm9pZCgpIHx8IHNldHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCUphdmFQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gc2V0dGVyLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQlpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlKYXZhUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1ldGVyc1swXTsKLQkJcmV0dXJuIHBhcmFtLmdldEVUeXBlKCkgIT0gbnVsbCAmJgotCQkJCXBhcmFtLmdldEVUeXBlKCkgPT0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsJCQkJCQkJCi0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgQ01QRmllbGREZXNjcmlwdG9yIGNyZWF0ZUZpZWxkRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUNNUEZpZWxkRGVzY3JpcHRvciBkZXNjID0gbmV3IENNUEZpZWxkRGVzY3JpcHRvcigpOwotCQlkZXNjLnNldE5hbWUobmFtZSk7Ci0JCWRlc2Muc2V0VHlwZSh0eXBlTmFtZSk7Ci0JCXJldHVybiBkZXNjOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNQdWJsaWMoRmllbGQgZmllbGQpIHsKLQkJaWYgKGZpZWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMLmdldFZhbHVlKCkgPT0gZmllbGQuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCQotCQkKLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDg0YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDI0LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX1RZUEUgPSBDTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLmNsYXNzLmdldE5hbWUoKTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkID0gdHJ1ZTsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIENNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jbXAgPSBjbXA7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGtleUF0dHJpYnV0ZXMgbGlzdCBpcyBlbXB0eSwgdHJ5IHRvIHJlZmxlY3QKLQkgKiB0aGUga2V5QXR0cmlidXRlcyBmcm9tIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnlLZXkgY2xhc3MuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUtleUF0dHJpYnV0ZXMoKSB7Ci0JICAgIGlmKGNtcCA9PSBudWxsIHx8IGluaXRpYWxpemVkKQotCSAgICAgICAgcmV0dXJuOwotCSAgICAKLQkgICAgUmVzb3VyY2UgcmVzID0gY21wLmVSZXNvdXJjZSgpOwotCSAgICBpZihyZXMgPT0gbnVsbCkKLQkgICAgICAgIHJldHVybjsKLQkgICAgCi0JICAgIGJvb2xlYW4gY2FjaGVkSXNNb2RpZmllZCA9IHJlcy5pc01vZGlmaWVkKCk7IAotCi0JICAgIHRyeSB7Ci0JCQkvLyBIYW5kbGUgcHJpbWtleWZpZWxkIHNjZW5hcmlvCi0JCQlpZiAoY21wLmdldFByaW1LZXlGaWVsZCgpIT1udWxsKQotCQkJCWluaXRpYWxpemVGb3JQcmltS2V5KCk7Ci0JCQkKLQkJCS8vIEhhbmRsZSBjb21wb3VuZCBrZXkgc2NlbmFyaW8KLQkJCWVsc2UgCi0JCQkJaW5pdGlhbGl6ZUZvckNvbXBvdW5kS2V5KCk7Ci0JICAgIH0gZmluYWxseSB7Ci0JICAgICAgICByZXMuc2V0TW9kaWZpZWQoY2FjaGVkSXNNb2RpZmllZCk7Ci0JICAgIH0KLQotICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGb3JQcmltS2V5KCkgeyAKLQkJLy8gRW5zdXJlIHRoZSBrZXkgYXR0cmlidXRlcyBsaXN0IGNvbnRhaW5zIG9ubHkgdGhlIHByaW1LZXlGaWVsZCBhdHRyaWJ1dGUKLQkJaWYgKCEoZ2V0S2V5QXR0cmlidXRlcygpLnNpemUoKT09MSAmJiBnZXRLZXlBdHRyaWJ1dGVzKCkuY29udGFpbnMoY21wLmdldFByaW1LZXlGaWVsZCgpKSkpCi0JCQlwcmltS2V5RmllbGRDaGFuZ2VkKGNtcC5nZXRQcmltS2V5RmllbGQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGb3JDb21wb3VuZEtleSgpIHsgCi0JCUxpc3Qga2V5cyA9IGdldEtleUF0dHJpYnV0ZXMoKTsKLQkJLy8gY2xlYXIga2V5IGxpc3QKLQkJa2V5cy5jbGVhcigpOwotCQkvL2Vuc3VyZSB0aGUga2V5IGNsYXNzIGlzIG5vdCBudWxsCi0JCUphdmFDbGFzcyBrZXlDbGFzcyA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JCWlmIChrZXlDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlrZXlDbGFzcy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQotCQkvLyByZWZsZWN0IGtleSBmaWVsZHMgaW50byBrZXkgYXR0cmlidXRlcyBsaXN0Ci0JCUxpc3Qga2V5RmllbGRzID0ga2V5Q2xhc3MuZ2V0RmllbGRzRXh0ZW5kZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlGaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpZWxkIGZpZWxkID0gKEZpZWxkKSBrZXlGaWVsZHMuZ2V0KGkpOwotCQkJaWYgKGZpZWxkLmdldEphdmFWaXNpYmlsaXR5KCkgPT0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKSB7IC8vb25seSBwdWJsaWMgZmllbGRzCi0JCQkJQ01QQXR0cmlidXRlIGtleUF0dHJpYnV0ZSA9IGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKGZpZWxkLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGtleUF0dHJpYnV0ZSAhPSBudWxsKQotCQkJCQlrZXlzLmFkZChrZXlBdHRyaWJ1dGUpOwotCQkJfQkKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKGlzVXBkYXRpbmcgfHwgIWlzRW5hYmxlZCkgcmV0dXJuOyAvL3dlIGRvbid0IHdhbnQgdG8gcmVhY3QgdG8gb3VyIG93biBjaGFuZ2VzCi0JCXRyeSB7Ci0JCQlpc1VwZGF0aW5nID0gdHJ1ZTsKLQkJCUVDbGFzcyBmZWF0dXJlQ2xhc3MgPSAoKEVPYmplY3Qpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLmVDbGFzcygpOwotCQkJaWYgKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5lcXVhbHMoZmVhdHVyZUNsYXNzKSkgewkJCQotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzKSkgewotCQkJCQkvLyBoYW5kbGUgaWYgY21wIGF0dHJpYnV0ZSBpcyB1cGRhdGVkLCBhZGRlZCwgcmVtb3ZlZAotCQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QRVJTSVNURU5UX0FUVFJJQlVURVMgOiB7Ci0JCQkJCQloYW5kbGVDTVBBdHRyaWJ1dGVFdmVudChub3RpZmljYXRpb24pOwotCQkJCQkJYnJlYWs7CQotCQkJCQl9Ci0JCQkJCS8vIGhhbmRsZSB0aGUga2V5IGF0dHJpYnV0ZXMgbGlzdCBpcyB1cGRhdGVkIHByb2dyYW1hdGljYWxseQotCQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19LRVlfQVRUUklCVVRFUyA6IHsKLQkJCQkJCWhhbmRsZUNNUEF0dHJpYnV0ZUV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JCQkJCQlicmVhazsJCi0JCQkJCX0JCi0JCQkJCS8vIGhhbmRsZSBpZiB0aGUga2V5IGNsYXNzIGlzIGNoYW5nZWQsYWRkZWQsIHJlbW92ZWQKLQkJCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUFJJTUFSWV9LRVkgOiB7Ci0JCQkJCQloYW5kbGVLZXlDbGFzc0V2ZW50KG5vdGlmaWNhdGlvbik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkvLyBoYW5kbGUgcHJpbSBrZXkgZmllbGQgc2V0cywgYWRkcywgcmVtb3ZlcwotCQkJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QUklNX0tFWV9GSUVMRCA6IHsKLQkJCQkJCWhhbmRsZVByaW1LZXlGaWVsZEV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q01QQXR0cmlidXRlKCkuZXF1YWxzKGZlYXR1cmVDbGFzcykpIHsKLQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ01QQXR0cmlidXRlLmNsYXNzKSkgewotCQkJCQkvLyBoYW5kbGUgYSBzZXQgb3IgY2hhbmdlIG9mIGFuIGF0dHJpYnV0ZSBuYW1lCi0JCQkJCWNhc2UgKEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fTkFNRSkgOiB7Ci0JCQkJCQloYW5kbGVDTVBBdHRyaWJ1dGVSZW5hbWVFdmVudCgoQ01QQXR0cmlidXRlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlicmVhazsJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7IAotCQkJLy8gcmVzdG9yZSBpbml0aWFsIG5vdGlmaWNhdGlvbiBzdGF0ZQotCQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNNUEF0dHJpYnV0ZVJlbmFtZUV2ZW50KENNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIE9iamVjdCBvbGRWYWx1ZSkgewotCQkvLyBpZiByZW5hbWVkIGF0dHJpYnV0ZSB3YXMgaW4ga2V5IGFuZCBpcyBub3QgYW55bW9yZSwgcmVtb3ZlIGl0IGZyb20ga2V5IGxpc3QKLQkJaWYgKGdldEtleUF0dHJpYnV0ZXMoKS5jb250YWlucyhhdHRyaWJ1dGUpKSB7Ci0JCQlpZiAoIWlzQXR0cmlidXRlS2V5Q2xhc3NGaWVsZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkKLQkJCQlyZW1vdmVLZXlBdHRyaWJ1dGUoYXR0cmlidXRlLChTdHJpbmcpb2xkVmFsdWUpOwotCQl9Ci0JCS8vIGlmIHJlbmFtZWQgYXR0cmlidXRlIGlzIG5vdyBwYXJ0IG9mIHRoZSBrZXksIGFkZCBpdCB0byB0aGUga2V5IGxpc3QJCQotCQllbHNlCi0JCQlhdHRyaWJ1dGVBZGRlZChhdHRyaWJ1dGUpOwkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVByaW1LZXlGaWVsZEV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJRU9iamVjdCBuZXdQcmltS2V5RmllbGQgPSAoRU9iamVjdClub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJY21wLnNldFByaW1LZXlGaWVsZCgoQ01QQXR0cmlidXRlKW5ld1ByaW1LZXlGaWVsZCk7Ci0JCS8vIGlmIHByaW1LZXlGaWVsZCBpcyByZW1vdmVkIG9yIGEgcHJveHksIHJlY29tcHV0ZSBrZXkgYXR0cmlidXRlcyBiYXNlZCBvbiBrZXkgY2xhc3MKLQkJaWYgKG5ld1ByaW1LZXlGaWVsZCA9PSBudWxsIHx8IG5ld1ByaW1LZXlGaWVsZC5lSXNQcm94eSgpKSB7Ci0JCQlDTVBBdHRyaWJ1dGUgcHJpbUZpZWxkID0gKENNUEF0dHJpYnV0ZSluZXdQcmltS2V5RmllbGQ7Ci0JCQlpZiAocHJpbUZpZWxkIT1udWxsICYmIHByaW1GaWVsZC5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCXByaW1GaWVsZC5zZXROYW1lKCgoSW50ZXJuYWxFT2JqZWN0KXByaW1GaWVsZCkuZVByb3h5VVJJKCkudG9TdHJpbmcoKSk7Ci0JCQkJbWFrZVByaW1LZXlGaWVsZFByb3h5KHByaW1GaWVsZC5nZXROYW1lKCkpOwotCQkJfQotCQkJcmVtb3ZlQWxsS2V5QXR0cmlidXRlcygpOwotCQkJaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkJCWluaXRpYWxpemVLZXlBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJLy8gRW5zdXJlIHRoZSBrZXkgYXR0cmlidXRlcyBsaXN0IGNvbnRhaW5zIG9ubHkgdGhlIHByaW1LZXlGaWVsZCBhdHRyaWJ1dGUKLQkJZWxzZSBpZiAoIShnZXRLZXlBdHRyaWJ1dGVzKCkuc2l6ZSgpPT0xICYmIGdldEtleUF0dHJpYnV0ZXMoKS5jb250YWlucyhuZXdQcmltS2V5RmllbGQpKSkgewotCQkJcHJpbUtleUZpZWxkQ2hhbmdlZChuZXdQcmltS2V5RmllbGQpOwotCQl9CQkKLQkJCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlS2V5Q2xhc3NFdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIGlmIHByaW1rZXkgbnVsbCBvciBwcm94eSwgY2xlYXIga2V5IGZpZWxkcyBhbmQgcmVpbml0aWFsaXplIGlmIGtleSBjbGFzcyBub3QgbnVsbAotCQlpZiAoY21wLmdldFByaW1LZXlGaWVsZCgpPT1udWxsIHx8IGNtcC5nZXRQcmltS2V5RmllbGQoKS5lSXNQcm94eSgpKSB7Ci0JCQlrZXlDbGFzc0NoYW5nZWQoKTsKLQkJfQotCQkvLyBpZiBwcmlta2V5IGlzIG5vdCBudWxsLCB0aGVuIGRvIG5vdGhpbmcKLQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDTVBBdHRyaWJ1dGVFdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCS8vIGhhbmRsZSBhIENNUEF0dHJpYnV0ZSBhZGRlZAotCQkgaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQUREKSB7Ci0JCQkgYXR0cmlidXRlQWRkZWQoKENNUEF0dHJpYnV0ZSlub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSk7Ci0JCSB9Ci0JCSAvLyBoYW5kbGUgYSBDTVBBdHRyaWJ1dGUgcmVtb3ZlZAotCQkgZWxzZSBpZiAoZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkUpIHsKLQkJIAlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSlub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCS8vIHJlbW92ZSB0aGlzIGFkYXB0ZXIgZnJvbSB0aGUgZGVsZXRlZCBhdHRyaWJ1dGUKLQkJCWF0dHJpYnV0ZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQlyZW1vdmVLZXlBdHRyaWJ1dGUoYXR0cmlidXRlLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQotCQkgfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUtleUF0dHJpYnV0ZShDTVBBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgb2xkTmFtZSkgewotCQkKLQkJLy8gaWYgYXR0cmlidXRlIHdhcyBhIGtleSBhdHRyaWJ1dGUgaXQgd2lsbCBiZSByZW1vdmVkLCBvdGhlcndpc2UgZG8gbm90aGluZwotCQlnZXRLZXlBdHRyaWJ1dGVzKCkucmVtb3ZlKGF0dHJpYnV0ZSk7Ci0JCQotCQkvLyBpZiBpdCBpcyB0aGUgcHJpbSBrZXkgYXR0cmlidXRlLCB0aGVuIG1ha2UgdGhlIHByaW0ga2V5IGF0dHJpYnV0ZSBhIHByb3h5Ci0JCWlmIChjbXAuZ2V0UHJpbUtleUZpZWxkKCkhPW51bGwgJiYgY21wLmdldFByaW1LZXlGaWVsZCgpLmVxdWFscyhhdHRyaWJ1dGUpKSB7Ci0JCQltYWtlUHJpbUtleUZpZWxkUHJveHkob2xkTmFtZSk7Ci0JCX0KLQkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYWtlUHJpbUtleUZpZWxkUHJveHkoU3RyaW5nIG9sZE5hbWUpIHsKLQkJaWYgKGNtcC5nZXRQcmltS2V5RmllbGQoKSA9PSBudWxsKSByZXR1cm47Ci0JCWNtcC5zZXRQcmltS2V5RmllbGQoRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ01QQXR0cmlidXRlKCkpOwotCQljbXAuZ2V0UHJpbUtleUZpZWxkKCkuc2V0TmFtZShvbGROYW1lKTsKLQkJKChJbnRlcm5hbEVPYmplY3QpY21wLmdldFByaW1LZXlGaWVsZCgpKS5lU2V0UHJveHlVUkkoVVJJLmNyZWF0ZVVSSShvbGROYW1lKSk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxLZXlBdHRyaWJ1dGVzKCkgewotCQkvLyBjbGVhciBrZXkgYXR0cmlidXRlcyBsaXN0IG9uIGNtcAotCQlnZXRLZXlBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkS2V5QXR0cmlidXRlKENNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCi0JCUNNUEF0dHJpYnV0ZSBwcmltS2V5RmllbGQgPSBjbXAuZ2V0UHJpbUtleUZpZWxkKCk7Ci0JCS8vIGlmIHByaW0ga2V5IGlzIG51bGwgYWRkIGF0dHJpYnV0ZSB0byBrZXkgbGlzdAotCQlpZiAocHJpbUtleUZpZWxkPT1udWxsIHx8IHByaW1LZXlGaWVsZC5lSXNQcm94eSgpKSB7Ci0JCQlpZiAoIWdldEtleUF0dHJpYnV0ZXMoKS5jb250YWlucyhhdHRyaWJ1dGUpKQotCQkJCWdldEtleUF0dHJpYnV0ZXMoKS5hZGQoYXR0cmlidXRlKTsKLQkJCS8vIGlmIGF0dCBpcyBvbmx5IGtleSBhdHQsIGFuZCB0eXBlIGlzIHRoZSBrZXkgY2xhc3MgdHlwZSwgc2V0IHRoZSBwcmltIGtleSBmaWVsZAotCQkJaWYgKGdldEtleUF0dHJpYnV0ZXMoKS5zaXplKCk9PTEgJiYgYXR0cmlidXRlLmdldFR5cGUoKS5lcXVhbHMoY21wLmdldFByaW1hcnlLZXkoKSkpCi0JCQkJY21wLnNldFByaW1LZXlGaWVsZChhdHRyaWJ1dGUpOwotCQl9Ci0JCS8vIGlmIHByaW1rZXkgc2V0ICsgcHJpbWtleWZpZWxkIGlzIHRoZSBuZXcgYXR0cmlidXRlIGVuc3VyZSBpdHMgdGhlIG9ubHkgb25lCi0JCWVsc2UgaWYgKHByaW1LZXlGaWVsZC5lcXVhbHMoYXR0cmlidXRlKSkgewotCQkJaWYgKCEoZ2V0S2V5QXR0cmlidXRlcygpLnNpemUoKT09MSAmJiBnZXRLZXlBdHRyaWJ1dGVzKCkuY29udGFpbnMoYXR0cmlidXRlKSkpIHsKLQkJCQlnZXRLZXlBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRLZXlBdHRyaWJ1dGVzKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JCQl9CQotCQl9Ci0JCS8vIGlmIHByaW1rZXkgc2V0LG5ldyBhdHRyaWJ1dGUgbm90IHByaW0ga2V5LCBrZXkgYXR0cyA+IDEsIHJlbW92ZSBwcmlta2V5IGZpZWxkCi0JCWVsc2UgewotCQkJY21wLnNldFByaW1LZXlGaWVsZChudWxsKTsKLQkJCWlmICghZ2V0S2V5QXR0cmlidXRlcygpLmNvbnRhaW5zKGF0dHJpYnV0ZSkpCi0JCQkJZ2V0S2V5QXR0cmlidXRlcygpLmFkZChhdHRyaWJ1dGUpOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXR0cmlidXRlQWRkZWQoQ01QQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkvL01ha2Ugc3VyZSBjbXAga2V5IGFkYXB0ZXJzIGFyZSBpbml0aWFsaXplZCBpZiBuZWVkZWQKLQkJY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCi0JCS8vIGFkZCB0aGlzIGFzIGEgbGlzdGVuZXIgdG8gbmFtZSBjaGFuZ2VzIG9uIHRoaXMgYXR0cmlidXRlCi0JCWlmICghYXR0cmlidXRlLmVBZGFwdGVycygpLmNvbnRhaW5zKHRoaXMpKQotCQkJYXR0cmlidXRlLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCi0JCWlmIChhdHRyaWJ1dGUuZ2V0TmFtZSgpID09bnVsbCkgcmV0dXJuOwotCQkvLyBhZGQgaXQgdG8gdGhlIGtleSBsaXN0IGlmIGFwcGxpY2FibGUgYW5kIHNvcnQgdGhlIGtleSBsaXN0Ci0JCWlmIChpc0F0dHJpYnV0ZUtleUNsYXNzRmllbGQoYXR0cmlidXRlLmdldE5hbWUoKSkpIHsKLQkJCWFkZEtleUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCQkJc29ydEtleUF0dHJpYnV0ZUxpc3QoKTsKLQkJfQotCQkvLyBpZiBuZXcgYXR0cmlidXRlIG5hbWUgaXMgbm93IHByaW0ga2V5IG5hbWUsIGZpeCB1cCBwcmltIGtleSBmaWVsZAotCQllbHNlIGlmIChjbXAuZ2V0UHJpbUtleUZpZWxkKCkhPW51bGwgJiYgY21wLmdldFByaW1LZXlGaWVsZCgpLmVJc1Byb3h5KCkgJiYgYXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoY21wLmdldFByaW1LZXlGaWVsZCgpLmdldE5hbWUoKSkpIHsKLQkJCWNtcC5zZXRQcmltS2V5RmllbGQoYXR0cmlidXRlKTsKLQkJCXByaW1LZXlGaWVsZENoYW5nZWQoYXR0cmlidXRlKTsKLQkJfQkKLQl9Ci0JCi0KLQkvKioKLQkgKiBJcyB0aGUgY21wIGF0dHJpYnV0ZSBhbHNvIGEgZmllbGQgaW4gdGhlIGtleSBjbGFzcz8KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0F0dHJpYnV0ZUtleUNsYXNzRmllbGQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gZW5zdXJlIGtleSBjbGFzcyBpcyBub3QgbnVsbAotCQlKYXZhQ2xhc3Mga2V5Q2xhc3MgPSBjbXAuZ2V0UHJpbWFyeUtleSgpOwotCQlpZiAoa2V5Q2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gc2VlIGlmIHRoZSBhdHRyaWJ1dGUgbmFtZSBtYXRjaHMgYW55IG9mIHRoZSByZWZsZWN0ZWQga2V5IGNsYXNzIHB1YmxpYyBmaWVsZCBuYW1lcwotCQlMaXN0IGtleUZpZWxkcyA9IGtleUNsYXNzLmdldEZpZWxkc0V4dGVuZGVkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5RmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWVsZCBmaWVsZCA9IChGaWVsZCkga2V5RmllbGRzLmdldChpKTsKLQkJCWlmIChmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCkgewotCQkJCWlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0JCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci0JCi0JLyoqCi0JICogU29ydCB0aGUgbGlzdCBvZiB0aGUga2V5IGF0dHJpYnV0ZXMgdG8gbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSBrZXkgY2xhc3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgc29ydEtleUF0dHJpYnV0ZUxpc3QoKSB7Ci0JCQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSmF2YUNsYXNzIGtleUNsYXNzID0gY21wLmdldFByaW1hcnlLZXkoKTsKLQkJaWYgKGtleUNsYXNzID09IG51bGwpIHJldHVybjsKLQkJTGlzdCBrZXlGaWVsZHMgPSBrZXlDbGFzcy5nZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlMaXN0IGN1cnJlbnRLZXlzID0gZ2V0S2V5QXR0cmlidXRlcygpOwotCQkKLQkJLy8gY3JlYXRlIGEgbmV3IGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgaW4gb3JkZXIgb2Yga2V5IGNsYXNzIGZpZWxkcy4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlGaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpZWxkIGZpZWxkID0gKEZpZWxkKSBrZXlGaWVsZHMuZ2V0KGkpOwotCQkJaWYgKGZpZWxkLmdldEphdmFWaXNpYmlsaXR5KCkgPT0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKSB7IC8vb25seSBwdWJsaWMgZmllbGRzCi0JCQkJZm9yIChpbnQgaj0wOyBqPGN1cnJlbnRLZXlzLnNpemUoKTsgaisrKSB7Ci0JCQkJCUNNUEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKSBjdXJyZW50S2V5cy5nZXQoaik7Ci0JCQkJCWlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZS5nZXROYW1lKCkpKQotCQkJCQkJcmVzdWx0LmFkZChhdHRyaWJ1dGUpOwkKLQkJCQl9CQkJCi0JCQl9CQotCQl9Ci0JCS8vY2xlYXIgbGlzdCBhbmQgc2V0IHRoZSBuZXcga2V5IGF0dHJpYnV0ZSBvcmRlciBvbiB0aGUgY21wCi0JCWdldEtleUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQlnZXRLZXlBdHRyaWJ1dGVzKCkuYWRkQWxsKHJlc3VsdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGtleUNsYXNzQ2hhbmdlZCgpIHsKLQkJSmF2YUNsYXNzIGtleSA9IGNtcC5nZXRQcmltYXJ5S2V5KCk7Ci0JCWlmIChrZXkgIT1udWxsKQotCQkJa2V5LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJLy8gaWYgbm90IHByaW0ga2V5IGNsYXNzLCBjbGVhciBrZXkgYXR0cmlidXRlIGxpc3QKLQkJcmVtb3ZlQWxsS2V5QXR0cmlidXRlcygpOwotCQlpbml0aWFsaXplZCA9IGZhbHNlOwotCQlpbml0aWFsaXplS2V5QXR0cmlidXRlcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcmltS2V5RmllbGRDaGFuZ2VkKEVPYmplY3QgcHJpbUtleUZpZWxkKSB7Ci0JCS8vIGlmIGEgcHJpbUtleUZpZWxkIGlzIGFkZGVkLCBkbyBhIHJlbW92ZSBhbGwgYW5kIGFuIGFkZAotCQlyZW1vdmVBbGxLZXlBdHRyaWJ1dGVzKCk7Ci0JCQotCQlpZiAocHJpbUtleUZpZWxkICE9IG51bGwgJiYgIXByaW1LZXlGaWVsZC5lSXNQcm94eSgpKSB7Ci0JCQlpZiAoIXByaW1LZXlGaWVsZC5lQWRhcHRlcnMoKS5jb250YWlucyh0aGlzKSkKLQkJCQlwcmltS2V5RmllbGQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJZ2V0S2V5QXR0cmlidXRlcygpLmFkZChwcmltS2V5RmllbGQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgRUxpc3QgZ2V0S2V5QXR0cmlidXRlcygpIHsKLQkgICAgcmV0dXJuICgoQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwpY21wKS5nZXRLZXlBdHRyaWJ1dGVzR2VuKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7IAotCX0KLQkKLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBBREFQVEVSX1RZUEUuZXF1YWxzKHR5cGUpOwotICAgIH0KLSAgICAvL1RvIHR1cm4gc3luYyBvbiBvciBvZmYKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCl7Ci0gICAgCWlzRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ29tbW9uUmVsYXRpb25zaGlwQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9Db21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0OWY4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9Db21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbW1vblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29tbW9uUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEVqYlBhY2thZ2UgRUpCX1BBQ0sgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUmVsYXRpb25zaGlwQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJCWFkZGVkTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJCXJlbW92ZWROb3RpZmljYXRpb24obXNnKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRlZE5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICgoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkgPT0gRUpCX1BBQ0suZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9LZXlBdHRyaWJ1dGVzKCkpCi0JCQlhZGRlZEtleUF0dHJpYnV0ZSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbXNnLmdldE5vdGlmaWVyKCksIChDTVBBdHRyaWJ1dGUpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJZWxzZSBpZiAoaXNSZWxhdGlvbnNoaXBzU0YoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpKSkKLQkJCWFkZGVkKCk7Ci0JCWVsc2UgaWYgKGlzUmVsYXRpb25zaGlwUm9sZXNTRigoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkpKQotCQkJYWRkZWRSb2xlKChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZWROb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpID09IEVKQl9QQUNLLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfS2V5QXR0cmlidXRlcygpKQotCQkJcmVtb3ZlZEtleUF0dHJpYnV0ZSgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbXNnLmdldE5vdGlmaWVyKCksIChDTVBBdHRyaWJ1dGUpIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJZWxzZSBpZiAoaXNSZWxhdGlvbnNoaXBzU0YoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpKSkKLQkJCXJlbW92ZWQoKTsKLQkJZWxzZSBpZiAoaXNSZWxhdGlvbnNoaXBSb2xlc1NGKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSkpCi0JCQlyZW1vdmVkUm9sZSgoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgbXNnLmdldE9sZFZhbHVlKCkpOwotCX0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcFJvbGVzU0YoRU9iamVjdCBzZik7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBzU0YoRU9iamVjdCBzZik7Ci0JLy9TYW1lIGFzIHRoZSBhZGQKLQlwcml2YXRlIHZvaWQgcmVtb3ZlZEtleUF0dHJpYnV0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGFDTVBFbnRpdHksIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUpIHsKLQkJYWRkZWRLZXlBdHRyaWJ1dGUoYUNNUEVudGl0eSwgY21wQXR0cmlidXRlKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYWRkZWRLZXlBdHRyaWJ1dGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBhQ01QRW50aXR5LCBDTVBBdHRyaWJ1dGUgbmV3QXR0cmlidXRlKSB7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSwgaW52ZXJzZTsKLQkJcm9sZSA9IGdldFJvbGUoYUNNUEVudGl0eSk7Ci0JCWlmIChyb2xlICE9IG51bGwgJiYgIXJvbGUuaXNGb3J3YXJkKCkpIHsKLQkJCWludmVyc2UgPSByb2xlLmdldE9wcG9zaXRlQXNDb21tb25Sb2xlKCk7Ci0JCQlpZiAoaW52ZXJzZSAhPSBudWxsKQotCQkJCWludmVyc2UucmVjb25jaWxlQXR0cmlidXRlcygpOwotCQl9Ci0JfQotCXByb3RlY3RlZCBDb21tb25SZWxhdGlvbnNoaXBSb2xlIGdldFJvbGUoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBhQ01QRW50aXR5KSB7Ci0JICAgIENvbW1vblJlbGF0aW9uc2hpcCByZWxhdGlvbiA9IGdldFJlbGF0aW9uc2hpcCgpOwotCSAgICBpZiAocmVsYXRpb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3Qgcm9sZXMgPSByZWxhdGlvbi5nZXRDb21tb25Sb2xlcygpOwotCQlpZiAocm9sZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgcm9sZXMuZ2V0KGkpOwotCQkJaWYgKHJvbGUuZ2V0U291cmNlRW50aXR5KCkgPT0gYUNNUEVudGl0eSkKLQkJCQlyZXR1cm4gcm9sZTsKLQkJfQotCQlyZXR1cm4gcm9sZTsKLQl9Ci0JcHJvdGVjdGVkIENvbW1vblJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiAgKENvbW1vblJlbGF0aW9uc2hpcCkgZ2V0VGFyZ2V0KCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlY29uY2lsZVJvbGVBdHRyaWJ1dGVzKCkgewotCQlMaXN0IHJvbGVzID0gZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Q29tbW9uUm9sZXMoKTsKLQkJaWYgKHJvbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlcy5zaXplKCk7IGkrKykgewotCQkJcm9sZSA9IChDb21tb25SZWxhdGlvbnNoaXBSb2xlKSByb2xlcy5nZXQoaSk7Ci0JCQlyb2xlLnJlY29uY2lsZUF0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRlZCgpIHsKLQkJcmVjb25jaWxlUm9sZUF0dHJpYnV0ZXMoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlZCgpIHsKLQkJaWYgKGdldFJlbGF0aW9uc2hpcCgpLmdldENvbW1vblJvbGVzKCkuc2l6ZSgpID4gMSkgewotCQkJLy9yZW1vdmUgb25lIGZvcmNlIGEgZGlzY29ubmVjdAotCQkJZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Q29tbW9uUm9sZXMoKS5yZW1vdmUoMCk7Ci0JCX0KLQl9Ci0JLyoqCi0JKiBBZGQgdGhpcyBBZGFwdGVyIHRvIEBhUm9sZSBhbmQgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHkKLQkqIHRoYXQgdGhlIENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24gY29udGFpbmVyIGlzIHBvaW50aW5nIHRvLgotCSogVGhpcyBvbmx5IHdvcmtzIGlmIEBhUm9sZSBpcyBjb250YWluZWQuCi0JKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGFwdG9ycyhDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JCXJlbW92ZUFkYXB0b3JzKGFSb2xlKTsgLy90byBlbnN1cmUgdGhpcyBhZGFwdGVyIGlzIG5vdCBhZGRlZCB0d2ljZQotCQlhUm9sZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gYVJvbGUuZ2V0U291cmNlRW50aXR5KCk7Ci0JCWlmIChjbXAgIT0gbnVsbCkKLQkJCWNtcC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JfQotCS8qKgotCSAqIFJlbW92ZSB0aGlzIEFkYXB0ZXIgZnJvbSBAYVJvbGUgYW5kIHRoZSBDb250YWluZXJNYW5hZ2VkRW50aXR5Ci0JICogdGhhdCB0aGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiBjb250YWluZXIgaXMgcG9pbnRpbmcgdG8uCi0JICogVGhpcyBvbmx5IHdvcmtzIGlmIEBhUm9sZSBpcyBjb250YWluZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWRhcHRvcnMoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewotCQlhUm9sZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gYVJvbGUuZ2V0U291cmNlRW50aXR5KCk7Ci0JCWlmIChjbXAgIT0gbnVsbCkKLQkJCWNtcC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGFkZGVkUm9sZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JCWFkZEFkYXB0b3JzKGFSb2xlKTsKLQkJaWYgKChnZXRSZWxhdGlvbnNoaXAoKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgJiYgcm9sZXNGdWxseVJlZmxlY3RlZCgpKQotCQkJcmVjb25jaWxlUm9sZUF0dHJpYnV0ZXMoKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sZXNGdWxseVJlZmxlY3RlZCgpIHsKLQkJTGlzdCByb2xlcyA9IGdldFJlbGF0aW9uc2hpcCgpLmdldENvbW1vblJvbGVzKCk7Ci0JCWlmIChyb2xlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbW1vblJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJvbGUgPSAoQ29tbW9uUmVsYXRpb25zaGlwUm9sZSkgcm9sZXMuZ2V0KGkpOwotCQkJaWYgKHJvbGUuZ2V0U291cmNlRW50aXR5KCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVkUm9sZShDb21tb25SZWxhdGlvbnNoaXBSb2xlIGFSb2xlKSB7Ci0JCXJlbW92ZUFkYXB0b3JzKGFSb2xlKTsKLQkJaWYgKGdldFJlbGF0aW9uc2hpcCgpLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlhUm9sZS5yZWNvbmNpbGVBdHRyaWJ1dGVzKCk7Ci0JCQlyZWNvbmNpbGVSb2xlQXR0cmlidXRlcygpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBub3RpZmllcikgewotCQkvL09ubHkgc2V0IHRoZSB0YXJnZXQgaWYgaXQgaXMgYSBDb21tb25SZWxhdGlvbnNoaXAKLQkJaWYgKG5vdGlmaWVyID09IG51bGwgfHwgbm90aWZpZXIgaW5zdGFuY2VvZiBDb21tb25SZWxhdGlvbnNoaXApCi0JCQlzdXBlci5zZXRUYXJnZXQobm90aWZpZXIpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9Db252ZXJ0ZWRFSkJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9Db252ZXJ0ZWRFSkJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZTJiMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ29udmVydGVkRUpCQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLQotcHVibGljIGNsYXNzIENvbnZlcnRlZEVKQkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0tFWSA9ICJDb252ZXJ0ZWRFSkJBZHBhdGVyIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMCA9IDE7Ci0JCi0JcHJvdGVjdGVkIGludCB2ZXJzaW9uID0gLTE7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29udmVydGVkRUpCQWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgQ29udmVydGVkRUpCQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2ZXJzaW9uLiAgVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgc3RhdGljIGNvbnN0YW50cy4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZlcnNpb24uICBUaGlzIHNob3VsZCBiZSBvbmUgb2YgdGhlIHN0YXRpYyBjb25zdGFudHMuCi0JICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbikgewotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlYWRPbmx5LgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVhZE9ubHkuCi0JICogQHBhcmFtIHJlYWRPbmx5IFRoZSByZWFkT25seSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGcm9tVmVyc2lvbjFfMCgpIHsKLQkJcmV0dXJuIHZlcnNpb24gPT0gVkVSU0lPTl8xXzA7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0NjhmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbCBleHRlbmRzIEVqYkFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0tFWSA9ICJFSkJBdHRyaWJ1dGVNYWludGVuYW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnV0aWwuRWpiQWRhcHRlckZhY3RvcnkjY3JlYXRlQWRhcHRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlBZGFwdGVyIHRhcmdldEFkYXB0ZXIgPSAoQWRhcHRlcikgbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQkJcmV0dXJuIEV4dGVuZGVkRWNvcmVVdGlsLmNyZWF0ZUFkYXB0ZXJGb3JMb2FkaW5nKHRhcmdldEFkYXB0ZXIsIChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVKQlJlbGF0aW9uQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyKCk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFJlbGF0aW9uc2hpcHNBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX0tFWSA9PSB0eXBlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQlJlbGF0aW9uQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDhhMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIgZXh0ZW5kcyBDb21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci4KLQkgKiBAcGFyYW0gYVJlbGF0aW9uc2hpcAotCSAqLwotCXB1YmxpYyBFSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLkNvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlciNpc1JlbGF0aW9uc2hpcFJvbGVzU0YoRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcFJvbGVzU0YoRU9iamVjdCBzZikgewotCQlyZXR1cm4gc2YgPT0gRUpCX1BBQ0suZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwUm9sZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLkNvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlciNpc1JlbGF0aW9uc2hpcHNTRihFT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVsYXRpb25zaGlwc1NGKEVPYmplY3Qgc2YpIHsKLQkJcmV0dXJuIHNmID09IEVKQl9QQUNLLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIEVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuQURBUFRFUl9LRVkgPT0gdHlwZTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZWJkZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk1ldGhvZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLQotcHVibGljIGNsYXNzIEVqYkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEVqYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCXB1YmxpYyBFamJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSAoRWpiUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KSB0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHJvdGVjdGVkIEVqYlN3aXRjaCBzdyA9IG5ldyBFamJTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBlcm1pc3Npb24oTWV0aG9kUGVybWlzc2lvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RQZXJtaXNzaW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFRyYW5zYWN0aW9uKE1ldGhvZFRyYW5zYWN0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVudGVycHJpc2VCZWFuKEVudGVycHJpc2VCZWFuIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVudGVycHJpc2VCZWFuQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVudGl0eShFbnRpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRW50aXR5QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNNUEF0dHJpYnV0ZShDTVBBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ01QQXR0cmlidXRlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNNUkZpZWxkKENNUkZpZWxkIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNNUkZpZWxkQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uc2hpcFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uKEVKQlJlbGF0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVKQlJlbGF0aW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVJlbGF0aW9uc2hpcHMoUmVsYXRpb25zaGlwcyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZWxhdGlvbnNoaXBzQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphcihFSkJKYXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUpCSmFyQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVTb3VyY2UoUm9sZVNvdXJjZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlU291cmNlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5KFF1ZXJ5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUV4Y2x1ZGVMaXN0QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb24oU2Vzc2lvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW4oTWVzc2FnZURyaXZlbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRHJpdmVuQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbihNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eShBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVKQk1ldGhvZENhdGVnb3J5KEVKQk1ldGhvZENhdGVnb3J5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVKQk1ldGhvZENhdGVnb3J5QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzcyhFQ2xhc3Mgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUNsYXNzQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzc2lmaWVyKEVDbGFzc2lmaWVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0JfTsKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpIHN3LmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcwotCSAqIGFueXdheS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQZXJtaXNzaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RUcmFuc2FjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbnRlcnByaXNlQmVhbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDTVBBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ01SRmllbGRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJSZWxhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWxhdGlvbnNoaXBzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkphckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVF1ZXJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVF1ZXJ5TWV0aG9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjbHVkZUxpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRHJpdmVuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQ2xhc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFamJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgRWpiU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyTWFuYWdlZEVudGl0eShDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGVybWlzc2lvbihNZXRob2RQZXJtaXNzaW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RQZXJtaXNzaW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kVHJhbnNhY3Rpb24oTWV0aG9kVHJhbnNhY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbihTZXNzaW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRW50aXR5KEVudGl0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRW50aXR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRW50ZXJwcmlzZUJlYW4oRW50ZXJwcmlzZUJlYW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudGVycHJpc2VCZWFuQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCTWV0aG9kQ2F0ZWdvcnkoRUpCTWV0aG9kQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQk1ldGhvZENhdGVnb3J5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCSmFyKEVKQkphciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRUpCSmFyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ01QQXR0cmlidXRlKENNUEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ01QQXR0cmlidXRlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZWxhdGlvbnNoaXBzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUXVlcnkoUXVlcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVKQlJlbGF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb25zaGlwUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUm9sZVNvdXJjZShSb2xlU291cmNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlU291cmNlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ01SRmllbGQoQ01SRmllbGQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNNUkZpZWxkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbihNZXNzYWdlRHJpdmVuIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRHJpdmVuQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXhjbHVkZUxpc3QoRXhjbHVkZUxpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4Y2x1ZGVMaXN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUXVlcnlNZXRob2QoUXVlcnlNZXRob2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSk5ESUVudlJlZnNHcm91cChKTkRJRW52UmVmc0dyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFVHlwZWRFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJHZW4oTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzLgotCSAqIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMKLQkgKiBhbnl3YXkuCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGVybWlzc2lvbkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3JBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RUcmFuc2FjdGlvbkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGVycHJpc2VCZWFuQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRW50aXR5QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNNUEF0dHJpYnV0ZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNNUkZpZWxkQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQlJlbGF0aW9uQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVsYXRpb25zaGlwc0FkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVKQkphckFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTb3VyY2VBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVRdWVyeUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVF1ZXJ5TWV0aG9kQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2YXRpb25Db25maWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCA8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2x1ZGVMaXN0QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEcml2ZW5BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJNZXRob2RDYXRlZ29yeUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQgPGVtPkVUeXBlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9FamJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5Y2QyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk1ldGhvZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRWpiUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWTogewotCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY29udGFpbmVyTWFuYWdlZEVudGl0eSA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb250YWluZXJNYW5hZ2VkRW50aXR5KGNvbnRhaW5lck1hbmFnZWRFbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVudGl0eShjb250YWluZXJNYW5hZ2VkRW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbihjb250YWluZXJNYW5hZ2VkRW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKGNvbnRhaW5lck1hbmFnZWRFbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGNvbnRhaW5lck1hbmFnZWRFbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoY29udGFpbmVyTWFuYWdlZEVudGl0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OOiB7Ci0JCQkJTWV0aG9kUGVybWlzc2lvbiBtZXRob2RQZXJtaXNzaW9uID0gKE1ldGhvZFBlcm1pc3Npb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFBlcm1pc3Npb24obWV0aG9kUGVybWlzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1I6IHsKLQkJCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gKEFzc2VtYmx5RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTjogewotCQkJCU1ldGhvZFRyYW5zYWN0aW9uIG1ldGhvZFRyYW5zYWN0aW9uID0gKE1ldGhvZFRyYW5zYWN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RUcmFuc2FjdGlvbihtZXRob2RUcmFuc2FjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT046IHsKLQkJCQlTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2Vzc2lvbihzZXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbihzZXNzaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKHNlc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHNlc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoc2Vzc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWTogewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbnRpdHkoZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbihlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUpORElFbnZSZWZzR3JvdXAoZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChlbnRpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoZW50aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOOiB7Ci0JCQkJRW50ZXJwcmlzZUJlYW4gZW50ZXJwcmlzZUJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVudGVycHJpc2VCZWFuKGVudGVycHJpc2VCZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKGVudGVycHJpc2VCZWFuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChlbnRlcnByaXNlQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChlbnRlcnByaXNlQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9NRVRIT0RfQ0FURUdPUlk6IHsKLQkJCQlFSkJNZXRob2RDYXRlZ29yeSBlamJNZXRob2RDYXRlZ29yeSA9IChFSkJNZXRob2RDYXRlZ29yeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCTWV0aG9kQ2F0ZWdvcnkoZWpiTWV0aG9kQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSOiB7Ci0JCQkJRUpCSmFyIGVqYkphciA9IChFSkJKYXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkphcihlamJKYXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGVqYkphcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChlamJKYXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVDogewotCQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFOiB7Ci0JCQkJQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNNUEF0dHJpYnV0ZShjbXBBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVBdHRyaWJ1dGUoY21wQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoY21wQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGNtcEF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChjbXBBdHRyaWJ1dGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoY21wQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQUzogewotCQkJCVJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IChSZWxhdGlvbnNoaXBzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWTogewotCQkJCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VRdWVyeShxdWVyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTjogewotCQkJCUVKQlJlbGF0aW9uIGVqYlJlbGF0aW9uID0gKEVKQlJlbGF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJSZWxhdGlvbihlamJSZWxhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRTogewotCQkJCUVKQlJlbGF0aW9uc2hpcFJvbGUgZWpiUmVsYXRpb25zaGlwUm9sZSA9IChFSkJSZWxhdGlvbnNoaXBSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKGVqYlJlbGF0aW9uc2hpcFJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRTogewotCQkJCVJvbGVTb3VyY2Ugcm9sZVNvdXJjZSA9IChSb2xlU291cmNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSb2xlU291cmNlKHJvbGVTb3VyY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTEQ6IHsKLQkJCQlDTVJGaWVsZCBjbXJGaWVsZCA9IChDTVJGaWVsZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ01SRmllbGQoY21yRmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNNUEF0dHJpYnV0ZShjbXJGaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUF0dHJpYnV0ZShjbXJGaWVsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGNtckZpZWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU46IHsKLQkJCQlNZXNzYWdlRHJpdmVuIG1lc3NhZ2VEcml2ZW4gPSAoTWVzc2FnZURyaXZlbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZURyaXZlbihtZXNzYWdlRHJpdmVuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbnRlcnByaXNlQmVhbihtZXNzYWdlRHJpdmVuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKTkRJRW52UmVmc0dyb3VwKG1lc3NhZ2VEcml2ZW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKG1lc3NhZ2VEcml2ZW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAobWVzc2FnZURyaXZlbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OOiB7Ci0JCQkJTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiA9IChNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbihtZXNzYWdlRHJpdmVuRGVzdGluYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1Q6IHsKLQkJCQlFeGNsdWRlTGlzdCBleGNsdWRlTGlzdCA9IChFeGNsdWRlTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXhjbHVkZUxpc3QoZXhjbHVkZUxpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0Q6IHsKLQkJCQlRdWVyeU1ldGhvZCBxdWVyeU1ldGhvZCA9IChRdWVyeU1ldGhvZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUXVlcnlNZXRob2QocXVlcnlNZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocXVlcnlNZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTogewotCQkJCUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgPSAoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUc6IHsKLQkJCQlBY3RpdmF0aW9uQ29uZmlnIGFjdGl2YXRpb25Db25maWcgPSAoQWN0aXZhdGlvbkNvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZhdGlvbkNvbmZpZyhhY3RpdmF0aW9uQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGFpbmVyIE1hbmFnZWQgRW50aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRhaW5lciBNYW5hZ2VkIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyTWFuYWdlZEVudGl0eShDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBlcm1pc3Npb24oTWV0aG9kUGVybWlzc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBUcmFuc2FjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVHJhbnNhY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFRyYW5zYWN0aW9uKE1ldGhvZFRyYW5zYWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2Vzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uKFNlc3Npb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRpdHkoRW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW50ZXJwcmlzZSBCZWFuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGVycHJpc2UgQmVhbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRW50ZXJwcmlzZUJlYW4oRW50ZXJwcmlzZUJlYW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgTWV0aG9kIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBNZXRob2QgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQk1ldGhvZENhdGVnb3J5KEVKQk1ldGhvZENhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXIoRUpCSmFyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUCBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01QIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ01QQXR0cmlidXRlKENNUEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5KFF1ZXJ5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBSZWxhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNvdXJjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUm9sZVNvdXJjZShSb2xlU291cmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01SIEZpZWxkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUiBGaWVsZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ01SRmllbGQoQ01SRmllbGQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbihNZXNzYWdlRHJpdmVuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEcml2ZW4gRGVzdGluYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEcml2ZW4gRGVzdGluYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbihNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjbHVkZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eShBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUpORElFbnZSZWZzR3JvdXAoSk5ESUVudlJlZnNHcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FTmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVN0cnVjdHVyYWwgRmVhdHVyZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9FamJTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL01ldGhvZEVsZW1lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL01ldGhvZEVsZW1lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzNDZkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9NZXRob2RFbGVtZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9QRVJNSVNTSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfVFJBTlNBQ1RJT04gPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYQ0xVREVfTElTVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Q29udGFpbmVkVHlwZShNZXRob2RFbGVtZW50IG1lKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gbWUuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gTk9ORTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24pCi0JCQlyZXR1cm4gTUVUSE9EX1BFUk1JU1NJT047Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RUcmFuc2FjdGlvbikKLQkJCXJldHVybiBNRVRIT0RfVFJBTlNBQ1RJT047Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFeGNsdWRlTGlzdCkKLQkJCXJldHVybiBFWENMVURFX0xJU1Q7Ci0JCXJldHVybiBOT05FOwotCX0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBlcm1pc3Npb24gZ2V0TWV0aG9kUGVybWlzc2lvbihNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWlmIChNRVRIT0RfUEVSTUlTU0lPTiA9PSBnZXRDb250YWluZWRUeXBlKG1lKSkKLQkJCXJldHVybiAoTWV0aG9kUGVybWlzc2lvbikgbWUuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBNZXRob2RUcmFuc2FjdGlvbiBnZXRNZXRob2RUcmFuc2FjdGlvbihNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWlmIChNRVRIT0RfVFJBTlNBQ1RJT04gPT0gZ2V0Q29udGFpbmVkVHlwZShtZSkpCi0JCQlyZXR1cm4gKE1ldGhvZFRyYW5zYWN0aW9uKSBtZS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIEV4Y2x1ZGVMaXN0IGdldEV4Y2x1ZGVMaXN0KE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKEVYQ0xVREVfTElTVCA9PSBnZXRDb250YWluZWRUeXBlKG1lKSkKLQkJCXJldHVybiAoRXhjbHVkZUxpc3QpIG1lLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9SZWxhdGlvbnNoaXBzQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9SZWxhdGlvbnNoaXBzQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjExNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvUmVsYXRpb25zaGlwc0F0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBzQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSA9PSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKSkgewotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJCQlhZGRlZEVKQlJlbGF0aW9uKChFSkJSZWxhdGlvbikgbXNnLmdldE5ld1ZhbHVlKCksIChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQkJCXJlbW92ZWRFSkJSZWxhdGlvbigoRUpCUmVsYXRpb24pIG1zZy5nZXRPbGRWYWx1ZSgpLCAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlZEVKQlJlbGF0aW9uKEVKQlJlbGF0aW9uIGFSZWxhdGlvbiwgRU9iamVjdCBzZikgewotCQlBZGFwdGVyIGEgPSBnZXRBZGFwdGVyKGFSZWxhdGlvbik7Ci0JCWlmIChhICE9IG51bGwpIHsKLQkJCU5vdGlmaWNhdGlvbiBub3QgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClhUmVsYXRpb24sIE5vdGlmaWNhdGlvbi5SRU1PVkUsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgc2YsIGFSZWxhdGlvbiwgbnVsbCwgTm90aWZpY2F0aW9uLk5PX0lOREVYKTsKLQkJCWEubm90aWZ5Q2hhbmdlZChub3QpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRlZEVKQlJlbGF0aW9uKEVKQlJlbGF0aW9uIGFSZWxhdGlvbiwgRU9iamVjdCBzZikgewotCQlBZGFwdGVyIGEgPSBnZXRBZGFwdGVyKGFSZWxhdGlvbik7Ci0JCWlmIChhICE9IG51bGwpIHsKLQkJCU5vdGlmaWNhdGlvbiBub3QgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClhUmVsYXRpb24sIE5vdGlmaWNhdGlvbi5BREQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgc2YsIG51bGwsIGFSZWxhdGlvbiwgTm90aWZpY2F0aW9uLk5PX0lOREVYKTsKLQkJCWEubm90aWZ5Q2hhbmdlZChub3QpOwotCQl9Ci0JfQotCXByaXZhdGUgQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgYW5PYmplY3QpIHsKLQkJcmV0dXJuIEVjb3JlVXRpbC5nZXRBZGFwdGVyKGFuT2JqZWN0LmVBZGFwdGVycygpLEVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuQURBUFRFUl9LRVkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2NhNzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSBlbnRlcnByaXNlIGJlYW4gbW9kdWxlIG1vZGVsIGFwaS4gVXNpbmcgdGhpcyBhcGkgdGhlIGFydGlmYWN0cyBvZiBhbiBlbnRlcnByaXNlIGJlYW4gYXBwCi0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0RlZmF1bHRFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0RlZmF1bHRFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyMTQ2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9EZWZhdWx0RUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIGltcGxlbWVudHMgSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciB7Ci0gICAgCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlZmF1bHRFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCX0KLQkKLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb3JlLm1vZHVsZWV4dGVuc2lvbi5oZWxwZXIuSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciNnZXRFSkJNb2R1bGVFeHRlbnNpb24oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIGdldEVKQk1vZHVsZUV4dGVuc2lvbihPYmplY3QgY29udGV4dCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29yZS5tb2R1bGVleHRlbnNpb24uaGVscGVyLklFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIjaGFzRUpCTW9kdWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRUpCTW9kdWxlRXh0ZW5zaW9uKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRFSkJNb2R1bGVFeHRlbnNpb24oY29udGV4dCkgIT0gbnVsbDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9FSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2ZTg4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9FSkJNb2RlbEV4dGVuZGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyIGltcGxlbWVudHMgSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyIHsgCi0KLSAgICBwcml2YXRlIElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRGVmYXVsdEVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlcigpOwotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFNob3VsZCB1c2UgSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLklOU1RBTkNFLmdldEVKQk1vZHVsZUV4dGVuc2lvbihudWxsKTsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBnZXRFSkJNb2R1bGVFeHRlbnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKE9iamVjdCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRFSkJNb2R1bGVFeHRlbnNpb24oY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc0VKQk1vZHVsZUV4dGVuc2lvbihPYmplY3QgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKGNvbnRleHQpICE9IG51bGw7Ci0gICAgfSAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb3JlLm1vZHVsZWV4dGVuc2lvbi5oZWxwZXIuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyI3NldFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvcmUubW9kdWxlZXh0ZW5zaW9uLmhlbHBlci5JRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3ZpZGVyKElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb3JlLm1vZHVsZWV4dGVuc2lvbi5oZWxwZXIuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyI2lzUHJvdmlkZXJTZXQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvdmlkZXJTZXQoKSB7Ci0gICAgICAgIHJldHVybiAhKHRoaXMucHJvdmlkZXIgaW5zdGFuY2VvZiBEZWZhdWx0RUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9FamJNb2R1bGVFeHRlbnNpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0VqYk1vZHVsZUV4dGVuc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAyZjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0VqYk1vZHVsZUV4dGVuc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgYSBoZWxwZXIgdXNlZCBmb3IgZGVyaXZpbmcgdGhlIEpOREkgbmFtZSBvZiBlbnRlcnByaXNlIGJlYW5zLAotICogYW5kIGZvciBpbmhlcml0YW5jZSBzdXBwb3J0LiAgVGhlIGhlbHBlciBjYW4gYmUgcGx1Z2dlZCBpbiBieSBhcHBsaWNhdGlvbgotICogc2VydmVyIHZlbmRvcnMuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZXh0ZW5kcyBKMkVFTW9kdWxlRXh0ZW5zaW9uSGVscGVyIHsKLQlMaXN0IGdldFN1YnR5cGVzKEVudGVycHJpc2VCZWFuIGFuRUpCKTsKLQlFbnRlcnByaXNlQmVhbiBnZXRTdXBlclR5cGUoRW50ZXJwcmlzZUJlYW4gYW5FSkIpOwotCUxpc3QgZ2V0Um9sZU1ldGhvZE5hbWVzRXh0ZW5kZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApOwotCVN0cmluZyBnZXRFSkJJbmhlcml0YW5jZUZpbGVOYW1lKCk7Ci0JU3RyaW5nIGdldEpORElOYW1lKEVKQkphciBqYXIsIEVudGVycHJpc2VCZWFuIGJlYW4pOyAKLQlMaXN0IGdldFJlbGF0aW9uc2hpcHNfY21wMTEoRUpCSmFyIGphcik7Ci0JTGlzdCBnZXRMb2NhbFJlbGF0aW9uc2hpcFJvbGVzX2NtcDExKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKTsKLQlib29sZWFuIGlzRUpCSW5oZXJpdGFuY2VTdXBwb3J0ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0V4Y2VwdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDdkMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBmYWN0b3IgY29tbW9uIGNvZGUgZm9yIGltcGxlbWVudGVycyBvZiBJV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKLS8qKgotICogVXRpbGl0eSBjbGFzczsgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotICovCi1wcml2YXRlIEV4Y2VwdGlvbkhlbHBlcigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gQGV4Y2VwdGlvbiBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLSAqLwotcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoSVdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0JbWVzc2FnZXMuYWRkKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleGNlcHRpb24uZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0Jd2hpbGUgKG5lc3RlZCAhPSBudWxsKSB7Ci0JCW1lc3NhZ2VzLmFkZChuZXN0ZWQuZ2V0TWVzc2FnZSgpKTsKLQkJaWYgKG5lc3RlZCBpbnN0YW5jZW9mIElXcmFwcGVkRXhjZXB0aW9uKSAKLQkJCW5lc3RlZCA9ICgoSVdyYXBwZWRFeGNlcHRpb24pbmVzdGVkKS5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJZWxzZQotCQkJbmVzdGVkID0gbnVsbDsKLQl9Ci0JcmV0dXJuIChTdHJpbmdbXSltZXNzYWdlcy50b0FycmF5KG5ldyBTdHJpbmdbbWVzc2FnZXMuc2l6ZSgpXSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSBAZXhjZXB0aW9uIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwKLSAqIGNvbmNhdGVuYXRlZCBhcyBvbmUKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoSVdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JU3RyaW5nW10gbWVzc2FnZXMgPSBnZXRBbGxNZXNzYWdlcyhleGNlcHRpb24pOwotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU2KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKXsKLQkJc2IuYXBwZW5kKG1lc3NhZ2VzW2ldKTsKLQkJaWYgKGkgPCBtZXNzYWdlcy5sZW5ndGgtMSkKLQkJCXNiLmFwcGVuZCgnXG4nKTsKLQl9Ci0JcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyYjJmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBUaGUgSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyIHJlcGxhY2VzIHRoZSBmb3JtZXIgSjJFRU1vZHVsZUV4dGVuc2lvbk1hbmFnZXIgYW5kIGFjdHMKLSAqIGFzIGEgZmFjYWRlIGZvciBhIHNpbmdsZSBJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLiBUaGUgSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciB3aWxsCi0gKiBwcm92aWRlIHRoZSBjb3JyZWN0IGV4dGVuc2lvbiBoZWxwZXIgYmFzZWQgb24gYSBnaXZlbiBjb250ZXh0IChAc2VlIElFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIpLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIgZXh0ZW5kcyBJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIHsKLQotICAgIElFSkJNb2RlbEV4dGVuZGVyTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBFSkJNb2RlbEV4dGVuZGVyTWFuYWdlcigpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm92aWRlciBmb3Igd2hpY2ggdGhlIG1hbmFnZXIgaXMgYSBmYWNhZGUgaGFzIGJlZW4gc2V0Ci0gICAgICovCi0gICAgYm9vbGVhbiBpc1Byb3ZpZGVyU2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIG1hbmFnZXIgd2lsbCBhY3QgYXMgYSBmYWNhZGUgdG8gdGhlIGdpdmVuIHByb3ZpZGVyCi0gICAgICovCi0gICAgdm9pZCBzZXRQcm92aWRlcihJRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyIHByb3ZpZGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGYyODViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI1LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlciB7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBhIHN1cHBsaWVkIG9iamVjdCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgKGUuZy4gSVByb2plY3QgaWYgYXZhaWxhYmxlKQotICAgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBvciA8Yj5udWxsPC9iPiBpZiBub25lIGV4aXN0cwotICAgICAqLwotICAgIEVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBnZXRFSkJNb2R1bGVFeHRlbnNpb24oT2JqZWN0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQgYSBzdXBwbGllZCBvYmplY3QgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IChlLmcuIElQcm9qZWN0IGlmIGF2YWlsYWJsZSkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbnRleHQgaGFzIGFuIGV4dGVuc2lvbiAKLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0VKQk1vZHVsZUV4dGVuc2lvbihPYmplY3QgY29udGV4dCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UwMjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLQotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIFdyYXBwZWRSdW50aW1lIGFuZCBXcmFwcGVkIGV4Y2VwdGlvbnMsIHdoaWNoIGNhbiBjb250YWluIG5lc3RlZCBleGNlcHRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdyYXBwZWRFeGNlcHRpb24gewotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLSAqLwotcHVibGljIFN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCk7Ci0vKioKLSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwKLSAqIGNvbmNhdGVuYXRlZCBhcyBvbmUKLSAqLwotcHVibGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpOwotcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCk7Ci1wdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXROZXN0ZWRFeGNlcHRpb24oKTsKLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpOwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcyk7Ci1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKTsKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzhiZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgYSBjYXRhbG9nIG9mIHVzZWZ1bCBjb25zdGFudHMgZm9yIHRoZSBhcmNoaXZlIHN1cHBvcnQuICBDYW4gYmUgdXNlZCB0bwotICogc3RvcmUgcmVsYXRpdmUgcGF0aHMgdG8gc3BlY2lmaWMgeG1sIGFuZCB4bWkgcmVzb3VyY2VzLiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRUNvbnN0YW50cyBleHRlbmRzIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHsKLQkvL1N0YW5kYXJkIEphciBpbmZvCi0JCS8qKiAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiIAkJCQkJCQkJCQkJCSovCi0JU3RyaW5nIE1BTklGRVNUX1VSSQkgCQkJCT0JIk1FVEEtSU5GL01BTklGRVNULk1GIjsgLy8kTk9OLU5MUy0xJAotCVVSSSBNQU5JRkVTVF9VUklfT0JKCSAJCQk9CVVSSS5jcmVhdGVVUkkoTUFOSUZFU1RfVVJJKTsKLQlTdHJpbmcgTUFOSUZFU1RfU0hPUlRfTkFNRQkJCT0gCSJNQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvKiogIk1FVEEtSU5GIiAJCQkJCQkJCQkJCQkJCQkqLwotCVN0cmluZyBNRVRBX0lORgkJCQkJCT0JIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJAotCS8qKiAiV0VCLUlORiIgIAkJCQkJCQkJCQkJCQkJCSovCi0JU3RyaW5nIFdFQl9JTkYJCQkJCQk9IAkiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQkvKiogIkFMVC1JTkYiICAJCQkJCQkJCQkJCQkJCQkqLwotCVN0cmluZyBBTFRfSU5GCQkJCQkJPSAJIkFMVC1JTkYiOyAvLyROT04tTkxTLTEkCi0JLy9BcHBsaWNhdGlvbiBjbGllbnQgaW5mbwotCS8qKiAiQXBwbGljYXRpb24tY2xpZW50X0lEIiAgCQkJCQkJCQkJCQkqLwotCVN0cmluZyBBUFBfQ0xJRU5UX0lEICAgICAgIAkJCT0gICAiQXBwbGljYXRpb24tY2xpZW50X0lEIjsgLy8kTk9OLU5MUy0xJAotCS8qKiAiTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCIgIAkJCQkJCQkJCSovCi0JU3RyaW5nIEFQUF9DTElFTlRfRERfVVJJCQkJPSAJIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JVVJJIEFQUF9DTElFTlRfRERfVVJJX09CSgkJPSAJVVJJLmNyZWF0ZVVSSShBUFBfQ0xJRU5UX0REX1VSSSk7Ci0JLyoqICJhcHBsaWNhdGlvbi1jbGllbnQueG1sIiAgCQkJCQkJCQkJCQkqLwotCVN0cmluZyBBUFBfQ0xJRU5UX0REX1NIT1JUX05BTUUJCT0gCSJhcHBsaWNhdGlvbi1jbGllbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBEb2MgdHlwZSBmb3IgYXBwIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzICovCi0JU3RyaW5nIEFQUF9DTElFTlRfRE9DVFlQRSAJCQk9IAkiYXBwbGljYXRpb24tY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMgkJPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4yLy9FTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVBQX0NMSUVOVF9QVUJMSUNJRF8xXzMJCT0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMy8vRU4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFQUF9DTElFTlRfU1lTVEVNSURfMV8yCQk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb24tY2xpZW50XzFfMi5kdGQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFQUF9DTElFTlRfU1lTVEVNSURfMV8zCQk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFQUF9DTElFTlRfU0NIRU1BXzFfNCAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCI7Ly8kTk9OLU5MUy0xJAotCQotCQotCS8vQXBwbGljYXRpb24gY29uc3RhbnRzCi0JLyoqICJBcHBsaWNhdGlvbl9JRCIJCQkJCQkJCQkJCQkJKi8KLQlTdHJpbmcgQVBQTF9JRAkJCQkJCT0JIkFwcGxpY2F0aW9uX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8qKiAiTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIiAJCQkJCQkJCQkJCSovCi0JU3RyaW5nIEFQUExJQ0FUSU9OX0REX1VSSQkJCT0JIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlVUkkgQVBQTElDQVRJT05fRERfVVJJX09CSgkJCT0gCVVSSS5jcmVhdGVVUkkoQVBQTElDQVRJT05fRERfVVJJKTsKLQkvKiogImFwcGxpY2F0aW9uLnhtbCIgCQkJCQkJCQkJCQkJCSovCi0JU3RyaW5nIEFQUExJQ0FUSU9OX0REX1NIT1JUX05BTUUJPQkiYXBwbGljYXRpb24ueG1sIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFQVJfRklMRV9FWFQgPSAiLmVhciI7IC8vLy8kTk9OLU5MUy0xJAotCS8qKiBEb2MgdHlwZSBmb3IgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyAqLwotCVN0cmluZyBBUFBMSUNBVElPTl9ET0NUWVBFIAkJCT0gCSJhcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVBQTElDQVRJT05fUFVCTElDSURfMV8yCQk9ICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMi8vRU4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMwkJPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBUFBMSUNBVElPTl9QVUJMSUNJRF8xXzQJCT0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS40Ly9FTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVBQTElDQVRJT05fU1lTVEVNSURfMV8yCQk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb25fMV8yLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVBQTElDQVRJT05fU1lTVEVNSURfMV8zCQk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVBQTElDQVRJT05fU1lTVEVNSURfMV80CQk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV80LmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVBQTElDQVRJT05fU0NIRU1BXzFfNCAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIjsvLyROT04tTkxTLTEkCi0JCi0JLy9FSkIgSmFyIENvbnN0YW50cwotCS8qKiAiZWpiLWphcl9JRCIJCQkJCQkJCQkJCQkJCSovCi0JU3RyaW5nIEVKQkpBUl9JRAkJCQkJPQkiZWpiLWphcl9JRCI7IC8vJE5PTi1OTFMtMSQKLQkvKiogIkFzc2VtYmx5RGVzY3JpcHRvcl9JRCIJCQkJCQkJCQkJCQkqLwotCVN0cmluZyBBU1NFTUJMWURFU0NSSVBUT1JfSUQJCT0gICAiQXNzZW1ibHlEZXNjcmlwdG9yX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8qKiAiZWpiLWphci54bWwiCQkJCQkJCQkJCQkJCQkqLwotCVN0cmluZyBFSkJKQVJfRERfU0hPUlRfTkFNRQkJCT0JImVqYi1qYXIueG1sIjsgLy8kTk9OLU5MUy0xJAotCS8qKiAiTUVUQS1JTkYvZWpiLWphci54bWwiCQkJCQkJCQkJCQkJKi8KLQlTdHJpbmcgRUpCSkFSX0REX1VSSQkJCQk9CSJNRVRBLUlORi9lamItamFyLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlVUkkgRUpCSkFSX0REX1VSSV9PQkoJCQkJPSAJVVJJLmNyZWF0ZVVSSShFSkJKQVJfRERfVVJJKTsKLQkvKiogIk1FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkiCQkJCQkJCQkJCSovCi0JU3RyaW5nIEVKQkpBUl9ET0NUWVBFIAkJCQk9IAkiZWpiLWphciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCSkFSX1BVQkxJQ0lEXzFfMQkJPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCSkFSX1BVQkxJQ0lEXzJfMAkJPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCSkFSX1NZU1RFTUlEXzFfMQkJPSAJImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2VqYi1qYXJfMV8xLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCSkFSX1NZU1RFTUlEXzJfMAkJPSAJImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCSkFSX1NDSEVNQV8yXzEgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJKQVJfU0NIRU1BXzJfMV9OUyAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotCQotCS8vV2ViIGFwcCBDb25zdGFudHMKLQkvKiogIldlYkFwcF9JRCIJCQkJCQkJCQkJCQkJCQkqLwotCVN0cmluZyBXRUJBUFBfSUQJCQkJCT0gIAkiV2ViQXBwX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8qKiAiV0VCLUlORi93ZWIueG1sIgkJCQkJCQkJCQkJCQkqLwotCVN0cmluZyBXRUJBUFBfRERfVVJJCQkJCT0gCSJXRUItSU5GL3dlYi54bWwiOyAvLyROT04tTkxTLTEkCi0JVVJJIFdFQkFQUF9ERF9VUklfT0JKCQkJCT0gCVVSSS5jcmVhdGVVUkkoV0VCQVBQX0REX1VSSSk7Ci0JLyoqICJ3ZWIueG1sIgkJCQkJCQkJCQkJCQkJCSovCi0JU3RyaW5nIFdFQkFQUF9ERF9TSE9SVF9OQU1FCQkJPSAJIndlYi54bWwiOyAvLyROT04tTkxTLTEkCi0JLyoqICJXRUItSU5GL2libS13ZWItYm5kLnhtaSIJCQkJCQkJCQkJCSovCi0JLyoqIERvYyB0eXBlIGZvciB3ZWIgYXBwIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgKi8KLQlTdHJpbmcgV0VCQVBQX0RPQ1RZUEUgCQkJCT0gCSJ3ZWItYXBwIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05URVhUUk9PVCAJCQkJCT0gImNvbnRleHQtcm9vdCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgV0VCQVBQX1BVQkxJQ0lEXzJfMgkJPSAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQkFQUF9QVUJMSUNJRF8yXzMJCT0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUJBUFBfU1lTVEVNSURfMl8yCQk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yXzIuZHRkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUJBUFBfQUxUX1NZU1RFTUlEXzJfMgk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yLjIuZHRkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUJBUFBfU1lTVEVNSURfMl8zCQk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUJBUFBfU0NIRU1BXzJfNCAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIjsvLyROT04tTkxTLTEkCi0JLy9KMkMgUmVzb3VyY2UgQWRhcHRlciBDb25zdGFudHMKLQkvKiogIkoyQ1Jlc291cmNlQWRhcHRlcl9JRCIJCQkJCQkJCQkJCQkqLwotCVN0cmluZyBSQVJfSUQJCQkJCQk9ICAJIkoyQ1Jlc291cmNlQWRhcHRlcl9JRCI7IC8vJE5PTi1OTFMtMSQKLQkvKiogIk1FVEEtSU5GL3JhLnhtbCIJCQkJCQkJCQkJCQkJKi8KLQlTdHJpbmcgUkFSX0REX1VSSQkJCQkJPSAJIk1FVEEtSU5GL3JhLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlVUkkgUkFSX0REX1VSSV9PQkoJCQkJCT0gCVVSSS5jcmVhdGVVUkkoUkFSX0REX1VSSSk7Ci0JU3RyaW5nIFJBUl9TSE9SVF9OQU1FCQkJCT0JInJhLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkvL05lZWQgY29ubmVjdG9yIGNvbnN0YW50LgotCVN0cmluZyBDT05ORUNUT1JfSUQJCQkJCT0JIkNvbm5lY3Rvcl9JRCI7IC8vJE5PTi1OTFMtMSQKLQkvKiogRG9jIHR5cGUgZm9yIGNvbm5lY3RvciBkZXBsb3ltZW50IGRlc2NyaXB0b3JzICovCi0JU3RyaW5nIENPTk5FQ1RPUl9ET0NUWVBFIAkJCT0gCSJjb25uZWN0b3IiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTk5FQ1RPUl9QVUJMSUNJRF8xXzAJCT0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05ORUNUT1JfU1lTVEVNSURfMV8wCQk9IAkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTk5FQ1RPUl9TQ0hFTUFfMV81ICAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiOy8vJE5PTi1OTFMtMSQKLQkKLQkvL1dlYiBTZXJ2aWNlcyBDb25zdGFudHMKLQkvKiogRG9jIHR5cGUgZm9yIHdlYnNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgKi8KLQlTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9ET0NUWVBFICAJPSAid2Vic2VydmljZXNjbGllbnQiOyAJLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX1BVQkxJQ0lEXzFfMCA9ICItLy9JQk0gQ29ycG9yYXRpb24sIEluYy4vL0RURCBKMkVFIFdlYiBzZXJ2aWNlcyBjbGllbnQgMS4wLy9FTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9TWVNURU1JRF8xXzAgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQJCi0JU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfTE9DXzFfMSA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSAgICA9ICJ3ZWJzZXJ2aWNlc2NsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfRERfVVJJCQkJPSAJIndlYnNlcnZpY2VzY2xpZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9NRVRBX0lORl9ERF9VUkkJPSAgICJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfV0VCX0lORl9ERF9VUkkJPSAgICJXRUItSU5GL3dlYnNlcnZpY2VzY2xpZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlVUkkgV0VCX1NFUlZJQ0VTX0NMSUVOVF9ERF9VUklfT0JKCQkJPSAJVVJJLmNyZWF0ZVVSSShXRUJfU0VSVklDRVNfQ0xJRU5UX0REX1VSSSk7Ci0JVVJJIFdFQl9TRVJWSUNFU19DTElFTlRfTUVUQV9JTkZfRERfVVJJX09CSgk9IAlVUkkuY3JlYXRlVVJJKFdFQl9TRVJWSUNFU19DTElFTlRfTUVUQV9JTkZfRERfVVJJKTsKLQlVUkkgV0VCX1NFUlZJQ0VTX0NMSUVOVF9XRUJfSU5GX0REX1VSSV9PQkoJPSAJVVJJLmNyZWF0ZVVSSShXRUJfU0VSVklDRVNfQ0xJRU5UX1dFQl9JTkZfRERfVVJJKTsKLQkKLQlTdHJpbmcgV0VCX1NFUlZJQ0VTX0REX1VSSQkJCT0gCSJ3ZWJzZXJ2aWNlcy54bWwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQl9TRVJWSUNFU19NRVRBX0lORl9ERF9VUkkJPSAgICJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQl9TRVJWSUNFU19XRUJfSU5GX0REX1VSSQk9ICAgIldFQi1JTkYvd2Vic2VydmljZXMueG1sIjsgLy8kTk9OLU5MUy0xJAotCVVSSSBXRUJfU0VSVklDRVNfRERfVVJJX09CSgkJCT0gCVVSSS5jcmVhdGVVUkkoV0VCX1NFUlZJQ0VTX0REX1VSSSk7Ci0JVVJJIFdFQl9TRVJWSUNFU19NRVRBX0lORl9ERF9VUklfT0JKCT0gVVJJLmNyZWF0ZVVSSShXRUJfU0VSVklDRVNfTUVUQV9JTkZfRERfVVJJKTsKLQlVUkkgV0VCX1NFUlZJQ0VTX1dFQl9JTkZfRERfVVJJX09CSgk9IAlVUkkuY3JlYXRlVVJJKFdFQl9TRVJWSUNFU19XRUJfSU5GX0REX1VSSSk7Ci0JCi0JLy9NaXNjZWxsYW5lb3VzIGNvbnN0YW50cwotCS8qKiAiVVRGLTgiCQkJCQkJCQkJCQkJCQkJCSovCi0JU3RyaW5nIERFRkFVTFRfWE1MX0VOQ09ESU5HIAkJPSAJIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCS8qKiAiMS4wIgkJCQkJCQkJCQkJCQkJCQkqLwotCVN0cmluZyBERUZBVUxUX1hNTF9WRVJTSU9OCQkJPSAJIjEuMCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9TVU5fQ09NX1VSTAkJCQk9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdXV19XM19PUkdfVVJMCQkJCT0gICAiaHR0cDovL3d3dy53My5vcmciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdXV19JQk1fQ09NX1VSTAkJCQk9ICAgImh0dHA6Ly93d3cuaWJtLmNvbSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgSjJFRV9OU19VUkwgCQkJCQkJPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSjJFRV8xXzRfWFNEX1NIT1JUX05BTUUJCQk9ICJqMmVlXzFfNC54c2QiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhTSV9OU19VUkwgCQkJCQkJPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFQUExJQ0FUSU9OX1NDSEVNQV9MT0NfMV80IAk9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFQUF9DTElFTlRfU0NIRU1BX0xPQ18xXzQgCT0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9KQVJfU0NIRU1BX0xPQ18yXzEJCT0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05ORUNUT1JfU0NIRU1BX0xPQ18xXzUJCT0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQl9BUFBfU0NIRU1BX0xPQ18yXzQJCT0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UX1NDSEVNQV9MT0NfMV8xID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9TQ0hFTUFfTE9DXzJfMAkJCT0gICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2pzcF8yXzAueHNkIjsgLy8kTk9OLU5MUy0xJAotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUluaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVJbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTg0Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25SZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbC5FSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFWE1JUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkFwcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkVuY29kZXJEZWNvZGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5QYXNzd29yZEVuY29kZXJEZWNvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMy8yMDAwIDM6MDc6MzcgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFSW5pdCB7Ci0JCi0JCi0Jc3RhdGljIHsKLQkJdHJ5IHsgCi0JCQlpZihCb29sZWFuLmdldEJvb2xlYW4oIkxPR19YRVJDRVNfVkVSU0lPTiIpKSB7CQkJCSAvLyROT04tTkxTLTEkCi0JCQkJQ2xhc3MgY2x6ID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUueGVyY2VzLmltcGwuVmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJTWV0aG9kIG1haW4gPSBjbHouZ2V0RGVjbGFyZWRNZXRob2QoIm1haW4iLCBuZXcgQ2xhc3NbXSB7IFN0cmluZ1tdLmNsYXNzIH0gKTsgLy8kTk9OLU5MUy0xJAotCQkJCU9iamVjdCB2ZXJzaW9uID0gY2x6Lm5ld0luc3RhbmNlKCk7Ci0JCQkJbWFpbi5pbnZva2UodmVyc2lvbiwgbmV3IE9iamVjdFtdIHsgbmV3IFN0cmluZ1tdIHt9IH0pOyAKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2x6LmdldFJlc291cmNlKCJWZXJzaW9uLmNsYXNzIikpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gd2hpbGUgbG9nZ2luZyB2ZXJzaW9uICIgKyB0KTsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gCi0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwbHVnaW5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJaW5pdCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChib29sZWFuIHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCk7Ci0JCQlET01VdGlsaXRpZXMuc2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5JTlNUQU5DRSk7Ci0JCQlvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbml0LkphdmFJbml0LmluaXQoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcyk7Ci0JCQlpZiAoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykKLQkJCQlwcmVSZWdpc3RlclBhY2thZ2VzKCk7Ci0JCQlpbml0UmVzb3VyY2VGYWN0b3JpZXMoKTsKLQkJCUVqYkZhY3RvcnlJbXBsLmludGVybmFsUmVnaXN0ZXJFSkJSZWxhdGlvbkFkYXB0ZXJGYWN0b3J5KG5ldyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IoKSB7Ci0JCQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQkJCQlyZXR1cm4gbmV3IEVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUVqYkZhY3RvcnlJbXBsLmludGVybmFsUmVnaXN0ZXJSZWxhdGlvbnNoaXBzQWRhcHRlckZhY3RvcnkobmV3IEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcigpIHsKLQkJCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQkJCXJldHVybiBuZXcgRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbCgpOwotCQkJCX0KLQkJCX0pOwotCQkJLy9UT0RPOiBSZW1vdmUgdGhpcyBsaW5lIGFmdGVyIFNFRCBBZGFwdGVyIGlzIHJlc3RvcmVkLgotCQkJUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQotCQl9Ci0JfQotCi0JLyoqIAotCSAqIElmIHRoZSBjdXJyZW50bHkgZGVmYXVsdGVkIGVuY29kZXIgaXMgdGhlIGluaXRpYWwgcGFzcyB0aHJ1IGVuY29kZXIsCi0JICogdGhlbiByZWdpc3RlciBhIFBhc3N3b3JkIGVuY29kZXIgZm9yIHNlY3VyaXR5OyBvdGhlcndpc2UgaWYgYSBtb3JlIHNvcGhpc3RpY2F0ZWQKLQkgKiBlbmNvZGVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgdGhlbiBkbyBub3RoaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCkgewotCQlFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IHJlZyA9IEVuY29kZXJEZWNvZGVyUmVnaXN0cnkuZ2V0RGVmYXVsdFJlZ2lzdHJ5KCk7Ci0JCWlmIChyZWcuZ2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCkgPT0gRW5jb2RlckRlY29kZXJSZWdpc3RyeS5JTklUSUFMX0RFRkFVTFRfRU5DT0RFUikgewotCQkJcmVnLnNldERlZmF1bHRFbmNvZGVyRGVjb2RlcihuZXcgUGFzc3dvcmRFbmNvZGVyRGVjb2RlcigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlUmVnaXN0ZXJQYWNrYWdlcygpIHsKLQkJLy9jb21tb24KLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJjb21tb24ueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL2FwcGxpY2F0aW9uCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgiYXBwbGljYXRpb24ueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vY2xpZW50Ci0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgiY2xpZW50LnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIENsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy93ZWJhcHBsaWNhdGlvbgotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoIndlYmFwcGxpY2F0aW9uLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL2VqYgotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoImVqYi54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vamNhCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgiamNhLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy93ZWJzZXJ2aWNlc2NsaWVudAotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoIndlYnNlcnZpY2VfY2xpZW50LnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwotCQkvL3dlYnNlcnZpY2VzY29tbW9uCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgid3Njb21tb24ueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JCS8vd2Vic2VydmljZXNkZAotCQlFeHRlbmRlZEVjb3JlVXRpbC5wcmVSZWdpc3RlclBhY2thZ2UoIndzZGQueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gV3NkZFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy9qYXhycGNtYXAKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJqYXhycGNtYXAueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwkJCi0vLwkJanNwCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgianNwLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JCQkJcmV0dXJuIEpzcFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJfQotCQl9KTsKLQkJLy90YWdsaWIKLQkJRXh0ZW5kZWRFY29yZVV0aWwucHJlUmVnaXN0ZXJQYWNrYWdlKCJ0YWdsaWIueG1pIiwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQlyZXR1cm4gVGFnbGliUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0pOwkKLQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRSZXNvdXJjZUZhY3RvcmllcygpIHsKLQkJLy9NYWtlIHByb3RlY3RlZAkKLQkJUmV2aXNpdC5yZXZpc2l0KCk7Ci0KLQkJLy8gT25seSByZWdpc3RlciB0aGUgZGVmYXVsdCBmYWN0b3JpZXMgaWYgYW5vdGhlciBzZXQgaGFzIG5vdAotCQkvLyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZC4KLQotCQlSZXNvdXJjZS5GYWN0b3J5IGoyZWUgPSBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUklfT0JKKTsKLQkJUmVzb3VyY2UuRmFjdG9yeSBkZWZhdWx0RmFjdCA9IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTikpOwotCQlpZiAoajJlZSA9PSBkZWZhdWx0RmFjdCkgewotCQkJRUpCSmFyUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlXZWJBcHBSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwotCQkJQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwotCQkJV3NkZFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwotCQkJLy9yZWdpc3RlcigpIGlzIG5vdCBjYWxsZWQgb24gdGhlIEpheHJwY21hcFJlc291cmNlRmFjdG9yeSBiZWNhdXNlCi0JCQkvL3RoZSBqYXhwcmMtbWFwcGluZyBkZXNjcmlwdG9yIGRvZXMgbm90IGhhdmUgYSBzdGFuZGFyZCBzaG9ydCBuYW1lLgotCQkJLy9UaGUgc2hvcnQgbmFtZXMgaGF2ZSB0byBiZSByZWdpc3RlcmVkIG9uY2UgdGhleSBhcmUga25vd24uCi0JCQlKMkVFWE1JUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCX0KLQkJRUpCSmFyUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlXZWJBcHBSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXJEdGRzKCk7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKLQkJQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCQlXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKLQkJV3NkZFJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKLQkJSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGx1Z2luSW5pdChib29sZWFuIGJQbHVnaW5Jbml0KSB7Ci0JCS8vIEhlcmUncyB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIGJlIHJlYWQuCi0JCXBsdWdpbl9pbml0aWFsaXplZCA9IGJQbHVnaW5Jbml0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNb2R1bGVFeHRlbnNpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNb2R1bGVFeHRlbnNpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4Yjg0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlRXh0ZW5zaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBKMkVFTW9kdWxlRXh0ZW5zaW9uSGVscGVyIHsKLQlTdHJpbmcgZ2V0RG9jVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU11bHRpU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTXVsdGlTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3OTkyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTXVsdGlTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqLwotcHVibGljIGNsYXNzIEoyRUVNdWx0aVN0YXR1cyBleHRlbmRzIEoyRUVTdGF0dXMgewotCXByaXZhdGUgSjJFRVN0YXR1c1tdIGNoaWxkcmVuID0gbmV3IEoyRUVTdGF0dXNbMF07Ci0KLQlwdWJsaWMgdm9pZCBhZGQoSjJFRVN0YXR1cyBzdGF0dXMpIHsKLQkJSjJFRVN0YXR1c1tdIHJlc3VsdCA9Ci0JCQluZXcgSjJFRVN0YXR1c1tjaGlsZHJlbi5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShjaGlsZHJlbiwgMCwgcmVzdWx0LCAwLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gc3RhdHVzOwotCQljaGlsZHJlbiA9IHJlc3VsdDsKLQkJaW50IG5ld1NldiA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpbnQgY3VycmVudFNldiA9IGdldFNldmVyaXR5KCk7Ci0JCS8qIElmIGFsbCB0aGUgc3RhdHVzZXMgYXJlIE5PVF9ORUVERUQgT1IgTk9UX1BPU1NJQkxFLCB5b3Ugd2FudCB0aGUgY29tYmluZWQgc3RhdHVzIHRvIGJlIHRoZSBoaWdoZXN0IHNldmVyaXR5Ci0JCSAqIGhvd2V2ZXIsIGlmIGFsbCBidXQgb25lIHN0YXR1cyBhcmUgTk9UX05FRURFRCBvciBOT1RfUE9TU0lCTEUsIGFuZCBvbmUgc3RhdHVzIGNvbXBsZXRlZCwgdGhlbiB0aGUgY29tYmluZWQgc3RhdHVzCi0JCSAqIHNob3VsZCBiZSBPSy4gIElmIHRoZXJlIGlzIGEgd2FybmluZyBvciBlcnJvciwgdGhlbiB0aGV5IHRha2UgcHJlY2VkZW5jZQotCQkgKi8KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxKQotCQkJc2V0U2V2ZXJpdHkobmV3U2V2KTsKLQkJZWxzZSBpZiAoY3VycmVudFNldiA+IENPTVBMRVRFRF9PSyAmJiBjdXJyZW50U2V2IDwgV0FSTklORyAmJiBuZXdTZXYgPT0gQ09NUExFVEVEX09LKQotCQkJc2V0U2V2ZXJpdHkobmV3U2V2KTsKLQkJZWxzZSBpZiAobmV3U2V2ID4gY3VycmVudFNldiAmJiAoY3VycmVudFNldiAhPSBDT01QTEVURURfT0sgfHwgbmV3U2V2ID49IFdBUk5JTkcpICkKLQkJCXNldFNldmVyaXR5KG5ld1Nldik7Ci0KLQl9Ci0JLyoqCi0JICogQWRkcyBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBzdGF0dXMgdG8gdGhpcyBtdWx0aS1zdGF0dXMuCi0JICogRG9lcyBub3RoaW5nIGlmIHRoZSBnaXZlbiBzdGF0dXMgaGFzIG5vIGNoaWxkcmVuICh3aGljaCBpbmNsdWRlcwotCSAqIHRoZSBjYXNlIHdoZXJlIGl0IGlzIG5vdCBhIG11bHRpLXN0YXR1cykuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgd2hvc2UgY2hpbGRyZW4gYXJlIHRvIGJlIGFkZGVkIHRvIHRoaXMgb25lCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWxsKEoyRUVTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSjJFRVN0YXR1c1tdIHN0YXR1c2VzID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZChzdGF0dXNlc1tpXSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSjJFRVN0YXR1c1tdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aVN0YXR1cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIE1lcmdlcyB0aGUgZ2l2ZW4gc3RhdHVzIGludG8gdGhpcyBtdWx0aS1zdGF0dXMuCi0JICogRXF1aXZhbGVudCB0byA8Y29kZT5hZGQoc3RhdHVzKTwvY29kZT4gaWYgdGhlCi0JICogZ2l2ZW4gc3RhdHVzIGlzIG5vdCBhIG11bHRpLXN0YXR1cy4gCi0JICogRXF1aXZhbGVudCB0byA8Y29kZT5hZGRBbGwoc3RhdHVzKTwvY29kZT4gaWYgdGhlCi0JICogZ2l2ZW4gc3RhdHVzIGlzIGEgbXVsdGktc3RhdHVzLiAKLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyB0byBtZXJnZSBpbnRvIHRoaXMgb25lCi0JICogQHNlZSAjYWRkCi0JICogQHNlZSAjYWRkQWxsCi0JICovCi0JcHVibGljIHZvaWQgbWVyZ2UoSjJFRVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIXN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCWFkZChzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJYWRkQWxsKHN0YXR1cyk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdHVzLCBzdWl0YWJsZSAKLQkgKiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1Zi5hcHBlbmQoIiBjaGlsZHJlbj17Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCWJ1Zi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1Zi5hcHBlbmQoY2hpbGRyZW5baV0udG9TdHJpbmcoKSk7Ci0JCX0KLQkJYnVmLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuaGVscGVyLkoyRUVTdGF0dXMjYXBwZW5kKEoyRUVTdGF0dXMpCi0JICovCi0JcHVibGljIEoyRUVTdGF0dXMgYXBwZW5kKEoyRUVTdGF0dXMgYVN0YXR1cykgewotCQlpZiAoYVN0YXR1cyAhPSBudWxsKQotCQkJbWVyZ2UoYVN0YXR1cyk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID09IDA7Ci0JfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVNwZWNpZmljYXRpb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVTcGVjaWZpY2F0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmRiZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVNwZWNpZmljYXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRVNwZWNpZmljYXRpb25Db25zdGFudHMgewotCVN0cmluZyBKMkVFX1ZFUlNJT05fMV8yID0gIkoyRUVfMS4yIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSjJFRV9WRVJTSU9OXzFfMyA9ICJKMkVFXzEuMyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEoyRUVfVkVSU0lPTl8xXzQgPSAiSjJFRV8xLjQiOyAgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIERFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0cgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiREVGQVVMVF9DT01QTEVURURfU1RBVFVTX01TRyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFRkFVTFRfTk9UX05FRURFRF9TVEFUVVNfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRFRkFVTFRfTk9UX05FRURFRF9TVEFUVVNfTVNHIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVGQVVMVF9OT1RfUE9TU0lCTEVfU1RBVFVTX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJERUZBVUxUX05PVF9QT1NTSUJMRV9TVEFUVVNfTVNHIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVGQVVMVF9FUlJPUl9TVEFUVVNfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRFRkFVTFRfRVJST1JfU1RBVFVTX01TRyIpOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFJFTU9WRURfTE9DQUxfQ0xJRU5UX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSRU1PVkVEX0xPQ0FMX0NMSUVOVF9NU0ciKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU1PVkVEX0FDQ0VTU19JTlRFTlRTX01TRyA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSRU1PVkVEX0FDQ0VTU19JTlRFTlRTX01TRyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTU9WRURfSVNPTEFUSU9OX0xFVkVMU19NU0cgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUkVNT1ZFRF9JU09MQVRJT05fTEVWRUxTX01TRyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRFRF9GSU5ERVJfTVNHID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNPTlZFUlRFRF9GSU5ERVJfTVNHIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVU5OQU1FRF9FSkIgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVU5OQU1FRF9FSkIiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05WRVJURURfUVVFUllfREVTQ1JJUFRJT04gPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ09OVkVSVEVEX1FVRVJZX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUlHUkFURURfREVGQVVMVF9EQVRBU09VUkNFX0pBUl9NU0cgPSBNT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTUlHUkFURURfREVGQVVMVF9EQVRBU09VUkNFX0pBUl9NU0ciKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfTVNHIAkgICA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfTVNHIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVJST1JfVEVYVCA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFUlJPUiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdBUk5JTkdfVEVYVCA9IE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5GT19URVhUID0gTU9GSjJFRVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIklORk8iKTsgLy8kTk9OLU5MUy0xJAotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVTdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MTE2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICoKLSAqLwotcHVibGljIGNsYXNzIEoyRUVTdGF0dXMgaW1wbGVtZW50cyBKMkVFU3BlY2lmaWNhdGlvbkNvbnN0YW50cyB7IAotICAgIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFRF9PSyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX05FRURFRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1BPU1NJQkxFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7IAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBKMkVFU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBKMkVFU3RhdHVzKENPTVBMRVRFRF9PSywgIiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKMkVFU3RhdHVzW10gRW1wdHlTdGF0dXNBcnJheSA9IG5ldyBKMkVFU3RhdHVzWzBdOwotCi0JcHJpdmF0ZSBpbnQgc2V2ZXJpdHk7Ci0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQlwcml2YXRlIFhNTFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgRU9iamVjdCB0YXJnZXRPYmplY3Q7Ci0JCi0JcHVibGljIEoyRUVTdGF0dXMoKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXB1YmxpYyBKMkVFU3RhdHVzKGludCBhU2V2ZXJpdHksIFN0cmluZyBhTWVzc2FnZSkgewotCQl0aGlzKGFTZXZlcml0eSwgKEVPYmplY3QpbnVsbCwgYU1lc3NhZ2UpOwotCX0KLQlwdWJsaWMgSjJFRVN0YXR1cyhpbnQgYVNldmVyaXR5LCBYTUxSZXNvdXJjZSB4bWxSZXNvdXJjZSkgewotCQl0aGlzKGFTZXZlcml0eSwgeG1sUmVzb3VyY2UsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSjJFRVN0YXR1cyhpbnQgYVNldmVyaXR5LCBFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCXRoaXMoYVNldmVyaXR5LCBhbk9iamVjdCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEoyRUVTdGF0dXMoaW50IGFTZXZlcml0eSwgWE1MUmVzb3VyY2UgeG1sUmVzb3VyY2UsIFN0cmluZyBhTWVzc2FnZSkgewotCQlzZXZlcml0eSA9IGFTZXZlcml0eTsKLQkJcmVzb3VyY2UgPSB4bWxSZXNvdXJjZTsKLQkJbWVzc2FnZSA9IGFNZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgSjJFRVN0YXR1cyhpbnQgYVNldmVyaXR5LCBFT2JqZWN0IGFuT2JqZWN0LCBTdHJpbmcgYU1lc3NhZ2UpIHsKLQkJc2V2ZXJpdHkgPSBhU2V2ZXJpdHk7Ci0JCXRhcmdldE9iamVjdCA9IGFuT2JqZWN0OwotCQltZXNzYWdlID0gYU1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBhUGF0dGVybiwgU3RyaW5nIGFyZzEpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGFQYXR0ZXJuLCBuZXcgU3RyaW5nW117YXJnMX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJbWVzc2FnZSA9IGNyZWF0ZURlZmF1bHRNZXNzYWdlKCk7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VGb3JEaXNwbGF5KCkgewotCQlyZXR1cm4gZ2V0U2V2ZXJpdHlUZXh0KCkrIiAiK2dldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNldmVyaXR5VGV4dCgpIHsKLQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJY2FzZSBFUlJPUjoKLQkJCQlyZXR1cm4gRVJST1JfVEVYVDsKLQkJCWNhc2UgV0FSTklORzoKLQkJCQlyZXR1cm4gV0FSTklOR19URVhUOwotCQkJY2FzZSBOT1RfTkVFREVEOgotCQkJY2FzZSBOT1RfUE9TU0lCTEU6Ci0JCQkJcmV0dXJuIElORk9fVEVYVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlRGVmYXVsdE1lc3NhZ2UuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVEZWZhdWx0TWVzc2FnZSgpIHsKLQkJU3RyaW5nIG9iakRlc2M7Ci0JCWlmIChnZXRSZXNvdXJjZSgpICE9IG51bGwpCi0JCQlvYmpEZXNjID0gZ2V0UmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQllbHNlIGlmIChnZXRUYXJnZXRPYmplY3QoKSAhPSBudWxsICYmIGdldFRhcmdldE9iamVjdCgpIGluc3RhbmNlb2YgRU5hbWVkRWxlbWVudCkKLQkJCW9iakRlc2MgPSAoKEVOYW1lZEVsZW1lbnQpIGdldFRhcmdldE9iamVjdCgpKS5nZXROYW1lKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCQlzd2l0Y2ggKGdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgQ09NUExFVEVEX09LIDoKLQkJCQlyZXR1cm4gZm9ybWF0KERFRkFVTFRfQ09NUExFVEVEX1NUQVRVU19NU0csIG9iakRlc2MpOwotCQkJY2FzZSBOT1RfTkVFREVEIDoKLQkJCQlyZXR1cm4gZm9ybWF0KERFRkFVTFRfTk9UX05FRURFRF9TVEFUVVNfTVNHLCBvYmpEZXNjKTsKLQkJCWNhc2UgTk9UX1BPU1NJQkxFIDoKLQkJCQlyZXR1cm4gZm9ybWF0KERFRkFVTFRfTk9UX1BPU1NJQkxFX1NUQVRVU19NU0csIG9iakRlc2MpOwotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJcmV0dXJuIGZvcm1hdChERUZBVUxUX0VSUk9SX1NUQVRVU19NU0csIG9iakRlc2MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1pZ3JhdGlvbiB3YXMgY29tcGxldGVkIGZpbmUgb3Igd2FzIG5vdCBuZWVkZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPSygpIHsKLQkJcmV0dXJuIHNldmVyaXR5ID09IENPTVBMRVRFRF9PSyB8fCBzZXZlcml0eSA9PSBOT1RfTkVFREVEOwotCX0KLQotCS8qKgotCSAqIEFuIGVycm9yIG9jdXJyZWQgZHVyaW5nIG1pZ3JhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gc2V2ZXJpdHkgPT0gRVJST1I7Ci0JfQotCQotCS8qKgotCSAqIEEgd2FybmluZyBvY3VycmVkIGR1cmluZyBtaWdyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQlyZXR1cm4gc2V2ZXJpdHkgPT0gV0FSTklORzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWlncmF0aW9uIHdhcyBub3QgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3ROZWVkZWQoKSB7Ci0JCXJldHVybiBzZXZlcml0eSA9PSBOT1RfTkVFREVEOwotCX0KLQkvKioKLQkgKiBUaGUgbWlncmF0aW9uIHdhcyBub3QgcG9zc2libGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3RQb3NzaWJsZSgpIHsKLQkJcmV0dXJuIHNldmVyaXR5ID09IE5PVF9QT1NTSUJMRTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V2ZXJpdHkuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2V2ZXJpdHkuCi0JICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCXB1YmxpYyBKMkVFU3RhdHVzW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBFbXB0eVN0YXR1c0FycmF5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlTdGF0dXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIFhNTFJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCXB1YmxpYyBFT2JqZWN0IGdldFRhcmdldE9iamVjdCgpIHsKLQkJcmV0dXJuIHRhcmdldE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJNaWdyYXRpb25TdGF0dXMgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNldmVyaXR5ID09IENPTVBMRVRFRF9PSykgewotCQkJYnVmLmFwcGVuZCgiQ29tcGxldGVkIE9LIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChzZXZlcml0eSA9PSBFUlJPUikgewotCQkJYnVmLmFwcGVuZCgiRVJST1IiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IFdBUk5JTkcpIHsKLQkJCWJ1Zi5hcHBlbmQoIldBUk5JTkciKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IE5PVF9ORUVERUQpIHsKLQkJCWJ1Zi5hcHBlbmQoIk5vdCBOZWVkZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNldmVyaXR5ID09IE5PVF9QT1NTSUJMRSkgewotCQkJYnVmLmFwcGVuZCgiTm90IFBvc3NpYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQoInNldmVyaXR5PSIpOyAvLyROT04tTkxTLTEkCi0JCQlidWYuYXBwZW5kKHNldmVyaXR5KTsKLQkJfQotCQlidWYuYXBwZW5kKCcgJyk7Ci0JCWJ1Zi5hcHBlbmQobWVzc2FnZSk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIHRoZSBwYXJhbWF0ZXIgdG8gdGhpcyBzdGF0dXMsIGFuZCByZXR1cm4gdGhlIHJlc3VsdGFudCBzdGF0dXM7Ci0JICogY2xpZW50cyBtdXN0IGJlIGNhcmVmdWwgdG8gc2V0IHRoZWlyIGNhY2hlZCBzdGF0dXMgdG8gdGhlIHJldHVybiB2YWx1ZSwgCi0JICogYXMgaXQgbWF5IGJlIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKMkVFU3RhdHVzIGFwcGVuZChKMkVFU3RhdHVzIGFTdGF0dXMpIHsKLQkJaWYgKGFTdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiB0aGlzOwotCQlKMkVFTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgSjJFRU11bHRpU3RhdHVzKCk7Ci0JCW11bHRpLm1lcmdlKHRoaXMpOwotCQltdWx0aS5tZXJnZShhU3RhdHVzKTsKLQkJcmV0dXJuIG11bHRpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVZlcnNpb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVWZXJzaW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTc3NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVZlcnNpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE2LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi0vKioKLSAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCB3aXRoIHRoZSBYTUxSZXNvdXJjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHsKLQlwdWJsaWMgaW50IEoyRUVfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBKMkVFXzFfM19JRCA9IDEzOwotCXB1YmxpYyBpbnQgSjJFRV8xXzRfSUQgPSAxNDsKLQlwdWJsaWMgaW50IEVKQl8xXzBfSUQgPSAxMDsJCi0JcHVibGljIGludCBFSkJfMV8xX0lEID0gMTE7CQotCXB1YmxpYyBpbnQgRUpCXzJfMF9JRCA9IDIwOwkKLQlwdWJsaWMgaW50IEVKQl8yXzFfSUQgPSAyMTsJCi0JcHVibGljIGludCBXRUJfMl8yX0lEID0gMjI7Ci0JcHVibGljIGludCBXRUJfMl8zX0lEID0gMjM7Ci0JcHVibGljIGludCBXRUJfMl80X0lEID0gMjQ7Ci0JcHVibGljIGludCBUQUdMSUJfMV8xX0lEID0gMTE7Ci0JcHVibGljIGludCBUQUdMSUJfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBUQUdMSUJfMl8wX0lEID0gMjA7Ci0JcHVibGljIGludCBKU1BfMV8xX0lEID0gMTE7Ci0JcHVibGljIGludCBKU1BfMV8yX0lEID0gMTI7Ci0JcHVibGljIGludCBKU1BfMl8wX0lEID0gMjA7Ci0JcHVibGljIGludCBTRVJWTEVUXzJfMiA9IDIyOwotCXB1YmxpYyBpbnQgU0VSVkxFVF8yXzMgPSAyMzsKLQlwdWJsaWMgaW50IFNFUlZMRVRfMl80ID0gMjQ7Ci0JcHVibGljIGludCBKQ0FfMV8wX0lEID0gMTA7Ci0JcHVibGljIGludCBKQ0FfMV81X0lEID0gMTU7Ci0JcHVibGljIGludCBXRUJTRVJWSUNFU18xXzBfSUQgPSAxMDsKLQlwdWJsaWMgaW50IFdFQlNFUlZJQ0VTXzFfMV9JRCA9IDExOwotCXB1YmxpYyBTdHJpbmcgSjJFRV8xXzRfVEVYVCAJCT0gIjEuNCI7IC8vJE5PTi1OTFMtMSQKLQkKLQotCXB1YmxpYyBpbnQgVkVSU0lPTl8xXzAgPSAxMDsJCi0JcHVibGljIGludCBWRVJTSU9OXzFfMSA9IDExOwkKLQlwdWJsaWMgaW50IFZFUlNJT05fMV8yID0gMTI7CQotCXB1YmxpYyBpbnQgVkVSU0lPTl8xXzMgPSAxMzsJCi0JcHVibGljIGludCBWRVJTSU9OXzFfNCA9IDE0OwotCXB1YmxpYyBpbnQgVkVSU0lPTl8xXzUgPSAxNTsKLQlwdWJsaWMgaW50IFZFUlNJT05fMl8wID0gMjA7Ci0JcHVibGljIGludCBWRVJTSU9OXzJfMSA9IDIxOwkKLQlwdWJsaWMgaW50IFZFUlNJT05fMl8yID0gMjI7CQotCXB1YmxpYyBpbnQgVkVSU0lPTl8yXzMgPSAyMzsJCi0JcHVibGljIGludCBWRVJTSU9OXzJfNCA9IDI0OwkKLQlwdWJsaWMgaW50IFZFUlNJT05fMl81ID0gMjU7IAotCQotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzBfVEVYVAkJPSAiMS4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzFfVEVYVCAgICAJPSAiMS4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzJfVEVYVAkJPSAiMS4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzNfVEVYVAkJPSAiMS4zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzRfVEVYVAkJPSAiMS40IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8xXzVfVEVYVAkJPSAiMS41IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzBfVEVYVAkJPSAiMi4wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzFfVEVYVAkJPSAiMi4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzJfVEVYVAkJPSAiMi4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzNfVEVYVAkJPSAiMi4zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzRfVEVYVAkJPSAiMi40IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzVfVEVYVAkJPSAiMi41IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01PRkoyRUVSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01PRkoyRUVSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5ZDllYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJtb2ZqMmVlIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQkJCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSAKLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkKLQl9Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JdHJ5IHtyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtyZXR1cm4gZ2V0U3RyaW5nKGtleSk7fQotCi19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQxMTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhNTFJlc291cmNlSGFuZGxlcjsKLQotCi0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIG5vbi1ydW50aW1lIGV4Y2VwdGlvbnMsIHdoZXJlIGEgY2F1Z2h0IGV4Y2VwdGlvbgotICogY2F1c2VzIHRoaXMgZXhjZXB0aW9uIHRvIGJlIHRocm93bgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKiogVGhlIGV4Y2VwdGlvbiB3aGljaCBuZWNlc3NpdGF0ZWQgdGhpcyBleGNlcHRpb24gKi8KLQlwcm90ZWN0ZWQgRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbjsKLQotcHVibGljIFdyYXBwZWRFeGNlcHRpb24oKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBXcmFwcGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIoKTsKLQlzZXROZXN0ZWRFeGNlcHRpb24oZSk7Ci19Ci1wdWJsaWMgV3JhcHBlZEV4Y2VwdGlvbihTdHJpbmcgcykgewotCXN1cGVyKHMpOwotfQotcHVibGljIFdyYXBwZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIocyk7Ci0Jc2V0TmVzdGVkRXhjZXB0aW9uKGUpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLSAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcygpIHsKLQlyZXR1cm4gRXhjZXB0aW9uSGVscGVyLmdldEFsbE1lc3NhZ2VzKHRoaXMpOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QsCi0gKiBjb25jYXRlbmF0ZWQgYXMgb25lCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkgewotCXJldHVybiBFeGNlcHRpb25IZWxwZXIuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXModGhpcyk7Ci19Ci1wdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXROZXN0ZWRFeGNlcHRpb24oKSB7Ci0JcmV0dXJuIG5lc3RlZEV4Y2VwdGlvbjsKLX0KLS8qKgotICogUHJpbnQgb3V0IGEgc3RhY2sgdHJhY2UgdG8gdGhlIHN5c3RlbSBlcnIuCi0gKi8KLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQlwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci19Ci0vKioKLSogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4KLSogSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLSovCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKSB7Ci0JaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCXMucHJpbnRsbih0aGlzKTsKLQkJcy5wcmludGxuKEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZSIpKTsgLy8kTk9OLU5MUy0xJCA9ICJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIKLQkJbmVzdGVkRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShzKTsKLQl9IGVsc2UgewotCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfQotfQotLyoqCi0qIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuCi0qIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0qLwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcykgewotCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotCQlzLnByaW50bG4odGhpcyk7Ci0JCXMucHJpbnRsbihKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2UiKSk7IC8vJE5PTi1OTFMtMSQgPSAiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiCi0JCW5lc3RlZEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfSBlbHNlIHsKLQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHNldE5lc3RlZEV4Y2VwdGlvbihqYXZhLmxhbmcuRXhjZXB0aW9uIG5ld05lc3RlZEV4Y2VwdGlvbikgewotCW5lc3RlZEV4Y2VwdGlvbiA9IG5ld05lc3RlZEV4Y2VwdGlvbjsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwMDE5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYTUxSZXNvdXJjZUhhbmRsZXI7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBJV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqIFRoZSBleGNlcHRpb24gd2hpY2ggbmVjZXNzaXRhdGVkIHRoaXMgcnVudGltZSBleGNlcHRpb24sIGlmIG9uZSBleGlzdHMgKi8KLQlwcm90ZWN0ZWQgRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbjsKLXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbigpIHsKLQlzdXBlcigpOwotfQotcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIoKTsKLQlzZXROZXN0ZWRFeGNlcHRpb24oZSk7Ci19Ci1wdWJsaWMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQlzdXBlcihzKTsKLX0KLXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcywgRXhjZXB0aW9uIGUpIHsKLQlzdXBlcihzKTsKLQlzZXROZXN0ZWRFeGNlcHRpb24oZSk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotICovCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCkgewotCXJldHVybiBFeGNlcHRpb25IZWxwZXIuZ2V0QWxsTWVzc2FnZXModGhpcyk7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwKLSAqIGNvbmNhdGVuYXRlZCBhcyBvbmUKLSAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSB7Ci0JcmV0dXJuIEV4Y2VwdGlvbkhlbHBlci5nZXRDb25jYXRlbmF0ZWRNZXNzYWdlcyh0aGlzKTsKLX0KLS8qKgotICogQHJldHVybiBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpIHsKLQlyZXR1cm4gbmVzdGVkRXhjZXB0aW9uOwotfQotLyoqCi0gKiBQcmludCBvdXQgYSBzdGFjayB0cmFjZSB0byB0aGUgc3lzdGVtIGVyci4KLSAqLwotcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotCXByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLX0KLS8qKgotKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLgotKiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotKi8KLXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpIHsKLQlpZiAobmVzdGVkRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJcy5wcmludGxuKHRoaXMpOwotCQlzLnByaW50bG4oSjJFRVhNTFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlIikpOyAvLyROT04tTkxTLTEkID0gIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246IgotCQluZXN0ZWRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHMpOwotCX0gZWxzZSB7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQl9Ci19Ci0vKioKLSogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4KLSogSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLSovCi1wdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7Ci0JaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCXMucHJpbnRsbih0aGlzKTsKLQkJcy5wcmludGxuKEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZSIpKTsgLy8kTk9OLU5MUy0xJCA9ICJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIKLQkJbmVzdGVkRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShzKTsKLQl9IGVsc2UgewotCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JfQotfQotLyoqCi0gKiBAcGFyYW0gbmV3TmVzdGVkRXhjZXB0aW9uIGphdmEubGFuZy5FeGNlcHRpb24KLSAqLwotcHVibGljIHZvaWQgc2V0TmVzdGVkRXhjZXB0aW9uKGphdmEubGFuZy5FeGNlcHRpb24gbmV3TmVzdGVkRXhjZXB0aW9uKSB7Ci0JbmVzdGVkRXhjZXB0aW9uID0gbmV3TmVzdGVkRXhjZXB0aW9uOwotfQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFVmVyc2lvblJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVZlcnNpb25SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjdjNjZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFVmVyc2lvblJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDb21tb24gSW50ZXJmYWNlIHVzZWQgdG8gY2hlY2sgdmVyc2lvbiBvZiBKMkVFIG1vZGVsIHJlc291cmNlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVWZXJzaW9uUmVzb3VyY2UgewotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpOwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlVmVyc2lvbklEKCk7Ci0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkYjBhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHJlcXVpcmVkIC0gY2hhbmdlIHRvIGV4dGVuZCBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFWE1JUmVzb3VyY2UgZXh0ZW5kcyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgSjJFRVZlcnNpb25SZXNvdXJjZXsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFWE1JUmVzb3VyY2UuCi0JICovCi0JcHVibGljIEoyRUVYTUlSZXNvdXJjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRVhNSVJlc291cmNlLgotCSAqIEBwYXJhbSB1cmkKLQkgKi8KLQlwdWJsaWMgSjJFRVhNSVJlc291cmNlKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2UjZ2V0SjJFRVZlcnNpb25JRCgpCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2UjZ2V0TW9kdWxlVmVyc2lvbklEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vZHVsZVZlcnNpb25JRCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2UjZ2V0VmVyc2lvbklEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVYTUlSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczMDhkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5OwotCi0KLQotCi0vKioKLSAqIEBhdXRob3IgbnNzaGV0aAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVYTUlSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBDb21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgSjJFRVhNSVJlc291cmNlRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBKMkVFWE1JUmVzb3VyY2VGYWN0b3J5KCk7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKCkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIElOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRVhNSVJlc291cmNlRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSjJFRVhNSVJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlKMkVFWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgSjJFRVhNSVJlc291cmNlKHVyaSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vWE1MUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9YTUxSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ0Y2UxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9YTUxSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFJlc291cmNlIGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlLCBKMkVFVmVyc2lvbkNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0NMSUVOVF9UWVBFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9UWVBFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkJfVFlQRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCX0FQUF9UWVBFID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQVJfVFlQRSA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCX1NFUlZJQ0VTX0NMSUVOVF9UWVBFID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURURfRVJST1JfTVNHID0gIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiI7IC8qKgotCSAqIElzIHRoaXMgYSByZXNvdXJjZSBsb2FkZWQgYXMgYW4gYWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KLQkgKi8KLQlib29sZWFuIGlzQWx0KCk7Ci0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCk7Ci0JcHVibGljIGludCBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCk7Ci0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCk7Ci0JLyoqCi0JICogVXNlZCBvbmx5IGlmIHRoaXMgcmVzb3VyY2UgaXMgYW4gYWx0OyByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGRlY2xhcmVzIGl0Ci0JICovCi0JQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKTsKLQotCXZvaWQgc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gbmV3QXBwbGljYXRpb24pOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFZlcnNpb25JRCgpfQotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlib29sZWFuIGlzSjJFRTFfMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIEoyRUUgWE1MUmVzb3VyY2UuCi0JICogWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiB1c2luZyBpbnN0YW5jZW9mLgotCSAqIEBzZWUgWE1MUmVzb3VyY2UjQVBQX0NMSUVOVF9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNBUFBMSUNBVElPTl9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNFSkJfVFlQRQotCSAqIEBzZWUgWE1MUmVzb3VyY2UjV0VCX0FQUF9UWVBFCi0JICogQHNlZSBYTUxSZXNvdXJjZSNSQVJfVFlQRQotCSAqLwotCWludCBnZXRUeXBlKCk7Ci0JIC8qKgotCSAqIElzIHRoaXMgYSByZXNvdXJjZSBsb2FkZWQgYXMgYW4gYWx0ZXJuYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KLQkgKi8KLQl2b2lkIHNldElzQWx0KGJvb2xlYW4gaXNBbHRlcm5hdGVERCk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0VmVyc2lvbklEKGludCl9LCAKLQkgKiB7QGxpbmsgVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoU3RyaW5nLCBTdHJpbmcpfQotCSAqIFNldHMgdGhlIHN5c3RlbSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBzZWUgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQl2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBpZCk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0VmVyc2lvbklEKGludCl9LAotCSAqIHtAbGluayBUcmFuc2xhdG9yUmVzb3VyY2Ujc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcsIFN0cmluZyl9Ci0JICogU2V0cyB0aGUgcHVibGljIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHNlZSBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXZvaWQgc2V0UHVibGljSWQoU3RyaW5nIGlkKTsKLQotCS8vVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB0byBzdXBwb3J0IFJlZmVyZW5jZWRSZXNvdXJjZSB3aXRob3V0IGhhdmluZyBhbiBhY3R1YWwKLQkvL1RoaXMgbWF5IGJlIGp1c3QgYSBzdWJzZXQgb2Ygd2hhdCBpcyBhdmFpbGFibGUgaW4gUmVmZXJlbmNlZFJlc291cmNlCi0Jdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uOwotCXZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpOwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0Jdm9pZCBwcmVEZWxldGUoKTsKLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0JYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0JYm9vbGVhbiBpc05ldygpOwotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQl2b2lkIGFjY2Vzc0ZvclJlYWQoKTsgCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vQXBwbGljYXRpb25UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWMwN2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vQXBwbGljYXRpb25UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBkZmhvbHR0cAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIEVhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvblRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgQXBwbGljYXRpb25UcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTQ7Ci0JcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25QYWNrYWdlIEFQUExJQ0FUSU9OX1BLRyA9IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCi0gICAgcHVibGljIEFwcGxpY2F0aW9uVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoQVBQTElDQVRJT04sIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxM0NoaWxkcmVuKCkgewotCQlyZXR1cm4gIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoSUNPTisiLyIrU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksIC8vJE5PTi1OTFMtMSQKLQkJCW5ldyBUcmFuc2xhdG9yKElDT04rIi8iK0xBUkdFX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLCAvLyROT04tTkxTLTEkCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBNb2R1bGVUcmFuc2xhdG9yKCksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTMoQVBQTElDQVRJT05fUEtHLmdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKSksCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxNENoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihWRVJTSU9OLCBBUFBMSUNBVElPTl9QS0cuZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpLCBET01fQVRUUklCVVRFKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TLCBKMkVFX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OU19YU0ksIFhTSV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYU0lfU0NIRU1BX0xPQ0FUSU9OLCBKMkVFX05TX1VSTCsnICcrQVBQTElDQVRJT05fU0NIRU1BX0xPQ18xXzQpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgTW9kdWxlVHJhbnNsYXRvcigpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlU2VjdXJpdHlSb2xlVHJhbnNsYXRvcjE0KEFQUExJQ0FUSU9OX1BLRy5nZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCkpLAotCQl9OwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9hcHBsaWNhdGlvbi9Nb2R1bGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL01vZHVsZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyOWNlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL01vZHVsZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVhZEFoZWFkSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXBwbGljYXRpb25QYWNrYWdlIEFQUExJQ0FUSU9OX1BLRyA9IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEFMVF9ERF9UUkFOU0xBVE9SID0gY3JlYXRlQWx0RERUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIFdFQl9UUkFOU0xBVE9SUyA9IGNyZWF0ZVdlYk1vZHVsZVRyYW5zbGF0b3JzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIEVKQl9UUkFOU0xBVE9SUyA9IGNyZWF0ZUVKQk1vZHVsZVRyYW5zbGF0b3JzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIEpBVkFfVFJBTlNMQVRPUlMgPSBjcmVhdGVKYXZhTW9kdWxlVHJhbnNsYXRvcnMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gQ09OTkVDVE9SX1RSQU5TTEFUT1JTID0gY3JlYXRlQ29ubmVjdG9yTW9kdWxlVHJhbnNsYXRvcnMoKTsKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsICAKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgTW9kdWxlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoTU9EVUxFLCBBUFBMSUNBVElPTl9QS0cuZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpKTsKLQkJYWRkUmVhZEFoZWFkSGVscGVyKG5ldyBSZWFkQWhlYWRIZWxwZXIoTU9EVUxFLCBuZXcgU3RyaW5nW10geyBFSkIsIEpBVkEsIFdFQiwgQ09OTkVDVE9SIH0sIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihDT05ORUNUT1IsIEFQUExJQ0FUSU9OX1BLRy5nZXRNb2R1bGVfVXJpKCkpLAotCQkJQUxUX0REX1RSQU5TTEFUT1IsCi0JCS8vCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEFQUExJQ0FUSU9OX1BLRy5nZXRNb2R1bGVfRXh0ZW5zaW9ucygpKQotCQl9OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY3JlYXRlSmF2YU1vZHVsZVRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBLCBBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX1VyaSgpKSwKLQkJCUFMVF9ERF9UUkFOU0xBVE9SLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX0V4dGVuc2lvbnMoKSkKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZUVKQk1vZHVsZVRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihFSkIsIEFQUExJQ0FUSU9OX1BLRy5nZXRNb2R1bGVfVXJpKCkpLAotCQkJQUxUX0REX1RSQU5TTEFUT1IsCi0JCS8vCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEFQUExJQ0FUSU9OX1BLRy5nZXRNb2R1bGVfRXh0ZW5zaW9ucygpKQotCQl9OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY3JlYXRlV2ViTW9kdWxlVHJhbnNsYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdFQiArICIvIiArIFdFQl9VUkksIEFQUExJQ0FUSU9OX1BLRy5nZXRNb2R1bGVfVXJpKCkpLCAvLyROT04tTkxTLTEkCi0JCQluZXcgVHJhbnNsYXRvcihXRUIgKyAiLyIgKyBDT05URVhUX1JPT1QsIEFQUExJQ0FUSU9OX1BLRy5nZXRXZWJNb2R1bGVfQ29udGV4dFJvb3QoKSksIC8vJE5PTi1OTFMtMSQKLQkJCUFMVF9ERF9UUkFOU0xBVE9SLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihBUFBMSUNBVElPTl9QS0cuZ2V0TW9kdWxlX0V4dGVuc2lvbnMoKSkKLQkJfTsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQWx0RERUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQUxUX0RELCBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldE1vZHVsZV9BbHRERCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKSAKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQkJZWxzZSBpZiAoKChNb2R1bGUpIG8pLmlzRWpiTW9kdWxlKCkpCi0JCQlyZXR1cm4gRUpCX1RSQU5TTEFUT1JTOwotCQllbHNlIGlmICgoKE1vZHVsZSkgbykuaXNDb25uZWN0b3JNb2R1bGUoKSkKLQkJCXJldHVybiBDT05ORUNUT1JfVFJBTlNMQVRPUlM7Ci0JCWVsc2UgaWYgKCgoTW9kdWxlKSBvKS5pc1dlYk1vZHVsZSgpKQotCQkJcmV0dXJuIFdFQl9UUkFOU0xBVE9SUzsKLQkJZWxzZSBpZiAoKChNb2R1bGUpIG8pLmlzSmF2YU1vZHVsZSgpKQotCQkJcmV0dXJuIEpBVkFfVFJBTlNMQVRPUlM7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBNb2R1bGUgVHlwZSBleGNlcHRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJQXBwbGljYXRpb25GYWN0b3J5IGZhY3QgPSBBcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFOwotCQlpZiAoRUpCLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZUVqYk1vZHVsZSgpOwotCQllbHNlIGlmIChXRUIuZXF1YWxzKHJlYWRBaGVhZE5hbWUpKQotCQkJcmV0dXJuIGZhY3QuY3JlYXRlV2ViTW9kdWxlKCk7Ci0JCWVsc2UgaWYgKEpBVkEuZXF1YWxzKHJlYWRBaGVhZE5hbWUpKQotCQkJcmV0dXJuIGZhY3QuY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotCQllbHNlIGlmIChDT05ORUNUT1IuZXF1YWxzKHJlYWRBaGVhZE5hbWUpKQotCQkJcmV0dXJuIGZhY3QuY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWN0LmNyZWF0ZU1vZHVsZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTWFuYWdlZEJ5UGFyZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jbGllbnQvQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQxYTczNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uRW52RW50cnlUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBBcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTEJBQ0tfSEFORExFUiA9ICJjYWxsYmFjay1oYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0NMSUVOVCA9ICJhcHBsaWNhdGlvbi1jbGllbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTQ7Ci0JCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50VHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoQVBQTElDQVRJT05fQ0xJRU5ULCBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudCgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCUNsaWVudFBhY2thZ2UgZVBhY2thZ2VDbGllbnQ9Q2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT05fUEFUSCwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBFbnZFbnRyeVRyYW5zbGF0b3IoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRW52aXJvbm1lbnRQcm9wcygpLCB0cnVlLCBmYWxzZSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjEzKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpKSwKLQkJCS8vSjJFRSAxLjMKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlRW52UmVmVHJhbnNsYXRvcjEzKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKENBTExCQUNLX0hBTkRMRVIsIGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCUNsaWVudFBhY2thZ2UgZVBhY2thZ2VDbGllbnQ9Q2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFZFUlNJT04sIGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK0FQUF9DTElFTlRfU0NIRU1BX0xPQ18xXzQpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgRW52RW50cnlUcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKSwgdHJ1ZSwgdHJ1ZSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTQoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IoZVBhY2thZ2VDbGllbnQuZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSZXNvdXJjZVJlZlRyYW5zbGF0b3IxNChlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSZXNvdXJjZUVudlJlZlRyYW5zbGF0b3IxNChlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZUcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihDQUxMQkFDS19IQU5ETEVSLCBlUGFja2FnZUNsaWVudC5nZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25UcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSksCi0JCS8vCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKGVQYWNrYWdlQ2xpZW50LmdldEFwcGxpY2F0aW9uQ2xpZW50X0RlcGxveW1lbnRFeHRlbnNpb25zKCkpCi0JCX07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZWViN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQm9vbGVhblRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBhZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEJvb2xlYW5UcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBCT09MRUFOX0xPV0VSQ0FTRSk7Ci0JfQotCi0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChzdHJWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCWlmICghQm9vbGVhbi52YWx1ZU9mKHN0clZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotCQkJaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCIxIikgfHwgc3RyVmFsdWUudG9VcHBlckNhc2UoKS5lcXVhbHMoIllFUyIpKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBCb29sZWFuLkZBTFNFOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9Db21tb25UcmFuc2xhdG9ycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQ29tbW9uVHJhbnNsYXRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MDUwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9Db21tb25UcmFuc2xhdG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkRlcGVuZGVuY3lUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEEgc3RhdGljIGhlbHBlciBmb3IgY3JlYXRpbmcgR2VuZXJpYyBjb21tb24gSjJFRSB0cmFuc2xhdG9ycwotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uVHJhbnNsYXRvcnMgaW1wbGVtZW50cyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIFdFQlNFUlZJQ0VfUEtHID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFTVBUWV9DSElMRFJFTiA9IG5ldyBUcmFuc2xhdG9yW10ge307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBFSkJfUkVGX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEVKQl9SRUZfTkFNRSwgQ09NTU9OX1BLRy5nZXRFamJSZWZfTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEVKQl9SRUZfVFlQRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRUpCX1JFRl9UWVBFLCBDT01NT05fUEtHLmdldEVqYlJlZl9UeXBlKCkpOwkJLy9FbnVtZXJhdGlvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRUpCX0xJTktfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEVKQl9MSU5LLCBDT01NT05fUEtHLmdldEVqYlJlZl9MaW5rKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUkVTX1JFRl9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihSRVNfUkVGX05BTUUsIENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VSZWZfTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFJFU19UWVBFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihSRVNfVFlQRSwgQ09NTU9OX1BLRy5nZXRSZXNvdXJjZVJlZl9UeXBlKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUkVTX0FVVEhfVFJBTlNMQVRPUiA9IG5ldyBSZXNBdXRoVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUkVTX1NIQVJJTkdfU0NPUEVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJFU19TSEFSSU5HX1NDT1BFLCBDT01NT05fUEtHLmdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFJFU19FTlZfUkVGX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJFU09VUkNFX0VOVl9SRUZfTkFNRSwgQ09NTU9OX1BLRy5nZXRSZXNvdXJjZUVudlJlZl9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUkVTX0VOVl9SRUZfVFlQRV9UUkFOU0xBVE9SID0gbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoUkVTT1VSQ0VfRU5WX1JFRl9UWVBFLCBDT01NT05fUEtHLmdldFJlc291cmNlRW52UmVmX1R5cGUoKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBTRUNfUkVGX1JPTEVfTkFNRV9UUkFOU0FMVE9SID0gbmV3IFRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZVJlZl9OYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgU0VDX1JFRl9ST0xFX0xJTktfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJPTEVfTElOSywgQ09NTU9OX1BLRy5nZXRTZWN1cml0eVJvbGVSZWZfTGluaygpKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFJVTkFTX1JPTEVfTkFNRV9UUkFOU0xBVE9SID0gbmV3IERlcGVuZGVuY3lUcmFuc2xhdG9yKFJPTEVfTkFNRSwgQ09NTU9OX1BLRy5nZXRJZGVudGl0eV9Sb2xlTmFtZSgpLCBDT01NT05fUEtHLmdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfSWRlbnRpdHkoKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBTRUNVUklUWV9ST0xFX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJPTEVfTkFNRSwgQ09NTU9OX1BLRy5nZXRTZWN1cml0eVJvbGVfUm9sZU5hbWUoKSk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIERFU0NSSVBUSU9OU19UUkFOU0xBVE9SID0gY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIERJU1BMQVlOQU1FU19UUkFOU0xBVE9SID0gY3JlYXRlRGlzcGxheU5hbWVUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIElDT05TX1RSQU5TTEFUT1IgPSBjcmVhdGVJY29uVHJhbnNsYXRvcigpOwotCQotCS8vVGhlIE9mZmljaWFsIENvbmNlcHQgb2YgSk5ESUVudlJlZkdyb3VwIEZPUiBKMkVFIDEuNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV80ID0gbmV3IEVudkVudHJ5VHJhbnNsYXRvcihDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCksIHRydWUsIHRydWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9FSkJfUkVGXzFfNCA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxNChDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzQgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJMb2NhbFJlZlRyYW5zbGF0b3IxNChDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRWpiTG9jYWxSZWZzKCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9TRVJWSUNFX1JFRl8xXzQgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZXJ2aWNlUmVmR3JvdXBUcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9TZXJ2aWNlUmVmcygpKTsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX1JFU09VUkNFX1JFRl8xXzQgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSZXNvdXJjZVJlZlRyYW5zbGF0b3IxNChDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfUmVzb3VyY2VSZWZzKCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9FTlZfUkVGXzFfNCA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlRW52UmVmVHJhbnNsYXRvcjE0KENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX01FU1NBR0VfREVTVF9SRUZfMV80ID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmVHJhbnNsYXRvcihDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkKLQkvL1RoZSB1bm9mZmljaWFsIGNvbmNlcHQgb2YgSk5ESUVudlJlZkdyb3VwIEZPUiBKMkVFIDEuMwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV8zID0gbmV3IEVudkVudHJ5VHJhbnNsYXRvcihDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCksIHRydWUsIGZhbHNlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzMgPSBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoQ09NTU9OX1BLRy5nZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEpORElfUkVGX0dST1VQX0VKQl9MT0NBTF9SRUZfMV8zID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRUpCTG9jYWxSZWZUcmFuc2xhdG9yMTMoQ09NTU9OX1BLRy5nZXRKTkRJRW52UmVmc0dyb3VwX0VqYkxvY2FsUmVmcygpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfMyA9ICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVSZXNvdXJjZVJlZlRyYW5zbGF0b3IxMyhDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfUmVzb3VyY2VSZWZzKCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBKTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9FTlZfUkVGXzFfMyA9IENvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJlc291cmNlRW52UmVmVHJhbnNsYXRvcjEzKENPTU1PTl9QS0cuZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZUVudlJlZnMoKSk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIExJU1RFTkVSX0NMQVNTX1RSQU5TTEFUT1IgPSBuZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihMSVNURU5FUl9DTEFTUywgQ09NTU9OX1BLRy5nZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCkpOwotCQotCXByaXZhdGUgQ29tbW9uVHJhbnNsYXRvcnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVJvbGVSZWZUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpKSwgCi0JCQlTRUNfUkVGX1JPTEVfTkFNRV9UUkFOU0FMVE9SLCAKLQkJCVNFQ19SRUZfUk9MRV9MSU5LX1RSQU5TTEFUT1IgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VjdXJpdHlSb2xlUmVmVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfUk9MRV9SRUYsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCkpLCAKLQkJCVNFQ19SRUZfUk9MRV9OQU1FX1RSQU5TQUxUT1IsCi0JCQlTRUNfUkVGX1JPTEVfTElOS19UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUmVzb3VyY2VFbnZSZWZUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFX0VOVl9SRUYsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsIAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb24oKSksIAotCQkJUkVTX0VOVl9SRUZfTkFNRV9UUkFOU0xBVE9SLCAKLQkJCVJFU19FTlZfUkVGX1RZUEVfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlc291cmNlRW52UmVmVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRVNPVVJDRV9FTlZfUkVGLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLCAKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT01NT05fUEtHLmdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpKSwgCi0JCQlSRVNfRU5WX1JFRl9OQU1FX1RSQU5TTEFUT1IsIAotCQkJUkVTX0VOVl9SRUZfVFlQRV9UUkFOU0xBVE9SLAotCQkJLy9KMkVFMS40IEFkZGVkCi0JCS8vCWNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VFbnZSZWZfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlc291cmNlUmVmVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRVNPVVJDRV9SRUYsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCQkKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9uKCkpLAotCQkJUkVTX1JFRl9OQU1FX1RSQU5TTEFUT1IsCi0JCQlSRVNfVFlQRV9UUkFOU0xBVE9SLAotCQkJUkVTX0FVVEhfVFJBTlNMQVRPUiwKLQkJCS8vRUpCIDIuMCBBZGRlZAotCQkJUkVTX1NIQVJJTkdfU0NPUEVfVFJBTlNMQVRPUiwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSZXNvdXJjZVJlZlRyYW5zbGF0b3IxNChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFX1JFRiwgZmVhdHVyZSk7Ci0JCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAkJCi0JCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCkpLAotCQkJCVJFU19SRUZfTkFNRV9UUkFOU0xBVE9SLAotCQkJCVJFU19UWVBFX1RSQU5TTEFUT1IsCi0JCQkJUkVTX0FVVEhfVFJBTlNMQVRPUiwKLQkJCQkvL0VKQiAyLjAgQWRkZWQKLQkJCQlSRVNfU0hBUklOR19TQ09QRV9UUkFOU0xBVE9SLAotCQkJCi0JCQkJLy9KMkVFMS40IEFkZGVkCi0JCQkvLwljcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihDT01NT05fUEtHLmdldFJlc291cmNlUmVmX0V4dGVuc2lvbnMoKSkKLQkJCX0pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX1JPTEUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb24oKSksIAotCQkJU0VDVVJJVFlfUk9MRV9OQU1FX1RSQU5TTEFUT1IgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VjdXJpdHlSb2xlVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfUk9MRSwgZmVhdHVyZSk7Ci0JCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT01NT05fUEtHLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSksIAotCQkJCVNFQ1VSSVRZX1JPTEVfTkFNRV9UUkFOU0xBVE9SIAotCQkJfSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjEzKGZlYXR1cmUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUVKQkxvY2FsUmVmVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTMoZmVhdHVyZSwgdHJ1ZSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBib29sZWFuIGxvY2FsKSB7Ci0JCVN0cmluZyBub2RlTmFtZSA9IGxvY2FsID8gRUpCX0xPQ0FMX1JFRiA6IEVKQl9SRUY7Ci0JCVN0cmluZyBob21lVGFnID0gbG9jYWwgPyBMT0NBTF9IT01FIDogSE9NRTsKLQkJU3RyaW5nIHJlbW90ZVRhZyA9IGxvY2FsID8gTE9DQUwgOiBSRU1PVEU7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBob21lRmVhdHVyZSA9IGxvY2FsID8gQ09NTU9OX1BLRy5nZXRFSkJMb2NhbFJlZl9Mb2NhbEhvbWUoKSA6IENPTU1PTl9QS0cuZ2V0RWpiUmVmX0hvbWUoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBsb2NhbCA/IENPTU1PTl9QS0cuZ2V0RUpCTG9jYWxSZWZfTG9jYWwoKSA6IENPTU1PTl9QS0cuZ2V0RWpiUmVmX1JlbW90ZSgpOwotCQkKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKG5vZGVOYW1lLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAkJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldEVqYlJlZl9EZXNjcmlwdGlvbigpKSwKLQkJCUVKQl9SRUZfTkFNRV9UUkFOU0xBVE9SLAotCQkJRUpCX1JFRl9UWVBFX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihob21lVGFnLCBob21lRmVhdHVyZSksCi0JCQluZXcgVHJhbnNsYXRvcihyZW1vdGVUYWcsIHJlbW90ZUZlYXR1cmUpLAotCQkJRUpCX0xJTktfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUVKQlJlZlRyYW5zbGF0b3IxNChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjE0KGZlYXR1cmUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUVKQkxvY2FsUmVmVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBjcmVhdGVFSkJSZWZUcmFuc2xhdG9yMTQoZmVhdHVyZSwgdHJ1ZSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVmVHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBib29sZWFuIGxvY2FsKSB7Ci0JCVN0cmluZyBub2RlTmFtZSA9IGxvY2FsID8gRUpCX0xPQ0FMX1JFRiA6IEVKQl9SRUY7Ci0JCVN0cmluZyBob21lVGFnID0gbG9jYWwgPyBMT0NBTF9IT01FIDogSE9NRTsKLQkJU3RyaW5nIHJlbW90ZVRhZyA9IGxvY2FsID8gTE9DQUwgOiBSRU1PVEU7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBob21lRmVhdHVyZSA9IGxvY2FsID8gQ09NTU9OX1BLRy5nZXRFSkJMb2NhbFJlZl9Mb2NhbEhvbWUoKSA6IENPTU1PTl9QS0cuZ2V0RWpiUmVmX0hvbWUoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBsb2NhbCA/IENPTU1PTl9QS0cuZ2V0RUpCTG9jYWxSZWZfTG9jYWwoKSA6IENPTU1PTl9QS0cuZ2V0RWpiUmVmX1JlbW90ZSgpOwotCQkKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKG5vZGVOYW1lLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAkJCQkKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT01NT05fUEtHLmdldEVqYlJlZl9EZXNjcmlwdGlvbnMoKSksCi0JCQlFSkJfUkVGX05BTUVfVFJBTlNMQVRPUiwKLQkJCUVKQl9SRUZfVFlQRV9UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoaG9tZVRhZywgaG9tZUZlYXR1cmUpLAotCQkJbmV3IFRyYW5zbGF0b3IocmVtb3RlVGFnLCByZW1vdGVGZWF0dXJlKSwKLQkJCUVKQl9MSU5LX1RSQU5TTEFUT1IsCi0JCS8vCWNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0RWpiUmVmX0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSdW5Bc1RyYW5zbGF0b3IxMyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUlVOX0FTLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpKSwKLQkJCS8vbmV3IERlcGVuZGVuY3lUcmFuc2xhdG9yKERFUywpCi0JCQlSVU5BU19ST0xFX05BTUVfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSdW5Bc1RyYW5zbGF0b3IxNChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUlVOX0FTLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSksCi0JCQlSVU5BU19ST0xFX05BTUVfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyAgVHJhbnNsYXRvciBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZUcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKXsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9SRUYsZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT01NT05fUEtHLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihNRVNTQUdFX0RFU1RfUkVGX05BTUUsQ09NTU9OX1BLRy5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9UWVBFLENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1R5cGUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihNRVNTQUdFX0RFU1RfVVNBR0UsQ09NTU9OX1BLRy5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVXNhZ2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihNRVNTQUdFX0RFU1RfTElOSyxDT01NT05fUEtHLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9MaW5rKCkpLAotCQkJLy9jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihDT01NT05fUEtHLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9FeHRlbnNpb25zKCkpCQotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljICBUcmFuc2xhdG9yIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVTU0FHRV9ERVNULGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCURJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9OQU1FLENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uX05hbWUoKSksCi0JCQkvL2NyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKENPTU1PTl9QS0cuZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1vZGVsIHdhcyBtb2RlbCBmcm9tIFdlYnNwaGVyZSBXZWJzZXJ2aWNlcwotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZpY2VSZWZHcm91cFRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFUlZJQ0VfUkVGLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKCBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCURFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlJQ09OU19UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9SRUZfTkFNRSwgV0VCU0VSVklDRV9QS0cuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFNFUlZJQ0VfSU5URVJGQUNFLCBXRUJTRVJWSUNFX1BLRy5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX0ZJTEUsIFdFQlNFUlZJQ0VfUEtHLmdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihKQVhSUENfTUFQUElOR19GSUxFLCBXRUJTRVJWSUNFX1BLRy5nZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCkpLAotCQkJY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFNFUlZJQ0VfUU5BTUUsIFdFQlNFUlZJQ0VfUEtHLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCkpLAotCQkJY3JlYXRlUG9ydENvbXBvbmVudFJlZlRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyVHJhbnNsYXRvcigpLAotCQl9KTsKLQkJCi0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewkJCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoVHJhbnNsYXRvci5URVhUX0FUVFJJQlVURV9WQUxVRSwgQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWVfQ29tYmluZWRRTmFtZSgpKQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JLyoqCi0JICogVGhpcyBtb2RlbCB3YXMgbW9kZWwgZnJvbSBXZWJzcGhlcmUgV2Vic2VydmljZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEhBTkRMRVIsIFdFQlNFUlZJQ0VfUEtHLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUlDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX05BTUUsIFdFQlNFUlZJQ0VfUEtHLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihIQU5ETEVSX0NMQVNTLCBXRUJTRVJWSUNFX1BLRy5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpKSwKLQkJCWNyZWF0ZVBhcmFtVmFsdWVUeXBlKEhBTkRMRVJfSU5JVF9QQVJBTSwgV0VCU0VSVklDRV9QS0cuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpLAotCQkJY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFNPQVBfSEVBREVSLCBXRUJTRVJWSUNFX1BLRy5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU09BUF9ST0xFLCBXRUJTRVJWSUNFX1BLRy5nZXRIYW5kbGVyX1NvYXBSb2xlcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBPUlRfTkFNRSwgV0VCU0VSVklDRV9QS0cuZ2V0SGFuZGxlcl9Qb3J0TmFtZXMoKSkKLQkJfSk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUG9ydENvbXBvbmVudFJlZlRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVF9SRUYsIFdFQlNFUlZJQ0VfUEtHLmdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbiggbmV3IFRyYW5zbGF0b3JbXXsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFNFUlZJQ0VfRU5QT0lOVF9JTlRFUkZBQ0UsIFdFQlNFUlZJQ0VfUEtHLmdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9DT01QT05FTlRfTElOSyAsIFdFQlNFUlZJQ0VfUEtHLmdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFORywgQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbl9MYW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDT01NT05fUEtHLmdldERlc2NyaXB0aW9uX1ZhbHVlKCkpIC8vJE5PTi1OTFMtMSQKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRGlzcGxheU5hbWVUcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldERpc3BsYXlOYW1lX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFRyYW5zbGF0b3IuVEVYVF9BVFRSSUJVVEVfVkFMVUUsIENPTU1PTl9QS0cuZ2V0RGlzcGxheU5hbWVfVmFsdWUoKSkgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUljb25UcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSUNPTiwgQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbkdyb3VwX0ljb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldEljb25UeXBlX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0SWNvblR5cGVfU21hbGxJY29uKCkpLCAvLyROT04tTkxTLTEkCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldEljb25UeXBlX0xhcmdlSWNvbigpKSAvLyROT04tTkxTLTEkCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotLy8JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLwkJcmV0dXJuIGNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKERFUExPWV9FWFQsIGZlYXR1cmUpOwotLy8JfQotLy8KLS8vCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoZG9tTmFtZSwgZmVhdHVyZSk7Ci0vLwkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotLy8JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0UsIENPTU1PTl9QS0cuZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9OYW1lc3BhY2UoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwKLS8vCQkJbmV3IFRyYW5zbGF0b3IoTVVTVFVOREVSU1RBTkQsIENPTU1PTl9QS0cuZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9NdXN0VW5kZXJzdGFuZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpLAotLy8JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0vLwkJCVRyYW5zbGF0b3IuY3JlYXRlUGFyZW50QW5kVGV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoRVhUX0VMRU1FTlQsIENPTU1PTl9QS0cuZ2V0RGVwbG95bWVudEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpLCBDT01NT05fUEtHLmdldEV4dGVuc2libGVUeXBlX1ZhbHVlKCkpCi0vLwkJfSk7Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGFyYW1WYWx1ZVR5cGUoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKXsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKGRvbU5hbWUsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09NTU9OX1BLRy5nZXRQYXJhbVZhbHVlX0Rlc2NyaXB0aW9ucygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX05BTUUsIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fVkFMVUUsIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9WYWx1ZSgpKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0VudkVudHJ5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzEzZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEVudkVudHJ5VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXByaXZhdGUgYm9vbGVhbiBpc0oyRUUxNDsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIHJlb3JkZXJlZENoaWxkcmVuOwotCS8vSGFja3MgYmVjYXVzZSBvZiBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIHNlcnZsZXQgc3BlYwotCWJvb2xlYW4gdHlwZUJlZm9yZVZhbHVlID0gdHJ1ZTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW52RW50cnlUcmFuc2xhdG9yLgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBFbnZFbnRyeVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBib29sZWFuIHdyaXRlVHlwZUJlZm9yZVZhbHVlLCBib29sZWFuIGlzSjJFRTE0KSB7Ci0JCXN1cGVyKEVOVl9FTlRSWSwgYUZlYXR1cmUpOwotCQl0eXBlQmVmb3JlVmFsdWUgPSB3cml0ZVR5cGVCZWZvcmVWYWx1ZTsKLQkJdGhpcy5pc0oyRUUxNCA9IGlzSjJFRTE0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwgaW50IHZlcnNpb25JRCkgewotCQkvL0hhdmEgdG8geW91IGNyZWF0ZSBhIGRpZmZlcmVudCBvbmUgZWFjaCB0aW1lCi0JCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJc2V0UmVvcmRlcmVkQ2hpbGRyZW4oKTsKLQkJCi0JCWlmICh0eXBlQmVmb3JlVmFsdWUpCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQotCQlyZXR1cm4gcmVvcmRlcmVkQ2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJQ29tbW9uUGFja2FnZSBlUGFja2FnZUNvbW1vbiA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQlUcmFuc2xhdG9yIGRlc2NyaXB0aW9uVHJhbnNsYXRvcjsKLQkJaWYgKGlzSjJFRTE0KQotCQkJZGVzY3JpcHRpb25UcmFuc2xhdG9yID0gQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKGVQYWNrYWdlQ29tbW9uLmdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpKTsgCi0JCWVsc2UgCi0JCQlkZXNjcmlwdGlvblRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgZVBhY2thZ2VDb21tb24uZ2V0RW52RW50cnlfRGVzY3JpcHRpb24oKSk7Ci0JCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAkJCQkKLQkJCWRlc2NyaXB0aW9uVHJhbnNsYXRvciwKLQkJCW5ldyBUcmFuc2xhdG9yKEVOVl9FTlRSWV9OQU1FLCBlUGFja2FnZUNvbW1vbi5nZXRFbnZFbnRyeV9OYW1lKCkpLAotCQkJbmV3IEVudkVudHJ5VHlwZVRyYW5zbGF0b3IoKSwgCi0JCQluZXcgVHJhbnNsYXRvcihFTlZfRU5UUllfVkFMVUUsIGVQYWNrYWdlQ29tbW9uLmdldEVudkVudHJ5X1ZhbHVlKCkpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFJlb3JkZXJlZENoaWxkcmVuKCkgewotCQlyZW9yZGVyZWRDaGlsZHJlbiA9IG5ldyBUcmFuc2xhdG9yW2NoaWxkcmVuLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIDAsIHJlb3JkZXJlZENoaWxkcmVuLCAwLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlUcmFuc2xhdG9yIHRlbXAgPSByZW9yZGVyZWRDaGlsZHJlblszXTsKLQkJcmVvcmRlcmVkQ2hpbGRyZW5bM10gPSByZW9yZGVyZWRDaGlsZHJlbls0XTsKLQkJcmVvcmRlcmVkQ2hpbGRyZW5bNF0gPSB0ZW1wOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9FbnZFbnRyeVR5cGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9FbnZFbnRyeVR5cGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjcwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUeXBlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW52RW50cnlUeXBlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xBTkc9ICJqYXZhLmxhbmcuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVUJTVFJJTkdfTEVOR1RIID0gSkFWQV9MQU5HLmxlbmd0aCgpOwotCXB1YmxpYyBFbnZFbnRyeVR5cGVUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFTlZfRU5UUllfVFlQRSwgQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW52RW50cnlfVHlwZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsJCQotCQlpZiAoc3RyVmFsdWUgIT0gbnVsbCAmJiBzdHJWYWx1ZS5zdGFydHNXaXRoKEpBVkFfTEFORykpIAotCQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLnN1YnN0cmluZyhTVUJTVFJJTkdfTEVOR1RIKSwgb3duZXIpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSAKLQkJCXJldHVybiBKQVZBX0xBTkcgKyAoKEVudW1lcmF0b3IpdmFsdWUpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9KYXZhQ2xhc3NUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9KYXZhQ2xhc3NUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NWQ5ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vSmF2YUNsYXNzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotcHVibGljIGNsYXNzIEphdmFDbGFzc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhQ2xhc3NUcmFuc2xhdG9yLgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphdmFDbGFzc1RyYW5zbGF0b3IuCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggcGF0aCkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhQ2xhc3NUcmFuc2xhdG9yLgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBwYXRocwotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aFtdIHBhdGhzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aHMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhQ2xhc3NUcmFuc2xhdG9yLgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lLCBTdHJpbmcgdmFsdWUsIE5vdGlmaWVyIG93bmVyKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29udmVydFN0cmluZ1RvVmFsdWUodmFsdWUsIChFT2JqZWN0KSBvd25lcik7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKHN0clZhbHVlICE9IG51bGwpIHsKLQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gcmVtb3ZlUHJlY2VlZGluZ0FuZFRyYWlsaW5nUGVyaW9kcyhzdHJWYWx1ZS50cmltKCkpOwkJCi0JCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIG93bmVyUmVzID0gb3duZXIuZVJlc291cmNlKCk7Ci0JCQkJaWYgKG93bmVyUmVzICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VTZXQgcnMgPSBvd25lclJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQlpZiAocnMgIT0gbnVsbCkgewotCQkJCQkJLy9UcnkgdG8gcmVmbGVjdCB0aGUgdHlwZSBkaXJlY3RseS4gIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQKLQkJCQkJCS8vb3IgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gYSBwcm94eS4KLQkJCQkJCU9iamVjdCBqYXZhQ2xhc3MgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlqYXZhQ2xhc3MgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocXVhbGlmaWVkTmFtZSwgcnMpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvL0lnbm9yZQotCQkJCQkJfQotCQkJCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKQotCQkJCQkJCXJldHVybiBqYXZhQ2xhc3M7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcml2YXRlIFN0cmluZyByZW1vdmVQcmVjZWVkaW5nQW5kVHJhaWxpbmdQZXJpb2RzKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCWNoYXJbXSBjaGFyYWN0ZXJzID0gcXVhbGlmaWVkTmFtZS50b0NoYXJBcnJheSgpOwotCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCWZvciAoOyBzdGFydEluZGV4IDwgY2hhcmFjdGVycy5sZW5ndGggJiYgY2hhcmFjdGVyc1tzdGFydEluZGV4XSA9PSAnLic7IHN0YXJ0SW5kZXgrKyk7Ci0JCWludCBxdWFsaWZpZWROYW1lRW5kID0gcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWludCBlbmRJbmRleCA9IHF1YWxpZmllZE5hbWVFbmQ7Ci0JCWZvciAoOyBlbmRJbmRleCA+IC0xICYmIGNoYXJhY3RlcnNbZW5kSW5kZXhdID09ICcuJzsgZW5kSW5kZXgtLSkKLQkJaWYgKHN0YXJ0SW5kZXggPT0gMCAmJiBlbmRJbmRleCA9PSBxdWFsaWZpZWROYW1lRW5kKQotCQkJcmV0dXJuIHF1YWxpZmllZE5hbWU7Ci0JCXJldHVybiBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCArIDEpOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJldHVybiAoKEphdmFDbGFzcykgdmFsdWUpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9SZXNBdXRoVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vUmVzQXV0aFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxMGZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9SZXNBdXRoVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMzAsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNBdXRoVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5FUl9BVVRIID0gIkNPTlRBSU5FUiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9BVVRIID0gIlNFUlZMRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFJlc0F1dGhUcmFuc2xhdG9yKCkgewotCQlzdXBlcihSRVNfQVVUSCwgQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfQXV0aCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoaXNXZWIoKFJlc291cmNlUmVmKW93bmVyKSkKLQkJCXJldHVybiBjb252ZXJ0V2ViU3RyaW5nVG9WYWx1ZShzdHJWYWx1ZSwgb3duZXIpOwotCQkKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLCBvd25lcik7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzdHJWYWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBjb252ZXJ0V2ViU3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKFNFUlZMRVRfQVVUSC5lcXVhbHMoc3RyVmFsdWUpKSAKLQkJCXJldHVybiBSZXNBdXRoVHlwZUJhc2UuQVBQTElDQVRJT05fTElURVJBTDsKLQkJZWxzZSBpZiAoQ09OVEFJTkVSX0FVVEguZXF1YWxzKHN0clZhbHVlKSkgCi0JCQlyZXR1cm4gUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMOwotCQllbHNlIAotCQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLCBvd25lcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKGlzV2ViMjIoKChSZXNvdXJjZVJlZilvd25lcikpKQotCQkJcmV0dXJuIGNvbnZlcnRXZWJWYWx1ZVRvU3RyaW5nKHZhbHVlLCBvd25lcik7Ci0JCSAKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKHZhbHVlLCBvd25lcik7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRXZWJWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoUmVzQXV0aFR5cGVCYXNlLkFQUExJQ0FUSU9OX0xJVEVSQUwgPT0gdmFsdWUpCi0JCQlyZXR1cm4gU0VSVkxFVF9BVVRIOwotCQllbHNlIGlmIChSZXNBdXRoVHlwZUJhc2UuQ09OVEFJTkVSX0xJVEVSQUwgPT0gdmFsdWUpCi0JCQlyZXR1cm4gQ09OVEFJTkVSX0FVVEg7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gc3VwZXIuY29udmVydFZhbHVlVG9TdHJpbmcodmFsdWUsIG93bmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dlYihSZXNvdXJjZVJlZiByZWYpIHsKLQkJRU9iamVjdCBvd25lciA9IHJlZi5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiAob3duZXIgaW5zdGFuY2VvZiBXZWJBcHApOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dlYjIyKFJlc291cmNlUmVmIHJlZikgeyAKLQkJcmV0dXJuIGlzV2ViKHJlZikgJiYgKChXZWJBcHApcmVmLmVDb250YWluZXIoKSkuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb25uZWN0b3IvQ29ubmVjdG9yVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb25uZWN0b3IvQ29ubmVjdG9yVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhlNWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29ubmVjdG9yL0Nvbm5lY3RvclRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb25uZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLlJhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotcHVibGljIGNsYXNzIENvbm5lY3RvclRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIFJhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBDb25uZWN0b3JUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IENvbm5lY3RvclRyYW5zbGF0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1IgPSAiY29ubmVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEpjYVBhY2thZ2UgQ09OTkVDVE9SX1BLRyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NTU9OX1BLRyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgVkVORE9SX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFZFTkRPUl9OQU1FLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRUlTX1RZUEVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEVJU19UWVBFLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9FaXNUeXBlKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQ09ORklHX1BST1BFUlRZX05BTUVfVFJBTlNMQVRPUj0gbmV3IFRyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZX05BTUUsIENPTk5FQ1RPUl9QS0cuZ2V0Q29uZmlnUHJvcGVydHlfTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIENPTkZJR19QUk9QRVJUWV9UWVBFX1RSQU5TTEFUT1I9IG5ldyBUcmFuc2xhdG9yKENPTkZJR19QUk9QRVJUWV9UWVBFLCBDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBDT05GSUdfUFJPUEVSVFlfVkFMVUVfVFJBTlNMQVRPUj0gbmV3IFRyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZX1ZBTFVFLCBDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihTRUNVUklUWV9QRVJNSVNTSU9OX1NQRUMsIENPTk5FQ1RPUl9QS0cuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBBVVRIX01FQ0hfVFlQRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoQVVUSF9NRUNIX1RZUEUsIENPTk5FQ1RPUl9QS0cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKENSRURFTlRJQUxfSU5URVJGQUNFLCBDT05ORUNUT1JfUEtHLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhblRyYW5zbGF0b3IgTElDRU5TRV9SRVFVSVJFRF9UUkFOU0xBVE9SID0gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKExJQ0VOU0VfUkVRVUlSRUQsIENPTk5FQ1RPUl9QS0cuZ2V0TGljZW5zZV9SZXF1aXJlZCgpKTsKLQkKLQlwdWJsaWMgQ29ubmVjdG9yVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoQ09OTkVDVE9SLCBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3IoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkgKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSUNPTisiLyIrU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSApLCAvLyROT04tTkxTLTEkCi0JCQluZXcgVHJhbnNsYXRvcihJQ09OKyIvIitMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpICksIC8vJE5PTi1OTFMtMSQKLQkJCVZFTkRPUl9OQU1FX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihTUEVDX1ZFUlNJT04sIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCkgKSwKLQkJCUVJU19UWVBFX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihWRVJTSU9OLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9WZXJzaW9uKCkgKSwKLQkJCWNyZWF0ZUxpY2Vuc2VUcmFuc2xhdG9yMTMoKSwKLQkJCWNyZWF0ZVJlc291cmNlQWRhcHRlclRyYW5zbGF0b3IxMygpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoVkVSU0lPTiwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfU3BlY1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgSjJFRV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlNfWFNJLCBYU0lfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWFNJX1NDSEVNQV9MT0NBVElPTiwgSjJFRV9OU19VUkwrJyAnK0NPTk5FQ1RPUl9TQ0hFTUFfTE9DXzFfNSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCVZFTkRPUl9OQU1FX1RSQU5TTEFUT1IsCi0JCQlFSVNfVFlQRV9UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT04sIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKSksCi0JCQljcmVhdGVMaWNlbnNlVHJhbnNsYXRvcjE0KCksCi0JCQljcmVhdGVSZXNvdXJjZUFkYXB0ZXJUcmFuc2xhdG9yMTQoKSwKLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUmVzb3VyY2VBZGFwdGVyVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVTT1VSQ0VBREFQVEVSLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFJFU09VUkNFQURBUFRFUl9DTEFTUyxDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXJDbGFzcygpKSwKLQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRyYW5zbGF0b3IxNChDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCkpLAotCQkJY3JlYXRlT3V0Ym91bmRUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJbmJvdW5kVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQWRtaW5PYmplY3RUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVTZWN1cml0eVBlcm1pc3Npb25zVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVPdXRib3VuZFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihPVVRCT1VORF9SRVNPVVJDRUFEQVBURVIsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVDb25uZWN0aW9uRGVmaW5hdGlvblRyYW5zbGF0b3IoKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFRSQU5TQUNUSU9OX1NVUFBPUlQsIENPTk5FQ1RPUl9QS0cuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkpLAotCQkJY3JlYXRlQXV0aE1lY2hhbmlzbVRyYW5zbGF0b3IxNChDT05ORUNUT1JfUEtHLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIENPTk5FQ1RPUl9QS0cuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbmJvdW5kVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKElOQk9VTkRfUkVTT1VSQ0VBREFQVEVSLCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVNZXNzYWdlQWRhcHRlclRyYW5zbGF0b3IoKQotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWVzc2FnZUFkYXB0ZXJUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVTU0FHRUFEQVBURVIsIENPTk5FQ1RPUl9QS0cuZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlTWVzc2FnZUxpc3RlbmVyVHJhbnNsYXRvcigpLAotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lclRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVNTQUdFTElTVEVORVIsIENPTk5FQ1RPUl9QS0cuZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRUxJU1RFTkVSX1RZUEUsIENPTk5FQ1RPUl9QS0cuZ2V0TWVzc2FnZUxpc3RlbmVyX01lc3NhZ2VMaXN0ZW5lclR5cGUoKSksCi0JCQljcmVhdGVBY3RpdmF0aW9uU3BlY1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQWN0aXZhdGlvblNwZWNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQUNUSVZBVElPTlNQRUMsIENPTk5FQ1RPUl9QS0cuZ2V0TWVzc2FnZUxpc3RlbmVyX0FjdGl2YXRpb25TcGVjKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihBQ1RJVkFUSU9OU1BFQ19DTEFTUywgQ09OTkVDVE9SX1BLRy5nZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCkpLAotCQkJY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFksIENPTk5FQ1RPUl9QS0cuZ2V0QWN0aXZhdGlvblNwZWNfUmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoQ09OTkVDVE9SX1BLRy5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihDT05GSUdfUFJPUEVSVFlfTkFNRSwgQ09OTkVDVE9SX1BLRy5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQWRtaW5PYmplY3RUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQURNSU5PQkpFQ1QsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoQURNSU5PQkpFQ1RfSU5URVJGQUNFLCBDT05ORUNUT1JfUEtHLmdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQURNSU5PQkpFQ1RfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RDbGFzcygpKSwKLQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRyYW5zbGF0b3IxNChDT05ORUNUT1JfUEtHLmdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSkKLQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29ubmVjdGlvbkRlZmluYXRpb25UcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09OTkVDVElPTl9ERUZJTklUSU9OLCBDT05ORUNUT1JfUEtHLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25EZWZpbml0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkpLAotCQkJY3JlYXRlQ29uZmlndXJhdGlvblByb3BlcnR5VHJhbnNsYXRvcjE0KENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29uZmlnUHJvcGVydGllcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSksCi0JCQluZXcgVHJhbnNsYXRvcihDT05ORUNUSU9OX0lOVEVSRkFDRSwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVElPTl9JTVBMX0NMQVNTLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlc291cmNlQWRhcHRlclRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFU09VUkNFQURBUFRFUiwgQ09OTkVDVE9SX1BLRy5nZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihNQU5BR0VEQ09OTkVDVElPTkZBQ1RPUllfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRSwgQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSApLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVElPTkZBQ1RPUllfSU1QTF9DTEFTUywgQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSApLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09OTkVDVElPTl9JTlRFUkZBQ0UsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihDT05ORUNUSU9OX0lNUExfQ0xBU1MsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSksCi0JCQluZXcgVHJhbnNsYXRvcihUUkFOU0FDVElPTl9TVVBQT1JULCBDT05ORUNUT1JfUEtHLmdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSApLAotCQkJY3JlYXRlQ29uZmlndXJhdGlvblByb3BlcnR5VHJhbnNsYXRvcjEzKENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSksCi0JCQljcmVhdGVBdXRoTWVjaGFuaXNtVHJhbnNsYXRvcjEzKENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIENPTk5FQ1RPUl9QS0cuZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkpLAotCQkJY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uc1RyYW5zbGF0b3IoKQotCQkJCi0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbnNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfUEVSTUlTU0lPTiwgQ09OTkVDVE9SX1BLRy5nZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTk5FQ1RPUl9QS0cuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCkpLAotCQkJU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUF1dGhNZWNoYW5pc21UcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihBVVRIX01FQ0hBTklTTSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09OTkVDVE9SX1BLRy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpKSwgCi0JCQlBVVRIX01FQ0hfVFlQRV9UUkFOU0xBVE9SLAotCQkJQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlQXV0aE1lY2hhbmlzbVRyYW5zbGF0b3IxNChFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFVVEhfTUVDSEFOSVNNLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT05ORUNUT1JfUEtHLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpKSwgCi0JCQlBVVRIX01FQ0hfVFlQRV9UUkFOU0xBVE9SLAotCQkJQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlQ29uZmlndXJhdGlvblByb3BlcnR5VHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCkpLAotCQkJQ09ORklHX1BST1BFUlRZX05BTUVfVFJBTlNMQVRPUiwKLQkJCUNPTkZJR19QUk9QRVJUWV9UWVBFX1RSQU5TTEFUT1IsCi0JCQlDT05GSUdfUFJPUEVSVFlfVkFMVUVfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlQ29uZmlndXJhdGlvblByb3BlcnR5VHJhbnNsYXRvcjE0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09ORklHX1BST1BFUlRZLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT05ORUNUT1JfUEtHLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpKSwKLQkJCUNPTkZJR19QUk9QRVJUWV9OQU1FX1RSQU5TTEFUT1IsCi0JCQlDT05GSUdfUFJPUEVSVFlfVFlQRV9UUkFOU0xBVE9SLAotCQkJQ09ORklHX1BST1BFUlRZX1ZBTFVFX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUxpY2Vuc2VUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihMSUNFTlNFLCBDT05ORUNUT1JfUEtHLmdldENvbm5lY3Rvcl9MaWNlbnNlKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09OTkVDVE9SX1BLRy5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCkpLCAKLQkJCUxJQ0VOU0VfUkVRVUlSRURfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlTGljZW5zZVRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKExJQ0VOU0UsIENPTk5FQ1RPUl9QS0cuZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihDT05ORUNUT1JfUEtHLmdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCkpLCAKLQkJCUxJQ0VOU0VfUkVRVUlSRURfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9BYnN0cmFjdEVKQlRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fic3RyYWN0RUpCVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTRmYjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fic3RyYWN0RUpCVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUpCVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckksIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCi0JCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEFic3RyYWN0RUpCVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIEVKQl9QS0cuZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCVRyYW5zbGF0b3JbXSBzdGFydCA9IGdldENvbW1vbkJlZ2luTWFwczEzKCk7Ci0JCVRyYW5zbGF0b3JbXSBtaWRkbGUgPSBnZXRTcGVjaWZpY01hcHMoSjJFRV8xXzNfSUQpOwotCQlUcmFuc2xhdG9yW10gZW5kID0gZ2V0RW5kTWFwczEzKCk7Ci0JCXJldHVybiAoVHJhbnNsYXRvcltdKSBjb25jYXQoc3RhcnQsIGNvbmNhdChtaWRkbGUsIGVuZCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTE0Q2hpbGRyZW4oKSB7Ci0JCQlUcmFuc2xhdG9yW10gc3RhcnQgPSBnZXRDb21tb25CZWdpbk1hcHMxNCgpOwotCQkJVHJhbnNsYXRvcltdIG1pZGRsZSA9IGdldFNwZWNpZmljTWFwcyhKMkVFXzFfNF9JRCk7Ci0JCQlUcmFuc2xhdG9yW10gZW5kID0gZ2V0RW5kTWFwczE0KCk7Ci0JCQkvL1RyYW5zbGF0b3JbXSBkZXBsb3ltZW50RXh0ID0gZ2V0RGVwbG95bWVudEV4dGVuc2lvbk1hcHMoKTsKLQkJCXJldHVybiAoVHJhbnNsYXRvcltdKSBjb25jYXQoc3RhcnQsIGNvbmNhdChtaWRkbGUsIGVuZCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldENvbW1vbkJlZ2luTWFwczEzKCkgewotCQkKLQkJVHJhbnNsYXRvcltdIGJlZ2luTWFwcyA9ICBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9OQU1FLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX05hbWUoKSkKLQkJfTsKLQkJCi0JCWlmICh1c2VzSG9tZVJlbW90ZUF0dHJpYnV0ZXMoKSkKLQkJCXJldHVybiAoVHJhbnNsYXRvcltdKWNvbmNhdChjb25jYXQoYmVnaW5NYXBzLCBnZXRIb21lUmVtb3RlTWFwcygpKSwgZ2V0RUpCQ2xhc3NNYXAoKSk7Ci0JCXJldHVybiAoVHJhbnNsYXRvcltdKWNvbmNhdChiZWdpbk1hcHMsIGdldEVKQkNsYXNzTWFwKCkpOwotCX0KLQkKLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q29tbW9uQmVnaW5NYXBzMTQoKSB7Ci0JCQotCQlUcmFuc2xhdG9yW10gYmVnaW5NYXBzID0gIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCi0JCQluZXcgVHJhbnNsYXRvcihFSkJfTkFNRSwgRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9OYW1lKCkpCi0JCX07Ci0JCWlmICh1c2VzSG9tZVJlbW90ZUF0dHJpYnV0ZXMoKSkKLQkJCXJldHVybiAoVHJhbnNsYXRvcltdKWNvbmNhdChjb25jYXQoYmVnaW5NYXBzLCBnZXRIb21lUmVtb3RlTWFwcygpKSwgZ2V0RUpCQ2xhc3NNYXAoKSk7Ci0JCXJldHVybiAoVHJhbnNsYXRvcltdKWNvbmNhdChiZWdpbk1hcHMsIGdldEVKQkNsYXNzTWFwKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEhvbWVSZW1vdGVNYXBzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihIT01FLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihSRU1PVEUsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCkpLAotCQkJLy9CZWdpbiBFSkIgMi4wCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihMT0NBTF9IT01FLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSG9tZUludGVyZmFjZSgpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKExPQ0FMLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCkpCi0JCQkvL0VuZCBFSkIgMi4wCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRFSkJDbGFzc01hcCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRUpCX0NMQVNTLCBFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCkpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0hvbWVSZW1vdGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczEzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV8zLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzMsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfMywKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxMyhFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSksCi0JCQluZXcgU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX1JFRl8xXzMsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9FTlZfUkVGXzFfMwotCQl9OwotCi0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVuZE1hcHMxNCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRU5WX0VOVFJZXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VKQl9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9TRVJWSUNFX1JFRl8xXzQsCQotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfTUVTU0FHRV9ERVNUX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVSZWZUcmFuc2xhdG9yMTQoRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eVJvbGVSZWZzKCkpLAotCQkJbmV3IFNlY3VyaXR5SWRlbnRpdHlUcmFuc2xhdG9yKCksCi0JCX07Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVHJhbnNsYXRvcltdIGdldFNwZWNpZmljTWFwcyhpbnQgdmVyc2lvbklEKTsKLQotLy8JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXREZXBsb3ltZW50RXh0ZW5zaW9uTWFwcygpewotLy8JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLS8vCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9FeHRlbnNpb25zKCkpCi0vLwkJfTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyZTc3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9BY2tub3dsZWRnZU1vZGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFja25vd2xlZGdlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgQWNrbm93bGVkZ2VNb2RlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19BQ0tOT1dMRURHRSA9ICJBdXRvLWFja25vd2xlZGdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVUFNfT0tfQUNLTk9XTEVER0UgPSAiRHVwcy1vay1hY2tub3dsZWRnZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQWNrbm93bGVkZ2VNb2RlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoQUNLTk9XTEVER0VfTU9ERSwgRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9BY2tub3dsZWRnZU1vZGUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChBVVRPX0FDS05PV0xFREdFLmVxdWFsc0lnbm9yZUNhc2Uoc3RyVmFsdWUpKQotCQkJcmV0dXJuIEFja25vd2xlZGdlTW9kZS5BVVRPX0FDS05PV0xFREdFX0xJVEVSQUw7Ci0JCWVsc2UgaWYgKERVUFNfT0tfQUNLTk9XTEVER0UuZXF1YWxzSWdub3JlQ2FzZShzdHJWYWx1ZSkpCi0JCQlyZXR1cm4gQWNrbm93bGVkZ2VNb2RlLkRVUFNfT0tfQUNLTk9XTEVER0VfTElURVJBTDsKLQkJZWxzZSAKLQkJCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShzdHJWYWx1ZSwgb3duZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWlmIChBY2tub3dsZWRnZU1vZGUuQVVUT19BQ0tOT1dMRURHRV9MSVRFUkFMLmVxdWFscyh2YWx1ZSkpIAotCQkJcmV0dXJuIEFVVE9fQUNLTk9XTEVER0U7Ci0JCWVsc2UgaWYgKEFja25vd2xlZGdlTW9kZS5EVVBTX09LX0FDS05PV0xFREdFX0xJVEVSQUwuZXF1YWxzKHZhbHVlKSkKLQkJCXJldHVybiBEVVBTX09LX0FDS05PV0xFREdFOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuY29udmVydFZhbHVlVG9TdHJpbmcodmFsdWUsIG93bmVyKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ01QRmllbGRUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBGaWVsZFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyZTdkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBGaWVsZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBhZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENNUEZpZWxkVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXB1YmxpYyBzdGF0aWMgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JcHVibGljIENNUEZpZWxkVHJhbnNsYXRvcigpewotCQlzdXBlcihDTVBfRklFTEQsIEVKQl9QS0cuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTixFSkJfUEtHLmdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEZJRUxEX05BTUUsIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCkpCQotCQl9OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQlzd2l0Y2goKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW1vZk9iamVjdCkuZ2V0VmVyc2lvbklEKCkpIHsgIAotCQkJCi0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQ6Ci0JCi0JCQkJcmV0dXJuIHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JCQkJCi0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQ6Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQ6IGRlZmF1bHQ6Ci0JCi0JCQkJcmV0dXJuIGdldDIwQ01QQXR0cmlidXRlcygoQ29udGFpbmVyTWFuYWdlZEVudGl0eSltb2ZPYmplY3QpOwotCQl9ICAKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0MjBDTVBBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCUxpc3QgYWxsQXR0cmlidXRlcywgcmVtb3ZlZCwgcmVzdWx0OwotCQlyZW1vdmVkID0gbnVsbDsKLQkJYWxsQXR0cmlidXRlcyA9IGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQlpbnQgc2l6ZSA9IGFsbEF0dHJpYnV0ZXMuc2l6ZSgpOwotCQlDTVBBdHRyaWJ1dGUgYXR0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWF0dCA9IChDTVBBdHRyaWJ1dGUpIGFsbEF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJaWYgKGF0dC5pc0Rlcml2ZWQoKSkgewotCQkJCWlmIChyZW1vdmVkID09IG51bGwpCi0JCQkJCXJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVtb3ZlZC5hZGQoYXR0KTsKLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQkJcmVzdWx0LmFkZEFsbChhbGxBdHRyaWJ1dGVzKTsKLQkJCXJlc3VsdC5yZW1vdmVBbGwocmVtb3ZlZCk7Ci0JCX0gZWxzZQotCQkJcmVzdWx0ID0gYWxsQXR0cmlidXRlczsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUFZlcnNpb25UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBWZXJzaW9uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdlYTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUFZlcnNpb25UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgQ01QVmVyc2lvblRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgQ01QVmVyc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKENNUF9WRVJTSU9OLCBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgewotCQlFSkJKYXIgcGFyZW50ID0gKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW1vZk9iamVjdCkuZ2V0RWpiSmFyKCk7Ci0JCWlmIChwYXJlbnQuZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkKLQkJCXJldHVybiBzdXBlci5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDdhMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlUcmFuc2xhdG9yIGV4dGVuZHMgRW50aXR5VHJhbnNsYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JfQotCS8vVE9ETyBVbmNvbW1lbnQgYWxsIGNvbW1lbnRlZCBjb2RlIGFuZCBmaXgKLQkvKgotCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFN0cmluZ1ZhbHVlKE1hcEluZm8gbWFwLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoUFJJTUtFWV9GSUVMRCkpIHsJCi0JCQlDTVBBdHRyaWJ1dGUgYXR0ciA9IGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5QXR0cmlidXRlKCk7Ci0JCQlyZXR1cm4gYXR0ciA9PSBudWxsID8gZ2V0U3BlY2lmaWVkUHJpbUtleUZpZWxkTmFtZSgpIDogYXR0ci5nZXROYW1lKCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHN1cGVyLmV4dHJhY3RTdHJpbmdWYWx1ZShtYXAsIG1vZk9iamVjdCk7Ci0JCi0JfSAKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY2lmaWVkUHJpbUtleUZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIENNUFNwZWNBZGFwdGVyLmdldFNwZWNpZmllZFByaW1LZXlGaWVsZE5hbWUoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpKTsKLQl9Ci0JKi8KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0JCQkJaWYgKGNoaWxkcmVuMTMgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xMyA9IGNyZWF0ZTEzQ2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xMzsJCi0JCQlkZWZhdWx0IDoKLQkJCQlpZiAoY2hpbGRyZW4xNCA9PSBudWxsKQotCQkJCQljaGlsZHJlbjE0ID0gY3JlYXRlMTRDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjE0OyAKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gQ09OVEFJTkVSOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5FbnRpdHlUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewotCQlUcmFuc2xhdG9yW10gY21wVHJhbnNsYXRvcnMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCS8vQmVnaW4gRUpCIDIuMCBhZGRlZAotCQkJbmV3IENNUFZlcnNpb25UcmFuc2xhdG9yKCksCi0JCQluZXcgVHJhbnNsYXRvcihBQlNUUkFDVF9TQ0hFTUFfTkFNRSwgRUpCX1BLRy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0Fic3RyYWN0U2NoZW1hTmFtZSgpKSwKLQkJCS8vRW5kIEVKQiAyLjAgYWRkZWQKLQkJCi0JCQluZXcgQ01QRmllbGRUcmFuc2xhdG9yKCksCi0JCQluZXcgUHJpbUtleUZpZWxkVHJhbnNsYXRvcigpLAotCQl9OwotCQlyZXR1cm4gKFRyYW5zbGF0b3JbXSkgY29uY2F0KHN1cGVyLmdldFNwZWNpZmljTWFwcyh2ZXJzaW9uSUQpLCBjbXBUcmFuc2xhdG9ycyk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczEzKCkgewotCQkvL0FkZGVkIGZvciBFSkIgMi4wCi0JCVRyYW5zbGF0b3JbXSBxdWVyeVQgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVF1ZXJ5VHJhbnNsYXRvcnMoKQotCQl9OwotCQlyZXR1cm4gKFRyYW5zbGF0b3JbXSkgY29uY2F0KHN1cGVyLmdldEVuZE1hcHMxMygpLCBxdWVyeVQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVuZE1hcHMxNCgpIHsKLQkJCS8vQWRkZWQgZm9yIEVKQiAyLjAKLQkJCVRyYW5zbGF0b3JbXSBxdWVyeVQgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQljcmVhdGVRdWVyeVRyYW5zbGF0b3JzKCkKLQkJCX07Ci0JCQlyZXR1cm4gKFRyYW5zbGF0b3JbXSkgY29uY2F0KHN1cGVyLmdldEVuZE1hcHMxNCgpLCBxdWVyeVQpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVF1ZXJ5VHJhbnNsYXRvcnMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihRVUVSWSwgRUpCX1BLRy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCkpLAotCQkJY3JlYXRlUXVlcnlNZXRob2RUcmFuc2xhdG9ycygpLAotCQkJbmV3IFRyYW5zbGF0b3IoUkVTVUxUX1RZUEVfTUFQUElORywgRUpCX1BLRy5nZXRRdWVyeV9SZXR1cm5UeXBlTWFwcGluZygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9RTCwgRUpCX1BLRy5nZXRRdWVyeV9FamJRTCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVF1ZXJ5TWV0aG9kVHJhbnNsYXRvcnMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihRVUVSWV9NRVRIT0QsIEVKQl9QS0cuZ2V0UXVlcnlfUXVlcnlNZXRob2QoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FVEhPRF9OQU1FLCBFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfTmFtZSgpKSwKLQkJCW5ldyBNZXRob2RQYXJhbXNUcmFuc2xhdG9yKEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9QYXJtcygpKQotCQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTUZlYXR1cmUoTWFwSW5mbyBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKG1hcCA9PSBub0ZlYXR1cmVQcmltS2V5TWFwSW5mbykKLQkJCXJldHVybjsKLQkJaWYgKG1hcC5nZXRET01OYW1lKCkuZXF1YWxzKENNUF9WRVJTSU9OKSkgewotCQkJdXBkYXRlRE9NQ21wVmVyc2lvbklmTmVjZXNzYXJ5KG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5wcmltVXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCS8vSWYgdGhlIHByaW1hcnkga2V5IGNsYXNzIGhhcyBjaGFuZ2VkLCB0aGlzIHdpbGwgaW1wYWN0IHRoZSBwcmltYXJ5IGtleSBmaWVsZAotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoUFJJTV9LRVlfQ0xBU1MpKSB7Ci0JCQlTdHJpbmcgc3BlY2lmaWVkUHJpbUtleUZpZWxkID0gQ01QU3BlY0FkYXB0ZXIuZ2V0U3BlY2lmaWVkUHJpbUtleUZpZWxkTmFtZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpOwotCQkJdHJ5IHsKLQkJCQlzdXBlci5wcmltVXBkYXRlRE9NRmVhdHVyZShub0ZlYXR1cmVQcmltS2V5TWFwSW5mbywgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJQ01QU3BlY0FkYXB0ZXIuc2V0UHJpbUtleUZpZWxkRnJvbVhtbChzcGVjaWZpZWRQcmltS2V5RmllbGQsIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01DbXBWZXJzaW9uSWZOZWNlc3NhcnkoTWFwSW5mbyBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKCEobW9mT2JqZWN0IGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkpIAotCQkJcmV0dXJuOwotCQkKLQkJRUpCSmFyIHBhcmVudCA9ICgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSltb2ZPYmplY3QpLmdldEVqYkphcigpOwotCQlpZiAocGFyZW50LmlzVmVyc2lvbjJfMERlc2NyaXB0b3IoKSkKLQkJCXN1cGVyLnByaW1VcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShNYXBJbmZvIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAobWFwID09IGZlYXR1cmVQcmltS2V5TWFwSW5mbykgCi0JCQlzdXBlci5wcmltVXBkYXRlRE9NRmVhdHVyZShub0ZlYXR1cmVQcmltS2V5TWFwSW5mbywgbm9kZSwgbW9mT2JqZWN0KTsKLQkJZWxzZSAKLQkJCXN1cGVyLnByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltVXBkYXRlTU9GRmVhdHVyZShNYXBJbmZvIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlib29sZWFuIGhhc0NoYW5nZWQgPSBzdXBlci5wcmltVXBkYXRlTU9GRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCS8vSWYgdGhlIGtleSBjbGFzcyBoYXMgY2hhbmdlZCwgZnJvbSB0aGUgeG1sIHNpZGUsIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2Ugc3RhbXAgdGhlIHByaW1rZXkgZmllbGQKLQkJLy9hcyBiZWluZyBzcGVjaWZpZWQgZnJvbSB4bWwsIHNpbmNlIHdlIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoYXQgbm9kZQotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoUFJJTV9LRVlfQ0xBU1MpKSB7Ci0JCQl1cGRhdGVYbWxLZXlGaWVsZChub0ZlYXR1cmVQcmltS2V5TWFwSW5mbywgbm9kZSk7Ci0JCQlpZiAoaGFzQ2hhbmdlZCkKLQkJCQl1cGRhdGVNT0ZQcmltS2V5RmllbGRGZWF0dXJlKGZlYXR1cmVQcmltS2V5TWFwSW5mbywgZ2V0Tm9kZSgpLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gaGFzQ2hhbmdlZDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShNYXBJbmZvIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAobWFwID09IG5vRmVhdHVyZVByaW1LZXlNYXBJbmZvKQotCQkJcmV0dXJuOwotCQlpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoUFJJTUtFWV9GSUVMRCkpIHsKLQkJCXVwZGF0ZU1PRlByaW1LZXlGaWVsZEZlYXR1cmUobWFwLCBub2RlLCBmYWxzZSk7Ci0JCX0gZWxzZSBpZiAobWFwLmdldERPTU5hbWUoKS5lcXVhbHMoQ01QX0ZJRUxEKSkgewotCQkJLy9jYWNoZSB0aGUgb2xkIGxpc3Qgb2YgY21wIGF0dHJpYnV0ZXMgYmVmb3JlIHVwZGF0ZQotCQkJTGlzdCBjbXBBdHRyaWJ1dGVzTGlzdENPUFkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljbXBBdHRyaWJ1dGVzTGlzdENPUFkuYWRkQWxsKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpKTsKLQkJCi0JCQkvL2RvIHRoZSB1cGRhdGUKLQkJCXN1cGVyLnByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCi0JCQlMaXN0IG5ld0NtcEF0dHJpYnV0ZUxpc3QgPSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJCS8va2V5IHRoZSBjbXAgYXR0cmlidXRlIGxpc3QgYW5kIHRoZSBrZXkgYXR0cmlidXRlIGxpc3QuCi0JCQlwZXJmb3JtS2V5U3luY2hyb25pemF0aW9uKGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSwgbmV3Q21wQXR0cmlidXRlTGlzdCk7Ci0JCX0gZWxzZSAKLQkJCXN1cGVyLnByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQkvKioKLQkgKiBNZXRob2QgdGhhdCBzeW5jaHJvbml6aWVzIHRoZSBsaXN0IG9mIGNtcCBhdHRyaWJ1dGVzIHRoYXQgYXJlIGtleXMgd2l0aCB0aGUga2V5IGF0dHJpYnV0ZSBsaXN0LgotCSAqIFdoZW4ga2V5cyBhcmUgYWRkZWQgYW5kIGRlbGV0ZWQgZnJvbSB0aGUgY21wIGF0dHJpYnV0ZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBMaXN0IGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSAtIENvcHkgb2YgdGhlIGNtcCBhdHRyaWJ1dGUgbGlzdCBiZWZvcmUgYW55IGF0dHJpYnV0ZXMgd2hlcmUgYWRkZWQKLQkgKiAJCQkJCQkJCQkJb3IgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gTGlzdCBuZXdDbXBBdHRyaWJ1dGVMaXN0IC0gTGlzdCBvZiBjbXAgYXR0cmlidXRlcyBhZnRlciBhIG1vZGlmaWNhdGlvbiBoYXMgb2NjdXJlZC4KLQkgKi8KLQkgLyoKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtS2V5U3luY2hyb25pemF0aW9uKCBMaXN0IGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSwgTGlzdCBuZXdDbXBBdHRyaWJ1dGVMaXN0ICkgewkKLQkJaWYoIGNtcEF0dHJpYnV0ZXNMaXN0Q09QWSAhPSBudWxsICYmIG5ld0NtcEF0dHJpYnV0ZUxpc3QgIT0gbnVsbCApIHsJCi0KLQkJCS8vYWRkIGFuZCByZW1vdmVzIGtleXMgYmFzZWQgb24gd2hhdCB0aGUgYWRhcHRlcnMgZ2l2ZSBiYWNrCi0JCQotCQkJTGlzdCBhZGRlZENtcEF0dHJpYnV0ZUxpc3QgPSBnZXRDbXBBdHRyaWJ1dGVzRGVsdGFMaXN0KCBjbXBBdHRyaWJ1dGVzTGlzdENPUFksIG5ld0NtcEF0dHJpYnV0ZUxpc3QgKTsKLQkJCWlmKCBhZGRlZENtcEF0dHJpYnV0ZUxpc3QgIT0gbnVsbCAmJiAhYWRkZWRDbXBBdHRyaWJ1dGVMaXN0LmlzRW1wdHkoKSApIHsJCQkJCQotCQkJCS8vZGV0ZXJtaW5lIGlmIGFueSBvZiB0aGUgYWRkZWQgYXR0cmlidXRlcyBhcmUga2V5cywgaWYgc28gZ2V0IGEgbGlzdCBvZiB0aGVtLgotCQkJCUxpc3QgYWRkZWRLZXlBdHRyaWJ1dGVMaXN0ID0gZ2V0S2V5QXR0cmlidXRlc0Zyb21MaXN0KCBhZGRlZENtcEF0dHJpYnV0ZUxpc3QsIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5KCkgKTsKLQkJCQkvL25vdywgYWRkIHRoZSBrZXlzIHRvIHRoZSBsaXN0LgotCQkJCWFkZEtleXNUb0tleUF0dHJpYnV0ZUxpc3QoIGFkZGVkS2V5QXR0cmlidXRlTGlzdCwgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpICk7Ci0JCQl9Ly8gaWYKLQkJCi0JCQlMaXN0IHN1YnRyYWN0ZWRDbXBBdHRyaWJ1dGVMaXN0ID0gZ2V0Q21wQXR0cmlidXRlc0RlbHRhTGlzdCggbmV3Q21wQXR0cmlidXRlTGlzdCwgY21wQXR0cmlidXRlc0xpc3RDT1BZICk7Ci0JCQlpZiggc3VidHJhY3RlZENtcEF0dHJpYnV0ZUxpc3QgIT0gbnVsbCAmJiAhc3VidHJhY3RlZENtcEF0dHJpYnV0ZUxpc3QuaXNFbXB0eSgpICkgewotCQkJCS8vZGV0ZXJtaW5lIGlmIGFueSBvZiB0aGUgc3VidHJhY3RlZCBhdHRyaWJ1dGVzIGFyZSBrZXlzLCBpZiBzbyBnZXQgYSBsaXN0IG9mIHRoZW0uCi0JCQkJTGlzdCBzdWJ0cmFjdGVkS2V5QXR0cmlidXRlTGlzdCA9IGdldEtleUF0dHJpYnV0ZXNGcm9tTGlzdCggc3VidHJhY3RlZENtcEF0dHJpYnV0ZUxpc3QsIGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5KCkgKTsKLQkJCQkvL25vdywgc3VidHJhY3QgdGhlIGtleXMgZnJvbSB0aGUgbGlzdC4KLQkJCQlyZW1vdmVLZXlzRnJvbUtleUF0dHJpYnV0ZUxpc3QoIHN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0LCBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgKTsKLQkJCX0vLyBpZgkJCi0JCQotCQl9Ly8gaWYJCi0JfS8vIHBlcmZvcm1LZXlTeW5jaHJvbml6YXRpb24KLQotCS8qKgotCSAqIFJlbW92ZSBhIGJ1bmNoIG9mIGtleXMgZnJvbSB0aGUgY3VycmVudCBrZXkgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIExpc3Qgc3VidHJhY3RlZEtleUF0dHJpYnV0ZUxpc3QgLSBUaGUgbGlzdCBvZiBrZXlzIHRvIHN1YnRyYWN0IGZyb20gdGhlIGtleSBhdHRyaWJ1dGVzIGxpc3QuCi0JICogQHBhcmFtIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wIC0gVGhlIGN1cnJlbnQgY29udGFpbmVyIG1hbmFnZWQgZW50aXR5LgotCSAqLwotCSAKLQkgLyoKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlS2V5c0Zyb21LZXlBdHRyaWJ1dGVMaXN0KCBMaXN0IHN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0LCBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCApIHsKLQkJaWYoIHN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0ICE9IG51bGwgJiYgIXN1YnRyYWN0ZWRLZXlBdHRyaWJ1dGVMaXN0LmlzRW1wdHkoKSApIHsKLQkJCS8vU3VidHJhY3QgdGhlIGtleSBhdHRyaWJ1dGVzIGZyb20gdGhlIGNvbnRhaW5lciBtYW5hZ2VkIGVudGl0eQotCQkJSXRlcmF0b3Iga2xpID0gc3VidHJhY3RlZEtleUF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsKLQkJCi0JCQl3aGlsZSgga2xpLmhhc05leHQoKSApIHsKLQkJCQlDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSlrbGkubmV4dCgpOwotCQkJCVN0cmluZyBjbXBBdHRyaWJ1dGVOYW1lID0gY21wQXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQlpZiggY21wQXR0cmlidXRlTmFtZSAhPSBudWxsICkgewotCQkJCQlpZiggY21wICE9IG51bGwgJiYgY21wLmdldEtleUF0dHJpYnV0ZXMoKSAhPSBudWxsICkgewotCQkJCQkJTGlzdCBrZXlBdHRyaWJ1dGVMaXN0ID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKLQkJCQkJCWtleUF0dHJpYnV0ZUxpc3QucmVtb3ZlKCBjbXBBdHRyaWJ1dGUgKTsKLQkJCQkJfS8vIGlmCi0JCQkJfS8vIGlmCi0JCQl9Ly8gd2hpbGUKLQkJfS8vIGlmCi0JfS8vIHBlcmZvcm1LZXlTeW5jaHJvbml6YXRpb24KLQotCS8qKgotCSAqIEFkZHMgYSBidW5jaCBvZiBrZXlzIHRvIHRoZSBjdXJyZW50IGtleSBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gTGlzdCBhZGRlZENtcEF0dHJpYnV0ZUxpc3QgLSBUaGUgbGlzdCBvZiBrZXlzIHRvIGFkZCB0byB0aGUga2V5IGF0dHJpYnV0ZXMgbGlzdC4KLQkgKiBAcGFyYW0gQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgLSBUaGUgY3VycmVudCBjb250YWluZXIgbWFuYWdlZCBlbnRpdHkuCi0JICovCi0JIAotCSAvKgotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRLZXlzVG9LZXlBdHRyaWJ1dGVMaXN0KCBMaXN0IGFkZGVkS2V5QXR0cmlidXRlTGlzdCwgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgKSB7Ci0JCWlmKCBhZGRlZEtleUF0dHJpYnV0ZUxpc3QgIT0gbnVsbCAmJiAhYWRkZWRLZXlBdHRyaWJ1dGVMaXN0LmlzRW1wdHkoKSApIHsKLQkJCS8vQWRkIHRoZSBrZXkgYXR0cmlidXRlcyB0byB0aGUgY29udGFpbmVyIG1hbmFnZWQgZW50aXR5Ci0JCQlJdGVyYXRvciBrbGkgPSBhZGRlZEtleUF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsKLQkJCi0JCQl3aGlsZSgga2xpLmhhc05leHQoKSApIHsKLQkJCQlDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSlrbGkubmV4dCgpOwotCQkJCVN0cmluZyBjbXBBdHRyaWJ1dGVOYW1lID0gY21wQXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQlpZiggY21wQXR0cmlidXRlTmFtZSAhPSBudWxsICkgewotCQkJCQlpZiggY21wICE9IG51bGwgJiYgY21wLmdldEtleUF0dHJpYnV0ZXMoKSAhPSBudWxsICkKLQkJCQkJCWNtcC5hZGRLZXlBdHRyaWJ1dGVOYW1lKCBjbXBBdHRyaWJ1dGVOYW1lICk7Ci0JCQkJfS8vIGlmCi0JCQl9Ly8gd2hpbGUKLQkJfS8vIGlmCi0JfS8vIGFkZEtleXNUb0tleUF0dHJpYnV0ZUxpc3QKLQotCS8qKgotCSAqIEdldHMgdGhlIGtleSBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gTGlzdCBhdHRyaWJ1dGVMaXN0IC0gTGlzdCBvZiBhdHRyaWJ1dGVzLgotCSAqIEBwYXJhbSBKYXZhQ2xhc3MgcHJpbWFyeUtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgY21wLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCSAKLQkgLyoKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0S2V5QXR0cmlidXRlc0Zyb21MaXN0KCAgTGlzdCBhdHRyaWJ1dGVMaXN0LCBKYXZhQ2xhc3MgcHJpbWFyeUtleSApIHsKLQkJaWYgKHByaW1hcnlLZXkgPT0gbnVsbCB8fCBhdHRyaWJ1dGVMaXN0ID09IG51bGwgfHwgYXR0cmlidXRlTGlzdC5pc0VtcHR5KCkpIAotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQotCQlMaXN0IGZvdW5kS2V5QXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVMaXN0Lml0ZXJhdG9yKCk7CQkKLQkJd2hpbGUoIGl0Lmhhc05leHQoKSApIHsJCi0JCQlDTVBBdHRyaWJ1dGUgY21wQXR0ciA9IChDTVBBdHRyaWJ1dGUpaXQubmV4dCgpOwkJCQotCQkJaWYoIGNtcEF0dHIgIT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgY21wQXR0cmlidXRlTmFtZSA9IGNtcEF0dHIuZ2V0TmFtZSgpOwotCQkJCWlmIChjbXBBdHRyaWJ1dGVOYW1lICE9IG51bGwpIHsJCQkKLQkJCQkJRmllbGQga2V5RmllbGQgPSBwcmltYXJ5S2V5LmdldEZpZWxkKGNtcEF0dHJpYnV0ZU5hbWUpOwkKLQkJCQkJaWYgKGtleUZpZWxkICE9IG51bGwpIAkJCQkKLQkJCQkJCWZvdW5kS2V5QXR0cmlidXRlTGlzdC5hZGQoY21wQXR0cik7Ci0JCQkJfS8vIGlmCi0JCQl9IC8vaWYKLQkJfS8vIHdoaWxlCQotCQlyZXR1cm4gZm91bmRLZXlBdHRyaWJ1dGVMaXN0OwotCX0vLyBnZXRLZXlBdHRyaWJ1dGVzRnJvbUxpc3QKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlbHRhIGVsZW1lbnRzIG9mIHR3byBsaXN0cwotCSAqIAotCSAqIEBwYXJhbSBMaXN0IGZpcnN0TGlzdCAtIFRoZSBsaXN0IHRoYXQgaXMgYmVpbmcgY29tcGFyZWQgdG9vLgotCSAqIEBwYXJhbSBMaXN0IHNlY29uZExpc3QgLSBUaGUgbGlzdCB0byBjaGVjayB0aGUgZGlmZmVyZW5jZSBvZi4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQkgCi0JIC8qCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q21wQXR0cmlidXRlc0RlbHRhTGlzdCggTGlzdCBmaXJzdExpc3QsIExpc3Qgc2Vjb25kTGlzdCApIHsKLQkJTGlzdCBkaWZmQXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJaWYoIGZpcnN0TGlzdCAhPSBudWxsICYmIHNlY29uZExpc3QgIT0gbnVsbCApIHsKLQkJCUl0ZXJhdG9yIGl0ID0gc2Vjb25kTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUoIGl0Lmhhc05leHQoKSApIHsKLQkJCQlDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSlpdC5uZXh0KCk7Ci0JCQkJaWYoIGNtcEF0dHJpYnV0ZSAhPSBudWxsICYmICFmaXJzdExpc3QuY29udGFpbnMoIGNtcEF0dHJpYnV0ZSApICkgewotCQkJCQlkaWZmQXR0cmlidXRlTGlzdC5hZGQoIGNtcEF0dHJpYnV0ZSApOwotCQkJCX0vLyBpZgotCQkJfS8vIHdoaWxlCi0JCQlyZXR1cm4gZGlmZkF0dHJpYnV0ZUxpc3Q7Ci0JCX0vLyBpZgkKLQkJcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0vLyBnZXRDbXBBdHRyaWJ1dGVzRGVsdGFMaXN0Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZQcmltS2V5RmllbGRGZWF0dXJlKE1hcEluZm8gbWFwLCBOb2RlIG5vZGUsIGJvb2xlYW4gZm9yY2UpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0RU9iamVjdCgpLmVSZXNvdXJjZSgpOwotCQlib29sZWFuIG1vZEZsYWcgPSByZXMgPT0gbnVsbCA/IGZhbHNlIDogcmVzLmlzTW9kaWZpZWQoKTsKLQkJU3RyaW5nIGtleUZpZWxkID0gZ2V0RE9NVGV4dChtYXAsIG5vZGUpOwotCQkvL0RldGVybWluZSBpZiB0aGUgcHJpbS1rZXkgZmllbGQgaGFzIGNoYW5nZWQuICBJZiBzbywgdGhlbiByZWNvbXB1dGUgdGhlIGtleXM7IG90aGVyd2lzZSBsZWF2ZSAKLQkJLy9pdCBhbG9uZQotCQlpZiAoa2V5RmllbGQgIT0gbnVsbCkKLQkJCWtleUZpZWxkID0ga2V5RmllbGQudHJpbSgpOwotCQlDTVBBdHRyaWJ1dGUgZXhpc3RpbmdLZXlBdHQgPSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpOwotCQlTdHJpbmcgZXhpc3RpbmdLZXlGaWVsZCA9IGV4aXN0aW5nS2V5QXR0ID09IG51bGwgPyBudWxsIDogZXhpc3RpbmdLZXlBdHQuZ2V0TmFtZSgpOwotCQlpZiAoIWZvcmNlIAotCQkJJiYgKChrZXlGaWVsZCA9PSBudWxsICYmIGV4aXN0aW5nS2V5RmllbGQgPT0gbnVsbCkgCi0JCQkJfHwgKGtleUZpZWxkICE9IG51bGwgJiYga2V5RmllbGQuZXF1YWxzKGV4aXN0aW5nS2V5RmllbGQpKQotCQkJCXx8IChleGlzdGluZ0tleUZpZWxkICE9IG51bGwgJiYgZXhpc3RpbmdLZXlGaWVsZC5lcXVhbHMoa2V5RmllbGQpKSkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLmNsZWFyS2V5QXR0cmlidXRlcygpOyAvL25lY2Vzc2FyeSB0byBjbGVhciByZWZsZWN0ZWQgZmxhZwotCQkJQ01QQXR0cmlidXRlIGtleUF0dCA9IG51bGw7Ci0JCQlDTVBTcGVjQWRhcHRlci5zZXRQcmltS2V5RmllbGRGcm9tWG1sKGtleUZpZWxkLCBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpOwotCQkJaWYgKGtleUZpZWxkICE9IG51bGwpIHsKLQkJCQlrZXlBdHQgPSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuYWRkS2V5QXR0cmlidXRlTmFtZShrZXlGaWVsZCwgZmFsc2UpOwotCQkJCWlmIChrZXlBdHQgIT0gbnVsbCkgewotCQkJCQkvL1RoaXMgaXMgYW4gaW52YWxpZCBzdGF0ZS4KLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5TmFtZSgpOwotCQkJCQlKYXZhQ2xhc3MgcmVmID0gbnVsbDsKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJCQkJcmVmID0gSmF2YUNsYXNzSW1wbC5jcmVhdGVDbGFzc1JlZihjbGFzc05hbWUpOwotCQkJCQlrZXlBdHQuc2V0RVR5cGUocmVmKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vSGFjayB0byBmb3JjZSB0aGUgVUkgdG8gcmVmcmVzaAotCQkJCUVMaXN0IGtleXMgPSBnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuZ2V0S2V5QXR0cmlidXRlcygpOwotCQkJCWlmICgha2V5cy5pc0VtcHR5KCkpCi0JCQkJCWtleXMuc2V0KDAsIGtleXMuZ2V0KDApKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNUcmFja2luZ01vZGlmaWNhdGlvbigpKQotCQkJCXJlcy5zZXRNb2RpZmllZChtb2RGbGFnKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxLZXlGaWVsZChNYXBJbmZvIG1hcCwgTm9kZSBub2RlKSB7Ci0JCVN0cmluZyBrZXlGaWVsZCA9IGdldERPTVRleHQobWFwLCBub2RlKTsKLQkJQ01QU3BlY0FkYXB0ZXIuc2V0UHJpbUtleUZpZWxkRnJvbVhtbChrZXlGaWVsZCwgZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpKTsKLQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIEFic3RyYWN0RE9NTm9kZUFkYXB0ZXIjZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCwgTWFwSW5mbykKLQkJICovCi0JCSAvKgotCQlwcm90ZWN0ZWQgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCwgTWFwSW5mbyBtYXApIHsKLQkJCWlmIChnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5KCkuaXNWZXJzaW9uMl9YKCkgJiYgQ01QX0ZJRUxELmVxdWFscyhtYXAuZ2V0RE9NTmFtZSgpKSkKLQkJCQlyZXR1cm4gZ2V0MjBDTVBBdHRyaWJ1dGVzKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW1vZk9iamVjdCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCwgbWFwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBNZXRob2QgZ2V0MjBDTVBBdHRyaWJ1dGVzLgotCQkgKiBAcGFyYW0gY29udGFpbmVyTWFuYWdlZEVudGl0eQotCQkgKiBAcmV0dXJuIExpc3QKLQkJICovCi0JCSAKLQkJIC8qCi0JCXByaXZhdGUgTGlzdCBnZXQyMENNUEF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKLQkJCUxpc3QgYWxsQXR0cmlidXRlcywgcmVtb3ZlZCwgcmVzdWx0OwotCQkJcmVtb3ZlZCA9IG51bGw7Ci0JCQlhbGxBdHRyaWJ1dGVzID0gY21wLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCQlpbnQgc2l6ZSA9IGFsbEF0dHJpYnV0ZXMuc2l6ZSgpOwotCQkJQ01QQXR0cmlidXRlIGF0dCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWF0dCA9IChDTVBBdHRyaWJ1dGUpIGFsbEF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmIChhdHQuaXNEZXJpdmVkKCkpIHsKLQkJCQkJaWYgKHJlbW92ZWQgPT0gbnVsbCkKLQkJCQkJCXJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJlbW92ZWQuYWRkKGF0dCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZWQgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCQkJcmVzdWx0LmFkZEFsbChhbGxBdHRyaWJ1dGVzKTsKLQkJCQlyZXN1bHQucmVtb3ZlQWxsKHJlbW92ZWQpOwotCQkJfSBlbHNlCi0JCQkJcmVzdWx0ID0gYWxsQXR0cmlidXRlczsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BYnN0cmFjdERPTU5vZGVBZGFwdGVyI25vdGlmeUNoYW5nZWQobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpTm90aWZpZXIsIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkJICovCi0JCSAKLQkJIC8qCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBDb250YWluZXJNYW5hZ2VkRW50aXR5LkRFUklWRURfRkxBR19DSEFOR0UpCi0JCQkJdXBkYXRlRE9NRmVhdHVyZShnZXRNYXAoQ01QX0ZJRUxEKSwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJZWxzZQotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCXByaXZhdGUgTWFwSW5mbyBnZXRNYXAoU3RyaW5nIGFOb2RlTmFtZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWFwcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChhTm9kZU5hbWUuZXF1YWxzKGZNYXBzW2ldLmdldERPTU5hbWUoKSkpCi0JCQkJCXJldHVybiBmTWFwc1tpXTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCSovCi0JfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VKQkphclRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VKQkphclRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjMGUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FSkJKYXJUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5KYXZhQ2xhc3NUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Tb3VyY2VMaW5rVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIEVKQkphclRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSwgSjJFRUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT01NT05fUEtHID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JcHVibGljIHN0YXRpYyBFSkJKYXJUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IEVKQkphclRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvclBhdGggRU5URVJQUklTRV9CRUFOX05BTUVfVFJBTlNMQVRPUl9QQVRIID0KLQkJCW5ldyBUcmFuc2xhdG9yUGF0aCgKLQkJCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJbmV3IFRyYW5zbGF0b3IoRUpCX0pBUiwgUk9PVF9GRUFUVVJFKSwKLQkJCQkJbmV3IFRyYW5zbGF0b3IoRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvci5FTlRFUlBSSVNFX0JFQU5TX1BBVEgsIEVKQl9QS0cuZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpKSwKLQkJCQkJbmV3IFRyYW5zbGF0b3IoRUpCX05BTUUsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fTmFtZSgpKX0pOwotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIENNUl9GSUVMRF9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihDTVJfRklFTERfTkFNRSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBDTVJfRklFTERfVFlQRV9UUkFOU0xBVE9SID0gbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoQ01SX0ZJRUxEX1RZUEUsIEVKQl9QS0cuZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBST0xFX1NPVVJDRV9FSkJfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IgPSBuZXcgU291cmNlTGlua1RyYW5zbGF0b3IoRUpCX05BTUUsIEVKQl9QS0cuZ2V0Um9sZVNvdXJjZV9FbnRpdHlCZWFuKCksIEVOVEVSUFJJU0VfQkVBTl9OQU1FX1RSQU5TTEFUT1JfUEFUSCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUUsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Sb2xlTmFtZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIE1VTFRJUExJQ0lUWV9UUkFOU0xBVE9SID0gbmV3IE11bHRpcGxpY2l0eVRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIENBU0NBREVfREVMRVRFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihDQVNDQURFX0RFTEVURSwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Nhc2NhZGVEZWxldGUoKSwgVHJhbnNsYXRvci5FTVBUWV9UQUcpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRUpCX1JFTEFUSU9OX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEVKQl9SRUxBVElPTl9OQU1FLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uX05hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBVTkNIRUNLRURfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFVOQ0hFQ0tFRCwgRUpCX1BLRy5nZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBNRVRIT0RfUEVSTUlTU0lPTl9ST0xFX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SID0gbmV3IFNvdXJjZUxpbmtUcmFuc2xhdG9yKFJPTEVfTkFNRSxFSkJfUEtHLmdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKSxuZXcgVHJhbnNsYXRvclBhdGgoCi0JCW5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoQVNTRU1CTFlfREVTQ1JJUFRPUiwgQ09OVEFJTkVSX0ZFQVRVUkUpLAotCQkJbmV3IFRyYW5zbGF0b3IoU0VDVVJJVFlfUk9MRSwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFJPTEVfTkFNRSwgQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCkpCi0JCX0pKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFNFQ19ST0xFX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFJPTEVfTkFNRSwgQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksCW5ldyBUcmFuc2xhdG9yUGF0aCgKLQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihBU1NFTUJMWV9ERVNDUklQVE9SLCBDT05UQUlORVJfRkVBVFVSRSksCi0JCQluZXcgVHJhbnNsYXRvcihNRVRIT0RfUEVSTUlTU0lPTiwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFLCBFSkJfUEtHLmdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihST0xFX05BTUUsIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9Sb2xlTmFtZSgpKQotCQl9KSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBUUkFOU19BVFRSSUJVVEVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFRSQU5TX0FUVFJJQlVURSwgRUpCX1BLRy5nZXRNZXRob2RUcmFuc2FjdGlvbl9UcmFuc2FjdGlvbkF0dHJpYnV0ZSgpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIE1FVEhPRF9FTEVNRU5UX0VKQl9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUiA9IG5ldyBTb3VyY2VMaW5rVHJhbnNsYXRvcihFSkJfTkFNRSwgRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X0VudGVycHJpc2VCZWFuKCksIEVKQkphclRyYW5zbGF0b3IuRU5URVJQUklTRV9CRUFOX05BTUVfVFJBTlNMQVRPUl9QQVRIKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIE1FVEhPRF9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihNRVRIT0RfTkFNRSwgRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X05hbWUoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBNRVRIT0RfUEFSQU1fVFJBTlNMQVRPUiA9IG5ldyBNZXRob2RQYXJhbXNUcmFuc2xhdG9yKEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9QYXJtcygpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIE1FVEhPRF9FTEVNRU5UX0tJTkRfVFJBTlNMQVRPUiA9IG5ldyBNZXRob2RFbGVtZW50S2luZFRyYW5zbGF0b3IoKTsKLQkKLQlwdWJsaWMgRUpCSmFyVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRUpCX0pBUiwgRUpCX1BLRy5nZXRFSkJKYXIoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwKLQkJCW5ldyBFbnRlcnByaXNlQmVhbnNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVSZWxhdGlvbnNoaXBzVHJhbnNsYXRvcjEzKCksCi0JCQljcmVhdGVBc3NlbWJseURlc2NyaXB0b3JUcmFuc2xhdG9yMTMoKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVKQl9DTElFTlRfSkFSLCBFSkJfUEtHLmdldEVKQkphcl9FamJDbGllbnRKYXIoKSksCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxNENoaWxkcmVuKCkgewotCQlyZXR1cm4JbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihWRVJTSU9OLCBFSkJfUEtHLmdldEVKQkphcl9WZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytFSkJfSkFSX1NDSEVNQV9MT0NfMl8xKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAotCQkJbmV3IEVudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVJlbGF0aW9uc2hpcHNUcmFuc2xhdG9yMTQoKSwKLQkJCWNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvclRyYW5zbGF0b3IxNCgpLAotCQkJbmV3IFRyYW5zbGF0b3IoRUpCX0NMSUVOVF9KQVIsIEVKQl9QS0cuZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpKSwKLQkJLy8JQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRFSkJKYXJfRXh0ZW5zaW9ucygpKQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSZWxhdGlvbnNoaXBzVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVMQVRJT05TSElQUywgRUpCX1BLRy5nZXRFSkJKYXJfUmVsYXRpb25zaGlwTGlzdCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb24oKSksCi0JCQkJY3JlYXRlRUpCUmVsYXRpb25zVHJhbnNsYXRvcjEzKCksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVsYXRpb25zVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRUpCX1JFTEFUSU9OLCBFSkJfUEtHLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb24oKSksCi0JCQkJRUpCX1JFTEFUSU9OX05BTUVfVFJBTlNMQVRPUiwKLQkJCQljcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlVHJhbnNsYXRvcjEzKCksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZVRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEVKQl9SRUxBVElPTlNISVBfUk9MRSwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBSb2xlcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb24oKSksCi0JCQkJRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUVfVFJBTlNMQVRPUiwKLQkJCQlNVUxUSVBMSUNJVFlfVFJBTlNMQVRPUiwKLQkJCQlDQVNDQURFX0RFTEVURV9UUkFOU0xBVE9SLAotCQkJCWNyZWF0ZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUcmFuc2xhdG9yMTMoKSwKLQkJCQljcmVhdGVDTVJGaWVsZFRyYW5zbGF0b3IxMygpLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRUxBVElPTlNISVBfUk9MRV9TT1VSQ0UsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Tb3VyY2UoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9uKCkpLAotCQkJCVJPTEVfU09VUkNFX0VKQl9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUiwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVDTVJGaWVsZFRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENNUl9GSUVMRCwgRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9uKCkpLAotCQkJCUNNUl9GSUVMRF9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJQ01SX0ZJRUxEX1RZUEVfVFJBTlNMQVRPUgotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIEoyRUUgMS40IFJlbGF0aW9uc2hpcAotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSZWxhdGlvbnNoaXBzVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVMQVRJT05TSElQUywgRUpCX1BLRy5nZXRFSkJKYXJfUmVsYXRpb25zaGlwTGlzdCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCkpLAotCQkJCWNyZWF0ZUVKQlJlbGF0aW9uc1RyYW5zbGF0b3IxNCgpLAotCQkvLwkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRSZWxhdGlvbnNoaXBzX0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFSkJSZWxhdGlvbnNUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFSkJfUkVMQVRJT04sIEVKQl9QS0cuZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKSksCi0JCQkJRUpCX1JFTEFUSU9OX05BTUVfVFJBTlNMQVRPUiwKLQkJCQljcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlVHJhbnNsYXRvcjE0KCksCi0JCS8vCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEVKQlJlbGF0aW9uX0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRUpCX1JFTEFUSU9OU0hJUF9ST0xFLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcFJvbGVzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKSksCi0JCQkJRUpCX1JFTEFUSU9OU0hJUF9ST0xFX05BTUVfVFJBTlNMQVRPUiwKLQkJCQlNVUxUSVBMSUNJVFlfVFJBTlNMQVRPUiwKLQkJCQlDQVNDQURFX0RFTEVURV9UUkFOU0xBVE9SLAotCQkJCWNyZWF0ZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUcmFuc2xhdG9yMTQoKSwKLQkJCQljcmVhdGVDTVJGaWVsZFRyYW5zbGF0b3IxNCgpLAotCQkvLwkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVSZWxhdGlvbnNoaXBSb2xlU291cmNlVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUkVMQVRJT05TSElQX1JPTEVfU09VUkNFLCBFSkJfUEtHLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfU291cmNlKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0Um9sZVNvdXJjZV9EZXNjcmlwdGlvbnMoKSksCi0JCQkJUk9MRV9TT1VSQ0VfRUpCX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQ01SRmllbGRUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDTVJfRklFTEQsIEVKQl9QS0cuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKSksCi0JCQkJQ01SX0ZJRUxEX05BTUVfVFJBTlNMQVRPUiwKLQkJCQlDTVJfRklFTERfVFlQRV9UUkFOU0xBVE9SLAotCQkvLwkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGVfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIDw9IEoyRUUgMS4zIEFzc2VtYmx5IERlc2NyaXB0b3IgCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvclRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFTU0VNQkxZX0RFU0NSSVBUT1IsIEVKQl9QS0cuZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCWNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxMygpLAotCQkJCWNyZWF0ZU1ldGhvZFBlcm1pc3Npb25UcmFuc2xhdG9yMTMoKSwKLQkJCQljcmVhdGVNZXRob2RUcmFuc2FjdGlvblRyYW5zbGF0b3IxMygpLAotCQkJCWNyZWF0ZUV4Y2x1ZGVzTGlzdFRyYW5zbGF0b3IxMygpLAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTWV0aG9kUGVybWlzc2lvblRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FVEhPRF9QRVJNSVNTSU9OLCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBFSkJfUEtHLmdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSksCi0JCQkJVU5DSEVDS0VEX1RSQU5TTEFUT1IsCi0JCQkJTUVUSE9EX1BFUk1JU1NJT05fUk9MRV9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUiwKLQkJCQljcmVhdGVNZXRob2RFbGVtZW50VHJhbnNsYXRvcnMxMyhFSkJfUEtHLmdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kRWxlbWVudHMoKSkKLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvL1RPRE86IE5FRUQgVE8gRklHVVJFIE9VVCBTRUNVUklUWSBQQVRICQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VjdXJpdHlSb2xlVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VDVVJJVFlfUk9MRSwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb24oKSksCi0JCQkJU0VDX1JPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVNZXRob2RUcmFuc2FjdGlvblRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENPTlRBSU5FUl9UUkFOU0FDVElPTiwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb24oKSksCi0JCQkJY3JlYXRlTWV0aG9kRWxlbWVudFRyYW5zbGF0b3JzMTMoRUpCX1BLRy5nZXRNZXRob2RUcmFuc2FjdGlvbl9NZXRob2RFbGVtZW50cygpKSwKLQkJCQlUUkFOU19BVFRSSUJVVEVfVFJBTlNMQVRPUgotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlc0xpc3RUcmFuc2xhdG9yMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFWENMVURFX0xJU1QsIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCW5ldyBUcmFuc2xhdG9yW10geyAKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwgCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgRUpCX1BLRy5nZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbigpKSwgCi0JCQljcmVhdGVNZXRob2RFbGVtZW50VHJhbnNsYXRvcnMxMyhFSkJfUEtHLmdldEV4Y2x1ZGVMaXN0X01ldGhvZEVsZW1lbnRzKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVNZXRob2RFbGVtZW50VHJhbnNsYXRvcnMxMyhFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FVEhPRCwgZUZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbigpKSwKLQkJCQlNRVRIT0RfRUxFTUVOVF9FSkJfTkFNRV9TT1VSQ0VMSU5LX1RSQU5TTEFUT1IsCi0JCQkJTUVUSE9EX0VMRU1FTlRfS0lORF9UUkFOU0xBVE9SLAotCQkJCU1FVEhPRF9OQU1FX1RSQU5TTEFUT1IsCi0JCQkJTUVUSE9EX1BBUkFNX1RSQU5TTEFUT1IKLQkJCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkvKgotCSAqIEoyRUUgMS40IEFzc2VtYmx5IERlc2NyaXB0b3IgCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvclRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFTU0VNQkxZX0RFU0NSSVBUT1IsIEVKQl9QS0cuZ2V0RUpCSmFyX0Fzc2VtYmx5RGVzY3JpcHRvcigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCWNyZWF0ZVNlY3VyaXR5Um9sZVRyYW5zbGF0b3IxNCgpLAotCQkJCWNyZWF0ZU1ldGhvZFBlcm1pc3Npb25UcmFuc2xhdG9yMTQoKSwKLQkJCQljcmVhdGVNZXRob2RUcmFuc2FjdGlvblRyYW5zbGF0b3IxNCgpLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpKSwKLQkJCQljcmVhdGVFeGNsdWRlc0xpc3RUcmFuc2xhdG9yMTQoKSwKLQkJLy8JCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlcGxveW1lbnRFeHRlbnNpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25UcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVRIT0RfUEVSTUlTU0lPTiwgRUpCX1BLRy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpKSwKLQkJCQlVTkNIRUNLRURfVFJBTlNMQVRPUiwKLQkJCQlNRVRIT0RfUEVSTUlTU0lPTl9ST0xFX05BTUVfU09VUkNFTElOS19UUkFOU0xBVE9SLAotCQkJCWNyZWF0ZU1ldGhvZEVsZW1lbnRUcmFuc2xhdG9yczE0KEVKQl9QS0cuZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RFbGVtZW50cygpKQotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vVE9ETzogTkVFRCBUTyBGSUdVUkUgT1VUIFNFQ1VSSVRZIFBBVEgJCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRUNVUklUWV9ST0xFLCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSksCi0JCQkJU0VDX1JPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uVHJhbnNsYXRvcjE0KCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09OVEFJTkVSX1RSQU5TQUNUSU9OLCBFSkJfUEtHLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RUcmFuc2FjdGlvbnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbigKLQkJCW5ldyBUcmFuc2xhdG9yW10gewotCQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRNZXRob2RUcmFuc2FjdGlvbl9EZXNjcmlwdGlvbnMoKSksCi0JCQkJY3JlYXRlTWV0aG9kRWxlbWVudFRyYW5zbGF0b3JzMTQoRUpCX1BLRy5nZXRNZXRob2RUcmFuc2FjdGlvbl9NZXRob2RFbGVtZW50cygpKSwKLQkJCQlUUkFOU19BVFRSSUJVVEVfVFJBTlNMQVRPUgotCQl9KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlc0xpc3RUcmFuc2xhdG9yMTQoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFWENMVURFX0xJU1QsIEVKQl9QS0cuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oCW5ldyBUcmFuc2xhdG9yW10geyAKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoRUpCX1BLRy5nZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKSksIAotCQkJY3JlYXRlTWV0aG9kRWxlbWVudFRyYW5zbGF0b3JzMTQoRUpCX1BLRy5nZXRFeGNsdWRlTGlzdF9NZXRob2RFbGVtZW50cygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTWV0aG9kRWxlbWVudFRyYW5zbGF0b3JzMTQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNRVRIT0QsIGVGZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKAotCQkJbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb25zKCkpLAotCQkJCU1FVEhPRF9FTEVNRU5UX0VKQl9OQU1FX1NPVVJDRUxJTktfVFJBTlNMQVRPUiwKLQkJCQlNRVRIT0RfRUxFTUVOVF9LSU5EX1RSQU5TTEFUT1IsCi0JCQkJTUVUSE9EX05BTUVfVFJBTlNMQVRPUiwKLQkJCQlNRVRIT0RfUEFSQU1fVFJBTlNMQVRPUgotCQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FbnRlcnByaXNlQmVhbnNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FbnRlcnByaXNlQmVhbnNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZGMxZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5NdWx0aU9iamVjdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVhZEFoZWFkSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvciBleHRlbmRzIE11bHRpT2JqZWN0VHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5URVJQUklTRV9CRUFOU19QQVRIID0gRU5URVJQUklTRV9CRUFOUysnLycrRU5USVRZKycsJytTRVNTSU9OKycsJytNRVNTQUdFX0RSSVZFTjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHJhbnNsYXRvciBTRVNTSU9OX1RSQU5TTEFUT1IgPSBuZXcgU2Vzc2lvblRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnRpdHlUcmFuc2xhdG9yIEJNUF9UUkFOU0xBVE9SID0gbmV3IEVudGl0eVRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb250YWluZXJNYW5hZ2VkRW50aXR5VHJhbnNsYXRvciBDTVBfVFJBTlNMQVRPUj0gbmV3IENvbnRhaW5lck1hbmFnZWRFbnRpdHlUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZURyaXZlblRyYW5zbGF0b3IgTUVTU0FHRV9EUklWRU5fVFJBTlNMQVRPUiA9IG5ldyBNZXNzYWdlRHJpdmVuVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIE1hcCBkZWxlZ2F0ZXM7Ci0Jc3RhdGljIHsKLQkJZGVsZWdhdGVzID0gbmV3IEhhc2hNYXAoNyk7Ci0JCWRlbGVnYXRlcy5wdXQoU0VTU0lPTiwgU0VTU0lPTl9UUkFOU0xBVE9SKTsKLQkJZGVsZWdhdGVzLnB1dChCRUFOLCBCTVBfVFJBTlNMQVRPUik7Ci0JCWRlbGVnYXRlcy5wdXQoQ09OVEFJTkVSLCBDTVBfVFJBTlNMQVRPUik7Ci0JCWRlbGVnYXRlcy5wdXQoTUVTU0FHRV9EUklWRU4sIE1FU1NBR0VfRFJJVkVOX1RSQU5TTEFUT1IpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIEVudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVOVEVSUFJJU0VfQkVBTlNfUEFUSCwgRUpCX1BLRy5nZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCkpOwotCQlhZGRSZWFkQWhlYWRIZWxwZXIobmV3IFJlYWRBaGVhZEhlbHBlcihFTlRJVFksIG5ldyBTdHJpbmdbXSB7QkVBTiwgQ09OVEFJTkVSfSwgUEVSU0lTVEVOQ0VfVFlQRSApKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLk11bHRpT2JqZWN0VHJhbnNsYXRvciNnZXREZWxlZ2F0ZUZvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXREZWxlZ2F0ZUZvcihFT2JqZWN0IG8pIHsKLQkJc3dpdGNoIChvLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTiA6Ci0JCQkJcmV0dXJuIFNFU1NJT05fVFJBTlNMQVRPUjsKLQkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFk6Ci0JCQkJcmV0dXJuIEJNUF9UUkFOU0xBVE9SOwotCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWToKLQkJCQlyZXR1cm4gQ01QX1RSQU5TTEFUT1I7Ci0JCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU46Ci0JCQkJcmV0dXJuIE1FU1NBR0VfRFJJVkVOX1RSQU5TTEFUT1I7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmVhbiB0eXBlIGRlbGVnYXRlIGV4cGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXREZWxlZ2F0ZUZvcihTdHJpbmcgZG9tTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOwotCQlpZiAocmVhZEFoZWFkTmFtZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gKFRyYW5zbGF0b3IpIGRlbGVnYXRlcy5nZXQocmVhZEFoZWFkTmFtZSk7Ci0JCWVsc2UgCi0JCQlyZXN1bHQgPSAoVHJhbnNsYXRvcikgZGVsZWdhdGVzLmdldChkb21OYW1lKTsKLQkJCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCZWFuIHR5cGUgZGVsZWdhdGUgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VudGl0eVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VudGl0eVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwNWFjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FbnRpdHlUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlUcmFuc2xhdG9yIGV4dGVuZHMgQWJzdHJhY3RFSkJUcmFuc2xhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCi0JcHJpdmF0ZSBjbGFzcyBQZXJzaXN0ZW5jZVR5cGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQkJcHVibGljIFBlcnNpc3RlbmNlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCQlzdXBlcihQRVJTSVNURU5DRV9UWVBFLCAoRVN0cnVjdHVyYWxGZWF0dXJlKSBudWxsKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNleHRyYWN0U3RyaW5nVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGV4dHJhY3RTdHJpbmdWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVHlwZSgpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCQkJICAgKi8KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRkNoaWxkcmVuKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGdldFBlcnNpc3RlbmNlVHlwZSgpKTsKLQkJfQotCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIEJFQU47Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBFbnRpdHlUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFTlRFUlBSSVNFX0JFQU5TICsgJy8nICsgRU5USVRZKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5BYnN0cmFjdEVKQlRyYW5zbGF0b3IjZ2V0U3BlY2lmaWNNYXBzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldFNwZWNpZmljTWFwcyhpbnQgdmVyc2lvbklEKSB7Ci0JCVRyYW5zbGF0b3IgcmVlbnRyYW50VHJhbnNsYXRvciA9IG51bGw7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIEoyRUVfMV8yX0lEIDoKLQkJCWNhc2UgSjJFRV8xXzNfSUQgOgotCQkJCXJlZW50cmFudFRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRvcihSRUVOVFJBTlQsIEVKQl9QS0cuZ2V0RW50aXR5X1JlZW50cmFudCgpLCBVTlNFVF9JRl9OVUxMKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSjJFRV8xXzRfSUQgOgotCQkJCXJlZW50cmFudFRyYW5zbGF0b3IgPSBuZXcgQm9vbGVhblRyYW5zbGF0b3IoUkVFTlRSQU5ULCBFSkJfUEtHLmdldEVudGl0eV9SZWVudHJhbnQoKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7IG5ldyBQZXJzaXN0ZW5jZVR5cGVUcmFuc2xhdG9yKCksIG5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFBSSU1fS0VZX0NMQVNTLCBFSkJfUEtHLmdldEVudGl0eV9QcmltYXJ5S2V5KCkpLCByZWVudHJhbnRUcmFuc2xhdG9yIH07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVudGl0eSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblR5cGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZmUxYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0pNUyA9ICJqYXZheC5qbXMuIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKERFU1RJTkFUSU9OX1RZUEUsIEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1R5cGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpewotCQkJRW51bWVyYXRvciBlbnVtZXJhdG9yID0gKEVudW1lcmF0b3IpIHZhbHVlOwotCQkJaWYgKGVudW1lcmF0b3IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gSkFWQVhfSk1TICsgZW51bWVyYXRvci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VmFsdWVUb1N0cmluZyh2YWx1ZSwgb3duZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJU3RyaW5nIGNvcnJlY3QgPSBzdHJWYWx1ZTsKLQkJaWYgKHN0clZhbHVlICE9IG51bGwpCi0JCQljb3JyZWN0ID0gc3RyVmFsdWUuc3Vic3RyaW5nKEpBVkFYX0pNUy5sZW5ndGgoKSk7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShjb3JyZWN0LCBvd25lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlblRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Yzc2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uSmF2YUNsYXNzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5HZW5lcmljVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURyaXZlblRyYW5zbGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVKQlRyYW5zbGF0b3IgewotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgVFJBTlNBQ1RJT05fVFlQRV9YTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihUUkFOU0FDVElPTl9UWVBFLCBFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5fVHJhbnNhY3Rpb25UeXBlKCkpOwotCQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBNZXNzYWdlRHJpdmVuVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoRU5URVJQUklTRV9CRUFOUysnLycrTUVTU0FHRV9EUklWRU4pOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewotCQlzd2l0Y2ggKHZlcnNpb25JRCkgewotCQkJY2FzZSBKMkVFXzFfNF9JRDoKLQkJCQlyZXR1cm4gZ2V0U3BlY2lmaWNNYXBzMTQoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGdldFNwZWNpZmljTWFwczEzKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMxMygpIHsKLQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJVFJBTlNBQ1RJT05fVFlQRV9YTEFUT1IsCi0JCQkKLQkJCS8vRUpCIDIuMCBQQVRICi0JCQluZXcgVHJhbnNsYXRvcihNRVNTQUdFX1NFTEVDVE9SLCBFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZVNlbGVjdG9yKCkpLAotCQkJbmV3IEFja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblRyYW5zbGF0b3IoKSwKLQkJCQotCQl9OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldFNwZWNpZmljTWFwczE0KCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCS8vRUpCIDIuMSBPbmx5Ci0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihNRVNTQUdJTkdfVFlQRSwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2luZ1R5cGUoKSksCi0JCQkvL0JvdGgKLQkJCVRSQU5TQUNUSU9OX1RZUEVfWExBVE9SLAotCQkJLy9FSkIgMi4xIFBBVEgKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKE1FU1NBR0VfREVTVF9UWVBFLCBFSkJfUEtHLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVTU0FHRV9ERVNUX0xJTkssIEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbl9MaW5rKCkpLAotCQkJY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ3VyYXRpb25NYXBzKCksCi0JCX07IAotCX0KLQkKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjdGl2YXRpb25Db25maWd1cmF0aW9uTWFwcygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFDVElWQVRJT05fQ09ORiwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVKQl9QS0cuZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSksCi0JCQljcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllc01hcCgpLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihFSkJfUEtHLmdldEFjdGl2YXRpb25Db25maWdfRXh0ZW5zaW9ucygpKQotCQl9KTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzTWFwKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQUNUSVZBVElPTl9DT05GX1BST1BFUlRZLCBFSkJfUEtHLmdldEFjdGl2YXRpb25Db25maWdfQ29uZmlnUHJvcGVydGllcygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoQUNUSVZBVElPTl9DT05GX1BST1BFUlRZX05BTUUsIEVKQl9QS0cuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X05hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihBQ1RJVkFUSU9OX0NPTkZfUFJPUEVSVFlfVkFMVUUsIEVKQl9QS0cuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkpCi0JCX0pOwkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OLEVKQl9QS0cuZ2V0TWVzc2FnZURyaXZlbl9EZXN0aW5hdGlvbigpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKCBuZXcgVHJhbnNsYXRvcltdewotCQkJbmV3IE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblR5cGVUcmFuc2xhdG9yKCksCi0JCQluZXcgVHJhbnNsYXRvcihTVUJTQ1JJUFRJT05fRFVSQUJJTElUWSwgRUpCX1BLRy5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0JCi0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkFic3RyYWN0RUpCVHJhbnNsYXRvciNnZXRFbmRNYXBzMTMoKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczEzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV8zLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzMsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfMywKLQkJCW5ldyBTZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvcigpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfMywKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX0VOVl9SRUZfMV8zCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczE0KCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfTE9DQUxfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1NFUlZJQ0VfUkVGXzFfNCwJCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfRU5WX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9NRVNTQUdFX0RFU1RfUkVGXzFfNCwKLQkJCW5ldyBTZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5BYnN0cmFjdEVKQlRyYW5zbGF0b3IjdXNlc0hvbWVSZW1vdGVBdHRyaWJ1dGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzSG9tZVJlbW90ZUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZEVsZW1lbnRLaW5kVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWV0aG9kRWxlbWVudEtpbmRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDczMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWV0aG9kRWxlbWVudEtpbmRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEtpbmRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0gICAgICogQHBhcmFtIGVDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RFbGVtZW50S2luZFRyYW5zbGF0b3IoKXsKLQkJc3VwZXIoTUVUSE9EX0lOVEYsIEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9UeXBlKCkpOwotICAgIH0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlPYmplY3Qgb2JqID0gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoc3RyVmFsdWUsIG93bmVyKTsKLQkJaWYob2JqICE9IG51bGwpCi0JCQlyZXR1cm4gb2JqOwotCQlTdHJpbmcgY29ycmVjdCA9IHN0clZhbHVlOwotCQlpZiAoc3RyVmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiSE9NRSIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gIkhvbWUiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHN0clZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIlJFTU9URSIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gIlJlbW90ZSI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoc3RyVmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiTE9DQUxIT01FIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiTG9jYWxIb21lIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChzdHJWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJMT0NBTCIpKSAvLyROT04tTkxTLTEkCi0JCQljb3JyZWN0ID0gIkxvY2FsIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoY29ycmVjdCwgb3duZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc1NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLSAgICAgICAgaWYgKCgoTWV0aG9kRWxlbWVudCllbWZPYmplY3QpLmdldFR5cGUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKQotICAgICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gc3VwZXIuaXNTZXRNT0ZWYWx1ZShlbWZPYmplY3QpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JCWlmKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiAwKSB7Ci0JCQlNZXRob2RFbGVtZW50S2luZCBtZXRob2RJbnRmID0gKE1ldGhvZEVsZW1lbnRLaW5kKSByZXN1bHQuZ2V0KDApOwotCQkJaWYobWV0aG9kSW50Zi5nZXRWYWx1ZSgpID09IE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEKSAKLQkJCQlyZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZFBhcmFtc1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZFBhcmFtc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkODE2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXRob2RQYXJhbXNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgZGZob2x0dHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFyYW1zVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckl7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQotCS8vcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU7Ci0KLSAgICBwdWJsaWMgTWV0aG9kUGFyYW1zVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLSAgICAgICAgc3VwZXIoTUVUSE9EX1BBUkFNUysnLycrTUVUSE9EX1BBUkFNICwgZUZlYXR1cmUpOwotICAgICAgICAvL3RoaXMuZUZlYXR1cmUgPSBlRmVhdHVyZTsKLSAgICAgICAgdGhpcy5mU3R5bGUgfD0gVHJhbnNsYXRvci5FTVBUWV9DT05URU5UX0lTX1NJR05JRklDQU5UOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNdWx0aVZhbHVlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aVZhbHVlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRkNoaWxkcmVuKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldE1PRkNoaWxkcmVuKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0gCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KW1vZk9iamVjdCkuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJTGlzdCBtZXRob2RQYXJhbXMgPSAoKE1ldGhvZEVsZW1lbnQpbW9mT2JqZWN0KS5nZXRNZXRob2RQYXJhbXMoKTsKLQkJCi0gICAgCWlmKHZhbHVlID09IG51bGwgfHwgdmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7ICAKLSAgICAJCWlmKG1ldGhvZFBhcmFtcyA9PSBudWxsIHx8IG1ldGhvZFBhcmFtcy5zaXplKCkgPT0gMCApIHsKLSAgICAJCQlzZXRNT0ZWYWx1ZUZyb21FbXB0eURPTVBhdGgobW9mT2JqZWN0KTsKLQkJCX0KLSAgICAJfSBlbHNlIHsKLQkJCSgoTWV0aG9kRWxlbWVudCltb2ZPYmplY3QpLmFkZE1ldGhvZFBhcmFtcygoU3RyaW5nKXZhbHVlKTsKLSAgICAJfQotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUsIGludCBuZXdJbmRleCkgewotCQkoKE1ldGhvZEVsZW1lbnQpb3duZXIpLmFkZE1ldGhvZFBhcmFtcygoU3RyaW5nKXZhbHVlKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjbGVhckxpc3Qob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJMaXN0KEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCSgoTWV0aG9kRWxlbWVudCltb2ZPYmplY3QpLmVVbnNldChmZWF0dXJlKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmRlckVtcHR5RE9NUGF0aChFT2JqZWN0IGVPYmplY3QpIHsKLQkJTWV0aG9kRWxlbWVudCBtZSA9ICgoTWV0aG9kRWxlbWVudCllT2JqZWN0KTsKLQkJcmV0dXJuIG1lLmhhc01ldGhvZFBhcmFtcygpICYmIG1lLmdldE1ldGhvZFBhcmFtcygpLmlzRW1wdHkoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWVGcm9tRW1wdHlET01QYXRoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlRnJvbUVtcHR5RE9NUGF0aChFT2JqZWN0IGVPYmplY3QpIHsKLQkJKChNZXRob2RFbGVtZW50KWVPYmplY3QpLmFwcGx5WmVyb1BhcmFtcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL011bHRpcGxpY2l0eVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL011bHRpcGxpY2l0eVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjMDFmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NdWx0aXBsaWNpdHlUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBhZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE11bHRpcGxpY2l0eVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIGltcGxlbWVudHMgRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJewotCQotCXB1YmxpYyBNdWx0aXBsaWNpdHlUcmFuc2xhdG9yKCl7Ci0JCXN1cGVyKE1VTFRJUExJQ0lUWSxFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJU3RyaW5nIGNvcnJlY3QgPSBzdHJWYWx1ZTsKLQkJaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJPTkUiKSkgLy8kTk9OLU5MUy0xJAotCQkJY29ycmVjdCA9ICJPbmUiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJNQU5ZIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiTWFueSI7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoY29ycmVjdCwgb3duZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvUHJpbUtleUZpZWxkVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvUHJpbUtleUZpZWxkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZjODI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1ByaW1LZXlGaWVsZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlNvdXJjZUxpbmtUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclBhdGg7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltS2V5RmllbGRUcmFuc2xhdG9yIGV4dGVuZHMgU291cmNlTGlua1RyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKiBAcGFyYW0gVHJhbnNsYXRvclBhdGgKLQkgKi8KLQlwdWJsaWMgUHJpbUtleUZpZWxkVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoUFJJTUtFWV9GSUVMRCwgRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QcmltS2V5RmllbGQoKSxuZXcgVHJhbnNsYXRvclBhdGgoCi0JCQluZXcgVHJhbnNsYXRvcltdIHsKLQkJCQluZXcgVHJhbnNsYXRvcihDTVBfRklFTEQsIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSksCi0JCQkJbmV3IFRyYW5zbGF0b3IoRklFTERfTkFNRSwgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSkKLQkJCX0pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjaWZpZWRQcmltS2V5RmllbGROYW1lKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7Ci0JCXJldHVybiBjbXAuZ2V0UHJpbUtleUZpZWxkKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJLy8gdHJ5IGFuZCBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gYSBjbXAgYXR0cmlidXRlLCBvdGhlcndpc2UgY3JlYXRlIGEgcHJveHkKLQkJT2JqZWN0IHJlc3VsdCA9IHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLCBvd25lcik7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQgPT0gc3RyVmFsdWUgLypyZWZlcmVuY2UgY2hlY2sgaXMgdmFsaWQgaGVyZSovKSB7Ci0JCQlyZXN1bHQgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQkJCWlmIChzdHJWYWx1ZSA9PSBudWxsKSBzdHJWYWx1ZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCSgoSW50ZXJuYWxFT2JqZWN0KXJlc3VsdCkuZVNldFByb3h5VVJJKFVSSS5jcmVhdGVVUkkoc3RyVmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1NlY3VyaXR5SWRlbnRpdHlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzODVmNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRWpiRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWFkQWhlYWRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBFamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbW1vblBhY2thZ2UgQ09NTU9OX1BLRyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBSVU5fQVNfVFJBTlNMQVRPUlMgPSBjcmVhdGVSdW5Bc1RyYW5zbGF0b3JzKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIFVTRV9DQUxMRVJfVFJBTlNMQVRPUlMgPSBjcmVhdGVVc2VDYWxsZXJUcmFuc2xhdG9ycygpOwotCQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjcmVhdGVSdW5Bc1RyYW5zbGF0b3JzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciBydW5Bc1RyYW5zbGF0b3IgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUlVOX0FTLCBDT01NT05fUEtHLmdldFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfSWRlbnRpdHkoKSk7Ci0JCXJ1bkFzVHJhbnNsYXRvci5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldElkZW50aXR5X0Rlc2NyaXB0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUk9MRV9OQU1FLCBDT01NT05fUEtHLmdldElkZW50aXR5X1JvbGVOYW1lKCkpCi0JCX0pOwotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9uKCkpLAotCQkJcnVuQXNUcmFuc2xhdG9yCi0JCX07Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjcmVhdGVVc2VDYWxsZXJUcmFuc2xhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFVTRV9DQUxMRVJfSURFTlRJVFksIG51bGwsIEVNUFRZX1RBRykKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKFNFQ1VSSVRZX0lERU5USVRZLCBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eUlkZW50aXR5KCkpOwotCQlhZGRSZWFkQWhlYWRIZWxwZXIobmV3IFJlYWRBaGVhZEhlbHBlcihTRUNVUklUWV9JREVOVElUWSwgbmV3IFN0cmluZ1tdIHtSVU5fQVMsIFVTRV9DQUxMRVJfSURFTlRJVFl9LCBudWxsKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0JCWlmICgoKFNlY3VyaXR5SWRlbnRpdHkpbykuaXNSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkpCi0JCQlyZXR1cm4gUlVOX0FTX1RSQU5TTEFUT1JTOwotCQllbHNlIGlmICgoKFNlY3VyaXR5SWRlbnRpdHkpbykuaXNVc2VDYWxsZXJJZGVudGl0eSgpKQotCQkJcmV0dXJuIFVTRV9DQUxMRVJfVFJBTlNMQVRPUlM7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBTZWN1cml0eSBJZGVudGl0eSBUeXBlIGV4cGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCUNvbW1vbkZhY3RvcnkgZmFjdCA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFOyAKLQkJaWYgKFJVTl9BUy5lcXVhbHMocmVhZEFoZWFkTmFtZSkpIHsKLQkJCVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgcmVzdWx0ID0gZmFjdC5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0JCQlyZXN1bHQuc2V0SWRlbnRpdHkoZmFjdC5jcmVhdGVJZGVudGl0eSgpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZSBpZiAoVVNFX0NBTExFUl9JREVOVElUWS5lcXVhbHMocmVhZEFoZWFkTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpOwotCQllbHNlIAotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1Nlc3Npb25UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9TZXNzaW9uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTNkNGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1Nlc3Npb25UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uVHJhbnNsYXRvciBleHRlbmRzIEFic3RyYWN0RUpCVHJhbnNsYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xNDsKLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVOVEVSUFJJU0VfQkVBTlMrJy8nK1NFU1NJT04pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkFic3RyYWN0RUpCVHJhbnNsYXRvciNnZXRTcGVjaWZpY01hcHMoKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0U3BlY2lmaWNNYXBzKGludCB2ZXJzaW9uSUQpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoU0VTU0lPTl9UWVBFLCBFSkJfUEtHLmdldFNlc3Npb25fU2Vzc2lvblR5cGUoKSwgVU5TRVRfSUZfTlVMTCksIAkJLy9FbnVtZXJhdGlvbgotCQkJbmV3IFRyYW5zbGF0b3IoVFJBTlNBQ1RJT05fVFlQRSwgRUpCX1BLRy5nZXRTZXNzaW9uX1RyYW5zYWN0aW9uVHlwZSgpLCBVTlNFVF9JRl9OVUxMKSAJCS8vRW51bWVyYXRpb24KLQkJfTsKLQl9Ci0JCQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5BYnN0cmFjdEVKQlRyYW5zbGF0b3IjZ2V0RUpCQ2xhc3NNYXAoKQotCSAqIAotCSAqIFN1cHBvcnQgMS40IGFuZCAxLjMKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVKQkNsYXNzTWFwKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CQkJCi0JCQkvL0oyRUUgMS40Ci0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihTRVJWSUNFX0VORFBPSU5ULEVKQl9QS0cuZ2V0U2Vzc2lvbl9TZXJ2aWNlRW5kcG9pbnQoKSksCi0JCQkvL0oyRUUgMS4zCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihFSkJfQ0xBU1MsIEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fRWpiQ2xhc3MoKSkKLQkJfTsKLQkJCi0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgotCQkJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTM7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTQgPT0gbnVsbCkKLQkJCQkJY2hpbGRyZW4xNCA9IGNyZWF0ZTE0Q2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4xNDsgCi0JCX0KLQl9Ci0JCi0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL0Vycm9yUGFnZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vRXJyb3JQYWdlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWFjMTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vRXJyb3JQYWdlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLldhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWFkQWhlYWRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvclBhZ2VUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIFdhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIEVSUk9SX0NPREVfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihFUlJPUl9DT0RFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSksCi0JCW5ldyBUcmFuc2xhdG9yKExPQ0FUSU9OLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yUGFnZV9Mb2NhdGlvbigpKQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIEVYQ0VQVElPTl9UWVBFX1hMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRVhDRVBUSU9OX1RZUEUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCkpLAotCQluZXcgVHJhbnNsYXRvcihMT0NBVElPTiwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvclBhZ2VfTG9jYXRpb24oKSkKLQl9OwotCQotCXB1YmxpYyBFcnJvclBhZ2VUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFUlJPUl9QQUdFLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9FcnJvclBhZ2VzKCkpOwotCQlhZGRSZWFkQWhlYWRIZWxwZXIobmV3IFJlYWRBaGVhZEhlbHBlcihFUlJPUl9QQUdFLCBuZXcgU3RyaW5nW10ge0VSUk9SX0NPREUsIEVYQ0VQVElPTl9UWVBFfSwgbnVsbCkpOwotCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0ID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQkJaWYgKEVSUk9SX0NPREUuZXF1YWxzKHJlYWRBaGVhZE5hbWUpKQotCQkJcmV0dXJuIGZhY3QuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0JCWVsc2UgaWYgKEVYQ0VQVElPTl9UWVBFLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKLQkJCXJldHVybiBmYWN0LmNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0JCWlmICgoKEVycm9yUGFnZSlvKS5pc0Vycm9yQ29kZSgpKQotCQkJcmV0dXJuIEVSUk9SX0NPREVfWExBVE9SUzsKLQkJZWxzZSBpZiAoKChFcnJvclBhZ2UpbykuaXNFeGNlcHRpb25UeXBlKCkpCi0JCQlyZXR1cm4gRVhDRVBUSU9OX1RZUEVfWExBVE9SUzsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IEVycm9yQ29kZSBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViQXBwVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJBcHBUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkN2QwNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJBcHBUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYmFwcGxpY2F0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uRW52RW50cnlUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLldhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Tb3VyY2VMaW5rVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckksIEoyRUVDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIFdlYmFwcGxpY2F0aW9uUGFja2FnZSBXRUJBUFBfUEtHID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTU1PTl9QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBKc3BQYWNrYWdlIEpTUF9QS0cgPSBKc3BQYWNrYWdlLmVJTlNUQU5DRTsKLQlwdWJsaWMgc3RhdGljIFdlYkFwcFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgV2ViQXBwVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjEzOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjE0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgU0VSVkxFVF9NQVBQSU5HX1RSQU5TTEFUT1IgPSBjcmVhdGVTZXJ2bGV0TWFwcGluZ1RyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFNFU1NJT05fQ09ORklHX1RSQU5TTEFUT1IgPSBjcmVhdGVTZXNzaW9uQ29uZmlnVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgV0VMQ09NRUZJTEVfVFJBTlNMQVRPUiA9IGNyZWF0ZUZpbGVMaXN0VHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgTUlNRV9NQVBQSU5HX1RSQU5TTEFUT1IgPSBjcmVhdGVNaW1lTWFwcGluZ1RyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIEVSUk9SX1BBR0VfVFJBTlNMQVRPUiA9IG5ldyBFcnJvclBhZ2VUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBMT0dJTl9DT05GSUdfVFJBTlNMQVRPUiA9IGNyZWF0ZUxvZ2luQ29uZmlnVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgRElTVFJJQlVUQUJMRV9UUkFOU0xBVE9SID0gbmV3IFRyYW5zbGF0b3IoRElTVFJJQlVUQUJMRSwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRGlzdHJpYnV0YWJsZSgpLCBFTVBUWV9UQUcpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgV0VCX1JFU09VUkNFX05BTUVfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFdFQl9SRVNPVVJDRV9OQU1FLCBXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9XZWJSZXNvdXJjZU5hbWUoKSk7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgVVJMX1BBVFRFUk5fVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKFVSTF9QQVRURVJOLCBXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgSFRUUF9NRVRIT0RfVFJBTlNMQVRPUiA9IG5ldyBUcmFuc2xhdG9yKEhUVFBfTUVUSE9ELCBXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCkpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUk9MRV9OQU1FX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihST0xFX05BTUUsIFdFQkFQUF9QS0cuZ2V0QXV0aENvbnN0cmFpbnRfUm9sZXMoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBUUkFOU1BPUlRfR1VBUkFOVEVFX1RSQU5TTEFUT1IgPSBuZXcgVHJhbnNsYXRvcihUUkFOU1BPUlRfR1VBUkFOVEVFLCBXRUJBUFBfUEtHLmdldFVzZXJEYXRhQ29uc3RyYWludF9UcmFuc3BvcnRHdWFyYW50ZWUoKSk7Ci0KLQkKLQlwcm90ZWN0ZWQgV2ViQXBwVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRXZWJBcHAoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMyA9PSBudWxsKQotCQkJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQkJCXJldHVybiBjaGlsZHJlbjEzOwkKLQkJCWRlZmF1bHQgOgotCQkJCWlmIChjaGlsZHJlbjE0ID09IG51bGwpCi0JCQkJCWNoaWxkcmVuMTQgPSBjcmVhdGUxNENoaWxkcmVuKCk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTQ7IAotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT05fUEFUSCwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9TbWFsbEljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksIAotCQkJRElTVFJJQlVUQUJMRV9UUkFOU0xBVE9SLAotCQkJY3JlYXRlQ29udGV4dFBhcmFtMTNUcmFuc2xhdG9yKCksCSAKLQkJCWNyZWF0ZUZpbHRlcjEzVHJhbnNsYXRvcigpLAkgCi0JCQljcmVhdGVGaWx0ZXJNYXBwaW5nMTNUcmFuc2xhdG9yKCksCSAKLQkJCWNyZWF0ZUxpc3RlbmVyMTNUcmFuc2xhdG9yKCksIAotCQkJY3JlYXRlU2VydmxldDEzVHJhbnNsYXRvcigpLCAKLQkJCVNFUlZMRVRfTUFQUElOR19UUkFOU0xBVE9SLAkgCi0JCQlTRVNTSU9OX0NPTkZJR19UUkFOU0xBVE9SLAkgCi0JCQlNSU1FX01BUFBJTkdfVFJBTlNMQVRPUiwJIAotCQkJV0VMQ09NRUZJTEVfVFJBTlNMQVRPUiwgCi0JCQlFUlJPUl9QQUdFX1RSQU5TTEFUT1IsIAotCQkJY3JlYXRlVGFnTGliVHJhbnNsYXRvcjEzKFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1RhZ0xpYnMoKSksIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfRU5WX1JFRl8xXzMsIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfUkVTT1VSQ0VfUkVGXzFfMywKLQkJCWNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludFRyYW5zbGF0b3IxMygpLAotCQkJTE9HSU5fQ09ORklHX1RSQU5TTEFUT1IsIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlU2VjdXJpdHlSb2xlVHJhbnNsYXRvcjEzKFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSksIAotCQkJbmV3IEVudkVudHJ5VHJhbnNsYXRvcihDT01NT05fUEtHLmdldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCksIGZhbHNlLCBmYWxzZSksIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX1JFRl8xXzMsIAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfRUpCX0xPQ0FMX1JFRl8xXzMgCi0JCX07Ci0JfQotCQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxNENoaWxkcmVuKCkgewotCQlUcmFuc2xhdG9yW10gYmVnaW4gPSAgbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihWRVJTSU9OLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9WZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytXRUJfQVBQX1NDSEVNQV9MT0NfMl80KSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAotCQkJRElTVFJJQlVUQUJMRV9UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUGFyYW1WYWx1ZVR5cGUoQ09OVEVYVF9QQVJBTSwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpKSwKLQkJCWNyZWF0ZUZpbHRlcjE0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRmlsdGVyTWFwcGluZzE0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTGlzdGVuZXIxNFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNlcnZsZXQxNFRyYW5zbGF0b3IoKSwKLQkJCVNFUlZMRVRfTUFQUElOR19UUkFOU0xBVE9SLAkgCi0JCQlTRVNTSU9OX0NPTkZJR19UUkFOU0xBVE9SLAkgCi0JCQlNSU1FX01BUFBJTkdfVFJBTlNMQVRPUiwJIAotCQkJV0VMQ09NRUZJTEVfVFJBTlNMQVRPUiwgCi0JCQlFUlJPUl9QQUdFX1RSQU5TTEFUT1IsCi0JCQljcmVhdGVKU1BDb25maWdUcmFuc2xhdG9ycygpLAotCQkJY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50VHJhbnNsYXRvcnMxNCgpLAotCQkJTE9HSU5fQ09ORklHX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVTZWN1cml0eVJvbGVUcmFuc2xhdG9yMTQoV0VCQVBQX1BLRy5nZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpKQotCQl9OwotCQlUcmFuc2xhdG9yW10gZW5kID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSksCi0JCQljcmVhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0VHJhbnNsYXRvcigpLAotCQkvLwlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEZXBsb3ltZW50RXh0ZW5zaW9uVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldFdlYkFwcF9FeHRlbnNpb25zKCkpCi0JCX07Ci0JCQotCQkKLQkJcmV0dXJuIChUcmFuc2xhdG9yW10pY29uY2F0KGJlZ2luLGNvbmNhdChjcmVhdGVKTkRJRW52aXJvbm1lbnRSZWZzR3JvdXBUcmFuc2xhdG9yKCksIGVuZCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50VHJhbnNsYXRvcnMxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX0NPTlNUUkFJTlQsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVEaXNwbGF5TmFtZVRyYW5zbGF0b3IoV0VCQVBQX1BLRy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCkpLAotCQkJY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uVHJhbnNsYXRvcjE0KCksCi0JCQljcmVhdGVBdXRoQ29uc3RyYWludFRyYW5zbGF0b3IxNCgpLAotCQkJY3JlYXRlVXNlckRhdGFDb25zdHJhaW50VHJhbnNsYXRvcjE0KCksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvblRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OLCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlXRUJfUkVTT1VSQ0VfTkFNRV9UUkFOU0xBVE9SLCAKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSksIAotCQkJVVJMX1BBVFRFUk5fVFJBTlNMQVRPUiwKLQkJCUhUVFBfTUVUSE9EX1RSQU5TTEFUT1IKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQXV0aENvbnN0cmFpbnRUcmFuc2xhdG9yMTQoKSB7IAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQVVUSF9DT05TVFJBSU5ULCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkpLCAKLQkJCVJPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludFRyYW5zbGF0b3IxNCgpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFVTRVJfREFUQV9DT05TVFJBSU5ULCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcihXRUJBUFBfUEtHLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSksIAotCQkJVFJBTlNQT1JUX0dVQVJBTlRFRV9UUkFOU0xBVE9SIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVKU1BDb25maWdUcmFuc2xhdG9ycygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEpTUF9DT05GSUcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0pzcENvbmZpZygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlVGFnTGliVHJhbnNsYXRvcjE0KEpTUF9QS0cuZ2V0SlNQQ29uZmlnX1RhZ0xpYnMoKSksCi0JCQljcmVhdGVKU1BQcm9wZXJ0eUdyb3VwVHJhbnNsYXRvcigpCi0JCX0pOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSlNQUHJvcGVydHlHcm91cFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihKU1BfUFJPUEVSVFlfR1JPVVAsIEpTUF9QS0cuZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKFVSTF9QQVRURVJOLCBKU1BfUEtHLmdldEpTUFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybigpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihFTF9JR05PUkVELCBKU1BfUEtHLmdldEpTUFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFHRV9FTkNPRElORywgSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpKSwKLQkJCW5ldyBCb29sZWFuVHJhbnNsYXRvcihTQ1JJUFRJTkdfSU5WQUxJRCwgSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKSksCi0JCQluZXcgQm9vbGVhblRyYW5zbGF0b3IoSVNfWE1MLEpTUF9QS0cuZ2V0SlNQUHJvcGVydHlHcm91cF9Jc1hNTCgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKElOQ0xVREVfUFJFTFVERSwgSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKElOQ0xVREVfQ09EQSwgSlNQX1BLRy5nZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpKQotCQl9KTsJCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVCwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmcoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQkKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTE9DQUxFX0VOQ09ESU5HX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxFLCBXRUJBUFBfUEtHLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpKSwgLy8kTk9OLU5MUy0xJAotCQkJbmV3IFRyYW5zbGF0b3IoRU5DT0RJTkcsIFdFQkFQUF9QS0cuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSkgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNyZWF0ZUpORElFbnZpcm9ubWVudFJlZnNHcm91cFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VOVl9FTlRSWV8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FSkJfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX0VKQl9MT0NBTF9SRUZfMV80LAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSk5ESV9SRUZfR1JPVVBfU0VSVklDRV9SRUZfMV80LAkKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX1JFU09VUkNFX1JFRl8xXzQsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9SRVNPVVJDRV9FTlZfUkVGXzFfNCwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkpORElfUkVGX0dST1VQX01FU1NBR0VfREVTVF9SRUZfMV80Ci0JCX07Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUZpbHRlck1hcHBpbmcxNFRyYW5zbGF0b3IoKSB7Ci0JCVRyYW5zbGF0b3IgZGlzcGF0Y2hlciA9IG5ldyBUcmFuc2xhdG9yKERJU1BBVENIRVIsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVyVHlwZSgpKTsKLQkJcmV0dXJuIEdlbmVyaWNUcmFuc2xhdG9yLmFwcGVuZENoaWxkKChHZW5lcmljVHJhbnNsYXRvciljcmVhdGVGaWx0ZXJNYXBwaW5nMTNUcmFuc2xhdG9yKCksZGlzcGF0Y2hlcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVDb250ZXh0UGFyYW0xM1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDT05URVhUX1BBUkFNLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9Db250ZXh0cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fTkFNRSwgV0VCQVBQX1BLRy5nZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1ZBTFVFLCBXRUJBUFBfUEtHLmdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXRUJBUFBfUEtHLmdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpKSwgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRmlsdGVyMTNUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRklMVEVSLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9GaWx0ZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OX1BBVEgsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT05fUEFUSCwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSX05BTUUsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyX05hbWUoKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvclBhdGgobmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgVHJhbnNsYXRvci5DT05UQUlORVJfRkVBVFVSRSksIAotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKEZJTFRFUl9NQVBQSU5HLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpKSwgCi0JCQkJCQl9KSksCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksIAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRklMVEVSX0NMQVNTLCBXRUJBUFBfUEtHLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpKSwgCi0JCQljcmVhdGVJbml0UGFyYW1UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVGaWx0ZXIxNFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihGSUxURVIsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0ZpbHRlcnMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAotCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSX05BTUUsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyX05hbWUoKSwgCi0JCQkJCQkvL1RPRE86IE1ha2Ugc3VyZSB0aGUgcGF0aCBpcyBzdGlsbCB2YWxpZAotCQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFRyYW5zbGF0b3IuQ09OVEFJTkVSX0ZFQVRVUkUpLCAKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSksIAotCQkJCQkJfSkpLAotCQkJbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoRklMVEVSX0NMQVNTLCBXRUJBUFBfUEtHLmdldEZpbHRlcl9GaWx0ZXJDbGFzcygpKSwgCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVQYXJhbVZhbHVlVHlwZShJTklUX1BBUkFNLFdFQkFQUF9QS0cuZ2V0RmlsdGVyX0luaXRQYXJhbVZhbHVlcygpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUZpbHRlck1hcHBpbmcxM1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBTb3VyY2VMaW5rVHJhbnNsYXRvcihGSUxURVJfTkFNRSwgV0VCQVBQX1BLRy5nZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlcigpLCAKLQkJCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihXRUJfQVBQLCBUcmFuc2xhdG9yLkNPTlRBSU5FUl9GRUFUVVJFKSwgCi0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoRklMVEVSLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9GaWx0ZXJzKCkpLCAKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRGaWx0ZXJfTmFtZSgpKQotCQkJCQkJfSkpLAotCQkJbmV3IFRyYW5zbGF0b3IoVVJMX1BBVFRFUk4sIFdFQkFQUF9QS0cuZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJuKCkpLCAKLQkJCW5ldyBTb3VyY2VMaW5rVHJhbnNsYXRvcihTRVJWTEVUX05BTUUsIFdFQkFQUF9QS0cuZ2V0RmlsdGVyTWFwcGluZ19TZXJ2bGV0KCksIAotCQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJCW5ldyBUcmFuc2xhdG9yKFdFQl9BUFAsIFRyYW5zbGF0b3IuQ09OVEFJTkVSX0ZFQVRVUkUpLCAKLQkJCQkJCQluZXcgVHJhbnNsYXRvcihTRVJWTEVULCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXJ2bGV0cygpKSwgCi0JCQkJCQkJbmV3IFRyYW5zbGF0b3IoU0VSVkxFVF9OQU1FLCBXRUJBUFBfUEtHLmdldFNlcnZsZXRfU2VydmxldE5hbWUoKSkgCi0JCQkJCQl9KSwgVHJhbnNsYXRvci5TVFJJTkdfUkVTVUxUX09LKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVJbml0UGFyYW1UcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihJTklUX1BBUkFNLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fTkFNRSwgV0VCQVBQX1BLRy5nZXRJbml0UGFyYW1fUGFyYW1OYW1lKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1ZBTFVFLCBXRUJBUFBfUEtHLmdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXRUJBUFBfUEtHLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpKSwgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTGlzdGVuZXIxM1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihMSVNURU5FUiwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfTGlzdGVuZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlDb21tb25UcmFuc2xhdG9ycy5MSVNURU5FUl9DTEFTU19UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTGlzdGVuZXIxNFRyYW5zbGF0b3IoKSB7Ci0JCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTElTVEVORVIsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0xpc3RlbmVycygpKTsKLQkJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAotCQkJCUNvbW1vblRyYW5zbGF0b3JzLkxJU1RFTkVSX0NMQVNTX1RSQU5TTEFUT1IKLQkJCX0pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZsZXQxM1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWTEVULCBXRUJBUFBfUEtHLmdldFdlYkFwcF9TZXJ2bGV0cygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTl9QQVRILCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OX1BBVEgsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZMRVRfTkFNRSwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCksIAotCQkJCW5ldyBUcmFuc2xhdG9yUGF0aFtdIHsKLQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1dlYkFwcCgpKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvcihTRVJWTEVUX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpKSwgCi0JCQkJCX0pLCAKLQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1dlYkFwcCgpKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSksIAotCQkJCQl9KSwgCi0JCQkJfSksCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksIAotCQkJbmV3IFdlYlR5cGVUcmFuc2xhdG9yKCksIC8vc2VydmxldC1jbGFzcyBvciBqc3AtZmlsZSAgCi0JCQljcmVhdGVJbml0UGFyYW1UcmFuc2xhdG9yKFdFQkFQUF9QS0cuZ2V0U2VydmxldF9QYXJhbXMoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTE9BRF9PTl9TVEFSVFVQLCBXRUJBUFBfUEtHLmdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJ1bkFzVHJhbnNsYXRvcjEzKFdFQkFQUF9QS0cuZ2V0U2VydmxldF9SdW5BcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxMyhXRUJBUFBfUEtHLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpKSAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmxldDE0VHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFUlZMRVQsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZMRVRfTkFNRSwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCksIAotCQkJCW5ldyBUcmFuc2xhdG9yUGF0aFtdIHsKLQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1dlYkFwcCgpKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvcihTRVJWTEVUX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpKSwgCi0JCQkJCX0pLCAKLQkJCQkJbmV3IFRyYW5zbGF0b3JQYXRoKG5ldyBUcmFuc2xhdG9yW10gewotCQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X1dlYkFwcCgpKSwgCi0JCQkJCQluZXcgVHJhbnNsYXRvcihGSUxURVJfTUFQUElORywgV0VCQVBQX1BLRy5nZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSksIAotCQkJCQl9KSwgCi0JCQkJfSksCi0JCQluZXcgV2ViVHlwZVRyYW5zbGF0b3IoKSwgLy9zZXJ2bGV0LWNsYXNzIG9yIGpzcC1maWxlICAKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVBhcmFtVmFsdWVUeXBlKElOSVRfUEFSQU0sV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X0luaXRQYXJhbXMoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoTE9BRF9PTl9TVEFSVFVQLCBXRUJBUFBfUEtHLmdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVJ1bkFzVHJhbnNsYXRvcjE0KFdFQkFQUF9QS0cuZ2V0U2VydmxldF9SdW5BcygpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZlRyYW5zbGF0b3IxNChXRUJBUFBfUEtHLmdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpKSwKLQkJLy8JQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlRGVwbG95bWVudEV4dGVuc2lvblRyYW5zbGF0b3IoV0VCQVBQX1BLRy5nZXRTZXJ2bGV0X0V4dGVuc2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVTZXJ2bGV0TWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWTEVUX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFNvdXJjZUxpbmtUcmFuc2xhdG9yKFNFUlZMRVRfTkFNRSwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0KCksIAotCQkJCW5ldyBUcmFuc2xhdG9yUGF0aChuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQkJbmV3IFRyYW5zbGF0b3IoV0VCX0FQUCwgQ09OVEFJTkVSX0ZFQVRVUkUpLCAKLQkJCQkJbmV3IFRyYW5zbGF0b3IoU0VSVkxFVCwgV0VCQVBQX1BLRy5nZXRXZWJBcHBfU2VydmxldHMoKSksIAotCQkJCQluZXcgVHJhbnNsYXRvcihTRVJWTEVUX05BTUUsIFdFQkFQUF9QS0cuZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpKSAKLQkJCQl9KSksCi0JCQluZXcgVHJhbnNsYXRvcihVUkxfUEFUVEVSTiwgV0VCQVBQX1BLRy5nZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCkpIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlc3Npb25Db25maWdUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VTU0lPTl9DT05GSUcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFNFU1NJT05fVElNRU9VVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCkpLCAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVNaW1lTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNSU1FX01BUFBJTkcsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoRVhURU5TSU9OLCBXRUJBUFBfUEtHLmdldE1pbWVNYXBwaW5nX0V4dGVuc2lvbigpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihNSU1FX1RZUEUsIFdFQkFQUF9QS0cuZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSksIAotCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRmlsZUxpc3RUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV0VMQ09NRV9GSUxFX0xJU1QsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0ZpbGVMaXN0KCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVQYXJlbnRBbmRUZXh0QXR0cmlidXRlVHJhbnNsYXRvcihXRUxDT01FX0ZJTEUsIFdFQkFQUF9QS0cuZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKSwgV0VCQVBQX1BLRy5nZXRXZWxjb21lRmlsZV9XZWxjb21lRmlsZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVRhZ0xpYlRyYW5zbGF0b3IxNChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoVEFHTElCLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoVEFHTElCX1VSSSwgSlNQX1BLRy5nZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYlVSSSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihUQUdMSUJfTE9DQVRJT04sIEpTUF9QS0cuZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJMb2NhdGlvbigpKSAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVUYWdMaWJUcmFuc2xhdG9yMTMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFRBR0xJQiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFRBR0xJQl9VUkksIFdFQkFQUF9QS0cuZ2V0VGFnTGliUmVmX1RhZ2xpYlVSSSgpKSwgCi0JCQluZXcgVHJhbnNsYXRvcihUQUdMSUJfTE9DQVRJT04sIFdFQkFQUF9QS0cuZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCkpIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludFRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFNFQ1VSSVRZX0NPTlNUUkFJTlQsIFdFQkFQUF9QS0cuZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIFdFQkFQUF9QS0cuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCkpLAotCQkJY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uVHJhbnNsYXRvcjEzKCksCi0JCQljcmVhdGVBdXRoQ29uc3RyYWludFRyYW5zbGF0b3IxMygpLAotCQkJY3JlYXRlVXNlckRhdGFDb25zdHJhaW50VHJhbnNsYXRvcjEzKCksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvblRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OLCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlXRUJfUkVTT1VSQ0VfTkFNRV9UUkFOU0xBVE9SLCAKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLFdFQkFQUF9QS0cuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9uKCkpLCAKLQkJCVVSTF9QQVRURVJOX1RSQU5TTEFUT1IsCi0JCQlIVFRQX01FVEhPRF9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUF1dGhDb25zdHJhaW50VHJhbnNsYXRvcjEzKCkgeyAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKEFVVEhfQ09OU1RSQUlOVCwgV0VCQVBQX1BLRy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXRUJBUFBfUEtHLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCkpLCAKLQkJCVJPTEVfTkFNRV9UUkFOU0xBVE9SCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludFRyYW5zbGF0b3IxMygpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFVTRVJfREFUQV9DT05TVFJBSU5ULCBXRUJBUFBfUEtHLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXRUJBUFBfUEtHLmdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbigpKSwgCi0JCQlUUkFOU1BPUlRfR1VBUkFOVEVFX1RSQU5TTEFUT1IgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTG9naW5Db25maWdUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTE9HSU5fQ09ORklHLCBXRUJBUFBfUEtHLmdldFdlYkFwcF9Mb2dpbkNvbmZpZygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoQVVUSF9NRVRIT0QsIFdFQkFQUF9QS0cuZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpLCBUcmFuc2xhdG9yLkVOVU1fRkVBVFVSRV9XSVRIX0hZUEhFTlMpLCAKLQkJCW5ldyBUcmFuc2xhdG9yKFJFQUxNX05BTUUsIFdFQkFQUF9QS0cuZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCkpLCAKLQkJCWNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ1RyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihGT1JNX0xPR0lOX0NPTkZJRywgIFdFQkFQUF9QS0cuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihGT1JNX0xPR0lOX1BBR0UsIFdFQkFQUF9QS0cuZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1Mb2dpblBhZ2UoKSksIAotCQkJbmV3IFRyYW5zbGF0b3IoRk9STV9FUlJPUl9QQUdFLCBXRUJBUFBfUEtHLmdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCkpLCAKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViVHlwZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViVHlwZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxMWUwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYmFwcGxpY2F0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuV2FyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFdlYlR5cGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIFdhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFUlZMRVRfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKSkKLQl9OwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBKU1BfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BUeXBlX0pzcEZpbGUoKSkKLQl9OwotCQotCXB1YmxpYyBXZWJUeXBlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoU0VSVkxFVF9DTEFTUysnLCcrSlNQX0ZJTEUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldF9XZWJUeXBlKCkpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQkJaWYgKCgoV2ViVHlwZSlvKS5pc0pzcFR5cGUoKSkKLQkJCXJldHVybiBKU1BfWExBVE9SUzsKLQkJZWxzZSBpZiAoKChXZWJUeXBlKW8pLmlzU2VydmxldFR5cGUoKSkKLQkJCXJldHVybiBTRVJWTEVUX1hMQVRPUlM7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBXZWIgVHlwZSBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCgoV2ViVHlwZSl2YWx1ZSkuaXNKc3BUeXBlKCkpCi0JCQlyZXR1cm4gSlNQX0ZJTEU7Ci0JCWVsc2UgaWYgKCgoV2ViVHlwZSl2YWx1ZSkuaXNTZXJ2bGV0VHlwZSgpKQotCQkJcmV0dXJuIFNFUlZMRVRfQ0xBU1M7Ci0JCWVsc2UgCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogV2ViIFR5cGUgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZmFjdCA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JCWlmIChTRVJWTEVUX0NMQVNTLmVxdWFscyhub2RlTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotCQllbHNlIGlmIChKU1BfRklMRS5lcXVhbHMobm9kZU5hbWUpKQotCQkJcmV0dXJuIGZhY3QuY3JlYXRlSlNQVHlwZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRUpCTGlua1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRUpCTGlua1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhNjJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0VKQkxpbmtUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLQotcHVibGljIGNsYXNzIEVKQkxpbmtUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIFdzZGRYbWxNYXBwZXJJIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gRUpCX0xJTktfWExBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW10gewotCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkxpbmtfRWpiTGluaygpKQotCX07Ci0JCi0JcHVibGljIEVKQkxpbmtUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFSkJfTElOSywgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47Ci0KLQkJcmV0dXJuIEVKQl9MSU5LX1hMQVRPUlM7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkgIHJldHVybiBFSkJfTElOSzsKLQl9Ci0KLQkJCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJV3NkZEZhY3RvcnkgZmFjdCA9IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2RkRmFjdG9yeSgpOwotCQlyZXR1cm4gZmFjdC5jcmVhdGVFSkJMaW5rKCk7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9FbGVtZW50TmFtZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRWxlbWVudE5hbWVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NjFiMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9FbGVtZW50TmFtZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5hbWVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIEpheHJwY21hcFhtbE1hcHBlckkgewotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSAgIEVMRU1FTlRfTkFNRV9YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbGVtZW50TmFtZV9UZXh0KCkpCi0JfTsKLQkKLQlwdWJsaWMgRWxlbWVudE5hbWVUcmFuc2xhdG9yKCkgewotCQlzdXBlcihFTEVNRU5UX05BTUUsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCkpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQotCQlyZXR1cm4gRUxFTUVOVF9OQU1FX1hMQVRPUlM7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkgIHJldHVybiBFTEVNRU5UX05BTUU7Ci0JfQotCi0JCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCUpheHJwY21hcEZhY3RvcnkgZmFjdCA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpheHJwY21hcEZhY3RvcnkoKTsKLQkJcmV0dXJuIGZhY3QuY3JlYXRlRWxlbWVudE5hbWUoKTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0ludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0ludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2M3ZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9JbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBKYXhycGNtYXBYbWxNYXBwZXJJIHsKLQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBTRVJWSUNFX0lOVEVSRkFDRV8xMFhMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLSAgICAgbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9JTlRFUkZBQ0UsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKSksCi0gICAgIGNyZWF0ZTEwV1NETFNlcnZpY2VOYW1lVHJhbnNsYXRvcigpLAotICAgICBjcmVhdGVQb3J0TWFwcGluZ1RyYW5zbGF0b3IoKQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gU0VSVklDRV9JTlRFUkZBQ0VfMTFYTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0gICAgIG5ldyBUcmFuc2xhdG9yKFNFUlZJQ0VfSU5URVJGQUNFLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCkpLAotICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9TRVJWSUNFX05BTUUsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpKSwKLSAgICAgY3JlYXRlUG9ydE1hcHBpbmdUcmFuc2xhdG9yKCkKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFSV8xMFhMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLSAgICAgbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpLAotICAgICAgY3JlYXRlMTBXU0RMUG9ydFR5cGVUcmFuc2xhdG9yKCksCi0gICAgICBjcmVhdGUxMFdTRExCaW5kaW5nVHJhbnNsYXRvcigpLAotICAgICAgY3JlYXRlMTBTRU1ldGhvZE1hcHBpbmdUcmFuc2xhdG9yKCkKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFSV8xMVhMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLSAgICAgbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpLAotICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9QT1JUX1RZUEUsIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCkpLAotICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9CSU5ESU5HLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCkpLAotICAgICBjcmVhdGUxMVNFTWV0aG9kTWFwcGluZ1RyYW5zbGF0b3IoKQotCX07Ci0JCi0JcHVibGljIEludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlzdXBlcihTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HKycsJytTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCQlpZiAobyBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKQotCQkJcmV0dXJuIGdldFNlcnZpY2VJbnRlcmZhY2VUcmFuc2xhdG9yKHZlcnNpb25JRCk7Ci0JCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKQotCQkJcmV0dXJuIGdldFNFSVRyYW5zbGF0b3IodmVyc2lvbklEKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IEludGVyZmFjZU1hcHBpbmcgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKQotCQkJcmV0dXJuIFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkc7Ci0JCWVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZykKLQkJCXJldHVybiBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HOwotCQllbHNlIAotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IEludGVyZmFjZU1hcHBpbmcgZXhwZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlKYXhycGNtYXBGYWN0b3J5IGZhY3QgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXhycGNtYXBGYWN0b3J5KCk7Ci0JCWlmIChTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HLmVxdWFscyhub2RlTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpOwotCQllbHNlIGlmIChTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HLmVxdWFscyhub2RlTmFtZSkpCi0JCQlyZXR1cm4gZmFjdC5jcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotICAgcHJpdmF0ZSBUcmFuc2xhdG9yW10gZ2V0U2VydmljZUludGVyZmFjZVRyYW5zbGF0b3IoaW50IHZlcnNpb25JRCkKLSAgIHsKLQkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfSU5URVJGQUNFXzEwWExBVE9SUzsJCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gU0VSVklDRV9JTlRFUkZBQ0VfMTFYTEFUT1JTOyAKLQkJfQotICAgIAotICAgfQotCi0gICBwcml2YXRlIFRyYW5zbGF0b3JbXSBnZXRTRUlUcmFuc2xhdG9yKGludCB2ZXJzaW9uSUQpCi0gICB7Ci0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJCXJldHVybiBTRUlfMTBYTEFUT1JTOwkKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBTRUlfMTFYTEFUT1JTOyAKLQkJfQotICAgIAotICAgfQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXU0RMU2VydmljZU5hbWVUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgQ29tbW9uUGFja2FnZSBjb21tb25QYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX1NFUlZJQ0VfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVBvcnRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihQT1JUX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBX1BPUlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRQb3J0TWFwcGluZ19KYXZhUG9ydE5hbWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkvKgotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBQb3J0TWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUE9SVF9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFBvcnRNYXBwaW5nX1BvcnROYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFWQV9QT1JUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0JKi8KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXU0RMUG9ydFR5cGVUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgQ29tbW9uUGFja2FnZSBjb21tb25QYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7CSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfUE9SVF9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBjb21tb25QYWNrYWdlLmdldFFOYW1lX0xvY2FsUGFydCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExCaW5kaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JICAgIENvbW1vblBhY2thZ2UgY29tbW9uUGFja2FnZSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwkgICAgCSAgICAKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfQklORElORywgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBjb21tb25QYWNrYWdlLmdldFFOYW1lX0xvY2FsUGFydCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFNFTWV0aG9kTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBX01FVEhPRF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX09QRVJBVElPTiwgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxPcGVyYXRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihXUkFQUEVEX0VMRU1FTlQsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyksCi0JCQljcmVhdGUxME1ldGhvZFBhcmFtUGFydHNNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTExU0VNZXRob2RNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBVkFfTUVUSE9EX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19KYXZhTWV0aG9kTmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfT1BFUkFUSU9OLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdSQVBQRURfRUxFTUVOVCwgamF4cnBjbWFwUGFja2FnZS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dyYXBwZWRFbGVtZW50KCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKSwKLQkJCWNyZWF0ZTExTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQljcmVhdGUxMVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX1BPU0lUSU9OLCBqYXhycGNtYXBQYWNrYWdlLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpKSwKLQkJCWNyZWF0ZTEwV1NETE1lc3NhZ2VNYXBwaW5nVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTExTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9QT1NJVElPTiwgamF4cnBjbWFwUGFja2FnZS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKSksCi0JCQljcmVhdGUxMVdTRExNZXNzYWdlTWFwcGluZ1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExNZXNzYWdlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIEpheHJwY21hcFBhY2thZ2UgamF4cnBjbWFwUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV1NETF9NRVNTQUdFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0gICAgICAgICAgY3JlYXRlMTBXU0RMTWVzc2FnZVRyYW5zbGF0b3IoamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1FVEVSX01PREUsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1BhcmFtZXRlck1vZGUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTT0FQX0hFQURFUiwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyksCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZTExV1NETE1lc3NhZ2VNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgSmF4cnBjbWFwUGFja2FnZSBqYXhycGNtYXBQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLSAgICAgICAgICBDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9NRVNTQUdFLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFdTRExfTUVTU0FHRV9QQVJUX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTUVURVJfTU9ERSwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNPQVBfSEVBREVSLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExNZXNzYWdlTWFwcGluZ19Tb2FwSGVhZGVyKCksIFRyYW5zbGF0b3IuRU1QVFlfVEFHKSwKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXU0RMTWVzc2FnZVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkgICAgLy9KYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgQ29tbW9uUGFja2FnZSBjb21tb25QYWNrYWdlID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7CSAgICAJICAgIAkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX01FU1NBR0UsIGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihOQU1FU1BBQ0VVUkksIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTE9DQUxQQVJULCBjb21tb25QYWNrYWdlLmdldFFOYW1lX0xvY2FsUGFydCgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihNRVRIT0RfUkVUVVJOX1ZBTFVFLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSksCi0JCQljcmVhdGUxMFdTRExNZXNzYWdlVHJhbnNsYXRvcihqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGUxMVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdUcmFuc2xhdG9yKCkgewotCSAgICBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihNRVRIT0RfUkVUVVJOX1ZBTFVFLCBqYXhycGNtYXBQYWNrYWdlLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSksCi0gICAgICAgICAgQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFdTRExfTUVTU0FHRSwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9NRVNTQUdFX1BBUlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9KYXhycGNtYXBUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2YzhjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmNvbW1vbi5Db21tb25UcmFuc2xhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBKYXhycGNtYXBUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBKYXhycGNtYXBYbWxNYXBwZXJJLCBKMkVFQ29uc3RhbnRzewotCXB1YmxpYyBzdGF0aWMgSmF4cnBjbWFwVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBKYXhycGNtYXBUcmFuc2xhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTA7Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTE7Ci0JcHJpdmF0ZSBKYXhycGNtYXBQYWNrYWdlIGpheHJwY21hcFBhY2thZ2U7Ci0JcHJpdmF0ZSBDb21tb25QYWNrYWdlIGNvbW1vblBhY2thZ2U7Ci0JCi0JCi0JcHJvdGVjdGVkIEpheHJwY21hcFRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEpBVkFfV1NETF9NQVBQSU5HLCBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmcoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JICAgIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJY29tbW9uUGFja2FnZSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMCA9PSBudWxsKQotCQkJCXsKLQkJCQkJY2hpbGRyZW4xMCA9IGNyZWF0ZTEwQ2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTA7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTEgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWNoaWxkcmVuMTEgPSBjcmVhdGUxMUNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbjExOyAKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxMENoaWxkcmVuKCkgewotCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlUGFja2FnZU1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQljcmVhdGUxMEphdmFYTUxUeXBlTWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZTEwRXhjZXB0aW9uTWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCW5ldyBJbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxMUNoaWxkcmVuKCkgewotCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9TQ0hFTUFfTE9DKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoVkVSU0lPTiwgV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NDSEVNQV9WRVJTSU9OKSwJCQkgIAkJCSAgCi0JCQljcmVhdGVQYWNrYWdlTWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZTExSmF2YVhNTFR5cGVNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTFFeGNlcHRpb25NYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJbmV3IEludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVQYWNrYWdlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUEFDS0FHRV9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBQ0tBR0VfVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgamF4cnBjbWFwUGFja2FnZS5nZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwSmF2YVhNTFR5cGVNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihKQVZBX1hNTF9UWVBFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKENMQVNTX1RZUEUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpKSwKLQkJCWNyZWF0ZTEwUm9vdFR5cGVRbmFtZVRyYW5zbGF0b3IoKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFFOQU1FX1NDT1BFLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCkpLAotCQkJY3JlYXRlMTBWYXJpYWJsZU1hcHBpbmdUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExSmF2YVhNTFR5cGVNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihKQVZBX1hNTF9UWVBFX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEpBVkFfVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQU5PTllNT1VTX1RZUEVfUU5BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0Fub255bW91c1R5cGVRbmFtZSgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihST09UX1RZUEVfUU5BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSksCi0JCQkvL2NyZWF0ZTEwUm9vdFR5cGVRbmFtZVRyYW5zbGF0b3IoKSwgIC8vUm9vdFR5cGVRTmFtZSBpcyBzdGlsbCBnb2luZyB0byB3b3JrIHRoZSBvbGQgKDEuMykgd2F5IGJlY2F1c2Ugb2YgYW5vbnltb3VzIHR5cGVzLgotCQkJbmV3IFRyYW5zbGF0b3IoUU5BTUVfU0NPUEUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKSksCi0JCQljcmVhdGUxMVZhcmlhYmxlTWFwcGluZ1RyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBFeGNlcHRpb25NYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihFWENFUFRJT05fTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKEVYQ0VQVElPTl9UWVBFLCBqYXhycGNtYXBQYWNrYWdlLmdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpKSwKLQkJCWNyZWF0ZTEwV1NETE1lc3NhZ2VUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDb25zdHJ1Y3RvclBhcmFtT3JkZXJUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExRXhjZXB0aW9uTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoRVhDRVBUSU9OX01BUFBJTkcsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihFWENFUFRJT05fVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVRTmFtZVRyYW5zbGF0b3IoV1NETF9NRVNTQUdFLCBqYXhycGNtYXBQYWNrYWdlLmdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpKSwKLQkJCWNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1PcmRlclRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlSW50ZXJmYWNlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhV1NETE1hcHBpbmcoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBQ0tBR0VfVFlQRSwgamF4cnBjbWFwUGFja2FnZS5nZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgamF4cnBjbWFwUGFja2FnZS5nZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBSb290VHlwZVFuYW1lVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihST09UX1RZUEVfUU5BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIGNvbW1vblBhY2thZ2UuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMFZhcmlhYmxlTWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoVkFSSUFCTEVfTUFQUElORywgamF4cnBjbWFwUGFja2FnZS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfVmFyaWFibGVNYXBwaW5ncygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFWQV9WQVJJQUJMRV9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFZhcmlhYmxlTWFwcGluZ19KYXZhVmFyaWFibGVOYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoREFUQV9NRU1CRVIsIGpheHJwY21hcFBhY2thZ2UuZ2V0VmFyaWFibGVNYXBwaW5nX0RhdGFNZW1iZXIoKSwgVHJhbnNsYXRvci5FTVBUWV9UQUcpLAotCQkJbmV3IFRyYW5zbGF0b3IoWE1MX0VMRU1FTlRfTkFNRSwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExVmFyaWFibGVNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihWQVJJQUJMRV9NQVBQSU5HLCBqYXhycGNtYXBQYWNrYWdlLmdldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihKQVZBX1ZBUklBQkxFX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0VmFyaWFibGVNYXBwaW5nX0phdmFWYXJpYWJsZU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihEQVRBX01FTUJFUiwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpLCBUcmFuc2xhdG9yLkVNUFRZX1RBRyksCi0JCQluZXcgVHJhbnNsYXRvcihYTUxfQVRUUklCVVRFX05BTUUsIGpheHJwY21hcFBhY2thZ2UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihYTUxfRUxFTUVOVF9OQU1FLCBqYXhycGNtYXBQYWNrYWdlLmdldFZhcmlhYmxlTWFwcGluZ19YbWxFbGVtZW50TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFhNTF9XSUxEQ0FSRCwgamF4cnBjbWFwUGFja2FnZS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKSwgVHJhbnNsYXRvci5FTVBUWV9UQUcpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMFdTRExNZXNzYWdlVHJhbnNsYXRvcigpIHsKLQkgICAgCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX01FU1NBR0UsIGpheHJwY21hcFBhY2thZ2UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBjb21tb25QYWNrYWdlLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExPQ0FMUEFSVCwgY29tbW9uUGFja2FnZS5nZXRRTmFtZV9Mb2NhbFBhcnQoKSkJCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1PcmRlclRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIsIGpheHJwY21hcFBhY2thZ2UuZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgRWxlbWVudE5hbWVUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9KYXhycGNtYXBYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmYzg3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi0vL2ltcG9ydHMgZm9yIEoyRUUgY29yZSBjbGFzc2VzCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gd2ViIHNlcnZpY2UgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4cnBjbWFwWG1sTWFwcGVySSBleHRlbmRzIFdlYlNlcnZpY2VDb21tb25YbWxNYXBwZXJJCi17Ci0gIHB1YmxpYyBTdHJpbmcgSkFWQV9XU0RMX01BUFBJTkcgICAgICAgICAgICAgICAgICAgICAgID0iamF2YS13c2RsLW1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgQ0xBU1NfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0iY2xhc3MtdHlwZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJqYXZhLXR5cGUiOyAgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIENPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiAgICAgICAgICAgICA9ImNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlciI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIERBVEFfTUVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ImRhdGEtbWVtYmVyIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgRUxFTUVOVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgID0iZWxlbWVudC1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgRVhDRVBUSU9OX01BUFBJTkcgICAgICAgICAgICAgICAgICAgICAgID0iZXhjZXB0aW9uLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBFWENFUFRJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSJleGNlcHRpb24tdHlwZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfTUVUSE9EX05BTUUgICAgICAgICAgICAgICAgICAgICAgICA9ImphdmEtbWV0aG9kLW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBKQVZBX1BPUlRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSJqYXZhLXBvcnQtbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfVkFSSUFCTEVfTkFNRSAgICAgICAgICAgICAgICAgICAgICA9ImphdmEtdmFyaWFibGUtbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIEpBVkFfWE1MX1RZUEVfTUFQUElORyAgICAgICAgICAgICAgICAgICA9ImphdmEteG1sLXR5cGUtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HICAgICAgICAgICAgICA9Im1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgTUVUSE9EX1JFVFVSTl9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0ibWV0aG9kLXJldHVybi12YWx1ZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBBQ0tBR0VfTUFQUElORyAgICAgICAgICAgICAgICAgICAgICAgICA9InBhY2thZ2UtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBBQ0tBR0VfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9InBhY2thZ2UtdHlwZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBBUkFNRVRFUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICA9InBhcmFtZXRlci1tb2RlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUEFSQU1fUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgID0icGFyYW0tcG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBQQVJBTV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJwYXJhbS10eXBlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUE9SVF9NQVBQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgID0icG9ydC1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgUU5BTUVfU0NPUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0icW5hbWUtc2NvcGUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBBTk9OWU1PVVNfVFlQRV9RTkFNRSAgICAgICAgICAgICA9ICJhbm9ueW1vdXMtdHlwZS1xbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFJPT1RfVFlQRV9RTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICA9InJvb3QtdHlwZS1xbmFtZSI7Ly8kTk9OLU5MUy0xJAotICAvL3B1YmxpYyBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgICAgICAgICAgICAgID0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiOwotICBwdWJsaWMgU3RyaW5nIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkcgICAgICA9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HICAgICAgICAgPSJzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0gIC8vcHVibGljIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgPSJzZXJ2aWNlLWludGVyZmFjZSI7Ci0gIHB1YmxpYyBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORyAgICAgICAgICAgICAgID0ic2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICAvL3B1YmxpYyBTdHJpbmcgU09BUF9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0ic29hcF9oZWFkZXIiOwotICBwdWJsaWMgU3RyaW5nIFZBUklBQkxFX01BUFBJTkcgICAgICAgICAgICAgICAgICAgICAgICA9InZhcmlhYmxlLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXUkFQUEVEX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgPSJ3cmFwcGVkLWVsZW1lbnQiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX0JJTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJ3c2RsLWJpbmRpbmciOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX01FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSJ3c2RsLW1lc3NhZ2UiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX01FU1NBR0VfTUFQUElORyAgICAgICAgICAgICAgICAgICAgPSJ3c2RsLW1lc3NhZ2UtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfTUVTU0FHRV9QQVJUX05BTUUgICAgICAgICAgICAgICAgICA9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSJ3c2RsLW9wZXJhdGlvbiI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICA9IndzZGwtcG9ydC10eXBlIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyAgICAgICAgICAgICAgID0id3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFdTRExfU0VSVklDRV9OQU1FICAgICAgICAgICAgICAgICAgICAgICA9IndzZGwtc2VydmljZS1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgWE1MX0FUVFJJQlVURV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgPSJ4bWwtYXR0cmlidXRlLW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBYTUxfRUxFTUVOVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgPSJ4bWwtZWxlbWVudC1uYW1lIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgWE1MX1dJTERDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9InhtbC13aWxkY2FyZCI7Ly8kTk9OLU5MUy0xJAotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NPQVBSb2xlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9TT0FQUm9sZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzNTNlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NPQVBSb2xlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU09BUFJvbGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIFdzZGRYbWxNYXBwZXJJIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gU09BUF9ST0xFX1hMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltdIHsKLQkJbmV3IFRyYW5zbGF0b3IoVEVYVF9BVFRSSUJVVEVfVkFMVUUsIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUFJvbGVfU29hcFJvbGUoKSkKLQl9OwotCQotCXB1YmxpYyBTT0FQUm9sZVRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKFNPQVBfUk9MRSwgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcFJvbGVzKCkpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKG8gPT0gbnVsbCkKLQkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKLQotCQlyZXR1cm4gU09BUF9ST0xFX1hMQVRPUlM7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkgIHJldHVybiBTT0FQX1JPTEU7Ci0JfQotCi0JCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCVdzY29tbW9uRmFjdG9yeSBmYWN0ID0gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2NvbW1vbkZhY3RvcnkoKTsKLQkJcmV0dXJuIGZhY3QuY3JlYXRlU09BUFJvbGUoKTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NlcnZsZXRMaW5rVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9TZXJ2bGV0TGlua1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkMGE0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NlcnZsZXRMaW5rVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5jb21tb24uQ29tbW9uVHJhbnNsYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLQotcHVibGljIGNsYXNzIFNlcnZsZXRMaW5rVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXc2RkWG1sTWFwcGVySSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIFNFUlZMRVRfTElOS19YTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldExpbmtfU2VydmxldExpbmsoKSkKLQl9OwotCQotCXB1YmxpYyBTZXJ2bGV0TGlua1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKFNFUlZMRVRfTElOSywgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwotCi0JCXJldHVybiBTRVJWTEVUX0xJTktfWExBVE9SUzsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewotCSAgcmV0dXJuIFNFUlZMRVRfTElOSzsKLQl9Ci0KLQkJCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJV3NkZEZhY3RvcnkgZmFjdCA9IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2RkRmFjdG9yeSgpOwotCQlyZXR1cm4gZmFjdC5jcmVhdGVTZXJ2bGV0TGluaygpOwotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZUNvbW1vblhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZUNvbW1vblhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNjhjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VDb21tb25YbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlczsKLQotLy9pbXBvcnRzIGZvciBKMkVFIGNvcmUgY2xhc3NlcwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5EZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggb2NjdXIgaW4gCi0gKiBhbiB3ZWIgc2VydmljZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlQ29tbW9uWG1sTWFwcGVySSBleHRlbmRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySQotewotLy8gIHB1YmxpYyBTdHJpbmcgV1NETF9GSUxFICAgICAgICAgICAgICAgICAgICAgICA9ICJ3c2RsLWZpbGUiOwotLy8gIHB1YmxpYyBTdHJpbmcgSkFYUlBDX01BUFBJTkdfRklMRSAgICAgICAgICAgICA9ICJqYXhycGMtbWFwcGluZy1maWxlIjsKLSAgcHVibGljIFN0cmluZyBOQU1FU1BBQ0VVUkkgICAgICAgICAgICAgICAgICAgID0gIm5hbWVzcGFjZVVSSSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIExPQ0FMUEFSVCAgICAgICAgICAgICAgICAgICAgICAgPSAibG9jYWxwYXJ0IjsvLyROT04tTkxTLTEkCi0vLyAgcHVibGljIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSAgICAgICAgICAgICAgID0gInNlcnZpY2UtaW50ZXJmYWNlIjsKLSAgcHVibGljIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSAgICAgID0gInNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIjsvLyROT04tTkxTLTEkCi0vLyAgcHVibGljIFN0cmluZyBIQU5ETEVSICAgICAgICAgICAgICAgICAgICAgICAgID0gImhhbmRsZXIiOwotLy8gIHB1YmxpYyBTdHJpbmcgSEFORExFUl9OQU1FICAgICAgICAgICAgICAgICAgICA9ICJoYW5kbGVyLW5hbWUiOwotLy8gIHB1YmxpYyBTdHJpbmcgSEFORExFUl9DTEFTUyAgICAgICAgICAgICAgICAgICA9ICJoYW5kbGVyLWNsYXNzIjsKLSAgcHVibGljIFN0cmluZyBJTklUX1BBUkFNICAgICAgICAgICAgICAgICAgICAgID0gImluaXQtcGFyYW0iOy8vJE5PTi1OTFMtMSQKLS8vICBwdWJsaWMgU3RyaW5nIFBBUkFNX05BTUUgICAgICAgICAgICAgICAgICAgICAgPSAicGFyYW0tbmFtZSI7Ci0vLyAgcHVibGljIFN0cmluZyBQQVJBTV9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0gInBhcmFtLXZhbHVlIjsKLS8vICBwdWJsaWMgU3RyaW5nIFNPQVBfSEVBREVSICAgICAgICAgICAgICAgICAgICAgPSAic29hcC1oZWFkZXIiOwotLy8gIHB1YmxpYyBTdHJpbmcgU09BUF9ST0xFICAgICAgICAgICAgICAgICAgICAgICA9ICJzb2FwLXJvbGUiOwotLy8gIHB1YmxpYyBTdHJpbmcgUE9SVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICA9ICJwb3J0LW5hbWUiOwotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZXNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTVmNjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZXNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2Vic2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkphdmFDbGFzc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLldlYlNlcnZpY2VzRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IgaW1wbGVtZW50cyBXZWJTZXJ2aWNlc0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySXsKLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VzVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBXZWJTZXJ2aWNlc1RyYW5zbGF0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFU0NMSUVOVCA9IFdFQl9TRVJWSUNFU19DTElFTlQ7IAotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NTU9OX1BLRyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBXRUJTRVJWSUNFQ0xJRU5UX1BLRyA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuMTM7Ci0gICAgCi0JcHVibGljIFdlYlNlcnZpY2VzVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoV0VCU0VSVklDRVNDTElFTlQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnQoKSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChjaGlsZHJlbjEzID09IG51bGwpCi0JCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwotCQlyZXR1cm4gY2hpbGRyZW4xMzsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxM0NoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQljcmVhdGVTZXJ2aWNlUmVmR3JvdXBUcmFuc2xhdG9yMTMoKSwKLQkJCWNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnMxMygpCi0JCX07Ci0JfQotCS8qKgotCSAqIFRoaXMgbW9kZWwgd2FzIG1vZGVsIGZyb20gV2Vic3BoZXJlIFdlYnNlcnZpY2VzCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZVJlZkdyb3VwVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoU0VSVklDRV9SRUYsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4oIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGlzcGxheU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBDT01NT05fUEtHLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9SRUZfTkFNRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpKSwKLQkJCW5ldyBKYXZhQ2xhc3NUcmFuc2xhdG9yKFNFUlZJQ0VfSU5URVJGQUNFLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX0ZJTEUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihKQVhSUENfTUFQUElOR19GSUxFLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCkpLAotCQkJY3JlYXRlUU5hbWVUcmFuc2xhdG9yMTAoU0VSVklDRV9RTkFNRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSksCi0JCQlDb21tb25UcmFuc2xhdG9ycy5jcmVhdGVQb3J0Q29tcG9uZW50UmVmVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VydmljZVJlZkhhbmRsZXJUcmFuc2xhdG9yMTMoKSwKLQkJfSk7Ci0JCQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogVGhpcyBtb2RlbCB3YXMgbW9kZWwgZnJvbSBXZWJzcGhlcmUgV2Vic2VydmljZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyVHJhbnNsYXRvcjEzKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSEFORExFUiwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW117Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX05BTUUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihIQU5ETEVSX0NMQVNTLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpKSwKLQkJCWNyZWF0ZVBhcmFtVmFsdWVUeXBlMTMoSEFORExFUl9JTklUX1BBUkFNLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRIYW5kbGVyX0luaXRQYXJhbXMoKSksCi0JCQljcmVhdGVRTmFtZVRyYW5zbGF0b3IxMChTT0FQX0hFQURFUiwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFNPQVBfUk9MRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQT1JUX05BTUUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldEhhbmRsZXJfUG9ydE5hbWVzKCkpCi0JCX0pOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzMTMoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihDT01QX1NDT1BFRF9SRUZTLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihDT01QX0NPTVBPTkVOVF9OQU1FLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRDb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudE5hbWUoKSksIAotCQkJY3JlYXRlU2VydmljZVJlZkdyb3VwVHJhbnNsYXRvcjEzKFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIFRoaXMgbW9kZWwgd2FzIG1vZGVsIGZyb20gV2Vic3BoZXJlIFdlYnNlcnZpY2VzCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlU2VydmljZVJlZkdyb3VwVHJhbnNsYXRvcjEzKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWSUNFX1JFRiwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbiggbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwKLQkJCW5ldyBUcmFuc2xhdG9yKFNFUlZJQ0VfUkVGX05BTUUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSksCi0JCQluZXcgSmF2YUNsYXNzVHJhbnNsYXRvcihTRVJWSUNFX0lOVEVSRkFDRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9GSUxFLCBXRUJTRVJWSUNFQ0xJRU5UX1BLRy5nZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoSkFYUlBDX01BUFBJTkdfRklMRSwgV0VCU0VSVklDRUNMSUVOVF9QS0cuZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpKSwKLQkJCWNyZWF0ZVFOYW1lVHJhbnNsYXRvcjEwKFNFUlZJQ0VfUU5BTUUsIFdFQlNFUlZJQ0VDTElFTlRfUEtHLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCkpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUG9ydENvbXBvbmVudFJlZlRyYW5zbGF0b3IoKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyVHJhbnNsYXRvcigpLAotCQl9KTsKLQkJCi0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0gICAgCi0gICAgCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVFOYW1lVHJhbnNsYXRvcjEwKFN0cmluZyBkb21OYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewkJCi0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBDT01NT05fUEtHLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExPQ0FMUEFSVCwgQ09NTU9OX1BLRy5nZXRRTmFtZV9Mb2NhbFBhcnQoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGFyYW1WYWx1ZVR5cGUxMyhTdHJpbmcgZG9tTmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoZG9tTmFtZSwgZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX05BTUUsIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fVkFMVUUsIENPTU1PTl9QS0cuZ2V0UGFyYW1WYWx1ZV9WYWx1ZSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBDT01NT05fUEtHLmdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb24oKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTZkNzM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV3NkZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29tbW9uLkNvbW1vblRyYW5zbGF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgV3NkZFRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIFdzZGRYbWxNYXBwZXJJLCBKMkVFQ29uc3RhbnRzewotCXB1YmxpYyBzdGF0aWMgV3NkZFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgV3NkZFRyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMDsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMTsKLQotCXByaXZhdGUgc3RhdGljIFdzZGRQYWNrYWdlIFdTRERfUEtHID0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIFdzY29tbW9uUGFja2FnZSBXU0NPTU1PTl9QS0cgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NTU9OX1BLRyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQotCXByb3RlY3RlZCBXc2RkVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoV0VCU0VSVklDRVMsIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlcygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKLQkgICAgCi0JCQotCi0JCXN3aXRjaCAodmVyc2lvbklEKSB7Ci0JCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQlpZiAoY2hpbGRyZW4xMCA9PSBudWxsKQotCQkJCXsKLQkJCQkJY2hpbGRyZW4xMCA9IGNyZWF0ZTEwQ2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTA7CQotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKGNoaWxkcmVuMTEgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWNoaWxkcmVuMTEgPSBjcmVhdGUxMUNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbjExOyAKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxMENoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksCQkJCi0JCQljcmVhdGUxMFdlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxMUNoaWxkcmVuKCkgewotCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIEoyRUVfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEoyRUVfTlNfVVJMKycgJytXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQyksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFZFUlNJT04sIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfVkVSU0lPTiksCQkJICAKLQkJCUNvbW1vblRyYW5zbGF0b3JzLkRFU0NSSVBUSU9OU19UUkFOU0xBVE9SLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuRElTUExBWU5BTUVTX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5JQ09OU19UUkFOU0xBVE9SLAkJCQotCQkJY3JlYXRlMTFXZWJTZXJ2aWNlRGVzY1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwV2ViU2VydmljZURlc2NUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV0VCU0VSVklDRV9ERVNDUklQVElPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9MYXJnZUljb24oKSksCQkJCQkJCi0JCQluZXcgVHJhbnNsYXRvcihXRUJTRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoV1NETF9GSUxFLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihKQVhSUENfTUFQUElOR19GSUxFLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSksCQkJCi0JCQljcmVhdGUxMFBvcnRDb21wb25lbnRUcmFuc2xhdG9yKCkJCQkgIAotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTFXZWJTZXJ2aWNlRGVzY1RyYW5zbGF0b3IoKSB7Ci0JICAgIAotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV0VCU0VSVklDRV9ERVNDUklQVElPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJY3JlYXRlMTFEZXNjcmlwdGlvblRyYW5zbGF0b3IoV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpKSwKLQkJCWNyZWF0ZTExRGlzcGxheU5hbWVUcmFuc2xhdG9yKFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSksCQkJCi0JCQljcmVhdGUxMUljb25UcmFuc2xhdG9yKFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFdFQlNFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihXU0RMX0ZJTEUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKEpBWFJQQ19NQVBQSU5HX0ZJTEUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9KYXhycGNNYXBwaW5nRmlsZSgpKSwJCQkKLQkJCWNyZWF0ZTExUG9ydENvbXBvbmVudFRyYW5zbGF0b3IoKQkJCSAgCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBQb3J0Q29tcG9uZW50VHJhbnNsYXRvcigpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5ULCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpKSwJCQkJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5UX05BTUUsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKSksCi0JCQljcmVhdGUxMFdzZGxQb3J0VHJhbnNsYXRvcigpLAotCQkJbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9FTlBPSU5UX0lOVEVSRkFDRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSksCi0JCQljcmVhdGVTZXJ2aWNlSW1wbEJlYW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVIYW5kbGVyMTBUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExUG9ydENvbXBvbmVudFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVCwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfU21hbGxJY29uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9MYXJnZUljb24oKSksCQkJCQotCQkJbmV3IFRyYW5zbGF0b3IoUE9SVF9DT01QT05FTlRfTkFNRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpKSwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihXU0RMX1BPUlQsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSksCi0JCQluZXcgVHJhbnNsYXRvcihTRVJWSUNFX0VOUE9JTlRfSU5URVJGQUNFLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSwKLQkJCWNyZWF0ZVNlcnZpY2VJbXBsQmVhblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUhhbmRsZXIxMVRyYW5zbGF0b3IoKQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTBXc2RsUG9ydFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXU0RMX1BPUlQsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKE5BTUVTUEFDRVVSSSwgQ09NTU9OX1BLRy5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKSksCi0JCQluZXcgVHJhbnNsYXRvcihMT0NBTFBBUlQsIENPTU1PTl9QS0cuZ2V0UU5hbWVfTG9jYWxQYXJ0KCkpCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZVNlcnZpY2VJbXBsQmVhblRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTRVJWSUNFX0lNUExfQkVBTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlSW1wbEJlYW4oKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBTZXJ2bGV0TGlua1RyYW5zbGF0b3IoKSwKLQkJCW5ldyBFSkJMaW5rVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZUhhbmRsZXIxMFRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihIQU5ETEVSLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCkpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKERJU1BMQVlfTkFNRSwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKFNNQUxMX0lDT04sIENPTU1PTl9QS0cuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCkpLAkJCQotCQkJbmV3IFRyYW5zbGF0b3IoTEFSR0VfSUNPTiwgQ09NTU9OX1BLRy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9MYXJnZUljb24oKSksCQkJCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX05BTUUsIFdTRERfUEtHLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX0NMQVNTLCBXU0REX1BLRy5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpKSwJCQkKLQkJCWNyZWF0ZTEwSW5pdFBhcmFtVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlMTBTT0FQSGVhZGVyVHJhbnNsYXRvcigpLAotCQkJbmV3IFNPQVBSb2xlVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVIYW5kbGVyMTFUcmFuc2xhdG9yKCkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSEFORExFUiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuREVTQ1JJUFRJT05TX1RSQU5TTEFUT1IsCi0JCQlDb21tb25UcmFuc2xhdG9ycy5ESVNQTEFZTkFNRVNfVFJBTlNMQVRPUiwKLQkJCUNvbW1vblRyYW5zbGF0b3JzLklDT05TX1RSQU5TTEFUT1IsCQkJCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX05BTUUsIFdTRERfUEtHLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihIQU5ETEVSX0NMQVNTLCBXU0REX1BLRy5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpKSwJCQkKLQkJCWNyZWF0ZTExSW5pdFBhcmFtVHJhbnNsYXRvcigpLAotCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFNPQVBfSEVBREVSLCBXU0REX1BLRy5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkpLAotCQkJbmV3IFNPQVBSb2xlVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMEluaXRQYXJhbVRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihJTklUX1BBUkFNLCBXU0REX1BLRy5nZXRIYW5kbGVyX0luaXRQYXJhbXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBBUkFNX05BTUUsIFdTQ09NTU9OX1BLRy5nZXRJbml0UGFyYW1fUGFyYW1OYW1lKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fVkFMVUUsIFdTQ09NTU9OX1BLRy5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpKSwJCQkKLQkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXU0NPTU1PTl9QS0cuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCkpCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMUluaXRQYXJhbVRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihJTklUX1BBUkFNLCBXU0REX1BLRy5nZXRIYW5kbGVyX0luaXRQYXJhbXMoKSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCWNyZWF0ZTExRGVzY3JpcHRpb25UcmFuc2xhdG9yKFdTQ09NTU9OX1BLRy5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpKSwJCQkJCQkgIAotCQkJbmV3IFRyYW5zbGF0b3IoUEFSQU1fTkFNRSwgV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9QYXJhbU5hbWUoKSksCi0JCQluZXcgVHJhbnNsYXRvcihQQVJBTV9WQUxVRSwgV1NDT01NT05fUEtHLmdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwU09BUEhlYWRlclRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihTT0FQX0hFQURFUiwgV1NERF9QS0cuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTkFNRVNQQUNFVVJJLCBDT01NT05fUEtHLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExPQ0FMUEFSVCwgQ09NTU9OX1BLRy5nZXRRTmFtZV9Mb2NhbFBhcnQoKSkJCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7CQotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTExRGVzY3JpcHRpb25UcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoREVTQ1JJUFRJT04sIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFORywgQ09NTU9OX1BLRy5nZXREZXNjcmlwdGlvbl9MYW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDT01NT05fUEtHLmdldERlc2NyaXB0aW9uX1ZhbHVlKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgIFRyYW5zbGF0b3IgY3JlYXRlMTFEaXNwbGF5TmFtZVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihESVNQTEFZX05BTUUsIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJbmV3IFRyYW5zbGF0b3IoTEFORywgQ09NTU9OX1BLRy5nZXREaXNwbGF5TmFtZV9MYW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBDT01NT05fUEtHLmdldERpc3BsYXlOYW1lX1ZhbHVlKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGUxMUljb25UcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoSUNPTiwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihMQU5HLCBDT01NT05fUEtHLmdldEljb25UeXBlX0xhbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSwJCSAgCi0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgVHJhbnNsYXRvcihTTUFMTF9JQ09OLCBDT01NT05fUEtHLmdldEljb25UeXBlX1NtYWxsSWNvbigpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKExBUkdFX0lDT04sIENPTU1PTl9QS0cuZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDM1Y2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV3NkZFhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzOwotCi0vL2ltcG9ydHMgZm9yIEoyRUUgY29yZSBjbGFzc2VzCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gd2ViIHNlcnZpY2UgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJbnRlcmZhY2Ugc2hhcmVkIGJ5IHJlYWRlcnMgYW5kIAotICogd3JpdGVycyB0byBoYXZlIGFjY2VzcyB0byBjb21tb24gY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3NkZFhtbE1hcHBlckkgZXh0ZW5kcyBXZWJTZXJ2aWNlQ29tbW9uWG1sTWFwcGVySQotewotICBwdWJsaWMgU3RyaW5nIFdFQlNFUlZJQ0VTICAgICAgICAgICAgICAgICAgICAgPSAid2Vic2VydmljZXMiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXRUJTRVJWSUNFX0RFU0NSSVBUSU9OICAgICAgICAgID0gIndlYnNlcnZpY2UtZGVzY3JpcHRpb24iOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXRUJTRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUgICAgID0gIndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFBPUlRfQ09NUE9ORU5UICAgICAgICAgICAgICAgICAgPSAicG9ydC1jb21wb25lbnQiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBQT1JUX0NPTVBPTkVOVF9OQU1FICAgICAgICAgICAgID0gInBvcnQtY29tcG9uZW50LW5hbWUiOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBXU0RMX1BPUlQgICAgICAgICAgICAgICAgICAgICAgID0gIndzZGwtcG9ydCI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIFNFUlZJQ0VfSU1QTF9CRUFOICAgICAgICAgICAgICAgPSAic2VydmljZS1pbXBsLWJlYW4iOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBTRVJWTEVUX0xJTksgICAgICAgICAgICAgICAgICAgID0gInNlcnZsZXQtbGluayI7Ly8kTk9OLU5MUy0xJAotICAvL0VKQl9MSU5LIGlzIGRlZmluZWQgaW4gRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJCi0gIC8vcHVibGljIFN0cmluZyBFSkJfTElOSyAgICAgICAgICAgICAgICAgICAgICAgID0gImVqYi1saW5rIjsKLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvQ29sbGVjdGluZ0Vycm9ySGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0NvbGxlY3RpbmdFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzMzdlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvQ29sbGVjdGluZ0Vycm9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAxMToxMDozOCBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3RpbmdFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgewotCXByb3RlY3RlZCBMaXN0IGNhdWdodEV4Y2VwdGlvbnM7Ci0vKioKLSAqIENvbGxlY3RpbmdFcnJvckhhbmRsZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIENvbGxlY3RpbmdFcnJvckhhbmRsZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAqLwotcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQlnZXRDYXVnaHRFeGNlcHRpb25zKCkuYWRkKGV4Y2VwdGlvbik7Ci19Ci0vKioKLSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0gKi8KLXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQlnZXRDYXVnaHRFeGNlcHRpb25zKCkuYWRkKGV4Y2VwdGlvbik7Ci19Ci1wdWJsaWMgTGlzdCBnZXRDYXVnaHRFeGNlcHRpb25zKCkgewotCWlmIChjYXVnaHRFeGNlcHRpb25zID09IG51bGwpIHsKLQkJY2F1Z2h0RXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JcmV0dXJuIGNhdWdodEV4Y2VwdGlvbnM7Ci19Ci0KLS8qKgotICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAqLwotcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCWdldENhdWdodEV4Y2VwdGlvbnMoKS5hZGQoZXhjZXB0aW9uKTsKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjE4ZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0RlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNhdGFsb2cgb2YgYWxsIHRoZSB0YWcgbmFtZXMgd2hpY2ggbWF5IGJlIHNoYXJlZCBpbiAKLSAqIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBFSkJKYXJzLCBlYXJzLCBhbmQgd2Fycy4gSW50ZXJmYWNlIHNoYXJlZCBieSByZWFkZXJzIGFuZCAKLSAqIHdyaXRlcnMgdG8gaGF2ZSBhY2Nlc3MgdG8gY29tbW9uIGNvbnN0YW50cwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJIHsKLQlTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRElTUExBWV9OQU1FID0gImRpc3BsYXktbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJfTElOSyA9ICJlamItbGluayI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlZfRU5UUlkgPSAiZW52LWVudHJ5IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVOVl9FTlRSWV9OQU1FID0gImVudi1lbnRyeS1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVOVl9FTlRSWV9UWVBFID0gImVudi1lbnRyeS10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVOVl9FTlRSWV9WQUxVRSA9ICJlbnYtZW50cnktdmFsdWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCX0xPQ0FMX1JFRiA9ICJlamItbG9jYWwtcmVmIjsJLy8kTk9OLU5MUy0xJAkJCQkvLyBKMkVFMS4zCi0JU3RyaW5nIEVKQl9SRUYgPSAiZWpiLXJlZiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJfUkVGX05BTUUgPSAiZWpiLXJlZi1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVKQl9SRUZfVFlQRSA9ICJlamItcmVmLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSE9NRSA9ICJob21lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElDT04gPSAiaWNvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJRCA9ICJpZCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBMQVJHRV9JQ09OID0gImxhcmdlLWljb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTEFSR0VfSUNPTl9QQVRIID0gImljb24vbGFyZ2UtaWNvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBMT0NBTCA9ICJsb2NhbCI7Ly8kTk9OLU5MUy0xJAkJCQkJCQkJCS8vIEoyRUUxLjMKLQlTdHJpbmcgTE9DQUxfSE9NRSA9ICJsb2NhbC1ob21lIjsvLyROT04tTkxTLTEkCQkJCQkJLy8gSjJFRTEuMwotCVN0cmluZyBSRU1PVEUgPSAicmVtb3RlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFU19BVVRIID0gInJlcy1hdXRoIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFU19SRUZfTkFNRSA9ICJyZXMtcmVmLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVTX1NIQVJJTkdfU0NPUEUgPSAicmVzLXNoYXJpbmctc2NvcGUiOy8vJE5PTi1OTFMtMSQgCQkvLyBKMkVFMS4zIAotCVN0cmluZyBSRVNfVFlQRSA9ICJyZXMtdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSRVNPVVJDRV9FTlZfUkVGID0gInJlc291cmNlLWVudi1yZWYiOyAvLyROT04tTkxTLTEkCQkJLy8gSjJFRTEuMwotCVN0cmluZyBSRVNPVVJDRV9FTlZfUkVGX05BTUUgPSAicmVzb3VyY2UtZW52LXJlZi1uYW1lIjsvLyROT04tTkxTLTEkIC8vIEoyRUUxLjMKLQlTdHJpbmcgUkVTT1VSQ0VfRU5WX1JFRl9UWVBFID0gInJlc291cmNlLWVudi1yZWYtdHlwZSI7Ly8kTk9OLU5MUy0xJCAvLyBKMkVFMS4zCi0JU3RyaW5nIFJFU09VUkNFX1JFRiA9ICJyZXNvdXJjZS1yZWYiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUk9MRV9MSU5LID0gInJvbGUtbGluayI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBST0xFX05BTUUgPSAicm9sZS1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJVTl9BUyA9ICJydW4tYXMiOwkvLyROT04tTkxTLTEkCQkJCQkJCS8vIEoyRUUxLjMKLQlTdHJpbmcgU0VDVVJJVFlfSURFTlRJVFkgPSAic2VjdXJpdHktaWRlbnRpdHkiOwkvLyROT04tTkxTLTEkCQkvLyBKMkVFMS4zCi0JU3RyaW5nIFNFQ1VSSVRZX1JPTEUgPSAic2VjdXJpdHktcm9sZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTRUNVUklUWV9ST0xFX1JFRiA9ICJzZWN1cml0eS1yb2xlLXJlZiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTTUFMTF9JQ09OID0gInNtYWxsLWljb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU01BTExfSUNPTl9QQVRIID0gImljb24vc21hbGwtaWNvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBVU0VfQ0FMTEVSX0lERU5USVRZID0gInVzZS1jYWxsZXItaWRlbnRpdHkiOy8vJE5PTi1OTFMtMSQJCS8vIEoyRUUxLjMKLQkKLQkKLQkvLwlKMkVFIDEuNAotCVN0cmluZyBMQU5HID0gInhtbDpsYW5nIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFUExPWV9FWFQgPSAiZGVwbG95bWVudC1leHRlbnNpb24iOwkJLy8kTk9OLU5MUy0xJAkJLy8gSjJFRTEuNAotCVN0cmluZyBFWFRfRUxFTUVOVCA9ICJleHRlbnNpb24tZWxlbWVudCI7CS8vJE5PTi1OTFMtMSQJCQkvLyBKMkVFMS40Ci0JU3RyaW5nIE1FU1NBR0VfREVTVF9SRUYgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiOy8vJE5PTi1OTFMtMSQJLy8gSjJFRTEuNAotCVN0cmluZyBNRVNTQUdFX0RFU1RfUkVGX05BTUUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSI7Ly8kTk9OLU5MUy0xJAkvLyBKMkVFMS40Ci0JU3RyaW5nIE1FU1NBR0VfREVTVF9UWVBFID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSI7Ly8kTk9OLU5MUy0xJAkJCS8vIEoyRUUxLjQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUX0xJTksgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIjsJLy8kTk9OLU5MUy0xJAkJLy8gSjJFRTEuNAotCVN0cmluZyBNRVNTQUdFX0RFU1RfVVNBR0UgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSI7Ly8kTk9OLU5MUy0xJAkJLy8gSjJFRTEuNAotCVN0cmluZyBNRVNTQUdFX0RFU1QgPSAibWVzc2FnZS1kZXN0aW5hdGlvbiI7CS8vJE5PTi1OTFMtMSQJCQkvLyBKMkVFMS40Ci0JU3RyaW5nIE1FU1NBR0VfREVTVF9OQU1FID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSI7CS8vJE5PTi1OTFMtMSQJCQkvLyBKMkVFMS40Ci0JU3RyaW5nIFNFUlZJQ0VfUkVGID0gInNlcnZpY2UtcmVmIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFUlZJQ0VfUkVGX05BTUUgPSAic2VydmljZS1yZWYtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSA9ICJzZXJ2aWNlLWludGVyZmFjZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBXU0RMX0ZJTEUgPSAid3NkbC1maWxlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBWFJQQ19NQVBQSU5HX0ZJTEUgPSAiamF4cnBjLW1hcHBpbmctZmlsZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTRVJWSUNFX1FOQU1FID0gInNlcnZpY2UtcW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUE9SVF9DT01QT05FTlRfUkVGID0gInBvcnQtY29tcG9uZW50LXJlZiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBIQU5ETEVSID0gImhhbmRsZXIiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VSVklDRV9FTlBPSU5UX0lOVEVSRkFDRSA9ICJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQT1JUX0NPTVBPTkVOVF9MSU5LID0gInBvcnQtY29tcG9uZW50LWxpbmsiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSEFORExFUl9OQU1FID0gImhhbmRsZXItbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBIQU5ETEVSX0NMQVNTID0gImhhbmRsZXItY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSEFORExFUl9JTklUX1BBUkFNID0gImluaXQtcGFyYW0iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU09BUF9IRUFERVIgPSAic29hcC1oZWFkZXIiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU09BUF9ST0xFID0gInNvYXAtcm9sZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQT1JUX05BTUUgPSAicG9ydC1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfTlMgPSAieG1sbnMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX05TX1hTSSA9ICJ4bWxuczp4c2kiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWFNJX1NDSEVNQV9MT0NBVElPTiA9ICJ4c2k6c2NoZW1hTG9jYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNVVNUVU5ERVJTVEFORCA9ICJtdXN0VW5kZXJzdGFuZCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQQVJBTV9OQU1FID0gInBhcmFtLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEFSQU1fVkFMVUUgPSAicGFyYW0tdmFsdWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTElTVEVORVJfQ0xBU1MgPSAibGlzdGVuZXItY2xhc3MiOy8vJE5PTi1OTFMtMSQJLy8gU2VydmxldDIuMwotCQotCQotCQotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9FYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9FYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjODJlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvRWFyRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgY2F0YWxvZyBvZiBhbGwgdGhlIHRhZyBuYW1lcyB3aGljaCBvY2N1ciBpbiAKLSAqIGFuIEVBUiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBFYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgZXh0ZW5kcyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgewotCVN0cmluZyBBTFRfREQgPSAiYWx0LWRkIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlRFWFRfUk9PVCA9ICJjb250ZXh0LXJvb3QiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCID0gImVqYiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBID0gImphdmEiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTU9EVUxFID0gIm1vZHVsZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBXRUIgPSAid2ViIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFdFQl9VUkkgPSAid2ViLXVyaSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05ORUNUT1IgPSAiY29ubmVjdG9yIjsvLyROT04tTkxTLTEkCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0VqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0VqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTdlY2IxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9FamJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gRUpCIEphciBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEludGVyZmFjZSBzaGFyZWQgYnkgcmVhZGVycyBhbmQgCi0gKiB3cml0ZXJzIHRvIGhhdmUgYWNjZXNzIHRvIGNvbW1vbiBjb25zdGFudHMKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVqYkRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSBleHRlbmRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JU3RyaW5nIEFCU1RSQUNUX1NDSEVNQV9OQU1FID0gImFic3RyYWN0LXNjaGVtYS1uYW1lIjsgLy8kTk9OLU5MUy0xJAkvLyBFSkIyLjAKLQlTdHJpbmcgQUNLTk9XTEVER0VfTU9ERSA9ICJhY2tub3dsZWRnZS1tb2RlIjsvLyROT04tTkxTLTEkIAkJCS8vIEVKQjIuMAotCVN0cmluZyBBU1NFTUJMWV9ERVNDUklQVE9SID0gImFzc2VtYmx5LWRlc2NyaXB0b3IiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQkVBTiA9ICJCZWFuIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBU0NBREVfREVMRVRFID0gImNhc2NhZGUtZGVsZXRlIjsvLyROT04tTkxTLTEkIAkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgQ01QX0ZJRUxEID0gImNtcC1maWVsZCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTVBfVkVSU0lPTiA9ICJjbXAtdmVyc2lvbiI7CQkvLyROT04tTkxTLTEkCQkJCS8vIEVKQjIuMAotCVN0cmluZyBDTVJfRklFTEQgPSAiY21yLWZpZWxkIjsJCS8vJE5PTi1OTFMtMSQJCQkJCS8vIEVKQjIuMAotCVN0cmluZyBDTVJfRklFTERfTkFNRSA9ICJjbXItZmllbGQtbmFtZSI7Ly8kTk9OLU5MUy0xJAkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgQ01SX0ZJRUxEX1RZUEUgPSAiY21yLWZpZWxkLXR5cGUiOy8vJE5PTi1OTFMtMSQJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIENPTlRBSU5FUiA9ICJDb250YWluZXIiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVEFJTkVSX1RSQU5TQUNUSU9OID0gImNvbnRhaW5lci10cmFuc2FjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBERVNUSU5BVElPTl9UWVBFID0gImRlc3RpbmF0aW9uLXR5cGUiOwkvLyROT04tTkxTLTEkCQkvLyBFSkIyLjAKLQlTdHJpbmcgRUpCX0NMQVNTID0gImVqYi1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJfQ0xJRU5UX0pBUiA9ICJlamItY2xpZW50LWphciI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBFSkJfSkFSID0gImVqYi1qYXIiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCX05BTUUgPSAiZWpiLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUpCX1FMID0gImVqYi1xbCI7CQkvLyROT04tTkxTLTEkCQkJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIEVKQl9SRUxBVElPTiA9ICJlamItcmVsYXRpb24iOy8vJE5PTi1OTFMtMSQJCQkJCS8vIEVKQjIuMAotCVN0cmluZyBFSkJfUkVMQVRJT05fTkFNRSA9ICJlamItcmVsYXRpb24tbmFtZSI7CS8vJE5PTi1OTFMtMSQJCS8vIEVKQjIuMAotCVN0cmluZyBFSkJfUkVMQVRJT05TSElQX1JPTEUgPSAiZWpiLXJlbGF0aW9uc2hpcC1yb2xlIjsvLyROT04tTkxTLTEkCS8vIEVKQjIuMAotCVN0cmluZyBFSkJfUkVMQVRJT05TSElQX1JPTEVfTkFNRSA9ICJlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSI7Ly8kTk9OLU5MUy0xJCAvLyBFSkIyLjAKLQlTdHJpbmcgRU5URVJQUklTRV9CRUFOUyA9ICJlbnRlcnByaXNlLWJlYW5zIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVOVElUWSA9ICJlbnRpdHkiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVhDTFVERV9MSVNUID0gImV4Y2x1ZGUtbGlzdCI7CS8vJE5PTi1OTFMtMSQvLyBFSkIyLjAgLSBNT0RFTEVEPz8/Ci0JU3RyaW5nIEZJRUxEX05BTUUgPSAiZmllbGQtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVNTQUdFX0RSSVZFTiA9ICJtZXNzYWdlLWRyaXZlbiI7CS8vJE5PTi1OTFMtMSQJCQkvLyBFSkIyLjAKLQlTdHJpbmcgTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT04gPSAibWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24iOyAvLyROT04tTkxTLTEkLy8gRUpCMi4wCi0JU3RyaW5nIE1FU1NBR0VfU0VMRUNUT1IgPSAibWVzc2FnZS1zZWxlY3RvciI7CS8vJE5PTi1OTFMtMSQJCS8vIEVKQjIuMAotCVN0cmluZyBNRVRIT0QgPSAibWV0aG9kIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FVEhPRF9JTlRGID0gIm1ldGhvZC1pbnRmIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FVEhPRF9OQU1FID0gIm1ldGhvZC1uYW1lIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FVEhPRF9QQVJBTSA9ICJtZXRob2QtcGFyYW0iOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVUSE9EX1BBUkFNUyA9ICJtZXRob2QtcGFyYW1zIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FVEhPRF9QRVJNSVNTSU9OID0gIm1ldGhvZC1wZXJtaXNzaW9uIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1VTFRJUExJQ0lUWSA9ICJtdWx0aXBsaWNpdHkiOy8vJE5PTi1OTFMtMSQJCQkJCS8vIEVKQjIuMAotCVN0cmluZyBQRVJTSVNURU5DRV9UWVBFID0gInBlcnNpc3RlbmNlLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJJTV9LRVlfQ0xBU1MgPSAicHJpbS1rZXktY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJJTUtFWV9GSUVMRCA9ICJwcmlta2V5LWZpZWxkIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFRU5UUkFOVCA9ICJyZWVudHJhbnQiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVMQVRJT05TSElQX1JPTEVfU09VUkNFID0gInJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSI7Ly8kTk9OLU5MUy0xJCAvLyBFSkIyLjAKLQlTdHJpbmcgUkVMQVRJT05TSElQUyA9ICJyZWxhdGlvbnNoaXBzIjsgCS8vJE5PTi1OTFMtMSQJCQkvLyBFSkIyLjAKLQlTdHJpbmcgUkVTVUxUX1RZUEVfTUFQUElORyA9ICJyZXN1bHQtdHlwZS1tYXBwaW5nIjsJLy8kTk9OLU5MUy0xJAkvLyBFSkIyLjAKLQlTdHJpbmcgUVVFUlkgPSAicXVlcnkiOwkJCS8vJE5PTi1OTFMtMSQJCQkJCQkvLyBFSkIyLjAKLQlTdHJpbmcgUVVFUllfTUVUSE9EID0gInF1ZXJ5LW1ldGhvZCI7CS8vJE5PTi1OTFMtMSQJCQkJLy8gRUpCMi4wCi0JU3RyaW5nIFNFU1NJT04gPSAic2Vzc2lvbiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTRVNTSU9OX1RZUEUgPSAic2Vzc2lvbi10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNVQlNDUklQVElPTl9EVVJBQklMSVRZID0gInN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IjsvLyROT04tTkxTLTEkIC8vIEVKQjIuMAotCVN0cmluZyBUUkFOU19BVFRSSUJVVEUgPSAidHJhbnMtYXR0cmlidXRlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRSQU5TQUNUSU9OX1RZUEUgPSAidHJhbnNhY3Rpb24tdHlwZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBVTkNIRUNLRUQgPSAidW5jaGVja2VkIjsJCQkvLyROT04tTkxTLTEkCQkJCS8vIEVKQjIuMAotCi0JLy9FSkIgMi4xCQotCVN0cmluZyBTRVJWSUNFX0VORFBPSU5UID0gInNlcnZpY2UtZW5kcG9pbnQiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVTU0FHSU5HX1RZUEUgPSAibWVzc2FnaW5nLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVTU0FHRV9ERVNUX1RZUEUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1FU1NBR0VfREVTVF9MSU5LID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tbGluayI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ1RJVkFUSU9OX0NPTkYgPSAiYWN0aXZhdGlvbi1jb25maWciOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQUNUSVZBVElPTl9DT05GX1BST1BFUlRZID0gImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFDVElWQVRJT05fQ09ORl9QUk9QRVJUWV9OQU1FID0gImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQUNUSVZBVElPTl9DT05GX1BST1BFUlRZX1ZBTFVFID0gImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIjsvLyROT04tTkxTLTEkCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0dlbmVyYWxYbWxEb2N1bWVudFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0dlbmVyYWxYbWxEb2N1bWVudFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ2MWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9HZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTE6NTg6NTAgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIKLXsKLSAgICBwcm90ZWN0ZWQgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2U7Ci0gICAgcHJvdGVjdGVkIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyOwotICAgIHByb3RlY3RlZCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyOwotICAgIHByb3RlY3RlZCBib29sZWFuIGRvVmFsaWRhdGUgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0FsbG93SmF2YUVuY29kaW5ncyA9IGZhbHNlOwotCi0vKioKLSAqIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi0gICAgcHVibGljIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlcigpIAotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0vKioKLSAqIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi0gICAgcHVibGljIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlcihJbnB1dFNvdXJjZSBzb3VyY2UpIAotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0SW5wdXRTb3VyY2Uoc291cmNlKTsKLSAgICB9Ci0vKioKLSAqIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi0gICAgcHVibGljIEdlbmVyYWxYbWxEb2N1bWVudFJlYWRlcihJbnB1dFNvdXJjZSBzb3VyY2UsIEVudGl0eVJlc29sdmVyIHJlc29sdmVyLCBFcnJvckhhbmRsZXIgaGFuZGxlcikgCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRJbnB1dFNvdXJjZShzb3VyY2UpOwotICAgICAgICBzZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7Ci0gICAgICAgIHNldEVycm9ySGFuZGxlcihoYW5kbGVyKTsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyCi0gKi8KLSAgICBwcm90ZWN0ZWQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgY3JlYXRlRGVmYXVsdEVudGl0eVJlc29sdmVyKCkgCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICovCi0gICAgcHJvdGVjdGVkIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBjcmVhdGVEZWZhdWx0RXJyb3JIYW5kbGVyKCkgCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVycm9ySGFuZGxlcigpIHsKLSAgICAgICAgCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJCX0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQl0aHJvdyBleGNlcHRpb247Ci0JCQl9Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoZXhjZXB0aW9uKTsKLQkJCX0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBjcmVhdGVOZXdET01QYXJzZXIoKSAKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHNldEZlYXR1cmVzKGRiZik7Ci0gICAgICAgICAgICByZXR1cm4gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBpZSkKLSAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJmYWlsZWRfaW5zdGFudGlhdGluZ19FWENfIiwgKG5ldyBPYmplY3RbXSB7IkZhaWxlZCB0byBpbnN0YW50aWF0ZSBwYXJzZXIifSkpLCBpZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCA9ICJGYWlsZWQgaW5zdGFudGlhdGluZzogIgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowMTozNCBQTSkKLSAqIEByZXR1cm4gYm9vbGVhbgotICovCi0gICAgcHVibGljIGJvb2xlYW4gZG9BbGxvd0phdmFFbmNvZGluZ3MoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb0FsbG93SmF2YUVuY29kaW5nczsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDE6MzQgUE0pCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqLwotICAgIHB1YmxpYyBib29sZWFuIGRvVmFsaWRhdGUoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb1ZhbGlkYXRlOwotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxOjM0OjE0IFBNKQotICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIKLSAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSAKLSAgICB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAoY2wgPT0gbnVsbCkKLSAgICAgICAgICAgIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKGNsID09IG51bGwpCi0gICAgICAgICAgICBjbCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXJzZURvY3VtZW50KCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBEb2N1bWVudCBnZXREb2N1bWVudChqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZG9tUGFyc2VyKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb21QYXJzZXIubmV3RG9jdW1lbnQoKTsKLSAgICB9Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjA0OjE4IFBNKQotICogQHJldHVybiBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcgotICovCi0gICAgcHVibGljIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgCi0gICAgewotICAgICAgICBpZiAoZW50aXR5UmVzb2x2ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGVudGl0eVJlc29sdmVyID0gY3JlYXRlRGVmYXVsdEVudGl0eVJlc29sdmVyKCk7Ci0gICAgICAgIHJldHVybiBlbnRpdHlSZXNvbHZlcjsKLSAgICB9Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICovCi0gICAgcHVibGljIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciBnZXRFcnJvckhhbmRsZXIoKSAKLSAgICB7Ci0gICAgICAgIGlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JIYW5kbGVyID0gY3JlYXRlRGVmYXVsdEVycm9ySGFuZGxlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnJvckhhbmRsZXI7Ci0gICAgfQotCi0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgMTI6MDQ6MTggUE0pCi0gKiBAcmV0dXJuIG9yZy54bWwuc2F4LklucHV0U291cmNlCi0gKi8KLSAgICBwdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgZ2V0SW5wdXRTb3VyY2UoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnB1dFNvdXJjZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSAKLSAgICB7Ci0gICAgICAgIGlmIChhbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaW52b2NhdGlvbkV4ID0KLSAgICAgICAgICAgIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBhbkV4Y2VwdGlvbjsKLSAgICAgICAgICAgIGlmIChpbnZvY2F0aW9uRXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oYU1lc3NhZ2UsIGludm9jYXRpb25FeC5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbUhhbmRsZUV4Y2VwdGlvbihhTWVzc2FnZSwgYW5FeGNlcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgcGFyc2UoamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRvbVBhcnNlciwgSW5wdXRTb3VyY2UgaXMpIAotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkb21QYXJzZXIucGFyc2UoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZmFpbGVkX2luc3RhbnRpYXRpbmdfRVhDXyIsIChuZXcgT2JqZWN0W10geyJTQVggUGFyc2VyIGVycm9yIn0pKSwgZXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgPSAiRmFpbGVkIGluc3RhbnRpYXRpbmc6ICIKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oSjJFRVhNTFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImZhaWxlZF9pbnN0YW50aWF0aW5nX0VYQ18iLCAobmV3IE9iamVjdFtdIHsiSU8gRXhjZXB0aW9uIG9uIGlucHV0IHN0cmVhbSJ9KSksIGV4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkID0gIkZhaWxlZCBpbnN0YW50aWF0aW5nOiAiCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgRG9jdW1lbnQgcGFyc2VEb2N1bWVudCgpIAotICAgIHsKLSAgICAJQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAJdHJ5IHsKLSAgICAJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQlqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gY3JlYXRlTmV3RE9NUGFyc2VyKCk7Ci0gICAgICAgIAlzZXRFbnRpdHlSZXNvbHZlcihwYXJzZXIpOwotICAgICAgICAJc2V0RXJyb3JIYW5kbGVyKHBhcnNlcik7Ci0gICAgICAgIAlyZXR1cm4gcGFyc2UocGFyc2VyLCBnZXRJbnB1dFNvdXJjZSgpKTsKLQl9IGZpbmFsbHkgewotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldkNsYXNzTG9hZGVyKTsKLQl9Ci0gICAgCQotICAgIAkKLSAgICAJCi0gICAgCQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbUhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBhbkV4Y2VwdGlvbikgCi0gICAgewotICAgICAgICBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGFuRXhjZXB0aW9uKTsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYU1lc3NhZ2UpOwotCi0gICAgfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjAxOjM0IFBNKQotICogQHBhcmFtIG5ld0FsbG93SmF2YUVuY29kaW5ncyBib29sZWFuCi0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0phdmFFbmNvZGluZ3MoYm9vbGVhbiBuZXdBbGxvd0phdmFFbmNvZGluZ3MpIAotICAgIHsKLSAgICAgICAgZG9BbGxvd0phdmFFbmNvZGluZ3MgPSBuZXdBbGxvd0phdmFFbmNvZGluZ3M7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldEVudGl0eVJlc29sdmVyKGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkb21QYXJzZXIpIAotICAgIHsKLSAgICAgICAgaWYgKGdldEVudGl0eVJlc29sdmVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZG9tUGFyc2VyLnNldEVudGl0eVJlc29sdmVyKGdldEVudGl0eVJlc29sdmVyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowNDoxOCBQTSkKLSAqIEBwYXJhbSBuZXdFbnRpdHlSZXNvbHZlciBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcgotICovCi0gICAgcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIob3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgbmV3RW50aXR5UmVzb2x2ZXIpIAotICAgIHsKLSAgICAgICAgZW50aXR5UmVzb2x2ZXIgPSBuZXdFbnRpdHlSZXNvbHZlcjsKLSAgICB9Ci0gICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvckhhbmRsZXIoamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRvbVBhcnNlcikgCi0gICAgewotICAgICAgICBpZiAoZ2V0RXJyb3JIYW5kbGVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZG9tUGFyc2VyLnNldEVycm9ySGFuZGxlcihnZXRFcnJvckhhbmRsZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjA0OjE4IFBNKQotICogQHBhcmFtIG5ld0Vycm9ySGFuZGxlciBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9ySGFuZGxlcihvcmcueG1sLnNheC5FcnJvckhhbmRsZXIgbmV3RXJyb3JIYW5kbGVyKSAKLSAgICB7Ci0gICAgICAgIGVycm9ySGFuZGxlciA9IG5ld0Vycm9ySGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGZWF0dXJlcyhqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvbVBhcnNlcikgCi0gICAgewotICAgICAgICB0cnkgewotCQkJZG9tUGFyc2VyLnNldFZhbGlkYXRpbmcoZG9WYWxpZGF0ZSgpKTsKLQkgICAgICAgIGRvbVBhcnNlci5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5ncyIsIG5ldyBCb29sZWFuKGRvQWxsb3dKYXZhRW5jb2RpbmdzKCkpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgZG9tUGFyc2VyLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXModHJ1ZSk7Ci0JCX0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLSAgICB9Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDEyOjA0OjE4IFBNKQotICogQHBhcmFtIG5ld0lucHV0U291cmNlIG9yZy54bWwuc2F4LklucHV0U291cmNlCi0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dFNvdXJjZShvcmcueG1sLnNheC5JbnB1dFNvdXJjZSBuZXdJbnB1dFNvdXJjZSkgCi0gICAgewotICAgICAgICBpbnB1dFNvdXJjZSA9IG5ld0lucHV0U291cmNlOwotICAgIH0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSAxMjowMTozNCBQTSkKLSAqIEBwYXJhbSBuZXdWYWxpZGF0ZSBib29sZWFuCi0gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZShib29sZWFuIG5ld1ZhbGlkYXRlKSAKLSAgICB7Ci0gICAgICAgIGRvVmFsaWRhdGUgPSBuZXdWYWxpZGF0ZTsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0oyRUVYTUxSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9KMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTlmOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0oyRUVYTUxSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJqMmVleG1sIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQkJCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSAKLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkKLQl9Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JdHJ5IHtyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtyZXR1cm4gZ2V0U3RyaW5nKGtleSk7fQotCi19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0oyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL0oyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYThjZTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIHsKLQotCS8qKiBBbGwgdGhlIGR0ZHMgdGhhdCB0aGlzIHJlc29sdmVyIGtub3dzIGFib3V0OyBpbXBvcnQgc3RyYXRlZ2llcyByZWdpc3RlciB0aGVzZQotCSAqIGF0IHN0YXJ0dXAgKi8gCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgc3VwcG9ydGVkRHREczsKLQlzdGF0aWMgewotCQlyZWdpc3RlckR0RCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIiwgInhtbC54c2QiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZWdpc3RlckR0RCgiWE1MU2NoZW1hLmR0ZCIsICJYTUxTY2hlbWEuZHRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZWdpc3RlckR0RCgiZGF0YXR5cGVzLmR0ZCIsICJkYXRhdHlwZXMuZHRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgc3RhdGljIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlciBJTlNUQU5DRSA9IG5ldyBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIoKTsKLS8qKgotICogRWpiWG1sRW50aXR5UmVzb2x2ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcigpIHsKLQlzdXBlcigpOwotfQotcHVibGljIHN0YXRpYyBNYXAgZ2V0U3VwcG9ydGVkRHREcygpIHsKLQlpZiAoc3VwcG9ydGVkRHREcyA9PSBudWxsKQotCQlzdXBwb3J0ZWREdERzID0gbmV3IEhhc2hNYXAoKTsKLQlyZXR1cm4gc3VwcG9ydGVkRHREczsKLX0KLS8qKgotICogTWFwcyB0aGUgc3lzdGVtIGlkIGZvciB0aGUgZHRkIHRvIGEgbG9jYWwgaWQgdG8gYmUgcmV0cmlldmVkIGxvYWRlZCBmcm9tIHRoZSBjbGFzcyBwYXRoCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0RChTdHJpbmcgc3lzdGVtSUQsIFN0cmluZyBsb2NhbElEKSB7IAotICAgIC8vTWFrZSBzdXJlIGxvY2FsIGZpbGUgZXhpc3RzIG9uIGNsYXNzcGF0aCBmaXJzdC4KLQkKLQlDbGFzc0xvYWRlciBsb2FkZXIgPSBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLQlVUkwgdXJsID0gbnVsbDsKLQlpZiAobG9hZGVyID09IG51bGwpIHsJICAgIAotCQl1cmwgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShsb2NhbElEKTsKLQl9IGVsc2UgewkgICAgCi0JCXVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShsb2NhbElEKTsKLQl9Ci0JaWYgKHVybCA9PSBudWxsKSB7Ci0JCXJldHVybjsKLQl9Ci0JZ2V0U3VwcG9ydGVkRHREcygpLnB1dChzeXN0ZW1JRCwgbG9jYWxJRCk7Ci0JZ2V0U3VwcG9ydGVkRHREcygpLnB1dChnZXRTaG9ydE5hbWUoc3lzdGVtSUQpLCBsb2NhbElEKTsKLX0KLS8qKgotICogZm9yIGEgc3lzdGVtIGlkIHdpdGggYSBVUkwgdGhhdCBiZWdpbnMgd2l0aCAiaHR0cDovL2phdmEuc3VuLmNvbS8iLCBjaGVjayB0byBzZWUgaWYgdGhhdCBpcyBhIHJlY29nbml6ZWQgZHRkOwotICogaWYgc28sIGxvYWQgdGhlIGR0ZCBmcm9tIHRoZSBjbGFzcyBwYXRoIHVzaW5nIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXJlZCBkdGQuCi0gKgotICogQHJldHVybiBhbiBJbnB1dCBzb3VyY2Ugb24gYSBsb2NhbGx5IHJlc29sdmVkIGR0ZCwgb3IgbnVsbCBvZiB0aGUgc3lzdGVtaWQgZG9lcyBub3Qgc3RhcnQgd2l0aCAiaHR0cDovL2phdmEuc3VuLmNvbS8iCi0gKiAKLSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIHdpdGggYSBuZXN0ZWQgTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBkdGQgaXMgbm90IHJlY29nbml6ZWQKLSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSByZXNvbHZlZCBkdGQgY2Fubm90IGJlIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGgKLSAqLwotcHVibGljIG9yZy54bWwuc2F4LklucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gewotCVN0cmluZyBsb2NhbFJlc291cmNlTmFtZSA9IG51bGw7Ci0JYm9vbGVhbiBpc0phdmFTeXRlbUlkID0gZmFsc2U7Ci0JaWYgKHNob3VsZEJlUmVnaXN0ZXJlZChzeXN0ZW1JZCkpIHsKLQkJbG9jYWxSZXNvdXJjZU5hbWUgPSAoU3RyaW5nKWdldFN1cHBvcnRlZER0RHMoKS5nZXQoc3lzdGVtSWQpOwotCQlpc0phdmFTeXRlbUlkID0gdHJ1ZTsJCi0JfSBlbHNlIHsKLQkJU3RyaW5nIHNob3J0TmFtZSA9IGdldFNob3J0TmFtZShzeXN0ZW1JZCk7Ci0JCWxvY2FsUmVzb3VyY2VOYW1lID0gKFN0cmluZylnZXRTdXBwb3J0ZWREdERzKCkuZ2V0KHNob3J0TmFtZSk7Ci0JCWlmIChsb2NhbFJlc291cmNlTmFtZSAhPSBudWxsKQotCQkJc3lzdGVtSWQgPSBsb2NhbFJlc291cmNlTmFtZTsKLQl9Ci0JCQotCWlmIChsb2NhbFJlc291cmNlTmFtZSA9PSBudWxsKSB7Ci0JCXJldHVybiBudWxsOwotCX0gCi0JQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCVVSTCB1cmwgPSBudWxsOwotCWlmIChsb2FkZXIgPT0gbnVsbCkgewkgICAgCi0JCXVybCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKGxvY2FsUmVzb3VyY2VOYW1lKTsKLQl9IGVsc2UgewkgICAgCi0JCXVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShsb2NhbFJlc291cmNlTmFtZSk7Ci0JfQotCQotCQotCWlmICh1cmwgPT0gbnVsbCkgewotCQlTdHJpbmcgbWVzc2FnZSA9IEoyRUVYTUxSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJkdGRfbm90X2ZvdW5kX0VYQ18iLCAobmV3IE9iamVjdFtdIHtsb2NhbFJlc291cmNlTmFtZX0pKTsvLyROT04tTkxTLTEkID0gIkNvdWxkIG5vdCBwYXJzZSB4bWwgYmVjYXVzZSB0aGUgcmVzb2x2ZWQgcmVzb3VyY2UgInswfSIgY291bGQgbm90IGJlIGZvdW5kIGluIGNsYXNzcGF0aCIKLQkJdGhyb3cgbmV3IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKG1lc3NhZ2UpOwotCX0KLQkKLQlJbnB1dFNvdXJjZSByZXN1bHQgPSBuZXcgSW5wdXRTb3VyY2UodXJsLnRvU3RyaW5nKCkpOwotCXJlc3VsdC5zZXRQdWJsaWNJZChwdWJsaWNJZCk7CQotCS8vIGZvcmNlIHRoZSBlbmNvZGluZyB0byBiZSBVVEY4Ci0JcmVzdWx0LnNldEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCi0JcmV0dXJuIHJlc3VsdDsKLX0KLXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJlUmVnaXN0ZXJlZChTdHJpbmcgc3lzdGVtSWQpIHsKLQkKLQlyZXR1cm4gc3lzdGVtSWQuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLkpBVkFfU1VOX0NPTV9VUkwpIAotCQl8fCBzeXN0ZW1JZC5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuV1dXX1czX09SR19VUkwpCi0JCXx8IHN5c3RlbUlkLnN0YXJ0c1dpdGgoSjJFRUNvbnN0YW50cy5XV1dfSUJNX0NPTV9VUkwpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGZpbGVuYW1lIGZyb20gdGhlIHVyaSwgb3IgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvcgotICovCi1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKFN0cmluZyB1cmkpIHsKLQlTdHJpbmcgdGVtcFVSSSA9IHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0Jd2hpbGUgKHRlbXBVUkkuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQl0ZW1wVVJJID0gdGVtcFVSSS5zdWJzdHJpbmcoMCwgdGVtcFVSSS5sZW5ndGgoKS0xKTsKLQlpbnQgbGFzdEluZGV4ID0gdGVtcFVSSS5sYXN0SW5kZXhPZignLycpOwotCWlmIChsYXN0SW5kZXggPT0gLTEpCi0JCXJldHVybiB1cmk7Ci0JcmV0dXJuIHVyaS5zdWJzdHJpbmcobGFzdEluZGV4KzEsIHRlbXBVUkkubGVuZ3RoKCkpOwotfQotfQotCi0KLQotIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL01pc3NpbmdSZXF1aXJlZERhdGFFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9NaXNzaW5nUmVxdWlyZWREYXRhRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMWYyMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL01pc3NpbmdSZXF1aXJlZERhdGFFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTWlzc2luZ1JlcXVpcmVkRGF0YUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzAxMDM5ODU0NTQyNTYxMzA0TDsKLS8qKgotICogTWlzc2luZ1JlcXVpcmVkRGF0YUV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgTWlzc2luZ1JlcXVpcmVkRGF0YUV4Y2VwdGlvbigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBNaXNzaW5nUmVxdWlyZWREYXRhRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBNaXNzaW5nUmVxdWlyZWREYXRhRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0Jc3VwZXIocyk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI1ZDFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5XcmFwcGVkUnVudGltZUV4Y2VwdGlvbjsKLQotCi0KLQotcHVibGljIGNsYXNzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uIHsKLXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNTM1NTk0NzIwOTg3NTk4MTk2TDsKLS8qKgotICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gZSBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQlzdXBlcihlKTsKLX0KLS8qKgotICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQlzdXBlcihzKTsKLX0KLS8qKgotICogTm90U3VwcG9ydGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0gKiBAcGFyYW0gZSBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0Jc3VwZXIocywgZSk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1JhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1JhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk5M2NlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9SYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gUkFSIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSW50ZXJmYWNlIHNoYXJlZCBieSByZWFkZXJzIGFuZCAKLSAqIHdyaXRlcnMgdG8gaGF2ZSBhY2Nlc3MgdG8gY29tbW9uIGNvbnN0YW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSBleHRlbmRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHVibGljIFN0cmluZyBBVVRIX01FQ0hBTklTTSA9ICJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFVVEhfTUVDSF9UWVBFID0gImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05GSUdfUFJPUEVSVFkgPSAiY29uZmlnLXByb3BlcnR5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05GSUdfUFJPUEVSVFlfTkFNRSA9ICJjb25maWctcHJvcGVydHktbmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09ORklHX1BST1BFUlRZX1ZBTFVFID0gImNvbmZpZy1wcm9wZXJ0eS12YWx1ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09ORklHX1BST1BFUlRZX1RZUEUgPSAiY29uZmlnLXByb3BlcnR5LXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RPUiA9ICJjb25uZWN0b3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRSA9ICJjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1MgPSAiY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVElPTl9JTlRFUkZBQ0UgPSAiY29ubmVjdGlvbi1pbnRlcmZhY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RJT05fSU1QTF9DTEFTUyA9ICJjb25uZWN0aW9uLWltcGwtY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENSRURFTlRJQUxfSU5URVJGQUNFID0gImNyZWRlbnRpYWwtaW50ZXJmYWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFSVNfVFlQRSA9ICJlaXMtdHlwZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTElDRU5TRSA9ICJsaWNlbnNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMSUNFTlNFX1JFUVVJUkVEID0gImxpY2Vuc2UtcmVxdWlyZWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIE1BTkFHRURDT05ORUNUSU9ORkFDVE9SWV9DTEFTUyA9ICJtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA9ICJyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFJFU09VUkNFQURBUFRFUiA9ICJyZXNvdXJjZWFkYXB0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFQ1VSSVRZX1BFUk1JU1NJT04gPSAic2VjdXJpdHktcGVybWlzc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDID0gInNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU1BFQ19WRVJTSU9OID0gInNwZWMtdmVyc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVFJBTlNBQ1RJT05fU1VQUE9SVCA9ICJ0cmFuc2FjdGlvbi1zdXBwb3J0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBWRU5ET1JfTkFNRSA9ICJ2ZW5kb3ItbmFtZSI7Ly8kTk9OLU5MUy0xJAotCS8vSkNBIDEuNQotCXB1YmxpYyBTdHJpbmcgUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT04gPSAicmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFJFU09VUkNFQURBUFRFUl9DTEFTUyA9ICJyZXNvdXJjZWFkYXB0ZXItY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIE9VVEJPVU5EX1JFU09VUkNFQURBUFRFUiA9ICJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIElOQk9VTkRfUkVTT1VSQ0VBREFQVEVSID0gImluYm91bmQtcmVzb3VyY2VhZGFwdGVyIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFN0cmluZyBDT05ORUNUSU9OX0RFRklOSVRJT04gPSAiY29ubmVjdGlvbi1kZWZpbml0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBNRVNTQUdFQURBUFRFUiA9ICJtZXNzYWdlYWRhcHRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTUVTU0FHRUxJU1RFTkVSID0gIm1lc3NhZ2VsaXN0ZW5lciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTUVTU0FHRUxJU1RFTkVSX1RZUEUgPSAibWVzc2FnZWxpc3RlbmVyLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFDVElWQVRJT05TUEVDID0gImFjdGl2YXRpb25zcGVjIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBQ1RJVkFUSU9OU1BFQ19DTEFTUyA9ICJhY3RpdmF0aW9uc3BlYy1jbGFzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZID0gInJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBTdHJpbmcgQURNSU5PQkpFQ1QgPSAiYWRtaW5vYmplY3QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFETUlOT0JKRUNUX0NMQVNTID0gImFkbWlub2JqZWN0LWNsYXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBRE1JTk9CSkVDVF9JTlRFUkZBQ0UgPSAiYWRtaW5vYmplY3QtaW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAotfQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1dhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1dhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2YwZWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9XYXJEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjYXRhbG9nIG9mIGFsbCB0aGUgdGFnIG5hbWVzIHdoaWNoIG9jY3VyIGluIAotICogYW4gV0FSIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSW50ZXJmYWNlIHNoYXJlZCBieSByZWFkZXJzIGFuZCAKLSAqIHdyaXRlcnMgdG8gaGF2ZSBhY2Nlc3MgdG8gY29tbW9uIGNvbnN0YW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdhckRlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSBleHRlbmRzIERlcGxveW1lbnREZXNjcmlwdG9yWG1sTWFwcGVySSB7Ci0JcHVibGljIFN0cmluZyBBVVRIX0NPTlNUUkFJTlQgPSAiYXV0aC1jb25zdHJhaW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBVVRIX01FVEhPRCA9ICJhdXRoLW1ldGhvZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OVEVYVF9QQVJBTSA9ICJjb250ZXh0LXBhcmFtIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBESVNUUklCVVRBQkxFID0gImRpc3RyaWJ1dGFibGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVSUk9SX0NPREUgPSAiZXJyb3ItY29kZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRVJST1JfUEFHRSA9ICJlcnJvci1wYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFWENFUFRJT05fVFlQRSA9ICJleGNlcHRpb24tdHlwZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRVhURU5TSU9OID0gImV4dGVuc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRklMVEVSID0gImZpbHRlciI7CQkJLy8kTk9OLU5MUy0xJAkJLy8gU2VydmxldDIuMwotCXB1YmxpYyBTdHJpbmcgRklMVEVSX01BUFBJTkcgPSAiZmlsdGVyLW1hcHBpbmciOy8vJE5PTi1OTFMtMSQJLy8gU2VydmxldDIuMwotCXB1YmxpYyBTdHJpbmcgRklMVEVSX05BTUUgPSAiZmlsdGVyLW5hbWUiOwkJLy8kTk9OLU5MUy0xJAkvLyBTZXJ2bGV0Mi4zCi0JcHVibGljIFN0cmluZyBGSUxURVJfQ0xBU1MgPSAiZmlsdGVyLWNsYXNzIjsvLyROT04tTkxTLTEkCQkvLyBTZXJ2bGV0Mi4zCi0JcHVibGljIFN0cmluZyBGT1JNX0VSUk9SX1BBR0UgPSAiZm9ybS1lcnJvci1wYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBGT1JNX0xPR0lOX0NPTkZJRyA9ICJmb3JtLWxvZ2luLWNvbmZpZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRk9STV9MT0dJTl9QQUdFID0gImZvcm0tbG9naW4tcGFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSFRUUF9NRVRIT0QgPSAiaHR0cC1tZXRob2QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIElOSVRfUEFSQU0gPSAiaW5pdC1wYXJhbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSlNQX0ZJTEUgPSAianNwLWZpbGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExJU1RFTkVSID0gImxpc3RlbmVyIjsJLy8kTk9OLU5MUy0xJAkJCS8vIFNlcnZsZXQyLjMKLQlwdWJsaWMgU3RyaW5nIExPQURfT05fU1RBUlRVUCA9ICJsb2FkLW9uLXN0YXJ0dXAiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIExPQ0FUSU9OID0gImxvY2F0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMT0dJTl9DT05GSUcgPSAibG9naW4tY29uZmlnIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBNSU1FX01BUFBJTkcgPSAibWltZS1tYXBwaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBNSU1FX1RZUEUgPSAibWltZS10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBSRUFMTV9OQU1FID0gInJlYWxtLW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFQ1VSSVRZX0NPTlNUUkFJTlQgPSAic2VjdXJpdHktY29uc3RyYWludCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgU0VSVkxFVCA9ICJzZXJ2bGV0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRVJWTEVUX0NMQVNTID0gInNlcnZsZXQtY2xhc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFUlZMRVRfTUFQUElORyA9ICJzZXJ2bGV0LW1hcHBpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFUlZMRVRfTkFNRSA9ICJzZXJ2bGV0LW5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNFU1NJT05fQ09ORklHID0gInNlc3Npb24tY29uZmlnIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBTRVNTSU9OX1RJTUVPVVQgPSAic2Vzc2lvbi10aW1lb3V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBUQUdMSUIgPSAidGFnbGliIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBUQUdMSUJfTE9DQVRJT04gPSAidGFnbGliLWxvY2F0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBUQUdMSUJfVVJJID0gInRhZ2xpYi11cmkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFRSQU5TUE9SVF9HVUFSQU5URUUgPSAidHJhbnNwb3J0LWd1YXJhbnRlZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgVVJMX1BBVFRFUk4gPSAidXJsLXBhdHRlcm4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFVTRVJfREFUQV9DT05TVFJBSU5UID0gInVzZXItZGF0YS1jb25zdHJhaW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfQVBQID0gIndlYi1hcHAiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OID0gIndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfUkVTT1VSQ0VfTkFNRSA9ICJ3ZWItcmVzb3VyY2UtbmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VMQ09NRV9GSUxFID0gIndlbGNvbWUtZmlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VMQ09NRV9GSUxFX0xJU1QgPSAid2VsY29tZS1maWxlLWxpc3QiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgU3RyaW5nIERJU1BBVENIRVIgPSAiZGlzcGF0Y2hlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVCA9ICJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMT0NBTEVfRU5DT0RJTkdfTUFQUElORyA9ICJsb2NhbGUtZW5jb2RpbmctbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgTE9DQUxFID0gImxvY2FsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRU5DT0RJTkcgPSAiZW5jb2RpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEpTUF9DT05GSUcgPSAianNwLWNvbmZpZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSlNQX1BST1BFUlRZX0dST1VQID0gImpzcC1wcm9wZXJ0eS1ncm91cCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRUxfSUdOT1JFRCA9ICJlbC1pZ25vcmVkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBQQUdFX0VOQ09ESU5HID0gInBhZ2UtZW5jb2RpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFNDUklQVElOR19JTlZBTElEID0gInNjcmlwdGluZy1pbnZhbGlkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBJU19YTUwgPSAiaXMteG1sIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBJTkNMVURFX1BSRUxVREUgPSAiaW5jbHVkZS1wcmVsdWRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBJTkNMVURFX0NPREEgPSAiaW5jbHVkZS1jb2RhIjsvLyROT04tTkxTLTEkCi0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1dlYlNlcnZpY2VzRGVwbG95bWVudERlc2NyaXB0b3JYbWxNYXBwZXJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvV2ViU2VydmljZXNEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4NjhiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvV2ViU2VydmljZXNEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDUsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLS8qKgotICogQGF1dGhvciBkZmhvbHR0cAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZXNEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckkgZXh0ZW5kcyBEZXBsb3ltZW50RGVzY3JpcHRvclhtbE1hcHBlckl7Ci0JLy8xLjMgc3BlY2lmaWMgV2ViU2VydmljZXMgREQKLQlwdWJsaWMgU3RyaW5nIENPTVBfU0NPUEVEX1JFRlMgPSAiY29tcG9uZW50LXNjb3BlZC1yZWZzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT01QX0NPTVBPTkVOVF9OQU1FID0gImNvbXBvbmVudC1uYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfU0VSVklDRVNfQ0xJRU5UID0gIndlYnNlcnZpY2VzY2xpZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBMT0NBTFBBUlQgPSAibG9jYWxwYXJ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBOQU1FU1BBQ0VVUkkgPSAibmFtZXNwYWNlVVJJIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvWE1MUGFyc2VSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9YTUxQYXJzZVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODU2MjBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9YTUxQYXJzZVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbDsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxQYXJzZVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoInhtbHBhcnNlIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQkJCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSAKLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkKLQl9Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JdHJ5IHtyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtyZXR1cm4gZ2V0U3RyaW5nKGtleSk7fQotCi19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwveG1sL1htbERvY3VtZW50UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvWG1sRG9jdW1lbnRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYWViNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvWG1sRG9jdW1lbnRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMi8yMS8wMSA0OjM0OjEzIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgWG1sRG9jdW1lbnRSZWFkZXIgZXh0ZW5kcyBHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgewotLyoqCi0gKiBYbWxEb2N1bWVudFJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgWG1sRG9jdW1lbnRSZWFkZXIoSW5wdXRTb3VyY2Ugc291cmNlKSB7Ci0Jc3VwZXIoc291cmNlKTsKLQlzZXRGbGFnRGVmYXVsdHMoKTsKLX0KLS8qKgotICogWG1sRG9jdW1lbnRSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFhtbERvY3VtZW50UmVhZGVyKElucHV0U291cmNlIHNvdXJjZSwgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIsIEVycm9ySGFuZGxlciBoYW5kbGVyKSB7Ci0Jc3VwZXIoc291cmNlLCByZXNvbHZlciwgaGFuZGxlcik7Ci0Jc2V0RmxhZ0RlZmF1bHRzKCk7Ci19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAxMDoxMzoyNiBBTSkKLSAqIEByZXR1cm4gb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIKLSAqLwotcHVibGljIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyIGNyZWF0ZURlZmF1bHRFbnRpdHlSZXNvbHZlcigpIHsKLQlyZXR1cm4gSjJFRVhtbER0REVudGl0eVJlc29sdmVyLklOU1RBTkNFOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgYW5FeGNlcHRpb24pIHsKLQlpZiAoYW5FeGNlcHRpb24gaW5zdGFuY2VvZiBTQVhQYXJzZUV4Y2VwdGlvbikgCi0JCWhhbmRsZUV4Y2VwdGlvbihhTWVzc2FnZSwgKFNBWFBhcnNlRXhjZXB0aW9uKSBhbkV4Y2VwdGlvbik7Ci0JZWxzZQotCQlzdXBlci5oYW5kbGVFeGNlcHRpb24oYU1lc3NhZ2UsIGFuRXhjZXB0aW9uKTsKLX0KLXByb3RlY3RlZCB2b2lkIGhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgYU1lc3NhZ2UsIFNBWFBhcnNlRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uKSB7Ci0JcHJpbUhhbmRsZUV4Y2VwdGlvbihKMkVFWE1MUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygicGFyc2VfZXhjZXB0aW9uX29jY3VyZWRfRVhDXyIsIChuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKHBhcnNlRXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSksIG5ldyBJbnRlZ2VyKHBhcnNlRXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpKSB9KSksIHBhcnNlRXhjZXB0aW9uKTsgIC8vJE5PTi1OTFMtMSQKLQkvLyROT04tTkxTLTEkID0gIkFuIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHhtbDogezB9IExpbmUgIzogezF9IDpDb2x1bW4gIzogIgotfQotcHJvdGVjdGVkIHZvaWQgcHJpbUhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBhbkV4Y2VwdGlvbikgewotCWlmIChhbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIEV4Y2VwdGlvbikKLQkJdGhyb3cgbmV3IFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKGFNZXNzYWdlLCAoRXhjZXB0aW9uKWFuRXhjZXB0aW9uKTsKLQlzdXBlci5wcmltSGFuZGxlRXhjZXB0aW9uKGFNZXNzYWdlLCBhbkV4Y2VwdGlvbik7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRGbGFnRGVmYXVsdHMoKSB7Ci0Jc2V0QWxsb3dKYXZhRW5jb2RpbmdzKHRydWUpOwotCXNldFZhbGlkYXRlKHRydWUpOwotfQotICAgcHVibGljIHN0YXRpYyBEb2N1bWVudFR5cGUgcmVhZERvY3VtZW50VHlwZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHVyaSkgewotICAgIAlJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW4pOwotICAgIAlHZW5lcmFsWG1sRG9jdW1lbnRSZWFkZXIgYVJlYWRlciA9ICBuZXcgWG1sRG9jdW1lbnRSZWFkZXIoc291cmNlKTsKLSAgICAJYVJlYWRlci5zZXRWYWxpZGF0ZShmYWxzZSk7Ci0gICAgCURvY3VtZW50IGFEb2N1bWVudCA9IGFSZWFkZXIucGFyc2VEb2N1bWVudCgpOwotICAgIAlpZiAoYURvY3VtZW50ICE9IG51bGwpCi0gICAgCQlyZXR1cm4gYURvY3VtZW50LmdldERvY3R5cGUoKTsKLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAkKLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQWN0aXZhdGlvblNwZWMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BY3RpdmF0aW9uU3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE1ZTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BY3RpdmF0aW9uU3BlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBTcGVjPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGFjdGl2YXRpb25zcGVjVHlwZSBzcGVjaWZpZXMgYW4gYWN0aXZhdGlvbgotICogc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLSAqIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mCi0gKiByZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzIDxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBY3RpdmF0aW9uU3BlYygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3RpdmF0aW9uU3BlYyBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVsZW1lbnQgYWN0aXZhdGlvbnNwZWMtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQotCSAqICAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZhdGlvbgotCSAqICAgICAgICAgc3BlY2lmaWNhdGlvbiBjbGFzcy4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKLQkgKiAgICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5BY3RpdmF0aW9uU3BlYyBpbnRlcmZhY2UuIFRoZQotCSAqICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhCi0JICogICAgICAgICBKYXZhQmVhbi4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogICAgICAgICAgICAgPGFjdGl2YXRpb25zcGVjLWNsYXNzPmNvbS53b21iYXQuQWN0aXZhdGlvblNwZWNJbXBsCi0JICogICAgICAgICAgICAgPC9hY3RpdmF0aW9uc3BlYy1jbGFzcz4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3RpdmF0aW9uU3BlY0NsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEFjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjQ2xhc3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MgPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3RpdmF0aW9uU3BlY0NsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXF1aXJlZCBDb25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0QWN0aXZhdGlvblNwZWNfUmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCk7Ci0KLX0gLy8gQWN0aXZhdGlvblNwZWMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BZG1pbk9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0FkbWluT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjM5YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0FkbWluT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWRtaW4gT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KLSAqIGFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQotICogbWVzc2FnaW5nIHN0eWxlIG9yIG1lc3NhZ2UgcHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkKLSAqIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cwotICogY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCNnZXRBZG1pbk9iamVjdEludGVyZmFjZSA8ZW0+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldEFkbWluT2JqZWN0Q2xhc3MgPGVtPkFkbWluIE9iamVjdCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0I2dldENvbmZpZ1Byb3BlcnRpZXMgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBZG1pbk9iamVjdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBZG1pbk9iamVjdCBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQotCSAqICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiB0aGUKLQkgKiAgICAgICAgIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAgICAgICAgICAgPGFkbWlub2JqZWN0LWludGVyZmFjZT5qYXZheC5qbXMuRGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgPC9hZG1pbm9iamVjdC1pbnRlcmZhY2U+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkbWluT2JqZWN0SW50ZXJmYWNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFkbWluT2JqZWN0SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UgPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZG1pbk9iamVjdEludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRtaW4gT2JqZWN0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQotCSAqICAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAgICAgICAgICAgICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLQkgKiAgICAgICAgICAgICA8L2FkbWlub2JqZWN0LWNsYXNzPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkbWluT2JqZWN0Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBZG1pbk9iamVjdENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5PYmplY3RDbGFzcyA8ZW0+QWRtaW4gT2JqZWN0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3QgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkbWluT2JqZWN0Q2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29uZmlnUHJvcGVydGllcygpOwotCi19IC8vIEFkbWluT2JqZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc20uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTUyOGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcyBzdXBwb3J0IGlzIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMgYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mIHNlY3VyaXR5IGNvbnRyYWN0IGFuZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0gKiAKLSAqIE5vdGUgdGhhdCBCYXNpY1Bhc3N3b3JkIG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotICogamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0gKiBUaGUgS2VyYnY1IG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotICogamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIGV4dGVuZHMgRU9iamVjdHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20gPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgYXR0cmlidXRlCi0JICogVGhlIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIHNwZWNpZmllcyB0eXBlIG9mIGFuIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4KLQkgKiAKLQkgKiBUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOgotCSAqICAgLSBCYXNpY1Bhc3N3b3JkCi0JICogICAtIEtlcmJ2NQotCSAqIAotCSAqIEFueSBhZGRpdGlvbmFsIHNlY3VyaXR5IG1lY2hhbmlzbXMgYXJlIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZQotCSAqIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotCSAqLwotCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlCi0JICogQHNlZSAjaXNTZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCi0JICogQHNlZSAjc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCi0JICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKLQkgKiBAc2VlICNzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ3JlZGVudGlhbEludGVyZmFjZSBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZvcgotCSAqIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgdXNlZCBieQotCSAqIGFwcGxpY2F0aW9uIHNlcnZlciB0byBmaW5kIG91dCB0aGUgQ3JlZGVudGlhbCBpbnRlcmZhY2UgaXQgc2hvdWxkIHVzZSBhcyBwYXJ0Ci0JICogb2YgdGhlIHNlY3VyaXR5IGNvbnRyYWN0LgotCSAqIAotCSAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgotCSAqICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwKLQkgKiAgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwKLQotCSAqLwotCVN0cmluZyBnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQ3JlZGVudGlhbEludGVyZmFjZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldENyZWRlbnRpYWxJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBDdXN0b21BdXRoTWVjaFR5cGUgYXR0cmlidXRlCi0JICogVGhpcyBpcyBhbiBpbnRlcm5hbCB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBBdGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSB3aGVuCi0JICogaXQgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gQmFzaWNQYXNzd29yZCBvciBLZXJidjUuICBBdXRoZW50aWNhdGlvbk1lY2FuaXNtVHlwZSAKLQkgKiBpcyBzZXQgdG8gJ0N1c3RvbScgaW4gdGhvc2UgY2FzZXMuICBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgYnkKLQkgKiBydW50aW1lLiAgSXQgaXMgb25seSB1c2VkIGJ5IHRoZSB3cml0ZXIgdG8gd3JpdGUgYmFjayBvdXQgdGhlIGN1c3RvbQotCSAqIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBzdHJpbmcgaW4gdGhlIGNhc2Ugb2YgY3VzdG9tCi0JICogQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlJ3MuICAKLQkgKiBUaGlzIHZhcmlhYmxlIGlzIGludGVybmFsLCB1c2VkIG9ubHkgYnkgdGhlIHJlYWRlci8vd3JpdGVyIGNsYXNzZXMsIGFuZCBjYW4KLQkgKiBjaGFuZ2Ugb3IgZGlzYXBwZWFyIHdpdGhvdXQgbm90aWNlLiAgCi0JICovCi0JU3RyaW5nIGdldEN1c3RvbUF1dGhNZWNoVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEN1c3RvbUF1dGhNZWNoVHlwZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEN1c3RvbUF1dGhNZWNoVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZmY0NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSB7fQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU0lDX1BBU1NXT1JEPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFUkJWNT0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJhc2ljIFBhc3N3b3JkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QmFzaWMgUGFzc3dvcmQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQkFTSUNfUEFTU1dPUkQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBCQVNJQ19QQVNTV09SRF9MSVRFUkFMID0gbmV3IEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShCQVNJQ19QQVNTV09SRCwgIkJhc2ljUGFzc3dvcmQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5LZXJidjU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5LZXJidjU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjS0VSQlY1Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgS0VSQlY1X0xJVEVSQUwgPSBuZXcgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKEtFUkJWNSwgIktlcmJ2NSIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZVtdIHsKLQkJCUJBU0lDX1BBU1NXT1JEX0xJVEVSQUwsCi0JCQlLRVJCVjVfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEJBU0lDX1BBU1NXT1JEOiByZXR1cm4gQkFTSUNfUEFTU1dPUkRfTElURVJBTDsKLQkJCWNhc2UgS0VSQlY1OiByZXR1cm4gS0VSQlY1X0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25maWdQcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0NvbmZpZ1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNmEzODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0NvbmZpZ1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogVGhlIGNvbmZpZyBwcm9wZXJ0eSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlCi0gKiBjb25maWd1cmF0aW9uIHByb3BlcnR5IGZvciBhIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4KLSAqIAotICogRWFjaCBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UgY3JlYXRlcyBjb25uZWN0aW9ucyB0byBhIHNwZWNpZmljIEVJUyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIG9uIHRoZSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuIFRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIG9ubHkgb25jZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBldmVuIHRob3VnaCBhIHJlc291cmNlIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIG11bHRpcGxlIE1hbmFnZWRDb25ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlcyAodGhhdCBjcmVhdGUgY29ubmVjdGlvbnMgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBFSVMpLgotICogCi0gKiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIG5hbWUsIHR5cGUKLSAqIGFuZCBhbiBvcHRpb25hbCB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gSWYgdGhlIHJlc291cmNlCi0gKiBhZGFwdGVyIHByb3ZpZGVyIGRvZXMgbm90IHNwZWNpZnkgYSB2YWx1ZSB0aGFuIHRoZSBkZXBsb3llciBpcwotICogcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIHZhbGlkIHZhbHVlIGZvciBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0gKiAKLSAqIEFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uZmlnUHJvcGVydHkgZXh0ZW5kcyBFT2JqZWN0ewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqIENvbnRhaW5zIHRoZSBuYW1lIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBUaGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBkZWZpbmVzIGEgc2V0IG9mIHdlbGwtZGVmaW5lZCBwcm9wZXJ0aWVzIGFsbCBvZiB0eXBlIAotCSAqIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcyBmb2xsb3dzOgotCSAqIAotCSAqICAgICAgU2VydmVyTmFtZQotCSAqICAgICAgUG9ydE51bWJlcgotCSAqICAgICAgVXNlck5hbWUKLQkgKiAgICAgIFBhc3N3b3JkCi0JICogICAgICBDb25uZWN0aW9uVVJMCi0JICogCi0JICogQSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8gaW5jbHVkZSBwcm9wZXJ0aWVzCi0JICogc3BlY2lmaWMgdG8gdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIGl0cyB1bmRlcmx5aW5nIEVJUy4KLQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqIENvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhcyByZXF1aXJlZAotCSAqIGJ5IE1hbmFnZWRDb25uZWN0aW9uLUZhY3RvcnkgaW5zdGFuY2UuCi0JICogCi0JICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBjb25maWctcHJvcGVydHktdHlwZToKLQkgKiAgICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0JICogICAgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwKLQkgKiAgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBUeXBlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFZhbHVlIGF0dHJpYnV0ZQotCSAqIENvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmFsdWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdGlvbkRlZmluaXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBlOWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIGRlZmluZXMgYSBzZXQgb2YgY29ubmVjdGlvbgotICogaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyBwZXJ0YWluaW5nIHRvIGEgcGFydGljdWxhciBjb25uZWN0aW9uCi0gKiB0eXBlLiBUaGlzIGFsc28gaW5jbHVkZXMgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yCi0gKiBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2VzIHRoYXQgbWF5IGJlIHByb2R1Y2VkIG91dAotICogb2YgdGhpcyBzZXQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIDxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uSW1wbENsYXNzIDxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25maWdQcm9wZXJ0aWVzIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkRlZmluaXRpb24gZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3Mgc3BlY2lmaWVzCi0JICogICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotCSAqICAgICAgICAgaW1wbGVtZW50cyB0aGUKLQkgKiAgICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCSAqICAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKLQkgKiAgICAgICAgIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlCi0JICogICAgICAgICBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAqICAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotCSAqICAgICAgICAgICAgIGNvbS53b21iYXQuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5SW1wbAotCSAqICAgICAgICAgPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIDxlbT5NYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzCi0JICogICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0JICogICAgICAgICBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeQotCSAqICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0JICogCi0JICogICAgICAgICBPUgotCSAqIAotCSAqICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLQkgKiAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIHNwZWNpZmllcwotCSAqICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQotCSAqICAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLQkgKiAgICAgICAgIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5SW1wbAotCSAqICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29ubmVjdGlvbi1pbnRlcmZhY2UgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICogICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkCi0JICogICAgICAgICBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICAgICAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uCi0JICogICAgICAgICAgICAgPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbm5lY3Rpb25JbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25uZWN0aW9uSW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzVHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICogICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcyB0aGF0Ci0JICogICAgICAgICBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbgotCSAqICAgICAgICAgaW50ZXJmYWNlLiAgSXQgaXMgdXNlZCBieSB0aGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzCi0JICogICAgICAgICBlbGVtZW50cy4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0JICogICAgICAgICAgICAgPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uSW1wbENsYXNzIDxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maWcgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0KLX0gLy8gQ29ubmVjdGlvbkRlZmluaXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlNmMxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLS8qKgotICogVGhlIGNvbm5lY3RvciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHZlcnNpb24sIHNwZWNpZmljYXRpb24gdmVyc2lvbiBzdXBwb3J0ZWQsIGljb24gLSAgYWJvdXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBJdCBhbHNvIGluY2x1ZGVzIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3RvciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0KLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuICBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBWZW5kb3JOYW1lIGF0dHJpYnV0ZQotCSAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KLQkgKiBFeGFtcGxlOiBXb21iYXQgQ29ycC4KLQkgKi8KLQlTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFZlbmRvck5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRWZW5kb3JOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU3BlY1ZlcnNpb24gYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcwotCSAqIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3llciB0bwotCSAqIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgYWRhcHRlciB0byBzdXBwb3J0IGRlcGxveW1lbnQgYW5kIHJ1bnRpbWUgcmVxdWlyZW1lbnRzCi0JICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi0JICovCi0JU3RyaW5nIGdldFNwZWNWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU3BlY1ZlcnNpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTcGVjVmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEVpc1R5cGUgYXR0cmlidXRlCi0JICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyAKLQkgKiBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLgotCSAqIAotCSAqIFRoaXMgaGVscHMgaW4gaWRlbnRpZnlpbmcgRUlTIGluc3RhbmNlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGgKLQkgKiB0aGlzIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0RWlzVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVpc1R5cGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRFaXNUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgdmVyc2lvbnMKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZQotCSAqIGFkYXB0ZXIgcHJvdmlkZXIuCi0JICogCi0JICogRXhhbXBsZTogMS4wCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBWZXJzaW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgTGljZW5zZSByZWZlcmVuY2UKLQkgKiBTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIGVsZW1lbnQKLQkgKiBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZQotCSAqIGFkYXB0ZXIsIGFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zaW5nIHRlcm1zIChleGFtcGxlczogZHVyYXRpb24gCi0JICogb2YgbGljZW5zZSwgbnVtYmVyIG9mCi0JICogY29ubmVjdGlvbiByZXN0cmljdGlvbnMpLgotCSAqLwotCUxpY2Vuc2UgZ2V0TGljZW5zZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTGljZW5zZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldExpY2Vuc2UoTGljZW5zZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZXNvdXJjZUFkYXB0ZXIgcmVmZXJlbmNlCi0JICovCi0JUmVzb3VyY2VBZGFwdGVyIGdldFJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVzb3VyY2VBZGFwdGVyIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VBZGFwdGVyKFJlc291cmNlQWRhcHRlciB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQ29ubmVjdG9yUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0b3JSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTUyZGIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9Db25uZWN0b3JSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JSZXNvdXJjZSBleHRlbmRzIFhNTFJlc291cmNlIHsKLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIDsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvSW5ib3VuZFJlc291cmNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTk0MzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uCi0gKiBhYm91dCBhbiBpbmJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24KLSAqIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlcgotICogbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgbWVzc2FnZWFkYXB0ZXIgZWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciNnZXRNZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtZXNzYWdlbGlzdGVuZXItdHlwZSBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZQotCSAqICAgICAgICAgdW5pcXVlIGluIHRoZSBtZXNzYWdlYWRhcHRlci4gU2V2ZXJhbCBtZXNzYWdlbGlzdGVuZXJzCi0JICogICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBtZXNzYWdlbGlzdGVuZXItdHlwZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWVzc2FnZUFkYXB0ZXIgZ2V0TWVzc2FnZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldE1lc3NhZ2VBZGFwdGVyIDxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWVzc2FnZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VBZGFwdGVyKE1lc3NhZ2VBZGFwdGVyIHZhbHVlKTsKLQotfSAvLyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvSmNhRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0pjYUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkZjIxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvSmNhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKY2FGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUpjYUZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYUZhY3RvcnlJbXBsKCk7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29ubmVjdG9yIHZhbHVlCi0JICovCi0JQ29ubmVjdG9yIGNyZWF0ZUNvbm5lY3RvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBMaWNlbnNlIHZhbHVlCi0JICovCi0JTGljZW5zZSBjcmVhdGVMaWNlbnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1lc3NhZ2VBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25uZWN0aW9uRGVmaW5pdGlvbiBjcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkbWluIE9iamVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWRtaW5PYmplY3QgY3JlYXRlQWRtaW5PYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWVzc2FnZUxpc3RlbmVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZhdGlvblNwZWMgY3JlYXRlQWN0aXZhdGlvblNwZWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSBjcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBSZXNvdXJjZUFkYXB0ZXIgdmFsdWUKLQkgKi8KLQlSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlY3VyaXR5UGVybWlzc2lvbiB2YWx1ZQotCSAqLwotCVNlY3VyaXR5UGVybWlzc2lvbiBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQXV0aGVudGljYXRpb25NZWNoYW5pc20gdmFsdWUKLQkgKi8KLQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb25maWdQcm9wZXJ0eSB2YWx1ZQotCSAqLwotCUNvbmZpZ1Byb3BlcnR5IGNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlKY2FQYWNrYWdlIGdldEpjYVBhY2thZ2UoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0pjYVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9KY2FQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZDdiODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0pjYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSmNhUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImpjYSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUiA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUT1JfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19WRU5ET1JfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19TUEVDX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9fRUlTX1RZUEUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTk5FQ1RPUl9fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OTkVDVE9SX19MSUNFTlNFID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db25uZWN0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVE9SX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTElDRU5TRSA9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVIgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUyA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUyA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA9IDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEFkYXB0ZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTID0gNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUyA9IDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMgPSA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUyA9IDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkbWluIE9iamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFMgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9BREFQVEVSX0ZFQVRVUkVfQ09VTlQgPSAxNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9QRVJNSVNTSU9OID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT04gPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSA9IDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05GSUdfUFJPUEVSVFkgPSAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUUkFOU0FDVElPTl9TVVBQT1JUX0tJTkQgPSAxNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUgPSAxNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJqY2EueG1pIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUpjYVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFID0gNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWV9fTkFNRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWV9fVFlQRSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWV9fVkFMVUUgPSAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkZJR19QUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT04gPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVVJJVFlfUEVSTUlTU0lPTl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBMSUNFTlNFX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExJQ0VOU0VfX1JFUVVJUkVEID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMSUNFTlNFX19ERVNDUklQVElPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5MaWNlbnNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJQ0VOU0VfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIDxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTkJPVU5EX1JFU09VUkNFX0FEQVBURVIgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIDxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIERlZmluaXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc21zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlQWRhcHRlckltcGwgPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VBZGFwdGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0TWVzc2FnZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9BREFQVEVSID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0FEQVBURVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCA8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05ORUNUSU9OX0RFRklOSVRJT04gPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFkbWluT2JqZWN0SW1wbCA8ZW0+QWRtaW4gT2JqZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRBZG1pbk9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBRE1JTl9PQkpFQ1QgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZG1pbiBPYmplY3QgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZG1pbiBPYmplY3QgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVMgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQURNSU5fT0JKRUNUX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlTGlzdGVuZXJJbXBsIDxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0TWVzc2FnZUxpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FU1NBR0VfTElTVEVORVIgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVTU0FHRV9MSVNURU5FUl9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uU3BlY0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldEFjdGl2YXRpb25TcGVjKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWQVRJT05fU1BFQyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZCBDb25maWcgUHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVkFUSU9OX1NQRUNfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19ERVNDUklQVElPTlMgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29ubmVjdG9yIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb25uZWN0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX1ZlbmRvck5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9FaXNUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9MaWNlbnNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTGljZW5zZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TGljZW5zZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldExpY2Vuc2VfUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+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+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUpjYUZhY3RvcnkgZ2V0SmNhRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DdXN0b21BdXRoTWVjaFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbnMoKTsKLQotfSAvL0pjYVBhY2thZ2UKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9MaWNlbnNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTGljZW5zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDM3ZjMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9MaWNlbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBTcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcyAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiBjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGljZW5zZSBleHRlbmRzIEVPYmplY3R7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2UjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldFJlcXVpcmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZSNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlcXVpcmVkKCkKLQkgKiBAc2VlICNpc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRSZXF1aXJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL01lc3NhZ2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTWVzc2FnZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiZDg0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTWVzc2FnZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgQWRhcHRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBtZXNzYWdlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICogbWVzc2FnaW5nIGNhcGFiaWxpdGllcyBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcwotICogY29udGFpbnMgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotICogbWVzc2FnZWxpc3RlbmVyIGVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyI2dldE1lc3NhZ2VMaXN0ZW5lcnMgPGVtPk1lc3NhZ2UgTGlzdGVuZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRNZXNzYWdlQWRhcHRlcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlQWRhcHRlciBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRNZXNzYWdlTGlzdGVuZXJzKCk7Ci0KLX0gLy8gTWVzc2FnZUFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9NZXNzYWdlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9NZXNzYWdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0ZDFhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvTWVzc2FnZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKLSAqIHNwZWNpZmljIG1lc3NhZ2UgbGlzdGVuZXIgc3VwcG9ydGVkIGJ5IHRoZSBtZXNzYWdpbmcKLSAqIHJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLSAqIG9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgotICogc3BlY2lmaWNhdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUgPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRBY3RpdmF0aW9uU3BlYyA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRNZXNzYWdlTGlzdGVuZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICogICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIGEgbWVzc2FnZQotCSAqICAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlLgotCSAqIAotCSAqICAgICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAgICAgICAgICAgPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLQkgKiAgICAgICAgICAgPC9tZXNzYWdlbGlzdGVuZXItdHlwZT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXNzYWdlTGlzdGVuZXJUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlTGlzdGVuZXJUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSA8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIExpc3RlbmVyIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1lc3NhZ2VMaXN0ZW5lclR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWN0aXZhdGlvblNwZWMoQWN0aXZhdGlvblNwZWMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvblNwZWMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2YXRpb25TcGVjIGdldEFjdGl2YXRpb25TcGVjKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldEFjdGl2YXRpb25TcGVjIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWN0aXZhdGlvblNwZWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2YXRpb25TcGVjKEFjdGl2YXRpb25TcGVjIHZhbHVlKTsKLQotfSAvLyBNZXNzYWdlTGlzdGVuZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9PdXRib3VuZFJlc291cmNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjVjNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIFRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dAotICogYW4gb3V0Ym91bmQgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5Ci0gKiBxdWFsaWZpZWQgbmFtZXMgb2YgY2xhc3Nlcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YKLSAqIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMgZm9yCi0gKiBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQKLSAqIHByb3ZpZGVkLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZAotICogYW5kIGFkZGl0aW9uYWwgcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0gKiAKLSAqIElmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgotICogcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLSAqIHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMKLSAqIHBhcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcwotICogdGhlIHNlY3VyaXR5IHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMgPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzCi0JICogICAgICAgICB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCi0JICogICAgICAgICByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLSBDb25uZWN0aW9uCi0JICogICAgICAgICBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZQotCSAqICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGlzIGVsZW1lbnQgbXVzdCBoYXZlCi0JICogICAgICAgICBlaXRoZXIgYSAidHJ1ZSIgb3IgImZhbHNlIiB2YWx1ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICN1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQKLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQKLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblN1cHBvcnQoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc219LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLQotfSAvLyBPdXRib3VuZFJlc291cmNlQWRhcHRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwOTgyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICogb2YgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEKLSAqIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZS4gSXQgaXMgdXNlZAotICogYnkgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnRzLgotICogCi0gKiBFeGFtcGxlOgotICogCi0gKiA8cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PkRlc3RpbmF0aW9uPC9yZXF1aXJlZC1jb25maWctcHJvcGVydHk+Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0gLy8gUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9SZXNvdXJjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9SZXNvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMzVhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mIGNsYXNzLy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cywgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCwgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkIGFuZCBhZGRpdGlvbmFsCi0gKiByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLSAqIAotICogSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi0gKiByZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotICogc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcyBwYXJ0Ci0gKiBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzIHRoZSBzZWN1cml0eQotICogcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBFT2JqZWN0ewotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlCi0JICogamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWQtQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMKLQkgKiBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIAotCSAqIHNwZWNpZmllZCBjb250cmFjdHMuCi0KLQkgKi8KLQlTdHJpbmcgZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgYXR0cmlidXRlCi0JICogU3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHN1cHBvcnRlZCAKLQkgKiBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotCSAqLwotCVN0cmluZyBnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBjbGFzcyB0aGF0Ci0JICogaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkludGVyZmFjZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIENvbm5lY3Rpb25JbnRlcmZhY2UgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDb25uZWN0aW9uSW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ29ubmVjdGlvbkltcGxDbGFzcyBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIAotCSAqIHJlc291cmNlIGFkYXB0ZXIuCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDb25uZWN0aW9uSW1wbENsYXNzIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFRyYW5zYWN0aW9uU3VwcG9ydCBhdHRyaWJ1dGUKLQkgKiBUaGUgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgdHJhbnNhY3Rpb24KLQkgKiBzdXBwb3J0IHByb3ZpZGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCSAqIFRoZSB2YWx1ZSBvZiB0cmFuc2FjdGlvbi1zdXBwb3J0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogICBOb1RyYW5zYWN0aW9uCi0JICogICBMb2NhbFRyYW5zYWN0aW9uCi0JICogICBYQVRyYW5zYWN0aW9uCi0JICovCi0JVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kCi0JICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCBhdHRyaWJ1dGUKLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cwotCSAqIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtQ29ubmVjdGlvbiBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMKLQkgKiBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gYW5kIG5vdCBmb3IgdGhlCi0JICogdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuCi0JICovCi0JYm9vbGVhbiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBzZWUgI3NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCi0JICogQHNlZSAjc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci1jbGFzcyBzcGVjaWZpZXMgdGhlCi0JICogICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCi0JICogICAgICAgICB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLlJlc291cmNlQWRhcHRlcgotCSAqICAgICAgICAgaW50ZXJmYWNlLiBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZgotCSAqICAgICAgICAgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvcgotCSAqICAgICAgICAgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbgotCSAqICAgICAgICAgb2YgdGhpcyBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MgPGVtPlJlc291cmNlIEFkYXB0ZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIEFkYXB0ZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVBlcm1pc3Npb25zIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZWN1cml0eVBlcm1pc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIENvbmZpZ1Byb3BlcnRpZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIFRoZSBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgZWxlbWVudCBjb250ZW50IG11c3QgYmUKLQkgKiAgICAgICAgIHVuaXF1ZSBpbiB0aGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyLiBNdWx0aXBsZSBjb25uZWN0aW9uLWRlZmluaXRpb25zCi0JICogICAgICAgICBjYW4gbm90IHVzZSB0aGUgc2FtZSBjb25uZWN0aW9uZmFjdG9yeS10eXBlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlI2dldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRib3VuZFJlc291cmNlQWRhcHRlciBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlciA8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoSW5ib3VuZFJlc291cmNlQWRhcHRlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZG1pbiBPYmplY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIE9iamVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5PYmplY3RzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QWRtaW5PYmplY3RzKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvU2VjdXJpdHlQZXJtaXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvU2VjdXJpdHlQZXJtaXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0M2ViYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1NlY3VyaXR5UGVybWlzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogU3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuCi0gKiAKLSAqIFRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZSBkZWZhdWx0IHBlcm1pc3Npb24gc2V0IGFzIHNwZWNpZmllZCBpbiB0aGUgY29ubmVjdG9yIHNwZWNpZmljYXRpb24uIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBjYW4gbWVudGlvbiBzcGVjaWZpYyByZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkgcGVybWlzc2lvbi4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3VyaXR5UGVybWlzc2lvbiBleHRlbmRzIEVPYmplY3R7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU3BlY2lmaWNhdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgZWxlbWVudCBwZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiBiYXNlZCBvbiB0aGUKLQkgKiBTZWN1cml0eSBwb2xpY3kgZmlsZSBzeW50YXguIAotCi0JICovCi0JU3RyaW5nIGdldFNwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTcGVjaWZpY2F0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWNhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9UcmFuc2FjdGlvblN1cHBvcnRLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjlkZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHt9Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1RSQU5TQUNUSU9OPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX1RSQU5TQUNUSU9OPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhBX1RSQU5TQUNUSU9OPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tm8gVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ObyBUcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT19UUkFOU0FDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBOT19UUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoTk9fVFJBTlNBQ1RJT04sICJOb1RyYW5zYWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBUcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9UUkFOU0FDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBMT0NBTF9UUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoTE9DQUxfVFJBTlNBQ1RJT04sICJMb2NhbFRyYW5zYWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WEEgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5YQSBUcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNYQV9UUkFOU0FDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBYQV9UUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoWEFfVFJBTlNBQ1RJT04sICJYQVRyYW5zYWN0aW9uIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kW10gewotCQkJTk9fVFJBTlNBQ1RJT05fTElURVJBTCwKLQkJCUxPQ0FMX1RSQU5TQUNUSU9OX0xJVEVSQUwsCi0JCQlYQV9UUkFOU0FDVElPTl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9fVFJBTlNBQ1RJT046IHJldHVybiBOT19UUkFOU0FDVElPTl9MSVRFUkFMOwotCQkJY2FzZSBMT0NBTF9UUkFOU0FDVElPTjogcmV0dXJuIExPQ0FMX1RSQU5TQUNUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIFhBX1RSQU5TQUNUSU9OOiByZXR1cm4gWEFfVFJBTlNBQ1RJT05fTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25TdXBwb3J0S2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9UcmFuc2FjdGlvblN1cHBvcnRLaW5kCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25TcGVjSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU0MGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25TcGVjSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2YXRpb24gU3BlYzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MgPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uU3BlY0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFjdGl2YXRpb25TcGVjIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpIDxlbT5BY3RpdmF0aW9uIFNwZWMgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25TcGVjQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWQVRJT05fU1BFQ19DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCkgPGVtPkFjdGl2YXRpb24gU3BlYyBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3RpdmF0aW9uU3BlY0NsYXNzID0gQUNUSVZBVElPTl9TUEVDX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZhdGlvblNwZWNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2YXRpb25TcGVjQ2xhc3MoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uU3BlY0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2YXRpb25TcGVjQ2xhc3MoU3RyaW5nIG5ld0FjdGl2YXRpb25TcGVjQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZEFjdGl2YXRpb25TcGVjQ2xhc3MgPSBhY3RpdmF0aW9uU3BlY0NsYXNzOwotCQlhY3RpdmF0aW9uU3BlY0NsYXNzID0gbmV3QWN0aXZhdGlvblNwZWNDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUywgb2xkQWN0aXZhdGlvblNwZWNDbGFzcywgYWN0aXZhdGlvblNwZWNDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCWlmIChyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiByZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUzoKLQkJCQlzZXRBY3RpdmF0aW9uU3BlY0NsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldFJlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTOgotCQkJCXNldEFjdGl2YXRpb25TcGVjQ2xhc3MoQUNUSVZBVElPTl9TUEVDX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTOgotCQkJCXJldHVybiBBQ1RJVkFUSU9OX1NQRUNfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2YXRpb25TcGVjQ2xhc3MgIT0gbnVsbCA6ICFBQ1RJVkFUSU9OX1NQRUNfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGFjdGl2YXRpb25TcGVjQ2xhc3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyAhPSBudWxsICYmICFyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZhdGlvblNwZWNDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZhdGlvblNwZWNDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2YXRpb25TcGVjSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQWRtaW5PYmplY3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BZG1pbk9iamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4ZGY5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BZG1pbk9iamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZG1pbiBPYmplY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkFkbWluT2JqZWN0SW1wbCNnZXRBZG1pbk9iamVjdEludGVyZmFjZSA8ZW0+QWRtaW4gT2JqZWN0IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsI2dldEFkbWluT2JqZWN0Q2xhc3MgPGVtPkFkbWluIE9iamVjdCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsI2dldENvbmZpZ1Byb3BlcnRpZXMgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWRtaW5PYmplY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBZG1pbk9iamVjdCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkbWluT2JqZWN0SW50ZXJmYWNlKCkgPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTl9PQkpFQ1RfSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkbWluT2JqZWN0SW50ZXJmYWNlKCkgPGVtPkFkbWluIE9iamVjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFkbWluT2JqZWN0SW50ZXJmYWNlID0gQURNSU5fT0JKRUNUX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZG1pbk9iamVjdENsYXNzKCkgPGVtPkFkbWluIE9iamVjdCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3RDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fT0JKRUNUX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkbWluT2JqZWN0Q2xhc3MoKSA8ZW0+QWRtaW4gT2JqZWN0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZG1pbk9iamVjdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFkbWluT2JqZWN0Q2xhc3MgPSBBRE1JTl9PQkpFQ1RfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdQcm9wZXJ0aWVzKCkgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb25maWdQcm9wZXJ0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBZG1pbk9iamVjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBhZG1pbk9iamVjdEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG1pbk9iamVjdEludGVyZmFjZShTdHJpbmcgbmV3QWRtaW5PYmplY3RJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZEFkbWluT2JqZWN0SW50ZXJmYWNlID0gYWRtaW5PYmplY3RJbnRlcmZhY2U7Ci0JCWFkbWluT2JqZWN0SW50ZXJmYWNlID0gbmV3QWRtaW5PYmplY3RJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFLCBvbGRBZG1pbk9iamVjdEludGVyZmFjZSwgYWRtaW5PYmplY3RJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkbWluT2JqZWN0Q2xhc3MoKSB7Ci0JCXJldHVybiBhZG1pbk9iamVjdENsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkbWluT2JqZWN0Q2xhc3MoU3RyaW5nIG5ld0FkbWluT2JqZWN0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZEFkbWluT2JqZWN0Q2xhc3MgPSBhZG1pbk9iamVjdENsYXNzOwotCQlhZG1pbk9iamVjdENsYXNzID0gbmV3QWRtaW5PYmplY3RDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUywgb2xkQWRtaW5PYmplY3RDbGFzcywgYWRtaW5PYmplY3RDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb25maWdQcm9wZXJ0aWVzKCkgewotCQlpZiAoY29uZmlnUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQljb25maWdQcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBjb25maWdQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0QWRtaW5PYmplY3RJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0QWRtaW5PYmplY3RDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFOgotCQkJCXNldEFkbWluT2JqZWN0SW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUzoKLQkJCQlzZXRBZG1pbk9iamVjdENsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFOgotCQkJCXNldEFkbWluT2JqZWN0SW50ZXJmYWNlKEFETUlOX09CSkVDVF9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUzoKLQkJCQlzZXRBZG1pbk9iamVjdENsYXNzKEFETUlOX09CSkVDVF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0Q29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFOgotCQkJCXJldHVybiBBRE1JTl9PQkpFQ1RfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBhZG1pbk9iamVjdEludGVyZmFjZSAhPSBudWxsIDogIUFETUlOX09CSkVDVF9JTlRFUkZBQ0VfRURFRkFVTFQuZXF1YWxzKGFkbWluT2JqZWN0SW50ZXJmYWNlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9DTEFTUzoKLQkJCQlyZXR1cm4gQURNSU5fT0JKRUNUX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBhZG1pbk9iamVjdENsYXNzICE9IG51bGwgOiAhQURNSU5fT0JKRUNUX0NMQVNTX0VERUZBVUxULmVxdWFscyhhZG1pbk9iamVjdENsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBjb25maWdQcm9wZXJ0aWVzICE9IG51bGwgJiYgIWNvbmZpZ1Byb3BlcnRpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWRtaW5PYmplY3RJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFkbWluT2JqZWN0SW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhZG1pbk9iamVjdENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhZG1pbk9iamVjdENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQWRtaW5PYmplY3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzM1YWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gTm90ZSB0aGF0IHRoaXMgc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzIGFueSByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIHJlcXVpcmVtZW50IGZvciB0aGUgc3VwcG9ydCBvZiBzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotICogCi0gKiBOb3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLSAqIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotICogVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLSAqIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLSAqLwotcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXV0aGVudGljYXRpb25NZWNoYW5pc20sIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aGVudGljYXRpb25NZWNoYW5pc20gPSBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFX0VERUZBVUxUID0gQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLkJBU0lDX1BBU1NXT1JEX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA9IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkgPGVtPkNyZWRlbnRpYWwgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWRlbnRpYWxJbnRlcmZhY2UgPSBDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9tQXV0aE1lY2hUeXBlKCkgPGVtPkN1c3RvbSBBdXRoIE1lY2ggVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VzdG9tQXV0aE1lY2hUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQVVUSF9NRUNIX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjdXN0b21BdXRoTWVjaFR5cGUgPSBDVVNUT01fQVVUSF9NRUNIX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKFN0cmluZyBuZXdBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSkgewotCQlTdHJpbmcgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc20gPSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc20gPSBuZXdBdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSwgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc20sIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIHNwZWNpZmllcyB0eXBlIG9mIGFuIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4KLQkgKiAKLQkgKiBUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOgotCSAqICAgLSBCYXNpY1Bhc3N3b3JkCi0JICogICAtIEtlcmJ2NQotCSAqIAotCSAqIEFueSBhZGRpdGlvbmFsIHNlY3VyaXR5IG1lY2hhbmlzbXMgYXJlIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZQotCSAqIENvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotCSAqLwotCXB1YmxpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgewotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgbmV3QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKSB7Ci0JCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSBvbGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGU7Ci0JCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA9IG5ld0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA9PSBudWxsID8gQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQgOiBuZXdBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGU7Ci0JCWJvb2xlYW4gb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCA9IGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQ7Ci0JCWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUsIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSwgYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLCAhb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgewotCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlID0gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOwotCQlib29sZWFuIG9sZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQgPSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFU2V0OwotCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPSBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRV9FREVGQVVMVDsKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSwgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRV9FREVGQVVMVCwgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgewotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZvcgotCSAqIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgdXNlZCBieQotCSAqIGFwcGxpY2F0aW9uIHNlcnZlciB0byBmaW5kIG91dCB0aGUgQ3JlZGVudGlhbCBpbnRlcmZhY2UgaXQgc2hvdWxkIHVzZSBhcyBwYXJ0Ci0JICogb2YgdGhlIHNlY3VyaXR5IGNvbnRyYWN0LgotCSAqIAotCSAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgotCSAqICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwKLQkgKiAgICBqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwKLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGNyZWRlbnRpYWxJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlZGVudGlhbEludGVyZmFjZShTdHJpbmcgbmV3Q3JlZGVudGlhbEludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkQ3JlZGVudGlhbEludGVyZmFjZSA9IGNyZWRlbnRpYWxJbnRlcmZhY2U7Ci0JCWNyZWRlbnRpYWxJbnRlcmZhY2UgPSBuZXdDcmVkZW50aWFsSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UsIG9sZENyZWRlbnRpYWxJbnRlcmZhY2UsIGNyZWRlbnRpYWxJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU006Ci0JCQkJcmV0dXJuIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9FREVGQVVMVCA9PSBudWxsID8gYXV0aGVudGljYXRpb25NZWNoYW5pc20gIT0gbnVsbCA6ICFBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fRURFRkFVTFQuZXF1YWxzKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgotCQkJCXJldHVybiBpc1NldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIENSRURFTlRJQUxfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBjcmVkZW50aWFsSW50ZXJmYWNlICE9IG51bGwgOiAhQ1JFREVOVElBTF9JTlRFUkZBQ0VfRURFRkFVTFQuZXF1YWxzKGNyZWRlbnRpYWxJbnRlcmZhY2UpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFOgotCQkJCXJldHVybiBDVVNUT01fQVVUSF9NRUNIX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGN1c3RvbUF1dGhNZWNoVHlwZSAhPSBudWxsIDogIUNVU1RPTV9BVVRIX01FQ0hfVFlQRV9FREVGQVVMVC5lcXVhbHMoY3VzdG9tQXV0aE1lY2hUeXBlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU006Ci0JCQkJc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6Ci0JCQkJc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFOgotCQkJCXNldENyZWRlbnRpYWxJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFOgotCQkJCXNldEN1c3RvbUF1dGhNZWNoVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNOgotCQkJCXNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6Ci0JCQkJdW5zZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRToKLQkJCQlzZXRDcmVkZW50aWFsSW50ZXJmYWNlKENSRURFTlRJQUxfSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEU6Ci0JCQkJc2V0Q3VzdG9tQXV0aE1lY2hUeXBlKENVU1RPTV9BVVRIX01FQ0hfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOiAiKTsKLQkJaWYgKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQoYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlZGVudGlhbEludGVyZmFjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlZGVudGlhbEludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VzdG9tQXV0aE1lY2hUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjdXN0b21BdXRoTWVjaFR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGlzIGlzIGFuIGludGVybmFsIHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIEF0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHdoZW4KLQkgKiBpdCBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBCYXNpY1Bhc3N3b3JkIG9yIEtlcmJ2NS4gIEF1dGhlbnRpY2F0aW9uTWVjYW5pc21UeXBlIAotCSAqIGlzIHNldCB0byAnQ3VzdG9tJyBpbiB0aG9zZSBjYXNlcy4gIFRoaXMgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCBieQotCSAqIHJ1bnRpbWUuICBJdCBpcyBvbmx5IHVzZWQgYnkgdGhlIHdyaXRlciB0byB3cml0ZSBiYWNrIG91dCB0aGUgY3VzdG9tCi0JICogQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIHN0cmluZyBpbiB0aGUgY2FzZSBvZiBjdXN0b20KLQkgKiBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUncy4gIAotCSAqIFRoaXMgdmFyaWFibGUgaXMgaW50ZXJuYWwsIHVzZWQgb25seSBieSB0aGUgcmVhZGVyLy93cml0ZXIgY2xhc3NlcywgYW5kIGNhbgotCSAqIGNoYW5nZSBvciBkaXNhcHBlYXIgd2l0aG91dCBub3RpY2UuICAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1c3RvbUF1dGhNZWNoVHlwZSgpIHsKLQkJcmV0dXJuIGN1c3RvbUF1dGhNZWNoVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21BdXRoTWVjaFR5cGUoU3RyaW5nIG5ld0N1c3RvbUF1dGhNZWNoVHlwZSkgewotCQlTdHJpbmcgb2xkQ3VzdG9tQXV0aE1lY2hUeXBlID0gY3VzdG9tQXV0aE1lY2hUeXBlOwotCQljdXN0b21BdXRoTWVjaFR5cGUgPSBuZXdDdXN0b21BdXRoTWVjaFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEUsIG9sZEN1c3RvbUF1dGhNZWNoVHlwZSwgY3VzdG9tQXV0aE1lY2hUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTToKLQkJCQlyZXR1cm4gZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgotCQkJCXJldHVybiBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEN1c3RvbUF1dGhNZWNoVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25maWdQcm9wZXJ0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0NvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDhkZjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0NvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgY29uZmlnIHByb3BlcnR5IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBzaW5nbGUKLSAqIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgZm9yIGEgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlLgotICogCi0gKiBFYWNoIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZSBjcmVhdGVzIGNvbm5lY3Rpb25zIHRvIGEgc3BlY2lmaWMgRUlTIGluc3RhbmNlIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIGNvbmZpZ3VyZWQgb24gdGhlIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4gVGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgb25seSBvbmNlIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGV2ZW4gdGhvdWdoIGEgcmVzb3VyY2UgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgbXVsdGlwbGUgTWFuYWdlZENvbm5uZWN0aW9uLUZhY3RvcnkgaW5zdGFuY2VzICh0aGF0IGNyZWF0ZSBjb25uZWN0aW9ucyB0byBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIEVJUykuCi0gKiAKLSAqIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwgdHlwZQotICogYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZiB0aGUgcmVzb3VyY2UKLSAqIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4gdGhlIGRlcGxveWVyIGlzCi0gKiByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLSAqIAotICogQW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24uCi0KLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1Byb3BlcnR5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29uZmlnUHJvcGVydHksIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbmZpZ1Byb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgdGhlIG5hbWUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotCSAqIAotCSAqIFRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkIHByb3BlcnRpZXMgYWxsIG9mIHR5cGUgamF2YS5sYW5nLlN0cmluZy4gVGhlc2UgYXJlIGFzIGZvbGxvd3M6Ci0JICogCi0JICogICAgICBTZXJ2ZXJOYW1lCi0JICogICAgICBQb3J0TnVtYmVyCi0JICogICAgICBVc2VyTmFtZQotCSAqICAgICAgUGFzc3dvcmQKLQkgKiAgICAgIENvbm5lY3Rpb25VUkwKLQkgKiAKLQkgKiBBIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0byBpbmNsdWRlIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIGl0cyB1bmRlcmx5aW5nIEVJUy4KLQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhcyByZXF1aXJlZCBieSBNYW5hZ2VkQ29ubmVjdGlvbi1GYWN0b3J5IGluc3RhbmNlLgotCSAqIAotCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgY29uZmlnLXByb3BlcnR5LXR5cGU6Ci0JICogICAgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLAotCSAqICAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsCi0JICogICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIENvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rpb25EZWZpbml0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTUwMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwjZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRDb25uZWN0aW9uSW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsI2dldENvbmZpZ1Byb3BlcnRpZXMgPGVtPkNvbmZpZyBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb25uZWN0aW9uRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgPGVtPk1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzID0gTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPSBDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSA8ZW0+Q29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzID0gQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uSW50ZXJmYWNlID0gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpIDxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uSW1wbENsYXNzID0gQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydGllcygpIDxlbT5Db25maWcgUHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29uZmlnUHJvcGVydGllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoU3RyaW5nIG5ld01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKSB7Ci0JCVN0cmluZyBvbGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA9IG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOwotCQltYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA9IG5ld01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MsIG9sZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzLCBtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZShTdHJpbmcgbmV3Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlID0gY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U7Ci0JCWNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlID0gbmV3Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFLCBvbGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSwgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nIG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA9IGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOwotCQljb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyA9IG5ld0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MsIG9sZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzLCBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25JbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkludGVyZmFjZShTdHJpbmcgbmV3Q29ubmVjdGlvbkludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkQ29ubmVjdGlvbkludGVyZmFjZSA9IGNvbm5lY3Rpb25JbnRlcmZhY2U7Ci0JCWNvbm5lY3Rpb25JbnRlcmZhY2UgPSBuZXdDb25uZWN0aW9uSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UsIG9sZENvbm5lY3Rpb25JbnRlcmZhY2UsIGNvbm5lY3Rpb25JbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uSW1wbENsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25JbXBsQ2xhc3MoU3RyaW5nIG5ld0Nvbm5lY3Rpb25JbXBsQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZENvbm5lY3Rpb25JbXBsQ2xhc3MgPSBjb25uZWN0aW9uSW1wbENsYXNzOwotCQljb25uZWN0aW9uSW1wbENsYXNzID0gbmV3Q29ubmVjdGlvbkltcGxDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUywgb2xkQ29ubmVjdGlvbkltcGxDbGFzcywgY29ubmVjdGlvbkltcGxDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb25maWdQcm9wZXJ0aWVzKCkgewotCQlpZiAoY29uZmlnUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQljb25maWdQcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBjb25maWdQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTOgotCQkJCXJldHVybiBnZXRDb25uZWN0aW9uSW1wbENsYXNzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0Q29uZmlnUHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgotCQkJCXNldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkltcGxDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6Ci0JCQkJc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25JbnRlcmZhY2UoQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uSW1wbENsYXNzKENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJZ2V0Q29uZmlnUHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlyZXR1cm4gTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzICE9IG51bGwgOiAhTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIENPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlICE9IG51bGwgOiAhQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIENPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyAhPSBudWxsIDogIUNPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxULmVxdWFscyhjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25JbnRlcmZhY2UgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkludGVyZmFjZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJcmV0dXJuIENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbkltcGxDbGFzcyAhPSBudWxsIDogIUNPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkltcGxDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gY29uZmlnUHJvcGVydGllcyAhPSBudWxsICYmICFjb25maWdQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbXBsQ2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbXBsQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzNTBlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotCi0KLS8qKgotICogVGhlIGNvbm5lY3RvciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHZlcnNpb24sIHNwZWNpZmljYXRpb24gdmVyc2lvbiBzdXBwb3J0ZWQsIGljb24gLSAgYWJvdXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBJdCBhbHNvIGluY2x1ZGVzIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci4KLQotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9ySW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIENvbm5lY3RvcnsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZW5kb3JOYW1lKCkgPGVtPlZlbmRvciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZW5kb3JOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlbmRvck5hbWUgPSBWRU5ET1JfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY1ZlcnNpb24oKSA8ZW0+U3BlYyBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTcGVjVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ19WRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3BlY1ZlcnNpb24gPSBTUEVDX1ZFUlNJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVpc1R5cGUoKSA8ZW0+RWlzIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVpc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVJU19UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZWlzVHlwZSA9IEVJU19UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTGljZW5zZSBsaWNlbnNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbm5lY3RvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuICBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIG1vZHVsZSBsZXZlbAotCSovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KLQkgKiBFeGFtcGxlOiBXb21iYXQgQ29ycC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiB2ZW5kb3JOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlbmRvck5hbWUoU3RyaW5nIG5ld1ZlbmRvck5hbWUpIHsKLQkJU3RyaW5nIG9sZFZlbmRvck5hbWUgPSB2ZW5kb3JOYW1lOwotCQl2ZW5kb3JOYW1lID0gbmV3VmVuZG9yTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FLCBvbGRWZW5kb3JOYW1lLCB2ZW5kb3JOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95ZXIgdG8gY29uZmlndXJlIHRoZSByZXNvdXJjZSBhZGFwdGVyIHRvIHN1cHBvcnQgZGVwbG95bWVudCBhbmQgcnVudGltZSByZXF1aXJlbWVudHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjVmVyc2lvbigpIHsKLQkJcmV0dXJuIHNwZWNWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWNWZXJzaW9uKFN0cmluZyBuZXdTcGVjVmVyc2lvbikgewotCQlTdHJpbmcgb2xkU3BlY1ZlcnNpb24gPSBzcGVjVmVyc2lvbjsKLQkJc3BlY1ZlcnNpb24gPSBuZXdTcGVjVmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTiwgb2xkU3BlY1ZlcnNpb24sIHNwZWNWZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLgotCSAqIAotCSAqIFRoaXMgaGVscHMgaW4gaWRlbnRpZnlpbmcgRUlTIGluc3RhbmNlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGgKLQkgKiB0aGlzIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVpc1R5cGUoKSB7Ci0JCXJldHVybiBlaXNUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVpc1R5cGUoU3RyaW5nIG5ld0Vpc1R5cGUpIHsKLQkJU3RyaW5nIG9sZEVpc1R5cGUgPSBlaXNUeXBlOwotCQllaXNUeXBlID0gbmV3RWlzVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFLCBvbGRFaXNUeXBlLCBlaXNUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIGEgc3RyaW5nLWJhc2VkIHZlcnNpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlci4KLQkgKiAKLQkgKiBFeGFtcGxlOiAxLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YKLQkgKiBjb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuCi0JICovCi0JcHVibGljIExpY2Vuc2UgZ2V0TGljZW5zZSgpIHsKLQkJcmV0dXJuIGxpY2Vuc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TGljZW5zZShMaWNlbnNlIG5ld0xpY2Vuc2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTGljZW5zZSBvbGRMaWNlbnNlID0gbGljZW5zZTsKLQkJbGljZW5zZSA9IG5ld0xpY2Vuc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFLCBvbGRMaWNlbnNlLCBuZXdMaWNlbnNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlKExpY2Vuc2UgbmV3TGljZW5zZSkgewotCQlpZiAobmV3TGljZW5zZSAhPSBsaWNlbnNlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChsaWNlbnNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxpY2Vuc2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TGljZW5zZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMaWNlbnNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TGljZW5zZShuZXdMaWNlbnNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFLCBuZXdMaWNlbnNlLCBuZXdMaWNlbnNlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFJlc291cmNlQWRhcHRlciBnZXRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiByZXNvdXJjZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVzb3VyY2VBZGFwdGVyKFJlc291cmNlQWRhcHRlciBuZXdSZXNvdXJjZUFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUmVzb3VyY2VBZGFwdGVyIG9sZFJlc291cmNlQWRhcHRlciA9IHJlc291cmNlQWRhcHRlcjsKLQkJcmVzb3VyY2VBZGFwdGVyID0gbmV3UmVzb3VyY2VBZGFwdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUiwgb2xkUmVzb3VyY2VBZGFwdGVyLCBuZXdSZXNvdXJjZUFkYXB0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQWRhcHRlcihSZXNvdXJjZUFkYXB0ZXIgbmV3UmVzb3VyY2VBZGFwdGVyKSB7Ci0JCWlmIChuZXdSZXNvdXJjZUFkYXB0ZXIgIT0gcmVzb3VyY2VBZGFwdGVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVzb3VyY2VBZGFwdGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Jlc291cmNlQWRhcHRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXNvdXJjZUFkYXB0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXNvdXJjZUFkYXB0ZXIobmV3UmVzb3VyY2VBZGFwdGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVNPVVJDRV9BREFQVEVSLCBuZXdSZXNvdXJjZUFkYXB0ZXIsIG5ld1Jlc291cmNlQWRhcHRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0TGljZW5zZShudWxsLCBtc2dzKTsKLQkJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVNPVVJDRV9BREFQVEVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZXNvdXJjZUFkYXB0ZXIobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgotCQkJCXJldHVybiBnZXRWZW5kb3JOYW1lKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19TUEVDX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFNwZWNWZXJzaW9uKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19FSVNfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWlzVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRToKLQkJCQlyZXR1cm4gZ2V0TGljZW5zZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgotCQkJCXJldHVybiBWRU5ET1JfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gdmVuZG9yTmFtZSAhPSBudWxsIDogIVZFTkRPUl9OQU1FX0VERUZBVUxULmVxdWFscyh2ZW5kb3JOYW1lKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTjoKLQkJCQlyZXR1cm4gU1BFQ19WRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyBzcGVjVmVyc2lvbiAhPSBudWxsIDogIVNQRUNfVkVSU0lPTl9FREVGQVVMVC5lcXVhbHMoc3BlY1ZlcnNpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRUlTX1RZUEU6Ci0JCQkJcmV0dXJuIEVJU19UWVBFX0VERUZBVUxUID09IG51bGwgPyBlaXNUeXBlICE9IG51bGwgOiAhRUlTX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVpc1R5cGUpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRToKLQkJCQlyZXR1cm4gbGljZW5zZSAhPSBudWxsOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVyICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgotCQkJCXNldFZlbmRvck5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fU1BFQ19WRVJTSU9OOgotCQkJCXNldFNwZWNWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFOgotCQkJCXNldEVpc1R5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6Ci0JCQkJc2V0TGljZW5zZSgoTGljZW5zZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlzZXRSZXNvdXJjZUFkYXB0ZXIoKFJlc291cmNlQWRhcHRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgotCQkJCXNldFZlbmRvck5hbWUoVkVORE9SX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1NQRUNfVkVSU0lPTjoKLQkJCQlzZXRTcGVjVmVyc2lvbihTUEVDX1ZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFOgotCQkJCXNldEVpc1R5cGUoRUlTX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFOgotCQkJCXNldExpY2Vuc2UoKExpY2Vuc2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlzZXRSZXNvdXJjZUFkYXB0ZXIoKFJlc291cmNlQWRhcHRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlbmRvck5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlbmRvck5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwZWNWZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzcGVjVmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWlzVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWlzVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvclJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDNkOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogTWV0aG9kIHJlZ2lzdGVyRHRkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgewotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wLCAiY29ubmVjdG9yXzFfMC5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BX0xPQ18xXzUsICJjb25uZWN0b3JfMV81LnhzZCIpOyAvLyROT04tTkxTLTEkCi0JfSAKLSAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LgotCSAqIEBwYXJhbSBhUmVuZGVyZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbm5lY3RvclJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvclJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5SQVJfU0hPUlRfTkFNRSwgbmV3IENvbm5lY3RvclJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuUkFSX1NIT1JUX05BTUUsIG5ldyBDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUklfT0JKKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvclJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OWE3ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuY29ubmVjdG9yLkNvbm5lY3RvclRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgQ29ubmVjdG9yUmVzb3VyY2V7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuCi0JICogQHBhcmFtIHVyaQotCSAqIEBwYXJhbSBhUmVuZGVyZXIKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC4KLQkgKiBAcGFyYW0gYVJlbmRlcmVyCi0JICovCi0JcHVibGljIENvbm5lY3RvclJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIEVMaXN0LgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKCkgewotCQlyZXR1cm4gKENvbm5lY3RvcikgZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFJBUl9UWVBFOwotCX0KLQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzA7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfUFVCTElDSURfMV8wOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgewotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9ET0NUWVBFOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2Ujc2V0RG9jdHlwZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqIFRoaXMgaXMgc2V0dGluZyB0aGUgbW9kdWxlIHZlcnNpb24gb24gdGhlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaW50IHZlcnNpb24gPSBKQ0FfMV81X0lEOwotCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkgCi0JCQl2ZXJzaW9uID0gSkNBXzFfNV9JRDsKLQkJZWxzZSBpZiAoc3lzdGVtSWQuZXF1YWxzKGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpKQotCQkJdmVyc2lvbiA9IEpDQV8xXzBfSUQ7Ci0JCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJc3VwZXIuc2V0VmVyc2lvbklEKHZlcnNpb24pOwotCX0KLQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSAoSkNBXzFfNV9JRCkgOgotCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChKQ0FfMV8wX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JfQotCQkvKgotCQkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQkJc3dpdGNoIChpZCkgewotCQkJY2FzZSAoSjJFRV8xXzRfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQkJcHJpbVNldFZlcnNpb25JRChKQ0FfMV81X0lEKTsKLQkJCQkJCWJyZWFrOwotCQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCQkJcHJpbVNldFZlcnNpb25JRChKQ0FfMV8wX0lEKTsKLQkJCQkJCWJyZWFrOwotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJCQkJcHJpbVNldFZlcnNpb25JRChKQ0FfMV8wX0lEKTsKLQkJCQl9Ci0JCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCQl9Ci0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXRSb290VHJhbnNsYXRvcigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBDb25uZWN0b3JUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQkvKiBSZXR1cm4gSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQkJZGVmYXVsdCA6Ci0JCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gSkNBXzFfNV9JRDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKLQkJQ29ubmVjdG9yIGNvbm4gPSBnZXRDb25uZWN0b3IoKTsKLQkJaWYgKGNvbm4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJU3RyaW5nIHZlcnNpb24gPSBjb25uLmdldFNwZWNWZXJzaW9uKCk7Ci0JCVN0cmluZyBuZXdWZXJzaW9uID0gZ2V0TW9kdWxlVmVyc2lvblN0cmluZygpOwotCQlpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKHZlcnNpb24pKQotCQkJY29ubi5zZXRTcGVjVmVyc2lvbihuZXdWZXJzaW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzcyNTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCNnZXRNZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VBZGFwdGVyKCkgPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlQWRhcHRlciBtZXNzYWdlQWRhcHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VBZGFwdGVyIGdldE1lc3NhZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbWVzc2FnZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWVzc2FnZUFkYXB0ZXIoTWVzc2FnZUFkYXB0ZXIgbmV3TWVzc2FnZUFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTWVzc2FnZUFkYXB0ZXIgb2xkTWVzc2FnZUFkYXB0ZXIgPSBtZXNzYWdlQWRhcHRlcjsKLQkJbWVzc2FnZUFkYXB0ZXIgPSBuZXdNZXNzYWdlQWRhcHRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUiwgb2xkTWVzc2FnZUFkYXB0ZXIsIG5ld01lc3NhZ2VBZGFwdGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlciBuZXdNZXNzYWdlQWRhcHRlcikgewotCQlpZiAobmV3TWVzc2FnZUFkYXB0ZXIgIT0gbWVzc2FnZUFkYXB0ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG1lc3NhZ2VBZGFwdGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1lc3NhZ2VBZGFwdGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWVzc2FnZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWVzc2FnZUFkYXB0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1lc3NhZ2VBZGFwdGVyKG5ld01lc3NhZ2VBZGFwdGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVIsIG5ld01lc3NhZ2VBZGFwdGVyLCBuZXdNZXNzYWdlQWRhcHRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0TWVzc2FnZUFkYXB0ZXIobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSOgotCQkJCXNldE1lc3NhZ2VBZGFwdGVyKChNZXNzYWdlQWRhcHRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUjoKLQkJCQlzZXRNZXNzYWdlQWRhcHRlcigoTWVzc2FnZUFkYXB0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VBZGFwdGVyICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSmNhRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiMzU3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmNhRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKY2FGYWN0b3J5ewotCi0JcHVibGljIEpjYUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUjogcmV0dXJuIGNyZWF0ZUNvbm5lY3RvcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVI6IHJldHVybiBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU006IHJldHVybiBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWTogcmV0dXJuIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTjogcmV0dXJuIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0U6IHJldHVybiBjcmVhdGVMaWNlbnNlKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSOiByZXR1cm4gY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVI6IHJldHVybiBjcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUjogcmV0dXJuIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OOiByZXR1cm4gY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1Q6IHJldHVybiBjcmVhdGVBZG1pbk9iamVjdCgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVI6IHJldHVybiBjcmVhdGVNZXNzYWdlTGlzdGVuZXIoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUM6IHJldHVybiBjcmVhdGVBY3RpdmF0aW9uU3BlYygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFOiByZXR1cm4gY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6IHsKLQkJCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgcmVzdWx0ID0gQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuVFJBTlNBQ1RJT05fU1VQUE9SVF9LSU5EOiB7Ci0JCQkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCByZXN1bHQgPSBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlRSQU5TQUNUSU9OX1NVUFBPUlRfS0lORDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgY3JlYXRlQ29ubmVjdG9yKCkgewotCQlDb25uZWN0b3JJbXBsIGNvbm5lY3RvciA9IG5ldyBDb25uZWN0b3JJbXBsKCk7Ci0JCXJldHVybiBjb25uZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIExpY2Vuc2UgY3JlYXRlTGljZW5zZSgpIHsKLQkJTGljZW5zZUltcGwgbGljZW5zZSA9IG5ldyBMaWNlbnNlSW1wbCgpOwotCQlyZXR1cm4gbGljZW5zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5ib3VuZFJlc291cmNlQWRhcHRlciBjcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlJbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCBpbmJvdW5kUmVzb3VyY2VBZGFwdGVyID0gbmV3IEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsKCk7Ci0JCXJldHVybiBpbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRib3VuZFJlc291cmNlQWRhcHRlciBjcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQkJT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyID0gbmV3IE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCgpOwotCQlyZXR1cm4gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCkgewotCQlNZXNzYWdlQWRhcHRlckltcGwgbWVzc2FnZUFkYXB0ZXIgPSBuZXcgTWVzc2FnZUFkYXB0ZXJJbXBsKCk7Ci0JCXJldHVybiBtZXNzYWdlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbkRlZmluaXRpb24gY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKSB7Ci0JCUNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCBjb25uZWN0aW9uRGVmaW5pdGlvbiA9IG5ldyBDb25uZWN0aW9uRGVmaW5pdGlvbkltcGwoKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb25EZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZG1pbk9iamVjdCBjcmVhdGVBZG1pbk9iamVjdCgpIHsKLQkJQWRtaW5PYmplY3RJbXBsIGFkbWluT2JqZWN0ID0gbmV3IEFkbWluT2JqZWN0SW1wbCgpOwotCQlyZXR1cm4gYWRtaW5PYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VMaXN0ZW5lciBjcmVhdGVNZXNzYWdlTGlzdGVuZXIoKSB7Ci0JCU1lc3NhZ2VMaXN0ZW5lckltcGwgbWVzc2FnZUxpc3RlbmVyID0gbmV3IE1lc3NhZ2VMaXN0ZW5lckltcGwoKTsKLQkJcmV0dXJuIG1lc3NhZ2VMaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdGlvblNwZWMgY3JlYXRlQWN0aXZhdGlvblNwZWMoKSB7Ci0JCUFjdGl2YXRpb25TcGVjSW1wbCBhY3RpdmF0aW9uU3BlYyA9IG5ldyBBY3RpdmF0aW9uU3BlY0ltcGwoKTsKLQkJcmV0dXJuIGFjdGl2YXRpb25TcGVjOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSBjcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpIHsKLQkJUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsIHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlID0gbmV3IFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCgpOwotCQlyZXR1cm4gcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFJlc291cmNlQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCVJlc291cmNlQWRhcHRlckltcGwgcmVzb3VyY2VBZGFwdGVyID0gbmV3IFJlc291cmNlQWRhcHRlckltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlQWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlQZXJtaXNzaW9uIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbigpIHsKLQkJU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCBzZWN1cml0eVBlcm1pc3Npb24gPSBuZXcgU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gc2VjdXJpdHlQZXJtaXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQkJQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtID0gbmV3IEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCgpOwotCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc207Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIENvbmZpZ1Byb3BlcnR5IGNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCkgewotCQlDb25maWdQcm9wZXJ0eUltcGwgY29uZmlnUHJvcGVydHkgPSBuZXcgQ29uZmlnUHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBjb25maWdQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmNhUGFja2FnZSBnZXRKY2FQYWNrYWdlKCkgewotCQlyZXR1cm4gKEpjYVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpjYVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYVBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYzZTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgSmNhUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKY2FQYWNrYWdlLCBFUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29ubmVjdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlc291cmNlQWRhcHRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25maWdQcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGljZW5zZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbmJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VBZGFwdGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFkbWluT2JqZWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VMaXN0ZW5lckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3RpdmF0aW9uU3BlY0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgSmNhUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEpjYUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpjYVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEpjYVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBKY2FQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCQlKYXZhUmVmUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVKY2FQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVKY2FQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29ubmVjdG9yKCkgewotCQlyZXR1cm4gY29ubmVjdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9MaWNlbnNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGljZW5zZSgpIHsKLQkJcmV0dXJuIGxpY2Vuc2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxpY2Vuc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaWNlbnNlX1JlcXVpcmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGljZW5zZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGljZW5zZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBtZXNzYWdlQWRhcHRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbm5lY3Rpb25EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkltcGxDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29uZmlnUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBZG1pbk9iamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluT2JqZWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdENsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VMaXN0ZW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZhdGlvblNwZWMoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uU3BlY0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvblNwZWNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhY3RpdmF0aW9uU3BlY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKSB7Ci0JCXJldHVybiByZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlckNsYXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9BZG1pbk9iamVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN1cml0eVBlcm1pc3Npb24oKSB7Ci0JCXJldHVybiBzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbmZpZ1Byb3BlcnR5KCkgewotCQlyZXR1cm4gY29uZmlnUHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCkgewotCQlyZXR1cm4gdHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSB7Ci0JCXJldHVybiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmNhRmFjdG9yeSBnZXRKY2FGYWN0b3J5KCkgewotCQlyZXR1cm4gKEpjYUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJY29ubmVjdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTk5FQ1RPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdG9yRUNsYXNzLCBDT05ORUNUT1JfX1ZFTkRPUl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fU1BFQ19WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fRUlTX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fTElDRU5TRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29ubmVjdG9yRUNsYXNzLCBDT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIpOwotCi0JCXJlc291cmNlQWRhcHRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVNPVVJDRV9BREFQVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX1JFU09VUkNFX0FEQVBURVJfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTKTsKLQotCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVVRIRU5USUNBVElPTl9NRUNIQU5JU00pOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU00pOwotCQljcmVhdGVFQXR0cmlidXRlKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTlMpOwotCi0JCWNvbmZpZ1Byb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTkZJR19QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uZmlnUHJvcGVydHlFQ2xhc3MsIENPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX1ZBTFVFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb25maWdQcm9wZXJ0eUVDbGFzcywgQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlMpOwotCi0JCXNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNVUklUWV9QRVJNSVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MsIFNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MsIFNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcywgU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TKTsKLQotCQlsaWNlbnNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKExJQ0VOU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGxpY2Vuc2VFQ2xhc3MsIExJQ0VOU0VfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaWNlbnNlRUNsYXNzLCBMSUNFTlNFX19SRVFVSVJFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGljZW5zZUVDbGFzcywgTElDRU5TRV9fREVTQ1JJUFRJT05TKTsKLQotCQlpbmJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVIpOwotCi0JCW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uob3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMpOwotCi0JCW1lc3NhZ2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfQURBUFRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZUFkYXB0ZXJFQ2xhc3MsIE1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlMpOwotCi0JCWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTk5FQ1RJT05fREVGSU5JVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUyk7Ci0KLQkJYWRtaW5PYmplY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQURNSU5fT0JKRUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhZG1pbk9iamVjdEVDbGFzcywgQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhZG1pbk9iamVjdEVDbGFzcywgQURNSU5fT0JKRUNUX19BRE1JTl9PQkpFQ1RfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFkbWluT2JqZWN0RUNsYXNzLCBBRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTKTsKLQotCQltZXNzYWdlTGlzdGVuZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9MSVNURU5FUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUxpc3RlbmVyRUNsYXNzLCBNRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VMaXN0ZW5lckVDbGFzcywgTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDKTsKLQotCQlhY3RpdmF0aW9uU3BlY0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVkFUSU9OX1NQRUMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2YXRpb25TcGVjRUNsYXNzLCBBQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZhdGlvblNwZWNFQ2xhc3MsIEFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRJRVMpOwotCi0JCXJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzcywgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzLCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0gPSBjcmVhdGVFRW51bShBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSk7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKFRSQU5TQUNUSU9OX1NVUFBPUlRfS0lORCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWNvbm5lY3RvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoY29ubmVjdG9yRUNsYXNzLCBDb25uZWN0b3IuY2xhc3MsICJDb25uZWN0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZW5kb3JOYW1lIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfU3BlY1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNwZWNWZXJzaW9uIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfRWlzVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWlzVHlwZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbm5lY3Rvcl9MaWNlbnNlKCksIHRoaXMuZ2V0TGljZW5zZSgpLCBudWxsLCAibGljZW5zZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpLCB0aGlzLmdldFJlc291cmNlQWRhcHRlcigpLCBudWxsLCAicmVzb3VyY2VBZGFwdGVyIiwgbnVsbCwgMSwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICJSZXNvdXJjZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkltcGxDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkltcGxDbGFzcyIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0aGlzLmdldFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoKSwgInRyYW5zYWN0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlQWRhcHRlckNsYXNzIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpLCB0aGlzLmdldFNlY3VyaXR5UGVybWlzc2lvbigpLCBudWxsLCAic2VjdXJpdHlQZXJtaXNzaW9ucyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSwgdGhpcy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLCBudWxsLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc21zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRDb25maWdQcm9wZXJ0eSgpLCBudWxsLCAiY29uZmlnUHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpLCB0aGlzLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIG51bGwsICJvdXRib3VuZFJlc291cmNlQWRhcHRlciIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSwgdGhpcy5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIG51bGwsICJpbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5PYmplY3RzKCksIHRoaXMuZ2V0QWRtaW5PYmplY3QoKSwgbnVsbCwgImFkbWluT2JqZWN0cyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSIsIG51bGwsIDAsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSwgdGhpcy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSwgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSIsIG51bGwsIDAsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNyZWRlbnRpYWxJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3VzdG9tQXV0aE1lY2hUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjdXN0b21BdXRoTWVjaFR5cGUiLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29uZmlnUHJvcGVydHlFQ2xhc3MsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAiQ29uZmlnUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIlNlY3VyaXR5UGVybWlzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNwZWNpZmljYXRpb24iLCBudWxsLCAwLCAxLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxpY2Vuc2VFQ2xhc3MsIExpY2Vuc2UuY2xhc3MsICJMaWNlbnNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIExpY2Vuc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExpY2Vuc2VfUmVxdWlyZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJyZXF1aXJlZCIsIG51bGwsIDAsIDEsIExpY2Vuc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGljZW5zZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIExpY2Vuc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpbmJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAiSW5ib3VuZFJlc291cmNlQWRhcHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlQWRhcHRlcigpLCB0aGlzLmdldE1lc3NhZ2VBZGFwdGVyKCksIG51bGwsICJtZXNzYWdlQWRhcHRlciIsIG51bGwsIDAsIDEsIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICJPdXRib3VuZFJlc291cmNlQWRhcHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0aGlzLmdldFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoKSwgInRyYW5zYWN0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25EZWZpbml0aW9ucygpLCB0aGlzLmdldENvbm5lY3Rpb25EZWZpbml0aW9uKCksIG51bGwsICJjb25uZWN0aW9uRGVmaW5pdGlvbnMiLCBudWxsLCAwLCAtMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLCB0aGlzLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCksIG51bGwsICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiLCBudWxsLCAwLCAtMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlQWRhcHRlckVDbGFzcywgTWVzc2FnZUFkYXB0ZXIuY2xhc3MsICJNZXNzYWdlQWRhcHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpLCB0aGlzLmdldE1lc3NhZ2VMaXN0ZW5lcigpLCBudWxsLCAibWVzc2FnZUxpc3RlbmVycyIsIG51bGwsIDEsIC0xLCBNZXNzYWdlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIkNvbm5lY3Rpb25EZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25JbXBsQ2xhc3MiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29uZmlnUHJvcGVydGllcygpLCB0aGlzLmdldENvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJjb25maWdQcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWRtaW5PYmplY3RFQ2xhc3MsIEFkbWluT2JqZWN0LmNsYXNzLCAiQWRtaW5PYmplY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhZG1pbk9iamVjdEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEFkbWluT2JqZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdENsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhZG1pbk9iamVjdENsYXNzIiwgbnVsbCwgMCwgMSwgQWRtaW5PYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRDb25maWdQcm9wZXJ0eSgpLCBudWxsLCAiY29uZmlnUHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBBZG1pbk9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VMaXN0ZW5lckVDbGFzcywgTWVzc2FnZUxpc3RlbmVyLmNsYXNzLCAiTWVzc2FnZUxpc3RlbmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZUxpc3RlbmVyVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWVzc2FnZUxpc3RlbmVyVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZUxpc3RlbmVyX0FjdGl2YXRpb25TcGVjKCksIHRoaXMuZ2V0QWN0aXZhdGlvblNwZWMoKSwgbnVsbCwgImFjdGl2YXRpb25TcGVjIiwgbnVsbCwgMSwgMSwgTWVzc2FnZUxpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWN0aXZhdGlvblNwZWNFQ2xhc3MsIEFjdGl2YXRpb25TcGVjLmNsYXNzLCAiQWN0aXZhdGlvblNwZWMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFjdGl2YXRpb25TcGVjQ2xhc3MiLCBudWxsLCAwLCAxLCBBY3RpdmF0aW9uU3BlYy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZhdGlvblNwZWNfUmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKSwgbnVsbCwgInJlcXVpcmVkQ29uZmlnUHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBBY3RpdmF0aW9uU3BlYy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzLCBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5jbGFzcywgIlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVFbnVtLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuY2xhc3MsICJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVFbnVtLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuQkFTSUNfUEFTU1dPUkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bSwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLktFUkJWNV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0odHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtLCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLmNsYXNzLCAiVHJhbnNhY3Rpb25TdXBwb3J0S2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtLCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLk5PX1RSQU5TQUNUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtLCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLkxPQ0FMX1RSQU5TQUNUSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtLCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLlhBX1RSQU5TQUNUSU9OX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DdXN0b21BdXRoTWVjaFR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi19IC8vSmNhUGFja2FnZUltcGwKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0xpY2Vuc2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9MaWNlbnNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjdlYWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0xpY2Vuc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlOwotCi0KLS8qKgotICogU3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gU3BlY2lmaWVzIHdoZXRoZXIgYSBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YgY29ubmVjdGlvbiByZXN0cmljdGlvbnMpLgotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExpY2Vuc2UsIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVxdWlyZWQoKSA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVFVSVJFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZWQgPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlcXVpcmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXByb3RlY3RlZCBMaWNlbnNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gbmV3UmVxdWlyZWQpIHsKLQkJYm9vbGVhbiBvbGRSZXF1aXJlZCA9IHJlcXVpcmVkOwotCQlyZXF1aXJlZCA9IG5ld1JlcXVpcmVkOwotCQlib29sZWFuIG9sZFJlcXVpcmVkRVNldCA9IHJlcXVpcmVkRVNldDsKLQkJcmVxdWlyZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRCwgb2xkUmVxdWlyZWQsIHJlcXVpcmVkLCAhb2xkUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXF1aXJlZCgpIHsKLQkJYm9vbGVhbiBvbGRSZXF1aXJlZCA9IHJlcXVpcmVkOwotCQlib29sZWFuIG9sZFJlcXVpcmVkRVNldCA9IHJlcXVpcmVkRVNldDsKLQkJcmVxdWlyZWQgPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJcmVxdWlyZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRCwgb2xkUmVxdWlyZWQsIFJFUVVJUkVEX0VERUZBVUxULCBvbGRSZXF1aXJlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVxdWlyZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVxdWlyZWQoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fUkVRVUlSRUQ6Ci0JCQkJdW5zZXRSZXF1aXJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVxdWlyZWQ6ICIpOwotCQlpZiAocmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Y2QxNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBBZGFwdGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlQWRhcHRlckltcGwjZ2V0TWVzc2FnZUxpc3RlbmVycyA8ZW0+TWVzc2FnZSBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQWRhcHRlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VBZGFwdGVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlTGlzdGVuZXJzKCkgPGVtPk1lc3NhZ2UgTGlzdGVuZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2VMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlTGlzdGVuZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlQWRhcHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXNzYWdlTGlzdGVuZXJzKCkgewotCQlpZiAobWVzc2FnZUxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlTGlzdGVuZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZUxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlTGlzdGVuZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRNZXNzYWdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlM6Ci0JCQkJZ2V0TWVzc2FnZUxpc3RlbmVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZUxpc3RlbmVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTOgotCQkJCWdldE1lc3NhZ2VMaXN0ZW5lcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhbWVzc2FnZUxpc3RlbmVycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL01lc3NhZ2VBZGFwdGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUxpc3RlbmVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUxpc3RlbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzRiNGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VMaXN0ZW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgTGlzdGVuZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VMaXN0ZW5lckltcGwjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSA8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlTGlzdGVuZXJJbXBsI2dldEFjdGl2YXRpb25TcGVjIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTGlzdGVuZXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXNzYWdlTGlzdGVuZXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCkgPGVtPk1lc3NhZ2UgTGlzdGVuZXIgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9MSVNURU5FUl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKSA8ZW0+TWVzc2FnZSBMaXN0ZW5lciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2VMaXN0ZW5lclR5cGUgPSBNRVNTQUdFX0xJU1RFTkVSX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uU3BlYygpIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2YXRpb25TcGVjKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZhdGlvblNwZWMgYWN0aXZhdGlvblNwZWMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VMaXN0ZW5lckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBtZXNzYWdlTGlzdGVuZXJUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VMaXN0ZW5lclR5cGUoU3RyaW5nIG5ld01lc3NhZ2VMaXN0ZW5lclR5cGUpIHsKLQkJU3RyaW5nIG9sZE1lc3NhZ2VMaXN0ZW5lclR5cGUgPSBtZXNzYWdlTGlzdGVuZXJUeXBlOwotCQltZXNzYWdlTGlzdGVuZXJUeXBlID0gbmV3TWVzc2FnZUxpc3RlbmVyVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEUsIG9sZE1lc3NhZ2VMaXN0ZW5lclR5cGUsIG1lc3NhZ2VMaXN0ZW5lclR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdGlvblNwZWMgZ2V0QWN0aXZhdGlvblNwZWMoKSB7Ci0JCXJldHVybiBhY3RpdmF0aW9uU3BlYzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY3RpdmF0aW9uU3BlYyhBY3RpdmF0aW9uU3BlYyBuZXdBY3RpdmF0aW9uU3BlYywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBY3RpdmF0aW9uU3BlYyBvbGRBY3RpdmF0aW9uU3BlYyA9IGFjdGl2YXRpb25TcGVjOwotCQlhY3RpdmF0aW9uU3BlYyA9IG5ld0FjdGl2YXRpb25TcGVjOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQywgb2xkQWN0aXZhdGlvblNwZWMsIG5ld0FjdGl2YXRpb25TcGVjKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmF0aW9uU3BlYyhBY3RpdmF0aW9uU3BlYyBuZXdBY3RpdmF0aW9uU3BlYykgewotCQlpZiAobmV3QWN0aXZhdGlvblNwZWMgIT0gYWN0aXZhdGlvblNwZWMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjdGl2YXRpb25TcGVjICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjdGl2YXRpb25TcGVjKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjdGl2YXRpb25TcGVjICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjdGl2YXRpb25TcGVjKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWN0aXZhdGlvblNwZWMobmV3QWN0aXZhdGlvblNwZWMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUMsIG5ld0FjdGl2YXRpb25TcGVjLCBuZXdBY3RpdmF0aW9uU3BlYykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OX1NQRUM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEFjdGl2YXRpb25TcGVjKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRToKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZUxpc3RlbmVyVHlwZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQzoKLQkJCQlyZXR1cm4gZ2V0QWN0aXZhdGlvblNwZWMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFOgotCQkJCXNldE1lc3NhZ2VMaXN0ZW5lclR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQzoKLQkJCQlzZXRBY3RpdmF0aW9uU3BlYygoQWN0aXZhdGlvblNwZWMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRV9MSVNURU5FUl9UWVBFOgotCQkJCXNldE1lc3NhZ2VMaXN0ZW5lclR5cGUoTUVTU0FHRV9MSVNURU5FUl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDOgotCQkJCXNldEFjdGl2YXRpb25TcGVjKChBY3RpdmF0aW9uU3BlYyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEU6Ci0JCQkJcmV0dXJuIE1FU1NBR0VfTElTVEVORVJfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZUxpc3RlbmVyVHlwZSAhPSBudWxsIDogIU1FU1NBR0VfTElTVEVORVJfVFlQRV9FREVGQVVMVC5lcXVhbHMobWVzc2FnZUxpc3RlbmVyVHlwZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDOgotCQkJCXJldHVybiBhY3RpdmF0aW9uU3BlYyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWVzc2FnZUxpc3RlbmVyVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWVzc2FnZUxpc3RlbmVyVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01lc3NhZ2VMaXN0ZW5lckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTIzYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMgPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKSA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCA9IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuTk9fVFJBTlNBQ1RJT05fTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpIDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHRyYW5zYWN0aW9uU3VwcG9ydCA9IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFRyYW5zYWN0aW9uIFN1cHBvcnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25EZWZpbml0aW9ucygpIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbm5lY3Rpb25EZWZpbml0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4gbmV3UmVhdXRoZW50aWNhdGlvblN1cHBvcnQpIHsKLQkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0OwotCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IG5ld1JlYXV0aGVudGljYXRpb25TdXBwb3J0OwotCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKLQkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0LCByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCwgIW9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKLQkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQ7Ci0JCXJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxUOwotCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCwgb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQsIFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVCwgb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBnZXRUcmFuc2FjdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgbmV3VHJhbnNhY3Rpb25TdXBwb3J0KSB7Ci0JCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgb2xkVHJhbnNhY3Rpb25TdXBwb3J0ID0gdHJhbnNhY3Rpb25TdXBwb3J0OwotCQl0cmFuc2FjdGlvblN1cHBvcnQgPSBuZXdUcmFuc2FjdGlvblN1cHBvcnQgPT0gbnVsbCA/IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQgOiBuZXdUcmFuc2FjdGlvblN1cHBvcnQ7Ci0JCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQ7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQsIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCwgdHJhbnNhY3Rpb25TdXBwb3J0LCAhb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgewotCQlUcmFuc2FjdGlvblN1cHBvcnRLaW5kIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCA9IHRyYW5zYWN0aW9uU3VwcG9ydDsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gdHJhbnNhY3Rpb25TdXBwb3J0RVNldDsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0ID0gVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVDsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCwgb2xkVHJhbnNhY3Rpb25TdXBwb3J0LCBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvblN1cHBvcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiB0cmFuc2FjdGlvblN1cHBvcnRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCWlmIChjb25uZWN0aW9uRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJY29ubmVjdGlvbkRlZmluaXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlMpOwotCQl9Ci0JCXJldHVybiBjb25uZWN0aW9uRGVmaW5pdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpIHsKLQkJaWYgKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA9PSBudWxsKSB7Ci0JCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyk7Ci0JCX0KLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlM6Ci0JCQkJcmV0dXJuIGdldENvbm5lY3Rpb25EZWZpbml0aW9ucygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJcmV0dXJuIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6Ci0JCQkJc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJc2V0VHJhbnNhY3Rpb25TdXBwb3J0KChUcmFuc2FjdGlvblN1cHBvcnRLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUzoKLQkJCQlnZXRDb25uZWN0aW9uRGVmaW5pdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldENvbm5lY3Rpb25EZWZpbml0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkuY2xlYXIoKTsKLQkJCQlnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXVuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVDoKLQkJCQl1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TOgotCQkJCWdldENvbm5lY3Rpb25EZWZpbml0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlM6Ci0JCQkJcmV0dXJuIGNvbm5lY3Rpb25EZWZpbml0aW9ucyAhPSBudWxsICYmICFjb25uZWN0aW9uRGVmaW5pdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyAhPSBudWxsICYmICFhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVhdXRoZW50aWNhdGlvblN1cHBvcnQ6ICIpOwotCQlpZiAocmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSByZXN1bHQuYXBwZW5kKHJlYXV0aGVudGljYXRpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNhY3Rpb25TdXBwb3J0OiAiKTsKLQkJaWYgKHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkNDBlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXF1aXJlZCBDb25maWcgUHJvcGVydHkgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5NDZiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0S2luZDsKLQotCi0vKioKLSAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzcy8vaW50ZXJmYWNlcyByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQsIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvciBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2VzLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBhbmQgYWRkaXRpb25hbAotICogcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0gKiAKLSAqIElmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgotICogcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLSAqIHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgcGFydAotICogb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyB0aGUgc2VjdXJpdHkKLSAqIHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFkYXB0ZXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZUFkYXB0ZXIsIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSA8ZW0+TWFuYWdlZCBDb25uZWN0aW9uIEZhY3RvcnkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzID0gTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkgPGVtPkNvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPSBDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIDxlbT5Db25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPSBDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uSW50ZXJmYWNlID0gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uSW1wbENsYXNzID0gQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKSA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCA9IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuTk9fVFJBTlNBQ1RJT05fTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIHRyYW5zYWN0aW9uU3VwcG9ydCA9IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBTdXBwb3J0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpIDxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQURBUFRFUl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpIDxlbT5SZXNvdXJjZSBBZGFwdGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUFkYXB0ZXJDbGFzcyA9IFJFU09VUkNFX0FEQVBURVJfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlQZXJtaXNzaW9ucyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbmZpZ1Byb3BlcnRpZXMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpIDxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRtaW5PYmplY3RzKCkgPGVtPkFkbWluIE9iamVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRtaW5PYmplY3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYWRtaW5PYmplY3RzID0gbnVsbDsKLQotCXByb3RlY3RlZCBSZXNvdXJjZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZC1Db25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuCi0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoU3RyaW5nIG5ld01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKSB7Ci0JCVN0cmluZyBvbGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA9IG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOwotCQltYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyA9IG5ld01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTLCBvbGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcywgbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKFN0cmluZyBuZXdDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPSBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTsKLQkJY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UgPSBuZXdDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFLCBvbGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSwgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKFN0cmluZyBuZXdDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcykgewotCQlTdHJpbmcgb2xkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPSBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczsKLQkJY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MgPSBuZXdDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUywgb2xkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MsIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uSW50ZXJmYWNlKFN0cmluZyBuZXdDb25uZWN0aW9uSW50ZXJmYWNlKSB7Ci0JCVN0cmluZyBvbGRDb25uZWN0aW9uSW50ZXJmYWNlID0gY29ubmVjdGlvbkludGVyZmFjZTsKLQkJY29ubmVjdGlvbkludGVyZmFjZSA9IG5ld0Nvbm5lY3Rpb25JbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTlRFUkZBQ0UsIG9sZENvbm5lY3Rpb25JbnRlcmZhY2UsIGNvbm5lY3Rpb25JbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBTcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbkltcGxDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uSW1wbENsYXNzKFN0cmluZyBuZXdDb25uZWN0aW9uSW1wbENsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb25uZWN0aW9uSW1wbENsYXNzID0gY29ubmVjdGlvbkltcGxDbGFzczsKLQkJY29ubmVjdGlvbkltcGxDbGFzcyA9IG5ld0Nvbm5lY3Rpb25JbXBsQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTLCBvbGRDb25uZWN0aW9uSW1wbENsYXNzLCBjb25uZWN0aW9uSW1wbENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHRyYW5zYWN0aW9uLXN1cHBvcnQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxldmVsIG9mIHRyYW5zYWN0aW9uCi0JICogc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQkgKiBUaGUgdmFsdWUgb2YgdHJhbnNhY3Rpb24tc3VwcG9ydCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSAqICAgTm9UcmFuc2FjdGlvbgotCSAqICAgTG9jYWxUcmFuc2FjdGlvbgotCSAqICAgWEFUcmFuc2FjdGlvbgotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGdldFRyYW5zYWN0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uU3VwcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvblN1cHBvcnQoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBuZXdUcmFuc2FjdGlvblN1cHBvcnQpIHsKLQkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBvbGRUcmFuc2FjdGlvblN1cHBvcnQgPSB0cmFuc2FjdGlvblN1cHBvcnQ7Ci0JCXRyYW5zYWN0aW9uU3VwcG9ydCA9IG5ld1RyYW5zYWN0aW9uU3VwcG9ydCA9PSBudWxsID8gVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCA6IG5ld1RyYW5zYWN0aW9uU3VwcG9ydDsKLQkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gdHJhbnNhY3Rpb25TdXBwb3J0RVNldDsKLQkJdHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCwgb2xkVHJhbnNhY3Rpb25TdXBwb3J0LCB0cmFuc2FjdGlvblN1cHBvcnQsICFvbGRUcmFuc2FjdGlvblN1cHBvcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKSB7Ci0JCVRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgb2xkVHJhbnNhY3Rpb25TdXBwb3J0ID0gdHJhbnNhY3Rpb25TdXBwb3J0OwotCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSB0cmFuc2FjdGlvblN1cHBvcnRFU2V0OwotCQl0cmFuc2FjdGlvblN1cHBvcnQgPSBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxUOwotCQl0cmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JULCBvbGRUcmFuc2FjdGlvblN1cHBvcnQsIFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQsIG9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgcmUtYXV0aGVudGljYXRpb24gb2YgZXhpc3RpbmcgTWFuYWdlZC1Db25uZWN0aW9uIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gYW5kIG5vdCBmb3IgdGhlIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuIG5ld1JlYXV0aGVudGljYXRpb25TdXBwb3J0KSB7Ci0JCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKLQkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSBuZXdSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKLQkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQ7Ci0JCXJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JULCBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCwgcmVhdXRoZW50aWNhdGlvblN1cHBvcnQsICFvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgewotCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gcmVhdXRoZW50aWNhdGlvblN1cHBvcnQ7Ci0JCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0OwotCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVDsKLQkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0LCBSRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlRfRURFRkFVTFQsIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7Ci0JCXJldHVybiByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHJlc291cmNlQWRhcHRlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQWRhcHRlckNsYXNzKFN0cmluZyBuZXdSZXNvdXJjZUFkYXB0ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkUmVzb3VyY2VBZGFwdGVyQ2xhc3MgPSByZXNvdXJjZUFkYXB0ZXJDbGFzczsKLQkJcmVzb3VyY2VBZGFwdGVyQ2xhc3MgPSBuZXdSZXNvdXJjZUFkYXB0ZXJDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTLCBvbGRSZXNvdXJjZUFkYXB0ZXJDbGFzcywgcmVzb3VyY2VBZGFwdGVyQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpIHsKLQkJaWYgKHNlY3VyaXR5UGVybWlzc2lvbnMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlQZXJtaXNzaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlMpOwotCQl9Ci0JCXJldHVybiBzZWN1cml0eVBlcm1pc3Npb25zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSB7Ci0JCWlmIChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMgPT0gbnVsbCkgewotCQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMpOwotCQl9Ci0JCXJldHVybiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbmZpZ1Byb3BlcnRpZXMoKSB7Ci0JCWlmIChjb25maWdQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCWNvbmZpZ1Byb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBjb25maWdQcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRib3VuZFJlc291cmNlQWRhcHRlciBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG9sZE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyID0gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci0JCW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyID0gbmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiwgb2xkT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIsIG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciBuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlcikgewotCQlpZiAobmV3T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPdXRib3VuZFJlc291cmNlQWRhcHRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcihuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIsIG5ld091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLCBuZXdPdXRib3VuZFJlc291cmNlQWRhcHRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBpbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoSW5ib3VuZFJlc291cmNlQWRhcHRlciBuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUluYm91bmRSZXNvdXJjZUFkYXB0ZXIgb2xkSW5ib3VuZFJlc291cmNlQWRhcHRlciA9IGluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci0JCWluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPSBuZXdJbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiwgb2xkSW5ib3VuZFJlc291cmNlQWRhcHRlciwgbmV3SW5ib3VuZFJlc291cmNlQWRhcHRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcihJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIpIHsKLQkJaWYgKG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gaW5ib3VuZFJlc291cmNlQWRhcHRlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5ib3VuZFJlc291cmNlQWRhcHRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbmJvdW5kUmVzb3VyY2VBZGFwdGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luYm91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5ib3VuZFJlc291cmNlQWRhcHRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIobmV3SW5ib3VuZFJlc291cmNlQWRhcHRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiwgbmV3SW5ib3VuZFJlc291cmNlQWRhcHRlciwgbmV3SW5ib3VuZFJlc291cmNlQWRhcHRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBZG1pbk9iamVjdHMoKSB7Ci0JCWlmIChhZG1pbk9iamVjdHMgPT0gbnVsbCkgewotCQkJYWRtaW5PYmplY3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEFkbWluT2JqZWN0LmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFMpOwotCQl9Ci0JCXJldHVybiBhZG1pbk9iamVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1NFQ1VSSVRZX1BFUk1JU1NJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5UGVybWlzc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcihudWxsLCBtc2dzKTsKLQkJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFkbWluT2JqZWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uU3VwcG9ydCgpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQlyZXR1cm4gaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRV9BREFQVEVSX0NMQVNTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1NFQ1VSSVRZX1BFUk1JU1NJT05TOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVBlcm1pc3Npb25zKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUzoKLQkJCQlyZXR1cm4gZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXJldHVybiBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFM6Ci0JCQkJcmV0dXJuIGdldEFkbWluT2JqZWN0cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlyZXR1cm4gTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzICE9IG51bGwgOiAhTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFOgotCQkJCXJldHVybiBDT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSAhPSBudWxsIDogIUNPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQuZXF1YWxzKGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzICE9IG51bGwgOiAhQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25JbnRlcmZhY2UgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkludGVyZmFjZSk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTOgotCQkJCXJldHVybiBDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25JbXBsQ2xhc3MgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGNvbm5lY3Rpb25JbXBsQ2xhc3MpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgotCQkJCXJldHVybiBpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUzoKLQkJCQlyZXR1cm4gUkVTT1VSQ0VfQURBUFRFUl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VBZGFwdGVyQ2xhc3MgIT0gbnVsbCA6ICFSRVNPVVJDRV9BREFQVEVSX0NMQVNTX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZUFkYXB0ZXJDbGFzcyk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5UGVybWlzc2lvbnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlQZXJtaXNzaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUzoKLQkJCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21zICE9IG51bGwgJiYgIWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnRpZXMgIT0gbnVsbCAmJiAhY29uZmlnUHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlyZXR1cm4gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJcmV0dXJuIGluYm91bmRSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BRE1JTl9PQkpFQ1RTOgotCQkJCXJldHVybiBhZG1pbk9iamVjdHMgIT0gbnVsbCAmJiAhYWRtaW5PYmplY3RzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKLQkJCQlzZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRToKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25JbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uSW1wbENsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXNldFRyYW5zYWN0aW9uU3VwcG9ydCgoVHJhbnNhY3Rpb25TdXBwb3J0S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQlzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUzoKLQkJCQlzZXRSZXNvdXJjZUFkYXB0ZXJDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlM6Ci0JCQkJZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVM6Ci0JCQkJZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkuY2xlYXIoKTsKLQkJCQlnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVElFUzoKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjoKLQkJCQlzZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI6Ci0JCQkJc2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigoSW5ib3VuZFJlc291cmNlQWRhcHRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFM6Ci0JCQkJZ2V0QWRtaW5PYmplY3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRBZG1pbk9iamVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6Ci0JCQkJc2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKENPTk5FQ1RJT05fRkFDVE9SWV9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUzoKLQkJCQlzZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcyhDT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFOgotCQkJCXNldENvbm5lY3Rpb25JbnRlcmZhY2UoQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6Ci0JCQkJc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgotCQkJCXVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKLQkJCQl1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFU09VUkNFX0FEQVBURVJfQ0xBU1M6Ci0JCQkJc2V0UmVzb3VyY2VBZGFwdGVyQ2xhc3MoUkVTT1VSQ0VfQURBUFRFUl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1NFQ1VSSVRZX1BFUk1JU1NJT05TOgotCQkJCWdldFNlY3VyaXR5UGVybWlzc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01TOgotCQkJCWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCWdldENvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXNldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKChPdXRib3VuZFJlc291cmNlQWRhcHRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSOgotCQkJCXNldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFM6Ci0JCQkJZ2V0QWRtaW5PYmplY3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbXBsQ2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbXBsQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zYWN0aW9uU3VwcG9ydDogIik7Ci0JCWlmICh0cmFuc2FjdGlvblN1cHBvcnRFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uU3VwcG9ydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYXV0aGVudGljYXRpb25TdXBwb3J0OiAiKTsKLQkJaWYgKHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkgcmVzdWx0LmFwcGVuZChyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlQWRhcHRlckNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZUFkYXB0ZXJDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5UGVybWlzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5UGVybWlzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5MGViOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVBlcm1pc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLSAqIAotICogVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXJlIG9uZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgcmVxdWlyZWQgYnkgdGhlIGRlZmF1bHQgcGVybWlzc2lvbiBzZXQgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3Igc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGNhbiBtZW50aW9uIHNwZWNpZmljIHJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbiBzZWN1cml0eSBwZXJtaXNzaW9uLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVBlcm1pc3Npb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZWN1cml0eVBlcm1pc3Npb24sIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWNpZmljYXRpb24oKSA8ZW0+U3BlY2lmaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3BlY2lmaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ0lGSUNBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmljYXRpb24gPSBTUEVDSUZJQ0FUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXByb3RlY3RlZCBTZWN1cml0eVBlcm1pc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIGJhc2VkIG9uIHRoZSBTZWN1cml0eSBwb2xpY3kgZmlsZSBzeW50YXguIAotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gc3BlY2lmaWNhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uKFN0cmluZyBuZXdTcGVjaWZpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjsKLQkJc3BlY2lmaWNhdGlvbiA9IG5ld1NwZWNpZmljYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fU1BFQ0lGSUNBVElPTiwgb2xkU3BlY2lmaWNhdGlvbiwgc3BlY2lmaWNhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0U3BlY2lmaWNhdGlvbigpOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT046Ci0JCQkJcmV0dXJuIFNQRUNJRklDQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHNwZWNpZmljYXRpb24gIT0gbnVsbCA6ICFTUEVDSUZJQ0FUSU9OX0VERUZBVUxULmVxdWFscyhzcGVjaWZpY2F0aW9uKTsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TUEVDSUZJQ0FUSU9OOgotCQkJCXNldFNwZWNpZmljYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX1NQRUNJRklDQVRJT046Ci0JCQkJc2V0U3BlY2lmaWNhdGlvbihTUEVDSUZJQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwZWNpZmljYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNwZWNpZmljYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KQ0FEZXNjcmlwdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3V0aWwvSkNBRGVzY3JpcHRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0ZjE4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KQ0FEZXNjcmlwdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKQ0FEZXNjcmlwdGlvbkhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKENvbmZpZ1Byb3BlcnR5IHByb3BlcnR5LCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbk9iaiA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJCXByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oQ29uZmlnUHJvcGVydHkgcHJvcGVydHksaW50IGpjYVZlcnNpb25JRCkgewotCQlzd2l0Y2goamNhVmVyc2lvbklEKSB7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ6IAotCQkgICAgCXJldHVybiBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOiB7Ci0JCQkJIEVMaXN0IGxvY2FsaXplZERlc2NyaXB0aW9ucyA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpOwotCQkJCSBpZihsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPT0gbnVsbCB8fCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMuc2l6ZSgpID09IDApCi0JCQkJIAlyZXR1cm4gbnVsbDsKLQkJCSAgICAgRGVzY3JpcHRpb24gbG9jYWxpemVkRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbG9jYWxpemVkRGVzY3JpcHRpb25zLmdldCgwKTsKLQkJCSAgICAgaWYobG9jYWxpemVkRGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCSAgICAgCXJldHVybiBsb2NhbGl6ZWREZXNjcmlwdGlvbi5nZXRWYWx1ZSgpOwotCQkgICAgfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU2VjdXJpdHlQZXJtaXNzaW9uIHByb3BlcnR5LCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbk9iaiA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJCXByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oU2VjdXJpdHlQZXJtaXNzaW9uIHByb3BlcnR5LGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlyZXR1cm4gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDogewotCQkJCSBFTGlzdCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKTsKLQkJCQkgaWYobG9jYWxpemVkRGVzY3JpcHRpb25zID09IG51bGwgfHwgbG9jYWxpemVkRGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKQotCQkJCSAJcmV0dXJuIG51bGw7Ci0JCQkgICAgIERlc2NyaXB0aW9uIGxvY2FsaXplZERlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxvY2FsaXplZERlc2NyaXB0aW9ucy5nZXQoMCk7Ci0JCQkgICAgIGlmKGxvY2FsaXplZERlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkgICAgIAlyZXR1cm4gbG9jYWxpemVkRGVzY3JpcHRpb24uZ2V0VmFsdWUoKTsKLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKExpY2Vuc2UgcHJvcGVydHksIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGpjYVZlcnNpb25JRCkgewotCQlzd2l0Y2goamNhVmVyc2lvbklEKSB7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ6IAotCQkgICAgCXByb3BlcnR5LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJICAgIAlicmVhazsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDogewotCQkgICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uT2JqID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKTsKLQkJCQlkZXNjcmlwdGlvbk9iai5zZXRWYWx1ZShkZXNjcmlwdGlvbik7Ci0JCQkJcHJvcGVydHkuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKGRlc2NyaXB0aW9uT2JqKTsKLQkJICAgIH0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihMaWNlbnNlIHByb3BlcnR5LGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlyZXR1cm4gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDogewotCQkJCSBFTGlzdCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbnMoKTsKLQkJCQkgaWYobG9jYWxpemVkRGVzY3JpcHRpb25zID09IG51bGwgfHwgbG9jYWxpemVkRGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKQotCQkJCSAJcmV0dXJuIG51bGw7Ci0JCQkgICAgIERlc2NyaXB0aW9uIGxvY2FsaXplZERlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxvY2FsaXplZERlc2NyaXB0aW9ucy5nZXQoMCk7Ci0JCQkgICAgIGlmKGxvY2FsaXplZERlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkgICAgIAlyZXR1cm4gbG9jYWxpemVkRGVzY3JpcHRpb24uZ2V0VmFsdWUoKTsKLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIHByb3BlcnR5LCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBqY2FWZXJzaW9uSUQpIHsKLQkJc3dpdGNoKGpjYVZlcnNpb25JRCkgewotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOiAKLQkJICAgIAlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6IHsKLQkJICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbk9iaiA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJCXByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oQXV0aGVudGljYXRpb25NZWNoYW5pc20gcHJvcGVydHksaW50IGpjYVZlcnNpb25JRCkgewotCQlzd2l0Y2goamNhVmVyc2lvbklEKSB7Ci0JCSAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ6IAotCQkgICAgCXJldHVybiBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotCQkgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOiB7Ci0JCQkJIEVMaXN0IGxvY2FsaXplZERlc2NyaXB0aW9ucyA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9ucygpOwotCQkJCSBpZihsb2NhbGl6ZWREZXNjcmlwdGlvbnMgPT0gbnVsbCB8fCBsb2NhbGl6ZWREZXNjcmlwdGlvbnMuc2l6ZSgpID09IDApCi0JCQkJIAlyZXR1cm4gbnVsbDsKLQkJCSAgICAgRGVzY3JpcHRpb24gbG9jYWxpemVkRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbG9jYWxpemVkRGVzY3JpcHRpb25zLmdldCgwKTsKLQkJCSAgICAgaWYobG9jYWxpemVkRGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCSAgICAgCXJldHVybiBsb2NhbGl6ZWREZXNjcmlwdGlvbi5nZXRWYWx1ZSgpOwotCQkgICAgfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgcHJvcGVydHksIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGpjYVZlcnNpb25JRCkgewotCQlpZihqY2FWZXJzaW9uSUQgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCkgewotCSAgICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJZGVzY3JpcHRpb25PYmouc2V0VmFsdWUoZGVzY3JpcHRpb24pOwotCQkJcHJvcGVydHkuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKGRlc2NyaXB0aW9uT2JqKTsKLQkgICAgfQotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSBwcm9wZXJ0eSxpbnQgamNhVmVyc2lvbklEKSB7Ci0JCWlmKGpjYVZlcnNpb25JRCA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEKSB7Ci0JCQkgRUxpc3QgbG9jYWxpemVkRGVzY3JpcHRpb25zID0gcHJvcGVydHkuZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQkgaWYobG9jYWxpemVkRGVzY3JpcHRpb25zID09IG51bGwgfHwgbG9jYWxpemVkRGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKQotCQkJIAlyZXR1cm4gbnVsbDsKLQkJICAgICBEZXNjcmlwdGlvbiBsb2NhbGl6ZWREZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsb2NhbGl6ZWREZXNjcmlwdGlvbnMuZ2V0KDApOwotCQkgICAgIGlmKGxvY2FsaXplZERlc2NyaXB0aW9uICE9IG51bGwpCi0JCSAgICAgCXJldHVybiBsb2NhbGl6ZWREZXNjcmlwdGlvbi5nZXRWYWx1ZSgpOwotCSAgICB9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjJiNDk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBKY2FBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBKY2FQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCXB1YmxpYyBKY2FBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSAoSmNhUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpdHlwZSkuZUNsYXNzKCkuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEpjYVN3aXRjaCBzdyA9IG5ldyBKY2FTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbm5lY3RvcihDb25uZWN0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29ubmVjdG9yQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxpY2Vuc2UoTGljZW5zZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVMaWNlbnNlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlQWRhcHRlcihSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5UGVybWlzc2lvbihTZWN1cml0eVBlcm1pc3Npb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbmZpZ1Byb3BlcnR5KENvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOyAvLyBzdwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGVHZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpjYVN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBKY2FTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3IoQ29ubmVjdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25maWdQcm9wZXJ0eShDb25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVBlcm1pc3Npb24oU2VjdXJpdHlQZXJtaXNzaW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMaWNlbnNlKExpY2Vuc2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUFkYXB0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0aW9uRGVmaW5pdGlvbihDb25uZWN0aW9uRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBZG1pbk9iamVjdChBZG1pbk9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWRtaW5PYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlTGlzdGVuZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uU3BlYyhBY3RpdmF0aW9uU3BlYyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvblNwZWNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZShSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyR2VuKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXJHZW4oKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyIDxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIDxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyIDxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24gPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdCA8ZW0+QWRtaW4gT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZG1pbk9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciA8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2YXRpb25TcGVjQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25maWdQcm9wZXJ0eUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0pjYUFkYXB0ZXJGYWN0b3J5Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3V0aWwvSmNhU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyMTFiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpjYVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKY2FQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmNhU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SOiB7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IChDb25uZWN0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbm5lY3Rvcihjb25uZWN0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGNvbm5lY3Rvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChjb25uZWN0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSOiB7Ci0JCQkJUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IChSZXNvdXJjZUFkYXB0ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlQWRhcHRlcihyZXNvdXJjZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU006IHsKLQkJCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9IChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXV0aGVudGljYXRpb25NZWNoYW5pc20oYXV0aGVudGljYXRpb25NZWNoYW5pc20pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFk6IHsKLQkJCQlDb25maWdQcm9wZXJ0eSBjb25maWdQcm9wZXJ0eSA9IChDb25maWdQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29uZmlnUHJvcGVydHkoY29uZmlnUHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OOiB7Ci0JCQkJU2VjdXJpdHlQZXJtaXNzaW9uIHNlY3VyaXR5UGVybWlzc2lvbiA9IChTZWN1cml0eVBlcm1pc3Npb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5UGVybWlzc2lvbihzZWN1cml0eVBlcm1pc3Npb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFOiB7Ci0JCQkJTGljZW5zZSBsaWNlbnNlID0gKExpY2Vuc2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxpY2Vuc2UobGljZW5zZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjogewotCQkJCUluYm91bmRSZXNvdXJjZUFkYXB0ZXIgaW5ib3VuZFJlc291cmNlQWRhcHRlciA9IChJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKGluYm91bmRSZXNvdXJjZUFkYXB0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOiB7Ci0JCQkJT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSAoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSOiB7Ci0JCQkJTWVzc2FnZUFkYXB0ZXIgbWVzc2FnZUFkYXB0ZXIgPSAoTWVzc2FnZUFkYXB0ZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1lc3NhZ2VBZGFwdGVyKG1lc3NhZ2VBZGFwdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OOiB7Ci0JCQkJQ29ubmVjdGlvbkRlZmluaXRpb24gY29ubmVjdGlvbkRlZmluaXRpb24gPSAoQ29ubmVjdGlvbkRlZmluaXRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbm5lY3Rpb25EZWZpbml0aW9uKGNvbm5lY3Rpb25EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUOiB7Ci0JCQkJQWRtaW5PYmplY3QgYWRtaW5PYmplY3QgPSAoQWRtaW5PYmplY3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFkbWluT2JqZWN0KGFkbWluT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUjogewotCQkJCU1lc3NhZ2VMaXN0ZW5lciBtZXNzYWdlTGlzdGVuZXIgPSAoTWVzc2FnZUxpc3RlbmVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlTGlzdGVuZXIobWVzc2FnZUxpc3RlbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDOiB7Ci0JCQkJQWN0aXZhdGlvblNwZWMgYWN0aXZhdGlvblNwZWMgPSAoQWN0aXZhdGlvblNwZWMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFjdGl2YXRpb25TcGVjKGFjdGl2YXRpb25TcGVjKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEU6IHsKLQkJCQlSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSByZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSA9IChSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUocmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25uZWN0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3IoQ29ubmVjdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXV0aGVudGljYXRpb25NZWNoYW5pc20oQXV0aGVudGljYXRpb25NZWNoYW5pc20gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb25maWdQcm9wZXJ0eShDb25maWdQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlQZXJtaXNzaW9uKFNlY3VyaXR5UGVybWlzc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpY2Vuc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGljZW5zZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTGljZW5zZShMaWNlbnNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5ib3VuZFJlc291cmNlQWRhcHRlcihJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VBZGFwdGVyKE1lc3NhZ2VBZGFwdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdGlvbkRlZmluaXRpb24oQ29ubmVjdGlvbkRlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRtaW4gT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBZG1pbk9iamVjdChBZG1pbk9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZUxpc3RlbmVyKE1lc3NhZ2VMaXN0ZW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25TcGVjKEFjdGl2YXRpb25TcGVjIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0pjYVN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg4OTdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSBjb25uZWN0b3IgbW9kdWxlIG1vZGVsIGFwaS4gVXNpbmcgdGhpcyBhcGkgdGhlIGFydGlmYWN0cyBvZiBhbiBjb25uZWN0b3IgYXBwCi0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9KU1BDb25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9KU1BDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhMjAzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSlNQQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KU1AgQ29uZmlnPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgotICogaW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcwotICogdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnI2dldFRhZ0xpYnMgPGVtPlRhZyBMaWJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnI2dldFByb3BlcnR5R3JvdXBzIDxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUENvbmZpZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKU1BDb25maWcgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhZyBMaWJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFnIExpYnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWcgTGliczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldEpTUENvbmZpZ19UYWdMaWJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUYWdMaWJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0eSBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb3BlcnR5R3JvdXBzKCk7Ci0KLX0gLy8gSlNQQ29uZmlnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSlNQUHJvcGVydHlHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL0pTUFByb3BlcnR5R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2NTBlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSlNQUHJvcGVydHlHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SlNQIFByb3BlcnR5IEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNAotICogVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotICogZmlsZXMgc28gdGhleSBjYW4gYmUgZ2l2ZW4gZ2xvYmFsIHByb3BlcnR5IGluZm9ybWF0aW9uLgotICogQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gVGhlCi0gKiBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBkZXNjcmliZWQ6Ci0gKiAKLSAqIC0gQ29udHJvbCBlbmFibGluZyBvZiBFTCBldmFsdWF0aW9uLiAtIENvbnRyb2wgZW5hYmxpbmcKLSAqIG9mIFNjcmlwdGluZyBlbGVtZW50cy4gLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcKLSAqIGluZm9ybWF0aW9uLiAtIEluZGljYXRpbmcgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQCi0gKiBkb2N1bWVudCAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldFVybFBhdHRlcm4gPGVtPlVybCBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0VsSWdub3JlZCA8ZW0+RWwgSWdub3JlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0UGFnZUVuY29kaW5nIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0lzWE1MIDxlbT5JcyBYTUw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVQcmVsdWRlcyA8ZW0+SW5jbHVkZSBQcmVsdWRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZUNvZGFzIDxlbT5JbmNsdWRlIENvZGFzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFByb3BlcnR5R3JvdXAgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmwgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+Ci0JICogVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotCSAqIAlwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0JICogCVdlYiBBcHBsaWNhdGlvbi4gV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAqIAl0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQKLQkgKiAJKGFzIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLQkgKiAJSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGUgQ29kYXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZSNnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEluY2x1ZGVDb2RhcygpOwotCi19IC8vIEpTUFByb3BlcnR5R3JvdXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9Kc3BGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSnNwRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQzMTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9Kc3BGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnNwRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSnNwRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SlNQIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SlNQIENvbmZpZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSlNQQ29uZmlnIGNyZWF0ZUpTUENvbmZpZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpTUCBQcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSlNQUHJvcGVydHlHcm91cCBjcmVhdGVKU1BQcm9wZXJ0eUdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhZyBMaWIgUmVmIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhZyBMaWIgUmVmIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhZ0xpYlJlZlR5cGUgY3JlYXRlVGFnTGliUmVmVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKc3BQYWNrYWdlIGdldEpzcFBhY2thZ2UoKTsKLQotfSAvL0pzcEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9Kc3BQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvSnNwUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlmZjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9Kc3BQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpzcFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJqc3AiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAianNwLnhtaSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuanNwIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BDb25maWdJbXBsIDxlbT5KU1AgQ29uZmlnPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQQ29uZmlnSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0SlNQQ29uZmlnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpTUF9DT05GSUcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhZyBMaWJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfQ09ORklHX19UQUdfTElCUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHkgR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFMgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KU1AgQ29uZmlnPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpTUFByb3BlcnR5R3JvdXBJbXBsIDxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5KU1BQcm9wZXJ0eUdyb3VwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwjZ2V0SlNQUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNtYWxsIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk4gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWwgSWdub3JlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWdlIEVuY29kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjcmlwdGluZyBJbnZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBYTUw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlIFByZWx1ZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZSBDb2RhczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KU1AgUHJvcGVydHkgR3JvdXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZlR5cGVJbXBsIDxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliUmVmVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsI2dldFRhZ0xpYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9SRUZfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnbGliIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkkgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9MT0NBVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRhZyBMaWIgUmVmIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9SRUZfVFlQRV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZyA8ZW0+SlNQIENvbmZpZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KU1AgQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SlNQQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZyNnZXRUYWdMaWJzIDxlbT5UYWcgTGliczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFnIExpYnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnI2dldFRhZ0xpYnMoKQotCSAqIEBzZWUgI2dldEpTUENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQQ29uZmlnX1RhZ0xpYnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnI2dldFByb3BlcnR5R3JvdXBzIDxlbT5Qcm9wZXJ0eSBHcm91cHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnR5IEdyb3VwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcjZ2V0UHJvcGVydHlHcm91cHMoKQotCSAqIEBzZWUgI2dldEpTUENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCA8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkpTUCBQcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKU1BQcm9wZXJ0eUdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0VXJsUGF0dGVybiA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlVybCBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0VXJsUGF0dGVybigpCi0JICogQHNlZSAjZ2V0SlNQUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkIDxlbT5FbCBJZ25vcmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWwgSWdub3JlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2lzRWxJZ25vcmVkKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNnZXRQYWdlRW5jb2RpbmcgPGVtPlBhZ2UgRW5jb2Rpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWdlIEVuY29kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0UGFnZUVuY29kaW5nKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQgPGVtPlNjcmlwdGluZyBJbnZhbGlkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc1NjcmlwdGluZ0ludmFsaWQoKQotCSAqIEBzZWUgI2dldEpTUFByb3BlcnR5R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0lzWE1MIDxlbT5JcyBYTUw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBYTUw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCNpc0lzWE1MKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0lzWE1MKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZVByZWx1ZGVzIDxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXAjZ2V0SW5jbHVkZVByZWx1ZGVzKCkKLQkgKiBAc2VlICNnZXRKU1BQcm9wZXJ0eUdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVDb2RhcyA8ZW0+SW5jbHVkZSBDb2RhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW5jbHVkZSBDb2RhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwI2dldEluY2x1ZGVDb2RhcygpCi0JICogQHNlZSAjZ2V0SlNQUHJvcGVydHlHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlIDxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhZyBMaWIgUmVmIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFnTGliUmVmVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJVUkkgPGVtPlRhZ2xpYiBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYWdsaWIgVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUjZ2V0VGFnbGliVVJJKCkKLQkgKiBAc2VlICNnZXRUYWdMaWJSZWZUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYlVSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJMb2NhdGlvbiA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldFRhZ0xpYlJlZlR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUpzcEZhY3RvcnkgZ2V0SnNwRmFjdG9yeSgpOwotCi19IC8vSnNwUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL1RhZ0xpYlJlZlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9UYWdMaWJSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjA2MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL1RhZ0xpYlJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhZyBMaWIgUmVmIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBBIHRhZ2xpYiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIGEgdGFnCi0gKiBsaWJyYXJ5IHRoYXQgaXMgdXNlZCBieSBhIEpTUCBwYWdlIHdpdGhpbiB0aGUgV2ViCi0gKiBBcHBsaWNhdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZSNnZXRUYWdsaWJVUkkgPGVtPlRhZ2xpYiBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlI2dldFRhZ2xpYkxvY2F0aW9uIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldFRhZ0xpYlJlZlR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnTGliUmVmVHlwZSBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnbGliIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFnbGliIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEKLQkgKiAgICAgICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0JICogICAgICAgICBvZiB0aGUgdGFnbGliLXVyaSBlbGVtZW50IG1heSBiZSBlaXRoZXIgYW4KLQkgKiAgICAgICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4KLQkgKiAgICAgICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLQkgKiAgICAgICAgIHNhbWUgdGFnbGliLXVyaSB2YWx1ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFnbGliVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2dldFRhZ0xpYlJlZlR5cGVfVGFnbGliVVJJKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhZ2xpYlVSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUjZ2V0VGFnbGliVVJJIDxlbT5UYWdsaWIgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWdsaWIgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWdsaWJVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhZ2xpYlVSSShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnbGliIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWdsaWIgTG9jYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotCSAqICAgICAgICAgKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgotCSAqICAgICAgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0JICogICAgICAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFnbGliTG9jYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2UjZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJMb2NhdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYWdsaWJMb2NhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGUjZ2V0VGFnbGliTG9jYXRpb24gPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWdsaWJMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFnbGliTG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBUYWdMaWJSZWZUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BDb25maWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BDb25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzE2NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSlNQQ29uZmlnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SlNQIENvbmZpZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQQ29uZmlnSW1wbCNnZXRUYWdMaWJzIDxlbT5UYWcgTGliczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSlNQQ29uZmlnSW1wbCNnZXRQcm9wZXJ0eUdyb3VwcyA8ZW0+UHJvcGVydHkgR3JvdXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29uZmlnSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSlNQQ29uZmlnIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdMaWJzKCkgPGVtPlRhZyBMaWJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ0xpYnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YWdMaWJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5R3JvdXBzKCkgPGVtPlByb3BlcnR5IEdyb3VwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0eUdyb3VwcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb3BlcnR5R3JvdXBzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBKU1BDb25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQQ29uZmlnKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRhZ0xpYnMoKSB7Ci0JCWlmICh0YWdMaWJzID09IG51bGwpIHsKLQkJCXRhZ0xpYnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGFnTGliUmVmVHlwZS5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUyk7Ci0JCX0KLQkJcmV0dXJuIHRhZ0xpYnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFByb3BlcnR5R3JvdXBzKCkgewotCQlpZiAocHJvcGVydHlHcm91cHMgPT0gbnVsbCkgewotCQkJcHJvcGVydHlHcm91cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSlNQUHJvcGVydHlHcm91cC5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eUdyb3VwczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFnTGlicygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcm9wZXJ0eUdyb3VwcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuIGdldFRhZ0xpYnMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnR5R3JvdXBzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgotCQkJCWdldFRhZ0xpYnMoKS5jbGVhcigpOwotCQkJCWdldFRhZ0xpYnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFM6Ci0JCQkJZ2V0UHJvcGVydHlHcm91cHMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnR5R3JvdXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgotCQkJCWdldFRhZ0xpYnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19QUk9QRVJUWV9HUk9VUFM6Ci0JCQkJZ2V0UHJvcGVydHlHcm91cHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgotCQkJCXJldHVybiB0YWdMaWJzICE9IG51bGwgJiYgIXRhZ0xpYnMuaXNFbXB0eSgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1BST1BFUlRZX0dST1VQUzoKLQkJCQlyZXR1cm4gcHJvcGVydHlHcm91cHMgIT0gbnVsbCAmJiAhcHJvcGVydHlHcm91cHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9KU1BDb25maWdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BQcm9wZXJ0eUdyb3VwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSlNQUHJvcGVydHlHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyZDIzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BQcm9wZXJ0eUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZVByZWx1ZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jbHVkZVByZWx1ZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVDb2RhcygpIDxlbT5JbmNsdWRlIENvZGFzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVDb2RhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluY2x1ZGVDb2RhcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSlNQUHJvcGVydHlHcm91cEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BQcm9wZXJ0eUdyb3VwKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFVybFBhdHRlcm4oKSB7Ci0JCWlmICh1cmxQYXR0ZXJuID09IG51bGwpIHsKLQkJCXVybFBhdHRlcm4gPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk4pOwotCQl9Ci0JCXJldHVybiB1cmxQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWxJZ25vcmVkKCkgewotCQlyZXR1cm4gZWxJZ25vcmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsSWdub3JlZChib29sZWFuIG5ld0VsSWdub3JlZCkgewotCQlib29sZWFuIG9sZEVsSWdub3JlZCA9IGVsSWdub3JlZDsKLQkJZWxJZ25vcmVkID0gbmV3RWxJZ25vcmVkOwotCQlib29sZWFuIG9sZEVsSWdub3JlZEVTZXQgPSBlbElnbm9yZWRFU2V0OwotCQllbElnbm9yZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQsIG9sZEVsSWdub3JlZCwgZWxJZ25vcmVkLCAhb2xkRWxJZ25vcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWxJZ25vcmVkKCkgewotCQlib29sZWFuIG9sZEVsSWdub3JlZCA9IGVsSWdub3JlZDsKLQkJYm9vbGVhbiBvbGRFbElnbm9yZWRFU2V0ID0gZWxJZ25vcmVkRVNldDsKLQkJZWxJZ25vcmVkID0gRUxfSUdOT1JFRF9FREVGQVVMVDsKLQkJZWxJZ25vcmVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVELCBvbGRFbElnbm9yZWQsIEVMX0lHTk9SRURfRURFRkFVTFQsIG9sZEVsSWdub3JlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVsSWdub3JlZCgpIHsKLQkJcmV0dXJuIGVsSWdub3JlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlRW5jb2RpbmcoKSB7Ci0JCXJldHVybiBwYWdlRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUVuY29kaW5nKFN0cmluZyBuZXdQYWdlRW5jb2RpbmcpIHsKLQkJU3RyaW5nIG9sZFBhZ2VFbmNvZGluZyA9IHBhZ2VFbmNvZGluZzsKLQkJcGFnZUVuY29kaW5nID0gbmV3UGFnZUVuY29kaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORywgb2xkUGFnZUVuY29kaW5nLCBwYWdlRW5jb2RpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCXJldHVybiBzY3JpcHRpbmdJbnZhbGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjcmlwdGluZ0ludmFsaWQoYm9vbGVhbiBuZXdTY3JpcHRpbmdJbnZhbGlkKSB7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZCA9IHNjcmlwdGluZ0ludmFsaWQ7Ci0JCXNjcmlwdGluZ0ludmFsaWQgPSBuZXdTY3JpcHRpbmdJbnZhbGlkOwotCQlib29sZWFuIG9sZFNjcmlwdGluZ0ludmFsaWRFU2V0ID0gc2NyaXB0aW5nSW52YWxpZEVTZXQ7Ci0JCXNjcmlwdGluZ0ludmFsaWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElELCBvbGRTY3JpcHRpbmdJbnZhbGlkLCBzY3JpcHRpbmdJbnZhbGlkLCAhb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNjcmlwdGluZ0ludmFsaWQoKSB7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZCA9IHNjcmlwdGluZ0ludmFsaWQ7Ci0JCWJvb2xlYW4gb2xkU2NyaXB0aW5nSW52YWxpZEVTZXQgPSBzY3JpcHRpbmdJbnZhbGlkRVNldDsKLQkJc2NyaXB0aW5nSW52YWxpZCA9IFNDUklQVElOR19JTlZBTElEX0VERUZBVUxUOwotCQlzY3JpcHRpbmdJbnZhbGlkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRCwgb2xkU2NyaXB0aW5nSW52YWxpZCwgU0NSSVBUSU5HX0lOVkFMSURfRURFRkFVTFQsIG9sZFNjcmlwdGluZ0ludmFsaWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTY3JpcHRpbmdJbnZhbGlkKCkgewotCQlyZXR1cm4gc2NyaXB0aW5nSW52YWxpZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1hNTCgpIHsKLQkJcmV0dXJuIGlzWE1MOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzWE1MKGJvb2xlYW4gbmV3SXNYTUwpIHsKLQkJYm9vbGVhbiBvbGRJc1hNTCA9IGlzWE1MOwotCQlpc1hNTCA9IG5ld0lzWE1MOwotCQlib29sZWFuIG9sZElzWE1MRVNldCA9IGlzWE1MRVNldDsKLQkJaXNYTUxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTCwgb2xkSXNYTUwsIGlzWE1MLCAhb2xkSXNYTUxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1hNTCgpIHsKLQkJYm9vbGVhbiBvbGRJc1hNTCA9IGlzWE1MOwotCQlib29sZWFuIG9sZElzWE1MRVNldCA9IGlzWE1MRVNldDsKLQkJaXNYTUwgPSBJU19YTUxfRURFRkFVTFQ7Ci0JCWlzWE1MRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUwsIG9sZElzWE1MLCBJU19YTUxfRURFRkFVTFQsIG9sZElzWE1MRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNYTUwoKSB7Ci0JCXJldHVybiBpc1hNTEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluY2x1ZGVQcmVsdWRlcygpIHsKLQkJaWYgKGluY2x1ZGVQcmVsdWRlcyA9PSBudWxsKSB7Ci0JCQlpbmNsdWRlUHJlbHVkZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUyk7Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVQcmVsdWRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5jbHVkZUNvZGFzKCkgewotCQlpZiAoaW5jbHVkZUNvZGFzID09IG51bGwpIHsKLQkJCWluY2x1ZGVDb2RhcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZUNvZGFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lcygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0TGFyZ2VJY29uKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOOgotCQkJCXJldHVybiBnZXRVcmxQYXR0ZXJuKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEOgotCQkJCXJldHVybiBpc0VsSWdub3JlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIGdldFBhZ2VFbmNvZGluZygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJcmV0dXJuIGlzU2NyaXB0aW5nSW52YWxpZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTDoKLQkJCQlyZXR1cm4gaXNJc1hNTCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6Ci0JCQkJcmV0dXJuIGdldEluY2x1ZGVQcmVsdWRlcygpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZUNvZGFzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTjoKLQkJCQlnZXRVcmxQYXR0ZXJuKCkuY2xlYXIoKTsKLQkJCQlnZXRVcmxQYXR0ZXJuKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEOgotCQkJCXNldEVsSWdub3JlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HOgotCQkJCXNldFBhZ2VFbmNvZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TQ1JJUFRJTkdfSU5WQUxJRDoKLQkJCQlzZXRTY3JpcHRpbmdJbnZhbGlkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTDoKLQkJCQlzZXRJc1hNTCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTOgotCQkJCWdldEluY2x1ZGVQcmVsdWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5jbHVkZVByZWx1ZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTOgotCQkJCWdldEluY2x1ZGVDb2RhcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5jbHVkZUNvZGFzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk46Ci0JCQkJZ2V0VXJsUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRUxfSUdOT1JFRDoKLQkJCQl1bnNldEVsSWdub3JlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6Ci0JCQkJc2V0UGFnZUVuY29kaW5nKFBBR0VfRU5DT0RJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1NDUklQVElOR19JTlZBTElEOgotCQkJCXVuc2V0U2NyaXB0aW5nSW52YWxpZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lTX1hNTDoKLQkJCQl1bnNldElzWE1MKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUzoKLQkJCQlnZXRJbmNsdWRlUHJlbHVkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVM6Ci0JCQkJZ2V0SW5jbHVkZUNvZGFzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gdXJsUGF0dGVybiAhPSBudWxsICYmICF1cmxQYXR0ZXJuLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0RWxJZ25vcmVkKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19QQUdFX0VOQ09ESU5HOgotCQkJCXJldHVybiBQQUdFX0VOQ09ESU5HX0VERUZBVUxUID09IG51bGwgPyBwYWdlRW5jb2RpbmcgIT0gbnVsbCA6ICFQQUdFX0VOQ09ESU5HX0VERUZBVUxULmVxdWFscyhwYWdlRW5jb2RpbmcpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJcmV0dXJuIGlzU2V0U2NyaXB0aW5nSW52YWxpZCgpOwotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MOgotCQkJCXJldHVybiBpc1NldElzWE1MKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX1BSRUxVREVTOgotCQkJCXJldHVybiBpbmNsdWRlUHJlbHVkZXMgIT0gbnVsbCAmJiAhaW5jbHVkZVByZWx1ZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVM6Ci0JCQkJcmV0dXJuIGluY2x1ZGVDb2RhcyAhPSBudWxsICYmICFpbmNsdWRlQ29kYXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJsUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWxJZ25vcmVkOiAiKTsKLQkJaWYgKGVsSWdub3JlZEVTZXQpIHJlc3VsdC5hcHBlbmQoZWxJZ25vcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFnZUVuY29kaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYWdlRW5jb2RpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjcmlwdGluZ0ludmFsaWQ6ICIpOwotCQlpZiAoc2NyaXB0aW5nSW52YWxpZEVTZXQpIHJlc3VsdC5hcHBlbmQoc2NyaXB0aW5nSW52YWxpZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzWE1MOiAiKTsKLQkJaWYgKGlzWE1MRVNldCkgcmVzdWx0LmFwcGVuZChpc1hNTCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluY2x1ZGVQcmVsdWRlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5jbHVkZVByZWx1ZGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbmNsdWRlQ29kYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluY2x1ZGVDb2Rhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0pTUFByb3BlcnR5R3JvdXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1ZDZjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKc3BGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUc6IHJldHVybiBjcmVhdGVKU1BDb25maWcoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVA6IHJldHVybiBjcmVhdGVKU1BQcm9wZXJ0eUdyb3VwKCk7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRTogcmV0dXJuIGNyZWF0ZVRhZ0xpYlJlZlR5cGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKU1BDb25maWcgY3JlYXRlSlNQQ29uZmlnKCkgewotCQlKU1BDb25maWdJbXBsIGpzcENvbmZpZyA9IG5ldyBKU1BDb25maWdJbXBsKCk7Ci0JCXJldHVybiBqc3BDb25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpTUFByb3BlcnR5R3JvdXAgY3JlYXRlSlNQUHJvcGVydHlHcm91cCgpIHsKLQkJSlNQUHJvcGVydHlHcm91cEltcGwganNwUHJvcGVydHlHcm91cCA9IG5ldyBKU1BQcm9wZXJ0eUdyb3VwSW1wbCgpOwotCQlyZXR1cm4ganNwUHJvcGVydHlHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFnTGliUmVmVHlwZSBjcmVhdGVUYWdMaWJSZWZUeXBlKCkgewotCQlUYWdMaWJSZWZUeXBlSW1wbCB0YWdMaWJSZWZUeXBlID0gbmV3IFRhZ0xpYlJlZlR5cGVJbXBsKCk7Ci0JCXJldHVybiB0YWdMaWJSZWZUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKc3BQYWNrYWdlIGdldEpzcFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSnNwUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKc3BQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBKc3BQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Kc3BGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjgyNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKc3BQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqc3BDb25maWdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MganNwUHJvcGVydHlHcm91cEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YWdMaWJSZWZUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBKc3BQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSnNwRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKc3BQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKc3BQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgSnNwUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2VJbXBsLmluaXQoKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSnNwUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlSnNwUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEpTUENvbmZpZygpIHsKLQkJcmV0dXJuIGpzcENvbmZpZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BDb25maWdfVGFnTGlicygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcENvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUENvbmZpZ19Qcm9wZXJ0eUdyb3VwcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcENvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SlNQUHJvcGVydHlHcm91cCgpIHsKLQkJcmV0dXJuIGpzcFByb3BlcnR5R3JvdXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BQcm9wZXJ0eUdyb3VwX0lzWE1MKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZUNvZGFzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFnTGliUmVmVHlwZSgpIHsKLQkJcmV0dXJuIHRhZ0xpYlJlZlR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJVUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJSZWZUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0xpYlJlZlR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwRmFjdG9yeSBnZXRKc3BGYWN0b3J5KCkgewotCQlyZXR1cm4gKEpzcEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJanNwQ29uZmlnRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpTUF9DT05GSUcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcENvbmZpZ0VDbGFzcywgSlNQX0NPTkZJR19fVEFHX0xJQlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcENvbmZpZ0VDbGFzcywgSlNQX0NPTkZJR19fUFJPUEVSVFlfR1JPVVBTKTsKLQotCQlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpTUF9QUk9QRVJUWV9HUk9VUCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fSVNfWE1MKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUyk7Ci0KLQkJdGFnTGliUmVmVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUdfTElCX1JFRl9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJSZWZUeXBlRUNsYXNzLCBUQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJSZWZUeXBlRUNsYXNzLCBUQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT04pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhqc3BDb25maWdFQ2xhc3MsIEpTUENvbmZpZy5jbGFzcywgIkpTUENvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQQ29uZmlnX1RhZ0xpYnMoKSwgdGhpcy5nZXRUYWdMaWJSZWZUeXBlKCksIG51bGwsICJ0YWdMaWJzIiwgbnVsbCwgMCwgLTEsIEpTUENvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQQ29uZmlnX1Byb3BlcnR5R3JvdXBzKCksIHRoaXMuZ2V0SlNQUHJvcGVydHlHcm91cCgpLCBudWxsLCAicHJvcGVydHlHcm91cHMiLCBudWxsLCAwLCAtMSwgSlNQQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIkpTUFByb3BlcnR5R3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDAsIC0xLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX0VsSWdub3JlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImVsSWdub3JlZCIsICJ0cnVlIiwgMCwgMSwgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFnZUVuY29kaW5nIiwgbnVsbCwgMCwgMSwgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic2NyaXB0aW5nSW52YWxpZCIsICJ0cnVlIiwgMCwgMSwgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX0lzWE1MKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNYTUwiLCAiZmFsc2UiLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbmNsdWRlUHJlbHVkZXMiLCBudWxsLCAwLCAtMSwgSlNQUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImluY2x1ZGVDb2RhcyIsIG51bGwsIDAsIC0xLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGFnTGliUmVmVHlwZUVDbGFzcywgVGFnTGliUmVmVHlwZS5jbGFzcywgIlRhZ0xpYlJlZlR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJVUkkiLCBudWxsLCAwLCAxLCBUYWdMaWJSZWZUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYkxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJMb2NhdGlvbiIsIG51bGwsIDAsIDEsIFRhZ0xpYlJlZlR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL0pzcFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvVGFnTGliUmVmVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4MDZlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhZyBMaWIgUmVmIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLlRhZ0xpYlJlZlR5cGVJbXBsI2dldFRhZ2xpYlVSSSA8ZW0+VGFnbGliIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuVGFnTGliUmVmVHlwZUltcGwjZ2V0VGFnbGliTG9jYXRpb24gPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhZ0xpYlJlZlR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYWdMaWJSZWZUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliVVJJKCkgPGVtPlRhZ2xpYiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYlVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHTElCX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJVUkkoKSA8ZW0+VGFnbGliIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhZ2xpYlVSSSA9IFRBR0xJQl9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnbGliTG9jYXRpb24oKSA8ZW0+VGFnbGliIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYkxvY2F0aW9uKCkgPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFnbGliTG9jYXRpb24gPSBUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFnTGliUmVmVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYWdMaWJSZWZUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdsaWJVUkkoKSB7Ci0JCXJldHVybiB0YWdsaWJVUkk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFnbGliVVJJKFN0cmluZyBuZXdUYWdsaWJVUkkpIHsKLQkJU3RyaW5nIG9sZFRhZ2xpYlVSSSA9IHRhZ2xpYlVSSTsKLQkJdGFnbGliVVJJID0gbmV3VGFnbGliVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkksIG9sZFRhZ2xpYlVSSSwgdGFnbGliVVJJKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdsaWJMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHRhZ2xpYkxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2xpYkxvY2F0aW9uKFN0cmluZyBuZXdUYWdsaWJMb2NhdGlvbikgewotCQlTdHJpbmcgb2xkVGFnbGliTG9jYXRpb24gPSB0YWdsaWJMb2NhdGlvbjsKLQkJdGFnbGliTG9jYXRpb24gPSBuZXdUYWdsaWJMb2NhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT04sIG9sZFRhZ2xpYkxvY2F0aW9uLCB0YWdsaWJMb2NhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJOgotCQkJCXJldHVybiBnZXRUYWdsaWJVUkkoKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFRhZ2xpYkxvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkk6Ci0JCQkJc2V0VGFnbGliVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJc2V0VGFnbGliTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJOgotCQkJCXNldFRhZ2xpYlVSSShUQUdMSUJfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXNldFRhZ2xpYkxvY2F0aW9uKFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX1VSSToKLQkJCQlyZXR1cm4gVEFHTElCX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdGFnbGliVVJJICE9IG51bGwgOiAhVEFHTElCX1VSSV9FREVGQVVMVC5lcXVhbHModGFnbGliVVJJKTsKLQkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJcmV0dXJuIFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gdGFnbGliTG9jYXRpb24gIT0gbnVsbCA6ICFUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKHRhZ2xpYkxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRhZ2xpYlVSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFnbGliVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWdsaWJMb2NhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFnbGliTG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYWdMaWJSZWZUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2YxMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSnNwQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKc3BQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSnNwQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSnNwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSnNwU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEpzcFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUENvbmZpZyhKU1BDb25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpTUENvbmZpZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFByb3BlcnR5R3JvdXAoSlNQUHJvcGVydHlHcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSlNQUHJvcGVydHlHcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYlJlZlR5cGUoVGFnTGliUmVmVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFnTGliUmVmVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnIDxlbT5KU1AgQ29uZmlnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQQ29uZmlnQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cCA8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpTUFByb3BlcnR5R3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlIDxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZlR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0pzcEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQ2NWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSnNwUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpzcFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBKc3BQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUc6IHsKLQkJCQlKU1BDb25maWcganNwQ29uZmlnID0gKEpTUENvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSlNQQ29uZmlnKGpzcENvbmZpZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUDogewotCQkJCUpTUFByb3BlcnR5R3JvdXAganNwUHJvcGVydHlHcm91cCA9IChKU1BQcm9wZXJ0eUdyb3VwKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BQcm9wZXJ0eUdyb3VwKGpzcFByb3BlcnR5R3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGpzcFByb3BlcnR5R3JvdXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoanNwUHJvcGVydHlHcm91cCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEU6IHsKLQkJCQlUYWdMaWJSZWZUeXBlIHRhZ0xpYlJlZlR5cGUgPSAoVGFnTGliUmVmVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFnTGliUmVmVHlwZSh0YWdMaWJSZWZUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SlNQIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KU1AgQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BDb25maWcoSlNQQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SlNQIFByb3BlcnR5IEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpTUCBQcm9wZXJ0eSBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSlNQUHJvcGVydHlHcm91cChKU1BQcm9wZXJ0eUdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFnIExpYiBSZWYgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWcgTGliIFJlZiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWJSZWZUeXBlKFRhZ0xpYlJlZlR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSnNwU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZmFhODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPkVKQiBBcnRpZmFjdCBFZGl0IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgdGhlIEpTUCBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYSBKU1AgYW5kIFRhZ0xpYiByZWYKLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0JvZHlDb250ZW50VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0JvZHlDb250ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzIzOGY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9Cb2R5Q29udGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQm9keUNvbnRlbnRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR0RFUEVOREVOVCA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSlNQID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTVBUWSA9IDI7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2NyaXB0bGVzczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NDUklQVExFU1NfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJzY3JpcHRsZXNzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUklQVExFU1MgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VGFnZGVwZW5kZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VGFnZGVwZW5kZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RBR0RFUEVOREVOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9keUNvbnRlbnRUeXBlIFRBR0RFUEVOREVOVF9MSVRFUkFMID0gbmV3IEJvZHlDb250ZW50VHlwZShUQUdERVBFTkRFTlQsICJ0YWdkZXBlbmRlbnQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KU1A8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KU1A8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSlNQCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb2R5Q29udGVudFR5cGUgSlNQX0xJVEVSQUwgPSBuZXcgQm9keUNvbnRlbnRUeXBlKEpTUCwgIkpTUCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVtcHR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RW1wdHk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRU1QVFkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBFTVBUWV9MSVRFUkFMID0gbmV3IEJvZHlDb250ZW50VHlwZShFTVBUWSwgImVtcHR5Iik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2NyaXB0bGVzczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNjcmlwdGxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0NSSVBUTEVTUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9keUNvbnRlbnRUeXBlIFNDUklQVExFU1NfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoU0NSSVBUTEVTUywgInNjcmlwdGxlc3MiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Qm9keSBDb250ZW50IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBCb2R5Q29udGVudFR5cGVbXSB7Ci0JCQlUQUdERVBFTkRFTlRfTElURVJBTCwKLQkJCUpTUF9MSVRFUkFMLAotCQkJRU1QVFlfTElURVJBTCwKLQkJCVNDUklQVExFU1NfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Cb2R5IENvbnRlbnQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Qm9keSBDb250ZW50IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCb2R5Q29udGVudFR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlCb2R5Q29udGVudFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Cb2R5IENvbnRlbnQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCb2R5Q29udGVudFR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFRBR0RFUEVOREVOVDogcmV0dXJuIFRBR0RFUEVOREVOVF9MSVRFUkFMOwotCQkJY2FzZSBKU1A6IHJldHVybiBKU1BfTElURVJBTDsKLQkJCWNhc2UgRU1QVFk6IHJldHVybiBFTVBUWV9MSVRFUkFMOwotCQkJY2FzZSBTQ1JJUFRMRVNTOiByZXR1cm4gU0NSSVBUTEVTU19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBCb2R5Q29udGVudFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vQm9keUNvbnRlbnRUeXBlCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvRXh0ZW5zaWJsZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9FeHRlbnNpYmxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDgwM2JiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9FeHRlbnNpYmxlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmxlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2UjZ2V0RXh0ZW5zaWJsZVR5cGUoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2libGVUeXBlIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlI2dldEV4dGVuc2libGVUeXBlX1ZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5zaWJsZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9GdW5jdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0Z1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOThmNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0Z1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RnVuY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBAdmVyc2lvbiBKMkVFMS40Ci0gKiBUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaAotICogZnVuY3Rpb24gaW4gdGhlIHRhZyBsaWJyYXJ5IHRoYXQgaXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgRUwuCi0gKiAKLSAqIFRoZSBmdW5jdGlvbiBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6Ci0gKiAKLSAqIGRlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0gKiAKLSAqIGRpc3BsYXktbmFtZSAgICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLSAqICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIGJ5IHRvb2xzCi0gKiAKLSAqIGljb24gICAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLSAqICAgICAgICAgICAgICAgICAgICAgYnkgdG9vbHMKLSAqIAotICogbmFtZSAgICAgICAgICAgICAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAKLSAqIGZ1bmN0aW9uLWNsYXNzICAgICAgUHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotICogICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbgotICogCi0gKiBmdW5jdGlvbi1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhCi0gKiAgICAgICAgICAgICAgICAgICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIG9mIHRoZSBKYXZhCi0gKiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbi4KLSAqIAotICogZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotICogICAgICAgICAgICAgICAgICAgICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgZnVuY3Rpb24KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldFNpZ25hdHVyZSA8ZW0+U2lnbmF0dXJlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEZ1bmN0aW9uQ2xhc3MgPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RnVuY3Rpb25FeHRlbnNpb25zIDxlbT5GdW5jdGlvbiBFeHRlbnNpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRGdW5jdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGdW5jdGlvbiBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlI2dldEZ1bmN0aW9uX05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpZ25hdHVyZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2lnbmF0dXJlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhIExhbmd1YWdlCi0JICogICAgICAgICBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgc3RhdGljIEphdmEgbWV0aG9kIHRoYXQgaXMKLQkgKiAgICAgICAgIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbi4KLQkgKiAKLQkgKiAgICAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pY2tOYW1lKCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQgKQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaWduYXR1cmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNpZ25hdHVyZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRGdW5jdGlvbl9TaWduYXR1cmUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0U2lnbmF0dXJlIDxlbT5TaWduYXR1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpZ25hdHVyZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2lnbmF0dXJlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4YW1wbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2UjZ2V0RnVuY3Rpb25fRXhhbXBsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24jZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhhbXBsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnVuY3Rpb24gQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YQotCSAqICAgICAgICAgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMKLQkgKiAgICAgICAgIHRoZSBmdW5jdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnVuY3Rpb24gQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEZ1bmN0aW9uQ2xhc3MoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2UjZ2V0RnVuY3Rpb25fRnVuY3Rpb25DbGFzcygpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RnVuY3Rpb25DbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEZ1bmN0aW9uQ2xhc3MgPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GdW5jdGlvbiBDbGFzczwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RnVuY3Rpb25DbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnVuY3Rpb25DbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnVuY3Rpb24gRXh0ZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnVuY3Rpb24gRXh0ZW5zaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZ1bmN0aW9uIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCk7Ci0KLX0gLy8gRnVuY3Rpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYzZDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVTVEVEID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVF9CRUdJTiA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRfRU5EID0gMjsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ORVNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ORVNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkVTVEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIE5FU1RFRF9MSVRFUkFMID0gbmV3IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoTkVTVEVELCAiTkVTVEVEIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVQgQkVHSU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BVCBCRUdJTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVF9CRUdJTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBBVF9CRUdJTl9MSVRFUkFMID0gbmV3IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoQVRfQkVHSU4sICJBVF9CRUdJTiIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFUIEVORDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFUIEVORDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVF9FTkQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgQVRfRU5EX0xJVEVSQUwgPSBuZXcgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZShBVF9FTkQsICJBVF9FTkQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SlNQIFNjcmlwdGluZyBWYXJpYWJsZSBTY29wZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlW10gewotCQkJTkVTVEVEX0xJVEVSQUwsCi0JCQlBVF9CRUdJTl9MSVRFUkFMLAotCQkJQVRfRU5EX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SlNQIFNjcmlwdGluZyBWYXJpYWJsZSBTY29wZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SlNQIFNjcmlwdGluZyBWYXJpYWJsZSBTY29wZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SlNQIFNjcmlwdGluZyBWYXJpYWJsZSBTY29wZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBORVNURUQ6IHJldHVybiBORVNURURfTElURVJBTDsKLQkJCWNhc2UgQVRfQkVHSU46IHJldHVybiBBVF9CRUdJTl9MSVRFUkFMOwotCQkJY2FzZSBBVF9FTkQ6IHJldHVybiBBVF9FTkRfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQVGFnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTEzOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotCi0KLS8qKgotICogVGhlIHRhZyBlbGVtZW50IGRlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkuIFRoZSB0YWcgZWxlbWVudCBoYXMgb25lIGF0dHJpYnV0ZSwgaWQuCi0gKiBUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLSAqIG5hbWUgLS0gVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotICogdGFnLWNsYXNzIC0tIFRoZSB0YWcgaGFuZGxlciBjbGFzcyBpbXBsZW1lbnRpbmcgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZwotICogdGVpLWNsYXNzIC0tIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLSAqIGJvZHktY29udGVudCAtLSBUaGUgYm9keSBjb250ZW50IHR5cGUKLSAqIGRpc3BsYXktbmFtZSAtLSBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKLSAqIHNtYWxsLWljb24gLS0gT3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0gKiBsYXJnZS1pY29uIC0tIE9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotICogZGVzY3JpcHRpb24gLS0gT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0gKiB2YXJpYWJsZSAtLSBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24KLSAqIGF0dHJpYnV0ZSAtLSBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbgotICogZXhhbXBsZSAtLSBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgYWN0aW9uLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQVGFnIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQm9keUNvbnRlbnQgYXR0cmlidXRlCi0JICogUHJvdmlkZXMgYSBoaW50IGFzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBib2R5IG9mIHRoaXMgdGFnLiBQcmltYXJpbHkgaW50ZW5kZWQKLQkgKiBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSB2YWx1ZXMgc3BlY2lmaWVkOgotCSAqIAotCSAqIHRhZ2RlcGVuZGVudCAtIFRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZyBpbXBsZW1lbnRhdGlvbgotCSAqIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5IGluIGEJCWRpZmZlcmVudCAibGFuZ2FnZSIsIGUuZyBlbWJlZGRlZCBTUUwKLQkgKiBzdGF0ZW1lbnRzLgotCSAqIAotCSAqIEpTUCAtIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUCBzeW50YXgKLQkgKiAKLQkgKiBlbXB0eSAtIFRoZSBib2R5IG11c3QgYmUgZW1wdHlUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUCNQQ0RBVEEgOjo9IAotCSAqIHRhZ2RlcGVuZGVudCB8IEpTUCB8IGVtcHR5Ci0JICovCi0JQm9keUNvbnRlbnRUeXBlIGdldEJvZHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldEJvZHlDb250ZW50IDxlbT5Cb2R5IENvbnRlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvZHkgQ29udGVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuQm9keUNvbnRlbnRUeXBlCi0JICogQHNlZSAjaXNTZXRCb2R5Q29udGVudCgpCi0JICogQHNlZSAjdW5zZXRCb2R5Q29udGVudCgpCi0JICogQHNlZSAjZ2V0Qm9keUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJvZHlDb250ZW50KEJvZHlDb250ZW50VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0Qm9keUNvbnRlbnQgPGVtPkJvZHkgQ29udGVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCb2R5Q29udGVudCgpCi0JICogQHNlZSAjZ2V0Qm9keUNvbnRlbnQoKQotCSAqIEBzZWUgI3NldEJvZHlDb250ZW50KEJvZHlDb250ZW50VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJvZHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjZ2V0Qm9keUNvbnRlbnQgPGVtPkJvZHkgQ29udGVudDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9keSBDb250ZW50PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCb2R5Q29udGVudCgpCi0JICogQHNlZSAjZ2V0Qm9keUNvbnRlbnQoKQotCSAqIEBzZWUgI3NldEJvZHlDb250ZW50KEJvZHlDb250ZW50VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJvZHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRXhhbXBsZSBhdHRyaWJ1dGUKLQkgKiBUaGUgZXhhbXBsZSBlbGVtZW50IHByb3ZpZGVzIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZQotCSAqIG9mIGEgdGFnLgotCSAqLwotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRXhhbXBsZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEV4YW1wbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRKU1BUYWdfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR5bmFtaWMgQXR0cmlidXRlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RHluYW1pYyBBdHRyaWJ1dGVzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR5bmFtaWMgQXR0cmlidXRlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHluYW1pY0F0dHJpYnV0ZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlI2dldEpTUFRhZ19EeW5hbWljQXR0cmlidXRlcygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNEeW5hbWljQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNpc0R5bmFtaWNBdHRyaWJ1dGVzIDxlbT5EeW5hbWljIEF0dHJpYnV0ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR5bmFtaWMgQXR0cmlidXRlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNEeW5hbWljQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEF0dHJpYnV0ZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgVmFyaWFibGVzIHJlZmVyZW5jZXMKLQkgKiBUaGUgdmFyaWFibGUgZWxlbWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyBkZWZpbmVkIGJ5IAotCSAqIHRoaXMgdGFnLgotCSAqIEl0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhbiBhY3Rpb24gdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUKLQkgKiBzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4KLQkgKiBUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGUgYXJlIG9mIHRoZSBmb3JtOgotCSAqIG5hbWUtZ2l2ZW4gLS0gVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAotCSAqIG5hbWUtZnJvbS1hdHRyaWJ1dGUgLS0gVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbiB0aW1lKSB2YWx1ZQotCSAqIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIE9uZSBvZiBuYW1lLWdpdmVuIG9yIG5hbWVmcm9tLWF0dHJpYnV0ZSBpcwotCSAqIHJlcXVpcmVkLgotCSAqIHZhcmlhYmxlLWNsYXNzIC0tIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4gamF2YS5sYW5nLlN0cmluZyBpcwotCSAqIGRlZmF1bHQuCi0JICogZGVjbGFyZSAtLSBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBvciBub3QuIFRydWUgaXMgdGhlIGRlZmF1bHQuCi0JICogc2NvcGUgLS0gVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgZGVmaW5lZC4gTkVTVEVEIGlzIGRlZmF1bHQuCi0KLQkgKi8KLQlFTGlzdCBnZXRWYXJpYWJsZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFRhZ0NsYXNzIHJlZmVyZW5jZQotCSAqIFRoZSB0YWctY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcKLQkgKiB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yIHRoaXMgdGFnLiBUaGlzIGVsZW1lbnQgaXMKLQkgKiByZXF1aXJlZC4KLQkgKiBAcmVnZXhwIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLQotCSAqLwotCUphdmFDbGFzcyBnZXRUYWdDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVGFnQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRUYWdDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgVGVpQ2xhc3MgcmVmZXJlbmNlCi0JICogVGhlIHRlaS1jbGFzcyBlbGVtZW50IGluZGljYXRlcyB0aGUgc3ViY2xhc3Mgb2YKLQkgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvIGZvciB0aGlzIHRhZy4gVGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZAotCSAqIGF0IHRyYW5zbGF0aW9uIHRpbWUuIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbC4KLQkgKiBAcmVnZXhwIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0VGVpQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFRlaUNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0VGVpQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BUYWdBdHRyaWJ1dGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BUYWdBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0OTQ3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQVGFnQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLS8qKgotICogVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFRhZ0F0dHJpYnV0ZSBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICogRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nIGRlZmluZWQgKHJlcXVpcmVkKS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlCi0JICogRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCi0JICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0UmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0UmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUnRFeHByVmFsdWUgYXR0cmlidXRlCi0JICogRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0IGV4cHJlc3Npb25zIGFzYSB2YWx1ZSwgaS5lCi0JICogdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWRhdCByZXF1ZXN0IHRpbWUsIGFzCi0JICogb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9udGltZS4gKG9wdGlvbmFsKQotCSAqIERlZmF1bHQgPSBmYWxzZQotCSAqLwotCWJvb2xlYW4gaXNSdEV4cHJWYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFJ0RXhwclZhbHVlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UnRFeHByVmFsdWUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSdEV4cHJWYWx1ZSA8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSdEV4cHJWYWx1ZSgpCi0JICogQHNlZSAjaXNSdEV4cHJWYWx1ZSgpCi0JICogQHNlZSAjc2V0UnRFeHByVmFsdWUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJ0RXhwclZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNSdEV4cHJWYWx1ZSA8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UnRFeHByVmFsdWUoKQotCSAqIEBzZWUgI2lzUnRFeHByVmFsdWUoKQotCSAqIEBzZWUgI3NldFJ0RXhwclZhbHVlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSdEV4cHJWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJhZ21lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZyYWdtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJhZ21lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZyYWdtZW50KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRKU1BUYWdBdHRyaWJ1dGVfRnJhZ21lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRnJhZ21lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGUjaXNGcmFnbWVudCA8ZW0+RnJhZ21lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyYWdtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZyYWdtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGcmFnbWVudChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFR5cGUgcmVmZXJlbmNlCi0JICogVGhlIHZhbHVlIG9mIHRoZSB0eXBlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuCi0JICogRm9yIHN0YXRpYyB2YWx1ZXMgKHRob3NlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24gdGltZSkgdGhlIHR5cGUgaXMgYWx3YXlzCi0JICogamF2YS5sYW5nLlN0cmluZy4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFR5cGUoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlI2dldEpTUFRhZ0F0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BWYXJpYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTVkNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFZhcmlhYmxlIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZUdpdmVuIGF0dHJpYnV0ZQotCSAqIFRoZSBuYW1lLWdpdmVuIGVsZW1lbnQgcHJvdmlkZXMgdGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCi0JICogCi0JICogT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZUdpdmVuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZUdpdmVuIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TmFtZUdpdmVuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZUZyb21BdHRyaWJ1dGUgYXR0cmlidXRlCi0JICogVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YKLQkgKiB0aGUgdmFyaWFibGUuCi0JICovCi0JU3RyaW5nIGdldE5hbWVGcm9tQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZUZyb21BdHRyaWJ1dGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXROYW1lRnJvbUF0dHJpYnV0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlY2xhcmUgYXR0cmlidXRlCi0JICogVGhlIHZhbHVlIG9mIHRoZSBkZWNsYXJlIGVsZW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byAKLQkgKiBiZSBkZWZpbmVkIG9yIG5vdC4gU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4KLQkgKiBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBkZWZhdWx0IGlzIHRydWUuCi0KLQkgKi8KLQlib29sZWFuIGlzRGVjbGFyZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlY2xhcmUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZWNsYXJlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNjb3BlIGF0dHJpYnV0ZQotCSAqLwotCUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlCi0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjb3BlKEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgVmFyaWFibGVDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0VmFyaWFibGVDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVmFyaWFibGVDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmxlQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRKU1BWYXJpYWJsZV9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2UzNjM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWcgRmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEB2ZXJzaW9uIEoyRUUxLjQKLSAqIERlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkgdGhhdCBpcyBpbXBsZW1lbnRlZAotICogYXMgYSAudGFnIGZpbGUuCi0gKiAKLSAqIFRoZSB0YWctZmlsZSBlbGVtZW50IGhhcyB0d28gcmVxdWlyZWQgc3ViZWxlbWVudHM6Ci0gKiAKLSAqIG5hbWUgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotICogCi0gKiBwYXRoICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcwotICogICAgICAgICBhY3Rpb24sIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gb3IKLSAqIAl0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUgZm9yIGEgdGFnIGxpYnJhcnkgcGFja2FnZWQgaW4KLSAqIAlhIEpBUi4gIFRoaXMgbXVzdCBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlIC50YWcKLSAqIAlmaWxlIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlIC50YWcKLSAqIAlmaWxlIHJlc2lkZXMgaW4gYSBKQVIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0VGFnRXh0ZW5zaW9ucyA8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlI2dldFRhZ0ZpbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnRmlsZSBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlI2dldFRhZ0ZpbGVfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhdGgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2UjZ2V0VGFnRmlsZV9QYXRoKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldFBhdGggPGVtPlBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhdGgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhhbXBsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRUYWdGaWxlX0V4YW1wbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhhbXBsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhZyBFeHRlbnNpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRUYWdGaWxlX1RhZ0V4dGVuc2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGFnRXh0ZW5zaW9ucygpOwotCi19IC8vIFRhZ0ZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdMaWIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdMaWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5OTRmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnTGliLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLS8qKgotICogVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWdMaWIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQkvKioKLQkgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgdmVyc2lvbnMKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVGFnTGliVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKiBEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIG51bWJlciBvZiB0aGUgdGFnIGxpYnJhcnkgKGRld2V5IGRlY2ltYWwpLgotCSAqIEByZWdleHAgWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotCSAqLwotCVN0cmluZyBnZXRUYWdMaWJWZXJzaW9uKCk7Ci0KLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFRhZ0xpYlZlcnNpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRUYWdMaWJWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSnNwVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKiBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnIGxpYnJhcnkgcmVxdWlyZXMgaW4gb3JkZXIgdG8KLQkgKiBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkuICBEZWZhdWx0IGlzIDEuMgotCSAqIEByZWdleHAgWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotCSAqLwotCVN0cmluZyBnZXRKc3BWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgSnNwVmVyc2lvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEpzcFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBTaG9ydE5hbWUgYXR0cmlidXRlCi0JICogVGhlIHZhbHVlIG9mIHRoZSBzaG9ydC1uYW1lIGVsZW1lbnQgaXMgYSBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieSBhIEpTUAotCSAqIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUKLQkgKiB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuIERvIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIAotCSAqIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2hvcnROYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0U2hvcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGVsZW1lbnQgaXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZXhhY3QgCi0JICogc2VtYW50aWNzIG9mIHRoaXMgdGFnbGlicmFyeS4KLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFRhZ3MgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFRhZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFZhbGlkYXRvciByZWZlcmVuY2UKLQkgKiBUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIAotCSAqIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLQotCSAqLwotCVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFZhbGlkYXRvciByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBMaXN0ZW5lcnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldExpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnVuY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZ1bmN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnVuY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2UjZ2V0VGFnTGliX0Z1bmN0aW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEZ1bmN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnbGliIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhZ2xpYiBFeHRlbnNpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnbGliIEV4dGVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRUYWdMaWJfVGFnbGliRXh0ZW5zaW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUYWdsaWJFeHRlbnNpb25zKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ2xpYkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyZGVlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ2xpYkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhZ2xpYkZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYkZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRhZ0xpYiB2YWx1ZQotCSAqLwotCVRhZ0xpYiBjcmVhdGVUYWdMaWIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVmFsaWRhdG9yIHZhbHVlCi0JICovCi0JVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKU1BUYWcgdmFsdWUKLQkgKi8KLQlKU1BUYWcgY3JlYXRlSlNQVGFnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEpTUFRhZ0F0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCUpTUFRhZ0F0dHJpYnV0ZSBjcmVhdGVKU1BUYWdBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSlNQVmFyaWFibGUgdmFsdWUKLQkgKi8KLQlKU1BWYXJpYWJsZSBjcmVhdGVKU1BWYXJpYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GdW5jdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RnVuY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhZyBGaWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWcgRmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFnRmlsZSBjcmVhdGVUYWdGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRsZCBFeHRlbnNpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRsZCBFeHRlbnNpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRsZEV4dGVuc2lvbiBjcmVhdGVUbGRFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVRhZ2xpYlBhY2thZ2UgZ2V0VGFnbGliUGFja2FnZSgpOwotCi19Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdsaWJQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI5YzY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdsaWJQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgVGFnbGliUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gInRhZ2xpYiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRBR19MSUIgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX19TTUFMTF9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRBR19MSUJfX0RJU1BMQVlfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX19UQUdfTElCX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRBR19MSUJfX0pTUF9WRVJTSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX19TSE9SVF9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX19VUkkgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRBR19MSUJfX1RBR1MgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFRBR19MSUJfX1ZBTElEQVRPUiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVEFHX0xJQl9fTElTVEVORVJTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bmN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0xJQl9fRlVOQ1RJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhZ2xpYiBFeHRlbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGFnIExpYjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVkFMSURBVE9SID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpTUF9UQUcgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19fSUNPTlMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKU1BfVEFHX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKU1BfVEFHX19CT0RZX0NPTlRFTlQgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKU1BfVEFHX19FWEFNUExFID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX05BTUUgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR5bmFtaWMgQXR0cmlidXRlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfX0RZTkFNSUNfQVRUUklCVVRFUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1RBR19fQVRUUklCVVRFUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpTUF9UQUdfX1ZBUklBQkxFUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpTUF9UQUdfX1RBR19DTEFTUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpTUF9UQUdfX1RFSV9DTEFTUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkpTUCBUYWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKU1BfVEFHX0FUVFJJQlVURSA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpTUF9UQUdfQVRUUklCVVRFX19OQU1FID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUUgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GcmFnbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfQVRUUklCVVRFX19GUkFHTUVOVCA9IDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEVfX1RZUEUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkpTUCBUYWcgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UQUdfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVkFMSURBVE9SX19JTklUX1BBUkFNUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxJREFUT1JfX0RFU0NSSVBUSU9OUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlZhbGlkYXRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxJREFUT1JfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19ERUNMQVJFID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19TQ09QRSA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1MgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlMgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KU1AgVmFyaWFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSlNQX1ZBUklBQkxFX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5GdW5jdGlvbkltcGwgPGVtPkZ1bmN0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRGdW5jdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGVU5DVElPTiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19JQ09OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX19OQU1FID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaWduYXR1cmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVU5DVElPTl9fU0lHTkFUVVJFID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVOQ1RJT05fX0VYQU1QTEUgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bmN0aW9uIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdW5jdGlvbiBFeHRlbnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVU5DVElPTl9fRlVOQ1RJT05fRVhURU5TSU9OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZ1bmN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTkNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdGaWxlSW1wbCA8ZW0+VGFnIEZpbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdGaWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0VGFnRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQUdfRklMRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19JQ09OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19ESVNQTEFZX05BTUVTID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19OQU1FID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFHX0ZJTEVfX1BBVEggPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfRklMRV9fRVhBTVBMRSA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnIEV4dGVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX19UQUdfRVhURU5TSU9OUyA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRhZyBGaWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19GSUxFX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UbGRFeHRlbnNpb25JbXBsIDxlbT5UbGQgRXh0ZW5zaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGxkRXh0ZW5zaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGwjZ2V0VGxkRXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRMRF9FWFRFTlNJT04gPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRMRF9FWFRFTlNJT05fX05BTUVTUEFDRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5zaW9uIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFMgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UbGQgRXh0ZW5zaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRMRF9FWFRFTlNJT05fRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkV4dGVuc2libGVUeXBlSW1wbCA8ZW0+RXh0ZW5zaWJsZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRXh0ZW5zaWJsZVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbCNnZXRFeHRlbnNpYmxlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTlNJQkxFX1RZUEUgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5TSUJMRV9UWVBFX19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuc2libGUgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTlNJQkxFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQk9EWV9DT05URU5UX1RZUEUgPSA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKU1BfU0NSSVBUSU5HX1ZBUklBQkxFX1NDT1BFID0gMTA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAidGFnbGliLnhtaSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYWdsaWJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGFnTGliIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRUYWdMaWIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliX1RhZ0xpYlZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliX0pzcFZlcnNpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliX1Nob3J0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJfVXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhZ0xpYl9UYWdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhZ0xpYl9WYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFnTGliX0xpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0RnVuY3Rpb25zIDxlbT5GdW5jdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkZ1bmN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0RnVuY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRUYWdMaWIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhZ0xpYl9GdW5jdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnTGliI2dldFRhZ2xpYkV4dGVuc2lvbnMgPGVtPlRhZ2xpYiBFeHRlbnNpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYWdsaWIgRXh0ZW5zaW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWIjZ2V0VGFnbGliRXh0ZW5zaW9ucygpCi0JICogQHNlZSAjZ2V0VGFnTGliKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYWdMaWJfVGFnbGliRXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBWYWxpZGF0b3Igb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWYWxpZGF0b3JfVmFsaWRhdG9yQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmFsaWRhdG9yX0luaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0VmFsaWRhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWYWxpZGF0b3JfRGVzY3JpcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEpTUFRhZyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SlNQVGFnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFRhZ19Cb2R5Q29udGVudCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKU1BUYWdfRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRKU1BUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFRhZ19OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWcjaXNEeW5hbWljQXR0cmlidXRlcyA8ZW0+RHluYW1pYyBBdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHluYW1pYyBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZyNpc0R5bmFtaWNBdHRyaWJ1dGVzKCkKLQkgKiBAc2VlICNnZXRKU1BUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFRhZ19EeW5hbWljQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BUYWdfQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BUYWdfVmFyaWFibGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFRhZ19UYWdDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKU1BUYWdfVGVpQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSlNQVGFnQXR0cmlidXRlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKU1BUYWdBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnQXR0cmlidXRlX05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnQXR0cmlidXRlX1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9SdEV4cHJWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzRnJhZ21lbnQgPGVtPkZyYWdtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJhZ21lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnQXR0cmlidXRlI2lzRnJhZ21lbnQoKQotCSAqIEBzZWUgI2dldEpTUFRhZ0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVGFnQXR0cmlidXRlX0ZyYWdtZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFRhZ0F0dHJpYnV0ZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZSNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldEpTUFRhZ0F0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQVGFnQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKU1BWYXJpYWJsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SlNQVmFyaWFibGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVmFyaWFibGVfTmFtZUdpdmVuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFZhcmlhYmxlX05hbWVGcm9tQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEpTUFZhcmlhYmxlX0RlY2xhcmUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SlNQVmFyaWFibGVfU2NvcGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SlNQVmFyaWFibGVfVmFyaWFibGVDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BWYXJpYWJsZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlI2dldERlc2NyaXB0aW9ucygpCi0JICogQHNlZSAjZ2V0SlNQVmFyaWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEpTUFZhcmlhYmxlX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uIDxlbT5GdW5jdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GdW5jdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RnVuY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldEZ1bmN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGdW5jdGlvbl9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRTaWduYXR1cmUgPGVtPlNpZ25hdHVyZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNpZ25hdHVyZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRTaWduYXR1cmUoKQotCSAqIEBzZWUgI2dldEZ1bmN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGdW5jdGlvbl9TaWduYXR1cmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEV4YW1wbGUoKQotCSAqIEBzZWUgI2dldEZ1bmN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGdW5jdGlvbl9FeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRGdW5jdGlvbkNsYXNzIDxlbT5GdW5jdGlvbiBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkZ1bmN0aW9uIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEZ1bmN0aW9uQ2xhc3MoKQotCSAqIEBzZWUgI2dldEZ1bmN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGdW5jdGlvbl9GdW5jdGlvbkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uI2dldEZ1bmN0aW9uRXh0ZW5zaW9ucyA8ZW0+RnVuY3Rpb24gRXh0ZW5zaW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RnVuY3Rpb24gRXh0ZW5zaW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbiNnZXRGdW5jdGlvbkV4dGVuc2lvbnMoKQotCSAqIEBzZWUgI2dldEZ1bmN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlIDxlbT5UYWcgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWcgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYWdGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0VGFnRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnRmlsZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldFBhdGggPGVtPlBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0UGF0aCgpCi0JICogQHNlZSAjZ2V0VGFnRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnRmlsZV9QYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0VGFnRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnRmlsZV9FeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0VGFnRXh0ZW5zaW9ucyA8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRhZyBFeHRlbnNpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGUjZ2V0VGFnRXh0ZW5zaW9ucygpCi0JICogQHNlZSAjZ2V0VGFnRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFnRmlsZV9UYWdFeHRlbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uIDxlbT5UbGQgRXh0ZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRsZCBFeHRlbnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUbGRFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbiNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0TmFtZXNwYWNlKCkKLQkgKiBAc2VlICNnZXRUbGRFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRsZEV4dGVuc2lvbl9OYW1lc3BhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uI2dldEV4dGVuc2lvbkVsZW1lbnRzIDxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKQotCSAqIEBzZWUgI2dldFRsZEV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGxkRXh0ZW5zaW9uX0V4dGVuc2lvbkVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUgPGVtPkV4dGVuc2libGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbnNpYmxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuc2libGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5zaWJsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuc2libGVUeXBlX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEJvZHlDb250ZW50VHlwZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRCb2R5Q29udGVudFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlUYWdsaWJGYWN0b3J5IGdldFRhZ2xpYkZhY3RvcnkoKTsKLQotfSAvL1RhZ2xpYlBhY2thZ2UKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UbGRFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UbGRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczZDVkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGxkRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UbGQgRXh0ZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0RXh0ZW5zaW9uRWxlbWVudHMgPGVtPkV4dGVuc2lvbiBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2UjZ2V0VGxkRXh0ZW5zaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRsZEV4dGVuc2lvbiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lc3BhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2UjZ2V0VGxkRXh0ZW5zaW9uX05hbWVzcGFjZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuc2lvbiBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZSNnZXRUbGRFeHRlbnNpb25fRXh0ZW5zaW9uRWxlbWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKTsKLQotfSAvLyBUbGRFeHRlbnNpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9WYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwNTAxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLS8qKgotICogVGhlIHZhbGlkYXRvciBlbGVtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGFuIG9wdGlvbmFsIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0b3IgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFZhbGlkYXRvckNsYXNzIHJlZmVyZW5jZQotCSAqIGRlZmluZXMgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgdGhhdCBjYW4gYmUKLQkgKiB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCi0JICovCi0JSmF2YUNsYXNzIGdldFZhbGlkYXRvckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBWYWxpZGF0b3JDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFZhbGlkYXRvckNsYXNzKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEluaXRQYXJhbXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEluaXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlI2dldFZhbGlkYXRvcl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNjIyMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2libGUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRXh0ZW5zaWJsZVR5cGVJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dGVuc2libGVUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJsZVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuc2libGVUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuc2libGVUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5FWFRFTlNJQkxFX1RZUEVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkVYVEVOU0lCTEVfVFlQRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkVYVEVOU0lCTEVfVFlQRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbnNpYmxlVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0Z1bmN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRnVuY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YjllOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRnVuY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GdW5jdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkZ1bmN0aW9uSW1wbCNnZXRTaWduYXR1cmUgPGVtPlNpZ25hdHVyZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLkZ1bmN0aW9uSW1wbCNnZXRGdW5jdGlvbkNsYXNzIDxlbT5GdW5jdGlvbiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuRnVuY3Rpb25JbXBsI2dldEZ1bmN0aW9uRXh0ZW5zaW9ucyA8ZW0+RnVuY3Rpb24gRXh0ZW5zaW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uSW1wbCBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgRnVuY3Rpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpZ25hdHVyZSgpIDxlbT5TaWduYXR1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpZ25hdHVyZSgpIDxlbT5TaWduYXR1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpZ25hdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzaWduYXR1cmUgPSBTSUdOQVRVUkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZSgpIDxlbT5FeGFtcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4YW1wbGUoKSA8ZW0+RXhhbXBsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleGFtcGxlID0gRVhBTVBMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bmN0aW9uQ2xhc3MoKSA8ZW0+RnVuY3Rpb24gQ2xhc3M8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bmN0aW9uQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZnVuY3Rpb25DbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdW5jdGlvbkV4dGVuc2lvbnMoKSA8ZW0+RnVuY3Rpb24gRXh0ZW5zaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdW5jdGlvbkV4dGVuc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmdW5jdGlvbkV4dGVuc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZ1bmN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFLmdldEZ1bmN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJcmV0dXJuIHNpZ25hdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIG5ld1NpZ25hdHVyZSkgewotCQlTdHJpbmcgb2xkU2lnbmF0dXJlID0gc2lnbmF0dXJlOwotCQlzaWduYXR1cmUgPSBuZXdTaWduYXR1cmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX1NJR05BVFVSRSwgb2xkU2lnbmF0dXJlLCBzaWduYXR1cmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4YW1wbGUoU3RyaW5nIG5ld0V4YW1wbGUpIHsKLQkJU3RyaW5nIG9sZEV4YW1wbGUgPSBleGFtcGxlOwotCQlleGFtcGxlID0gbmV3RXhhbXBsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRVhBTVBMRSwgb2xkRXhhbXBsZSwgZXhhbXBsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0RnVuY3Rpb25DbGFzcygpIHsKLQkJaWYgKGZ1bmN0aW9uQ2xhc3MgIT0gbnVsbCAmJiBmdW5jdGlvbkNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRGdW5jdGlvbkNsYXNzID0gZnVuY3Rpb25DbGFzczsKLQkJCWZ1bmN0aW9uQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClmdW5jdGlvbkNsYXNzKTsKLQkJCWlmIChmdW5jdGlvbkNsYXNzICE9IG9sZEZ1bmN0aW9uQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9DTEFTUywgb2xkRnVuY3Rpb25DbGFzcywgZnVuY3Rpb25DbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmdW5jdGlvbkNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRGdW5jdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gZnVuY3Rpb25DbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbkNsYXNzKEphdmFDbGFzcyBuZXdGdW5jdGlvbkNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRGdW5jdGlvbkNsYXNzID0gZnVuY3Rpb25DbGFzczsKLQkJZnVuY3Rpb25DbGFzcyA9IG5ld0Z1bmN0aW9uQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTLCBvbGRGdW5jdGlvbkNsYXNzLCBmdW5jdGlvbkNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZ1bmN0aW9uRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZ1bmN0aW9uRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlmdW5jdGlvbkV4dGVuc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGxkRXh0ZW5zaW9uLmNsYXNzLCB0aGlzLCBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TKTsKLQkJfQotCQlyZXR1cm4gZnVuY3Rpb25FeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fSUNPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZ1bmN0aW9uRXh0ZW5zaW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19TSUdOQVRVUkU6Ci0JCQkJcmV0dXJuIGdldFNpZ25hdHVyZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RnVuY3Rpb25DbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldEZ1bmN0aW9uQ2xhc3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRlVOQ1RJT05fRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fU0lHTkFUVVJFOgotCQkJCXNldFNpZ25hdHVyZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0VYQU1QTEU6Ci0JCQkJc2V0RXhhbXBsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTOgotCQkJCXNldEZ1bmN0aW9uQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TOgotCQkJCWdldEZ1bmN0aW9uRXh0ZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX1NJR05BVFVSRToKLQkJCQlzZXRTaWduYXR1cmUoU0lHTkFUVVJFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0VYQU1QTEU6Ci0JCQkJc2V0RXhhbXBsZShFWEFNUExFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0NMQVNTOgotCQkJCXNldEZ1bmN0aW9uQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0ZVTkNUSU9OX0VYVEVOU0lPTlM6Ci0JCQkJZ2V0RnVuY3Rpb25FeHRlbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fU0lHTkFUVVJFOgotCQkJCXJldHVybiBTSUdOQVRVUkVfRURFRkFVTFQgPT0gbnVsbCA/IHNpZ25hdHVyZSAhPSBudWxsIDogIVNJR05BVFVSRV9FREVGQVVMVC5lcXVhbHMoc2lnbmF0dXJlKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRVhBTVBMRToKLQkJCQlyZXR1cm4gRVhBTVBMRV9FREVGQVVMVCA9PSBudWxsID8gZXhhbXBsZSAhPSBudWxsIDogIUVYQU1QTEVfRURFRkFVTFQuZXF1YWxzKGV4YW1wbGUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9DTEFTUzoKLQkJCQlyZXR1cm4gZnVuY3Rpb25DbGFzcyAhPSBudWxsOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TOgotCQkJCXJldHVybiBmdW5jdGlvbkV4dGVuc2lvbnMgIT0gbnVsbCAmJiAhZnVuY3Rpb25FeHRlbnNpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNpZ25hdHVyZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2lnbmF0dXJlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGFtcGxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGFtcGxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRnVuY3Rpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdBdHRyaWJ1dGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjg5MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLQotCi0vKioKLSAqIFRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKLSAqLwotcHVibGljIGNsYXNzIEpTUFRhZ0F0dHJpYnV0ZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEpTUFRhZ0F0dHJpYnV0ZSwgRU9iamVjdHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXF1aXJlZCgpIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXF1aXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVxdWlyZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUnRFeHByVmFsdWUoKSA8ZW0+UnQgRXhwciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSdEV4cHJWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJUX0VYUFJfVkFMVUVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJ0RXhwclZhbHVlID0gUlRfRVhQUl9WQUxVRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJ0IEV4cHIgVmFsdWUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJ0RXhwclZhbHVlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRnJhZ21lbnQoKSA8ZW0+RnJhZ21lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRnJhZ21lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGUkFHTUVOVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGcmFnbWVudCgpIDxlbT5GcmFnbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGcmFnbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZnJhZ21lbnQgPSBGUkFHTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgdHlwZSA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEpTUFRhZ0F0dHJpYnV0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQVGFnQXR0cmlidXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nIGRlZmluZWQgKHJlcXVpcmVkKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZXF1aXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIG5ld1JlcXVpcmVkKSB7Ci0JCWJvb2xlYW4gb2xkUmVxdWlyZWQgPSByZXF1aXJlZDsKLQkJcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKLQkJYm9vbGVhbiBvbGRSZXF1aXJlZEVTZXQgPSByZXF1aXJlZEVTZXQ7Ci0JCXJlcXVpcmVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgcmVxdWlyZWQsICFvbGRSZXF1aXJlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlcXVpcmVkKCkgewotCQlib29sZWFuIG9sZFJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkUmVxdWlyZWRFU2V0ID0gcmVxdWlyZWRFU2V0OwotCQlyZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCQlyZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SRVFVSVJFRCwgb2xkUmVxdWlyZWQsIFJFUVVJUkVEX0VERUZBVUxULCBvbGRSZXF1aXJlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVxdWlyZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldCBleHByZXNzaW9ucyBhc2EgdmFsdWUsIGkuZQotCSAqIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkYXQgcmVxdWVzdCB0aW1lLCBhcwotCSAqIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbnRpbWUuIChvcHRpb25hbCkKLQkgKiBEZWZhdWx0ID0gZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J0RXhwclZhbHVlKCkgewotCQlyZXR1cm4gcnRFeHByVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnRFeHByVmFsdWUoYm9vbGVhbiBuZXdSdEV4cHJWYWx1ZSkgewotCQlib29sZWFuIG9sZFJ0RXhwclZhbHVlID0gcnRFeHByVmFsdWU7Ci0JCXJ0RXhwclZhbHVlID0gbmV3UnRFeHByVmFsdWU7Ci0JCWJvb2xlYW4gb2xkUnRFeHByVmFsdWVFU2V0ID0gcnRFeHByVmFsdWVFU2V0OwotCQlydEV4cHJWYWx1ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFLCBvbGRSdEV4cHJWYWx1ZSwgcnRFeHByVmFsdWUsICFvbGRSdEV4cHJWYWx1ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJ0RXhwclZhbHVlKCkgewotCQlib29sZWFuIG9sZFJ0RXhwclZhbHVlID0gcnRFeHByVmFsdWU7Ci0JCWJvb2xlYW4gb2xkUnRFeHByVmFsdWVFU2V0ID0gcnRFeHByVmFsdWVFU2V0OwotCQlydEV4cHJWYWx1ZSA9IFJUX0VYUFJfVkFMVUVfRURFRkFVTFQ7Ci0JCXJ0RXhwclZhbHVlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUUsIG9sZFJ0RXhwclZhbHVlLCBSVF9FWFBSX1ZBTFVFX0VERUZBVUxULCBvbGRSdEV4cHJWYWx1ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJ0RXhwclZhbHVlKCkgewotCQlyZXR1cm4gcnRFeHByVmFsdWVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcmFnbWVudChib29sZWFuIG5ld0ZyYWdtZW50KSB7Ci0JCWJvb2xlYW4gb2xkRnJhZ21lbnQgPSBmcmFnbWVudDsKLQkJZnJhZ21lbnQgPSBuZXdGcmFnbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fRlJBR01FTlQsIG9sZEZyYWdtZW50LCBmcmFnbWVudCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLgotCSAqIEZvciBzdGF0aWMgdmFsdWVzICh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGFsd2F5cwotCSAqIGphdmEubGFuZy5TdHJpbmcuCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRUeXBlKCkgewotCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZFR5cGUgPSB0eXBlOwotCQkJdHlwZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXR5cGUpOwotCQkJaWYgKHR5cGUgIT0gb2xkVHlwZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShKYXZhQ2xhc3MgbmV3VHlwZSkgewotCQlKYXZhQ2xhc3Mgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFOgotCQkJCXJldHVybiBpc1J0RXhwclZhbHVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19GUkFHTUVOVDoKLQkJCQlyZXR1cm4gaXNGcmFnbWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fVFlQRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFR5cGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRUeXBlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1NldFJlcXVpcmVkKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUU6Ci0JCQkJcmV0dXJuIGlzU2V0UnRFeHByVmFsdWUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fRlJBR01FTlQ6Ci0JCQkJcmV0dXJuIGZyYWdtZW50ICE9IEZSQUdNRU5UX0VERUZBVUxUOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IG51bGw7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fUlRfRVhQUl9WQUxVRToKLQkJCQlzZXRSdEV4cHJWYWx1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0ZSQUdNRU5UOgotCQkJCXNldEZyYWdtZW50KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fVFlQRToKLQkJCQlzZXRUeXBlKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SRVFVSVJFRDoKLQkJCQl1bnNldFJlcXVpcmVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19SVF9FWFBSX1ZBTFVFOgotCQkJCXVuc2V0UnRFeHByVmFsdWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX0ZSQUdNRU5UOgotCQkJCXNldEZyYWdtZW50KEZSQUdNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXF1aXJlZDogIik7Ci0JCWlmIChyZXF1aXJlZEVTZXQpIHJlc3VsdC5hcHBlbmQocmVxdWlyZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBydEV4cHJWYWx1ZTogIik7Ci0JCWlmIChydEV4cHJWYWx1ZUVTZXQpIHJlc3VsdC5hcHBlbmQocnRFeHByVmFsdWUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmcmFnbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJhZ21lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjgyZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuQm9keUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgdGFnIGVsZW1lbnQgZGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeS4gVGhlIHRhZyBlbGVtZW50IGhhcyBvbmUgYXR0cmlidXRlLCBpZC4KLSAqIFRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotICogbmFtZSAtLSBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0gKiB0YWctY2xhc3MgLS0gVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZyBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnCi0gKiB0ZWktY2xhc3MgLS0gQW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotICogYm9keS1jb250ZW50IC0tIFRoZSBib2R5IGNvbnRlbnQgdHlwZQotICogZGlzcGxheS1uYW1lIC0tIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotICogc21hbGwtaWNvbiAtLSBPcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLSAqIGxhcmdlLWljb24gLS0gT3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0gKiBkZXNjcmlwdGlvbiAtLSBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAqIHZhcmlhYmxlIC0tIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgotICogYXR0cmlidXRlIC0tIEFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgYWN0aW9uCi0gKiBleGFtcGxlIC0tIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBhY3Rpb24uCi0KLSAqLwotcHVibGljIGNsYXNzIEpTUFRhZ0ltcGwgZXh0ZW5kcyBEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIEpTUFRhZ3sKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb2R5Q29udGVudCgpIDxlbT5Cb2R5IENvbnRlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvZHlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBCT0RZX0NPTlRFTlRfRURFRkFVTFQgPSBCb2R5Q29udGVudFR5cGUuVEFHREVQRU5ERU5UX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9keUNvbnRlbnRUeXBlIGJvZHlDb250ZW50ID0gQk9EWV9DT05URU5UX0VERUZBVUxUOwotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQm9keSBDb250ZW50IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBib2R5Q29udGVudEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGFtcGxlKCkgPGVtPkV4YW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4YW1wbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleGFtcGxlID0gRVhBTVBMRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0R5bmFtaWNBdHRyaWJ1dGVzKCkgPGVtPkR5bmFtaWMgQXR0cmlidXRlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEeW5hbWljQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERZTkFNSUNfQVRUUklCVVRFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEeW5hbWljQXR0cmlidXRlcygpIDxlbT5EeW5hbWljIEF0dHJpYnV0ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRHluYW1pY0F0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGR5bmFtaWNBdHRyaWJ1dGVzID0gRFlOQU1JQ19BVFRSSUJVVEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB2YXJpYWJsZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgdGFnQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgdGVpQ2xhc3MgPSBudWxsOwotCXB1YmxpYyBKU1BUYWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFLmdldEpTUFRhZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5IGludGVuZGVkCi0JICogZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLlRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgdmFsdWVzIHNwZWNpZmllZDoKLQkgKiAKLQkgKiB0YWdkZXBlbmRlbnQgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcgaW1wbGVtZW50YXRpb24KLQkgKiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSBpbiBhCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMCi0JICogc3RhdGVtZW50cy4KLQkgKiAKLQkgKiBKU1AgLSBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1Agc3ludGF4Ci0JICogCi0JICogZW1wdHkgLSBUaGUgYm9keSBtdXN0IGJlIGVtcHR5VGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AjUENEQVRBIDo6PSAKLQkgKiB0YWdkZXBlbmRlbnQgfCBKU1AgfCBlbXB0eQotCSAqLwotCXB1YmxpYyBCb2R5Q29udGVudFR5cGUgZ2V0Qm9keUNvbnRlbnQoKSB7Ci0JCXJldHVybiBib2R5Q29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb2R5Q29udGVudChCb2R5Q29udGVudFR5cGUgbmV3Qm9keUNvbnRlbnQpIHsKLQkJQm9keUNvbnRlbnRUeXBlIG9sZEJvZHlDb250ZW50ID0gYm9keUNvbnRlbnQ7Ci0JCWJvZHlDb250ZW50ID0gbmV3Qm9keUNvbnRlbnQgPT0gbnVsbCA/IEJPRFlfQ09OVEVOVF9FREVGQVVMVCA6IG5ld0JvZHlDb250ZW50OwotCQlib29sZWFuIG9sZEJvZHlDb250ZW50RVNldCA9IGJvZHlDb250ZW50RVNldDsKLQkJYm9keUNvbnRlbnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQsIG9sZEJvZHlDb250ZW50LCBib2R5Q29udGVudCwgIW9sZEJvZHlDb250ZW50RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Qm9keUNvbnRlbnQoKSB7Ci0JCUJvZHlDb250ZW50VHlwZSBvbGRCb2R5Q29udGVudCA9IGJvZHlDb250ZW50OwotCQlib29sZWFuIG9sZEJvZHlDb250ZW50RVNldCA9IGJvZHlDb250ZW50RVNldDsKLQkJYm9keUNvbnRlbnQgPSBCT0RZX0NPTlRFTlRfRURFRkFVTFQ7Ci0JCWJvZHlDb250ZW50RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQk9EWV9DT05URU5ULCBvbGRCb2R5Q29udGVudCwgQk9EWV9DT05URU5UX0VERUZBVUxULCBvbGRCb2R5Q29udGVudEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJvZHlDb250ZW50KCkgewotCQlyZXR1cm4gYm9keUNvbnRlbnRFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBleGFtcGxlIGVsZW1lbnQgcHJvdmlkZXMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlCi0JICogb2YgYSB0YWcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGFtcGxlKFN0cmluZyBuZXdFeGFtcGxlKSB7Ci0JCVN0cmluZyBvbGRFeGFtcGxlID0gZXhhbXBsZTsKLQkJZXhhbXBsZSA9IG5ld0V4YW1wbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRVhBTVBMRSwgb2xkRXhhbXBsZSwgZXhhbXBsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZHluYW1pY0F0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZXMoYm9vbGVhbiBuZXdEeW5hbWljQXR0cmlidXRlcykgewotCQlib29sZWFuIG9sZER5bmFtaWNBdHRyaWJ1dGVzID0gZHluYW1pY0F0dHJpYnV0ZXM7Ci0JCWR5bmFtaWNBdHRyaWJ1dGVzID0gbmV3RHluYW1pY0F0dHJpYnV0ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTLCBvbGREeW5hbWljQXR0cmlidXRlcywgZHluYW1pY0F0dHJpYnV0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHZhcmlhYmxlIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSAKLQkgKiB0aGlzIHRhZy4KLQkgKiBJdCBpcyBhICh0cmFuc2xhdGlvbiB0aW1lKSBlcnJvciBmb3IgYW4gYWN0aW9uIHRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlCi0JICogc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuCi0JICogVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlIGFyZSBvZiB0aGUgZm9ybToKLQkgKiBuYW1lLWdpdmVuIC0tIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKLQkgKiBuYW1lLWZyb20tYXR0cmlidXRlIC0tIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUKLQkgKiB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lZnJvbS1hdHRyaWJ1dGUgaXMKLQkgKiByZXF1aXJlZC4KLQkgKiB2YXJpYWJsZS1jbGFzcyAtLSBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuIGphdmEubGFuZy5TdHJpbmcgaXMKLQkgKiBkZWZhdWx0LgotCSAqIGRlY2xhcmUgLS0gV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LiBUcnVlIGlzIHRoZSBkZWZhdWx0LgotCSAqIHNjb3BlIC0tIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGRlZmluZWQuIE5FU1RFRCBpcyBkZWZhdWx0LgotCi0JICovCi0JcHVibGljIEVMaXN0IGdldFZhcmlhYmxlcygpIHsKLQkJaWYgKHZhcmlhYmxlcyA9PSBudWxsKSB7Ci0JCQl2YXJpYWJsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSlNQVmFyaWFibGUuY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVkFSSUFCTEVTKTsKLQkJfQotCQlyZXR1cm4gdmFyaWFibGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0YWctY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcKLQkgKiB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yIHRoaXMgdGFnLiBUaGlzIGVsZW1lbnQgaXMKLQkgKiByZXF1aXJlZC4KLQkgKiBAcmVnZXhwIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0VGFnQ2xhc3MoKSB7Ci0JCWlmICh0YWdDbGFzcyAhPSBudWxsICYmIHRhZ0NsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRUYWdDbGFzcyA9IHRhZ0NsYXNzOwotCQkJdGFnQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCl0YWdDbGFzcyk7Ci0JCQlpZiAodGFnQ2xhc3MgIT0gb2xkVGFnQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RBR19DTEFTUywgb2xkVGFnQ2xhc3MsIHRhZ0NsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRUYWdDbGFzcygpIHsKLQkJcmV0dXJuIHRhZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzKEphdmFDbGFzcyBuZXdUYWdDbGFzcykgewotCQlKYXZhQ2xhc3Mgb2xkVGFnQ2xhc3MgPSB0YWdDbGFzczsKLQkJdGFnQ2xhc3MgPSBuZXdUYWdDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVEFHX19UQUdfQ0xBU1MsIG9sZFRhZ0NsYXNzLCB0YWdDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0ZWktY2xhc3MgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHN1YmNsYXNzIG9mCi0JICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IgdGhpcyB0YWcuIFRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQKLQkgKiBhdCB0cmFuc2xhdGlvbiB0aW1lLiBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwuCi0JICogQHJlZ2V4cCBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRUZWlDbGFzcygpIHsKLQkJaWYgKHRlaUNsYXNzICE9IG51bGwgJiYgdGVpQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZFRlaUNsYXNzID0gdGVpQ2xhc3M7Ci0JCQl0ZWlDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXRlaUNsYXNzKTsKLQkJCWlmICh0ZWlDbGFzcyAhPSBvbGRUZWlDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEVJX0NMQVNTLCBvbGRUZWlDbGFzcywgdGVpQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGVpQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFRlaUNsYXNzKCkgewotCQlyZXR1cm4gdGVpQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVpQ2xhc3MoSmF2YUNsYXNzIG5ld1RlaUNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRUZWlDbGFzcyA9IHRlaUNsYXNzOwotCQl0ZWlDbGFzcyA9IG5ld1RlaUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RFSV9DTEFTUywgb2xkVGVpQ2xhc3MsIHRlaUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRElTUExBWV9OQU1FUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVkFSSUFCTEVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFZhcmlhYmxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQ6Ci0JCQkJcmV0dXJuIGdldEJvZHlDb250ZW50KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRVhBTVBMRToKLQkJCQlyZXR1cm4gZ2V0RXhhbXBsZSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19EWU5BTUlDX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGlzRHluYW1pY0F0dHJpYnV0ZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1ZBUklBQkxFUzoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFibGVzKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEFHX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VGFnQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRUYWdDbGFzcygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RFSV9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRlaUNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VGVpQ2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0JPRFlfQ09OVEVOVDoKLQkJCQlyZXR1cm4gaXNTZXRCb2R5Q29udGVudCgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIEVYQU1QTEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4YW1wbGUgIT0gbnVsbCA6ICFFWEFNUExFX0VERUZBVUxULmVxdWFscyhleGFtcGxlKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBkeW5hbWljQXR0cmlidXRlcyAhPSBEWU5BTUlDX0FUVFJJQlVURVNfRURFRkFVTFQ7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19WQVJJQUJMRVM6Ci0JCQkJcmV0dXJuIHZhcmlhYmxlcyAhPSBudWxsICYmICF2YXJpYWJsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RBR19DTEFTUzoKLQkJCQlyZXR1cm4gdGFnQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19URUlfQ0xBU1M6Ci0JCQkJcmV0dXJuIHRlaUNsYXNzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0JPRFlfQ09OVEVOVDoKLQkJCQlzZXRCb2R5Q29udGVudCgoQm9keUNvbnRlbnRUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fRVhBTVBMRToKLQkJCQlzZXRFeGFtcGxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0RZTkFNSUNfQVRUUklCVVRFUzoKLQkJCQlzZXREeW5hbWljQXR0cmlidXRlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVkFSSUFCTEVTOgotCQkJCWdldFZhcmlhYmxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFyaWFibGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVEFHX0NMQVNTOgotCQkJCXNldFRhZ0NsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19URUlfQ0xBU1M6Ci0JCQkJc2V0VGVpQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0JPRFlfQ09OVEVOVDoKLQkJCQl1bnNldEJvZHlDb250ZW50KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX0VYQU1QTEU6Ci0JCQkJc2V0RXhhbXBsZShFWEFNUExFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19EWU5BTUlDX0FUVFJJQlVURVM6Ci0JCQkJc2V0RHluYW1pY0F0dHJpYnV0ZXMoRFlOQU1JQ19BVFRSSUJVVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fQVRUUklCVVRFUzoKLQkJCQlnZXRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19fVkFSSUFCTEVTOgotCQkJCWdldFZhcmlhYmxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfX1RBR19DTEFTUzoKLQkJCQlzZXRUYWdDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19URUlfQ0xBU1M6Ci0JCQkJc2V0VGVpQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJvZHlDb250ZW50OiAiKTsKLQkJaWYgKGJvZHlDb250ZW50RVNldCkgcmVzdWx0LmFwcGVuZChib2R5Q29udGVudCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4YW1wbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4YW1wbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR5bmFtaWNBdHRyaWJ1dGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkeW5hbWljQXR0cmlidXRlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFZhcmlhYmxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVmFyaWFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjBjNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVmFyaWFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BWYXJpYWJsZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEpTUFZhcmlhYmxlewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVHaXZlbigpIDxlbT5OYW1lIEdpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lR2l2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfR0lWRU5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lR2l2ZW4gPSBOQU1FX0dJVkVOX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lRnJvbUF0dHJpYnV0ZSgpIDxlbT5OYW1lIEZyb20gQXR0cmlidXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lRnJvbUF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9GUk9NX0FUVFJJQlVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlID0gTkFNRV9GUk9NX0FUVFJJQlVURV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWNsYXJlKCkgPGVtPkRlY2xhcmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGVjbGFyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQ0xBUkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlY2xhcmUgPSBERUNMQVJFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBTQ09QRV9FREVGQVVMVCA9IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuTkVTVEVEX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBzY29wZSA9IFNDT1BFX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgdmFyaWFibGVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHVibGljIEpTUFZhcmlhYmxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRS5nZXRKU1BWYXJpYWJsZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBuYW1lLWdpdmVuIGVsZW1lbnQgcHJvdmlkZXMgdGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCi0JICogCi0JICogT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVHaXZlbigpIHsKLQkJcmV0dXJuIG5hbWVHaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lR2l2ZW4oU3RyaW5nIG5ld05hbWVHaXZlbikgewotCQlTdHJpbmcgb2xkTmFtZUdpdmVuID0gbmFtZUdpdmVuOwotCQluYW1lR2l2ZW4gPSBuZXdOYW1lR2l2ZW47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOLCBvbGROYW1lR2l2ZW4sIG5hbWVHaXZlbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mCi0JICogdGhlIHZhcmlhYmxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBuYW1lRnJvbUF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lRnJvbUF0dHJpYnV0ZShTdHJpbmcgbmV3TmFtZUZyb21BdHRyaWJ1dGUpIHsKLQkJU3RyaW5nIG9sZE5hbWVGcm9tQXR0cmlidXRlID0gbmFtZUZyb21BdHRyaWJ1dGU7Ci0JCW5hbWVGcm9tQXR0cmlidXRlID0gbmV3TmFtZUZyb21BdHRyaWJ1dGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFLCBvbGROYW1lRnJvbUF0dHJpYnV0ZSwgbmFtZUZyb21BdHRyaWJ1dGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGRlY2xhcmUgZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIAotCSAqIGJlIGRlZmluZWQgb3Igbm90LiBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLgotCSAqIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgaXMgdGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVjbGFyZSgpIHsKLQkJcmV0dXJuIGRlY2xhcmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyZShib29sZWFuIG5ld0RlY2xhcmUpIHsKLQkJYm9vbGVhbiBvbGREZWNsYXJlID0gZGVjbGFyZTsKLQkJZGVjbGFyZSA9IG5ld0RlY2xhcmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERUNMQVJFLCBvbGREZWNsYXJlLCBkZWNsYXJlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIG5ld1Njb3BlKSB7Ci0JCUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgb2xkU2NvcGUgPSBzY29wZTsKLQkJc2NvcGUgPSBuZXdTY29wZSA9PSBudWxsID8gU0NPUEVfRURFRkFVTFQgOiBuZXdTY29wZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1NDT1BFLCBvbGRTY29wZSwgc2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFZhcmlhYmxlQ2xhc3MoKSB7Ci0JCWlmICh2YXJpYWJsZUNsYXNzICE9IG51bGwgJiYgdmFyaWFibGVDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkVmFyaWFibGVDbGFzcyA9IHZhcmlhYmxlQ2xhc3M7Ci0JCQl2YXJpYWJsZUNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpdmFyaWFibGVDbGFzcyk7Ci0JCQlpZiAodmFyaWFibGVDbGFzcyAhPSBvbGRWYXJpYWJsZUNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTLCBvbGRWYXJpYWJsZUNsYXNzLCB2YXJpYWJsZUNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmxlQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldFZhcmlhYmxlQ2xhc3MoKSB7Ci0JCXJldHVybiB2YXJpYWJsZUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmxlQ2xhc3MoSmF2YUNsYXNzIG5ld1ZhcmlhYmxlQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZFZhcmlhYmxlQ2xhc3MgPSB2YXJpYWJsZUNsYXNzOwotCQl2YXJpYWJsZUNsYXNzID0gbmV3VmFyaWFibGVDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTLCBvbGRWYXJpYWJsZUNsYXNzLCB2YXJpYWJsZUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgotCQkJCXJldHVybiBnZXROYW1lR2l2ZW4oKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfRlJPTV9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldE5hbWVGcm9tQXR0cmlidXRlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERUNMQVJFOgotCQkJCXJldHVybiBpc0RlY2xhcmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19TQ09QRToKLQkJCQlyZXR1cm4gZ2V0U2NvcGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX1ZBUklBQkxFX0NMQVNTOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VmFyaWFibGVDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmxlQ2xhc3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fTkFNRV9HSVZFTjoKLQkJCQlyZXR1cm4gTkFNRV9HSVZFTl9FREVGQVVMVCA9PSBudWxsID8gbmFtZUdpdmVuICE9IG51bGwgOiAhTkFNRV9HSVZFTl9FREVGQVVMVC5lcXVhbHMobmFtZUdpdmVuKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX05BTUVfRlJPTV9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIE5BTUVfRlJPTV9BVFRSSUJVVEVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVGcm9tQXR0cmlidXRlICE9IG51bGwgOiAhTkFNRV9GUk9NX0FUVFJJQlVURV9FREVGQVVMVC5lcXVhbHMobmFtZUZyb21BdHRyaWJ1dGUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fREVDTEFSRToKLQkJCQlyZXR1cm4gZGVjbGFyZSAhPSBERUNMQVJFX0VERUZBVUxUOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fU0NPUEU6Ci0JCQkJcmV0dXJuIHNjb3BlICE9IFNDT1BFX0VERUZBVUxUOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1M6Ci0JCQkJcmV0dXJuIHZhcmlhYmxlQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgotCQkJCXNldE5hbWVHaXZlbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFOgotCQkJCXNldE5hbWVGcm9tQXR0cmlidXRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFQ0xBUkU6Ci0JCQkJc2V0RGVjbGFyZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19TQ09QRToKLQkJCQlzZXRTY29wZSgoSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1M6Ci0JCQkJc2V0VmFyaWFibGVDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgotCQkJCXNldE5hbWVHaXZlbihOQU1FX0dJVkVOX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFOgotCQkJCXNldE5hbWVGcm9tQXR0cmlidXRlKE5BTUVfRlJPTV9BVFRSSUJVVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFQ0xBUkU6Ci0JCQkJc2V0RGVjbGFyZShERUNMQVJFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19TQ09QRToKLQkJCQlzZXRTY29wZShTQ09QRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1M6Ci0JCQkJc2V0VmFyaWFibGVDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZUdpdmVuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lR2l2ZW4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWVGcm9tQXR0cmlidXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lRnJvbUF0dHJpYnV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVjbGFyZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVjbGFyZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NvcGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjb3BlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjM3MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnRmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWcgRmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnRmlsZUltcGwjZ2V0VGFnRXh0ZW5zaW9ucyA8ZW0+VGFnIEV4dGVuc2lvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdGaWxlSW1wbCBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgVGFnRmlsZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGF0aCgpIDxlbT5QYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhdGgoKSA8ZW0+UGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gUEFUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGFtcGxlKCkgPGVtPkV4YW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4YW1wbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZSgpIDxlbT5FeGFtcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4YW1wbGUgPSBFWEFNUExFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFnRXh0ZW5zaW9ucygpIDxlbT5UYWcgRXh0ZW5zaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdFeHRlbnNpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFnRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFnRmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYWdGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIG5ld1BhdGgpIHsKLQkJU3RyaW5nIG9sZFBhdGggPSBwYXRoOwotCQlwYXRoID0gbmV3UGF0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fUEFUSCwgb2xkUGF0aCwgcGF0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgbmV3RXhhbXBsZSkgewotCQlTdHJpbmcgb2xkRXhhbXBsZSA9IGV4YW1wbGU7Ci0JCWV4YW1wbGUgPSBuZXdFeGFtcGxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19FWEFNUExFLCBvbGRFeGFtcGxlLCBleGFtcGxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRhZ0V4dGVuc2lvbnMoKSB7Ci0JCWlmICh0YWdFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCXRhZ0V4dGVuc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGxkRXh0ZW5zaW9uLmNsYXNzLCB0aGlzLCBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19UQUdfRVhURU5TSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHRhZ0V4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19JQ09OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRhZ0V4dGVuc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UGF0aCgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TOgotCQkJCXJldHVybiBnZXRUYWdFeHRlbnNpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fUEFUSDoKLQkJCQlzZXRQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fRVhBTVBMRToKLQkJCQlzZXRFeGFtcGxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fVEFHX0VYVEVOU0lPTlM6Ci0JCQkJZ2V0VGFnRXh0ZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VGFnRXh0ZW5zaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19QQVRIOgotCQkJCXNldFBhdGgoUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19FWEFNUExFOgotCQkJCXNldEV4YW1wbGUoRVhBTVBMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19UQUdfRVhURU5TSU9OUzoKLQkJCQlnZXRUYWdFeHRlbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fUEFUSDoKLQkJCQlyZXR1cm4gUEFUSF9FREVGQVVMVCA9PSBudWxsID8gcGF0aCAhPSBudWxsIDogIVBBVEhfRURFRkFVTFQuZXF1YWxzKHBhdGgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19FWEFNUExFOgotCQkJCXJldHVybiBFWEFNUExFX0VERUZBVUxUID09IG51bGwgPyBleGFtcGxlICE9IG51bGwgOiAhRVhBTVBMRV9FREVGQVVMVC5lcXVhbHMoZXhhbXBsZSk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX1RBR19FWFRFTlNJT05TOgotCQkJCXJldHVybiB0YWdFeHRlbnNpb25zICE9IG51bGwgJiYgIXRhZ0V4dGVuc2lvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGF0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGF0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhhbXBsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhhbXBsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RhZ0ZpbGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTYxM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnTGliSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiBUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdC4KLQotICovCi1wdWJsaWMgY2xhc3MgVGFnTGliSW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIFRhZ0xpYnsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdMaWJWZXJzaW9uKCkgPGVtPlRhZyBMaWIgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnTGliVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0xJQl9WRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFnTGliVmVyc2lvbiA9IFRBR19MSUJfVkVSU0lPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnNwVmVyc2lvbigpIDxlbT5Kc3AgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SnNwVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqc3BWZXJzaW9uID0gSlNQX1ZFUlNJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNob3J0TmFtZSgpIDxlbT5TaG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydE5hbWUgPSBTSE9SVF9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVyaSA9IFVSSV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFncyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsaXN0ZW5lcnMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bmN0aW9ucygpIDxlbT5GdW5jdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVuY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZnVuY3Rpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYkV4dGVuc2lvbnMoKSA8ZW0+VGFnbGliIEV4dGVuc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFnbGliRXh0ZW5zaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhZ2xpYkV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIFRhZ0xpYkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFnTGliKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRGVzY3JpYmVzIHRoaXMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHRhZyBsaWJyYXJ5IChkZXdleSBkZWNpbWFsKS4KLQkgKiBAcmVnZXhwIFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhZ0xpYlZlcnNpb24oKSB7Ci0JCXJldHVybiB0YWdMaWJWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ0xpYlZlcnNpb24oU3RyaW5nIG5ld1RhZ0xpYlZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFRhZ0xpYlZlcnNpb24gPSB0YWdMaWJWZXJzaW9uOwotCQl0YWdMaWJWZXJzaW9uID0gbmV3VGFnTGliVmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdfTElCX1ZFUlNJT04sIG9sZFRhZ0xpYlZlcnNpb24sIHRhZ0xpYlZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnIGxpYnJhcnkgcmVxdWlyZXMgaW4gb3JkZXIgdG8KLQkgKiBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkuICBEZWZhdWx0IGlzIDEuMgotCSAqIEByZWdleHAgWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNwVmVyc2lvbigpIHsKLQkJcmV0dXJuIGpzcFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SnNwVmVyc2lvbihTdHJpbmcgbmV3SnNwVmVyc2lvbikgewotCQlTdHJpbmcgb2xkSnNwVmVyc2lvbiA9IGpzcFZlcnNpb247Ci0JCWpzcFZlcnNpb24gPSBuZXdKc3BWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0pTUF9WRVJTSU9OLCBvbGRKc3BWZXJzaW9uLCBqc3BWZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHZhbHVlIG9mIHRoZSBzaG9ydC1uYW1lIGVsZW1lbnQgaXMgYSBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieSBhIEpTUAotCSAqIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUKLQkgKiB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuIERvIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIAotCSAqIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIHNob3J0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydE5hbWUoU3RyaW5nIG5ld1Nob3J0TmFtZSkgewotCQlTdHJpbmcgb2xkU2hvcnROYW1lID0gc2hvcnROYW1lOwotCQlzaG9ydE5hbWUgPSBuZXdTaG9ydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU0hPUlRfTkFNRSwgb2xkU2hvcnROYW1lLCBzaG9ydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHVyaSBlbGVtZW50IGlzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGV4YWN0IAotCSAqIHNlbWFudGljcyBvZiB0aGlzIHRhZ2xpYnJhcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1VSSSwgb2xkVXJpLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlzdXBlci5zZXREaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7Ci0JfQotCQotCS8qKgotCVRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYWdzKCkgewotCQlpZiAodGFncyA9PSBudWxsKSB7Ci0JCQl0YWdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEpTUFRhZy5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdTKTsKLQkJfQotCQlyZXR1cm4gdGFnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIAotCSAqIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFZhbGlkYXRvcihWYWxpZGF0b3IgbmV3VmFsaWRhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVZhbGlkYXRvciBvbGRWYWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCXZhbGlkYXRvciA9IG5ld1ZhbGlkYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1IsIG9sZFZhbGlkYXRvciwgbmV3VmFsaWRhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIG5ld1ZhbGlkYXRvcikgewotCQlpZiAobmV3VmFsaWRhdG9yICE9IHZhbGlkYXRvcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsaWRhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbGlkYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWxpZGF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsaWRhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsaWRhdG9yKG5ld1ZhbGlkYXRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1ZBTElEQVRPUiwgbmV3VmFsaWRhdG9yLCBuZXdWYWxpZGF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaXN0ZW5lci5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlMpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZ1bmN0aW9ucygpIHsKLQkJaWYgKGZ1bmN0aW9ucyA9PSBudWxsKSB7Ci0JCQlmdW5jdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRnVuY3Rpb24uY2xhc3MsIHRoaXMsIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gZnVuY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYWdsaWJFeHRlbnNpb25zKCkgewotCQlpZiAodGFnbGliRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQl0YWdsaWJFeHRlbnNpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRsZEV4dGVuc2lvbi5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHRhZ2xpYkV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRElTUExBWV9OQU1FUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYWdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRWYWxpZGF0b3IobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0xJU1RFTkVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMaXN0ZW5lcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19GVU5DVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RnVuY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFnbGliRXh0ZW5zaW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgotCQkJCXJldHVybiBnZXRUYWdMaWJWZXJzaW9uKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fSlNQX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldEpzcFZlcnNpb24oKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19TSE9SVF9OQU1FOgotCQkJCXJldHVybiBnZXRTaG9ydE5hbWUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR1M6Ci0JCQkJcmV0dXJuIGdldFRhZ3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1I6Ci0JCQkJcmV0dXJuIGdldFZhbGlkYXRvcigpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZ2V0TGlzdGVuZXJzKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TOgotCQkJCXJldHVybiBnZXRGdW5jdGlvbnMoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUzoKLQkJCQlyZXR1cm4gZ2V0VGFnbGliRXh0ZW5zaW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19JQ09OUzoKLQkJCQlyZXR1cm4gaWNvbnMgIT0gbnVsbCAmJiAhaWNvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gU01BTExfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gc21hbGxJY29uICE9IG51bGwgOiAhU01BTExfSUNPTl9FREVGQVVMVC5lcXVhbHMoc21hbGxJY29uKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gRElTUExBWV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBkaXNwbGF5TmFtZSAhPSBudWxsIDogIURJU1BMQVlfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGlzcGxheU5hbWUpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR19MSUJfVkVSU0lPTjoKLQkJCQlyZXR1cm4gVEFHX0xJQl9WRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB0YWdMaWJWZXJzaW9uICE9IG51bGwgOiAhVEFHX0xJQl9WRVJTSU9OX0VERUZBVUxULmVxdWFscyh0YWdMaWJWZXJzaW9uKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19KU1BfVkVSU0lPTjoKLQkJCQlyZXR1cm4gSlNQX1ZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IGpzcFZlcnNpb24gIT0gbnVsbCA6ICFKU1BfVkVSU0lPTl9FREVGQVVMVC5lcXVhbHMoanNwVmVyc2lvbik7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU0hPUlRfTkFNRToKLQkJCQlyZXR1cm4gU0hPUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2hvcnROYW1lICE9IG51bGwgOiAhU0hPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoc2hvcnROYW1lKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19VUkk6Ci0JCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxULmVxdWFscyh1cmkpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR1M6Ci0JCQkJcmV0dXJuIHRhZ3MgIT0gbnVsbCAmJiAhdGFncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SOgotCQkJCXJldHVybiB2YWxpZGF0b3IgIT0gbnVsbDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGxpc3RlbmVycyAhPSBudWxsICYmICFsaXN0ZW5lcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0ZVTkNUSU9OUzoKLQkJCQlyZXR1cm4gZnVuY3Rpb25zICE9IG51bGwgJiYgIWZ1bmN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlM6Ci0JCQkJcmV0dXJuIHRhZ2xpYkV4dGVuc2lvbnMgIT0gbnVsbCAmJiAhdGFnbGliRXh0ZW5zaW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgotCQkJCXNldFRhZ0xpYlZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0pTUF9WRVJTSU9OOgotCQkJCXNldEpzcFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1NIT1JUX05BTUU6Ci0JCQkJc2V0U2hvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19VUkk6Ci0JCQkJc2V0VXJpKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdTOgotCQkJCWdldFRhZ3MoKS5jbGVhcigpOwotCQkJCWdldFRhZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19WQUxJREFUT1I6Ci0JCQkJc2V0VmFsaWRhdG9yKChWYWxpZGF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19GVU5DVElPTlM6Ci0JCQkJZ2V0RnVuY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRGdW5jdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdMSUJfRVhURU5TSU9OUzoKLQkJCQlnZXRUYWdsaWJFeHRlbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRUYWdsaWJFeHRlbnNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19UQUdfTElCX1ZFUlNJT046Ci0JCQkJc2V0VGFnTGliVmVyc2lvbihUQUdfTElCX1ZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19KU1BfVkVSU0lPTjoKLQkJCQlzZXRKc3BWZXJzaW9uKEpTUF9WRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fU0hPUlRfTkFNRToKLQkJCQlzZXRTaG9ydE5hbWUoU0hPUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHUzoKLQkJCQlnZXRUYWdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVkFMSURBVE9SOgotCQkJCXNldFZhbGlkYXRvcigoVmFsaWRhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fRlVOQ1RJT05TOgotCQkJCWdldEZ1bmN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9FWFRFTlNJT05TOgotCQkJCWdldFRhZ2xpYkV4dGVuc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFnTGliVmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFnTGliVmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwganNwVmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoanNwVmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hvcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaG9ydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVyaTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJpKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGJiNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBUYWdsaWJGYWN0b3J5ewotIAotCXB1YmxpYyBUYWdsaWJGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsgCQkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCOiByZXR1cm4gY3JlYXRlVGFnTGliKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBRzogcmV0dXJuIGNyZWF0ZUpTUFRhZygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlSlNQVGFnQXR0cmlidXRlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SOiByZXR1cm4gY3JlYXRlVmFsaWRhdG9yKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFOiByZXR1cm4gY3JlYXRlSlNQVmFyaWFibGUoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTjogcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEU6IHJldHVybiBjcmVhdGVUYWdGaWxlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTjogcmV0dXJuIGNyZWF0ZVRsZEV4dGVuc2lvbigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5CT0RZX0NPTlRFTlRfVFlQRTogewotCQkJCUJvZHlDb250ZW50VHlwZSByZXN1bHQgPSBCb2R5Q29udGVudFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfU0NSSVBUSU5HX1ZBUklBQkxFX1NDT1BFOiB7Ci0JCQkJSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSByZXN1bHQgPSBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkJPRFlfQ09OVEVOVF9UWVBFOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9TQ1JJUFRJTkdfVkFSSUFCTEVfU0NPUEU6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLXB1YmxpYyBzdGF0aWMgVGFnbGliRmFjdG9yeSBnZXRBY3RpdmVGYWN0b3J5KCkgewotCXJldHVybiAoVGFnbGliRmFjdG9yeSkgZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVGFnTGliIGNyZWF0ZVRhZ0xpYigpIHsKLQkJVGFnTGliSW1wbCB0YWdMaWIgPSBuZXcgVGFnTGliSW1wbCgpOwotCQlyZXR1cm4gdGFnTGliOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKCkgewotCQlWYWxpZGF0b3JJbXBsIHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JJbXBsKCk7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEpTUFRhZyBjcmVhdGVKU1BUYWcoKSB7Ci0JCUpTUFRhZ0ltcGwganNwVGFnID0gbmV3IEpTUFRhZ0ltcGwoKTsKLQkJcmV0dXJuIGpzcFRhZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSlNQVGFnQXR0cmlidXRlIGNyZWF0ZUpTUFRhZ0F0dHJpYnV0ZSgpIHsKLQkJSlNQVGFnQXR0cmlidXRlSW1wbCBqc3BUYWdBdHRyaWJ1dGUgPSBuZXcgSlNQVGFnQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4ganNwVGFnQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKU1BWYXJpYWJsZSBjcmVhdGVKU1BWYXJpYWJsZSgpIHsKLQkJSlNQVmFyaWFibGVJbXBsIGpzcFZhcmlhYmxlID0gbmV3IEpTUFZhcmlhYmxlSW1wbCgpOwotCQlyZXR1cm4ganNwVmFyaWFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKCkgewotCQlGdW5jdGlvbkltcGwgZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25JbXBsKCk7Ci0JCXJldHVybiBmdW5jdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFnRmlsZSBjcmVhdGVUYWdGaWxlKCkgewotCQlUYWdGaWxlSW1wbCB0YWdGaWxlID0gbmV3IFRhZ0ZpbGVJbXBsKCk7Ci0JCXJldHVybiB0YWdGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUbGRFeHRlbnNpb24gY3JlYXRlVGxkRXh0ZW5zaW9uKCkgewotCQlUbGRFeHRlbnNpb25JbXBsIHRsZEV4dGVuc2lvbiA9IG5ldyBUbGRFeHRlbnNpb25JbXBsKCk7Ci0JCXJldHVybiB0bGRFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFRhZ2xpYlBhY2thZ2UgZ2V0VGFnbGliUGFja2FnZSgpIHsKLQkJcmV0dXJuIChUYWdsaWJQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBUYWdsaWJQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMGNlYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5Cb2R5Q29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnbGliUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBUYWdsaWJQYWNrYWdlLCBFUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFnTGliRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcFRhZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFsaWRhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpzcFZhcmlhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZ1bmN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhZ0ZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGxkRXh0ZW5zaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVuc2libGVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gYm9keUNvbnRlbnRUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0gPSBudWxsOwotCi0JCSAgIC8qKgotCQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkJICovCi0JcHJpdmF0ZSBUYWdsaWJQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgVGFnbGliRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFnbGliUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoVGFnbGliUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFRhZ2xpYlBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0JCUphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVRhZ2xpYlBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVRhZ2xpYlBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYWdMaWIoKSB7Ci0JCXJldHVybiB0YWdMaWJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliX1RhZ0xpYlZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJfSnNwVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0xpYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0xpYl9TaG9ydE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJfVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnTGliX1RhZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWdMaWJfVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFnTGliRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnTGliX0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhZ0xpYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhZ0xpYl9GdW5jdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YWdMaWJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWdMaWJfVGFnbGliRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhZ0xpYkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbGlkYXRvcl9WYWxpZGF0b3JDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXZhbGlkYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbGlkYXRvcl9Jbml0UGFyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdmFsaWRhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VmFsaWRhdG9yX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXZhbGlkYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SlNQVGFnKCkgewotCQlyZXR1cm4ganNwVGFnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ19Cb2R5Q29udGVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ19FeGFtcGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVGFnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SlNQVGFnX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdfRHluYW1pY0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BUYWdfQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFRhZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUFRhZ19WYXJpYWJsZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BUYWdfVGFnQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKU1BUYWdfVGVpQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqc3BUYWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEpTUFRhZ0F0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGpzcFRhZ0F0dHJpYnV0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUYWdBdHRyaWJ1dGVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9SZXF1aXJlZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9SdEV4cHJWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFRhZ0F0dHJpYnV0ZV9GcmFnbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpTUFRhZ0F0dHJpYnV0ZV9UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwVGFnQXR0cmlidXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVGFnQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SlNQVmFyaWFibGUoKSB7Ci0JCXJldHVybiBqc3BWYXJpYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9OYW1lR2l2ZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BWYXJpYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpTUFZhcmlhYmxlX05hbWVGcm9tQXR0cmlidXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVmFyaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9EZWNsYXJlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwVmFyaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BWYXJpYWJsZV9TY29wZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFZhcmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVmFyaWFibGVfVmFyaWFibGVDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpzcFZhcmlhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SlNQVmFyaWFibGVfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpanNwVmFyaWFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZ1bmN0aW9uKCkgewotCQlyZXR1cm4gZnVuY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RnVuY3Rpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZ1bmN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RnVuY3Rpb25fU2lnbmF0dXJlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZnVuY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGdW5jdGlvbl9FeGFtcGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZnVuY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGdW5jdGlvbl9GdW5jdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZnVuY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmdW5jdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFnRmlsZSgpIHsKLQkJcmV0dXJuIHRhZ0ZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnRmlsZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhZ0ZpbGVfUGF0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhZ0ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdGaWxlX0V4YW1wbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YWdGaWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnRmlsZV9UYWdFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFnRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGxkRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gdGxkRXh0ZW5zaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRsZEV4dGVuc2lvbl9OYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0bGRFeHRlbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUbGRFeHRlbnNpb25fRXh0ZW5zaW9uRWxlbWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0bGRFeHRlbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVuc2libGVUeXBlKCkgewotCQlyZXR1cm4gZXh0ZW5zaWJsZVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJsZVR5cGVfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlleHRlbnNpYmxlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRCb2R5Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBib2R5Q29udGVudFR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSgpIHsKLQkJcmV0dXJuIGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVGFnbGliRmFjdG9yeSBnZXRUYWdsaWJGYWN0b3J5KCkgewotCQlyZXR1cm4gKFRhZ2xpYkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJdGFnTGliRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBR19MSUIpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX0pTUF9WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1NIT1JUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVVJJKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX1RBR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVkFMSURBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdMaWJFQ2xhc3MsIFRBR19MSUJfX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFnTGliRUNsYXNzLCBUQUdfTElCX19GVU5DVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhZ0xpYkVDbGFzcywgVEFHX0xJQl9fVEFHTElCX0VYVEVOU0lPTlMpOwotCi0JCWpzcFRhZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKU1BfVEFHKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX0JPRFlfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVGFnRUNsYXNzLCBKU1BfVEFHX19FWEFNUExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0VDbGFzcywgSlNQX1RBR19fRFlOQU1JQ19BVFRSSUJVVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX0FUVFJJQlVURVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcFRhZ0VDbGFzcywgSlNQX1RBR19fVkFSSUFCTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdFQ2xhc3MsIEpTUF9UQUdfX1RBR19DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwVGFnRUNsYXNzLCBKU1BfVEFHX19URUlfQ0xBU1MpOwotCi0JCWpzcFRhZ0F0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKU1BfVEFHX0FUVFJJQlVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVGFnQXR0cmlidXRlRUNsYXNzLCBKU1BfVEFHX0FUVFJJQlVURV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoanNwVGFnQXR0cmlidXRlRUNsYXNzLCBKU1BfVEFHX0FUVFJJQlVURV9fUkVRVUlSRUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0F0dHJpYnV0ZUVDbGFzcywgSlNQX1RBR19BVFRSSUJVVEVfX1JUX0VYUFJfVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFRhZ0F0dHJpYnV0ZUVDbGFzcywgSlNQX1RBR19BVFRSSUJVVEVfX0ZSQUdNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUF9UQUdfQVRUUklCVVRFX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUF9UQUdfQVRUUklCVVRFX19ERVNDUklQVElPTlMpOwotCi0JCXZhbGlkYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhWQUxJREFUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHZhbGlkYXRvckVDbGFzcywgVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHZhbGlkYXRvckVDbGFzcywgVkFMSURBVE9SX19JTklUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodmFsaWRhdG9yRUNsYXNzLCBWQUxJREFUT1JfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJanNwVmFyaWFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX1ZBUklBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19OQU1FX0ZST01fQVRUUklCVVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19ERUNMQVJFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqc3BWYXJpYWJsZUVDbGFzcywgSlNQX1ZBUklBQkxFX19TQ09QRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoanNwVmFyaWFibGVFQ2xhc3MsIEpTUF9WQVJJQUJMRV9fVkFSSUFCTEVfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGpzcFZhcmlhYmxlRUNsYXNzLCBKU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUyk7Ci0KLQkJZnVuY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRlVOQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGZ1bmN0aW9uRUNsYXNzLCBGVU5DVElPTl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZnVuY3Rpb25FQ2xhc3MsIEZVTkNUSU9OX19TSUdOQVRVUkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZ1bmN0aW9uRUNsYXNzLCBGVU5DVElPTl9fRVhBTVBMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZnVuY3Rpb25FQ2xhc3MsIEZVTkNUSU9OX19GVU5DVElPTl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZnVuY3Rpb25FQ2xhc3MsIEZVTkNUSU9OX19GVU5DVElPTl9FWFRFTlNJT05TKTsKLQotCQl0YWdGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBR19GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdGaWxlRUNsYXNzLCBUQUdfRklMRV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFnRmlsZUVDbGFzcywgVEFHX0ZJTEVfX1BBVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhZ0ZpbGVFQ2xhc3MsIFRBR19GSUxFX19FWEFNUExFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YWdGaWxlRUNsYXNzLCBUQUdfRklMRV9fVEFHX0VYVEVOU0lPTlMpOwotCi0JCXRsZEV4dGVuc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUTERfRVhURU5TSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0bGRFeHRlbnNpb25FQ2xhc3MsIFRMRF9FWFRFTlNJT05fX05BTUVTUEFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGxkRXh0ZW5zaW9uRUNsYXNzLCBUTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFMpOwotCi0JCWV4dGVuc2libGVUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYVEVOU0lCTEVfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZW5zaWJsZVR5cGVFQ2xhc3MsIEVYVEVOU0lCTEVfVFlQRV9fVkFMVUUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlib2R5Q29udGVudFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEJPRFlfQ09OVEVOVF9UWVBFKTsKLQkJanNwU2NyaXB0aW5nVmFyaWFibGVTY29wZUVFbnVtID0gY3JlYXRlRUVudW0oSlNQX1NDUklQVElOR19WQVJJQUJMRV9TQ09QRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl0YWdMaWJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJanNwVGFnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJZnVuY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQl0YWdGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHRhZ0xpYkVDbGFzcywgVGFnTGliLmNsYXNzLCAiVGFnTGliIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfVGFnTGliVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnTGliVmVyc2lvbiIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX0pzcFZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpzcFZlcnNpb24iLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9TaG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNob3J0TmFtZSIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX1VyaSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJpIiwgbnVsbCwgMCwgMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfVGFncygpLCB0aGlzLmdldEpTUFRhZygpLCBudWxsLCAidGFncyIsIG51bGwsIDEsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9WYWxpZGF0b3IoKSwgdGhpcy5nZXRWYWxpZGF0b3IoKSwgbnVsbCwgInZhbGlkYXRvciIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFnTGliX0xpc3RlbmVycygpLCB0aGVDb21tb25QYWNrYWdlLmdldExpc3RlbmVyKCksIG51bGwsICJsaXN0ZW5lcnMiLCBudWxsLCAwLCAtMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfRnVuY3Rpb25zKCksIHRoaXMuZ2V0RnVuY3Rpb24oKSwgbnVsbCwgImZ1bmN0aW9ucyIsIG51bGwsIDAsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9UYWdsaWJFeHRlbnNpb25zKCksIHRoaXMuZ2V0VGxkRXh0ZW5zaW9uKCksIG51bGwsICJ0YWdsaWJFeHRlbnNpb25zIiwgbnVsbCwgMCwgLTEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpzcFRhZ0VDbGFzcywgSlNQVGFnLmNsYXNzLCAiSlNQVGFnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdfQm9keUNvbnRlbnQoKSwgdGhpcy5nZXRCb2R5Q29udGVudFR5cGUoKSwgImJvZHlDb250ZW50IiwgbnVsbCwgMCwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ19FeGFtcGxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleGFtcGxlIiwgbnVsbCwgMCwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnX0R5bmFtaWNBdHRyaWJ1dGVzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZHluYW1pY0F0dHJpYnV0ZXMiLCBudWxsLCAwLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ19BdHRyaWJ1dGVzKCksIHRoaXMuZ2V0SlNQVGFnQXR0cmlidXRlKCksIG51bGwsICJhdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnX1ZhcmlhYmxlcygpLCB0aGlzLmdldEpTUFZhcmlhYmxlKCksIG51bGwsICJ2YXJpYWJsZXMiLCBudWxsLCAwLCAtMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdfVGFnQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ0YWdDbGFzcyIsIG51bGwsIDEsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnX1RlaUNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidGVpQ2xhc3MiLCBudWxsLCAxLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIkpTUFRhZ0F0dHJpYnV0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnQXR0cmlidXRlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9SZXF1aXJlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlcXVpcmVkIiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9SdEV4cHJWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJ0RXhwclZhbHVlIiwgImZhbHNlIiwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9GcmFnbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZyYWdtZW50IiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdBdHRyaWJ1dGVfVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInR5cGUiLCBudWxsLCAwLCAxLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ0F0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHZhbGlkYXRvckVDbGFzcywgVmFsaWRhdG9yLmNsYXNzLCAiVmFsaWRhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRWYWxpZGF0b3JfVmFsaWRhdG9yQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ2YWxpZGF0b3JDbGFzcyIsIG51bGwsIDAsIDEsIFZhbGlkYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VmFsaWRhdG9yX0luaXRQYXJhbXMoKSwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmdldEluaXRQYXJhbSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBWYWxpZGF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFZhbGlkYXRvcl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFZhbGlkYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpzcFZhcmlhYmxlRUNsYXNzLCBKU1BWYXJpYWJsZS5jbGFzcywgIkpTUFZhcmlhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BWYXJpYWJsZV9OYW1lR2l2ZW4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVHaXZlbiIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BWYXJpYWJsZV9OYW1lRnJvbUF0dHJpYnV0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZUZyb21BdHRyaWJ1dGUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfRGVjbGFyZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRlY2xhcmUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfU2NvcGUoKSwgdGhpcy5nZXRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKCksICJzY29wZSIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BWYXJpYWJsZV9WYXJpYWJsZUNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidmFyaWFibGVDbGFzcyIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BWYXJpYWJsZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZnVuY3Rpb25FQ2xhc3MsIEZ1bmN0aW9uLmNsYXNzLCAiRnVuY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZ1bmN0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RnVuY3Rpb25fU2lnbmF0dXJlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzaWduYXR1cmUiLCBudWxsLCAwLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RnVuY3Rpb25fRXhhbXBsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIDEsIEZ1bmN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGdW5jdGlvbl9GdW5jdGlvbkNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZnVuY3Rpb25DbGFzcyIsIG51bGwsIDEsIDEsIEZ1bmN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKSwgdGhpcy5nZXRUbGRFeHRlbnNpb24oKSwgbnVsbCwgImZ1bmN0aW9uRXh0ZW5zaW9ucyIsIG51bGwsIDAsIC0xLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhZ0ZpbGVFQ2xhc3MsIFRhZ0ZpbGUuY2xhc3MsICJUYWdGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX1BhdGgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhdGgiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX0V4YW1wbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImV4YW1wbGUiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdGaWxlX1RhZ0V4dGVuc2lvbnMoKSwgdGhpcy5nZXRUbGRFeHRlbnNpb24oKSwgbnVsbCwgInRhZ0V4dGVuc2lvbnMiLCBudWxsLCAwLCAtMSwgVGFnRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRsZEV4dGVuc2lvbkVDbGFzcywgVGxkRXh0ZW5zaW9uLmNsYXNzLCAiVGxkRXh0ZW5zaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUbGRFeHRlbnNpb25fTmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBUbGRFeHRlbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRsZEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpLCB0aGlzLmdldEV4dGVuc2libGVUeXBlKCksIG51bGwsICJleHRlbnNpb25FbGVtZW50cyIsIG51bGwsIDEsIC0xLCBUbGRFeHRlbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhleHRlbnNpYmxlVHlwZUVDbGFzcywgRXh0ZW5zaWJsZVR5cGUuY2xhc3MsICJFeHRlbnNpYmxlVHlwZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFeHRlbnNpYmxlVHlwZV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmxlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5jbGFzcywgIkJvZHlDb250ZW50VHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5UQUdERVBFTkRFTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChib2R5Q29udGVudFR5cGVFRW51bSwgQm9keUNvbnRlbnRUeXBlLkpTUF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJvZHlDb250ZW50VHlwZUVFbnVtLCBCb2R5Q29udGVudFR5cGUuRU1QVFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChib2R5Q29udGVudFR5cGVFRW51bSwgQm9keUNvbnRlbnRUeXBlLlNDUklQVExFU1NfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bSwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5jbGFzcywgIkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bSwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5ORVNURURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuQVRfQkVHSU5fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuQVRfRU5EX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9UYWdsaWJQYWNrYWdlSW1wbAotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UbGRFeHRlbnNpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UbGRFeHRlbnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTM5YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGxkRXh0ZW5zaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UbGQgRXh0ZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UbGRFeHRlbnNpb25JbXBsI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UbGRFeHRlbnNpb25JbXBsI2dldEV4dGVuc2lvbkVsZW1lbnRzIDxlbT5FeHRlbnNpb24gRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUbGRFeHRlbnNpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUbGRFeHRlbnNpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2UoKSA8ZW0+TmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2UoKSA8ZW0+TmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlID0gTkFNRVNQQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKSA8ZW0+RXh0ZW5zaW9uIEVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuc2lvbkVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5zaW9uRWxlbWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRsZEV4dGVuc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRS5nZXRUbGRFeHRlbnNpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5ld05hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQluYW1lc3BhY2UgPSBuZXdOYW1lc3BhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fTkFNRVNQQUNFLCBvbGROYW1lc3BhY2UsIG5hbWVzcGFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbnNpb25FbGVtZW50cygpIHsKLQkJaWYgKGV4dGVuc2lvbkVsZW1lbnRzID09IG51bGwpIHsKLQkJCWV4dGVuc2lvbkVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4dGVuc2libGVUeXBlLmNsYXNzLCB0aGlzLCBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX0VYVEVOU0lPTl9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuc2lvbkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX05BTUVTUEFDRToKLQkJCQlyZXR1cm4gZ2V0TmFtZXNwYWNlKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fRVhURU5TSU9OX0VMRU1FTlRTOgotCQkJCXJldHVybiBnZXRFeHRlbnNpb25FbGVtZW50cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6Ci0JCQkJc2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19FWFRFTlNJT05fRUxFTUVOVFM6Ci0JCQkJZ2V0RXh0ZW5zaW9uRWxlbWVudHMoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuc2lvbkVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX05BTUVTUEFDRToKLQkJCQlzZXROYW1lc3BhY2UoTkFNRVNQQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fRVhURU5TSU9OX0VMRU1FTlRTOgotCQkJCWdldEV4dGVuc2lvbkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6Ci0JCQkJcmV0dXJuIE5BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlICE9IG51bGwgOiAhTkFNRVNQQUNFX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2UpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRMRF9FWFRFTlNJT05fX0VYVEVOU0lPTl9FTEVNRU5UUzoKLQkJCQlyZXR1cm4gZXh0ZW5zaW9uRWxlbWVudHMgIT0gbnVsbCAmJiAhZXh0ZW5zaW9uRWxlbWVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZXNwYWNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lc3BhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UbGRFeHRlbnNpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9WYWxpZGF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9WYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjZkMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci0KLQotLyoqCi0gKiBUaGUgdmFsaWRhdG9yIGVsZW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9ySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsaWRhdG9yLCBFT2JqZWN0ewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyB2YWxpZGF0b3JDbGFzcyA9IG51bGw7Ci0JcHVibGljIFZhbGlkYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsaWRhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRWYWxpZGF0b3JDbGFzcygpIHsKLQkJaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwgJiYgdmFsaWRhdG9yQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZFZhbGlkYXRvckNsYXNzID0gdmFsaWRhdG9yQ2xhc3M7Ci0JCQl2YWxpZGF0b3JDbGFzcyA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXZhbGlkYXRvckNsYXNzKTsKLQkJCWlmICh2YWxpZGF0b3JDbGFzcyAhPSBvbGRWYWxpZGF0b3JDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1MsIG9sZFZhbGlkYXRvckNsYXNzLCB2YWxpZGF0b3JDbGFzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZGF0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JDbGFzcyhKYXZhQ2xhc3MgbmV3VmFsaWRhdG9yQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZFZhbGlkYXRvckNsYXNzID0gdmFsaWRhdG9yQ2xhc3M7Ci0JCXZhbGlkYXRvckNsYXNzID0gbmV3VmFsaWRhdG9yQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1MsIG9sZFZhbGlkYXRvckNsYXNzLCB2YWxpZGF0b3JDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbml0UGFyYW1zKCkgewotCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluaXRQYXJhbS5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX1ZBTElEQVRPUl9DTEFTUzoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFZhbGlkYXRvckNsYXNzKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VmFsaWRhdG9yQ2xhc3MoKTsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX1ZBTElEQVRPUl9DTEFTUzoKLQkJCQlzZXRWYWxpZGF0b3JDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1M6Ci0JCQkJc2V0VmFsaWRhdG9yQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX1ZBTElEQVRPUl9DTEFTUzoKLQkJCQlyZXR1cm4gdmFsaWRhdG9yQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBpbml0UGFyYW1zICE9IG51bGwgJiYgIWluaXRQYXJhbXMuaXNFbXB0eSgpOwotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXM9bnVsbDsKLQotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0VmFsaWRhdG9yQ2xhc3M9ZmFsc2U7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvdXRpbC9UYWdsaWJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL3V0aWwvVGFnbGliQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5ZDNjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvdXRpbC9UYWdsaWJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFRhZ0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ0xpYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5WYWxpZGF0b3I7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGFnbGliQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgVGFnbGliUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQlwdWJsaWMgVGFnbGliQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KXR5cGUpLmVDbGFzcygpLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBUYWdsaWJTd2l0Y2ggc3cgPSBuZXcgVGFnbGliU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWIoVGFnTGliIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhZ0xpYkFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWxpZGF0b3IoVmFsaWRhdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVZhbGlkYXRvckFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWcoSlNQVGFnIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUpTUFRhZ0FkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdBdHRyaWJ1dGUoSlNQVGFnQXR0cmlidXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUpTUFRhZ0F0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BWYXJpYWJsZShKU1BWYXJpYWJsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVKU1BWYXJpYWJsZUFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpc3cuZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdMaWJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWxpZGF0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUYWdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUYWdBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BWYXJpYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlR2VuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYWdsaWJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgVGFnbGliU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliKFRhZ0xpYiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFnTGliQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQVGFnKEpTUFRhZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSlNQVGFnQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQVGFnQXR0cmlidXRlKEpTUFRhZ0F0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSlNQVGFnQXR0cmlidXRlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVmFsaWRhdG9yKFZhbGlkYXRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSlNQVmFyaWFibGUoSlNQVmFyaWFibGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpTUFZhcmlhYmxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRnVuY3Rpb24oRnVuY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGFnRmlsZShUYWdGaWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYWdGaWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGxkRXh0ZW5zaW9uKFRsZEV4dGVuc2lvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGxkRXh0ZW5zaW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJsZVR5cGUoRXh0ZW5zaWJsZVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuc2libGVUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckdlbihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXMuCi0JICogSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdMaWJBZGFwdGVyR2VuKCkgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWxpZGF0b3JBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUYWdBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUYWdBdHRyaWJ1dGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BWYXJpYWJsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkZ1bmN0aW9uIDxlbT5GdW5jdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRnVuY3Rpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlIDxlbT5UYWcgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnRmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdGaWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGxkRXh0ZW5zaW9uIDxlbT5UbGQgRXh0ZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGxkRXh0ZW5zaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUgPGVtPkV4dGVuc2libGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRXh0ZW5zaWJsZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5zaWJsZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1RhZ2xpYkFkYXB0ZXJGYWN0b3J5Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvdXRpbC9UYWdsaWJTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC91dGlsL1RhZ2xpYlN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2NmY2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC91dGlsL1RhZ2xpYlN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkV4dGVuc2libGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5KU1BUYWdBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLkpTUFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdMaWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRsZEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYkZhY3RvcnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgVGFnbGliU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRhZ2xpYlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWdsaWJGYWN0b3J5IGZhY3Rvcnk7Ci0KLQlwdWJsaWMgVGFnbGliU3dpdGNoKCkgewotCQlmYWN0b3J5ID0gKFRhZ2xpYkZhY3RvcnkpVGFnbGliRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJbW9kZWxQYWNrYWdlID0gVGFnbGliRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCX0KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQkgICAgIEVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotICAgICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgIT0gbW9kZWxQYWNrYWdlKSByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgIAotCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUI6Ci0JCQkgICAgewotCQkJCVRhZ0xpYiBjYXN0ZWRPYmplY3QgPSAoVGFnTGliKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYWdMaWIoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkgICAgfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUjoKLQkJCSAgICB7Ci0JCQkJVmFsaWRhdG9yIGNhc3RlZE9iamVjdCA9IChWYWxpZGF0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbGlkYXRvcihjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCSAgICB9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBRzoKLQkJCSAgICB7Ci0JCQkJSlNQVGFnIGNhc3RlZE9iamVjdCA9IChKU1BUYWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpTUFRhZyhjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCSAgICB9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEU6Ci0JCQkgICAgewotCQkJCUpTUFRhZ0F0dHJpYnV0ZSBjYXN0ZWRPYmplY3QgPSAoSlNQVGFnQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BUYWdBdHRyaWJ1dGUoY2FzdGVkT2JqZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkgICAgfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9WQVJJQUJMRToKLQkJCSAgICB7Ci0JCQkJSlNQVmFyaWFibGUgY2FzdGVkT2JqZWN0ID0gKEpTUFZhcmlhYmxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BWYXJpYWJsZShjYXN0ZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCSAgICB9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9IC8vIGRvU3dpdGNoCi0KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWIoVGFnTGliIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWxpZGF0b3IoVmFsaWRhdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWcoSlNQVGFnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdBdHRyaWJ1dGUoSlNQVGFnQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BWYXJpYWJsZShKU1BWYXJpYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaEdlbihFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19MSUI6IHsKLQkJCQlUYWdMaWIgdGFnTGliID0gKFRhZ0xpYil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGFnTGliKHRhZ0xpYik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAodGFnTGliKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKHRhZ0xpYik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUc6IHsKLQkJCQlKU1BUYWcganNwVGFnID0gKEpTUFRhZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSlNQVGFnKGpzcFRhZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChqc3BUYWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURTogewotCQkJCUpTUFRhZ0F0dHJpYnV0ZSBqc3BUYWdBdHRyaWJ1dGUgPSAoSlNQVGFnQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BUYWdBdHRyaWJ1dGUoanNwVGFnQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SOiB7Ci0JCQkJVmFsaWRhdG9yIHZhbGlkYXRvciA9IChWYWxpZGF0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbGlkYXRvcih2YWxpZGF0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEU6IHsKLQkJCQlKU1BWYXJpYWJsZSBqc3BWYXJpYWJsZSA9IChKU1BWYXJpYWJsZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSlNQVmFyaWFibGUoanNwVmFyaWFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTjogewotCQkJCUZ1bmN0aW9uIGZ1bmN0aW9uID0gKEZ1bmN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGdW5jdGlvbihmdW5jdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChmdW5jdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFOiB7Ci0JCQkJVGFnRmlsZSB0YWdGaWxlID0gKFRhZ0ZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhZ0ZpbGUodGFnRmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cCh0YWdGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTjogewotCQkJCVRsZEV4dGVuc2lvbiB0bGRFeHRlbnNpb24gPSAoVGxkRXh0ZW5zaW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUbGRFeHRlbnNpb24odGxkRXh0ZW5zaW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFOiB7Ci0JCQkJRXh0ZW5zaWJsZVR5cGUgZXh0ZW5zaWJsZVR5cGUgPSAoRXh0ZW5zaWJsZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVUeXBlKGV4dGVuc2libGVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWJHZW4oVGFnTGliIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWxpZGF0b3JHZW4oVmFsaWRhdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdHZW4oSlNQVGFnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdBdHRyaWJ1dGVHZW4oSlNQVGFnQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BWYXJpYWJsZUdlbihKU1BWYXJpYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZ1bmN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZ1bmN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGdW5jdGlvbihGdW5jdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBGaWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBGaWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdGaWxlKFRhZ0ZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UbGQgRXh0ZW5zaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRsZCBFeHRlbnNpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRsZEV4dGVuc2lvbihUbGRFeHRlbnNpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmxlVHlwZShFeHRlbnNpYmxlVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlR2VuKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1RhZ2xpYlN3aXRjaAotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0F1dGhDb25zdHJhaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9BdXRoQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWVlNTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0F1dGhDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIFRoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlIHVzZWQgaGVyZSBtdXN0IGFwcGVhciBpbiBhIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXV0aENvbnN0cmFpbnQgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBhdXRoIGNvbnN0cmFpbnQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRGVzY3JpcHRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJvbGVzIGF0dHJpYnV0ZQotCSAqIEEgbGlzdCBvZiByb2xlIG5hbWVzIGZvciB0aGUgYXV0aCBjb25zdHJhaW50LiAgRWFjaCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAqIG9mIGEgc2VjdXJpdHkgcm9sZSAoYSBTdHJpbmcpLgotCi0JICovCi0JRUxpc3QgZ2V0Um9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNlY0NvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0JU2VjdXJpdHlDb25zdHJhaW50IGdldFNlY0NvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNlY0NvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRTZWNDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9BdXRoTWV0aG9kS2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQXV0aE1ldGhvZEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MGY5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9BdXRoTWV0aG9kS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIEF1dGhNZXRob2RLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1BFQ0lGSUVEID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNJQyA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHRVNUID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfQ0VSVCA9IDQ7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+VU5TUEVDSUZJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VTlNQRUNJRklFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVTlNQRUNJRklFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgVU5TUEVDSUZJRURfTElURVJBTCA9IG5ldyBBdXRoTWV0aG9kS2luZChVTlNQRUNJRklFRCwgIlVOU1BFQ0lGSUVEIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QkFTSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CQVNJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNCQVNJQwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgQkFTSUNfTElURVJBTCA9IG5ldyBBdXRoTWV0aG9kS2luZChCQVNJQywgIkJBU0lDIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RElHRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RElHRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RJR0VTVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgRElHRVNUX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoRElHRVNULCAiRElHRVNUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Rk9STTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZPUk08L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRk9STQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgRk9STV9MSVRFUkFMID0gbmV3IEF1dGhNZXRob2RLaW5kKEZPUk0sICJGT1JNIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0xJRU5UIENFUlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DTElFTlQgQ0VSVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDTElFTlRfQ0VSVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgQ0xJRU5UX0NFUlRfTElURVJBTCA9IG5ldyBBdXRoTWV0aG9kS2luZChDTElFTlRfQ0VSVCwgIkNMSUVOVF9DRVJUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkF1dGggTWV0aG9kIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEF1dGhNZXRob2RLaW5kW10gewotCQkJVU5TUEVDSUZJRURfTElURVJBTCwKLQkJCUJBU0lDX0xJVEVSQUwsCi0JCQlESUdFU1RfTElURVJBTCwKLQkJCUZPUk1fTElURVJBTCwKLQkJCUNMSUVOVF9DRVJUX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QXV0aCBNZXRob2QgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0aCBNZXRob2QgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1dGhNZXRob2RLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJQXV0aE1ldGhvZEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BdXRoIE1ldGhvZCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1dGhNZXRob2RLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBVTlNQRUNJRklFRDogcmV0dXJuIFVOU1BFQ0lGSUVEX0xJVEVSQUw7Ci0JCQljYXNlIEJBU0lDOiByZXR1cm4gQkFTSUNfTElURVJBTDsKLQkJCWNhc2UgRElHRVNUOiByZXR1cm4gRElHRVNUX0xJVEVSQUw7Ci0JCQljYXNlIEZPUk06IHJldHVybiBGT1JNX0xJVEVSQUw7Ci0JCQljYXNlIENMSUVOVF9DRVJUOiByZXR1cm4gQ0xJRU5UX0NFUlRfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQXV0aE1ldGhvZEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vQXV0aE1ldGhvZEtpbmQKLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0NvbnRleHRQYXJhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQ29udGV4dFBhcmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYmQ0OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQ29udGV4dFBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0UGFyYW0gZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBQYXJhbU5hbWUgYXR0cmlidXRlCi0JICogVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFyYW1OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUGFyYW1OYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UGFyYW1OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUGFyYW1WYWx1ZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCi0JICovCi0JU3RyaW5nIGdldFBhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBQYXJhbVZhbHVlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Rpc3BhdGNoZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9EaXNwYXRjaGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjRjM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Rpc3BhdGNoZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldERpc3BhdGNoZXJUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlzcGF0Y2hlclR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GT1JXQVJEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRk9SV0FSRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SV0FSRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTkNMVURFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5DTFVERV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVRVUVTVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FUlJPUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VSUk9SX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GT1JXQVJEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Rk9SV0FSRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGT1JXQVJECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBGT1JXQVJEX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoRk9SV0FSRCwgIkZPUldBUkQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTkNMVURFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5DTFVERTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTkNMVURFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBJTkNMVURFX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoSU5DTFVERSwgIklOQ0xVREUiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVRVUVTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVRVNUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBSRVFVRVNUX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoUkVRVUVTVCwgIlJFUVVFU1QiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FUlJPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVSUk9SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VSUk9SCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBFUlJPUl9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKEVSUk9SLCAiRVJST1IiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBEaXNwYXRjaGVyVHlwZVtdIHsKLQkJCUZPUldBUkRfTElURVJBTCwKLQkJCUlOQ0xVREVfTElURVJBTCwKLQkJCVJFUVVFU1RfTElURVJBTCwKLQkJCUVSUk9SX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwYXRjaGVyVHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURpc3BhdGNoZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BhdGNoZXJUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBGT1JXQVJEOiByZXR1cm4gRk9SV0FSRF9MSVRFUkFMOwotCQkJY2FzZSBJTkNMVURFOiByZXR1cm4gSU5DTFVERV9MSVRFUkFMOwotCQkJY2FzZSBSRVFVRVNUOiByZXR1cm4gUkVRVUVTVF9MSVRFUkFMOwotCQkJY2FzZSBFUlJPUjogcmV0dXJuIEVSUk9SX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpc3BhdGNoZXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0Rpc3BhdGNoZXJUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FcnJvckNvZGVFcnJvclBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Vycm9yQ29kZUVycm9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGYwNTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Vycm9yQ29kZUVycm9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVycm9yQ29kZUVycm9yUGFnZSBleHRlbmRzIEVycm9yUGFnZXsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRXJyb3JDb2RlIGF0dHJpYnV0ZQotCSAqIFRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotCi0JICovCi0JU3RyaW5nIGdldEVycm9yQ29kZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEVycm9yQ29kZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldEVycm9yQ29kZShTdHJpbmcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRXJyb3JQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5YzI3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBUaGUgZXJyb3ItcGFnZSBlbGVtZW50IGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUgb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXJyb3JQYWdlIGV4dGVuZHMgRU9iamVjdHsKLQotcHVibGljIGJvb2xlYW4gaXNFcnJvckNvZGUoKTsKLXB1YmxpYyBib29sZWFuIGlzRXhjZXB0aW9uVHlwZSgpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBMb2NhdGlvbiBhdHRyaWJ1dGUKLQkgKiBUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZSB3ZWIKLQkgKiBhcHBsaWNhdGlvbgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvY2F0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5MGZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9FeGNlcHRpb25UeXBlRXJyb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBleHRlbmRzIEVycm9yUGFnZSB7Ci0KLQotCi0KLXB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uVHlwZU5hbWUoKSA7Ci12b2lkIHNldEV4Y2VwdGlvblR5cGVOYW1lKFN0cmluZyBleGNlcHRpb25UeXBlTmFtZSkgOwotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgQGxpbmt7I3NldEV4Y2VwdGlvblR5cGVOYW1lKFN0cmluZyl9Ci0gKi8KLXZvaWQgc2V0RXhjZXB0aW9uVHlwZU5hbWUoU3RyaW5nIGV4Y2VwdGlvblR5cGVOYW1lLCBSZXNvdXJjZVNldCBjb250ZXh0KSA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRXhjZXB0aW9uVHlwZSByZWZlcmVuY2UKLQkgKiBUaGUgZXhjZXB0aW9uIHR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uCi0JICogdHlwZS4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RXhjZXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRXhjZXB0aW9uVHlwZSByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEV4Y2VwdGlvblR5cGUoSmF2YUNsYXNzIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0ZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDlmOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYSBVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlIGZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQotcHVibGljIFN0cmluZyBnZXRGaWx0ZXJDbGFzc05hbWUoKTsKLXB1YmxpYyB2b2lkIHNldEZpbHRlckNsYXNzTmFtZShTdHJpbmcgZmlsdGVyQ2xhc3NOYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmlsdGVyLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSW5pdFBhcmFtcyByZWZlcmVuY2VzCi0JICogVGhlIGluaXQtcGFyYW1zIGNvbnRhaW4gYSBuYW1lLy92YWx1ZSBwYWlycyBhcyBpbml0aWFsaXphdGlvbiBwYXJhbXMgZm9yIHRoZQotCSAqIGZpbHRlcgotCi0JICovCi0JRUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRmlsdGVyQ2xhc3MgcmVmZXJlbmNlCi0JICogVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0RmlsdGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIEZpbHRlckNsYXNzIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0RmlsdGVyQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgUGFyYW0gVmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbSBWYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcwotCSAqICAgICAgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtIFZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRGaWx0ZXJfSW5pdFBhcmFtVmFsdWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbml0UGFyYW1WYWx1ZXMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0ZpbHRlck1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0ZpbHRlck1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlMmE5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9GaWx0ZXJNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvIGEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uIHNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhIHNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgPGZpbHRlcm5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIDxmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCi0gKiBAaW52YXJpYW50IFRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgRmlsdGVyOjpuYW1lIG9mIG9uZSBvZiB0aGUgRmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsdGVyTWFwcGluZyBleHRlbmRzIEVPYmplY3R7Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2VydmxldCB0aGF0IHRoaXMgbWFwcGluZyBhcHBsaWVzIHRvLgotICovCi1wdWJsaWMgU3RyaW5nIGdldFNlcnZsZXROYW1lKCk7Ci0vKioKLSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgdGhhdCB0aGlzIG1hcHBpbmcgYXBwbGllcyB0by4KLSAqLwotcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIHNlcnZsZXROYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKiBUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93Ci0JICogdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLgotCSAqLwotCVN0cmluZyBnZXRVcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFVybFBhdHRlcm4oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BhdGNoZXIgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkRpc3BhdGNoZXJUeXBlfS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlclR5cGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZSIgdXBwZXI9IjQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERpc3BhdGNoZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBGaWx0ZXIgcmVmZXJlbmNlCi0JICogVGhlIGZpbHRlciBiZWluZyBtYXBwZWQKLQkgKi8KLQlGaWx0ZXIgZ2V0RmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGaWx0ZXIgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRGaWx0ZXIoRmlsdGVyIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNlcnZsZXQgcmVmZXJlbmNlCi0JICogQW4gb3B0aW9uYWwgc2VydmxldCB0aGF0IGlzIG1hcHBlZCBieSBhIGZpbHRlciBtYXBwaW5nLiAgc2VydmxldE5hbWUgaXMgdXNlZCB0byAKLQkgKiByZXNvbHZlIHRoZSBzZXJ2bGV0IHJlZmVyZW5jZS4KLQkgKi8KLQlTZXJ2bGV0IGdldFNlcnZsZXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNlcnZsZXQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRTZXJ2bGV0KFNlcnZsZXQgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRm9ybUxvZ2luQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Gb3JtTG9naW5Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4NjM2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Gb3JtTG9naW5Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBUaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZvcm1Mb2dpbkNvbmZpZyBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEZvcm1Mb2dpblBhZ2UgYXR0cmlidXRlCi0JICogVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBwYWdlCi0JICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlIGZvdW5kCi0JICovCi0JU3RyaW5nIGdldEZvcm1Mb2dpblBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGb3JtTG9naW5QYWdlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Rm9ybUxvZ2luUGFnZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEZvcm1FcnJvclBhZ2UgYXR0cmlidXRlCi0JICogVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciAKLQkgKiBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kCi0JICovCi0JU3RyaW5nIGdldEZvcm1FcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGb3JtRXJyb3JQYWdlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0Rm9ybUVycm9yUGFnZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgTG9naW5Db25maWcgcmVmZXJlbmNlCi0JICovCi0JTG9naW5Db25maWcgZ2V0TG9naW5Db25maWcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIExvZ2luQ29uZmlnIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TG9naW5Db25maWcoTG9naW5Db25maWcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0hUVFBNZXRob2RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDM0NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAgQGRlcHJlY2F0ZWQgc2luY2UgNC8yNS8yMDAzIHVzZSBsaXN0IG9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb259Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGUjZ2V0SHR0cE1ldGhvZCA8ZW0+SHR0cCBNZXRob2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRIVFRQTWV0aG9kVHlwZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUE1ldGhvZFR5cGUgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IdHRwIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IdHRwIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHR0cE1ldGhvZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIdHRwTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZSNnZXRIdHRwTWV0aG9kIDxlbT5IdHRwIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHR0cCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh0dHBNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh0dHBNZXRob2QoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBIVFRQTWV0aG9kVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGVFbnVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9IVFRQTWV0aG9kVHlwZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4YmU5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9IVFRQTWV0aG9kVHlwZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0SFRUUE1ldGhvZFR5cGVFbnVtKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSFRUUE1ldGhvZFR5cGVFbnVtIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5HRVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjR0VUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRVQgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UE9TVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BPU1RfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1QgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFVUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFVUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVVQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REVMRVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjREVMRVRFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVEUgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SEVBRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0hFQURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQUQgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1BUSU9OUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09QVElPTlNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTlMgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VFJBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUUkFDRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0UgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+R0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+R0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0dFVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIEdFVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShHRVQsICJHRVQiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QT1NUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UE9TVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQT1NUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUE9TVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQT1NULCAiUE9TVCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBVVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBVVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQVVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBQVVRfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUFVULCAiUFVUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REVMRVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+REVMRVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RFTEVURQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIERFTEVURV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShERUxFVEUsICJERUxFVEUiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5IRUFEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SEVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNIRUFECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gSEVBRF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShIRUFELCAiSEVBRCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElPTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PUFRJT05TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09QVElPTlMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBPUFRJT05TX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE9QVElPTlMsICJPUFRJT05TIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VFJBQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UUkFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUUkFDRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFRSQUNFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFRSQUNFLCAiVFJBQ0UiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW1bXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSFRUUE1ldGhvZFR5cGVFbnVtW10gewotCQkJR0VUX0xJVEVSQUwsCi0JCQlQT1NUX0xJVEVSQUwsCi0JCQlQVVRfTElURVJBTCwKLQkJCURFTEVURV9MSVRFUkFMLAotCQkJSEVBRF9MSVRFUkFMLAotCQkJT1BUSU9OU19MSVRFUkFMLAotCQkJVFJBQ0VfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5IVFRQIE1ldGhvZCBUeXBlIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUVFBNZXRob2RUeXBlRW51bSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUhUVFBNZXRob2RUeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkhUVFAgTWV0aG9kIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBIVFRQTWV0aG9kVHlwZUVudW0gZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIEdFVDogcmV0dXJuIEdFVF9MSVRFUkFMOwotCQkJY2FzZSBQT1NUOiByZXR1cm4gUE9TVF9MSVRFUkFMOwotCQkJY2FzZSBQVVQ6IHJldHVybiBQVVRfTElURVJBTDsKLQkJCWNhc2UgREVMRVRFOiByZXR1cm4gREVMRVRFX0xJVEVSQUw7Ci0JCQljYXNlIEhFQUQ6IHJldHVybiBIRUFEX0xJVEVSQUw7Ci0JCQljYXNlIE9QVElPTlM6IHJldHVybiBPUFRJT05TX0xJVEVSQUw7Ci0JCQljYXNlIFRSQUNFOiByZXR1cm4gVFJBQ0VfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSFRUUE1ldGhvZFR5cGVFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0hUVFBNZXRob2RUeXBlRW51bQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSW5pdFBhcmFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Jbml0UGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzZThiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Jbml0UGFyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS8vdmFsdWUgcGFpciBhcyBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiB0aGUgc2VydmxldAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaXRQYXJhbSBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFBhcmFtTmFtZSBhdHRyaWJ1dGUKLQkgKiAKLQkgKiAKLQotCSAqLwotCVN0cmluZyBnZXRQYXJhbU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBQYXJhbU5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBQYXJhbVZhbHVlIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRQYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUGFyYW1WYWx1ZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9KU1BUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9KU1BUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTI1ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSlNQVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFR5cGUgZXh0ZW5kcyBXZWJUeXBlewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBKc3BGaWxlIGF0dHJpYnV0ZQotCSAqIFRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uLgotCi0JICovCi0JU3RyaW5nIGdldEpzcEZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBKc3BGaWxlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0SnNwRmlsZShTdHJpbmcgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9jYWxFbmNvZGluZ01hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0xvY2FsRW5jb2RpbmdNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzgxY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9jYWxFbmNvZGluZ01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZyNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRMb2NhbEVuY29kaW5nTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2NhbEVuY29kaW5nTWFwcGluZyBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2NhbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMb2NhbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ19FbmNvZGluZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFbmNvZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcjZ2V0RW5jb2RpbmcgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVuY29kaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTG9jYWxFbmNvZGluZ01hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZDU4YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCk7Ci0KLX0gLy8gTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2dpbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vTG9naW5Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjOWE3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Mb2dpbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIFRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KLSAqIG1lY2hhbmlzbS4KLSAqLwotcHVibGljIGludGVyZmFjZSBMb2dpbkNvbmZpZyBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEF1dGhNZXRob2QgYXR0cmlidXRlCi0JICogVGhlIGF1dGgtbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBmb3IKLQkgKiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0byBnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcwotCSAqIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlCi0JICogYXV0aGVudGljYXRlZCB1c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSAKLQkgKiAiQkFTSUMiLCAiRElHRVNUIiwgIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgotCSAqLwotCUF1dGhNZXRob2RLaW5kIGdldEF1dGhNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnI2dldEF1dGhNZXRob2QgPGVtPkF1dGggTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZAotCSAqIEBzZWUgI2lzU2V0QXV0aE1ldGhvZCgpCi0JICogQHNlZSAjdW5zZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRoTWV0aG9kKEF1dGhNZXRob2RLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWcjZ2V0QXV0aE1ldGhvZCA8ZW0+QXV0aCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXV0aE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0QXV0aE1ldGhvZCgpCi0JICogQHNlZSAjc2V0QXV0aE1ldGhvZChBdXRoTWV0aG9kS2luZCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEF1dGhNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWcjZ2V0QXV0aE1ldGhvZCA8ZW0+QXV0aCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGggTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRBdXRoTWV0aG9kKCkKLQkgKiBAc2VlICNzZXRBdXRoTWV0aG9kKEF1dGhNZXRob2RLaW5kKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXV0aE1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFJlYWxtTmFtZSBhdHRyaWJ1dGUKLQkgKiBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUCBCYXNpYwotCSAqIGF1dGhvcml6YXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0UmVhbG1OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUmVhbG1OYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UmVhbG1OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JpemF0aW9uIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0aG9yaXphdGlvbiBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0aG9yaXphdGlvbk1ldGhvZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0TG9naW5Db25maWdfQXV0aG9yaXphdGlvbk1ldGhvZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdXRob3JpemF0aW9uTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZyNnZXRBdXRob3JpemF0aW9uTWV0aG9kIDxlbT5BdXRob3JpemF0aW9uIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yaXphdGlvbiBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhvcml6YXRpb25NZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhvcml6YXRpb25NZXRob2QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQlXZWJBcHAgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEZvcm1Mb2dpbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQlGb3JtTG9naW5Db25maWcgZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGb3JtTG9naW5Db25maWcgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL01pbWVNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9NaW1lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQ5ODliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL01pbWVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uIGFuZCBhIG1pbWUgdHlwZS4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1pbWVNYXBwaW5nIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgRXh0ZW5zaW9uIGF0dHJpYnV0ZQotCSAqIFRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgRXh0ZW5zaW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RXh0ZW5zaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTWltZVR5cGUgYXR0cmlidXRlCi0JICogVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6ICJ0ZXh0Ly9wbGFpbiIKLQkgKi8KLQlTdHJpbmcgZ2V0TWltZVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBNaW1lVHlwZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE1pbWVUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9SZXNBdXRoU2VydmxldFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Jlc0F1dGhTZXJ2bGV0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDZmMjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Jlc0F1dGhTZXJ2bGV0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNBdXRoU2VydmxldFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3J7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFJTkVSID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWTEVUID0gMTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT05UQUlORVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DT05UQUlORVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoU2VydmxldFR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgUmVzQXV0aFNlcnZsZXRUeXBlKENPTlRBSU5FUiwgIkNPTlRBSU5FUiIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUlZMRVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TRVJWTEVUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFUlZMRVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhTZXJ2bGV0VHlwZSBTRVJWTEVUX0xJVEVSQUwgPSBuZXcgUmVzQXV0aFNlcnZsZXRUeXBlKFNFUlZMRVQsICJTRVJWTEVUIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzQXV0aFNlcnZsZXRUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFJlc0F1dGhTZXJ2bGV0VHlwZVtdIHsKLQkJCUNPTlRBSU5FUl9MSVRFUkFMLAotCQkJU0VSVkxFVF9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggU2VydmxldCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzQXV0aFNlcnZsZXRUeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJUmVzQXV0aFNlcnZsZXRUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzIEF1dGggU2VydmxldCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc0F1dGhTZXJ2bGV0VHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ09OVEFJTkVSOiByZXR1cm4gQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCQljYXNlIFNFUlZMRVQ6IHJldHVybiBTRVJWTEVUX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc0F1dGhTZXJ2bGV0VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy9SZXNBdXRoU2VydmxldFR5cGUKLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1JvbGVOYW1lVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vUm9sZU5hbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZWYxZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vUm9sZU5hbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVOYW1lVHlwZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSb2xlTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFJvbGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZWN1cml0eUNvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlY3VyaXR5Q29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2RhMTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlY3VyaXR5Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3VyaXR5Q29uc3RyYWludCBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCBiZWNvbWVzIGRpc3BsYXlOYW1lcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBXZWJSZXNvdXJjZUNvbGxlY3Rpb25zIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBBdXRoQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQlBdXRoQ29uc3RyYWludCBnZXRBdXRoQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgQXV0aENvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBVc2VyRGF0YUNvbnN0cmFpbnQgcmVmZXJlbmNlCi0JICovCi0JVXNlckRhdGFDb25zdHJhaW50IGdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXNlckRhdGFDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0VXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlcnZsZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmNDA4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLQotLyoqCi0gKiBUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEgc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmxldCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCi0KLS8qKgotICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbGlzdCBvZiB0aGUgbWFwcGluZ3MgdGhhdCB0aGlzCi0gKiBzZXJ2bGV0IHBhcnRpY2lwYXRlcyBpbi4gIFNpbmNlIHNlcnZsZXRNYXBwaW5ncyBpcyBub3QKLSAqIGEgYmktZGlyZWN0aW9uYWwgYXR0cmlidXRlLCBpZiB5b3Ugd2FudCB0byBhZGQgb3IgZGVsZXRlIGEKLSAqIG1hcHBpbmcsIHRoaXMgbXVzdCBiZSBkb25lIGluIHRoZSB3ZWItYXBwLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1wdWJsaWMgTGlzdCBnZXRNYXBwaW5ncygpOwotcHVibGljIFByb3BlcnRpZXMgZ2V0UGFyYW1zQXNQcm9wZXJ0aWVzKCkgOwotLyoqCi0gKiBGaXggdGhlIHJvbGUtbGluayBvbiBhbnkgY29udGFpbmVkIHJvbGUgcmVmcwotICovCi1wdWJsaWMgdm9pZCByZVN5bmNTZWN1cml0eVJvbGVSZWYoU3RyaW5nIGV4aXN0aW5nUm9sZU5hbWUsIFN0cmluZyBuZXdSb2xlTmFtZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFNlcnZsZXROYW1lIGF0dHJpYnV0ZQotCSAqIFRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0JICovCi0JU3RyaW5nIGdldFNlcnZsZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VydmxldE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTZXJ2bGV0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExvYWRPblN0YXJ0dXAgYXR0cmlidXRlCi0JICogVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIG9uIHRoZSAKLQkgKiBzdGFydHVwIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZSBlbGVtZW50IG11c3QgYmUKLQkgKiBhIHBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4KLQkgKiBMb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBoaWdoZXIgaW50ZWdlcnMuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgb3IKLQkgKiBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIAotCSAqIGl0IGF0IGFueSB0aW1lIGluIHRoZSBzdGFydHVwIHNlcXVlbmNlLgotCi0JICovCi0JSW50ZWdlciBnZXRMb2FkT25TdGFydHVwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0I2dldExvYWRPblN0YXJ0dXAgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExvYWRPblN0YXJ0dXAoKQotCSAqIEBzZWUgI3Vuc2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQHNlZSAjZ2V0TG9hZE9uU3RhcnR1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9hZE9uU3RhcnR1cChJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCNnZXRMb2FkT25TdGFydHVwIDxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExvYWRPblN0YXJ0dXAoKQotCSAqIEBzZWUgI2dldExvYWRPblN0YXJ0dXAoKQotCSAqIEBzZWUgI3NldExvYWRPblN0YXJ0dXAoSW50ZWdlcikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXRMb2FkT25TdGFydHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQjZ2V0TG9hZE9uU3RhcnR1cCA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAc2VlICNnZXRMb2FkT25TdGFydHVwKCkKLQkgKiBAc2VlICNzZXRMb2FkT25TdGFydHVwKEludGVnZXIpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzU2V0TG9hZE9uU3RhcnR1cCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYkFwcCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgV2ViVHlwZSByZWZlcmVuY2UKLQkgKi8KLQlXZWJUeXBlIGdldFdlYlR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSBsIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYlR5cGUgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRXZWJUeXBlKFdlYlR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBQYXJhbXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFBhcmFtcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVJvbGVSZWZzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSdW5BcyByZWZlcmVuY2UKLQkgKiBJZiBkZWZpbmVkIGZvciBhIHNlcnZsZXQsIG92ZXJyaWRlcyB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdXNlZCB0byBjYWxsIGFuIEVKQgotCSAqIGJ5IHRoYXQgc2VydmxldCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHJvbGUtbmFtZSBpcyBvbmUgb2YgdGhlIHNlY3VyaXR5Ci0JICogcm9sZXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQkgKi8KLQlSdW5Bc1NwZWNpZmllZElkZW50aXR5IGdldFJ1bkFzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSdW5BcyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFJ1bkFzKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFNlcnZsZXRfSW5pdFBhcmFtcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBqYXZhIHNlcnZsZXQgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmxldAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0U2VydmxldENsYXNzKCk7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldE1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1NlcnZsZXRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZDAyYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogVGhlIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYSBzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmxldE1hcHBpbmcgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBVcmxQYXR0ZXJuIGF0dHJpYnV0ZQotCSAqIFRoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gTXVzdCBmb2xsb3cKLQkgKiB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTAgb2YgdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uCi0JICovCi0JU3RyaW5nIGdldFVybFBhdHRlcm4oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBVcmxQYXR0ZXJuIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VXJsUGF0dGVybihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBAdmVyc2lvbiBKMkVFMS40Ci0JICogVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLQkgKiBzZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLQkgKiBhcHBsaWNhdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0U2VydmxldE1hcHBpbmdfTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZXJ2bGV0IHJlZmVyZW5jZQotCSAqLwotCVNlcnZsZXQgZ2V0U2VydmxldCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VydmxldCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlcnZsZXQoU2VydmxldCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vU2VydmxldFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ODg0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXJ2bGV0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRUeXBlIGV4dGVuZHMgV2ViVHlwZXsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQ2xhc3NOYW1lIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRDbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBDbGFzc05hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIHZhbHVlKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Nlc3Npb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Nlc3Npb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZDFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9TZXNzaW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZXNzaW9uQ29uZmlnIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU2Vzc2lvblRpbWVvdXQgYXR0cmlidXRlCi0JICogVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvcgotCSAqIGFsbCBzZXNzaW9ucyBjcmVhdGVkIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQgbXVzdCBiZQotCSAqIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgotCSAqLwotCWludCBnZXRTZXNzaW9uVGltZW91dCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFNlc3Npb25UaW1lb3V0IGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0U2Vzc2lvblRpbWVvdXQoaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZyNnZXRTZXNzaW9uVGltZW91dCA8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTZXNzaW9uVGltZW91dCgpCi0JICogQHNlZSAjZ2V0U2Vzc2lvblRpbWVvdXQoKQotCSAqIEBzZWUgI3NldFNlc3Npb25UaW1lb3V0KGludCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgdW5zZXRTZXNzaW9uVGltZW91dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnI2dldFNlc3Npb25UaW1lb3V0IDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAc2VlICNnZXRTZXNzaW9uVGltZW91dCgpCi0JICogQHNlZSAjc2V0U2Vzc2lvblRpbWVvdXQoaW50KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldFNlc3Npb25UaW1lb3V0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9UYWdMaWJSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RhZ0xpYlJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjkzMGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RhZ0xpYlJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIFRoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LgotICogQHZlcnNpb24gc2luY2UgSjJFRTEuNCBkZXByZWNhdGVkLCB1c2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuanNwLlRhZ0xpYlJlZgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0xpYlJlZiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFRhZ2xpYlVSSSBhdHRyaWJ1dGUKLQkgKiBUaGUgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWIueG1sIAotCSAqIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYiBBcHBsaWNhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFnbGliVVJJKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVGFnbGliVVJJIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VGFnbGliVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVGFnbGliTG9jYXRpb24gYXR0cmlidXRlCi0JICogVGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0bwotCSAqIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJhcnkgRGVzY3JpcHRpb24gZmlsZQotCSAqIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0JICovCi0JU3RyaW5nIGdldFRhZ2xpYkxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVGFnbGliTG9jYXRpb24gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0VGFnTGlicyA8ZW0+VGFnIExpYnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2ViIEFwcDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIEFwcDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdlYkFwcChXZWJBcHApCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0VGFnTGliUmVmX1dlYkFwcCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0VGFnTGlicwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0idGFnTGlicyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmI2dldFdlYkFwcCA8ZW0+V2ViIEFwcDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldlYiBBcHA8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdlYkFwcChXZWJBcHAgdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWY4NzVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHUkFMID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSURFTlRJQUwgPSAyOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgTk9ORV9MSVRFUkFMID0gbmV3IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoTk9ORSwgIk5PTkUiKTsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR1JBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVEVHUkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVHUkFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIElOVEVHUkFMX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShJTlRFR1JBTCwgIklOVEVHUkFMIik7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09ORklERU5USUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q09ORklERU5USUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTkZJREVOVElBTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBDT05GSURFTlRJQUxfTElURVJBTCA9IG5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKENPTkZJREVOVElBTCwgIkNPTkZJREVOVElBTCIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZVtdIHsKLQkJCU5PTkVfTElURVJBTCwKLQkJCUlOVEVHUkFMX0xJVEVSQUwsCi0JCQlDT05GSURFTlRJQUxfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PTkU6IHJldHVybiBOT05FX0xJVEVSQUw7Ci0JCQljYXNlIElOVEVHUkFMOiByZXR1cm4gSU5URUdSQUxfTElURVJBTDsKLQkJCWNhc2UgQ09ORklERU5USUFMOiByZXR1cm4gQ09ORklERU5USUFMX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vVHJhbnNwb3J0R3VhcmFudGVlVHlwZQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVVJMUGF0dGVyblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1VSTFBhdHRlcm5UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzZkN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVVJMUGF0dGVyblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiAgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjUvMjAwMyB1c2UgbGlzdCBvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9ufSAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlI2dldFVybFBhdHRlcm4gPGVtPlVybCBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZSNnZXRSZXNDb2xsZWN0aW9uIDxlbT5SZXMgQ29sbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFVSTFBhdHRlcm5UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSTFBhdHRlcm5UeXBlIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVXJsUGF0dGVybiBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0VXJsUGF0dGVybigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFVybFBhdHRlcm4gYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRVcmxQYXR0ZXJuKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBSZXNDb2xsZWN0aW9uIHJlZmVyZW5jZQotCSAqLwotCVdlYlJlc291cmNlQ29sbGVjdGlvbiBnZXRSZXNDb2xsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBSZXNDb2xsZWN0aW9uIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0UmVzQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gdmFsdWUpOwotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVXNlckRhdGFDb25zdHJhaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Vc2VyRGF0YUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmNWFkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9Vc2VyRGF0YUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXJEYXRhQ29uc3RyYWludCBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1c2VyIGRhdGEgY29uc3RyYWludC4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbiBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgVHJhbnNwb3J0R3VhcmFudGVlIGF0dHJpYnV0ZQotCSAqIFRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiBjbGllbnQgCi0JICogYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yIENPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZQotCSAqIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55Ci0JICogdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMKLQkgKiB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQKLQkgKiBjYW4ndCBiZSBjaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcwotCSAqIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbQotCSAqIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZQotCSAqIElOVEVHUkFMIG9yIENPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4KLQkgKi8KLQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGdldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50I2dldFRyYW5zcG9ydEd1YXJhbnRlZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UcmFuc3BvcnRHdWFyYW50ZWVUeXBlCi0JICogQHNlZSAjaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI3Vuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRyYW5zcG9ydEd1YXJhbnRlZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50I2dldFRyYW5zcG9ydEd1YXJhbnRlZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQHNlZSAjc2V0VHJhbnNwb3J0R3VhcmFudGVlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50I2dldFRyYW5zcG9ydEd1YXJhbnRlZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VHJhbnNwb3J0R3VhcmFudGVlKCkKLQkgKiBAc2VlICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKQotCSAqIEBzZWUgI3NldFRyYW5zcG9ydEd1YXJhbnRlZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZWNDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCVNlY3VyaXR5Q29uc3RyYWludCBnZXRTZWNDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTZWNDb25zdHJhaW50IHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0U2VjQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYkFwcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzNkNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotCi0vKioKLSAqIFRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IKLSAqIGEgd2ViIGFwcGxpY2F0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYkFwcCBleHRlbmRzIEpORElFbnZSZWZzR3JvdXB7Ci0KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2VjdXJpdHlSb2xlKFN0cmluZyBuYW1lKTsKLUVycm9yUGFnZSBnZXRFcnJvclBhZ2VCeUNvZGUoSW50ZWdlciBjb2RlKSA7Ci1FcnJvclBhZ2UgZ2V0RXJyb3JQYWdlQnlFeGNlcHRpb25UeXBlKFN0cmluZyBleGNlcHRpb25UeXBlKSA7Ci0vKioKLSAqIEZpbmRzIGEgZmlsdGVyIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWVkIGZpbHRlci4KLSAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBmaW5kIHRoZSBtYXBwaW5ncyBmb3IuCi0gKiBAcmV0dXJuIFRoZSBmaWx0ZXIgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIsIG9yIG51bGwgaWYgbm8KLSAqIG1hcHBpbmcgZXhpc3RzIGZvciB0aGUgZmlsdGVyLgotICovCi0KLUZpbHRlck1hcHBpbmcgZ2V0RmlsdGVyTWFwcGluZyhGaWx0ZXIgYUZpbHRlcik7Ci1wdWJsaWMgRmlsdGVyIGdldEZpbHRlck5hbWVkKFN0cmluZyBuYW1lKTsKLS8qKgotICogR2V0cyB0aGUgbmFtZXMgb2YgdGhlIGZpbHRlcnMgZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gKiBAcmV0dXJuIEEgbGlzdCBvZiBmaWx0ZXIgbmFtZXMgKFN0cmluZ3MpLgotICovCi0KLUxpc3QgZ2V0RmlsdGVyTmFtZXMoKSA7Ci0vKioKLSAqIFJldHVybnMgdGhlIG1pbWUgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBleHRlbnNpb24KLSAqIEBwYXJhbSBBbiBleHRlbnNpb24gdG8gZmluZCB0aGUgbWltZSB0eXBlIGZvci4KLSAqLwotIAotU3RyaW5nIGdldE1pbWVUeXBlKFN0cmluZyBleHRlbnNpb24pOwotCXB1YmxpYyBTZWN1cml0eVJvbGUgZ2V0U2VjdXJpdHlSb2xlTmFtZWQoU3RyaW5nIHJvbGVOYW1lKTsKLS8qKgotICogRmluZHMgYSBzZXJ2bGV0IG1hcHBpbmcgZm9yIGEgc3BlY2lmaWVkIHNlcnZsZXQuCi0gKiBAcGFyYW0gc2VydmxldCBUaGUgc2VydmxldCB0byBmaW5kIHRoZSBtYXBwaW5ncyBmb3IuCi0gKiBAcmV0dXJuIFRoZSBzZXJ2bGV0IG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgc2VydmxldCwgb3IgbnVsbCBpZiBubwotICogbWFwcGluZyBleGlzdHMgZm9yIHRoZSBzZXJ2bGV0LgotICovCi0KLVNlcnZsZXRNYXBwaW5nIGdldFNlcnZsZXRNYXBwaW5nKFNlcnZsZXQgYVNlcnZsZXQpOwotcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldE5hbWVkKFN0cmluZyBuYW1lKTsKLS8qKgotICogR2V0cyB0aGUgbmFtZXMgb2YgdGhlIHNlcnZsZXRzIGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICogQHJldHVybiBBIGxpc3Qgb2Ygc2VydmxldCBuYW1lcyAoU3RyaW5ncykuCi0gKi8KLQotTGlzdCBnZXRTZXJ2bGV0TmFtZXMoKSA7Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBXZWIgQXBwIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBTZXJ2bGV0Mi4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfMkRlc2NyaXB0b3IoKTsKLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIFdlYiBBcHAgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIFNlcnZsZXQyLjMgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl8zRGVzY3JpcHRvcigpOwotLyoqCi0gKiBSZW5hbWUgdGhlIHNlY3VyaXR5IHJvbGUgaWYgaXQgZXhpc3RzOyBmb3IgZWFjaCBzZXJ2bGV0LCBmaXggdGhlIHJvbGUtbGluayBvbiBhbnkgY29udGFpbmVkIHJvbGUKLSAqIHJlZnMKLSAqLwotcHVibGljIHZvaWQgcmVuYW1lU2VjdXJpdHlSb2xlKFN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBTdHJpbmcgbmV3Um9sZU5hbWUpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBEaXN0cmlidXRhYmxlIGF0dHJpYnV0ZQotCSAqIFRoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMgcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvCi0JICogYmUgZGVwbG95ZWQgaW50byBhIGRpc3RyaWJ1dGVkIHNlcnZsZXQgY29udGFpbmVyCi0JICovCi0JYm9vbGVhbiBpc0Rpc3RyaWJ1dGFibGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBEaXN0cmlidXRhYmxlIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGlzdHJpYnV0YWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2lzRGlzdHJpYnV0YWJsZSA8ZW0+RGlzdHJpYnV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREaXN0cmlidXRhYmxlKCkKLQkgKiBAc2VlICNpc0Rpc3RyaWJ1dGFibGUoKQotCSAqIEBzZWUgI3NldERpc3RyaWJ1dGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERpc3RyaWJ1dGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2lzRGlzdHJpYnV0YWJsZSA8ZW0+RGlzdHJpYnV0YWJsZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzdHJpYnV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGlzdHJpYnV0YWJsZSgpCi0JICogQHNlZSAjaXNEaXN0cmlidXRhYmxlKCkKLQkgKiBAc2VlICNzZXREaXN0cmlidXRhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREaXN0cmlidXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYkFwcF9WZXJzaW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSogVGhpcyByZXR1cm5zIHRoZSBtb2R1bGUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLQkqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0JLyoqCi0JICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCi0JICovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA7Ci0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQ29udGV4dHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENvbnRleHRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVycm9yUGFnZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEVycm9yUGFnZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEZpbGVMaXN0IHJlZmVyZW5jZQotCSAqLwotCVdlbGNvbWVGaWxlTGlzdCBnZXRGaWxlTGlzdCgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgOiBVc2UgZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkKLQkgKi8KLQlFTGlzdCBnZXRFbnZFbnRyaWVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGaWxlTGlzdCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFRhZ0xpYnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFRhZ0xpYnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQ29uc3RyYWludHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBMb2dpbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQlMb2dpbkNvbmZpZyBnZXRMb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTG9naW5Db25maWcgcmVmZXJlbmNlCi0JICovCi0Jdm9pZCBzZXRMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIE1pbWVNYXBwaW5ncyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWltZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBTZXNzaW9uQ29uZmlnIHJlZmVyZW5jZQotCSAqLwotCVNlc3Npb25Db25maWcgZ2V0U2Vzc2lvbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2Vzc2lvbkNvbmZpZyByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFNlcnZsZXRNYXBwaW5ncyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFNlcnZsZXRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZXJ2bGV0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBTZWN1cml0eVJvbGVzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRTZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEZpbHRlcnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEZpbHRlcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRmlsdGVyTWFwcGluZ3MgcmVmZXJlbmNlcwotCSAqIEZpbHRlciBtYXBwaW5ncyBkZWZpbmVkIGZvciB0aGUgd2ViIGFwcAotCSAqLwotCUVMaXN0IGdldEZpbHRlck1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIExpc3RlbmVycyByZWZlcmVuY2VzCi0JICogVGhlIGxpc3RlbmVycyBjb2xsZWN0aW9uIGNvbnRhaW5zIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIgYXBwbGljYXRpb24KLQkgKiBsaXN0ZW5lciBiZWFucyBpbiB0aGUgd2ViIGFwcC4KLQkgKi8KLQlFTGlzdCBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRleHQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29udGV4dFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SnNwIENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SnNwIENvbmZpZzwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpzcCBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEpzcENvbmZpZyhKU1BDb25maWcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViQXBwX0pzcENvbmZpZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKU1BDb25maWcgZ2V0SnNwQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAjZ2V0SnNwQ29uZmlnIDxlbT5Kc3AgQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kc3AgQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKc3BDb25maWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEpzcENvbmZpZyhKU1BDb25maWcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJBcHBSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViQXBwUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlZWViYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJBcHBSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYkFwcFJlc291cmNlIGV4dGVuZHMgWE1MUmVzb3VyY2UgewotCVdlYkFwcCBnZXRXZWJBcHAoKTsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIHN1cHBvcnRzIHRoZSBXZWIgMi4yIHNwZWMuCi0JICovCi0JYm9vbGVhbiBpc1dlYjJfMigpOwotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgUmVzb3VyY2Ugc3VwcG9ydHMgdGhlIFdlYiAyLjMgc3BlYy4KLQkgKi8KLQlib29sZWFuIGlzV2ViMl8zKCk7Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZSBzdXBwb3J0cyB0aGUgV2ViIDIuNCBzcGVjLgotCSAqLwotCWJvb2xlYW4gaXNXZWIyXzQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJSZXNvdXJjZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlMzU5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJSZXNvdXJjZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIFRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQgb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmIG5vIEhUVFAgbWV0aG9kcyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlJlc291cmNlQ29sbGVjdGlvbiBleHRlbmRzIEVPYmplY3R7Ci0KLXB1YmxpYyB2b2lkIGFkZEhUVFAoU3RyaW5nIGh0dHBNZXRob2QpOwotcHVibGljIHZvaWQgYWRkVVJMKFN0cmluZyB1cmxQYXR0ZXJuKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgV2ViUmVzb3VyY2VOYW1lIGF0dHJpYnV0ZQotCSAqIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uCi0JICovCi0JU3RyaW5nIGdldFdlYlJlc291cmNlTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFdlYlJlc291cmNlTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldFdlYlJlc291cmNlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIERlc2NyaXB0aW9uIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcmwgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJsIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm4oKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VXJsUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW19LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IdHRwIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHR0cCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZSNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SHR0cE1ldGhvZCgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgOiBVc2UgZ2V0SHR0cE1ldGhvZCgpOwotCSAqLwotCUVMaXN0IGdldEhUVFBzKCk7Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgU2VjQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQkKLQkKLQlTZWN1cml0eUNvbnN0cmFpbnQgZ2V0U2VjQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgU2VjQ29uc3RyYWludCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgVVJMcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0VVJMcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEB2ZXJzaW9uIEoyRUUxLjQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1OGYyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQotcHVibGljIGJvb2xlYW4gaXNKc3BUeXBlKCk7Ci1wdWJsaWMgYm9vbGVhbiBpc1NlcnZsZXRUeXBlKCk7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2ViYXBwbGljYXRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJhcHBsaWNhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlZjI2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJhcHBsaWNhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlYkFwcCB2YWx1ZQotCSAqLwotCVdlYkFwcCBjcmVhdGVXZWJBcHAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQ29udGV4dFBhcmFtIHZhbHVlCi0JICovCi0JQ29udGV4dFBhcmFtIGNyZWF0ZUNvbnRleHRQYXJhbSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBFcnJvclBhZ2UgdmFsdWUKLQkgKi8KLQlFcnJvclBhZ2UgY3JlYXRlRXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgdmFsdWUKLQkgKi8KLQlFeGNlcHRpb25UeXBlRXJyb3JQYWdlIGNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRXJyb3JDb2RlRXJyb3JQYWdlIHZhbHVlCi0JICovCi0JRXJyb3JDb2RlRXJyb3JQYWdlIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBXZWxjb21lRmlsZUxpc3QgdmFsdWUKLQkgKi8KLQlXZWxjb21lRmlsZUxpc3QgY3JlYXRlV2VsY29tZUZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlbGNvbWVGaWxlIHZhbHVlCi0JICovCi0JV2VsY29tZUZpbGUgY3JlYXRlV2VsY29tZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGFnTGliUmVmIHZhbHVlCi0JICovCi0JVGFnTGliUmVmIGNyZWF0ZVRhZ0xpYlJlZigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZWN1cml0eUNvbnN0cmFpbnQgdmFsdWUKLQkgKi8KLQlTZWN1cml0eUNvbnN0cmFpbnQgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlYlJlc291cmNlQ29sbGVjdGlvbiB2YWx1ZQotCSAqLwotCVdlYlJlc291cmNlQ29sbGVjdGlvbiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVVJMUGF0dGVyblR5cGUgdmFsdWUKLQkgKi8KLQlVUkxQYXR0ZXJuVHlwZSBjcmVhdGVVUkxQYXR0ZXJuVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBdXRoQ29uc3RyYWludCB2YWx1ZQotCSAqLwotCUF1dGhDb25zdHJhaW50IGNyZWF0ZUF1dGhDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFVzZXJEYXRhQ29uc3RyYWludCB2YWx1ZQotCSAqLwotCVVzZXJEYXRhQ29uc3RyYWludCBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTG9naW5Db25maWcgdmFsdWUKLQkgKi8KLQlMb2dpbkNvbmZpZyBjcmVhdGVMb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGb3JtTG9naW5Db25maWcgdmFsdWUKLQkgKi8KLQlGb3JtTG9naW5Db25maWcgY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIE1pbWVNYXBwaW5nIHZhbHVlCi0JICovCi0JTWltZU1hcHBpbmcgY3JlYXRlTWltZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2Vzc2lvbkNvbmZpZyB2YWx1ZQotCSAqLwotCVNlc3Npb25Db25maWcgY3JlYXRlU2Vzc2lvbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZXJ2bGV0TWFwcGluZyB2YWx1ZQotCSAqLwotCVNlcnZsZXRNYXBwaW5nIGNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFNlcnZsZXQgdmFsdWUKLQkgKi8KLQlTZXJ2bGV0IGNyZWF0ZVNlcnZsZXQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gU2VydmxldFR5cGUgdmFsdWUKLQkgKi8KLQlTZXJ2bGV0VHlwZSBjcmVhdGVTZXJ2bGV0VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKU1BUeXBlIHZhbHVlCi0JICovCi0JSlNQVHlwZSBjcmVhdGVKU1BUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEluaXRQYXJhbSB2YWx1ZQotCSAqLwotCUluaXRQYXJhbSBjcmVhdGVJbml0UGFyYW0oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gRmlsdGVyIHZhbHVlCi0JICovCi0JRmlsdGVyIGNyZWF0ZUZpbHRlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBGaWx0ZXJNYXBwaW5nIHZhbHVlCi0JICovCi0JRmlsdGVyTWFwcGluZyBjcmVhdGVGaWx0ZXJNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxvY2FsRW5jb2RpbmdNYXBwaW5nIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBNZXRob2RUeXBlIGNyZWF0ZUhUVFBNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFJvbGVOYW1lVHlwZSB2YWx1ZQotCSAqLwotCVJvbGVOYW1lVHlwZSBjcmVhdGVSb2xlTmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBnZXRXZWJhcHBsaWNhdGlvblBhY2thZ2UoKTsKLQotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWJhcHBsaWNhdGlvblBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYmFwcGxpY2F0aW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjBkOTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlYmFwcGxpY2F0aW9uUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gIndlYmFwcGxpY2F0aW9uIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUCA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19JQ09OUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudmlyb25tZW50IFByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0VOVklST05NRU5UX1BST1BFUlRJRVMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfUkVGUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fRUpCX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9SRUZTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fUkVTT1VSQ0VfRU5WX1JFRlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VKQl9MT0NBTF9SRUZTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VSVklDRV9SRUZTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19TRVJWSUNFX1JFRlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fRElTVFJJQlVUQUJMRSA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX1ZFUlNJT04gPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fQ09OVEVYVFMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX0VSUk9SX1BBR0VTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19GSUxFX0xJU1QgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX1RBR19MSUJTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19DT05TVFJBSU5UUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fTE9HSU5fQ09ORklHID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19NSU1FX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19TRVNTSU9OX0NPTkZJRyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9BUFBfX1NFUlZMRVRTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUJfQVBQX19GSUxURVJTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX0FQUF9fTElTVEVORVJTID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX0NPTlRFWFRfUEFSQU1TID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kc3AgQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX0FQUF9fSlNQX0NPTkZJRyA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TID0gQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QgPSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfRkVBVFVSRV9DT1VOVCArIDE5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWIgQXBwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFQl9BUFBfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEVYVF9QQVJBTSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUUgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT05URVhUX1BBUkFNX19QQVJBTV9WQUxVRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IENPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbnRleHQgUGFyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVYVF9QQVJBTV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFUlJPUl9QQUdFID0gNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRSA9IDIyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFUlJPUl9DT0RFX0VSUk9SX1BBR0UgPSAyMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX0xJU1QgPSA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUxDT01FX0ZJTEUgPSAyMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVEFHX0xJQl9SRUYgPSA4OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UID0gOTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT04gPSAxMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVVJMX1BBVFRFUk5fVFlQRSA9IDE5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBIVFRQX01FVEhPRF9UWVBFID0gMjg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlQgPSAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlQgPSAxMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHID0gMTM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHID0gMTQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1JTUVfTUFQUElORyA9IDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fQ09ORklHID0gNDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVCA9IDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWTEVUX19JQ09OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX0xBUkdFX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0xBUkdFX0lDT047Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX1NFUlZMRVRfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19XRUJfQVBQID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19XRUJfVFlQRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9fUEFSQU1TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfX1JVTl9BUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9fSU5JVF9QQVJBTVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNlcnZsZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk4gPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HX19OQU1FID0gMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkdfX1dFQl9BUFAgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5TZXJ2bGV0IE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkxFVF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVNTSU9OX0NPTkZJR19fV0VCX0FQUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFU1NJT05fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1JTUVfTUFQUElOR19fRVhURU5TSU9OID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUlNRV9NQVBQSU5HX19NSU1FX1RZUEUgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNSU1FX01BUFBJTkdfX1dFQl9BUFAgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NaW1lIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQID0gMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfTElTVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFUlJPUl9QQUdFX19MT0NBVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVSUk9SX1BBR0VfX1dFQl9BUFAgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FcnJvciBQYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVSUk9SX1BBR0VfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVEFHX0xJQl9SRUZfX1RBR0xJQl9VUkkgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBUQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQUdfTElCX1JFRl9fV0VCX0FQUCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRhZyBMaWIgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBR19MSUJfUkVGX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUCA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUyA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVCA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNVUklUWV9DT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTiA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk4gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0QgPSAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVCA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUyA9IDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SFRUIFBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9fUk9MRVMgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IExPR0lOX0NPTkZJR19fUkVBTE1fTkFNRSA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcml6YXRpb24gTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19BVVRIT1JJWkFUSU9OX01FVEhPRCA9IDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19XRUJfQVBQID0gMzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkxvZ2luIENvbmZpZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0dJTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0VSUk9SX1BBR0UgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUdfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VCX1RZUEUgPSAxNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU0VSVkxFVF9UWVBFID0gMTc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpTUF9UWVBFID0gMTg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRfUEFSQU0gPSAxNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04gPSAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW5pdCBQYXJhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX1BBUkFNX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWIgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUJfVFlQRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBTRVJWTEVUX1RZUEVfX0NMQVNTX05BTUUgPSBXRUJfVFlQRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VydmxldCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZMRVRfVFlQRV9GRUFUVVJFX0NPVU5UID0gV0VCX1RZUEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSlNQX1RZUEVfX0pTUF9GSUxFID0gV0VCX1RZUEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkpTUCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpTUF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBXRUJfVFlQRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTiA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VVJMIFBhdHRlcm4gVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUiA9IDI1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfTUFQUElORyA9IDI0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBST0xFX05BTUVfVFlQRSA9IDIwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Um9sZSBOYW1lIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OQU1FX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEUgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldlbGNvbWUgRmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUxDT01FX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fTE9DQVRJT04gPSBFUlJPUl9QQUdFX19MT0NBVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fV0VCX0FQUCA9IEVSUk9SX1BBR0VfX1dFQl9BUFA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEUgPSBFUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGUgRXJyb3IgUGFnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgPSBFUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVSUk9SX0NPREVfRVJST1JfUEFHRV9fTE9DQVRJT04gPSBFUlJPUl9QQUdFX19MT0NBVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRVJST1JfQ09ERV9FUlJPUl9QQUdFX19XRUJfQVBQID0gRVJST1JfUEFHRV9fV0VCX0FQUDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREUgPSBFUlJPUl9QQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXJyb3IgQ29kZSBFcnJvciBQYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVSUk9SX0NPREVfRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UID0gRVJST1JfUEFHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk4gPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEUgPSAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX19GSUxURVIgPSAyOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfTUFQUElOR19fU0VSVkxFVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxURVJfX0RFU0NSSVBUSU9OUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJTFRFUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklMVEVSX19OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfX0lOSVRfUEFSQU1TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUxURVJfX0ZJTFRFUl9DTEFTUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtIFZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RmlsdGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTFRFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0QgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5IVFRQIE1ldGhvZCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfTUVUSE9EX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJlc0F1dGhTZXJ2bGV0VHlwZSA8ZW0+UmVzIEF1dGggU2VydmxldCBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5SZXNBdXRoU2VydmxldFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRSZXNBdXRoU2VydmxldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTX0FVVEhfU0VSVkxFVF9UWVBFID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bSA8ZW0+SFRUUCBNZXRob2QgVHlwZSBFbnVtPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCNnZXRIVFRQTWV0aG9kVHlwZUVudW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9NRVRIT0RfVFlQRV9FTlVNID0gMzA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFID0gMzE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZSA8ZW0+RGlzcGF0Y2hlciBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldERpc3BhdGNoZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU1BBVENIRVJfVFlQRSA9IDMyOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kIDxlbT5BdXRoIE1ldGhvZCBLaW5kPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsI2dldEF1dGhNZXRob2RLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFVVEhfTUVUSE9EX0tJTkQgPSAzMzsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAid2ViYXBwbGljYXRpb24ueG1pIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2ViYXBwbGljYXRpb25QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFdlYkFwcCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlYkFwcF9WZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Db250ZXh0cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRXJyb3JQYWdlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1RhZ0xpYnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Mb2dpbkNvbmZpZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlcnZsZXRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldENvbnRleHRQYXJhbXMgPGVtPkNvbnRleHQgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZXh0IFBhcmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRDb250ZXh0UGFyYW1zKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRKc3BDb25maWcgPGVtPkpzcCBDb25maWc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Kc3AgQ29uZmlnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldEpzcENvbmZpZygpCi0JICogQHNlZSAjZ2V0V2ViQXBwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWJBcHBfSnNwQ29uZmlnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAc2VlICNnZXRXZWJBcHAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBzZWUgI2dldFdlYkFwcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb250ZXh0UGFyYW0gb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldENvbnRleHRQYXJhbSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZXh0UGFyYW1fV2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVycm9yUGFnZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVycm9yUGFnZV9Mb2NhdGlvbigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFcnJvclBhZ2VfV2ViQXBwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2Ugb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEVycm9yQ29kZUVycm9yUGFnZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2VsY29tZUZpbGVMaXN0IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXZWxjb21lRmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2VsY29tZUZpbGVMaXN0X1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBXZWxjb21lRmlsZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0V2VsY29tZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2VsY29tZUZpbGVfV2VsY29tZUZpbGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2VsY29tZUZpbGVfRmlsZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGFnTGliUmVmIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRUYWdMaWJSZWYoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFnTGliUmVmX1RhZ2xpYlVSSSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYWdMaWJSZWZfVGFnbGliTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZiNnZXRXZWJBcHAgPGVtPldlYiBBcHA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+V2ViIEFwcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZiNnZXRXZWJBcHAoKQotCSAqIEBzZWUgI2dldFRhZ0xpYlJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFnTGliUmVmX1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFNlY3VyaXR5Q29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludCNnZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQjZ2V0RGlzcGxheU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTZWN1cml0eUNvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gV2ViUmVzb3VyY2VDb2xsZWN0aW9uIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0VXJsUGF0dGVybiA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlVybCBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFVybFBhdHRlcm4oKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SHR0cE1ldGhvZCA8ZW0+SHR0cCBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkh0dHAgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldEh0dHBNZXRob2QoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0VVJMcyA8ZW0+VVIgTHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQgc2luY2UgNC8yNS8yMDAzIHVzZSB7QGxpbmsgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCl9Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlVSIExzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldFVSTHMoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VSTHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRIVFRQcyA8ZW0+SFRUIFBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjUvMjAwMyB1c2Uge0BsaW5rICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZCgpfQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IVFQgUHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SFRUUHMoKQotCSAqIEBzZWUgI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0hUVFBzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFVSTFBhdHRlcm5UeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRVUkxQYXR0ZXJuVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRVUkxQYXR0ZXJuVHlwZV9VcmxQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldFVSTFBhdHRlcm5UeXBlX1Jlc0NvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSFRUUE1ldGhvZFR5cGUgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEhUVFBNZXRob2RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlI2dldEh0dHBNZXRob2QgPGVtPkh0dHAgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHR0cCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZSNnZXRIdHRwTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRIVFRQTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBBdXRoQ29uc3RyYWludCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QXV0aENvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXV0aENvbnN0cmFpbnRfUm9sZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXV0aENvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50I2dldERlc2NyaXB0aW9ucyA8ZW0+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+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5BdXRoIE1ldGhvZCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aE1ldGhvZEtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0QXV0aE1ldGhvZEtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQotfSAvL1dlYmFwcGxpY2F0aW9uUGFja2FnZQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2VsY29tZUZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlbGNvbWVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZWJhNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vV2VsY29tZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBUaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZSBhcyBhIGRlZmF1bHQgd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlbGNvbWVGaWxlIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgV2VsY29tZUZpbGUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFdlbGNvbWVGaWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2VsY29tZUZpbGUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRXZWxjb21lRmlsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRmlsZUxpc3QgcmVmZXJlbmNlCi0JICovCi0JV2VsY29tZUZpbGVMaXN0IGdldEZpbGVMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBGaWxlTGlzdCByZWZlcmVuY2UKLQkgKi8KLQl2b2lkIHNldEZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCB2YWx1ZSk7Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9XZWxjb21lRmlsZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlbGNvbWVGaWxlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ4YjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1dlbGNvbWVGaWxlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMgZWxlbWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2VsY29tZUZpbGVMaXN0IGV4dGVuZHMgRU9iamVjdHsKLQotcHVibGljIHZvaWQgYWRkRmlsZU5hbWVkKFN0cmluZyBuYW1lKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBXZWJBcHAgcmVmZXJlbmNlCi0JICovCi0JV2ViQXBwIGdldFdlYkFwcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHBhcmFtIGwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgV2ViQXBwIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0V2ViQXBwKFdlYkFwcCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEZpbGUgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEZpbGUoKTsKLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0F1dGhDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU3NDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgYXV0aC1jb25zdHJhaW50IGVsZW1lbnQgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQgc2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZSB1c2VkIGhlcmUgbXVzdCBhcHBlYXIgaW4gYSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQXV0aENvbnN0cmFpbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBdXRoQ29uc3RyYWludCwgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgQXV0aENvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aENvbnN0cmFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBhdXRoIGNvbnN0cmFpbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgbGlzdCBvZiByb2xlIG5hbWVzIGZvciB0aGUgYXV0aCBjb25zdHJhaW50LiAgRWFjaCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAqIG9mIGEgc2VjdXJpdHkgcm9sZSAoYSBTdHJpbmcpLgotCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJvbGVzKCkgewotCQlpZiAocm9sZXMgPT0gbnVsbCkgewotCQkJcm9sZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgZ2V0U2VjQ29uc3RyYWludCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFNlY3VyaXR5Q29uc3RyYWludCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG5ld1NlY0NvbnN0cmFpbnQpIHsKLQkJaWYgKG5ld1NlY0NvbnN0cmFpbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVCAmJiBuZXdTZWNDb25zdHJhaW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3U2VjQ29uc3RyYWludCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3U2VjQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZWNDb25zdHJhaW50KS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5ULCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY0NvbnN0cmFpbnQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBuZXdTZWNDb25zdHJhaW50LCBuZXdTZWNDb25zdHJhaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0Um9sZXMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFNlY0NvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFUzoKLQkJCQlyZXR1cm4gcm9sZXMgIT0gbnVsbCAmJiAhcm9sZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZ2V0U2VjQ29uc3RyYWludCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRVM6Ci0JCQkJZ2V0Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXNldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1JPTEVTOgotCQkJCWdldFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXNldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0NvbnRleHRQYXJhbUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29udGV4dFBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU1ZWUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29udGV4dFBhcmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dFBhcmFtSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29udGV4dFBhcmFtLCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbU5hbWUoKSA8ZW0+UGFyYW0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyYW1OYW1lID0gUEFSQU1fTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1WYWx1ZSgpIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJhbVZhbHVlID0gUEFSQU1fVkFMVUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCXB1YmxpYyBDb250ZXh0UGFyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGV4dFBhcmFtKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIHBhcmFtTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIG5ld1BhcmFtTmFtZSkgewotCQlTdHJpbmcgb2xkUGFyYW1OYW1lID0gcGFyYW1OYW1lOwotCQlwYXJhbU5hbWUgPSBuZXdQYXJhbU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19QQVJBTV9OQU1FLCBvbGRQYXJhbU5hbWUsIHBhcmFtTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtVmFsdWUoKSB7Ci0JCXJldHVybiBwYXJhbVZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIG5ld1BhcmFtVmFsdWUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlOwotCQlwYXJhbVZhbHVlID0gbmV3UGFyYW1WYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFLCBvbGRQYXJhbVZhbHVlLCBwYXJhbVZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFAsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtTmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtVmFsdWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlyZXR1cm4gUEFSQU1fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1OYW1lICE9IG51bGwgOiAhUEFSQU1fTkFNRV9FREVGQVVMVC5lcXVhbHMocGFyYW1OYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXJldHVybiBQQVJBTV9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1WYWx1ZSAhPSBudWxsIDogIVBBUkFNX1ZBTFVFX0VERUZBVUxULmVxdWFscyhwYXJhbVZhbHVlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJc2V0UGFyYW1OYW1lKFBBUkFNX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXNldFBhcmFtVmFsdWUoUEFSQU1fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocGFyYW1OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtVmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmFtVmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JDb2RlRXJyb3JQYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FcnJvckNvZGVFcnJvclBhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjg5NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FcnJvckNvZGVFcnJvclBhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckNvZGVFcnJvclBhZ2VJbXBsIGV4dGVuZHMgRXJyb3JQYWdlSW1wbCBpbXBsZW1lbnRzIEVycm9yQ29kZUVycm9yUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXJyb3JDb2RlKCkgPGVtPkVycm9yIENvZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVycm9yQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQ09ERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yQ29kZSA9IEVSUk9SX0NPREVfRURFRkFVTFQ7Ci0JcHVibGljIEVycm9yQ29kZUVycm9yUGFnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvckNvZGVFcnJvclBhZ2UoKTsKLQl9Ci0KLS8qKgotICogaXNFcnJvckNvZGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzRXJyb3JDb2RlKCkgewotCXJldHVybiB0cnVlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvckNvZGUoKSB7Ci0JCXJldHVybiBlcnJvckNvZGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JDb2RlKFN0cmluZyBuZXdFcnJvckNvZGUpIHsKLQkJU3RyaW5nIG9sZEVycm9yQ29kZSA9IGVycm9yQ29kZTsKLQkJZXJyb3JDb2RlID0gbmV3RXJyb3JDb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFLCBvbGRFcnJvckNvZGUsIGVycm9yQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19XRUJfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19XRUJfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVMsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERToKLQkJCQlyZXR1cm4gZ2V0RXJyb3JDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERToKLQkJCQlyZXR1cm4gRVJST1JfQ09ERV9FREVGQVVMVCA9PSBudWxsID8gZXJyb3JDb2RlICE9IG51bGwgOiAhRVJST1JfQ09ERV9FREVGQVVMVC5lcXVhbHMoZXJyb3JDb2RlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREU6Ci0JCQkJc2V0RXJyb3JDb2RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0xPQ0FUSU9OOgotCQkJCXNldExvY2F0aW9uKExPQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFOgotCQkJCXNldEVycm9yQ29kZShFUlJPUl9DT0RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVycm9yQ29kZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXJyb3JDb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FcnJvclBhZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Vycm9yUGFnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZWZiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Vycm9yUGFnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlIG9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JQYWdlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXJyb3JQYWdlLCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb24gPSBMT0NBVElPTl9FREVGQVVMVDsKLQlwdWJsaWMgRXJyb3JQYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yUGFnZSgpOwotCX0KLQotLyoqCi0gKiBpc0Vycm9yQ29kZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNFcnJvckNvZGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBpc0V4Y2VwdGlvblR5cGUgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzRXhjZXB0aW9uVHlwZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgd2ViCi0JICogYXBwbGljYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRMb2NhdGlvbiA9IGxvY2F0aW9uOwotCQlsb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT04sIG9sZExvY2F0aW9uLCBsb2NhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViQXBwKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2NhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2NiMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwgZXh0ZW5kcyBFcnJvclBhZ2VJbXBsIGltcGxlbWVudHMgRXhjZXB0aW9uVHlwZUVycm9yUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGV4Y2VwdGlvblR5cGUgPSBudWxsOwotCXB1YmxpYyBFeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLQl9Ci0KLS8qKgotICogSGVscGVyIG1ldGhvZCB0byBzZXQgdGhlIEV4Y2VwdGlvblR5cGUgdG8gYSBKYXZhQ2xhc3MgaGF2aW5nIGEgZnVsbHkgcXVhbGlmaWVkCi0gKiBuYW1lIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uVHlwZU5hbWUoKSB7Ci0JZ2V0RXhjZXB0aW9uVHlwZSgpOwotCXJldHVybiBleGNlcHRpb25UeXBlID09IG51bGwgPyBudWxsIDogZXhjZXB0aW9uVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci19LyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIHNldCB0aGUgRXhjZXB0aW9uVHlwZSB0byBhIEphdmFDbGFzcyBoYXZpbmcgYSBmdWxseSBxdWFsaWZpZWQKLSAqIG5hbWUgc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIKLSAqLyAKLXB1YmxpYyBib29sZWFuIGlzRXhjZXB0aW9uVHlwZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvblR5cGVOYW1lKFN0cmluZyBleGNlcHRpb25UeXBlTmFtZSkgewotCXNldEV4Y2VwdGlvblR5cGUoSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKGV4Y2VwdGlvblR5cGVOYW1lKSk7Ci19Ci0vKioKLSAqIEBkZXByZWNhdGVkIFVzZSBAbGlua3sjc2V0RXhjZXB0aW9uVHlwZU5hbWUoU3RyaW5nKX0KLSAqLwotcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uVHlwZU5hbWUoU3RyaW5nIGV4Y2VwdGlvblR5cGVOYW1lLCBSZXNvdXJjZVNldCBjb250ZXh0KSB7Ci0Jc2V0RXhjZXB0aW9uVHlwZU5hbWUoZXhjZXB0aW9uVHlwZU5hbWUpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBleGNlcHRpb24gdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEV4Y2VwdGlvblR5cGUoKSB7Ci0JCWlmIChleGNlcHRpb25UeXBlICE9IG51bGwgJiYgZXhjZXB0aW9uVHlwZS5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkRXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7Ci0JCQlleGNlcHRpb25UeXBlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZXhjZXB0aW9uVHlwZSk7Ci0JCQlpZiAoZXhjZXB0aW9uVHlwZSAhPSBvbGRFeGNlcHRpb25UeXBlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFLCBvbGRFeGNlcHRpb25UeXBlLCBleGNlcHRpb25UeXBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV4Y2VwdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldEV4Y2VwdGlvblR5cGUoKSB7Ci0JCXJldHVybiBleGNlcHRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvblR5cGUoSmF2YUNsYXNzIG5ld0V4Y2VwdGlvblR5cGUpIHsKLQkJSmF2YUNsYXNzIG9sZEV4Y2VwdGlvblR5cGUgPSBleGNlcHRpb25UeXBlOwotCQlleGNlcHRpb25UeXBlID0gbmV3RXhjZXB0aW9uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFLCBvbGRFeGNlcHRpb25UeXBlLCBleGNlcHRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fV0VCX0FQUCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19XRUJfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RXhjZXB0aW9uVHlwZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEV4Y2VwdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gZXhjZXB0aW9uVHlwZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJc2V0RXhjZXB0aW9uVHlwZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fTE9DQVRJT046Ci0JCQkJc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJc2V0RXhjZXB0aW9uVHlwZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjliMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIERlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYSBVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlIGZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlckltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBGaWx0ZXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5pdFBhcmFtcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBmaWx0ZXJDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdFBhcmFtVmFsdWVzKCkgPGVtPkluaXQgUGFyYW0gVmFsdWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRQYXJhbVZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbVZhbHVlcyA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcm90ZWN0ZWQgRmlsdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogZ2V0SW5pdFBhcmFtcygpIGlzIHVzZWQgZm9yIEoyRUUxLjMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpIHsKLQkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5pdFBhcmFtLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEZpbHRlckNsYXNzKCkgewotCQlpZiAoZmlsdGVyQ2xhc3MgIT0gbnVsbCAmJiBmaWx0ZXJDbGFzcy5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkRmlsdGVyQ2xhc3MgPSBmaWx0ZXJDbGFzczsKLQkJCWZpbHRlckNsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZmlsdGVyQ2xhc3MpOwotCQkJaWYgKGZpbHRlckNsYXNzICE9IG9sZEZpbHRlckNsYXNzKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTLCBvbGRGaWx0ZXJDbGFzcywgZmlsdGVyQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBiYXNpY0dldEZpbHRlckNsYXNzKCkgewotCQlyZXR1cm4gZmlsdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyQ2xhc3MoSmF2YUNsYXNzIG5ld0ZpbHRlckNsYXNzKSB7Ci0JCUphdmFDbGFzcyBvbGRGaWx0ZXJDbGFzcyA9IGZpbHRlckNsYXNzOwotCQlmaWx0ZXJDbGFzcyA9IG5ld0ZpbHRlckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1MsIG9sZEZpbHRlckNsYXNzLCBmaWx0ZXJDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogZ2V0SW5pdFBhcmFtVmFsdWVzKCkgaXMgdXNlZCBmb3IgSjJFRTEuNAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5pdFBhcmFtVmFsdWVzKCkgewotCQlpZiAoaW5pdFBhcmFtVmFsdWVzID09IG51bGwpIHsKLQkJCWluaXRQYXJhbVZhbHVlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbVZhbHVlLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1WYWx1ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JQ09OUzoKLQkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIGdldFNtYWxsSWNvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFBhcmFtcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGaWx0ZXJDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldEZpbHRlckNsYXNzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1WYWx1ZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbXMgIT0gbnVsbCAmJiAhaW5pdFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKLQkJCQlyZXR1cm4gZmlsdGVyQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbVZhbHVlcyAhPSBudWxsICYmICFpbml0UGFyYW1WYWx1ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6Ci0JCQkJc2V0RmlsdGVyQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNX1ZBTFVFUzoKLQkJCQlnZXRJbml0UGFyYW1WYWx1ZXMoKS5jbGVhcigpOwotCQkJCWdldEluaXRQYXJhbVZhbHVlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbihTTUFMTF9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKERJU1BMQVlfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKLQkJCQlzZXRGaWx0ZXJDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fSU5JVF9QQVJBTV9WQUxVRVM6Ci0JCQkJZ2V0SW5pdFBhcmFtVmFsdWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHRhcmdldE5hbWUpOwotfQotCi0KLXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyQ2xhc3NOYW1lKCkgewotCWdldEZpbHRlckNsYXNzKCk7Ci0JcmV0dXJuIChmaWx0ZXJDbGFzcyA9PSBudWxsKSA/IG51bGwgOiBmaWx0ZXJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRGaWx0ZXJDbGFzc05hbWUoU3RyaW5nIGZpbHRlckNsYXNzTmFtZSkgewotCWVTZXQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKSwgY3JlYXRlQ2xhc3NSZWYoZmlsdGVyQ2xhc3NOYW1lKSk7Ci19Ci19IC8vRmlsdGVySW1wbAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjEwZGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRmlsdGVyTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5EaXNwYXRjaGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvIGEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uIHNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhIHNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgPGZpbHRlcm5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIDxmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCi0gKiBAaW52YXJpYW50IFRoZSBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgRmlsdGVyOjpuYW1lIG9mIG9uZSBvZiB0aGUgRmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJNYXBwaW5nSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRmlsdGVyTWFwcGluZywgRU9iamVjdHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmxQYXR0ZXJuKCkgPGVtPlVybCBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmxQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFUVEVSTl9FREVGQVVMVCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFN0cmluZyBzZXJ2bGV0TmFtZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVybFBhdHRlcm4gPSBVUkxfUEFUVEVSTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwYXRjaGVyVHlwZSgpIDxlbT5EaXNwYXRjaGVyIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGF0Y2hlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwYXRjaGVyVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlcnZsZXQgc2VydmxldCA9IG51bGw7Ci0JcHVibGljIEZpbHRlck1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsdGVyTWFwcGluZygpOwotCX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzZXJ2bGV0IHRoYXQgdGhpcyBtYXBwaW5nIGFwcGxpZXMgdG8uCi0gKi8KLQlwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KCl7Ci0JU2VydmxldCBsc2VydmxldCA9IHRoaXMuZ2V0U2VydmxldEdlbigpOwotCWlmIChsc2VydmxldCA9PSBudWxsICYmIHNlcnZsZXROYW1lICE9IG51bGwpewotCQlXZWJBcHAgd2ViYXBwID0gKFdlYkFwcCllQ29udGFpbmVyKCk7Ci0JCWlmICh3ZWJhcHAgIT0gbnVsbCl7Ci0JCQlsc2VydmxldD13ZWJhcHAuZ2V0U2VydmxldE5hbWVkKHNlcnZsZXROYW1lKTsKLQkJCWlmIChsc2VydmxldCAhPSBudWxsKSAKLQkJCQlzZXRTZXJ2bGV0KGxzZXJ2bGV0KTsKLQkJfQotCX0KLQlyZXR1cm4gbHNlcnZsZXQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgdGhhdCB0aGlzIG1hcHBpbmcgYXBwbGllcyB0by4KLSAqLwotcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpewotCVN0cmluZyByZXQgPSBudWxsOwotCWlmIChzZXJ2bGV0TmFtZSAhPSBudWxsKQotCQlyZXQgPSAgc2VydmxldE5hbWU7Ci0KLQlTZXJ2bGV0IGxzZXJ2bGV0ID0gZ2V0U2VydmxldCgpOwotCWlmIChsc2VydmxldCAhPSBudWxsKQotCQlyZXQgPSBsc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotCXJldHVybiByZXQ7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgdGhhdCB0aGlzIG1hcHBpbmcgYXBwbGllcyB0by4KLSAqLwotcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIHNlcnZsZXROYW1lKXsKLQl0aGlzLnNlcnZsZXROYW1lID0gc2VydmxldE5hbWU7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0IGZvbGxvdwotCSAqIHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybFBhdHRlcm4oKSB7Ci0JCXJldHVybiB1cmxQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVybFBhdHRlcm4oU3RyaW5nIG5ld1VybFBhdHRlcm4pIHsKLQkJU3RyaW5nIG9sZFVybFBhdHRlcm4gPSB1cmxQYXR0ZXJuOwotCQl1cmxQYXR0ZXJuID0gbmV3VXJsUGF0dGVybjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTiwgb2xkVXJsUGF0dGVybiwgdXJsUGF0dGVybikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREaXNwYXRjaGVyVHlwZSgpIHsKLQkJaWYgKGRpc3BhdGNoZXJUeXBlID09IG51bGwpIHsKLQkJCWRpc3BhdGNoZXJUeXBlID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KERpc3BhdGNoZXJUeXBlLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJfVFlQRSk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BhdGNoZXJUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBmaWx0ZXIgYmVpbmcgbWFwcGVkCi0JICovCi0JcHVibGljIEZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIuZUlzUHJveHkoKSkgewotCQkJRmlsdGVyIG9sZEZpbHRlciA9IGZpbHRlcjsKLQkJCWZpbHRlciA9IChGaWx0ZXIpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWZpbHRlcik7Ci0JCQlpZiAoZmlsdGVyICE9IG9sZEZpbHRlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSLCBvbGRGaWx0ZXIsIGZpbHRlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZpbHRlciBiYXNpY0dldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoRmlsdGVyIG5ld0ZpbHRlcikgewotCQlGaWx0ZXIgb2xkRmlsdGVyID0gZmlsdGVyOwotCQlmaWx0ZXIgPSBuZXdGaWx0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSLCBvbGRGaWx0ZXIsIGZpbHRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXQoU2VydmxldCBsKSB7Ci0JCXNlcnZsZXROYW1lID0gbnVsbDsKLQkJc2V0U2VydmxldEdlbihsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0R2VuKFNlcnZsZXQgbmV3U2VydmxldCkgewotCQlTZXJ2bGV0IG9sZFNlcnZsZXQgPSBzZXJ2bGV0OwotCQlzZXJ2bGV0ID0gbmV3U2VydmxldDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVULCBvbGRTZXJ2bGV0LCBzZXJ2bGV0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXJldHVybiBnZXRVcmxQYXR0ZXJuKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFOgotCQkJCXJldHVybiBnZXREaXNwYXRjaGVyVHlwZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUjoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEZpbHRlcigpOwotCQkJCXJldHVybiBiYXNpY0dldEZpbHRlcigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXJ2bGV0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmxldCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gVVJMX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHVybFBhdHRlcm4gIT0gbnVsbCA6ICFVUkxfUEFUVEVSTl9FREVGQVVMVC5lcXVhbHModXJsUGF0dGVybik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFOgotCQkJCXJldHVybiBkaXNwYXRjaGVyVHlwZSAhPSBudWxsICYmICFkaXNwYXRjaGVyVHlwZS5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSOgotCQkJCXJldHVybiBmaWx0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVUOgotCQkJCXJldHVybiBzZXJ2bGV0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIChSZW1vdmVkIEdlbmVyYXRlZCBmbGFnIHRvIHByZXNlcnZlIG92ZXJyaWRlIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgTk9UIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlzZXRVcmxQYXR0ZXJuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJZ2V0RGlzcGF0Y2hlclR5cGUoKS5jbGVhcigpOwotCQkJCWdldERpc3BhdGNoZXJUeXBlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fRklMVEVSOgotCQkJCXNldEZpbHRlcigoRmlsdGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlpZihuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkgICAgICAgICAgICAgICAgc2V0U2VydmxldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JICAgICAgICAgICAgZWxzZQotCSAgICAgICAgICAgICAgICBzZXRTZXJ2bGV0KChTZXJ2bGV0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXNldFVybFBhdHRlcm4oVVJMX1BBVFRFUk5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19ESVNQQVRDSEVSX1RZUEU6Ci0JCQkJZ2V0RGlzcGF0Y2hlclR5cGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVI6Ci0JCQkJc2V0RmlsdGVyKChGaWx0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJc2V0U2VydmxldCgoU2VydmxldCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOy8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmxQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaXNwYXRjaGVyVHlwZTogIik7Ly8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGRpc3BhdGNoZXJUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQW4gb3B0aW9uYWwgc2VydmxldCB0aGF0IGlzIG1hcHBlZCBieSBhIGZpbHRlciBtYXBwaW5nLiAgc2VydmxldE5hbWUgaXMgdXNlZCB0byByZXNvbHZlIHRoZSBzZXJ2bGV0IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0R2VuKCkgewotCQlpZiAoc2VydmxldCAhPSBudWxsICYmIHNlcnZsZXQuZUlzUHJveHkoKSkgewotCQkJU2VydmxldCBvbGRTZXJ2bGV0ID0gc2VydmxldDsKLQkJCXNlcnZsZXQgPSAoU2VydmxldCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3Qpc2VydmxldCk7Ci0JCQlpZiAoc2VydmxldCAhPSBvbGRTZXJ2bGV0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19TRVJWTEVULCBvbGRTZXJ2bGV0LCBzZXJ2bGV0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcnZsZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZsZXQgYmFzaWNHZXRTZXJ2bGV0KCkgewotCQlyZXR1cm4gc2VydmxldDsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Zvcm1Mb2dpbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM0MDExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIFRoZSBmb3JtLWxvZ2luLWNvbmZpZyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yIHBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZCBhdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtTG9naW5Db25maWdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBGb3JtTG9naW5Db25maWcsIEVPYmplY3QgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1Mb2dpblBhZ2UoKSA8ZW0+Rm9ybSBMb2dpbiBQYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtTG9naW5QYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtTG9naW5QYWdlID0gRk9STV9MT0dJTl9QQUdFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtRXJyb3JQYWdlKCkgPGVtPkZvcm0gRXJyb3IgUGFnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybUVycm9yUGFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZm9ybUVycm9yUGFnZSA9IEZPUk1fRVJST1JfUEFHRV9FREVGQVVMVDsKLQlwdWJsaWMgRm9ybUxvZ2luQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvcm1Mb2dpbkNvbmZpZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgcGFnZQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxvZ2luUGFnZSgpIHsKLQkJcmV0dXJuIGZvcm1Mb2dpblBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybUxvZ2luUGFnZShTdHJpbmcgbmV3Rm9ybUxvZ2luUGFnZSkgewotCQlTdHJpbmcgb2xkRm9ybUxvZ2luUGFnZSA9IGZvcm1Mb2dpblBhZ2U7Ci0JCWZvcm1Mb2dpblBhZ2UgPSBuZXdGb3JtTG9naW5QYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRSwgb2xkRm9ybUxvZ2luUGFnZSwgZm9ybUxvZ2luUGFnZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgCi0JICogcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIGZvcm1FcnJvclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybUVycm9yUGFnZShTdHJpbmcgbmV3Rm9ybUVycm9yUGFnZSkgewotCQlTdHJpbmcgb2xkRm9ybUVycm9yUGFnZSA9IGZvcm1FcnJvclBhZ2U7Ci0JCWZvcm1FcnJvclBhZ2UgPSBuZXdGb3JtRXJyb3JQYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSwgb2xkRm9ybUVycm9yUGFnZSwgZm9ybUVycm9yUGFnZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBMb2dpbkNvbmZpZyBnZXRMb2dpbkNvbmZpZygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUcpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKExvZ2luQ29uZmlnKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9naW5Db25maWcoTG9naW5Db25maWcgbmV3TG9naW5Db25maWcpIHsKLQkJaWYgKG5ld0xvZ2luQ29uZmlnICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUcgJiYgbmV3TG9naW5Db25maWcgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdMb2dpbkNvbmZpZykpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3TG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TG9naW5Db25maWcpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHLCBMb2dpbkNvbmZpZy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3TG9naW5Db25maWcsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHLCBuZXdMb2dpbkNvbmZpZywgbmV3TG9naW5Db25maWcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUc6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUcsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgTG9naW5Db25maWcuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRToKLQkJCQlyZXR1cm4gZ2V0Rm9ybUxvZ2luUGFnZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRToKLQkJCQlyZXR1cm4gZ2V0Rm9ybUVycm9yUGFnZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0TG9naW5Db25maWcoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgotCQkJCXJldHVybiBGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQgPT0gbnVsbCA/IGZvcm1Mb2dpblBhZ2UgIT0gbnVsbCA6ICFGT1JNX0xPR0lOX1BBR0VfRURFRkFVTFQuZXF1YWxzKGZvcm1Mb2dpblBhZ2UpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRToKLQkJCQlyZXR1cm4gRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUID09IG51bGwgPyBmb3JtRXJyb3JQYWdlICE9IG51bGwgOiAhRk9STV9FUlJPUl9QQUdFX0VERUZBVUxULmVxdWFscyhmb3JtRXJyb3JQYWdlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldExvZ2luQ29uZmlnKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6Ci0JCQkJc2V0Rm9ybUxvZ2luUGFnZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXNldEZvcm1FcnJvclBhZ2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRMb2dpbkNvbmZpZygoTG9naW5Db25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgotCQkJCXNldEZvcm1Mb2dpblBhZ2UoRk9STV9MT0dJTl9QQUdFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9FUlJPUl9QQUdFOgotCQkJCXNldEZvcm1FcnJvclBhZ2UoRk9STV9FUlJPUl9QQUdFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgotCQkJCXNldExvZ2luQ29uZmlnKChMb2dpbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZvcm1Mb2dpblBhZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZvcm1Mb2dpblBhZ2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZvcm1FcnJvclBhZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZvcm1FcnJvclBhZ2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0hUVFBNZXRob2RUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9IVFRQTWV0aG9kVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5YzhkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0hUVFBNZXRob2RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhUVFAgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuSFRUUE1ldGhvZFR5cGVJbXBsI2dldEh0dHBNZXRob2QgPGVtPkh0dHAgTWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUE1ldGhvZFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBIVFRQTWV0aG9kVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh0dHBNZXRob2QoKSA8ZW0+SHR0cCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh0dHBNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh0dHBNZXRob2QoKSA8ZW0+SHR0cCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh0dHBNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHR0cE1ldGhvZCA9IEhUVFBfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBNZXRob2RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUE1ldGhvZFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh0dHBNZXRob2QoKSB7Ci0JCXJldHVybiBodHRwTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh0dHBNZXRob2QoU3RyaW5nIG5ld0h0dHBNZXRob2QpIHsKLQkJU3RyaW5nIG9sZEh0dHBNZXRob2QgPSBodHRwTWV0aG9kOwotCQlodHRwTWV0aG9kID0gbmV3SHR0cE1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9ELCBvbGRIdHRwTWV0aG9kLCBodHRwTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEh0dHBNZXRob2QoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRDoKLQkJCQlzZXRIdHRwTWV0aG9kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRDoKLQkJCQlzZXRIdHRwTWV0aG9kKEhUVFBfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EOgotCQkJCXJldHVybiBIVFRQX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gaHR0cE1ldGhvZCAhPSBudWxsIDogIUhUVFBfTUVUSE9EX0VERUZBVUxULmVxdWFscyhodHRwTWV0aG9kKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGh0dHBNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh0dHBNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9IVFRQTWV0aG9kVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSW5pdFBhcmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MThiZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKLSAqLwotcHVibGljIGNsYXNzIEluaXRQYXJhbUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluaXRQYXJhbSwgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1OYW1lKCkgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtTmFtZSA9IFBBUkFNX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVmFsdWUoKSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyYW1WYWx1ZSA9IFBBUkFNX1ZBTFVFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQlwdWJsaWMgSW5pdFBhcmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIAotCSAqIAotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbU5hbWUoKSB7Ci0JCXJldHVybiBwYXJhbU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1OYW1lKFN0cmluZyBuZXdQYXJhbU5hbWUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtTmFtZSA9IHBhcmFtTmFtZTsKLQkJcGFyYW1OYW1lID0gbmV3UGFyYW1OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSwgb2xkUGFyYW1OYW1lLCBwYXJhbU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtVmFsdWUoKSB7Ci0JCXJldHVybiBwYXJhbVZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIG5ld1BhcmFtVmFsdWUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlOwotCQlwYXJhbVZhbHVlID0gbmV3UGFyYW1WYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFLCBvbGRQYXJhbVZhbHVlLCBwYXJhbVZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXJldHVybiBnZXRQYXJhbU5hbWUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFOgotCQkJCXJldHVybiBnZXRQYXJhbVZhbHVlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXJldHVybiBQQVJBTV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwYXJhbU5hbWUgIT0gbnVsbCA6ICFQQVJBTV9OQU1FX0VERUZBVUxULmVxdWFscyhwYXJhbU5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJcmV0dXJuIFBBUkFNX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBwYXJhbVZhbHVlICE9IG51bGwgOiAhUEFSQU1fVkFMVUVfRURFRkFVTFQuZXF1YWxzKHBhcmFtVmFsdWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXNldFBhcmFtTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlzZXRQYXJhbVZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXNldFBhcmFtTmFtZShQQVJBTV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlzZXRQYXJhbVZhbHVlKFBBUkFNX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJhbU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmFtTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1WYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1WYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KU1BUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KU1BUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTFhNjEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSlNQVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSlNQVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlSW1wbCBleHRlbmRzIFdlYlR5cGVJbXBsIGltcGxlbWVudHMgSlNQVHlwZSB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnNwRmlsZSgpIDxlbT5Kc3AgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SnNwRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqc3BGaWxlID0gSlNQX0ZJTEVfRURFRkFVTFQ7Ci0JcHVibGljIEpTUFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SlNQVHlwZSgpOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNKc3BUeXBlKCkgewotCXJldHVybiB0cnVlOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4gdGhlIHdlYgotCSAqIGFwcGxpY2F0aW9uLgotCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc3BGaWxlKCkgewotCQlyZXR1cm4ganNwRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKc3BGaWxlKFN0cmluZyBuZXdKc3BGaWxlKSB7Ci0JCVN0cmluZyBvbGRKc3BGaWxlID0ganNwRmlsZTsKLQkJanNwRmlsZSA9IG5ld0pzcEZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEUsIG9sZEpzcEZpbGUsIGpzcEZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEpzcEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEU6Ci0JCQkJcmV0dXJuIEpTUF9GSUxFX0VERUZBVUxUID09IG51bGwgPyBqc3BGaWxlICE9IG51bGwgOiAhSlNQX0ZJTEVfRURFRkFVTFQuZXF1YWxzKGpzcEZpbGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSlNQX1RZUEVfX0pTUF9GSUxFOgotCQkJCXNldEpzcEZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFX19KU1BfRklMRToKLQkJCQlzZXRKc3BGaWxlKEpTUF9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGpzcEZpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpzcEZpbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzNjI1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsI2dldExvY2FsZSA8ZW0+TG9jYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkxvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExvY2FsRW5jb2RpbmdNYXBwaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxlKCkgPGVtPkxvY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYWxlKCkgPGVtPkxvY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsZSA9IExPQ0FMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZygpIDxlbT5FbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW5jb2RpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nKCkgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbmNvZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZyA9IEVOQ09ESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKLQkJcmV0dXJuIGxvY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIG5ld0xvY2FsZSkgewotCQlTdHJpbmcgb2xkTG9jYWxlID0gbG9jYWxlOwotCQlsb2NhbGUgPSBuZXdMb2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19MT0NBTEUsIG9sZExvY2FsZSwgbG9jYWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIGVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBuZXdFbmNvZGluZykgewotCQlTdHJpbmcgb2xkRW5jb2RpbmcgPSBlbmNvZGluZzsKLQkJZW5jb2RpbmcgPSBuZXdFbmNvZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HLCBvbGRFbmNvZGluZywgZW5jb2RpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19MT0NBTEU6Ci0JCQkJcmV0dXJuIGdldExvY2FsZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fRU5DT0RJTkc6Ci0JCQkJcmV0dXJuIGdldEVuY29kaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFOgotCQkJCXNldExvY2FsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORzoKLQkJCQlzZXRFbmNvZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFOgotCQkJCXNldExvY2FsZShMT0NBTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0VOQ09ESU5HOgotCQkJCXNldEVuY29kaW5nKEVOQ09ESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKLQkJCQlyZXR1cm4gTE9DQUxFX0VERUZBVUxUID09IG51bGwgPyBsb2NhbGUgIT0gbnVsbCA6ICFMT0NBTEVfRURFRkFVTFQuZXF1YWxzKGxvY2FsZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORzoKLQkJCQlyZXR1cm4gRU5DT0RJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGVuY29kaW5nICE9IG51bGwgOiAhRU5DT0RJTkdfRURFRkFVTFQuZXF1YWxzKGVuY29kaW5nKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2FsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9jYWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbmNvZGluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW5jb2RpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYzlmNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsI2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncyA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsb2NhbEVuY29kaW5nTWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKSB7Ci0JCWlmIChsb2NhbEVuY29kaW5nTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgotCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdzICE9IG51bGwgJiYgIWxvY2FsRW5jb2RpbmdNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9naW5Db25maWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvZ2luQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTg2NTg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9naW5Db25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhNZXRob2RLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIFRoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KLSAqIG1lY2hhbmlzbS4KLSAqLwotcHVibGljIGNsYXNzIExvZ2luQ29uZmlnSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTG9naW5Db25maWcsIEVPYmplY3QgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhNZXRob2QoKSA8ZW0+QXV0aCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgQVVUSF9NRVRIT0RfRURFRkFVTFQgPSBBdXRoTWV0aG9kS2luZC5VTlNQRUNJRklFRF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEF1dGhNZXRob2RLaW5kIGF1dGhNZXRob2QgPSBBVVRIX01FVEhPRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dGggTWV0aG9kIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRoTWV0aG9kRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWxtTmFtZSgpIDxlbT5SZWFsbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFsbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUxNX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFsbU5hbWUgPSBSRUFMTV9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkgPGVtPkF1dGhvcml6YXRpb24gTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJWkFUSU9OX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkgPGVtPkF1dGhvcml6YXRpb24gTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JpemF0aW9uTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvcml6YXRpb25NZXRob2QgPSBBVVRIT1JJWkFUSU9OX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBGb3JtTG9naW5Db25maWcgZm9ybUxvZ2luQ29uZmlnID0gbnVsbDsKLQlwdWJsaWMgTG9naW5Db25maWdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9naW5Db25maWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGZvcgotCSAqIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzCi0JICogd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUKLQkgKiBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlIAotCSAqICJCQVNJQyIsICJESUdFU1QiLCAiRk9STSIsIG9yICJDTElFTlQtQ0VSVCIuCi0JICovCi0JcHVibGljIEF1dGhNZXRob2RLaW5kIGdldEF1dGhNZXRob2QoKSB7Ci0JCXJldHVybiBhdXRoTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhNZXRob2QoQXV0aE1ldGhvZEtpbmQgbmV3QXV0aE1ldGhvZCkgewotCQlBdXRoTWV0aG9kS2luZCBvbGRBdXRoTWV0aG9kID0gYXV0aE1ldGhvZDsKLQkJYXV0aE1ldGhvZCA9IG5ld0F1dGhNZXRob2QgPT0gbnVsbCA/IEFVVEhfTUVUSE9EX0VERUZBVUxUIDogbmV3QXV0aE1ldGhvZDsKLQkJYm9vbGVhbiBvbGRBdXRoTWV0aG9kRVNldCA9IGF1dGhNZXRob2RFU2V0OwotCQlhdXRoTWV0aG9kRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9ELCBvbGRBdXRoTWV0aG9kLCBhdXRoTWV0aG9kLCAhb2xkQXV0aE1ldGhvZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dGhNZXRob2QoKSB7Ci0JCUF1dGhNZXRob2RLaW5kIG9sZEF1dGhNZXRob2QgPSBhdXRoTWV0aG9kOwotCQlib29sZWFuIG9sZEF1dGhNZXRob2RFU2V0ID0gYXV0aE1ldGhvZEVTZXQ7Ci0JCWF1dGhNZXRob2QgPSBBVVRIX01FVEhPRF9FREVGQVVMVDsKLQkJYXV0aE1ldGhvZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRCwgb2xkQXV0aE1ldGhvZCwgQVVUSF9NRVRIT0RfRURFRkFVTFQsIG9sZEF1dGhNZXRob2RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBdXRoTWV0aG9kKCkgewotCQlyZXR1cm4gYXV0aE1ldGhvZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8gdXNlIGluIEhUVFAgQmFzaWMKLQkgKiBhdXRob3JpemF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFsbU5hbWUoKSB7Ci0JCXJldHVybiByZWFsbU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhbG1OYW1lKFN0cmluZyBuZXdSZWFsbU5hbWUpIHsKLQkJU3RyaW5nIG9sZFJlYWxtTmFtZSA9IHJlYWxtTmFtZTsKLQkJcmVhbG1OYW1lID0gbmV3UmVhbG1OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FLCBvbGRSZWFsbU5hbWUsIHJlYWxtTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yaXphdGlvbk1ldGhvZCgpIHsKLQkJcmV0dXJuIGF1dGhvcml6YXRpb25NZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9yaXphdGlvbk1ldGhvZChTdHJpbmcgbmV3QXV0aG9yaXphdGlvbk1ldGhvZCkgewotCQlTdHJpbmcgb2xkQXV0aG9yaXphdGlvbk1ldGhvZCA9IGF1dGhvcml6YXRpb25NZXRob2Q7Ci0JCWF1dGhvcml6YXRpb25NZXRob2QgPSBuZXdBdXRob3JpemF0aW9uTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIT1JJWkFUSU9OX01FVEhPRCwgb2xkQXV0aG9yaXphdGlvbk1ldGhvZCwgYXV0aG9yaXphdGlvbk1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJBcHApZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQlpZiAobmV3V2ViQXBwICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUcsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEZvcm1Mb2dpbkNvbmZpZyBnZXRGb3JtTG9naW5Db25maWcoKSB7Ci0JCXJldHVybiBmb3JtTG9naW5Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Rm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBuZXdGb3JtTG9naW5Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRm9ybUxvZ2luQ29uZmlnIG9sZEZvcm1Mb2dpbkNvbmZpZyA9IGZvcm1Mb2dpbkNvbmZpZzsKLQkJZm9ybUxvZ2luQ29uZmlnID0gbmV3Rm9ybUxvZ2luQ29uZmlnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgb2xkRm9ybUxvZ2luQ29uZmlnLCBuZXdGb3JtTG9naW5Db25maWcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgbmV3Rm9ybUxvZ2luQ29uZmlnKSB7Ci0JCWlmIChuZXdGb3JtTG9naW5Db25maWcgIT0gZm9ybUxvZ2luQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChmb3JtTG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZm9ybUxvZ2luQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdGb3JtTG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Rm9ybUxvZ2luQ29uZmlnKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEZvcm1Mb2dpbkNvbmZpZyhuZXdGb3JtTG9naW5Db25maWcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUcsIG5ld0Zvcm1Mb2dpbkNvbmZpZywgbmV3Rm9ybUxvZ2luQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFAsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJCWlmIChmb3JtTG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmb3JtTG9naW5Db25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEZvcm1Mb2dpbkNvbmZpZygoRm9ybUxvZ2luQ29uZmlnKW90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRGb3JtTG9naW5Db25maWcobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEF1dGhNZXRob2QoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fUkVBTE1fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UmVhbG1OYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EOgotCQkJCXJldHVybiBnZXRBdXRob3JpemF0aW9uTWV0aG9kKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0Rm9ybUxvZ2luQ29uZmlnKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKLQkJCQlyZXR1cm4gaXNTZXRBdXRoTWV0aG9kKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUU6Ci0JCQkJcmV0dXJuIFJFQUxNX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlYWxtTmFtZSAhPSBudWxsIDogIVJFQUxNX05BTUVfRURFRkFVTFQuZXF1YWxzKHJlYWxtTmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EOgotCQkJCXJldHVybiBBVVRIT1JJWkFUSU9OX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gYXV0aG9yaXphdGlvbk1ldGhvZCAhPSBudWxsIDogIUFVVEhPUklaQVRJT05fTUVUSE9EX0VERUZBVUxULmVxdWFscyhhdXRob3JpemF0aW9uTWV0aG9kKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGZvcm1Mb2dpbkNvbmZpZyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKLQkJCQlzZXRBdXRoTWV0aG9kKChBdXRoTWV0aG9kS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19SRUFMTV9OQU1FOgotCQkJCXNldFJlYWxtTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EOgotCQkJCXNldEF1dGhvcml6YXRpb25NZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fQ09ORklHOgotCQkJCXNldEZvcm1Mb2dpbkNvbmZpZygoRm9ybUxvZ2luQ29uZmlnKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKLQkJCQl1bnNldEF1dGhNZXRob2QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1JFQUxNX05BTUU6Ci0JCQkJc2V0UmVhbG1OYW1lKFJFQUxNX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSE9SSVpBVElPTl9NRVRIT0Q6Ci0JCQkJc2V0QXV0aG9yaXphdGlvbk1ldGhvZChBVVRIT1JJWkFUSU9OX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6Ci0JCQkJc2V0Rm9ybUxvZ2luQ29uZmlnKChGb3JtTG9naW5Db25maWcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdXRoTWV0aG9kOiAiKTsKLQkJaWYgKGF1dGhNZXRob2RFU2V0KSByZXN1bHQuYXBwZW5kKGF1dGhNZXRob2QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFsbU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlYWxtTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yaXphdGlvbk1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXV0aG9yaXphdGlvbk1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTWltZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01pbWVNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWNiODIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTWltZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uIGFuZCBhIG1pbWUgdHlwZS4KLQotICovCi1wdWJsaWMgY2xhc3MgTWltZU1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNaW1lTWFwcGluZywgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5zaW9uKCkgPGVtPkV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb24gPSBFWFRFTlNJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbWVUeXBlKCkgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWltZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1pbWVUeXBlID0gTUlNRV9UWVBFX0VERUZBVUxUOwotCXB1YmxpYyBNaW1lTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRNaW1lTWFwcGluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIG5ld0V4dGVuc2lvbikgewotCQlTdHJpbmcgb2xkRXh0ZW5zaW9uID0gZXh0ZW5zaW9uOwotCQlleHRlbnNpb24gPSBuZXdFeHRlbnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTiwgb2xkRXh0ZW5zaW9uLCBleHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgbWltZS10eXBlIGVsZW1lbnQgY29udGFpbnMgYSBkZWZpbmVkIG1pbWUgdHlwZS4gZXhhbXBsZTogInRleHQvL3BsYWluIgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBtaW1lVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbmV3TWltZVR5cGUpIHsKLQkJU3RyaW5nIG9sZE1pbWVUeXBlID0gbWltZVR5cGU7Ci0JCW1pbWVUeXBlID0gbmV3TWltZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX01JTUVfVFlQRSwgb2xkTWltZVR5cGUsIG1pbWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1MsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFAsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFAsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046Ci0JCQkJcmV0dXJuIGdldEV4dGVuc2lvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGdldE1pbWVUeXBlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgotCQkJCXJldHVybiBFWFRFTlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVuc2lvbiAhPSBudWxsIDogIUVYVEVOU0lPTl9FREVGQVVMVC5lcXVhbHMoZXh0ZW5zaW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fTUlNRV9UWVBFOgotCQkJCXJldHVybiBNSU1FX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IG1pbWVUeXBlICE9IG51bGwgOiAhTUlNRV9UWVBFX0VERUZBVUxULmVxdWFscyhtaW1lVHlwZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTjoKLQkJCQlzZXRFeHRlbnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEU6Ci0JCQkJc2V0TWltZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046Ci0JCQkJc2V0RXh0ZW5zaW9uKEVYVEVOU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19NSU1FX1RZUEU6Ci0JCQkJc2V0TWltZVR5cGUoTUlNRV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHRlbnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4dGVuc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWltZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1pbWVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Sb2xlTmFtZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1JvbGVOYW1lVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4ODZmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1JvbGVOYW1lVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTmFtZVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSb2xlTmFtZVR5cGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVOYW1lKCkgPGVtPlJvbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGVOYW1lID0gUk9MRV9OQU1FX0VERUZBVUxUOwotCXB1YmxpYyBSb2xlTmFtZVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZU5hbWVUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZSgpIHsKLQkJcmV0dXJuIHJvbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFN0cmluZyBuZXdSb2xlTmFtZSkgewotCQlTdHJpbmcgb2xkUm9sZU5hbWUgPSByb2xlTmFtZTsKLQkJcm9sZU5hbWUgPSBuZXdSb2xlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUUsIG9sZFJvbGVOYW1lLCByb2xlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJPTEVfTkFNRV9UWVBFX19ST0xFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJvbGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRToKLQkJCQlyZXR1cm4gUk9MRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyByb2xlTmFtZSAhPSBudWxsIDogIVJPTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMocm9sZU5hbWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRToKLQkJCQlzZXRSb2xlTmFtZShST0xFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocm9sZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUNvbnN0cmFpbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2ODhhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlDb25zdHJhaW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VjdXJpdHlDb25zdHJhaW50LCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZSgpIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQXV0aENvbnN0cmFpbnQgYXV0aENvbnN0cmFpbnQgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBVc2VyRGF0YUNvbnN0cmFpbnQgdXNlckRhdGFDb25zdHJhaW50ID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JcHVibGljIFNlY3VyaXR5Q29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCVN0cmluZyBvbGREaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQlkaXNwbGF5TmFtZSA9IG5ld0Rpc3BsYXlOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FLCBvbGREaXNwbGF5TmFtZSwgZGlzcGxheU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQLCBuZXdXZWJBcHAsIG5ld1dlYkFwcCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkgewotCQlpZiAod2ViUmVzb3VyY2VDb2xsZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UKTsKLQkJfQotCQlyZXR1cm4gd2ViUmVzb3VyY2VDb2xsZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQXV0aENvbnN0cmFpbnQgZ2V0QXV0aENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBhdXRoQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCBuZXdBdXRoQ29uc3RyYWludCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBdXRoQ29uc3RyYWludCBvbGRBdXRoQ29uc3RyYWludCA9IGF1dGhDb25zdHJhaW50OwotCQlhdXRoQ29uc3RyYWludCA9IG5ld0F1dGhDb25zdHJhaW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5ULCBvbGRBdXRoQ29uc3RyYWludCwgbmV3QXV0aENvbnN0cmFpbnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG5ld0F1dGhDb25zdHJhaW50KSB7Ci0JCWlmIChuZXdBdXRoQ29uc3RyYWludCAhPSBhdXRoQ29uc3RyYWludCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXV0aENvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXV0aENvbnN0cmFpbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBBdXRoQ29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3QXV0aENvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXV0aENvbnN0cmFpbnQpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBBdXRoQ29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBdXRoQ29uc3RyYWludChuZXdBdXRoQ29uc3RyYWludCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5ULCBuZXdBdXRoQ29uc3RyYWludCwgbmV3QXV0aENvbnN0cmFpbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgVXNlckRhdGFDb25zdHJhaW50IGdldFVzZXJEYXRhQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IG5ld1VzZXJEYXRhQ29uc3RyYWludCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlVc2VyRGF0YUNvbnN0cmFpbnQgb2xkVXNlckRhdGFDb25zdHJhaW50ID0gdXNlckRhdGFDb25zdHJhaW50OwotCQl1c2VyRGF0YUNvbnN0cmFpbnQgPSBuZXdVc2VyRGF0YUNvbnN0cmFpbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgb2xkVXNlckRhdGFDb25zdHJhaW50LCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgbmV3VXNlckRhdGFDb25zdHJhaW50KSB7Ci0JCWlmIChuZXdVc2VyRGF0YUNvbnN0cmFpbnQgIT0gdXNlckRhdGFDb25zdHJhaW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1c2VyRGF0YUNvbnN0cmFpbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdXNlckRhdGFDb25zdHJhaW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1VzZXJEYXRhQ29uc3RyYWludCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdVc2VyRGF0YUNvbnN0cmFpbnQpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVc2VyRGF0YUNvbnN0cmFpbnQobmV3VXNlckRhdGFDb25zdHJhaW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgbmV3VXNlckRhdGFDb25zdHJhaW50LCBuZXdVc2VyRGF0YUNvbnN0cmFpbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGlzcGxheU5hbWVzKCkgewotCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX0FQUCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQkJaWYgKGF1dGhDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXV0aENvbnN0cmFpbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5ULCBudWxsLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXV0aENvbnN0cmFpbnQoKEF1dGhDb25zdHJhaW50KW90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVDoKLQkJCQkJaWYgKHVzZXJEYXRhQ29uc3RyYWludCAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVzZXJEYXRhQ29uc3RyYWludCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgbnVsbCwgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldFVzZXJEYXRhQ29uc3RyYWludCgoVXNlckRhdGFDb25zdHJhaW50KW90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFAsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF1dGhDb25zdHJhaW50KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1VTRVJfREFUQV9DT05TVFJBSU5UOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRVc2VyRGF0YUNvbnN0cmFpbnQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OU1RSQUlOVFMsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRBdXRoQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zICE9IG51bGwgJiYgIXdlYlJlc291cmNlQ29sbGVjdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fQVVUSF9DT05TVFJBSU5UOgotCQkJCXJldHVybiBhdXRoQ29uc3RyYWludCAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludCAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkaXNwbGF5TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzcGxheU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUzoKLQkJCQlnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0QXV0aENvbnN0cmFpbnQoKEF1dGhDb25zdHJhaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVDoKLQkJCQlzZXRVc2VyRGF0YUNvbnN0cmFpbnQoKFVzZXJEYXRhQ29uc3RyYWludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgotCQkJCWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0FVVEhfQ09OU1RSQUlOVDoKLQkJCQlzZXRBdXRoQ29uc3RyYWludCgoQXV0aENvbnN0cmFpbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0VXNlckRhdGFDb25zdHJhaW50KChVc2VyRGF0YUNvbnN0cmFpbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZDI5NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhIHNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaXMgcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQgbG9hZGVkLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldEltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBTZXJ2bGV0IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2bGV0TmFtZSgpIDxlbT5TZXJ2bGV0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZsZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2bGV0TmFtZSA9IFNFUlZMRVRfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9hZE9uU3RhcnR1cCgpIDxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvYWRPblN0YXJ0dXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgbG9hZE9uU3RhcnR1cCA9IExPQURfT05fU1RBUlRVUF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIExvYWQgT24gU3RhcnR1cCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkT25TdGFydHVwRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFdlYlR5cGUgd2ViVHlwZSA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBhcmFtcyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZVJlZnMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBSdW5Bc1NwZWNpZmllZElkZW50aXR5IHJ1bkFzID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0UGFyYW1zKCkgPGVtPkluaXQgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1zID0gbnVsbDsKLQotCXB1YmxpYyBTZXJ2bGV0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZsZXQoKTsKLQl9Ci0KLS8qKgotICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbGlzdCBvZiB0aGUgbWFwcGluZ3MgdGhhdCB0aGlzCi0gKiBzZXJ2bGV0IHBhcnRpY2lwYXRlcyBpbi4gIFNpbmNlIHNlcnZsZXRNYXBwaW5ncyBpcyBub3QKLSAqIGEgYmktZGlyZWN0aW9uYWwgYXR0cmlidXRlLCBpZiB5b3Ugd2FudCB0byBhZGQgb3IgZGVsZXRlIGEKLSAqIG1hcHBpbmcsIHRoaXMgbXVzdCBiZSBkb25lIGluIHRoZSB3ZWItYXBwLgotICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotICovCi1wdWJsaWMgTGlzdCBnZXRNYXBwaW5ncygpIHsKLQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgZUNvbnRhaW5lcigpOwotCWlmICh3ZWJBcHAgPT0gbnVsbCkgcmV0dXJuIG5ldyBCYXNpY0VMaXN0KDApOwotCQotCUVMaXN0IGFsbE1hcHBpbmdzID0gd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpOwotCUl0ZXJhdG9yIGkgPSBhbGxNYXBwaW5ncy5pdGVyYXRvcigpOwotCUxpc3QgbWFwcGluZ3MgPSBuZXcgVmVjdG9yKCk7Ci0Jd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCVNlcnZsZXRNYXBwaW5nIG1hcHBpbmcgPSAoU2VydmxldE1hcHBpbmcpIGkubmV4dCgpOwotCQlpZiAobWFwcGluZy5nZXRTZXJ2bGV0KCkgPT0gdGhpcykKLQkJCW1hcHBpbmdzLmFkZChtYXBwaW5nKTsKLQl9Ci0JcmV0dXJuIG1hcHBpbmdzOwotfQotLyoqCi0gKiBnZXRQYXJhbXNBc1Byb3BlcnRpZXMgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBQcm9wZXJ0aWVzIGdldFBhcmFtc0FzUHJvcGVydGllcygpIHsKLQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQlMaXN0IGxwYXJhbXMgPSBnZXRQYXJhbXMoKTsKLQlJbml0UGFyYW0gcGFyYW07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBscGFyYW1zLnNpemUoKTsgaSsrKSB7Ci0JCXBhcmFtID0gKEluaXRQYXJhbSkgbHBhcmFtcy5nZXQoaSk7Ci0JCXByb3BzLnNldFByb3BlcnR5KHBhcmFtLmdldFBhcmFtTmFtZSgpLCBwYXJhbS5nZXRQYXJhbVZhbHVlKCkpOwotCX0KLQlyZXR1cm4gcHJvcHM7Ci19Ci0vKioKLSAqIEBzZWUgU2VydmxldAotICovCi1wdWJsaWMgdm9pZCByZVN5bmNTZWN1cml0eVJvbGVSZWYoamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JTGlzdCByb2xlUmVmcyA9IGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0JCVNlY3VyaXR5Um9sZVJlZiByb2xlUmVmID0gKFNlY3VyaXR5Um9sZVJlZikgcm9sZVJlZnMuZ2V0KGkpOwotCQlpZiAocm9sZVJlZi5nZXRMaW5rKCkgIT0gbnVsbCAmJiByb2xlUmVmLmdldExpbmsoKS5lcXVhbHMoZXhpc3RpbmdSb2xlTmFtZSkpCi0JCQlyb2xlUmVmLnNldExpbmsobmV3Um9sZU5hbWUpOwotCX0KLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBzZXJ2bGV0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKSB7Ci0JCXJldHVybiBzZXJ2bGV0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0TmFtZShTdHJpbmcgbmV3U2VydmxldE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNlcnZsZXROYW1lID0gc2VydmxldE5hbWU7Ci0JCXNlcnZsZXROYW1lID0gbmV3U2VydmxldE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUUsIG9sZFNlcnZsZXROYW1lLCBzZXJ2bGV0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIG9uIHRoZSBzdGFydHVwIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZSBlbGVtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIExvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQgYmVmb3JlIGhpZ2hlciBpbnRlZ2Vycy4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIGl0IGF0IGFueSB0aW1lIGluIHRoZSBzdGFydHVwIHNlcXVlbmNlLgotCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0TG9hZE9uU3RhcnR1cCgpIHsKLQkJcmV0dXJuIGxvYWRPblN0YXJ0dXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZE9uU3RhcnR1cChJbnRlZ2VyIG5ld0xvYWRPblN0YXJ0dXApIHsKLQkJSW50ZWdlciBvbGRMb2FkT25TdGFydHVwID0gbG9hZE9uU3RhcnR1cDsKLQkJbG9hZE9uU3RhcnR1cCA9IG5ld0xvYWRPblN0YXJ0dXA7Ci0JCWJvb2xlYW4gb2xkTG9hZE9uU3RhcnR1cEVTZXQgPSBsb2FkT25TdGFydHVwRVNldDsKLQkJbG9hZE9uU3RhcnR1cEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQLCBvbGRMb2FkT25TdGFydHVwLCBsb2FkT25TdGFydHVwLCAhb2xkTG9hZE9uU3RhcnR1cEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHVuc2V0TG9hZE9uU3RhcnR1cCgpIHsKLQkJSW50ZWdlciBvbGRMb2FkT25TdGFydHVwID0gbG9hZE9uU3RhcnR1cDsKLQkJYm9vbGVhbiBvbGRMb2FkT25TdGFydHVwRVNldCA9IGxvYWRPblN0YXJ0dXBFU2V0OwotCQlsb2FkT25TdGFydHVwID0gTE9BRF9PTl9TVEFSVFVQX0VERUZBVUxUOwotCQlsb2FkT25TdGFydHVwRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVAsIG9sZExvYWRPblN0YXJ0dXAsIExPQURfT05fU1RBUlRVUF9FREVGQVVMVCwgb2xkTG9hZE9uU3RhcnR1cEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0TG9hZE9uU3RhcnR1cCgpIHsKLQkJcmV0dXJuIGxvYWRPblN0YXJ0dXBFU2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViQXBwKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYlR5cGUgZ2V0V2ViVHlwZSgpIHsKLQkJcmV0dXJuIHdlYlR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViVHlwZShXZWJUeXBlIG5ld1dlYlR5cGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV2ViVHlwZSBvbGRXZWJUeXBlID0gd2ViVHlwZTsKLQkJd2ViVHlwZSA9IG5ld1dlYlR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfVFlQRSwgb2xkV2ViVHlwZSwgbmV3V2ViVHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViVHlwZShXZWJUeXBlIG5ld1dlYlR5cGUpIHsKLQkJaWYgKG5ld1dlYlR5cGUgIT0gd2ViVHlwZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod2ViVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3ZWJUeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXZWJUeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYlR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2ViVHlwZShuZXdXZWJUeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfVFlQRSwgbmV3V2ViVHlwZSwgbmV3V2ViVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogZ2V0UGFyYW1zKCkgaXMgdXNlZCBmb3IgSjJFRTEuNAotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UGFyYW1zKCkgewotCQlpZiAocGFyYW1zID09IG51bGwpIHsKLQkJCXBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbml0UGFyYW0uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19QQVJBTVMpOwotCQl9Ci0JCXJldHVybiBwYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKSB7Ci0JCWlmIChzZWN1cml0eVJvbGVSZWZzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKLQkJfQotCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJZiBkZWZpbmVkIGZvciBhIHNlcnZsZXQsIG92ZXJyaWRlcyB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdXNlZCB0byBjYWxsIGFuIEVKQiBieSB0aGF0IHNlcnZsZXQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSByb2xlLW5hbWUgaXMgb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBhbHJlYWR5IGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBSdW5Bc1NwZWNpZmllZElkZW50aXR5IGdldFJ1bkFzKCkgewotCQlyZXR1cm4gcnVuQXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UnVuQXMoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBuZXdSdW5BcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSdW5Bc1NwZWNpZmllZElkZW50aXR5IG9sZFJ1bkFzID0gcnVuQXM7Ci0JCXJ1bkFzID0gbmV3UnVuQXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVMsIG9sZFJ1bkFzLCBuZXdSdW5Bcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVuQXMoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBuZXdSdW5BcykgewotCQlpZiAobmV3UnVuQXMgIT0gcnVuQXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJ1bkFzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJ1bkFzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UnVuQXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UnVuQXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJ1bkFzKG5ld1J1bkFzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVMsIG5ld1J1bkFzLCBuZXdSdW5BcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogZ2V0SW5pdFBhcmFtcygpIGlzIHVzZWQgZm9yIEoyRUUxLjMKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluaXRQYXJhbXMoKSB7Ci0JCWlmIChpbml0UGFyYW1zID09IG51bGwpIHsKLQkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEU6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdlYlR5cGUobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fUEFSQU1TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlY3VyaXR5Um9sZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UnVuQXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXJldHVybiBnZXRTZXJ2bGV0TmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQOgotCQkJCXJldHVybiBnZXRMb2FkT25TdGFydHVwKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9UWVBFOgotCQkJCXJldHVybiBnZXRXZWJUeXBlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19QQVJBTVM6Ci0JCQkJcmV0dXJuIGdldFBhcmFtcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVSZWZzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJcmV0dXJuIGdldFJ1bkFzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFBhcmFtcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUU6Ci0JCQkJcmV0dXJuIFNFUlZMRVRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmxldE5hbWUgIT0gbnVsbCA6ICFTRVJWTEVUX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlcnZsZXROYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUDoKLQkJCQlyZXR1cm4gaXNTZXRMb2FkT25TdGFydHVwKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX1RZUEU6Ci0JCQkJcmV0dXJuIHdlYlR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1BBUkFNUzoKLQkJCQlyZXR1cm4gcGFyYW1zICE9IG51bGwgJiYgIXBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJcmV0dXJuIHJ1bkFzICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gaW5pdFBhcmFtcyAhPSBudWxsICYmICFpbml0UGFyYW1zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgotCQkJCXNldFNlcnZsZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUDoKLQkJCQlzZXRMb2FkT25TdGFydHVwKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfVFlQRToKLQkJCQlzZXRXZWJUeXBlKChXZWJUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19QQVJBTVM6Ci0JCQkJZ2V0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJc2V0UnVuQXMoKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TOgotCQkJCWdldEluaXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldEluaXRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUU6Ci0JCQkJc2V0U2VydmxldE5hbWUoU0VSVkxFVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6Ci0JCQkJdW5zZXRMb2FkT25TdGFydHVwKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19XRUJfVFlQRToKLQkJCQlzZXRXZWJUeXBlKChXZWJUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1BBUkFNUzoKLQkJCQlnZXRQYXJhbXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKLQkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6Ci0JCQkJc2V0UnVuQXMoKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2bGV0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VydmxldE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvYWRPblN0YXJ0dXA6ICIpOwotCQlpZiAobG9hZE9uU3RhcnR1cEVTZXQpIHJlc3VsdC5hcHBlbmQobG9hZE9uU3RhcnR1cCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKiogCi0JICogcmV0dXJuIHRoZSBqYXZhIHNlcnZsZXQgY2xhc3MgZm9yIHRoaXMgc2VydmxldAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0U2VydmxldENsYXNzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLQkJU3RyaW5nIGphdmFDbGFzc05hbWUgPSBudWxsOwotCQkvLyBIYW5kbGUgc2VydmxldCBjYXNlCi0JCWlmIChnZXRXZWJUeXBlKCkuaXNTZXJ2bGV0VHlwZSgpKQotCQkJamF2YUNsYXNzTmFtZSA9ICgoU2VydmxldFR5cGUpZ2V0V2ViVHlwZSgpKS5nZXRDbGFzc05hbWUoKTsKLQkJLy9IYW5kbGUgdGhlIEpTUCBjYXNlCi0JCWVsc2UgewotCQkJU3RyaW5nIHJlbFBhdGggPSAoKEpTUFR5cGUpZ2V0V2ViVHlwZSgpKS5nZXRKc3BGaWxlKCk7Ci0JCQlVUkkgd2ViQXBwVVJJID0gZ2V0V2ViQXBwKCkuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQlqYXZhQ2xhc3NOYW1lID0gd2ViQXBwVVJJLnNlZ21lbnQoMSkrIi8iK3dlYkFwcFVSSS5zZWdtZW50KDIpK3JlbFBhdGg7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShqYXZhQ2xhc3NOYW1lLHRoaXMpOwotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NGRkOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIFRoZSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmxldCBhbmQgYSB1cmwgcGF0dGVybgotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldE1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2bGV0TWFwcGluZywgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJsUGF0dGVybigpIDxlbT5VcmwgUGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJsUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BBVFRFUk5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cmxQYXR0ZXJuID0gVVJMX1BBVFRFUk5fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmxldCBzZXJ2bGV0ID0gbnVsbDsKLQlwdWJsaWMgU2VydmxldE1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldE1hcHBpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QgZm9sbG93Ci0JICogdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIHVybFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsUGF0dGVybihTdHJpbmcgbmV3VXJsUGF0dGVybikgewotCQlTdHJpbmcgb2xkVXJsUGF0dGVybiA9IHVybFBhdHRlcm47Ci0JCXVybFBhdHRlcm4gPSBuZXdVcmxQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTiwgb2xkVXJsUGF0dGVybiwgdXJsUGF0dGVybikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldCgpIHsKLQkJaWYgKHNlcnZsZXQgIT0gbnVsbCAmJiBzZXJ2bGV0LmVJc1Byb3h5KCkpIHsKLQkJCVNlcnZsZXQgb2xkU2VydmxldCA9IHNlcnZsZXQ7Ci0JCQlzZXJ2bGV0ID0gKFNlcnZsZXQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXNlcnZsZXQpOwotCQkJaWYgKHNlcnZsZXQgIT0gb2xkU2VydmxldCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQsIG9sZFNlcnZsZXQsIHNlcnZsZXQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmxldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmxldCBiYXNpY0dldFNlcnZsZXQoKSB7Ci0JCXJldHVybiBzZXJ2bGV0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXQoU2VydmxldCBuZXdTZXJ2bGV0KSB7Ci0JCVNlcnZsZXQgb2xkU2VydmxldCA9IHNlcnZsZXQ7Ci0JCXNlcnZsZXQgPSBuZXdTZXJ2bGV0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVULCBvbGRTZXJ2bGV0LCBzZXJ2bGV0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFAsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFAsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0VXJsUGF0dGVybigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U2VydmxldCgpOwotCQkJCXJldHVybiBiYXNpY0dldFNlcnZsZXQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXJldHVybiBVUkxfUEFUVEVSTl9FREVGQVVMVCA9PSBudWxsID8gdXJsUGF0dGVybiAhPSBudWxsIDogIVVSTF9QQVRURVJOX0VERUZBVUxULmVxdWFscyh1cmxQYXR0ZXJuKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKSAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19TRVJWTEVUOgotCQkJCXJldHVybiBzZXJ2bGV0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgotCQkJCXNldFVybFBhdHRlcm4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVQ6Ci0JCQkJc2V0U2VydmxldCgoU2VydmxldCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk46Ci0JCQkJc2V0VXJsUGF0dGVybihVUkxfUEFUVEVSTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVDoKLQkJCQlzZXRTZXJ2bGV0KChTZXJ2bGV0KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJsUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdkNzc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRUeXBlSW1wbCBleHRlbmRzIFdlYlR5cGVJbXBsIGltcGxlbWVudHMgU2VydmxldFR5cGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUgPSBDTEFTU19OQU1FX0VERUZBVUxUOwotCXB1YmxpYyBTZXJ2bGV0VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0VHlwZSgpOwotCX0KLQotcHVibGljIGJvb2xlYW4gaXNTZXJ2bGV0VHlwZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIG5ld0NsYXNzTmFtZSkgewotCQlTdHJpbmcgb2xkQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQljbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUUsIG9sZENsYXNzTmFtZSwgY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRDbGFzc05hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIENMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzTmFtZSAhPSBudWxsIDogIUNMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGNsYXNzTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUU6Ci0JCQkJc2V0Q2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUU6Ci0JCQkJc2V0Q2xhc3NOYW1lKENMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xhc3NOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc05hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25Db25maWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25Db25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Mzg5YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25Db25maWdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXNzaW9uQ29uZmlnLCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXNzaW9uVGltZW91dCgpIDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlc3Npb25UaW1lb3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1RJTUVPVVRfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGludCBzZXNzaW9uVGltZW91dCA9IFNFU1NJT05fVElNRU9VVF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNlc3Npb24gVGltZW91dCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uVGltZW91dEVTZXQgPSBmYWxzZTsKLQotCXB1YmxpYyBTZXNzaW9uQ29uZmlnSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgaW50ZXJ2YWwgZm9yCi0JICogYWxsIHNlc3Npb25zIGNyZWF0ZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dCBtdXN0IGJlCi0JICogZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0JICovCi0JcHVibGljIGludCBnZXRTZXNzaW9uVGltZW91dCgpIHsKLQkJcmV0dXJuIHNlc3Npb25UaW1lb3V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25UaW1lb3V0KGludCBuZXdTZXNzaW9uVGltZW91dCkgewotCQlpbnQgb2xkU2Vzc2lvblRpbWVvdXQgPSBzZXNzaW9uVGltZW91dDsKLQkJc2Vzc2lvblRpbWVvdXQgPSBuZXdTZXNzaW9uVGltZW91dDsKLQkJYm9vbGVhbiBvbGRTZXNzaW9uVGltZW91dEVTZXQgPSBzZXNzaW9uVGltZW91dEVTZXQ7Ci0JCXNlc3Npb25UaW1lb3V0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VULCBvbGRTZXNzaW9uVGltZW91dCwgc2Vzc2lvblRpbWVvdXQsICFvbGRTZXNzaW9uVGltZW91dEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHVuc2V0U2Vzc2lvblRpbWVvdXQoKSB7Ci0JCWludCBvbGRTZXNzaW9uVGltZW91dCA9IHNlc3Npb25UaW1lb3V0OwotCQlib29sZWFuIG9sZFNlc3Npb25UaW1lb3V0RVNldCA9IHNlc3Npb25UaW1lb3V0RVNldDsKLQkJc2Vzc2lvblRpbWVvdXQgPSBTRVNTSU9OX1RJTUVPVVRfRURFRkFVTFQ7Ci0JCXNlc3Npb25UaW1lb3V0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VULCBvbGRTZXNzaW9uVGltZW91dCwgU0VTU0lPTl9USU1FT1VUX0VERUZBVUxULCBvbGRTZXNzaW9uVGltZW91dEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0U2Vzc2lvblRpbWVvdXQoKSB7Ci0JCXJldHVybiBzZXNzaW9uVGltZW91dEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViQXBwKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKLQkJaWYgKG5ld1dlYkFwcCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld1dlYkFwcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHApLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdXZWJBcHAsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFAsIG5ld1dlYkFwcCwgbmV3V2ViQXBwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcsIFdlYkFwcC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRTZXNzaW9uVGltZW91dCgpKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCXJldHVybiBnZXRXZWJBcHAoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgotCQkJCXJldHVybiBpc1NldFNlc3Npb25UaW1lb3V0KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6Ci0JCQkJc2V0U2Vzc2lvblRpbWVvdXQoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6Ci0JCQkJdW5zZXRTZXNzaW9uVGltZW91dCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2Vzc2lvblRpbWVvdXQ6ICIpOwotCQlpZiAoc2Vzc2lvblRpbWVvdXRFU2V0KSByZXN1bHQuYXBwZW5kKHNlc3Npb25UaW1lb3V0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVGFnTGliUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTZkYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIFRoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgVGFnTGliUmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVGFnTGliUmVmLCBFT2JqZWN0ewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhZ2xpYlVSSSgpIDxlbT5UYWdsaWIgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWdsaWJVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWdsaWJVUkkgPSBUQUdMSUJfVVJJX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWdsaWJMb2NhdGlvbigpIDxlbT5UYWdsaWIgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhZ2xpYkxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWdsaWJMb2NhdGlvbiA9IFRBR0xJQl9MT0NBVElPTl9FREVGQVVMVDsKLQlwdWJsaWMgVGFnTGliUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFRhZ0xpYlJlZigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHdlYi54bWwgCi0JICogZG9jdW1lbnQsIGlkZW50aWZ5aW5nIGEgVGFnIExpYnJhcnkgdXNlZCBpbiB0aGUgV2ViIEFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnbGliVVJJKCkgewotCQlyZXR1cm4gdGFnbGliVVJJOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2xpYlVSSShTdHJpbmcgbmV3VGFnbGliVVJJKSB7Ci0JCVN0cmluZyBvbGRUYWdsaWJVUkkgPSB0YWdsaWJVUkk7Ci0JCXRhZ2xpYlVSSSA9IG5ld1RhZ2xpYlVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJLCBvbGRUYWdsaWJVUkksIHRhZ2xpYlVSSSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8KLQkgKiB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUKLQkgKiBmb3IgdGhlIHRhZyBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnbGliTG9jYXRpb24oKSB7Ci0JCXJldHVybiB0YWdsaWJMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdsaWJMb2NhdGlvbihTdHJpbmcgbmV3VGFnbGliTG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZFRhZ2xpYkxvY2F0aW9uID0gdGFnbGliTG9jYXRpb247Ci0JCXRhZ2xpYkxvY2F0aW9uID0gbmV3VGFnbGliTG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OLCBvbGRUYWdsaWJMb2NhdGlvbiwgdGFnbGliTG9jYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJBcHApZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewotCQlpZiAobmV3V2ViQXBwICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3V2ViQXBwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTLCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUCwgbmV3V2ViQXBwLCBuZXdXZWJBcHApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFAsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUywgV2ViQXBwLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJOgotCQkJCXJldHVybiBnZXRUYWdsaWJVUkkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFRhZ2xpYkxvY2F0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1RBR0xJQl9VUkk6Ci0JCQkJcmV0dXJuIFRBR0xJQl9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHRhZ2xpYlVSSSAhPSBudWxsIDogIVRBR0xJQl9VUklfRURFRkFVTFQuZXF1YWxzKHRhZ2xpYlVSSSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXJldHVybiBUQUdMSUJfTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHRhZ2xpYkxvY2F0aW9uICE9IG51bGwgOiAhVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxULmVxdWFscyh0YWdsaWJMb2NhdGlvbik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJOgotCQkJCXNldFRhZ2xpYlVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX0xPQ0FUSU9OOgotCQkJCXNldFRhZ2xpYkxvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQOgotCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1RBR0xJQl9VUkk6Ci0JCQkJc2V0VGFnbGliVVJJKFRBR0xJQl9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT046Ci0JCQkJc2V0VGFnbGliTG9jYXRpb24oVEFHTElCX0xPQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRhZ2xpYlVSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFnbGliVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWdsaWJMb2NhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFnbGliTG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VSTFBhdHRlcm5UeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9VUkxQYXR0ZXJuVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkMTQ2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VSTFBhdHRlcm5UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVSTFBhdHRlcm5UeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVVJMUGF0dGVyblR5cGUgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVybFBhdHRlcm4oKSA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVybFBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVRURVJOX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJsUGF0dGVybiA9IFVSTF9QQVRURVJOX0VERUZBVUxUOwotCXB1YmxpYyBVUkxQYXR0ZXJuVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRVUkxQYXR0ZXJuVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIHVybFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsUGF0dGVybihTdHJpbmcgbmV3VXJsUGF0dGVybikgewotCQlTdHJpbmcgb2xkVXJsUGF0dGVybiA9IHVybFBhdHRlcm47Ci0JCXVybFBhdHRlcm4gPSBuZXdVcmxQYXR0ZXJuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk4sIG9sZFVybFBhdHRlcm4sIHVybFBhdHRlcm4pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIGdldFJlc0NvbGxlY3Rpb24oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gbmV3UmVzQ29sbGVjdGlvbikgewotCQlpZiAobmV3UmVzQ29sbGVjdGlvbiAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTiAmJiBuZXdSZXNDb2xsZWN0aW9uICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3UmVzQ29sbGVjdGlvbikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3UmVzQ29sbGVjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXNDb2xsZWN0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1Jlc0NvbGxlY3Rpb24sIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT04sIG5ld1Jlc0NvbGxlY3Rpb24sIG5ld1Jlc0NvbGxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT04sIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFMsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0VXJsUGF0dGVybigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046Ci0JCQkJcmV0dXJuIGdldFJlc0NvbGxlY3Rpb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gVVJMX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHVybFBhdHRlcm4gIT0gbnVsbCA6ICFVUkxfUEFUVEVSTl9FREVGQVVMVC5lcXVhbHModXJsUGF0dGVybik7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKLQkJCQlyZXR1cm4gZ2V0UmVzQ29sbGVjdGlvbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTjoKLQkJCQlzZXRVcmxQYXR0ZXJuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OOgotCQkJCXNldFJlc0NvbGxlY3Rpb24oKFdlYlJlc291cmNlQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1VSTF9QQVRURVJOOgotCQkJCXNldFVybFBhdHRlcm4oVVJMX1BBVFRFUk5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1JFU19DT0xMRUNUSU9OOgotCQkJCXNldFJlc0NvbGxlY3Rpb24oKFdlYlJlc291cmNlQ29sbGVjdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVybFBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVXNlckRhdGFDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTQzNTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVXNlckRhdGFDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZAotICovCi1wdWJsaWMgY2xhc3MgVXNlckRhdGFDb25zdHJhaW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVXNlckRhdGFDb25zdHJhaW50LCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRyYW5zcG9ydEd1YXJhbnRlZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQgPSBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLk5PTkVfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIHRyYW5zcG9ydEd1YXJhbnRlZSA9IFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc3BvcnQgR3VhcmFudGVlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc3BvcnRHdWFyYW50ZWVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgVXNlckRhdGFDb25zdHJhaW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFVzZXJEYXRhQ29uc3RyYWludCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1c2VyIGRhdGEgY29uc3RyYWludC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gY2xpZW50IAotCSAqIGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvciBDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUKLQkgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueQotCSAqIHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzCi0JICogdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0Ci0JICogY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMKLQkgKiB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEgZmFzaGlvbiB0aGF0IHByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20KLQkgKiBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUKLQkgKiBJTlRFR1JBTCBvciBDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlyZXR1cm4gdHJhbnNwb3J0R3VhcmFudGVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydEd1YXJhbnRlZShUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIG5ld1RyYW5zcG9ydEd1YXJhbnRlZSkgewotCQlUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSA9IHRyYW5zcG9ydEd1YXJhbnRlZTsKLQkJdHJhbnNwb3J0R3VhcmFudGVlID0gbmV3VHJhbnNwb3J0R3VhcmFudGVlID09IG51bGwgPyBUUkFOU1BPUlRfR1VBUkFOVEVFX0VERUZBVUxUIDogbmV3VHJhbnNwb3J0R3VhcmFudGVlOwotCQlib29sZWFuIG9sZFRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSB0cmFuc3BvcnRHdWFyYW50ZWVFU2V0OwotCQl0cmFuc3BvcnRHdWFyYW50ZWVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFLCBvbGRUcmFuc3BvcnRHdWFyYW50ZWUsIHRyYW5zcG9ydEd1YXJhbnRlZSwgIW9sZFRyYW5zcG9ydEd1YXJhbnRlZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRyYW5zcG9ydEd1YXJhbnRlZSgpIHsKLQkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBvbGRUcmFuc3BvcnRHdWFyYW50ZWUgPSB0cmFuc3BvcnRHdWFyYW50ZWU7Ci0JCWJvb2xlYW4gb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCA9IHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQ7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZSA9IFRSQU5TUE9SVF9HVUFSQU5URUVfRURFRkFVTFQ7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUsIG9sZFRyYW5zcG9ydEd1YXJhbnRlZSwgVFJBTlNQT1JUX0dVQVJBTlRFRV9FREVGQVVMVCwgb2xkVHJhbnNwb3J0R3VhcmFudGVlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlyZXR1cm4gdHJhbnNwb3J0R3VhcmFudGVlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IGdldFNlY0NvbnN0cmFpbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFNlY3VyaXR5Q29uc3RyYWludCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG5ld1NlY0NvbnN0cmFpbnQpIHsKLQkJaWYgKG5ld1NlY0NvbnN0cmFpbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UICYmIG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdTZWNDb25zdHJhaW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdTZWNDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY0NvbnN0cmFpbnQpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19VU0VSX0RBVEFfQ09OU1RSQUlOVCwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdTZWNDb25zdHJhaW50LCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIG5ld1NlY0NvbnN0cmFpbnQsIG5ld1NlY0NvbnN0cmFpbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fVFJBTlNQT1JUX0dVQVJBTlRFRToKLQkJCQlyZXR1cm4gZ2V0VHJhbnNwb3J0R3VhcmFudGVlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJcmV0dXJuIGdldFNlY0NvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFOgotCQkJCXJldHVybiBpc1NldFRyYW5zcG9ydEd1YXJhbnRlZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRTZWNDb25zdHJhaW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFOgotCQkJCXNldFRyYW5zcG9ydEd1YXJhbnRlZSgoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgotCQkJCXNldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUU6Ci0JCQkJdW5zZXRUcmFuc3BvcnRHdWFyYW50ZWUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJc2V0U2VjQ29uc3RyYWludCgoU2VjdXJpdHlDb25zdHJhaW50KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNwb3J0R3VhcmFudGVlOiAiKTsKLQkJaWYgKHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNwb3J0R3VhcmFudGVlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTc4OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkpORElFbnZSZWZzR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5NaW1lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotCi0vKioKLSAqIFRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IKLSAqIGEgd2ViIGFwcGxpY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgV2ViQXBwSW1wbCBleHRlbmRzIEpORElFbnZSZWZzR3JvdXBJbXBsIGltcGxlbWVudHMgV2ViQXBwIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Rpc3RyaWJ1dGFibGUoKSA8ZW0+RGlzdHJpYnV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEaXN0cmlidXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRElTVFJJQlVUQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzdHJpYnV0YWJsZSA9IERJU1RSSUJVVEFCTEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEaXN0cmlidXRhYmxlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaXN0cmlidXRhYmxlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGV4dHMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlcnJvclBhZ2VzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgV2VsY29tZUZpbGVMaXN0IGZpbGVMaXN0ID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGFnTGlicyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnN0cmFpbnRzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9naW5Db25maWcgbG9naW5Db25maWcgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtaW1lTWFwcGluZ3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTZXNzaW9uQ29uZmlnIHNlc3Npb25Db25maWcgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2bGV0TWFwcGluZ3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2bGV0cyA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlY3VyaXR5Um9sZXMgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBmaWx0ZXJzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZmlsdGVyTWFwcGluZ3MgPSBudWxsOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsaXN0ZW5lcnMgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRleHRQYXJhbXMoKSA8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGV4dFBhcmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRleHRQYXJhbXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnNwQ29uZmlnKCkgPGVtPkpzcCBDb25maWc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpzcENvbmZpZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEpTUENvbmZpZyBqc3BDb25maWcgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSA8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ID0gbnVsbDsKLQotCXB1YmxpYyBXZWJBcHBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwKCk7Ci0JfQotCi0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViQXBwCi0gKi8KLXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2VjdXJpdHlSb2xlKGphdmEubGFuZy5TdHJpbmcgbmFtZSkgewotCXJldHVybiBnZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lKSAhPSBudWxsOwotfQotcHVibGljIEVycm9yUGFnZSBnZXRFcnJvclBhZ2VCeUNvZGUoSW50ZWdlciBjb2RlKSB7Ci0JTGlzdCBsZXJyb3JQYWdlcyA9IGdldEVycm9yUGFnZXMoKTsKLQlTdHJpbmcgY29kZVN0cmluZyA9IGNvZGUudG9TdHJpbmcoKTsKLQlJdGVyYXRvciBpZSA9IGxlcnJvclBhZ2VzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUgKGllLmhhc05leHQoKSkgewotCQlFcnJvclBhZ2UgZXAgPSAoRXJyb3JQYWdlKSBpZS5uZXh0KCk7Ci0JCWlmIChlcC5pc0Vycm9yQ29kZSgpKSB7Ci0JCQlFcnJvckNvZGVFcnJvclBhZ2UgZWNlcCA9IChFcnJvckNvZGVFcnJvclBhZ2UpIGVwOwotCQkJaWYgKGNvZGVTdHJpbmcuZXF1YWxzKGVjZXAuZ2V0RXJyb3JDb2RlKCkpKQotCQkJCXJldHVybiBlY2VwOwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIEVycm9yUGFnZSBnZXRFcnJvclBhZ2VCeUV4Y2VwdGlvblR5cGUoU3RyaW5nIGV4Y2VwdGlvblR5cGUpIHsKLQlpZiAoZXhjZXB0aW9uVHlwZSAhPSBudWxsKSB7Ci0JCUxpc3QgbGVycm9yUGFnZXMgPSBnZXRFcnJvclBhZ2VzKCk7Ci0JCUl0ZXJhdG9yIGllID0gbGVycm9yUGFnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGllLmhhc05leHQoKSkgewotCQkJRXJyb3JQYWdlIGVwID0gKEVycm9yUGFnZSkgaWUubmV4dCgpOwotCQkJaWYgKGVwLmlzRXhjZXB0aW9uVHlwZSgpKSB7Ci0JCQkJRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBldGVwID0gKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpIGVwOwotCQkJCWlmIChleGNlcHRpb25UeXBlLmVxdWFscyhldGVwLmdldEV4Y2VwdGlvblR5cGVOYW1lKCkpKQotCQkJCQlyZXR1cm4gZXRlcDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogRmluZHMgYSBmaWx0ZXIgbWFwcGluZyBmb3IgYSBzcGVjaWZpZWQgZmlsdGVyLgotICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIGZpbmQgdGhlIG1hcHBpbmcgZm9yLgotICogQHJldHVybiBUaGUgZmlyc3QgZmlsdGVyIG1hcHBpbmcgZm91bmQgZm9yIHRoZSBzcGVjaWZpZWQgZmlsdGVyLCBvciBudWxsIGlmIG5vCi0gKiBtYXBwaW5nIGV4aXN0cyBmb3IgdGhlIGZpbHRlci4KLSAqLwotcHVibGljIEZpbHRlck1hcHBpbmcgZ2V0RmlsdGVyTWFwcGluZygKLQlGaWx0ZXIgYUZpbHRlcikgewotCWlmIChhRmlsdGVyICE9IG51bGwpIHsKLQkJTGlzdCBtYXBwaW5ncyA9IGdldEZpbHRlck1hcHBpbmdzKCk7Ci0JCUZpbHRlck1hcHBpbmcgbWFwcGluZzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5zaXplKCk7IGkrKykgewotCQkJbWFwcGluZyA9IChGaWx0ZXJNYXBwaW5nKSBtYXBwaW5ncy5nZXQoaSk7Ci0JCQlpZiAoYUZpbHRlci5lcXVhbHMobWFwcGluZy5nZXRGaWx0ZXIoKSkpIAotCQkJCXJldHVybiBtYXBwaW5nOwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBnZXRGaWx0ZXJOYW1lZCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIEZpbHRlciBnZXRGaWx0ZXJOYW1lZChqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLQlMaXN0IGxmaWx0ZXJzID0gZ2V0RmlsdGVycygpOwotCWlmIChsZmlsdGVycyA9PSBudWxsIHx8IGxmaWx0ZXJzLnNpemUoKSA9PSAwKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlGaWx0ZXIgbmV4dDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCW5leHQgPSAoRmlsdGVyKSBsZmlsdGVycy5nZXQoaSk7Ci0JCWlmIChuZXh0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCXJldHVybiBuZXh0OwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIExpc3QgZ2V0RmlsdGVyTmFtZXMoKSB7Ci0JTGlzdCBuYW1lcywgbGZpbHRlcnMgPSBnZXRGaWx0ZXJzKCk7Ci0JbmFtZXMgPSBuZXcgQXJyYXlMaXN0KGxmaWx0ZXJzLnNpemUoKSk7Ci0JRmlsdGVyIG5leHQ7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZmlsdGVycy5zaXplKCk7IGkrKykgewotCQluZXh0ID0gKEZpbHRlcikgbGZpbHRlcnMuZ2V0KGkpOwotCQluYW1lcy5hZGQobmV4dC5nZXROYW1lKCkpOwotCX0KLQlyZXR1cm4gbmFtZXM7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG1pbWUgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBleHRlbnNpb24KLSAqIEBwYXJhbSBBbiBleHRlbnNpb24gdG8gZmluZCB0aGUgbWltZSB0eXBlIGZvci4KLSAqLwotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWltZVR5cGUoamF2YS5sYW5nLlN0cmluZyBleHRlbnNpb24pIHsKLQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJTGlzdCBtYXBwaW5ncyA9IGdldE1pbWVNYXBwaW5ncygpOwotCQlNaW1lTWFwcGluZyBtYXBwaW5nOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQltYXBwaW5nID0gKE1pbWVNYXBwaW5nKSBtYXBwaW5ncy5nZXQoaSk7Ci0JCQlpZiAoZXh0ZW5zaW9uLmVxdWFscyhtYXBwaW5nLmdldEV4dGVuc2lvbigpKSkKLQkJCQlyZXR1cm4gbWFwcGluZy5nZXRNaW1lVHlwZSgpOwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIFNlY3VyaXR5Um9sZSBnZXRTZWN1cml0eVJvbGVOYW1lZChTdHJpbmcgcm9sZU5hbWUpIHsKLQlqYXZhLnV0aWwuTGlzdCB0ZW1wUm9sZXMgPSBnZXRTZWN1cml0eVJvbGVzKCk7Ci0JU2VjdXJpdHlSb2xlIHJvbGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wUm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJcm9sZSA9IChTZWN1cml0eVJvbGUpIHRlbXBSb2xlcy5nZXQoaSk7Ci0JCWlmIChyb2xlLmdldFJvbGVOYW1lKCkuZXF1YWxzKHJvbGVOYW1lKSkKLQkJCXJldHVybiByb2xlOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogRmluZHMgYSBzZXJ2bGV0IG1hcHBpbmcgZm9yIGEgc3BlY2lmaWVkIHNlcnZsZXQuCi0gKiBAcGFyYW0gc2VydmxldCBUaGUgc2VydmxldCB0byBmaW5kIHRoZSBtYXBwaW5ncyBmb3IuCi0gKiBAcmV0dXJuIFRoZSBzZXJ2bGV0IG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgc2VydmxldCwgb3IgbnVsbCBpZiBubwotICogbWFwcGluZyBleGlzdHMgZm9yIHRoZSBzZXJ2bGV0LgotICovCi1wdWJsaWMgU2VydmxldE1hcHBpbmcgZ2V0U2VydmxldE1hcHBpbmcoCi0JU2VydmxldCBhU2VydmxldCkgewotCWlmIChhU2VydmxldCAhPSBudWxsKSB7Ci0JCUxpc3QgbWFwcGluZ3MgPSBnZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJU2VydmxldE1hcHBpbmcgbWFwcGluZzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5zaXplKCk7IGkrKykgewotCQkJbWFwcGluZyA9IChTZXJ2bGV0TWFwcGluZykgbWFwcGluZ3MuZ2V0KGkpOwotCQkJaWYgKGFTZXJ2bGV0LmVxdWFscyhtYXBwaW5nLmdldFNlcnZsZXQoKSkpIAotCQkJCXJldHVybiBtYXBwaW5nOwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBnZXRTZXJ2bGV0TmFtZWQgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBTZXJ2bGV0IGdldFNlcnZsZXROYW1lZChqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsKLQlMaXN0IGxzZXJ2bGV0cyA9IGdldFNlcnZsZXRzKCk7Ci0JaWYgKGxzZXJ2bGV0cyA9PSBudWxsIHx8IGxzZXJ2bGV0cy5zaXplKCkgPT0gMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JU2VydmxldCBuZXh0OwotCVN0cmluZyBuZXh0TmFtZTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotCQluZXh0ID0gKFNlcnZsZXQpIGxzZXJ2bGV0cy5nZXQoaSk7Ci0JCW5leHROYW1lID0gbmV4dC5nZXRTZXJ2bGV0TmFtZSgpOwotCQlpZiAobmV4dE5hbWUgIT0gbnVsbCAmJiBuZXh0TmFtZS5lcXVhbHMobmFtZSkpIHsKLQkJCXJldHVybiBuZXh0OwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIExpc3QgZ2V0U2VydmxldE5hbWVzKCkgewotCUxpc3QgbmFtZXMsIGxzZXJ2bGV0cyA9IGdldFNlcnZsZXRzKCk7Ci0JbmFtZXMgPSBuZXcgQXJyYXlMaXN0KGxzZXJ2bGV0cy5zaXplKCkpOwotCVNlcnZsZXQgbmV4dDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotCQluZXh0ID0gKFNlcnZsZXQpIGxzZXJ2bGV0cy5nZXQoaSk7Ci0JCW5hbWVzLmFkZChuZXh0LmdldFNlcnZsZXROYW1lKCkpOwotCX0KLQlyZXR1cm4gbmFtZXM7Ci19Ci0vKioKLSAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBXZWIgQXBwIHdhcyBwb3B1bGF0ZWQgZnJvbSBhbiBTZXJ2bGV0Mi4yIGNvbXBsaWFudCBkZXNjcmlwdG9yCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBkZXByZWNhdGVkIFVzZSBnZXRWZXJzaW9uSUQoKSB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfMkRlc2NyaXB0b3IoKSB7Ci0JQ29tbW9uVXRpbC5jaGVja0RET2JqZWN0Rm9yVmVyc2lvbih0aGlzKTsKLQlTdHJpbmcgc3lzdGVtSWQgPSAoKFhNTFJlc291cmNlKWVSZXNvdXJjZSgpKS5nZXRTeXN0ZW1JZCgpOwotCXJldHVybiBzeXN0ZW1JZCA9PSBudWxsID8gZmFsc2UgOiBzeXN0ZW1JZC5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8yKTsKLX0KLS8qKgotICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIFdlYiBBcHAgd2FzIHBvcHVsYXRlZCBmcm9tIGFuIFNlcnZsZXQyLjMgY29tcGxpYW50IGRlc2NyaXB0b3IKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQGRlcHJlY2F0ZWQgVXNlIGdldFZlcnNpb25JRCgpIHRvIGRldGVybWluZSBtb2R1bGUgbGV2ZWwKLSAqLwotcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uMl8zRGVzY3JpcHRvcigpIHsKLQlDb21tb25VdGlsLmNoZWNrRERPYmplY3RGb3JWZXJzaW9uKHRoaXMpOwotCVN0cmluZyBzeXN0ZW1JZCA9ICgoWE1MUmVzb3VyY2UpZVJlc291cmNlKCkpLmdldFN5c3RlbUlkKCk7Ci0JcmV0dXJuIHN5c3RlbUlkID09IG51bGwgPyBmYWxzZSA6IHN5c3RlbUlkLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzMpOwotfQotLyoqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYkFwcAotICovCi1wdWJsaWMgdm9pZCByZW5hbWVTZWN1cml0eVJvbGUoamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lLCBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lKSB7Ci0JU2VjdXJpdHlSb2xlIHJvbGUgPSBnZXRTZWN1cml0eVJvbGVOYW1lZChleGlzdGluZ1JvbGVOYW1lKTsKLQlpZiAocm9sZSAhPSBudWxsKQotCQlyb2xlLnNldFJvbGVOYW1lKG5ld1JvbGVOYW1lKTsKLQlMaXN0IHRoZVNlcnZsZXRzID0gZ2V0U2VydmxldHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRoZVNlcnZsZXRzLnNpemUoKTsgaSsrKXsKLQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpdGhlU2VydmxldHMuZ2V0KGkpOwotCQlzZXJ2bGV0LnJlU3luY1NlY3VyaXR5Um9sZVJlZihleGlzdGluZ1JvbGVOYW1lLCBuZXdSb2xlTmFtZSk7Ci0JfQotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50Ci0JICogZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMgcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvCi0JICogYmUgZGVwbG95ZWQgaW50byBhIGRpc3RyaWJ1dGVkIHNlcnZsZXQgY29udGFpbmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXN0cmlidXRhYmxlKCkgewotCQlyZXR1cm4gZGlzdHJpYnV0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRhYmxlKGJvb2xlYW4gbmV3RGlzdHJpYnV0YWJsZSkgewotCQlib29sZWFuIG9sZERpc3RyaWJ1dGFibGUgPSBkaXN0cmlidXRhYmxlOwotCQlkaXN0cmlidXRhYmxlID0gbmV3RGlzdHJpYnV0YWJsZTsKLQkJYm9vbGVhbiBvbGREaXN0cmlidXRhYmxlRVNldCA9IGRpc3RyaWJ1dGFibGVFU2V0OwotCQlkaXN0cmlidXRhYmxlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFLCBvbGREaXN0cmlidXRhYmxlLCBkaXN0cmlidXRhYmxlLCAhb2xkRGlzdHJpYnV0YWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERpc3RyaWJ1dGFibGUoKSB7Ci0JCWJvb2xlYW4gb2xkRGlzdHJpYnV0YWJsZSA9IGRpc3RyaWJ1dGFibGU7Ci0JCWJvb2xlYW4gb2xkRGlzdHJpYnV0YWJsZUVTZXQgPSBkaXN0cmlidXRhYmxlRVNldDsKLQkJZGlzdHJpYnV0YWJsZSA9IERJU1RSSUJVVEFCTEVfRURFRkFVTFQ7Ci0JCWRpc3RyaWJ1dGFibGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEUsIG9sZERpc3RyaWJ1dGFibGUsIERJU1RSSUJVVEFCTEVfRURFRkFVTFQsIG9sZERpc3RyaWJ1dGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREaXN0cmlidXRhYmxlKCkgewotCQlyZXR1cm4gZGlzdHJpYnV0YWJsZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGV4dHMoKSB7Ci0JCWlmIChjb250ZXh0cyA9PSBudWxsKSB7Ci0JCQljb250ZXh0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KENvbnRleHRQYXJhbS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQ09OVEVYVF9QQVJBTV9fV0VCX0FQUCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRleHRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFcnJvclBhZ2VzKCkgewotCQlpZiAoZXJyb3JQYWdlcyA9PSBudWxsKSB7Ci0JCQllcnJvclBhZ2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRXJyb3JQYWdlLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19XRUJfQVBQKTsKLQkJfQotCQlyZXR1cm4gZXJyb3JQYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgV2VsY29tZUZpbGVMaXN0IGdldEZpbGVMaXN0KCkgewotCQlyZXR1cm4gZmlsZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG5ld0ZpbGVMaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdlbGNvbWVGaWxlTGlzdCBvbGRGaWxlTGlzdCA9IGZpbGVMaXN0OwotCQlmaWxlTGlzdCA9IG5ld0ZpbGVMaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNULCBvbGRGaWxlTGlzdCwgbmV3RmlsZUxpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBuZXdGaWxlTGlzdCkgewotCQlpZiAobmV3RmlsZUxpc3QgIT0gZmlsZUxpc3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGZpbGVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZpbGVMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFAsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3RmlsZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RmlsZUxpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEZpbGVMaXN0KG5ld0ZpbGVMaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1QsIG5ld0ZpbGVMaXN0LCBuZXdGaWxlTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYWdMaWJzKCkgewotCQlpZiAodGFnTGlicyA9PSBudWxsKSB7Ci0JCQl0YWdMaWJzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoVGFnTGliUmVmLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVEFHX0xJQlMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUCk7Ci0JCX0KLQkJcmV0dXJuIHRhZ0xpYnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbnN0cmFpbnRzKCkgewotCQlpZiAoY29uc3RyYWludHMgPT0gbnVsbCkgewotCQkJY29uc3RyYWludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFApOwotCQl9Ci0JCXJldHVybiBjb25zdHJhaW50czsKLQl9Ci0KLQkvKioKLQkqIFRoaXMgcmV0dXJucyB0aGUgbW9kdWxlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgbW9kdWxlIGxldmVsCi0JKi8KLQkKLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQkvLyBmaXggZGVmZWN0IDMyNzYsIHdoZW4gcmVzb3VyY2UgaXMgdW5sb2FkZWQKLQkJCWlmICh2ZXJzaW9uID09IG51bGwpIAotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQotCQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi40IikpLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLQkJCQlpZiAodmVyc2lvbi5lcXVhbHMoIjIuMyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQ7Ci0JCQkJaWYgKHZlcnNpb24uZXF1YWxzKCIyLjIiKSkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEOwotCQkJCi0JCX0KLQkJcmV0dXJuIHJlcy5nZXRNb2R1bGVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQlyZXR1cm4gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgTG9naW5Db25maWcgZ2V0TG9naW5Db25maWcoKSB7Ci0JCXJldHVybiBsb2dpbkNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBuZXdMb2dpbkNvbmZpZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlMb2dpbkNvbmZpZyBvbGRMb2dpbkNvbmZpZyA9IGxvZ2luQ29uZmlnOwotCQlsb2dpbkNvbmZpZyA9IG5ld0xvZ2luQ29uZmlnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHLCBvbGRMb2dpbkNvbmZpZywgbmV3TG9naW5Db25maWcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG5ld0xvZ2luQ29uZmlnKSB7Ci0JCWlmIChuZXdMb2dpbkNvbmZpZyAhPSBsb2dpbkNvbmZpZykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbG9naW5Db25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFAsIExvZ2luQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdMb2dpbkNvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMb2dpbkNvbmZpZykuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUCwgTG9naW5Db25maWcuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TG9naW5Db25maWcobmV3TG9naW5Db25maWcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRywgbmV3TG9naW5Db25maWcsIG5ld0xvZ2luQ29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJaWYgKG1pbWVNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQltaW1lTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChNaW1lTWFwcGluZy5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1MsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFApOwotCQl9Ci0JCXJldHVybiBtaW1lTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIFNlc3Npb25Db25maWcgZ2V0U2Vzc2lvbkNvbmZpZygpIHsKLQkJcmV0dXJuIHNlc3Npb25Db25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG5ld1Nlc3Npb25Db25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2Vzc2lvbkNvbmZpZyBvbGRTZXNzaW9uQ29uZmlnID0gc2Vzc2lvbkNvbmZpZzsKLQkJc2Vzc2lvbkNvbmZpZyA9IG5ld1Nlc3Npb25Db25maWc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRywgb2xkU2Vzc2lvbkNvbmZpZywgbmV3U2Vzc2lvbkNvbmZpZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG5ld1Nlc3Npb25Db25maWcpIHsKLQkJaWYgKG5ld1Nlc3Npb25Db25maWcgIT0gc2Vzc2lvbkNvbmZpZykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2Vzc2lvbkNvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXNzaW9uQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFAsIFNlc3Npb25Db25maWcuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1Nlc3Npb25Db25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2Vzc2lvbkNvbmZpZykuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlc3Npb25Db25maWcobmV3U2Vzc2lvbkNvbmZpZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUcsIG5ld1Nlc3Npb25Db25maWcsIG5ld1Nlc3Npb25Db25maWcpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VydmxldE1hcHBpbmdzKCkgewotCQlpZiAoc2VydmxldE1hcHBpbmdzID09IG51bGwpIHsKLQkJCXNlcnZsZXRNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KFNlcnZsZXRNYXBwaW5nLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZsZXRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VydmxldHMoKSB7Ci0JCWlmIChzZXJ2bGV0cyA9PSBudWxsKSB7Ci0JCQlzZXJ2bGV0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KFNlcnZsZXQuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFApOwotCQl9Ci0JCXJldHVybiBzZXJ2bGV0czsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQkJaWYgKHNlY3VyaXR5Um9sZXMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY3VyaXR5Um9sZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpbHRlcnMoKSB7Ci0JCWlmIChmaWx0ZXJzID09IG51bGwpIHsKLQkJCWZpbHRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRmlsdGVyLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogRmlsdGVyIG1hcHBpbmdzIGRlZmluZWQgZm9yIHRoZSB3ZWIgYXBwCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpbHRlck1hcHBpbmdzKCkgewotCQlpZiAoZmlsdGVyTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJZmlsdGVyTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRmlsdGVyTWFwcGluZy5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUl9NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlck1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSBsaXN0ZW5lcnMgY29sbGVjdGlvbiBjb250YWlucyBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViIGFwcGxpY2F0aW9uCi0JICogbGlzdGVuZXIgYmVhbnMgaW4gdGhlIHdlYiBhcHAuCi0JICovCi0JcHVibGljIEVMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlzdGVuZXIuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlMpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbnRleHRQYXJhbXMoKSB7Ci0JCWlmIChjb250ZXh0UGFyYW1zID09IG51bGwpIHsKLQkJCWNvbnRleHRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gY29udGV4dFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZDogVXNlIGdldEVudmlyb25tZW50UHJvcGVydGllcygpCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudkVudHJpZXMoKSB7Ci0JCQotCQlyZXR1cm4gZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpTUENvbmZpZyBnZXRKc3BDb25maWcoKSB7Ci0JCXJldHVybiBqc3BDb25maWc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SnNwQ29uZmlnKEpTUENvbmZpZyBuZXdKc3BDb25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSlNQQ29uZmlnIG9sZEpzcENvbmZpZyA9IGpzcENvbmZpZzsKLQkJanNwQ29uZmlnID0gbmV3SnNwQ29uZmlnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJRywgb2xkSnNwQ29uZmlnLCBuZXdKc3BDb25maWcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpzcENvbmZpZyhKU1BDb25maWcgbmV3SnNwQ29uZmlnKSB7Ci0JCWlmIChuZXdKc3BDb25maWcgIT0ganNwQ29uZmlnKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChqc3BDb25maWcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpanNwQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0pzcENvbmZpZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKc3BDb25maWcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJRywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRKc3BDb25maWcobmV3SnNwQ29uZmlnLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHLCBuZXdKc3BDb25maWcsIG5ld0pzcENvbmZpZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgewotCQlpZiAobWVzc2FnZURlc3RpbmF0aW9ucyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpIHsKLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Qgb2xkTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ID0gbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotCQlsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgPSBuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QsIG9sZExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCwgbmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCkgewotCQlpZiAobmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ICE9IGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVCwgbmV3TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LCBuZXdMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZXh0cygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXJyb3JQYWdlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNUOgotCQkJCQlpZiAoZmlsZUxpc3QgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmaWxlTGlzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYWdMaWJzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb25zdHJhaW50cygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHOgotCQkJCQlpZiAobG9naW5Db25maWcgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClsb2dpbkNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUcsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRMb2dpbkNvbmZpZygoTG9naW5Db25maWcpb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWltZU1hcHBpbmdzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRzoKLQkJCQkJaWYgKHNlc3Npb25Db25maWcgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXNzaW9uQ29uZmlnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHLCBudWxsLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0U2Vzc2lvbkNvbmZpZygoU2Vzc2lvbkNvbmZpZylvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2bGV0TWFwcGluZ3MoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZsZXRzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZJQ0VfUkVGUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGV4dHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVycm9yUGFnZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RmlsZUxpc3QobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVEFHX0xJQlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGFnTGlicygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OU1RSQUlOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29uc3RyYWludHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0TG9naW5Db25maWcobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaW1lTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRTZXNzaW9uQ29uZmlnKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmxldE1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2bGV0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWx0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsdGVyTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xJU1RFTkVSUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRMaXN0ZW5lcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbnRleHRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUc6Ci0JCQkJCXJldHVybiBiYXNpY1NldEpzcENvbmZpZyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVJlZnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VKQl9SRUZTOgotCQkJCXJldHVybiBnZXRFamJSZWZzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0RWpiTG9jYWxSZWZzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEU6Ci0JCQkJcmV0dXJuIGlzRGlzdHJpYnV0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTOgotCQkJCXJldHVybiBnZXRDb250ZXh0cygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRVJST1JfUEFHRVM6Ci0JCQkJcmV0dXJuIGdldEVycm9yUGFnZXMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVDoKLQkJCQlyZXR1cm4gZ2V0RmlsZUxpc3QoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1RBR19MSUJTOgotCQkJCXJldHVybiBnZXRUYWdMaWJzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29uc3RyYWludHMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRzoKLQkJCQlyZXR1cm4gZ2V0TG9naW5Db25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldE1pbWVNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUc6Ci0JCQkJcmV0dXJuIGdldFNlc3Npb25Db25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXRNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJcmV0dXJuIGdldFNlcnZsZXRzKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRUNVUklUWV9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlcygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlyZXR1cm4gZ2V0RmlsdGVycygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRGaWx0ZXJNYXBwaW5ncygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRMaXN0ZW5lcnMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRDb250ZXh0UGFyYW1zKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHOgotCQkJCXJldHVybiBnZXRKc3BDb25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBlbnZpcm9ubWVudFByb3BlcnRpZXMgIT0gbnVsbCAmJiAhZW52aXJvbm1lbnRQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlUmVmcyAhPSBudWxsICYmICFyZXNvdXJjZVJlZnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuIGVqYlJlZnMgIT0gbnVsbCAmJiAhZWpiUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzICE9IG51bGwgJiYgIXJlc291cmNlRW52UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gZWpiTG9jYWxSZWZzICE9IG51bGwgJiYgIWVqYkxvY2FsUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgIT0gbnVsbCAmJiAhbWVzc2FnZURlc3RpbmF0aW9uUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEU6Ci0JCQkJcmV0dXJuIGlzU2V0RGlzdHJpYnV0YWJsZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFM6Ci0JCQkJcmV0dXJuIGNvbnRleHRzICE9IG51bGwgJiYgIWNvbnRleHRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCXJldHVybiBlcnJvclBhZ2VzICE9IG51bGwgJiYgIWVycm9yUGFnZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNUOgotCQkJCXJldHVybiBmaWxlTGlzdCAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVEFHX0xJQlM6Ci0JCQkJcmV0dXJuIHRhZ0xpYnMgIT0gbnVsbCAmJiAhdGFnTGlicy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gY29uc3RyYWludHMgIT0gbnVsbCAmJiAhY29uc3RyYWludHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHOgotCQkJCXJldHVybiBsb2dpbkNvbmZpZyAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gbWltZU1hcHBpbmdzICE9IG51bGwgJiYgIW1pbWVNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVNTSU9OX0NPTkZJRzoKLQkJCQlyZXR1cm4gc2Vzc2lvbkNvbmZpZyAhPSBudWxsOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gc2VydmxldE1hcHBpbmdzICE9IG51bGwgJiYgIXNlcnZsZXRNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUUzoKLQkJCQlyZXR1cm4gc2VydmxldHMgIT0gbnVsbCAmJiAhc2VydmxldHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuIHNlY3VyaXR5Um9sZXMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgotCQkJCXJldHVybiBmaWx0ZXJzICE9IG51bGwgJiYgIWZpbHRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCXJldHVybiBmaWx0ZXJNYXBwaW5ncyAhPSBudWxsICYmICFmaWx0ZXJNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGxpc3RlbmVycyAhPSBudWxsICYmICFsaXN0ZW5lcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGNvbnRleHRQYXJhbXMgIT0gbnVsbCAmJiAhY29udGV4dFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHOgotCQkJCXJldHVybiBqc3BDb25maWcgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25zICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOgotCQkJCXJldHVybiBsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKLQkJCQlnZXRFbnZpcm9ubWVudFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudmlyb25tZW50UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VKQl9MT0NBTF9SRUZTOgotCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRToKLQkJCQlzZXREaXN0cmlidXRhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUUzoKLQkJCQlnZXRDb250ZXh0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGV4dHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VSUk9SX1BBR0VTOgotCQkJCWdldEVycm9yUGFnZXMoKS5jbGVhcigpOwotCQkJCWdldEVycm9yUGFnZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTEVfTElTVDoKLQkJCQlzZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUzoKLQkJCQlnZXRUYWdMaWJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUYWdMaWJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlnZXRDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29uc3RyYWludHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPR0lOX0NPTkZJRzoKLQkJCQlzZXRMb2dpbkNvbmZpZygoTG9naW5Db25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6Ci0JCQkJZ2V0TWltZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRNaW1lTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHOgotCQkJCXNldFNlc3Npb25Db25maWcoKFNlc3Npb25Db25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U2VydmxldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2bGV0TWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTOgotCQkJCWdldFNlcnZsZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2bGV0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSUzoKLQkJCQlnZXRGaWx0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWx0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJZ2V0RmlsdGVyTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlck1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCWdldENvbnRleHRQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldENvbnRleHRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0pTUF9DT05GSUc6Ci0JCQkJc2V0SnNwQ29uZmlnKChKU1BDb25maWcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVDoKLQkJCQlzZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VOVklST05NRU5UX1BST1BFUlRJRVM6Ci0JCQkJZ2V0RW52aXJvbm1lbnRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9SRUZTOgotCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRUpCX1JFRlM6Ci0JCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEU6Ci0JCQkJdW5zZXREaXN0cmlidXRhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRTOgotCQkJCWdldENvbnRleHRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlnZXRFcnJvclBhZ2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19GSUxFX0xJU1Q6Ci0JCQkJc2V0RmlsZUxpc3QoKFdlbGNvbWVGaWxlTGlzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19UQUdfTElCUzoKLQkJCQlnZXRUYWdMaWJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUzoKLQkJCQlnZXRDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTE9HSU5fQ09ORklHOgotCQkJCXNldExvZ2luQ29uZmlnKChMb2dpbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCWdldE1pbWVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUc6Ci0JCQkJc2V0U2Vzc2lvbkNvbmZpZygoU2Vzc2lvbkNvbmZpZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTOgotCQkJCWdldFNlcnZsZXRNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJZ2V0U2VydmxldHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTOgotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlM6Ci0JCQkJZ2V0RmlsdGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTOgotCQkJCWdldEZpbHRlck1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6Ci0JCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05URVhUX1BBUkFNUzoKLQkJCQlnZXRDb250ZXh0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19KU1BfQ09ORklHOgotCQkJCXNldEpzcENvbmZpZygoSlNQQ29uZmlnKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVDoKLQkJCQlzZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRpc3RyaWJ1dGFibGU6ICIpOwotCQlpZiAoZGlzdHJpYnV0YWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGlzdHJpYnV0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzMmMwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IHsKLQotCS8qKgotCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCQVBQX1NZU1RFTUlEXzJfMiwgIndlYi1hcHBfMl8yLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLldFQkFQUF9BTFRfU1lTVEVNSURfMl8yLCAid2ViLWFwcF8yLjIuZHRkIik7CQkvLyROT04tTkxTLTEkCi0JCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChKMkVFQ29uc3RhbnRzLldFQkFQUF9TWVNURU1JRF8yXzMsICJ3ZWItYXBwXzJfMy5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5XRUJfQVBQX1NDSEVNQV9MT0NfMl80LCAid2ViLWFwcF8yXzQueHNkIik7IC8vJE5PTi1OTFMtMSQKLQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuSlNQX1NDSEVNQV9MT0NfMl8wLCAianNwXzJfMC54c2QiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVuZGVyZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYkFwcFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgV2ViQXBwUmVzb3VyY2VJbXBsKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgbXlzZWxmIHdpdGggdGhlIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9TSE9SVF9OQU1FLCBuZXcgV2ViQXBwUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLQl9Ci0JCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1NIT1JUX05BTUUsIG5ldyBXZWJBcHBSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUklfT0JKKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmE5NmQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3Iud2ViYXBwbGljYXRpb24uV2ViQXBwVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcFJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFdlYkFwcFJlc291cmNlIHsKLQotCQotCXB1YmxpYyBXZWJBcHBSZXNvdXJjZUltcGwoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0KLQlwdWJsaWMgV2ViQXBwUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCX0KLQotCQotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlyZXR1cm4gKFdlYkFwcCkgZ2V0Um9vdE9iamVjdCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8zOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zOwotCX0KLQotCS8qCi0JICogQHNlZSBXZWJBcHBSZXNvdXJjZSNpc1dlYjJfMigpCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0TW9kdWxlVmVyc2lvbklEKCkgYW5kIEoyRUVWZXJzaW9uQ29uc3RhbnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXZWIyXzIoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVWZXJzaW9uSUQoKSA9PSBXRUJfMl8yX0lEOwotCX0KLQkvKgotCSAqIEBzZWUgV2ViQXBwUmVzb3VyY2UjaXNXZWIyXzMoKQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIGdldE1vZHVsZVZlcnNpb25JRCgpIGFuZCBKMkVFVmVyc2lvbkNvbnN0YW50cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViMl8zKCkgewotCQlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCkgPT0gV0VCXzJfM19JRDsKLQl9Ci0JLyoKLQkgKiBAc2VlIFdlYkFwcFJlc291cmNlI2lzV2ViMl80KCkKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBnZXRNb2R1bGVWZXJzaW9uSUQoKSBhbmQgSjJFRVZlcnNpb25Db25zdGFudHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYjJfNCgpIHsKLQkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpID09IFdFQl8yXzRfSUQ7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0RG9jdHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgewotCQlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkJCWNhc2UgKEoyRUVfMV8zX0lEKSA6CQotCQkJCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9ET0NUWVBFOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBXRUJfQVBQX1RZUEU7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXRSb290VHJhbnNsYXRvcigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBXZWJBcHBUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQkvKiBSZXR1cm4gSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIG1vZHVsZSB2ZXJzaW9uCi0JKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCWRlZmF1bHQgOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9Ci0JfQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0Jc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKLQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIChXRUJfMl80X0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKFdFQl8yXzNfSUQpIDoKLQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoV0VCXzJfMl9JRCkgOgotCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0JCQkKLQkJfQotCQlzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpOwotCX0KLQkvKgotCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKLQlzd2l0Y2ggKGlkKSB7Ci0JCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKFdFQl8yXzRfSUQpOwotCQkJCQlicmVhazsKLQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoV0VCXzJfM19JRCk7Ci0JCQkJCWJyZWFrOwotCQljYXNlIChKMkVFXzFfMl9JRCkgOgotCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLQkJCQkJcHJpbVNldFZlcnNpb25JRChXRUJfMl8yX0lEKTsKLQkJCX0KLQkJc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gV0VCXzJfNF9JRDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKLQkJV2ViQXBwIGFwcCA9IGdldFdlYkFwcCgpOwotCQlpZiAoYXBwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCVN0cmluZyB2ZXJzaW9uID0gYXBwLmdldFZlcnNpb24oKTsKLQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBnZXRNb2R1bGVWZXJzaW9uU3RyaW5nKCk7Ci0JCWlmICghbmV3VmVyc2lvbi5lcXVhbHModmVyc2lvbikpCi0JCQlhcHAuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTMzOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0IG9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCi0KLSAqLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlJlc291cmNlQ29sbGVjdGlvbiwgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViUmVzb3VyY2VOYW1lKCkgPGVtPldlYiBSZXNvdXJjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd2ViUmVzb3VyY2VOYW1lID0gV0VCX1JFU09VUkNFX05BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVybFBhdHRlcm4oKSA8ZW0+VXJsIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJsUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHVybFBhdHRlcm4gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHR0cE1ldGhvZCgpIDxlbT5IdHRwIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIdHRwTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaHR0cE1ldGhvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdXJMcyA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SFRUUHMoKSA8ZW0+SFRUIFBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhUVFBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaHR0UHMgPSBudWxsOwotCi0JcHVibGljIFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLQl9Ci0KLS8qKgotICogYWRkSFRUUCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWRkSFRUUChqYXZhLmxhbmcuU3RyaW5nIGFodHRwTWV0aG9kKSB7Ci0JSFRUUE1ldGhvZFR5cGUgaHR0cCA9IGdldEZhY3RvcnkoKS5jcmVhdGVIVFRQTWV0aG9kVHlwZSgpOwotCWh0dHAuc2V0SHR0cE1ldGhvZChhaHR0cE1ldGhvZCk7Ci0JZ2V0SFRUUHMoKS5hZGQoaHR0cCk7Ci19Ci0vKioKLSAqIGFkZFVSTCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWRkVVJMKGphdmEubGFuZy5TdHJpbmcgYXVybFBhdHRlcm4pIHsKLQlVUkxQYXR0ZXJuVHlwZSB1cmwgPSBnZXRGYWN0b3J5KCkuY3JlYXRlVVJMUGF0dGVyblR5cGUoKTsKLQl1cmwuc2V0VXJsUGF0dGVybihhdXJsUGF0dGVybik7Ci0JZ2V0VVJMcygpLmFkZCh1cmwpOwotfQotcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCXJldHVybiAoKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkpLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXZWJSZXNvdXJjZU5hbWUoKSB7Ci0JCXJldHVybiB3ZWJSZXNvdXJjZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2ViUmVzb3VyY2VOYW1lKFN0cmluZyBuZXdXZWJSZXNvdXJjZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFdlYlJlc291cmNlTmFtZSA9IHdlYlJlc291cmNlTmFtZTsKLQkJd2ViUmVzb3VyY2VOYW1lID0gbmV3V2ViUmVzb3VyY2VOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FLCBvbGRXZWJSZXNvdXJjZU5hbWUsIHdlYlJlc291cmNlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRVcmxQYXR0ZXJuKCkgewotCQlpZiAodXJsUGF0dGVybiA9PSBudWxsKSB7Ci0JCQl1cmxQYXR0ZXJuID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTik7Ci0JCX0KLQkJcmV0dXJuIHVybFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEh0dHBNZXRob2QoKSB7Ci0JCWlmIChodHRwTWV0aG9kID09IG51bGwpIHsKLQkJCWh0dHBNZXRob2QgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoSFRUUE1ldGhvZFR5cGVFbnVtLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EKTsKLQkJfQotCQlyZXR1cm4gaHR0cE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IGdldFNlY0NvbnN0cmFpbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFNlY3VyaXR5Q29uc3RyYWludCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY0NvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG5ld1NlY0NvbnN0cmFpbnQpIHsKLQkJaWYgKG5ld1NlY0NvbnN0cmFpbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UICYmIG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdTZWNDb25zdHJhaW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdTZWNDb25zdHJhaW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlY0NvbnN0cmFpbnQpLmVJbnZlcnNlQWRkKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3U2VjQ29uc3RyYWludCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5ULCBuZXdTZWNDb25zdHJhaW50LCBuZXdTZWNDb25zdHJhaW50KSk7Ci0JfQotCi0JLyoqCi0JICogIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCB1c2UgZ2V0VXJsUGF0dGVybigpCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRVUkxzKCkgewotCQlpZiAodXJMcyA9PSBudWxsKSB7Ci0JCQl1ckxzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoVVJMUGF0dGVyblR5cGUuY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIHVyTHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKLQkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkLCB1c2UgZ2V0SHR0cE1ldGhvZHMoKQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SFRUUHMoKSB7Ci0JCWlmIChodHRQcyA9PSBudWxsKSB7Ci0JCQlodHRQcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChIVFRQTWV0aG9kVHlwZS5jbGFzcywgdGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFMpOwotCQl9Ci0JCXJldHVybiBodHRQczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFVSTHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQsIG1zZ3MpOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUl9MUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRVUkxzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVF9QUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIVFRQcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUywgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKLQkJCQlyZXR1cm4gZ2V0V2ViUmVzb3VyY2VOYW1lKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGdldFVybFBhdHRlcm4oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0SHR0cE1ldGhvZCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UOgotCQkJCXJldHVybiBnZXRTZWNDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFM6Ci0JCQkJcmV0dXJuIGdldFVSTHMoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVF9QUzoKLQkJCQlyZXR1cm4gZ2V0SFRUUHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6Ci0JCQkJcmV0dXJuIFdFQl9SRVNPVVJDRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyB3ZWJSZXNvdXJjZU5hbWUgIT0gbnVsbCA6ICFXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVC5lcXVhbHMod2ViUmVzb3VyY2VOYW1lKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTjoKLQkJCQlyZXR1cm4gdXJsUGF0dGVybiAhPSBudWxsICYmICF1cmxQYXR0ZXJuLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRDoKLQkJCQlyZXR1cm4gaHR0cE1ldGhvZCAhPSBudWxsICYmICFodHRwTWV0aG9kLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlyZXR1cm4gZ2V0U2VjQ29uc3RyYWludCgpICE9IG51bGw7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJfTFM6Ci0JCQkJcmV0dXJuIHVyTHMgIT0gbnVsbCAmJiAhdXJMcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFM6Ci0JCQkJcmV0dXJuIGh0dFBzICE9IG51bGwgJiYgIWh0dFBzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKLQkJCQlzZXRXZWJSZXNvdXJjZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTjoKLQkJCQlnZXRVcmxQYXR0ZXJuKCkuY2xlYXIoKTsKLQkJCQlnZXRVcmxQYXR0ZXJuKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0Q6Ci0JCQkJZ2V0SHR0cE1ldGhvZCgpLmNsZWFyKCk7Ci0JCQkJZ2V0SHR0cE1ldGhvZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1NFQ19DT05TVFJBSU5UOgotCQkJCXNldFNlY0NvbnN0cmFpbnQoKFNlY3VyaXR5Q29uc3RyYWludCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTOgotCQkJCWdldFVSTHMoKS5jbGVhcigpOwotCQkJCWdldFVSTHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRfUFM6Ci0JCQkJZ2V0SFRUUHMoKS5jbGVhcigpOwotCQkJCWdldEhUVFBzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FOgotCQkJCXNldFdlYlJlc291cmNlTmFtZShXRUJfUkVTT1VSQ0VfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk46Ci0JCQkJZ2V0VXJsUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EOgotCQkJCWdldEh0dHBNZXRob2QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVDoKLQkJCQlzZXRTZWNDb25zdHJhaW50KChTZWN1cml0eUNvbnN0cmFpbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTOgotCQkJCWdldFVSTHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUX1BTOgotCQkJCWdldEhUVFBzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdlYlJlc291cmNlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod2ViUmVzb3VyY2VOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVybFBhdHRlcm46ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVybFBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh0dHBNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh0dHBNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYlR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYlR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NGJmMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdlYlR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWJUeXBlIHsKLQotCXB1YmxpYyBXZWJUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlR5cGUoKTsKLQl9Ci0KLS8qKgotICogaXNKc3BUeXBlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0pzcFR5cGUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBpc1NlcnZsZXRUeXBlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1NlcnZsZXRUeXBlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE3YWVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJlc0F1dGhTZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgV2ViYXBwbGljYXRpb25GYWN0b3J5ewotIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1NX1ZFUlNJT04gPSAiMS4xIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7IAkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFA6IHJldHVybiBjcmVhdGVXZWJBcHAoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU06IHJldHVybiBjcmVhdGVDb250ZXh0UGFyYW0oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVQ6IHJldHVybiBjcmVhdGVTZXJ2bGV0KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkc6IHJldHVybiBjcmVhdGVTZXJ2bGV0TWFwcGluZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUc6IHJldHVybiBjcmVhdGVTZXNzaW9uQ29uZmlnKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkc6IHJldHVybiBjcmVhdGVNaW1lTWFwcGluZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1Q6IHJldHVybiBjcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0U6IHJldHVybiBjcmVhdGVFcnJvclBhZ2UoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGOiByZXR1cm4gY3JlYXRlVGFnTGliUmVmKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UOiByZXR1cm4gY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTjogcmV0dXJuIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9DT05TVFJBSU5UOiByZXR1cm4gY3JlYXRlQXV0aENvbnN0cmFpbnQoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UOiByZXR1cm4gY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUc6IHJldHVybiBjcmVhdGVMb2dpbkNvbmZpZygpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUc6IHJldHVybiBjcmVhdGVGb3JtTG9naW5Db25maWcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLklOSVRfUEFSQU06IHJldHVybiBjcmVhdGVJbml0UGFyYW0oKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfVFlQRTogcmV0dXJuIGNyZWF0ZVNlcnZsZXRUeXBlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRTogcmV0dXJuIGNyZWF0ZUpTUFR5cGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEU6IHJldHVybiBjcmVhdGVVUkxQYXR0ZXJuVHlwZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEU6IHJldHVybiBjcmVhdGVSb2xlTmFtZVR5cGUoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRTogcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFOiByZXR1cm4gY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFOiByZXR1cm4gY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElORzogcmV0dXJuIGNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUjogcmV0dXJuIGNyZWF0ZUZpbHRlcigpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUOiByZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HOiByZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEU6IHJldHVybiBjcmVhdGVIVFRQTWV0aG9kVHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJFU19BVVRIX1NFUlZMRVRfVFlQRTogewotCQkJCVJlc0F1dGhTZXJ2bGV0VHlwZSByZXN1bHQgPSBSZXNBdXRoU2VydmxldFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfRU5VTTogewotCQkJCUhUVFBNZXRob2RUeXBlRW51bSByZXN1bHQgPSBIVFRQTWV0aG9kVHlwZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRTogewotCQkJCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgcmVzdWx0ID0gVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRElTUEFUQ0hFUl9UWVBFOiB7Ci0JCQkJRGlzcGF0Y2hlclR5cGUgcmVzdWx0ID0gRGlzcGF0Y2hlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfTUVUSE9EX0tJTkQ6IHsKLQkJCQlBdXRoTWV0aG9kS2luZCByZXN1bHQgPSBBdXRoTWV0aG9kS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJFU19BVVRIX1NFUlZMRVRfVFlQRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfRU5VTToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkRJU1BBVENIRVJfVFlQRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfTUVUSE9EX0tJTkQ6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLXB1YmxpYyBzdGF0aWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIChXZWJhcHBsaWNhdGlvbkZhY3RvcnkpIGdldFBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci19Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlYkFwcCBjcmVhdGVXZWJBcHAoKSB7Ci0JCVdlYkFwcEltcGwgd2ViQXBwID0gbmV3IFdlYkFwcEltcGwoKTsKLQkJcmV0dXJuIHdlYkFwcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFBhcmFtIGNyZWF0ZUNvbnRleHRQYXJhbSgpIHsKLQkJQ29udGV4dFBhcmFtSW1wbCBjb250ZXh0UGFyYW0gPSBuZXcgQ29udGV4dFBhcmFtSW1wbCgpOwotCQlyZXR1cm4gY29udGV4dFBhcmFtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFcnJvclBhZ2UgY3JlYXRlRXJyb3JQYWdlKCkgewotCQlFcnJvclBhZ2VJbXBsIGVycm9yUGFnZSA9IG5ldyBFcnJvclBhZ2VJbXBsKCk7Ci0JCXJldHVybiBlcnJvclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhZ0xpYlJlZiBjcmVhdGVUYWdMaWJSZWYoKSB7Ci0JCVRhZ0xpYlJlZkltcGwgdGFnTGliUmVmID0gbmV3IFRhZ0xpYlJlZkltcGwoKTsKLQkJcmV0dXJuIHRhZ0xpYlJlZjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBjcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCkgewotCQlFeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbCBleGNlcHRpb25UeXBlRXJyb3JQYWdlID0gbmV3IEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsKCk7Ci0JCXJldHVybiBleGNlcHRpb25UeXBlRXJyb3JQYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGVFcnJvclBhZ2UgY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCkgewotCQlFcnJvckNvZGVFcnJvclBhZ2VJbXBsIGVycm9yQ29kZUVycm9yUGFnZSA9IG5ldyBFcnJvckNvZGVFcnJvclBhZ2VJbXBsKCk7Ci0JCXJldHVybiBlcnJvckNvZGVFcnJvclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlbGNvbWVGaWxlTGlzdCBjcmVhdGVXZWxjb21lRmlsZUxpc3QoKSB7Ci0JCVdlbGNvbWVGaWxlTGlzdEltcGwgd2VsY29tZUZpbGVMaXN0ID0gbmV3IFdlbGNvbWVGaWxlTGlzdEltcGwoKTsKLQkJcmV0dXJuIHdlbGNvbWVGaWxlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgV2VsY29tZUZpbGUgY3JlYXRlV2VsY29tZUZpbGUoKSB7Ci0JCVdlbGNvbWVGaWxlSW1wbCB3ZWxjb21lRmlsZSA9IG5ldyBXZWxjb21lRmlsZUltcGwoKTsKLQkJcmV0dXJuIHdlbGNvbWVGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCkgewotCQlTZWN1cml0eUNvbnN0cmFpbnRJbXBsIHNlY3VyaXR5Q29uc3RyYWludCA9IG5ldyBTZWN1cml0eUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiBzZWN1cml0eUNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFdlYlJlc291cmNlQ29sbGVjdGlvbiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSB7Ci0JCVdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgd2ViUmVzb3VyY2VDb2xsZWN0aW9uID0gbmV3IFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVVJMUGF0dGVyblR5cGUgY3JlYXRlVVJMUGF0dGVyblR5cGUoKSB7Ci0JCVVSTFBhdHRlcm5UeXBlSW1wbCB1cmxQYXR0ZXJuVHlwZSA9IG5ldyBVUkxQYXR0ZXJuVHlwZUltcGwoKTsKLQkJcmV0dXJuIHVybFBhdHRlcm5UeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBdXRoQ29uc3RyYWludCBjcmVhdGVBdXRoQ29uc3RyYWludCgpIHsKLQkJQXV0aENvbnN0cmFpbnRJbXBsIGF1dGhDb25zdHJhaW50ID0gbmV3IEF1dGhDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gYXV0aENvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFVzZXJEYXRhQ29uc3RyYWludCBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKSB7Ci0JCVVzZXJEYXRhQ29uc3RyYWludEltcGwgdXNlckRhdGFDb25zdHJhaW50ID0gbmV3IFVzZXJEYXRhQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTG9naW5Db25maWcgY3JlYXRlTG9naW5Db25maWcoKSB7Ci0JCUxvZ2luQ29uZmlnSW1wbCBsb2dpbkNvbmZpZyA9IG5ldyBMb2dpbkNvbmZpZ0ltcGwoKTsKLQkJcmV0dXJuIGxvZ2luQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGb3JtTG9naW5Db25maWcgY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCkgewotCQlGb3JtTG9naW5Db25maWdJbXBsIGZvcm1Mb2dpbkNvbmZpZyA9IG5ldyBGb3JtTG9naW5Db25maWdJbXBsKCk7Ci0JCXJldHVybiBmb3JtTG9naW5Db25maWc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1pbWVNYXBwaW5nIGNyZWF0ZU1pbWVNYXBwaW5nKCkgewotCQlNaW1lTWFwcGluZ0ltcGwgbWltZU1hcHBpbmcgPSBuZXcgTWltZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBtaW1lTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbkNvbmZpZyBjcmVhdGVTZXNzaW9uQ29uZmlnKCkgewotCQlTZXNzaW9uQ29uZmlnSW1wbCBzZXNzaW9uQ29uZmlnID0gbmV3IFNlc3Npb25Db25maWdJbXBsKCk7Ci0JCXJldHVybiBzZXNzaW9uQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0TWFwcGluZyBjcmVhdGVTZXJ2bGV0TWFwcGluZygpIHsKLQkJU2VydmxldE1hcHBpbmdJbXBsIHNlcnZsZXRNYXBwaW5nID0gbmV3IFNlcnZsZXRNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gc2VydmxldE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFNlcnZsZXQgY3JlYXRlU2VydmxldCgpIHsKLQkJU2VydmxldEltcGwgc2VydmxldCA9IG5ldyBTZXJ2bGV0SW1wbCgpOwotCQlyZXR1cm4gc2VydmxldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2VydmxldFR5cGUgY3JlYXRlU2VydmxldFR5cGUoKSB7Ci0JCVNlcnZsZXRUeXBlSW1wbCBzZXJ2bGV0VHlwZSA9IG5ldyBTZXJ2bGV0VHlwZUltcGwoKTsKLQkJcmV0dXJuIHNlcnZsZXRUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKU1BUeXBlIGNyZWF0ZUpTUFR5cGUoKSB7Ci0JCUpTUFR5cGVJbXBsIGpzcFR5cGUgPSBuZXcgSlNQVHlwZUltcGwoKTsKLQkJcmV0dXJuIGpzcFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEluaXRQYXJhbSBjcmVhdGVJbml0UGFyYW0oKSB7Ci0JCUluaXRQYXJhbUltcGwgaW5pdFBhcmFtID0gbmV3IEluaXRQYXJhbUltcGwoKTsKLQkJcmV0dXJuIGluaXRQYXJhbTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyIGNyZWF0ZUZpbHRlcigpIHsKLQkJRmlsdGVySW1wbCBmaWx0ZXIgPSBuZXcgRmlsdGVySW1wbCgpOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJNYXBwaW5nIGNyZWF0ZUZpbHRlck1hcHBpbmcoKSB7Ci0JCUZpbHRlck1hcHBpbmdJbXBsIGZpbHRlck1hcHBpbmcgPSBuZXcgRmlsdGVyTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGZpbHRlck1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSB7Ci0JCUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ID0gbmV3IExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwoKTsKLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTG9jYWxFbmNvZGluZ01hcHBpbmcgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKSB7Ci0JCUxvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbCBsb2NhbEVuY29kaW5nTWFwcGluZyA9IG5ldyBMb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQTWV0aG9kVHlwZSBjcmVhdGVIVFRQTWV0aG9kVHlwZSgpIHsKLQkJSFRUUE1ldGhvZFR5cGVJbXBsIGh0dHBNZXRob2RUeXBlID0gbmV3IEhUVFBNZXRob2RUeXBlSW1wbCgpOwotCQlyZXR1cm4gaHR0cE1ldGhvZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFJvbGVOYW1lVHlwZSBjcmVhdGVSb2xlTmFtZVR5cGUoKSB7Ci0JCVJvbGVOYW1lVHlwZUltcGwgcm9sZU5hbWVUeXBlID0gbmV3IFJvbGVOYW1lVHlwZUltcGwoKTsKLQkJcmV0dXJuIHJvbGVOYW1lVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgV2ViYXBwbGljYXRpb25QYWNrYWdlIGdldFdlYmFwcGxpY2F0aW9uUGFja2FnZSgpIHsKLQkJcmV0dXJuIChXZWJhcHBsaWNhdGlvblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYmFwcGxpY2F0aW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjZGVhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhUmVmUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJlc0F1dGhTZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVHJhbnNwb3J0R3VhcmFudGVlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXZWJhcHBsaWNhdGlvblBhY2thZ2UsIEVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWJBcHBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGV4dFBhcmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZsZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmxldE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2Vzc2lvbkNvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtaW1lTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWxjb21lRmlsZUxpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXJyb3JQYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhZ0xpYlJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGF1dGhDb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsb2dpbkNvbmZpZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmb3JtTG9naW5Db25maWdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW5pdFBhcmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlYlR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VydmxldFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MganNwVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB1cmxQYXR0ZXJuVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlTmFtZVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2VsY29tZUZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmlsdGVyTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmaWx0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvY2FsRW5jb2RpbmdNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBNZXRob2RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcmVzQXV0aFNlcnZsZXRUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBodHRwTWV0aG9kVHlwZUVudW1FRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGRpc3BhdGNoZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBhdXRoTWV0aG9kS2luZEVFbnVtID0gbnVsbDsKLQotCQkgICAvKioKLQkJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JCSAqLwotCXByaXZhdGUgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJhcHBsaWNhdGlvblBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0JCUphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlYkFwcCgpIHsKLQkJcmV0dXJuIHdlYkFwcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJBcHBfRGlzdHJpYnV0YWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0NvbnRleHRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsZUxpc3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfVGFnTGlicygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Db25zdHJhaW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Mb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1NlcnZsZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Kc3BDb25maWcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRleHRQYXJhbSgpIHsKLQkJcmV0dXJuIGNvbnRleHRQYXJhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGV4dFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGV4dFBhcmFtX1BhcmFtVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZXh0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZXh0UGFyYW1fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZXh0UGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZXh0UGFyYW1fV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGV4dFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFcnJvclBhZ2UoKSB7Ci0JCXJldHVybiBlcnJvclBhZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXJyb3JQYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXJyb3JQYWdlX1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVycm9yUGFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvblR5cGVFcnJvclBhZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXJyb3JDb2RlRXJyb3JQYWdlKCkgewotCQlyZXR1cm4gZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlbGNvbWVGaWxlTGlzdCgpIHsKLQkJcmV0dXJuIHdlbGNvbWVGaWxlTGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWxjb21lRmlsZUxpc3RfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2VsY29tZUZpbGVMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWxjb21lRmlsZUxpc3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlbGNvbWVGaWxlKCkgewotCQlyZXR1cm4gd2VsY29tZUZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2VsY29tZUZpbGVfV2VsY29tZUZpbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWxjb21lRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlbGNvbWVGaWxlX0ZpbGVMaXN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2VsY29tZUZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhZ0xpYlJlZigpIHsKLQkJcmV0dXJuIHRhZ0xpYlJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWdMaWJSZWZfVGFnbGliVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFnTGliUmVmX1RhZ2xpYkxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFnTGliUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFnTGliUmVmX1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhZ0xpYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkgewotCQlyZXR1cm4gc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fU2VjQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VUkxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IVFRQcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VVJMUGF0dGVyblR5cGUoKSB7Ci0JCXJldHVybiB1cmxQYXR0ZXJuVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVUkxQYXR0ZXJuVHlwZV9VcmxQYXR0ZXJuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdXJsUGF0dGVyblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdXJsUGF0dGVyblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhUVFBNZXRob2RUeXBlKCkgewotCQlyZXR1cm4gaHR0cE1ldGhvZFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWh0dHBNZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBdXRoQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIGF1dGhDb25zdHJhaW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXV0aENvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdXRoQ29uc3RyYWludF9Sb2xlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXV0aENvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF1dGhDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXV0aENvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFVzZXJEYXRhQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHVzZXJEYXRhQ29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdXNlckRhdGFDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VXNlckRhdGFDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpdXNlckRhdGFDb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb2dpbkNvbmZpZygpIHsKLQkJcmV0dXJuIGxvZ2luQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9naW5Db25maWdfQXV0aG9yaXphdGlvbk1ldGhvZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TG9naW5Db25maWdfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb2dpbkNvbmZpZ19Gb3JtTG9naW5Db25maWcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsb2dpbkNvbmZpZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Rm9ybUxvZ2luQ29uZmlnKCkgewotCQlyZXR1cm4gZm9ybUxvZ2luQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZm9ybUxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmb3JtTG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGb3JtTG9naW5Db25maWdfTG9naW5Db25maWcoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmb3JtTG9naW5Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1pbWVNYXBwaW5nKCkgewotCQlyZXR1cm4gbWltZU1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWltZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNaW1lTWFwcGluZ19NaW1lVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1pbWVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWltZU1hcHBpbmdfV2ViQXBwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWltZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlc3Npb25Db25maWcoKSB7Ci0JCXJldHVybiBzZXNzaW9uQ29uZmlnRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25Db25maWdfU2Vzc2lvblRpbWVvdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkNvbmZpZ19XZWJBcHAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2bGV0TWFwcGluZygpIHsKLQkJcmV0dXJuIHNlcnZsZXRNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRNYXBwaW5nX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRNYXBwaW5nX1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2bGV0KCkgewotCQlyZXR1cm4gc2VydmxldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X1NlcnZsZXROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1dlYkFwcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1dlYlR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9QYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfUnVuQXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9Jbml0UGFyYW1zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2ViVHlwZSgpIHsKLQkJcmV0dXJuIHdlYlR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2bGV0VHlwZSgpIHsKLQkJcmV0dXJuIHNlcnZsZXRUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZsZXRUeXBlX0NsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKU1BUeXBlKCkgewotCQlyZXR1cm4ganNwVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKU1BUeXBlX0pzcEZpbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqc3BUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbml0UGFyYW0oKSB7Ci0JCXJldHVybiBpbml0UGFyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWluaXRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWx0ZXJfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlcl9Jbml0UGFyYW1WYWx1ZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpbHRlck1hcHBpbmcoKSB7Ci0JCXJldHVybiBmaWx0ZXJNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlck1hcHBpbmdfRmlsdGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVyTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpIHsKLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMb2NhbEVuY29kaW5nTWFwcGluZygpIHsKLQkJcmV0dXJuIGxvY2FsRW5jb2RpbmdNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxvY2FsRW5jb2RpbmdNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRSZXNBdXRoU2VydmxldFR5cGUoKSB7Ci0JCXJldHVybiByZXNBdXRoU2VydmxldFR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SFRUUE1ldGhvZFR5cGVFbnVtKCkgewotCQlyZXR1cm4gaHR0cE1ldGhvZFR5cGVFbnVtRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlTmFtZVR5cGUoKSB7Ci0JCXJldHVybiByb2xlTmFtZVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZU5hbWVUeXBlX1JvbGVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZU5hbWVUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKSB7Ci0JCXJldHVybiB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERpc3BhdGNoZXJUeXBlKCkgewotCQlyZXR1cm4gZGlzcGF0Y2hlclR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0QXV0aE1ldGhvZEtpbmQoKSB7Ci0JCXJldHVybiBhdXRoTWV0aG9kS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gKFdlYmFwcGxpY2F0aW9uRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQl3ZWJBcHBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX0FQUCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19ESVNUUklCVVRBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1ZFUlNJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fQ09OVEVYVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRVJST1JfUEFHRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRklMRV9MSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1RBR19MSUJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0NPTlNUUkFJTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0xPR0lOX0NPTkZJRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19NSU1FX01BUFBJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1NFU1NJT05fQ09ORklHKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VSVkxFVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRklMVEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19GSUxURVJfTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0NPTlRFWFRfUEFSQU1TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0pTUF9DT05GSUcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUKTsKLQotCQljb250ZXh0UGFyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVYVF9QQVJBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGV4dFBhcmFtRUNsYXNzLCBDT05URVhUX1BBUkFNX19QQVJBTV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZXh0UGFyYW1FQ2xhc3MsIENPTlRFWFRfUEFSQU1fX1BBUkFNX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZXh0UGFyYW1FQ2xhc3MsIENPTlRFWFRfUEFSQU1fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZXh0UGFyYW1FQ2xhc3MsIENPTlRFWFRfUEFSQU1fX1dFQl9BUFApOwotCi0JCXNlcnZsZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVkxFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fU0VSVkxFVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19MT0FEX09OX1NUQVJUVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1dFQl9BUFApOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1dFQl9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19QQVJBTVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fUlVOX0FTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19JTklUX1BBUkFNUyk7Ci0KLQkJc2VydmxldE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVkxFVF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU0VSVkxFVF9NQVBQSU5HX19VUkxfUEFUVEVSTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNFUlZMRVRfTUFQUElOR19fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNFUlZMRVRfTUFQUElOR19fV0VCX0FQUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNFUlZMRVRfTUFQUElOR19fU0VSVkxFVCk7Ci0KLQkJc2Vzc2lvbkNvbmZpZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVNTSU9OX0NPTkZJRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkNvbmZpZ0VDbGFzcywgU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkNvbmZpZ0VDbGFzcywgU0VTU0lPTl9DT05GSUdfX1dFQl9BUFApOwotCi0JCW1pbWVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTUVfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWltZU1hcHBpbmdFQ2xhc3MsIE1JTUVfTUFQUElOR19fRVhURU5TSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtaW1lTWFwcGluZ0VDbGFzcywgTUlNRV9NQVBQSU5HX19NSU1FX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1pbWVNYXBwaW5nRUNsYXNzLCBNSU1FX01BUFBJTkdfX1dFQl9BUFApOwotCi0JCXdlbGNvbWVGaWxlTGlzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUxDT01FX0ZJTEVfTElTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2VsY29tZUZpbGVMaXN0RUNsYXNzLCBXRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2VsY29tZUZpbGVMaXN0RUNsYXNzLCBXRUxDT01FX0ZJTEVfTElTVF9fRklMRSk7Ci0KLQkJZXJyb3JQYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVSUk9SX1BBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGVycm9yUGFnZUVDbGFzcywgRVJST1JfUEFHRV9fTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGVycm9yUGFnZUVDbGFzcywgRVJST1JfUEFHRV9fV0VCX0FQUCk7Ci0KLQkJdGFnTGliUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBR19MSUJfUkVGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJSZWZFQ2xhc3MsIFRBR19MSUJfUkVGX19UQUdMSUJfVVJJKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YWdMaWJSZWZFQ2xhc3MsIFRBR19MSUJfUkVGX19UQUdMSUJfTE9DQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhZ0xpYlJlZkVDbGFzcywgVEFHX0xJQl9SRUZfX1dFQl9BUFApOwotCi0JCXNlY3VyaXR5Q29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNVUklUWV9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUyk7Ci0KLQkJd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSX0xTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVF9QUyk7Ci0KLQkJYXV0aENvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVVUSF9DT05TVFJBSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhdXRoQ29uc3RyYWludEVDbGFzcywgQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEFVVEhfQ09OU1RSQUlOVF9fUk9MRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdXRoQ29uc3RyYWludEVDbGFzcywgQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwotCi0JCXVzZXJEYXRhQ29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVU0VSX0RBVEFfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodXNlckRhdGFDb25zdHJhaW50RUNsYXNzLCBVU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1RSQU5TUE9SVF9HVUFSQU5URUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVVNFUl9EQVRBX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwotCi0JCWxvZ2luQ29uZmlnRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPR0lOX0NPTkZJRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobG9naW5Db25maWdFQ2xhc3MsIExPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvZ2luQ29uZmlnRUNsYXNzLCBMT0dJTl9DT05GSUdfX1JFQUxNX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvZ2luQ29uZmlnRUNsYXNzLCBMT0dJTl9DT05GSUdfX0FVVEhPUklaQVRJT05fTUVUSE9EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb2dpbkNvbmZpZ0VDbGFzcywgTE9HSU5fQ09ORklHX19XRUJfQVBQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb2dpbkNvbmZpZ0VDbGFzcywgTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX0NPTkZJRyk7Ci0KLQkJZm9ybUxvZ2luQ29uZmlnRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZPUk1fTE9HSU5fQ09ORklHKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmb3JtTG9naW5Db25maWdFQ2xhc3MsIEZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fRVJST1JfUEFHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZm9ybUxvZ2luQ29uZmlnRUNsYXNzLCBGT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHKTsKLQotCQlpbml0UGFyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5JVF9QQVJBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5pdFBhcmFtRUNsYXNzLCBJTklUX1BBUkFNX19QQVJBTV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0UGFyYW1FQ2xhc3MsIElOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0UGFyYW1FQ2xhc3MsIElOSVRfUEFSQU1fX0RFU0NSSVBUSU9OKTsKLQotCQl3ZWJUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9UWVBFKTsKLQotCQlzZXJ2bGV0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWTEVUX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRUeXBlRUNsYXNzLCBTRVJWTEVUX1RZUEVfX0NMQVNTX05BTUUpOwotCi0JCWpzcFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSlNQX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGpzcFR5cGVFQ2xhc3MsIEpTUF9UWVBFX19KU1BfRklMRSk7Ci0KLQkJdXJsUGF0dGVyblR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVJMX1BBVFRFUk5fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodXJsUGF0dGVyblR5cGVFQ2xhc3MsIFVSTF9QQVRURVJOX1RZUEVfX1VSTF9QQVRURVJOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh1cmxQYXR0ZXJuVHlwZUVDbGFzcywgVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT04pOwotCi0JCXJvbGVOYW1lVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX05BTUVfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZU5hbWVUeXBlRUNsYXNzLCBST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FKTsKLQotCQl3ZWxjb21lRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUxDT01FX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdlbGNvbWVGaWxlRUNsYXNzLCBXRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod2VsY29tZUZpbGVFQ2xhc3MsIFdFTENPTUVfRklMRV9fRklMRV9MSVNUKTsKLQotCQlleGNlcHRpb25UeXBlRXJyb3JQYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGV4Y2VwdGlvblR5cGVFcnJvclBhZ2VFQ2xhc3MsIEVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFKTsKLQotCQllcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVJST1JfQ09ERV9FUlJPUl9QQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3MsIEVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERSk7Ci0KLQkJZmlsdGVyTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGSUxURVJfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyTWFwcGluZ0VDbGFzcywgRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUl9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGSUxURVJfTUFQUElOR19fRklMVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGSUxURVJfTUFQUElOR19fU0VSVkxFVCk7Ci0KLQkJZmlsdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZJTFRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyRUNsYXNzLCBGSUxURVJfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlckVDbGFzcywgRklMVEVSX19JTklUX1BBUkFNUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsdGVyRUNsYXNzLCBGSUxURVJfX0ZJTFRFUl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsdGVyRUNsYXNzLCBGSUxURVJfX0lOSVRfUEFSQU1fVkFMVUVTKTsKLQotCQlsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MsIExPQ0FMX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1MpOwotCi0JCWxvY2FsRW5jb2RpbmdNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKExPQ0FMX0VOQ09ESU5HX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvY2FsRW5jb2RpbmdNYXBwaW5nRUNsYXNzLCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX19MT0NBTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGxvY2FsRW5jb2RpbmdNYXBwaW5nRUNsYXNzLCBMT0NBTF9FTkNPRElOR19NQVBQSU5HX19FTkNPRElORyk7Ci0KLQkJaHR0cE1ldGhvZFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9NRVRIT0RfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaHR0cE1ldGhvZFR5cGVFQ2xhc3MsIEhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJcmVzQXV0aFNlcnZsZXRUeXBlRUVudW0gPSBjcmVhdGVFRW51bShSRVNfQVVUSF9TRVJWTEVUX1RZUEUpOwotCQlodHRwTWV0aG9kVHlwZUVudW1FRW51bSA9IGNyZWF0ZUVFbnVtKEhUVFBfTUVUSE9EX1RZUEVfRU5VTSk7Ci0JCXRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRSk7Ci0JCWRpc3BhdGNoZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShESVNQQVRDSEVSX1RZUEUpOwotCQlhdXRoTWV0aG9kS2luZEVFbnVtID0gY3JlYXRlRUVudW0oQVVUSF9NRVRIT0RfS0lORCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpOwotCQlKYXZhUmVmUGFja2FnZUltcGwgdGhlSmF2YVJlZlBhY2thZ2UgPSAoSmF2YVJlZlBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJd2ViQXBwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Sk5ESUVudlJlZnNHcm91cCgpKTsKLQkJc2VydmxldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQlzZXJ2bGV0VHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdlYlR5cGUoKSk7Ci0JCWpzcFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXZWJUeXBlKCkpOwotCQlleGNlcHRpb25UeXBlRXJyb3JQYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXJyb3JQYWdlKCkpOwotCQllcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFcnJvclBhZ2UoKSk7Ci0JCWZpbHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3Mod2ViQXBwRUNsYXNzLCBXZWJBcHAuY2xhc3MsICJXZWJBcHAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGlzdHJpYnV0YWJsZSIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnRleHRzKCksIHRoaXMuZ2V0Q29udGV4dFBhcmFtKCksIHRoaXMuZ2V0Q29udGV4dFBhcmFtX1dlYkFwcCgpLCAiY29udGV4dHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRXJyb3JQYWdlcygpLCB0aGlzLmdldEVycm9yUGFnZSgpLCB0aGlzLmdldEVycm9yUGFnZV9XZWJBcHAoKSwgImVycm9yUGFnZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3RfV2ViQXBwKCksICJmaWxlTGlzdCIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1RhZ0xpYnMoKSwgdGhpcy5nZXRUYWdMaWJSZWYoKSwgdGhpcy5nZXRUYWdMaWJSZWZfV2ViQXBwKCksICJ0YWdMaWJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYkFwcCgpLCAiY29uc3RyYWludHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9naW5Db25maWcoKSwgdGhpcy5nZXRMb2dpbkNvbmZpZygpLCB0aGlzLmdldExvZ2luQ29uZmlnX1dlYkFwcCgpLCAibG9naW5Db25maWciLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSwgdGhpcy5nZXRNaW1lTWFwcGluZygpLCB0aGlzLmdldE1pbWVNYXBwaW5nX1dlYkFwcCgpLCAibWltZU1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSwgdGhpcy5nZXRTZXNzaW9uQ29uZmlnKCksIHRoaXMuZ2V0U2Vzc2lvbkNvbmZpZ19XZWJBcHAoKSwgInNlc3Npb25Db25maWciLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSwgdGhpcy5nZXRTZXJ2bGV0TWFwcGluZygpLCB0aGlzLmdldFNlcnZsZXRNYXBwaW5nX1dlYkFwcCgpLCAic2VydmxldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZsZXRzKCksIHRoaXMuZ2V0U2VydmxldCgpLCB0aGlzLmdldFNlcnZsZXRfV2ViQXBwKCksICJzZXJ2bGV0cyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlcnMoKSwgdGhpcy5nZXRGaWx0ZXIoKSwgbnVsbCwgImZpbHRlcnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSwgdGhpcy5nZXRGaWx0ZXJNYXBwaW5nKCksIG51bGwsICJmaWx0ZXJNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9MaXN0ZW5lcnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRMaXN0ZW5lcigpLCBudWxsLCAibGlzdGVuZXJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJjb250ZXh0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0pzcENvbmZpZygpLCB0aGVKc3BQYWNrYWdlLmdldEpTUENvbmZpZygpLCBudWxsLCAianNwQ29uZmlnIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSwgdGhpcy5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSwgbnVsbCwgImxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRleHRQYXJhbUVDbGFzcywgQ29udGV4dFBhcmFtLmNsYXNzLCAiQ29udGV4dFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBDb250ZXh0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgQ29udGV4dFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZXh0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29udGV4dFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZXh0UGFyYW1fV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0NvbnRleHRzKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBDb250ZXh0UGFyYW0uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2bGV0RUNsYXNzLCBTZXJ2bGV0LmNsYXNzLCAiU2VydmxldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmxldE5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnRlZ2VyT2JqZWN0KCksICJsb2FkT25TdGFydHVwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9TZXJ2bGV0cygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9XZWJUeXBlKCksIHRoaXMuZ2V0V2ViVHlwZSgpLCBudWxsLCAid2ViVHlwZSIsIG51bGwsIDEsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUGFyYW1zKCksIHRoaXMuZ2V0SW5pdFBhcmFtKCksIG51bGwsICJwYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUnVuQXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCksIG51bGwsICJydW5BcyIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTZXJ2bGV0TWFwcGluZy5jbGFzcywgIlNlcnZsZXRNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRNYXBwaW5nX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldE1hcHBpbmdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXQoKSwgdGhpcy5nZXRTZXJ2bGV0KCksIG51bGwsICJzZXJ2bGV0IiwgbnVsbCwgMSwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXNzaW9uQ29uZmlnRUNsYXNzLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAiU2Vzc2lvbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAic2Vzc2lvblRpbWVvdXQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25Db25maWdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlc3Npb25Db25maWcuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtaW1lTWFwcGluZ0VDbGFzcywgTWltZU1hcHBpbmcuY2xhc3MsICJNaW1lTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleHRlbnNpb24iLCBudWxsLCAwLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1pbWVUeXBlIiwgbnVsbCwgMCwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1pbWVNYXBwaW5nX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2VsY29tZUZpbGVMaXN0RUNsYXNzLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICJXZWxjb21lRmlsZUxpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlbGNvbWVGaWxlTGlzdF9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfRmlsZUxpc3QoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKSwgdGhpcy5nZXRXZWxjb21lRmlsZSgpLCB0aGlzLmdldFdlbGNvbWVGaWxlX0ZpbGVMaXN0KCksICJmaWxlIiwgbnVsbCwgMCwgLTEsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVycm9yUGFnZUVDbGFzcywgRXJyb3JQYWdlLmNsYXNzLCAiRXJyb3JQYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFcnJvclBhZ2VfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIEVycm9yUGFnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhZ0xpYlJlZkVDbGFzcywgVGFnTGliUmVmLmNsYXNzLCAiVGFnTGliUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJSZWZfVGFnbGliVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJVUkkiLCBudWxsLCAwLCAxLCBUYWdMaWJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZl9UYWdsaWJMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnbGliTG9jYXRpb24iLCBudWxsLCAwLCAxLCBUYWdMaWJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYlJlZl9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfVGFnTGlicygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgVGFnTGliUmVmLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICJTZWN1cml0eUNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfQ29uc3RyYWludHMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fU2VjQ29uc3RyYWludCgpLCAid2ViUmVzb3VyY2VDb2xsZWN0aW9ucyIsIG51bGwsIDEsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpLCB0aGlzLmdldEF1dGhDb25zdHJhaW50KCksIHRoaXMuZ2V0QXV0aENvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpLCAiYXV0aENvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRVc2VyRGF0YUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpLCAidXNlckRhdGFDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIldlYlJlc291cmNlQ29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid2ViUmVzb3VyY2VOYW1lIiwgbnVsbCwgMCwgMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDEsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZCgpLCB0aGlzLmdldEhUVFBNZXRob2RUeXBlRW51bSgpLCAiaHR0cE1ldGhvZCIsIG51bGwsIDAsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9TZWNDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VUkxzKCksIHRoaXMuZ2V0VVJMUGF0dGVyblR5cGUoKSwgdGhpcy5nZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCksICJVUkxzIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSFRUUHMoKSwgdGhpcy5nZXRIVFRQTWV0aG9kVHlwZSgpLCBudWxsLCAiSFRUUHMiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAiQXV0aENvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoQ29uc3RyYWludF9Sb2xlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicm9sZXMiLCBudWxsLCAwLCAtMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBBdXRoQ29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAiVXNlckRhdGFDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCksIHRoaXMuZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpLCAidHJhbnNwb3J0R3VhcmFudGVlIiwgbnVsbCwgMCwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFVzZXJEYXRhQ29uc3RyYWludF9TZWNDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpLCAic2VjQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobG9naW5Db25maWdFQ2xhc3MsIExvZ2luQ29uZmlnLmNsYXNzLCAiTG9naW5Db25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSwgdGhpcy5nZXRBdXRoTWV0aG9kS2luZCgpLCAiYXV0aE1ldGhvZCIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVhbG1OYW1lIiwgbnVsbCwgMCwgMSwgTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX0F1dGhvcml6YXRpb25NZXRob2QoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImF1dGhvcml6YXRpb25NZXRob2QiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnX0xvZ2luQ29uZmlnKCksICJmb3JtTG9naW5Db25maWciLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAiRm9ybUxvZ2luQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZm9ybUxvZ2luUGFnZSIsIG51bGwsIDAsIDEsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZvcm1FcnJvclBhZ2UiLCBudWxsLCAwLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZvcm1Mb2dpbkNvbmZpZ19Mb2dpbkNvbmZpZygpLCB0aGlzLmdldExvZ2luQ29uZmlnKCksIHRoaXMuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksICJsb2dpbkNvbmZpZyIsIG51bGwsIDAsIDEsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGluaXRQYXJhbUVDbGFzcywgSW5pdFBhcmFtLmNsYXNzLCAiSW5pdFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2ViVHlwZUVDbGFzcywgV2ViVHlwZS5jbGFzcywgIldlYlR5cGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHNlcnZsZXRUeXBlRUNsYXNzLCBTZXJ2bGV0VHlwZS5jbGFzcywgIlNlcnZsZXRUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZsZXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoanNwVHlwZUVDbGFzcywgSlNQVHlwZS5jbGFzcywgIkpTUFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFR5cGVfSnNwRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAianNwRmlsZSIsIG51bGwsIDAsIDEsIEpTUFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh1cmxQYXR0ZXJuVHlwZUVDbGFzcywgVVJMUGF0dGVyblR5cGUuY2xhc3MsICJVUkxQYXR0ZXJuVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VVJMUGF0dGVyblR5cGVfVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDAsIDEsIFVSTFBhdHRlcm5UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VSTHMoKSwgInJlc0NvbGxlY3Rpb24iLCBudWxsLCAwLCAxLCBVUkxQYXR0ZXJuVHlwZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVOYW1lVHlwZUVDbGFzcywgUm9sZU5hbWVUeXBlLmNsYXNzLCAiUm9sZU5hbWVUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlTmFtZVR5cGVfUm9sZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgUm9sZU5hbWVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2VsY29tZUZpbGVFQ2xhc3MsIFdlbGNvbWVGaWxlLmNsYXNzLCAiV2VsY29tZUZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlbGNvbWVGaWxlX1dlbGNvbWVGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3ZWxjb21lRmlsZSIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWxjb21lRmlsZV9GaWxlTGlzdCgpLCB0aGlzLmdldFdlbGNvbWVGaWxlTGlzdCgpLCB0aGlzLmdldFdlbGNvbWVGaWxlTGlzdF9GaWxlKCksICJmaWxlTGlzdCIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcywgRXhjZXB0aW9uVHlwZUVycm9yUGFnZS5jbGFzcywgIkV4Y2VwdGlvblR5cGVFcnJvclBhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImV4Y2VwdGlvblR5cGUiLCBudWxsLCAxLCAxLCBFeGNlcHRpb25UeXBlRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzLCBFcnJvckNvZGVFcnJvclBhZ2UuY2xhc3MsICJFcnJvckNvZGVFcnJvclBhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVycm9yQ29kZSIsIG51bGwsIDAsIDEsIEVycm9yQ29kZUVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZpbHRlck1hcHBpbmcuY2xhc3MsICJGaWx0ZXJNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVybFBhdHRlcm4iLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJUeXBlKCksIHRoaXMuZ2V0RGlzcGF0Y2hlclR5cGUoKSwgImRpc3BhdGNoZXJUeXBlIiwgbnVsbCwgMCwgNCwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyTWFwcGluZ19GaWx0ZXIoKSwgdGhpcy5nZXRGaWx0ZXIoKSwgbnVsbCwgImZpbHRlciIsIG51bGwsIDEsIDEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpLCB0aGlzLmdldFNlcnZsZXQoKSwgbnVsbCwgInNlcnZsZXQiLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZmlsdGVyRUNsYXNzLCBGaWx0ZXIuY2xhc3MsICJGaWx0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSW5pdFBhcmFtcygpLCB0aGlzLmdldEluaXRQYXJhbSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImZpbHRlckNsYXNzIiwgbnVsbCwgMSwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSW5pdFBhcmFtVmFsdWVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiaW5pdFBhcmFtVmFsdWVzIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcywgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAiTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCksIHRoaXMuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKSwgbnVsbCwgImxvY2FsRW5jb2RpbmdNYXBwaW5ncyIsIG51bGwsIDEsIC0xLCBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcywgTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsICJMb2NhbEVuY29kaW5nTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhbGUiLCBudWxsLCAwLCAxLCBMb2NhbEVuY29kaW5nTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVuY29kaW5nIiwgbnVsbCwgMCwgMSwgTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhodHRwTWV0aG9kVHlwZUVDbGFzcywgSFRUUE1ldGhvZFR5cGUuY2xhc3MsICJIVFRQTWV0aG9kVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaHR0cE1ldGhvZCIsIG51bGwsIDAsIDEsIEhUVFBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShyZXNBdXRoU2VydmxldFR5cGVFRW51bSwgUmVzQXV0aFNlcnZsZXRUeXBlLmNsYXNzLCAiUmVzQXV0aFNlcnZsZXRUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoU2VydmxldFR5cGVFRW51bSwgUmVzQXV0aFNlcnZsZXRUeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhTZXJ2bGV0VHlwZUVFbnVtLCBSZXNBdXRoU2VydmxldFR5cGUuU0VSVkxFVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5jbGFzcywgIkhUVFBNZXRob2RUeXBlRW51bSIpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5HRVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBPU1RfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBVVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uREVMRVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5IRUFEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5PUFRJT05TX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5UUkFDRV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0odHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmNsYXNzLCAiVHJhbnNwb3J0R3VhcmFudGVlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLk5PTkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuSU5URUdSQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuQ09ORklERU5USUFMX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5jbGFzcywgIkRpc3BhdGNoZXJUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5GT1JXQVJEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuSU5DTFVERV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLlJFUVVFU1RfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5FUlJPUl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuY2xhc3MsICJBdXRoTWV0aG9kS2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5CQVNJQ19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhNZXRob2RLaW5kRUVudW0sIEF1dGhNZXRob2RLaW5kLkRJR0VTVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhNZXRob2RLaW5kRUVudW0sIEF1dGhNZXRob2RLaW5kLkZPUk1fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5DTElFTlRfQ0VSVF9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbAotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1ZjBiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi0vKioKLSAqIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlbGNvbWVGaWxlLCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWxjb21lRmlsZSgpIDxlbT5XZWxjb21lIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlbGNvbWVGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUxDT01FX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3ZWxjb21lRmlsZSA9IFdFTENPTUVfRklMRV9FREVGQVVMVDsKLQlwdWJsaWMgV2VsY29tZUZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlbGNvbWVGaWxlKCkgewotCQlyZXR1cm4gd2VsY29tZUZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2VsY29tZUZpbGUoU3RyaW5nIG5ld1dlbGNvbWVGaWxlKSB7Ci0JCVN0cmluZyBvbGRXZWxjb21lRmlsZSA9IHdlbGNvbWVGaWxlOwotCQl3ZWxjb21lRmlsZSA9IG5ld1dlbGNvbWVGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEUsIG9sZFdlbGNvbWVGaWxlLCB3ZWxjb21lRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWxjb21lRmlsZUxpc3QgZ2V0RmlsZUxpc3QoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV2VsY29tZUZpbGVMaXN0KWVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG5ld0ZpbGVMaXN0KSB7Ci0JCWlmIChuZXdGaWxlTGlzdCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCAmJiBuZXdGaWxlTGlzdCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0ZpbGVMaXN0KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdGaWxlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdGaWxlTGlzdCkuZUludmVyc2VBZGQodGhpcywgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0ZpbGVMaXN0LCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNULCBuZXdGaWxlTGlzdCwgbmV3RmlsZUxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1QsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1Q6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1Q6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRSwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fV0VMQ09NRV9GSUxFOgotCQkJCXJldHVybiBnZXRXZWxjb21lRmlsZSgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldEZpbGVMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEU6Ci0JCQkJcmV0dXJuIFdFTENPTUVfRklMRV9FREVGQVVMVCA9PSBudWxsID8gd2VsY29tZUZpbGUgIT0gbnVsbCA6ICFXRUxDT01FX0ZJTEVfRURFRkFVTFQuZXF1YWxzKHdlbGNvbWVGaWxlKTsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fRklMRV9MSVNUOgotCQkJCXJldHVybiBnZXRGaWxlTGlzdCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRToKLQkJCQlzZXRXZWxjb21lRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKLQkJCQlzZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEU6Ci0JCQkJc2V0V2VsY29tZUZpbGUoV0VMQ09NRV9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKLQkJCQlzZXRGaWxlTGlzdCgoV2VsY29tZUZpbGVMaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAod2VsY29tZUZpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdlbGNvbWVGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUxpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5N2FlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotLyoqCi0gKiBUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMgZWxlbWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWxjb21lRmlsZUxpc3QsIEVPYmplY3QgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGZpbGUgPSBudWxsOwotCXB1YmxpYyBXZWxjb21lRmlsZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2VsY29tZUZpbGVMaXN0KCk7Ci0JfQotCi0vKioKLSAqIGFkZEZpbGVOYW1lZCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWRkRmlsZU5hbWVkKGphdmEubGFuZy5TdHJpbmcgbmFtZSkgewotCVdlbGNvbWVGaWxlIGxmaWxlID0gKChXZWJhcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpKS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVXZWxjb21lRmlsZSgpOwotCWxmaWxlLnNldFdlbGNvbWVGaWxlKG5hbWUpOwotCWdldEZpbGUoKS5hZGQobGZpbGUpOwotfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBXZWJBcHAgZ2V0V2ViQXBwKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFApIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYkFwcCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7Ci0JCWlmIChuZXdXZWJBcHAgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdXZWJBcHAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2ViQXBwKS5lSW52ZXJzZUFkZCh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNULCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld1dlYkFwcCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCwgbmV3V2ViQXBwLCBuZXdXZWJBcHApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RmlsZSgpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJZmlsZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KFdlbGNvbWVGaWxlLmNsYXNzLCB0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVCk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQLCBtc2dzKTsKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWxlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMRV9MSVNULCBXZWJBcHAuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFA6Ci0JCQkJcmV0dXJuIGdldFdlYkFwcCgpOwotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKLQkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFOgotCQkJCXJldHVybiBmaWxlICE9IG51bGwgJiYgIWZpbGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFA6Ci0JCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFOgotCQkJCWdldEZpbGUoKS5jbGVhcigpOwotCQkJCWdldEZpbGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKLQkJCQlzZXRXZWJBcHAoKFdlYkFwcCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fRklMRToKLQkJCQlnZXRGaWxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2YzE5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJvbGVOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV2ViYXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBXZWJhcHBsaWNhdGlvblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCl0eXBlKS5lQ2xhc3MoKS5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV2ViYXBwbGljYXRpb25Td2l0Y2ggc3cgPSBuZXcgV2ViYXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcChXZWJBcHAgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2ViQXBwQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRleHRQYXJhbShDb250ZXh0UGFyYW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGV4dFBhcmFtQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yUGFnZShFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXJyb3JQYWdlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yQ29kZUVycm9yUGFnZShFcnJvckNvZGVFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlTGlzdChXZWxjb21lRmlsZUxpc3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2VsY29tZUZpbGVMaXN0QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlKFdlbGNvbWVGaWxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYlJlZihUYWdMaWJSZWYgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGFnTGliUmVmQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVVSTFBhdHRlcm5UeXBlKFVSTFBhdHRlcm5UeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVVSTFBhdHRlcm5UeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBNZXRob2RUeXBlKEhUVFBNZXRob2RUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUhUVFBNZXRob2RUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUxvZ2luQ29uZmlnQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRm9ybUxvZ2luQ29uZmlnQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU1pbWVNYXBwaW5nKE1pbWVNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQ29uZmlnQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXQoU2VydmxldCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVdlYlR5cGUoV2ViVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXZWJUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRUeXBlKFNlcnZsZXRUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUpTUFR5cGUoSlNQVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVKU1BUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUluaXRQYXJhbShJbml0UGFyYW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRmlsdGVyQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlck1hcHBpbmcoRmlsdGVyTWFwcGluZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVGaWx0ZXJNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxpc3RlbmVyKExpc3RlbmVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVOYW1lVHlwZShSb2xlTmFtZVR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZU5hbWVUeXBlQWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0QWRhcHRlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsRW5jb2RpbmdNYXBwaW5nKExvY2FsRW5jb2RpbmdNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlcilzdy5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRleHRQYXJhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yUGFnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFcnJvckNvZGVFcnJvclBhZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWxjb21lRmlsZUxpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWxjb21lRmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZlR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVUkxQYXR0ZXJuVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBNZXRob2RUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aENvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkNvbmZpZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpTUFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWx0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWx0ZXJNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlzdGVuZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlTmFtZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZUdlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViYXBwbGljYXRpb25Td2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgV2ViYXBwbGljYXRpb25Td2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJBcHAoV2ViQXBwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJBcHBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZXh0UGFyYW0oQ29udGV4dFBhcmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZXh0UGFyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0KFNlcnZsZXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0TWFwcGluZyhTZXJ2bGV0TWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmxldE1hcHBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uQ29uZmlnKFNlc3Npb25Db25maWcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25Db25maWdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNaW1lTWFwcGluZyhNaW1lTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWltZU1hcHBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWxjb21lRmlsZUxpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFcnJvclBhZ2UoRXJyb3JQYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFcnJvclBhZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWJSZWYoVGFnTGliUmVmIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYWdMaWJSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eUNvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJSZXNvdXJjZUNvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXV0aENvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9naW5Db25maWdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVGb3JtTG9naW5Db25maWdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0UGFyYW0oSW5pdFBhcmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJUeXBlKFdlYlR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYlR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0VHlwZShTZXJ2bGV0VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmxldFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUeXBlKEpTUFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpTUFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VVUkxQYXR0ZXJuVHlwZShVUkxQYXR0ZXJuVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVVJMUGF0dGVyblR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlTmFtZVR5cGUoUm9sZU5hbWVUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlTmFtZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZShXZWxjb21lRmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2VsY29tZUZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNlcHRpb25UeXBlRXJyb3JQYWdlKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFcnJvckNvZGVFcnJvclBhZ2UoRXJyb3JDb2RlRXJyb3JQYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFcnJvckNvZGVFcnJvclBhZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXJNYXBwaW5nKEZpbHRlck1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZpbHRlck1hcHBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXIoRmlsdGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVGaWx0ZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZyhMb2NhbEVuY29kaW5nTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQTWV0aG9kVHlwZShIVFRQTWV0aG9kVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUE1ldGhvZFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKTkRJRW52UmVmc0dyb3VwKEpORElFbnZSZWZzR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpORElFbnZSZWZzR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyR2VuKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4KLQkgKiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcEFkYXB0ZXJHZW4oKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRleHRQYXJhbUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVycm9yUGFnZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2VBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFcnJvckNvZGVFcnJvclBhZ2VBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWxjb21lRmlsZUxpc3RBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWxjb21lRmlsZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZkFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZlR5cGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25BZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVUkxQYXR0ZXJuVHlwZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9naW5Db25maWdBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGb3JtTG9naW5Db25maWdBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaW1lTWFwcGluZ0FkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlc3Npb25Db25maWdBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0TWFwcGluZ0FkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJUeXBlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldFR5cGVBZGFwdGVyR2VuKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BUeXBlQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdFBhcmFtQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsdGVyQWRhcHRlckdlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsdGVyTWFwcGluZ0FkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwIDxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cCA8ZW0+Sk5ESSBFbnYgUmVmcyBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOYW1lVHlwZUFkYXB0ZXJHZW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1dlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkKLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvV2ViYXBwbGljYXRpb25Td2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvV2ViYXBwbGljYXRpb25Td2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2YThlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkNvbnRleHRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvckNvZGVFcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkV4Y2VwdGlvblR5cGVFcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5NaW1lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFdlYmFwcGxpY2F0aW9uUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFA6IHsKLQkJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2ViQXBwKHdlYkFwcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSk5ESUVudlJlZnNHcm91cCh3ZWJBcHApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHdlYkFwcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cCh3ZWJBcHApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU06IHsKLQkJCQlDb250ZXh0UGFyYW0gY29udGV4dFBhcmFtID0gKENvbnRleHRQYXJhbSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29udGV4dFBhcmFtKGNvbnRleHRQYXJhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVDogewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2bGV0KHNlcnZsZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHNlcnZsZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoc2VydmxldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HOiB7Ci0JCQkJU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgPSAoU2VydmxldE1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZsZXRNYXBwaW5nKHNlcnZsZXRNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJRzogewotCQkJCVNlc3Npb25Db25maWcgc2Vzc2lvbkNvbmZpZyA9IChTZXNzaW9uQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXNzaW9uQ29uZmlnKHNlc3Npb25Db25maWcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElORzogewotCQkJCU1pbWVNYXBwaW5nIG1pbWVNYXBwaW5nID0gKE1pbWVNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNaW1lTWFwcGluZyhtaW1lTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1Q6IHsKLQkJCQlXZWxjb21lRmlsZUxpc3Qgd2VsY29tZUZpbGVMaXN0ID0gKFdlbGNvbWVGaWxlTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2VsY29tZUZpbGVMaXN0KHdlbGNvbWVGaWxlTGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRTogewotCQkJCUVycm9yUGFnZSBlcnJvclBhZ2UgPSAoRXJyb3JQYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFcnJvclBhZ2UoZXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRjogewotCQkJCVRhZ0xpYlJlZiB0YWdMaWJSZWYgPSAoVGFnTGliUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYWdMaWJSZWYodGFnTGliUmVmKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UOiB7Ci0JCQkJU2VjdXJpdHlDb25zdHJhaW50IHNlY3VyaXR5Q29uc3RyYWludCA9IChTZWN1cml0eUNvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Q29uc3RyYWludChzZWN1cml0eUNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OOiB7Ci0JCQkJV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHdlYlJlc291cmNlQ29sbGVjdGlvbiA9IChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbih3ZWJSZXNvdXJjZUNvbGxlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVDogewotCQkJCUF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50ID0gKEF1dGhDb25zdHJhaW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBdXRoQ29uc3RyYWludChhdXRoQ29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlQ6IHsKLQkJCQlVc2VyRGF0YUNvbnN0cmFpbnQgdXNlckRhdGFDb25zdHJhaW50ID0gKFVzZXJEYXRhQ29uc3RyYWludCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVXNlckRhdGFDb25zdHJhaW50KHVzZXJEYXRhQ29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHOiB7Ci0JCQkJTG9naW5Db25maWcgbG9naW5Db25maWcgPSAoTG9naW5Db25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUxvZ2luQ29uZmlnKGxvZ2luQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJRzogewotCQkJCUZvcm1Mb2dpbkNvbmZpZyBmb3JtTG9naW5Db25maWcgPSAoRm9ybUxvZ2luQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGb3JtTG9naW5Db25maWcoZm9ybUxvZ2luQ29uZmlnKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNOiB7Ci0JCQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUluaXRQYXJhbShpbml0UGFyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9UWVBFOiB7Ci0JCQkJV2ViVHlwZSB3ZWJUeXBlID0gKFdlYlR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYlR5cGUod2ViVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFOiB7Ci0JCQkJU2VydmxldFR5cGUgc2VydmxldFR5cGUgPSAoU2VydmxldFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZsZXRUeXBlKHNlcnZsZXRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXZWJUeXBlKHNlcnZsZXRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRTogewotCQkJCUpTUFR5cGUganNwVHlwZSA9IChKU1BUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKU1BUeXBlKGpzcFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdlYlR5cGUoanNwVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRTogewotCQkJCVVSTFBhdHRlcm5UeXBlIHVybFBhdHRlcm5UeXBlID0gKFVSTFBhdHRlcm5UeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VVUkxQYXR0ZXJuVHlwZSh1cmxQYXR0ZXJuVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEU6IHsKLQkJCQlSb2xlTmFtZVR5cGUgcm9sZU5hbWVUeXBlID0gKFJvbGVOYW1lVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUm9sZU5hbWVUeXBlKHJvbGVOYW1lVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFOiB7Ci0JCQkJV2VsY29tZUZpbGUgd2VsY29tZUZpbGUgPSAoV2VsY29tZUZpbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlbGNvbWVGaWxlKHdlbGNvbWVGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFOiB7Ci0JCQkJRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBleGNlcHRpb25UeXBlRXJyb3JQYWdlID0gKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoZXhjZXB0aW9uVHlwZUVycm9yUGFnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXJyb3JQYWdlKGV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRTogewotCQkJCUVycm9yQ29kZUVycm9yUGFnZSBlcnJvckNvZGVFcnJvclBhZ2UgPSAoRXJyb3JDb2RlRXJyb3JQYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFcnJvckNvZGVFcnJvclBhZ2UoZXJyb3JDb2RlRXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFcnJvclBhZ2UoZXJyb3JDb2RlRXJyb3JQYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElORzogewotCQkJCUZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZyA9IChGaWx0ZXJNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWx0ZXJNYXBwaW5nKGZpbHRlck1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUjogewotCQkJCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWx0ZXIoZmlsdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChmaWx0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoZmlsdGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q6IHsKLQkJCQlMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0ID0gKExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElORzogewotCQkJCUxvY2FsRW5jb2RpbmdNYXBwaW5nIGxvY2FsRW5jb2RpbmdNYXBwaW5nID0gKExvY2FsRW5jb2RpbmdNYXBwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZyhsb2NhbEVuY29kaW5nTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRTogewotCQkJCUhUVFBNZXRob2RUeXBlIGh0dHBNZXRob2RUeXBlID0gKEhUVFBNZXRob2RUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIVFRQTWV0aG9kVHlwZShodHRwTWV0aG9kVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBBcHA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIEFwcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2ViQXBwKFdlYkFwcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRleHQgUGFyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGV4dCBQYXJhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29udGV4dFBhcmFtKENvbnRleHRQYXJhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmxldChTZXJ2bGV0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmxldE1hcHBpbmcoU2VydmxldE1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVycm9yIFBhZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXJyb3JQYWdlKEVycm9yUGFnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBMaWIgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBMaWIgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWJSZWYoVGFnTGliUmVmIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eUNvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFJlc291cmNlIENvbGxlY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9naW4gQ29uZmlnPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9naW5Db25maWcoTG9naW5Db25maWcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXQgUGFyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdCBQYXJhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5pdFBhcmFtKEluaXRQYXJhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJUeXBlKFdlYlR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2bGV0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0VHlwZShTZXJ2bGV0VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpTUCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpTUCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUeXBlKEpTUFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VUkwgUGF0dGVybiBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVSTCBQYXR0ZXJuIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVVSTFBhdHRlcm5UeXBlKFVSTFBhdHRlcm5UeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOYW1lIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJvbGVOYW1lVHlwZShSb2xlTmFtZVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWxjb21lIEZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VsY29tZSBGaWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZShXZWxjb21lRmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4Y2VwdGlvbiBUeXBlIEVycm9yIFBhZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjZXB0aW9uIFR5cGUgRXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXhjZXB0aW9uVHlwZUVycm9yUGFnZShFeGNlcHRpb25UeXBlRXJyb3JQYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgQ29kZSBFcnJvciBQYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVycm9yIENvZGUgRXJyb3IgUGFnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXJyb3JDb2RlRXJyb3JQYWdlKEVycm9yQ29kZUVycm9yUGFnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXJNYXBwaW5nKEZpbHRlck1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWx0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXIoRmlsdGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmcoTG9jYWxFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IVFRQIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhUVFAgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBNZXRob2RUeXBlKEhUVFBNZXRob2RUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KTkRJIEVudiBSZWZzIEdyb3VwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpOREkgRW52IFJlZnMgR3JvdXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUpORElFbnZSZWZzR3JvdXAoSk5ESUVudlJlZnNHcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV2ViYXBwbGljYXRpb25Td2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZThlMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgRUpCQXJ0aWZhY3RFZGl0IGFwaS4gVGhpcyBhcGkgaXMgdXNlZCB0byB3b3JrIHdpdGggdGhlIGVtZiBtb2RlbAotICAgICAgICBvZiBhIGZsZXhpYmxlIGVqYiBtb2R1bGUuIEl0IGNvbnRhaW5zIGFwaSB0byByZWFkIGFuZCBzZXJpYWxpemUgb3V0IHRoZSBlbWYgbW9kZWwuCi0JCTwvYWJzdHJhY3Q+Ci0KLQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL1dlYlNlcnZpY2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDkxYmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWw7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlQ29uc3RhbnRzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfWE1MX0VOQ09ESU5HID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FICAgPSAid2Vic2VydmljZXMueG1sIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NZU1RFTUlEICAgID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfMV8wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9QVUJMSUNJRCA9ICItLy9JQk0gQ29ycG9yYXRpb24sIEluYy4vL0RURCBKMkVFIFdlYiBzZXJ2aWNlcyAxLjAvL0VOIjsgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfRE9DVFlQRSA9ICJ3ZWJzZXJ2aWNlcyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9MT0MgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIjsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU4gPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIjsvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRUNMSUVOVF9ERF9TSE9SVF9OQU1FICAgPSAid2Vic2VydmljZXNjbGllbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFQ0xJRU5UX1NZU1RFTUlEICAgID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMC5kdGQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VDTElFTlRfUFVCTElDSUQgPSAiLS8vSUJNIENvcnBvcmF0aW9uLCBJbmMuLy9EVEQgSjJFRSBXZWIgc2VydmljZXMgY2xpZW50IDEuMC8vRU4iOyAvLyROT04tTkxTLTEkICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRUNMSUVOVF9ET0NUWVBFID0gIndlYnNlcnZpY2VzY2xpZW50IjsvLyROT04tTkxTLTEkCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfVEVNUF9ERF9TSE9SVF9OQU1FID0gIndlYnNlcnZpY2VzLXRlbXAueG1sIjsvLyROT04tTkxTLTEkCi0KLSAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfRERfU0hPUlRfTkFNRSAgID0gIm1hcHBpbmcueG1sIjsgLy8kTk9OLU5MUy0xJCAhIVdlIGRvbid0IGhhdmUgYSBzdGFuZGFyZCBuYW1lISEKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUlBDTUFQX1NZU1RFTUlEICAgID0gImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV9qYXhycGNfbWFwcGluZ18xXzAuZHRkIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfUFVCTElDSUQgPSAiLS8vSUJNIENvcnBvcmF0aW9uLCBJbmMuLy9EVEQgSjJFRSBKQVgtUlBDIG1hcHBpbmcgMS4wLy9FTiI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfRE9DVFlQRSA9ICJqYXZhLXdzZGwtbWFwcGluZyI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfU0NIRU1BX0xPQyA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENNQVBfU0NIRU1BX0xPQ19TVU4gPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiOy8vJE5PTi1OTFMtMSQKLSAgCi0gIAotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQlNFUlZJQ0VfMV8wX0lEID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQlNFUlZJQ0VfMV8xX0lEID0gMTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX1ZFUlNJT04gPSAiMS4xIjsvLyROT04tTkxTLTEkCi0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC9XZWJTZXJ2aWNlSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC9XZWJTZXJ2aWNlSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWE2ZmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsOwotCi0KLQotLyoqCi0qIEluaXRpYWxpemVyIGNsYXNzIHRvIHByZXJlZ2lzdGVyIHBhY2thZ2VzLCByZWdpc3RlciByZXNvdXJjZSBmYWN0b3JpZXMsIGFuZCBkdGRzIGZvciB0aGUgd2ViIHNlcnZpY2VzIG1vZGVscy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUluaXQKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKQotICB7Ci0KLSAgICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVybjsKLSAKLQotICAgIC8vIEluaXRpYWxpemUgdGhlIEVjb3JlIHBhY2thZ2UuCi0gICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLSAgICBKMkVFSW5pdC5pbml0KCk7ICAgIAotCi0gICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlcwotICAgIEpheHJwY21hcFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCi0gICAgLy8gUmVnaXN0ZXIgcmVzb3VyY2UgZmFjdG9yaWVzIGZvciB4bWwgZGVzY3JpcHRvcnMKLQotCi0gICAgLy8gTm90IGNhbGxpbmcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCkgYmVjYXVzZSBpdCBkb2VzIG5vdGhpbmcuIFJlZ2lzdHJhdGlvbiBtdXN0IGJlIGRvbmUgZm9yIGVhY2ggZmlsZW5hbWUgYXMgZm9sbG93czoKLSAgICAvLyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoZmlsZW5hbWUsIG5ldyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOyAgCi0gICAgLy8gd2hlcmUgZmlsZW5hbWUgaXMgYSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUgb2YgdGhlIG1hcHBpbmcgZmlsZQotCi0gICAgLy9SZWdpc3RlciBEVERzCi0gICAgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyRHRkcygpOwotCi0KLSAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0KLQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL0Rlc2NyaXB0aW9uR3JvdXBIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9EZXNjcmlwdGlvbkdyb3VwSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDJlZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL0Rlc2NyaXB0aW9uR3JvdXBIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci0KLQotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBIZWxwZXIKLXsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFZhbHVlcyhXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcywgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZXMod2ViU2VydmljZXMsIGl0ZW0sIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIGJvb2xlYW4gZ2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSl3ZWJTZXJ2aWNlcy5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdGlvbnMod2ViU2VydmljZXMsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uRElTUExBWV9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWVzKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRTbWFsbEljb25zKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRMYXJnZUljb25zKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgZ2V0TGFuZyk7ICAgICAgICAKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBudWxsOyAgICAgIAotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0RGVzY3JpcHRpb25zKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLQotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gZGVzY3JpcHRpb25zID0gd2ViU2VydmljZXMuZ2V0RGVzY3JpcHRpb25zKCkudG9BcnJheSgpOwotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1tkZXNjcmlwdGlvbnMubGVuZ3RoXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEZXNjcmlwdGlvbilkZXNjcmlwdGlvbnNbaV0pLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEZXNjcmlwdGlvbilkZXNjcmlwdGlvbnNbaV0pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAJdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IHdlYlNlcnZpY2VzLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXREaXNwbGF5TmFtZXMoV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gZGlzcGxheU5hbWVzID0gd2ViU2VydmljZXMuZ2V0RGlzcGxheU5hbWVzKCkudG9BcnJheSgpOwotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1tkaXNwbGF5TmFtZXMubGVuZ3RoXTsgICAgICAKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGlzcGxheU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEaXNwbGF5TmFtZSlkaXNwbGF5TmFtZXNbaV0pLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8ZGlzcGxheU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChEaXNwbGF5TmFtZSlkaXNwbGF5TmFtZXNbaV0pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgLy9yZXR1cm4gbnVsbCBzaW5jZSBsYW5ndWFnZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEoyRUUgMS4zLgotICAgICAgICB2YWx1ZXNbMF0gPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXNbMF0gPSB3ZWJTZXJ2aWNlcy5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRTbWFsbEljb25zKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGljb25zID0gd2ViU2VydmljZXMuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2ljb25zLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxpY29ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoSWNvblR5cGUpaWNvbnNbaV0pLmdldFNtYWxsSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IHdlYlNlcnZpY2VzLmdldFNtYWxsSWNvbigpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRMYXJnZUljb25zKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGljb25zID0gd2ViU2VydmljZXMuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2ljb25zLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxpY29ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoSWNvblR5cGUpaWNvbnNbaV0pLmdldExhcmdlSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgLy9yZXR1cm4gbnVsbCBzaW5jZSBsYW5ndWFnZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEoyRUUgMS4zLgotICAgICAgICB2YWx1ZXNbMF0gPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXNbMF0gPSB3ZWJTZXJ2aWNlcy5nZXRMYXJnZUljb24oKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci0KLQotICAvL1dlYlNlcnZpY2VzRGVzY3JpcHRpb24gbWV0aG9kcwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWx1ZShXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXNEZXNjcmlwdGlvbiwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZSh3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBpdGVtLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbHVlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBib29sZWFuIGdldExhbmcpCi0gIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2Upd2ViU2VydmljZXNEZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdGlvbih3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldFNtYWxsSWNvbih3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRMYXJnZUljb24od2ViU2VydmljZXNEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIGdldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VzRGVzY3JpcHRpb24sIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nIHJldCA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIERlc2NyaXB0aW9uVHlwZSBkZXNjVHlwZSA9IHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0gICAgICBpZiAoZGVzY1R5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZGVzY1R5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGRlc2NUeXBlLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsJCi0gIAotCQlpZiggIWxhbmcgKQotCQl7Ci0JCQlyZXQgPSB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5TmFtZShXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXNEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgRGlzcGxheU5hbWVUeXBlIGRuVHlwZSA9IHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgICBpZiAoZG5UeXBlIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAobGFuZykKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGRuVHlwZS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZG5UeXBlLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYoICFsYW5nICkKLSAgICAgIHsKLSAgICAgICAgcmV0ID0gd2ViU2VydmljZXNEZXNjcmlwdGlvbi5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNtYWxsSWNvbihXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZXNEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgSWNvblR5cGUgaWNvblR5cGUgPSB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgaWNvblR5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGljb25UeXBlLmdldFNtYWxsSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiggIWxhbmcpCi0gICAgICB7Ci0gICAgICAJcmV0ID0gIHdlYlNlcnZpY2VzRGVzY3JpcHRpb24uZ2V0U21hbGxJY29uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgICBTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgSWNvblR5cGUgaWNvblR5cGUgPSB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgaWNvblR5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGljb25UeXBlLmdldExhcmdlSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiggIWxhbmcgKQotICAgICAgewotICAgICAgCXJldCA9ICB3ZWJTZXJ2aWNlc0Rlc2NyaXB0aW9uLmdldExhcmdlSWNvbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgLy9Qb3J0Q29tcG9uZW50IG1ldGhvZHMKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsdWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlKHBvcnRDb21wb25lbnQsIGl0ZW0sIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsdWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBib29sZWFuIGdldExhbmcpCi0gIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpcG9ydENvbXBvbmVudC5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdGlvbihwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldFNtYWxsSWNvbihwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRMYXJnZUljb24ocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIGdldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZyByZXQgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBEZXNjcmlwdGlvblR5cGUgZGVzY1R5cGUgPSBwb3J0Q29tcG9uZW50LmdldERlc2NyaXB0aW9uVHlwZSgpOwotICAgICAgaWYgKGRlc2NUeXBlIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAobGFuZykKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gIGRlc2NUeXBlLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBkZXNjVHlwZS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiggIWxhbmcgKQotICAgICAgewotICAgICAgCXJldCA9ICBwb3J0Q29tcG9uZW50LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZyByZXQgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBEaXNwbGF5TmFtZVR5cGUgZG5UeXBlID0gcG9ydENvbXBvbmVudC5nZXREaXNwbGF5TmFtZVR5cGUoKTsKLSAgICAgIGlmIChkblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSAgZG5UeXBlLmdldExhbmcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCXJldCA9ICBkblR5cGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYoICFsYW5nICkKLSAgICAgIHsKLSAgICAgIAlyZXQgPSAgcG9ydENvbXBvbmVudC5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNtYWxsSWNvbihQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIGJvb2xlYW4gaXNKMkVFMTQsIGJvb2xlYW4gbGFuZykKLSAgewotICAJU3RyaW5nIHJldCA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIEljb25UeXBlIGljb25UeXBlID0gcG9ydENvbXBvbmVudC5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb25UeXBlIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAobGFuZykKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gaWNvblR5cGUuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJcmV0ID0gaWNvblR5cGUuZ2V0U21hbGxJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmKCAhbGFuZyApCi0gICAgICB7Ci0gICAgICAJcmV0ID0gcG9ydENvbXBvbmVudC5nZXRTbWFsbEljb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYXJnZUljb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgICBTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgSWNvblR5cGUgaWNvblR5cGUgPSBwb3J0Q29tcG9uZW50LmdldEljb25UeXBlKCk7Ci0gICAgICBpZiAoaWNvblR5cGUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsYW5nKQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSBpY29uVHlwZS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlyZXQgPSBpY29uVHlwZS5nZXRMYXJnZUljb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCAhbGFuZyApCi0gICAgICB7Ci0gICAgICAJcmV0ID0gcG9ydENvbXBvbmVudC5nZXRMYXJnZUljb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VmFsdWVzKEhhbmRsZXIgaGFuZGxlciwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZXMoaGFuZGxlciwgaXRlbSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFZhbHVlcyhIYW5kbGVyIGhhbmRsZXIsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIGJvb2xlYW4gZ2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSloYW5kbGVyLmVSZXNvdXJjZSgpOwotICAgIGJvb2xlYW4gaXNKMkVFMTQ9ZmFsc2U7Ci0gICAgaWYgKHJlcy5nZXRKMkVFVmVyc2lvbklEKCk9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotICAgIHsKLSAgICAgIGlzSjJFRTE0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChpdGVtLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKLSAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0aW9ucyhoYW5kbGVyLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lcyhoYW5kbGVyLCBpc0oyRUUxNCwgZ2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHJldHVybiBnZXRTbWFsbEljb25zKGhhbmRsZXIsIGlzSjJFRTE0LCBnZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKLSAgICAgICAgcmV0dXJuIGdldExhcmdlSWNvbnMoaGFuZGxlciwgaXNKMkVFMTQsIGdldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXREZXNjcmlwdGlvbnMoSGFuZGxlciBoYW5kbGVyLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLQotICAJU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgT2JqZWN0W10gZGVzY3JpcHRpb25zID0gaGFuZGxlci5nZXREZXNjcmlwdGlvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0aW9ucy5sZW5ndGhdOyAgICAgIAotICAgICAgaWYgKGxhbmcpCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKERlc2NyaXB0aW9uKWRlc2NyaXB0aW9uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKERlc2NyaXB0aW9uKWRlc2NyaXB0aW9uc1tpXSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IGhhbmRsZXIuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0RGlzcGxheU5hbWVzKEhhbmRsZXIgaGFuZGxlciwgYm9vbGVhbiBpc0oyRUUxNCwgYm9vbGVhbiBsYW5nKQotICB7Ci0gIAlTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBkaXNwbGF5TmFtZXMgPSBoYW5kbGVyLmdldERpc3BsYXlOYW1lcygpLnRvQXJyYXkoKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbZGlzcGxheU5hbWVzLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGRpc3BsYXlOYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoRGlzcGxheU5hbWUpZGlzcGxheU5hbWVzW2ldKS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGRpc3BsYXlOYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoRGlzcGxheU5hbWUpZGlzcGxheU5hbWVzW2ldKS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgLy9yZXR1cm4gbnVsbCBzaW5jZSBsYW5ndWFnZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEoyRUUgMS4zLgotICAgICAgICB2YWx1ZXNbMF0gPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXNbMF0gPSBoYW5kbGVyLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFNtYWxsSWNvbnMoSGFuZGxlciBoYW5kbGVyLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9IG51bGw7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGljb25zID0gaGFuZGxlci5nZXRJY29ucygpLnRvQXJyYXkoKTsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbaWNvbnMubGVuZ3RoXTsgICAgICAKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPTA7IGk8aWNvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZXNbaV0gPSAoKEljb25UeXBlKWljb25zW2ldKS5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0U21hbGxJY29uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgIGlmIChsYW5nKQotICAgICAgewotICAgICAgICAvL3JldHVybiBudWxsIHNpbmNlIGxhbmd1YWdlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSjJFRSAxLjMuCi0gICAgICAgIHZhbHVlc1swXSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZhbHVlc1swXSA9IGhhbmRsZXIuZ2V0U21hbGxJY29uKCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldExhcmdlSWNvbnMoSGFuZGxlciBoYW5kbGVyLCBib29sZWFuIGlzSjJFRTE0LCBib29sZWFuIGxhbmcpCi0gIHsKLSAgCVN0cmluZ1tdIHZhbHVlcyA9ICBudWxsOwotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBpY29ucyA9IGhhbmRsZXIuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nW2ljb25zLmxlbmd0aF07ICAgICAgCi0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgZm9yKGludCBpID0wOyBpPGljb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWVzW2ldID0gKChJY29uVHlwZSlpY29uc1tpXSkuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvcihpbnQgaSA9MDsgaTxpY29ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlc1tpXSA9ICgoSWNvblR5cGUpaWNvbnNbaV0pLmdldExhcmdlSWNvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICBpZiAobGFuZykKLSAgICAgIHsKLSAgICAgICAgLy9yZXR1cm4gbnVsbCBzaW5jZSBsYW5ndWFnZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEoyRUUgMS4zLgotICAgICAgICB2YWx1ZXNbMF0gPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXNbMF0gPSBoYW5kbGVyLmdldExhcmdlSWNvbigpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICAvL1NldHRlciBmb3IgV2ViU2VydmljZXMKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSh3ZWJTZXJ2aWNlcywgaXRlbSwgdmFsdWUsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBpdGVtLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSl3ZWJTZXJ2aWNlcy5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ESVNQTEFZX05BTUU6Ci0gICAgICAgIHNldERpc3BsYXlOYW1lKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5TTUFMTF9JQ09OOgotICAgICAgICBzZXRTbWFsbEljb24od2ViU2VydmljZXMsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHNldExhcmdlSWNvbih3ZWJTZXJ2aWNlcywgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsgICAgICAgIAotICAgICAgICAvL2JyZWFrOyAgICAgICAgCi0gICAgICBkZWZhdWx0Oi8vZG8gbm90aGluZyA7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcywgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBEZXNjcmlwdGlvbiBvYmplY3QKLSAgICAgIE9iamVjdFtdIGRlc2NyaXB0aW9ucyA9IHdlYlNlcnZpY2VzLmdldERlc2NyaXB0aW9ucygpLnRvQXJyYXkoKTsKLSAgICAgIERlc2NyaXB0aW9uIGZpcnN0RGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgaWYgKGRlc2NyaXB0aW9ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERlc2NyaXB0aW9uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24gPSBmYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGVzY3JpcHRpb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGVzY3JpcHRpb24uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHdlYlNlcnZpY2VzLmdldERlc2NyaXB0aW9ucygpLmFkZChuZXdEZXNjcmlwdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0RGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pZGVzY3JpcHRpb25zWzBdOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGVzY3JpcHRpb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3REZXNjcmlwdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VzLnNldERlc2NyaXB0aW9uKHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERpc3BsYXlOYW1lKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERpc3BsYXlOYW1lIG9iamVjdAotICAgICAgT2JqZWN0W10gZGlzcGxheU5hbWVzID0gd2ViU2VydmljZXMuZ2V0RGlzcGxheU5hbWVzKCkudG9BcnJheSgpOwotICAgICAgRGlzcGxheU5hbWUgZmlyc3REaXNwbGF5TmFtZSA9IG51bGw7Ci0gICAgICBpZiAoZGlzcGxheU5hbWVzLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGlzcGxheU5hbWUKLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEaXNwbGF5TmFtZSBuZXdEaXNwbGF5TmFtZSA9IGZhY3RvcnkuY3JlYXRlRGlzcGxheU5hbWUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEaXNwbGF5TmFtZS5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdEaXNwbGF5TmFtZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3ZWJTZXJ2aWNlcy5nZXREaXNwbGF5TmFtZXMoKS5hZGQobmV3RGlzcGxheU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdERpc3BsYXlOYW1lID0gKERpc3BsYXlOYW1lKWRpc3BsYXlOYW1lc1swXTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdERpc3BsYXlOYW1lLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGlzcGxheU5hbWUuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICB3ZWJTZXJ2aWNlcy5zZXREaXNwbGF5TmFtZSh2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTbWFsbEljb24oV2ViU2VydmljZXMgd2ViU2VydmljZXMsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIE9iamVjdFtdIGljb25zID0gd2ViU2VydmljZXMuZ2V0SWNvbnMoKS50b0FycmF5KCk7Ci0gICAgICBJY29uVHlwZSBmaXJzdEljb24gPSBudWxsOwotICAgICAgaWYgKGljb25zLmxlbmd0aCA8IDEpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGFuIEljb24KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBJY29uVHlwZSBuZXdJY29uID0gZmFjdG9yeS5jcmVhdGVJY29uVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3SWNvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHdlYlNlcnZpY2VzLmdldEljb25zKCkuYWRkKG5ld0ljb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdEljb24gPSAoSWNvblR5cGUpaWNvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3RJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICB3ZWJTZXJ2aWNlcy5zZXRTbWFsbEljb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TGFyZ2VJY29uKFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIEljb24gb2JqZWN0Ci0gICAgICBPYmplY3RbXSBpY29ucyA9IHdlYlNlcnZpY2VzLmdldEljb25zKCkudG9BcnJheSgpOwotICAgICAgSWNvblR5cGUgZmlyc3RJY29uID0gbnVsbDsKLSAgICAgIGlmIChpY29ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhbiBJY29uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgSWNvblR5cGUgbmV3SWNvbiA9IGZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB3ZWJTZXJ2aWNlcy5nZXRJY29ucygpLmFkZChuZXdJY29uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZmlyc3RJY29uID0gKEljb25UeXBlKWljb25zWzBdOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdEljb24uc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgd2ViU2VydmljZXMuc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotCi0vL1NldHRlcnMgZm9yIFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgaXRlbSwgdmFsdWUsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gIAlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKXdlYlNlcnZpY2VEZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uRElTUExBWV9OQU1FOgotICAgICAgICBzZXREaXNwbGF5TmFtZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHNldFNtYWxsSWNvbih3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHNldExhcmdlSWNvbih3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7ICAgICAgICAKLSAgICAgICAgLy9icmVhazsgICAgICAgIAotICAgICAgZGVmYXVsdDoKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgCi0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGVzY3JpcHRpb24gb2JqZWN0Ci0gICAgICAKLSAgICAgIERlc2NyaXB0aW9uVHlwZSBkZXNjcmlwdGlvbiA9IHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5nZXREZXNjcmlwdGlvblR5cGUoKTsKLSAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERlc2NyaXB0aW9uVHlwZQotICAgICAgICBXc2NvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3Njb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIERlc2NyaXB0aW9uVHlwZSBkZXNjcmlwdGlvbk5ldyA9IGZhY3RvcnkuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCk7Ci0KLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICAgIGRlc2NyaXB0aW9uTmV3LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgd2ViU2VydmljZURlc2NyaXB0aW9uLnNldERlc2NyaXB0aW9uVHlwZShkZXNjcmlwdGlvbk5ldyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZGVzY3JpcHRpb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREaXNwbGF5TmFtZShXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZURlc2NyaXB0aW9uLCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERpc3BsYXlOYW1lIG9iamVjdAotICAgICAgCi0gICAgICBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWUgPSB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYSBEaXNwbGF5TmFtZVR5cGUKLSAgICAgICAgV3Njb21tb25GYWN0b3J5IGZhY3RvcnkgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFdzY29tbW9uRmFjdG9yeSgpOwotICAgICAgICBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWVOZXcgPSBmYWN0b3J5LmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lTmV3LnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lTmV3LnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uc2V0RGlzcGxheU5hbWVUeXBlKGRpc3BsYXlOYW1lTmV3KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5TmFtZS5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5TmFtZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXREaXNwbGF5TmFtZSh2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTbWFsbEljb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBJY29uIG9iamVjdAotICAgICAgSWNvblR5cGUgaWNvbiA9IHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIGljb25OZXcgPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uc2V0SWNvblR5cGUoaWNvbk5ldyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHdlYlNlcnZpY2VEZXNjcmlwdGlvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TGFyZ2VJY29uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIEljb25UeXBlIGljb24gPSB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2V0SWNvblR5cGUoKTsKLSAgICAgIGlmIChpY29uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGFuIEljb24KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotICAgICAgICBJY29uVHlwZSBpY29uTmV3ID0gZmFjdG9yeS5jcmVhdGVJY29uVHlwZSgpOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGljb25OZXcuc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2ViU2VydmljZURlc2NyaXB0aW9uLnNldEljb25UeXBlKGljb25OZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICB3ZWJTZXJ2aWNlRGVzY3JpcHRpb24uc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotCi0vL1NldHRlcnMgZm9yIFBvcnRDb21wb25lbnRzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSkKLSAgewotCi0gICAgc2V0VmFsdWUocG9ydENvbXBvbmVudCwgaXRlbSwgdmFsdWUsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKFBvcnRDb21wb25lbnQgcG9ydENvbXBvbmVudCwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gaXRlbSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgCUoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpcG9ydENvbXBvbmVudC5lUmVzb3VyY2UoKTsKLSAgICBib29sZWFuIGlzSjJFRTE0PWZhbHNlOwotICAgIGlmIChyZXMuZ2V0SjJFRVZlcnNpb25JRCgpPT1KMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLSAgICB7Ci0gICAgICBpc0oyRUUxNCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCAoaXRlbS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uREVTQ1JJUFRJT046Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKLSAgICAgICAgc2V0RGlzcGxheU5hbWUocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKLSAgICAgICAgLy9icmVhazsKLSAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKLSAgICAgICAgc2V0U21hbGxJY29uKHBvcnRDb21wb25lbnQsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkxBUkdFX0lDT046Ci0gICAgICAgIHNldExhcmdlSWNvbihwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOyAgICAgICAgCi0gICAgICAgIC8vYnJlYWs7ICAgICAgICAKLSAgICAgIGRlZmF1bHQ6IAotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIAotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERlc2NyaXB0aW9uIG9iamVjdAotICAgICAgCi0gICAgICBEZXNjcmlwdGlvblR5cGUgZGVzY3JpcHRpb24gPSBwb3J0Q29tcG9uZW50LmdldERlc2NyaXB0aW9uVHlwZSgpOwotICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGVzY3JpcHRpb25UeXBlCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2NvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGVzY3JpcHRpb25UeXBlIGRlc2NyaXB0aW9uTmV3ID0gZmFjdG9yeS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbk5ldy5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHBvcnRDb21wb25lbnQuc2V0RGVzY3JpcHRpb25UeXBlKGRlc2NyaXB0aW9uTmV3KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgLy9tdXN0IGJlIEoyRUUgMS4zIChKU1ItMTA5IDEuMCkKLSAgICB7Ci0gICAgICBpZiAoIXNldExhbmcpCi0gICAgICAgIHBvcnRDb21wb25lbnQuc2V0RGVzY3JpcHRpb24odmFsdWUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RGlzcGxheU5hbWUoUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIERpc3BsYXlOYW1lIG9iamVjdAotICAgICAgCi0gICAgICBEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWUgPSBwb3J0Q29tcG9uZW50LmdldERpc3BsYXlOYW1lVHlwZSgpOwotICAgICAgaWYgKGRpc3BsYXlOYW1lID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY3JlYXRlIGEgRGlzcGxheU5hbWVUeXBlCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBmYWN0b3J5ID0gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2NvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGlzcGxheU5hbWVUeXBlIGRpc3BsYXlOYW1lTmV3ID0gZmFjdG9yeS5jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5TmFtZU5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkaXNwbGF5TmFtZU5ldy5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcG9ydENvbXBvbmVudC5zZXREaXNwbGF5TmFtZVR5cGUoZGlzcGxheU5hbWVOZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRpc3BsYXlOYW1lLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgcG9ydENvbXBvbmVudC5zZXREaXNwbGF5TmFtZSh2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTbWFsbEljb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIEljb24gb2JqZWN0Ci0gICAgICBJY29uVHlwZSBpY29uID0gcG9ydENvbXBvbmVudC5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIGljb25OZXcgPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldEljb25UeXBlKGljb25OZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRTbWFsbEljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRMYXJnZUljb24oUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50LCBib29sZWFuIGlzSjJFRTE0LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2V0TGFuZykKLSAgewotICAgIGlmIChpc0oyRUUxNCkKLSAgICB7Ci0gICAgICAvL0dldCBvciBjcmVhdGUgdGhlIEljb24gb2JqZWN0Ci0gICAgICBJY29uVHlwZSBpY29uID0gcG9ydENvbXBvbmVudC5nZXRJY29uVHlwZSgpOwotICAgICAgaWYgKGljb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIGljb25OZXcgPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbk5ldy5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpY29uTmV3LnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldEljb25UeXBlKGljb25OZXcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGljb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBwb3J0Q29tcG9uZW50LnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgLy9TZXR0ZXIgZm9yIEhhbmRsZXJzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShIYW5kbGVyIGhhbmRsZXIsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKGhhbmRsZXIsIGl0ZW0sIHZhbHVlLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShIYW5kbGVyIGhhbmRsZXIsIERlc2NyaXB0aW9uR3JvdXBJdGVtIGl0ZW0sIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gIAlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKWhhbmRsZXIuZVJlc291cmNlKCk7Ci0gICAgYm9vbGVhbiBpc0oyRUUxND1mYWxzZTsKLSAgICBpZiAocmVzLmdldEoyRUVWZXJzaW9uSUQoKT09SjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0gICAgewotICAgICAgaXNKMkVFMTQgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKGl0ZW0uZ2V0VmFsdWUoKSkKLSAgICB7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRFU0NSSVBUSU9OOgotICAgICAgICBzZXREZXNjcmlwdGlvbihoYW5kbGVyLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ESVNQTEFZX05BTUU6Ci0gICAgICAgIHNldERpc3BsYXlOYW1lKGhhbmRsZXIsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7Ci0gICAgICAgIC8vYnJlYWs7Ci0gICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046Ci0gICAgICAgIHNldFNtYWxsSWNvbihoYW5kbGVyLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwotICAgICAgICAvL2JyZWFrOwotICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5MQVJHRV9JQ09OOgotICAgICAgICBzZXRMYXJnZUljb24oaGFuZGxlciwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsgICAgICAgIAotICAgICAgICAvL2JyZWFrOyAgICAgICAgCi0gICAgICBkZWZhdWx0Oi8vZG8gbm90aGluZyA7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGVzY3JpcHRpb24gb2JqZWN0Ci0gICAgICBPYmplY3RbXSBkZXNjcmlwdGlvbnMgPSBoYW5kbGVyLmdldERlc2NyaXB0aW9ucygpLnRvQXJyYXkoKTsKLSAgICAgIERlc2NyaXB0aW9uIGZpcnN0RGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgaWYgKGRlc2NyaXB0aW9ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERlc2NyaXB0aW9uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGVzY3JpcHRpb24gbmV3RGVzY3JpcHRpb24gPSBmYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGVzY3JpcHRpb24uc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGVzY3JpcHRpb24uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGhhbmRsZXIuZ2V0RGVzY3JpcHRpb25zKCkuYWRkKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZmlyc3REZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilkZXNjcmlwdGlvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3REZXNjcmlwdGlvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdERlc2NyaXB0aW9uLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgaGFuZGxlci5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREaXNwbGF5TmFtZShIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgRGlzcGxheU5hbWUgb2JqZWN0Ci0gICAgICBPYmplY3RbXSBkaXNwbGF5TmFtZXMgPSBoYW5kbGVyLmdldERpc3BsYXlOYW1lcygpLnRvQXJyYXkoKTsKLSAgICAgIERpc3BsYXlOYW1lIGZpcnN0RGlzcGxheU5hbWUgPSBudWxsOwotICAgICAgaWYgKGRpc3BsYXlOYW1lcy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhIERpc3BsYXlOYW1lCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgRGlzcGxheU5hbWUgbmV3RGlzcGxheU5hbWUgPSBmYWN0b3J5LmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGlzcGxheU5hbWUuc2V0TGFuZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3RGlzcGxheU5hbWUuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlci5nZXREaXNwbGF5TmFtZXMoKS5hZGQobmV3RGlzcGxheU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdERpc3BsYXlOYW1lID0gKERpc3BsYXlOYW1lKWRpc3BsYXlOYW1lc1swXTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdERpc3BsYXlOYW1lLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0RGlzcGxheU5hbWUuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBoYW5kbGVyLnNldERpc3BsYXlOYW1lKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFNtYWxsSWNvbihIYW5kbGVyIGhhbmRsZXIsIGJvb2xlYW4gaXNKMkVFMTQsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBzZXRMYW5nKQotICB7Ci0gICAgaWYgKGlzSjJFRTE0KQotICAgIHsKLSAgICAgIC8vR2V0IG9yIGNyZWF0ZSB0aGUgSWNvbiBvYmplY3QKLSAgICAgIE9iamVjdFtdIGljb25zID0gaGFuZGxlci5nZXRJY29ucygpLnRvQXJyYXkoKTsKLSAgICAgIEljb25UeXBlIGZpcnN0SWNvbiA9IG51bGw7Ci0gICAgICBpZiAoaWNvbnMubGVuZ3RoIDwgMSkKLSAgICAgIHsKLSAgICAgICAgLy9jcmVhdGUgYW4gSWNvbgotICAgICAgICBDb21tb25GYWN0b3J5IGZhY3RvcnkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0gICAgICAgIEljb25UeXBlIG5ld0ljb24gPSBmYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3SWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdJY29uLnNldFNtYWxsSWNvbih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlci5nZXRJY29ucygpLmFkZChuZXdJY29uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZmlyc3RJY29uID0gKEljb25UeXBlKWljb25zWzBdOwotICAgICAgICBpZiAoc2V0TGFuZykKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRMYW5nKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdEljb24uc2V0U21hbGxJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL211c3QgYmUgSjJFRSAxLjMgKEpTUi0xMDkgMS4wKQotICAgIHsKLSAgICAgIGlmICghc2V0TGFuZykKLSAgICAgICAgaGFuZGxlci5zZXRTbWFsbEljb24odmFsdWUpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TGFyZ2VJY29uKEhhbmRsZXIgaGFuZGxlciwgYm9vbGVhbiBpc0oyRUUxNCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIHNldExhbmcpCi0gIHsKLSAgICBpZiAoaXNKMkVFMTQpCi0gICAgewotICAgICAgLy9HZXQgb3IgY3JlYXRlIHRoZSBJY29uIG9iamVjdAotICAgICAgT2JqZWN0W10gaWNvbnMgPSBoYW5kbGVyLmdldEljb25zKCkudG9BcnJheSgpOwotICAgICAgSWNvblR5cGUgZmlyc3RJY29uID0gbnVsbDsKLSAgICAgIGlmIChpY29ucy5sZW5ndGggPCAxKQotICAgICAgewotICAgICAgICAvL2NyZWF0ZSBhbiBJY29uCi0gICAgICAgIENvbW1vbkZhY3RvcnkgZmFjdG9yeSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLSAgICAgICAgSWNvblR5cGUgbmV3SWNvbiA9IGZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgaWYgKHNldExhbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5ld0ljb24uc2V0TGFyZ2VJY29uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVyLmdldEljb25zKCkuYWRkKG5ld0ljb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdEljb24gPSAoSWNvblR5cGUpaWNvbnNbMF07Ci0gICAgICAgIGlmIChzZXRMYW5nKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyc3RJY29uLnNldExhbmcodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0SWNvbi5zZXRMYXJnZUljb24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vbXVzdCBiZSBKMkVFIDEuMyAoSlNSLTEwOSAxLjApCi0gICAgewotICAgICAgaWYgKCFzZXRMYW5nKQotICAgICAgICBoYW5kbGVyLnNldExhcmdlSWNvbih2YWx1ZSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL0Rlc2NyaXB0aW9uR3JvdXBJdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvRGVzY3JpcHRpb25Hcm91cEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyOTA4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvRGVzY3JpcHRpb25Hcm91cEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBJdGVtIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NSSVBUSU9OID0gMDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX05BTUUgPSAxOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNNQUxMX0lDT04gPSAyOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBUkdFX0lDT04gPSAzOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gREVTQ1JJUFRJT05fTElURVJBTCA9IG5ldyBEZXNjcmlwdGlvbkdyb3VwSXRlbShERVNDUklQVElPTiwgImRlc2NyaXB0aW9uIik7Ly8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIERlc2NyaXB0aW9uR3JvdXBJdGVtIERJU1BMQVlfTkFNRV9MSVRFUkFMID0gbmV3IERlc2NyaXB0aW9uR3JvdXBJdGVtKERJU1BMQVlfTkFNRSwgImRpc3BsYXktbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBEZXNjcmlwdGlvbkdyb3VwSXRlbSBTTUFMTF9JQ09OX0xJVEVSQUwgPSBuZXcgRGVzY3JpcHRpb25Hcm91cEl0ZW0oU01BTExfSUNPTiwgInNtYWxsLWljb24iKTsvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRGVzY3JpcHRpb25Hcm91cEl0ZW0gTEFSR0VfSUNPTl9MSVRFUkFMID0gbmV3IERlc2NyaXB0aW9uR3JvdXBJdGVtKExBUkdFX0lDT04sICJsYXJnZS1pY29uIik7Ly8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIERlc2NyaXB0aW9uR3JvdXBJdGVtW10gVkFMVUVTX0FSUkFZID0KLSAgICBuZXcgRGVzY3JpcHRpb25Hcm91cEl0ZW1bXQotICAgIHsKLSAgICAgIERFU0NSSVBUSU9OX0xJVEVSQUwsCi0gICAgICBESVNQTEFZX05BTUVfTElURVJBTCwKLSAgICAgIFNNQUxMX0lDT05fTElURVJBTCwKLSAgICAgIExBUkdFX0lDT05fTElURVJBTAotICAgIH07Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotICBwdWJsaWMgc3RhdGljIERlc2NyaXB0aW9uR3JvdXBJdGVtIGdldChTdHJpbmcgbmFtZSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotICAgIHsKLSAgICAgIERlc2NyaXB0aW9uR3JvdXBJdGVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgIGlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBEZXNjcmlwdGlvbkdyb3VwSXRlbSBnZXQoaW50IHZhbHVlKQotICB7Ci0gICAgc3dpdGNoICh2YWx1ZSkKLSAgICB7Ci0gICAgICBjYXNlIERFU0NSSVBUSU9OOiByZXR1cm4gREVTQ1JJUFRJT05fTElURVJBTDsKLSAgICAgIGNhc2UgRElTUExBWV9OQU1FOiByZXR1cm4gRElTUExBWV9OQU1FX0xJVEVSQUw7Ci0gICAgICBjYXNlIFNNQUxMX0lDT046IHJldHVybiBTTUFMTF9JQ09OX0xJVEVSQUw7Ci0gICAgICBjYXNlIExBUkdFX0lDT046IHJldHVybiBMQVJHRV9JQ09OX0xJVEVSQUw7ICAgICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwkKLSAgfQotCi0gIHByaXZhdGUgRGVzY3JpcHRpb25Hcm91cEl0ZW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKHZhbHVlLCBuYW1lKTsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9RTmFtZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL1FOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZDM4MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL1FOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlOwotCi0KLQotLyoqCi0qIEpTUi0xMDkgdjEuMSBjaGFuZ2VkIHRoZSB3YXkgcXVhbGlmaWVkIG5hbWVzIGFyZSByZXByZXNlbnRlZC4gQXMgYSByZXN1bHQgdGhlIEVNRiBtb2RlbCBjaGFuZ2VkIGFzIHdlbGwuIAotKiBUaGUgbmV3IG1vZGVsIGlzIGNhcGFibGUgb2YgcmVhZGluZy93cml0aW5nIGJvdGggdjEuMCBhbmQgdjEuMSBkZXNjcmlwdG9ycyBidXQgdGhlIFFOYW1lIEFQSXMgd29yayBkaWZmZXJlbnRseQotKiBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgdGhlIGRlc2NyaXB0b3IuIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgdG8gc2V0IHZhbHVlcyBvbiBRTmFtZSdzIGluIG9yZGVyCi0qIHRvIGhpZGUgYW5kIGlzb2xhdGUgdGhlIHZlcnNpb24gY2hlY2tpbmcgbG9naWMuCi0qLwotcHVibGljIGNsYXNzIFFOYW1lSGVscGVyCi17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUFJFRklYPSJwZngiOy8vJE5PTi1OTFMtMSQKLQotICAvKgotICAqIFNldHMgdGhlIG5hbWVzcGFjZVVSSSBhbmQgdGhlIGxvY2FscGFydCBvbiB0aGUgc3VwcGxpZWQgUU5hbWUgdG8gdGhlIHN1cHBsaWVkIHZhbHVlcyByZXNwZWN0aXZlbHkuCi0gICogQHBhcmFtIHFuYW1lRU9iamVjdCBUaGUgcHJvcGVydGllcyBvbiB0aGlzIFFOYW1lIHdpbGwgYmUgc2V0LiBJZiB0aGUgUU5hbWUgZG9lcyBub3QgYmVsb25nIHRvIGEgUmVzb3VyY2UsCi0gICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBpcyBhc3N1bWVkIHRvIGJlIEoyRUUgMS40LgotICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgVGhlIG5hbWVzcGFjZVVSSQotICAqIEBwYXJhbSBsb2NhbFBhcnQgVGhlIGxvY2FsUGFydAotICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm5zIHRydWUgaWYgdmFsdWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS4gRmFsc2Ugb3RoZXJ3aXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UU5hbWVOYW1lc3BhY2VVUkkoUU5hbWUgcW5hbWVFT2JqZWN0LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIGxvY2FscGFydCA9IHFuYW1lRU9iamVjdC5nZXRMb2NhbFBhcnQoKTsKLSAgICBzZXRRTmFtZVZhbHVlKHFuYW1lRU9iamVjdCwgbmFtZXNwYWNlVVJJLCBsb2NhbHBhcnQpOyAgICAKLSAgfQotICAKLSAgLyoKLSAgKiBTZXRzIHRoZSBuYW1lc3BhY2VVUkkgYW5kIHRoZSBsb2NhbHBhcnQgb24gdGhlIHN1cHBsaWVkIFFOYW1lIHRvIHRoZSBzdXBwbGllZCB2YWx1ZXMgcmVzcGVjdGl2ZWx5LgotICAqIEBwYXJhbSBxbmFtZUVPYmplY3QgVGhlIHByb3BlcnRpZXMgb24gdGhpcyBRTmFtZSB3aWxsIGJlIHNldC4gSWYgdGhlIFFOYW1lIGRvZXMgbm90IGJlbG9uZyB0byBhIFJlc291cmNlLAotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZlcnNpb24gaXMgYXNzdW1lZCB0byBiZSBKMkVFIDEuNC4KLSAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIFRoZSBuYW1lc3BhY2VVUkkKLSAgKiBAcGFyYW0gbG9jYWxQYXJ0IFRoZSBsb2NhbFBhcnQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJucyB0cnVlIGlmIHZhbHVlcyB3ZXJlIHNldCBzdWNjZXNzZnVsbHkuIEZhbHNlIG90aGVyd2lzZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgcW5hbWVFT2JqZWN0LCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxQYXJ0KQotICB7Ci0gICAgc2V0UU5hbWVWYWx1ZShxbmFtZUVPYmplY3QsIG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0LCAiIik7IC8vJE5PTi1OTFMtMSQgICAKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIG5hbWVzcGFjZVVSSSwgbG9jYWxwYXJ0LCBhbmQgcHJlZml4IG9uIHRoZSBzdXBwbGllZCBRTmFtZSB0byB0aGUgc3VwcGxpZWQgdmFsdWVzIHJlc3BlY3RpdmVseS4KLSAgKiBAcGFyYW0gcW5hbWVFT2JqZWN0IFRoZSBwcm9wZXJ0aWVzIG9uIHRoaXMgUU5hbWUgd2lsbCBiZSBzZXQuIElmIHRoZSBRTmFtZSBkb2VzIG5vdCBiZWxvbmcgdG8gYSBSZXNvdXJjZSwKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2ZXJzaW9uIGlzIGFzc3VtZWQgdG8gYmUgSjJFRSAxLjQuCi0gICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgbmFtZXNwYWNlVVJJCi0gICogQHBhcmFtIGxvY2FsUGFydCBUaGUgbG9jYWxQYXJ0Ci0gICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4LiBVc2VkIGluIEpTUi0xMDkgdjEuMSBvbmx5LiBUaGlzIGlzIHRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBwcmVmaXggaXMgbnVsbCBvciBvZiBsZW5ndGggMCwgdGhlIGV4aXN0aW5nIHByZWZpeCBpcyB1c2VkLiBJZiBubyBwcmVmaXggZXhpc3RzLCBhbmQgdGhpcwotICAqICAgICAgICAgICAgICAgICAgICAgICBpcyBhIEpTUi0xMDkgdjEuMSBkZXNjcmlwdG9yIHRoZSBkZWZhdWx0IHByZWZpeCBkZWZpbmVkIGluIERFRkFVTFRfUFJFRklYIGlzIHVzZWQuCi0gICogQHJldHVybiBib29sZWFuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZXMgd2VyZSBzZXQgc3VjY2Vzc2Z1bGx5LiBGYWxzZSBvdGhlcndpc2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRRTmFtZVZhbHVlKFFOYW1lIHFuYW1lRU9iamVjdCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIGludCB2ZXJzaW9uSUQ7Ci0gICAgCi0gICAgLy9HZXQgdGhlIHZlcnNpb25JRCBmcm9tIHRoZSBRTmFtZSdzIFJlc291cmNlIGlmIGF2YWlsYWJsZQotICAgIEoyRUVWZXJzaW9uUmVzb3VyY2UgcmVzID0gKEoyRUVWZXJzaW9uUmVzb3VyY2UpcW5hbWVFT2JqZWN0LmVSZXNvdXJjZSgpOwotICAgIGlmIChyZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL3VzZSBhIEoyRUUgMS40IHZlcnNpb24gSUQgYXMgdGhlIGRlZmF1bHQKLSAgICAgIHZlcnNpb25JRCA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmVyc2lvbklEID0gcmVzLmdldEoyRUVWZXJzaW9uSUQoKTsKLSAgICB9Ci0KLSAgICBzZXRRTmFtZVZhbHVlKHFuYW1lRU9iamVjdCwgbmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQsIHByZWZpeCwgdmVyc2lvbklEKTsKLSAgICAKLSAgICAKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIG5hbWVzcGFjZVVSSSwgbG9jYWxwYXJ0LCBhbmQgcHJlZml4IG9uIHRoZSBzdXBwbGllZCBRTmFtZSB0byB0aGUgc3VwcGxpZWQgdmFsdWVzIHJlc3BlY3RpdmVseS4KLSAgKiBAcGFyYW0gcW5hbWVFT2JqZWN0IFRoZSBwcm9wZXJ0aWVzIG9uIHRoaXMgUU5hbWUgd2lsbCBiZSBzZXQuCi0gICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgbmFtZXNwYWNlVVJJCi0gICogQHBhcmFtIGxvY2FsUGFydCBUaGUgbG9jYWxQYXJ0Ci0gICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4LiBVc2VkIGluIEpTUi0xMDkgdjEuMSBvbmx5LiBUaGlzIGlzIHRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBwcmVmaXggaXMgbnVsbCBvciBvZiBsZW5ndGggMCwgdGhlIGV4aXN0aW5nIHByZWZpeCBpcyB1c2VkLiBJZiBubyBwcmVmaXggZXhpc3RzLCBhbmQgdGhpcwotICAqICAgICAgICAgICAgICAgICAgICAgICBpcyBhIEpTUi0xMDkgdjEuMSBkZXNjcmlwdG9yIHRoZSBkZWZhdWx0IHByZWZpeCBkZWZpbmVkIERFRkFVTFRfUFJFRklYIGlzIHVzZWQuCi0gICpAcGFyYW0gdmVyc2lvbklEIFRoZSBKMkVFIHZlcnNpb24uIFNob3VsZCBiZSBzZXQgdG8gb25lIG9mIHRoZSB2ZXJzaW9uIElEcyBkZWZpbmVkIGluIEoyRUVWZXJzaW9uQ29uc3RhbnRzLgotICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm5zIHRydWUgaWYgdmFsdWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS4gRmFsc2Ugb3RoZXJ3aXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UU5hbWVWYWx1ZShRTmFtZSBxbmFtZUVPYmplY3QsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbFBhcnQsIFN0cmluZyBwcmVmaXgsIGludCB2ZXJzaW9uSUQpCi0gIHsgICAgICAKLQotICAgIGlmICh2ZXJzaW9uSUQ9PUoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKQotICAgIHsKLSAgICAgIC8vaWdub3JlIHRoZSBwcmVmaXggYW5kIHNldCB0aGluZ3MgdGhlIG9sZCB3YXkKLSAgICAgIHFuYW1lRU9iamVjdC5zZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlVVJJKTsKLSAgICAgIHFuYW1lRU9iamVjdC5zZXRMb2NhbFBhcnQobG9jYWxQYXJ0KTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL3Jlc291cmNlIGlzIEoyRUUgMS40Ci0gICAgICBpZiAocHJlZml4PT1udWxsIHx8IHByZWZpeC5sZW5ndGgoKT09MCkKLSAgICAgIHsKLSAgICAgICAgLy91c2UgdGhlIGV4aXN0aW5nIHByZWZpeAotICAgICAgICBwcmVmaXggPSBxbmFtZUVPYmplY3QuZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0gICAgICAgIGlmIChwcmVmaXg9PW51bGwgfHwgcHJlZml4Lmxlbmd0aCgpPT0wKQotICAgICAgICB7Ci0gICAgICAgICAgLy91c2UgdGhlIGRlZmF1bHQgcHJlZml4Ci0gICAgICAgICAgcHJlZml4ID0gbmV3IFN0cmluZyhERUZBVUxUX1BSRUZJWCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHFuYW1lRU9iamVjdC5zZXRWYWx1ZXMocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsUGFydCk7Ci0gICAgCi0gICAgfQotICAgIAotICB9Ci0gIAotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3dzZGQvV3NkZFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC93c2RkL1dzZGRSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlY2I0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3dzZGQvV3NkZFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgV3NkZFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkKLXsKLSAgLyoqCi0gICogV3NkZFJlc291cmNlRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICAqLwotICBwdWJsaWMgV3NkZFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgCi0gIHsKLQkgIHN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotICB9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IFdzZGRSZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwotCX0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgbXlzZWxmIHdpdGggdGhlIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLSAgCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSwgbmV3IFdzZGRSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotICAJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9URU1QX0REX1NIT1JUX05BTUUsIG5ldyBXc2RkUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLSAgfQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBhUmVnaXN0cnkpIHsKLQkJYVJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FLCBuZXcgV3NkZFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JCWFSZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfVEVNUF9ERF9TSE9SVF9OQU1FLCBuZXcgV3NkZFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0gIH0KLQkKLSAgLyoqCi0gICAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0gICAqIEBzZWUgI3JlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0gIAlyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHJlZ2lzdGVyRHRkcy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIAotICB7Ci0gICAgLy9odHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMvZHRkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMC5kdGQKLSAgCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU1lTVEVNSUQsICJqMmVlX3dlYl9zZXJ2aWNlc18xXzAuZHRkIik7Ly8kTk9OLU5MUy0xJAotCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQywgImoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJAotICAgIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU4sICJqMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIik7IC8vJE5PTi1OTFMtMSQJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvQ29tcG9uZW50U2NvcGVkUmVmcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9Db21wb25lbnRTY29wZWRSZWZzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZWRkMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9Db21wb25lbnRTY29wZWRSZWZzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzI2dldENvbXBvbmVudE5hbWUgPGVtPkNvbXBvbmVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRTY29wZWRSZWZzIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wb25lbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbXBvbmVudE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmcyNnZXRDb21wb25lbnROYW1lIDxlbT5Db21wb25lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICB2b2lkIHNldENvbXBvbmVudE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVMaXN0IGdldFNlcnZpY2VSZWZzKCk7Ci0KLX0gLy8gQ29tcG9uZW50U2NvcGVkUmVmcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyYTMxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhhbmRsZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLSAqICAgICBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLSAqICAgICBwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkCi0gKiAgICAgd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0gKiAKLSAqICAgICBVc2VkIGluOiBzZXJ2aWNlLXJlZgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0U29hcFJvbGVzIDxlbT5Tb2FwIFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0UG9ydE5hbWVzIDxlbT5Qb3J0IE5hbWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciNnZXRTb2FwSGVhZGVycyA8ZW0+U29hcCBIZWFkZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhbmRsZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIG1vZHVsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIYW5kbGVyTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhhbmRsZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgSGVhZGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEhlYWRlcnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEhlYWRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0U29hcEhlYWRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgUm9sZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgUm9sZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIFJvbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRTb2FwUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldEhhbmRsZXJfUG9ydE5hbWVzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UG9ydE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEhhbmRsZXJDbGFzcyhKYXZhQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0SGFuZGxlckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhbmRsZXJDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0IFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLX0gLy8gSGFuZGxlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9Qb3J0Q29tcG9uZW50UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1BvcnRDb21wb25lbnRSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4YWU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1BvcnRDb21wb25lbnRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLSAqICAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotICogICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLSAqICAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0gKiAgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRSZWYoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydENvbXBvbmVudFJlZiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9ydC1jb21wb25lbnQtbGluayBlbGVtZW50IGxpbmtzIGEgcG9ydC1jb21wb25lbnQtcmVmIHRvIGEKLQkgKiAgICAgICAgIHNwZWNpZmljIHBvcnQtY29tcG9uZW50IHJlcXVpcmVkIHRvIGJlIG1hZGUgYXZhaWxhYmxlIGJ5IGEgc2VydmljZQotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIAotCSAqICAgICAgICAgVGhlIHZhbHVlIG9mIGEgcG9ydC1jb21wb25lbnQtbGluayBtdXN0IGJlIHRoZSBwb3J0LWNvbXBvbmVudC1uYW1lCi0JICogICAgICAgICBvZiBhIHBvcnQtY29tcG9uZW50IGluIHRoZSBzYW1lIG1vZHVsZSBvciBhbm90aGVyIG1vZHVsZSBpbiB0aGUgc2FtZQotCSAqICAgICAgICAgYXBwbGljYXRpb24gdW5pdC4gVGhlIHN5bnRheCBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXgKLQkgKiAgICAgICAgIGRlZmluZWQgZm9yIGVqYi1saW5rIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvcnRDb21wb25lbnRMaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9ydENvbXBvbmVudExpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZiNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvcnRDb21wb25lbnRMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZAotCSAqICAgICAgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKLQkgKiAgICAgICAgIFdTREwgcG9ydC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShKYXZhQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWYjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLX0gLy8gUG9ydENvbXBvbmVudFJlZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9TZXJ2aWNlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1NlcnZpY2VSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljYjg4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1NlcnZpY2VSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi0gKiAgICAgc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLSAqICAgICBpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCi0gKiAgICAgYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci0gKiAgICAgb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi0gKiAgICAgYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZAotICogICAgIGJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VJbnRlcmZhY2UgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZVJlZk5hbWUgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRQb3J0Q29tcG9uZW50UmVmcyA8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmI2dldFNlcnZpY2VRbmFtZSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlUmVmIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZQotCSAqICAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKLQkgKiAgICAgICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWVzIHN0YXJ0IHdpdGgKLQkgKiAgICAgICAgICJzZXJ2aWNlLyIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VSZWZOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VydmljZVJlZk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmTmFtZSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmljZVJlZk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VSZWZOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgRmlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAgVGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBVUkkgbG9jYXRpb24gb2YgYSBXU0RMIGZpbGUuIFRoZQotCSAqICAgICAgICAgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsRmlsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdzZGxGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V3NkbEZpbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGpheHJwYy1tYXBwaW5nLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdAotCSAqICAgICAgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAqICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi0JICogICAgICAgICBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlIGZpbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEpheHJwY01hcHBpbmdGaWxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEpheHJwY01hcHBpbmdGaWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAqICAgICAgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uCi0JICogICAgICAgICBJbiBtb3N0IGNhc2VzIHRoZSB2YWx1ZSB3aWxsIGJlIGphdmF4LnhtbC5ycGMuU2VydmljZS4gIEEgSkFYLVJQQwotCSAqICAgICAgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VJbnRlcmZhY2UoSmF2YUNsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFDbGFzcyBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlKEphdmFDbGFzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotCSAqICAgICAgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgKiAgICAgICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLQkgKiAgICAgICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQb3J0Q29tcG9uZW50UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFuZGxlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAgRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi0JICogICAgICAgICBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLQkgKiAgICAgICAgIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQKLQkgKiAgICAgICAgIHdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFNlcnZpY2VSZWZfSGFuZGxlcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRIYW5kbGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBRbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmljZSBRbmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFFuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlUW5hbWUoUU5hbWUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUU5hbWUgZ2V0U2VydmljZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYjZ2V0U2VydmljZVFuYW1lIDxlbT5TZXJ2aWNlIFFuYW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFFuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcnZpY2VRbmFtZShRTmFtZSB2YWx1ZSk7Ci0KLX0gLy8gU2VydmljZVJlZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJTZXJ2aWNlc0NsaWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJTZXJ2aWNlc0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGRhNGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2ViU2VydmljZXNDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWIgU2VydmljZXMgQ2xpZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQHZlcnNpb24gSjJFRTEuNCBkZXByZWNhdGVkCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudCNnZXRDb21wb25lbnRTY29wZWRSZWZzIDxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQjZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZ2V0V2ViU2VydmljZXNDbGllbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZXNDbGllbnQgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBTY29wZWQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZSNnZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUxpc3QgZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlI2dldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotfSAvLyBXZWJTZXJ2aWNlc0NsaWVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJTZXJ2aWNlc1Jlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYlNlcnZpY2VzUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlOThhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYlNlcnZpY2VzUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VzUmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZXsKLQlwdWJsaWMgV2ViU2VydmljZXNDbGllbnQgZ2V0V2ViU2VydmljZXNDbGllbnQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhjZDc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBSZWY8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZpY2VSZWYgY3JlYXRlU2VydmljZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9ydENvbXBvbmVudFJlZiBjcmVhdGVQb3J0Q29tcG9uZW50UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhhbmRsZXIgY3JlYXRlSGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWIgU2VydmljZXMgQ2xpZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBXZWJTZXJ2aWNlc0NsaWVudCBjcmVhdGVXZWJTZXJ2aWNlc0NsaWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgQ29tcG9uZW50U2NvcGVkUmVmcyBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBnZXRXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UoKTsKLQotfSAvL1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDBkNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gIndzY2xpZW50IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gIndlYnNlcnZpY2VfY2xpZW50LnhtaSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwgPGVtPlNlcnZpY2UgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBJbnRlcmZhY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0UgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF4cnBjIE1hcHBpbmcgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSEFORExFUlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBRbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwgPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwjZ2V0UG9ydENvbXBvbmVudFJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUYgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTksgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCA8ZW0+SGFuZGxlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIQU5ETEVSID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX0RJU1BMQVlfTkFNRVMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fTEFSR0VfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fTEFSR0VfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19IQU5ETEVSX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBSb2xlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSEFORExFUl9fU09BUF9ST0xFUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19QT1JUX05BTUVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19IQU5ETEVSX0NMQVNTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX19JTklUX1BBUkFNUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEhlYWRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhBTkRMRVJfX1NPQVBfSEVBREVSUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SGFuZGxlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIQU5ETEVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50SW1wbCA8ZW0+V2ViIFNlcnZpY2VzIENsaWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldFdlYlNlcnZpY2VzQ2xpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IFdFQl9TRVJWSUNFU19DTElFTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBTY29wZWQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFdFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgV0VCX1NFUlZJQ0VTX0NMSUVOVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFNjb3BlZFJlZnNJbXBsIDxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsI2dldENvbXBvbmVudFNjb3BlZFJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgQ09NUE9ORU5UX1NDT1BFRF9SRUZTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IENPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlMgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQ09NUE9ORU5UX1NDT1BFRF9SRUZTX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYgPGVtPlNlcnZpY2UgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2aWNlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiNnZXRTZXJ2aWNlUmVmTmFtZSA8ZW0+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+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBnZXRXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkoKTsKLQotfSAvL1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFNjb3BlZFJlZnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2OWY1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwjZ2V0Q29tcG9uZW50TmFtZSA8ZW0+Q29tcG9uZW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRTY29wZWRSZWZzSW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbXBvbmVudFNjb3BlZFJlZnMgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wb25lbnROYW1lKCkgPGVtPkNvbXBvbmVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wb25lbnROYW1lKCkgPGVtPkNvbXBvbmVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBDT01QT05FTlRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZzKCkgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VSZWZzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBDb21wb25lbnRTY29wZWRSZWZzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50TmFtZShTdHJpbmcgbmV3Q29tcG9uZW50TmFtZSkgewotCQlTdHJpbmcgb2xkQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0JCWNvbXBvbmVudE5hbWUgPSBuZXdDb21wb25lbnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19DT01QT05FTlRfTkFNRSwgb2xkQ29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKLQkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUU6Ci0JCQkJcmV0dXJuIGdldENvbXBvbmVudE5hbWUoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUU6Ci0JCQkJc2V0Q29tcG9uZW50TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FOgotCQkJCXNldENvbXBvbmVudE5hbWUoQ09NUE9ORU5UX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTOgotCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUU6Ci0JCQkJcmV0dXJuIENPTVBPTkVOVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBjb21wb25lbnROYW1lICE9IG51bGwgOiAhQ09NUE9ORU5UX05BTUVfRURFRkFVTFQuZXF1YWxzKGNvbXBvbmVudE5hbWUpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbXBvbmVudE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbXBvbmVudE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db21wb25lbnRTY29wZWRSZWZzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4OWFkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldFNvYXBSb2xlcyA8ZW0+U29hcCBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldFBvcnROYW1lcyA8ZW0+UG9ydCBOYW1lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuSGFuZGxlckltcGwjZ2V0U29hcEhlYWRlcnMgPGVtPlNvYXAgSGVhZGVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsIGltcGxlbWVudHMgSGFuZGxlciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJOYW1lKCkgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyTmFtZSgpIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZXJOYW1lID0gSEFORExFUl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcFJvbGVzKCkgPGVtPlNvYXAgUm9sZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U29hcFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc29hcFJvbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lcygpIDxlbT5Qb3J0IE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnROYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvcnROYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyQ2xhc3MoKSA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGhhbmRsZXJDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0UGFyYW1zKCkgPGVtPkluaXQgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBIZWFkZXJzKCkgPGVtPlNvYXAgSGVhZGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwSGVhZGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHNvYXBIZWFkZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYW5kbGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKSB7Ci0JCXJldHVybiBoYW5kbGVyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTmFtZShTdHJpbmcgbmV3SGFuZGxlck5hbWUpIHsKLQkJU3RyaW5nIG9sZEhhbmRsZXJOYW1lID0gaGFuZGxlck5hbWU7Ci0JCWhhbmRsZXJOYW1lID0gbmV3SGFuZGxlck5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUUsIG9sZEhhbmRsZXJOYW1lLCBoYW5kbGVyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRTb2FwSGVhZGVycygpIHsKLQkJaWYgKHNvYXBIZWFkZXJzID09IG51bGwpIHsKLQkJCXNvYXBIZWFkZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFFOYW1lLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTKTsKLQkJfQotCQlyZXR1cm4gc29hcEhlYWRlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFNvYXBSb2xlcygpIHsKLQkJaWYgKHNvYXBSb2xlcyA9PSBudWxsKSB7Ci0JCQlzb2FwUm9sZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHNvYXBSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UG9ydE5hbWVzKCkgewotCQlpZiAocG9ydE5hbWVzID09IG51bGwpIHsKLQkJCXBvcnROYW1lcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gcG9ydE5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SGFuZGxlckNsYXNzKCkgewotCQlpZiAoaGFuZGxlckNsYXNzICE9IG51bGwgJiYgaGFuZGxlckNsYXNzLmVJc1Byb3h5KCkpIHsKLQkJCUphdmFDbGFzcyBvbGRIYW5kbGVyQ2xhc3MgPSBoYW5kbGVyQ2xhc3M7Ci0JCQloYW5kbGVyQ2xhc3MgPSAoSmF2YUNsYXNzKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCloYW5kbGVyQ2xhc3MpOwotCQkJaWYgKGhhbmRsZXJDbGFzcyAhPSBvbGRIYW5kbGVyQ2xhc3MpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUywgb2xkSGFuZGxlckNsYXNzLCBoYW5kbGVyQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlckNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXRIYW5kbGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBoYW5kbGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzKEphdmFDbGFzcyBuZXdIYW5kbGVyQ2xhc3MpIHsKLQkJSmF2YUNsYXNzIG9sZEhhbmRsZXJDbGFzcyA9IGhhbmRsZXJDbGFzczsKLQkJaGFuZGxlckNsYXNzID0gbmV3SGFuZGxlckNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUywgb2xkSGFuZGxlckNsYXNzLCBoYW5kbGVyQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbVZhbHVlLmNsYXNzLCB0aGlzLCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVMpOwotCQl9Ci0JCXJldHVybiBpbml0UGFyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNvYXBIZWFkZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXJldHVybiBnZXRIYW5kbGVyTmFtZSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlyZXR1cm4gZ2V0U29hcFJvbGVzKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCXJldHVybiBnZXRQb3J0TmFtZXMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRIYW5kbGVyQ2xhc3MoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRIYW5kbGVyQ2xhc3MoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIGdldFNvYXBIZWFkZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUU6Ci0JCQkJc2V0SGFuZGxlck5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlnZXRTb2FwUm9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fUE9SVF9OQU1FUzoKLQkJCQlnZXRQb3J0TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldFBvcnROYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlzZXRIYW5kbGVyQ2xhc3MoKEphdmFDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTOgotCQkJCWdldFNvYXBIZWFkZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTb2FwSGVhZGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0lDT05TOgotCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oU01BTExfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZShESVNQTEFZX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlzZXRIYW5kbGVyTmFtZShIQU5ETEVSX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJZ2V0U29hcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCWdldFBvcnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlzZXRIYW5kbGVyQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJZ2V0U29hcEhlYWRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlyZXR1cm4gSEFORExFUl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBoYW5kbGVyTmFtZSAhPSBudWxsIDogIUhBTkRMRVJfTkFNRV9FREVGQVVMVC5lcXVhbHMoaGFuZGxlck5hbWUpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlyZXR1cm4gc29hcFJvbGVzICE9IG51bGwgJiYgIXNvYXBSb2xlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19QT1JUX05BTUVTOgotCQkJCXJldHVybiBwb3J0TmFtZXMgIT0gbnVsbCAmJiAhcG9ydE5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGhhbmRsZXJDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuIGluaXRQYXJhbXMgIT0gbnVsbCAmJiAhaW5pdFBhcmFtcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIHNvYXBIZWFkZXJzICE9IG51bGwgJiYgIXNvYXBIZWFkZXJzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGhhbmRsZXJOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoYW5kbGVyTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcFJvbGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzb2FwUm9sZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9ydE5hbWVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSGFuZGxlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50UmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmJmZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbCNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0Q29tcG9uZW50UmVmSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUG9ydENvbXBvbmVudFJlZiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRMaW5rKCkgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRMaW5rKCkgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rID0gUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydENvbXBvbmVudFJlZkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWYoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRDb21wb25lbnRMaW5rKCkgewotCQlyZXR1cm4gcG9ydENvbXBvbmVudExpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9ydENvbXBvbmVudExpbmsoU3RyaW5nIG5ld1BvcnRDb21wb25lbnRMaW5rKSB7Ci0JCVN0cmluZyBvbGRQb3J0Q29tcG9uZW50TGluayA9IHBvcnRDb21wb25lbnRMaW5rOwotCQlwb3J0Q29tcG9uZW50TGluayA9IG5ld1BvcnRDb21wb25lbnRMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LLCBvbGRQb3J0Q29tcG9uZW50TGluaywgcG9ydENvbXBvbmVudExpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJaWYgKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBudWxsICYmIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5lSXNQcm94eSgpKSB7Ci0JCQlKYXZhQ2xhc3Mgb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCWlmIChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgIT0gb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShKYXZhQ2xhc3MgbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCUphdmFDbGFzcyBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgotCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50TGluaygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKLQkJCQlzZXRQb3J0Q29tcG9uZW50TGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgotCQkJCXNldFBvcnRDb21wb25lbnRMaW5rKFBPUlRfQ09NUE9ORU5UX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKChKYXZhQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6Ci0JCQkJcmV0dXJuIFBPUlRfQ09NUE9ORU5UX0xJTktfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnRDb21wb25lbnRMaW5rICE9IG51bGwgOiAhUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVC5lcXVhbHMocG9ydENvbXBvbmVudExpbmspOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwb3J0Q29tcG9uZW50TGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9ydENvbXBvbmVudExpbmspOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qb3J0Q29tcG9uZW50UmVmSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhODFlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRTZXJ2aWNlUmVmTmFtZSA8ZW0+U2VydmljZSBSZWYgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFdzZGxGaWxlIDxlbT5Xc2RsIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldFBvcnRDb21wb25lbnRSZWZzIDxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0U2VydmljZVFuYW1lIDxlbT5TZXJ2aWNlIFFuYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVmIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHNlcnZpY2VJbnRlcmZhY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZOYW1lKCkgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1JFRl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZOYW1lKCkgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VSZWZOYW1lID0gU0VSVklDRV9SRUZfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZSgpIDxlbT5Xc2RsIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbEZpbGUoKSA8ZW0+V3NkbCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3c2RsRmlsZSA9IFdTRExfRklMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqYXhycGNNYXBwaW5nRmlsZSA9IEpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50UmVmcygpIDxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9ydENvbXBvbmVudFJlZnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlcnMoKSA8ZW0+SGFuZGxlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBoYW5kbGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUW5hbWUoKSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUU5hbWUgc2VydmljZVFuYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVJlZk5hbWUoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUmVmTmFtZShTdHJpbmcgbmV3U2VydmljZVJlZk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VSZWZOYW1lID0gc2VydmljZVJlZk5hbWU7Ci0JCXNlcnZpY2VSZWZOYW1lID0gbmV3U2VydmljZVJlZk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRSwgb2xkU2VydmljZVJlZk5hbWUsIHNlcnZpY2VSZWZOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXc2RsRmlsZSgpIHsKLQkJcmV0dXJuIHdzZGxGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdzZGxGaWxlKFN0cmluZyBuZXdXc2RsRmlsZSkgewotCQlTdHJpbmcgb2xkV3NkbEZpbGUgPSB3c2RsRmlsZTsKLQkJd3NkbEZpbGUgPSBuZXdXc2RsRmlsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUsIG9sZFdzZGxGaWxlLCB3c2RsRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKSB7Ci0JCXJldHVybiBqYXhycGNNYXBwaW5nRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcgbmV3SmF4cnBjTWFwcGluZ0ZpbGUpIHsKLQkJU3RyaW5nIG9sZEpheHJwY01hcHBpbmdGaWxlID0gamF4cnBjTWFwcGluZ0ZpbGU7Ci0JCWpheHJwY01hcHBpbmdGaWxlID0gbmV3SmF4cnBjTWFwcGluZ0ZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRSwgb2xkSmF4cnBjTWFwcGluZ0ZpbGUsIGpheHJwY01hcHBpbmdGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRTZXJ2aWNlSW50ZXJmYWNlKCkgewotCQlpZiAoc2VydmljZUludGVyZmFjZSAhPSBudWxsICYmIHNlcnZpY2VJbnRlcmZhY2UuZUlzUHJveHkoKSkgewotCQkJSmF2YUNsYXNzIG9sZFNlcnZpY2VJbnRlcmZhY2UgPSBzZXJ2aWNlSW50ZXJmYWNlOwotCQkJc2VydmljZUludGVyZmFjZSA9IChKYXZhQ2xhc3MpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VJbnRlcmZhY2UpOwotCQkJaWYgKHNlcnZpY2VJbnRlcmZhY2UgIT0gb2xkU2VydmljZUludGVyZmFjZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VJbnRlcmZhY2UsIHNlcnZpY2VJbnRlcmZhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmljZUludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGJhc2ljR2V0U2VydmljZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUludGVyZmFjZShKYXZhQ2xhc3MgbmV3U2VydmljZUludGVyZmFjZSkgewotCQlKYXZhQ2xhc3Mgb2xkU2VydmljZUludGVyZmFjZSA9IHNlcnZpY2VJbnRlcmZhY2U7Ci0JCXNlcnZpY2VJbnRlcmZhY2UgPSBuZXdTZXJ2aWNlSW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFLCBvbGRTZXJ2aWNlSW50ZXJmYWNlLCBzZXJ2aWNlSW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFBvcnRDb21wb25lbnRSZWZzKCkgewotCQlpZiAocG9ydENvbXBvbmVudFJlZnMgPT0gbnVsbCkgewotCQkJcG9ydENvbXBvbmVudFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUG9ydENvbXBvbmVudFJlZi5jbGFzcywgdGhpcywgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTKTsKLQkJfQotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEhhbmRsZXJzKCkgewotCQlpZiAoaGFuZGxlcnMgPT0gbnVsbCkgewotCQkJaGFuZGxlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSGFuZGxlci5jbGFzcywgdGhpcywgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlUW5hbWUoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUW5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VydmljZVFuYW1lKFFOYW1lIG5ld1NlcnZpY2VRbmFtZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlRTmFtZSBvbGRTZXJ2aWNlUW5hbWUgPSBzZXJ2aWNlUW5hbWU7Ci0JCXNlcnZpY2VRbmFtZSA9IG5ld1NlcnZpY2VRbmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FLCBvbGRTZXJ2aWNlUW5hbWUsIG5ld1NlcnZpY2VRbmFtZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVFuYW1lKFFOYW1lIG5ld1NlcnZpY2VRbmFtZSkgewotCQlpZiAobmV3U2VydmljZVFuYW1lICE9IHNlcnZpY2VRbmFtZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VydmljZVFuYW1lICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VRbmFtZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U2VydmljZVFuYW1lICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlcnZpY2VRbmFtZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZXJ2aWNlUW5hbWUobmV3U2VydmljZVFuYW1lLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSwgbmV3U2VydmljZVFuYW1lLCBuZXdTZXJ2aWNlUW5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvcnRDb21wb25lbnRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SGFuZGxlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRTZXJ2aWNlUW5hbWUobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmljZUludGVyZmFjZSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VSZWZOYW1lKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFOgotCQkJCXJldHVybiBnZXRXc2RsRmlsZSgpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEpheHJwY01hcHBpbmdGaWxlKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudFJlZnMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gZ2V0SGFuZGxlcnMoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUW5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUludGVyZmFjZSgoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRToKLQkJCQlzZXRTZXJ2aWNlUmVmTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFOgotCQkJCXNldFdzZGxGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXNldEpheHJwY01hcHBpbmdGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCWdldFBvcnRDb21wb25lbnRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0Q29tcG9uZW50UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRIYW5kbGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUU6Ci0JCQkJc2V0U2VydmljZVFuYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUludGVyZmFjZSgoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FOgotCQkJCXNldFNlcnZpY2VSZWZOYW1lKFNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJc2V0V3NkbEZpbGUoV1NETF9GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlzZXRKYXhycGNNYXBwaW5nRmlsZShKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlnZXRQb3J0Q29tcG9uZW50UmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRToKLQkJCQlzZXRTZXJ2aWNlUW5hbWUoKFFOYW1lKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0lDT05TOgotCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBTTUFMTF9JQ09OX0VERUZBVUxUID09IG51bGwgPyBzbWFsbEljb24gIT0gbnVsbCA6ICFTTUFMTF9JQ09OX0VERUZBVUxULmVxdWFscyhzbWFsbEljb24pOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIExBUkdFX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IGxhcmdlSWNvbiAhPSBudWxsIDogIUxBUkdFX0lDT05fRURFRkFVTFQuZXF1YWxzKGxhcmdlSWNvbik7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBESVNQTEFZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc3BsYXlOYW1lICE9IG51bGwgOiAhRElTUExBWV9OQU1FX0VERUZBVUxULmVxdWFscyhkaXNwbGF5TmFtZSk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2UgIT0gbnVsbDsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FOgotCQkJCXJldHVybiBTRVJWSUNFX1JFRl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlUmVmTmFtZSAhPSBudWxsIDogIVNFUlZJQ0VfUkVGX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VSZWZOYW1lKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEU6Ci0JCQkJcmV0dXJuIFdTRExfRklMRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbEZpbGUgIT0gbnVsbCA6ICFXU0RMX0ZJTEVfRURFRkFVTFQuZXF1YWxzKHdzZGxGaWxlKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFOgotCQkJCXJldHVybiBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUID09IG51bGwgPyBqYXhycGNNYXBwaW5nRmlsZSAhPSBudWxsIDogIUpBWFJQQ19NQVBQSU5HX0ZJTEVfRURFRkFVTFQuZXF1YWxzKGpheHJwY01hcHBpbmdGaWxlKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgotCQkJCXJldHVybiBwb3J0Q29tcG9uZW50UmVmcyAhPSBudWxsICYmICFwb3J0Q29tcG9uZW50UmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGhhbmRsZXJzICE9IG51bGwgJiYgIWhhbmRsZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXJldHVybiBzZXJ2aWNlUW5hbWUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZpY2VSZWZOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlUmVmTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbEZpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXhycGNNYXBwaW5nRmlsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF4cnBjTWFwcGluZ0ZpbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlUmVmSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzQ2xpZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzQ2xpZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU3NGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudEltcGwjZ2V0Q29tcG9uZW50U2NvcGVkUmVmcyA8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRJbXBsI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0NsaWVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VzQ2xpZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wb25lbnRTY29wZWRSZWZzKCkgPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnRTY29wZWRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3QgY29tcG9uZW50U2NvcGVkUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgV2ViU2VydmljZXNDbGllbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFTGlzdCBnZXRDb21wb25lbnRTY29wZWRSZWZzKCkgewotCQlpZiAoY29tcG9uZW50U2NvcGVkUmVmcyA9PSBudWxsKSB7Ci0JCQljb21wb25lbnRTY29wZWRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENvbXBvbmVudFNjb3BlZFJlZnMuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlMpOwotCQl9Ci0JCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKLQkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlMpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlUmVmczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUzoKLQkJCQlyZXR1cm4gZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUzoKLQkJCQlnZXRDb21wb25lbnRTY29wZWRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb21wb25lbnRTY29wZWRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTOgotCQkJCWdldENvbXBvbmVudFNjb3BlZFJlZnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUzoKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlM6Ci0JCQkJcmV0dXJuIGNvbXBvbmVudFNjb3BlZFJlZnMgIT0gbnVsbCAmJiAhY29tcG9uZW50U2NvcGVkUmVmcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vV2ViU2VydmljZXNDbGllbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzNjOWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnhtbC5KMkVFWG1sRHRERW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5Ci0gICAgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IHsKLQkJLyoqCi0JCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEdGRzKCkgewotCQkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TWVNURU1JRF8xXzAsICJqMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8wLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0JCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NDSEVNQV9MT0NfMV8xLCAiajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGFSZW5kZXJlckZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBXZWJTZXJ2aWNlc1Jlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7Ci0JfQotCSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgYVJlZ2lzdHJ5KSB7Ci0JCQlhUmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NIT1JUTkFNRSwgbmV3IFdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQkgIH0KLSAgICAKLQkvKioKLQkgKiBSZWdpc3RlciBteXNlbGYgd2l0aCB0aGUgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TSE9SVE5BTUUsIG5ldyBXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JfQotCQotCS8qKgotCSAqIHJlZ2lzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IHJlbmRlcmVyIGZhY3RvcnkuCi0JICogQHNlZSAjcmVnaXN0ZXJXaXRoKFJlbmRlcmVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0JCXJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfRERfVVJJX09CSik7Ci0JfQotICAgIAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc1Jlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTIyZGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc1Jlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgV2ViU2VydmljZXNSZXNvdXJjZSB7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIGFSZW5kZXJlcgotICAgICAqLwotICAgIHB1YmxpYyBXZWJTZXJ2aWNlc1Jlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLSAgICAgICAgc3VwZXIodXJpLCBhUmVuZGVyZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhUmVuZGVyZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZXNSZXNvdXJjZUltcGwoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyKGFSZW5kZXJlcik7Ci0gICAgfQotCi0JCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzQ2xpZW50IGdldFdlYlNlcnZpY2VzQ2xpZW50KCkgewotCQlyZXR1cm4gKFdlYlNlcnZpY2VzQ2xpZW50KSBnZXRSb290T2JqZWN0KCk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFdFQl9TRVJWSUNFU19DTElFTlRfVFlQRTsKLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NZU1RFTUlEXzFfMDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9TWVNURU1JRF8xXzA7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9QVUJMSUNJRF8xXzA7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7Ci0JCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfUFVCTElDSURfMV8wOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIHsKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQljYXNlIChKMkVFXzFfM19JRCkgOgkKLQkJCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX0RPQ1RZUEU7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNzZXREb2N0eXBlVmFsdWVzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICogVGhpcyBpcyBzZXR0aW5nIHRoZSBtb2R1bGUgdmVyc2lvbiBvbiB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlpbnQgdmVyc2lvbiA9IFdFQlNFUlZJQ0VTXzFfMF9JRDsKLQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlzdXBlci5zZXRWZXJzaW9uSUQodmVyc2lvbik7Ci0JfQotCQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCQkJY2FzZSAoV0VCU0VSVklDRVNfMV8wX0lEKSA6Ci0JCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JfQotCS8qCi0JICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgewotCXN3aXRjaCAoaWQpIHsKLQkJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0JCQkJCXByaW1TZXRWZXJzaW9uSUQoV0VCU0VSVklDRVNfMV8wX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCWNhc2UgKEoyRUVfMV8yX0lEKSA6Ci0JCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8yX1B1YmxpY0lEKCksIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpOwotCQkJCQlwcmltU2V0VmVyc2lvbklEKFdFQlNFUlZJQ0VTXzFfMF9JRCk7Ci0JCQl9Ci0JCXN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCk7Ci0JfQotCS8qIFJldHVybiBKMkVFIHZlcnNpb24gYmFzZWQgb24gbW9kdWxlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8wX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXRSb290VHJhbnNsYXRvcigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlc1RyYW5zbGF0b3IuSU5TVEFOQ0U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIFdFQlNFUlZJQ0VTXzFfMF9JRDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKLQkJLy9ub3QgbW9kZWwgZm9yIEoyRUUgMS40IHNvIG5vIG9wZXJhdGlvbiByZXF1aXJlZC4KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NiYzY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUY6IHJldHVybiBjcmVhdGVTZXJ2aWNlUmVmKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUY6IHJldHVybiBjcmVhdGVQb3J0Q29tcG9uZW50UmVmKCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSOiByZXR1cm4gY3JlYXRlSGFuZGxlcigpOwotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVDogcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlM6IHJldHVybiBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZiBjcmVhdGVTZXJ2aWNlUmVmKCkgewotCQlTZXJ2aWNlUmVmSW1wbCBzZXJ2aWNlUmVmID0gbmV3IFNlcnZpY2VSZWZJbXBsKCk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0Q29tcG9uZW50UmVmIGNyZWF0ZVBvcnRDb21wb25lbnRSZWYoKSB7Ci0JCVBvcnRDb21wb25lbnRSZWZJbXBsIHBvcnRDb21wb25lbnRSZWYgPSBuZXcgUG9ydENvbXBvbmVudFJlZkltcGwoKTsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnRSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXIgY3JlYXRlSGFuZGxlcigpIHsKLQkJSGFuZGxlckltcGwgaGFuZGxlciA9IG5ldyBIYW5kbGVySW1wbCgpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZXNDbGllbnQgY3JlYXRlV2ViU2VydmljZXNDbGllbnQoKSB7Ci0JCVdlYlNlcnZpY2VzQ2xpZW50SW1wbCB3ZWJTZXJ2aWNlc0NsaWVudCA9IG5ldyBXZWJTZXJ2aWNlc0NsaWVudEltcGwoKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VzQ2xpZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBDb21wb25lbnRTY29wZWRSZWZzIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnMoKSB7Ci0JCUNvbXBvbmVudFNjb3BlZFJlZnNJbXBsIGNvbXBvbmVudFNjb3BlZFJlZnMgPSBuZXcgQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwoKTsKLQkJcmV0dXJuIGNvbXBvbmVudFNjb3BlZFJlZnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBnZXRXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0OWI1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRWNvcmVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlcnZpY2VSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9ydENvbXBvbmVudFJlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBoYW5kbGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgRUNsYXNzIHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgRUNsYXNzIGNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0JCUphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlcnZpY2VSZWYoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb3J0Q29tcG9uZW50UmVmKCkgewotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX1BvcnRDb21wb25lbnRMaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SGFuZGxlcigpIHsKLQkJcmV0dXJuIGhhbmRsZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJfU29hcFJvbGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJfUG9ydE5hbWVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaGFuZGxlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEhhbmRsZXJfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFdlYlNlcnZpY2VzQ2xpZW50KCkgewotCQlyZXR1cm4gd2ViU2VydmljZXNDbGllbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcG9uZW50U2NvcGVkUmVmc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBnZXRXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoV2Vic2VydmljZV9jbGllbnRGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXNlcnZpY2VSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVklDRV9SRUYpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX1NFUlZJQ0VfUkVGX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0hBTkRMRVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSk7Ci0KLQkJcG9ydENvbXBvbmVudFJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUX0NPTVBPTkVOVF9SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSk7Ci0KLQkJaGFuZGxlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIQU5ETEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19IQU5ETEVSX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX1NPQVBfUk9MRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX1BPUlRfTkFNRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX0lOSVRfUEFSQU1TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShoYW5kbGVyRUNsYXNzLCBIQU5ETEVSX19TT0FQX0hFQURFUlMpOwotCi0JCXdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9TRVJWSUNFU19DTElFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLCBXRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLCBXRUJfU0VSVklDRVNfQ0xJRU5UX19TRVJWSUNFX1JFRlMpOwotCi0JCWNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9ORU5UX1NDT1BFRF9SRUZTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLCBDT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLCBDT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJaGFuZGxlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3Moc2VydmljZVJlZkVDbGFzcywgU2VydmljZVJlZi5jbGFzcywgIlNlcnZpY2VSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInNlcnZpY2VJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlUmVmTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxGaWxlIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF4cnBjTWFwcGluZ0ZpbGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCksIHRoaXMuZ2V0UG9ydENvbXBvbmVudFJlZigpLCBudWxsLCAicG9ydENvbXBvbmVudFJlZnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9IYW5kbGVycygpLCB0aGlzLmdldEhhbmRsZXIoKSwgbnVsbCwgImhhbmRsZXJzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSwgbnVsbCwgInNlcnZpY2VRbmFtZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAiUG9ydENvbXBvbmVudFJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydENvbXBvbmVudExpbmsiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDEsIDEsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhoYW5kbGVyRUNsYXNzLCBIYW5kbGVyLmNsYXNzLCAiSGFuZGxlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaGFuZGxlck5hbWUiLCBudWxsLCAwLCAxLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyX1NvYXBSb2xlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic29hcFJvbGVzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfUG9ydE5hbWVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3J0TmFtZXMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJoYW5kbGVyQ2xhc3MiLCBudWxsLCAxLCAxLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX0luaXRQYXJhbXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpLCBudWxsLCAic29hcEhlYWRlcnMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIldlYlNlcnZpY2VzQ2xpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCksIHRoaXMuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLCBudWxsLCAiY29tcG9uZW50U2NvcGVkUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MsIENvbXBvbmVudFNjb3BlZFJlZnMuY2xhc3MsICJDb21wb25lbnRTY29wZWRSZWZzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbXBvbmVudE5hbWUiLCBudWxsLCAwLCAxLCBDb21wb25lbnRTY29wZWRSZWZzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCksIHRoaXMuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAxLCAtMSwgQ29tcG9uZW50U2NvcGVkUmVmcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC91dGlsL1dlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvdXRpbC9XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTdhOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC91dGlsL1dlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vic2VydmljZV9jbGllbnRTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgV2Vic2VydmljZV9jbGllbnRTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyKEhhbmRsZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJTZXJ2aWNlc0NsaWVudChXZWJTZXJ2aWNlc0NsaWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViU2VydmljZXNDbGllbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRTY29wZWRSZWZzKENvbXBvbmVudFNjb3BlZFJlZnMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIDxlbT5TZXJ2aWNlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmIDxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlciA8ZW0+SGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudCA8ZW0+V2ViIFNlcnZpY2VzIENsaWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMgPGVtPkNvbXBvbmVudCBTY29wZWQgUmVmczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC91dGlsL1dlYnNlcnZpY2VfY2xpZW50U3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL3V0aWwvV2Vic2VydmljZV9jbGllbnRTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxMDM1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL3V0aWwvV2Vic2VydmljZV9jbGllbnRTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJzZXJ2aWNlX2NsaWVudFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRjogewotCQkJCVNlcnZpY2VSZWYgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmKHNlcnZpY2VSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHNlcnZpY2VSZWYpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoc2VydmljZVJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGOiB7Ci0JCQkJUG9ydENvbXBvbmVudFJlZiBwb3J0Q29tcG9uZW50UmVmID0gKFBvcnRDb21wb25lbnRSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBvcnRDb21wb25lbnRSZWYocG9ydENvbXBvbmVudFJlZik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUjogewotCQkJCUhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIYW5kbGVyKGhhbmRsZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKGhhbmRsZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uR3JvdXAoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVDogewotCQkJCVdlYlNlcnZpY2VzQ2xpZW50IHdlYlNlcnZpY2VzQ2xpZW50ID0gKFdlYlNlcnZpY2VzQ2xpZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJTZXJ2aWNlc0NsaWVudCh3ZWJTZXJ2aWNlc0NsaWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTOiB7Ci0JCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBjb21wb25lbnRTY29wZWRSZWZzID0gKENvbXBvbmVudFNjb3BlZFJlZnMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbXBvbmVudFNjb3BlZFJlZnMoY29tcG9uZW50U2NvcGVkUmVmcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhhbmRsZXIoSGFuZGxlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlcyBDbGllbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIFNlcnZpY2VzIENsaWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZXNDbGllbnQoV2ViU2VydmljZXNDbGllbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb25lbnQgU2NvcGVkIFJlZnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9uZW50IFNjb3BlZCBSZWZzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRTY29wZWRSZWZzKENvbXBvbmVudFNjb3BlZFJlZnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV2Vic2VydmljZV9jbGllbnRTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjM3ZTBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgd2ViIHNlcnZpY2VzIGNsaWVudCBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBhcnRpZmFjdHMgb2YgYSB3ZWIgc2VydmljZXMgY2xpZW50Ci0gICAgICAgIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZC4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGVzY3JpcHRpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0Rlc2NyaXB0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2EyYzVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGVzY3JpcHRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb24gVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSNnZXREZXNjcmlwdGlvblR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRpb25UeXBlIGV4dGVuZHMgRGVzY3JpcHRpb257Ci0vLyBEZXNjcmlwdGlvblR5cGUKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGlzcGxheU5hbWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0Rpc3BsYXlOYW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjhkZGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vRGlzcGxheU5hbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzcGxheSBOYW1lIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0RGlzcGxheU5hbWVUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlOYW1lVHlwZSBleHRlbmRzIERpc3BsYXlOYW1lewotLy8gRGlzcGxheU5hbWVUeXBlCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0luaXRQYXJhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Jbml0UGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NmVhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL0luaXRQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Jbml0IFBhcmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0RGVzY3JpcHRpb25UeXBlcyA8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldEluaXRQYXJhbSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbml0UGFyYW0gZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW0gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJhbU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UGFyYW1OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXRQYXJhbU5hbWUgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJhbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJhbVZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldEluaXRQYXJhbV9QYXJhbVZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRQYXJhbVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXRQYXJhbVZhbHVlIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0RGVzY3JpcHRpb25UeXBlcygpOwotCi19IC8vIEluaXRQYXJhbQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Qb3J0TmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Qb3J0TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGVjZDczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vUG9ydE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldFBvcnROYW1lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvcnROYW1lIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9ydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0UG9ydE5hbWVfUG9ydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQb3J0TmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9TT0FQSGVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1NPQVBIZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkNDc5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1NPQVBIZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TT0FQIEhlYWRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgaGFuZGxlci4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldFNPQVBIZWFkZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEhlYWRlciBleHRlbmRzIFFOYW1lewotLy8gU09BUEhlYWRlcgotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9TT0FQUm9sZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9TT0FQUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWVhN2ZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vU09BUFJvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNPQVAgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlI2dldFNvYXBSb2xlIDxlbT5Tb2FwIFJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlI2dldFNPQVBSb2xlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBSb2xlIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBSb2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgUm9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U29hcFJvbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZ2V0U09BUFJvbGVfU29hcFJvbGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFNvYXBSb2xlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlI2dldFNvYXBSb2xlIDxlbT5Tb2FwIFJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIFJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNvYXBSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U29hcFJvbGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTT0FQUm9sZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Xc2NvbW1vbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vV3Njb21tb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGExMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Xc2NvbW1vbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3Njb21tb25GYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzY29tbW9uRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5pdCBQYXJhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluaXQgUGFyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBJbml0UGFyYW0gY3JlYXRlSW5pdFBhcmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U09BUCBIZWFkZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTT0FQSGVhZGVyIGNyZWF0ZVNPQVBIZWFkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U09BUCBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U09BUCBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU09BUFJvbGUgY3JlYXRlU09BUFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgUG9ydE5hbWUgY3JlYXRlUG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBEZXNjcmlwdGlvblR5cGUgY3JlYXRlRGVzY3JpcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBEaXNwbGF5TmFtZVR5cGUgY3JlYXRlRGlzcGxheU5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV3Njb21tb25QYWNrYWdlIGdldFdzY29tbW9uUGFja2FnZSgpOwotCi19IC8vV3Njb21tb25GYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1dzY29tbW9uUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9Xc2NvbW1vblBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwYjIyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL1dzY29tbW9uUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3Njb21tb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBlTkFNRSA9ICJ3c2NvbW1vbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBlTlNfVVJJID0gIndzY29tbW9uLnhtaSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV3Njb21tb25QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwgPGVtPkluaXQgUGFyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldEluaXRQYXJhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgSU5JVF9QQVJBTSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IElOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IElOSVRfUEFSQU1fX0RFU0NSSVBUSU9OX1RZUEVTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW5pdCBQYXJhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IElOSVRfUEFSQU1fRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbCA8ZW0+U09BUCBIZWFkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXRTT0FQSGVhZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBTT0FQX0hFQURFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNPQVBfSEVBREVSX19MT0NBTF9QQVJUID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9IRUFERVJfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU09BUF9IRUFERVJfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5TT0FQIEhlYWRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNPQVBfSEVBREVSX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuU09BUFJvbGVJbXBsIDxlbT5TT0FQIFJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBSb2xlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGwjZ2V0U09BUFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFNPQVBfUk9MRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBSb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTT0FQX1JPTEVfX1NPQVBfUk9MRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNPQVAgUm9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNPQVBfUk9MRV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlBvcnROYW1lSW1wbCA8ZW0+UG9ydCBOYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Qb3J0TmFtZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBQT1JUX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9OQU1FX19QT1JUX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX05BTUVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvblR5cGVJbXBsIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvblR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IERFU0NSSVBUSU9OX1RZUEUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IERFU0NSSVBUSU9OX1RZUEVfX0xBTkcgPSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBERVNDUklQVElPTl9UWVBFX19WQUxVRSA9IENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgREVTQ1JJUFRJT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkRpc3BsYXlOYW1lVHlwZUltcGwgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5EaXNwbGF5TmFtZVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGwuV3Njb21tb25QYWNrYWdlSW1wbCNnZXREaXNwbGF5TmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IERJU1BMQVlfTkFNRV9UWVBFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBESVNQTEFZX05BTUVfVFlQRV9fTEFORyA9IENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBESVNQTEFZX05BTUVfVFlQRV9fVkFMVUUgPSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRElTUExBWV9OQU1FX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSA8ZW0+SW5pdCBQYXJhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5pdCBQYXJhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0SW5pdFBhcmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJhbSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1OYW1lKCkKLQkgKiBAc2VlICNnZXRJbml0UGFyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldFBhcmFtVmFsdWUgPGVtPlBhcmFtIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0UGFyYW1WYWx1ZSgpCi0JICogQHNlZSAjZ2V0SW5pdFBhcmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX1BhcmFtVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0jZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldEluaXRQYXJhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEluaXRQYXJhbV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtI2dldERlc2NyaXB0aW9uVHlwZXMgPGVtPkRlc2NyaXB0aW9uIFR5cGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbSNnZXREZXNjcmlwdGlvblR5cGVzKCkKLQkgKiBAc2VlICNnZXRJbml0UGFyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyIDxlbT5TT0FQIEhlYWRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U09BUCBIZWFkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRTT0FQSGVhZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlIDxlbT5TT0FQIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNPQVAgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRTT0FQUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlI2dldFNvYXBSb2xlIDxlbT5Tb2FwIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZSNnZXRTb2FwUm9sZSgpCi0JICogQHNlZSAjZ2V0U09BUFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTT0FQUm9sZV9Tb2FwUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3J0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0UG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWUjZ2V0UG9ydE5hbWUoKQotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydE5hbWVfUG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXREZXNjcmlwdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldERpc3BsYXlOYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXc2NvbW1vbkZhY3RvcnkgZ2V0V3Njb21tb25GYWN0b3J5KCk7Ci0KLX0gLy9Xc2NvbW1vblBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvblR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDllMTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvblR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5EZXNjcmlwdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblR5cGVJbXBsIGV4dGVuZHMgRGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVzY3JpcHRpb25UeXBlCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRGVzY3JpcHRpb25UeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX1RZUEVfX0xBTkc6Ci0JCQkJcmV0dXJuIGdldExhbmcoKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fVFlQRV9fTEFORzoKLQkJCQlzZXRMYW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX1RZUEVfX0xBTkc6Ci0JCQkJc2V0TGFuZyhMQU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9UWVBFX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX1RZUEVfX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvblR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNjgyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuRGlzcGxheU5hbWVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNwbGF5IE5hbWUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlOYW1lVHlwZUltcGwgZXh0ZW5kcyBEaXNwbGF5TmFtZUltcGwgaW1wbGVtZW50cyBEaXNwbGF5TmFtZVR5cGUKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBEaXNwbGF5TmFtZVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldERpc3BsYXlOYW1lVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX1RZUEVfX0xBTkc6Ci0JCQkJcmV0dXJuIGdldExhbmcoKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9UWVBFX19MQU5HOgotCQkJCXNldExhbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9UWVBFX19MQU5HOgotCQkJCXNldExhbmcoTEFOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX1RZUEVfX0xBTkc6Ci0JCQkJcmV0dXJuIExBTkdfRURFRkFVTFQgPT0gbnVsbCA/IGxhbmcgIT0gbnVsbCA6ICFMQU5HX0VERUZBVUxULmVxdWFscyhsYW5nKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vRGlzcGxheU5hbWVUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0luaXRQYXJhbUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2FjNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0luaXRQYXJhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluaXQgUGFyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Jbml0UGFyYW1JbXBsI2dldFBhcmFtTmFtZSA8ZW0+UGFyYW0gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwjZ2V0UGFyYW1WYWx1ZSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Jbml0UGFyYW1JbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLkluaXRQYXJhbUltcGwjZ2V0RGVzY3JpcHRpb25UeXBlcyA8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyYW1JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbml0UGFyYW0KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1OYW1lKCkgPGVtPlBhcmFtIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtTmFtZSgpIDxlbT5QYXJhbSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbU5hbWUgPSBQQVJBTV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtVmFsdWUoKSA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1WYWx1ZSgpIDxlbT5QYXJhbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtVmFsdWUgPSBQQVJBTV9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uVHlwZXMoKSA8ZW0+RGVzY3JpcHRpb24gVHlwZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVHlwZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25UeXBlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBJbml0UGFyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJhbU5hbWUoKSB7Ci0JCXJldHVybiBwYXJhbU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbU5hbWUoU3RyaW5nIG5ld1BhcmFtTmFtZSkgewotCQlTdHJpbmcgb2xkUGFyYW1OYW1lID0gcGFyYW1OYW1lOwotCQlwYXJhbU5hbWUgPSBuZXdQYXJhbU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FLCBvbGRQYXJhbU5hbWUsIHBhcmFtTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gcGFyYW1WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIG5ld1BhcmFtVmFsdWUpIHsKLQkJU3RyaW5nIG9sZFBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlOwotCQlwYXJhbVZhbHVlID0gbmV3UGFyYW1WYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFLCBvbGRQYXJhbVZhbHVlLCBwYXJhbVZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RGVzY3JpcHRpb25UeXBlcygpIHsKLQkJaWYgKGRlc2NyaXB0aW9uVHlwZXMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25UeXBlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvblR5cGUuY2xhc3MsIHRoaXMsIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUyk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvblR5cGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1OYW1lKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1WYWx1ZSgpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUzoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25UeXBlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKLQkJCQlzZXRQYXJhbU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUU6Ci0JCQkJc2V0UGFyYW1WYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUzoKLQkJCQlnZXREZXNjcmlwdGlvblR5cGVzKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvblR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgotCQkJCXNldFBhcmFtTmFtZShQQVJBTV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlzZXRQYXJhbVZhbHVlKFBBUkFNX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25UeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX05BTUU6Ci0JCQkJcmV0dXJuIFBBUkFNX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtTmFtZSAhPSBudWxsIDogIVBBUkFNX05BTUVfRURFRkFVTFQuZXF1YWxzKHBhcmFtTmFtZSk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRToKLQkJCQlyZXR1cm4gUEFSQU1fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtVmFsdWUgIT0gbnVsbCA6ICFQQVJBTV9WQUxVRV9FREVGQVVMVC5lcXVhbHMocGFyYW1WYWx1ZSk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OX1RZUEVTOgotCQkJCXJldHVybiBkZXNjcmlwdGlvblR5cGVzICE9IG51bGwgJiYgIWRlc2NyaXB0aW9uVHlwZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJhbU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmFtTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1WYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1WYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW5pdFBhcmFtSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BvcnROYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BvcnROYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTY0NjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Qb3J0TmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Qb3J0TmFtZUltcGwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnROYW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUG9ydE5hbWUKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lID0gUE9SVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgUG9ydE5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotCQlyZXR1cm4gcG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgbmV3UG9ydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFBvcnROYW1lID0gcG9ydE5hbWU7Ci0JCXBvcnROYW1lID0gbmV3UG9ydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX1BPUlRfTkFNRSwgb2xkUG9ydE5hbWUsIHBvcnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX1BPUlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UG9ydE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FOgotCQkJCXNldFBvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FOgotCQkJCXNldFBvcnROYW1lKFBPUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FOgotCQkJCXJldHVybiBQT1JUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROYW1lICE9IG51bGwgOiAhUE9SVF9OQU1FX0VERUZBVUxULmVxdWFscyhwb3J0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBvcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvcnROYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmYjc5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNPQVAgSGVhZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlckltcGwgZXh0ZW5kcyBRTmFtZUltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgU09BUEhlYWRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9IRUFERVJfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIGdldExvY2FsUGFydCgpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9IRUFERVJfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBnZXRDb21iaW5lZFFOYW1lKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUl9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9IRUFERVJfX0xPQ0FMX1BBUlQ6Ci0JCQkJc2V0TG9jYWxQYXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfSEVBREVSX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfSEVBREVSX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXNldEludGVybmFsUHJlZml4T3JOc1VSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9IRUFERVJfX0xPQ0FMX1BBUlQ6Ci0JCQkJc2V0TG9jYWxQYXJ0KExPQ0FMX1BBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfSEVBREVSX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKENPTUJJTkVEX1FOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUl9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfSEVBREVSX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9IRUFERVJfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIExPQ0FMX1BBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsUGFydCAhPSBudWxsIDogIUxPQ0FMX1BBUlRfRURFRkFVTFQuZXF1YWxzKGxvY2FsUGFydCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUl9fQ09NQklORURfUU5BTUU6Ci0JCQkJcmV0dXJuIENPTUJJTkVEX1FOQU1FX0VERUZBVUxUID09IG51bGwgPyBjb21iaW5lZFFOYW1lICE9IG51bGwgOiAhQ09NQklORURfUU5BTUVfRURFRkFVTFQuZXF1YWxzKGNvbWJpbmVkUU5hbWUpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9IRUFERVJfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQgPT0gbnVsbCA/IGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIDogIUlOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQuZXF1YWxzKGludGVybmFsUHJlZml4T3JOc1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1NPQVBIZWFkZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUFJvbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUFJvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZmU2M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNPQVAgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLlNPQVBSb2xlSW1wbCNnZXRTb2FwUm9sZSA8ZW0+U29hcCBSb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUFJvbGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTT0FQUm9sZQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwUm9sZSgpIDxlbT5Tb2FwIFJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUk9MRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwUm9sZSgpIDxlbT5Tb2FwIFJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc29hcFJvbGUgPSBTT0FQX1JPTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBTT0FQUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUFJvbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U29hcFJvbGUoKSB7Ci0JCXJldHVybiBzb2FwUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNvYXBSb2xlKFN0cmluZyBuZXdTb2FwUm9sZSkgewotCQlTdHJpbmcgb2xkU29hcFJvbGUgPSBzb2FwUm9sZTsKLQkJc29hcFJvbGUgPSBuZXdTb2FwUm9sZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFLCBvbGRTb2FwUm9sZSwgc29hcFJvbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFOgotCQkJCXJldHVybiBnZXRTb2FwUm9sZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEU6Ci0JCQkJc2V0U29hcFJvbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEU6Ci0JCQkJc2V0U29hcFJvbGUoU09BUF9ST0xFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEU6Ci0JCQkJcmV0dXJuIFNPQVBfUk9MRV9FREVGQVVMVCA9PSBudWxsID8gc29hcFJvbGUgIT0gbnVsbCA6ICFTT0FQX1JPTEVfRURFRkFVTFQuZXF1YWxzKHNvYXBSb2xlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc29hcFJvbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNvYXBSb2xlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU09BUFJvbGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvV3Njb21tb25GYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1dzY29tbW9uRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNzQyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvV3Njb21tb25GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3Njb21tb25GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdzY29tbW9uRmFjdG9yeQotewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3Njb21tb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNOiByZXR1cm4gY3JlYXRlSW5pdFBhcmFtKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUjogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXIoKTsKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRTogcmV0dXJuIGNyZWF0ZVNPQVBSb2xlKCk7Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUU6IHJldHVybiBjcmVhdGVQb3J0TmFtZSgpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fVFlQRTogcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpOwotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX1RZUEU6IHJldHVybiBjcmVhdGVEaXNwbGF5TmFtZVR5cGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEluaXRQYXJhbSBjcmVhdGVJbml0UGFyYW0oKSB7Ci0JCUluaXRQYXJhbUltcGwgaW5pdFBhcmFtID0gbmV3IEluaXRQYXJhbUltcGwoKTsKLQkJcmV0dXJuIGluaXRQYXJhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTT0FQSGVhZGVyIGNyZWF0ZVNPQVBIZWFkZXIoKSB7Ci0JCVNPQVBIZWFkZXJJbXBsIHNvYXBIZWFkZXIgPSBuZXcgU09BUEhlYWRlckltcGwoKTsKLQkJcmV0dXJuIHNvYXBIZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU09BUFJvbGUgY3JlYXRlU09BUFJvbGUoKSB7Ci0JCVNPQVBSb2xlSW1wbCBzb2FwUm9sZSA9IG5ldyBTT0FQUm9sZUltcGwoKTsKLQkJcmV0dXJuIHNvYXBSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFBvcnROYW1lIGNyZWF0ZVBvcnROYW1lKCkgewotCQlQb3J0TmFtZUltcGwgcG9ydE5hbWUgPSBuZXcgUG9ydE5hbWVJbXBsKCk7Ci0JCXJldHVybiBwb3J0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBEZXNjcmlwdGlvblR5cGUgY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkgewotCQlEZXNjcmlwdGlvblR5cGVJbXBsIGRlc2NyaXB0aW9uVHlwZSA9IG5ldyBEZXNjcmlwdGlvblR5cGVJbXBsKCk7Ci0JCXJldHVybiBkZXNjcmlwdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRGlzcGxheU5hbWVUeXBlIGNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpIHsKLQkJRGlzcGxheU5hbWVUeXBlSW1wbCBkaXNwbGF5TmFtZVR5cGUgPSBuZXcgRGlzcGxheU5hbWVUeXBlSW1wbCgpOwotCQlyZXR1cm4gZGlzcGxheU5hbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzY29tbW9uUGFja2FnZSBnZXRXc2NvbW1vblBhY2thZ2UoKSB7Ci0JCXJldHVybiAoV3Njb21tb25QYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgV3Njb21tb25QYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL1dzY29tbW9uRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvV3Njb21tb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU3NDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vblBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2NvbW1vblBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgV3Njb21tb25QYWNrYWdlCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBpbml0UGFyYW1FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBzb2FwSGVhZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgc29hcFJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBwb3J0TmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGRlc2NyaXB0aW9uVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGRpc3BsYXlOYW1lVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBXc2NvbW1vblBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIFdzY29tbW9uUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoV3Njb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFdzY29tbW9uUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2VJbXBsLmluaXQoKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVdzY29tbW9uUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlV3Njb21tb25QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRJbml0UGFyYW0oKSB7Ci0JCXJldHVybiBpbml0UGFyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWluaXRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluaXRQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRTT0FQSGVhZGVyKCkgewotCQlyZXR1cm4gc29hcEhlYWRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0U09BUFJvbGUoKSB7Ci0JCXJldHVybiBzb2FwUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBSb2xlX1NvYXBSb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc29hcFJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0UG9ydE5hbWUoKSB7Ci0JCXJldHVybiBwb3J0TmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnROYW1lX1BvcnROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydE5hbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRpb25UeXBlKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25UeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXREaXNwbGF5TmFtZVR5cGUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3Njb21tb25GYWN0b3J5IGdldFdzY29tbW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChXc2NvbW1vbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWluaXRQYXJhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTklUX1BBUkFNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0UGFyYW1FQ2xhc3MsIElOSVRfUEFSQU1fX1BBUkFNX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fUEFSQU1fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGluaXRQYXJhbUVDbGFzcywgSU5JVF9QQVJBTV9fREVTQ1JJUFRJT05fVFlQRVMpOwotCi0JCXNvYXBIZWFkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9IRUFERVIpOwotCi0JCXNvYXBSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc29hcFJvbGVFQ2xhc3MsIFNPQVBfUk9MRV9fU09BUF9ST0xFKTsKLQotCQlwb3J0TmFtZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnROYW1lRUNsYXNzLCBQT1JUX05BTUVfX1BPUlRfTkFNRSk7Ci0KLQkJZGVzY3JpcHRpb25UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSVBUSU9OX1RZUEUpOwotCi0JCWRpc3BsYXlOYW1lVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNQTEFZX05BTUVfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlzb2FwSGVhZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCWRlc2NyaXB0aW9uVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCkpOwotCQlkaXNwbGF5TmFtZVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGluaXRQYXJhbUVDbGFzcywgSW5pdFBhcmFtLmNsYXNzLCAiSW5pdFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpLCB0aGlzLmdldERlc2NyaXB0aW9uVHlwZSgpLCBudWxsLCAiZGVzY3JpcHRpb25UeXBlcyIsIG51bGwsIDAsIC0xLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzb2FwSGVhZGVyRUNsYXNzLCBTT0FQSGVhZGVyLmNsYXNzLCAiU09BUEhlYWRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHNvYXBSb2xlRUNsYXNzLCBTT0FQUm9sZS5jbGFzcywgIlNPQVBSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTT0FQUm9sZV9Tb2FwUm9sZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic29hcFJvbGUiLCBudWxsLCAwLCAxLCBTT0FQUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBvcnROYW1lRUNsYXNzLCBQb3J0TmFtZS5jbGFzcywgIlBvcnROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0TmFtZV9Qb3J0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWUiLCBudWxsLCAwLCAxLCBQb3J0TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uVHlwZUVDbGFzcywgRGVzY3JpcHRpb25UeXBlLmNsYXNzLCAiRGVzY3JpcHRpb25UeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZGlzcGxheU5hbWVUeXBlRUNsYXNzLCBEaXNwbGF5TmFtZVR5cGUuY2xhc3MsICJEaXNwbGF5TmFtZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL1dzY29tbW9uUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvdXRpbC9Xc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL3V0aWwvV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYyODFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvdXRpbC9Xc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzY29tbW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgV3Njb21tb25QYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXc2NvbW1vblN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBXc2NvbW1vblN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUluaXRQYXJhbShJbml0UGFyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUluaXRQYXJhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBIZWFkZXIoU09BUEhlYWRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBSb2xlKFNPQVBSb2xlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTT0FQUm9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBvcnROYW1lKFBvcnROYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQb3J0TmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURpc3BsYXlOYW1lVHlwZShEaXNwbGF5TmFtZVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc3BsYXlOYW1lVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVRTmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURpc3BsYXlOYW1lKERpc3BsYXlOYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEaXNwbGF5TmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtIDxlbT5Jbml0IFBhcmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlciA8ZW0+U09BUCBIZWFkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlIDxlbT5TT0FQIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNwbGF5TmFtZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNwbGF5TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVFOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1dzY29tbW9uQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvdXRpbC9Xc2NvbW1vblN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC91dGlsL1dzY29tbW9uU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTc0MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC91dGlsL1dzY29tbW9uU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3Njb21tb25Td2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXc2NvbW1vblBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzY29tbW9uU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTTogewotCQkJCUluaXRQYXJhbSBpbml0UGFyYW0gPSAoSW5pdFBhcmFtKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbml0UGFyYW0oaW5pdFBhcmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUjogewotCQkJCVNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyKHNvYXBIZWFkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVFOYW1lKHNvYXBIZWFkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRTogewotCQkJCVNPQVBSb2xlIHNvYXBSb2xlID0gKFNPQVBSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQUm9sZShzb2FwUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FOiB7Ci0JCQkJUG9ydE5hbWUgcG9ydE5hbWUgPSAoUG9ydE5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBvcnROYW1lKHBvcnROYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9UWVBFOiB7Ci0JCQkJRGVzY3JpcHRpb25UeXBlIGRlc2NyaXB0aW9uVHlwZSA9IChEZXNjcmlwdGlvblR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uVHlwZShkZXNjcmlwdGlvblR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX1RZUEU6IHsKLQkJCQlEaXNwbGF5TmFtZVR5cGUgZGlzcGxheU5hbWVUeXBlID0gKERpc3BsYXlOYW1lVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGlzcGxheU5hbWVUeXBlKGRpc3BsYXlOYW1lVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlzcGxheU5hbWUoZGlzcGxheU5hbWVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdCBQYXJhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Jbml0IFBhcmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSW5pdFBhcmFtKEluaXRQYXJhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNPQVAgSGVhZGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlcihTT0FQSGVhZGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U09BUCBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNPQVAgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBSb2xlKFNPQVBSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnROYW1lKFBvcnROYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV3Njb21tb25Td2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZmZmM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+RUpCIEFydGlmYWN0IEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgd2ViIHNlcnZpY2VzIGNvbW1vbiBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSBjb21tb24gd2ViIHNlcnZpY2VzIG1vZGVsIGFydGlmYWN0cyAoU29hcEhlYWRlcnMsIFBvcnRzLCBEaXNwbGF5TmFtZSwgSW5pdFBhcmFtcyBldGMuKSAKLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0JlYW5MaW5rLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvQmVhbkxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMzdiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvQmVhbkxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmVhbiBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRCZWFuTGluaygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCZWFuTGluayBleHRlbmRzIEVPYmplY3R7Ci0gLy8gQmVhbkxpbmsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9FSkJMaW5rLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvRUpCTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWQ2ZDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9FSkJMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RUpCIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEgV2ViIFNlcnZpY2UgRW5kcG9pbnQuCi0gKiAKLSAqIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbgotICogCi0gKiBFeGFtcGxlczoKLSAqIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0gKiAJPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRFSkJMaW5rKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVKQkxpbmsgZXh0ZW5kcyBCZWFuTGlua3sKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWpiTGluayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0RUpCTGlua19FamJMaW5rKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRFamJMaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluayNnZXRFamJMaW5rIDxlbT5FamIgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFamJMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RWpiTGluayhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEVKQkxpbmsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzdkYzI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGFuZGxlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4KLSAqIAotICogVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldFNvYXBIZWFkZXJzIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldFNvYXBSb2xlcyA8ZW0+U29hcCBSb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIYW5kbGVyTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJOYW1lIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFuZGxlciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIYW5kbGVyQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJfSGFuZGxlckNsYXNzKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRIYW5kbGVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEhhbmRsZXJDbGFzcyA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEhhbmRsZXJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBIZWFkZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBIZWFkZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEhhbmRsZXJfU29hcEhlYWRlcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXIiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0U29hcEhlYWRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFNvYXBSb2xlcygpOwotCi19IC8vIEhhbmRsZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Qb3J0Q29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvUG9ydENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTdlZjJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Qb3J0Q29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcG9ydC1jb21wb25lbnQgZWxlbWVudCBhc3NvY2lhdGVzIGEgV1NETCBwb3J0IHdpdGggYSBXZWIgc2VydmljZSBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhIGNvbXBvbmVudCwgb3B0aW9uYWwgZGVzY3JpcHRpb24sIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgaWNvbmljIHJlcHJlc2VudGF0aW9ucywgV1NETCBwb3J0IFFOYW1lLCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSwgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0UG9ydENvbXBvbmVudE5hbWUgPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFdzZGxQb3J0IDxlbT5Xc2RsIFBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VJbXBsQmVhbiA8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3J0Q29tcG9uZW50IGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzIG5hbWUuIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUgbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvcnRDb21wb25lbnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRQb3J0Q29tcG9uZW50TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0UG9ydENvbXBvbmVudE5hbWUgPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBvcnRDb21wb25lbnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBvcnQgY29tcG9uZW50J3MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U21hbGxJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X1NtYWxsSWNvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXJnZSBJY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXJnZUljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldExhcmdlSWNvbiA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREaXNwbGF5TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsUG9ydChXU0RMUG9ydCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETFBvcnQgZ2V0V3NkbFBvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFdzZGxQb3J0IDxlbT5Xc2RsIFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdzZGxQb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbFBvcnQoV1NETFBvcnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+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+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJY29uVHlwZShJY29uVHlwZSB2YWx1ZSk7Ci0KLX0gLy8gUG9ydENvbXBvbmVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1NlcnZpY2VJbXBsQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1NlcnZpY2VJbXBsQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDAzZGRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9TZXJ2aWNlSW1wbEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgSW1wbCBCZWFuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgZGVmaW5lcyB0aGUgV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBhbiBFSkIgYmVhbiBjbGFzcyBvciBKQVgtUlBDIHdlYiBjb21wb25lbnQuIEV4aXN0aW5nIEVKQiBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cG9zZWQgYXMgYSBXZWIgc2VydmljZSB1c2luZyBhbiBlamItbGluay4KLSAqIAotICogVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0RUVKQkxpbmsgPGVtPkVFSkIgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFU2VydmxldExpbmsgPGVtPkVTZXJ2bGV0IExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0QmVhbkxpbmsgPGVtPkJlYW4gTGluazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFNlcnZpY2VJbXBsQmVhbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlSW1wbEJlYW4gZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVFSkIgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FRUpCIExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUVKQiBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFRUpCTGluayhFSkJMaW5rKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUpCTGluayBnZXRFRUpCTGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFRUpCTGluayA8ZW0+RUVKQiBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUVKQiBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFRUpCTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEVFSkJMaW5rKEVKQkxpbmsgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVNlcnZsZXQgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FU2VydmxldCBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVTZXJ2bGV0IExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVTZXJ2bGV0TGluayhTZXJ2bGV0TGluaykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTZXJ2bGV0TGluayBnZXRFU2VydmxldExpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0RVNlcnZsZXRMaW5rIDxlbT5FU2VydmxldCBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVNlcnZsZXQgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RVNlcnZsZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RVNlcnZsZXRMaW5rKFNlcnZsZXRMaW5rIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJlYW4gTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CZWFuIExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmVhbiBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCZWFuTGluayhCZWFuTGluaykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEJlYW5MaW5rIGdldEJlYW5MaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEJlYW5MaW5rIDxlbT5CZWFuIExpbms8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CZWFuIExpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEJlYW5MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0QmVhbkxpbmsoQmVhbkxpbmsgdmFsdWUpOwotCi19IC8vIFNlcnZpY2VJbXBsQmVhbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1NlcnZsZXRMaW5rLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvU2VydmxldExpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxNDE3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvU2VydmxldExpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2bGV0IExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc2VydmxldC1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4KLSAqIAotICogVGhlIHZhbHVlIG9mIHRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBzZXJ2bGV0LW5hbWUgb2YgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQgaW4gdGhlIHNhbWUgV0FSIGZpbGUuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsjZ2V0U2VydmxldExpbmsgPGVtPlNlcnZsZXQgTGluazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFNlcnZsZXRMaW5rKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRMaW5rIGV4dGVuZHMgQmVhbkxpbmt7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmxldCBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZsZXQgTGluazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2bGV0IExpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZsZXRMaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0U2VydmxldExpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluayNnZXRTZXJ2bGV0TGluayA8ZW0+U2VydmxldCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2bGV0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFNlcnZsZXRMaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VydmxldExpbmsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XU0RMUG9ydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dTRExQb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzU3YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dTRExQb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwgcG9ydCBRTmFtZS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXU0RMUG9ydCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMUG9ydCBleHRlbmRzIFFOYW1lewotIC8vIFdTRExQb3J0Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV2ViU2VydmljZURlc2NyaXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV2ViU2VydmljZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmN2NiYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gZWxlbWVudCBkZWZpbmVzIGEgV1NETCBkb2N1bWVudCBmaWxlIGFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIG1vZHVsZS4KLSAqIAotICogQWxsIFdTREwgZmlsZSBwb3J0cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgZGVmaW5lZC4KLSAqIAotICogVXNlZCBpbjogd2Vic2VydmljZXMKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SmF4cnBjTWFwcGluZ0ZpbGUgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRMYXJnZUljb24gPGVtPkxhcmdlIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0UG9ydENvbXBvbmVudHMgPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGlzcGxheU5hbWVUeXBlIDxlbT5EaXNwbGF5IE5hbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF4cnBjIE1hcHBpbmcgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRKYXhycGNNYXBwaW5nRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRKYXhycGNNYXBwaW5nRmlsZSA8ZW0+SmF4cnBjIE1hcHBpbmcgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEpheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SmF4cnBjTWFwcGluZ0ZpbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiAKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBGaWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIFdTREwgZmlsZSBpbiB0aGUgbW9kdWxlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsRmlsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXc2RsRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXc2RsRmlsZSA8ZW0+V3NkbCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxGaWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U21hbGxJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fU21hbGxJY29uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0U21hbGxJY29uIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U21hbGwgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxhcmdlIEljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fTGFyZ2VJY29uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRMYXJnZUljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREaXNwbGF5TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0UG9ydENvbXBvbmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRGVzY3JpcHRpb25UeXBlIGdldERlc2NyaXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREZXNjcmlwdGlvblR5cGUgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXREZXNjcmlwdGlvblR5cGUoRGVzY3JpcHRpb25UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZSBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERpc3BsYXlOYW1lVHlwZShEaXNwbGF5TmFtZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRGlzcGxheU5hbWVUeXBlIGdldERpc3BsYXlOYW1lVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldERpc3BsYXlOYW1lVHlwZShEaXNwbGF5TmFtZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb24gVHlwZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SWNvblR5cGUoSWNvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0ljb25UeXBlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBJY29uVHlwZSBnZXRJY29uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbiBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJY29uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldEljb25UeXBlKEljb25UeXBlIHZhbHVlKTsKLQotfSAvLyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9XZWJTZXJ2aWNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dlYlNlcnZpY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWUyMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dlYlNlcnZpY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWIgU2VydmljZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQgc2VydmljZXMuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucyA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0V2ViU2VydmljZXMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZXMgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCk7Ci0KLX0gLy8gV2ViU2VydmljZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjBjYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXc2RkRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBXc2RkRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZEZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdlYlNlcnZpY2VzIGNyZWF0ZVdlYlNlcnZpY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBQb3J0Q29tcG9uZW50IGNyZWF0ZVBvcnRDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBQb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETCBQb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETFBvcnQgY3JlYXRlV1NETFBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFNlcnZpY2VJbXBsQmVhbiBjcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU2VydmxldExpbmsgY3JlYXRlU2VydmxldExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RUpCIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FSkIgTGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVKQkxpbmsgY3JlYXRlRUpCTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGFuZGxlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEhhbmRsZXIgY3JlYXRlSGFuZGxlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CZWFuIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJlYW4gTGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmVhbkxpbmsgY3JlYXRlQmVhbkxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXc2RkUGFja2FnZSBnZXRXc2RkUGFja2FnZSgpOwotCi19IC8vV3NkZEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZWI3ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3NkZFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGVOQU1FID0gIndzZGQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5TX1VSSSA9ICJ3c2RkLnhtaSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBXc2RkUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0ltcGwgPGVtPldlYiBTZXJ2aWNlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRXZWJTZXJ2aWNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfX0lDT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19JQ09OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFU19fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX19ERVNDUklQVElPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RFU0NSSVBUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfX1NNQUxMX0lDT04gPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VTX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfX0RFU0NSSVBUSU9OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFU19fRElTUExBWV9OQU1FID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ESVNQTEFZX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWIgU2VydmljZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRVNfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpheHJwYyBNYXBwaW5nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TbWFsbCBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fU01BTExfSUNPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFyZ2UgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0xBUkdFX0lDT04gPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT04gPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWUgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsIDxlbT5Qb3J0IENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhcmdlIEljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBJbXBsIEJlYW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lIFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb24gVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRSA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfQ09NUE9ORU5UX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV1NETFBvcnRJbXBsIDxlbT5XU0RMIFBvcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV1NETFBvcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0V1NETFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX19OQU1FU1BBQ0VfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfX0xPQ0FMX1BBUlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbWJpbmVkIFFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V1NETCBQb3J0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9QT1JUX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbEJlYW5JbXBsIDxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbEJlYW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0U2VydmljZUltcGxCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBTRVJWSUNFX0lNUExfQkVBTiA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUVKQiBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU2VydmxldCBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lNUExfQkVBTl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuQmVhbkxpbmtJbXBsIDxlbT5CZWFuIExpbms8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuQmVhbkxpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0QmVhbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IEJFQU5fTElOSyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJlYW4gTGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEJFQU5fTElOS19GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmxldExpbmtJbXBsIDxlbT5TZXJ2bGV0IExpbms8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmxldExpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0U2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFNFUlZMRVRfTElOSyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSyA9IEJFQU5fTElOS19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVkxFVF9MSU5LX0ZFQVRVUkVfQ09VTlQgPSBCRUFOX0xJTktfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkVKQkxpbmtJbXBsIDxlbT5FSkIgTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5FSkJMaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldEVKQkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IEVKQl9MSU5LID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRUpCX0xJTktfX0VKQl9MSU5LID0gQkVBTl9MSU5LX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FSkIgTGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVKQl9MSU5LX0ZFQVRVUkVfQ09VTlQgPSBCRUFOX0xJTktfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsIDxlbT5IYW5kbGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgSEFORExFUiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fSUNPTlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0lDT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fRElTUExBWV9OQU1FUyA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fRElTUExBWV9OQU1FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fREVTQ1JJUFRJT05TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19ERVNDUklQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9fU01BTExfSUNPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXJnZSBJY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19MQVJHRV9JQ09OID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19MQVJHRV9JQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19ERVNDUklQVElPTiA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19ESVNQTEFZX05BTUUgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX0RJU1BMQVlfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX0hBTkRMRVJfTkFNRSA9IENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19IQU5ETEVSX0NMQVNTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEhBTkRMRVJfX0lOSVRfUEFSQU1TID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgSGVhZGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19TT0FQX0hFQURFUlMgPSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBSb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBIQU5ETEVSX19TT0FQX1JPTEVTID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5IYW5kbGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSEFORExFUl9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMgPGVtPldlYiBTZXJ2aWNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2ViIFNlcnZpY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V2ViU2VydmljZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucyA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldEpheHJwY01hcHBpbmdGaWxlKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldFdzZGxGaWxlKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U21hbGwgSWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0U21hbGxJY29uKCkKLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fU21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhcmdlIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldExhcmdlSWNvbigpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0xhcmdlSWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzcGxheSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRQb3J0Q29tcG9uZW50cyA8ZW0+UG9ydCBDb21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9ydCBDb21wb25lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRQb3J0Q29tcG9uZW50cygpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERlc2NyaXB0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldERpc3BsYXlOYW1lVHlwZSgpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uI2dldEljb25UeXBlIDxlbT5JY29uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SWNvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRJY29uVHlwZSgpCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0ljb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCA8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRQb3J0Q29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFBvcnRDb21wb25lbnROYW1lIDxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRQb3J0Q29tcG9uZW50TmFtZSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TbWFsbCBJY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U21hbGxJY29uKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhcmdlIEljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRMYXJnZUljb24oKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGlzcGxheU5hbWUgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREaXNwbGF5TmFtZSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0V3NkbFBvcnQgPGVtPldzZGwgUG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIFBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRXc2RsUG9ydCgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0U2VydmljZUltcGxCZWFuIDxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TZXJ2aWNlIEltcGwgQmVhbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFNlcnZpY2VJbXBsQmVhbigpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SGFuZGxlcnMgPGVtPkhhbmRsZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SGFuZGxlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRIYW5kbGVycygpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0RGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAc2VlICNnZXRQb3J0Q29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JY29uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRJY29uVHlwZSgpCi0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfSWNvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydCA8ZW0+V1NETCBQb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIFBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiA8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFNlcnZpY2VJbXBsQmVhbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEVFSkJMaW5rIDxlbT5FRUpCIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RUVKQiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRFRUpCTGluaygpCi0JICogQHNlZSAjZ2V0U2VydmljZUltcGxCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4jZ2V0RVNlcnZsZXRMaW5rIDxlbT5FU2VydmxldCBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVTZXJ2bGV0IExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEVTZXJ2bGV0TGluaygpCi0JICogQHNlZSAjZ2V0U2VydmljZUltcGxCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuI2dldEJlYW5MaW5rIDxlbT5CZWFuIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QmVhbiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbiNnZXRCZWFuTGluaygpCi0JICogQHNlZSAjZ2V0U2VydmljZUltcGxCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmsgPGVtPlNlcnZsZXQgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0U2VydmxldExpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rI2dldFNlcnZsZXRMaW5rIDxlbT5TZXJ2bGV0IExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rI2dldFNlcnZsZXRMaW5rKCkKLQkgKiBAc2VlICNnZXRTZXJ2bGV0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluayA8ZW0+RUpCIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVKQiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRFSkJMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rI2dldEVqYkxpbmsgPGVtPkVqYiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVqYiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsjZ2V0RWpiTGluaygpCi0JICogQHNlZSAjZ2V0RUpCTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEVKQkxpbmtfRWpiTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIgPGVtPkhhbmRsZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEhhbmRsZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SGFuZGxlck5hbWUgPGVtPkhhbmRsZXIgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRIYW5kbGVyTmFtZSgpCi0JICogQHNlZSAjZ2V0SGFuZGxlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEhhbmRsZXJfSGFuZGxlck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0SGFuZGxlckNsYXNzIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRIYW5kbGVyQ2xhc3MoKQotCSAqIEBzZWUgI2dldEhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRJbml0UGFyYW1zKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXIjZ2V0U29hcEhlYWRlcnMgPGVtPlNvYXAgSGVhZGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNvYXAgSGVhZGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldFNvYXBIZWFkZXJzKCkKLQkgKiBAc2VlICNnZXRIYW5kbGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyI2dldFNvYXBSb2xlcyA8ZW0+U29hcCBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNvYXAgUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciNnZXRTb2FwUm9sZXMoKQotCSAqIEBzZWUgI2dldEhhbmRsZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX1NvYXBSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rIDxlbT5CZWFuIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJlYW4gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEJlYW5MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdzZGRGYWN0b3J5IGdldFdzZGRGYWN0b3J5KCk7Ci0KLX0gLy9Xc2RkUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDU2N2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKLQotcHVibGljIGludGVyZmFjZSBXc2RkUmVzb3VyY2UgZXh0ZW5kcyBYTUxSZXNvdXJjZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUJfU0VSVklDRV9UWVBFID0gNjsKLQotICBXZWJTZXJ2aWNlcyBnZXRXZWJTZXJ2aWNlcygpOwotICBwdWJsaWMgYm9vbGVhbiBpc1dlYlNlcnZpY2UxXzAoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNXZWJTZXJ2aWNlMV8xKCk7Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvQmVhbkxpbmtJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9CZWFuTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlOWZjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9CZWFuTGlua0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmVhbiBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmVhbkxpbmtJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCZWFuTGluawotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEJlYW5MaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEJlYW5MaW5rKCk7Ci0JfQotCi19IC8vQmVhbkxpbmtJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9FSkJMaW5rSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvRUpCTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2MjdiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9FSkJMaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuRUpCTGlua0ltcGwjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJMaW5rSW1wbCBleHRlbmRzIEJlYW5MaW5rSW1wbCBpbXBsZW1lbnRzIEVKQkxpbmsKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTGluaygpIDxlbT5FamIgTGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVqYkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJMaW5rKCkgPGVtPkVqYiBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWpiTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZWpiTGluayA9IEVKQl9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUpCTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMaW5rKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVqYkxpbmsoKSB7Ci0JCXJldHVybiBlamJMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RWpiTGluayhTdHJpbmcgbmV3RWpiTGluaykgewotCQlTdHJpbmcgb2xkRWpiTGluayA9IGVqYkxpbms7Ci0JCWVqYkxpbmsgPSBuZXdFamJMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5FSkJfTElOS19fRUpCX0xJTkssIG9sZEVqYkxpbmssIGVqYkxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTktfX0VKQl9MSU5LOgotCQkJCXJldHVybiBnZXRFamJMaW5rKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSzoKLQkJCQlzZXRFamJMaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTktfX0VKQl9MSU5LOgotCQkJCXNldEVqYkxpbmsoRUpCX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSzoKLQkJCQlyZXR1cm4gRUpCX0xJTktfRURFRkFVTFQgPT0gbnVsbCA/IGVqYkxpbmsgIT0gbnVsbCA6ICFFSkJfTElOS19FREVGQVVMVC5lcXVhbHMoZWpiTGluayk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYkxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVqYkxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FSkJMaW5rSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjAzNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IYW5kbGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRIYW5kbGVyTmFtZSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRIYW5kbGVyQ2xhc3MgPGVtPkhhbmRsZXIgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkhhbmRsZXJJbXBsI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRTb2FwSGVhZGVycyA8ZW0+U29hcCBIZWFkZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5IYW5kbGVySW1wbCNnZXRTb2FwUm9sZXMgPGVtPlNvYXAgUm9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVySW1wbCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbCBpbXBsZW1lbnRzIEhhbmRsZXIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlck5hbWUoKSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlck5hbWUoKSA8ZW0+SGFuZGxlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlck5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZXJOYW1lID0gSEFORExFUl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDbGFzcygpIDxlbT5IYW5kbGVyIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFuZGxlckNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyQ2xhc3MoKSA8ZW0+SGFuZGxlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaGFuZGxlckNsYXNzID0gSEFORExFUl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRQYXJhbXMoKSA8ZW0+SW5pdCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRQYXJhbXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgaW5pdFBhcmFtcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwSGVhZGVycygpIDxlbT5Tb2FwIEhlYWRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvYXBIZWFkZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHNvYXBIZWFkZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBSb2xlcygpIDxlbT5Tb2FwIFJvbGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb2FwUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3Qgc29hcFJvbGVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEhhbmRsZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIYW5kbGVyTmFtZSgpIHsKLQkJcmV0dXJuIGhhbmRsZXJOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlck5hbWUoU3RyaW5nIG5ld0hhbmRsZXJOYW1lKSB7Ci0JCVN0cmluZyBvbGRIYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lOwotCQloYW5kbGVyTmFtZSA9IG5ld0hhbmRsZXJOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUUsIG9sZEhhbmRsZXJOYW1lLCBoYW5kbGVyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIYW5kbGVyQ2xhc3MoKSB7Ci0JCXJldHVybiBoYW5kbGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2xhc3MoU3RyaW5nIG5ld0hhbmRsZXJDbGFzcykgewotCQlTdHJpbmcgb2xkSGFuZGxlckNsYXNzID0gaGFuZGxlckNsYXNzOwotCQloYW5kbGVyQ2xhc3MgPSBuZXdIYW5kbGVyQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MsIG9sZEhhbmRsZXJDbGFzcywgaGFuZGxlckNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbml0UGFyYW0uY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRTb2FwSGVhZGVycygpIHsKLQkJaWYgKHNvYXBIZWFkZXJzID09IG51bGwpIHsKLQkJCXNvYXBIZWFkZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNPQVBIZWFkZXIuY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUyk7Ci0JCX0KLQkJcmV0dXJuIHNvYXBIZWFkZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldFNvYXBSb2xlcygpIHsKLQkJaWYgKHNvYXBSb2xlcyA9PSBudWxsKSB7Ci0JCQlzb2FwUm9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU09BUFJvbGUuY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBzb2FwUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0RFU0NSSVBUSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U29hcEhlYWRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTb2FwUm9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lDT05TOgotCQkJCXJldHVybiBnZXRJY29ucygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZXMoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUU6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJOYW1lKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJDbGFzcygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFBhcmFtcygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIGdldFNvYXBIZWFkZXJzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVM6Ci0JCQkJcmV0dXJuIGdldFNvYXBSb2xlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU01BTExfSUNPTjoKLQkJCQlzZXRTbWFsbEljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fRElTUExBWV9OQU1FOgotCQkJCXNldERpc3BsYXlOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXNldEhhbmRsZXJOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlzZXRIYW5kbGVyQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlnZXRTb2FwSGVhZGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U29hcEhlYWRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlnZXRTb2FwUm9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19ESVNQTEFZX05BTUVTOgotCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19ERVNDUklQVElPTlM6Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fTEFSR0VfSUNPTjoKLQkJCQlzZXRMYXJnZUljb24oTEFSR0VfSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKLQkJCQlzZXRIYW5kbGVyTmFtZShIQU5ETEVSX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUzoKLQkJCQlzZXRIYW5kbGVyQ2xhc3MoSEFORExFUl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKLQkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUzoKLQkJCQlnZXRTb2FwSGVhZGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTOgotCQkJCWdldFNvYXBSb2xlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVzICE9IG51bGwgJiYgIWRpc3BsYXlOYW1lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIExBUkdFX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IGxhcmdlSWNvbiAhPSBudWxsIDogIUxBUkdFX0lDT05fRURFRkFVTFQuZXF1YWxzKGxhcmdlSWNvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgotCQkJCXJldHVybiBIQU5ETEVSX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGhhbmRsZXJOYW1lICE9IG51bGwgOiAhSEFORExFUl9OQU1FX0VERUZBVUxULmVxdWFscyhoYW5kbGVyTmFtZSk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIEhBTkRMRVJfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGhhbmRsZXJDbGFzcyAhPSBudWxsIDogIUhBTkRMRVJfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGhhbmRsZXJDbGFzcyk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiBpbml0UGFyYW1zICE9IG51bGwgJiYgIWluaXRQYXJhbXMuaXNFbXB0eSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19TT0FQX0hFQURFUlM6Ci0JCQkJcmV0dXJuIHNvYXBIZWFkZXJzICE9IG51bGwgJiYgIXNvYXBIZWFkZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUzoKLQkJCQlyZXR1cm4gc29hcFJvbGVzICE9IG51bGwgJiYgIXNvYXBSb2xlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGhhbmRsZXJOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoYW5kbGVyTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGFuZGxlckNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoYW5kbGVyQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9IYW5kbGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Mjg3NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0UG9ydENvbXBvbmVudE5hbWUgPGVtPlBvcnQgQ29tcG9uZW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFNtYWxsSWNvbiA8ZW0+U21hbGwgSWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldERpc3BsYXlOYW1lIDxlbT5EaXNwbGF5IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFdzZGxQb3J0IDxlbT5Xc2RsIFBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldFNlcnZpY2VJbXBsQmVhbiA8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldEhhbmRsZXJzIDxlbT5IYW5kbGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXREaXNwbGF5TmFtZVR5cGUgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRJY29uVHlwZSA8ZW0+SWNvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydENvbXBvbmVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBvcnRDb21wb25lbnQKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydENvbXBvbmVudE5hbWUoKSA8ZW0+UG9ydCBDb21wb25lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9DT01QT05FTlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0Q29tcG9uZW50TmFtZSgpIDxlbT5Qb3J0IENvbXBvbmVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBvcnRDb21wb25lbnROYW1lID0gUE9SVF9DT01QT05FTlRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNtYWxsSWNvbigpIDxlbT5TbWFsbCBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U21hbGxJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU01BTExfSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc21hbGxJY29uID0gU01BTExfSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXJnZUljb24oKSA8ZW0+TGFyZ2UgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhcmdlSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBUkdFX0lDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFyZ2VJY29uKCkgPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGxhcmdlSWNvbiA9IExBUkdFX0lDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWUoKSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlOYW1lID0gRElTUExBWV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFBvcnQoKSA8ZW0+V3NkbCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFBvcnQgd3NkbFBvcnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUltcGxCZWFuKCkgPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUltcGxCZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VJbXBsQmVhbiBzZXJ2aWNlSW1wbEJlYW4gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlcnMoKSA8ZW0+SGFuZGxlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGhhbmRsZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uVHlwZSgpIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIERlc2NyaXB0aW9uVHlwZSBkZXNjcmlwdGlvblR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVUeXBlKCkgPGVtPkRpc3BsYXkgTmFtZSBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzcGxheU5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIERpc3BsYXlOYW1lVHlwZSBkaXNwbGF5TmFtZVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvblR5cGUoKSA8ZW0+SWNvbiBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWNvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgSWNvblR5cGUgaWNvblR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgUG9ydENvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gcG9ydENvbXBvbmVudE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0Q29tcG9uZW50TmFtZShTdHJpbmcgbmV3UG9ydENvbXBvbmVudE5hbWUpIHsKLQkJU3RyaW5nIG9sZFBvcnRDb21wb25lbnROYW1lID0gcG9ydENvbXBvbmVudE5hbWU7Ci0JCXBvcnRDb21wb25lbnROYW1lID0gbmV3UG9ydENvbXBvbmVudE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FLCBvbGRQb3J0Q29tcG9uZW50TmFtZSwgcG9ydENvbXBvbmVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFN0cmluZyBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLQkJU3RyaW5nIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKLQkJcmV0dXJuIHNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgbmV3U21hbGxJY29uKSB7Ci0JCVN0cmluZyBvbGRTbWFsbEljb24gPSBzbWFsbEljb247Ci0JCXNtYWxsSWNvbiA9IG5ld1NtYWxsSWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT04sIG9sZFNtYWxsSWNvbiwgc21hbGxJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKLQkJcmV0dXJuIGxhcmdlSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbmV3TGFyZ2VJY29uKSB7Ci0JCVN0cmluZyBvbGRMYXJnZUljb24gPSBsYXJnZUljb247Ci0JCWxhcmdlSWNvbiA9IG5ld0xhcmdlSWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT04sIG9sZExhcmdlSWNvbiwgbGFyZ2VJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLQkJU3RyaW5nIG9sZERpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0JCWRpc3BsYXlOYW1lID0gbmV3RGlzcGxheU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUUsIG9sZERpc3BsYXlOYW1lLCBkaXNwbGF5TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExQb3J0IGdldFdzZGxQb3J0KCkgewotCQlyZXR1cm4gd3NkbFBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXc2RsUG9ydChXU0RMUG9ydCBuZXdXc2RsUG9ydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXU0RMUG9ydCBvbGRXc2RsUG9ydCA9IHdzZGxQb3J0OwotCQl3c2RsUG9ydCA9IG5ld1dzZGxQb3J0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JULCBvbGRXc2RsUG9ydCwgbmV3V3NkbFBvcnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFBvcnQoV1NETFBvcnQgbmV3V3NkbFBvcnQpIHsKLQkJaWYgKG5ld1dzZGxQb3J0ICE9IHdzZGxQb3J0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsUG9ydCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsUG9ydCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxQb3J0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxQb3J0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsUG9ydChuZXdXc2RsUG9ydCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JULCBuZXdXc2RsUG9ydCwgbmV3V3NkbFBvcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2aWNlSW1wbEJlYW4gZ2V0U2VydmljZUltcGxCZWFuKCkgewotCQlyZXR1cm4gc2VydmljZUltcGxCZWFuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VydmljZUltcGxCZWFuKFNlcnZpY2VJbXBsQmVhbiBuZXdTZXJ2aWNlSW1wbEJlYW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VydmljZUltcGxCZWFuIG9sZFNlcnZpY2VJbXBsQmVhbiA9IHNlcnZpY2VJbXBsQmVhbjsKLQkJc2VydmljZUltcGxCZWFuID0gbmV3U2VydmljZUltcGxCZWFuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU4sIG9sZFNlcnZpY2VJbXBsQmVhbiwgbmV3U2VydmljZUltcGxCZWFuKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbXBsQmVhbihTZXJ2aWNlSW1wbEJlYW4gbmV3U2VydmljZUltcGxCZWFuKSB7Ci0JCWlmIChuZXdTZXJ2aWNlSW1wbEJlYW4gIT0gc2VydmljZUltcGxCZWFuKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZXJ2aWNlSW1wbEJlYW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUltcGxCZWFuKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZXJ2aWNlSW1wbEJlYW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VydmljZUltcGxCZWFuKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlcnZpY2VJbXBsQmVhbihuZXdTZXJ2aWNlSW1wbEJlYW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOLCBuZXdTZXJ2aWNlSW1wbEJlYW4sIG5ld1NlcnZpY2VJbXBsQmVhbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldEhhbmRsZXJzKCkgewotCQlpZiAoaGFuZGxlcnMgPT0gbnVsbCkgewotCQkJaGFuZGxlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSGFuZGxlci5jbGFzcywgdGhpcywgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRGVzY3JpcHRpb25UeXBlIGdldERlc2NyaXB0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgbmV3RGVzY3JpcHRpb25UeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURlc2NyaXB0aW9uVHlwZSBvbGREZXNjcmlwdGlvblR5cGUgPSBkZXNjcmlwdGlvblR5cGU7Ci0JCWRlc2NyaXB0aW9uVHlwZSA9IG5ld0Rlc2NyaXB0aW9uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUsIG9sZERlc2NyaXB0aW9uVHlwZSwgbmV3RGVzY3JpcHRpb25UeXBlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgbmV3RGVzY3JpcHRpb25UeXBlKSB7Ci0JCWlmIChuZXdEZXNjcmlwdGlvblR5cGUgIT0gZGVzY3JpcHRpb25UeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkZXNjcmlwdGlvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVzY3JpcHRpb25UeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Rlc2NyaXB0aW9uVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZXNjcmlwdGlvblR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREZXNjcmlwdGlvblR5cGUobmV3RGVzY3JpcHRpb25UeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFLCBuZXdEZXNjcmlwdGlvblR5cGUsIG5ld0Rlc2NyaXB0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIERpc3BsYXlOYW1lVHlwZSBnZXREaXNwbGF5TmFtZVR5cGUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlIG5ld0Rpc3BsYXlOYW1lVHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaXNwbGF5TmFtZVR5cGUgb2xkRGlzcGxheU5hbWVUeXBlID0gZGlzcGxheU5hbWVUeXBlOwotCQlkaXNwbGF5TmFtZVR5cGUgPSBuZXdEaXNwbGF5TmFtZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRSwgb2xkRGlzcGxheU5hbWVUeXBlLCBuZXdEaXNwbGF5TmFtZVR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBuZXdEaXNwbGF5TmFtZVR5cGUpIHsKLQkJaWYgKG5ld0Rpc3BsYXlOYW1lVHlwZSAhPSBkaXNwbGF5TmFtZVR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRpc3BsYXlOYW1lVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkaXNwbGF5TmFtZVR5cGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Rpc3BsYXlOYW1lVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEaXNwbGF5TmFtZVR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlzcGxheU5hbWVUeXBlKG5ld0Rpc3BsYXlOYW1lVHlwZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUsIG5ld0Rpc3BsYXlOYW1lVHlwZSwgbmV3RGlzcGxheU5hbWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSWNvblR5cGUgZ2V0SWNvblR5cGUoKSB7Ci0JCXJldHVybiBpY29uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEljb25UeXBlKEljb25UeXBlIG5ld0ljb25UeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUljb25UeXBlIG9sZEljb25UeXBlID0gaWNvblR5cGU7Ci0JCWljb25UeXBlID0gbmV3SWNvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUsIG9sZEljb25UeXBlLCBuZXdJY29uVHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJY29uVHlwZShJY29uVHlwZSBuZXdJY29uVHlwZSkgewotCQlpZiAobmV3SWNvblR5cGUgIT0gaWNvblR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGljb25UeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWljb25UeXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SWNvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SWNvblR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEljb25UeXBlKG5ld0ljb25UeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUsIG5ld0ljb25UeXBlLCBuZXdJY29uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsUG9ydChudWxsLCBtc2dzKTsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0U2VydmljZUltcGxCZWFuKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEhhbmRsZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCQlyZXR1cm4gYmFzaWNTZXREZXNjcmlwdGlvblR5cGUobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEU6Ci0JCQkJCXJldHVybiBiYXNpY1NldERpc3BsYXlOYW1lVHlwZShudWxsLCBtc2dzKTsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEU6Ci0JCQkJCXJldHVybiBiYXNpY1NldEljb25UeXBlKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FOgotCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50TmFtZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU01BTExfSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U21hbGxJY29uKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUOgotCQkJCXJldHVybiBnZXRXc2RsUG9ydCgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU46Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VJbXBsQmVhbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUlM6Ci0JCQkJcmV0dXJuIGdldEhhbmRsZXJzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvblR5cGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZVR5cGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0SWNvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BPUlRfQ09NUE9ORU5UX05BTUU6Ci0JCQkJc2V0UG9ydENvbXBvbmVudE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQ6Ci0JCQkJc2V0V3NkbFBvcnQoKFdTRExQb3J0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0lNUExfQkVBTjoKLQkJCQlzZXRTZXJ2aWNlSW1wbEJlYW4oKFNlcnZpY2VJbXBsQmVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUlM6Ci0JCQkJZ2V0SGFuZGxlcnMoKS5jbGVhcigpOwotCQkJCWdldEhhbmRsZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXNldERlc2NyaXB0aW9uVHlwZSgoRGVzY3JpcHRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlzZXREaXNwbGF5TmFtZVR5cGUoKERpc3BsYXlOYW1lVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFOgotCQkJCXNldEljb25UeXBlKChJY29uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRToKLQkJCQlzZXRQb3J0Q29tcG9uZW50TmFtZShQT1JUX0NPTVBPTkVOVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQ6Ci0JCQkJc2V0V3NkbFBvcnQoKFdTRExQb3J0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOOgotCQkJCXNldFNlcnZpY2VJbXBsQmVhbigoU2VydmljZUltcGxCZWFuKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTOgotCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXNldERlc2NyaXB0aW9uVHlwZSgoRGVzY3JpcHRpb25UeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXNldERpc3BsYXlOYW1lVHlwZSgoRGlzcGxheU5hbWVUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRToKLQkJCQlzZXRJY29uVHlwZSgoSWNvblR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BPUlRfQ09NUE9ORU5UX05BTUU6Ci0JCQkJcmV0dXJuIFBPUlRfQ09NUE9ORU5UX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnRDb21wb25lbnROYW1lICE9IG51bGwgOiAhUE9SVF9DT01QT05FTlRfTkFNRV9FREVGQVVMVC5lcXVhbHMocG9ydENvbXBvbmVudE5hbWUpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCA6ICFTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVDoKLQkJCQlyZXR1cm4gd3NkbFBvcnQgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOOgotCQkJCXJldHVybiBzZXJ2aWNlSW1wbEJlYW4gIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTOgotCQkJCXJldHVybiBoYW5kbGVycyAhPSBudWxsICYmICFoYW5kbGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXJldHVybiBkZXNjcmlwdGlvblR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZVR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRToKLQkJCQlyZXR1cm4gaWNvblR5cGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocG9ydENvbXBvbmVudE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvcnRDb21wb25lbnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc21hbGxJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzbWFsbEljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFyZ2VJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpc3BsYXlOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaXNwbGF5TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvcnRDb21wb25lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbEJlYW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbEJlYW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOWNmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvU2VydmljZUltcGxCZWFuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIEltcGwgQmVhbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmljZUltcGxCZWFuSW1wbCNnZXRFRUpCTGluayA8ZW0+RUVKQiBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbEJlYW5JbXBsI2dldEVTZXJ2bGV0TGluayA8ZW0+RVNlcnZsZXQgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuU2VydmljZUltcGxCZWFuSW1wbCNnZXRCZWFuTGluayA8ZW0+QmVhbiBMaW5rPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUltcGxCZWFuSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU2VydmljZUltcGxCZWFuCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUVKQkxpbmsoKSA8ZW0+RUVKQiBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RUVKQkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUpCTGluayBlRUpCTGluayA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFU2VydmxldExpbmsoKSA8ZW0+RVNlcnZsZXQgTGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVTZXJ2bGV0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTZXJ2bGV0TGluayBlU2VydmxldExpbmsgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmVhbkxpbmsoKSA8ZW0+QmVhbiBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmVhbkxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgQmVhbkxpbmsgYmVhbkxpbmsgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgU2VydmljZUltcGxCZWFuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVKQkxpbmsgZ2V0RUVKQkxpbmsoKSB7Ci0JCXJldHVybiBlRUpCTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVFSkJMaW5rKEVKQkxpbmsgbmV3RUVKQkxpbmssIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRUpCTGluayBvbGRFRUpCTGluayA9IGVFSkJMaW5rOwotCQllRUpCTGluayA9IG5ld0VFSkJMaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LLCBvbGRFRUpCTGluaywgbmV3RUVKQkxpbmspOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RUVKQkxpbmsoRUpCTGluayBuZXdFRUpCTGluaykgewotCQlpZiAobmV3RUVKQkxpbmsgIT0gZUVKQkxpbmspIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVFSkJMaW5rICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVFSkJMaW5rKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RUVKQkxpbmsgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RUVKQkxpbmspLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVFSkJMaW5rKG5ld0VFSkJMaW5rLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTkssIG5ld0VFSkJMaW5rLCBuZXdFRUpCTGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFNlcnZsZXRMaW5rIGdldEVTZXJ2bGV0TGluaygpIHsKLQkJcmV0dXJuIGVTZXJ2bGV0TGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVTZXJ2bGV0TGluayhTZXJ2bGV0TGluayBuZXdFU2VydmxldExpbmssIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VydmxldExpbmsgb2xkRVNlcnZsZXRMaW5rID0gZVNlcnZsZXRMaW5rOwotCQllU2VydmxldExpbmsgPSBuZXdFU2VydmxldExpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LLCBvbGRFU2VydmxldExpbmssIG5ld0VTZXJ2bGV0TGluayk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRFU2VydmxldExpbmsoU2VydmxldExpbmsgbmV3RVNlcnZsZXRMaW5rKSB7Ci0JCWlmIChuZXdFU2VydmxldExpbmsgIT0gZVNlcnZsZXRMaW5rKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlU2VydmxldExpbmsgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZVNlcnZsZXRMaW5rKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTkssIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0VTZXJ2bGV0TGluayAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFU2VydmxldExpbmspLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFU2VydmxldExpbmsobmV3RVNlcnZsZXRMaW5rLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LLCBuZXdFU2VydmxldExpbmssIG5ld0VTZXJ2bGV0TGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEJlYW5MaW5rIGdldEJlYW5MaW5rKCkgewotCQlyZXR1cm4gYmVhbkxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCZWFuTGluayhCZWFuTGluayBuZXdCZWFuTGluaywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlCZWFuTGluayBvbGRCZWFuTGluayA9IGJlYW5MaW5rOwotCQliZWFuTGluayA9IG5ld0JlYW5MaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LLCBvbGRCZWFuTGluaywgbmV3QmVhbkxpbmspOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0QmVhbkxpbmsoQmVhbkxpbmsgbmV3QmVhbkxpbmspIHsKLQkJaWYgKG5ld0JlYW5MaW5rICE9IGJlYW5MaW5rKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiZWFuTGluayAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCliZWFuTGluaykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTkssIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0JlYW5MaW5rICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0JlYW5MaW5rKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCZWFuTGluayhuZXdCZWFuTGluaywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LLCBuZXdCZWFuTGluaywgbmV3QmVhbkxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RUVKQkxpbmsobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RVNlcnZsZXRMaW5rKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QmVhbkxpbmsobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKLQkJCQlyZXR1cm4gZ2V0RUVKQkxpbmsoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VTRVJWTEVUX0xJTks6Ci0JCQkJcmV0dXJuIGdldEVTZXJ2bGV0TGluaygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LOgotCQkJCXJldHVybiBnZXRCZWFuTGluaygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LOgotCQkJCXNldEVFSkJMaW5rKChFSkJMaW5rKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LOgotCQkJCXNldEVTZXJ2bGV0TGluaygoU2VydmxldExpbmspbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSzoKLQkJCQlzZXRCZWFuTGluaygoQmVhbkxpbmspbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKLQkJCQlzZXRFRUpCTGluaygoRUpCTGluayludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LOgotCQkJCXNldEVTZXJ2bGV0TGluaygoU2VydmxldExpbmspbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LOgotCQkJCXNldEJlYW5MaW5rKChCZWFuTGluayludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LOgotCQkJCXJldHVybiBlRUpCTGluayAhPSBudWxsOwotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSzoKLQkJCQlyZXR1cm4gZVNlcnZsZXRMaW5rICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTks6Ci0JCQkJcmV0dXJuIGJlYW5MaW5rICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1NlcnZpY2VJbXBsQmVhbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZsZXRMaW5rSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvU2VydmxldExpbmtJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZWE5YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvU2VydmxldExpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2bGV0IExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlNlcnZsZXRMaW5rSW1wbCNnZXRTZXJ2bGV0TGluayA8ZW0+U2VydmxldCBMaW5rPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldExpbmtJbXBsIGV4dGVuZHMgQmVhbkxpbmtJbXBsIGltcGxlbWVudHMgU2VydmxldExpbmsKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmxldExpbmsoKSA8ZW0+U2VydmxldCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0xJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmxldExpbmsoKSA8ZW0+U2VydmxldCBMaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmxldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZsZXRMaW5rID0gU0VSVkxFVF9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgU2VydmxldExpbmtJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldExpbmsoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldExpbmsoKSB7Ci0JCXJldHVybiBzZXJ2bGV0TGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRMaW5rKFN0cmluZyBuZXdTZXJ2bGV0TGluaykgewotCQlTdHJpbmcgb2xkU2VydmxldExpbmsgPSBzZXJ2bGV0TGluazsKLQkJc2VydmxldExpbmsgPSBuZXdTZXJ2bGV0TGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuU0VSVkxFVF9MSU5LX19TRVJWTEVUX0xJTkssIG9sZFNlcnZsZXRMaW5rLCBzZXJ2bGV0TGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSzoKLQkJCQlyZXR1cm4gZ2V0U2VydmxldExpbmsoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVkxFVF9MSU5LX19TRVJWTEVUX0xJTks6Ci0JCQkJc2V0U2VydmxldExpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSzoKLQkJCQlzZXRTZXJ2bGV0TGluayhTRVJWTEVUX0xJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LOgotCQkJCXJldHVybiBTRVJWTEVUX0xJTktfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZsZXRMaW5rICE9IG51bGwgOiAhU0VSVkxFVF9MSU5LX0VERUZBVUxULmVxdWFscyhzZXJ2bGV0TGluayk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZsZXRMaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXJ2bGV0TGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlcnZsZXRMaW5rSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV1NETFBvcnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwZTQwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgUG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQb3J0SW1wbCBleHRlbmRzIFFOYW1lSW1wbCBpbXBsZW1lbnRzIFdTRExQb3J0Ci17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFBvcnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFBvcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBnZXRMb2NhbFBhcnQoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUX19DT01CSU5FRF9RTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q29tYmluZWRRTmFtZSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XU0RMX1BPUlRfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XU0RMX1BPUlRfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUX19MT0NBTF9QQVJUOgotCQkJCXNldExvY2FsUGFydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfUE9SVF9fQ09NQklORURfUU5BTUU6Ci0JCQkJc2V0Q29tYmluZWRRTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfUE9SVF9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XU0RMX1BPUlRfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUX19MT0NBTF9QQVJUOgotCQkJCXNldExvY2FsUGFydChMT0NBTF9QQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfUE9SVF9fQ09NQklORURfUU5BTUU6Ci0JCQkJc2V0Q29tYmluZWRRTmFtZShDT01CSU5FRF9RTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XU0RMX1BPUlRfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfUE9SVF9fTkFNRVNQQUNFX1VSSToKLQkJCQlyZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBMT0NBTF9QQVJUX0VERUZBVUxUID09IG51bGwgPyBsb2NhbFBhcnQgIT0gbnVsbCA6ICFMT0NBTF9QQVJUX0VERUZBVUxULmVxdWFscyhsb2NhbFBhcnQpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XU0RMX1BPUlRfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBDT01CSU5FRF9RTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY29tYmluZWRRTmFtZSAhPSBudWxsIDogIUNPTUJJTkVEX1FOQU1FX0VERUZBVUxULmVxdWFscyhjb21iaW5lZFFOYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9QT1JUX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXJldHVybiBJTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJX0VERUZBVUxUID09IG51bGwgPyBpbnRlcm5hbFByZWZpeE9yTnNVUkkgIT0gbnVsbCA6ICFJTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJX0VERUZBVUxULmVxdWFscyhpbnRlcm5hbFByZWZpeE9yTnNVUkkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9XU0RMUG9ydEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0MDYyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldEpheHJwY01hcHBpbmdGaWxlIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0V3NkbEZpbGUgPGVtPldzZGwgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCNnZXRTbWFsbEljb24gPGVtPlNtYWxsIEljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0TGFyZ2VJY29uIDxlbT5MYXJnZSBJY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbCNnZXREaXNwbGF5TmFtZSA8ZW0+RGlzcGxheSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldFBvcnRDb21wb25lbnRzIDxlbT5Qb3J0IENvbXBvbmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0RGVzY3JpcHRpb25UeXBlIDxlbT5EZXNjcmlwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsI2dldERpc3BsYXlOYW1lVHlwZSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwjZ2V0SWNvblR5cGUgPGVtPkljb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VEZXNjcmlwdGlvbgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpIDxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpheHJwY01hcHBpbmdGaWxlKCkgPGVtPkpheHJwYyBNYXBwaW5nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXhycGNNYXBwaW5nRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgamF4cnBjTWFwcGluZ0ZpbGUgPSBKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUgPSBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlKCkgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlKCkgPGVtPldzZGwgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsRmlsZSA9IFdTRExfRklMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTbWFsbEljb24oKSA8ZW0+U21hbGwgSWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNtYWxsSWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQUxMX0lDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U21hbGxJY29uKCkgPGVtPlNtYWxsIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTbWFsbEljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNtYWxsSWNvbiA9IFNNQUxMX0lDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFyZ2VJY29uKCkgPGVtPkxhcmdlIEljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXJnZUljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJHRV9JQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhcmdlSWNvbigpIDxlbT5MYXJnZSBJY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFyZ2VJY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsYXJnZUljb24gPSBMQVJHRV9JQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lKCkgPGVtPkRpc3BsYXkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc3BsYXlOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IERJU1BMQVlfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRzKCkgPGVtPlBvcnQgQ29tcG9uZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgcG9ydENvbXBvbmVudHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25UeXBlKCkgPGVtPkRlc2NyaXB0aW9uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRGVzY3JpcHRpb25UeXBlIGRlc2NyaXB0aW9uVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZVR5cGUoKSA8ZW0+RGlzcGxheSBOYW1lIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNwbGF5TmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRGlzcGxheU5hbWVUeXBlIGRpc3BsYXlOYW1lVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29uVHlwZSgpIDxlbT5JY29uIFR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJY29uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBJY29uVHlwZSBpY29uVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldEpheHJwY01hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gamF4cnBjTWFwcGluZ0ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcgbmV3SmF4cnBjTWFwcGluZ0ZpbGUpIHsKLQkJU3RyaW5nIG9sZEpheHJwY01hcHBpbmdGaWxlID0gamF4cnBjTWFwcGluZ0ZpbGU7Ci0JCWpheHJwY01hcHBpbmdGaWxlID0gbmV3SmF4cnBjTWFwcGluZ0ZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFLCBvbGRKYXhycGNNYXBwaW5nRmlsZSwgamF4cnBjTWFwcGluZ0ZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKFN0cmluZyBuZXdXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lID0gd2ViU2VydmljZURlc2NyaXB0aW9uTmFtZTsKLQkJd2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSA9IG5ld1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FLCBvbGRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lLCB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxGaWxlKCkgewotCQlyZXR1cm4gd3NkbEZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZShTdHJpbmcgbmV3V3NkbEZpbGUpIHsKLQkJU3RyaW5nIG9sZFdzZGxGaWxlID0gd3NkbEZpbGU7Ci0JCXdzZGxGaWxlID0gbmV3V3NkbEZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XU0RMX0ZJTEUsIG9sZFdzZGxGaWxlLCB3c2RsRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTbWFsbEljb25HZW4oKSB7Ci0JCXJldHVybiBzbWFsbEljb247Ci0JfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotICAJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0gIAkJcmV0dXJuIGdldFNtYWxsSWNvbkdlbigpOwotICAJCi0gIAlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLSAgCQlyZXR1cm4gZ2V0U21hbGxJY29uR2VuKCk7IAotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0gIAlkZWZhdWx0IDoKLSAgCQlpZiAoZ2V0SWNvblR5cGUoKSAhPSBudWxsKQotICAJCQlyZXR1cm4gZ2V0SWNvblR5cGUoKS5nZXRTbWFsbEljb24oKTsKLSAgCX0KLSAgCXJldHVybiBudWxsOwotICB9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbkdlbihTdHJpbmcgbmV3U21hbGxJY29uKSB7Ci0JCVN0cmluZyBvbGRTbWFsbEljb24gPSBzbWFsbEljb247Ci0JCXNtYWxsSWNvbiA9IG5ld1NtYWxsSWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT04sIG9sZFNtYWxsSWNvbiwgc21hbGxJY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbkdlbigpIHsKLQkJcmV0dXJuIGxhcmdlSWNvbjsKLQl9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0gIAlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSAKLSAgCQlyZXR1cm4gZ2V0TGFyZ2VJY29uR2VuKCk7Ci0gIAkKLSAgCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotICAJCXJldHVybiBnZXRMYXJnZUljb25HZW4oKTsgCi0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLSAgCWRlZmF1bHQgOgotICAJCWlmIChnZXRJY29uVHlwZSgpICE9IG51bGwpCi0gIAkJCXJldHVybiBnZXRJY29uVHlwZSgpLmdldExhcmdlSWNvbigpOwotICAJfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uR2VuKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJU3RyaW5nIG9sZExhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQkJbGFyZ2VJY29uID0gbmV3TGFyZ2VJY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTiwgb2xkTGFyZ2VJY29uLCBsYXJnZUljb24pKTsKLQl9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRGVzY3JpcHRpb25Hcm91cCNnZXRKMkVFVmVyc2lvbklEKCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0gIAlpZiAocmVzID09IG51bGwpCi0gIAkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAJcmV0dXJuIHJlcy5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gIH0KLSAgCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uR2VuKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25HZW4oKTsKLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbkdlbigpOyAKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOgotCQkJaWYgKGdldERlc2NyaXB0aW9uVHlwZSgpICE9IG51bGwpCi0JCQkJcmV0dXJuICgoRGVzY3JpcHRpb24pZ2V0RGVzY3JpcHRpb25UeXBlKCkpLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbkdlbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotICAJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotICAJCXNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLSAgCQlpbnRlcm5hbFNldERlc2NyaXB0aW9uVHlwZShuZXdEZXNjcmlwdGlvbik7Ci0gIAkJcmV0dXJuOwotICAJfQotICAJCi0gIAlzd2l0Y2ggKGdldEoyRUVWZXJzaW9uSUQoKSkgewotICAJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLSAgCQlzZXREZXNjcmlwdGlvbkdlbihuZXdEZXNjcmlwdGlvbik7Ci0gIAkJYnJlYWs7Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEIDoKLSAgCWRlZmF1bHQgOgotICAJCWludGVybmFsU2V0RGVzY3JpcHRpb25UeXBlKG5ld0Rlc2NyaXB0aW9uKTsgCi0gIAkJYnJlYWs7Ci0gIAl9Ci0gIH0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZUdlbigpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotICAJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgCi0gIAkJcmV0dXJuIGdldERpc3BsYXlOYW1lR2VuKCk7Ci0gIAkKLSAgCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotICAJCXJldHVybiBnZXREaXNwbGF5TmFtZUdlbigpOyAKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotICAJZGVmYXVsdCA6Ci0gIAkJaWYgKGdldERpc3BsYXlOYW1lVHlwZSgpICE9IG51bGwpCi0gIAkJCXJldHVybiAoKERpc3BsYXlOYW1lKWdldERpc3BsYXlOYW1lVHlwZSgpKS5nZXRWYWx1ZSgpOwotICAJfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWVHZW4oU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCVN0cmluZyBvbGREaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQlkaXNwbGF5TmFtZSA9IG5ld0Rpc3BsYXlOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FLCBvbGREaXNwbGF5TmFtZSwgZGlzcGxheU5hbWUpKTsKLQl9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0gIAlpZihlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0gIAkJc2V0RGlzcGxheU5hbWVHZW4obmV3RGlzcGxheU5hbWUpOwotICAJCWludGVybmFsU2V0RGlzcGxheU5hbWVUeXBlKG5ld0Rpc3BsYXlOYW1lKTsKLSAgCQlyZXR1cm47Ci0gIAl9Ci0gIAkKLSAgCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0gIAljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotICAJCXNldERpc3BsYXlOYW1lR2VuKG5ld0Rpc3BsYXlOYW1lKTsKLSAgCQlicmVhazsKLSAgCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotICAJZGVmYXVsdCA6Ci0gIAkJaW50ZXJuYWxTZXREaXNwbGF5TmFtZVR5cGUobmV3RGlzcGxheU5hbWUpOwotICAJCWJyZWFrOwotICAJfQotICB9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRQb3J0Q29tcG9uZW50cygpIHsKLQkJaWYgKHBvcnRDb21wb25lbnRzID09IG51bGwpIHsKLQkJCXBvcnRDb21wb25lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnRDb21wb25lbnQuY2xhc3MsIHRoaXMsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFMpOwotCQl9Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBEZXNjcmlwdGlvblR5cGUgZ2V0RGVzY3JpcHRpb25UeXBlKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSBuZXdEZXNjcmlwdGlvblR5cGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRGVzY3JpcHRpb25UeXBlIG9sZERlc2NyaXB0aW9uVHlwZSA9IGRlc2NyaXB0aW9uVHlwZTsKLQkJZGVzY3JpcHRpb25UeXBlID0gbmV3RGVzY3JpcHRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRSwgb2xkRGVzY3JpcHRpb25UeXBlLCBuZXdEZXNjcmlwdGlvblR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25UeXBlKERlc2NyaXB0aW9uVHlwZSBuZXdEZXNjcmlwdGlvblR5cGUpIHsKLQkJaWYgKG5ld0Rlc2NyaXB0aW9uVHlwZSAhPSBkZXNjcmlwdGlvblR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRlc2NyaXB0aW9uVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZXNjcmlwdGlvblR5cGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RGVzY3JpcHRpb25UeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Rlc2NyaXB0aW9uVHlwZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERlc2NyaXB0aW9uVHlwZShuZXdEZXNjcmlwdGlvblR5cGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUsIG5ld0Rlc2NyaXB0aW9uVHlwZSwgbmV3RGVzY3JpcHRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRGlzcGxheU5hbWVUeXBlIGdldERpc3BsYXlOYW1lVHlwZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpc3BsYXlOYW1lVHlwZShEaXNwbGF5TmFtZVR5cGUgbmV3RGlzcGxheU5hbWVUeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURpc3BsYXlOYW1lVHlwZSBvbGREaXNwbGF5TmFtZVR5cGUgPSBkaXNwbGF5TmFtZVR5cGU7Ci0JCWRpc3BsYXlOYW1lVHlwZSA9IG5ld0Rpc3BsYXlOYW1lVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFLCBvbGREaXNwbGF5TmFtZVR5cGUsIG5ld0Rpc3BsYXlOYW1lVHlwZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZVR5cGUoRGlzcGxheU5hbWVUeXBlIG5ld0Rpc3BsYXlOYW1lVHlwZSkgewotCQlpZiAobmV3RGlzcGxheU5hbWVUeXBlICE9IGRpc3BsYXlOYW1lVHlwZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGlzcGxheU5hbWVUeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRpc3BsYXlOYW1lVHlwZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RGlzcGxheU5hbWVUeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Rpc3BsYXlOYW1lVHlwZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREaXNwbGF5TmFtZVR5cGUobmV3RGlzcGxheU5hbWVUeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRSwgbmV3RGlzcGxheU5hbWVUeXBlLCBuZXdEaXNwbGF5TmFtZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBJY29uVHlwZSBnZXRJY29uVHlwZSgpIHsKLQkJcmV0dXJuIGljb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SWNvblR5cGUoSWNvblR5cGUgbmV3SWNvblR5cGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJSWNvblR5cGUgb2xkSWNvblR5cGUgPSBpY29uVHlwZTsKLQkJaWNvblR5cGUgPSBuZXdJY29uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRSwgb2xkSWNvblR5cGUsIG5ld0ljb25UeXBlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEljb25UeXBlKEljb25UeXBlIG5ld0ljb25UeXBlKSB7Ci0JCWlmIChuZXdJY29uVHlwZSAhPSBpY29uVHlwZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaWNvblR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaWNvblR5cGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJY29uVHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJY29uVHlwZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SWNvblR5cGUobmV3SWNvblR5cGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRSwgbmV3SWNvblR5cGUsIG5ld0ljb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9ydENvbXBvbmVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEU6Ci0JCQkJCXJldHVybiBiYXNpY1NldERlc2NyaXB0aW9uVHlwZShudWxsLCBtc2dzKTsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RGlzcGxheU5hbWVUeXBlKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0SWNvblR5cGUobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldEpheHJwY01hcHBpbmdGaWxlKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FOgotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XU0RMX0ZJTEU6Ci0JCQkJcmV0dXJuIGdldFdzZGxGaWxlKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0xBUkdFX0lDT046Ci0JCQkJcmV0dXJuIGdldExhcmdlSWNvbigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFM6Ci0JCQkJcmV0dXJuIGdldFBvcnRDb21wb25lbnRzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvblR5cGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFOgotCQkJCXJldHVybiBnZXREaXNwbGF5TmFtZVR5cGUoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0SWNvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJc2V0SmF4cnBjTWFwcGluZ0ZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRToKLQkJCQlzZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRToKLQkJCQlzZXRXc2RsRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OOgotCQkJCXNldFNtYWxsSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTOgotCQkJCWdldFBvcnRDb21wb25lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0Q29tcG9uZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlzZXREZXNjcmlwdGlvblR5cGUoKERlc2NyaXB0aW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEU6Ci0JCQkJc2V0RGlzcGxheU5hbWVUeXBlKChEaXNwbGF5TmFtZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0lDT05fVFlQRToKLQkJCQlzZXRJY29uVHlwZSgoSWNvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0pBWFJQQ19NQVBQSU5HX0ZJTEU6Ci0JCQkJc2V0SmF4cnBjTWFwcGluZ0ZpbGUoSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRToKLQkJCQlzZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dTRExfRklMRToKLQkJCQlzZXRXc2RsRmlsZShXU0RMX0ZJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0xBUkdFX0lDT046Ci0JCQkJc2V0TGFyZ2VJY29uKExBUkdFX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFM6Ci0JCQkJZ2V0UG9ydENvbXBvbmVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEU6Ci0JCQkJc2V0RGVzY3JpcHRpb25UeXBlKChEZXNjcmlwdGlvblR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEU6Ci0JCQkJc2V0RGlzcGxheU5hbWVUeXBlKChEaXNwbGF5TmFtZVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFOgotCQkJCXNldEljb25UeXBlKChJY29uVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRToKLQkJCQlyZXR1cm4gSkFYUlBDX01BUFBJTkdfRklMRV9FREVGQVVMVCA9PSBudWxsID8gamF4cnBjTWFwcGluZ0ZpbGUgIT0gbnVsbCA6ICFKQVhSUENfTUFQUElOR19GSUxFX0VERUZBVUxULmVxdWFscyhqYXhycGNNYXBwaW5nRmlsZSk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FOgotCQkJCXJldHVybiBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lICE9IG51bGwgOiAhV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMod2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19XU0RMX0ZJTEU6Ci0JCQkJcmV0dXJuIFdTRExfRklMRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbEZpbGUgIT0gbnVsbCA6ICFXU0RMX0ZJTEVfRURFRkFVTFQuZXF1YWxzKHdzZGxGaWxlKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBMQVJHRV9JQ09OX0VERUZBVUxUID09IG51bGwgPyBsYXJnZUljb24gIT0gbnVsbCA6ICFMQVJHRV9JQ09OX0VERUZBVUxULmVxdWFscyhsYXJnZUljb24pOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1BPUlRfQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gcG9ydENvbXBvbmVudHMgIT0gbnVsbCAmJiAhcG9ydENvbXBvbmVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fREVTQ1JJUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gZGVzY3JpcHRpb25UeXBlICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gZGlzcGxheU5hbWVUeXBlICE9IG51bGw7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEU6Ci0JCQkJcmV0dXJuIGljb25UeXBlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGpheHJwY01hcHBpbmdGaWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqYXhycGNNYXBwaW5nRmlsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd2ViU2VydmljZURlc2NyaXB0aW9uTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbEZpbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzbWFsbEljb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNtYWxsSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFyZ2VJY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXJnZUljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGxheU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpc3BsYXlOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0Rlc2NyaXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXREZXNjcmlwdGlvblR5cGUoU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCURlc2NyaXB0aW9uVHlwZSBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmKGdldERlc2NyaXB0aW9uVHlwZSgpICE9IG51bGwpIHsKLQkJCW5ld1ZhbHVlID0gZ2V0RGVzY3JpcHRpb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdWYWx1ZSA9IFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRWYWx1ZShuZXdEZXNjcmlwdGlvbik7Ci0JCQlzZXREZXNjcmlwdGlvblR5cGUobmV3VmFsdWUpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEaXNwbGF5TmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0RGlzcGxheU5hbWVUeXBlKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQlEaXNwbGF5TmFtZVR5cGUgbmV3VmFsdWUgPSBudWxsOwotCQlpZihnZXREaXNwbGF5TmFtZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQluZXdWYWx1ZSA9IGdldERpc3BsYXlOYW1lVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0VmFsdWUobmV3RGlzcGxheU5hbWUpOwotCQl9Ci0JCWVsc2UgIHsKLQkJCW5ld1ZhbHVlID0gV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldFZhbHVlKG5ld0Rpc3BsYXlOYW1lKTsKLQkJCXNldERpc3BsYXlOYW1lVHlwZShuZXdWYWx1ZSk7Ci0JCX0JCQkgIAotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TGFyZ2VJY29uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTZXRMYXJnZUljb25UeXBlKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJSWNvblR5cGUgbmV3VmFsdWUgPSBudWxsOwotCQlpZihnZXRJY29uVHlwZSgpICE9IG51bGwpIHsKLQkJCW5ld1ZhbHVlID0gZ2V0SWNvblR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldExhcmdlSWNvbihuZXdMYXJnZUljb24pOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3VmFsdWUgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpOwotCQkJbmV3VmFsdWUuc2V0TGFyZ2VJY29uKG5ld0xhcmdlSWNvbik7Ci0JCQlzZXRJY29uVHlwZShuZXdWYWx1ZSk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1NtYWxsSWNvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsU2V0U21hbGxJY29uVHlwZShTdHJpbmcgbmV3U21hbGxJY29uKSB7Ci0JCUljb25UeXBlIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYoZ2V0SWNvblR5cGUoKSAhPSBudWxsKSB7Ci0JCQluZXdWYWx1ZSA9IGdldEljb25UeXBlKCk7Ci0JCQluZXdWYWx1ZS5zZXRTbWFsbEljb24obmV3U21hbGxJY29uKTsKLQkJfQotCQllbHNlIHsKLQkJCW5ld1ZhbHVlID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKTsKLQkJCW5ld1ZhbHVlLnNldFNtYWxsSWNvbihuZXdTbWFsbEljb24pOwotCQkJc2V0SWNvblR5cGUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBuZXdMYXJnZUljb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0JCQlpbnRlcm5hbFNldExhcmdlSWNvblR5cGUobmV3TGFyZ2VJY29uKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIHsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCWRlZmF1bHQgOiAKLQkJCWludGVybmFsU2V0TGFyZ2VJY29uVHlwZShuZXdMYXJnZUljb24pOyAKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBuZXdTbWFsbEljb24pIHsKLQkJaWYoZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0JCQlpbnRlcm5hbFNldFNtYWxsSWNvblR5cGUobmV3U21hbGxJY29uKTsgCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCXNldFNtYWxsSWNvbkdlbihuZXdTbWFsbEljb24pOwotCQkJYnJlYWs7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQlkZWZhdWx0IDogCi0JCQlpbnRlcm5hbFNldFNtYWxsSWNvblR5cGUobmV3U21hbGxJY29uKTsgCi0JCQlicmVhazsKLQkJfQotCX0KLQotfSAvL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTNkYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWIgU2VydmljZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzSW1wbCNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zIDxlbT5XZWIgU2VydmljZSBEZXNjcmlwdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0ltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlcwotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHdlYlNlcnZpY2VEZXNjcmlwdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV2ViU2VydmljZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXMoKTsKLQl9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKLSAgCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKLSAgfQotICAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkgewotCQlpZiAod2ViU2VydmljZURlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlMpOwotCQl9Ci0JCXJldHVybiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX0lDT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fRElTUExBWV9OQU1FUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19ERVNDUklQVElPTlM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fSUNPTlM6Ci0JCQkJcmV0dXJuIGdldEljb25zKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19TTUFMTF9JQ09OOgotCQkJCXJldHVybiBnZXRTbWFsbEljb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19MQVJHRV9JQ09OOgotCQkJCXJldHVybiBnZXRMYXJnZUljb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIGdldERpc3BsYXlOYW1lKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fSUNPTlM6Ci0JCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fRElTUExBWV9OQU1FUzoKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX0RFU0NSSVBUSU9OUzoKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX0RJU1BMQVlfTkFNRToKLQkJCQlzZXREaXNwbGF5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgotCQkJCWdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19JQ09OUzoKLQkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fREVTQ1JJUFRJT05TOgotCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1NNQUxMX0lDT046Ci0JCQkJc2V0U21hbGxJY29uKFNNQUxMX0lDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19MQVJHRV9JQ09OOgotCQkJCXNldExhcmdlSWNvbihMQVJHRV9JQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19ESVNQTEFZX05BTUU6Ci0JCQkJc2V0RGlzcGxheU5hbWUoRElTUExBWV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgotCQkJCWdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fSUNPTlM6Ci0JCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiBkaXNwbGF5TmFtZXMgIT0gbnVsbCAmJiAhZGlzcGxheU5hbWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1NNQUxMX0lDT046Ci0JCQkJcmV0dXJuIFNNQUxMX0lDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNtYWxsSWNvbiAhPSBudWxsIDogIVNNQUxMX0lDT05fRURFRkFVTFQuZXF1YWxzKHNtYWxsSWNvbik7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fTEFSR0VfSUNPTjoKLQkJCQlyZXR1cm4gTEFSR0VfSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbGFyZ2VJY29uICE9IG51bGwgOiAhTEFSR0VfSUNPTl9FREVGQVVMVC5lcXVhbHMobGFyZ2VJY29uKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19ESVNQTEFZX05BTUU6Ci0JCQkJcmV0dXJuIERJU1BMQVlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGlzcGxheU5hbWUgIT0gbnVsbCA6ICFESVNQTEFZX05BTUVfRURFRkFVTFQuZXF1YWxzKGRpc3BsYXlOYW1lKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuIHdlYlNlcnZpY2VEZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhd2ViU2VydmljZURlc2NyaXB0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1dlYlNlcnZpY2VzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmYmE3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2RkRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBXc2RkRmFjdG9yeQotewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3NkZEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTOiByZXR1cm4gY3JlYXRlV2ViU2VydmljZXMoKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT046IHJldHVybiBjcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlQ6IHJldHVybiBjcmVhdGVQb3J0Q29tcG9uZW50KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfUE9SVDogcmV0dXJuIGNyZWF0ZVdTRExQb3J0KCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOOiByZXR1cm4gY3JlYXRlU2VydmljZUltcGxCZWFuKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOSzogcmV0dXJuIGNyZWF0ZVNlcnZsZXRMaW5rKCk7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LOiByZXR1cm4gY3JlYXRlRUpCTGluaygpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSOiByZXR1cm4gY3JlYXRlSGFuZGxlcigpOwotCQkJY2FzZSBXc2RkUGFja2FnZS5CRUFOX0xJTks6IHJldHVybiBjcmVhdGVCZWFuTGluaygpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV2ViU2VydmljZXMgY3JlYXRlV2ViU2VydmljZXMoKSB7Ci0JCVdlYlNlcnZpY2VzSW1wbCB3ZWJTZXJ2aWNlcyA9IG5ldyBXZWJTZXJ2aWNlc0ltcGwoKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBjcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0JCVdlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwgd2ViU2VydmljZURlc2NyaXB0aW9uID0gbmV3IFdlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBQb3J0Q29tcG9uZW50IGNyZWF0ZVBvcnRDb21wb25lbnQoKSB7Ci0JCVBvcnRDb21wb25lbnRJbXBsIHBvcnRDb21wb25lbnQgPSBuZXcgUG9ydENvbXBvbmVudEltcGwoKTsKLQkJcmV0dXJuIHBvcnRDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETFBvcnQgY3JlYXRlV1NETFBvcnQoKSB7Ci0JCVdTRExQb3J0SW1wbCB3c2RsUG9ydCA9IG5ldyBXU0RMUG9ydEltcGwoKTsKLQkJcmV0dXJuIHdzZGxQb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFNlcnZpY2VJbXBsQmVhbiBjcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKSB7Ci0JCVNlcnZpY2VJbXBsQmVhbkltcGwgc2VydmljZUltcGxCZWFuID0gbmV3IFNlcnZpY2VJbXBsQmVhbkltcGwoKTsKLQkJcmV0dXJuIHNlcnZpY2VJbXBsQmVhbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2bGV0TGluayBjcmVhdGVTZXJ2bGV0TGluaygpIHsKLQkJU2VydmxldExpbmtJbXBsIHNlcnZsZXRMaW5rID0gbmV3IFNlcnZsZXRMaW5rSW1wbCgpOwotCQlyZXR1cm4gc2VydmxldExpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUpCTGluayBjcmVhdGVFSkJMaW5rKCkgewotCQlFSkJMaW5rSW1wbCBlamJMaW5rID0gbmV3IEVKQkxpbmtJbXBsKCk7Ci0JCXJldHVybiBlamJMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEhhbmRsZXIgY3JlYXRlSGFuZGxlcigpIHsKLQkJSGFuZGxlckltcGwgaGFuZGxlciA9IG5ldyBIYW5kbGVySW1wbCgpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmVhbkxpbmsgY3JlYXRlQmVhbkxpbmsoKSB7Ci0JCUJlYW5MaW5rSW1wbCBiZWFuTGluayA9IG5ldyBCZWFuTGlua0ltcGwoKTsKLQkJcmV0dXJuIGJlYW5MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdzZGRQYWNrYWdlIGdldFdzZGRQYWNrYWdlKCkgewotCQlyZXR1cm4gKFdzZGRQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgV3NkZFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Xc2RkRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjQwZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhUmVmUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzZGRQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdzZGRQYWNrYWdlCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3ZWJTZXJ2aWNlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHBvcnRDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsUG9ydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNlcnZpY2VJbXBsQmVhbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNlcnZsZXRMaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgZWpiTGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGhhbmRsZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBiZWFuTGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgV3NkZFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgV3NkZFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdzZGRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXc2RkUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2VJbXBsLmluaXQoKTsKLQkJSmF2YVJlZlBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShUYWdsaWJQYWNrYWdlLmVOU19VUkkpIDogVGFnbGliUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVXc2RkUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlV3NkZFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFdlYlNlcnZpY2VzKCkgewotCQlyZXR1cm4gd2ViU2VydmljZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0pheHJwY01hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fU21hbGxJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fTGFyZ2VJY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWVUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFBvcnRDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFdTRExQb3J0KCkgewotCQlyZXR1cm4gd3NkbFBvcnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFNlcnZpY2VJbXBsQmVhbigpIHsKLQkJcmV0dXJuIHNlcnZpY2VJbXBsQmVhbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VJbXBsQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZpY2VJbXBsQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmljZUltcGxCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldFNlcnZsZXRMaW5rKCkgewotCQlyZXR1cm4gc2VydmxldExpbmtFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRMaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUNsYXNzIGdldEVKQkxpbmsoKSB7Ci0JCXJldHVybiBlamJMaW5rRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCTGlua19FamJMaW5rKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVDbGFzcyBnZXRIYW5kbGVyKCkgewotCQlyZXR1cm4gaGFuZGxlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQXR0cmlidXRlIGdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSloYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldEhhbmRsZXJfSW5pdFBhcmFtcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFUmVmZXJlbmNlIGdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSloYW5kbGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRIYW5kbGVyX1NvYXBSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWhhbmRsZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0QmVhbkxpbmsoKSB7Ci0JCXJldHVybiBiZWFuTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2RkRmFjdG9yeSBnZXRXc2RkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChXc2RkRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJd2ViU2VydmljZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX1NFUlZJQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlc0VDbGFzcywgV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlMpOwotCi0JCXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfU0VSVklDRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19TTUFMTF9JQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19MQVJHRV9JQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RJU1BMQVlfTkFNRV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFdFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19JQ09OX1RZUEUpOwotCi0JCXBvcnRDb21wb25lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVF9DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19TTUFMTF9JQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fTEFSR0VfSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19IQU5ETEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0lDT05fVFlQRSk7Ci0KLQkJd3NkbFBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETF9QT1JUKTsKLQotCQlzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVklDRV9JTVBMX0JFQU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VJbXBsQmVhbkVDbGFzcywgU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUltcGxCZWFuRUNsYXNzLCBTRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZUltcGxCZWFuRUNsYXNzLCBTRVJWSUNFX0lNUExfQkVBTl9fQkVBTl9MSU5LKTsKLQotCQlzZXJ2bGV0TGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWTEVUX0xJTkspOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRMaW5rRUNsYXNzLCBTRVJWTEVUX0xJTktfX1NFUlZMRVRfTElOSyk7Ci0KLQkJZWpiTGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFSkJfTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWpiTGlua0VDbGFzcywgRUpCX0xJTktfX0VKQl9MSU5LKTsKLQotCQloYW5kbGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhBTkRMRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX0hBTkRMRVJfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaGFuZGxlckVDbGFzcywgSEFORExFUl9fSEFORExFUl9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaGFuZGxlckVDbGFzcywgSEFORExFUl9fSU5JVF9QQVJBTVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGhhbmRsZXJFQ2xhc3MsIEhBTkRMRVJfX1NPQVBfSEVBREVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaGFuZGxlckVDbGFzcywgSEFORExFUl9fU09BUF9ST0xFUyk7Ci0KLQkJYmVhbkxpbmtFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQkVBTl9MSU5LKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl3ZWJTZXJ2aWNlc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQl3c2RsUG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCkpOwotCQlzZXJ2bGV0TGlua0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJlYW5MaW5rKCkpOwotCQllamJMaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmVhbkxpbmsoKSk7Ci0JCWhhbmRsZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHdlYlNlcnZpY2VzRUNsYXNzLCBXZWJTZXJ2aWNlcy5jbGFzcywgIldlYlNlcnZpY2VzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCksIG51bGwsICJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIiwgbnVsbCwgMSwgLTEsIFdlYlNlcnZpY2VzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2ViU2VydmljZURlc2NyaXB0aW9uRUNsYXNzLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9KYXhycGNNYXBwaW5nRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF4cnBjTWFwcGluZ0ZpbGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV3NkbEZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxGaWxlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fU21hbGxJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9MYXJnZUljb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxhcmdlSWNvbiIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNwbGF5TmFtZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1BvcnRDb21wb25lbnRzKCksIHRoaXMuZ2V0UG9ydENvbXBvbmVudCgpLCBudWxsLCAicG9ydENvbXBvbmVudHMiLCBudWxsLCAxLCAtMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvblR5cGUoKSwgbnVsbCwgImRlc2NyaXB0aW9uVHlwZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0RGlzcGxheU5hbWVUeXBlKCksIG51bGwsICJkaXNwbGF5TmFtZVR5cGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpLCB0aGVDb21tb25QYWNrYWdlLmdldEljb25UeXBlKCksIG51bGwsICJpY29uVHlwZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBvcnRDb21wb25lbnQuY2xhc3MsICJQb3J0Q29tcG9uZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3J0Q29tcG9uZW50TmFtZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9MYXJnZUljb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxhcmdlSWNvbiIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCksIHRoaXMuZ2V0V1NETFBvcnQoKSwgbnVsbCwgIndzZGxQb3J0IiwgbnVsbCwgMSwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlSW1wbEJlYW4oKSwgdGhpcy5nZXRTZXJ2aWNlSW1wbEJlYW4oKSwgbnVsbCwgInNlcnZpY2VJbXBsQmVhbiIsIG51bGwsIDEsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKSwgdGhpcy5nZXRIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDAsIC0xLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uVHlwZSgpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25UeXBlKCksIG51bGwsICJkZXNjcmlwdGlvblR5cGUiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lVHlwZSgpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0RGlzcGxheU5hbWVUeXBlKCksIG51bGwsICJkaXNwbGF5TmFtZVR5cGUiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X0ljb25UeXBlKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0SWNvblR5cGUoKSwgbnVsbCwgImljb25UeXBlIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdzZGxQb3J0RUNsYXNzLCBXU0RMUG9ydC5jbGFzcywgIldTRExQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moc2VydmljZUltcGxCZWFuRUNsYXNzLCBTZXJ2aWNlSW1wbEJlYW4uY2xhc3MsICJTZXJ2aWNlSW1wbEJlYW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpLCB0aGlzLmdldEVKQkxpbmsoKSwgbnVsbCwgImVFSkJMaW5rIiwgbnVsbCwgMCwgMSwgU2VydmljZUltcGxCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCksIHRoaXMuZ2V0U2VydmxldExpbmsoKSwgbnVsbCwgImVTZXJ2bGV0TGluayIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbXBsQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCksIHRoaXMuZ2V0QmVhbkxpbmsoKSwgbnVsbCwgImJlYW5MaW5rIiwgbnVsbCwgMCwgMSwgU2VydmljZUltcGxCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VydmxldExpbmtFQ2xhc3MsIFNlcnZsZXRMaW5rLmNsYXNzLCAiU2VydmxldExpbmsiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2bGV0TGluayIsIG51bGwsIDAsIDEsIFNlcnZsZXRMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiTGlua0VDbGFzcywgRUpCTGluay5jbGFzcywgIkVKQkxpbmsiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQkxpbmtfRWpiTGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWpiTGluayIsIG51bGwsIDAsIDEsIEVKQkxpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhoYW5kbGVyRUNsYXNzLCBIYW5kbGVyLmNsYXNzLCAiSGFuZGxlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaGFuZGxlck5hbWUiLCBudWxsLCAwLCAxLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaGFuZGxlckNsYXNzIiwgbnVsbCwgMCwgMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXRJbml0UGFyYW0oKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0U09BUEhlYWRlcigpLCBudWxsLCAic29hcEhlYWRlcnMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldFNPQVBSb2xlKCksIG51bGwsICJzb2FwUm9sZXMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGJlYW5MaW5rRUNsYXNzLCBCZWFuTGluay5jbGFzcywgIkJlYW5MaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9Xc2RkUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2MjdlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLndlYnNlcnZpY2VzLldzZGRUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgV3NkZFJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFdzZGRSZXNvdXJjZQotewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBXc2RkUmVzb3VyY2VJbXBsLgotCSAqLwotCXB1YmxpYyBXc2RkUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFdzZGRSZXNvdXJjZUltcGwuCi0JICogQHBhcmFtIHVyaQotCSAqLwotCXB1YmxpYyBXc2RkUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzIGdldFdlYlNlcnZpY2VzKCkgewotCQlyZXR1cm4gKFdlYlNlcnZpY2VzKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldFJvb3RUcmFuc2xhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFdzZGRUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFdFQl9TRVJWSUNFX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0RG9jdHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgCi0JewotCSAgc3dpdGNoIChnZXRKMkVFVmVyc2lvbklEKCkpIAotCSAgewotCSAgICBjYXNlIChKMkVFXzFfMl9JRCkgOgotCSAgICBjYXNlIChKMkVFXzFfM19JRCkgOgkKLQkgICAgICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX0RPQ1RZUEU7Ci0JICAgIGRlZmF1bHQgOgotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLQl9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGlzV2ViU2VydmljZTFfMCgpCi0gICB7Ci0gICAgICByZXR1cm4gKGdldE1vZHVsZVZlcnNpb25JRCgpPT1XZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKTsKLSAgIH0KLQotICAgcHVibGljIGJvb2xlYW4gaXNXZWJTZXJ2aWNlMV8xKCkKLSAgIHsKLSAgICAgIHJldHVybiAoZ2V0TW9kdWxlVmVyc2lvbklEKCk9PVdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQpOyAgCi0gICB9Ci0KLQkvKiAKLQkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewotCXN1cGVyLnNldFZlcnNpb25JRChpZCk7Ci0Jc3dpdGNoIChpZCkgewotCQkJY2FzZSAoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRCkgOgotCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfM19QdWJsaWNJRCgpLCBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpKTsKLQkJCQlicmVhazsJCQkKLQkJfQotCX0KLQkvKgotCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIAotICB7Ci0gICAgc3dpdGNoIChpZCkgewotICAgIAljYXNlIChKMkVFXzFfNF9JRCkgOgotICAgIAkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLSAgICAJCQkJcHJpbVNldFZlcnNpb25JRChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEKTsKLSAgICAJCQkJYnJlYWs7Ci0gICAgCWNhc2UgKEoyRUVfMV8zX0lEKSA6Ci0gICAgCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotICAgIAkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQpOwotICAgIAkJCQlicmVhazsKLSAgICAJY2FzZSAoSjJFRV8xXzJfSUQpIDoKLSAgICAJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzJfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSk7Ci0gICAgCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMF9JRCk7Ci0gICAgCQl9Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKLQkgIHJldHVybiAgV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1BVQkxJQ0lEOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewotCSAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TWVNURU1JRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKLQkgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfUFVCTElDSUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TWVNURU1JRDsKLQl9Ci0KLQkvKiBSZXR1cm4gSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIG1vZHVsZSB2ZXJzaW9uCi0JKi8KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7Ci0JCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKLQkJCWNhc2UgV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMF9JRDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCQljYXNlIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJCWRlZmF1bHQgOgotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRDsKLQl9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCi0gIHsKLSAgICAvL0RvIG5vdGhpbmcgZm9yIG5vdyBzaW5jZSB0aGUgcm9vdCBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIHZlcnNpb24uCi0gIH0KLQotICAKLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL3V0aWwvV3NkZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiYWE3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3NkZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFdzZGRQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXc2RkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV3NkZFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBXc2RkU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZXMoV2ViU2VydmljZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZURlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUG9ydENvbXBvbmVudChQb3J0Q29tcG9uZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQb3J0Q29tcG9uZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETFBvcnQoV1NETFBvcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExQb3J0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmljZUltcGxCZWFuKFNlcnZpY2VJbXBsQmVhbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUltcGxCZWFuQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldExpbmsoU2VydmxldExpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRMaW5rQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCTGluayhFSkJMaW5rIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFSkJMaW5rQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSGFuZGxlcihIYW5kbGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIYW5kbGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQmVhbkxpbmsoQmVhbkxpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJlYW5MaW5rQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVFOYW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzIDxlbT5XZWIgU2VydmljZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbiA8ZW0+V2ViIFNlcnZpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCA8ZW0+UG9ydCBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydCA8ZW0+V1NETCBQb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4gPGVtPlNlcnZpY2UgSW1wbCBCZWFuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbXBsQmVhbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rIDxlbT5TZXJ2bGV0IExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0TGlua0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbmsgPGVtPkVKQiBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJMaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlciA8ZW0+SGFuZGxlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rIDxlbT5CZWFuIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCZWFuTGlua0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXAgPGVtPkRlc2NyaXB0aW9uIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV3NkZEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmNhZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL3V0aWwvV3NkZFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzZGRTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXc2RkUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV3NkZFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBXc2RkUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVM6IHsKLQkJCQlXZWJTZXJ2aWNlcyB3ZWJTZXJ2aWNlcyA9IChXZWJTZXJ2aWNlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2ViU2VydmljZXMod2ViU2VydmljZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKHdlYlNlcnZpY2VzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdGlvbkdyb3VwKHdlYlNlcnZpY2VzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjcmlwdGlvbiA9IChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYlNlcnZpY2VEZXNjcmlwdGlvbih3ZWJTZXJ2aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlQ6IHsKLQkJCQlQb3J0Q29tcG9uZW50IHBvcnRDb21wb25lbnQgPSAoUG9ydENvbXBvbmVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9ydENvbXBvbmVudChwb3J0Q29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldTRExfUE9SVDogewotCQkJCVdTRExQb3J0IHdzZGxQb3J0ID0gKFdTRExQb3J0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMUG9ydCh3c2RsUG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbFBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU46IHsKLQkJCQlTZXJ2aWNlSW1wbEJlYW4gc2VydmljZUltcGxCZWFuID0gKFNlcnZpY2VJbXBsQmVhbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZUltcGxCZWFuKHNlcnZpY2VJbXBsQmVhbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWTEVUX0xJTks6IHsKLQkJCQlTZXJ2bGV0TGluayBzZXJ2bGV0TGluayA9IChTZXJ2bGV0TGluayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmxldExpbmsoc2VydmxldExpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJlYW5MaW5rKHNlcnZsZXRMaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LOiB7Ci0JCQkJRUpCTGluayBlamJMaW5rID0gKEVKQkxpbmspdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkxpbmsoZWpiTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQmVhbkxpbmsoZWpiTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSOiB7Ci0JCQkJSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoaGFuZGxlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb25Hcm91cChoYW5kbGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkJFQU5fTElOSzogewotCQkJCUJlYW5MaW5rIGJlYW5MaW5rID0gKEJlYW5MaW5rKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCZWFuTGluayhiZWFuTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWIgU2VydmljZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXZWJTZXJ2aWNlcyhXZWJTZXJ2aWNlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBTZXJ2aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZURlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUG9ydENvbXBvbmVudChQb3J0Q29tcG9uZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBQb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgUG9ydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExQb3J0KFdTRExQb3J0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBJbXBsIEJlYW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlSW1wbEJlYW4oU2VydmljZUltcGxCZWFuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldCBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRMaW5rKFNlcnZsZXRMaW5rIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIExpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFSkJMaW5rKEVKQkxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IYW5kbGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhhbmRsZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyKEhhbmRsZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CZWFuIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmVhbiBMaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlQmVhbkxpbmsoQmVhbkxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vV3NkZFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJhOTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5FSkIgQXJ0aWZhY3QgRWRpdCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIHRoZSB3ZWIgc2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvbW1vbiBtb2RlbCBhcGkuIFVzaW5nIHRoaXMgYXBpIHRoZSAgd2ViIHNlcnZpY2VzIGRlcG9seW1lbnQgZGVzY3JpcHRvciBtb2RlbCBhcnRpZmFjdHMgKFBvcnRDb21wb25lbnRzLCBIYW5kbGVycywgV1NETFBvcnRzLCBXZWJTZXJ2aWNlcyBEZXNjcmlwdGlvbiBldGMuKSAKLSAgICAgICAgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUveG1scGFyc2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL3htbHBhcnNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OWE1ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUveG1scGFyc2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW1ldGhvZF9pbnZva2VfZmFpbGVkX0VYQ189SVdBRTAwOTVFIEZhaWxlZCB0byBpbnZva2UgdGhlIG1ldGhvZCBuYW1lZDogezB9Ci1mYWlsZWRfdG9fbG9hZF9FWENfPUlXQUUwMDk2RSBGYWlsZWQgdG8gbG9hZDogezB9Ci1tZXRob2Rfbm90X2ZvdW5kX0VYQ189SVdBRTAwOTdFIENvdWxkIG5vdCBmaW5kIHRoZSBmb2xsb3dpbmcgbWV0aG9kIG5hbWVkOiB7MH0KLWZhaWxlZF9pbnN0YW50aWF0aW5nX0VYQ189SVdBRTAwOThFIEZhaWxlZCBpbnN0YW50aWF0aW5nOiB7MH0KLXBhcnNlX2V4Y2VwdGlvbl9vY2N1cmVkX0VYQ189SVdBRTAwOTlFIEFuIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHhtbDogTGluZSAjOiB7MH0gOkNvbHVtbiAjOiB7MX0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0MWMwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUoyRUUgTW9kZWwKLXByb3ZpZGVyTmFtZT13d3cuZXhhbXBsZS5vcmcKLUVKQl9WQUxJREFUT1I9RUpCIFZhbGlkYXRvcgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU4MzA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVqYk1vZGVsRXh0ZW5kZXIiIG5hbWU9ImVqYk1vZGVsRXh0ZW5kZXIiLz4KLQotPCEtLUoyRUVJbml0LS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBKMkVFIENvcmUgRXh0ZW5zaW9uIFBvaW50IFJlZ2lzdHJ5LS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJjb21tb24ueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJjbGllbnQueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJ3ZWJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJlamIueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJqY2EueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJqc3AueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJ3ZWJzZXJ2aWNlX2NsaWVudC54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9IndzY29tbW9uLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0id3NkZC54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic3BoZXJlL2FwcHNlcnZlci9zY2hlbWFzLzUuMC4yL3dzY29tbW9uLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNwaGVyZS9hcHBzZXJ2ZXIvc2NoZW1hcy81LjAuMi93c2RkLnhtaSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci08IS0tQXJjaGl2ZUluaXQtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iY29tbW9uYXJjaGl2ZS54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9ImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWcueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBhIHBsYWNlIGhvbGRlciBmb3IgdGhlIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFNldmVyYWwgdGhhdCBoYXZlIG5vdCBjaGFuZ2VkIGFyZSBzdGlsbCByZWdpc3RlcmVkIGFzICAtLT4KLTwhLS0gUmVnaXN0ZXIgcGFja2FnZSBtYXBwaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYucGFja2FnZVVSSU1hcCI+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9ImNvbW1vbi54bWkiCi0gICAgICAgICAgICBwcmVmaXg9ImNvbW1vbiI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iYXBwbGljYXRpb24ueG1pIgotICAgICAgICAgICAgcHJlZml4PSJhcHBsaWNhdGlvbiI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iY2xpZW50LnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0iY2xpZW50Ij4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJ3ZWJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBwcmVmaXg9IndlYmFwcGxpY2F0aW9uIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJlamIueG1pIgotICAgICAgICAgICAgcHJlZml4PSJlamIiPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9ImpjYS54bWkiCi0gICAgICAgICAgICBwcmVmaXg9ImpjYSI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0idGFnbGliLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0idGFnbGliIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJqc3AueG1pIgotICAgICAgICAgICAgcHJlZml4PSJqc3AiPgotICAgICAgPC9tYXA+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9ImNvbW1vbmFyY2hpdmUueG1pIgotICAgICAgICAgICAgcHJlZml4PSJjb21tb25hcmNoaXZlIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0iY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZyI+Ci0gICAgICA8L21hcD4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyODk1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+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+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSIKLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIgotCQkJCXZhbHVlICAgICAgCTIwNikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBjb2RlL3dlYnNlcnZpY2Uvd2Vic2VydmljZS1qMmVlLm1kbCwgV0NDTS5KMkVFLldFQlNFUlZJQ0VTLCBXQ0NNNjBURCIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBjb2RlL3dlYnNlcnZpY2Uvd2Vic2VydmljZS1qMmVlLm1kbCwgV0NDTS5KMkVFLldFQlNFUlZJQ0VTLCBXQ0NNNjBURCIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0aW9uIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbURpcmVjdGlvblR5cGVTZXQiIDEwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlBhcmFtRGlyZWN0aW9uVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiaW4iCi0JCQkJdmFsdWUgICAgICAJMTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJpbm91dCIKLQkJCQl2YWx1ZSAgICAgIAkxMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIm91dCIKLQkJCQl2YWx1ZSAgICAgIAkxMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY5IikpCi0JcXVpZCAgICAgICAJIjNFMTA5RTg4MDMxNCIpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3Jvc2Uvd2Vic2VydmljZXNfY2xpZW50XzFfMC5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93ZWJzZXJ2aWNlc19jbGllbnRfMV8wLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0MGNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93ZWJzZXJ2aWNlc19jbGllbnRfMV8wLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDE4MTUgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY2xpZW50IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkgICAgbmFtZSAgICAgICAJInByZWZpeCIKLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIldlYnNlcnZpY2VfY2xpZW50IikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkibnNVUkkiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJ3ZWJzZXJ2aWNlX2NsaWVudC54bWkiKSkpCi0gICAgcXVpZCAgICAgICAJIjNFNEQyRjRCMDJBQSIKLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIgotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzcyAiU2VydmljZVJlZiIKLQkgICAgcXVpZCAgICAgICAJIjNFNEQyRjU2MDE4NCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSByZWZlcmVuY2UgdG8gYSBXZWIKLXwgICAgc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLXwgICAgaWNvbnMsIGEgZGVjbGFyYXRpb24gb2YgdGhlIHJlcXVpcmVkIFNlcnZpY2UgaW50ZXJmYWNlLAotfCAgICBhbiBvcHRpb25hbCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLCBhbiBvcHRpb25hbCBzZXQKLXwgICAgb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi18ICAgIGFuIG9wdGlvbmFsIHNldCBvZiBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gYmUgcmVzb2x2ZWQKLXwgICAgYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwgcG9ydCwgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBoYW5kbGVycy4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQUYyQzAwMUMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIgotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXJ2aWNlUmVmTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMkZEMzAxQTEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZQotfCAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKLXwgICAgICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWVzIHN0YXJ0IHdpdGgKLXwgICAgICAgICJzZXJ2aWNlLyIuCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbEZpbGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMwMDUwMTk5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18IFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETCBmaWxlLiBUaGUKLXwgICAgICAgIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBtb2R1bGUuCi0JCSAgICAKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4xIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXhycGNNYXBwaW5nRmlsZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzAxQzAzQ0QiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci18ICAgICAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci18ICAgICAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLXwgICAgICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KLQkJICAgIAotCQkgICAgc3RlcmVvdHlwZSAJIjAuLjEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQb3J0Q29tcG9uZW50UmVmIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMwRDkwM0E3IgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotfCAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotfCAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci18ICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLXwgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotCSAgICAKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicG9ydENvbXBvbmVudExpbmsiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxMjIwMzQ4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZiB0byBhCi18ICAgICAgICBzcGVjaWZpYyBwb3J0LWNvbXBvbmVudCByZXF1aXJlZCB0byBiZSBtYWRlIGF2YWlsYWJsZSBieSBhIHNlcnZpY2UKLXwgICAgICAgIHJlZmVyZW5jZS4KLXwKLXwgICAgICAgIFRoZSB2YWx1ZSBvZiBhIHBvcnQtY29tcG9uZW50LWxpbmsgbXVzdCBiZSB0aGUgcG9ydC1jb21wb25lbnQtbmFtZQotfCAgICAgICAgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUKLXwgICAgICAgIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXggZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4Ci18ICAgICAgICBkZWZpbmVkIGZvciBlamItbGluayBpbiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotCQkgICAgCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uMSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkhhbmRsZXIiCi0JICAgIHF1aWQgICAgICAgCSIzRTREMzE2NDAwNzIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotfCAgICBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLXwgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotfCAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLXwKLXwgICAgVXNlZCBpbjogc2VydmljZS1yZWYKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDIzQjAwODAwMDUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIgotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGVyTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzFFRDAwOTciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBtb2R1bGUuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzb2FwUm9sZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMyNjYwMjg1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBvcnROYW1lcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzI4QTAzMzEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYSBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJXZWJTZXJ2aWNlc0NsaWVudCIKLQkgICAgcXVpZCAgICAgICAJIjNGMkVCMzA5MDI2NyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCIpCi0JKG9iamVjdCBDbGFzcyAiQ29tcG9uZW50U2NvcGVkUmVmcyIKLQkgICAgcXVpZCAgICAgICAJIjNGMkVCNDJBMDBBQSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkB2ZXJzaW9uIEoyRUUxLjQgZGVwcmVjYXRlZCIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tcG9uZW50TmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjQ1NDAxNUYiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMxMDcwMEU2IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxMDgwMzU0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZAotfCAgICAgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKLXwgICAgICAgIFdTREwgcG9ydC4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTA4MDM3MiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpQb3J0Q29tcG9uZW50UmVmIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMEQ5MDNBNyIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMxM0MwMzlGIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwb3J0Q29tcG9uZW50UmVmcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzEzRDAyNTYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotfCAgICAgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLXwgICAgICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLXwgICAgICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLXwgICAgICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQkJICAgIAotCQkgICAgbGFiZWwgICAgICAJInBvcnRDb21wb25lbnRSZWZzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlBvcnRDb21wb25lbnRSZWYiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMwRDkwM0E3IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTNEMDI2MCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpTZXJ2aWNlUmVmIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQyRjU2MDE4NCIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiCi0JICAgIHF1aWQgICAgICAgCSIzRTREMzE2RTAzMUYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImhhbmRsZXJzIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMTZGMDI1OCIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfCBEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLXwgICAgICAgIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZgotfCAgICAgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotfCAgICAgICAgd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0JCSAgICAKLQkJICAgIGxhYmVsICAgICAgCSJoYW5kbGVycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpIYW5kbGVyIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTY0MDA3MiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzE2RjAyNjIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2IgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMxRjkwMTJBIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJoYW5kbGVyQ2xhc3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0U0RDMxRkEwMjgwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uIgotCQkgICAgbGFiZWwgICAgICAJImhhbmRsZXJDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3IgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMUZBMDJBOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpIYW5kbGVyIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTY0MDA3MiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4IgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMyMjEwMDJEIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJpbml0UGFyYW1zIgotCQkgICAgcXVpZCAgICAgICAJIjNFNEQzMjIxMDFFNiIKLQkJICAgIGxhYmVsICAgICAgCSJpbml0UGFyYW1zIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpQYXJhbVZhbHVlIgotCQkgICAgcXVpZHUgICAgICAJIjNFNEMyMjEyMDJDMSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOSIKLQkJICAgIHF1aWQgICAgICAgCSIzRTREMzIyMTAxRTgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6SGFuZGxlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2NDAwNzIiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCIKLQkgICAgcXVpZCAgICAgICAJIjNGMkVCNDhFMDI3MSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY29tcG9uZW50U2NvcGVkUmVmcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjQ5MTAyNzUiCi0JCSAgICBsYWJlbCAgICAgIAkiY29tcG9uZW50U2NvcGVkUmVmcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpDb21wb25lbnRTY29wZWRSZWZzIgotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNDJBMDBBQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiCi0JCSAgICBxdWlkICAgICAgIAkiM0YyRUI0OTEwMjc3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OldlYlNlcnZpY2VzQ2xpZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCMzA5MDI2NyIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIgotCSAgICBxdWlkICAgICAgIAkiM0YyRUI1MjQwM0Q1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlUmVmcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjUyNzAxNTgiCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmljZVJlZnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIgotCQkgICAgcXVpZCAgICAgICAJIjNGMkVCNTI3MDE2QyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpDb21wb25lbnRTY29wZWRSZWZzIgotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNDJBMDBBQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0IgotCSAgICBxdWlkICAgICAgIAkiM0YyRUI1OUIwMDZGIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzZXJ2aWNlUmVmcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRjJFQjU5QjAzNTQiCi0JCSAgICBsYWJlbCAgICAgIAkic2VydmljZVJlZnMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6U2VydmljZVJlZiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkY1NjAxODQiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1IgotCQkgICAgcXVpZCAgICAgICAJIjNGMkVCNTlCMDM2OCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpXZWJTZXJ2aWNlc0NsaWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjMwOTAyNjciCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNiIKLQkgICAgcXVpZCAgICAgICAJIjNGNDM5MkNDMDJGQSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAic2VydmljZVFuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNGNDM5MkNEMDJGMSIKLQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlUW5hbWUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIgotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTciCi0JCSAgICBxdWlkICAgICAgIAkiM0Y0MzkyQ0QwMkZCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0IgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiCi0JICAgIHF1aWQgICAgICAgCSIzRjQzOTMzQzAyQTAiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInNvYXBIZWFkZXJzIgotCQkgICAgcXVpZCAgICAgICAJIjNGNDM5MzNEMDE5MyIKLQkJICAgIGxhYmVsICAgICAgCSJzb2FwSGVhZGVycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UU5hbWUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjQzOTMzRDAxOUQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6SGFuZGxlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2NDAwNzIiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlNlcnZpY2UgUmVmIgotCSAgICBxdWlkICAgICAgIAkiM0U0RDMwQTIwMTMxIgotCSAgICB0aXRsZSAgICAgIAkiU2VydmljZSBSZWYiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotfCAgICBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLXwgICAgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotfCAgICB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLXwKLXwgICAgVXNlZCBpbjogc2VydmljZS1yZWYKLQkgICAgCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkxMDUwCi0JICAgIG9yaWdpbl95ICAgCTEzOAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IExhYmVsIEAxCi0JCSAgICBsb2NhdGlvbiAgIAkoNTMsIDU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxNAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJVFJVRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIG5saW5lcyAgICAgCTEKLQkJICAgIG1heF93aWR0aCAgCTEwMDYKLQkJICAgIGxhYmVsICAgICAgCSJXZWIgU2VydmljZXMgQ2xpZW50IEREIFYxLjEiKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCIgQDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjgyMCwgMTkxOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMjY0MiwgMTgzOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbkdyb3VwIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTI2MzIyNTYKLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiCi0JCSAgICB3aWR0aCAgICAgIAkzNzQKLQkJICAgIGhlaWdodCAgICAgCTE4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6UG9ydENvbXBvbmVudFJlZiIgQDMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQlsb2NhdGlvbiAgIAkoMTYwNywgNDE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQzNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBvcnRDb21wb25lbnRSZWYiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMEQ5MDNBNyIKLQkJICAgIHdpZHRoICAgICAgCTQ1MgotCQkgICAgaGVpZ2h0ICAgICAJMTI0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY2xpZW50OjpDb21wb25lbnRTY29wZWRSZWZzIiBANAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDExMzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQKLQkJCWxvY2F0aW9uICAgCSgyMTIsIDEwODYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTM2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQ29tcG9uZW50U2NvcGVkUmVmcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2NzQ1NzI3Ci0JCSAgICBxdWlkdSAgICAgIAkiM0YyRUI0MkEwMEFBIgotCQkgICAgd2lkdGggICAgICAJNTU0Ci0JCSAgICBoZWlnaHQgICAgIAkxMjQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OldlYlNlcnZpY2VzQ2xpZW50IiBANQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDMwNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDM1MiwgMjU0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ0OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIldlYlNlcnZpY2VzQ2xpZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NDU3MjcKLQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjMwOTAyNjciCi0JCSAgICB3aWR0aCAgICAgIAk0NjYKLQkJICAgIGhlaWdodCAgICAgCTEyNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwIiBANgotCQkgICAgbG9jYXRpb24gICAJKDUyNywgNzE5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0YyRUI0OEUwMjcxIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb21wb25lbnRTY29wZWRSZWZzIiBANwotCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJICAgIGxvY2F0aW9uICAgCSgtMTY4NywgMjkxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOAotCQkJCVBhcmVudF9WaWV3IAlANwotCQkJCWxvY2F0aW9uICAgCSg0NTMsIDk5NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDQ0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrY29tcG9uZW50U2NvcGVkUmVmcyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI0OTEwMjc1IgotCQkJICAgIGNsaWVudCAgICAgCUA2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOQotCQkJCVBhcmVudF9WaWV3IAlANwotCQkJCWxvY2F0aW9uICAgCSg1NDQsIDEwNDMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMSIgQDEwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Ci0JCQkgICAgbG9jYXRpb24gICAJKC0xNjg3LCAyOTEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQotCQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCQlsb2NhdGlvbiAgIAkoNTE5LCA0MzMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI0OTEwMjc3IgotCQkJICAgIGNsaWVudCAgICAgCUA2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIKLQkJCQlQYXJlbnRfVmlldyAJQDEwCi0JCQkJbG9jYXRpb24gICAJKDYxOCwgNDA4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNzY3LCA4NjgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEzCi0JCQlsb2NhdGlvbiAgIAkoMjYzMywgODE4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgd2lkdGggICAgICAJMjg2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTQKLQkJICAgIGxvY2F0aW9uICAgCSgyNTU4LCA0OTEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEwNzAwRTYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIgQDE1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNAotCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCAtOTMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNgotCQkJCVBhcmVudF9WaWV3IAlAMTUKLQkJCQlsb2NhdGlvbiAgIAkoMjk5OSwgNjk4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NzAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0JCQkJcGN0RGlzdCAgICAJMC43ODYwNzAKLQkJCQloZWlnaHQgICAgIAkyNDkKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEwODAzNTQiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDEzCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDI1NTgsIDQ5MSkKLQkJCQkoMjc1MCwgNDkxKQotCQkJCSgyNzUwLCA4MDYpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI1NTgsIDQ5MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc1MCwgODA2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJCWxvY2F0aW9uICAgCSgyNzE4LCA2OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNzc2MTE5Ci0JCQkJaGVpZ2h0ICAgICAJMzMKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Ci0JCQkgICAgbG9jYXRpb24gICAJKDE1MTUsIC05MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEwODAzNzIiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTU4LCA0OTEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTAsIDQ5MSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlBhcmFtVmFsdWUiIEAxOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODg3LCAyNTcwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxOQotCQkJbG9jYXRpb24gICAJKDE2NTUsIDI0MTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFyYW1WYWx1ZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjMyMjU2Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0QzIyMTIwMkMxIgotCQkgICAgd2lkdGggICAgICAJNDgyCi0JCSAgICBoZWlnaHQgICAgIAkzMzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NjbGllbnQ6OlNlcnZpY2VSZWYiIEAyMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCAxMTIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMAotCQkJbG9jYXRpb24gICAJKDE2OTQsIDEwNzApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZVJlZiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGNTYwMTg0IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMjAKLQkJCWxvY2F0aW9uICAgCSgxNjk0LCAxMTMxKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTApCi0JCSAgICB3aWR0aCAgICAgIAkyNzgKLQkJICAgIGhlaWdodCAgICAgCTEyNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAyMQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDc5MSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTNDMDM5RiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicG9ydENvbXBvbmVudFJlZnMiIEAyMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCAtMzg3KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMKLQkJCQlQYXJlbnRfVmlldyAJQDIyCi0JCQkJbG9jYXRpb24gICAJKDE2MTgsIDYyMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzgwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcG9ydENvbXBvbmVudFJlZnMiCi0JCQkJcGN0RGlzdCAgICAJMC42NDMwODAKLQkJCQloZWlnaHQgICAgIAkyMDcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzEzRDAyNTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQKLQkJCQlQYXJlbnRfVmlldyAJQDIyCi0JCQkJbG9jYXRpb24gICAJKDE4OTIsIDU5OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC43MjYwODAKLQkJCQloZWlnaHQgICAgIAk2OAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAyNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCAtMzg3KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTNEMDI2MCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjEKLQkJCSAgICBzdXBwbGllciAgIAlAMjAKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIiIEAyNgotCQkgICAgbG9jYXRpb24gICAJKDIzNzAsIDEwNjApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGRTEwMUZDIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAyNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMjYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzUwLCA5NDApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOAotCQkJCVBhcmVudF9WaWV3IAlAMjcKLQkJCQlsb2NhdGlvbiAgIAkoMjA0NSwgMTAxOSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMkZFNDAxNEMiCi0JCQkgICAgY2xpZW50ICAgICAJQDI2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM3MCwgMTA2MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk2MywgMTA2MCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlSW50ZXJmYWNlIiBAMjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkgICAgbG9jYXRpb24gICAJKDc1MCwgOTQwKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAKLQkJCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQkJbG9jYXRpb24gICAJKDIyOTYsIDExNjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMwNAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZpY2VJbnRlcmZhY2UiCi0JCQkJcGN0RGlzdCAgICAJLTAuMTg1NDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTA4Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDJGRTQwMTJFIgotCQkJICAgIGNsaWVudCAgICAgCUAyNgotCQkJICAgIHN1cHBsaWVyICAgCUAxMwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMzcwLCAxMDYwKQotCQkJCSgyNjQ3LCAxMDYwKQotCQkJCSgyNjQ3LCA5MzApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNzAsIDEwNjApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NDcsIDkzMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMQotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoMjcwMSwgOTcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDMyCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIyMCwgMTEyNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNTI0MDNENSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic2VydmljZVJlZnMiIEAzMwotCQkJICAgIFBhcmVudF9WaWV3IAlAMzIKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE1ODEsIC0yMCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Ci0JCQkJUGFyZW50X1ZpZXcgCUAzMwotCQkJCWxvY2F0aW9uICAgCSgxNTkwLCAxMDgxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzZXJ2aWNlUmVmcyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI1MjcwMTU4IgotCQkJICAgIGNsaWVudCAgICAgCUAzMgotCQkJICAgIHN1cHBsaWVyICAgCUAyMAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNQotCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTYzOSwgMTE3NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzIiBAMzYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTgxLCAtMjApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNwotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoODUxLCAxMDkwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDQ0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGMkVCNTI3MDE2QyIKLQkJCSAgICBjbGllbnQgICAgIAlAMzIKLQkJCSAgICBzdXBwbGllciAgIAlANAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOAotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoODA1LCAxMTg1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNCIgQDM5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTE5OSwgNzExKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0YyRUI1OUIwMDZGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlUmVmcyIgQDQwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzOQotCQkJICAgIGxvY2F0aW9uICAgCSg4NDMsIDQyNCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxCi0JCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJCWxvY2F0aW9uICAgCSgxNjQ1LCA5NTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NlcnZpY2VSZWZzIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjJFQjU5QjAzNTQiCi0JCQkgICAgY2xpZW50ICAgICAJQDM5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyCi0JCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJCWxvY2F0aW9uICAgCSgxNjQ2LCAxMDY3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUiIEA0MwotCQkJICAgIFBhcmVudF9WaWV3IAlAMzkKLQkJCSAgICBsb2NhdGlvbiAgIAkoODQzLCA0MjQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NAotCQkJCVBhcmVudF9WaWV3IAlANDMKLQkJCQlsb2NhdGlvbiAgIAkoNzU1LCA0NzApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0YyRUI1OUIwMzY4IgotCQkJICAgIGNsaWVudCAgICAgCUAzOQotCQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1Ci0JCQkJUGFyZW50X1ZpZXcgCUA0MwotCQkJCWxvY2F0aW9uICAgCSg3NTQsIDM1NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6UU5hbWUiIEA0NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg5MzQsIDE4MTMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ2Ci0JCQlsb2NhdGlvbiAgIAkoNTg3LCAxNjM0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY5NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlFOYW1lIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiCi0JCSAgICB3aWR0aCAgICAgIAk3MTIKLQkJICAgIGhlaWdodCAgICAgCTM4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2IiBANDcKLQkJICAgIGxvY2F0aW9uICAgCSgxMTgzLCAxMTg0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y0MzkyQ0MwMkZBIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzZXJ2aWNlUW5hbWUiIEA0OAotCQkJICAgIFBhcmVudF9WaWV3IAlANDcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY0NywgNjMpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OQotCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQlsb2NhdGlvbiAgIAkoMTA3OCwgMTUyMSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZVFuYW1lIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjQzOTJDRDAyRjEiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDExODMsIDExODQpCi0JCQkJKDExMTksIDExODQpCi0JCQkJKDExMTksIDE2MjIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExODMsIDExODQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDE2MjIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAKLQkJCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQkJbG9jYXRpb24gICAJKDExNTAsIDE0NTgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuNjc1Mjk5Ci0JCQkJaGVpZ2h0ICAgICAJMzEKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDUxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0NwotCQkJICAgIGxvY2F0aW9uICAgCSgtNjQ3LCA2MykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjQzOTJDRDAyRkIiCi0JCQkgICAgY2xpZW50ICAgICAJQDQ3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE4MywgMTE4NCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY4NSwgMTE4NCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NsaWVudDo6SGFuZGxlciIgQDUyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDE5NTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUyCi0JCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTkwMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIYW5kbGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2NDAwNzIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJbG9jYXRpb24gICAJKDE3NTQsIDE5NjMpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJMCkKLQkJICAgIHdpZHRoICAgICAgCTIyMgotCQkgICAgaGVpZ2h0ICAgICAJMTI0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDUzCi0JCSAgICBsb2NhdGlvbiAgIAkoMjM4NSwgMTQ0NykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMUY5MDEyQSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaGFuZGxlckNsYXNzIiBANTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDUzCi0JCQkgICAgbG9jYXRpb24gICAJKDE0MDcsIC01OTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NQotCQkJCVBhcmVudF9WaWV3IAlANTQKLQkJCQlsb2NhdGlvbiAgIAkoMjYxMywgMTAyNSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjc2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraGFuZGxlckNsYXNzIgotCQkJCXBjdERpc3QgICAgCTAuODk1NDA0Ci0JCQkJaGVpZ2h0ICAgICAJMTU0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxRkEwMjgwIgotCQkJICAgIGNsaWVudCAgICAgCUA1MwotCQkJICAgIHN1cHBsaWVyICAgCUAxMwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgyMzg1LCAxNDQ3KQotCQkJCSgyNzY2LCAxNDQ3KQotCQkJCSgyNzY2LCA5MzApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzODUsIDE0NDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NjYsIDkzMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NgotCQkJCVBhcmVudF9WaWV3IAlANTQKLQkJCQlsb2NhdGlvbiAgIAkoMjgyMCwgMTAyMSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEA1NwotCQkJICAgIFBhcmVudF9WaWV3IAlANTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNywgLTU5NCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzFGQTAyQTgiCi0JCQkgICAgY2xpZW50ICAgICAJQDUzCi0JCQkgICAgc3VwcGxpZXIgICAJQDUyCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIzODUsIDE0NDcpCi0JCQkJKDE5MzAsIDE0NDcpCi0JCQkJKDE5MzAsIDE4OTApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzODUsIDE0NDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzAsIDE4OTApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBANTgKLQkJICAgIGxvY2F0aW9uICAgCSgxODg1LCAyMjA5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMyMjEwMDJEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0UGFyYW1zIiBANTkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Ci0JCQkgICAgbG9jYXRpb24gICAJKDkwNywgMTY4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDE3NTcsIDIzMDkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIyOAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2luaXRQYXJhbXMiCi0JCQkJcGN0RGlzdCAgICAJMC41MTUxNTIKLQkJCQloZWlnaHQgICAgIAkxMjkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzIyMTAxRTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDU4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg4NSwgMjIwOSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg4NSwgMjQwNCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MQotCQkJCVBhcmVudF9WaWV3IAlANTkKLQkJCQlsb2NhdGlvbiAgIAkoMTk1OCwgMjM0NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC42OTc5ODcKLQkJCQloZWlnaHQgICAgIAk3MwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkiIEA2MgotCQkJICAgIFBhcmVudF9WaWV3IAlANTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTA3LCAxNjgpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0U0RDMyMjEwMUU4IgotCQkJICAgIGNsaWVudCAgICAgCUA1OAotCQkJICAgIHN1cHBsaWVyICAgCUA1MgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4ODUsIDIyMDkpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODUsIDIwMTQpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBANjMKLQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCAxNTM1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U0RDMxNkUwMzFGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJoYW5kbGVycyIgQDY0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDM1NykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxNjA3LCAxNzc4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitoYW5kbGVycyIKLQkJCQlwY3REaXN0ICAgIAkwLjY4NTE4NQotCQkJCWhlaWdodCAgICAgCTE0NAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNFNEQzMTZGMDI1OCIKLQkJCSAgICBjbGllbnQgICAgIAlANjMKLQkJCSAgICBzdXBwbGllciAgIAlANTIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCAxNTM1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCAxODg5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxODE3LCAxNzk3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjc0MDc0MQotCQkJCWhlaWdodCAgICAgCTY3Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDY3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDM1NykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTREMzE2RjAyNjIiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgMTUzNSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgMTE4MSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBANjgKLQkJICAgIGxvY2F0aW9uICAgCSgxMTk0LCAyMDA3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y0MzkzM0MwMkEwIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzb2FwSGVhZGVycyIgQDY5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSgtNjY4LCA1NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwCi0JCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDIxMjMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI3MQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NvYXBIZWFkZXJzIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjQzOTMzRDAxOTMiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDExOTQsIDIwMDcpCi0JCQkJKDExMzQsIDIwMDcpCi0JCQkJKDExMzQsIDIxNTkpCi0JCQkJKDkwNiwgMjE1OSkKLQkJCQkoOTA2LCAyMDA0KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk0LCAyMDA3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDYsIDIwMDQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEKLQkJCQlQYXJlbnRfVmlldyAJQDY5Ci0JCQkJbG9jYXRpb24gICAJKDk2MCwgMjA2NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5IiBANzIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkgICAgbG9jYXRpb24gICAJKC02NjgsIDU0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGNDM5MzNEMDE5RCIKLQkJCSAgICBjbGllbnQgICAgIAlANjgKLQkJCSAgICBzdXBwbGllciAgIAlANTIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk0LCAyMDA3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ1LCAyMDA3KSkpKSkpKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dzY29tbW9uLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dzY29tbW9uLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlMWI3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93c2NvbW1vbi5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk1MA0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzY29tbW9uIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiV3Njb21tb24iKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJ3c2NvbW1vbi54bWkiKSkpDQotICAgIHF1aWQgICAgICAgCSIzRTE1QjRDMDAxNkYiDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkluaXRQYXJhbSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBBQzZFMDI4MCINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJhbU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QzU4MDM1NSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1WYWx1ZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZDNUQwMDEzIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZDNjMwMTdBIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTT0FQSGVhZGVyIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEFDOTkwMjJGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgaGFuZGxlci4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNDY3MTg3MDA0OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjNCRUY1RDAyQzAiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU09BUFJvbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUNCQzAxNjQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4NCi18DQotCSAgICANCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzb2FwUm9sZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUU5QUQwMkQ3Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJQb3J0TmFtZSINCi0JICAgIHF1aWQgICAgICAgCSIzRTE1QkJDOTAyMDkiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicG9ydE5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTVFNEY3MDA3NiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRGVzY3JpcHRpb25UeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNUNCQzZEMDM1MyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQjdFMDBDMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOThENjAyRTAiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRpc3BsYXlOYW1lVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzRjVDQkM3ODAyMzYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREI4MjAzM0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEaXNwbGF5TmFtZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5MjIwMDBFIikpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcm9zZS93c2RkLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dzZGQuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGQ1NTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9yb3NlL3dzZGQuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNDAxMSArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkZCINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIldzZGQiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJ3c2RkLnhtaSIpKSkNCi0gICAgcXVpZCAgICAgICAJIjNFMTA5RUFEMDMxOSINCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiV2ViU2VydmljZXMiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwOUVFRjAxMkYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBXZWIgc2VydmljZSBkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSjJFRSBBcHBsaWNhdGlvbiBTZXJ2ZXIgYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kIHNlcnZpY2VzLg0KLXwNCi0JICAgIA0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiNDAyM0IwREQwMEREIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiDQotCQkgICAgcXVpZHUgICAgICAJIjQwMjNBREYyMDE5NyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gZWxlbWVudCBkZWZpbmVzIGEgV1NETCBkb2N1bWVudCBmaWxlIGFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIG1vZHVsZS4NCi18DQotfEFsbCBXU0RMIGZpbGUgcG9ydHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBwb3J0LWNvbXBvbmVudCBlbGVtZW50IGRlZmluZWQuDQotfA0KLXxVc2VkIGluOiB3ZWJzZXJ2aWNlcw0KLXwNCi0JICAgIA0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImpheHJwY01hcHBpbmdGaWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNkE4MTAxMEMiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZBOEYwMjFBIg0KLQkJICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4NCi18DQotfA0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid3NkbEZpbGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QUEyMDM5MiINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgV1NETCBmaWxlIGluIHRoZSBtb2R1bGUuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLg0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic21hbGxJY29uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDOTE4MjAwMjMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxhcmdlSWNvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1QzkxOTMwMjc2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0U1MjYwMTYzIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNwbGF5TmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0U1MzEwMDNDIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJQb3J0Q29tcG9uZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiY2dfc3R5bGUiDQotCQkgICAgdmFsdWUgICAgICAJIkRlZmF1bHRfRUpCIikpDQotCSAgICBxdWlkICAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBwb3J0LWNvbXBvbmVudCBlbGVtZW50IGFzc29jaWF0ZXMgYSBXU0RMIHBvcnQgd2l0aCBhIFdlYiBzZXJ2aWNlIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24uICBJdCBkZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBwb3J0IGFzIGEgY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMgcmVwcmVzZW50YXRpb25zLCBXU0RMIHBvcnQgUU5hbWUsIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlLCBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4uDQotfA0KLQkgICAgDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicG9ydENvbXBvbmVudE5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QjExMDM0NCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzIG5hbWUuIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUgbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuDQotfA0KLXwNCi0JCSAgICANCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTUyNkIxODAxNzciDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcG9ydCBjb21wb25lbnQncyBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZS4NCi18DQotCQkgICAgDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNtYWxsSWNvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1QzkxRDEwMzhEIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXJnZUljb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUM5MUUzMDE5RiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVzY3JpcHRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNFODU5MDJCQyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzcGxheU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNFODYyMDA3MCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiV1NETFBvcnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUJDNDAyMDUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjQzOEM4OTAzNjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpRTmFtZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNlcnZpY2VJbXBsQmVhbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBBQzBBMDAxNiINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCBkZWZpbmVzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi5BIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIGFuIEVKQiBiZWFuIGNsYXNzIG9yIEpBWC1SUEMgd2ViIGNvbXBvbmVudC4gRXhpc3RpbmcgRUpCIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwb3NlZCBhcyBhIFdlYiBzZXJ2aWNlIHVzaW5nIGFuIGVqYi1saW5rLg0KLXwNCi18VXNlZCBpbjogcG9ydC1jb21wb25lbnQNCi18DQotCSAgICANCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU2VydmxldExpbmsiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJGaW5hbCINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkgICAgdmFsdWUgICAgICAJVFJVRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiUmVhZE9ubHkiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkRXh0ZW5kcyINCi0JCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRJbXBsZW1lbnRzIg0KLQkJICAgIHZhbHVlICAgICAgCSIiKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCSAgICB2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUMxNTAyRTIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18VGhlIHNlcnZsZXQtbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGEgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIGlzIGRlZmluZWQgYXMgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQuDQotfA0KLXxUaGUgdmFsdWUgb2YgdGhlIHNlcnZsZXQtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIHNlcnZsZXQtbmFtZSBvZiBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludCBpbiB0aGUgc2FtZSBXQVIgZmlsZS4NCi18DQotfFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuDQotfA0KLQkgICAgDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkgICAgcXVpZCAgICAgICAJIjNFMzk1M0E1MDEwQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpCZWFuTGluayINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUyRTcwMEVDIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VydmxldExpbmsiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFFOTM1MDM5QiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRUpCTGluayINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiU3RhdGljIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCSAgICB2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkgICAgdmFsdWUgICAgICAJRkFMU0UpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJICAgIHZhbHVlICAgICAgCUZBTFNFKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJICAgIHZhbHVlICAgICAgCVRSVUUpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRFeHRlbmRzIg0KLQkJICAgIHZhbHVlICAgICAgCSIiKQ0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JCSAgICBuYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZEltcGxlbWVudHMiDQotCQkgICAgdmFsdWUgICAgICAJIiIpDQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJICAgIHZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCQkgICAgbmFtZSAgICAgICAJImNnX3N0eWxlIg0KLQkJICAgIHZhbHVlICAgICAgCSJEZWZhdWx0X0VKQiIpKQ0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBBQzIwMDI4RCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEgV2ViIFNlcnZpY2UgRW5kcG9pbnQuDQotfA0KLXxUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZS4NCi18DQotfFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuDQotfA0KLXxFeGFtcGxlczoNCi18PGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4NCi18CTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4NCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCSAgICBxdWlkICAgICAgIAkiM0UzOTUzOEIwMTRCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkJlYW5MaW5rIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTM5NTJFNzAwRUMiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlamJMaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExRTkyNDAwOTUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkhhbmRsZXIiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQUMzQjAxRDYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18RGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLg0KLXwNCi18VXNlZCBpbjogcG9ydC1jb21wb25lbnQNCi18DQotCSAgICANCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjQwMjNBRkEwMDA3RCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGVyTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjZCRkUwMzQ4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGVyQ2xhc3MiDQotCQkgICAgcXVpZCAgICAgICAJIjNFNTI2QzA1MDEwMyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQmVhbkxpbmsiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkJICAgIG5hbWUgICAgICAgCSJjZ19zdHlsZSINCi0JCSAgICB2YWx1ZSAgICAgIAkiRGVmYXVsdF9FSkIiKSkNCi0JICAgIHF1aWQgICAgICAgCSIzRTM5NTJFNzAwRUMiDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUJENjkwMEU4Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIndzZGxQb3J0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ2QTAzNEMiDQotCQkgICAgbGFiZWwgICAgICAJIndzZGxQb3J0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OldTRExQb3J0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUJDNDAyMDUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ2QTAzNTYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQkQ3NDAyOUMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic2VydmljZUltcGxCZWFuIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQkQ3NjAyRjgiDQotCQkgICAgbGFiZWwgICAgICAJInNlcnZpY2VJbXBsQmVhbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpTZXJ2aWNlSW1wbEJlYW4iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzBBMDAxNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDc2MDJGQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDgwMDM3RSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJoYW5kbGVycyAiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDg0MDI5MyINCi0JCSAgICBsYWJlbCAgICAgIAkiaGFuZGxlcnMgIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkhhbmRsZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzNCMDFENiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFCRDg0MDI5NSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFDMzcxMDNDRiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlRUpCTGluayINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMUMzNzMwMTVCIg0KLQkJICAgIGxhYmVsICAgICAgCSJlRUpCTGluayINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpFSkJMaW5rIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMyMDAyOEQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQzM3MzAxNUQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6U2VydmljZUltcGxCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMwQTAwMTYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgcXVpZCAgICAgICAJIjNFMTFDMzc5MDM4QSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlU2VydmxldExpbmsiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDMzdDMDBEMSINCi0JCSAgICBsYWJlbCAgICAgIAkiZVNlcnZsZXRMaW5rIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlNlcnZsZXRMaW5rIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMxNTAyRTIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQzM3QzAwREMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6U2VydmljZUltcGxCZWFuIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMwQTAwMTYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMCINCi0JICAgIHF1aWQgICAgICAgCSIzRTEwQ0E3MzAzQzUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid2ViU2VydmljZURlc2NyaXB0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0UxMENBNzYwMzUxIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OldlYlNlcnZpY2VEZXNjcmlwdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEExNTAwMzEzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTBDQTc2MDM1QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlcyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMDlFRUYwMTJGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUI3QzgwMzNGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInBvcnRDb21wb25lbnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQjdDQzAyQzMiDQotCQkgICAgbGFiZWwgICAgICAJInBvcnRDb21wb25lbnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlBvcnRDb21wb25lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQjhEMDFGNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQjdDQzAyQ0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6V2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNCINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQ0VERTAzMUUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaW5pdFBhcmFtcyAiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDRUUwMDM3MSINCi0JCSAgICBsYWJlbCAgICAgIAkiaW5pdFBhcmFtcyAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkluaXRQYXJhbSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDNkUwMjgwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDRUUwMDM3MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpIYW5kbGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMzQjAxRDYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNiINCi0JICAgIHF1aWQgICAgICAgCSIzRTExQ0VFODAwMDEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAic29hcEhlYWRlcnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFMTFDRUVBMDI5OCINCi0JCSAgICBsYWJlbCAgICAgIAkic29hcEhlYWRlcnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OlNPQVBIZWFkZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzk5MDIyRiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRTExQ0VFQTAyQTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6SGFuZGxlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDM0IwMUQ2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiDQotCSAgICBxdWlkICAgICAgIAkiM0UzOTUzMDIwMTg5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImJlYW5MaW5rIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRTM5NTMwNTAwMDciDQotCQkgICAgbGFiZWwgICAgICAJImJlYW5MaW5rIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkJlYW5MaW5rIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTM5NTJFNzAwRUMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOSINCi0JCSAgICBxdWlkICAgICAgIAkiM0UzOTUzMDUwMDExIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlNlcnZpY2VJbXBsQmVhbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDMEEwMDE2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAiDQotCSAgICBxdWlkICAgICAgIAkiM0U1Mjc2MzYwMjkzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInNvYXBSb2xlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Mjc2MzgwMjI3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJzb2FwUm9sZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OlNPQVBSb2xlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUNCQzAxNjQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0U1Mjc2MzgwMjMxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OkhhbmRsZXIiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzNCMDFENiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNUNCRUExMDIzNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkZXNjcmlwdGlvblR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNCRUEyMDBEOCINCi0JCSAgICBsYWJlbCAgICAgIAkiZGVzY3JpcHRpb25UeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzZEMDM1MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDQkVBMjAwRTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQiDQotCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JFQTcwMEMxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRpc3BsYXlOYW1lVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JFQTgwMzFCIg0KLQkJICAgIGxhYmVsICAgICAgCSJkaXNwbGF5TmFtZVR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkRpc3BsYXlOYW1lVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JDNzgwMjM2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUNCRUE4MDMyNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNiINCi0JICAgIHF1aWQgICAgICAgCSIzRjVDQkY4QTAxMTQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZGVzY3JpcHRpb25UeXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1Q0JGOEIwMDc1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvblR5cGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzZEMDM1MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVDQkY4QjAwODkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkluaXRQYXJhbSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDNkUwMjgwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgiDQotCSAgICBxdWlkICAgICAgIAkiM0Y1RERCQjcwMzExIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImRlc2NyaXB0aW9uVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1RERCQjgwMjU1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJkZXNjcmlwdGlvblR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkRlc2NyaXB0aW9uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JDNkQwMzUzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQkI4MDI2OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBMTUwMDMxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNUREQkJFMDM5RSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJkaXNwbGF5TmFtZVR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQkJGMDMwOSINCi0JCSAgICBsYWJlbCAgICAgIAkiZGlzcGxheU5hbWVUeXBlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEaXNwbGF5TmFtZVR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzc4MDIzNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjVEREJCRjAzMTMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkZDo6V2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMiINCi0JICAgIHF1aWQgICAgICAgCSIzRjVEREM0NTAwRjkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiaWNvblR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQzQ2MDA0NiINCi0JCSAgICBsYWJlbCAgICAgIAkiaWNvblR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJY29uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5RUUwMDNBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzMiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNUREQzQ2MDA1MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBMTUwMDMxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNGNURERTk1MDEyMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJpY29uVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1RERFOTYwMTZBIg0KLQkJICAgIGxhYmVsICAgICAgCSJpY29uVHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpjb21tb246Okljb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTlFRTAwM0EiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y1RERFOTYwMTdFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGQ6OlBvcnRDb21wb25lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQjhEMDFGNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBvcnRDb21wb25lbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUJBRDkwMkEzIg0KLQkgICAgdGl0bGUgICAgICAJIlBvcnRDb21wb25lbnQiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6RUpCTGluayIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMjczNCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoNzI1LCAyNjYxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUpCTGluayIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzIwMDI4RCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSg3MjUsIDI3MTMpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTI4NikNCi0JCSAgICB3aWR0aCAgICAgIAkzMDgNCi0JCSAgICBoZWlnaHQgICAgIAkxNjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6U2VydmxldExpbmsiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTY3LCAyNzE5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxMzkwLCAyNjQ2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmxldExpbmsiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMxNTAyRTIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTM5MCwgMjY5OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzUwKQ0KLQkJICAgIHdpZHRoICAgICAgCTM3Mg0KLQkJICAgIGhlaWdodCAgICAgCTE2Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1NiwgNjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxNTc1LCA1MDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJRTmFtZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNGM0JFRjVEMDJDMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxNTc1LCA2MDIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNQ0KLQkJCW1heF93aWR0aCAgCTU1OCkNCi0JCSAgICB3aWR0aCAgICAgIAk1ODANCi0JCSAgICBoZWlnaHQgICAgIAkzNTINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMTI5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSg2NCwgMTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OEQ2MDJFMCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSg2NCwgMTA2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyNTMpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGlzcGxheU5hbWUiIEA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2NDAsIDEyOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoNDI0LCAxMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5MjIwMDBFIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJbG9jYXRpb24gICAJKDQyNCwgMTA2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAk0MjgpDQotCQkgICAgd2lkdGggICAgICAJNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OkJlYW5MaW5rIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0MSwgMjQyNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMTE1NCwgMjM4MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJlYW5MaW5rIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUyRTcwMEVDIg0KLQkJICAgIHdpZHRoICAgICAgCTE5Mg0KLQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMzk1MzhCMDE0QiINCi0JCSAgICBjbGllbnQgICAgIAlAMQ0KLQkJICAgIHN1cHBsaWVyICAgCUA2DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDk2OCwgMjY1MCkNCi0JCQkoMTE3MiwgMjQ4MSkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTM5NTNBNTAxMEEiDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlANg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNDc0LCAyNjM1KQ0KLQkJCSgxMzAyLCAyNDgxKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpIYW5kbGVyIiBAOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2LCAyMjM5KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCWxvY2F0aW9uICAgCSgxMTksIDIwNjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDM0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIYW5kbGVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFDM0IwMUQ2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA5DQotCQkJbG9jYXRpb24gICAJKDExOSwgMjEyMSkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzc1KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1Mg0KLQkJICAgIGhlaWdodCAgICAgCTM2MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpXU0RMUG9ydCIgQDEwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODM5LCAxMDM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQlsb2NhdGlvbiAgIAkoMTc0NywgOTkzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV1NETFBvcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUJDNDAyMDUiDQotCQkgICAgd2lkdGggICAgICAJMjAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNDM4Qzg5MDM2MyINCi0JCSAgICBjbGllbnQgICAgIAlAMTANCi0JCSAgICBzdXBwbGllciAgIAlAMw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxODQxLCA5ODMpDQotCQkJKDE4NDEsIDg0OCkpDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgOTgzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODQxLCA4NDgpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpTZXJ2aWNlSW1wbEJlYW4iIEAxMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMSwgMTQwOSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJbG9jYXRpb24gICAJKDEwODgsIDEzNjQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjg2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTZXJ2aWNlSW1wbEJlYW4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMwQTAwMTYiDQotCQkgICAgd2lkdGggICAgICAJMzA0DQotCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgiIEAxMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjM1LCAxOTE3KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UzOTUzMDIwMTg5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImJlYW5MaW5rIiBAMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTksIDEyMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgxMTAyLCAyMTcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2JlYW5MaW5rIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU1OTQ0MQ0KLQkJCQloZWlnaHQgICAgIAkxMzcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UzOTUzMDUwMDA3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjM1LCAxOTE3KQ0KLQkJCQkoMTI0MCwgMjM3MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyNSwgMjI3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43ODMyMTcNCi0JCQkJaGVpZ2h0ICAgICAJODYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5IiBAMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTksIDEyMSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMzk1MzA1MDAxMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMzUsIDE5MTcpDQotCQkJCSgxMjMxLCAxNDY0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOA0KLQkJCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJCWxvY2F0aW9uICAgCSgxMjg1LCAxNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NTEwNQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OkRlc2NyaXB0aW9uVHlwZSIgQDE5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDQ2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJbG9jYXRpb24gICAJKDU1LCAzOTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM2RDAzNTMiDQotCQkgICAgd2lkdGggICAgICAJMjkyDQotCQkgICAgaGVpZ2h0ICAgICAJMTU2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEaXNwbGF5TmFtZVR5cGUiIEAyMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQwLCA0NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMA0KLQkJCWxvY2F0aW9uICAgCSg0OTEsIDM5NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzc4MDIzNiINCi0JCSAgICB3aWR0aCAgICAgIAkzMTYNCi0JCSAgICBoZWlnaHQgICAgIAkxNTYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJY29uVHlwZSIgQDIxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjE2LCA0MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCWxvY2F0aW9uICAgCSg5NjEsIDI1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkljb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk5RUUwMDNBIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCWxvY2F0aW9uICAgCSg5NjEsIDM1MykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk0DQotCQkJbWF4X3dpZHRoICAJNTA2KQ0KLQkJICAgIHdpZHRoICAgICAgCTUyOA0KLQkJICAgIGhlaWdodCAgICAgCTMwNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpQb3J0Q29tcG9uZW50IiBAMjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMTA0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJbG9jYXRpb24gICAJKDMyLCA4NTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjA4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQb3J0Q29tcG9uZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMEFCOEQwMUY2Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCWxvY2F0aW9uICAgCSgzMiwgOTAyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAk2MDQpDQotCQkgICAgd2lkdGggICAgICAJNjI2DQotCQkgICAgaGVpZ2h0ICAgICAJNDAwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDIzDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMTY0OSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDgwMDM3RSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJoYW5kbGVycyAiIEAyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIzDQotCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMTU0MSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI0DQotCQkJCWxvY2F0aW9uICAgCSgyOTYsIDE5NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraGFuZGxlcnMgIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5OTA4Mg0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQkQ4NDAyOTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMw0KLQkJCSAgICBzdXBwbGllciAgIAlAOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMzNiwgMTY0OSkNCi0JCQkJKDMzNiwgMjA1OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMzkwLCAyMDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDExNQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDI3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjMNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ4LCAxNTQxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUJEODQwMjk1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzM2LCAxNjQ5KQ0KLQkJCQkoMzM2LCAxMjQwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJCWxvY2F0aW9uICAgCSgzOTAsIDEyODIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMTE1DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAyOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAxMDM4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENjkwMEU4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIndzZGxQb3J0IiBAMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTA5LCA5MjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyMiwgMTA4MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3c2RsUG9ydCINCi0JCQkJcGN0RGlzdCAgICAJMC40MjEyOTYNCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENkEwMzRDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTE5MywgMTAzOCkNCi0JCQkJKDE3MzcsIDEwMzgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyDQotCQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQkJbG9jYXRpb24gICAJKDE3MzcsIDk5OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMS4wMDM2MjMNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJICAgIGxvY2F0aW9uICAgCSg5MDksIDkyMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFCRDZBMDM1NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExOTMsIDEwMzgpDQotCQkJCSg2NDksIDEwMzkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0DQotCQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQkJbG9jYXRpb24gICAJKDcwNywgOTg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NDczNw0KLQkJCQloZWlnaHQgICAgIAk1Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMzUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODc0LCAxMjYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENzQwMjlDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNlcnZpY2VJbXBsQmVhbiIgQDM2DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDU5MSwgMTE0NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNw0KLQkJCQlQYXJlbnRfVmlldyAJQDM2DQotCQkJCWxvY2F0aW9uICAgCSg5NzEsIDE1MzkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2VydmljZUltcGxCZWFuIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5NzUwNw0KLQkJCQloZWlnaHQgICAgIAkyMjINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUJENzYwMkY4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODc0LCAxMjYwKQ0KLQkJCQkoMTEwMCwgMTM1MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTA2NywgMTM3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MTM1NzENCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAzOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTEsIDExNDQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQkQ3NjAyRkEiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg4NzQsIDEyNjApDQotCQkJCSg2NDksIDExNjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwDQotCQkJCVBhcmVudF9WaWV3IAlAMzkNCi0JCQkJbG9jYXRpb24gICAJKDY5MiwgMTEyOSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTc1OTUNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIiIEA0MQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDY5MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCRUExMDIzNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvblR5cGUiIEA0Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQxDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNzIsIC0xMzIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTc5LCA2MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI1NQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZGVzY3JpcHRpb25UeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUwMTMyMA0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkVBMjAwRDgiDQotCQkJICAgIGNsaWVudCAgICAgCUA0MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNDgsIDY5MCkNCi0JCQkJKDIxMSwgNTQyKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJCWxvY2F0aW9uICAgCSgyNjcsIDU4MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTM3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjY4OTk1DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMyIgQDQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkgICAgbG9jYXRpb24gICAJKC03MiwgLTEzMikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUNCRUEyMDBFMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDQxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI0OCwgNjkwKQ0KLQkJCQkoMjg1LCA4MzkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDMzMywgODExKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5MDk1NA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNCIgQDQ3DQotCQkgICAgbG9jYXRpb24gICAJKDUxOSwgNjkwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JFQTcwMEMxIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRpc3BsYXlOYW1lVHlwZSIgQDQ4DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDcNCi0JCQkgICAgbG9jYXRpb24gICAJKDE5MiwgLTEyNCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDY2MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjg2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkaXNwbGF5TmFtZVR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuMTk0Njc0DQotCQkJCWhlaWdodCAgICAgCTENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JFQTgwMzFCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNTE5LCA2OTApDQotCQkJCSg1OTgsIDU0MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjUyLCA2MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1Nw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3ODUyNw0KLQkJCQloZWlnaHQgICAgIAk4MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUiIEA1MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIC0xMjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkVBODAzMjUiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MTksIDY5MCkNCi0JCQkJKDQ0MSwgODM5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDUxDQotCQkJCWxvY2F0aW9uICAgCSg0OTcsIDg0OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTgyNzYNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzQiIEA1Mw0KLQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDY5NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNURERTk1MDEyMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpY29uVHlwZSIgQDU0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ3NCwgLTM0NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDU0DQotCQkJCWxvY2F0aW9uICAgCSg5NDEsIDU1MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitpY29uVHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC43OTkzMjkNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERFOTYwMTZBIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODA3LCA2OTYpDQotCQkJCSgxMDAzLCA1NTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2DQotCQkJCVBhcmVudF9WaWV3IAlANTQNCi0JCQkJbG9jYXRpb24gICAJKDEwMTUsIDYxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDA1NzUNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM1IiBANTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDc0LCAtMzQ1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERFOTYwMTdFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODA3LCA2OTYpDQotCQkJCSg2MTEsIDgzOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNjYzLCA4NjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCN0UwMEMxIg0KLQkJICAgIGNsaWVudCAgICAgCUAxOQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE5MiwgMzg1KQ0KLQkJCSgxOTIsIDI1OCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCODIwMzNEIg0KLQkJICAgIGNsaWVudCAgICAgCUAyMA0KLQkJICAgIHN1cHBsaWVyICAgCUA1DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDY0MCwgMzg1KQ0KLQkJCSg2NDAsIDI1OCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiV2ViU2VydmljZXMiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMDlFOEEwMTgxIg0KLQkgICAgdGl0bGUgICAgICAJIldlYlNlcnZpY2VzIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OldlYlNlcnZpY2VEZXNjcmlwdGlvbiIgQDYxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODQsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCWxvY2F0aW9uICAgCSgxNDIsIDEwMDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDYxDQotCQkJbG9jYXRpb24gICAJKDE0MiwgMTA1NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk4DQotCQkJbWF4X3dpZHRoICAJNjgxKQ0KLQkJICAgIHdpZHRoICAgICAgCTcwMg0KLQkJICAgIGhlaWdodCAgICAgCTQ0OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RkOjpXZWJTZXJ2aWNlcyIgQDYyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODcsIDY5MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYyDQotCQkJbG9jYXRpb24gICAJKDM3NCwgNjQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiV2ViU2VydmljZXMiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwOUVFRjAxMkYiDQotCQkgICAgd2lkdGggICAgICAJMjQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAiIEA2Mw0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDg2OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBDQTczMDNDNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIiBANjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMywgNTYzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1DQotCQkJCVBhcmVudF9WaWV3IAlANjQNCi0JCQkJbG9jYXRpb24gICAJKDIzOSwgOTgyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNzQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3dlYlNlcnZpY2VEZXNjcmlwdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuOTM4NDE2DQotCQkJCWhlaWdodCAgICAgCTI0Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQ0E3NjAzNTEiDQotCQkJICAgIGNsaWVudCAgICAgCUA2Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANjENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0ODUsIDg2OCkNCi0JCQkJKDQ4NCwgOTkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJCWxvY2F0aW9uICAgCSg1MzgsIDk3OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTg4MjcNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExIiBANjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMywgNTYzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMENBNzYwMzVCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDg1LCA4NjgpDQotCQkJCSg0ODYsIDc0NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNTQwLCA3NTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk4Njc4DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIiBANjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ4NywgMjgxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJbG9jYXRpb24gICAJKDE0MSwgMTAyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQURGMjAxOTciDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJbG9jYXRpb24gICAJKDE0MSwgMjE3KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAk1DQotCQkJbWF4X3dpZHRoICAJNDM3KQ0KLQkJICAgIHdpZHRoICAgICAgCTcxMA0KLQkJICAgIGhlaWdodCAgICAgCTM4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MDIzQjBERDAwREQiDQotCQkgICAgY2xpZW50ICAgICAJQDYyDQotCQkgICAgc3VwcGxpZXIgICAJQDY5DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDQ4NywgNjM0KQ0KLQkJCSg0ODcsIDQ3MikpDQotCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiV2ViU2VydmljZURlc2NyaXB0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNFMTBENjZCMDJFQSINCi0JICAgIHRpdGxlICAgICAgCSJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMjYNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGlzcGxheU5hbWUiIEA3MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE3NiwgNjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzENCi0JCQlsb2NhdGlvbiAgIAkoMTk2MCwgNTIxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGlzcGxheU5hbWUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRBOTkyMjAwMEUiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDcxDQotCQkJbG9jYXRpb24gICAJKDE5NjAsIDYxNykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNDI4KQ0KLQkJICAgIHdpZHRoICAgICAgCTQ1MA0KLQkJICAgIGhlaWdodCAgICAgCTI1OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OkRlc2NyaXB0aW9uIiBANzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwOTYsIDMyMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcyDQotCQkJbG9jYXRpb24gICAJKDE5NjgsIDIwMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3Mg0KLQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyOTcpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTI1MykNCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkyNTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6UG9ydENvbXBvbmVudCIgQDczDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTUsIDE2MjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCWxvY2F0aW9uICAgCSg5MSwgMTQzMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBvcnRDb21wb25lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUI4RDAxRjYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDczDQotCQkJbG9jYXRpb24gICAJKDkxLCAxNDgzKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAk2MDQpDQotCQkgICAgd2lkdGggICAgICAJNjI2DQotCQkgICAgaGVpZ2h0ICAgICAJNDAwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiIEA3NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQwOCwgMzIwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQlsb2NhdGlvbiAgIAkoMTI3MSwgMjUyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVzY3JpcHRpb25UeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JDNkQwMzUzIg0KLQkJICAgIHdpZHRoICAgICAgCTI5Mg0KLQkJICAgIGhlaWdodCAgICAgCTE1Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREI3RTAwQzEiDQotCQkgICAgY2xpZW50ICAgICAJQDc0DQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1NTQsIDMyMCkNCi0JCQkoMTk1OCwgMzIwKSkNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2NvbW1vbjo6RGlzcGxheU5hbWVUeXBlIiBANzYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDY0MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDc2DQotCQkJbG9jYXRpb24gICAJKDEyNzUsIDU3MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRpc3BsYXlOYW1lVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUNCQzc4MDIzNiINCi0JCSAgICB3aWR0aCAgICAgIAkzMTYNCi0JCSAgICBoZWlnaHQgICAgIAkxNTYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCODIwMzNEIg0KLQkJICAgIGNsaWVudCAgICAgCUA3Ng0KLQkJICAgIHN1cHBsaWVyICAgCUA3MQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTgyLCA2NDApDQotCQkJKDE5NTAsIDY0MCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpJY29uVHlwZSIgQDc4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCA5OTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCWxvY2F0aW9uICAgCSgxMjMzLCA4NDkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTEwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJY29uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2NzY2NDIxDQotCQkgICAgcXVpZHUgICAgICAJIjNFNEE5OUVFMDAzQSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQlsb2NhdGlvbiAgIAkoMTIzMywgOTQ1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAk1MDYpDQotCQkgICAgd2lkdGggICAgICAJNTI4DQotCQkgICAgaGVpZ2h0ICAgICAJMzA2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGQ6OldlYlNlcnZpY2VEZXNjcmlwdGlvbiIgQDc5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzOTUsIDY0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDc5DQotCQkJbG9jYXRpb24gICAJKDUzLCA0MzApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXZWJTZXJ2aWNlRGVzY3JpcHRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQTE1MDAzMTMiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDc5DQotCQkJbG9jYXRpb24gICAJKDUzLCA0ODIpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJOA0KLQkJCW1heF93aWR0aCAgCTY4MSkNCi0JCSAgICB3aWR0aCAgICAgIAk3MDINCi0JCSAgICBoZWlnaHQgICAgIAk0NDgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDgwDQotCQkgICAgbG9jYXRpb24gICAJKDM5NSwgMTE0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTFCN0M4MDMzRiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwb3J0Q29tcG9uZW50cyIgQDgxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODANCi0JCQkgICAgbG9jYXRpb24gICAJKDEwNywgOTgzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyDQotCQkJCVBhcmVudF9WaWV3IAlAODENCi0JCQkJbG9jYXRpb24gICAJKDM1NSwgMTM2MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjcwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwb3J0Q29tcG9uZW50cyINCi0JCQkJcGN0RGlzdCAgICAJMC43OTc5MjANCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUI3Q0MwMkMzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODANCi0JCQkgICAgc3VwcGxpZXIgICAJQDczDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzk1LCAxMTQ0KQ0KLQkJCQkoMzk1LCAxNDIwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDgxDQotCQkJCWxvY2F0aW9uICAgCSg0NDksIDEzOTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODk4OTYwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDg0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODANCi0JCQkgICAgbG9jYXRpb24gICAJKDEwNywgOTgzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0UxMUI3Q0MwMkNEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODANCi0JCQkgICAgc3VwcGxpZXIgICAJQDc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzk1LCAxMTQ0KQ0KLQkJCQkoMzk1LCA4NjgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1DQotCQkJCVBhcmVudF9WaWV3IAlAODQNCi0JCQkJbG9jYXRpb24gICAJKDQ0OSwgODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDI5OA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOCIgQDg2DQotCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDQ0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNUREQkI3MDMxMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZXNjcmlwdGlvblR5cGUiIEA4Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg2DQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDgsIC0xODkpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5OCwgMzQ2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2Rlc2NyaXB0aW9uVHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC43OTY1MzINCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERCQjgwMjU1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAODYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTAwMywgNDQ4KQ0KLQkJCQkoMTI2MSwgMzY2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDg3DQotCQkJCWxvY2F0aW9uICAgCSgxMjUxLCA0MjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk2NDE2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOSIgQDkwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODYNCi0JCQkgICAgbG9jYXRpb24gICAJKDY0OCwgLTE4OSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUREQkI4MDI2OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDg2DQotCQkJICAgIHN1cHBsaWVyICAgCUA3OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMDMsIDQ0OCkNCi0JCQkJKDc0NiwgNTMwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkwDQotCQkJCWxvY2F0aW9uICAgCSg3ODksIDU3NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTQ4NzUNCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAiIEA5Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCA2NDEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREJCRTAzOUUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZGlzcGxheU5hbWVUeXBlIiBAOTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ5LCAxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDEyMTEsIDYwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjk2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkaXNwbGF5TmFtZVR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuNzk2OTkyDQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNUREQkJGMDMwOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDkyDQotCQkJICAgIHN1cHBsaWVyICAgCUA3Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwMDUsIDY0MSkNCi0JCQkJKDEyNjUsIDY0MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzOCwgNjk0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5ODQ5Ng0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEiIEA5Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDksIDEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREJCRjAzMTMiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANzkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMDA1LCA2NDEpDQotCQkJCSg3NDYsIDY0MikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Ng0KLQkJCQlsb2NhdGlvbiAgIAkoNzcyLCA2OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk4NDk2DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMyIiBAOTgNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTg0LCA4MzApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREM0NTAwRjkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaWNvblR5cGUiIEA5OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk4DQotCQkJICAgIGxvY2F0aW9uICAgCSg2MzEsIDE4NSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDANCi0JCQkJUGFyZW50X1ZpZXcgCUA5OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NywgODUzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2ljb25UeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5NTAwMw0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREM0NjAwNDYiDQotCQkJICAgIGNsaWVudCAgICAgCUA5OA0KLQkJCSAgICBzdXBwbGllciAgIAlANzgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5ODQsIDgzMCkNCi0JCQkJKDEyMjMsIDkwNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxDQotCQkJCVBhcmVudF9WaWV3IAlAOTkNCi0JCQkJbG9jYXRpb24gICAJKDExODMsIDk1MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDE5NDYNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMzIiBAMTAyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDYzMSwgMTg1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1RERDNDYwMDUwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDc5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTg0LCA4MzApDQotCQkJCSg3NDYsIDc1NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzDQotCQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJCWxvY2F0aW9uICAgCSg3NTgsIDgxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44ODk5MTgNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkhhbmRsZXIiDQotCSAgICBxdWlkICAgICAgIAkiM0UxMUNDNTAwMzA0Ig0KLQkgICAgdGl0bGUgICAgICAJIkhhbmRsZXIiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJNjk0DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpjb21tb246OlFOYW1lIiBAMTA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODM2LCAxMDEyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA0DQotCQkJbG9jYXRpb24gICAJKDE1NTUsIDg0NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlFOYW1lIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0YzQkVGNUQwMkMwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQlsb2NhdGlvbiAgIAkoMTU1NSwgOTQyKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTUNCi0JCQltYXhfd2lkdGggIAk1NTgpDQotCQkgICAgd2lkdGggICAgICAJNTgwDQotCQkgICAgaGVpZ2h0ICAgICAJMzUyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpTT0FQSGVhZGVyIiBAMTA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAxNDU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJbG9jYXRpb24gICAJKDk3NSwgMTM3NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkyMjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBIZWFkZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUM5OTAyMkYiDQotCQkgICAgd2lkdGggICAgICAJMjQ0DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjQ2NzE4NzAwNDkiDQotCQkgICAgY2xpZW50ICAgICAJQDEwNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMDQNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTIxMCwgMTM4MikNCi0JCQkoMTU0NSwgMTE4MykpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3Njb21tb246OlNPQVBSb2xlIiBAMTA3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDE4NDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQlsb2NhdGlvbiAgIAkoMzQ4LCAxNzM0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTM2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUFJvbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUNCQzAxNjQiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCWxvY2F0aW9uICAgCSgzNDgsIDE4MzApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTMxMikNCi0JCSAgICB3aWR0aCAgICAgIAkzNzgNCi0JCSAgICBoZWlnaHQgICAgIAkyMzINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkZDo6SGFuZGxlciIgQDEwOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjgxLCA4ODQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDc1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhhbmRsZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTEwQUMzQjAxRDYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDEwOA0KLQkJCWxvY2F0aW9uICAgCSg2MiwgODA5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkzNzUpDQotCQkgICAgd2lkdGggICAgICAJNDU2DQotCQkgICAgaGVpZ2h0ICAgICAJMjc1DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYiIEAxMDkNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzE5LCAxMTk1KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0UxMUNFRTgwMDAxIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNvYXBIZWFkZXJzIiBAMTEwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1ODIsIDEwOTApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExDQotCQkJCVBhcmVudF9WaWV3IAlAMTEwDQotCQkJCWxvY2F0aW9uICAgCSg4OTIsIDEzNjcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc29hcEhlYWRlcnMiDQotCQkJCXBjdERpc3QgICAgCTAuNzk5OTcwDQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFDRUVBMDI5OCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzE5LCAxMTk1KQ0KLQkJCQkoOTY1LCAxMzY4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJbG9jYXRpb24gICAJKDk3MCwgMTMwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC45MDEyNjANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3IiBAMTEzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5DQotCQkJICAgIGxvY2F0aW9uICAgCSg1ODIsIDEwOTApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRTExQ0VFQTAyQTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDcxOSwgMTE5NSkNCi0JCQkJKDQ3NSwgMTAyMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTEzDQotCQkJCWxvY2F0aW9uICAgCSg1MzAsIDk5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTc5NTkNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAiIEAxMTUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDA2LCAxMzcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1Mjc2MzYwMjkzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNvYXBSb2xlcyIgQDExNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA0MTMpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3DQotCQkJCVBhcmVudF9WaWV3IAlAMTE2DQotCQkJCWxvY2F0aW9uICAgCSgzNzUsIDE2NTUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc29hcFJvbGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjczMjk2OA0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1Mjc2MzgwMjI3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0MDYsIDEzNzIpDQotCQkJCSg0OTcsIDE3MjMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQlQYXJlbnRfVmlldyAJQDExNg0KLQkJCQlsb2NhdGlvbiAgIAkoNTc0LCAxNjgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0MDA4Ng0KLQkJCQloZWlnaHQgICAgIAk4Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEiIEAxMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4NywgNDEzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0U1Mjc2MzgwMjMxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg0MDYsIDEzNzIpDQotCQkJCSgzMTUsIDEwMjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDExOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzc2LCAxMDQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpEZXNjcmlwdGlvblR5cGUiIEAxMjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3MjgsIDUyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCWxvY2F0aW9uICAgCSgxNTkxLCA0NjApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZXNjcmlwdGlvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkM2RDAzNTMiDQotCQkgICAgd2lkdGggICAgICAJMjkyDQotCQkgICAgaGVpZ2h0ICAgICAJMTU2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzY29tbW9uOjpJbml0UGFyYW0iIEAxMjINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwNTYsIDk2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAk4DQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyMg0KLQkJCWxvY2F0aW9uICAgCSg4NTAsIDgxMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk0MTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkluaXRQYXJhbSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNFMTBBQzZFMDI4MCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMTIyDQotCQkJbG9jYXRpb24gICAJKDg1MCwgOTA5KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTQNCi0JCQltYXhfd2lkdGggIAkzNTYpDQotCQkgICAgd2lkdGggICAgICAJNDMwDQotCQkgICAgaGVpZ2h0ICAgICAJMzE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQiIEAxMjMNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjc0LCA5MjEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTExQ0VERTAzMUUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdFBhcmFtcyAiIEAxMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMNCi0JCQkgICAgbG9jYXRpb24gICAJKDUzNywgODA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQlsb2NhdGlvbiAgIAkoNjk2LCA5NDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4Mw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraW5pdFBhcmFtcyAiDQotCQkJCXBjdERpc3QgICAgCTAuMTQzNTkwDQotCQkJCWhlaWdodCAgICAgCTI2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFDRUUwMDM3MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTIyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjc0LCA5MjEpDQotCQkJCSg4NDAsIDkzNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2DQotCQkJCVBhcmVudF9WaWV3IAlAMTI0DQotCQkJCWxvY2F0aW9uICAgCSg4MjgsIDg4NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTkzNTkNCi0JCQkJaGVpZ2h0ICAgICAJNTINCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1IiBAMTI3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzDQotCQkJICAgIGxvY2F0aW9uICAgCSg1MzcsIDgwOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNFMTFDRUUwMDM3MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNjc0LCA5MjEpDQotCQkJCSg1MDksIDkwNCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4DQotCQkJCVBhcmVudF9WaWV3IAlAMTI3DQotCQkJCWxvY2F0aW9uICAgCSg1MzIsIDg1NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTkxMjUNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYiIEAxMjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQzOCwgNzEzKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JGOEEwMTE0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImRlc2NyaXB0aW9uVHlwZXMiIEAxMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKDM4NiwgLTI0MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDU5NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitkZXNjcmlwdGlvblR5cGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMzY5Mg0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjVDQkY4QjAwNzUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE0MzgsIDcxMykNCi0JCQkJKDE2MDUsIDYwNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyDQotCQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJCWxvY2F0aW9uICAgCSgxNjE1LCA2NjMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJOA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODk1MjkwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNyIgQDEzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzg2LCAtMjQyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y1Q0JGOEIwMDg5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDM4LCA3MTMpDQotCQkJCSgxMjcxLCA4MjEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNA0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgODU0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTgNCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5MTUwOA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6Y29tbW9uOjpEZXNjcmlwdGlvbiIgQDEzNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjM2OCwgNTI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTgNCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM1DQotCQkJbG9jYXRpb24gICAJKDIyNDAsIDQwOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTY3NjY0MjENCi0JCSAgICBxdWlkdSAgICAgIAkiM0U0QTk4RDYwMkUwIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQlsb2NhdGlvbiAgIAkoMjI0MCwgNTA1KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAk4DQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTMNCi0JCQltYXhfd2lkdGggIAkyNTMpDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMjU4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmNvbW1vbjo6RGVzY3JpcHRpb25Hcm91cCIgQDEzNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA0OTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJOA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzYNCi0JCQlsb2NhdGlvbiAgIAkoODIsIDQyOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlc2NyaXB0aW9uR3JvdXAiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc2NjQyMQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRTRENDUxRjAxRkIiDQotCQkgICAgd2lkdGggICAgICAJMzAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTU2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjVEREI3RTAwQzEiDQotCQkgICAgY2xpZW50ICAgICAJQDEyMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzUNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTg3NCwgNTI4KQ0KLQkJCSgyMjMwLCA1MjgpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTA1YThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIgZWxlbWVudCBkZWZpbmVzIHRoZSBvcmRlciB0aGF0IGNvbXBsZXhUeXBlIGVsZW1lbnQgdmFsdWVzIGFyZSBhcHBsaWVkIHRvIGEgSmF2YSBleGNlcHRpb24gY29uc3RydWN0b3IuIEVsZW1lbnQgbmFtZXMgYXJlIHNwZWNpZmllZCBmb3IgZWFjaCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgZWxlbWVudCBuYW1lcyBvZiBpbmhlcml0ZWQgdHlwZXMgaWYgbmVjZXNzYXJ5LgotICogCi0gKiBVc2VkIGluOiBleGNlcHRpb24tbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyI2dldEVsZW1lbnROYW1lcyA8ZW0+RWxlbWVudCBOYW1lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9FbGVtZW50TmFtZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0RWxlbWVudE5hbWVzKCk7Ci0KLX0gLy8gQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0VsZW1lbnROYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvRWxlbWVudE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzMmUwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvRWxlbWVudE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZWxlbWVudC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIGNvbXBsZXhUeXBlIGVsZW1lbnQgbmFtZSBhdHRyaWJ1dGUgdmFsdWUuCi0gKiAKLSAqIFVzZWQgaW46IGNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlcgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRFbGVtZW50TmFtZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGVtZW50TmFtZSBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RWxlbWVudE5hbWVfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRleHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRFbGVtZW50TmFtZV9UZXh0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSNnZXRUZXh0IDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFbGVtZW50TmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0V4Y2VwdGlvbk1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9FeGNlcHRpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTY2NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0V4Y2VwdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhjZXB0aW9uIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZXhjZXB0aW9uLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uIHR5cGVzIGFuZCB0aGUgd3NkbCBmYXVsdHMuCi0gKiAKLSAqIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZQotICogbWFwcGluZyBiZXR3ZWVuIGEgbWV0aG9kIGFuZCBhbiBvcGVyYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhlIG1hcHBpbmcgY29udGV4dC4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGNlcHRpb25NYXBwaW5nIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRFeGNlcHRpb25NYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjZXB0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGV4Y2VwdGlvbi10eXBlIGVsZW1lbnQgZGVmaW5lcyBKYXZhIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4gSXQgbWF5IGJlIGEgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24uCi0JICogCi0JICogSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCSAqIAotCSAqIFVzZWQgaW46IGV4Y2VwdGlvbi1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNlcHRpb25UeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZ19FeGNlcHRpb25UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRFeGNlcHRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4Y2VwdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRFeGNlcHRpb25UeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZShXU0RMTWVzc2FnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExNZXNzYWdlIGdldFdzZGxNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIHZhbHVlKTsKLQotfSAvLyBFeGNlcHRpb25NYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSW50ZXJmYWNlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0ludGVyZmFjZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0MGY0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSW50ZXJmYWNlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVyZmFjZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SW50ZXJmYWNlTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcmZhY2VNYXBwaW5nIGV4dGVuZHMgRU9iamVjdHsKLSAvLyBJbnRlcmZhY2VNYXBwaW5nCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF2YVdTRExNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF2YVdTRExNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzODc2MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0phdmFXU0RMTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBXU0RMIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgbWFwcGluZyB0byBhIGtub3duIFdTREwgZG9jdW1lbnQuSXQgY29udGFpbnMgdGhlIG1hcHBpbmcgYmV0d2VlbiBwYWNrYWdlIG5hbWVzIGFuZCBYTUwgbmFtZXNwYWNlcywgCi0gKiBXU0RMIHJvb3QgdHlwZXMgYW5kIEphdmEgYXJ0aWZhY3RzLCBhbmQgdGhlIHNldCBvZiBtYXBwaW5ncyBmb3Igc2VydmljZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldFBhY2thZ2VNYXBwaW5ncyA8ZW0+UGFja2FnZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldEphdmFYTUxUeXBlTWFwcGluZ3MgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRFeGNlcHRpb25NYXBwaW5ncyA8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SW50ZXJmYWNlTWFwcGluZ3MgPGVtPkludGVyZmFjZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVdTRExNYXBwaW5nIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhY2thZ2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhY2thZ2UgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFBhY2thZ2VNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNlcHRpb24gTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldEV4Y2VwdGlvbk1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldEludGVyZmFjZU1hcHBpbmdzKCk7Ci0KLX0gLy8gSmF2YVdTRExNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF2YVhNTFR5cGVNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF2YVhNTFR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZDIyZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0phdmFYTUxUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBYTUwgVHlwZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGphdmEteG1sLXR5cGUtbWFwcGluZyBlbGVtZW50IGNvbnRhaW5zIGEgY2xhc3MtdHlwZSB0aGF0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcywgUU5hbWUgb2YgdGhlIFhNTCByb290IHR5cGUsIHRoZSBXU0RMIHR5cGUgc2NvcGUgdGhlIFFOYW1lIGFwcGxpZXMgdG8gYW5kIHRoZSBzZXQgb2YgdmFyaWFibGUgCi0gKiBtYXBwaW5ncyBmb3IgZWFjaCBwdWJsaWMgdmFyaWFibGUgd2l0aGluIHRoZSBKYXZhIGNsYXNzLgotICogCi0gKiBVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRDbGFzc1R5cGUgPGVtPkNsYXNzIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRRbmFtZVNjb3BlIDxlbT5RbmFtZSBTY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldEFub255bW91c1R5cGVRbmFtZSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRSb290VHlwZVFuYW1lIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRWYXJpYWJsZU1hcHBpbmdzIDxlbT5WYXJpYWJsZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVhNTFR5cGVNYXBwaW5nIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhWE1MVHlwZU1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY2xhc3MtdHlwZSBlbGVtZW50IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIEphdmEgY2xhc3MuCi0JICogCi0JICogVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFYTUxUeXBlTWFwcGluZ19DbGFzc1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldENsYXNzVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldENsYXNzVHlwZSA8ZW0+Q2xhc3MgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldENsYXNzVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UW5hbWUgU2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UW5hbWUgU2NvcGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHFuYW1lLXNjb3BlIGVsZW1lbnRzIHNjb3BlcyB0aGUgcmVmZXJlbmNlIG9mIGEgUU5hbWUgdG8gdGhlIFdTREwgZWxlbWVudCB0eXBlIGl0IGFwcGxpZXMgdG8uIFRoZSB2YWx1ZSBvZiBxbmFtZS1zY29wZSBtYXkgYmUgc2ltcGxlVHlwZSwgY29tcGxleFR5cGUsIG9yIGVsZW1lbnQuCi0JICogCi0JICogVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlFuYW1lIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRRbmFtZVNjb3BlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFFuYW1lU2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRRbmFtZVNjb3BlIDxlbT5RbmFtZSBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFuYW1lIFNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRRbmFtZVNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UW5hbWVTY29wZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFub255bW91c1R5cGVRbmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFYTUxUeXBlTWFwcGluZ19Bbm9ueW1vdXNUeXBlUW5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEFub255bW91c1R5cGVRbmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldEFub255bW91c1R5cGVRbmFtZSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QW5vbnltb3VzVHlwZVFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0QW5vbnltb3VzVHlwZVFuYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb290IFR5cGUgUW5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Um9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFJvb3RUeXBlUW5hbWUgZ2V0Um9vdFR5cGVRbmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldFJvb3RUeXBlUW5hbWUgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um9vdFR5cGVRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFJvb3RUeXBlUW5hbWUoUm9vdFR5cGVRbmFtZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJsZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmxlIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldEphdmFYTUxUeXBlTWFwcGluZ19WYXJpYWJsZU1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVMaXN0IGdldFZhcmlhYmxlTWFwcGluZ3MoKTsKLQotfSAvLyBKYXZhWE1MVHlwZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMwYjk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhycGNtYXBGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEpheHJwY21hcEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+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+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEpheHJwY21hcFBhY2thZ2UgZ2V0SmF4cnBjbWFwUGFja2FnZSgpOwotCi19IC8vSmF4cnBjbWFwRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDNjZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4cnBjbWFwUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5BTUUgPSAiamF4cnBjbWFwIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGVOU19VUkkgPSAiamF4cnBjbWFwLnhtaSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEpheHJwY21hcFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVdTRExNYXBwaW5nSW1wbCA8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEphdmFXU0RMTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1dTRExfTUFQUElOR19fSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1MgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1MgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2VwdGlvbiBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9XU0RMX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUGFja2FnZU1hcHBpbmdJbXBsIDxlbT5QYWNrYWdlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5QYWNrYWdlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0UGFja2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFBBQ0tBR0VfTUFQUElORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBBQ0tBR0VfTUFQUElOR19fSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBBQ0tBR0VfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsIDxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldEphdmFYTUxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RbmFtZSBTY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvb3QgVHlwZSBRbmFtZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1MgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgRVhDRVBUSU9OX01BUFBJTkcgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFWENFUFRJT05fTUFQUElOR19fSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2VwdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFWENFUFRJT05fTUFQUElOR19fRVhDRVBUSU9OX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4Y2VwdGlvbiBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgRVhDRVBUSU9OX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSW50ZXJmYWNlTWFwcGluZ0ltcGwgPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSW50ZXJmYWNlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0SW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgSU5URVJGQUNFX01BUFBJTkcgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwgPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkcgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRCA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0lOVEVSRkFDRSA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgU2VydmljZSBOYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUyA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gSU5URVJGQUNFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFBvcnQgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEJpbmRpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORyA9IElOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdTID0gSU5URVJGQUNFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBJTlRFUkZBQ0VfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Sb290VHlwZVFuYW1lSW1wbCA8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUm9vdFR5cGVRbmFtZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0Um9vdFR5cGVRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgUk9PVF9UWVBFX1FOQU1FID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBST09UX1RZUEVfUU5BTUVfX05BTUVTUEFDRV9VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIFBhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFJPT1RfVFlQRV9RTkFNRV9fTE9DQUxfUEFSVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFJPT1RfVFlQRV9RTkFNRV9fQ09NQklORURfUU5BTUUgPSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBST09UX1RZUEVfUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkkgPSBDb21tb25QYWNrYWdlLlFOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBST09UX1RZUEVfUU5BTUVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuVmFyaWFibGVNYXBwaW5nSW1wbCA8ZW0+VmFyaWFibGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlZhcmlhYmxlTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBWQVJJQUJMRV9NQVBQSU5HID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgVkFSSUFCTEVfTUFQUElOR19fSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgVmFyaWFibGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YbWwgRWxlbWVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBWQVJJQUJMRV9NQVBQSU5HX19YTUxfRUxFTUVOVF9OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhIE1lbWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhtbCBBdHRyaWJ1dGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgVkFSSUFCTEVfTUFQUElOR19fWE1MX0FUVFJJQlVURV9OQU1FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YbWwgV2lsZGNhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBWQVJJQUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlSW1wbCA8ZW0+V1NETCBNZXNzYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0UgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX19MT0NBTF9QQVJUID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTE9DQUxfUEFSVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21iaW5lZCBRTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX19DT01CSU5FRF9RTkFNRSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldTREwgTWVzc2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5RTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbCA8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBDT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRWxlbWVudE5hbWVJbXBsIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FbGVtZW50TmFtZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0RWxlbWVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IEVMRU1FTlRfTkFNRSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFTEVNRU5UX05BTUVfX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFTEVNRU5UX05BTUVfX1RFWFQgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBFTEVNRU5UX05BTUVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFNlcnZpY2VOYW1lSW1wbCA8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMU2VydmljZU5hbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExTZXJ2aWNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUUgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1NFUlZJQ0VfTkFNRV9fTkFNRVNQQUNFX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgUGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUVfX0xPQ0FMX1BBUlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbWJpbmVkIFFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1NFUlZJQ0VfTkFNRV9fQ09NQklORURfUU5BTUUgPSBDb21tb25QYWNrYWdlLlFOQU1FX19DT01CSU5FRF9RTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcm5hbCBQcmVmaXggT3IgTnMgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1NFUlZJQ0VfTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9TRVJWSUNFX05BTUVfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUG9ydE1hcHBpbmdJbXBsIDxlbT5Qb3J0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Qb3J0TWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0UG9ydE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFBPUlRfTUFQUElORyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBQT1JUX01BUFBJTkdfX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfTUFQUElOR19fUE9SVF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIFBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgUE9SVF9NQVBQSU5HX19KQVZBX1BPUlRfTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBvcnQgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFBPUlRfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUG9ydFR5cGVJbXBsIDxlbT5XU0RMIFBvcnQgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExQb3J0VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0V1NETFBvcnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfVFlQRSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFX19OQU1FU1BBQ0VfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfVFlQRV9fTE9DQUxfUEFSVCA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0xPQ0FMX1BBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tYmluZWQgUU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFX19DT01CSU5FRF9RTkFNRSA9IENvbW1vblBhY2thZ2UuUU5BTUVfX0NPTUJJTkVEX1FOQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVybmFsIFByZWZpeCBPciBOcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUE9SVF9UWVBFX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V1NETCBQb3J0IFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1BPUlRfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5RTkFNRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMQmluZGluZ0ltcGwgPGVtPldTREwgQmluZGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExCaW5kaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgV1NETF9CSU5ESU5HID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9CSU5ESU5HX19OQU1FU1BBQ0VfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBQYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX0JJTkRJTkdfX0xPQ0FMX1BBUlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX19MT0NBTF9QQVJUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbWJpbmVkIFFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX0JJTkRJTkdfX0NPTUJJTkVEX1FOQU1FID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fQ09NQklORURfUU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJuYWwgUHJlZml4IE9yIE5zIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9CSU5ESU5HX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJID0gQ29tbW9uUGFja2FnZS5RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V1NETCBCaW5kaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9CSU5ESU5HX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLlFOQU1FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsIDxlbT5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF4cnBjbWFwUGFja2FnZUltcGwjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElORyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBNZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSkFWQV9NRVRIT0RfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBPcGVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XcmFwcGVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBTRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExPcGVyYXRpb25JbXBsIDxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExPcGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkpheHJwY21hcFBhY2thZ2VJbXBsI2dldFdTRExPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdTRExfT1BFUkFUSU9OID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfT1BFUkFUSU9OX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBPcGVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfT1BFUkFUSU9OX19XU0RMX09QRVJBVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldTREwgT3BlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkcgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBQb3NpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBNRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IE1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwgPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUmV0dXJuIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlTWFwcGluZ0ltcGwgPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9NQVBQSU5HID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9NQVBQSU5HX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgSGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVIgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBpbnQgV1NETF9NRVNTQUdFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwgPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZVBhcnROYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBQYWNrYWdlSW1wbCNnZXRXU0RMTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcgPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KYXZhIFdTREwgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEphdmFXU0RMTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRKYXZhV1NETE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRKYXZhV1NETE1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0UGFja2FnZU1hcHBpbmdzIDxlbT5QYWNrYWdlIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFja2FnZSBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRQYWNrYWdlTWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldEphdmFXU0RMTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncyA8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0RXhjZXB0aW9uTWFwcGluZ3MgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyNnZXRFeGNlcHRpb25NYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0SmF2YVdTRExNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nI2dldEludGVyZmFjZU1hcHBpbmdzIDxlbT5JbnRlcmZhY2UgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmcjZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldEphdmFXU0RMTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcgPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRQYWNrYWdlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UGFja2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQYWNrYWdlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRQYWNrYWdlVHlwZSA8ZW0+UGFja2FnZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldFBhY2thZ2VUeXBlKCkKLQkgKiBAc2VlICNnZXRQYWNrYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0TmFtZXNwYWNlVVJJKCkKLQkgKiBAc2VlICNnZXRQYWNrYWdlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nIDxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEphdmFYTUxUeXBlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldENsYXNzVHlwZSA8ZW0+Q2xhc3MgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldENsYXNzVHlwZSgpCi0JICogQHNlZSAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0UW5hbWVTY29wZSA8ZW0+UW5hbWUgU2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UW5hbWUgU2NvcGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0UW5hbWVTY29wZSgpCi0JICogQHNlZSAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1FuYW1lU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldEFub255bW91c1R5cGVRbmFtZSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0QW5vbnltb3VzVHlwZVFuYW1lKCkKLQkgKiBAc2VlICNnZXRKYXZhWE1MVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZyNnZXRSb290VHlwZVFuYW1lIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldFJvb3RUeXBlUW5hbWUoKQotCSAqIEBzZWUgI2dldEphdmFYTUxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEphdmFYTUxUeXBlTWFwcGluZ19Sb290VHlwZVFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nI2dldFZhcmlhYmxlTWFwcGluZ3MgPGVtPlZhcmlhYmxlIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcjZ2V0VmFyaWFibGVNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeGNlcHRpb24gTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRFeGNlcHRpb25NYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEV4Y2VwdGlvbk1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRFeGNlcHRpb25UeXBlIDxlbT5FeGNlcHRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNlcHRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRXc2RsTWVzc2FnZSgpCi0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkKLQkgKiBAc2VlICNnZXRFeGNlcHRpb25NYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyA8ZW0+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbFNlcnZpY2VOYW1lIDxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxTZXJ2aWNlTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRQb3J0TWFwcGluZ3MgPGVtPlBvcnQgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3J0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0UG9ydE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxQb3J0VHlwZSA8ZW0+V3NkbCBQb3J0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBQb3J0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxQb3J0VHlwZSgpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbEJpbmRpbmcgPGVtPldzZGwgQmluZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIEJpbmRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxCaW5kaW5nKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZSA8ZW0+Um9vdCBUeXBlIFFuYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0Um9vdFR5cGVRbmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nIDxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0VmFyaWFibGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFZhcmlhYmxlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFZhcmlhYmxlTWFwcGluZ19JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0SmF2YVZhcmlhYmxlTmFtZSA8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRKYXZhVmFyaWFibGVOYW1lKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJsZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0WG1sRWxlbWVudE5hbWUgPGVtPlhtbCBFbGVtZW50IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxFbGVtZW50TmFtZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX1htbEVsZW1lbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc0RhdGFNZW1iZXIgPGVtPkRhdGEgTWVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGEgTWVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzRGF0YU1lbWJlcigpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX0RhdGFNZW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldFhtbEF0dHJpYnV0ZU5hbWUgPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjZ2V0WG1sQXR0cmlidXRlTmFtZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzWG1sV2lsZGNhcmQgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YbWwgV2lsZGNhcmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNYbWxXaWxkY2FyZCgpCi0JICogQHNlZSAjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0VmFyaWFibGVNYXBwaW5nX1htbFdpbGRjYXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZSA8ZW0+V1NETCBNZXNzYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyI2dldEVsZW1lbnROYW1lcyA8ZW0+RWxlbWVudCBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVsZW1lbnQgTmFtZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyI2dldEVsZW1lbnROYW1lcygpCi0JICogQHNlZSAjZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldEVsZW1lbnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldElkKCkKLQkgKiBAc2VlICNnZXRFbGVtZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldEVsZW1lbnROYW1lX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldFRleHQgPGVtPlRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lI2dldFRleHQoKQotCSAqIEBzZWUgI2dldEVsZW1lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0RWxlbWVudE5hbWVfVGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lIDxlbT5XU0RMIFNlcnZpY2UgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMU2VydmljZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nIDxlbT5Qb3J0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0UG9ydE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFBvcnRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydE1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRQb3J0TmFtZSgpCi0JICogQHNlZSAjZ2V0UG9ydE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRKYXZhUG9ydE5hbWUgPGVtPkphdmEgUG9ydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkphdmEgUG9ydCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SmF2YVBvcnROYW1lKCkKLQkgKiBAc2VlICNnZXRQb3J0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFBvcnRNYXBwaW5nX0phdmFQb3J0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlIDxlbT5XU0RMIFBvcnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBQb3J0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMUG9ydFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nIDxlbT5XU0RMIEJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwgQmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V1NETEJpbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SmF2YU1ldGhvZE5hbWUgPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SmF2YU1ldGhvZE5hbWUoKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNpc1dyYXBwZWRFbGVtZW50IDxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNpc1dyYXBwZWRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZyA8ZW0+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVSZWZlcmVuY2UgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uIDxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQ2xhc3MgZ2V0V1NETE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdTRExPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMT3BlcmF0aW9uX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBzZWUgI2dldFdTRExPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMT3BlcmF0aW9uX1dzZGxPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFBhcmFtUG9zaXRpb24gPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1Qb3NpdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFBhcmFtVHlwZSA8ZW0+UGFyYW0gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJhbSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1UeXBlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRXc2RsTWVzc2FnZU1hcHBpbmcgPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFUmVmZXJlbmNlIGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyA8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRNZXRob2RSZXR1cm5WYWx1ZSA8ZW0+TWV0aG9kIFJldHVybiBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRNZXRob2RSZXR1cm5WYWx1ZSgpCi0JICogQHNlZSAjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBzZWUgI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2UoKQotCSAqIEBzZWUgI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcgPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMIE1lc3NhZ2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUNsYXNzIGdldFdTRExNZXNzYWdlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldElkKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0UGFyYW1ldGVyTW9kZSA8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjZ2V0UGFyYW1ldGVyTW9kZSgpCi0JICogQHNlZSAjZ2V0V1NETE1lc3NhZ2VNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1BhcmFtZXRlck1vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRVJlZmVyZW5jZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2lzU29hcEhlYWRlciA8ZW0+U29hcCBIZWFkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBIZWFkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmcjaXNTb2FwSGVhZGVyKCkKLQkgKiBAc2VlICNnZXRXU0RMTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRXU0RMTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFQXR0cmlidXRlIGdldFdTRExNZXNzYWdlUGFydE5hbWVfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBzZWUgI2dldFdTRExNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmcgPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEVDbGFzcyBnZXRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIEpheHJwY21hcEZhY3RvcnkgZ2V0SmF4cnBjbWFwRmFjdG9yeSgpOwotCi19IC8vSmF4cnBjbWFwUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1NTc1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpheHJwY21hcFJlc291cmNlIGV4dGVuZHMgWE1MUmVzb3VyY2UKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFYUlBDX01BUF9UWVBFID0gODsKLQotICBKYXZhV1NETE1hcHBpbmcgZ2V0SmF2YVdTRExNYXBwaW5nKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzSmF4cnBjbWFwMV8wKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzSmF4cnBjbWFwMV8xKCk7Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQzNzExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXhycGNtYXBSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5Ci17Ci0gIC8qKgotICAqIEpheHJwY21hcFJlc291cmNlRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICAqLwotICBwdWJsaWMgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSAKLSAgewotCSAgc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0gIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBKYXhycGNtYXBSZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwotCX0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgbXlzZWxmIHdpdGggdGhlIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLSAgICAvL0RvIG5vdGhpbmcgc2luY2UgdGhlIGpheHJwYyBtYXBwaW5nIGZpbGUgaGFzIG5vIHN0YW5kYXJkIG5hbWUuCi0gIAkvL0oyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSwgbmV3IFdzZGRSZXNvdXJjZUZhY3RvcnkoYVJlbmRlcmVyRmFjdG9yeSkpOwotICB9Ci0JCi0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkgICAgLy9EbyBub3RoaW5nIHNpbmNlIHRoZSBqYXhycGMgbWFwcGluZyBmaWxlIGhhcyBubyBzdGFuZGFyZCBuYW1lLgotCQkvL3JlZ2lzdGVyV2l0aChFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKTsKLQl9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0ZHMoKSAKLSAgewotICAJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuSkFYUlBDTUFQX1NZU1RFTUlELCAiajJlZV9qYXhycGNfbWFwcGluZ18xXzAuZHRkIik7Ly8kTk9OLU5MUy0xJAotCUoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9TQ0hFTUFfTE9DLCAiajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIik7IC8vJE5PTi1OTFMtMSQgIAkKLQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU0NIRU1BX0xPQ19TVU4sICJqMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJCAgCQkJCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkOGU3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gYSBKYXZhIG1ldGhvZCBwYXJhbWV0ZXJzIGFuZCBhIHdzZGwtbWVzc2FnZS4KLSAqIAotICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1Qb3NpdGlvbiA8ZW0+UGFyYW0gUG9zaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nI2dldFBhcmFtVHlwZSA8ZW0+UGFyYW0gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nIDxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYXJhbVBhcnRzTWFwcGluZyBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW0gUG9zaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW0gUG9zaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBhcmFtLXBvc2l0aW9uIGVsZW1lbnQgZGVmaW5lcyB0aGUgcG9zaXRpb24gb2YgYSBwYXJhbWV0ZXIgd2l0aGluIGEgSmF2YSBtZXRob2QuICBJdCBtdXN0IGJlIGFuIGludGVnZXIgc3RhcnRpbmcgZnJvbSAwLgotCSAqIAotCSAqIFVzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJhbVBvc2l0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1Qb3NpdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UGFyYW1Qb3NpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1Qb3NpdGlvbiA8ZW0+UGFyYW0gUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBQb3NpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyYW1Qb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFBhcmFtUG9zaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW0gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGFyYW0tdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBvZiBhIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gSXQgbXVzdCBiZSBkZWZpbmVkIGJ5IGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcy4KLQkgKiAKLQkgKiBVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZwotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJhbVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFBhcmFtVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0UGFyYW1UeXBlIDxlbT5QYXJhbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyYW1UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UGFyYW1UeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETE1lc3NhZ2VNYXBwaW5nIGdldFdzZGxNZXNzYWdlTWFwcGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nIDxlbT5Xc2RsIE1lc3NhZ2UgTWFwcGluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZU1hcHBpbmcoV1NETE1lc3NhZ2VNYXBwaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1BhY2thZ2VNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUGFja2FnZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjZTQ0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUGFja2FnZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHBhY2thZ2UtbWFwcGluZyBpbmRpY2F0ZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBqYXZhLXBhY2thZ2UtbmFtZSBhbmQgWE1MIG5hbWVzcGFjZSBpbiB0aGUgV1NETCBkb2N1bWVudC4KLSAqIAotICogVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldFBhY2thZ2VUeXBlIDxlbT5QYWNrYWdlIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQYWNrYWdlTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlTWFwcGluZyBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0UGFja2FnZU1hcHBpbmdfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFja2FnZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhY2thZ2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGFja2FnZS10eXBlIGluZGljYXRlcyB0aGUgSmF2YSBwYWNrYWdlIG5hbWUuIEl0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4KLQkgKiAKLQkgKiBVc2VkIGluOiBwYWNrYWdlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYWNrYWdlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRQYWNrYWdlVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcjZ2V0UGFja2FnZVR5cGUgPGVtPlBhY2thZ2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFja2FnZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRQYWNrYWdlVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWVzcGFjZVVSSShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZyNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQYWNrYWdlTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1BvcnRNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUG9ydE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4NzEwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvUG9ydE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHBvcnQtbWFwcGluZyBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mIHRoZSBXU0RMIHBvcnQgbmFtZSBhdHRyaWJ1dGUgdG8gdGhlIEphdmEgbmFtZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBHZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UgbWV0aG9kIGdldDxqYXZhLW5hbWU+LgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZyNnZXRKYXZhUG9ydE5hbWUgPGVtPkphdmEgUG9ydCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFBvcnRNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvcnRNYXBwaW5nIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQb3J0TWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3J0LW5hbWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiBhIG5hbWUgYXR0cmlidXRlIG9mIGEgV1NETCBwb3J0IGVsZW1lbnQuCi0JICogCi0JICogVXNlZCBpbjogcG9ydC1tYXBwaW5nCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9ydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0UG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphdmEgUG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphdmEgUG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBqYXZhLXBvcnQtbmFtZSBlbGVtZW50IGlzIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBwb3J0IG5hbWUgaW4gSmF2YS4gIEl0IGlzIHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUgR2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIG1ldGhvZAotCSAqIGdldDxqYXZhLXBvcnQtbmFtZT4uCi0JICogCi0JICogVXNlZCBpbjogcG9ydC1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgUG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXZhUG9ydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRQb3J0TWFwcGluZ19KYXZhUG9ydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEphdmFQb3J0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcjZ2V0SmF2YVBvcnROYW1lIDxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgUG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXZhUG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRKYXZhUG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQb3J0TWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1Jvb3RUeXBlUW5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9Sb290VHlwZVFuYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTBiMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1Jvb3RUeXBlUW5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9vdCBUeXBlIFFuYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHJvb3QtdHlwZS1xbmFtZSBpZGVudGlmaWVzIHRoZSBXU0RMIFFOYW1lIG9mIGFuIFhNTCB0eXBlLgotICogCi0gKiBVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFJvb3RUeXBlUW5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9vdFR5cGVRbmFtZSBleHRlbmRzIFFOYW1lewotLy8gUm9vdFR5cGVRbmFtZQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZjc0MjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBkZWZpbmVzIGEgdHVwbGUKLSAqIHRvIHNwZWNpZnkgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIFdTREwgcG9ydCB0eXBlcyBhbmQgV1NETCBiaW5kaW5ncy4KLSAqIAotICogQW4gaW50ZXJmYWNlIG1heSBiZSBtYXBwZWQgdG8gYSBwb3J0LXR5cGUgYW5kIGJpbmRpbmcgbXVsdGlwbGUgdGltZXMuIFRoaXMgaGFwcGVucyByYXJlbHkuCi0gKiAKLSAqIFVzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyNnZXRXc2RsUG9ydFR5cGUgPGVtPldzZGwgUG9ydCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxCaW5kaW5nIDxlbT5Xc2RsIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MgPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBleHRlbmRzIEludGVyZmFjZU1hcHBpbmd7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+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+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKTsKLQotfSAvLyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4M2JkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiBKYXZhIG1ldGhvZHMgdG8gb3BlcmF0aW9ucyAod2hpY2ggYXJlIG5vdCB1bmlxdWVseSBxdWFsaWZpZWQgYnkgcW5hbWVzKS4KLSAqIAotICogVGhlIHdzZGwtb3BlcmF0aW9uIHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvcnRUeXBlIGFuZCBiaW5kaW5nIGluIHdoaWNoIHRoaXMgZGVmaW5pdGlvbiBpcyBlbWJlZGRlZCB3aXRoaW4uIFNlZSB0aGUgZGVmaW5pdGlvbnMgZm9yIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcgYW5kIAotICogc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyB0byBhY3F1aXJlIHRoZSBwcm9wZXIgY29udGV4dC4gVGhlIHdyYXBwZWQtZWxlbWVudCBpbmRpY2F0b3Igc2hvdWxkIG9ubHkgYmUgc3BlY2lmaWVkIHdoZW4gYSBXU0RMIG1lc3NhZ2Ugd3JhcHMgYW4gZWxlbWVudCB0eXBlLiAgVGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgaXMgbm90IHNwZWNpZmllZCBmb3Igb25lLXdheSBvcGVyYXRpb25zLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0SmF2YU1ldGhvZE5hbWUgPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcjaXNXcmFwcGVkRWxlbWVudCA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyA8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgPGVtPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF2YSBNZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBqYXZhLW1ldGhvZC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIEphdmEgbWV0aG9kIHdpdGhpbiBhbiBpbnRlcmZhY2UuCi0JICogCi0JICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXZhTWV0aG9kTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEphdmFNZXRob2ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldEphdmFNZXRob2ROYW1lIDxlbT5KYXZhIE1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SmF2YU1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRKYXZhTWV0aG9kTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBPcGVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdzZGwtb3BlcmF0aW9uIGVsZW1lbnQgZGVmaW5lcyBhbiBvcGVyYXRpb24gd2l0aGluIGEgV1NETCBkb2N1bWVudC4gSXQgbXVzdCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSBwb3J0IHR5cGUuCi0JICogCi0JICogVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V3NkbE9wZXJhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0V3NkbE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNnZXRXc2RsT3BlcmF0aW9uIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgT3BlcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE9wZXJhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3JhcHBlZCBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI3Vuc2V0V3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI3NldFdyYXBwZWRFbGVtZW50KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1dyYXBwZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2lzV3JhcHBlZEVsZW1lbnQgPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXcmFwcGVkRWxlbWVudCgpCi0JICogQHNlZSAjdW5zZXRXcmFwcGVkRWxlbWVudCgpCi0JICogQHNlZSAjaXNXcmFwcGVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdyYXBwZWRFbGVtZW50KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2lzV3JhcHBlZEVsZW1lbnQgPGVtPldyYXBwZWQgRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI2lzV3JhcHBlZEVsZW1lbnQoKQotCSAqIEBzZWUgI3NldFdyYXBwZWRFbGVtZW50KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHVuc2V0V3JhcHBlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyNpc1dyYXBwZWRFbGVtZW50IDxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFdyYXBwZWRFbGVtZW50KCkKLQkgKiBAc2VlICNpc1dyYXBwZWRFbGVtZW50KCkKLQkgKiBAc2VlICNzZXRXcmFwcGVkRWxlbWVudChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldFdyYXBwZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBFTGlzdCBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbFJldHVyblZhbHVlTWFwcGluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgV1NETFJldHVyblZhbHVlTWFwcGluZyBnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgPGVtPldzZGwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbFJldHVyblZhbHVlTWFwcGluZyhXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIHZhbHVlKTsKLQotfSAvLyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvU2VydmljZUludGVyZmFjZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2UwNmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZSBJbnRlcmZhY2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBob3cgYSBKYXZhIHR5cGUgZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBtYXBzIHRvIGEgV1NETCBzZXJ2aWNlLgotICogCi0gKiBVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0V3NkbFNlcnZpY2VOYW1lIDxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcjZ2V0UG9ydE1hcHBpbmdzIDxlbT5Qb3J0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIGV4dGVuZHMgSW50ZXJmYWNlTWFwcGluZ3sKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgZm9yIHRoZSBzZXJ2aWNlLiBGb3Igc3RhdGljIHNlcnZpY2VzLCBpdCBpcyBqYXZheC54bWwucnBjLlNlcnZpY2UgaW50ZXJmYWNlLiBGb3IgZ2VuZXJhdGVkIHNlcnZpY2UsIGl0IHdvdWxkIGJlIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIG5hbWUuCi0JICogCi0JICogVGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCSAqIAotCSAqIFVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VJbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyNnZXRTZXJ2aWNlSW50ZXJmYWNlIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0U2VydmljZUludGVyZmFjZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBTZXJ2aWNlIE5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdzZGxTZXJ2aWNlTmFtZShXU0RMU2VydmljZU5hbWUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFdTRExTZXJ2aWNlTmFtZSBnZXRXc2RsU2VydmljZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nI2dldFdzZGxTZXJ2aWNlTmFtZSA8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFNlcnZpY2UgTmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V3NkbFNlcnZpY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgRUxpc3QgZ2V0UG9ydE1hcHBpbmdzKCk7Ci0KLX0gLy8gU2VydmljZUludGVyZmFjZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9WYXJpYWJsZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9WYXJpYWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlOTVjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvVmFyaWFibGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhcmlhYmxlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgdmFyaWFibGUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gYSBKYXZhIGNsYXNzIGRhdGEgbWVtYmVyIG9yIEphdmFCZWFucyBwcm9wZXJ0eSB0byBhbiBYTUwgZWxlbWVudCBuYW1lIG9mIGFuIFhNTCByb290IHR5cGUuIElmIHRoZSBkYXRhLW1lbWJlciBlbGVtZW50IGlzIHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBwdWJsaWMgZGF0YSBtZW1iZXIuICBJZiBkYXRhLW1lbWJlcgotICogaXMgbm90IHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBKYXZhQmVhbnMgcHJvcGVydHkuCi0gKiAKLSAqIFVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRKYXZhVmFyaWFibGVOYW1lIDxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxFbGVtZW50TmFtZSA8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzRGF0YU1lbWJlciA8ZW0+RGF0YSBNZW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRYbWxBdHRyaWJ1dGVOYW1lIDxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc1htbFdpbGRjYXJkIDxlbT5YbWwgV2lsZGNhcmQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0VmFyaWFibGVNYXBwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhcmlhYmxlTWFwcGluZyBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0VmFyaWFibGVNYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KYXZhIFZhcmlhYmxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBqYXZhLXZhcmlhYmxlLW5hbWUgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIHB1YmxpYyBkYXRhIG1lbWJlciBvciAgSmF2YUJlYW5zIHByb3BlcnR5IHdpdGhpbiBhIEphdmEgY2xhc3MuIAotCSAqIAotCSAqIFVzZWQgaW46IHZhcmlhYmxlLW1hcHBpbmcKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBWYXJpYWJsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXZhVmFyaWFibGVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0VmFyaWFibGVNYXBwaW5nX0phdmFWYXJpYWJsZU5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldEphdmFWYXJpYWJsZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNnZXRKYXZhVmFyaWFibGVOYW1lIDxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEphdmFWYXJpYWJsZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRKYXZhVmFyaWFibGVOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YbWwgRWxlbWVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhtbCBFbGVtZW50IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHhtbC1lbGVtZW50LW5hbWUgZWxlbWVudCBkZWZpbmVzIG5hbWUgYXR0cmlidXRlIHZhbHVlIG9mIGEgV1NETCBlbGVtZW50IHdpdGhpbiBhIHJvb3QgdHlwZS4KLQkgKiAKLQkgKiBVc2VkIGluOiB2YXJpYWJsZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBFbGVtZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFhtbEVsZW1lbnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0VmFyaWFibGVNYXBwaW5nX1htbEVsZW1lbnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRYbWxFbGVtZW50TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldFhtbEVsZW1lbnROYW1lIDxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0WG1sRWxlbWVudE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRYbWxFbGVtZW50TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YSBNZW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBNZW1iZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBNZW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGF0YU1lbWJlcigpCi0JICogQHNlZSAjdW5zZXREYXRhTWVtYmVyKCkKLQkgKiBAc2VlICNzZXREYXRhTWVtYmVyKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFZhcmlhYmxlTWFwcGluZ19EYXRhTWVtYmVyKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIGJvb2xlYW4gaXNEYXRhTWVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNEYXRhTWVtYmVyIDxlbT5EYXRhIE1lbWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgTWVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERhdGFNZW1iZXIoKQotCSAqIEBzZWUgI3Vuc2V0RGF0YU1lbWJlcigpCi0JICogQHNlZSAjaXNEYXRhTWVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0RGF0YU1lbWJlcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzRGF0YU1lbWJlciA8ZW0+RGF0YSBNZW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldERhdGFNZW1iZXIoKQotCSAqIEBzZWUgI2lzRGF0YU1lbWJlcigpCi0JICogQHNlZSAjc2V0RGF0YU1lbWJlcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCB1bnNldERhdGFNZW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2lzRGF0YU1lbWJlciA8ZW0+RGF0YSBNZW1iZXI8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIE1lbWJlcjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGF0YU1lbWJlcigpCi0JICogQHNlZSAjaXNEYXRhTWVtYmVyKCkKLQkgKiBAc2VlICNzZXREYXRhTWVtYmVyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBib29sZWFuIGlzU2V0RGF0YU1lbWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFhtbEF0dHJpYnV0ZU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRWYXJpYWJsZU1hcHBpbmdfWG1sQXR0cmlidXRlTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0WG1sQXR0cmlidXRlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nI2dldFhtbEF0dHJpYnV0ZU5hbWUgPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFhtbEF0dHJpYnV0ZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhtbCBXaWxkY2FyZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YbWwgV2lsZGNhcmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WG1sIFdpbGRjYXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFhtbFdpbGRjYXJkKCkKLQkgKiBAc2VlICN1bnNldFhtbFdpbGRjYXJkKCkKLQkgKiBAc2VlICNzZXRYbWxXaWxkY2FyZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1htbFdpbGRjYXJkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcjaXNYbWxXaWxkY2FyZCA8ZW0+WG1sIFdpbGRjYXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WG1sIFdpbGRjYXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFhtbFdpbGRjYXJkKCkKLQkgKiBAc2VlICN1bnNldFhtbFdpbGRjYXJkKCkKLQkgKiBAc2VlICNpc1htbFdpbGRjYXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0WG1sV2lsZGNhcmQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc1htbFdpbGRjYXJkIDxlbT5YbWwgV2lsZGNhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFhtbFdpbGRjYXJkKCkKLQkgKiBAc2VlICNpc1htbFdpbGRjYXJkKCkKLQkgKiBAc2VlICNzZXRYbWxXaWxkY2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCB1bnNldFhtbFdpbGRjYXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZyNpc1htbFdpbGRjYXJkIDxlbT5YbWwgV2lsZGNhcmQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgV2lsZGNhcmQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFhtbFdpbGRjYXJkKCkKLQkgKiBAc2VlICNpc1htbFdpbGRjYXJkKCkKLQkgKiBAc2VlICNzZXRYbWxXaWxkY2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc1NldFhtbFdpbGRjYXJkKCk7Ci0KLX0gLy8gVmFyaWFibGVNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETEJpbmRpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2UyODkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIEJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgd3NkbC1iaW5kaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBiaW5kaW5nCi0gKiBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBiaW5kaW5nLgotICogCi0gKiBVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMQmluZGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMQmluZGluZyBleHRlbmRzIFFOYW1lewotLy8gV1NETEJpbmRpbmcKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTU4NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgTWVzc2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB3c2RsLW1lc3NhZ2UgIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgbWVzc2FnZSBieSBhIFFOQU1FLgotICogCi0gKiBVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETE1lc3NhZ2UgZXh0ZW5kcyBRTmFtZXsKLS8vIFdTRExNZXNzYWdlCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2VNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2VNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDg5MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExNZXNzYWdlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIE1lc3NhZ2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB3c2RsLW1lc3NhZ2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtZXNzYWdlIGFuZCBpdHMgcGFydC4gVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkgdGhlIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWMgcGFyYW1ldGVyLiBQYXJ0cyB3aXRoaW4gYSBtZXNzYWdlIGNvbnRleHQgYXJlIHVuaXF1ZWx5IAotICogaWRlbnRpZmllZCB3aXRoIHRoZWlyIG5hbWVzLgotICogCi0gKiBUaGUgcGFyYW1ldGVyLW1vZGUgaXMgZGVmaW5lZCBieSB0aGUgbWFwcGluZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBtYXBwaW5nIHdpbGwgYmUgSU4sIE9VVCwgb3IgSU5PVVQuLiAgVGhlIHByZXNlbmNlIG9mIHRoZSBzb2FwLWhlYWRlcgotICogZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFyYW1ldGVyIGlzIG1hcHBlZCB0byBhIHNvYXAgaGVhZGVyIG9ubHkuIFdoZW4gYWJzZW50LCBpdCBtZWFucyB0aGF0IHRoZSB3c2RsLW1lc3NhZ2UgaXMgbWFwcGVkIHRvIGEgSmF2YSBwYXJhbWV0ZXIuIFRoZSBzb2FwIGhlYWRlcnMgYXJlIGludGVycHJldGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZQotICogcHJvdmlkZWQgaW4gdGhlIG1hcHBpbmcuCi0gKiAKLSAqIFVzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRQYXJhbWV0ZXJNb2RlIDxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nI2lzU29hcEhlYWRlciA8ZW0+U29hcCBIZWFkZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExNZXNzYWdlTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMTWVzc2FnZU1hcHBpbmcgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+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+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIHZhbHVlKTsKLQotfSAvLyBXU0RMTWVzc2FnZU1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZVBhcnROYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE1lc3NhZ2VQYXJ0TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBlZjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMTWVzc2FnZVBhcnROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZSNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExNZXNzYWdlUGFydE5hbWUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETE1lc3NhZ2VQYXJ0TmFtZSBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9Xc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHZvaWQgc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdTRExNZXNzYWdlUGFydE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWVmNjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9XU0RMT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBPcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETE9wZXJhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMT3BlcmF0aW9uIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMT3BlcmF0aW9uX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V3NkbCBPcGVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBPcGVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdzZGxPcGVyYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMT3BlcmF0aW9uX1dzZGxPcGVyYXRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFdzZGxPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb24jZ2V0V3NkbE9wZXJhdGlvbiA8ZW0+V3NkbCBPcGVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxPcGVyYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXU0RMT3BlcmF0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFBvcnRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFBvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTlkMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFBvcnQgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB3c2RsLXBvcnQtdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgcG9ydCB0eXBlCi0gKiBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBwb3J0IHR5cGUuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExQb3J0VHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMUG9ydFR5cGUgZXh0ZW5kcyBRTmFtZXsKLS8vCSBXU0RMUG9ydFR5cGUKLX0gCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFJldHVyblZhbHVlTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhZmE3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFJldHVyblZhbHVlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBmb3IgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZS4gSXQgZGVmaW5lcyB0aGUgbWFwcGluZyB0byBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kIGl0cyBwYXJ0LiAgVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkgdGhlIG1hcHBpbmcgZm9yIGEgc3BlY2lmaWMgcGFyYW1ldGVyLiBQYXJ0cyB3aXRoaW4gYSBtZXNzYWdlIGNvbnRleHQgYXJlIHVuaXF1ZWx5IAotICogaWRlbnRpZmllZCB3aXRoIHRoZWlyIG5hbWVzLiBUaGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBpcyBub3QKLSAqIHNwZWNpZmllZCBpZiB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUgb3IgT1VUIHBhcmFtZXRlcnMuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRNZXRob2RSZXR1cm5WYWx1ZSA8ZW0+TWV0aG9kIFJldHVybiBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZVBhcnROYW1lIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nI2dldFdzZGxNZXNzYWdlIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX0lkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFJldHVybiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtZXRob2QtcmV0dXJuLXZhbHVlICBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB2b2lkIHR5cGUgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgdHlwZS4KLQkgKiAKLQkgKiBVc2VkIGluOiB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1ldGhvZFJldHVyblZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19NZXRob2RSZXR1cm5WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBTdHJpbmcgZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0TWV0aG9kUmV0dXJuVmFsdWUgPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXRob2RSZXR1cm5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldE1ldGhvZFJldHVyblZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSW50ZXJwcmV0YXRpb24gb2YgdGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgZWxlbWVudCBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IHdyYXBwZWQtZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nLiAgSWYgd3JhcHBlZC1lbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgZGVmaW5lcyBhIFdTREwgbWVzc2FnZSBwYXJ0LiBJdCBzaG91bGQgYWx3YXlzIGJlIGludGVycHJldGVyIHdpdGggcmVzcGVjdCB0byBhIHdzZGwtbWVzc2FnZSBlbGVtZW50LiBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIHJlZmVycyB0byBhbiBlbGVtZW50Ci0JICogbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotCSAqIAotCSAqIFVzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nLCB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZSNnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgU3RyaW5nIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgdm9pZCBzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xc2RsIE1lc3NhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTWVzc2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBXU0RMTWVzc2FnZSBnZXRXc2RsTWVzc2FnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZyNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBNZXNzYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICB2b2lkIHNldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIHZhbHVlKTsKLQotfSAvLyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFNlcnZpY2VOYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvV1NETFNlcnZpY2VOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NDVlMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL1dTRExTZXJ2aWNlTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFNlcnZpY2UgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB3c2RsLXNlcnZpY2UtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgc2VydmljZSBuYW1lIGJ5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIHNlcnZpY2UuCi0gKiAKLSAqIFVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlI2dldFdTRExTZXJ2aWNlTmFtZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMU2VydmljZU5hbWUgZXh0ZW5kcyBRTmFtZXsKLQkvL0RlZmF1bHQKLX0gLy8gV1NETFNlcnZpY2VOYW1lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0Y2M2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbCNnZXRFbGVtZW50TmFtZXMgPGVtPkVsZW1lbnQgTmFtZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnROYW1lcygpIDxlbT5FbGVtZW50IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50TmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZWxlbWVudE5hbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RWxlbWVudE5hbWVzKCkgewotCQlpZiAoZWxlbWVudE5hbWVzID09IG51bGwpIHsKLQkJCWVsZW1lbnROYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFbGVtZW50TmFtZS5jbGFzcywgdGhpcywgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVMpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVsZW1lbnROYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fRUxFTUVOVF9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudE5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTOgotCQkJCWdldEVsZW1lbnROYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWxlbWVudE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fRUxFTUVOVF9OQU1FUzoKLQkJCQlnZXRFbGVtZW50TmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0VMRU1FTlRfTkFNRVM6Ci0JCQkJcmV0dXJuIGVsZW1lbnROYW1lcyAhPSBudWxsICYmICFlbGVtZW50TmFtZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRWxlbWVudE5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FbGVtZW50TmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0Zjk2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FbGVtZW50TmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FbGVtZW50TmFtZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkVsZW1lbnROYW1lSW1wbCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5hbWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbGVtZW50TmFtZQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXh0KCkgPGVtPlRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXh0KCkgPGVtPlRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0ID0gVEVYVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVsZW1lbnROYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyBvbGRUZXh0ID0gdGV4dDsKLQkJdGV4dCA9IG5ld1RleHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19URVhULCBvbGRUZXh0LCB0ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX1RFWFQ6Ci0JCQkJcmV0dXJuIGdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX1RFWFQ6Ci0JCQkJc2V0VGV4dCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fVEVYVDoKLQkJCQlzZXRUZXh0KFRFWFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX1RFWFQ6Ci0JCQkJcmV0dXJuIFRFWFRfRURFRkFVTFQgPT0gbnVsbCA/IHRleHQgIT0gbnVsbCA6ICFURVhUX0VERUZBVUxULmVxdWFscyh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0ZXh0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRWxlbWVudE5hbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FeGNlcHRpb25NYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmYzM4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FeGNlcHRpb25NYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhjZXB0aW9uIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvbk1hcHBpbmdJbXBsI2dldEV4Y2VwdGlvblR5cGUgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkV4Y2VwdGlvbk1hcHBpbmdJbXBsI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuRXhjZXB0aW9uTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2UgPGVtPldzZGwgTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5FeGNlcHRpb25NYXBwaW5nSW1wbCNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwaW5nSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNlcHRpb25UeXBlKCkgPGVtPkV4Y2VwdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjZXB0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2VwdGlvblR5cGUoKSA8ZW0+RXhjZXB0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNlcHRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBleGNlcHRpb25UeXBlID0gRVhDRVBUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpIDxlbT5Xc2RsIE1lc3NhZ2UgUGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZSgpIDxlbT5Xc2RsIE1lc3NhZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMTWVzc2FnZSB3c2RsTWVzc2FnZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkgPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEV4Y2VwdGlvbk1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25UeXBlKFN0cmluZyBuZXdFeGNlcHRpb25UeXBlKSB7Ci0JCVN0cmluZyBvbGRFeGNlcHRpb25UeXBlID0gZXhjZXB0aW9uVHlwZTsKLQkJZXhjZXB0aW9uVHlwZSA9IG5ld0V4Y2VwdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0VYQ0VQVElPTl9UWVBFLCBvbGRFeGNlcHRpb25UeXBlLCBleGNlcHRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZVBhcnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcgbmV3V3NkbE1lc3NhZ2VQYXJ0TmFtZSkgewotCQlTdHJpbmcgb2xkV3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IHdzZGxNZXNzYWdlUGFydE5hbWU7Ci0JCXdzZGxNZXNzYWdlUGFydE5hbWUgPSBuZXdXc2RsTWVzc2FnZVBhcnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBvbGRXc2RsTWVzc2FnZVBhcnROYW1lLCB3c2RsTWVzc2FnZVBhcnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE1lc3NhZ2UgZ2V0V3NkbE1lc3NhZ2UoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIG5ld1dzZGxNZXNzYWdlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExNZXNzYWdlIG9sZFdzZGxNZXNzYWdlID0gd3NkbE1lc3NhZ2U7Ci0JCXdzZGxNZXNzYWdlID0gbmV3V3NkbE1lc3NhZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgb2xkV3NkbE1lc3NhZ2UsIG5ld1dzZGxNZXNzYWdlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIG5ld1dzZGxNZXNzYWdlKSB7Ci0JCWlmIChuZXdXc2RsTWVzc2FnZSAhPSB3c2RsTWVzc2FnZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbE1lc3NhZ2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd3NkbE1lc3NhZ2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxNZXNzYWdlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxNZXNzYWdlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxNZXNzYWdlKG5ld1dzZGxNZXNzYWdlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbmV3V3NkbE1lc3NhZ2UsIG5ld1dzZGxNZXNzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCkgewotCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgb2xkQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA9IGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci0JCWNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgPSBuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIsIG9sZENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIsIG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpIHsKLQkJaWYgKG5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgIT0gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihuZXdDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiwgbmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciwgbmV3Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdzZGxNZXNzYWdlKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19FWENFUFRJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0RXhjZXB0aW9uVHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2UoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOgotCQkJCXJldHVybiBnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJc2V0RXhjZXB0aW9uVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlzZXRXc2RsTWVzc2FnZSgoV1NETE1lc3NhZ2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOgotCQkJCXNldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fRVhDRVBUSU9OX1RZUEU6Ci0JCQkJc2V0RXhjZXB0aW9uVHlwZShFWENFUFRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJc2V0V3NkbE1lc3NhZ2UoKFdTRExNZXNzYWdlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOgotCQkJCXNldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0VYQ0VQVElPTl9UWVBFOgotCQkJCXJldHVybiBFWENFUFRJT05fVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZXhjZXB0aW9uVHlwZSAhPSBudWxsIDogIUVYQ0VQVElPTl9UWVBFX0VERUZBVUxULmVxdWFscyhleGNlcHRpb25UeXBlKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbE1lc3NhZ2VQYXJ0TmFtZSAhPSBudWxsIDogIVdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQuZXF1YWxzKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIHdzZGxNZXNzYWdlICE9IG51bGw7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUjoKLQkJCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2VwdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4Y2VwdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeGNlcHRpb25NYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0ludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzJkM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnRlcmZhY2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEludGVyZmFjZU1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbnRlcmZhY2VNYXBwaW5nCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgSW50ZXJmYWNlTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVyZmFjZU1hcHBpbmcoKTsKLQl9Ci0KLX0gLy9JbnRlcmZhY2VNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVdTRExNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVdTRExNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTVkZTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0phdmFXU0RMTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIFdTREwgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsI2dldFBhY2thZ2VNYXBwaW5ncyA8ZW0+UGFja2FnZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhV1NETE1hcHBpbmdJbXBsI2dldEphdmFYTUxUeXBlTWFwcGluZ3MgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVdTRExNYXBwaW5nSW1wbCNnZXRFeGNlcHRpb25NYXBwaW5ncyA8ZW0+RXhjZXB0aW9uIE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLkphdmFXU0RMTWFwcGluZ0ltcGwjZ2V0SW50ZXJmYWNlTWFwcGluZ3MgPGVtPkludGVyZmFjZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFXU0RMTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEphdmFXU0RMTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2VNYXBwaW5ncygpIDxlbT5QYWNrYWdlIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdlTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgcGFja2FnZU1hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFYTUxUeXBlTWFwcGluZ3MoKSA8ZW0+SmF2YSBYTUwgVHlwZSBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBqYXZhWE1MVHlwZU1hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2VwdGlvbk1hcHBpbmdzKCkgPGVtPkV4Y2VwdGlvbiBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjZXB0aW9uTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZXhjZXB0aW9uTWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKSA8ZW0+SW50ZXJmYWNlIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2VNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBpbnRlcmZhY2VNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBKYXZhV1NETE1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldFBhY2thZ2VNYXBwaW5ncygpIHsKLQkJaWYgKHBhY2thZ2VNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFja2FnZU1hcHBpbmcuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBwYWNrYWdlTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpIHsKLQkJaWYgKGphdmFYTUxUeXBlTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJamF2YVhNTFR5cGVNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBqYXZhWE1MVHlwZU1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldEV4Y2VwdGlvbk1hcHBpbmdzKCkgewotCQlpZiAoZXhjZXB0aW9uTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJZXhjZXB0aW9uTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgdGhpcywgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgRUxpc3QgZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKSB7Ci0JCWlmIChpbnRlcmZhY2VNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBpbnRlcmZhY2VNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQYWNrYWdlTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeGNlcHRpb25NYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1M6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRQYWNrYWdlTWFwcGluZ3MoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldEV4Y2VwdGlvbk1hcHBpbmdzKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTOgotCQkJCWdldFBhY2thZ2VNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFja2FnZU1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1M6Ci0JCQkJZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0SmF2YVhNTFR5cGVNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1M6Ci0JCQkJZ2V0RXhjZXB0aW9uTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldEV4Y2VwdGlvbk1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUzoKLQkJCQlnZXRJbnRlcmZhY2VNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUzoKLQkJCQlnZXRQYWNrYWdlTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUzoKLQkJCQlnZXRKYXZhWE1MVHlwZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUzoKLQkJCQlnZXRFeGNlcHRpb25NYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1M6Ci0JCQkJZ2V0SW50ZXJmYWNlTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTOgotCQkJCXJldHVybiBwYWNrYWdlTWFwcGluZ3MgIT0gbnVsbCAmJiAhcGFja2FnZU1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gamF2YVhNTFR5cGVNYXBwaW5ncyAhPSBudWxsICYmICFqYXZhWE1MVHlwZU1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fRVhDRVBUSU9OX01BUFBJTkdTOgotCQkJCXJldHVybiBleGNlcHRpb25NYXBwaW5ncyAhPSBudWxsICYmICFleGNlcHRpb25NYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gaW50ZXJmYWNlTWFwcGluZ3MgIT0gbnVsbCAmJiAhaW50ZXJmYWNlTWFwcGluZ3MuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9KYXZhV1NETE1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXZhWE1MVHlwZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXZhWE1MVHlwZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZjE5YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVhNTFR5cGVNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRDbGFzc1R5cGUgPGVtPkNsYXNzIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRRbmFtZVNjb3BlIDxlbT5RbmFtZSBTY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5KYXZhWE1MVHlwZU1hcHBpbmdJbXBsI2dldEFub255bW91c1R5cGVRbmFtZSA8ZW0+QW5vbnltb3VzIFR5cGUgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRSb290VHlwZVFuYW1lIDxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCNnZXRWYXJpYWJsZU1hcHBpbmdzIDxlbT5WYXJpYWJsZSBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFYTUxUeXBlTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEphdmFYTUxUeXBlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc1R5cGUoKSA8ZW0+Q2xhc3MgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NUeXBlKCkgPGVtPkNsYXNzIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzVHlwZSA9IENMQVNTX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UW5hbWVTY29wZSgpIDxlbT5RbmFtZSBTY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFFuYW1lU2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBRTkFNRV9TQ09QRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRbmFtZVNjb3BlKCkgPGVtPlFuYW1lIFNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UW5hbWVTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcW5hbWVTY29wZSA9IFFOQU1FX1NDT1BFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFub255bW91c1R5cGVRbmFtZSgpIDxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFub255bW91c1R5cGVRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFOT05ZTU9VU19UWVBFX1FOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFub255bW91c1R5cGVRbmFtZSgpIDxlbT5Bbm9ueW1vdXMgVHlwZSBRbmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFub255bW91c1R5cGVRbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgYW5vbnltb3VzVHlwZVFuYW1lID0gQU5PTllNT1VTX1RZUEVfUU5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb290VHlwZVFuYW1lKCkgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvb3RUeXBlUW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgUm9vdFR5cGVRbmFtZSByb290VHlwZVFuYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmxlTWFwcGluZ3MoKSA8ZW0+VmFyaWFibGUgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmxlTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgdmFyaWFibGVNYXBwaW5ncyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBKYXZhWE1MVHlwZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NUeXBlKCkgewotCQlyZXR1cm4gY2xhc3NUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xhc3NUeXBlKFN0cmluZyBuZXdDbGFzc1R5cGUpIHsKLQkJU3RyaW5nIG9sZENsYXNzVHlwZSA9IGNsYXNzVHlwZTsKLQkJY2xhc3NUeXBlID0gbmV3Q2xhc3NUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRSwgb2xkQ2xhc3NUeXBlLCBjbGFzc1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UW5hbWVTY29wZSgpIHsKLQkJcmV0dXJuIHFuYW1lU2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRRbmFtZVNjb3BlKFN0cmluZyBuZXdRbmFtZVNjb3BlKSB7Ci0JCVN0cmluZyBvbGRRbmFtZVNjb3BlID0gcW5hbWVTY29wZTsKLQkJcW5hbWVTY29wZSA9IG5ld1FuYW1lU2NvcGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRSwgb2xkUW5hbWVTY29wZSwgcW5hbWVTY29wZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKSB7Ci0JCXJldHVybiBhbm9ueW1vdXNUeXBlUW5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRBbm9ueW1vdXNUeXBlUW5hbWUoU3RyaW5nIG5ld0Fub255bW91c1R5cGVRbmFtZSkgewotCQlTdHJpbmcgb2xkQW5vbnltb3VzVHlwZVFuYW1lID0gYW5vbnltb3VzVHlwZVFuYW1lOwotCQlhbm9ueW1vdXNUeXBlUW5hbWUgPSBuZXdBbm9ueW1vdXNUeXBlUW5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRSwgb2xkQW5vbnltb3VzVHlwZVFuYW1lLCBhbm9ueW1vdXNUeXBlUW5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBSb290VHlwZVFuYW1lIGdldFJvb3RUeXBlUW5hbWUoKSB7Ci0JCXJldHVybiByb290VHlwZVFuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lIG5ld1Jvb3RUeXBlUW5hbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUm9vdFR5cGVRbmFtZSBvbGRSb290VHlwZVFuYW1lID0gcm9vdFR5cGVRbmFtZTsKLQkJcm9vdFR5cGVRbmFtZSA9IG5ld1Jvb3RUeXBlUW5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUsIG9sZFJvb3RUeXBlUW5hbWUsIG5ld1Jvb3RUeXBlUW5hbWUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lIG5ld1Jvb3RUeXBlUW5hbWUpIHsKLQkJaWYgKG5ld1Jvb3RUeXBlUW5hbWUgIT0gcm9vdFR5cGVRbmFtZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocm9vdFR5cGVRbmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyb290VHlwZVFuYW1lKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Um9vdFR5cGVRbmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb290VHlwZVFuYW1lKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSb290VHlwZVFuYW1lKG5ld1Jvb3RUeXBlUW5hbWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRSwgbmV3Um9vdFR5cGVRbmFtZSwgbmV3Um9vdFR5cGVRbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVMaXN0IGdldFZhcmlhYmxlTWFwcGluZ3MoKSB7Ci0JCWlmICh2YXJpYWJsZU1hcHBpbmdzID09IG51bGwpIHsKLQkJCXZhcmlhYmxlTWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVmFyaWFibGVNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiB2YXJpYWJsZU1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUk9PVF9UWVBFX1FOQU1FOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSb290VHlwZVFuYW1lKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1ZBUklBQkxFX01BUFBJTkdTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFZhcmlhYmxlTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENsYXNzVHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEU6Ci0JCQkJcmV0dXJuIGdldFFuYW1lU2NvcGUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0FOT05ZTU9VU19UWVBFX1FOQU1FOgotCQkJCXJldHVybiBnZXRBbm9ueW1vdXNUeXBlUW5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRToKLQkJCQlyZXR1cm4gZ2V0Um9vdFR5cGVRbmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmxlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX1RZUEU6Ci0JCQkJc2V0Q2xhc3NUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1FOQU1FX1NDT1BFOgotCQkJCXNldFFuYW1lU2NvcGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUU6Ci0JCQkJc2V0QW5vbnltb3VzVHlwZVFuYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRToKLQkJCQlzZXRSb290VHlwZVFuYW1lKChSb290VHlwZVFuYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19WQVJJQUJMRV9NQVBQSU5HUzoKLQkJCQlnZXRWYXJpYWJsZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRWYXJpYWJsZU1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRToKLQkJCQlzZXRDbGFzc1R5cGUoQ0xBU1NfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEU6Ci0JCQkJc2V0UW5hbWVTY29wZShRTkFNRV9TQ09QRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUU6Ci0JCQkJc2V0QW5vbnltb3VzVHlwZVFuYW1lKEFOT05ZTU9VU19UWVBFX1FOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUU6Ci0JCQkJc2V0Um9vdFR5cGVRbmFtZSgoUm9vdFR5cGVRbmFtZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19WQVJJQUJMRV9NQVBQSU5HUzoKLQkJCQlnZXRWYXJpYWJsZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19UWVBFOgotCQkJCXJldHVybiBDTEFTU19UWVBFX0VERUZBVUxUID09IG51bGwgPyBjbGFzc1R5cGUgIT0gbnVsbCA6ICFDTEFTU19UWVBFX0VERUZBVUxULmVxdWFscyhjbGFzc1R5cGUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fUU5BTUVfU0NPUEU6Ci0JCQkJcmV0dXJuIFFOQU1FX1NDT1BFX0VERUZBVUxUID09IG51bGwgPyBxbmFtZVNjb3BlICE9IG51bGwgOiAhUU5BTUVfU0NPUEVfRURFRkFVTFQuZXF1YWxzKHFuYW1lU2NvcGUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQU5PTllNT1VTX1RZUEVfUU5BTUU6Ci0JCQkJcmV0dXJuIEFOT05ZTU9VU19UWVBFX1FOQU1FX0VERUZBVUxUID09IG51bGwgPyBhbm9ueW1vdXNUeXBlUW5hbWUgIT0gbnVsbCA6ICFBTk9OWU1PVVNfVFlQRV9RTkFNRV9FREVGQVVMVC5lcXVhbHMoYW5vbnltb3VzVHlwZVFuYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX1JPT1RfVFlQRV9RTkFNRToKLQkJCQlyZXR1cm4gcm9vdFR5cGVRbmFtZSAhPSBudWxsOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIHZhcmlhYmxlTWFwcGluZ3MgIT0gbnVsbCAmJiAhdmFyaWFibGVNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2xhc3NUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHFuYW1lU2NvcGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHFuYW1lU2NvcGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFub255bW91c1R5cGVRbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYW5vbnltb3VzVHlwZVFuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSmF2YVhNTFR5cGVNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGI0ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXhycGNtYXBGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEpheHJwY21hcEZhY3RvcnkKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEpheHJwY21hcEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElORzogcmV0dXJuIGNyZWF0ZUphdmFXU0RMTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZVBhY2thZ2VNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HOiByZXR1cm4gY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkc6IHJldHVybiBjcmVhdGVFeGNlcHRpb25NYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5ST09UX1RZUEVfUU5BTUU6IHJldHVybiBjcmVhdGVSb290VHlwZVFuYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElORzogcmV0dXJuIGNyZWF0ZVZhcmlhYmxlTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRTogcmV0dXJuIGNyZWF0ZVdTRExNZXNzYWdlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSOiByZXR1cm4gY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRTogcmV0dXJuIGNyZWF0ZUVsZW1lbnROYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUU6IHJldHVybiBjcmVhdGVXU0RMU2VydmljZU5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkc6IHJldHVybiBjcmVhdGVQb3J0TWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFOiByZXR1cm4gY3JlYXRlV1NETFBvcnRUeXBlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9CSU5ESU5HOiByZXR1cm4gY3JlYXRlV1NETEJpbmRpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HOiByZXR1cm4gY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OOiByZXR1cm4gY3JlYXRlV1NETE9wZXJhdGlvbigpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HOiByZXR1cm4gY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOiByZXR1cm4gY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZygpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HOiByZXR1cm4gY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRTogcmV0dXJuIGNyZWF0ZVdTRExNZXNzYWdlUGFydE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5JTlRFUkZBQ0VfTUFQUElORzogcmV0dXJuIGNyZWF0ZUludGVyZmFjZU1hcHBpbmcoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEphdmFXU0RMTWFwcGluZyBjcmVhdGVKYXZhV1NETE1hcHBpbmcoKSB7Ci0JCUphdmFXU0RMTWFwcGluZ0ltcGwgamF2YVdTRExNYXBwaW5nID0gbmV3IEphdmFXU0RMTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIGphdmFXU0RMTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBQYWNrYWdlTWFwcGluZyBjcmVhdGVQYWNrYWdlTWFwcGluZygpIHsKLQkJUGFja2FnZU1hcHBpbmdJbXBsIHBhY2thZ2VNYXBwaW5nID0gbmV3IFBhY2thZ2VNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gcGFja2FnZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgSmF2YVhNTFR5cGVNYXBwaW5nIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZygpIHsKLQkJSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCBqYXZhWE1MVHlwZU1hcHBpbmcgPSBuZXcgSmF2YVhNTFR5cGVNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gamF2YVhNTFR5cGVNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEV4Y2VwdGlvbk1hcHBpbmcgY3JlYXRlRXhjZXB0aW9uTWFwcGluZygpIHsKLQkJRXhjZXB0aW9uTWFwcGluZ0ltcGwgZXhjZXB0aW9uTWFwcGluZyA9IG5ldyBFeGNlcHRpb25NYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyBjcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpIHsKLQkJU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsIHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gc2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCkgewotCQlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nID0gbmV3IFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFJvb3RUeXBlUW5hbWUgY3JlYXRlUm9vdFR5cGVRbmFtZSgpIHsKLQkJUm9vdFR5cGVRbmFtZUltcGwgcm9vdFR5cGVRbmFtZSA9IG5ldyBSb290VHlwZVFuYW1lSW1wbCgpOwotCQlyZXR1cm4gcm9vdFR5cGVRbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBWYXJpYWJsZU1hcHBpbmcgY3JlYXRlVmFyaWFibGVNYXBwaW5nKCkgewotCQlWYXJpYWJsZU1hcHBpbmdJbXBsIHZhcmlhYmxlTWFwcGluZyA9IG5ldyBWYXJpYWJsZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiB2YXJpYWJsZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE1lc3NhZ2UgY3JlYXRlV1NETE1lc3NhZ2UoKSB7Ci0JCVdTRExNZXNzYWdlSW1wbCB3c2RsTWVzc2FnZSA9IG5ldyBXU0RMTWVzc2FnZUltcGwoKTsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpIHsKLQkJQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwgY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciA9IG5ldyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbCgpOwotCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFbGVtZW50TmFtZSBjcmVhdGVFbGVtZW50TmFtZSgpIHsKLQkJRWxlbWVudE5hbWVJbXBsIGVsZW1lbnROYW1lID0gbmV3IEVsZW1lbnROYW1lSW1wbCgpOwotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETFNlcnZpY2VOYW1lIGNyZWF0ZVdTRExTZXJ2aWNlTmFtZSgpIHsKLQkJV1NETFNlcnZpY2VOYW1lSW1wbCB3c2RsU2VydmljZU5hbWUgPSBuZXcgV1NETFNlcnZpY2VOYW1lSW1wbCgpOwotCQlyZXR1cm4gd3NkbFNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFBvcnRNYXBwaW5nIGNyZWF0ZVBvcnRNYXBwaW5nKCkgewotCQlQb3J0TWFwcGluZ0ltcGwgcG9ydE1hcHBpbmcgPSBuZXcgUG9ydE1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBwb3J0TWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMUG9ydFR5cGUgY3JlYXRlV1NETFBvcnRUeXBlKCkgewotCQlXU0RMUG9ydFR5cGVJbXBsIHdzZGxQb3J0VHlwZSA9IG5ldyBXU0RMUG9ydFR5cGVJbXBsKCk7Ci0JCXJldHVybiB3c2RsUG9ydFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETEJpbmRpbmcgY3JlYXRlV1NETEJpbmRpbmcoKSB7Ci0JCVdTRExCaW5kaW5nSW1wbCB3c2RsQmluZGluZyA9IG5ldyBXU0RMQmluZGluZ0ltcGwoKTsKLQkJcmV0dXJuIHdzZGxCaW5kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcgY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpIHsKLQkJU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwgc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyA9IG5ldyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMT3BlcmF0aW9uIGNyZWF0ZVdTRExPcGVyYXRpb24oKSB7Ci0JCVdTRExPcGVyYXRpb25JbXBsIHdzZGxPcGVyYXRpb24gPSBuZXcgV1NETE9wZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdzZGxPcGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcgY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKSB7Ci0JCU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbCBtZXRob2RQYXJhbVBhcnRzTWFwcGluZyA9IG5ldyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZygpIHsKLQkJV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwgd3NkbFJldHVyblZhbHVlTWFwcGluZyA9IG5ldyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gd3NkbFJldHVyblZhbHVlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMTWVzc2FnZU1hcHBpbmcgY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nKCkgewotCQlXU0RMTWVzc2FnZU1hcHBpbmdJbXBsIHdzZGxNZXNzYWdlTWFwcGluZyA9IG5ldyBXU0RMTWVzc2FnZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiB3c2RsTWVzc2FnZU1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE1lc3NhZ2VQYXJ0TmFtZSBjcmVhdGVXU0RMTWVzc2FnZVBhcnROYW1lKCkgewotCQlXU0RMTWVzc2FnZVBhcnROYW1lSW1wbCB3c2RsTWVzc2FnZVBhcnROYW1lID0gbmV3IFdTRExNZXNzYWdlUGFydE5hbWVJbXBsKCk7Ci0JCXJldHVybiB3c2RsTWVzc2FnZVBhcnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEludGVyZmFjZU1hcHBpbmcgY3JlYXRlSW50ZXJmYWNlTWFwcGluZygpIHsKLQkJSW50ZXJmYWNlTWFwcGluZ0ltcGwgaW50ZXJmYWNlTWFwcGluZyA9IG5ldyBJbnRlcmZhY2VNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gaW50ZXJmYWNlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBKYXhycGNtYXBQYWNrYWdlIGdldEpheHJwY21hcFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSmF4cnBjbWFwUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEpheHJwY21hcFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0pheHJwY21hcEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjMzliMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpheHJwY21hcFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF4cnBjbWFwUGFja2FnZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgamF2YVdTRExNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgcGFja2FnZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBqYXZhWE1MVHlwZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBleGNlcHRpb25NYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgcm9vdFR5cGVRbmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHZhcmlhYmxlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHdzZGxNZXNzYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGVsZW1lbnROYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbFNlcnZpY2VOYW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgcG9ydE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsUG9ydFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIEVDbGFzcyB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbE1lc3NhZ2VNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbE1lc3NhZ2VQYXJ0TmFtZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgRUNsYXNzIGludGVyZmFjZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBKYXhycGNtYXBQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF4cnBjbWFwUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSmF4cnBjbWFwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXhycGNtYXBQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSmF4cnBjbWFwUGFja2FnZUltcGwgdGhlSmF4cnBjbWFwUGFja2FnZSA9IChKYXhycGNtYXBQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXhycGNtYXBQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEpheHJwY21hcFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwuaW5pdCgpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsLmluaXQoKTsKLQkJQ29tbW9uUGFja2FnZUltcGwuaW5pdCgpOwotCQlFamJQYWNrYWdlSW1wbC5pbml0KCk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwuaW5pdCgpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsLmluaXQoKTsKLQkJSnNwUGFja2FnZUltcGwuaW5pdCgpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsLmluaXQoKTsKLQkJV3NkZFBhY2thZ2VJbXBsLmluaXQoKTsKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0JCUphdmFSZWZQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlSmF4cnBjbWFwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUpheHJwY21hcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSmF4cnBjbWFwUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlSmF4cnBjbWFwUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFQ2xhc3MgZ2V0SmF2YVdTRExNYXBwaW5nKCkgewotCQlyZXR1cm4gamF2YVdTRExNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJbnRlcmZhY2VNYXBwaW5nKCkpOwotCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SW50ZXJmYWNlTWFwcGluZygpKTsKLQkJcm9vdFR5cGVRbmFtZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCkpOwotCQl3c2RsTWVzc2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCkpOwotCQl3c2RsU2VydmljZU5hbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKLQkJd3NkbFBvcnRUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCXdzZGxCaW5kaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhqYXZhV1NETE1hcHBpbmdFQ2xhc3MsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIkphdmFXU0RMTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YVdTRExNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpLCB0aGlzLmdldFBhY2thZ2VNYXBwaW5nKCksIG51bGwsICJwYWNrYWdlTWFwcGluZ3MiLCBudWxsLCAxLCAtMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpLCB0aGlzLmdldEphdmFYTUxUeXBlTWFwcGluZygpLCBudWxsLCAiamF2YVhNTFR5cGVNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFXU0RMTWFwcGluZ19FeGNlcHRpb25NYXBwaW5ncygpLCB0aGlzLmdldEV4Y2VwdGlvbk1hcHBpbmcoKSwgbnVsbCwgImV4Y2VwdGlvbk1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIHRoaXMuZ2V0SW50ZXJmYWNlTWFwcGluZygpLCBudWxsLCAiaW50ZXJmYWNlTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocGFja2FnZU1hcHBpbmdFQ2xhc3MsIFBhY2thZ2VNYXBwaW5nLmNsYXNzLCAiUGFja2FnZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhY2thZ2VNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFBhY2thZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYWNrYWdlTWFwcGluZ19QYWNrYWdlVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFja2FnZVR5cGUiLCBudWxsLCAwLCAxLCBQYWNrYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFja2FnZU1hcHBpbmdfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCBQYWNrYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcywgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAiSmF2YVhNTFR5cGVNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjbGFzc1R5cGUiLCBudWxsLCAwLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJxbmFtZVNjb3BlIiwgbnVsbCwgMCwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhbm9ueW1vdXNUeXBlUW5hbWUiLCBudWxsLCAwLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFYTUxUeXBlTWFwcGluZ19Sb290VHlwZVFuYW1lKCksIHRoaXMuZ2V0Um9vdFR5cGVRbmFtZSgpLCBudWxsLCAicm9vdFR5cGVRbmFtZSIsIG51bGwsIDEsIDEsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSwgdGhpcy5nZXRWYXJpYWJsZU1hcHBpbmcoKSwgbnVsbCwgInZhcmlhYmxlTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjZXB0aW9uTWFwcGluZ0VDbGFzcywgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIkV4Y2VwdGlvbk1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2VwdGlvbk1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjZXB0aW9uTWFwcGluZ19FeGNlcHRpb25UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleGNlcHRpb25UeXBlIiwgbnVsbCwgMCwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsTWVzc2FnZVBhcnROYW1lIiwgbnVsbCwgMCwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCB0aGlzLmdldFdTRExNZXNzYWdlKCksIG51bGwsICJ3c2RsTWVzc2FnZSIsIG51bGwsIDEsIDEsIEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2VwdGlvbk1hcHBpbmdfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpLCB0aGlzLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSwgbnVsbCwgImNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIiLCBudWxsLCAwLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAiU2VydmljZUludGVyZmFjZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpLCB0aGlzLmdldFdTRExTZXJ2aWNlTmFtZSgpLCBudWxsLCAid3NkbFNlcnZpY2VOYW1lIiwgbnVsbCwgMSwgMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpLCB0aGlzLmdldFBvcnRNYXBwaW5nKCksIG51bGwsICJwb3J0TWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAiU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19Xc2RsUG9ydFR5cGUoKSwgdGhpcy5nZXRXU0RMUG9ydFR5cGUoKSwgbnVsbCwgIndzZGxQb3J0VHlwZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKSwgdGhpcy5nZXRXU0RMQmluZGluZygpLCBudWxsLCAid3NkbEJpbmRpbmciLCBudWxsLCAxLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCksIHRoaXMuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpLCBudWxsLCAic2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvb3RUeXBlUW5hbWVFQ2xhc3MsIFJvb3RUeXBlUW5hbWUuY2xhc3MsICJSb290VHlwZVFuYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModmFyaWFibGVNYXBwaW5nRUNsYXNzLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICJWYXJpYWJsZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19KYXZhVmFyaWFibGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhVmFyaWFibGVOYW1lIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInhtbEVsZW1lbnROYW1lIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRhdGFNZW1iZXIiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInhtbEF0dHJpYnV0ZU5hbWUiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19YbWxXaWxkY2FyZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhtbFdpbGRjYXJkIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsTWVzc2FnZUVDbGFzcywgV1NETE1lc3NhZ2UuY2xhc3MsICJXU0RMTWVzc2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJFQ2xhc3MsIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuY2xhc3MsICJDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCksIHRoaXMuZ2V0RWxlbWVudE5hbWUoKSwgbnVsbCwgImVsZW1lbnROYW1lcyIsIG51bGwsIDEsIC0xLCBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWxlbWVudE5hbWVFQ2xhc3MsIEVsZW1lbnROYW1lLmNsYXNzLCAiRWxlbWVudE5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVsZW1lbnROYW1lX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIEVsZW1lbnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbGVtZW50TmFtZV9UZXh0KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0ZXh0IiwgbnVsbCwgMCwgMSwgRWxlbWVudE5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsU2VydmljZU5hbWVFQ2xhc3MsIFdTRExTZXJ2aWNlTmFtZS5jbGFzcywgIldTRExTZXJ2aWNlTmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBvcnRNYXBwaW5nRUNsYXNzLCBQb3J0TWFwcGluZy5jbGFzcywgIlBvcnRNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0TWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBQb3J0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMCwgMSwgUG9ydE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRNYXBwaW5nX0phdmFQb3J0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YVBvcnROYW1lIiwgbnVsbCwgMCwgMSwgUG9ydE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsUG9ydFR5cGVFQ2xhc3MsIFdTRExQb3J0VHlwZS5jbGFzcywgIldTRExQb3J0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdzZGxCaW5kaW5nRUNsYXNzLCBXU0RMQmluZGluZy5jbGFzcywgIldTRExCaW5kaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0VDbGFzcywgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19KYXZhTWV0aG9kTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YU1ldGhvZE5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxPcGVyYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxPcGVyYXRpb24iLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dyYXBwZWRFbGVtZW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAid3JhcHBlZEVsZW1lbnQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCksIHRoaXMuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcoKSwgbnVsbCwgIm1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSwgdGhpcy5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCksIG51bGwsICJ3c2RsUmV0dXJuVmFsdWVNYXBwaW5nIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdzZGxPcGVyYXRpb25FQ2xhc3MsIFdTRExPcGVyYXRpb24uY2xhc3MsICJXU0RMT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMT3BlcmF0aW9uX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFdTRExPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE9wZXJhdGlvbiIsIG51bGwsIDAsIDEsIFdTRExPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0VDbGFzcywgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MsICJNZXRob2RQYXJhbVBhcnRzTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtUG9zaXRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVR5cGUiLCBudWxsLCAwLCAxLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCksIHRoaXMuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nKCksIG51bGwsICJ3c2RsTWVzc2FnZU1hcHBpbmciLCBudWxsLCAxLCAxLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MsIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MsICJXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZFJldHVyblZhbHVlIiwgbnVsbCwgMCwgMSwgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsTWVzc2FnZVBhcnROYW1lIiwgbnVsbCwgMCwgMSwgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCB0aGlzLmdldFdTRExNZXNzYWdlKCksIG51bGwsICJ3c2RsTWVzc2FnZSIsIG51bGwsIDEsIDEsIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MsIFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcywgIldTRExNZXNzYWdlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlTWFwcGluZ19QYXJhbWV0ZXJNb2RlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbWV0ZXJNb2RlIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInNvYXBIZWFkZXIiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCksIHRoaXMuZ2V0V1NETE1lc3NhZ2UoKSwgbnVsbCwgIndzZGxNZXNzYWdlIiwgbnVsbCwgMSwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod3NkbE1lc3NhZ2VQYXJ0TmFtZUVDbGFzcywgV1NETE1lc3NhZ2VQYXJ0TmFtZS5jbGFzcywgIldTRExNZXNzYWdlUGFydE5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlUGFydE5hbWVfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VQYXJ0TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9Xc2RsTWVzc2FnZVBhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsTWVzc2FnZVBhcnROYW1lIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VQYXJ0TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICJJbnRlcmZhY2VNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy9KYXhycGNtYXBQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmNzFhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci53ZWJzZXJ2aWNlcy5KYXhycGNtYXBUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEpheHJwY21hcFJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCBpbXBsZW1lbnRzIEpheHJwY21hcFJlc291cmNlCi17Ci0JcHVibGljIEpheHJwY21hcFJlc291cmNlSW1wbChSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQlwdWJsaWMgSmF4cnBjbWFwUmVzb3VyY2VJbXBsKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExNYXBwaW5nIGdldEphdmFXU0RMTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhV1NETE1hcHBpbmcpIGdldFJvb3RPYmplY3QoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwVHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSkFYUlBDX01BUF9UWVBFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI2dldERvY3R5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIAotCXsKLQkgIHN3aXRjaCAoZ2V0SjJFRVZlcnNpb25JRCgpKSAKLQkgIHsKLQkgICAgY2FzZSAoSjJFRV8xXzJfSUQpIDoKLQkgICAgY2FzZSAoSjJFRV8xXzNfSUQpIDoJCi0JICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuSkFYUlBDTUFQX0RPQ1RZUEU7Ci0JICAgIGRlZmF1bHQgOgotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0JfQotCi0KLSAgIHB1YmxpYyBib29sZWFuIGlzSmF4cnBjbWFwMV8wKCkKLSAgIHsKLSAgICAgIHJldHVybiAoZ2V0TW9kdWxlVmVyc2lvbklEKCk9PVdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQpOwotICAgfQotCi0gICBwdWJsaWMgYm9vbGVhbiBpc0pheHJwY21hcDFfMSgpCi0gICB7Ci0gICAgICByZXR1cm4gKGdldE1vZHVsZVZlcnNpb25JRCgpPT1XZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEKSA7ICAgCi0gICB9Ci0KLQotCS8qIAotCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7Ci0Jc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKLQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEKSA6Ci0JCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQpIDoKLQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwotCQkJCWJyZWFrOwkJCQotCQl9Ci0JfQotCS8qCi0JICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgCi0gIHsKLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgCWNhc2UgKEoyRUVfMV80X0lEKSA6Ci0gICAgCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwotICAgIAkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQpOwotICAgIAkJCQlicmVhazsKLSAgICAJY2FzZSAoSjJFRV8xXzNfSUQpIDoKLSAgICAJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7Ci0gICAgCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMF9JRCk7Ci0gICAgCQkJCWJyZWFrOwotICAgIAljYXNlIChKMkVFXzFfMl9JRCkgOgotICAgIAkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhnZXRKMkVFXzFfMl9QdWJsaWNJRCgpLCBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpKTsKLSAgICAJCQkJcHJpbVNldFZlcnNpb25JRChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEKTsKLSAgICAJCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewotCSAgcmV0dXJuICBXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9QVUJMSUNJRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKLQkgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9TWVNURU1JRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19QdWJsaWNJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKLQkgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLkpBWFJQQ01BUF9QVUJMSUNJRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU1lTVEVNSUQ7Ci0JfQotCi0JLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgotCSovCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewotCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQ6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQkJY2FzZSBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8xX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0JCQlkZWZhdWx0IDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJfQotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMV9JRDsKLQl9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQotICB7Ci0gICAgLy9EbyBub3RoaW5nIGZvciBub3cgc2luY2UgdGhlIHJvb3Qgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSB2ZXJzaW9uLgotICB9Ci0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNzUzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYXJhbSBQYXJ0cyBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsI2dldFBhcmFtUG9zaXRpb24gPGVtPlBhcmFtIFBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbCNnZXRQYXJhbVR5cGUgPGVtPlBhcmFtIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsI2dldFdzZGxNZXNzYWdlTWFwcGluZyA8ZW0+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtUG9zaXRpb24oKSA8ZW0+UGFyYW0gUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVBvc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUE9TSVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1Qb3NpdGlvbigpIDxlbT5QYXJhbSBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtUG9zaXRpb24gPSBQQVJBTV9QT1NJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbVR5cGUoKSA8ZW0+UGFyYW0gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1UeXBlKCkgPGVtPlBhcmFtIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtVHlwZSA9IFBBUkFNX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKSA8ZW0+V3NkbCBNZXNzYWdlIE1hcHBpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE1lc3NhZ2VNYXBwaW5nIHdzZGxNZXNzYWdlTWFwcGluZyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1Qb3NpdGlvbigpIHsKLQkJcmV0dXJuIHBhcmFtUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbVBvc2l0aW9uKFN0cmluZyBuZXdQYXJhbVBvc2l0aW9uKSB7Ci0JCVN0cmluZyBvbGRQYXJhbVBvc2l0aW9uID0gcGFyYW1Qb3NpdGlvbjsKLQkJcGFyYW1Qb3NpdGlvbiA9IG5ld1BhcmFtUG9zaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OLCBvbGRQYXJhbVBvc2l0aW9uLCBwYXJhbVBvc2l0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtVHlwZSgpIHsKLQkJcmV0dXJuIHBhcmFtVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtVHlwZShTdHJpbmcgbmV3UGFyYW1UeXBlKSB7Ci0JCVN0cmluZyBvbGRQYXJhbVR5cGUgPSBwYXJhbVR5cGU7Ci0JCXBhcmFtVHlwZSA9IG5ld1BhcmFtVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fVFlQRSwgb2xkUGFyYW1UeXBlLCBwYXJhbVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMTWVzc2FnZU1hcHBpbmcgZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2VNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZyBuZXdXc2RsTWVzc2FnZU1hcHBpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETE1lc3NhZ2VNYXBwaW5nIG9sZFdzZGxNZXNzYWdlTWFwcGluZyA9IHdzZGxNZXNzYWdlTWFwcGluZzsKLQkJd3NkbE1lc3NhZ2VNYXBwaW5nID0gbmV3V3NkbE1lc3NhZ2VNYXBwaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORywgb2xkV3NkbE1lc3NhZ2VNYXBwaW5nLCBuZXdXc2RsTWVzc2FnZU1hcHBpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZyBuZXdXc2RsTWVzc2FnZU1hcHBpbmcpIHsKLQkJaWYgKG5ld1dzZGxNZXNzYWdlTWFwcGluZyAhPSB3c2RsTWVzc2FnZU1hcHBpbmcpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxNZXNzYWdlTWFwcGluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsTWVzc2FnZU1hcHBpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V3NkbE1lc3NhZ2VNYXBwaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dzZGxNZXNzYWdlTWFwcGluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxNZXNzYWdlTWFwcGluZyhuZXdXc2RsTWVzc2FnZU1hcHBpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkcsIG5ld1dzZGxNZXNzYWdlTWFwcGluZywgbmV3V3NkbE1lc3NhZ2VNYXBwaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsTWVzc2FnZU1hcHBpbmcobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OOgotCQkJCXJldHVybiBnZXRQYXJhbVBvc2l0aW9uKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFBhcmFtVHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19XU0RMX01FU1NBR0VfTUFQUElORzoKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2VNYXBwaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT046Ci0JCQkJc2V0UGFyYW1Qb3NpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEU6Ci0JCQkJc2V0UGFyYW1UeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkc6Ci0JCQkJc2V0V3NkbE1lc3NhZ2VNYXBwaW5nKChXU0RMTWVzc2FnZU1hcHBpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT046Ci0JCQkJc2V0UGFyYW1Qb3NpdGlvbihQQVJBTV9QT1NJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFOgotCQkJCXNldFBhcmFtVHlwZShQQVJBTV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgotCQkJCXNldFdzZGxNZXNzYWdlTWFwcGluZygoV1NETE1lc3NhZ2VNYXBwaW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9QT1NJVElPTjoKLQkJCQlyZXR1cm4gUEFSQU1fUE9TSVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtUG9zaXRpb24gIT0gbnVsbCA6ICFQQVJBTV9QT1NJVElPTl9FREVGQVVMVC5lcXVhbHMocGFyYW1Qb3NpdGlvbik7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1RZUEU6Ci0JCQkJcmV0dXJuIFBBUkFNX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmFtVHlwZSAhPSBudWxsIDogIVBBUkFNX1RZUEVfRURFRkFVTFQuZXF1YWxzKHBhcmFtVHlwZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgotCQkJCXJldHVybiB3c2RsTWVzc2FnZU1hcHBpbmcgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbVBvc2l0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbVBvc2l0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmFtVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUGFja2FnZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9QYWNrYWdlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNzJkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9QYWNrYWdlTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5QYWNrYWdlTWFwcGluZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBhY2thZ2VNYXBwaW5nSW1wbCNnZXRQYWNrYWdlVHlwZSA8ZW0+UGFja2FnZSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlBhY2thZ2VNYXBwaW5nSW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBhY2thZ2VNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2VUeXBlKCkgPGVtPlBhY2thZ2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2VUeXBlKCkgPGVtPlBhY2thZ2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlVHlwZSA9IFBBQ0tBR0VfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBQYWNrYWdlTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VUeXBlKCkgewotCQlyZXR1cm4gcGFja2FnZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlVHlwZShTdHJpbmcgbmV3UGFja2FnZVR5cGUpIHsKLQkJU3RyaW5nIG9sZFBhY2thZ2VUeXBlID0gcGFja2FnZVR5cGU7Ci0JCXBhY2thZ2VUeXBlID0gbmV3UGFja2FnZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEUsIG9sZFBhY2thZ2VUeXBlLCBwYWNrYWdlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5ld05hbWVzcGFjZVVSSSkgewotCQlTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCQluYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJLCBvbGROYW1lc3BhY2VVUkksIG5hbWVzcGFjZVVSSSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFBhY2thZ2VUeXBlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX1BBQ0tBR0VfVFlQRToKLQkJCQlzZXRQYWNrYWdlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJOgotCQkJCXNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fUEFDS0FHRV9UWVBFOgotCQkJCXNldFBhY2thZ2VUeXBlKFBBQ0tBR0VfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fUEFDS0FHRV9UWVBFOgotCQkJCXJldHVybiBQQUNLQUdFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHBhY2thZ2VUeXBlICE9IG51bGwgOiAhUEFDS0FHRV9UWVBFX0VERUZBVUxULmVxdWFscyhwYWNrYWdlVHlwZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhY2thZ2VUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYWNrYWdlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZXNwYWNlVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QYWNrYWdlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1BvcnRNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUG9ydE1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzdlMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUG9ydE1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuUG9ydE1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Qb3J0TWFwcGluZ0ltcGwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5Qb3J0TWFwcGluZ0ltcGwjZ2V0SmF2YVBvcnROYW1lIDxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRNYXBwaW5nSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUG9ydE1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lID0gUE9SVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFQb3J0TmFtZSgpIDxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUE9SVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFQb3J0TmFtZSgpIDxlbT5KYXZhIFBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFQb3J0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgamF2YVBvcnROYW1lID0gSkFWQV9QT1JUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBQb3J0TWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotCQlyZXR1cm4gcG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgbmV3UG9ydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFBvcnROYW1lID0gcG9ydE5hbWU7Ci0JCXBvcnROYW1lID0gbmV3UG9ydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19QT1JUX05BTUUsIG9sZFBvcnROYW1lLCBwb3J0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXZhUG9ydE5hbWUoKSB7Ci0JCXJldHVybiBqYXZhUG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRKYXZhUG9ydE5hbWUoU3RyaW5nIG5ld0phdmFQb3J0TmFtZSkgewotCQlTdHJpbmcgb2xkSmF2YVBvcnROYW1lID0gamF2YVBvcnROYW1lOwotCQlqYXZhUG9ydE5hbWUgPSBuZXdKYXZhUG9ydE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19KQVZBX1BPUlRfTkFNRSwgb2xkSmF2YVBvcnROYW1lLCBqYXZhUG9ydE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fUE9SVF9OQU1FOgotCQkJCXJldHVybiBnZXRQb3J0TmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUU6Ci0JCQkJcmV0dXJuIGdldEphdmFQb3J0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fUE9SVF9OQU1FOgotCQkJCXNldFBvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0pBVkFfUE9SVF9OQU1FOgotCQkJCXNldEphdmFQb3J0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fUE9SVF9OQU1FOgotCQkJCXNldFBvcnROYW1lKFBPUlRfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSkFWQV9QT1JUX05BTUU6Ci0JCQkJc2V0SmF2YVBvcnROYW1lKEpBVkFfUE9SVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19QT1JUX05BTUU6Ci0JCQkJcmV0dXJuIFBPUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcG9ydE5hbWUgIT0gbnVsbCA6ICFQT1JUX05BTUVfRURFRkFVTFQuZXF1YWxzKHBvcnROYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0pBVkFfUE9SVF9OQU1FOgotCQkJCXJldHVybiBKQVZBX1BPUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gamF2YVBvcnROYW1lICE9IG51bGwgOiAhSkFWQV9QT1JUX05BTUVfRURFRkFVTFQuZXF1YWxzKGphdmFQb3J0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9ydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhUG9ydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGphdmFQb3J0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvcnRNYXBwaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUm9vdFR5cGVRbmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1Jvb3RUeXBlUW5hbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYzAwNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUm9vdFR5cGVRbmFtZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb290IFR5cGUgUW5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290VHlwZVFuYW1lSW1wbCBleHRlbmRzIFFOYW1lSW1wbCBpbXBsZW1lbnRzIFJvb3RUeXBlUW5hbWUKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBSb290VHlwZVFuYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9vdFR5cGVRbmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlyZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUk9PVF9UWVBFX1FOQU1FX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBnZXRMb2NhbFBhcnQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5ST09UX1RZUEVfUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBnZXRDb21iaW5lZFFOYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUk9PVF9UWVBFX1FOQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXJldHVybiBnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5ST09UX1RZUEVfUU5BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5ST09UX1RZUEVfUU5BTUVfX0xPQ0FMX1BBUlQ6Ci0JCQkJc2V0TG9jYWxQYXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5ST09UX1RZUEVfUU5BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXNldENvbWJpbmVkUU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRV9fTE9DQUxfUEFSVDoKLQkJCQlzZXRMb2NhbFBhcnQoTE9DQUxfUEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRV9fQ09NQklORURfUU5BTUU6Ci0JCQkJc2V0Q29tYmluZWRRTmFtZShDT01CSU5FRF9RTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5ST09UX1RZUEVfUU5BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUk9PVF9UWVBFX1FOQU1FX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBMT0NBTF9QQVJUX0VERUZBVUxUID09IG51bGwgPyBsb2NhbFBhcnQgIT0gbnVsbCA6ICFMT0NBTF9QQVJUX0VERUZBVUxULmVxdWFscyhsb2NhbFBhcnQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRV9fQ09NQklORURfUU5BTUU6Ci0JCQkJcmV0dXJuIENPTUJJTkVEX1FOQU1FX0VERUZBVUxUID09IG51bGwgPyBjb21iaW5lZFFOYW1lICE9IG51bGwgOiAhQ09NQklORURfUU5BTUVfRURFRkFVTFQuZXF1YWxzKGNvbWJpbmVkUU5hbWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlJPT1RfVFlQRV9RTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCA9PSBudWxsID8gaW50ZXJuYWxQcmVmaXhPck5zVVJJICE9IG51bGwgOiAhSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVC5lcXVhbHMoaW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vUm9vdFR5cGVRbmFtZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRjOTM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsI2dldFdzZGxQb3J0VHlwZSA8ZW0+V3NkbCBQb3J0IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwjZ2V0V3NkbEJpbmRpbmcgPGVtPldzZGwgQmluZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbCBleHRlbmRzIEludGVyZmFjZU1hcHBpbmdJbXBsIGltcGxlbWVudHMgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFBvcnRUeXBlKCkgPGVtPldzZGwgUG9ydCBUeXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbFBvcnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExQb3J0VHlwZSB3c2RsUG9ydFR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbEJpbmRpbmcoKSA8ZW0+V3NkbCBCaW5kaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbEJpbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETEJpbmRpbmcgd3NkbEJpbmRpbmcgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoU3RyaW5nIG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgewotCQlTdHJpbmcgb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETFBvcnRUeXBlIGdldFdzZGxQb3J0VHlwZSgpIHsKLQkJcmV0dXJuIHdzZGxQb3J0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxQb3J0VHlwZShXU0RMUG9ydFR5cGUgbmV3V3NkbFBvcnRUeXBlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExQb3J0VHlwZSBvbGRXc2RsUG9ydFR5cGUgPSB3c2RsUG9ydFR5cGU7Ci0JCXdzZGxQb3J0VHlwZSA9IG5ld1dzZGxQb3J0VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSwgb2xkV3NkbFBvcnRUeXBlLCBuZXdXc2RsUG9ydFR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFBvcnRUeXBlKFdTRExQb3J0VHlwZSBuZXdXc2RsUG9ydFR5cGUpIHsKLQkJaWYgKG5ld1dzZGxQb3J0VHlwZSAhPSB3c2RsUG9ydFR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdzZGxQb3J0VHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsUG9ydFR5cGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsUG9ydFR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbFBvcnRUeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsUG9ydFR5cGUobmV3V3NkbFBvcnRUeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEUsIG5ld1dzZGxQb3J0VHlwZSwgbmV3V3NkbFBvcnRUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETEJpbmRpbmcgZ2V0V3NkbEJpbmRpbmcoKSB7Ci0JCXJldHVybiB3c2RsQmluZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxCaW5kaW5nKFdTRExCaW5kaW5nIG5ld1dzZGxCaW5kaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExCaW5kaW5nIG9sZFdzZGxCaW5kaW5nID0gd3NkbEJpbmRpbmc7Ci0JCXdzZGxCaW5kaW5nID0gbmV3V3NkbEJpbmRpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HLCBvbGRXc2RsQmluZGluZywgbmV3V3NkbEJpbmRpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbEJpbmRpbmcoV1NETEJpbmRpbmcgbmV3V3NkbEJpbmRpbmcpIHsKLQkJaWYgKG5ld1dzZGxCaW5kaW5nICE9IHdzZGxCaW5kaW5nKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsQmluZGluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsQmluZGluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsQmluZGluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsQmluZGluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxCaW5kaW5nKG5ld1dzZGxCaW5kaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HLCBuZXdXc2RsQmluZGluZywgbmV3V3NkbEJpbmRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpIHsKLQkJaWYgKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzID09IG51bGwpIHsKLQkJCXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsIHRoaXMsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V3NkbFBvcnRUeXBlKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX0JJTkRJTkc6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdzZGxCaW5kaW5nKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9QT1JUX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFdzZGxQb3J0VHlwZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORzoKLQkJCQlyZXR1cm4gZ2V0V3NkbEJpbmRpbmcoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRToKLQkJCQlzZXRXc2RsUG9ydFR5cGUoKFdTRExQb3J0VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfQklORElORzoKLQkJCQlzZXRXc2RsQmluZGluZygoV1NETEJpbmRpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUzoKLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFOgotCQkJCXNldFdzZGxQb3J0VHlwZSgoV1NETFBvcnRUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX0JJTkRJTkc6Ci0JCQkJc2V0V3NkbEJpbmRpbmcoKFdTRExCaW5kaW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUzoKLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBudWxsIDogIVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfUE9SVF9UWVBFOgotCQkJCXJldHVybiB3c2RsUG9ydFR5cGUgIT0gbnVsbDsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX0JJTkRJTkc6Ci0JCQkJcmV0dXJuIHdzZGxCaW5kaW5nICE9IG51bGw7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzICE9IG51bGwgJiYgIXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzZjYyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IE1ldGhvZCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCNnZXRKYXZhTWV0aG9kTmFtZSA8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCNnZXRXc2RsT3BlcmF0aW9uIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbCNpc1dyYXBwZWRFbGVtZW50IDxlbT5XcmFwcGVkIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwjZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIDxlbT5NZXRob2QgUGFyYW0gUGFydHMgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwjZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZyA8ZW0+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFNZXRob2ROYW1lKCkgPGVtPkphdmEgTWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhTWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTUVUSE9EX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YU1ldGhvZE5hbWUoKSA8ZW0+SmF2YSBNZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBqYXZhTWV0aG9kTmFtZSA9IEpBVkFfTUVUSE9EX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE9wZXJhdGlvbigpIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX09QRVJBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsT3BlcmF0aW9uKCkgPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE9wZXJhdGlvbiA9IFdTRExfT1BFUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzV3JhcHBlZEVsZW1lbnQoKSA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNXcmFwcGVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBXUkFQUEVEX0VMRU1FTlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzV3JhcHBlZEVsZW1lbnQoKSA8ZW0+V3JhcHBlZCBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNXcmFwcGVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIHdyYXBwZWRFbGVtZW50ID0gV1JBUFBFRF9FTEVNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBXcmFwcGVkIEVsZW1lbnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gd3JhcHBlZEVsZW1lbnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSA8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSA8ZW0+V3NkbCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFJldHVyblZhbHVlTWFwcGluZyB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXZhTWV0aG9kTmFtZSgpIHsKLQkJcmV0dXJuIGphdmFNZXRob2ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YU1ldGhvZE5hbWUoU3RyaW5nIG5ld0phdmFNZXRob2ROYW1lKSB7Ci0JCVN0cmluZyBvbGRKYXZhTWV0aG9kTmFtZSA9IGphdmFNZXRob2ROYW1lOwotCQlqYXZhTWV0aG9kTmFtZSA9IG5ld0phdmFNZXRob2ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUUsIG9sZEphdmFNZXRob2ROYW1lLCBqYXZhTWV0aG9kTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gd3NkbE9wZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxPcGVyYXRpb24oU3RyaW5nIG5ld1dzZGxPcGVyYXRpb24pIHsKLQkJU3RyaW5nIG9sZFdzZGxPcGVyYXRpb24gPSB3c2RsT3BlcmF0aW9uOwotCQl3c2RsT3BlcmF0aW9uID0gbmV3V3NkbE9wZXJhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX09QRVJBVElPTiwgb2xkV3NkbE9wZXJhdGlvbiwgd3NkbE9wZXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcmFwcGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdyYXBwZWRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3JhcHBlZEVsZW1lbnQoYm9vbGVhbiBuZXdXcmFwcGVkRWxlbWVudCkgewotCQlib29sZWFuIG9sZFdyYXBwZWRFbGVtZW50ID0gd3JhcHBlZEVsZW1lbnQ7Ci0JCXdyYXBwZWRFbGVtZW50ID0gbmV3V3JhcHBlZEVsZW1lbnQ7Ci0JCWJvb2xlYW4gb2xkV3JhcHBlZEVsZW1lbnRFU2V0ID0gd3JhcHBlZEVsZW1lbnRFU2V0OwotCQl3cmFwcGVkRWxlbWVudEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVCwgb2xkV3JhcHBlZEVsZW1lbnQsIHdyYXBwZWRFbGVtZW50LCAhb2xkV3JhcHBlZEVsZW1lbnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCB1bnNldFdyYXBwZWRFbGVtZW50KCkgewotCQlib29sZWFuIG9sZFdyYXBwZWRFbGVtZW50ID0gd3JhcHBlZEVsZW1lbnQ7Ci0JCWJvb2xlYW4gb2xkV3JhcHBlZEVsZW1lbnRFU2V0ID0gd3JhcHBlZEVsZW1lbnRFU2V0OwotCQl3cmFwcGVkRWxlbWVudCA9IFdSQVBQRURfRUxFTUVOVF9FREVGQVVMVDsKLQkJd3JhcHBlZEVsZW1lbnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQsIG9sZFdyYXBwZWRFbGVtZW50LCBXUkFQUEVEX0VMRU1FTlRfRURFRkFVTFQsIG9sZFdyYXBwZWRFbGVtZW50RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXRXcmFwcGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdyYXBwZWRFbGVtZW50RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSB7Ci0JCWlmIChtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIGdldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbFJldHVyblZhbHVlTWFwcGluZyhXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETFJldHVyblZhbHVlTWFwcGluZyBvbGRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nID0gd3NkbFJldHVyblZhbHVlTWFwcGluZzsKLQkJd3NkbFJldHVyblZhbHVlTWFwcGluZyA9IG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORywgb2xkV3NkbFJldHVyblZhbHVlTWFwcGluZywgbmV3V3NkbFJldHVyblZhbHVlTWFwcGluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcgbmV3V3NkbFJldHVyblZhbHVlTWFwcGluZykgewotCQlpZiAobmV3V3NkbFJldHVyblZhbHVlTWFwcGluZyAhPSB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsUmV0dXJuVmFsdWVNYXBwaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbFJldHVyblZhbHVlTWFwcGluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKG5ld1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HLCBuZXdXc2RsUmV0dXJuVmFsdWVNYXBwaW5nLCBuZXdXc2RsUmV0dXJuVmFsdWVNYXBwaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkc6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBnZXRKYXZhTWV0aG9kTmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OOgotCQkJCXJldHVybiBnZXRXc2RsT3BlcmF0aW9uKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1JBUFBFRF9FTEVNRU5UOgotCQkJCXJldHVybiBpc1dyYXBwZWRFbGVtZW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORzoKLQkJCQlyZXR1cm4gZ2V0V3NkbFJldHVyblZhbHVlTWFwcGluZygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FOgotCQkJCXNldEphdmFNZXRob2ROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX09QRVJBVElPTjoKLQkJCQlzZXRXc2RsT3BlcmF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQ6Ci0JCQkJc2V0V3JhcHBlZEVsZW1lbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUzoKLQkJCQlnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkc6Ci0JCQkJc2V0V3NkbFJldHVyblZhbHVlTWFwcGluZygoV1NETFJldHVyblZhbHVlTWFwcGluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSkFWQV9NRVRIT0RfTkFNRToKLQkJCQlzZXRKYXZhTWV0aG9kTmFtZShKQVZBX01FVEhPRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9PUEVSQVRJT046Ci0JCQkJc2V0V3NkbE9wZXJhdGlvbihXU0RMX09QRVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVDoKLQkJCQl1bnNldFdyYXBwZWRFbGVtZW50KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUzoKLQkJCQlnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOgotCQkJCXNldFdzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19KQVZBX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBKQVZBX01FVEhPRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBqYXZhTWV0aG9kTmFtZSAhPSBudWxsIDogIUpBVkFfTUVUSE9EX05BTUVfRURFRkFVTFQuZXF1YWxzKGphdmFNZXRob2ROYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX09QRVJBVElPTjoKLQkJCQlyZXR1cm4gV1NETF9PUEVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxPcGVyYXRpb24gIT0gbnVsbCA6ICFXU0RMX09QRVJBVElPTl9FREVGQVVMVC5lcXVhbHMod3NkbE9wZXJhdGlvbik7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1JBUFBFRF9FTEVNRU5UOgotCQkJCXJldHVybiBpc1NldFdyYXBwZWRFbGVtZW50KCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdTOgotCQkJCXJldHVybiBtZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MgIT0gbnVsbCAmJiAhbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOgotCQkJCXJldHVybiB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF2YU1ldGhvZE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGphdmFNZXRob2ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsT3BlcmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3c2RsT3BlcmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3cmFwcGVkRWxlbWVudDogIik7Ci0JCWlmICh3cmFwcGVkRWxlbWVudEVTZXQpIHJlc3VsdC5hcHBlbmQod3JhcHBlZEVsZW1lbnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODMyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwjZ2V0U2VydmljZUludGVyZmFjZSA8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsI2dldFdzZGxTZXJ2aWNlTmFtZSA8ZW0+V3NkbCBTZXJ2aWNlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsI2dldFBvcnRNYXBwaW5ncyA8ZW0+UG9ydCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbCBleHRlbmRzIEludGVyZmFjZU1hcHBpbmdJbXBsIGltcGxlbWVudHMgU2VydmljZUludGVyZmFjZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUludGVyZmFjZSgpIDxlbT5TZXJ2aWNlIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcnZpY2VJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlSW50ZXJmYWNlKCkgPGVtPlNlcnZpY2UgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VydmljZUludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUludGVyZmFjZSA9IFNFUlZJQ0VfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFNlcnZpY2VOYW1lKCkgPGVtPldzZGwgU2VydmljZSBOYW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbFNlcnZpY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExTZXJ2aWNlTmFtZSB3c2RsU2VydmljZU5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE1hcHBpbmdzKCkgPGVtPlBvcnQgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvcnRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBFTGlzdCBwb3J0TWFwcGluZ3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZyBuZXdTZXJ2aWNlSW50ZXJmYWNlKSB7Ci0JCVN0cmluZyBvbGRTZXJ2aWNlSW50ZXJmYWNlID0gc2VydmljZUludGVyZmFjZTsKLQkJc2VydmljZUludGVyZmFjZSA9IG5ld1NlcnZpY2VJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0UsIG9sZFNlcnZpY2VJbnRlcmZhY2UsIHNlcnZpY2VJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMU2VydmljZU5hbWUgZ2V0V3NkbFNlcnZpY2VOYW1lKCkgewotCQlyZXR1cm4gd3NkbFNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSBuZXdXc2RsU2VydmljZU5hbWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETFNlcnZpY2VOYW1lIG9sZFdzZGxTZXJ2aWNlTmFtZSA9IHdzZGxTZXJ2aWNlTmFtZTsKLQkJd3NkbFNlcnZpY2VOYW1lID0gbmV3V3NkbFNlcnZpY2VOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FLCBvbGRXc2RsU2VydmljZU5hbWUsIG5ld1dzZGxTZXJ2aWNlTmFtZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsU2VydmljZU5hbWUoV1NETFNlcnZpY2VOYW1lIG5ld1dzZGxTZXJ2aWNlTmFtZSkgewotCQlpZiAobmV3V3NkbFNlcnZpY2VOYW1lICE9IHdzZGxTZXJ2aWNlTmFtZSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod3NkbFNlcnZpY2VOYW1lICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdzZGxTZXJ2aWNlTmFtZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dzZGxTZXJ2aWNlTmFtZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsU2VydmljZU5hbWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxTZXJ2aWNlTmFtZShuZXdXc2RsU2VydmljZU5hbWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRSwgbmV3V3NkbFNlcnZpY2VOYW1lLCBuZXdXc2RsU2VydmljZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBFTGlzdCBnZXRQb3J0TWFwcGluZ3MoKSB7Ci0JCWlmIChwb3J0TWFwcGluZ3MgPT0gbnVsbCkgewotCQkJcG9ydE1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnRNYXBwaW5nLmNsYXNzLCB0aGlzLCBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBwb3J0TWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUU6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdzZGxTZXJ2aWNlTmFtZShudWxsLCBtc2dzKTsKLQkJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3J0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldFNlcnZpY2VJbnRlcmZhY2UoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRToKLQkJCQlyZXR1cm4gZ2V0V3NkbFNlcnZpY2VOYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0UG9ydE1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfSU5URVJGQUNFOgotCQkJCXNldFNlcnZpY2VJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FOgotCQkJCXNldFdzZGxTZXJ2aWNlTmFtZSgoV1NETFNlcnZpY2VOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fUE9SVF9NQVBQSU5HUzoKLQkJCQlnZXRQb3J0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFBvcnRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0U6Ci0JCQkJc2V0U2VydmljZUludGVyZmFjZShTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FOgotCQkJCXNldFdzZGxTZXJ2aWNlTmFtZSgoV1NETFNlcnZpY2VOYW1lKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTOgotCQkJCWdldFBvcnRNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gU0VSVklDRV9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VJbnRlcmZhY2UgIT0gbnVsbCA6ICFTRVJWSUNFX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUludGVyZmFjZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9TRVJWSUNFX05BTUU6Ci0JCQkJcmV0dXJuIHdzZGxTZXJ2aWNlTmFtZSAhPSBudWxsOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1BPUlRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIHBvcnRNYXBwaW5ncyAhPSBudWxsICYmICFwb3J0TWFwcGluZ3MuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VJbnRlcmZhY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1ZhcmlhYmxlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1ZhcmlhYmxlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3YjMzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9WYXJpYWJsZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFyaWFibGUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2dldEphdmFWYXJpYWJsZU5hbWUgPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2dldFhtbEVsZW1lbnROYW1lIDxlbT5YbWwgRWxlbWVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLlZhcmlhYmxlTWFwcGluZ0ltcGwjaXNEYXRhTWVtYmVyIDxlbT5EYXRhIE1lbWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2dldFhtbEF0dHJpYnV0ZU5hbWUgPGVtPlhtbCBBdHRyaWJ1dGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5WYXJpYWJsZU1hcHBpbmdJbXBsI2lzWG1sV2lsZGNhcmQgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmxlTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFZhcmlhYmxlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhVmFyaWFibGVOYW1lKCkgPGVtPkphdmEgVmFyaWFibGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFWYXJpYWJsZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1ZBUklBQkxFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVZhcmlhYmxlTmFtZSgpIDxlbT5KYXZhIFZhcmlhYmxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhVmFyaWFibGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBqYXZhVmFyaWFibGVOYW1lID0gSkFWQV9WQVJJQUJMRV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhtbEVsZW1lbnROYW1lKCkgPGVtPlhtbCBFbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYbWxFbGVtZW50TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WG1sRWxlbWVudE5hbWUoKSA8ZW0+WG1sIEVsZW1lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB4bWxFbGVtZW50TmFtZSA9IFhNTF9FTEVNRU5UX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEYXRhTWVtYmVyKCkgPGVtPkRhdGEgTWVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXRhTWVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERBVEFfTUVNQkVSX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RhdGFNZW1iZXIoKSA8ZW0+RGF0YSBNZW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RhdGFNZW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhTWVtYmVyID0gREFUQV9NRU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERhdGEgTWVtYmVyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIGRhdGFNZW1iZXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WG1sQXR0cmlidXRlTmFtZSgpIDxlbT5YbWwgQXR0cmlidXRlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVFJJQlVURV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhtbEF0dHJpYnV0ZU5hbWUoKSA8ZW0+WG1sIEF0dHJpYnV0ZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgeG1sQXR0cmlidXRlTmFtZSA9IFhNTF9BVFRSSUJVVEVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1htbFdpbGRjYXJkKCkgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzWG1sV2lsZGNhcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWE1MX1dJTERDQVJEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1htbFdpbGRjYXJkKCkgPGVtPlhtbCBXaWxkY2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzWG1sV2lsZGNhcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB4bWxXaWxkY2FyZCA9IFhNTF9XSUxEQ0FSRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgWG1sIFdpbGRjYXJkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIHhtbFdpbGRjYXJkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgVmFyaWFibGVNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXZhVmFyaWFibGVOYW1lKCkgewotCQlyZXR1cm4gamF2YVZhcmlhYmxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFWYXJpYWJsZU5hbWUoU3RyaW5nIG5ld0phdmFWYXJpYWJsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZEphdmFWYXJpYWJsZU5hbWUgPSBqYXZhVmFyaWFibGVOYW1lOwotCQlqYXZhVmFyaWFibGVOYW1lID0gbmV3SmF2YVZhcmlhYmxlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19KQVZBX1ZBUklBQkxFX05BTUUsIG9sZEphdmFWYXJpYWJsZU5hbWUsIGphdmFWYXJpYWJsZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiB4bWxFbGVtZW50TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFhtbEVsZW1lbnROYW1lKFN0cmluZyBuZXdYbWxFbGVtZW50TmFtZSkgewotCQlTdHJpbmcgb2xkWG1sRWxlbWVudE5hbWUgPSB4bWxFbGVtZW50TmFtZTsKLQkJeG1sRWxlbWVudE5hbWUgPSBuZXdYbWxFbGVtZW50TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfRUxFTUVOVF9OQU1FLCBvbGRYbWxFbGVtZW50TmFtZSwgeG1sRWxlbWVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGF0YU1lbWJlcigpIHsKLQkJcmV0dXJuIGRhdGFNZW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXREYXRhTWVtYmVyKGJvb2xlYW4gbmV3RGF0YU1lbWJlcikgewotCQlib29sZWFuIG9sZERhdGFNZW1iZXIgPSBkYXRhTWVtYmVyOwotCQlkYXRhTWVtYmVyID0gbmV3RGF0YU1lbWJlcjsKLQkJYm9vbGVhbiBvbGREYXRhTWVtYmVyRVNldCA9IGRhdGFNZW1iZXJFU2V0OwotCQlkYXRhTWVtYmVyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIsIG9sZERhdGFNZW1iZXIsIGRhdGFNZW1iZXIsICFvbGREYXRhTWVtYmVyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXREYXRhTWVtYmVyKCkgewotCQlib29sZWFuIG9sZERhdGFNZW1iZXIgPSBkYXRhTWVtYmVyOwotCQlib29sZWFuIG9sZERhdGFNZW1iZXJFU2V0ID0gZGF0YU1lbWJlckVTZXQ7Ci0JCWRhdGFNZW1iZXIgPSBEQVRBX01FTUJFUl9FREVGQVVMVDsKLQkJZGF0YU1lbWJlckVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSLCBvbGREYXRhTWVtYmVyLCBEQVRBX01FTUJFUl9FREVGQVVMVCwgb2xkRGF0YU1lbWJlckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0RGF0YU1lbWJlcigpIHsKLQkJcmV0dXJuIGRhdGFNZW1iZXJFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYbWxBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4geG1sQXR0cmlidXRlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFhtbEF0dHJpYnV0ZU5hbWUoU3RyaW5nIG5ld1htbEF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFhtbEF0dHJpYnV0ZU5hbWUgPSB4bWxBdHRyaWJ1dGVOYW1lOwotCQl4bWxBdHRyaWJ1dGVOYW1lID0gbmV3WG1sQXR0cmlidXRlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfQVRUUklCVVRFX05BTUUsIG9sZFhtbEF0dHJpYnV0ZU5hbWUsIHhtbEF0dHJpYnV0ZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzWG1sV2lsZGNhcmQoKSB7Ci0JCXJldHVybiB4bWxXaWxkY2FyZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFhtbFdpbGRjYXJkKGJvb2xlYW4gbmV3WG1sV2lsZGNhcmQpIHsKLQkJYm9vbGVhbiBvbGRYbWxXaWxkY2FyZCA9IHhtbFdpbGRjYXJkOwotCQl4bWxXaWxkY2FyZCA9IG5ld1htbFdpbGRjYXJkOwotCQlib29sZWFuIG9sZFhtbFdpbGRjYXJkRVNldCA9IHhtbFdpbGRjYXJkRVNldDsKLQkJeG1sV2lsZGNhcmRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQsIG9sZFhtbFdpbGRjYXJkLCB4bWxXaWxkY2FyZCwgIW9sZFhtbFdpbGRjYXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXRYbWxXaWxkY2FyZCgpIHsKLQkJYm9vbGVhbiBvbGRYbWxXaWxkY2FyZCA9IHhtbFdpbGRjYXJkOwotCQlib29sZWFuIG9sZFhtbFdpbGRjYXJkRVNldCA9IHhtbFdpbGRjYXJkRVNldDsKLQkJeG1sV2lsZGNhcmQgPSBYTUxfV0lMRENBUkRfRURFRkFVTFQ7Ci0JCXhtbFdpbGRjYXJkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX1dJTERDQVJELCBvbGRYbWxXaWxkY2FyZCwgWE1MX1dJTERDQVJEX0VERUZBVUxULCBvbGRYbWxXaWxkY2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0WG1sV2lsZGNhcmQoKSB7Ci0JCXJldHVybiB4bWxXaWxkY2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FOgotCQkJCXJldHVybiBnZXRKYXZhVmFyaWFibGVOYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0WG1sRWxlbWVudE5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19EQVRBX01FTUJFUjoKLQkJCQlyZXR1cm4gaXNEYXRhTWVtYmVyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0WG1sQXR0cmlidXRlTmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRDoKLQkJCQlyZXR1cm4gaXNYbWxXaWxkY2FyZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FOgotCQkJCXNldEphdmFWYXJpYWJsZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9FTEVNRU5UX05BTUU6Ci0JCQkJc2V0WG1sRWxlbWVudE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0RBVEFfTUVNQkVSOgotCQkJCXNldERhdGFNZW1iZXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRToKLQkJCQlzZXRYbWxBdHRyaWJ1dGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQ6Ci0JCQkJc2V0WG1sV2lsZGNhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FOgotCQkJCXNldEphdmFWYXJpYWJsZU5hbWUoSkFWQV9WQVJJQUJMRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRToKLQkJCQlzZXRYbWxFbGVtZW50TmFtZShYTUxfRUxFTUVOVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVI6Ci0JCQkJdW5zZXREYXRhTWVtYmVyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRToKLQkJCQlzZXRYbWxBdHRyaWJ1dGVOYW1lKFhNTF9BVFRSSUJVVEVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9XSUxEQ0FSRDoKLQkJCQl1bnNldFhtbFdpbGRjYXJkKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19KQVZBX1ZBUklBQkxFX05BTUU6Ci0JCQkJcmV0dXJuIEpBVkFfVkFSSUFCTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gamF2YVZhcmlhYmxlTmFtZSAhPSBudWxsIDogIUpBVkFfVkFSSUFCTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoamF2YVZhcmlhYmxlTmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRToKLQkJCQlyZXR1cm4gWE1MX0VMRU1FTlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8geG1sRWxlbWVudE5hbWUgIT0gbnVsbCA6ICFYTUxfRUxFTUVOVF9OQU1FX0VERUZBVUxULmVxdWFscyh4bWxFbGVtZW50TmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVI6Ci0JCQkJcmV0dXJuIGlzU2V0RGF0YU1lbWJlcigpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRToKLQkJCQlyZXR1cm4gWE1MX0FUVFJJQlVURV9OQU1FX0VERUZBVUxUID09IG51bGwgPyB4bWxBdHRyaWJ1dGVOYW1lICE9IG51bGwgOiAhWE1MX0FUVFJJQlVURV9OQU1FX0VERUZBVUxULmVxdWFscyh4bWxBdHRyaWJ1dGVOYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0WG1sV2lsZGNhcmQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhVmFyaWFibGVOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqYXZhVmFyaWFibGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB4bWxFbGVtZW50TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoeG1sRWxlbWVudE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRhdGFNZW1iZXI6ICIpOwotCQlpZiAoZGF0YU1lbWJlckVTZXQpIHJlc3VsdC5hcHBlbmQoZGF0YU1lbWJlcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHhtbEF0dHJpYnV0ZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHhtbEF0dHJpYnV0ZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHhtbFdpbGRjYXJkOiAiKTsKLQkJaWYgKHhtbFdpbGRjYXJkRVNldCkgcmVzdWx0LmFwcGVuZCh4bWxXaWxkY2FyZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9WYXJpYWJsZU1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMQmluZGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExCaW5kaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWExZDI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExCaW5kaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIEJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMQmluZGluZ0ltcGwgZXh0ZW5kcyBRTmFtZUltcGwgaW1wbGVtZW50cyBXU0RMQmluZGluZwotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExCaW5kaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETEJpbmRpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkdfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfQklORElOR19fTE9DQUxfUEFSVDoKLQkJCQlyZXR1cm4gZ2V0TG9jYWxQYXJ0KCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9CSU5ESU5HX19DT01CSU5FRF9RTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q29tYmluZWRRTmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfQklORElOR19fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9CSU5ESU5HX19OQU1FU1BBQ0VfVVJJOgotCQkJCXNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9CSU5ESU5HX19MT0NBTF9QQVJUOgotCQkJCXNldExvY2FsUGFydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9CSU5ESU5HX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkdfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkdfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkdfX0xPQ0FMX1BBUlQ6Ci0JCQkJc2V0TG9jYWxQYXJ0KExPQ0FMX1BBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkdfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXNldENvbWJpbmVkUU5hbWUoQ09NQklORURfUU5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkdfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9CSU5ESU5HX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfQklORElOR19fTE9DQUxfUEFSVDoKLQkJCQlyZXR1cm4gTE9DQUxfUEFSVF9FREVGQVVMVCA9PSBudWxsID8gbG9jYWxQYXJ0ICE9IG51bGwgOiAhTE9DQUxfUEFSVF9FREVGQVVMVC5lcXVhbHMobG9jYWxQYXJ0KTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkdfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBDT01CSU5FRF9RTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY29tYmluZWRRTmFtZSAhPSBudWxsIDogIUNPTUJJTkVEX1FOQU1FX0VERUZBVUxULmVxdWFscyhjb21iaW5lZFFOYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX0JJTkRJTkdfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQgPT0gbnVsbCA/IGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIDogIUlOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQuZXF1YWxzKGludGVybmFsUHJlZml4T3JOc1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1dTRExCaW5kaW5nSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllMmVjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5RTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBNZXNzYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VJbXBsIGV4dGVuZHMgUU5hbWVJbXBsIGltcGxlbWVudHMgV1NETE1lc3NhZ2UKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMTWVzc2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIGdldExvY2FsUGFydCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9fQ09NQklORURfUU5BTUU6Ci0JCQkJcmV0dXJuIGdldENvbWJpbmVkUU5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIGdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9fTE9DQUxfUEFSVDoKLQkJCQlzZXRMb2NhbFBhcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9fQ09NQklORURfUU5BTUU6Ci0JCQkJc2V0Q29tYmluZWRRTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXNldEludGVybmFsUHJlZml4T3JOc1VSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX19OQU1FU1BBQ0VfVVJJOgotCQkJCXNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX19MT0NBTF9QQVJUOgotCQkJCXNldExvY2FsUGFydChMT0NBTF9QQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKENPTUJJTkVEX1FOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXNldEludGVybmFsUHJlZml4T3JOc1VSSShJTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlyZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIExPQ0FMX1BBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsUGFydCAhPSBudWxsIDogIUxPQ0FMX1BBUlRfRURFRkFVTFQuZXF1YWxzKGxvY2FsUGFydCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX19DT01CSU5FRF9RTkFNRToKLQkJCQlyZXR1cm4gQ09NQklORURfUU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNvbWJpbmVkUU5hbWUgIT0gbnVsbCA6ICFDT01CSU5FRF9RTkFNRV9FREVGQVVMVC5lcXVhbHMoY29tYmluZWRRTmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXJldHVybiBJTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJX0VERUZBVUxUID09IG51bGwgPyBpbnRlcm5hbFByZWZpeE9yTnNVUkkgIT0gbnVsbCA6ICFJTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJX0VERUZBVUxULmVxdWFscyhpbnRlcm5hbFByZWZpeE9yTnNVUkkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9XU0RMTWVzc2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlTWFwcGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlZDFiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIE1lc3NhZ2UgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZU1hcHBpbmdJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZU1hcHBpbmdJbXBsI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCNnZXRQYXJhbWV0ZXJNb2RlIDxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMTWVzc2FnZU1hcHBpbmdJbXBsI2lzU29hcEhlYWRlciA8ZW0+U29hcCBIZWFkZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VNYXBwaW5nSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV1NETE1lc3NhZ2VNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlUGFydE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxNZXNzYWdlUGFydE5hbWUgPSBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlck1vZGUoKSA8ZW0+UGFyYW1ldGVyIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJNb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01PREVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVyTW9kZSgpIDxlbT5QYXJhbWV0ZXIgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlck1vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmFtZXRlck1vZGUgPSBQQVJBTUVURVJfTU9ERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NvYXBIZWFkZXIoKSA8ZW0+U29hcCBIZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NvYXBIZWFkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU09BUF9IRUFERVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU29hcEhlYWRlcigpIDxlbT5Tb2FwIEhlYWRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU29hcEhlYWRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNvYXBIZWFkZXIgPSBTT0FQX0hFQURFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU29hcCBIZWFkZXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc29hcEhlYWRlckVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlKCkgPGVtPldzZGwgTWVzc2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExNZXNzYWdlIHdzZGxNZXNzYWdlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExNZXNzYWdlTWFwcGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZVBhcnROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShTdHJpbmcgbmV3V3NkbE1lc3NhZ2VQYXJ0TmFtZSkgewotCQlTdHJpbmcgb2xkV3NkbE1lc3NhZ2VQYXJ0TmFtZSA9IHdzZGxNZXNzYWdlUGFydE5hbWU7Ci0JCXdzZGxNZXNzYWdlUGFydE5hbWUgPSBuZXdXc2RsTWVzc2FnZVBhcnROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBvbGRXc2RsTWVzc2FnZVBhcnROYW1lLCB3c2RsTWVzc2FnZVBhcnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck1vZGUoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJNb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyTW9kZShTdHJpbmcgbmV3UGFyYW1ldGVyTW9kZSkgewotCQlTdHJpbmcgb2xkUGFyYW1ldGVyTW9kZSA9IHBhcmFtZXRlck1vZGU7Ci0JCXBhcmFtZXRlck1vZGUgPSBuZXdQYXJhbWV0ZXJNb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19QQVJBTUVURVJfTU9ERSwgb2xkUGFyYW1ldGVyTW9kZSwgcGFyYW1ldGVyTW9kZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTb2FwSGVhZGVyKCkgewotCQlyZXR1cm4gc29hcEhlYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFNvYXBIZWFkZXIoYm9vbGVhbiBuZXdTb2FwSGVhZGVyKSB7Ci0JCWJvb2xlYW4gb2xkU29hcEhlYWRlciA9IHNvYXBIZWFkZXI7Ci0JCXNvYXBIZWFkZXIgPSBuZXdTb2FwSGVhZGVyOwotCQlib29sZWFuIG9sZFNvYXBIZWFkZXJFU2V0ID0gc29hcEhlYWRlckVTZXQ7Ci0JCXNvYXBIZWFkZXJFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVIsIG9sZFNvYXBIZWFkZXIsIHNvYXBIZWFkZXIsICFvbGRTb2FwSGVhZGVyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgdW5zZXRTb2FwSGVhZGVyKCkgewotCQlib29sZWFuIG9sZFNvYXBIZWFkZXIgPSBzb2FwSGVhZGVyOwotCQlib29sZWFuIG9sZFNvYXBIZWFkZXJFU2V0ID0gc29hcEhlYWRlckVTZXQ7Ci0JCXNvYXBIZWFkZXIgPSBTT0FQX0hFQURFUl9FREVGQVVMVDsKLQkJc29hcEhlYWRlckVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUiwgb2xkU29hcEhlYWRlciwgU09BUF9IRUFERVJfRURFRkFVTFQsIG9sZFNvYXBIZWFkZXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NldFNvYXBIZWFkZXIoKSB7Ci0JCXJldHVybiBzb2FwSGVhZGVyRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBXU0RMTWVzc2FnZSBnZXRXc2RsTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHdzZGxNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UgbmV3V3NkbE1lc3NhZ2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV1NETE1lc3NhZ2Ugb2xkV3NkbE1lc3NhZ2UgPSB3c2RsTWVzc2FnZTsKLQkJd3NkbE1lc3NhZ2UgPSBuZXdXc2RsTWVzc2FnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFLCBvbGRXc2RsTWVzc2FnZSwgbmV3V3NkbE1lc3NhZ2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UgbmV3V3NkbE1lc3NhZ2UpIHsKLQkJaWYgKG5ld1dzZGxNZXNzYWdlICE9IHdzZGxNZXNzYWdlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsTWVzc2FnZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsTWVzc2FnZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V3NkbE1lc3NhZ2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V3NkbE1lc3NhZ2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V3NkbE1lc3NhZ2UobmV3V3NkbE1lc3NhZ2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFLCBuZXdXc2RsTWVzc2FnZSwgbmV3V3NkbE1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsTWVzc2FnZShudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19QQVJBTUVURVJfTU9ERToKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVyTW9kZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19TT0FQX0hFQURFUjoKLQkJCQlyZXR1cm4gaXNTb2FwSGVhZGVyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIGdldFdzZGxNZXNzYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fUEFSQU1FVEVSX01PREU6Ci0JCQkJc2V0UGFyYW1ldGVyTW9kZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSOgotCQkJCXNldFNvYXBIZWFkZXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJc2V0V3NkbE1lc3NhZ2UoKFdTRExNZXNzYWdlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFOgotCQkJCXNldFBhcmFtZXRlck1vZGUoUEFSQU1FVEVSX01PREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVI6Ci0JCQkJdW5zZXRTb2FwSGVhZGVyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJc2V0V3NkbE1lc3NhZ2UoKFdTRExNZXNzYWdlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXJldHVybiBXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyB3c2RsTWVzc2FnZVBhcnROYW1lICE9IG51bGwgOiAhV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFOgotCQkJCXJldHVybiBQQVJBTUVURVJfTU9ERV9FREVGQVVMVCA9PSBudWxsID8gcGFyYW1ldGVyTW9kZSAhPSBudWxsIDogIVBBUkFNRVRFUl9NT0RFX0VERUZBVUxULmVxdWFscyhwYXJhbWV0ZXJNb2RlKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVI6Ci0JCQkJcmV0dXJuIGlzU2V0U29hcEhlYWRlcigpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIHdzZGxNZXNzYWdlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE1lc3NhZ2VQYXJ0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1ldGVyTW9kZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyYW1ldGVyTW9kZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEhlYWRlcjogIik7Ci0JCWlmIChzb2FwSGVhZGVyRVNldCkgcmVzdWx0LmFwcGVuZChzb2FwSGVhZGVyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dTRExNZXNzYWdlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlUGFydE5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZVBhcnROYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRhYTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlUGFydE5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExNZXNzYWdlUGFydE5hbWVJbXBsI2dldFdzZGxNZXNzYWdlUGFydE5hbWUgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZVBhcnROYW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV1NETE1lc3NhZ2VQYXJ0TmFtZQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsTWVzc2FnZVBhcnROYW1lID0gV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExNZXNzYWdlUGFydE5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZVBhcnROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nIG5ld1dzZGxNZXNzYWdlUGFydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFdzZGxNZXNzYWdlUGFydE5hbWUgPSB3c2RsTWVzc2FnZVBhcnROYW1lOwotCQl3c2RsTWVzc2FnZVBhcnROYW1lID0gbmV3V3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBvbGRXc2RsTWVzc2FnZVBhcnROYW1lLCB3c2RsTWVzc2FnZVBhcnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlzZXRXc2RsTWVzc2FnZVBhcnROYW1lKFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fV1NETF9NRVNTQUdFX1BBUlRfTkFNRToKLQkJCQlyZXR1cm4gV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gd3NkbE1lc3NhZ2VQYXJ0TmFtZSAhPSBudWxsIDogIVdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQuZXF1YWxzKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdzZGxNZXNzYWdlUGFydE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XU0RMTWVzc2FnZVBhcnROYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE9wZXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExPcGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE9wZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBPcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETE9wZXJhdGlvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsLldTRExPcGVyYXRpb25JbXBsI2dldFdzZGxPcGVyYXRpb24gPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE9wZXJhdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdTRExPcGVyYXRpb24KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbE9wZXJhdGlvbigpIDxlbT5Xc2RsIE9wZXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX09QRVJBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsT3BlcmF0aW9uKCkgPGVtPldzZGwgT3BlcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V3NkbE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbE9wZXJhdGlvbiA9IFdTRExfT1BFUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETE9wZXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gd3NkbE9wZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxPcGVyYXRpb24oU3RyaW5nIG5ld1dzZGxPcGVyYXRpb24pIHsKLQkJU3RyaW5nIG9sZFdzZGxPcGVyYXRpb24gPSB3c2RsT3BlcmF0aW9uOwotCQl3c2RsT3BlcmF0aW9uID0gbmV3V3NkbE9wZXJhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT04sIG9sZFdzZGxPcGVyYXRpb24sIHdzZGxPcGVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OOgotCQkJCXJldHVybiBnZXRXc2RsT3BlcmF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT046Ci0JCQkJc2V0V3NkbE9wZXJhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX1dTRExfT1BFUkFUSU9OOgotCQkJCXNldFdzZGxPcGVyYXRpb24oV1NETF9PUEVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19XU0RMX09QRVJBVElPTjoKLQkJCQlyZXR1cm4gV1NETF9PUEVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxPcGVyYXRpb24gIT0gbnVsbCA6ICFXU0RMX09QRVJBVElPTl9FREVGQVVMVC5lcXVhbHMod3NkbE9wZXJhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE9wZXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQod3NkbE9wZXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dTRExPcGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWU0MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFBvcnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLlFOYW1lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBQb3J0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUG9ydFR5cGVJbXBsIGV4dGVuZHMgUU5hbWVJbXBsIGltcGxlbWVudHMgV1NETFBvcnRUeXBlCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgV1NETFBvcnRUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFBvcnRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9QT1JUX1RZUEVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBnZXRMb2NhbFBhcnQoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1BPUlRfVFlQRV9fQ09NQklORURfUU5BTUU6Ci0JCQkJcmV0dXJuIGdldENvbWJpbmVkUU5hbWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1BPUlRfVFlQRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9QT1JUX1RZUEVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1BPUlRfVFlQRV9fTE9DQUxfUEFSVDoKLQkJCQlzZXRMb2NhbFBhcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1BPUlRfVFlQRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlzZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFX19OQU1FU1BBQ0VfVVJJOgotCQkJCXNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9QT1JUX1RZUEVfX0xPQ0FMX1BBUlQ6Ci0JCQkJc2V0TG9jYWxQYXJ0KExPQ0FMX1BBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1BPUlRfVFlQRV9fQ09NQklORURfUU5BTUU6Ci0JCQkJc2V0Q29tYmluZWRRTmFtZShDT01CSU5FRF9RTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXNldEludGVybmFsUHJlZml4T3JOc1VSSShJTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFX19OQU1FU1BBQ0VfVVJJOgotCQkJCXJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFX19MT0NBTF9QQVJUOgotCQkJCXJldHVybiBMT0NBTF9QQVJUX0VERUZBVUxUID09IG51bGwgPyBsb2NhbFBhcnQgIT0gbnVsbCA6ICFMT0NBTF9QQVJUX0VERUZBVUxULmVxdWFscyhsb2NhbFBhcnQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUE9SVF9UWVBFX19DT01CSU5FRF9RTkFNRToKLQkJCQlyZXR1cm4gQ09NQklORURfUU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNvbWJpbmVkUU5hbWUgIT0gbnVsbCA6ICFDT01CSU5FRF9RTkFNRV9FREVGQVVMVC5lcXVhbHMoY29tYmluZWRRTmFtZSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9QT1JUX1RZUEVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJcmV0dXJuIElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQgPT0gbnVsbCA/IGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIDogIUlOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQuZXF1YWxzKGludGVybmFsUHJlZml4T3JOc1VSSSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1dTRExQb3J0VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzdlNGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwjZ2V0TWV0aG9kUmV0dXJuVmFsdWUgPGVtPk1ldGhvZCBSZXR1cm4gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGwuV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwjZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSA8ZW0+V3NkbCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwuaW1wbC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbCNnZXRXc2RsTWVzc2FnZSA8ZW0+V3NkbCBNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKSA8ZW0+TWV0aG9kIFJldHVybiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFJldHVyblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1JFVFVSTl9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RSZXR1cm5WYWx1ZSgpIDxlbT5NZXRob2QgUmV0dXJuIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZFJldHVyblZhbHVlID0gTUVUSE9EX1JFVFVSTl9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkgPGVtPldzZGwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsTWVzc2FnZVBhcnROYW1lID0gV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxNZXNzYWdlKCkgPGVtPldzZGwgTWVzc2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdzZGxNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExNZXNzYWdlIHdzZGxNZXNzYWdlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXRob2RSZXR1cm5WYWx1ZSgpIHsKLQkJcmV0dXJuIG1ldGhvZFJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kUmV0dXJuVmFsdWUoU3RyaW5nIG5ld01ldGhvZFJldHVyblZhbHVlKSB7Ci0JCVN0cmluZyBvbGRNZXRob2RSZXR1cm5WYWx1ZSA9IG1ldGhvZFJldHVyblZhbHVlOwotCQltZXRob2RSZXR1cm5WYWx1ZSA9IG5ld01ldGhvZFJldHVyblZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUUsIG9sZE1ldGhvZFJldHVyblZhbHVlLCBtZXRob2RSZXR1cm5WYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCkgewotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxNZXNzYWdlUGFydE5hbWUoU3RyaW5nIG5ld1dzZGxNZXNzYWdlUGFydE5hbWUpIHsKLQkJU3RyaW5nIG9sZFdzZGxNZXNzYWdlUGFydE5hbWUgPSB3c2RsTWVzc2FnZVBhcnROYW1lOwotCQl3c2RsTWVzc2FnZVBhcnROYW1lID0gbmV3V3NkbE1lc3NhZ2VQYXJ0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FLCBvbGRXc2RsTWVzc2FnZVBhcnROYW1lLCB3c2RsTWVzc2FnZVBhcnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgV1NETE1lc3NhZ2UgZ2V0V3NkbE1lc3NhZ2UoKSB7Ci0JCXJldHVybiB3c2RsTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdzZGxNZXNzYWdlKFdTRExNZXNzYWdlIG5ld1dzZGxNZXNzYWdlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdTRExNZXNzYWdlIG9sZFdzZGxNZXNzYWdlID0gd3NkbE1lc3NhZ2U7Ci0JCXdzZGxNZXNzYWdlID0gbmV3V3NkbE1lc3NhZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFLCBvbGRXc2RsTWVzc2FnZSwgbmV3V3NkbE1lc3NhZ2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbE1lc3NhZ2UoV1NETE1lc3NhZ2UgbmV3V3NkbE1lc3NhZ2UpIHsKLQkJaWYgKG5ld1dzZGxNZXNzYWdlICE9IHdzZGxNZXNzYWdlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3c2RsTWVzc2FnZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3c2RsTWVzc2FnZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdXc2RsTWVzc2FnZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXc2RsTWVzc2FnZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdzZGxNZXNzYWdlKG5ld1dzZGxNZXNzYWdlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFLCBuZXdXc2RsTWVzc2FnZSwgbmV3V3NkbE1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdzZGxNZXNzYWdlKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fTUVUSE9EX1JFVFVSTl9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUmV0dXJuVmFsdWUoKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXJldHVybiBnZXRXc2RsTWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFOgotCQkJCXNldE1ldGhvZFJldHVyblZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FOgotCQkJCXNldFdzZGxNZXNzYWdlUGFydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKLQkJCQlzZXRXc2RsTWVzc2FnZSgoV1NETE1lc3NhZ2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUU6Ci0JCQkJc2V0TWV0aG9kUmV0dXJuVmFsdWUoTUVUSE9EX1JFVFVSTl9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJc2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZShXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fV1NETF9NRVNTQUdFOgotCQkJCXNldFdzZGxNZXNzYWdlKChXU0RMTWVzc2FnZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUU6Ci0JCQkJcmV0dXJuIE1FVEhPRF9SRVRVUk5fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IG1ldGhvZFJldHVyblZhbHVlICE9IG51bGwgOiAhTUVUSE9EX1JFVFVSTl9WQUxVRV9FREVGQVVMVC5lcXVhbHMobWV0aG9kUmV0dXJuVmFsdWUpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUU6Ci0JCQkJcmV0dXJuIFdTRExfTUVTU0FHRV9QQVJUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxNZXNzYWdlUGFydE5hbWUgIT0gbnVsbCA6ICFXU0RMX01FU1NBR0VfUEFSVF9OQU1FX0VERUZBVUxULmVxdWFscyh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0U6Ci0JCQkJcmV0dXJuIHdzZGxNZXNzYWdlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kUmV0dXJuVmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZFJldHVyblZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTWVzc2FnZVBhcnROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlTmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlTmFtZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3NDA1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMU2VydmljZU5hbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuUU5hbWVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMIFNlcnZpY2UgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlTmFtZUltcGwgZXh0ZW5kcyBRTmFtZUltcGwgaW1wbGVtZW50cyBXU0RMU2VydmljZU5hbWUKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByb3RlY3RlZCBXU0RMU2VydmljZU5hbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMU2VydmljZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1NFUlZJQ0VfTkFNRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlyZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUVfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIGdldExvY2FsUGFydCgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfU0VSVklDRV9OQU1FX19DT01CSU5FRF9RTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q29tYmluZWRRTmFtZSgpOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfU0VSVklDRV9OQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXJldHVybiBnZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1NFUlZJQ0VfTkFNRV9fTkFNRVNQQUNFX1VSSToKLQkJCQlzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfU0VSVklDRV9OQU1FX19MT0NBTF9QQVJUOgotCQkJCXNldExvY2FsUGFydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXNldENvbWJpbmVkUU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfU0VSVklDRV9OQU1FX19JTlRFUk5BTF9QUkVGSVhfT1JfTlNfVVJJOgotCQkJCXNldEludGVybmFsUHJlZml4T3JOc1VSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1NFUlZJQ0VfTkFNRV9fTE9DQUxfUEFSVDoKLQkJCQlzZXRMb2NhbFBhcnQoTE9DQUxfUEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfU0VSVklDRV9OQU1FX19DT01CSU5FRF9RTkFNRToKLQkJCQlzZXRDb21iaW5lZFFOYW1lKENPTUJJTkVEX1FOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUVfX0lOVEVSTkFMX1BSRUZJWF9PUl9OU19VUkk6Ci0JCQkJc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKElOVEVSTkFMX1BSRUZJWF9PUl9OU19VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUVfX05BTUVTUEFDRV9VUkk6Ci0JCQkJcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUVfX0xPQ0FMX1BBUlQ6Ci0JCQkJcmV0dXJuIExPQ0FMX1BBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2FsUGFydCAhPSBudWxsIDogIUxPQ0FMX1BBUlRfRURFRkFVTFQuZXF1YWxzKGxvY2FsUGFydCk7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUVfX0NPTUJJTkVEX1FOQU1FOgotCQkJCXJldHVybiBDT01CSU5FRF9RTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY29tYmluZWRRTmFtZSAhPSBudWxsIDogIUNPTUJJTkVEX1FOQU1FX0VERUZBVUxULmVxdWFscyhjb21iaW5lZFFOYW1lKTsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1NFUlZJQ0VfTkFNRV9fSU5URVJOQUxfUFJFRklYX09SX05TX1VSSToKLQkJCQlyZXR1cm4gSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVCA9PSBudWxsID8gaW50ZXJuYWxQcmVmaXhPck5zVVJJICE9IG51bGwgOiAhSU5URVJOQUxfUFJFRklYX09SX05TX1VSSV9FREVGQVVMVC5lcXVhbHMoaW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vV1NETFNlcnZpY2VOYW1lSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC91dGlsL0pheHJwY21hcEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNmU5NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpheHJwY21hcEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIEpheHJwY21hcFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEpheHJwY21hcEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcm90ZWN0ZWQgSmF4cnBjbWFwU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEpheHJwY21hcFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFXU0RMTWFwcGluZyhKYXZhV1NETE1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFXU0RMTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBhY2thZ2VNYXBwaW5nKFBhY2thZ2VNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQYWNrYWdlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFYTUxUeXBlTWFwcGluZyhKYXZhWE1MVHlwZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2VwdGlvbk1hcHBpbmcoRXhjZXB0aW9uTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhjZXB0aW9uTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJvb3RUeXBlUW5hbWUoUm9vdFR5cGVRbmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9vdFR5cGVRbmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhcmlhYmxlTWFwcGluZyhWYXJpYWJsZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmxlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlKFdTRExNZXNzYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMTWVzc2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVsZW1lbnROYW1lKEVsZW1lbnROYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFbGVtZW50TmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExTZXJ2aWNlTmFtZShXU0RMU2VydmljZU5hbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExTZXJ2aWNlTmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBvcnRNYXBwaW5nKFBvcnRNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQb3J0TWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExQb3J0VHlwZShXU0RMUG9ydFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExQb3J0VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExCaW5kaW5nKFdTRExCaW5kaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMQmluZGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExPcGVyYXRpb24oV1NETE9wZXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETE9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoV1NETFJldHVyblZhbHVlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlTWFwcGluZyhXU0RMTWVzc2FnZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExNZXNzYWdlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlUGFydE5hbWUoV1NETE1lc3NhZ2VQYXJ0TmFtZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETE1lc3NhZ2VQYXJ0TmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUludGVyZmFjZU1hcHBpbmcoSW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVRTmFtZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZyA8ZW0+SmF2YSBXU0RMIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhV1NETE1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBhY2thZ2VNYXBwaW5nIDxlbT5QYWNrYWdlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcgPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZyA8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjZXB0aW9uTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcgPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWUgPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Sb290VHlwZVFuYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVSb290VHlwZVFuYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmcgPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVWYXJpYWJsZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlIDxlbT5XU0RMIE1lc3NhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExNZXNzYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIDxlbT5Db25zdHJ1Y3RvciBQYXJhbWV0ZXIgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWUgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZSA8ZW0+V1NETCBTZXJ2aWNlIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMU2VydmljZU5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nIDxlbT5Qb3J0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGUgPGVtPldTREwgUG9ydCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExQb3J0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZyA8ZW0+V1NETCBCaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyA8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uIDxlbT5XU0RMIE9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMT3BlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZyA8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nIDxlbT5XU0RMIFJldHVybiBWYWx1ZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZyA8ZW0+V1NETCBNZXNzYWdlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMTWVzc2FnZU1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlUGFydE5hbWUgPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VQYXJ0TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZyA8ZW0+SW50ZXJmYWNlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVFOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0pheHJwY21hcEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvdXRpbC9KYXhycGNtYXBTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC91dGlsL0pheHJwY21hcFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDUyZGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC91dGlsL0pheHJwY21hcFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkVsZW1lbnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXhycGNtYXBTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBKYXhycGNtYXBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBKYXhycGNtYXBTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HOiB7Ci0JCQkJSmF2YVdTRExNYXBwaW5nIGphdmFXU0RMTWFwcGluZyA9IChKYXZhV1NETE1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFXU0RMTWFwcGluZyhqYXZhV1NETE1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkc6IHsKLQkJCQlQYWNrYWdlTWFwcGluZyBwYWNrYWdlTWFwcGluZyA9IChQYWNrYWdlTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGFja2FnZU1hcHBpbmcocGFja2FnZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkc6IHsKLQkJCQlKYXZhWE1MVHlwZU1hcHBpbmcgamF2YVhNTFR5cGVNYXBwaW5nID0gKEphdmFYTUxUeXBlTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YVhNTFR5cGVNYXBwaW5nKGphdmFYTUxUeXBlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HOiB7Ci0JCQkJRXhjZXB0aW9uTWFwcGluZyBleGNlcHRpb25NYXBwaW5nID0gKEV4Y2VwdGlvbk1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4Y2VwdGlvbk1hcHBpbmcoZXhjZXB0aW9uTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkc6IHsKLQkJCQlTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyBzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyA9IChTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZUludGVyZmFjZU1hcHBpbmcoc2VydmljZUludGVyZmFjZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUludGVyZmFjZU1hcHBpbmcoc2VydmljZUludGVyZmFjZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HOiB7Ci0JCQkJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nID0gKFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW50ZXJmYWNlTWFwcGluZyhzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUk9PVF9UWVBFX1FOQU1FOiB7Ci0JCQkJUm9vdFR5cGVRbmFtZSByb290VHlwZVFuYW1lID0gKFJvb3RUeXBlUW5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJvb3RUeXBlUW5hbWUocm9vdFR5cGVRbmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUocm9vdFR5cGVRbmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkc6IHsKLQkJCQlWYXJpYWJsZU1hcHBpbmcgdmFyaWFibGVNYXBwaW5nID0gKFZhcmlhYmxlTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFyaWFibGVNYXBwaW5nKHZhcmlhYmxlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRTogewotCQkJCVdTRExNZXNzYWdlIHdzZGxNZXNzYWdlID0gKFdTRExNZXNzYWdlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXU0RMTWVzc2FnZSh3c2RsTWVzc2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbE1lc3NhZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVI6IHsKLQkJCQlDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIgPSAoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FOiB7Ci0JCQkJRWxlbWVudE5hbWUgZWxlbWVudE5hbWUgPSAoRWxlbWVudE5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVsZW1lbnROYW1lKGVsZW1lbnROYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9TRVJWSUNFX05BTUU6IHsKLQkJCQlXU0RMU2VydmljZU5hbWUgd3NkbFNlcnZpY2VOYW1lID0gKFdTRExTZXJ2aWNlTmFtZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETFNlcnZpY2VOYW1lKHdzZGxTZXJ2aWNlTmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbFNlcnZpY2VOYW1lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HOiB7Ci0JCQkJUG9ydE1hcHBpbmcgcG9ydE1hcHBpbmcgPSAoUG9ydE1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBvcnRNYXBwaW5nKHBvcnRNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9QT1JUX1RZUEU6IHsKLQkJCQlXU0RMUG9ydFR5cGUgd3NkbFBvcnRUeXBlID0gKFdTRExQb3J0VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETFBvcnRUeXBlKHdzZGxQb3J0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUU5hbWUod3NkbFBvcnRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9CSU5ESU5HOiB7Ci0JCQkJV1NETEJpbmRpbmcgd3NkbEJpbmRpbmcgPSAoV1NETEJpbmRpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExCaW5kaW5nKHdzZGxCaW5kaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VRTmFtZSh3c2RsQmluZGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkc6IHsKLQkJCQlTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcgPSAoU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyhzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT046IHsKLQkJCQlXU0RMT3BlcmF0aW9uIHdzZGxPcGVyYXRpb24gPSAoV1NETE9wZXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV1NETE9wZXJhdGlvbih3c2RsT3BlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkc6IHsKLQkJCQlNZXRob2RQYXJhbVBhcnRzTWFwcGluZyBtZXRob2RQYXJhbVBhcnRzTWFwcGluZyA9IChNZXRob2RQYXJhbVBhcnRzTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HOiB7Ci0JCQkJV1NETFJldHVyblZhbHVlTWFwcGluZyB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nID0gKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcod3NkbFJldHVyblZhbHVlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HOiB7Ci0JCQkJV1NETE1lc3NhZ2VNYXBwaW5nIHdzZGxNZXNzYWdlTWFwcGluZyA9IChXU0RMTWVzc2FnZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExNZXNzYWdlTWFwcGluZyh3c2RsTWVzc2FnZU1hcHBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FOiB7Ci0JCQkJV1NETE1lc3NhZ2VQYXJ0TmFtZSB3c2RsTWVzc2FnZVBhcnROYW1lID0gKFdTRExNZXNzYWdlUGFydE5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdTRExNZXNzYWdlUGFydE5hbWUod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLklOVEVSRkFDRV9NQVBQSU5HOiB7Ci0JCQkJSW50ZXJmYWNlTWFwcGluZyBpbnRlcmZhY2VNYXBwaW5nID0gKEludGVyZmFjZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUludGVyZmFjZU1hcHBpbmcoaW50ZXJmYWNlTWFwcGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgV1NETCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSmF2YVdTRExNYXBwaW5nKEphdmFXU0RMTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2UgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VQYWNrYWdlTWFwcGluZyhQYWNrYWdlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgWE1MIFR5cGUgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIFhNTCBUeXBlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VKYXZhWE1MVHlwZU1hcHBpbmcoSmF2YVhNTFR5cGVNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjZXB0aW9uIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFeGNlcHRpb25NYXBwaW5nKEV4Y2VwdGlvbk1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIEludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyhTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvb3QgVHlwZSBRbmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb290IFR5cGUgUW5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VSb290VHlwZVFuYW1lKFJvb3RUeXBlUW5hbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYXJpYWJsZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhcmlhYmxlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VWYXJpYWJsZU1hcHBpbmcoVmFyaWFibGVNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBNZXNzYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgTWVzc2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlKFdTRExNZXNzYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RydWN0b3IgUGFyYW1ldGVyIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cnVjdG9yIFBhcmFtZXRlciBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQgTmFtZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFbGVtZW50TmFtZShFbGVtZW50TmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgU2VydmljZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETFNlcnZpY2VOYW1lKFdTRExTZXJ2aWNlTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgTWFwcGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0TWFwcGluZyhQb3J0TWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgUG9ydCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgUG9ydCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETFBvcnRUeXBlKFdTRExQb3J0VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgQmluZGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMIEJpbmRpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMQmluZGluZyhXU0RMQmluZGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgTWV0aG9kIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBFbmRwb2ludCBNZXRob2QgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgT3BlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgT3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETE9wZXJhdGlvbihXU0RMT3BlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhcmFtIFBhcnRzIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQYXJhbVBhcnRzTWFwcGluZyhNZXRob2RQYXJhbVBhcnRzTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgUmV0dXJuIFZhbHVlIE1hcHBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBSZXR1cm4gVmFsdWUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoV1NETFJldHVyblZhbHVlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgTWVzc2FnZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETE1lc3NhZ2VNYXBwaW5nKFdTRExNZXNzYWdlTWFwcGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwgTWVzc2FnZSBQYXJ0IE5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETCBNZXNzYWdlIFBhcnQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlUGFydE5hbWUoV1NETE1lc3NhZ2VQYXJ0TmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyZmFjZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSW50ZXJmYWNlTWFwcGluZyhJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UU5hbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UU5hbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VRTmFtZShRTmFtZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0pheHJwY21hcFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNGQ4ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamNhX3VpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTlhZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWpjYXVpLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWM5ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0uZXRvb2xzLmN0Yy5qYXZhcHJvamVjdG5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNTZlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFdUUCBKQ0EgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjcuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnBsdWdpbi5KQ0FVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWksCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3Iud29ya2JlbmNoCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZWJiZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gamNhX3VpLyxcCi0gICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYjNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjI1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZWM2YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9FeHBvcnRSQVJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9FeHBvcnRSQVJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MTU2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvRXhwb3J0UkFSQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFJBUkFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWwgPSBKQ0FVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKElDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzLkNPTk5FQ1RPUl9FWFBPUlRfQUNUSU9OX0xBQkVMKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJleHBvcnRfcmFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBFeHBvcnRSQVJBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQobGFiZWwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQmFzZUFjdGlvbiNwcmltUnVuKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQkJQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQoKTsKLQkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHBsdWdpbi5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9JQ29ubmVjdG9yQXJjaGl2ZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0lDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzVmYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0lDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotCi0KLS8qKgotICogRGVmaW5lcyBjb25zdGFudHMgZm9yIENvbm5lY3RvciBBcmNoaXZlIG9wZXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RvckFyY2hpdmVDb25zdGFudHMgewotCi0JLy9BY3Rpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0VYUE9SVF9BQ1RJT05fTEFCRUwgPSAiJWNvbm5lY3Rvci5leHBvcnQuYWN0aW9uLmxhYmVsX3VpXyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vR2VuZXJhbAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9QUk9KRUNUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbm5lY3Rvcl9Qcm9qZWN0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0ZJTEVfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29ubmVjdG9yX0ZpbGVfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9DT05ORUNUT1JfRklMRV9OQU1FU19JRCA9ICJFSkJJbXBvcnRXaXphcmRQYWdlMS5TVE9SRV9DT05ORUNUT1JfRklMRV9OQU1FU19JRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9DT05ORUNUT1JfRVhQT1JUX0ZJTEVfTkFNRVMgPSAiQ29uZW5jdG9yRXhwb3J0V2l6YXJkUGFnZTEuU1RPUkVfQ09OTkVDVE9SX0VYUE9SVF9GSUxFX05BTUVTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWl9JTUFHRSA9ICJjb25uZWN0b3JfaW1wb3J0X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVJfQlJPV1NFX0JVVFRPTl9GSUxURVIgPSAiKi5yYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0VYVEVOU0lPTiA9ICJyYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlllc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk5vX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFU1RJT05fVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUXVlc3Rpb25fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9fVUlfID0gIlJlc291cmNlX3swfV9hbHJlYWR5X2V4aXN0cy5fX1dvdWxkX3lvdV9saWtlX3RvX292ZXJ3cml0ZV9pdF9VSV8iOyAvLyROT04tTkxTLTEkCi0JLy9JbXBvcnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0FfQ09OTkVDVE9SX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9hX0Nvbm5lY3Rvcl9wcm9qZWN0X2Zyb21fdGhlX2ZpbGVfc3lzdGVtX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0lOVE9fTkVXX09SX0VYSVNUSU5HX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9pbnRvX25ld19vcl9leGlzdGluZ19FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3RfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfSU1QT1JUX0lEXyA9ICJDb25uZWN0b3JQcm9qZWN0SW1wb3J0UGFnZTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0lNUE9SVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25uZWN0b3JfSW1wb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVJBUjEwMDAgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5pcmFyMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vRXhwb3J0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0VYUE9SVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25uZWN0b3JfRXhwb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX0NPTk5FQ1RPUl9fVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXhwb3J0X0Nvbm5lY3Rvcl9Qcm9qZWN0X3RvX3RoZV9sb2NhbF9maWxlX3N5c3RlbV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktCRU5DSF9JRCA9ICJDb25uZWN0b3JFeHBvcnRQYWdlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXhwb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhfV0laX0lNQUdFID0gImNvbm5lY3Rvcl9leHBvcnRfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSQVIxMDAwID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuZXJhcjEwMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvL0Vycm9ycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQUJMRV9UT19DT01QTEVURV9USEVfT1BFTl9FUlJPUl8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVbmFibGVfdG9fY29tcGxldGVfdGhlX29wZXJhdGlvbmR1bXBfY2F1c2VkX2J5X3RoaXNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfUFJPQkxFTVNfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X1Byb2JsZW1zX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0lNUE9SVF9fVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29ubmVjdG9yX0ltcG9ydF9FcnJvcl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FUlJPUl9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbXBvcnRfRXJyb3JfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVfSkFSX0ZJTEVfRE9FU19OT1RfRVhJU1RfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2phcl9maWxlX2RvZXNfbm90X2V4aXN0X29yX2Nhbm5vdF9iZV9vcGVuZWQsX1VJXyIpICsgLy8kTk9OLU5MUy0xJAotCQkJCVJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWNrX2Jyb3dzZV90b19zZWxlY3RfYV92YWxpZF9qYXJfb3JfZW50ZXJfYV92YWxpZF9qYXJfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfRVhQT1JUX0VSUk9SX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbm5lY3Rvcl9FeHBvcnRfRXJyb3JfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5OT1RfRVhQT1JUX0NMT1NFRF9QUk9KRUNUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNhbm5vdF9leHBvcnRfY2xvc2VkX3Byb2plY3RzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUmFyX0ZpbGVfTmFtZV9OZWVkZWRfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmFyX0ZpbGVfTmFtZV9OZWVkZWRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQotfS8vIElDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvSW1wb3J0UkFSQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvSW1wb3J0UkFSQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZDMzYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydFJBUkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5CYXNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJBUkFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X1JBUiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiaW1wb3J0X3Jhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSW1wb3J0UkFSQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkJhc2VBY3Rpb24jcHJpbVJ1bihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0KLQkJQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQoKTsKLQotCQlKMkVFVUlQbHVnaW4gcGx1Z2luID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQl3aXphcmQuaW5pdChwbHVnaW4uZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhN2I2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbC5KQ0FVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi0KLS8qKgotICogQ3JlYXRlcyBhbiBhY3Rpb24gZm9yIHRoZSBDb25uZWN0b3IgcHJvamVjdAotICovCi1wdWJsaWMgY2xhc3MgTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uIHsKLQotCS8vIFRPRE8gTURFIDAyLTI4IEZpbmQgY29ycmVjdCBsYWJlbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSkNBVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfV0laX1RJVExFKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gIm5ld2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5ld0Nvbm5lY3RvckNvbXBvbmVudEFjdGlvbigpIHsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfS8vIE5ld0Nvbm5lY3RvclByb2plY3RBY3Rpb24KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBJV29ya2JlbmNoCi0JICogICAgICAgICAgICB3b3JrYmVuY2ggLSBXb3JrYmVuY2ggdG8gYWRkIHRvIHRoaXMgd2l6YXJkIHRvby4KLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBsYWJlbCAtIExhYmVsIGZvciBwcm9qZWN0LgotCSAqIEBwYXJhbSBDbGFzc1tdCi0JICogICAgICAgICAgICBhY2NlcHRlZFR5cGVzIC0gTGlzdCBvZiBhY2NlcHRlZCB0eXBlcyBmb3IgdGhpcyB3aXphcmQKLQkgKi8KLQlwdWJsaWMgTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWNjZXB0ZWRUeXBlcykgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY2NlcHRlZFR5cGVzLCBmYWxzZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfS8vIE5ld0Nvbm5lY3RvclByb2plY3RBY3Rpb24KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gV2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIFdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQoKTsKLQl9Ly8gY3JlYXRlV2l6YXJkCi0KLQkvKioKLQkgKiBzaG91bGRBY2NlcHRFbGVtZW50IC0gQWx3YXlzIHRydWUKLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmoKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2NlcHRFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7IC8qIE5ld0dyb3VwLmlzT25CdWlsZFBhdGgob2JqKSAmJiAhTmV3R3JvdXAuaXNJbkFyY2hpdmUob2JqKTsgKi8KLQl9Ly8gc2hvdWxkQWNjZXB0RWxlbWVudAotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ly8gTmV3Q29ubmVjdG9yUHJvamVjdEFjdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL1JBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL1JBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE3OTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9SQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJyYXJhcmNoaXZldWkiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIGludCB4KSB7Ci0KLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3BsdWdpbi9KQ0FVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9wbHVnaW4vSkNBVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxMmJjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3BsdWdpbi9KQ0FVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDE1LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSkNBVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vCVRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSkNBVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBKQ0FVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKQ0FVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvdXRpbC9KQ0FVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3V0aWwvSkNBVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdkMDdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvdXRpbC9KQ0FVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIEpDQVVJTWVzc2FnZXMgZXh0ZW5kcyBNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9MT0FEX0VSUk9SID0gIjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX01PRFVMRV9XSVpfVElUTEUgPSAiMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfVkVSU0lPTl9MQkwgPSAiMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfTU9EVUxFX01BSU5fUEdfVElUTEUgPSAiMyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfTU9EVUxFX01BSU5fUEdfREVTQyA9ICI0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9JTVBPUlRfTUFJTl9QR19ERVNDID0gIjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0lNUE9SVF9NQUlOX1BHX1RJVExFID0gIjYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0ZJTEVfTEJMID0gIjciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX01PRFVMRV9MQkwgPSAiOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfRVhQT1JUX01BSU5fUEdfVElUTEUgPSAiOSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfRVhQT1JUX01BSU5fUEdfREVTQyA9ICIxMCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpDQVVJTWVzc2FnZXMgSU5TVEFOQ0UgPSBuZXcgSkNBVUlNZXNzYWdlcygpOwotCi0KLQlwcml2YXRlIEpDQVVJTWVzc2FnZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmRvR2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBJTlNUQU5DRS5kb0dldFJlc291cmNlU3RyaW5nKGtleSwgYXJncyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuTWVzc2FnZXMjaW5pdGlhbGl6ZUJ1bmRsZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJqY2FfdWkiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkNDg1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbC5KQ0FVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKiogCi0gKiA8cD4KLSAqIFdpemFyZCB1c2VkIHRvIGNyZWF0ZSBKMkVFIENvbm5lY3RvciBtb2R1bGUgc3RydWN0dXJlcyBpbiBFY2xpcHNlIFByb2plY3RzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgaW1wbGVtZW50cyBJRXhlY3V0YWJsZUV4dGVuc2lvbiwgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgV2l6YXJkIElEIG9mIHRoZSBDb25uZWN0b3JNb2R1bGVDcmVhdGlvbldpemFyZC4gVXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgYW5kIGFjdGl2aXRpZXMgbWFuYWdlbWVudC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCAKLQkgKiBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCAKLQkgKiBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzCi0JICogYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JLyoqIAotCSAqIHtAaW5oZXJpdERvY30gICAKLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkaWFsb2cgd2luZG93IHRpdGxlIGFuZCBkZWZhdWx0IHBhZ2UgaW1hZ2UuIAotCSAqIDwvcD4gCi0JICogCi0JICogQHNlZSBKMkVFQXJ0aWZhY3RDcmVhdGlvbldpemFyZCNkb0luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0V2luZG93VGl0bGUoSkNBVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkpDQV9QUk9KRUNUX1dJWkFSRF9CQU5ORVIpKTsKLQkJcHJlRmlsbFNlbGVjdGVkRUFSUHJvamVjdCgpOwotCX0KLQkKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogQWRkcyBhIHtAbGluayBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2V9IGFzIHRoZSB7QGxpbmsgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkI01BSU5fUEd9LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpKTsKLQkJc3VwZXIuZG9BZGRQYWdlcygpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzOWU3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbC5KQ0FVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEpDQVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSkNBVUlNZXNzYWdlcy5KQ0FfTU9EVUxFX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSkNBVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfTUFJTl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5KQ0FfUFJPSkVDVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uTGFiZWwoKSB7Ci0JCXJldHVybiBKQ0FVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEpDQVVJTWVzc2FnZXMuSkNBX1ZFUlNJT05fTEJMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIElKMkVFVUlDb250ZXh0SWRzLk5FV19DT05ORUNUT1JfV0laQVJEX1AxOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb0FkdmFuY2VkQ29tcG9zaXRlKENvbXBvc2l0ZSBhZHZhbmNlZCkgewotCQlzdXBlci5hZGRUb0FkdmFuY2VkQ29tcG9zaXRlKGFkdmFuY2VkKTsKLQkJc3VwZXIuY3JlYXRlU291cmNlRm9sZGVyQ29tcG9zaXRlKGFkdmFuY2VkKTsKLQl9CQotLy8JcHJvdGVjdGVkIHZvaWQgYWRkVG9BZHZhbmNlZENvbXBvc2l0ZShDb21wb3NpdGUgYWR2YW5jZWQpIHsKLS8vLy8JCXN1cGVyLmFkZFRvQWR2YW5jZWRDb21wb3NpdGUoYWR2YW5jZWQpOwotLy8vLwkJY3JlYXRlQW5ub3RhdGlvbnNHcm91cChhZHZhbmNlZCk7Ci0vLwkJc3VwZXIuY3JlYXRlTXVsdGlwbGVNb2R1bGVzQ29tcG9zaXRlKGFkdmFuY2VkKTsKLS8vCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhN2E1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBleHBvcnQgSjJFRSBDb25uZWN0b3IgbW9kdWxlIHN0cnVjdHVyZXMgCi0gKiBmcm9tIHRoZSBFY2xpcHNlIFdvcmtiZW5jaCB0byBhIGRlcGxveWFibGUgQ29ubmVjdG9yIAotICogQXJjaGl2ZSAqLnJhciBmaWxlLiAgCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCAKLQkgKiBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCAKLQkgKiBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scwotCSAqIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0gICAgfQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogCTxsaT4ge0BsaW5rIFJBUkV4cG9ydFBhZ2V9IGFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KSAKLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBSQVJFeHBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHLCBnZXRTZWxlY3Rpb24oKSkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30gICAKLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLiAKLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5KQ0FfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2NDFhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVNb2R1bGVJbXBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlSW1wb3J0UGFnZSB7Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSkNBVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKQ0FVSU1lc3NhZ2VzLkpDQV9JTVBPUlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKQ0FVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEpDQVVJTWVzc2FnZXMuSkNBX0lNUE9SVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkpDQV9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gSkNBVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKQ0FVSU1lc3NhZ2VzLkpDQV9GSUxFX0xCTCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117IioucmFyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7Ci0JCXJldHVybiAiUkFSIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKQ0FVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9MQkwpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9SQVJfV0laQVJEX1BBR0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDU1NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBpbXBvcnQgSjJFRSBDb25uZWN0b3IgbW9kdWxlIHN0cnVjdHVyZXMgaW50byB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggZnJvbSBhbgotICogZXhpc3RpbmcgQ29ubmVjdG9yICoucmFyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIGFuIHtAbGluayBSQVJJbXBvcnRQYWdlfSBhcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IENvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZG9Jbml0KCkgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTVBPUlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkpDQV9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCQkvLyB1cGRhdGVFQVJUb01vZGVsRnJvbVNlbGVjdGlvbihnZXRTcGVjaWZpY0RhdGFNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnZhbGlkYXRpb24uVUlDb25uZWN0b3JWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvUkFSRXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvUkFSRXhwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQzYTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL1JBUkV4cG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUV4cG9ydFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbC5KQ0FVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUkFSRXhwb3J0UGFnZSBleHRlbmRzIEoyRUVNb2R1bGVFeHBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgUkFSRXhwb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXNldFRpdGxlKEpDQVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSkNBVUlNZXNzYWdlcy5KQ0FfRVhQT1JUX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSkNBVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKQ0FVSU1lc3NhZ2VzLkpDQV9FWFBPUlRfTUFJTl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5KQ0FfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpDQV9QUk9KX0xCTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsdGVyRXhwcmVzc2lvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117IioucmFyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFRXhwb3J0UGFnZSNpc01ldGFUeXBlU3VwcG9ydGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNZXRhVHlwZVN1cHBvcnRlZChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIENvbm5lY3RvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRJbmZvcG9wSUQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5mb3BvcElEKCkgewotCQlyZXR1cm4gSUoyRUVVSUNvbnRleHRJZHMuRVhQT1JUX1JBUl9XSVpBUkRfUEFHRTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBuZW50SUQoKSB7Ci0gICAgICAgIHJldHVybiAiSlNUX0NPTk5FQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjZWQ3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotamNhLm1vZHVsZV91aV89Q29ubmVjdG9yIE1vZHVsZQotbmV3LmpjYS5tb2R1bGUuZGVzY3JpcHRpb25fdWlfPUNyZWF0ZSBhIENvbm5lY3RvciBtb2R1bGUKLWNvbm5lY3Rvci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfPUltcG9ydCBhbiBleHRlcm5hbCBDb25uZWN0b3IgUkFSIGZpbGUgaW50byBhIENvbm5lY3RvciBwcm9qZWN0Ci1jb25uZWN0b3IuZXhwb3J0LmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgYSBDb25uZWN0b3IgcHJvamVjdCBpbnRvIGEgQ29ubmVjdG9yIFJBUiBmaWxlCi1jb25uZWN0b3IuamFyLmZpbGVfdWlfPVJBUiBmaWxlCi1jb25uZWN0b3IubW9kdWxlX3VpXz1Db25uZWN0b3IgTW9kdWxlCi1uZXcuY29ubmVjdG9yLm1vZHVsZS5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgQ29ubmVjdG9yIHByb2plY3QKLWNvbm5lY3Rvci5pbXBvcnQuYWN0aW9uLmxhYmVsX3VpXz1JbXBvcnQgUkFSIEZpbGUuLi4KLWNvbm5lY3Rvci5leHBvcnQuYWN0aW9uLmxhYmVsX3VpXz1FeHBvcnQgUkFSIEZpbGUuLi4KLWNvbm5lY3Rvcl9tb2R1bGVfdWlfPUNvbm5lY3RvciBQcm9qZWN0Ci1uZXcuY29ubmVjdG9yLm1vZHVsZS5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgSjJFRSBjb25uZWN0b3IgcHJvamVjdAotY29ubmVjdG9ycy5hY3Rpb25TZXQ9SjJDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmE5MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gUHVycG9zZTogRXh0ZW5zaW9uIGZvciB0aGUgSjJFRSBBQ3Rpb24gU2V0cyAgICAgICAgICAgIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlY29ubmVjdG9ycy5hY3Rpb25TZXQiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWNvbm5lY3RvcnMuYWN0aW9uU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJlZU1haW5BY3Rpb25TZXQ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlbmV3LmpjYS5tb2R1bGUuZGVzY3JpcHRpb25fdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVuZXcuamNhLm1vZHVsZS5kZXNjcmlwdGlvbl91aV8iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnMuTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9IkoyRUVNYWluNCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdDb25uZWN0b3JDb21wb25lbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLQk8L2V4dGVuc2lvbj4KLSAgIDwhLS0gQ29ubmVjdG9yIE1vZHVsZSBXaXphcmQgLS0+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkoyRUVVSVByb2plY3RXaXphcmRzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlamNhLm1vZHVsZV91aV8iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlY29ubmVjdG9yX21vZHVsZV91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlbmV3LmNvbm5lY3Rvci5tb2R1bGUuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgIDwvZXh0ZW5zaW9uPgotPCEtLSBKQ0EgSW1wb3J0IFdpemFyZCAtLT4gCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlY29ubmVjdG9yLmphci5maWxlX3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjb25uZWN0b3IuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICAgPC93aXphcmQ+Ci0gICAgIDwvZXh0ZW5zaW9uPgotCi08IS0tIEpDQSBFeHBvcnQgV2l6YXJkIC0tPiAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVjb25uZWN0b3IuamFyLmZpbGVfdWlfIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNvbm5lY3Rvci5leHBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgICA8L3dpemFyZD4KLSAgICAgPC9leHRlbnNpb24+Ci0KLTwhLS0gTmF2aWdhdG9yIE9iamVjdCBDb250cmlidXRpb25zIC0tPiAKLTwhLS0gQ29ubmVjdG9yIEdyb3VwIENvbnRyaWJ1dGlvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5yYXJOZXdQcm9qZWN0QWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWpjYS5tb2R1bGVfdWlfIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci5uZXcubWVudS9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5hY3Rpb25zLk5ld0Nvbm5lY3RvckNvbXBvbmVudEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDx2aXNpYmlsaXR5PgotICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JOYXR1cmUiPgotICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5yYXJQcm9qZWN0QWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWNvbm5lY3Rvci5qYXIuZmlsZV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnMuSW1wb3J0UkFSQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3IuaW1wb3J0Lm1lbnUvYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9ucy5JbXBvcnRSQVJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWNvbm5lY3Rvci5qYXIuZmlsZV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnMuRXhwb3J0UkFSQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3IuZXhwb3J0Lm1lbnUvYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9ucy5FeHBvcnRSQVJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yTmF0dXJlIj4KLSAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLndvcmtiZW5jaC5jb21tb25XaXphcmQiPgotICAgICAgPCEtLSBDb25uZWN0b3IgTmV3IC0tPgotICAgICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLkNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uV2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiPgotCSAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgIDxvcj4KLQkgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0JICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLQkgICAgICAgICAgICAgICA8L29yPiAKLSAgICAgICAgICAgICAgICA8L2FuZD4gCi0gICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgICAgIDwhLS0gQ29ubmVjdG9yIGltcG9ydCAtLT4KLSAgICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuQ29ubmVjdG9yTW9kdWxlSW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ij4KLQkgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgCSAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIj4KLSAgICAgICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgCSAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgICA8b3I+Ci0JICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLQkgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIj4KLQkgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotCSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0JICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JOYXR1cmUiPgotCSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0JICAgICAgICAgICAgICAgPC9vcj4gCi0gICAgICAgICAgICAgICAgPC9hbmQ+IAotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCI+Ci0JICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAKLSAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvY29tbW9uV2l6YXJkPgotICAgICAgICAgPCEtLSBDb25uZWN0b3IgRXhwb3J0IC0tPgotICAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0iZXhwb3J0IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5Db25uZWN0b3JNb2R1bGVFeHBvcnRXaXphcmQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5ncm91cHMuTmF2aWdhdG9yR3JvdXAiPgotICAgICAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJzTmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICA8L2FuZD4gICAgIAotICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckltcGwiPgotCSAgICAgICAgIDwvb2JqZWN0Q2xhc3M+ICAgICAKLQkgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbCI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPiAgCi0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvY29tbW9uV2l6YXJkPgotICAgICAgICA8IS0tIEltcG9ydCBDbGFzc2VzIFdpemFyZCAtLT4KLSAgICAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5DbGFzc2VzSW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JJbXBsIj4KLQkgICAgICAgICA8L29iamVjdENsYXNzPiAgICAKLQkgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIDwvb3I+IAotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvY29tbW9uV2l6YXJkPgotICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ5Y2JmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotMD1GYWlsZWQgdG8gZmluZCB0aGUgaW1hZ2UgInswfSIuCi0xPU5ldyBDb25uZWN0b3IgUHJvamVjdAotMj1KQ0EgdmVyc2lvbjoKLTM9Q29ubmVjdG9yIFByb2plY3QKLTQ9Q3JlYXRlIGEgc3RhbmRhbG9uZSBDb25uZWN0b3IgbW9kdWxlIG9yIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuCi01PUltcG9ydCBhIENvbm5lY3RvciBtb2R1bGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KLTY9Q29ubmVjdG9yIEltcG9ydAotNz1Db25uZWN0b3IgZmlsZToKLTg9Q29ubmVjdG9yIG1vZHVsZToKLTk9Q29ubmVjdG9yIEV4cG9ydAotMTA9RXhwb3J0IENvbm5lY3RvciBtb2R1bGUgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotY29ubmVjdG9yLmV4cG9ydC5hY3Rpb24ubGFiZWxfdWlfPUV4cG9ydCBSQVIgRmlsZS4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODAwYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpjYS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJyYXJwcm9qZWN0LyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpjYWVkaXQvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamNhLXZhbGlkYXRpb24vIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MmFjN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1AZG90CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTg1YWFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUuamNhPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjQ2MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBKQ0EgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjcuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5hcmNoaXZlLm9wZXJhdGlvbnMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuZGVwbG95YWJsZXMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLm1vZHVsZS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcywKLSBvcmcuZWNsaXBzZS5qZW0udXRpbAotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmZGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IGpjYS8sXAotICAgICAgICAgICAgICAgICAgICAgICAgIHJhcnByb2plY3QvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBqY2FlZGl0LyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgamNhLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLW91dHB1dC4uID0gYmluLwotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3MGVkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNPTlRBQ1Q9ZGFuYmVyZ0B1cy5pYm0uY29tCi1Db21wb25lbnRTaG9ydE5hbWU9ZWpiCi1Db21wb25lbnRGdWxsTmFtZT1FSkIKLUNvbXBvbmVudENvbXBldGVuY3k9RU1GCi1KYXZhQ29tcGlsZS4xPXNyY2phcgotQnVpbGRWZXJpZmljYXRpb24uMT1kaXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NGQyZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoIiBkZWZhdWx0PSJwYWNrYWdpbmdQbHVnaW4iIGJhc2VkaXI9Ii4vLi4iPgotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlRGlyIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGlyZWN0b3J5IiAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5pZCIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLmVqYiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLnZlcnNpb24iICB2YWx1ZT0iIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdpbmdQbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3BsdWdpbi5pZH0iLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGFja2FnZURpcn0vcGx1Z2lucy8ke3BsdWdpbi5pZH1fJHtwbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5kaXJlY3Rvcnl9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9lamIuamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL3dzQnVpbGQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvd3NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzBiODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvd3NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLQk8IUVOVElUWSBiYXNlQnVpbGQgU1lTVEVNICJmaWxlOi4uLy4uL3dzQnVpbGREZWYueG1sIj4KLV0+Ci0KLTxwcm9qZWN0IG5hbWU9ImJ1aWxkUGx1Z2luIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi8uLiI+Ci0KLTwhLS0gaW5jbHVkZSB0aGUgY29tbW9uIHhtbCBidWlsZCBmaWxlIC0tPgotJmJhc2VCdWlsZDsKLQotPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0icHJlcGFyZSIgaWY9InBsdWdpbi5pZCI+Ci0JPGFudGNhbGwgdGFyZ2V0PSJidWlsZGphciI+Ci0JCTxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0iJHtkZWZhdWx0amFybmFtZX0iLz4KLQkJPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH0iLz4KLQk8L2FudGNhbGw+Ci08L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmI4YmQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYSI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpIj48L3BhY2thZ2U+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2YXRpb25TcGVjX3JlcXVpcmVkQ29uZmlnUHJvcGVydGllc19SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZhdGlvblNwZWNfcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmMTQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZhdGlvblNwZWNfcmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBZG1pbk9iamVjdF9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBZG1pbk9iamVjdF9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4N2I2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWRtaW5PYmplY3RfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJiMWVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjdmNGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2N2UwNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmRmZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdlZmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbl9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0b3JfbGljZW5zZV9MaWNlbnNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0b3JfbGljZW5zZV9MaWNlbnNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmZjQ4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX2xpY2Vuc2VfTGljZW5zZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX3Jlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rvcl9yZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiYmM1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX3Jlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzM4ZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMzNkNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1MWNhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczMGJiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlODhiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcl9tZXNzYWdlQWRhcHRlcl9NZXNzYWdlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcl9tZXNzYWdlQWRhcHRlcl9NZXNzYWdlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDFlMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJfbWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMaWNlbnNlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2VlZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMaWNlbnNlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDE4ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUxpY2Vuc2VfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUFkYXB0ZXJfbWVzc2FnZUxpc3RlbmVyc19NZXNzYWdlTGlzdGVuZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1lc3NhZ2VBZGFwdGVyX21lc3NhZ2VMaXN0ZW5lcnNfTWVzc2FnZUxpc3RlbmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1MDUwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUFkYXB0ZXJfbWVzc2FnZUxpc3RlbmVyc19NZXNzYWdlTGlzdGVuZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1lc3NhZ2VMaXN0ZW5lcl9hY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUxpc3RlbmVyX2FjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmMzA0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWVzc2FnZUxpc3RlbmVyX2FjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtc19BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGNhYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtc19BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkRlZmluaXRpb25zX0Nvbm5lY3Rpb25EZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRGVmaW5pdGlvbnNfQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Q2MTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRGVmaW5pdGlvbnNfQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3ZWVlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkMTg4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2FkbWluT2JqZWN0c19BZG1pbk9iamVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2FkbWluT2JqZWN0c19BZG1pbk9iamVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTkyYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hZG1pbk9iamVjdHNfQWRtaW5PYmplY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGU0Njc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfYXV0aGVudGljYXRpb25NZWNoYW5pc21zX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmExNDliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2luYm91bmRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2luYm91bmRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTdkZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9pbmJvdW5kUmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9vdXRib3VuZFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX291dGJvdW5kUmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0YTEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX291dGJvdW5kUmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfc2VjdXJpdHlQZXJtaXNzaW9uc19TZWN1cml0eVBlcm1pc3Npb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9zZWN1cml0eVBlcm1pc3Npb25zX1NlY3VyaXR5UGVybWlzc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTRhZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9zZWN1cml0eVBlcm1pc3Npb25zX1NlY3VyaXR5UGVybWlzc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjViZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjhmNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZhdGlvblNwZWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BY3RpdmF0aW9uU3BlYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BY3RpdmF0aW9uU3BlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0FkbWluT2JqZWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWRtaW5PYmplY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzY0M2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWRtaW5PYmplY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlnUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25maWdQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTNjZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25maWdQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0Nvbm5lY3Rpb25EZWZpbml0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTIyNDYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDg3NDc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhmYjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0xpY2Vuc2UuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9MaWNlbnNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNGZlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0xpY2Vuc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9NZXNzYWdlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTWVzc2FnZUxpc3RlbmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTWVzc2FnZUxpc3RlbmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyMjQ2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VMaXN0ZW5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI4MmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNGZlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyNGYzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5UGVybWlzc2lvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1NlY3VyaXR5UGVybWlzc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9TZWN1cml0eVBlcm1pc3Npb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9jb25uZWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L2Nvbm5lY3Rpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZmU2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L2Nvbm5lY3Rpb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS92YWxpZGF0aW9uL0Nvbm5lY3RvckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vQ29ubmVjdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MWI0MTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vQ29ubmVjdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0KLSAqIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5jb21wb25lbnRjb3JlLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFVmFsaWRhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9ySGVscGVyIGV4dGVuZHMgSjJFRVZhbGlkYXRpb25IZWxwZXIgewotCXByb3RlY3RlZCBSQVJGaWxlIHJhckZpbGU7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbm5lY3RvckhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQkJcmVnaXN0ZXJNb2RlbChDb25uZWN0b3JNZXNzYWdlQ29uc3RhbnRzLkNPTk5FQ1RPUl9NT0RFTF9OQU1FLCAibG9hZFJhckZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgUmFyIGZpbGUgZm9yIHZhbGlkYXRpb24KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBsb2FkUmFyRmlsZSgpIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJCi0JCXRyeSB7Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSAoKENvbm5lY3RvckFydGlmYWN0RWRpdCkgZWRpdCkuYXNBcmNoaXZlKGZhbHNlKTsKLQkJCXJldHVybiBhcmNoaXZlOwotCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlMSk7Ci0JCX1maW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQkKLQkvKioKLQkgKiBHaXZlbiBhIHJlc291cmNlLCByZXR1cm4gaXRzIG5vbi1lY2xpcHNlLXNwZWNpZmljIGxvY2F0aW9uLiBJZiB0aGlzIHJlc291cmNlLCBvciB0eXBlIG9mCi0JICogcmVzb3VyY2UsIGlzbid0IGhhbmRsZWQgYnkgdGhpcyBoZWxwZXIsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuICJyYXIueG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2EtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvdmFsaWRhdGlvbi9VSUNvbm5lY3RvclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3ZhbGlkYXRpb24vVUlDb25uZWN0b3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0OTNiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2EtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvdmFsaWRhdGlvbi9VSUNvbm5lY3RvclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNvbm5lY3RvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFVJQ29ubmVjdG9yVmFsaWRhdG9yIGV4dGVuZHMgQ29ubmVjdG9yVmFsaWRhdG9yIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFVJQ29ubmVjdG9yVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhlIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgdGhyb3dzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlDb25uZWN0b3JIZWxwZXIgaGVscGVyID0gKENvbm5lY3RvckhlbHBlcikgaW5IZWxwZXI7Ci0JCQotCQlJUHJvamVjdCBwcm9qID0gKChJV29ya2JlbmNoQ29udGV4dCkgaW5IZWxwZXIpLmdldFByb2plY3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgd2JNb2R1bGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qKTsKLQkJCi0gICAgICAgICAgICBpZih3Yk1vZHVsZS5nZXRDb21wb25lbnRUeXBlSWQoKSAhPSBudWxsICYmIHdiTW9kdWxlLmdldENvbXBvbmVudFR5cGVJZCgpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFKSkgewotCQkJSVZpcnR1YWxGaWxlIHJhckREID0gd2JNb2R1bGUuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKTsKLQkJCWlmKCByYXJERC5leGlzdHMoKSkgewkJCQotCQkJCXN1cGVyLnZhbGlkYXRlKGluSGVscGVyLCBpblJlcG9ydGVyKTsKLQkJCX0KLQkJCS8vdmFsaWRhdGVKMkVFMTREb2NUeXBlKGhlbHBlciwgZWRpdE1vZGVsKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBuYXR1cmUgaXMgY29uc2lzdGVudCB3aXRoIGRvYyB0eXBlLgotCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKMkVFMTREb2NUeXBlKENvbm5lY3RvckhlbHBlciBoZWxwZXIsIENvbm5lY3RvckVkaXRNb2RlbCBlZGl0TW9kZWwpIHsKLS8vCi0vLwkJaWYgKGVkaXRNb2RlbC5nZXRDb25uZWN0b3JOYXR1cmUoKS5nZXRKMkVFVmVyc2lvbigpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEICYmIGdldENvbm5lY3RvckREKCkuZ2V0VmVyc2lvbklEKCkgPCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEKSB7Ci0vLwkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbM107Ci0vLwkJCXBhcmFtc1swXSA9IERPQ1RZUEVfMV80OwotLy8JCQlwYXJhbXNbMV0gPSBoZWxwZXIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLS8vCQkJcGFyYW1zWzJdID0gRE9DVFlQRV8xXzM7Ci0vLwkJCWFkZEVycm9yKGdldEJhc2VOYW1lKCksIENPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXywgcGFyYW1zKTsKLS8vCQl9IGVsc2UgaWYgKGVkaXRNb2RlbC5nZXRDb25uZWN0b3JOYXR1cmUoKS5nZXRKMkVFVmVyc2lvbigpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGdldENvbm5lY3RvckREKCkuZ2V0VmVyc2lvbklEKCkgIT0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRCkgewotLy8JCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotLy8JCQlwYXJhbXNbMF0gPSBET0NUWVBFXzFfMzsKLS8vCQkJcGFyYW1zWzFdID0gaGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0vLwkJCXBhcmFtc1syXSA9IERPQ1RZUEVfMV80OwotLy8JCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7Ci0vLwkJfS8vIGlmCi0vLwl9Ly8gdmFsaWRhdGVEb2NUeXBlVnNOYXR1cmUKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9Db25uZWN0b3IxXzNEZXBsb3lhYmxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9Db25uZWN0b3IxXzNEZXBsb3lhYmxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njg1YzU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvZGVwbG95YWJsZXMvQ29ubmVjdG9yMV8zRGVwbG95YWJsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmRlcGxveWFibGVzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KMkVFRGVwbG95YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yMV8zRGVwbG95YWJsZUZhY3RvcnkgZXh0ZW5kcyBKMkVFRGVwbG95YWJsZUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2ZXIuY29ubmVjdG9yMTMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29ubmVjdG9yMV8zRGVwbG95YWJsZUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yMV8zRGVwbG95YWJsZUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERlcGxveWFibGVQcm9qZWN0RmFjdG9yeURlbGVnYXRlI2dldEZhY3RvcnlJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldE1vZHVsZXMoKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpIHsKLSAgICAgICAgY2FjaGVNb2R1bGVzKGZhbHNlKTsKLSAgICAgICAgQXJyYXlMaXN0IG1vZHVsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByb2plY3RzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSU1vZHVsZVtdIGVsZW1lbnQgPSAoSU1vZHVsZVtdKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudC5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIG1vZHVsZUxpc3QuYWRkKGVsZW1lbnRbal0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIElNb2R1bGVbXSBtb2R1bGVzID0gbmV3IElNb2R1bGVbbW9kdWxlTGlzdC5zaXplKCldOwotICAgICAgICBtb2R1bGVMaXN0LnRvQXJyYXkobW9kdWxlcyk7Ci0gICAgICAgIHJldHVybiBtb2R1bGVzOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkTW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKSB7Ci0JICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgICAgICAgIGlmKElNb2R1bGVDb25zdGFudHMuSlNUX0NPTk5FQ1RPUl9NT0RVTEUuZXF1YWxzKGNvbXAuZ2V0Q29tcG9uZW50VHlwZUlkKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KMkVFRGVwbG95YWJsZUZhY3RvcnkjY3JlYXRlTW9kdWxlRGVsZWdhdGVzKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlTW9kdWxlRGVsZWdhdGVzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBDb25uZWN0b3JGbGV4aWJsZURlcGxveWFibGUgbW9kdWxlRGVsZWdhdGUgPSBudWxsOwotICAgICAgICBJTW9kdWxlIG1vZHVsZSA9IG51bGw7Ci0gICAgICAgIExpc3QgbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmKElNb2R1bGVDb25zdGFudHMuSlNUX0NPTk5FQ1RPUl9NT0RVTEUuZXF1YWxzKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpIHsKLSAgICAgICAgICAgICAgICBtb2R1bGVEZWxlZ2F0ZSA9IG5ldyBDb25uZWN0b3JGbGV4aWJsZURlcGxveWFibGUoY29tcG9uZW50LmdldFByb2plY3QoKSwgSUQsIGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgbW9kdWxlID0gY3JlYXRlTW9kdWxlKGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXROYW1lKCksIG1vZHVsZURlbGVnYXRlLmdldFR5cGUoKSwgbW9kdWxlRGVsZWdhdGUuZ2V0VmVyc2lvbigpLCBtb2R1bGVEZWxlZ2F0ZS5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgIG1vZHVsZUxpc3QuYWRkKG1vZHVsZSk7Ci0gICAgICAgICAgICAgICAgbW9kdWxlRGVsZWdhdGUuaW5pdGlhbGl6ZShtb2R1bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldE1vZHVsZURlbGVnYXRlKG1vZHVsZSkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRGVsZWdhdGVzLmFkZChtb2R1bGVEZWxlZ2F0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZHVsZUxpc3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9Db25uZWN0b3JGbGV4aWJsZURlcGxveWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvZGVwbG95YWJsZXMvQ29ubmVjdG9yRmxleGlibGVEZXBsb3lhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDgzZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9Db25uZWN0b3JGbGV4aWJsZURlcGxveWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSjJFRUZsZXhQcm9qRGVwbG95YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENvbm5lY3RvckZsZXhpYmxlRGVwbG95YWJsZSBleHRlbmRzIEoyRUVGbGV4UHJvakRlcGxveWFibGUgaW1wbGVtZW50cyBJQ29ubmVjdG9yTW9kdWxlIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTk5FQ1RPUl9UWVBFID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRTsKLQotCXB1YmxpYyBDb25uZWN0b3JGbGV4aWJsZURlcGxveWFibGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGFGYWN0b3J5SWQsIElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJc3VwZXIocHJvamVjdCwgYUZhY3RvcnlJZCwgYUNvbXBvbmVudCk7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEoyRUVTcGVjaWZpY2F0aW9uVmVyc2lvbigpIHsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0Q29ubmVjdG9yVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChjb21wb25lbnQuZ2V0VmVyc2lvbigpKSk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggYXMgYSBsaXN0IG9mIGFic29sdXRlIElQYXRocy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gamF2YS51dGlsLkxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGhbXSBnZXRDbGFzc3BhdGgoKSB7Ci0JCUxpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElKYXZhUHJvamVjdCBwcm9qID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICBVUkxbXSB1cmxzID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRDbGFzc3BhdGhBc1VSTEFycmF5KHByb2opOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCVVSTCB1cmwgPSB1cmxzW2ldOwotCQkJcGF0aHMuYWRkKFBhdGguZnJvbU9TU3RyaW5nKHVybC5nZXRQYXRoKCkpKTsKLQkJfQotICAgICAgICByZXR1cm4gIChJUGF0aFtdKSBwYXRocy50b0FycmF5KG5ldyBJUGF0aFtwYXRocy5zaXplKCldKTsKLQotICAgIH0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gImoyZWUuY29ubmVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEoyQ1NwZWNpZmljYXRpb25WZXJzaW9uKCkgewotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gY29tcG9uZW50LmdldFZlcnNpb24oKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KQ0FSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pDQVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDY3NDlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pDQVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMjQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKQ0FSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJyYXIiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG5sc0NvbmNhdGVuYXRpb25GaW5kZXIoKSB7Ci0JCS8vIHVzZWQgdG8gdGFnIG1ldGhvZHMgd2hpY2ggaGF2ZSBjb25jYXRlbmF0ZWQgc3RyaW5ncwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pjYU1vZHVsZUV4dGVuc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pjYU1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyNzVhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjksIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZUV4dGVuc2lvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkpjYU1vZHVsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIEpjYU1vZHVsZUV4dGVuc2lvbkltcGwgZXh0ZW5kcyBFYXJNb2R1bGVFeHRlbnNpb25JbXBsIGltcGxlbWVudHMgSmNhTW9kdWxlRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSmNhTW9kdWxlRXh0ZW5zaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkpjYU1vZHVsZUV4dGVuc2lvbiNjcmVhdGVQcm9qZWN0SW5mbygpCi0JICovCi0JLy8JcHVibGljIEoyRUVKYXZhUHJvamVjdEluZm8gY3JlYXRlUHJvamVjdEluZm8oKSB7Ci0JLy8JCXJldHVybiBuZXcgQ29ubmVjdG9yUHJvamVjdEluZm8oKTsKLQkvLwl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uSmNhTW9kdWxlRXh0ZW5zaW9uI2NyZWF0ZUltcG9ydE9wZXJhdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLlJBUkZpbGUpCi0JICovCi0JLy8JcHVibGljIEoyRUVJbXBvcnRPcGVyYXRpb24gY3JlYXRlSW1wb3J0T3BlcmF0aW9uKElQcm9qZWN0IHByb2osIFJBUkZpbGUgcmFyRmlsZSl7Ci0JLy8JCXJldHVybiBuZXcgUkFSSW1wb3J0T3BlcmF0aW9uKHByb2osIHJhckZpbGUpOwotCS8vCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb24jZ2V0Q29tcFR5cGVJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wVHlwZUlEKCkgewotCQlyZXR1cm4gSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb24jY3JlYXRlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmFwcGxpY2F0aW9uLm9wZXJhdGlvbnMuSjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsKQotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24gY3JlYXRlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24oZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb24jY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZUV4dGVuc2lvbiNjcmVhdGVJbXBvcnREYXRhTW9kZWwoKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGNyZWF0ZUltcG9ydERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSmNhUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0MzA3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgdG9wLWxldmVsIGNsYXNzIG9mIHRoZSBqMmVlIHBsdWdpbi4KLSAqIAotICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIFVJIHBsdWdpbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmNhUGx1Z2luIGV4dGVuZHMgV1RQUGx1Z2luIGltcGxlbWVudHMgUmVzb3VyY2VMb2NhdG9yIHsKLQkvLyBEZWZhdWx0IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlcgotCXByaXZhdGUgc3RhdGljIEpjYVBsdWdpbiBpbnN0OwotCXByb3RlY3RlZCBmaW5hbCBJUGF0aCBpY29uc0ZvbGRlciA9IG5ldyBQYXRoKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpLmdldEVudHJ5KCJpY29ucyIpLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EiOyAvLyROT04tTkxTLTEkCi0JLy8gVmFsaWRhdGlvbiBwYXJ0IG9mIHRoZSBwbHVnaW4KLQkvL0dsb2JhbCBSZXNvdXJjZVNldCAoc29tZXdoYXQgZ2xvYmFsKQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJQ09OX0RJUlMgPSBuZXcgU3RyaW5nW117Imljb25zL2Z1bGwvb2JqMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvY3ZpZXcxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9jdG9vbDE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2NsY2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9vdnIxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9leHRyYSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC93aXpiYW4iLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zIiwgLy8kTk9OLU5MUy0xJAotCQkJCSIifTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBKMkVFIHBsdWdpbiBhbmQgY2FjaGUgaXRzIGRlZmF1bHQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSmNhUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5zdCA9PSBudWxsKQotCQkJaW5zdCA9IHRoaXM7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgdGhlIHBsdWdpbiBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBKY2FQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEJhc2VVUkwoKSB7Ci0JCXJldHVybiBnZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRJbWFnZVVSTChrZXksIGdldEJ1bmRsZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpjYVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Z2luIGRpcmVjdG9yeSBsb2NhdGlvbi0gdGhlIGRpcmVjdG9yeSB0aGF0IGFsbCB0aGUgcGx1Z2lucyBhcmUgbG9jYXRlZCBpbiAoaS5lLgotCSAqIGQ6XGluc3RhbGxkaXJccGx1Z2luKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGx1Z2luTG9jYXRpb24oU3RyaW5nIHBsdWdpbklkKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVBhdGggaW5zdGFsbFBhdGggPSBuZXcgUGF0aChidW5kbGUuZ2V0RW50cnkoIi8iKS50b0V4dGVybmFsRm9ybSgpKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQkJCVN0cmluZyBpbnN0YWxsU3RyID0gUGxhdGZvcm0uYXNMb2NhbFVSTChuZXcgVVJMKGluc3RhbGxQYXRoLnRvU3RyaW5nKCkpKS5nZXRGaWxlKCk7Ci0JCQkJcmV0dXJuIG5ldyBQYXRoKGluc3RhbGxTdHIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQkJLy9UT0RPIERvbid0IHRocm93IGVycm9yIC0ganVzdCBzaG93IHVucmVzb2x2ZWQga2V5Ci0JCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgc3Vic3RpdHV0aW9ucyk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UpOwotCX0JCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgYm9vbGVhbiB0cmFuc2xhdGUpIHsKLQkJLy8gVE9ETyBGb3Igbm93Li4uICB0cmFuc2xhdGUgbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gc3Vic3RpdHV0aW9ucywgYm9vbGVhbiB0cmFuc2xhdGUpIHsKLQkJLy8gVE9ETyBGb3Igbm93Li4uICB0cmFuc2xhdGUgbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSxzdWJzdGl0dXRpb25zKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzJiZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbiBleHRlbmRzIEoyRUVBcnRpZmFjdEV4cG9ydE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhwb3J0KCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlDb21tb25hcmNoaXZlRmFjdG9yeSBjYWYgPSAoKENvbW1vbmFyY2hpdmVQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25hcmNoaXZlUGFja2FnZS5lTlNfVVJJKSkuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQkJCUNvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgbHMgPSBuZXcgQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChnZXRDb21wb25lbnQoKSk7Ci0JCQlscy5zZXRFeHBvcnRTb3VyY2UoaXNFeHBvcnRTb3VyY2UoKSk7Ci0JCQlzZXRNb2R1bGVGaWxlKGNhZi5vcGVuUkFSRmlsZShscywgZ2V0RGVzdGluYXRpb25QYXRoKCkudG9PU1N0cmluZygpKSk7Ci0JCQlnZXRNb2R1bGVGaWxlKCkuc2F2ZUFzTm9SZW9wZW4oZ2V0RGVzdGluYXRpb25QYXRoKCkudG9PU1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3Jfb3BlbmluZ19hcmNoaXZlX2Zvcl9leHBvcnRfMiIpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGFyY2hpdmVTdHJpbmcoKSB7Ci0JCS8vVE9ETyBmaWxsIGluIHN0cmluZwotCQlyZXR1cm4gIiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MThmZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5jb21wb25lbnRjb3JlLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5Db21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCB7Ci0KLQlwcml2YXRlIGludCBkb3RKYXZhTGVuZ3RoID0gQXJjaGl2ZVV0aWwuRE9UX0pBVkEubGVuZ3RoKCk7Ci0JcHJpdmF0ZSBMaXN0IGFscmVhZHlJbmRleGVkID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTWFwIGNsYXNzZXNNYXA7Ci0JcHJpdmF0ZSBJRmlsZSBrbm93bkREOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBrbm93bkxpYkV4dGVuc2lvbnMgPSB7Ii5qYXIiLCAvLyROT04tTkxTLTEkCi0JCQkJIi56aXAiLCAvLyROT04tTkxTLTEkCi0JCQkJIi5zbyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLm8iLCAvLyROT04tTkxTLTEkCi0JCQkJIi5zbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLmRsbCIsIC8vJE5PTi1OTFMtMSQKLQl9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7Ci0JCXN1cGVyKHZDb21wb25lbnQpOwotCQlrbm93bkREID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbmVzdGVkSmFycyA9IGdldE5lc3RlZEpBUnNGcm9tU291cmNlUm9vdHMoKTsKLQkJSXRlcmF0b3IgaW50ZXJhdG9yID0gbmVzdGVkSmFycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaW50ZXJhdG9yLmhhc05leHQoKSkgewotCQkJZmlsZXNIb2xkZXIuYWRkRmlsZSgoRmlsZSkgaW50ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJZ2V0U291cmNlRmlsZXMoKTsKLQkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEZpbGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldE5lc3RlZEpBUnNGcm9tU291cmNlUm9vdHMoKSB7Ci0JCUxpc3QgbmVzdGVkSmFycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VSb290cyA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKHZDb21wb25lbnQpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VSb290cy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBhRmlsZTsKLQkJCXRyeSB7Ci0JCQkJYUZpbGUgPSBnZXROZXN0ZWRKYXIoc291cmNlUm9vdHNbaV0pOwotCQkJCWlmIChudWxsICE9IGFGaWxlKSB7Ci0JCQkJCW5lc3RlZEphcnMuYWRkKGFGaWxlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmVzdGVkSmFyczsKLQl9Ci0KLQotCi0JcHJpdmF0ZSBGaWxlIGdldE5lc3RlZEphcihJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VSb290KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggb3V0cHV0UGF0aCA9IHNvdXJjZVJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAob3V0cHV0UGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlGb2xkZXIgamF2YU91dHB1dEZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKG91dHB1dFBhdGgpOwotCQlpbmRleENsYXNzZXNGb3JPdXRwdXRGb2xkZXIoamF2YU91dHB1dEZvbGRlcik7Ci0JCUlDb250YWluZXIgc291cmNlQ29udGFpbmVyID0gKElDb250YWluZXIpIHNvdXJjZVJvb3QuZ2V0UmVzb3VyY2UoKTsKLQotCQlpbnQgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50ID0gc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJYm9vbGVhbiBpc01vZHVsZVJvb3QgPSBrbm93bkRELmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLnN0YXJ0c1dpdGgoc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJTGlzdCBpRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJvb2xlYW4gZm91bmRKYXZhID0gZ2F0aGVyRmlsZXNGb3JKQVIoaUZpbGVzLCBzb3VyY2VDb250YWluZXIsIGlzTW9kdWxlUm9vdCwgZmFsc2UsIHNvdXJjZUNvbnRhaW5lclNlZ21lbnRDb3VudCk7Ci0JCWlmICghaXNNb2R1bGVSb290IHx8IGZvdW5kSmF2YSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlmaWxlc0hvbGRlci5yZW1vdmVJRmlsZSgoSUZpbGUpIGlGaWxlcy5nZXQoaSkpOwotCQkJfQotCQkJRmlsZSBuZXN0ZWRBcmNoaXZlID0gY3JlYXRlTmVzdGVkQXJjaGl2ZShpRmlsZXMsIHNvdXJjZUNvbnRhaW5lciwgamF2YU91dHB1dEZvbGRlcik7Ci0JCQlyZXR1cm4gbmVzdGVkQXJjaGl2ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2F0aGVyRmlsZXNGb3JKQVIoTGlzdCBpRmlsZXMsIElDb250YWluZXIgY3VycmVudCwgYm9vbGVhbiBpc01vZHVsZVJvb3QsIGJvb2xlYW4gZm91bmRKYXZhLCBpbnQgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KSB7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnM7Ci0JCXRyeSB7Ci0JCQltZW1iZXJzID0gY3VycmVudC5tZW1iZXJzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZSkgewotCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKGNvcmUpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlcyA9IG1lbWJlcnNbaV07Ci0JCQlpZiAocmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJZm91bmRKYXZhID0gZ2F0aGVyRmlsZXNGb3JKQVIoaUZpbGVzLCAoSUZvbGRlcikgcmVzLCBpc01vZHVsZVJvb3QsIGZvdW5kSmF2YSwgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KSB8fCBmb3VuZEphdmE7Ci0JCQl9IGVsc2Ugey8vIGl0IG11c3QgYmUgYSBmaWxlCi0JCQkJSUZpbGUgc3JjRmlsZSA9IChJRmlsZSkgcmVzOwotCQkJCWlmIChiZWxvbmdzSW5OZXN0ZWRKQVIoc3JjRmlsZSwgaXNNb2R1bGVSb290KSkgewotCQkJCQlpZiAoaXNKYXZhKHNyY0ZpbGUpKSB7Ci0JCQkJCQlpZiAoZXhwb3J0U291cmNlKSB7Ci0JCQkJCQkJaUZpbGVzLmFkZChzcmNGaWxlKTsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBzcmNGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZUNvbnRhaW5lclNlZ21lbnRDb3VudCkudG9TdHJpbmcoKTsKLQkJCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxlbmd0aCgpIC0gZG90SmF2YUxlbmd0aCk7Ci0JCQkJCQlMaXN0IGNsYXNzZXMgPSByZXRyaWV2ZUNsYXNzZXMoY2xhc3NOYW1lKTsKLQkJCQkJCWlmIChudWxsICE9IGNsYXNzZXMpIHsKLQkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGNsYXNzZXMuaXRlcmF0b3IoKTsKLQkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCUlGaWxlIGNsYXp6ID0gKElGaWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlGaWxlcy5hZGQoY2xhenopOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlGaWxlcy5hZGQoc3JjRmlsZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGlzTW9kdWxlUm9vdCkKLQkJCQkJCWZvdW5kSmF2YSA9IGZvdW5kSmF2YSB8fCBpc0phdmEoc3JjRmlsZSkgfHwgaXNDbGFzcyhzcmNGaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvdW5kSmF2YTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgY3JlYXRlTmVzdGVkQXJjaGl2ZShMaXN0IGZpbGVzLCBJQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lciwgSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB7Ci0JCUNvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwgbG9hZGVyID0gbmV3IENvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwoZmlsZXMsIHNvdXJjZUNvbnRhaW5lciwgamF2YU91dHB1dEZvbGRlcik7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5nZXRPcHRpb25zKCkuY2xvbmVXaXRoKGxvYWRlcik7Ci0JCVN0cmluZyB1cmkgPSBjb21wdXRlVW5pcXVlQXJjaGl2ZVVSSShzb3VyY2VDb250YWluZXIpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkucHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZVVuaXF1ZUFyY2hpdmVVUkkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWludCBpbmNyZW1lbnQgPSAwOwotCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKLQkJZG8gewotCQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUubGVuZ3RoKCkgKyA1KTsKLQkJCXNiLmFwcGVuZCgnXycpOwotCQkJc2IuYXBwZW5kKG5hbWUpOwotCQkJaWYgKGluY3JlbWVudCA+IDApCi0JCQkJc2IuYXBwZW5kKGluY3JlbWVudCk7Ci0JCQlzYi5hcHBlbmQoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5jcmVtZW50Kys7Ci0JCX0gd2hpbGUgKGZpbGVzSG9sZGVyLmNvbnRhaW5zKHNiLnRvU3RyaW5nKCkpKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJlbG9uZ3NJbk5lc3RlZEpBUihJRmlsZSBpRmlsZSwgYm9vbGVhbiBpc01vZHVsZVJvb3QpIHsKLQkJaWYgKGlzTW9kdWxlUm9vdCAmJiBpc0RlcGxveW1lbnREZXNjcmlwdG9yKGlGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga25vd25MaWJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaGFzRXh0ZW5zaW9uKGlGaWxlLCBrbm93bkxpYkV4dGVuc2lvbnNbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuICFoYXNFeHRlbnNpb24odXJpLCBBcmNoaXZlVXRpbC5ET1RfQ0xBU1MpICYmICFoYXNFeHRlbnNpb24odXJpLCBBcmNoaXZlVXRpbC5ET1RfSkFWQSk7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhbGwgdGhlIC5jbGFzcyBmaWxlcyBhbmQgaW5kZXggdGhlbSBzbyBpbm5lciBjbGFzc2VzIGNhbiBiZSBsb2NhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzZXNGb3JPdXRwdXRGb2xkZXIoSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB7Ci0JCWlmIChudWxsID09IGphdmFPdXRwdXRGb2xkZXIgfHwgYWxyZWFkeUluZGV4ZWQuY29udGFpbnMoamF2YU91dHB1dEZvbGRlcikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhbHJlYWR5SW5kZXhlZC5hZGQoamF2YU91dHB1dEZvbGRlcik7Ci0JCWludCBzZWdtZW50Q291bnQgPSBqYXZhT3V0cHV0Rm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJaW5kZXhDbGFzc2VzKGphdmFPdXRwdXRGb2xkZXIsIHNlZ21lbnRDb3VudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluZGV4Q2xhc3NlcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBqYXZhT3V0cHV0U2VnbWVudENvdW50KSB7Ci0JCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQlpbmRleENsYXNzKChJRmlsZSkgcmVzb3VyY2UsIGphdmFPdXRwdXRTZWdtZW50Q291bnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQl0cnkgewotCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gKChJRm9sZGVyKSByZXNvdXJjZSkubWVtYmVycygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWluZGV4Q2xhc3NlcyhtZW1iZXJzW2ldLCBqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluZGV4Q2xhc3MoSUZpbGUgaUZpbGUsIGludCBqYXZhT3V0cHV0U2VnbWVudENvdW50KSB7Ci0JCWlmICghaXNDbGFzcyhpRmlsZSkpCi0JCQlyZXR1cm47Ci0JCWlmIChjbGFzc2VzTWFwID09IG51bGwpCi0JCQljbGFzc2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIG5hbWUgPSBpRmlsZS5nZXROYW1lKCk7Ci0JCUlQYXRoIHJlbFBhdGggPSBpRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJU3RyaW5nIGtleSA9IHJlbFBhdGgudG9TdHJpbmcoKTsKLQkJaWYgKG5hbWUuaW5kZXhPZignJCcpICE9IC0xKSB7Ci0JCQlrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCckJykpOwotCQl9IGVsc2UgewotCQkJa2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignLicpKTsKLQkJfQotCQlMaXN0IGlubmVycyA9IChMaXN0KSBjbGFzc2VzTWFwLmdldChrZXkpOwotCQlpZiAoaW5uZXJzID09IG51bGwpIHsKLQkJCWlubmVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQljbGFzc2VzTWFwLnB1dChrZXksIGlubmVycyk7Ci0JCX0KLQkJaW5uZXJzLmFkZChpRmlsZSk7Ci0JfQotCi0JcHVibGljIExpc3QgcmV0cmlldmVDbGFzc2VzKFN0cmluZyBrZXkpIHsKLQkJaWYgKGNsYXNzZXNNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKExpc3QpIGNsYXNzZXNNYXAuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YShJRmlsZSBpRmlsZSkgewotCQlyZXR1cm4gaGFzRXh0ZW5zaW9uKGlGaWxlLCBBcmNoaXZlVXRpbC5ET1RfSkFWQSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3MoSUZpbGUgaUZpbGUpIHsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihpRmlsZSwgQXJjaGl2ZVV0aWwuRE9UX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0V4dGVuc2lvbihJRmlsZSBpRmlsZSwgU3RyaW5nIGV4dCkgewotCQlTdHJpbmcgbmFtZSA9IGlGaWxlLmdldE5hbWUoKTsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihuYW1lLCBleHQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZXh0KSB7Ci0JCWludCBvZmZzZXQgPSBleHQubGVuZ3RoKCk7Ci0JCXJldHVybiBuYW1lLnJlZ2lvbk1hdGNoZXModHJ1ZSwgbmFtZS5sZW5ndGgoKSAtIG9mZnNldCwgZXh0LCAwLCBvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yKElGaWxlIGlGaWxlKSB7Ci0JCXJldHVybiBrbm93bkRELmVxdWFscyhpRmlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJMb2FkU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NWRjNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIExvYWRTdHJhdGVneUltcGwgewotCi0JcHJpdmF0ZSBMaXN0IGZpbGVzOwotCXByaXZhdGUgaW50IHNvdXJjZVNlZ21lbnRDb3VudDsKLQlwcml2YXRlIGludCBvdXRwdXRTZWdtZW50Q291bnQ7Ci0JcHJpdmF0ZSBNYXAgdXJpc1RvSUZpbGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwuCi0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwoTGlzdCBmaWxlcywgSUNvbnRhaW5lciBzb3VyY2VDb250YWluZXIsIElGb2xkZXIgamF2YU91dHB1dEZvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmZpbGVzID0gZmlsZXM7Ci0JCXNvdXJjZVNlZ21lbnRDb3VudCA9IHNvdXJjZUNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JCW91dHB1dFNlZ21lbnRDb3VudCA9IGphdmFPdXRwdXRGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnNlZ21lbnRDb3VudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwjcHJpbUNvbnRhaW5zKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltQ29udGFpbnMoU3RyaW5nIHVyaSkgewotCQkvLyBTaG91bGQgb25seSBiZSB1c2VkIGJ5IGRpc2NyaW1pbmF0b3JzLCBhbmQgd2UgZG9uJ3QgZGlzY3JpbWluYXRlIHRoZXNlIGFyY2hpdmVzCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwjZ2V0RmlsZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbGVzKCkgewotCQl1cmlzVG9JRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IHNpemUgPSBmaWxlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRmlsZSBpRmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJSVBhdGggcmVsUGF0aDsKLQkJCWlmKENvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuaXNDbGFzcyhpRmlsZSkpewotCQkJCXJlbFBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoaUZpbGUsIG91dHB1dFNlZ21lbnRDb3VudCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlbFBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoaUZpbGUsIHNvdXJjZVNlZ21lbnRDb3VudCk7Ci0JCQl9Ci0JCQlhZGRGaWxlKGlGaWxlLCByZWxQYXRoLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmlsZShJRmlsZSBpRmlsZSwgSVBhdGggcmVsUGF0aCwgTGlzdCByZXN1bHQpIHsKLQkJRmlsZSBjRmlsZSA9IGNyZWF0ZUZpbGUoaUZpbGUsIHJlbFBhdGgpOwotCQlyZXN1bHQuYWRkKGNGaWxlKTsKLQkJdXJpc1RvSUZpbGVzLnB1dChjRmlsZS5nZXRVUkkoKSwgaUZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBsb25nIGdldExhc3RNb2RpZmllZChJUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBhUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgY3JlYXRlRmlsZShJRmlsZSBpRmlsZSwgSVBhdGggcmVsUGF0aCkgewotCQlGaWxlIGNGaWxlID0gY3JlYXRlRmlsZShyZWxQYXRoLnRvU3RyaW5nKCkpOwotCQljRmlsZS5zZXRMYXN0TW9kaWZpZWQoZ2V0TGFzdE1vZGlmaWVkKGlGaWxlKSk7Ci0JCXJldHVybiBjRmlsZTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldFJlbGF0aXZlUGF0aChJRmlsZSBmaWxlLCBpbnQgcGFyZW50U2VnbWVudENvdW50KSB7Ci0JCXJldHVybiBmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHBhcmVudFNlZ21lbnRDb3VudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneSNnZXRJbnB1dFN0cmVhbShTdHJpbmcpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKG51bGwgPT0gdXJpc1RvSUZpbGVzKSB7Ci0JCQlnZXRGaWxlcygpOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHVyaXNUb0lGaWxlcy5nZXQodXJpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRDb250ZW50cygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKHVyaSwgY29yZSk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0FjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDA0NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0FjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWN0aXZhdGlvblNwZWN9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBY3RpdmF0aW9uU3BlY0NsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBY3RpdmF0aW9uIFNwZWMgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aXZhdGlvblNwZWNDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQWN0aXZhdGlvblNwZWNfYWN0aXZhdGlvblNwZWNDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3RpdmF0aW9uU3BlY19hY3RpdmF0aW9uU3BlY0NsYXNzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2YXRpb25TcGVjX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWNDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWNfUmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZhdGlvblNwZWMuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BY3RpdmF0aW9uU3BlYyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBY3RpdmF0aW9uU3BlYykgb2JqZWN0KS5nZXRBY3RpdmF0aW9uU3BlY0NsYXNzKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfQWN0aXZhdGlvblNwZWNfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfQWN0aXZhdGlvblNwZWNfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3RpdmF0aW9uU3BlYy5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BZG1pbk9iamVjdEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0FkbWluT2JqZWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkY2NjNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0FkbWluT2JqZWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWRtaW5PYmplY3R9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFkbWluT2JqZWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZG1pbk9iamVjdEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRtaW5PYmplY3RDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRtaW4gT2JqZWN0IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZG1pbk9iamVjdEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfQWRtaW5PYmplY3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdEludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRtaW4gT2JqZWN0IENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkbWluT2JqZWN0Q2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0FkbWluT2JqZWN0X2FkbWluT2JqZWN0Q2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWRtaW5PYmplY3RfYWRtaW5PYmplY3RDbGFzc19mZWF0dXJlIiwgIl9VSV9BZG1pbk9iamVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0Q2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBZG1pbk9iamVjdC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0FkbWluT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFkbWluT2JqZWN0KSBvYmplY3QpLmdldEFkbWluT2JqZWN0SW50ZXJmYWNlKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfQWRtaW5PYmplY3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfQWRtaW5PYmplY3RfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBZG1pbk9iamVjdC5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uZmlnUHJvcGVydHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjNmOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIHRoZSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBmb3IgY29ubmVjdG9yIHByb2VqY3RzLgotICovCi1wdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIgZXh0ZW5kcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gQWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZS4KLQkgKi8KLQlwdWJsaWMgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXV0aGVudGljYXRpb25NZWNoYW5pc21Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ3JlZGVudGlhbEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ3VzdG9tQXV0aE1lY2hUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aGVudGljYXRpb24gTWVjaGFuaXNtIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9mZWF0dXJlIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVfZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENyZWRlbnRpYWwgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENyZWRlbnRpYWxJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2NyZWRlbnRpYWxJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fY3JlZGVudGlhbEludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1c3RvbSBBdXRoIE1lY2ggVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21BdXRoTWVjaFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2N1c3RvbUF1dGhNZWNoVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9jdXN0b21BdXRoTWVjaFR5cGVfZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DdXN0b21BdXRoTWVjaFR5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsgaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkgKiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogQXV0aGVudGljYXRpb25NZWNoYW5pc20gZl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9ICgoQXV0aGVudGljYXRpb25NZWNoYW5pc20pb2JqZWN0KTsKLQkgKiBKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOzsgLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRGVzY3JpcHRpb24iLCAiVGhlCi0JICogZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSIsCi0JICogcGtnLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUKLQkgKiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJBdXRoZW50aWNhdGlvbgotCSAqIE1lY2hhbmlzbSBUeXBlIiwgIlRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gdHlwZSBwcm9wZXJ0eSBvZiB0aGUgYXV0aGVudGljYXRpb24KLQkgKiBtZWNoYW5pc20iLCBwa2cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBjcmVkZW50aWFsSW50ZXJmYWNlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiQ3JlZGVudGlhbCBJbnRlcmZhY2UiLAotCSAqICJUaGUgY3JlZGVudGlhbCBpbnRlcmZhY2UgcHJvcGVydHkgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSIsCi0JICogcGtnLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsKLQkgKiAKLQkgKiB9Ly8gaWYgcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOyB9Ly8gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycwotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9hdXRoX21lY2hhbmlzbV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJQXV0aGVudGljYXRpb25NZWNoYW5pc20gYXV0aGVudGljYXRpb25NZWNoYW5pc20gPSAoKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBvYmplY3QpOwotCQlyZXR1cm4gIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtICIgKyBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5nZXREZXNjcmlwdGlvbigpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldFRleHQKLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DVVNUT01fQVVUSF9NRUNIX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmllcgotCSAqICAgICAgICAgICAgbm90aWZpZXIgLSBOb3RpZmllcyBvZiBjaGFuZ2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZXZlbnRUeXBlIC0gVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIEVPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgcmVmZXJlbmNlIG9iamVjdC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBuZXdWYWx1ZSAtIFRoZSBuZXcgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBpbmRleCAtIFRoZSBjdXJyZW50IG9mIHRoZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCUpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgbm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZS5lQ29udGFpbm1lbnRGZWF0dXJlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCQlpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjRiZDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSBDb25maWcgcHJvcGVydHkgb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBBZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgLSBBZGFwdCBmYWN0b3J5Ci0JICovCi0JcHVibGljIENvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfQ29uZmlnUHJvcGVydHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25maWdQcm9wZXJ0eV9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbmZpZ1Byb3BlcnR5X25hbWVfZmVhdHVyZSIsICJfVUlfQ29uZmlnUHJvcGVydHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbmZpZ1Byb3BlcnR5X3R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZmlnUHJvcGVydHlfdHlwZV9mZWF0dXJlIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25maWdQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25maWdQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeyBpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCSAqIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkgKiAKLQkgKiBDb25maWdQcm9wZXJ0eSBmX2NvbmZpZ1Byb3BlcnR5ID0gKChDb25maWdQcm9wZXJ0eSlvYmplY3QpOyBKY2FQYWNrYWdlIHBrZyA9Ci0JICogSmNhUGFja2FnZS5lSU5TVEFOQ0U7OyAvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JICogKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJEZXNjcmlwdGlvbiIsICJUaGUKLQkgKiBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBvZiB0aGUgY29uZmlnIHByb3BlcnR5IiwgcGtnLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBuYW1lIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiTmFtZSIsICJUaGUgbmFtZQotCSAqIHByb3BlcnR5IG9mIHRoZSBjb25maWcgcHJvcGVydHkiLCBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfTmFtZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgdHlwZSBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlR5cGUiLCAiVGhlIHR5cGUKLQkgKiBwcm9wZXJ0eSBvZiB0aGUgY29uZmlnIHByb3BlcnR5IiwgcGtnLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHZhbHVlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVmFsdWUiLCAiVGhlIHZhbHVlCi0JICogcHJvcGVydHkgb2YgdGhlIGNvbmZpZyBwcm9wZXJ0eSIsIHBrZy5nZXRDb25maWdQcm9wZXJ0eV9WYWx1ZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOwotCSAqIAotCSAqIH0vLyBpZiByZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7IH0vLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIENvbmZpZ1Byb3BlcnR5LgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbmZpZ1Byb3BlcnR5LmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvY29uZmlnX3Byb3Bfb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0SW1hZ2UKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0ZXh0IGJhc2Ugb24gdGhlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlDb25maWdQcm9wZXJ0eSBjb25maWdQcm9wZXJ0eSA9ICgoQ29uZmlnUHJvcGVydHkpIG9iamVjdCk7Ci0JCWlmIChjb25maWdQcm9wZXJ0eS5nZXROYW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcl9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICJDb25maWdQcm9wZXJ0eTogIiArIGNvbmZpZ1Byb3BlcnR5LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29uZmlnUHJvcGVydHkuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19OQU1FIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fVkFMVUUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmllcgotCSAqICAgICAgICAgICAgbm90aWZpZXIgLSBOb3RpZmllcyBvZiBjaGFuZ2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZXZlbnRUeXBlIC0gVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIEVPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgcmVmZXJlbmNlIG9iamVjdC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBuZXdWYWx1ZSAtIFRoZSBuZXcgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBpbmRleCAtIFRoZSBjdXJyZW50IG9mIHRoZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCUpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgbm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZS5lQ29udGFpbm1lbnRGZWF0dXJlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCQlpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRDb25maWdQcm9wZXJ0eV9OYW1lKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCkpIHsKLQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCXJldHVybjsKLQkJfS8vIGlmCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ly8gbm90aWZ5Q2hhbmdlZAotCi19Ly8gQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzZlZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb259b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uSW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzcyBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfZmVhdHVyZSIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3MgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzX2ZlYXR1cmUiLCAiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbm5lY3Rpb24gSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25JbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25JbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbm5lY3Rpb24gSW1wbCBDbGFzcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uSW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9jb25uZWN0aW9uSW1wbENsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25JbXBsQ2xhc3NfZmVhdHVyZSIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0aWVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db25uZWN0aW9uRGVmaW5pdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29ubmVjdGlvbkRlZmluaXRpb24pIG9iamVjdCkuZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IEpDQVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCUpDQVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU1QTF9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRJRVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29uZmlnUHJvcGVydGllcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25maWdQcm9wZXJ0eSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0Nvbm5lY3Rvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmNlNjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIENvbmVuY3RvciBwcm9qZWN0cwotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIEFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gQ29ubmVjdG9ySXRlbVByb3ZpZGVyCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFZlbmRvck5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNwZWNWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFaXNUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWZW5kb3IgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0b3JfdmVuZG9yTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0b3JfdmVuZG9yTmFtZV9mZWF0dXJlIiwgIl9VSV9Db25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3BlYyBWZXJzaW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0b3Jfc3BlY1ZlcnNpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdG9yX3NwZWNWZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX0Nvbm5lY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9TcGVjVmVyc2lvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWlzIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWlzVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdG9yX2Vpc1R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdG9yX2Vpc1R5cGVfZmVhdHVyZSIsICJfVUlfQ29ubmVjdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZlcnNpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdG9yX3ZlcnNpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdG9yX3ZlcnNpb25fZmVhdHVyZSIsICJfVUlfQ29ubmVjdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGN1cnJlbnQgcHJvcGVydHkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCSAqIAotCSAqIGlmKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsgc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIENvbm5lY3RvciBmX2Nvbm5lY3RvciA9ICgoQ29ubmVjdG9yKW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7OyAvLyBUaGlzCi0JICogaXMgZm9yIHRoZSBkaXNwbGF5TmFtZSBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJEaXNwbGF5IE5hbWUiLCAiVGhlCi0JICogZGlzcGxheSBuYW1lIHByb3BlcnR5IG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX0Rpc3BsYXlOYW1lKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgIlRoZQotCSAqIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBzbWFsbEljb24gZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJTbWFsbCBJY29uIiwgIlRoZQotCSAqIHNtYWxsIGljb24gcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfU21hbGxJY29uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBsYXJnZUljb24gZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJMYXJnZSBJY29uIiwgIlRoZQotCSAqIGxhcmdlIGljb24gcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfTGFyZ2VJY29uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSB2ZW5kb3JOYW1lIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVmVuZG9yIE5hbWUiLCAiVGhlCi0JICogdmVuZG9yIG5hbWUgcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgc3BlY1ZlcnNpb24gZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJTcGVjIFZlcnNpb24iLCAiVGhlCi0JICogc3BlYyB2ZXJzaW9uIHByb3BlcnR5IG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBlaXNUeXBlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRWlzIFR5cGUiLCAiVGhlIGVpcwotCSAqIHR5cGUgcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfRWlzVHlwZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgdmVyc2lvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlZlcnNpb24iLCAiVGhlIHZlcnNpb24KLQkgKiBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9WZXJzaW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBsaWNlbnNlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiTGljZW5zZSIsICJUaGUgbGljZW5zZQotCSAqIG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSwgZmFsc2UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHJlc291cmNlQWRhcHRlcgotCSAqIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlJlc291cmNlIEFkYXB0ZXIiLAotCSAqICJUaGUgcmVzb3VyY2UgYWRhcHRlciBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKSwgZmFsc2UpKTsgfQotCSAqIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIE9iamVjdCB0byBnZXQgY2hpbGRyZW4gcmVmZXJlbmNlcyBvZi4KLQkgKiBAcmV0dXJuIENvbGVsY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfTGljZW5zZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpKTsKLQkJfS8vIGlmCi0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfS8vIGdldENoaWxkcmVuUmVmZXJlbmNlcwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgQ29ubmVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIE9iamVjdCB0byByZXR1cm4gdGhlIHBhcmVudCBvZi4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbm5lY3Rvci5naWYuCi0JICogCi0JICogQHBhcmFtIE9iamVjdCAtCi0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGdldCB0aGUgaW1hZ2UgZm9yLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L2Nvbm5lY3Rpb25fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0SW1hZ2UKLQotCS8qKgotCSAqIEdldCB0aGUgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBuYW1lIGZvci4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbm5lY3RvciBjb25uZWN0b3IgPSAoKENvbm5lY3Rvcikgb2JqZWN0KTsKLQkJcmV0dXJuICJDb25uZWN0b3IgIiArIGNvbm5lY3Rvci5nZXREaXNwbGF5TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldFRleHQKLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb25uZWN0b3IuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19TUEVDX1ZFUlNJT04gOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRUlTX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGljZW5zZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotfS8vIENvbmVuY3Rvckl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9JbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjA1OGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcn1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSW5ib3VuZFJlc291cmNlQWRhcHRlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0luYm91bmRSZXNvdXJjZUFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfSW5ib3VuZFJlc291cmNlQWRhcHRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJLy9yZXR1cm4gZ2V0U3RyaW5nKCJfVUlfSW5ib3VuZFJlc291cmNlQWRhcHRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSW5ib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JCS8vcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSmNhRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3NzY4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSmNhRWRpdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FGYWN0b3J5SW1wbDsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgamNhIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIEpjYUVkaXRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEpjYUVkaXRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgamNhIHBhY2thZ2UuCi0JICovCi0JcHJvdGVjdGVkIEpjYVBhY2thZ2UgamNhUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEpjYUVkaXRQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQotCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotCQkvLwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb25lIGpjYSBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBKY2FQYWNrYWdlIGdldEpjYVBhY2thZ2UoKSB7Ci0JCXJldHVybiBqY2FQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgb25lIGpjYSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBKY2FGYWN0b3J5IGdldEpjYUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSmNhRmFjdG9yeSkgamNhUGFja2FnZS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogRG8gaW5pdGlhbGl6YXRpb24gc3R1ZmYgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5zdGFydHVwKCk7Ci0JCWpjYVBhY2thZ2UgPSBKY2FGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKY2FFZGl0UGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCksICJpY29ucy8iICsga2V5ICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIGxvYWQgaW1hZ2UgZm9yICciICsga2V5ICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSB0cmFuc2xhdGVkIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIGFuIG9iamVjdCBzdWJzdGl0dXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtde3MxfSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIHR3byBvYmplY3Qgc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczJ9KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSB0cmFuc2xhdGVkIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUsIHdpdGggdGhyZWUgb2JqZWN0IHN1YnN0aXR1dGlvbnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIsIE9iamVjdCBzMykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczIsIHMzfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSmNhSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY3YjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGV4dGVuZGVkIGl0ZW0gcHJvdmlkZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgQ3JlYXRlQ2hpbGRDb21tYW5kfQotICogPC91bD4KLSAqIDxwPgotICogVGhlIGNvbW1hbmRzIGFyZSBpbXBsZW1lbnRlZCB1bmlmb3JtbHkgb24gYWxsIG91ciBpdGVtIGFkYXB0ZXJzIHVzaW5nIHRoaXMgY29tbW9uIGJhc2UgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBwYWNrYWdlIGZvciB0aGUgamNhIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmNhUGFja2FnZSBqY2FQYWNrYWdlID0gKEpjYVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IGZvciB0aGUgamNhIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmNhRmFjdG9yeSBqY2FGYWN0b3J5ID0gamNhUGFja2FnZS5nZXRKY2FGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkgYW5kIGEgZG9tYWluIG5vdGlmaWVyLgotCSAqLwotCXByb3RlY3RlZCBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gSmNhSXRlbVByb3ZpZGVyQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBzdXBwb3J0ZWQgY29tbWFuZHMuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHBhcmFtIEVkaXRpbmdEb21haW4gLQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgZWRpdGluZyBkb21haW4uCi0JICogQHBhcmFtIGNvbW1hbmRDbGFzcyAtCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb21tYW5kIGNsYXNzLgotCSAqIEBwYXJhbSBjb21tYW5kUGFyYW1ldGVyIC0KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbW1hbmRQYXJhbWV0ZXIuCi0JICogQHJldHVybiBDb21tYW5kCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgY29tbWFuZENsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsKLQl9Ly8gY3JlYXRlQ29tbWFuZAotCi19Ly8gSmNhSXRlbVByb3ZpZGVyQWRhcHRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0pjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0NzQ1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnV0aWwuSmNhQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0Ci0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJ9cy4gVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYKLSAqIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMKLSAqIGFsc28gc3VwcG9ydCBwcm9wZXJ0eSBzaGVldHMsIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllc30uIE5vdGUgdGhhdCBtb3N0IG9mIHRoZQotICogYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEpjYUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBJQ2hhbmdlTm90aWZpZXIuCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IGlzRmFjdG9yeUZvclR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ly8gSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBDb25uZWN0b3IgaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0b3JJdGVtUHJvdmlkZXIgY29ubmVjdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEgQ29ubmVjdG9yLgotCSAqIAotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCWlmIChjb25uZWN0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29ubmVjdG9ySXRlbVByb3ZpZGVyID0gbmV3IENvbm5lY3Rvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIGNvbm5lY3Rvckl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlQ29ubmVjdG9yQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIExpY2Vuc2UgaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBMaWNlbnNlSXRlbVByb3ZpZGVyIGxpY2Vuc2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBMaWNlbnNlLgotCSAqIAotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCkgewotCQlpZiAobGljZW5zZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsaWNlbnNlSXRlbVByb3ZpZGVyID0gbmV3IExpY2Vuc2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBsaWNlbnNlSXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVMaWNlbnNlQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgewotCQlpZiAoaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID0gbmV3IEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJaWYgKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID0gbmV3IE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VBZGFwdGVyfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciBtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuTWVzc2FnZUFkYXB0ZXJ9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCWlmIChtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciA9IG5ldyBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9ufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyIGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyID0gbmV3IENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkFkbWluT2JqZWN0fQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlciBhZG1pbk9iamVjdEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWRtaW5PYmplY3R9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZG1pbk9iamVjdEFkYXB0ZXIoKSB7Ci0JCWlmIChhZG1pbk9iamVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhZG1pbk9iamVjdEl0ZW1Qcm92aWRlciA9IG5ldyBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhZG1pbk9iamVjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5NZXNzYWdlTGlzdGVuZXJ9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlciBtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VMaXN0ZW5lcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCWlmIChtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyID0gbmV3IE1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWN0aXZhdGlvblNwZWN9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyIGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5BY3RpdmF0aW9uU3BlY30uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2YXRpb25TcGVjQWRhcHRlcigpIHsKLQkJaWYgKGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyID0gbmV3IEFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVBZGFwdGVyKCkgewotCQlpZiAocmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIFJlc291cmNlQWRhcHRlciBpbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciByZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBSZXNvdXJjZUFkYXB0ZXIuCi0JICogCi0JICogQHJldHVybiBBZGFwdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJaWYgKHJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ly8gaWYKLQotCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwgU2VjdXJpdHlQZXJtaXNzaW9uIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyIHNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIFNlY3VyaXR5UGVybWlzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyKCkgewotCQlpZiAoc2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBzZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXI7Ci0JfS8vIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbkFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBpbnN0YW5jZXMKLQkgKi8KLQlwcm90ZWN0ZWQgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIgYXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIoKSB7Ci0JCWlmIChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlciA9IG5ldyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBDb25maWdQcm9wZXJ0eSBpbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIENvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyIGNvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25maWdQcm9wZXJ0eX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAoY29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIgPSBuZXcgQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBjb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfS8vIGdldFJvb3RBZGFwdGVyRmFjdG9yeQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfS8vIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgaXQgaXMgYSBmYWN0b3J5IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICB0eXBlIC0gVGhlIGdpdmVuIHR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIHx8IHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0vLyBpc0ZhY3RvcnlGb3JUeXBlCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gVGhlIGdpdmVuIG5vdGlmZXIuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgdHlwZSAtIFRoZSBnaXZlbiB0eXBlCi0JICogQHJldHVybiBBZGFwdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfS8vIGFkYXB0Ci0KLQkvKioKLQkgKiBEb2VzIGFkYXB0aW5nLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBnaXZlbiBvYmplY3QuCi0JICogQHBhcmFtIE9qZWN0Ci0JICogICAgICAgICAgICB0eXBlIC0gVGhlIGdpdmVuIHR5cGUuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCS8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8gZGVhbCB3aXRoIGVudW1lcmF0b3JzLCB3aGljaCBjcmFzaCB0aGUgZG9Td2l0Y2guCi0JCS8vCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0ICYmICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfS8vIGlmCi0KLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ly8gaWYKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIG51bGw7Ci0JfS8vIGFkYXB0Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfS8vIHJlbW92ZUxpc3RlbmVyCi0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byBjaGFuZ2UgTm90aWZpZXIgYW5kIHRvIHBhcmVudCBBZGFwdGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBnaXZlbiB0eXBlIG9mIGV2ZW50LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgZ2l2ZW4gZmVhdHVyZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgdmFsdWUgb2YgdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG5yZVZhbHVlIC0gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgZXZlbnQuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJfS8vIGlmCi0JfS8vIGZpcmVOb3RpZnlDaGFuZ2VkCi0KLX0vLyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0xpY2Vuc2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9MaWNlbnNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMTBiZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0xpY2Vuc2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIExpY2Vuc2Ugb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZUl0ZW1Qcm92aWRlciBleHRlbmRzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGljZW5zZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfS8vIExpY2Vuc2VJdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlcXVpcmVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTGljZW5zZV9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaWNlbnNlX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0xpY2Vuc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXF1aXJlZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXF1aXJlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTGljZW5zZV9yZXF1aXJlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaWNlbnNlX3JlcXVpcmVkX2ZlYXR1cmUiLCAiX1VJX0xpY2Vuc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX1JlcXVpcmVkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7IGlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JICogc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIExpY2Vuc2UgZl9saWNlbnNlID0gKChMaWNlbnNlKW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7OyAvLyBUaGlzIGlzIGZvcgotCSAqIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJEZXNjcmlwdGlvbiIsICJUaGUKLQkgKiBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBvZiB0aGUgbGljZW5zZSIsIHBrZy5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSByZXF1aXJlZCBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlJlcXVpcmVkIiwgIlRoZQotCSAqIHJlcXVpcmVkIHByb3BlcnR5IG9mIHRoZSBsaWNlbnNlIiwgcGtnLmdldExpY2Vuc2VfUmVxdWlyZWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQkgKiAKLQkgKiB9Ly8gaWYKLQkgKiAKLQkgKiByZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7IH0vLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIExpY2Vuc2UuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTGljZW5zZS5naWYuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvbGljZW5zZV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5hbWUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJTGljZW5zZSBsaWNlbnNlID0gKChMaWNlbnNlKSBvYmplY3QpOwotCQlpZiAobGljZW5zZS5nZXREZXNjcmlwdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTGljZW5zZUl0ZW1Qcm92aWRlcl9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkxpY2Vuc2VJdGVtUHJvdmlkZXJfVUlfMCIpICsgIjoiICsgbGljZW5zZS5nZXREZXNjcmlwdGlvbigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ly8gZ2V0VGV4dAotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKExpY2Vuc2UuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX1JFUVVJUkVEIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGljZW5zZV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBOb3RpZmllcgotCSAqICAgICAgICAgICAgbm90aWZpZXIgLSBOb3RpZmllcyBvZiBjaGFuZ2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZXZlbnRUeXBlIC0gVGhlIGV2ZW50IHR5cGUuCi0JICogQHBhcmFtIEVPYmplY3QKLQkgKiAgICAgICAgICAgIGZlYXR1cmUgLSBUaGUgcmVmZXJlbmNlIG9iamVjdC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvbGRWYWx1ZSAtIFRoZSBvbGQgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBuZXdWYWx1ZSAtIFRoZSBuZXcgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBpbmRleCAtIFRoZSBjdXJyZW50IG9mIHRoZSBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCUpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgbm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZS5lQ29udGFpbm1lbnRGZWF0dXJlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCQlpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpIHx8IGZlYXR1cmUgPT0gcGtnLmdldExpY2Vuc2VfUmVxdWlyZWQoKSkgewotCQkJZmlyZU5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCXJldHVybjsKLQkJfS8vIGlmCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ly8gbm90aWZ5Q2hhbmdlZAotCi19Ly8gTGljZW5zZUl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1OTE0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VBZGFwdGVyfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1lc3NhZ2VBZGFwdGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWVzc2FnZUFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfTWVzc2FnZUFkYXB0ZXJfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vcmV0dXJuIGdldFN0cmluZygiX1VJX01lc3NhZ2VBZGFwdGVyX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXNzYWdlQWRhcHRlci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VMaXN0ZW5lcnMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZUxpc3RlbmVyKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCS8vcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gSmNhUGx1Z2luLmdldFBsdWdpbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjI5MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5NZXNzYWdlTGlzdGVuZXJ9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE1lc3NhZ2VMaXN0ZW5lclR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1lc3NhZ2UgTGlzdGVuZXIgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXNzYWdlTGlzdGVuZXJUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXNzYWdlTGlzdGVuZXJfbWVzc2FnZUxpc3RlbmVyVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXNzYWdlTGlzdGVuZXJfbWVzc2FnZUxpc3RlbmVyVHlwZV9mZWF0dXJlIiwgIl9VSV9NZXNzYWdlTGlzdGVuZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZUxpc3RlbmVyVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZUxpc3RlbmVyX0FjdGl2YXRpb25TcGVjKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWVzc2FnZUxpc3RlbmVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWVzc2FnZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1lc3NhZ2VMaXN0ZW5lcikgb2JqZWN0KS5nZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfTWVzc2FnZUxpc3RlbmVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJSkNBUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX01lc3NhZ2VMaXN0ZW5lcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1lc3NhZ2VMaXN0ZW5lci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05fU1BFQyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvblNwZWMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZhdGlvblNwZWMoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9PdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOGE5YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJ9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRyYW5zYWN0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYXV0aGVudGljYXRpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl9yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl9yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydF9mZWF0dXJlIiwgIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUcmFuc2FjdGlvbiBTdXBwb3J0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zYWN0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHJhbnNhY3Rpb25TdXBwb3J0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3RyYW5zYWN0aW9uU3VwcG9ydF9mZWF0dXJlIiwgIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9PdXRib3VuZFJlc291cmNlQWRhcHRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy8JCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyID0gKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKSBvYmplY3Q7Ci0KLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJLy9yZXR1cm4gZ2V0U3RyaW5nKCJfVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZSIpIC8qKyAiICIgKwotCQkvLyBvdXRib3VuZFJlc291cmNlQWRhcHRlci5pc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkqLzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSmNhUGx1Z2luLmdldFBsdWdpbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDZjMzFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9uYW1lX2ZlYXR1cmUiLCAiX1VJX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlKQ0FSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1Jlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1Jlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk3MDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9SZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSBSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSmNhSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gVGhlIGFkYXB0IGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25JbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25JbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRyYW5zYWN0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlc291cmNlQWRhcHRlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzcyBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX21hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc19mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbm5lY3Rpb24gRmFjdG9yeSBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEZhY3RvcnkgSW1wbCBDbGFzcyBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc19mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbm5lY3Rpb24gSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25JbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uSW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uSW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25uZWN0aW9uIEltcGwgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkltcGxDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25JbXBsQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25JbXBsQ2xhc3NfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRyYW5zYWN0aW9uIFN1cHBvcnQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHJhbnNhY3Rpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHJhbnNhY3Rpb25TdXBwb3J0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90cmFuc2FjdGlvblN1cHBvcnRfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYXV0aGVudGljYXRpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfcmVhdXRoZW50aWNhdGlvblN1cHBvcnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3JlYXV0aGVudGljYXRpb25TdXBwb3J0X2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVzb3VyY2UgQWRhcHRlciBDbGFzcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZUFkYXB0ZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX3Jlc291cmNlQWRhcHRlckNsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9yZXNvdXJjZUFkYXB0ZXJDbGFzc19mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JLyoKLQkgKiBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsgaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkgKiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JICogCi0JICogUmVzb3VyY2VBZGFwdGVyIGZfcmVzb3VyY2VBZGFwdGVyID0gKChSZXNvdXJjZUFkYXB0ZXIpb2JqZWN0KTsgSmNhUGFja2FnZSBwa2cgPQotCSAqIEpjYVBhY2thZ2UuZUlOU1RBTkNFOzsgLy8gVGhpcyBpcyBmb3IgdGhlIG1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiTWFuYWdlZCBDb25uZWN0aW9uCi0JICogRmFjdG9yeSBDbGFzcyIsICJUaGUgbWFuYWdlZCBjb25uZWN0aW9uIGZhY3RvcnkgY2xhc3MgcHJvcGVydHkgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIiLAotCSAqIHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlCi0JICogZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiQ29ubmVjdGlvbiBGYWN0b3J5Ci0JICogSW50ZXJmYWNlIiwgIlRoZSBjb25uZWN0aW9uIGZhY3RvcnkgaW50ZXJmYWNlIHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBjb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcwotCSAqIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkNvbm5lY3Rpb24gRmFjdG9yeQotCSAqIEltcGwgQ2xhc3MiLCAiVGhlIGNvbm5lY3Rpb24gZmFjdG9yeSBpbXBsIGNsYXNzIHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBjb25uZWN0aW9uSW50ZXJmYWNlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiQ29ubmVjdGlvbiBJbnRlcmZhY2UiLAotCSAqICJUaGUgY29ubmVjdGlvbiBpbnRlcmZhY2UgcHJvcGVydHkgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIiLAotCSAqIHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ubmVjdGlvbkltcGxDbGFzcyBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkNvbm5lY3Rpb24gSW1wbAotCSAqIENsYXNzIiwgIlRoZSBjb25uZWN0aW9uIGltcGwgY2xhc3MgcHJvcGVydHkgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIiLAotCSAqIHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkltcGxDbGFzcygpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgdHJhbnNhY3Rpb25TdXBwb3J0IGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVHJhbnNhY3Rpb24gU3VwcG9ydCIsCi0JICogIlRoZSB0cmFuc2FjdGlvbiBzdXBwb3J0IHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgcmVhdXRoZW50aWNhdGlvblN1cHBvcnQKLQkgKiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJSZWF1dGhlbnRpY2F0aW9uCi0JICogU3VwcG9ydCIsICJUaGUgcmVhdXRoZW50aWNhdGlvbiBzdXBwb3J0IHByb3BlcnR5IG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIiwKLQkgKiBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JICogCi0JICogfS8vIGlmIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IEFkZENvbW1hbmQgYW5kIFJlbW92ZUNvbW1hbmQgc3VwcG9ydCBpbiBjcmVhdGVDb21tYW5kLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJaW50IHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlQWRhcHRlcikKLQkJCQl2ZXJzaW9uID0gKChDb25uZWN0b3IpICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCkpLmdldFZlcnNpb25JRCgpOwotCi0JCQlzd2l0Y2ggKHZlcnNpb24pIHsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQgOgotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQgOgotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlcigpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5PYmplY3RzKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb25zKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCX0vLyBpZgotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0vLyBnZXRDaGlsZHJlblJlZmVyZW5jZXMKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIFJlc291cmNlQWRhcHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0vLyBnZXRQYXJlbnQKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSZXNvdXJjZUFkYXB0ZXIuZ2lmLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9yZXNvdXJjZV9hZGFwdGVyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldEltYWdlCi0KLQkvKioKLQkgKiBHZXQgdGhlIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGdldCB0aGUgbmFtZSBmb3IuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvLwkJUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9ICgoUmVzb3VyY2VBZGFwdGVyKSBvYmplY3QpOwotCQkvL3JldHVybiAiUmVzb3VyY2VBZGFwdGVyOiAiICsgcmVzb3VyY2VBZGFwdGVyLmdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ly8gZ2V0VGV4dAotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlQWRhcHRlci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlMgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVIgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25maWdQcm9wZXJ0eSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlcigpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5PYmplY3RzKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFkbWluT2JqZWN0KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIE5vdGlmaWVyCi0JICogICAgICAgICAgICBub3RpZmllciAtIE5vdGlmaWVzIG9mIGNoYW5nZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBldmVudFR5cGUgLSBUaGUgZXZlbnQgdHlwZS4KLQkgKiBAcGFyYW0gRU9iamVjdAotCSAqICAgICAgICAgICAgZmVhdHVyZSAtIFRoZSByZWZlcmVuY2Ugb2JqZWN0LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9sZFZhbHVlIC0gVGhlIG9sZCBvYmplY3QgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG5ld1ZhbHVlIC0gVGhlIG5ldyBvYmplY3QgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGluZGV4IC0gVGhlIGN1cnJlbnQgb2YgdGhlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBFT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTsKLQkJTm90aWZpY2F0aW9uIG1zZyA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KSBub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLmVDb250YWlubWVudEZlYXR1cmUoKSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0JCWlmIChmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb25zKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1NlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1NlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2E2NzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9TZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSBTZWN1cml0eVBlcm1pc3Npb24gb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSmNhSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5IC0gVGhlIGFkYXB0IGZhY3RvcnkuCi0JICovCi0JcHVibGljIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfS8vIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3BlY2lmaWNhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfU2VjdXJpdHlQZXJtaXNzaW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTcGVjaWZpY2F0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmljYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlY3VyaXR5UGVybWlzc2lvbl9zcGVjaWZpY2F0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlY3VyaXR5UGVybWlzc2lvbl9zcGVjaWZpY2F0aW9uX2ZlYXR1cmUiLCAiX1VJX1NlY3VyaXR5UGVybWlzc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbl9TcGVjaWZpY2F0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeyBpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCSAqIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkgKiAKLQkgKiBTZWN1cml0eVBlcm1pc3Npb24gZl9zZWN1cml0eVBlcm1pc3Npb24gPSAoKFNlY3VyaXR5UGVybWlzc2lvbilvYmplY3QpOyBKY2FQYWNrYWdlIHBrZyA9Ci0JICogSmNhUGFja2FnZS5lSU5TVEFOQ0U7OyAvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JICogKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJEZXNjcmlwdGlvbiIsICJUaGUKLQkgKiBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbiIsIHBrZy5nZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSwKLQkgKiB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHNwZWNpZmljYXRpb24gZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJTcGVjaWZpY2F0aW9uIiwgIlRoZQotCSAqIHNwZWNpZmljYXRpb24gcHJvcGVydHkgb2YgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb24iLAotCSAqIHBrZy5nZXRTZWN1cml0eVBlcm1pc3Npb25fU3BlY2lmaWNhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsKLQkgKiAKLQkgKiB9Ly8gaWYgcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOyB9Ly8gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycwotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBTZWN1cml0eVBlcm1pc3Npb24uCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VjdXJpdHlQZXJtaXNzaW9uLmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvc2VjdXJpdHlfcGVybWlzc2lvbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0KLQkvKioKLQkgKiBHZXQgdGhlIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGdldCB0aGUgbmFtZSBmb3IuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTZWN1cml0eVBlcm1pc3Npb24gc2VjdXJpdHlQZXJtaXNzaW9uID0gKChTZWN1cml0eVBlcm1pc3Npb24pIG9iamVjdCk7Ci0JCWlmIChzZWN1cml0eVBlcm1pc3Npb24uZ2V0RGVzY3JpcHRpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcl9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcl9VSV8wIikgKyAiOiAiICsgc2VjdXJpdHlQZXJtaXNzaW9uLmdldERlc2NyaXB0aW9uKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TUEVDSUZJQ0FUSU9OIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFNlY3VyaXR5UGVybWlzc2lvbl9TcGVjaWZpY2F0aW9uKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5NjAxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWNvbm5lY3Rvcl92YWxpZGF0b3JfVUlfPUNvbm5lY3RvciBWYWxpZGF0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQwNTg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkpjYU1vZHVsZUV4dGVuc2lvbiIKLSAgICAgICAgIG5hbWU9IkpjYU1vZHVsZUV4dGVuc2lvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJNb2R1bGVFeHRlbnNpb24iPgotICAgICAgPGVhck1vZHVsZUV4dGVuc2lvbgotICAgICAgICAgICAgZXh0ZW5zaW9uQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhTW9kdWxlRXh0ZW5zaW9uSW1wbCI+Ci0gICAgICA8L2Vhck1vZHVsZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVycy5KY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImpjYS54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb3ZpZGVycy5KY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iQ29ubmVjdG9yVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iJWNvbm5lY3Rvcl92YWxpZGF0b3JfVUlfIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPHByb2plY3ROYXR1cmUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICA8L3Byb2plY3ROYXR1cmU+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSJNQU5JRkVTVC5NRiI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9InJhci54bWwiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnZhbGlkYXRpb24uQ29ubmVjdG9ySGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uLlVJQ29ubmVjdG9yVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBQdXJwb3NlOiBEZWZpbmUgdGhlIGRlZmF1bHQgZGVwbG95YWJsZSBwcm9qZWN0IGZhY3RvcnkgICAgICAgICAgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogY29tLmlibS5ldG9vbHMuc2VydmVyLmNvcmUuZGVwbG95YWJsZUZhY3RvcmllcyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVGYWN0b3JpZXMiPgotICAgICAgPG1vZHVsZUZhY3RvcnkKLSAgICAgICAgICAgIHByb2plY3RzPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5Db25uZWN0b3IxXzNEZXBsb3lhYmxlRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2ZXIuY29ubmVjdG9yMTMiPgotICAgICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40IgotICAgICAgICAgICAgICAgdHlwZXM9ImoyZWUuY29ubmVjdG9yIj4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgIDwvbW9kdWxlRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsIj4KLSAgICAgIDxlZGl0TW9kZWwKLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5BcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkiPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBhdXRvbG9hZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBVUkk9Ik1FVEEtSU5GL3JhLnhtbCIvPgotICAgICAgPC9lZGl0TW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuYXJ0aWZhY3RlZGl0Ij4KLSAgICAgIDxhcnRpZmFjdGVkaXQKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdCI+Ci0gICAgICA8L2FydGlmYWN0ZWRpdD4KLSAgIDwvZXh0ZW5zaW9uPiAKLSAgIAotICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDwhLS0gQnVpbGRlciBQcm92aWRlciByZWdpc3RyYXRpb25zLS0+Ci0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+Ci0gICAgIAk8UHJvdmlkZXJEZWZpbmVzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9ImpzdC5jb25uZWN0b3IuYnVpbGRlciIKLSAgICAgIAkJcHJvdmlkZXJJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSmF2YUNvbXBvbmVudEJ1aWxkZXJEYXRhTW9kZWxQcm92aWRlciIvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjJlYTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuamNhIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZXMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlcyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLSAgCQk8Y29weSBmaWxlPSIke3BsdWdpbmRpcn0vcGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke291dHB1dERpcn0iLz4KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3Byb3BlcnR5X2ZpbGVzL3Jhci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTUxYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1MaWNlbnNlSXRlbVByb3ZpZGVyX1VJXzA9TGljZW5zZQotU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyX1VJXzA9U2VjdXJpdHlQZXJtaXNzaW9uCi1Db25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcl9VSV8wPUNvbmZpZ1Byb3BlcnR5Ci1fVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGU9UmVzb3VyY2VBZGFwdGVyCi1fVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZT1PdXRib3VuZFJlc291cmNlQWRhcHRlcgotX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX3R5cGU9Q29ubmVjdGlvbkRlZmluaXRpb24KLV9VSV9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGU9SW5ib3VuZFJlc291cmNlQWRhcHRlcgotX1VJX01lc3NhZ2VBZGFwdGVyX3R5cGU9TWVzc2FnZUFkYXB0ZXIKLV9VSV9NZXNzYWdlTGlzdGVuZXJfdHlwZT1NZXNzYWdlTGlzdGVuZXIKLV9VSV9BY3RpdmF0aW9uU3BlY190eXBlPUFjdGl2YXRpb25TcGVjCi1fVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZT1SZXF1aXJlZENvbmZpZ1Byb3BlcnR5Ci1fVUlfQWRtaW5PYmplY3RfdHlwZT1BZG1pbk9iamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmIxZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3Byb3BlcnR5X2ZpbGVzL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNPTk5FQ1RPUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXz1JV0FFMDAwMUUgRG9jdW1lbnQgdHlwZSB2ZXJzaW9uICJ7MH0iIGZvciByYXIueG1sIGluIHByb2plY3QgInsxfSIgbmVlZHMgdG8gYmUgdmVyc2lvbiAiezJ9Ii4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMWJmMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DcmVhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5vcGVyYXRpb25zLkZsZXhpYmxlSjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsI2dldERlZmF1bHRKMkVFTW9kdWxlVmVyc2lvbigpCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgZ2V0RGVmYXVsdENvbXBvbmVudFZlcnNpb24oKSB7Ci0JCWludCBoaWdoZXN0SjJFRVByZWYgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRIaWdoZXN0SjJFRVZlcnNpb25JRCgpOwotCQlzd2l0Y2ggKGhpZ2hlc3RKMkVFUHJlZikgewotCQkJY2FzZSAoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpIDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCk7Ci0JCQljYXNlIChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEKTsKLQkJCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRDb21wb25lbnRWZXJzaW9uRGVzY3JpcHRvcnMoKSB7Ci0JCWludCBoaWdoZXN0SjJFRVByZWYgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRIaWdoZXN0SjJFRVZlcnNpb25JRCgpOwotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG51bGw7Ci0JCXN3aXRjaCAoaGlnaGVzdEoyRUVQcmVmKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCQlkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMV07Ci0JCQkJZGVzY3JpcHRvcnNbMF0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQkJZGVmYXVsdCA6Ci0JCQkJZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzJdOwotCQkJCWRlc2NyaXB0b3JzWzBdID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEKSwgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVCk7Ci0JCQkJZGVzY3JpcHRvcnNbMV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQpLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNV9URVhUKTsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0TW9kdWxlVmVyc2lvblRvSjJFRVZlcnNpb24oaW50IG1vZHVsZVZlcnNpb24pIHsKLQkJc3dpdGNoIChtb2R1bGVWZXJzaW9uKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGNvbnZlcnRKMkVFVmVyc2lvblRvTW9kdWxlVmVyc2lvbihJbnRlZ2VyIGoyZWVWZXJzaW9uKSB7Ci0JCXN3aXRjaCAoajJlZVZlcnNpb24uaW50VmFsdWUoKSkgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCA6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0SjJFRVZlcnNpb25Ub01vZHVsZVZlcnNpb24oajJlZVZlcnNpb24pOwotCX0KLQotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0Q29tcG9uZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRSQVJGaWxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLnJhciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTVBPTkVOVF9WRVJTSU9OKSkgewotCQkJSW50ZWdlciBwcm9wZXJ0eVZhbHVlID0gKEludGVnZXIpIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCQkJc3dpdGNoIChwcm9wZXJ0eVZhbHVlLmludFZhbHVlKCkpIHsKLQkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQgOgotCQkJCQlkZXNjcmlwdGlvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8wX1RFWFQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCA6Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWRlc2NyaXB0aW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzVfVEVYVDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eVZhbHVlLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCX0KLQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5vcGVyYXRpb25zLkZsZXhpYmxlSjJFRUNyZWF0aW9uRGF0YU1vZGVsI2dldE1vZHVsZUlEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBvbmVudElEKCkgewotCQlyZXR1cm4gSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1BTklGRVNUX0ZPTERFUikpIHsKLQkJCXJldHVybiBJUGF0aC5TRVBBUkFUT1IgKyBDcmVhdGlvbkNvbnN0YW50cy5ERUZBVUxUX0NPTk5FQ1RPUl9TT1VSQ0VfRk9MREVSICArIElQYXRoLlNFUEFSQVRPUiArIEoyRUVDb25zdGFudHMuTUVUQV9JTkY7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQUREX1RPX0VBUikpIHsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRERfRk9MREVSKSkgewotCQkJcmV0dXJuIElQYXRoLlNFUEFSQVRPUiArIENyZWF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfQ09OTkVDVE9SX1NPVVJDRV9GT0xERVIgKyBJUGF0aC5TRVBBUkFUT1IgKyBKMkVFQ29uc3RhbnRzLk1FVEFfSU5GOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBVkFTT1VSQ0VfRk9MREVSKSkgewotCQkJcmV0dXJuIENyZWF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfQ09OTkVDVE9SX1NPVVJDRV9GT0xERVI7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIGRvU2V0ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSkFWQVNPVVJDRV9GT0xERVIpKXsKLQkJCS8vdW5sZXNzIE1BTklGRVNUIGZvbGRlciBpcyBvcGVuZWQgdXAsIGl0IGlzIHNldCBhcyBzYW1lIGFzIEphdmEgc291cmNlIGZvbGRlcgotCQkJc2V0UHJvcGVydHkoTUFOSUZFU1RfRk9MREVSLCBnZXRQcm9wZXJ0eShKQVZBU09VUkNFX0ZPTERFUikrICIvIiArIEoyRUVDb25zdGFudHMuTUVUQV9JTkYpOwotCQl9CQkKLQkJcmV0dXJuIGRvU2V0OwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzY5ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiBleHRlbmRzIEoyRUVDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFXzEwID0gInJhcnRwMTAueG1sIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfMTUgPSAicmFydHAxNS54bWwiOwotCi0KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW5kTGlua0oyRUVDb21wb25lbnRzRm9yTXVsdGlwbGVDb21wb25lbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCksIGdldE1vZHVsZURlcGxveU5hbWUoKSk7Ci0JCWNvbXBvbmVudC5jcmVhdGUoMCwgbnVsbCk7Ci0JCS8vIGNyZWF0ZSBhbmQgbGluayBjb25uZWN0b3JNb2R1bGUgU291cmNlIEZvbGRlcgotCQlJVmlydHVhbEZvbGRlciBjb25uZWN0b3JNb2R1bGVGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgCi0JCWNvbm5lY3Rvck1vZHVsZUZvbGRlci5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvIiArIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEpBVkFTT1VSQ0VfRk9MREVSKSksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBjcmVhdGUgYW5kIGxpbmsgTUVUQS1JTkYgZm9sZGVyCi0JCUlWaXJ0dWFsRm9sZGVyIG1ldGFJbmZGb2xkZXIgPSBjb25uZWN0b3JNb2R1bGVGb2xkZXIuZ2V0Rm9sZGVyKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpOwotCQltZXRhSW5mRm9sZGVyLmNyZWF0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFuZExpbmtKMkVFQ29tcG9uZW50c0ZvclNpbmdsZUNvbXBvbmVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpLCBnZXRNb2R1bGVEZXBsb3lOYW1lKCkpOwotCQljb21wb25lbnQuY3JlYXRlKDAsIG51bGwpOwotCQkvLyBjcmVhdGUgYW5kIGxpbmsgY29ubmVjdG9yTW9kdWxlIFNvdXJjZSBGb2xkZXIKLQkJSVZpcnR1YWxGb2xkZXIgY29ubmVjdG9yTW9kdWxlRm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIobmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQgICAgICAgIAotCQljb25uZWN0b3JNb2R1bGVGb2xkZXIuY3JlYXRlTGluayhuZXcgUGF0aCgiLyIgKyBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKQVZBU09VUkNFX0ZPTERFUikpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLy8gY3JlYXRlIGFuZCBsaW5rIE1FVEEtSU5GIGZvbGRlcgotCQlJVmlydHVhbEZvbGRlciBtZXRhSW5mRm9sZGVyID0gY29ubmVjdG9yTW9kdWxlRm9sZGVyLmdldEZvbGRlcihKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKTsKLQkJbWV0YUluZkZvbGRlci5jcmVhdGUoSVJlc291cmNlLkZPUkNFLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQlJbnRlZ2VyIHZlcnNpb24gPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQl2ZXJzaW9uID0gKEludGVnZXIpIG1vZGVsLmdldFByb3BlcnR5KENPTVBPTkVOVF9WRVJTSU9OKTsKLQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSAoQ29ubmVjdG9yKSBhcnRpZmFjdEVkaXQuY3JlYXRlTW9kZWxSb290KHZlcnNpb24uaW50VmFsdWUoKSk7Ci0JCQlhcnRpZmFjdEVkaXQuc2F2ZShtb25pdG9yKTsKLQkJCWNvbXBvbmVudCA9IGFydGlmYWN0RWRpdC5nZXRDb21wb25lbnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkKLQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQl9Ci0KLQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSk7Ci0JCUlGaWxlIGZpbGUgPSB2RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCi0JCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGZpbGUpOwotCi0JCVN0cmluZyB0ZW1wbGF0ZSA9IHZlcnNpb24uaW50VmFsdWUoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEID8gVEVNUExBVEVfMTAgOiBURU1QTEFURV8xNTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0odGVtcGxhdGUpOwotCQlpZiAoaW4gIT0gbnVsbCAmIG91dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUFyY2hpdmVVdGlsLmNvcHkoaW4sIG91dCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaW9lKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKG51bGwgIT0gb3V0KSB7Ci0JCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQkJfQotCQkJCQlpZiAobnVsbCAhPSBpbikgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaW9lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGNvbXBvbmVudCk7Ci0JCQlDb25uZWN0b3IgY29ubmVjdG9yID0gYXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvcigpOwotCQkJaWYgKGNvbm5lY3RvciAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gY29tcG9uZW50LmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwpCi0JCQkJCWNvbm5lY3Rvci5zZXREaXNwbGF5TmFtZShwcm9qZWN0TmFtZSk7Ci0JCQl9Ci0JCQlhcnRpZmFjdEVkaXQuc2F2ZShtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkKLQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCWludCB2ZXJzaW9uID0gbW9kZWwuZ2V0SW50UHJvcGVydHkoQ09NUE9ORU5UX1ZFUlNJT04pOwotCQlyZXR1cm4gSjJFRVZlcnNpb25VdGlsLmdldEpDQVRleHRWZXJzaW9uKHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJc3VwZXIuZXhlY3V0ZShJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1MTU4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihtb2RlbCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50SUQoKSB7Ci0gICAgICAgIHJldHVybiBJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0V3JvbmdDb21wb25lbnRUeXBlU3RyaW5nKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLk5PVF9BX1JBUiwgbmV3IE9iamVjdFtde3Byb2plY3ROYW1lfSk7ICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRXh0ZW5zaW9uKCkgewotICAgICAgICByZXR1cm4gIi5yYXIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIC8qKgotICAgICAqIEV4cG9ydHMgdGhlIHNwZWNpZmllZCBDb25uZWN0b3IgTW9kdWxlIHByb2plY3QgdG8gdGhlIHNwZWNpZmllZCBDb25uZWN0b3IgUkFSIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbm5lY3RvclByb2plY3ROYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ29ubmVjdG9yIE1vZHVsZSBwcm9qZWN0IHRvIGV4cG9ydC4KLSAgICAgKiBAcGFyYW0gcmFyRmlsZU5hbWUKLSAgICAgKiAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgQ29ubmVjdG9yIFJBUiBmaWxlIGxvY2F0aW9uIHRvIGV4cG9ydCB0aGUgc3BlY2lmaWVkIENvbm5lY3RvcgotICAgICAqICAgICAgICAgICAgTW9kdWxlIHByb2plY3QuCi0gICAgICogQHBhcmFtIG92ZXJ3cml0ZUV4aXN0aW5nCi0gICAgICogICAgICAgICAgICBJZiB0aGlzIGlzIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gYW4gZXhpc3RpbmcgZmlsZSBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5Ci0gICAgICogICAgICAgICAgICA8Y29kZT5lYXJGaWxlTmFtZTwvY29kZT4gd2lsbCBiZSBvdmVyd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gZXhwb3J0U291cmNlCi0gICAgICogICAgICAgICAgICBJZiB0aGlzIGlzIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIENvbm5lY3RvcgotICAgICAqICAgICAgICAgICAgTW9kdWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBDb25uZWN0b3IgUkFSIGZpbGUuCi0gICAgICogQHBsYW5uZWRmb3IgV1RQIDEuMAotICAgICAqLwotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4cG9ydFByb2plY3QoU3RyaW5nIGNvbm5lY3RvclByb2plY3ROYW1lLCBTdHJpbmcgcmFyRmlsZU5hbWUsIGJvb2xlYW4gb3ZlcndyaXRlRXhpc3RpbmcsIGJvb2xlYW4gZXhwb3J0U291cmNlKSB7Ci0vLyAgICAgICAgQ29ubmVjdG9yTW9kdWxlRXhwb3J0RGF0YU1vZGVsIGRhdGFNb2RlbCA9IG5ldyBDb25uZWN0b3JNb2R1bGVFeHBvcnREYXRhTW9kZWwoKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FLCBjb25uZWN0b3JQcm9qZWN0TmFtZSk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShPVkVSV1JJVEVfRVhJU1RJTkcsIG92ZXJ3cml0ZUV4aXN0aW5nKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoQVJDSElWRV9ERVNUSU5BVElPTiwgcmFyRmlsZU5hbWUpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRVhQT1JUX1NPVVJDRV9GSUxFUywgZXhwb3J0U291cmNlKTsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLnJ1bihudWxsKTsKLS8vICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8gICAgICAgIH0KLS8vICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliZjBkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgZGF0YU1vZGVsIGlzIHVzZWQgZm9yIHRvIGltcG9ydCBDb25uZWN0b3IgTW9kdWxlcyAoZnJvbSBSQVIgZmlsZXMpIGludG8gdGhlIHdvcmtzcGFjZS4KLSAqIAotICogVGhpcyBjbGFzcyAoYW5kIGFsbCBpdHMgZmllbGRzIGFuZCBtZXRob2RzKSBpcyBsaWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgV1RQIDEuMCBtaWxlc3RvbmVzIGFzCi0gKiB0aGUgbmV3IHByb2plY3Qgc3RydWN0dXJlcyBhcmUgYWRvcHRlZC4gVXNlIGF0IHlvdXIgb3duIHJpc2suCi0gKiAKLSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJc2V0SW50UHJvcGVydHkoSUNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFhNTFJlc291cmNlLlJBUl9UWVBFOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5BcmNoaXZlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmUgYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuUkFSRmlsZShnZXRBcmNoaXZlT3B0aW9ucygpLCB1cmkpOwotCQlyZXR1cm4gYXJjaGl2ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbihtb2RlbCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTdjNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkoyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbiBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVEVOU0lPTiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9FeGVjdXRlKG1vbml0b3IpOwotCQlhZGRBc3NvY2lhdGVBcmNoaXZlc1RvQ2xhc3NQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbGwgamFyIHdpdGhpbiB0aGUgZmlsZSB0byB0aGUgY2xhc3NwYXRoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc29jaWF0ZUFyY2hpdmVzVG9DbGFzc1BhdGgoKSB7Ci0JCUxpc3QgZXh0cmFFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFyY2hpdmVMaXN0ID0gbW9kdWxlRmlsZS5nZXRBcmNoaXZlRmlsZXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhcmNoaXZlTGlzdC5pdGVyYXRvcigpOwotCQlJVmlydHVhbEZpbGUgdkZpbGUgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSAoQXJjaGl2ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFuQXJjaGl2ZS5nZXROYW1lKCkuZW5kc1dpdGgoSkFSX0VYVEVOU0lPTikpIHsKLQkJCQl2RmlsZSA9IHZpcnR1YWxDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoYW5BcmNoaXZlLmdldFVSSSgpKTsKLQkJCQlpZiAodkZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJZmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkJCWV4dHJhRW50cmllcy5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGZpbGUuZ2V0RnVsbFBhdGgoKSwgZmlsZS5nZXRGdWxsUGF0aCgpLCBudWxsLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlhZGRUb0NsYXNzcGF0aChnZXREYXRhTW9kZWwoKSwgZXh0cmFFbnRyaWVzKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlDb25uZWN0b3JDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIHNhdmVTdHJhdCA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKGNvbXBvbmVudCk7Ci0JCXJldHVybiBzYXZlU3RyYXQ7Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YjdkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotLyoqCi0gKiA8cD4KLSAqIElDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgcHJvdmlkZXMgcHJvcGVydGllcyB0byB0aGUgCi0gKiBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGFzIHdlbGwgYXMgYWxsIGV4dGVuZGluZyBpbnRlcmZhY2VzIGV4dGVuZGluZyAKLSAqIElDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXMKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFkZmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvSUNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLS8qKgotICogPHA+Ci0gKiBJQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLlwKLSAqIE5PVEU6IFRoZSBhc3NvY2lhdGVkIFByb3ZpZGVyIGFuZCBPcGVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZCBkdXJpbmcgTTUKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXMKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTI0YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotLyoqCi0gKiA8cD4KLSAqIElDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIENvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLgotICogTk9URTogVGhlIGFzc29jaWF0ZWQgUHJvdmlkZXIgYW5kIE9wZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGR1cmluZyBNNQotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvcmFydHAxMC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL3JhcnRwMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDViYzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvcmFydHAxMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGNvbm5lY3RvciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBDb25uZWN0b3IgMS4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xXzAuZHRkIj4KLTxjb25uZWN0b3I+Ci0JPGRpc3BsYXktbmFtZT48L2Rpc3BsYXktbmFtZT4KLQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAJPHZlbmRvci1uYW1lPjwvdmVuZG9yLW5hbWU+Ci0gIAk8c3BlYy12ZXJzaW9uPjwvc3BlYy12ZXJzaW9uPgotICAJPGVpcy10eXBlPjwvZWlzLXR5cGU+Ci0gIAk8dmVyc2lvbj48L3ZlcnNpb24+Ci0gIAk8bGljZW5zZT4KLSAgCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gICAKLSAgICAJPGxpY2Vuc2UtcmVxdWlyZWQ+ZmFsc2U8L2xpY2Vuc2UtcmVxdWlyZWQ+ICAgCi0gICAgPC9saWNlbnNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAk8cmVzb3VyY2VhZGFwdGVyPgotICAJCTxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+PC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0gIAkJPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT48L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLSAgICAJPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+PC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotICAgIAk8Y29ubmVjdGlvbi1pbnRlcmZhY2U+PC9jb25uZWN0aW9uLWludGVyZmFjZT4KLSAgICAJPGNvbm5lY3Rpb24taW1wbC1jbGFzcz48L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLSAgICAJPHRyYW5zYWN0aW9uLXN1cHBvcnQ+PC90cmFuc2FjdGlvbi1zdXBwb3J0PgotICAJCTxjb25maWctcHJvcGVydHk+Ci0gICAgIAkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gICAgICAJCTxjb25maWctcHJvcGVydHktbmFtZT48L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgCQk8Y29uZmlnLXByb3BlcnR5LXR5cGU+PC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgIAkJPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT48L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAJIDwvY29uZmlnLXByb3BlcnR5PgotICAgIAk8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgCSAJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gICAgICAJIAk8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+PC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgCSAJPGNyZWRlbnRpYWwtaW50ZXJmYWNlPjwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgCTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgIAk8cmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PmZhbHNlPC9yZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+Ci0gICAgCTxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgIAkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gICAgCQk8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgCQk8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAJPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAJPC9yZXNvdXJjZWFkYXB0ZXI+Ci08L2Nvbm5lY3Rvcj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvcmFydHAxNS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL3JhcnRwMTUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjk1NjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvcmFydHAxNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbm5lY3RvciBpZD0iQ29ubmVjdG9yX0lEIiB2ZXJzaW9uPSIxLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV81LnhzZCI+IAotCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotCTxkaXNwbGF5LW5hbWU+PC9kaXNwbGF5LW5hbWU+Ci0gCTx2ZW5kb3ItbmFtZT48L3ZlbmRvci1uYW1lPgotICAJPGVpcy10eXBlPjwvZWlzLXR5cGU+Ci0gIAk8cmVzb3VyY2VhZGFwdGVyLXZlcnNpb24+PC9yZXNvdXJjZWFkYXB0ZXItdmVyc2lvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAk8cmVzb3VyY2VhZGFwdGVyPgotICAJPC9yZXNvdXJjZWFkYXB0ZXI+Ci08L2Nvbm5lY3Rvcj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL21vZHVsZS91dGlsL0Nvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvbW9kdWxlL3V0aWwvQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZGU3ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvbW9kdWxlL3V0aWwvQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5tb2R1bGUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbC5Db25uZWN0b3JBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JFZGl0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LkFEQVBURVJfVFlQRSB8fCBhZGFwdGVyVHlwZSA9PSBBcnRpZmFjdEVkaXQuQURBUFRFUl9UWVBFKSB7Ci0JCQlBcnRpZmFjdEVkaXRNb2RlbCBlZGl0TW9kZWwgPSAoQXJ0aWZhY3RFZGl0TW9kZWwpIGFkYXB0YWJsZU9iamVjdDsKLQkJCWlmIChlZGl0TW9kZWwuZ2V0TW9kdWxlVHlwZSgpLmVxdWFscyhDb25uZWN0b3JBcnRpZmFjdEVkaXQuVFlQRV9JRCkpCi0JCQkJcmV0dXJuIG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtBcnRpZmFjdEVkaXQuY2xhc3MsIENvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeS5jbGFzc307Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9Db25uZWN0b3JBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9Db25uZWN0b3JBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4NmM5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9tb2R1bGVjb3JlL3V0aWwvQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSUFydGlmYWN0RWRpdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byBKMkVFIENvbm5lY3RvciBtb2RlbHMgdXNpbmcgdGhlIEFydGlmYWN0RWRpdCBwYXR0ZXJuLgotICogPHA+Ci0gKiBDbGllbnRzIHNob3VsZCB1c2UgZ2V0Q29ubmVjdG9yQXJ0aWZhY3RGb3JSZWFkL1dyaXRlKCkgdG8gYWNxdWlyZSBhbiBpbnN0YW5jZQotICogb2YgdGhlIGNvcnJlY3QgYXJ0aWZhY3QgZWRpdCBjbGFzcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvckFydGlmYWN0RWRpdCBleHRlbmRzIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgaW1wbGVtZW50cyBJQXJ0aWZhY3RFZGl0RmFjdG9yeSB7Ci0JLyoqCi0JICogPHA+Ci0JICogSWRlbnRpZmllciB1c2VkIHRvIGxpbmsgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IHRvIGEKLQkgKiBDb25uZWN0b3JFZGl0QWRhcHRlckZhY3Rvcnkge0BzZWUgQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4KLQkgKiBhbiBBZGFwdGVyTWFuZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmNsYXNzOwotCi0JLyoqCi0JICogPHA+Ci0JICogSWRlbnRpZmllciB1c2VkIHRvIGdyb3VwIGFuZCBxdWVyeSBjb21tb24gYXJ0aWZhY3QgZWRpdHMuCi0JICogPC9wPgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9JRCA9IElNb2R1bGVDb25zdGFudHMuSlNUX0NPTk5FQ1RPUl9NT0RVTEU7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhSGFuZGxlCi0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIENvbm5lY3RvckFydGlmYWN0RWRpdChJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkFydGlmYWN0RWRpdE1vZGVsCi0JICovCi0KLQlwdWJsaWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsIGFuQXJ0aWZhY3RFZGl0TW9kZWwpIHsKLQkJc3VwZXIoYW5BcnRpZmFjdEVkaXRNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfWZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0KLQlwdWJsaWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIENvbm5lY3RvclJlc291cmNlIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkKLQkgKi8KLQotCXB1YmxpYyBDb25uZWN0b3JSZXNvdXJjZSBnZXRDb25uZWN0b3JYbWlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChDb25uZWN0b3JSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZwotCSAqIGRlZmluZWQgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICovCi0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJX09CSik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgQ29ubmVjdG9yIChAc2VlIENvbm5lY3Rvcikgcm9vdCBvYmplY3QgZnJvbSB0aGUKLQkgKiBDb25uZWN0b3JSZXNvdXJjZS4gSWYgdGhlIHJvb3Qgb2JqZWN0IGRvZXMgbm90IGV4aXN0LCB0aGVuIG9uZSBpcyBjcmVhdGVkCi0JICogKEBsaW5rIGFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KGdldENvbm5lY3RvclhtaVJlc291cmNlKCkpKS4gVGhlIHJvb3QKLQkgKiBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQlMaXN0IGNvbnRlbnRzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCk7Ci0JCWlmIChjb250ZW50cy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCWFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KGdldENvbm5lY3RvclhtaVJlc291cmNlKCkpOwotCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3Qgb2JqZWN0IChDb25uZWN0b3IpIGFuZCBwb3B1bGF0ZXMKLQkgKiB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3Qgb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9IE5vdGU6IFRoaXMgbWV0aG9kCi0JICogICAgICAgICAgICBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqICAgICAgICAgICAgPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KFhNTFJlc291cmNlIGFSZXNvdXJjZSkgewotCi0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25uZWN0b3IoKTsKLQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChjb25uZWN0b3IpOwotCQkJVVJJIG1vZHVsZVVSSSA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0TW9kdWxlVVJJKCk7Ci0JCQl0cnkgewotCQkJCWNvbm5lY3Rvci5zZXREaXNwbGF5TmFtZShTdHJ1Y3R1cmVFZGl0LmdldERlcGxveWVkTmFtZShtb2R1bGVVUkkpKTsKLQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQlhUmVzb3VyY2Uuc2V0SUQoY29ubmVjdG9yLCBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9JRCk7Ci0JCQkvLyBUT0RPIGFkZCBtb3JlIG1hbmRhdG9yeSBlbGVtZW50cwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpc1ZhbGlkQ29ubmVjdG9yTW9kdWxlKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KSkpCi0JCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdChhUHJvamVjdCwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogICAgICAgICBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGlzVmFsaWRDb25uZWN0b3JNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QpKSkKLQkJCQlhcnRpZmFjdEVkaXQgPSBuZXcgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgdGhhdAotCSAqIGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvCi0JICogICAgICAgICByZWFkIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBjb3VsZCBub3QgcmVzb2x2ZSB1cmkuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNWYWxpZENvbm5lY3Rvck1vZHVsZShhTW9kdWxlKSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCQlyZXR1cm4gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHV1ZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIENvbm5lY3RvckFydGlmYWN0RWRpdCB0aGF0Ci0JICogYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5Ci0JICogICAgICAgICBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbm5lY3RvckFydGlmYWN0RWRpdCBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNWYWxpZENvbm5lY3Rvck1vZHVsZShhTW9kdWxlKSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCQlyZXR1cm4gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB1dWUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZHVsZQotCSAqICAgICAgICAgICAgQSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoV29ya2JlbmNoQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDb25uZWN0b3JNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWRFZGl0YWJsZU1vZHVsZShhTW9kdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfQ29ubmVjdG9yX01PRFVMRSB0eXBlICovCi0JCWlmICghVFlQRV9JRC5lcXVhbHMoYU1vZHVsZS5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyBKMkVFIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBDb25uZWN0b3JSZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBTcGVjIHZlcnNpb24KLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRDb25uZWN0b3JYbWlSZXNvdXJjZSgpLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIENvbm5lY3RvciBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHsKLQkJcmV0dXJuIChDb25uZWN0b3IpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChqYXZhLmxhbmcuSW50ZWdlcikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24pIHsKLQkJQ29ubmVjdG9yUmVzb3VyY2UgcmVzID0gKENvbm5lY3RvclJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiAoKENvbm5lY3RvclJlc291cmNlKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpLmdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQkKLQkJcmV0dXJuIGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoYUNvbXBvbmVudCk7Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JXcml0ZShhQ29tcG9uZW50KTsKLQl9Ci0JCi0JcHVibGljIEFyY2hpdmUgYXNBcmNoaXZlKGJvb2xlYW4gaW5jbHVkZVNvdXJjZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uewotCQlDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxvYWRlciA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpKTsKLQkJbG9hZGVyLnNldEV4cG9ydFNvdXJjZShpbmNsdWRlU291cmNlKTsKLQkJU3RyaW5nIHVyaSA9IE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGdldENvbXBvbmVudCgpKTsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuUkFSRmlsZShsb2FkZXIsIHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvbW9kdWxlY29yZS91dGlsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvbW9kdWxlY29yZS91dGlsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDI4YmI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5XZWJBcnRpZmFjdEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGFwaS4gVGhpcyBhcGkgaXMgdXNlZCB0byB3b3JrIHdpdGggdGhlIGVtZiBtb2RlbAotICAgICAgICBvZiBhIGZsZXhpYmxlIGNvbm5lY3RvciBtb2R1bGUuIEl0IGNvbnRhaW5zIGFwaSB0byByZWFkIGFuZCBzZXJpYWxpemUgb3V0IHRoZSBlbWYgbW9kZWwgZm9yIGNvbm5lY3RvciBtb2R1bGVzLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmNkdHByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2R0cHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzODhiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2R0cHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4NCi0NCi08Y2R0cHJvamVjdD4NCi08ZGF0YT4NCi08aXRlbSBpZD0iY2R0X2luZGV4ZXIiPg0KLTxpbmRleEVuYWJsZWQgaW5kZXhWYWx1ZT0idHJ1ZSIvPg0KLTwvaXRlbT4NCi08L2RhdGE+DQotPC9jZHRwcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjRkYzVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImoyZWUtbmF2aWdhdG9yLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjYTRhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWoyZWUtbmF2aWdhdG9yLmphcgotQGRvdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1NmQxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ZlNTA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNy4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLkoyRUVOYXZpZ2F0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQbHVnaW4ucHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC53b3JraW5nc2V0cwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdCwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuamR0LnVpLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5qYXZhLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkMGI3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGNvbS5pYm0ud3RwLmoyZWUudWkubmF2aWdhdG9yLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gY29tLmlibS53dHAuajJlZS51aS5uYXZpZ2F0b3IvCi1zb3VyY2UuLiA9IGoyZWUtbmF2aWdhdG9yLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvSjJFRVBlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL0oyRUVQZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NTY1NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvSjJFRVBlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY4NDI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzYWYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Vhcmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWIzZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9lamJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGFkYjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYjI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjgzMzAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTY2N2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzBiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2Q0MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYjNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDg1OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTkyMDFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NGI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjI1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjMDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlODZhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlYzZiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQwOWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkYTIyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpicHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhY2Q0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF9kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYxY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTc3YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jb25uZWN0b3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTBkNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VudGVycHJpc2VfYXBwX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMTljNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlOTYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDdmYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0b3Jfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFmOGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZTc2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnByb2plY3Rfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2VqYnByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyYWExZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYXBwY2xpZW50X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTUzOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzI3ZmE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lamJqYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lamJqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjYTc5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfcmFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfcmFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDdmMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUxMjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxYTMxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzU0ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTIzNTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5ZGZmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfcmFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDI3NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2NGUyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2pjdV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvamN1X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTczYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvamN1X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zZXJ2bGV0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NlcnZsZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFiZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NlcnZsZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2I4YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2Vzc2lvbkJlYW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkY2IzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zcnZjZV9lbGVtX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0ZDM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2Vic2VydmljZWRlc2MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2Vic2VydmljZWRlc2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dzZGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODFhODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRU1GTW9kZWxNYW5hZ2VyIHsKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHVibGljIGFic3RyYWN0IE9iamVjdFtdIGdldE1vZGVscygpOwotCXB1YmxpYyBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JcHVibGljIGZpbmFsIEVNRlJvb3RPYmplY3RQcm92aWRlciBnZXRFTUZSb290T2JqZWN0UHJvdmlkZXIoKXsKLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQlwdWJsaWMgRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgYVByb3ZpZGVyKSB7Ci0JCXByb2plY3QgPSBhUHJvamVjdDsKLQkJcHJvdmlkZXIgPSBhUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhZmZlY3RlZFByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0KSB7Ci0JCXByb3ZpZGVyLm5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwM2ZmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBFTUZNb2RlbE1hbmFnZXIgY3JlYXRlRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IHByb2plY3QsIEVNRlJvb3RPYmplY3RQcm92aWRlciBwcm92aWRlcikgewotCQlib29sZWFuIGZsZXhpYmxlID0gIChNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCkgIT0gbnVsbCk7Ci0JCUVNRk1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCQlpZiAoZmxleGlibGUpCi0JCQltb2RlbE1hbmFnZXIgPSBuZXcgRmxleGlibGVFTUZNb2RlbE1hbmFnZXIocHJvamVjdCxwcm92aWRlcik7Ci0JCWVsc2UKLQkJCW1vZGVsTWFuYWdlciA9IG5ldyBOb25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlcihwcm9qZWN0LHByb3ZpZGVyKTsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZSb290T2JqZWN0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI1OGJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZSb290T2JqZWN0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRU1GUm9vdE9iamVjdE1hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQotCi0JcHJpdmF0ZSBmaW5hbCBNYXAgcHJvamVjdEVkaXRNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgZmluYWwgTWFwIHByb2plY3RSb290T2JqZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciB7Ci0JCXZvaWQgb25SZWZyZXNoKE9iamVjdCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVNRlJvb3RPYmplY3RNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByb2plY3RFZGl0TW9kZWxzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLQkJT2JqZWN0W10ga2V5cyA9IHByb2plY3RFZGl0TW9kZWxzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBwcm9qZWN0RWRpdE1vZGVscy5yZW1vdmUoa2V5c1tpXSk7Ci0JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJvb3RPYmplY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJT2JqZWN0IHJvb3RPYmplY3QgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHByb2plY3RSb290T2JqZWN0cykgewotCQkJcm9vdE9iamVjdCA9IHByb2plY3RSb290T2JqZWN0cy5nZXQocHJvamVjdCk7Ci0KLQkJCWlmIChyb290T2JqZWN0ID09IG51bGwgfHwgKChFT2JqZWN0KSByb290T2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVkaXRNb2RlbEZvclByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXJvb3RPYmplY3QgPSBlZGl0TW9kZWwuZ2V0UHJpbWFyeVJvb3RPYmplY3QoKTsKLQkJCQkJcHJvamVjdFJvb3RPYmplY3RzLnB1dChwcm9qZWN0LCByb290T2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RPYmplY3Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHByb2plY3RFZGl0TW9kZWxzKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBwcm9qZWN0RWRpdE1vZGVscy5nZXQocHJvamVjdCk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoZWRpdE1vZGVsID09IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGFydGlmYWN0RWRpdC5nZXRBZGFwdGVyKEVkaXRNb2RlbC5jbGFzcyk7Ci0JCQkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQllZGl0TW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCQkJYWRkTWFwcGluZyhwcm9qZWN0LCBlZGl0TW9kZWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0IT1udWxsKQotCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZyhJUHJvamVjdCBwcm9qZWN0LCBFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCXByb2plY3RFZGl0TW9kZWxzLnB1dChwcm9qZWN0LCBlZGl0TW9kZWwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gYW5FdmVudC5nZXRFZGl0TW9kZWwoKS5nZXRQcm9qZWN0KCk7Ci0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSA6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiB7Ci0JCQkJT2JqZWN0IG9sZFJvb3RPYmplY3QgPSBwcm9qZWN0Um9vdE9iamVjdHMucmVtb3ZlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJaWYgKG9sZFJvb3RPYmplY3QgIT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlNBVkUgOiB7Ci0JCQkJT2JqZWN0IG9sZFJvb3RPYmplY3QgPSBwcm9qZWN0Um9vdE9iamVjdHMuZ2V0KGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJaWYgKG9sZFJvb3RPYmplY3QgPT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFIDoKLQkJCQlkaXNwb3NlQ2FjaGUoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgbGlzdGVuZXJzLnNpemUoKTsgKyt4KSB7Ci0JCQlJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciByZWZyZXNoSGFuZGxlciA9IChJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcikgbGlzdGVuZXJzLmdldCh4KTsKLQkJCXJlZnJlc2hIYW5kbGVyLm9uUmVmcmVzaChhUHJvamVjdCk7Ci0JCX0KLQotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCi0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdChFTUZSb290T2JqZWN0TWFuYWdlci50aGlzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBzd3RlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHN3dGUpOwotCQkJfSBjYXRjaCAoU1dURXJyb3Igc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJYm9vbGVhbiBwcm9qZWN0T3BlblN0YXRlQ2hhbmdlZCA9ICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApOwotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwgcHJvamVjdE9wZW5TdGF0ZUNoYW5nZWQpCi0JCQkJCQlkaXNwb3NlQ2FjaGUoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlQ2FjaGUoSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0KSB7Ci0JCXN5bmNocm9uaXplZCAocHJvamVjdEVkaXRNb2RlbHMpIHsKLQkJCXByb2plY3RSb290T2JqZWN0cy5yZW1vdmUoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSRU1PVklORyBlZGl0IG1vZGVsOiAiICsgYWZmZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcHJvamVjdEVkaXRNb2RlbHMucmVtb3ZlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVNT1ZFRCBlZGl0IG1vZGVsICIgKyBhZmZlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJCWVkaXRNb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVMRUFTRUQgZWRpdCBtb2RlbCAiICsgYWZmZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGdldExpc3RlbmVycygpKSB7Ci0JCQlpZiAoYUxpc3RlbmVyICE9IG51bGwgJiYgIWdldExpc3RlbmVycygpLmNvbnRhaW5zKGFMaXN0ZW5lcikpCi0JCQkJZ2V0TGlzdGVuZXJzKCkuYWRkKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLnJlbW92ZShhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6NDI6NTggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GUm9vdE9iamVjdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzk3NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVNRlJvb3RPYmplY3RQcm92aWRlciBpbXBsZW1lbnRzICBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yewotCXByaXZhdGUgZmluYWwgSGFzaE1hcCBlbWZNb2RlbENhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGZpbmFsIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgewotCQl2b2lkIG9uUmVmcmVzaChPYmplY3QgZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU1GUm9vdE9iamVjdFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldE1vZGVscyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJdHJ5IHsKLQkJRU1GTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IChFTUZNb2RlbE1hbmFnZXIpIGVtZk1vZGVsQ2FjaGUuZ2V0KHByb2plY3QpOwotCQlpZiAobW9kZWxNYW5hZ2VyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoZW1mTW9kZWxDYWNoZSkgewotCQkJCW1vZGVsTWFuYWdlcj0gRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5jcmVhdGVFTUZNb2RlbE1hbmFnZXIocHJvamVjdCx0aGlzKSA7Ci0JCQkJZW1mTW9kZWxDYWNoZS5wdXQocHJvamVjdCxtb2RlbE1hbmFnZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy9leC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KEVNRlJvb3RPYmplY3RQcm92aWRlci50aGlzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBzd3RlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHN3dGUpOwotCQkJfSBjYXRjaCAoU1dURXJyb3Igc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlib29sZWFuIHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkID0gKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCk7Ci0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fCBwcm9qZWN0T3BlblN0YXRlQ2hhbmdlZCkgewotCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQlkaXNwb3NlKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgcmV0dXJuOwotCQlFTUZNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gKEVNRk1vZGVsTWFuYWdlcikgZW1mTW9kZWxDYWNoZS5yZW1vdmUocHJvamVjdCk7Ci0JCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJbW9kZWxNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJRU1GTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCU9iamVjdFtdIGtleXMgPSBlbWZNb2RlbENhY2hlLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQltb2RlbE1hbmFnZXIgPSAoRU1GTW9kZWxNYW5hZ2VyKSBlbWZNb2RlbENhY2hlLnJlbW92ZShrZXlzW2ldKTsKLQkJCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1vZGVsTWFuYWdlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVByb2plY3QgYVByb2plY3QpIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBsaXN0ZW5lcnMuc2l6ZSgpOyArK3gpIHsKLQkJCUlSZWZyZXNoSGFuZGxlckxpc3RlbmVyIHJlZnJlc2hIYW5kbGVyID0gKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyKSBsaXN0ZW5lcnMuZ2V0KHgpOwotCQkJcmVmcmVzaEhhbmRsZXIub25SZWZyZXNoKGFQcm9qZWN0KTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlZnJlc2hIYW5kbGVyTGlzdGVuZXIoSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAoZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWlmIChhTGlzdGVuZXIgIT0gbnVsbCAmJiAhZ2V0TGlzdGVuZXJzKCkuY29udGFpbnMoYUxpc3RlbmVyKSkKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGQoYUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIoSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgNDo0Mjo1OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0ZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MGUxNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0ZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGbGV4aWJsZUVNRk1vZGVsTWFuYWdlciBleHRlbmRzIEVNRk1vZGVsTWFuYWdlciBpbXBsZW1lbnRzIEVkaXRNb2RlbExpc3RlbmVyewotCi0JcHJpdmF0ZSBMaXN0IHJvb3RPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVCA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0IGFydGlmYWN0RWRpdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmU7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0ID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgRmxleGlibGVFTUZNb2RlbE1hbmFnZXIoSVByb2plY3QgYVByb2plY3QsIEVNRlJvb3RPYmplY3RQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihhUHJvamVjdCxwcm92aWRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNnZXRNb2RlbHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRNb2RlbHMoKSB7Ci0JCXRyeSB7Ci0JCQotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCWlmICggcHJvamVjdD09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIEVNUFRZX09CSkVDVDsKLQkJCQotCQkJc3luY2hyb25pemVkIChyb290T2JqZWN0cykgewotCQkJCWlmICghaXNWYWxpZChyb290T2JqZWN0cykpIHsKLQkJCQkJcm9vdE9iamVjdHMgPSBnZXRSb290T2JqZWN0cygpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAocm9vdE9iamVjdHMgIT0gbnVsbCkgewotCQkJIHJldHVybiByb290T2JqZWN0cy50b0FycmF5KCkgOwotCQl9Ci0JCXJldHVybiBFTVBUWV9PQkpFQ1Q7Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKExpc3Qgcm9vdE9iamVjdHMpIHsKLQkJaWYgKHJvb3RPYmplY3RzID09IG51bGwgfHwgcm9vdE9iamVjdHMuc2l6ZSgpPT0wKSAKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgeD0wOyB4PCByb290T2JqZWN0cy5zaXplKCk7ICsreCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHJvb3RPYmplY3RzLmdldCh4KTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwgJiYgZU9iamVjdC5lUmVzb3VyY2UoKSA9PSBudWxsKSAKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRSb290T2JqZWN0cygpIHsKLQkgIAkgIExpc3QgYXJ0aWZhY3RzID0gZ2V0QXJ0aWZhY3RFZGl0cygpOwotCSAgCSAgTGlzdCBmbGV4aWJsZU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAJICBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkgIAkgIEVPYmplY3QgY29udGVudE1vZGVsUm9vdCA9IG51bGw7Ci0JICAJICBmb3IgKGludCB4PTA7IHg8IGFydGlmYWN0cy5zaXplKCk7ICsreCkgewotCSAgCSAgCSBhcnRpZmFjdEVkaXQgPSAoQXJ0aWZhY3RFZGl0KWFydGlmYWN0cy5nZXQoeCk7Ci0JICAJICAgICBjb250ZW50TW9kZWxSb290ID0gYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJCSBpZiAoY29udGVudE1vZGVsUm9vdCAhPSBudWxsKSB7Ci0JCSAgCSAgICAgZmxleGlibGVPYmplY3RzLmFkZChjb250ZW50TW9kZWxSb290KTsKLQkJICAJICAgICBhcnRpZmFjdEVkaXRUb1Jvb3RPYmplY3QucHV0KGFydGlmYWN0RWRpdCxjb250ZW50TW9kZWxSb290KTsKLQkJCSB9Ci0JICAJICB9Ci0JICAJICByZXR1cm4gZmxleGlibGVPYmplY3RzOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRBcnRpZmFjdEVkaXRzKCkgewotCQkKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGFydGlmYWN0RWRpdHMpIHsKLQkJCWlmIChhcnRpZmFjdEVkaXRzLnNpemUoKSA9PTAgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IGdldE1vZHVsZUNvcmUoKTsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnRbXSB3b3JrQmVuY2hNb2R1bGVzID0gbW9kdWxlQ29yZS5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7IAotCQkJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya0JlbmNoTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCSAgICAgICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IHdvcmtCZW5jaE1vZHVsZXNbaV07Ci0JICAgICAgICAgICAgICAgICBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkgICAgICAgICAgICAgICAgIHRyeXsKLQkgICAgICAgICAgICAgICAgICAJICAgYXJ0aWZhY3RFZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCSAgICAgICAgICAgICAgICAgICBpZihhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkgICAgICAgICAgICAgICAgICAgCWFydGlmYWN0RWRpdHMuYWRkKGFydGlmYWN0RWRpdCk7Ci0JCQkgICAgICAgICAgICAgICAgYXJ0aWZhY3RFZGl0LmFkZExpc3RlbmVyKHRoaXMpOwotCQkgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgfSAgY2F0Y2goRXhjZXB0aW9uIGUpewotCSAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICAgICAgICAgICAgICAgfSAKLQkJCSAgICB9Ci0JCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0czsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVFZGl0IGdldE1vZHVsZUNvcmUoKSB7Ci0JCWlmIChtb2R1bGVDb3JlID09IG51bGwpIHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZUNvcmU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYXJ0aWZhY3RFZGl0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCB4PTA7IHg8IGFydGlmYWN0RWRpdHMuc2l6ZSgpOyArK3gpIHsKLQkJCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKEFydGlmYWN0RWRpdClhcnRpZmFjdEVkaXRzLmdldCh4KTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKQotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCUlQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkuZ2V0UHJvamVjdCgpOwotCQkKLQkJc3dpdGNoIChhbkV2ZW50LmdldEV2ZW50Q29kZSgpKSB7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlVOTE9BREVEX1JFU09VUkNFIDoKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSA6IHsKLQkJCQlPYmplY3Qgb2xkUm9vdE9iamVjdCA9IHJlbW92ZVJvb3RPYmplY3QoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ICE9IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuU0FWRSA6IHsKLQkJCQlPYmplY3Qgb2xkUm9vdE9iamVjdCA9IGdldFJvb3RPYmplY3QoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ID09IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6Ci0JCQkJCWRpc3Bvc2UoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCi0JCi0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSb290T2JqZWN0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5nZXQoYXJ0aWZhY3RFZGl0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCByZW1vdmVSb290T2JqZWN0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0LnJlbW92ZShhcnRpZmFjdEVkaXQpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEBwYXJhbSBlZGl0TW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcG9zZSggRWRpdE1vZGVsIGVkaXRNb2RlbCwgSVByb2plY3QgcHJvamVjdCkgewotCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0KGVkaXRNb2RlbCxwcm9qZWN0KTsKLQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQlhcnRpZmFjdEVkaXQucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQlhcnRpZmFjdEVkaXRzLnJlbW92ZShhcnRpZmFjdEVkaXQpOwotCQkJYXJ0aWZhY3RFZGl0VG9Sb290T2JqZWN0LnJlbW92ZShhcnRpZmFjdEVkaXQpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXQoRWRpdE1vZGVsIGVkaXRNb2RlbCwgSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoYXJ0aWZhY3RFZGl0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCB4PTA7IHg8YXJ0aWZhY3RFZGl0cy5zaXplKCk7ICsreCkgewotCQkJCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoQXJ0aWZhY3RFZGl0KWFydGlmYWN0RWRpdHMuZ2V0KHgpOwotCQkJCWlmIChhcnRpZmFjdEVkaXQuaGFzRWRpdE1vZGVsKGVkaXRNb2RlbCkpIAotCQkJCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRU5hdmlnYXRvckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjc3Y2VkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRU5hdmlnYXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdWwgNywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRU5hdmlnYXRvckNvbnN0YW50cyB7Ci0KLQlTdHJpbmcgVklFV0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQV29ya2luZ1NldENvbW1vbk5hdmlnYXRvciI7Ly8kTk9OLU5MUy0xJCAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVXaXphcmRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRVdpemFyZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzRhNjk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRVdpemFyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkVKQkNvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkVKQkNvbXBvbmVudEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5FSkJDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudENyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgQ3JlYXRpb24gSURzIGFyZSB1c2VkIGZvciBhY3Rpdml0eSBmaWx0ZXJpbmcgYW5kIGFzIHN1Y2ggYXJlIGRlY2xhcmVkIG9uIHRoZSBpbmRpdmlkdWFsCi0gKiB3aXphcmRzLiBBbGwgb3RoZXIgSURzIG11c3QgYmUgbWFpbnRhaW5lZCB0byBzdGF5IGluIHN5bmMgd2l0aCB0aGUgdmFsdWVzIGZvdW5kIGluIHRoZSBwbHVnaW4ueG1sCi0gKiBmaWxlcyBvZiB0aGUgcmVzcGVjdGl2ZSBtb2R1bGUgVUkgcGx1Z2lucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRVdpemFyZENvbnN0YW50cyB7Ci0KLQlTdHJpbmcgTkVXX0VBUl9QUk9KRUNUX1dJWkFSRF9JRCA9IEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLQotCVN0cmluZyBORVdfQVBQQ0xJRU5UX1BST0pFQ1RfV0laQVJEX0lEID0gQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQuV0laQVJEX0lEOwotCi0JU3RyaW5nIE5FV19KQ0FfUFJPSkVDVF9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0KLQlTdHJpbmcgTkVXX0VKQl9QUk9KRUNUX1dJWkFSRF9JRCA9IEVKQkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLQotCVN0cmluZyBORVdfV0VCX1BST0pFQ1RfV0laQVJEX0lEID0gV2ViQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuV0laQVJEX0lEOwotCi0JU3RyaW5nIE5FV19FTlRFUlBSSVNFX0JFQU5fV0laQVJEX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi51aS51dGlsLmNyZWF0ZUVKQldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJTVBPUlRfRUFSX1dJWkFSRF9JRCA9IEVBUkNvbXBvbmVudEltcG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgSU1QT1JUX0FQUENMSUVOVF9XSVpBUkRfSUQgPSBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIElNUE9SVF9DT05ORUNUT1JfV0laQVJEX0lEID0gQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBJTVBPUlRfRU5URVJQUklTRV9CRUFOX1dJWkFSRF9JRCA9IEVKQkNvbXBvbmVudEltcG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgSU1QT1JUX1dFQl9NT0RVTEVfV0laQVJEX0lEID0gV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBJTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX0lEID0gSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIEVYUE9SVF9FQVJfV0laQVJEX0lEID0gRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9JRCA9IEFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgRVhQT1JUX0NPTk5FQ1RPUl9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIEVYUE9SVF9FTlRFUlBSSVNFX0JFQU5fV0laQVJEX0lEID0gRUpCQ29tcG9uZW50RXhwb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfV0VCX01PRFVMRV9XSVpBUkRfSUQgPSBXZWJDb21wb25lbnRFeHBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzZDk5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUFjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5KMkVFUmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuT3BlbkoyRUVSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXdzLklDb21tb25BY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3cy5OYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSjJFRUFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uQWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uQWN0aW9uUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJVmlld1BhcnQgdmlld1BhcnQ7Ci0KLQlwcml2YXRlIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24gb3BlbkFjdGlvbjsKLQotCXByaXZhdGUgSjJFRVJlbmFtZUFjdGlvbiByZW5hbWVBY3Rpb247Ci0KLQkvL3ByaXZhdGUgV1RQT3B0aW9uYWxPcGVyYXRpb25BY3Rpb24gZ2VuZXJpY0RlbGV0ZTsKLQkvL1RPRE8gYWRkIGJhY2sgZ2VuZXJpYyBkZWxldGUKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSjJFRUFjdGlvblByb3ZpZGVyKCkgewotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50U2VydmljZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCBhVmlld1BhcnQsIFN0cnVjdHVyZWRWaWV3ZXIgYVZpZXdlciwgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgYUNvbnRlbnRTZXJ2aWNlKSB7Ci0JCXZpZXdQYXJ0ID0gYVZpZXdQYXJ0OwotCi0JCW9wZW5BY3Rpb24gPSBuZXcgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbigpOwotCQlyZW5hbWVBY3Rpb24gPSBuZXcgSjJFRVJlbmFtZUFjdGlvbih2aWV3UGFydC5nZXRWaWV3U2l0ZSgpLCB2aWV3UGFydC5nZXRWaWV3U2l0ZSgpLmdldFNoZWxsKCkpOwotLy8KLS8vCQlnZW5lcmljRGVsZXRlID0gbmV3IFdUUE9wdGlvbmFsT3BlcmF0aW9uQWN0aW9uKFdUUEdlbmVyaWNBY3Rpb25JZHMuREVMRVRFLCBXb3JrYmVuY2hNZXNzYWdlcy5Xb3JrYmVuY2hfZGVsZXRlKTsgLy8kTk9OLU5MUy0xJAotLy8JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLS8vCQlnZW5lcmljRGVsZXRlLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0vLwkJZ2VuZXJpY0RlbGV0ZS5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFX0RJU0FCTEVEKSk7Ci0vLwkJZ2VuZXJpY0RlbGV0ZS5zZXRXb3JrYmVuY2hTaXRlKHZpZXdQYXJ0LmdldFZpZXdTaXRlKCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNzZXRBY3Rpb25Db250ZXh0KG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25Db250ZXh0KEFjdGlvbkNvbnRleHQgYUNvbnRleHQpIHsKLQkJaWYgKGFDb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYUNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJcmVuYW1lQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQotCQkJT2JqZWN0W10gYXJyYXkgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJaWYgKGlzVXRpbGl0eUphcnMoYXJyYXkpKSB7Ci0JCQkJSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJTGlzdCBuZXdTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQl1dGlsaXR5SmFySXRlbVByb3ZpZGVyID0gKEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKSBhcnJheVtpXTsKLQkJCQkJbmV3U2VsZWN0aW9uLmFkZEFsbCh1dGlsaXR5SmFySXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKG51bGwpKTsKLQkJCQl9Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKTsKLQkJCX0KLQkJCS8vZ2VuZXJpY0RlbGV0ZS5zZWxlY3Rpb25DaGFuZ2VkKGdlbmVyaWNEZWxldGUsIHNlbGVjdGlvbik7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjZmlsbEFjdGlvbkJhcnMob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgdGhlQWN0aW9uQmFycykgewotLy8JCWlmIChnZW5lcmljRGVsZXRlLmlzRW5hYmxlZCgpKQotLy8JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwgZ2VuZXJpY0RlbGV0ZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjZmlsbENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCQlib29sZWFuIGFjdGlvbnNBZGRlZCA9IGZhbHNlOwotCS8qCWlmIChyZW5hbWVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCWFNZW51LmFwcGVuZFRvR3JvdXAoSUNvbW1vbk1lbnVDb25zdGFudHMuQ09NTU9OX01FTlVfRURJVF9BQ1RJT05TLCByZW5hbWVBY3Rpb24pOwotCQkJYWN0aW9uc0FkZGVkID0gdHJ1ZTsKLQkJfQotCQlpZiAoZ2VuZXJpY0RlbGV0ZS5pc0VuYWJsZWQoKSkgewotCQkJYU1lbnUuYXBwZW5kVG9Hcm91cChJQ29tbW9uTWVudUNvbnN0YW50cy5DT01NT05fTUVOVV9FRElUX0FDVElPTlMsIGdlbmVyaWNEZWxldGUpOwotCQkJYWN0aW9uc0FkZGVkID0gdHJ1ZTsKLQkJfSovCi0JCXJldHVybiBhY3Rpb25zQWRkZWQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVXRpbGl0eUphcnMoT2JqZWN0W10gaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXRlbXNbaV0gPT0gbnVsbCB8fCBpdGVtc1tpXS5nZXRDbGFzcygpICE9IEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmNsYXNzKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb21wYXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhMDdkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNQotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQlwcml2YXRlIEoyRUVWaWV3ZXJTb3J0ZXIgajJlZVZpZXdTb3J0ZXIgPSBuZXcgSjJFRVZpZXdlclNvcnRlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBwcm92aWRlckhlbHBlckxlZnRBcmcgPSBudWxsOwotCQlKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgcHJvdmlkZXJIZWxwZXJSaWdodEFyZyA9IG51bGw7Ci0KLQkJaWYgKG8xIGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcHJvdmlkZXJIZWxwZXJMZWZ0QXJnID0gKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgbzE7Ci0JCWlmIChvMiBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXByb3ZpZGVySGVscGVyUmlnaHRBcmcgPSAoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBvMjsKLQotCi0JCS8qIGlmIGJvdGggYXJndW1lbnRzIGFyZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXJzICovCi0JCWlmIChwcm92aWRlckhlbHBlckxlZnRBcmcgIT0gbnVsbCAmJiBwcm92aWRlckhlbHBlclJpZ2h0QXJnICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvdmlkZXJIZWxwZXJMZWZ0QXJnLmdldFRleHQoKS5jb21wYXJlVG8ocHJvdmlkZXJIZWxwZXJSaWdodEFyZy5nZXRUZXh0KCkpOwotCQkvKiBpZiBleGFjdGx5IG9uZSBvZiB0aGUgYXJndW1lbnRzIGFyZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXJzICovCi0JCWVsc2UgaWYgKHByb3ZpZGVySGVscGVyTGVmdEFyZyAhPSBudWxsICYmIG8yIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSBpZiAocHJvdmlkZXJIZWxwZXJSaWdodEFyZyAhPSBudWxsICYmIG8xIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBqMmVlVmlld1NvcnRlci5jb21wYXJlKG51bGwsIG8xLCBvMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgSjJFRUNvbXBhcmF0b3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYWIwYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5wcm92aWRlcnMuQ29tbW9uQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkJlYW5DbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1ldGhvZHNQcm92aWRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZSb290T2JqZWN0UHJvdmlkZXIuSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5EeW5hbWljQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlld3MuQWRhcHRhYmlsaXR5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3cy5Db21tb25WaWV3ZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JcHJpdmF0ZSBmaW5hbCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcm9vdE9iamVjdFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIE1ldGhvZHNQcm92aWRlckRlbGVnYXRlIGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdmlld2VySWQgPSBudWxsOwotCVZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJvb3RPYmplY3RQcm92aWRlciA9IG5ldyBFTUZSb290T2JqZWN0UHJvdmlkZXIoKTsKLQkJcm9vdE9iamVjdFByb3ZpZGVyLmFkZFJlZnJlc2hIYW5kbGVyTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFQ29udGVudFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJcm9vdE9iamVjdFByb3ZpZGVyID0gbmV3IEVNRlJvb3RPYmplY3RQcm92aWRlcigpOwotCQl1cGRhdGVDb250ZW50UHJvdmlkZXJzKGFWaWV3ZXJJZCk7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5hZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKHRoaXMpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBhbklucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oYW5JbnB1dEVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFQYXJlbnRFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCB8fCBhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBhUGFyZW50RWxlbWVudCkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gcm9vdE9iamVjdHMgPSAocm9vdE9iamVjdFByb3ZpZGVyICE9IG51bGwpID8gcm9vdE9iamVjdFByb3ZpZGVyLmdldE1vZGVscyhwcm9qZWN0KSA6IG51bGw7Ci0JCQkJaWYgKHJvb3RPYmplY3RzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgeD0wOyB4PCByb290T2JqZWN0cy5sZW5ndGggOyArK3gpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChyb290T2JqZWN0c1t4XSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihhUGFyZW50RWxlbWVudCkpCi0JCQlyZXR1cm4gZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYVBhcmVudEVsZW1lbnQpOwotCQllbHNlIC8qIGlmIChpc0VNRkVkaXRPYmplY3QoYVBhcmVudEVsZW1lbnQpKSAqL3sKLQkJCU9iamVjdFtdIHNpYmxpbmdzID0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYVBhcmVudEVsZW1lbnQpOwotCQkJaWYgKHNpYmxpbmdzICE9IG51bGwpCi0JCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc2libGluZ3MpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihvYmplY3QpKQotCQkJcmV0dXJuIGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOwotCQlPYmplY3QgcGFyZW50ID0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBCZWFuQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXBhcmVudCA9ICgoQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIpIG9iamVjdCkuZ2V0RWpiKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcGFyZW50ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBvYmplY3QpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5yZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKHRoaXMpOwotCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmRpc3Bvc2UoKTsKLQotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihlbGVtZW50KSkKLQkJCXJldHVybiBkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQkJLyogZWxzZSBpZiAoaXNFTUZFZGl0T2JqZWN0KGVsZW1lbnQpKSAqLwotCQlyZXR1cm4gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3QgYW5PbGRJbnB1dCwgT2JqZWN0IGFOZXdJbnB1dCkgewotCQlTdHJpbmcgbmV3Vmlld2VySWQgPSBudWxsOwotCQl2aWV3ZXIgPSBhVmlld2VyOwotCQlpZiAoYVZpZXdlciBpbnN0YW5jZW9mIENvbW1vblZpZXdlcikKLQkJCW5ld1ZpZXdlcklkID0gKChDb21tb25WaWV3ZXIpIGFWaWV3ZXIpLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0Vmlld2VySWQoKTsKLQotCQlpZiAobmV3Vmlld2VySWQgIT0gbnVsbCAmJiAodmlld2VySWQgPT0gbnVsbCB8fCAhdmlld2VySWQuZXF1YWxzKG5ld1ZpZXdlcklkKSkpCi0JCQl1cGRhdGVDb250ZW50UHJvdmlkZXJzKG5ld1ZpZXdlcklkKTsKLQotCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5pbnB1dENoYW5nZWQoYVZpZXdlciwgYW5PbGRJbnB1dCwgYU5ld0lucHV0KTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuaW5wdXRDaGFuZ2VkKGFWaWV3ZXIsIGFuT2xkSW5wdXQsIGFOZXdJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZpZXdlcklkMgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50UHJvdmlkZXJzKFN0cmluZyBhVmlld2VySWQpIHsKLQotCQkvKiBEaXNwb3NlIG9mIHRoZSBleGlzdGluZyBjb250ZW50IHByb3ZpZGVycyAqLwotCQlpZiAoZGVsZWdhdGVDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5kaXNwb3NlKCk7Ci0KLQkJLyogQ3JlYXRlIG5ldyBjb250ZW50IHByb3ZpZGVycyB1c2luZyB0aGUgbmV3IHZpZXdlciBpZCAqLwotCQlEeW5hbWljQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KGFWaWV3ZXJJZCk7Ci0JCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyID0gbmV3IENvbW1vbkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIgPSBuZXcgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUoYWRhcHRlckZhY3RvcnkpOwotCi0JCS8qIFJlbWVtYmVyIHRoZSB2aWV3ZXIgaWQgKi8KLQkJdmlld2VySWQgPSBhVmlld2VySWQ7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZSb290T2JqZWN0TWFuYWdlci5JUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciNvblJlZnJlc2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvblJlZnJlc2goZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBDcmVhdGUgYW5kIHNjaGVkdWxlIGEgVUkgSm9iIHRvIHVwZGF0ZSB0aGUgTmF2aWdhdG9yIENvbnRlbnQgVmlld2VyICovCi0JCQkJSm9iIGpvYiA9IG5ldyBVSUpvYigiVXBkYXRlIHRoZSBOYXZpZ2F0b3IgQ29udGVudCBWaWV3ZXIgSm9iIikgeyAvLyROT04tTkxTLTEkCi0JCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNjaGVkdWxpbmdSdWxlKQotCQkJCQlqb2Iuc2V0UnVsZSgoSVNjaGVkdWxpbmdSdWxlKWVsZW1lbnQpOwotCQkJCWVsc2UgIHsKLQkJCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSAoSVNjaGVkdWxpbmdSdWxlKUFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihlbGVtZW50LElTY2hlZHVsaW5nUnVsZS5jbGFzcyk7Ci0JCQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQkJCWpvYi5zZXRSdWxlKHJ1bGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQkKLQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0ZTNhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXdzLklDb21tb25MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkxhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZGVsZWdhdGVMYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVMYWJlbFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShhVmlld2VySWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoYVZpZXdlcklkKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5leHRlbnNpb25zLklDb21tb25MYWJlbFByb3ZpZGVyI2dldERlc2NyaXB0aW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgYW5FbGVtZW50KSB7Ci0JCWlmIChhbkVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgYW5FbGVtZW50OwotCQkJaWYgKENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoZU9iaiwgdHJ1ZSAvKiBpbmNsdWRlIGVhcnMgKi8pKSB7Ci0JCQkJSVByb2plY3QgcGFyZW50ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVPYmopOwotCQkJCVN0cmluZyBwYXRoID0gbmV3IFBhdGgoZU9iai5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJaW50IHN0YXJ0SW5kZXggPSBwYXRoLmluZGV4T2YocGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJcmV0dXJuIC0xID09IHN0YXJ0SW5kZXggPyBwYXRoIDogcGF0aC5zdWJzdHJpbmcoc3RhcnRJbmRleCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmVxdWFscyhvYmopOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZCgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpCi0JCQlyZXR1cm4gKChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcmV0dXJuICgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBpZCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmlzTGFiZWxQcm9wZXJ0eShvYmplY3QsIGlkKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTmF2aWdhdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTmF2aWdhdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1M2NjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgSjJFRU5hdmlnYXRpb25MYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFVmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmU1YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRVZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRVZpZXdlclNvcnRlci4KLQkgKi8KLQlwdWJsaWMgSjJFRVZpZXdlclNvcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHNlZSBWaWV3ZXJTb3J0ZXIjY29tcGFyZShWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZiAoc2hvdWxkU29ydChlMSwgZTIpKQotCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudGVycHJpc2VCZWFuKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW47Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3Qobyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU29ydChPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlyZXR1cm4gKGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KGUxKSAmJiBpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChlMikpIHx8IChpc0VudGVycHJpc2VCZWFuKGUxKSAmJiBpc0VudGVycHJpc2VCZWFuKGUyKSkgfHwgKChlMSBpbnN0YW5jZW9mIElGaWxlKSAmJiAoZTIgaW5zdGFuY2VvZiBJRmlsZSkpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL05vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwN2M2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIgZXh0ZW5kcyBFTUZNb2RlbE1hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lcnsKLQotCXByaXZhdGUgRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQlwcml2YXRlIE9iamVjdCByb290T2JqZWN0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVCA9IG5ldyBPYmplY3RbMF07Ci0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIHByb3ZpZGVyCi0JICovCi0JcHVibGljIE5vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIoYVByb2plY3QsIHByb3ZpZGVyKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNnZXRNb2RlbHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRNb2RlbHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsIHx8ICFnZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gRU1QVFlfT0JKRUNUOwotCQkKLQkJLy9zeW5jaHJvbml6ZWQgKHJvb3RPYmplY3QpIHsKLQkJCWlmIChyb290T2JqZWN0ID09IG51bGwgfHwgKChFT2JqZWN0KSByb290T2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVkaXRNb2RlbCgpOwotCQkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJCQlyb290T2JqZWN0ID0gZWRpdE1vZGVsLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCQkJfQotCQkJfQotCQkvL30KLQkJaWYgKHJvb3RPYmplY3Q9PW51bGwpIAotCQkJcmV0dXJuIEVNUFRZX09CSkVDVDsKLQkJZWxzZSB7Ci0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCW9iamVjdHNbMF0gPSByb290T2JqZWN0OwotCQkJcmV0dXJuIG9iamVjdHM7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRU1GTW9kZWxNYW5hZ2VyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQllZGl0TW9kZWwgPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gYW5FdmVudC5nZXRFZGl0TW9kZWwoKS5nZXRQcm9qZWN0KCk7Ci0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSA6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiAKLQkJCQlpZiAocm9vdE9iamVjdCAhPSBudWxsKXsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkgICAgIH0KLQkJCQlicmVhazsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuU0FWRSA6IHsKLQkJCQlpZiAocm9vdE9iamVjdCA9PSBudWxsKQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFIDoKLQkJCQkJZGlzcG9zZSgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCQotCQotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWwoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vVE9ETyBmaXggdXAKLQkJLy9zeW5jaHJvbml6ZWQgKGVkaXRNb2RlbCkgewotLy8JCQlpZiAoZWRpdE1vZGVsID09IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotLy8JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldEVkaXRNb2RlbEZvclByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJCUoyRUVOYXR1cmUgbmF0dXJlID0gSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwcm9qZWN0KTsKLS8vCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotLy8JCQkJCWVkaXRNb2RlbCA9IG5hdHVyZS5nZXRKMkVFRWRpdE1vZGVsRm9yUmVhZCh0aGlzKTsKLS8vCQkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQkvL30KLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUNhY2hlKElQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCkgewotCQkvL3N5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQkJZWRpdE1vZGVsID0gbnVsbDsKLQkJCX0KLQkJLy99Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRFeHRlcm5hbFV0aWxpdHlKYXJEcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDRhZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRFeHRlcm5hbFV0aWxpdHlKYXJEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC53b3JrYmVuY2guUmVzb3VyY2VEcm9wQWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbiBleHRlbmRzIFJlc291cmNlRHJvcEFjdGlvbiB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5uYXZpZ2F0b3IuZG5kLlJlc291cmNlRHJvcEFjdGlvbiN2YWxpZGF0ZURyb3Aob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGludCwgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEcm9wKENvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCS8vVE9ETyByZWRvIHdpdGggY29tcG9uZW50cwotLy8JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotLy8JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKSB7Ci0vLwkJCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSAoU3RyaW5nW10pIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlclR5cGUpOwotLy8JCQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotLy8JCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCi0vLwkJCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotLy8JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspCi0vLwkJCQkJCWlmICghKHJlc3VsdCA9IHNvdXJjZU5hbWVzWzBdLmVuZHNXaXRoKCIuamFyIikpKWJyZWFrOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9BZGRNb2R1bGVEcm9wQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZE1vZHVsZURyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiNjU5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZE1vZHVsZURyb3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRkTW9kdWxlRHJvcEFjdGlvbiBleHRlbmRzIEFkZFByb2plY3RUb0VhckRyb3BBY3Rpb24gewotCi0JcHVibGljIEFkZE1vZHVsZURyb3BBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcm9qZWN0VG9BZGQoSVByb2plY3QgcHJvamVjdFRvQWRkLCBpbnQgZWFyVmVyc2lvbikgewotCQkvL1RPRE8gZml4IHVwIHRvIHVzZSBjb21wb25lbnRzCi0vLwkJSjJFRU5hdHVyZSBtb2R1bGVOYXR1cmUgPSBKMkVFTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lKHByb2plY3RUb0FkZCk7Ci0vLwkJaWYgKG51bGwgPT0gbW9kdWxlTmF0dXJlIHx8IG1vZHVsZU5hdHVyZS5nZXROYXR1cmVJRCgpLmVxdWFscyhJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkgfHwgbW9kdWxlTmF0dXJlLmdldEoyRUVWZXJzaW9uKCkgPiBlYXJWZXJzaW9uKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbChJUHJvamVjdCBlYXJQcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9BZGQpIHsKLQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cwotLy8JCXJldHVybiBBZGRNb2R1bGVUb0VBUkRhdGFNb2RlbC5jcmVhdGVBZGRUb0VBUkRhdGFNb2RlbChudWxsLG51bGwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZFByb2plY3RUb0VhckRyb3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRWFyRHJvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzkzNTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRWFyRHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFkYXB0YWJpbGl0eVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5kbmQuSURyb3BWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZG5kLk5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRkUHJvamVjdFRvRWFyRHJvcEFjdGlvbiBleHRlbmRzIE5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElEcm9wVmFsaWRhdG9yIHsKLQotCXB1YmxpYyBBZGRQcm9qZWN0VG9FYXJEcm9wQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChDb21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciBkcm9wQWRhcHRlciwgT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vVE9ETyBzd2l0Y2ggdG8gY29tcG9uZW50cwotLy8JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkgfHwgUGx1Z2luVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotLy8JCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0vLwkJCWlmIChudWxsID09IGVhclByb2plY3QgfHwgIWVhclByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJaW50IGVhclZlcnNpb24gPSBlYXJOYXR1cmUuZ2V0QXBwbGljYXRpb24oKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0vLwotLy8JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5nZXRTZWxlY3Rpb24oKTsKLS8vCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotLy8JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCQlPYmplY3Qga2V5ID0gbmV3IE9iamVjdCgpOwotLy8JCQlFQVJFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLS8vCQkJdHJ5IHsKLS8vCQkJCWVkaXRNb2RlbCA9IGVhck5hdHVyZS5nZXRFYXJFZGl0TW9kZWxGb3JSZWFkKGtleSk7Ci0vLwkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLS8vCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLS8vCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLS8vCQkJCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihuZXh0LCBJUHJvamVjdC5jbGFzcyk7Ci0vLwkJCQkJaWYgKG51bGwgPT0gcHJvamVjdFRvQWRkIHx8ICFwcm9qZWN0VG9BZGQuaXNBY2Nlc3NpYmxlKCkpIHsKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJCX0KLS8vCi0vLwkJCQkJaWYgKCF2YWxpZGF0ZVByb2plY3RUb0FkZChwcm9qZWN0VG9BZGQsIGVhclZlcnNpb24pKSB7Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQl9Ci0vLwotLy8JCQkJCWlmIChlZGl0TW9kZWwuaGFzTWFwcGluZ1RvUHJvamVjdChwcm9qZWN0VG9BZGQpKSB7Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0gZmluYWxseSB7Ci0vLwkJCQlpZiAobnVsbCAhPSBlZGl0TW9kZWwpIHsKLS8vCQkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2VzcyhrZXkpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCXJldHVybiB0cnVlOwotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRhdGVQcm9qZWN0VG9BZGQoSVByb2plY3QgcHJvamVjdFRvQWRkLCBpbnQgZWFyVmVyc2lvbik7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoSVByb2plY3QgZWFyUHJvamVjdCwgSVByb2plY3QgcHJvamVjdFRvQWRkKTsKLQotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJLy9kZWZhdWx0IG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBydW4oT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHRhcmdldCkgewotCQlpZiAoc291cmNlIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQlyZXR1cm4gcnVuKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc291cmNlLCAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXQsIElQcm9qZWN0LmNsYXNzKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBydW4oQ29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIsIE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIHJ1bihzb3VyY2UsIHRhcmdldCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVByb2plY3QgZWFyUHJvamVjdCkgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCBlYXJQcm9qZWN0ID09IG51bGwgfHwgIWVhclByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgc291cmNlT2JqZWN0ID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpOwotCi0JCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihzb3VyY2VPYmplY3QsIElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChwcm9qZWN0VG9BZGQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0RGF0YU1vZGVsKGVhclByb2plY3QsIHByb2plY3RUb0FkZCk7Ci0JCQkJCWRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU5hdmlnYXRvclBsdWdpbi5sb2coZS50b1N0cmluZygpKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkVXRpbGl0eUphckRyb3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkVXRpbGl0eUphckRyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhNWU0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZFV0aWxpdHlKYXJEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biA5LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLlNlcnZlclRhcmdldFVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRkVXRpbGl0eUphckRyb3BBY3Rpb24gZXh0ZW5kcyBBZGRQcm9qZWN0VG9FYXJEcm9wQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRVdGlsaXR5SmFyRHJvcEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByb2plY3RUb0FkZChJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvamVjdFRvQWRkLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbChJUHJvamVjdCBlYXJQcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9BZGQpIHsKLQkJLy9UT0RPIG1pZ3JhdGUgdG8gQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCWJvb2xlYW4gc3luY1NlcnZlclRhcmdldCA9IFNlcnZlclRhcmdldFVJSGVscGVyLnNldE1vZHVsZVNlcnZlclRhcmdldElmTmVjZXNzYXJ5KGVhclByb2plY3QsIHByb2plY3RUb0FkZCwgZ2V0U2hlbGwoKSk7Ci0vLwkJZGF0YU1vZGVsID0gQWRkVXRpbGl0eVByb2plY3RUb0VBUkRhdGFNb2RlbC5jcmVhdGVBZGRUb0VBUkRhdGFNb2RlbChlYXJQcm9qZWN0LmdldE5hbWUoKSwgcHJvamVjdFRvQWRkKTsKLS8vCQlkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEFkZEFyY2hpdmVUb0VBUkRhdGFNb2RlbC5TWU5DX1RBUkdFVF9SVU5USU1FLCBzeW5jU2VydmVyVGFyZ2V0KTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Yjc4NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9KMkVFSW1wb3J0RHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDYsIDIwMDQKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5JbXBvcnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWRhcHRhYmlsaXR5VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5kbmQuQ29tbW9uTmF2aWdhdG9yRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZG5kLklEcm9wVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmRuZC5OYXZpZ2F0b3JEcm9wQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEoyRUVJbXBvcnREcm9wQWN0aW9uIGV4dGVuZHMgTmF2aWdhdG9yRHJvcEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSURyb3BWYWxpZGF0b3IgewotCXByaXZhdGUgQXJjaGl2ZU9wdGlvbnMgcmVhZE9ubHlBcmNoaXZlT3B0aW9uczsKLQotCXB1YmxpYyBKMkVFSW1wb3J0RHJvcEFjdGlvbigpIHsKLQkJcmVhZE9ubHlBcmNoaXZlT3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlyZWFkT25seUFyY2hpdmVPcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZpbGVFeGlzdHNPbkRpc2soU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsICYmIGZpbGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVOYW1lKTsKLQkJCXJldHVybiBmaWxlLmV4aXN0cygpICYmICFmaWxlLmlzRGlyZWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChDb21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciBkcm9wQWRhcHRlciwgT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gKFN0cmluZ1tdKSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5uYXRpdmVUb0phdmEodHJhbnNmZXJUeXBlKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsIHx8IHNvdXJjZU5hbWVzLmxlbmd0aCAhPSAxKSB7IC8vb25seSBoYW5kbGUgb25lIGZpbGUgZm9yIG5vdwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVN0cmluZyBmaWxlTmFtZSA9IHNvdXJjZU5hbWVzWzBdOwotCQkJaWYgKCEoZmlsZU5hbWUuZW5kc1dpdGgoIi5lYXIiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIud2FyIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5yYXIiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghZmlsZUV4aXN0c09uRGlzayhmaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbnQgYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQkJdHJ5IHsKLS8vCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLS8vCQkJCWFyY2hpdmVUeXBlID0gSW1wb3J0VXRpbC5nZXRBcmNoaXZlVHlwZShhcmNoaXZlKTsKLS8vCQkJCVN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlcyA9IG51bGw7Ci0vLwkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRH07Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLS8vCQkJCQkJcG9zc2libGVOYXR1cmVzID0gbmV3IFN0cmluZ1tde0lFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lELCBJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLlJBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQsIElDb25uZWN0b3JOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJZGVmYXVsdCA6Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLS8vCi0vLwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0JCQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cyBhbmQgYXJ0aWZhY3QgZWRpdHMKLS8vCQkJCWlmIChudWxsICE9IHByb2plY3QpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlib29sZWFuIGZvdW5kTmF0dXJlID0gZmFsc2U7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAwOyAhZm91bmROYXR1cmUgJiYgaSA8IHBvc3NpYmxlTmF0dXJlcy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKHBvc3NpYmxlTmF0dXJlc1tpXSkpIHsKLS8vCQkJCQkJCQlmb3VuZE5hdHVyZSA9IHRydWU7Ci0vLwkJCQkJCQkJSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUocG9zc2libGVOYXR1cmVzW2ldKTsKLS8vCQkJCQkJCQlpbnQgcHJvamVjdEoyRUVWZXJzaW9uID0gbmF0dXJlLmdldEoyRUVWZXJzaW9uKCk7Ci0vLwkJCQkJCQkJaW50IGFyY2hpdmVNb2R1bGVWZXJzaW9uID0gQXJjaGl2ZVV0aWwuZ2V0RmFzdFNwZWNWZXJzaW9uKChNb2R1bGVGaWxlKSBhcmNoaXZlKTsKLS8vCQkJCQkJCQlib29sZWFuIGZhaWwgPSBmYWxzZTsKLS8vCQkJCQkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5FQVJGSUxFIDoKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkNMSUVOVEpBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA8IGFyY2hpdmVNb2R1bGVWZXJzaW9uKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9Ci0vLwkJCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkVKQkpBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0gZWxzZSBpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGFyY2hpdmVNb2R1bGVWZXJzaW9uID4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotLy8JCQkJCQkJCQkJCWZhaWwgPSB0cnVlOwotLy8JCQkJCQkJCQkJfQotLy8JCQkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLS8vCQkJCQkJCQkJCWlmIChwcm9qZWN0SjJFRVZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgJiYgYXJjaGl2ZU1vZHVsZVZlcnNpb24gPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9IGVsc2UgaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0vLwkJCQkJCQkJCQlpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9IGVsc2UgaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCQlpZiAoZmFpbCkgewotLy8JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCWlmICghZm91bmROYXR1cmUpIHsKLS8vCQkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQkJfQotLy8JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJfQotLy8JCQkJfQotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG51bGwgIT0gYXJjaGl2ZSAmJiBhcmNoaXZlLmlzT3BlbigpKSB7Ci0JCQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLk5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKENvbW1vbk5hdmlnYXRvckRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0KSB7Ci0JCVRyYW5zZmVyRGF0YSBjdXJyZW50VHJhbnNmZXIgPSBkcm9wQWRhcHRlci5nZXRDdXJyZW50VHJhbnNmZXIoKTsKLQkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShjdXJyZW50VHJhbnNmZXIpKSB7Ci0JCQlmaW5hbCBTdHJpbmdbXSBmaWxlTmFtZXMgPSAoU3RyaW5nW10pIHNvdXJjZTsKLQkJCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVOYW1lc1swXTsKLQkJCURhdGFNb2RlbFdpemFyZCB3aXphcmQgPSBudWxsOwotCQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBudWxsOwotCi0JCQlpbnQgYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlhcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShmaWxlTmFtZSk7Ci0JCQkJYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLmdldEFyY2hpdmVUeXBlKGFyY2hpdmUpOwotCQkJCXN3aXRjaCAoYXJjaGl2ZVR5cGUpIHsKLQkJCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotCQkJCQkJZGF0YU1vZGVsID0gbnVsbDsvL25ldyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IEVKQk1vZHVsZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW1wb3J0VXRpbC5DTElFTlRKQVJGSUxFIDoKLQkJCQkJCWRhdGFNb2RlbCA9IG51bGw7Ly9uZXcgQXBwQ2xpZW50TW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbXBvcnRVdGlsLldBUkZJTEUgOgotCQkJCQkJZGF0YU1vZGVsID0gbnVsbDsvL25ldyBXZWJNb2R1bGVJbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IENvbm5lY3Rvck1vZHVsZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChudWxsICE9IGFyY2hpdmUgJiYgYXJjaGl2ZS5pc09wZW4oKSkgewotCQkJCQlhcmNoaXZlLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZmlsZU5hbWUpOwotCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0JCQlpZiAobnVsbCAhPSBwcm9qZWN0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGFyY2hpdmVUeXBlID09IEltcG9ydFV0aWwuRUFSRklMRSApIHsKLQkJCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJCQkJZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoIChhcmNoaXZlVHlwZSkgewotCQkJCWNhc2UgSW1wb3J0VXRpbC5FQVJGSUxFIDoKLQkJCQkJd2l6YXJkID0gbnVsbDsvL25ldyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnRXaXphcmQoKEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCkgZGF0YU1vZGVsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLkVKQkpBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IEVKQk1vZHVsZUltcG9ydFdpemFyZCgoRUpCTW9kdWxlSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRSA6Ci0JCQkJCXdpemFyZCA9IG51bGw7Ly9uZXcgQXBwQ2xpZW50TW9kdWxlSW1wb3J0V2l6YXJkKChBcHBDbGllbnRNb2R1bGVJbXBvcnREYXRhTW9kZWwpIGRhdGFNb2RlbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLQkJCQkJd2l6YXJkID0gbnVsbDsvL25ldyBXZWJNb2R1bGVJbXBvcnRXaXphcmQoKFdlYk1vZHVsZUltcG9ydERhdGFNb2RlbCkgZGF0YU1vZGVsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLlJBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IENvbm5lY3Rvck1vZHVsZUltcG9ydFdpemFyZCgoQ29ubmVjdG9yTW9kdWxlSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKG51bGwgIT0gd2l6YXJkKSB7Ci0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Nb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9Nb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmU4OTMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmRuZC5JU2VyaWFsaXplcjsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplciBpbXBsZW1lbnRzIElTZXJpYWxpemVyIHsKLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLklTZXJpYWxpemVyI3RvQnl0ZUFycmF5KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheShPYmplY3QgZGF0YSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIoZGF0YSwgSVByb2plY3QuY2xhc3MpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpLmdldEJ5dGVzKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLklTZXJpYWxpemVyI2Zyb21CeXRlQXJyYXkoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotCQlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoZGF0YSk7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9wbHVnaW4vSjJFRU5hdmlnYXRvclBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3BsdWdpbi9KMkVFTmF2aWdhdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDQ3ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3BsdWdpbi9KMkVFTmF2aWdhdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRU5hdmlnYXRvclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBKMkVFTmF2aWdhdG9yUGx1Z2luIHBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEoyRUVOYXZpZ2F0b3JQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSjJFRU5hdmlnYXRvclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3dvcmtpbmdzZXRzL0NvbXBvbmVudFdvcmtpbmdTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5N2JjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucnVudGltZS5JbnRlcm5hbFBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5BYnN0cmFjdFdvcmtpbmdTZXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnVpLndvcmtpbmdzZXRzLklDb21tb25Xb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuV29ya2luZ1NldERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwucmVnaXN0cnkuV29ya2luZ1NldFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRXb3JraW5nU2V0ICAgaW1wbGVtZW50cyBJQ29tbW9uV29ya2luZ1NldCxJQWN0aW9uRmlsdGVyewotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWV9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwud29ya2luZ3NldHMuQ29tcG9uZW50V29ya2luZ1NldEZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFX0lEID0gImNvbXBvbmVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QQUdFX0lEID0gImVkaXRQYWdlSWQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1dPUktJTkdfU0VUX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5Db21wb25lbnRXb3JraW5nU2V0UGFnZSI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGVsZW1lbnRzOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWRpdFBhZ2VJZDsKLQotICAgIHByaXZhdGUgSU1lbWVudG8gd29ya2luZ1NldE1lbWVudG87Ci0gICAgCi0gICAgcHJpdmF0ZSBJV29ya2luZ1NldE1hbmFnZXIgbWFuYWdlcjsKLQkKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlSWQ7Ci0gICAgICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfSUQgPSAidHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotCSAgICAKLQkKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdvcmtpbmcgc2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgd29ya2luZyBzZXQuIFNob3VsZCBub3QgaGF2ZSAKLSAgICAgKiAJbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlLgotICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBjb250ZW50IG9mIHRoZSBuZXcgd29ya2luZyBzZXQuIAotICAgICAqIAlNYXkgYmUgZW1wdHkgYnV0IG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldChTdHJpbmcgYU5hbWUsIElBZGFwdGFibGVbXSBlbGVtZW50cykgewotCSAgIG5hbWUgPSBhTmFtZTsKLQkgICBpbnRlcm5hbFNldEVsZW1lbnRzKGVsZW1lbnRzKTsKLQkgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHdvcmtpbmcgc2V0IGZyb20gYSBtZW1lbnRvLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgd29ya2luZyBzZXQuIFNob3VsZCBub3QgaGF2ZSAKLSAgICAgKiAJbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlLgotICAgICAqIEBwYXJhbSBtZW1lbnRvIHBlcnNpc3RlbmNlIG1lbWVudG8gY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgIAotICAgICAqIAl0aGUgd29ya2luZyBzZXQuCi0gICAgICovCi0gICAgQ29tcG9uZW50V29ya2luZ1NldChTdHJpbmcgYU5hbWUsIFN0cmluZyBhVHlwZUlkLCBJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgCW5hbWUgPSBhTmFtZTsKLSAgICAgICAgdHlwZUlkID0gYVR5cGVJZDsKLSAgICAgICAgd29ya2luZ1NldE1lbWVudG8gPSBtZW1lbnRvOwotCQlpbnRlcm5hbFNldEVsZW1lbnRzKG5ldyBJQWRhcHRhYmxlWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcjIKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldChDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBhRGVzY3JpcHRvcikgewotCQluYW1lID0gYURlc2NyaXB0b3IuZ2V0TGFiZWwoKTsKLQkJdHlwZUlkID0gYURlc2NyaXB0b3IuZ2V0VHlwZUlkKCk7Ci0JCWVkaXRQYWdlSWQgPSBhRGVzY3JpcHRvci5nZXRJZCgpOwotCQlpbnRlcm5hbFNldEVsZW1lbnRzKG5ldyBJQWRhcHRhYmxlWzBdKTsKLQl9Ci0KLQkvKioKLSAgICAgKiBUZXN0cyB0aGUgcmVjZWl2ZXIgYW5kIHRoZSBvYmplY3QgZm9yIGVxdWFsaXR5Ci0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdCBvYmplY3QgdG8gY29tcGFyZSB0aGUgcmVjZWl2ZXIgdG8KLSAgICAgKiBAcmV0dXJuIHRydWU9dGhlIG9iamVjdCBlcXVhbHMgdGhlIHJlY2VpdmVyLCB0aGUgbmFtZSBpcyB0aGUgc2FtZS4KLSAgICAgKiAJZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29tcG9uZW50V29ya2luZ1NldCkgewotICAgICAgICAgICAgQ29tcG9uZW50V29ya2luZ1NldCB3b3JraW5nU2V0ID0gKENvbXBvbmVudFdvcmtpbmdTZXQpIG9iamVjdDsKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RQYWdlSWQgPSB3b3JraW5nU2V0LmdldElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFnZUlkID0gZ2V0SWQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gcGFnZUlkRXF1YWwgPSAob2JqZWN0UGFnZUlkID09IG51bGwgJiYgcGFnZUlkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHx8IChvYmplY3RQYWdlSWQgIT0gbnVsbCAmJiBvYmplY3RQYWdlSWQuZXF1YWxzKHBhZ2VJZCkpOwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdFR5cGVJZCA9IHdvcmtpbmdTZXQuZ2V0VHlwZUlkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gZ2V0VHlwZUlkKCk7Ci0gICAgICAgICAgICBib29sZWFuIHR5cGVJZEVxdWFsID0gKG9iamVjdFR5cGVJZCA9PSBudWxsICYmIHR5cGVJZCA9PSBudWxsKQotICAgICAgICAgICAgfHwgKG9iamVjdFR5cGVJZCAhPSBudWxsICYmIG9iamVjdFR5cGVJZC5lcXVhbHModHlwZUlkKSk7Ci0gICAgICAgICAgICByZXR1cm4gd29ya2luZ1NldC5nZXROYW1lKCkuZXF1YWxzKGdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgd29ya2luZ1NldC5nZXRFbGVtZW50c0FycmF5KCkuZXF1YWxzKGdldEVsZW1lbnRzQXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgcGFnZUlkRXF1YWwKLQkJCQkJJiYgdHlwZUlkRXF1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlXb3JraW5nU2V0UmVnaXN0cnkgcmVnaXN0cnkgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtpbmdTZXRSZWdpc3RyeSgpOwotCQlTdHJpbmcgaWQ9IGdldElkKCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlXb3JraW5nU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yPSByZWdpc3RyeS5nZXRXb3JraW5nU2V0RGVzY3JpcHRvcihpZCk7Ci0JCWlmIChkZXNjcmlwdG9yID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBkZXNjcmlwdG9yLmlzRWRpdGFibGUoKTsKLQl9Ci0vLyAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWNlaXZlciBpZiB0aGUgcmVxdWVzdGVkIHR5cGUgaXMgZWl0aGVyIElXb3JraW5nU2V0IAotICAgICAqIG9yIElQZXJzaXN0YWJsZUVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgdGhlIHJlcXVlc3RlZCB0eXBlCi0gICAgICogQHJldHVybiB0aGUgcmVjZWl2ZXIgaWYgdGhlIHJlcXVlc3RlZCB0eXBlIGlzIGVpdGhlciBJV29ya2luZ1NldCAKLSAgICAgKiAJb3IgSVBlcnNpc3RhYmxlRWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlciA9PSBJV29ya2luZ1NldC5jbGFzcwotICAgICAgICAgICAgICAgIHx8IGFkYXB0ZXIgPT0gSVBlcnNpc3RhYmxlRWxlbWVudC5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQkJcmV0dXJuIEludGVybmFsUGxhdGZvcm0uZ2V0RGVmYXVsdCgpLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldAotICAgICAqLwotICAgIHB1YmxpYyBJQWRhcHRhYmxlW10gZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gZ2V0RWxlbWVudHNBcnJheSgpOwotICAgICAgICByZXR1cm4gKElBZGFwdGFibGVbXSkgbGlzdC50b0FycmF5KG5ldyBJQWRhcHRhYmxlW2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudHMgYXJyYXkgbGlzdC4gTGF6aWx5IHJlc3RvcmVzIHRoZSBlbGVtZW50cyBmcm9tCi0gICAgICogcGVyc2lzdGVuY2UgbWVtZW50by4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudHMgYXJyYXkgbGlzdAotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGdldEVsZW1lbnRzQXJyYXkoKSB7Ci0gICAgICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN0b3JlV29ya2luZ1NldCgpOwotICAgICAgICAgICAgd29ya2luZ1NldE1lbWVudG8gPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBGQUNUT1JZX0lEOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAJaWYgKGVkaXRQYWdlSWQgPT0gbnVsbCkKLSAgICAJCWVkaXRQYWdlSWQgPSBDT01QT05FTlRfV09SS0lOR19TRVRfSUQ7Ci0gICAgICAgIHJldHVybiBlZGl0UGFnZUlkOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQKLSAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaENvZGUgPSBuYW1lLmhhc2hDb2RlKCkgJiB0eXBlSWQuaGFzaENvZGUoKTsKLQotICAgICAgICBpZiAoZWRpdFBhZ2VJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoYXNoQ29kZSAmPSBlZGl0UGFnZUlkLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2hDb2RlOwotICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjcmVhdGVzIHRoZSB3b3JraW5nIHNldCBlbGVtZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSBtZW1lbnRvLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlV29ya2luZ1NldCgpIHsKLSAgICAJLy91cGRhdGVFbGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudHMgSVBlcnNpc3RhYmxlRWxlbWVudC4KLSAgICAgKiBQZXJzaXN0IHRoZSB3b3JraW5nIHNldCBuYW1lIGFuZCB3b3JraW5nIHNldCBjb250ZW50cy4gCi0gICAgICogVGhlIGNvbnRlbnRzIGhhcyB0byBiZSBlaXRoZXIgSVBlcnNpc3RhYmxlRWxlbWVudHMgb3IgcHJvdmlkZSAKLSAgICAgKiBhZGFwdGVycyBmb3IgaXQgdG8gYmUgcGVyc2lzdGVudC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQjc2F2ZVN0YXRlKElNZW1lbnRvKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGlmICh3b3JraW5nU2V0TWVtZW50byAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBqdXN0IHJlLXNhdmUgdGhlIHByZXZpb3VzIG1lbWVudG8gaWYgdGhlIHdvcmtpbmcgc2V0IGhhcyAKLSAgICAgICAgICAgIC8vIG5vdCBiZWVuIHJlc3RvcmVkCi0gICAgICAgICAgICBtZW1lbnRvLnB1dE1lbWVudG8od29ya2luZ1NldE1lbWVudG8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtZW50by5wdXRTdHJpbmcoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfTkFNRSwgZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIG1lbWVudG8ucHV0U3RyaW5nKElXb3JrYmVuY2hDb25zdGFudHMuVEFHX0VESVRfUEFHRV9JRCwgZ2V0SWQoKSk7Ci0gICAgICAgICAgICBtZW1lbnRvLnB1dFN0cmluZyhUQUdfVFlQRV9JRCx0eXBlSWQpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKElBZGFwdGFibGVbXSBuZXdFbGVtZW50cykgewotICAgICAgICBpbnRlcm5hbFNldEVsZW1lbnRzKG5ld0VsZW1lbnRzKTsKLSAgICAgICAgZmlyZVdvcmtpbmdTZXRDaGFuZ2VkKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfQ09OVEVOVF9DSEFOR0UsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGVsZW1lbnRzIHRvIHN0b3JlIGluIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIHRvIHN0b3JlIGEgY29weSBvZiBpbiB0aGUgCi0gICAgICogCXJlY2VpdmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbFNldEVsZW1lbnRzKElBZGFwdGFibGVbXSBuZXdFbGVtZW50cykgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKG5ld0VsZW1lbnRzLAotICAgICAgICAgICAgICAgICJXb3JraW5nIHNldCBlbGVtZW50cyBhcnJheSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QobmV3RWxlbWVudHMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5ld0VsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLS8vCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgcGFnZUlkKSB7Ci0gICAgICAgIGVkaXRQYWdlSWQgPSBwYWdlSWQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwobmV3TmFtZSwgIldvcmtpbmcgc2V0IG5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBuYW1lID0gbmV3TmFtZTsKLSAgICAgICAgZmlyZVdvcmtpbmdTZXRDaGFuZ2VkKElXb3JraW5nU2V0TWFuYWdlci5DSEFOR0VfV09SS0lOR19TRVRfTkFNRV9DSEFOR0UsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KElXb3JraW5nU2V0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCUFzc2VydC5pc1RydWUodGhpcy5tYW5hZ2VyID09IG51bGwsICJBIHdvcmtpbmcgc2V0IGNhbiBvbmx5IGJlIGNvbm5lY3RlZCB0byBvbmUgbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0gICAgCXRoaXMubWFuYWdlcj0gbWFuYWdlcjsKLSAgICB9Ci0gICAgCi0gICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotICAgIAl0aGlzLm1hbmFnZXI9IG51bGw7Ci0JCQotICAgICAgfQotICAKLSAgCi0JcHJpdmF0ZSB2b2lkIGZpcmVXb3JraW5nU2V0Q2hhbmdlZChTdHJpbmcgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSkgewotICAgIAlBYnN0cmFjdFdvcmtpbmdTZXRNYW5hZ2VyIHJlY2VpdmVyPSBtYW5hZ2VyICE9IG51bGwKLQkJCT8gKEFic3RyYWN0V29ya2luZ1NldE1hbmFnZXIpbWFuYWdlcgotCQkJOiAoQWJzdHJhY3RXb3JraW5nU2V0TWFuYWdlcilXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCk7Ci0JCXJlY2VpdmVyLndvcmtpbmdTZXRDaGFuZ2VkKHRoaXMsIHByb3BlcnR5LCBvbGRWYWx1ZSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIAotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2UoKSB7Ci0gICAgCUNvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeSByZWdpc3RyeSA9IENvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJCi0JCWRlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXRXb3JraW5nU2V0RGVzY3JpcHRvcihnZXRJZCgpLCB0eXBlSWQpOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvci5nZXRJY29uKCk7Ci0JIAkgICAgCi0gICAgfQotCSAKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0JCi0KLQotCQotCi0JcHVibGljIGJvb2xlYW4gdGVzdEF0dHJpYnV0ZShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChDT01QT05FTlRfVFlQRV9JRC5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gZ2V0VHlwZUlkKCkuZXF1YWxzKHZhbHVlKTsKLQkJaWYgKEVESVRfUEFHRV9JRC5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gZ2V0SWQoKS5lcXVhbHModmFsdWUpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl9Ci0KLQkKLQkKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Q0OGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciB7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX01PRFVMRV9UWVBFID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHJpdmF0ZSBTdHJpbmcgaWQgOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsIDsKLQlwcml2YXRlIFN0cmluZyBpY29uOwotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCQotCS8qKgotCSAqIEBwYXJhbSBhbkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWdFbGVtZW50KSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uewotCQlzdXBlcigpOwotCQljb25maWdFbGVtZW50ID0gYUNvbmZpZ0VsZW1lbnQ7Ci0JCWluaXQoKTsKLQl9Ci0KLQl2b2lkIGluaXQoKSB0aHJvd3MgV29ya2JlbmNoRXhjZXB0aW9uIHsKLQkJbGFiZWwgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTEFCRUwpOwotCQlpZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCXR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9NT0RVTEVfVFlQRSk7Ci0JCWljb24gPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUNPTik7Ci0JCQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgV29ya2JlbmNoRXhjZXB0aW9uKCJNaXNzaW5nIGF0dHJpYnV0ZTogIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJQVRUX0lEICsgIiBpbiBjb21tb24gd29ya2luZyBzZXQgZXh0ZW5zaW9uOiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOwotCQl9Ci0KLQkJaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbigiTWlzc2luZyBhdHRyaWJ1dGU6ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCUFUVF9MQUJFTCArICIgaW4gY29tbW9uIHdvcmtpbmcgc2V0IGV4dGVuc2lvbjogIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJfQotCi0JCWlmICh0eXBlSWQgPT0gbnVsbCB8fCB0eXBlSWQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IFdvcmtiZW5jaEV4Y2VwdGlvbigiTWlzc2luZyBhdHRyaWJ1dGU6ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCUFUVF9NT0RVTEVfVFlQRSArICIgaW4gY29tbW9uIHdvcmtpbmcgc2V0IGV4dGVuc2lvbjogIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gdHlwZUlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIHBhZ2UncyBpY29uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGFnZSdzIGljb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEljb24oKSB7Ci0gICAgICAgIGlmIChpY29uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0gICAgICAgIFN0cmluZyBleHRlbmRpbmdQbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihleHRlbmRpbmdQbHVnaW5JZCwKLSAgICAgICAgICAgICAgICBpY29uKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbgotCSAqIAotCSAqLwotLy8JcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLS8vCSAgICAJQnVuZGxlIGJ1bmRsZT0gUGxhdGZvcm0uZ2V0QnVuZGxlKGNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpOwotLy8JICAgIAlpZiAoIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUgKQotLy8JICAgIAkJYnVuZGxlLnN0YXJ0KCk7Ci0vLwkgICAgCQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3dvcmtpbmdzZXRzL0NvbXBvbmVudFdvcmtpbmdTZXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlOTFhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hDb25zdGFudHM7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFdvcmtpbmdTZXRGYWN0b3J5IGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRXb3JraW5nU2V0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSUFkYXB0YWJsZSBjcmVhdGVFbGVtZW50KElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgU3RyaW5nIHdvcmtpbmdTZXROYW1lID0gbWVtZW50by5nZXRTdHJpbmcoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfTkFNRSk7Ci0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBtZW1lbnRvLmdldFN0cmluZyhDb21wb25lbnRXb3JraW5nU2V0LlRBR19UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIHdvcmtpbmdTZXRFZGl0UGFnZUlkID0gbWVtZW50bwotICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoSVdvcmtiZW5jaENvbnN0YW50cy5UQUdfRURJVF9QQUdFX0lEKTsKLQotICAgICAgICBpZiAod29ya2luZ1NldE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIENvbXBvbmVudFdvcmtpbmdTZXQgd29ya2luZ1NldCA9IG5ldyBDb21wb25lbnRXb3JraW5nU2V0KHdvcmtpbmdTZXROYW1lLCB0eXBlSWQsIG1lbWVudG8pOwotICAgICAgICBpZiAod29ya2luZ1NldEVkaXRQYWdlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgd29ya2luZ1NldC5zZXRJZCh3b3JraW5nU2V0RWRpdFBhZ2VJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3b3JraW5nIHNldHMgY3JlYXRlZCB3aXRoIGJ1aWxkcyAyMDAyMDQxOCBhbmQgMjAwMjA0MTkgd2lsbCBub3QKLSAgICAgICAgICAgIC8vIGhhdmUgYW4gZWRpdCBwYWdlIGlkLiBmaXggdGhpcyBhdXRvbWF0aWNhbGx5LgotICAgICAgICAgICAgd29ya2luZ1NldC5zZXRJZChDb21wb25lbnRXb3JraW5nU2V0LkNPTVBPTkVOVF9XT1JLSU5HX1NFVF9JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd29ya2luZ1NldDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlYTgwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC53b3JraW5nc2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5JQ29tbW9uV29ya2luZ1NldFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRXb3JraW5nU2V0UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tbW9uV29ya2luZ1NldFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeSBDT01QT05FTlRfV09SS0lOR19TRVRfUkVHSVNUUlkgPSBDb21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlib29sZWFuIGJJbml0aWFsaXplZCA9IGZhbHNlOwotCUxpc3Qgd29ya2luZ1NldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbXBvbmVudFdvcmtpbmdTZXRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5JV29ya2luZ1NldFByb3ZpZGVyI2dldFdvcmtpbmdTZXRzKCkKLQkgKi8KLQlwdWJsaWMgSVdvcmtpbmdTZXRbXSBnZXRXb3JraW5nU2V0cygpIHsKLQkJaWYgKCFiSW5pdGlhbGl6ZWQpIHsKLQkJICAgIC8vd29ya2luZ1NldHMuY2xlYXIoKTsKLQkJCXN5bmNocm9uaXplZCAod29ya2luZ1NldHMpIHsKLQkJCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvcltdIHNldCA9IENPTVBPTkVOVF9XT1JLSU5HX1NFVF9SRUdJU1RSWS5nZXRDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvcnMoKTsKLQkJCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJCQlJV29ya2luZ1NldCB3b3JraW5nU2V0ID0gbnVsbDsKLQkJCQlmb3IgKGludCB4PTA7IHg8c2V0Lmxlbmd0aDsrKyB4KSB7Ci0JCQkJCWRlc2NyaXB0b3IgPSBzZXRbeF07Ci0JCQkJCXdvcmtpbmdTZXQ9ICBuZXcgQ29tcG9uZW50V29ya2luZ1NldChkZXNjcmlwdG9yKTsgCi0JCQkJCXdvcmtpbmdTZXRzLmFkZCh3b3JraW5nU2V0KTsKLQkJCQkJYkluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCQl9CQotCQkJfQotCQl9Ci0JCQotCQlJV29ya2luZ1NldFtdIHdzID0gbmV3IElXb3JraW5nU2V0W3dvcmtpbmdTZXRzLnNpemUoKV07Ci0JCXJldHVybiAoSVdvcmtpbmdTZXRbXSl3b3JraW5nU2V0cy50b0FycmF5KHdzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC51aS53b3JraW5nc2V0cy5JV29ya2luZ1NldFByb3ZpZGVyI2luaXQob3JnLmVjbGlwc2UuanN0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudWkud29ya2luZ3NldHMuV29ya2luZ1NldE1vZGVsKQotCSAqLwotLy8JcHVibGljIHZvaWQgaW5pdChXb3JraW5nU2V0TW9kZWwgd29ya2luZ1NldE1vZGVsKSB7Ci0vLwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljMmEyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIzLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwud29ya2luZ3NldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLkoyRUVOYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5Xb3JrYmVuY2hOYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5SZWdpc3RyeVJlYWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fREVTQ1JJUFRPUlMgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgTGlzdCBjb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJbmV3IENvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvbmVudFdvcmtpbmdTZXRSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCXN5bmNocm9uaXplZCAoSU5TVEFOQ0UpIHsKLQkJCWlmICghaXNJbml0aWFsaXplZCkgewotCQkJCUlOU1RBTkNFLmluaXQoKTsKLQkJCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhRGVzYwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcihDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBhRGVzYykgewotCQlpZiAoYURlc2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3luY2hyb25pemVkIChjb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMpIHsKLQkJCWJvb2xlYW4gYlZhbHVlID0gY29tbW9uV29ya2luZ1NldERlc2NyaXB0b3JzLmNvbnRhaW5zKGFEZXNjKTsKLQkJCWlmIChiVmFsdWUgPT0gZmFsc2UpIHsKLQkJCQljb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMuYWRkKGFEZXNjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3JbXSBnZXRDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvcnMoKSB7Ci0JCUNvbXBvbmVudFdvcmtpbmdTZXREZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3JbY29tbW9uV29ya2luZ1NldERlc2NyaXB0b3JzLnNpemUoKV07Ci0JCXJldHVybiAoQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3JbXSljb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMudG9BcnJheShkZXNjcmlwdG9ycyk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0lkKFN0cmluZyBpZCkgewotCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJZm9yIChpbnQgeD0wOyB4PCBjb21tb25Xb3JraW5nU2V0RGVzY3JpcHRvcnMuc2l6ZSgpOyArK3gpIHsKLQkJCWRlc2NyaXB0b3IgPSAoQ29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3IpY29tbW9uV29ya2luZ1NldERlc2NyaXB0b3JzLmdldCh4KTsKLQkJCWlmIChkZXNjcmlwdG9yLmdldElkKCkuZXF1YWxzKGlkKSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQljbGFzcyBDb21wb25lbnRXb3JraW5nU2V0UmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9XT1JLSU5HX1NFVCA9ICJjb21wb25lbnRXb3JraW5nU2V0IjsgLy8kTk9OLU5MUy0xJAotCi0KLQkJQ29tcG9uZW50V29ya2luZ1NldFJlZ2lzdHJ5UmVhZGVyKCkgewotCQkJc3VwZXIoSjJFRU5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIENPTVBPTkVOVF9XT1JLSU5HX1NFVCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmV4dGVuc2lvbnMuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBhbkVsZW1lbnQpIHsKLQkJCWlmIChDT01QT05FTlRfV09SS0lOR19TRVQuZXF1YWxzKGFuRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYWRkQ29tbW9uV29ya2luZ1NldERlc2NyaXB0b3IobmV3IENvbXBvbmVudFdvcmtpbmdTZXREZXNjcmlwdG9yKGFuRWxlbWVudCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotCQkJCQkvLwkgbG9nIGFuIGVycm9yIHNpbmNlIGl0cyBub3Qgc2FmZSB0byBvcGVuIGEgZGlhbG9nIGhlcmUKLQkJCQkJV29ya2JlbmNoTmF2aWdhdG9yUGx1Z2luLmxvZygiVW5hYmxlIHRvIGNyZWF0ZSBjb21tb24gd29ya2luZyBzZXQgZGVzY3JpcHRvci4iLCBlLmdldFN0YXR1cygpKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRQYWdlSWQKLQkgKiBAcGFyYW0gdHlwZUlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvciBnZXRXb3JraW5nU2V0RGVzY3JpcHRvcihTdHJpbmcgZWRpdFBhZ2VJZCwgU3RyaW5nIHR5cGVJZCkgewotCQlDb21wb25lbnRXb3JraW5nU2V0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZ2V0Q29tcG9uZW50V29ya2luZ1NldERlc2NyaXB0b3JzKCk7Ci0JCUNvbXBvbmVudFdvcmtpbmdTZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlmb3IgKGludCB4PTA7IHg8IGRlc2NyaXB0b3JzLmxlbmd0aCA7ICsreCkgewotCQkJZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW3hdOwotCQkJaWYgKGRlc2NyaXB0b3IuZ2V0SWQoKS5lcXVhbHMoZWRpdFBhZ2VJZCkgCi0JCQkJCSYmIGRlc2NyaXB0b3IuZ2V0VHlwZUlkKCkuZXF1YWxzKHR5cGVJZCkpCi0JCQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvd29ya2luZ3NldHMvQ29tcG9uZW50V29ya2luZ1NldFVwZGF0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0VXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGRhOWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC93b3JraW5nc2V0cy9Db21wb25lbnRXb3JraW5nU2V0VXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0VXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRXb3JraW5nU2V0VXBkYXRlciBpbXBsZW1lbnRzIElXb3JraW5nU2V0VXBkYXRlciwKLQkJSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIvKiwgSVJlc291cmNlRGVsdGFWaXNpdG9yKi8gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkNvbXBvbmVudFdvcmtpbmdTZXRQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgTGlzdCBmV29ya2luZ1NldHM7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIHByb2plY3RTdHJ1Y3R1cmVFZGl0czsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFdvcmtpbmdTZXREZWx0YSB7Ci0JCXByaXZhdGUgSVdvcmtpbmdTZXQgZldvcmtpbmdTZXQ7Ci0JCXByaXZhdGUgTGlzdCBmRWxlbWVudHM7Ci0JCXByaXZhdGUgYm9vbGVhbiBmQ2hhbmdlZDsKLQkJcHVibGljIFdvcmtpbmdTZXREZWx0YShJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCQlmV29ya2luZ1NldD0gd29ya2luZ1NldDsKLQkJCWZFbGVtZW50cz0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKSkpOwotCQl9Ci0JCQotCQlwdWJsaWMgSVdvcmtpbmdTZXQgZ2V0V29ya2luZ1NldCgpIHsKLQkJCXJldHVybiBmV29ya2luZ1NldDsKLQkJfQotCQkKLQkJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZkVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZCggT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXN5bmNocm9uaXplZCAoZldvcmtpbmdTZXQpIHsKLQkJCQlpZiAoaW5kZXhPZihlbGVtZW50KSA9PS0xKSB7Ci0JCQkJCWZFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCWZDaGFuZ2VkPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQlpZiAoZkVsZW1lbnRzLnJlbW92ZShpbmRleCkgIT0gbnVsbCkgewotCQkJCWZDaGFuZ2VkPSB0cnVlOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0JCQlpZiAoZkNoYW5nZWQpIHsKLQkJCQlmV29ya2luZ1NldC5zZXRFbGVtZW50cygoSUFkYXB0YWJsZVtdKWZFbGVtZW50cy50b0FycmF5KG5ldyBJQWRhcHRhYmxlW2ZFbGVtZW50cy5zaXplKCldKSk7Ci0JCQl9Ci0JCX0KLQkgfQotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRXb3JraW5nU2V0VXBkYXRlcigpIHsKLQkJc3VwZXIoKTsKLQkJZldvcmtpbmdTZXRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0VXBkYXRlciNhZGQob3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElXb3JraW5nU2V0IHdvcmtpbmdTZXQpIHsKLQkJLy9jaGVja0VsZW1lbnRFeGlzdGVuY2Uod29ya2luZ1NldCk7Ci0JCXN5bmNocm9uaXplZCAoZldvcmtpbmdTZXRzKSB7Ci0JCQkKLQkJCXVwZGF0ZUVsZW1lbnRzKHdvcmtpbmdTZXQpOwotCQkJZldvcmtpbmdTZXRzLmFkZCh3b3JraW5nU2V0KTsKLQkJfQotCi0JfQotCQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdHlwZUlkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc01vZHVsZVR5cGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJZCkgewotCQlib29sZWFuIGJSZXR1cm4gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCQkJbW9kdWxlQ29yZSA9IGdldFN0cnVjdHVyZUVkaXQocHJvamVjdCk7Ci0JCQkJaWYgKG1vZHVsZUNvcmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkJCVdvcmtiZW5jaENvbXBvbmVudFtdIHdvcmtCZW5jaE1vZHVsZXMgPSBtb2R1bGVDb3JlLmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJCQlpZiAod29ya0JlbmNoTW9kdWxlcyAhPSBudWxsKXsKLQkJCQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JrQmVuY2hNb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICAgICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IHdvcmtCZW5jaE1vZHVsZXNbaV07Ci0JCSAgICAgICAgICAgICAgICAgQ29tcG9uZW50VHlwZSBjb21wb25lbnRUeXBlID0gbW9kdWxlLmdldENvbXBvbmVudFR5cGUoKSA7Ci0JCQkJCQkgaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkgewotCQkJCQkJCSAvLyBBbHRob3VnaCB0aGlzIGNvbmRpdGlvbiBpcyBiYWQsIHVudGlsIHRoZSB0eXBlIGhhcyBiZWVuIHNldCBkdXJpbmcgY3JlYXRpb24sIG5vdGlmaWNhdGlvbnMgbWF5IGJlIHByb2Nlc3NlZC4KLS8vCQkJCQkJCSBTdHJpbmcgbXNnID0gIkNvbXBvbmVudCBUeXBlIGlzIG51bGwgZm9yIHRoZSBtb2R1bGU6ICIgKyBtb2R1bGUuZ2V0TmFtZSgpICsgIiBpbiBwcm9qZWN0OiAiICsgcHJvamVjdC5nZXROYW1lKCk7Ci0vLwkJCQkJCQkgTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhtc2csTGV2ZWwuU0VWRVJFKTsKLQkJCQkJCQkgY29udGludWU7Ci0JCQkJCQkgfQotCQkgICAgICAgICAgICAgICAgIGlmICh0eXBlSWQuZXF1YWxzKGNvbXBvbmVudFR5cGUuZ2V0Q29tcG9uZW50VHlwZUlkKCkpKSB7Ci0JCSAgICAgICAgICAgICAgICAgCWJSZXR1cm4gPSB0cnVlOwotCQkgICAgICAgICAgICAgICAgIAlicmVhazsKLQkJICAgICAgICAgICAgICAgICB9Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCXJldHVybiBiUmV0dXJuOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0VXBkYXRlciNyZW1vdmUob3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKElXb3JraW5nU2V0IHdvcmtpbmdTZXQpIHsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCXN5bmNocm9uaXplZChmV29ya2luZ1NldHMpIHsKLQkJCXJlc3VsdD0gZldvcmtpbmdTZXRzLnJlbW92ZSh3b3JraW5nU2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0VXBkYXRlciNjb250YWlucyhvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCXN5bmNocm9uaXplZChmV29ya2luZ1NldHMpIHsKLQkJCXJldHVybiBmV29ya2luZ1NldHMuY29udGFpbnMod29ya2luZ1NldCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldFVwZGF0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3luY2hyb25pemVkKGZXb3JraW5nU2V0cykgewotCQkJZldvcmtpbmdTZXRzLmNsZWFyKCk7Ci0JCX0KLQkJZGlzcG9zZVN0cnVjdHVyZUVkaXRzKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkKLSAJICAgIElSZXNvdXJjZURlbHRhIGRlbHRhPSBldmVudC5nZXREZWx0YSgpOwotIAkgICAgaWYgKGRlbHRhID09IG51bGwpIHJldHVybjsKLQkJSVJlc291cmNlRGVsdGFbXSBhZmZlY3RlZENoaWxkcmVuPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkFEREVEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8IElSZXNvdXJjZURlbHRhLkNIQU5HRUQsIElSZXNvdXJjZS5QUk9KRUNUKTsKLQkJaWYgKGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGE9IGFmZmVjdGVkQ2hpbGRyZW5baV07Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQotCQkJCUlXb3JraW5nU2V0W10gd29ya2luZ1NldHM7Ci0JCQkJc3luY2hyb25pemVkKGZXb3JraW5nU2V0cykgewotCQkJCQl3b3JraW5nU2V0cz0gKElXb3JraW5nU2V0W10pZldvcmtpbmdTZXRzLnRvQXJyYXkobmV3IElXb3JraW5nU2V0W2ZXb3JraW5nU2V0cy5zaXplKCldKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgdz0gMDsgdyA8IHdvcmtpbmdTZXRzLmxlbmd0aDsgdysrKSB7Ci0JCQkJCVdvcmtpbmdTZXREZWx0YSB3b3JraW5nU2V0RGVsdGE9IG5ldyBXb3JraW5nU2V0RGVsdGEod29ya2luZ1NldHNbd10pOwotCQkJCQlwcm9jZXNzUmVzb3VyY2VEZWx0YSh3b3JraW5nU2V0RGVsdGEscHJvamVjdERlbHRhLCBwcm9qZWN0KTsKLQkJCQkJd29ya2luZ1NldERlbHRhLnByb2Nlc3MoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Jlc291cmNlRGVsdGEoV29ya2luZ1NldERlbHRhIHJlc3VsdCwgSVJlc291cmNlRGVsdGEgYURlbHRhLCBJUHJvamVjdCBhUHJvamVjdCkgewotCQkvL0lSZXNvdXJjZSByZXNvdXJjZT0gYURlbHRhLmdldFJlc291cmNlKCk7Ci0JCQotCQlpbnQgaW5kZXg9IHJlc3VsdC5pbmRleE9mKGFQcm9qZWN0KTsKLQkJaW50IGtpbmQ9IGFEZWx0YS5nZXRLaW5kKCk7Ci0JCWludCBmbGFncz0gYURlbHRhLmdldEZsYWdzKCk7Ci0JCQotCQkKLQkJc3dpdGNoIChhRGVsdGEuZ2V0S2luZCgpKSB7Ci0JCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJIGlmIChpbmRleCAhPSAtMSkgewotCQkJCSAJcmVzdWx0LnJlbW92ZShpbmRleCkgOwotCQkJCSB9Ci0JCQkJIGRpc3Bvc2VTdHJ1Y3R1cmVFZGl0cyhhUHJvamVjdCk7Ci0JCQkJIGJyZWFrOwotCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDogewotCQkJCSBDb21wb25lbnRXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSAoQ29tcG9uZW50V29ya2luZ1NldCkgcmVzdWx0LmdldFdvcmtpbmdTZXQoKTsKLQkJCQkgaWYgKGNvbnRhaW5zTW9kdWxlVHlwZShhUHJvamVjdCx3b3JraW5nU2V0LmdldFR5cGVJZCgpKSkgewotCQkJCSAJaWYgKGluZGV4ID09IC0xKQotCQkJCSAJCXJlc3VsdC5hZGQoYVByb2plY3QpOwotCQkJCSB9Ci0JCQkJIGJyZWFrOwotCQl9Ci0JCQotCQkKLQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCS8vIGJvb2xlYW4gbmF0dXJlTWF5SGF2ZUNoYW5nZWQgPSAoKGFEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApICYmICgoYURlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSA9PSAwKTsKLQkJCWJvb2xlYW4gcHJvamVjdE9wZW5TdGF0ZUNoYW5nZWQgPSAoKGFEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCk7Ci0JCQlpZiAoLypuYXR1cmVNYXlIYXZlQ2hhbmdlZCB8fCovIHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkKSB7Ci0JCQkJaWYgKGFQcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCUNvbXBvbmVudFdvcmtpbmdTZXQgd29ya2luZ1NldCA9IChDb21wb25lbnRXb3JraW5nU2V0KSByZXN1bHQuZ2V0V29ya2luZ1NldCgpOwotCQkJCQkgaWYgKGNvbnRhaW5zTW9kdWxlVHlwZShhUHJvamVjdCx3b3JraW5nU2V0LmdldFR5cGVJZCgpKSkgewotCQkJCQkJcmVzdWx0LmFkZChhUHJvamVjdCk7Ci0JCQkJCSB9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCSAJcmVzdWx0LnJlbW92ZShpbmRleCkgOwotCQkJCQkgfQotCQkJCQlkaXNwb3NlU3RydWN0dXJlRWRpdHMoYVByb2plY3QpOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQkgQ29tcG9uZW50V29ya2luZ1NldCB3b3JraW5nU2V0ID0gKENvbXBvbmVudFdvcmtpbmdTZXQpIHJlc3VsdC5nZXRXb3JraW5nU2V0KCk7Ci0JCQkJIGlmIChjb250YWluc01vZHVsZVR5cGUoYVByb2plY3Qsd29ya2luZ1NldC5nZXRUeXBlSWQoKSkpIHsKLQkJCQkgCWlmIChpbmRleCA9PSAtMSkKLQkJCQkgCQlyZXN1bHQuYWRkKGFQcm9qZWN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkgCWlmIChpbmRleCAhPSAtMSkgewotCQkJCSAJCXJlc3VsdC5yZW1vdmUoaW5kZXgpIDsKLQkJCQkgCX0KLQkJCQkgfQotCQkJCSBicmVhazsJCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVFbGVtZW50cyhJV29ya2luZ1NldCB3b3JraW5nU2V0KSB7Ci0JCWlmICh3b3JraW5nU2V0IGluc3RhbmNlb2YgQ29tcG9uZW50V29ya2luZ1NldCkgewotCQkJQ29tcG9uZW50V29ya2luZ1NldCBjb21wb25lbnRXb3JraW5nU2V0ID0gKENvbXBvbmVudFdvcmtpbmdTZXQpIHdvcmtpbmdTZXQ7Ci0JCQlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChjb250YWluc01vZHVsZVR5cGUocHJvamVjdHNbaV0sY29tcG9uZW50V29ya2luZ1NldC5nZXRUeXBlSWQoKSkpIHsKLQkJCQkJCXJlc3VsdC5hZGQocHJvamVjdHNbaV0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJfQotCQkJY29tcG9uZW50V29ya2luZ1NldC5zZXRFbGVtZW50cygoSUFkYXB0YWJsZVtdKXJlc3VsdC50b0FycmF5KG5ldyBJQWRhcHRhYmxlW3Jlc3VsdC5zaXplKCldKSk7Ci0JCX0KLQl9Ci0KLQkKLQkgcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTdHJ1Y3R1cmVFZGl0cygpIHsKLQkJCVNldCBrZXlzID0gZ2V0UHJvamVjdFN0cnVjdHVyZUVkaXRzKCkua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlQcm9qZWN0IHByb2ogPSAoSVByb2plY3QpIGl0ZXIubmV4dCgpOwotCQkJCVN0cnVjdHVyZUVkaXQgc2UgPShTdHJ1Y3R1cmVFZGl0KWdldFByb2plY3RTdHJ1Y3R1cmVFZGl0cygpLmdldChwcm9qKTsKLQkJCQlpZiAoc2UgIT0gbnVsbCkKLQkJCQkJc2UuZGlzcG9zZSgpOwotCQkJCQotCQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTdHJ1Y3R1cmVFZGl0cyhJUHJvamVjdCBhUHJvamVjdCkgewotCQlTdHJ1Y3R1cmVFZGl0IHNlID0oU3RydWN0dXJlRWRpdClnZXRQcm9qZWN0U3RydWN0dXJlRWRpdHMoKS5nZXQoYVByb2plY3QpOwotCQlpZiAoc2UgIT0gbnVsbCkKLQkJCXNlLmRpc3Bvc2UoKTsKLQkJZ2V0UHJvamVjdFN0cnVjdHVyZUVkaXRzKCkucmVtb3ZlKGFQcm9qZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGdldFByb2plY3RTdHJ1Y3R1cmVFZGl0cygpIHsKLQkJaWYgKHByb2plY3RTdHJ1Y3R1cmVFZGl0cyAhPSBudWxsKSAKLQkJCXJldHVybiBwcm9qZWN0U3RydWN0dXJlRWRpdHM7Ci0JCSAKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJICAgaWYgKHByb2plY3RTdHJ1Y3R1cmVFZGl0cyA9PSBudWxsKQotCQkJIHByb2plY3RTdHJ1Y3R1cmVFZGl0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RTdHJ1Y3R1cmVFZGl0czsKLQkJCi0JfQotCQotCXB1YmxpYyBTdHJ1Y3R1cmVFZGl0IGdldFN0cnVjdHVyZUVkaXQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGdldFByb2plY3RTdHJ1Y3R1cmVFZGl0cygpLmdldChhUHJvamVjdCkgPT0gbnVsbCkKLQkJCWdldFByb2plY3RTdHJ1Y3R1cmVFZGl0cygpLnB1dChhUHJvamVjdCxTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGFQcm9qZWN0KSk7Ci0JCXJldHVybiAoU3RydWN0dXJlRWRpdClnZXRQcm9qZWN0U3RydWN0dXJlRWRpdHMoKS5nZXQoYVByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMGJkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBsdWdpbi5uYW1lPUoyRUUgRXh0ZW5zaW9ucyB0byBDb21tb24gTmF2aWdhdG9yCi1QbHVnaW4ucHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1QbHVnaW4uZGVzY3JpcHRpb249Q29udGFpbnMgSjJFRSBFeHRlbnNpb25zIGJ1aWx0IG9uIHRoZSBDb21tb24gTmF2aWdhdG9yIEZyYW1ld29yawotajJlZT1KMkVFCi1qMmVlLnZpZXdfdWlfPVByb2plY3QgRXhwbG9yZXIgCi1qMmVlLmNhdGVnb3J5X3VpXz1KMkVFCi1FbnRlcnByaXNlX0FwcGxpY2F0aW9ucz1FbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotQXBwbGljYXRpb25fQ2xpZW50X1Byb2plY3RzPUFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0cwotQ29ubmVjdG9yX1Byb2plY3RzPUNvbm5lY3RvciBQcm9qZWN0cwotRUpCX1Byb2plY3RzPUVKQiBQcm9qZWN0cwotV2ViX1Byb2plY3RzPUR5bmFtaWMgV2ViIFByb2plY3RzCi1PdGhlcl9Qcm9qZWN0cz1PdGhlciBQcm9qZWN0cwotSjJFRV9BZGRfTW9kdWxlPUoyRUUgQWRkIE1vZHVsZQotQWRkc19KMkVFX21vZHVsZXNfdG9fRUFSX3Byb2plY3RzPUFkZHMgSjJFRSBtb2R1bGVzIHRvIEVBUiBwcm9qZWN0cwotSjJFRV9BZGRfVXRpbGl0eV9KYXI9SjJFRSBBZGQgVXRpbGl0eSBKYXIKLUFkZHNfVXRpbGl0eV9KYXJzX3RvX0VBUl9wcm9qZWN0cz1BZGRzIFV0aWxpdHkgSmFycyB0byBFQVIgcHJvamVjdHMKLUoyRUVfVXRpbGl0eV9KYXJfSW1wb3J0PUoyRUUgVXRpbGl0eSBKYXIgSW1wb3J0Ci1JbXBvcnRfYV9qYXJfZmlsZV9VSV89SW1wb3J0IGEgamFyIGZpbGUgaW50byBhbiBFQVIgcHJvamVjdCBhcyBhIEoyRUUgVXRpbGl0eSBKYXIKLUoyRUVfSW1wb3J0PUoyRUUgSW1wb3J0Ci1KMkVFX0lNUE9SVF9NRVNTQUdFPUltcG9ydHMgSjJFRSBhcnRpZmFjdHM6IEVBUnMsIEVKQiBKYXJzLCBBcHBsaWNhdGlvbiBDbGllbnQgSmFycywgUkFScyBhbmQgV0FScwotCi0KLWV4dGVuc2lvbi5qMmVlLm5hbWU9SjJFRSBEZXBsb3ltZW50IERlc2NyaXB0b3JzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTMzMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb21wb25lbnRXb3JraW5nU2V0IiBuYW1lPSJDb21wb25lbnQgV29ya2luZyBTZXQiIHNjaGVtYT0ic2NoZW1hL2NvbXBvbmVudFdvcmtpbmdTZXQuZXhzZCIvPgotICAgCi08IS0tIERyb3AgQWRhcHRlciBmb3IgQWRkaW5nIE1vZHVsZXMgdG8gRUFScyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuYWRkTW9kdWxlLmRyb3BIYW5kbGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLnZpZXdzLmRyb3BIYW5kbGVyIj4KLSAgICAgIDxkcm9wSGFuZGxlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuQWRkTW9kdWxlRHJvcEFjdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuYWRkTW9kdWxlLmRyb3BIYW5kbGVyIgotICAgICAgICAgICAgbmFtZT0iJUoyRUVfQWRkX01vZHVsZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQWRkc19KMkVFX21vZHVsZXNfdG9fRUFSX3Byb2plY3RzIj4KLSAgICAgICAgIDxkcmFnRW5hYmxlbWVudD4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50Ij4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3IiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphciI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkVBUk5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZHJhZ0VuYWJsZW1lbnQ+Ci0gICAgICAgICA8ZHJvcEVuYWJsZW1lbnQKLSAgICAgICAgICAgIHZhbGlkYXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kLkFkZE1vZHVsZURyb3BBY3Rpb24iPgotICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5FQVJQcm9qZWN0TWFwIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZHJvcEVuYWJsZW1lbnQ+Ci0gICAgICAgICA8c2VyaWFsaXplcnM+Ci0gICAgICAgICAgICA8c2VyaWFsaXplcgotICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIiCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZC5Nb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplciI+Ci0gICAgICAgICAgICA8L3NlcmlhbGl6ZXI+Ci0gICAgICAgICA8L3NlcmlhbGl6ZXJzPgotICAgICAgPC9kcm9wSGFuZGxlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSBEcm9wIEFkYXB0ZXIgZm9yIEFkZGluZyBVdGlsaXR5IEphcnMgdG8gRUFScyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUuZG5kLmFkZFV0aWxpdHlKYXIuZHJvcEhhbmRsZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3Iudmlld3MuZHJvcEhhbmRsZXIiPgotICAgICAgPGRyb3BIYW5kbGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZC5BZGRVdGlsaXR5SmFyRHJvcEFjdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuYWRkVXRpbGl0eUphci5kcm9wSGFuZGxlciIKLSAgICAgICAgICAgIG5hbWU9IiVKMkVFX0FkZF9VdGlsaXR5X0phciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQWRkc19VdGlsaXR5X0phcnNfdG9fRUFSX3Byb2plY3RzIj4KLSAgICAgICAgIDxkcmFnRW5hYmxlbWVudD4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50Ij4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3IiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphciI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZHJhZ0VuYWJsZW1lbnQ+Ci0gICAgICAgICA8ZHJvcEVuYWJsZW1lbnQKLSAgICAgICAgICAgIHZhbGlkYXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kLkFkZFV0aWxpdHlKYXJEcm9wQWN0aW9uIj4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLkVBUlByb2plY3RNYXAiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9kcm9wRW5hYmxlbWVudD4KLSAgICAgICAgIDxzZXJpYWxpemVycz4KLSAgICAgICAgICAgIDxzZXJpYWxpemVyCi0gICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLmRuZC5Nb2R1bGVJZGVudGlmaWVyU2VyaWFsaXplciIKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUuZG5kLnV0aWxpdHlKYXJJZGVudGlmaWVyU2VyaWFsaXplciI+Ci0gICAgICAgICAgICA8L3NlcmlhbGl6ZXI+Ci0gICAgICAgICA8L3NlcmlhbGl6ZXJzPgotICAgICAgPC9kcm9wSGFuZGxlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS5kbmQudXRpbGl0eUphckltcG9ydC5kcm9wSGFuZGxlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cy5kcm9wSGFuZGxlciI+Ci0gICAgICA8ZHJvcEhhbmRsZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kLkFkZEV4dGVybmFsVXRpbGl0eUphckRyb3BBY3Rpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZC51dGlsaXR5SmFySW1wb3J0LmRyb3BIYW5kbGVyIgotICAgICAgICAgICAgbmFtZT0iJUoyRUVfVXRpbGl0eV9KYXJfSW1wb3J0IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVJbXBvcnRfYV9qYXJfZmlsZV9VSV8iPgotICAgICAgICAgPGRyb3BFbmFibGVtZW50PgotICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZHJvcEVuYWJsZW1lbnQ+Ci0gICAgICA8L2Ryb3BIYW5kbGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLmRuZC5qMmVlSW1wb3J0LmRyb3BIYW5kbGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLnZpZXdzLmRyb3BIYW5kbGVyIj4KLSAgICAgIDxkcm9wSGFuZGxlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuSjJFRUltcG9ydERyb3BBY3Rpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZC5qMmVlSW1wb3J0LmRyb3BIYW5kbGVyIgotICAgICAgICAgICAgbmFtZT0iJUoyRUVfSW1wb3J0IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVKMkVFX0lNUE9SVF9NRVNTQUdFIj4KLSAgICAgICAgIDxkcm9wRW5hYmxlbWVudD4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICA8b3I+Ci0JICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgCSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAJICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAJICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgCSAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIj4KLQkgICAgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiPgotICAgICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rvck5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQiPgotICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvciI+Ci0gICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyIj4KLSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCI+Ci0gICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9kcm9wRW5hYmxlbWVudD4KLSAgICAgIDwvZHJvcEhhbmRsZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLnZpZXdzLm5hdmlnYXRvckNvbnRlbnQiPgotICAgICAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgICAgIG5hbWU9IiVleHRlbnNpb24uajJlZS5uYW1lIgotICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2hlciIKLSAgICAgICAgICAgIGljb249Imljb25zL0oyRUVQZXJzcGVjdGl2ZS5naWYiIAotICAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLSAgICAgICAgICAgIGFjdGlvblByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUFjdGlvblByb3ZpZGVyIgotICAgICAgICAgICAgb3Blbkxpc3RlbmVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkoyRUVSZXNvdXJjZU9wZW5MaXN0ZW5lciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuSjJFRUNvbnRlbnQuZXhwZXJpbWVudGFsIj4KLSAgICAgICAgIDxlbmFibGVzPgotICAgICAgICAgPG9yPgotICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgIDwvYW5kPiAgICAgIAotICAgICAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIiIC8+ICAgICAgCi0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVzPgotICAgICAgICAgCi0gICAgICAgICA8ZW1mRW5hYmxlbWVudD4KLSAgICAgICAgIAk8cGFja2FnZSB1cmk9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZSIgLz4KLSAgICAgICAgIAk8cGFja2FnZSB1cmk9ImNvbW1vbi54bWkiIC8+ICAgICAgICAgCQotICAgICAgICAgCTxwYWNrYWdlIHVyaT0iYXBwbGljYXRpb24ueG1pIiAvPiAgICAgICAgIAkgICAgICAgICAJCi0gICAgICAgICAJPHBhY2thZ2UgdXJpPSJjbGllbnQueG1pIiAvPiAgICAgICAgIAkgICAgICAgICAJCi0gICAgICAgICAJPHBhY2thZ2UgdXJpPSJtb2R1bGVtYXAueG1pIiAvPiAgICAgICAgICAgCQotICAgICAgICAgCTxwYWNrYWdlIHVyaT0iZWpiLnhtaSIgLz4gICAgICAgICAgICAgICAgIAkKLSAgICAgICAgIAk8cGFja2FnZSB1cmk9ImpjYS54bWkiIC8+ICAgICAgICAgICAgICAgICAJCi0gICAgICAgICAJPHBhY2thZ2UgdXJpPSJ3ZWJhcHBsaWNhdGlvbi54bWkiIC8+ICAgICAgICAgICAgICAgICAJCi0gICAgICAgICAJPHBhY2thZ2UgdXJpPSJqc3AueG1pIiAvPiAgICAKLSAgICAgICAgICA8cGFja2FnZSB1cmk9ImNvbW1vbmV4dC54bWkiIC8+Ci0gICAgICAgICAgPHBhY2thZ2UgdXJpPSJsb2NhbHRyYW4ueG1pIiAvPiAgICAgICAgICAKLSAgICAgICAgICA8cGFja2FnZSB1cmk9ImVqYmV4dC54bWkiIC8+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICA8cGFja2FnZSB1cmk9IndlYmFwcGV4dC54bWkiIC8+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICA8cGFja2FnZSB1cmk9ImFwcGxpY2F0aW9uZXh0LnhtaSIgLz4gICAgICAgICAgICAKLSAgICAgICAgICA8cGFja2FnZSB1cmk9ImFwcGxpY2F0aW9uY2xpZW50ZXh0LnhtaSIgLz4gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICA8cGFja2FnZSB1cmk9ImVqYmJuZC54bWkiIC8+ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgPHBhY2thZ2UgdXJpPSJ3ZWJhcHBibmQueG1pIiAvPiAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIDxwYWNrYWdlIHVyaT0iY29tbW9uYm5kLnhtaSIgLz4gIAotICAgICAgICAgIDxwYWNrYWdlIHVyaT0iajJjYm5kLnhtaSIgLz4gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICA8cGFja2FnZSB1cmk9ImNsaWVudGJuZC54bWkiIC8+ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgPHBhY2thZ2UgdXJpPSJhcHBsaWNhdGlvbmJuZC54bWkiIC8+ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgPHBhY2thZ2UgdXJpPSJlamJyZGJtYXBwaW5nLnhtaSIgLz4gICAgICAgIAotICAgICAgICAgCSAgICAgICAgICAgICAJCi0gICAgICAgICA8L2VtZkVuYWJsZW1lbnQ+Ci0gICAgICA8L25hdmlnYXRvckNvbnRlbnQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLnZpZXdzLmFjdGlvblByb3ZpZGVyIj4KLSAgICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLmFjdGlvbnMuT3BlbkFjdGlvbnNFeHRlbnNpb24iID4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgCTxvcj4KLQkgICAgICAgICAJPG9iamVjdENsYXNzCi0JICAgICAgICAgCQlhZGFwdGFibGU9InRydWUiCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JICAgICAgICAgCTxvYmplY3RDbGFzcwotCSAgICAgICAgIAkJYWRhcHRhYmxlPSJ0cnVlIgotCSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciIgLz4JICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4gCi0gICAKLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cy5hY3Rpb25Qcm92aWRlciI+Ci0gICAgICA8YWN0aW9uUHJvdmlkZXIgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuYWN0aW9ucy5Qb3J0aW5nQWN0aW9uRXh0ZW5zaW9uIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4gCi0JCQkJICAgPG9iamVjdENsYXNzCi0JCQkJCQlhZGFwdGFibGU9InRydWUiCi0JCQkJCQluYW1lPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4JCQotCQkJCQk8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAJCQlhZGFwdGFibGU9InRydWUiCi0JICAgICAgICAgICAgICAgICAgCW5hbWU9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciIgLz4JIAotCSAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAJCQlhZGFwdGFibGU9InRydWUiCi0JICAgICAgICAgICAgICAgICAgCW5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC53b3JraW5nc2V0cy5Db21wb25lbnRXb3JraW5nU2V0IiAvPgkgCQkJCQkJCQkJCQkJCQkJCQkJCQkKLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotICAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIENvbXBvbmVudCBXb3JraW5nIFNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2luZ1NldHMiPgotICAgICAgPHdvcmtpbmdTZXQKLSAgICAgICAgICAgIG5hbWU9IkNvbXBvbmVudCIKLSAgICAgICAgICAgICB1cGRhdGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC53b3JraW5nc2V0cy5Db21wb25lbnRXb3JraW5nU2V0VXBkYXRlciIKLSAgICAgICAgICAgICBpY29uPSJpY29ucy9KMkVFUGVyc3BlY3RpdmUuZ2lmIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuQ29tcG9uZW50V29ya2luZ1NldFBhZ2UiPgotICAgICAgPC93b3JraW5nU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuY29tcG9uZW50V29ya2luZ1NldCI+Ci0gICAgICAgICAgICAgPGNvbXBvbmVudFdvcmtpbmdTZXQKLSAgICAgICAgICAgICAJICBpZCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuQ29tcG9uZW50V29ya2luZ1NldFBhZ2UiCi0gICAgICAgICAgICAgICAgICB0eXBlSWQgPSAianN0LmVqYiIKLSAgICAgICAgICAgICAgICAgIGljb24gPSAiaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZiIKLSAgICAgICAgICAgICAgICAgIGxhYmVsID0gIiVFSkJfUHJvamVjdHMiPgotICAgICAgICAgICAgIDwvY29tcG9uZW50V29ya2luZ1NldD4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbiAKLSAgICAgICAJCXBvaW50PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuY29tcG9uZW50V29ya2luZ1NldCI+Ci0gICAgICAJCTxjb21wb25lbnRXb3JraW5nU2V0Ci0gICAgICAgICAgICAgCSAgaWQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkNvbXBvbmVudFdvcmtpbmdTZXRQYWdlIgotICAgICAgICAgICAgICAgICAgdHlwZUlkID0gImpzdC53ZWIiCi0gICAgICAgICAgICAgICAgICBpY29uID0gImljb25zL3dlYmdyb3VwX29iai5naWYiCi0gICAgICAgICAgICAgICAgICBsYWJlbCA9ICIlV2ViX1Byb2plY3RzIj4KLSAgICAgICAgICAgICA8L2NvbXBvbmVudFdvcmtpbmdTZXQ+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24gCi0gICAgICAgCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLmNvbXBvbmVudFdvcmtpbmdTZXQiPgotICAgICAgCQkgIDxjb21wb25lbnRXb3JraW5nU2V0Ci0gICAgICAgICAgICAgCSAgaWQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkNvbXBvbmVudFdvcmtpbmdTZXRQYWdlIgotICAgICAgICAgICAgICAgICAgdHlwZUlkID0gImpzdC5lYXIiCi0gICAgICAgICAgICAgICAgICBpY29uID0gImljb25zL2Vhcmdyb3VwX29iai5naWYiCi0gICAgICAgICAgICAgICAgICBsYWJlbCA9ICIlRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnMiPgotICAgICAgICAgICAgIDwvY29tcG9uZW50V29ya2luZ1NldD4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgCi0gICAgICA8ZXh0ZW5zaW9uIAotICAgICAgIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5jb21wb25lbnRXb3JraW5nU2V0Ij4KLSAgICAgIAkJICA8Y29tcG9uZW50V29ya2luZ1NldAotICAgICAgICAgICAgIAkgIGlkID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5Db21wb25lbnRXb3JraW5nU2V0UGFnZSIKLSAgICAgICAgICAgICAgICAgIHR5cGVJZCA9ICJqc3QuYXBwY2xpZW50IgotICAgICAgICAgICAgICAgICAgaWNvbiA9ICJpY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmIgotICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiJUFwcGxpY2F0aW9uX0NsaWVudF9Qcm9qZWN0cyI+Ci0gICAgICAgICAgICAgPC9jb21wb25lbnRXb3JraW5nU2V0PgotICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAKLSAgICAgIDxleHRlbnNpb24gCi0gICAgICAgCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLmNvbXBvbmVudFdvcmtpbmdTZXQiPgotICAgICAgCQkgIDxjb21wb25lbnRXb3JraW5nU2V0Ci0gICAgICAgICAgICAgCSAgaWQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkNvbXBvbmVudFdvcmtpbmdTZXRQYWdlIgotICAgICAgICAgICAgICAgICAgdHlwZUlkID0gImpzdC5jb25uZWN0b3IiCi0gICAgICAgICAgICAgICAgICBpY29uID0gImljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYiCi0gICAgICAgICAgICAgICAgICBsYWJlbCA9ICIlQ29ubmVjdG9yX1Byb2plY3RzIj4KLSAgICAgICAgICAgICA8L2NvbXBvbmVudFdvcmtpbmdTZXQ+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICAgIAotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmphdmEud29ya2luZ1NldFByb3ZpZGVycyI+Ci0gICAgICAgICAgICA8d29ya2luZ1NldFByb3ZpZGVycwotICAgICAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwud29ya2luZ3NldHMuQ29tcG9uZW50V29ya2luZ1NldFByb3ZpZGVyIj4KLSAgICAgICAgICAgIDwvd29ya2luZ1NldFByb3ZpZGVycz4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgIDxleHRlbnNpb24KLSAgICAgICAJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVsZW1lbnRGYWN0b3JpZXMiPgotCSAgICA8ZmFjdG9yeQotCSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzLkNvbXBvbmVudFdvcmtpbmdTZXRGYWN0b3J5IgotCSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzLkNvbXBvbmVudFdvcmtpbmdTZXRGYWN0b3J5Ii8+Ci0JIDwvZXh0ZW5zaW9uPiAgCi0JIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEFkZGluZyB0aGUgTmV3IHRvIHRoZSBDb21wb25lbnQgV29ya2luZyBTZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotIAotCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3Iudmlld3MuYWN0aW9uUHJvdmlkZXIiPgotICAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuYWN0aW9ucy5PcGVuQWN0aW9uc0V4dGVuc2lvbiIgPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAJPG9yPgotCSAgICAgICAgIAk8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAJCWFkYXB0YWJsZT0idHJ1ZSIKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwud29ya2luZ3NldHMuQ29tcG9uZW50V29ya2luZ1NldCIgLz4KLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2FjdGlvblByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+IAotICAgCi0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2guY29tbW9uV2l6YXJkIj4KLSAgICAgICAgICA8IS0tIEVBUiBOZXcgLS0+Ci0gICAgICAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4gCi0gICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC53b3JraW5nc2V0cy5Db21wb25lbnRXb3JraW5nU2V0Ij4KLQkgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjb21wb25lbnRUeXBlSWQiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmVhciI+Ci0gICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgIDwvYW5kPiAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgICAgPCEtLSBBcHBDbGllbnQgTmV3IC0tPgotICAgICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+IAotICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwud29ya2luZ3NldHMuQ29tcG9uZW50V29ya2luZ1NldCI+Ci0JICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29tcG9uZW50VHlwZUlkIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5hcHBjbGllbnQiPgotICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICA8L2FuZD4gICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLldlYkNvbXBvbmVudENyZWF0aW9uV2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzLkNvbXBvbmVudFdvcmtpbmdTZXQiPgotCSAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImNvbXBvbmVudFR5cGVJZCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3Qud2ViIj4KLSAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgIDwvYW5kPiAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgICA8IS0tIENvbm5lY3RvciBOZXcgLS0+Ci0gICAgICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC53b3JraW5nc2V0cy5Db21wb25lbnRXb3JraW5nU2V0Ij4KLQkgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjb21wb25lbnRUeXBlSWQiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmNvbm5lY3RvciI+Ci0gICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICA8L2FuZD4gICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgICAgPCEtLSBFSkIgTmV3IC0tPgotICAgICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5FSkJDb21wb25lbnRDcmVhdGlvbldpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLndvcmtpbmdzZXRzLkNvbXBvbmVudFdvcmtpbmdTZXQiPgotCSAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImNvbXBvbmVudFR5cGVJZCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiIj4KLSAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgIDwvYW5kPiAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgICAKLSAgICAgCi0gICAgIAotPC9wbHVnaW4+Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3MzIwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmoyZWUudWkubmF2aWdhdG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvc2NoZW1hL2NvbXBvbmVudFdvcmtpbmdTZXQuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL3NjaGVtYS9jb21wb25lbnRXb3JraW5nU2V0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzcxMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvc2NoZW1hL2NvbXBvbmVudFdvcmtpbmdTZXQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5qYXZhIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5qYXZhIiBpZD0iY29tbW9uV29ya2luZ1NldCIgbmFtZT0iQ29tbW9tIFdvcmtpbmcgU2V0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbXBvbmVudFdvcmtpbmdTZXQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbXBvbmVudFdvcmtpbmdTZXQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzOWE5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImoyZWVfdWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmFiYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLWRvYwotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotajJlZV91aS5qYXIKLUBkb3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdmYTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuY3RjLmphdmFwcm9qZWN0bmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjZDBhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogV1RQIEoyRUUgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNy4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi51aSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsaWVudC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXIuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBlcnNwZWN0aXZlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlciwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5qZHQudWksCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LndlYiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuZGVidWcudWksCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5hbm5vdGF0aW9uLm1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjNjA0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IGoyZWVfdWkvLFwKLSAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zLzIwX2NtcGJlYW5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvMjBfY21wYmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNmZThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvMjBfY21wYmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hZG93bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fkb3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlNzA4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fkb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2ODQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fycm93X2Rvd24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcnJvd19kb3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0NTVjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Fycm93X2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcnJvd3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9hcnJvd3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTA2MzIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvYXJyb3dwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9sZWZ0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9sZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4ZTc2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfbGVmdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfbGVmdDIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX2xlZnQyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzMTA1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nhc2NhZGVfbGVmdDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX3JpZ2h0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY2FzY2FkZV9yaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2I2MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jYXNjYWRlX3JpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY21wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvY21wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlZDFmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2NtcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Nvbm5lY3Rvcmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkM2FmM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9kZWFkZW5kLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZGVhZGVuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjYxOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9kZWFkZW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyLXdpei1iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXItd2l6LWJhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWU3NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXItd2l6LWJhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci13aXotaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhci13aXotaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDA5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXItd2l6LWljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJmYTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlYjNlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Vhcmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYWRiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9lamJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFiMjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2VqYl9jbGllbnRfcmVtb3ZlX2FjdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIzMjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODk0NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2NsY2wxNi9lamJfZGVwbG95X2FjdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2V4cG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4MzMwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9pbXBvcnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2NjdmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9lamJjbGllbnRqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2VqYmNsaWVudGphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTY1ZTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2VqYmNsaWVudGphcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MGIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZDQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZiM2Q0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkODU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTIwMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0YjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lamJqYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMjVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U4NmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVjNmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDA5YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2RhMjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2VqYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhYzZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3JlX2V4ZWN1dGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvcmVfZXhlY3V0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTQzYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N0b29sMTYvcmVfZXhlY3V0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9qMmVlX3BlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFjZDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWNkNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9kbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2VqYl9jbGllbnRfcmVtb3ZlX2FjdGlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhhMGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9kbGNsMTYvZWpiX2NsaWVudF9yZW1vdmVfYWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2VqYl9kZXBsb3lfYWN0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NTczODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL2RsY2wxNi9lamJfZGVwbG95X2FjdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzEzX2Vhcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzEzX2Vhcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI5YjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8xM19lYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9jbXBiZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfY21wYmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTgzNWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9jbXBiZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvMjFfZWpiX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2JhNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2VqYl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2LzIxX2VqYmphcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGFlMDUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi8yMV9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYW5ub3RhdGlvbl9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWMxZDJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXBwY2xpZW50XzE0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ4MzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNF9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2FwcGNsaWVudF8xNF9kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQwOGFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBjbGllbnRfMTRfZGVwbG95LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9leHR3ZWJzZXJ2aWNlaXRlbXByb3ZpZGVyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXh0d2Vic2VydmljZWl0ZW1wcm92aWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNjNmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9leHR3ZWJzZXJ2aWNlaXRlbXByb3ZpZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3NTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsX2hvbWVfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkNjA5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZmViZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWxfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcmVtb3RlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzZTM5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcmVtb3RlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3NlcnZpY2VfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NjY2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViU2VydmljZUl0ZW1Qcm92aWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViU2VydmljZXNGb2xkZXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlc0ZvbGRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjMwMzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJTZXJ2aWNlc0ZvbGRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF8xNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwXzE0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmOTE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwXzE0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViYXBwX2RlcGxveS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvYW5ub3RhdGlvbl9iZWFuX292ZXJsYXkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3Nzc1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvYW5ub3RhdGlvbl9iZWFuX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9hbm5vdGF0aW9uX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzFkMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Fubm90YXRpb25fcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYxY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTc3YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Nvbm5lY3Rvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2Rpc19hbm5vdGF0aW9uX2JlYW5fb3ZlcmxheS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFjNDk4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUwZDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lamJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZW50ZXJwcmlzZV9hcHBfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzE5YzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2V4dGVybmFsV2ViU2VydmljZU92ZXJsYXlfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9leHRlcm5hbFdlYlNlcnZpY2VPdmVybGF5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZmY0MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2V4dGVybmFsV2ViU2VydmljZU92ZXJsYXlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODM4MGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3NTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2tleV9pbnRlcmZfb3YuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2tleV9pbnRlcmZfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDcwNDQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9rZXlfaW50ZXJmX292LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgyNzM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaG9tZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQ2MDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9ob21lX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L2xvY2FsX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlMTY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9sb2NhbF9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2ZmViZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbG9jYWxfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvcmVtb3RlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvcmVtb3RlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YzljYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9yZW1vdGVfaW50ZXJmYWNlX3Bvc2l0aW9uZWRfb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2UzOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3JlbW90ZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmljZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YwNjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9vdmVybGF5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc2VydmljZV9pbnRlcmZhY2VfcG9zaXRpb25lZF9vdmVybGF5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQ2NjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi9zZXJ2aWNlX2ludGVyZmFjZV9wb3NpdGlvbmVkX292ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTk2MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkX21lc3NfZGVzdF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkX21lc3NfZGVzdF93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NDFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF9tZXNzX2Rlc3Rfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF93ZWJfc2VydmljZV9oYW5kbGVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZF93ZWJfc2VydmljZV9oYW5kbGVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmE5OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRfd2ViX3NlcnZpY2VfaGFuZGxlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRhdXRob3JpdHljb250cmFpbnRzX3dpel8uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRhdXRob3JpdHljb250cmFpbnRzX3dpel8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWMwZmZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkYXV0aG9yaXR5Y29udHJhaW50c193aXpfLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkY21wZmlsZWRfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNtcGZpbGVkX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzkzMjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkY21wZmlsZWRfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNvbnRleHRwYXJhbWV0ZXJfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGNvbnRleHRwYXJhbWV0ZXJfd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTdlMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRjb250ZXh0cGFyYW1ldGVyX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRlbnZpcmVudHJ5X3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRlbnZpcmVudHJ5X3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTNhYjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZW52aXJlbnRyeV93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXJyb3Jjb2RlZXJyb3Jfd2l6X2Jhbi5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXJyb3Jjb2RlZXJyb3Jfd2l6X2Jhbi5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViOWVmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGVycm9yY29kZWVycm9yX3dpel9iYW4uZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGV4Y2VwdGlvbmVycm9ycGFnZV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXhjZXB0aW9uZXJyb3JwYWdlX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJkMmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZXhjZXB0aW9uZXJyb3JwYWdlX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRmaWx0ZXJtYXBwaW5nX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRmaWx0ZXJtYXBwaW5nX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUzMDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkZmlsdGVybWFwcGluZ193aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkaGFuZGxlcnNvYXBoZWFkZXJfd2l6X2JhLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkaGFuZGxlcnNvYXBoZWFkZXJfd2l6X2JhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5YzNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGhhbmRsZXJzb2FwaGVhZGVyX3dpel9iYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZGpzcHByb3Bncm9wdV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkanNwcHJvcGdyb3B1X3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRmZTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkanNwcHJvcGdyb3B1X3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRsb2NlbmNvZGluZ21hcF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbG9jZW5jb2RpbmdtYXBfd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTNlMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRsb2NlbmNvZGluZ21hcF93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbWltZW1hcHBpbmdfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZG1pbWVtYXBwaW5nX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg1NmE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkbWltZW1hcHBpbmdfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHNlcnZsZXRtYXBwaW5nX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGRzZXJ2bGV0bWFwcGluZ193aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyMGM1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHNlcnZsZXRtYXBwaW5nX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR0YWdsaWJyZWZfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHRhZ2xpYnJlZl93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzOGI1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHRhZ2xpYnJlZl93aXpfYmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2ViU2VjdXJpdHljb250cmFpbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2ViU2VjdXJpdHljb250cmFpbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5N2Q4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYlNlY3VyaXR5Y29udHJhaW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYnJlc2NvbGxlY3Rpb25fd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlYnJlc2NvbGxlY3Rpb25fd2l6X2Jhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmU2ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJyZXNjb2xsZWN0aW9uX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJzZWN1cml0eXJvbGVyZWZfd2l6X2IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hZGR3ZWJzZWN1cml0eXJvbGVyZWZfd2l6X2IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWI0YjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2Vic2VjdXJpdHlyb2xlcmVmX3dpel9iLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2VsY29tZXBhZ2Vfd2l6X2Jhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FkZHdlbGNvbWVwYWdlX3dpel9iYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY1MGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vYWRkd2VsY29tZXBhZ2Vfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkN2ZhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0aW9uX21pZ3JhdGlvbl93aXphcmRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdGlvbl9taWdyYXRpb25fd2l6YXJkX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZWNiYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0aW9uX21pZ3JhdGlvbl93aXphcmRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFmOGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZTc2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJjbGllbnRqYXJfd2l6YmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpiY2xpZW50amFyX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWRhNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJjbGllbnRqYXJfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpicHJvamVjdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmFhMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE1Mzk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyN2ZhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2VqYmphcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2E3OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ3ZjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1MTI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MWEzMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9jbGFzc19maWxlX3dpel9iYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiMWUzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9jbGFzc19maWxlX3dpel9iYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NTRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2VqYmphcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjM1MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9yYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlkZmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfd2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0Mjc0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW5pdF9wYXJhbV93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW5pdF9wYXJhbV93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiNmRmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2luaXRfcGFyYW1fd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL21kYl8yXzFfam1zX2NyZWF0aW9uX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL21kYl8yXzFfam1zX2NyZWF0aW9uX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjFkNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX2ptc19jcmVhdGlvbl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX25vbl9qbXNfY3JlYXRpb25fd2kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9tZGJfMl8xX25vbl9qbXNfY3JlYXRpb25fd2kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWIxZDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vbWRiXzJfMV9ub25fam1zX2NyZWF0aW9uX3dpLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdzZXJ2bGV0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2U1N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdzZXJ2bGV0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3ZlcnNpb25taWdyYXRlM193aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi92ZXJzaW9ubWlncmF0ZTNfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3MmJmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3ZlcnNpb25taWdyYXRlM193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjRlMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9mdWxsL3dpemJhbi93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2ViX2xpYnJhcnlfcHJvamVjdF93aXpfYmFuLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvZnVsbC93aXpiYW4vd2ViX2xpYnJhcnlfcHJvamVjdF93aXpfYmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YTQxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYl9saWJyYXJ5X3Byb2plY3Rfd2l6X2Jhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2phcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMTVkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2phcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qY3Vfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvamN1X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTczYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9qY3Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMva2V5X2ludGVyZl9vdi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2tleV9pbnRlcmZfb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDcwNDQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMva2V5X2ludGVyZl9vdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2xlZnRfYXJyb3cuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9sZWZ0X2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjMzgzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL2xlZnRfYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9yaWdodF9hcnJvdy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3JpZ2h0X2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzZTM1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3JpZ2h0X2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2VydmxldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3NlcnZsZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFiZWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2VydmxldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2I4YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9zZXNzaW9uQmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy9zaG93ZXJyX3Rzay5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3dlcnJfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNjA2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3dlcnJfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2hvd3dhcm5fdHNrLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc2hvd3dhcm5fdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwMDllOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Nob3d3YXJuX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3NydmNlX2VsZW1fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRjYjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy91dGlsLXdpei1iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy91dGlsLXdpei1iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjkzYzlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3V0aWwtd2l6LWljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDM4YjIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvdXRpbC13aXotaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGQzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy93ZWJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9pY29ucy93ZWJzZXJ2aWNlZGVzYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvd3NkbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvSmF2YUluc2VydGlvbk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL3VpL0phdmFJbnNlcnRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzYjBkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvSmF2YUluc2VydGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24udWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSmF2YUluc2VydGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEphdmFJbnNlcnRpb25PcGVyYXRpb24gaW1wbGVtZW50cyBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEphdmFJbnNlcnRpb25IZWxwZXIgaW5zZXJ0aW9uSGVscGVyOwotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7Ci0JcHJvdGVjdGVkIElEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKYXZhSW5zZXJ0aW9uT3BlcmF0aW9uKEphdmFJbnNlcnRpb25IZWxwZXIgaW5zZXJ0aW9uSGVscGVyLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQsIElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmluc2VydGlvbkhlbHBlciA9IGluc2VydGlvbkhlbHBlcjsKLQkJdGhpcy5lZGl0b3JJbnB1dCA9IGVkaXRvcklucHV0OwotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCXRoaXMudGV4dFNlbGVjdGlvbiA9IHRleHRTZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yQXJnKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yQXJnOwotCQlpbnNlcnRDb2RlU25pcHBldCgpOwotCQlwcm9jZXNzSmF2YUhlbHBlcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRDb2RlU25pcHBldCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gaW5zZXJ0aW9uSGVscGVyLmdldEluc2VydGlvblN0cmluZygpOwotCQlpZiAocmVwbGFjZW1lbnRTdHJpbmcgPT0gbnVsbCB8fCByZXBsYWNlbWVudFN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAodGV4dFNlbGVjdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIHRleHQgc2VsZWN0aW9uIGZvciBpbnNlcnRpbmcgdGV4dC4iKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpLCByZXBsYWNlbWVudFN0cmluZyk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JCWludCBzdGFydCA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCk7Ci0JCWludCBsaW5lcyA9IGRvY3VtZW50LmNvbXB1dGVOdW1iZXJPZkxpbmVzKHJlcGxhY2VtZW50U3RyaW5nKSArIDE7Ci0JCWZvcm1hdChkb2N1bWVudCwgc3RhcnQsIGxpbmVzLCAwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUhlbHBlcigpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFVSS5nZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRXb3JraW5nQ29weShlZGl0b3JJbnB1dCk7Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdHlwZSA9IGN1LmdldFR5cGVzKClbMF07Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGluc2VydGlvbkhlbHBlci5oYXNGaWVsZHMoKSkKLQkJCQkJY3JlYXRlRmllbGRzKHR5cGUsIGluc2VydGlvbkhlbHBlci5nZXRGaWVsZHMoKSk7Ci0JCQkJaWYgKGluc2VydGlvbkhlbHBlci5oYXNNZXRob2RzKCkpCi0JCQkJCWNyZWF0ZU1ldGhvZHModHlwZSwgaW5zZXJ0aW9uSGVscGVyLmdldE1ldGhvZHMoKSk7Ci0JCQkJaWYgKGluc2VydGlvbkhlbHBlci5oYXNJbXBvcnRzKCkpCi0JCQkJCWNyZWF0ZUltcG9ydHMoY3UsIGluc2VydGlvbkhlbHBlci5nZXRJbXBvcnRTdGF0ZW1lbnRzKCkpOwotCQkJCWV4ZWN1dGVFeHRlbmRlZE9wZXJhdGlvbnMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZUV4dGVuZGVkT3BlcmF0aW9ucygpIHsKLQkJTGlzdCBvcHMgPSBpbnNlcnRpb25IZWxwZXIuZ2V0RXh0ZW5kZWRPcGVyYXRpb25zKCk7Ci0JCWlmIChvcHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0JCQkJZXhlY3V0ZWRFeHRlbmRlZE9wZXJhdGlvbigoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIG9wcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlZEV4dGVuZGVkT3BlcmF0aW9uKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbikgewotCQl0cnkgewotCQkJb3BlcmF0aW9uLnJ1bihudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlsb2cubG9nKCJFeGVjdXRpbmcgZXh0ZW5kZWQgb3BlcmF0aW9uIGZhaWxlZDogICIgKyBvcGVyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQlsb2cubG9nKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRzKElUeXBlIGFUeXBlLCBMaXN0IGZpZWxkcykgewotCQlJRE9NRmllbGQgZmllbGQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQlmaWVsZCA9IChJRE9NRmllbGQpIGZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoIWFUeXBlLmdldEZpZWxkKGZpZWxkLmdldE5hbWUoKSkuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlhVHlwZS5jcmVhdGVGaWVsZChmb3JtYXQoZmllbGQuZ2V0Q29udGVudHMoKSwgMSwgdHJ1ZSksIG51bGwsIHRydWUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNZXRob2RzKElUeXBlIGFUeXBlLCBMaXN0IG1ldGhvZHMpIHsKLQkJSURPTU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKElET01NZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKCFhVHlwZS5nZXRNZXRob2QobWV0aG9kLmdldE5hbWUoKSwgZ2V0UGFyYW1hdGVyVHlwZVNpZ25hdHVyZXMobWV0aG9kKSkuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlhVHlwZS5jcmVhdGVNZXRob2QoZm9ybWF0KG1ldGhvZC5nZXRDb250ZW50cygpLCAxLCB0cnVlKSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgTGlzdCBpbXBvcnRzKSB7Ci0JCVN0cmluZyBpbXBvcnRTdG10OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMuc2l6ZSgpOyBpKyspIHsKLQkJCWltcG9ydFN0bXQgPSAoU3RyaW5nKSBpbXBvcnRzLmdldChpKTsKLQkJCWlmICghY3UuZ2V0SW1wb3J0KGltcG9ydFN0bXQpLmV4aXN0cygpICYmICFpbXBvcnRTdG10LnN0YXJ0c1dpdGgoImphdmEubGFuZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQljdS5jcmVhdGVJbXBvcnQoaW1wb3J0U3RtdCwgbnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0KFN0cmluZyBjb250ZW50cywgaW50IGluZGVudCwgYm9vbGVhbiBlbnN1cmVFbmRMaW5lUmV0dXJuKSB7Ci0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudChjb250ZW50cyk7Ci0JCWludCBsaW5lcyA9IGRvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCWZvcm1hdChkb2MsIDAsIGxpbmVzIC0gMSwgaW5kZW50KTsKLQkJU3RyaW5nIHJlc3VsdCA9IGRvYy5nZXQoKTsKLQkJaWYgKGVuc3VyZUVuZExpbmVSZXR1cm4pCi0JCQlyZXN1bHQgPSBlbnN1cmVMaW5lUmV0dXJuKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0KElEb2N1bWVudCBkb2N1bWVudEFyZywgaW50IHN0YXJ0TGluZSwgaW50IGxpbmVzLCBpbnQgaW5kZW50KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgZW5kID0gZG9jdW1lbnRBcmcuZ2V0TGluZU9mZnNldChzdGFydExpbmUgKyBsaW5lcyk7Ci0JCQlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnRMaW5lOwotCQkJQ29kZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVDb2RlRm9ybWF0dGVyKG51bGwpOwotCQkJVGV4dEVkaXQgZWRpdCA9IGZvcm1hdHRlci5mb3JtYXQoQ29kZUZvcm1hdHRlci5LX1VOS05PV04sIGRvY3VtZW50QXJnLmdldCgpLCBzdGFydExpbmUsIGxlbmd0aCwgaW5kZW50LCBudWxsKTsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQllZGl0LmFwcGx5KGRvY3VtZW50QXJnKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlsb2cubG9nKCJGYWlsZWQgdG8gZm9ybWF0IHRleHQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZy5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFN0cmluZyhTdHJpbmcgcGF0dGVybiwgU3RyaW5nW10gYXJndW1lbnRzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlbnN1cmVMaW5lUmV0dXJuKFN0cmluZyBhU3RyaW5nKSB7Ci0JCWlmICghYVN0cmluZy5lbmRzV2l0aChORVdfTElORSkpCi0JCQlyZXR1cm4gYVN0cmluZyArIE5FV19MSU5FOwotCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFyYW1hdGVyVHlwZVNpZ25hdHVyZXMoSURPTU1ldGhvZCBhTWV0aG9kKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZ1tdIHBhcm1zID0gYU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlpZiAocGFybXMgIT0gbnVsbCkgewotCQkJaWYgKHBhcm1zLmxlbmd0aCA9PSAwKQotCQkJCXJlc3VsdCA9IHBhcm1zOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmdbcGFybXMubGVuZ3RoXTsKLQkJCWJvb2xlYW4gaXNSZXNvbHZlZCA9IGZhbHNlOwotCQkJU3RyaW5nIHBhcm07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFybSA9IHBhcm1zW2ldOwotCQkJCWlzUmVzb2x2ZWQgPSBwYXJtLmluZGV4T2YoJy4nKSA+IDA7Ci0JCQkJcmVzdWx0W2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUocGFybSwgaXNSZXNvbHZlZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL3VpL1dUUFVJV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvV1RQVUlXb3JraW5nQ29weU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5ZDVjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vdWkvV1RQVUlXb3JraW5nQ29weU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24udWk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSUNvbXBpbGF0aW9uVW5pdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSW50ZXJuYWxDbGFzc0ZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVdvcmtpbmdDb3B5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5XVFBXb3JraW5nQ29weU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI1LzIwMDEgNzowNTozNiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV1RQVUlXb3JraW5nQ29weU1hbmFnZXIgZXh0ZW5kcyBXVFBXb3JraW5nQ29weU1hbmFnZXIgewotCXByaXZhdGUgSVdvcmtpbmdDb3B5TWFuYWdlciBqYXZhV29ya2luZ0NvcHlNYW5hZ2VyOwotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdERvY3VtZW50UHJvdmlkZXIgY3VEb2N1bWVudFByb3ZpZGVyOwotCXByaXZhdGUgSGFzaE1hcCBlZGl0b3JJbnB1dHM7Ci0JcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIGxhc3RFcnJvcjsKLQotCS8qKgotCSAqIFdUUFVJV29ya2luZ0NvcHlNYW5hZ2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdUUFVJV29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQljdURvY3VtZW50UHJvdmlkZXIgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWphdmFXb3JraW5nQ29weU1hbmFnZXIgPSBKYXZhVUkuZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0Nvbm5lY3QoZmluYWwgSUVkaXRvcklucHV0IGlucHV0LCBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQlsYXN0RXJyb3IgPSBudWxsOwotCQkJZC5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJY29ubmVjdChpbnB1dCwgY3UpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxhc3RFcnJvciA9IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlCi0JCQljb25uZWN0KGlucHV0LCBjdSk7Ci0JCWlmIChsYXN0RXJyb3IgIT0gbnVsbCkKLQkJCXRocm93IGxhc3RFcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiBDb25uZWN0IHRoZSBDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyIHRvIHRoZQotCSAqIAotCSAqIEBpbnB1dCBhbmQgY29ubmVjdCB0aGUgYW5ub3RhdGlvbiBtb2RlbCBmcm9tIHRoZSBwcm92aWRlciB0byB0aGUgSURvY3VtZW50IG9mIHRoZQotCSAqIEBpbnB1dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25uZWN0KElFZGl0b3JJbnB1dCBpbnB1dCwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlci5jb25uZWN0KGlucHV0KTsKLQkJCWdldEVkaXRvcklucHV0cygpLnB1dChjdSwgaW5wdXQpOwotCQkJSURvY3VtZW50IGRvYyA9IGN1RG9jdW1lbnRQcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQljdURvY3VtZW50UHJvdmlkZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKGlucHV0KS5jb25uZWN0KGRvYyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXZlcnRXb3JraW5nQ29waWVzKCkgewotCQlpZiAoZ2V0RWRpdG9ySW5wdXRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGdldEVkaXRvcklucHV0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJaW5wdXQgPSAoSUVkaXRvcklucHV0KSBpdC5uZXh0KCk7Ci0JCQlyZXZlcnQoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzb25uZWN0IHRoZSBDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyIGZyb20gdGhlCi0JICogCi0JICogQGlucHV0IGFuZCBkaXNjb25uZWN0IHRoZSBhbm5vdGF0aW9uIG1vZGVsIGZyb20gdGhlIHByb3ZpZGVyIGZyb20gdGhlIElEb2N1bWVudCBvZiB0aGUKLQkgKiBAaW5wdXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzY29ubmVjdChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSURvY3VtZW50IGRvYyA9IGN1RG9jdW1lbnRQcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JCWN1RG9jdW1lbnRQcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwoaW5wdXQpLmRpc2Nvbm5lY3QoZG9jKTsKLQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlci5kaXNjb25uZWN0KGlucHV0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXZlcnQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXRyeSB7Ci0JCQljdURvY3VtZW50UHJvdmlkZXIucmVzZXREb2N1bWVudChpbnB1dCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCUlEb2N1bWVudCBkb2MgPSBjdURvY3VtZW50UHJvdmlkZXIuZ2V0RG9jdW1lbnQoaW5wdXQpOwotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gY3VEb2N1bWVudFByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbChpbnB1dCk7Ci0KLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwpIHsKLQkJCUFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsIG1hcmtlck1vZGVsID0gKEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsKSBtb2RlbDsKLQkJCW1hcmtlck1vZGVsLnJlc2V0TWFya2VycygpOwotCQl9Ci0JCW1vZGVsLmRpc2Nvbm5lY3QoZG9jKTsKLQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlci5kaXNjb25uZWN0KGlucHV0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNjb25uZWN0RWRpdG9ySW5wdXRzKCkgewotCQlJdGVyYXRvciBpdCA9IGdldEVkaXRvcklucHV0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJaW5wdXQgPSAoSUVkaXRvcklucHV0KSBpdC5uZXh0KCk7Ci0JCQlkaXNjb25uZWN0KGlucHV0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2NhcmRFeGlzdGluZ0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChnZXRFZGl0b3JJbnB1dHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSUVkaXRvcklucHV0IGlucHV0OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlpbnB1dCA9IChJRWRpdG9ySW5wdXQpIGl0Lm5leHQoKTsKLQkJCWRpc2Nvbm5lY3QoaW5wdXQpOwotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlTZXQgYVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gbnVsbDsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNEaXJ0eSh1bml0KSkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlID0gdW5pdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCQkJYVNldC5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhU2V0OwotCX0KLQotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBwcmltR2V0RWRpdG9ySW5wdXQoY3UpOwotCQlpZiAoaW5wdXQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbnB1dCA9IGdldEVkaXRvcklucHV0KChJSmF2YUVsZW1lbnQpIGN1KTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHJvdGVjdGVkIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6IHsKLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotCQkJCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKQotCQkJCQkJY3UgPSBjdS5nZXRQcmltYXJ5KCk7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGN1LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJCQkJcmV0dXJuIG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKLQkJCQkJcmV0dXJuIG5ldyBJbnRlcm5hbENsYXNzRmlsZUVkaXRvcklucHV0KChJQ2xhc3NGaWxlKSBlbGVtZW50KTsKLQkJCX0KLQkJCWVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMjUvMjAwMSA3OjMwOjIwIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkhhc2hNYXAgZ2V0RWRpdG9ySW5wdXRzKCkgewotCQlpZiAoZWRpdG9ySW5wdXRzID09IG51bGwpCi0JCQllZGl0b3JJbnB1dHMgPSBuZXcgSGFzaE1hcCgyMCk7Ci0JCXJldHVybiBlZGl0b3JJbnB1dHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGVuY29kZWQgaW4gdGhlIGdpdmVuIGVkaXRvcgotCSAqIGlucHV0LiBEb2VzIG5vdCBjb25uZWN0IHRoZSBlZGl0IG1vZGVsIHRvIHRoZSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjdSA9PSBudWxsIHx8IGN1LmlzV29ya2luZ0NvcHkoKSkgewotCQkJcmV0dXJuIGN1OwotCQl9Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBzdXBlci5nZXRFeGlzdGluZ1dvcmtpbmdDb3B5KGN1KTsKLQkJaWYgKG5ld0NVICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3Q1U7Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KGN1KTsKLQkJcmV0dXJuIGphdmFXb3JraW5nQ29weU1hbmFnZXIuZ2V0V29ya2luZ0NvcHkoZWRpdG9ySW5wdXQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSwgYm9vbGVhbiBmb3JOZXdDVSkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZvck5ld0NVKQotCQkJcmV0dXJuIHN1cGVyLmdldFdvcmtpbmdDb3B5KGN1LCBmb3JOZXdDVSk7Ci0JCXJldHVybiBwcmltR2V0V29ya2luZ0NvcHkoY3UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSURvY3VtZW50UHJvdmlkZXIgcCA9IGN1RG9jdW1lbnRQcm92aWRlcjsKLQkJcmV0dXJuIHAgPT0gbnVsbCA/IGZhbHNlIDogcC5jYW5TYXZlRG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoY3UpKTsKLQl9Ci0KLQkvKioKLQkgKiBtdXN0U2F2ZURvY3VtZW50IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRFZGl0b3JJbnB1dHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWlmIChjdURvY3VtZW50UHJvdmlkZXIubXVzdFNhdmVEb2N1bWVudChpdC5uZXh0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltRGlzcG9zZSgpIHsKLQkJc3VwZXIucHJpbURpc3Bvc2UoKTsKLQkJZGlzY2FyZEV4aXN0aW5nQ29tcGlsYXRpb25Vbml0cygpOwotCQllZGl0b3JJbnB1dHMgPSBudWxsOwotCQlqYXZhV29ya2luZ0NvcHlNYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUmV2ZXJ0KCkgewotCQlzdXBlci5wcmltUmV2ZXJ0KCk7Ci0JCXJldmVydFdvcmtpbmdDb3BpZXMoKTsKLQkJZWRpdG9ySW5wdXRzID0gbnVsbDsKLQkJamF2YVdvcmtpbmdDb3B5TWFuYWdlciA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElFZGl0b3JJbnB1dCBwcmltR2V0RWRpdG9ySW5wdXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gKElFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXRzKCkuZ2V0KGN1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZWRpdG9yCi0JICogaW5wdXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgcHJpbUdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGN1ID09IG51bGwpIHsKLQkJCXJldHVybiBjdTsKLQkJfQotCQlJQ29tcGlsYXRpb25Vbml0IHByaW1hcnkgPSBjdS5nZXRQcmltYXJ5KCk7Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBnZXROZXdDb21waWxhdGlvblVuaXRXb3JraW5nQ29weShwcmltYXJ5KTsKLQkJaWYgKG5ld0NVICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3Q1U7Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IHByaW1HZXRFZGl0b3JJbnB1dChwcmltYXJ5KTsKLQkJaWYgKGVkaXRvcklucHV0ID09IG51bGwpIHsKLQkJCWVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoY3UpOwotCQkJc3luY0Nvbm5lY3QoZWRpdG9ySW5wdXQsIGN1KTsKLQkJfQotCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKQotCQkJcmV0dXJuIGN1OwotCQlyZXR1cm4gamF2YVdvcmtpbmdDb3B5TWFuYWdlci5nZXRXb3JraW5nQ29weShlZGl0b3JJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVNhdmVDb21waWxhdGlvblVuaXRzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIucHJpbVNhdmVDb21waWxhdGlvblVuaXRzKG51bGwpOwotCQlzYXZlRXhpc3RpbmdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1TYXZlRG9jdW1lbnQoSUVkaXRvcklucHV0IGlucHV0LCBJRG9jdW1lbnQgZG9jLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWN1RG9jdW1lbnRQcm92aWRlci5zYXZlRG9jdW1lbnQobW9uaXRvciwgaW5wdXQsIGRvYywgdHJ1ZSk7IC8vIG92ZXJ3cml0ZSBpZiBuZWVkZWQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKCFpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoZXgpKQotCQkJCXRocm93IGV4OwotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUkVTT1VSQ0VfQ0xBU1MpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFIHx8ICFyZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkpCi0JCQkJdGhyb3cgZXg7Ci0KLQkJCWlmIChnZXRTYXZlSGFuZGxlcigpLnNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZSgoSUZpbGUpIHJlc291cmNlKSkKLQkJCQljdURvY3VtZW50UHJvdmlkZXIuc2F2ZURvY3VtZW50KG1vbml0b3IsIGlucHV0LCBkb2MsIGZhbHNlKTsKLQkJCWVsc2UKLQkJCQl0aHJvdyBleDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEb2N1bWVudChJRWRpdG9ySW5wdXQgaW5wdXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRG9jdW1lbnQgZG9jID0gY3VEb2N1bWVudFByb3ZpZGVyLmdldERvY3VtZW50KGlucHV0KTsKLQkJYm9vbGVhbiBjYW5TYXZlID0gY3VEb2N1bWVudFByb3ZpZGVyLmNhblNhdmVEb2N1bWVudChpbnB1dCk7Ci0JCXRyeSB7Ci0JCQlpZiAoY2FuU2F2ZSkgewotCQkJCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IGphdmFXb3JraW5nQ29weU1hbmFnZXIuZ2V0V29ya2luZ0NvcHkoaW5wdXQpOwotCQkJCXN5bmNocm9uaXplZCAodW5pdCkgewotCQkJCQljdURvY3VtZW50UHJvdmlkZXIuYWJvdXRUb0NoYW5nZShpbnB1dCk7Ci0JCQkJCXByaW1TYXZlRG9jdW1lbnQoaW5wdXQsIGRvYywgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdUUENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjYW5TYXZlKQotCQkJCWN1RG9jdW1lbnRQcm92aWRlci5jaGFuZ2VkKGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVFeGlzdGluZ0NvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZ2V0RWRpdG9ySW5wdXRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlpZiAoIXZhbGlkYXRlU3RhdGUoKSkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCS8vCUlDb21waWxhdGlvblVuaXQgY3U7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQkJdHJ5IHsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQkvLwkJCWN1ID0gKElDb21waWxhdGlvblVuaXQpIGVudHJ5LmdldEtleSgpOwotCQkJCWlucHV0ID0gKElFZGl0b3JJbnB1dCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0cnkgewotCQkJCQlzYXZlRG9jdW1lbnQoaW5wdXQsIG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWRpc2Nvbm5lY3QoaW5wdXQpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWdldEVkaXRvcklucHV0cygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHZhbGlkYXRlRWRpdCBmb3IgYWxsIHJlYWQgb25seSBJRmlsZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIFdvcmtpbmdDb3B5LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVN0YXRlKCkgewotCQlMaXN0IHJlYWRPbmx5RmlsZXMgPSBnZXRSZWFkT25seU1vZGlmaWVkRmlsZXMoKTsKLQkJaWYgKHJlYWRPbmx5RmlsZXMgIT0gbnVsbCAmJiAhcmVhZE9ubHlGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbcmVhZE9ubHlGaWxlcy5zaXplKCldOwotCQkJcmVhZE9ubHlGaWxlcy50b0FycmF5KGZpbGVzKTsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCU9iamVjdCBjdHggPSB3aW4gPT0gbnVsbCA/IG51bGwgOiB3aW4uZ2V0U2hlbGwoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgY3R4KTsKLQkJCXJldHVybiBzdGF0dXMuaXNPSygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSZWFkT25seU1vZGlmaWVkRmlsZXMoKSB7Ci0JCUxpc3QgcmVhZE9ubHlGaWxlcyA9IG51bGw7Ci0JCUlGaWxlIHJlYWRPbmx5RmlsZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCS8vCUlDb21waWxhdGlvblVuaXQgY3U7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQkJSURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdiA9IGN1RG9jdW1lbnRQcm92aWRlcjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVhZE9ubHlGaWxlID0gbnVsbDsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJLy8JCWN1ID0gKElDb21waWxhdGlvblVuaXQpIGVudHJ5LmdldEtleSgpOwotCQkJaW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGRvY1Byb3YuY2FuU2F2ZURvY3VtZW50KGlucHV0KSkKLQkJCQlyZWFkT25seUZpbGUgPSBnZXRSZWFkT25seUZpbGUoaW5wdXQpOwotCQkJaWYgKHJlYWRPbmx5RmlsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlYWRPbmx5RmlsZXMgPT0gbnVsbCkKLQkJCQkJcmVhZE9ubHlGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZWFkT25seUZpbGVzLmFkZChyZWFkT25seUZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWFkT25seUZpbGVzOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0UmVhZE9ubHlGaWxlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZpbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLQkJCUlGaWxlIGZpbGUgPSBmaW5wdXQuZ2V0RmlsZSgpOwotCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKQotCQkJCXJldHVybiBmaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IHByaW1HZXRFZGl0b3JJbnB1dChjdSk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKQotCQkJZGlzY29ubmVjdChpbnB1dCk7Ci0JCWdldEVkaXRvcklucHV0cygpLnJlbW92ZShjdSk7Ci0JCXN1cGVyLmFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQoY3UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guSUoyRUVXb3JraW5nQ29weU1hbmFnZXIjaGFzV29ya2luZ0NvcGllcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzV29ya2luZ0NvcGllcygpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc1dvcmtpbmdDb3BpZXMoKSB8fCAoZWRpdG9ySW5wdXRzICE9IG51bGwgJiYgIWVkaXRvcklucHV0cy5pc0VtcHR5KCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0FkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDdhNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0FkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQnVpbGRQYXRoRGlhbG9nQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5KYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIsIElDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IGNvbXBvbmVudE5hbWVUZXh0OwotCXByb3RlY3RlZCBMYWJlbCBhdmFpbGFibGVNb2R1bGVzOwotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGV4dGVybmFsSmFyQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gYWRkVmFyaWFibGVCdXR0b247Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBidXR0b25Db2x1bW47Ci0KLQlwcm90ZWN0ZWQgTGlzdCBqMmVlQ29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBqYXZhUHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLgotCSAqLwotCXB1YmxpYyBBZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplKCk7Ci0KLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJaWYgKGVhckNvbXBvbmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJY3JlYXRlUHJvamVjdExhYmVsc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUxpc3RHcm91cChjb21wb3NpdGUpOwotCQlyZWZyZXNoKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXByb2plY3QgPSAoSVByb2plY3QpIGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0KLQkJaWYgKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCVN0cmluZyBjb21wVHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKTsKLQkJCQlpZiAoY29tcFR5cGUuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpKQotCQkJCQllYXJDb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdExhYmVsc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgbGFiZWxzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGFiZWxzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxhYmVsc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGxhYmVsc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RfbmFtZV9fVUlfIikpOyAvLyROT04tTkxTLTEkID0gIlByb2plY3QgbmFtZToiCi0KLQkJY29tcG9uZW50TmFtZVRleHQgPSBuZXcgVGV4dChsYWJlbHNHcm91cCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29tcG9uZW50TmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRUZXh0KHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgbGlzdEdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsaXN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdEYXRhLmhvcml6b250YWxJbmRlbnQgPSA1OwotCQlsaXN0R3JvdXAuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0KLQkJYXZhaWxhYmxlTW9kdWxlcyA9IG5ldyBMYWJlbChsaXN0R3JvdXAsIFNXVC5OT05FKTsKLQkJZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWF2YWlsYWJsZU1vZHVsZXMuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQVZBSUxBQkxFX0oyRUVfQ09NUE9ORU5UUyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJBdmFpbGFibGUgZGVwZW5kZW50IEpBUnM6IgotCQlhdmFpbGFibGVNb2R1bGVzLnNldExheW91dERhdGEoZ0RhdGEpOwotCQljcmVhdGVUYWJsZUNvbXBvc2l0ZShsaXN0R3JvdXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCU51bGxQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWFkZE1vZHVsZXNUb0VBUihtb25pdG9yKTsKLQkJcmVtb3ZlTW9kdWxlc0Zyb21FQVIobW9uaXRvcik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgTGlzdCBuZXdKMkVFTW9kdWxlc1RvQWRkKCl7Ci0JCUxpc3QgbmV3Q29tcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChqMmVlQ29tcG9uZW50TGlzdCAhPSBudWxsICYmICFqMmVlQ29tcG9uZW50TGlzdC5pc0VtcHR5KCkpewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqMmVlQ29tcG9uZW50TGlzdC5zaXplKCk7IGkrKyl7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgaGFuZGxlID0gKElWaXJ0dWFsQ29tcG9uZW50KWoyZWVDb21wb25lbnRMaXN0LmdldChpKTsKLQkJCQlpZiggIWluRUFSQWxyZWFkeShoYW5kbGUpKQotCQkJCQluZXdDb21wcy5hZGQoaGFuZGxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3Q29tcHM7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyBhZGRNb2R1bGVzVG9FQVIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTdGF0dXMgc3RhdCA9IE9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCWlmKCBlYXJDb21wb25lbnQgIT0gbnVsbCApewotCQkJCUxpc3QgbGlzdCA9IG5ld0oyRUVNb2R1bGVzVG9BZGQoKTsJCQkJCi0JCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQkKLQkJCQkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIGVhckNvbXBvbmVudCk7CQkJCQkKLQkJCQkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbGlzdCk7Ci0JCQkJCXN0YXQgPSBkbS52YWxpZGF0ZVByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQkJCQlpZiAoc3RhdCAhPSBPS19TVEFUVVMpCi0JCQkJCQlyZXR1cm4gc3RhdDsKLQkJCQkJZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmICghamF2YVByb2plY3RzTGlzdC5pc0VtcHR5KCkpIHsKLQkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUHJvamVjdHNMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlJUHJvamVjdCBwcm9qID0gKElQcm9qZWN0KSBqYXZhUHJvamVjdHNMaXN0LmdldChpKTsKLQkJCQkJCUlEYXRhTW9kZWwgbWlncmF0aW9uZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQkJCW1pZ3JhdGlvbmRtLnNldFByb3BlcnR5KElKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qLmdldE5hbWUoKSk7Ci0JCQkJCQltaWdyYXRpb25kbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkKLQkKLQkJCQkJCUlEYXRhTW9kZWwgcmVmZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQkJTGlzdCB0YXJnZXRDb21wTGlzdCA9IChMaXN0KSByZWZkbS5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkKLQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opOwotCQkJCQkJdGFyZ2V0Q29tcExpc3QuYWRkKHRhcmdldGNvbXBvbmVudCk7Ci0JCi0JCQkJCQlyZWZkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyQ29tcG9uZW50KTsKLQkJCQkJCXJlZmRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIHRhcmdldENvbXBMaXN0KTsKLQkJCQkJCXJlZmRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyByZW1vdmVNb2R1bGVzRnJvbUVBUihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVN0YXR1cyBzdGF0ID0gT0tfU1RBVFVTOwotCQlpZiggZWFyQ29tcG9uZW50ICE9IG51bGwgJiYgajJlZUNvbXBvbmVudExpc3QgIT0gbnVsbCl7Ci0JCQlMaXN0IGxpc3QgPSBnZXRDb21wb25lbnRzVG9SZW1vdmUoKTsKLQkJCWlmKCAhbGlzdC5pc0VtcHR5KCkpewotCQkJCXRyeSB7Ci0JCQkJCVJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24gb3AgPSByZW1vdmVDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uKGVhckNvbXBvbmVudCwgbGlzdCk7Ci0JCQkJCW9wLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXQ7Ci0JfQkJCi0JCi0JcHJvdGVjdGVkICBSZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3BlcmF0aW9uIHJlbW92ZUNvbXBvbmVudEZyb21FQVJPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudHNIYW5kbGVzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudHNIYW5kbGVzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQlyZXR1cm4gbmV3IFJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24obW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnRzVG9SZW1vdmUoKXsKLQkJajJlZUNvbXBvbmVudExpc3QgPSBnZXRDaGVja2VkSjJFRUVsZW1lbnRzQXNMaXN0KCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYoIGVhckNvbXBvbmVudCAhPSBudWxsICYmIGxpc3QgIT0gbnVsbCApewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBvbGRyZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG9sZHJlZnNbal07Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgaGFuZGxlID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiggIWoyZWVDb21wb25lbnRMaXN0LmNvbnRhaW5zKGhhbmRsZSkpewotCQkJCQlsaXN0LmFkZChoYW5kbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsJCQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHNlbGVjdEFsbEJ1dHRvbikKLQkJCWhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRlc2VsZWN0QWxsQnV0dG9uKQotCQkJaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCWVsc2UgaWYoZXZlbnQud2lkZ2V0ID09IGV4dGVybmFsSmFyQnV0dG9uKQotCQkJaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKTsKLQkJZWxzZSBpZihldmVudC53aWRnZXQgPT0gYWRkVmFyaWFibGVCdXR0b24pCi0JCQloYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJajJlZUNvbXBvbmVudExpc3QgPSBnZXRDaGVja2VkSjJFRUVsZW1lbnRzQXNMaXN0KCk7Ci0JCWphdmFQcm9qZWN0c0xpc3QgPSBnZXRDaGVja2VkSmF2YVByb2plY3RzQXNMaXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJajJlZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmFQcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpewotCQlJUGF0aFtdIHNlbGVjdGVkPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlRXh0ZXJuYWxKQVJFbnRyaWVzKGdldFNoZWxsKCkpOwotCi0JCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkKLQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoIGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCksIHR5cGUgKwotCQkJCQkJCXNlbGVjdGVkW2ldLnRvU3RyaW5nKCkpOwotCQkJCQotCQkJCUFycmF5TGlzdCB2bGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIG9sZHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBvbGRyZWZzW2pdOwotCQkJCQl2bGlzdC5hZGQocmVmKTsKLQkJCQl9CQkKLQkJCQotCQkJCS8vVG8gZG86IGNoZWNrIGlmIGFyY2hpdmUgY29tcG9uZW50IGFscmVhZHkgZXhpc3RzCi0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UoIGVhckNvbXBvbmVudCwgYXJjaGl2ZSApOwotCQkJCXZsaXN0LmFkZChyZWYpOwkKLQkJCQkKLQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBuZXcgSVZpcnR1YWxSZWZlcmVuY2Vbdmxpc3Quc2l6ZSgpXTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHZsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHRtcHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSkgdmxpc3QuZ2V0KGopOwotCQkJCQlyZWZzW2pdID0gdG1wcmVmOwotCQkJCX0JCQkJCi0JCQkJZWFyQ29tcG9uZW50LnNldFJlZmVyZW5jZXMocmVmcyk7Ci0JCQkJLy9qMmVlQ29tcG9uZW50TGlzdC5hZGQoYXJjaGl2ZS5nZXRQcm9qZWN0KCkpOwotCQkJCWoyZWVDb21wb25lbnRMaXN0LmFkZChhcmNoaXZlKTsKLQkJCX0KLQkJCXJlZnJlc2goKTsKLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0VmFyaWFibGVCdXR0b24oKXsKLQkJSVBhdGggZXhpc3RpbmdQYXRoW10gPSBuZXcgUGF0aFswXTsKLQkJSVBhdGhbXSBwYXRocyA9ICBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlVmFyaWFibGVFbnRyaWVzKGdldFNoZWxsKCksIGV4aXN0aW5nUGF0aCk7Ci0JCQotCQlpZiAocGF0aHMgIT0gbnVsbCkgewotCQkJcmVmcmVzaCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCUlQYXRoIHJlc29sdmVkUGF0aD0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgocGF0aHNbaV0pOwotCi0JCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHJlc29sdmVkUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCWlmKCBmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpewotCQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LlZBUkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCQkKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCggZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgdHlwZSArCi0JCQkJCQkJCXBhdGhzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkKLQkJCQkJQXJyYXlMaXN0IHZsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIG9sZHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG9sZHJlZnNbal07Ci0JCQkJCQl2bGlzdC5hZGQocmVmKTsKLQkJCQkJfQkJCi0JCQkJCi0JCQkJCS8vVG8gZG86IGNoZWNrIGlmIGFyY2hpdmUgY29tcG9uZW50IGFscmVhZHkgZXhpc3RzCi0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKCBlYXJDb21wb25lbnQsIGFyY2hpdmUgKTsKLQkJCQkJdmxpc3QuYWRkKHJlZik7CQotCQkJCQkKLQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW3ZsaXN0LnNpemUoKV07Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHRtcHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSkgdmxpc3QuZ2V0KGopOwotCQkJCQkJcmVmc1tqXSA9IHRtcHJlZjsKLQkJCQkJfQkJCQkKLQkJCQkJZWFyQ29tcG9uZW50LnNldFJlZmVyZW5jZXMocmVmcyk7Ci0JCQkJCWoyZWVDb21wb25lbnRMaXN0LmFkZChhcmNoaXZlKTsKLQkJCQl9ZWxzZXsKLQkJCQkJLy9kaXNwbGF5IGVycm9yCi0JCQkJfQotCQkJfQotCQkJcmVmcmVzaCgpOwotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWZpbGxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlVGFibGUocGFyZW50KTsKLQkJY3JlYXRlQnV0dG9uQ29sdW1uKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uQ29sdW1uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnV0dG9uQ29sdW1uID0gY3JlYXRlQnV0dG9uQ29sdW1uQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlidXR0b25Db2x1bW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY3JlYXRlUHVzaEJ1dHRvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdXNoQnV0dG9ucygpIHsKLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihTRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihERV9TRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWV4dGVybmFsSmFyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVhURVJOQUxfSkFSIikpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVmFyaWFibGVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBRERWQVJJQUJMRSIpKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYUJ1dHRvbiA9IHByaW1DcmVhdGVQdXNoQnV0dG9uKGxhYmVsLCBidXR0b25Db2x1bW4pOwotCQlhQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlhQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gYUJ1dHRvbjsKLQl9Ci0KLQlwdWJsaWMgQnV0dG9uIHByaW1DcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIGFCdXR0b25Db2x1bW4pIHsKLQkJQnV0dG9uIGFCdXR0b24gPSBuZXcgQnV0dG9uKGFCdXR0b25Db2x1bW4sIFNXVC5QVVNIKTsKLQkJYUJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGFCdXR0b247Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYUJ1dHRvbkNvbHVtbiA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYUJ1dHRvbkNvbHVtbi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlhQnV0dG9uQ29sdW1uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBhQnV0dG9uQ29sdW1uOwotCX0KLQotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyID0gY3JlYXRlYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcihwYXJlbnQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZ2QpOwotCi0JCWlmIChlYXJDb21wb25lbnQgIT0gbnVsbCkgewotCQkJaW50IGoyZWVWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoZWFyQ29tcG9uZW50KTsKLQkJCUF2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEF2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyKGVhckNvbXBvbmVudCwgajJlZVZlcnNpb24pOwotCQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJCQotCQkJYWRkVGFibGVMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlTGlzdGVuZXJzKCkgewotCQlhZGRDaGVja1N0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWoyZWVDb21wb25lbnRMaXN0ID0gZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpOwotCQkJCWphdmFQcm9qZWN0c0xpc3QgPSBnZXRDaGVja2VkSmF2YVByb2plY3RzQXNMaXN0KCk7Ci0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldENvbXBvbmVudHNJbkVhcigpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZzW10gPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IoIGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCWxpc3QuYWRkKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbXBvbmVudEhhbmRsZQotCSAqIEByZXR1cm4KLQkgKiBAZGVzY3JpcHRpb24gIHJldHVybnMgdHJ1ZSBpcyBhIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBFQVIgYXMgYSBkZXBlbmRlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbkVBUkFscmVhZHkoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KXsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmc1tdID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yKCBpbnQgaT0wOyBpPCByZWZzLmxlbmd0aDsgaSsrKXsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQlpZiAgKCByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmVxdWFscyggY29tcG9uZW50ICkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlMaXN0IGxpc3Q7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKQotCQkJbGlzdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWVsc2UgewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJCQlsaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldENoZWNrZWRKYXZhUHJvamVjdHNBc0xpc3QoKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJTGlzdCBsaXN0OwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCWxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQllbHNlIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJbGlzdC5hZGQoZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVhdmFpbGFibGVDb21wb25lbnRzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW50IGZsYWdzID0gU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSTsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIGZsYWdzKTsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlKTsKLQotCQkvLyBzZXQgdXAgdGFibGUgbGF5b3V0Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldFNvcnRlcihudWxsKTsKLQotCQkvLyB0YWJsZSBjb2x1bW5zCi0JCVRhYmxlQ29sdW1uIGZpbGVOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMCk7Ci0JCWZpbGVOYW1lQ29sdW1uLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkpBUi9Nb2R1bGVfVUlfIikpOyAvLyROT04tTkxTLTEkCi0JCWZpbGVOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBwcm9qZWN0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMSk7Ci0JCXByb2plY3RDb2x1bW4uc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdF9VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvamVjdCIKLQkJcHJvamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmxheW91dCh0YWJsZSwgdHJ1ZSk7Ci0JCXJldHVybiBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyOwotCi0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQlJV29ya3NwYWNlUm9vdCBpbnB1dCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWludCBudW1saW5lcyA9IE1hdGgubWluKDEwLCBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUhlaWdodCgpICogbnVtbGluZXM7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0W10gY29tcHMgPSBnZXRDb21wb25lbnRzSW5FYXIoKTsKLQkJCi0JCWZvciggaW50IGk9MDsgaTwgaXRlbXMubGVuZ3RoOyBpKysgKXsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCl7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudCllbGVtZW50OwotCQkJCWZvciggaW50IGo9MDsgajwgY29tcHMubGVuZ3RoOyBqKysgKXsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGVtcGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpY29tcHNbal07Ci0JCQkJCWlmKCBjb21wLmVxdWFscyh0ZW1wY29tcCkpewotCQkJCQkJbGlzdC5hZGQoY29tcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQotCQl9Ci0JCQotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhsaXN0LnRvQXJyYXkoKSk7Ci0JCUdyaWREYXRhIGJ0bmRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJYnV0dG9uQ29sdW1uLnNldExheW91dERhdGEoYnRuZGF0YSk7Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0F2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0OGZhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHJpdmF0ZSBpbnQgajJlZVZlcnNpb247Ci0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQ7Ci0KLQlwdWJsaWMgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIoSVZpcnR1YWxDb21wb25lbnQgYUVhckNvbXBvbmVudCwgaW50IGoyZWVWZXJzaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuajJlZVZlcnNpb24gPSBqMmVlVmVyc2lvbjsKLQkJZWFyQ29tcG9uZW50ID0gYUVhckNvbXBvbmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbXB0eSA9IG5ldyBPYmplY3RbMF07Ci0JCWlmICghKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSkKLQkJCXJldHVybiBlbXB0eTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9ICgoSVdvcmtzcGFjZVJvb3QpIGlucHV0RWxlbWVudCkuZ2V0UHJvamVjdHMoKTsKLQkJaWYgKHByb2plY3RzID09IG51bGwgfHwgcHJvamVjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZW1wdHk7Ci0JCUxpc3QgdmFsaWRDb21wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJLy8gZ2V0IGZsZXhpYmxlIHByb2plY3QKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCWlmKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCVN0cmluZyBjb21wVHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKTsKLQkJCQlpZiAoKGNvbXBUeXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFKSkgfHwKLQkJCQkJCShjb21wVHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSkpIHx8Ci0JCQkJCQkoY29tcFR5cGUuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpKSB8fAotCQkJCQkJKGNvbXBUeXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFKSkgfHwKLQkJCQkJCShjb21wVHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9NT0RVTEUpKSApewotCQkJCQlpbnQgY29tcEoyRUVWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoY29tcG9uZW50KTsKLQkJCQkJaWYoIGNvbXBKMkVFVmVyc2lvbiA8PSBqMmVlVmVyc2lvbikKLQkJCQkJCS8vdmFsaWRDb21wTGlzdC5hZGQoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJCQl2YWxpZENvbXBMaXN0LmFkZChjb21wb25lbnQpOwotCQkJCX1lbHNlIGlmKGNvbXBUeXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKSl7Ci0JCQkJCS8vZmluZCB0aGUgQXJjaGl2ZUNvbXBvbmVudAotCQkJCQlpZiggY29tcG9uZW50LmVxdWFscyggZWFyQ29tcG9uZW50ICkpewotCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBuZXdyZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCQkJCWZvciggaW50IGs9MDsgazwgbmV3cmVmcy5sZW5ndGg7IGsrKyApewotCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHRtcHJlZiA9IG5ld3JlZnNba107Ci0JCQkJCQkJLy9JVmlydHVhbENvbXBvbmVudCBlbmNsb3Npbmdjb21wID0gdG1wcmVmLmdldEVuY2xvc2luZ0NvbXBvbmVudCgpOwotCQkJCQkJCS8vYm9vbGVhbiBpc0JpbmFyeSA9IGVuY2xvc2luZ2NvbXAuaXNCaW5hcnkoKTsKLQkJCQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkY29tcCA9IHRtcHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CQkKLQkJCQkJCQlib29sZWFuIGlzQmluYXJ5ID0gcmVmZXJlbmNlZGNvbXAuaXNCaW5hcnkoKTsKLQkJCQkJCQlpZiggaXNCaW5hcnkgKXsKLQkJCQkJCQkJdmFsaWRDb21wTGlzdC5hZGQocmVmZXJlbmNlZGNvbXApOwotCQkJCQkJCQkvL3ZhbGlkQ29tcExpc3QuYWRkKHJlZmVyZW5jZWRjb21wLmdldFByb2plY3QoKSk7Ci0JCQkJCQkJCS8vSVBhdGggcGF0aCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRSZXNvbHZlZFBhdGhGb3JBcmNoaXZlQ29tcG9uZW50KG5hbWUpOwotCQkJCQkJCX0JCi0JCQkJCQl9CQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBwcm9qZWN0Lmhhc05hdHVyZSgib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsaWRDb21wTGlzdC5hZGQocHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQ29tcExpc3QudG9BcnJheSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWVsZW1lbnQ7Ci0JCQlpZiggY29sdW1uSW5kZXggPT0gMCApCi0JCQkJcmV0dXJuIGNvbXAuZ2V0TmFtZSgpOwotCQkJaWYoIGNvbHVtbkluZGV4ID09IDEgICkKLQkJCQlyZXR1cm4gY29tcC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9ZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpewotCQkJcmV0dXJuICgoSVByb2plY3QpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9CQkKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQ2xhc3NwYXRoVGFibGVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQ2xhc3NwYXRoVGFibGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDFhZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0NsYXNzcGF0aFRhYmxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc1BhdGhTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc3BhdGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnMuSVZhbGlkYXRlRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVDb21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkF2YWlsYWJsZUphcnNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhUYWJsZU1hbmFnZXIgaW1wbGVtZW50cyBMaXN0ZW5lciwgSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiB1c2VDbGllbnRKQVJzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gdXNlU2VydmVySkFSc0J0bjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZUFueUpBUnNCdG47Ci0JcHJvdGVjdGVkIEJ1dHRvbiB1cEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvd25CdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcm90ZWN0ZWQgSUNsYXNzcGF0aFRhYmxlT3duZXIgb3duZXI7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBidXR0b25Db2x1bW47Ci0JcHJvdGVjdGVkIENsYXNzcGF0aE1vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIGF2YWlsYWJsZUpBUnNWaWV3ZXI7Ci0JcHJvdGVjdGVkIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciB2YWxpZGF0ZUVkaXRMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dMUEVudHJ5OwotCXByb3RlY3RlZCBHcm91cCByYWRpb0dyb3VwOwotCQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5OwotCXByb3RlY3RlZCBBdmFpbGFibGVKYXJzUHJvdmlkZXIgYXZhaWxhYmxlSmFyc1Byb3ZpZGVyOwotCXByb3RlY3RlZCBCdXR0b24gZXh0ZXJuYWxKYXJCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRWYXJpYWJsZUJ1dHRvbjsJCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQnV0dG9uQmFyTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoVGFibGVNYW5hZ2VyKElDbGFzc3BhdGhUYWJsZU93bmVyIG93bmVyLCBDbGFzc3BhdGhNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0JCi0JcHVibGljIENsYXNzcGF0aFRhYmxlTWFuYWdlcihJQ2xhc3NwYXRoVGFibGVPd25lciBvd25lciwgQ2xhc3NwYXRoTW9kZWwgbW9kZWwsIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy52YWxpZGF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQlwdWJsaWMgdm9pZCBmaWxsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlUmFkaW9Hcm91cChwYXJlbnQpOwotCQljcmVhdGVUYWJsZShwYXJlbnQpOwotCQljcmVhdGVCdXR0b25Db2x1bW4ocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlsbFdMUENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNyZWF0ZVRhYmxlKHBhcmVudCk7Ci0JCWNyZWF0ZVdMUEJ1dHRvbkNvbHVtbihwYXJlbnQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVKQkNsaWVudERlZmF1bHRzKCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBtb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlib29sZWFuIHNob3VsZFVzZVNlcnZlckpBUnMgPSBmYWxzZTsKLQkJQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpOyAKLQkJaW50IGZpbHRlckxldmVsOwotCQlib29sZWFuIGVqYlNlbGVjdGVkID0gc2VsZWN0aW9uLmlzQW55RUpCSmFyU2VsZWN0ZWQoKTsKLQkJYm9vbGVhbiBjbGllbnRTZWxlY3RlZCA9IHNlbGVjdGlvbi5pc0FueUVKQkNsaWVudEpBUlNlbGVjdGVkKCk7Ci0JCWlmIChlamJTZWxlY3RlZCAmJiBjbGllbnRTZWxlY3RlZCkKLQkJCWZpbHRlckxldmVsID0gQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9OT05FOwotCQllbHNlIGlmIChzaG91bGRVc2VTZXJ2ZXJKQVJzKSB7Ci0JCQlpZiAoY2xpZW50U2VsZWN0ZWQpCi0JCQkJZmlsdGVyTGV2ZWwgPSBDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX05PTkU7Ci0JCQllbHNlCi0JCQkJZmlsdGVyTGV2ZWwgPSBDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX0VKQl9DTElFTlRfSkFSUzsKLQkJfSBlbHNlIHsKLQkJCWlmIChlamJTZWxlY3RlZCkKLQkJCQlmaWx0ZXJMZXZlbCA9IENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfTk9ORTsKLQkJCWVsc2UKLQkJCQlmaWx0ZXJMZXZlbCA9IENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX1NFUlZFUl9KQVJTOwotCQl9Ci0JCWluaXRGaWx0ZXJMZXZlbChmaWx0ZXJMZXZlbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0RmlsdGVyTGV2ZWwoaW50IGZpbHRlckxldmVsKSB7Ci0JCW1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpLnNldEZpbHRlckxldmVsKGZpbHRlckxldmVsKTsKLQkJc3dpdGNoIChmaWx0ZXJMZXZlbCkgewotCQkJY2FzZSAoQ2xhc3NQYXRoU2VsZWN0aW9uLkZJTFRFUl9OT05FKSA6Ci0JCQkJdXNlQW55SkFSc0J0bi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJdXNlQ2xpZW50SkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXVzZVNlcnZlckpBUnNCdG4uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX0NMSUVOVF9KQVJTKSA6Ci0JCQkJdXNlQW55SkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXVzZUNsaWVudEpBUnNCdG4uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQl1c2VTZXJ2ZXJKQVJzQnRuLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX1NFUlZFUl9KQVJTKSA6Ci0JCQkJdXNlQW55SkFSc0J0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXVzZUNsaWVudEpBUnNCdG4uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXVzZVNlcnZlckpBUnNCdG4uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSYWRpb0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmFkaW9Hcm91cCA9IG93bmVyLmNyZWF0ZUdyb3VwKHBhcmVudCk7Ci0JCXJhZGlvR3JvdXAuc2V0VGV4dChFSkJfQ0xJRU5UX1JBRElPX1VJXyk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJcmFkaW9Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmFkaW9Hcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJdXNlU2VydmVySkFSc0J0biA9IGNyZWF0ZVJhZGlvQnV0dG9uKFVTRV9FSkJfU0VSVkVSX0pBUnNfVUlfLCByYWRpb0dyb3VwKTsKLQkJdXNlQ2xpZW50SkFSc0J0biA9IGNyZWF0ZVJhZGlvQnV0dG9uKFVTRV9FSkJfQ0xJRU5UX0pBUnNfVUlfLCByYWRpb0dyb3VwKTsKLQkJdXNlQW55SkFSc0J0bgkgPSBjcmVhdGVSYWRpb0J1dHRvbihVU0VfQk9USF9VSV8sIHJhZGlvR3JvdXApOwotCQlpbml0aWFsaXplRUpCQ2xpZW50RGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uQ29sdW1uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnV0dG9uQ29sdW1uID0gb3duZXIuY3JlYXRlQnV0dG9uQ29sdW1uQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlidXR0b25Db2x1bW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY3JlYXRlUHVzaEJ1dHRvbnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlV0xQQnV0dG9uQ29sdW1uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnV0dG9uQ29sdW1uID0gb3duZXIuY3JlYXRlQnV0dG9uQ29sdW1uQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlidXR0b25Db2x1bW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY3JlYXRlV0xQUHVzaEJ1dHRvbnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyID0gb3duZXIuY3JlYXRlQXZhaWxhYmxlSkFSc1ZpZXdlcihwYXJlbnQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZ2QpOwotCQlhdmFpbGFibGVKYXJzUHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlSmFyc1Byb3ZpZGVyKCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGF2YWlsYWJsZUphcnNQcm92aWRlcik7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihhdmFpbGFibGVKYXJzUHJvdmlkZXIpOwotCQlhZGRUYWJsZUxpc3RlbmVycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVXTFBQdXNoQnV0dG9ucygpIHsKLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihTRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihERV9TRUxFQ1RfQUxMX0JVVFRPTik7Ci0JCWV4dGVybmFsSmFyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVhURVJOQUxfSkFSIikpOyAvLyROT04tTkxTLTEkCi0JCWFkZFZhcmlhYmxlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQUREVkFSSUFCTEUiKSk7Ly8kTk9OLU5MUy0xJAkJCQotCQlpZiAoaXNSZWFkT25seSgpKSB7Ci0JCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWV4dGVybmFsSmFyQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJYWRkVmFyaWFibGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gCi0JfQotCQkKLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVB1c2hCdXR0b25zKCkgewotCQl1cEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oVVBfQlVUVE9OKTsKLQkJZG93bkJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oRE9XTl9CVVRUT04pOwotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKFNFTEVDVF9BTExfQlVUVE9OKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKERFX1NFTEVDVF9BTExfQlVUVE9OKTsKLQkJaWYgKGlzUmVhZE9ubHkoKSkgewotCQkJdXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdlYkxpYlB1c2hCdXR0b25zKCkgewotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKFNFTEVDVF9BTExfQlVUVE9OKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKERFX1NFTEVDVF9BTExfQlVUVE9OKTsKLQkJZXh0ZXJuYWxKYXJCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFWFRFUk5BTF9KQVIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkVmFyaWFibGVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBRERWQVJJQUJMRSIpKTsvLyROT04tTkxTLTEkCQkJCi0JCWlmIChpc1JlYWRPbmx5KCkpIHsKLQkJCXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IAotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGFCdXR0b24gPSBvd25lci5wcmltQ3JlYXRlUHVzaEJ1dHRvbihsYWJlbCwgYnV0dG9uQ29sdW1uKTsKLQkJYUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJYUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIGFCdXR0b247Ci0JfQotCQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBhQnV0dG9uID0gb3duZXIucHJpbUNyZWF0ZVJhZGlvQnV0dG9uKGxhYmVsLCBwYXJlbnQpOwotCQlhQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlyZXR1cm4gYUJ1dHRvbjsKLQl9Ci0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHVwQnV0dG9uKQotCQkJdXBCdXR0b25TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZG93bkJ1dHRvbikKLQkJCWRvd25CdXR0b25TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc2VsZWN0QWxsQnV0dG9uKQotCQkJc2VsZWN0QWxsQnV0dG9uU2VsZWN0ZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRlc2VsZWN0QWxsQnV0dG9uKQotCQkJZGVzZWxlY3RBbGxCdXR0b25TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gdXNlU2VydmVySkFSc0J0bikKLQkJCWhhbmRsZVNlcnZlckpBUnNCdXR0b25TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gdXNlQ2xpZW50SkFSc0J0bikKLQkJCWhhbmRsZUNsaWVudEpBUnNCdXR0b25TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gdXNlQW55SkFSc0J0bikKLQkJCWhhbmRsZUFueUpBUnNCdXR0b25TZWxlY3RlZCgpOwotCQllbHNlIGlmKGV2ZW50LndpZGdldCA9PSBleHRlcm5hbEphckJ1dHRvbikKLQkJCWhhbmRsZVNlbGVjdEV4dGVybmFsSmFyQnV0dG9uKCk7Ci0JCWVsc2UgaWYoZXZlbnQud2lkZ2V0ID09IGFkZFZhcmlhYmxlQnV0dG9uKQotCQkJaGFuZGxlU2VsZWN0VmFyaWFibGVCdXR0b24oKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKXsKLQkJIC8vb3duZXIuaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKTsKLQkJaWYoIG93bmVyIGluc3RhbmNlb2YgV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlICl7Ci0JCQlXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UgcGFnZSA9IChXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2Upb3duZXI7Ci0JCQlwYWdlLmhhbmRsZVNlbGVjdEV4dGVybmFsSmFyQnV0dG9uKCk7Ci0JCX0gCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpewotCQkvL293bmVyLmhhbmRsZVNlbGVjdFZhcmlhYmxlQnV0dG9uKCk7Ci0JCWlmKCBvd25lciBpbnN0YW5jZW9mIFdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSApewotCQkJV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIHBhZ2UgPSAoV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKW93bmVyOwotCQkJcGFnZS5oYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpOwotCQl9IAkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZXJ2ZXJKQVJzQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCW1vZGVsLnNlbGVjdEZpbHRlckxldmVsKENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX0NMSUVOVF9KQVJTKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDbGllbnRKQVJzQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCW1vZGVsLnNlbGVjdEZpbHRlckxldmVsKENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfRUpCX1NFUlZFUl9KQVJTKTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVBbnlKQVJzQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCW1vZGVsLnNlbGVjdEZpbHRlckxldmVsKENsYXNzUGF0aFNlbGVjdGlvbi5GSUxURVJfTk9ORSk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0YXRlRWRpdCgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlRWRpdExpc3RlbmVyLnZhbGlkYXRlU3RhdGUoKS5pc09LKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVzZWxlY3RBbGxCdXR0b25TZWxlY3RlZCgpIHsKLQkJaWYgKCF2YWxpZGF0YXRlRWRpdCgpKQotCQkJcmV0dXJuOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQltb2RlbC5zZXRBbGxDbGFzc3BhdGhFbGVtZW50c1NlbGVjdGVkKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RBbGxCdXR0b25TZWxlY3RlZCgpIHsKLQkJaWYgKCF2YWxpZGF0YXRlRWRpdCgpKQotCQkJcmV0dXJuOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCW1vZGVsLnNldEFsbENsYXNzcGF0aEVsZW1lbnRzU2VsZWN0ZWQoQXJyYXlzLmFzTGlzdChhdmFpbGFibGVKQVJzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKSwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNlbGVjdGlvbkFzTGlzdCgpIHsKLQkJcmV0dXJuICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvTGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvd25CdXR0b25TZWxlY3RlZCgpIHsKLQkJaWYgKCF2YWxpZGF0YXRlRWRpdCgpKQotCQkJcmV0dXJuOwotCQltb2RlbC5tb3ZlRG93bihnZXRTZWxlY3Rpb25Bc0xpc3QoKSk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cEJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoIXZhbGlkYXRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLm1vdmVVcChnZXRTZWxlY3Rpb25Bc0xpc3QoKSk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIFVwZGF0ZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgYWxsIGJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25FbmFibGVtZW50cygpIHsKLQkJaW50W10gaW5kaWNlcyA9IGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JCWlmICh1cEJ1dHRvbiAhPSBudWxsICYmIGRvd25CdXR0b24gIT0gbnVsbCkgewotCQkJdXBCdXR0b24uc2V0RW5hYmxlZChjYW5Nb3ZlVXAoaW5kaWNlcykpOwotCQkJZG93bkJ1dHRvbi5zZXRFbmFibGVkKGNhbk1vdmVEb3duKGluZGljZXMsIGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTW92ZVVwKGludFtdIGluZGljZXMpIHsKLQkJcmV0dXJuIGNhbk1vdmUoaW5kaWNlcywgMCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTW92ZURvd24oaW50W10gaW5kaWNlcywgaW50IGl0ZW1Db3VudCkgewotCQlyZXR1cm4gY2FuTW92ZShpbmRpY2VzLCBpdGVtQ291bnQgLSAxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Nb3ZlKGludFtdIGluZGljZXMsIGludCByZWZlcmVuY2VJbmRleCkgewotCQlpbnQgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKGluZGljZXNbaV0gPT0gcmVmZXJlbmNlSW5kZXgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWJsZUxpc3RlbmVycygpIHsKLQkJYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKCk7Ci0JCWFkZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlhdmFpbGFibGVKQVJDaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGF2YWlsYWJsZUpBUkNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFKMkVFQ29tcG9uZW50VXRpbGl0aWVzLmlzU3RhbmRhbG9uZUNvbXBvbmVudChtb2RlbC5nZXRDb21wb25lbnQoKSkgJiYgKGlzUmVhZE9ubHkoKSB8fCAhdmFsaWRhdGF0ZUVkaXQoKSB8fCAoaXNNeUNsaWVudEpBUihldmVudCkgJiYgIWV2ZW50LmdldENoZWNrZWQoKSkpKSB7Ci0JCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldENoZWNrZWQoZXZlbnQuZ2V0RWxlbWVudCgpLCAhZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZXZlbnQuZ2V0RWxlbWVudCgpOwotCQltb2RlbC5zZXRTZWxlY3Rpb24oZWxlbWVudCwgZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTXlDbGllbnRKQVIoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZXZlbnQuZ2V0RWxlbWVudCgpOwotCQlpZihnZXRDbGFzc3BhdGhTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldENsYXNzcGF0aFNlbGVjdGlvbigpLmlzTXlDbGllbnRKQVIoZWxlbWVudCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXRhYmxlU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWlmICghaXNSZWFkT25seSgpKQotCQkJdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3NQYXRoU2VsZWN0aW9uIGdldENsYXNzcGF0aFNlbGVjdGlvbigpIHsKLQkJaWYgKG1vZGVsID09IG51bGwgfHwgbW9kZWwuZ2V0U2VsZWN0ZWRFQVJDb21wb25lbnQoKSA9PSBudWxsICYmICFKMkVFQ29tcG9uZW50VXRpbGl0aWVzLmlzU3RhbmRhbG9uZVdlYkNvbXBvbmVudChtb2RlbC5nZXRDb21wb25lbnQoKSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hDaGVja2VkSXRlbXMoKSB7Ci0JCWlmIChnZXRDbGFzc3BhdGhTZWxlY3Rpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlqYXZhLnV0aWwuTGlzdCBlbGVtZW50cyA9IGdldENsYXNzcGF0aFNlbGVjdGlvbigpLmdldENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgZWxlbWVudC5pc1NlbGVjdGVkKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYgKCFpc1dMUEVudHJ5KCkgJiYgIUoyRUVDb21wb25lbnRVdGlsaXRpZXMuaXNTdGFuZGFsb25lV2ViQ29tcG9uZW50KG1vZGVsLmdldENvbXBvbmVudCgpKSkgewotCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRJbnB1dChnZXRDbGFzc3BhdGhTZWxlY3Rpb24oKSk7Ci0JCQltb2RlbC5zZXRXTFBNb2RlbChmYWxzZSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlpbnQgbnVtbGluZXMgPSBNYXRoLm1pbigxMCwgYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpKTsKLQkJCWRhdGEuaGVpZ2h0SGludCA9IGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtSGVpZ2h0KCkgKiBudW1saW5lczsKLQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJcmVmcmVzaENoZWNrZWRJdGVtcygpOwotCQkJdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpKTsKLQkJCW1vZGVsLnNldFdMUE1vZGVsKHRydWUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJaW50IG51bWxpbmVzID0gTWF0aC5taW4oMTAsIGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSk7Ci0JCQlkYXRhLmhlaWdodEhpbnQgPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUhlaWdodCgpICogbnVtbGluZXM7Ci0JCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXJlZnJlc2hXTFBDaGVja2VkSXRlbXMoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVmcmVzaFdMUENoZWNrZWRJdGVtcygpIHsKLQkJaWYgKGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0SW5wdXQoKSAhPSBudWxsKSB7Ci0JCQlqYXZhLnV0aWwuTGlzdCBlbGVtZW50cyA9ICgoQ2xhc3NQYXRoU2VsZWN0aW9uKSBhdmFpbGFibGVKQVJzVmlld2VyLmdldElucHV0KCkpLmdldENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgZWxlbWVudC5pc1NlbGVjdGVkKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbW9kZWwuCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ2xhc3NwYXRoTW9kZWwKLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RlbC4KLQkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKENsYXNzcGF0aE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJaW5pdGlhbGl6ZUVKQkNsaWVudERlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVhZE9ubHkuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVhZE9ubHkuCi0JICogQHBhcmFtIHJlYWRPbmx5IFRoZSByZWFkT25seSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dMUEVudHJ5KCkgewotCQlyZXR1cm4gaXNXTFBFbnRyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXTFBFbnRyeShib29sZWFuIGlzV0xQRW50cnkpIHsKLQkJdGhpcy5pc1dMUEVudHJ5ID0gaXNXTFBFbnRyeTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JQ2xhc3NwYXRoVGFibGVPd25lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDbGFzc3BhdGhUYWJsZU93bmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MWU3NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDbGFzc3BhdGhUYWJsZU93bmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aFRhYmxlT3duZXIgewotCUJ1dHRvbiBwcmltQ3JlYXRlUHVzaEJ1dHRvbihTdHJpbmcgbGFiZWwsIENvbXBvc2l0ZSBidXR0b25Db2x1bW4pOwotCUJ1dHRvbiBwcmltQ3JlYXRlUmFkaW9CdXR0b24oU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgcGFyZW50KTsKLQlDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZUF2YWlsYWJsZUpBUnNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCk7Ci0JQ29tcG9zaXRlIGNyZWF0ZUJ1dHRvbkNvbHVtbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKLQkvL0J1dHRvbiBjcmVhdGVIaWRlRUpCQ2xpZW50SkFSc0J1dHRvbihDb21wb3NpdGUgcGFyZW50KTsgVGhpcyBtZXRob2QgaXMgbmV2ZXIgdXNlZCBoZW5jZSBjb21tZXRpbmcgaXQgb3V0IC0gdmtiCi0JR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTc3Y2U2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5Db21tb25FZGl0UmVzb3VyY2VIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzIHsKLQlTdHJpbmcgVVBfQlVUVE9OID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVwXzEiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBET1dOX0JVVFRPTiA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEb3duXzIiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTRUxFQ1RfQUxMX0JVVFRPTiA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWxlY3RfQWxsXzMiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERV9TRUxFQ1RfQUxMX0JVVFRPTiA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNlbGVjdF9BbGxfNCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX1RJVExFID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0FWRV9NQU5JRkVTVF9XSVRIX0VSUk9SID1NYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU0FWRV9NQU5JRkVTVF9XSVRIX0VSUk9SIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9FRElUT1IgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9FRElUT1IiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19NRVNTQUdFX1BST1BfUEFHRSA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19NRVNTQUdFX1BST1BfUEFHRSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BTklGRVNUX1BST0JMRU1fMSA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNQU5JRkVTVF9QUk9CTEVNXzEiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNQU5JRkVTVF9QUk9CTEVNXzIgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTUFOSUZFU1RfUFJPQkxFTV8yIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFOSUZFU1RfUFJPQkxFTV8zID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1BTklGRVNUX1BST0JMRU1fMyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BTklGRVNUX1BST0JMRU1fNCA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNQU5JRkVTVF9QUk9CTEVNXzQiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRURJUkVDVF9URVhUX0VESVRPUl9VSV8gPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUkVESVJFQ1RfVEVYVF9FRElUT1JfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgRUpCX0NMSUVOVF9SQURJT19VSV8JCT0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVKQl9DTElFTlRfUkFESU9fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVNFX0VKQl9TRVJWRVJfSkFSc19VSV8gCT0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVTRV9FSkJfU0VSVkVSX0pBUnNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVNFX0VKQl9DTElFTlRfSkFSc19VSV8gCT0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVTRV9FSkJfQ0xJRU5UX0pBUnNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVNFX0JPVEhfVUlfCQkJCT0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVTRV9CT1RIX1VJXyIpOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRURlcGVuZGVuY2llc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFRGVwZW5kZW5jaWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmRkMGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFRGVwZW5kZW5jaWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFRGVwZW5kZW5jaWVzUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JCi0JcHVibGljIFN0cmluZyBERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSjJFRURlcGVuZGVuY2llc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgY3JlYXRlTGFiZWxzQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxhYmVsc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBsYWJlbHNHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYWJlbHNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGFiZWxzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobGFiZWxzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRUFSX01vZHVsZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZmlsbERlc2NyaXB0aW9uKGxhYmVsc0dyb3VwLCBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRUFSX01vZHVsZXNfRGVzYyIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwobGFiZWxzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSjJFRV9Nb2R1bGVzIikpOyAvLyROT04tTkxTLTEkCi0JCWZpbGxEZXNjcmlwdGlvbihsYWJlbHNHcm91cCwgTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkoyRUVfTW9kdWxlc19EZXNjIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChsYWJlbHNHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJfTGlicmFyaWVzIikpOyAvLyROT04tTkxTLTEkCi0JCWZpbGxEZXNjcmlwdGlvbihsYWJlbHNHcm91cCwgTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYl9MaWJyYXJpZXNfRGVzYyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsbERlc2NyaXB0aW9uKENvbXBvc2l0ZSBjLCBTdHJpbmcgcykgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxNTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTU7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjUwOwotCQlkYXRhLmhlaWdodEhpbnQgPSA3MDsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoYywgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0ZXh0LnNldFRleHRMaW1pdCg4MCk7Ci0JCXRleHQuc2V0U2l6ZSgzMDAsIDEyMCk7Ci0JCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQl0ZXh0LnNldFRleHQocyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVByb3BlcnRpZXNDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFUHJvcGVydGllc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiM2VlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFUHJvcGVydGllc0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgOCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVQcm9wZXJ0aWVzQ29uc3RhbnRzIHsKLQkvL0oyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJbXBvcnRfQ2xhc3NlcyIpOwotCXB1YmxpYyBTdHJpbmcgSjJFRV9MRVZFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFX0xldmVsIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEoyRUVfMTIgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRV8xMiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKMkVFXzEyX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVfMTJfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgSjJFRV8xMyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFXzEzIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEoyRUVfMTNfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRV8xM19ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBKMkVFXzE0X0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVfMTRfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRUpCX0xFVkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVKQl9MRVZFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFSkJfMTEgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUpCXzExIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVKQl8xMV9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFSkJfMTFfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRUpCXzIwID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVKQl8yMCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBFSkJfMjBfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUpCXzIwX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEVKQl8yMV9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFSkJfMjFfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVE9SX0xFVkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTk5FQ1RPUl9MRVZFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUT1JfMTAgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ09OTkVDVE9SXzEwIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIENPTk5FQ1RPUl8xNSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDT05ORUNUT1JfMTUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQ09OTkVDVE9SXzEwX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTk5FQ1RPUl8xMF9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBDT05ORUNUT1JfMTVfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ09OTkVDVE9SXzE1X0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl9MRVZFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXRUJfTEVWRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgV0VCXzIyX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIldFQl8yMl9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfMjNfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV0VCXzIzX0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl8yNF9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXRUJfMjRfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQVBQX0NMSUVOVF9MRVZFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBUFBfQ0xJRU5UX0xFVkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIEFQUF9DTElFTlRfMTJfREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQVBQX0NMSUVOVF8xMl9ERVNDUklQVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBBUFBfQ0xJRU5UXzEzX0RFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFQUF9DTElFTlRfMTNfREVTQ1JJUFRJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgQVBQX0NMSUVOVF8xNF9ERVNDUklQVElPTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBUFBfQ0xJRU5UXzE0X0RFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIERFU0NSSVBUSU9OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFU0NSSVBUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIFdFQl9DT05URVhUX1JPT1QgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiV0VCX0NPTlRFWFRfUk9PVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIFN0cmluZyBXRUJfQ09OVEVOVF9GT0xERVJfTkFNRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXRUJfQ09OVEVOVF9GT0xERVJfTkFNRSIpOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OTY4ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0pBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uY29tcG9uZW50Y29yZS51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ2xhc3NwYXRoTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ2xhc3NwYXRoTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5VcGRhdGVKYXZhQnVpbGRQYXRoT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmxpc3RlbmVycy5JVmFsaWRhdGVFZGl0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubGlzdGVuZXJzLlZhbGlkYXRlRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRUNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElDbGFzc3BhdGhUYWJsZU93bmVyLCBMaXN0ZW5lciwgQ2xhc3NwYXRoTW9kZWxMaXN0ZW5lciwgSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMgewotCi0gICAgcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJvdGVjdGVkIElPRXhjZXB0aW9uIGNhdWdodE1hbmlmZXN0RXhjZXB0aW9uOwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGlydHk7Ci0gICAgcHJvdGVjdGVkIFRleHQgY2xhc3NQYXRoVGV4dDsKLSAgICBwcm90ZWN0ZWQgVGV4dCBjb21wb25lbnROYW1lVGV4dDsKLSAgICBwcm90ZWN0ZWQgQ2xhc3NwYXRoTW9kZWwgbW9kZWw7Ci0gICAgcHJvdGVjdGVkIENDb21ibyBhdmFpbGFibGVBcHBzQ29tYm87Ci0gICAgcHJvdGVjdGVkIENsYXNzcGF0aFRhYmxlTWFuYWdlciB0YWJsZU1hbmFnZXI7Ci0gICAgcHJvdGVjdGVkIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciB2YWxpZGF0ZUVkaXRMaXN0ZW5lcjsKLSAgICBwcm90ZWN0ZWQgTGFiZWwgbWFuaWZlc3RMYWJlbDsKLSAgICBwcm90ZWN0ZWQgTGFiZWwgZW50ZXJwcmlzZUFwcGxpY2F0aW9uTGFiZWw7Ci0gICAgcHJvdGVjdGVkIExhYmVsIGF2YWlsYWJsZURlcGVuZGVudEphcnM7Ci0gIAotCi0gICAgLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS4KLQkgKi8KLSAgICBwdWJsaWMgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIHByb2plY3QgPSAoSVByb2plY3QpIGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0gICAgICAgIG1vZGVsID0gbmV3IENsYXNzcGF0aE1vZGVsKG51bGwpOwotICAgICAgICBtb2RlbC5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICBpZiggbW9kZWwuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCApewotCSAgICAgICAgbW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JICAgICAgICB1cGRhdGVNb2RlbE1hbmlmZXN0KCk7Ci0JICAgICAgICBpbml0aWFsaXplVmFsaWRhdGVFZGl0TGlzdGVuZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIAlzdXBlci5kaXNwb3NlKCk7Ci0gICAgCWlmKG1vZGVsLmVhckFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0gICAgCQltb2RlbC5lYXJBcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotICAgIAkJbW9kZWwuZWFyQXJ0aWZhY3RFZGl0ID0gbnVsbDsKLSAgICAJfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNb2RlbE1hbmlmZXN0KCkgewotICAgICAgICBpZiAoSmVtUHJvamVjdFV0aWxpdGllcy5pc0JpbmFyeVByb2plY3QocHJvamVjdCkgfHwgbW9kZWwuZ2V0QXZhaWxhYmxlRUFSQ29tcG9uZW50cygpLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBJQ29udGFpbmVyIHJvb3QgPSBudWxsOwotICAgICAgICBJRmlsZSBtYW5pZmVzdEZpbGUgPSBudWxsOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKQotICAgICAgICAgICAgcm9vdCA9IHByb2plY3Q7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJvb3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUZvbGRlck9yRmlyc3QocHJvamVjdCwgbnVsbCk7Ci0KLSAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCkKLSAgICAgICAgICAgIG1hbmlmZXN0RmlsZSA9IHJvb3QuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwotCi0gICAgICAgIGlmIChtYW5pZmVzdEZpbGUgPT0gbnVsbCB8fCAhbWFuaWZlc3RGaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gbWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgICAgICAgICBBcmNoaXZlTWFuaWZlc3QgbWYgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChuZXcgTWFuaWZlc3QoaW4pKTsKLSAgICAgICAgICAgIG1vZGVsLnByaW1TZXRNYW5pZmVzdChtZik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICAgbW9kZWwucHJpbVNldE1hbmlmZXN0KG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLSAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihpb3gpOwotICAgICAgICAgICAgbW9kZWwucHJpbVNldE1hbmlmZXN0KG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKCkpOwotICAgICAgICAgICAgY2F1Z2h0TWFuaWZlc3RFeGNlcHRpb24gPSBpb3g7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gd2VUcmllZCkgewotICAgICAgICAgICAgICAgIAkvL0lnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWxpZGF0ZUVkaXRMaXN0ZW5lcigpIHsKLSAgICAgICAgdmFsaWRhdGVFZGl0TGlzdGVuZXIgPSBuZXcgVmFsaWRhdGVFZGl0TGlzdGVuZXIobnVsbCwgbW9kZWwpOwotICAgICAgICB2YWxpZGF0ZUVkaXRMaXN0ZW5lci5zZXRTaGVsbChnZXRTaGVsbCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgICAgIGlmICh2aXNpYmxlICYmIGNhdWdodE1hbmlmZXN0RXhjZXB0aW9uICE9IG51bGwgJiYgIW1vZGVsLmlzRGlydHkoKSkKLSAgICAgICAgICAgIE1hbmlmZXN0RXJyb3JQcm9tcHRlci5zaG93TWFuaWZlc3RFeGNlcHRpb24oZ2V0U2hlbGwoKSwgRVJST1JfUkVBRElOR19NQU5JRkVTVF9ESUFMT0dfTUVTU0FHRV9QUk9QX1BBR0UsIGZhbHNlLCBjYXVnaHRNYW5pZmVzdEV4Y2VwdGlvbik7Ci0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSkKLQkgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQmFzaWNDb21wb3NpdGUocGFyZW50KTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgaWYoIG1vZGVsLmdldENvbXBvbmVudCgpICE9IG51bGwgKXsgICAgICAgIAotCSAgICAgICAgaWYoIWlzVmFsaWRDb21wb25lbnQoKSkKLQkgICAgICAgIAlyZXR1cm4gY29tcG9zaXRlOwotCSAgICAgICAgY3JlYXRlUHJvamVjdExhYmVsc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JICAgICAgICBjcmVhdGVMaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkgICAgICAgIGNyZWF0ZVRleHRHcm91cChjb21wb3NpdGUpOwotCSAgICAgICAgcmVmcmVzaCgpOwotICAgIAl9Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCQotCS8qKgotCSAqIEBwYXJhbSBjb21wCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQmFzaWNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRDb21wb25lbnQoKSB7Ci0JCWlmIChtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRDb21wb25lbnRUeXBlSWQoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkpIHsKLQkJCXRoaXMuc2V0RXJyb3JNZXNzYWdlKE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFQVJfTW9kdWxlX0RlcF9FcnJvciIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKEoyRUVDb21wb25lbnRVdGlsaXRpZXMuaXNTdGFuZGFsb25lQ29tcG9uZW50KG1vZGVsLmdldENvbXBvbmVudCgpKSApIHsKLQkJCXRoaXMuc2V0RXJyb3JNZXNzYWdlKENsYXNzcGF0aE1vZGVsLk5PX0VBUl9NRVNTQUdFKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0TGFiZWxzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBsYWJlbHNHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYWJlbHNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGFiZWxzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobGFiZWxzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdF9uYW1lX19VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvamVjdCBuYW1lOiIKLQotCQljb21wb25lbnROYW1lVGV4dCA9IG5ldyBUZXh0KGxhYmVsc0dyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWNvbXBvbmVudE5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvbmVudE5hbWVUZXh0LnNldFRleHQocHJvamVjdC5nZXROYW1lKCkpOwotCQkKLQkJY3JlYXRlRW50ZXJwcmlzZUFwcHNDb250cm9scyhsYWJlbHNHcm91cCk7Ci0KLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRW50ZXJwcmlzZUFwcHNDb250cm9scyhDb21wb3NpdGUgbGFiZWxzR3JvdXApIHsKLQotCQllbnRlcnByaXNlQXBwbGljYXRpb25MYWJlbCA9IG5ldyBMYWJlbChsYWJlbHNHcm91cCwgU1dULk5PTkUpOwotCQllbnRlcnByaXNlQXBwbGljYXRpb25MYWJlbC5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFQVJfUHJvamVjdF9OYW1lX19VSV9fVUlfIikpOyAvLyROT04tTkxTLTEkID0gIkVBUiBwcm9qZWN0IG5hbWU6IgotCi0JCWF2YWlsYWJsZUFwcHNDb21ibyA9IG5ldyBDQ29tYm8obGFiZWxzR3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYXZhaWxhYmxlQXBwc0NvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCWF2YWlsYWJsZUFwcHNDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgbGlzdEdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBsaXN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGdEYXRhLmhvcml6b250YWxJbmRlbnQgPSA1OwotICAgICAgICBsaXN0R3JvdXAuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0KLSAgICAgICAgYXZhaWxhYmxlRGVwZW5kZW50SmFycyA9IG5ldyBMYWJlbChsaXN0R3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgICAgIGF2YWlsYWJsZURlcGVuZGVudEphcnMuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQXZhaWxhYmxlX2RlcGVuZGVudF9KQVJzX19VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiQXZhaWxhYmxlIGRlcGVuZGVudCBKQVJzOiIKLSAgICAgICAgYXZhaWxhYmxlRGVwZW5kZW50SmFycy5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLSAgICAgICAgY3JlYXRlVGFibGVDb21wb3NpdGUobGlzdEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uLnVpLmNsYXNzcGF0aC5JQ2xhc3NwYXRoVGFibGVPd25lciNjcmVhdGVHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0gICAgcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXh0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSB0ZXh0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJdGV4dEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQl0ZXh0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlQ2xhc3NQYXRoVGV4dCh0ZXh0R3JvdXApOwotCi0JfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2xhc3NQYXRoVGV4dChDb21wb3NpdGUgdGV4dEdyb3VwKSB7Ci0gICAgCQotICAgIAltYW5pZmVzdExhYmVsID0gbmV3IExhYmVsKHRleHRHcm91cCwgU1dULk5PTkUpOwotCQltYW5pZmVzdExhYmVsLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1hbmlmZXN0X0NsYXNzLVBhdGhfX1VJXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJNYW5pZmVzdCBDbGFzcy1QYXRoOiIKLQkJCi0gICAgICAgIGNsYXNzUGF0aFRleHQgPSBuZXcgVGV4dCh0ZXh0R3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICAgIEdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGdEYXRhLndpZHRoSGludCA9IDQwMDsKLSAgICAgICAgZ0RhdGEuaGVpZ2h0SGludCA9IDEwMDsKLSAgICAgICAgY2xhc3NQYXRoVGV4dC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLSAgICAgICAgY2xhc3NQYXRoVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLSAgICAgICAgdGFibGVNYW5hZ2VyID0gbmV3IENsYXNzcGF0aFRhYmxlTWFuYWdlcih0aGlzLCBtb2RlbCwgdmFsaWRhdGVFZGl0TGlzdGVuZXIpOwotICAgICAgICB0YWJsZU1hbmFnZXIuc2V0UmVhZE9ubHkoaXNSZWFkT25seSgpKTsKLSAgICAgICAgdGFibGVNYW5hZ2VyLmZpbGxDb21wb3NpdGUoY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAc2VlIElDbGFzc3BhdGhUYWJsZU93bmVyI2NyZWF0ZUF2YWlsYWJsZUpBUnNWaWV3ZXIoQ29tcG9zaXRlKQotCSAqLwotICAgIHB1YmxpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZUF2YWlsYWJsZUpBUnNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBpbnQgZmxhZ3MgPSBTV1QuQ0hFQ0sgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJOwotCi0gICAgICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCxmbGFncyk7Ci0gICAgICAgIENoZWNrYm94VGFibGVWaWV3ZXIgYXZhaWxhYmxlSkFSc1ZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlKTsKLQotICAgICAgICAvLyBzZXQgdXAgdGFibGUgbGF5b3V0Ci0gICAgICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQoKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLSAgICAgICAgdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLSAgICAgICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICBhdmFpbGFibGVKQVJzVmlld2VyLnNldFNvcnRlcihudWxsKTsKLQotICAgICAgICAvLyB0YWJsZSBjb2x1bW5zCi0gICAgICAgIFRhYmxlQ29sdW1uIGZpbGVOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMCk7Ci0gICAgICAgIGZpbGVOYW1lQ29sdW1uLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkpBUi9Nb2R1bGVfVUlfIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZpbGVOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUNvbHVtbiBwcm9qZWN0Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMSk7Ci0gICAgICAgIHByb2plY3RDb2x1bW4uc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdF9VSV8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvamVjdCIKLSAgICAgICAgcHJvamVjdENvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmxheW91dCh0YWJsZSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBhdmFpbGFibGVKQVJzVmlld2VyOwotCi0gICAgfQotCi0gICAgLyoqCi0JICogQHNlZSBJQ2xhc3NwYXRoVGFibGVPd25lciNjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlKQotCSAqLwotICAgIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQnV0dG9uQ29sdW1uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbHVtbiA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgYnV0dG9uQ29sdW1uLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICAgIGJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICByZXR1cm4gYnV0dG9uQ29sdW1uOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBzZWUgSUNsYXNzcGF0aFRhYmxlT3duZXIKLQkgKi8KLSAgICBwdWJsaWMgQnV0dG9uIHByaW1DcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCwgQ29tcG9zaXRlIGJ1dHRvbkNvbHVtbikgewotICAgICAgICBCdXR0b24gYUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29sdW1uLCBTV1QuUFVTSCk7Ci0gICAgICAgIGFCdXR0b24uc2V0VGV4dChsYWJlbCk7Ci0gICAgICAgIHJldHVybiBhQnV0dG9uOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBzZWUgSUNsYXNzcGF0aFRhYmxlT3duZXIKLQkgKi8KLSAgICBwdWJsaWMgQnV0dG9uIHByaW1DcmVhdGVSYWRpb0J1dHRvbihTdHJpbmcgbGFiZWwsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIGFCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICAgICAgYUJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICAgICAgcmV0dXJuIGFCdXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQud2lkZ2V0ID09IGF2YWlsYWJsZUFwcHNDb21ibykKLSAgICAgICAgICAgIGF2YWlsYWJsZUFwcHNTZWxlY3RlZChldmVudCk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCB2b2lkIGF2YWlsYWJsZUFwcHNTZWxlY3RlZChFdmVudCBldmVudCkgewotICAgICAgICBpbnQgaW5kZXggPSBhdmFpbGFibGVBcHBzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgbW9kZWwuc2VsZWN0RUFSKGluZGV4KTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVBcHBzKCkgewotCQlJVmlydHVhbENvbXBvbmVudFtdIGNvbXBvbmVudHMgPSBtb2RlbC5nZXRBdmFpbGFibGVFQVJDb21wb25lbnRzKCk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbY29tcG9uZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXZhbHVlc1tpXSA9IGNvbXBvbmVudHNbaV0uZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoYXZhaWxhYmxlQXBwc0NvbWJvICE9IG51bGwpIHsKLQkJCWF2YWlsYWJsZUFwcHNDb21iby5zZXRJdGVtcyh2YWx1ZXMpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgc2VsZWN0ZWQgPSBtb2RlbC5nZXRTZWxlY3RlZEVBUkNvbXBvbmVudCgpOwotCQkJaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLQkJCQlpbnQgaW5kZXggPSBBcnJheXMuYXNMaXN0KGNvbXBvbmVudHMpLmluZGV4T2Yoc2VsZWN0ZWQpOwotCQkJCWF2YWlsYWJsZUFwcHNDb21iby5zZWxlY3QoaW5kZXgpOwotCQkJfSBlbHNlCi0JCQkJYXZhaWxhYmxlQXBwc0NvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCX0KLQl9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKCkgewotCQlwb3B1bGF0ZUFwcHMoKTsKLQkJdGFibGVNYW5hZ2VyLnJlZnJlc2goKTsKLQkJcmVmcmVzaFRleHQoKTsKLQl9Ci0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoVGV4dCgpIHsKLQkJQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbCA9IG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlpZiggc2VsICE9IG51bGwgJiYgY2xhc3NQYXRoVGV4dCAhPSBudWxsICkKLQkJCWNsYXNzUGF0aFRleHQuc2V0VGV4dChzZWwgPT0gbnVsbCA/ICIiIDogc2VsLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgLyoqCi0JICogQHNlZSBDbGFzc3BhdGhNb2RlbExpc3RlbmVyI21vZGVsQ2hhbmdlZChDbGFzc3BhdGhNb2RlbEV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChDbGFzc3BhdGhNb2RlbEV2ZW50IGV2dCkgewotICAgICAgICBpZiAoZXZ0LmdldEV2ZW50VHlwZSgpID09IENsYXNzcGF0aE1vZGVsRXZlbnQuQ0xBU1NfUEFUSF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICBpc0RpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlZnJlc2hUZXh0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXZ0LmdldEV2ZW50VHlwZSgpID09IENsYXNzcGF0aE1vZGVsRXZlbnQuRUFSX1BST0pFQ1RfQ0hBTkdFRCkKLSAgICAgICAgICAgIHRhYmxlTWFuYWdlci5yZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLSAgICAgICAgbW9kZWwucmVzZXRDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICBpc0RpcnR5ID0gZmFsc2U7Ci0gICAgICAgIG1vZGVsLmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLSAgICAJbW9kZWwuZGlzcG9zZSgpOwotICAgIAlyZXR1cm4gc3VwZXIucGVyZm9ybUNhbmNlbCgpOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBzZWUgSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpIAotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAgICAgaWYgKCFpc0RpcnR5KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkID0gbmV3IFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKGNyZWF0ZU1hbmlmZXN0T3BlcmF0aW9uKCkpOwotICAgICAgICBjb21wb3NlZC5hZGRSdW5uYWJsZShjcmVhdGVCdWlsZFBhdGhPcGVyYXRpb24oKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLCBjb21wb3NlZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBbl9pbnRlcm5hbF9lcnJvcl9vY2N1cnJlZF9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHRpdGxlOwotICAgICAgICAgICAgaWYgKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwgJiYgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbXNnID0gZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IodGhpcy5nZXRTaGVsbCgpLCB0aXRsZSwgbXNnKTsKLSAgICAgICAgICAgIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBjYW5jZWxsZWQKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgCW1vZGVsLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBpc0RpcnR5ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLS8vICAgIHByaXZhdGUgYm9vbGVhbiBydW5XTFBPcChXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBjb21wb3NlZCkgewotLy8gICAgCXRyeSB7Ci0vLwkJCWlmIChjb21wb3NlZCAhPSBudWxsKQotLy8JCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKS5ydW4odHJ1ZSwgdHJ1ZSwgY29tcG9zZWQpOwotLy8JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJU3RyaW5nIHRpdGxlID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX2ludGVybmFsX2Vycm9yX29jY3VycmVkX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkCi0vLwkJCVN0cmluZyBtc2cgPSB0aXRsZTsKLS8vCQkJaWYgKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwgJiYgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0vLwkJCQltc2cgPSBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0vLwkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHRoaXMuZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZyk7Ci0vLwkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8JCQkvLyBjYW5jZWxsZWQKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlyZXR1cm4gdHJ1ZTsKLS8vICAgIH0KLQotCXByb3RlY3RlZCBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBjcmVhdGVDb21wb25lbnREZXBlbmRlbmN5T3BlcmF0aW9ucygpIHsKLQkJV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY29tcG9zZWRPcCA9IG51bGw7Ci0JCUxpc3Qgc2VsZWN0ZWQgPSBnZXRTZWxlY3RlZENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKS5nZXRDbGFzc3BhdGhFbGVtZW50cygpOwotCQlMaXN0IHVuc2VsZWN0ZWQgPSBnZXRVblNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpLmdldENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0JCQotCQlMaXN0IHRhcmdldENvbXBvbmVudHNIYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLnNpemUoKTsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgc2VsZWN0ZWQuZ2V0KGkpOwotCQkJSVByb2plY3QgZWxlbWVudFByb2plY3QgPSBlbGVtZW50LmdldFByb2plY3QoKTsKLQkJCWlmKCBlbGVtZW50UHJvamVjdCAhPSBudWxsICl7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVsZW1lbnRQcm9qZWN0KTsKLQkJCQl0YXJnZXRDb21wb25lbnRzSGFuZGxlcy5hZGQodGFyZ2V0Q29tcCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCF0YXJnZXRDb21wb25lbnRzSGFuZGxlcy5pc0VtcHR5KCkpIHsKLQkJCWNvbXBvc2VkT3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oKTsKLQkJCWNvbXBvc2VkT3AuYWRkUnVubmFibGUoV1RQVUlQbHVnaW4uZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoQ29tcG9uZW50VXRpbGl0aWVzLmNyZWF0ZVdMUFJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihtb2RlbC5nZXRDb21wb25lbnQoKSwgdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMpKSk7Ci0JCX0KLQkJdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5zZWxlY3RlZC5zaXplKCk7IGkrKykgewotCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIHVuc2VsZWN0ZWQuZ2V0KGkpOwotCQkJSVByb2plY3QgZWxlbWVudFByb2plY3QgPSBlbGVtZW50LmdldFByb2plY3QoKTsKLQkJCWlmKCBlbGVtZW50UHJvamVjdCAhPSBudWxsICl7Ci0JCQkJaWYgKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QoZWxlbWVudFByb2plY3QpKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldENvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlbGVtZW50UHJvamVjdCk7Ci0JCQkJCXRhcmdldENvbXBvbmVudHNIYW5kbGVzLmFkZCh0YXJnZXRDb21wKTsKLQkJCQl9Ci0JCQl9ZWxzZXsKLQkJCQlVUkkgYXJjaGl2ZVVSSSA9IGVsZW1lbnQuZ2V0QXJjaGl2ZVVSSSgpOwotCQkJCWlmKCBhcmNoaXZlVVJJICE9IG51bGwgJiYgIWFyY2hpdmVVUkkuZXF1YWxzKCIiKSApeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyB0eXBlID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlVHlwZShhcmNoaXZlVVJJKTsKLQkJCQkJCVN0cmluZyB0bXBuYW1lID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlTmFtZShhcmNoaXZlVVJJKTsKLQkJCQkJCW5hbWUgPSB0eXBlICsgSVBhdGguU0VQQVJBVE9SICsgdG1wbmFtZTsKLQkJCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJCWlmKCAhbmFtZS5lcXVhbHMoIiIpKXsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gbW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0UmVmZXJlbmNlKG5hbWUpOwotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZCA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQl0YXJnZXRDb21wb25lbnRzSGFuZGxlcy5hZGQocmVmZXJlbmNlZCk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghdGFyZ2V0Q29tcG9uZW50c0hhbmRsZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZihjb21wb3NlZE9wID09IG51bGwpCi0JCQkJY29tcG9zZWRPcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbigpOwotCQkJY29tcG9zZWRPcC5hZGRSdW5uYWJsZShXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhDb21wb25lbnRVdGlsaXRpZXMucmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKG1vZGVsLmdldENvbXBvbmVudCgpLCB0YXJnZXRDb21wb25lbnRzSGFuZGxlcykpKTsKLQkJfQotCQlyZXR1cm4gY29tcG9zZWRPcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNyZWF0ZUZsZXhQcm9qZWN0T3BlcmF0aW9ucygpIHsKLQkJV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24gY29tcG9zZWRPcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IHRhYmxlTWFuYWdlci5hdmFpbGFibGVKQVJzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBlbGVtZW50c1tpXTsKLQkJCQlJUHJvamVjdCBlbGVtZW50UHJvamVjdCA9IGVsZW1lbnQuZ2V0UHJvamVjdCgpOwotCQkJCWlmICggZWxlbWVudFByb2plY3QgIT0gbnVsbCAmJiAhZWxlbWVudFByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQkJaWYoY29tcG9zZWRPcCA9PSBudWxsKQotCQkJCQkJY29tcG9zZWRPcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbigpOwotCQkJCQljb21wb3NlZE9wLmFkZFJ1bm5hYmxlKFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKENvbXBvbmVudFV0aWxpdGllcy5jcmVhdGVGbGV4SmF2YVByb2plY3RGb3JQcm9qZWN0T3BlcmF0aW9uKGVsZW1lbnRQcm9qZWN0KSkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBjb21wb3NlZE9wOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbigpIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKG5ldyBVcGRhdGVKYXZhQnVpbGRQYXRoT3BlcmF0aW9uKGphdmFQcm9qZWN0LGdldFNlbGVjdGVkQ2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpKSk7Ci0gICAgfQotCQotCXByb3RlY3RlZCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgY3JlYXRlV0xQQnVpbGRQYXRoT3BlcmF0aW9uKCkgewotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotICAgICAgICByZXR1cm4gV1RQVUlQbHVnaW4uZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MobmV3IFVwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb24oamF2YVByb2plY3QsZ2V0U2VsZWN0ZWRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCksZ2V0VW5TZWxlY3RlZENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKSkpOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgQ2xhc3NQYXRoU2VsZWN0aW9uIGdldFVuU2VsZWN0ZWRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkgewotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSB0YWJsZU1hbmFnZXIuYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJTGlzdCBtb2RlbEVsZW1lbnRzID0gbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpLmdldENsYXNzcGF0aEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJTGlzdCBjaGVja2VkRWxlbWVudHNMaXN0ID0gQXJyYXlzLmFzTGlzdChjaGVja2VkRWxlbWVudHMpOwotCQkJaWYgKCFjaGVja2VkRWxlbWVudHNMaXN0LmNvbnRhaW5zKG1vZGVsRWxlbWVudHMuZ2V0KGkpKSkgewotCQkJCXNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChtb2RlbEVsZW1lbnRzLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0JCi0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc1BhdGhTZWxlY3Rpb24gZ2V0U2VsZWN0ZWRDbGFzc1BhdGhTZWxlY3Rpb25Gb3JXTFBzKCkgewotICAgIAkJQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBDbGFzc1BhdGhTZWxlY3Rpb24oKTsKLSAgICAJCU9iamVjdFtdIGNoZWNrZWRFbGVtZW50cyA9IHRhYmxlTWFuYWdlci5hdmFpbGFibGVKQVJzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotICAgIAkJZm9yKGludCBpID0gMDsgaSA8IGNoZWNrZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgIAkJCXNlbGVjdGlvbi5nZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChjaGVja2VkRWxlbWVudHNbaV0pOwotICAgIAkJfQotICAgIAkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uIGNyZWF0ZU1hbmlmZXN0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKHByb2plY3QuZ2V0TmFtZSgpLCBtb2RlbC5nZXRDbGFzc1BhdGhTZWxlY3Rpb24oKS50b1N0cmluZygpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotICAgICAgICByZXR1cm4gSmVtUHJvamVjdFV0aWxpdGllcy5pc0JpbmFyeVByb2plY3QocHJvamVjdCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0RXJyb3JQcm9tcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0RXJyb3JQcm9tcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMThiMTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NYW5pZmVzdEVycm9yUHJvbXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW5pZmVzdEVycm9yUHJvbXB0ZXIgaW1wbGVtZW50cyBJQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFuaWZlc3RFcnJvclByb21wdGVyLgotCSAqLwotCXByaXZhdGUgTWFuaWZlc3RFcnJvclByb21wdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd01hbmlmZXN0RXhjZXB0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgYmFzZU1lc3NhZ2UsIGJvb2xlYW4gaW5jbHVkZUNhbmNlbCwgVGhyb3dhYmxlIGNhdWdodCkgewotCQlTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcihiYXNlTWVzc2FnZSk7Ci0JCW1zZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZChNQU5JRkVTVF9QUk9CTEVNXzEpOwotCQltc2cuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoTUFOSUZFU1RfUFJPQkxFTV8yKTsKLQkJbXNnLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQltc2cuYXBwZW5kKE1BTklGRVNUX1BST0JMRU1fMyk7Ci0JCW1zZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZChNQU5JRkVTVF9QUk9CTEVNXzQpOwotCQlyZXR1cm4gRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLAotCQkgICBFUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19USVRMRSwKLQkJICAgbXNnLnRvU3RyaW5nKCksCi0JCSAgIGNhdWdodCwKLQkJICAgMCwgaW5jbHVkZUNhbmNlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzMjgwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm1hbmlmZXN0X3VpIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0JCQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gCi0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JdHJ5IHtyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtyZXR1cm4gZ2V0U3RyaW5nKGtleSk7fQotCi19Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIGludCB4KSB7Ci0KLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1VwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTEwMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1VwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5XRlRXcmFwcGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NQYXRoVmFsdWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVwbGFjZTsKLS8qKgotICogVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKFN0cmluZyBhUHJvamVjdE5hbWUsIFN0cmluZyBhU3BhY2VEZWxpbWl0ZWRQYXRoLCBib29sZWFuIHJlcGxhY2VJbnN0ZWFkT2ZNZXJnZSkgewotCXN1cGVyKCk7Ci0JcHJvamVjdE5hbWUgPSBhUHJvamVjdE5hbWU7Ci0JY2xhc3NQYXRoVmFsdWUgPSBhU3BhY2VEZWxpbWl0ZWRQYXRoOwotCXJlcGxhY2UgPSByZXBsYWNlSW5zdGVhZE9mTWVyZ2U7Ci19Ci1wcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci19Ci0vKioKLSAqIFJ1bnMgdGhpcyBvcGVyYXRpb24uICBQcm9ncmVzcyBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IuCi0gKiBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IGludm9rZWQgYnkgYW4gPGNvZGU+SVJ1bm5hYmxlQ29udGV4dDwvY29kZT4ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCwKLSAqIHdoaWNoIHN1cHBsaWVzIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotICogQSByZXF1ZXN0IHRvIGNhbmNlbCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBob25vcmVkIGFuZCBhY2tub3dsZWRnZWQgCi0gKiBieSB0aHJvd2luZyA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4uCi0gKgotICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUKLSAqICAgcmVxdWVzdHMgZm9yIGNhbmNlbGF0aW9uCi0gKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwKLSAqIAlpdCBzaG91bGQgd3JhcCBpdCBpbnNpZGUgYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT47IHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmUgYXV0b21hdGljYWxseQotICogIHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlIGNhbGxpbmcgY29udGV4dAotICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgCi0gKiAgdXNpbmcgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk8L2NvZGU+LCBpdCBzaG91bGQgZXhpdCBieSB0aHJvd2luZyAKLSAqICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLSAqCi0gKiBAc2VlIElSdW5uYWJsZUNvbnRleHQjcnVuCi0gKi8KLXB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7Ci0JdHJ5IHsKLQkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KHApOwotCQlpZiAobWYgPT0gbnVsbCkKLQkJCW1mID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoKTsKLQkJbWYuYWRkVmVyc2lvbklmTmVjZXNzYXJ5KCk7Ci0JCWlmIChyZXBsYWNlKQotCQkJbWYuc2V0Q2xhc3NQYXRoKGNsYXNzUGF0aFZhbHVlKTsKLQkJZWxzZQotCQkJbWYubWVyZ2VDbGFzc1BhdGgoQXJjaGl2ZVV0aWwuZ2V0VG9rZW5zKGNsYXNzUGF0aFZhbHVlKSk7Ci0JCUoyRUVQcm9qZWN0VXRpbGl0aWVzLndyaXRlTWFuaWZlc3QocCwgbWYpOwotCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJdGhyb3cgbmV3IFdGVFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwYjJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5CdWlsZFBhdGhEaWFsb2dBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aE1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuVXBkYXRlSmF2YUJ1aWxkUGF0aE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVDb21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGV4dGVuZHMgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGltcGxlbWVudHMgSUNsYXNzcGF0aFRhYmxlT3duZXIsIExpc3RlbmVyLCBDbGFzc3BhdGhNb2RlbExpc3RlbmVyIHsKLQotCXB1YmxpYyBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQotCSAqLwotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQmFzaWNDb21wb3NpdGUocGFyZW50KTsKLQkJaWYoIG1vZGVsLmdldENvbXBvbmVudCgpICE9IG51bGwgKXsKLQkJCWlmICghaXNWYWxpZFdlYk1vZHVsZSgpKQotCQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQljcmVhdGVQcm9qZWN0TGFiZWxzR3JvdXAoY29tcG9zaXRlKTsKLQkJCWNyZWF0ZUxpc3RHcm91cChjb21wb3NpdGUpOwotCQkJaGFuZGxlV0xQU3VwcG9ydCgpOwotCQkJbW9kZWwuc2V0V0xQTW9kZWwodHJ1ZSk7Ci0JCQlzZXRFbmFibGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdExhYmVsc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgbGFiZWxzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGFiZWxzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxhYmVsc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGxhYmVsc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RfbmFtZV9fVUlfIikpOyAvLyROT04tTkxTLTEkID0gIlByb2plY3QgbmFtZToiCi0KLQkJY29tcG9uZW50TmFtZVRleHQgPSBuZXcgVGV4dChsYWJlbHNHcm91cCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29tcG9uZW50TmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljb21wb25lbnROYW1lVGV4dC5zZXRUZXh0KHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGlzdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGxpc3RHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgbGlzdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLSAgICAgICAgbGlzdEdyb3VwLnNldExheW91dERhdGEoZ0RhdGEpOwotCi0gICAgICAgIGF2YWlsYWJsZURlcGVuZGVudEphcnMgPSBuZXcgTGFiZWwobGlzdEdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotICAgICAgICBhdmFpbGFibGVEZXBlbmRlbnRKYXJzLnNldFRleHQoTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkF2YWlsYWJsZV9kZXBlbmRlbnRfSkFSc19fVUlfIikpOyAvLyROT04tTkxTLTEkID0gIkF2YWlsYWJsZSBkZXBlbmRlbnQgSkFSczoiCi0gICAgICAgIGF2YWlsYWJsZURlcGVuZGVudEphcnMuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0gICAgICAgIGNyZWF0ZVRhYmxlQ29tcG9zaXRlKGxpc3RHcm91cCk7Ci0gICAgfQotICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ0RhdGEpOwotICAgICAgICB0YWJsZU1hbmFnZXIgPSBuZXcgQ2xhc3NwYXRoVGFibGVNYW5hZ2VyKHRoaXMsIG1vZGVsLCB2YWxpZGF0ZUVkaXRMaXN0ZW5lcik7Ci0gICAgICAgIHRhYmxlTWFuYWdlci5zZXRSZWFkT25seShpc1JlYWRPbmx5KCkpOwotICAgICAgICB0YWJsZU1hbmFnZXIuZmlsbFdMUENvbXBvc2l0ZShjb21wb3NpdGUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkV2ViTW9kdWxlKCkgewotCQlpZiAoIUoyRUVDb21wb25lbnRVdGlsaXRpZXMuaXNXZWJDb21wb25lbnQobW9kZWwuZ2V0Q29tcG9uZW50KCkpKSB7Ci0JCQl0aGlzLnNldEVycm9yTWVzc2FnZShNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2ViX0xpYl9FcnJvciIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVtZW50KCkgewotCQlpZiAodGFibGVNYW5hZ2VyLmF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0YWJsZU1hbmFnZXIuc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGFibGVNYW5hZ2VyLmRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJdGFibGVNYW5hZ2VyLnNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJdGFibGVNYW5hZ2VyLmRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdMUFN1cHBvcnQoKSB7Ci0JCQl0YWJsZU1hbmFnZXIuc2V0V0xQRW50cnkodHJ1ZSk7Ci0JCQlhdmFpbGFibGVEZXBlbmRlbnRKYXJzLnNldFRleHQoIlNlbGVjdCB1dGlsaXR5IHByb2plY3RzIHRvIGFkZCBhcyBXZWIgTGlicmFyeSBwcm9qZWN0cyB0byB0aGUgd2ViIG1vZHVsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl0YWJsZU1hbmFnZXIucmVmcmVzaCgpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmKCBtb2RlbC5nZXRDb21wb25lbnQoKSA9PSBudWxsIHx8ICFpc1ZhbGlkV2ViTW9kdWxlKCkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCi0JCXRyeSB7Ci0JCQlib29sZWFuIGNyZWF0ZWRGbGV4UHJvamVjdHMgPSBydW5XTFBPcChjcmVhdGVGbGV4UHJvamVjdE9wZXJhdGlvbnMoKSk7Ci0JCQlib29sZWFuIGNyZWF0ZWRDb21wb25lbnREZXBlbmRlbmN5ID0gZmFsc2U7Ci0JCQlpZiAoY3JlYXRlZEZsZXhQcm9qZWN0cykKLQkJCQljcmVhdGVkQ29tcG9uZW50RGVwZW5kZW5jeSA9IHJ1bldMUE9wKGNyZWF0ZUNvbXBvbmVudERlcGVuZGVuY3lPcGVyYXRpb25zKCkpOwotCQkJYm9vbGVhbiBjcmVhdGVkQnVpbGRQYXRoU2V0dGluZ3MgPSBmYWxzZTsKLQkJCWlmIChjcmVhdGVkQ29tcG9uZW50RGVwZW5kZW5jeSkgewotCQkJCVdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkT3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oKTsKLQkJCQljb21wb3NlZE9wLmFkZFJ1bm5hYmxlKGNyZWF0ZVdMUEJ1aWxkUGF0aE9wZXJhdGlvbigpKTsKLQkJCQljcmVhdGVkQnVpbGRQYXRoU2V0dGluZ3MgPSBydW5XTFBPcChjb21wb3NlZE9wKTsKLQkJCX0KLQkJCXJldHVybiBjcmVhdGVkQnVpbGRQYXRoU2V0dGluZ3M7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2RlbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHJ1bldMUE9wKFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkKSB7Ci0gICAgCXRyeSB7Ci0JCQlpZiAoY29tcG9zZWQgIT0gbnVsbCkKLQkJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLCBjb21wb3NlZCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCVN0cmluZyB0aXRsZSA9IE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJBbl9pbnRlcm5hbF9lcnJvcl9vY2N1cnJlZF9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1zZyA9IHRpdGxlOwotCQkJaWYgKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwgJiYgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0JCQkJbXNnID0gZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IodGhpcy5nZXRTaGVsbCgpLCB0aXRsZSwgbXNnKTsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjYW5jZWxsZWQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0JcHVibGljIHZvaWQgaGFuZGxlU2VsZWN0RXh0ZXJuYWxKYXJCdXR0b24oKXsKLQkJCi0JCWlmIChtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRDb21wb25lbnRUeXBlSWQoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpewotCQkJCi0JCQlJUGF0aFtdIHNlbGVjdGVkPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlRXh0ZXJuYWxKQVJFbnRyaWVzKGdldFNoZWxsKCkpOwotCQotCQkJaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQkJCi0JCQkJCVN0cmluZyB0eXBlID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUgKyBJUGF0aC5TRVBBUkFUT1I7Ci0JCQkJCVN0cmluZyBuYW1lID0gc2VsZWN0ZWRbaV0udG9TdHJpbmcoKTsKLQkJCQkJCi0JCQkJCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShuYW1lKTsJCQkJCQotCQkJCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KCBtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCksIHR5cGUgKwotCQkJCQkJCQlzZWxlY3RlZFtpXS50b1N0cmluZygpKTsKLQkJCQkJCi0JCQkJCUFycmF5TGlzdCB2bGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBvbGRyZWZzID0gbW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0UmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG9sZHJlZnNbal07Ci0JCQkJCQl2bGlzdC5hZGQocmVmKTsKLQkJCQkJfQkJCi0JCQkJCi0JCQkJCS8vVG8gZG86IGNoZWNrIGlmIGFyY2hpdmUgY29tcG9uZW50IGFscmVhZHkgZXhpc3RzCi0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKCBtb2RlbC5nZXRDb21wb25lbnQoKSwgYXJjaGl2ZSwgbmV3IFBhdGgoIi9XRUItSU5GL2xpYiIpICk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmxpc3QuYWRkKHJlZik7CQotCQkJCQkKLQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW3ZsaXN0LnNpemUoKV07Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHRtcHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSkgdmxpc3QuZ2V0KGopOwotCQkJCQkJcmVmc1tqXSA9IHRtcHJlZjsKLQkJCQkJfQkJCQkKLQkJCQkJbW9kZWwuZ2V0Q29tcG9uZW50KCkuc2V0UmVmZXJlbmNlcyhyZWZzKTsKLQotCQkJCQkKLQkJCQkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlQ2xhc3NQYXRoRWxlbWVudChhcmNoaXZlLCBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJCUNsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBjcmVhdGVDbGFzc1BhdGhTZWxlY3Rpb25Gb3JFeHRlcm5hbEphcihlbGVtZW50KTsKLQkJCQkJY3JlYXRlQnVpbGRQYXRoT3BlcmF0aW9uRm9yRXh0ZXJuYWxKYXIoc2VsZWN0aW9uKTsKLQkJCQkJCi0JCQkgICAgICAgIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkID0gbmV3IFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKGNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbkZvckV4dGVybmFsSmFyKHNlbGVjdGlvbikpOwotCQkJICAgICAgICB0cnkgewotCQkJICAgICAgICAgICAgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKS5ydW4odHJ1ZSwgdHJ1ZSwgY29tcG9zZWQpOwotCQkJICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQkgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQW5faW50ZXJuYWxfZXJyb3Jfb2NjdXJyZWRfRVJST1JfIik7IC8vJE5PTi1OTFMtMSQKLQkJCSAgICAgICAgICAgIFN0cmluZyBtc2cgPSB0aXRsZTsKLQkJCSAgICAgICAgICAgIGlmIChleC5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsICYmIGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSAhPSBudWxsKQotCQkJICAgICAgICAgICAgICAgIG1zZyA9IGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJCSAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHRoaXMuZ2V0U2hlbGwoKSwgdGl0bGUsIG1zZyk7Ci0JCQkgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCSAgICAgICAgICAgIAotCQkJICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkgICAgICAgICAgICAvLyBjYW5jZWxsZWQKLQotCQkJICAgICAgICB9Ci0JCQkJCW1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbkZvcldMUHMoKS5nZXRDbGFzc3BhdGhFbGVtZW50cygpLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCQlyZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGhhbmRsZVNlbGVjdFZhcmlhYmxlQnV0dG9uKCl7Ci0JCQotCQlpZiAobW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0Q29tcG9uZW50VHlwZUlkKCkuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpKXsKLQkJCUlQYXRoIGV4aXN0aW5nUGF0aFtdID0gbmV3IFBhdGhbMF07Ci0JCQlJUGF0aFtdIHBhdGhzID0gIEJ1aWxkUGF0aERpYWxvZ0FjY2Vzcy5jaG9vc2VWYXJpYWJsZUVudHJpZXMoZ2V0U2hlbGwoKSwgZXhpc3RpbmdQYXRoKTsKLQkJCQotCQkJaWYgKHBhdGhzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQYXRoIHJlc29sdmVkUGF0aD0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgocGF0aHNbaV0pOwotCQotCQkJCQlqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocmVzb2x2ZWRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCWlmKCBmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpewotCQkJCQkJU3RyaW5nIHR5cGUgPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5WQVJBUkNISVZFVFlQRSArIElQYXRoLlNFUEFSQVRPUjsKLQkJCQkJCQotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCggbW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLCB0eXBlICsKLQkJCQkJCQkJCXBhdGhzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJCi0JCQkJCQlBcnJheUxpc3Qgdmxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIG9sZHJlZnMgPSBtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBvbGRyZWZzW2pdOwotCQkJCQkJCXZsaXN0LmFkZChyZWYpOwotCQkJCQkJfQkJCi0JCQkJCQotCQkJCQkJLy9UbyBkbzogY2hlY2sgaWYgYXJjaGl2ZSBjb21wb25lbnQgYWxyZWFkeSBleGlzdHMKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKCBtb2RlbC5nZXRDb21wb25lbnQoKSwgYXJjaGl2ZSwgbmV3IFBhdGgoIi9XRUItSU5GL2xpYiIpICk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZsaXN0LmFkZChyZWYpOwkKLQkJCQkJCQotCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW3ZsaXN0LnNpemUoKV07Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHZsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgdG1wcmVmID0gKElWaXJ0dWFsUmVmZXJlbmNlKSB2bGlzdC5nZXQoaik7Ci0JCQkJCQkJcmVmc1tqXSA9IHRtcHJlZjsKLQkJCQkJCX0JCQkJCi0JCQkJCQltb2RlbC5nZXRDb21wb25lbnQoKS5zZXRSZWZlcmVuY2VzKHJlZnMpOwotCQkJCQkJCi0JCQkJCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVDbGFzc1BhdGhFbGVtZW50KGFyY2hpdmUsIGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJCUNsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBjcmVhdGVDbGFzc1BhdGhTZWxlY3Rpb25Gb3JFeHRlcm5hbEphcihlbGVtZW50KTsKLQkJCQkJCWNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbkZvckV4dGVybmFsSmFyKHNlbGVjdGlvbik7Ci0JCQkJCQkKLQkJCQkgICAgICAgIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGNvbXBvc2VkID0gbmV3IFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKGNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbkZvckV4dGVybmFsSmFyKHNlbGVjdGlvbikpOwotCQkJCSAgICAgICAgdHJ5IHsKLQkJCQkgICAgICAgICAgICBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLCBjb21wb3NlZCk7Ci0JCQkJICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX2ludGVybmFsX2Vycm9yX29jY3VycmVkX0VSUk9SXyIpOyAvLyROT04tTkxTLTEkCi0JCQkJICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHRpdGxlOwotCQkJCSAgICAgICAgICAgIGlmIChleC5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsICYmIGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCSAgICAgICAgICAgICAgICBtc2cgPSBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0JCQkJICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IodGhpcy5nZXRTaGVsbCgpLCB0aXRsZSwgbXNnKTsKLQkJCQkgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkgICAgICAgICAgICAKLQkJCQkgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkgICAgICAgICAgICAvLyBjYW5jZWxsZWQKLQotCQkJCSAgICAgICAgfQotCQkJCQkJbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uRm9yV0xQcygpLmdldENsYXNzcGF0aEVsZW1lbnRzKCkuYWRkKGVsZW1lbnQpOwkJCQkJCQotCi0JCQkJCX1lbHNlewotCQkJCQkJLy9kaXNwbGF5IGVycm9yCi0JCQkJCX0KLQotCQkJCX0KLQkJCQlyZWZyZXNoKCk7Ci0JCQl9CQotCQl9CQotCX0JCi0JCi0JICAgIHByaXZhdGUgQ2xhc3NwYXRoRWxlbWVudCBjcmVhdGVDbGFzc1BhdGhFbGVtZW50KElWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmVDb21wLAotCQkJCVN0cmluZyB1bnJlc29sdmVkTmFtZSApIHsKLQkJCi0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGFyY2hpdmVDb21wKSk7Ci0JCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IG5ldyBDbGFzc3BhdGhFbGVtZW50KHVyaSk7Ci0JCWVsZW1lbnQuc2V0VmFsaWQoZmFsc2UpOwotCQllbGVtZW50LnNldFNlbGVjdGVkKHRydWUpOwotCQllbGVtZW50LnNldFJlbGF0aXZlVGV4dCh1bnJlc29sdmVkTmFtZSk7Ci0JCWVsZW1lbnQuc2V0VGV4dCh1bnJlc29sdmVkTmFtZSk7Ci0JCWVsZW1lbnQuc2V0RWFyUHJvamVjdChudWxsKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQkKLQkKLQlwcml2YXRlIENsYXNzUGF0aFNlbGVjdGlvbiBjcmVhdGVDbGFzc1BhdGhTZWxlY3Rpb25Gb3JFeHRlcm5hbEphcihDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQpewotCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IENsYXNzUGF0aFNlbGVjdGlvbigpOwotCQlzZWxlY3Rpb24uZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbkZvckV4dGVybmFsSmFyKENsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkgICAgcmV0dXJuIFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKG5ldyBVcGRhdGVKYXZhQnVpbGRQYXRoT3BlcmF0aW9uKGphdmFQcm9qZWN0LCBzZWxlY3Rpb24pKTsKLQl9ICAgIAotCQotLy8JcHJpdmF0ZSB2b2lkIGVuYWJsZUV4dGVybmFsSmFyQ29udHJvbHMoYm9vbGVhbiBiKSB7Ci0vLwkJdGFibGVNYW5hZ2VyLmV4dGVybmFsSmFyQnV0dG9uLnNldFZpc2libGUoYik7Ci0vLwkJdGFibGVNYW5hZ2VyLmFkZFZhcmlhYmxlQnV0dG9uLnNldFZpc2libGUoYik7Ci0vLwl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTNlZmIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQkKLQlwcm90ZWN0ZWQgTGlzdCBmUnVubmFibGVzOwotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXN1cGVyKHJ1bGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiB3aGljaCB3aWxsIGRlbGVnYXRlIGl0cyB3b3JrIHRvIHRoZSBnaXZlbiBydW5uYWJsZS4KLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKElTY2hlZHVsaW5nUnVsZSBydWxlLCBMaXN0IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzcykgewotCQlzdXBlcihydWxlKTsKLQkJZlJ1bm5hYmxlcyA9IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzczsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIoKTsKLQkJZlJ1bm5hYmxlcyA9IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiB3aGljaCB3aWxsIGRlbGVnYXRlIGl0cyB3b3JrIHRvIHRoZSBnaXZlbiBydW5uYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqICAgICAgICAgICAgdGhlIHJ1bm5hYmxlIHRvIGRlbGVnYXRlIHRvIHdoZW4gdGhpcyBvcGVyYXRpb24gaXMgZXhlY3V0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXN1cGVyKCk7Ci0JCWdldFJ1bm5hYmxlcygpLmFkZChuZXN0ZWRPcCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkUnVubmFibGUoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG5lc3RlZE9wKSB7Ci0JCXJldHVybiBnZXRSdW5uYWJsZXMoKS5hZGQobmVzdGVkT3ApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpbnQgc2l6ZSA9IGZSdW5uYWJsZXMuc2l6ZSgpOwotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgc2l6ZSk7Ly8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGZSdW5uYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IChJUnVubmFibGVXaXRoUHJvZ3Jlc3MpIGZSdW5uYWJsZXMuZ2V0KGkpOwotCQkJb3AucnVuKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSdW5uYWJsZXMoKSB7Ci0JCWlmIChmUnVubmFibGVzID09IG51bGwpCi0JCQlmUnVubmFibGVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJcmV0dXJuIGZSdW5uYWJsZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0QWN0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4ZDBiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93c011bHRpU2VsZWN0ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFUlJPUl9PQ0NVUlJFRF9USVRMRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFUlJPUl9PQ0NVUlJFRF9USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX01FU1NBR0UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVJST1JfT0NDVVJSRURfTUVTU0FHRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBFZGl0TW9kdWxlRGVwZW5kZW5jeUFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFwcGxpY2FibGUgb25seSB3aGVuIHRoaXMgYWN0aW9uIGRvZXMgbm90IGFsbG93IG11bHRpIHNlbGVjdAotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdChnZXRTZWxlY3RlZEVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvamVjdHMoKSB7Ci0JCWlmICgoc2VsZWN0aW9uID09IG51bGwpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQlJdGVyYXRvciBpdCA9IHN0cnVjdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdCBwID0gZ2V0UHJvamVjdChpdC5uZXh0KCkpOwotCQkJaWYgKHAgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkKHApOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IGVsZW1lbnQpIHsKLQotCQlpZiAoaXNTdXBwb3J0ZWRBY3Rpb24oZWxlbWVudCkpCi0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBlbGVtZW50KTsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXR1cm4gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSVBST0pFQ1RfQ0xBU1MpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpIHsKLQkJaWYgKChzZWxlY3Rpb24gPT0gbnVsbCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJc2VsZWN0aW9uID0gSjJFRVVJUGx1Z2luLmdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQkJfQotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiBPbmx5IHJldHVybiBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBpdGVtIHNlbGVjdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIHNlbCA9PSBudWxsID8gbnVsbCA6IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBnZXRXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JLyoqCi0JICogQ2FuIHRoZSByZWNlaXZlciBiZSBleGVjdXRlZCBmb3IKLQkgKiAKLQkgKiBAZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzU3VwcG9ydGVkQWN0aW9uKE9iamVjdCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3ByaW1SdW4oU2hlbGwpfQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oSVByb2plY3QgcHJvamVjdCwgU2hlbGwgc2hlbGwpIHsKLQkJLy9EZXByZWNhdGVkCi0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBpbnN0ZWFkIG9mIHtAbGluayAjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKX0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0JCXByaW1SdW4oZ2V0UHJvamVjdCgpLCBzaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhpcyBhY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZC4gSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvCi0JICogZG8gdGhlIGFjdHVhbCB3b3JrLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyB0aGUgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24pIHsKLQotCQlTaGVsbCBzaGVsbCA9IGdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCXNldEFjdGlvblN0YXRlRnJvbVByb2plY3RzKGFjdGlvbik7Ci0JCWlmICghYWN0aW9uLmlzRW5hYmxlZCgpKQotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJTkZPUk1BVElPTl9VSV8iKSwgSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNIT1NFTl9PUF9OT1RfQVZBSUxBQkxFIikpOyAvLyROT04tTkxTLTIkID0gIlRoZSBjaG9zZW4gb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLiIgLy8kTk9OLU5MUy0xJCA9ICJJbmZvcm1hdGlvbiIKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCXByaW1SdW4oc2hlbGwpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBFUlJPUl9PQ0NVUlJFRF9USVRMRSwgRVJST1JfT0NDVVJSRURfTUVTU0FHRSwgdCwgMCwgZmFsc2UpOwotCQkJfQotCQl9Ci0KLQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHRoYXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIEltcGxlbWVudGVycyBjYW4gdXNlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIGFjdGlvbiBvciB0byBtb2RpZnkKLQkgKiBvdGhlciBwcmVzZW50YXRpb24gcHJvcGVydGllcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBhU2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24gYWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldEFjdGlvblN0YXRlKGFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGUoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFsbG93c011bHRpU2VsZWN0KQotCQkJc2V0QWN0aW9uU3RhdGVGb3JNdWx0aVNlbGVjdChhY3Rpb24pOwotCQllbHNlCi0JCQlzZXRBY3Rpb25TdGF0ZUZvclNpbmdsZVNlbGVjdChhY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjdGlvblN0YXRlRm9yU2luZ2xlU2VsZWN0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbCA9PSBudWxsIHx8IHNlbC5zaXplKCkgIT0gMSkgewotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNldEFjdGlvblN0YXRlRnJvbVByb2plY3RzKGFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGVGb3JNdWx0aVNlbGVjdChJQWN0aW9uIGFjdGlvbikgewotCQlzZXRBY3Rpb25TdGF0ZUZyb21Qcm9qZWN0cyhhY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjdGlvblN0YXRlRnJvbVByb2plY3RzKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBhbGxPayA9IGZhbHNlOwotCQlpZiAoc2VsICE9IG51bGwgJiYgIXNlbC5pc0VtcHR5KCkpIHsKLQkJCWFsbE9rID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3Qobyk7Ci0JCQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlhbGxPayA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uLnNldEVuYWJsZWQoYWxsT2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFsbG93c011bHRpU2VsZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFsbG93c011bHRpU2VsZWN0KCkgewotCQlyZXR1cm4gYWxsb3dzTXVsdGlTZWxlY3Q7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGxvd3NNdWx0aVNlbGVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWxsb3dzTXVsdGlTZWxlY3QKLQkgKiAgICAgICAgICAgIFRoZSBhbGxvd3NNdWx0aVNlbGVjdCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd3NNdWx0aVNlbGVjdChib29sZWFuIGFsbG93c011bHRpU2VsZWN0KSB7Ci0JCXRoaXMuYWxsb3dzTXVsdGlTZWxlY3QgPSBhbGxvd3NNdWx0aVNlbGVjdDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0QWN0aW9uV2l0aERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdEFjdGlvbldpdGhEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJjZTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0QWN0aW9uV2l0aERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWN0aW9uV2l0aERlbGVnYXRlIGV4dGVuZHMgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0JcHJvdGVjdGVkIElBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIEVkaXRNb2R1bGVEZXBlbmRlbmN5QWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RBY3Rpb25XaXRoRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCIiKTsvLyROT04tTkxTLTEkCi0JCWluaXRMYWJlbCgpOwotCQlpbml0RGVsZWdhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUFjdGlvbkRlbGVnYXRlIGNyZWF0ZURlbGVnYXRlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExhYmVsKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVsZWdhdGUoKSB7Ci0JCWRlbGVnYXRlID0gY3JlYXRlRGVsZWdhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TGFiZWwoKSB7Ci0JCXNldFRleHQoZ2V0TGFiZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlkZWxlZ2F0ZS5ydW4odGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGlzIGFjdGlvbiBpbiByZXNwb25zZSB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucwotCSAqIDxjb2RlPnRydWU8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdG8gcmVhY3QgdG8gc2VsZWN0aW9uIGNoYW5nZXM7IGhvd2V2ZXIsIGlmIHRoZQotCSAqIHN1cGVyIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIG92ZXJyaWRpbmcgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc2VsZWN0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWN0aW9uIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIHNlbGVjdGlvbik7Ci0JCXJldHVybiB0aGlzLmlzRW5hYmxlZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWE5MTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLS8qKgotICogQWN0aW9uIGZvciBvcGVuaW5nIGEgSjJFRSByZXNvdXJjZSBmcm9tIHRoZSBKMkVFIG5hdmlnYXRvci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3BlbkFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlMiB7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJRWRpdG9yRGVzY3JpcHRvciBjdXJyZW50RGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgT2JqZWN0IHNyY09iamVjdDsKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9wZW5BY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBmaW5kRWRpdG9yRGVzY3JpcHRvcihTdHJpbmcgaWQpIHsKLQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQlyZXR1cm4gcmVnaXN0cnkuZmluZEVkaXRvcihpZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QXR0cmlidXRlc0Zyb21EZXNjcmlwdG9yKCkgewotCQlpZiAoY3VycmVudERlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc2V0VGV4dChjdXJyZW50RGVzY3JpcHRvci5nZXRMYWJlbCgpKTsKLQkJc2V0VG9vbFRpcFRleHQoY3VycmVudERlc2NyaXB0b3IuZ2V0TGFiZWwoKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihjdXJyZW50RGVzY3JpcHRvci5nZXRJbWFnZURlc2NyaXB0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2guIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0JICogdG8gcmVhY3QgdG8gdGhlIGNoYW5nZS4gUmV0dXJucyB0cnVlIGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgc2VsZWN0aW9uLCBhbmQKLQkgKiBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogV2hlbiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCB0aGUgc3VwZXIgbWV0aG9kIG11c3QgYWx3YXlzIGJlIGludm9rZWQuIElmIHRoZSBzdXBlciBtZXRob2QKLQkgKiByZXR1cm5zIGZhbHNlLCB0aGlzIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWwKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RydWN0dXJlZCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gcykgewotCQlzcmNPYmplY3QgPSBudWxsOwotCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAocy5zaXplKCkgIT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EaXNwb3NlCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQkvL2luaXQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW5XaXRoRXZlbnQoZXZlbnQpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJ1bigpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBUT0RPIEhBQ0shCi0JCXVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxYjZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5Xb3JrYmVuY2hBY3Rpdml0eUhlbHBlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiB7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJV29ya2JlbmNoIGZXb3JrYmVuY2g7Ci0KLQlwcml2YXRlIENsYXNzW10gZkFjdGl2YXRlZE9uVHlwZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkFjY2VwdEVtcHR5U2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3BlbldpemFyZEFjdGlvbigpIHsKLQkJLy9EZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0JcHVibGljIEFic3RyYWN0T3BlbldpemFyZEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBDbGFzc1tdIGFjdGl2YXRlZE9uVHlwZXMsIGJvb2xlYW4gYWNjZXB0RW1wdHlTZWxlY3Rpb24pIHsKLQkJc3VwZXIobGFiZWwpOwotCQlmV29ya2JlbmNoID0gd29ya2JlbmNoOwotCQlmQWN0aXZhdGVkT25UeXBlcyA9IGFjdGl2YXRlZE9uVHlwZXM7Ci0JCWZBY2NlcHRFbXB0eVNlbGVjdGlvbiA9IGFjY2VwdEVtcHR5U2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBhY2NlcHRFbXB0eVNlbGVjdGlvbikgewotCQl0aGlzKHdvcmtiZW5jaCwgbGFiZWwsIG51bGwsIGFjY2VwdEVtcHR5U2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BY3Rpb25CZUFkZGVkKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmQWNjZXB0RW1wdHlTZWxlY3Rpb247Ci0JCX0KLQkJaWYgKGZBY3RpdmF0ZWRPblR5cGVzICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCXJldHVybiBpc0VuYWJsZWQoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHNwZWNpZmljIFdpemFyZCAodG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcykKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgV2l6YXJkIGNyZWF0ZVdpemFyZCgpOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBmV29ya2JlbmNoOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoSXRlcmF0b3IgaXRlcikgewotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmICghaXNPZkFjY2VwdGVkVHlwZShvYmopIHx8ICFzaG91bGRBY2NlcHRFbGVtZW50KG9iaikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzT2ZBY2NlcHRlZFR5cGUoT2JqZWN0IG9iaikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZBY3RpdmF0ZWRPblR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkFjdGl2YXRlZE9uVHlwZXNbaV0uaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nVGV4dCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19MQkwpOwotCX0KLQotCS8qKgotCSAqIFRoZSB1c2VyIGhhcyBpbnZva2VkIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJV2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwotCQlpZiAod2l6YXJkIGluc3RhbmNlb2YgSVdvcmtiZW5jaFdpemFyZCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbnVsbDsKLQkJCWlmIChudWxsICE9IGdldEN1cnJlbnRTZWxlY3Rpb24oKSkKLQkJCQlzZWwgPSBnZXRDdXJyZW50U2VsZWN0aW9uKCk7Ci0JCQllbHNlCi0JCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJCSgoSVdvcmtiZW5jaFdpemFyZCkgd2l6YXJkKS5pbml0KEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCksIHNlbCk7Ci0JCX0KLQkJaWYgKFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmFsbG93VXNlT2YobnVsbCx3aXphcmQpKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0RGlhbG9nVGV4dCgpOwotCQkJaWYgKG51bGwgIT0gdGV4dCkgewotCQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGV4dCk7Ci0JCQl9Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V29ya2JlbmNoKElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCWZXb3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JfQotCi0JLyoqCi0JICogY2FuIGJlIG92ZXJyaWRkZW4gdG8gYWRkIG1vcmUgY2hlY2tzIG9iaiBpcyBndWFyYW50ZWVkIHRvIGJlIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgYWNjZXB0ZWQKLQkgKiB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2VwdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3ZDIyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uKCkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWN0aXZhdGVkT25UeXBlcywgYm9vbGVhbiBhY2NlcHRFbXB0eVNlbGVjdGlvbikgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBudWxsLCBhY2NlcHRFbXB0eVNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGFjY2VwdEVtcHR5U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaCwgbGFiZWwsIG51bGwsIGFjY2VwdEVtcHR5U2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0T3BlbldpemFyZEFjdGlvbiNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZy4KLQkJc2V0V29ya2JlbmNoKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uI2luaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXNldFdvcmtiZW5jaCh3aW5kb3cuZ2V0V29ya2JlbmNoKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3J1bgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZy4gQWN0aW9uIGRvZXNuJ3QgZGVwZW5kIG9uIHNlbGVjdGlvbi4KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQmFzZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQmFzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODgwZTYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX1RJVExFID0gIiEhISFFcnJvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFID0gIiEhQCEhRXJyb3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IGdldFdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXRQbHVnaW5Xb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2hlbGwgc2hlbGwgPSBnZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlpZiAobnVsbCA9PSBzZWxlY3Rpb24pIHsKLQkJCUlTZWxlY3Rpb24gYXV0b3NlbGVjdGlvbiA9IGdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChhdXRvc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkJdGhpcy5zZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGF1dG9zZWxlY3Rpb247Ci0JCX0KLQotCQl0cnkgewotCQkJcHJpbVJ1bihzaGVsbCk7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IG51bGw7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIEVSUk9SX09DQ1VSUkVEX1RJVExFLCBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFLCB0LCAwLCBmYWxzZSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpOwotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9kaXNwb3NlCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQkvL2luaXQKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFTZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bigpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9JSjJFRVVJQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSUoyRUVVSUNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxNDM0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9JSjJFRVVJQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNi8yMDAxIDEyOjIzOjAyIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVVSUNvbnRleHRJZHMgewotCS8vIE5ldyBjcmVhdGlvbiB3aXphcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VBUl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FQVJfTkVXX0VBUl9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VBUl9BRERfTU9EVUxFU19QQUdFID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuTkVXX0VBUl9BRERfTU9EVUxFU19QQUdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FQVJfQ09NUF9QQUdFID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuTkVXX0VBUl9DT01QX1BBR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX05FV19NT0RVTEVfUFJPSkVDVFNfUEFHRSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVBUl9ORVdfTU9EVUxFX1BST0pFQ1RTX1BBR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0FQUENMSUVOVF9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5BUFBDTElFTlRfTkVXX0FQUENMSUVOVF9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VKQl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FSkJfTkVXX0VKQl9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VKQl9XSVpBUkRfUDIgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FSkJfTkVXX0VKQl9XSVpBUkRfUEFHRTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VKQl9XSVpBUkRfUDMgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FSkJfTkVXX0VKQl9XSVpBUkRfUEFHRTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTk5FQ1RPUl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5KQ0FfTkVXSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pBVkFfQ09NUE9ORU5UX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLk5FV19KQVZBX0NPTVBPTkVOVF9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pBVkFfQ0xBU1NfT1BUSU9OX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLk5FV19KQVZBX0NMQVNTX09QVElPTl9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBJbXBvcnQsIGV4cG9ydCB3aXphcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0VBUl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FQVJfSU1QT1JUX0VBUl9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0VBUl9XSVpBUkRfUDIgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FQVJfSU1QT1JUX0VBUl9XSVpBUkRfUEFHRTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0VBUl9XSVpBUkRfUDMgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FQVJfSU1QT1JUX0VBUl9XSVpBUkRfUEFHRTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0FQUENMSUVOVF9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5BUFBDTElFTlRfSU1QT1JUX0FQUENMSUVOVF9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0VKQl9XSVpBUkRfUDEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5FSkJfSU1QT1JUX0VKQl9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1JBUl9XSVpBUkRfUEFHRSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLklNUE9SVF9SQVJfV0laQVJEX1BBR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1VUSUxJVFlfSkFSX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLklNUE9SVF9VVElMSVRZX0pBUl9XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1VUSUxJVFlfSkFSX1dJWkFSRF9QMiA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLklNUE9SVF9VVElMSVRZX0pBUl9XSVpBUkRfUEFHRTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0NMQVNTX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLklNUE9SVF9DTEFTU19XSVpBUkRfUEFHRTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0NMQVNTX1dJWkFSRF9QMiA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLklNUE9SVF9DTEFTU19XSVpBUkRfUEFHRTIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfRUFSX1dJWkFSRF9QMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVBUl9FWFBPUlRfUEFHRTEiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9BUFBDTElFTlRfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuQVBQQ0xJRU5UX0VYUE9SVF9BUFBDTElFTlRfV0laQVJEX1BBR0UxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9FSkJfV0laQVJEX1AxID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRUpCX0VYUE9SVF9QQUdFMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfUkFSX1dJWkFSRF9QQUdFID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuRVhQT1JUX1JBUl9XSVpBUkRfUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGRpYWxvZ3MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFQVRFX0VBUl9ESUFMT0dfMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm5hdm0yMDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVBVEVfTU9EVUxFX0RJQUxPR18xID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubmF2bTIwMTAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX0VBUl9ESUFMT0dfMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm5hdm0zMDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9NT0RVTEVfRElBTE9HXzEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5uYXZtMzAxMCI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydENsYXNzZXNBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydENsYXNzZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjNTY1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9JbXBvcnRDbGFzc2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQ2xhc3Nlc0ltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0Q2xhc3Nlc0FjdGlvbiBleHRlbmRzIFdUUEJhc2VBY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSW1wb3J0X0NsYXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEltcG9ydENsYXNzZXNBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQoTEFCRUwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQmFzZUFjdGlvbiNwcmltUnVuKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCUNsYXNzZXNJbXBvcnRXaXphcmQgd2l6YXJkID0gbmV3IENsYXNzZXNJbXBvcnRXaXphcmQocHJvamVjdCk7Ci0KLQotCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKSk7Ci0KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDU1MCwgNTUwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVsZXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OGY3M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmNvbXBvbmVudGNvcmUudXRpbC5FSkJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVsZXRlLkRlbGV0ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5EZWxldGVFQVJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5EZWxldGVNb2R1bGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFRGVsZXRlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuSjJFRURlbGV0ZVVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5Db21tb25FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuRGVsZXRlUmVzb3VyY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEoyRUVEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0JLy9Vc2VkIGZvciBFQVIgZGVsZXRlCi0JcHJvdGVjdGVkIFNldCByZWZlcmVuY2VkUHJvamVjdHM7Ci0JcHJvdGVjdGVkIExpc3QgcHJvamVjdHM7Ci0JcHJvdGVjdGVkIERlbGV0ZU9wdGlvbnMgb3B0aW9uczsKLQkvLyBhZGRlZCBmb3IgSVJlZmFjdG9yaW5nQWN0aW9uIGJlaGF2aW9yCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0KLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERlbGV0ZU1vZHVsZUFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBKMkVFRGVsZXRlQWN0aW9uKElXb3JrYmVuY2hTaXRlIHNpdGUsIFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihzaXRlKTsKLQkJc2V0VGV4dChERUxFVEUpOwotCQlzaGVsbCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSjJFRURlbGV0ZUFjdGlvbihJV29ya2JlbmNoU2l0ZSBzaXRlLCBJU2VsZWN0aW9uUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc3VwZXIoc2l0ZSk7Ci0JCXNldFRleHQoREVMRVRFKTsKLQkJc2hlbGwgPSBKMkVFVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJcHJvdmlkZXIgPSBuZXdQcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzID0gbnVsbDsKLQkJcHJvamVjdHMgPSBudWxsOwotCQlvcHRpb25zID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNTZWxlY3Rpb25BcHBsaWNhYmxlKCkgJiYgaXNTZWxlY3Rpb25Tb21lSjJFRSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdXBkYXRlKHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25BcHBsaWNhYmxlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCFpc0oyRUVNb2R1bGUobykgJiYgIWlzQXBwbGljYXRpb24obykgJiYgIWlzUHJvamVjdE9ySmF2YVByb2plY3QobykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uU29tZUoyRUUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNKMkVFTW9kdWxlKG8pIHx8IGlzQXBwbGljYXRpb24obykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25BbGxERFJvb3RzKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCFpc0oyRUVNb2R1bGUobykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uQWxsQXBwbGljYXRpb25zKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCFpc0FwcGxpY2F0aW9uKG8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0oyRUVNb2R1bGUoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrYmVuY2hDb21wb25lbnQpIHsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBvOwotCQkJU3RyaW5nIG1vZHVsZVR5cGUgPSBtb2R1bGUuZ2V0Q29tcG9uZW50VHlwZSgpLmdldENvbXBvbmVudFR5cGVJZCgpOwotCQkJLy9UT0RPIG5lZWQgdG8gYWRkIGNvbm5lY3RvciwgYXBwIGNsaWVudCwgZWFyLCBlamIgY2xpZW50Ci0JCQlyZXR1cm4gbW9kdWxlVHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkgfHwgbW9kdWxlVHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSk7Ci0JCX0KLQkJcmV0dXJuIENvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QobywgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYXRpb24oT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgQXBwbGljYXRpb24pIHx8IGlzSjJFRUFwcGxpY2F0aW9uUHJvamVjdChvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Byb2plY3RPckphdmFQcm9qZWN0KE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB8fCAobyBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvamVjdHMoKSB7Ci0JCWlmIChwcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQlwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQotCQkJCQlvID0gKChJSmF2YVByb2plY3QpIG8pLmdldFByb2plY3QoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCXByb2plY3RzLmFkZChvKTsKLQkJCQkJYWRkRUpCQ2xpZW50UHJvamVjdElmTmVjZXNzYXJ5KChJUHJvamVjdCkgbywgcHJvamVjdHMpOwotCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgbzsKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChvYmopOwotCQkJCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2plY3Rfc2hvdWxkX25vdF9iZV9udWxsXzFfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCWFkZEVKQkNsaWVudFByb2plY3RJZk5lY2Vzc2FyeShwcm9qZWN0LCBwcm9qZWN0cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vbi1wcm9qZWN0X2luX3NlbGVjdGlvbl8yX0VYQ18iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGxvY2FsUHJvamVjdHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRUpCQ2xpZW50UHJvamVjdElmTmVjZXNzYXJ5KElQcm9qZWN0IHByb2plY3QsIExpc3QgbG9jYWxQcm9qZWN0cykgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCWlmIChlZGl0ICE9IG51bGwgJiYgZWRpdC5oYXNFSkJDbGllbnRKQVJQcm9qZWN0KCkpCi0JCQlsb2NhbFByb2plY3RzLmFkZChlZGl0LmdldEVKQkNsaWVudEphck1vZHVsZSgpLmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJSjJFRURlbGV0ZURpYWxvZyBkbGcgPSBudWxsOwotCQkJaWYgKGlzU2VsZWN0aW9uQWxsQXBwbGljYXRpb25zKCkpCi0JCQkJZGxnID0gbmV3IERlbGV0ZUVBUkRpYWxvZyhzaGVsbCwgZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkpOwotCQkJZWxzZSBpZiAoaXNTZWxlY3Rpb25BbGxERFJvb3RzKCkpCi0JCQkJZGxnID0gbmV3IERlbGV0ZU1vZHVsZURpYWxvZyhzaGVsbCk7Ci0JCQllbHNlIHsKLQkJCQlpZiAoY29uZmlybVN0YW5kYXJkRGVsZXRlKCkpCi0JCQkJCXJ1blJlc291cmNlRGVsZXRlQWN0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlkbGcub3BlbigpOwotCQkJaWYgKGRsZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCQlvcHRpb25zID0gZGxnLmdldERlbGV0ZU9wdGlvbnMoKTsKLQkJCWlmIChvcHRpb25zICE9IG51bGwpCi0JCQkJb3B0aW9ucy5zZXRTZWxlY3RlZFByb2plY3RzKGdldFByb2plY3RzKCkpOwotCQkJZWxzZQotCQkJCXJldHVybjsKLQkJCWlmICghKGVuc3VyZUVkaXRvcnNTYXZlZCgpICYmIHZhbGlkYXRlU3RhdGUoKSkpCi0JCQkJcmV0dXJuOwotCQkJZGVsZXRlUHJvamVjdHNJZk5lY2Vzc2FyeSgpOwotCQkJZGVsZXRlTWV0YWRhdGFJZk5lY2Vzc2FyeSgpOwotCQkJcHJlc2VudFN0YXR1c0lmTmVjY2Vzc2FyeSgpOwotCQl9IGZpbmFsbHkgewotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlbnN1cmVFZGl0b3JzU2F2ZWQoKSB7Ci0JCXJldHVybiBDb21tb25FZGl0b3JVdGlsaXR5LnByb21wdFRvU2F2ZUFsbERpcnR5RWRpdG9ycygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1TdGFuZGFyZERlbGV0ZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIERFTEVURV9QUk9KRUNUUywgQ1VTVE9NX0RFTEVURV9NSVhfTUFUQ0gpOwotCX0KLQotCXByb3RlY3RlZCBTZXQgZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAocmVmZXJlbmNlZFByb2plY3RzID09IG51bGwpCi0JCQljb21wdXRlUmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCXJldHVybiByZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cwotLy8JCWdldFByb2plY3RzKCk7Ci0vLwkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3RzLmdldChpKTsKLS8vCQkJRUFSTmF0dXJlUnVudGltZSBydW50aW1lID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpOwotLy8JCQlpZiAocnVudGltZSA9PSBudWxsKQotLy8JCQkJY29udGludWU7Ci0vLwkJCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlyZWZlcmVuY2VkUHJvamVjdHMuYWRkQWxsKGVkaXRNb2RlbC5nZXRNb2R1bGVNYXBwZWRQcm9qZWN0cygpKTsKLS8vCQkJfSBmaW5hbGx5IHsKLS8vCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotLy8JcHJvdGVjdGVkIERlbGV0ZU1vZHVsZU9wZXJhdGlvbiBnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKSB7Ci0vLwkJaWYgKGRlbGV0ZU1vZHVsZU9wZXJhdGlvbiA9PSBudWxsKQotLy8JCQlkZWxldGVNb2R1bGVPcGVyYXRpb24gPSBuZXcgRGVsZXRlTW9kdWxlT3BlcmF0aW9uKG9wdGlvbnMpOwotLy8JCXJldHVybiBkZWxldGVNb2R1bGVPcGVyYXRpb247Ci0vLwl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNZXRhZGF0YUlmTmVjZXNzYXJ5KCkgewotCQlpZiAoIXNob3VsZERlbGV0ZU1ldGFEYXRhKCkpCi0JCQlyZXR1cm47Ci0KLS8vCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKSk7Ci0vLwkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIG1vbml0b3JEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJbW9uaXRvckRpYWxvZy5ydW4oZmFsc2UsIGZhbHNlLCBydW5uYWJsZSk7Ci0vLwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vSWdub3JlCi0vLwkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZU1ldGFEYXRhKCkgewotCQlpZiAoZGVsZXRlUHJvamVjdHNGYWlsZWRPckNhbmNlbGxlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCkgewotCQlyZXR1cm4gb3B0aW9ucyAhPSBudWxsICYmIChvcHRpb25zLnNob3VsZERlbGV0ZU1vZHVsZXMoKSB8fCBvcHRpb25zLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVQcm9qZWN0c0ZhaWxlZE9yQ2FuY2VsbGVkKCkgewotCQlpZiAob3B0aW9ucyA9PSBudWxsIHx8ICFvcHRpb25zLnNob3VsZERlbGV0ZVByb2plY3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBkZWxldGVkUHJvamVjdHNFeGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZWRQcm9qZWN0c0V4aXN0KCkgewotCQlMaXN0IGRlbGV0ZWRQcm9qZWN0cyA9IG9wdGlvbnMuZ2V0QWxsUHJvamVjdHNUb0RlbGV0ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGV0ZWRQcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZGVsZXRlZFByb2plY3RzLmdldChpKTsKLQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVQcm9qZWN0c0lmTmVjZXNzYXJ5KCkgewotCQlpZiAob3B0aW9ucy5zaG91bGREZWxldGVQcm9qZWN0cygpKQotCQkJcnVuUmVzb3VyY2VEZWxldGVBY3Rpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5SZXNvdXJjZURlbGV0ZUFjdGlvbigpIHsKLQkJRGVsZXRlUmVzb3VyY2VBY3Rpb24gYWN0aW9uID0gbmV3IERlbGV0ZVJlc291cmNlQWN0aW9uKHNoZWxsKTsKLQkJTGlzdCBsb2NhbFByb2plY3RzID0gbnVsbDsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkKLQkJCWxvY2FsUHJvamVjdHMgPSBnZXRQcm9qZWN0cygpOwotCQllbHNlCi0JCQlsb2NhbFByb2plY3RzID0gb3B0aW9ucy5nZXRBbGxQcm9qZWN0c1RvRGVsZXRlKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbG9jYWxQcm9qZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXAuZXhpc3RzKCkpCi0JCQkJaXQucmVtb3ZlKCk7Ci0JCX0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obG9jYWxQcm9qZWN0cyk7Ci0JCWFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbCk7Ci0JCWFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKElTdGF0dXMuRVJST1IsIERFTEVURV9FUlJPUiwgZSk7Ci0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgREVMRVRFX0VSUk9SLCBERUxFVEVfTk9UX0NPTVBMRVRFRCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGFjdGlvbidzIGVuYWJsZSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSB1c2VkIHNlbGVjdGlvbgotCSAqIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCi0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0oyRUVBcHBsaWNhdGlvblByb2plY3QoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbzsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJaWYgKElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUuZXF1YWxzKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJc2V0RW5hYmxlZChnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNldEVuYWJsZWRGcm9tU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJZWxzZQotCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU3RhdGUoKSB7Ci0JCS8vIFRPRE8gRml4IHZhbGlkYXRlU3RhdGUKLQkJLy8JCWlmICghcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCkpCi0JCS8vCQkJcmV0dXJuIHRydWU7Ci0JCS8vCQkKLQkJLy8JCUlWYWxpZGF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWYWxpZGF0ZUVkaXRMaXN0ZW5lcihudWxsLAotCQkvLyBnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKS5nZXREZWxldGVFZGl0TW9kZWwoKSk7Ci0JCS8vCQlsaXN0ZW5lci5zZXRTaGVsbChzaGVsbCk7Ci0JCS8vCQlyZXR1cm4gbGlzdGVuZXIudmFsaWRhdGVTdGF0ZSgpLmlzT0soKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlc2VudFN0YXR1c0lmTmVjY2Vzc2FyeSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotLy8JCWlmIChkZWxldGVNb2R1bGVPcGVyYXRpb24gIT0gbnVsbCkKLS8vCQkJc3RhdHVzID0gZGVsZXRlTW9kdWxlT3BlcmF0aW9uLmdldFN0YXR1cygpOwotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuOwotCi0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzLCBJU3RhdHVzLkVSUk9SKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlbGV0ZU1vZHVsZUFjdGlvblBvcHVsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlbGV0ZU1vZHVsZUFjdGlvblBvcHVsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjhhYTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVNb2R1bGVBY3Rpb25Qb3B1bGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVEZWxldGVNb2R1bGVBY3Rpb25Qb3B1bGF0b3Igey8vaW1wbGVtZW50cyBXVFBPcGVyYXRpb25EYXRhTW9kZWxVSUNyZWF0b3IgewotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuV1RQT3BlcmF0aW9uRGF0YU1vZGVsVUlDcmVhdG9yI2NyZWF0ZURhdGFNb2RlbChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChTdHJpbmcgZXh0ZW5kZWRPcGVyYXRpb25JZCwgU3RyaW5nIG9wZXJhdGlvbkNsYXNzLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIElXb3JrYmVuY2hTaXRlIHNpdGUpIHsKLQkJLy9UT0RPIGZpeCB1cAotLy8JCUoyRUVEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IEoyRUVEZWxldGVBY3Rpb24oc2l0ZSwgKElTZWxlY3Rpb25Qcm92aWRlcikgbnVsbCk7Ci0vLwkJV1RQT3BlcmF0aW9uRGF0YU1vZGVsIGRhdGFNb2RlbCA9IElBY3Rpb25XVFBPcGVyYXRpb25EYXRhTW9kZWwuY3JlYXRlRGF0YU1vZGVsKGRlbGV0ZUFjdGlvbiwgc2VsZWN0aW9uLCBzaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCksIHNpdGUuZ2V0U2hlbGwoKSk7Ci0vLwkJcmV0dXJuIGRhdGFNb2RlbDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZXBsb3lBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZXBsb3lBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2ZWRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVwbG95QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMzAsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95LkRlcGxveWVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95LkoyRUVEZXBsb3lPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRURlcGxveUFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwudWkuYWN0aW9ucy5CYXNlQWN0aW9uI3ByaW1SdW4ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCi0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJSjJFRURlcGxveU9wZXJhdGlvbiBvcCA9IG5ldyBKMkVFRGVwbG95T3BlcmF0aW9uKHNlbGVjdGlvbi50b0FycmF5KCkpOwotCQkJLy9JUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhvcCk7Ci0JCQkvL0oyRUVEZXBsb3lTdGF0dXNEaWFsb2cgZGlhbG9nID0gbmV3Ci0JCQkvLyBKMkVFRGVwbG95U3RhdHVzRGlhbG9nKHNoZWxsLG9wLmdldE11bHRpU3RhdHVzKCkpOwotCQkJdHJ5IHsKLQkJCQlvcC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJLy9UT0RPIGZpeCB1cCBqb2Igc2NoZWR1bGVyPwotLy8JCQlXVFBPcGVyYXRpb25Kb2JBZGFwdGVyIGpvYkFkYXB0ZXIgPSBuZXcgV1RQT3BlcmF0aW9uSm9iQWRhcHRlcihvcCk7Ci0vLwkJCWpvYkFkYXB0ZXIuc2V0TmFtZShKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSjJFRURlcGxveU9wZXJhdGlvbl9VSV8wIikpOy8vJE5PTi1OTFMtMSQKLS8vCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotLy8JCQlJUHJvZ3Jlc3NTZXJ2aWNlIHByb2dyZXNzU2VydmljZSA9IHdvcmtiZW5jaC5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLS8vCQkJam9iQWRhcHRlci5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotLy8JCQlwcm9ncmVzc1NlcnZpY2Uuc2hvd0luRGlhbG9nKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBqb2JBZGFwdGVyKTsKLS8vCQkJam9iQWRhcHRlci5zY2hlZHVsZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSjJFRURlcGxveUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgYVNlbGVjdGlvbik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2lzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCi0JCXRyeSB7Ci0JCQlEZXBsb3llclJlZ2lzdHJ5IHJlZyA9IERlcGxveWVyUmVnaXN0cnkuaW5zdGFuY2UoKTsKLQotCQkJTGlzdCBtb2R1bGVzID0gRGVwbG95ZXJSZWdpc3RyeS5nZXRTZWxlY3RlZE1vZHVsZXMoc2VsZWN0aW9uLnRvQXJyYXkoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFT2JqZWN0IG1vZHVsZSA9IChFT2JqZWN0KSBtb2R1bGVzLmdldChpKTsKLQkJCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG1vZHVsZSk7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvaikuZ2V0UnVudGltZVRhcmdldCgpOwotCQkJCWlmIChwcm9qID09IG51bGwgfHwgcnVudGltZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJTGlzdCB2aXNpdG9ycyA9IHJlZy5nZXREZXBsb3lNb2R1bGVFeHRlbnNpb25zKG1vZHVsZSwgcnVudGltZSk7Ci0JCQkJaWYgKCF2aXNpdG9ycy5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVwbG95IEFjdGlvbiByZWNvdmVyaW5nIGZyb20gcHJvYmxlbSB2ZXJpZnlpbmcgZW5hYmxlbWVudC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRU1vZHVsZVJlbmFtZUNoYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRU1vZHVsZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDhhYWE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVNb2R1bGVSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFUmVuYW1lVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZW5hbWUuUmVuYW1lT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFTW9kdWxlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0JcHJpdmF0ZSBXb3JrYmVuY2hDb21wb25lbnQgdGFyZ2V0OwotCXByaXZhdGUgYm9vbGVhbiByZW5hbWVEZXBlbmRlbmNpZXM7Ci0KLQlwdWJsaWMgSjJFRU1vZHVsZVJlbmFtZUNoYW5nZShXb3JrYmVuY2hDb21wb25lbnQgdGFyZ2V0LCBTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiByZW5hbWVEZXBlbmRlbmNpZXMpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMucmVuYW1lRGVwZW5kZW5jaWVzID0gcmVuYW1lRGVwZW5kZW5jaWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEoyRUVSZW5hbWVVSUNvbnN0YW50cy5SRU5BTUVfTU9EVUxFUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaXNWYWxpZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKFN0YXR1cy5PS19TVEFUVVMpOwotCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI3BlcmZvcm0ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQl0cnkgewotCi0vLwkJCVJlbmFtZU1vZHVsZU9wZXJhdGlvbiByZW5hbWVPcCA9IG5ldyBSZW5hbWVNb2R1bGVPcGVyYXRpb24oZ2V0UmVuYW1lT3B0aW9ucygpKTsKLS8vCQkJcmVuYW1lT3AucnVuKHBtKTsKLQotCQkJLy9TdHJpbmcgY29udGV4dFJvb3QgPSBnZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQkJLy8gVE9ETyBmaXggdXAgcmVuYW1lIGFuZCBjb250ZXh0IHJvb3Qgb3BlcmF0aW9ucwotCQkJLy9pZiAod2ViTmF0dXJlICE9IG51bGwpIHsKLQkJCQkvL25ldyBVcGRhdGVXZWJDb250ZXh0Um9vdE1ldGFkYXRhT3BlcmF0aW9uKG5ld1RhcmdldCwgd2ViTmF0dXJlLmdldENvbnRleHRSb290KCkpLnJ1bihwbSk7Ci0vLwkJCWlmKGNvbnRleHRSb290LmVxdWFscygiIikgPT0gZmFsc2UpeyAvLyROT04tTkxTLTEkCi0vLwkJCQluZXcgVXBkYXRlV2ViQ29udGV4dFJvb3RNZXRhZGF0YU9wZXJhdGlvbih0YXJnZXQsIGNvbnRleHRSb290KS5ydW4ocG0pOwotLy8JCQl9IGVsc2UgaWYgKEoyRUVOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWUodGFyZ2V0KSA9PSBudWxsKQotLy8JCQkJbmV3IFJlbmFtZVV0aWxpdHlKYXJNZXRhZGF0YU9wZXJhdGlvbih0YXJnZXQsIG5ld1RhcmdldCkucnVuKHBtKTsKLS8vCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLS8vCQkJLy9JZ25vcmUKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vSWdub3JlCi0vLwkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJDb250ZXh0Um9vdCgpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQl0cnl7Ci0JCQlJUHJvamVjdCBwcm9qID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdCh0YXJnZXQpOwotCQkJd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2opOwotICAgICAgIAkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLSAgICAgICAJCQlyZXR1cm4gd2ViRWRpdC5nZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCApCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0JCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFJlbmFtZU9wdGlvbnMgZ2V0UmVuYW1lT3B0aW9ucygpIHsKLQkJUmVuYW1lT3B0aW9ucyBvcHRpb25zID0gbmV3IFJlbmFtZU9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXROZXdOYW1lKHRoaXMubmV3TmFtZSk7Ci0JCW9wdGlvbnMuc2V0U2VsZWN0ZWRQcm9qZWN0cyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRoaXMudGFyZ2V0KSk7Ci0JCS8vIFRPRE8gY2hlY2sgbW9kdWxlIHR5cGUgZm9yIEVBUiB0eXBlCi0JCS8vb3B0aW9ucy5zZXRJc0VBUlJlbmFtZShFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUodGhpcy50YXJnZXQpICE9IG51bGwpOwotCQlvcHRpb25zLnNldFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcyh0aGlzLnJlbmFtZURlcGVuZGVuY2llcyk7Ci0JCW9wdGlvbnMuc2V0UmVuYW1lTW9kdWxlcyh0cnVlKTsKLQkJb3B0aW9ucy5zZXRSZW5hbWVQcm9qZWN0cyhmYWxzZSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2dldE1vZGlmaWVkRWxlbWVudCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI5NThlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkoyRUVSZW5hbWVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFUmVuYW1lVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5SZW5hbWVNb2R1bGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkNvbW1vbkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlbmFtZS5SZW5hbWVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZW5hbWVSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEoyRUVSZW5hbWVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0JLy9Vc2VkIGZvciBFQVIgcmVuYW1lCi0JcHJvdGVjdGVkIFNldCByZWZlcmVuY2VkUHJvamVjdHM7Ci0JcHJvdGVjdGVkIExpc3QgbW9kdWxlczsKLQlwcm90ZWN0ZWQgUmVuYW1lT3B0aW9ucyBvcHRpb25zOwotCS8vIGFkZGVkIGZvciBJUmVmYWN0b3JpbmdBY3Rpb24gYmVoYXZpb3IKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLS8vCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVPcGVyYXRpb24gcmVuYW1lTW9kdWxlT3BlcmF0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVNb2R1bGVBY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgSjJFRVJlbmFtZUFjdGlvbihJV29ya2JlbmNoU2l0ZSBzaXRlLCBTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIoc2l0ZSk7Ci0JCXNldFRleHQoUkVOQU1FKTsKLQkJc2hlbGwgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIEoyRUVSZW5hbWVBY3Rpb24oSVdvcmtiZW5jaFNpdGUgc2l0ZSwgSVNlbGVjdGlvblByb3ZpZGVyIG5ld1Byb3ZpZGVyKSB7Ci0JCXN1cGVyKHNpdGUpOwotCQlzZXRUZXh0KFJFTkFNRSk7Ci0JCXNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlwcm92aWRlciA9IG5ld1Byb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgewotLy8JCWlmIChyZW5hbWVNb2R1bGVPcGVyYXRpb24gIT0gbnVsbCkgewotLy8JCQlyZW5hbWVNb2R1bGVPcGVyYXRpb24ucmVsZWFzZSgpOwotLy8JCQlyZW5hbWVNb2R1bGVPcGVyYXRpb24gPSBudWxsOwotLy8JCX0KLQkJcmVmZXJlbmNlZFByb2plY3RzID0gbnVsbDsKLQkJbW9kdWxlcyA9IG51bGw7Ci0JCW9wdGlvbnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIudXBkYXRlKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiNzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQlzZXRFbmFibGVkRnJvbVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCWVsc2UKLQkJCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkRnJvbVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb24udG9MaXN0KCkuc2l6ZSgpICE9IDEpIHsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RW5hYmxlZChnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNTZWxlY3Rpb25BbGxERFJvb3RzKCkgfHwgaXNTZWxlY3Rpb25BbGxBcHBsaWNhdGlvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkFsbEREUm9vdHMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkvL1RPRE8gY2hlY2sgZm9yIGoyZWUgd29ya2JlbmNoIG1vZHVsZSBzZWxlY3Rpb24KLQkJCWlmICghQ29tbW9uVXRpbC5pc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChvLCBmYWxzZSkgLyomJiAhaXNKMkVFUHJvamVjdChvKSovKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkFsbEFwcGxpY2F0aW9ucygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlJdGVyYXRvciBpdCA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghKG8gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikgJiYgIWlzSjJFRUFwcGxpY2F0aW9uUHJvamVjdChvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2R1bGVzKCkgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKSB7Ci0JCQltb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBudWxsOwotCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCW8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrYmVuY2hDb21wb25lbnQpIHsKLQkJCQkJbW9kdWxlcy5hZGQobyk7Ci0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBvOwotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG9iaik7Ci0JCQkJCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCQkJCVVSSSB1cmkgPSBvYmouZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IG1vZHVsZUNvcmUuZmluZFJlc291cmNlc0J5U291cmNlUGF0aCh1cmkpOwotCQkJCQkJZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCW1vZHVsZSA9IHJlc291cmNlc1tpXS5nZXRDb21wb25lbnQoKTsKLQkJCQkJCQlpZiAobW9kdWxlICE9bnVsbCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2plY3Rfc2hvdWxkX25vdF9iZV9udWxsXzFfRVJST1JfIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vSWdub3JlCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAobW9kdWxlQ29yZSAhPW51bGwpCi0JCQkJCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTm9uLXByb2plY3RfaW5fc2VsZWN0aW9uXzJfRVJST1JfIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgbG9jYWxNb2R1bGVzID0gZ2V0TW9kdWxlcygpOwotCQkJaWYgKGxvY2FsTW9kdWxlcy5zaXplKCkgIT0gMSkKLQkJCQlyZXR1cm47Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgbG9jYWxNb2R1bGVzLmdldCgwKTsKLQkJCUoyRUVSZW5hbWVEaWFsb2cgZGxnID0gbnVsbDsKLQotCQkJLy8gaWYgYWxsIHdlIGFyZSBkb2luZyBpcyByZW5hbWluZyBhbiBFQVIsIGxldCB0aGUgYmFzZSBwbGF0Zm9ybSBkbyBpdAotCQkJaWYgKGlzU2VsZWN0aW9uQWxsQXBwbGljYXRpb25zKCkpIHsKLQkJCQlSZW5hbWVSZXNvdXJjZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVuYW1lUmVzb3VyY2VBY3Rpb24oc2hlbGwpOwotCQkJCWFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZHVsZSkpOwotCQkJCWFjdGlvbi5ydW4oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGNvbnRleHRSb290ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkvL1RPRE8gYWRkIGNvbnRleHQgcm9vdCB0byB0aGUgbW9kdWxlIG1vZGVsCi0JCQkJLy9jb250ZXh0Um9vdCA9IG1vZHVsZS5nZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQkJCWRsZyA9IG5ldyBSZW5hbWVNb2R1bGVEaWFsb2coc2hlbGwsIG1vZHVsZS5nZXROYW1lKCksIGNvbnRleHRSb290KTsKLQkJCQlkbGcub3BlbigpOwotCQkJCWlmIChkbGcuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5DQU5DRUwpCi0JCQkJCXJldHVybjsKLQotCQkJCW9wdGlvbnMgPSBkbGcuZ2V0UmVuYW1lT3B0aW9ucygpOwotCQkJCWlmIChvcHRpb25zICE9IG51bGwpCi0JCQkJCW9wdGlvbnMuc2V0U2VsZWN0ZWRQcm9qZWN0cyhsb2NhbE1vZHVsZXMpOwotCi0JCQkJaWYgKCEoZW5zdXJlRWRpdG9yc1NhdmVkKCkgJiYgdmFsaWRhdGVTdGF0ZSgpKSkKLQkJCQkJcmV0dXJuOwotCQkJCXJlbmFtZVByb2plY3RzSWZOZWNlc3NhcnkoKTsKLQkJCQlyZW5hbWVNZXRhZGF0YUlmTmVjZXNzYXJ5KCk7Ci0JCQkJcHJlc2VudFN0YXR1c0lmTmVjY2Vzc2FyeSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIGVuc3VyZUVkaXRvcnNTYXZlZCgpIHsKLQkJcmV0dXJuIENvbW1vbkVkaXRvclV0aWxpdHkucHJvbXB0VG9TYXZlQWxsRGlydHlFZGl0b3JzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNldCBnZXRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWlmIChyZWZlcmVuY2VkUHJvamVjdHMgPT0gbnVsbCkKLQkJCWNvbXB1dGVSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJcmV0dXJuIHJlZmVyZW5jZWRQcm9qZWN0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlnZXRNb2R1bGVzKCk7Ci0JCXJlZmVyZW5jZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJLy9Xb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgbW9kdWxlcy5nZXQoaSk7Ci0JCQkvL1RPRE8gZml4IHVwIGNvZGUgaGVyZSBmb3IgbW9kdWxlcyBpbnN0ZWFkIG9mIHByb2plY3RzCi0vLwkJCUVBUk5hdHVyZVJ1bnRpbWUgcnVudGltZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLS8vCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLS8vCQkJCWNvbnRpbnVlOwotLy8JCQlFQVJFZGl0TW9kZWwgZWRpdE1vZGVsID0gcnVudGltZS5nZXRFYXJFZGl0TW9kZWxGb3JSZWFkKHRoaXMpOwotLy8JCQl0cnkgewotLy8JCQkJcmVmZXJlbmNlZFByb2plY3RzLmFkZEFsbChlZGl0TW9kZWwuZ2V0TW9kdWxlTWFwcGVkUHJvamVjdHMoKSk7Ci0vLwkJCX0gZmluYWxseSB7Ci0vLwkJCQllZGl0TW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLS8vCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVuYW1lTWV0YWRhdGFJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKCFzaG91bGRSZW5hbWVNZXRhRGF0YSgpKQotCQkJcmV0dXJuOwotLy8JCVJlbmFtZU1vZHVsZU9wZXJhdGlvbiBvcCA9IGdldFJlbmFtZU1vZHVsZU9wZXJhdGlvbigpOwotLy8JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IFdUUFVJUGx1Z2luLmdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKG9wKTsKLS8vCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgbW9uaXRvckRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotLy8KLS8vCQl0cnkgewotLy8JCQltb25pdG9yRGlhbG9nLnJ1bihmYWxzZSwgZmFsc2UsIHJ1bm5hYmxlKTsKLS8vCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLS8vCQkJaGFuZGxlRXhjZXB0aW9uKGUpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy9JZ25vcmUKLS8vCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmVuYW1lTWV0YURhdGEoKSB7Ci0JCWlmIChyZW5hbWVQcm9qZWN0c0ZhaWxlZE9yQ2FuY2VsbGVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHByaW1TaG91bGRSZW5hbWVNZXRhRGF0YSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbmFtZVByb2plY3RzRmFpbGVkT3JDYW5jZWxsZWQoKSB7Ci0JCWlmIChvcHRpb25zID09IG51bGwgfHwgIW9wdGlvbnMuc2hvdWxkUmVuYW1lUHJvamVjdHMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHJlbmFtZWRQcm9qZWN0c0V4aXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVuYW1lZFByb2plY3RzRXhpc3QoKSB7Ci0JCUxpc3QgcmVuYW1lZFByb2plY3RzID0gb3B0aW9ucy5nZXRBbGxQcm9qZWN0c1RvUmVuYW1lKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVuYW1lZFByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZW5hbWVkUHJvamVjdHMuZ2V0KGkpOwotCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbmFtZVByb2plY3RzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChvcHRpb25zID09IG51bGwgfHwgIW9wdGlvbnMuc2hvdWxkUmVuYW1lUHJvamVjdHMoKSkKLQkJCXJldHVybjsKLQkJSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uIGFjdGlvbiA9IG5ldyBKMkVFUmVuYW1lUmVzb3VyY2VBY3Rpb24oc2hlbGwpOwotCQlhY3Rpb24uc2V0TmV3TmFtZShvcHRpb25zLmdldE5ld05hbWUoKSk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9wdGlvbnMuZ2V0QWxsUHJvamVjdHNUb1JlbmFtZSgpKTsKLQkJYWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsKTsKLQkJYWN0aW9uLnJ1bigpOwotCi0JCS8vIG9ubHkgd2ViIHByb2plY3RzIHNob3VsZCBoYXZlIGEgY29udGV4dCByb290Ci0JCVN0cmluZyBuZXdDb250ZXh0Um9vdCA9IG9wdGlvbnMuZ2V0TmV3Q29udGV4dFJvb3QoKTsKLQkJaWYgKG5ld0NvbnRleHRSb290ICE9IG51bGwgJiYgb3B0aW9ucy5zaG91bGRSZW5hbWVQcm9qZWN0cygpKSB7Ci0JCQkvL1dvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBnZXRNb2R1bGVzKCkuZ2V0KDApOwotCQkJdHJ5IHsKLQkJCQkvLyBUT0RPIGFkZCBzZXJ2ZXIgY29udGV4dCByb290IHRvIHRoZSBtb2R1bGUgbW9kZWwKLQkJCQkvL21vZHVsZS5zZXRTZXJ2ZXJDb250ZXh0Um9vdChuZXdDb250ZXh0Um9vdCk7CQkgICAgICAgICAgICAgICAJCQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhJU3RhdHVzLkVSUk9SLCBSRU5BTUVfRVJST1IsIGUpOwotCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIFJFTkFNRV9FUlJPUiwgUkVOQU1FX05PVF9DT01QTEVURUQsIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBhY3Rpb24ncyBlbmFibGUgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiB0aGUgdXNlZCBzZWxlY3Rpb24KLQkgKiBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlzdXBlci51cGRhdGUoc2VsZWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSjJFRUFwcGxpY2F0aW9uUHJvamVjdChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBvOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkJaWYgKElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUuZXF1YWxzKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTdGF0ZSgpIHsKLQkJaWYgKCFwcmltU2hvdWxkUmVuYW1lTWV0YURhdGEoKSkKLQkJCXJldHVybiB0cnVlOwotCi0vLwkJSVZhbGlkYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZhbGlkYXRlRWRpdExpc3RlbmVyKG51bGwsIGdldFJlbmFtZU1vZHVsZU9wZXJhdGlvbigpLmdldFJlbmFtZUVkaXRNb2RlbCgpKTsKLS8vCQlsaXN0ZW5lci5zZXRTaGVsbChzaGVsbCk7Ci0vLwkJcmV0dXJuIGxpc3RlbmVyLnZhbGlkYXRlU3RhdGUoKS5pc09LKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltU2hvdWxkUmVuYW1lTWV0YURhdGEoKSB7Ci0JCXJldHVybiBvcHRpb25zICE9IG51bGwgJiYgKG9wdGlvbnMuc2hvdWxkUmVuYW1lTW9kdWxlcygpIHx8IG9wdGlvbnMuc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCkpOwotCX0KLQotLy8JcHJvdGVjdGVkIFJlbmFtZU1vZHVsZU9wZXJhdGlvbiBnZXRSZW5hbWVNb2R1bGVPcGVyYXRpb24oKSB7Ci0vLwkJaWYgKHJlbmFtZU1vZHVsZU9wZXJhdGlvbiA9PSBudWxsKSB7Ci0vLwkJCXJlbmFtZU1vZHVsZU9wZXJhdGlvbiA9IG5ldyBSZW5hbWVNb2R1bGVPcGVyYXRpb24ob3B0aW9ucyk7Ci0vLwkJfQotLy8JCXJldHVybiByZW5hbWVNb2R1bGVPcGVyYXRpb247Ci0vLwl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVzZW50U3RhdHVzSWZOZWNjZXNzYXJ5KCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0KLS8vCQlpZiAocmVuYW1lTW9kdWxlT3BlcmF0aW9uICE9IG51bGwpIHsKLS8vCQkJc3RhdHVzID0gcmVuYW1lTW9kdWxlT3BlcmF0aW9uLmdldFN0YXR1cygpOwotLy8JCX0KLQotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybjsKLQotCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIG51bGwsIG51bGwsIHN0YXR1cywgSVN0YXR1cy5FUlJPUik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZmZjZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkoyRUVSZW5hbWVVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgQWRhcHRhYmlsaXR5VXRpbGl0eS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQUk9KRUNUX0NMQVNTKTsKLQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQotLy8JCQlpZiAoSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwcm9qZWN0KSAhPSBudWxsKQotLy8JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCS8vVE9ETyBzd2l0Y2ggdG8gdXNlIGNvbXBvbmVudHMgYW5kIGNvbXBvbmVudCByZWZlcmVuY2VzCi0JCQkvLyBvbmx5IHJldHVybiB0cnVlIGZvciB1dGlsaXR5IGphciBwcm9qZWN0cwotLy8JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLS8vCQkJRUFSRWRpdE1vZGVsIG1vZGVsID0gbnVsbDsKLS8vCQkJVXRpbGl0eUpBUk1hcHBpbmcgbWFwcGluZyA9IG51bGw7Ci0vLwkJCUlQcm9qZWN0W10gYWxsUHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCUVBUk5hdHVyZVJ1bnRpbWUgZWFyTmF0dXJlID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGFsbFByb2plY3RzW2ldKTsKLS8vCQkJCWlmIChlYXJOYXR1cmUgIT0gbnVsbCkgewotLy8JCQkJCXRyeSB7Ci0vLwkJCQkJCW1vZGVsID0gZWFyTmF0dXJlLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCQkJCW1hcHBpbmcgPSBtb2RlbC5nZXRVdGlsaXR5SkFSTWFwcGluZyhwcm9qZWN0KTsKLS8vCi0vLwkJCQkJCWlmIChtYXBwaW5nICE9IG51bGwpCi0vLwkJCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCi0vLwkJCQkJfSBmaW5hbGx5IHsKLS8vCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLS8vCQkJCQkJCW1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0vLwkJCQkJCQltb2RlbCA9IG51bGw7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gdGFyZ2V0RWxlbWVudHMgPSBnZXRQcm9jZXNzb3IoKS5nZXRFbGVtZW50cygpOwotCQlpZiAodGFyZ2V0RWxlbWVudHMgPT0gbnVsbCB8fCB0YXJnZXRFbGVtZW50cy5sZW5ndGggIT0gMSkKLQkJCXJldHVybiBudWxsOwotCQkvL0lQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXRFbGVtZW50c1swXSwgSVBST0pFQ1RfQ0xBU1MpOwotCQkvLyBUT0RPIHN3aXRjaCB0byBiZSBtb2R1bGUgYmFzZWQsIG5vdCBwcm9qZWN0IGJhc2VkCi0JCS8vaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJLy8JcmV0dXJuIG5ldyBKMkVFTW9kdWxlUmVuYW1lQ2hhbmdlKHByb2plY3QsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSwgZ2V0QXJndW1lbnRzKCkuZ2V0VXBkYXRlUmVmZXJlbmNlcygpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKMkVFUmVuYW1lVUlDb25zdGFudHMuUkVOQU1FOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGUoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjdlMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJlbmFtZVJlc291cmNlQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uIGV4dGVuZHMgUmVuYW1lUmVzb3VyY2VBY3Rpb24gewotCVN0cmluZyBuZXdOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uLiBVc2luZyB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5IHdpbGwgcmVuYW1lIHVzaW5nIGEgZGlhbG9nIChpZgotCSAqIG5lY2Vzc2FyeSkgcmF0aGVyIHRoYW4gdGhlIGlubGluZSBlZGl0b3Igb2YgYSBSZXNvdXJjZU5hdmlnYXRvci4gTm90ZSB0aGF0IGEgcmVuYW1lIGhhcHBlbnMKLQkgKiBvbiBvbmUgYW5kIG9ubHkgb25lIHJlc291cmNlIGF0IGEgdGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBzaGVsbCBmb3IgYW55IGRpYWxvZ3MKLQkgKi8KLQlwdWJsaWMgSjJFRVJlbmFtZVJlc291cmNlQWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKHNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5ldyBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSB0YXJnZXQgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBxdWVyeU5ld1Jlc291cmNlTmFtZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIHJldFZhbCA9IG51bGw7Ci0KLQkJaWYgKG5ld05hbWUgPT0gbnVsbCB8fCBuZXdOYW1lLmxlbmd0aCgpIDwgMSkgewotCQkJcmV0VmFsID0gc3VwZXIucXVlcnlOZXdSZXNvdXJjZU5hbWUocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJcmV0VmFsID0gbmV3TmFtZTsKLQkJfQotCi0JCXJldHVybiByZXRWYWw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3TmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5ld05hbWUoKSB7Ci0JCXJldHVybiBuZXdOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5ld05hbWUuCi0JICogCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXdOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVzb3VyY2VPcGVuTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZXNvdXJjZU9wZW5MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWZjYzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZXNvdXJjZU9wZW5MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklPcGVuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5PcGVuRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZXNvdXJjZU9wZW5MaXN0ZW5lciBpbXBsZW1lbnRzIElPcGVuTGlzdGVuZXJ7Ci0KLQkgcHJpdmF0ZSBPcGVuSjJFRVJlc291cmNlQWN0aW9uIGFjdGlvbjsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklPcGVuTGlzdGVuZXIjb3BlbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLk9wZW5FdmVudCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBvcGVuKE9wZW5FdmVudCBhbkV2ZW50KSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gYW5FdmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCSAgIAotCQkgICAgaWYgKGdldEFjdGlvbigpLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKSkKLQkJICAgIAlhY3Rpb24ucnVuKCk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiBnZXRBY3Rpb24oKSB7Ci0JCWlmIChhY3Rpb24gPT0gbnVsbCkgCi0JCQlhY3Rpb24gPSBuZXcgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbigpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdBcHBDbGllbnRDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwNTU5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdBcHBDbGllbnRDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi1wdWJsaWMgY2xhc3MgTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uIHsKLQotCS8vIFRPRE8gTURFIDAyLTI4IEZpbmQgY29ycmVjdCBsYWJlbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld0FwcGxDbGllbnRNb2R1bGVBY3Rpb25fVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAibmV3X2FwcGNsaWVudHByb2plY3Rfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbigpIHsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHVibGljIE5ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBDbGFzc1tdIGFjY2VwdGVkVHlwZXMpIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgYWNjZXB0ZWRUeXBlcywgZmFsc2UpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXByb3RlY3RlZCBXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWNjZXB0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOyAvKiBOZXdHcm91cC5pc09uQnVpbGRQYXRoKG9iaikgJiYgIU5ld0dyb3VwLmlzSW5BcmNoaXZlKG9iaik7ICovCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3RUFSQ29tcG9uZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdFQVJDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlNzQwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdFQVJDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdFQVJDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24gewotCS8vIFRPRE8gTURFIDAyLTI4IEZpbmQgY29ycmVjdCBsYWJlbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld0VBUk1vZHVsZUFjdGlvbl9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJuZXdlYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5ld0VBUkNvbXBvbmVudEFjdGlvbigpIHsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHVibGljIE5ld0VBUkNvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBDbGFzc1tdIGFjY2VwdGVkVHlwZXMpIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgYWNjZXB0ZWRUeXBlcywgZmFsc2UpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXByb3RlY3RlZCBXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWNjZXB0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOyAvKiBOZXdHcm91cC5pc09uQnVpbGRQYXRoKG9iaikgJiYgIU5ld0dyb3VwLmlzSW5BcmNoaXZlKG9iaik7ICovCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvT3BlbkoyRUVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvT3BlbkoyRUVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGNjMTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KMkVFUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uY29tcG9uZW50Y29yZS51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuY29tcG9uZW50Y29yZS51dGlsLkVKQkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBBY3Rpb24gZm9yIG9wZW5pbmcgYSBKMkVFIHJlc291cmNlIGZyb20gdGhlIEoyRUUgbmF2aWdhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlbkFjdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwudWkuYWN0aW9ucy5PcGVuSjJFRVJlc291cmNlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5qYXZhLkVudGVycHJpc2VCZWFuSmF2YUVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0pBVkFfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmpkdC51aS5Db21waWxhdGlvblVuaXRFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBqYXZhRWRpdG9yRGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICovCi0JcHVibGljIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCXN1cGVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGlvbiBJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBnZXRKYXZhRWRpdG9yRGVzY3JpcHRvcigpIHsKLQkJaWYgKGphdmFFZGl0b3JEZXNjcmlwdG9yID09IG51bGwpCi0JCQlqYXZhRWRpdG9yRGVzY3JpcHRvciA9IGZpbmRFZGl0b3JEZXNjcmlwdG9yKEpBVkFfRURJVE9SX0lEKTsKLQkJcmV0dXJuIGphdmFFZGl0b3JEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgZ2V0QmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yKCkgewotCQlpZiAoYmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yID09IG51bGwpCi0JCQliYXNlSmF2YUVkaXRvckRlc2NyaXB0b3IgPSBmaW5kRWRpdG9yRGVzY3JpcHRvcihCQVNFX0pBVkFfRURJVE9SX0lEKTsKLQkJcmV0dXJuIGJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcjsKLQl9Ci0JCi0JLyoqCi0JICogb3BlbiB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFwcHJvcHJpYXRlRWRpdG9yKElSZXNvdXJjZSByKSB7Ci0JCWlmIChyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQl0cnkgewotCQkJcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJZWRpdG9yID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSByKSwgY3VycmVudERlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkKLQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIGVkaXRvcikuc2VsZWN0UmV2ZWFsKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJQcm9ibGVtc19PcGVuaW5nX0VkaXRvcl9FUlJPUl8iKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkID0gIlByb2JsZW1zIE9wZW5pbmcgRWRpdG9yIgotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSB1c2VyIGhhcyBpbnZva2VkIHRoaXMgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWlzRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgewotCQkJKChKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIHNyY09iamVjdCkub3BlbkluRWRpdG9yKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3Qgcm8gPSAoRU9iamVjdCkgc3JjT2JqZWN0OwotCQkJSVByb2plY3QgcCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChybyk7Ci0JCQlpZiAocm8gaW5zdGFuY2VvZiBCZWFuTGluaykgewotCQkJCW9wZW5CZWFuTGlua0luSmF2YUVkaXRvcigoQmVhbkxpbmspIHJvLCBwKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdClzcmNPYmplY3QpKTsKLQkJfQotCQllbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZSkKLQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChSZXNvdXJjZSlzcmNPYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RydWN0dXJlZCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLQkgKiB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZAotCSAqIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4gSWYgdGhlIHN1cGVyIG1ldGhvZAotCSAqIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuCi0JICogCi0JICogQHBhcmFtIHNlbCB0aGUgbmV3IHN0cnVjdHVyZWQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsKLQkJaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24ocykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoaXMgaXMgb25lIG9mIHRoZSBzZWxlY3Rpb25zIHdlIGNhbiBoYW5kbGUsCi0JCS8vIHRoZW4gc2V0IHRoZSBzb3VyY2Ugb2JqZWN0IGFzIGlzLiBUaGUgcnVuKCkgd2lsbCBkbyB0aGUgaGFyZCBzdHVmZi4KLQkJT2JqZWN0IG9iaiA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQlpZiAob2JqIGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJY3VycmVudERlc2NyaXB0b3IgPSBnZXRKYXZhRWRpdG9yRGVzY3JpcHRvcigpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCZWFuTGluaykKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gZ2V0QmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yKCk7CQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdClvYmopLmdldE5hbWUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChSZXNvdXJjZSlvYmopLmdldE5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljdXJyZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJc2V0QXR0cmlidXRlc0Zyb21EZXNjcmlwdG9yKCk7Ci0JCXNyY09iamVjdCA9IG9iajsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5CZWFuTGlua0luSmF2YUVkaXRvcihCZWFuTGluayBsaW5rLCBJUHJvamVjdCBwKSB7Ci0JCVN0cmluZyBsaW5rTmFtZSA9IG51bGw7Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50VXRpbGl0aWVzLmZpbmRDb21wb25lbnQobGluayk7Ci0JCS8vIEhhbmRsZSBFSkIgTGluayBjYXNlCi0JCWlmIChsaW5rIGluc3RhbmNlb2YgRUpCTGluaykgewotCQkJbGlua05hbWUgPSAoKEVKQkxpbmspIGxpbmspLmdldEVqYkxpbmsoKTsKLQkJCUVKQkFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlhcnRpZmFjdEVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJCQlFSkJKYXIgZWpiSmFyID0gYXJ0aWZhY3RFZGl0LmdldEVKQkphcigpOwotCQkJCWlmIChlamJKYXIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChsaW5rTmFtZSk7Ci0JCQkJaWYgKGJlYW4gPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCWphdmFDbGFzcyA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGFydGlmYWN0RWRpdCE9bnVsbCkKLQkJCQkJYXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQkvLyBIYW5kbGUgU2VydmxldCBMaW5rIGNhc2UKLQkJZWxzZSB7Ci0JCQlsaW5rTmFtZSA9ICgoU2VydmxldExpbmspIGxpbmspLmdldFNlcnZsZXRMaW5rKCk7Ci0JCQlXZWJBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCQkJV2ViQXBwIHdlYkFwcCA9IGFydGlmYWN0RWRpdC5nZXRXZWJBcHAoKTsKLQkJCWlmICh3ZWJBcHAgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlTZXJ2bGV0IHNlcnZsZXQgPSB3ZWJBcHAuZ2V0U2VydmxldE5hbWVkKGxpbmtOYW1lKTsKLQkJCWlmIChzZXJ2bGV0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJamF2YUNsYXNzID0gc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGFydGlmYWN0RWRpdCE9bnVsbCkKLQkJCQkJYXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQkvLyBPcGVuIGphdmEgZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBvYmplY3RzIGFzc29jaWF0ZWQgamF2YSBmaWxlCi0JCXRyeSB7Ci0JCQlKMkVFRWRpdG9yVXRpbGl0eS5vcGVuSW5FZGl0b3IoamF2YUNsYXNzLCBwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNhbnRPcGVuKSB7Ci0JCQljYW50T3Blbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGdldFJvb3RPYmplY3QoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCByZWZPYmogPSAoRU9iamVjdCkgb2JqOwotCQkJd2hpbGUgKHJlZk9iaiAhPSBudWxsICYmIHJlZk9iai5lQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQlyZWZPYmogPSByZWZPYmouZUNvbnRhaW5lcigpOwotCQkJcmV0dXJuIHJlZk9iajsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV1RQQmFzZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV1RQQmFzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBkY2NlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL1dUUEJhc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdWwgNywgMjAwNAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXVFBCYXNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlMiB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX09DQ1VSUkVEX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVSUk9SX09DQ1VSUkVEX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVJST1JfT0NDVVJSRURfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFIik7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgZ2V0V29ya2JlbmNoV2luZG93KCkgewotCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldFBsdWdpbldvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTaGVsbCBzaGVsbCA9IGdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCWlmIChudWxsID09IHNlbGVjdGlvbikgewotCQkJSVNlbGVjdGlvbiBhdXRvc2VsZWN0aW9uID0gZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGF1dG9zZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQl0aGlzLnNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYXV0b3NlbGVjdGlvbjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlwcmltUnVuKHNoZWxsKTsKLQkJCXRoaXMuc2VsZWN0aW9uID0gbnVsbDsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgRVJST1JfT0NDVVJSRURfVElUTEUsIEVSUk9SX09DQ1VSUkVEX01FU1NBR0UsIHQsIDAsIGZhbHNlKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9kaXNwb3NlCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQkvL2luaXQKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFTZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bigpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxYjkzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLS8qKgotICogQW4gb3BlcmF0aW9uIHdoaWNoIGRlbGVnYXRlcyBpdHMgd29yayB0byBhIHJ1bm5hYmxlIHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtzcGFjZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gewotCXByb3RlY3RlZCBMaXN0IGZSdW5uYWJsZXM7Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJc3VwZXIocnVsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdHMgd29yayB0byB0aGUgZ2l2ZW4gcnVubmFibGUuCi0JICovCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJU2NoZWR1bGluZ1J1bGUgcnVsZSwgTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIocnVsZSk7Ci0JCWZSdW5uYWJsZXMgPSBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3M7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKExpc3QgbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSdW5uYWJsZXMgPSBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdHMgd29yayB0byB0aGUgZ2l2ZW4gcnVubmFibGUuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIHRoZSBydW5uYWJsZSB0byBkZWxlZ2F0ZSB0byB3aGVuIHRoaXMgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkCi0JICovCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBuZXN0ZWRPcCkgewotCQlzdXBlcigpOwotCQlnZXRSdW5uYWJsZXMoKS5hZGQobmVzdGVkT3ApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZFJ1bm5hYmxlKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBuZXN0ZWRPcCkgewotCQlyZXR1cm4gZ2V0UnVubmFibGVzKCkuYWRkKG5lc3RlZE9wKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSBmUnVubmFibGVzLnNpemUoKTsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHNpemUpOy8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUnVubmFibGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSAoSVJ1bm5hYmxlV2l0aFByb2dyZXNzKSBmUnVubmFibGVzLmdldChpKTsKLQkJCW9wLnJ1bihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UnVubmFibGVzKCkgewotCQlpZiAoZlJ1bm5hYmxlcyA9PSBudWxsKQotCQkJZlJ1bm5hYmxlcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCXJldHVybiBmUnVubmFibGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvQXBwQ2xpZW50QXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvQXBwQ2xpZW50QXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MTBmY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0FwcENsaWVudEFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuYWN0aW9uczsKLQotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudEFyY2hpdmVVSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImFwcGNsaWVudGFyY2hpdmV1aSIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0KLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0V4cG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5MzA0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5CYXNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVzY3JpcHRvcigpLmdldFJlc291cmNlU3RyaW5nKCIlY2xpZW50LmV4cG9ydC5hY3Rpb24ubGFiZWxfdWlfIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJhcHBjbGllbnRfZXhwb3J0X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBFeHBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCQlBcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQgd2l6YXJkID0gbmV3IEFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZCgpOwotCQlKMkVFVUlQbHVnaW4gcGx1Z2luID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJd2l6YXJkLmluaXQocGx1Z2luLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0ltcG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvSW1wb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxZThiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvSW1wb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEFwcENsaWVudEFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFwcGxpY2F0aW9uX0NsaWVudF9JbXBvcnRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJhcHBjbGllbnRfaW1wb3J0X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCi0JCUFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkKCk7Ci0KLQkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJd2l6YXJkLmluaXQocGx1Z2luLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0Fic3RyYWN0T3ZlcnJpZGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdE92ZXJyaWRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjU2NGY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0Fic3RyYWN0T3ZlcnJpZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxMDo1NjowOCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kIG92ZXJyaWRhYmxlOwotCXByaXZhdGUgSjJFRUNsaXBib2FyZCBqMmVlQ2xpcGJvYXJkOwotCi0JLyoqCi0JICogQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0T3ZlcnJpZGVDb21tYW5kKEFic3RyYWN0T3ZlcnJpZGVhYmxlQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQuZ2V0TGFiZWwoKSwgY29tbWFuZC5nZXREZXNjcmlwdGlvbigpKTsKLQkJc2V0T3ZlcnJpZGFibGUoY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKSAmJiBvdmVycmlkYWJsZS5kb0NhbkV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gb3ZlcnJpZGFibGUuZG9DYW5VbmRvKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gb3ZlcnJpZGFibGUuZG9HZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXREb21haW4oKSB7Ci0JCXJldHVybiBnZXRPdmVycmlkYWJsZSgpLmdldERvbWFpbigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDExOjE5OjI3IEFNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuY29tbWFuZC5KMkVFQ2xpcGJvYXJkCi0JICovCi0JcHVibGljIEoyRUVDbGlwYm9hcmQgZ2V0SjJlZUNsaXBib2FyZCgpIHsKLQkJcmV0dXJuIGoyZWVDbGlwYm9hcmQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDcvMDEgMTA6NTg6MzMgQU0pCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kIGdldE92ZXJyaWRhYmxlKCkgewotCQlyZXR1cm4gb3ZlcnJpZGFibGU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gZ2V0SjJlZUNsaXBib2FyZCgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDExOjE5OjI3IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdKMmVlQ2xpcGJvYXJkCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5jb21tYW5kLkoyRUVDbGlwYm9hcmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKMmVlQ2xpcGJvYXJkKEoyRUVDbGlwYm9hcmQgbmV3SjJlZUNsaXBib2FyZCkgewotCQlqMmVlQ2xpcGJvYXJkID0gbmV3SjJlZUNsaXBib2FyZDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxMDo1ODozMyBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3ZlcnJpZGFibGUoQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kIG5ld092ZXJyaWRhYmxlKSB7Ci0JCW92ZXJyaWRhYmxlID0gbmV3T3ZlcnJpZGFibGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDbGlwYm9hcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDbGlwYm9hcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExYzQwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ2xpcGJvYXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgSjJFRUNsaXBib2FyZCBleHRlbmRzIEFycmF5TGlzdCB7Ci0JcHJpdmF0ZSBNYXAgYmluZGluZ3M7Ci0JcHJpdmF0ZSBNYXAgZXh0ZW5zaW9uczsKLQotCS8qKgotCSAqIEoyRUVDbGlwYm9hcmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSjJFRUNsaXBib2FyZChDb2xsZWN0aW9uIGRlZmF1bHRDbGlwYm9hcmQpIHsKLQkJc3VwZXIoZGVmYXVsdENsaXBib2FyZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLmFkZEFsbChjKTsKLQkJaWYgKHJlc3VsdCAmJiAoYyBpbnN0YW5jZW9mIEoyRUVDbGlwYm9hcmQpKQotCQkJYWRkQWxsRXh0cmEoKEoyRUVDbGlwYm9hcmQpIGMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEFsbEV4dHJhKEoyRUVDbGlwYm9hcmQgYykgewotCQlnZXRCaW5kaW5ncygpLnB1dEFsbChjLmdldEJpbmRpbmdzKCkpOwotCQlnZXRFeHRlbnNpb25zKCkucHV0QWxsKGMuZ2V0RXh0ZW5zaW9ucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCaW5kaW5nKEVPYmplY3QgYm91bmRPYmplY3QsIEVPYmplY3QgYmluZGluZykgewotCQlnZXRCaW5kaW5ncygpLnB1dChib3VuZE9iamVjdCwgYmluZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZW5zaW9uKEVPYmplY3QgZXh0ZW5kZWRPYmplY3QsIEVPYmplY3QgZXh0ZW5zaW9uKSB7Ci0JCWdldEV4dGVuc2lvbnMoKS5wdXQoZXh0ZW5kZWRPYmplY3QsIGV4dGVuc2lvbik7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0QmluZGluZyhFT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRCaW5kaW5ncygpLmdldChvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldEJpbmRpbmdzKCkgewotCQlpZiAoYmluZGluZ3MgPT0gbnVsbCkKLQkJCWJpbmRpbmdzID0gbmV3IEhhc2hNYXAoMTApOwotCQlyZXR1cm4gYmluZGluZ3M7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0RXh0ZW5zaW9uKEVPYmplY3QgbykgewotCQlyZXR1cm4gKEVPYmplY3QpIGdldEV4dGVuc2lvbnMoKS5nZXQobyk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRFeHRlbnNpb25zKCkgewotCQlpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJZXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKDEwKTsKLQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQmluZGluZ3MoKSB7Ci0JCXJldHVybiBiaW5kaW5ncyAhPSBudWxsICYmICFiaW5kaW5ncy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbnMgIT0gbnVsbCAmJiAhZXh0ZW5zaW9ucy5pc0VtcHR5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb21wb3VuZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb21wb3VuZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxMDNhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29tcG91bmRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMTMvMDEgMTA6Mjc6MTYgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVDb21wb3VuZENvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgewotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSjJFRUNvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEoyRUVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFQ29tcG91bmRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBKMkVFQ29tcG91bmRDb21tYW5kKGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRNZXJnZWRBZmZlY3RlZE9iamVjdHNDb2xsZWN0aW9uKCkgewotCQlKMkVFQ2xpcGJvYXJkIHJlc3VsdCA9IG5ldyBKMkVFQ2xpcGJvYXJkKG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBjb21tYW5kcyA9IGNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGNvbW1hbmRzLmhhc05leHQoKTspIHsKLQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kcy5uZXh0KCk7Ci0JCQlyZXN1bHQuYWRkQWxsKGNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRNZXJnZWRSZXN1bHRDb2xsZWN0aW9uKCkgewotCQlKMkVFQ2xpcGJvYXJkIHJlc3VsdCA9IG5ldyBKMkVFQ2xpcGJvYXJkKG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBjb21tYW5kcyA9IGNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGNvbW1hbmRzLmhhc05leHQoKTspIHsKLQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kcy5uZXh0KCk7Ci0JCQlyZXN1bHQuYWRkQWxsKGNvbW1hbmQuZ2V0UmVzdWx0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllZTJjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQ29weUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRUNvcHlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcm90ZWN0ZWQgRU9iamVjdCBvYmplY3RUb0NvcHk7Ci0JcHJvdGVjdGVkIEVPYmplY3QgYmluZGluZ1RvQ29weTsKLQlwcm90ZWN0ZWQgRU9iamVjdCBleHRlbnNpb25Ub0NvcHk7Ci0JcHJvdGVjdGVkIEoyRUVDbGlwYm9hcmQgcmVzdWx0OwotCXByb3RlY3RlZCBFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbDsKLQotCXB1YmxpYyBKMkVFQ29weUNvbW1hbmQoRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYmluZGluZywgRU9iamVjdCBleHRlbnNpb24sIEV0b29sc0NvcHlVdGlsaXR5IGNvcHlVdGlsaXR5KSB7Ci0JCW9iamVjdFRvQ29weSA9IG9iamVjdDsKLQkJYmluZGluZ1RvQ29weSA9IGJpbmRpbmc7Ci0JCWV4dGVuc2lvblRvQ29weSA9IGV4dGVuc2lvbjsKLQkJY29weVV0aWwgPSBjb3B5VXRpbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgcGVyZm9ybSB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nIGV4ZWN1dGUKLQkgKiB3aGVuIGNhbkV4ZWN1dGUgcmV0dXJucyBmYWxzZSwgb3Igd2hlbiBjYW5FeGVjdXRlIGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUNvcHlHcm91cCBncm91cCA9IG5ldyBDb3B5R3JvdXAoKTsKLQotCQlncm91cC5hZGQob2JqZWN0VG9Db3B5KTsKLQotCQlpZiAoYmluZGluZ1RvQ29weSAhPSBudWxsKQotCQkJZ3JvdXAuYWRkKGJpbmRpbmdUb0NvcHkpOwotCQlpZiAoZXh0ZW5zaW9uVG9Db3B5ICE9IG51bGwpCi0JCQlncm91cC5hZGQoZXh0ZW5zaW9uVG9Db3B5KTsKLQkJY29weVV0aWwuY29weShncm91cCk7Ci0JCUVPYmplY3QgY29weSA9IGNvcHlVdGlsLmdldENvcHkob2JqZWN0VG9Db3B5KTsKLQkJcmVzdWx0ID0gbmV3IEoyRUVDbGlwYm9hcmQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNvcHkpKTsKLQotCQlpZiAoYmluZGluZ1RvQ29weSAhPSBudWxsKQotCQkJcmVzdWx0LmFkZEJpbmRpbmcoY29weSwgY29weVV0aWwuZ2V0Q29weShiaW5kaW5nVG9Db3B5KSk7Ci0JCWlmIChleHRlbnNpb25Ub0NvcHkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hZGRFeHRlbnNpb24oY29weSwgY29weVV0aWwuZ2V0Q29weShleHRlbnNpb25Ub0NvcHkpKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBhZ2FpbiBwZXJmb3JtIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIHJlZG8gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIHJlZG8gYmVmb3JlIHVuZG8gaXMgY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmCi0JICogeW91IGltcGxlbWVudCByZWRvIHRvIGNhbGwgZXhlY3V0ZSB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCB0byBieSB0aGF0Ci0JICogZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvL3JlZG8KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTlkMTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVUlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5Db3B5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzExLzAxIDg6NDU6MjEgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgSjJFRVVJRWRpdGluZ0RvbWFpbiBkb21haW47Ci0JcHJpdmF0ZSBKMkVFQ2xpcGJvYXJkIHJlc3VsdDsKLQlwcml2YXRlIEV0b29sc0NvcHlVdGlsaXR5IGNvcHlVdGlsOwotCi0JcHVibGljIEoyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQoSjJFRVVJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCWRvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgcGVyZm9ybSB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nIGV4ZWN1dGUKLQkgKiB3aGVuIGNhbkV4ZWN1dGUgcmV0dXJucyBmYWxzZSwgb3Igd2hlbiBjYW5FeGVjdXRlIGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjb3B5VXRpbCAhPSBudWxsKQotCQkJcmV0dXJuOwotCQljb3B5VXRpbCA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQlKMkVFQ2xpcGJvYXJkIGNsaXBib2FyZCA9IGRvbWFpbi5nZXRKMkVFQ2xpcGJvYXJkKCk7Ci0JCXJlc3VsdCA9IG5ldyBKMkVFQ2xpcGJvYXJkKG5ldyBBcnJheUxpc3QoMCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsaXBib2FyZC5zaXplKCk7IGkrKykgewotCQkJQ29weUdyb3VwIGdyb3VwID0gbmV3IENvcHlHcm91cCgpOwotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGNsaXBib2FyZC5nZXQoaSk7Ci0JCQlncm91cC5hZGQobyk7Ci0JCQlFT2JqZWN0IGJuZCA9IGNsaXBib2FyZC5nZXRCaW5kaW5nKG8pOwotCQkJaWYgKGJuZCAhPSBudWxsKQotCQkJCWdyb3VwLmFkZChibmQpOwotCQkJRU9iamVjdCBleHQgPSBjbGlwYm9hcmQuZ2V0RXh0ZW5zaW9uKG8pOwotCQkJaWYgKGV4dCAhPSBudWxsKQotCQkJCWdyb3VwLmFkZChleHQpOwotCQkJY29weVV0aWwuY29weShncm91cCk7Ci0JCQlFT2JqZWN0IGNvcHkgPSBjb3B5VXRpbC5nZXRDb3B5KG8pOwotCQkJcmVzdWx0LmFkZChjb3B5KTsKLQkJCWlmIChibmQgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkQmluZGluZyhjb3B5LCBjb3B5VXRpbC5nZXRDb3B5KGJuZCkpOwotCQkJaWYgKGV4dCAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGRFeHRlbnNpb24oY29weSwgY29weVV0aWwuZ2V0Q29weShleHQpKTsKLQkJfQotCQkvL1Jlc2V0IHRoZSB1dGlsIHNvIHJlZG8gd2lsbCBhY3R1YWxsIHJlZG8KLQkJY29weVV0aWwgPSBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGFnYWluIHBlcmZvcm0gdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gcmVkbyB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgcmVkbyBiZWZvcmUgdW5kbyBpcyBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYKLQkgKiB5b3UgaW1wbGVtZW50IHJlZG8gdG8gY2FsbCBleGVjdXRlIHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIHRvIGJ5IHRoYXQKLQkgKiBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlyZXN1bHQgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMWZhM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weVRvQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVV0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQgZXh0ZW5kcyBDb3B5VG9DbGlwYm9hcmRDb21tYW5kIHsKLQkvL1RoZSBjb2xsZWN0aW9uIG9mIHNvdXJjZSBvYmplY3RzLCB3aXRoIGJpbmRpbmdzIGFuZCBleHRlbnNpb25zLCBpZiBhbnkgZXhpc3QKLQlwcm90ZWN0ZWQgSjJFRUNsaXBib2FyZCBleHRlbmRlZFNvdXJjZU9iamVjdHM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb25seVJlZk9iamVjdHMgPSB0cnVlOwotCi0JcHVibGljIEoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoQ29weVRvQ2xpcGJvYXJkQ29tbWFuZCBjbWQpIHsKLQkJc3VwZXIoY21kLmdldERvbWFpbigpLCBjbWQuZ2V0U291cmNlT2JqZWN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb3B5Q29tbWFuZCgpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBKMkVFQ29tcG91bmRDb21tYW5kKENvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZXh0ZW5kZWRTb3VyY2VPYmplY3RzLml0ZXJhdG9yKCk7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IGNvcHlVdGlsID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCEobyBpbnN0YW5jZW9mIEVPYmplY3QpKSB7Ci0JCQkJY21kLmFwcGVuZChVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRU9iamVjdCByID0gKEVPYmplY3QpIG87Ci0JCQkJY21kLmFwcGVuZChuZXcgSjJFRUNvcHlDb21tYW5kKHIsIGV4dGVuZGVkU291cmNlT2JqZWN0cy5nZXRCaW5kaW5nKHIpLCBleHRlbmRlZFNvdXJjZU9iamVjdHMuZ2V0RXh0ZW5zaW9uKHIpLCBjb3B5VXRpbCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbWQudW53cmFwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcHJlcGFyZVNvdXJjZU9iamVjdHMoKTsKLQkJaWYgKCFvbmx5UmVmT2JqZWN0cykgewotCQkJY29weUNvbW1hbmQgPSBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJcmV0dXJuIGNvcHlDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCi0JCWlmICghZXh0ZW5kZWRTb3VyY2VPYmplY3RzLmhhc0JpbmRpbmdzKCkgJiYgIWV4dGVuZGVkU291cmNlT2JqZWN0cy5oYXNFeHRlbnNpb25zKCkpCi0JCQlyZXR1cm4gc3VwZXIucHJlcGFyZSgpOwotCi0JCWNvcHlDb21tYW5kID0gY3JlYXRlQ29weUNvbW1hbmQoKTsKLQkJcmV0dXJuIGNvcHlDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlU291cmNlT2JqZWN0cygpIHsKLQkJZXh0ZW5kZWRTb3VyY2VPYmplY3RzID0gbmV3IEoyRUVDbGlwYm9hcmQoZ2V0U291cmNlT2JqZWN0cygpKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXRTb3VyY2VPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkvLwkJCUVPYmplY3QgciA9IChFT2JqZWN0KSBvOwotCQkJCS8vIFRPRE8gc3dpdGNoIHRvIGFkYXB0YWJsZSBjb21tYW5kcwotCQkJCS8vCQkJRU9iamVjdCBibmQgPSBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEJpbmRpbmcocik7Ci0JCQkJLy8JCQlFT2JqZWN0IGV4dCA9IEJpbmRpbmdBbmRFeHRlbnNpb25IZWxwZXIuZ2V0RXh0ZW5zaW9uKHIpOwotCQkJCS8vCQkJaWYgKGJuZCAhPSBudWxsKQotCQkJCS8vCQkJCWV4dGVuZGVkU291cmNlT2JqZWN0cy5hZGRCaW5kaW5nKHIsIGJuZCk7Ci0JCQkJLy8JCQlpZiAoZXh0ICE9IG51bGwpCi0JCQkJLy8JCQkJZXh0ZW5kZWRTb3VyY2VPYmplY3RzLmFkZEV4dGVuc2lvbihyLCBleHQpOwotCQkJfSBlbHNlIHsKLQkJCQkvL1JpZ2h0IG5vdyB3ZSBjYW4gb25seSBoYW5kbGUgcmVmIG9iamVjdHMgaW4gdGhlIHRyZWUKLQkJCQlvbmx5UmVmT2JqZWN0cyA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNGNjNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlN0cmljdENvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLklEVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVUlFZGl0aW5nRG9tYWluOwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kIGV4dGVuZHMgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCB7Ci0JcHJpdmF0ZSBKMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kIGNvcHlDb21tYW5kOwotCXByaXZhdGUgQ29tbWFuZCBhZGRCaW5kaW5nc0NvbW1hbmQ7Ci0JcHJpdmF0ZSBDb21tYW5kIGFkZEV4dGVuc2lvbnNDb21tYW5kOwotCi0JcHVibGljIEoyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBwKSB7Ci0JCXN1cGVyKHAuZ2V0RG9tYWluKCksIHAuZ2V0T3duZXIoKSwgcC5nZXRGZWF0dXJlKCksIHAuZ2V0SW5kZXgoKSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJc3VwZXIuZG9FeGVjdXRlKCk7Ci0JCWV4ZWN1dGVBZGRCaW5kaW5ncygpOwotCQlleGVjdXRlQWRkRXh0ZW5zaW9ucygpOwotCQlKMkVFQ2xpcGJvYXJkIHJlc3VsdCA9IChKMkVFQ2xpcGJvYXJkKSBkb0dldFJlc3VsdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIHJlc3VsdC5nZXQoaSk7Ci0JCQlpZiAocmVzdWx0LmdldEJpbmRpbmcobykgIT0gbnVsbCB8fCByZXN1bHQuZ2V0RXh0ZW5zaW9uKG8pICE9IG51bGwpCi0JCQkJSURVdGlsaXR5LnNldERlZmF1bHRJRChvLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gY29weUNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZG9HZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBjb3B5Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1JlZG8oKSB7Ci0JCXN1cGVyLmRvUmVkbygpOwotCQlpZiAoYWRkQmluZGluZ3NDb21tYW5kICE9IG51bGwpCi0JCQlhZGRCaW5kaW5nc0NvbW1hbmQucmVkbygpOwotCQlpZiAoYWRkRXh0ZW5zaW9uc0NvbW1hbmQgIT0gbnVsbCkKLQkJCWFkZEV4dGVuc2lvbnNDb21tYW5kLnJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1VuZG8oKSB7Ci0JCXN1cGVyLmRvVW5kbygpOwotCQlpZiAoYWRkQmluZGluZ3NDb21tYW5kICE9IG51bGwpCi0JCQlhZGRCaW5kaW5nc0NvbW1hbmQudW5kbygpOwotCQlpZiAoYWRkRXh0ZW5zaW9uc0NvbW1hbmQgIT0gbnVsbCkKLQkJCWFkZEV4dGVuc2lvbnNDb21tYW5kLnVuZG8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlQWRkQmluZGluZ3MoKSB7Ci0JCWlmIChhZGRCaW5kaW5nc0NvbW1hbmQgIT0gbnVsbCAmJiBhZGRCaW5kaW5nc0NvbW1hbmQuY2FuRXhlY3V0ZSgpKQotCQkJYWRkQmluZGluZ3NDb21tYW5kLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlQWRkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGFkZEV4dGVuc2lvbnNDb21tYW5kICE9IG51bGwgJiYgYWRkRXh0ZW5zaW9uc0NvbW1hbmQuY2FuRXhlY3V0ZSgpKQotCQkJYWRkRXh0ZW5zaW9uc0NvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyBKMkVFQ2xpcGJvYXJkIGdldENvcGllZENsaXBvYXJkKCkgewotCQlyZXR1cm4gKEoyRUVDbGlwYm9hcmQpIGNvcHlDb21tYW5kLmdldFJlc3VsdCgpOwotCX0KLQotCXByb3RlY3RlZCBKMkVFQ2xpcGJvYXJkIGdldEoyRUVDbGlwYm9hcmQoKSB7Ci0JCXJldHVybiAoSjJFRUNsaXBib2FyZCkgZG9tYWluLmdldENsaXBib2FyZCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCWlmIChnZXRKMkVFQ2xpcGJvYXJkKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJY29tbWFuZCA9IG5ldyBTdHJpY3RDb21wb3VuZENvbW1hbmQoKTsKLQotCQljb3B5Q29tbWFuZCA9IG5ldyBKMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kKChKMkVFVUlFZGl0aW5nRG9tYWluKSBkb21haW4pOwotCQljb21tYW5kLmFwcGVuZChjb3B5Q29tbWFuZCk7Ci0KLQkJY29tbWFuZC5hcHBlbmQobmV3IENvbW1hbmRXcmFwcGVyKCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29tbWFuZCgpIHsKLQkJCQlDb21tYW5kIGFkZENvbW1hbmQgPSBBZGRDb21tYW5kLmNyZWF0ZShnZXREb21haW4oKSwgZ2V0T3duZXIoKSwgZ2V0RmVhdHVyZSgpLCBjb3B5Q29tbWFuZC5nZXRSZXN1bHQoKSwgZ2V0SW5kZXgoKSk7Ci0JCQkJcmV0dXJuIGFkZENvbW1hbmQ7Ci0JCQl9Ci0JCX0pOwotCQlwcmVwYXJlQmluZGluZ0NvbW1hbmQoY29weUNvbW1hbmQpOwotCQlwcmVwYXJlRXh0ZW5zaW9uQ29tbWFuZChjb3B5Q29tbWFuZCk7Ci0KLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCWlmIChvcHRpbWl6ZSkgewotCQkJLy8gVGhpcyB3aWxsIGRldGVybWluZSBjYW5FeGVjdXRlIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLgotCQkJLy8KLQkJCXJlc3VsdCA9IG9wdGltaXplZENhbkV4ZWN1dGUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoaXMgd2lsbCBhY3R1YWxseSBleGVjdXRlIHRoZSBjb3B5IGNvbW1hbmQgaW4gb3JkZXIgdG8gY2hlY2sgaWYgdGhlIGFkZCBjYW4gZXhlY3V0ZS4KLQkJCS8vCi0JCQlyZXN1bHQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUJpbmRpbmdDb21tYW5kKGZpbmFsIEoyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQgY21kKSB7Ci0JCWlmICghZ2V0SjJFRUNsaXBib2FyZCgpLmhhc0JpbmRpbmdzKCkpCi0JCQlyZXR1cm47Ci0JCS8vVE9ETyBtYWtlIGFkYXB0YWJsZSBjb21tYW5kCi0JCS8vCWFkZEJpbmRpbmdzQ29tbWFuZCA9IG5ldyBDb21tYW5kV3JhcHBlcigpIHsKLQkJLy8JCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7Ci0JCS8vCQkJT2JqZWN0IGJpbmRpbmdPd25lciA9IEJpbmRpbmdBbmRFeHRlbnNpb25IZWxwZXIuZ2V0QmluZGluZ0FkZE93bmVyKChFT2JqZWN0KWdldE93bmVyKCkpOwotCQkvLwkJCUNvbGxlY3Rpb24gYmluZGluZ3NDb3BpZXMgPSBnZXRDb3BpZWRDbGlwb2FyZCgpLmdldEJpbmRpbmdzKCkudmFsdWVzKCk7Ci0JCS8vCQkJQ29tbWFuZCBhZGRDb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZ2V0RG9tYWluKCksIGJpbmRpbmdPd25lciwgbnVsbCwgYmluZGluZ3NDb3BpZXMsCi0JCS8vIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotCQkvLwkJCXJldHVybiBhZGRDb21tYW5kOwotCQkvLwkJfQotCQkvLwl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVFeHRlbnNpb25Db21tYW5kKGZpbmFsIEoyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQgY21kKSB7Ci0JCWlmICghZ2V0SjJFRUNsaXBib2FyZCgpLmhhc0V4dGVuc2lvbnMoKSkKLQkJCXJldHVybjsKLQkJLy8gVE9ETyBtYWtlIGFkYXB0YWJsZSBjb21tYW5kCi0JCS8vCWFkZEV4dGVuc2lvbnNDb21tYW5kID0gbmV3IENvbW1hbmRXcmFwcGVyKCkgewotCQkvLwkJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29tbWFuZCgpIHsKLQkJLy8JCQlPYmplY3QgZXh0ZW5zaW9uT3duZXIgPQotCQkvLyBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEV4dGVuc2lvbkFkZE93bmVyKChFT2JqZWN0KWdldE93bmVyKCkpOwotCQkvLwkJCUNvbGxlY3Rpb24gZXh0ZW5zaW9uc0NvcGllcyA9IGdldENvcGllZENsaXBvYXJkKCkuZ2V0RXh0ZW5zaW9ucygpLnZhbHVlcygpOwotCQkvLwkJCUNvbW1hbmQgYWRkQ29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGdldERvbWFpbigpLCBleHRlbnNpb25Pd25lciwgbnVsbCwKLQkJLy8gZXh0ZW5zaW9uc0NvcGllcywgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0JCS8vCQkJcmV0dXJuIGFkZENvbW1hbmQ7Ci0JCS8vCQl9Ci0JCS8vCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2MTAzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUmVtb3ZlT3ZlcnJpZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDYvMDcvMDEgMTA6NDQ6MDIgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE92ZXJyaWRlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBSZW1vdmVDb21tYW5kIGJpbmRpbmdzUmVtb3ZlQ29tbWFuZDsKLQlwcml2YXRlIFJlbW92ZUNvbW1hbmQgZXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQ7Ci0JcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCS8qKgotCSAqIEoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZChSZW1vdmVDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbW92ZUNvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXJldHVybiAoUmVtb3ZlQ29tbWFuZCkgUmVtb3ZlQ29tbWFuZC5jcmVhdGUoZ2V0RG9tYWluKCksIGVsZW1lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgcGVyZm9ybSB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nIGV4ZWN1dGUKLQkgKiB3aGVuIGNhbkV4ZWN1dGUgcmV0dXJucyBmYWxzZSwgb3Igd2hlbiBjYW5FeGVjdXRlIGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8qCi0JCSAqIEZvciBlYWNoIG9iamVjdCBiZWluZyByZW1vdmVkLCBjaGVjayBpZiBpdCBoYXMgYSBiaW5kaW5nLCBhbmQgYW4gZXh0ZW5zaW9uIE1ha2UKLQkJICogY29sbGVjdGlvbnMgb2YgdGhlc2UsIG1ha2UgYSBjb21tYW5kIHBhcmFtZXRlciBmb3IgZWFjaCBjb2xsZWN0aW9uLCBhbiBpbnN0YW50aWF0ZSBhCi0JCSAqIHJlbW92ZSBjb21tYW5kCi0JCSAqLwotCi0JCUNvbGxlY3Rpb24gb2JqZWN0cyA9IGdldFJlbW92ZUNvbW1hbmQoKS5nZXRDb2xsZWN0aW9uKCk7Ci0JCUxpc3QgYmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0KG9iamVjdHMuc2l6ZSgpKTsKLQkJTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChvYmplY3RzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGl0ID0gb2JqZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpCi0JCQkJcmVzb3VyY2VTZXQgPSBvLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkvLyBUT0RPIG1ha2UgY29tbWFuZCBhZGFwdGFibGUKLQkJCS8vCQlFT2JqZWN0IGJpbmRpbmcgPSBCaW5kaW5nQW5kRXh0ZW5zaW9uSGVscGVyLmdldEJpbmRpbmcobyk7Ci0JCQkvLwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJLy8JCQliaW5kaW5ncy5hZGQoYmluZGluZyk7Ci0JCQkvLwkJCWdldEoyZWVDbGlwYm9hcmQoKS5hZGRCaW5kaW5nKG8sIGJpbmRpbmcpOwotCQkJLy8JCX0KLQkJCS8vCQlFT2JqZWN0IGV4dGVuc2lvbiA9IEJpbmRpbmdBbmRFeHRlbnNpb25IZWxwZXIuZ2V0RXh0ZW5zaW9uKG8pOwotCQkJLy8JCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJLy8JCQlleHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQkJLy8JCQlnZXRKMmVlQ2xpcGJvYXJkKCkuYWRkRXh0ZW5zaW9uKG8sIGV4dGVuc2lvbik7Ci0JCQkvLwkJfQotCQl9Ci0JCWlmICghYmluZGluZ3MuaXNFbXB0eSgpKQotCQkJc2V0QmluZGluZ3NSZW1vdmVDb21tYW5kKGNyZWF0ZVJlbW92ZUNvbW1hbmQoYmluZGluZ3MpKTsKLQotCQlpZiAoIWV4dGVuc2lvbnMuaXNFbXB0eSgpKQotCQkJc2V0RXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQoY3JlYXRlUmVtb3ZlQ29tbWFuZChleHRlbnNpb25zKSk7Ci0KLQkJZXhlY3V0ZUFsbENoaWxkcmVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUFsbENoaWxkcmVuKCkgewotCQlleGVjdXRlTmVzdGVkKGJpbmRpbmdzUmVtb3ZlQ29tbWFuZCk7Ci0JCWV4ZWN1dGVOZXN0ZWQoZXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQpOwotCQlnZXRPdmVycmlkYWJsZSgpLmRvRXhlY3V0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWQoUmVtb3ZlQ29tbWFuZCBjbWQpIHsKLQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5kb0NhbkV4ZWN1dGUoKSkgewotCQkJY21kLmRvRXhlY3V0ZSgpOwotCQkJLy8JCUNvbGxlY3Rpb24gcmVzdWx0ID0gY21kLmdldFJlc3VsdCgpOwotCQkJLy9UT0RPCi0JCQkvLwkJQmluZGluZ0FuZEV4dGVuc2lvbkhlbHBlci5yZXNvbHZlQWxsUHJveGllcyhyZXN1bHQsIHJlc291cmNlU2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDE6MzI6NDQgUE0pCi0JICogCi0JICogQHJldHVybiBSZW1vdmVDb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIFJlbW92ZUNvbW1hbmQgZ2V0QmluZGluZ3NSZW1vdmVDb21tYW5kKCkgewotCQlyZXR1cm4gYmluZGluZ3NSZW1vdmVDb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDE6MzI6NDQgUE0pCi0JICogCi0JICogQHJldHVybiBSZW1vdmVDb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIFJlbW92ZUNvbW1hbmQgZ2V0RXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBleHRlbnNpb25zUmVtb3ZlQ29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgUmVtb3ZlQ29tbWFuZCBnZXRSZW1vdmVDb21tYW5kKCkgewotCQlyZXR1cm4gKFJlbW92ZUNvbW1hbmQpIGdldE92ZXJyaWRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJc2V0SjJlZUNsaXBib2FyZChuZXcgSjJFRUNsaXBib2FyZChnZXRSZW1vdmVDb21tYW5kKCkuZ2V0Q29sbGVjdGlvbigpKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBhZ2FpbiBwZXJmb3JtIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIHJlZG8gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIHJlZG8gYmVmb3JlIHVuZG8gaXMgY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmCi0JICogeW91IGltcGxlbWVudCByZWRvIHRvIGNhbGwgZXhlY3V0ZSB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCB0byBieSB0aGF0Ci0JICogZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlQWxsQ2hpbGRyZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNi8wNy8wMSAxOjMyOjQ0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdCaW5kaW5nc1JlbW92ZUNvbW1hbmQKLQkgKiAgICAgICAgICAgIFJlbW92ZUNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCaW5kaW5nc1JlbW92ZUNvbW1hbmQoUmVtb3ZlQ29tbWFuZCBuZXdCaW5kaW5nc1JlbW92ZUNvbW1hbmQpIHsKLQkJYmluZGluZ3NSZW1vdmVDb21tYW5kID0gbmV3QmluZGluZ3NSZW1vdmVDb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA2LzA3LzAxIDE6MzI6NDQgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V4dGVuc2lvbnNSZW1vdmVDb21tYW5kCi0JICogICAgICAgICAgICBSZW1vdmVDb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQoUmVtb3ZlQ29tbWFuZCBuZXdFeHRlbnNpb25zUmVtb3ZlQ29tbWFuZCkgewotCQlleHRlbnNpb25zUmVtb3ZlQ29tbWFuZCA9IG5ld0V4dGVuc2lvbnNSZW1vdmVDb21tYW5kOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWdldFJlbW92ZUNvbW1hbmQoKS5kb1VuZG8oKTsKLQkJdW5kb05lc3RlZChiaW5kaW5nc1JlbW92ZUNvbW1hbmQpOwotCQl1bmRvTmVzdGVkKGV4dGVuc2lvbnNSZW1vdmVDb21tYW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bmRvTmVzdGVkKFJlbW92ZUNvbW1hbmQgY21kKSB7Ci0JCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuZG9DYW5VbmRvKCkpCi0JCQljbWQuZG9VbmRvKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkZjgyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5TdHJpY3RDb21wb3VuZENvbW1hbmQ7Ci0KLQotCi0vKioKLSAqIE92ZXJyaWRkZW4gdG8gcHJvdmlkZSBhbiBhY2Nlc3NvciB0byB0aGUgcGVzc2ltaXN0aWMgZmllbGQuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgY2FzZSBvZgotICogdW5kby9yZWRvIHBhc3RlLiBXZSBuZWVkIHRoZSBuZXN0ZWQgY29weSBjb21tbWFuZCBpbiB0aGUgcGFzdGUgY29tbWFuZCB0byByZWRvIGl0c2VsZiB3aGVuIHRoZQotICogcGFzdGUgY29tbWFuZCBpcyBjb3BpZWQsIG90aGVyd2lzZSB3ZSBydW4gaW50byBzZWQgZXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZCBleHRlbmRzIFN0cmljdENvbXBvdW5kQ29tbWFuZCB7Ci0JLyoqCi0JICogSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKMkVFU3RyaWN0Q29tcG91bmRDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQoamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIoY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEoyRUVTdHJpY3RDb21wb3VuZENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSjJFRVN0cmljdENvbXBvdW5kQ29tbWFuZChib29sZWFuIHBlc3NpbWlzdGljKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElzUGVzc2lzbWlzdGljKHBlc3NpbWlzdGljKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc1Blc3Npc21pc3RpYyhib29sZWFuIGFCb29sKSB7Ci0JCWlzUGVzc2ltaXN0aWMgPSBhQm9vbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2UzNjRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSAgewotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10ge0lMYXVuY2hhYmxlLmNsYXNzIH07Ci0JfQotCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwuZ2V0TW9kdWxlT2JqZWN0KG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZU1vZHVsZUFydGlmYWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZU1vZHVsZUFydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDRiN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VNb2R1bGVBcnRpZmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZU1vZHVsZUFydGlmYWN0IGltcGxlbWVudHMgSU1vZHVsZUFydGlmYWN0IHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3QjZ2V0TW9kdWxlKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJTW9kdWxlQXJ0aWZhY3QuY2xhc3MsIElMYXVuY2hhYmxlLmNsYXNzIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSjJFRURlcGxveWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVEZXBsb3lhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkZjE4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSjJFRURlcGxveWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFRGVwbG95YWJsZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0ID0gbnVsbDsKLS8qCQlpZiAoYWRhcHRlclR5cGUgPT0gSU1vZHVsZUFydGlmYWN0LmNsYXNzICkgewotCQkJCi0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmhhc0FkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzLldlYk1vZHVsZUFydGlmYWN0IikpIHsKLQkJCQltb2R1bGVBcnRpZmFjdCA9IChJTW9kdWxlQXJ0aWZhY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmRlcGxveWFibGVzLldlYk1vZHVsZUFydGlmYWN0Iik7Ci0JCQl9Ci0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmhhc0FkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmRlcGxveWFibGVzLklFSkJNb2R1bGVBcnRpZmFjdCIpKSB7Ci0JCQkJbW9kdWxlQXJ0aWZhY3QgPSAoSU1vZHVsZUFydGlmYWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwgIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5JRUpCTW9kdWxlQXJ0aWZhY3QiKTsKLQkJCX0KLQkJCWlmIChtb2R1bGVBcnRpZmFjdCA9PSBudWxsICYmIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuaGFzQWRhcHRlcihhZGFwdGFibGVPYmplY3QsICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QiKSkgewotCQkJCW1vZHVsZUFydGlmYWN0ID0gKElNb2R1bGVBcnRpZmFjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcihhZGFwdGFibGVPYmplY3QsICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QiKTsKLQkJCX0KLQkJCWlmIChtb2R1bGVBcnRpZmFjdCA9PSBudWxsICYmIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuaGFzQWRhcHRlcihhZGFwdGFibGVPYmplY3QsICJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLklTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdCIpKSB7Ci0JCQkJbW9kdWxlQXJ0aWZhY3QgPSAoSU1vZHVsZUFydGlmYWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKGFkYXB0YWJsZU9iamVjdCwgIm9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuSVN0YXRpY1dlYk1vZHVsZUFydGlmYWN0Iik7Ci0JCQl9Ci0JCX0qLwotCQlyZXR1cm4gbW9kdWxlQXJ0aWZhY3Q7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtJTW9kdWxlQXJ0aWZhY3QuY2xhc3MsIElMYXVuY2hhYmxlLmNsYXNzfTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlRUFSQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkZmRkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZWxldGUuRGVsZXRlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVFQVJDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBKMkVFRGVsZXRlVUlDb25zdGFudHMsIExpc3RlbmVyLCBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBEZWxldGVFQVJEaWFsb2cgZGlhbG9nOwotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlQXBwUHJvamVjdHNCdG47Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVSZWZQcm9qZWN0c0J0bjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHJhZGlvQ29tcG9zaXRlOwotCXByb3RlY3RlZCBCdXR0b24gZGV0YWlsc0J0bjsKLQlwcm90ZWN0ZWQgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSBtb2R1bGVSZWZzQ29tcG9zaXRlOwotCXByb3RlY3RlZCBDaGVja2JveFRhYmxlVmlld2VyIHByb2plY3RzTGlzdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0Q3JlYXRlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBNYXAgcmVmZXJlbmNlZFByb2plY3RzOwotCXByb3RlY3RlZCBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERlbGV0ZUVBUkNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIERlbGV0ZUVBUkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBEZWxldGVFQVJEaWFsb2cgZGlhbG9nLCBpbnQgc3R5bGUsIFNldCByZWZlcmVuY2VkUHJvamVjdHMpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMuZGlhbG9nID0gZGlhbG9nOwotCQlpbml0UmVmZXJlbmNlZFByb2plY3RzKHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCWFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZWZlcmVuY2VkIHByb2plY3RzIHdoaWNoIHRoZSB1c2VyIGhhcyBjaG9zZW4gdG8gYWxzbyBkZWxldGUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWlmIChkZWxldGVBcHBQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlqYXZhLnV0aWwuTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRQcm9qZWN0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVsZW1lbnQgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gaXNTZWxlY3RlZCA9ICgoQm9vbGVhbikgZWxlbWVudC5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCWlmIChpc1NlbGVjdGVkKQotCQkJCXJlc3VsdC5hZGQoZWxlbWVudC5nZXRLZXkoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVEZWxldGVEaWFsb2cjY3JlYXRlRGVsZXRlT3B0aW9ucygpCi0JICovCi0JcHVibGljIERlbGV0ZU9wdGlvbnMgY3JlYXRlRGVsZXRlT3B0aW9ucygpIHsKLQkJRGVsZXRlT3B0aW9ucyBvcHRzID0gbmV3IERlbGV0ZU9wdGlvbnMoKTsKLQkJb3B0cy5zZXRJc0VBUkRlbGV0ZSh0cnVlKTsKLQkJb3B0cy5zZXREZWxldGVQcm9qZWN0cyh0cnVlKTsKLQkJb3B0cy5zZXREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMobW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JCW9wdHMuc2V0RGVsZXRlTW9kdWxlcyhtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZXMoKSk7Ci0JCW9wdHMuc2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSk7Ci0JCXJldHVybiBvcHRzOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNlZFByb2plY3RzKFNldCBwcm9qZWN0cykgewotCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGl0ZXIubmV4dCgpOwotCQkJcmVmZXJlbmNlZFByb2plY3RzLnB1dChwcm9qZWN0LCBCb29sZWFuLlRSVUUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oKSB7Ci0JCXNldExheW91dCgpOwotCQlhZGRSYWRpb0NvbXBvc2l0ZSgpOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIHRydWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy9zZXR1cCBkZWZhdWx0cwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYXlvdXQoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGlvQ29tcG9zaXRlKCkgewotCQlyYWRpb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMjsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5zZXRUZXh0KERFTEVURV9FQVJfUFJPSkVDVFMpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlkZWxldGVSZWZQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX1JFRkVSRU5DRURfUFJPSkVDVFMpOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGVsZXRlUmVmUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWRldGFpbHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWRldGFpbHNCdG4uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCWRldGFpbHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJZGV0YWlsc0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gZGVsZXRlQXBwUHJvamVjdHNCdG4pCi0JCQlkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBkZWxldGVSZWZQcm9qZWN0c0J0bikKLQkJCWRlbGV0ZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRldGFpbHNCdG4pCi0JCQlkZXRhaWxzQnRuU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAoZGVsZXRlQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWlmIChsaXN0Q3JlYXRlZCkKLQkJCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKGRlbGV0ZVJlZlByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlkZXRhaWxzQnRuLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHByZXNzaW5nIHRoZSBkZXRhaWxzCi0JICogYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBkaWFsb2cuZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWlmIChsaXN0Q3JlYXRlZCkgewotCQkJcHJvamVjdHNMaXN0LmdldENvbnRyb2woKS5kaXNwb3NlKCk7Ci0JCQlsaXN0Q3JlYXRlZCA9IGZhbHNlOwotCQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZURyb3BEb3duTGlzdCgpOwotCQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCi0JCVBvaW50IG5ld1NpemUgPSBkaWFsb2cuZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWdldFNoZWxsKCkuc2V0U2l6ZShuZXcgUG9pbnQod2luZG93U2l6ZS54LCB3aW5kb3dTaXplLnkgKyAobmV3U2l6ZS55IC0gb2xkU2l6ZS55KSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURyb3BEb3duTGlzdCgpIHsKLQkJLy8gY3JlYXRlIHRoZSBsaXN0Ci0JCXByb2plY3RzTGlzdCA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KHJhZGlvQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJcHJvamVjdHNMaXN0LnNldExhYmVsUHJvdmlkZXIoY3JlYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJcHJvamVjdHNMaXN0LnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgey8qdmlld2Vyc29ydGVyKi99KTsKLQkJcHJvamVjdHNMaXN0LmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJLy8gZmlsbCB0aGUgbGlzdAotCQlwb3B1bGF0ZUxpc3QoKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gcHJvamVjdHNMaXN0LmdldFRhYmxlKCkuZ2V0SXRlbUhlaWdodCgpICogcmVmZXJlbmNlZFByb2plY3RzLnNpemUoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlwcm9qZWN0c0xpc3QuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWxpc3RDcmVhdGVkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpc3QoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRQcm9qZWN0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCWJvb2xlYW4gY2hlY2tlZCA9ICgoQm9vbGVhbikgZW50cnkuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQlwcm9qZWN0c0xpc3Quc2V0Q2hlY2tlZChlbnRyeS5nZXRLZXkoKSwgY2hlY2tlZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXRhaWxzQnRuU2VsZWN0ZWQoKSB7Ci0JCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlyZWZlcmVuY2VkUHJvamVjdHMucHV0KGV2ZW50LmdldEVsZW1lbnQoKSwgbmV3IEJvb2xlYW4oZXZlbnQuZ2V0Q2hlY2tlZCgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElUYWJsZUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvL2Rpc3Bvc2UKLQkJCX0KLQotCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlyZXR1cm4gd29ya2JlbmNoTGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChPYmplY3QsIGludCkKLQkJCSAqLwotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlyZXR1cm4gd29ya2JlbmNoTGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJLy9kbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJLy9kbyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZUVBUkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlRUFSRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NmQ5NGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlRUFSRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIERlbGV0ZUVBUkRpYWxvZyBleHRlbmRzIEoyRUVEZWxldGVEaWFsb2cgewotCXByb3RlY3RlZCBEZWxldGVFQVJDb21wb3NpdGUgZGVsZXRlQ29tcG9zaXRlOwotCXByb3RlY3RlZCBTZXQgcmVmZXJlbmNlZFByb2plY3RzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERlbGV0ZUVBUkRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKi8KLQlwdWJsaWMgRGVsZXRlRUFSRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTZXQgcmVmZXJlbmNlZFByb2plY3RzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBERUxFVEVfRUFSX09QVElPTlMpOwotCQl0aGlzLnJlZmVyZW5jZWRQcm9qZWN0cyA9IHJlZmVyZW5jZWRQcm9qZWN0czsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgTWVzc2FnZURpYWxvZyNjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLkRFTEVBVEVfRUFSX0RJQUxPR18xKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGVDb21wb3NpdGUgPSBuZXcgRGVsZXRlRUFSQ29tcG9zaXRlKHBhcmVudCwgdGhpcywgU1dULk5PTkUsIHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCWRlbGV0ZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gZGVsZXRlQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSjJFRURlbGV0ZURpYWxvZyNjcmVhdGVEZWxldGVPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVEZWxldGVPcHRpb25zKCkgewotCQlkZWxldGVPcHRpb25zID0gZGVsZXRlQ29tcG9zaXRlLmNyZWF0ZURlbGV0ZU9wdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjZ2V0Q29udGVudHMoKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRhNDBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVNb2R1bGVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBKMkVFRGVsZXRlVUlDb25zdGFudHMsIExpc3RlbmVyIHsKLQotCS8vCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlUHJvamVjdHNDaGVja0JveDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUFwcFByb2plY3RzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlUmVmUHJvamVjdHNCdG47Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSBtb2R1bGVSZWZzQ29tcG9zaXRlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlTW9kdWxlQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgRGVsZXRlTW9kdWxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKCkgewotCQlhZGREZWxldGVQcm9qZWN0c0dyb3VwKCk7Ci0JCWFkZERlbGV0ZU1vZHVsZVJlZnNDb21wb3NpdGUoKTsKLQkJLy9zZXQgZGVmYXVsdCB2YWx1ZXMKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlUHJvamVjdHNHcm91cCgpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAyOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX1BST0pFQ1RTX09OTFkpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlkZWxldGVSZWZQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX1BST0pFQ1RfUkVGRVJFTkNFUyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGVNb2R1bGVSZWZzQ29tcG9zaXRlKCkgewotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIGZhbHNlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXBhcmF0b3IoKSB7Ci0JCUxhYmVsIHNlcCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXNlcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZVByb2plY3RzKCkgewotCQkvLwkJcmV0dXJuIGRlbGV0ZVByb2plY3RzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIHRoZSBwcm9qZWN0IHNob3VsZCBiZSBkZWxldGVkLCBzaW5jZSBkZWxldGUgd2FzIHRoZSBzZWxlY3RlZCBhY3Rpb24KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gZGVsZXRlQXBwUHJvamVjdHNCdG4pCi0JCQlkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBkZWxldGVSZWZQcm9qZWN0c0J0bikKLQkJCWRlbGV0ZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAoZGVsZXRlQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKGRlbGV0ZVJlZlByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjBmMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZWxldGUuRGVsZXRlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgRGVsZXRlTW9kdWxlRGlhbG9nIGV4dGVuZHMgSjJFRURlbGV0ZURpYWxvZyBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgRGVsZXRlTW9kdWxlQ29tcG9zaXRlIGRlbGV0ZUNvbXBvc2l0ZTsKLQotCXB1YmxpYyBEZWxldGVNb2R1bGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIERFTEVURV9NT0RVTEVfT1BUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5ERUxFQVRFX01PRFVMRV9ESUFMT0dfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlQ29tcG9zaXRlID0gbmV3IERlbGV0ZU1vZHVsZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJZGVsZXRlQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBkZWxldGVDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRGVsZXRlT3B0aW9ucygpIHsKLQkJZGVsZXRlT3B0aW9ucyA9IG5ldyBEZWxldGVPcHRpb25zKCk7Ci0JCWRlbGV0ZU9wdGlvbnMuc2V0RGVsZXRlUHJvamVjdHMoZGVsZXRlQ29tcG9zaXRlLnNob3VsZERlbGV0ZVByb2plY3RzKCkpOwotCQlkZWxldGVPcHRpb25zLnNldERlbGV0ZU1vZHVsZXMoZGVsZXRlQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZXMoKSk7Ci0JCWRlbGV0ZU9wdGlvbnMuc2V0RGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKGRlbGV0ZUNvbXBvc2l0ZS5zaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzMTg5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBKMkVFRGVsZXRlVUlDb25zdGFudHMsIExpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlTW9kdWxlc0NoZWNrYm94OwotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3g7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFQVJEZWxldGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBib29sZWFuIGlzRUFSRGVsZXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLmlzRUFSRGVsZXRlID0gaXNFQVJEZWxldGU7Ci0JCWFkZENoaWxkcmVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oKSB7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWFkZERlbGV0ZU1vZHVsZXNDaGVja2JveCgpOwotCQlhZGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94KCkgewotCQlkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveCA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKLQkJZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0VGV4dChERUxFVEVfTU9EVUxFX0RFUEVOREVOQ0lFUyk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGVNb2R1bGVzQ2hlY2tib3goKSB7Ci0JCWRlbGV0ZU1vZHVsZXNDaGVja2JveCA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKLQkJU3RyaW5nIGxhYmVsID0gaXNFQVJEZWxldGUgPyBERUxFVEVfTU9EVUxFU19PVEhFUiA6IERFTEVURV9NT0RVTEVTOwotCQlkZWxldGVNb2R1bGVzQ2hlY2tib3guc2V0VGV4dChsYWJlbCk7Ci0JCWRlbGV0ZU1vZHVsZXNDaGVja2JveC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7Ci0JCXJldHVybiBkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVNb2R1bGVzKCkgewotCQlyZXR1cm4gZGVsZXRlTW9kdWxlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1dHRvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRTZWxlY3Rpb24oZW5hYmxlZCk7Ci0JCWRlbGV0ZU1vZHVsZXNDaGVja2JveC5zZXRTZWxlY3Rpb24oZW5hYmxlZCk7Ci0JCWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWRlbGV0ZU1vZHVsZXNDaGVja2JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBkZWxldGVNb2R1bGVzQ2hlY2tib3ggJiYgZGVsZXRlTW9kdWxlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpICYmICFkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLQkJCWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9GaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0ZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM5MzIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0ZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5UeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmdbXSBmRXh0ZW5zaW9uczsKLQkvKioKLQkgKiBGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBTaGVsbAotCSAqIEBwYXJlbnQgZXh0ZW5zaW9ucyBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyBGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXRoaXMocGFyZW50LCBudWxsLCBudWxsLCBleHRlbnNpb25zLCBmYWxzZSk7Ci0JfQotCS8qKgotCSAqIEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFNoZWxsCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQHBhcmVudCBleHRlbnNpb25zIFN0cmluZ1tdCi0JICogQHBhcmFtIGFsbG93TXVsdGlwbGUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gZXh0ZW5zaW9ucywgYm9vbGVhbiBhbGxvd011bHRpcGxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFKTsKLQotCQlzZXRUaXRsZSh0aXRsZSk7Ci0JCWlmICh0aXRsZSA9PSBudWxsKQotCQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVfU2VsZWN0aW9uX1VJXyIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJbWVzc2FnZSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJTZWxlY3RfYV9maWxlX19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRNZXNzYWdlKG1lc3NhZ2UpOwotCQlzZXRBbGxvd011bHRpcGxlKHRydWUpOwotCQlzZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlhZGRGaWx0ZXIobmV3IFR5cGVkRmlsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JCXNldFZhbGlkYXRvcihuZXcgVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKG5ldyBDbGFzc1tde0lGaWxlLmNsYXNzfSwgYWxsb3dNdWx0aXBsZSkpOwotCi0JfQotCXB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZkV4dGVuc2lvbnM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbnMoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQlmRXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVscChTdHJpbmcgaGVscENvZGUpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmdldFBhcmVudFNoZWxsKCksIGhlbHBDb2RlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5N2YyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVsZXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVsZXRlLkRlbGV0ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVEZWxldGVEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIGltcGxlbWVudHMgSjJFRURlbGV0ZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBEZWxldGVPcHRpb25zIGRlbGV0ZU9wdGlvbnM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRURlbGV0ZURpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICovCi0JcHVibGljIEoyRUVEZWxldGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG51bGwsIERFTEVURV9ESUFMT0dfTUVTU0FHRSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDApOwotCX0KLQotCXB1YmxpYyBEZWxldGVPcHRpb25zIGdldERlbGV0ZU9wdGlvbnMoKSB7Ci0JCXJldHVybiBkZWxldGVPcHRpb25zOwotCX0KLQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlRGVsZXRlT3B0aW9ucygpOwotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IDApCi0JCQljcmVhdGVEZWxldGVPcHRpb25zKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVVSUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlbGV0ZVVJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTc0NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlbGV0ZVVJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSjJFRURlbGV0ZVVJQ29uc3RhbnRzIHsKLQlTdHJpbmcgREVMRVRFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV8xIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9zZWxlY3RlZF9wcm9qZWN0KHMpXzIiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTU9EVUxFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdmVfbW9kdWxlKHMpX2Zyb21fYWxsX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzMiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTU9EVUxFU19PVEhFUiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdmVfbW9kdWxlKHMpX2Zyb21fYWxsX290aGVyX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzQiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTU9EVUxFX0RFUEVOREVOQ0lFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdmVfbW9kdWxlX2RlcGVuZGVuY2llc19yZWZlcmVuY2luZ19zZWxlY3RlZF9wcm9qZWN0KHMpXzUiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTU9EVUxFX09QVElPTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX01vZHVsZV9PcHRpb25zXzYiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfRUFSX09QVElPTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX0VudGVycHJpc2VfQXBwbGljYXRpb25fT3B0aW9uc183Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX05PVF9DT01QTEVURUQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX2NvdWxkX25vdF9iZV9jb21wbGV0ZWRfOCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9FUlJPUiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfZXJyb3JfOSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9ESUFMT0dfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXaGF0X3dvdWxkX3lvdV9saWtlX3RvX2RlbGV0ZV9fMTAiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfRUFSX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9zZWxlY3RlZF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3Qocylfb25seV8xMSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9SRUZFUkVOQ0VEX1BST0pFQ1RTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFsc29fZGVsZXRlX21vZHVsZV9hbmRfdXRpbGl0eV9KYXZhX3Byb2plY3RzXzEyIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX1BST0pFQ1RTX09OTFkgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX3NlbGVjdGVkX3Byb2plY3Qocylfb25seV8xMyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9QUk9KRUNUX1JFRkVSRU5DRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQWxzb19kZWxldGVfcmVmZXJlbmNlc190b19zZWxlY3RlZF9wcm9qZWN0KHMpXzE0Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ1VTVE9NX0RFTEVURV9NSVhfTUFUQ0ggPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ1VTVE9NX0RFTEVURV9NSVhfTUFUQ0hfVUlfIik7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95U3RhdHVzRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95U3RhdHVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NGEwYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVN0YXR1c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDExLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIHNhZ2Fyd2FsCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRURlcGxveVN0YXR1c0RpYWxvZyBleHRlbmRzIFByb2dyZXNzTW9uaXRvckRpYWxvZyBpbXBsZW1lbnRzIEoyRUVEZXBsb3lVSUNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBSZXNlcnZlIHJvb20gZm9yIHRoaXMgbWFueSBsaXN0IGl0ZW1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVNUX0lURU1fQ09VTlQgPSA3OwotCXByaXZhdGUgaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQlwdWJsaWMgQ29sb3IgREVTQ19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsKLQkvKioKLQkgKiBUaGUgRGV0YWlscyBidXR0b24uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gZGV0YWlsc0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBTV1QgbGlzdCBjb250cm9sIHRoYXQgZGlzcGxheXMgdGhlIGVycm9yIGRldGFpbHMuCi0JICovCi0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3IgZGV0YWlscyB2aWV3ZXIgaXMgY3VycmVudGx5IGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHRleHRDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIHRoZSBtYWluIGVycm9yIG9iamVjdCdzIGRldGFpbGVkIGVycm9ycyAoZWxlbWVudCB0eXBlOgotCSAqIDxjb2RlPkoyRUVNaWdyYXRpb25TdGF0dXM8L2NvZGU+KS4KLQkgKi8KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHN0YXR1c0xpc3Q7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIEoyRUVEZXBsb3lTdGF0dXNEaWFsb2coU2hlbGwgcGFyZW50LCBMaXN0IHN0YXR1cykgewotCQlzdXBlcihwYXJlbnQpOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5CT1JERVIgfCBTV1QuVElUTEUgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFKTsgLy8gbm8KLQkJc3RhdHVzTGlzdCA9IHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQganVzdCBhZnRlciB0aGUgb3BlcmF0aW9uIGlzIHJ1bi4gRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZGVjcmVtZW50IHRoZSBuZXN0aW5nIGRlcHRoLAotCSAqIGFuZCBjbG9zZSB0aGUgZGlhbG9nLgotCSAqIAotCSAqIEBwbGFubmVkZm9yIDMuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkUnVuKCkgewotCQlkZWNyZW1lbnROZXN0aW5nRGVwdGgoKTsKLQkJY2xlYXJDdXJzb3JzKCk7Ci0JCWNhbmNlbC5zZXRFbmFibGVkKHRydWUpOwotCQlkZXRhaWxzQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWNvbXB1dGVTZXZlcml0eSgpOwotCQlzZXREZXBsb3ltZW50U3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREZXBsb3ltZW50U3RhdHVzKCkgewotCQlzZXRNZXNzYWdlT3JEZWZhdWx0KCk7Ci0JCWltYWdlTGFiZWwuc2V0SW1hZ2UoZ2V0SW1hZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWVzc2FnZU9yRGVmYXVsdCgpIHsKLQkJc3dpdGNoIChnZXRTZXZlcml0eSgpKSB7Ci0JCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCW1lc3NhZ2UgPSBERVBMT1lfRVJST1JTX1JFUE9SVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQltZXNzYWdlID0gREVQTE9ZX1dBUk5JTkdTX1JFUE9SVDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCW1lc3NhZ2UgPSBERVBMT1lfU1VDQ0VTU19SRVBPUlQ7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJc2V0TWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNhbmNlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNhbmNlbEJ1dHRvbihwYXJlbnQpOwotCQljYW5jZWwuc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY2FuY2VsIGJ1dHRvbgotCQljcmVhdGVDYW5jZWxCdXR0b24ocGFyZW50KTsKLQkJZGV0YWlsc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsIGZhbHNlKTsKLQkJZGV0YWlsc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gSGFuZGxlcyB0aGUgcHJlc3Npbmcgb2YgdGhlIE9rIG9yIERldGFpbHMgYnV0dG9uIGluCi0JICogdGhpcyBkaWFsb2cuIElmIHRoZSBPayBidXR0b24gd2FzIHByZXNzZWQgdGhlbiBjbG9zZSB0aGlzIGRpYWxvZy4gSWYgdGhlIERldGFpbHMgYnV0dG9uIHdhcwotCSAqIHByZXNzZWQgdGhlbiB0b2dnbGUgdGhlIGRpc3BsYXlpbmcgb2YgdGhlIGVycm9yIGRldGFpbHMgYXJlYS4gTm90ZSB0aGF0IHRoZSBEZXRhaWxzIGJ1dHRvbgotCSAqIHdpbGwgb25seSBiZSB2aXNpYmxlIGlmIHRoZSBlcnJvciBiZWluZyBkaXNwbGF5ZWQgc3BlY2lmaWVzIGNoaWxkIGRldGFpbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkgeyAvLyB3YXMgdGhlIGRldGFpbHMgYnV0dG9uIHByZXNzZWQ/Ci0JCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQl9IGVsc2UgewotCQkJbG9nU3RhdHVzKCk7Ci0JCQlzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2cjZ2V0SW1hZ2UoKQotCSAqLwotCi0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXN3aXRjaCAoZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQlyZXR1cm4gdGhpcy5nZXRFcnJvckltYWdlKCk7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0V2FybmluZ0ltYWdlKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gdGhpcy5nZXRJbmZvSW1hZ2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZURyb3BEb3duVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlzdAotCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULk1VTFRJKTsKLQkJLy8gZmlsbCB0aGUgbGlzdAotCQlwb3B1bGF0ZVRleHQodGV4dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIExJU1RfSVRFTV9DT1VOVDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0ZXh0Q3JlYXRlZCA9IHRydWU7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dTdGF0dXMoKSB7Ci0JCUl0ZXJhdG9yIGFlbnVtID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChtZXNzYWdlKTsKLQkJd2hpbGUgKGFlbnVtLmhhc05leHQoKSkgewotCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IChJU3RhdHVzKSBhZW51bS5uZXh0KCk7Ci0JCQlwb3B1bGF0ZVRleHQoc2IsIGNoaWxkU3RhdHVzLCAwKTsKLQkJfQotCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nSW5mbyhzYi50b1N0cmluZygpKTsKLQotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgbGlzdCB1c2luZyB0aGlzIGVycm9yIGRpYWxvZydzIHN0YXR1cyBvYmplY3QuIFRoaXMgd2Fsa3MgdGhlIGNoaWxkIHN0YXRpIG9mIHRoZQotCSAqIHN0YXR1cyBvYmplY3QgYW5kIGRpc3BsYXlzIHRoZW0gaW4gYSBsaXN0LiBUaGUgZm9ybWF0IGZvciBlYWNoIGVudHJ5IGlzIHN0YXR1c19wYXRoIDoKLQkgKiBzdGF0dXNfbWVzc2FnZSBJZiB0aGUgc3RhdHVzJ3MgcGF0aCB3YXMgbnVsbCB0aGVuIGl0IChhbmQgdGhlIGNvbG9uKSBhcmUgb21pdHRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVUZXh0KFRleHQgc29tZVRleHQpIHsKLQkJSXRlcmF0b3IgYWVudW0gPSBzdGF0dXNMaXN0Lml0ZXJhdG9yKCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKGFlbnVtLmhhc05leHQoKSkgewotCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IChJU3RhdHVzKSBhZW51bS5uZXh0KCk7Ci0JCQkvL3NiLmFwcGVuZCgiRGVwbG95bWVudCByZXN1bHRzIGZvciAiICsgY2hpbGRTdGF0dXMuKTsKLQkJCXBvcHVsYXRlVGV4dChzYiwgY2hpbGRTdGF0dXMsIDApOwotCQl9Ci0JCXNvbWVUZXh0LnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVUZXh0KFN0cmluZ0J1ZmZlciBzYiwgSVN0YXR1cyBzdGF0dXMsIGludCBuZXN0aW5nKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGluZzsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzYi5hcHBlbmQoZ2V0TWVzc2FnZUZvckRpc3BsYXkoc3RhdHVzKSk7Ci0JCXNiLmFwcGVuZCgnXG4nKTsKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXBvcHVsYXRlVGV4dChzYiwgY2hpbGRyZW5baV0sIG5lc3RpbmcgKyAxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwcmVzc2luZyB0aGUgZGV0YWlscwotCSAqIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKSB7Ci0JCVBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJUG9pbnQgb2xkU2l6ZSA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlpZiAodGV4dENyZWF0ZWQpIHsKLQkJCXRleHQuZGlzcG9zZSgpOwotCQkJdGV4dENyZWF0ZWQgPSBmYWxzZTsKLQkJCWRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0ID0gY3JlYXRlRHJvcERvd25UZXh0KChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotCQkJZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKERFU0NfQ09MT1IpOwotCQl9Ci0KLQkJUG9pbnQgbmV3U2l6ZSA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlnZXRTaGVsbCgpLnNldFNpemUobmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55ICsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VGb3JEaXNwbGF5KElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtZXNzYWdlU3RyaW5nID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJcmV0dXJuIG1lc3NhZ2VTdHJpbmc7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNldmVyaXR5VGV4dChJU3RhdHVzIHN0YXR1cykgewotCQlzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKSB7Ci0JCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCXJldHVybiBFUlJPUl9URVhUOwotCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCXJldHVybiBXQVJOSU5HX1RFWFQ7Ci0JCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJcmV0dXJuIElORk9fVEVYVDsKLQkJCWNhc2UgSVN0YXR1cy5PSyA6Ci0JCQkJcmV0dXJuIE9LX1RFWFQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2KSB7Ci0JCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJcmV0dXJuOwotCQlpZiAoc2V2ID09IElTdGF0dXMuRVJST1IpCi0JCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCWVsc2UgaWYgKHNldiA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBzZXZlcml0eTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlU2V2ZXJpdHkoKSB7Ci0JCUl0ZXJhdG9yIGFlbnVtID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWVudW0uaGFzTmV4dCgpKSB7Ci0JCQlJU3RhdHVzIGNoaWxkU3RhdHVzID0gKElTdGF0dXMpIGFlbnVtLm5leHQoKTsKLQkJCXNldFNldmVyaXR5KGNoaWxkU3RhdHVzLmdldFNldmVyaXR5KCkpOwotCQkJaWYgKGdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQlyZXR1cm4gZ2V0U2V2ZXJpdHkoKTsKLQkJCWNvbXB1dGVTZXZlcml0eShjaGlsZFN0YXR1cyk7Ci0JCQlpZiAoZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCWdldFNldmVyaXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGdldFNldmVyaXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVTZXZlcml0eShJU3RhdHVzIHN0YXR1cykgewotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJY29tcHV0ZVNldmVyaXR5KGNoaWxkcmVuW2ldKTsKLQkJCWlmIChnZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KERFUExPWV9ESUFMT0dfVElUTEUpOwotCQkvL3NoZWxsLnNldFNpemUoNjAwLDIwMCk7IGRvbid0IHNldCB0aGUgc2l6ZSB0aGlzIGJyZWFrcyB0aGUgZGlhbG9nIGZvciBsaW51eC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlzZXRNZXNzYWdlKERFUExPWU1FTlRfSU5fUFJPR1JFU1MpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgbGFiZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VTdHJpbmcpIHsKLQkJLy9tdXN0IG5vdCBzZXQgbnVsbCB0ZXh0IGluIGEgbGFiZWwKLQkJbWVzc2FnZSA9IG1lc3NhZ2VTdHJpbmcgPT0gbnVsbCA/ICIiIDogbWVzc2FnZVN0cmluZzsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWVzc2FnZUxhYmVsID09IG51bGwgfHwgbWVzc2FnZUxhYmVsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJbWVzc2FnZUxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVVJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95VUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlMzU4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95VUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotcHVibGljIGludGVyZmFjZSBKMkVFRGVwbG95VUlDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RFWFQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX0VSUk9SX1RFWFQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkdfVEVYVCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfV0FSTklOR19URVhUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX1RFWFQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX0lORk9fVEVYVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0tfVEVYVCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfT0tfVEVYVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZTUVOVF9JTl9QUk9HUkVTUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lNRU5UX0lOX1BST0dSRVNTIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfU1VDQ0VTU19SRVBPUlQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX1NVQ0NFU1NfUkVQT1JUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfV0FSTklOR1NfUkVQT1JUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9XQVJOSU5HU19SRVBPUlQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWV9FUlJPUlNfUkVQT1JUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9FUlJPUlNfUkVQT1JUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfRElBTE9HX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVSZW5hbWVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVSZW5hbWVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjYmYxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVSZW5hbWVEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBSZW5hbWVPcHRpb25zIHJlbmFtZU9wdGlvbnM7Ci0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50TmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRVJlbmFtZURpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICovCi0JcHVibGljIEoyRUVSZW5hbWVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBudWxsLCBSRU5BTUVfRElBTE9HX01FU1NBR0UsIFFVRVNUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9LCAwKTsKLQkJY3VycmVudE5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBSZW5hbWVPcHRpb25zIGdldFJlbmFtZU9wdGlvbnMoKSB7Ci0JCXJldHVybiByZW5hbWVPcHRpb25zOwotCX0KLQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlUmVuYW1lT3B0aW9ucygpOwotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IDApCi0JCQljcmVhdGVSZW5hbWVPcHRpb25zKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lVUlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVSZW5hbWVVSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE1NzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVSZW5hbWVVSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVSZW5hbWVVSUNvbnN0YW50cyB7Ci0JU3RyaW5nIFJFTkFNRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfMSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9QUk9KRUNUUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfc2VsZWN0ZWRfcHJvamVjdF8yIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX01PRFVMRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX21vZHVsZV9pbl9hbGxfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfMyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9NT0RVTEVTX09USEVSID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9tb2R1bGVfaW5fYWxsX290aGVyX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzQiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfTU9EVUxFX0RFUEVOREVOQ0lFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfbW9kdWxlX2RlcGVuZGVuY2llc19yZWZlcmVuY2luZ19zZWxlY3RlZF9wcm9qZWN0XzUiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfTU9EVUxFX09QVElPTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX01vZHVsZV9PcHRpb25zXzYiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfRUFSX09QVElPTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX0VudGVycHJpc2VfQXBwbGljYXRpb25fT3B0aW9uc183Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX05PVF9DT01QTEVURUQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX2NvdWxkX25vdF9iZV9jb21wbGV0ZWRfOCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9FUlJPUiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfZXJyb3JfOSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9ESUFMT0dfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXaGF0X3dvdWxkX3lvdV9saWtlX3RvX3JlbmFtZV90aGlzX3RvX18xMCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9DT05URVhUX1JPT1QgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ29udGV4dF9Sb290X18xMSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9FQVJfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX3NlbGVjdGVkX0VudGVycHJpc2VfQXBwbGljYXRpb25fcHJvamVjdF9vbmx5XzEyIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX1JFRkVSRU5DRURfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQWxzb19yZW5hbWVfbW9kdWxlX2FuZF91dGlsaXR5X0phdmFfcHJvamVjdHNfMTMiKTsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9MaXN0TWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODA4YjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS83LzIwMDEgMTE6Mjg6MjQgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIExpc3RNZXNzYWdlRGlhbG9nIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gbGlzdEl0ZW1zOwotCXByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLQkvKioKLQkgKiBFSkJTZWxlY3RpdmVJbXBvcnREaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGRpYWxvZ0J1dHRvbkxhYmVscwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIGRlZmF1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIExpc3RNZXNzYWdlRGlhbG9nKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgamF2YS5sYW5nLlN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ1RpdGxlSW1hZ2UsIGRpYWxvZ01lc3NhZ2UsIGRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCX0KLQotCS8qKgotCSAqIExpc3RNZXNzYWdlRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZUltYWdlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLQkgKiBAcGFyYW0gZGlhbG9nTWVzc2FnZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqIEBwYXJhbSBkZWZhdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBMaXN0TWVzc2FnZURpYWxvZyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIGludCBkaWFsb2dJbWFnZVR5cGUsIGphdmEubGFuZy5TdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgsIFN0cmluZ1tdIG5hbWVzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JCWxpc3RJdGVtcyA9IG5hbWVzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGFuIGFyZWEgb2YgdGhlIGRpYWxvZyB3aGljaCBhcHBlYXJzIGJlbG93IHRoZSBtZXNzYWdlIGFuZAotCSAqIGFib3ZlIHRoZSBidXR0b24gYmFyLgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBTdWJjbGFzc2VzCi0JICogbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGN1c3RvbSBhcmVhCi0JICogQHJldHVybiB0aGUgY3VzdG9tIGFyZWEgY29udHJvbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIDApOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWlmIChsaXN0SXRlbXMgIT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBMaXN0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQkJbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbGlzdC5zZXRJdGVtcyhsaXN0SXRlbXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc2ltcGxlIGNvbmZpcm0gKE9LL0NhbmNlbCkgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSBPSyBidXR0b24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkNvbmZpcm0oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcykgewotCQlMaXN0TWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdyBpY29uCi0JCQkJCW1lc3NhZ2UsIFFVRVNUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9LCAwLCBpdGVtcyk7IC8vIE9LCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCBlcnJvciBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBFUlJPUiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBpdGVtcyk7IC8vIG9rIGlzIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIGluZm9ybWF0aW9uIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuSW5mb3JtYXRpb24oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcykgewotCQlMaXN0TWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdyBpY29uCi0JCQkJCW1lc3NhZ2UsIElORk9STUFUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH0sIDAsIGl0ZW1zKTsKLQkJLy8gb2sgaXMgdGhlIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc2ltcGxlIFllcy9ObyBxdWVzdGlvbiBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHByZXNzZXMgdGhlIE9LIGJ1dHRvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuUXVlc3Rpb24oU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcykgewotCQlMaXN0TWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdyBpY29uCi0JCQkJCW1lc3NhZ2UsIFFVRVNUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9LCAwLCBpdGVtcyk7IC8vIHllcwotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgd2FybmluZyBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3Blbldhcm5pbmcoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcykgewotCQlMaXN0TWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdyBpY29uCi0JCQkJCW1lc3NhZ2UsIFdBUk5JTkcsIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyBvayBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lRUFSQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGExOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lRUFSQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lRUFSQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzLCBMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbmFtZUFwcFByb2plY3RzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gcmVuYW1lUmVmUHJvamVjdHNCdG47Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRldGFpbHNCdG47Ci0JcHJvdGVjdGVkIFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUgbW9kdWxlUmVmc0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciBwcm9qZWN0c0xpc3Q7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTWFwIHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgV29ya2JlbmNoTGFiZWxQcm92aWRlciB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVFQVJDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBSZW5hbWVFQVJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTZXQgcmVmZXJlbmNlZFByb2plY3RzKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlpbml0UmVmZXJlbmNlZFByb2plY3RzKHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCWFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZWZlcmVuY2VkIHByb2plY3RzIHdoaWNoIHRoZSB1c2VyIGhhcyBjaG9zZW4gdG8gYWxzbyByZW5hbWUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWlmIChyZW5hbWVBcHBQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlqYXZhLnV0aWwuTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRQcm9qZWN0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVsZW1lbnQgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gaXNTZWxlY3RlZCA9ICgoQm9vbGVhbikgZWxlbWVudC5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCWlmIChpc1NlbGVjdGVkKQotCQkJCXJlc3VsdC5hZGQoZWxlbWVudC5nZXRLZXkoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVSZW5hbWVEaWFsb2cjY3JlYXRlUmVuYW1lT3B0aW9ucygpCi0JICovCi0JcHVibGljIFJlbmFtZU9wdGlvbnMgY3JlYXRlUmVuYW1lT3B0aW9ucygpIHsKLQkJUmVuYW1lT3B0aW9ucyBvcHRzID0gbmV3IFJlbmFtZU9wdGlvbnMoKTsKLQkJb3B0cy5zZXRJc0VBUlJlbmFtZSh0cnVlKTsKLQkJb3B0cy5zZXRSZW5hbWVQcm9qZWN0cyh0cnVlKTsKLQkJb3B0cy5zZXRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMobW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JCW9wdHMuc2V0UmVuYW1lTW9kdWxlcyhtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZFJlbmFtZU1vZHVsZXMoKSk7Ci0JCW9wdHMuc2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSk7Ci0JCXJldHVybiBvcHRzOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNlZFByb2plY3RzKFNldCBwcm9qZWN0cykgewotCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGl0ZXIubmV4dCgpOwotCQkJcmVmZXJlbmNlZFByb2plY3RzLnB1dChwcm9qZWN0LCBCb29sZWFuLlRSVUUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oKSB7Ci0JCXNldExheW91dCgpOwotCQlhZGRSYWRpb0NvbXBvc2l0ZSgpOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIHRydWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYXlvdXQoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGlvQ29tcG9zaXRlKCkgewotCQlyYWRpb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMjsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVuYW1lQXBwUHJvamVjdHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlyZW5hbWVBcHBQcm9qZWN0c0J0bi5zZXRUZXh0KFJFTkFNRV9FQVJfUFJPSkVDVFMpOwotCQlyZW5hbWVBcHBQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJcmVuYW1lQXBwUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZW5hbWVSZWZQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCXJlbmFtZVJlZlByb2plY3RzQnRuLnNldFRleHQoUkVOQU1FX1JFRkVSRU5DRURfUFJPSkVDVFMpOwotCQlyZW5hbWVSZWZQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcmVuYW1lUmVmUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWRldGFpbHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWRldGFpbHNCdG4uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCWRldGFpbHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJZGV0YWlsc0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gcmVuYW1lQXBwUHJvamVjdHNCdG4pCi0JCQlyZW5hbWVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSByZW5hbWVSZWZQcm9qZWN0c0J0bikKLQkJCXJlbmFtZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRldGFpbHNCdG4pCi0JCQlkZXRhaWxzQnRuU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW5hbWVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAocmVuYW1lQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWlmIChsaXN0Q3JlYXRlZCkKLQkJCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVuYW1lUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKHJlbmFtZVJlZlByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlkZXRhaWxzQnRuLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHByZXNzaW5nIHRoZSBkZXRhaWxzCi0JICogYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWlmIChsaXN0Q3JlYXRlZCkgewotCQkJcHJvamVjdHNMaXN0LmdldENvbnRyb2woKS5kaXNwb3NlKCk7Ci0JCQlsaXN0Q3JlYXRlZCA9IGZhbHNlOwotCQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZURyb3BEb3duTGlzdCgpOwotCQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCi0JCVBvaW50IG5ld1NpemUgPSBnZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWdldFNoZWxsKCkuc2V0U2l6ZShuZXcgUG9pbnQod2luZG93U2l6ZS54LCB3aW5kb3dTaXplLnkgKyAobmV3U2l6ZS55IC0gb2xkU2l6ZS55KSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURyb3BEb3duTGlzdCgpIHsKLQkJLy8gY3JlYXRlIHRoZSBsaXN0Ci0JCXByb2plY3RzTGlzdCA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KHJhZGlvQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJcHJvamVjdHNMaXN0LnNldExhYmVsUHJvdmlkZXIoY3JlYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJcHJvamVjdHNMaXN0LnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgey8qdmlld2Vyc29ydGVyKi99KTsKLQkJcHJvamVjdHNMaXN0LmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJLy8gZmlsbCB0aGUgbGlzdAotCQlwb3B1bGF0ZUxpc3QoKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHByb2plY3RzTGlzdC5nZXRUYWJsZSgpLmdldEl0ZW1IZWlnaHQoKSAqIHJlZmVyZW5jZWRQcm9qZWN0cy5zaXplKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcHJvamVjdHNMaXN0LmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlsaXN0Q3JlYXRlZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaXN0KCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkUHJvamVjdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJcHJvamVjdHNMaXN0LmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQlib29sZWFuIGNoZWNrZWQgPSAoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWQoZW50cnkuZ2V0S2V5KCksIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGV0YWlsc0J0blNlbGVjdGVkKCkgewotCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzLnB1dChldmVudC5nZXRFbGVtZW50KCksIG5ldyBCb29sZWFuKGV2ZW50LmdldENoZWNrZWQoKSkpOwotCX0KLQotCXByb3RlY3RlZCBJVGFibGVMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy9kaXNwb3NlCi0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVFQVJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JkNTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVFQVJEaWFsb2cgZXh0ZW5kcyBKMkVFUmVuYW1lRGlhbG9nIHsKLQlwcm90ZWN0ZWQgUmVuYW1lRUFSQ29tcG9zaXRlIHJlbmFtZUNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgU2V0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVFQVJEaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICovCi0JcHVibGljIFJlbmFtZUVBUkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU2V0IHJlZmVyZW5jZWRQcm9qZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIFJFTkFNRV9FQVJfT1BUSU9OUywgbmFtZSk7Ci0JCXRoaXMucmVmZXJlbmNlZFByb2plY3RzID0gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBNZXNzYWdlRGlhbG9nI2NyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUoyRUVVSUNvbnRleHRJZHMuUkVOQU1FX0VBUl9ESUFMT0dfMSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVuYW1lQ29tcG9zaXRlID0gbmV3IFJlbmFtZUVBUkNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FLCByZWZlcmVuY2VkUHJvamVjdHMpOwotCQkvLwkJcmVuYW1lQ29tcG9zaXRlLnNldE5ld05hbWUoY3VycmVudE5hbWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlyZW5hbWVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHJlbmFtZUNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVSZW5hbWVEaWFsb2cjY3JlYXRlUmVuYW1lT3B0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUmVuYW1lT3B0aW9ucygpIHsKLQkJcmVuYW1lT3B0aW9ucyA9IHJlbmFtZUNvbXBvc2l0ZS5jcmVhdGVSZW5hbWVPcHRpb25zKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyM2ZjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lTW9kdWxlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzLCBMaXN0ZW5lciB7Ci0KLQkvLyBwcm90ZWN0ZWQgQnV0dG9uIHJlbmFtZVByb2plY3RzQ2hlY2tCb3g7Ci0JcHJvdGVjdGVkIFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUgbW9kdWxlUmVmc0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgVGV4dCBuZXdOYW1lVGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbmV3Q29udGV4dFJvb3RUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGFiZWwgbmV3Q29udGV4dFJvb3RMYWJlbCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGROYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIE9LQnV0dG9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGFiZWwgc3RhdHVzTWVzc2FnZUxhYmVsID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVNb2R1bGVDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBSZW5hbWVNb2R1bGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlhZGRDaGlsZHJlbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKCkgewotCQlhZGRSZW5hbWVQcm9qZWN0c0dyb3VwKCk7Ci0JCWFkZFNlcGFyYXRvcigpOwotCQlhZGRSZW5hbWVNb2R1bGVSZWZzQ29tcG9zaXRlKCk7Ci0JCS8vQWRkIGluIGEgbGFiZWwgZm9yIHN0YXR1cyBtZXNzYWdlcyBpZiByZXF1aXJlZAotCQlzdGF0dXNNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzdGF0dXNNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldEZvbnQodGhpcy5nZXRGb250KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlbmFtZVByb2plY3RzR3JvdXAoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ld05hbWVUZXh0ID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW5ld05hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmV3Q29udGV4dFJvb3RMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCW5ld0NvbnRleHRSb290TGFiZWwuc2V0VGV4dChSRU5BTUVfQ09OVEVYVF9ST09UKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQluZXdDb250ZXh0Um9vdExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmV3Q29udGV4dFJvb3RUZXh0ID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbmV3Q29udGV4dFJvb3RUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLyoKLQkJICogcmVuYW1lUHJvamVjdHNDaGVja0JveCA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKLQkJICogcmVuYW1lUHJvamVjdHNDaGVja0JveC5zZXRUZXh0KFJFTkFNRV9QUk9KRUNUUyk7Ci0JCSAqIHJlbmFtZVByb2plY3RzQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQkgKiByZW5hbWVQcm9qZWN0c0NoZWNrQm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOyBkYXRhID0gbmV3Ci0JCSAqIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7IGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkgKiByZW5hbWVQcm9qZWN0c0NoZWNrQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0JCSAqLwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlbmFtZU1vZHVsZVJlZnNDb21wb3NpdGUoKSB7Ci0JCW1vZHVsZVJlZnNDb21wb3NpdGUgPSBuZXcgUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlcGFyYXRvcigpIHsKLQkJTGFiZWwgc2VwID0gbmV3IExhYmVsKHRoaXMsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZVByb2plY3RzKCkgewotCQkvLyAgcmV0dXJuIHJlbmFtZVByb2plY3RzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIGFsd2F5cyByZW5hbWUgdGhlIHByb2plY3QKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCkgewotCQlyZXR1cm4gbW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVNb2R1bGVzKCkgewotCQlyZXR1cm4gbW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IG5ld05hbWVUZXh0ICYmIE9LQnV0dG9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gbmV3TmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKG5ld05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlzdGF0dXNNZXNzYWdlTGFiZWwuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCU9LQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVByb2plY3QgbmV3UHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChuZXdOYW1lKTsKLQkJCWlmIChuZXdQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoSkZhY2VDb2xvcnMuZ2V0RXJyb3JUZXh0KHN0YXR1c01lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCkpKTsKLQkJCQlTdHJpbmdbXSBuYW1lcyA9IHtuZXdOYW1lfTsKLQkJCQlzdGF0dXNNZXNzYWdlTGFiZWwuc2V0VGV4dChNZXNzYWdlRm9ybWF0LmZvcm1hdChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUHJvamVjdF9hbHJlYWR5X2V4aXN0cy4iKSwgbmFtZXMpKTsgLy8kTk9OLU5MUy0xJAotCQkJCU9LQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXNNZXNzYWdlTGFiZWwuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCU9LQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5ld05hbWUoKQotCi0JewotCQlyZXR1cm4gbmV3TmFtZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJb2xkTmFtZSA9IG5ld05hbWU7Ci0JCW5ld05hbWVUZXh0LnNldFRleHQobmV3TmFtZSk7Ci0JCW5ld05hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQluZXdOYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5ld0NvbnRleHRSb290KCkgewotCQlyZXR1cm4gbmV3Q29udGV4dFJvb3RUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdDb250ZXh0Um9vdChTdHJpbmcgbmV3Q29udGV4dFJvb3QpIHsKLQkJaWYgKG5ld0NvbnRleHRSb290ICE9IG51bGwgJiYgbmV3Q29udGV4dFJvb3QubGVuZ3RoKCkgPiAxKSB7Ci0JCQluZXdDb250ZXh0Um9vdFRleHQuc2V0VGV4dChuZXdDb250ZXh0Um9vdCk7Ci0JCX0gZWxzZSB7Ci0JCQluZXdDb250ZXh0Um9vdExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJbmV3Q29udGV4dFJvb3RUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgT0tCdXR0b24uCi0JICogCi0JICogQHBhcmFtIE9LQnV0dG9uCi0JICogICAgICAgICAgICBUaGUgT0tCdXR0b24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T0tCdXR0b24oQnV0dG9uIG9LQnV0dG9uKSB7Ci0JCU9LQnV0dG9uID0gb0tCdXR0b247Ci0JCU9LQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQ5ZGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVNb2R1bGVEaWFsb2cgZXh0ZW5kcyBKMkVFUmVuYW1lRGlhbG9nIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVDb21wb3NpdGUgcmVuYW1lQ29tcG9zaXRlOwotCXByb3RlY3RlZCBTdHJpbmcgY29udGV4dFJvb3QgPSBudWxsOwotCi0JcHVibGljIFJlbmFtZU1vZHVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIG5hbWUsIFN0cmluZyBvbGRDb250ZXh0Um9vdCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgUkVOQU1FX01PRFVMRV9PUFRJT05TLCBuYW1lKTsKLQkJY29udGV4dFJvb3QgPSBvbGRDb250ZXh0Um9vdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLlJFTkFNRV9NT0RVTEVfRElBTE9HXzEpOyAvLyROT04tTkxTLTEkCi0JCXJlbmFtZUNvbXBvc2l0ZSA9IG5ldyBSZW5hbWVNb2R1bGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXROZXdOYW1lKGN1cnJlbnROYW1lKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcmVuYW1lQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXROZXdDb250ZXh0Um9vdChjb250ZXh0Um9vdCk7Ci0JCXJldHVybiByZW5hbWVDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUmVuYW1lT3B0aW9ucygpIHsKLQkJcmVuYW1lT3B0aW9ucyA9IG5ldyBSZW5hbWVPcHRpb25zKCk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0UmVuYW1lUHJvamVjdHMocmVuYW1lQ29tcG9zaXRlLnNob3VsZFJlbmFtZVByb2plY3RzKCkpOwotCQlyZW5hbWVPcHRpb25zLnNldFJlbmFtZU1vZHVsZXMocmVuYW1lQ29tcG9zaXRlLnNob3VsZFJlbmFtZU1vZHVsZXMoKSk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0UmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKHJlbmFtZUNvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0TmV3TmFtZShyZW5hbWVDb21wb3NpdGUuZ2V0TmV3TmFtZSgpKTsKLQkJcmVuYW1lT3B0aW9ucy5zZXROZXdDb250ZXh0Um9vdChyZW5hbWVDb21wb3NpdGUuZ2V0TmV3Q29udGV4dFJvb3QoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBPS0J1dHRvbiA9IG51bGw7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJT0tCdXR0b24gPSBnZXRCdXR0b24oMCk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXRPS0J1dHRvbihPS0J1dHRvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNGFhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBKMkVFUmVuYW1lVUlDb25zdGFudHMsIExpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCdXR0b24gcmVuYW1lTW9kdWxlc0NoZWNrYm94OwotCXByb3RlY3RlZCBCdXR0b24gcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3g7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFQVJSZW5hbWU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBib29sZWFuIGlzRUFSUmVuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLmlzRUFSUmVuYW1lID0gaXNFQVJSZW5hbWU7Ci0JCWFkZENoaWxkcmVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oKSB7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlhZGRSZW5hbWVNb2R1bGVzQ2hlY2tib3goKTsKLQkJYWRkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveCgpIHsKLQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0JCXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0VGV4dChSRU5BTUVfTU9EVUxFX0RFUEVOREVOQ0lFUyk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW5hbWVNb2R1bGVzQ2hlY2tib3goKSB7Ci0JCXJlbmFtZU1vZHVsZXNDaGVja2JveCA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJU3RyaW5nIGxhYmVsID0gaXNFQVJSZW5hbWUgPyBSRU5BTUVfTU9EVUxFU19PVEhFUiA6IFJFTkFNRV9NT0RVTEVTOwotCQlyZW5hbWVNb2R1bGVzQ2hlY2tib3guc2V0VGV4dChsYWJlbCk7Ci0JCXJlbmFtZU1vZHVsZXNDaGVja2JveC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7Ci0JCXJldHVybiByZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVNb2R1bGVzKCkgewotCQlyZXR1cm4gcmVuYW1lTW9kdWxlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1dHRvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRTZWxlY3Rpb24oZW5hYmxlZCk7Ci0JCXJlbmFtZU1vZHVsZXNDaGVja2JveC5zZXRTZWxlY3Rpb24oZW5hYmxlZCk7Ci0JCXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXJlbmFtZU1vZHVsZXNDaGVja2JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSByZW5hbWVNb2R1bGVzQ2hlY2tib3ggJiYgcmVuYW1lTW9kdWxlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpICYmICFyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLQkJCXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9Ud29BcnJheVF1aWNrU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9Ud29BcnJheVF1aWNrU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZWI3NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHdvQXJyYXlRdWlja1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogUXVpY2sgc29ydCB0byBzb3J0IGtleS12YWx1ZSBwYWlycy4gVGhlIGtleXMgYW5kIGFycmF5cyBhcmUgc3BlY2lmaWVkIGluCi0gKiBzZXBhcmF0ZSBhcnJheXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDIuMAotICovCi1wdWJsaWMgY2xhc3MgVHdvQXJyYXlRdWlja1NvcnRlciB7Ci0KLQlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTdHJpbmdDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlQ2FzZTsKLQotCQlTdHJpbmdDb21wYXJhdG9yKGJvb2xlYW4gaWdub3JlQ2FzZSkgewotCQkJZklnbm9yZUNhc2UgPSBpZ25vcmVDYXNlOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJCXJldHVybiBmSWdub3JlQ2FzZSA/ICgoU3RyaW5nKSBsZWZ0KS5jb21wYXJlVG9JZ25vcmVDYXNlKChTdHJpbmcpIHJpZ2h0KSA6ICgoU3RyaW5nKSBsZWZ0KS5jb21wYXJlVG8oKFN0cmluZykgcmlnaHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNvcnRlciB3aXRoIGRlZmF1bHQgc3RyaW5nIGNvbXBhcmF0b3IuIFRoZSBrZXlzIGFyZSBhc3N1bWVkIHRvCi0JICogYmUgc3RyaW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gaWdub3JlQ2FzZQotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgc29ydGluZyBpcyBjYXNlIHNlbnNpdGl2ZSBvciBub3QuCi0JICovCi0JcHVibGljIFR3b0FycmF5UXVpY2tTb3J0ZXIoYm9vbGVhbiBpZ25vcmVDYXNlKSB7Ci0JCWZDb21wYXJhdG9yID0gbmV3IFN0cmluZ0NvbXBhcmF0b3IoaWdub3JlQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNvcnRlciB3aXRoIGEgY29tcGFyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcGFyYXRvcgotCSAqICAgICAgICAgICAgdGhlIGNvbXBhcmF0b3IgdG8gb3JkZXIgdGhlIGVsZW1lbnRzLiBUaGUgY29tcGFyYXRvciBtdXN0IG5vdAotCSAqICAgICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFR3b0FycmF5UXVpY2tTb3J0ZXIoQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0JCWZDb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0cyBrZXlzIGFuZCB2YWx1ZXMgaW4gcGFyYWxsZWwuCi0JICogCi0JICogQHBhcmFtIGtleXMKLQkgKiAgICAgICAgICAgIHRoZSBrZXlzIHRvIHVzZSBmb3Igc29ydGluZy4KLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzb3J0KE9iamVjdFtdIGtleXMsIE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAoKGtleXMgPT0gbnVsbCkgfHwgKHZhbHVlcyA9PSBudWxsKSkgewotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkVpdGhlciBrZXlzIG9yIHZhbHVlcyBpbiBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChrZXlzLmxlbmd0aCA8PSAxKQotCQkJcmV0dXJuOwotCi0JCWludGVybmFsU29ydChrZXlzLCB2YWx1ZXMsIDAsIGtleXMubGVuZ3RoIC0gMSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsU29ydChPYmplY3RbXSBrZXlzLCBPYmplY3RbXSB2YWx1ZXMsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQkJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OwotCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKLQotCQlPYmplY3QgbWlkID0ga2V5c1sobGVmdCArIHJpZ2h0KSAvIDJdOwotCQlkbyB7Ci0JCQl3aGlsZSAoZkNvbXBhcmF0b3IuY29tcGFyZShrZXlzW2xlZnRdLCBtaWQpIDwgMCkKLQkJCQlsZWZ0Kys7Ci0KLQkJCXdoaWxlIChmQ29tcGFyYXRvci5jb21wYXJlKG1pZCwga2V5c1tyaWdodF0pIDwgMCkKLQkJCQlyaWdodC0tOwotCi0JCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJCXN3YXAoa2V5cywgbGVmdCwgcmlnaHQpOwotCQkJCXN3YXAodmFsdWVzLCBsZWZ0LCByaWdodCk7Ci0JCQkJbGVmdCsrOwotCQkJCXJpZ2h0LS07Ci0JCQl9Ci0JCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOwotCi0JCWlmIChvcmlnaW5hbF9sZWZ0IDwgcmlnaHQpCi0JCQlpbnRlcm5hbFNvcnQoa2V5cywgdmFsdWVzLCBvcmlnaW5hbF9sZWZ0LCByaWdodCk7Ci0KLQkJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkKLQkJCWludGVybmFsU29ydChrZXlzLCB2YWx1ZXMsIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKLQl9Ci0KLQkvKgotCSAqIFN3YXBzIHhbYV0gd2l0aCB4W2JdLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgc3dhcChPYmplY3QgeFtdLCBpbnQgYSwgaW50IGIpIHsKLQkJT2JqZWN0IHQgPSB4W2FdOwotCQl4W2FdID0geFtiXTsKLQkJeFtiXSA9IHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZUphdmFTZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZUphdmFTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODAxMjBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R5cGVKYXZhU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JT3BlbmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3YXMgZGVyaXZlZCBmcm9tIEphdmFTZWFyY2hTY29wZSBhcyB0aGF0IGNsYXNzIGRpZCBub3QgaGF2ZSBhCi0gKiBwcm92aXNpb24gdG8gZXhjbHVkZSBjbGFzc3BhdGggZW50cmllcyB0aGF0IGFyZSBub3QgZXhwb3J0ZWQgQSBKYXZhLXNwZWNpZmljCi0gKiBzY29wZSBmb3Igc2VhcmNoaW5nIHJlbGF0aXZlIHRvIG9uZSBvciBtb3JlIGphdmEgZWxlbWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlSmF2YVNlYXJjaFNjb3BlIGltcGxlbWVudHMgSUphdmFTZWFyY2hTY29wZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkgPSB0cnVlOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZWxlbWVudHM7Ci0KLQkvKgotCSAqIFRoZSBwYXRocyBvZiB0aGUgcmVzb3VyY2VzIGluIHRoaXMgc2VhcmNoIHNjb3BlIChvciB0aGUgY2xhc3NwYXRoCi0JICogZW50cmllcycgcGF0aHMgaWYgdGhlIHJlc291cmNlcyBhcmUgcHJvamVjdHMpCi0JICovCi0JcHJpdmF0ZSBJUGF0aFtdIHBhdGhzOwotCXByaXZhdGUgYm9vbGVhbltdIHBhdGhXaXRoU3ViRm9sZGVyczsKLQlwcml2YXRlIGludCBwYXRoc0NvdW50OwotCi0JcHJpdmF0ZSBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczsKLQotCXB1YmxpYyBUeXBlSmF2YVNlYXJjaFNjb3BlKCkgewotCQl0aGlzLmluaXRpYWxpemUoKTsKLQotCQkvLyBkaXNhYmxlZCBmb3Igbm93IGFzIHRoaXMgY291bGQgYmUgZXhwZW5zaXZlCi0JCS8vIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbWVtYmVyU2NvcGUodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVuY2xvc2luZ1Byb2plY3RPckphcihJUGF0aCBwYXRoKSB7Ci0JCWludCBsZW5ndGggPSB0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyc1tpXS5lcXVhbHMocGF0aCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMsIDAsIHRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzID0gbmV3IElQYXRoW2xlbmd0aCArIDFdLCAwLCBsZW5ndGgpOwotCQl0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyc1tsZW5ndGhdID0gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgYWRkUHJvamVjdC4gVGhpcyBtZXRob2QgYWRkcyBhbGwgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUKLQkgKiBjdXJyZW50IHByb2plY3QgdG8gdGhlIHNlYXJjaCBzY29wZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiBAcGFyYW0gaW5jbHVkZXNQcmVyZXFQcm9qZWN0cwotCSAqIEBwYXJhbSB2aXNpdGVkUHJvamVjdHMKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb2plY3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBib29sZWFuIGluY2x1ZGVzUHJlcmVxUHJvamVjdHMsIEhhc2hTZXQgdmlzaXRlZFByb2plY3RzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJaWYgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpIHx8ICF2aXNpdGVkUHJvamVjdHMuYWRkKHByb2plY3QpKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQlJSmF2YU1vZGVsIG1vZGVsID0gamF2YVByb2plY3QuZ2V0SmF2YU1vZGVsKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJdGhpcy5hZGQocGF0aCwgdHJ1ZSk7Ci0JCQkJCXRoaXMuYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHBhdGgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJCWlmIChpbmNsdWRlc1ByZXJlcVByb2plY3RzKSB7Ci0JCQkJCQl0aGlzLmFkZChtb2RlbC5nZXRKYXZhUHJvamVjdChlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKSksIHRydWUsIHZpc2l0ZWRQcm9qZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJCXRoaXMuYWRkKGVudHJ5LmdldFBhdGgoKSwgdHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZC4gVGhpcyBtZXRob2QgZmlsdGVycyBvdXQgYWxsIHRoZSBjbGFzc3BhdGggZW50cmllcyBvZiB0aGUKLQkgKiBwcm9qZWN0IHdoaWNoIGFyZSBub3QgZXhwb3J0ZWQuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHBhcmFtIGluY2x1ZGVzUHJlcmVxUHJvamVjdHMKLQkgKiBAcGFyYW0gdmlzaXRlZFByb2plY3RzCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBib29sZWFuIGluY2x1ZGVzUHJlcmVxUHJvamVjdHMsIEhhc2hTZXQgdmlzaXRlZFByb2plY3RzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJaWYgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpIHx8ICF2aXNpdGVkUHJvamVjdHMuYWRkKHByb2plY3QpKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQlJSmF2YU1vZGVsIG1vZGVsID0gamF2YVByb2plY3QuZ2V0SmF2YU1vZGVsKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJaWYgKGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KCkpIHsKLQkJCQlpZiAoIWVudHJ5LmlzRXhwb3J0ZWQoKSAmJiBlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQl0aGlzLmFkZChwYXRoLCB0cnVlKTsKLQkJCQkJdGhpcy5hZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIocGF0aCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKLQkJCQkJaWYgKGluY2x1ZGVzUHJlcmVxUHJvamVjdHMpIHsKLQkJCQkJCXRoaXMuYWRkKG1vZGVsLmdldEphdmFQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKSwgdHJ1ZSwgdmlzaXRlZFByb2plY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQkJdGhpcy5hZGQoZW50cnkuZ2V0UGF0aCgpLCB0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgYWRkKElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IG51bGw7Ci0JCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKLQkJCQkvLyBhIHdvcmtzcGFjZSBzb3BlIHNob3VsZCBiZSB1c2VkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgotCQkJCXRoaXMuYWRkKChJSmF2YVByb2plY3QpIGVsZW1lbnQsIHRydWUsIG5ldyBIYXNoU2V0KDIpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6Ci0JCQkJcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudDsKLQkJCQl0aGlzLmFkZChyb290LmdldFBhdGgoKSwgdHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKLQkJCQlyb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50LmdldFBhcmVudCgpOwotCQkJCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7Ci0JCQkJCXRoaXMuYWRkKHJvb3QuZ2V0UGF0aCgpLmFwcGVuZChuZXcgUGF0aChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkucmVwbGFjZSgnLicsICcvJykpKSwgZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQl0aGlzLmFkZChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyByZW1lbWJlciBzdWItY3UgKG9yIHN1Yi1jbGFzcyBmaWxlKSBqYXZhIGVsZW1lbnRzCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKSB7Ci0JCQkJCWlmICh0aGlzLmVsZW1lbnRzID09IG51bGwpIHsKLQkJCQkJCXRoaXMuZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCX0KLQkJCQkJdGhpcy5lbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJCXRoaXMuYWRkKHRoaXMuZnVsbFBhdGgoZWxlbWVudCksIHRydWUpOwotCi0JCQkJLy8gZmluZCBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaW5jbHVkaW5nIHRoaXMgamF2YSBlbGVtZW50Ci0JCQkJSUphdmFFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0JCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpKSB7Ci0JCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCXJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHBhcmVudDsKLQkJCQl9Ci0JCX0KLQotCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkpIHsKLQkJCQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihyb290LmdldFBhdGgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHJvb3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoaXMgc2VhcmNoIHNjb3BlLiBSZW1lbWJlciBpZiBzdWJmb2xkZXJzIG5lZWQgdG8KLQkgKiBiZSBpbmNsdWRlZCBhcyB3ZWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGQoSVBhdGggcGF0aCwgYm9vbGVhbiB3aXRoU3ViRm9sZGVycykgewotCQlpZiAodGhpcy5wYXRocy5sZW5ndGggPT0gdGhpcy5wYXRoc0NvdW50KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucGF0aHMsIDAsIHRoaXMucGF0aHMgPSBuZXcgSVBhdGhbdGhpcy5wYXRoc0NvdW50ICogMl0sIDAsIHRoaXMucGF0aHNDb3VudCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucGF0aFdpdGhTdWJGb2xkZXJzLCAwLCB0aGlzLnBhdGhXaXRoU3ViRm9sZGVycyA9IG5ldyBib29sZWFuW3RoaXMucGF0aHNDb3VudCAqIDJdLCAwLCB0aGlzLnBhdGhzQ291bnQpOwotCQl9Ci0JCXRoaXMucGF0aHNbdGhpcy5wYXRoc0NvdW50XSA9IHBhdGg7Ci0JCXRoaXMucGF0aFdpdGhTdWJGb2xkZXJzW3RoaXMucGF0aHNDb3VudCsrXSA9IHdpdGhTdWJGb2xkZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNlbmNsb3NlcyhTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZykgewotCQlJUGF0aCByZXNvdXJjZVBhdGg7Ci0JCWludCBzZXBhcmF0b3JJbmRleCA9IHJlc291cmNlUGF0aFN0cmluZy5pbmRleE9mKEpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUik7Ci0JCWlmIChzZXBhcmF0b3JJbmRleCAhPSAtMSkgewotCQkJcmVzb3VyY2VQYXRoID0gbmV3IFBhdGgocmVzb3VyY2VQYXRoU3RyaW5nLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCkpLmFwcGVuZChuZXcgUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSkpKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlUGF0aCA9IG5ldyBQYXRoKHJlc291cmNlUGF0aFN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZW5jbG9zZXMocmVzb3VyY2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZWFyY2ggc2NvcGUgZW5jbG9zZXMgdGhlIGdpdmVuIHBhdGguCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGVuY2xvc2VzKElQYXRoIHBhdGgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnBhdGhzQ291bnQ7IGkrKykgewotCQkJaWYgKHRoaXMucGF0aFdpdGhTdWJGb2xkZXJzW2ldKSB7Ci0JCQkJaWYgKHRoaXMucGF0aHNbaV0uaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlQYXRoIHNjb3BlUGF0aCA9IHRoaXMucGF0aHNbaV07Ci0JCQkJaWYgKHNjb3BlUGF0aC5pc1ByZWZpeE9mKHBhdGgpICYmIChzY29wZVBhdGguc2VnbWVudENvdW50KCkgPT0gcGF0aC5zZWdtZW50Q291bnQoKSAtIDEpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2VuY2xvc2VzKElKYXZhRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAodGhpcy5lbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5lbGVtZW50cy5zaXplKCk7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlKYXZhRWxlbWVudCBzY29wZUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSB0aGlzLmVsZW1lbnRzLmdldChpKTsKLQkJCQlJSmF2YUVsZW1lbnQgc2VhcmNoZWRFbGVtZW50ID0gZWxlbWVudDsKLQkJCQl3aGlsZSAoc2VhcmNoZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJaWYgKHNlYXJjaGVkRWxlbWVudC5lcXVhbHMoc2NvcGVFbGVtZW50KSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gCi0JCQkJCXNlYXJjaGVkRWxlbWVudCA9IHNlYXJjaGVkRWxlbWVudC5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZW5jbG9zZXModGhpcy5mdWxsUGF0aChlbGVtZW50KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2VuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpCi0JICovCi0JcHVibGljIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkgewotCQlyZXR1cm4gdGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnM7Ci0JfQotCXByaXZhdGUgSVBhdGggZnVsbFBhdGgoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJcmV0dXJuICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQpLmdldFBhdGgoKTsKLQkJfSAKLQkJSUphdmFFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0JCUlQYXRoIHBhcmVudFBhdGggPSBwYXJlbnQgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmZ1bGxQYXRoKHBhcmVudCk7Ci0JCUlQYXRoIGNoaWxkUGF0aDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQljaGlsZFBhdGggPSBuZXcgUGF0aChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkucmVwbGFjZSgnLicsICcvJykpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJT3BlbmFibGUpIHsKLQkJCWNoaWxkUGF0aCA9IG5ldyBQYXRoKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcGFyZW50UGF0aDsKLQkJfQotCQlyZXR1cm4gcGFyZW50UGF0aCA9PSBudWxsID8gY2hpbGRQYXRoIDogcGFyZW50UGF0aC5hcHBlbmQoY2hpbGRQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnBhdGhzID0gbmV3IElQYXRoWzFdOwotCQl0aGlzLnBhdGhXaXRoU3ViRm9sZGVycyA9IG5ldyBib29sZWFuWzFdOwotCQl0aGlzLnBhdGhzQ291bnQgPSAwOwotCQl0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycyA9IG5ldyBJUGF0aFswXTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KCkgewotCQlyZXR1cm4gaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkuCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5Ci0JICogICAgICAgICAgICBUaGUgaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkoYm9vbGVhbiBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seSkgewotCQl0aGlzLmluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5ID0gaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHk7Ci0JfQotCS8qKgotCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNpbmNsdWRlc0JpbmFyaWVzKCkKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzQmluYXJpZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNpbmNsdWRlc0NsYXNzcGF0aHMoKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXNDbGFzc3BhdGhzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjc2V0SW5jbHVkZXNCaW5hcmllcyhib29sZWFuKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZXNCaW5hcmllcyhib29sZWFuIGluY2x1ZGVzQmluYXJpZXMpIHsKLQkJLy9EZWZhdWx0IG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjc2V0SW5jbHVkZXNDbGFzc3BhdGhzKGJvb2xlYW4pCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0NsYXNzcGF0aHMoYm9vbGVhbiBpbmNsdWRlc0NsYXNzcGF0aHMpIHsKLQkJLy9EZWZhdWx0IG5vdGhpbmcKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlU2VhcmNoRW5naW5lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlU2VhcmNoRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzM5ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZVNlYXJjaEVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLQotcHVibGljIGNsYXNzIFR5cGVTZWFyY2hFbmdpbmUgZXh0ZW5kcyBTZWFyY2hFbmdpbmUgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFR5cGVTZWFyY2hFbmdpbmUuCi0JICovCi0JcHVibGljIFR5cGVTZWFyY2hFbmdpbmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFR5cGVTZWFyY2hFbmdpbmUuCi0JICogCi0JICogQHBhcmFtIHdvcmtpbmdDb3BpZXMKLQkgKi8KLQlwdWJsaWMgVHlwZVNlYXJjaEVuZ2luZShJQ29tcGlsYXRpb25Vbml0W10gd29ya2luZ0NvcGllcykgewotCQlzdXBlcih3b3JraW5nQ29waWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlSmF2YVNlYXJjaFNjb3BlRm9yQVByb2plY3QuIEdpdmVuIGEgcHJvamVjdCBpdCByZXR1cm5zIHRoZQotCSAqIHNjb3BlIG9mIHRoZSBjbGFzc2VzIHdpdGhpbiB0aGUgcHJvamVjdCdzIHNjb3BlCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cwotCSAqIEBwYXJhbSBpbmNsdWRlRXhwb3J0ZWRDbGFzc1BhdGhFbnRyaWVzT25seQotCSAqIEByZXR1cm4gSUphdmFTZWFyY2hTY29wZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFTZWFyY2hTY29wZSBjcmVhdGVKYXZhU2VhcmNoU2NvcGVGb3JBUHJvamVjdChJSmF2YVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlZFByb2plY3RzLCBib29sZWFuIGluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KSB7Ci0JCWlmICghaW5jbHVkZUV4cG9ydGVkQ2xhc3NQYXRoRW50cmllc09ubHkpIHsKLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudHNbXSA9IG5ldyBJSmF2YUVsZW1lbnRbXXtwcm9qZWN0fTsKLQkJCXJldHVybiBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGphdmFFbGVtZW50cywgaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCX0KLQkJVHlwZUphdmFTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBUeXBlSmF2YVNlYXJjaFNjb3BlKCk7Ci0JCXNjb3BlLnNldEluY2x1ZGVFeHBvcnRlZENsYXNzUGF0aEVudHJpZXNPbmx5KHRydWUpOwotCQlIYXNoU2V0IHZpc2l0ZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KDIpOwotCQl0cnkgewotCQkJc2NvcGUuYWRkUHJvamVjdChwcm9qZWN0LCBpbmNsdWRlUmVmZXJlbmNlZFByb2plY3RzLCB2aXNpdGVkUHJvamVjdHMpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZWRGaWxlVmlld2VyRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlZEZpbGVWaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyYTBmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlZEZpbGVWaWV3ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgVHlwZWRGaWxlVmlld2VyRmlsdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIgewotCXByaXZhdGUgU3RyaW5nW10gZkFjY2VwdGVkRXh0ZW5zaW9uczsKLQlwcml2YXRlIEhhc2h0YWJsZSB2aXNpdGVkRWxlbWVudHM7Ci0JcHVibGljIFR5cGVkRmlsZVZpZXdlckZpbHRlcihTdHJpbmdbXSBhY2NlcHRlZEV4dGVuc2lvbnMpIHsKLQkJZkFjY2VwdGVkRXh0ZW5zaW9ucyA9IGFjY2VwdGVkRXh0ZW5zaW9uczsKLQkJdmlzaXRlZEVsZW1lbnRzID0gbmV3IEhhc2h0YWJsZSgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChJRmlsZS5jbGFzcy5pc0luc3RhbmNlKGVsZW1lbnQpKQotCQkJcmV0dXJuIGlzVmFsaWRGaWxlKChJRmlsZSkgZWxlbWVudCk7Ci0JCWlmIChJQ29udGFpbmVyLmNsYXNzLmlzSW5zdGFuY2UoZWxlbWVudCkpCi0JCQlyZXR1cm4gaXNWYWxpZENvbnRhaW5lcigoSUNvbnRhaW5lcikgZWxlbWVudCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoKLQkgKiBBIHZhbGlkIGNvbnRhaW5lciBpcyBvbmUgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgdmFsaWQgbWVtYmVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250YWluZXIoSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJSVJlc291cmNlW10gbWVtYmVyczsKLQkJT2JqZWN0IHZhbGlkID0gdmlzaXRlZEVsZW1lbnRzLmdldChjb250YWluZXIpOwotCQlpZiAodmFsaWQgIT0gbnVsbCkKLQkJCXJldHVybiAoKEJvb2xlYW4pIHZhbGlkKS5ib29sZWFuVmFsdWUoKTsKLQkJdHJ5IHsKLQkJCW1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlzVmFsaWQobWVtYmVyc1tpXSkpIHsKLQkJCQkJdmlzaXRlZEVsZW1lbnRzLnB1dChjb250YWluZXIsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEbyBub3RoaW5nCi0JCX0KLQkJdmlzaXRlZEVsZW1lbnRzLnB1dChjb250YWluZXIsIEJvb2xlYW4uRkFMU0UpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRGaWxlKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGV4dCA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZBY2NlcHRlZEV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmQWNjZXB0ZWRFeHRlbnNpb25zW2ldLmVxdWFsc0lnbm9yZUNhc2UoZXh0KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gaXNWYWxpZChlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0FyY2hpdmVFQVJVSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0FyY2hpdmVFQVJVSVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjgyZWUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9BcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnM7Ci0KLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJhcmNoaXZlZWFydWkiKTsvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5Ci0JCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlmZ1Jlc291cmNlQnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJfQotCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9FQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDNkN2Y3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9FQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5UYWJsZU9iamVjdHM7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvNy8yMDAxIDExOjM5OjExIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHZpZXdlciB3aGVuIGl0IGlzIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLiBUaGUgcmVzdWx0IGlzIG5vdAotCSAqIG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlT2JqZWN0cykKLQkJCXJldHVybiAoKFRhYmxlT2JqZWN0cykgaW5wdXRFbGVtZW50KS5nZXRUYWJsZU9iamVjdHMoKS50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOyAvL3Nob3VsZCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZAotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudAotCSAqIGVsZW1lbnQuCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIHVzZSBmb3IgdGhpcyBtZXRob2QgaXMgcmVnaXN0ZXJpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYXMgYSBsaXN0ZW5lciB0byBjaGFuZ2VzIG9uCi0JICogdGhlIG5ldyBpbnB1dCAodXNpbmcgbW9kZWwtc3BlY2lmaWMgbWVhbnMpLCBhbmQgZGVyZWdpc3RlcmluZyB0aGUgdmlld2VyIGZyb20gdGhlIG9sZCBpbnB1dC4KLQkgKiBJbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgdGhlIGNvbnRlbnQgcHJvdmlkZXIgcHJvcGFnYXRlcyB0aGUgY2hhbmdlcyB0byB0aGUKLQkgKiB2aWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2xkSW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkaWQgbm90IHByZXZpb3VzbHkKLQkgKiAgICAgICAgICAgIGhhdmUgYW4gaW5wdXQKLQkgKiBAcGFyYW0gbmV3SW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkb2VzIG5vdCBoYXZlIGFuIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9FeHBvcnRFQVJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9FeHBvcnRFQVJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjOGQ3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRXhwb3J0RUFSQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydEVBUkFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlc2NyaXB0b3IoKS5nZXRSZXNvdXJjZVN0cmluZygiJWVhci5leHBvcnQuYWN0aW9uLmRlc2NyaXB0aW9uX3VpXyIpOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJleHBvcnRfZWFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBFeHBvcnRFQVJBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQkJRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBFQVJDb21wb25lbnRFeHBvcnRXaXphcmQoKTsKLQkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJd2l6YXJkLmluaXQocGx1Z2luLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9JbXBvcnRFQVJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9JbXBvcnRFQVJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzMWRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvSW1wb3J0RUFSQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRFQVJBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IEFyY2hpdmVFQVJVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9FQVIiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gImltcG9ydF9lYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEltcG9ydEVBUkFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCi0JCUVBUkNvbXBvbmVudEltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkKCk7Ci0KLQkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJd2l6YXJkLmluaXQocGx1Z2luLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9Nb2R1bGVzUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9Nb2R1bGVzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyNDQ0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvTW9kdWxlc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yMi8yMDAxIDI6Mjc6MjQgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZXNQcm92aWRlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIE1vZHVsZXNQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb2R1bGVzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkKLQkgKiByZWdpc3RlcmVkLgotCSAqIDxwPgotCSAqIExhYmVsIHByb3ZpZGVyIGxpc3RlbmVycyBhcmUgaW5mb3JtZWQgYWJvdXQgc3RhdGUgY2hhbmdlcyB0aGF0IGFmZmVjdCB0aGUgcmVuZGVyaW5nIG9mIHRoZQotCSAqIHZpZXdlciB0aGF0IHVzZXMgdGhpcyBsYWJlbCBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHZpZXdlciB3aGVuIGl0IGlzIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLiBUaGUgcmVzdWx0IGlzIG5vdAotCSAqIG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiAoKGphdmEudXRpbC5MaXN0KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUgaW1hZ2UgaXMgb3duZWQgYnkgdGhlIGxhYmVsCi0JICogcHJvdmlkZXIgYW5kIG11c3Qgbm90IGJlIGRpc3Bvc2VkIGRpcmVjdGx5LiBJbnN0ZWFkLCBkaXNwb3NlIHRoZSBsYWJlbCBwcm92aWRlciB3aGVuIG5vCi0JICogbG9uZ2VyIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHByb3ZpZGUgdGhlIGxhYmVsIGltYWdlCi0JICogQHJldHVybiB0aGUgaW1hZ2UgdXNlZCB0byBsYWJlbCB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlc2UgaXMgbm8gaW1hZ2UgZm9yCi0JICogICAgICAgICB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCB0ZXh0Ci0JICogQHJldHVybiB0aGUgdGV4dCBzdHJpbmcgdXNlZCB0byBsYWJlbCB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlc2UgaXMgbm8gdGV4dAotCSAqICAgICAgICAgbGFiZWwgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoQ2xhc3NQYXRoU2VsZWN0aW9uKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0IGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50Ci0JICogZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBBIHR5cGljYWwgdXNlIGZvciB0aGlzIG1ldGhvZCBpcyByZWdpc3RlcmluZyB0aGUgY29udGVudCBwcm92aWRlciBhcyBhIGxpc3RlbmVyIHRvIGNoYW5nZXMgb24KLQkgKiB0aGUgbmV3IGlucHV0ICh1c2luZyBtb2RlbC1zcGVjaWZpYyBtZWFucyksIGFuZCBkZXJlZ2lzdGVyaW5nIHRoZSB2aWV3ZXIgZnJvbSB0aGUgb2xkIGlucHV0LgotCSAqIEluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zLCB0aGUgY29udGVudCBwcm92aWRlciBwcm9wYWdhdGVzIHRoZSBjaGFuZ2VzIHRvIHRoZQotCSAqIHZpZXdlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBvbGRJbnB1dAotCSAqICAgICAgICAgICAgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyIGRpZCBub3QgcHJldmlvdXNseQotCSAqICAgICAgICAgICAgaGF2ZSBhbiBpbnB1dAotCSAqIEBwYXJhbSBuZXdJbnB1dAotCSAqICAgICAgICAgICAgdGhlIG5ldyBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyIGRvZXMgbm90IGhhdmUgYW4gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkIGJ5IGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4KLQkgKiBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGEgbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4gSWYgdGhlIHByb3BlcnR5Ci0JICogbWVudGlvbmVkIGluIHRoZSB1cGRhdGUgZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwgdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdAotCSAqICAgICAgICAgd291bGQgYmUgdW5hZmZlY3RlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4gSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90Ci0JICogcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0Fic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM0YzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiTWV0aG9kRWxlbWVudENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5EaXNwbGF5VXRpbGl0eTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIE1FX0VKQl9TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRNZXRob2RFbGVtZW50X0VudGVycHJpc2VCZWFuKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgSkFSX0FTU0VNQkxZX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgRUNPUkVfQkVBTl9OQU1FID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKTsgLy9FTkFNRURfRUxFTUVOVF9fTkFNRQotCXByb3RlY3RlZCBDb21wYXJhdG9yIG1lQ29tcGFyYXRvcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jvb3QgPSB0cnVlOwotCi0JcHVibGljIGNsYXNzIEVKQk1ldGhvZEl0ZW0gewotCQlwdWJsaWMgRU9iamVjdCByZWZPYmplY3Q7Ci0JCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBlamI7Ci0KLQkJcHVibGljIEVKQk1ldGhvZEl0ZW0oRU9iamVjdCBhUmVmT2JqZWN0LCBFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQkJcmVmT2JqZWN0ID0gYVJlZk9iamVjdDsKLQkJCWVqYiA9IGFuRUpCOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIGJvb2xlYW4gcm9vdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWlzUm9vdCA9IHJvb3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RW50ZXJwcmlzZUJlYW5Db21wYXJhdG9yKCkgewotCQlyZXR1cm4gRUpCTmFtZUNvbXBhcmF0b3Iuc2luZ2xldG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0TWV0aG9kRWxlbWVudENvbXBhcmF0b3IoKSB7Ci0JCWlmIChtZUNvbXBhcmF0b3IgPT0gbnVsbCkKLQkJCW1lQ29tcGFyYXRvciA9IG5ldyBFamJNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpOwotCQlyZXR1cm4gbWVDb21wYXJhdG9yOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pCi0JCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudHMoKEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKSBwYXJlbnRFbGVtZW50KTsKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldE1ldGhvZEVsZW1lbnRzKEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtIGVqYkl0ZW0pIHsKLQkJRU9iamVjdCByZWZPYmplY3QgPSBlamJJdGVtLnJlZk9iamVjdDsKLQkJaWYgKHJlZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCUxpc3QgZWxlbWVudHMgPSBnZXRNZXRob2RFbGVtZW50cyhyZWZPYmplY3QsIGVqYkl0ZW0uZWpiKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gZWxlbWVudHMudG9BcnJheSgpOwotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAxKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJQXJyYXlzLnNvcnQocmVzdWx0LCBnZXRNZXRob2RFbGVtZW50Q29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0IGFSZWZPYmplY3QsIEVudGVycHJpc2VCZWFuIGFuRUpCKTsKLQotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRFbnRlcnByaXNlQmVhbnMoRU9iamVjdCBwYXJlbnRFbGVtZW50LCBMaXN0IHNvbWVNZXRob2RFbGVtZW50cykgewotCQlpZiAoc29tZU1ldGhvZEVsZW1lbnRzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQlTZXQgZWpicyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUVudGVycHJpc2VCZWFuIGVqYiA9IG51bGw7Ci0JCU1ldGhvZEVsZW1lbnQgbWUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbWVNZXRob2RFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJbWUgPSAoTWV0aG9kRWxlbWVudCkgc29tZU1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWVqYiA9IG1lLmdldEVudGVycHJpc2VCZWFuKCk7Ci0JCQlpZiAoZWpiICE9IG51bGwpCi0JCQkJZWpicy5hZGQoZWpiKTsKLQkJfQotCQlPYmplY3RbXSByZXN1bHQgPSBlamJzLnRvQXJyYXkoKTsKLQkJaWYgKHJlc3VsdC5sZW5ndGggIT0gMSkKLQkJCUFycmF5cy5zb3J0KHJlc3VsdCwgZ2V0RW50ZXJwcmlzZUJlYW5Db21wYXJhdG9yKCkpOwotCQllamIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJZWpiID0gKEVudGVycHJpc2VCZWFuKSByZXN1bHRbaV07Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRUpCTWV0aG9kSXRlbShwYXJlbnRFbGVtZW50LCBlamIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEFzc2VtYmx5RGVzY3JpcHRvciBnZXRBc3NlbWJseURlc2NyaXB0b3IoRW50ZXJwcmlzZUJlYW4gZWpiKSB7Ci0JCWlmIChlamIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWpiLmdldEVqYkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIChUcmVlVmlld2VyKSB2aWV3ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRyZWVWaWV3ZXIoT2JqZWN0IG9iaikgewotCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQlEaXNwbGF5VXRpbGl0eS5hc3luY0V4ZWMoY3JlYXRlUmVmcmVzaFRyZWVSdW5uYWJsZShvYmopKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVHJlZVZpZXdlcigpIHsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJRGlzcGxheVV0aWxpdHkuYXN5bmNFeGVjKGNyZWF0ZVJlZnJlc2hUcmVlUnVubmFibGUobnVsbCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJcmVmcmVzaFRyZWVWaWV3ZXIobWUuZUNvbnRhaW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVHJlZVZpZXdlcihMaXN0IGFMaXN0KSB7Ci0JCWlmIChhTGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCXJlZnJlc2hUcmVlVmlld2VyKChNZXRob2RFbGVtZW50KSBhTGlzdC5nZXQoMCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVHJlZVZpZXdlcihmaW5hbCBNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRGlzcGxheVV0aWxpdHkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIGZpbmRNZXRob2RJdGVtKCkgc2hvdWxkIGJlIHJ1biBpbiBhIERpc3BsYXkgdGhyZWFkCi0JCQkJRUpCTWV0aG9kSXRlbSBpdGVtID0gZmluZE1ldGhvZEl0ZW0obWUpOwotCQkJCWlmIChpdGVtICE9IG51bGwpCi0JCQkJCURpc3BsYXlVdGlsaXR5LmFzeW5jRXhlYyhjcmVhdGVBZGRJdGVtVHJlZVJ1bm5hYmxlKGl0ZW0sIG1lKSk7Ci0JCQkJZWxzZQotCQkJCQlyZWZyZXNoVHJlZVZpZXdlcihtZS5lQ29udGFpbmVyKCkpOwotCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21UcmVlVmlld2VyKGZpbmFsIEVPYmplY3QgcGFyZW50LCBmaW5hbCBNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRGlzcGxheVV0aWxpdHkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUVudGVycHJpc2VCZWFuIGVqYiA9IG1lLmdldEVudGVycHJpc2VCZWFuKCk7Ci0JCQkJRUpCTWV0aG9kSXRlbSBpdGVtID0gZmluZE1ldGhvZEl0ZW0oZWpiLCBwYXJlbnQpOwotCQkJCWlmIChpdGVtICE9IG51bGwpCi0JCQkJCXJlZnJlc2hUcmVlVmlld2VyKGl0ZW0pOwotCQkJCWVsc2UKLQkJCQkJcmVmcmVzaFRyZWVWaWV3ZXIoKE9iamVjdCkgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBFSkJNZXRob2RJdGVtIGZpbmRNZXRob2RJdGVtKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJcmV0dXJuIGZpbmRNZXRob2RJdGVtKG1lLmdldEVudGVycHJpc2VCZWFuKCksIG1lLmVDb250YWluZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVKQk1ldGhvZEl0ZW0gZmluZE1ldGhvZEl0ZW0oRW50ZXJwcmlzZUJlYW4gZWpiLCBFT2JqZWN0IHBhcmVudE1ldGhvZCkgewotCQlUcmVlSXRlbVtdIGl0ZW1zID0gZ2V0VHJlZVZpZXdlcigpLmdldFRyZWUoKS5nZXRJdGVtcygpOwotCQlyZXR1cm4gZmluZE1ldGhvZEl0ZW0oZWpiLCBwYXJlbnRNZXRob2QsIGl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUpCTWV0aG9kSXRlbSBmaW5kTWV0aG9kSXRlbShFbnRlcnByaXNlQmVhbiBlamIsIEVPYmplY3QgcGFyZW50TWV0aG9kLCBUcmVlSXRlbVtdIGl0ZW1zKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBudWxsOwotCQlPYmplY3QgZGF0YSA9IG51bGw7Ci0JCUVKQk1ldGhvZEl0ZW0gbWV0aG9kSXRlbSA9IG51bGwsIGZvdW5kID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaXRlbSA9IGl0ZW1zW2ldOwotCQkJZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBFSkJNZXRob2RJdGVtKSB7Ci0JCQkJbWV0aG9kSXRlbSA9IChFSkJNZXRob2RJdGVtKSBkYXRhOwotCQkJCWlmIChtZXRob2RJdGVtLmVqYiA9PSBlamIgJiYgbWV0aG9kSXRlbS5yZWZPYmplY3QgPT0gcGFyZW50TWV0aG9kKQotCQkJCQlyZXR1cm4gbWV0aG9kSXRlbTsKLQkJCX0KLQkJCWZvdW5kID0gZmluZE1ldGhvZEl0ZW0oZWpiLCBwYXJlbnRNZXRob2QsIGl0ZW0uZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZm91bmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIjbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClPYmplY3QsCi0JICogICAgICBpbnQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmllcikgewotCQlpZiAobm90aWZpZXIuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFU09MVkUpCi0JCQlyZXR1cm47Ci0JCWVsc2UgaWYgKG5vdGlmaWVyLmdldE9sZFZhbHVlKCkgaW5zdGFuY2VvZiBDTVBBdHRyaWJ1dGUgJiYgbm90aWZpZXIuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChub3RpZmllci5nZXRGZWF0dXJlKCkgPT0gTUVfRUpCX1NGKSB7Ci0JCQlyZWZyZXNoVHJlZVZpZXdlcigoTWV0aG9kRWxlbWVudCkgbm90aWZpZXIuZ2V0Tm90aWZpZXIoKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IEVDT1JFX0JFQU5fTkFNRSkgewotCQkJcmVmcmVzaFRyZWVWaWV3ZXIoKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmIChnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpID09IG5vdGlmaWVyLmdldEZlYXR1cmUoKSkgewotCQkJaWYgKG5vdGlmaWVyLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpCi0JCQkJYWRkVG9UcmVlVmlld2VyKChNZXRob2RFbGVtZW50KSBub3RpZmllci5nZXROZXdWYWx1ZSgpKTsKLQkJCWVsc2UgaWYgKG5vdGlmaWVyLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUpCi0JCQkJcmVtb3ZlRnJvbVRyZWVWaWV3ZXIoKEVPYmplY3QpIG5vdGlmaWVyLmdldE5vdGlmaWVyKCksIChNZXRob2RFbGVtZW50KSBub3RpZmllci5nZXRPbGRWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmIChub3RpZmllci5nZXRGZWF0dXJlKCkgPT0gSkFSX0FTU0VNQkxZX1NGICYmIGlzUm9vdCkgewotCQkJdXBkYXRlVHJlZUlucHV0KG5vdGlmaWVyLmdldE5ld1ZhbHVlKCkpOwotCQl9IGVsc2UgaWYgKG5vdGlmaWVyLmdldEZlYXR1cmUoKSA9PSBnZXRNZXRob2RFbGVtZW50c0NvbnRhaW5lclJlZmVyZW5jZSgpKQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVHJlZUlucHV0KGZpbmFsIE9iamVjdCB0YXJnZXQpIHsKLQkJRGlzcGxheVV0aWxpdHkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCi0JCQkJZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KHRhcmdldCk7IC8vcmVzZXQgdGhlIGlucHV0Ci0JCQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2godGFyZ2V0KTsKLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGNyZWF0ZUFkZEl0ZW1UcmVlUnVubmFibGUoZmluYWwgT2JqZWN0IHBhcmVudCwgZmluYWwgTWV0aG9kRWxlbWVudCBtZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0VHJlZVZpZXdlcigpLmFkZChwYXJlbnQsIG1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGNyZWF0ZVJlZnJlc2hUcmVlUnVubmFibGUoZmluYWwgT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJCQlnZXRUcmVlVmlld2VyKCkucmVmcmVzaCh0YXJnZXQpOwotCQkJCWVsc2UKLQkJCQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9CZWFuQ2xhc3NQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9CZWFuQ2xhc3NQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE0MmViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIxLzIwMDEgMTI6Mjk6NDkgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXN1cGVyKGFuRUpCKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xMS8yMDAxIDE6NTM6MDkgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIGdldEVqYigpLmdldEVqYkNsYXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVybGF5S2V5KCkgewotCQlyZXR1cm4gImVqYl9tb2R1bGVfb3ZyIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFSkJfQ2xhc3NfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkVKQiBDbGFzcyIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FSkJVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0VKQlVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1ODc4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0VKQlVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIEVKQlVJTWVzc2FnZXMgZXh0ZW5kcyBNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9MT0FEX0VSUk9SID0gIjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1BST0pFQ1RfV0laX1RJVExFID0gIjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1ZFUlNJT05fTEJMID0gIjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1BST0pFQ1RfTUFJTl9QR19USVRMRSA9ICIzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9QUk9KRUNUX01BSU5fUEdfREVTQyA9ICI0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9JTVBPUlRfTUFJTl9QR19ERVNDID0gIjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0lNUE9SVF9NQUlOX1BHX1RJVExFID0gIjYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0pBUl9GSUxFX0xCTCA9ICI3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9QUk9KRUNUX0xCTCA9ICI4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9FWFBPUlRfTUFJTl9QR19USVRMRSA9ICI5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9FWFBPUlRfTUFJTl9QR19ERVNDID0gIjEwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9DbGllbnRfVGl0bGUgPSAiMTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NsaWVudF9EZXNjID0gIjEyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENsaWVudF9KQVJfVVJJID0gIjEzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFByb2plY3RfbmFtZSA9ICIxNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQcm9qZWN0X2xvY2F0aW9uID0gIjE1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9Qcm9qZWN0ID0gIjE2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9CRUFOX09OTFkgPSAiMTciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVsZXRlX0JlYW5fQ2xhc3Nlc19VSSA9ICIxOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEZWxldGVfQWNjZXNzX0JlYW4gPSAiMTkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVsZXRlX0RlcGxveWVkX0NvZGUgPSAiMjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU2VsZWN0X0FsbF9VSSA9ICIyMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEZXNlbGVjdF9BbGxfVUkgPSAiMjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVGhlX3NlbGVjdGVkX0VudGVycHJpc2VfQmUgPSAiMjMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVsZXRlID0gIjI0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENhbm5vdF9kZWxldGVfRW50ZXJwcmlzZV9CID0gIjI1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENhbm5vdF9kZWxldGVfYmVhbiA9ICIyNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEZWxldGVfRW50ZXJwcmlzZV9CZWFucyA9ICIyNyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEZWxldGVfT3B0aW9uc19RdWVyeSA9ICIyNyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIEVKQlVJTWVzc2FnZXMgSU5TVEFOQ0UgPSBuZXcgRUpCVUlNZXNzYWdlcygpOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgRUpCVUlNZXNzYWdlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSU5TVEFOQ0UuZG9HZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmRvR2V0UmVzb3VyY2VTdHJpbmcoa2V5LCBhcmdzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5NZXNzYWdlcyNpbml0aWFsaXplQnVuZGxlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImoyZWVfZWpiX3VpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0V4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0V4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTdiNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci0KLQotcHVibGljIGNsYXNzIEV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgRVhDTFVERV9NRV9TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRFeGNsdWRlTGlzdF9NZXRob2RFbGVtZW50cygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBBRF9FTF9TRiA9IEVqYkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRBc3NlbWJseURlc2NyaXB0b3JfRXhjbHVkZUxpc3QoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBFQ09SRV9CRUFOX05BTUUgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpOyAvL0VOQU1FRF9FTEVNRU5UX19OQU1FCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHJvb3QKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIEV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIHJvb3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHJvb3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFeGNsdWRlc0xpc3RDb250ZW50UHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RW50ZXJwcmlzZUJlYW5zKEV4Y2x1ZGVMaXN0IGxpc3QpIHsKLQkJTGlzdCBtZXMgPSBsaXN0LmdldE1ldGhvZEVsZW1lbnRzKCk7Ci0JCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMobGlzdCwgbWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzKEVPYmplY3QsIEVudGVycHJpc2VCZWFuKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1ldGhvZEVsZW1lbnRzKEVPYmplY3QgYVJlZk9iamVjdCwgRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJaWYgKCEoYVJlZk9iamVjdCBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlFeGNsdWRlTGlzdCBwYXJlbnRMaXN0ID0gKEV4Y2x1ZGVMaXN0KSBhUmVmT2JqZWN0OwotCQlpZiAocGFyZW50TGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBwYXJlbnRMaXN0LmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JCUV4Y2x1ZGVMaXN0IGxpc3QgPSBudWxsOwotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRUpCSmFyKSB7Ci0JCQlFSkJKYXIgamFyID0gKEVKQkphcikgaW5wdXRFbGVtZW50OwotCQkJaWYgKGphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSAhPSBudWxsKQotCQkJCWxpc3QgPSBqYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkuZ2V0RXhjbHVkZUxpc3QoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucyhsaXN0KTsKLQkJfQotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQXNzZW1ibHlEZXNjcmlwdG9yKSB7Ci0JCQlsaXN0ID0gKChBc3NlbWJseURlc2NyaXB0b3IpIGlucHV0RWxlbWVudCkuZ2V0RXhjbHVkZUxpc3QoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucyhsaXN0KTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5wcm92aWRlcnMuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBFeGNsdWRlTGlzdCkKLQkJCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMoKEV4Y2x1ZGVMaXN0KSBwYXJlbnRFbGVtZW50KTsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnByb3ZpZGVycy5BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRXhjbHVkZUxpc3QpCi0JCQlyZXR1cm4gISgoRXhjbHVkZUxpc3QpIGVsZW1lbnQpLmdldE1ldGhvZEVsZW1lbnRzKCkuaXNFbXB0eSgpOwotCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpZXIpIHsKLQkJaWYgKChub3RpZmllci5nZXRGZWF0dXJlKCkgPT0gRVhDTFVERV9NRV9TRiAmJiBub3RpZmllci5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgRXhjbHVkZUxpc3QpIHx8IG5vdGlmaWVyLmdldEZlYXR1cmUoKSA9PSBFQ09SRV9CRUFOX05BTUUpIHsKLQkJCWlmIChub3RpZmllci5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVTT0xWRSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoaXNSb290KQotCQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCQllbHNlCi0JCQkJcmVmcmVzaFRyZWVWaWV3ZXIobm90aWZpZXIuZ2V0Tm90aWZpZXIoKSk7Ci0JCX0KLQkJaWYgKG5vdGlmaWVyLmdldE9sZFZhbHVlKCkgaW5zdGFuY2VvZiBDTVBBdHRyaWJ1dGUgJiYgbm90aWZpZXIuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkgfHwgbm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IGdldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkpCi0JCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gRVhDTFVERV9NRV9TRjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5wcm92aWRlcnMuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gQURfRUxfU0Y7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRUpCSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1OTM5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXI7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgZm9yIEVKQiBncm91cHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyb3VwZWRFSkJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKMkVFSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBHcm91cGVkRUpCSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODZjY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUl0ZW1Qcm92aWRlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgU2FjaGluIFAgUGF0ZWwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyIGV4dGVuZHMgRUpCSmFySXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIgc2Vzc2lvblByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIgZW50aXR5UHJvdmlkZXIgPSBudWxsOwotCXByaXZhdGUgR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIgbWVzc2FnZVByb3ZpZGVyID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBzZXNzaW9uVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGVudGl0eVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBtZXNzYWdlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTiA9IEVKQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9IEVKQlVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMSIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSBFSkJVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJHcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyX1VJXzIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8JTm9ybWFsbHkgdGhlcmUgaXMgb25lIGluc3RhbmNlIG9mIGFuIGl0ZW0gcHJvdmlkZXIgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhlIG9iamVjY3QKLQkvLwlpbiB0aGUgdHJlZS4gVGhlIGl0ZW0gcHJvdmlkZXIgd291bGQgYmUgc3RhdGVsZXNzLiBIb3dldmVyLCBiZWNhdXNlIHdlIGFyZSBkb2luZyB0cmlja3MKLQkvLwloZXJlLCB3ZSBhcmUga2VlcGluZyB0cmFjayBvZiBhbGwgaXRlbXMgdGhpcyBwcm92aWRlciBtYW5hZ2VzLiBUaGUga2V5IGluIHRoZSBtYXAgaXMgdGhlCi0JLy8Jb2JqZWN0IChFSkJKYXIpLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBjaGlsZHJlbiBub2RlcyB0aGF0IHdlIGluc2VydGVkCi0KLQlwcm90ZWN0ZWQgTWFwIGNoaWxkcmVuID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGJvb2xlYW4gc2hvd0Fzc2VtYmx5RGVzY3JpcHRvcjsKLQlwcml2YXRlIGJvb2xlYW4gaXNEaXNwb3Npbmc7Ci0KLQlwdWJsaWMgR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgYm9vbGVhbiBzaG93QXNzZW1ibHlEZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5zaG93QXNzZW1ibHlEZXNjcmlwdG9yID0gc2hvd0Fzc2VtYmx5RGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gaW5pdENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChzaG93QXNzZW1ibHlEZXNjcmlwdG9yKSB7Ci0JCQlpZiAoKChFSkJKYXIpIG9iamVjdCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkKCgoRUpCSmFyKSBvYmplY3QpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGluaXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKSBvYmplY3Q7Ci0JCUxpc3QgYWxsUm9vdEJlYW5zID0gZ2V0QWxsUm9vdEJlYW5zKGVqYkphcik7Ci0KLQkJYm9vbGVhbiBpczIwSmFyID0gaXMyMEphcihlamJKYXIpOwotCi0JCUxpc3QgbG9jYWxDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoNSk7Ci0KLQkJTGlzdCBlbnRpdHlCZWFucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBzZXNzaW9uQmVhbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWVzc2FnZUJlYW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWNhdGFnb3JpemVCZWFucyhhbGxSb290QmVhbnMsIGVudGl0eUJlYW5zLCBzZXNzaW9uQmVhbnMsIG1lc3NhZ2VCZWFucyk7Ci0KLQkJLy9FTkFCTEUgRk9SOiBOT1QgVE8gU0hPVyBFTVBUWSBHUk9VUFMKLQkJLy9pZiAoc2Vzc2lvbkJlYW5zLnNpemUoKSA+IDApIHsKLQkJaWYgKHNlc3Npb25UYWJsZS5nZXQoZWpiSmFyKSA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBuZXcgaXRlbSBwcm92aWRlciBpbnN0YW5jZQotCQkJc2Vzc2lvblByb3ZpZGVyID0gbmV3IEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBudWxsLCBnZXRJbWFnZShTRVNTSU9OKSwgb2JqZWN0LCBzZXNzaW9uQmVhbnMpOwotCQkJc2Vzc2lvblRhYmxlLnB1dChlamJKYXIsIHNlc3Npb25Qcm92aWRlcik7Ci0JCQlsb2NhbENoaWxkcmVuLmFkZChzZXNzaW9uUHJvdmlkZXIpOwotCQl9IGVsc2UgewotCQkJLy91c2UgZXhpc3RpbmcgaW5zdGFuY2UgZnJvbSB0YWJsZQotCQkJbG9jYWxDaGlsZHJlbi5hZGQoc2Vzc2lvblRhYmxlLmdldChlamJKYXIpKTsKLQkJfQotCQkvL30KLQotCQkvL0VOQUJMRSBGT1I6IE5PVCBUTyBTSE9XIEVNUFRZIEdST1VQUwotCQkvL2lmIChlbnRpdHlCZWFucy5zaXplKCkgPiAwKSB7Ci0JCWlmIChlbnRpdHlUYWJsZS5nZXQoZWpiSmFyKSA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBuZXcgaXRlbSBwcm92aWRlciBpbnN0YW5jZQotCQkJZW50aXR5UHJvdmlkZXIgPSBuZXcgR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgZ2V0SW1hZ2UoRU5USVRZKSwgb2JqZWN0LCBlbnRpdHlCZWFucyk7Ci0JCQllbnRpdHlUYWJsZS5wdXQoZWpiSmFyLCBlbnRpdHlQcm92aWRlcik7Ci0JCQlsb2NhbENoaWxkcmVuLmFkZChlbnRpdHlQcm92aWRlcik7Ci0JCX0gZWxzZSB7Ci0JCQkvL3VzZSBleGlzdGluZyBpbnN0YW5jZSBmcm9tIHRhYmxlCi0JCQlsb2NhbENoaWxkcmVuLmFkZChlbnRpdHlUYWJsZS5nZXQoZWpiSmFyKSk7Ci0JCX0KLQkJLy99Ci0KLQkJLy9FTkFCTEUgRk9SOiBOT1QgVE8gU0hPVyBFTVBUWSBHUk9VUFMKLQkJLy9pZiAoaXMyMEphciAmJiBtZXNzYWdlQmVhbnMuc2l6ZSgpID4gMCkgewotCQlpZiAoaXMyMEphcikgewotCQkJaWYgKG1lc3NhZ2VUYWJsZS5nZXQoZWpiSmFyKSA9PSBudWxsKSB7Ci0JCQkJLy9jcmVhdGUgbmV3IGl0ZW0gcHJvdmlkZXIgaW5zdGFuY2UKLQkJCQltZXNzYWdlUHJvdmlkZXIgPSBuZXcgR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG51bGwsIGdldEltYWdlKE1FU1NBR0UpLCBvYmplY3QsIG1lc3NhZ2VCZWFucyk7Ci0JCQkJbWVzc2FnZVRhYmxlLnB1dChlamJKYXIsIG1lc3NhZ2VQcm92aWRlcik7Ci0JCQkJbG9jYWxDaGlsZHJlbi5hZGQobWVzc2FnZVByb3ZpZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy91c2UgZXhpc3RpbmcgaW5zdGFuY2UgZnJvbSB0YWJsZQotCQkJCWxvY2FsQ2hpbGRyZW4uYWRkKG1lc3NhZ2VUYWJsZS5nZXQoZWpiSmFyKSk7Ci0JCQl9Ci0JCX0KLQkJLy99Ci0KLQkJY2hpbGRyZW4ucHV0KG9iamVjdCwgbG9jYWxDaGlsZHJlbik7Ci0KLQkJcmV0dXJuIGxvY2FsQ2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldEFsbFJvb3RCZWFucyhFSkJKYXIgZWpiSmFyKSB7Ci0JCXJldHVybiBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2F0YWdvcml6ZUJlYW5zKExpc3QgYWxsUm9vdEJlYW5zLCBMaXN0IGVudGl0eUJlYW5zLCBMaXN0IHNlc3Npb25CZWFucywgTGlzdCBtZXNzYWdlQmVhbnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxSb290QmVhbnMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmICgoKEVudGVycHJpc2VCZWFuKSBhbGxSb290QmVhbnMuZ2V0KGkpKS5pc1Nlc3Npb24oKSkgewotCQkJCXNlc3Npb25CZWFucy5hZGQoYWxsUm9vdEJlYW5zLmdldChpKSk7Ci0JCQl9IGVsc2UgaWYgKCgoRW50ZXJwcmlzZUJlYW4pIGFsbFJvb3RCZWFucy5nZXQoaSkpLmlzRW50aXR5KCkpIHsKLQkJCQllbnRpdHlCZWFucy5hZGQoYWxsUm9vdEJlYW5zLmdldChpKSk7Ci0JCQl9IGVsc2UgaWYgKCgoRW50ZXJwcmlzZUJlYW4pIGFsbFJvb3RCZWFucy5nZXQoaSkpLmlzTWVzc2FnZURyaXZlbigpKSB7Ci0JCQkJbWVzc2FnZUJlYW5zLmFkZChhbGxSb290QmVhbnMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyBwcm90ZWN0ZWQgR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIgZ2V0U2Vzc2lvbk5vZGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyKSBzZXNzaW9uVGFibGUuZ2V0KG9iamVjdCk7Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBHcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyIGdldEVudGl0eU5vZGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIpIGVudGl0eVRhYmxlLmdldChvYmplY3QpOwotCX0KLQotCXN0YXRpYyBwcm90ZWN0ZWQgR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIgZ2V0TWVzc2FnZU5vZGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyKSBtZXNzYWdlVGFibGUuZ2V0KG9iamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZS5lcXVhbHMoU0VTU0lPTikpCi0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgic2Vzc2lvbkJlYW5fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoTUVTU0FHRSkpCi0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibWVzc2FnZV9iZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHR5cGUuZXF1YWxzKEVOVElUWSkpCi0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZW50aXR5YmVhbl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXMyMEphcihFSkJKYXIgZWpiSmFyKSB7Ci0JCXN3aXRjaCAoZWpiSmFyLmdldFZlcnNpb25JRCgpKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzBfSUQgOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEIDoKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQgOgotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVIgJiYgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkgPT0gdGhpcyAmJiAhaXNEaXNwb3NpbmcpIHsKLQkJCXJlbW92ZVRhcmdldChub3RpZmljYXRpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSkgewotCQkJSjJFRUl0ZW1Qcm92aWRlciBwcm92aWRlciA9IGJlYW5zQ2hhbmdlZCgoRUpCSmFyKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpLCBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXRQb3NpdGlvbigpKTsKLQotCQkJLy9FSkIncyBncm91cCBoYXMgbm90IGJlZW4gYWRkZWQgeWV0LCBuZWVkIHRvIGFkZCBncm91cCB0byB0cmVlIGJlZm9yZSBFSkIgY2FuIGJlIGFkZGVkCi0JCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uQURELCBudWxsLCBnZXRFSkJJdGVtUHJvdmlkZXIoKEVudGVycHJpc2VCZWFuKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSksIDEpOwotCQkJCU5vdGlmaWNhdGlvbldyYXBwZXIgbm90aWZpY2F0aW9uV3JhcHBlciA9IG5ldyBOb3RpZmljYXRpb25XcmFwcGVyKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBtc2cpOwotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbldyYXBwZXIpOwotCQkJCXByb3ZpZGVyID0gYmVhbnNDaGFuZ2VkKChFSkJKYXIpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCksIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldFBvc2l0aW9uKCkpOwotCQkJfQotCi0JCQkvL0ZpcmUgbm90aWZpY2F0aW9uIGZvciBFSkIgYWRkIG9yIHJlbW92ZQotCQkJTm90aWZpY2F0aW9uV3JhcHBlciBub3RpZmljYXRpb25XcmFwcGVyID0gbmV3IE5vdGlmaWNhdGlvbldyYXBwZXIocHJvdmlkZXIsIG5vdGlmaWNhdGlvbik7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25XcmFwcGVyKTsKLQotCQkJLy9FTkFCTEUgRk9SOiBOT1QgVE8gU0hPVyBFTVBUWSBHUk9VUFMKLQkJCS8vSWYgR3JvdXAgaXMgZW1wdHkgcmVtb3ZlIHRoZSBncm91cAotCQkJLyoKLQkJCSAqIGlmIChwcm92aWRlciAhPSBudWxsICYmIHByb3ZpZGVyLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDApIHsgTm90aWZpY2F0aW9uIG1zZyA9IG5ldwotCQkJICogTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uUkVNT1ZFLCBwcm92aWRlciwgbnVsbCwgMSk7IG5vdGlmaWNhdGlvbldyYXBwZXIgPSBuZXcKLQkJCSAqIE5vdGlmaWNhdGlvbldyYXBwZXIobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIG1zZyk7Ci0JCQkgKiBmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25XcmFwcGVyKTsKLQkJCSAqIAotCQkJICogLy9Hcm91cCBpcyByZW1vdmVkIHNvIGZsdXNoIG91dCB0YWJsZSBlbnRyeSBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZgotCQkJICogR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIpIHsgc2Vzc2lvblRhYmxlLnJlbW92ZShub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkgKiBwcm92aWRlciA9IG51bGw7IH0gZWxzZSBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBHcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkgKiBlbnRpdHlUYWJsZS5yZW1vdmUobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOyBwcm92aWRlciA9IG51bGw7IH0gZWxzZSBpZiAocHJvdmlkZXIKLQkJCSAqIGluc3RhbmNlb2YgR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIpIHsKLQkJCSAqIG1lc3NhZ2VUYWJsZS5yZW1vdmUobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOyBwcm92aWRlciA9IG51bGw7IH0KLQkJCSAqIAotCQkJICogLy9JZiBhbGwgZ3JvdXBzIGFyZSByZW1vdmVkIHJlbW92ZSB0aGUgZXh0ZW5kZWQgY2hpbGRyZW4gTGlzdCBhbGxDaGlsZHJlbiA9IG5ldwotCQkJICogQXJyYXlMaXN0KHRoaXMuZ2V0Q2hpbGRyZW4oKEVKQkphcikgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKTsKLQkJCSAqIGlmKHNlc3Npb25UYWJsZS5nZXQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IG51bGwgJiYKLQkJCSAqIGVudGl0eVRhYmxlLmdldChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gbnVsbCAmJgotCQkJICogbWVzc2FnZVRhYmxlLmdldChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gbnVsbCkgeyBmb3IoaW50IGkgPSAwOyBpIDwKLQkJCSAqIGFsbENoaWxkcmVuLnNpemUoKTsgaSsrKSB7IE5vdGlmaWNhdGlvbiBtZXNzYWdlID0gbmV3Ci0JCQkgKiBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5SRU1PVkUsIGFsbENoaWxkcmVuLmdldChpKSwgbnVsbCwgMSk7Ci0JCQkgKiBub3RpZmljYXRpb25XcmFwcGVyID0gbmV3IE5vdGlmaWNhdGlvbldyYXBwZXIobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIG1lc3NhZ2UpOwotCQkJICogZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uV3JhcHBlcik7IH0gdGhpcy5nZXRDaGlsZHJlbigoRUpCSmFyKQotCQkJICogbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLmNsZWFyKCk7IH0gfQotCQkJICovCi0JCX0gZWxzZSB7Ci0JCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSjJFRUl0ZW1Qcm92aWRlciBiZWFuc0NoYW5nZWQoRUpCSmFyIGVqYkphciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJSjJFRUl0ZW1Qcm92aWRlciBwcm92aWRlciA9IGdldEl0ZW1Qcm92aWRlcihlamJKYXIsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gZ3JhbmRDaGlsZHJlbiA9IHByb3ZpZGVyLmdldENoaWxkcmVuKCk7Ci0KLQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDogewotCQkJCQlpZiAoIWdyYW5kQ2hpbGRyZW4uY29udGFpbnMobmV3VmFsdWUpKQotCQkJCQkJZ3JhbmRDaGlsZHJlbi5hZGQobmV3VmFsdWUpOwotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6IHsKLQkJCQkJZ3JhbmRDaGlsZHJlbi5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6IHsKLQkJCQkJZ3JhbmRDaGlsZHJlbi5yZW1vdmUob2xkVmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOiB7Ci0JCQkJCWdyYW5kQ2hpbGRyZW4ucmVtb3ZlQWxsKChDb2xsZWN0aW9uKSBvbGRWYWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vR3JvdXBlZFByb3ZpZGVyIGZvciBuZXcgYmVhbiBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIG9uZS4KLQkJCUxpc3QgYWxsUm9vdEJlYW5zID0gZ2V0QWxsUm9vdEJlYW5zKGVqYkphcik7Ci0KLQkJCUxpc3QgZW50aXR5QmVhbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IHNlc3Npb25CZWFucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgbWVzc2FnZUJlYW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQljYXRhZ29yaXplQmVhbnMoYWxsUm9vdEJlYW5zLCBlbnRpdHlCZWFucywgc2Vzc2lvbkJlYW5zLCBtZXNzYWdlQmVhbnMpOwotCi0JCQlpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTZXNzaW9uKSB7Ci0JCQkJc2Vzc2lvblByb3ZpZGVyID0gbmV3IEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBudWxsLCBnZXRJbWFnZShTRVNTSU9OKSwgZWpiSmFyLCBzZXNzaW9uQmVhbnMpOwotCQkJCXNlc3Npb25UYWJsZS5wdXQoZWpiSmFyLCBzZXNzaW9uUHJvdmlkZXIpOwotCQkJfSBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCWVudGl0eVByb3ZpZGVyID0gbmV3IEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG51bGwsIGdldEltYWdlKEVOVElUWSksIGVqYkphciwgZW50aXR5QmVhbnMpOwotCQkJCWVudGl0eVRhYmxlLnB1dChlamJKYXIsIGVudGl0eVByb3ZpZGVyKTsKLQkJCX0gZWxzZSBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuKSB7Ci0JCQkJbWVzc2FnZVByb3ZpZGVyID0gbmV3IEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBudWxsLCBnZXRJbWFnZShNRVNTQUdFKSwgZWpiSmFyLCBtZXNzYWdlQmVhbnMpOwotCQkJCW1lc3NhZ2VUYWJsZS5wdXQoZWpiSmFyLCBtZXNzYWdlUHJvdmlkZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIEoyRUVJdGVtUHJvdmlkZXIgZ2V0RUpCSmFySXRlbVByb3ZpZGVyKEVKQkphciBlamJKYXIsIE9iamVjdCBiZWFuKSB7Ci0JCUoyRUVJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQlpZiAoZWpiSmFyICE9IG51bGwgJiYgYmVhbiAhPSBudWxsKSB7Ci0JCQlpZiAoYmVhbiBpbnN0YW5jZW9mIFNlc3Npb24pIHsKLQkJCQlwcm92aWRlciA9IGdldFNlc3Npb25Ob2RlKGVqYkphcik7Ci0JCQl9IGVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlwcm92aWRlciA9IGdldEVudGl0eU5vZGUoZWpiSmFyKTsKLQkJCX0gZWxzZSBpZiAoYmVhbiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW4pIHsKLQkJCQlwcm92aWRlciA9IGdldE1lc3NhZ2VOb2RlKGVqYkphcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgSjJFRUl0ZW1Qcm92aWRlciBnZXRFSkJJdGVtUHJvdmlkZXIoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlpZiAoYmVhbiAhPSBudWxsKSB7Ci0JCQlFSkJKYXIgZWpiSmFyID0gYmVhbi5nZXRFamJKYXIoKTsKLQkJCXJldHVybiBnZXRFSkJKYXJJdGVtUHJvdmlkZXIoZWpiSmFyLCBiZWFuKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSjJFRUl0ZW1Qcm92aWRlciBnZXRJdGVtUHJvdmlkZXIoRUpCSmFyIGVqYkphciwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RUpCSmFySXRlbVByb3ZpZGVyKGVqYkphciwgbmV3VmFsdWUpOwotCQllbHNlIGlmIChvbGRWYWx1ZSAhPSBudWxsKQotCQkJcmV0dXJuIGdldEVKQkphckl0ZW1Qcm92aWRlcihlamJKYXIsIG9sZFZhbHVlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUm9vdEJlYW4oRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlMaXN0IGFsbFJvb3RCZWFucyA9IGdldEFsbFJvb3RCZWFucyhiZWFuLmdldEVqYkphcigpKTsKLQkJaWYgKGFsbFJvb3RCZWFucyAhPSBudWxsICYmIGFsbFJvb3RCZWFucy5jb250YWlucyhiZWFuKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vCVV0aWxpdHkgbWV0aG9kIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24gLSBpZiBFSkJKYXIgcmVtb3ZlZCwgcmVtb3ZlCi0JLy8JYWxsIGVudGlyZXMgaW4gdGFibGUgZm9yIEVKQkphcgotCXN0YXRpYyBwdWJsaWMgdm9pZCBmbHVzaE91dFRhYmxlRW50cmllc0ZvckVKQkphcihFSkJKYXIgZWpiSmFyKSB7Ci0JCXNlc3Npb25UYWJsZS5yZW1vdmUoZWpiSmFyKTsKLQkJZW50aXR5VGFibGUucmVtb3ZlKGVqYkphcik7Ci0JCW1lc3NhZ2VUYWJsZS5yZW1vdmUoZWpiSmFyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkVKQkphckl0ZW1Qcm92aWRlciNyZW1vdmVUYXJnZXQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVRhcmdldChOb3RpZmljYXRpb24gbm90KSB7Ci0JCWlmIChub3QuZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIEVKQkphcikKLQkJCWZsdXNoT3V0VGFibGVFbnRyaWVzRm9yRUpCSmFyKChFSkJKYXIpIG5vdC5nZXROb3RpZmllcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWlzRGlzcG9zaW5nID0gdHJ1ZTsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzRGlzcG9zaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiYjQwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotCi0vKioKLSAqIEBhdXRob3IgU2FjaGluIFBhdGVsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyb3VwZWRFSkJJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVudGl0eV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEdyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIE9iamVjdCBwYXJlbnQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlLCBwYXJlbnQsIGNoaWxkcmVuKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gRU5USVRZOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOTc3YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIFNhY2hpbiBQYXRlbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JvdXBlZEVKQkl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0JFQU5TID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lc3NhZ2VfRHJpdmVuX0JlYW5zX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIE9iamVjdCBwYXJlbnQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlLCBwYXJlbnQsIGNoaWxkcmVuKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTUVTU0FHRV9CRUFOUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWMyODE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotCi0vKioKLSAqIEBhdXRob3IgU2FjaGluIFBhdGVsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcm91cGVkRUpCSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQkVBTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU2Vzc2lvbl9CZWFuc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEdyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFNFU1NJT05fQkVBTlM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0hvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzM3YWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDExOjIzOjMwIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIgZXh0ZW5kcyBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCi0JICovCi0JcHVibGljIEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlcihFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlzdXBlcihhbkVKQik7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTEvMjAwMSAxOjUzOjQ5IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiBnZXRFamIoKS5nZXRIb21lSW50ZXJmYWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVybGF5S2V5KCkgewotCQlyZXR1cm4gImhvbWVfaW50ZXJmYWNlX292ZXJsYXlfb2JqIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJIb21lX0ludGVyZmFjZV9VSV8iLCBuZXcgT2JqZWN0W117Y2xhc3NOYW1lfSk7IC8vJE5PTi1OTFMtMSQgPSAiSG9tZSBJbnRlcmZhY2UiCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1ZjEzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSA2OjU4OjUxIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQ29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIgewotCS8qKgotCSAqIEoyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKMkVFQ29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlcihFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyLmFkZENoaWxkcmVuKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBvYmplY3QsIHJlc3VsdCk7Ci0JCXJlc3VsdC5hZGRBbGwoKChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBvYmplY3QpLmdldEVudmlyb25tZW50UHJvcGVydGllcygpKTsKLQkJcmVzdWx0LmFkZEFsbChKMkVFUmVmZXJlbmNlUHJvdmlkZXJIZWxwZXIuZ2V0UmVmZXJlbmNlcygoRW50ZXJwcmlzZUJlYW4pIG9iamVjdCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmMTgyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDc6MjA6MDcgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5FamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogSjJFRUVqYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEoyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUFkYXB0ZXIoKSB7Ci0JCWlmIChjb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIgPSBuZXcgSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkVKQkphcn0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyQWRhcHRlcigpIHsKLQkJaWYgKGVKQkphckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllSkJKYXJJdGVtUHJvdmlkZXIgPSBuZXcgR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcih0aGlzLCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBlSkJKYXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5FbnRpdHl9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGl0eUFkYXB0ZXIoKSB7Ci0JCWlmIChlbnRpdHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZW50aXR5SXRlbVByb3ZpZGVyID0gbmV3IEoyRUVFbnRpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZW50aXR5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5lamIuU2Vzc2lvbn0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZXNzaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlc3Npb25JdGVtUHJvdmlkZXIgPSBuZXcgSjJFRVNlc3Npb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2Vzc2lvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRHJpdmVuQWRhcHRlcigpIHsKLQkJaWYgKG1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlciA9IG5ldyBKMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRW50aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVFbnRpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3ZDRkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVFbnRpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSAxMToxMDowNiBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVudGl0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEVudGl0eUl0ZW1Qcm92aWRlciB7Ci0JLyoqCi0JICogSjJFRUVudGl0eUl0ZW1Qcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSjJFRUVudGl0eUl0ZW1Qcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlblN1cGVyKG9iamVjdCkpOwotCQlKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIuYWRkQ2hpbGRyZW4oKEVudGl0eSkgb2JqZWN0LCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmYzRjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLk92ZXJsYXlJY29uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JcHJpdmF0ZSBFbnRlcnByaXNlQmVhbiBlamI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBJUkVTT1VSQ0VfQ0xBU1MgPSBJUmVzb3VyY2UuY2xhc3M7Ci0KLQkvKioKLQkgKiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEVqYihhbkVKQik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZENoaWxkcmVuKEVudGl0eSBlamIsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJYWRkQ2hpbGRyZW4oKEVudGVycHJpc2VCZWFuKSBlamIsIGNoaWxkcmVuKTsKLQkJaWYgKGVqYi5nZXRQcmltYXJ5S2V5KCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChuZXcgUHJpbWFyeUtleUNsYXNzUHJvdmlkZXJIZWxwZXIoZWpiKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZENoaWxkcmVuKEVudGVycHJpc2VCZWFuIGVqYiwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCi0JCWlmIChlamIuZ2V0SG9tZUludGVyZmFjZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQobmV3IEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlcihlamIpKTsKLQkJaWYgKGVqYi5nZXRSZW1vdGVJbnRlcmZhY2UoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKG5ldyBSZW1vdGVJbnRlcmZhY2VQcm92aWRlckhlbHBlcihlamIpKTsKLQkJaWYgKGVqYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKG5ldyBMb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlcihlamIpKTsKLQkJaWYgKGVqYi5nZXRMb2NhbEludGVyZmFjZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQobmV3IExvY2FsSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoZWpiKSk7Ci0JCWlmIChlamIuZ2V0RWpiQ2xhc3MoKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuQ2xhc3NQcm92aWRlckhlbHBlcihlamIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgY3JlYXRlSW1hZ2UoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBiYXNlID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImpjdV9vYmoiKTsvLyROT04tTkxTLTEkCi0JCWlmIChiYXNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXkgPSBnZXRPdmVybGF5RGVzY3JpcHRvcigpOwotCQlpZiAob3ZlcmxheSA9PSBudWxsKQotCQkJcmV0dXJuIGJhc2UuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG5ldyBPdmVybGF5SWNvbihiYXNlLCBuZXcgSW1hZ2VEZXNjcmlwdG9yW11bXXt7b3ZlcmxheX19KS5jcmVhdGVJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTEvMjAwMSAxOjQ3OjI0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkVudGVycHJpc2VCZWFuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiBnZXRFamIoKSB7Ci0JCXJldHVybiBlamI7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIwLzIwMDEgMTA6MzA6NTQgUE0pCi0JICogCi0JICogQHJldHVybiBKYXZhQ2xhc3MKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpOwotCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRPdmVybGF5RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGdldE92ZXJsYXlLZXkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRPdmVybGF5S2V5KCk7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRKYXZhQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGF0dXNMaW5lTWVzc2FnZSgpIHsKLQkJaWYgKGdldEphdmFDbGFzcygpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0VHlwZVN0cmluZyhnZXRKYXZhQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChnZXRKYXZhQ2xhc3MoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldEphdmFDbGFzcygpLmdldE5hbWUoKTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpOwotCi0JcHVibGljIHZvaWQgb3BlbkluRWRpdG9yKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldEphdmFDbGFzcygpKTsKLQkJdHJ5IHsKLQkJCUoyRUVFZGl0b3JVdGlsaXR5Lm9wZW5JbkVkaXRvcihnZXRKYXZhQ2xhc3MoKSwgcHJvamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTEvMjAwMSAxOjQ3OjI0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdFamIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5FbnRlcnByaXNlQmVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVqYihvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4gbmV3RWpiKSB7Ci0JCWVqYiA9IG5ld0VqYjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElBZGFwdGFibGUjRWNvcmVVdGlsLmdldEFkYXB0ZXIoZUFkYXB0ZXJzKCksQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIgPT0gSVJFU09VUkNFX0NMQVNTKQotCQkJcmV0dXJuIEoyRUVFZGl0b3JVdGlsaXR5LmdldEZpbGUoZ2V0SmF2YUNsYXNzKCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVNZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVNZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMTU1ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIgewotCi0JcHVibGljIEoyRUVNZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuU3VwZXIob2JqZWN0KSk7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlci5hZGRDaGlsZHJlbigoTWVzc2FnZURyaXZlbikgb2JqZWN0LCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVSZWZlcmVuY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFUmVmZXJlbmNlUHJvdmlkZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiODk0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVSZWZlcmVuY2VQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVJlZmVyZW5jZVByb3ZpZGVySGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2VzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghYmVhbi5nZXRFamJSZWZzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldEVqYlJlZnMoKSk7Ci0JCWlmICghYmVhbi5nZXRFamJMb2NhbFJlZnMoKS5pc0VtcHR5KCkpCi0JCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0RWpiTG9jYWxSZWZzKCkpOwotCQlpZiAoIWJlYW4uZ2V0UmVzb3VyY2VSZWZzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbChiZWFuLmdldFJlc291cmNlUmVmcygpKTsKLQkJaWYgKCFiZWFuLmdldFNlY3VyaXR5Um9sZVJlZnMoKS5pc0VtcHR5KCkpCi0JCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0U2VjdXJpdHlSb2xlUmVmcygpKTsKLQkJaWYgKCFiZWFuLmdldFJlc291cmNlRW52UmVmcygpLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwoYmVhbi5nZXRSZXNvdXJjZUVudlJlZnMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFU2Vzc2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFU2Vzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjRkMjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRVNlc3Npb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIwLzIwMDEgMTE6MTA6NDggUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEoyRUVTZXNzaW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLlNlc3Npb25JdGVtUHJvdmlkZXIgewotCS8qKgotCSAqIEoyRUVTZXNzaW9uSXRlbVByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKMkVFU2Vzc2lvbkl0ZW1Qcm92aWRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlblN1cGVyKG9iamVjdCkpOwotCQlhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKFNlc3Npb24pIG9iamVjdCwgcmVzdWx0KTsKLQkJSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyLmFkZENoaWxkcmVuKChTZXNzaW9uKSBvYmplY3QsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTZXNzaW9uIHNlc3Npb24sIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJaWYgKHNlc3Npb24uZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCAmJiBzZXNzaW9uLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQobmV3IFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3ZpZGVySGVscGVyKHNlc3Npb24pKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmVhNTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIExvY2FsSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvY2FsSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyLgotCSAqIAotCSAqIEBwYXJhbSBhbkVKQgotCSAqLwotCXB1YmxpYyBMb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlcihFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlzdXBlcihhbkVKQik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0SmF2YUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIGdldEVqYigpLmdldExvY2FsSG9tZUludGVyZmFjZSgpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRPdmVybGF5S2V5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7Ci0JCXJldHVybiAibG9jYWxfaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmoiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0VHlwZVN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJMb2NhbF9Ib21lX0ludGVyZmFjZV9VSV8iLCBuZXcgT2JqZWN0W117Y2xhc3NOYW1lfSk7IC8vJE5PTi1OTFMtMSQgPSAiTG9jYWwgSG9tZSBJbnRlcmZhY2UiOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOWFmMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBMb2NhbEludGVyZmFjZVByb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvY2FsSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuCi0JICogCi0JICogQHBhcmFtIGFuRUpCCi0JICovCi0JcHVibGljIExvY2FsSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoYW5FSkIpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRKYXZhQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gZ2V0RWpiKCkuZ2V0TG9jYWxJbnRlcmZhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRPdmVybGF5S2V5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7Ci0JCXJldHVybiAibG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIjZ2V0VHlwZVN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJMb2NhbF9JbnRlcmZhY2VfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkxvY2FsIEludGVyZmFjZSIKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL01ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL01ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNmZkYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBNZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIFBFUk1JU1NJT05fTUVTX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kRWxlbWVudHMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgUEVSTUlTU0lPTl9NRVNfVU5DSEVDS0VEX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldE1ldGhvZFBlcm1pc3Npb25fVW5jaGVja2VkKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIFBFUk1JU1NJT05fTUVTX1JPTEVTX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgQURfTVBfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHJvb3QKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIHJvb3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHJvb3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbikKLQkJCXJldHVybiBnZXRFbnRlcnByaXNlQmVhbnMoKE1ldGhvZFBlcm1pc3Npb24pIHBhcmVudEVsZW1lbnQpOwotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldEVudGVycHJpc2VCZWFucyhNZXRob2RQZXJtaXNzaW9uIG1wKSB7Ci0JCUxpc3QgbWVzID0gbXAuZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucyhtcCwgbWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzKEVPYmplY3QsIEVudGVycHJpc2VCZWFuKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1ldGhvZEVsZW1lbnRzKEVPYmplY3QgYVJlZk9iamVjdCwgRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJaWYgKCEoYVJlZk9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24pKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCU1ldGhvZFBlcm1pc3Npb24gcGFyZW50TVAgPSAoTWV0aG9kUGVybWlzc2lvbikgYVJlZk9iamVjdDsKLQkJaWYgKHBhcmVudE1QID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIHBhcmVudE1QLmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFSkJKYXIpIHsKLQkJCUVKQkphciBqYXIgPSAoRUpCSmFyKSBpbnB1dEVsZW1lbnQ7Ci0JCQlpZiAoamFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGwpCi0JCQkJcmV0dXJuIGphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRNZXRob2RQZXJtaXNzaW9ucygpLnRvQXJyYXkoKTsKLQkJfQotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQXNzZW1ibHlEZXNjcmlwdG9yKQotCQkJcmV0dXJuICgoQXNzZW1ibHlEZXNjcmlwdG9yKSBpbnB1dEVsZW1lbnQpLmdldE1ldGhvZFBlcm1pc3Npb25zKCkudG9BcnJheSgpOwotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbikKLQkJCXJldHVybiAhKChNZXRob2RQZXJtaXNzaW9uKSBlbGVtZW50KS5nZXRNZXRob2RFbGVtZW50cygpLmlzRW1wdHkoKTsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHNSZWZlcmVuY2UoKQotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TWV0aG9kRWxlbWVudHNSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBQRVJNSVNTSU9OX01FU19TRjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5wcm92aWRlcnMuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gQURfTVBfU0Y7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyI25vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBQRVJNSVNTSU9OX01FU19TRiB8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IEFEX01QX1NGKQotCQkJcmVmcmVzaFRyZWVWaWV3ZXIoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkgaW5zdGFuY2VvZiBDTVBBdHRyaWJ1dGUgJiYgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gUEVSTUlTU0lPTl9NRVNfVU5DSEVDS0VEX1NGIHx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gUEVSTUlTU0lPTl9NRVNfUk9MRVNfU0YgfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpIHx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKSkKLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjA2MTY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBUUkFOU0FDVElPTl9NRVNfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgQURfTVRfU0YgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFRyYW5zYWN0aW9ucygpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBNZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgYm9vbGVhbiByb290KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCByb290KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWV0aG9kVHJhbnNhdGlvbkNvbnRlbnRQcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVHJhbnNhY3Rpb24pCi0JCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKChNZXRob2RUcmFuc2FjdGlvbikgcGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0RW50ZXJwcmlzZUJlYW5zKE1ldGhvZFRyYW5zYWN0aW9uIG10KSB7Ci0JCUxpc3QgbWVzID0gbXQuZ2V0TWV0aG9kRWxlbWVudHMoKTsKLQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucyhtdCwgbWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzKEVPYmplY3QsIEVudGVycHJpc2VCZWFuKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1ldGhvZEVsZW1lbnRzKEVPYmplY3QgYVJlZk9iamVjdCwgRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJaWYgKCEoYVJlZk9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFRyYW5zYWN0aW9uKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlNZXRob2RUcmFuc2FjdGlvbiBwYXJlbnRNVCA9IChNZXRob2RUcmFuc2FjdGlvbikgYVJlZk9iamVjdDsKLQkJaWYgKHBhcmVudE1UID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIHBhcmVudE1ULmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFSkJKYXIpIHsKLQkJCUVKQkphciBqYXIgPSAoRUpCSmFyKSBpbnB1dEVsZW1lbnQ7Ci0JCQlpZiAoamFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpICE9IG51bGwpCi0JCQkJcmV0dXJuIGphci5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKS50b0FycmF5KCk7Ci0JCX0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFzc2VtYmx5RGVzY3JpcHRvcikKLQkJCXJldHVybiAoKEFzc2VtYmx5RGVzY3JpcHRvcikgaW5wdXRFbGVtZW50KS5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKS50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RUcmFuc2FjdGlvbikKLQkJCXJldHVybiAhKChNZXRob2RUcmFuc2FjdGlvbikgZWxlbWVudCkuZ2V0TWV0aG9kRWxlbWVudHMoKS5pc0VtcHR5KCk7Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gVFJBTlNBQ1RJT05fTUVTX1NGOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnByb3ZpZGVycy5BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKQotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBBRF9NVF9TRjsKLQl9Ci0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9QcmltYXJ5S2V5Q2xhc3NQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9QcmltYXJ5S2V5Q2xhc3NQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg5M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUHJpbWFyeUtleUNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjEvMjAwMSAxMjoyODo1NSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUNsYXNzUHJvdmlkZXJIZWxwZXIgZXh0ZW5kcyBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogUHJpbWFyeUtleUNsYXNzUHJvdmlkZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKLQkgKi8KLQlwdWJsaWMgUHJpbWFyeUtleUNsYXNzUHJvdmlkZXJIZWxwZXIoRW50ZXJwcmlzZUJlYW4gYW5FSkIpIHsKLQkJc3VwZXIoYW5FSkIpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGltYWdlID09IG51bGwpCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgMTo1NDoyMiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLkphdmFDbGFzcwotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gKChFbnRpdHkpIGdldEVqYigpKS5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVybGF5S2V5KCkgewotCQlyZXR1cm4gImtleV9pbnRlcmZfb3YiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByaW1hcnlfS2V5X0NsYXNzX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJQcmltYXJ5IEtleSBDbGFzcyIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9SZW1vdGVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9SZW1vdGVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmNiNzkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg2LzIxLzIwMDEgMTI6Mjg6MTIgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZUludGVyZmFjZVByb3ZpZGVySGVscGVyIGV4dGVuZHMgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBpbWFnZTsKLQotCS8qKgotCSAqIFJlbW90ZUludGVyZmFjZVByb3ZpZGVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCi0JICovCi0JcHVibGljIFJlbW90ZUludGVyZmFjZVByb3ZpZGVySGVscGVyKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXN1cGVyKGFuRUpCKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xMS8yMDAxIDE6NTU6NDggUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuIGdldEVqYigpLmdldFJlbW90ZUludGVyZmFjZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKLQkJcmV0dXJuICJyZW1vdGVfaW50ZXJmYWNlX292ZXJsYXlfb2JqIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdGVfSW50ZXJmYWNlX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJSZW1vdGUgSW50ZXJmYWNlIgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDJiMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgZGZob2x0dHAKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIgZXh0ZW5kcyBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIEltYWdlIGltYWdlOwotCi0JLyoqCi0JICogQHBhcmFtIGFuRUpCCi0JICovCi0JcHVibGljIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3ZpZGVySGVscGVyKEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCXN1cGVyKGFuRUpCKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNy8xMS8yMDAxIDE6NTM6NDkgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJcmV0dXJuICgoU2Vzc2lvbikgZ2V0RWpiKCkpLmdldFNlcnZpY2VFbmRwb2ludCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKLQkJLy9UT0RPOiBERkggd2UgbmVlZCBhbiBpY29uCi0JCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJTZXJ2aWNlX0VuZHBvaW50X0ludGVyZmFjZV9VSV8iLCBuZXcgT2JqZWN0W117Y2xhc3NOYW1lfSk7IC8vJE5PTi1OTFMtMSQgPSAiSG9tZSBJbnRlcmZhY2UiCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9saXN0ZW5lcnMvSVZhbGlkYXRlRWRpdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbGlzdGVuZXJzL0lWYWxpZGF0ZUVkaXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQ0ZWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9saXN0ZW5lcnMvSVZhbGlkYXRlRWRpdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRlRWRpdExpc3RlbmVyIGV4dGVuZHMgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciwgSVBhcnRMaXN0ZW5lciwgU2hlbGxMaXN0ZW5lciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgYWN0aW9uIHRoYXQgaXMgYWJvdXQgdG8gZWRpdCBhbnkgY29udGVudHMgb2YgYW55IElGaWxlLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgcmVhZCBvbmx5IElGaWxlcyB0aGF0IGFyZSBiZWluZyBtYW5hZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXRSZXNvdXJjZXMoKQotCSAqLwotCWJvb2xlYW4gaGFzUmVhZE9ubHlGaWxlcygpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byBzYXZpbmcgdGhlIGNvbnRlbnRzLiBJdCByZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnRzCi0JICogY2FuIGJlIHNhdmVkLgotCSAqLwotCWJvb2xlYW4gY2hlY2tTYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSBTaGVsbCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwcm9tcHQgdG8gdGhlIHVzZXIuCi0JICovCi0Jdm9pZCBzZXRTaGVsbChTaGVsbCBhU2hlbGwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9saXN0ZW5lcnMvVmFsaWRhdGVFZGl0TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9saXN0ZW5lcnMvVmFsaWRhdGVFZGl0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiYjlmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbGlzdGVuZXJzL1ZhbGlkYXRlRWRpdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuTGlzdE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRlRWRpdExpc3RlbmVyIGV4dGVuZHMgU2hlbGxBZGFwdGVyIGltcGxlbWVudHMgSVZhbGlkYXRlRWRpdExpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBmVmFsaWRhdG9yOwotCXByaXZhdGUgYm9vbGVhbiBmTmVlZHNTdGF0ZVZhbGlkYXRpb24gPSB0cnVlOwotCXByaXZhdGUgU2hlbGwgZlNoZWxsOwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZlBhcnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZIYXNSZWFkT25seUZpbGVzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZpcnN0UmVhZE9ubHlGaWxlQXR0ZW1wdCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZNZXNzYWdlVXAgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQWN0aXZhdGluZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNEZWFjdGl2YXRpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBWYWxpZGF0ZUVkaXRIYW5kbGVyLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0ZUVkaXRMaXN0ZW5lcihJV29ya2JlbmNoUGFydCBwYXJ0LCBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIGFWYWxpZGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJZlBhcnQgPSBwYXJ0OwotCQlmVmFsaWRhdG9yID0gYVZhbGlkYXRvcjsKLQkJaWYgKHBhcnQgIT0gbnVsbCkKLQkJCXBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChnZXRTaGVsbCgpICE9IG51bGwpCi0JCQlnZXRTaGVsbCgpLmFkZFNoZWxsTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkgewotCQlpZiAoZlNoZWxsID09IG51bGwpIHsKLQkJCWlmIChmUGFydCAhPSBudWxsICYmIGZQYXJ0LmdldFNpdGUoKSAhPSBudWxsKQotCQkJCWZTaGVsbCA9IGZQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBmU2hlbGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVmFsaWRhdGVFZGl0TGlzdGVuZXIjZ2V0VmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBmVmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZhbGlkYXRlRWRpdExpc3RlbmVyI2dldE5lZWRzU3RhdGVWYWxpZGF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXROZWVkc1N0YXRlVmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIGZOZWVkc1N0YXRlVmFsaWRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciNzZXROZWVkc1N0YXRlVmFsaWRhdGlvbihib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5lZWRzU3RhdGVWYWxpZGF0aW9uKGJvb2xlYW4gbmVlZHNTdGF0ZVZhbGlkYXRpb24pIHsKLQkJZk5lZWRzU3RhdGVWYWxpZGF0aW9uID0gbmVlZHNTdGF0ZVZhbGlkYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyI3Byb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKExpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZVJlZnJlc2goTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgewotCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCkgPT0gMCkgLy8gdGhpcyBjYXNlIHNob3VsZCBuZXZlcgotCQkJLy8gb2NjdXIuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0aXRsZSA9IG51bGw7Ci0JCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJU3RyaW5nW10gZmlsZU5hbWVzID0gbmV3IFN0cmluZ1tpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaW5jb25zaXN0ZW50RmlsZXMuc2l6ZSgpID4gaTsgaSsrKSB7Ci0JCQlPYmplY3QgZmlsZSA9IGluY29uc2lzdGVudEZpbGVzLmdldChpKTsKLQkJCWlmIChmaWxlIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKFJlc291cmNlKSBmaWxlKTsKLQkJCQlmaWxlTmFtZXNbaV0gPSBhRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKTsKLQkJCX0gZWxzZSBpZiAoZmlsZSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCUlSZXNvdXJjZSByZXNmaWxlID0gKElSZXNvdXJjZSkgZmlsZTsKLQkJCQlpZiAoIXJlc2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlmaWxlTmFtZXNbaV0gPSByZXNmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQotCQl0aXRsZSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJJbmNvbnNpc3RlbnRfRmlsZXNfMyIpOyAvLyROT04tTkxTLTEkCi0JCW1lc3NhZ2UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiVGhlX2ZvbGxvd2luZ193b3Jrc3BhY2VfZmlsZXNfYXJlX2luY29uc2lzdGVudF93aXRoX3RoZV9lZGl0b3JfNCIpOyAvLyROT04tTkxTLTEkCi0JCW1lc3NhZ2UgKz0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlVwZGF0ZV90aGVfZWRpdG9yX3dpdGhfdGhlX3dvcmtzcGFjZV9jb250ZW50c19fNSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBMaXN0TWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UsIGZpbGVOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyI2dldFZhbGlkYXRlRWRpdENvbnRleHQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0ID09IGZQYXJ0KSB7Ci0JCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkgewotCQlpZiAoZklzQWN0aXZhdGluZykKLQkJCXJldHVybjsKLQkJZklzQWN0aXZhdGluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlmVmFsaWRhdG9yLmNoZWNrQWN0aXZhdGlvbih0aGlzKTsKLQkJCXVwZGF0ZVBhcnRSZWFkT25seSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcgZm9yIG5vdwotCQl9IGZpbmFsbHkgewotCQkJZklzQWN0aXZhdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsTGlzdGVuZXIjc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGV2ZW50KSB7Ci0JCWhhbmRsZUFjdGl2YXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0ID09IGZQYXJ0KQotCQkJcGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGdldFNoZWxsKCkgIT0gbnVsbCkKLQkJCWdldFNoZWxsKCkucmVtb3ZlU2hlbGxMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0ID09IGZQYXJ0KSB7Ci0JCQlpZiAoZklzRGVhY3RpdmF0aW5nKQotCQkJCXJldHVybjsKLQkJCWZJc0RlYWN0aXZhdGluZyA9IHRydWU7Ci0JCQl0cnkgewotCQkJCWZWYWxpZGF0b3IubG9zdEFjdGl2YXRpb24odGhpcyk7Ci0JCQkJdXBkYXRlUGFydFJlYWRPbmx5KCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nIGZvciBub3cKLQkJCX0gZmluYWxseSB7Ci0JCQkJZklzRGVhY3RpdmF0aW5nID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKCkgewotCQlpZiAoZk5lZWRzU3RhdGVWYWxpZGF0aW9uKSB7Ci0JCQlzZXROZWVkc1N0YXRlVmFsaWRhdGlvbihmYWxzZSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN0YXR1cyA9IGZWYWxpZGF0b3IudmFsaWRhdGVTdGF0ZSh0aGlzKTsKLQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQlzZXROZWVkc1N0YXRlVmFsaWRhdGlvbih0cnVlKTsKLQkJCQkJaWYgKCFmTWVzc2FnZVVwKSB7Ci0JCQkJCQlmTWVzc2FnZVVwID0gdHJ1ZTsKLQkJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFcnJvcl9jaGVja2luZ19vdXRfZmlsZXNfMTAiKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZNZXNzYWdlVXAgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmVmFsaWRhdG9yLmNoZWNrQWN0aXZhdGlvbih0aGlzKTsKLQkJCQl1cGRhdGVQYXJ0UmVhZE9ubHkoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGRvIG5vdGhpbmcgZm9yIG5vdwotCQkJfQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VTdGF0ZVZhbGlkYXRvci5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyI3Byb21wdEZvckluY29uc2lzdGVudEZpbGVPdmVyd3JpdGUoTGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJaW50IHNpemUgPSBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCk7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBpbmNvbnNpc3RlbnRGaWxlcy5nZXQoaSk7Ci0JCQlpdGVtc1tpXSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBMaXN0TWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0U2hlbGwoKSwgSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkluY29uc2lzdGVudF9maWxlc19kZXRlY3RlZF8xMSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJUaGVfZm9sbG93aW5nX2ZpbGVzX2FyZV9pbmNvbnNpc3RlbnRfd2l0aF90aGVfZmlsZV9zeXN0ZW0uX0RvX3lvdV93YW50X3RvX3NhdmVfYW5kX292ZXJ3cml0ZV90aGVzZV9maWxlc19vbl90aGVfZmlsZV9zeXN0ZW1fXzEyX1dBUk5fIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJaXRlbXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCWZIYXNSZWFkT25seUZpbGVzID0gZlZhbGlkYXRvci5jaGVja1JlYWRPbmx5KCk7Ci0JCXJldHVybiBmSGFzUmVhZE9ubHlGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWYWxpZGF0ZUVkaXRMaXN0ZW5lciNoYXNSZWFkT25seUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWFkT25seUZpbGVzKCkgewotCQlpZiAoZmlyc3RSZWFkT25seUZpbGVBdHRlbXB0KSB7Ci0JCQljaGVja1JlYWRPbmx5KCk7Ci0JCQlmaXJzdFJlYWRPbmx5RmlsZUF0dGVtcHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZkhhc1JlYWRPbmx5RmlsZXM7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHVwZGF0ZVBhcnRSZWFkT25seS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYXJ0UmVhZE9ubHkoKSB7Ci0JCWlmICghZ2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oKSkgewotCQkJY2hlY2tSZWFkT25seSgpOwotCQkJc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7IC8vU28gdGhhdCBKMkVFWE1MQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0IHVwZGF0ZWQgaW5mbyB3aGVuIGVkaXRvciBBY3RpdmF0ZWQuCi0JCQlmaXJzdFJlYWRPbmx5RmlsZUF0dGVtcHQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tTYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdmFsaWRhdGVTdGF0ZSgpLmlzT0soKSAmJiBnZXRWYWxpZGF0b3IoKS5jaGVja1NhdmUodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hlbGwoU2hlbGwgYVNoZWxsKSB7Ci0JCWZTaGVsbCA9IGFTaGVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BlcnNwZWN0aXZlL0oyRUVQZXJzcGVjdGl2ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BlcnNwZWN0aXZlL0oyRUVQZXJzcGVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzYxNmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KMkVFUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBEZWMgNywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzQ29uc3RhbnRzOwotCi0vKioKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVBlcnNwZWN0aXZlIGltcGxlbWVudHMgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBJRF9TRVJWRVJTX1ZJRVcgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldyI7IC8vJE5PTi1OTFMtMSQKLQkvL3Byb3RlY3RlZCBzdGF0aWMgU3RyaW5nIElEX0oyRUVfSElFUkFSQ0hZX1ZJRVcgPSAib3JnLmVjbGlwc2Uud3N0Lm5hdmlnYXRvci51aS5XVFBDb21tb25OYXZpZ2F0b3IiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgSURfSjJFRV9ISUVSQVJDSFlfVklFVyA9ICJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUFdvcmtpbmdTZXRDb21tb25OYXZpZ2F0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSURfV1NUX1NOSVBQRVRTX1ZJRVcgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zbmlwcGV0cy5pbnRlcm5hbC51aS5TbmlwcGV0c1ZpZXciOyAvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJRF9FSkJfUFJPSkVDVF9XSVpBUkQgPSAib3JnLmVjbGlwc2UuanN0LmVqYi51aS5FSkJDb21wb25lbnRDcmVhdGlvbldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSURfUkFSX1BST0pFQ1RfV0laQVJEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSURfQVBQQ0xJRU5UX1BST0pFQ1RfV0laQVJEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSURfRUFSX1BST0pFQ1RfV0laQVJEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSURfRFlOQU1JQ19XRUJfQ09NUE9ORU5UX1dJWkFSRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5XZWJDb21wb25lbnRDcmVhdGlvbldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSURfU1RBVElDX1dFQl9DT01QT05FTlRfV0laQVJEID0gIm9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU0VBUkNIX1ZJRVcgPSAib3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnZpZXdzLlNlYXJjaFZpZXciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQ09OU09MRV9WSUVXPSAib3JnLmVjbGlwc2UudWkuY29uc29sZS5Db25zb2xlVmlldyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBKMkVFUGVyc3BlY3RpdmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQob3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJZGVmaW5lTGF5b3V0KGxheW91dCk7Ci0JCWRlZmluZUFjdGlvbnMobGF5b3V0KTsKLQl9Ci0JCi0JCi0KLQlwdWJsaWMgdm9pZCBkZWZpbmVBY3Rpb25zKElQYWdlTGF5b3V0IGxheW91dCkgewotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KCJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMmVlTWFpbkFjdGlvblNldCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGRBY3Rpb25TZXQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyZWVNYWluQWN0aW9uU2V0MiIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGRBY3Rpb25TZXQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyZWVNYWluQWN0aW9uU2V0MyIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGRBY3Rpb25TZXQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyZWVNYWluQWN0aW9uU2V0NCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGRBY3Rpb25TZXQoIm9yZy5lY2xpcHNlLmpkdC51aS5KYXZhQWN0aW9uU2V0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KElEZWJ1Z1VJQ29uc3RhbnRzLkxBVU5DSF9BQ1RJT05fU0VUKTsKLQkJbGF5b3V0LmFkZEFjdGlvblNldChJRGVidWdVSUNvbnN0YW50cy5ERUJVR19BQ1RJT05fU0VUKTsKLQotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KElQYWdlTGF5b3V0LklEX05BVklHQVRFX0FDVElPTl9TRVQpOwotCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElEX0oyRUVfSElFUkFSQ0hZX1ZJRVcpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9TRVJWRVJTX1ZJRVcpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9UQVNLX0xJU1QpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9XU1RfU05JUFBFVFNfVklFVyk7Ci0JCQotCQkvLyB2aWV3cyAtIHNlYXJjaAotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9TRUFSQ0hfVklFVyk7Ci0JCQkJLy8gdmlld3MgLSBkZWJ1Z2dpbmcKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfQ09OU09MRV9WSUVXKTsKLQotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoSURfRFlOQU1JQ19XRUJfQ09NUE9ORU5UX1dJWkFSRCk7Ci0gICAgICAgIGxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChJRF9TVEFUSUNfV0VCX0NPTVBPTkVOVF9XSVpBUkQpOwotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoSURfRUpCX1BST0pFQ1RfV0laQVJEKTsKLSAgICAgICAgbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KElEX1JBUl9QUk9KRUNUX1dJWkFSRCk7Ci0gICAgICAgIGxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChJRF9BUFBDTElFTlRfUFJPSkVDVF9XSVpBUkQpOwotICAgICAgICBsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoSURfRUFSX1BST0pFQ1RfV0laQVJEKTsKLQotCQkvLyBBZGQgIm5ldyB3aXphcmRzIgotICAgICAgICBsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LnByb2plY3QiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcuZm9sZGVyIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICBsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZpbGUiKTsvLyROT04tTkxTLTEkCi0KLQkJbGF5b3V0LmFkZFNob3dJblBhcnQoSURfSjJFRV9ISUVSQVJDSFlfVklFVyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVmaW5lTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotCQkvLyBFZGl0b3JzIGFyZSBwbGFjZWQgZm9yIGZyZWUuCi0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQotCQkvLyBUb3AgbGVmdC4KLQkJSUZvbGRlckxheW91dCB0b3BMZWZ0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigidG9wTGVmdCIsIElQYWdlTGF5b3V0LkxFRlQsIDAuMjVmLCBlZGl0b3JBcmVhKTsvLyROT04tTkxTLTEkCi0JCXRvcExlZnQuYWRkVmlldyhJRF9KMkVFX0hJRVJBUkNIWV9WSUVXKTsKLQkJdG9wTGVmdC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJdG9wTGVmdC5hZGRQbGFjZWhvbGRlcihKYXZhVUkuSURfVFlQRV9ISUVSQVJDSFkpOwotCQl0b3BMZWZ0LmFkZFBsYWNlaG9sZGVyKEphdmFVSS5JRF9QQUNLQUdFU19WSUVXKTsKLQotCQkvLyBCb3R0b20gcmlnaHQuCi0JCUlGb2xkZXJMYXlvdXQgYm90dG9tUmlnaHQgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJib3R0b21SaWdodCIsIElQYWdlTGF5b3V0LkJPVFRPTSwgMC43ZiwgZWRpdG9yQXJlYSk7Ly8kTk9OLU5MUy0xJAotCQlib3R0b21SaWdodC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCWJvdHRvbVJpZ2h0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUKTsKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJRF9TRVJWRVJTX1ZJRVcpOwotCQlib3R0b21SaWdodC5hZGRWaWV3KElEX1dTVF9TTklQUEVUU19WSUVXKTsKLQkJCi0JCWJvdHRvbVJpZ2h0LmFkZFBsYWNlaG9sZGVyKElEX0NPTlNPTEVfVklFVyk7Ci0JCWJvdHRvbVJpZ2h0LmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX0JPT0tNQVJLUyk7Ci0JCWJvdHRvbVJpZ2h0LmFkZFBsYWNlaG9sZGVyKElQcm9ncmVzc0NvbnN0YW50cy5QUk9HUkVTU19WSUVXX0lEKTsKLQkJYm90dG9tUmlnaHQuYWRkUGxhY2Vob2xkZXIoSURfU0VBUkNIX1ZJRVcpOwotCi0JCS8vIFRvcCByaWdodC4KLQkJSUZvbGRlckxheW91dCB0b3BSaWdodCA9IGxheW91dC5jcmVhdGVGb2xkZXIoInRvcFJpZ2h0IiwgSVBhZ2VMYXlvdXQuUklHSFQsIDAuN2YsIGVkaXRvckFyZWEpOy8vJE5PTi1OTFMtMSQKLQkJdG9wUmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQl9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0NvbW1vbkVkaXRvclV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vQ29tbW9uRWRpdG9yVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjU4Y2JiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vQ29tbW9uRWRpdG9yVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkVkaXRvck1hbmFnZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uRWRpdG9yVXRpbGl0eSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQotCXByaXZhdGUgQ29tbW9uRWRpdG9yVXRpbGl0eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBlZGl0b3JzIHRoYXQgaGF2ZSBhbiB1bnNhdmVkIGNvbnRlbnQuIElmIHRoZSBpZGVudGljYWwgY29udGVudCBpcwotCSAqIHByZXNlbnRlZCBpbiBtb3JlIHRoYW4gb25lIGVkaXRvciwgb25seSBvbmUgb2YgdGhvc2UgZWRpdG9yIHBhcnRzIGlzIHBhcnQgb2YgdGhlIHJlc3VsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBkaXJ0eSBlZGl0b3IgcGFydHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydFtdIGdldERpcnR5RWRpdG9ycygpIHsKLQkJcmV0dXJuIGdldERpcnR5RWRpdG9ycyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBlZGl0b3JzIHRoYXQgaGF2ZSBhbiB1bnNhdmVkIGNvbnRlbnQsIHdoZXJlIHRoZSBjb250ZW50IGlzIGluY2x1ZGUgaW4KLQkgKiBvbmUgb2YgdGhlIHByb2plY3RzIGluIHRoZSBMaXN0IHBhcmFtZXRlci4gSWYgdGhlIGlkZW50aWNhbCBjb250ZW50IGlzIHByZXNlbnRlZCBpbiBtb3JlIHRoYW4KLQkgKiBvbmUgZWRpdG9yLCBvbmx5IG9uZSBvZiB0aG9zZSBlZGl0b3IgcGFydHMgaXMgcGFydCBvZiB0aGUgcmVzdWx0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIGRpcnR5IGVkaXRvciBwYXJ0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0W10gZ2V0RGlydHlFZGl0b3JzKExpc3QgcHJvamVjdHMpIHsKLQkJU2V0IGlucHV0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBKMkVFVUlQbHVnaW4uZ2V0UGx1Z2luV29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gd2luZG93c1tpXS5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYWdlcy5sZW5ndGg7IHgrKykgewotCQkJCUlFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOwotCQkJCWZvciAoaW50IHogPSAwOyB6IDwgZWRpdG9ycy5sZW5ndGg7IHorKykgewotCQkJCQlJRWRpdG9yUGFydCBlcCA9IGVkaXRvcnNbel07Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVwLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCWlmICghaW5wdXRzLmNvbnRhaW5zKGlucHV0KSAmJiAocHJvamVjdHMgPT0gbnVsbCB8fCBpbnB1dEluUHJvamVjdHMoaW5wdXQsIHByb2plY3RzKSkpIHsKLQkJCQkJCWlucHV0cy5hZGQoaW5wdXQpOwotCQkJCQkJcmVzdWx0LmFkZChlcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJRWRpdG9yUGFydFtdKSByZXN1bHQudG9BcnJheShuZXcgSUVkaXRvclBhcnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbnB1dEluUHJvamVjdHMoSUVkaXRvcklucHV0IGlucHV0LCBMaXN0IHByb2plY3RzKSB7Ci0JCUlSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElSRVNPVVJDRV9DTEFTUyk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSByZXMgPT0gbnVsbCA/IG51bGwgOiByZXMuZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAocHJvamVjdC5lcXVhbHMocHJvamVjdHMuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdFRvU2F2ZUFsbERpcnR5RWRpdG9ycygpIHsKLQkJcmV0dXJuIHByb21wdFRvU2F2ZURpcnR5RWRpdG9ycyhBcnJheXMuYXNMaXN0KGdldERpcnR5RWRpdG9ycygpKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdFRvU2F2ZURpcnR5RWRpdG9ycyhMaXN0IGRpcnR5RWRpdG9ycykgewotCQlpZiAoZGlydHlFZGl0b3JzLmlzRW1wdHkoKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gRWRpdG9yTWFuYWdlci5zYXZlQWxsKGRpcnR5RWRpdG9ycywgdHJ1ZSwgSjJFRVVJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvbXB0VG9TYXZlRGlydHlFZGl0b3JzSW5Qcm9qZWN0cyhMaXN0IHByb2plY3RzKSB7Ci0JCXJldHVybiBwcm9tcHRUb1NhdmVEaXJ0eUVkaXRvcnMoQXJyYXlzLmFzTGlzdChnZXREaXJ0eUVkaXRvcnMocHJvamVjdHMpKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vRXJyb3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vRXJyb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViNzEwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0Vycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEFkZGVkIGEgRGV0YWlscyBidXR0b24gdG8gdGhlIE1lc3NhZ2VEaWFsb2cgdG8gc2hvdyB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlLgotICogCi0gKiBCb3Jyb3dlZCBmcm9tIGFuIGVjbGlwc2UgSW50ZXJuYWxFcnJvckRpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PSyA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19DQU5DRUwgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFCRUxTX09LX0RFVEFJTFMgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUx9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFCRUxTX09LX0NBTkNFTF9ERVRBSUxTID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTH07Ci0JcHJpdmF0ZSBUaHJvd2FibGUgZGV0YWlsOwotCXByaXZhdGUgaW50IGRldGFpbEJ1dHRvbklEID0gLTE7Ci0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQkvL1dvcmthcm91bmQuIFNXVCBkb2VzIG5vdCBzZWVtIHRvIHNldCB0aGUgZGVmYXVsdCBidXR0b24gaWYKLQkvL3RoZXJlIGlzIG5vdCBjb250cm9sIHdpdGggZm9jdXMuIEJ1ZzogMTQ2NjgKLQlwcml2YXRlIGludCBkZWZhdWx0QnV0dG9uSW5kZXggPSAwOwotCS8qKgotCSAqIFNpemUgb2YgdGhlIHRleHQgaW4gbGluZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRfTElORV9DT1VOVCA9IDE1OwotCi0JcHVibGljIEVycm9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIEltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBUaHJvd2FibGUgZGV0YWlsLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBTdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJZGVmYXVsdEJ1dHRvbkluZGV4ID0gZGVmYXVsdEluZGV4OwotCQl0aGlzLmRldGFpbCA9IGRldGFpbDsKLQkJbWVzc2FnZSA9IGRpYWxvZ01lc3NhZ2U7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7Ci0JfQotCi0JLy9Xb3JrYXJvdW5kLiBTV1QgZG9lcyBub3Qgc2VlbSB0byBzZXQgcmlndGggdGhlIGRlZmF1bHQgYnV0dG9uIGlmCi0JLy90aGVyZSBpcyBub3QgY29udHJvbCB3aXRoIGZvY3VzLiBCdWc6IDE0NjY4Ci0JcHVibGljIGludCBvcGVuKCkgewotCQljcmVhdGUoKTsKLQkJQnV0dG9uIGIgPSBnZXRCdXR0b24oZGVmYXVsdEJ1dHRvbkluZGV4KTsKLQkJYi5zZXRGb2N1cygpOwotCQliLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihiKTsKLQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRldGFpbCBidXR0b247Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGV0YWlsQnV0dG9uKGludCBpbmRleCkgewotCQlkZXRhaWxCdXR0b25JRCA9IGluZGV4OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBkZXRhaWxCdXR0b25JRCkgewotCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfSBlbHNlIHsKLQkJCXNldFJldHVybkNvZGUoYnV0dG9uSWQpOwotCQkJY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwcmVzc2luZyB0aGUgZGV0YWlscwotCSAqIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKSB7Ci0JCVBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJUG9pbnQgb2xkU2l6ZSA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQl0ZXh0ID0gbnVsbDsKLQkJCWdldEJ1dHRvbihkZXRhaWxCdXR0b25JRCkuc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVEcm9wRG93blRleHQoKENvbXBvc2l0ZSkgZ2V0Q29udGVudHMoKSk7Ci0JCQlnZXRCdXR0b24oZGV0YWlsQnV0dG9uSUQpLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotCQl9Ci0JCVBvaW50IG5ld1NpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWdldFNoZWxsKCkuc2V0U2l6ZShuZXcgUG9pbnQod2luZG93U2l6ZS54LCB3aW5kb3dTaXplLnkgKyAobmV3U2l6ZS55IC0gb2xkU2l6ZS55KSkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGlzIGRpYWxvZydzIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURyb3BEb3duVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlzdAotCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJLy8gcHJpbnQgdGhlIHN0YWNrdHJhY2UgaW4gdGhlIHRleHQgZmllbGQKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oYmFvcyk7Ci0JCQlkZXRhaWwucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCWlmICgoZGV0YWlsIGluc3RhbmNlb2YgU1dURXJyb3IpICYmICgoKFNXVEVycm9yKSBkZXRhaWwpLnRocm93YWJsZSAhPSBudWxsKSkgewotCQkJCXBzLnByaW50bG4oIlxuKioqIFN0YWNrIHRyYWNlIG9mIGNvbnRhaW5lZCBleGNlcHRpb24gKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkoKFNXVEVycm9yKSBkZXRhaWwpLnRocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHMpOwotCQkJfSBlbHNlIGlmICgoZGV0YWlsIGluc3RhbmNlb2YgU1dURXhjZXB0aW9uKSAmJiAoKChTV1RFeGNlcHRpb24pIGRldGFpbCkudGhyb3dhYmxlICE9IG51bGwpKSB7Ci0JCQkJcHMucHJpbnRsbigiXG4qKiogU3RhY2sgdHJhY2Ugb2YgY29udGFpbmVkIGV4Y2VwdGlvbiAqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCSgoU1dURXhjZXB0aW9uKSBkZXRhaWwpLnRocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHMpOwotCQkJfQotCQkJcHMuZmx1c2goKTsKLQkJCWJhb3MuZmx1c2goKTsKLQkJCXRleHQuc2V0VGV4dChiYW9zLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIFRFWFRfTElORV9DT1VOVDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZGV0YWlsLCBpbnQgZGVmYXVsdEluZGV4LCBib29sZWFuIHNob3dDYW5jZWwpIHsKLQkJU3RyaW5nW10gbGFiZWxzOwotCQlpZiAoZGV0YWlsID09IG51bGwpCi0JCQlsYWJlbHMgPSBzaG93Q2FuY2VsID8gTEFCRUxTX09LX0NBTkNFTCA6IExBQkVMU19PSzsKLQkJZWxzZQotCQkJbGFiZWxzID0gc2hvd0NhbmNlbCA/IExBQkVMU19PS19DQU5DRUxfREVUQUlMUyA6IExBQkVMU19PS19ERVRBSUxTOwotCQlFcnJvckRpYWxvZyBkaWFsb2cgPSBuZXcgRXJyb3JEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIGRldGFpbCwgRVJST1IsIGxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJaWYgKGRldGFpbCAhPSBudWxsKQotCQkJZGlhbG9nLnNldERldGFpbEJ1dHRvbihsYWJlbHMubGVuZ3RoIC0gMSk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCS8vIGNyZWF0ZSBpbWFnZQotCQlJbWFnZSBpbWFnZSA9IGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCAwKTsKLQkJCWltYWdlLnNldEJhY2tncm91bmQobGFiZWwuZ2V0QmFja2dyb3VuZCgpKTsKLQkJCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCX0KLQkJLy8gY3JlYXRlIG1lc3NhZ2UKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJfQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVFZGl0b3JVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVFZGl0b3JVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZGI2MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFRWRpdG9yVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFDbGFzc0pET01BZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKgotICogTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNLAotICogV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gKLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAgMTk5OSwgMjAwMAotICovCi0KLS8qKgotICogQSBudW1iZXIgb2Ygcm91dGluZXMgZm9yIHdvcmtpbmcgd2l0aCBKYXZhRWxlbWVudHMgaW4gZWRpdG9ycwotICogCi0gKiBVc2UgJ2lzT3BlbkluRWRpdG9yJyB0byB0ZXN0IGlmIGFuIGVsZW1lbnQgaXMgYWxyZWFkeSBvcGVuIGluIGEgZWRpdG9yIFVzZSAnb3BlbkluRWRpdG9yJyB0bwotICogZm9yY2Ugb3BlbmluZyBhbiBlbGVtZW50IGluIGEgZWRpdG9yIFdpdGggJ2dldFdvcmtpbmdDb3B5JyB5b3UgZ2V0IHRoZSB3b3JraW5nIGNvcHkgKGVsZW1lbnQgaW4KLSAqIHRoZSBlZGl0b3IpIG9mIGFuIGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIEoyRUVFZGl0b3JVdGlsaXR5IHsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0pBVkFfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5taXNjLkVKQkphdmFFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChqYXZhQ2xhc3MpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRDb21waWxhdGlvblVuaXQoamF2YUNsYXNzLCBwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEphdmFDbGFzcyBqYXZhQ2xhc3MsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGphdmFDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0Q29tcGlsYXRpb25Vbml0KGphdmFDbGFzcywgamF2YVByb2opOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSmF2YUNsYXNzIGphdmFDbGFzcywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVHlwZSB0eXBlID0gZ2V0VHlwZShqYXZhQ2xhc3MpOwotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJcmV0dXJuIHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJSmF2YUNsYXNzSkRPTUFkYXB0b3IgYWRhcHRvciA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKGphdmFDbGFzcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJaWYgKGFkYXB0b3IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRvci5nZXRTb3VyY2VUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXR1cm4gbmV3IEZpbGVFZGl0b3JJbnB1dChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChFT2JqZWN0KSBpbnB1dCkpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCXJldHVybiBuZXcgRmlsZUVkaXRvcklucHV0KChJRmlsZSkgaW5wdXQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlJQ29tcGlsYXRpb25Vbml0IGNvbXAgPSBnZXRDb21waWxhdGlvblVuaXQoamF2YUNsYXNzKTsKLQkJaWYgKGNvbXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBFZGl0b3JVdGlsaXR5LmdldEVkaXRvcklucHV0KGNvbXApOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKElGaWxlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEplbVByb2plY3RVdGlsaXRpZXMuZ2V0SmF2YU1vZGVsKCk7Ci0JCXJldHVybiBqYXZhTW9kZWwuZ2V0SmF2YVByb2plY3QoYVByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElQYWNrYWdlRnJhZ21lbnQgZm9yIHRoZSBKYXZhUGFja2FnZSBmb3IKLQkgKiAKLQkgKiBAamF2YUNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoSmF2YUNsYXNzIGphdmFDbGFzcywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUphdmFQYWNrYWdlIGphdmFQYWNrYWdlID0gKEphdmFQYWNrYWdlKSBqYXZhQ2xhc3MuZUNvbnRhaW5lcigpOwotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGphdmFQYWNrYWdlLmdldE5hbWUoKTsKLQkJCQlJUGFja2FnZUZyYWdtZW50W10gcGtnRnJhZ3MgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwa2dGcmFncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoKHBrZ0ZyYWdzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKSkpCi0JCQkJCQlyZXR1cm4gcGtnRnJhZ3NbaV07Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgSmF2YSBlZGl0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGlmIHRoZSBlbGVtZW50IGlzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IG9yIGEgSmF2YQotCSAqIGNsYXNzIGZpbGUuCi0JICogCi0JICogQHJldHVybiB0aGUgSUVkaXRvclBhcnQgb3IgbnVsbCBpZiB3cm9uZyBlbGVtZW50IHR5cGUgb3Igb3BlbmluZyBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5JbkVkaXRvcihKYXZhQ2xhc3MgamF2YUNsYXNzLCBJUHJvamVjdCBhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gb3BlbkluRWRpdG9yKGphdmFDbGFzcywgZ2V0SmF2YVByb2plY3QoYVByb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIEphdmEgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBpZiB0aGUgZWxlbWVudCBpcyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBvciBhIEphdmEKLQkgKiBjbGFzcyBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElFZGl0b3JQYXJ0IG9yIG51bGwgaWYgd3JvbmcgZWxlbWVudCB0eXBlIG9yIG9wZW5pbmcgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSmF2YUNsYXNzIGphdmFDbGFzcywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCB8fCBqYXZhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUeXBlIHR5cGUgPSBnZXRUeXBlKGphdmFDbGFzcyk7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gb3BlbkluRWRpdG9yKGdldENvbXBpbGF0aW9uVW5pdChqYXZhQ2xhc3MsIGphdmFQcm9qZWN0KSk7Ci0JCXJldHVybiBFZGl0b3JVdGlsaXR5Lm9wZW5JbkVkaXRvcih0eXBlKTsKLQl9Ci0KLQotCS8qKgotCSAqIE9wZW5zIGEgSmF2YSBlZGl0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGlmIHRoZSBlbGVtZW50IGlzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IG9yIGEgSmF2YQotCSAqIGNsYXNzIGZpbGUuCi0JICogCi0JICogQHJldHVybiB0aGUgSUVkaXRvclBhcnQgb3IgbnVsbCBpZiB3cm9uZyBlbGVtZW50IHR5cGUgb3Igb3BlbmluZyBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5JbkVkaXRvcihKYXZhQ2xhc3MgamF2YUNsYXNzLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBlZGl0b3JJZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gb3BlbkluRWRpdG9yKGdldENvbXBpbGF0aW9uVW5pdChqYXZhQ2xhc3MsIGphdmFQcm9qZWN0KSwgZWRpdG9ySWQpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgSmF2YSBlZGl0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGlmIHRoZSBlbGVtZW50IGlzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IG9yIGEgSmF2YQotCSAqIGNsYXNzIGZpbGUuCi0JICogCi0JICogQHJldHVybiB0aGUgSUVkaXRvclBhcnQgb3IgbnVsbCBpZiB3cm9uZyBlbGVtZW50IHR5cGUgb3Igb3BlbmluZyBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5JbkVkaXRvcihJQ29tcGlsYXRpb25Vbml0IGFDb21waWxhdGlvblVuaXQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIEVkaXRvclV0aWxpdHkub3BlbkluRWRpdG9yKGFDb21waWxhdGlvblVuaXQpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgSmF2YSBlZGl0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGlmIHRoZSBlbGVtZW50IGlzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IG9yIGEgSmF2YQotCSAqIGNsYXNzIGZpbGUuCi0JICogCi0JICogQHJldHVybiB0aGUgSUVkaXRvclBhcnQgb3IgbnVsbCBpZiB3cm9uZyBlbGVtZW50IHR5cGUgb3Igb3BlbmluZyBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5JbkVkaXRvcihJQ29tcGlsYXRpb25Vbml0IGFDb21waWxhdGlvblVuaXQsIFN0cmluZyBlZGl0b3JJZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gb3BlbkluRWRpdG9yKEVkaXRvclV0aWxpdHkuZ2V0RWRpdG9ySW5wdXQoYUNvbXBpbGF0aW9uVW5pdCksIGVkaXRvcklkKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSUVkaXRvcklucHV0IGlucHV0LCBTdHJpbmcgZWRpdG9ySUQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwID0gSjJFRVVJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwICE9IG51bGwpCi0JCQkJcmV0dXJuIHAub3BlbkVkaXRvcihpbnB1dCwgZWRpdG9ySUQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTRhYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDMwLCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICovCi1wdWJsaWMgY2xhc3MgSjJFRVVJQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBJTEFVTkNIQUJMRV9DTEFTUyA9IElMYXVuY2hhYmxlLmNsYXNzOwotCi0JLyoqCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKMkVFVUlBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlpZiAoYWRhcHRlclR5cGUgPT0gSUxBVU5DSEFCTEVfQ0xBU1MpCi0JCQkJcmV0dXJuIGFkYXB0YWJsZU9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SUxBVU5DSEFCTEVfQ0xBU1N9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDg2ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBKMkVFVUlDb250ZXh0SWRzIHsKLQkvL01pZ3JhdGlvbiBXaXphcmQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUdSQVRJT05fV0laQVJEX0dFTkVSQUwgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5taWdyMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUdSQVRJT05fV0laQVJEX0VBUiA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm1pZ3IxMDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JR1JBVElPTl9XSVpBUkRfRUpCID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubWlncjExMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlHUkFUSU9OX1dJWkFSRF9DTVAgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5taWdyMTUwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUdSQVRJT05fV0laQVJEX1dFQiA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm1pZ3IxMjAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JR1JBVElPTl9XSVpBUkRfQVBQX0NMSUVOVCA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm1pZ3IxMzAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JR1JBVElPTl9XSVpBUkRfQ09OTkVDVE9SID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubWlncjE0MDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLwlEZWxldGUgRW50ZXJwcmlzZSBCZWFuIERpYWxvZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9FTlRFUlBSSVNFX0JFQU5fRElBTE9HID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuZGVsYjEwMDAiOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODY1Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVVSU1lc3NhZ2VzIGV4dGVuZHMgTWVzc2FnZXMgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEoyRUVVSU1lc3NhZ2VzIElOU1RBTkNFID0gbmV3IEoyRUVVSU1lc3NhZ2VzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0xPQ19MQkwgPSAiMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfUlVOVElNRV9MQkwgPSAiMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMkVFX1ZFUlNJT05fTEJMID0gIjMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfTE9BRF9FUlJPUiA9ICI0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QUk9KRUNUX1dJWl9USVRMRSA9ICI1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QUk9KRUNUX01BSU5fUEdfVElUTEUgPSAiNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUFJPSkVDVF9NQUlOX1BHX0RFU0MgPSAiNyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUFJPSkVDVF9NT0RVTEVTX1BHX1RJVExFID0gIjgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BST0pFQ1RfTU9EVUxFU19QR19ERVNDID0gIjkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BST0pFQ1RfTU9EVUxFU19QR19TRUxFQ1QgPSAiMTAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BST0pFQ1RfTU9EVUxFU19QR19ERVNFTEVDVCA9ICIxMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUFJPSkVDVF9NT0RVTEVTX1BHX05FVyA9ICIxMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfUFJPSkVDVF9GT1JfTU9EVUxFX0NSRUFUSU9OID0gIjEzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19USFJFRV9ET1RTX0UgPSAiMTQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RIUkVFX0RPVFNfVyA9ICIxNGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19NT0RVTEVUT19FQVJfUFJPSkVDVCA9ICIxNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTU9EX1NFTF9QR19USVRMRSA9ICIxNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTU9EX1NFTF9QR19ERVNDID0gIjE3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19NT0RfV0laX1RJVExFID0gIjE4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19NT0RfU0VMX1BHX0RFRl9CVE4gPSAiMTkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9QUk9KX0xCTCA9ICIyMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUFJPSl9MQkwgPSAiMjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BST0pfTEJMID0gIjIyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9QUk9KX0xCTCA9ICIyMyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfUFJPSkVDVF9XSVpfVElUTEUgPSAiMjQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9WRVJTSU9OX0xCTCA9ICIzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfUFJPSkVDVF9NQUlOX1BHX1RJVExFID0gIjI1IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9QUk9KRUNUX01BSU5fUEdfREVTQyA9ICIyNiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9USVRMRSA9ICIyNyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX0RFU0MgPSAiMjgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfQVZBSUxBQkxFX0pBUlMgPSAiMjkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfQ0xBU1NQQVRIID0gIjMwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RBQkxFX01PRFVMRSA9ICIzMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9UQUJMRV9QUk9KRUNUID0gIjMyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MQkwgPSAiMzMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9JTVBPUlRfTUFJTl9QR19ERVNDID0gIjM0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfSU1QT1JUX01BSU5fUEdfVElUTEUgPSAiMzUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9JTVBPUlRfRklMRV9MQUJFTCA9ICIzNiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfSU1QT1JUX1BST0pFQ1RfTEFCRUwgPSAiMzciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfV0laX1RJVExFID0gIjM4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfTUFJTl9QR19ERVNDID0gIjM5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfTUFJTl9QR19USVRMRSA9ICI0MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX0ZJTEVfTEFCRUwgPSAiNDEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUldSSVRFX1JFU09VUkNFUyA9ICI0MiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1BST0pFQ1RfVFlQRSA9ICI0MyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1BST0pFQ1RfVFlQRV9CSU5BUlkgPSAiNDQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9QUk9KRUNUX1RZUEVfU09VUkNFID0gIjQ1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfUEFSVElBTF9ERVZFTE9QTUVOVCA9ICI0NiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9VVElMX0JVVFRPTiA9ICI0OCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1NFTEVDVF9BTExfVVRJTF9CVVRUT04gPSAiNDciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9KQVJTX0dST1VQID0gIjQ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfU0VMRUNUX1VUSUxfSkFSU19UT19CRV9QUk9KRUNUUyA9ICI1MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1BST0pFQ1RfUEdfREVTQyA9ICI1MSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1BST0pFQ1RfUEdfVElUTEUgPSAiNTIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9MT0NBVElPTlNfR1JPVVAgPSAiNTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BST0pFQ1RfR1JPVVBfREVTQ1JJUFRJT04gPSAiNTQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0RFRkFVTFRfUk9PVF9SQURJTyA9ICI1NSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQUxURVJOQVRFX1JPT1RfUkFESU8gPSAiNTYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0RJUkVDVE9SWV9ETEcgPSAiNTciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9Nb2R1bGVzX2luX0VBUiA9ICI1OCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX05ld19Qcm9qZWN0X05hbWUgPSAiNTkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9GSUxFTkFNRVMgPSAiNjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0lNUE9SVF9QUk9KRUNUTkFNRVMgPSAiNjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9FWFBPUlRfREVTVElOQVRJT04gPSAiNjIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9FWFBPUlRfT1ZFUldSSVRFX0NIRUNLQk9YID0gIjYzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfRVhQT1JUX1NPVVJDRV9DSEVDS0JPWCA9ICI2NCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0VYUE9SVF9NQUlOX1BHX1RJVExFID0gIjY1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfRVhQT1JUX01BSU5fUEdfREVTQyA9ICI2NiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfV0laX1RJVExFID0gIjY3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9FWFBPUlRfTUFJTl9QR19USVRMRSA9ICI2OCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRVhQT1JUX01BSU5fUEdfREVTQyA9ICI2OSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRVhQT1JUX0lOQ0xVREVfUFJPSkVDVF9GSUxFUyA9ICI3MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRVhQT1JUX0lOQ0xVREVfUFJPSkVDVF9GSUxFU19ERVNDID0gIjcxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfSU5DTFVERV9QUk9KRUNUID0gIjcyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9JTVBPUlRfT1ZFUldSSVRFX05FU1RFRCA9ICI3NCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfUFJPSkVDVCA9ICI3NSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfSU1QT1JUX1BST0pFQ1RfTEFCRUwgPSAiNzYiOyAvLyROT04tTkxTLTEkCi0KLQkvL3N0cmluZyBmb3IgbWlncmF0aW9uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfT0NDVVJSRURfVElUTEUgPSAiNzciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfT0NDVVJSRURfTUVTU0FHRSA9ICI3OCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUllfUFJPSkVDVCA9ICI3OSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ0FOTk9UX0JFX1BFUkZPUk1FRF9PTl9CSU5fUFJPSkVDVCA9ICI4MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUk1BVElPTl9VSV8gPSAiODEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hPU0VOX09QX05PVF9BVkFJTEFCTEUgPSAiODIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRUpCX0NMSUVOVF9KQVIgPSAiOTAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0FOTk9UQVRJT05TID0gIjkxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9BTk5PVEFUSU9OU19TRVJWTEVUID0gIjk4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9BTk5PVEFUSU9OU19TVVBQT1JUID0gIjkyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJST1dTRV9MQUJFTCA9ICI5MyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0xBQkVMID0gIjk0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9DUkVBVEVfTUFJTiA9ICI5NSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfREVGQVVMVF9TRVNTSU9OX0JFQU4gPSAiOTYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUUgPSAiOTkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1ZFUlNJT05fTEFCRUwgPSAiMTAwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9VVElMSVRZX0pBUl9MSVNURUFSX0lNUE9SVF9TRUxFQ1RfVVRJTF9KQVJTX1RPX0JFX1BST0pFQ1RTID0gIjk3IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxFWElCTEVfUFJPSkVDVF9XSVpfVElUTEUgPSAiRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxFWElCTEVfUFJPSkVDVF9NQUlOX1BHX1RJVExFID0gIkZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRVhJQkxFX1BST0pFQ1RfTUFJTl9QR19ERVNDID0gIkZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9XSVpfVElUTEUgPSAiRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9NQUlOX1BHX1RJVExFID0gIkVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfTUFJTl9QR19ERVNDID0gIkVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9TRUNPTkRfUEdfVElUTEUgPSAiRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuc2Vjb25kUGFnZS50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09NUE9ORU5UX1NFQ09ORF9QR19ERVNDID0gIkVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnNlY29uZFBhZ2UuZGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfQ09NUE9ORU5UX1dJWl9USVRMRSA9ICJBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfQ09NUE9ORU5UX01BSU5fUEdfVElUTEUgPSAiQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0NPTVBPTkVOVF9NQUlOX1BHX0RFU0MgPSAiQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UuZGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBPTkVOVF9XSVpfVElUTEUgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBPTkVOVF9QQUdFX1RJVExFID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBPTkVOVF9QQUdFX0RFU0MgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmRlc2MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfUEFHRV9FSkJfTU9EVUxFX0xCTCA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwuZWpiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1BBR0VfV0VCX01PRFVMRV9MQkwgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLndlYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBPTkVOVF9QQUdFX0pDQV9NT0RVTEVfTEJMID0gIkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5sYWJlbC5qY2EiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfUEFHRV9BUFBDTElFTlRfTU9EVUxFX0xCTCA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwuYXBwY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1BBR0VfTkVXX01PRF9TRUxfUEdfREVGX0JUTiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuYnV0dG9uLnNlbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPTERFUl9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJGT0xERVJfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiQlJPV1NFX0JVVFRPTl9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9QQUNLQUdFX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfUEFDS0FHRV9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTkFNRV9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJDTEFTU19OQU1FX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIlNVUEVSQ0xBU1NfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19ERVNDID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBnZXRSZXNvdXJjZVN0cmluZygiUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQyA9IGdldFJlc291cmNlU3RyaW5nKCJQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FID0gZ2V0UmVzb3VyY2VTdHJpbmcoIlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX1RJVExFID0gZ2V0UmVzb3VyY2VTdHJpbmcoIlNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBnZXRSZXNvdXJjZVN0cmluZygiU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX01BSU5fQ0hFQ0tCT1hfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9CVVRUT05fTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiQUREX0JVVFRPTl9MQUJFTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0JVVFRPTiA9IGdldFJlc291cmNlU3RyaW5nKCJSRU1PVkVfQlVUVE9OIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IGdldFJlc291cmNlU3RyaW5nKCJJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBVVRJTF9DT01QT05FTlRfV0laX1RJVExFPSJKQVZBVVRJTF9DT01QT05FTlRfV0laX1RJVExFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFVVElMSVRZX01BSU5fUEdfVElUTEUgPSAiSkFWQVVUSUxJVFlfTUFJTl9QR19USVRMRSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFVVElMSVRZX01BSU5fUEdfREVTQyA9ICJKQVZBVVRJTElUWV9NQUlOX1BHX0RFU0MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVkFJTEFCTEVfSjJFRV9DT01QT05FTlRTPSJBVkFJTEFCTEVfSjJFRV9DT01QT05FTlRTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0pBUj0iRVhURVJOQUxfSkFSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREVkFSSUFCTEU9IkFERFZBUklBQkxFIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVE1VTFRJUExFTU9EVUxFUz0iU1VQUE9SVE1VTFRJUExFTU9EVUxFUyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRUZPTERFUj0iU09VUkNFRk9MREVSIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSU5TVEFOQ0UuZG9HZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmRvR2V0UmVzb3VyY2VTdHJpbmcoa2V5LCBhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIEoyRUVVSU1lc3NhZ2VzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLk1lc3NhZ2VzI2luaXRpYWxpemVCdW5kbGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiajJlZV91aSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwM2E2YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QuUGxhdGZvcm1VUkxDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5JbXBvcnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEoyRUVVSVBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggbG9jYXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEoyRUVVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKMkVFVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSBnZXRJbnN0YWxsVVJMKCk7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBpbnN0YWxsTG9jYXRpb24gPSAoKFBsYXRmb3JtVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCkpLmdldFVSTEFzTG9jYWwoKS5nZXRGaWxlKCk7Ci0JCQkJbG9jYXRpb24gPSBuZXcgUGF0aChpbnN0YWxsTG9jYXRpb24pOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW5zdGFsbF9Mb2NhdGlvbl9FcnJvcl8iLCBuZXcgT2JqZWN0W117dXJsfSkgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcmNoaXZlRGVmYXVsdFByb2plY3ROYW1lKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCWlmIChhbkFyY2hpdmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgdHlwZSA9IGdldEFyY2hpdmVUeXBlKGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBnZXRUeXBlRGVmYXVsdFByb2plY3ROYW1lKGFuQXJjaGl2ZS5nZXRVUkkoKSwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJjaGl2ZURlZmF1bHRVdGlsUHJvamVjdE5hbWUoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJaWYgKGFuQXJjaGl2ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCB0eXBlID0gZ2V0QXJjaGl2ZVR5cGUoYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGdldFR5cGVEZWZhdWx0VXRpbFByb2plY3ROYW1lKGFuQXJjaGl2ZS5nZXROYW1lKCksIHR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFyY2hpdmVEZWZhdWx0UHJvamVjdE5hbWUoQXJjaGl2ZSBhbkFyY2hpdmUsIEhhc2hTZXQgbW9kdWxlTmFtZXMpIHsKLQkJaWYgKGFuQXJjaGl2ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCB0eXBlID0gZ2V0QXJjaGl2ZVR5cGUoYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGdldFR5cGVEZWZhdWx0UHJvamVjdE5hbWUoYW5BcmNoaXZlLmdldFVSSSgpLCB0eXBlLCBtb2R1bGVOYW1lcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJjaGl2ZVR5cGUoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJaW50IHR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWlmIChhbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCkpCi0JCQkJCXR5cGUgPSBJbXBvcnRVdGlsLkVKQkpBUkZJTEU7Ci0JCQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzV0FSRmlsZSgpKQotCQkJCQl0eXBlID0gSW1wb3J0VXRpbC5XQVJGSUxFOwotCQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKQotCQkJCQl0eXBlID0gSW1wb3J0VXRpbC5DTElFTlRKQVJGSUxFOwotCQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc1JBUkZpbGUoKSkKLQkJCQkJdHlwZSA9IEltcG9ydFV0aWwuUkFSRklMRTsKLQkJCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFQVJGaWxlKCkpCi0JCQkJCXR5cGUgPSBJbXBvcnRVdGlsLkVBUkZJTEU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYW5BcmNoaXZlICE9IG51bGwpCi0JCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlZmF1bHRQcm9qZWN0TmFtZShTdHJpbmcgdGV4dCwgaW50IHR5cGUpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHRleHQpOwotCQl0ZXh0ID0gcGF0aC5tYWtlUmVsYXRpdmUoKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQotCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHRleHQpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0JCQlleGlzdHMgPSB0cnVlOwotCQlpZiAoZXhpc3RzICYmIHRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKEltcG9ydFV0aWwuU1VGRklYRVNbdHlwZV0udG9Mb3dlckNhc2UoKSkgPT0gLTEpCi0JCQl0ZXh0ID0gdGV4dCArIEltcG9ydFV0aWwuU1VGRklYRVNbdHlwZV07Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGogPSAxOyBqIDwgMTA7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJU3RyaW5nIGl0ZXJhdGVkUHJvamVjdE5hbWUgPSB0ZXh0ICsgKChqID09IDEpID8gIiIgOiBJbnRlZ2VyLnRvU3RyaW5nKGopKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiAoaSA8IHByb2plY3RzLmxlbmd0aCk7IGkrKykgewotCQkJCWlmICgocHJvamVjdHNbaV0pLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGl0ZXJhdGVkUHJvamVjdE5hbWUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKQotCQkJCXJldHVybiBpdGVyYXRlZFByb2plY3ROYW1lOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlRGVmYXVsdFByb2plY3ROYW1lKFN0cmluZyB0ZXh0LCBpbnQgdHlwZSwgSGFzaFNldCBtb2R1bGVOYW1lcykgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodGV4dCk7Ci0JCXRleHQgPSBwYXRoLm1ha2VSZWxhdGl2ZSgpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCi0JCWJvb2xlYW4gaXNWYWxpZE5hbWUgPSBtb2R1bGVOYW1lcy5hZGQodGV4dCk7Ci0JCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodGV4dCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLQkJCWV4aXN0cyA9IHRydWU7Ci0JCWlmICghaXNWYWxpZE5hbWUgfHwgKGV4aXN0cyAmJiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdLnRvTG93ZXJDYXNlKCkpID09IC0xKSkKLQkJCXRleHQgPSB0ZXh0ICsgSW1wb3J0VXRpbC5TVUZGSVhFU1t0eXBlXTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaiA9IDE7IGogPCAxMDsgaisrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlTdHJpbmcgaXRlcmF0ZWRQcm9qZWN0TmFtZSA9IHRleHQgKyAoKGogPT0gMSkgPyAiIiA6IEludGVnZXIudG9TdHJpbmcoaikpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIChpIDwgcHJvamVjdHMubGVuZ3RoKTsgaSsrKSB7Ci0JCQkJaWYgKChwcm9qZWN0c1tpXSkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaXRlcmF0ZWRQcm9qZWN0TmFtZSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGl0ZXJhdGVkUHJvamVjdE5hbWU7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLy8gdGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBhcmUgdXNlZCBieSB3ZWIgZWRpdG9yCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlZmF1bHRVdGlsUHJvamVjdE5hbWUoU3RyaW5nIHRleHQsIGludCB0eXBlKSB7Ci0JCXRleHQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0Lmxhc3RJbmRleE9mKGphdmEuaW8uRmlsZS5zZXBhcmF0b3IpICsgMSk7Ci0JCWludCBpID0gdGV4dC5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaSA+IDApCi0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgaSk7Ci0JCWlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdLnRvTG93ZXJDYXNlKCkpID09IC0xKQotCQkJdGV4dCA9IHRleHQgKyBJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJU3RyaW5nIGl0ZXJhdGVkUHJvamVjdE5hbWUgPSB0ZXh0ICsgKChqID09IDApID8gIiIgOiBJbnRlZ2VyLnRvU3RyaW5nKGopKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpID0gMDsgIWZvdW5kICYmIChpIDwgcHJvamVjdHMubGVuZ3RoKTsgaSsrKSB7Ci0JCQkJaWYgKChwcm9qZWN0c1tpXSkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaXRlcmF0ZWRQcm9qZWN0TmFtZSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGl0ZXJhdGVkUHJvamVjdE5hbWU7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgLmdpZiBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWltYWdlID0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaW1hZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0SW1hZ2VVUkwoa2V5LCBnZXRCdW5kbGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIGdldFBsdWdpbldvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya2JlbmNoCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZXJuYWwgdG8gdGhlIGoyZWUgcGx1Z2luIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2ggZ2V0UGx1Z2luV29ya2JlbmNoKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCXJldHVybiAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0KLQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSVBsdWdpbkljb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSVBsdWdpbkljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDA4NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW5JY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVVSVBsdWdpbkljb25zIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUiA9ICJpbXBvcnRfZWFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfSU1QT1JUX1dJWkFSRF9CQU5ORVIgPSAiaW1wb3J0X3Jhcl93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0lNUE9SVF9XSVpBUkRfQkFOTkVSID0gImltcG9ydF9lamJqYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfSU1QT1JUX1dJWkFSRF9CQU5ORVIgPSAiaW1wb3J0X2FwcGNsaWVudF93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lNUE9SVF9XSVpBUkRfQkFOTkVSID0gImltcG9ydF93YXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9XSVpfQkFOTkVSID0gImVhcl93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9QUk9KRUNUX1dJWkFSRF9CQU5ORVIgPSAiYXBwY2xpZW50X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQkvL0VKQiBJY29ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9QUk9KRUNUX1dJWkFSRF9CQU5ORVIgPSAiZWpicHJvamVjdF93aXoiOyAvLyROT04tTkxTLTEkCi0JLy9XRUIgSWNvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSkVDVF9XSVpBUkRfQkFOTkVSID0gIndhcl93aXoiOyAvLyROT04tTkxTLTEkCi0JLy9KQ0EgSWNvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfUFJPSkVDVF9XSVpBUkRfQkFOTkVSID0gImNvbm5lY3Rvcl93aXoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9FWFBPUlRfV0laQVJEX0JBTk5FUiA9ICJleHBvcnRfYXBwY2xpZW50X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRVhQT1JUX1dJWkFSRF9CQU5ORVIgPSAiZXhwb3J0X2VqYmphcl9vYmoiOyAvLyROT04tTkxTLTEkOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9FWFBPUlRfV0laQVJEX0JBTk5FUiA9ICJleHBvcnRfd2FyX3dpeiI7IC8vJE5PTi1OTFMtMSQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0VYUE9SVF9XSVpBUkRfQkFOTkVSID0gImV4cG9ydF9yYXJfd2l6IjsgLy8kTk9OLU5MUy0xJDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfRVhQT1JUX1dJWkFSRF9CQU5ORVIgPSAiZXhwb3J0X2Vhcl93aXoiOyAvLyROT04tTkxTLTEkOwotCi0JLy9NaWdyYXRpb24gV2l6YXJkIEljb25zCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX1RBU0sgPSAic2hvd3dhcm5fdHNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0JBTk5FUiA9ICJlamJjbGllbnRqYXJfd2l6YmFuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlHUkFUSU9OX1dJWkFSRF9CQU5ORVIgPSAidmVyc2lvbm1pZ3JhdGUzX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVmlld2VyU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjODRmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotcHVibGljIGNsYXNzIEoyRUVWaWV3ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVWaWV3ZXJTb3J0ZXIuCi0JICovCi0JcHVibGljIEoyRUVWaWV3ZXJTb3J0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIEBzZWUgVmlld2VyU29ydGVyI2NvbXBhcmUoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaWYgKHNob3VsZFNvcnQoZTEsIGUyKSkKLQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlQmVhbihPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KE9iamVjdCBvKSB7Ci0JCXJldHVybiBDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNvcnQoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJcmV0dXJuIChpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChlMSkgJiYgaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoZTIpKSB8fCAoaXNFbnRlcnByaXNlQmVhbihlMSkgJiYgaXNFbnRlcnByaXNlQmVhbihlMikpIHx8ICgoZTEgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKGUyIGluc3RhbmNlb2YgSUZpbGUpKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vVUlQcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL1VJUHJvamVjdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWIxMzEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vVUlQcm9qZWN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgVUlQcm9qZWN0VXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbgotCSAqIEByZXR1cm4gVGhlIGZpcnN0IHByb2plY3QgKHJlZ2FyZGxlc3Mgb2YgbmF0dXJlKSBpbiB0aGUgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRTZWxlY3RlZFByb2plY3QoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RlZFByb2plY3Qoc2VsZWN0aW9uLCAoU3RyaW5nKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gZXhwZWN0ZWROYXR1cmVJZAotCSAqICAgICAgICAgICAgVGhlIHJlcXVpcmVkIE5hdHVyZSBJRAotCSAqIEByZXR1cm4gVGhlIGZpcnN0IHByb2plY3QsIG9ubHkgaWYgdGhlIGZpcnN0IHByb2plY3QgaGFzIHRoZSBnaXZlbiBuYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFNlbGVjdGVkUHJvamVjdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZyBleHBlY3RlZE5hdHVyZUlkKSB7Ci0KLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJCXByb2plY3QgPSAoSVByb2plY3QpIG9iajsKLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQlwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBvYmopOwotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IHRlbXAgPSAoKEl0ZW1Qcm92aWRlcikgb2JqKS5nZXRQYXJlbnQoRU9iamVjdC5jbGFzcyk7Ci0JCQkJaWYgKHRlbXAgIT0gbnVsbCAmJiB0ZW1wIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgdGVtcCk7Ci0JCQl9Ci0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgZXhwZWN0ZWROYXR1cmVJZCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKGV4cGVjdGVkTmF0dXJlSWQpKQotCQkJCQkJcmV0dXJuIHByb2plY3Q7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXJldHVybiBwcm9qZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbgotCSAqIEBwYXJhbSBwb3NzaWJsZU5hdHVyZUlkcwotCSAqICAgICAgICAgICAgQSBsaXN0IG9mIHBvc3NpYmxlIG5hdHVyZSBpZHMKLQkgKiBAcmV0dXJuIFRoZSBmaXJzdCBwcm9qZWN0IHNlbGVjdGVkLCBvbmx5IGlmIGl0IGhhcyBBVCBMRUFTVCBPTkUgb2YgdGhlIHBvc3NpYmxlIG5hdHVyZSBpZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFNlbGVjdGVkUHJvamVjdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlSWRzKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJCXByb2plY3QgPSAoSVByb2plY3QpIG9iajsKLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQlwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBvYmopOwotCi0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHBvc3NpYmxlTmF0dXJlSWRzICE9IG51bGwgJiYgcG9zc2libGVOYXR1cmVJZHMubGVuZ3RoID4gMCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVOYXR1cmVJZHMubGVuZ3RoOyBpKyspCi0JCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUocG9zc2libGVOYXR1cmVJZHNbaV0pKQotCQkJCQkJCXJldHVybiBwcm9qZWN0OwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIEFsbCBzZWxlY3RlZCBQcm9qZWN0cywgcmVnYXJkbGVzcyBvZiBuYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsU2VsZWN0ZWRQcm9qZWN0cyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGdldEFsbFNlbGVjdGVkUHJvamVjdHMoc2VsZWN0aW9uLCAoU3RyaW5nKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gZXhwZWN0ZWROYXR1cmVJZAotCSAqICAgICAgICAgICAgVGhlIGV4cGVjdGVkIG5hdHVyZSBpZAotCSAqIEByZXR1cm4gQWxsIHNlbGVjdGVkIFByb2plY3RzIHdoaWNoIGhhdmUgdGhlIGV4cGVjdGVkIG5hdHVyZSBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRBbGxTZWxlY3RlZFByb2plY3RzKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nIGV4cGVjdGVkTmF0dXJlSWQpIHsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJCUxpc3QgcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHNlbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCW9iaiA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJCXByb2plY3QgPSAoSVByb2plY3QpIG9iajsKLQkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJCQlwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIG9iaikuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgZXhwZWN0ZWROYXR1cmVJZCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0KLQkJCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShleHBlY3RlZE5hdHVyZUlkKSkKLQkJCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCX0KLQkJCUlQcm9qZWN0W10gZmluYWxQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldOwotCQkJcHJvamVjdHMudG9BcnJheShmaW5hbFByb2plY3RzKTsKLQkJCXJldHVybiBmaW5hbFByb2plY3RzOwotCQl9Ci0JCXJldHVybiBuZXcgSVByb2plY3RbMF07Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gcG9zc2libGVOYXR1cmVJZHMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBwb3NzaWJsZSBuYXR1cmUgaWRzCi0JICogQHJldHVybiBBbGwgc2VsZWN0ZWQgUHJvamVjdHMgd2hpY2ggaGF2ZSBBVCBMRUFTVCBPTkUgb2YgdGhlIGdpdmVuIG5hdHVyZSBpZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsU2VsZWN0ZWRQcm9qZWN0cyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlSWRzKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlMaXN0IHByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3Igc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlvYmogPSBzZWxlY3Rpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBvYmo7Ci0JCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCXByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKEVPYmplY3QpIG9iaik7Ci0KLQkJCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHBvc3NpYmxlTmF0dXJlSWRzICE9IG51bGwgJiYgcG9zc2libGVOYXR1cmVJZHMubGVuZ3RoID4gMCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NzaWJsZU5hdHVyZUlkcy5sZW5ndGg7IGkrKykKLQkJCQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUocG9zc2libGVOYXR1cmVJZHNbaV0pKQotCQkJCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCX0KLQkJCUlQcm9qZWN0W10gZmluYWxQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldOwotCQkJcHJvamVjdHMudG9BcnJheShmaW5hbFByb2plY3RzKTsKLQkJCXJldHVybiBmaW5hbFByb2plY3RzOwotCQl9Ci0JCXJldHVybiBuZXcgSVByb2plY3RbMF07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E4OGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXI7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUgbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJDbGFzcyA9IElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzczsKLQlwcm90ZWN0ZWQgTGlzdCByb290cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIEoyRUVBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSjJFRUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUgPSBuZXcgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQotCQlpZiAoTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUucHJvdmlkZXNDb250ZW50Rm9yKG9iamVjdCkpCi0JCQlyZXR1cm4gbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuZ2V0UGFyZW50KG9iamVjdCk7Ci0KLQkJLy9BZGRlZCBzbyBpbnRlcm5hbEV4cGFuZCgpIGluIEFic3RyYWN0VHJlZVZpZXdlciBrbm93cyB0aGF0IEVKQidzIHBhcmVudCBpcyBub3cgaW5zdGFuY2UKLQkJLy8gb2YgSjJFRUl0ZW1Qcm92aWRlcgotCQkvL3JhdGhlciB0aGFuIEVKQkphciBvbmx5IGlmIGJlYW4gaXMgcm9vdCBiZWFuCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbiAmJiBHcm91cGVkRUpCSmFySXRlbVByb3ZpZGVyLmlzUm9vdEJlYW4oKEVudGVycHJpc2VCZWFuKSBvYmplY3QpKSB7Ci0JCQlKMkVFSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5nZXRFSkJJdGVtUHJvdmlkZXIoKEVudGVycHJpc2VCZWFuKSBvYmplY3QpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQotCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0KLQkJLy8JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkvLwkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkvLwkJCQlyZXR1cm4gSjJFRVJvb3QuaW5zdGFuY2UoKS5ncm91cEZvcigoRU9iamVjdCkgb2JqZWN0KTsKLQkJLy8JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VNRkVkaXRPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzKTsKLQkJcmV0dXJuIHRyZWVJdGVtQ29udGVudFByb3ZpZGVyICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQotCQlpZiAoTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUucHJvdmlkZXNDb250ZW50Rm9yKHBhcmVudEVsZW1lbnQpKQotCQkJcmV0dXJuIG1ldGhvZHNQcm92aWRlckRlbGVnYXRlLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQllbHNlIGlmIChpc0VNRkVkaXRPYmplY3QocGFyZW50RWxlbWVudCkpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFJvb3RzKGlucHV0RWxlbWVudCk7Ci0JCS8vCQllbHNlIGlmIChNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5wcm92aWRlc0NvbnRlbnRGb3IoaW5wdXRFbGVtZW50KSkKLQkJLy8JCQlyZXR1cm4gbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJLy8JCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRSb290cyhPYmplY3QgcGFyZW50KSB7Ci0JCWlmIChyb290cy5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGoyZWVHcm91cHMgPSBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJcm9vdHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoajJlZUdyb3VwcykpOwotCQl9Ci0JCXJldHVybiByb290cy50b0FycmF5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUucHJvdmlkZXNDb250ZW50Rm9yKGVsZW1lbnQpKQotCQkJcmV0dXJuIG1ldGhvZHNQcm92aWRlckRlbGVnYXRlLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCQllbHNlIGlmIChpc0VNRkVkaXRPYmplY3QoZWxlbWVudCkpCi0JCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUgIT0gbnVsbCkKLQkJCW1ldGhvZHNQcm92aWRlckRlbGVnYXRlLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFWaWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCXN1cGVyLmlucHV0Q2hhbmdlZChhVmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQltZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5pbnB1dENoYW5nZWQoYVZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzNjg2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDEwOjQwOjQxIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIHsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBJSXRlbUxhYmVsUHJvdmlkZXJDbGFzcyA9IElJdGVtTGFiZWxQcm92aWRlci5jbGFzczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgUk9MRV9OQU1FX1NGID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIFJPTEVTX1NGID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldE1ldGhvZFBlcm1pc3Npb25fUm9sZXMoKTsKLQotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIGZvciBkZWxlZ2F0aW9uIHRvIGdldCBsYWJlbHMgZm9yIHNlcnZlciBvYmplY3RzLCB3aGljaCBkb24ndCBmaXQgaW50byBFTUYgZWRpdAotCSAqLwotCXByb3RlY3RlZCBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIHdiTGFiZWxQcm92aWRlcjsKLQotCXB1YmxpYyBKMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJd2JMYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcmV0dXJuICgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBvYmplY3QpLmdldEltYWdlKCk7Ci0JCWVsc2UgaWYgKGlzRU1GRWRpdE9iamVjdChvYmplY3QpKQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKCgoQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pIG9iamVjdCkuZWpiKTsKLQkJcmV0dXJuIHdiTGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXJldHVybiAoKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgb2JqZWN0KS5nZXRUZXh0KCk7Ci0JCWVsc2UgaWYgKGlzRU1GRWRpdE9iamVjdChvYmplY3QpKSB7Ci0JCQlpZiAoQ29tbW9uVXRpbC5pc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChvYmplY3QpKQotCQkJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVwbG95bWVudF9EZXNjcmlwdG9yX1VJXyIpICsgIjogIiArIHN1cGVyLmdldFRleHQob2JqZWN0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSkKLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KCgoQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pIG9iamVjdCkuZWpiKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXJldHVybiAoKElGaWxlKSBvYmplY3QpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiB3YkxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRU1GRWRpdE9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCUlJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSUl0ZW1MYWJlbFByb3ZpZGVyQ2xhc3MpOwotCQlyZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXIgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciNub3RpZnlDaGFuZ2VkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KU9iamVjdCwKLQkgKiAgICAgIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChmZWF0dXJlID09IFJPTEVfTkFNRV9TRiB8fCBmZWF0dXJlID09IFJPTEVTX1NGKQotCQkJZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczNTVjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24ucHJvdmlkZXIuQXBwbGljYXRpb25JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVOb3RpZmljYXRpb25JbXBsOwotCi1wdWJsaWMgY2xhc3MgSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQXBwbGljYXRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQotCXByb3RlY3RlZCBNYXAgY2hpbGRyZW4gPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBMaXN0IHJlc291cmNlQWRhcHRlcnMgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBsb2NhbENoaWxkcmVuID0gKExpc3QpIGNoaWxkcmVuLmdldChvYmplY3QpOwotCQlpZiAobG9jYWxDaGlsZHJlbiA9PSBudWxsKQotCQkJcmV0dXJuIGluaXRDaGlsZHJlbihvYmplY3QpOwotCQlyZXR1cm4gbG9jYWxDaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBpbml0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlBcHBsaWNhdGlvbiBhcHAgPSAoQXBwbGljYXRpb24pIG9iamVjdDsKLQkJTGlzdCBsb2NhbENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJLy8gTURFOiBjaGFuZ2VkIGdldFBhcmVudChvYmplY3QpIHRvIGp1c3QgYXBwCi0JCWxvY2FsQ2hpbGRyZW4uYWRkKG5ldyBNb2R1bGVzSXRlbVByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCksIG51bGwsIG51bGwsIGFwcCwgYXBwLmdldE1vZHVsZXMoKSkpOwotCi0vLwkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHApOwotLy8JCUlWaXJ0dWFsQ29tcG9uZW50IGVhciA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kQ29tcG9uZW50KGFwcCk7Ci0JCS8vVE9ETyBzd2l0Y2ggdG8gcmV0cmlldmUgcmVmZXJlbmNlQ29tcG9uZW50cwotLy8JCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBudWxsOwotLy8JCXRyeSB7Ci0vLwkJCUVBUk5hdHVyZVJ1bnRpbWUgcnVudGltZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLS8vCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotLy8JCQkJZWRpdE1vZGVsID0gcnVudGltZS5nZXRFYXJFZGl0TW9kZWxGb3JSZWFkKHRoaXMpOwotLy8JCQkJRUFSUHJvamVjdE1hcCBtYXAgPSBlZGl0TW9kZWwuZ2V0RUFSUHJvamVjdE1hcCgpOwotLy8JCQkJbG9jYWxDaGlsZHJlbi5hZGQobWFwKTsKLS8vCQkJCW1hcC5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQoZ2V0TmV3QWRhcHRlcihhcHApKTsKLS8vCQkJfQotLy8JCX0gZmluYWxseSB7Ci0vLwkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkKLS8vCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCX0KLQkJbG9jYWxDaGlsZHJlbi5hZGQobmV3IEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKGFwcCwgZ2V0QWRhcHRlckZhY3RvcnkoKSwgdGhpcykpOwotCi0JCWNoaWxkcmVuLnB1dChvYmplY3QsIGxvY2FsQ2hpbGRyZW4pOwotCQlyZXR1cm4gbG9jYWxDaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kdWxlc0l0ZW1Qcm92aWRlciBnZXRNb2R1bGVzTm9kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoTW9kdWxlc0l0ZW1Qcm92aWRlcikgKChMaXN0KSBnZXRDaGlsZHJlbihvYmplY3QpKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIEFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClOb3RpZmllciwKLQkgKiAgICAgIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXBwbGljYXRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTU9EVUxFUyA6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUiAmJiBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSA9PSB0aGlzKQotCQkJY2hpbGRyZW4ucmVtb3ZlKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBBcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmdldFBhY2thZ2UoKS5nZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCkpCi0JCQltb2R1bGVzQ2hhbmdlZCgoQXBwbGljYXRpb24pIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCksIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSwgbm90aWZpY2F0aW9uLmdldFBvc2l0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vZHVsZXNDaGFuZ2VkKEFwcGxpY2F0aW9uIGFwcCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJTW9kdWxlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IGdldE1vZHVsZXNOb2RlKGFwcCk7Ci0JCUNvbGxlY3Rpb24gZ3JhbmRDaGlsZHJlbiA9IHByb3ZpZGVyLmdldENoaWxkcmVuKCk7Ci0JCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOiB7Ci0JCQkJZ3JhbmRDaGlsZHJlbi5hZGQobmV3VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOiB7Ci0JCQkJZ3JhbmRDaGlsZHJlbi5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6IHsKLQkJCQlncmFuZENoaWxkcmVuLnJlbW92ZShvbGRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6IHsKLQkJCQlncmFuZENoaWxkcmVuLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgb2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJTGlzdCBhZGFwdGVycyA9IGdldFJlc291cmNlQWRhcHRlcnMoKTsKLQkJUmVzb3VyY2VBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlhZGFwdGVyID0gKFJlc291cmNlQWRhcHRlcikgYWRhcHRlcnMuZ2V0KGkpOwotCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCi0JCXByaXZhdGUgQXBwbGljYXRpb24gYXBwID0gbnVsbDsKLQotCQlwdWJsaWMgUmVzb3VyY2VBZGFwdGVyKEFwcGxpY2F0aW9uIGFwcCkgewotCQkJdGhpcy5hcHAgPSBhcHA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCAmJiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQgJiYgIXJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLnRoaXMuY2hpbGRyZW4ucmVtb3ZlKGFwcCk7Ci0JCQkJcmVzLmVBZGFwdGVycygpLnJlbW92ZShSZXNvdXJjZUFkYXB0ZXIudGhpcyk7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IEoyRUVOb3RpZmljYXRpb25JbXBsKGFwcCwgTm90aWZpY2F0aW9uLk1PVkUsIChPYmplY3QpIG51bGwsIChPYmplY3QpIG51bGwsIDApKTsKLQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlciBnZXROZXdBZGFwdGVyKEFwcGxpY2F0aW9uIGtleSkgewotCQlSZXNvdXJjZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBSZXNvdXJjZUFkYXB0ZXIoa2V5KTsKLQkJZ2V0UmVzb3VyY2VBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZXNvdXJjZUFkYXB0ZXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFJlc291cmNlQWRhcHRlcnMoKSB7Ci0JCWlmIChyZXNvdXJjZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXNvdXJjZUFkYXB0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcmVzb3VyY2VBZGFwdGVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4M2QxMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyLkFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRUFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuCi0JICovCi0JcHVibGljIEoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBKMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVFZGl0aW5nRG9tYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUVkaXRpbmdEb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwN2JkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUVkaXRpbmdEb21haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weVRvQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuSW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5PdmVycmlkZWFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZXBsYWNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLQotLyoqCi0gKiBDdXN0b20gZWRpdGluZyBkb21haW4gd2hpY2ggcHJvdmlkZXMgaG9va3MgZm9yIGNyZWF0aW5nIG92ZXJyaWRlIGNvbW1hbmRzOyBzaG91bGQgbm90IGJlIHVzZWQKLSAqIGRpcmVjdGx5IGJ1dCBjYW4gYmUgc3ViY2xhc3NlZCB0byBvdmVycmlkZSBjb21tYW5kcyBhcyBuZWNlc3NhcnkuIEFsbCB0aGUgb3ZlcnJpZGUgbWV0aG9kcyBieQotICogZGVmYXVsdCByZXR1cm4gbnVsbCwgc28gYSBzdWJjbGFzcyBtYXkgb3ZlcnJpZGUgb25seSBhIHN1YnNldCBvZiB0aGUgY29tbWFuZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRWRpdGluZ0RvbWFpbiBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiB7Ci0JLyoqCi0JICogSjJFRUVkaXRpbmdEb21haW4gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgQ29tbWFuZFN0YWNrCi0JICovCi0JcHVibGljIEoyRUVFZGl0aW5nRG9tYWluKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2spOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZE92ZXJyaWRlQ29tbWFuZChBZGRDb21tYW5kIGFkZENvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKENvcHlUb0NsaXBib2FyZENvbW1hbmQgY29weVRvQ2xpcGJvYXJkQ29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5T3ZlcnJpZGVDb21tYW5kKENyZWF0ZUNvcHlDb21tYW5kIGNyZWF0ZUNvcHlDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wT3ZlcnJpZGVDb21tYW5kKERyYWdBbmREcm9wQ29tbWFuZCBkcmFnQW5kRHJvcENvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlPdmVycmlkZUNvbW1hbmQoSW5pdGlhbGl6ZUNvcHlDb21tYW5kIGluaXRpYWxpemVDb3B5Q29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlT3ZlcnJpZGVDb21tYW5kKE1vdmVDb21tYW5kIG1vdmVDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZU92ZXJyaWRlQ29tbWFuZChPdmVycmlkZWFibGVDb21tYW5kIGNvbW1hbmQpIHsKLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQlBZGRDb21tYW5kIGFkZENvbW1hbmQgPSAoQWRkQ29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVBZGRPdmVycmlkZUNvbW1hbmQoYWRkQ29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCVJlbW92ZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCA9IChSZW1vdmVDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZVJlbW92ZU92ZXJyaWRlQ29tbWFuZChyZW1vdmVDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgU2V0Q29tbWFuZCkgewotCQkJU2V0Q29tbWFuZCBzZXRDb21tYW5kID0gKFNldENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlyZXR1cm4gY3JlYXRlU2V0T3ZlcnJpZGVDb21tYW5kKHNldENvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBSZXBsYWNlQ29tbWFuZCkgewotCQkJUmVwbGFjZUNvbW1hbmQgcmVwbGFjZUNvbW1hbmQgPSAoUmVwbGFjZUNvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlyZXR1cm4gY3JlYXRlUmVwbGFjZU92ZXJyaWRlQ29tbWFuZChyZXBsYWNlQ29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIE1vdmVDb21tYW5kKSB7Ci0JCQlNb3ZlQ29tbWFuZCBtb3ZlQ29tbWFuZCA9IChNb3ZlQ29tbWFuZCkgY29tbWFuZDsKLQkJCXJldHVybiBjcmVhdGVNb3ZlT3ZlcnJpZGVDb21tYW5kKG1vdmVDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgQ3JlYXRlQ29weUNvbW1hbmQpIHsKLQkJCUNyZWF0ZUNvcHlDb21tYW5kIGNyZWF0ZUNvcHlDb21tYW5kID0gKENyZWF0ZUNvcHlDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZUNyZWF0ZUNvcHlPdmVycmlkZUNvbW1hbmQoY3JlYXRlQ29weUNvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBJbml0aWFsaXplQ29weUNvbW1hbmQpIHsKLQkJCUluaXRpYWxpemVDb3B5Q29tbWFuZCBpbml0aWFsaXplQ29weUNvbW1hbmQgPSAoSW5pdGlhbGl6ZUNvcHlDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZUluaXRpYWxpemVDb3B5T3ZlcnJpZGVDb21tYW5kKGluaXRpYWxpemVDb3B5Q29tbWFuZCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvcHlUb0NsaXBib2FyZENvbW1hbmQpIHsKLQkJCUNvcHlUb0NsaXBib2FyZENvbW1hbmQgY29weVRvQ2xpcGJvYXJkQ29tbWFuZCA9IChDb3B5VG9DbGlwYm9hcmRDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChjb3B5VG9DbGlwYm9hcmRDb21tYW5kKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBwYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kID0gKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlyZXR1cm4gY3JlYXRlUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKHBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcENvbW1hbmQpIHsKLQkJCURyYWdBbmREcm9wQ29tbWFuZCBkcmFnQW5kRHJvcENvbW1hbmQgPSAoRHJhZ0FuZERyb3BDb21tYW5kKSBjb21tYW5kOwotCQkJcmV0dXJuIGNyZWF0ZURyYWdBbmREcm9wT3ZlcnJpZGVDb21tYW5kKGRyYWdBbmREcm9wQ29tbWFuZCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIHBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaXMgbm90IHRvIG92ZXJyaWRlIHRoaXMgY29tbWFuZDsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlT3ZlcnJpZGVDb21tYW5kKFJlbW92ZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyBub3QgdG8gb3ZlcnJpZGUgdGhpcyBjb21tYW5kOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZXBsYWNlT3ZlcnJpZGVDb21tYW5kKFJlcGxhY2VDb21tYW5kIHJlcGxhY2VDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBvdmVycmlkZSB0aGlzIGNvbW1hbmQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVNldE92ZXJyaWRlQ29tbWFuZChTZXRDb21tYW5kIHNldENvbW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1MjcwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlbWFwQWRhcHRlckZhY3RvcnkjY3JlYXRlRUFSUHJvamVjdE1hcEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBUlByb2plY3RNYXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyKHRoaXMsIGZhbHNlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVByb3ZpZGVyVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVQcm92aWRlclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzOWJhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVByb3ZpZGVyVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFUHJvdmlkZXJVdGlsaXR5IHsKLQotCXByaXZhdGUgSjJFRVByb3ZpZGVyVXRpbGl0eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVwZW5kUHJvamVjdE5hbWUoRU9iamVjdCBvYmplY3QsIFN0cmluZyBsYWJlbCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCQlpZiAob2JqZWN0LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2ogPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQcm9qZWN0KG9iamVjdC5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAocHJvaiAhPSBudWxsKQotCQkJCXByb2plY3ROYW1lID0gcHJvai5nZXROYW1lKCk7Ci0JCX0KLQotCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5lcXVhbHMobGFiZWwpKQotCQkJcmV0dXJuIGxhYmVsOwotCQllbHNlIGlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JCWVsc2UKLQkJCXJldHVybiBwcm9qZWN0TmFtZSArICI6ICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVUlFZGl0aW5nRG9tYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVVJRWRpdGluZ0RvbWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2U2MzA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVUlFZGl0aW5nRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weVRvQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQuSjJFRUNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kLkoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbWFuZC5KMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1hbmQuSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgSjJFRVVJRWRpdGluZ0RvbWFpbiBleHRlbmRzIEoyRUVFZGl0aW5nRG9tYWluIHsKLQkvKioKLQkgKiBKMkVFVUlFZGl0aW5nRG9tYWluIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIENvbW1hbmRTdGFjawotCSAqLwotCXB1YmxpYyBKMkVFVUlFZGl0aW5nRG9tYWluKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2spOwotCQl0dXJuVHJhY2VPbklmRGVidWdnaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKENvcHlUb0NsaXBib2FyZENvbW1hbmQgY29weVRvQ2xpcGJvYXJkQ29tbWFuZCkgewotCi0JCWlmIChjb3B5VG9DbGlwYm9hcmRDb21tYW5kIGluc3RhbmNlb2YgSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEoyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQoY29weVRvQ2xpcGJvYXJkQ29tbWFuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgcGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQlpZiAocGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBpbnN0YW5jZW9mIEoyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoZ2V0Q2xpcGJvYXJkKCkgaW5zdGFuY2VvZiBKMkVFQ2xpcGJvYXJkKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEoyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQocGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlT3ZlcnJpZGVDb21tYW5kKFJlbW92ZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCkgewotCQlyZXR1cm4gbmV3IEoyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQocmVtb3ZlQ29tbWFuZCk7Ci0JfQotCi0JcHVibGljIEoyRUVDbGlwYm9hcmQgZ2V0SjJFRUNsaXBib2FyZCgpIHsKLQkJcmV0dXJuIChKMkVFQ2xpcGJvYXJkKSBnZXRDbGlwYm9hcmQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHVyblRyYWNlT25JZkRlYnVnZ2luZygpIHsKLQkJLy9BYnN0cmFjdENvbW1hbmQuVHJhY2UuZW5hYmxlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NTlmYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uY29tcG9uZW50Y29yZS51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlciBleHRlbmRzIEoyRUVJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVRJTElUWV9KQVJTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlV0aWxpdHlfSkFSc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBib29sZWFuIGNoaWxkcmVuTG9hZGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIuCi0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKEFwcGxpY2F0aW9uIGFwcCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBwYXJlbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlzZXRQYXJlbnQocGFyZW50KTsKLQkJYXBwbGljYXRpb24gPSBhcHA7Ci0JCVV0aWxpdHlKYXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLklOU1RBTkNFLmFkZFV0aWxpdHlKYXJJdGVtUHJvdmlkZXIoUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGFwcGxpY2F0aW9uKSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlnZXRDaGlsZHJlbihvYmplY3QpOwotCQlyZXR1cm4gIWNoaWxkcmVuLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihmaW5hbCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghY2hpbGRyZW5Mb2FkZWQpIHsKLQkJCXRyeSB7Ci0JCQkJZGlzYWJsZU5vdGlmaWNhdGlvbigpOwotCQkJCW9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljb21wdXRlQ2hpbGRyZW4oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQllbmFibGVOb3RpZmljYXRpb24oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlVdGlsaXR5SmFyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5JTlNUQU5DRS5yZW1vdmVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHBsaWNhdGlvbiksIHRoaXMpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wdXRlQ2hpbGRyZW4oKSB7Ci0JCWNoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKLQkJSVZpcnR1YWxDb21wb25lbnQgZWFyID0gQ29tcG9uZW50VXRpbGl0aWVzLmZpbmRDb21wb25lbnQoYXBwbGljYXRpb24pOwotCQlpZiAoZWFyIT1udWxsKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIG1vZHVsZXMgPSBlYXIuZ2V0UmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGUgPSBtb2R1bGVzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAobW9kdWxlLmdldFByb2plY3QoKSA9PSBudWxsIHx8ICFtb2R1bGUuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyByZXR1cm4gb25seSBqYXJzIGZvciB1dGlsaXR5IGNvbXBvbmVudHMKLQkJCQlpZiAoSU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9NT0RVTEUuZXF1YWxzKG1vZHVsZS5nZXRDb21wb25lbnRUeXBlSWQoKSkpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHBsaWNhdGlvbik7Ci0JCQkJCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJLy8gd2Ugd2lsbCBhc3N1bWUgdGhlIGNvbXBvbmVudCBuYW1lIGlzIGluIHN5bmNoIHdpdGggdGhlIG1vZHVsZSB1cmkKLQkJCQkJSUZpbGUgdXRpbGl0eUphciA9IHByb2plY3QuZ2V0RmlsZShtb2R1bGUuZ2V0TmFtZSgpKyIuamFyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHV0aWxpdHlKYXIgIT1udWxsKQotCQkJCQkJY2hpbGRyZW4uYWRkKHV0aWxpdHlKYXIpOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRKYXJzKExpc3QgbGlzdCwgSVJlc291cmNlW10gbWVtYmVycykgewotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotLy8JCQlpZiAoaXNKYXJGaWxlKG1lbWJlcnNbaV0pKSB7Ci0vLwkJCQlsaXN0LmFkZChtZW1iZXJzW2ldKTsKLS8vCQkJfSBlbHNlIGlmIChtZW1iZXJzW2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0vLwkJCQl0cnkgewotLy8JCQkJCWdldEphcnMobGlzdCwgKChJRm9sZGVyKSBtZW1iZXJzW2ldKS5tZW1iZXJzKCkpOwotLy8JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBsaXN0OwotLy8JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmFyRmlsZShJUmVzb3VyY2UgbWVtYmVyKSB7Ci0JCXJldHVybiBtZW1iZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIG1lbWJlci5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBVVElMSVRZX0pBUlM7Ci0JfQotCi0JLy8gYXNzdW1lIHRoaXMgcmVzb3VyY2UgaXMgYSBqYXIgcmVzb3VyY2UKLQlwdWJsaWMgdm9pZCB1dGlsaXR5SmFyQ2hhbmdlZChJUmVzb3VyY2UgcmVzb3VyY2UsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWlmIChjaGlsZHJlbkxvYWRlZCkgewotCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCAmJiAhY2hpbGRyZW4uY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHJlc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgJiYgY2hpbGRyZW4uY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJY2hpbGRyZW4ucmVtb3ZlKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVXRpbGl0eUphclJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFV0aWxpdHlKYXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIElOU1RBTkNFID0gbmV3IFV0aWxpdHlKYXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGxpc3RlbmluZyA9IGZhbHNlOwotCQlwcml2YXRlIE1hcCBlYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwOwotCi0JCXB1YmxpYyB2b2lkIGFkZFV0aWxpdHlKYXJJdGVtUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlcikgewotCQkJTGlzdCBwcm92aWRlcnMgPSBnZXRQcm92aWRlcnMocHJvamVjdCk7Ci0JCQlpZiAocHJvdmlkZXJzICE9IG51bGwpCi0JCQkJcHJvdmlkZXJzLmFkZCh1dGlsaXR5SmFySXRlbVByb3ZpZGVyKTsKLQkJCWlmICghbGlzdGVuaW5nKSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQkJCWxpc3RlbmluZyA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHByb2plY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBMaXN0IGdldFByb3ZpZGVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlMaXN0IHJlc3VsdCA9IChMaXN0KSBnZXRFYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwKCkuZ2V0KHByb2plY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHByb2plY3QgIT0gbnVsbCkKLQkJCQlnZXRFYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwKCkucHV0KHByb2plY3QsIChyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCkpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBNYXAgZ2V0RWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCgpIHsKLQkJCWlmIChlYXJQcm9qZWN0c1RvVXRpbGl0eUphclByb3ZpZGVyTWFwID09IG51bGwpCi0JCQkJZWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZXR1cm4gZWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlcikgewotCQkJTGlzdCBwcm92aWRlcnMgPSBnZXRQcm92aWRlcnMocHJvamVjdCk7Ci0JCQlwcm92aWRlcnMucmVtb3ZlKHV0aWxpdHlKYXJJdGVtUHJvdmlkZXIpOwotCQkJaWYgKHByb3ZpZGVycy5pc0VtcHR5KCkpCi0JCQkJZ2V0RWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCgpLnJlbW92ZShwcm9qZWN0KTsKLQotCQkJaWYgKGdldEVhclByb2plY3RzVG9VdGlsaXR5SmFyUHJvdmlkZXJNYXAoKS5pc0VtcHR5KCkpIHsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQlsaXN0ZW5pbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0cnkgewotCQkJCWV2ZW50LmdldERlbHRhKCkuYWNjZXB0KHRoaXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXN3aXRjaCAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gZ2V0RWFyUHJvamVjdHNUb1V0aWxpdHlKYXJQcm92aWRlck1hcCgpLmNvbnRhaW5zS2V5KGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOiB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmIChpc0phckZpbGUocmVzb3VyY2UpKSB7Ci0JCQkJCQlMaXN0IHV0aWxpdHlKYXJJdGVtUHJvdmlkZXJzID0gZ2V0UHJvdmlkZXJzKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHV0aWxpdHlKYXJJdGVtUHJvdmlkZXJzLnNpemUoKTsgaSsrKQotCQkJCQkJCSgoSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIpIHV0aWxpdHlKYXJJdGVtUHJvdmlkZXJzLmdldChpKSkudXRpbGl0eUphckNoYW5nZWQocmVzb3VyY2UsIGRlbHRhKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyID09IElSRVNPVVJDRV9DTEFTUyB8fCBhZGFwdGVyID09IElQUk9KRUNUX0NMQVNTKQotCQkJcmV0dXJuIChhcHBsaWNhdGlvbiAhPSBudWxsKSA/IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHBsaWNhdGlvbikgOiBudWxsOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVV0aWxpdHlKYXZhUHJvamVjdHNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNhZjc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphdmFQcm9qZWN0c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyIGV4dGVuZHMgRUFSUHJvamVjdE1hcEl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVVElMSVRZX0pBVkFfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiVXRpbGl0eV9KYXZhX1Byb2plY3RzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVXRpbGl0eUpBUnNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVXRpbGl0eUpBUnNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGluY2x1ZGVNb2R1bGVzCi0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIGluY2x1ZGVNb2R1bGVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBpbmNsdWRlTW9kdWxlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBVVElMSVRZX0pBVkFfUFJPSkVDVFM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01ldGhvZHNQcm92aWRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwZWFjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRWpiRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLk1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5NZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIgZXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyIG1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyOwotCXByb3RlY3RlZCBNZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlciBtZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlcjsKLQotCXByb3RlY3RlZCBzdGF0aWMgRU9iamVjdCBFTF9NRVRBID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldEV4Y2x1ZGVMaXN0KCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFT2JqZWN0IE1QX01FVEEgPSBFamJGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCkuZ2V0TWV0aG9kUGVybWlzc2lvbigpOwotCXByb3RlY3RlZCBzdGF0aWMgRU9iamVjdCBNVF9NRVRBID0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldE1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvdmlkZXNDb250ZW50Rm9yKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtIHx8IG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24gfHwgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kVHJhbnNhY3Rpb24gfHwgb2JqZWN0IGluc3RhbmNlb2YgRXhjbHVkZUxpc3Q7Ci0JfQotCi0JcHVibGljIE1ldGhvZHNQcm92aWRlckRlbGVnYXRlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCWV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyID0gbmV3IEV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBmYWxzZSk7Ci0JCW1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyID0gbmV3IE1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBmYWxzZSk7Ci0JCW1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyID0gbmV3IE1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyICE9IG51bGwpCi0JCQltZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJbWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBtZXRhQ2xhc3MgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pCi0JCQltZXRhQ2xhc3MgPSAoKEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKSBvYmplY3QpLnJlZk9iamVjdC5lQ2xhc3MoKTsKLQkJZWxzZQotCQkJbWV0YUNsYXNzID0gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpOwotCi0JCWlmIChtZXRhQ2xhc3MgPT0gRUxfTUVUQSkKLQkJCXJldHVybiBleGNsdWRlTGlzdENvbnRlbnRQcm92aWRlcjsKLQkJZWxzZSBpZiAobWV0YUNsYXNzID09IE1QX01FVEEpCi0JCQlyZXR1cm4gbWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXI7Ci0JCWVsc2UgaWYgKG1ldGFDbGFzcyA9PSBNVF9NRVRBKQotCQkJcmV0dXJuIG1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWV4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCW1ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCW1ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyIHByb3YgPSBnZXRDb250ZW50UHJvdmlkZXIocGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiBwcm92ID09IG51bGwgPyBudWxsIDogcHJvdi5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgcHJvdiA9IGdldENvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIHByb3YgPT0gbnVsbCA/IG51bGwgOiBwcm92LmdldFBhcmVudChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCUFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciBwcm92ID0gZ2V0Q29udGVudFByb3ZpZGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gcHJvdiAhPSBudWxsICYmIHByb3YuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIgcHJvdiA9IGdldENvbnRlbnRQcm92aWRlcihpbnB1dEVsZW1lbnQpOwotCQlyZXR1cm4gcHJvdiA9PSBudWxsID8gbnVsbCA6IHByb3YuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZmU0YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSjJFRUl0ZW1Qcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJNb2R1bGVzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIodGV4dCwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSkgewotCQlzdXBlcih0ZXh0LCBpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKHRleHQsIGltYWdlLCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQlzdXBlcih0ZXh0LCBpbWFnZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihTdHJpbmcgdGV4dCwgT2JqZWN0IGltYWdlLCBPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKHRleHQsIGltYWdlLCBwYXJlbnQsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHRleHQsIE9iamVjdCBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgaW1hZ2UsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kdWxlc0l0ZW1Qcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBNb2R1bGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgdGV4dCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2R1bGVzSXRlbVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlLCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZHVsZXNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIE1vZHVsZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyB0ZXh0LCBPYmplY3QgaW1hZ2UsIE9iamVjdCBwYXJlbnQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRleHQsIGltYWdlLCBwYXJlbnQsIGNoaWxkcmVuKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBcHBsaWNhdGlvbiBnZXRQYXJlbnRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChBcHBsaWNhdGlvbikgZ2V0UGFyZW50KCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXIjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIgPT0gSVJFU09VUkNFX0NMQVNTIHx8IGFkYXB0ZXIgPT0gSVBST0pFQ1RfQ0xBU1MpCi0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFBhcmVudEFwcGxpY2F0aW9uKCkpOwotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBNT0RVTEVTOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS91dGlsL0Fubm90YXRpb25JY29uRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9Bbm5vdGF0aW9uSWNvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGU0ZTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS91dGlsL0Fubm90YXRpb25JY29uRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTgsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25zQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBZGQgb3ZlcmxheSBmb3IgYW5ub3RhdGVkIG9iamVjdHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25JY29uRGVjb3JhdG9yIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0lNQUdFX0RFU0NfU1RSSU5HID0gImFubm90YXRpb25fYmVhbl9vdmVybGF5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fRElTQUJMRURfSU1BR0VfREVTQ19TVFJJTkcgPSAiZGlzX2Fubm90YXRpb25fYmVhbl9vdmVybGF5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBBTk5PVEFUSU9OX0lNR19ERVNDID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKEFOTk9UQVRJT05fSU1BR0VfREVTQ19TVFJJTkcpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBBTk5PVEFUSU9OX0RJU0FCTEVEX0lNR19ERVNDID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKEFOTk9UQVRJT05fRElTQUJMRURfSU1BR0VfREVTQ19TVFJJTkcpOwotCi0JcHVibGljIEFubm90YXRpb25JY29uRGVjb3JhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBbm5vdGF0ZWRTdXBwb3J0ZWQoRU9iamVjdCB0YXJnZXQpIHsKLQkJYm9vbGVhbiBiQW5ub3RhdGlvblN1cHBvcnRlZCA9IGZhbHNlOwotCQlpZiAoQW5ub3RhdGlvbnNDb250cm9sbGVySGVscGVyLklOU1RBTkNFLmlzQW5ub3RhdGVkKHRhcmdldCkpIHsKLQkJCWJBbm5vdGF0aW9uU3VwcG9ydGVkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYkFubm90YXRpb25TdXBwb3J0ZWQ7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbGxlckZvclByb2plY3QoSVByb2plY3QgdGFyZ2V0UHJvamVjdCkgewotCQlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY29udHJvbGxlciA9IEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0QW5ub3RhdGlvbnNDb250cm9sbGVyKHRhcmdldFByb2plY3QpOwotCQlyZXR1cm4gY29udHJvbGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQlFT2JqZWN0IGVPYmplY3QgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5DbGFzc1Byb3ZpZGVySGVscGVyKSB7Ci0JCQlCZWFuQ2xhc3NQcm92aWRlckhlbHBlciBiZWFuQ2xhc3NIZWxwZXIgPSAoQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIpIGVsZW1lbnQ7Ci0JCQllT2JqZWN0ID0gYmVhbkNsYXNzSGVscGVyLmdldEVqYigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgU2VydmxldCkKLQkJCWVPYmplY3QgPSAoRU9iamVjdCkgZWxlbWVudDsKLQkJaWYgKGVPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQW5ub3RhdGVkU3VwcG9ydGVkKGVPYmplY3QpKSB7Ci0JCQlpZiAoaXNBbm5vdGF0aW9uRW5hYmxlZChlT2JqZWN0KSkgewotCQkJCWlmIChBTk5PVEFUSU9OX0lNR19ERVNDICE9IG51bGwpCi0JCQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShBTk5PVEFUSU9OX0lNR19ERVNDKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKEFOTk9UQVRJT05fRElTQUJMRURfSU1HX0RFU0MgIT0gbnVsbCkKLQkJCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KEFOTk9UQVRJT05fRElTQUJMRURfSU1HX0RFU0MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQW5ub3RhdGlvbkVuYWJsZWQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUlGaWxlIGFubm90YXRlZFNvdXJjZSA9IG51bGw7Ci0JCS8qIHNob3J0IGNpcmN1aXQgaWYgcG9zc2libGUgKi8KLQkJaWYgKEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuaXNBbnlBbm5vdGF0aW9uc1N1cHBvcnRlZCgpKSB7Ci0JCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVPYmplY3QpOwotCQkJQW5ub3RhdGlvbnNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyRm9yUHJvamVjdCh0YXJnZXRQcm9qZWN0KTsKLQkJCWlmIChjb250cm9sbGVyICE9IG51bGwpCi0JCQkJYW5ub3RhdGVkU291cmNlID0gY29udHJvbGxlci5nZXRFbmFibGVkQW5ub3RhdGlvbkZpbGUoZU9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIChhbm5vdGF0ZWRTb3VyY2UgIT0gbnVsbCkgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIEltYWdlIGRlY29yYXRlSW1hZ2UoSW1hZ2UgaW1hZ2UsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlTmFtZSkgewotCQlpZiAoaW1hZ2VGaWxlTmFtZSAhPSBudWxsKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRmlsZU5hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3V0aWwvQmluYXJ5UHJvamVjdFVJSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9CaW5hcnlQcm9qZWN0VUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ZDkyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9CaW5hcnlQcm9qZWN0VUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkudXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIEJpbmFyeVByb2plY3RVSUhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfVElUTEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQklOQVJZX1BST0pFQ1QiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkFDVElPTl9DQU5OT1RfQkVfUEVSRk9STUVEX09OX0JJTl9QUk9KRUNUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCaW5hcnlQcm9qZWN0VUlIZWxwZXIuCi0JICovCi0JcHVibGljIEJpbmFyeVByb2plY3RVSUhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheUVycm9yKFNoZWxsIHBhcmVudCkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYXJlbnQsIERJQUxPR19USVRMRSwgRElBTE9HX01FU1NBR0UpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc3BsYXlFcnJvcklmQmluYXJ5UHJvamVjdChTaGVsbCBwYXJlbnQsIElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNCaW5hcnkgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmlzQmluYXJ5UHJvamVjdChhUHJvamVjdCk7Ci0JCWlmIChpc0JpbmFyeSkKLQkJCWRpc3BsYXlFcnJvcihwYXJlbnQpOwotCQlyZXR1cm4gaXNCaW5hcnk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkFwcEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL0oyRUVXZWJBcHBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYmUwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkFwcEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVdlYkFwcEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkFwcEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBXZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIgd2ViU2VydmxldEdyb3VwOwotCXByaXZhdGUgV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciB3ZWJTZXJ2bGV0TWFwcGluZ0dyb3VwOwotCXByaXZhdGUgV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyIHdlYkZpbHRlcnNHcm91cDsKLQlwcml2YXRlIFdlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciB3ZWJGaWx0ZXJNYXBwaW5nR3JvdXA7Ci0JcHJpdmF0ZSBXZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIgd2ViUmVmc0dyb3VwOwotCXByaXZhdGUgV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlciB3ZWJTZWN1cml0eUdyb3VwOwotCXByaXZhdGUgSjJFRVdlYlNlcnZpY2VDbGllbnRERE1hbmFnZXIgY2xpZW50TWdyOwotCXByaXZhdGUgV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlciB3ZWJMaXN0ZW5lckdyb3VwOwotCi0JLyoqCi0JICogTGlzdGVuIGFuZCBmaXJlIHVwZGF0ZXMgZm9yIDEuMyB3ZWIgc2VydmljZSBjbGllbnRzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKMkVFV2ViU2VydmljZUNsaWVudERETWFuYWdlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXIgewotCQlwcml2YXRlIFdlYkFwcCB3ZWJBcHA7Ci0JCVdlYlNlcnZpY2VzQ2xpZW50IGNsaWVudDsKLQotCQlwdWJsaWMgSjJFRVdlYlNlcnZpY2VDbGllbnRERE1hbmFnZXIoV2ViQXBwIHdlYkFwcCkgewotCQkJdGhpcy53ZWJBcHAgPSB3ZWJBcHA7Ci0JCQlpbml0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHdlYkFwcCkgewotCQkJdGhpcy53ZWJBcHAgPSB3ZWJBcHA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQkJLy9UT0RPIGZpeCB1cCBub3RpZmljYXRpb24KLS8vCQkJZWRpdE1vZGVsID0gd2ViU2VydmljZU1nci5nZXRXU0VkaXRNb2RlbChQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2ViQXBwKSk7Ci0vLwkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotLy8JCQkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotLy8JCQkJaWYgKGVkaXRNb2RlbC5nZXQxM1dlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0vLwkJCQkJY2xpZW50ID0gZWRpdE1vZGVsLmdldDEzV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZSgpLmdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0vLwkJCQkJaWYgKGNsaWVudCAhPSBudWxsKQotLy8JCQkJCQljbGllbnQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotLy8JCQkJfQotLy8JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCS8vVE9ETyBmaXggdXAgbm90aWZpY2F0aW9uCi0vLwkJCWlmIChlZGl0TW9kZWwgPT0gbnVsbCkKLS8vCQkJCWluaXQoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkgfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUKLQkJCQkJfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewotCQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYlNlcnZpY2VzQ2xpZW50LmNsYXNzKSA9PSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTKSB7Ci0JCQkJCU5vdGlmaWNhdGlvbldyYXBwZXIgbm90aWZpY2F0aW9uV3JhcHBlciA9IG5ldyBOb3RpZmljYXRpb25XcmFwcGVyKHdlYlJlZnNHcm91cCwgbm90aWZpY2F0aW9uKTsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uV3JhcHBlcik7Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vVE9ETyBmaXggdXAgbm90aWZpY2F0aW9uCi0vLwkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotLy8JCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotLy8JCQkJaWYgKGVkaXRNb2RlbC5nZXQxM1dlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0vLwkJCQkJY2xpZW50ID0gZWRpdE1vZGVsLmdldDEzV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZSgpLmdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0vLwkJCQkJaWYgKGNsaWVudCAhPSBudWxsKQotLy8JCQkJCQljbGllbnQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotLy8JCQkJfQotLy8JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKMkVFV2ViQXBwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWxhaXplIGxpc3Qgb2YgY2hpbGRyZW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdENoaWxkcmVuKFdlYkFwcCB3ZWJBcHApIHsKLQkJaWYgKGNsaWVudE1nciA9PSBudWxsKQotCQkJY2xpZW50TWdyID0gbmV3IEoyRUVXZWJTZXJ2aWNlQ2xpZW50RERNYW5hZ2VyKHdlYkFwcCk7Ci0JCWNoaWxkcmVuLmFkZCh3ZWJTZXJ2bGV0R3JvdXAgPSBuZXcgV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWJBcHApKTsKLQkJY2hpbGRyZW4uYWRkKHdlYlNlcnZsZXRNYXBwaW5nR3JvdXAgPSBuZXcgV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2ViQXBwKSk7Ci0JCWNoaWxkcmVuLmFkZCh3ZWJGaWx0ZXJzR3JvdXAgPSBuZXcgV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWJBcHApKTsKLQkJY2hpbGRyZW4uYWRkKHdlYkZpbHRlck1hcHBpbmdHcm91cCA9IG5ldyBXZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYkFwcCkpOwotCQljaGlsZHJlbi5hZGQod2ViUmVmc0dyb3VwID0gbmV3IFdlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2ViQXBwKSk7Ci0JCWNoaWxkcmVuLmFkZCh3ZWJTZWN1cml0eUdyb3VwID0gbmV3IFdlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYkFwcCkpOwotCQljaGlsZHJlbi5hZGQod2ViTGlzdGVuZXJHcm91cCA9IG5ldyBXZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWJBcHApKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXZWJBcHAgJiYgY2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgb2JqZWN0OwotCQkJaW5pdENoaWxkcmVuKHdlYkFwcCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdlYkFwcCkKLQkJCXNldFdlYkFwcE9uQ2hpbGRyZW4oKFdlYkFwcCkgb2JqZWN0KTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhcHAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0V2ViQXBwT25DaGlsZHJlbihXZWJBcHAgYXBwKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbi5nZXQoaSkgaW5zdGFuY2VvZiBXZWJHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCVdlYkdyb3VwSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKFdlYkdyb3VwSXRlbVByb3ZpZGVyKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQkJcHJvdmlkZXIuc2V0V2ViQXBwKGFwcCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNsaWVudE1nciAhPSBudWxsKQotCQkJY2xpZW50TWdyLnNldFdlYkFwcChhcHApOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgYWRkcyBhbmQgcmVtb3ZlcyBmb3IgdGhlIGRpZmZlcmVudCBpdGVtIHByb3ZpZGVyCi0JCS8vIGdyb3VwcwotCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQgfHwgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSB8fCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRQotCQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKLQkJCU9iamVjdCBub3RpZmllciA9IG51bGw7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViQXBwLmNsYXNzKSkgewotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJTZXJ2bGV0R3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MgOgotCQkJCQlub3RpZmllciA9IHdlYlNlcnZsZXRNYXBwaW5nR3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0ZJTFRFUlMgOgotCQkJCQlub3RpZmllciA9IHdlYkZpbHRlcnNHcm91cDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJGaWx0ZXJNYXBwaW5nR3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0VKQl9MT0NBTF9SRUZTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUyA6Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUyA6Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUyA6Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fU0VSVklDRV9SRUZTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJSZWZzR3JvdXA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTIDoKLQkJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19DT05TVFJBSU5UUyA6Ci0JCQkJCW5vdGlmaWVyID0gd2ViU2VjdXJpdHlHcm91cDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTIDoKLQkJCQkJbm90aWZpZXIgPSB3ZWJMaXN0ZW5lckdyb3VwOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChub3RpZmllciAhPSBudWxsKSB7Ci0JCQkJTm90aWZpY2F0aW9uV3JhcHBlciBub3RpZmljYXRpb25XcmFwcGVyID0gbmV3IE5vdGlmaWNhdGlvbldyYXBwZXIobm90aWZpZXIsIG5vdGlmaWNhdGlvbik7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uV3JhcHBlcik7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNsaWVudE1nciAhPSBudWxsKQotCQkJY2xpZW50TWdyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNjdjZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL0oyRUVXZWJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEoyRUVXZWJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24udXRpbC5XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdlYkFwcEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcEFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJBcHBJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXdlYkFwcEl0ZW1Qcm92aWRlciA9IG5ldyBKMkVFV2ViQXBwSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gd2ViQXBwSXRlbVByb3ZpZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZmU1N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTEsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViR3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV2ViQXBwIHdlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2ViQXBwKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHdlYkFwcC5nZXRGaWx0ZXJNYXBwaW5ncygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlcl9tYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZJTFRFUl9NQVBQSU5HIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2ViQXBwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjQzYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViR3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV2ViQXBwIHdlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2ViQXBwKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRmlsdGVyLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRGaWx0ZXJzKCkpOwotCQlyZXR1cm4gZ2V0U29ydGVkQ2hpbGRyZW4ocmVzdWx0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB3ZWJBcHA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmlsdGVyc18xIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNmEzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDExLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2ViR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKMkVFSXRlbVByb3ZpZGVyIHsKLQotCWNsYXNzIFdlYkdyb3VwQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIFNlcnZsZXQpIHsKLQkJCQlTZXJ2bGV0IHMxID0gKFNlcnZsZXQpIG8xOwotCQkJCVNlcnZsZXQgczIgPSAoU2VydmxldCkgbzI7Ci0JCQkJaWYgKHMxLmdldFNlcnZsZXROYW1lKCkgIT0gbnVsbCAmJiBzMi5nZXRTZXJ2bGV0TmFtZSgpICE9IG51bGwpCi0JCQkJCXJldHVybiBzMS5nZXRTZXJ2bGV0TmFtZSgpLmNvbXBhcmVUbyhzMi5nZXRTZXJ2bGV0TmFtZSgpKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgRmlsdGVyKSB7Ci0JCQkJRmlsdGVyIGYxID0gKEZpbHRlcikgbzE7Ci0JCQkJRmlsdGVyIGYyID0gKEZpbHRlcikgbzI7Ci0JCQkJaWYgKGYxLmdldE5hbWUoKSAhPSBudWxsICYmIGYyLmdldE5hbWUoKSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZjEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhmMi5nZXROYW1lKCkpOwotCQkJCXJldHVybiAtMTsKLQkJCX0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBMaXN0ZW5lcikgewotCQkJCUxpc3RlbmVyIGwxID0gKExpc3RlbmVyKSBvMTsKLQkJCQlMaXN0ZW5lciBsMiA9IChMaXN0ZW5lcikgbzI7Ci0JCQkJaWYgKGwxLmdldExpc3RlbmVyQ2xhc3NOYW1lKCkgIT0gbnVsbCAmJiBsMi5nZXRMaXN0ZW5lckNsYXNzTmFtZSgpICE9IG51bGwpCi0JCQkJCXJldHVybiBsMS5nZXRMaXN0ZW5lckNsYXNzTmFtZSgpLmNvbXBhcmVUbyhsMi5nZXRMaXN0ZW5lckNsYXNzTmFtZSgpKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgV2ViQXBwIHdlYkFwcCA9IG51bGw7Ci0KLQlwdWJsaWMgV2ViR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYkFwcCB3ZWJBcHApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLndlYkFwcCA9IHdlYkFwcDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYkFwcC4KLQkgKi8KLQlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKLQkJcmV0dXJuIHdlYkFwcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2ViQXBwCi0JICogICAgICAgICAgICBUaGUgd2ViQXBwIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHdlYkFwcCkgewotCQl0aGlzLndlYkFwcCA9IHdlYkFwcDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTb3J0ZWRDaGlsZHJlbihMaXN0IGxvY2FsQ2hpbGRyZW4pIHsKLQkJQ29sbGVjdGlvbnMuc29ydChsb2NhbENoaWxkcmVuLCBuZXcgV2ViR3JvdXBDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gbG9jYWxDaGlsZHJlbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlN2U3M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDExLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWJBcHApOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBGaWx0ZXIuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwod2ViQXBwLmdldExpc3RlbmVycygpKTsKLQkJcmV0dXJuIGdldFNvcnRlZENoaWxkcmVuKHJlc3VsdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2ViQXBwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkxJU1RFTkVSIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDIzNDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViUmVmZXJlbmNlc0dyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWJBcHApOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHdlYkFwcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghd2ViQXBwLmdldEVqYkxvY2FsUmVmcygpLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwod2ViQXBwLmdldEVqYkxvY2FsUmVmcygpKTsKLQkJaWYgKCF3ZWJBcHAuZ2V0RWpiUmVmcygpLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwod2ViQXBwLmdldEVqYlJlZnMoKSk7Ci0JCWlmICghd2ViQXBwLmdldFJlc291cmNlRW52UmVmcygpLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwod2ViQXBwLmdldFJlc291cmNlRW52UmVmcygpKTsKLQkJaWYgKCF3ZWJBcHAuZ2V0UmVzb3VyY2VSZWZzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0UmVzb3VyY2VSZWZzKCkpOwotCQlpZiAoIXdlYkFwcC5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKTsKLQkJaWYgKCF3ZWJBcHAuZ2V0U2VydmljZVJlZnMoKS5pc0VtcHR5KCkpCi0JCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJQ29sbGVjdGlvbiBzZXJ2aWNlUmVmcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJCXNlcnZpY2VSZWZzID0gc2VydmljZUhlbHBlci5nZXQxM1NlcnZpY2VSZWZzKHdlYkFwcCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiByZSkgewotCQkJc2VydmljZVJlZnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJaWYgKHNlcnZpY2VSZWZzICE9bnVsbCAmJiAhc2VydmljZVJlZnMuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbChzZXJ2aWNlUmVmcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJSZWZlcmVuY2VzXzEiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZWN1cml0eUdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjJhMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV2ViQXBwIHdlYkFwcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgd2ViQXBwKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB3ZWJBcHA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWN1cml0eV8xIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIXdlYkFwcC5nZXRTZWN1cml0eVJvbGVzKCkuaXNFbXB0eSgpKQotCQkJcmVzdWx0LmFkZEFsbCh3ZWJBcHAuZ2V0U2VjdXJpdHlSb2xlcygpKTsKLQkJaWYgKCF3ZWJBcHAuZ2V0Q29uc3RyYWludHMoKS5pc0VtcHR5KCkpCi0JCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRDb25zdHJhaW50cygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9yb2xlIik7Ly8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODc4ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYkFwcCB3ZWJBcHApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHdlYkFwcCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKHdlYkFwcC5nZXRTZXJ2bGV0cygpKTsKLQkJcmV0dXJuIGdldFNvcnRlZENoaWxkcmVuKHJlc3VsdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VydmxldCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXJ2bGV0c18xIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2ViQXBwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkZWZiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTEsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXZWJTZXJ2bGV0TWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWJBcHApOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlcnZsZXRfbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXJ2bGV0X01hcHBpbmdzXzIiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB3ZWJBcHA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3ODg5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0Fubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5hbm5vdGF0aW9uLmludGVybmFsLnByZWZlcmVuY2VzLkFubm90YXRpb25QcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmFubm90YXRpb24uaW50ZXJuYWwucHJvdmlkZXIuSUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuYW5ub3RhdGlvbi5pbnRlcm5hbC51dGlsaXR5LkFubm90YXRpb25VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAgewotCi0JcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLQlwcm90ZWN0ZWQgT2JqZWN0IHN5bmNoSGVscGVyOwotCXByb3RlY3RlZCBCdXR0b24gdXNlQW5ub3RhdGlvbnM7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRm9yQmVhbjsKLQlwcml2YXRlIGJvb2xlYW4gdXNlU2VydmxldFN0cmluZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQlRBR1NFVCA9ICJlamIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZEJlYW5EZWZhdWx0VXNlQW5ub3RhdGlvbnMgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkUHJvamVjdERlZmF1bHRVc2VBbm5vdGF0aW9ucyA9IGZhbHNlOwotCi0KLQlwcml2YXRlIGNsYXNzIENoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKGlzRm9yQmVhbikKLQkJCQlzaG91bGRCZWFuRGVmYXVsdFVzZUFubm90YXRpb25zID0gYnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJZWxzZQotCQkJCXNob3VsZFByb2plY3REZWZhdWx0VXNlQW5ub3RhdGlvbnMgPSBidXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy9kbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQlwcml2YXRlIENoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgY2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChDb21wb3NpdGUgcGFyZW50LCBPYmplY3QgbW9kZWwsIGJvb2xlYW4gZm9yQmVhbikgewotCQl0aGlzKHBhcmVudCwgbW9kZWwsIGZvckJlYW4sIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChDb21wb3NpdGUgcGFyZW50LCBPYmplY3QgbW9kZWwsIGJvb2xlYW4gZm9yQmVhbiwgYm9vbGVhbiB1c2VTZXJ2bGV0KSB7Ci0JCXN1cGVyKCk7Ci0JCXN5bmNoSGVscGVyID0gbmV3IERhdGFNb2RlbFN5bmNoSGVscGVyKChJRGF0YU1vZGVsKW1vZGVsKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLmlzRm9yQmVhbiA9IGZvckJlYW47Ci0JCXRoaXMudXNlU2VydmxldFN0cmluZyA9IHVzZVNlcnZsZXQ7Ci0JCQotCQlidWlsZENvbXBvc2l0ZXMocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQWRkIHNlcGFyYXRvcgotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJLy8gQWRkIHNwYWNlcgotCQlMYWJlbCBzcGFjZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShnZDEpOwotCQkvLyBBZGQgYW5ub3RhdGlvbnMgY2hlY2tib3ggYW5kIGxhYmVsCi0JCXVzZUFubm90YXRpb25zID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCVN0cmluZyBsYWJlbFRleHQ7Ci0JCWlmICh1c2VTZXJ2bGV0U3RyaW5nKQotCQkJbGFiZWxUZXh0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVVNFX0FOTk9UQVRJT05TX1NFUlZMRVQpOwotCQllbHNlIGlmIChpc0ZvckJlYW4pCi0JCQlsYWJlbFRleHQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5VU0VfQU5OT1RBVElPTlMpOwotCQllbHNlCi0JCQlsYWJlbFRleHQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BRERfQU5OT1RBVElPTlNfU1VQUE9SVCk7Ci0JCXVzZUFubm90YXRpb25zLnNldFRleHQobGFiZWxUZXh0KTsKLQkJKChEYXRhTW9kZWxTeW5jaEhlbHBlcilzeW5jaEhlbHBlcikuc3luY2hDaGVja2JveCh1c2VBbm5vdGF0aW9ucywgSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUywgbnVsbCk7Ci0JCXVzZUFubm90YXRpb25zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMjsKLQkJdXNlQW5ub3RhdGlvbnMuc2V0TGF5b3V0RGF0YShnZDIpOwotCQkvLyBJZiBmb3IgcHJvamVjdCwgc2V0IHRoZSBnbG9iYWwgYW5ub3RhdGlvbnMgc3VwcG9ydGVkCi0JCWlmICghaXNGb3JCZWFuKQotCQkJc2V0RW5hYmxlbWVudChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkoKElEYXRhTW9kZWwpbW9kZWwpLnJlbW92ZUxpc3RlbmVyKChEYXRhTW9kZWxTeW5jaEhlbHBlcilzeW5jaEhlbHBlcik7Ci0JCXN5bmNoSGVscGVyID0gbnVsbDsKLQkJbW9kZWwgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbnNTdXBwb3J0ZWQoSVByb2plY3QgcHJvamVjdCkgewotCQkvL1RPRE8gY2xlYW4gdXAgdG8gYmUgbW9kdWxlIGJhc2VkLCBub3QgcHJvamVjdCBiYXNlZAotCQl0cnkgewotCQkJLy8JCQlpZiAoaXNGb3JCZWFuKSB7Ci0JCQkvLwkJCQlBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0JCQkvLyBBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLklOU1RBTkNFLmdldEFubm90YXRpb25zQ29udHJvbGxlcihwcm9qZWN0KTsKLQkJCS8vCQkJCXJldHVybiAoY29udHJvbGxlciAhPW51bGwgJiYgY29udHJvbGxlci5pc1RhZ0hhbmRsZXJJbnN0YWxsZWQoRUpCVEFHU0VUKSk7Ci0JCQkvLwkJCX0KLS8vCQkJSjJFRU1vZHVsZU5hdHVyZSBuYXR1cmUgPSBudWxsOwotLy8JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKQotLy8JCQkJbmF0dXJlID0gKEoyRUVNb2R1bGVOYXR1cmUpIHByb2plY3QuZ2V0TmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpOwotLy8JCQllbHNlIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5oYXNOYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKQotLy8JCQkJbmF0dXJlID0gKEoyRUVNb2R1bGVOYXR1cmUpIHByb2plY3QuZ2V0TmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKTsKLS8vCi0vLwkJCWlmICghaXNGb3JCZWFuIHx8IChuYXR1cmUgIT0gbnVsbCAmJiBuYXR1cmUuZ2V0SjJFRVZlcnNpb24oKSA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZW1lbnQoSVByb2plY3QgcHJvamVjdCkgewotCQkvL1RPRE8KLQkJLy9ib29sZWFuIGlzRW5hYmxlZCA9IGlzQW5ub3RhdGlvbnNTdXBwb3J0ZWQocHJvamVjdCk7Ci0JCWJvb2xlYW4gaXNDb250cm9sbGVyRW5hYmxlZCA9IEFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXIuSU5TVEFOQ0UuaXNBbnlBbm5vdGF0aW9uc1N1cHBvcnRlZCgpOwotCQlmaW5hbCBTdHJpbmcgcHJlZmVycmVkID0gQW5ub3RhdGlvblByZWZlcmVuY2VTdG9yZS5nZXRQcm9wZXJ0eShBbm5vdGF0aW9uUHJlZmVyZW5jZVN0b3JlLkFOTk9UQVRJT05QUk9WSURFUik7Ci0JCUlBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyID0gbnVsbDsKLQkJYm9vbGVhbiBpc1Byb3ZpZGVyRW5hYmxlZCA9IGZhbHNlOwotCQlpZiAocHJlZmVycmVkICE9bnVsbCkgewotCQkJdHJ5IHsKLQkJCQlhbm5vdGF0aW9uUHJvdmlkZXIgPSBBbm5vdGF0aW9uVXRpbGl0aWVzLmZpbmRBbm5vdGF0aW9uUHJvdmlkZXJCeU5hbWUocHJlZmVycmVkKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeyAKLQkJCQkvL0RlZmF1bHQKLQkJCX0KLQkJCWlmIChhbm5vdGF0aW9uUHJvdmlkZXIgIT0gbnVsbCAmJiBhbm5vdGF0aW9uUHJvdmlkZXIuaXNWYWxpZCgpKXsKLQkJCQlpc1Byb3ZpZGVyRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzaG91bGRFbmFibGUgPSBpc0NvbnRyb2xsZXJFbmFibGVkIHx8IGlzUHJvdmlkZXJFbmFibGVkOwotCQlpZiAoIXNob3VsZEVuYWJsZSkgewotCQkJKChJRGF0YU1vZGVsKW1vZGVsKS5zZXRQcm9wZXJ0eShJQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TLCBCb29sZWFuLkZBTFNFKTsKLQkJfQotCQl1c2VBbm5vdGF0aW9ucy5zZXRFbmFibGVkKHNob3VsZEVuYWJsZSk7Ci0vLwkJaWYgKCFpc0VuYWJsZWQgfHwgKCFpc0ZvckJlYW4gJiYgIXNob3VsZFByb2plY3REZWZhdWx0VXNlQW5ub3RhdGlvbnMpIHx8IChpc0ZvckJlYW4gJiYgIXNob3VsZEJlYW5EZWZhdWx0VXNlQW5ub3RhdGlvbnMpKSB7Ci0vLwkJCXVzZUFubm90YXRpb25zLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0vLwkJCW1vZGVsLnNldFByb3BlcnR5KElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIEJvb2xlYW4uRkFMU0UpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCXVzZUFubm90YXRpb25zLnNldFNlbGVjdGlvbih0cnVlKTsKLS8vCQkJbW9kZWwuc2V0UHJvcGVydHkoSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUywgQm9vbGVhbi5UUlVFKTsKLS8vCQl9Ci0JfQotCQotCQotCi0JcHVibGljIHZvaWQgc2V0VXNlU2VydmxldChib29sZWFuIGFCb29sZWFuKSB7Ci0JCXVzZVNlcnZsZXRTdHJpbmcgPSBhQm9vbGVhbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXNlQW5ub3RhdGlvbnMoYm9vbGVhbiBhQm9vbGVhbikgewotCQlpZiAodXNlQW5ub3RhdGlvbnMgIT0gbnVsbCkgewotCQkJdXNlQW5ub3RhdGlvbnMuc2V0U2VsZWN0aW9uKGFCb29sZWFuKTsKLQkJCSgoSURhdGFNb2RlbCltb2RlbCkuc2V0UHJvcGVydHkoSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUywgbmV3IEJvb2xlYW4oYUJvb2xlYW4pKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZmUyNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIyLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZCBleHRlbmRzIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCBpbXBsZW1lbnRzIElFeGVjdXRhYmxlRXh0ZW5zaW9uLCBJTmV3V2l6YXJkIHsKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgV2l6YXJkIElEIG9mIHRoZSBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC4gVXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgYW5kIGFjdGl2aXRpZXMgbWFuYWdlbWVudC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gIEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsJIAotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCAKLQkgKiBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCAKLQkgKiBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMKLQkgKiBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKiAKLQkgKiB7QGluaGVyaXREb2N9ICAgCi0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCBwYWdlIGltYWdlLiAKLQkgKiA8L3A+IAotCSAqIAotCSAqIEBzZWUgSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQjZG9Jbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUENMSUVOVF9DT01QT05FTlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkFQUF9DTElFTlRfUFJPSkVDVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXByZUZpbGxTZWxlY3RlZEVBUlByb2plY3QoKTsKLQl9IAotCSAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogQWRkcyBhIHtAbGluayBKQ0FQcm9qZWN0Q3JlYXRpb25QYWdlfSBhcyB0aGUge0BsaW5rIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCNNQUlOX1BHfS4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIHBhZ2UxID0gbmV3IEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRyk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCQlzdXBlci5kb0FkZFBhZ2VzKCk7Ci0JfQotCi0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0gCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxYzBhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIyLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBUZXh0IGNvbnRleHRSb290TmFtZUZpZWxkID0gbnVsbDsKLQlwdWJsaWMgTGFiZWwgY29udGV4dFJvb3RMYWJlbCA9IG51bGw7Ci0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDI1MDsKLQlwcml2YXRlIEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwIGFubm90YXRpb25zR3JvdXA7Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQQ0xJRU5UX0NPTVBPTkVOVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUENMSUVOVF9DT01QT05FTlRfTUFJTl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5BUFBfQ0xJRU5UX1BST0pFQ1RfV0laQVJEX0JBTk5FUikpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0FQUENMSUVOVF9XSVpBUkRfUDEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVNb2R1bGVDcmVhdGlvblBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvQWR2YW5jZWRDb21wb3NpdGUoQ29tcG9zaXRlIGFkdmFuY2VkKSB7Ci0JCXN1cGVyLmFkZFRvQWR2YW5jZWRDb21wb3NpdGUoYWR2YW5jZWQpOwotCQlzdXBlci5jcmVhdGVTb3VyY2VGb2xkZXJDb21wb3NpdGUoYWR2YW5jZWQpOwotCQljcmVhdGVBbm5vdGF0aW9uc0dyb3VwKGFkdmFuY2VkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vYW5ub3RhdGlvbnNHcm91cCA9IG5ldyBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChwYXJlbnQsIGdldEoyRUVNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCgpLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChhbm5vdGF0aW9uc0dyb3VwICE9IG51bGwpCi0JCQlhbm5vdGF0aW9uc0dyb3VwLmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWI5ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFwcENsaWVudENvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gZXhwb3J0IEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZSBzdHJ1Y3R1cmVzIGZyb20gdGhlIEVjbGlwc2UgV29ya2JlbmNoIHRvIGEKLSAqIGRlcGxveWFibGUgQXBwbGljYXRpb24gQ2xpZW50IEFyY2hpdmUgKi5qYXIgZmlsZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEV4cG9ydFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgdGhlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlCi0JICogICAgICAgICAgICBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayBBcHBDbGllbnRFeHBvcnRQYWdlfWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KQotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IEFwcENsaWVudEV4cG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcsIGdldFNlbGVjdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuQVBQX0NMSUVOVF9FWFBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEltcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NmNzI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUltcG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfSU1QT1JUX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuQVBQX0NMSUVOVF9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsZUltcG9ydExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfSU1QT1JUX0ZJTEVfTEFCRUwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKLQkJcmV0dXJuICJBUFBfQ0xJRU5UIjsgLy8kTk9OLU5MUy0xJDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWx0ZXJFeHByZXNzaW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi5qYXIifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9QUk9KRUNUX0xBQkVMKTsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIGdldE5ld1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpIHsKLQkvLyByZXR1cm4gZ2V0QXBwQ2xpZW50RGF0YU1vZGVsKCkuZ2V0SjJlZUFydGlmYWN0Q3JlYXRpb25EYXRhTW9kZWwoKTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIEFwcENsaWVudE1vZHVsZUltcG9ydERhdGFNb2RlbCBnZXRBcHBDbGllbnREYXRhTW9kZWwoKSB7Ci0JLy8gcmV0dXJuIChBcHBDbGllbnRNb2R1bGVJbXBvcnREYXRhTW9kZWwpIG1vZGVsOwotCS8vCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX0FQUENMSUVOVF9XSVpBUkRfUDEpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5OWM2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBpbXBvcnQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgbW9kdWxlIHN0cnVjdHVyZXMgaW50byB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggZnJvbQotICogYW4gZXhpc3RpbmcgQXBwbGljYXRpb24gQ2xpZW50ICouamFyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvLyAvKioKLQkvLyAqIHtAaW5oZXJpdERvY30KLQkvLyAqCi0JLy8gKiA8cD4KLQkvLyAqIFJldHVybnMgYW4ge0BsaW5rIEFwcENsaWVudEltcG9ydE9wZXJhdGlvbn11c2luZyB0aGUgbW9kZWwgZWl0aGVyIHN1cHBsaWVkIGluIHRoZQotCS8vICogY29uc3RydWN0b3Igb3IgY3JlYXRlZCBmcm9tIHtAbGluayAjY3JlYXRlRGVmYXVsdE1vZGVsKCl9LgotCS8vICogPC9wPgotCS8vICoKLQkvLyAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIFdpemFyZCBjb21wbGV0ZXMuCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgV1RQT3BlcmF0aW9uIGdldEltcG9ydE9wZXJhdGlvbigpIHsKLQkvLyByZXR1cm4gbmV3IEFwcENsaWVudE1vZHVsZUltcG9ydE9wZXJhdGlvbihnZXRTcGVjaWZpY0RhdGFNb2RlbCgpKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIGFuIHtAbGluayBBcHBDbGllbnRJbXBvcnRQYWdlfWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRykpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkaWFsb2cgd2luZG93IHRpdGxlIGFuZCBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkb0luaXQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklNUE9SVF9XSVpfVElUTEUpKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuQVBQX0NMSUVOVF9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCQkvLyB1cGRhdGVFQVJUb01vZGVsRnJvbVNlbGVjdGlvbihnZXRTcGVjaWZpY0RhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFTW9kdWxlSW1wb3J0V2l6YXJkI2dldE1vZHVsZVZhbGlkYXRvclN0cmluZ3MoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2R1bGVWYWxpZGF0b3JTdHJpbmdzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLlVJQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50RXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNmQ3NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRFeHBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRFeHBvcnRQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUV4cG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBBcHBDbGllbnRFeHBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9FWFBPUlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0VYUE9SVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkFQUF9DTElFTlRfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfSU1QT1JUX1BST0pFQ1RfTEFCRUwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLmphciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUV4cG9ydFBhZ2UjaXNNZXRhVHlwZVN1cHBvcnRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkNsaWVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFUHJvamVjdENyZWF0aW9uUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5FWFBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9QMSk7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCX0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG5lbnRJRCgpIHsKLSAgICAgICAgcmV0dXJuICJKU1RfQVBQQ0xJRU5UIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkMTY2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZUoyRUVDb21wb25lbnRzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE4LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBdmFpbGFibGVKMkVFQ29tcG9uZW50c0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkvL3ByaXZhdGUgaW50IGoyZWVWZXJzaW9uOwotCi0JcHVibGljIEF2YWlsYWJsZUoyRUVDb21wb25lbnRzQ29udGVudFByb3ZpZGVyKGludCBqMmVlVmVyc2lvbikgewotCQlzdXBlcigpOwotLy8JCXRoaXMuajJlZVZlcnNpb24gPSBqMmVlVmVyc2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbXB0eSA9IG5ldyBPYmplY3RbMF07Ci0JCWlmICghKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSkKLQkJCXJldHVybiBlbXB0eTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9ICgoSVdvcmtzcGFjZVJvb3QpIGlucHV0RWxlbWVudCkuZ2V0UHJvamVjdHMoKTsKLQkJaWYgKHByb2plY3RzID09IG51bGwgfHwgcHJvamVjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gZW1wdHk7Ci0JCUxpc3QgdmFsaWRDb21wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJLy8gZ2V0IGZsZXhpYmxlIHByb2plY3QKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCWlmKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCVN0cmluZyBjb21wVHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKTsKLQkJCQlpZiAoKGNvbXBUeXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFKSkgfHwKLQkJCQkJCShjb21wVHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSkpIHx8Ci0JCQkJCQkoY29tcFR5cGUuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpKSB8fAotCQkJCQkJKGNvbXBUeXBlLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFKSkgfHwKLQkJCQkJCShjb21wVHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfVVRJTElUWV9NT0RVTEUpKSApCi0JCQkJCXZhbGlkQ29tcExpc3QuYWRkKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJfSBlbHNlCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBwcm9qZWN0Lmhhc05hdHVyZSgib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsaWRDb21wTGlzdC5hZGQocHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQ29tcExpc3QudG9BcnJheSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gKChJVmlydHVhbENvbXBvbmVudCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZUphcnNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI3MzI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc1BhdGhTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5DbGFzc3BhdGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuT3ZlcmxheUljb247Ci0KLQotcHVibGljIGNsYXNzIEF2YWlsYWJsZUphcnNQcm92aWRlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB1dGlsSW1hZ2U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBpbnZhbGlkSW1hZ2U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBlamJJbWFnZTsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVqYkNsaWVudEltYWdlOwotCi0JLyoqCi0JICogQXZhaWxhYmxlSmFyc0NvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBdmFpbGFibGVKYXJzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkKLQkgKiByZWdpc3RlcmVkLgotCSAqIDxwPgotCSAqIExhYmVsIHByb3ZpZGVyIGxpc3RlbmVycyBhcmUgaW5mb3JtZWQgYWJvdXQgc3RhdGUgY2hhbmdlcyB0aGF0IGFmZmVjdCB0aGUgcmVuZGVyaW5nIG9mIHRoZQotCSAqIHZpZXdlciB0aGF0IHVzZXMgdGhpcyBsYWJlbCBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgbGFiZWwgcHJvdmlkZXIuIFdoZW4gYSBsYWJlbCBwcm92aWRlciBpcyBhdHRhY2hlZCB0byBhIHZpZXdlciwgdGhlIHZpZXdlcgotCSAqIHdpbGwgYXV0b21hdGljYWxseSBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlIHZpZXdlciBpcyBiZWluZyBjbG9zZWQuIFdoZW4gbGFiZWwgcHJvdmlkZXJzIGFyZQotCSAqIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiBhIHZpZXdlciwgaXQgaXMgdGhlIGNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0Ci0JICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHByb3ZpZGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9kaXNwb3NlCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgaW1hZ2UgZm9yIHRoZSBnaXZlbiBjb2x1bW4gb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgcm93LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgbm8KLQkgKiAgICAgICAgICAgIGlucHV0IG9iamVjdCBpcyBzZXQgaW4gdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqICAgICAgICAgICAgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB3aGljaCB0aGUgbGFiZWwgYXBwZWFycwotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPiAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNsYXNzcGF0aEVsZW1lbnQgY3AgPSAoQ2xhc3NwYXRoRWxlbWVudCkgZWxlbWVudDsKLQkJaWYgKCFjcC5pc1ZhbGlkKCkpCi0JCQlyZXR1cm4gZ2V0SW52YWxpZEltYWdlKCk7Ci0KLQkJc3dpdGNoIChjcC5nZXRKYXJUeXBlKCkpIHsKLQkJCWNhc2UgQ2xhc3NwYXRoRWxlbWVudC5FSkJfSkFSIDoKLQkJCQlyZXR1cm4gZ2V0RWpiSW1hZ2UoKTsKLQkJCWNhc2UgQ2xhc3NwYXRoRWxlbWVudC5FSkJfQ0xJRU5UX0pBUiA6Ci0JCQkJcmV0dXJuIGdldEVqYkNsaWVudEltYWdlKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gZ2V0VXRpbEltYWdlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgZ2l2ZW4gY29sdW1uIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW50aXJlIHJvdywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vCi0JICogICAgICAgICAgICBpbnB1dCBvYmplY3QgaXMgc2V0IGluIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2ggdGhlIGxhYmVsIGFwcGVhcnMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQljYXNlIDAgOiB7Ci0JCQkJdmFsdWUgPSAoKENsYXNzcGF0aEVsZW1lbnQpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgMSA6Ci0JCQkJdmFsdWUgPSAoKENsYXNzcGF0aEVsZW1lbnQpIGVsZW1lbnQpLmdldFByb2plY3ROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGdldEVqYkltYWdlKCkgewotCQlpZiAoZWpiSW1hZ2UgPT0gbnVsbCkKLQkJCWVqYkltYWdlID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJFSkJKYXIiKS5jcmVhdGVJbWFnZSgpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVqYkltYWdlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZ2V0RWpiQ2xpZW50SW1hZ2UoKSB7Ci0JCWlmIChlamJDbGllbnRJbWFnZSA9PSBudWxsKQotCQkJZWpiQ2xpZW50SW1hZ2UgPSBnZXRJbWFnZURlc2NyaXB0b3IoImVqYmNsaWVudGphcl9vYmoiKS5jcmVhdGVJbWFnZSgpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVqYkNsaWVudEltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLiBUaGUgcmVzdWx0IGlzIG5vdAotCSAqIG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJQ2xhc3NQYXRoU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChDbGFzc1BhdGhTZWxlY3Rpb24pIGlucHV0RWxlbWVudDsKLQkJcmV0dXJuIGZpbHRlcihzZWxlY3Rpb24sIHNlbGVjdGlvbi5nZXRGaWx0ZXJMZXZlbCgpKS50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZmlsdGVyKENsYXNzUGF0aFNlbGVjdGlvbiBzZWxlY3Rpb24sIGludCBmaWx0ZXJMZXZlbCkgewotCQlMaXN0IGxpc3QgPSBzZWxlY3Rpb24uZ2V0Q2xhc3NwYXRoRWxlbWVudHMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSAoQ2xhc3NwYXRoRWxlbWVudCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoIWVsZW1lbnQuaXNTZWxlY3RlZCgpKSB7Ci0JCQkJc3dpdGNoIChmaWx0ZXJMZXZlbCkgewotCQkJCQljYXNlIChDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX0VKQl9DTElFTlRfSkFSUykgOgotCQkJCQkJaWYgKGVsZW1lbnQuaXNFSkJDbGllbnRKYXIoKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChDbGFzc1BhdGhTZWxlY3Rpb24uRklMVEVSX0VKQl9TRVJWRVJfSkFSUykgOgotCQkJCQkJaWYgKGVsZW1lbnQuaXNFSkJKYXIoKSAmJiBzZWxlY3Rpb24uZ2V0T3Bwb3NpdGVFbGVtZW50KGVsZW1lbnQpICE9IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCi0JCVVSTCBnaWZJbWFnZVVSTCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2Uoa2V5KTsKLQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZ2lmSW1hZ2VVUkwpOwotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZ2V0SW52YWxpZEltYWdlKCkgewotCQlpZiAoaW52YWxpZEltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBiYXNlID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJqYXJfbm9uZXhpc3Rfb2JqIik7Ly8kTk9OLU5MUy0xJAotCQkJSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXkgPSBnZXRJbWFnZURlc2NyaXB0b3IoIndhcm5pbmdfY28iKTsvLyROT04tTkxTLTEkCi0JCQlpbnZhbGlkSW1hZ2UgPSBuZXcgT3ZlcmxheUljb24oYmFzZSwgbmV3IEltYWdlRGVzY3JpcHRvcltdW117e292ZXJsYXl9fSkuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gaW52YWxpZEltYWdlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0VXRpbEltYWdlKCkgewotCQlpZiAodXRpbEltYWdlID09IG51bGwpCi0JCQl1dGlsSW1hZ2UgPSBnZXRJbWFnZURlc2NyaXB0b3IoImphcl9vYmoiKS5jcmVhdGVJbWFnZSgpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHV0aWxJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQgaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQKLQkgKiBlbGVtZW50LgotCSAqIDxwPgotCSAqIEEgdHlwaWNhbCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyaW5nIHRoZSBjb250ZW50IHByb3ZpZGVyIGFzIGEgbGlzdGVuZXIgdG8gY2hhbmdlcyBvbgotCSAqIHRoZSBuZXcgaW5wdXQgKHVzaW5nIG1vZGVsLXNwZWNpZmljIG1lYW5zKSwgYW5kIGRlcmVnaXN0ZXJpbmcgdGhlIHZpZXdlciBmcm9tIHRoZSBvbGQgaW5wdXQuCi0JICogSW4gcmVzcG9uc2UgdG8gdGhlc2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMsIHRoZSBjb250ZW50IHByb3ZpZGVyIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZXMgdG8gdGhlCi0JICogdmlld2VyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyCi0JICogQHBhcmFtIG9sZElucHV0Ci0JICogICAgICAgICAgICB0aGUgb2xkIGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIgZGlkIG5vdCBwcmV2aW91c2x5Ci0JICogICAgICAgICAgICBoYXZlIGFuIGlucHV0Ci0JICogQHBhcmFtIG5ld0lucHV0Ci0JICogICAgICAgICAgICB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIgZG9lcyBub3QgaGF2ZSBhbiBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgbGFiZWwgd291bGQgYmUgYWZmZWN0ZWQgYnkgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbgotCSAqIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gb3B0aW1pemUgYSBub24tc3RydWN0dXJhbCB2aWV3ZXIgdXBkYXRlLiBJZiB0aGUgcHJvcGVydHkKLQkgKiBtZW50aW9uZWQgaW4gdGhlIHVwZGF0ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGxhYmVsLCB0aGVuIHRoZSB2aWV3ZXIgbmVlZCBub3QgdXBkYXRlIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0Ci0JICogICAgICAgICB3b3VsZCBiZSB1bmFmZmVjdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLiBIYXMgbm8gYWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QKLQkgKiByZWdpc3RlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVNb2R1bGVQcm9qZWN0c1Byb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZU1vZHVsZVByb2plY3RzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxZGU0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZU1vZHVsZVByb2plY3RzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFibGVNb2R1bGVQcm9qZWN0c1Byb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQotCXB1YmxpYyBBdmFpbGFibGVNb2R1bGVQcm9qZWN0c1Byb3ZpZGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCW1vZGVsID0gZGF0YU1vZGVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCUxpc3QgdmFsaWRNb2R1bGVQcm9qZWN0cyA9IG51bGw7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkgewotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9ICgoSVdvcmtzcGFjZVJvb3QpIGlucHV0RWxlbWVudCkuZ2V0UHJvamVjdHMoKTsKLQkJCWlmIChwcm9qZWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJaW50IGoyZWVWZXJzaW9uID0gbW9kZWwuZ2V0SW50UHJvcGVydHkoSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGlzVmFsaWQocHJvamVjdHNbaV0sIGoyZWVWZXJzaW9uKSkgewotCQkJCQkJaWYgKHZhbGlkTW9kdWxlUHJvamVjdHMgPT0gbnVsbCkKLQkJCQkJCQl2YWxpZE1vZHVsZVByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJdmFsaWRNb2R1bGVQcm9qZWN0cy5hZGQocHJvamVjdHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh2YWxpZE1vZHVsZVByb2plY3RzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJcmV0dXJuIHZhbGlkTW9kdWxlUHJvamVjdHMudG9BcnJheSgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKElQcm9qZWN0IHByb2plY3QsIGludCBqMmVlVmVyc2lvbikgewotCQkvL21pZ3JhdGUgdG8gYXJ0aWZhY3QgZWRpdHMKLS8vCQl0cnkgewotLy8JCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKQotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQlKMkVFTmF0dXJlIGoyZWVOYXR1cmUgPSBKMkVFTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lKHByb2plY3QpOwotLy8JCQlpZiAoajJlZU5hdHVyZSAhPSBudWxsKSB7Ci0vLwkJCQlyZXR1cm4gajJlZU5hdHVyZS5nZXRKMkVFVmVyc2lvbigpIDw9IGoyZWVWZXJzaW9uOwotLy8JCQl9IGVsc2UgaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy9JZ25vcmUKLS8vCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuICgoSVByb2plY3QpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1vZGVsID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVV0aWxKYXJzQW5kV2ViTGliUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODVlYTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIyLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5GaWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFibGVVdGlsSmFyc0FuZFdlYkxpYlByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIEF2YWlsYWJsZVV0aWxKYXJzQW5kV2ViTGliUHJvdmlkZXIoKSB7Ci0JCS8vRGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFQVJGaWxlKSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IEVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmdldEFsbFV0aWxpdGllcygoRUFSRmlsZSkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0KLQkJCUxpc3QgZmlsdGVyZWRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChhcnJheSAhPSBudWxsICYmIGFycmF5Lmxlbmd0aCAhPSAwKQotCQkJCWZpbHRlcmVkUHJvamVjdHMgPSBmaWx0ZXJFSkJDbGllbnRKYXJzKGFycmF5LCAoKEVBUkZpbGUpIGlucHV0RWxlbWVudCkpOwotCQkJZWxzZQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCi0JCQlhcnJheSA9IGZpbHRlcmVkUHJvamVjdHMudG9BcnJheSgpOwotCQkJQXJyYXlzLnNvcnQoYXJyYXksIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlyZXR1cm4gZ2V0Q29sdW1uVGV4dChvMSwgMCkuY29tcGFyZVRvKGdldENvbHVtblRleHQobzIsIDApKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhcnJheQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZmlsdGVyRUpCQ2xpZW50SmFycyhPYmplY3RbXSBhcnJheSwgRUFSRmlsZSBlYXIpIHsKLQkJTGlzdCB1dGlsaXRpZXMgPSBuZXcgQXJyYXlMaXN0KGFycmF5Lmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXV0aWxpdGllcy5hZGQoYXJyYXlbaV0pOwotCQl9Ci0JCUxpc3QgZWpiSmFycyA9IGVhci5nZXRFSkJKYXJGaWxlcygpOwotCQlpZiAoZWpiSmFycyAhPSBudWxsKSB7Ci0JCQlMaXN0IGNsaWVudE5hbWVzID0gbmV3IEFycmF5TGlzdChlamJKYXJzLnNpemUoKSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVqYkphcnMuc2l6ZSgpOyBqKyspIHsKLQkJCQlFSkJKYXIgamFyID0gKChFSkJKYXJGaWxlKSBlamJKYXJzLmdldChqKSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQlpZiAoamFyICE9IG51bGwpIHsKLQkJCQkJY2xpZW50TmFtZXMuYWRkKGphci5nZXRFamJDbGllbnRKYXIoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNsaWVudE5hbWVzICE9IG51bGwgJiYgIWNsaWVudE5hbWVzLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjbGllbnROYW1lcy5zaXplKCk7IGsrKykgewotCQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBjbGllbnROYW1lcy5nZXQoayk7Ci0JCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgdXRpbGl0aWVzLnNpemUoKTsgbCsrKSB7Ci0JCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgdXRpbGl0aWVzLmdldChsKTsKLQkJCQkJCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMocHJvamVjdE5hbWUpKQotCQkJCQkJCXRvUmVtb3ZlLmFkZCh1dGlsaXRpZXMuZ2V0KGwpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQl1dGlsaXRpZXMucmVtb3ZlQWxsKHRvUmVtb3ZlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXRpbGl0aWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmdldFV0aWxJbWFnZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUZpbGVJbXBsIGZpbGUgPSAoRmlsZUltcGwpIGVsZW1lbnQ7Ci0JCWlmIChmaWxlLmdldFVSSSgpLnN0YXJ0c1dpdGgoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSkpIHsKLQkJCVN0cmluZyBwYXJlbnRXYXJGaWxlTmFtZSA9ICgoV0FSRmlsZSkgZmlsZS5lQ29udGFpbmVyKCkpLmdldE5hbWUoKTsKLQkJCXJldHVybiBwYXJlbnRXYXJGaWxlTmFtZSArICIjIiArIGZpbGUuZ2V0VVJJKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0F1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9BdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9BdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVV0aWxpdHlKYXJzUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE4MmQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIyLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIEF2YWlsYWJsZVV0aWxpdHlKYXJzUHJvdmlkZXIoKSB7Ci0JCS8vZGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCS8qCi0JCSAqIE9iamVjdFtdIGFycmF5ID0gRUFSSW1wb3J0RGF0YU1vZGVsLmdldEFsbFV0aWxpdGllcygoRUFSRmlsZSkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCSAqLwotCQlPYmplY3RbXSBhcnJheSA9IGdldEphckZpbGVzRnJvbURpcmVjdG9yeShpbnB1dEVsZW1lbnQpOwotCQlBcnJheXMuc29ydChhcnJheSwgbmV3IENvbXBhcmF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCXJldHVybiBnZXRDb2x1bW5UZXh0KG8xLCAwKS5jb21wYXJlVG8oZ2V0Q29sdW1uVGV4dChvMiwgMCkpOwotCQkJfQotCi0JCX0pOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGdldEphckZpbGVzRnJvbURpcmVjdG9yeShPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0KLQkJTGlzdCBjb2xsZWN0ZWRKYXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJRGF0YU1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElEYXRhTW9kZWwpCi0JCQltb2RlbCA9IChJRGF0YU1vZGVsKSBpbnB1dEVsZW1lbnQ7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0KLQkJCVN0cmluZyBmaWxlTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFWQUlMQUJMRV9KQVJTX0RJUkVDVE9SWSk7Ci0JCQlGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJCWlmIChkaXJlY3RvcnkuZXhpc3RzKCkgJiYgZGlyZWN0b3J5LmNhblJlYWQoKSAmJiBkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCUZpbGVbXSBhdmFpbGFibGVGaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQotCQkJCWlmIChhdmFpbGFibGVGaWxlcyA9PSBudWxsKQotCQkJCQlyZXR1cm4gbmV3IEZpbGVbMF07Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZUZpbGVzLmxlbmd0aDsgaSsrKQotCQkJCQlpZiAoYXZhaWxhYmxlRmlsZXNbaV0gIT0gbnVsbCAmJiBhdmFpbGFibGVGaWxlc1tpXS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSljb2xsZWN0ZWRKYXJzLmFkZChhdmFpbGFibGVGaWxlc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sbGVjdGVkSmFycy50b0FycmF5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBBdmFpbGFibGVKYXJzUHJvdmlkZXIuZ2V0VXRpbEltYWdlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLyoKLQkJICogRmlsZUltcGwgZmlsZSA9IChGaWxlSW1wbCkgZWxlbWVudDsgaWYKLQkJICogKGZpbGUuZ2V0VVJJKCkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSkgeyBTdHJpbmcgcGFyZW50V2FyRmlsZU5hbWUgPQotCQkgKiAoKFdBUkZpbGUpIGZpbGUuZUNvbnRhaW5lcigpKS5nZXROYW1lKCk7IHJldHVybiBwYXJlbnRXYXJGaWxlTmFtZSArICIjIiArIGZpbGUuZ2V0VVJJKCk7Ci0JCSAqIC8vJE5PTi1OTFMtMSQgfSBlbHNlIHJldHVybiBmaWxlLmdldE5hbWUoKTsKLQkJICovCi0JCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2UKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQ2xhc3Nlc0ltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9DbGFzc2VzSW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzcxNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9DbGFzc2VzSW1wb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuQ29yZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuYnVpbGRwYXRocy5DUExpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc2VzSW1wb3J0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwdWJsaWMgV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlIG1haW5QYWdlID0gbnVsbDsKLQotCXB1YmxpYyBXaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEgcGFnZTEgPSBudWxsOwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBJUGF0aCBpbXBvcnRlZENsYXNzZXNQYXRoOwotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgZmlsZU5hbWVzID0gbnVsbDsKLQotCXB1YmxpYyBDbGFzc2VzSW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDbGFzc2VzSW1wb3J0V2l6YXJkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQotCX0KLQotCXB1YmxpYyBDbGFzc2VzSW1wb3J0V2l6YXJkKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWxlTmFtZSwgTGlzdCBvdGhlckZpbGVOYW1lcykgewotCQl0aGlzKHByb2plY3QpOwotCQl0aGlzLmZpbGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5maWxlTmFtZXMuYWRkKGZpbGVOYW1lKTsKLQkJaW50IGkgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZihqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCVN0cmluZyBwYXJlbnREaXIgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaSk7Ci0JCWlmIChvdGhlckZpbGVOYW1lcyAhPSBudWxsKQotCQkJZm9yIChpbnQgaiA9IG90aGVyRmlsZU5hbWVzLnNpemUoKSAtIDE7IGogPj0gMDsgai0tKSB7Ci0JCQkJaWYgKG90aGVyRmlsZU5hbWVzLmdldChqKSAhPSBudWxsKSB7Ci0JCQkJCWludCBrID0gKChTdHJpbmcpIG90aGVyRmlsZU5hbWVzLmdldChqKSkubGFzdEluZGV4T2YoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJCQlpZiAoayA9PSBpICYmIHBhcmVudERpci5lcXVhbHMoKChTdHJpbmcpIG90aGVyRmlsZU5hbWVzLmdldChqKSkuc3Vic3RyaW5nKDAsIGspKSkgewotCQkJCQkJZmlsZU5hbWVzLmFkZChvdGhlckZpbGVOYW1lcy5yZW1vdmUoaikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9sZGVyUGF0aChJUGF0aCBwYXRoKSB7Ci0JCWltcG9ydGVkQ2xhc3Nlc1BhdGggPSBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHBhZ2UxLmZpbmlzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUltcG9ydGVkQ2xhc3Nlc0ZvbGRlcihJUHJvamVjdCBhUHJvamVjdCkgewotCQkvL0NyZWF0ZSBpbXBvcnRlZF9jbGFzc2VzIGZvbGRlciBzZWxlY3RlZCBwcm9qZWN0Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gYVByb2plY3Q7Ci0JCUlGb2xkZXIgZm9sZGVyID0gY29udGFpbmVyLmdldEZvbGRlcihuZXcgUGF0aCgiaW1wb3J0ZWRfY2xhc3NlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlqYXZhUHJvamVjdCA9IGdldElKYXZhUHJvamVjdChhUHJvamVjdCk7Ci0KLQkJSVBhdGggaW1wb3J0ZWRGb2xkZXJzQ2xhc3MgPSBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQotCQlDUExpc3RFbGVtZW50IGVudHJ5ID0gbmV3Q1BMaWJyYXJ5RWxlbWVudChmb2xkZXIpOwotCQlJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnkgPSBlbnRyeS5nZXRDbGFzc3BhdGhFbnRyeSgpOwotCi0JCUlSZXNvdXJjZSByZXMgPSBlbnRyeS5nZXRSZXNvdXJjZSgpOwotCQlpZiAoKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpICYmICFyZXMuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJQ29yZVV0aWxpdHkuY3JlYXRlRm9sZGVyKChJRm9sZGVyKSByZXMsIHRydWUsIHRydWUsIG51bGwpOwotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY2xhc3NwYXRoRW50cmllcy5sZW5ndGggKyAxXTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3Q2xhc3NwYXRoW2ldID0gY2xhc3NwYXRoRW50cmllc1tpXTsKLQkJCX0KLQkJCW5ld0NsYXNzcGF0aFtjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aF0gPSBuZXdFbnRyeTsKLQotCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbnVsbCk7Ci0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQotCQlzZXRGb2xkZXJQYXRoKGltcG9ydGVkRm9sZGVyc0NsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRJSmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdEhhbmRsZSkgewotCQlJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJcmV0dXJuIGphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChwcm9qZWN0SGFuZGxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDUExpc3RFbGVtZW50IG5ld0NQTGlicmFyeUVsZW1lbnQoSVJlc291cmNlIHJlcykgewotCi0JCXJldHVybiBuZXcgQ1BMaXN0RWxlbWVudChqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZLCByZXMuZ2V0RnVsbFBhdGgoKSwgcmVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSW1wb3J0X0NsYXNzX0ZpbGVzX1VJIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuIikpOyAvLyROT04tTkxTLTEkCi0KLQkJd29ya2JlbmNoID0gYVdvcmtiZW5jaDsKLQkJc2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJaWYgKCFhU2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBhU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBhU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQljcmVhdGVJbXBvcnRlZENsYXNzZXNGb2xkZXIocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5hZGRQYWdlcygpOwotCQkJbWFpblBhZ2UgPSBuZXcgV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlKCJpZCIsIGZpbGVOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCW1haW5QYWdlLnNldFdpemFyZCh0aGlzKTsKLQkJCWlmIChmaWxlTmFtZXMgPT0gbnVsbCB8fCBmaWxlTmFtZXMuc2l6ZSgpID09IDApCi0JCQkJYWRkUGFnZShtYWluUGFnZSk7Ci0JCQlwYWdlMSA9IG5ldyBXaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEod29ya2JlbmNoLCBzZWxlY3Rpb24sIGltcG9ydGVkQ2xhc3Nlc1BhdGgsIGZpbGVOYW1lcyk7Ci0JCQlwYWdlMS5zZXRXaXphcmQodGhpcyk7Ci0JCQlhZGRQYWdlKHBhZ2UxKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RhdGFNb2RlbEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RhdGFNb2RlbEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZThiMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9EYXRhTW9kZWxBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAgewotCi0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJvdGVjdGVkIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotICAgIHByb3RlY3RlZCBCdXR0b24gdXNlQW5ub3RhdGlvbnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzRm9yQmVhbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlU2VydmxldFN0cmluZyA9IGZhbHNlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCVEFHU0VUID0gImVqYiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkQmVhbkRlZmF1bHRVc2VBbm5vdGF0aW9ucyA9IGZhbHNlOwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRQcm9qZWN0RGVmYXVsdFVzZUFubm90YXRpb25zID0gZmFsc2U7Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICBpZiAoaXNGb3JCZWFuKQotICAgICAgICAgICAgICAgIHNob3VsZEJlYW5EZWZhdWx0VXNlQW5ub3RhdGlvbnMgPSBidXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2hvdWxkUHJvamVjdERlZmF1bHRVc2VBbm5vdGF0aW9ucyA9IGJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IENoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIERhdGFNb2RlbEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwsIGJvb2xlYW4gZm9yQmVhbiwgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY0hlbHApIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIG1vZGVsLCBmb3JCZWFuLCBmYWxzZSwgc3luY0hlbHApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIERhdGFNb2RlbEFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwsIGJvb2xlYW4gZm9yQmVhbiwgYm9vbGVhbiB1c2VTZXJ2bGV0LCBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jSGVscCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMuaXNGb3JCZWFuID0gZm9yQmVhbjsKLSAgICAgICAgdGhpcy51c2VTZXJ2bGV0U3RyaW5nID0gdXNlU2VydmxldDsKLSAgICAgICAgc3luY2hIZWxwZXIgPSBzeW5jSGVscDsKLSAgICAgICAgYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIEFkZCBzZXBhcmF0b3IKLSAgICAgICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIC8vIEFkZCBzcGFjZXIKLSAgICAgICAgTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBnZDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QxLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgc3BhY2VyLnNldExheW91dERhdGEoZ2QxKTsKLSAgICAgICAgLy8gQWRkIGFubm90YXRpb25zIGNoZWNrYm94IGFuZCBsYWJlbAotICAgICAgICB1c2VBbm5vdGF0aW9ucyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBTdHJpbmcgbGFiZWxUZXh0OwotICAgICAgICBpZiAodXNlU2VydmxldFN0cmluZykKLSAgICAgICAgICAgIGxhYmVsVGV4dCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlVTRV9BTk5PVEFUSU9OU19TRVJWTEVUKTsKLSAgICAgICAgZWxzZSBpZiAoaXNGb3JCZWFuKQotICAgICAgICAgICAgbGFiZWxUZXh0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVVNFX0FOTk9UQVRJT05TKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGFiZWxUZXh0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQUREX0FOTk9UQVRJT05TX1NVUFBPUlQpOwotICAgICAgICB1c2VBbm5vdGF0aW9ucy5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godXNlQW5ub3RhdGlvbnMsIElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIG51bGwpOwotICAgICAgICB1c2VBbm5vdGF0aW9ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICAgICAgR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHVzZUFubm90YXRpb25zLnNldExheW91dERhdGEoZ2QyKTsKLSAgICAgICAgLy8gSWYgZm9yIHByb2plY3QsIHNldCB0aGUgZ2xvYmFsIGFubm90YXRpb25zIHN1cHBvcnRlZAotICAgICAgICBpZiAoIWlzRm9yQmVhbikKLSAgICAgICAgICAgIHNldEVuYWJsZW1lbnQobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgbW9kZWwucmVtb3ZlTGlzdGVuZXIoc3luY2hIZWxwZXIpOwotICAgICAgICBzeW5jaEhlbHBlciA9IG51bGw7Ci0gICAgICAgIG1vZGVsID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25zU3VwcG9ydGVkKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgLy9UT0RPIGNsZWFuIHVwIHRvIGJlIG1vZHVsZSBiYXNlZCwgbm90IHByb2plY3QgYmFzZWQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vICAgICAgICAgIGlmIChpc0ZvckJlYW4pIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAvLyBBbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyLklOU1RBTkNFLmdldEFubm90YXRpb25zQ29udHJvbGxlcihwcm9qZWN0KTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICByZXR1cm4gKGNvbnRyb2xsZXIgIT1udWxsICYmIGNvbnRyb2xsZXIuaXNUYWdIYW5kbGVySW5zdGFsbGVkKEVKQlRBR1NFVCkpOwotICAgICAgICAgICAgLy8gICAgICAgICAgfQotLy8gICAgICAgICAgSjJFRU1vZHVsZU5hdHVyZSBuYXR1cmUgPSBudWxsOwotLy8gICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkKLS8vICAgICAgICAgICAgICBuYXR1cmUgPSAoSjJFRU1vZHVsZU5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0vLyAgICAgICAgICBlbHNlIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5oYXNOYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKQotLy8gICAgICAgICAgICAgIG5hdHVyZSA9IChKMkVFTW9kdWxlTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCk7Ci0vLwotLy8gICAgICAgICAgaWYgKCFpc0ZvckJlYW4gfHwgKG5hdHVyZSAhPSBudWxsICYmIG5hdHVyZS5nZXRKMkVFVmVyc2lvbigpID4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzIpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotLy8gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZW1lbnQoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICAvL1RPRE8KLSAgICAgICAgLy9ib29sZWFuIGlzRW5hYmxlZCA9IGlzQW5ub3RhdGlvbnNTdXBwb3J0ZWQocHJvamVjdCk7Ci0gICAgICAgIHVzZUFubm90YXRpb25zLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLyAgICAgIGlmICghaXNFbmFibGVkIHx8ICghaXNGb3JCZWFuICYmICFzaG91bGRQcm9qZWN0RGVmYXVsdFVzZUFubm90YXRpb25zKSB8fCAoaXNGb3JCZWFuICYmICFzaG91bGRCZWFuRGVmYXVsdFVzZUFubm90YXRpb25zKSkgewotLy8gICAgICAgICAgdXNlQW5ub3RhdGlvbnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLS8vICAgICAgICAgIG1vZGVsLnNldFByb3BlcnR5KElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIEJvb2xlYW4uRkFMU0UpOwotLy8gICAgICB9IGVsc2UgewotLy8gICAgICAgICAgdXNlQW5ub3RhdGlvbnMuc2V0U2VsZWN0aW9uKHRydWUpOwotLy8gICAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUywgQm9vbGVhbi5UUlVFKTsKLS8vICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZVNlcnZsZXQoYm9vbGVhbiBhQm9vbGVhbikgewotICAgICAgICB1c2VTZXJ2bGV0U3RyaW5nID0gYUJvb2xlYW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVzZUFubm90YXRpb25zKGJvb2xlYW4gYUJvb2xlYW4pIHsKLSAgICAgICAgaWYgKHVzZUFubm90YXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVzZUFubm90YXRpb25zLnNldFNlbGVjdGlvbihhQm9vbGVhbik7Ci0gICAgICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TLCBuZXcgQm9vbGVhbihhQm9vbGVhbikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ4Yjk0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotcHVibGljIGNsYXNzIERlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RJT05fUEcgPSAic2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHVibGljIERlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIERlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkRFRkFVTFRfQ09NUE9ORU5UX1dJWl9USVRMRSkpOwotCQlTdHJpbmcgaWNvblBhdGggPSAiaWNvbnMvZnVsbC8iOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IElERVdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIGljb25QYXRoICsgIndpemJhbi9uZXdfd2l6LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNob3VsZCBub3QgaGFwcGVuLiBJZ25vcmUuCi0JCX0KLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IE5ld0oyRUVDb21wb25lbnRTZWxlY3Rpb25QYWdlKGdldERhdGFNb2RlbCgpLCBTRUxFQ1RJT05fUEcpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmICghc3VwZXIuY2FuRmluaXNoKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FTkFCTEVEKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRDcmVhdGlvblNlY29uZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50Q3JlYXRpb25TZWNvbmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZWI1YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRDcmVhdGlvblNlY29uZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRDcmVhdGlvblNlY29uZFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIGltcGxlbWVudHMgSUVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllc3sKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gbmV3TW9kdWxlQnV0dG9uOwotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBtb2R1bGVQcm9qZWN0c1ZpZXdlcjsKLQlwcml2YXRlIGJvb2xlYW4gaWdub3JlQ2hlY2tlZFN0YXRlID0gZmFsc2U7Ci0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudENyZWF0aW9uU2Vjb25kUGFnZShJRGF0YU1vZGVsICBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9DT01QT05FTlRfU0VDT05EX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9DT01QT05FTlRfU0VDT05EX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9XSVpfQkFOTkVSKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7SUVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5KMkVFX0NPTVBPTkVOVF9MSVNUfTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgbW9kdWxlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQltb2R1bGVzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfRUFSX0FERF9NT0RVTEVTX1BBR0UpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQltb2R1bGVzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNyZWF0ZU1vZHVsZVByb2plY3RPcHRpb25zKG1vZHVsZXNHcm91cCk7Ci0JCWNyZWF0ZUJ1dHRvbnNHcm91cChtb2R1bGVzR3JvdXApOwotCQlyZXR1cm4gbW9kdWxlc0dyb3VwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGVzR3JvdXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTW9kdWxlUHJvamVjdE9wdGlvbnMoQ29tcG9zaXRlIG1vZHVsZXNHcm91cCkgewotCQltb2R1bGVQcm9qZWN0c1ZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KG1vZHVsZXNHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDIwMDsKLQkJZ0RhdGEuaGVpZ2h0SGludCA9IDgwOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWludCBqMmVlVmVyc2lvbiA9IGdldERhdGFNb2RlbCgpLmdldEludFByb3BlcnR5KENPTVBPTkVOVF9WRVJTSU9OKTsKLQkJQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNDb250ZW50UHJvdmlkZXIoajJlZVZlcnNpb24pOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBKMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlcigpKTsKLQkJc2V0Q2hlY2tlZEl0ZW1zRnJvbU1vZGVsKCk7Ci0JCQotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFpZ25vcmVDaGVja2VkU3RhdGUpIHsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSjJFRV9DT01QT05FTlRfTElTVCwgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpKTsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSkFWQV9QUk9KRUNUX0xJU1QsIGdldENoZWNrZWRKYXZhUHJvamVjdHNBc0xpc3QoKSk7Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQl9KTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JCW1vZHVsZVByb2plY3RzVmlld2VyLnNldFNvcnRlcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENoZWNrZWRJdGVtc0Zyb21Nb2RlbCgpIHsKLQkJTGlzdCBjb21wb25lbnRzID0gKExpc3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KElFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuSjJFRV9DT01QT05FTlRfTElTVCk7Ci0JCW1vZHVsZVByb2plY3RzVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhjb21wb25lbnRzLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hNb2R1bGVzKCkgewotCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5yZWZyZXNoKCk7Ci0JCXNldENoZWNrZWRJdGVtc0Zyb21Nb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldENoZWNrZWRKMkVFRWxlbWVudHNBc0xpc3QoKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCUxpc3QgbGlzdDsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApCi0JCQlsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJZWxzZXsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkJZm9yKCBpbnQgaT0wOyBpPCBlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYoIGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVByb2plY3QgKSB7Ci0JCQkJCWxpc3QuYWRkKGVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRDaGVja2VkSmF2YVByb2plY3RzQXNMaXN0KCkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IG1vZHVsZVByb2plY3RzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlMaXN0IGxpc3Q7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKQotCQkJbGlzdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWVsc2V7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJCWZvciggaW50IGk9MDsgaTwgZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkJCWlmKCBlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElQcm9qZWN0ICkgewotCQkJCQlsaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfUFJPSkVDVF9NT0RVTEVTX1BHX1NFTEVDVCkpOwotCQlzZWxlY3RBbGxCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLndpZHRoSGludCA9IDEyMDsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfUFJPSkVDVF9NT0RVTEVTX1BHX0RFU0VMRUNUKSk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQluZXdNb2R1bGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCW5ld01vZHVsZUJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9QUk9KRUNUX01PRFVMRVNfUEdfTkVXKSk7Ci0JCW5ld01vZHVsZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMTIwOwotCQluZXdNb2R1bGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJaWYgKGV2dC53aWRnZXQgPT0gc2VsZWN0QWxsQnV0dG9uKQotCQkJaGFuZGxlU2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQllbHNlIGlmIChldnQud2lkZ2V0ID09IGRlc2VsZWN0QWxsQnV0dG9uKQotCQkJaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCWVsc2UgaWYgKGV2dC53aWRnZXQgPT0gbmV3TW9kdWxlQnV0dG9uKQotCQkJaGFuZGxlTmV3TW9kdWxlQnV0dG9uUHJlc3NlZCgpOwotCQllbHNlCi0JCQlzdXBlci5oYW5kbGVFdmVudChldnQpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlTmV3TW9kdWxlQnV0dG9uUHJlc3NlZCgpIHsKLQkJSURhdGFNb2RlbCBhTW9kZWwgPSBjcmVhdGVOZXdNb2R1bGVNb2RlbCgpOwotCQlEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkKGFNb2RlbCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCUlXb3Jrc3BhY2VSb290IGlucHV0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCW1vZHVsZVByb2plY3RzVmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICAgICAgICAgIHNldE5ld01vZHVsZXMoYU1vZGVsKTsKLSAgICAgICAgICAgIHJlZnJlc2hNb2R1bGVzKCk7Ci0JCX0KLQl9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldE5ld01vZHVsZXMoSURhdGFNb2RlbCBkZWZhdWx0TW9kZWwpIHsKLSAgICAgICAgTGlzdCBuZXdDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBjb2xsZWN0TmV3Q29tcG9uZW50cyhkZWZhdWx0TW9kZWwsIG5ld0NvbXBvbmVudHMpOwotICAgICAgICBMaXN0IG9sZENvbXBvbmVudHMgPSAoTGlzdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoSUVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5KMkVFX0NPTVBPTkVOVF9MSVNUKTsKLSAgICAgICAgbmV3Q29tcG9uZW50cy5hZGRBbGwob2xkQ29tcG9uZW50cyk7Ci0gICAgICAgIGdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KElFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuSjJFRV9DT01QT05FTlRfTElTVCwgbmV3Q29tcG9uZW50cyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0TmV3Q29tcG9uZW50cyhJRGF0YU1vZGVsIGRlZmF1bHRNb2RlbCwgTGlzdCBuZXdQcm9qZWN0cykgewotICAgICAgICBjb2xsZWN0Q29tcG9uZW50cyhkZWZhdWx0TW9kZWwuZ2V0TmVzdGVkTW9kZWwoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9FSkIpLCBuZXdQcm9qZWN0cyk7Ci0gICAgICAgIGNvbGxlY3RDb21wb25lbnRzKGRlZmF1bHRNb2RlbC5nZXROZXN0ZWRNb2RlbChJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX01PREVMX1dFQiksIG5ld1Byb2plY3RzKTsKLSAgICAgICAgY29sbGVjdENvbXBvbmVudHMoZGVmYXVsdE1vZGVsLmdldE5lc3RlZE1vZGVsKElEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfTU9ERUxfQ0xJRU5UKSwgbmV3UHJvamVjdHMpOwotICAgICAgICBjb2xsZWN0Q29tcG9uZW50cyhkZWZhdWx0TW9kZWwuZ2V0TmVzdGVkTW9kZWwoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9KQ0EpLCBuZXdQcm9qZWN0cyk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBjb2xsZWN0Q29tcG9uZW50cyhJRGF0YU1vZGVsIGNvbXBETSwgTGlzdCBuZXdQcm9qZWN0cykgewotICAgICAgICBpZiAoY29tcERNICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGNvbXBETS5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0gICAgICAgICAgICBpZihwcm9qZWN0TmFtZSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBjb21wTmFtZSA9IGNvbXBETS5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FKTsKLSAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICBuZXdQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGNyZWF0ZU5ld01vZHVsZU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRlZmF1bHRNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCS8vIHRyYW5zZmVyIHByb3BlcnRpZXMsIHByb2plY3QgbmFtZQotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlkZWZhdWx0TW9kZWwuc2V0UHJvcGVydHkoSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQkvLyBlYXIgY29tcG9uZW50IG5hbWUKLQkJU3RyaW5nIGVhck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT01QT05FTlRfTkFNRSk7Ci0JCWRlZmF1bHRNb2RlbC5zZXRQcm9wZXJ0eShJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9OQU1FLCBlYXJOYW1lKTsKLQkJLy8gZWFyIGoyZWUgdmVyc2lvbgotCQlpbnQgajJlZVZlcnNpb24gPSBtb2RlbC5nZXRJbnRQcm9wZXJ0eShDT01QT05FTlRfVkVSU0lPTik7Ci0JCWRlZmF1bHRNb2RlbC5zZXRQcm9wZXJ0eShJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbikpOwotCQlyZXR1cm4gZGVmYXVsdE1vZGVsOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlpZ25vcmVDaGVja2VkU3RhdGUgPSB0cnVlOwotCQl0cnkgewotCQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQkvL2dldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEoyRUVfQ09NUE9ORU5UX0xJU1QsIG51bGwpOwotCQkJLy9JRGF0YU1vZGVsIG5lc3RlZE1vZGVsID0gKElEYXRhTW9kZWwpZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoTkVTVEVEX0FERF9DT01QT05FTlRfVE9fRUFSX0RNKTsJCi0JCQkvLyhuZXN0ZWRNb2RlbCkuc2V0UHJvcGVydHkoQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci4sIGdldENoZWNrZWRKMkVFRWxlbWVudHNBc0xpc3QoKSk7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShKMkVFX0NPTVBPTkVOVF9MSVNULCBudWxsKTsKLQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEpBVkFfUFJPSkVDVF9MSVNULCBudWxsKTsJCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlnbm9yZUNoZWNrZWRTdGF0ZSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCkgewotCQlpZ25vcmVDaGVja2VkU3RhdGUgPSB0cnVlOwotCQl0cnkgewotCQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCS8vZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSjJFRV9DT01QT05FTlRfTElTVCwgZ2V0Q2hlY2tlZEVsZW1lbnRzQXNMaXN0KCkpOwotCQkJLy9JRGF0YU1vZGVsIG5lc3RlZE1vZGVsID0gKElEYXRhTW9kZWwpZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoTkVTVEVEX0FERF9DT01QT05FTlRfVE9fRUFSX0RNKTsKLQkJCS8vKG5lc3RlZE1vZGVsKS5zZXRQcm9wZXJ0eShBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLiwgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpKTsKLQkJCQotCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSjJFRV9DT01QT05FTlRfTElTVCwgZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpKTsKLQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEpBVkFfUFJPSkVDVF9MSVNULCBnZXRDaGVja2VkSmF2YVByb2plY3RzQXNMaXN0KCkpOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZ25vcmVDaGVja2VkU3RhdGUgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5KMkVFV2l6YXJkUGFnZSNlbnRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IGlucHV0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlzdXBlci5lbnRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWEyOGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxNywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZCBleHRlbmRzIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCBpbXBsZW1lbnRzIElFeGVjdXRhYmxlRXh0ZW5zaW9uLCBJTmV3V2l6YXJkIHsKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgV2l6YXJkIElEIG9mIHRoZSBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC4gVXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgYW5kIGFjdGl2aXRpZXMgbWFuYWdlbWVudC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gIEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfUEcgPSAic2Vjb25kIjsgLy8kTk9OLU5MUy0xJAotCSAKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgCi0JICogbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubyBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgCi0JICogb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzCi0JICogYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JLyoqIAotCSAqIHtAaW5oZXJpdERvY30gICAKLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkaWFsb2cgd2luZG93IHRpdGxlIGFuZCBkZWZhdWx0IHBhZ2UgaW1hZ2UuIAotCSAqIDwvcD4gCi0JICogCi0JICogQHNlZSBKMkVFQXJ0aWZhY3RDcmVhdGlvbldpemFyZCNkb0luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0NPTVBPTkVOVF9XSVpfVElUTEUpKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX1dJWl9CQU5ORVIpKTsKLQl9IAotCSAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogQWRkcyBhIHtAbGluayBKQ0FQcm9qZWN0Q3JlYXRpb25QYWdlfSBhcyB0aGUge0BsaW5rIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCNNQUlOX1BHfS4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIHBhZ2UxID0gbmV3IEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRyk7Ci0JCXBhZ2UxLnNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfRUFSX0NPTVBfUEFHRSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUGFnZShwYWdlMSk7Ci0JCUVBUkNvbXBvbmVudENyZWF0aW9uU2Vjb25kUGFnZSBwYWdlMiA9IG5ldyBFQVJDb21wb25lbnRDcmVhdGlvblNlY29uZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIFNFQ09ORF9QRyk7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCQlzdXBlci5kb0FkZFBhZ2VzKCk7Ci0JfQotCi0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOwotICAgICAgICAKLSAgICB9IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODhkZDFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZSB7Ci0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDI1MDsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfQ09NUE9ORU5UX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0NPTVBPTkVOVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9XSVpfQkFOTkVSKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRU1vZHVsZUNyZWF0aW9uUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9BZHZhbmNlZENvbXBvc2l0ZShDb21wb3NpdGUgYWR2YW5jZWQpIHsKLQkJc3VwZXIuYWRkVG9BZHZhbmNlZENvbXBvc2l0ZShhZHZhbmNlZCk7Ci0JfQotCi0JLy9UT0RPOiB1dGlsaXR5IHRvIGhhbmRsZSBhZGRpdGlvbnMKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge0lDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBDT01QT05FTlRfTkFNRSwgQ09NUE9ORU5UX1ZFUlNJT04sIElKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lEIH07Ci0gICAgfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTliNzQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRFeHBvcnRQYWdlIGV4dGVuZHMgSjJFRUV4cG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBFQVJDb21wb25lbnRFeHBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0VYUE9SVF9NQUlOX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9FWFBPUlRfTUFJTl9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9QUk9KRUNUX0ZPUl9NT0RVTEVfQ1JFQVRJT04pOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsdGVyRXhwcmVzc2lvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117IiouZWFyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2hvd1Byb2plY3RGaWxlc0NoZWNrYm94KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFRXhwb3J0UGFnZSNpc01ldGFUeXBlU3VwcG9ydGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNZXRhVHlwZVN1cHBvcnRlZChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX0RFU1RJTkFUSU9OLCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0VYSVNUSU5HfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIElKMkVFVUlDb250ZXh0SWRzLkVYUE9SVF9FQVJfV0laQVJEX1AxOwotCX0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG5lbnRJRCgpIHsKLSAgICAgICAgcmV0dXJuICJKU1RfRUFSIjsgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDFmOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gZXhwb3J0IEoyRUUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBzdHJ1Y3R1cmVzIGZyb20gdGhlIEVjbGlwc2UgV29ya2JlbmNoIHRvIGEKLSAqIGRlcGxveWFibGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBBcmNoaXZlICouZWFyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFQVJDb21wb25lbnRFeHBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudEV4cG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpOwotICAgIH0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayBFQVJDb21wb25lbnRFeHBvcnRQYWdlfWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KQotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IEVBUkNvbXBvbmVudEV4cG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcsIGdldFNlbGVjdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRPcHRpb25zUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzVhZWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0T3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA4LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRJbXBvcnRPcHRpb25zUGFnZSBleHRlbmRzIEoyRUVJbXBvcnRQYWdlIHsKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBMYWJlbCBtb2R1bGVQcm9qZWN0TG9jYXRpb25MYWJlbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZUFsdGVybmF0ZVJvb3RCdG47Ci0JcHJvdGVjdGVkIFRleHQgc3lzdGVtRGVmYXVsdFRleHQ7Ci0JcHJvdGVjdGVkIEVBUkZpbGUgZWFyRmlsZTsKLQlwdWJsaWMgQ2hlY2tib3hUYWJsZVZpZXdlciBhdmFpbGFibGVKQVJzVmlld2VyOwotCXB1YmxpYyBib29sZWFuIHV0aWxKYXJTZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50SW1wb3J0T3B0aW9uc1BhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfTUFJTl9QR19USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX01BSU5fUEdfREVTQykpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9FQVJfV0laQVJEX1AyKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3JlYXRlSkFSc0NvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVQcm9qZWN0Um9vdENvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIGFsbCBidXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKSB7Ci0JCXV0aWxKYXJTZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdmFpbGFibGVKYXJzTGlzdChDb21wb3NpdGUgbGlzdEdyb3VwKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChsaXN0R3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZ0RhdGEud2lkdGhIaW50ID0gMjAwOwotCQlnRGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ0RhdGEpOwotCQlBdmFpbGFibGVVdGlsSmFyc0FuZFdlYkxpYlByb3ZpZGVyIGF2YWlsYWJsZVV0aWxKQVJzUHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlcigpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGF2YWlsYWJsZVV0aWxKQVJzUHJvdmlkZXIpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlhdmFpbGFibGVKQVJDaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKTsKLQkJCX0KLQkJfSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0JCW1vZGVsLmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfTElTVCkpIHsKLQkJCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoKChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0xJU1QpKS50b0FycmF5KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJQXJyYXlMaXN0IGVtcHR5U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9MSVNULCBlbXB0eVNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCUFycmF5TGlzdCBhbGxTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlPYmplY3Qgc2VsZWN0aW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IChudWxsICE9IChzZWxlY3Rpb24gPSBhdmFpbGFibGVKQVJzVmlld2VyLmdldEVsZW1lbnRBdChpKSkpOyBpKyspIHsKLQkJCWFsbFNlbGVjdGlvbi5hZGQoc2VsZWN0aW9uKTsKLQkJfQotCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0xJU1QsIGFsbFNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGJyb3dzZUJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuU0VMRUNUX0RJUkVDVE9SWV9ETEcpKTsKLQotCQlTdHJpbmcgZGlyTmFtZSA9IGdldEJyb3dzZVN0YXJ0TG9jYXRpb24oKTsKLQotCQlpZiAoIWlzTnVsbE9yRW1wdHkoZGlyTmFtZSkpIHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQkJaWYgKHBhdGguZXhpc3RzKCkpCi0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0JCX0KLQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkKLQkJCXN5c3RlbURlZmF1bHRUZXh0LnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcm93c2VTdGFydExvY2F0aW9uKCkgewotCQlTdHJpbmcgdGV4dCA9IHN5c3RlbURlZmF1bHRUZXh0LmdldFRleHQoKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfU0VMRUNUX0FMTF9VVElMX0JVVFRPTikpOyAvLyROT04tTkxTLTEkID0gIlNlbGVjdCBBbGwiCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9ERVNFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsgLy8kTk9OLU5MUy0xJCA9ICJEZXNlbGVjdCBBbGwiCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSkFSc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlncm91cC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfSkFSU19HUk9VUCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9TRUxFQ1RfVVRJTF9KQVJTX1RPX0JFX1BST0pFQ1RTKSk7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZDIuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLQkJLy8gY3JlYXRlIGphcnMgY2hlY2sgYm94IHZpZXdlcgotCQljcmVhdGVBdmFpbGFibGVKYXJzTGlzdChncm91cCk7Ci0JCWNyZWF0ZUJ1dHRvbnNHcm91cChncm91cCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdFJvb3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJZ3JvdXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5QUk9KRUNUX0xPQ0FUSU9OU19HUk9VUCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1BST0pFQ1RfR1JPVVBfREVTQ1JJUFRJT04pKTsKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQltb2R1bGVQcm9qZWN0TG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOwotCQltb2R1bGVQcm9qZWN0TG9jYXRpb25MYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlVTRV9ERUZBVUxUX1JPT1RfUkFESU8pKTsKLQkJbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJc3lzdGVtRGVmYXVsdFRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULlJFQURfT05MWSB8IFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXN5c3RlbURlZmF1bHRUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoc3lzdGVtRGVmYXVsdFRleHQsIElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RVTEVfUk9PVCwgbnVsbCk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaEVBUkZpbGVJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKGlzRUFSRmlsZUNoYW5nZWQoKSkgewotCQkJZWFyRmlsZSA9IChFQVJGaWxlKSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRSk7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKQVJzQ29tcG9zaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsR3JheWVkKCFlbmFibGVkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0SW5wdXQoZWFyRmlsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFQVJGaWxlQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGVhckZpbGUgIT0gbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCQlyZWZyZXNoRUFSRmlsZUlmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXZhaWxhYmxlSkFSQ2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5VVElMSVRZX0xJU1QsIGdldEpBUnNGb3JQcm9qZWN0cygpKTsKLQkJdmFsaWRhdGVQYWdlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0SkFSc0ZvclByb2plY3RzKCkgewotCQlyZWZyZXNoRUFSRmlsZUlmTmVjZXNzYXJ5KCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGFTdHJpbmcgPT0gbnVsbCB8fCBhU3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde307Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQkJLy8gVGhpcyBwYWdlIGRvZXNuJ3QgaW1wbGVtZW50Li4uCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgotCX0KLQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTEzZDZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDgsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUFSQ29tcG9uZW50SW1wb3J0UGFnZSBleHRlbmRzIEoyRUVJbXBvcnRQYWdlIHsKLQlwcm90ZWN0ZWQgQ29tYm8gc2VydmVyVGFyZ2V0Q29tYm87Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRUFSQ29tcG9uZW50SW1wb3J0UGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9NQUlOX1BHX0RFU0MpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfRUFSX1dJWkFSRF9QMSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZUZpbGVOYW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVByb2plY3ROYW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCXJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXROZXdQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZWFyTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJZWFyTW9kZWwuc2V0SW50UHJvcGVydHkoSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04sIG1vZGVsLmdldEludFByb3BlcnR5KElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OKSk7Ci0JCWVhck1vZGVsLnNldFByb3BlcnR5KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBtb2RlbC5nZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkpOwotCQllYXJNb2RlbC5zZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBtb2RlbC5nZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FKSk7Ci0JCXJldHVybiBlYXJNb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfUFJPSkVDVF9MQUJFTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsZUltcG9ydExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfRklMRV9MQUJFTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsdGVyRXhwcmVzc2lvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117IiouZWFyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFTW9kdWxlSW1wb3J0UGFnZSNjcmVhdGVBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBuZXcgQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoY29tcG9zaXRlLCBtb2RlbCwgZmFsc2UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FX1RBUkdFVF9JRCwgSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OU307Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsZU5hbWVzU3RvcmVJRCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlTmFtZXNTdG9yZUlEKCkgewotCQlyZXR1cm4gIkVBUiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjZmRjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBpbXBvcnQgSjJFRSBBcHBsaWNhdGlvbiBzdHJ1Y3R1cmVzIGludG8gdGhlIEVjbGlwc2UgV29ya2JlbmNoIGZyb20gYW4gZXhpc3RpbmcKLSAqIEVudGVycHJpc2UgQXBwbGljYXRpb24gQXJjaGl2ZSAqLmVhciBmaWxlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkIGltcGxlbWVudHMgSUV4ZWN1dGFibGVFeHRlbnNpb24sIElJbXBvcnRXaXphcmQgewotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBQcm9qZWN0cyBwYWdlIG9mIHRoZSBXaXphcmQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUEcgPSAicHJvamVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdGFudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBrZXkgb2YgdGhlIE9wdGlvbnMgcGFnZSBvZiB0aGUgV2l6YXJkLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05TX1BHID0gIm9wdGlvbnMiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8KLQkgKiBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBFQVJDb21wb25lbnRJbXBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCIzOCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIjM4IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyB0aGUgZm9sbG93aW5nIHBhZ2VzOgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rIEVBUkNvbXBvbmVudEltcG9ydFBhZ2V9YXMgdGhlIG1haW4gd2l6YXJkIHBhZ2UgKHtAbGluayAjTUFJTl9QR30pCi0JICogPGxpPntAbGluayBFQVJDb21wb25lbnRJbXBvcnRPcHRpb25zUGFnZX1hcyB0aGUgb3B0aW9ucyB3aXphcmQgcGFnZSAoe0BsaW5rICNPUFRJT05TX1BHfSkKLQkgKiA8bGk+e0BsaW5rIEVBUkNvbXBvbmVudFByb2plY3RzUGFnZX1hcyB0aGUgcHJvamVjdCB3aXphcmQgcGFnZSAoe0BsaW5rICNQUk9KRUNUX1BHfSkKLQkgKiA8L3VsPgotCSAqIAotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBFQVJDb21wb25lbnRJbXBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHKSk7Ci0JCWFkZFBhZ2UobmV3IEVBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlKGdldERhdGFNb2RlbCgpLCBPUFRJT05TX1BHKSk7Ci0JCWFkZFBhZ2UobmV3IEVBUkNvbXBvbmVudFByb2plY3RzUGFnZShnZXREYXRhTW9kZWwoKSwgUFJPSkVDVF9QRykpOwotCX0KLQotCi0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTVBPUlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRQcm9qZWN0c1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50UHJvamVjdHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDBhZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRQcm9qZWN0c1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA4LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVBUkNvbXBvbmVudFByb2plY3RzUGFnZSBleHRlbmRzIEoyRUVJbXBvcnRQYWdlIHsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBlYXJGaWxlTGlzdFZpZXdlcjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfQ09MVU1OID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0NPTFVNTiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJFQVJJbXBvcnRQcm9qZWN0c1BhZ2VfVUlfMSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DT0xVTU4gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUFSSW1wb3J0UHJvamVjdHNQYWdlX1VJXzIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEVBUkNvbXBvbmVudFByb2plY3RzUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9QUk9KRUNUX1BHX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfUFJPSkVDVF9QR19ERVNDKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfRUFSX1dJWkFSRF9QMyk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNyZWF0ZUxpc3RHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVCdXR0b25zR3JvdXAoY29tcG9zaXRlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbHVtbkVkaXRvcnMoKSB7Ci0JCVRhYmxlIHQgPSBlYXJGaWxlTGlzdFZpZXdlci5nZXRUYWJsZSgpOwotCQlDZWxsRWRpdG9yW10gY29sdW1uRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW3QuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCWNvbHVtbkVkaXRvcnNbMV0gPSBuZXcgVGV4dENlbGxFZGl0b3IodCk7Ci0KLQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY29sdW1uRWRpdG9ycyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlCdXR0b24gc2VsZWN0Tm90SW5Xb3Jrc3BhY2UgPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdE5vdEluV29ya3NwYWNlLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8zIikpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCXNlbGVjdE5vdEluV29ya3NwYWNlLnNldExheW91dERhdGEoZ2QpOwotCQlzZWxlY3ROb3RJbldvcmtzcGFjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QpOwotCQkJCUxpc3Qgc2VsZWN0ZWRMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNUKTsKLQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbmV3TGlzdC5hZGRBbGwoc2VsZWN0ZWRMaXN0KTsKLQkJCQlJRGF0YU1vZGVsIGltcG9ydERNID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJaW1wb3J0RE0gPSAoSURhdGFNb2RlbCkgbGlzdC5nZXQoaSk7Ci0JCQkJCWlmICghbmV3TGlzdC5jb250YWlucyhpbXBvcnRETSkgJiYgISgoSVZpcnR1YWxDb21wb25lbnQpIGltcG9ydERNLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpKS5leGlzdHMoKSkgewotCQkJCQkJbmV3TGlzdC5hZGQoaW1wb3J0RE0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNULCBuZXdMaXN0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9TRUxFQ1RfQUxMX1VUSUxfQlVUVE9OKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BTExfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW5ld0xpc3QuYWRkQWxsKGxpc3QpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNULCBuZXdMaXN0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfREVTRUxFQ1RfQUxMX1VUSUxfQlVUVE9OKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QsIG5ld0xpc3QpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVCkpIHsKLQkJCXVwZGF0ZUdVSUNoZWNrU2VsZWN0aW9uKCk7Ci0JCX0KLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTGlzdFZpZXdlcklucHV0KCkgewotCQlUYWJsZU9iamVjdHMgZmlsZXMgPSBuZXcgVGFibGVPYmplY3RzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gKChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BTExfUFJPSkVDVF9NT0RFTFNfTElTVCkpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWZpbGVzLnRhYmxlT2JqZWN0c0xpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0SW5wdXQoZmlsZXMpOwotCQl1cGRhdGVHVUlDaGVja1NlbGVjdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHVUlDaGVja1NlbGVjdGlvbigpIHsKLQkJTGlzdCBzZWxlY3RlZExpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QpOwotCQlMaXN0IHByb2plY3RMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTF9QUk9KRUNUX01PREVMU19MSVNUKTsKLQkJT2JqZWN0IGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TGlzdC5zaXplKCk7IGkrKykgewotCQkJY3VycmVudEVsZW1lbnQgPSBwcm9qZWN0TGlzdC5nZXQoaSk7Ci0JCQllYXJGaWxlTGlzdFZpZXdlci5zZXRDaGVja2VkKGN1cnJlbnRFbGVtZW50LCBzZWxlY3RlZExpc3QuY29udGFpbnMoY3VycmVudEVsZW1lbnQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwud2l6YXJkLkoyRUVXaXphcmRQYWdlI2VudGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJc3VwZXIuZW50ZXIoKTsKLQkJc2V0RmlsZUxpc3RWaWV3ZXJJbnB1dCgpOwotCQl2YWxpZGF0ZVBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBpbXBvcnQgc291cmNlIHNwZWNpZmljYXRpb24gd2lkZ2V0cy4gPGI+U3ViY2xhc3NlcyA8L2I+IG11c3Qgb3ZlcnJpZGUgdGhpcyBob29rCi0JICogbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBvZiB0aGlzIGdyb3VwJ3MKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgdmlzdWFsIGNvbXBvbmVudHMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBsaXN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGlzdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlsaXN0R3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZWFyRmlsZUxpc3RWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChsaXN0R3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEVBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIoKTsKLQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0JCWVhckZpbGVMaXN0Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJRGF0YU1vZGVsIG1hdGNoaW5nTW9kZWwgPSBudWxsOy8vIGdldEVBUkltcG9ydERhdGFNb2RlbCgpLmdldE1hdGNoaW5nRUpCSmFyT3JDbGllbnQoYU1vZGVsKTsKLQkJCQlpZiAobnVsbCAhPSBtYXRjaGluZ01vZGVsKSB7Ci0JCQkJCWVhckZpbGVMaXN0Vmlld2VyLnNldENoZWNrZWQobWF0Y2hpbmdNb2RlbCwgZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGVhckZpbGVMaXN0Vmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKSk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QsIHJlc3VsdCk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJVGFibGUgZWFyRmlsZUxpc3RUYWJsZSA9IChUYWJsZSkgZWFyRmlsZUxpc3RWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCQllYXJGaWxlTGlzdFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCWVhckZpbGVMaXN0VGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkvLyBzZXQgdXAgdGFibGUgbGF5b3V0Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIHRydWUpKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJZWFyRmlsZUxpc3RUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlnZC53aWR0aEhpbnQgPSA0MDA7Ci0JCWVhckZpbGVMaXN0VGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQotCQlUYWJsZUNvbHVtbiBmaWxlTmFtZUNvbHVtbnMgPSBuZXcgVGFibGVDb2x1bW4oZWFyRmlsZUxpc3RUYWJsZSwgU1dULk5PTkUpOwotCQlmaWxlTmFtZUNvbHVtbnMuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX01vZHVsZXNfaW5fRUFSKSk7IC8vJE5PTi1OTFMtMSQgPSAiTW9kdWxlcyBpbiBFQVIiCi0JCWZpbGVOYW1lQ29sdW1ucy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gaW1wb3J0TmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihlYXJGaWxlTGlzdFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWltcG9ydE5hbWVDb2x1bW4uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX05ld19Qcm9qZWN0X05hbWUpKTsgLy8kTk9OLU5MUy0xJCA9ICJOZXcgUHJvamVjdCBOYW1lIgotCQlpbXBvcnROYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzID0gbmV3IFN0cmluZ1syXTsKLQkJY29sdW1uUHJvcGVydGllc1swXSA9IEZJTEVfQ09MVU1OOwotCQljb2x1bW5Qcm9wZXJ0aWVzWzFdID0gUFJPSkVDVF9DT0xVTU47Ci0JCWVhckZpbGVMaXN0Vmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0KLQkJc2V0Q29sdW1uRWRpdG9ycygpOwotCQllYXJGaWxlTGlzdFZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IElDZWxsTW9kaWZpZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBQUk9KRUNUX0NPTFVNTi5lcXVhbHMocHJvcGVydHkpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGVhckZpbGVMaXN0Vmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1swXTsKLQkJCQlyZXR1cm4gaXRlbS5nZXRUZXh0KDEpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJVGFibGVJdGVtIGVsZW1lbnRIb2xkZXIgPSAoVGFibGVJdGVtKSBlbGVtZW50OwotCQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoUFJPSkVDVF9DT0xVTU4pKSB7Ci0JCQkJCWVsZW1lbnRIb2xkZXIuc2V0VGV4dCgxLCAoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCSgoSURhdGFNb2RlbCkgZWxlbWVudEhvbGRlci5nZXREYXRhKCkpLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCQkvLyBUaGlzIHBhZ2UgZG9lc24ndCBpbXBsZW1lbnQuLi4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJLy8gVGhpcyBwYWdlIGRvZXNuJ3QgaW1wbGVtZW50Li4uCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNUfTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZDlhYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS83LzIwMDEgMTE6Mzk6MTEgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEVBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4gVGhlIHJlc3VsdCBpcyBub3QKLQkgKiBtb2RpZmllZCBieSB0aGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dEVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBpbnB1dCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZU9iamVjdHMpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gKChUYWJsZU9iamVjdHMpIGlucHV0RWxlbWVudCkuZ2V0VGFibGVPYmplY3RzKCkudG9BcnJheSgpOwotCQkJQXJyYXlzLnNvcnQoYXJyYXksIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlyZXR1cm4gZ2V0Q29sdW1uVGV4dChvMSwgMCkuY29tcGFyZVRvKGdldENvbHVtblRleHQobzIsIDApKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsgLy8gc2hvdWxkIHRocm93IGV4Y2VwdGlvbiBpbnN0ZWFkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgaW1hZ2UgZm9yIHRoZSBnaXZlbiBjb2x1bW4gb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgcm93LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgbm8KLQkgKiAgICAgICAgICAgIGlucHV0IG9iamVjdCBpcyBzZXQgaW4gdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqICAgICAgICAgICAgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB3aGljaCB0aGUgbGFiZWwgYXBwZWFycwotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgZ2l2ZW4gY29sdW1uIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW50aXJlIHJvdywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IG5vCi0JICogICAgICAgICAgICBpbnB1dCBvYmplY3QgaXMgc2V0IGluIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2ggdGhlIGxhYmVsIGFwcGVhcnMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBlbGVtZW50OwotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJcmV0dXJuICgoQXJjaGl2ZSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKSkuZ2V0VVJJKCk7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRpc3Bvc2UKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUlZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyYzZhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUlZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5jb21wb25lbnRjb3JlLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uVUlFYXJWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5PbmVWYWxpZGF0b3JPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRUFSVmFsaWRhdGlvbkhlbHBlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRUFSVmFsaWRhdGlvbkhlbHBlci4KLQkgKi8KLQlwcml2YXRlIEVBUlZhbGlkYXRpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBydW5uYWJsZSB2YWxpZGF0aW9uIG9wZXJhdGlvbnMgZm9yIGFsbCBFQVIgcHJvamVjdHMgd2hpY2ggaGF2ZSBhdXRvIHZhbGlkYXRlCi0JICogZW5hYmxlZCwgYW5kIGFyZSBpbXBhY3RlZCBieSB0aGUgbGlzdCBvZiBwcm9qZWN0czsgSWYgdGhlIGVhciBwcm9qZWN0IGl0c2VsZiBpcyBpbiB0aGUgbGlzdCwKLQkgKiB0aGVuIGl0IGlzIHNraXBwZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3NbXSBnZXRFQVJWYWxpZGF0aW9uT3BlcmF0aW9ucyhMaXN0IG1vZGlmaWVkUHJvamVjdHMpIHsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSBlYXJDb21wcyA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRBbGxDb21wb25lbnRzSW5Xb3Jrc3BhY2VPZlR5cGUoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSk7Ci0JCUxpc3QgZWFyUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxlYXJDb21wcy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IGVhckNvbXBzW2ldLmdldFByb2plY3QoKTsKLQkJCWlmICghZWFyUHJvamVjdHMuY29udGFpbnMoZWFyUHJvamVjdCkpCi0JCQkJZWFyUHJvamVjdHMuYWRkKGVhclByb2plY3QpOwotCQl9Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChlYXJQcm9qZWN0cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUHJvamVjdCBlYXJQcm9qID0gKElQcm9qZWN0KSBlYXJQcm9qZWN0cy5nZXQoaSk7Ci0JCQlpZiAod2lsbEVBUlByb2plY3ROZWVkVmFsaWRhdGlvbihlYXJQcm9qLCBtb2RpZmllZFByb2plY3RzKSkgewotCQkJCXJlc3VsdC5hZGQoY3JlYXRlVmFsaWRhdGlvblJ1bm5hYmxlKGVhclByb2opKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElSdW5uYWJsZVdpdGhQcm9ncmVzc1tdKSByZXN1bHQudG9BcnJheShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHJ1bm5hYmxlIHZhbGlkYXRpb24gb3BlcmF0aW9ucyBmb3IgYWxsIEVBUiBwcm9qZWN0cyB3aGljaCBoYXZlIGF1dG8gdmFsaWRhdGUKLQkgKiBlbmFibGVkLCBhbmQgYXJlIGltcGFjdGVkIGJ5IHRoZSBqMmVlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzc1tdIGdldEVBUlZhbGlkYXRpb25PcGVyYXRpb25zKElQcm9qZWN0IG1vZGlmaWVkSjJFRVByb2plY3QpIHsKLQkJcmV0dXJuIGdldEVBUlZhbGlkYXRpb25PcGVyYXRpb25zKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobW9kaWZpZWRKMkVFUHJvamVjdCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VBUlZhbGlkYXRpb25BdXRvRW5hYmxlZChJUHJvamVjdCBlYXJQcm9qKSB7Ci0JCXJldHVybiBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0F1dG9WYWxpZGF0ZShlYXJQcm9qKSAmJiBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0VuYWJsZWQoZWFyUHJvaiwgVUlFYXJWYWxpZGF0b3IuVkFMSURBVE9SX0lEKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHdpbGxFQVJQcm9qZWN0TmVlZFZhbGlkYXRpb24oSVByb2plY3QgZWFyUHJvaiwgTGlzdCBtb2RpZmllZFByb2plY3RzKSB7Ci0JCWlmIChtb2RpZmllZFByb2plY3RzLmNvbnRhaW5zKGVhclByb2opIHx8ICFpc0VBUlZhbGlkYXRpb25BdXRvRW5hYmxlZChlYXJQcm9qKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy9UT0RPIG1pZ3JhdGUgdG8gdXNlIGFydGlmYWN0IGVkaXRzIGFuZCBjb21wb25lbnRzCi0vLwkJT2JqZWN0IGFjY2Vzc29yS2V5ID0gbmV3IE9iamVjdCgpOwotLy8JCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQoYWNjZXNzb3JLZXkpOwotLy8JCXRyeSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kaWZpZWRQcm9qZWN0cy5zaXplKCk7IGkrKykgewotLy8JCQkJaWYgKGVkaXRNb2RlbC5oYXNNYXBwaW5nVG9Qcm9qZWN0KChJUHJvamVjdCkgbW9kaWZpZWRQcm9qZWN0cy5nZXQoaSkpKQotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKQotLy8JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3MoYWNjZXNzb3JLZXkpOwotLy8JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHdoaWNoIHJ1bnMgYSBvbmUgdmFsaWRhdG9yIG9wZXJhdGlvbiBvbiB0aGUgRUFSIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBjcmVhdGVWYWxpZGF0aW9uUnVubmFibGUoSVByb2plY3QgZWFyUHJvaikgewotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGVhclByb2osIFVJRWFyVmFsaWRhdG9yLlZBTElEQVRPUl9JRCwgdHJ1ZSwgZmFsc2UpOwotCi0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKG9wKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0ZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0ZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTZiN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9GbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxNCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiwgSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7IAotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBtYWluIHBhZ2Ugb2YgdGhlIFdpemFyZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9QRyA9ICJtYWluIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IEZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSB3aXphcmQgd2l0aCBubyBjb25maWd1cmF0aW9uIGRhdGEsIG5vIHNlbGVjdGlvbiwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGRhdGEgbW9kZWwuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIHRvIGNvbGxlY3QgZGF0YSBmcm9tIHRoZSB1c2VyLiBUaGUgbW9kZWwKLQkgKiB3aWxsIGV2ZW50dWFsbHkgYmUgdXNlZCB0byBydW4gdGhlIG9wZXJhdGlvbiwgaWYgdGhlIHVzZXIgZG9lcyBub3QgY2FuY2VsIHRoZSBXaXphcmQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgdXNlZCB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgV1RQIE9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRkxFWElCTEVfUFJPSkVDVF9XSVpfVElUTEUpKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX1dJWl9CQU5ORVIpKTsKLSAgICAgICAgc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIHNlbGVjdGlvbiBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB2YWx1ZXMgaW4gdGhlIFdpemFyZCBkaWFsb2cgY29udHJvbHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBwYXJlbnQgb2YgdGhlIHdpemFyZAotCSAqIEBwYXJhbSBhU2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIHZpZXcgdXNlZCB0byBzdGFydCB0aGUgd2l6YXJkIChpZiBhbnkpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJdGhpcy5zZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiA8cD4KLQkgKiBUaGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlzIHNhdmVkIHRvIHVzZSB3aGVuIHRoZSB3aXphcmQgY29tcGxldGVzIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUKLQkgKiBjdXJyZW50IHBlcnNwZWN0aXZlIHVzaW5nIGVpdGhlciAoMSkgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB7QGxpbmsgI2dldEZpbmFsUGVyc3BlY3RpdmVJRCgpfQotCSAqIG9yICgyKSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBmaW5hbFBlcnNwZWN0aXZlIGF0dHJpYnV0ZSBpbiB0aGUgV2l6YXJkJ3MgY29uZmlndXJhdGlvbgotCSAqIGVsZW1lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nIGFQcm9wZXJ0eU5hbWUsIE9iamVjdCB0aGVEYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNvbmZpZ3VyYXRpb25FbGVtZW50ID0gYUNvbmZpZ3VyYXRpb25FbGVtZW50OwotLy8JCWRvU2V0SW5pdGlhbGl6ZURhdGEoYUNvbmZpZ3VyYXRpb25FbGVtZW50LCBhUHJvcGVydHlOYW1lLCB0aGVEYXRhKTsKLQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB7QGxpbmsgI2dldFdpemFyZElkKCl9Ci0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW4gaWQgY29tcG9uZW50IHVzZWQgZm9yIEFjdGl2aXR5IGZpbHRlcmluZy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldExvY2FsSWQoKSB7Ci0JCXJldHVybiBnZXRXaXphcmRJRCgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IEZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRykpOwotCX0KLQotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0ZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzMwNzQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE0LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIGltcGxlbWVudHMgSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNXaW5kb3dzID0gU1dULmdldFBsYXRmb3JtKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJ3aW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIE5ld0ZsZXhpYmxlUHJvamVjdEdyb3VwIHByb2plY3ROYW1lR3JvdXA7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZHZhbmNlZENvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkdmFuY2VkQnV0dG9uOwotCXByb3RlY3RlZCBib29sZWFuIHNob3dBZHZhbmNlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBBZHZhbmNlZFNpemVDb250cm9sbGVyIGFkdmFuY2VkQ29udHJvbGxlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZHZhbmNlZENvbnRyb2xzQnVpbHQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgQ29tYm8gc2VydmVyVGFyZ2V0Q29tYm87Ci0KLQlwcml2YXRlIGNsYXNzIEFkdmFuY2VkU2l6ZUNvbnRyb2xsZXIgaW1wbGVtZW50cyBDb250cm9sTGlzdGVuZXIgewotCQlwcml2YXRlIGludCBhZHZhbmNlZEhlaWdodCA9IC0xOwotCQlwcml2YXRlIFBvaW50IG9yaWdpbmFsU2l6ZTsKLQkJcHJpdmF0ZSBib29sZWFuIGlnbm9yZVNoZWxsUmVzaXplID0gZmFsc2U7Ci0KLQkJcHJpdmF0ZSBBZHZhbmNlZFNpemVDb250cm9sbGVyKFNoZWxsIGFTaGVsbCkgewotCQkJb3JpZ2luYWxTaXplID0gYVNoZWxsLmdldFNpemUoKTsKLQkJCWFTaGVsbC5hZGRDb250cm9sTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCS8vZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCWlmICghaWdub3JlU2hlbGxSZXNpemUpIHsKLQkJCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgZS5nZXRTb3VyY2UoKTsKLQkJCQlpZiAoY29udHJvbC5pc1Zpc2libGUoKSkgewotCQkJCQlvcmlnaW5hbFNpemUgPSBjb250cm9sLmdldFNpemUoKTsKLQkJCQkJaWYgKGFkdmFuY2VkSGVpZ2h0ID09IC0xKQotCQkJCQkJc2V0U2hlbGxTaXplRm9yQWR2YW5jZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCByZXNldE9yaWdpbmFsU2hlbGxTaXplKCkgewotCQkJc2V0U2hlbGxTaXplKG9yaWdpbmFsU2l6ZS54LCBvcmlnaW5hbFNpemUueSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0U2hlbGxTaXplKGludCB4LCBpbnQgeSkgewotCQkJaWdub3JlU2hlbGxSZXNpemUgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlnZXRTaGVsbCgpLnNldFNpemUoeCwgeSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlnbm9yZVNoZWxsUmVzaXplID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRTaGVsbFNpemVGb3JBZHZhbmNlZCgpIHsKLQkJCWludCBoZWlnaHQgPSBjYWxjdWxhdGVBZHZhbmNlZFNoZWxsSGVpZ2h0KCk7Ci0JCQlpZiAoaGVpZ2h0ICE9IC0xKQotCQkJCXNldFNoZWxsU2l6ZShnZXRTaGVsbCgpLmdldFNpemUoKS54LCBoZWlnaHQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgY2FsY3VsYXRlQWR2YW5jZWRTaGVsbEhlaWdodCgpIHsKLQkJCVBvaW50IGFkdmFuY2VkQ29tcFNpemUgPSBhZHZhbmNlZENvbXBvc2l0ZS5nZXRTaXplKCk7Ci0JCQlpZiAoYWR2YW5jZWRDb21wU2l6ZS54ID09IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJaW50IGhlaWdodCA9IGNvbXB1dGVBZHZhbmNlZEhlaWdodCgpOwotCQkJaWYgKCFzaG93QWR2YW5jZWQgJiYgaGVpZ2h0ICE9IC0xKQotCQkJCWhlaWdodCA9IGhlaWdodCAtIGFkdmFuY2VkQ29tcG9zaXRlLmdldFNpemUoKS55OwotCQkJcmV0dXJuIGhlaWdodDsKLQkJfQotCi0JCS8qCi0JCSAqIENvbXB1dGUgdGhlIGhlaWdodCB3aXRoIHRoZSBhZHZhbmNlZCBzZWN0aW9uIHNob3dpbmcuIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgaW50IGNvbXB1dGVBZHZhbmNlZEhlaWdodCgpIHsKLQkJCWlmIChhZHZhbmNlZEhlaWdodCA9PSAtMSkgewotCQkJCVBvaW50IGNvbnRyb2xTaXplID0gZ2V0Q29udHJvbCgpLmdldFNpemUoKTsKLQkJCQlpZiAoY29udHJvbFNpemUueCAhPSAwKSB7Ci0JCQkJCWludCBtaW5IZWlnaHQgPSBvcmlnaW5hbFNpemUueSAtIGNvbnRyb2xTaXplLnk7Ci0JCQkJCVBvaW50IHBhZ2VTaXplID0gZ2V0Q29udHJvbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJCWFkdmFuY2VkSGVpZ2h0ID0gcGFnZVNpemUueSArIG1pbkhlaWdodDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gYWR2YW5jZWRIZWlnaHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5GTEVYSUJMRV9QUk9KRUNUX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRkxFWElCTEVfUFJPSkVDVF9NQUlOX1BHX0RFU0MpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFUHJvamVjdENyZWF0aW9uUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfRUFSX1dJWkFSRF9QMSk7Ci0JCUNvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQl0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl0b3Auc2V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljcmVhdGVQcm9qZWN0TmFtZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCUNvbXBvc2l0ZSBkZXRhaWwgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotCQlkZXRhaWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkZXRhaWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJY3JlYXRlQWR2YW5jZWRDb21wb3NpdGUoZGV0YWlsKTsKLQkJcmV0dXJuIHRvcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcHJvamVjdE5hbWVHcm91cCA9IG5ldyBOZXdGbGV4aWJsZVByb2plY3RHcm91cChwYXJlbnQsIFNXVC5OVUxMLCBtb2RlbCwgc3luY2hIZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUFkdmFuY2VkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYWR2YW5jZWRDb250cm9sc0J1aWx0ID0gdHJ1ZTsKLQkJYWR2YW5jZWRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlRPR0dMRSk7Ci0JCXNldEFkdmFuY2VkTGFiZWxUZXh0KCk7Ci0JCWZpbmFsIEN1cnNvciBoYW5kID0gbmV3IEN1cnNvcihhZHZhbmNlZEJ1dHRvbi5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfSEFORCk7Ci0JCWFkdmFuY2VkQnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQloYW5kLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWFkdmFuY2VkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0b2dnbGVBZHZhbmNlZCh0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCWFkdmFuY2VkQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUhvdmVyLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC50eXBlID09IFNXVC5Nb3VzZUhvdmVyKQotCQkJCQlhZHZhbmNlZEJ1dHRvbi5zZXRDdXJzb3IoaGFuZCk7Ci0JCQl9Ci0JCX0pOwotCQlhZHZhbmNlZENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCS8vdG9nZ2xlQWR2YW5jZWQoZmFsc2UpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlhZHZhbmNlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlhZHZhbmNlZENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYWRkVG9BZHZhbmNlZENvbXBvc2l0ZShhZHZhbmNlZENvbXBvc2l0ZSk7Ci0JCXJldHVybiBhZHZhbmNlZENvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWR2YW5jZWRMYWJlbAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBZHZhbmNlZExhYmVsVGV4dCgpIHsKLQkJaWYgKGFkdmFuY2VkQ29udHJvbHNCdWlsdCkgewotCQkJaWYgKHNob3dBZHZhbmNlZCkKLQkJCQlhZHZhbmNlZEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFUHJvamVjdENyZWF0aW9uUGFnZV9VSV8wIikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYWR2YW5jZWRCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVByb2plY3RDcmVhdGlvblBhZ2VfVUlfMSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkdmFuY2VkTGFiZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGVBZHZhbmNlZChib29sZWFuIHNldFNpemUpIHsKLQkJaWYgKGFkdmFuY2VkQ29udHJvbHNCdWlsdCkgewotCQkJc2hvd0FkdmFuY2VkID0gIXNob3dBZHZhbmNlZDsKLQkJCWFkdmFuY2VkQ29tcG9zaXRlLnNldFZpc2libGUoc2hvd0FkdmFuY2VkKTsKLQkJCXNldEFkdmFuY2VkTGFiZWxUZXh0KCk7Ci0JCQlpZiAoc2V0U2l6ZSAmJiBpc1dpbmRvd3MpCi0JCQkJYWR2YW5jZWRDb250cm9sbGVyLnNldFNoZWxsU2l6ZUZvckFkdmFuY2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNlbnRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCWlmIChhZHZhbmNlZENvbnRyb2xzQnVpbHQpIHsKLQkJCWlmIChpc0ZpcnN0VGltZVRvUGFnZSkKLQkJCQlpbml0aWFsaXplQWR2YW5jZWRDb250cm9sbGVyKCk7Ci0JCQlpZiAoaXNXaW5kb3dzKSB7Ci0JCQkJYWR2YW5jZWRDb250cm9sbGVyLnNldFNoZWxsU2l6ZUZvckFkdmFuY2VkKCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZW50ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkQ29udHJvbGxlcigpIHsKLQkJYWR2YW5jZWRDb250cm9sbGVyID0gbmV3IEFkdmFuY2VkU2l6ZUNvbnRyb2xsZXIoZ2V0U2hlbGwoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZXhpdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhpdCgpIHsKLQkJaWYgKGFkdmFuY2VkQ29udHJvbHNCdWlsdCAmJiBpc1dpbmRvd3MpIHsKLQkJCWFkdmFuY2VkQ29udHJvbGxlci5yZXNldE9yaWdpbmFsU2hlbGxTaXplKCk7Ci0JCX0KLQkJc3VwZXIuZXhpdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlRBUkdFVF9SVU5USU1FX0xCTCkpOwotCQlzZXJ2ZXJUYXJnZXRDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc2VydmVyVGFyZ2V0Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUJ1dHRvbiBuZXdTZXJ2ZXJUYXJnZXRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQluZXdTZXJ2ZXJUYXJnZXRCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ORVdfVEhSRUVfRE9UU19FKSk7Ci0JCW5ld1NlcnZlclRhcmdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UubGF1bmNoTmV3UnVudGltZVdpemFyZChnZXRTaGVsbCgpLCBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfU0VSVkVSX1RBUkdFVCkpOwotCQkJfQotCQl9KTsKLQkJQ29udHJvbFtdIGRlcHMgPSBuZXcgQ29udHJvbFtde2xhYmVsLCBuZXdTZXJ2ZXJUYXJnZXRCdXR0b259OwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHNlcnZlclRhcmdldENvbWJvLCBSVU5USU1FX1RBUkdFVF9JRCwgZGVwcyk7Ci0gICAgICAgIGlmKHNlcnZlclRhcmdldENvbWJvLmdldFZpc2libGVJdGVtQ291bnQoKSAhPSAwKQotICAgICAgICAgICAgc2VydmVyVGFyZ2V0Q29tYm8uc2VsZWN0KDApOwkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9BZHZhbmNlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5KMkVFV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgUFJPSkVDVF9MT0NBVElPTiwgUlVOVElNRV9UQVJHRVRfSUR9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBsYXVuY2hOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIHByZUFkZGl0aW9uRGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoUlVOVElNRV9UQVJHRVRfSUQpOwotCQlib29sZWFuIGlzT0sgPSBTZXJ2ZXJVSVV0aWwuc2hvd05ld1J1bnRpbWVXaXphcmQoc2hlbGwsICIiLCAiIik7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCWlmIChpc09LICYmIG1vZGVsICE9IG51bGwpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFJVTlRJTUVfVEFSR0VUX0lELCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gcG9zdEFkZGl0aW9uRGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoUlVOVElNRV9UQVJHRVRfSUQpOwotCQkJT2JqZWN0W10gcHJlQWRkaXRpb24gPSBuZXcgT2JqZWN0W3ByZUFkZGl0aW9uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlQWRkaXRpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQlwcmVBZGRpdGlvbltpXSA9IHByZUFkZGl0aW9uRGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpOwotCQkJfQotCQkJT2JqZWN0W10gcG9zdEFkZGl0aW9uID0gbmV3IE9iamVjdFtwb3N0QWRkaXRpb25EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3N0QWRkaXRpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQlwb3N0QWRkaXRpb25baV0gPSBwb3N0QWRkaXRpb25EZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCk7Ci0JCQl9Ci0JCQlPYmplY3QgbmV3QWRkaXRpb24gPSBQcm9qZWN0VXRpbGl0aWVzLmdldE5ld09iamVjdChwcmVBZGRpdGlvbiwgcG9zdEFkZGl0aW9uKTsKLQotICAgICAgICAgICAgbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUlVOVElNRV9UQVJHRVRfSUQsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQlpZiAobmV3QWRkaXRpb24gIT0gbnVsbCkKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FX1RBUkdFVF9JRCwgbmV3QWRkaXRpb24pOwotCQl9Ci0JCXJldHVybiBpc09LOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0ltcG9ydFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSW1wb3J0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2I3YWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSW1wb3J0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmxvY2Fsc3RvcmUuQ29yZUZpbGVTeXN0ZW1MaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotCi0KLS8qKgotICogQGF1dGhvciBTYWNoaW4KLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVBUkZJTEUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQkpBUkZJTEUgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUkZJTEUgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVEpBUkZJTEUgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBUkZJTEUgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9SVENMQVNTVFlQRSA9IDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSjJFRTE0ID0gMjU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEoyRUUxMyA9IDEyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKMkVFMTIgPSA2NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKMkVFU3BlYyA9IEoyRUUxMiArIEoyRUUxMyArIEoyRUUxNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVIgPSAiRUFSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQiA9ICJFSkIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSID0gIldFQiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVIgPSAiQ0xJRU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBUiA9ICJSQVIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVUZGSVhFUyA9IHsiIiwgRUFSLCBFSkIsIFdBUiwgSkFSLCBSQVIsICIifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRGaWxlVHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlhbkFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLQkJCQlpbnQgYXJjaGl2ZVR5cGUgPSBnZXRBcmNoaXZlVHlwZShhbkFyY2hpdmUpOwotCQkJCWlmIChhcmNoaXZlVHlwZSA9PSBVTktOT1dOICYmIGlzSW1wb3J0Q2xhc3NUeXBlKGZpbGVOYW1lKSkKLQkJCQkJcmV0dXJuIElNUE9SVENMQVNTVFlQRTsKLQkJCQlyZXR1cm4gYXJjaGl2ZVR5cGU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChpc0ltcG9ydENsYXNzVHlwZShmaWxlTmFtZSkpCi0JCQkJCXJldHVybiBJTVBPUlRDTEFTU1RZUEU7Ci0JCQkJcmV0dXJuIFVOS05PV047Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYW5BcmNoaXZlICE9IG51bGwgJiYgYW5BcmNoaXZlLmlzT3BlbigpKQotCQkJCWFuQXJjaGl2ZS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLy9UT0RPOiB1c2UgbmV3IGdldEoyRUVWZXJpb25zIHN3aXRjaCBzdGF0ZW1lbnRzCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmVyc2lvbmVkRmlsZVR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUFyY2hpdmUgYW5BcmNoaXZlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWludCBhcmNoaXZlVHlwZSA9IFVOS05PV047Ci0JCQl0cnkgewotCQkJCWFuQXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoZmlsZU5hbWUpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChhbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCQkJCWFyY2hpdmVUeXBlID0gRUpCSkFSRklMRTsKLQkJCQkJCUVKQkphciBlamJKYXIgPSAoKEVKQkphckZpbGUpIGFuQXJjaGl2ZSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQkJCWlmIChlamJKYXIuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTI7Ci0JCQkJCQllbHNlIGlmIChlamJKYXIuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTM7Ci0JCQkJCQllbHNlIGlmIChlamJKYXIuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTQ7Ci0JCQkJCX0gZWxzZSBpZiAoYW5BcmNoaXZlLmlzV0FSRmlsZSgpKSB7Ci0JCQkJCQlhcmNoaXZlVHlwZSA9IFdBUkZJTEU7Ci0JCQkJCQlXZWJBcHAgd2FyID0gKChXQVJGaWxlKSBhbkFyY2hpdmUpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCQlpZiAod2FyLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTEyOwotCQkJCQkJZWxzZSBpZiAod2FyLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTEzOwotCQkJCQkJZWxzZSBpZiAod2FyLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTE0OwotCQkJCQl9IGVsc2UgaWYgKGFuQXJjaGl2ZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKSB7Ci0JCQkJCQlhcmNoaXZlVHlwZSA9IENMSUVOVEpBUkZJTEU7Ci0JCQkJCQlBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnQgPSAoKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSkgYW5BcmNoaXZlKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCQkJaWYgKGFwcENsaWVudC5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTI7Ci0JCQkJCQllbHNlIGlmIChhcHBDbGllbnQuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTEzOwotCQkJCQkJZWxzZSBpZiAoYXBwQ2xpZW50LmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxNDsKLQkJCQkJfSBlbHNlIGlmIChhbkFyY2hpdmUuaXNSQVJGaWxlKCkpIHsKLQkJCQkJCWFyY2hpdmVUeXBlID0gUkFSRklMRSB8IEoyRUUxMzsKLQkJCQkJfSBlbHNlIGlmIChhbkFyY2hpdmUuaXNFQVJGaWxlKCkpIHsKLQkJCQkJCWFyY2hpdmVUeXBlID0gRUFSRklMRTsKLQkJCQkJCUFwcGxpY2F0aW9uIGFwcCA9ICgoRUFSRmlsZSkgYW5BcmNoaXZlKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCQkJaWYgKGFwcC5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTI7Ci0JCQkJCQllbHNlIGlmIChhcHAuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTEzOwotCQkJCQkJZWxzZSBpZiAoYXBwLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxNDsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCQlpZiAoYXJjaGl2ZVR5cGUgPT0gVU5LTk9XTiAmJiBpc0ltcG9ydENsYXNzVHlwZShmaWxlTmFtZSkpCi0JCQkJYXJjaGl2ZVR5cGUgPSBJTVBPUlRDTEFTU1RZUEU7Ci0JCQlyZXR1cm4gYXJjaGl2ZVR5cGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYW5BcmNoaXZlICE9IG51bGwgJiYgYW5BcmNoaXZlLmlzT3BlbigpKQotCQkJCWFuQXJjaGl2ZS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJjaGl2ZVR5cGUoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJaW50IHR5cGUgPSBVTktOT1dOOwotCQl0cnkgewotCQkJaWYgKGFuQXJjaGl2ZS5pc0VKQkphckZpbGUoKSkKLQkJCQl0eXBlID0gRUpCSkFSRklMRTsKLQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc1dBUkZpbGUoKSkKLQkJCQl0eXBlID0gV0FSRklMRTsKLQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKQotCQkJCXR5cGUgPSBDTElFTlRKQVJGSUxFOwotCQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzUkFSRmlsZSgpKQotCQkJCXR5cGUgPSBSQVJGSUxFOwotCQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzRUFSRmlsZSgpKQotCQkJCXR5cGUgPSBFQVJGSUxFOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbXBvcnRDbGFzc1R5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZSk7Ci0JCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJqYXIiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJCQlmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInppcCIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeyAvL2Rpc2FibGUvZW5hYmxlIGRyYWcvZHJvcCBkaXJlY3RvcmllcwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlbnNpb24oRmlsZSBmKSB7Ci0JCVN0cmluZyBleHQgPSBudWxsOwotCQlTdHJpbmcgcyA9IGYuZ2V0TmFtZSgpOwotCQlpbnQgaSA9IHMubGFzdEluZGV4T2YoJy4nKTsKLQotCQlpZiAoaSA+IDAgJiYgaSA8IHMubGVuZ3RoKCkgLSAxKSB7Ci0JCQlleHQgPSBzLnN1YnN0cmluZyhpICsgMSkudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlyZXR1cm4gZXh0OwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZE1hdGNoaW5nUHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCWlmIChwcm9qZWN0TmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gSjJFRVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCQkJU3RyaW5nIGxvd2VyQ2FzZU5hbWUgPSBwcm9qZWN0TmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBwcm9qZWN0cyBhIGNvbXBhcmUgbG93ZXJjYXNlIG5hbWVzCi0JCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaWYgKHByb2plY3RzLmxlbmd0aCA9PSAxKQotCQkJCQlyZXR1cm4gcHJvamVjdHNbMF0uZ2V0TmFtZSgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwcm9qZWN0c1tpXS5leGlzdHMoKSkgewotCQkJCQlpZiAoQ29yZUZpbGVTeXN0ZW1MaWJyYXJ5LmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZiAocHJvamVjdHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpCi0JCQkJCQkJcmV0dXJuIHByb2plY3RzW2ldLmdldE5hbWUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChwcm9qZWN0c1tpXS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMobG93ZXJDYXNlTmFtZSkpCi0JCQkJCQkJcmV0dXJuIHByb2plY3RzW2ldLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotCi0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxZTMxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVBcnRpZmFjdENyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuRGVsZWdhdGVDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Jlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotLyoqCi0gKiA8cD4KLSAqIFNlcnZlcyBhcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBXaXphcmRzIHdoaWNoIGNyZWF0ZSBKMkVFIGFydGlmYWN0IHN0cnVjdHVyZXMuIEFuIEFydGlmYWN0IGNhbiBiZQotICogYSBKMkVFIGFwcGxpY2F0aW9uLCBtb2R1bGUsIG9yIHV0aWxpdHkgY29tcG9uZW50LgotICogPC9wPgotICogPHA+Ci0gKiBDcmVhdGlvbiB3aXphcmRzIG11c3QgZGVmaW5lIHRoZSBhYnN0cmFjdCBtZXRob2RzIGZyb20KLSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkuRXh0ZW5kYWJsZVdpemFyZH13aGljaCBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6Ci0gKiA8dWw+Ci0gKiA8bGk+IHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkuRXh0ZW5kYWJsZVdpemFyZCNkb0FkZFBhZ2VzKCl9Ci0gKiA8bGk+IHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkuRXh0ZW5kYWJsZVdpemFyZCNjYW5GaW5pc2goKX0KLSAqIDxsaT4ge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS5FeHRlbmRhYmxlV2l6YXJkI2NyZWF0ZUJhc2VPcGVyYXRpb24oKX0KLSAqIDxsaT57QGxpbmsgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb24ud2l6YXJkLmRhdGFtb2RlbC5XVFBXaXphcmQjY3JlYXRlRGVmYXVsdE1vZGVsKCl9Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBBbmQgb3B0aW9uYWxseSwgdGhleSBjYW4gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogPHVsPgotICogPGxpPntAbGluayAjZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCl9Ci0gKiA8bGk+e0BsaW5rICNkb0luaXQoKX0KLSAqIDxsaT57QGxpbmsgI2RvRGlzcG9zZSgpfQotICogPGxpPntAbGluayAjZG9TZXRJbml0aWFsaXplRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZywgT2JqZWN0KX0KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLkV4dGVuZGFibGVXaXphcmQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVBcnRpZmFjdENyZWF0aW9uV2l6YXJkIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCwgSUV4ZWN1dGFibGVFeHRlbnNpb24sIElQbHVnaW5Db250cmlidXRpb24gewotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBtYWluIHBhZ2Ugb2YgdGhlIFdpemFyZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9QRyA9ICJtYWluIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgd2l6YXJkIHdpdGggbm8gY29uZmlndXJhdGlvbiBkYXRhLCBubyBzZWxlY3Rpb24sIGFuZCBubwotCSAqIG9wZXJhdGlvbiBkYXRhIG1vZGVsLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIG1vZGVsIGlzIHVzZWQgdG8gcHJlcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCB0byBjb2xsZWN0IGRhdGEgZnJvbSB0aGUgdXNlci4gVGhlIG1vZGVsCi0JICogd2lsbCBldmVudHVhbGx5IGJlIHVzZWQgdG8gcnVuIHRoZSBvcGVyYXRpb24sIGlmIHRoZSB1c2VyIGRvZXMgbm90IGNhbmNlbCB0aGUgV2l6YXJkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHVzZWQgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIFdUUCBPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgc2VsZWN0aW9uIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHZhbHVlcyBpbiB0aGUgV2l6YXJkIGRpYWxvZyBjb250cm9scy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICogCi0JICogQHBhcmFtIHdvcmtiZW5jaAotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgd29ya2JlbmNoIHBhcmVudCBvZiB0aGUgd2l6YXJkCi0JICogQHBhcmFtIGFTZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgdmlldyB1c2VkIHRvIHN0YXJ0IHRoZSB3aXphcmQgKGlmIGFueSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQl0aGlzLnNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCWRvSW5pdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENhbGxzIHtAbGluayAjZG9EaXNwb3NlKCl9YW5kIHRoZW4gbnVsbHMgb3V0IGZpZWxkcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkIG9uY2UgdGhlCi0JICogd2l6YXJkIGNvbXBsZXRlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1vbi53aXphcmQuZGF0YW1vZGVsLldUUFdpemFyZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWRvRGlzcG9zZSgpOwotCQl0aGlzLnNlbGVjdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgc2F2ZWQgdG8gdXNlIHdoZW4gdGhlIHdpemFyZCBjb21wbGV0ZXMgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZQotCSAqIGN1cnJlbnQgcGVyc3BlY3RpdmUgdXNpbmcgZWl0aGVyICgxKSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHtAbGluayAjZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCl9Ci0JICogb3IgKDIpIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIGZpbmFsUGVyc3BlY3RpdmUgYXR0cmlidXRlIGluIHRoZSBXaXphcmQncyBjb25maWd1cmF0aW9uCi0JICogZWxlbWVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ3VyYXRpb25FbGVtZW50LCBTdHJpbmcgYVByb3BlcnR5TmFtZSwgT2JqZWN0IHRoZURhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY29uZmlndXJhdGlvbkVsZW1lbnQgPSBhQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCWRvU2V0SW5pdGlhbGl6ZURhdGEoYUNvbmZpZ3VyYXRpb25FbGVtZW50LCBhUHJvcGVydHlOYW1lLCB0aGVEYXRhKTsKLQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE92ZXJyaWRlIG1ldGhvZCBmb3IgY2xpZW50cyB0aGF0IHdpc2ggdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5Ci0JICoge0BzZWUgI3NldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZywgT2JqZWN0KX0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhQ29uZmlndXJhdGlvbkVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgcHJvdmlkZWQgZnJvbSB0aGUgdGVtcGxhdGVkIG1ldGhvZC4KLQkgKiBAcGFyYW0gYVByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IG5hbWUgcHJvdmlkZWQgZnJvbSB0aGUgdGVtcGxhdGVkIG1ldGhvZC4KLQkgKiBAcGFyYW0gdGhlRGF0YQotCSAqICAgICAgICAgICAgVGhlIGRhdGEgcHJvdmlkZWQgZnJvbSB0aGUgdGVtcGxhdGVkIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldEluaXRpYWxpemVEYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBhQ29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZyBhUHJvcGVydHlOYW1lLCBPYmplY3QgdGhlRGF0YSkgewotCQkvLyBEZWZhdWx0IGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbnZva2VkIGZyb20gaW5pdChJV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbikgb25jZSB0aGUgd29ya2JlbmNoIGFuZCBzZWxlY3Rpb24gaGF2ZQotCSAqIGJlZW4gc2FmZWx5IHN0b3JlZCBhd2F5LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOby1vcCBieSBkZWZhdWx0LgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCS8vIGluaXQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbnZva2VkIGZyb20ge0BsaW5rICNkaXNwb3NlKCl9LiBTaG91bGQgYmUgdXNlZCB0byBoYW5kbGUgYW55IHNwZWNpZmljIFdpemFyZCBkaXNwb3NhbC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQkvLyBkaXNwb3NlCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT3ZlcnJpZGUgdG8gcmV0dXJuIHRoZSBmaW5hbCBwZXJzcGVjdGl2ZSBJRCAoaWYgYW55KS4gVGhlIGZpbmFsIHBlcnNwZWN0aXZlIElEIGNhbiBiZQotCSAqIGhhcmRjb2RlZCBieSB0aGUgc3ViY2xhc3Mgb3IgZGV0ZXJtaW5lZCBwcm9ncmFtbWF0aWNhbGx5IChwb3NzaWJseSB1c2luZyB0aGUgdmFsdWUgb2YgYSBmaWVsZAotCSAqIG9uIHRoZSBXaXphcmQncyBXVFAgT3BlcmF0aW9uIERhdGEgTW9kZWwpLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBEZWZhdWx0IHJldHVybiB2YWx1ZSBpcyA8Yj5udWxsIDwvYj4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgSUQgb2YgdGhlIFBlcnNwZWN0aXZlIHdoaWNoIGlzIHByZWZlcnJlZCBieSB0aGlzIHdpemFyZCB1cG9uIGNvbXBsZXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIDxwPgotCSAqIEludm9rZWQgYWZ0ZXIgdGhlIHVzZXIgaGFzIGNsaWNrZWQgdGhlICJGaW5pc2giIGJ1dHRvbiBvZiB0aGUgd2l6YXJkLiBUaGUgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHdpbGwgYXR0ZW1wdCB0byB1cGRhdGUgdGhlIGZpbmFsIHBlcnNwZWN0aXZlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkKLQkgKiB7QGxpbmsgI2dldEZpbmFsUGVyc3BlY3RpdmVJRCgpIH0KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZCNwb3N0UGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnBvc3RQZXJmb3JtRmluaXNoKCk7Ci0JCWlmIChnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSAhPSBudWxsICYmIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpLmxlbmd0aCgpID4gMCkgewotCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IG5ldyBEZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50KGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7Ci0JCQkJCWlmIChhTmFtZS5lcXVhbHMoImZpbmFsUGVyc3BlY3RpdmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShhTmFtZSk7Ci0JCQkJfQotCQkJfTsKLQkJCUJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkLnVwZGF0ZVBlcnNwZWN0aXZlKGVsZW1lbnQpOwotCQl9IGVsc2UKLQkJCUJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkLnVwZGF0ZVBlcnNwZWN0aXZlKGNvbmZpZ3VyYXRpb25FbGVtZW50KTsKLQkJU3RyaW5nIHByb2pOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpOwotCQlCYXNpY05ld1Jlc291cmNlV2l6YXJkLnNlbGVjdEFuZFJldmVhbChQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvak5hbWUpLCBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQl9Ci0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldERpYWxvZ1NldHRpbmdzKCkKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhdmVkIHNldHRpbmdzIGZyb20gdGhlIHByZXZpb3VzIHVzZSBvZiB0aGUgV2l6YXJkCi0JICovCi0JcHVibGljIGZpbmFsIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBjdXJyZW50IHZpZXcgdXNlZCB0byBzcGF3biB0aGUgd2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB7QGxpbmsgI2dldFdpemFyZElkKCl9Ci0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW4gaWQgY29tcG9uZW50IHVzZWQgZm9yIEFjdGl2aXR5IGZpbHRlcmluZy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldExvY2FsSWQoKSB7Ci0JCXJldHVybiBnZXRXaXphcmRJRCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGFuIGlkIGNvbXBvbmVudCB1c2VkIGZvciBBY3Rpdml0eSBmaWx0ZXJpbmcuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBQbHVnaW4gSUQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgc3BlY2lmaWVkIGluCi0JICoge0BzZWUgI3NldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZywgT2JqZWN0KX0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGx1Z2luIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdpemFyZAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgPyBjb25maWd1cmF0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Mjk3ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uQ29tbW9uRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci0KLS8qKgotICogPHA+Ci0gKiBTZXJ2ZXMgYXMgYSBiYXNlIGNsYXNzIGZvciBXaXphcmRzIHdoaWNoIGV4cG9ydCBKMkVFIGFydGlmYWN0IHN0cnVjdHVyZXMgZnJvbSBFY2xpcHNlIHByb2plY3RzCi0gKiBpbnRvIGEgZGVwbG95YWJsZSBmb3JtLgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgcHJvdmlkZSB0aGUgbWV0aG9kcyB0aGF0IGFyZSByZXF1aXJlZCBieQotICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uLndpemFyZC5kYXRhbW9kZWwuV1RQV2l6YXJkfS4KLSAqIDwvcD4KLSAqIDxwPgotICogT3B0aW9uYWxseSwgc3ViY2xhc3NlcyBtYXkgYWxzbyBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rICNkb0luaXQoKSgpfQotICogPGxpPntAbGluayAjZG9EaXNwb3NlKCkoKX0KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBiYXNlIGNsYXNzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIFdpemFyZCBpcyBub3Qgc3Bhd25lZCB1bmxlc3MgYWxsIG9wZW4gZWRpdG9ycyBhcmUgaW4gYQotICogbm9uLWRpcnR5IHN0YXRlLiBBZGRpdGlvbmFsbHksIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgYWN0aXZlIHZpZXcgd2hpY2ggc3BhbndlZCB0aGUgd2l6YXJkIHdpbGwKLSAqIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHN1YmNsYXNzZXMgdmlhIHtAbGluayAjZ2V0U2VsZWN0aW9uKCl9LgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0YW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBvZiB0aGUgbWFpbiBwYWdlIG9mIHRoZSBXaXphcmQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fUEcgPSAibWFpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiNjciKSk7Ly8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBKMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCI2NyIpKTsvLyROT04tTkxTLTEkIAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEludm9rZWQgZnJvbSBpbml0KElXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvbmNlIHRoZSB3b3JrYmVuY2ggYW5kIHNlbGVjdGlvbiBoYXZlCi0JICogYmVlbiBzYWZlbHkgc3RvcmVkIGF3YXkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vLW9wIGJ5IGRlZmF1bHQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKLQkJLy9pbml0Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogSW52b2tlZCBmcm9tIHtAbGluayAjZGlzcG9zZSgpfS4gU2hvdWxkIGJlIHVzZWQgdG8gaGFuZGxlIGFueSBzcGVjaWZpYyBXaXphcmQgZGlzcG9zYWwuCi0JICogPC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCBkb0Rpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBzZWxlY3Rpb24gaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgdmFsdWVzIGluIHRoZSBXaXphcmQgZGlhbG9nIGNvbnRyb2xzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKiAKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICogICAgICAgICAgICB0aGUgY3VycmVudCB3b3JrYmVuY2ggcGFyZW50IG9mIHRoZSB3aXphcmQKLQkgKiBAcGFyYW0gYVNlbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSB2aWV3IHVzZWQgdG8gc3RhcnQgdGhlIHdpemFyZCAoaWYgYW55KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FWFBPUlRfV0laX1RJVExFKSk7Ci0JCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotLy9UT0RPOiBlbmFibGUgc2VsZWN0aW9uIGRlZmF1bHRzCi0vLwkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0vLwkJCU9iamVjdCBlbGVtZW50ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotLy8JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVsZW1lbnQpOwotLy8JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0vLwkJCQlJRGF0YU1vZGVsIG0gPSBnZXREYXRhTW9kZWwoKTsKLS8vCQkJCU9iamVjdCBvcmlnaW5hbFByb2plY3ROYW1lID0gbS5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUpOwotLy8JCQkJbS5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJCWlmICghbS52YWxpZGF0ZVByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSkuaXNPSygpKSB7Ci0vLwkJCQkJbS5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsIG9yaWdpbmFsUHJvamVjdE5hbWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCQlkb0luaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDYWxscyB7QGxpbmsgI2RvRGlzcG9zZSgpfWFuZCB0aGVuIG51bGxzIG91dCBmaWVsZHMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBvbmNlIHRoZQotCSAqIHdpemFyZCBjb21wbGV0ZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb24ud2l6YXJkLmRhdGFtb2RlbC5XVFBXaXphcmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlkb0Rpc3Bvc2UoKTsKLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcmVQZXJmb3JtRmluaXNoKCkgewotCQlpZiAoIUNvbW1vbkVkaXRvclV0aWxpdHkucHJvbXB0VG9TYXZlQWxsRGlydHlFZGl0b3JzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoQ29tbW9uRWRpdG9yVXRpbGl0eS5nZXREaXJ0eUVkaXRvcnMoKS5sZW5ndGggIT0gMCkgeyAvLyBhbGwgY2hlY2tib3hlcyB3ZXJlIG5vdCBzZWxlY3RlZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5wcmVQZXJmb3JtRmluaXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50U2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSjJFRUV4cG9ydFBhZ2UgZ2V0TWFpblBhZ2UoKSB7Ci0JCXJldHVybiAoSjJFRUV4cG9ydFBhZ2UpIGdldFBhZ2UoTUFJTl9QRyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNTRhMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuRGVsZWdhdGVDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uQ29tbW9uRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci0KLS8qKgotICogPHA+Ci0gKiBTZXJ2ZXMgYXMgYSBiYXNlIGNsYXNzIGZvciBXaXphcmRzIHdoaWNoIGltcG9ydCBKMkVFIGFydGlmYWN0IHN0cnVjdHVyZXMgaW50byBFY2xpcHNlIHByb2plY3RzLgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgcHJvdmlkZSB0aGUgbWV0aG9kcyB0aGF0IGFyZSByZXF1aXJlZCBieQotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFdpemFyZH0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE9wdGlvbmFsbHksIHN1YmNsYXNzZXMgbWF5IGFsc28gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogPHVsPgotICogPGxpPntAbGluayAjZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCl9Ci0gKiA8bGk+e0BsaW5rICNkb0luaXQoKSgpfQotICogPGxpPntAbGluayAjZG9EaXNwb3NlKCkoKX0KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBiYXNlIGNsYXNzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIFdpemFyZCBpcyBub3Qgc3Bhd25lZCB1bmxlc3MgYWxsIG9wZW4gZWRpdG9ycyBhcmUgaW4gYQotICogbm9uLWRpcnR5IHN0YXRlLiBBZGRpdGlvbmFsbHksIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgYWN0aXZlIHZpZXcgd2hpY2ggc3BhbndlZCB0aGUgd2l6YXJkIHdpbGwKLSAqIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHN1YmNsYXNzZXMgdmlhIHtAbGluayAjZ2V0Q3VycmVudFNlbGVjdGlvbigpfS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVBcnRpZmFjdEltcG9ydFdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0YW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBvZiB0aGUgbWFpbiBwYWdlIG9mIHRoZSBXaXphcmQuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fUEcgPSAibWFpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiOyAvLyROT04tTkxTLTEkIAotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubwotCSAqIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEoyRUVBcnRpZmFjdEltcG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBKMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIHNlbGVjdGlvbiBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB2YWx1ZXMgaW4gdGhlIFdpemFyZCBkaWFsb2cgY29udHJvbHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBwYXJlbnQgb2YgdGhlIHdpemFyZAotCSAqIEBwYXJhbSBhU2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIHZpZXcgdXNlZCB0byBzdGFydCB0aGUgd2l6YXJkIChpZiBhbnkpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCWRvSW5pdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENhbGxzIHtAbGluayAjZG9EaXNwb3NlKCl9YW5kIHRoZW4gbnVsbHMgb3V0IGZpZWxkcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkIG9uY2UgdGhlCi0JICogd2l6YXJkIGNvbXBsZXRlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1vbi53aXphcmQuZGF0YW1vZGVsLldUUFdpemFyZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWRvRGlzcG9zZSgpOwotCQl0aGlzLnNlbGVjdGlvbiA9IG51bGw7Ci0JCXRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOwotCX0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogSW52b2tlZCBhZnRlciB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIHNhdmVkIG9mZiBpbgotCSAqIHtAbGluayAjaW5pdChJV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbil9LiBTaG91bGQgYmUgdXNlZCB0byBoYW5kbGUgYW55IHNwZWNpZmljCi0JICogV2l6YXJkIGluaXRpYWxpemF0aW9uLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCS8vIGluaXQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbnZva2VkIGZyb20ge0BsaW5rICNkaXNwb3NlKCl9LiBTaG91bGQgYmUgdXNlZCB0byBoYW5kbGUgYW55IHNwZWNpZmljIFdpemFyZCBkaXNwb3NhbC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQkvLyBkaXNwb3NlCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gc3VnZ2VzdCBhIGZpbmFsIHBlcnNwZWN0aXZlIHRvIHRoZSB1c2VyIG9uY2UKLQkgKiB0aGUgd2l6YXJkIGNvbXBsZXRlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBKMkVFIFBlcnBzZWN0aXZlIElEIGJ5IGRlZmF1bHQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLQkJcmV0dXJuIEZJTkFMX1BFUlNQRUNUSVZFX0lEOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2F2ZSBvcGVuLCBkaXJ0eSBlZGl0b3JzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgb25seSBpZiBhbGwgZWRpdG9ycyBhcmUgc2F2ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcmVQZXJmb3JtRmluaXNoKCkgewotCQlpZiAoIUNvbW1vbkVkaXRvclV0aWxpdHkucHJvbXB0VG9TYXZlQWxsRGlydHlFZGl0b3JzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoQ29tbW9uRWRpdG9yVXRpbGl0eS5nZXREaXJ0eUVkaXRvcnMoKS5sZW5ndGggIT0gMCkgeyAvLyBhbGwgY2hlY2tib3hlcyB3ZXJlIG5vdAotCQkJCQkJCQkJCQkJCQkJCQkvLyBzZWxlY3RlZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5wcmVQZXJmb3JtRmluaXNoKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogSW52b2tlZCBhZnRlciB0aGUgdXNlciBoYXMgY2xpY2tlZCB0aGUgIkZpbmlzaCIgYnV0dG9uIG9mIHRoZSB3aXphcmQuIFRoZSBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gd2lsbCBhdHRlbXB0IHRvIHVwZGF0ZSB0aGUgZmluYWwgcGVyc3BlY3RpdmUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieQotCSAqIHtAbGluayAjZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgfQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkI3Bvc3RQZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwb3N0UGVyZm9ybUZpbmlzaCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIucG9zdFBlcmZvcm1GaW5pc2goKTsKLQkJaWYgKGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpICE9IG51bGwgJiYgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkubGVuZ3RoKCkgPiAwKSB7Ci0KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gbmV3IERlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQoY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYU5hbWUpIHsKLQkJCQkJaWYgKGFOYW1lLmVxdWFscygiZmluYWxQZXJzcGVjdGl2ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKGFOYW1lKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZC51cGRhdGVQZXJzcGVjdGl2ZShlbGVtZW50KTsKLQkJfSBlbHNlCi0JCQlCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZC51cGRhdGVQZXJzcGVjdGl2ZShjb25maWd1cmF0aW9uRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgc2F2ZWQgdG8gdXNlIHdoZW4gdGhlIHdpemFyZCBjb21wbGV0ZXMgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZQotCSAqIGN1cnJlbnQgcGVyc3BlY3RpdmUgdXNpbmcgZWl0aGVyICgxKSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHtAc2VlICNnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKX0KLQkgKiBvciAoMikgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgZmluYWxQZXJzcGVjdGl2ZSBhdHRyaWJ1dGUgaW4gdGhlIFdpemFyZCdzIGNvbmZpZ3VyYXRpb24KLQkgKiBlbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWc7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmFmNjUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uY29tcG9uZW50Y29yZS51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBTZXJ2ZXMgYXMgYSBiYXNlIGNsYXNzIGZvciBXaXphcmRzIHdoaWNoIGNyZWF0ZSBKMkVFIG1vZHVsZSBzdHJ1Y3R1cmVzIGluIEVjbGlwc2UgcHJvamVjdHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBFQVIgd2lsbCBiZSBwcmUtcG9wdWxhdGVkIGluIHRoZSBXaXphcmQgY29udHJvbHMgaWYgYW55IHNlbGVjdGlvbiB3YXMgcHJvdmlkZWQgdG8gdGhlIFdpemFyZC4KLSAqIDwvcD4KLSAqIDxwPgotICogUmVmZXIgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQXJ0aWZhY3RDcmVhdGlvbldpemFyZH1mb3IgaW5mb3JtYXRpb24KLSAqIG9uIGhvdyB0byBleHRlbmQgdGhpcyBjbGFzcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdENyZWF0aW9uV2l6YXJkIGltcGxlbWVudHMgSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBtYWluIHBhZ2Ugb2YgdGhlIFdpemFyZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1BHID0gIm1vZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgc2VsZWN0aW9uIHN0b3JlZCBpbgotCSAqIHtAbGluayBKMkVFQXJ0aWZhY3RDcmVhdGlvbldpemFyZCNpbml0KElXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKX1pcyB1c2VkIHRvCi0JICogcHJlLXBvcHVsYXRlIHRoZSBFQVIgcHJvamVjdCBpbiB0aGUgV2l6YXJkIGRpYWxvZyBjb250cm9scy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBKMkVFQXJ0aWZhY3RDcmVhdGlvbldpemFyZCNpbml0KElXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqIEBzZWUgSjJFRUFydGlmYWN0Q3JlYXRpb25XaXphcmQjZG9Jbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXByZUZpbGxTZWxlY3RlZEVBUlByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIHdoaWNoIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgY2FsbCBzdXBlci5hZGRNb2R1bGVzUGFnZUlmTmVjZXNzYXJ5KCkKLQkgKiBhaGVhZCBvZiBiZWZvcmUgdGhlaXIgb3duIHBhZ2VzLgotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGVzUGFnZUlmTmVjZXNzYXJ5KCkgewotICAgICAgICAvL1RPRE86IGFkZCBtb2R1bGVzIHBhZ2UgYmFjayBmb3IgMC43Ci0vLwkJaWYgKGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShVSV9TSE9XX0VBUl9TRUNUSU9OKSkgewotLy8JCQlhZGRQYWdlKG5ldyBKMkVFTW9kdWxlc0RlcGVuZGVuY3lQYWdlKGdldERhdGFNb2RlbCgpLCBNT0RVTEVfUEcpKTsKLS8vCQl9Ci0JfQotCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRNb2R1bGVzUGFnZUlmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogU2tpcHMgdGhlIHBhZ2UgaWRlbnRpZmllZCBieSB0aGUgTU9EVUxFX1BHIG5hbWUgaWYKLQkgKiB7QGxpbmsgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkI3Nob3VsZFNob3dNb2R1bGVzUGFnZSgpfWlzIGZhbHNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFByZXZpb3VzUGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCUlXaXphcmRQYWdlIHByZXZpb3VzID0gc3VwZXIuZ2V0UHJldmlvdXNQYWdlKHBhZ2UpOwotCQlpZiAocHJldmlvdXMgIT0gbnVsbCAmJiBwcmV2aW91cy5nZXROYW1lKCkuZXF1YWxzKE1PRFVMRV9QRykpIHsKLQkJCWlmICghc2hvdWxkU2hvd01vZHVsZXNQYWdlKCkpIHsKLQkJCQlwcmV2aW91cyA9IHN1cGVyLmdldFByZXZpb3VzUGFnZShwcmV2aW91cyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIDxwPgotCSAqIFNraXBzIHRoZSBwYWdlIGlkZW50aWZpZWQgYnkgdGhlIE1PRFVMRV9QRyBuYW1lIGlmCi0JICoge0BsaW5rIEoyRUVNb2R1bGVQcm9qZWN0Q3JlYXRpb25XaXphcmQjc2hvdWxkU2hvd01vZHVsZXNQYWdlKCl9aXMgZmFsc2UuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0TmV4dFBhZ2Uob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCUlXaXphcmRQYWdlIG5leHQgPSBzdXBlci5nZXROZXh0UGFnZShwYWdlKTsKLQkJaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5hbWUoKS5lcXVhbHMoTU9EVUxFX1BHKSkgewotCQkJaWYgKCFzaG91bGRTaG93TW9kdWxlc1BhZ2UoKSkgewotCQkJCW5leHQgPSBzdXBlci5nZXROZXh0UGFnZShuZXh0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBVc2VzIHRoZSBtb2RlbCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZHVsZSBwYWdlIHNob3VsZCBiZSBzaG93bi4gVGhlIGRlZmF1bHQgaXMgdG8gQU5EIHRoZQotCSAqIHZhbHVlcyBvZiBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsLkFERF9UT19FQVIpIGFuZAotCSAqIHNob3VsZFNob3dNb2R1bGVzUGFnZUZvckVBUigpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuIHRydWUgaWYgdGhlIG1vZHVsZSBwYWdlIHNob3VsZCBiZSBzaG93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzaG91bGRTaG93TW9kdWxlc1BhZ2UoKSB7Ci0JCXJldHVybiBnZXREYXRhTW9kZWwoKS5nZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUikgJiYgc2hvdWxkU2hvd01vZHVsZXNQYWdlRm9yRUFSKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVXNlcyB0aGUgbW9kZWwgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2R1bGUgcGFnZSBzaG91bGQgYmUgc2hvd24gZm9yIHRoZSBFQVIuIElmIG5vIG1vZHVsZXMgYXJlCi0JICogcHJlc2VudCBpbiB0aGUgY2xhc3NwYXRoIHNlbGVjdGlvbiBvZiB0aGUgbW9kZWwsIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZQotCSAqIEBzZWUgSjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsT2xkI2dldENsYXNzUGF0aFNlbGVjdGlvbigpIGlzIG5vbi1lbXB0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzaG91bGRTaG93TW9kdWxlc1BhZ2VGb3JFQVIoKSB7Ci0JCS8vIFRPRE8gaXMgdGhpcyB3aGF0IHdlIHdhbnQgaGVyZT8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBFQVIgbW9kdWxlIHNlbGVjdGVkIGluIHRoZSB2aWV3IHVzZWQgdG8gbGF1bmNoIHRoZSB3aXphcmQuCi0JICovCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IGdldFNlbGVjdGVkRUFSTW9kdWxlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKG51bGwgIT0gc2VsZWN0aW9uKSB7Ci0JCQlPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50VXRpbGl0aWVzLmZpbmRDb21wb25lbnQoKEVPYmplY3QpIG9iaik7Ci0JCQkJaWYgKG51bGwgIT0gY29tcCAmJiBjb21wLmdldENvbXBvbmVudFR5cGVJZCgpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKSkgewotCQkJCQlyZXR1cm4gY29tcDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlRmlsbFNlbGVjdGVkRUFSUHJvamVjdCgpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gZ2V0U2VsZWN0ZWRFQVJNb2R1bGUoKTsKLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCQlpbnQgajJlZVZlcnNpb24gPSAwOwotCQkJdHJ5IHsKLQkJCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyQ29tcG9uZW50KTsKLQkJCQlqMmVlVmVyc2lvbiA9IGVhckVkaXQuZ2V0SjJFRVZlcnNpb24oKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQkJZWFyRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlJRGF0YU1vZGVsIGRtID0gZ2V0RGF0YU1vZGVsKCk7Ci0JCQlkbS5zZXRJbnRQcm9wZXJ0eShDT01QT05FTlRfVkVSU0lPTiwgajJlZVZlcnNpb24pOwotCQkJZG0uc2V0UHJvcGVydHkoRUFSX0NPTVBPTkVOVF9OQU1FLCBlYXJDb21wb25lbnQuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDYzZThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDEwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSVV0aWw7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIGltcGxlbWVudHMgSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV2luZG93cyA9IFNXVC5nZXRQbGF0Zm9ybSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgid2luIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVkVSU0lPTiA9IEoyRUVVSU1lc3NhZ2VzLk1PRFVMRV9WRVJTSU9OX0xBQkVMOwotICAgIHByb3RlY3RlZCBOZXdNb2R1bGVHcm91cCBwcm9qZWN0TmFtZUdyb3VwOwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgYWR2YW5jZWRDb21wb3NpdGU7Ci0gICAgcHJvdGVjdGVkIEJ1dHRvbiBhZHZhbmNlZEJ1dHRvbjsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93QWR2YW5jZWQgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgQWR2YW5jZWRTaXplQ29udHJvbGxlciBhZHZhbmNlZENvbnRyb2xsZXI7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWR2YW5jZWRDb250cm9sc0J1aWx0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAgZWFyR3JvdXA7Ci0gICAgcHJvdGVjdGVkIENvbWJvIHNlcnZlclRhcmdldENvbWJvOwotICAgIHByb3RlY3RlZCBUZXh0IG1vZHVsZU5hbWVUZXh0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgVGV4dCBsb2NhdGlvblBhdGhGaWVsZCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b24gPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gc3VwcG9ydE11bHRpcGxlTW9kdWxlcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENvbWJvIHByb2plY3ROYW1lQ29tYm8gPSBudWxsOwotICAgIHByb3RlY3RlZCBUZXh0IHNvdXJjZUZvbGRlck5hbWVUZXh0ID0gbnVsbDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0vLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xBQkVMX1VJID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSk7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUVfVUkgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5OQU1FX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgU3RyaW5nIGRlZkJyb3dzZUJ1dHRvbkxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQlJPV1NFX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZEaXJEaWFsb2dMYWJlbCA9ICJEaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiAgVGhpcyB0eXBlIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHRoZSBTaGVsbCBzaXplIGJhc2VkIG9uIHRoZSBzaG93QWR2YW5jZWQgZmxhZy4gSXQgd2lsbAotICAgICAqIHRyYWNrIHRoZSBvcmlnaW5hbCBzaXplIG9mIHRoZSBTaGVsbCBldmVuIGlmIHRoZSB1c2VyIHJlc2l6ZXMgaXQuIE9uZSBwcm9ibGVtIHRoYXQgd2UgbWF5Ci0gICAgICogZmFjZSBpcyB0aGF0IHRoZSBTaGVsbCBzaXplIGNvdWxkIGNoYW5nZSBieSB0aGUgZnJhbWV3b3JrIHByaW9yIHRvIHRoZSBTaGVsbCBiZWluZyBtYWRlCi0gICAgICogdmlzaWJsZSBidXQgdGhlIHBhZ2Ugd2lsbCBhbHJlYWR5IGdldCBhbiBlbnRlciBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgd2Ugd2lsbCBuZWVkIHRvIHNldCB0aGUKLSAgICAgKiBTaGVsbCBzaXplIGJhc2VkIG9uIHRoZSBzaG93QWR2YW5jZWQgZmxhZyB3aGVuIHRoZSBTaGVsbCByZXNpemUgZXZlbnQgaXMgY2FsbGVkIGFuZCB0aGUgU2hlbGwKLSAgICAgKiBpcyB2aXNpYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgQWR2YW5jZWRTaXplQ29udHJvbGxlciBpbXBsZW1lbnRzIENvbnRyb2xMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgaW50IGFkdmFuY2VkSGVpZ2h0ID0gLTE7Ci0gICAgICAgIHByaXZhdGUgUG9pbnQgb3JpZ2luYWxTaXplOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlU2hlbGxSZXNpemUgPSBmYWxzZTsKLQotICAgICAgICBwcml2YXRlIEFkdmFuY2VkU2l6ZUNvbnRyb2xsZXIoU2hlbGwgYVNoZWxsKSB7Ci0gICAgICAgICAgICBvcmlnaW5hbFNpemUgPSBhU2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgYVNoZWxsLmFkZENvbnRyb2xMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKCFpZ25vcmVTaGVsbFJlc2l6ZSkgewotICAgICAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlLmdldFNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmlzVmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZWRIZWlnaHQgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaGVsbFNpemVGb3JBZHZhbmNlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0T3JpZ2luYWxTaGVsbFNpemUoKSB7Ci0gICAgICAgICAgICBzZXRTaGVsbFNpemUob3JpZ2luYWxTaXplLngsIG9yaWdpbmFsU2l6ZS55KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTaGVsbFNpemUoaW50IHgsIGludCB5KSB7Ci0gICAgICAgICAgICBpZ25vcmVTaGVsbFJlc2l6ZSA9IHRydWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldFNoZWxsKCkuc2V0U2l6ZSh4LCB5KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWdub3JlU2hlbGxSZXNpemUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFNoZWxsU2l6ZUZvckFkdmFuY2VkKCkgewotICAgICAgICAgICAgaW50IGhlaWdodCA9IGNhbGN1bGF0ZUFkdmFuY2VkU2hlbGxIZWlnaHQoKTsKLSAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gLTEpCi0gICAgICAgICAgICAgICAgc2V0U2hlbGxTaXplKGdldFNoZWxsKCkuZ2V0U2l6ZSgpLngsIGhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBjYWxjdWxhdGVBZHZhbmNlZFNoZWxsSGVpZ2h0KCkgewotICAgICAgICAgICAgUG9pbnQgYWR2YW5jZWRDb21wU2l6ZSA9IGFkdmFuY2VkQ29tcG9zaXRlLmdldFNpemUoKTsKLSAgICAgICAgICAgIGlmIChhZHZhbmNlZENvbXBTaXplLnggPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gY29tcHV0ZUFkdmFuY2VkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoIXNob3dBZHZhbmNlZCAmJiBoZWlnaHQgIT0gLTEpCi0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC0gYWR2YW5jZWRDb21wb3NpdGUuZ2V0U2l6ZSgpLnk7Ci0gICAgICAgICAgICByZXR1cm4gaGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29tcHV0ZSB0aGUgaGVpZ2h0IHdpdGggdGhlIGFkdmFuY2VkIHNlY3Rpb24gc2hvd2luZy4gQHJldHVybgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgY29tcHV0ZUFkdmFuY2VkSGVpZ2h0KCkgewotICAgICAgICAgICAgaWYgKGFkdmFuY2VkSGVpZ2h0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUG9pbnQgY29udHJvbFNpemUgPSBnZXRDb250cm9sKCkuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sU2l6ZS54ICE9IDApIHsKLSAgICAgICAgICAgICAgICAJUG9pbnQgcGFnZVNpemUgPSBnZXRDb250cm9sKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbkhlaWdodCA9IG9yaWdpbmFsU2l6ZS55IC0gY29udHJvbFNpemUueTsKLSAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRIZWlnaHQgPSBwYWdlU2l6ZS55ICsgbWluSGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhZHZhbmNlZEhlaWdodDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodG9wLCBnZXRJbmZvcG9wSUQoKSk7Ci0gICAgICAgIHRvcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIHRvcC5zZXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodG9wLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNyZWF0ZU1vZHVsZUdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgICAgIENvbXBvc2l0ZSBkZXRhaWwgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotICAgICAgICBkZXRhaWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBkZXRhaWwuc2V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGNyZWF0ZUFkdmFuY2VkQ29tcG9zaXRlKGRldGFpbCk7Ci0gICAgICAgIHJldHVybiB0b3A7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVBZHZhbmNlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGFkdmFuY2VkQ29udHJvbHNCdWlsdCA9IHRydWU7Ci0gICAgICAgIGFkdmFuY2VkQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5UT0dHTEUpOwotICAgICAgICBzZXRBZHZhbmNlZExhYmVsVGV4dCgpOwotICAgICAgICBmaW5hbCBDdXJzb3IgaGFuZCA9IG5ldyBDdXJzb3IoYWR2YW5jZWRCdXR0b24uZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0hBTkQpOwotICAgICAgICBhZHZhbmNlZEJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhZHZhbmNlZENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIC8vdG9nZ2xlQWR2YW5jZWQoZmFsc2UpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBhZHZhbmNlZENvbXBvc2l0ZS5zZXREYXRhKGRhdGEpOwotICAgICAgICBhZHZhbmNlZENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgYWR2YW5jZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRvZ2dsZUFkdmFuY2VkKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYWR2YW5jZWRCdXR0b24uYWRkTGlzdGVuZXIoU1dULk1vdXNlSG92ZXIsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vdXNlSG92ZXIpCi0gICAgICAgICAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldEN1cnNvcihoYW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGFkZFRvQWR2YW5jZWRDb21wb3NpdGUoYWR2YW5jZWRDb21wb3NpdGUpOwotICAgICAgICByZXR1cm4gYWR2YW5jZWRDb21wb3NpdGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1vZHVsZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlUHJvamVjdE5hbWVHcm91cChwYXJlbnQpOwotICAgICAgICBjcmVhdGVQcm9qZWN0TG9jYXRpb25Hcm91cChwYXJlbnQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGxhYmVsCi0gICAgICAgIExhYmVsIHByb2plY3ROYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChNT0RVTEVfTkFNRV9VSSk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0gICAgICAgIG1vZHVsZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICBtb2R1bGVOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IC8vIHBhZAotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaFRleHQobW9kdWxlTmFtZVRleHQsIENPTVBPTkVOVF9OQU1FLCBuZXcgQ29udHJvbFtde3Byb2plY3ROYW1lTGFiZWx9KTsKLSAgICAgICAgbW9kdWxlTmFtZVRleHQuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RMb2NhdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gICAgICBzZXQgdXAgbG9jYXRpb24gcGF0aCBsYWJlbAotICAgICAgICBMYWJlbCBsb2NhdGlvblBhdGhMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbG9jYXRpb25QYXRoTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5QUk9KRUNUX0xPQ19MQkwpKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBsb2NhdGlvblBhdGhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAvLyBzZXQgdXAgbG9jYXRpb24gcGF0aCBlbnRyeSBmaWVsZAotICAgICAgICBsb2NhdGlvblBhdGhGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0gICAgICAgIGxvY2F0aW9uUGF0aEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIC8vIHNldCB1cCBicm93c2UgYnV0dG9uCi0gICAgICAgIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaFRleHQobG9jYXRpb25QYXRoRmllbGQsIExPQ0FUSU9OLCBudWxsKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobG9jYXRpb25QYXRoRmllbGQuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKGRlZkRpckRpYWxvZ0xhYmVsKTsKLSAgICAgICAgU3RyaW5nIGRpck5hbWUgPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShMT0NBVElPTik7Ci0gICAgICAgIGlmICgoZGlyTmFtZSAhPSBudWxsKSAmJiAoZGlyTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotICAgICAgICAgICAgRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGF0aC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShMT0NBVElPTiwgc2VsZWN0ZWREaXJlY3RvcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9BZHZhbmNlZENvbXBvc2l0ZShDb21wb3NpdGUgYWR2YW5jZWQpIHsKLSAgICAgICAgY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKGFkdmFuY2VkKTsKLSAgICAgICAgY3JlYXRlVmVyc2lvbkNvbXBvc2l0ZShhZHZhbmNlZCk7Ci0gICAgICAgIGNyZWF0ZVNlcnZlckVhckFuZFN0YW5kYWxvbmVHcm91cChhZHZhbmNlZCk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5UQVJHRVRfUlVOVElNRV9MQkwpKTsKLSAgICAgICAgc2VydmVyVGFyZ2V0Q29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHNlcnZlclRhcmdldENvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBCdXR0b24gbmV3U2VydmVyVGFyZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgbmV3U2VydmVyVGFyZ2V0QnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSkpOwotICAgICAgICBuZXdTZXJ2ZXJUYXJnZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYoIUoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UubGF1bmNoTmV3UnVudGltZVdpemFyZChnZXRTaGVsbCgpLCBtb2RlbCkpewotICAgICAgICAgICAgICAgIAlzZXRFcnJvck1lc3NhZ2UoSjJFRUNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VydmVyVGFyZ2V0RGF0YU1vZGVsX1VJXzkiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBDb250cm9sW10gZGVwcyA9IG5ldyBDb250cm9sW117bGFiZWwsIG5ld1NlcnZlclRhcmdldEJ1dHRvbn07Ci0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoQ29tYm8oc2VydmVyVGFyZ2V0Q29tYm8sIFJVTlRJTUVfVEFSR0VUX0lELCBkZXBzKTsKLSAgICAgICAgaWYoc2VydmVyVGFyZ2V0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSAmJiBzZXJ2ZXJUYXJnZXRDb21iby5nZXRWaXNpYmxlSXRlbUNvdW50KCkgIT0gMCkKLSAgICAgICAgICAgIHNlcnZlclRhcmdldENvbWJvLnNlbGVjdCgwKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBlYXJHcm91cCA9IG5ldyBTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAocGFyZW50LCBnZXREYXRhTW9kZWwoKSwgc3luY2hIZWxwZXIpOwotICAgIH0KLSAgICAKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdHNDb21ib0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBsYWJlbAotCQkKLQkJTGFiZWwgcHJvamVjdE5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RBQkxFX1BST0pFQ1QpKTsKLQkJCi0JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKLQkJcHJvamVjdE5hbWVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5OT05FIHwgU1dULlJFQURfT05MWSk7Ci0JCXByb2plY3ROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlwcm9qZWN0TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpOwotCi0JCQkJLy91cGRhdGUgdGhlIHByb2plY3QgbG9jYXRpb24gd2l0aCB0aGlzIGluZm9ybWF0aW9uLCBtYWtlIGl0IHJlYWRhYmxlCi0JCQkJLy91cGRhdGUgU2VydmVyIGluZm8gUlVOVElNRV9UQVJHRVRfSUQsIG1ha2UgaXQgcmVhZGFibGUKLQkJCQlpZiAocHJvamVjdE5hbWUhPW51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkhPTApIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQkJCWlmIChwcm9qZWN0ICE9bnVsbCkgewotCQkJCQkJSVJ1bnRpbWUgcnVudGltZSA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOwotCQkJCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCl7Ci0JCQkJCQkJLy9zZXJ2ZXJUYXJnZXRUZXh0LnNldFRleHQocnVudGltZS5nZXROYW1lKCkpOwotCQkJCQkJCXN5bmNoSGVscGVyLmdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KElKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lELCBydW50aW1lLmdldE5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlzeW5jaEhlbHBlci5nZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQkJCQkJc3luY2hIZWxwZXIuZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5MT0NBVElPTiwgcHJvamVjdC5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLS8vCXByaXZhdGUgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KCkgewotLy8JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0vLwkJaWYgKHdpbmRvdyA9PSBudWxsKQotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0vLwkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikpCi0vLwkJCXJldHVybiBudWxsOwotLy8JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc3R1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLS8vCQlPYmplY3Qgb2JqID0gc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotLy8JCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkKLS8vCQkJcmV0dXJuIChJUHJvamVjdCkgb2JqOwotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXtJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgUlVOVElNRV9UQVJHRVRfSUQsIENPTVBPTkVOVF9WRVJTSU9OLCBDT01QT05FTlRfTkFNRSwgTE9DQVRJT04sIEVBUl9DT01QT05FTlRfTkFNRSwgQUREX1RPX0VBUiwgSkFWQVNPVVJDRV9GT0xERVIgfTsgICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlRm9sZGVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCQkKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoZ2V0U291cmNlRm9sZGVyTGFiZWwoKSk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsgICAgICAKLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgLy8gc2V0IHVwIHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotICAgICAgICBzb3VyY2VGb2xkZXJOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLSAgICAgICAgc291cmNlRm9sZGVyTmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvLyBwYWQKLSAgICAgICAgc3luY2hIZWxwZXIuc3luY2hUZXh0KHNvdXJjZUZvbGRlck5hbWVUZXh0LCBKQVZBU09VUkNFX0ZPTERFUiwgbnVsbCk7Ci0gICAgfQkKLQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZlcnNpb25Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVWZXJzaW9uQ29tcG9zaXRlKHBhcmVudCwgZ2V0VmVyc2lvbkxhYmVsKCksIENPTVBPTkVOVF9WRVJTSU9OKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25MYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRV9WRVJTSU9OX0xBQkVMKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUZvbGRlckxhYmVsKCkgewotICAgICAgICByZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuU09VUkNFRk9MREVSKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBpZiAoZWFyR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICAgIGVhckdyb3VwLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKHByb2plY3ROYW1lR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICAgIHByb2plY3ROYW1lR3JvdXAuZGlzcG9zZSgpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNlbnRlcigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0gICAgICAgIGlmIChhZHZhbmNlZENvbnRyb2xzQnVpbHQpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpcnN0VGltZVRvUGFnZSkKLSAgICAgICAgICAgICAgICBpbml0aWFsaXplQWR2YW5jZWRDb250cm9sbGVyKCk7Ci0gICAgICAgICAgICBpZiAoaXNXaW5kb3dzKSB7Ci0gICAgICAgICAgICAgICAgYWR2YW5jZWRDb250cm9sbGVyLnNldFNoZWxsU2l6ZUZvckFkdmFuY2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZW50ZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkQ29udHJvbGxlcigpIHsKLSAgICAgICAgYWR2YW5jZWRDb250cm9sbGVyID0gbmV3IEFkdmFuY2VkU2l6ZUNvbnRyb2xsZXIoZ2V0U2hlbGwoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZXhpdCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgaWYgKGFkdmFuY2VkQ29udHJvbHNCdWlsdCAmJiBpc1dpbmRvd3MgJiYgYWR2YW5jZWRDb250cm9sbGVyIT1udWxsKSB7Ci0gICAgICAgICAgICBhZHZhbmNlZENvbnRyb2xsZXIucmVzZXRPcmlnaW5hbFNoZWxsU2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmV4aXQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2Ujc3RvcmVEZWZhdWx0U2V0dGluZ3MoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgICBzdXBlci5zdG9yZURlZmF1bHRTZXR0aW5ncygpOwotICAgICAgICBpZiAoYWR2YW5jZWRDb250cm9sc0J1aWx0KSB7Ci0gICAgICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KGdldFNob3dBZHZhbmNlZEtleSgpLCBzaG93QWR2YW5jZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTaG93QWR2YW5jZWRLZXkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJfU0hPV19BRFZBTkNFRCI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNyZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgICBzdXBlci5yZXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0gICAgICAgIGlmIChhZHZhbmNlZENvbnRyb2xzQnVpbHQpIHsKLSAgICAgICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzaG93QWR2YW5jZWQgPSAhc2V0dGluZ3MuZ2V0Qm9vbGVhbihnZXRTaG93QWR2YW5jZWRLZXkoKSk7Ci0gICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oIXNob3dBZHZhbmNlZCk7IC8vc2V0IG9wcG9zaXRlIGIvYyB0b2dnbGVBZHZhbmNlZChib29sZWFuKQotICAgICAgICAgICAgLy8gd2lsbCBmbGlwIGl0Ci0gICAgICAgICAgICB0b2dnbGVBZHZhbmNlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYWR2YW5jZWRMYWJlbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRBZHZhbmNlZExhYmVsVGV4dCgpIHsKLSAgICAgICAgaWYgKGFkdmFuY2VkQ29udHJvbHNCdWlsdCkgewotICAgICAgICAgICAgaWYgKHNob3dBZHZhbmNlZCkKLSAgICAgICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFUHJvamVjdENyZWF0aW9uUGFnZV9VSV8wIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVByb2plY3RDcmVhdGlvblBhZ2VfVUlfMSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFkdmFuY2VkTGFiZWwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0b2dnbGVBZHZhbmNlZChib29sZWFuIHNldFNpemUpIHsKLSAgICAgICAgaWYgKGFkdmFuY2VkQ29udHJvbHNCdWlsdCkgewotICAgICAgICAgICAgc2hvd0FkdmFuY2VkID0gIXNob3dBZHZhbmNlZDsKLSAgICAgICAgICAgIGFkdmFuY2VkQ29tcG9zaXRlLnNldFZpc2libGUoc2hvd0FkdmFuY2VkKTsKLSAgICAgICAgICAgIHNldEFkdmFuY2VkTGFiZWxUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoc2V0U2l6ZSAmJiBpc1dpbmRvd3MpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZWRDb250cm9sc0J1aWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlZENvbnRyb2xsZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVBZHZhbmNlZENvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzV2luZG93cykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRDb250cm9sbGVyLnNldFNoZWxsU2l6ZUZvckFkdmFuY2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBhZHZhbmNlZENvbnRyb2xsZXIuc2V0U2hlbGxTaXplRm9yQWR2YW5jZWQoKTsKLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZlcnNpb25Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgU3RyaW5nIHZlcnNpb25Qcm9wKSB7Ci0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0gICAgICAgIENvbWJvIHZlcnNpb25Db21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMzA1OwotICAgICAgICB2ZXJzaW9uQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIENvbnRyb2xbXSBkZXBzID0gbmV3IENvbnRyb2xbXXtsYWJlbH07Ci0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoQ29tYm8odmVyc2lvbkNvbWJvLCB2ZXJzaW9uUHJvcCwgZGVwcyk7Ci0gICAgICAgIGlmICh2ZXJzaW9uQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkgewotCSAgICAgICAgU3RyaW5nW10gaXRlbXMgPSB2ZXJzaW9uQ29tYm8uZ2V0SXRlbXMoKTsKLQkgICAgICAgIGlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLmxlbmd0aCA+IDApCi0JICAgICAgICAgICAgdmVyc2lvbkNvbWJvLnNlbGVjdChpdGVtcy5sZW5ndGggLSAxKTsKLSAgICAgICAgfQotICAgICAgICBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IC8vcGFkCi0gICAgfSAgIAotICAgIAotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxhdW5jaE5ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwsIElEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gcHJlQWRkaXRpb25EZXNjcmlwdG9ycyA9IG1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhSVU5USU1FX1RBUkdFVF9JRCk7Ci0gICAgICAgIGJvb2xlYW4gaXNPSyA9IFNlcnZlclVJVXRpbC5zaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgIiIsICIiKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgaWYgKGlzT0sgJiYgbW9kZWwgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBwb3N0QWRkaXRpb25EZXNjcmlwdG9ycyA9IG1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhSVU5USU1FX1RBUkdFVF9JRCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBwcmVBZGRpdGlvbiA9IG5ldyBPYmplY3RbcHJlQWRkaXRpb25EZXNjcmlwdG9ycy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVBZGRpdGlvbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHByZUFkZGl0aW9uW2ldID0gcHJlQWRkaXRpb25EZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3RbXSBwb3N0QWRkaXRpb24gPSBuZXcgT2JqZWN0W3Bvc3RBZGRpdGlvbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc3RBZGRpdGlvbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHBvc3RBZGRpdGlvbltpXSA9IHBvc3RBZGRpdGlvbkRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCBuZXdBZGRpdGlvbiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0TmV3T2JqZWN0KHByZUFkZGl0aW9uLCBwb3N0QWRkaXRpb24pOwotCi0gICAgICAgICAgICBtb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShSVU5USU1FX1RBUkdFVF9JRCwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLSAgICAgICAgICAgIGlmIChuZXdBZGRpdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIG1vZGVsLnNldFByb3BlcnR5KFJVTlRJTUVfVEFSR0VUX0lELCBuZXdBZGRpdGlvbik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc09LOwotICAgIH0gICAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjA4NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBTZXJ2ZXMgYXMgYSBiYXNlIGNsYXNzIGZvciBXaXphcmRzIHdoaWNoIGltcG9ydCBKMkVFIG1vZHVsZSBzdHJ1Y3R1cmVzIGludG8gRWNsaXBzZSBwcm9qZWN0cy4KLSAqIDwvcD4KLSAqIDxwPgotICogSW1wb3J0IHdpemFyZHMgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogPHVsPgotICogPGxpPntAbGluayAjZ2V0SW1wb3J0T3BlcmF0aW9uKCl9Ci0gKiA8bGk+e0BsaW5rICNnZXRNb2R1bGVWYWxpZGF0b3JTdHJpbmdzKCl9Ci0gKiA8L3VsPgotICogPC9wPgotICogPHA+Ci0gKiBBbmQgb3B0aW9uYWxseSwgdGhleSBtYXkgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIGZyb20KLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmR9OgotICogPHVsPgotICogPGxpPntAbGluayAjZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCl9Ci0gKiA8bGk+e0BsaW5rICNkb0luaXQoKSgpfQotICogPGxpPntAbGluayAjZG9EaXNwb3NlKCkoKX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJREFUT1JfU1RSSU5HUyA9IG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbi5VSUVhclZhbGlkYXRvciJ9OyAvLyROT04tTkxTLTEkCi0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElQUk9KRUNUX0NMQVNTID0gSVByb2plY3QuY2xhc3M7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubwotCSAqIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEoyRUVDb21wb25lbnRJbXBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCIzOCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEoyRUVDb21wb25lbnRJbXBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCIzOCIpKTsvLyROT04tTkxTLTEkIAotCX0KLQotCS8vIC8qKgotCS8vICogPHA+Ci0JLy8gKiBDcmVhdGVzIGFuIEltcG9ydCBPcGVyYXRpb24gdXNpbmcge0BsaW5rICNnZXRJbXBvcnRPcGVyYXRpb24oKX1hbmQgd3JhcHMgaXQgdG8gcnVuCi0JLy8gKiB2YWxpZGF0aW9uIG9uY2UgdGhlIG1vZHVsZSBoYXMgYmVlbiBpbXBvcnRlZC4KLQkvLyAqIDwvcD4KLQkvLyAqCi0JLy8gKiBAcmV0dXJuIFJldHVybnMgYSB3cmFwcGVyIG9wZXJhdGlvbiBhcm91bmQgdGhlIHJlc3VsdCBvZiBnZXRJbXBvcnRPcGVyYXRpb24oKSB0aGF0IGFsc28KLQkvLyBydW5zCi0JLy8gKiB2YWxpZGF0aW9uIGFzIGRlZmluZWQgaW4gZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpCi0JLy8gKiBAc2VlICNnZXRJbXBvcnRPcGVyYXRpb24oKQotCS8vICogQHNlZSAjZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgZmluYWwgV1RQT3BlcmF0aW9uIGNyZWF0ZUJhc2VPcGVyYXRpb24oKSB7Ci0JLy8gcmV0dXJuIG5ldyBXVFBPcGVyYXRpb24oKSB7Ci0JLy8gcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCS8vIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkvLyBXVFBPcGVyYXRpb24gaW1wb3J0T3AgPSBnZXRJbXBvcnRPcGVyYXRpb24oKTsKLQkvLyBpZiAoaW1wb3J0T3AgPT0gbnVsbCkKLQkvLyByZXR1cm47Ci0JLy8gaW1wb3J0T3AucnVuKG1vbml0b3IpOwotCS8vCi0JLy8gSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbCBpbXBvcnRNb2RlbCA9IChKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsKQotCS8vIGdldEltcG9ydE9wZXJhdGlvbigpLmdldE9wZXJhdGlvbkRhdGFNb2RlbCgpOwotCS8vIElQcm9qZWN0IG1vZHVsZVByb2plY3QgPSBpbXBvcnRNb2RlbC5nZXRQcm9qZWN0KCk7Ci0JLy8gVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG1vZHVsZVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24obW9kdWxlUHJvamVjdCwgdHJ1ZSwKLQkvLyBmYWxzZSk7Ci0JLy8gbW9kdWxlVmFsaWRhdG9yLnNldFZhbGlkYXRvcnMoZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpKTsKLQkvLyBtb2R1bGVWYWxpZGF0b3IucnVuKG1vbml0b3IpOwotCS8vCi0JLy8gaWYgKGltcG9ydE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsLkFERF9UT19FQVIpKSB7Ci0JLy8gSVByb2plY3QgZWFyUHJvamVjdCA9Ci0JLy8gaW1wb3J0TW9kZWwuZ2V0SjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsKCkuZ2V0RWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKS5nZXRUYXJnZXRQcm9qZWN0KCk7Ci0JLy8gVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGVhclZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZWFyUHJvamVjdCwgdHJ1ZSwKLQkvLyBmYWxzZSk7Ci0JLy8gZWFyVmFsaWRhdG9yLnNldFZhbGlkYXRvcnMoZ2V0RWFyVmFsaWRhdG9yU3RyaW5ncygpKTsKLQkvLyBlYXJWYWxpZGF0b3IucnVuKG1vbml0b3IpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfTsKLQkvLyB9Ci0KLQkvLyAvKioKLQkvLyAqCi0JLy8gKiBAcmV0dXJuIFRoZSBhcHByb3ByaWF0ZSBpbXBvcnQgb3BlcmF0aW9uIGZvciB0aGUgc3BlY2lmaWMgSjJFRSBtb2RlbCB0eXBlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYWJzdHJhY3QgV1RQT3BlcmF0aW9uIGdldEltcG9ydE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIEltcG9ydCBXaXphcmRzIGNhbiBydW4gYXJiaXRyYXJ5IHZhbGlkYXRvcnMgb25jZSB0aGUgbW9kdWxlIGhhcyBiZWVuIGNyZWF0ZWQuIFRoZXNlCi0JICogdmFsaWRhdG9ycyBlbnN1cmUgdGhhdCB0aGUgc3RydWN0dXJlIGNyZWF0ZWQgYnkgdGhlIEltcG9ydCBvcGVyYXRpb24gYW5kIHRoZSBjb250ZW50cyBvZiB0aGF0Ci0JICogc3RydWN0dXJlIGFyZSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGFubm91bmNlZCB0byB0aGUgUHJvYmxlbXMgdmlldyBpbiBFY2xpcHNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRvciBJRHMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBtb2R1bGUgdHlwZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRNb2R1bGVWYWxpZGF0b3JTdHJpbmdzKCk7Ci0KLQkvLyAvKioKLQkvLyAqIDxwPgotCS8vICogVXNlcyB0aGUgc2VsZWN0aW9uIHN1cHBsaWVkIGZyb20gdGhlIHtAbGluayAjaW5pdChJV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbil9bWV0aG9kCi0JLy8gKiB0byBzZXQgdGhlIGFzc29jaWF0ZWQgRUFSIE1vZHVsZSBpZiBhbiBFQVIgYXJ0aWZhY3Qgd2FzIHNlbGVjdGVkLgotCS8vICogPC9wPgotCS8vICoKLQkvLyAqIEBwYXJhbSBpbXBvcnRNb2RlbAotCS8vICogVGhlIE1vZHVsZSBJbXBvcnQgZGF0YSBtb2RlbCB0byBoYXZlIGl0cyBKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsLkVBUl9QUk9KRUNUCi0JLy8gKiBmaWVsZCBzZXQuCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgZmluYWwgdm9pZCB1cGRhdGVFQVJUb01vZGVsRnJvbVNlbGVjdGlvbihKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsIGltcG9ydE1vZGVsKSB7Ci0JLy8gLyogU2V0IHRoZSBkZWZhdWx0IGVhciBzZWxlY3RlZCBpZiBhIGVhciBpcyBzZWxlY3RlZCAqLwotCS8vIHRyeSB7Ci0JLy8gaWYgKGdldFNlbGVjdGlvbigpICE9IG51bGwgJiYgIWdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCS8vIElQcm9qZWN0IHRhcmdldEVBUlByb2plY3QgPSAoSVByb2plY3QpCi0JLy8gQWRhcHRhYmlsaXR5VXRpbGl0eS5nZXRBZGFwdGVyKGdldFNlbGVjdGlvbigpLmdldEZpcnN0RWxlbWVudCgpLCBJUFJPSkVDVF9DTEFTUyk7Ci0JLy8gaWYgKHRhcmdldEVBUlByb2plY3QgIT0gbnVsbCAmJiB0YXJnZXRFQVJQcm9qZWN0Lmhhc05hdHVyZShJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpCi0JLy8gaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbC5FQVJfTkFNRSwgdGFyZ2V0RUFSUHJvamVjdC5nZXROYW1lKCkpOwotCS8vIH0KLQkvLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCS8vIC8vSWdub3JlCi0JLy8gfQotCS8vIH0KLQotCS8vIHByaXZhdGUgU3RyaW5nW10gZ2V0RWFyVmFsaWRhdG9yU3RyaW5ncygpIHsKLQkvLyByZXR1cm4gVkFMSURBVE9SX1NUUklOR1M7Ci0JLy8gfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTJhNWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVDb21wb25lbnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotLy8JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQpIHsKLS8vCQkJcmV0dXJuICgoSVZpcnR1YWxDb21wb25lbnQpZWxlbWVudCkuZ2V0TmFtZSgpOwotLy8JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgaGFuZGxlID0gKElQcm9qZWN0KWVsZW1lbnQ7Ci0JCQlyZXR1cm4gaGFuZGxlLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUV4cG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUV4cG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiY2U4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVFeHBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVFeHBvcnRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzID0gU1dULmdldFBsYXRmb3JtKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJ3aW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX0xBQkVMID0gIkoyRUVfRVhQT1JUXyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUldSSVRFX0xBQkVMID0gIk9WRVJXUklURSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0xBQkVMID0gIlNPVVJDRSI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0xBQkVMID0gIk1FVEEiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CUk9XU0VfTEFCRUwpOwotCXByb3RlY3RlZCBTdHJpbmcgTEFCRUxfREVTVElOQVRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KMkVFX0VYUE9SVF9ERVNUSU5BVElPTik7Ci0JcHJpdmF0ZSBDb21ibyByZXNvdXJjZU5hbWVDb21ibzsKLQlwcml2YXRlIENvbWJvIGRlc3RpbmF0aW9uTmFtZUNvbWJvOwotCXByaXZhdGUgQnV0dG9uIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gb3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94OwotCXByaXZhdGUgQnV0dG9uIHNvdXJjZUZpbGVzQ2hlY2tib3g7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgSjJFRUV4cG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGUsIGdldEluZm9wb3BJRCgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQljcmVhdGVTb3VyY2VBbmREZXN0aW5hdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZU9wdGlvbnNHcm91cChjb21wb3NpdGUpOwotCi0JCS8vc2V0dXBCYXNlZE9uSW5pdGlhbFNlbGVjdGlvbnMoKTsKLQkJc2V0dXBJbmZvcG9wKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VBbmREZXN0aW5hdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY3JlYXRlRXhwb3J0Q29tcG9uZW50R3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlRGVzdGluYXRpb25Hcm91cChjb21wb3NpdGUpOwotCi0JfQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGV4cG9ydCBzb3VyY2UgcmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiB3aWRnZXRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBvZiB0aGlzIGdyb3VwJ3MKLSAgICAgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgdmlzdWFsIGNvbXBvbmVudHMKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUV4cG9ydENvbXBvbmVudEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy9Qcm9qZWN0IGxhYmVsCi0gICAgICAgIExhYmVsIHByb2plY3RMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgcHJvamVjdExhYmVsLnNldFRleHQoZ2V0Q29tcG9uZW50TGFiZWwoKSk7Ci0gICAgICAgIC8vUHJvamVjdCBjb21ibwotICAgICAgICByZXNvdXJjZU5hbWVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotICAgICAgICByZXNvdXJjZU5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBzeW5jaEhlbHBlci5zeW5jaENvbWJvKHJlc291cmNlTmFtZUNvbWJvLCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsIG51bGwpOwotICAgICAgICBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ly9QYWQgbGFiZWwKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVzdGluYXRpb25Hcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0KLSAgICAgICAgLy9EZXN0aW5hdGlvbiBsYWJlbAotICAgICAgICBMYWJlbCBkZXN0aW5hdGlvbkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBkZXN0aW5hdGlvbkxhYmVsLnNldFRleHQoTEFCRUxfREVTVElOQVRJT04pOwotICAgICAgICAvLyBkZXN0aW5hdGlvbiBuYW1lIGNvbWJvIGZpZWxkCi0gICAgICAgIGRlc3RpbmF0aW9uTmFtZUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBkZXN0aW5hdGlvbk5hbWVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgc3luY2hIZWxwZXIuc3luY2hDb21ibyhkZXN0aW5hdGlvbk5hbWVDb21ibywgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfREVTVElOQVRJT04sIG51bGwpOwotCi0gICAgICAgIC8vIGRlc3RpbmF0aW9uIGJyb3dzZSBidXR0b24KLSAgICAgICAgZGVzdGluYXRpb25Ccm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVEZXN0aW5hdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBleHBvcnQgb3B0aW9ucyBzcGVjaWZpY2F0aW9uIHdpZGdldHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3B0aW9uc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICAvLyBvcHRpb25zIGdyb3VwCi0gICAgICAgIENvbXBvc2l0ZSBvcHRpb25zR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgb3B0aW9uc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0KLSAgICAgICAgLy8gc291cmNlIGZpbGVzLi4uIGNoZWNrYm94Ci0gICAgICAgIGNyZWF0ZVNvdXJjZUZpbGVzQ2hlY2tib3gob3B0aW9uc0dyb3VwKTsKLQotICAgICAgICAvLyBvdmVyd3JpdGUuLi4gY2hlY2tib3gKLSAgICAgICAgY3JlYXRlT3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94KG9wdGlvbnNHcm91cCk7Ci0KLSAgICAgICAgLy8gYWR2YW5jZWQgYnV0dG9uCi0gICAgICAgIGlmIChzaG91bGRTaG93UHJvamVjdEZpbGVzQ2hlY2tib3goKSkgewotICAgICAgICAgICAgY3JlYXRlUHJvamVjdEZpbGVzQ2hlY2tib3gob3B0aW9uc0dyb3VwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3goQ29tcG9zaXRlIG9wdGlvbnNHcm91cCkgewotCQkvL092ZXJ3cml0ZSBjaGVja2JveAotCQlvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQlvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KMkVFX0VYUE9SVF9PVkVSV1JJVEVfQ0hFQ0tCT1gpKTsgLy8kTk9OLU5MUy0xJCA9ICJPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgd2l0aG91dCB3YXJuaW5nIgotCQlvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3gsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfRVhJU1RJTkcsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZUZpbGVzQ2hlY2tib3goQ29tcG9zaXRlIG9wdGlvbnNHcm91cCkgewotCQlzb3VyY2VGaWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJc291cmNlRmlsZXNDaGVja2JveC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkoyRUVfRVhQT1JUX1NPVVJDRV9DSEVDS0JPWCkpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goc291cmNlRmlsZXNDaGVja2JveCwgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVYUE9SVF9TT1VSQ0VfRklMRVMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTaG93UHJvamVjdEZpbGVzQ2hlY2tib3goKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0RmlsZXNDaGVja2JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQmFzZWRPbkluaXRpYWxTZWxlY3Rpb25zKCkgewotCi0JCWlmIChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IHNldHVwQmFzZWRPblJlZk9iamVjdFNlbGVjdGlvbigpKQotCQkJcmV0dXJuOyAvLyBubyBzZXR1cCBuZWVkZWQKLQotCQlqYXZhLnV0aWwuTGlzdCBzZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBhZW51bSA9IGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWVudW0uaGFzTmV4dCgpKSB7Ci0JCQlJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gKElSZXNvdXJjZSkgYWVudW0ubmV4dCgpOwotCQkJLy8gZG8gbm90IGFkZCBpbmFjY2Vzc2libGUgZWxlbWVudHMKLQkJCWlmIChjdXJyZW50UmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJc2VsZWN0aW9ucy5hZGQoY3VycmVudFJlc291cmNlKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47IC8vIHNldHVwIG5vdCBuZWVkZWQgYW55bW9yZQotCi0vLwkJaW50IHNlbGVjdGVkUmVzb3VyY2VDb3VudCA9IHNlbGVjdGlvbnMuc2l6ZSgpOwotLy9UT0RPOiBmaW5kIGEgd2F5IHRvIHNlbGVjdCBhbiBleGlzdGluZyBjb21wb25lbnQKLS8vCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZUNvdW50ID09IDEpIHsKLS8vCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgc2VsZWN0aW9ucy5nZXQoMCk7Ci0vLwkJCWlmICgocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgJiYgY2hlY2tGb3JOYXR1cmUoKElQcm9qZWN0KSByZXNvdXJjZSkpIHsKLS8vCQkJCXJlc291cmNlTmFtZUNvbWJvLnNldFRleHQocmVzb3VyY2UuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlc3RpbmF0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGRlc3RpbmF0aW9uTmFtZUNvbWJvLmdldFNoZWxsKCksIFNXVC5TQVZFKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FKTsKLQkJU3RyaW5nW10gZmlsdGVycyA9IGdldEZpbHRlckV4cHJlc3Npb24oKTsKLQkJaWYgKCFpc1dpbmRvd3MpIHsKLQkJCWlmIChmaWx0ZXJzLmxlbmd0aCAhPSAwICYmIGZpbHRlcnNbMF0gIT0gbnVsbCAmJiBmaWx0ZXJzWzBdLmluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJCWZpbGVOYW1lICs9IGZpbHRlcnNbMF0uc3Vic3RyaW5nKGZpbHRlcnNbMF0uaW5kZXhPZignLicpKTsKLQkJCX0KLQkJfQotCQlkaWFsb2cuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlpZiAoaXNXaW5kb3dzKSB7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJzKTsKLQkJfQotCQlTdHJpbmcgZmlsZW5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkKLQkJCWRlc3RpbmF0aW9uTmFtZUNvbWJvLnNldFRleHQoZmlsZW5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0KLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfTEFCRUwgKyBnZXRGaWxlTmFtZXNTdG9yZUlEKCkpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBpZS4tIG5vIHNldHRpbmdzIHN0b3JlZAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzb3VyY2VOYW1lc1tpXSA9PSBudWxsKQotCQkJCQlzb3VyY2VOYW1lc1tpXSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlkZXN0aW5hdGlvbk5hbWVDb21iby5zZXRJdGVtcyhzb3VyY2VOYW1lcyk7Ci0JCQlib29sZWFuIG92ZXJ3cml0ZSA9IHNldHRpbmdzLmdldEJvb2xlYW4oU1RPUkVfTEFCRUwgKyBPVkVSV1JJVEVfTEFCRUwpOwotCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfRVhJU1RJTkcsIG92ZXJ3cml0ZSk7Ci0JCQlib29sZWFuIGluY2x1ZGVTb3VyY2UgPSBzZXR0aW5ncy5nZXRCb29sZWFuKFNUT1JFX0xBQkVMICsgU09VUkNFX0xBQkVMKTsKLQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRVhQT1JUX1NPVVJDRV9GSUxFUywgaW5jbHVkZVNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBzb3VyY2UgbmFtZXMgaGlzdG9yeQotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9MQUJFTCArIGdldEZpbGVOYW1lc1N0b3JlSUQoKSk7Ci0JCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgewotCQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQkJCX0KLQotCQkJU3RyaW5nIG5ld05hbWUgPSBkZXN0aW5hdGlvbk5hbWVDb21iby5nZXRUZXh0KCk7Ci0KLQkJCS8vcmlwIG91dCBhbnkgZW1wdHkgZmlsZW5hbWVzIGFuZCB0cmltIGxlbmd0aCB0byA1Ci0JCQlBcnJheUxpc3QgbmV3TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aCAmJiBpIDwgNTsgaSsrKSB7Ci0JCQkJaWYgKHNvdXJjZU5hbWVzW2ldLnRyaW0oKS5sZW5ndGgoKSA+IDAgJiYgIW5ld05hbWUuZXF1YWxzKHNvdXJjZU5hbWVzW2ldKSkgewotCQkJCQluZXdOYW1lcy5hZGQoc291cmNlTmFtZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCW5ld05hbWVzLmFkZCgwLCBkZXN0aW5hdGlvbk5hbWVDb21iby5nZXRUZXh0KCkpOwotCQkJc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nW25ld05hbWVzLnNpemUoKV07Ci0JCQluZXdOYW1lcy50b0FycmF5KHNvdXJjZU5hbWVzKTsKLQotCQkJc2V0dGluZ3MucHV0KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpLCBzb3VyY2VOYW1lcyk7Ci0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfTEFCRUwgKyBPVkVSV1JJVEVfTEFCRUwsIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0VYSVNUSU5HKSk7Ci0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfTEFCRUwgKyBTT1VSQ0VfTEFCRUwsIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRVhQT1JUX1NPVVJDRV9GSUxFUykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKLQkJcmV0dXJuIGdldENvbXBuZW50SUQoKTsKLQl9Ci0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21wbmVudElEKCk7Ci0KLSAgICAvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2VudGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJc3VwZXIuZW50ZXIoKTsKLQkJcmVzdG9yZVdpZGdldFZhbHVlcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQkvL3Byb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmF0dXJlSUQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pOwotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSByZXNvdXJjZSBuYW1lIGZpZWxkIGJhc2VkIHVwb24gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0dXBCYXNlZE9uUmVmT2JqZWN0U2VsZWN0aW9uKCkgewotCi0JCWlmIChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJT2JqZWN0IG8gPSBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmICghaXNNZXRhVHlwZVN1cHBvcnRlZChvKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBvOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVmKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlTmFtZUNvbWJvLnNldFRleHQocmVzb3VyY2UuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0RGlhbG9nU2V0dGluZ3MoKQotCSAqLwotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFSW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFSW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZhYmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUltcG9ydFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgQ29tYm8gY29tcG9uZW50Q29tYm87Ci0JcHJpdmF0ZSBDb21ibyBmaWxlTmFtZUNvbWJvOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9MQUJFTCA9ICJKMkVFX0lNUE9SVF8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZkJyb3dzZUJ1dHRvbkxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQlJPV1NFX0xBQkVMKTsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZk5ld0J1dHRvbkxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBKMkVFSW1wb3J0UGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljcmVhdGVGaWxlTmFtZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVQcm9qZWN0TmFtZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlyZXN0b3JlV2lkZ2V0VmFsdWVzKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3ROYW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLS8vCQlpZiAoRmxleGlibGVKYXZhUHJvamVjdFByZWZlcmVuY2VVdGlsLmdldE11bHRpcGxlTW9kdWxlc1BlclByb2plY3RQcm9wKCkpIHsKLS8vCQkJbmV3IE5ld01vZHVsZURhdGFNb2RlbEdyb3VwKHBhcmVudCwgZ2V0RGF0YU1vZGVsKCksIHN5bmNoSGVscGVyKTsKLS8vCQl9IGVsc2UgewotCQkJTGFiZWwgY29tcG9uZW50TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJCWNvbXBvbmVudExhYmVsLnNldFRleHQoZ2V0UHJvamVjdEltcG9ydExhYmVsKCkpOwotCQkJY29tcG9uZW50TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQkJLy8gc2V0dGluZyB1cCBjb21ibwotCQkJY29tcG9uZW50Q29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQkJY29tcG9uZW50Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkJLy8gLy8gc2V0dGluZyB1cCBidXR0b24KLQkJCS8vIEJ1dHRvbiBuZXdQcm9qZWN0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJCS8vIG5ld1Byb2plY3RCdXR0b24uc2V0VGV4dChkZWZOZXdCdXR0b25MYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIG5ld1Byb2plY3RCdXR0b24uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLQkJCS8vIG5ld1Byb2plY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyAvLyBoYW5kbGVOZXdQcm9qZWN0QnV0dG9uUHJlc3NlZCgpOwotCQkJLy8gfQotCQkJLy8gfSk7Ci0JCQkvLyBuZXdQcm9qZWN0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKGNvbXBvbmVudENvbWJvLCBJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsIG5ldyBDb250cm9sW117Y29tcG9uZW50TGFiZWx9KTsKLQkJCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCWNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShwYXJlbnQpOwotCQkvL30KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5UQVJHRVRfUlVOVElNRV9MQkwpKTsKLQkJQ29tYm8gc2VydmVyVGFyZ2V0Q29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXNlcnZlclRhcmdldENvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlCdXR0b24gbmV3U2VydmVyVGFyZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJbmV3U2VydmVyVGFyZ2V0QnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSkpOwotCQluZXdTZXJ2ZXJUYXJnZXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ld1NlcnZlclRhcmdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UubGF1bmNoTmV3UnVudGltZVdpemFyZChnZXRTaGVsbCgpLCBtb2RlbCk7Ci0JCQl9Ci0JCX0pOwotCQlDb250cm9sW10gZGVwcyA9IG5ldyBDb250cm9sW117bGFiZWwsIG5ld1NlcnZlclRhcmdldEJ1dHRvbn07Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oc2VydmVyVGFyZ2V0Q29tYm8sIElKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9UQVJHRVRfSUQsIGRlcHMpOwotCQlpZiAoc2VydmVyVGFyZ2V0Q29tYm8uZ2V0VmlzaWJsZUl0ZW1Db3VudCgpICE9IDApCi0JCQlzZXJ2ZXJUYXJnZXRDb21iby5zZWxlY3QoMCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgaGFuZGxlTmV3UHJvamVjdEJ1dHRvblByZXNzZWQoKSB7Ci0JLy8gSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIGRtID0gZ2V0TmV3UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKCk7Ci0JLy8KLQkvLyBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhwcm9qZWN0Q29tYm8uZ2V0U2hlbGwoKSwgZ2V0TmV3UHJvamVjdFdpemFyZChkbSkpOwotCS8vIGRpYWxvZy5jcmVhdGUoKTsKLQkvLyBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDUwMCwgNTAwKTsKLQkvLyBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkvLyBtb2RlbC5ub3RpZnlWYWxpZFZhbHVlc0NoYW5nZShKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWwuUFJPSkVDVF9OQU1FKTsKLQkvLyBTdHJpbmcgcHJvamVjdE5hbWUgPSBkbS5nZXRTdHJpbmdQcm9wZXJ0eShFZGl0TW9kZWxPcGVyYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FKTsKLQkvLyBtb2RlbC5zZXRQcm9wZXJ0eShKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0JLy8gbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbC5PVkVSV1JJVEVfUFJPSkVDVCwgdHJ1ZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBwcm90ZWN0ZWQgSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIGdldE5ld1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JLy8KLQkvLyBwcm90ZWN0ZWQgV1RQV2l6YXJkIGdldE5ld1Byb2plY3RXaXphcmQoSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIGFNb2RlbCkgewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldERpYWxvZ1NldHRpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGVOYW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgZmlsZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlmaWxlTGFiZWwuc2V0VGV4dChnZXRGaWxlSW1wb3J0TGFiZWwoKSk7Ci0KLQkJLy8gc2V0dXAgY29tYm8KLQkJZmlsZU5hbWVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZmlsZU5hbWVDb21iby5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCi0JCS8vIHNldHVwIGJyb3dzZSBidXR0b24KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVGaWxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhmaWxlTmFtZUNvbWJvLCBJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBuZXcgQ29udHJvbFtde2ZpbGVMYWJlbCwgYnJvd3NlQnV0dG9ufSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmlsZUJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhmaWxlTmFtZUNvbWJvLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhnZXRGaWx0ZXJFeHByZXNzaW9uKCkpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkKLQkJCW1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0KLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfTEFCRUwgKyBnZXRGaWxlTmFtZXNTdG9yZUlEKCkpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBpZS4tIG5vIHNldHRpbmdzIHN0b3JlZAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzb3VyY2VOYW1lc1tpXSA9PSBudWxsKQotCQkJCQlzb3VyY2VOYW1lc1tpXSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmaWxlTmFtZUNvbWJvLnNldEl0ZW1zKHNvdXJjZU5hbWVzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIHNvdXJjZSBuYW1lcyBoaXN0b3J5Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKSB7Ci0JCQkJc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nWzBdOwotCQkJfQotCQkJLy8gcmlwIG91dCBhbnkgZW1wdHkgZmlsZW5hbWVzIGFuZCB0cmltIGxlbmd0aCB0byA1Ci0JCQlBcnJheUxpc3QgbmV3TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aCAmJiBpIDwgNTsgaSsrKSB7Ci0JCQkJaWYgKHNvdXJjZU5hbWVzW2ldLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbmV3TmFtZXMuYWRkKHNvdXJjZU5hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dCA9IGZpbGVOYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQkJbmV3TmFtZXMucmVtb3ZlKHRleHQpOwotCQkJbmV3TmFtZXMuYWRkKDAsIHRleHQpOwotCQkJc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nW25ld05hbWVzLnNpemUoKV07Ci0JCQluZXdOYW1lcy50b0FycmF5KHNvdXJjZU5hbWVzKTsKLQotCQkJLy8gc291cmNlTmFtZXMgPSBhZGRUb0hpc3Rvcnkoc291cmNlTmFtZXMsCi0JCQkvLyBnZXRKMkVFSW1wb3J0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoSjJFRUltcG9ydERhdGFNb2RlbC5GSUxFX05BTUUpKTsKLQkJCXNldHRpbmdzLnB1dChTVE9SRV9MQUJFTCArIGdldEZpbGVOYW1lc1N0b3JlSUQoKSwgc291cmNlTmFtZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTXVzdCBvdmVycmlkZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNlbnRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JfQotCi0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUV4cG9ydFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUV4cG9ydFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmN2JiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVFeHBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA0LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRU1vZHVsZUV4cG9ydFBhZ2UgZXh0ZW5kcyBKMkVFRXhwb3J0UGFnZSB7Ci0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEoyRUVNb2R1bGVFeHBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9ERVNUSU5BVElPTiwgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9FWElTVElOR307Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlSW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlSW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTdhMWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUltcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDQsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFTW9kdWxlSW1wb3J0UGFnZSBleHRlbmRzIEoyRUVJbXBvcnRQYWdlIHsKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgSjJFRU1vZHVsZUltcG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgZ2V0SW5mb3BvcElEKCkpOwotCQljcmVhdGVTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VydmVyRWFyQW5kU3RhbmRhbG9uZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJbmV3IFNlcnZlckVhckFuZFN0YW5kYWxvbmVHcm91cChjb21wb3NpdGUsIGdldERhdGFNb2RlbCgpLmdldE5lc3RlZE1vZGVsKElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pLCBzeW5jaEhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIElKMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9UQVJHRVRfSUQsIElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FQVJfQ09NUE9ORU5UX05BTUUsIElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVzRGVwZW5kZW5jeVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZXNEZXBlbmRlbmN5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODJlOTcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZXNEZXBlbmRlbmN5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQ2xhc3NQYXRoU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQ2xhc3NwYXRoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotLyoKLSAqIENyZWF0ZWQgb24gTm92IDEzLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kCi0gKiBDb21tZW50cwotICovCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVNb2R1bGVzRGVwZW5kZW5jeVBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIGltcGxlbWVudHMgSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgYXZhaWxhYmxlSmFyc1ZpZXdlcjsKLQotCXB1YmxpYyBKMkVFTW9kdWxlc0RlcGVuZGVuY3lQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9ERVNDKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCXVwZGF0ZUphclZpZXdlcigpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUphclZpZXdlcigpIHsKLSAgICAgICAgQ2xhc3NQYXRoU2VsZWN0aW9uIGNsYXNzUGF0aFNlbGVjdGlvbiA9IChDbGFzc1BhdGhTZWxlY3Rpb24pZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoQ0xBU1NQQVRIX1NFTEVDVElPTik7Ci0KLQkJaWYgKGF2YWlsYWJsZUphcnNWaWV3ZXIuZ2V0SW5wdXQoKSAhPSBjbGFzc1BhdGhTZWxlY3Rpb24pIHsKLQkJCWF2YWlsYWJsZUphcnNWaWV3ZXIuc2V0SW5wdXQoY2xhc3NQYXRoU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0VKQl9XSVpBUkRfUDMpOwotCQlMYWJlbCBwcm9qZWN0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXByb2plY3RMYWJlbC5zZXRUZXh0KFdvcmtiZW5jaE1lc3NhZ2VzLk5ld1Byb2plY3RfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCVRleHQgcHJvamVjdFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3RUZXh0LCBQUk9KRUNUX05BTUUsIG51bGwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlwcm9qZWN0VGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBlYXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWFyTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfUFJPSkVDVF9GT1JfTU9EVUxFX0NSRUFUSU9OKSk7Ci0JCVRleHQgZWFyVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoZWFyVGV4dCwgRUFSX0NPTVBPTkVOVF9OQU1FLCBudWxsKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZWFyVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBzcGFjZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzcGFjZXJMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBqYXJzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWphcnNMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX0FWQUlMQUJMRV9KQVJTKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJamFyc0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCUNvbXBvc2l0ZSB0YWJsZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWdkLmhlaWdodEhpbnQgPSA2MDsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQl0YWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJR3JpZExheW91dCB0YWJsZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXRhYmxlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdGFibGVDb21wb3NpdGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJY3JlYXRlQXZhaWxhYmxlSmFyc0xpc3QodGFibGVDb21wb3NpdGUpOwotCi0JCXNwYWNlckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNwYWNlckxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGNsYXNzcGF0aExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljbGFzc3BhdGhMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX0NMQVNTUEFUSCkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNsYXNzcGF0aExhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCVRleHQgY2xhc3NwYXRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSk7Ci0JCS8vVE9ETyBzeW5jaGhlbHBlciB3b3JrIHdpdGggZmxleGlibGUgcHJvamVjdAotCQkvL3N5bmNoSGVscGVyLnN5bmNoVGV4dChjbGFzc3BhdGhUZXh0LCBGbGV4aWJsZUoyRUVNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbC5KQVJfTElTVF9URVhUX1VJLCBudWxsKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZC5oZWlnaHRIaW50ID0gMzA7Ci0JCWNsYXNzcGF0aFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdmFpbGFibGVKYXJzTGlzdChDb21wb3NpdGUgbGlzdEdyb3VwKSB7Ci0JCWF2YWlsYWJsZUphcnNWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChsaXN0R3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCQlhZGRSZXNpemVMaXN0ZW5lclRvVGFibGUoKTsKLQkJQXZhaWxhYmxlSmFyc1Byb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEF2YWlsYWJsZUphcnNQcm92aWRlcigpOwotCQlhdmFpbGFibGVKYXJzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JCWF2YWlsYWJsZUphcnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0JCWF2YWlsYWJsZUphcnNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWF2YWlsYWJsZUpBUkNoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCVRhYmxlIHRhYmxlID0gYXZhaWxhYmxlSmFyc1ZpZXdlci5nZXRUYWJsZSgpOwotCQkvLyBzZXQgdXAgdGFibGUgbGF5b3V0Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlhdmFpbGFibGVKYXJzVmlld2VyLnNldFNvcnRlcihudWxsKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gdGFibGUgY29sdW1ucwotCQlUYWJsZUNvbHVtbiBmaWxlTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQlmaWxlTmFtZUNvbHVtbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RBQkxFX01PRFVMRSkpOwotCQlmaWxlTmFtZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gcHJvamVjdENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQlwcm9qZWN0Q29sdW1uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVEFCTEVfUFJPSkVDVCkpOwotCQlwcm9qZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQl1cGRhdGVKYXJWaWV3ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdmFpbGFibGVKQVJDaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCWVsZW1lbnQuc2V0U2VsZWN0ZWQoZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJU3RyaW5nIGNsYXNzRW50cnkgPSBlbGVtZW50LmdldFRleHQoKTsKLQkJSURhdGFNb2RlbCB1cGRhdGVNYW5pZmVzdCA9IChJRGF0YU1vZGVsKSBtb2RlbC5nZXRQcm9wZXJ0eShORVNURURfVVBEQVRFX01BTklGRVNUX0RNKTsKLQkJTGlzdCBjbGFzc3BhdGhMaXN0ID0gKExpc3QpIHVwZGF0ZU1hbmlmZXN0LmdldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTElTVCk7Ci0JCWlmIChldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCWlmICghY2xhc3NwYXRoTGlzdC5jb250YWlucyhjbGFzc0VudHJ5KSkgewotCQkJCWNsYXNzcGF0aExpc3QuYWRkKGNsYXNzRW50cnkpOwotCQkJfQotCQl9IGVsc2UgaWYgKGNsYXNzcGF0aExpc3QuY29udGFpbnMoY2xhc3NFbnRyeSkpIHsKLQkJCWNsYXNzcGF0aExpc3QucmVtb3ZlKGNsYXNzRW50cnkpOwotCQl9Ci0JCXVwZGF0ZU1hbmlmZXN0LnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTElTVCwgY2xhc3NwYXRoTGlzdCk7Ci0vLwkJdXBkYXRlTWFuaWZlc3QucHJvcGVydHlDaGFuZ2VkKG5ldyBXVFBPcGVyYXRpb25EYXRhTW9kZWxFdmVudCh1cGRhdGVNYW5pZmVzdCwgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuSkFSX0xJU1QsIFdUUE9wZXJhdGlvbkRhdGFNb2RlbEV2ZW50LlBST1BFUlRZX0NIRykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc2l6ZUxpc3RlbmVyVG9UYWJsZSgpIHsKLQkJVGFibGUgYVRhYmxlID0gYXZhaWxhYmxlSmFyc1ZpZXdlci5nZXRUYWJsZSgpOwotCQlhVGFibGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCWJvb2xlYW4gZlJlc2l6ZWQgPSBmYWxzZTsKLQotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBUYWJsZSAmJiAhZlJlc2l6ZWQpIHsKLQkJCQkJZmluYWwgVGFibGUgdGFibGUgPSAoVGFibGUpIGUud2lkZ2V0OwotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkgfHwgZlJlc2l6ZWQpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlQb2ludCBzaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJCQkJCWlmIChzaXplLnggPiA0KSB7Ci0JCQkJCQkJCXNldFJlc2l6ZWQodGFibGUpOwotCQkJCQkJCQlpbnQgbmV3U2l6ZSA9IHNpemUueCAvIDIgLSAyOwotCQkJCQkJCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCQkJCQkJCWlmIChjb2x1bW4gIT0gbnVsbCAmJiAhY29sdW1uLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJCWNvbHVtbi5zZXRXaWR0aChuZXdTaXplKTsKLQkJCQkJCQkJY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDEpOwotCQkJCQkJCQlpZiAoY29sdW1uICE9IG51bGwgJiYgIWNvbHVtbi5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCQljb2x1bW4uc2V0V2lkdGgobmV3U2l6ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFJlc2l6ZWQoVGFibGUgdGFibGUpIHsKLQkJCQlmUmVzaXplZCA9IHRydWU7Ci0JCQkJdGFibGUucmVtb3ZlQ29udHJvbExpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNGJiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDgsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ldyBleHRlbmRzIEoyRUVJbXBvcnRQYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9MQUJFTCA9ICJKMkVFX1VUSUxJVFlfSkFSX0xJU1RfSU1QT1JUXyI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiB1c2VBbHRlcm5hdGVSb290QnRuOwotCi0JcHJpdmF0ZSBCdXR0b24gb3ZlcndyaXRlUHJvamVjdENoZWNrYm94OwotCi0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgYXZhaWxhYmxlSkFSc1ZpZXdlcjsKLQotCXByb3RlY3RlZCBib29sZWFuIHV0aWxKYXJTZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci0KLQlwcml2YXRlIENvbWJvIGF2YWlsYWJsZUphcnNDb21ibzsKLQotCXByb3RlY3RlZCBCdXR0b24gbGlua2VkUGF0aENoZWNrYm94OwotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ldyhJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8wIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfVVRJTElUWV9KQVJfV0laQVJEX1AxKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljcmVhdGVVdGlsaXR5SmFyRmlsZU5hbWVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJY3JlYXRlTGlua2VkUGF0aFZhcmlhYmxlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUpBUnNDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJLyogY3JlYXRlT3ZlcndyaXRlQ2hlY2tib3goY29tcG9zaXRlKTsgKi8KLQotCQlyZXN0b3JlV2lkZ2V0VmFsdWVzKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVV0aWxpdHlKYXJGaWxlTmFtZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGZpbGVOYW1lR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWZpbGVOYW1lR3JvdXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWZpbGVOYW1lR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWZpbGVOYW1lR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgZmlsZUxhYmVsID0gbmV3IExhYmVsKGZpbGVOYW1lR3JvdXAsIFNXVC5OT05FKTsKLQkJZmlsZUxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8zIikpOyAvLyROT04tTkxTLTEkCi0JCWZpbGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCS8vIHNldHVwIGNvbWJvCi0JCWF2YWlsYWJsZUphcnNDb21ibyA9IG5ldyBDb21ibyhmaWxlTmFtZUdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWF2YWlsYWJsZUphcnNDb21iby5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCi0JCS8vIHNldHVwIGJyb3dzZSBidXR0b24KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihmaWxlTmFtZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhhdmFpbGFibGVKYXJzQ29tYm8sIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFWQUlMQUJMRV9KQVJTX0RJUkVDVE9SWSwgbmV3IENvbnRyb2xbXXtmaWxlTGFiZWwsIGJyb3dzZUJ1dHRvbn0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpbmtlZFBhdGhWYXJpYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQotCQlHcm91cCBsaW5rZWRQYXRoR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxpbmtlZFBhdGhHcm91cC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxpbmtlZFBhdGhHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGlua2VkUGF0aEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSBjaGVja2JveEdyb3VwID0gbmV3IENvbXBvc2l0ZShsaW5rZWRQYXRoR3JvdXAsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBjaGVja2JveExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJY2hlY2tib3hHcm91cC5zZXRMYXlvdXQoY2hlY2tib3hMYXlvdXQpOwotCQljaGVja2JveEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWxpbmtlZFBhdGhDaGVja2JveCA9IG5ldyBCdXR0b24oY2hlY2tib3hHcm91cCwgU1dULkNIRUNLKTsKLQkJbGlua2VkUGF0aENoZWNrYm94LnNldFRleHQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlUZXh0IGxpbmtlZFBhdGhUZXh0ID0gbmV3IFRleHQoY2hlY2tib3hHcm91cCwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwpOwotCQlsaW5rZWRQYXRoVGV4dC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNSIpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSB0ZXh0R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJdGV4dEdyaWREYXRhLmhlaWdodEhpbnQgPSA1MDsKLQkJdGV4dEdyaWREYXRhLndpZHRoSGludCA9IDM1MDsKLQkJbGlua2VkUGF0aFRleHQuc2V0TGF5b3V0RGF0YSh0ZXh0R3JpZERhdGEpOwotCQlsaW5rZWRQYXRoVGV4dC5zZXRCYWNrZ3JvdW5kKGNoZWNrYm94R3JvdXAuZ2V0QmFja2dyb3VuZCgpKTsKLQotCQkvLyBzZXR1cCBjb21ibwotCQlDb21ibyBhdmFpbGFibGVMaW5rZWRQYXRoc0NvbWJvID0gbmV3IENvbWJvKGxpbmtlZFBhdGhHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlhdmFpbGFibGVMaW5rZWRQYXRoc0NvbWJvLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0KLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhhdmFpbGFibGVMaW5rZWRQYXRoc0NvbWJvLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5MSU5LRURfUEFUSF9WQVJJQUJMRSwgbmV3IENvbnRyb2xbXXthdmFpbGFibGVMaW5rZWRQYXRoc0NvbWJvfSk7Ci0KLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChsaW5rZWRQYXRoQ2hlY2tib3gsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9MSU5LRURfUEFUSF9WQVJJQUJMRSwgbmV3IENvbnRyb2xbXXthdmFpbGFibGVMaW5rZWRQYXRoc0NvbWJvfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBicm93c2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coYnJvd3NlQnV0dG9uLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5TRUxFQ1RfRElSRUNUT1JZX0RMRykpOwotCi0JCVN0cmluZyBkaXJOYW1lID0gZ2V0QnJvd3NlU3RhcnRMb2NhdGlvbigpOwotCi0JCWlmICghaXNOdWxsT3JFbXB0eShkaXJOYW1lKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXJOYW1lKTsKLQkJfQotCi0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKQotCQkJYXZhaWxhYmxlSmFyc0NvbWJvLnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJyb3dzZVN0YXJ0TG9jYXRpb24oKSB7Ci0JCWlmIChhdmFpbGFibGVKYXJzQ29tYm8uZ2V0VGV4dCgpICE9IG51bGwgJiYgYXZhaWxhYmxlSmFyc0NvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gYXZhaWxhYmxlSmFyc0NvbWJvLmdldFRleHQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQkvKgotCSAqIFVwZGF0ZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgYWxsIGJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25FbmFibGVtZW50cygpIHsKLQotCQl1dGlsSmFyU2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXZhaWxhYmxlSmFyc0xpc3QoQ29tcG9zaXRlIGxpc3RHcm91cCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobGlzdEdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZ0RhdGEud2lkdGhIaW50ID0gMjAwOwotCQlnRGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ0RhdGEpOwotCQlBdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyIGF2YWlsYWJsZVV0aWxKQVJzUHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlcigpOwotCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihhdmFpbGFibGVVdGlsSkFSc1Byb3ZpZGVyKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGF2YWlsYWJsZVV0aWxKQVJzUHJvdmlkZXIpOwotCi0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0KLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRJbnB1dChtb2RlbCk7Ci0KLQkJLyogZ2V0TW9kZWwoKS5hZGRMaXN0ZW5lcihnZXRPcGVyYXRpb25EYXRhTW9kZWxMaXN0ZW5lcigpKTsgKi8KLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja0JveFRhYmxlVmlld2VyKGF2YWlsYWJsZUpBUnNWaWV3ZXIsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfSkFSX0xJU1QsIG51bGwpOwotCi0KLQkJbW9kZWwuYWRkTGlzdGVuZXIobmV3IElEYXRhTW9kZWxMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFWQUlMQUJMRV9KQVJTX0RJUkVDVE9SWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKQotCQkJCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldElucHV0KG1vZGVsKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9KQVJfTElTVCwgbmV3IE9iamVjdFswXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGlvbiA9IG5ldyBPYmplY3RbYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCXNlbGVjdGlvbltpXSA9IGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0RWxlbWVudEF0KGkpOwotCQl9Ci0JCW1vZGVsLnNldFByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfSkFSX0xJU1QsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfU0VMRUNUX0FMTF9VVElMX0JVVFRPTikpOyAvLyROT04tTkxTLTEkID0gIlNlbGVjdCBBbGwiCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIyOwotCQlnZC53aWR0aEhpbnQgPSAxMjA7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9VVElMX0JVVFRPTikpOyAvLyROT04tTkxTLTEkID0gIkRlc2VsZWN0IEFsbCIKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZC5oZWlnaHRIaW50ID0gMjI7Ci0JCWdkLndpZHRoSGludCA9IDEyMDsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZU5lc3RlZFByb2plY3RPdmVyd3JpdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBhbGxvd05lc3RlZE92ZXJ3cml0ZUNoZWNrYm94OwotCQlhbGxvd05lc3RlZE92ZXJ3cml0ZUNoZWNrYm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWFsbG93TmVzdGVkT3ZlcndyaXRlQ2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX09WRVJXUklURV9ORVNURUQpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChhbGxvd05lc3RlZE92ZXJ3cml0ZUNoZWNrYm94LCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfSUZfTkVDRVNTQVJZLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKQVJzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWdyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9KQVJTX0dST1VQKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KMkVFX1VUSUxJVFlfSkFSX0xJU1RFQVJfSU1QT1JUX1NFTEVDVF9VVElMX0pBUlNfVE9fQkVfUFJPSkVDVFMpKTsKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQkvLyBjcmVhdGUgamFycyBjaGVjayBib3ggdmlld2VyCi0JCWNyZWF0ZUF2YWlsYWJsZUphcnNMaXN0KGdyb3VwKTsKLQkJY3JlYXRlQnV0dG9uc0dyb3VwKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdE9wdGlvbnNHcm91cAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU92ZXJ3cml0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlvdmVyd3JpdGVQcm9qZWN0Q2hlY2tib3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJb3ZlcndyaXRlUHJvamVjdENoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV82IikpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gob3ZlcndyaXRlUHJvamVjdENoZWNrYm94LCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfSUZfTkVDRVNTQVJZLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKQVJzQ29tcG9zaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuc2V0QWxsR3JheWVkKCFlbmFibGVkKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlVUSUxJVFlfSkFSX0xJU1QsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9JRl9ORUNFU1NBUlksIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkxJTktFRF9QQVRIX1ZBUklBQkxFfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gaWUuLSBubyBzZXR0aW5ncyBzdG9yZWQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc291cmNlTmFtZXNbaV0gPT0gbnVsbCkKLQkJCQkJc291cmNlTmFtZXNbaV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYXZhaWxhYmxlSmFyc0NvbWJvLnNldEl0ZW1zKHNvdXJjZU5hbWVzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIHNvdXJjZSBuYW1lcyBoaXN0b3J5Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IHNldHRpbmdzLmdldEFycmF5KFNUT1JFX0xBQkVMICsgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKSB7Ci0JCQkJc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nWzBdOwotCQkJfQotCi0JCQlTdHJpbmcgbmV3TmFtZSA9IGF2YWlsYWJsZUphcnNDb21iby5nZXRUZXh0KCk7Ci0KLQkJCS8vIHJpcCBvdXQgYW55IGVtcHR5IGZpbGVuYW1lcyBhbmQgdHJpbSBsZW5ndGggdG8gNQotCQkJQXJyYXlMaXN0IG5ld05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGggJiYgaSA8IDU7IGkrKykgewotCQkJCWlmIChzb3VyY2VOYW1lc1tpXS50cmltKCkubGVuZ3RoKCkgPiAwICYmICFuZXdOYW1lLmVxdWFscyhzb3VyY2VOYW1lc1tpXSkpIHsKLQkJCQkJbmV3TmFtZXMuYWRkKHNvdXJjZU5hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdOYW1lcy5hZGQoMCwgYXZhaWxhYmxlSmFyc0NvbWJvLmdldFRleHQoKSk7Ci0JCQlzb3VyY2VOYW1lcyA9IG5ldyBTdHJpbmdbbmV3TmFtZXMuc2l6ZSgpXTsKLQkJCW5ld05hbWVzLnRvQXJyYXkoc291cmNlTmFtZXMpOwotCi0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfTEFCRUwgKyBnZXRGaWxlTmFtZXNTdG9yZUlEKCksIHNvdXJjZU5hbWVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbGVOYW1lc1N0b3JlSUQoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKLQkJcmV0dXJuICJVVElMIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsZUltcG9ydExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxMjdiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxMywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3IGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZCcm93c2VCdXR0b25MYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9MQUJFTCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDMwNTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb247Ci0KLQlwcml2YXRlIENvbWJvIHJlc291cmNlTmFtZUNvbWJvOwotCi0JcHJpdmF0ZSBCdXR0b24gY29weUphckludG9FQVI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBsaW5rSmFySW50b0VBUjsKLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUxpbmtlZFByb2plY3RzOwotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlUHJvamVjdHM7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGJpbmFyeUltcG9ydENoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVQcm9qZWN0Um9vdENoZWNrYm94OwotCi0KLQlwcm90ZWN0ZWQgVGV4dCBwcm9qZWN0Um9vdExvY2F0aW9uVGV4dDsKLQotCXByaXZhdGUgTGFiZWwgbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jaGluZzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8xIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgR3JvdXAgcHJvamVjdFJvb3RDb21wb3NpdGU7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB0aXRsZUltYWdlCi0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciB0aXRsZUltYWdlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgdGl0bGUsIHRpdGxlSW1hZ2UpOwotCQlzZXRUaXRsZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9VVElMSVRZX0pBUl9XSVpBUkRfUDIpOwotCX0KLQotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3KElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXRoaXMuY3VycmVudFJlc291cmNlU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRUaXRsZShUSVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCXB1YmxpYyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3KElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShUSVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1QsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfUk9PVH07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZUVBUlByb2plY3RHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVVdGlsaXR5SmFySW1wb3J0VHlwZXMoY29tcG9zaXRlKTsKLQkJY3JlYXRlUHJvamVjdENyZWF0aW9uT3B0aW9ucyhjb21wb3NpdGUpOwotCi0JCXNldHVwQmFzZWRPbkluaXRpYWxTZWxlY3Rpb25zKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVV0aWxpdHlKYXJJbXBvcnRUeXBlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIHR5cGVzR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXR5cGVzR3JvdXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8yIikpOyAvLyROT04tTkxTLTEkCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCXR5cGVzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXR5cGVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlUHJvamVjdHMgPSBuZXcgQnV0dG9uKHR5cGVzR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNyZWF0ZVByb2plY3RzLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGNyZWF0ZVByb2plY3RzLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfUFJPSkVDVCwgbnVsbCk7Ci0KLQkJY3JlYXRlTGlua2VkUHJvamVjdHMgPSBuZXcgQnV0dG9uKHR5cGVzR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNyZWF0ZUxpbmtlZFByb2plY3RzLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGNyZWF0ZUxpbmtlZFByb2plY3RzLCBJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfTElOS0VEX1BST0pFQ1QsIG51bGwpOwotCi0JCWNvcHlKYXJJbnRvRUFSID0gbmV3IEJ1dHRvbih0eXBlc0dyb3VwLCBTV1QuUkFESU8pOwotCQljb3B5SmFySW50b0VBUi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hSYWRpbyhjb3B5SmFySW50b0VBUiwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09QWSwgbnVsbCk7Ci0KLQkJbGlua0phckludG9FQVIgPSBuZXcgQnV0dG9uKHR5cGVzR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWxpbmtKYXJJbnRvRUFSLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNiIpKTsgLy8kTk9OLU5MUy0xJAotCQkvKiBsaW5rSmFySW50b0VBUi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUeXBlU2VsZWN0aW9uTGlzdGVuZXIoKSk7ICovCi0JCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8obGlua0phckludG9FQVIsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkxJTktfSU1QT1JULCBudWxsKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RDcmVhdGlvbk9wdGlvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUdyb3VwIHByb2plY3RPcHRpb25zR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXByb2plY3RPcHRpb25zR3JvdXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV83IikpOyAvLyROT04tTkxTLTEkCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCXByb2plY3RPcHRpb25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RPcHRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlQmluYXJ5SW1wb3J0Q2hlY2tib3gocHJvamVjdE9wdGlvbnNHcm91cCk7Ci0KLQkJb3ZlcnJpZGVQcm9qZWN0Um9vdENoZWNrYm94ID0gbmV3IEJ1dHRvbihwcm9qZWN0T3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlvdmVycmlkZVByb2plY3RSb290Q2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8xMSIpKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVQcm9qZWN0Um9vdENvbXBvc2l0ZShwcm9qZWN0T3B0aW9uc0dyb3VwKTsKLQotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KG92ZXJyaWRlUHJvamVjdFJvb3RDaGVja2JveCwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUlJJREVfUFJPSkVDVF9ST09ULCBuZXcgQ29udHJvbFtdey8qCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICogbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWwsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICogcHJvamVjdFJvb3RMb2NhdGlvblRleHQsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICogYnJvd3NlQnV0dG9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICovfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjcHJvcGVydHlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGlmIChzeW5jaGluZykgcmV0dXJuOwotCQkvLyBzeW5jaGluZyA9IHRydWU7Ci0JCS8vIGlmIChKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuQ1JFQVRFX1BST0pFQ1QuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKQotCQkvLyB8fCBKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuTElOS19JTVBPUlQuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkvLwotCQkvLyBib29sZWFuIHNob3VsZENyZWF0ZVByb2plY3QgPQotCQkvLyBnZXRNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuQ1JFQVRFX1BST0pFQ1QpOwotCQkvLyBib29sZWFuIGxpbmtJbXBvcnRlZENvbnRlbnQgPQotCQkvLyBnZXRNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuTElOS19JTVBPUlQpOwotCQkvLwotCQkvLyBjcmVhdGVQcm9qZWN0cy5zZXRTZWxlY3Rpb24oc2hvdWxkQ3JlYXRlUHJvamVjdCAmJiAhbGlua0ltcG9ydGVkQ29udGVudCk7Ci0JCS8vIGNyZWF0ZUxpbmtlZFByb2plY3RzLnNldFNlbGVjdGlvbihzaG91bGRDcmVhdGVQcm9qZWN0ICYmIGxpbmtJbXBvcnRlZENvbnRlbnQpOwotCQkvLyBsaW5rSmFySW50b0VBUi5zZXRTZWxlY3Rpb24oIXNob3VsZENyZWF0ZVByb2plY3QgJiYgbGlua0ltcG9ydGVkQ29udGVudCk7Ci0JCS8vIGNvcHlKYXJJbnRvRUFSLnNldFNlbGVjdGlvbighc2hvdWxkQ3JlYXRlUHJvamVjdCAmJiAhbGlua0ltcG9ydGVkQ29udGVudCk7Ci0JCS8vICAgICAgICAgICAgIAotCQkvLyBlbmFibGVQcm9qZWN0T3B0aW9ucyhzaG91bGRDcmVhdGVQcm9qZWN0KTsKLQkJLy8KLQkJLy8gfSBlbHNlCi0JCS8vIGlmKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbC5PVkVSUklERV9QUk9KRUNUX1JPT1QuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkKLQkJLy8gewotCQkvLyBib29sZWFuIG92ZXJyaWRlUHJvamVjdFJvb3QgPQotCQkvLyBnZXRNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuT1ZFUlJJREVfUFJPSkVDVF9ST09UKTsKLQkJLy8gcHJvamVjdFJvb3RMb2NhdGlvblRleHQuc2V0RW5hYmxlZChvdmVycmlkZVByb2plY3RSb290KTsKLQkJLy8gfQotCQkvLyBzeW5jaGluZyA9IGZhbHNlOwotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBvZiB0aGlzIGdyb3VwJ3MKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgdmlzdWFsIGNvbXBvbmVudHMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVBUlByb2plY3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJR3JvdXAgZWFyR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWVhckdyb3VwLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQllYXJHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZWFyR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gUHJvamVjdCBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TGFiZWwgPSBuZXcgTGFiZWwoZWFyR3JvdXAsIFNXVC5OT05FKTsKLQkJcHJvamVjdExhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOSIpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBQcm9qZWN0IGNvbWJvCi0JCXJlc291cmNlTmFtZUNvbWJvID0gbmV3IENvbWJvKGVhckdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJcmVzb3VyY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhyZXNvdXJjZU5hbWVDb21ibywgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1QsIG51bGwpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdFJvb3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlwcm9qZWN0Um9vdENvbXBvc2l0ZSA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcHJvamVjdFJvb3RDb21wb3NpdGUuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5QUk9KRUNUX0xPQ0FUSU9OU19HUk9VUCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJcHJvamVjdFJvb3RDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RSb290Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKHByb2plY3RSb290Q29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1BST0pFQ1RfR1JPVVBfREVTQ1JJUFRJT04pKTsKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQltb2R1bGVQcm9qZWN0TG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChwcm9qZWN0Um9vdENvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQltb2R1bGVQcm9qZWN0TG9jYXRpb25MYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlVTRV9ERUZBVUxUX1JPT1RfUkFESU8pKTsKLQkJbW9kdWxlUHJvamVjdExvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJcHJvamVjdFJvb3RMb2NhdGlvblRleHQgPSBuZXcgVGV4dChwcm9qZWN0Um9vdENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXByb2plY3RSb290TG9jYXRpb25UZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlwcm9qZWN0Um9vdExvY2F0aW9uVGV4dC5zZXRUZXh0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQlwcm9qZWN0Um9vdExvY2F0aW9uVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsgLyogZGlzYWJsZWQgYnkgZGVmYXVsdCAqLwotCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJvamVjdFJvb3RDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoZGVmQnJvd3NlQnV0dG9uTGFiZWwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlUm9vdFByb2plY3RCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChwcm9qZWN0Um9vdExvY2F0aW9uVGV4dCwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9ST09ULCBuZXcgQ29udHJvbFtde21vZHVsZVByb2plY3RMb2NhdGlvbkxhYmVsLCBwcm9qZWN0Um9vdExvY2F0aW9uVGV4dCwgYnJvd3NlQnV0dG9ufSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQmluYXJ5SW1wb3J0Q2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCkgewotCQliaW5hcnlJbXBvcnRDaGVja2JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQliaW5hcnlJbXBvcnRDaGVja2JveC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzEwIikpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYmluYXJ5SW1wb3J0Q2hlY2tib3gsIElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkJJTkFSWV9JTVBPUlQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSb290UHJvamVjdEJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGJyb3dzZUJ1dHRvbi5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuU0VMRUNUX0RJUkVDVE9SWV9ETEcpKTsKLQotCQlTdHJpbmcgZGlyTmFtZSA9IGdldEJyb3dzZVN0YXJ0TG9jYXRpb24oKTsKLQotCQlpZiAoIWlzTnVsbE9yRW1wdHkoZGlyTmFtZSkpIHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQkJaWYgKHBhdGguZXhpc3RzKCkpCi0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyTmFtZSk7Ci0JCX0KLQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkKLQkJCXByb2plY3RSb290TG9jYXRpb25UZXh0LnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcm93c2VTdGFydExvY2F0aW9uKCkgewotCQlTdHJpbmcgdGV4dCA9IHByb2plY3RSb290TG9jYXRpb25UZXh0LmdldFRleHQoKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxPckVtcHR5KFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBhU3RyaW5nID09IG51bGwgfHwgYVN0cmluZy5sZW5ndGgoKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgcmVzb3VyY2UgbmFtZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQmFzZWRPbkluaXRpYWxTZWxlY3Rpb25zKCkgewotCi0JCWlmIChudWxsID09IGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbiB8fCBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IHNldHVwQmFzZWRPblJlZk9iamVjdFNlbGVjdGlvbigpKQotCQkJcmV0dXJuOyAvLyBubwotCQkvLyBzZXR1cAotCQkvLyBuZWVkZWQKLQotCQlqYXZhLnV0aWwuTGlzdCBzZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBhZW51bSA9IGN1cnJlbnRSZXNvdXJjZVNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWVudW0uaGFzTmV4dCgpKSB7Ci0JCQlJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gKElSZXNvdXJjZSkgYWVudW0ubmV4dCgpOwotCQkJLy8gZG8gbm90IGFkZCBpbmFjY2Vzc2libGUgZWxlbWVudHMKLQkJCWlmIChjdXJyZW50UmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJc2VsZWN0aW9ucy5hZGQoY3VycmVudFJlc291cmNlKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47IC8vIHNldHVwIG5vdCBuZWVkZWQgYW55bW9yZQotCi0JCWludCBzZWxlY3RlZFJlc291cmNlQ291bnQgPSBzZWxlY3Rpb25zLnNpemUoKTsKLQkJaWYgKHNlbGVjdGVkUmVzb3VyY2VDb3VudCA9PSAxKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBzZWxlY3Rpb25zLmdldCgwKTsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0ICkgewotCQkJCXJlc291cmNlTmFtZUNvbWJvLnNldFRleHQocmVzb3VyY2UuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSByZXNvdXJjZSBuYW1lIGZpZWxkIGJhc2VkIHVwb24gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0dXBCYXNlZE9uUmVmT2JqZWN0U2VsZWN0aW9uKCkgewotCi0JCWlmIChjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJT2JqZWN0IG8gPSBjdXJyZW50UmVzb3VyY2VTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmICghaXNNZXRhVHlwZVN1cHBvcnRlZChvKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBvOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVmKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQlyZXNvdXJjZU5hbWVDb21iby5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKS50b1N0cmluZygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNZXRhVHlwZVN1cHBvcnRlZChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEVBUkZpbGUgfHwgbyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVByb2plY3RPcHRpb25zKGJvb2xlYW4gZW5hYmxlZCkgewotCQkvLyBnZXRNb2RlbCgpLnNldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWwuQklOQVJZX0lNUE9SVCwgZW5hYmxlZCk7Ci0JCWJpbmFyeUltcG9ydENoZWNrYm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCW92ZXJyaWRlUHJvamVjdFJvb3RDaGVja2JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0JCWlmIChvdmVycmlkZVByb2plY3RSb290Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgJiYgZW5hYmxlZCkKLQkJCXByb2plY3RSb290TG9jYXRpb25UZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWVsc2UKLQkJCXByb2plY3RSb290TG9jYXRpb25UZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBtb2RlbC52YWxpZGF0ZVByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUKS5pc09LKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA0ODdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0KLS8qKgotICogPHA+Ci0gKiBVc2VkIHRvIGltcG9ydCBVdGlsaXR5IEphcnMgaW50byBzZXZlcmFsIEVjbGlwc2Ugd29ya2JlbmNoIGNvbmZpZ3VyYXRpb25zLiBUaGVzZSBjYW4gYmUgZXh0cmFjdGVkCi0gKiBhcyBlZGl0YWJsZSBwcm9qZWN0cywgYmluYXJ5IHByb2plY3RzLCBsaW5rZWQgcmVzb3VyY2VzIGluIHRoZSBFQVIgbW9kdWxlIG9yIGFjdHVhbCByZXNvdXJjZXMgaW4KLSAqIHRoZSBFQVIgbW9kdWxlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0YW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBvZiB0aGUgcGFnZSBvZiB0aGUgV2l6YXJkIHdoaWNoIGFsbG93cyB1c2VycyB0byBkZWZpbmUgdGhlCi0JICogdHlwZSBvZiBpbXBvcnQgdGhleSB3b3VsZCBsaWtlIHRvIGNhcnJ5IG91dC4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9UWVBFID0gIklNUE9SVF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RhbnQgdXNlZCB0byBpZGVudGlmeSB0aGUga2V5IG9mIHRoZSBwYWdlIG9mIHRoZSBXaXphcmQgdGhhdCBhbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGphcgotCSAqIGZpbGVzIGZvciBpbXBvcnQKLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9KQVJTID0gIlNFTEVDVF9KQVJTIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubwotCSAqIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3KElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgdGhlIGZvbGxvd2luZyBwYWdlczoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3fWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI0lNUE9SVF9UWVBFfSkKLQkgKiA8bGk+e0BsaW5rIEoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ld31hcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNTRUxFQ1RfSkFSU30pCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJdGhpcy5hZGRQYWdlKG5ldyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3KGdldERhdGFNb2RlbCgpLCBJTVBPUlRfVFlQRSwgc2VsZWN0aW9uKSk7Ci0JCXRoaXMuYWRkUGFnZShuZXcgSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlTmV3KGdldERhdGFNb2RlbCgpLCBTRUxFQ1RfSkFSUykpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KYXZhVXRpbGl0eUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDIxNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KYXZhVXRpbGl0eUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotLyoqCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQsIElFeGVjdXRhYmxlRXh0ZW5zaW9uewotCi0vLwlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkKLQlwdWJsaWMgSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSkFWQVVUSUxfQ09NUE9ORU5UX1dJWl9USVRMRSkpOwotCQkvL3NldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkFQUF9DTElFTlRfUFJPSkVDVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKLQkJYWRkUGFnZShuZXcgSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIEphdmFVdGlsaXR5Q29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlLlBBR0VfTkFNRSkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNnZXREZWZhdWx0UHJvdmlkZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ3VyYXRpb25FbGVtZW50LCBTdHJpbmcgYVByb3BlcnR5TmFtZSwgT2JqZWN0IHRoZURhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQljb25maWd1cmF0aW9uRWxlbWVudCA9IGFDb25maWd1cmF0aW9uRWxlbWVudDsKLS8vCQlkb1NldEluaXRpYWxpemVEYXRhKGFDb25maWd1cmF0aW9uRWxlbWVudCwgYVByb3BlcnR5TmFtZSwgdGhlRGF0YSk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRmluaXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KYXZhVXRpbGl0eUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KYXZhVXRpbGl0eUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDcyMGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSmF2YVV0aWxpdHlDb21wb25lbnRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLldTVFdlYlBsdWdpbjsKLQotCi0KLS8qKgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEphdmFVdGlsaXR5Q29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gIkphdmFVdGlsaXR5Q29tcG9uZW50Q3JlYXRpb25XaXphcmRQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBOZXdNb2R1bGVHcm91cEV4IHByb2plY3ROYW1lR3JvdXA7CQotCQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXByb3RlY3RlZCBKYXZhVXRpbGl0eUNvbXBvbmVudENyZWF0aW9uV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJCi0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpBVkFVVElMSVRZX01BSU5fUEdfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSkFWQVVUSUxJVFlfTUFJTl9QR19ERVNDKSk7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFdTVFdlYlBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy9mdWxsL3dpemJhbi9uZXd3cHJqX3dpei5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0JCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfSkFWQV9DT01QT05FTlRfV0laQVJEX1AxKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUV9OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQl0b3Auc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl0b3Auc2V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJY3JlYXRlUHJvamVjdE5hbWVHcm91cChjb21wb3NpdGUpOwotCQlDb21wb3NpdGUgZGV0YWlsID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJZGV0YWlsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZGV0YWlsLnNldERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0KLQkJcmV0dXJuIHRvcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvamVjdE5hbWVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXByb2plY3ROYW1lR3JvdXAgPSBuZXcgTmV3TW9kdWxlR3JvdXBFeChwYXJlbnQsIFNXVC5OVUxMLCBtb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODc4YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsZVN5c3RlbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuQWRhcHRhYmxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIDxjb2RlPk1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBpcyBhIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiB0aGF0IGtub3dzIGlmCi0gKiBpdCBoYXMgYmVlbiBwb3B1bGF0ZWQgb3Igbm90LgotICovCi1jbGFzcyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBleHRlbmRzIEZpbGVTeXN0ZW1FbGVtZW50IHsKLQlwcml2YXRlIGJvb2xlYW4gcG9wdWxhdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUJhc2VEaXJOYW1lID0gbnVsbDsKLQotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+TWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IHdpdGggdGhlIHN1cHBsaWVkIG5hbWUgYW5kIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZWxlbWVudCB0aGlzIHJlcHJlc2VudHMKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBwYXJlbnQKLQkgKiBAcGFyYW0gaXNEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGluZGljYXRlZCBpZiB0aGlzIGNvdWxkIGhhdmUgY2hpbGRyZW4gb3Igbm90Ci0JICovCi0JTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQoU3RyaW5nIG5hbWUsIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsZVN5c3RlbUVsZW1lbnQgcGFyZW50LCBib29sZWFuIGlzRGlyZWN0b3J5KSB7Ci0JCXN1cGVyKG5hbWUsIHBhcmVudCwgaXNEaXJlY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VCYXNlRGlyTmFtZShTdHJpbmcgcykgewotCQlwYWNrYWdlQmFzZURpck5hbWUgPSBzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKEZpbGVTeXN0ZW1FbGVtZW50IGNoaWxkKSB7Ci0JCWlmIChjaGlsZC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlzdXBlci5hZGRDaGlsZChjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hpbGQuZ2V0RmlsZU5hbWVFeHRlbnNpb24oKS5lcXVhbHMoImNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1cGVyLmFkZENoaWxkKGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBpbW1lZGlhdGUgY2hpbGRyZW4uIFVzZSB0aGUgc3VwcGxpZWQgcHJvdmlkZXIgaWYgaXQKLQkgKiBuZWVkcyB0byBiZSBwb3B1bGF0ZWQuIG9mIHRoaXMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBBZGFwdGFibGVMaXN0IGdldEZpbGVzKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCQlpZiAoIXBvcHVsYXRlZCkKLQkJCXBvcHVsYXRlKHByb3ZpZGVyKTsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZXMoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBmb2xkZXJzIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbi4gVXNlIHRoZSBzdXBwbGllZCBwcm92aWRlciBpZiBpdAotCSAqIG5lZWRzIHRvIGJlIHBvcHVsYXRlZC4gb2YgdGhpcyBmb2xkZXIuCi0JICovCi0JcHVibGljIEFkYXB0YWJsZUxpc3QgZ2V0Rm9sZGVycyhJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKCFwb3B1bGF0ZWQpCi0JCQlwb3B1bGF0ZShwcm92aWRlcik7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEZvbGRlcnMoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBwb3B1bGF0aW9uIGhhcyBoYXBwZW5lZCBmb3IgdGhlIHJlY2VpdmVyLgotCSAqLwotCWJvb2xlYW4gaXNQb3B1bGF0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnBvcHVsYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgbm90IGhhcHBlbmVkIGZvciB0aGUgcmVjZWl2ZXIuCi0JICovCi0JYm9vbGVhbiBub3RQb3B1bGF0ZWQoKSB7Ci0JCXJldHVybiAhdGhpcy5wb3B1bGF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGUgdGhlIGZpbGVzIGFuZCBmb2xkZXJzIG9mIHRoZSByZWNlaXZlciB1c2luZyB0aGUgc3VwcGxpZWMgc3RydWN0dXJlIHByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCi0JCU9iamVjdCBmaWxlU3lzdGVtT2JqZWN0ID0gZ2V0RmlsZVN5c3RlbU9iamVjdCgpOwotCi0JCUxpc3QgY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihmaWxlU3lzdGVtT2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCUl0ZXJhdG9yIGNoaWxkcmVuRW51bSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjaGlsZHJlbkVudW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbkVudW0ubmV4dCgpOwotCi0JCQlTdHJpbmcgZWxlbWVudExhYmVsID0gcHJvdmlkZXIuZ2V0TGFiZWwoY2hpbGQpOwotCQkJaWYgKGVsZW1lbnRMYWJlbC5lcXVhbHMocGFja2FnZUJhc2VEaXJOYW1lKSB8fCBwYWNrYWdlQmFzZURpck5hbWUgPT0gbnVsbCkgewotCQkJCS8vQ3JlYXRlIG9uZSBsZXZlbCBiZWxvdwotCi0JCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgcmVzdWx0ID0gbmV3IE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KGVsZW1lbnRMYWJlbCwgdGhpcywgcHJvdmlkZXIuaXNGb2xkZXIoY2hpbGQpKTsKLQkJCQlyZXN1bHQuc2V0RmlsZVN5c3RlbU9iamVjdChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJc2V0UG9wdWxhdGVkKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgaGFwcGVuZWQgZm9yIHRoZSByZWNlaXZlciB0byB0cnVlLgotCSAqLwotCXZvaWQgc2V0UG9wdWxhdGVkKCkgewotCQl0aGlzLnBvcHVsYXRlZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3RmxleGlibGVQcm9qZWN0R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3RmxleGlibGVQcm9qZWN0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0OTU2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0ZsZXhpYmxlUHJvamVjdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE0LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgTmV3RmxleGlibGVQcm9qZWN0R3JvdXAgaW1wbGVtZW50cyBJRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllc3sKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHVibGljIFRleHQgcHJvamVjdE5hbWVGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbG9jYXRpb25QYXRoRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsKLQkvLwljb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JLy8JZGVmYXVsdCB2YWx1ZXMKLQlwcml2YXRlIFN0cmluZyBkZWZQcm9qZWN0TmFtZUxhYmVsID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkFNRV9MQUJFTCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBkZWZCcm93c2VCdXR0b25MYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9MQUJFTCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmRGlyRGlhbG9nTGFiZWwgPSAiRGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgTmV3RmxleGlibGVQcm9qZWN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRGF0YU1vZGVsIG1vZGVsLCBEYXRhTW9kZWxTeW5jaEhlbHBlciBhSGVscGVyKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJc3luY2hIZWxwZXIgPSBhSGVscGVyOwotCQlidWlsZENvbXBvc2l0ZXMocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHdpdGhpbiB0aGlzIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAocGFyZW50KTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdE5hbWVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgbGFiZWwKLQkJTGFiZWwgcHJvamVjdE5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRUZXh0KGRlZlByb2plY3ROYW1lTGFiZWwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotCQlwcm9qZWN0TmFtZUZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlwcm9qZWN0TmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgLy8gcGFkCi0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChwcm9qZWN0TmFtZUZpZWxkLCBQUk9KRUNUX05BTUUsIG5ldyBDb250cm9sW117cHJvamVjdE5hbWVMYWJlbH0pOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLwkJc2V0IHVwIGxvY2F0aW9uIHBhdGggbGFiZWwKLQkJTGFiZWwgbG9jYXRpb25QYXRoTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uUGF0aExhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuUFJPSkVDVF9MT0NfTEJMKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbG9jYXRpb25QYXRoTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy8gc2V0IHVwIGxvY2F0aW9uIHBhdGggZW50cnkgZmllbGQKLQkJbG9jYXRpb25QYXRoRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgYnJvd3NlIGJ1dHRvbgotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGxvY2F0aW9uUGF0aEZpZWxkLCBQUk9KRUNUX0xPQ0FUSU9OLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBicm93c2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCkgewotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhsb2NhdGlvblBhdGhGaWVsZC5nZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoZGVmRGlyRGlhbG9nTGFiZWwpOwotCQlTdHJpbmcgZGlyTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04pOwotCQlpZiAoKGRpck5hbWUgIT0gbnVsbCkgJiYgKGRpck5hbWUubGVuZ3RoKCkgIT0gMCkpIHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQkJaWYgKHBhdGguZXhpc3RzKCkpIHsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXJOYW1lKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJbW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVF9MT0NBVElPTiwgc2VsZWN0ZWREaXJlY3RvcnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbW9kZWwucmVtb3ZlTGlzdGVuZXIoc3luY2hIZWxwZXIpOwotCQltb2RlbCA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZmUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0oyRUVDb21wb25lbnRTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDIzLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQbHVnaW5Db250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5Xb3JrYmVuY2hBY3Rpdml0eUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuR2VuZXJpY1dpemFyZE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOZXdKMkVFQ29tcG9uZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotICAgIHByaXZhdGUgQnV0dG9uIGRlZmF1bHRNb2R1bGVzQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZGVmYXVsdE1vZHVsZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBuZXdNb2R1bGVzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYXBwQ2xpZW50UmFkaW9CdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBlamJSYWRpb0J1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIHdlYlJhZGlvQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gY29ubmVjdG9yUmFkaW9CdXR0b247Ci0KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGFwcENsaWVudE5vZGU7Ci0KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGVqYk5vZGU7Ci0KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIHdlYk5vZGU7Ci0KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGNvbm5lY3Rvck5vZGU7Ci0KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIHNlbGVjdGVkTm9kZTsKLQotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgc3RhY2tMYXlvdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKiBAcGFyYW0gcGFnZU5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0gICAgICAgIHNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkRFRkFVTFRfQ09NUE9ORU5UX1BBR0VfVElUTEUpKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9ERVNDKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBDUkVBVEVfQVBQQ0xJRU5ULCBBUFBDTElFTlRfQ09NUE9ORU5UX05BTUUsIENSRUFURV9DT05ORUNUT1IsIENPTk5FQ1RPUl9DT01QT05FTlRfTkFNRSwgQ1JFQVRFX0VKQiwgRUpCX0NPTVBPTkVOVF9OQU1FLCBDUkVBVEVfV0VCLCBXRUJfQ09NUE9ORU5UX05BTUUsIE1PRFVMRV9OQU1FX0NPTExJU0lPTlNfVkFMSURBVElPTiwgRU5BQkxFRCB9OwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5KMkVFV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5FQVJfTkVXX01PRFVMRV9QUk9KRUNUU19QQUdFKTsKLSAgICAgICAgY3JlYXRlRGVmYXVsdENoZWNrQm94KGNvbXBvc2l0ZSk7Ci0gICAgICAgIENvbXBvc2l0ZSBmb3JTdGFja0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0gICAgICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGZvclN0YWNrQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBmb3JTdGFja0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgQ29tcG9zaXRlIHN0YWNrQ29tcG9zaXRlID0gY3JlYXRlU3RhY2tMYXlvdXRDb21wb3NpdGUoZm9yU3RhY2tDb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVEZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZShzdGFja0NvbXBvc2l0ZSk7Ci0gICAgICAgIGNyZWF0ZU1vZHVsZVNlbGVjdGlvbkNvbXBvc2l0ZShzdGFja0NvbXBvc2l0ZSk7Ci0gICAgICAgIHN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZTsKLSAgICAgICAgc2V0QnV0dG9uRW5hYmxlbWVudCgpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3RhY2tMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgc3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChzdGFja0xheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE1vZHVsZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgZGVmYXVsdE1vZHVsZXNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAvLyBEZWZhdWx0IE1vZHVsZSBDb250cm9scyBjcmVhdGlvbgotICAgICAgICBjcmVhdGVBcHBDbGllbnREZWZhdWx0TW9kdWxlQ29udHJvbCgpOwotICAgICAgICBpZiAoSjJFRVBsdWdpbi5pc0VKQlN1cHBvcnRBdmFpbGFibGUoKSkKLSAgICAgICAgICAgIGNyZWF0ZUVKQkRlZmF1bHRNb2R1bGVDb250cm9sKCk7Ci0gICAgICAgIGNyZWF0ZVdlYkRlZmF1bHRNb2R1bGVDb250cm9sKCk7Ci0gICAgICAgIGlmIChKMkVFUGx1Z2luLmlzRUpCU3VwcG9ydEF2YWlsYWJsZSgpKQotICAgICAgICAgICAgY3JlYXRlQ29ubmVjdG9yRGVmYXVsdE1vZHVsZUNvbnRyb2woKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZHVsZVNlbGVjdGlvbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG5ld01vZHVsZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgbmV3TW9kdWxlc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgbmV3TW9kdWxlc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgYXBwQ2xpZW50UmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKG5ld01vZHVsZXNDb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0KLSAgICAgICAgYXBwQ2xpZW50UmFkaW9CdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS5hcHBDbGllbnQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXBwQ2xpZW50UmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgICAgIGlmIChFYXJNb2R1bGVNYW5hZ2VyLmdldEVKQk1vZHVsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVqYlJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihuZXdNb2R1bGVzQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotICAgICAgICAgICAgZWpiUmFkaW9CdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS5lamIiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGVqYlJhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChFYXJNb2R1bGVNYW5hZ2VyLmdldFdlYk1vZHVsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdlYlJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihuZXdNb2R1bGVzQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotICAgICAgICAgICAgd2ViUmFkaW9CdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS53ZWIiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHdlYlJhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChFYXJNb2R1bGVNYW5hZ2VyLmdldEpDQU1vZHVsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbm5lY3RvclJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihuZXdNb2R1bGVzQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotICAgICAgICAgICAgY29ubmVjdG9yUmFkaW9CdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS5qY2EiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGNvbm5lY3RvclJhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbm5lY3RvckRlZmF1bHRNb2R1bGVDb250cm9sKCkgewotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRKQ0FNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ERUZBVUxUX0NPTVBPTkVOVF9QQUdFX0pDQV9NT0RVTEVfTEJMKTsKLSAgICAgICAgICAgIGNyZWF0ZUoyRUVDb21wb25lbnRDb250cm9sKGxhYmVsLCBDUkVBVEVfQ09OTkVDVE9SLCBDT05ORUNUT1JfQ09NUE9ORU5UX05BTUUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVdlYkRlZmF1bHRNb2R1bGVDb250cm9sKCkgewotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRXZWJNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ERUZBVUxUX0NPTVBPTkVOVF9QQUdFX1dFQl9NT0RVTEVfTEJMKTsKLSAgICAgICAgICAgIGNyZWF0ZUoyRUVDb21wb25lbnRDb250cm9sKGxhYmVsLCBDUkVBVEVfV0VCLCBXRUJfQ09NUE9ORU5UX05BTUUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVKQkRlZmF1bHRNb2R1bGVDb250cm9sKCkgewotICAgICAgICBpZiAoRWFyTW9kdWxlTWFuYWdlci5nZXRFSkJNb2R1bGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ERUZBVUxUX0NPTVBPTkVOVF9QQUdFX0VKQl9NT0RVTEVfTEJMKTsKLSAgICAgICAgICAgIGNyZWF0ZUoyRUVDb21wb25lbnRDb250cm9sKGxhYmVsLCBDUkVBVEVfRUpCLCBFSkJfQ09NUE9ORU5UX05BTUUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFwcENsaWVudERlZmF1bHRNb2R1bGVDb250cm9sKCkgewotICAgICAgICBTdHJpbmcgbGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5ERUZBVUxUX0NPTVBPTkVOVF9QQUdFX0FQUENMSUVOVF9NT0RVTEVfTEJMKTsKLSAgICAgICAgY3JlYXRlSjJFRUNvbXBvbmVudENvbnRyb2wobGFiZWwsIENSRUFURV9BUFBDTElFTlQsIEFQUENMSUVOVF9DT01QT05FTlRfTkFNRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUoyRUVDb21wb25lbnRDb250cm9sKFN0cmluZyBsYWJlbCwgU3RyaW5nIGNyZWF0ZVByb3BlcnR5LCBTdHJpbmcgcHJvamVjdFByb3BlcnR5KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24oZGVmYXVsdE1vZHVsZXNDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGNoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgY2hlY2tCb3guc2V0VGV4dChsYWJlbCk7Ci0KLSAgICAgICAgZmluYWwgVGV4dCB0ZXh0RmllbGQgPSBuZXcgVGV4dChkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgdGV4dEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goY2hlY2tCb3gsIGNyZWF0ZVByb3BlcnR5LCBudWxsKTsKLSAgICAgICAgc3luY2hIZWxwZXIuc3luY2hUZXh0KHRleHRGaWVsZCwgcHJvamVjdFByb3BlcnR5LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdENoZWNrQm94KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNoZWNrQm94Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBjaGVja0JveENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY2hlY2tCb3hDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQnV0dG9uID0gbmV3IEJ1dHRvbihjaGVja0JveENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICAgIGRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuREVGQVVMVF9DT01QT05FTlRfUEFHRV9ORVdfTU9EX1NFTF9QR19ERUZfQlROKSk7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgZGVmYXVsdE1vZHVsZXNCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgICAgIHN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZGVmYXVsdE1vZHVsZXNCdXR0b24sIEVOQUJMRUQsIG51bGwpOwotICAgICAgICBjcmVhdGVDb250cm9sc1NlcGFyYXRvckxpbmUoY2hlY2tCb3hDb21wb3NpdGUpOyAgICAKLSAgICAgICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbHNTZXBhcmF0b3JMaW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gYWRkIGEgaG9yaXpvbnRhbCBsaW5lCi0gICAgICAgIExhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLSAgICAgICAgaWYgKGV2dC53aWRnZXQgPT0gZGVmYXVsdE1vZHVsZXNCdXR0b24pCi0gICAgICAgICAgICBoYW5kbGVEZWZhdWx0TW9kdWxlc0J1dHRvblByZXNzZWQoKTsKLSAgICAgICAgZWxzZSBpZiAoIWRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBpZiAoZXZ0LndpZGdldCA9PSBhcHBDbGllbnRSYWRpb0J1dHRvbiAmJiBhcHBDbGllbnRSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZE5vZGUoZ2V0QXBwQ2xpZW50Tm9kZSgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGV2dC53aWRnZXQgPT0gZWpiUmFkaW9CdXR0b24gJiYgZWpiUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKGdldEVqYk5vZGUoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChldnQud2lkZ2V0ID09IHdlYlJhZGlvQnV0dG9uICYmIHdlYlJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkTm9kZShnZXRXZWJOb2RlKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LndpZGdldCA9PSBjb25uZWN0b3JSYWRpb0J1dHRvbiAmJiBjb25uZWN0b3JSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZE5vZGUoZ2V0Q29ubmVjdG9yTm9kZSgpKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmhhbmRsZUV2ZW50KGV2dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlZmF1bHRNb2R1bGVzQnV0dG9uUHJlc3NlZCgpIHsKLSAgICAgICAgaWYgKGRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZE5vZGUobnVsbCk7Ci0gICAgICAgICAgICBzaG93RGVmYXVsdE1vZHVsZXNDb21wb3NpdGUoKTsKLSAgICAgICAgICAgIHNldERlZmF1bHRNb2R1bGVzU2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0RGVmYXVsdE1vZHVsZXNTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgc2hvd05ld01vZHVsZXNDb21wc2l0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHNldEJ1dHRvbkVuYWJsZW1lbnQoKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRNb2R1bGVzU2VsZWN0aW9uKGJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGdldERhdGFNb2RlbCgpLnNldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfQVBQQ0xJRU5ULCBzZWxlY3Rpb24pOwotICAgICAgICBnZXREYXRhTW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0NPTk5FQ1RPUiwgc2VsZWN0aW9uKTsKLSAgICAgICAgZ2V0RGF0YU1vZGVsKCkuc2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9FSkIsIHNlbGVjdGlvbik7Ci0gICAgICAgIGdldERhdGFNb2RlbCgpLnNldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfV0VCLCBzZWxlY3Rpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93RGVmYXVsdE1vZHVsZXNDb21wb3NpdGUoKSB7Ci0gICAgICAgIGRlZmF1bHRNb2R1bGVzQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIG5ld01vZHVsZXNDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIHN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGRvbmUgYmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbi4gV2UgbmVlZCB0byBkaXNhYmxlIENvbm5lY3RvcnMgaWYKLSAgICAgKiBub3QgajJlZSAxLjMgb3IgaGlnaGVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRCdXR0b25FbmFibGVtZW50KCkgewotICAgICAgICBpZiAoIWRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIGNvbm5lY3RvclJhZGlvQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCB2ZXJzaW9uID0gZ2V0RGF0YU1vZGVsKCkuZ2V0SW50UHJvcGVydHkoSjJFRV9WRVJTSU9OKTsKLSAgICAgICAgICAgIGNvbm5lY3RvclJhZGlvQnV0dG9uLnNldEVuYWJsZWQodmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzaG93TmV3TW9kdWxlc0NvbXBzaXRlKCkgewotICAgICAgICBkZWZhdWx0TW9kdWxlc0NvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbmV3TW9kdWxlc0NvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBpZiAoIWlzQW55TW9kdWxlUmFkaW9TZWxlY3RlZCgpKQotICAgICAgICAgICAgYXBwQ2xpZW50UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBzZXRTZWxlY3RlZE5vZGUoZ2V0V2l6YXJkTm9kZUZyb21TZWxlY3Rpb24oKSk7Ci0gICAgICAgIHN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBuZXdNb2R1bGVzQ29tcG9zaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGdldFdpemFyZE5vZGVGcm9tU2VsZWN0aW9uKCkgewotICAgICAgICBpZiAoYXBwQ2xpZW50UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0QXBwQ2xpZW50Tm9kZSgpOwotICAgICAgICBpZiAoY29ubmVjdG9yUmFkaW9CdXR0b24gIT0gbnVsbCAmJiBjb25uZWN0b3JSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0b3JOb2RlKCk7Ci0gICAgICAgIGlmIChlamJSYWRpb0J1dHRvbiAhPSBudWxsICYmIGVqYlJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIGdldEVqYk5vZGUoKTsKLSAgICAgICAgaWYgKHdlYlJhZGlvQnV0dG9uICE9IG51bGwgJiYgd2ViUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2V0V2ViTm9kZSgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQW55TW9kdWxlUmFkaW9TZWxlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIGFwcENsaWVudFJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IChjb25uZWN0b3JSYWRpb0J1dHRvbiAhPSBudWxsICYmIGNvbm5lY3RvclJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB8fCAoZWpiUmFkaW9CdXR0b24gIT0gbnVsbCAmJiBlamJSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgfHwgKHdlYlJhZGlvQnV0dG9uICE9IG51bGwgJiYgd2ViUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXBwQ2xpZW50Tm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGdldEFwcENsaWVudE5vZGUoKSB7Ci0gICAgICAgIGlmIChhcHBDbGllbnROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGFwcENsaWVudE5vZGUgPSBuZXcgR2VuZXJpY1dpemFyZE5vZGUoKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkdlbmVyaWNXaXphcmROb2RlI2NyZWF0ZVdpemFyZCgpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIElXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotICAgICAgICAgICAgICAgICAgICBJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRtLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQoZG0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFwcENsaWVudE5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb25uZWN0b3JOb2RlLgotICAgICAqLwotICAgIHByaXZhdGUgR2VuZXJpY1dpemFyZE5vZGUgZ2V0Q29ubmVjdG9yTm9kZSgpIHsKLSAgICAgICAgaWYgKGNvbm5lY3Rvck5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29ubmVjdG9yTm9kZSA9IG5ldyBHZW5lcmljV2l6YXJkTm9kZSgpIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuR2VuZXJpY1dpemFyZE5vZGUjY3JlYXRlV2l6YXJkKCkKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgSVdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIElXaXphcmRSZWdpc3RyeSBuZXdXaXphcmRSZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsKLSAgICAgICAgICAgICAgICAgICAgSVdpemFyZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ld1dpemFyZFJlZ2lzdHJ5LmZpbmRXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5Db25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoSjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkKWRlc2NyaXB0b3IuY3JlYXRlV2l6YXJkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRGF0YU1vZGVsIGRtID0gcmVzdWx0LmdldERhdGFNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG0uc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXREYXRhTW9kZWwoZG0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbm5lY3Rvck5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlamJOb2RlLgotICAgICAqLwotICAgIHByaXZhdGUgR2VuZXJpY1dpemFyZE5vZGUgZ2V0RWpiTm9kZSgpIHsKLSAgICAgICAgaWYgKGVqYk5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgZWpiTm9kZSA9IG5ldyBHZW5lcmljV2l6YXJkTm9kZSgpIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIChub24tSmF2YWRvYykKLSAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuR2VuZXJpY1dpemFyZE5vZGUjY3JlYXRlV2l6YXJkKCkKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgSVdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIElXaXphcmRSZWdpc3RyeSBuZXdXaXphcmRSZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsKLSAgICAgICAgICAgICAgICAgICAgSVdpemFyZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ld1dpemFyZFJlZ2lzdHJ5LmZpbmRXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC5lamIudWkuRUpCQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZClkZXNjcmlwdG9yLmNyZWF0ZVdpemFyZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgSURhdGFNb2RlbCBkbSA9IHJlc3VsdC5nZXREYXRhTW9kZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRtLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0RGF0YU1vZGVsKGRtKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlamJOb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViTm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEdlbmVyaWNXaXphcmROb2RlIGdldFdlYk5vZGUoKSB7Ci0gICAgICAgIGlmICh3ZWJOb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHdlYk5vZGUgPSBuZXcgR2VuZXJpY1dpemFyZE5vZGUoKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkdlbmVyaWNXaXphcmROb2RlI2NyZWF0ZVdpemFyZCgpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIElXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotICAgICAgICAgICAgICAgICAgICBJV2l6YXJkIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIElXaXphcmRSZWdpc3RyeSBuZXdXaXphcmRSZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsKLSAgICAgICAgICAgICAgICAgICAgSVdpemFyZERlc2NyaXB0b3Igc2VydmxldFdpemFyZERlc2NyaXB0b3IgPSBuZXdXaXphcmRSZWdpc3RyeS5maW5kV2l6YXJkKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5XZWJDb21wb25lbnRDcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZXJ2bGV0V2l6YXJkRGVzY3JpcHRvci5jcmVhdGVXaXphcmQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJOb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZWxlY3RlZE5vZGUKLSAgICAgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZE5vZGUgdG8gc2V0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZE5vZGUoR2VuZXJpY1dpemFyZE5vZGUgc2VsZWN0ZWROb2RlKSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gc2VsZWN0ZWROb2RlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjY2FuRmxpcFRvTmV4dFBhZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotICAgICAgICBpZiAoIWRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTm9kZSAhPSBudWxsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPldpemFyZFNlbGVjdGlvblBhZ2U8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICAgKiA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGN1cnJlbnRseQotICAgICAqIHNlbGVjdGVkIHdpemFyZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgSVBsdWdpbkNvbnRyaWJ1dGlvbiBwbHVnaW5Db250cmlidXRpb24gPSBuZXcgSVBsdWdpbkNvbnRyaWJ1dGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJZCgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE5vZGUgPT0gYXBwQ2xpZW50Tm9kZSkgewotICAgICAgICAgICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5hcHBjbGllbnRQcm9qZWN0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb2RlID09IGVqYk5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnV0aWwuZWpiUHJvamVjdFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm9kZSA9PSBjb25uZWN0b3JOb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmpjYVByb2plY3RXaXphcmQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vZGUgPT0gd2ViTm9kZSkgewotICAgICAgICAgICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC53ZWJQcm9qZWN0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gaWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoIVdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmFsbG93VXNlT2YobnVsbCxwbHVnaW5Db250cmlidXRpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNDcmVhdGVkID0gc2VsZWN0ZWROb2RlLmlzQ29udGVudENyZWF0ZWQoKTsKLSAgICAgICAgSVdpemFyZCB3aXphcmQgPSBzZWxlY3RlZE5vZGUuZ2V0V2l6YXJkKCk7Ci0gICAgICAgIGlmICh3aXphcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2VsZWN0ZWROb2RlKG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0NyZWF0ZWQpIC8vIEFsbG93IHRoZSB3aXphcmQgdG8gY3JlYXRlIGl0cyBwYWdlcwotICAgICAgICAgICAgd2l6YXJkLmFkZFBhZ2VzKCk7Ci0KLSAgICAgICAgcmV0dXJuIHdpemFyZC5nZXRTdGFydGluZ1BhZ2UoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuSjJFRVdpemFyZFBhZ2UjdmFsaWRhdGVQYWdlKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7Ci0gICAgICAgIGlmICghZGVmYXVsdE1vZHVsZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQyNGEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuZGlhbG9ncy5UeXBlU2VsZWN0aW9uRGlhbG9nMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuVHlwZVNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE5ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1YmxpY0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFic3RyYWN0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZmluYWxCdXR0b247Ci0JcHJvdGVjdGVkIExpc3RWaWV3ZXIgaW50ZXJmYWNlVmlld2VyOwotCXByb3RlY3RlZCBCdXR0b24gYWRkQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gaW5oZXJpdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGNvbnN0cnVjdG9yQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gbWFpbk1ldGhvZEJ1dHRvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBOZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbihwYWdlRGVzYyk7Ci0JCXRoaXMuc2V0VGl0bGUocGFnZVRpdGxlKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLk5FV19KQVZBX0NMQVNTX09QVElPTl9XSVpBUkRfUDEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9BQlNUUkFDVCwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfRklOQUx9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlTW9kaWZpZXJDb250cm9scyhjb21wb3NpdGUpOwotCQljcmVhdGVJbnRlcmZhY2VDb250cm9scyhjb21wb3NpdGUpOwotCi0JCS8vIFNlcGFyYXRvciBsYWJlbAotCQlMYWJlbCBzZXBlcmF0b3IgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXBlcmF0b3Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVTdHVic0NvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCXB1YmxpY0J1dHRvbi5zZXRGb2N1cygpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgZ2V0SW5mb3BvcElEKCkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBjb250cm9scyBmb3IgdGhlIG1vZGlmaWVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1vZGlmaWVyQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBtb2RpZmllcnNMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbW9kaWZpZXJzTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTCk7Ci0JCW1vZGlmaWVyc0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCXB1YmxpY0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlwdWJsaWNCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gocHVibGljQnV0dG9uLCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9QVUJMSUMsIG51bGwpOwotCi0JCWFic3RyYWN0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWFic3RyYWN0QnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWJzdHJhY3RCdXR0b24sIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRElGSUVSX0FCU1RSQUNULCBudWxsKTsKLQotCQlmaW5hbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmaW5hbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUwpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGZpbmFsQnV0dG9uLCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NT0RJRklFUl9GSU5BTCwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSW50ZXJmYWNlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBpbnRlcmZhY2VMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJaW50ZXJmYWNlTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUwpOwotCQlpbnRlcmZhY2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWludGVyZmFjZVZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGNvbXBvc2l0ZSk7Ci0JCWludGVyZmFjZVZpZXdlci5nZXRMaXN0KCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWludGVyZmFjZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0SW50ZXJmYWNlQ29udGVudFByb3ZpZGVyKCkpOwotCQlpbnRlcmZhY2VWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihnZXRJbnRlcmZhY2VMYWJlbFByb3ZpZGVyKCkpOwotCQlpbnRlcmZhY2VWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUykpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wbyA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlidXR0b25Db21wby5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uQ29tcG8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCWFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5QVVNIKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuQUREX0JVVFRPTl9MQUJFTCk7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlSW50ZXJmYWNlQWRkQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlyZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLlJFTU9WRV9CVVRUT04pOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZUludGVyZmFjZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlpbnRlcmZhY2VWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB3aXRoIGFsbCB0aGUgc3R1YnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTdHVic0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIHN0dWJMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJc3R1YkxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzdHViTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG8gPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlidXR0b25Db21wby5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDE1OwotCQlidXR0b25Db21wby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW1haW5NZXRob2RCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuQ0hFQ0spOwotCQltYWluTWV0aG9kQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9DTEFTU19NQUlOX0NIRUNLQk9YX0xBQkVMKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChtYWluTWV0aG9kQnV0dG9uLCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5NQUlOX01FVEhPRCwgbnVsbCk7Ci0KLQkJaW5oZXJpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5DSEVDSyk7Ci0JCWluaGVyaXRCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUwpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGluaGVyaXRCdXR0b24sIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFMsIG51bGwpOwotCi0JCWNvbnN0cnVjdG9yQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULkNIRUNLKTsKLQkJY29uc3RydWN0b3JCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChjb25zdHJ1Y3RvckJ1dHRvbiwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ09OU1RSVUNUT1IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVN0YXRlZnVsV2l6YXJkUGFnZSNzYXZlV2lkZ2V0VmFsdWVzKCkKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgewotCS8vIC8vIFRPRE86IGRvIHdlIHdhbnQgdG8gZG8gdGhpcyBoZXJlIG9yIGluIHRoZSBjb25jcmV0ZSBzdWJjbGFzc2VzPz8/Ci0JLy8gSURpYWxvZ1NldHRpbmdzIHN0b3JlID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkvLyBpZiAoc3RvcmUgIT0gbnVsbCkKLQkvLyBzdG9yZS5wdXQoZ2V0VW5pcXVlS2V5KCIiKSwgZ2V0VW5pcXVlS2V5KCIiKSk7IC8vJE5PTi1OTFMtMSQKLQkvLyAvLyROT04tTkxTLTIkCi0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIuc2F2ZUJ1dHRvbihpbmhlcml0QnV0dG9uLAotCS8vIGdldFVuaXF1ZUtleShpZEluaGVyaXRlZEFic3RyYWN0QnV0dG9uKSwgc3RvcmUpOwotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnNhdmVCdXR0b24oY29uc3RydWN0b3JCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkU3VwZXJDbGFzc0NvbnN0cnVjdG9yc0J1dHRvbiksIHN0b3JlKTsKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5zYXZlQnV0dG9uKHB1YmxpY0J1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRQdWJsaWNCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIuc2F2ZUJ1dHRvbihhYnN0cmFjdEJ1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRBYnN0cmFjdEJ1dHRvbiksIHN0b3JlKTsKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5zYXZlQnV0dG9uKGZpbmFsQnV0dG9uLCBnZXRVbmlxdWVLZXkoaWRGaW5hbEJ1dHRvbiksCi0JLy8gc3RvcmUpOwotCS8vCi0JLy8gfQotCS8qKgotCSAqIEBzZWUgSVN0YXRlZnVsV2l6YXJkUGFnZSNyZXN0b3JlV2lkZ2V0VmFsdWVzKCkKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCS8vIElEaWFsb2dTZXR0aW5ncyBzdG9yZSA9IHN1cGVyLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JLy8gaWYgKHN0b3JlICE9IG51bGwgJiYgc3RvcmUuZ2V0KGdldFVuaXF1ZUtleSgiIikpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnJlc3RvcmVCdXR0b24oaW5oZXJpdEJ1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRJbmhlcml0ZWRBYnN0cmFjdEJ1dHRvbiksIHN0b3JlKTsKLQkvLyBEaWFsb2dTZXR0aW5nc0hlbHBlci5yZXN0b3JlQnV0dG9uKGNvbnN0cnVjdG9yQnV0dG9uLAotCS8vIGdldFVuaXF1ZUtleShpZFN1cGVyQ2xhc3NDb25zdHJ1Y3RvcnNCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIucmVzdG9yZUJ1dHRvbihwdWJsaWNCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkUHVibGljQnV0dG9uKSwgc3RvcmUpOwotCS8vIERpYWxvZ1NldHRpbmdzSGVscGVyLnJlc3RvcmVCdXR0b24oYWJzdHJhY3RCdXR0b24sCi0JLy8gZ2V0VW5pcXVlS2V5KGlkQWJzdHJhY3RCdXR0b24pLCBzdG9yZSk7Ci0JLy8gRGlhbG9nU2V0dGluZ3NIZWxwZXIucmVzdG9yZUJ1dHRvbihmaW5hbEJ1dHRvbiwKLQkvLyBnZXRVbmlxdWVLZXkoaWRGaW5hbEJ1dHRvbiksIHN0b3JlKTsKLQkvLyB9Ci0JLy8gfQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN1cGVyIEludGVyZmFjZSBDb250ZW50IFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGdldEludGVyZmFjZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJT2JqZWN0W10gcmV0ID0gbmV3IE9iamVjdFswXTsKLQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KSB7Ci0JCQkJCXJldCA9ICgoQXJyYXlMaXN0KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkvL0RlZmF1bHQgaXMgbm90aGluZwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN1cGVyIEludGVyZmFjZSBMYWJlbCBQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBnZXRJbnRlcmZhY2VMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvaW50ZXJmYWNlX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVN0cmluZyByZXQgPSBKMkVFVUlNZXNzYWdlcy5FTVBUWV9TVFJJTkc7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJCXJldCA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQnJvd3NlIGZvciBhIG5ldyBTdXBlciBJbnRlcmZhY2UgQ2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbnRlcmZhY2VBZGRCdXR0b25TZWxlY3RlZCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCk7Ci0JCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQkvLyB0aGlzIGVsaW1pbmF0ZXMgdGhlIG5vbi1leHBvcnRlZCBjbGFzc3BhdGggZW50cmllcwotCQlmaW5hbCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gVHlwZVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGVGb3JBUHJvamVjdChqYXZhUHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCVR5cGVTZWxlY3Rpb25EaWFsb2cyIGRpYWxvZyA9IG5ldyBUeXBlU2VsZWN0aW9uRGlhbG9nMihnZXRTaGVsbCgpLGZhbHNlLCBjb250ZXh0LCBzY29wZSxJSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0UpOwotCQlkaWFsb2cuc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJU3RyaW5nIHN1cGVyY2xhc3NGdWxsUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodHlwZSAhPSBudWxsKQotCQkJCXN1cGVyY2xhc3NGdWxsUGF0aCA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQlpbnRlcmZhY2VWaWV3ZXIuYWRkKHN1cGVyY2xhc3NGdWxsUGF0aCk7Ci0JCX0KLQkJTGlzdCB2YWx1ZUxpc3QgPSBBcnJheXMuYXNMaXN0KGludGVyZmFjZVZpZXdlci5nZXRMaXN0KCkuZ2V0SXRlbXMoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOVEVSRkFDRVMsIHZhbHVlTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFuIGludGVyZmFjZSBmcm9tIHRoZSBTdXBlckludGVyZmFjZSBMaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW50ZXJmYWNlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgaW50ZXJmYWNlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlMaXN0IGl0ZW1zID0gc2VsZWN0aW9uLnRvTGlzdCgpOwotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IGFycmF5W10gPSBpbnRlcmZhY2VWaWV3ZXIuZ2V0TGlzdCgpLmdldEl0ZW1zKCk7Ci0JCQlMaXN0IHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCXZhbHVlTGlzdC5hZGQoYXJyYXlbaV0pOwotCQkJfQotCQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJdmFsdWVMaXN0LnJlbW92ZShpdGVtcy5nZXQoaSkpOwotCQkJfQotCQkJaW50ZXJmYWNlVmlld2VyLnNldElucHV0KHZhbHVlTGlzdCk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTLCB2YWx1ZUxpc3QpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTNiM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5kaWFsb2dzLlR5cGVTZWxlY3Rpb25EaWFsb2cyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JVmlld1BhcnRJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uY29tcG9uZW50Y29yZS51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR5cGVTZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdKYXZhQ2xhc3NXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFRleHQgZm9sZGVyVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmb2xkZXJCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgcGFja2FnZVRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBwYWNrYWdlQnV0dG9uOwotCXByb3RlY3RlZCBMYWJlbCBwYWNrYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgY2xhc3NUZXh0OwotCXByb3RlY3RlZCBMYWJlbCBjbGFzc0xhYmVsOwotCXByb3RlY3RlZCBUZXh0IHN1cGVyVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHN1cGVyQnV0dG9uOwotCXByb3RlY3RlZCBMYWJlbCBzdXBlckxhYmVsOwotCXByaXZhdGUgQ29tYm8gcHJvamVjdE5hbWVDb21ibzsKLQlwcml2YXRlIENvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1vZHVsZVR5cGU7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc05ld01vZHVsZUJ1dHRvbjsKLQkKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBOZXdKYXZhQ2xhc3NXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlLAotCQkJU3RyaW5nIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24ocGFnZURlc2MpOwotCQl0aGlzLnNldFRpdGxlKHBhZ2VUaXRsZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXRoaXMubW9kdWxlVHlwZSA9IG1vZHVsZVR5cGU7Ci0JCXRoaXMuaGFzTmV3TW9kdWxlQnV0dG9uID0gZmFsc2U7Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIAotCQkJCUlBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCAKLQkJCQlJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSLCAKLQkJCQlJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0UsIAotCQkJCUlOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUUsIAotCQkJCUlOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1N9OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWFkZFByb2plY3ROYW1lR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkQ29tcG9uZW50R3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkRm9sZGVyR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkU2VwZXJhdG9yKGNvbXBvc2l0ZSwgMyk7Ci0JCWFkZFBhY2thZ2VHcm91cChjb21wb3NpdGUpOwotCQlhZGRDbGFzc25hbWVHcm91cChjb21wb3NpdGUpOwotCQlhZGRTdXBlcmNsYXNzR3JvdXAoY29tcG9zaXRlKTsKLQotCQlmb2xkZXJUZXh0LnNldEZvY3VzKCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBnZXRJbmZvcG9wSUQoKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQWRkIGNvbXBvbmVudCBncm91cCB0byBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ29tcG9uZW50R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlMYWJlbCBjb21wb25lbnRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJY29tcG9uZW50TGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVfTkFNRSkpOwotCQljb21wb25lbnRMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQljb21wb25lbnROYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQljb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaW5pdGlhbGl6ZUNvbXBvbmVudExpc3QoKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhjb21wb25lbnROYW1lQ29tYm8sIElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBuZXcgQ29udHJvbFtdIHt9KTsKLQkJaWYgKCFoYXNOZXdNb2R1bGVCdXR0b24pIHsKLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJfSBlbHNlIHsKLQkJCUJ1dHRvbiBuZXdNb2R1bGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJbmV3TW9kdWxlQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSkpOwotCQkJbmV3TW9kdWxlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQkJbmV3TW9kdWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWhhbmRsZU5ld01vZHVsZUJ1dHRvblByZXNzZWQoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkvLyBEbyBub3RoaW5nCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNvbXBvbmVudExpc3QoKSB7Ci0JCUxpc3QgY29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCi0JCWlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZUlkKCkuZXF1YWxzKG1vZHVsZVR5cGUpICYmICFjb21wb25lbnRMaXN0LmNvbnRhaW5zKGNvbXBvbmVudC5nZXROYW1lKCkpKQotCQkJY29tcG9uZW50TGlzdC5hZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCQotCQlTdHJpbmdbXSBjb21wb25lbnROYW1lcyA9IG5ldyBTdHJpbmdbY29tcG9uZW50TGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWNvbXBvbmVudE5hbWVzW2ldID0gKFN0cmluZykgY29tcG9uZW50TGlzdC5nZXQoaSk7Ci0JCX0KLQkJY29tcG9uZW50TmFtZUNvbWJvLnNldEl0ZW1zKGNvbXBvbmVudE5hbWVzKTsKLQkJaWYgKGNvbXBvbmVudE5hbWVzLmxlbmd0aCA+IDApIHsKLQkJCWNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KGNvbXBvbmVudE5hbWVzWzBdKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJfQotCQkvLyB1cGRhdGUgc291cmNlIGZvbGRlcgotCQlpZiAoZm9sZGVyVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc291cmNlRm9sZGVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUik7Ci0JCQlpZiAoc291cmNlRm9sZGVyICE9IG51bGwpCi0JCQkJZm9sZGVyVGV4dC5zZXRUZXh0KHNvdXJjZUZvbGRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgcHJvamVjdCBncm91cAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVEFCTEVfUFJPSkVDVCkpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJaW5pdGlhbGl6ZUNvbXBvbmVudExpc3QoKTsKLQkJCX0KLQkJfSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocHJvamVjdE5hbWVDb21ibywgSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBudWxsKTsKLQkJaW5pdGlhbGl6ZVByb2plY3RMaXN0KCk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByb2plY3RMaXN0KCkgewotCQlJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlUHJvamVjdHNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmIHByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkJCQotCQkJCQlpZiAoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGVJZCgpLmVxdWFscyhtb2R1bGVUeXBlKSkKLQkJCQkJCWl0ZW1zLmFkZChwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vIElnbm9yZQotCQkJfQotCQl9Ci0JCWlmIChpdGVtcy5pc0VtcHR5KCkpIHJldHVybjsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2l0ZW1zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCW5hbWVzW2ldID0gKFN0cmluZykgaXRlbXMuZ2V0KGkpOwotCQl9Ci0JCXByb2plY3ROYW1lQ29tYm8uc2V0SXRlbXMobmFtZXMpOwotCQl0cnkgewotCQkJSVByb2plY3Qgc2VsZWN0ZWRQcm9qZWN0ID0gZ2V0U2VsZWN0ZWRQcm9qZWN0KCk7Ci0JCQlpZiAoc2VsZWN0ZWRQcm9qZWN0ICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9qZWN0LmlzQWNjZXNzaWJsZSgpCi0JCQkJCSYmIHNlbGVjdGVkUHJvamVjdC5oYXNOYXR1cmUoSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEKSkgewotCQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChzZWxlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHNlbGVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCAmJiBuYW1lcy5sZW5ndGggPiAwKQotCQkJcHJvamVjdE5hbWUgPSBuYW1lc1swXTsKLQotCQlpZiAoKHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpID09IG51bGwgfHwgcHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgJiYgcHJvamVjdE5hbWUgIT0gbnVsbCkgewotCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KHByb2plY3ROYW1lKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgZm9sZGVyIGdyb3VwIHRvIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRGb2xkZXJHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIGZvbGRlcgotCQlMYWJlbCBmb2xkZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZm9sZGVyTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5GT0xERVJfTEFCRUwpOwotCQlmb2xkZXJMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQlmb2xkZXJUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWZvbGRlclRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChmb2xkZXJUZXh0LCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSLCBudWxsKTsKLQotCQlmb2xkZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmb2xkZXJCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJZm9sZGVyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlmb2xkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUZvbGRlckJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEFkZCBwYWNrYWdlIGdyb3VwIHRvIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQYWNrYWdlR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBwYWNrYWdlCi0JCXBhY2thZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJcGFja2FnZUxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuSkFWQV9QQUNLQUdFX0xBQkVMKTsKLQkJcGFja2FnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCXBhY2thZ2VUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXBhY2thZ2VUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IGdldFNlbGVjdGVkUGFja2FnZUZyYWdtZW50KCk7Ci0JCWlmIChwYWNrYWdlRnJhZ21lbnQgIT0gbnVsbCAmJiBwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkpIHsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0UsIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJfQotCi0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChwYWNrYWdlVGV4dCwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFLCBudWxsKTsKLQotCQlwYWNrYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJcGFja2FnZUJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9CVVRUT05fTEFCRUwpOwotCQlwYWNrYWdlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlwYWNrYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVQYWNrYWdlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIERvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGNsYXNzbmFtZSBncm91cCB0byBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NuYW1lR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBjbGFzcyBuYW1lCi0JCWNsYXNzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWNsYXNzTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5DTEFTU19OQU1FX0xBQkVMKTsKLQkJY2xhc3NMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQljbGFzc1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJY2xhc3NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoY2xhc3NUZXh0LCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FLCBudWxsKTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHNlcGVyYXRvciB0byBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXBlcmF0b3IoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGhvclNwYW4pIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCS8vIFNlcGFyYXRvciBsYWJlbAotCQlMYWJlbCBzZXBlcmF0b3IgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3JTcGFuOwotCQlzZXBlcmF0b3Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgc3VwZXJjbGFzcyBncm91cCB0byB0aGUgY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN1cGVyY2xhc3NHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIHN1cGVyY2xhc3MKLQkJc3VwZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJc3VwZXJMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfTEFCRUwpOwotCQlzdXBlckxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCXN1cGVyVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlzdXBlclRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChzdXBlclRleHQsIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1MsIG51bGwpOwotCi0JCXN1cGVyQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc3VwZXJCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJc3VwZXJCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXN1cGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTdXBlckJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEJyb3dzZSBmb3IgYSBuZXcgRGVzdGluYXRpb24gRm9sZGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRm9sZGVyQnV0dG9uUHJlc3NlZCgpIHsKLQkJSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRDb250YWluZXJEaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKTsKLQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IGdldENvbnRhaW5lckRpYWxvZ1ZpZXdlckZpbHRlcigpOwotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSk7Ci0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBsYWJlbFByb3ZpZGVyLCBjb250ZW50UHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0MpOwotCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24ocHJvamVjdCk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIGVsZW1lbnQ7Ci0JCQkJCWZvbGRlclRleHQuc2V0VGV4dChjb250YWluZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJLy8gZGVhbFdpdGhTZWxlY3RlZENvbnRhaW5lclJlc291cmNlKGNvbnRhaW5lcik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlTmV3TW9kdWxlQnV0dG9uUHJlc3NlZCgpIHsKLQkJdGhpcy5jcmVhdGVOZXdDb21wb25lbnQoKTsKLQkJaW5pdGlhbGl6ZVByb2plY3RMaXN0KCk7Ci0JCWluaXRpYWxpemVDb21wb25lbnRMaXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmV3Q29tcG9uZW50KCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhY2thZ2VCdXR0b25QcmVzc2VkKCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrUm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQlpZiAocGFja1Jvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUphdmFFbGVtZW50W10gcGFja2FnZXMgPSBudWxsOwotCQl0cnkgewotCQkJcGFja2FnZXMgPSBwYWNrUm9vdC5nZXRDaGlsZHJlbigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gRG8gbm90aGluZwotCQl9Ci0JCWlmIChwYWNrYWdlcyA9PSBudWxsKQotCQkJcGFja2FnZXMgPSBuZXcgSUphdmFFbGVtZW50WzBdOwotCi0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCUphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX0RFRkFVTFQpKTsKLQkJZGlhbG9nLnNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDKTsKLQkJZGlhbG9nLnNldEVtcHR5TGlzdE1lc3NhZ2UoSjJFRVVJTWVzc2FnZXMuUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FKTsKLQkJZGlhbG9nLnNldEVsZW1lbnRzKHBhY2thZ2VzKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJaWYgKGZyYWdtZW50ICE9IG51bGwpIHsKLQkJCQlwYWNrYWdlVGV4dC5zZXRUZXh0KGZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlwYWNrYWdlVGV4dC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkVNUFRZX1NUUklORyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdXBlckJ1dHRvblByZXNzZWQoKSB7Ci0JCWdldENvbnRyb2woKS5zZXRDdXJzb3IobmV3IEN1cnNvcihnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2tSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBtb2RlbC5nZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0VfRlJBR01FTlRfUk9PVCk7Ci0JCWlmIChwYWNrUm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHRoaXMgZWxpbWluYXRlcyB0aGUgbm9uLWV4cG9ydGVkIGNsYXNzcGF0aCBlbnRyaWVzCi0JCWZpbmFsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBUeXBlU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZUZvckFQcm9qZWN0KHBhY2tSb290LmdldEphdmFQcm9qZWN0KCksIHRydWUsIHRydWUpOwotCi0JCS8vIFRoaXMgaW5jbHVkZXMgYWxsIGVudHJpZXMgb24gdGhlIGNsYXNzcGF0aC4gVGhpcyBiZWhhdmlvciBpcwotCQkvLyBpZGVudGljYWwKLQkJLy8gdG8gdGhlIFN1cGVyIENsYXNzIEJyb3dzZSBCdXR0b24gb24gdGhlIENyZWF0ZSBuZXcgSmF2YSBDbGFzcyBXaXphcmQKLQkJLy8gZmluYWwgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3Ci0JCS8vIElKYXZhRWxlbWVudFtdIHtyb290LmdldEphdmFQcm9qZWN0KCl9ICk7Ci0JCVR5cGVTZWxlY3Rpb25EaWFsb2cyIGRpYWxvZyA9IG5ldyBUeXBlU2VsZWN0aW9uRGlhbG9nMihnZXRTaGVsbCgpLGZhbHNlLCBnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKSwgc2NvcGUsIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTKTsKLQkJZGlhbG9nLnNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEoyRUVVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDKTsKLQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJU3RyaW5nIHN1cGVyY2xhc3NGdWxsUGF0aCA9IEoyRUVVSU1lc3NhZ2VzLkVNUFRZX1NUUklORzsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlzdXBlcmNsYXNzRnVsbFBhdGggPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCQkJc3VwZXJUZXh0LnNldFRleHQoc3VwZXJjbGFzc0Z1bGxQYXRoKTsKLQkJCWdldENvbnRyb2woKS5zZXRDdXJzb3IobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZ2V0Q29udHJvbCgpLnNldEN1cnNvcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTZWxlY3Rpb24gdmFsaWRhdG9yIGZvciB0aGUgQ29udGFpbmVyCi0JICogU2VsZWN0aW9uIERpYWxvZyBUaGlzIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgYnkgc3ViY2xhc3NlcywgYXMgaXQgZG9lcwotCSAqIHNvbWUgYmFzaWMgdmFsaWRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBnZXRDb250YWluZXJEaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb25bMF0gIT0gbnVsbCAmJiAhKHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIElQcm9qZWN0KSkKLQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhKMkVFVUlNZXNzYWdlcy5DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU2VsZWN0aW9uIExpc3RuZXIgZm9yIHRoZSBDb250YWluZXIKLQkgKiBTZWxlY3Rpb24gRGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXRDb250YWluZXJEaWFsb2dWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotCQkJCQlyZXR1cm4gcHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKG1vZGVsLmdldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgZWxlbWVudDsKLQkJCQkJLy8gb25seSBzaG93IHNvdXJjZSBmb2xkZXJzCi0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHNvdXJjZUZvbGRlcnMgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhjb21wb25lbnQpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZvbGRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChzb3VyY2VGb2xkZXJzW2ldLmdldFJlc291cmNlKCkhPSBudWxsICYmIHNvdXJjZUZvbGRlcnNbaV0uZ2V0UmVzb3VyY2UoKS5lcXVhbHMoZm9sZGVyKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRTZWxlY3RlZFByb2plY3QoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCWlmIChzdHVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzdHVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGdldEluaXRpYWxKYXZhRWxlbWVudChzZWxlY3Rpb24pOwotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKSAhPSBudWxsKQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0U2VsZWN0ZWRQYWNrYWdlRnJhZ21lbnQoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkvLyBzZWxlY3Rpb247Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0SW5pdGlhbEphdmFFbGVtZW50KHNlbGVjdGlvbik7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpCi0JCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0JCQkJcmV0dXJuICgoSVR5cGUpIGVsZW1lbnQpLmdldFBhY2thZ2VGcmFnbWVudCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGluc3BlY3QgYSBzZWxlY3Rpb24gdG8gZmluZCBhIEphdmEgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uIHRvIGJlIGluc3BlY3RlZAotCSAqIEByZXR1cm4gYSBKYXZhIGVsZW1lbnQgdG8gYmUgdXNlZCBhcyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaWYgbm8gSmF2YSBlbGVtZW50IGV4aXN0cyBpbiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIHNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2V0SW5pdGlhbEphdmFFbGVtZW50KElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudCBqZWxlbSA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCUlBZGFwdGFibGUgYWRhcHRhYmxlID0gKElBZGFwdGFibGUpIHNlbGVjdGVkRWxlbWVudDsKLQotCQkJCWplbGVtID0gKElKYXZhRWxlbWVudCkgYWRhcHRhYmxlLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJCQlpZiAoamVsZW0gPT0gbnVsbCkgewotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJCXdoaWxlIChqZWxlbSA9PSBudWxsICYmIHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQkJCQkJamVsZW0gPSAoSUphdmFFbGVtZW50KSByZXNvdXJjZS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoamVsZW0gPT0gbnVsbCkgewotCQkJCQkJCWplbGVtID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlKTsgLy8gamF2YSBwcm9qZWN0Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBKYXZhUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7Ci0JCQkJcGFydCA9IEphdmFQbHVnaW4uZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJfQotCi0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElWaWV3UGFydElucHV0UHJvdmlkZXIpIHsKLQkJCQlPYmplY3QgZWxlbSA9ICgoSVZpZXdQYXJ0SW5wdXRQcm92aWRlcikgcGFydCkuZ2V0Vmlld1BhcnRJbnB1dCgpOwotCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQkJCWplbGVtID0gKElKYXZhRWxlbWVudCkgZWxlbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoamVsZW0gPT0gbnVsbCB8fCBqZWxlbS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMKSB7Ci0JCQl0cnkgewotCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gSmF2YUNvcmUuY3JlYXRlKGdldFdvcmtzcGFjZVJvb3QoKSkuZ2V0SmF2YVByb2plY3RzKCk7Ci0JCQkJaWYgKHByb2plY3RzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCWplbGVtID0gcHJvamVjdHNbMF07Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKYXZhUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamVsZW07Ci0JfQotCi0JcHJvdGVjdGVkIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhhc05ld01vZHVsZUJ1dHRvbihib29sZWFuIGhhc05ld01vZHVsZUJ1dHRvbikgewotCQl0aGlzLmhhc05ld01vZHVsZUJ1dHRvbiA9IGhhc05ld01vZHVsZUJ1dHRvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3TW9kdWxlRGF0YU1vZGVsR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3TW9kdWxlRGF0YU1vZGVsR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxOWFkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld01vZHVsZURhdGFNb2RlbEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotcHVibGljIGNsYXNzIE5ld01vZHVsZURhdGFNb2RlbEdyb3VwIGltcGxlbWVudHMgSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXN7Ci0JCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBDb21ibyBwcm9qZWN0TmFtZUNvbWJvID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dCBtb2R1bGVOYW1lVGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBuZXdCdXR0b24gPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IHNlcnZlclRhcmdldFRleHQ7Ci0JcHJpdmF0ZSBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVTX0RFUEVOREVOQ1lfUEFHRV9UQUJMRV9QUk9KRUNUKSsgIjoiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MQUJFTCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19USFJFRV9ET1RTX0UpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9OQU1FID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBOZXdNb2R1bGVEYXRhTW9kZWxHcm91cChDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBEYXRhTW9kZWxTeW5jaEhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnBhcmVudENvbXBvc2l0ZSA9IHBhcmVudDsKLQkJc3luY2hIZWxwZXIgPSBoZWxwZXI7Ci0JCWJ1aWxkQ29tcG9zaXRlcyhwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY29udHJvbHMgd2l0aGluIHRoaXMgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlTW9kdWxlR3JvdXAocGFyZW50KTsKLSAgICAgICAgbW9kdWxlTmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJY3JlYXRlUHJvamVjdE5hbWVHcm91cChwYXJlbnQpOwotCQlpbml0aWFsaXplUHJvamVjdExpc3QoKTsKLQkJY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKHBhcmVudCk7Ci0JCWFkZFNlcGVyYXRvcihwYXJlbnQsMyk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVByb2plY3RMaXN0KCkgewotCQlJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8d29ya3NwYWNlUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VQcm9qZWN0c1tpXTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQkJaXRlbXMuYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQluYW1lc1tpXT0gKFN0cmluZykgaXRlbXMuZ2V0KGkpOwotCQl9Ci0vLwkJbW9kZWwuc2V0SWdub3JlUHJvcGVydHlDaGFuZ2VzKHRydWUpOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldEl0ZW1zKG5hbWVzKTsKLS8vCQltb2RlbC5zZXRJZ25vcmVQcm9wZXJ0eUNoYW5nZXMoZmFsc2UpOwotCQkKLQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSAKLQkJCQl8fCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkubGVuZ3RoKCk9PTApIHsKLQkJCUlQcm9qZWN0IHNlbGVjdGVkUHJvamVjdCA9IGdldFNlbGVjdGVkUHJvamVjdCgpOwotCQkJaWYgKHNlbGVjdGVkUHJvamVjdCE9bnVsbCkgewotCQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChzZWxlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwKLQkJCQkJCXNlbGVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZXMubGVuZ3RoPjApIHsKLQkJCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQobmFtZXNbMF0pOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBuYW1lc1swXSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLmFkZChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkpOwotCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGxhYmVsCi0JCUxhYmVsIHByb2plY3ROYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChQUk9KRUNUX05BTUUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotCQlwcm9qZWN0TmFtZUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXByb2plY3ROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHJvamVjdE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCQlJUnVudGltZSBydW50aW1lID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0JCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCl7Ci0JCQkJCXNlcnZlclRhcmdldFRleHQuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQkJCXN5bmNoSGVscGVyLmdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KElKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lELCBydW50aW1lLmdldE5hbWUoKSk7Ci0JCQkJfQkKLQkJCX0KLQkJfSk7Ci0JCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmV3QnV0dG9uLnNldFRleHQoTkVXX0xBQkVMKTsKLQkJbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZU5ld1Byb2plY3RTZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhwcm9qZWN0TmFtZUNvbWJvLCAKLQkJCQlJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgCi0JCQkJbmV3IENvbnRyb2xbXXtwcm9qZWN0TmFtZUxhYmVsfSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFNlbGVjdGVkUHJvamVjdCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBXb3JrYmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQlPYmplY3Qgb2JqID0gc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlyZXR1cm4gKElQcm9qZWN0KSBvYmo7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlTmV3UHJvamVjdFNlbGVjdGVkKCkgeyAgIAotICAgICAgICBJRGF0YU1vZGVsIGphdmFQcm9qTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIERhdGFNb2RlbFdpemFyZCBuZXdQcm9qZWN0V2l6YXJkID0gbmV3IEZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkKGphdmFQcm9qTW9kZWwpOwotICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhwYXJlbnRDb21wb3NpdGUuZ2V0U2hlbGwoKSwgbmV3UHJvamVjdFdpemFyZCk7Ci0JCWlmIChXaW5kb3cuT0sgPT0gZGlhbG9nLm9wZW4oKSkgewotCQkJU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gamF2YVByb2pNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLmFkZChuZXdQcm9qZWN0TmFtZSk7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQobmV3UHJvamVjdE5hbWUpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCQlJUnVudGltZSBydW50aW1lID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0JCQlpZiAocnVudGltZSAhPSBudWxsKXsKLQkJCQlzZXJ2ZXJUYXJnZXRUZXh0LnNldFRleHQocnVudGltZS5nZXROYW1lKCkpOwotCQkJCXN5bmNoSGVscGVyLmdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KElKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lELCBydW50aW1lLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVNb2R1bGVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJLy8gQWRkIHRoZSBtb2R1bGUgbmFtZSBsYWJlbAotCQlMYWJlbCBtb2R1bGVOYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1vZHVsZU5hbWVMYWJlbC5zZXRUZXh0KE1PRFVMRV9OQU1FKTsKLQkJLy8gQWRkIHRoZSBtb2R1bGUgbmFtZSBlbnRyeSBmaWVsZAotCQltb2R1bGVOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJbW9kdWxlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KG1vZHVsZU5hbWVUZXh0LCAKLQkJCQlJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLAotCQkJCW5ldyBDb250cm9sW10ge30pOwotCQluZXcgTGFiZWwocGFyZW50LFNXVC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChzeW5jaEhlbHBlciAhPSBudWxsKSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZW1vdmVMaXN0ZW5lcihzeW5jaEhlbHBlcik7Ci0JCQlzeW5jaEhlbHBlci5kaXNwb3NlKCk7Ci0JCX0KLQkJbW9kZWwgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGhTcGFuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VwZXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBoU3BhbikgewotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGhTcGFuOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5UQVJHRVRfUlVOVElNRV9MQkwpKTsKLQkJc2VydmVyVGFyZ2V0VGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotLy8JCXNlcnZlclRhcmdldFRleHQuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0vLwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLS8vCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLS8vCQkJCWlmIChydW50aW1lICE9IG51bGwpCi0vLwkJCQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLS8vCQkJfQotLy8JCX0pOwotCQkKLQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAocHJvamVjdE5hbWUhPW51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkhPTApIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJaWYgKHByb2plY3QgIT1udWxsKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOwotCQkJCWlmIChydW50aW1lICE9IG51bGwpewotCQkJCQlzZXJ2ZXJUYXJnZXRUZXh0LnNldFRleHQocnVudGltZS5nZXROYW1lKCkpOwotCQkJCQlzeW5jaEhlbHBlci5nZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FX1RBUkdFVF9JRCwgcnVudGltZS5nZXROYW1lKCkpOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdNb2R1bGVHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdNb2R1bGVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFiOWU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3TW9kdWxlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAzLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmV3TW9kdWxlR3JvdXAgaW1wbGVtZW50cyBJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllc3sKLQkKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIFRleHQgbW9kdWxlTmFtZVRleHQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dCBzZXJ2ZXJUYXJnZXRUZXh0OwotCXByaXZhdGUgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0vLwlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MQUJFTF9VSSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5FV19USFJFRV9ET1RTX0UpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9OQU1FX1VJID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBOZXdNb2R1bGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElEYXRhTW9kZWwgbW9kZWwsIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNIZWxwZXIpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotLy8JCXRoaXMucGFyZW50Q29tcG9zaXRlID0gcGFyZW50OwotCQlzeW5jaEhlbHBlciA9IHN5bmNIZWxwZXI7Ci0JCWJ1aWxkQ29tcG9zaXRlcyhwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY29udHJvbHMgd2l0aGluIHRoaXMgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy9jcmVhdGVQcm9qZWN0TmFtZUdyb3VwKHBhcmVudCk7Ci0JCS8vaW5pdGlhbGl6ZVByb2plY3RMaXN0KCk7Ci0gICAgICAgIGNyZWF0ZU1vZHVsZUdyb3VwKHBhcmVudCk7Ci0gICAgICAgIC8vYWRkU2VwZXJhdG9yKHBhcmVudCwzKTsKLQkJLy9jcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICoKLQkgKi8KLS8vCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQcm9qZWN0TGlzdCgpIHsKLS8vCQlJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotLy8JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChpbnQgaT0wOyBpPHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VQcm9qZWN0c1tpXTsKLS8vCQkJdHJ5IHsKLS8vCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpKSB7Ci0vLwkJCQkJaXRlbXMuYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJCX0KLS8vCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotLy8JCQkJLy9JZ25vcmUKLS8vCQkJfQotLy8JCX0KLS8vCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXTsKLS8vCQlmb3IgKGludCBpPTA7IGk8aXRlbXMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJbmFtZXNbaV09IChTdHJpbmcpIGl0ZW1zLmdldChpKTsKLS8vCQl9Ci0vLwkJLy9tb2RlbC5JZ25vcmVQcm9wZXJ0eUNoYW5nZXModHJ1ZSk7Ci0vLwkJcHJvamVjdE5hbWVDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0vLwkJLy9tb2RlbC5zZXRJZ25vcmVQcm9wZXJ0eUNoYW5nZXMoZmFsc2UpOwotLy8JCQotLy8JCWlmICghbW9kZWwuaXNQcm9wZXJ0eVNldChQUk9KRUNUX05BTUUpIHx8IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkubGVuZ3RoKCk9PTApIHsKLS8vCQkJSVByb2plY3Qgc2VsZWN0ZWRQcm9qZWN0ID0gZ2V0U2VsZWN0ZWRQcm9qZWN0KCk7Ci0vLwkJCWlmIChzZWxlY3RlZFByb2plY3QhPW51bGwpIHsKLS8vCQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChzZWxlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJCW1vZGVsLnNldFByb3BlcnR5KFBST0pFQ1RfTkFNRSxzZWxlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJfQotLy8JCQllbHNlIGlmIChuYW1lcy5sZW5ndGg+MCkgewotLy8JCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KG5hbWVzWzBdKTsKLS8vCQkJCW1vZGVsLnNldFByb3BlcnR5KFBST0pFQ1RfTkFNRSxuYW1lc1swXSk7Ci0vLwkJCX0KLS8vCQl9IGVsc2UgewotLy8JCQlwcm9qZWN0TmFtZUNvbWJvLmFkZChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpKTsKLS8vCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkpOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLS8vCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLS8vCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGxhYmVsCi0vLwkJTGFiZWwgcHJvamVjdE5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLS8vCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoUFJPSkVDVF9OQU1FX1VJKTsKLS8vCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0vLwkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotLy8JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKLS8vCQlwcm9qZWN0TmFtZUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotLy8JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotLy8JCXByb2plY3ROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLS8vCQlwcm9qZWN0TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0vLwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLS8vCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLS8vCQkJCWlmIChydW50aW1lICE9IG51bGwpCi0vLwkJCQkJc2VydmVyVGFyZ2V0VGV4dC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0vLwkJbmV3QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotLy8JCW5ld0J1dHRvbi5zZXRUZXh0KE5FV19MQUJFTF9VSSk7Ci0vLwkJbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0vLwkJCQloYW5kbGVOZXdQcm9qZWN0U2VsZWN0ZWQoKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocHJvamVjdE5hbWVDb21ibywgUFJPSkVDVF9OQU1FLCBuZXcgQ29udHJvbFtde3Byb2plY3ROYW1lTGFiZWx9KTsKLS8vCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0vLwlwcml2YXRlIElQcm9qZWN0IGdldFNlbGVjdGVkUHJvamVjdCgpIHsKLS8vCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFdvcmtiZW5jaC5nZXRJbnN0YW5jZSgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotLy8JCWlmICh3aW5kb3cgPT0gbnVsbCkKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotLy8JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pKQotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0vLwkJT2JqZWN0IG9iaiA9IHN0dWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpCi0vLwkJCXJldHVybiAoSVByb2plY3QpIG9iajsKLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLS8vCQotCS8qKgotCSAqIAotCSAqCi0JICovCi0vLwlwcml2YXRlIHZvaWQgaGFuZGxlTmV3UHJvamVjdFNlbGVjdGVkKCkgewotLy8JCUlEYXRhTW9kZWwgcHJvak1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotLy8JCUZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkIG5ld1Byb2plY3RXaXphcmQgPSBuZXcgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQocHJvak1vZGVsKTsKLS8vCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhwYXJlbnRDb21wb3NpdGUuZ2V0U2hlbGwoKSwgbmV3UHJvamVjdFdpemFyZCk7Ci0vLwkJaWYgKFdpbmRvdy5PSyA9PSBkaWFsb2cub3BlbigpKSB7Ci0vLwkJCVN0cmluZyBuZXdQcm9qZWN0TmFtZSA9IHByb2pNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotLy8JCQlwcm9qZWN0TmFtZUNvbWJvLmFkZChuZXdQcm9qZWN0TmFtZSk7Ci0vLwkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChuZXdQcm9qZWN0TmFtZSk7Ci0vLwkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkpOwotLy8JCQlJUnVudGltZSBydW50aW1lID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0vLwkJCWlmIChydW50aW1lICE9IG51bGwpCi0vLwkJCQlzZXJ2ZXJUYXJnZXRUZXh0LnNldFRleHQocnVudGltZS5nZXROYW1lKCkpOwotLy8JCX0KLS8vCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZHVsZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkvLyBBZGQgdGhlIG1vZHVsZSBuYW1lIGxhYmVsCi0JCUxhYmVsIG1vZHVsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbW9kdWxlTmFtZUxhYmVsLnNldFRleHQoTU9EVUxFX05BTUVfVUkpOwotCQkvLyBBZGQgdGhlIG1vZHVsZSBuYW1lIGVudHJ5IGZpZWxkCi0JCW1vZHVsZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQltb2R1bGVOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQobW9kdWxlTmFtZVRleHQsQ09NUE9ORU5UX05BTUUsbmV3IENvbnRyb2xbXSB7fSk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsU1dULk5PTkUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHN5bmNoSGVscGVyICE9IG51bGwpIHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJCXN5bmNoSGVscGVyLmRpc3Bvc2UoKTsKLQkJfQotCQltb2RlbCA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLS8vCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0vLwkJcmV0dXJuIHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpOwotLy8JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaFNwYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXBlcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhTcGFuKSB7Ci0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gaFNwYW47Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlRBUkdFVF9SVU5USU1FX0xCTCkpOwotCQlzZXJ2ZXJUYXJnZXRUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXNlcnZlclRhcmdldFRleHQuc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2R1bGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChwcm9qZWN0TmFtZSE9bnVsbCAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSE9MCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQlpZiAocHJvamVjdCAhPW51bGwpIHsKLQkJCQlJUnVudGltZSBydW50aW1lID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0JCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCl7Ci0JCQkJCXNlcnZlclRhcmdldFRleHQuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQkJCXN5bmNoSGVscGVyLnN5bmNoVGV4dChzZXJ2ZXJUYXJnZXRUZXh0LCBSVU5USU1FX1RBUkdFVF9JRCwgbnVsbCk7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld01vZHVsZUdyb3VwRXguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3TW9kdWxlR3JvdXBFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhkZjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3TW9kdWxlR3JvdXBFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDMsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdNb2R1bGVHcm91cEV4IHsKLQkKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIENvbWJvIHByb2plY3ROYW1lQ29tYm8gPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IG1vZHVsZU5hbWVUZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgc2VydmVyVGFyZ2V0VGV4dDsKLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RBQkxFX1BST0pFQ1QpKyAiOiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xBQkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5NT0RVTEVfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIE5ld01vZHVsZUdyb3VwRXgoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5wYXJlbnRDb21wb3NpdGUgPSBwYXJlbnQ7Ci0JCXN5bmNoSGVscGVyID0gbmV3IERhdGFNb2RlbFN5bmNoSGVscGVyKG1vZGVsKTsKLQkJYnVpbGRDb21wb3NpdGVzKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb250cm9scyB3aXRoaW4gdGhpcyBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVQcm9qZWN0TmFtZUdyb3VwKHBhcmVudCk7Ci0JCXByb2plY3ROYW1lQ29tYm8uc2V0Rm9jdXMoKTsKLQkJaW5pdGlhbGl6ZVByb2plY3RMaXN0KCk7Ci0JCWNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShwYXJlbnQpOwotCQlhZGRTZXBlcmF0b3IocGFyZW50LDMpOwotCQljcmVhdGVNb2R1bGVHcm91cChwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQcm9qZWN0TGlzdCgpIHsKLQkJSVByb2plY3RbXSB3b3Jrc3BhY2VQcm9qZWN0cyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHMoKTsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlUHJvamVjdHNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpKSB7Ci0JCQkJCWl0ZW1zLmFkZChwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2l0ZW1zLnNpemUoKV07Ci0JCWZvciAoaW50IGk9MDsgaTxpdGVtcy5zaXplKCk7IGkrKykgewotCQkJbmFtZXNbaV09IChTdHJpbmcpIGl0ZW1zLmdldChpKTsKLQkJfQotCQkvL21vZGVsLnNldElnbm9yZVByb3BlcnR5Q2hhbmdlcyh0cnVlKTsKLQkJcHJvamVjdE5hbWVDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0JCS8vbW9kZWwuc2V0SWdub3JlUHJvcGVydHlDaGFuZ2VzKGZhbHNlKTsKLQkJCi0JCWlmICghbW9kZWwuaXNQcm9wZXJ0eVNldChJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkgfHwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpLmxlbmd0aCgpPT0wKSB7Ci0JCQlJUHJvamVjdCBzZWxlY3RlZFByb2plY3QgPSBnZXRTZWxlY3RlZFByb2plY3QoKTsKLQkJCWlmIChzZWxlY3RlZFByb2plY3QhPW51bGwpIHsKLQkJCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQoc2VsZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsc2VsZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChuYW1lcy5sZW5ndGg+MCkgewotCQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChuYW1lc1swXSk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsbmFtZXNbMF0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJvamVjdE5hbWVDb21iby5hZGQobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoUFJPSkVDVF9OQU1FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKLQkJcHJvamVjdE5hbWVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOwotCQkJCWlmIChydW50aW1lICE9IG51bGwpCi0JCQkJCXNlcnZlclRhcmdldFRleHQuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQluZXdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ld0J1dHRvbi5zZXRUZXh0KE5FV19MQUJFTCk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVOZXdQcm9qZWN0U2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocHJvamVjdE5hbWVDb21ibywgSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIG5ldyBDb250cm9sW117cHJvamVjdE5hbWVMYWJlbH0pOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRTZWxlY3RlZFByb2plY3QoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV29ya2JlbmNoLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCU9iamVjdCBvYmogPSBzdHVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiAoSVByb2plY3QpIG9iajsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5ld1Byb2plY3RTZWxlY3RlZCgpIHsKLQkJSURhdGFNb2RlbCBwcm9qTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCUZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkIG5ld1Byb2plY3RXaXphcmQgPSBuZXcgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQocHJvak1vZGVsKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cocGFyZW50Q29tcG9zaXRlLmdldFNoZWxsKCksIG5ld1Byb2plY3RXaXphcmQpOwotCQlpZiAoV2luZG93Lk9LID09IGRpYWxvZy5vcGVuKCkpIHsKLQkJCVN0cmluZyBuZXdQcm9qZWN0TmFtZSA9IHByb2pNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLmFkZChuZXdQcm9qZWN0TmFtZSk7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQobmV3UHJvamVjdE5hbWUpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCQlJUnVudGltZSBydW50aW1lID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0JCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJCXNlcnZlclRhcmdldFRleHQuc2V0VGV4dChydW50aW1lLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVNb2R1bGVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJLy8gQWRkIHRoZSBtb2R1bGUgbmFtZSBsYWJlbAotCQlMYWJlbCBtb2R1bGVOYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1vZHVsZU5hbWVMYWJlbC5zZXRUZXh0KE1PRFVMRV9OQU1FKTsKLQkJLy8gQWRkIHRoZSBtb2R1bGUgbmFtZSBlbnRyeSBmaWVsZAotCQltb2R1bGVOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJbW9kdWxlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KG1vZHVsZU5hbWVUZXh0LElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsbmV3IENvbnRyb2xbXSB7fSk7Ci0JCW5ldyBMYWJlbChwYXJlbnQsU1dULk5PTkUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHN5bmNoSGVscGVyICE9IG51bGwpIHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJCXN5bmNoSGVscGVyLmRpc3Bvc2UoKTsKLQkJfQotCQltb2RlbCA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaFNwYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXBlcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhTcGFuKSB7Ci0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gaFNwYW47Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlRBUkdFVF9SVU5USU1FX0xCTCkpOwotCQlzZXJ2ZXJUYXJnZXRUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXNlcnZlclRhcmdldFRleHQuc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKTsKLQkJaWYgKHByb2plY3ROYW1lIT1udWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpIT0wKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCWlmIChwcm9qZWN0ICE9bnVsbCkgewotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJCQlzZXJ2ZXJUYXJnZXRUZXh0LnNldFRleHQocnVudGltZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3UHJvamVjdEdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld1Byb2plY3RHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmU1MmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3UHJvamVjdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllczsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTmV3UHJvamVjdEdyb3VwIHsKLQlwcml2YXRlIElEYXRhTW9kZWwgcHJvamVjdE1vZGVsOwotCXB1YmxpYyBUZXh0IHByb2plY3ROYW1lRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IGxvY2F0aW9uUGF0aEZpZWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG51bGw7Ci0JLy8JY29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIID0gMzA1OwotCS8vCWRlZmF1bHQgdmFsdWVzCi0JcHJpdmF0ZSBTdHJpbmcgZGVmUHJvamVjdE5hbWVMYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5BTUVfTEFCRUwpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CUk9XU0VfTEFCRUwpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZkRpckRpYWxvZ0xhYmVsID0gIkRpcmVjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIE5ld1Byb2plY3RHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElEYXRhTW9kZWwgbW9kZWwsIERhdGFNb2RlbFN5bmNoSGVscGVyIGhlbHBlcikgewotICAgICAgICBwcm9qZWN0TW9kZWwgPSBtb2RlbDsKLQkJc3luY2hIZWxwZXIgPSBoZWxwZXI7Ci0JCWJ1aWxkQ29tcG9zaXRlcyhwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY29udHJvbHMgd2l0aGluIHRoaXMgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlUHJvamVjdE5hbWVHcm91cChwYXJlbnQpOwotCQljcmVhdGVQcm9qZWN0TG9jYXRpb25Hcm91cChwYXJlbnQpOwotCQlwcm9qZWN0TmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoZGVmUHJvamVjdE5hbWVMYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvLyBwYWQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3ROYW1lRmllbGQsIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtwcm9qZWN0TmFtZUxhYmVsfSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0TG9jYXRpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vCQlzZXQgdXAgbG9jYXRpb24gcGF0aCBsYWJlbAotCQlMYWJlbCBsb2NhdGlvblBhdGhMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25QYXRoTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5QUk9KRUNUX0xPQ19MQkwpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsb2NhdGlvblBhdGhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgbG9jYXRpb24gcGF0aCBlbnRyeSBmaWVsZAotCQlsb2NhdGlvblBhdGhGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCWxvY2F0aW9uUGF0aEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCS8vIHNldCB1cCBicm93c2UgYnV0dG9uCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQobG9jYXRpb25QYXRoRmllbGQsIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1RfTE9DQVRJT04sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGxvY2F0aW9uUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShkZWZEaXJEaWFsb2dMYWJlbCk7Ci0JCVN0cmluZyBkaXJOYW1lID0gcHJvamVjdE1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1RfTE9DQVRJT04pOwotCQlpZiAoKGRpck5hbWUgIT0gbnVsbCkgJiYgKGRpck5hbWUubGVuZ3RoKCkgIT0gMCkpIHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQkJaWYgKHBhdGguZXhpc3RzKCkpIHsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXJOYW1lKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvamVjdE1vZGVsLnNldFByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1RfTE9DQVRJT04sIHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHByb2plY3RNb2RlbCA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvUGFja2FnZU5hbWVSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9QYWNrYWdlTmFtZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZWMxNzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9QYWNrYWdlTmFtZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IgU2FjaGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVSZXNvbHZlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKLQotCXB1YmxpYyBQYWNrYWdlTmFtZVJlc29sdmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKGZpbmFsIFN0cmluZyBjbGFzc0ZpbGUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY2xhc3NGaWxlKTsKLQkJYnl0ZVtdIGNsYXNzYnVmID0gbmV3IGJ5dGVbKGludCkgZmlsZS5sZW5ndGgoKV07Ci0JCXRyeSB7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJaW5zdHJlYW0ucmVhZChjbGFzc2J1Zik7Ci0JCQlpbnN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYm9vbGVhbiBiYWRjbGFzc25hbWUgPSB0cnVlOwotCQlTdHJpbmcgY2xhc3NuYW1lID0gY2xhc3NGaWxlLnJlcGxhY2UoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7Ci0JCWludCBlbmRpOwotCQlpZiAoY2xhc3NuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJZW5kaSA9IGNsYXNzbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQllbHNlCi0JCQllbmRpID0gY2xhc3NuYW1lLmxlbmd0aCgpOwotCQlpbnQgaSA9IGNsYXNzbmFtZS5pbmRleE9mKCcuJyk7Ci0JCXdoaWxlIChpIDwgZW5kaSAmJiBiYWRjbGFzc25hbWUgPT0gdHJ1ZSkgewotCQkJYmFkY2xhc3NuYW1lID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWRlZmluZUNsYXNzKGNsYXNzbmFtZS5zdWJzdHJpbmcoaSArIDEsIGVuZGkpLCBjbGFzc2J1ZiwgMCwgY2xhc3NidWYubGVuZ3RoKTsKLQkJCX0gY2F0Y2ggKGphdmEubGFuZy5Ob0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChtc2cgPT0gbnVsbCB8fCBtc2cuaW5kZXhPZignICcpID4gMCkgewotCQkJCQliYWRjbGFzc25hbWUgPSB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJYmFkY2xhc3NuYW1lID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChiYWRjbGFzc25hbWUpIHsKLQkJCQlpID0gY2xhc3NuYW1lLmluZGV4T2YoJy4nLCBpICsgMSk7Ci0JCQkJaWYgKGkgPT0gLTEpCi0JCQkJCWkgPSBlbmRpOwotCQkJfQotCQl9Ci0JCWlmIChiYWRjbGFzc25hbWUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNsYXNzbmFtZS5zdWJzdHJpbmcoaSArIDEsIGVuZGkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyRWFyQW5kU3RhbmRhbG9uZUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1NlcnZlckVhckFuZFN0YW5kYWxvbmVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2JjN2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyRWFyQW5kU3RhbmRhbG9uZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFYXJBbmRTdGFuZGFsb25lR3JvdXAgaW1wbGVtZW50cyBJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gbmV3RUFSOwotCXByaXZhdGUgQ29tYm8gZWFyQ29tYm87Ci0JcHJpdmF0ZSBMYWJlbCBlYXJMYWJlbDsKLQlwcml2YXRlIEJ1dHRvbiBhZGRUb0VBUjsKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGU7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFNlcnZlckVhckFuZFN0YW5kYWxvbmVHcm91cChDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBEYXRhTW9kZWxTeW5jaEhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnBhcmVudENvbXBvc2l0ZSA9IHBhcmVudDsKLQkJc3luY2hIZWxwZXIgPSBoZWxwZXI7Ci0JCWJ1aWxkQ29tcG9zaXRlcyhwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZENvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVFYXJBbmRTdGFuZGFsb25lQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVhckFuZFN0YW5kYWxvbmVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVUlfU0hPV19FQVJfU0VDVElPTikpIHsKLQotCQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgLy9wYWQKLQotCQkJLy8gQ3JlYXRlIEFkZCB0byBFQVIgY2hlY2tib3gKLQkJCWFkZFRvRUFSID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQlhZGRUb0VBUi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkxJTktfTU9EVUxFVE9fRUFSX1BST0pFQ1QpKTsKLQkJCWFkZFRvRUFSLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlhZGRUb0VBUi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWRkVG9FQVIsIEFERF9UT19FQVIsIG51bGwpOwotCQkJCi0JCQkvLyBDcmVhdGUgRUFSIEdyb3VwCi0JCQllYXJMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWVhckxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX1BST0pFQ1RfRk9SX01PRFVMRV9DUkVBVElPTikpOwotCi0JCQllYXJDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWVhckNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQluZXdFQVIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbmV3RUFSLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfVykpOwotCQkJbmV3RUFSLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJbmV3RUFSLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWhhbmRsZU5ld0VhclNlbGVjdGVkKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJfQotCi0JCQl9KTsKLQotCQkJQ29udHJvbFtdIGRlcHMgPSBuZXcgQ29udHJvbFtde2VhckxhYmVsLCBuZXdFQVJ9OwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhlYXJDb21ibywgRUFSX0NPTVBPTkVOVF9OQU1FLCBkZXBzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOZXdFYXJTZWxlY3RlZCgpIHsKLQkJSURhdGFNb2RlbCBtb2R1bGVNb2RlbCA9IG1vZGVsOwotICAgICAgICBJRGF0YU1vZGVsIGVhck1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWVhck1vZGVsLnNldEludFByb3BlcnR5KENPTVBPTkVOVF9WRVJTSU9OLCBtb2R1bGVNb2RlbC5nZXRJbnRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTikpOwotCQllYXJNb2RlbC5zZXRQcm9wZXJ0eShDT01QT05FTlRfTkFNRSwgbW9kdWxlTW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9OQU1FKSk7Ci0JCUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkIGVhcldpemFyZCA9IG5ldyBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZChlYXJNb2RlbCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHBhcmVudENvbXBvc2l0ZS5nZXRTaGVsbCgpLCBlYXJXaXphcmQpOwotCQlpZiAoV2luZG93Lk9LID09IGRpYWxvZy5vcGVuKCkpIHsKLQkJCW1vZHVsZU1vZGVsLnNldFByb3BlcnR5KEVBUl9DT01QT05FTlRfTkFNRSwgZWFyTW9kZWwuZ2V0UHJvcGVydHkoQ09NUE9ORU5UX05BTUUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJbW9kZWwuZGlzcG9zZSgpOwotCQlzeW5jaEhlbHBlciA9IG51bGw7Ci0JCW1vZGVsID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRDb21ib0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TZXJ2ZXJUYXJnZXRDb21ib0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2MzMTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0Q29tYm9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyNywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlCi0gKiBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUmVzb3VyY2VNYW5hZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUYXJnZXRDb21ib0hlbHBlciB7Ci0JcHJpdmF0ZSBMaXN0IHRhcmdldHM7Ci0JcHVibGljIFN0cmluZ1tdIGl0ZW1zOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRJZCA9ICJjb20uaWJtLmV0b29scy53ZWJzcGhlcmUuc2VydmVyVGFyZ2V0LmJhc2UudjUxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRFeHByZXNzSWQgPSAiY29tLmlibS5ldG9vbHMud2Vic3BoZXJlLnNlcnZlclRhcmdldC5leHByZXNzLnY1MSI7IC8vJE5PTi1OTFMtMSQKLQotCVNlcnZlclRhcmdldENvbWJvSGVscGVyKExpc3QgdGFyZ2V0cywgU3RyaW5nW10gaXRlbXMpIHsKLQkJdGhpcy50YXJnZXRzID0gdGFyZ2V0czsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCXB1YmxpYyBJUnVudGltZSBnZXRTZWxlY3RlZFRhcmdldChpbnQgaXRlbUluZGV4KSB7Ci0JCXJldHVybiAoSVJ1bnRpbWUpIHRhcmdldHMuZ2V0KGl0ZW1JbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoSVJ1bnRpbWUgdGFyZ2V0KSB7Ci0JCXJldHVybiB0YXJnZXRzLmNvbnRhaW5zKHRhcmdldCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0U2VydmVyVGFyZ2V0SW5kZXgoKSB7Ci0JCUlSdW50aW1lIHY1MVRhcmdldFNlcnZlciA9IG51bGw7Ci0JCWlmIChKMkVFUGx1Z2luLmlzRUpCU3VwcG9ydEF2YWlsYWJsZSgpKQotCQkJdjUxVGFyZ2V0U2VydmVyID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UnVudGltZShkZWZhdWx0SWQpOwotCQllbHNlCi0JCQl2NTFUYXJnZXRTZXJ2ZXIgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lKGRlZmF1bHRFeHByZXNzSWQpOwotCQlpZiAodjUxVGFyZ2V0U2VydmVyICE9IG51bGwgJiYgdGFyZ2V0cy5jb250YWlucyh2NTFUYXJnZXRTZXJ2ZXIpKQotCQkJcmV0dXJuIHRhcmdldHMuaW5kZXhPZih2NTFUYXJnZXRTZXJ2ZXIpICsgMTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VydmVyVGFyZ2V0SW5kZXhGcm9tSXRlbXMoSVJ1bnRpbWUgc2VydmVyVGFyZ2V0KSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZyBzZXJ2ZXJUYXJnZXRMYWJlbCA9IHNlcnZlclRhcmdldC5nZXROYW1lKCkgKyAiICgiICsgc2VydmVyVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbGFiZWwgPSBpdGVtc1tpXTsKLQkJCQlpZiAobGFiZWwuZXF1YWxzKHNlcnZlclRhcmdldExhYmVsKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFZhbGlkVGFyZ2V0cygpIHsKLQkJcmV0dXJuIHRhcmdldHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3YmJlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1NlcnZlclRhcmdldEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgOCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotCi0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVGFyZ2V0R3JvdXAgaW1wbGVtZW50cyBJSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzewotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCXByaXZhdGUgQ29tYm8gdGFyZ2V0U2VydmVyQ29tYm87Ci0JcHJpdmF0ZSBCdXR0b24gbmV3VGFyZ2V0U2VydmVyQnV0dG9uOwotCXB1YmxpYyBDb21wb3NpdGUgcGFyZW50VUk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFNlcnZlclRhcmdldEdyb3VwKCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFNlcnZlclRhcmdldEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSURhdGFNb2RlbCBtb2RlbCwgRGF0YU1vZGVsU3luY2hIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5wYXJlbnRVSSA9IHBhcmVudDsKLQkJc3luY2hIZWxwZXIgPSBoZWxwZXI7Ci0JCWJ1aWxkQ29tcG9zaXRlcyhwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY29udHJvbHMgd2l0aGluIHRoaXMgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlU2VydmVyVGFyZ2V0R3JvdXAocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcnZlclRhcmdldEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgc2VydmVyVGFyZ2V0TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNlcnZlclRhcmdldExhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuVEFSR0VUX1JVTlRJTUVfTEJMKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJc2VydmVyVGFyZ2V0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCi0JCXRhcmdldFNlcnZlckNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQl0YXJnZXRTZXJ2ZXJDb21iby5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCi0JCW5ld1RhcmdldFNlcnZlckJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW5ld1RhcmdldFNlcnZlckJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmV3VGFyZ2V0U2VydmVyQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSkpOwotCQluZXdUYXJnZXRTZXJ2ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlTmV3VGFyZ2V0U2VydmVyQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQkJbmV3VGFyZ2V0U2VydmVyQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJQ29udHJvbFtdIGRlcHMgPSBuZXcgQ29udHJvbFtde3NlcnZlclRhcmdldExhYmVsLCBuZXdUYXJnZXRTZXJ2ZXJCdXR0b259OwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHRhcmdldFNlcnZlckNvbWJvLCBSVU5USU1FX1RBUkdFVF9JRCwgZGVwcyk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5ld1RhcmdldFNlcnZlckJ1dHRvblByZXNzZWQoKSB7Ci0JCUZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5sYXVuY2hOZXdSdW50aW1lV2l6YXJkKHBhcmVudFVJLmdldFNoZWxsKCksIG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQltb2RlbC5yZW1vdmVMaXN0ZW5lcihzeW5jaEhlbHBlcik7Ci0JCW1vZGVsID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhcmdldFNlcnZlckNvbWJvLgotCSAqLwotCXB1YmxpYyBDb21ibyBnZXRUYXJnZXRTZXJ2ZXJDb21ibygpIHsKLQkJcmV0dXJuIHRhcmdldFNlcnZlckNvbWJvOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXRTZXJ2ZXJDb21ibwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldFNlcnZlckNvbWJvIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRTZXJ2ZXJDb21ibyhDb21ibyB0YXJnZXRTZXJ2ZXJDb21ibykgewotCQl0aGlzLnRhcmdldFNlcnZlckNvbWJvID0gdGFyZ2V0U2VydmVyQ29tYm87Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXdUYXJnZXRTZXJ2ZXJCdXR0b24uCi0JICovCi0JcHVibGljIEJ1dHRvbiBnZXROZXdUYXJnZXRTZXJ2ZXJCdXR0b24oKSB7Ci0JCXJldHVybiBuZXdUYXJnZXRTZXJ2ZXJCdXR0b247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1RhcmdldFNlcnZlckJ1dHRvbgotCSAqICAgICAgICAgICAgVGhlIG5ld1RhcmdldFNlcnZlckJ1dHRvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFyZ2V0U2VydmVyQnV0dG9uKEJ1dHRvbiBuZXdUYXJnZXRTZXJ2ZXJCdXR0b24pIHsKLQkJdGhpcy5uZXdUYXJnZXRTZXJ2ZXJCdXR0b24gPSBuZXdUYXJnZXRTZXJ2ZXJCdXR0b247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0VUlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU2VydmVyVGFyZ2V0VUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjMzg3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1NlcnZlclRhcmdldFVJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTcsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUYXJnZXRVSUhlbHBlciB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUYXJnZXRVSUhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWxlY3RlZFNlcnZlclRhcmdldFN0cmluZyhDb21ibyBzZXJ2ZXJUYXJnZXRDb21ibykgewotCQlpZiAoc2VydmVyVGFyZ2V0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAtMSkKLQkJCXJldHVybiBzZXJ2ZXJUYXJnZXRDb21iby5nZXRJdGVtKHNlcnZlclRhcmdldENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0U2VsZWN0ZWRTZXJ2ZXJUYXJnZXRTdHJpbmdJbmRleChDb21ibyBzZXJ2ZXJUYXJnZXRDb21ibykgewotCQlyZXR1cm4gc2VydmVyVGFyZ2V0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0Rm9yUHJvamVjdChTaGVsbCBzaGVsbCwgSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSkgewotLy8JCS8vU2VydmVyVGFyZ2V0SGVscGVyLmNsZWFuVXBOb25TZXJ2ZXJUYXJnZXRDbGFzc3BhdGgocHJvamVjdCk7Ci0vLwkJc2V0U2VydmVyVGFyZ2V0KHNoZWxsLCBwcm9qZWN0LCBydW50aW1lLCBudWxsKTsKLS8vCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlYXJQcm9qZWN0Ci0JICogQHBhcmFtIG1vZHVsZVByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNldE1vZHVsZVNlcnZlclRhcmdldElmTmVjZXNzYXJ5KElQcm9qZWN0IGVhclByb2plY3QsIElQcm9qZWN0IG1vZHVsZVByb2plY3QsIFNoZWxsIHNoZWxsKSB7Ci0JCUlSdW50aW1lIGVhclJ1bnRpbWUgPSBnZXRQcm9qZWN0UnVudGltZShlYXJQcm9qZWN0KTsKLQkJaWYgKGVhclJ1bnRpbWUgIT0gbnVsbCkgewotCQkJSVJ1bnRpbWUgbW9kdWxlUnVudGltZSA9IGdldFByb2plY3RSdW50aW1lKG1vZHVsZVByb2plY3QpOwotCQkJaWYgKG1vZHVsZVJ1bnRpbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmICghZWFyUnVudGltZS5nZXRJZCgpLmVxdWFscyhtb2R1bGVSdW50aW1lLmdldElkKCkpKSB7Ci0JCQkJU3RyaW5nIGRpYWxvZ01lc3NhZ2UgPSBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2hhbmdlX01vZHVsZV9TZXJ2ZXJfVGFyZ2V0X0RpYWxvZ19NZXNzYWdlX1VJXyIsIG5ldyBPYmplY3RbXXtlYXJSdW50aW1lLmdldE5hbWUoKSwgbW9kdWxlUnVudGltZS5nZXROYW1lKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBkaWFsb2dUaXRsZSA9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDaGFuZ2VfU2VydmVyX1RhcmdldF9EaWFsb2dfVGl0bGVfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgbnVsbCwgZGlhbG9nTWVzc2FnZSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMfSwgMCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSAwKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIElSdW50aW1lIHJldHVybiB0aGUgZXhpc3RpbmcgVGFyZ2V0IHJ1bnRpbWUgb24gYSBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZ2V0UHJvamVjdFJ1bnRpbWUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7Ci0JfQotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVBUkoyRUVMZXZlbChJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JLy8JCUVBUk5hdHVyZVJ1bnRpbWUgbmF0dXJlID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGVhclByb2plY3QpOwotCS8vCQlTdHJpbmcgajJlZUxldmVsID0gbnVsbDsKLQkvLwkJaW50IG5hdHVyZUlEID0gbmF0dXJlLmdldEoyRUVWZXJzaW9uKCk7Ci0JLy8JCXN3aXRjaCAobmF0dXJlSUQpIHsKLQkvLwkJCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSA6Ci0JLy8JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVDsKLQkvLwkJCQlicmVhazsKLQkvLwkJCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSA6Ci0JLy8JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVDsKLQkvLwkJCQlicmVhazsKLQkvLwkJCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSA6Ci0JLy8JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVDsKLQkvLwkJCQlicmVhazsKLQkvLwkJCWRlZmF1bHQgOgotCS8vCQkJCWoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80X1RFWFQ7Ci0JLy8JCQkJYnJlYWs7Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIGoyZWVMZXZlbDsKLQkvLwl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0KFNoZWxsIHNoZWxsLCBJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCVNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuc2V0UnVudGltZVRhcmdldChydW50aW1lLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU2VydmVyVGFyZ2V0Q29tYm9IZWxwZXIgZ2V0VmFsaWRTZXJ2ZXJUYXJnZXRDb21ib0l0ZW1zKFN0cmluZyBqMmVlVHlwZSwgU3RyaW5nIHNlbGVjdGVkVmVyc2lvbikgewotCQlJUnVudGltZVtdIHZhbGlkU2VydmVyVGFyZ2V0cyA9IFNlcnZlclV0aWwuZ2V0UnVudGltZXMoajJlZVR5cGUsIHNlbGVjdGVkVmVyc2lvbik7Ci0JCVN0cmluZ1tdIHNlcnZlclRhcmdldExpc3QgPSBudWxsOwotCQlpZiAodmFsaWRTZXJ2ZXJUYXJnZXRzLmxlbmd0aD4wKSB7Ci0JCQlpbnQgc2VydmVyVGFyZ2V0TGlzdFNpemUgPSB2YWxpZFNlcnZlclRhcmdldHMubGVuZ3RoOwotCQkJc2VydmVyVGFyZ2V0TGlzdCA9IG5ldyBTdHJpbmdbc2VydmVyVGFyZ2V0TGlzdFNpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFNlcnZlclRhcmdldHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUnVudGltZSBydW50aW1lID0gdmFsaWRTZXJ2ZXJUYXJnZXRzW2ldOwotCQkJCXNlcnZlclRhcmdldExpc3RbaV0gPSBydW50aW1lLmdldE5hbWUoKSArICIgKCIgKyBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFNlcnZlclRhcmdldENvbWJvSGVscGVyKEFycmF5cy5hc0xpc3QodmFsaWRTZXJ2ZXJUYXJnZXRzKSwgc2VydmVyVGFyZ2V0TGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRWFyVmFsaWRhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBFQVJWYWxpZGF0aW9uSGVscGVyLmNyZWF0ZVZhbGlkYXRpb25SdW5uYWJsZShwcm9qZWN0KTsKLQkJCXJ1bm5hYmxlLnJ1bihudWxsKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihpZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaXRlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Mjk3MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbiBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3RyaW5nQXJyYXlMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJldHVybiAoKExpc3QpIGVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQl9Ci0JcHJvdGVjdGVkIGNsYXNzIFN0cmluZ0FycmF5TGlzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbGFiZWxQcm92aWRlckltYWdlOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJU3RyaW5nW10gYXJyYXkgPSAoU3RyaW5nW10pIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgcyA9IGFycmF5WzBdOwotCQkJcmV0dXJuIHM7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQWRkU3RyaW5nQXJyYXlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCQlwcm90ZWN0ZWQgU3RyaW5nIHdpbmRvd1RpdGxlOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gbGFiZWxzRm9yVGV4dEZpZWxkOwotCQlwcm90ZWN0ZWQgVGV4dFtdIHRleHRzOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gc3RyaW5nQXJyYXk7Ci0JCS8qKgotCQkgKiBDTVBGaWVsZERpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCQkgKi8KLQkJcHVibGljIEFkZFN0cmluZ0FycmF5RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgd2luZG93VGl0bGUsIFN0cmluZ1tdIGxhYmVsc0ZvclRleHRGaWVsZCkgewotCQkJc3VwZXIoc2hlbGwpOwotCQkJdGhpcy53aW5kb3dUaXRsZSA9IHdpbmRvd1RpdGxlOwotCQkJdGhpcy5sYWJlbHNGb3JUZXh0RmllbGQgPSBsYWJlbHNGb3JUZXh0RmllbGQ7Ci0JCX0KLQkJLyoqCi0JCSAqIENNUEZpZWxkRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCWdldFNoZWxsKCkuc2V0VGV4dCh3aW5kb3dUaXRsZSk7Ci0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJCWludCBuID0gbGFiZWxzRm9yVGV4dEZpZWxkLmxlbmd0aDsKLQkJCXRleHRzID0gbmV3IFRleHRbbl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkJCWxhYmVsLnNldFRleHQobGFiZWxzRm9yVGV4dEZpZWxkW2ldKTsKLQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQkJCXRleHRzW2ldID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJCWRhdGEud2lkdGhIaW50ID0gMTAwOwotCQkJCXRleHRzW2ldLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl9Ci0KLQkJCS8vIHNldCBmb2N1cwotCQkJdGV4dHNbMF0uc2V0Rm9jdXMoKTsKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCQlpbnQgbiA9IGxhYmVsc0ZvclRleHRGaWVsZC5sZW5ndGg7Ci0JCQlzdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbbl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCXN0cmluZ0FycmF5W2ldID0gdGV4dHNbaV0uZ2V0VGV4dCgpOwotCQkJfQotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nQXJyYXk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCXByaXZhdGUgU3RyaW5nW10gbGFiZWxzRm9yVGV4dDsKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotCXByaXZhdGUgSW1hZ2UgbGFiZWxQcm92aWRlckltYWdlOwotCi0JcHVibGljIFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGFkZEJ1dHRvbkxhYmVsLCBTdHJpbmcgcmVtb3ZlQnV0dG9uTGFiZWwsIFN0cmluZ1tdIGxhYmVsc0ZvclRleHQsIEltYWdlIGxhYmVsUHJvdmlkZXJJbWFnZSwKLQkJCUlEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5sYWJlbHNGb3JUZXh0ID0gbGFiZWxzRm9yVGV4dDsKLQkJdGhpcy5sYWJlbFByb3ZpZGVySW1hZ2UgPSBsYWJlbFByb3ZpZGVySW1hZ2U7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA0OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl0aGlzLnNldExheW91dChsYXlvdXQpOwotCQl0aGlzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIHRpdGxlTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkxFRlQpOwotCQl0aXRsZUxhYmVsLnNldFRleHQodGl0bGUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aXRsZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRoaXMpOwotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU3RyaW5nQXJyYXlMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgU3RyaW5nQXJyYXlMaXN0TGFiZWxQcm92aWRlcigpKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG8gPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OVUxMKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkNvbXBvLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Db21wby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULlBVU0gpOwotCQlhZGRCdXR0b24uc2V0VGV4dChhZGRCdXR0b25MYWJlbCk7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG8sIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQocmVtb3ZlQnV0dG9uTGFiZWwpOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJQWRkU3RyaW5nQXJyYXlEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFN0cmluZ0FycmF5RGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBsYWJlbHNGb3JUZXh0KTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBkaWFsb2cuZ2V0U3RyaW5nQXJyYXkoKTsKLQkJYWRkU3RyaW5nQXJyYXkoc3RyaW5nQXJyYXkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCU9iamVjdCBzZWxlY3RlZE9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCXJlbW92ZVN0cmluZ0FycmF5KHNlbGVjdGVkT2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJpbmdBcnJheShTdHJpbmdbXSBzdHJpbmdBcnJheSkgewotCQlMaXN0IHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHN0cmluZ0FycmF5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJaWYgKHZhbHVlTGlzdCA9PSBudWxsKQotCQkJdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWx1ZUxpc3QuYWRkKHN0cmluZ0FycmF5KTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJpbmdBcnJheShPYmplY3Qgc2VsZWN0ZWRTdHJpbmdBcnJheSkgewotCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJdmFsdWVMaXN0LnJlbW92ZShzZWxlY3RlZFN0cmluZ0FycmF5KTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChMaXN0IGlucHV0KSB7Ci0JCXZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCS8vIENyZWF0ZSBhIG5ldyBsaXN0IHRvIHRyaWdnZXIgcHJvcGVydHkgY2hhbmdlCi0JCUxpc3QgbmV3SW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW5ld0lucHV0LmFkZEFsbChpbnB1dCk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3SW5wdXQpOwotCX0KLQotCXB1YmxpYyBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgQnV0dG9uIGdldEFkZEJ1dHRvbigpIHsKLQkJcmV0dXJuIGFkZEJ1dHRvbjsKLQl9Ci0KLQlwdWJsaWMgQnV0dG9uIGdldFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIHJlbW92ZUJ1dHRvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9UYWJsZU9iamVjdHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvVGFibGVPYmplY3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODBkMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9UYWJsZU9iamVjdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDMvMTkvMjAwMSA1OjEwOjE0IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZU9iamVjdHMgewotCXB1YmxpYyBMaXN0IHRhYmxlT2JqZWN0c0xpc3Q7Ci0KLQkvKioKLQkgKiBFSkJzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRhYmxlT2JqZWN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGFibGVPYmplY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRUYWJsZU9iamVjdHMoKSB7Ci0JCXJldHVybiB0YWJsZU9iamVjdHNMaXN0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMaXN0KCkgewotCQlpZiAodGFibGVPYmplY3RzTGlzdCA9PSBudWxsKQotCQkJdGFibGVPYmplY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9XaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4MWI2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEBhdXRob3IgU2FjaGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBpbXBvcnRGcm9tRGlyOwotCXByb3RlY3RlZCBCdXR0b24gaW1wb3J0RnJvbVppcDsKLQotCXByaXZhdGUgTGlzdCBkcmFnQW5kRHJvcEZpbGVOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEYXRhVHJhbnNmZXIuZmlsZVN5c3RlbVRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJGaWxlSW1wb3J0LmltcG9ydEZpbGVTeXN0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFdpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZShTdHJpbmcgcGFnZU5hbWUsIExpc3QgZmlsZU5hbWVzKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5maWxlU3lzdGVtVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuaW1wb3J0RmlsZVN5c3RlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImltcG9ydF9jbGFzc19maWxlX3dpel9iYW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJZHJhZ0FuZERyb3BGaWxlTmFtZXMgPSBmaWxlTmFtZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX0NMQVNTX1dJWkFSRF9QMSk7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQlDb21wb3NpdGUgYUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWFDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlhQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJYUNvbXBvc2l0ZS5zZXRTaXplKGFDb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0JCWFDb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJY3JlYXRlSW1wb3J0VHlwZUdyb3VwKGFDb21wb3NpdGUpOwotCQlzZXRDb250cm9sKGFDb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUltcG9ydFR5cGVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBpbXBvcnRUeXBlR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWltcG9ydFR5cGVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJaW1wb3J0VHlwZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQkvL2ltcG9ydFR5cGVHcm91cC5zZXRUZXh0KFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiV2l6YXJkRXhwb3J0UGFnZS5vcHRpb25zIikpOwotCQkvLyAvLyROT04tTkxTLTEkCi0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJV2l6YXJkIHdpeiA9IGdldFdpemFyZCgpOwotCQkJCWlmICgoKENsYXNzZXNJbXBvcnRXaXphcmQpIHdpeikucGFnZTEgIT0gbnVsbCkgewotCQkJCQkoKENsYXNzZXNJbXBvcnRXaXphcmQpIHdpeikucGFnZTEuYmxhbmtQYWdlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlpbXBvcnRGcm9tRGlyID0gbmV3IEJ1dHRvbihpbXBvcnRUeXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWltcG9ydEZyb21EaXIuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ2xhc3Nlc0ltcG9ydC5mcm9tRGlyIikpOyAvLyROT04tTkxTLTEkCi0JCWltcG9ydEZyb21EaXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCWltcG9ydEZyb21aaXAgPSBuZXcgQnV0dG9uKGltcG9ydFR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJaW1wb3J0RnJvbVppcC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDbGFzc2VzSW1wb3J0LmZyb21aaXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW1wb3J0RnJvbVppcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJSVdpemFyZCB3aXogPSBnZXRXaXphcmQoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKLQkJaWYgKCgoQ2xhc3Nlc0ltcG9ydFdpemFyZCkgd2l6KS5maWxlTmFtZXMgIT0gbnVsbCkKLQkJCWZpbGVOYW1lID0gKChDbGFzc2VzSW1wb3J0V2l6YXJkKSB3aXopLmZpbGVOYW1lcy5nZXQoMCkudG9TdHJpbmcoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgKGZpbGVOYW1lLmVuZHNXaXRoKCIuemlwIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpbXBvcnRGcm9tRGlyLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlpbXBvcnRGcm9tWmlwLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWltcG9ydEZyb21EaXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJaW1wb3J0RnJvbVppcC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXRJbXBvcnRGcm9tRGlyKCkgewotCQlpZiAoaW1wb3J0RnJvbURpciAhPSBudWxsKQotCQkJcmV0dXJuIGltcG9ydEZyb21EaXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsICYmIChmaWxlTmFtZS5lbmRzV2l0aCgiLnppcCIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRQYWdlMS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9XaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5YmIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRQYWdlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsZVN5c3RlbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmRSZXNvdXJjZUltcG9ydFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5EaWFsb2dVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLklFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5kaWFsb2dzLlJlc291cmNlVHJlZUFuZExpc3RHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hWaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyOwotCi0KLS8qKgotICogUGFnZSAxIG9mIHRoZSBiYXNlIHJlc291cmNlIGltcG9ydC1mcm9tLWZpbGUtc3lzdGVtIFdpemFyZAotICovCi0vKiBwYWNrYWdlICovCi1jbGFzcyBXaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEgZXh0ZW5kcyBXaXphcmRSZXNvdXJjZUltcG9ydFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQkvLyB3aWRnZXRzCi0JcHJvdGVjdGVkIENvbWJvIHNvdXJjZU5hbWVGaWVsZDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3g7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVDb250YWluZXJTdHJ1Y3R1cmVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVPbmx5U2VsZWN0ZWRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzb3VyY2VCcm93c2VCdXR0b247Ci0JLy9wcm90ZWN0ZWQgQnV0dG9uIHNlbGVjdFR5cGVzQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JLy9BIGJvb2xlYW4gdG8gaW5kaWNhdGUgaWYgdGhlIHVzZXIgaGFzIHR5cGVkIGFueXRoaW5nCi0JcHJpdmF0ZSBib29sZWFuIGVudHJ5Q2hhbmdlZCA9IGZhbHNlOwotCi0JLy8gZGlhbG9nIHN0b3JlIGlkIGNvbnN0YW50cwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9TT1VSQ0VfTkFNRVNfSUQgPSAiV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEuU1RPUkVfU09VUkNFX05BTUVTX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEID0KLQkvLyAiV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEuU1RPUkVfT1ZFUldSSVRFX0VYSVNUSU5HX1JFU09VUkNFU19JRCI7IC8vJE5PTi1OTFMtMSQKLQkvLyROT04tTkxTLTEkCi0JLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfQ1JFQVRFX0NPTlRBSU5FUl9TVFJVQ1RVUkVfSUQgPQotCS8vICJXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9DUkVBVEVfQ09OVEFJTkVSX1NUUlVDVFVSRV9JRCI7IC8vJE5PTi1OTFMtMSQKLQkvLyROT04tTkxTLTEkCi0KLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfVFlQRVNfVElUTEUgPSAiRGF0YVRyYW5zZmVyLnNlbGVjdFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5zZWxlY3RBbGwiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNFTEVDVF9BTExfVElUTEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLmRlc2VsZWN0QWxsIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NPVVJDRV9NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuc2VsZWN0U291cmNlIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRU1QVFlfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJGaWxlSW1wb3J0LnNvdXJjZUVtcHR5Iik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVBhdGggaW1wb3J0ZWRDbGFzc2VzUGF0aDsKLQkvL3Byb3RlY3RlZCBCdXR0b24gaW1wb3J0RnJvbURpcjsKLQkvL3Byb3RlY3RlZCBCdXR0b24gaW1wb3J0RnJvbVppcDsKLQotCi0JcHJpdmF0ZSBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXJDYWNoZTsKLQlaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgY3VycmVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfSU1QT1JUX01BU0sgPSAiKi5qYXI7Ki56aXAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3QgZHJhZ0FuZERyb3BGaWxlTmFtZXMgPSBudWxsOwotCi0JYm9vbGVhbiBjcmVhdGVGdWxsU3RydWN0dXJlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUJhc2VEaXJOYW1lID0gbnVsbDsKLQotCS8vcHJpdmF0ZSBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCB0ZXN0ID0gbnVsbDsKLQotCS8vcHJpdmF0ZSBDb21wb3NpdGUgZHVtbXlQYXJlbnQgPSBudWxsOwotCi0JLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEggPSA0MDA7Ci0JLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfSEVJR0hUID0gMTUwOwotCi0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZURpclN0cnVjID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCSAqLwotCXByb3RlY3RlZCBXaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEoU3RyaW5nIG5hbWUsIElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG5hbWUsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICogCi0JICogQHBhcmFtIGFXb3JrYmVuY2gKLQkgKiAgICAgICAgICAgIElXb3JrYmVuY2gKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBXaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIElQYXRoIGltcG9ydGVkQ2xhc3Nlc1BhdGgsIExpc3QgZmlsZU5hbWVzKSB7Ci0JCXRoaXMoImZpbGVTeXN0ZW1JbXBvcnRQYWdlMSIsIGFXb3JrYmVuY2gsIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5maWxlU3lzdGVtVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuaW1wb3J0RmlsZVN5c3RlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImltcG9ydF9jbGFzc19maWxlX3dpel9iYW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5pbXBvcnRlZENsYXNzZXNQYXRoID0gaW1wb3J0ZWRDbGFzc2VzUGF0aDsKLQkJaWYgKGZpbGVOYW1lcyAhPSBudWxsICYmIGZpbGVOYW1lcy5zaXplKCkgIT0gMCkgewotCQkJZHJhZ0FuZERyb3BGaWxlTmFtZXMgPSBmaWxlTmFtZXM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBibGFua1BhZ2UoKSB7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbkdyb3VwICE9IG51bGwpCi0JCQl0aGlzLnNlbGVjdGlvbkdyb3VwLnNldFJvb3QobnVsbCk7Ci0JCWlmIChzb3VyY2VOYW1lRmllbGQgIT0gbnVsbCkKLQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGVTZWxlY3Rpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy9KdXN0IGNyZWF0ZSB3aXRoIGEgZHVtbXkgcm9vdC4KLQkJdGhpcy5zZWxlY3Rpb25Hcm91cCA9IG5ldyBSZXNvdXJjZVRyZWVBbmRMaXN0R3JvdXAocGFyZW50LCBuZXcgRmlsZVN5c3RlbUVsZW1lbnQoIkR1bW15IiwgbnVsbCwgdHJ1ZSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0Rm9sZGVyUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgZ2V0RmlsZVByb3ZpZGVyKCksCi0JCQkJCS8vbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXJGb3JDbGFzc0ltcG9ydCgpLAotCQkJCQluZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBTV1QuTk9ORSwgRGlhbG9nVXRpbC5pblJlZ3VsYXJGb250TW9kZShwYXJlbnQpKTsKLQotCQlJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLQkJCX0KLQkJfTsKLQotCQlXb3JrYmVuY2hWaWV3ZXJTb3J0ZXIgc29ydGVyID0gbmV3IFdvcmtiZW5jaFZpZXdlclNvcnRlcigpOwotCQl0aGlzLnNlbGVjdGlvbkdyb3VwLnNldFRyZWVTb3J0ZXIoc29ydGVyKTsKLQkJdGhpcy5zZWxlY3Rpb25Hcm91cC5zZXRMaXN0U29ydGVyKHNvcnRlcik7Ci0JCXRoaXMuc2VsZWN0aW9uR3JvdXAuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbiB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgY3JlYXRlcyBhIHN0YW5kYXJkIHB1c2gKLQkgKiBidXR0b24sIHJlZ2lzdGVycyBmb3Igc2VsZWN0aW9uIGV2ZW50cyBpbmNsdWRpbmcgYnV0dG9uIHByZXNzZXMgYW5kIHJlZ2lzdGVycyBkZWZhdWx0IGJ1dHRvbnMKLQkgKiB3aXRoIGl0cyBzaGVsbC4gVGhlIGJ1dHRvbiBpZCBpcyBzdG9yZWQgYXMgdGhlIGJ1dHRvbnMgY2xpZW50IGRhdGEuIE5vdGUgdGhhdCB0aGUgcGFyZW50J3MKLQkgKiBsYXlvdXQgaXMgYXNzdW1lZCB0byBiZSBhIEdyaWRMYXlvdXQgYW5kIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGlzIGxheW91dCBpcyBpbmNyZW1lbnRlZC4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgYnV0dG9uIChzZWUgPGNvZGU+SURpYWxvZ0NvbnN0YW50cy4qX0lEPC9jb2RlPiBjb25zdGFudHMgZm9yCi0JICogICAgICAgICAgICBzdGFuZGFyZCBkaWFsb2cgYnV0dG9uIGlkcykKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBsYWJlbCBmcm9tIHRoZSBidXR0b24KLQkgKiBAcGFyYW0gZGVmYXVsdEJ1dHRvbgotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGJ1dHRvbiBpcyB0byBiZSB0aGUgZGVmYXVsdCBidXR0b24sIGFuZAotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBpZCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJLy8gaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYnV0dG9uIGJhcgotCQkoKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucysrOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCi0JCUdyaWREYXRhIGJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRGF0YSk7Ci0KLQkJYnV0dG9uLnNldERhdGEobmV3IEludGVnZXIoaWQpKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0JCWlmIChkZWZhdWx0QnV0dG9uKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0JCQl9Ci0JCQlidXR0b24uc2V0Rm9jdXMoKTsKLQkJfQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGJ1dHRvbnMgZm9yIHNlbGVjdGluZyBzcGVjaWZpYyB0eXBlcyBvciBzZWxlY3RpbmcgYWxsIG9yIG5vbmUgb2YgdGhlIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNyZWF0ZUJ1dHRvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIHRvcCBsZXZlbCBncm91cAotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyB0eXBlcyBlZGl0IGJ1dHRvbgotCQkvLwkJc2VsZWN0VHlwZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBJRGlhbG9nQ29uc3RhbnRzLlNFTEVDVF9UWVBFU19JRCwKLQkJLy8gU0VMRUNUX1RZUEVTX1RJVExFLCBmYWxzZSk7Ci0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCS8vCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8JCQkJaGFuZGxlVHlwZXNFZGl0QnV0dG9uUHJlc3NlZCgpOwotCQkJLy8JCQl9Ci0JCX07Ci0JCS8vCQlzZWxlY3RUeXBlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgSURpYWxvZ0NvbnN0YW50cy5TRUxFQ1RfQUxMX0lELCBTRUxFQ1RfQUxMX1RJVExFLCBmYWxzZSk7Ci0KLQkJbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRBbGxTZWxlY3Rpb25zKHRydWUpOwotCQkJfQotCQl9OwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgSURpYWxvZ0NvbnN0YW50cy5ERVNFTEVDVF9BTExfSUQsIERFU0VMRUNUX0FMTF9USVRMRSwgZmFsc2UpOwotCi0JCWxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0QWxsU2VsZWN0aW9ucyhmYWxzZSk7Ci0JCQl9Ci0JCX07Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvL3N1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9DTEFTU19XSVpBUkRfUDIpOwotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJY29tcG9zaXRlLnNldFNpemUoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQkvL2R1bW15UGFyZW50ID0gY29tcG9zaXRlOwotCi0JCWNyZWF0ZVNvdXJjZUdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJLy9jcmVhdGVTcGFjZXIoY29tcG9zaXRlKTsKLQotCQkvL2NyZWF0ZVBsYWluTGFiZWwoY29tcG9zaXRlLAotCQkvLyBXb3JrYmVuY2hNZXNzYWdlcy5nZXRTdHJpbmcoIldpemFyZEltcG9ydFBhZ2UuZGVzdGluYXRpb25MYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkvL2NyZWF0ZURlc3RpbmF0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQotCQljcmVhdGVPcHRpb25zR3JvdXAoY29tcG9zaXRlKTsKLQotCQlyZXN0b3JlV2lkZ2V0VmFsdWVzKCk7Ci0JCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JCXNldFBhZ2VDb21wbGV0ZShkZXRlcm1pbmVQYWdlQ29tcGxldGlvbigpKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJdmFsaWRhdGVTb3VyY2VHcm91cCgpOwotCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksCi0JCS8vIElEYXRhVHJhbnNmZXJIZWxwQ29udGV4dElkcy5GSUxFX1NZU1RFTV9JTVBPUlRfV0laQVJEX1BBR0UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9wdGlvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBvcHRpb25zR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZU9wdGlvbnNHcm91cEJ1dHRvbnMob3B0aW9uc0dyb3VwKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW1wb3J0IG9wdGlvbnMgc3BlY2lmaWNhdGlvbiB3aWRnZXRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9wdGlvbnNHcm91cEJ1dHRvbnMoQ29tcG9zaXRlIG9wdGlvbnNHcm91cCkgewotCi0JCS8vIG92ZXJ3cml0ZS4uLiBjaGVja2JveAotCQlvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZUltcG9ydC5vdmVyd3JpdGVFeGlzdGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2V0SW1wb3J0RnJvbURpcigpIHsKLQkJQ2xhc3Nlc0ltcG9ydFdpemFyZCBjaXcgPSAoQ2xhc3Nlc0ltcG9ydFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXJldHVybiBjaXcubWFpblBhZ2UuaXNTZXRJbXBvcnRGcm9tRGlyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc0ZpbGVEaXJlY3RvcnkoU3RyaW5nIHMpIHsKLQkJaW50IGluZGV4ID0gcy5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlyZXR1cm4gcy5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGdyb3VwIGZvciBjcmVhdGluZyB0aGUgcm9vdCBkaXJlY3RvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSb290RGlyZWN0b3J5R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgc291cmNlQ29udGFpbmVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc291cmNlQ29udGFpbmVyR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNvdXJjZUNvbnRhaW5lckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0JCW5ldyBMYWJlbChzb3VyY2VDb250YWluZXJHcm91cCwgU1dULk5PTkUpLnNldFRleHQoZ2V0U291cmNlTGFiZWwoKSk7Ci0KLQkJLy8gc291cmNlIG5hbWUgZW50cnkgZmllbGQKLQkJc291cmNlTmFtZUZpZWxkID0gbmV3IENvbWJvKHNvdXJjZUNvbnRhaW5lckdyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlzb3VyY2VOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlzZXRTb3VyY2VOYW1lRmllbGRGb3JEcmFnQW5kRHJvcCgpOwotCi0JCXNvdXJjZU5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQlzb3VyY2VOYW1lRmllbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXBkYXRlRnJvbVNvdXJjZUZpZWxkKCk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJc291cmNlTmFtZUZpZWxkLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIEtleUxpc3RlbmVyLmtleVByZXNzZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJLy9JZiB0aGVyZSBoYXMgYmVlbiBhIGtleSBwcmVzc2VkIHRoZW4gbWFyayBhcyBkaXJ0eQotCQkJCWVudHJ5Q2hhbmdlZCA9IHRydWU7Ci0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIEBzZWUgS2V5TGlzdGVuZXIua2V5UmVsZWFzZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlzb3VyY2VOYW1lRmllbGQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIEZvY3VzTGlzdGVuZXIuZm9jdXNHYWluZWQoRm9jdXNFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy9EbyBub3RoaW5nIHdoZW4gZ2V0dGluZyBmb2N1cwotCQkJCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIEBzZWUgRm9jdXNMaXN0ZW5lci5mb2N1c0xvc3QoRm9jdXNFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCS8vQ2xlYXIgdGhlIGZsYWcgdG8gcHJldmVudCBjb25zdGFudCB1cGRhdGUKLQkJCQlpZiAoZW50cnlDaGFuZ2VkKSB7Ci0KLQkJCQkJZW50cnlDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCXVwZGF0ZUZyb21Tb3VyY2VGaWVsZCgpOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQotCQkvLyBzb3VyY2UgYnJvd3NlIGJ1dHRvbgotCQlzb3VyY2VCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHNvdXJjZUNvbnRhaW5lckdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNvdXJjZUJyb3dzZUJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEYXRhVHJhbnNmZXIuYnJvd3NlIikpOyAvLyROT04tTkxTLTEkCi0JCXNvdXJjZUJyb3dzZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJc291cmNlQnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQlzb3VyY2VCcm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VOYW1lRmllbGRGb3JEcmFnQW5kRHJvcCgpIHsKLQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzICE9IG51bGwpIHsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIChkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoMCkpOwotCQkJc291cmNlTmFtZUZpZWxkLnNldFRleHQoZmlsZU5hbWUpOwotCQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJaWYgKGYuaXNGaWxlKCkpIHsKLQkJCQlpZiAoSW1wb3J0VXRpbC5nZXRFeHRlbnNpb24oZikuZXF1YWxzKCJ6aXAiKSB8fCBJbXBvcnRVdGlsLmdldEV4dGVuc2lvbihmKS5lcXVhbHMoImphciIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkvL2ltcG9ydEZyb21aaXAuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQkvL2ltcG9ydEZyb21EaXIuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQl9IGVsc2UgaWYgKEltcG9ydFV0aWwuZ2V0RXh0ZW5zaW9uKGYpLmVxdWFscygiY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KGdldENsYXNzRmlsZURpcmVjdG9yeShmaWxlTmFtZSkpOwotCi0JCQkJCS8vZ2V0IGNvbS5pYm0uYWJjLkNsYXNzTmFtZQotCQkJCQlQYWNrYWdlTmFtZVJlc29sdmVyIG5hbWVSZXNvbHZlciA9IG5ldyBQYWNrYWdlTmFtZVJlc29sdmVyKCk7Ci0JCQkJCVN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSBuYW1lUmVzb2x2ZXIuZ2V0Q2xhc3NOYW1lKGZpbGVOYW1lKTsKLQkJCQkJaWYgKHF1YWxpZmllZENsYXNzTmFtZSAhPSBudWxsKSB7Ci0KLQkJCQkJCS8vZ2V0IGNvbQotCQkJCQkJaW50IGluZGV4ID0gcXVhbGlmaWVkQ2xhc3NOYW1lLmluZGV4T2YoJy4nKTsKLQkJCQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCQkJCVN0cmluZyB0ZXh0VG9TZXQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgMSArIGZpbGVOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQkJCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KHRleHRUb1NldCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIGJhc2VEaXIgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCQkJLy9nZXQgY29tLmlibS5hYmMKLQkJCQkJCWluZGV4ID0gcXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCS8vZ2V0IGNvbS9pYm0vYWJjCi0JCQkJCQlwYWNrYWdlRGlyU3RydWMgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQkJCQkJLy9nZXQgQzpcY29tCi0JCQkJCQlpbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoYmFzZURpcik7Ci0JCQkJCQkvL2lmIHBhY2thZ2VEaXJTdHVjIGV4aXN0cyB0aGVuIHNldCB0aGUgc291cmNlRGlyIHRvIGNvbSwgZWxzZQotCQkJCQkJLy9zZXQgdGhlIGRpcmVjdG9yeSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgY2xhc3MKLQkJCQkJCWlmIChmaWxlTmFtZS5pbmRleE9mKHBhY2thZ2VEaXJTdHJ1YykgIT0gLTEpIHsKLQkJCQkJCQlpbnQgYmFzZURpckxlbmd0aCA9IGJhc2VEaXIubGVuZ3RoKCk7Ci0JCQkJCQkJU3RyaW5nIHRleHRUb1NldCA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCArIGJhc2VEaXJMZW5ndGgpOwotCQkJCQkJCWluZGV4ID0gcGFja2FnZU5hbWUuaW5kZXhPZignLicpOwotCQkJCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJCQkJcGFja2FnZUJhc2VEaXJOYW1lID0gcGFja2FnZU5hbWU7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwYWNrYWdlQmFzZURpck5hbWUgPSBwYWNrYWdlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0JCQkJCQkJZiA9IG5ldyBGaWxlKHRleHRUb1NldCk7Ci0JCQkJCQkJaWYgKGYuZ2V0UGFyZW50KCkgIT0gbnVsbCkKLQkJCQkJCQkJZiA9IG5ldyBGaWxlKGYuZ2V0UGFyZW50KCkpOwotCQkJCQkJCXRleHRUb1NldCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vd2FudCB0byBzZXQgdGhlIHJvb3QgZGlyZWN0b3J5IHRvCi0JCQkJCQkJLy8gY29tJ3MgcGFyZW50Ci0JCQkJCQkJc291cmNlTmFtZUZpZWxkLnNldFRleHQodGV4dFRvU2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSByZWNlaXZlciBmcm9tIHRoZSBzb3VyY2UgbmFtZSBmaWVsZC4KLQkgKi8KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVGcm9tU291cmNlRmllbGQoKSB7Ci0KLQkJc2V0U291cmNlTmFtZShzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJLy9VcGRhdGUgZW5hYmxlbWVudHMgd2hlbiB0aGlzIGlzIHNlbGVjdGVkCi0JCXVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIG9iamVjdAotCSAqIG1lcml0cyBvbmUuIFRoZSBjcml0ZXJpYSBmb3IgdGhpcyBhcmU6IEFsc28gY3JlYXRlIHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgY3JlYXRlUm9vdEVsZW1lbnQoT2JqZWN0IGZpbGVTeXN0ZW1PYmplY3QsIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCQlib29sZWFuIGlzQ29udGFpbmVyID0gcHJvdmlkZXIuaXNGb2xkZXIoZmlsZVN5c3RlbU9iamVjdCk7Ci0JCVN0cmluZyBlbGVtZW50TGFiZWwgPSBwcm92aWRlci5nZXRMYWJlbChmaWxlU3lzdGVtT2JqZWN0KTsKLQotCQkvLyBVc2UgYW4gZW1wdHkgbGFiZWwgc28gdGhhdCBkaXNwbGF5IG9mIHRoZSBlbGVtZW50J3MgZnVsbCBuYW1lCi0JCS8vIGRvZXNuJ3QgaW5jbHVkZSBhIGNvbmZ1c2luZyBsYWJlbAotCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBkdW1teVBhcmVudCA9IG5ldyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCgiIiwgbnVsbCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZHVtbXlQYXJlbnQuc2V0UG9wdWxhdGVkKCk7Ci0JCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHJlc3VsdCA9IG5ldyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudChlbGVtZW50TGFiZWwsIGR1bW15UGFyZW50LCBpc0NvbnRhaW5lcik7Ci0KLQkJcmVzdWx0LnNldFBhY2thZ2VCYXNlRGlyTmFtZShwYWNrYWdlQmFzZURpck5hbWUpOwotCQlyZXN1bHQuc2V0RmlsZVN5c3RlbU9iamVjdChmaWxlU3lzdGVtT2JqZWN0KTsKLQotCQkvL0dldCB0aGUgZmlsZXMgZm9yIHRoZSBlbGVtZW50IHNvIGFzIHRvIGJ1aWxkIHRoZSBmaXJzdCBsZXZlbAotCQlyZXN1bHQuZ2V0RmlsZXMocHJvdmlkZXIpOwotCi0JCXJldHVybiBkdW1teVBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGltcG9ydCBzb3VyY2Ugc3BlY2lmaWNhdGlvbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvL2NyZWF0ZUltcG9ydFR5cGVHcm91cChwYXJlbnQpOwotCQljcmVhdGVSb290RGlyZWN0b3J5R3JvdXAocGFyZW50KTsKLQkJY3JlYXRlRmlsZVNlbGVjdGlvbkdyb3VwKHBhcmVudCk7Ci0KLQkJY3JlYXRlQnV0dG9uc0dyb3VwKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIGJ1dHRvbiBncm91cC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVCdXR0b25Hcm91cChib29sZWFuIGVuYWJsZSkgewotCQkvLwkJc2VsZWN0VHlwZXNCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzb3VyY2UgY3VycmVudGx5IGV4aXN0cyBhbmQgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnN1cmVTb3VyY2VJc1ZhbGlkKCkgewotCQlpZiAoaXNTZXRJbXBvcnRGcm9tRGlyKCkpIHsKLQkJCWlmIChnZXRTb3VyY2VEaXJlY3RvcnkoKSAhPSBudWxsICYmIG5ldyBGaWxlKGdldFNvdXJjZURpcmVjdG9yeU5hbWUoKSkuaXNEaXJlY3RvcnkoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWRpc3BsYXlFcnJvckRpYWxvZyhnZXRTdHJpbmcoIkZpbGVJbXBvcnQuaW52YWxpZFNvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJWmlwRmlsZSBzcGVjaWZpZWRGaWxlID0gZ2V0U3BlY2lmaWVkU291cmNlRmlsZSgpOwotCi0JCWlmIChzcGVjaWZpZWRGaWxlID09IG51bGwpIHsKLQkJCWRpc3BsYXlFcnJvckRpYWxvZyhnZXRTdHJpbmcoIkZpbGVJbXBvcnQuaW52YWxpZFNvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNsb3NlWmlwRmlsZShzcGVjaWZpZWRGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBwYXNzZWQgaW1wb3J0IG9wZXJhdGlvbi4gQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihJbXBvcnRPcGVyYXRpb24gb3ApIHsKLQkJaW5pdGlhbGl6ZU9wZXJhdGlvbihvcCk7Ci0JCWlmIChjcmVhdGVGdWxsU3RydWN0dXJlKSB7Ci0JCQlvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoZmFsc2UpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNwbGF5RXJyb3JEaWFsb2coZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG9wLmdldFN0YXR1cygpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLCBnZXRTdHJpbmcoIkZpbGVJbXBvcnQuaW1wb3J0UHJvYmxlbXMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbnVsbCwgLy8gbm8gc3BlY2lhbCBtZXNzYWdlCi0JCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gbmVlZCB0aGUgZm9sbG93aW5nIHByaXZhdGUgc3R1ZmYganVzdCBiZWNhdXNlIHRoZSBEYXRhVHJhbnNmZXJNZXNzYWdlcyBjbGFzcyBpcyBub3QgcHVibGljIQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5tZXNzYWdlcyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBGaW5pc2ggYnV0dG9uIHdhcyBwcmVzc2VkLiBUcnkgdG8gZG8gdGhlIHJlcXVpcmVkIHdvcmsgbm93IGFuZCBhbnN3ZXIgYSBib29sZWFuCi0JICogaW5kaWNhdGluZyBzdWNjZXNzLiBJZiBmYWxzZSBpcyByZXR1cm5lZCB0aGVuIHRoZSB3aXphcmQgd2lsbCBub3QgY2xvc2UuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotCQlpZiAoIWVuc3VyZVNvdXJjZUlzVmFsaWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQljbGVhclByb3ZpZGVyQ2FjaGUoKTsKLQotCQlzYXZlV2lkZ2V0VmFsdWVzKCk7Ci0KLQkJSXRlcmF0b3IgcmVzb3VyY2VzRW51bSA9IGdldFNlbGVjdGVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJTGlzdCBmaWxlU3lzdGVtT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHJlc291cmNlc0VudW0uaGFzTmV4dCgpKSB7Ci0JCQlmaWxlU3lzdGVtT2JqZWN0cy5hZGQoKChGaWxlU3lzdGVtRWxlbWVudCkgcmVzb3VyY2VzRW51bS5uZXh0KCkpLmdldEZpbGVTeXN0ZW1PYmplY3QoKSk7Ci0JCX0KLQotCQlpZiAoZmlsZVN5c3RlbU9iamVjdHMuc2l6ZSgpID4gMCkgewotCQkJaWYgKGdldFNvdXJjZURpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gaW1wb3J0UmVzb3VyY2VzKGZpbGVTeXN0ZW1PYmplY3RzKTsKLQkJCX0KLQkJCXJldHVybiBpbXBvcnRSZXNvdXJjZXNGcm9tWmlwKGZpbGVTeXN0ZW1PYmplY3RzKTsKLQkJfQotCi0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksIGdldFN0cmluZygiRGF0YVRyYW5zZmVyLmluZm9ybWF0aW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJGaWxlSW1wb3J0Lm5vbmVTZWxlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29udGVudCBwcm92aWRlciBmb3IgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IHMgdGhhdCByZXR1cm5zIG9ubHkgZmlsZXMgYXMKLQkgKiBjaGlsZHJlbi4KLQkgKi8KLQotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRGaWxlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgewotCQkJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBlbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBvOwotCQkJCQlpZiAoY3VycmVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50LmdldEZpbGVzKGN1cnJlbnRQcm92aWRlcikuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0RmlsZXMoRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFKS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdFtdIHN1cGVyT2JqZWN0cyA9IHN1cGVyLmdldEVsZW1lbnRzKGVsZW1lbnQpOwotCQkJCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcyAhPSBudWxsICYmIGdldFNvdXJjZURpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgYW5FbGVtZW50ID0gbnVsbDsKLQkJCQkJaW50IG5ld09iamVjdHNJbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlhbkVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHN1cGVyT2JqZWN0c1tpXTsKLQotCQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGFuRWxlbWVudC5nZXRGaWxlU3lzdGVtT2JqZWN0KCk7Ci0KLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZHJhZ0FuZERyb3BGaWxlTmFtZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlpZiAoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5lcXVhbHMoZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KGspKSkgewotCQkJCQkJCQluZXdPYmplY3RzSW5kZXgrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG5ld09iamVjdHNJbmRleCA+IDApIHsKLQkJCQkJCU9iamVjdFtdIG5ld09iamVjdHMgPSBuZXcgT2JqZWN0W25ld09iamVjdHNJbmRleF07Ci0JCQkJCQluZXdPYmplY3RzSW5kZXggPSAwOwotCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWFuRWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgc3VwZXJPYmplY3RzW2ldOwotCi0JCQkJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGFuRWxlbWVudC5nZXRGaWxlU3lzdGVtT2JqZWN0KCk7Ci0KLQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGRyYWdBbmREcm9wRmlsZU5hbWVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCWlmIChmaWxlLmdldEFic29sdXRlUGF0aCgpLmVxdWFscyhkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoaykpKSB7Ci0KLQkJCQkJCQkJCW5ld09iamVjdHNbbmV3T2JqZWN0c0luZGV4KytdID0gYW5FbGVtZW50OwotCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuZXdPYmplY3RzOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlck9iamVjdHM7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByb290IEZpbGVTeXN0ZW1FbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnRseS1zcGVjaWZpZWQKLQkgKiBzb3VyY2UuIElmIHRoaXMgRmlsZVN5c3RlbUVsZW1lbnQgaXMgbm90IGN1cnJlbnRseSBkZWZpbmVkIHRoZW4gY3JlYXRlIGFuZCByZXR1cm4gaXQuCi0JICovCi0JcHJvdGVjdGVkIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGdldEZpbGVTeXN0ZW1UcmVlKCkgewotCQlpZiAoaXNTZXRJbXBvcnRGcm9tRGlyKCkpIHsKLQkJCUZpbGUgc291cmNlRGlyZWN0b3J5ID0gZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0JCQlpZiAoc291cmNlRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc2VsZWN0RmlsZXMoc291cmNlRGlyZWN0b3J5LCBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0UpOwotCQkJfQotCQkJaWYgKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGlzcGxheUVycm9yRGlhbG9nKGdldFN0cmluZygiRmlsZUltcG9ydC5pbnZhbGlkU291cmNlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlaaXBGaWxlIHNvdXJjZUZpbGUgPSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKCk7Ci0JCWlmIChzb3VyY2VGaWxlID09IG51bGwpIHsKLQkJCS8vQ2xlYXIgb3V0IHRoZSBwcm92aWRlciBhcyB3ZWxsCi0JCQl0aGlzLmN1cnJlbnRQcm92aWRlciA9IG51bGw7Ci0JCQlpZiAoc291cmNlTmFtZUZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkaXNwbGF5RXJyb3JEaWFsb2coZ2V0U3RyaW5nKCJGaWxlSW1wb3J0LmludmFsaWRTb3VyY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzb3VyY2VOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0U3RydWN0dXJlUHJvdmlkZXIoc291cmNlRmlsZSk7Ci0JCXRoaXMuY3VycmVudFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JCXJldHVybiBzZWxlY3RGaWxlcyhwcm92aWRlci5nZXRSb290KCksIHByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29udGVudCBwcm92aWRlciBmb3IgPGNvZGU+RmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IHMgdGhhdCByZXR1cm5zIG9ubHkgZm9sZGVycwotCSAqIGFzIGNoaWxkcmVuLgotCSAqLwotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRGb2xkZXJQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB7Ci0JCQkJCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIG87Ci0JCQkJCWlmIChjdXJyZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0Rm9sZGVycyhjdXJyZW50UHJvdmlkZXIpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBlbGVtZW50LmdldEZvbGRlcnMoRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFKS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgewotCQkJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBlbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBvOwotCQkJCQlpZiAoZWxlbWVudC5pc1BvcHVsYXRlZCgpKQotCQkJCQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JCQkJCS8vSWYgd2UgaGF2ZSBub3QgcG9wdWxhdGVkIHRoZW4gd2FpdCB1bnRpbCBhc2tlZAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudGx5LW5hbWVkIHNvdXJjZSBkaXJlY3RvcnkgaWZmIGl0IGV4aXN0cyBhcyBhCi0JICogdmFsaWQgZGlyZWN0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIEZpbGUgZ2V0U291cmNlRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0U291cmNlRGlyZWN0b3J5KHRoaXMuc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudGx5LW5hbWVkIHNvdXJjZSBkaXJlY3RvcnkgaWZmIGl0IGV4aXN0cyBhcyBhCi0JICogdmFsaWQgZGlyZWN0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgU3RyaW5nIG5vdCB5ZXQgZm9ybWF0dGVkIGZvciBqYXZhLmlvLkZpbGUgY29tcGF0YWJpbGl0eQotCSAqLwotCXByaXZhdGUgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKGlzU2V0SW1wb3J0RnJvbURpcigpKSB7Ci0JCQlGaWxlIHNvdXJjZURpcmVjdG9yeSA9IG5ldyBGaWxlKGdldFNvdXJjZURpcmVjdG9yeU5hbWUocGF0aCkpOwotCQkJaWYgKCFzb3VyY2VEaXJlY3RvcnkuZXhpc3RzKCkgfHwgIXNvdXJjZURpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBzb3VyY2VEaXJlY3Rvcnk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBkaXJlY3RvcnkgbmFtZSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIGltcG9ydCBzb3VyY2UuIE5vdGUgdGhhdCBpZiBpdCBlbmRzIHdpdGggYQotCSAqIHNlcGFyYXRvciB0aGVuIHRoZSBzZXBhcmF0b3IgaXMgZmlyc3QgcmVtb3ZlZCBzbyB0aGF0IGphdmEgdHJlYXRzIGl0IGFzIGEgcHJvcGVyIGRpcmVjdG9yeQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNvdXJjZURpcmVjdG9yeU5hbWUoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKHRoaXMuc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBkaXJlY3RvcnkgbmFtZSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIGltcG9ydCBzb3VyY2UuIE5vdGUgdGhhdCBpZiBpdCBlbmRzIHdpdGggYQotCSAqIHNlcGFyYXRvciB0aGVuIHRoZSBzZXBhcmF0b3IgaXMgZmlyc3QgcmVtb3ZlZCBzbyB0aGF0IGphdmEgdHJlYXRzIGl0IGFzIGEgcHJvcGVyIGRpcmVjdG9yeQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNvdXJjZURpcmVjdG9yeU5hbWUoU3RyaW5nIHNvdXJjZU5hbWUpIHsKLQkJSVBhdGggcmVzdWx0ID0gbmV3IFBhdGgoc291cmNlTmFtZS50cmltKCkpOwotCi0JCWlmIChyZXN1bHQuZ2V0RGV2aWNlKCkgIT0gbnVsbCAmJiByZXN1bHQuc2VnbWVudENvdW50KCkgPT0gMCkgLy8gc29tZXRoaW5nIGxpa2UgImM6IgotCQkJcmVzdWx0ID0gcmVzdWx0LmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHJlc3VsdC5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCi0JCXJldHVybiByZXN1bHQudG9PU1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgc3RyaW5nIHRvIGRpc3BsYXkgYXMgdGhlIGxhYmVsIGZvciB0aGUgc291cmNlIHNwZWNpZmljYXRpb24gZmllbGQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUxhYmVsKCkgewotCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5kaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhbGwgZXZlbnRzIGFuZCBlbmFibGVtZW50cyBmb3Igd2lkZ2V0cyBpbiB0aGlzIGRpYWxvZwotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHNvdXJjZUJyb3dzZUJ1dHRvbikgewotCQkJaWYgKGlzU2V0SW1wb3J0RnJvbURpcigpKSB7Ci0JCQkJaGFuZGxlU291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZCgpOwotCQkJfSBlbHNlIHsKLQkJCQloYW5kbGVTb3VyY2VCcm93c2VCdXR0b25QcmVzc2VkRm9yWmlwKCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5oYW5kbGVFdmVudChldmVudCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGFwcHJvcHJpYXRlIHNvdXJjZSBicm93c2VyIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBzb3VyY2UgdG8gaW1wb3J0IGZyb20KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTb3VyY2VCcm93c2VCdXR0b25QcmVzc2VkKCkgewotCQlTdHJpbmcgY3VycmVudFNvdXJjZSA9IHRoaXMuc291cmNlTmFtZUZpZWxkLmdldFRleHQoKTsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc291cmNlTmFtZUZpZWxkLmdldFNoZWxsKCksIFNXVC5TQVZFKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoU0VMRUNUX1NPVVJDRV9NRVNTQUdFKTsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZ2V0U291cmNlRGlyZWN0b3J5TmFtZShjdXJyZW50U291cmNlKSk7Ci0KLQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCS8vSnVzdCBxdWl0IGlmIHRoZSBkaXJlY3RvcnkgaXMgbm90IHZhbGlkCi0JCQlpZiAoKGdldFNvdXJjZURpcmVjdG9yeShzZWxlY3RlZERpcmVjdG9yeSkgPT0gbnVsbCkgfHwgc2VsZWN0ZWREaXJlY3RvcnkuZXF1YWxzKGN1cnJlbnRTb3VyY2UpKQotCQkJCXJldHVybjsKLQkJCS8vSWYgaXQgaXMgdmFsaWQgdGhlbiBwcm9jZWVkIHRvIHBvcHVsYXRlCi0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRTb3VyY2VOYW1lKHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCXNlbGVjdGlvbkdyb3VwLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgcmVnaXN0ZXJlZCB0eXBlIHNlbGVjdGlvbiBkaWFsb2cgYW5kIG5vdGUgdGhlIHNlbGVjdGlvbnMgaW4gdGhlIHJlY2VpdmVycwotCSAqIHR5cGVzLXRvLWV4cG9ydCBmaWVsZC4sIEFkZGVkIGhlcmUgc28gdGhhdCBpbm5lciBjbGFzc2VzIGNhbiBoYXZlIGFjY2VzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKSB7Ci0KLQkJc3VwZXIuaGFuZGxlVHlwZXNFZGl0QnV0dG9uUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIEltcG9ydCB0aGUgcmVzb3VyY2VzIHdpdGggZXh0ZW5zaW9ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRSZXNvdXJjZXMoTGlzdCBmaWxlU3lzdGVtT2JqZWN0cykgewotCQlJdGVyYXRvciBpID0gZmlsZVN5c3RlbU9iamVjdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlIGYgPSAoRmlsZSkgaS5uZXh0KCk7Ci0JCQlMaXN0IHNpbmdsZUl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc2luZ2xlSXRlbUxpc3QuYWRkKGYpOwotCQkJU3RyaW5nIHRleHRUb1NldCA9IGdldFBhY2thZ2VOYW1lKGYpOwotCQkJaWYgKHRleHRUb1NldCAhPSBudWxsKSB7Ci0JCQkJRmlsZSBuZXdTb3VyY2UgPSBuZXcgRmlsZSh0ZXh0VG9TZXQpOwotCQkJCWV4ZWN1dGVJbXBvcnRPcGVyYXRpb24obmV3IEltcG9ydE9wZXJhdGlvbihnZXRDb250YWluZXJGdWxsUGF0aCgpLCBuZXdTb3VyY2UsIEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSwgdGhpcywgc2luZ2xlSXRlbUxpc3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhlY3V0ZUltcG9ydE9wZXJhdGlvbihuZXcgSW1wb3J0T3BlcmF0aW9uKGdldENvbnRhaW5lckZ1bGxQYXRoKCksIGdldFNvdXJjZURpcmVjdG9yeSgpLCBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0UsIHRoaXMsIHNpbmdsZUl0ZW1MaXN0KSk7Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoRmlsZSBmKSB7Ci0JCWlmIChJbXBvcnRVdGlsLmdldEV4dGVuc2lvbihmKS5lcXVhbHMoImNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGZpbGVOYW1lID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCS8vZ2V0IGNvbS5pYm0uYWJjLkNsYXNzTmFtZQotCQkJUGFja2FnZU5hbWVSZXNvbHZlciBuYW1lUmVzb2x2ZXIgPSBuZXcgUGFja2FnZU5hbWVSZXNvbHZlcigpOwotCQkJU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9IG5hbWVSZXNvbHZlci5nZXRDbGFzc05hbWUoZmlsZU5hbWUpOwotCQkJaWYgKHF1YWxpZmllZENsYXNzTmFtZSAhPSBudWxsKSB7Ci0KLQkJCQkvL2dldCBjb20KLQkJCQlpbnQgaW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUuaW5kZXhPZignLicpOwotCQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIDEgKyBmaWxlTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGJhc2VEaXIgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCS8vZ2V0IGNvbS5pYm0uYWJjCi0JCQkJaW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCS8vZ2V0IGNvbS9pYm0vYWJjCi0JCQkJcGFja2FnZURpclN0cnVjID0gcGFja2FnZU5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCQkvL2dldCBDOlxjb20KLQkJCQlpbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoYmFzZURpcik7Ci0JCQkJLy9pZiBwYWNrYWdlRGlyU3R1YyBleGlzdHMgdGhlbiBzZXQgdGhlIHNvdXJjZURpciB0byBjb20sIGVsc2UKLQkJCQkvL3NldCB0aGUgZGlyZWN0b3J5IHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBjbGFzcwotCQkJCWlmIChmaWxlTmFtZS5pbmRleE9mKHBhY2thZ2VEaXJTdHJ1YykgIT0gLTEpIHsKLQkJCQkJaW50IGJhc2VEaXJMZW5ndGggPSBiYXNlRGlyLmxlbmd0aCgpOwotCQkJCQlTdHJpbmcgdGV4dFRvU2V0ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4ICsgYmFzZURpckxlbmd0aCk7Ci0JCQkJCWluZGV4ID0gcGFja2FnZU5hbWUuaW5kZXhPZignLicpOwotCQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCQlwYWNrYWdlQmFzZURpck5hbWUgPSBwYWNrYWdlTmFtZTsKLQkJCQkJZWxzZQotCQkJCQkJcGFja2FnZUJhc2VEaXJOYW1lID0gcGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCQlmID0gbmV3IEZpbGUodGV4dFRvU2V0KTsKLQkJCQkJaWYgKGYuZ2V0UGFyZW50KCkgIT0gbnVsbCkKLQkJCQkJCWYgPSBuZXcgRmlsZShmLmdldFBhcmVudCgpKTsKLQkJCQkJdGV4dFRvU2V0ID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsgLy93YW50IHRvIHNldCB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gY29tJ3MKLQkJCQkJLy8gcGFyZW50Ci0JCQkJCS8vc291cmNlTmFtZUZpZWxkLnNldFRleHQodGV4dFRvU2V0KTsKLQkJCQkJcmV0dXJuIHRleHRUb1NldDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3BlcmF0aW9uKEltcG9ydE9wZXJhdGlvbiBvcCkgewotCi0JCS8qCi0JCSAqIG9wLnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZSggY3JlYXRlQ29udGFpbmVyU3RydWN0dXJlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJICovCi0JCW9wLnNldE92ZXJ3cml0ZVJlc291cmNlcyhvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBwcm92aWRlZCBpcyBhbiBleHRlbnNpb24gdGhhdCBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGV4cG9ydCBieQotCSAqIHRoZSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBuYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVzb3VyY2UgbmFtZSBpcyBzdWl0YWJsZSBmb3IgZXhwb3J0IGJhc2VkIHVwb24gaXRzCi0JICogICAgICAgICBleHRlbnNpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cG9ydGFibGVFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotCQlpZiAoc2VsZWN0ZWRUeXBlcyA9PSBudWxsKSAvLyBpZS4tIGFsbCBleHRlbnNpb25zIGFyZSBhY2NlcHRhYmxlCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlJdGVyYXRvciBhZW51bSA9IHNlbGVjdGVkVHlwZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFlbnVtLmhhc05leHQoKSkgewotCQkJaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGFlbnVtLm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVwb3B1bGF0ZSB0aGUgdmlldyBiYXNlZCBvbiB0aGUgY3VycmVudGx5IGVudGVyZWQgZGlyZWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0U2VsZWN0aW9uKCkgewotCi0JCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGN1cnJlbnRSb290ID0gZ2V0RmlsZVN5c3RlbVRyZWUoKTsKLQkJdGhpcy5zZWxlY3Rpb25Hcm91cC5zZXRSb290KGN1cnJlbnRSb290KTsKLQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzICE9IG51bGwpIHsKLQotCQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKS50b1N0cmluZygpLmVuZHNXaXRoKCIuemlwIikgPT0gZmFsc2UgJiYgZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXIiKSA9PSBmYWxzZSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0aGlzLnNlbGVjdGlvbkdyb3VwLmV4cGFuZEFsbCgpOwotCQkJfQotCi0JCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCB0ZW1wID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBjdXJyZW50Um9vdC5nZXRGb2xkZXJzKCkuZ2V0Q2hpbGRyZW4oKVswXTsKLQotCQkJTGlzdCBkaXJMaXN0ID0gcGF0aFRvQXJyYXkoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBkaXJMaXN0LmdldChpKTsKLQkJCQlPYmplY3RbXSBmb2xkZXJzID0gdGVtcC5nZXRGb2xkZXJzKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGZvbGRlcnMubGVuZ3RoOyBrKyspIHsKLQkJCQkJaWYgKCgoRmlsZSkgKChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgZm9sZGVyc1trXSkuZ2V0RmlsZVN5c3RlbU9iamVjdCgpKS5nZXROYW1lKCkuZXF1YWxzKHMpKSB7Ci0JCQkJCQl0ZW1wID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSB0ZW1wLmdldEZvbGRlcnMoKS5nZXRDaGlsZHJlbigpW2tdOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQkJaWYgKGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKS50b1N0cmluZygpLmVuZHNXaXRoKCIuemlwIikgPT0gZmFsc2UgJiYgZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXIiKSA9PSBmYWxzZSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0aGlzLnNlbGVjdGlvbkdyb3VwLmluaXRpYWxDaGVja1RyZWVJdGVtKHRlbXApOwotCQkJfQotCi0JCQkvL0lmIGNhbiBmaWd1cmUgb3V0IGhvdyB0byBwcmUtaGlnaGxpZ2h0IGRpciwgdGhlbiB1c2UgZm9sbG93aW5nIGNvZGUKLQkJCS8vdG8gY2hlY2sgZHJhZ2dlZCBmaWxlcyBvbmx5LiBBbHNvIG5lZWQgdG8gc2hvdyBhbGwgZmlsZXMgaW4gdHJlZS4KLQkJCS8qCi0JCQkgKiBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBuYW1lID0gbnVsbDsgaW50IG51bUZpbGVzID0KLQkJCSAqIHRlbXAuZ2V0RmlsZXMoKS5nZXRDaGlsZHJlbigpLmxlbmd0aDsgT2JqZWN0W10gZmlsZXMgPSB0ZW1wLmdldEZpbGVzKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCSAqIGZvcihpbnQgaSA9IDA7IGkgPCBkcmFnQW5kRHJvcEZpbGVOYW1lcy5zaXplKCk7IGkrKykgeyBmaWxlTmFtZSA9IChuZXcKLQkJCSAqIEZpbGUoKFN0cmluZylkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoaSkpKS5nZXROYW1lKCk7IGZvcihpbnQgayA9IDA7IGsgPCBudW1GaWxlczsKLQkJCSAqIGsrKykgeyBpZihmaWxlTmFtZS5lcXVhbHMoKChGaWxlKSAoKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KQotCQkJICogZmlsZXNbMF0pLmdldEZpbGVTeXN0ZW1PYmplY3QoKSkuZ2V0TmFtZSgpKSkgewotCQkJICogdGhpcy5zZWxlY3Rpb25Hcm91cC5pbml0aWFsQ2hlY2tUcmVlSXRlbSh0ZW1wKTsgYnJlYWs7IH0gfSB9Ci0JCQkgKi8KLQotCQkJLy90aGlzLnNlbGVjdGlvbkdyb3VwLnNldEFsbFNlbGVjdGlvbnModHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgcGF0aFRvQXJyYXkoKSB7Ci0JCVN0cmluZyBzID0gKFN0cmluZykgZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApOwotCi0JCVBhY2thZ2VOYW1lUmVzb2x2ZXIgbmFtZVJlc29sdmVyID0gbmV3IFBhY2thZ2VOYW1lUmVzb2x2ZXIoKTsKLQkJU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9IG5hbWVSZXNvbHZlci5nZXRDbGFzc05hbWUocyk7Ci0KLQkJaW50IHNsYXNoQ291bnRzID0gMDsKLQkJaWYgKHF1YWxpZmllZENsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUuaW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCQlTdHJpbmcgYmFzZURpciA9IHF1YWxpZmllZENsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJZm9yIChpbnQgaSA9IHMuaW5kZXhPZihiYXNlRGlyKTsgaSA8IHMubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsgaSsrKSB7Ci0JCQkJaWYgKHMuY2hhckF0KGkpID09IEZpbGUuc2VwYXJhdG9yQ2hhcikKLQkJCQkJc2xhc2hDb3VudHMrKzsKLQkJCX0KLQkJfQotCi0JCUxpc3QgZGlyTmFtZXNBcnJheSA9IG5ldyBBcnJheUxpc3Qoc2xhc2hDb3VudHMpOwotCQlpZiAocy5lbmRzV2l0aCgiLnppcCIpIHx8IHMuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBkaXJOYW1lc0FycmF5OwotCQl9Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJaW50IGVuZEluZGV4OwotCQlmb3IgKGludCBpID0gMDsgaSA8PSBzbGFzaENvdW50czsgaSsrKSB7Ci0JCQllbmRJbmRleCA9IHF1YWxpZmllZENsYXNzTmFtZS5pbmRleE9mKCcuJywgc3RhcnRJbmRleCk7Ci0JCQlkaXJOYW1lc0FycmF5LmFkZChxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSk7Ci0JCQlzdGFydEluZGV4ID0gZW5kSW5kZXggKyAxOwotCQl9Ci0JCXJldHVybiBkaXJOYW1lc0FycmF5OwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgZGlhbG9nIHN0b3JlIHRvIHJlc3RvcmUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgdmFsdWVzIHRoYXQgdGhleSBoZWxkIGxhc3QgdGltZSB0aGlzCi0JICogd2l6YXJkIHdhcyB1c2VkIHRvIGNvbXBsZXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlV2lkZ2V0VmFsdWVzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9TT1VSQ0VfTkFNRVNfSUQpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBpZS4tIG5vIHZhbHVlcyBzdG9yZWQsIHNvIHN0b3AKLQotCQkJLy8gc2V0IGZpbGVuYW1lcyBoaXN0b3J5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKQotCQkJCXNvdXJjZU5hbWVGaWVsZC5hZGQoc291cmNlTmFtZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luY2UgRmluaXNoIHdhcyBwcmVzc2VkLCB3cml0ZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSBkaWFsb2cgc3RvcmUgc28gdGhhdCB0aGV5IHdpbGwgcGVyc2lzdAotCSAqIGludG8gdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGlzIHdpemFyZCBwYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBzb3VyY2UgbmFtZXMgaGlzdG9yeQotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBzZXR0aW5ncy5nZXRBcnJheShTVE9SRV9TT1VSQ0VfTkFNRVNfSUQpOwotCQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpCi0JCQkJc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nWzBdOwotCi0JCQlzb3VyY2VOYW1lcyA9IGFkZFRvSGlzdG9yeShzb3VyY2VOYW1lcywgZ2V0U291cmNlRGlyZWN0b3J5TmFtZSgpKTsKLQkJCXNldHRpbmdzLnB1dChTVE9SRV9TT1VSQ0VfTkFNRVNfSUQsIHNvdXJjZU5hbWVzKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW52b2tlcyBhIGZpbGUgc2VsZWN0aW9uIG9wZXJhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGUgc3lzdGVtIGFuZCBzdHJ1Y3R1cmUgcHJvdmlkZXIuIElmCi0JICogdGhlIHVzZXIgc3BlY2lmaWVzIGZpbGVzIHRvIGJlIGltcG9ydGVkIHRoZW4gdGhpcyBzZWxlY3Rpb24gaXMgY2FjaGVkIGZvciBsYXRlciByZXRyaWV2YWwgYW5kCi0JICogaXMgcmV0dXJuZWQuCi0JICovCi0JcHJvdGVjdGVkIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHNlbGVjdEZpbGVzKGZpbmFsIE9iamVjdCByb290RmlsZVN5c3RlbU9iamVjdCwgZmluYWwgSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyKSB7Ci0KLQkJZmluYWwgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnRbXSByZXN1bHRzID0gbmV3IE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50WzFdOwotCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy9DcmVhdGUgdGhlIHJvb3QgZWxlbWVudCBmcm9tIHRoZSBzdXBwbGllZCBmaWxlIHN5c3RlbSBvYmplY3QKLQkJCQlyZXN1bHRzWzBdID0gY3JlYXRlUm9vdEVsZW1lbnQocm9vdEZpbGVTeXN0ZW1PYmplY3QsIHN0cnVjdHVyZVByb3ZpZGVyKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIHJlc3VsdHNbMF07Ci0JfQotCi0JLyoqCi0JICogU2V0IGFsbCBvZiB0aGUgc2VsZWN0aW9ucyBpbiB0aGUgc2VsZWN0aW9uIGdyb3VwIHRvIHZhbHVlLiBJbXBsZW1lbnRlZCBoZXJlIHRvIHByb3ZpZGUgYWNjZXNzCi0JICogZm9yIGlubmVyIGNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWxsU2VsZWN0aW9ucyhib29sZWFuIHZhbHVlKSB7Ci0JCXN1cGVyLnNldEFsbFNlbGVjdGlvbnModmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNvdXJjZSBuYW1lIG9mIHRoZSBpbXBvcnQgdG8gYmUgdGhlIHN1cHBsaWVkIHBhdGguIEFkZHMgdGhlIG5hbWUgb2YgdGhlIHBhdGggdG8gdGhlCi0JICogbGlzdCBvZiBpdGVtcyBpbiB0aGUgc291cmNlIGNvbWJvIGFuZCBzZWxlY3RzIGl0LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byBiZSBhZGRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZU5hbWUoU3RyaW5nIHBhdGgpIHsKLQotCQlpZiAocGF0aC5sZW5ndGgoKSA+IDApIHsKLQotCQkJU3RyaW5nW10gY3VycmVudEl0ZW1zID0gdGhpcy5zb3VyY2VOYW1lRmllbGQuZ2V0SXRlbXMoKTsKLQkJCWludCBzZWxlY3Rpb25JbmRleCA9IC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY3VycmVudEl0ZW1zW2ldLmVxdWFscyhwYXRoKSkKLQkJCQkJc2VsZWN0aW9uSW5kZXggPSBpOwotCQkJfQotCQkJaWYgKHNlbGVjdGlvbkluZGV4IDwgMCkgewotCQkJCWludCBvbGRMZW5ndGggPSBjdXJyZW50SXRlbXMubGVuZ3RoOwotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tvbGRMZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRJdGVtcywgMCwgbmV3SXRlbXMsIDAsIG9sZExlbmd0aCk7Ci0JCQkJbmV3SXRlbXNbb2xkTGVuZ3RoXSA9IHBhdGg7Ci0JCQkJdGhpcy5zb3VyY2VOYW1lRmllbGQuc2V0SXRlbXMobmV3SXRlbXMpOwotCQkJCXNlbGVjdGlvbkluZGV4ID0gb2xkTGVuZ3RoOwotCQkJfQotCQkJdGhpcy5zb3VyY2VOYW1lRmllbGQuc2VsZWN0KHNlbGVjdGlvbkluZGV4KTsKLQotCQkJcmVzZXRTZWxlY3Rpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgdHJlZSB0byBvbmx5IHNlbGVjdCB0aG9zZSBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RlZCB0eXBlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwU2VsZWN0aW9uc0Jhc2VkT25TZWxlY3RlZFR5cGVzKCkgewotCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpKTsKLQkJZmluYWwgTWFwIHNlbGVjdGlvbk1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlmaW5hbCBJRWxlbWVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSUVsZW1lbnRGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGZpbHRlckVsZW1lbnRzKENvbGxlY3Rpb24gZmlsZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJSXRlcmF0b3IgZmlsZXNMaXN0ID0gZmlsZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZmlsZXNMaXN0Lmhhc05leHQoKSkgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQkJY2hlY2tGaWxlKGZpbGVzTGlzdC5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZmlsdGVyRWxlbWVudHMoT2JqZWN0W10gZmlsZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQkJY2hlY2tGaWxlKGZpbGVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBjaGVja0ZpbGUoT2JqZWN0IGZpbGVFbGVtZW50KSB7Ci0JCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZmlsZSA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgZmlsZUVsZW1lbnQ7Ci0JCQkJaWYgKGlzRXhwb3J0YWJsZUV4dGVuc2lvbihmaWxlLmdldEZpbGVOYW1lRXh0ZW5zaW9uKCkpKSB7Ci0JCQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUZpbGVTeXN0ZW1FbGVtZW50IHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQkJCWlmIChzZWxlY3Rpb25NYXAuY29udGFpbnNLZXkocGFyZW50KSkKLQkJCQkJCWVsZW1lbnRzID0gKExpc3QpIHNlbGVjdGlvbk1hcC5nZXQocGFyZW50KTsKLQkJCQkJZWxlbWVudHMuYWRkKGZpbGUpOwotCQkJCQlzZWxlY3Rpb25NYXAucHV0KHBhcmVudCwgZWxlbWVudHMpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCJJbXBvcnRQYWdlLmZpbHRlclNlbGVjdGlvbnMiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoZmlsdGVyLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZGlhbG9nLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvL0NvdWxkbid0IHN0YXJ0LiBEbyBub3RoaW5nLgotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vR290IGludGVycnVwdGVkLiBEbyBub3RoaW5nLgotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IGFsbCBwYWludCBvcGVyYXRpb25zIGNhdXNlZCBieSBjbG9zaW5nIHRoZSBwcm9ncmVzcwotCQkvLyBkaWFsb2cgZ2V0IGZsdXNoZWQsIG90aGVyd2lzZSBleHRyYSBwaXhlbHMgd2lsbCByZW1haW4gb24gdGhlIHNjcmVlbiB1bnRpbAotCQkvLyB1cGRhdGVTZWxlY3Rpb25zIGlzIGNvbXBsZXRlZAotCQlnZXRTaGVsbCgpLnVwZGF0ZSgpOwotCQkvLyBUaGUgdXBkYXRlU2VsZWN0aW9ucyBtZXRob2QgYWNjZXNzZXMgU1dUIHdpZGdldHMgc28gY2Fubm90IGJlIGV4ZWN1dGVkCi0JCS8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIHByb2dyZXNzIGRpYWxvZyBvcGVyYXRpb24gc2luY2UgdGhlIG9wZXJhdGlvbiBmb3JrcwotCQkvLyBhIG5ldyBwcm9jZXNzLgotCQlpZiAoc2VsZWN0aW9uTWFwICE9IG51bGwpIHsKLQkJCXVwZGF0ZVNlbGVjdGlvbnMoc2VsZWN0aW9uTWFwKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSURpYWxvZ1BhZ2UuIFNldCB0aGUgc2VsZWN0aW9uIHVwIHdoZW4gaXQgYmVjb21lcyB2aXNpYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCXJlc2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh2aXNpYmxlKQotCQkJdGhpcy5zb3VyY2VOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbnMgd2l0aCB0aG9zZSBpbiBtYXAgLiBJbXBsZW1lbnRlZCBoZXJlIHRvIGdpdmUgaW5uZXIgY2xhc3MgdmlzaWJpbGl0eQotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIE1hcCAtIGtleSB0cmVlIGVsZW1lbnRzLCB2YWx1ZXMgTGlzdHMgb2YgbGlzdCBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbnMoTWFwIG1hcCkgewotCQlzdXBlci51cGRhdGVTZWxlY3Rpb25zKG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgd2lkZ2V0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBhIGNoYW5nZSBpbiB0aGUgZGlhbG9nLiBQcm92aWRlZCBoZXJlIHRvIGdpdmUKLQkgKiBhY2Nlc3MgdG8gaW5uZXIgY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIEV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKSB7Ci0KLQkJc3VwZXIudXBkYXRlV2lkZ2V0RW5hYmxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBzZWxmJ3Mgc291cmNlIHNwZWNpZmljYXRpb24gd2lkZ2V0cyBjdXJyZW50bHkgYWxsIGNvbnRhaW4KLQkgKiB2YWxpZCB2YWx1ZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTb3VyY2VHcm91cCgpIHsKLQkJaWYgKGdldFNvdXJjZURpcmVjdG9yeSgpICE9IG51bGwpIHsKLQkJCUZpbGUgc291cmNlRGlyZWN0b3J5ID0gZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0JCQlpZiAoc291cmNlRGlyZWN0b3J5ID09IG51bGwpIHsKLQkJCQlzZXRNZXNzYWdlKFNPVVJDRV9FTVBUWV9NRVNTQUdFKTsKLQkJCQllbmFibGVCdXR0b25Hcm91cChmYWxzZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoc291cmNlQ29uZmxpY3RzV2l0aERlc3RpbmF0aW9uKG5ldyBQYXRoKHNvdXJjZURpcmVjdG9yeS5nZXRQYXRoKCkpKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShnZXRTb3VyY2VDb25mbGljdE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbmFibGVCdXR0b25Hcm91cChmYWxzZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQllbmFibGVCdXR0b25Hcm91cCh0cnVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vSWYgdGhlcmUgaXMgbm90aGluZyBiZWluZyBwcm92aWRlZCB0byB0aGUgaW5wdXQgdGhlbiB0aGVyZSBpcyBhIHByb2JsZW0KLQkJaWYgKHRoaXMuY3VycmVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNldE1lc3NhZ2UoU09VUkNFX0VNUFRZX01FU1NBR0UpOwotCQkJZW5hYmxlQnV0dG9uR3JvdXAoZmFsc2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVuYWJsZUJ1dHRvbkdyb3VwKHRydWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNvdXJjZSBsb2NhdGlvbiBjb25mbGljdHMgd2l0aCB0aGUgZGVzdGluYXRpb24gcmVzb3VyY2UuIFRoaXMgd2lsbCBvY2N1cgotCSAqIGlmIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSB1bmRlciB0aGUgZGVzdGluYXRpb24uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0LCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc291cmNlQ29uZmxpY3RzV2l0aERlc3RpbmF0aW9uKElQYXRoIHNvdXJjZVBhdGgpIHsKLQotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldFNwZWNpZmllZENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRDb250YWluZXIoKS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2Yoc291cmNlUGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldFJlc291cmNlUGF0aCgpIHsKLQkJcmV0dXJuIGltcG9ydGVkQ2xhc3Nlc1BhdGg7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkvL21ha2VzdXJlIHRvIGNhbGwgbWFpbnBhZ2UuY2FuY2VsKCkKLQlwdWJsaWMgYm9vbGVhbiBjYW5jZWwoKSB7Ci0JCWNsZWFyUHJvdmlkZXJDYWNoZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGNhY2hlZCBzdHJ1Y3R1cmUgcHJvdmlkZXIgYWZ0ZXIgZmlyc3QgZmluYWxpemluZyBpdCBwcm9wZXJseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclByb3ZpZGVyQ2FjaGUoKSB7Ci0JCWlmIChwcm92aWRlckNhY2hlICE9IG51bGwpIHsKLQkJCWNsb3NlWmlwRmlsZShwcm92aWRlckNhY2hlLmdldFppcEZpbGUoKSk7Ci0JCQlwcm92aWRlckNhY2hlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGNsb3NlIHRoZSBwYXNzZWQgemlwIGZpbGUsIGFuZCBhbnN3ZXJzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VaaXBGaWxlKFppcEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJZmlsZS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2Rpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5mb3JtYXQoIlppcEltcG9ydC5jb3VsZE5vdENsb3NlIiwgbmV3Ci0JCQkvLyBPYmplY3RbXSB7IGZpbGUuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4gUmV0dXJuIG51bGwgaWYgdGhpcwotCSAqIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLQkgKi8KLQotCXByb3RlY3RlZCBaaXBGaWxlIGdldFNwZWNpZmllZFNvdXJjZUZpbGUoKSB7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIGhhbmRsZSB0byB0aGUgemlwIGZpbGUgY3VycmVudGx5IHNwZWNpZmllZCBhcyBiZWluZyB0aGUgc291cmNlLiBSZXR1cm4gbnVsbCBpZiB0aGlzCi0JICogZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgb2YgdmFsaWQgZm9ybWF0LgotCSAqLwotCi0JcHJpdmF0ZSBaaXBGaWxlIGdldFNwZWNpZmllZFNvdXJjZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgWmlwRmlsZShmaWxlTmFtZSk7Ci0JCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2Rpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5nZXRTdHJpbmcoIlppcEltcG9ydC5iYWRGb3JtYXQiKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLmdldFN0cmluZygiWmlwSW1wb3J0LmNvdWxkTm90UmVhZCIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RydWN0dXJlIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIHppcCBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoWmlwRmlsZSB0YXJnZXRaaXApIHsKLQkJaWYgKHByb3ZpZGVyQ2FjaGUgPT0gbnVsbCkKLQkJCXByb3ZpZGVyQ2FjaGUgPSBuZXcgWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyKHRhcmdldFppcCk7Ci0JCWVsc2UgaWYgKCFwcm92aWRlckNhY2hlLmdldFppcEZpbGUoKS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldFppcC5nZXROYW1lKCkpKSB7Ci0JCQljbGVhclByb3ZpZGVyQ2FjaGUoKTsgLy8gaWUuLSBuZXcgdmFsdWUsIHNvIGZpbmFsaXplJnJlbW92ZSBvbGQgdmFsdWUKLQkJCXByb3ZpZGVyQ2FjaGUgPSBuZXcgWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyKHRhcmdldFppcCk7Ci0JCX0gZWxzZSBpZiAoIXByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpLmVxdWFscyh0YXJnZXRaaXApKQotCQkJY2xvc2VaaXBGaWxlKHRhcmdldFppcCk7IC8vIGllLi0gZHVwbGljYXRlIGhhbmRsZSB0byBzYW1lIC56aXAKLQotCQlyZXR1cm4gcHJvdmlkZXJDYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgRmlsZURpYWxvZyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHRoZSBzb3VyY2UgZmlsZSB0byBpbXBvcnQgZnJvbQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNvdXJjZUJyb3dzZUJ1dHRvblByZXNzZWRGb3JaaXAoKSB7Ci0JCVN0cmluZyBzZWxlY3RlZEZpbGUgPSBxdWVyeVppcEZpbGVUb0ltcG9ydCgpOwotCQlpZiAoc2VsZWN0ZWRGaWxlICE9IG51bGwpIHsKLQkJCWlmICghc2VsZWN0ZWRGaWxlLmVxdWFscyhzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKSkgewotCQkJCS8vQmUgc3VyZSBpdCBpcyB2YWxpZCBiZWZvcmUgd2UgZ28gc2V0dGluZyBhbnkgbmFtZXMKLQkJCQlaaXBGaWxlIHNvdXJjZUZpbGUgPSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKHNlbGVjdGVkRmlsZSk7Ci0JCQkJaWYgKHNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCQljbG9zZVppcEZpbGUoc291cmNlRmlsZSk7Ci0JCQkJCXNldFNvdXJjZU5hbWUoc2VsZWN0ZWRGaWxlKTsKLQkJCQkJc2VsZWN0aW9uR3JvdXAuc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnQgdGhlIHJlc291cmNlcyB3aXRoIGV4dGVuc2lvbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0UmVzb3VyY2VzRnJvbVppcChMaXN0IGZpbGVTeXN0ZW1PYmplY3RzKSB7Ci0KLQkJWmlwRmlsZSB6aXBGaWxlID0gZ2V0U3BlY2lmaWVkU291cmNlRmlsZSgpOwotCQlaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBnZXRTdHJ1Y3R1cmVQcm92aWRlcih6aXBGaWxlKTsKLQotCQlib29sZWFuIHJlc3VsdCA9IGV4ZWN1dGVJbXBvcnRPcGVyYXRpb24obmV3IEltcG9ydE9wZXJhdGlvbihnZXRDb250YWluZXJGdWxsUGF0aCgpLCBzdHJ1Y3R1cmVQcm92aWRlci5nZXRSb290KCksIHN0cnVjdHVyZVByb3ZpZGVyLCB0aGlzLCBmaWxlU3lzdGVtT2JqZWN0cykpOwotCi0JCWNsb3NlWmlwRmlsZSh6aXBGaWxlKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIGFuZCByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2VsZWN0ZWQgZmlsZSwgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjYW5jZWxlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5WmlwRmlsZVRvSW1wb3J0KCkgewotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNvdXJjZU5hbWVGaWVsZC5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXXtGSUxFX0lNUE9SVF9NQVNLfSk7Ci0KLQkJU3RyaW5nIGN1cnJlbnRTb3VyY2VTdHJpbmcgPSBzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQlpbnQgbGFzdFNlcGFyYXRvckluZGV4ID0gY3VycmVudFNvdXJjZVN0cmluZy5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0JCWlmIChsYXN0U2VwYXJhdG9ySW5kZXggIT0gLTEpCi0JCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChjdXJyZW50U291cmNlU3RyaW5nLnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9ySW5kZXgpKTsKLQotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWU3ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldEluc3RhbGxDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuQWJzdHJhY3RGYWNldFdpemFyZFBhZ2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEVhckZhY2V0SW5zdGFsbFBhZ2UgCi0KLSAgICBleHRlbmRzIEFic3RyYWN0RmFjZXRXaXphcmRQYWdlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBFYXJGYWNldEluc3RhbGxDb25maWcgY29uZmlnOwotICAgIHByaXZhdGUgTGFiZWwgY29udGVudERpckxhYmVsOwotICAgIHByaXZhdGUgVGV4dCBjb250ZW50RGlyOwotICAgIAotICAgIHB1YmxpYyBFYXJGYWNldEluc3RhbGxQYWdlKCkgCi0gICAgewotICAgICAgICBzdXBlciggImVhci5mYWNldC5pbnN0YWxsLnBhZ2UiICk7Ci0gICAgICAgIAotICAgICAgICBzZXRUaXRsZSggUmVzb3VyY2VzLnBhZ2VUaXRsZSApOwotICAgICAgICBzZXREZXNjcmlwdGlvbiggUmVzb3VyY2VzLnBhZ2VEZXNjcmlwdGlvbiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkgCi0gICAgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBuZXcgR3JpZExheW91dCggMSwgZmFsc2UgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jb250ZW50RGlyTGFiZWwgPSBuZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLSAgICAgICAgdGhpcy5jb250ZW50RGlyTGFiZWwuc2V0VGV4dCggUmVzb3VyY2VzLmNvbnRlbnREaXJMYWJlbCApOwotICAgICAgICB0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29udGVudERpciA9IG5ldyBUZXh0KCBjb21wb3NpdGUsIFNXVC5CT1JERVIgKTsKLSAgICAgICAgdGhpcy5jb250ZW50RGlyLnNldFRleHQoIHRoaXMuY29uZmlnLmdldENvbnRlbnREaXIoKSApOwotICAgICAgICB0aGlzLmNvbnRlbnREaXIuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoIGZpbmFsIE1vZGlmeUV2ZW50IGV2ZW50ICkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29udGVudERpci5hZGRNb2RpZnlMaXN0ZW5lciggbW9kaWZ5TGlzdGVuZXIgKTsKLSAgICAgICAgCi0gICAgICAgIHNldENvbnRyb2woIGNvbXBvc2l0ZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWcoIGZpbmFsIE9iamVjdCBjb25maWcgKSAKLSAgICB7Ci0gICAgICAgIHRoaXMuY29uZmlnID0gKEVhckZhY2V0SW5zdGFsbENvbmZpZykgY29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyU3RhdGVUb0NvbmZpZygpIAotICAgIHsKLSAgICAgICAgdGhpcy5jb25maWcuc2V0Q29udGVudERpciggdGhpcy5jb250ZW50RGlyLmdldFRleHQoKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0KLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gdGhpcy5jb250ZW50RGlyTGFiZWwuZ2V0RGlzcGxheSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnREaXJMYWJlbFRleHQ7Ci0gICAgICAgIGZpbmFsIENvbG9yIGNvbnRlbnREaXJMYWJlbENvbG9yOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuY29udGVudERpci5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZW50RGlyTGFiZWxUZXh0ID0gUmVzb3VyY2VzLmNvbnRlbnREaXJMYWJlbEludmFsaWQ7Ci0gICAgICAgICAgICBjb250ZW50RGlyTGFiZWxDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoIFNXVC5DT0xPUl9SRUQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRlbnREaXJMYWJlbFRleHQgPSBSZXNvdXJjZXMuY29udGVudERpckxhYmVsOwotICAgICAgICAgICAgY29udGVudERpckxhYmVsQ29sb3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRUZXh0KCBjb250ZW50RGlyTGFiZWxUZXh0ICk7Ci0gICAgICAgIHRoaXMuY29udGVudERpckxhYmVsLnNldEZvcmVncm91bmQoIGNvbnRlbnREaXJMYWJlbENvbG9yICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNldFBhZ2VDb21wbGV0ZSggdmFsaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgZ2RoZmlsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGVudERpckxhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50RGlyTGFiZWxJbnZhbGlkOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRWFyRmFjZXRJbnN0YWxsUGFnZS5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjNzQ4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhZ2VUaXRsZSA9IEVBUiBNb2R1bGUKLXBhZ2VEZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSBFQVIgbW9kdWxlIHNldHRpbmdzLgotY29udGVudERpckxhYmVsID0gQ29udGVudCBEaXJlY3RvcnlcOgotY29udGVudERpckxhYmVsSW52YWxpZCA9IENvbnRlbnQgRGlyZWN0b3J5IChpbnZhbGlkKVw6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJQcm9qZWN0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNjZhZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyUHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5GYWNldGVkUHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFYXJQcm9qZWN0V2l6YXJkCi0KLSAgICBleHRlbmRzIEZhY2V0ZWRQcm9qZWN0V2l6YXJkCi0KLXsKLSAgICBwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFRlbXBsYXRlKCAidGVtcGxhdGUuZWFyIiApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhZ2VEZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gIkNyZWF0ZSBhbiBFQVIgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIG9yIGF0IGFuIGV4dGVybmFsIGxvY2F0aW9uIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuYmFzZSIgKTsKLSAgICAgICAgZmluYWwgVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSggImltYWdlcy9lYXItd2l6LWJhbm5lci5naWYiICk7Ci0KLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKCB1cmwgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJTZWxlY3Rpb25QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDE1NTkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFYXJTZWxlY3Rpb25QYW5lbAotCi0gICAgZXh0ZW5kcyBDb21wb3NpdGUKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCBsaXN0ZW5lcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCdXR0b24gYWRkVG9FYXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLSAgICBwcml2YXRlIGZpbmFsIEJ1dHRvbiBuZXdCdXR0b247Ci0gICAKLSAgICBwdWJsaWMgRWFyU2VsZWN0aW9uUGFuZWwoIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0eWxlICkgCi0gICAgewotICAgICAgICBzdXBlciggcGFyZW50LCBzdHlsZSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCAyLCBmYWxzZSApOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgCi0gICAgICAgIHNldExheW91dCggbGF5b3V0ICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmFkZFRvRWFyID0gbmV3IEJ1dHRvbiggdGhpcywgU1dULkNIRUNLICk7Ci0gICAgICAgIHRoaXMuYWRkVG9FYXIuc2V0VGV4dCggUmVzb3VyY2VzLmFkZFRvRWFyTGFiZWwgKTsKLSAgICAgICAgdGhpcy5hZGRUb0Vhci5zZXRMYXlvdXREYXRhKCBnZGhzcGFuKCBnZGhmaWxsKCksIDIgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5hZGRUb0Vhci5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggZmluYWwgU2VsZWN0aW9uRXZlbnQgZXZlbnQgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldEVuYWJsZWRTdGF0ZSgpOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycygpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbWJvID0gbmV3IENvbWJvKCB0aGlzLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgICAgICB0aGlzLmNvbWJvLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggZmluYWwgU2VsZWN0aW9uRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycygpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm5ld0J1dHRvbiA9IG5ldyBCdXR0b24oIHRoaXMsIFNXVC5QVVNIICk7Ci0gICAgICAgIHRoaXMubmV3QnV0dG9uLnNldFRleHQoIFJlc291cmNlcy5uZXdCdXR0b25MYWJlbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5uZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBZGRCdXR0b24oKTsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSApOwotICAgICAgICAKLSAgICAgICAgcmVzZXRFbmFibGVkU3RhdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHBvcHVsYXRlRWFyTGlzdCgpOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb21iby5zZWxlY3QoIDAgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBZGRUb0VhcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5hZGRUb0Vhci5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRFYXJQcm9qZWN0TmFtZSgpCi0gICAgewotICAgICAgICBpZiggdGhpcy5hZGRUb0Vhci5nZXRTZWxlY3Rpb24oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IHRoaXMuY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIHJldHVybiBpbmRleCA9PSAtMSA/IG51bGwgOiB0aGlzLmNvbWJvLmdldEl0ZW0oIGluZGV4ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkKCBsaXN0ZW5lciApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lciggZmluYWwgTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMucmVtb3ZlKCBsaXN0ZW5lciApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gdGhpcy5saXN0ZW5lcnMuc2l6ZSgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgKCAoTGlzdGVuZXIpIHRoaXMubGlzdGVuZXJzLmdldCggaSApICkuaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVzZXRFbmFibGVkU3RhdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBlbmFibGVkID0gdGhpcy5hZGRUb0Vhci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29tYm8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgICAgICB0aGlzLm5ld0J1dHRvbi5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUVhckxpc3QoKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0W10gcHJvamVjdHMgPSB3cy5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbIGkgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGVJZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdHlwZSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgICAgICA9ICJDb21wb25lbnQgWyIgKyBjb21wb25lbnQuZ2V0TmFtZSgpICsgIl0gaW4gcHJvamVjdCBbIgotICAgICAgICAgICAgICAgICAgICAgICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXSBoYXMgbnVsbCB0eXBlaWQuIjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHR5cGUuZXF1YWxzKCAianN0LmVhciIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb21iby5hZGQoIHByb2plY3QuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZEJ1dHRvbigpCi0gICAgewotICAgICAgICBmaW5hbCBFYXJQcm9qZWN0V2l6YXJkIHdpemFyZCA9IG5ldyBFYXJQcm9qZWN0V2l6YXJkKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBXaXphcmREaWFsb2cgZGlhbG9nIAotICAgICAgICAgICAgPSBuZXcgV2l6YXJkRGlhbG9nKCBnZXRTaGVsbCgpLCB3aXphcmQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBkaWFsb2cub3BlbigpICE9IFNXVC5DQU5DRUwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZWFycHJvaiA9IHdpemFyZC5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZWFycHJvaiAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUVhckxpc3QoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCk7IGkgPCBuOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuY29tYm8uZ2V0SXRlbSggaSApLmVxdWFscyggZWFycHJvaiApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21iby5zZWxlY3QoIGkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEdyaWREYXRhIGdkaGZpbGwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBHcmlkRGF0YSBnZGhzcGFuKCBmaW5hbCBHcmlkRGF0YSBnZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGFuICkKLSAgICB7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLSAgICAgICAgcmV0dXJuIGdkOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRUb0VhckxhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdCdXR0b25MYWJlbDsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEVhclNlbGVjdGlvblBhbmVsLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzMyYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYWRkVG9FYXJMYWJlbCA9IEFkZCBwcm9qZWN0IHRvIGFuIEVBUi4KLW5ld0J1dHRvbkxhYmVsID0gTmV3Li4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkY2YxYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuVXRpbGl0eUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5BYnN0cmFjdEZhY2V0V2l6YXJkUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UgCi0KLSAgICBleHRlbmRzIEFic3RyYWN0RmFjZXRXaXphcmRQYWdlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBVdGlsaXR5RmFjZXRJbnN0YWxsQ29uZmlnIGNvbmZpZzsKLSAgICBwcml2YXRlIEVhclNlbGVjdGlvblBhbmVsIGVhclBhbmVsOwotICAgIAotICAgIHB1YmxpYyBVdGlsaXR5RmFjZXRJbnN0YWxsUGFnZSgpIAotICAgIHsKLSAgICAgICAgc3VwZXIoICJ1dGlsaXR5LmZhY2V0Lmluc3RhbGwucGFnZSIgKTsKLSAgICAgICAgCi0gICAgICAgIHNldFRpdGxlKCBSZXNvdXJjZXMucGFnZVRpdGxlICk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCBSZXNvdXJjZXMucGFnZURlc2NyaXB0aW9uICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgKSAKLSAgICB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoIG5ldyBHcmlkTGF5b3V0KCAxLCBmYWxzZSApICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmVhclBhbmVsID0gbmV3IEVhclNlbGVjdGlvblBhbmVsKCBjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgIHRoaXMuZWFyUGFuZWwuc2V0TGF5b3V0RGF0YSggZ2RoZmlsbCgpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmVhclBhbmVsLmFkZExpc3RlbmVyKCBuZXcgTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgRXZlbnQgZXZlbnQgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0RWFyUHJvamVjdE5hbWUoIGVhclBhbmVsLmdldEVhclByb2plY3ROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgICAgIAotICAgICAgICBzZXRDb250cm9sKCBjb21wb3NpdGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKCBmaW5hbCBPYmplY3QgY29uZmlnICkgCi0gICAgewotICAgICAgICB0aGlzLmNvbmZpZyA9IChVdGlsaXR5RmFjZXRJbnN0YWxsQ29uZmlnKSBjb25maWc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCkgCi0gICAgewotICAgICAgICBpZiggdGhpcy5lYXJQYW5lbC5nZXRBZGRUb0VhcigpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0RWFyUHJvamVjdE5hbWUoIHRoaXMuZWFyUGFuZWwuZ2V0RWFyUHJvamVjdE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0RWFyUHJvamVjdE5hbWUoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5lYXJQYW5lbC5nZXRBZGRUb0VhcigpICYmIAotICAgICAgICAgICAgdGhpcy5lYXJQYW5lbC5nZXRFYXJQcm9qZWN0TmFtZSgpID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNldFBhZ2VDb21wbGV0ZSggdmFsaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgZ2RoZmlsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFV0aWxpdHlGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9VdGlsaXR5UHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhYWQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9VdGlsaXR5UHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5GYWNldGVkUHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsaXR5UHJvamVjdFdpemFyZCAKLQotICAgIGV4dGVuZHMgRmFjZXRlZFByb2plY3RXaXphcmQgCi0gICAgCi17Ci0gICAgcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSggInRlbXBsYXRlLnV0aWxpdHkiICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFnZURlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiQ3JlYXRlIGEgVXRpbGl0eSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugb3IgYXQgYW4gZXh0ZXJuYWwgbG9jYXRpb24uIjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpCi0gICAgewotICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmJhc2UiICk7Ci0gICAgICAgIGZpbmFsIFVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkoICJpbWFnZXMvdXRpbC13aXotYmFubmVyLmdpZiIgKTsKLQotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoIHVybCApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvamF2YWRvYy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2phdmFkb2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNhMDNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvamF2YWRvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBkZWZhdWx0PSJqYXZhZG9jIj4KLSAgICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiPgotICAgICAgICA8amF2YWRvYyBhY2Nlc3M9InByb3RlY3RlZCIgYXV0aG9yPSJmYWxzZSIgY2xhc3NwYXRoPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvYmluOy4uL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9iaW47Li4vb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5uYXZpZ2F0b3IuamF2YS9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wXGNvcmUuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcl8xLjAuMFx1cmlyZXNvbHZlci5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuZWRpdC51aV8yLjEuMFxydW50aW1lXGVkaXQudWkuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LndzZGxfMS4wLjBcd3NkbC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS5lZGl0b3JzXzMuMS4wXGVkaXRvcnMuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcY29tLmlibS53dHAuY29tbW9uLnV0aWxfMS4wLjFcdXRpbC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdF8yLjEuMFxydW50aW1lXGVjb3JlLmVkaXQuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlcl8xLjAuMFx4bWxjYXRhbG9nLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaF8zLjEuMFx3b3JrYmVuY2guamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHlfMy4wLjBcY29tcGF0aWJpbGl0eS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xjb20uaWJtLnd0cC5lbWYud29ya2JlbmNoXzEuMC4xLjFcZW1md29ya2JlbmNoLmphcjsuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmVkaXRfMi4xLjBccnVudGltZVxlZGl0LmphcjsuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoXzEuMC4xLjFcd29ya2JlbmNoLmphcjsuLi9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9iaW47Li4vb3JnLmVjbGlwc2Uud3N0LndlYi9iaW47Li4vb3JnLmVjbGlwc2UuanN0LmVqYi51aS9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZHQuY29yZV8zLjEuMFxqZHRjb3JlLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLm9zZ2lfMy4xLjBcb3NnaS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpXzIuMC4xXHJ1bnRpbWVcY29tbW9uLnVpLmphcjsuLi9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW5fMi4xLjBccnVudGltZVxjb2RlZ2VuLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmlkZV8zLjEuMFxpZGUuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamR0LnVpXzMuMS4wXGpkdC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZW1fMS4wLjFcamF2YWluc3QuamFyOy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wXGRlZmF1bHRBZGFwdG9yLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnN3dC53aW4zMl8zLjEuMFx3c1x3aW4zMlxzd3QuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uub3NnaV8zLjEuMFxyZXNvbHZlci5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3Qud3NkbF8xLjAuMFxqYXJzXHdzZGw0ai5qYXI7Li4vb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnhzZF8yLjEuMFxydW50aW1lXHhzZC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZmFjZS50ZXh0XzMuMS4wXGpmYWNldGV4dC5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcl8zLjEuMFx0ZXh0ZWRpdG9yLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLnZpZXdzXzMuMS4wXHZpZXdzLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzXzMuMS4wXHJlc291cmNlcy5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbnRlbnRtb2RlbF8xLjAuMFxjb250ZW50bW9kZWwuamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudGV4dF8zLjEuMFx0ZXh0LmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXJfMS4wLjBccGFyc2VyLmphcjsuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS9iaW47Li4vb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL2JpbjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLm9zZ2lfMy4xLjBcZWNsaXBzZUFkYXB0b3IuamFyOy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcnVudGltZS9qMmVlLmphcjsuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVyc18zLjEuMFxmaWxlYnVmZmVycy5qYXI7Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3Iud29ya2JlbmNoL2JpbjsuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1pZ3JhdGlvbi9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3Qud2ViYnJvd3Nlcl8xLjAuMFx3ZWJicm93c2VyLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmplbV8xLjAuMVxtb2ZqYXZhLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZV8zLjAuMFxzZXJ2ZXJjb3JlLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5jb21tb25fMi4xLjBccnVudGltZVxjb21tb24uamFyO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aV8zLjAuMFxzZXJ2ZXJ1aS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nXzMuMS4wXGxhdW5jaGluZy5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3Qud3NkbF8xLjAuMFxqYXJzXHFuYW1lLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpXzMuMS4wXHVpLmphcjsuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYmluOy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmVfMi4xLjBccnVudGltZVxjb2RlZ2VuLmVjb3JlLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nXzMuMS4wXHJlZmNvcmUuamFyOy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2JpbjtiaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVfMy4xLjBccnVudGltZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wXGNvbnNvbGUuamFyOy4uL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2JpbjsuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cy9iaW47RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yXzMuMC4wXGNvbmZpZ3VyYXRvci5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pXzIuMS4wXHJ1bnRpbWVcZWNvcmUueG1pLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpmYWNlXzMuMS4wXGpmYWNlLmphcjtEOlxEZXZlbG9wbWVudFx0YXJnZXRzXHd0cF90YXJnZXRcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmVtZi5lY29yZV8yLjEuMFxydW50aW1lXGVjb3JlLmphcjsuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvYmluO0Q6XERldmVsb3BtZW50XHRhcmdldHNcd3RwX3RhcmdldFxlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlXzMuMC4wXHNqYXZhY29yZS5qYXI7RDpcRGV2ZWxvcG1lbnRcdGFyZ2V0c1x3dHBfdGFyZ2V0XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nXzEuMC4wXGVuY29kaW5ncmVzb3VyY2UuamFyIiBkZXN0ZGlyPSJEOlxEZXZlbG9wbWVudFx3dHBfYXBpX2RvY3MiIG5vZGVwcmVjYXRlZD0iZmFsc2UiIG5vZGVwcmVjYXRlZGxpc3Q9ImZhbHNlIiBub2luZGV4PSJmYWxzZSIgbm9uYXZiYXI9ImZhbHNlIiBub3RyZWU9ImZhbHNlIiBwYWNrYWdlbmFtZXM9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aSxvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSxvcmcuZWNsaXBzZS5qc3QuajJlZS51aSxvcmcuZWNsaXBzZS5qc3QuZWpiLnVpIiBzb3VyY2VwYXRoPSJqMmVlX3VpOy4uL29yZy5lY2xpcHNlLmpzdC5lamIudWkvcHJvcGVydHlfZmlsZXM7Li4vb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcHJvcGVydHlfZmlsZXM7cHJvcGVydHlfZmlsZXM7Li4vb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aTsuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLnVpL2VqYl91aTsuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcHJvcGVydHlfZmlsZXM7Li4vb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aSIgc3BsaXRpbmRleD0idHJ1ZSIgdXNlPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhOTM5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotajJlZT1KMkVFCi1jbGllbnQuamFyLmZpbGVfdWlfPUFwcCBDbGllbnQgSkFSIGZpbGUKLWNsaWVudC5pbXBvcnQuZGVzY3JpcHRpb25fdWlfPUltcG9ydCBhbiBleHRlcm5hbCBBcHBsaWNhdGlvbiBDbGllbnQgSkFSIGZpbGUgaW50byBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdAotY2xpZW50LmV4cG9ydC5kZXNjcmlwdGlvbl91aV89RXhwb3J0IGFuIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0IGludG8gYW4gQXBwbGljYXRpb24gQ2xpZW50IEpBUiBmaWxlCi1lYXIuZmlsZV91aV89RUFSIGZpbGUKLWVhci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfPUltcG9ydCBhbiBleHRlcm5hbCBFQVIgZmlsZSBpbnRvIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdAotZWFyLmV4cG9ydC5kZXNjcmlwdGlvbl91aV89RXhwb3J0IGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBpbnRvIGFuIEVBUiBmaWxlCi1lYXIuZXhwb3J0LmFjdGlvbi5kZXNjcmlwdGlvbl91aV89RXhwb3J0IEVBUiBGaWxlLi4uCi1qMmVlLmNhdGVnb3J5X3VpXz1KMkVFCi1jbGllbnQucHJvamVjdF91aV89QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLWVhci5wcm9qZWN0X3VpXz1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QKLWoyZWUuYWN0aW9ucy5kZXNjcmlwdGlvbl91aV89QWN0aW9ucyBmb3IgSjJFRSBEZXZlbG9wbWVudAotY3JlYXRlLmVudGVycHJpc2UuYXBwbGljYXRpb25fdWlfPUNyZWF0ZSBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uCi1jcmVhdGUuY2xpZW50Lm1vZHVsZV91aV89Q3JlYXRlIGFuIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0Ci1jbGllbnQuZXhwb3J0LmFjdGlvbi5sYWJlbF91aV89RXhwb3J0IEFwcGxpY2F0aW9uIENsaWVudCBKQVIuLi4KLWphci5kZXBlbmRlbmNpZXMucHJvcHNfdWlfPUoyRUUgTW9kdWxlcwotZWpiLmV4cG9ydC5hY3Rpb24uZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBFSkIgSkFSIEZpbGUuLi4KLWVqYi5jbGllbnQuamFyLmNyZWF0aW9uLmFjdGlvbi5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIEVKQiBDbGllbnQgSmFyCi1lbXB0eUVKQkdyb3VwRmlsdGVyLm5hbWU9RW1wdHkgRUpCIGdyb3VwcwotZWpiLmV4cG9ydC5hY3Rpb24uZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBFSkIgSkFSIEZpbGUuLi4KLXV0aWxpdHlfamFyX2ltcG9ydF93aXphcmQ9SjJFRSBVdGlsaXR5IEphcgotZGVwbG95X3VpXz1EZXBsb3kKLUltcG9ydF9DbGFzc2VzPUltcG9ydCBDbGFzcyBGaWxlcy4uLgotZmxleGlibGUucHJvamVjdF91aV89RmxleGlibGUgSmF2YSBQcm9qZWN0Ci1uZXcuZmxleGlibGUucHJvamVjdC5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgZmxleGlibGUgSmF2YSBwcm9qZWN0Ci1lYXJfY29tcG9uZW50X3VpXz1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QKLW5ldy5lYXIuY29tcG9uZW50LmRlc2NyaXB0aW9uX3VpXz1DcmVhdGUgYSBKMkVFIEVBUiBwcm9qZWN0Ci1hcHBjbGllbnRfY29tcG9uZW50X3VpXz1BcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdAotbmV3LmFwcGNsaWVudC5jb21wb25lbnQuZGVzY3JpcHRpb25fdWlfPUNyZWF0ZSBhIEoyRUUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3QKLUphdmFfQ29tcG9uZW50PUphdmEgQ29tcG9uZW50Ci1KYXZhX0NvbXBvbmVudC5kZXNjcmlwdGlvbj1DcmVhdGUgYSBKYXZhIENvbXBvbmVudAotYWRkbW9kdWxlc3RvZWFyLnByb3BzX3VpXz1FQVIgbW9kdWxlcwotSjJFRURlcGVuZGVuY2llc1BhZ2UubmFtZSA9IEoyRUUgTW9kdWxlIERlcGVuZGVuY2llcwotd2VibGliLmRlcGVuZGVuY2llcy5wcm9wc191aV89IFdlYiBMaWJyYXJpZXMgCi1KMkVFX1JlbmFtZV9QYXJ0aWNpcGFudD1KMkVFIFJlbmFtZSBQYXJ0aWNpcGFudAotbmV3LXByb2plY3RzLXdpemFyZC1jYXRlZ29yeS1uYW1lID0gV2ViIFRvb2xzIChOZXcpCi11dGlsLXByb2plY3Qtd2l6YXJkLW5hbWUgPSBVdGlsaXR5IFByb2plY3QKLXV0aWwtcHJvamVjdC13aXphcmQtZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBVdGlsaXR5IHByb2plY3QKLWVhci1wcm9qZWN0LXdpemFyZC1uYW1lID0gRUFSIFByb2plY3QKLWVhci1wcm9qZWN0LXdpemFyZC1kZXNjcmlwdGlvbiA9IENyZWF0ZSBhbiBFQVIgcHJvamVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc0ZjU5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBQdXJwb3NlOiBFeHRlbnNpb24gZm9yIHRoZSBKMkVFIEFDdGlvbiBTZXRzICAgICAgICAgICAgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVqMmVlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVqMmVlLmFjdGlvbnMuZGVzY3JpcHRpb25fdWlfIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJlZU1haW5BY3Rpb25TZXQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVjcmVhdGUuY2xpZW50Lm1vZHVsZV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlY3JlYXRlLmNsaWVudC5tb2R1bGVfdWlfIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9IkoyRUVNYWluIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3QXBwQ2xpZW50Q29tcG9uZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVjcmVhdGUuZW50ZXJwcmlzZS5hcHBsaWNhdGlvbl91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlY3JlYXRlLmVudGVycHJpc2UuYXBwbGljYXRpb25fdWlfIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3RUFSQ29tcG9uZW50QWN0aW9uIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9IkoyRUVNYWluIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuTmV3RUFSQ29tcG9uZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+IAotICAgPC9leHRlbnNpb24+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBQcm9qZWN0IFdpemFyZCBDb250cmlidXRpb25zICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJKMkVFVUlQcm9qZWN0V2l6YXJkcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWoyZWUuY2F0ZWdvcnlfdWlfIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci08IS0tIEZsZXhpYmxlIFByb2plY3QgV2l6YXJkIAotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJWZsZXhpYmxlLnByb2plY3RfdWlfIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpkdC51aS5qYXZhIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5GbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLSAgICAgICAgICAgIHByb2plY3Q9InRydWUiCi0gICAgICAgICAgICBmaW5hbFBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiCi0gICAgICAgICAgICA+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlbmV3LmZsZXhpYmxlLnByb2plY3QuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPi0tPgotPCEtLSBFQVIgQ29tcG9uZW50IFdpemFyZCAtLT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVlYXJfY29tcG9uZW50X3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlbmV3LmVhci5jb21wb25lbnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotPCEtLSBBcHBsaWNhdGlvbiBDbGllbnQgQ29tcG9uZW50IFdpemFyZCAtLT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVhcHBjbGllbnRfY29tcG9uZW50X3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlbmV3LmFwcGNsaWVudC5jb21wb25lbnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gSW1wb3J0IFdpemFyZCBDb250cmlidXRpb25zICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlY2xpZW50Lmphci5maWxlX3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5BcHBDbGllbnRNb2R1bGVJbXBvcnRXaXphcmROZXciPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWNsaWVudC5pbXBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVlYXIuZmlsZV91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5FbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnRXaXphcmROZXciPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWVhci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPiAKLSAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgCi0gICA8IS0tICAgPHdpemFyZAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2phcl9vYmouZ2lmIgotICAgICAgICAgICAgbmFtZT0iJXV0aWxpdHlfamFyX2ltcG9ydF93aXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmQiPgotICAgICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JICAgICAgICA8L3NlbGVjdGlvbj4KLQkgIDwvd2l6YXJkPiAgICAgCi0JICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJUltcG9ydF9DbGFzc2VzIgotICAgICAgICAgICAgaWNvbj0iIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5DbGFzc2VzSW1wb3J0V2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5DbGFzc2VzSW1wb3J0V2l6YXJkIj4KLSAgICAgICAgIAotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPiAgICAgICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPiAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBFeHBvcnQgV2l6YXJkIENvbnRyaWJ1dGlvbnMgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVjbGllbnQuamFyLmZpbGVfdWlfIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuQXBwQ2xpZW50TW9kdWxlRXhwb3J0V2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjbGllbnQuZXhwb3J0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVlYXIuZmlsZV91aV8iCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5FbnRlcnByaXNlQXBwbGljYXRpb25FeHBvcnRXaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJWVhci5leHBvcnQuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS51aS5wcm9qZWN0TmF0dXJlSW1hZ2VzICAgIC0tPgotPCEtLSBQdXJwb3NlOiBBdHRhY2ggaWNvbiBvdmVybGF5cyBmb3IgSjJFRSBwcm9qZWN0IG5hdHVyZXMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUucHJvamVjdE5hdHVyZUltYWdlcyI+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmIgotICAgICAgICAgICAgbmF0dXJlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWpiUHJvamVjdE5hdHVyZUltYWdlIj4KLSAgICAgIDwvaW1hZ2U+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb3ZyMTYvZW50ZXJwcmlzZV9hcHBfb3ZyLmdpZiIKLSAgICAgICAgICAgIG5hdHVyZUlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWFyUHJvamVjdE5hdHVyZUltYWdlIj4KLSAgICAgIDwvaW1hZ2U+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb3ZyMTYvY2xpZW50X2FwcF9vdnIuZ2lmIgotICAgICAgICAgICAgbmF0dXJlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmFwcENsaWVudE1vZFByb2plY3ROYXR1cmVJbWFnZSI+Ci0gICAgICA8L2ltYWdlPgotICAgICAgPGltYWdlCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL292cjE2L2Nvbm5lY3Rvcl9vdnIuZ2lmIgotICAgICAgICAgICAgbmF0dXJlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JOYXR1cmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuQ29ubmVjdG9yTW9kUHJvamVjdE5hdHVyZUltYWdlIj4KLSAgICAgIDwvaW1hZ2U+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb3ZyMTYvd2ViX21vZHVsZV9vdnIuZ2lmIgotICAgICAgICAgICAgbmF0dXJlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud2ViUHJvamVjdE5hdHVyZUltYWdlIj4KLSAgICAgIDwvaW1hZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPCEtLSBOYXZpZ2F0b3IgT2JqZWN0IENvbnRyaWJ1dGlvbnMgLS0+Ci08IS0tIEVBUiBHcm91cCBDb250cmlidXRpb25zIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLmdyb3Vwcy5OYXZpZ2F0b3JHcm91cCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuZWFyTmV3UHJvamVjdEFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVlYXIucHJvamVjdF91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3ZWFyX3dpei5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5OZXdFQVJQcm9qZWN0QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3IubmV3Lm1lbnUvYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IubmV3RUFSQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIj4KLSAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci08IS0tIE5hdmlnYXRvciBPYmplY3QgQ29udHJpYnV0aW9ucyAtLT4KLTwhLS0gQXBwbGljYXRpb24gQ2xpZW50IEdyb3VwIENvbnRyaWJ1dGlvbnMgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5hcHBDbGllbnROZXdQcm9qZWN0QWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFwcGNsaWVudC5wcm9qZWN0X3VpXyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0FwcGxDbGllbnRQcm9qZWN0QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3IubmV3Lm1lbnUvYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IubmV3QXBwQ2xpZW50QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiPgotICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAtLT4KLTwhLS0gTmF2aWdhdG9yIE9iamVjdCBDb250cmlidXRpb25zIC0tPgotCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53dHB1aUFjdGlvbiI+IAotICAgICAgPG1hc3Rlck9wZXJhdGlvbgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkRlbGV0ZSB0aGUgZGVwZW5kZW50IEoyRUUgbW9kdWxlcyIKLSAgICAgICAgICAgIGV4dGVuZGVkR2VuZXJpY0lkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuRGVsZXRlIgotICAgICAgICAgICAgcG9wdWxhdG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLmFjdGlvbnMuSjJFRURlbGV0ZU1vZHVsZUFjdGlvblBvcHVsYXRvciIKLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbi51aS5JQWN0aW9uV1RQT3BlcmF0aW9uIgotICAgICAgICAgICAgbmFtZT0iRGVsZXRlIEoyRUUgRGVwZW5kZW50IE1vZHVsZXMiIAotICAgICAgICAgICAgYWx3YXlzRXhlY3V0ZT0idHJ1ZSIKLSAgICAgICAgICAgIG92ZXJyaWRlSWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uYWN0aW9ucy5KYXZhLmRlbGV0ZSI+Ci0gICAgICAgICAgICA8c2VsZWN0aW9uRW5hYmxlbWVudD4KLSAgICAgICAgICAgIAk8b3I+Ci0gICAgICAgICAgICAJCTxhbmQ+Ci0gICAgICAgICAgICAJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIAkJCQkJIGFkYXB0YWJsZT0idHJ1ZSIgLz4KLQkJCQkJPG9yPgotCQkJICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JCQkgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIgotCQkJICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIgLz4gCi0JCQkgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkJCSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSIKLQkJCSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiIC8+IAotCQkJICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JCQkgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rvck5hdHVyZSIKLQkJCSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiIC8+IAotCQkJICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JCQkgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSIKLQkJCSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiIC8+IAotCQkJICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JCQkgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSIKLQkJCSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiIC8+IAotCQkJICAgICAgICAgICAgPC9vcj4gICAgICAgICAgICAJCQkJCSAKLSAgICAgICAgICAgIAkJPC9hbmQ+IAotCSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uQXBwbGljYXRpb24iPgotCSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50Ij4KLQkgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5Db25uZWN0b3IiPgotCSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVKQkphciI+Ci0JICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiPgotCSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4gICAgICAgICAgICAJCSAgICAgICAJCQotICAgICAgICAgICAgCTwvb3I+Ci0JCQk8L3NlbGVjdGlvbkVuYWJsZW1lbnQ+Ci0gICAgICA8L21hc3Rlck9wZXJhdGlvbj4KLQk8L2V4dGVuc2lvbj4gICAKLQkKLQkKLQk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uYWRhcHRlckZhY3RvcnkiPgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJlamIueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgIDwhLS0gIDx2aWV3Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lm5hdmlnYXRvci51aS5XVFBDb21tb25OYXZpZ2F0b3IiPgotICAgICAgICAgPC92aWV3PiAtLT4KLSAgICAgICAgIDx2aWV3IAotICAgICAgICAgCSAgIGlkPSJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUFdvcmtpbmdTZXRDb21tb25OYXZpZ2F0b3IiPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5KMkVFV2ViSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJ3ZWJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICA8IS0tICA8dmlldwotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIj4KLSAgICAgICAgIDwvdmlldz4gLS0+Ci0gICAgICAgICAgPHZpZXcgCi0gICAgICAgICAJICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQV29ya2luZ1NldENvbW1vbk5hdmlnYXRvciI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0iYXBwbGljYXRpb24ueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgPCEtLSAgICA8dmlldwotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIj4KLSAgICAgICAgIDwvdmlldz4gLS0+Ci0gICAgICAgICAgPHZpZXcgCi0gICAgICAgICAJICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQV29ya2luZ1NldENvbW1vbk5hdmlnYXRvciI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9Im1vZHVsZW1hcC54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgPCEtLSA8dmlldwotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIj4KLSAgICAgICAgIDwvdmlldz4gLS0+Ci0gICAgICAgICAgPHZpZXcgCi0gICAgICAgICAJICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQV29ya2luZ1NldENvbW1vbk5hdmlnYXRvciI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICAKLQotICAgCi0gIAotPCEtLSBOYXZpZ2F0b3IgT2JqZWN0IENvbnRyaWJ1dGlvbnMgLS0+Ci08IS0tIEVBUiBHcm91cCBDb250cmlidXRpb25zIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLmdyb3Vwcy5OYXZpZ2F0b3JHcm91cCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuZWFyUHJvamVjdEFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVlYXIuZmlsZV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2Vhci5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnMuSW1wb3J0RUFSQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3IuaW1wb3J0Lm1lbnUvYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuaW1wb3J0RUFSQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVlYXIuZmlsZV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnMuRXhwb3J0RUFSQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3IuZXhwb3J0Lm1lbnUvYWRkaXRpb25zIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5uYXZpZ2F0b3IuZXhwb3J0RUFSQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIj4KLSAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci08IS0tIE5hdmlnYXRvciBPYmplY3QgQ29udHJpYnV0aW9ucyAtLT4KLTwhLS0gQXBwbGljYXRpb24gQ2xpZW50IEdyb3VwIENvbnRyaWJ1dGlvbnMKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5ncm91cHMuTmF2aWdhdG9yR3JvdXAiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubmF2aWdhdG9yLmFwcENsaWVudFByb2plY3RBY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlY2xpZW50Lmphci5maWxlX3VpXyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xpZW50LmFjdGlvbnMuSW1wb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci5pbXBvcnQubWVudS9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5pbXBvcnRBcHBDbGllbnRBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWNsaWVudC5qYXIuZmlsZV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2V4cG9ydC5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xpZW50LmFjdGlvbnMuRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci5leHBvcnQubWVudS9hZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLm5hdmlnYXRvci5leHBvcnRBcHBDbGllbnRBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAtLT4KLTwhLS0gTmF2aWdhdG9yIE9iamVjdCBDb250cmlidXRpb25zIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgREVQTE9ZIEVYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9ImphdmEubGFuZy5PYmplY3QiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLmRlcGxveSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWRlcGxveV91aV8iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvcmVfZXhlY3V0ZS5naWYiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5KMkVFRGVwbG95QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJkZXBsb3lBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphciI+Ci0gICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4iPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3IiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50Ij4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgIAotICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+IC0tPgotPCEtLSBOYXZpZ2F0b3IgT2JqZWN0IENvbnRyaWJ1dGlvbnMgLS0+Ci0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAKLTwhLS0gPT09PT09PT09PT0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY3lQYWdlIChDYXRlZ29yeSBQYWdlKT09PT09PT09PT09PSAtLT4KLSAgICAgIDxwYWdlCi0gICAgICAJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgIAkJbmFtZT0iJUoyRUVEZXBlbmRlbmNpZXNQYWdlLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiPgotICAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICAgPC9maWx0ZXI+ICAgICAgICAgICAgCi0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0IgotICAgICAgCQluYW1lPSIlSjJFRURlcGVuZGVuY2llc1BhZ2UubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci08IS0tID09PT09PT09PT09IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzPT09PT09PT09PT09IC0tPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIG5hbWU9IiVqYXIuZGVwZW5kZW5jaWVzLnByb3BzX3VpXyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UiCi0gICAgICAgICAgICBpZD0iSkFSRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICAgPC9maWx0ZXI+Ci0gICAgIAkgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiCi0gICAgICAgICAgICBuYW1lPSIlamFyLmRlcGVuZGVuY2llcy5wcm9wc191aV8iCi0gICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSIKLSAgICAgICAgICAgIGlkPSJKQVJEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZSI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvcGFnZT4KLTwhLS0gPT09PT09PT09PT0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlID09PT09PT09PT09PSAtLT4KLSAgICAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBuYW1lPSIld2VibGliLmRlcGVuZGVuY2llcy5wcm9wc191aV8iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IldlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSI+Ci0gICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgICAgICA8L2ZpbHRlcj4KLSAgICAgCSA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIKLSAgICAgICAgICAgIG5hbWU9IiV3ZWJsaWIuZGVwZW5kZW5jaWVzLnByb3BzX3VpXyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5XZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UiCi0gICAgICAgICAgICBpZD0iV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPgotICAJPC9leHRlbnNpb24+Ci08IS0tID09PT09PT09PT09IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlPT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotICAgICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIG5hbWU9IiVhZGRtb2R1bGVzdG9lYXIucHJvcHNfdWlfIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IkFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlIj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0IgotICAgICAgICAgICAgbmFtZT0iJWFkZG1vZHVsZXN0b2Vhci5wcm9wc191aV8iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRURlcGVuZGVuY2llc1BhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuQWRkTW9kdWxlc3RvRUFSUHJvcGVydGllc1BhZ2UiCi0gICAgICAgICAgICBpZD0iQWRkTW9kdWxlc3RvRUFSUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPiAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCSAgCi0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkoyRUVSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5KMkVFUmVuYW1lUGFydGljaXBhbnQiIAotCQkJCW5hbWU9IiVKMkVFX1JlbmFtZV9QYXJ0aWNpcGFudCI+IAotCQk8ZW5hYmxlbWVudD4gCi0JCSAgIAk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLSAgICAgICAgICAgIAk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPiAKLSAgICAgICAgICAgIAkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+ICAKLSAgICAgICAgICAgIAk8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICAgICA8d2l0aAotICAgICAgICAgICAgICAgdmFyaWFibGU9ImVsZW1lbnQiPgotICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+IAotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCTwvZXh0ZW5zaW9uPgotCQotPCEtLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCSAgCi0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkoyRUVDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5KMkVFQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQiIAotCQkJCW5hbWU9IkoyRUUgUmVuYW1lIFBhcnRpY2lwYW50Ij4gCi0JCTxlbmFibGVtZW50PiAKLQkJICAgCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotICAgICAgICAgICAgCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+IAotICAgICAgICAgICAgCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiIC8+ICAKLSAgICAgICAgICAgIAk8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICAgICA8d2l0aAotICAgICAgICAgICAgICAgICAgdmFyaWFibGU9ImVsZW1lbnQiPgotICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50Ij4KLSAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4gCi0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+IC0tPgotCQotICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgbmFtZT0iJWoyZWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N2aWV3MTYvajJlZV9wZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGVyc3BlY3RpdmUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L3BlcnNwZWN0aXZlPgotICAgPC9leHRlbnNpb24+CQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSIvPgotICAgICAgICAgPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiLz4KLSAgICAgICAgIDxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIi8+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgICAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLSAgICAgICAgIDxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4JCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci53b3JrYmVuY2guY29tbW9uV2l6YXJkIj4KLSAgICAgICAgICA8IS0tIEVBUiBOZXcgLS0+Ci0gICAgICAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4gCi0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCI+Ci0JICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgICA8b3I+Ci0JICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLQkgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotCSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0JICAgICAgICAgICAgICAgPC9vcj4gCi0gICAgICAgICAgICAgICAgPC9hbmQ+ICAgICAgCi0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvY29tbW9uV2l6YXJkPgotICAgICAgICA8IS0tIEFwcENsaWVudCBOZXcgLS0+Ci0gICAgICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiPgotCSAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0JICAgICAgICAgICAgICAgPG9yPgotCSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0JICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLQkgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotCSAgICAgICAgICAgICAgIDwvb3I+IAotICAgICAgICAgICAgICAgIDwvYW5kPiAKLSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgICAgICAgIDwhLS0gRUFSIEltcG9ydCAtLT4KLSAgICAgICAgPCEtLSAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLkVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4gCi0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCI+Ci0JICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgIAkgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLmdyb3Vwcy5OYXZpZ2F0b3JHcm91cCI+Ci0gICAgICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIAkgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgPC9hbmQ+CSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+IC0tPgotICAgICAgICAgICAgPCEtLSBBcHAgQ2xpZW50IEltcG9ydCAtLT4KLSAgICAgICAgPCEtLSAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLkFwcENsaWVudE1vZHVsZUltcG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4gCi0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCI+Ci0JICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgIAkgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLmdyb3Vwcy5OYXZpZ2F0b3JHcm91cCI+Ci0gICAgICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIAkgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgIDxvcj4KLQkgICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLQkgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotCSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotCSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0JICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLQkgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiPgotCSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0JICAgICAgICAgICAgICAgPC9vcj4gCi0gICAgICAgICAgICAgICAgPC9hbmQ+IAotICAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xpZW50LmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsIj4KLSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLmltcGwuQXBwbGljYXRpb25JbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgIAkgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uaW1wbC5Nb2R1bGVJbXBsIj4KLSAgICAgICAgICAgCSAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvY29tbW9uV2l6YXJkPiAtLT4KLSAgICAgICAgPCEtLSBVdGlsaXR5IEphciBJbXBvcnQgLS0+Ci0gICAgIDwhLS0gICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIiPgotCSAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIAkgPG9iamVjdENsYXNzCi0JICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLkVBUlByb2plY3RNYXBJbXBsIj4KLQkgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCI+Ci0JICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICA8L2FuZD4gICAgIAotICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uaW1wbC5BcHBsaWNhdGlvbkltcGwiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAJICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLmltcGwuTW9kdWxlSW1wbCI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPiAgICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+IC0tPgotICAgICAgIDwhLS0gRUFSIGV4cG9ydCAtLT4KLSAgICA8IS0tICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICAgdHlwZT0iZXhwb3J0IgotICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLkVudGVycHJpc2VBcHBsaWNhdGlvbkV4cG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4KLSAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLmdyb3Vwcy5OYXZpZ2F0b3JHcm91cCI+Ci0gICAgICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLQkgICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgPC9hbmQ+ICAgICAKLSAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXBwbGljYXRpb24uaW1wbC5BcHBsaWNhdGlvbkltcGwiPgotICAgICAgICAgICAJICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgCSAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAJICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLmltcGwuTW9kdWxlSW1wbCI+Ci0gICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPiAgICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+IC0tPgotICAgICAgICA8IS0tIEFwcCBDbGllbnQgZXhwb3J0IC0tPgotICAgIDwhLS0gICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgICB0eXBlPSJleHBvcnQiCi0gICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkuQXBwQ2xpZW50TW9kdWxlRXhwb3J0V2l6YXJkIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPgotICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwuZ3JvdXBzLk5hdmlnYXRvckdyb3VwIj4KLSAgICAgICAgICAgICAgIAkgICA8L29iamVjdENsYXNzPgotCSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotCSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkgICAgICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICAgIDwvYW5kPiAgCi0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGllbnQuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4gICAgICAgICAgCi0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgIDwvY29tbW9uV2l6YXJkPiAtLT4KLSAgICAgICA8IS0tIEltcG9ydCBDbGFzc2VzIFdpemFyZCAtLT4KLSAgICAgIDwhLS0gIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQ2xhc3Nlc0ltcG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDxvcj4KLSAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAJICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgICAgIDxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icHJvamVjdE5hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yTmF0dXJlIj4KLSAgICAgICAgICAgICAgICAgIDwvb2JqZWN0U3RhdGU+Ci0gICAgICAgICAgICAgICAgICA8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3ROYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSI+Ci0gICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgICAgICAgICAgPG9iamVjdFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiPgotICAgICAgICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICA8L2FuZD4gICAgIAotICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsaWVudC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCI+Ci0gICAgICAgICAgICA8L29iamVjdENsYXNzPiAJICAgICAgICAKLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9jb21tb25XaXphcmQ+IC0tPgotICAgPC9leHRlbnNpb24+Ci0gICAgCi0gICA8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iPgotCQk8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMiLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29udGV4dC5TZW5zaXRpdmUuQ2xhc3Mud29ya2luZ0NvcHlNYW5hZ2VyIgotICAgICAgICAgbmFtZT0iV29ya2luZyBDb3B5IE1hbmFnZXIgLSBVSSBDb250ZXh0IENsYXNzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAgY29udGV4dD0iVUkiCi0gICAgICAgICAgICBrZXk9IndvcmtpbmdDb3B5TWFuYWdlciIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24udWkuV1RQVUlXb3JraW5nQ29weU1hbmFnZXIiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4gCi0gICA8L2V4dGVuc2lvbj4gCi0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+Ci0gICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyLmVhcjEiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgIAotICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyLmVhcjIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICAKLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2ZXIuZWFyMyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgPC9leHRlbnNpb24+Ci0gICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmQiPgotCi0gICAgPHdpemFyZC1wYWdlcyBmYWNldD0idXRpbGl0eSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxpbnN0YWxsPgotICAgICAgICA8Y29uZmlnIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlGYWNldEluc3RhbGxDb25maWciLz4KLSAgICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UiLz4KLSAgICAgIDwvaW5zdGFsbD4KLSAgICA8L3dpemFyZC1wYWdlcz4KLQotICAgIDx3aXphcmQtcGFnZXMgZmFjZXQ9ImVhciIgdmVyc2lvbj0iMS4yIj4KLSAgICAgIDxpbnN0YWxsPgotICAgICAgICA8Y29uZmlnIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkVhckZhY2V0SW5zdGFsbENvbmZpZyIvPgotICAgICAgICA8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJGYWNldEluc3RhbGxQYWdlIi8+Ci0gICAgICA8L2luc3RhbGw+Ci0gICAgPC93aXphcmQtcGFnZXM+Ci0KLSAgICA8d2l6YXJkLXBhZ2VzIGZhY2V0PSJlYXIiIHZlcnNpb249IjEuMyI+Ci0gICAgICA8aW5zdGFsbD4KLSAgICAgICAgPGNvbmZpZyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldEluc3RhbGxDb25maWciLz4KLSAgICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyRmFjZXRJbnN0YWxsUGFnZSIvPgotICAgICAgPC9pbnN0YWxsPgotICAgIDwvd2l6YXJkLXBhZ2VzPgotCi0gICAgPHdpemFyZC1wYWdlcyBmYWNldD0iZWFyIiB2ZXJzaW9uPSIxLjQiPgotICAgICAgPGluc3RhbGw+Ci0gICAgICAgIDxjb25maWcgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRWFyRmFjZXRJbnN0YWxsQ29uZmlnIi8+Ci0gICAgICAgIDxwYWdlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhckZhY2V0SW5zdGFsbFBhZ2UiLz4KLSAgICAgIDwvaW5zdGFsbD4KLSAgICA8L3dpemFyZC1wYWdlcz4KLSAgICAKLSAgPC9leHRlbnNpb24+Ci0gIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAKLSAgICA8Y2F0ZWdvcnkKLSAgICAgIG5hbWU9IiVuZXctcHJvamVjdHMtd2l6YXJkLWNhdGVnb3J5LW5hbWUiCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0Lm5ld3Byb2plY3RzIj4KLSAgICA8L2NhdGVnb3J5PgotICAgIAotICAgIDx3aXphcmQKLSAgICAgIG5hbWU9IiV1dGlsLXByb2plY3Qtd2l6YXJkLW5hbWUiCi0gICAgICBpY29uPSJpY29ucy91dGlsLXdpei1pY29uLmdpZiIKLSAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QubmV3cHJvamVjdHMiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5VdGlsaXR5UHJvamVjdFdpemFyZCIKLSAgICAgIHByb2plY3Q9InRydWUiCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5VdGlsaXR5UHJvamVjdFdpemFyZCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+JXV0aWwtcHJvamVjdC13aXphcmQtZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICAgIDwvd2l6YXJkPgotCi0gICAgPHdpemFyZAotICAgICAgbmFtZT0iJWVhci1wcm9qZWN0LXdpemFyZC1uYW1lIgotICAgICAgaWNvbj0iaWNvbnMvZWFyLXdpei1pY29uLmdpZiIKLSAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QubmV3cHJvamVjdHMiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJQcm9qZWN0V2l6YXJkIgotICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhclByb2plY3RXaXphcmQiPgotICAgICAgPGRlc2NyaXB0aW9uPiVlYXItcHJvamVjdC13aXphcmQtZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICAgIDwvd2l6YXJkPgotCi0gICAgCi0gIDwvZXh0ZW5zaW9uPgotICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmZkYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmoyZWUudWkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9VdGlsaXR5RmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMxZTg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotcGFnZVRpdGxlID0gVXRpbGl0eSBNb2R1bGUKLXBhZ2VEZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB1dGlsaXR5IG1vZHVsZSBzZXR0aW5ncy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2VqYl9maWd1cmVzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2VqYl9maWd1cmVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTY2ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9lamJfZmlndXJlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUmVsYXRpb25zaGlwUG9seUxpbmVfVUlfMD1OYXZpZ2F0aW9uCi1SZWxhdGlvbnNoaXBQb2x5TGluZV9VSV8xPU5hdmlnYXRpb24KLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzI9Q21yIEZpZWxkIC8gRm9yZWlnbiBLZXkKLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzM9Q21yIEZpZWxkIC8gRm9yZWlnbiBLZXkKLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzQ9RWRpdCBsZWZ0IGVuZAotUmVsYXRpb25zaGlwUG9seUxpbmVfVUlfNT1FZGl0IHJpZ2h0Ci1SZWxhdGlvbnNoaXBQb2x5TGluZV9VSV82PUVkaXQgbGVmdCBlbmQKLVJlbGF0aW9uc2hpcFBvbHlMaW5lX1VJXzc9RWRpdCByaWdodCBlbmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvZWpiX3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2VqYl91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWM4NGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvZWpiX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0wPUZhaWxlZCB0byBmaW5kIHRoZSBpbWFnZSAiezB9Ii4KLTE9TmV3IEVKQiBQcm9qZWN0Ci0yPUVKQiB2ZXJzaW9uOgotMz1FSkIgUHJvamVjdAotND1DcmVhdGUgYW4gRUpCIHByb2plY3QgYW5kIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLgotNT1JbXBvcnQgYW4gRUpCIGphciBmcm9tIHRoZSBmaWxlIHN5c3RlbQotNj1FSkIgSmFyIEltcG9ydAotNz1FSkIgSmFyIGZpbGU6Ci04PUVKQiBtb2R1bGU6Ci05PUVKQiBKYXIgRXhwb3J0Ci0xMD1FeHBvcnQgRUpCIHByb2plY3QgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotMTE9RUpCIGNsaWVudCBKQVIgQ3JlYXRpb24KLTEyPVVzZSB0aGlzIHdpemFyZCB0byBjcmVhdGUgYW4gRUpCIGNsaWVudCBKQVIgZnJvbSB5b3VyIGV4aXN0aW5nIEVKQgotMTM9Q2xpZW50IEpBUiBVUkk6Ci0xND1Qcm9qZWN0IG5hbWU6Ci0xNT1Qcm9qZWN0IGxvY2F0aW9uOgotMTY9RUpCIE1vZHVsZToKLTE3PURlbGV0ZSBCZWFuIE9ubHkKLTE4PURlbGV0ZSBCZWFuIENsYXNzZXMKLTE5PURlbGV0ZSBBY2Nlc3MgQmVhbgotMjA9RGVsZXRlIERlcGxveWVkIENvZGUKLTIxPVNlbGVjdCBBbGwKLTIyPURlc2VsZWN0IEFsbAotMjM9VGhlIHNlbGVjdGVkIGVudGVycHJpc2UgYmVhbiBjYW5ub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGlzIGludm9sdmVkIGluXG5yZWxhdGlvbnNoaXBzIHdpdGggb3RoZXIgZW50ZXJwcmlzZSBiZWFucy4gIFlvdSBtdXN0IGZpcnN0IGRlbGV0ZSB0aGVzZVxucmVsYXRpb25zaGlwcyBiZWZvcmUgZGVsZXRpbmcgdGhlIGJlYW4uCi0yND1EZWxldGUuLi4KLTI1PUNhbm5vdCBkZWxldGUgRW50ZXJwcmlzZSBCZWFuCi0yNj1DYW5ub3QgZGVsZXRlIHRoZSBiZWFuIG5hbWVkICJ7MH0iIGJlY2F1c2UgaXQgaXMgaW4gYSBiaW5hcnkgcHJvamVjdC4KLTI3PURlbGV0ZSBFbnRlcnByaXNlIEJlYW4ocykKLTI4PVdoYXQgb3B0aW9ucyB3b3VsZCB5b3UgbGlrZSB3aGVuIGRlbGV0aW5nIHRoZSBzZWxlY3RlZFxuRW50ZXJwcmlzZSBCZWFuKHMpPwotR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8wPVNlc3Npb24KLUdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMT1FbnRpdHkKLUdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMj1NZXNzYWdlCi1OZXdFSkJQcm9qZWN0QWN0aW9uX1VJXzA9RUpCIE1vZHVsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qMmVlX2VqYl91aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qMmVlX2VqYl91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM1NjVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvajJlZV9lamJfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcl9VSV8wPVNlc3Npb24KLUdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMT1FbnRpdHkKLUdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXJfVUlfMj1NZXNzYWdlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvajJlZV91aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qMmVlX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjczNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qMmVlX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotMT1Qcm9qZWN0IGxvY2F0aW9uOgotMj1UYXJnZXQgcnVudGltZToKLTM9SjJFRSB2ZXJzaW9uOgotND1GYWlsZWQgdG8gZmluZCB0aGUgaW1hZ2UgInswfSIuCi01PU5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QKLTY9RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0Ci03PUNyZWF0ZSBhbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgY29udGFpbmluZyBvbmUgb3IgbW9yZSBtb2R1bGUgcHJvamVjdHMuCi04PUVBUiBNb2R1bGUgUHJvamVjdHMKLTk9U2VsZWN0IHRoZSBtb2R1bGUgcHJvamVjdHMgdG8gYWRkIHRvIHRoZSBuZXcgRUFSIHByb2plY3QgZnJvbSB0aGUgbGlzdC4gXG5TZWxlY3QgTmV3IE1vZHVsZSBidXR0b24gdG8gY3JlYXRlIGEgbmV3IG1vZHVsZSBwcm9qZWN0LgotMTA9JlNlbGVjdCBBbGwKLTExPSZEZXNlbGVjdCBBbGwKLTEyPU5ldyAmTW9kdWxlLi4uCi0xMz1FQVIgYXBwbGljYXRpb246Ci0xND1OJmV3Li4uCi0xNGE9TmUmdy4uLgotMTU9QWRkIG1vZHVsZSB0byBhbiBFQVIgYXBwbGljYXRpb24uCi0xNj1OZXcgTW9kdWxlIFByb2plY3QKLTE3PUNyZWF0ZSBhIG5ldyBtb2R1bGUgcHJvamVjdCBmb3IgdGhlIHNlbGVjdGVkIG1vZHVsZSB0eXBlCi0xOD1OZXcgTW9kdWxlIFByb2plY3QKLTE5PUNyZWF0ZSBkZWZhdWx0IG1vZHVsZSBwcm9qZWN0cy4KLTIwPUFwcGxpY2F0aW9uIENsaWVudCBtb2R1bGU6Ci0yMT1FSkIgbW9kdWxlOgotMjI9V2ViIG1vZHVsZToKLTIzPUNvbm5lY3RvciBtb2R1bGU6Ci0yND1OZXcgQXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLTI1PUFwcGxpY2F0aW9uIENsaWVudCBtb2R1bGUKLTI2PUNyZWF0ZSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCBhbmQgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdAotMjc9TW9kdWxlIERlcGVuZGVuY2llcwotMjg9U2VsZWN0IGRlcGVuZGVudCBKQVJzIGZvciB0aGUgbW9kdWxlIHdpdGhpbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LgotMjk9QXZhaWxhYmxlIGRlcGVuZGVudCBKQVJzOgotMzA9TWFuaWZlc3QgQ2xhc3MtUGF0aDoKLTMxPUpBUi9Nb2R1bGUKLTMyPVByb2plY3Q6Ci0zMz1OZXcKLTM0PUltcG9ydCBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCBmcm9tIHRoZSBmaWxlIFN5c3RlbQotMzU9QXBwbGljYXRpb24gQ2xpZW50IEltcG9ydAotMzY9QXBwbGljYXRpb24gQ2xpZW50IGZpbGU6Ci0zNz1BcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdDoKLTM4PUltcG9ydAotMzk9SW1wb3J0IGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBiYXNlZCBvbiBzZWxlY3RlZCByZXNvdXJjZXMuCi00MD1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIEltcG9ydAotNDE9RUFSIGZpbGU6Ci00Mj1PdmVyd3JpdGUgZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZy4KLTQzPVByb2plY3QgaW1wb3J0Ci00ND1PcHRpbWl6ZWQ6IG1ha2UgYmluYXJ5IHByb2plY3RzIGZvciBFSkIsIGNsaWVudCwgYW5kIHV0aWxpdHkgSkFScwotNDU9RXhwYW5kZWQ6IGV4dHJhY3QgcHJvamVjdCBjb250ZW50cyBmb3IgZGV2ZWxvcG1lbnQKLTQ2PUltcG9ydCBmb3IgcGFydGlhbCBFQVIgZGV2ZWxvcG1lbnQKLTQ3PVNlbGVjdCBBbGwKLTQ4PURlc2VsZWN0IEFsbAotNDk9VXRpbGl0eSBKQVJzIGFuZCB3ZWIgbGlicmFyaWVzCi01MD1TZWxlY3QgdGhlIHV0aWxpdHkgSkFScyBmcm9tIHRoZSBsaXN0IHRvIGJlIGltcG9ydGVkIGFzIHV0aWxpdHkgcHJvamVjdHMuIFVuc2VsZWN0ZWQgSkFScyB3aWxsIGJlIGltcG9ydGVkIGFzIFxudXRpbGl0eSBKQVJzIGluIHRoZSBFQVIuCi01MT1FbnRlciB0aGUgbmV3IHByb2plY3QgbmFtZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIGltcG9ydGVkIG1vZHVsZSBmaWxlIGJ5IHNlbGVjdGluZyB0aGUgc2Vjb25kIGNvbHVtbiBvZiB0aGUgdGFibGUgZm9yIGVkaXQuCi01Mj1FQVIgTW9kdWxlIGFuZCBVdGlsaXR5IEpBUiBQcm9qZWN0cwotNTM9UHJvamVjdCBsb2NhdGlvbnMKLTU0PVRoaXMgaXMgdGhlIHBhcmVudCBkaXJlY3RvcnkgZm9yIGFsbCByZWZlcmVuY2VkIHByb2plY3RzLiBBIHN1YmRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggcHJvamVjdC4KLTU1PU1vZHVsZSBSb290IExvY2F0aW9uOgotCi01Nz1TZWxlY3QgdGhlIGxvY2F0aW9uIGRpcmVjdG9yeQotNTg9TW9kdWxlcyBpbiBFQVIKLTU5PU5ldyBQcm9qZWN0IE5hbWUKLTYwPWZpbGVuYW1lcwotNjE9cHJvamVjdG5hbWVzCi02Mj1EZXN0aW5hdGlvbjoKLTYzPU92ZXJ3cml0ZSBleGlzdGluZyBmaWxlCi02ND1FeHBvcnQgc291cmNlIGZpbGVzCi02NT1BcHBsaWNhdGlvbiBDbGllbnQgRXhwb3J0Ci02Nj1FeHBvcnQgQXBwbGljYXRpb24gQ2xpZW50IHByb2plY3QgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotNjc9RXhwb3J0Ci02OD1FQVIgRXhwb3J0Ci02OT1FeHBvcnQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLTcwPUluY2x1ZGUgcHJvamVjdCBidWlsZCBwYXRocyBhbmQgbWV0YS1kYXRhIGZpbGVzCi03MT1JZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLCB0aGUgZXhwb3J0ZWQgRUFSIG1haW50YWlucyBwcm9qZWN0IG5hbWVzIGFuZCBleHRlcm5hbCBjbGFzc3BhdGggZGVwZW5kZW5jaWVzLCB3aGljaCBhcmUgdXNlZnVsIGZvciBsYXRlciBpbXBvcnRpbmcgdGhlIEVBUiBpbnRvIGJpbmFyeSBwcm9qZWN0cy4gSWYgeW91IHNlbGVjdCB0aGlzIG9wdGlvbiBhbmQgbGF0ZXIgaW1wb3J0IHRoZSBFQVIsIG9ubHkgYmluYXJ5IHByb2plY3RzIGFyZSBjcmVhdGVkLgotNzI9SW5jbHVkZQotNzQ9QWxsb3cgbmVzdGVkIHByb2plY3RzIG92ZXJ3cml0ZXMgKG1vZHVsZSBhbmQgdXRpbGl0eSBwcm9qZWN0cykKLTc1PURlbGV0ZSBwcm9qZWN0IG9uIG92ZXJ3cml0ZQotNzY9RUFSIHByb2plY3Q6Ci0KLSNtaWdyYXRpb24gc3RyaW5ncwotNzc9RXJyb3IKLTc4PUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkIHBlcmZvcm1pbmcgdGhlIHNlbGVjdGVkIGFjdGlvbi4KLTc5PUJpbmFyeSBQcm9qZWN0Ci04MD1UaGUgYWN0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHNlbGVjdGlvbiwgd2hpY2ggaXMgcGFydCBvZiBhIGJpbmFyeSBwcm9qZWN0LgotODE9SW5mb3JtYXRpb24KLTgyPVRoZSBjaG9zZW4gb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLgotCi05MD1DcmVhdGUgYW4gRUpCIENsaWVudCBKQVIgbW9kdWxlIHRvIGhvbGQgdGhlIGNsaWVudCBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzLgotOTE9R2VuZXJhdGUgYW4gYW5ub3RhdGVkIGJlYW4gY2xhc3MKLTkyPUFkZCBzdXBwb3J0IGZvciBhbm5vdGF0ZWQgSmF2YSBjbGFzc2VzCi05Mz1CJnJvd3NlLi4uCi05ND1OYSZtZToKLTk1PUNyZWF0ZSBhIGRlZmF1bHQgTWFpbiBjbGFzcwotOTY9Q3JlYXRlIGEgZGVmYXVsdCBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuCi05OD1HZW5lcmF0ZSBhbiBhbm5vdGF0ZWQgc2VydmxldCBjbGFzcwotCi05Nz1TZWxlY3QgdGhlIHV0aWxpdHkgSkFScyBmcm9tIHRoZSBsaXN0IHRvIGJlIGltcG9ydGVkIGFzIHV0aWxpdHkgcHJvamVjdHMgb3IgamFycy4KLTk5PU1vZHVsZSBOYW1lOgotMTAwPU1vZHVsZSBWZXJzaW9uOgotRW50aXR5X1VJXz1FbnRpdHkgQmVhbnMKLU1lc3NhZ2VfRHJpdmVuX0JlYW5zX1VJXz1NZXNzYWdlLURyaXZlbiBCZWFucwotU2Vzc2lvbl9CZWFuc19VSV89U2Vzc2lvbiBCZWFucwotRUpCX0NsYXNzX1VJXz1FSkIgQ2xhc3M6IHswfQotSG9tZV9JbnRlcmZhY2VfVUlfPUhvbWUgSW50ZXJmYWNlOiB7MH0KLVNlcnZpY2VfRW5kcG9pbnRfSW50ZXJmYWNlX1VJXz1TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTogezB9Ci1QcmltYXJ5X0tleV9DbGFzc19VSV89UHJpbWFyeSBLZXkgQ2xhc3M6IHswfQotUmVtb3RlX0ludGVyZmFjZV9VSV89UmVtb3RlIEludGVyZmFjZTogezB9Ci1Mb2NhbF9JbnRlcmZhY2VfVUlfPUxvY2FsIEludGVyZmFjZTogezB9Ci1Mb2NhbF9Ib21lX0ludGVyZmFjZV9VSV89TG9jYWwgSG9tZSBJbnRlcmZhY2U6IHswfQotRGVsZXRlX1VJXz1EZWxldGUuLi4KLVByb2plY3Rfc2hvdWxkX25vdF9iZV9udWxsXzFfRVhDXz1JV0FFMDAyMUUgUHJvamVjdCBzaG91bGQgbm90IGJlIG51bGwKLU5vbi1wcm9qZWN0X2luX3NlbGVjdGlvbl8yX0VYQ189SVdBRTAwMjJFIE5vbi1wcm9qZWN0IGluIHNlbGVjdGlvbgotUHJvYmxlbXNfT3BlbmluZ19FZGl0b3JfRVJST1JfPUlXQUUwMDUyRSBQcm9ibGVtcyBPcGVuaW5nIEVkaXRvci4KLVV0aWxpdHlfSkFSc19VSV89VXRpbGl0eSBKQVJzCi1EZWxldGVfMT1EZWxldGUuLi4KLURlbGV0ZV9zZWxlY3RlZF9wcm9qZWN0KHMpXzI9RGVsZXRlIHNlbGVjdGVkIHByb2plY3QocykKLVJlbW92ZV9tb2R1bGUocylfZnJvbV9hbGxfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfMz1SZW1vdmUgbW9kdWxlKHMpIGZyb20gYWxsIEVudGVycHJpc2UgQXBwbGljYXRpb25zCi1SZW1vdmVfbW9kdWxlKHMpX2Zyb21fYWxsX290aGVyX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzQ9UmVtb3ZlIG1vZHVsZShzKSBmcm9tIGFsbCBvdGhlciBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucwotUmVtb3ZlX21vZHVsZV9kZXBlbmRlbmNpZXNfcmVmZXJlbmNpbmdfc2VsZWN0ZWRfcHJvamVjdChzKV81PVJlbW92ZSBtb2R1bGUgZGVwZW5kZW5jaWVzIHJlZmVyZW5jaW5nIHNlbGVjdGVkIHByb2plY3QocykKLURlbGV0ZV9Nb2R1bGVfT3B0aW9uc182PURlbGV0ZSBNb2R1bGUgT3B0aW9ucwotRGVsZXRlX0VudGVycHJpc2VfQXBwbGljYXRpb25fT3B0aW9uc183PURlbGV0ZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIE9wdGlvbnMKLURlbGV0ZV9jb3VsZF9ub3RfYmVfY29tcGxldGVkXzg9RGVsZXRlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQKLURlbGV0ZV9lcnJvcl85PURlbGV0ZSBlcnJvcgotV2hhdF93b3VsZF95b3VfbGlrZV90b19kZWxldGVfXzEwPVdoYXQgd291bGQgeW91IGxpa2UgdG8gZGVsZXRlPwotRGVsZXRlX3NlbGVjdGVkX0VudGVycHJpc2VfQXBwbGljYXRpb25fcHJvamVjdChzKV9vbmx5XzExPURlbGV0ZSBzZWxlY3RlZCBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3Qocykgb25seQotQWxzb19kZWxldGVfbW9kdWxlX2FuZF91dGlsaXR5X0phdmFfcHJvamVjdHNfMTI9QWxzbyBkZWxldGUgbW9kdWxlIGFuZCB1dGlsaXR5IEphdmEgcHJvamVjdHMKLURlbGV0ZV9zZWxlY3RlZF9wcm9qZWN0KHMpX29ubHlfMTM9RGVsZXRlIHNlbGVjdGVkIHByb2plY3Qocykgb25seQotQWxzb19kZWxldGVfcmVmZXJlbmNlc190b19zZWxlY3RlZF9wcm9qZWN0KHMpXzE0PUFsc28gZGVsZXRlIHJlZmVyZW5jZXMgdG8gc2VsZWN0ZWQgcHJvamVjdChzKQotQ1VTVE9NX0RFTEVURV9NSVhfTUFUQ0hfVUlfPVRoZSBjdXN0b20gSjJFRSBkZWxldGUgb3B0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgdGhlIHNlbGVjdGVkIEoyRUUgcHJvamVjdHMuICBUaGUgc3RhbmRhcmQgZGVsZXRlIG9wdGlvbnMgd2lsbCBiZSB1c2VkLgotREVQTE9ZX0RJQUxPR19USVRMRT1KMkVFIERlcGxveW1lbnQKLURFUExPWV9FUlJPUl9URVhUPUlXQUUwMDAxRSBFcnJvcjoKLURFUExPWV9XQVJOSU5HX1RFWFQ9V2FybmluZzoKLURFUExPWV9JTkZPX1RFWFQ9SVdBRTAwMDJJIEluZm86Ci1ERVBMT1lfT0tfVEVYVD1PazoKLURFUExPWU1FTlRfSU5fUFJPR1JFU1M9RGVwbG95bWVudCBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuLi4KLURFUExPWV9TVUNDRVNTX1JFUE9SVD1EZXBsb3ltZW50IGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4KLURFUExPWV9XQVJOSU5HU19SRVBPUlQ9RGVwbG95bWVudCBmaW5pc2hlZCB3aXRoIHdhcm5pbmdzOyBzZWUgbG9nIGZpbGVzIGZvciBkZXRhaWxzLgotREVQTE9ZX0VSUk9SU19SRVBPUlQ9RGVwbG95bWVudCBmaW5pc2hlZCB3aXRoIGVycm9yczsgc2VlIGxvZyBmaWxlcyBmb3IgZGV0YWlscy4KLQotTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS5hcHBDbGllbnQ9QXBwbGljYXRpb24gQ2xpZW50Ci1OZXdNb2R1bGVTZWxlY3Rpb25QYWdlLmVqYj1FbnRlcnByaXNlIEphdmEgQmVhbgotTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS53ZWI9V2ViCi1OZXdNb2R1bGVTZWxlY3Rpb25QYWdlLmpjYT1Db25uZWN0b3IKLQotTmV3QXBwbENsaWVudE1vZHVsZUFjdGlvbl9VSV8wPUFwcGxpY2F0aW9uIENsaWVudCBNb2R1bGUKLU5ld0VBUk1vZHVsZUFjdGlvbl9VSV8wPUVBUiBNb2R1bGUKLUoyRUVQcm9qZWN0Q3JlYXRpb25QYWdlX1VJXzA9SGlkZSAmQWR2YW5jZWQgPDwKLUoyRUVQcm9qZWN0Q3JlYXRpb25QYWdlX1VJXzE9U2hvdyAmQWR2YW5jZWQgPj4KLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8wPVV0aWxpdHkgSmFyIEltcG9ydAotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzE9SW1wb3J0IGRlcGVuZGVudCBVdGlsaXR5IEphcnMgZm9yIEoyRUUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8yPUF2YWlsYWJsZSBVdGlsaXR5IEphcnMgRGlyZWN0b3J5Ci1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMz1FeHRlcm5hbCBKYXIgRGlyZWN0b3J5OgotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzQ9TGlua2VkIFBhdGggVmFyaWFibGUKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV81PU1ha2UgdGhlc2UgaW1wb3J0ZWQgZmlsZXMgdGVhbS1zaGFyZWFibGUgYnkgY3JlYXRpbmcgb3IgcmUtdXNpbmcgYSBMaW5rZWQgUGF0aCBWYXJpYWJsZSAoTFBWKS4gU2VsZWN0IGFuIGV4aXN0aW5nIExQViBvciB0eXBlIGEgbmV3IG5hbWUgdG8gY3JlYXRlIG9uZSB0byB0aGUgZGlyZWN0b3J5IGFib3ZlLiBPdGhlciB0ZWFtbWF0ZXMgc2hvdWxkIGRlZmluZSB0aGlzIHZhbHVlIHRocm91Z2ggV2luZG93ID4gUHJlZmVyZW5jZXMgfCBXb3JrYmVuY2ggPiBMaW5rZWQgUmVzb3VyY2VzLiBUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgbGlua2VkIGltcG9ydHMuCi1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNj1PdmVyd3JpdGUgRXhpc3RpbmcgUmVzb3VyY2VzIChwcm9qZWN0cyBhbmQgYXJjaGl2ZXMpCi1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNz1TZWxlY3QgVXRpbGl0eSBKYXI6Ci1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2UuMD1Vc2UgRXhpc3RpbmcgTGlua2VkIFBhdGggVmFyaWFibGUKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZS4xPUxpbmtlZCBQYXRoIFZhcmlhYmxlOiAKLUVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8wPWluY2x1ZGUKLUVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8xPWZpbGUKLUVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8yPXByb2plY3QKLUVBUkltcG9ydFByb2plY3RzUGFnZV9VSV8zPVNlbGVjdCBOZXcKLQotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8wPVV0aWxpdHkgSmFyIEltcG9ydAotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8xPUltcG9ydCBkZXBlbmRlbnQgVXRpbGl0eSBKYXJzIGZvciBKMkVFIEVudGVycHJpc2UgQXBwbGljYXRpb25zCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzI9U2VsZWN0IGltcG9ydCB0eXBlCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzM9Q3JlYXRlIEphdmEgUHJvamVjdHMgZnJvbSBVdGlsaXR5IEphcnMKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfND1DcmVhdGUgbGlua2VkIEphdmEgUHJvamVjdHMgZnJvbSBVdGlsaXR5IEphcnMKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNT1Db3B5IFV0aWxpdHkgSmFycyBpbnRvIGFuIGV4aXN0aW5nIEVBUiBmcm9tIGFuIGV4dGVybmFsIGxvY2F0aW9uCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzY9Q3JlYXRlIExpbmtlZCBVdGlsaXR5IEphcnMgaW4gYW4gZXhpc3RpbmcgRUFSIGZyb20gYW4gZXh0ZXJuYWwgbG9jYXRpb24KLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNz1Qcm9qZWN0IGltcG9ydCBvcHRpb25zCi1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzg9U2VsZWN0IEVBUiBQcm9qZWN0Ci1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzk9RUFSIFByb2plY3Q6Ci1KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzEwPUNyZWF0ZSBCaW5hcnkgUHJvamVjdHMKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMTE9T3ZlcnJpZGUgUHJvamVjdCBSb290IChTcGVjaWZ5IGxvY2F0aW9uIGJlbG93KQotCi1EZXBsb3ltZW50X0Rlc2NyaXB0b3JfVUlfPURlcGxveW1lbnQgRGVzY3JpcHRvcgotCi1SZW5hbWVfMT1SZW5hbWUKLVJlbmFtZV9zZWxlY3RlZF9wcm9qZWN0XzI9UmVuYW1lIHNlbGVjdGVkIHByb2plY3QKLVJlbmFtZV9tb2R1bGVfaW5fYWxsX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzM9UmVuYW1lIG1vZHVsZSBpbiBhbGwgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLVJlbmFtZV9tb2R1bGVfaW5fYWxsX290aGVyX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzQ9UmVuYW1lIG1vZHVsZSBpbiBhbGwgb3RoZXIgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLVJlbmFtZV9tb2R1bGVfZGVwZW5kZW5jaWVzX3JlZmVyZW5jaW5nX3NlbGVjdGVkX3Byb2plY3RfNT1SZW5hbWUgbW9kdWxlIGRlcGVuZGVuY2llcyByZWZlcmVuY2luZyBzZWxlY3RlZCBwcm9qZWN0Ci1SZW5hbWVfTW9kdWxlX09wdGlvbnNfNj1SZW5hbWUgTW9kdWxlIE9wdGlvbnMKLVJlbmFtZV9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX09wdGlvbnNfNz1SZW5hbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBPcHRpb25zCi1SZW5hbWVfY291bGRfbm90X2JlX2NvbXBsZXRlZF84PVJlbmFtZSBjb3VsZCBub3QgYmUgY29tcGxldGVkCi1SZW5hbWVfZXJyb3JfOT1SZW5hbWUgZXJyb3IKLVdoYXRfd291bGRfeW91X2xpa2VfdG9fcmVuYW1lX3RoaXNfdG9fXzEwPVdoYXQgd291bGQgeW91IGxpa2UgdG8gcmVuYW1lIHRoaXMgdG8/Ci1Db250ZXh0X1Jvb3RfXzExPUNvbnRleHQgcm9vdDoKLVJlbmFtZV9zZWxlY3RlZF9FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3Rfb25seV8xMj1SZW5hbWUgc2VsZWN0ZWQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IG9ubHkKLUFsc29fcmVuYW1lX21vZHVsZV9hbmRfdXRpbGl0eV9KYXZhX3Byb2plY3RzXzEzPUFsc28gcmVuYW1lIG1vZHVsZSBhbmQgdXRpbGl0eSBKYXZhIHByb2plY3RzCi1Qcm9qZWN0X2FscmVhZHlfZXhpc3RzLj1Qcm9qZWN0IHswfSBhbHJlYWR5IGV4aXN0cy4KLVByb2plY3Rfc2hvdWxkX25vdF9iZV9udWxsXzFfRVhDXz1JV0FFMDAyMUUgUHJvamVjdCBzaG91bGQgbm90IGJlIG51bGwKLU5vbi1wcm9qZWN0X2luX3NlbGVjdGlvbl8yX0VSUk9SXz1JV0FFMDAyNEUgTm9uLXByb2plY3QgaW4gc2VsZWN0aW9uCi0KLQotRVJST1JfT0NDVVJSRURfVElUTEU9RXJyb3IKLUVSUk9SX09DQ1VSUkVEX01FU1NBR0U9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgcGVyZm9ybWluZyB0aGUgc2VsZWN0ZWQgYWN0aW9uLgotCi1JbXBvcnRfQ2xhc3NfRmlsZXNfVUk9SW1wb3J0Ci1GaWxlSW1wb3J0LnNlbGVjdFNvdXJjZT1TZWxlY3QgYSBkaXJlY3RvcnkgdG8gaW1wb3J0IGZyb20uCi1JbXBvcnRfQ2xhc3Nlcz1JbXBvcnQgQ2xhc3MgRmlsZXMuLi4KLUNsYXNzZXNJbXBvcnQuZnJvbURpcj1JbXBvcnQgZnJvbSBEaXJlY3RvcnkKLUNsYXNzZXNJbXBvcnQuZnJvbVppcD1JbXBvcnQgZnJvbSBaaXAgb3IgSmFyCi1EYXRhVHJhbnNmZXIuYnJvd3NlPUJyb3dzZS4uLgotRGF0YVRyYW5zZmVyLmRpcmVjdG9yeT1Tb3VyY2U6Ci1EYXRhVHJhbnNmZXIuZmlsZVN5c3RlbVRpdGxlPUltcG9ydCBDbGFzcyBGaWxlcwotRmlsZUltcG9ydC5pbXBvcnRGaWxlU3lzdGVtPUltcG9ydCBjbGFzcyBmaWxlcyBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLUZpbGVJbXBvcnQuc291cmNlRW1wdHk9U291cmNlIG11c3Qgbm90IGJlIGVtcHR5LgotRmlsZUltcG9ydC5vdmVyd3JpdGVFeGlzdGluZz1PdmVyd3JpdGUgZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZwotRGF0YVRyYW5zZmVyLnNlbGVjdEFsbD1TZWxlY3QgQWxsCi1EYXRhVHJhbnNmZXIuZGVzZWxlY3RBbGw9RGVzZWxlY3QgQWxsCi1JbXBvcnRfQ2xhc3NfRmlsZXNfVUk9SW1wb3J0Ci1GaWxlSW1wb3J0LnNlbGVjdFNvdXJjZT1TZWxlY3QgYSBkaXJlY3RvcnkgdG8gaW1wb3J0IGZyb20uCi1JbmNvbnNpc3RlbnRfRmlsZXNfMz1JbmNvbnNpc3RlbnQgRmlsZXMKLVRoZV9mb2xsb3dpbmdfd29ya3NwYWNlX2ZpbGVzX2FyZV9pbmNvbnNpc3RlbnRfd2l0aF90aGVfZWRpdG9yXzQ9VGhlIGZvbGxvd2luZyB3b3Jrc3BhY2UgZmlsZXMgYXJlIGluY29uc2lzdGVudCB3aXRoIHRoZSBlZGl0b3I6IFxuCi1VcGRhdGVfdGhlX2VkaXRvcl93aXRoX3RoZV93b3Jrc3BhY2VfY29udGVudHNfXzU9VXBkYXRlIHRoZSBlZGl0b3Igd2l0aCB0aGUgd29ya3NwYWNlIGNvbnRlbnRzPwotRXJyb3JfY2hlY2tpbmdfb3V0X2ZpbGVzXzEwPUVycm9yIGNoZWNraW5nIG91dCBmaWxlcwotSW5jb25zaXN0ZW50X2ZpbGVzX2RldGVjdGVkXzExPUluY29uc2lzdGVudCBmaWxlcyBkZXRlY3RlZAotTW9kdWxlc19VSV89TW9kdWxlcwotVXRpbGl0eV9KYXZhX1Byb2plY3RzX1VJXz1Qcm9qZWN0IFV0aWxpdHkgSkFScwotVGhlX2ZvbGxvd2luZ19maWxlc19hcmVfaW5jb25zaXN0ZW50X3dpdGhfdGhlX2ZpbGVfc3lzdGVtLl9Eb195b3Vfd2FudF90b19zYXZlX2FuZF9vdmVyd3JpdGVfdGhlc2VfZmlsZXNfb25fdGhlX2ZpbGVfc3lzdGVtX18xMl9XQVJOXz1JV0FFMDAyMFcgVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgaW5jb25zaXN0ZW50IHdpdGggdGhlIGZpbGUgc3lzdGVtLlxuRG8geW91IHdhbnQgdG8gc2F2ZSBhbmQgb3ZlcndyaXRlIHRoZXNlIGZpbGVzIG9uIHRoZSBmaWxlIHN5c3RlbT8KLUoyRUVfTGV2ZWw9SjJFRSBMZXZlbDoKLUoyRUVfMTI9MS4yCi1KMkVFXzEzPTEuMwotSjJFRV8xND0xLjQKLUoyRUVfMTJfREVTQ1JJUFRJT049SjJFRSAxLjIgaW5jbHVkZXMgU2VydmxldCBTcGVjaWZpY2F0aW9uIGxldmVsIDIuMiwgSlNQIFNwZWNpZmljYXRpb24gbGV2ZWwgMS4xLCBhbmQgRUpCIFNwZWNpZmljYXRpb24gbGV2ZWwgMS4xLgotSjJFRV8xM19ERVNDUklQVElPTj1KMkVFIDEuMyBpbmNsdWRlcyBDb25uZWN0b3IgQXJjaGl0ZWN0dXJlIFNwZWNpZmljYXRpb24gbGV2ZWwgMS4wLCBTZXJ2bGV0IFNwZWNpZmljYXRpb24gbGV2ZWwgMi4zLCBKU1AgU3BlY2lmaWNhdGlvbiBsZXZlbCAxLjIsIGFuZCBFSkIgU3BlY2lmaWNhdGlvbiBsZXZlbCAyLjAuCi1KMkVFXzE0X0RFU0NSSVBUSU9OPUoyRUUgMS40IGluY2x1ZGVzIENvbm5lY3RvciBBcmNoaXRlY3R1cmUgU3BlY2lmaWNhdGlvbiBsZXZlbCAxLjUsIFNlcnZsZXQgU3BlY2lmaWNhdGlvbiBsZXZlbCAyLjQsIEpTUCBTcGVjaWZpY2F0aW9uIGxldmVsIDEuMywgYW5kIEVKQiBTcGVjaWZpY2F0aW9uIGxldmVsIDIuMS4KLUVKQl9MRVZFTD1FSkIgTGV2ZWw6Ci1FSkJfMTE9MS4xCi1FSkJfMjA9Mi4wCi1FSkJfMjE9Mi4xCi1FSkJfMTFfREVTQ1JJUFRJT049RUpCIDEuMSBpbmNsdWRlcyBTZXNzaW9uIEJlYW5zLCBCTVAgQmVhbnMgYW5kIENNUCAxLjEgQmVhbnMuICBFSkIgMS4xIG1vZHVsZXMgbWF5IGJlIGluY2x1ZGVkIGluIGVpdGhlciBKMkVFIDEuMiBvciBKMkVFIDEuMyBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucy4KLUVKQl8yMF9ERVNDUklQVElPTj1FSkIgMi4wIGluY2x1ZGVzIE1lc3NhZ2UtRHJpdmVuIEJlYW5zLCBCTVAgQmVhbnMsIGFuZCBDTVAgMS4xIGFuZCBDTVAgMi4wIEJlYW5zLiAgRUpCIDIuMCBtb2R1bGVzIG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEoyRUUgMS4zIEVudGVycHJpc2UgQXBwbGljYXRpb25zLgotRUpCXzIxX0RFU0NSSVBUSU9OPUVKQiAyLjEgaW5jbHVkZXMgTWVzc2FnZS1Ecml2ZW4gQmVhbnMsIEJNUCBCZWFucywgYW5kIENNUCAxLjEgYW5kIENNUCAyLjAgQmVhbnMuICBFSkIgMi4xIG1vZHVsZXMgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gSjJFRSAxLjQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMuCi1XRUJfTEVWRUw9V2ViIExldmVsOgotV0VCXzIyPTIuMgotV0VCXzIzPTIuMwotV0VCXzI0PTIuNAotV0VCXzIyX0RFU0NSSVBUSU9OPVdlYiAyLjIgaW5jbHVkZXMgU2VydmxldCBzcGVjaWZpY2F0aW9uIDIuMiBhbmQgSlNQIHNwZWNpZmljYXRpb24gMS4xLgotV0VCXzIzX0RFU0NSSVBUSU9OPVdlYiAyLjMgaW5jbHVkZXMgU2VydmxldCBzcGVjaWZpY2F0aW9uIDIuMyBhbmQgSlNQIHNwZWNpZmljYXRpb24gMS4yLgotV0VCXzI0X0RFU0NSSVBUSU9OPVdlYiAyLjQgaW5jbHVkZXMgU2VydmxldCBzcGVjaWZpY2F0aW9uIDIuNCBhbmQgSlNQIHNwZWNpZmljYXRpb24gMi4wLgotQVBQX0NMSUVOVF9MRVZFTD1BcHBsaWNhdGlvbiBDbGllbnQgTGV2ZWw6Ci1BUFBfQ0xJRU5UXzEyX0RFU0NSSVBUSU9OPUFwcGxpY2F0aW9uIDEuMiBpbmNsdWRlcyB0aGUgQXBwbGNpYXRpb24gY2xpZW50IHNwZWNpZmljYXRpb24gbGV2ZWwgMS4yLgotQVBQX0NMSUVOVF8xM19ERVNDUklQVElPTj1BcHBsaWNhdGlvbiAxLjMgaW5jbHVkZXMgdGhlIEFwcGxjaWF0aW9uIGNsaWVudCBzcGVjaWZpY2F0aW9uIGxldmVsIDEuMy4KLUFQUF9DTElFTlRfMTRfREVTQ1JJUFRJT049QXBwbGljYXRpb24gMS40IGluY2x1ZGVzIHRoZSBBcHBsY2lhdGlvbiBjbGllbnQgc3BlY2lmaWNhdGlvbiBsZXZlbCAxLjQuCi1DT05ORUNUT1JfTEVWRUw9Q29ubmVjdG9yIEFyY2hpdGVjdHVyZSBMZXZlbDoKLUNPTk5FQ1RPUl8xMD0xLjAKLUNPTk5FQ1RPUl8xNT0xLjUKLUNPTk5FQ1RPUl8xMF9ERVNDUklQVElPTj1Db25uZWN0b3IgQXJjaGl0ZWN0dXJlIDEuMCBtb2R1bGVzIG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEoyRUUgMS4zIEVudGVycHJpc2UgQXBwbGljYXRpb25zLgotQ09OTkVDVE9SXzE1X0RFU0NSSVBUSU9OPUNvbm5lY3RvciBBcmNoaXRlY3R1cmUgMS41IG1vZHVsZXMgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gSjJFRSAxLjQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMuCi1ERVNDUklQVElPTj1EZXNjcmlwdGlvbjoKLVdFQl9DT05URVhUX1JPT1Q9Q29udGV4dCBSb290OgotV0VCX0NPTlRFTlRfRk9MREVSX05BTUU9V2ViIGNvbnRlbnQgZm9sZGVyIG5hbWU6Ci1GaWxlSW1wb3J0LmludmFsaWRTb3VyY2UgPSBTb3VyY2UgZGlyZWN0b3J5IGlzIG5vdCB2YWxpZCBvciBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLgotRmlsZUltcG9ydC5pbXBvcnRQcm9ibGVtcyA9IEltcG9ydCBQcm9ibGVtcwotRGF0YVRyYW5zZmVyLmluZm9ybWF0aW9uID0gSW5mb3JtYXRpb24KLUZpbGVJbXBvcnQubm9uZVNlbGVjdGVkID0gVGhlcmUgYXJlIG5vIHJlc291cmNlcyBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIGltcG9ydC4KLUZpbGVfU2VsZWN0aW9uX1VJXz1GaWxlIFNlbGVjdGlvbgotU2VsZWN0X2FfZmlsZV9fVUlfPVNlbGVjdCBhIGZpbGU6Ci1GbGV4aWJsZV9TdHJ1Y3R1cmU9VXNlIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlCi1GbGV4aWJsZVByb2plY3RDcmVhdGlvbldpemFyZC5tYWluUGFnZS50aXRsZT1KMkVFIFByb2plY3QKLUZsZXhpYmxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2M9Q3JlYXRlIGEgSjJFRSBwcm9qZWN0LgotRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmQudGl0bGU9SjJFRSBQcm9qZWN0Ci1FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC50aXRsZT1OZXcgRUFSIEFwcGxpY2F0aW9uIFByb2plY3QKLUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLnRpdGxlPUVBUiBBcHBsaWNhdGlvbiBQcm9qZWN0Ci1FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5tYWluUGFnZS5kZXNjPUNyZWF0ZSBhIEVBUiBhcHBsaWNhdGlvbi4KLUVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnNlY29uZFBhZ2UudGl0bGU9SjJFRSBNb2R1bGVzIHRvIEFkZCB0byB0aGUgRUFSCi1FQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5zZWNvbmRQYWdlLmRlc2M9U2VsZWN0IHRoZSBKMkVFIG1vZHVsZXMgdG8gYWRkIHRvIHRoZSBuZXcgRUFSIGFwcGxpY2F0aW9uIGZyb20gdGhlIGxpc3QuIFxuU2VsZWN0IE5ldyBNb2R1bGUgYnV0dG9uIHRvIGNyZWF0ZSBhIG5ldyBKMkVFIG1vZHVsZS4KLUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlPU5ldyBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdAotQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UudGl0bGU9QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2M9Q3JlYXRlIGEgQXBwbGljYXRpb24gQ2xpZW50LgotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC50aXRsZT1DcmVhdGUgZGVmYXVsdCBKMkVFIG1vZHVsZXMuCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UudGl0bGU9TmV3IEoyRUUgTW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuZGVzYz1DcmVhdGUgYSBuZXcgSjJFRSBtb2R1bGUgZm9yIHRoZSBzZWxlY3RlZCBtb2R1bGUgdHlwZQotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmVqYj1FSkIgbW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwud2ViPVdlYiBtb2R1bGUKLURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5sYWJlbC5qY2E9Q29ubmVjdG9yIG1vZHVsZQotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmFwcGNsaWVudD1BcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuYnV0dG9uLnNlbGVjdD1DcmVhdGUgZGVmYXVsdCBtb2R1bGVzCi0KLUZPTERFUl9MQUJFTD1Gb2xkZXI6Ci1CUk9XU0VfQlVUVE9OX0xBQkVMPUJyb3dzZS4uLgotSkFWQV9QQUNLQUdFX0xBQkVMPUphdmEgcGFja2FnZToKLUNMQVNTX05BTUVfTEFCRUw9Q2xhc3MgbmFtZToKLVNVUEVSQ0xBU1NfTEFCRUw9U3VwZXJjbGFzczoKLUNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFPUNvbnRhaW5lciBTZWxlY3Rpb24KLUNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgQ29udGFpbmVyOgotQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0c9Q2hvb3NlIGEgdmFsaWQgamF2YSBzb3VyY2UgZm9sZGVyIGZvciB0aGUgc2VsZWN0ZWQgbW9kdWxlLgotUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFPVBhY2thZ2UgU2VsZWN0aW9uCi1QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgYSBwYWNrYWdlOgotUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FPU5vIHBhY2thZ2VzIHRvIGNob29zZSBmcm9tCi1TVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9U3VwZXJjbGFzcyBTZWxlY3Rpb24KLVNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19ERVNDPUNob29zZSBhIHN1cGVyY2xhc3M6Ci1KQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTD1Nb2RpZmllcnM6Ci1KQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTD1QdWJsaWMKLUpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUw9QWJzdHJhY3QKLUpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUw9RmluYWwKLUpBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTD1JbnRlcmZhY2VzOgotSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUw9V2hpY2ggbWV0aG9kIHN0dWJzIHdvdWxkIHlvdSBsaWtlIHRvIGNyZWF0ZT8KLUpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTD1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTD1Db25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzCi1KQVZBX0NMQVNTX0lOSEVSSVRfQ0hFQ0tCT1hfTEFCRUw9SW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMKLUFERF9CVVRUT05fTEFCRUw9QWRkLi4uCi1SRU1PVkVfQlVUVE9OPVJlbW92ZQotSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9SW50ZXJmYWNlIFNlbGVjdGlvbgotSkFWQVVUSUxJVFlfTUFJTl9QR19USVRMRT1KYXZhIENvbXBvbmVudAotSkFWQVVUSUxJVFlfTUFJTl9QR19ERVNDPUNyZWF0ZSBhIEphdmEgQ29tcG9uZW50Ci1KQVZBVVRJTF9DT01QT05FTlRfV0laX1RJVExFPU5ldyBKYXZhIENvbXBvbmVudCBNb2R1bGUKLUFWQUlMQUJMRV9KMkVFX0NPTVBPTkVOVFM9IEF2YWlsYWJsZSBKMkVFIG1vZHVsZXMKLUVYVEVSTkFMX0pBUj1BZGQgRXh0ZXJuYWwgSmFycy4uLgotQUREVkFSSUFCTEU9QWRkIFZhcmlhYmxlLi4uCi1TVVBQT1JUTVVMVElQTEVNT0RVTEVTPVN1cHBvcnQgTXVsdGlwbGUgTW9kdWxlcyBwZXIgcHJvamVjdAotU09VUkNFRk9MREVSPVNvdXJjZSBGb2xkZXI6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvamNhX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTRhYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLTA9RmFpbGVkIHRvIGZpbmQgdGhlIGltYWdlICJ7MH0iLgotMT1OZXcgQ29ubmVjdG9yIFByb2plY3QKLTI9SkNBIHZlcnNpb246Ci0zPUNvbm5lY3RvciBQcm9qZWN0Ci00PUNyZWF0ZSBhIHN0YW5kYWxvbmUgQ29ubmVjdG9yIHByb2plY3Qgb3IgYWRkIGl0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4KLTU9SW1wb3J0IGEgQ29ubmVjdG9yIG1vZHVsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbQotNj1Db25uZWN0b3IgSW1wb3J0Ci03PUNvbm5lY3RvciBmaWxlOgotOD1Db25uZWN0b3IgbW9kdWxlOgotOT1Db25uZWN0b3IgRXhwb3J0Ci0xMD1FeHBvcnQgQ29ubmVjdG9yIG1vZHVsZSB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21hbmlmZXN0X3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21hbmlmZXN0X3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Y2Q3ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9tYW5pZmVzdF91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotVXBfMT0mVXAKLURvd25fMj0mRG93bgotU2VsZWN0X0FsbF8zPVNlbGVjdCAmQWxsCi1EZXNlbGVjdF9BbGxfND1EJmVzZWxlY3QgQWxsCi1FUlJPUl9SRUFESU5HX01BTklGRVNUX0RJQUxPR19USVRMRT1FcnJvciBSZWFkaW5nIE1hbmlmZXN0Ci1TQVZFX01BTklGRVNUX1dJVEhfRVJST1I9VGhlIG1hbmlmZXN0IGZpbGUgY29udGFpbnMgZXJyb3JzIGFuZCBjYW4gbm90IGJlIHBhcnNlZC4gIFRoZSBmaWxlIHdpbGwgYmUgc2F2ZWQgYnV0IHRoZSBKYXZhIGJ1aWxkIHBhdGggd2lsbCBub3QgYmUgdXBkYXRlZC4gIEZvbGxvd2luZyBhcmUgY29tbW9uIGxpbWl0YXRpb25zIHdoaWNoIGNhbiBjYXVzZSBwcm9ibGVtczoKLUVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfRURJVE9SPVRoZSBtYW5pZmVzdCBmaWxlIGNvbnRhaW5zIGVycm9ycyBhbmQgY2FuIG5vdCBiZSBwYXJzZWQuICBPdGhlciBwYWdlcyBjYW5ub3QgYmUgdXNlZCB1bnRpbCB0aGVzZSBlcnJvcnMgYXJlIGNvcnJlY3RlZC4gIEZvbGxvd2luZyBhcmUgY29tbW9uIGxpbWl0YXRpb25zIHdoaWNoIGNhbiBjYXVzZSBwcm9ibGVtczoKLUVSUk9SX1JFQURJTkdfTUFOSUZFU1RfRElBTE9HX01FU1NBR0VfUFJPUF9QQUdFPVRoZSBtYW5pZmVzdCBmaWxlIGNvbnRhaW5zIGVycm9ycyBhbmQgY2FuIG5vdCBiZSBwYXJzZWQuICBGb2xsb3dpbmcgYXJlIGNvbW1vbiBsaW1pdGF0aW9ucyB3aGljaCBjYW4gY2F1c2UgcHJvYmxlbXM6Ci1NQU5JRkVTVF9QUk9CTEVNXzE9KiBMaW5lcyBpbiB0aGUgZmlsZSBtdXN0IGJlIG5vIGdyZWF0ZXIgdGhhbiA3MiBieXRlcy4gQ29udGludWF0aW9uIG9mIGxvbmcgbGluZXMgaXMgaW5kaWNhdGVkIGJ5IGEgbmV3IGxpbmUgYW5kIGEgc3BhY2UuCi1NQU5JRkVTVF9QUk9CTEVNXzI9KiBUaGUgbGFzdCBsaW5lIGluIHRoZSBmaWxlIG11c3QgZW5kIHdpdGggYSBuZXcgbGluZSBvciBpdCB3aWxsIG5vdCBiZSBwYXJzZWQuCi1NQU5JRkVTVF9QUk9CTEVNXzM9KiBCbGFuayBsaW5lcyB3aXRoIGV4dHJhIHdoaXRlIHNwYWNlIG1heSBjYXVzZSBwYXJzZSB0byBmYWlsLgotTUFOSUZFU1RfUFJPQkxFTV80PSogVGhlIGF0dHJpYnV0ZXMgbXVzdCBiZSBmb3JtYXR0ZWQgY29ycmVjdGx5LiAgUmVmZXIgdG8gdGhlIG1hbmlmZXN0IGFuZCBKQVIgZmlsZSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgotQW5faW50ZXJuYWxfZXJyb3Jfb2NjdXJyZWRfRVJST1JfPUlXQUUwMDEwRSBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZDoKLVByb2plY3RfbmFtZV9fVUlfPVByb2plY3QgbmFtZToKLUVBUl9Qcm9qZWN0X05hbWVfX1VJX19VSV89RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IG5hbWU6Ci1BdmFpbGFibGVfZGVwZW5kZW50X0pBUnNfX1VJXz1BdmFpbGFibGUgZGVwZW5kZW50IEpBUnM6Ci1NYW5pZmVzdF9DbGFzcy1QYXRoX19VSV89TWFuaWZlc3QgQ2xhc3MtUGF0aDoKLUpBUi9Nb2R1bGVfVUlfPUpBUi9Nb2R1bGUKLVByb2plY3RfVUlfPVByb2plY3QKLUVBUl9Nb2R1bGVzPUVBUiBNb2R1bGVzOgotRUFSX01vZHVsZXNfRGVzYz1UaGlzIHByb3BlcnR5IHBhZ2UgbGV0cyB5b3Ugc2V0dXAgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgaW4gYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4KLUoyRUVfTW9kdWxlcz1KMkVFIE1vZHVsZXM6Ci1KMkVFX01vZHVsZXNfRGVzYz1UaGlzIHByb3BlcnR5IHBhZ2UgbGV0cyB5b3Ugc2V0dXAgdGhlIGoyZWUgbW9kdWxlIGRlcGVuZGVuY2llcyB3aXRoIG90aGVyIGoyZWUgbW9kdWxlcyB3aXRoaW4gYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4gIEFsbCBtb2R1bGVzIGludm9sdmVkIGluIHRoZSBkZXBlbmRlbmN5IG5lZWQgdG8gYmVsb25nIHRvIHRoZSBzYW1lIEVudGVycHJpc2UgQXBwbGljYXRpb24uCi1XZWJfTGlicmFyaWVzPVdlYiBMaWJyYXJpZXM6Ci1XZWJfTGlicmFyaWVzX0Rlc2M9VGhpcyBwcm9wZXJ0eSBwYWdlIGxldHMgeW91IGFkZCB0aGUgV2ViIExpYnJhcnkgZGVwZW5kZW5jeSB0byBvdGhlciBqYXZhIG1vZHVsZXMgaW4gdGhlIHdvcmtwc3BhY2UuIFRoaXMgZGVwZW5kZW5jeSByZXNvbHZlcyB0aGUgamF2YSBtb2R1bGVzIGludG8gdGhlIHdlYlxcbGliIGZvbGRlciBvZiB0aGUgd2ViIG1vZHVsZSBhdCBkZXBsb3ltZW50IHRpbWUuCi1FQVJfTW9kdWxlX0RlcF9FcnJvcj1KMkVFIE1vZHVsZXMgaXMgbm90IHZhbGlkIGZvciBFQVIgbW9kdWxlcy4KLUphcl9EZXBfT25lX01vZHVsZV9FcnJvcj1KYXZhIEphciBEZXBlbmRlbmNpZXMgaXMgdmFsaWQgb25seSBmb3Igb25lIG1vZHVsZSBwZXIgZmxleGlibGUgcHJvamVjdC4KLVdlYl9MaWJfRXJyb3I9V2ViIGxpYnJhcnkgc2V0dGluZ3MgYXJlIG9ubHkgdmFsaWQgZm9yIFdlYiBtb2R1bGVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvbWlnd2l6YXJkcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9taWd3aXphcmRzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODIxNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9taWd3aXphcmRzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI21pZ3JhdGlvbiB3aXphcmRzCi1TZWxlY3RfQWxsPVNlbGVjdCBBbGwKLURlc2VsZWN0X0FsbD1EZXNlbGVjdCBBbGwKLU1pZ3JhdGlvbl9XaXphcmRfVGl0bGVfPUoyRUUgTWlncmF0aW9uIFdpemFyZAotSjJFRV9NaWdyYXRpb25fV2l6YXJkX1dlbGNvbWVfPUoyRUUgTWlncmF0aW9uIFdpemFyZCBXZWxjb21lIFBhZ2UKLVdlbGNvbWVfVG9fVGhlX0oyRUVfTWlncmF0aW9uX1dpemFyZF89V2VsY29tZSB0byB0aGUgSjJFRSBNaWdyYXRpb24gV2l6YXJkCi1QbGVhc2VfUmVhZF9UaGVfRm9sbG93aW5nX0luZm9ybWF0aW9uXz1QbGVhc2UgcmVhZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLCB0aGVuIGNsaWNrIE5leHQuCi1UaGVfTWlncmF0aW9uX1dpemFyZF9HdWlkZXNfVGhlX1Byb2Nlc3NfPVRoZSBNaWdyYXRpb24gV2l6YXJkIGd1aWRlcyB0aGUgcHJvY2VzcyBvZiBvcHRpb25hbGx5IG1pZ3JhdGluZyB5b3VyIEoyRUUgcHJvamVjdCBzdHJ1Y3R1cmVzIGFuZCB0aGUgSjJFRSB2ZXJzaW9uIG9mIHRoZSBhc3NvY2lhdGVkIHByb2plY3RzLgotUHJpb3JfVG9fUHJvY2VlZGluZ19XaXRoX1RoZV9NaWdyYXRpb25fV2l6YXJkXz1QcmlvciB0byBwcm9jZWVkaW5nIHdpdGggdGhlIE1pZ3JhdGlvbiBXaXphcmQgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgeW91OgotUmVhZF9UaGVfT25saW5lX0hlbHBfU2VjdGlvbl89UmVhZCB0aGUgb25saW5lIGhlbHAgb24gTWlncmF0aW5nIGFwcGxpY2F0aW9ucyB0byBKMkVFIDEuMyBhbmQgSjJFRSAxLjQgc3BlY2lmaWNhdGlvbiBsZXZlbHMuIgotQmFja3VwX1lvdXJfRW50aXJlX1dvcmtzcGFjZV89QmFja3VwIHlvdXIgZW50aXJlIHdvcmtzcGFjZS4KLUlmX1dvcmtpbmdfV2l0aF9BX1JlcG9zaXRvcnlfPUlmIHdvcmtpbmcgd2l0aCBhIHJlcG9zaXRvcnksICJjaGVjayBvdXQiIG9yICJsb2NrIiBhbGwgY29ycmVzcG9uZGluZyBwcm9qZWN0cy4KLU9uY2VfVGhlX01pZ3JhdGlvbl9XaXphcmRfSXNfQ29tcGxldGVfPU9uY2UgdGhlIE1pZ3JhdGlvbiBXaXphcmQgaXMgY29tcGxldGUsIHRoZSBkZXRhaWxzIG9mIHRoZSBzdGVwcyBwZXJmb3JtZWQgZHVyaW5nIG1pZ3JhdGlvbiB3aWxsIGJlIHByZXNlbnRlZCBpbiBhIHJlc3VsdHMgd2luZG93LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIHdyaXR0ZW4gdG8gdGhlIExvZ2dpbmdVdGlsLmxvZyBmaWxlIGluIHRoZSAubWV0YWRhdGEgZm9sZGVyIGluIHlvdXIgbG9jYWwgd29ya3NwYWNlLgotQmFzZWRfT25fVGhlX051bWJlcl9PZl9Qcm9qZWN0c189QmFzZWQgb24gdGhlIG51bWJlciBvZiBwcm9qZWN0cywgbWlncmF0aW9uIG1heSB0YWtlIGEgZmV3IG1pbnV0ZXMuCi1FbnRlcnByaXNlX0FwcGxpY2F0aW9uXz1FbnRlcnByaXNlIEFwcGxpY2F0aW9uCi1UaGVfZm9sbG93aW5nX2VudGVycHJpc2VfYXBwbGljYXRpb25fcHJvamVjdF89VGhlIGZvbGxvd2luZyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Qgd2lsbCBiZSBtaWdyYXRlZC4gIFRoZSBwcm9qZWN0IHN0cnVjdHVyZSBtaWdyYXRpb24gaXMgb3B0aW9uYWwuCi1FbnRlcnByaXNlX0FwcGxpY2F0aW9uX1Byb2plY3RfPUVudGVycHJpc2UgQXBwbGljYXRpb24gUHJvamVjdDoKLU1pZ3JhdGVfUHJvamVjdF9TdHJ1Y3R1cmVfPU1pZ3JhdGUgcHJvamVjdCBzdHJ1Y3R1cmUuCi1NaWdyYXRlX1Byb2plY3RfRnJvbV9WZXJzaW9uXz1NaWdyYXRlIHByb2plY3QgSjJFRSBzcGVjaWZpY2F0aW9uIGxldmVsLgotVmVyc2lvbl9MZXZlbD1KMkVFIHZlcnNpb24KLVRBUkdFVF9TRVJWRVI9VGFyZ2V0IFNlcnZlcgotVGhlX1Byb2plY3RfVmVyc2lvbl9BbmRfVGhlX0RlcGxveW1lbnRfRGVzY3JpcHRvcl89VGhlIHByb2plY3QgdmVyc2lvbiBhbmQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhcmUgbWlncmF0ZWQgZm9yIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLiAgVGhpcyBtaWdyYXRpb24gYWxsb3dzIGZvciB0aGUgaW5jbHVzaW9uIG9mIEoyRUUgMS4zIG1vZHVsZXMgaW50byB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4KLU1pZ3JhdGVfQWxsX01vZHVsZV9Qcm9qZWN0c189TWlncmF0ZSBhbGwgbW9kdWxlIHByb2plY3RzCi1BbGxfRUpCX1dlYl9BcHBsaWNhdGlvbl9DbGllbnRfTW9kdWxlc19SZWZlcmVuY2VkXz1BbGwgRUpCLCB3ZWIsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIGFyZSBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIGZvciBtaWdyYXRpb24uCi1TZWxlY3RfVGhlX0ZpbmlzaF9CdXR0b25fVG9fQWNjZXB0X1RoZV9EZWZhdWx0Xz1TZWxlY3QgdGhlIEZpbmlzaCBidXR0b24gdG8gYWNjZXB0IHRoZSBkZWZhdWx0IG1pZ3JhdGlvbiBvcHRpb25zIGZvciBhbGwgbW9kdWxlIHByb2plY3RzLCBvciBjdXN0b21pemUgdGhlIG1pZ3JhdGlvbiBvcHRpb25zIGZvciBlYWNoIHR5cGUgb2YgbW9kdWxlIHByb2plY3Qgb24gdGhlIGZvbGxvd2luZyBwYWdlcy4KLU1pZ3JhdGVfUHJvamVjdF9Gcm9tX1ZlcnNpb25fRUpCXz1NaWdyYXRlIHByb2plY3QgZnJvbSB2ZXJzaW9uIGxldmVsIEoyRUUgMS4yIChFSkIgMS54KSB0byBKMkVFIDEuMyAoRUpCIDIueCkKLUVKQl9Nb2R1bGVfTWlncmF0aW9uXz1FSkIgTW9kdWxlIE1pZ3JhdGlvbgotU2VsZWN0X3RoZV9FSkJfcHJvamVjdHNfdG9fYmVfbWlncmF0ZWRfPVNlbGVjdCB0aGUgRUpCIHByb2plY3RzIHRvIGJlIG1pZ3JhdGVkLiAgVGhlIHByb2plY3Qgc3RydWN0dXJlcyBtaWdyYXRpb24gaXMgb3B0aW9uYWwuCi1NaWdyYXRlZF9DTVBfQmVhbnNfVG9fPU1pZ3JhdGUgQ01QIDEueCBiZWFucyB0byBDTVAgMi54IGJlYW5zCi1BZGRfTG9jYWxfQ2xpZW50X1ZpZXdzXz1BZGQgbG9jYWwgY2xpZW50IHZpZXdzCi1BdmFpbGFibGVfUHJvamVjdHNfPVByb2plY3RzOgotU2VsZWN0ZWRfUHJvamVjdHNfPXswfSBvZiB7MX0gcHJvamVjdHMgc2VsZWN0ZWQuCi1TZWxlY3RlZF9CZWFuc19NaWdyYXRpb25fPXswfSBvZiB7MX0gYmVhbnMgc2VsZWN0ZWQuCi1BcHBsaWNhdGlvbl9DbGllbnRfUHJvamVjdHNfPUFwcGxpY2F0aW9uIENsaWVudCBQcm9qZWN0czoKLUNvbm5lY3Rvcl9Qcm9qZWN0c189Q29ubmVjdG9yIFByb2plY3RzOgotU2VsZWN0X1RoZV9Db25uZWN0b3JfUHJvamVjdHNfPVNlbGVjdCB0aGUgY29ubmVjdG9yIHByb2plY3RzIHRvIGJlIG1pZ3JhdGVkLiBUaGUgcHJvamVjdCBzdHJ1Y3R1cmUgbWlncmF0aW9uIGlzIG9wdGlvbmFsLgotU2VsZWN0X1RoZV9BcHBsaWNhdGlvbl9DbGllbnRfUHJvamVjdHNfPVNlbGVjdCB0aGUgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzIHRvIGJlIG1pZ3JhdGVkLiBUaGUgcHJvamVjdCBzdHJ1Y3R1cmUgbWlncmF0aW9uIGlzIG9wdGlvbmFsLgotV0VCX01JR1JBVEVfV0laQVJEX1RJVExFPVdlYiBQcm9qZWN0czoKLVdFQl9NSUdSQVRFX1dJWkFSRF9ERVNDUklQVElPTj1TZWxlY3QgdGhlIHdlYiBwcm9qZWN0cyB0byBiZSBtaWdyYXRlZC4gIFRoZSBwcm9qZWN0IHN0cnVjdHVyZSBtaWdyYXRpb24gaXMgb3B0aW9uYWwuCi1TZWxlY3RfdGhlX2VudGVycHJpc2VfYmVhbnNfdGhhdF93aWxsX2hhdmVfPVNlbGVjdCB0aGUgZW50ZXJwcmlzZSBiZWFucyB0aGF0IHdpbGwgaGF2ZSBsb2NhbCBjbGllbnQgdmlld3MgYWRkZWQuCi1FbnRlcnByaXNlX0JlYW5zX1NlbGVjdGlvbl89RW50ZXJwcmlzZSBCZWFucwotU2VsZWN0X0FsbF9FbnRpdHlfQmVhbnNfPVNlbGVjdCBBbGwgRW50aXR5IEJlYW5zCi1TZWxlY3RfUmVxdWlyZWRfQmVhbnNfPVNlbGVjdCBSZXF1aXJlZAotRGVsZXRlX1JlbW90ZV9DbGllbnRfVmlld3NfPURlbGV0ZSByZW1vdGUgY2xpZW50IHZpZXdzCi1Mb2NhbF9DbGllbnRfVmlld19OYW1pbmdfU2NoZW1lXz1Mb2NhbCBjbGllbnQgdmlldyBuYW1pbmcgc2NoZW1lCi1SZXVzZV9UaGVfRGVsZXRlZF9SZW1vdGVfQ2xpZW50X1ZpZXdfPVJldXNlIHRoZSBkZWxldGVkIHJlbW90ZSBjbGllbnQgdmlldyBuYW1lCi1TcGVjaWZ5X1N1ZmZpeF89U3BlY2lmeSBzdWZmaXg6Ci1FSkJfQ2xpZW50X1ZpZXdfRXhhbXBsZV89Rm9yIGV4YW1wbGUsIEVKQiBiZWFuICJGb28iIHdpbGwgaGF2ZSBsb2NhbCBjbGllbnQgdmlld3MgbmFtZWQ6ICJGb297MH0iIGFuZCAiRm9vezF9SG9tZSIuCi1UaGVfU3VmZml4X1RleHRfQ2FuX05vdF9CZV89VGhlIHN1ZmZpeCB0ZXh0IGNhbm5vdCBiZSBlbXB0eS4KLUFfUHJvamVjdF9NdXN0X0JlX1NlbGVjdGVkXz1BIHByb2plY3QgbXVzdCBiZSBzZWxlY3RlZCBpbiBvcmRlciB0byBtaWdyYXRlLgotQV9CZWFuX011c3RfQmVfU2VsZWN0ZWRfPUEgYmVhbiBtdXN0IGJlIHNlbGVjdGVkIGluIG9yZGVyIHRvIG1pZ3JhdGUgdGhlIGxvY2FsIGNsaWVudCB2aWV3LgotI21vdmVkIGZyb20gbW9majJlZS5wcm9wZXJ0aWVzCi1TdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZT1TdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOgotRVJST1I9RXJyb3I6Ci1XQVJOSU5HPVdhcm5pbmc6Ci1JTkZPPUluZm86Ci1ERUZBVUxUX0NPTVBMRVRFRF9TVEFUVVNfTVNHPU1pZ3JhdGlvbiB3YXMgY29tcGxldGVkIGZvciB7MH0uCi1ERUZBVUxUX05PVF9ORUVERURfU1RBVFVTX01TRz1NaWdyYXRpb24gd2FzIG5vdCByZXF1aXJlZCBmb3IgezB9LgotREVGQVVMVF9OT1RfUE9TU0lCTEVfU1RBVFVTX01TRz1NaWdyYXRpb24gd2FzIG5vdCBwb3NzaWJsZSBmb3IgezB9LgotREVGQVVMVF9FUlJPUl9TVEFUVVNfTVNHPUlXQUUwMDAzRSBFcnJvciBtaWdyYXRpbmcgezB9LgotUkVNT1ZFRF9MT0NBTF9DTElFTlRfTVNHPVJlbW92ZWQgbG9jYWwgY2xpZW50IHZpZXcgZm9yIEVKQiB7MH0uCi1SRU1PVkVEX0FDQ0VTU19JTlRFTlRTX01TRz1SZW1vdmVkIHswfSAxLjEgbWV0aG9kIGFjY2VzcyBpbnRlbnQocykgZnJvbSBDTVAgYmVhbiB7MX0uCi1SRU1PVkVEX0lTT0xBVElPTl9MRVZFTFNfTVNHPVJlbW92ZWQgezB9IDEuMSBtZXRob2QgaXNvbGF0aW9uIGxldmVsKHMpIGZyb20gQ01QIGJlYW4gezF9LgotQ09OVkVSVEVEX0ZJTkRFUl9NU0c9Q29udmVydGVkIGZpbmRlciBkZXNjcmlwdGVyIGZvciB7MH0gaW4gQ01QIGJlYW4gezF9LiAgVXNlIHRoZSBFSkIgZWRpdG9yIHRvIHVwZGF0ZSB0aGUgcXVlcnkgRUpCIFFMLgotVU5OQU1FRF9FSkI9PFVubmFtZWQgQ01QIGJlYW4+Ci1DT05WRVJURURfUVVFUllfREVTQ1JJUFRJT049Q29udmVydGVkIGZyb20gSUJNIHZlcnNpb24gMS4xIGV4dGVuc2lvbnMuCi1NSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfSkFSX01TRz1NaWdyYXRlZCBkZWZhdWx0IERhdGFzb3VyY2UgYmluZGluZyB0byBhIGRlZmF1bHQgQ01QIENvbm5lY3Rpb24gRmFjdG9yeSBiaW5kaW5nIGZvciBFSkIgSkFSIFwiezB9XCIuCi1NSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfTVNHPU1pZ3JhdGVkIGRlZmF1bHQgRGF0YXNvdXJjZSBiaW5kaW5nIHRvIGEgZGVmYXVsdCBDTVAgQ29ubmVjdGlvbiBGYWN0b3J5IGJpbmRpbmcgZm9yIEVKQiBKQVIuCi1KMkVFX1ZFUlNJT05fTlVMTF9FUlJPUj1VbmFibGUgdG8gZ2V0IEoyRUUgdmVyc2lvbiBvZiBvYmplY3QgYmVjYXVzZSBpdCBpcyBub3QgY29udGFpbmVkIGJ5IGEgZG9jdW1lbnQuCi1KMkVFX1ZFUlNJT05fUFJPWFlfRVJST1I9VW5hYmxlIHRvIGdldCBKMkVFIHZlcnNpb24gb2YgcmVmZXJlbmNlZCBvYmplY3QgYmVjYXVzZSB0aGUgcHJveHkgY2Fubm90IGJlIHJlc29sdmVkLiAgQ2hlY2sgdGhlIGlkcyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGVzLiAgSFJFRiA9IHswfS4KLSNtb3ZlZCBmcm9tIGoyZWVjcmVhdGlvbi5wcm9wZXJ0aWVzCi1KMkVFX1BST0pFQ1RfTUlHUkFUSU9OX1RJVExFX1VJXz1KMkVFIFByb2plY3QgTWlncmF0aW9uCi1FTlRFUlBSSVNFX0FQUExJQ0FUSU9OU19VSV89RW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLVdJWl9CQU5fREVTQ19VSV89U2VsZWN0IHRoZSB7MH0gcHJvamVjdHMgdG8gYmUgbWlncmF0ZWQuIFRoZSBwcm9qZWN0IHN0cnVjdHVyZSBtaWdyYXRpb24gaXMgb3B0aW9uYWwuCi1FTlRFUlBSSVNFX0FQUF9QUk9KRUNUU19VSV89RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0czoKLU1JR1JBVEVfSjJFRV9TUEVDX1VJXz1NaWdyYXRlIHByb2plY3QgZnJvbSB2ZXJzaW9uIGxldmVsIEoyRUUgMS4yIHRvIEoyRUUgMS4zCi1NSUdSQVRFX0VKQl9TUEVDX1VJXz1NaWdyYXRlIHByb2plY3QgZnJvbSB2ZXJzaW9uIGxldmVsIEVKQiAxLjEgdG8gRUpCIDIuMAotTUlHUkFURV9NT0RVTEVfUFJPSkVDVFNfVUlfPU1pZ3JhdGUgbW9kdWxlIHByb2plY3RzCi1BUFBMSUNBVElPTl9DTElFTlRTX1VJXz1BcHBsaWNhdGlvbiBDbGllbnRzCi1BUFBMSUNBVElPTl9DTElFTlRfUFJPSkVDVFNfVUlfPUFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0czoKLUVOVEVSUFJJU0VfQkVBTlNfQkFOX1VJXz1FbnRlcnByaXNlIEJlYW5zCi1FSkJfUFJPSkVDVFNfVUlfPUVKQiBwcm9qZWN0czoKLUFERF9MT0NBTF9DTElFTlRfVklFV1NfQ0hFQ0tfVUlfPUFkZCBsb2NhbCBjbGllbnQgdmlld3MKLU1JR1JBVEVfQ01QX0JFQU5TX1VJXz1NaWdyYXRlIENNUCAxLjEgYmVhbnMgdG8gQ01QIDIuMCBiZWFucwotQUREX0xPQ0FMX0NMSUVOVF9WSUVXU19CQU5fVUlfPUFkZCBMb2NhbCBDbGllbnQgVmlld3MKLVNFTEVDVF9FSkJfQ0xJRU5UX1ZJRVdTX1VJXz1TZWxlY3QgdGhlIGVudGVycHJpc2UgYmVhbnMgdGhhdCB3aWxsIGhhdmUgbG9jYWwgY2xpZW50IHZpZXdzIGFkZGVkLgotRU5URVJQUklTRV9CRUFOU19MSVNUX1VJXz1FbnRlcnByaXNlIGJlYW5zOgotREVMRVRFX1JFTV9DTElFTlRfVklFV1NfVUlfPURlbGV0ZSByZW1vdGUgY2xpZW50IHZpZXdzCi1MT0NBTF9DTElFTlRfVklFV19TQ0hFTUVfVUlfPUxvY2FsIGNsaWVudCB2aWV3IG5hbWluZyBzY2hlbWU6Ci1SRVVTRV9ERUxFVEVEX0NMSUVOVF9WSUVXX05BTUVfVUlfPVJldXNlIHRoZSBkZWxldGVkIHJlbW90ZSBjbGllbnQgdmlldyBuYW1lCi1TUEVDSUZZX1NVRkZJWF9VSV89U3BlY2lmeSBzdWZmaXg6Ci1TVUZGSVhfRVhBTVBMRV9VSV89KEZvciBleGFtcGxlLCBlbnRlcnByaXNlIGJlYW4gXCdmb29cJyB3aWxsIGhhdmUgbG9jYWwgY2xpZW50IHZpZXdzIG5hbWVkOiBcJ2Zvb0xvY2FsXCcgYW5kIFwnZm9vTG9jYWxIb21lXCcuKQotTUlHUkFUSU9OX1NVQ0NFU1NfUkVQT1JUX1VJXz1NaWdyYXRpb24gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LgotTUlHUkFUSU9OX1dBUk5JTkdTX1JFUE9SVF9VSV89TWlncmF0aW9uIGZpbmlzaGVkIHdpdGggd2FybmluZ3M7IHNlZSBsb2cgZmlsZXMgZm9yIGRldGFpbHMuCi1NSUdSQVRJT05fRVJST1JTX1JFUE9SVF9VSV89TWlncmF0aW9uIGZpbmlzaGVkIHdpdGggZXJyb3JzOyBzZWUgbG9nIGZpbGVzIGZvciBkZXRhaWxzLgotUFJPSkVDVF9TVFJVQ1RVUkVfU1VDQ0VTU19VSV89UHJvamVjdCBzdHJ1Y3R1cmUgbWlncmF0aW9uIHN1Y2Nlc3NmdWw6IHswfS4KLVBST0pFQ1RfU1RSVUNUVVJFX0ZBSUxFRF9VSV89UHJvamVjdCBzdHJ1Y3R1cmUgbWlncmF0aW9uIGZhaWxlZDogezB9LgotUFJPSkVDVF9OT1RfTkVFRF9NSUdSQVRJT05fVUlfPVByb2plY3Qgc3RydWN0dXJlIGRpZCBub3QgbmVlZCBtaWdyYXRpb246IHswfS4KLUoyRUVfVkVSU0lPTl9TVUNDRVNTX1VJXz1KMkVFIHZlcnNpb24gbGV2ZWwgbWlncmF0aW9uIHN1Y2Nlc3NmdWw6IHswfS4KLUoyRUVfVkVSU0lPTl9GQUlMRURfVUlfPUoyRUUgdmVyc2lvbiBsZXZlbCBtaWdyYXRpb24gZmFpbGVkOiB7MH0uCi1KMkVFX1ZFUlNJT05fTk9UX05FRURfTUlHUkFUSU9OX1VJXz1KMkVFIHZlcnNpb24gbGV2ZWwgZGlkIG5vdCBuZWVkIG1pZ3JhdGlvbjogezB9LgotTE9DQUxfQ0xJRU5UX0FERF9TVUNDRVNTX1VJXz1Mb2NhbCBjbGllbnQgdmlld3MgYWRkZWQgc3VjY2Vzc2Z1bGx5OiB7MH0uCi1MT0NBTF9DTElFTlRfQUREX0ZBSUxFRF9VSV89TG9jYWwgY2xpZW50IHZpZXdzIGZhaWxlZCBvbiBhZGQ6IHswfS4KLUxPQ0FMX0NMSUVOVF9WSUVXU19FWElTVF9VSV89TG9jYWwgY2xpZW50IHZpZXdzIGFscmVhZHkgZXhpc3Q6IHswfS4KLVJFTU9URV9DTElFTlRfREVMRVRFX1NVQ0NFU1NfVUlfPVJlbW90ZSBjbGllbnQgdmlld3MgZGVsZXRlZCBzdWNjZXNzZnVsbHk6IHswfS4KLVJFTU9URV9DTElFTlRfREVMRVRFX0ZBSUxFRF9VSV89UmVtb3RlIGNsaWVudCB2aWV3cyBmYWlsZWQgb24gZGVsZXRlOiB7MH0uCi1SRU1PVEVfQ0xJRU5UX1ZJRVdTX05PVF9FWElTVF9VSV89UmVtb3RlIGNsaWVudCB2aWV3cyBkaWQgbm90IGV4aXN0OiB7MH0uCi1KQVJfMTFfSU1QT1JUXzIwX1VJXz1UaGUgMS4xIEpBUiBpcyBiZWluZyBpbXBvcnRlZCBpbnRvIGFuIEVKQiAyLjAgbW9kdWxlLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB3aWxsIGJlIGNvbnZlcnRlZCwgYnV0IHRoZSBDTVAgYmVhbnMgcmVtYWluIHZlcnNpb24gMS4xLgotQ01QXzExX0lNUE9SVF8yMF9VSV89VGhlIGZvbGxvd2luZyBDTVAgMS4xIGJlYW5zIGFyZSBiZWluZyBpbXBvcnRlZCBpbnRvIGFuIEVKQiAyLjAgbW9kdWxlLiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHdpbGwgYmUgY29udmVydGVkLCBidXQgdGhlIENNUCBiZWFucyByZW1haW4gdmVyc2lvbiAxLjEuCi1PTERfUFJPSkVDVF9TVFJVQ1RVUkVfVUlfPVRoZSBKMkVFIHByb2plY3QgezB9IGhhcyBhbiBvbGQgcHJvamVjdCBzdHJ1Y3R1cmUsIGFuZCBzaG91bGQgYmUgbWlncmF0ZWQuCi1QUk9KRUNUX01VU1RfQkVfU0VMRUNURURfVUlfPUEgezB9IHByb2plY3QgbXVzdCBiZSBzZWxlY3RlZC4KLUVOVEVSUFJJU0VfQVBQTElDQVRJT05fVUlfPWVudGVycHJpc2UgYXBwbGljYXRpb24KLUFQUExJQ0FUSU9OX0NMSUVOVF9VSV89YXBwbGljYXRpb24gY2xpZW50Ci1FSkJfVUlfPUVKQgotV0VCX1VJXz1XRUIKLUVKQl9NVVNUX0JFX1NFTEVDVEVEX1VJXz1BbiBlbnRlcnByaXNlIGJlYW4gbXVzdCBiZSBzZWxlY3RlZC4KLU1JR1JBVEVfVUlfPU1pZ3JhdGUuLi4KLU1JR1JBVEVfSjJFRV9QUk9KRUNUU19VSV89TWlncmF0ZSBKMkVFIFByb2plY3RzLi4uCi1PUEVOX0oyRUVfTUlHUkFUSU9OX1dJWkFSRF9VSV89T3BlbiBKMkVFIE1pZ3JhdGlvbiBXaXphcmQuLi4KLU1JR1JBVElOR19QUk9KRUNUX1NUUlVDVFVSRVNfVUlfPU1pZ3JhdGluZyBwcm9qZWN0IHN0cnVjdHVyZS4uLgotTUlHUkFUSU5HX0oyRUVfVkVSU0lPTl9VSV89TWlncmF0aW5nIHByb2plY3QgSjJFRSB2ZXJzaW9uIGxldmVsLi4uCi1BRERJTkdfTE9DQUxfQ0xJRU5UX1ZJRVdTX1VJXz1BZGRpbmcgbG9jYWwgY2xpZW50IHZpZXdzLi4uCi1ERUxFVElOR19SRU1PVEVfQ0xJRU5UX1ZJRVdTX1VJXz1EZWxldGluZyByZW1vdGUgY2xpZW50IHZpZXdzLi4uCi1NSUdSQVRJT05fTk9UX05FRURFRF9SRVBPUlQ9TWlncmF0aW9uIHdhcyBub3QgbmVlZGVkIGZvciB0aGUgc2VsZWN0ZWQgaXRlbXMuCi1NSUdSQVRJT05fTk9UX1BPU1NJQkxFX1JFUE9SVD1NaWdyYXRpb24gd2FzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIHNlbGVjdGVkIGl0ZW1zLgotU09VUkNFX0ZPTERFUl9SRU5BTUVfRkFJTEVEPVVuYWJsZSB0byByZW5hbWUgdGhlIEphdmEgc291cmNlIGZvbGRlciB7MH0uCi1TT1VSQ0VfRk9MREVSX1JFTkFNRV9TS0lQUEVEPVRoZSBKYXZhIHNvdXJjZSBmb2xkZXJzIGFyZSBub3QgcmVuYW1lZCB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc291cmNlIGZvbGRlci4KLVdFQkNPTlRFTlRfRk9MREVSX1JFTkFNRV9GQUlMRUQ9VW5hYmxlIHRvIHJlbmFtZSB0aGUgd2ViIGNvbnRlbnQgZm9sZGVyIHswfS4KLVdFQkNPTlRFTlRfRk9MREVSX1JFTkFNRV9TS0lQUEVEPVRoZSB3ZWIgY29udGVudCBmb2xkZXIgezB9IG5vdCByZW5hbWVkLgotV0VCUFJPSkVDVF9WRVJTSU9OX01JR1JBVEVfRkFJTEVEPVVuYWJsZSB0byBtaWdyYXRlIHRoZSB3ZWIgcHJvamVjdCB2ZXJzaW9uLgotQUJTX1BBVEhTX0FQUF9FWFRfUkVNT1ZFRD1BYnNvbHV0ZSBwYXRocyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gZXh0ZW5zaW9ucyBmaWxlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MH0uCi1QUk9KRUNUX1JFRkVSRU5DRVNfVVBEQVRFRD1Qcm9qZWN0IHJlZmVyZW5jZXMgd2VyZSB1cGRhdGVkIGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MH0uCi1QUk9KRUNUX0NMQVNTUEFUSF9VUERBVEVEPVByb2plY3QgSmF2YSBidWlsZCBwYXRoIHdhcyB1cGRhdGVkIGZvciBwcm9qZWN0IHswfS4KLUZBSUxFRF9NSUdSQVRJTkdfSU1QT1JURURfQ0xBU1NFUz1VbmFibGUgdG8gbWlncmF0ZSB0aGUgaW1wb3J0ZWRfY2xhc3NlcyBKQVIgZmlsZS4gIEV4Y2VwdGlvbjogezB9Ci1FWFRSQUNURURfSU1QT1JURURfQ0xBU1NFUz1JbXBvcnRlZCBjbGFzc2VzIHdlcmUgZXh0cmFjdGVkIGZyb20gZmlsZSB7MH0uCi1JTVBPUlRFRF9DTEFTU0VTX0ZJTEVfREVMRVRFRD1JbXBvcnRlZCBjbGFzc2VzIGZpbGUgezB9IHdhcyBkZWxldGVkLgotQkFDS0VORF9NSUdSQVRJT05fRkFJTEVEPVVuYWJsZSB0byBtaWdyYXRlIHRoZSBNYXAgYW5kIFNjaGVtYSBmaWxlIHN0cnVjdHVyZSBpbiBwcm9qZWN0IHswfQotQklOQVJZX01JR1JBVElPTl9GQUlMRUQ9VW5hYmxlIHRvIG1pZ3JhdGUgYmluYXJ5IHByb2plY3QgezB9LgotQ09NUExFVEVEX0JBQ0tFTkRfTUlHPVRoZSBiYWNrZW5kIChNYXAgYW5kIFNjaGVtYSkgbWV0YS1kYXRhIG9mIHRoZSB7MH0gcHJvamVjdCBtaWdyYXRlZCBzdWNjZXNzZnVsbHkuCi1OT1RfTkVFREVEX0RFUExPWU1FTlRfREVTQ19NSUc9VGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB3YXMgbm90IGZvdW5kIGluIHRoZSBwcm9qZWN0IHswfS4KLU5PVF9ORUVERURfQkFDS0VORF9NSUc9VGhlIG9sZCBiYWNrZW5kIChNYXAgYW5kIFNjaGVtYSkgc3RydWN0dXJlIHdhcyBub3QgZm91bmQgaW4gdGhlIHByb2plY3QgezB9LgotTUlHUkFUSU9OX0NPTVBMRVRFPU1pZ3JhdGlvbiBDb21wbGV0ZQotTUlHUkFUSU9OX0VSUk9SUz1NaWdyYXRpb24gRXJyb3JzCi1NSUdSQVRJT05fTk9UX05FRURFRD1NaWdyYXRpb24gTm90IE5lZWRlZAotQ09ORklSTUFUSU9OX1RJVExFPUNvbmZpcm0gTWlncmF0aW9uCi1PUEVOX0VESVRPUlNfVElUTEU9T3BlbiBFZGl0b3JzCi1DT05GSVJNX01JR1JBVEVfUFJPSkVDVF9TVFJVQ1RVUkU9VGhpcyB3aWxsIG1pZ3JhdGUgdGhlIHByb2plY3Qgc3RydWN0dXJlIGZvciB0aGUgc2VsZWN0ZWQgaXRlbXMgdG8gdGhlIGxhdGVzdCBmb3JtYXQuICBDb250aW51ZT8KLUNPTkZJUk1fTUlHUkFURV9KMkVFXzEzPVRoaXMgd2lsbCBtaWdyYXRlIHRoZSBwcm9qZWN0IHN0cnVjdHVyZSBmb3IgdGhlIHNlbGVjdGVkIGl0ZW1zIGlmIG5lY2Vzc2FyeSwgYW5kIG1pZ3JhdGUgdGhlIEoyRUUgdmVyc2lvbiBvZiB0aGUgc2VsZWN0ZWQgaXRlbXMgZnJvbSAxLjIgdG8gMS4zLiAgQ29udGludWU/Ci1JTkZPUk1fT1BFTl9FRElUT1JTPU9wZW4gZWRpdG9ycyBleGlzdCBpbiB0aGUgd29ya2JlbmNoLiAgUGxlYXNlIGNsb3NlIGFsbCBlZGl0b3JzIGJlZm9yZSBydW5uaW5nIG1pZ3JhdGlvbi5cblxuRG8geW91IHdhbnQgdG8gY2xvc2UgYWxsIGVkaXRvcnMgYW5kIGNvbnRpbnVlIG1pZ3JhdGlvbj8KLVdFQkNPTlRFTlRfTElCUEFUSF9VUERBVEVfRkFJTEVEPVVuYWJsZSB0byByZW1vdmUgSkFSIGZpbGUgZnJvbSBjbGFzc3BhdGguCi1GQUlMRURfREVQTE9ZX0RFTEVURT1GYWlsZWQgZGVsZXRpbmcgZGVwbG95IGNvZGUgaW4gezB9IHByb2plY3QuCi1DT01QTEVURURfREVQTE9ZX0RFTEVURT1Db21wbGV0ZWQgZGVsZXRlIG9mIGRlcGxveSBjb2RlIGluIHswfSBwcm9qZWN0LgotRkFJTEVEX0xPQ0FMX0NMSUVOVF9DUkVBVEU9RmFpbGVkIGNyZWF0aW5nIGxvY2FsIGNsaWVudCB2aWV3IGZvciB7MH0uCi1DT01QTEVURURfTE9DQUxfQ0xJRU5UX0NSRUFURT1Db21wbGV0ZWQgY3JlYXRpb24gb2YgYSBsb2NhbCBjbGllbnQgdmlldyBmb3IgezB9LgotQ09NUExFVEVEX0NNUDIwX0NPREVHRU49Q29tcGxldGVkIENNUCAyLjAgY29kZSBnZW5lcmF0aW9uIGluIHswfSBwcm9qZWN0LgotTE9DQUxfQ0xJRU5UX05PVF9ORUVERUQ9QSBsb2NhbCBjbGllbnQgdmlldyB3YXMgbm90IGNyZWF0ZWQgc2luY2Ugb25lIGFscmVhZHkgZXhpc3RzIGZvciB7MH0uCi1JTlZBTElEX1NFTEVDVElPTl9USVRMRT1JbnZhbGlkIFNlbGVjdGlvbgotSU5GT1JNX0lOVkFMSURfSjJFRV9TRUxFQ1RJT049T25lIG9yIG1vcmUgSjJFRSAxLjQgc3BlY2lmaWNhdGlvbiBwcm9qZWN0cyBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIG1pZ3JhdGlvbiB0aGF0IGlzIG5vdCB2YWxpZC5cbk9ubHkgSjJFRSAxLjIgb3IgMS4zIHNwZWNpZmljYXRpb24gcHJvamVjdHMgY2FuIGJlIG1pZ3JhdGVkLgotSU5GT1JNX1BST1BFUl9TRUxFQ1RJT049U2VsZWN0aW9uIG11c3QgYmUgb25lIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCBvciBhbnkgY29tYmluYXRpb24gb2YgRUpCLCB3ZWIsIGFuZCBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlIHByb2plY3RzLgotUkVRVUlSRURfQ0xJRU5UX1ZJRVdfVElUTEU9Q2xpZW50IFZpZXcgUmVxdWlyZWQKLUNPTkZJUk1fQ0xJRU5UX1ZJRVdfUkVRVUlSRUQ9VGhlIGZvbGxvd2luZyBiZWFucyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSBjbGllbnQgdmlld3MgYmVjYXVzZSBvZiBpbmhlcml0YW5jZSBvciByZWxhdGlvbnNoaXAgcnVsZXMuICBUaGVzZSBiZWFucyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgYW5kIGNsaWVudCB2aWV3cyB3aWxsIGJlIGdlbmVyYXRlZC4KLUZJTEVTX09VVF9PRl9TWU5DPUNhbm5vdCBtaWdyYXRlIGJlY2F1c2Ugc29tZSByZXNvdXJjZXMgYXJlIG91dC1vZi1zeW5jIHdpdGggdGhlIGZpbGUgc3lzdGVtIGluIHByb2plY3QgezB9LiAgUmVmcmVzaCB0aGUgcHJvamVjdCBhbmQgdHJ5IGFnYWluLgotU0VSVkVSX1RBUkdFVF9TRVRUSU5HX0ZBSUxFRF9VSV89U2V0dGluZyBvZiB0YXJnZXQgc2VydmVyIGZhaWxlZDogezB9LgotUmVtb3ZlQ29tcGF0aWJpbGl0eUFjdGlvbkRlbGVnYXRlX1VJXzA9V2FybmluaWcKLVJlbW92ZUNvbXBhdGliaWxpdHlBY3Rpb25EZWxlZ2F0ZV9VSV8xPUNvbnRpbnVlIFJlbW92aW5nIEJhY2t3YXJkIENvbXBhdGliaWxpdHkgZnJvbSBQcm9qZWN0cz8KLUpheHJwY21hcFNwZWNpZmljYXRpb25NaWdyYXRvcl9VSV8xPWpheHJwYyBtYXBwaW5nIG1pZ3JhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci1KYXhycGNtYXBTcGVjaWZpY2F0aW9uTWlncmF0b3JfVUlfMj1NaWdyYXRpb24gb2YgamF4cnBjIG1hcHBpbmcgZGVzY3JpcHRvciBpcyBub3QgcG9zc2libGUgYmVjYXVzZSB0aGUgbW9kdWxlIHJvb3QgZm9sZGVyIHdhcyBub3QgZm91bmQuCi1XZWJTZXJ2aWNlc0NsaWVudFNwZWNpZmljYXRpb25NaWdyYXRvcl9VSV8wPVdlYiBzZXJ2aWNlcyBjbGllbnQgbWlncmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCi1XZWJTZXJ2aWNlc0NsaWVudFNwZWNpZmljYXRpb25NaWdyYXRvcl9VSV8xPUEgdmFsaWQgcHJvamVjdCBpcyByZXF1aXJlZCBmb3IgV2Vic2VydmljZXMgTWlncmF0aW9uCi1XZWJTZXJ2aWNlc0NsaWVudFNwZWNpZmljYXRpb25NaWdyYXRvcl9VSV8yPUNvdWxkIG5vdCBsb2NhdGUgV2Vic2VydmljZXMuCi1XZWJTZXJ2aWNlc0NsaWVudFNwZWNpZmljYXRpb25NaWdyYXRvcl9VSV8zPVRoZXJlIGlzIG5vIHdlYnNlcnZpY2VzIGNsaWVudCBmaWxlIHRvIG1pZ3JhdGUuCi1XZWJTZXJ2aWNlc1NwZWNpZmljYXRpb25NaWdyYXRvcl9VSV8wPVdlYiBzZXJ2aWNlcyBtaWdyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KLVdlYlNlcnZpY2VzU3BlY2lmaWNhdGlvbk1pZ3JhdG9yX1VJXzE9Tm8gV2ViIHNlcnZpY2VzIG1pZ3JhdGlvbiB3YXMgcmVxdWlyZWQKLUoyRUVQcm9qZWN0U3RydWN0dXJlTWlncmF0aW9uT3BlcmF0aW9uX1VJXzQ9TWlncmF0aW9uIG9mIFdlYiBQcm9qZWN0IHZlcnNpb24gc3VjY2Vzc2Z1bAotSjJFRVByb2plY3RTdHJ1Y3R1cmVNaWdyYXRpb25PcGVyYXRpb25fVUlfMD0iUHJvamVjdCB7MH0gLS0gUmVuYW1lZCBcJ3sxfSBcJyB0byBcJ3syfVwnLgotSjJFRVByb2plY3RTdHJ1Y3R1cmVNaWdyYXRpb25PcGVyYXRpb25fVUlfMT1Qcm9ibGVtIHJlbmFtaW5nIGphdmEgc291cmNlOiB7MH0uCi1KMkVFUHJvamVjdFN0cnVjdHVyZU1pZ3JhdGlvbk9wZXJhdGlvbl9VSV8yPSJQcm9ibGVtIHJlbmFtaW5nIHdlYiBjb250ZW50OiB7MH0uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzkwYzVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJzZXJ2aWNlc191aS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2MTk4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1zZXJ2bGV0dWkuamFyCi13ZWJzZXJ2aWNldWkuamFyCi1AZG90CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODYzNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZXMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0uZXRvb2xzLmN0Yy5qYXZhcHJvamVjdG5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWNlM2UwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFdUUCBXZWJzZXJ2aWNlIFVJIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2VzLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjcuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmphdmEsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3Iudmlld3MsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLndzZGw0aiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjQ4MTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHByb3BlcnR5X2ZpbGVzLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdlYnNlcnZpY2VzX3VpLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkODU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWVhZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhYzZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWJzZXJ2aWNlZGVzYy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYnNlcnZpY2VkZXNjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvd3NkbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9pY29ucy9mdWxsL2N0b29sMTYvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmEwNThlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cy5uYXZpZ2F0b3JDb250ZW50Ij4KLSAgICAgIDxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgICAgICBuYW1lPSJXZWIgU2VydmljZXMiCi0gICAgICAgICAgICBwcmlvcml0eT0ibG93IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZiIKLSAgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZXNOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyIgotICAgICAgICAgICAgb3Blbkxpc3RlbmVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VzTmF2aWdhdG9yR3JvdXBPcGVuTGlzdGVuZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci53ZWJzZXJ2aWNlIgotICAgICAgICAgICAgPgotICAgICAgICAgPGVuYWJsZXM+Ci0gICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgCQluYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUiPgotICAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsIj4KLSAgICAgICAgICAgICAgIDwvb2JqZWN0Q2xhc3M+Ci0gICAgICAgICAgICA8L29yPgotICAgICAgICAgPC9lbmFibGVzPgotICAgICAgICAgPGVtZkVuYWJsZW1lbnQ+Ci0gICAgICAgICAJPHBhY2thZ2UgdXJpPSJ3c2RkLnhtaSIgLz4gICAgICAgICAgICAgICAgIAkKLSAgICAgICAgIAk8cGFja2FnZSB1cmk9IndlYnNlcnZpY2VfY2xpZW50LnhtaSIgLz4gICAgICAgICAgIAkgICAgICAgICAJCi0gICAgICAgICAJPHBhY2thZ2UgdXJpPSJ3c2NvbW1vbi54bWkiIC8+Ci0gICAgICAgICAJPHBhY2thZ2UgdXJpPSJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL1dTREwiLz4KLSAgICAgICAgIDwvZW1mRW5hYmxlbWVudD4KLSAgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICAKLSAgIDwhLS0gSjJFRSBWaWV3IFdlYiBTZXJ2aWNlcyBjb250cmlidXRpb24gLS0+Ci0gICAKLSA8IS0tIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci52aWV3cy5uYXZpZ2F0b3JWaWV3ZXIiPgotICAgICAgPG5hdmlnYXRvclZpZXdlcgotICAgICAgICAgICAgcm9vdENvbnRlbnRFeHRlbnNpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm5hdmlnYXRvci53ZWJzZXJ2aWNlIgotICAgICAgICAgICAgdmlld2VySWQ9Im9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIj4KLSAgICAgIDwvbmF2aWdhdG9yVmlld2VyPgotICAgPC9leHRlbnNpb24+IC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3Iudmlld3MubmF2aWdhdG9yVmlld2VyIj4KLSAgICAgIDxuYXZpZ2F0b3JWaWV3ZXIKLSAgICAgICAgICAgIHJvb3RDb250ZW50RXh0ZW5zaW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5uYXZpZ2F0b3Iud2Vic2VydmljZSIKLSAgICAgICAgICAgIHZpZXdlcklkPSJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUFdvcmtpbmdTZXRDb21tb25OYXZpZ2F0b3IiPgotICAgICAgPC9uYXZpZ2F0b3JWaWV3ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2V1aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2V1aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODAzYzMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS9wcm9wZXJ0eV9maWxlcy93ZWJzZXJ2aWNldWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5FV19CVVRUT05fTEFCRUw9TmV3Li4uCi1ORVdfSEFORExFUl9XSVpBUkRfV0lORE9XX1RJVExFPU5ldyBIYW5kbGVyCi1ORVdfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRT1XZWIgU2VydmljZSBIYW5kbGVyCi1ORVdfSEFORExFUl9XSVpBUkRfUEFHRV9ERVNDPUNyZWF0ZSBhIG5ldyB3ZWIgc2VydmljZSBoYW5kbGVyLgotSEFORExFUl9ESVNQTEFZX05BTUVfTEFCRUw9RGlzcGFseSBuYW1lOgotSEFORExFUl9ERVNDUklQVElPTl9MQUJFTD1EZXNjcmlwdGlvbjoKLUhBTkRMRVJfTkFNRV9MQUJFTD1IYW5kbGVyIG5hbWU6Ci1IQU5ETEVSX0NMQVNTX05BTUVfTEFCRUw9SGFuZGxlciBjbGFzczoKLUhBTkRMRVJfSU5JVF9QQVJBTV9XSVpBUkRfV0lORE9XX1RJVExFPUhhbmRsZXIgSW5pdGlhbGl6YXRpb24gUGFyYW1ldGVyCi1IQU5ETEVSX0lOSVRfUEFSQU1fV0laQVJEX1BBR0VfVElUTEU9RW50ZXIgSGFuZGxlciBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXIKLUhBTkRMRVJfSU5JVF9QQVJBTV9XSVpBUkRfUEFHRV9ERVNDPUNyZWFyZSBhIG5ldyBoYW5kbGVyIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4KLUhBTkRMRVJfU09BUF9IRUFERVJfV0laQVJEX1dJTkRPV19USVRMRT1IYW5kbGVyIFNPQVAgSGVhZGVycwotSEFORExFUl9TT0FQX0hFQURFUl9XSVpBUkRfUEFHRV9USVRMRT1FbnRlciBIYW5kbGVyIFNPQVAgSGVhZGVycwotSEFORExFUl9TT0FQX0hFQURFUl9XSVpBUkRfUEFHRV9ERVNDPUNyZWF0ZSBhIG5ldyBTT0FQIGhlYWRlci4KLUhBTkRMRVJfTkFNRVNQQUNFX1VSTF9MQUJFTD1OYW1lc3BhY2UgVVJMOgotSEFORExFUl9MT0NBTF9QQVJUX0xBQkVMPUxvY2FsIHBhcnQ6Ci1Qb3J0Q29tcG9uZW50UmVmTGFiZWxQcm92aWRlcl9VSV8xPVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOgotUG9ydENvbXBvbmVudFJlZkxhYmVsUHJvdmlkZXJfVUlfMj1Qb3J0IENvbXBvbmVudCBMaW5rOgotV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZV9VSV8wPVNlcnZpY2VzCi1XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlX1VJXzE9Q2xpZW50cwotV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZV9VSV8yPUhhbmRsZXJzCi1XZWJTZXJ2aWNlRmlsZXNDb250cmlidXRpb25fVUlfMD1GaWxlcwotV2ViU2VydmljZUdyb3VwQ29udGVudEV4dGVuc2lvbl9VSV8xPVdlYiBCcm93c2VyCi1XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBfVUlfMD1XZWIgU2VydmljZXMKLVNlcnZlcl9JbnZhbGlkX0Zvcl9FeGlzaXRuZ19FQVJfVUlfPVNlbGVjdGVkIHRhcmdldCBzZXJ2ZXIgInswfSIgaXMgaW52YWxpZCBmb3IgdGhlIGV4aXN0aW5nIEVBUiBwcm9qZWN0ICJ7MX0iCi1TZXJ2aWNlUmVmZXJlbmNlU2VsZWN0aW9uV2l6YXJkX1VJXzY9U2VydmljZSBSZWZlcmVuY2UgU2VsZWN0aW9uCi1TZXJ2aWNlUmVmZXJlbmNlU2VsZWN0aW9uV2l6YXJkX1VJXzc9U2VydmljZSBSZWZlcmVuY2UgU25pcHBldAotU2VydmljZVJlZmVyZW5jZVNlbGVjdGlvblBhZ2VfVUlfMD1TZWxlY3QgYSBTZXJ2aWNlIFJlZmVyZW5jZQotU2VydmljZVJlZmVyZW5jZVNlbGVjdGlvblBhZ2VfVUlfMT1TZXJ2aWNlIFJlZmVyZW5jZSBvd25lcjoKLVNlcnZpY2VSZWZlcmVuY2VTZWxlY3Rpb25QYWdlX1VJXzI9TmV3IFNlcnZpY2UgUmVmZXJlbmNlLi4uCi1TRVJWSUNFX0NMQVNTRVNfVUlfPVNlcnZpY2UgQ2xhc3NlcwotUE9SVF9VSV89UG9ydDoKLUhBTkRMRVJfVUlfPUhhbmRsZXI6Ci1XU0RMX1BPUlRfVUlfPVdTREwgUG9ydDoKLVNFUlZJQ0VfSU1QTF9VSV89U2VydmljZUltcGw6Ci1XU0RMX1VJXz1XU0RMOgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL09wZW5FeHRlcm5hbFdTRExBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL09wZW5FeHRlcm5hbFdTRExBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljNzRkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9PcGVuRXh0ZXJuYWxXU0RMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE9wZW5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRXh0ZXJuYWxXU0RMQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuQWN0aW9uIHsKLQotCVN0cmluZyB1cmkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgT3BlbkV4dGVybmFsV1NETEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJdGhpcy5zZXRJbWFnZURlc2NyaXB0b3IoQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy93ZWJfdHlwZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7IAotCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IGJyb3dzZXJTdXBwb3J0LmNyZWF0ZUJyb3dzZXIoSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkxPQ0FUSU9OX0JBUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5OQVZJR0FUSU9OX0JBUiwiV1NETCIsIiIsIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJYnJvd3Nlci5vcGVuVVJMKG5ldyBVUkwodXJpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsKLQkJT2JqZWN0IG9iaiA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAoc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShvYmopKQotCQkJdXJpID0gKChSZXNvdXJjZSkgb2JqKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2M0NWQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEVNRkFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJV3NkZFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAoc2VydmljZUhlbHBlci5pc1NlcnZpY2UoYWRhcHRhYmxlT2JqZWN0KSkKLQkJCXJlcyA9IFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFdzZGRSZXNvdXJjZSgoRU9iamVjdCkgYWRhcHRhYmxlT2JqZWN0KTsKLQotCQlpZiAocmVzICE9IG51bGwgJiYgYWRhcHRlclR5cGUgPT0gRU1GQWRhcHRlckZhY3RvcnkuSUZJTEVfQ0xBU1MpCi0JCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpOwotCQllbHNlIGlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBFTUZBZGFwdGVyRmFjdG9yeS5JUkVTT1VSQ0VfQ0xBU1MpCi0JCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpOwotCQllbHNlIGlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBFTUZBZGFwdGVyRmFjdG9yeS5JUFJPSkVDVF9DTEFTUykKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VGaWxlc0NvbnRyaWJ1dGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZUZpbGVzQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNmE2MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZUZpbGVzQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VGaWxlc0NvbnRyaWJ1dGlvbiB7Ci0KLQlwcm90ZWN0ZWQgV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2U7Ci0JcHJvdGVjdGVkIExpc3QgYWxsRmlsZXMgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUZpbGVzQ29udHJpYnV0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2ViU2VydmljZSA9IHdlYlNlcnZpY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2ViU2VydmljZUZpbGVzQ29udHJpYnV0aW9uX1VJXzAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V1NETEZpbGUoKSB7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlLmdldFdzZGxGaWxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIHdlYlNlcnZpY2UuZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBbGxGaWxlcygpIHsKLQkJaWYgKGFsbEZpbGVzID09IG51bGwpIHsKLQkJCWFsbEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYWxsRmlsZXMuYWRkKGdldFdTRExGaWxlKCkpOwotCQkJYWxsRmlsZXMuYWRkKGdldE1hcHBpbmdGaWxlKCkpOwotCQl9Ci0JCXJldHVybiBhbGxGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2UuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBnZXRXZWJTZXJ2aWNlKCkgewotCQlyZXR1cm4gd2ViU2VydmljZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODc4ZWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjAsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAgewotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWwgPSBXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBfVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJV29ya3NwYWNlUm9vdCByb290OwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAoSVdvcmtzcGFjZVJvb3Qgd3NSb290KSB7Ci0JCXN1cGVyKCk7Ci0JCXJvb3QgPSB3c1Jvb3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByb290LgotCSAqLwotCXB1YmxpYyBJV29ya3NwYWNlUm9vdCBnZXRSb290KCkgewotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgVGhlIHJvb3QgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3QoSVdvcmtzcGFjZVJvb3Qgcm9vdCkgewotCQl0aGlzLnJvb3QgPSByb290OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllYjZmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBpbXBsZW1lbnRzIElBY3Rpb25GaWx0ZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRVMgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVFMgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRMRVJTID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VTX1VJID0gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZV9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRTX1VJID0gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZV9VSV8xIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSU19VSSA9IFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGVfVUlfMiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGludCBUWVBFOwotCXByaXZhdGUgRU9iamVjdCB3c2RsU2VydmljZSA9IG51bGw7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3BlY2lmaWMgdHlwZSBvZiB3ZWIgc2VydmljZSBuYXZpZ2F0b3IgZ3JvdXBpbmcKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShpbnQgZ3JvdXBUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCVRZUEUgPSBncm91cFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3BlY2lmaWMgdHlwZSBvZiB3ZWIgc2VydmljZSBuYXZpZ2F0b3IgZ3JvdXBpbmcKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShpbnQgZ3JvdXBUeXBlLCBFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCXN1cGVyKCk7Ci0JCVRZUEUgPSBncm91cFR5cGU7Ci0JCXRoaXMud3NkbFNlcnZpY2UgPSB3c2RsU2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzcGVjaWZpYyB0eXBlIG9mIHdlYiBzZXJ2aWNlIG5hdmlnYXRvciBncm91cGluZwotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKGludCBncm91cFR5cGUsIFNlcnZpY2VSZWYgc2VydmljZVJlZikgewotCQlzdXBlcigpOwotCQlUWVBFID0gZ3JvdXBUeXBlOwotCQl0aGlzLnNlcnZpY2VSZWYgPSBzZXJ2aWNlUmVmOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgVFlQRS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEdyb3VwVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlcygpIHsKLQkJcmV0dXJuIGdldEdyb3VwVHlwZSgpID09IFNFUlZJQ0VTOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50cygpIHsKLQkJcmV0dXJuIGdldEdyb3VwVHlwZSgpID09IENMSUVOVFM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVycygpIHsKLQkJcmV0dXJuIGdldEdyb3VwVHlwZSgpID09IEhBTkRMRVJTOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldFdzZGxTZXJ2aWNlKCkgewotCQlyZXR1cm4gd3NkbFNlcnZpY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoaXNTZXJ2aWNlcygpKQotCQkJcmV0dXJuIFNFUlZJQ0VTX1VJOwotCQllbHNlIGlmIChpc0NsaWVudHMoKSkKLQkJCXJldHVybiBDTElFTlRTX1VJOwotCQllbHNlIGlmIChpc0hhbmRsZXJzKCkpCi0JCQlyZXR1cm4gSEFORExFUlNfVUk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlciN0ZXN0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQlXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGdyb3VwID0gKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHRhcmdldDsKLQkJCWlmIChncm91cC5pc0NsaWVudHMoKSAmJiB2YWx1ZS5lcXVhbHMoQ0xJRU5UU19VSSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlIGlmIChncm91cC5pc1NlcnZpY2VzKCkgJiYgdmFsdWUuZXF1YWxzKFNFUlZJQ0VTX1VJKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UgaWYgKGdyb3VwLmlzSGFuZGxlcnMoKSAmJiB2YWx1ZS5lcXVhbHMoSEFORExFUlNfVUkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZpY2VSZWYuCi0JICovCi0JcHVibGljIFNlcnZpY2VSZWYgZ2V0U2VydmljZVJlZigpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWY7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzFjYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIndlYnNlcnZpY2V1aSIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0KLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbmxzQ29uY2F0ZW5hdGlvbkZpbmRlcigpIHsKLQkJLy8gdXNlZCB0byB0YWcgbWV0aG9kcyB3aGljaCBoYXZlIGNvbmNhdGVuYXRlZCBzdHJpbmdzCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYmUzNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC5wcm92aWRlcnMuQ29tbW9uQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXIuV2ViU2VydmljZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXIuV2ViU2VydmljZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5EeW5hbWljQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlld3MuSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBDb21tb25BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIsIFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlc01hbmFnZXIgd2ViU2VydmljZXNNYW5hZ2VyID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gYWN0aXZpdHlFbmFibGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAgd2ViU2VydmljZU5hdmlnYXRvckdyb3VwOwotCXByaXZhdGUgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBTRVJWSUNFUyA9IG51bGw7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIENMSUVOVFMgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBIQU5ETEVSUyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFZJRVdFUl9JRCA9ICJvcmcuZWNsaXBzZS53c3QubmF2aWdhdG9yLnVpLldUUENvbW1vbk5hdmlnYXRvciI7Ly8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgVHJlZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQotCXB1YmxpYyBXZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoY3JlYXRlQWRhcHRlckZhY3RvcnkoKSk7Ci0JCVdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKHRoaXMpOwotCQkvLyBjcmVhdGUgdGhlIGRlZmF1bHQgc3luY2hyb25pemVyIGZvciBhbnkgd2ViIHNlcnZpY2UgZWRpdG9yIHRvIHVzZSB3aXRoIHZpZXcgZHVlCi0JCS8vIHRvIHRoZSB1c2FnZSBvZiBzZXBlcmF0ZSBlZGl0IG1vZGVscy4KLQkJV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIuY3JlYXRlSW5zdGFuY2UoY3JlYXRlQWRhcHRlckZhY3RvcnkoKSwgdGhpcyk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBDb25maWd1cmUgYW5kIHJldHVybiBhIGNvbXBvc2l0ZSBhZGFwdGVyIGZhY3RvcnkgZm9yIG91ciBjb250ZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KFZJRVdFUl9JRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotLy8JCWlmICghTmF2aWdhdG9yQWN0aXZpdHlIZWxwZXIuaXNBY3Rpdml0eUVuYWJsZWQoZ2V0Q29udGFpbmluZ0V4dGVuc2lvbigpKSkgewotLy8JCQlhY3Rpdml0eUVuYWJsZWQgPSBmYWxzZTsKLS8vCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotLy8JCX0KLS8vCQlhY3Rpdml0eUVuYWJsZWQgPSB0cnVlOwotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXtnZXRXZWJTZXJ2aWNlc05hdmlnYXRvckdyb3VwKHBhcmVudEVsZW1lbnQpfTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtde2dldFNlcnZpY2VzR3JvdXAoKSwgZ2V0Q2xpZW50c0dyb3VwKCl9OwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlICYmICgoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgcGFyZW50RWxlbWVudCkuaXNTZXJ2aWNlcygpKSB7Ci0JCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlc3VsdC5hZGRBbGwoZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkuZ2V0SW50ZXJuYWxXU0RMU2VydmljZXMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKGdldFdlYlNlcnZpY2VzTWFuYWdlcigpLmdldEV4dGVybmFsV1NETFNlcnZpY2VzKCkpOwotCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgJiYgKChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSBwYXJlbnRFbGVtZW50KS5pc0NsaWVudHMoKSkgewotCQkJcmV0dXJuIGdldFdlYlNlcnZpY2VzTWFuYWdlcigpLmdldEFsbFdvcmtzcGFjZVNlcnZpY2VSZWZzKCkudG9BcnJheSgpOwotCQl9IGVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNTZXJ2aWNlKHBhcmVudEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gZ2V0U2VydmljZUxldmVsTm9kZXMocGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlICYmICgoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgcGFyZW50RWxlbWVudCkuaXNIYW5kbGVycygpKSB7Ci0JCQlyZXR1cm4gZ2V0SGFuZGxlckNoaWxkcmVuKHBhcmVudEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgU2VydmljZVJlZikgewotCQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyZXN1bHQuYWRkKGdldEhhbmRsZXJzR3JvdXAocGFyZW50RWxlbWVudCkpOwotCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEhhbmRsZXIgfHwgcGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcikgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKS50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAoc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShwYXJlbnRFbGVtZW50KSkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCkudG9BcnJheSgpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFNlcnZpY2VMZXZlbE5vZGVzKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBhZGQgc2VydmljZSBjbGFzc2VzCi0JCWlmIChnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5pc1NlcnZpY2VJbnRlcm5hbCgoRU9iamVjdCkgcGFyZW50RWxlbWVudCkgJiYgZ2V0V2ViU2VydmljZXNNYW5hZ2VyKCkuZ2V0U2VydmljZUltcGxCZWFuKChFT2JqZWN0KSBwYXJlbnRFbGVtZW50KSAhPSBudWxsKQotCQkJcmVzdWx0LmFkZChnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5nZXRTZXJ2aWNlSW1wbEJlYW4oKEVPYmplY3QpIHBhcmVudEVsZW1lbnQpKTsKLQkJLy8gQWRkIGhhbmRsZXJzCi0JCWlmIChnZXRXZWJTZXJ2aWNlc01hbmFnZXIoKS5pc1NlcnZpY2VJbnRlcm5hbCgoRU9iamVjdCkgcGFyZW50RWxlbWVudCkpCi0JCQlyZXN1bHQuYWRkKGdldEhhbmRsZXJzR3JvdXAocGFyZW50RWxlbWVudCkpOwotCQkvL2FkZCB3c2RsIGZpbGUKLQkJUmVzb3VyY2Ugd3NkbCA9IGdldFdlYlNlcnZpY2VzTWFuYWdlcigpLmdldFdTRExSZXNvdXJjZSgoRU9iamVjdCkgcGFyZW50RWxlbWVudCk7Ci0JCWlmICh3c2RsICE9IG51bGwpCi0JCQlyZXN1bHQuYWRkKHdzZGwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRIYW5kbGVyQ2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgaGFuZGxlcnNHcm91cCA9IChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSBwYXJlbnRFbGVtZW50OwotCQkvLyBoYW5kbGUgd2ViIHNlcnZpY2UgaGFuZGxlcnMgY2FzZQotCQlpZiAoaGFuZGxlcnNHcm91cC5nZXRXc2RsU2VydmljZSgpICE9IG51bGwpIHsKLQkJCVBvcnRDb21wb25lbnQgcG9ydCA9IFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFBvcnRDb21wb25lbnQoaGFuZGxlcnNHcm91cC5nZXRXc2RsU2VydmljZSgpKTsKLQkJCWlmIChwb3J0ICE9IG51bGwgJiYgcG9ydC5nZXRIYW5kbGVycygpICE9IG51bGwgJiYgIXBvcnQuZ2V0SGFuZGxlcnMoKS5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbChwb3J0LmdldEhhbmRsZXJzKCkpOwotCQl9Ci0JCS8vIGhhbmRsZSBzZXJ2aWNlIHJlZiBjYXNlCi0JCWVsc2UgaWYgKGhhbmRsZXJzR3JvdXAuZ2V0U2VydmljZVJlZigpICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hZGRBbGwoaGFuZGxlcnNHcm91cC5nZXRTZXJ2aWNlUmVmKCkuZ2V0SGFuZGxlcnMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50RWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwIGdldFdlYlNlcnZpY2VzTmF2aWdhdG9yR3JvdXAoT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKHdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cCA9PSBudWxsKQotCQkJd2ViU2VydmljZU5hdmlnYXRvckdyb3VwID0gbmV3IFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cCgoSVdvcmtzcGFjZVJvb3QpIHBhcmVudEVsZW1lbnQpOwotCQlyZXR1cm4gd2ViU2VydmljZU5hdmlnYXRvckdyb3VwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKQotCQkJcmV0dXJuICgoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKSBlbGVtZW50KS5nZXRSb290KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFWaWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIFRPRE8gaGFuZGxlIGNoYW5nZSBldmVudHMKLQkJaWYgKGFWaWV3ZXIgIT1udWxsICYmIGFWaWV3ZXIgaW5zdGFuY2VvZiBUcmVlVmlld2VyKQotCQkJdmlld2VyID0gKFRyZWVWaWV3ZXIpYVZpZXdlcjsKLQkJc3VwZXIuaW5wdXRDaGFuZ2VkKGFWaWV3ZXIsb2xkSW5wdXQsbmV3SW5wdXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCS8vIGRpc3Bvc2UgY3VycmVudCBpbnN0YW5jZSBvZiB3ZWIgc2VydmljZSBlZGl0b3IvZXhwbG9yZXIgc3luY2hyb25pemVyCi0JCVdlYlNlcnZpY2VzTmF2aWdhdG9yU3luY2hyb25pemVyLmRpc3Bvc2VJbnN0YW5jZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3ZWJTZXJ2aWNlTWFuYWdlckNoYW5nZWQoV2ViU2VydmljZUV2ZW50IGFuRXZlbnQpIHsKLQkJaWYgKGdldFZpZXdlcigpPT1udWxsKSByZXR1cm47Ci0JCURpc3BsYXkgZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkID0gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJaWYgKGQgIT0gRGlzcGxheS5nZXRDdXJyZW50KCkgJiBkICE9IG51bGwpIHsKLQkJCWQuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0Vmlld2VyKCkucmVmcmVzaChnZXROYXZpZ2F0b3JHcm91cCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfSBlbHNlCi0JCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKGdldE5hdmlnYXRvckdyb3VwKCkpOyAKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBuYXZpZ2F0b3JHcm91cC4KLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwIGdldE5hdmlnYXRvckdyb3VwKCkgewotCQlpZiAobnVsbCA9PSB3ZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXApIHsKLQkJCXdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cCA9IG5ldyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCX0KLQkJcmV0dXJuIHdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgV2ViU2VydmljZXNNYW5hZ2VyIGdldFdlYlNlcnZpY2VzTWFuYWdlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VzTWFuYWdlciA9PSBudWxsKQotCQkJd2ViU2VydmljZXNNYW5hZ2VyID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlc01hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhY3Rpdml0eUVuYWJsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3Rpdml0eUVuYWJsZWQoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVuYWJsZWQ7Ci0JfQotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGdldFNlcnZpY2VzR3JvdXAoKSB7Ci0JCWlmIChTRVJWSUNFUyA9PSBudWxsKQotCQkJU0VSVklDRVMgPSBuZXcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlLlNFUlZJQ0VTKTsKLQkJcmV0dXJuIFNFUlZJQ0VTOwotCX0KLQotCXByaXZhdGUgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBnZXRDbGllbnRzR3JvdXAoKSB7Ci0JCWlmIChDTElFTlRTID09IG51bGwpCi0JCQlDTElFTlRTID0gbmV3IFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZS5DTElFTlRTKTsKLQkJcmV0dXJuIENMSUVOVFM7Ci0JfQotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIGdldEhhbmRsZXJzR3JvdXAoT2JqZWN0IGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSBoYW5kbGVyID0gbnVsbDsKLQkJaGFuZGxlciA9IChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSBIQU5ETEVSUy5nZXQoa2V5KTsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCWlmIChzZXJ2aWNlSGVscGVyLmlzU2VydmljZShrZXkpKQotCQkJCWhhbmRsZXIgPSBuZXcgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZShXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlLkhBTkRMRVJTLCAoRU9iamVjdCkga2V5KTsKLQkJCWVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpCi0JCQkJaGFuZGxlciA9IG5ldyBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUuSEFORExFUlMsIChTZXJ2aWNlUmVmKSBrZXkpOwotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQlIQU5ETEVSUy5wdXQoa2V5LCBoYW5kbGVyKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIFRyZWVWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckdyb3VwT3Blbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckdyb3VwT3Blbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTZhMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cE9wZW5MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuT3BlbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmNvbXBvbmVudGNvcmUudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSjJFRVJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNOYXZpZ2F0b3JHcm91cE9wZW5MaXN0ZW5lciBpbXBsZW1lbnRzIElPcGVuTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBPcGVuRXh0ZXJuYWxXU0RMQWN0aW9uIG9wZW5FeHRlcm5hbFdTRExBY3Rpb24gPSBuZXcgT3BlbkV4dGVybmFsV1NETEFjdGlvbihXZWJTZXJ2aWNlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWJTZXJ2aWNlR3JvdXBDb250ZW50RXh0ZW5zaW9uX1VJXzEiKSk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE9wZW5KMkVFUmVzb3VyY2VBY3Rpb24gb3BlbkFjdGlvbiA9IG5ldyBPcGVuSjJFRVJlc291cmNlQWN0aW9uKCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JT3Blbkxpc3RlbmVyI29wZW4ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5PcGVuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbihPcGVuRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpPT1udWxsKQotCQkJcmV0dXJuOwotCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZXJ2aWNlSGVscGVyPT1udWxsKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKHNlbGVjdGVkT2JqZWN0KSkgewotCQkJUmVzb3VyY2Ugd3NkbCA9IChSZXNvdXJjZSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlJRmlsZSB3c2RsRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUod3NkbCk7Ci0JCQlpZiAod3NkbEZpbGUgPT0gbnVsbCB8fCAhd3NkbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlvcGVuRXh0ZXJuYWxXU0RMQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQkJCQlvcGVuRXh0ZXJuYWxXU0RMQWN0aW9uLnJ1bigpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJb3BlbkFjdGlvbi5ydW4oKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsKSB7Ci0JCQlXc2RkUmVzb3VyY2UgcmVzb3VyY2UgPSBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRXc2RkUmVzb3VyY2UoKFNlcnZpY2VJbXBsKXNlbGVjdGVkT2JqZWN0KTsKLQkJCUxpc3Qgd3NkZFNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdzZGRTZWxlY3Rpb24uYWRkKHJlc291cmNlKTsKLQkJCQotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzZGRTZWxlY3Rpb24pKTsKLQkJCW9wZW5BY3Rpb24ucnVuKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKSB7Ci0JCQlpZiAoIVdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzSjJFRTE0KChTZXJ2aWNlUmVmKXNlbGVjdGVkT2JqZWN0KSkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kQ29tcG9uZW50KChTZXJ2aWNlUmVmKXNlbGVjdGVkT2JqZWN0KTsKLQkJCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJCQlMaXN0IG1vZHVsZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kdWxlLmFkZChhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpKTsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kdWxlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpCi0JCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJb3BlbkFjdGlvbi5ydW4oKTsKLQkJfQotCQllbHNlIHsKLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJb3BlbkFjdGlvbi5ydW4oKTsKLQkJfQkKLQl9Ci0JLy9UT0RPIGZpbGwgb3BlbiB3aXRoIG1lbnUgZm9yIHdlYiBzZXJ2aWNlcyBncm91cAotCQotLy8JcmV0dXJuIG5ldyBDb21tb25FZGl0QWN0aW9uR3JvdXAoZ2V0RXh0ZW5zaW9uU2l0ZSgpKSB7Ci0vLwkJcHVibGljIHZvaWQgZmlsbE9wZW5XaXRoTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotLy8JCQlpZiAoKGdldEV4dGVuc2lvblNpdGUoKS5nZXRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJlYW5MaW5rKSkgewotLy8JCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGdldEV4dGVuc2lvblNpdGUoKS5nZXRTZWxlY3Rpb24oKSk7Ci0vLwkJCQltZW51Lmluc2VydEFmdGVyKElDb21tb25NZW51Q29uc3RhbnRzLkNPTU1PTl9NRU5VX1RPUCwgb3BlbkFjdGlvbik7Ci0vLwkJCX0gZWxzZSBpZiAoKGdldEV4dGVuc2lvblNpdGUoKS5nZXRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpKSB7Ci0vLwkJCQlXU0RMUmVzb3VyY2VJbXBsIHdzZGwgPSAoV1NETFJlc291cmNlSW1wbCkgZ2V0RXh0ZW5zaW9uU2l0ZSgpLmdldFNlbGVjdGlvbigpLmdldEZpcnN0RWxlbWVudCgpOwotLy8JCQkJSUZpbGUgd3NkbEZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHdzZGwpOwotLy8JCQkJaWYgKHdzZGxGaWxlID09IG51bGwgfHwgIXdzZGxGaWxlLmV4aXN0cygpKSB7Ci0vLwkJCQkJb3BlbkV4dGVybmFsV1NETEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGdldEV4dGVuc2lvblNpdGUoKS5nZXRTZWxlY3Rpb24oKSk7Ci0vLwkJCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5DT01NT05fTUVOVV9UT1AsIG9wZW5FeHRlcm5hbFdTRExBY3Rpb24pOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI1MjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dlYlNlcnZpY2VzTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDE5LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc05hdmlnYXRvckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVklFV0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC5uYXZpZ2F0b3IudWkuV1RQQ29tbW9uTmF2aWdhdG9yIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFdlYlNlcnZpY2VzTmF2aWdhdG9yTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoY3JlYXRlQWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbmZpZ3VyZSBhbmQgcmV0dXJuIGEgY29tcG9zaXRlIGFkYXB0ZXIgZmFjdG9yeSBmb3Igb3VyIGNvbnRlbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBEeW5hbWljQWRhcHRlckZhY3RvcnkoVklFV0VSX0lEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIndlYlNlcnZpY2VzRm9sZGVyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid3NkbCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNTZXJ2aWNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNTZXJ2aWNlSW50ZXJuYWwoKEVPYmplY3QpIGVsZW1lbnQpKQotCQkJCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ3ZWJTZXJ2aWNlSXRlbVByb3ZpZGVyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZXh0d2Vic2VydmljZWl0ZW1wcm92aWRlcl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNXU0RMUmVzb3VyY2UoZWxlbWVudCkpCi0JCQlyZXR1cm4gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid3NkbCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJU3RyaW5nIHNwYWNlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uKQotCQkJcmV0dXJuIGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvblRleHQoKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgZWxlbWVudCk7Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50KQotCQkJcmV0dXJuIFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlBPUlRfVUlfIikgKyBzcGFjZSArIHN1cGVyLmdldFRleHQoZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhhbmRsZXIpCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSEFORExFUl9VSV8iKSArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV1NETFBvcnQpCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV1NETF9QT1JUX1VJXyIpICsgc3BhY2UgKyBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbEJlYW4pCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU0VSVklDRV9DTEFTU0VTX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFSkJMaW5rKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNFUlZJQ0VfSU1QTF9VSV8iKSArIHNwYWNlICsgc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmxldExpbmspCi0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU0VSVklDRV9JTVBMX1VJXyIpICsgc3BhY2UgKyBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHNlcnZpY2VIZWxwZXIuaXNTZXJ2aWNlKGVsZW1lbnQpKQotCQkJcmV0dXJuIHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZUxvY2FsUGFydChlbGVtZW50KTsKLQkJZWxzZSBpZiAoc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShlbGVtZW50KSkgewotCQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2UpIGVsZW1lbnQpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkJCXJlc3VsdCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9ICgoUmVzb3VyY2UpIGVsZW1lbnQpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gV2ViU2VydmljZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiV1NETF9VSV8iKSArIHNwYWNlICsgcmVzdWx0OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpIHsKLQkJCVN0cmluZyBiZWFuTmFtZTE0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0oyRUUxNCgoU2VydmljZVJlZikgZWxlbWVudCkpIHsKLQkJCQlpZiAoKChTZXJ2aWNlUmVmKSBlbGVtZW50KS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBTZXNzaW9uKQotCQkJCQliZWFuTmFtZTE0ID0gKChTZXNzaW9uKSAoKFNlcnZpY2VSZWYpIGVsZW1lbnQpLmVDb250YWluZXIoKSkuZ2V0TmFtZSgpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChTZXJ2aWNlUmVmKSBlbGVtZW50KS5nZXROYW1lKCkgKyAiOiAiICsgYmVhbk5hbWUxNCAvLyROT04tTkxTLTEkCi0JCQkJCQkrICgoU2VydmljZVJlZikgZWxlbWVudCkuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGV4dCBmb3Igd2ViIHNlcnZpY2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25UZXh0KFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlSZXNvdXJjZSByZXMgPSBkZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCVN0cmluZyBwcm9qU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlcyAhPSBudWxsKQotCQkJcHJvamVjdCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldFByb2plY3QocmVzKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCXByb2pTdHJpbmcgPSBwcm9qZWN0LmdldE5hbWUoKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHByb2pTdHJpbmcgKyBzdXBlci5nZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gYWRkIGFueSBsaXN0ZW5lcnM/Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gaGFuZGxlIGRpc3Bvc2UKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIFRPRE8gZG8gc29tZXRoaW5nIHNtYXJ0IGhlcmU/Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gaG93IGRvIHdlIHJlbW92ZSBsaXN0ZW5lcnM/Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmM2E1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9XZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDEwLCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnByb3ZpZGVycy5Db21tb25BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIgZXh0ZW5kcyBDb21tb25BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCi0KLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplciBJTlNUQU5DRSA9IG51bGw7Ci0JcHJvdGVjdGVkIE5vdGlmaWVyIHRhcmdldCA9IG51bGw7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlc05hdmlnYXRvckNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJY29udGVudFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlc05hdmlnYXRvclN5bmNocm9uaXplciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNOYXZpZ2F0b3JTeW5jaHJvbml6ZXIgY3JlYXRlSW5zdGFuY2UoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdlYlNlcnZpY2VzTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCUlOU1RBTkNFID0gbmV3IFdlYlNlcnZpY2VzTmF2aWdhdG9yU3luY2hyb25pemVyKGFkYXB0ZXJGYWN0b3J5LCBwcm92aWRlcik7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZUluc3RhbmNlKCkgewotCQlJTlNUQU5DRSA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2dldFRhcmdldCgpCi0JICovCi0JcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCXRhcmdldCA9IG5ld1RhcmdldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJRU9iamVjdCBub3RpZmllciA9IChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlcykKLQkJCXJldHVybjsKLQotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZ2V0Vmlld2VyKCkucmVmcmVzaChub3RpZmllcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXdoaWxlICghKG5vdGlmaWVyIGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uKSAmJiBub3RpZmllciAhPSBudWxsKQotCQkJbm90aWZpZXIgPSBub3RpZmllci5lQ29udGFpbmVyKCk7Ci0KLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgV2ViU2VydmljZURlc2NyaXB0aW9uICYmIG5vdGlmaWVyICE9bnVsbCkgewotCQkJRU9iamVjdCB3c2RsID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0V1NETFNlcnZpY2VGb3JXZWJTZXJ2aWNlKChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIG5vdGlmaWVyKTsKLQkJCWNvbnRlbnRQcm92aWRlci5nZXRWaWV3ZXIoKS5yZWZyZXNoKHdzZGwpOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV3NkbFJlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL1dzZGxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTNhMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLnVpL3dlYnNlcnZpY2VzX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvV3NkbFJlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV3NkbFJlc291cmNlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBFTUZBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdzZGxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCWlmIChzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKGFkYXB0YWJsZU9iamVjdCkpCi0JCQlyZXMgPSAoUmVzb3VyY2UpIGFkYXB0YWJsZU9iamVjdDsKLQotCQlpZiAocmVzICE9IG51bGwgJiYgYWRhcHRlclR5cGUgPT0gRU1GQWRhcHRlckZhY3RvcnkuSUZJTEVfQ0xBU1MpCi0JCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpICE9IG51bGwgPyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcykgOiBudWxsOwotCQllbHNlIGlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBFTUZBZGFwdGVyRmFjdG9yeS5JUkVTT1VSQ0VfQ0xBU1MpCi0JCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXMpOwotCQllbHNlIGlmIChyZXMgIT0gbnVsbCAmJiBhZGFwdGVyVHlwZSA9PSBFTUZBZGFwdGVyRmFjdG9yeS5JUFJPSkVDVF9DTEFTUykKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS51aS93ZWJzZXJ2aWNlc191aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNTFhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkvd2Vic2VydmljZXNfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlcy51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLwlUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTNiNDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJzZXJ2aWNlLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTI5YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd2Vic2VydmljZS5qYXIKLUBkb3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjZmI0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlMjQ2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBXZWIgU2VydmljZSBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjcuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IC4sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbXBvbmVudGNvcmUudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbnN0YW50cywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlciwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndzZGQucHJvdmlkZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LAotIG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwsCi0gb3JnLndzZGw0aiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbAotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzIzYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNvdXJjZS4uID0gd2Vic2VydmljZS8sXAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MGI2YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZXMudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc19zZXJ2aWNlUmVmc19TZXJ2aWNlUmVmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc19zZXJ2aWNlUmVmc19TZXJ2aWNlUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwZDhiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjA3NGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzA1MzU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZGY4ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZGQyNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzAwZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9pbml0UGFyYW1zX0luaXRQYXJhbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19Jbml0UGFyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjllNGJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9pbml0UGFyYW1zX0luaXRQYXJhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19QYXJhbVZhbHVlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9pbml0UGFyYW1zX1BhcmFtVmFsdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJmMmI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9pbml0UGFyYW1zX1BhcmFtVmFsdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1FOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19RTmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTNlMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1FOYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19TT0FQSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19TT0FQSGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjYTk1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfU09BUEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfV1NETFBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1dTRExQb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiOWFhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfV1NETFBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBSb2xlc19TT0FQUm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcFJvbGVzX1NPQVBSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1YjBiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcFJvbGVzX1NPQVBSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyMDJjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGVzY3JpcHRpb25UeXBlX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2Q0NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lVHlwZV9EaXNwbGF5TmFtZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2hhbmRsZXJzX0hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2hhbmRsZXJzX0hhbmRsZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWVlMzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9oYW5kbGVyc19IYW5kbGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9pY29uVHlwZV9JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfaWNvblR5cGVfSWNvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTBiN2ZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9pY29uVHlwZV9JY29uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfc2VydmljZUltcGxCZWFuX1NlcnZpY2VJbXBsQmVhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfc2VydmljZUltcGxCZWFuX1NlcnZpY2VJbXBsQmVhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2N2VlOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3NlcnZpY2VJbXBsQmVhbl9TZXJ2aWNlSW1wbEJlYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3dzZGxQb3J0X1dTRExQb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF93c2RsUG9ydF9XU0RMUG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2Y2ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3dzZGxQb3J0X1dTRExQb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX0JlYW5MaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX0JlYW5MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiYmM1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19CZWFuTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19FSkJMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX0VKQkxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U0NzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX0VKQkxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fYmVhbkxpbmtfU2VydmxldExpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fYmVhbkxpbmtfU2VydmxldExpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M2ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX1NlcnZsZXRMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2VFSkJMaW5rX0VKQkxpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZUVKQkxpbmtfRUpCTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTQ3MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZUVKQkxpbmtfRUpCTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9lU2VydmxldExpbmtfU2VydmxldExpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZVNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNmZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9lU2VydmxldExpbmtfU2VydmxldExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX2hhbmRsZXJzX0hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX2hhbmRsZXJzX0hhbmRsZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjY4MGNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9oYW5kbGVyc19IYW5kbGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9wb3J0Q29tcG9uZW50UmVmc19Qb3J0Q29tcG9uZW50UmVmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9wb3J0Q29tcG9uZW50UmVmc19Qb3J0Q29tcG9uZW50UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMTgwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfcG9ydENvbXBvbmVudFJlZnNfUG9ydENvbXBvbmVudFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1FOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfUU5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzA3YjM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfUU5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9TT0FQSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfU09BUEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjk5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9TT0FQSGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfV1NETFBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9XU0RMUG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWI0MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9XU0RMUG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2Rlc2NyaXB0aW9uVHlwZV9EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc3MjQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2Rlc2NyaXB0aW9uVHlwZV9EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kaXNwbGF5TmFtZVR5cGVfRGlzcGxheU5hbWVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwN2E4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kaXNwbGF5TmFtZVR5cGVfRGlzcGxheU5hbWVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2ljb25UeXBlX0ljb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2ljb25UeXBlX0ljb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZDc1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9pY29uVHlwZV9JY29uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9wb3J0Q29tcG9uZW50c19Qb3J0Q29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX3BvcnRDb21wb25lbnRzX1BvcnRDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJjMzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX3BvcnRDb21wb25lbnRzX1BvcnRDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlc0NsaWVudF9jb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlc0NsaWVudF9jb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTRkNzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfY29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnRTY29wZWRSZWZzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50X3NlcnZpY2VSZWZzX1NlcnZpY2VSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmY2ODhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzX3dlYlNlcnZpY2VEZXNjcmlwdGlvbnNfV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNfd2ViU2VydmljZURlc2NyaXB0aW9uc19XZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJhZDljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNfd2ViU2VydmljZURlc2NyaXB0aW9uc19XZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvQmVhbkxpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvQmVhbkxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTI0ZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0JlYW5MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9uZW50U2NvcGVkUmVmcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9uZW50U2NvcGVkUmVmcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9FSkJMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0VKQkxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzg1NGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0VKQkxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvSGFuZGxlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9IYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9IYW5kbGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1BvcnRDb21wb25lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvUG9ydENvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjY2MGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1BvcnRDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvUG9ydENvbXBvbmVudFJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlM2NmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NPQVBIZWFkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU09BUEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjk5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU09BUEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2aWNlSW1wbEJlYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZUltcGxCZWFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NzQ3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2aWNlSW1wbEJlYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZVJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2aWNlUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhYzRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2aWNlUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NlcnZsZXRMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NlcnZsZXRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkMzgxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2bGV0TGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XU0RMUG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XU0RMUG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDE1OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV1NETFBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTM0NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZGM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlc0NsaWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlc0NsaWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YWQ1ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZXNDbGllbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9pbml0aWFsaXpfcGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyYTU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9pbml0aWFsaXpfcGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWJlY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9zZXNzaW9uQmVhbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YjhhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9zZXNzaW9uQmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc3J2Y2VfZWxlbV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc3J2Y2VfZWxlbV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRjYjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NydmNlX2VsZW1fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3dzZGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvY29tcG9uZW50c2NvcGVkcmVmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9jb21wb25lbnRzY29wZWRyZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBiMDIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9jb21wb25lbnRzY29wZWRyZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L2hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L2hhbmRsZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzgzMzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9oYW5kbGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9wb3J0Y29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9wb3J0Y29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMGUyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvc2VydmljZXJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvc2VydmljZXJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGM1YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3NlcnZpY2VyZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3dlYnNlcnZpY2VkZXNjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi93ZWJzZXJ2aWNlZGVzYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy93c2NlZGl0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzY2VkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmM0MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzY2VkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvd3NlZGl0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzZWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllYzM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvd3NlZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9mb3JtX2Jhbm5lci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaW1hZ2VzL2Zvcm1fYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzBiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaW1hZ2VzL2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pbWFnZXMvaG9tZV9uYXYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9ob21lX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGM2NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9ob21lX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTY5NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9wZXJ0aWVzIGZvciBjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmF0ay51aQotIwotIyBFbnRyaWVzIGFyZSBvZiB0aGUgZm9ybSBDT05TVEFOVD1zdHJpbmcKLSMKLSMgRmlsZSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuYXRrLnVpL3BsdWdpbi5wcm9wZXJ0aWVzLCB3c2EuZXRvb2xzLndzLnByb3BlcnRpZXMsIGx1bmFyLCAyMDAzMDkyMmEgMjYKLSMgVmVyc2lvbiAxLjI2IDAzLzA5LzA5IDE2OjQxOjQ5Ci0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotCi0KLQotIwotIyBFZGl0IG1vZGVscwotIwotV1NERF9FRElUX01PREVMX05BTUU9V2ViIFNlcnZpY2VzIEVkaXQgTW9kZWwKLUVESVRPUl9FRElUTU9ERUxTX1dFQl9TRVJWSUNFUz1XZWIgU2VydmljZXMgRWRpdG9yIEVkaXQgTW9kZWwKLVdTQ0REX0VESVRfTU9ERUxfTkFNRT1XZWIgU2VydmljZXMgQ2xpZW50IEVkaXQgTW9kZWwKLUVESVRPUl9FRElUTU9ERUxTX1dFQl9TRVJWSUNFU19DTElFTlQ9V2ViIFNlcnZpY2VzIENsaWVudCBFZGl0b3IgRWRpdCBNb2RlbAotCi0jCi0jQ29tbW9uIEVkaXRvciBNZXNzYWdlcwotIwotVElUTEVfU0FWRV9FUlJPUj1TYXZlIEVycm9yCi1NU0dfU0FWRV9FUlJPUj1BbiBlcnJvciBvY2N1cnJlZCB3aGVuIGF0dGVtcHRpbmcgdG8gc2F2ZSBlZGl0b3IgY29udGVudHMuCi0KLSMKLSMgTWVzc2FnZXMgaW4gV2ViU2VydmljZXNFZGl0b3IKLSMKLQotIwotIyBNZXNzYWdlcyBpbiBXZWJTZXJ2aWNlc0NsaWVudEVkaXRvcgotIwotCi0KLQotIwotIyBNZXNzYWdlcyBpbiBXZWJTZXJ2aWNlc1BhZ2UKLSMKLQotCi0jCi0jIE1lc3NhZ2VzIGluIFBvcnRDb21wb25lbnRQYWdlCi0jCi0KLQotIwotIyBNZXNzYWdlcyBpbiBIYW5kbGVyUGFnZQotIwotCi0KLSMKLSMgTWVzc2FnZXMgaW4gV2ViU2VydmljZXNDbGllbnRQYWdlCi0jCi0KLQotIwotIyBNZXNzYWdlcyBpbiBTZXJ2aWNlUmVmUGFnZQotIwotCi0KLSMKLSMgTGFiZWxzCi0jCi1MQUJFTF9VTlFVQUxJRklFRF9DT01QT05FTlQ9PHVucXVhbGlmaWVkPgotTEFCRUxfU0VSVkxFVF9MSU5LPVNlcnZsZXQgbGluawotCi0KLQotIwotIyBMYWJlbHMgZm9yIHRhYmxlIGxheW91dAotIwotTEFCRUxfVEFCTEVfTkFNRT1OYW1lCi1MQUJFTF9UQUJMRV9WQUxVRT1WYWx1ZQotTEFCRUxfVEFCTEVfU09BUF9ST0xFPVNPQVAgcm9sZQotTEFCRUxfVEFCTEVfUE9SVF9OQU1FPVBvcnQgbmFtZQotTEFCRUxfVEFCTEVfUE9SVF9DT01QT05FTlRfTElOSz1Qb3J0IGNvbXBvbmVudCBsaW5rCi1MQUJFTF9UQUJMRV9ERVNDUklQVElPTj1EZXNjcmlwdGlvbgotCi0jCi0jIFBhZ2UgYW5kIFNlY3Rpb24gdGl0bGVzL2Rlc2NyaXB0aW9ucwotIwotCi0KLQotCi0jCi0jIERpYWxvZyBsYWJlbHMKLSMKLQotCi0jCi0jIFRvb2x0aXBzCi0jCi0KLQotIwotIyBMYWJlbHMgZm9yIHByb3ZpZGVycwotIwotX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlPVdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9uCi1fVUlfUG9ydENvbXBvbmVudF90eXBlPVBvcnQgY29tcG9uZW50Ci1fVUlfSGFuZGxlcl90eXBlPUhhbmRsZXIKLV9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGU9UG9ydCBjb21wb25lbnQgcmVmZXJlbmNlCi1fVUlfU2VydmljZVJlZl90eXBlPVNlcnZpY2UgcmVmZXJlbmNlCi1fVUlfV2ViU2VydmljZXNDbGllbnRfdHlwZT1XZWIgc2VydmljZXMgY2xpZW50Ci1fVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlPUNvbXBvbmVudCBzY29wZWQgcmVmZXJlbmNlCi1fVUlfV1NETFBvcnRfdHlwZT1XU0RMIHBvcnQKLV9VSV9XZWJTZXJ2aWNlc190eXBlPVdlYiBzZXJ2aWNlcwotX1VJX1NlcnZsZXRMaW5rX3R5cGU9U2VydmxldCBsaW5rCi1fVUlfU2VydmljZUltcGxCZWFuX3R5cGU9U2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuCi1fVUlfRUpCTGlua190eXBlPUVKQiBsaW5rCi1fVUlfQmVhbkxpbmtfdHlwZT1CZWFuIGxpbmsKLV9VSV9TT0FQUm9sZV90eXBlPVNPQVAgcm9sZQotX1VJX1NPQVBIZWFkZXJfdHlwZT1TT0FQIGhlYWRlcgotX1VJX1BvcnROYW1lX3R5cGU9UG9ydCBuYW1lCi1fVUlfSW5pdFBhcmFtX3R5cGU9SW5pdGlhbCBwYXJhbWV0ZXIKLV9VSV9TZXJ2aWNlUmVmX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmU9SmF4cnBjIE1hcHBpbmcgRmlsZQotX1VJX1NlcnZpY2VSZWZfamF4cnBjTWFwcGluZ0ZpbGVfZmVhdHVyZV9kZXNjPVRoZSBqYXhycGMgbWFwcGluZyBmaWxlLgotX1VJX1NlcnZpY2VSZWZfc2VydmljZUludGVyZmFjZV9mZWF0dXJlPVNlcnZpY2UgSW50ZXJmYWNlCi1fVUlfU2VydmljZVJlZl9zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmVfZGVzYz1UaGUgc2VydmljZSBpbnRlcmZhY2UuCi1fVUlfU2VydmljZVJlZl9zZXJ2aWNlUmVmTmFtZV9mZWF0dXJlPU5hbWUKLV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VSZWZOYW1lX2ZlYXR1cmVfZGVzYz1UaGUgc2VydmljZSByZWZlcmVuY2UgbmFtZS4KLV9VSV9TZXJ2aWNlUmVmX3dzZGxGaWxlX2ZlYXR1cmU9V3NkbCBGaWxlCi1fVUlfU2VydmljZVJlZl93c2RsRmlsZV9mZWF0dXJlX2Rlc2M9VGhlIC53c2RsIGZpbGUuCi1fVUlfUG9ydENvbXBvbmVudFJlZl9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZT1TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotX1VJX1BvcnRDb21wb25lbnRSZWZfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmVfZGVzYz1UaGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi1fVUlfUG9ydENvbXBvbmVudFJlZl9wb3J0Q29tcG9uZW50TGlua19mZWF0dXJlPUxpbmsKLV9VSV9Qb3J0Q29tcG9uZW50UmVmX3BvcnRDb21wb25lbnRMaW5rX2ZlYXR1cmVfZGVzYz1UaGUgcG9ydCBjb21wb25lbnQgbGluay4KLV9VSV9IYW5kbGVyX3NvYXBSb2xlc19mZWF0dXJlPVNvYXAgUm9sZXMKLV9VSV9IYW5kbGVyX3NvYXBSb2xlc19mZWF0dXJlX2Rlc2M9VGhlIGhhbmRsZXIgc29hcCByb2xlcy4KLV9VSV9IYW5kbGVyX3BvcnROYW1lc19mZWF0dXJlPVBvcnQgTmFtZXMKLV9VSV9IYW5kbGVyX3BvcnROYW1lc19mZWF0dXJlX2Rlc2M9VGhlIGhhbmRsZXIgcG9ydCBuYW1lcy4KLV9VSV9IYW5kbGVyX2hhbmRsZXJOYW1lX2ZlYXR1cmU9SGFuZGxlciBOYW1lCi1fVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlX2Rlc2M9VGhlIGhhbmRsZXIgbmFtZS4KLV9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlPUhhbmRsZXIgQ2xhc3MKLV9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlX2Rlc2M9VGhlIGhhbmRsZXIgY2xhc3MuCi1fVUlfSW5pdFBhcmFtX3BhcmFtTmFtZV9mZWF0dXJlPU5hbWUKLV9VSV9Jbml0UGFyYW1fcGFyYW1OYW1lX2ZlYXR1cmVfZGVzYz1UaGUgaW5pdGlhbCBwYXJhbWV0ZXIgbmFtZS4KLV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZT1EZXNjcmlwdGlvbgotX1VJX0luaXRQYXJhbV9kZXNjcmlwdGlvbl9mZWF0dXJlX2Rlc2M9VGhlIGluaXRpYWwgcGFyYW1ldGVyIGRlc2NyaXB0aW9uLgotX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmU9VmFsdWUKLV9VSV9Jbml0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlX2Rlc2M9VGhlIGluaXRpYWwgcGFyYW1ldGVyIHZhbHVlLgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM5NTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08IS0tICBEeWFubWljIENvbnRlbnQgUHJvdmlkZXIgZXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndlYnNlcnZpY2VfY2xpZW50LnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5Xc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id3Njb21tb24ueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImNsaWVudC54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Rm9yQ2xpZW50Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id2Vic2VydmljZV9jbGllbnQueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUZvcldTQ2xpZW50Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0iZWpiLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY2xpZW50LnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnlGb3JFSkIiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJ3ZWJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Rm9yV0VCIj4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id3NkZC54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEV4dGVuc2lvbiI+Ci0gICAgICA8ZWRpdE1vZGVsRXh0ZW5zaW9uCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LndlYiIKLSAgICAgICAgICAgIGlkPSJ3ZWJzZXJ2aWNlcy53ZWIuZWRpdE1vZGVsZXh0ZW5zaW9uIj4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJXRUItSU5GL3dlYnNlcnZpY2VzY2xpZW50LnhtbCI+Ci0gICAgICAgICA8L2VkaXRNb2RlbFJlc291cmNlPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBVUkk9IldFQi1JTkYvd2Vic2VydmljZXMueG1sIj4KLSAgICAgICAgIDwvZWRpdE1vZGVsUmVzb3VyY2U+Ci0gICAgICA8L2VkaXRNb2RlbEV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEV4dGVuc2lvbiI+Ci0gICAgICA8ZWRpdE1vZGVsRXh0ZW5zaW9uCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LmVqYiIKLSAgICAgICAgICAgIGlkPSJ3ZWJzZXJ2aWNlcy5lamIuZWRpdE1vZGVsZXh0ZW5zaW9uIj4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgIDwvZWRpdE1vZGVsRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsRXh0ZW5zaW9uIj4KLSAgICAgIDxlZGl0TW9kZWxFeHRlbnNpb24KLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJqc3QuYXBwY2xpZW50IgotICAgICAgICAgICAgaWQ9IndlYnNlcnZpY2VzLmFwcGNsaWVudC5lZGl0TW9kZWxleHRlbnNpb24iPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBVUkk9Ik1FVEEtSU5GL3dlYnNlcnZpY2VzY2xpZW50LnhtbCI+Ci0gICAgICAgICA8L2VkaXRNb2RlbFJlc291cmNlPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBVUkk9Ik1FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCI+Ci0gICAgICAgICA8L2VkaXRNb2RlbFJlc291cmNlPgotICAgICAgPC9lZGl0TW9kZWxFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gQGRlcHJlY2F0ZWQ6IEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hdGsudWkud2Vic2VydmljZXNlZGl0bW9kZWwgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2Vic2VydmljZXNlZGl0bW9kZWxjb250YWluZXIiIG5hbWU9IiVFRElUT1JfRURJVE1PREVMU19XRUJfU0VSVklDRVMiLz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEBkZXByZWNhdGVkOiBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYXRrLnVpLndlYnNlcnZpY2VzY2xpZW50ZWRpdG1vZGVsIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndlYnNlcnZpY2VzY2xpZW50ZWRpdG1vZGVsY29udGFpbmVyIiBuYW1lPSIlRURJVE9SX0VESVRNT0RFTFNfV0VCX1NFUlZJQ0VTX0NMSUVOVCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iV1NETFNlcnZpY2VIZWxwZXIiCi0gICAgICAgICBuYW1lPSJXU0RMU2VydmljZUhlbHBlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5XU0RMU2VydmljZUhlbHBlciI+Ci0gICAgICA8d3NkbEhlbHBlcgotICAgICAgICAgICAgaGVscGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldTRExTZXJ2aWNlSGVscGVySW1wbCI+Ci0gICAgICA8L3dzZGxIZWxwZXI+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNThmMjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLndlYnNlcnZpY2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wcm9wZXJ0eV9maWxlcy93ZWJzZXJ2aWNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhN2IwYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVSUl9IQU5ETEVSX0RJU1BMQVlfTkFNRV9FTVBUWT1UaGUgaGFuZGxlciBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9IQU5ETEVSX0RJU1BMQVlfTkFNRV9FWElTVD1UaGUgaGFuZGxlciBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0hBTkRMRVJfUEFSQU1fTkFNRV9FTVBUWT1UaGUgaGFuZGxlciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZSBjYW5ub3QgYmUgZW1wdHkuCi1FUlJfSEFORExFUl9OQU1FU1BBQ0VfVVJMX0VNUFRZPVRoZSBoYW5kbGVyIG5hbWUgc3BhY2UgVVJMIGNhbm5vdCBiZSBlbXB0eS5TZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLjA9U2VydmljZVJlZgotRVJSX0hBTkRMRVJfUEFSQU1fTkFNRV9FWElTVFM9VGhlIHBhcmFtZXRlciBuYW1lIGFscmVhZHkgZXhpc3QuCi1FUlJfSEFORExFUl9OQU1FU1BBQ0VfVVJMX0VYSVNUUz1UaGUgaGFuZGxlciBuYW1lIHNwYWNlIFVSTCBhbHJlYWR5IGV4aXNpdCwgcGxlYXNlIGNoYW5nZSBuYW1lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyQ0NvbWJvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckNDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTVjYzE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyQ0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJDQ29tYm8gZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwcml2YXRlIEVPYmplY3QgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZGlzcGxheUZlYXR1cmVfOwotCXByaXZhdGUgQ0NvbWJvIGNvbWJvXzsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0RGlzcGxheVN0cmluZ187Ci0KLQlwdWJsaWMgQWRhcHRlckNDb21ibyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGRpc3BsYXlGZWF0dXJlLCBDQ29tYm8gY29tYm8sIFN0cmluZyBkZWZhdWx0RGlzcGxheVN0cmluZykgewotCQlzdXBlcigpOwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJZGlzcGxheUZlYXR1cmVfID0gZGlzcGxheUZlYXR1cmU7Ci0JCWNvbWJvXyA9IGNvbWJvOwotCQljb21ib18uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWRlZmF1bHREaXNwbGF5U3RyaW5nXyA9IChkZWZhdWx0RGlzcGxheVN0cmluZyAhPSBudWxsKSA/IGRlZmF1bHREaXNwbGF5U3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckNDb21ibyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGRpc3BsYXlGZWF0dXJlLCBDQ29tYm8gY29tYm8pIHsKLQkJdGhpcyhmZWF0dXJlLCBkaXNwbGF5RmVhdHVyZSwgY29tYm8sIG51bGwpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyQ0NvbWJvKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkaXNwbGF5RmVhdHVyZSwgQ0NvbWJvIGNvbWJvKSB7Ci0JCXRoaXMoZU9iamVjdCwgZmVhdHVyZSwgZGlzcGxheUZlYXR1cmUsIGNvbWJvLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckNDb21ibyhFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgZGlzcGxheUZlYXR1cmUsIENDb21ibyBjb21ibywgU3RyaW5nIGRlZmF1bHREaXNwbGF5U3RyaW5nKSB7Ci0JCXRoaXMoZmVhdHVyZSwgZGlzcGxheUZlYXR1cmUsIGNvbWJvLCBkZWZhdWx0RGlzcGxheVN0cmluZyk7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlPYmplY3Qgbm90aWZpZXIgPSBtc2cuZ2V0Tm90aWZpZXIoKTsKLQkJaWYgKG5vdGlmaWVyID09IGVPYmplY3RfKSB7Ci0JCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJCWlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uQUREIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkKLQkJCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JCX0gZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBkaXNwbGF5RmVhdHVyZV8pCi0JCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAoY29tYm9fLmlzRGlzcG9zZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJCWludCBzZWxlY3Rpb25JbmRleCA9IGNvbWJvXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCVN0cmluZyB0ZXh0ID0gY29tYm9fLmdldFRleHQoKTsKLQkJCQljb21ib18ucmVtb3ZlQWxsKCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJCUVMaXN0IGVMaXN0ID0gKEVMaXN0KSBvYmplY3Q7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJCQkJY29tYm9fLmFkZCh0b0Rpc3BsYXlTdHJpbmcoKChFT2JqZWN0KSBpdC5uZXh0KCkpLmVHZXQoZGlzcGxheUZlYXR1cmVfKSkpOwotCQkJCX0gZWxzZQotCQkJCQljb21ib18uYWRkKHRvRGlzcGxheVN0cmluZygoKEVPYmplY3QpIG9iamVjdCkuZUdldChkaXNwbGF5RmVhdHVyZV8pKSk7Ci0JCQkJaW50IG5ld0luZGV4ID0gY29tYm9fLmluZGV4T2YodGV4dCk7Ci0JCQkJaWYgKHNlbGVjdGlvbkluZGV4ICE9IC0xICYmIG5ld0luZGV4ICE9IC0xKQotCQkJCQljb21ib18uc2VsZWN0KG5ld0luZGV4KTsKLQkJCQllbHNlCi0JCQkJCWNvbWJvXy5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBzID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQkJCXJldHVybiBzOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0RGlzcGxheVN0cmluZ187Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWNvbWJvXy5yZW1vdmVBbGwoKTsKLQkJfQotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChFTGlzdCkgb2JqZWN0KS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkoKEVPYmplY3QpIGl0ZW0pLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJKChFT2JqZWN0KSBvYmplY3QpLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCXBvcHVsYXRlQ29tYm8oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlpZiAoY29tYm9fICE9IG51bGwgJiYgIWNvbWJvXy5pc0Rpc3Bvc2VkKCkpCi0JCQljb21ib18ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWZmODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRBZGRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kUmVtb3ZlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRWxlbWVudCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByaXZhdGUgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQlwcml2YXRlIEVPYmplY3QgcGFyZW50XzsKLQlwcml2YXRlIEVDbGFzcyBjaGlsZEVDbGFzc187Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIGJvb2xlYW4gY2hpbGROaWxsYWJsZV87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlc187Ci0JcHJpdmF0ZSBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZV87Ci0JcHJpdmF0ZSBUZXh0W10gZmVhdHVyZXNUZXh0c187Ci0JcHJpdmF0ZSBBZGFwdGVyVGV4dFtdIGZlYXR1cmVzQWRhcHRlcnNfOwotCi0JcHVibGljIEFkYXB0ZXJFbGVtZW50KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIGNoaWxkTmlsbGFibGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzLCBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZSwgVGV4dFtdIGZlYXR1cmVzVGV4dHMpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JCXBhcmVudF8gPSBudWxsOwotCQljaGlsZEVDbGFzc18gPSBjaGlsZEVDbGFzczsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJY2hpbGROaWxsYWJsZV8gPSBjaGlsZE5pbGxhYmxlOwotCQlmZWF0dXJlc18gPSBmZWF0dXJlczsKLQkJZmVhdHVyZXNOaWxsYWJsZV8gPSBmZWF0dXJlc05pbGxhYmxlOwotCQlmZWF0dXJlc1RleHRzXyA9IGZlYXR1cmVzVGV4dHM7Ci0JCWFkZE1vZGlmeUxpc3RlbmVyKCk7Ci0JCWZlYXR1cmVzQWRhcHRlcnNfID0gbmV3IEFkYXB0ZXJUZXh0W2ZlYXR1cmVzXy5sZW5ndGhdOwotCQluZXdBZGFwdGVycyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckVsZW1lbnQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IHBhcmVudCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIGNoaWxkTmlsbGFibGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzLCBib29sZWFuW10gZmVhdHVyZXNOaWxsYWJsZSwgVGV4dFtdIGZlYXR1cmVzVGV4dHMpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgY2hpbGRFQ2xhc3MsIGNoaWxkRmVhdHVyZSwgY2hpbGROaWxsYWJsZSwgZmVhdHVyZXMsIGZlYXR1cmVzTmlsbGFibGUsIGZlYXR1cmVzVGV4dHMpOwotCQlhZGFwdChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBuZXdBZGFwdGVycyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgPT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlc19baV0sIGZlYXR1cmVzVGV4dHNfW2ldLCBmZWF0dXJlc05pbGxhYmxlX1tpXSk7Ci0JCWVsc2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlc19baV0sIGZlYXR1cmVzVGV4dHNfW2ldLCBmZWF0dXJlc05pbGxhYmxlX1tpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzVGV4dHNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNUZXh0c19baV0uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBjaGlsZEZlYXR1cmVfKSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsICYmICFjaGlsZE5pbGxhYmxlXykKLQkJCQljaGlsZCA9IHNldENoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJCWZlYXR1cmVzQWRhcHRlcnNfW2ldLmFkYXB0KGNoaWxkKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlib29sZWFuIGlzVGV4dHNOdWxsID0gaXNUZXh0c051bGwoKTsKLQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWJvb2xlYW4gY2hpbGRDYW5CZVJlbW92ZWQgPSB0cnVlOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgYWxsZmVhdHVyZXMgPSBjaGlsZEVDbGFzc18uZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYWxsZmVhdHVyZXMuaGFzTmV4dCgpKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRoaXNGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsZmVhdHVyZXMubmV4dCgpOwotCQkJCWlmICghYWRhcHRpbmdGZWF0dXJlKHRoaXNGZWF0dXJlKSAmJiBjaGlsZC5lSXNTZXQodGhpc0ZlYXR1cmUpKSB7Ci0JCQkJCWNoaWxkQ2FuQmVSZW1vdmVkID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaXNUZXh0c051bGwgJiYgY2hpbGQgIT0gbnVsbCAmJiBjaGlsZE5pbGxhYmxlXyAmJiBjaGlsZENhbkJlUmVtb3ZlZCkgewotCQkJZGlzcG9zZUFkYXB0ZXJzKCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCUNvbW1hbmRSZW1vdmVFbGVtZW50IGNvbW1hbmQgPSBuZXcgQ29tbWFuZFJlbW92ZUVsZW1lbnQobnVsbCwgbnVsbCwgcGFyZW50XywgY2hpbGRGZWF0dXJlXyk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCW5ld0FkYXB0ZXJzKG51bGwpOwotCQl9IGVsc2UgaWYgKCFpc1RleHRzTnVsbCAmJiBjaGlsZCA9PSBudWxsKSB7Ci0JCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJY2hpbGQgPSBjcmVhdGVDaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc18ubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGZlYXR1cmVzVGV4dHNfW2ldLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQljaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgdGV4dCk7Ci0JCQl9Ci0JCQlDb21tYW5kQWRkRWxlbWVudCBjb21tYW5kID0gbmV3IENvbW1hbmRBZGRFbGVtZW50KG51bGwsIG51bGwsIHBhcmVudF8sIGNoaWxkRmVhdHVyZV8sIGNoaWxkKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJbmV3QWRhcHRlcnMoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVGV4dHNOdWxsKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzVGV4dHNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGZlYXR1cmVzVGV4dHNfW2ldLmdldFRleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAocGFyZW50XyAhPSBudWxsKQotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8gPSBlT2JqZWN0OwotCQlFT2JqZWN0IGNoaWxkID0gbnVsbDsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQljaGlsZCA9IChFT2JqZWN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCAmJiAhY2hpbGROaWxsYWJsZV8pCi0JCQkJY2hpbGQgPSBzZXRDaGlsZCgpOwotCQl9Ci0JCXJlbW92ZU1vZGlmeUxpc3RlbmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc0FkYXB0ZXJzX1tpXS5hZGFwdChjaGlsZCk7Ci0JCWFkZE1vZGlmeUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IHNldENoaWxkKCkgewotCQlFT2JqZWN0IGNoaWxkID0gY3JlYXRlQ2hpbGQoKTsKLQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUNoaWxkKCkgewotCQlFRmFjdG9yeSBjaGlsZEZhY3RvcnkgPSBjaGlsZEVDbGFzc18uZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCUVPYmplY3QgY2hpbGQgPSBjaGlsZEZhY3RvcnkuY3JlYXRlKGNoaWxkRUNsYXNzXyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWZlYXR1cmVzTmlsbGFibGVfW2ldKQotCQkJCWNoaWxkLmVTZXQoZmVhdHVyZXNfW2ldLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUFkYXB0ZXJzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1RleHRzXy5sZW5ndGg7IGkrKykKLQkJCWlmIChmZWF0dXJlc1RleHRzX1tpXSAhPSBudWxsICYmICFmZWF0dXJlc1RleHRzX1tpXS5pc0Rpc3Bvc2VkKCkpCi0JCQkJZmVhdHVyZXNUZXh0c19baV0ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkYXB0aW5nRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZXNfID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc18ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmZWF0dXJlID09IGZlYXR1cmVzX1tpXSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckV4cGlyZXNDQ29tYm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRXhwaXJlc0NDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2M3NjNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRXhwaXJlc0NDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckV4cGlyZXNDQ29tYm8gZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXRfOwotCXByaXZhdGUgRU9iamVjdCBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIENDb21ibyB5ZWFyXzsKLQlwcml2YXRlIENDb21ibyBtb250aF87Ci0JcHJpdmF0ZSBDQ29tYm8gZGF5XzsKLQlwcml2YXRlIENDb21ibyBob3VyXzsKLQlwcml2YXRlIENDb21ibyBtaW51dGVfOwotCXByaXZhdGUgQ0NvbWJvIHNlY29uZF87Ci0JcHJpdmF0ZSBDQ29tYm8gbXNlY29uZF87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQotCXB1YmxpYyBBZGFwdGVyRXhwaXJlc0NDb21ibyhBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ0NvbWJvIHllYXIsIENDb21ibyBtb250aCwgQ0NvbWJvIGRheSwgQ0NvbWJvIGhvdXIsIENDb21ibyBtaW51dGUsIENDb21ibyBzZWNvbmQsIENDb21ibyBtc2Vjb25kLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdF8gPSBhcnRpZmFjdEVkaXQ7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQl5ZWFyXyA9IHllYXI7Ci0JCW1vbnRoXyA9IG1vbnRoOwotCQlkYXlfID0gZGF5OwotCQlob3VyXyA9IGhvdXI7Ci0JCW1pbnV0ZV8gPSBtaW51dGU7Ci0JCXNlY29uZF8gPSBzZWNvbmQ7Ci0JCW1zZWNvbmRfID0gbXNlY29uZDsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCXllYXJfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQltb250aF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWRheV8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWhvdXJfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQltaW51dGVfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlzZWNvbmRfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQltc2Vjb25kXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckV4cGlyZXNDQ29tYm8oQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCwgRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ0NvbWJvIHllYXIsIENDb21ibyBtb250aCwgQ0NvbWJvIGRheSwgQ0NvbWJvIGhvdXIsIENDb21ibyBtaW51dGUsIENDb21ibyBzZWNvbmQsIENDb21ibyBtc2Vjb25kLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRoaXMoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbXNlY29uZCwgbmlsbGFibGUpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykKLQkJCXNldFRleHQobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgZXhwaXJlcygpLCBuaWxsYWJsZV8pOwotCQkJYXJ0aWZhY3RFZGl0Xy5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXRfLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGV4cGlyZXMoKSB7Ci0JCXJldHVybiAiUCIgKyAvLyROT04tTkxTLTEkCi0JCQkJCXllYXJfLmdldFRleHQoKSArICJZIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJbW9udGhfLmdldFRleHQoKSArICJNIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJZGF5Xy5nZXRUZXh0KCkgKyAiRFQiICsgLy8kTk9OLU5MUy0xJAotCQkJCQlob3VyXy5nZXRUZXh0KCkgKyAiSCIgKyAvLyROT04tTkxTLTEkCi0JCQkJCW1pbnV0ZV8uZ2V0VGV4dCgpICsgIk0iICsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZWNvbmRfLmdldFRleHQoKSArICIuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJbXNlY29uZF8uZ2V0VGV4dCgpICsgIlMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlzZXRUZXh0KChTdHJpbmcpIGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJaWYgKHllYXJfICE9IG51bGwgJiYgIXllYXJfLmlzRGlzcG9zZWQoKSkKLQkJCXllYXJfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobW9udGhfICE9IG51bGwgJiYgIW1vbnRoXy5pc0Rpc3Bvc2VkKCkpCi0JCQltb250aF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChkYXlfICE9IG51bGwgJiYgIWRheV8uaXNEaXNwb3NlZCgpKQotCQkJZGF5Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGhvdXJfICE9IG51bGwgJiYgIWhvdXJfLmlzRGlzcG9zZWQoKSkKLQkJCWhvdXJfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobWludXRlXyAhPSBudWxsICYmICFtaW51dGVfLmlzRGlzcG9zZWQoKSkKLQkJCW1pbnV0ZV8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChzZWNvbmRfICE9IG51bGwgJiYgIXNlY29uZF8uaXNEaXNwb3NlZCgpKQotCQkJc2Vjb25kXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1zZWNvbmRfICE9IG51bGwgJiYgIW1zZWNvbmRfLmlzRGlzcG9zZWQoKSkKLQkJCW1zZWNvbmRfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IChTdHJpbmcpIGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJU3RyaW5nIHZhbHVlID0gZXhwaXJlcygpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKTsKLQkJCXJldHVybiAhKG1vZGVsVmFsdWUuZXF1YWxzKHZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyBtb2RlbFZhbHVlKSB7Ci0JCWlmIChtb2RlbFZhbHVlICE9IG51bGwpIHsKLQkJCWludCB5ID0gbW9kZWxWYWx1ZS5pbmRleE9mKCJZIik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBtbyA9IG1vZGVsVmFsdWUuaW5kZXhPZigiTSIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgZCA9IG1vZGVsVmFsdWUuaW5kZXhPZigiRCIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgaCA9IG1vZGVsVmFsdWUuaW5kZXhPZigiSCIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgbWkgPSBtb2RlbFZhbHVlLmxhc3RJbmRleE9mKCJNIik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBzID0gbW9kZWxWYWx1ZS5pbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBtcyA9IG1vZGVsVmFsdWUuaW5kZXhPZigiUyIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICgheWVhcl8uaXNEaXNwb3NlZCgpICYmIHkgPiAwKQotCQkJCXllYXJfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcoMSwgeSkpOwotCQkJaWYgKCFtb250aF8uaXNEaXNwb3NlZCgpICYmIG1vID4gMCkKLQkJCQltb250aF8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyh5ICsgMSwgbW8pKTsKLQkJCWlmICghZGF5Xy5pc0Rpc3Bvc2VkKCkgJiYgZCA+IDApCi0JCQkJZGF5Xy5zZXRUZXh0KG1vZGVsVmFsdWUuc3Vic3RyaW5nKG1vICsgMSwgZCkpOwotCQkJaWYgKCFob3VyXy5pc0Rpc3Bvc2VkKCkgJiYgaCA+IDApCi0JCQkJaG91cl8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyhkICsgMiwgaCkpOwotCQkJaWYgKCFtaW51dGVfLmlzRGlzcG9zZWQoKSAmJiBtaSA+IDApCi0JCQkJbWludXRlXy5zZXRUZXh0KG1vZGVsVmFsdWUuc3Vic3RyaW5nKGggKyAxLCBtaSkpOwotCQkJaWYgKCFzZWNvbmRfLmlzRGlzcG9zZWQoKSAmJiBzID4gMCkKLQkJCQlzZWNvbmRfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcobWkgKyAxLCBzKSk7Ci0JCQlpZiAoIW1zZWNvbmRfLmlzRGlzcG9zZWQoKSAmJiBtcyA+IDApCi0JCQkJbXNlY29uZF8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyhzICsgMSwgbXMpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckhhbmRsZXJDbGFzc1RleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVySGFuZGxlckNsYXNzVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTI2ZDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVySGFuZGxlckNsYXNzVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLS8qCi0gKiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckhhbmRsZXJDbGFzc1RleHQgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQlwcm90ZWN0ZWQgSGFuZGxlciBlT2JqZWN0XzsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByb3RlY3RlZCBUZXh0IHRleHRfOwotCXByb3RlY3RlZCBib29sZWFuIG5pbGxhYmxlXzsKLQotCXB1YmxpYyBBZGFwdGVySGFuZGxlckNsYXNzVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIFRleHQgdGV4dCkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQkJZU9iamVjdF8gPSBudWxsOwotCQlmZWF0dXJlXyA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKTsKLQkJdGV4dF8gPSB0ZXh0OwotCQluaWxsYWJsZV8gPSBmYWxzZTsKLQkJdGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJIYW5kbGVyQ2xhc3NUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgSGFuZGxlciBlT2JqZWN0LCBUZXh0IHRleHQpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgdGV4dCk7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQpICYmIHN5bmNUZXh0QW5kTW9kZWwoKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGZlYXR1cmVfKSB7Ci0JCQlTdHJpbmcgbmV3Q2xhc3NOYW1lID0gZU9iamVjdF8uZ2V0SGFuZGxlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCXNldFRleHQobmV3Q2xhc3NOYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCB0ZXh0Xy5nZXRUZXh0KCkpOwotCQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEhhbmRsZXIgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJU3RyaW5nIG5ld0NsYXNzTmFtZSA9IGVPYmplY3RfLmdldEhhbmRsZXJDbGFzcygpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQlzZXRUZXh0KG5ld0NsYXNzTmFtZSk7Ci0JCX0gZWxzZQotCQkJc2V0VGV4dChudWxsKTsKLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsgZmVhdHVyZV8gPSBmZWF0dXJlOwotCSAqIGFkYXB0KGVPYmplY3QpOyB9Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh0ZXh0XyAhPSBudWxsICYmICF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jVGV4dEFuZE1vZGVsKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsVmFsdWUgPSBlT2JqZWN0Xy5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJU3RyaW5nIHRleHRWYWx1ZSA9IHRleHRfLmdldFRleHQoKTsKLQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCXJldHVybiAhKHRleHRWYWx1ZSA9PSBudWxsIHx8IHRleHRWYWx1ZS5sZW5ndGgoKSA8PSAwKTsKLQkJCXJldHVybiAhKG1vZGVsVmFsdWUuZXF1YWxzKHRleHRWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRleHRfLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIGN1cnJUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQlpZiAoY3VyclRleHQgIT0gbnVsbCAmJiBjdXJyVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXRleHRfLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKCF0ZXh0LmVxdWFscyhjdXJyVGV4dCkpCi0JCQkJdGV4dF8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZUVkaXRNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogICAgICAgICAgICBUaGUgajJlZUVkaXRNb2RlbCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCkgewotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckxheWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWQwZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJMYXllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyTGF5ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBFQ2xhc3MgY2hpbGRFQ2xhc3NfOwotCXByaXZhdGUgRU9iamVjdCBjaGlsZF87Ci0KLQlwdWJsaWMgQWRhcHRlckxheWVyKEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRUNsYXNzIGNoaWxkRUNsYXNzKSB7Ci0JCXN1cGVyKCk7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJY2hpbGRFQ2xhc3NfID0gY2hpbGRFQ2xhc3M7Ci0JCWFkYXB0KHBhcmVudF8pOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BREQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKQotCQkJYWRhcHRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGNoaWxkXyAhPSBudWxsKQotCQkJY2hpbGRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJcGFyZW50XyA9IGVPYmplY3Q7Ci0JCWFkYXB0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkXyAhPSBudWxsKQotCQkJY2hpbGRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY2hpbGRfICE9IG51bGwpCi0JCQljaGlsZF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldENoaWxkKCkgewotCQlyZXR1cm4gY2hpbGRfOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGFwdENoaWxkKCkgewotCQlpZiAocGFyZW50XyAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gcGFyZW50Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCQljaGlsZF8gPSBjaGlsZEVDbGFzc18uZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKGNoaWxkRUNsYXNzXyk7Ci0JCQllbHNlCi0JCQkJY2hpbGRfID0gKEVPYmplY3QpIG9iamVjdDsKLQkJfSBlbHNlCi0JCQljaGlsZF8gPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGFwdFBhcmVudCgpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCAmJiBjaGlsZF8gIT0gbnVsbCkgewotCQkJRUxpc3QgY2hpbGRGZWF0dXJlcyA9IGNoaWxkRUNsYXNzXy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRGZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCQlib29sZWFuIGlzRmVhdHVyZVNldDsKLQkJCQlPYmplY3QgZ3JhbmRjaGlsZCA9IGNoaWxkXy5lR2V0KGNoaWxkRmVhdHVyZSk7Ci0JCQkJaWYgKGdyYW5kY2hpbGQgIT0gbnVsbCAmJiBncmFuZGNoaWxkIGluc3RhbmNlb2YgRUxpc3QpCi0JCQkJCWlzRmVhdHVyZVNldCA9ICEoKEVMaXN0KSBncmFuZGNoaWxkKS5pc0VtcHR5KCk7Ci0JCQkJZWxzZQotCQkJCQlpc0ZlYXR1cmVTZXQgPSBjaGlsZF8uZUlzU2V0KGNoaWxkRmVhdHVyZSk7Ci0JCQkJaWYgKGlzRmVhdHVyZVNldCkgewotCQkJCQlwYXJlbnRfLmVTZXQoZmVhdHVyZV8sIGNoaWxkXyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlwYXJlbnRfLmVVbnNldChmZWF0dXJlXyk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJQQ1JlZlRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUENSZWZUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmUyNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJQQ1JlZlRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5U0VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHJzaW5oYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyUENSZWZUZXh0IGV4dGVuZHMgQWRhcHRlclRleHQgewotCXB1YmxpYyBBZGFwdGVyUENSZWZUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFRleHQgdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihhbkFydGlmYWN0RWRpdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCX0KLQotCi0JcHVibGljIEFkYXB0ZXJQQ1JlZlRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoYW5BcnRpZmFjdEVkaXQsIGVPYmplY3QsIGZlYXR1cmUsIHRleHQsIG5pbGxhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykgewotCQkJT2JqZWN0IG9iaiA9IGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJU3RyaW5nIG9ialN0cmluZ1ZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlvYmpTdHJpbmdWYWx1ZSA9IChTdHJpbmcpIG9iajsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSmF2YUNsYXNzKSB7Ci0JCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIG9iajsKLQkJCQlvYmpTdHJpbmdWYWx1ZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJfQotCQkJc2V0VGV4dChvYmpTdHJpbmdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKHN5bmNUZXh0QW5kTW9kZWwoKSkgewotCQkJLy9IYW5kbGUgUG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmVhdHVyZSBpbiBhIHNwZWNpYWwgd2F5LgotCQkJU3RyaW5nIFNFSUZlYXR1cmVOYW1lID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLmdldE5hbWUoKTsKLQkJCWlmICgoZU9iamVjdF8gaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50UmVmKSAmJiAoZmVhdHVyZV8uZ2V0TmFtZSgpLmVxdWFscyhTRUlGZWF0dXJlTmFtZSkpKSB7Ci0JCQkJQ29tbWFuZE1vZGlmeVNFSSBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlTRUkobnVsbCwgbnVsbCwgKFBvcnRDb21wb25lbnRSZWYpIGVPYmplY3RfLCB0ZXh0Xy5nZXRUZXh0KCksIG5pbGxhYmxlXyk7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tbWFuZE1vZGlmeVRleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5VGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgZmVhdHVyZV8sIHRleHRfLmdldFRleHQoKSwgbmlsbGFibGVfKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlPYmplY3Qgb2JqID0gZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQlTdHJpbmcgb2JqU3RyaW5nVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCW9ialN0cmluZ1ZhbHVlID0gKFN0cmluZykgb2JqOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBKYXZhQ2xhc3MpIHsKLQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgb2JqOwotCQkJCW9ialN0cmluZ1ZhbHVlID0gamF2YUNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQl9Ci0JCQlzZXRUZXh0KG9ialN0cmluZ1ZhbHVlKTsKLQkJfSBlbHNlCi0JCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZTsKLQkJCS8vSGFuZGxlIFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGZlYXR1cmUgaW4gYSBzcGVjaWFsIHdheS4KLQkJCVN0cmluZyBTRUlGZWF0dXJlTmFtZSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKS5nZXROYW1lKCk7Ci0JCQlpZiAoKGVPYmplY3RfIGluc3RhbmNlb2YgUG9ydENvbXBvbmVudFJlZikgJiYgKGZlYXR1cmVfLmdldE5hbWUoKS5lcXVhbHMoU0VJRmVhdHVyZU5hbWUpKSkgewotCQkJCW1vZGVsVmFsdWUgPSAoKFBvcnRDb21wb25lbnRSZWYpIGVPYmplY3RfKS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbFZhbHVlID0gKFN0cmluZykgZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dFZhbHVlID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodGV4dFZhbHVlID09IG51bGwgfHwgdGV4dFZhbHVlLmxlbmd0aCgpIDw9IDApOwotCQkJcmV0dXJuICEobW9kZWxWYWx1ZS5lcXVhbHModGV4dFZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUU5hbWVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclFOYW1lRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg0NmU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUU5hbWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRBZGRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kUmVtb3ZlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWwuUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi0vKioKLSAqIEdlbmVyaWMgZVNldCdzIHdpbGwgbm90IHdvcmsgd2hlbiBzZXR0aW5nIG5hbWVzcGFjZVVSSXMgb24gUU5hbWUncyBzbyBBZGFwdGVyRWxlbWVudCBjYW5ub3QgYmUKLSAqIHVzZWQgd2hlbiB0aGUgY2hpbGQgaXMgYSBRTmFtZS4gVGhpcyBjbGFzcyBpcyB2ZXJ5IHNpbWlsYXIgQWRhcHRlckVsZW1lbnQgYnV0IGhhcyBzcGVjaWFsCi0gKiBiZWhhdmlvdXIgZm9yIGhhbmRsaW5nIFFOYW1lJ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyUU5hbWVFbGVtZW50IGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQ7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFQ2xhc3MgY2hpbGRFQ2xhc3NfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZV87Ci0JcHJpdmF0ZSBib29sZWFuIGNoaWxkTmlsbGFibGVfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXNfOwotCXByaXZhdGUgYm9vbGVhbltdIGZlYXR1cmVzTmlsbGFibGVfOwotCXByaXZhdGUgVGV4dFtdIGZlYXR1cmVzVGV4dHNfOwotCXByaXZhdGUgQWRhcHRlclRleHRbXSBmZWF0dXJlc0FkYXB0ZXJzXzsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQWRhcHRlclFOYW1lRWxlbWVudChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVDbGFzcyBjaGlsZEVDbGFzcywgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgYm9vbGVhbiBjaGlsZE5pbGxhYmxlLCBUZXh0IG5zVVJJVGV4dCwgVGV4dCBsb2NhbFBhcnRUZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCQlwYXJlbnRfID0gbnVsbDsKLQkJY2hpbGRFQ2xhc3NfID0gY2hpbGRFQ2xhc3M7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCWNoaWxkTmlsbGFibGVfID0gY2hpbGROaWxsYWJsZTsKLQkJQ29tbW9uUGFja2FnZSBjb21tb25QS0cgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5nZXRDb21tb25QYWNrYWdlKCk7Ci0JCS8vIFNldCB1cCBRTmFtZSBmZWF0dXJlcwotCQlmZWF0dXJlc18gPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlWzJdOwotCQlmZWF0dXJlc19bMF0gPSBjb21tb25QS0cuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCk7Ci0JCWZlYXR1cmVzX1sxXSA9IGNvbW1vblBLRy5nZXRRTmFtZV9Mb2NhbFBhcnQoKTsKLQkJZmVhdHVyZXNOaWxsYWJsZV8gPSBuZXcgYm9vbGVhblsyXTsKLQkJZmVhdHVyZXNOaWxsYWJsZV9bMF0gPSBmYWxzZTsKLQkJZmVhdHVyZXNOaWxsYWJsZV9bMV0gPSBmYWxzZTsKLQkJZmVhdHVyZXNUZXh0c18gPSBuZXcgVGV4dFsyXTsKLQkJZmVhdHVyZXNUZXh0c19bMF0gPSBuc1VSSVRleHQ7Ci0JCWZlYXR1cmVzVGV4dHNfWzFdID0gbG9jYWxQYXJ0VGV4dDsKLQkJYWRkTW9kaWZ5TGlzdGVuZXIoKTsKLQkJZmVhdHVyZXNBZGFwdGVyc18gPSBuZXcgQWRhcHRlclRleHRbZmVhdHVyZXNfLmxlbmd0aF07Ci0JCW5ld0FkYXB0ZXJzKG51bGwpOwotCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBZGFwdGVyUU5hbWVFbGVtZW50KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRU9iamVjdCBwYXJlbnQsIEVDbGFzcyBjaGlsZEVDbGFzcywgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgYm9vbGVhbiBjaGlsZE5pbGxhYmxlLCBUZXh0IG5zVVJJVGV4dCwgVGV4dCBsb2NhbFBhcnRUZXh0KSB7Ci0JCXRoaXMoYW5BcnRpZmFjdEVkaXQsIGNoaWxkRUNsYXNzLCBjaGlsZEZlYXR1cmUsIGNoaWxkTmlsbGFibGUsIG5zVVJJVGV4dCwgbG9jYWxQYXJ0VGV4dCk7Ci0JCWFkYXB0KHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5ld0FkYXB0ZXJzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlc0FkYXB0ZXJzX1swXSA9IG5ldyBBZGFwdGVyUU5hbWVUZXh0KGFydGlmYWN0RWRpdCwgZmVhdHVyZXNfWzBdLCBmZWF0dXJlc1RleHRzX1swXSwgZmVhdHVyZXNOaWxsYWJsZV9bMF0pOwotCQkJZmVhdHVyZXNBZGFwdGVyc19bMV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlc19bMV0sIGZlYXR1cmVzVGV4dHNfWzFdLCBmZWF0dXJlc05pbGxhYmxlX1sxXSk7Ci0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlc0FkYXB0ZXJzX1swXSA9IG5ldyBBZGFwdGVyUU5hbWVUZXh0KGFydGlmYWN0RWRpdCwgZU9iamVjdCwgZmVhdHVyZXNfWzBdLCBmZWF0dXJlc1RleHRzX1swXSwgZmVhdHVyZXNOaWxsYWJsZV9bMF0pOwotCQkJZmVhdHVyZXNBZGFwdGVyc19bMV0gPSBuZXcgQWRhcHRlclRleHQoYXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlc19bMV0sIGZlYXR1cmVzVGV4dHNfWzFdLCBmZWF0dXJlc05pbGxhYmxlX1sxXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNUZXh0c18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc1RleHRzX1tpXS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGNoaWxkRmVhdHVyZV8pIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgIWNoaWxkTmlsbGFibGVfKQotCQkJCWNoaWxkID0gc2V0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uYWRhcHQoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWJvb2xlYW4gaXNUZXh0c051bGwgPSBpc1RleHRzTnVsbCgpOwotCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJYm9vbGVhbiBjaGlsZENhbkJlUmVtb3ZlZCA9IHRydWU7Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBhbGxmZWF0dXJlcyA9IGNoaWxkRUNsYXNzXy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChhbGxmZWF0dXJlcy5oYXNOZXh0KCkpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgdGhpc0ZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBhbGxmZWF0dXJlcy5uZXh0KCk7Ci0JCQkJaWYgKCFhZGFwdGluZ0ZlYXR1cmUodGhpc0ZlYXR1cmUpICYmIGNoaWxkLmVJc1NldCh0aGlzRmVhdHVyZSkpIHsKLQkJCQkJY2hpbGRDYW5CZVJlbW92ZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpc1RleHRzTnVsbCAmJiBjaGlsZCAhPSBudWxsICYmIGNoaWxkTmlsbGFibGVfICYmIGNoaWxkQ2FuQmVSZW1vdmVkKSB7Ci0JCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJQ29tbWFuZFJlbW92ZUVsZW1lbnQgY29tbWFuZCA9IG5ldyBDb21tYW5kUmVtb3ZlRWxlbWVudChudWxsLCBudWxsLCBwYXJlbnRfLCBjaGlsZEZlYXR1cmVfKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJbmV3QWRhcHRlcnMobnVsbCk7Ci0JCX0gZWxzZSBpZiAoIWlzVGV4dHNOdWxsICYmIGNoaWxkID09IG51bGwpIHsKLQkJCWRpc3Bvc2VBZGFwdGVycygpOwotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQljaGlsZCA9IGNyZWF0ZUNoaWxkKCk7Ci0JCQlzZXRGZWF0dXJlc09uQ2hpbGQoY2hpbGQpOwotCQkJLyoKLQkJCSAqIHJlcGxhY2VkIGJ5IHNldEZlYXR1cmVzT25DaGlsZCBmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzXy5sZW5ndGg7IGkrKykgeyBTdHJpbmcKLQkJCSAqIHRleHQgPSBmZWF0dXJlc1RleHRzX1tpXS5nZXRUZXh0KCk7IGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkgKiBjaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgdGV4dCk7IH0KLQkJCSAqLwotCQkJQ29tbWFuZEFkZEVsZW1lbnQgY29tbWFuZCA9IG5ldyBDb21tYW5kQWRkRWxlbWVudChudWxsLCBudWxsLCBwYXJlbnRfLCBjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCW5ld0FkYXB0ZXJzKGNoaWxkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1RleHRzTnVsbCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1RleHRzXy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHRleHQgPSBmZWF0dXJlc1RleHRzX1tpXS5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlwYXJlbnRfID0gZU9iamVjdDsKLQkJRU9iamVjdCBjaGlsZCA9IG51bGw7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwpIHsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJY2hpbGQgPSAoRU9iamVjdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgIWNoaWxkTmlsbGFibGVfKQotCQkJCWNoaWxkID0gc2V0Q2hpbGQoKTsKLQkJfQotCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uYWRhcHQoY2hpbGQpOwotCQlhZGRNb2RpZnlMaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBzZXRDaGlsZCgpIHsKLQkJRU9iamVjdCBjaGlsZCA9IGNyZWF0ZUNoaWxkKCk7Ci0JCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgY2hpbGQpOwotCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVDaGlsZCgpIHsKLQkJRUZhY3RvcnkgY2hpbGRGYWN0b3J5ID0gY2hpbGRFQ2xhc3NfLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQlFT2JqZWN0IGNoaWxkID0gY2hpbGRGYWN0b3J5LmNyZWF0ZShjaGlsZEVDbGFzc18pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzXy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFmZWF0dXJlc05pbGxhYmxlX1tpXSkKLQkJCQljaGlsZC5lU2V0KGZlYXR1cmVzX1tpXSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwpCi0JCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZGlzcG9zZUFkYXB0ZXJzKCk7Ci0JCXJlbW92ZU1vZGlmeUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VBZGFwdGVycygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc0FkYXB0ZXJzXy5sZW5ndGg7IGkrKykKLQkJCWZlYXR1cmVzQWRhcHRlcnNfW2ldLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNUZXh0c18ubGVuZ3RoOyBpKyspCi0JCQlpZiAoZmVhdHVyZXNUZXh0c19baV0gIT0gbnVsbCAmJiAhZmVhdHVyZXNUZXh0c19baV0uaXNEaXNwb3NlZCgpKQotCQkJCWZlYXR1cmVzVGV4dHNfW2ldLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGFwdGluZ0ZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmVzXyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZSA9PSBmZWF0dXJlc19baV0pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGZWF0dXJlc09uQ2hpbGQoRU9iamVjdCBjaGlsZCkgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBRTmFtZSkgLy9UaGlzIHdpbGwgYWx3YXlzIGJlIHRydWUuCi0JCXsKLQkJCVFOYW1lIHFuYW1lID0gKFFOYW1lKSBjaGlsZDsKLQkJCVN0cmluZyBuYW1lc3BhY2VVUklWYWx1ZSA9IGZlYXR1cmVzVGV4dHNfWzBdLmdldFRleHQoKTsKLQkJCVN0cmluZyBsb2NhbFBhcnRWYWx1ZSA9IGZlYXR1cmVzVGV4dHNfWzFdLmdldFRleHQoKTsKLQkJCWlmIChuYW1lc3BhY2VVUklWYWx1ZSA9PSBudWxsIHx8IG5hbWVzcGFjZVVSSVZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkvL0p1c3Qgc2V0IHRoZSBsb2NhbCBwYXJ0Ci0JCQkJaWYgKGxvY2FsUGFydFZhbHVlICE9IG51bGwgJiYgbG9jYWxQYXJ0VmFsdWUubGVuZ3RoKCkgPiAwKQotCQkJCQlxbmFtZS5zZXRMb2NhbFBhcnQobG9jYWxQYXJ0VmFsdWUpOwotCi0JCQl9IGVsc2UgewotCQkJCWlmIChsb2NhbFBhcnRWYWx1ZSA9PSBudWxsKQotCQkJCQlsb2NhbFBhcnRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvL1NldCBuYW1lc3BhY2UgYW5kIGxvY2FsIHBhcnQgdXNpbmcgUU5hbWVIZWxwZXIKLQkJCQlRTmFtZUhlbHBlci5zZXRRTmFtZVZhbHVlKHFuYW1lLCBuYW1lc3BhY2VVUklWYWx1ZSwgbG9jYWxQYXJ0VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZVRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUU5hbWVUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGE0Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeU5TVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi0KLQotLyoqCi0gKiBTaW5jZSBnZW5lcmljIGVTZXQncyB3aWxsIG5vdCB3b3JrIGZvciBzZXR0aW5nIFFOYW1lIG5hbWVzcGFjZVVSSSdzLCB0aGlzIHN1YmNsYXNzJ3MgcHVycG9zZSBpcwotICogdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciB3aGVuIG5lY2Vzc2FyeS4KLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJRTmFtZVRleHQgZXh0ZW5kcyBBZGFwdGVyVGV4dCB7Ci0KLQlwdWJsaWMgQWRhcHRlclFOYW1lVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoYW5BcnRpZmFjdEVkaXQsIGZlYXR1cmUsIHRleHQsIG5pbGxhYmxlKTsKLQl9Ci0KLQotCXB1YmxpYyBBZGFwdGVyUU5hbWVUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgVGV4dCB0ZXh0LCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGFuQXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlLCB0ZXh0LCBuaWxsYWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCS8vSGFuZGxlIFFOYW1lX05hbWVzcGFjZVVSSSBmZWF0dXJlIGluIGEgc3BlY2lhbCB3YXkuCi0JCQlTdHJpbmcgbmFtZXNwYWNlRmVhdHVyZU5hbWUgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKS5nZXROYW1lKCk7Ci0JCQlpZiAoKGVPYmplY3RfIGluc3RhbmNlb2YgUU5hbWUpICYmIChmZWF0dXJlXy5nZXROYW1lKCkuZXF1YWxzKG5hbWVzcGFjZUZlYXR1cmVOYW1lKSkpIHsKLQkJCQlDb21tYW5kTW9kaWZ5TlNVUkkgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5TlNVUkkobnVsbCwgbnVsbCwgKFFOYW1lKSBlT2JqZWN0XywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCQl9IAotCQkJfSBlbHNlIHsKLQkJCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCQl9IAotCQkJfQotCi0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDUwYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJTZXJ2aWNlSW50ZXJmYWNlVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLS8qCi0gKiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5U2VydmljZUludGVyZmFjZVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJTZXJ2aWNlSW50ZXJmYWNlVGV4dCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0OwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmIGVPYmplY3RfOwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJvdGVjdGVkIFRleHQgdGV4dF87Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbmlsbGFibGVfOwotCi0JcHVibGljIEFkYXB0ZXJTZXJ2aWNlSW50ZXJmYWNlVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIFRleHQgdGV4dCkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQkJZU9iamVjdF8gPSBudWxsOwotCQlmZWF0dXJlXyA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCk7Ci0JCXRleHRfID0gdGV4dDsKLQkJbmlsbGFibGVfID0gZmFsc2U7Ci0JCXRleHRfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyU2VydmljZUludGVyZmFjZVRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBTZXJ2aWNlUmVmIGVPYmplY3QsIFRleHQgdGV4dCkgewotCQl0aGlzKGFuQXJ0aWZhY3RFZGl0LCB0ZXh0KTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCkgJiYgc3luY1RleHRBbmRNb2RlbCgpICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gZmVhdHVyZV8pIHsKLQkJCVN0cmluZyBuZXdDbGFzc05hbWUgPSBlT2JqZWN0Xy5nZXRTZXJ2aWNlSW50ZXJmYWNlKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCXNldFRleHQobmV3Q2xhc3NOYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5U2VydmljZUludGVyZmFjZVRleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5U2VydmljZUludGVyZmFjZVRleHQobnVsbCwgbnVsbCwgZU9iamVjdF8sIHRleHRfLmdldFRleHQoKSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChTZXJ2aWNlUmVmIGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCWlmIChlT2JqZWN0Xy5nZXRTZXJ2aWNlSW50ZXJmYWNlKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuZXdDbGFzc05hbWUgPSBlT2JqZWN0Xy5nZXRTZXJ2aWNlSW50ZXJmYWNlKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCQlzZXRUZXh0KG5ld0NsYXNzTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNldFRleHQobnVsbCk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJc2V0VGV4dChudWxsKTsKLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsgZmVhdHVyZV8gPSBmZWF0dXJlOwotCSAqIGFkYXB0KGVPYmplY3QpOyB9Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh0ZXh0XyAhPSBudWxsICYmICF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jVGV4dEFuZE1vZGVsKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsVmFsdWUgPSBudWxsOwotCQkJaWYgKGVPYmplY3RfLmdldFNlcnZpY2VJbnRlcmZhY2UoKSAhPSBudWxsKQotCQkJCW1vZGVsVmFsdWUgPSBlT2JqZWN0Xy5nZXRTZXJ2aWNlSW50ZXJmYWNlKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCVN0cmluZyB0ZXh0VmFsdWUgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAobW9kZWxWYWx1ZSA9PSBudWxsIHx8IG1vZGVsVmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlyZXR1cm4gISh0ZXh0VmFsdWUgPT0gbnVsbCB8fCB0ZXh0VmFsdWUubGVuZ3RoKCkgPD0gMCk7Ci0JCQlyZXR1cm4gIShtb2RlbFZhbHVlLmVxdWFscyh0ZXh0VmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVN0cmluZyBjdXJyVGV4dCA9IHRleHRfLmdldFRleHQoKTsKLQkJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJaWYgKGN1cnJUZXh0ICE9IG51bGwgJiYgY3VyclRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQl0ZXh0Xy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmICghdGV4dC5lcXVhbHMoY3VyclRleHQpKQotCQkJCXRleHRfLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3YTU5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclRleHQgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgRU9iamVjdCBlT2JqZWN0XzsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByb3RlY3RlZCBUZXh0IHRleHRfOwotCXByb3RlY3RlZCBib29sZWFuIG5pbGxhYmxlXzsKLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQotCXB1YmxpYyBBZGFwdGVyVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQl0ZXh0XyA9IHRleHQ7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCQl0ZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlclRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykKLQkJCXNldFRleHQobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJc2V0VGV4dCgoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKSk7Ci0JCX0gZWxzZQotCQkJc2V0VGV4dChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh0ZXh0XyAhPSBudWxsICYmICF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jVGV4dEFuZE1vZGVsKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsVmFsdWUgPSAoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCVN0cmluZyB0ZXh0VmFsdWUgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAobW9kZWxWYWx1ZSA9PSBudWxsIHx8IG1vZGVsVmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlyZXR1cm4gISh0ZXh0VmFsdWUgPT0gbnVsbCB8fCB0ZXh0VmFsdWUubGVuZ3RoKCkgPD0gMCk7Ci0JCQlyZXR1cm4gIShtb2RlbFZhbHVlLmVxdWFscyh0ZXh0VmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRleHRfLmlzRGlzcG9zZWQoKSkgewotCQkJU3RyaW5nIGN1cnJUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQlpZiAoY3VyclRleHQgIT0gbnVsbCAmJiBjdXJyVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCXRleHRfLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKCF0ZXh0LmVxdWFscyhjdXJyVGV4dCkpCi0JCQkJdGV4dF8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZUVkaXRNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogICAgICAgICAgICBUaGUgajJlZUVkaXRNb2RlbCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCkgewotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclRleHRDQ29tYm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVGV4dENDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGRmODRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVGV4dENDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclRleHRDQ29tYm8gZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXRfOwotCXByaXZhdGUgRU9iamVjdCBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIENDb21ibyB0ZXh0XzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCi0JcHVibGljIEFkYXB0ZXJUZXh0Q0NvbWJvKEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDQ29tYm8gdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXRfID0gYXJ0aWZhY3RFZGl0OwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJdGV4dF8gPSB0ZXh0OwotCQluaWxsYWJsZV8gPSBuaWxsYWJsZTsKLQkJdGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJUZXh0Q0NvbWJvKEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENDb21ibyB0ZXh0LCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRoaXMoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlLCB0ZXh0LCBuaWxsYWJsZSk7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQpICYmIHN5bmNUZXh0QW5kTW9kZWwoKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGZlYXR1cmVfKQotCQkJc2V0VGV4dChtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCUNvbW1hbmRNb2RpZnlUZXh0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeVRleHQobnVsbCwgbnVsbCwgZU9iamVjdF8sIGZlYXR1cmVfLCB0ZXh0Xy5nZXRUZXh0KCksIG5pbGxhYmxlXyk7Ci0JCQlhcnRpZmFjdEVkaXRfLmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCWFydGlmYWN0RWRpdF8uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJc2V0VGV4dCgoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKSk7Ci0JCX0gZWxzZQotCQkJc2V0VGV4dChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh0ZXh0XyAhPSBudWxsICYmICF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3luY1RleHRBbmRNb2RlbCgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCVN0cmluZyBtb2RlbFZhbHVlID0gKFN0cmluZykgZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQlTdHJpbmcgdGV4dFZhbHVlID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodGV4dFZhbHVlID09IG51bGwgfHwgdGV4dFZhbHVlLmxlbmd0aCgpIDw9IDApOwotCQkJcmV0dXJuICEobW9kZWxWYWx1ZS5lcXVhbHModGV4dFZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGV4dF8uaXNEaXNwb3NlZCgpKSB7Ci0JCQlTdHJpbmcgY3VyclRleHQgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCWlmIChjdXJyVGV4dCAhPSBudWxsICYmIGN1cnJUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJdGV4dF8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoIXRleHQuZXF1YWxzKGN1cnJUZXh0KSkKLQkJCQl0ZXh0Xy5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDYyOWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJWaWV3ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IGVPYmplY3RfOwotCXByaXZhdGUgVmlld2VyIHZpZXdlcl87Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZmVhdHVyZXNfOwotCi0JcHVibGljIEFkYXB0ZXJWaWV3ZXIoVmlld2VyIHZpZXdlcikgewotCQlzdXBlcigpOwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCXZpZXdlcl8gPSB2aWV3ZXI7Ci0JCWZlYXR1cmVzXyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlclZpZXdlcihFT2JqZWN0IGVPYmplY3QsIFZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcyh2aWV3ZXIpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uQUREIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gbXNnLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgPT0gZU9iamVjdF8pIHsKLQkJCQlpZiAodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkKLQkJCQkJaW50ZXJuYWxBZGFwdEZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgbXNnLmdldEZlYXR1cmUoKSk7Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIG9iamVjdDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgaXRlbSA9IGVMaXN0LmdldChpKTsKLQkJCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkJCSgoRU9iamVjdCkgaXRlbSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdmlld2VyXy5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCXVuYWRhcHRBbGxDYWNoZWRGZWF0dXJlKCk7Ci0JCX0KLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJcmVhZGFwdEFsbENhY2hlZEZlYXR1cmUoKTsKLQkJfQotCQl2aWV3ZXJfLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKCFmZWF0dXJlc18uY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCWZlYXR1cmVzXy5hZGQoZmVhdHVyZSk7Ci0JCQlpbnRlcm5hbEFkYXB0RmVhdHVyZShmZWF0dXJlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEFkYXB0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJT2JqZWN0IGZlYXR1cmVPYmplY3QgPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKGZlYXR1cmVPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRUxpc3QgZUFkYXB0ZXJzID0gKChFT2JqZWN0KSBmZWF0dXJlT2JqZWN0KS5lQWRhcHRlcnMoKTsKLQkJCQlpZiAoIWVBZGFwdGVycy5jb250YWlucyh0aGlzKSkKLQkJCQkJZUFkYXB0ZXJzLmFkZCh0aGlzKTsKLQkJCX0gZWxzZSBpZiAoZmVhdHVyZU9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIGZlYXR1cmVPYmplY3Q7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gZUxpc3QuZ2V0KGkpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJRUxpc3QgZUFkYXB0ZXJzID0gKChFT2JqZWN0KSBvYmplY3QpLmVBZGFwdGVycygpOwotCQkJCQkJaWYgKCFlQWRhcHRlcnMuY29udGFpbnModGhpcykpCi0JCQkJCQkJZUFkYXB0ZXJzLmFkZCh0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkYXB0QWxsQ2FjaGVkRmVhdHVyZSgpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW2ZlYXR1cmVzXy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNbaV0gPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlc18uZ2V0KGkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaW50ZXJuYWxBZGFwdEZlYXR1cmUoZmVhdHVyZXNbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuYWRhcHRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVzXy5yZW1vdmUoZmVhdHVyZSk7Ci0JCWludGVybmFsVW5hZGFwdEZlYXR1cmUoZmVhdHVyZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsVW5hZGFwdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCU9iamVjdCBmZWF0dXJlT2JqZWN0ID0gZU9iamVjdF8uZUdldChmZWF0dXJlKTsKLQkJCWlmIChmZWF0dXJlT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkoKEVPYmplY3QpIGZlYXR1cmVPYmplY3QpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWVsc2UgaWYgKGZlYXR1cmVPYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCUVMaXN0IGVMaXN0ID0gKEVMaXN0KSBmZWF0dXJlT2JqZWN0OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGVMaXN0LmdldChpKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJCQkoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmFkYXB0QWxsQ2FjaGVkRmVhdHVyZSgpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW2ZlYXR1cmVzXy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNbaV0gPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlc18uZ2V0KGkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaW50ZXJuYWxVbmFkYXB0RmVhdHVyZShmZWF0dXJlc1tpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXVuYWRhcHRBbGxDYWNoZWRGZWF0dXJlKCk7Ci0JCWZlYXR1cmVzXyA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VySXRlbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXJJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmEzMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXJJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyVmlld2VySXRlbSB7Ci0JcHJpdmF0ZSBFTGlzdCBlT2JqZWN0c187Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0KLQlwdWJsaWMgQWRhcHRlclZpZXdlckl0ZW0oRUxpc3QgZU9iamVjdHMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWVPYmplY3RzXyA9IGVPYmplY3RzOwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJWaWV3ZXJJdGVtKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZU9iamVjdHNfID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJZU9iamVjdHNfLmFkZChlT2JqZWN0KTsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFT2JqZWN0TGlzdCgpIHsKLQkJcmV0dXJuIGVPYmplY3RzXzsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmVfOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZENsaWVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkQ2xpZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY5ZmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkQ2xpZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIENvbW1hbmRBZGRDbGllbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFNlcnZpY2VSZWYgcGFyZW50XzsKLQlwcml2YXRlIEhhbmRsZXIgbmV3Q2hpbGRfOwotCi0JLy9wcml2YXRlIGJvb2xlYW4gb2xkQ2hpbGRTZXRfOwotCi0JcHVibGljIENvbW1hbmRBZGRDbGllbnRIYW5kbGVyKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIHBhcmVudCwgSGFuZGxlciBuZXdDaGlsZCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQluZXdDaGlsZF8gPSBuZXdDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZENsaWVudEhhbmRsZXIoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFNlcnZpY2VSZWYgcGFyZW50LCBTdHJpbmcgaGFuZGxlck5hbWUsIEphdmFDbGFzcyBoYW5kbGVyQ2xhc3MpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJbmV3Q2hpbGRfID0gY3JlYXRlTmV3SGFuZGxlcihoYW5kbGVyTmFtZSwgaGFuZGxlckNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZENsaWVudEhhbmRsZXIoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFNlcnZpY2VSZWYgcGFyZW50LCBTdHJpbmcgaGFuZGxlck5hbWUsIFN0cmluZyBoYW5kbGVyQ2xhc3NOYW1lKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCUphdmFDbGFzcyBoYW5kbGVyQ2xhc3MgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoaGFuZGxlckNsYXNzTmFtZSk7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld0hhbmRsZXIoaGFuZGxlck5hbWUsIGhhbmRsZXJDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBIYW5kbGVyIGNyZWF0ZU5ld0hhbmRsZXIoU3RyaW5nIGhhbmRsZXJOYW1lLCBKYXZhQ2xhc3MgaGFuZGxlckNsYXNzKSB7Ci0JCVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBmYWN0b3J5ID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkoKTsKLQkJSGFuZGxlciBuZXdDaGlsZCA9IGZhY3RvcnkuY3JlYXRlSGFuZGxlcigpOwotCQluZXdDaGlsZC5zZXRIYW5kbGVyTmFtZShoYW5kbGVyTmFtZSk7Ci0JCW5ld0NoaWxkLnNldEhhbmRsZXJDbGFzcyhoYW5kbGVyQ2xhc3MpOwotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcGFyZW50Xy5nZXRIYW5kbGVycygpLmFkZChuZXdDaGlsZF8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlwYXJlbnRfLmdldEhhbmRsZXJzKCkucmVtb3ZlKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGVkT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3Q2hpbGRfOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzhlZWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kQWRkRWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIE9iamVjdCBuZXdDaGlsZF87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkQ2hpbGRfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZEVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBPYmplY3QgbmV3Q2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JCW9sZENoaWxkXyA9IG51bGw7Ci0JCW9sZENoaWxkU2V0XyA9IHRydWU7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmVbXSBjaGlsZFByb3BlcnRpZXMsIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld0NoaWxkKGNoaWxkRUNsYXNzLCAoY2hpbGRQcm9wZXJ0aWVzICE9IG51bGwpID8gY2hpbGRQcm9wZXJ0aWVzIDogbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVswXSwgKHByb3BlcnR5VmFsdWVzICE9IG51bGwpID8gcHJvcGVydHlWYWx1ZXMgOiBuZXcgT2JqZWN0WzBdKTsKLQkJb2xkQ2hpbGRfID0gbnVsbDsKLQkJb2xkQ2hpbGRTZXRfID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVOZXdDaGlsZChFQ2xhc3MgY2hpbGRFQ2xhc3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGNoaWxkUHJvcGVydGllcywgT2JqZWN0W10gcHJvcGVydHlWYWx1ZXMpIHsKLQkJRUZhY3RvcnkgZUZhY3RvcnkgPSBjaGlsZEVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJRU9iamVjdCBuZXdDaGlsZCA9IGVGYWN0b3J5LmNyZWF0ZShjaGlsZEVDbGFzcyk7Ci0JCWlmIChuZXdDaGlsZCAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0JCQkJbmV3Q2hpbGQuZVNldChjaGlsZFByb3BlcnRpZXNbaV0sIHByb3BlcnR5VmFsdWVzW2ldKTsKLQkJcmV0dXJuIG5ld0NoaWxkOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpKSB7Ci0JCQlpZiAobmV3Q2hpbGRfICE9IG51bGwpCi0JCQkJKChFTGlzdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pKS5hZGQobmV3Q2hpbGRfKTsKLQkJfSBlbHNlIHsKLQkJCW9sZENoaWxkXyA9IHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCW9sZENoaWxkU2V0XyA9IHBhcmVudF8uZUlzU2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJcGFyZW50Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIG5ld0NoaWxkXyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpIHsKLQkJCWlmIChuZXdDaGlsZF8gIT0gbnVsbCkKLQkJCQkoKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXykpLnJlbW92ZShuZXdDaGlsZF8pOwotCQl9IGVsc2UgewotCQkJaWYgKG9sZENoaWxkU2V0XykKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgb2xkQ2hpbGRfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGRlZE9iamVjdCgpIHsKLQkJcmV0dXJuIG5ld0NoaWxkXzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRQb3J0Q29tcG9uZW50UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZFBvcnRDb21wb25lbnRSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiZjlkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZFBvcnRDb21wb25lbnRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kQWRkUG9ydENvbXBvbmVudFJlZiBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmIHBhcmVudF87Ci0JcHJpdmF0ZSBQb3J0Q29tcG9uZW50UmVmIG5ld0NoaWxkXzsKLQotCS8vcHJpdmF0ZSBib29sZWFuIG9sZENoaWxkU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kQWRkUG9ydENvbXBvbmVudFJlZihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFBvcnRDb21wb25lbnRSZWYgbmV3Q2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRQb3J0Q29tcG9uZW50UmVmKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIHBhcmVudCwgU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rLCBKYXZhQ2xhc3Mgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld1BvcnRDb21wb25lbnRSZWYocG9ydENvbXBvbmVudExpbmssIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRQb3J0Q29tcG9uZW50UmVmKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIHBhcmVudCwgU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rLCBTdHJpbmcgc2VpTmFtZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQlKYXZhQ2xhc3Mgc2VpQ2xhc3MgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoc2VpTmFtZSk7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld1BvcnRDb21wb25lbnRSZWYocG9ydENvbXBvbmVudExpbmssIHNlaUNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFBvcnRDb21wb25lbnRSZWYgY3JlYXRlTmV3UG9ydENvbXBvbmVudFJlZihTdHJpbmcgcG9ydENvbXBvbmVudExpbmssIEphdmFDbGFzcyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLQkJV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IGZhY3RvcnkgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSgpOwotCQlQb3J0Q29tcG9uZW50UmVmIG5ld0NoaWxkID0gZmFjdG9yeS5jcmVhdGVQb3J0Q29tcG9uZW50UmVmKCk7Ci0JCW5ld0NoaWxkLnNldFBvcnRDb21wb25lbnRMaW5rKHBvcnRDb21wb25lbnRMaW5rKTsKLQkJbmV3Q2hpbGQuc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwYXJlbnRfLmdldFBvcnRDb21wb25lbnRSZWZzKCkuYWRkKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXBhcmVudF8uZ2V0UG9ydENvbXBvbmVudFJlZnMoKS5yZW1vdmUobmV3Q2hpbGRfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRkZWRPYmplY3QoKSB7Ci0JCXJldHVybiBuZXdDaGlsZF87Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkU2VydmljZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRTZXJ2aWNlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOGNlMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRTZXJ2aWNlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIENvbW1hbmRBZGRTZXJ2aWNlUmVmIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFdlYlNlcnZpY2VzQ2xpZW50IHBhcmVudF87Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmIG5ld0NoaWxkXzsKLQotCS8vcHJpdmF0ZSBib29sZWFuIG9sZENoaWxkU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kQWRkU2VydmljZVJlZihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgV2ViU2VydmljZXNDbGllbnQgcGFyZW50LCBTZXJ2aWNlUmVmIG5ld0NoaWxkKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IG5ld0NoaWxkOwotCX0KLQotCXB1YmxpYyBDb21tYW5kQWRkU2VydmljZVJlZihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgV2ViU2VydmljZXNDbGllbnQgcGFyZW50LCBTdHJpbmcgc2VydmljZVJlZk5hbWUsIEphdmFDbGFzcyBzZXJ2aWNlSW50ZXJmYWNlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld1NlcnZpY2VSZWYoc2VydmljZVJlZk5hbWUsIHNlcnZpY2VJbnRlcmZhY2UpOwotCX0KLQotCXByaXZhdGUgU2VydmljZVJlZiBjcmVhdGVOZXdTZXJ2aWNlUmVmKFN0cmluZyBzZXJ2aWNlUmVmTmFtZSwgSmF2YUNsYXNzIHNlcnZpY2VJbnRlcmZhY2UpIHsKLQkJV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IGZhY3RvcnkgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSgpOwotCQlTZXJ2aWNlUmVmIG5ld0NoaWxkID0gZmFjdG9yeS5jcmVhdGVTZXJ2aWNlUmVmKCk7Ci0JCW5ld0NoaWxkLnNldFNlcnZpY2VSZWZOYW1lKHNlcnZpY2VSZWZOYW1lKTsKLQkJbmV3Q2hpbGQuc2V0U2VydmljZUludGVyZmFjZShzZXJ2aWNlSW50ZXJmYWNlKTsKLQkJcmV0dXJuIG5ld0NoaWxkOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXBhcmVudF8uZ2V0U2VydmljZVJlZnMoKS5hZGQobmV3Q2hpbGRfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJcGFyZW50Xy5nZXRTZXJ2aWNlUmVmcygpLnJlbW92ZShuZXdDaGlsZF8pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGRlZE9iamVjdCgpIHsKLQkJcmV0dXJuIG5ld0NoaWxkXzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2YzhlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW9kaWZ5RWxlbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmVbXSBwcm9wZXJ0aWVzXzsKLQlwcml2YXRlIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzXzsKLQlwcml2YXRlIE9iamVjdFtdIG9sZFByb3BlcnR5VmFsdWVzXzsKLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5RWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHByb3BlcnRpZXMsIE9iamVjdFtdIHByb3BlcnR5VmFsdWVzKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCXByb3BlcnRpZXNfID0gcHJvcGVydGllczsKLQkJcHJvcGVydHlWYWx1ZXNfID0gcHJvcGVydHlWYWx1ZXM7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZFByb3BlcnR5VmFsdWVzXyA9IG5ldyBPYmplY3RbcHJvcGVydGllc18ubGVuZ3RoXTsKLQotCQlpZiAocGFyZW50XyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb2xkUHJvcGVydHlWYWx1ZXNfW2ldID0gcGFyZW50Xy5lR2V0KHByb3BlcnRpZXNfW2ldKTsKLQkJCQlwYXJlbnRfLmVTZXQocHJvcGVydGllc19baV0sIHByb3BlcnR5VmFsdWVzX1tpXSk7Ci0JCQl9Ci0JCX0KLQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRQcm9wZXJ0eVZhbHVlc18ubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJlbnRfLmVTZXQocHJvcGVydGllc19baV0sIG9sZFByb3BlcnR5VmFsdWVzX1tpXSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjZTMxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgSGFuZGxlciBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIFN0cmluZyBuZXdWYWx1ZV87Ci0JcHJpdmF0ZSBKYXZhQ2xhc3Mgb2xkVmFsdWVfOwotCXByaXZhdGUgYm9vbGVhbiBuaWxsYWJsZV87Ci0JcHJpdmF0ZSBib29sZWFuIG9sZElzU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgSGFuZGxlciBlT2JqZWN0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlmZWF0dXJlXyA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKTsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpCi0JCQluZXdWYWx1ZV8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluZXdWYWx1ZV8gPSBuZXdWYWx1ZTsKLQkJbmlsbGFibGVfID0gZmFsc2U7Ci0JCW9sZFZhbHVlXyA9IG51bGw7Ci0JCW9sZElzU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkSXNTZXRfID0gZU9iamVjdF8uZUlzU2V0KGZlYXR1cmVfKTsKLQkJb2xkVmFsdWVfID0gZU9iamVjdF8uZ2V0SGFuZGxlckNsYXNzKCk7Ci0JCWVPYmplY3RfLnNldEhhbmRsZXJDbGFzcyhKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYobmV3VmFsdWVfKSk7Ci0JCWlmIChuaWxsYWJsZV8gJiYgbmV3VmFsdWVfID09IG51bGwpCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkSXNTZXRfKQotCQkJZU9iamVjdF8uc2V0SGFuZGxlckNsYXNzKG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlOU1VSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlOU1VSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI1NTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5TlNVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwudXRpbC5RTmFtZUhlbHBlcjsKLQotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlOU1VSSSBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBRTmFtZSBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIFN0cmluZyBuZXdWYWx1ZV87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkVmFsdWVfOwotCXByaXZhdGUgYm9vbGVhbiBuaWxsYWJsZV87Ci0JcHJpdmF0ZSBib29sZWFuIG9sZElzU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5TlNVUkkoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFFOYW1lIGVPYmplY3QsIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWZlYXR1cmVfID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWVfTmFtZXNwYWNlVVJJKCk7Ci0JCWlmIChuaWxsYWJsZSAmJiAobmV3VmFsdWUgPT0gbnVsbCB8fCBuZXdWYWx1ZS5sZW5ndGgoKSA8PSAwKSkKLQkJCW5ld1ZhbHVlXyA9IG51bGw7Ci0JCWVsc2UgaWYgKCFuaWxsYWJsZSAmJiBuZXdWYWx1ZSA9PSBudWxsKQotCQkJbmV3VmFsdWVfID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJbmV3VmFsdWVfID0gbmV3VmFsdWU7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCQlvbGRWYWx1ZV8gPSBudWxsOwotCQlvbGRJc1NldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZElzU2V0XyA9IGVPYmplY3RfLmVJc1NldChmZWF0dXJlXyk7Ci0JCW9sZFZhbHVlXyA9IGVPYmplY3RfLmdldE5hbWVzcGFjZVVSSSgpOwotCQlRTmFtZUhlbHBlci5zZXRRTmFtZU5hbWVzcGFjZVVSSShlT2JqZWN0XywgbmV3VmFsdWVfKTsKLQkJaWYgKG5pbGxhYmxlXyAmJiBuZXdWYWx1ZV8gPT0gbnVsbCkKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChvbGRJc1NldF8pCi0JCQllT2JqZWN0Xy5lU2V0KGZlYXR1cmVfLCBvbGRWYWx1ZV8pOwotCQllbHNlCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5U0VJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNFSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzI5NTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5U0VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW9kaWZ5U0VJIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFBvcnRDb21wb25lbnRSZWYgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgT2JqZWN0IG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5U0VJKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBQb3J0Q29tcG9uZW50UmVmIGVPYmplY3QsIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQlpZiAobmlsbGFibGUgJiYgKG5ld1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUubGVuZ3RoKCkgPD0gMCkpCi0JCQluZXdWYWx1ZV8gPSBudWxsOwotCQllbHNlIGlmICghbmlsbGFibGUgJiYgbmV3VmFsdWUgPT0gbnVsbCkKLQkJCW5ld1ZhbHVlXyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCW5ld1ZhbHVlXyA9IG5ld1ZhbHVlOwotCQluaWxsYWJsZV8gPSBuaWxsYWJsZTsKLQkJb2xkVmFsdWVfID0gbnVsbDsKLQkJb2xkSXNTZXRfID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+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+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlTZXJ2aWNlSW50ZXJmYWNlVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzNkZDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5U2VydmljZUludGVyZmFjZVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFNlcnZpY2VSZWYgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgSmF2YUNsYXNzIG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQlwdWJsaWMgQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIGVPYmplY3QsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpCi0JCQluZXdWYWx1ZV8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluZXdWYWx1ZV8gPSBuZXdWYWx1ZTsKLQkJbmlsbGFibGVfID0gZmFsc2U7Ci0JCW9sZFZhbHVlXyA9IG51bGw7Ci0JCW9sZElzU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkSXNTZXRfID0gZU9iamVjdF8uZUlzU2V0KGZlYXR1cmVfKTsKLQkJb2xkVmFsdWVfID0gZU9iamVjdF8uZ2V0U2VydmljZUludGVyZmFjZSgpOwotCQllT2JqZWN0Xy5zZXRTZXJ2aWNlSW50ZXJmYWNlKEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZihuZXdWYWx1ZV8pKTsKLQkJaWYgKG5pbGxhYmxlXyAmJiBuZXdWYWx1ZV8gPT0gbnVsbCkKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChvbGRJc1NldF8pCi0JCQllT2JqZWN0Xy5zZXRTZXJ2aWNlSW50ZXJmYWNlKG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3YmI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW9kaWZ5VGV4dCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IGVPYmplY3RfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByaXZhdGUgU3RyaW5nIG5ld1ZhbHVlXzsKLQlwcml2YXRlIE9iamVjdCBvbGRWYWx1ZV87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQlwcml2YXRlIGJvb2xlYW4gb2xkSXNTZXRfOwotCi0JcHVibGljIENvbW1hbmRNb2RpZnlUZXh0KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmV3VmFsdWUsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCWlmIChuaWxsYWJsZSAmJiAobmV3VmFsdWUgPT0gbnVsbCB8fCBuZXdWYWx1ZS5sZW5ndGgoKSA8PSAwKSkKLQkJCW5ld1ZhbHVlXyA9IG51bGw7Ci0JCWVsc2UgaWYgKCFuaWxsYWJsZSAmJiBuZXdWYWx1ZSA9PSBudWxsKQotCQkJbmV3VmFsdWVfID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJbmV3VmFsdWVfID0gbmV3VmFsdWU7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCQlvbGRWYWx1ZV8gPSBudWxsOwotCQlvbGRJc1NldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZElzU2V0XyA9IGVPYmplY3RfLmVJc1NldChmZWF0dXJlXyk7Ci0JCW9sZFZhbHVlXyA9IGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQllT2JqZWN0Xy5lU2V0KGZlYXR1cmVfLCBuZXdWYWx1ZV8pOwotCQlpZiAobmlsbGFibGVfICYmIG5ld1ZhbHVlXyA9PSBudWxsKQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9sZElzU2V0XykKLQkJCWVPYmplY3RfLmVTZXQoZmVhdHVyZV8sIG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb3ZlU2VydmljZVJlZnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW92ZVNlcnZpY2VSZWZzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDE2OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb3ZlU2VydmljZVJlZnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vdmVTZXJ2aWNlUmVmcyBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHNvdXJjZV87Ci0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIE9iamVjdFtdIGNoaWxkcmVuXzsKLQlwcml2YXRlIGJvb2xlYW4gaXNDb3B5XzsKLQlwcml2YXRlIE9iamVjdFtdIGNsb25lZENoaWxkcmVuXzsKLQlwcml2YXRlIEVMaXN0IHNlcnZpY2VSZWZzOwotCi0JcHVibGljIENvbW1hbmRNb3ZlU2VydmljZVJlZnMoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IHRhcmdldCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgT2JqZWN0W10gY2hpbGRyZW4sIGJvb2xlYW4gaXNDb3B5LCBFTGlzdCBzZXJ2aWNlUmVmcykgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlzb3VyY2VfID0gc291cmNlOwotCQl0YXJnZXRfID0gdGFyZ2V0OwotCQljaGlsZEZlYXR1cmVfID0gY2hpbGRGZWF0dXJlOwotCQljaGlsZHJlbl8gPSBjaGlsZHJlbjsKLQkJaXNDb3B5XyA9IGlzQ29weTsKLQkJY2xvbmVkQ2hpbGRyZW5fID0gbnVsbDsKLQkJdGhpcy5zZXJ2aWNlUmVmcyA9IHNlcnZpY2VSZWZzOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGNsb25lT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQlFTGlzdCBjbG9uZSA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChFTGlzdCkgb2JqZWN0KS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJY2xvbmUuYWRkKGNsb25lT2JqZWN0KGl0Lm5leHQoKSkpOwotCQkJfQotCQkJcmV0dXJuIGNsb25lOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IHNvdXJjZSA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpOwotCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCUVGYWN0b3J5IGVGYWN0b3J5ID0gZVBhY2thZ2UuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQkJRU9iamVjdCBjbG9uZSA9IGVGYWN0b3J5LmNyZWF0ZShlQ2xhc3MpOwotCQkJRUxpc3QgZmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCQlpZiAoc291cmNlLmVJc1NldChmZWF0dXJlKSkgewotCQkJCQlPYmplY3QgY2xvbmVkRmVhdHVyZSA9IGNsb25lT2JqZWN0KHNvdXJjZS5lR2V0KGZlYXR1cmUpKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpCi0JCQkJCQkoKExpc3QpIGNsb25lLmVHZXQoZmVhdHVyZSkpLmFkZEFsbCgoTGlzdCkgY2xvbmVkRmVhdHVyZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNsb25lLmVTZXQoZmVhdHVyZSwgY2xvbmVkRmVhdHVyZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNsb25lLmVVbnNldChmZWF0dXJlKTsKLQkJCX0KLQkJCXJldHVybiBjbG9uZTsKLQkJfQotCQlpZiAob2JqZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZyhvYmplY3QudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChjaGlsZEZlYXR1cmVfLmlzTWFueSgpKQotCQkJZXhlY3V0ZU1hbnkoKTsKLQkJZWxzZQotCQkJZXhlY3V0ZVNpbmdsZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlU2luZ2xlKCkgewotCQlPYmplY3QgY2hpbGQgPSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWlmIChpc0NvcHlfKQotCQkJdGFyZ2V0Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIGNsb25lT2JqZWN0KGNoaWxkKSk7Ci0JCWVsc2UgewotCQkJc291cmNlXy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQl0YXJnZXRfLmVTZXQoY2hpbGRGZWF0dXJlXywgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVNYW55KCkgewotCQlFTGlzdCBzb3VyY2VMaXN0OwotCQlpZiAoc291cmNlXyBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzQ2xpZW50KQotCQkJc291cmNlTGlzdCA9IHNlcnZpY2VSZWZzOwotCQllbHNlCi0JCQlzb3VyY2VMaXN0ID0gKEVMaXN0KSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCUVMaXN0IHRhcmdldExpc3Q7Ci0JCWlmICh0YXJnZXRfIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpCi0JCQl0YXJnZXRMaXN0ID0gc2VydmljZVJlZnM7Ci0JCWVsc2UKLQkJCXRhcmdldExpc3QgPSAoRUxpc3QpIHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJaWYgKGlzQ29weV8pCi0JCQljbG9uZWRDaGlsZHJlbl8gPSBuZXcgT2JqZWN0W2NoaWxkcmVuXy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuXy5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gc291cmNlTGlzdC5pbmRleE9mKGNoaWxkcmVuX1tpXSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlpZiAoaXNDb3B5XykgewotCQkJCQljbG9uZWRDaGlsZHJlbl9baV0gPSBjbG9uZU9iamVjdChjaGlsZHJlbl9baV0pOwotCQkJCQl0YXJnZXRMaXN0LmFkZChjbG9uZWRDaGlsZHJlbl9baV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNvdXJjZUxpc3QucmVtb3ZlKGluZGV4KTsKLQkJCQkJdGFyZ2V0TGlzdC5hZGQoY2hpbGRyZW5fW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpCi0JCQl1bmRvU2luZ2xlKCk7Ci0JCWVsc2UKLQkJCXVuZG9NYW55KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9TaW5nbGUoKSB7Ci0JCU9iamVjdCBjaGlsZCA9IHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJdGFyZ2V0Xy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCWlmICghaXNDb3B5XykKLQkJCXNvdXJjZV8uZVNldChjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9NYW55KCkgewotCQlFTGlzdCBzb3VyY2VMaXN0OwotCQlpZiAoc291cmNlXyBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzQ2xpZW50KQotCQkJc291cmNlTGlzdCA9IHNlcnZpY2VSZWZzOwotCQllbHNlCi0JCQlzb3VyY2VMaXN0ID0gKEVMaXN0KSBzb3VyY2VfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCUVMaXN0IHRhcmdldExpc3Q7Ci0JCWlmICh0YXJnZXRfIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpCi0JCQl0YXJnZXRMaXN0ID0gc2VydmljZVJlZnM7Ci0JCWVsc2UKLQkJCXRhcmdldExpc3QgPSAoRUxpc3QpIHRhcmdldF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJaWYgKGlzQ29weV8pIHsKLQkJCWlmIChjbG9uZWRDaGlsZHJlbl8gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xvbmVkQ2hpbGRyZW5fLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRhcmdldExpc3QucmVtb3ZlKGNsb25lZENoaWxkcmVuX1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbl8ubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaW5kZXggPSB0YXJnZXRMaXN0LmluZGV4T2YoY2hpbGRyZW5fW2ldKTsKLQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJdGFyZ2V0TGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJCQlzb3VyY2VMaXN0LmFkZChjaGlsZHJlbl9baV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kUmVtb3ZlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRSZW1vdmVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzM4OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRSZW1vdmVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRSZW1vdmVFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEVPYmplY3QgcGFyZW50XzsKLQlwcml2YXRlIE9iamVjdCBjaGlsZF87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkQ2hpbGRfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCi0JcHVibGljIENvbW1hbmRSZW1vdmVFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQl0aGlzKGxhYmVsLCBkZXNjcmlwdGlvbiwgcGFyZW50LCBjaGlsZEZlYXR1cmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kUmVtb3ZlRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJdGhpcyhsYWJlbCwgZGVzY3JpcHRpb24sIHBhcmVudCwgbnVsbCwgY2hpbGRGZWF0dXJlLCBuaWxsYWJsZSk7Ci0JfQotCi0JcHVibGljIENvbW1hbmRSZW1vdmVFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCXRoaXMobGFiZWwsIGRlc2NyaXB0aW9uLCBwYXJlbnQsIGNoaWxkLCBjaGlsZEZlYXR1cmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kUmVtb3ZlRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQljaGlsZF8gPSBjaGlsZDsKLQkJb2xkQ2hpbGRfID0gbnVsbDsKLQkJb2xkQ2hpbGRTZXRfID0gdHJ1ZTsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpIHsKLQkJCWlmIChjaGlsZF8gIT0gbnVsbCkKLQkJCQkoKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXykpLnJlbW92ZShjaGlsZF8pOwotCQl9IGVsc2UgewotCQkJb2xkQ2hpbGRfID0gcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJb2xkQ2hpbGRTZXRfID0gcGFyZW50Xy5lSXNTZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlpZiAobmlsbGFibGVfKQotCQkJCXBhcmVudF8uZVVuc2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJZWxzZQotCQkJCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoY2hpbGRGZWF0dXJlXy5pc01hbnkoKSkgewotCQkJaWYgKGNoaWxkXyAhPSBudWxsKQotCQkJCSgoRUxpc3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKSkuYWRkKGNoaWxkXyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAob2xkQ2hpbGRTZXRfKQotCQkJCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBvbGRDaGlsZF8pOwotCQkJZWxzZQotCQkJCXBhcmVudF8uZVVuc2V0KGNoaWxkRmVhdHVyZV8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRTZXRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFNldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkMzA5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFNldEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZFNldEVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgRU9iamVjdCBwYXJlbnRfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZV87Ci0JcHJpdmF0ZSBPYmplY3QgbmV3Q2hpbGRfOwotCXByaXZhdGUgT2JqZWN0IG9sZENoaWxkXzsKLQlwcml2YXRlIGJvb2xlYW4gb2xkQ2hpbGRTZXRfOwotCi0JcHVibGljIENvbW1hbmRTZXRFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgT2JqZWN0IG5ld0NoaWxkKSB7Ci0JCXRoaXMobGFiZWwsIGRlc2NyaXB0aW9uLCBwYXJlbnQsIGNoaWxkRmVhdHVyZSwgbmV3Q2hpbGQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kU2V0RWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIE9iamVjdCBuZXdDaGlsZCwgT2JqZWN0IG9sZENoaWxkKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCW5ld0NoaWxkXyA9IG5ld0NoaWxkOwotCQlvbGRDaGlsZF8gPSBvbGRDaGlsZDsKLQkJb2xkQ2hpbGRTZXRfID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAoY2hpbGRGZWF0dXJlXy5pc01hbnkoKSAmJiAhKG5ld0NoaWxkXyBpbnN0YW5jZW9mIEVMaXN0KSkgewotCQkJaWYgKG9sZENoaWxkXyAhPSBudWxsICYmIG5ld0NoaWxkXyAhPSBudWxsKSB7Ci0JCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCQlpbnQgaW5kZXggPSBlTGlzdC5pbmRleE9mKG9sZENoaWxkXyk7Ci0JCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCQllTGlzdC5zZXQoaW5kZXgsIG5ld0NoaWxkXyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvbGRDaGlsZF8gPSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlvbGRDaGlsZFNldF8gPSBwYXJlbnRfLmVJc1NldChjaGlsZEZlYXR1cmVfKTsKLQkJCWlmIChuZXdDaGlsZF8gIT0gbnVsbCkKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgbmV3Q2hpbGRfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoY2hpbGRGZWF0dXJlXy5pc01hbnkoKSAmJiAhKG5ld0NoaWxkXyBpbnN0YW5jZW9mIEVMaXN0KSkgewotCQkJaWYgKG9sZENoaWxkXyAhPSBudWxsICYmIG5ld0NoaWxkXyAhPSBudWxsKSB7Ci0JCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCQlpbnQgaW5kZXggPSBlTGlzdC5pbmRleE9mKG5ld0NoaWxkXyk7Ci0JCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCQllTGlzdC5zZXQoaW5kZXgsIG9sZENoaWxkXyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAob2xkQ2hpbGRTZXRfKQotCQkJCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBvbGRDaGlsZF8pOwotCQkJZWxzZQotCQkJCXBhcmVudF8uZVVuc2V0KGNoaWxkRmVhdHVyZV8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9KYXhSUENNYXBBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhMmRjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9KYXhSUENNYXBBcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tcG9uZW50Y29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIFdTRERBcnRpZmFjdEVkaXQgb2J0YWlucyBhIFdTIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YSBmcm9tIGEKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZSBtZXRhbW9kZWwuIFRoZQotICoge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwO2lzIHJldHJpZXZlZCBmcm9tIHRoZQotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwO3VzaW5nIGEgY29uc3RhbnQge0BzZWUKLSAqIEoyRUVDb25zdGFudHMjRUpCSkFSX0REX1VSSV9PQkp9LiBUaGUgZGVmaW5lZCBtZXRob2RzIGV4dHJhY3QgZGF0YSBvciBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZgotICogdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKiAKLSAqLyAKLXB1YmxpYyBjbGFzcyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IHsKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBXU0REQXJ0aWZhY3RFZGl0IHRvIGEgV3NkZEFkYXB0ZXJGYWN0b3J5IHtAc2VlCi0JICogV3NkZEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4gYW4gQWRhcHRlck1hbmdlciAoQHNlZSBBZGFwdGVyTWFuYWdlcikKLQkgKiA8L3A+Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IEpheFJQQ01hcEFydGlmYWN0RWRpdC5jbGFzczsKLQkKLQotCS8qKgotCSAqIEBwYXJhbSBhSGFuZGxlCi0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIEpheFJQQ01hcEFydGlmYWN0RWRpdChJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkFydGlmYWN0RWRpdE1vZGVsCi0JICovCi0JcHVibGljIEpheFJQQ01hcEFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1wb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8gCi0JcHVibGljIEpheFJQQ01hcEFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCXN1cGVyKGFOYXR1cmUsIGFNb2R1bGUsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gV3NkZFJlc291cmNlIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkKLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgSmF4cnBjbWFwUmVzb3VyY2UgZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UoU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCQkKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JCVJlc291cmNlU2V0IHJlc1NldCA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkpIHJlc1NldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQlyZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudCh1cmkubGFzdFNlZ21lbnQoKSwgbmV3IEpheHJwY21hcFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0KLQkJSmF4cnBjbWFwUmVzb3VyY2UgamF4cnBjbWFwUmVzID0gKEpheHJwY21hcFJlc291cmNlKSByZXNTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQkKLQkJcmV0dXJuIGpheHJwY21hcFJlczsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIEoyRUUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIEVKQlJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIFNwZWMgdmVyc2lvbgotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCQlyZXR1cm4gZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UobWFwcGluZ0ZpbGVQYXRoVVJJKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZyBkZWZpbmVkIFVSSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXNvdXJjZQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKFN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkpIHsKLQkJcmV0dXJuIGdldEpheFJQQ01hcFhtaVJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JfQotCQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gV2ViU2VydmljZXMgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICogIAotCSAqLwotCXB1YmxpYyBKYXZhV1NETE1hcHBpbmcgZ2V0SmF2YVdTRExNYXBwaW5nKCkgewotCQlyZXR1cm4gKEphdmFXU0RMTWFwcGluZykgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIE9idGFpbnMgdGhlIFdlYlNlcnZpY2VzIChAc2VlIFdlYlNlcnZpY2VzKSByb290IG9iamVjdCBmcm9tIHRoZSBXc2RkUmVzb3VyY2UuIElmIHRoZSByb290IG9iamVjdCBkb2VzCi0JICogbm90IGV4aXN0LCB0aGVuIG9uZSBpcyBjcmVhdGVkIChAbGluayBhZGRFSkJKYXJJZk5lY2Vzc2FyeShnZXRFSkJKYXJYbWlSZXNvdXJjZSgpKSkuCi0JICogVGhlIHJvb3Qgb2JqZWN0IGNvbnRhaW5zIGFsbCBvdGhlciByZXNvdXJjZSBkZWZpbmVkIG9iamVjdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqICAKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCQlMaXN0IGNvbnRlbnRzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZShtYXBwaW5nRmlsZVBhdGhVUkkpLmdldENvbnRlbnRzKCk7Ci0JCWlmIChjb250ZW50cy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCWFkZEphdmFXU0RMTWFwcGluZ0lmTmVjZXNzYXJ5KGdldEpheFJQQ01hcFhtaVJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSkpOwotCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoV2ViU2VydmljZXMpIGFuZCBwb3B1bGF0ZXMgd2l0aCBkYXRhLiBBZGRzIHRoZSByb290Ci0JICogb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIEpVTklUIC0gbW92ZT8KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVdTRExNYXBwaW5nSWZOZWNlc3NhcnkoSmF4cnBjbWFwUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkgICAgaWYoYVJlc291cmNlLmdldENvbnRlbnRzKCkgPT0gbnVsbCB8fCBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlKYXZhV1NETE1hcHBpbmcgbWFwID0gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVdTRExNYXBwaW5nKCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1hcCk7Ci0JCSAgICB9Ci0JCQlKYXZhV1NETE1hcHBpbmcgd3MgPSAoSmF2YVdTRExNYXBwaW5nKWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCVVSSSBtb2R1bGVVUkkgPSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQlhUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGdldEpheFJQQ01hcEFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGdldEpheFJQQ01hcEFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCUpheFJQQ01hcEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IEpheFJQQ01hcEFydGlmYWN0RWRpdChhUHJvamVjdCwgZmFsc2UpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBub3QKLQkgKiBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZAotCSAqIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZQotCSAqICAgICAgICAgICAgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQKLQkgKiAgICAgICAgIG1vZGVsCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgY291bGQgbm90IHJlc29sdmUgdXJpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGdldEpheFJQQ01hcEFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCQlyZXR1cm4gbmV3IEpheFJQQ01hcEFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIHRydWUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEVKQkFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUKLQkgKiAgICAgICAgICAgIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQgZ2V0SmF4UlBDTWFwQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQkKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCQkJcmV0dXJuIG5ldyBKYXhSUENNYXBBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCBmYWxzZSk7Ci0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFSkJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQkKLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfRUpCX01PRFVMRSB0eXBlICovCi0JCWlmICghSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRS5lcXVhbHMoYUNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXZWJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQkKLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfV0VCX01PRFVMRSB0eXBlICovCi0JCWlmICghSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRS5lcXVhbHMoYUNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQkKLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfQXBwQ2xpZW50X01PRFVMRSB0eXBlICovCi0JCWlmICghSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRS5lcXVhbHMoYUNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KFN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkpIHsKLQkgICAgcmV0dXJuIGNyZWF0ZU1vZGVsUm9vdChnZXRKMkVFVmVyc2lvbigpLG1hcHBpbmdGaWxlUGF0aFVSSSk7Ci0JfQotCQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KGludCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24sU3RyaW5nIG1hcHBpbmdGaWxlUGF0aFVSSSkgewotCSAgICBKYXhycGNtYXBSZXNvdXJjZSByZXMgPSBnZXRKYXhSUENNYXBYbWlSZXNvdXJjZShtYXBwaW5nRmlsZVBhdGhVUkkpOwotCSAgICByZXMuc2V0TW9kdWxlVmVyc2lvbklEKHZlcnNpb24pOwotCSAgICBhZGRKYXZhV1NETE1hcHBpbmdJZk5lY2Vzc2FyeShyZXMpOwotCQlyZXR1cm4gZ2V0SmF2YVdTRExNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNYXBwaW5nIGZpbGUgbmFtZSB1bmtub3duIik7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hcHBpbmcgZmlsZSBuYW1lIHVua25vd24iKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWFwcGluZyBmaWxlIG5hbWUgdW5rbm93biIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hcHBpbmcgZmlsZSBuYW1lIHVua25vd24iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0NEREFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvV1NDRERBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzMjg3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0NEREFydGlmYWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21wb25lbnRjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBXU0REQXJ0aWZhY3RFZGl0IG9idGFpbnMgYSBXUyBEZXBsb3ltZW50IERlc2NyaXB0b3IgbWV0YW1vZGVsIHNwZWNpZmVjIGRhdGEgZnJvbSBhCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2V9Jm5ic3A7IHdoaWNoIHN0b3JlcyB0aGUgbWV0YW1vZGVsLiBUaGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDtpcyByZXRyaWV2ZWQgZnJvbSB0aGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDt1c2luZyBhIGNvbnN0YW50IHtAc2VlCi0gKiBKMkVFQ29uc3RhbnRzI0VKQkpBUl9ERF9VUklfT0JKfS4gVGhlIGRlZmluZWQgbWV0aG9kcyBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YKLSAqIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotICogPC9wPgotICogCi0gKi8gCi1wdWJsaWMgY2xhc3MgV1NDRERBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IHsKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBXU0REQXJ0aWZhY3RFZGl0IHRvIGEgV3NkZEFkYXB0ZXJGYWN0b3J5IHtAc2VlCi0JICogV3NkZEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4gYW4gQWRhcHRlck1hbmdlciAoQHNlZSBBZGFwdGVyTWFuYWdlcikKLQkgKiA8L3A+Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IFdTQ0REQXJ0aWZhY3RFZGl0LmNsYXNzOwotCQotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgV1NDRERBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BcnRpZmFjdEVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBXU0NEREFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1wb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8gCi0JcHVibGljIFdTQ0REQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBXc2RkUmVzb3VyY2UgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBXZWJTZXJ2aWNlc1Jlc291cmNlIGdldFdzY2RkWG1pUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoV2ViU2VydmljZXNSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRUpCUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICogIAotCSAqLwotCi0JcHVibGljIGludCBnZXRKMkVFVmVyc2lvbigpIHsKLQkJcmV0dXJuIGdldFdzY2RkWG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBmcm9tIHRoZSBBcnRpZmFjdEVkaXRNb2RlbCB1c2luZyBkZWZpbmVkIFVSSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXNvdXJjZQotCSAqICAKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShnZXRXZWJTZXJ2aWNlc0NsaWVudFhtbFJlc291cmNlVVJJKCkpOwotCX0KLQkKLQlwdWJsaWMgVVJJIGdldFdlYlNlcnZpY2VzQ2xpZW50WG1sUmVzb3VyY2VVUkkoKSB7Ci0JCQotCQlVUkkgcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfV0VCX0lORl9ERF9VUklfT0JKOwotCQlpZiAoaXNWYWxpZEFwcENsaWVudE1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpKSkKLQkJCXJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX01FVEFfSU5GX0REX1VSSV9PQko7Ci0JCWVsc2UgaWYgKGlzVmFsaWRFSkJNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKSkpCi0JCQlyZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9NRVRBX0lORl9ERF9VUklfT0JKOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXNvdXJjZVVSSTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBXZWJTZXJ2aWNlcyBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSkKLQkgKiAgCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzQ2xpZW50IGdldFdlYlNlcnZpY2VzQ2xpZW50KCkgewotCQlyZXR1cm4gKFdlYlNlcnZpY2VzQ2xpZW50KSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViU2VydmljZXMgKEBzZWUgV2ViU2VydmljZXMpIHJvb3Qgb2JqZWN0IGZyb20gdGhlIFdzZGRSZXNvdXJjZS4gSWYgdGhlIHJvb3Qgb2JqZWN0IGRvZXMKLQkgKiBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQgKEBsaW5rIGFkZEVKQkphcklmTmVjZXNzYXJ5KGdldEVKQkphclhtaVJlc291cmNlKCkpKS4KLQkgKiBUaGUgcm9vdCBvYmplY3QgY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICogIAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpIHsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KGdldFdzY2RkWG1pUmVzb3VyY2UoKSk7Ci0JCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3Qgb2JqZWN0IChXZWJTZXJ2aWNlcykgYW5kIHBvcHVsYXRlcyB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3QKLQkgKiBvYmplY3QgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgcG9pbnRpbmcgdG8gYSB7QHNlZSBYTUxSZXNvdXJjZX0KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KFdlYlNlcnZpY2VzUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkgICAgaWYoYVJlc291cmNlLmdldENvbnRlbnRzKCkgPT0gbnVsbCB8fCBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlXZWJTZXJ2aWNlc0NsaWVudCB3c19jbGllbnQgPSBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdzX2NsaWVudCk7Ci0JCSAgICB9Ci0JCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQlhUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NDRERBcnRpZmFjdEVkaXQgZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NDRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0NEREFydGlmYWN0RWRpdCBnZXRXU0NEREFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NDRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIGZhbHNlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIFdTRERBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90Ci0JICogYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUKLQkgKiAgICAgICAgICAgIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTQ0REQXJ0aWZhY3RFZGl0IGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCQotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCQlyZXR1cm4gbmV3IFdTQ0REQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgRUpCQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZQotCSAqICAgICAgICAgICAgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTQ0REQXJ0aWZhY3RFZGl0IGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCQlyZXR1cm4gbmV3IFdTQ0REQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFSkJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQkKLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfRUpCX01PRFVMRSB0eXBlICovCi0JCWlmICghSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRS5lcXVhbHMoYUNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXZWJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQkKLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfV0VCX01PRFVMRSB0eXBlICovCi0JCWlmICghSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRS5lcXVhbHMoYUNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQgdGhlIG1vZHVsZVR5cGVJZCBpcyBhCi0JICogICAgICAgICBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQkKLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfQXBwQ2xpZW50X01PRFVMRSB0eXBlICovCi0JCWlmICghSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRS5lcXVhbHMoYUNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCSAgICByZXR1cm4gY3JlYXRlTW9kZWxSb290KGdldEoyRUVWZXJzaW9uKCkpOwotCX0KLQkJCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChpbnQpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JICAgIFdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCSAgICByZXMuc2V0TW9kdWxlVmVyc2lvbklEKHZlcnNpb24pOwotCSAgICBhZGRXZWJTZXJ2aWNlc0NsaWVudElmTmVjZXNzYXJ5KHJlcyk7Ci0JCXJldHVybiBnZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0N2U3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9XU0REQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbXBvbmVudGNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiA8cD4KLSAqIFdTRERBcnRpZmFjdEVkaXQgb2J0YWlucyBhIFdTIERlcGxveW1lbnQgRGVzY3JpcHRvciBtZXRhbW9kZWwgc3BlY2lmZWMgZGF0YQotICogZnJvbSBhIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDsgd2hpY2ggc3RvcmVzIHRoZQotICogbWV0YW1vZGVsLiBUaGUge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwO2lzIHJldHJpZXZlZAotICogZnJvbSB0aGUge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwO3VzaW5nCi0gKiBhIGNvbnN0YW50IHtAc2VlIEoyRUVDb25zdGFudHMjRUpCSkFSX0REX1VSSV9PQkp9LiBUaGUgZGVmaW5lZCBtZXRob2RzCi0gKiBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdTRERBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IHsKLQotCS8qKgotCSAqIDxwPgotCSAqIElkZW50aWZpZXIgdXNlZCB0byBsaW5rIFdTRERBcnRpZmFjdEVkaXQgdG8gYSBXc2RkQWRhcHRlckZhY3Rvcnkge0BzZWUKLQkgKiBXc2RkQWRhcHRlckZhY3Rvcnl9IHN0b3JlZCBpbiBhbiBBZGFwdGVyTWFuZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gV1NEREFydGlmYWN0RWRpdC5jbGFzczsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lMX0ZJTEVfRVhUID0gIndzaWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX0VYVCA9ICJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBXU0REQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGFQcm9qZWN0LCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgV1NEREFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfWZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0JcHVibGljIFdTRERBcnRpZmFjdEVkaXQoTW9kdWxlQ29yZU5hdHVyZSBhTmF0dXJlLCBJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlLCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgewotCQlzdXBlcihhTmF0dXJlLCBhTW9kdWxlLCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gV3NkZFJlc291cmNlIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkKLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBXc2RkUmVzb3VyY2UgZ2V0V3NkZFhtaVJlc291cmNlKCkgewotCQlyZXR1cm4gKFdzZGRSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyBKMkVFIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBFSkJSZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBTcGVjIHZlcnNpb24KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRXc2RkWG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZyb20gdGhlIEFydGlmYWN0RWRpdE1vZGVsIHVzaW5nCi0JICogZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShnZXRXZWJTZXJ2aWNlc1htbFJlc291cmNlVVJJKCkpOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0V2ViU2VydmljZXNYbWxSZXNvdXJjZVVSSSgpIHsKLQotCQlVUkkgcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19XRUJfSU5GX0REX1VSSV9PQko7Ci0JCWlmIChpc1ZhbGlkQXBwQ2xpZW50TW9kdWxlKGdldENvbXBvbmVudCgpKSkKLQkJCXJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfTUVUQV9JTkZfRERfVVJJX09CSjsKLQkJZWxzZSBpZiAoaXNWYWxpZEVKQk1vZHVsZShnZXRDb21wb25lbnQoKSkpCi0JCQlyZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX01FVEFfSU5GX0REX1VSSV9PQko7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc291cmNlVVJJOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gV2ViU2VydmljZXMgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICogCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzIGdldFdlYlNlcnZpY2VzKCkgewotCQlpZiAoIWdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZ2V0V3NkZFhtaVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXZWJTZXJ2aWNlcykgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogT2J0YWlucyB0aGUgV2ViU2VydmljZXMgKEBzZWUgV2ViU2VydmljZXMpIHJvb3Qgb2JqZWN0IGZyb20gdGhlCi0JICogV3NkZFJlc291cmNlLiBJZiB0aGUgcm9vdCBvYmplY3QgZG9lcyBub3QgZXhpc3QsIHRoZW4gb25lIGlzIGNyZWF0ZWQKLQkgKiAoQGxpbmsgYWRkRUpCSmFySWZOZWNlc3NhcnkoZ2V0RUpCSmFyWG1pUmVzb3VyY2UoKSkpLiBUaGUgcm9vdCBvYmplY3QKLQkgKiBjb250YWlucyBhbGwgb3RoZXIgcmVzb3VyY2UgZGVmaW5lZCBvYmplY3RzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSB7Ci0JCUxpc3QgY29udGVudHMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQkJYWRkV2ViU2VydmljZXNJZk5lY2Vzc2FyeShnZXRXc2RkWG1pUmVzb3VyY2UoKSk7Ci0JCWlmIChjb250ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoV2ViU2VydmljZXMpIGFuZCBwb3B1bGF0ZXMKLQkgKiB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3Qgb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9IE5vdGU6IFRoaXMgbWV0aG9kCi0JICogICAgICAgICAgICBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqICAgICAgICAgICAgPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdlYlNlcnZpY2VzSWZOZWNlc3NhcnkoV3NkZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSA9PSBudWxsIHx8IGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVdlYlNlcnZpY2VzIHdzID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VzKCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdzKTsKLQkJCX0KLQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0TW9kdWxlVVJJKCk7Ci0JCQl0cnkgewotCQkJCWFSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZAotCSAqIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFdTRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlCi0JICogcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubwotCSAqIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZAotCSAqICAgICAgICAgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBXU0REQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTRERBcnRpZmFjdEVkaXQgZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlyZXR1cm4gbmV3IFdTRERBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEVKQkFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdAotCSAqICAgICAgICAgICAgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogICAgICAgICBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NEREFydGlmYWN0RWRpdCBnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlyZXR1cm4gbmV3IFdTRERBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRUpCTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQotCQkvKiBhbmQgbWF0Y2ggdGhlIEpTVF9FSkJfTU9EVUxFIHR5cGUgKi8KLQkJaWYgKCFJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFLmVxdWFscyhhQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGVJZCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZAotCSAqICAgICAgICAgdGhlIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdlYk1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0KLQkJLyogYW5kIG1hdGNoIHRoZSBKU1RfV0VCX01PRFVMRSB0eXBlICovCi0JCWlmICghSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRS5lcXVhbHMoYUNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCi0JCS8qIGFuZCBtYXRjaCB0aGUgSlNUX0FwcENsaWVudF9NT0RVTEUgdHlwZSAqLwotCQlpZiAoIUlNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUuZXF1YWxzKGFDb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZUlkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQlyZXR1cm4gY3JlYXRlTW9kZWxSb290KGdldEoyRUVWZXJzaW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KGludCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24pIHsKLQkJV3NkZFJlc291cmNlIHJlcyA9IChXc2RkUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJcmVzLnNldE1vZHVsZVZlcnNpb25JRCh2ZXJzaW9uKTsKLQkJYWRkV2ViU2VydmljZXNJZk5lY2Vzc2FyeShyZXMpOwotCQlyZXR1cm4gZ2V0V2ViU2VydmljZXMoKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRDb250ZW50TW9kZWxSb290KCkgewotCQlyZXR1cm4gZ2V0V2ViU2VydmljZXMoKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0V1NJTFJlc291cmNlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZXMgPSBQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RGaWxlcyhnZXRQcm9qZWN0KCkpOwotCQlmb3IgKGludCBpPTA7IGk8ZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGZpbGVzLmdldChpKTsKLQkJCWlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoV1NJTF9GSUxFX0VYVCkpIHsKLQkJCQlJVmlydHVhbFJlc291cmNlW10gdlJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGZpbGUpOwotCQkJCWlmICh2UmVzb3VyY2VzLmxlbmd0aD4wICYmICFyZXN1bHQuY29udGFpbnMoZmlsZSkpCi0JCQkJCXJlc3VsdC5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXU0RMUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKFdTRExfRklMRV9FWFQpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSZXNvdXJjZXMoU3RyaW5nIGV4dCkgewotCQlMaXN0IHJlc291cmNlcyA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRVUkkoKS5maWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiByZXMuZ2V0VVJJKCkuZmlsZUV4dGVuc2lvbigpLmVxdWFscyhleHQpKQotCQkJCXJlc3VsdC5hZGQocmVzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gdGhlIFdTRExSZXNvdXJjZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gbnVsbAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRXc2RsUmVzb3VyY2UoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscygiIikpcmV0dXJuIG51bGw7IC8vJE5PTi1OTFMtMSQKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShwYXRoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmlzTG9hZGVkKCkgJiYgc2VydmljZUhlbHBlci5pc1dTRExSZXNvdXJjZShyZXMpKQotCQkJcmV0dXJuIHJlczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvQVRLVUlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29uc3RhbnRzL0FUS1VJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjBlMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvQVRLVUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWwuUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQ29uc3RhbnRzIHsKLQkvLyBpbml0LXBhcmFtCi0JcHVibGljIFN0cmluZyBkZWZhdWx0SW5pdFBhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEluaXRQYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9WQUxVRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9ERVNDUklQVElPTiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIFFOYW1lCi0JcHJpdmF0ZSBTdHJpbmcgREVGQVVMVF9QUkVGSVggPSAicGZ4IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIERFRkFVTFRfTkFNRVNQQUNFVVJJID0gIk5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBERUZBVUxUX0xPQ0FMUEFSVCA9ICJMb2NhbFBhcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQcmVmaXgoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfUFJFRklYKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfTkFNRVNQQUNFVVJJKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRMb2NhbFBhcnQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfTE9DQUxQQVJUKTsKLQl9Ci0KLQkvLyBzb2FwIHJvbGUKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTT0FQUm9sZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfU09BUF9ST0xFIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcG9ydCBuYW1lCi0JcHVibGljIFN0cmluZyBkZWZhdWx0UG9ydE5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1RBQkxFX1BPUlRfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vcG9ydCBjb21wb25lbnQKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCJqYXZhLnJtaS5SZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gcG9ydCBjb21wb25lbnQgcmVmCi0JcHVibGljIEphdmFDbGFzcyBkZWZhdWx0Q2xpZW50U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnJtaS5SZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFBvcnRDb21wb25lbnRMaW5rKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9QT1JUX0NPTVBPTkVOVF9MSU5LIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gc2VydmljZS1yZWYKLQlwdWJsaWMgU2VydmljZVJlZiBkZWZhdWx0U2VydmljZVJlZigpIHsKLQkJU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlUmVmKCk7Ci0JCXNlcnZpY2VSZWYuc2V0U2VydmljZVJlZk5hbWUoZGVmYXVsdFNlcnZpY2VSZWZOYW1lKCkpOwotCQlzZXJ2aWNlUmVmLnNldFNlcnZpY2VJbnRlcmZhY2UoZGVmYXVsdFNlcnZpY2VJbnRlcmZhY2UoKSk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFNlcnZpY2VSZWZOYW1lKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJzZXJ2aWNlLyIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVfVUlfU2VydmljZVJlZl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBKYXZhQ2xhc3MgZGVmYXVsdFNlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmF4LnhtbC5ycGMuU2VydmljZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcG9ydCBjb21wb25lbnQgbmFtZQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFBvcnRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVfVUlfUG9ydENvbXBvbmVudF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gc2VydmljZSBpbXBsIGJlYW4KLQlwdWJsaWMgU2VydmljZUltcGxCZWFuIGRlZmF1bHRTZXJ2aWNlSW1wbEJlYW4oKSB7Ci0JCVNlcnZpY2VJbXBsQmVhbiBzZXJ2aWNlSW1wbEJlYW4gPSBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUltcGxCZWFuKCk7Ci0JCXNlcnZpY2VJbXBsQmVhbi5zZXRFU2VydmxldExpbmsoZGVmYXVsdFNlcnZsZXRMaW5rKCkpOwotCQlyZXR1cm4gc2VydmljZUltcGxCZWFuOwotCX0KLQotCS8vIHNlcnZsZXQgbGluawotCXB1YmxpYyBTZXJ2bGV0TGluayBkZWZhdWx0U2VydmxldExpbmsoKSB7Ci0JCVNlcnZsZXRMaW5rIHNlcnZsZXRMaW5rID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRMaW5rKCk7Ci0JCXNlcnZsZXRMaW5rLnNldFNlcnZsZXRMaW5rKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1NFUlZMRVRfTElOSyIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2VydmxldExpbms7Ci0JfQotCi0JLy8gV1NETCBwb3J0Ci0JcHVibGljIFdTRExQb3J0IGRlZmF1bHRXU0RMUG9ydChpbnQgdmVyc2lvbklEKSB7Ci0JCVdTRExQb3J0IHdzZGxwb3J0ID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExQb3J0KCk7Ci0JCVFOYW1lSGVscGVyLnNldFFOYW1lVmFsdWUod3NkbHBvcnQsIGRlZmF1bHROYW1lc3BhY2VVUkkoKSwgZGVmYXVsdExvY2FsUGFydCgpLCBkZWZhdWx0UHJlZml4KCksIHZlcnNpb25JRCk7Ci0JCXJldHVybiB3c2RscG9ydDsKLQl9Ci0KLQkvLyBwb3J0IGNvbXBvbmVudAotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGRlZmF1bHRQb3J0Q29tcG9uZW50KGludCB2ZXJzaW9uSUQpIHsKLQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50ID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRDb21wb25lbnQoKTsKLQkJcG9ydENvbXBvbmVudC5zZXRQb3J0Q29tcG9uZW50TmFtZShkZWZhdWx0UG9ydENvbXBvbmVudE5hbWUoKSk7Ci0JCXBvcnRDb21wb25lbnQuc2V0V3NkbFBvcnQoZGVmYXVsdFdTRExQb3J0KHZlcnNpb25JRCkpOwotCQlwb3J0Q29tcG9uZW50LnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShkZWZhdWx0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotCQlwb3J0Q29tcG9uZW50LnNldFNlcnZpY2VJbXBsQmVhbihkZWZhdWx0U2VydmljZUltcGxCZWFuKCkpOwotCQlyZXR1cm4gcG9ydENvbXBvbmVudDsKLQl9Ci0KLQkvLyBKQVggUlBDIG1hcHBpbmcKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRKYXhScGNNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoImpheHJwY21hcHBpbmcueG1sIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBjb21wb25lbnQgc2NvcGVkIHJlZmVyZW5jZQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdENvbXBvbmVudE5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTIwN2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29uc3RhbnRzL0luZm9wb3BDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSW5mb3BvcENvbnN0YW50cyB7Ci0KLQkvKiogKioqKioqKioqKioqKioqKioqKioqKioqKkluZm9wb3BzIGZvciBwYWdlcyoqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdlYlNlcnZpY2VzUGFnZSgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIi5FSlNSUDAwMDEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wUG9ydENvbXBvbmVudFBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDAyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTSGFuZGxlclBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDAzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VSZWZQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTUkhhbmRsZXJQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCi0JLyoqICoqKioqKioqKioqKioqKioqKioqKioqKipJbmZvcG9wcyBmb3Igc2VjdGlvbnMqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcERlc2NyaXB0aW9uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDAxIGZvciB0aGUgZGVzY3JpcHRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wRGlzcGxheU5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDIgZm9yIHRoZSBkaXNwbGF5IG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU21hbGxJY29uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDAzIGZvciB0aGUgc21hbGwgaWNvbiBkaXNwbGF5ICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAwMyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BMYXJnZUljb24oKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDQgZm9yIHRoZSBsYXJnZSBpY29uIGRpc3BsYXkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDUgZm9yIHRoZSBXZWIgc2VydmljZSBkZXNjcmlwdGlvbiBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA1IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTRExGaWxlKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA2IGZvciB0aGUgV1NETCBmaWxlIGxvY2F0aW9uIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA2IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcEpBWFJQQ01hcHBpbmdGaWxlKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA3IGZvciB0aGUgSkFYLVJQQyBtYXBwaW5nIGZpbGUgbG9jYXRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wUG9ydENvbXBvbmVudE5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDggZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDA4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFdTRExQb3J0TmFtZXNwYWNlVVJJKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDA5IGZvciB0aGUgV1NETCBwb3J0IG5hbWVzcGFjZSBVUkkgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV1NETFBvcnRMb2NhbHBhcnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTAgZm9yIHRoZSBXU0RMIHBvcnQgbG9jYWwgcGFydCB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMTEgZm9yIHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgY2xhc3MgbmFtZSB0ZXh0Ci0JCSAqIGZpZWxkCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZUltcGxCZWFuKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDEyIGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBjbGFzcyBuYW1lIHRleHQKLQkJICogZmllbGQKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BFSkJMaW5rKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDEzIGZvciB0aGUgdXNlIEVKQiBsaW5rIHJhZGlvIGJ1dHRvbiAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmxldExpbmsoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTQgZm9yIHRoZSB1c2Ugc2VydmxldCBsaW5rIHJhZGlvIGJ1dHRvbiAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSGFuZGxlck5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTUgZm9yIHRoZSBoYW5kbGVyIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSGFuZGxlckNsYXNzKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDE2IGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIGhhbmRsZXIgY2xhc3MgbmFtZSB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxNiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlUmVmTmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxNyBmb3IgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZUludGVyZmFjZU5hbWUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTggZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VRTmFtZU5hbWVzcGFjZVVSSSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxOSBmb3IgdGhlIHNlcnZpY2UgcW5hbWUgbmFtc3BhY2UgVVJJIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE5IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VRTmFtZUxvY2FscGFydCgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyMCBmb3IgdGhlIHNlcnZpY2UgcW5hbWUgbG9jYWwgcGFydCB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BDb21ib1dlYlNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAyMSBmb3IgdGhlIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9uIGRyb3AtZG93biAobGlzdCBvZiBXZWIgc2VydmljZQotCQkgKiBkZXNjcmlwdGlvbnMpCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjEiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wQ29tYm9Qb3J0Q29tcG9uZW50KCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDIyIGZvciB0aGUgcG9ydCBjb21wb25lbnQgZHJvcC1kb3duIChsaXN0IG9mIHBvcnQgY29tcG9uZW50cykgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvQ29tcG9uZW50U2NvcGVkUmVmKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDIzIGZvciB0aGUgY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2UgZHJvcC1kb3duIChsaXN0IG9mIGNvbXBvbmVudAotCQkgKiBzY29wZWQgcmVmZXJlbmNlKQotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvU2VydmljZVJlZigpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyNCBmb3IgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIGRyb3AtZG93biAobGlzdCBvZiBzZXJ2aWNlIHJlZmVyZW5jZXMpICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uV2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI1IGZvciB0aGUgV2ViIHNlcnZpY2UgZGVzY3JpcHRpb24gc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXMueG1sIGVkaXRvciAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnRDb21wb25lbnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMjYgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uSGFuZGxlcldTKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI3IGZvciB0aGUgaGFuZGxlciBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uQ29tcG9uZW50U2NvcGVkUmVmKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDI4IGZvciB0aGUgY29tcG9uZW50IHNjb3BlZCByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUKLQkJICogd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDI4IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25TZXJ2aWNlUmVmKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI5IGZvciB0aGUgc2VydmljZSByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvciAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnRDb21wb25lbnRSZWYoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzAgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCByZWZlcmVuY2Ugc2VjdGlvbiBpbiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sCi0JCSAqIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDMwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25IYW5kbGVyV1NDKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDMxIGZvciB0aGUgaGFuZGxlciBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uSW5pdFBhcmFtcygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzMiBmb3IgdGhlIGluaXRpYWwgcGFyYW1ldGVyIHNlY3Rpb24gaW4gYm90aCB3ZWJzZXJ2aWNlcy54bWwgYW5kCi0JCSAqIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBlZGl0b3IKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uU09BUEhlYWRlcnMoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzMgZm9yIHRoZSBTT0FQIGhlYWRlciBzZWN0aW9uIGluIGJvdGggd2Vic2VydmljZXMueG1sIGFuZAotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblNPQVBSb2xlcygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzNCBmb3IgdGhlIFNPQVAgcm9sZSBzZWN0aW9uIGluIGJvdGggd2Vic2VydmljZXMueG1sIGFuZAotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblBvcnROYW1lcygpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAzNSBmb3IgdGhlIHBvcnQgbmFtZSBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BSZXNvdXJjZVRyZWUoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMzYgZm9yIHRoZSBwb3B1cCBkaWFsb2cgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcmVzb3VyY2UgaW4gdGhlCi0JCSAqIHdvcmtiZW5jaAotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDM2IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzJlODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VFeHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBtZXRob2RzIHRvIGhlbHAgbmF2aWdhdGUgV1NETCBmaWxlcyBwcm92aWRlZCBpbiB2YXJpb3VzIEpTUi0xMDkgZGVzY3JpcHRvcnMKLSAqLwotcHVibGljIGNsYXNzIFdTRExIZWxwZXIgewotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qOwotCi0JcHVibGljIFdTRExIZWxwZXIoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdGhpcy5wcm9qID0gYVByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbGlzdCBvZiB3c2RsOnBvcnRAbmFtZSdzIGNvbnRhaW5lZCBpbiB0aGUgV1NETCBmaWxlIHJlZmVycmVkIHRvIGJ5Ci0JICogdGhlIHNwZWNpZmllZCA8c2VydmljZS1yZWY+Ci0JICogCi0JICogQHBhcmFtIHNlcnZpY2VSZWZOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgPHNlcnZpY2UtcmVmPgotCSAqIEBwYXJhbSBjb21wU2NvcGVkUmVmTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIDxjb21wb25lbnQtc2NvcGVkLXJlZnM+Ci0JICogQHBhcmFtIHdzYwotCSAqICAgICAgICAgICAgVGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBleGNsdWRlCi0JICogICAgICAgICAgICBwb3J0IG5hbWVzIHRvIGV4Y2x1ZGUgaW4gdGhlIHJldHVybmVkIGFycmF5Ci0JICogQHJldHVybiBTdHJpbmdbXSBBbiBhcnJheSBvZiB3c2RsOnBvcnRAbmFtZXMncy4gbnVsbCBpcyByZXR1cm5lZCBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zCi0JICogICAgICAgICB3aXRoIG5hdmlnYXRpbmcgdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBvciB0aGUgV1NETC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UG9ydE5hbWVzKFN0cmluZyBzZXJ2aWNlUmVmTmFtZSwgU3RyaW5nIGNvbXBTY29wZWRSZWZOYW1lLCBXZWJTZXJ2aWNlc0NsaWVudCB3c2MsIFN0cmluZ1tdIGV4Y2x1ZGUpIHsKLQkJU2VydmljZVJlZiBzciA9IGdldFNlcnZpY2VSZWYoc2VydmljZVJlZk5hbWUsIGNvbXBTY29wZWRSZWZOYW1lLCB3c2MpOwotCQlpZiAoc3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB3c2RsVVJMID0gZ2V0V1NETEZpbGVVUkwoc3IpOwotCQlpZiAod3NkbFVSTC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUgPSBnZXRTZXJ2aWNlUW5hbWUoc3IpOwotCQlTdHJpbmdbXSBwb3J0TmFtZXMgPSBnZXRQb3J0TmFtZXMod3NkbFVSTCwgc2VydmljZUxvY2FsTmFtZSk7Ci0JCXBvcnROYW1lcyA9IHRyaW0ocG9ydE5hbWVzLCBleGNsdWRlKTsKLQkJcmV0dXJuIHBvcnROYW1lczsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgd3NkbDpzZXJ2aWNlIGluIFdTREwgZmlsZSByZWZlcnJlZCB0byBieSB0aGUKLQkgKiBzcGVjaWZpZWQgPHNlcnZpY2UtcmVmPgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2aWNlUmVmTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIDxzZXJ2aWNlLXJlZj4KLQkgKiBAcGFyYW0gY29tcFNjb3BlZFJlZk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSA8Y29tcG9uZW50LXNjb3BlZC1yZWZzPgotCSAqIEBwYXJhbSB3c2MKLQkgKiAgICAgICAgICAgIFRoZSByb290IG9iamVjdCBvZiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZXhjbHVkZQotCSAqICAgICAgICAgICAgcG9ydCBuYW1lcyB0byBleGNsdWRlIGluIHRoZSByZXR1cm5lZCBhcnJheQotCSAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHdzZGw6c2VydmljZS4gbnVsbCBpcyByZXR1cm5lZCBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zCi0JICogICAgICAgICB3aXRoIG5hdmlnYXRpbmcgdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBvciB0aGUgV1NETC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lc3BhY2UoU3RyaW5nIHNlcnZpY2VSZWZOYW1lLCBTdHJpbmcgY29tcFNjb3BlZFJlZk5hbWUsIFdlYlNlcnZpY2VzQ2xpZW50IHdzYykgewotCQlTZXJ2aWNlUmVmIHNyID0gZ2V0U2VydmljZVJlZihzZXJ2aWNlUmVmTmFtZSwgY29tcFNjb3BlZFJlZk5hbWUsIHdzYyk7Ci0JCWlmIChzciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHdzZGxVUkwgPSBnZXRXU0RMRmlsZVVSTChzcik7Ci0JCWlmICh3c2RsVVJMLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgc2VydmljZUxvY2FsTmFtZSA9IGdldFNlcnZpY2VRbmFtZShzcik7Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSBnZXRQb3J0TmFtZXNwYWNlKHdzZGxVUkwsIHNlcnZpY2VMb2NhbE5hbWUpOwotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGxpc3Qgb2Ygd3NkbDpwb3J0QG5hbWUncyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCB3c2RsOnNlcnZpY2UgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIFdTREwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gd3NkbFVSTAotCSAqICAgICAgICAgICAgVGhlIFVSTCBvZiB0aGUgV1NETCBmaWxlLgotCSAqIEBwYXJhbSBzZXJ2aWNlTG9jYWxOYW1lCi0JICogICAgICAgICAgICBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgd3NkbDpzZXJ2aWNlIHRvIGxvb2sgaW4uCi0JICogQHJldHVybiBTdHJpbmdbXSBBbiBhcnJheSBvZiB3c2RsOnBvcnRAbmFtZSdzLiBOdWxsIGlzIHJldHVybmVkIGEgd3NkbDpzZXJ2aWNlIHdpdGggdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgbG9jYWwgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRQb3J0TmFtZXMoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlPYmplY3QgdGFyZ2V0U2VydmljZSA9IGdldFRhcmdldFNlcnZpY2Uod3NkbFVSTCwgc2VydmljZUxvY2FsTmFtZSk7Ci0KLQkJaWYgKHRhcmdldFNlcnZpY2UgPT0gbnVsbCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldFBvcnROYW1lcyAuLi4gdGFyZ2V0U2VydmljZSBudWxsLiIpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcG9ydHMgPSBzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyh0YXJnZXRTZXJ2aWNlKTsKLQkJaW50IG51bWJlck9mUG9ydHMgPSBwb3J0cy5zaXplKCk7Ci0JCVN0cmluZ1tdIHBvcnROYW1lcyA9IG5ldyBTdHJpbmdbbnVtYmVyT2ZQb3J0c107Ci0JCUl0ZXJhdG9yIGsgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlmb3IgKGludCBtID0gMDsgbSA8IG51bWJlck9mUG9ydHM7IG0rKykgewotCQkJT2JqZWN0IHBvcnQgPSBrLm5leHQoKTsKLQkJCXBvcnROYW1lc1ttXSA9IHNlcnZpY2VIZWxwZXIuZ2V0UG9ydE5hbWUocG9ydCk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydE5hbWVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgc3BlY2lmaWVkIHdzZGw6c2VydmljZSBpbiB0aGUgc3BlY2lmaWVkIFdTREwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gd3NkbFVSTAotCSAqICAgICAgICAgICAgVGhlIFVSTCBvZiB0aGUgV1NETCBmaWxlLgotCSAqIEBwYXJhbSBzZXJ2aWNlTG9jYWxOYW1lCi0JICogICAgICAgICAgICBUaGUgbG9jYWwgbmFtZSBvZiB0aGUgd3NkbDpzZXJ2aWNlIHRvIGxvb2sgaW4uCi0JICogQHJldHVybiBTdHJpbmdbXSBBbiBhcnJheSBvZiB3c2RsOnBvcnRAbmFtZSdzLiBBbiBlbXB0eSBTdHJpbmcgaXMgcmV0dXJuZWQgaWYgYSB3c2RsOnNlcnZpY2UKLQkgKiAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQb3J0TmFtZXNwYWNlKFN0cmluZyB3c2RsVVJMLCBTdHJpbmcgc2VydmljZUxvY2FsTmFtZSkgewotCQlPYmplY3QgdGFyZ2V0U2VydmljZSA9IGdldFRhcmdldFNlcnZpY2Uod3NkbFVSTCwgc2VydmljZUxvY2FsTmFtZSk7Ci0KLQkJaWYgKHRhcmdldFNlcnZpY2UgPT0gbnVsbCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldFBvcnROYW1lc3BhY2UgLi4uIHRhcmdldFNlcnZpY2UgbnVsbC4iKTsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCkuZ2V0U2VydmljZU5hbWVzcGFjZVVSSSh0YXJnZXRTZXJ2aWNlKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRUYXJnZXRTZXJ2aWNlKFN0cmluZyB3c2RsVVJMLCBTdHJpbmcgc2VydmljZUxvY2FsTmFtZSkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJT2JqZWN0IGRlZmluaXRpb24gPSBnZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLQkJaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlPYmplY3QgdGFyZ2V0U2VydmljZSA9IG51bGw7Ci0JCU1hcCBzZXJ2aWNlcyA9IHNlcnZpY2VIZWxwZXIuZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGRlZmluaXRpb24pOwotCQlpZiAoIXNlcnZpY2VzLmlzRW1wdHkoKSkgewotCQkJaWYgKChzZXJ2aWNlTG9jYWxOYW1lID09IG51bGwgfHwgc2VydmljZUxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSAmJiBzZXJ2aWNlcy5zaXplKCkgPiAxKSAvL011bHRpcGxlCi0JCQkvLyBzZXJ2aWNlcwotCQkJLy8gd2l0aG91dAotCQkJLy8gb25lCi0JCQkvLyBkZXNpZ25hdGVkCi0JCQkvLyBpcwotCQkJLy8gYW4KLQkJCS8vIGVycm9yCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmICgoc2VydmljZUxvY2FsTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VMb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkgJiYgc2VydmljZXMuc2l6ZSgpID09IDEpIHsKLQkJCQkvL1JldHVybiB0aGUgcG9ydCBuYW1lcyBpbiB0aGUgb25lIHNlcnZpY2UKLQkJCQlJdGVyYXRvciBpID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl0YXJnZXRTZXJ2aWNlID0gaS5uZXh0KCk7Ci0JCQl9IGVsc2UgLy9UaGVyZSBhcmUgbXVsdGlwbGUgc2VydmljZXMgYnV0IG9uZSBpcyBkZXNpZ25hdGVkCi0JCQl7Ci0JCQkJSXRlcmF0b3IgaiA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGouaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBzZXJ2aWNlID0gai5uZXh0KCk7Ci0JCQkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZUxvY2FsUGFydChzZXJ2aWNlKTsKLQkJCQkJaWYgKHNlcnZpY2VOYW1lLmVxdWFscyhzZXJ2aWNlTG9jYWxOYW1lKSkgewotCQkJCQkJdGFyZ2V0U2VydmljZSA9IHNlcnZpY2U7Ci0JCQkJCQlicmVhazsgLy9Gb3VuZCBhIG1hdGNoLiBCcmVhayBvdXQgb2YgbG9vcC4gV2UgbXVzdCBiZSBhc3N1bWluZyB1bmlxdWUgbmFtZXMKLQkJCQkJCS8vIG9uIHNlcnZpY2VzLgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRhcmdldFNlcnZpY2U7Ci0KLQl9Ci0KLQotCXByaXZhdGUgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJMKSB7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlyZXR1cm4gc2VydmljZUhlbHBlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLQkJCi0JCS8qdHJ5IHsKLQkJCVdTRExSZXNvdXJjZUltcGwgcmVzID0gKFdTRExSZXNvdXJjZUltcGwpIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHdzZGxVUkwpLCB0cnVlKTsKLQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiByZXMuZ2V0RGVmaW5pdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gd3NkbGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ki8KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIFVSTCBvZiB0aGUgPHdzZGwtZmlsZT5zcGVjaWZpZWQgaW4gdGhlIGdpdmVuIDxzZXJ2aWNlLXJlZj4uIFJldHVybnMgYSBibGFuawotCSAqIFN0cmluZyBpZiA8d3NkbC1maWxlPmlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHByb3ZpZGVkIDxzZXJ2aWNlLXJlZj4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRXU0RMRmlsZVVSTChTZXJ2aWNlUmVmIHNyKSB7Ci0JCVN0cmluZyB3c2RsRmlsZVJlbFBhdGggPSBzci5nZXRXc2RsRmlsZSgpOwotCQlpZiAod3NkbEZpbGVSZWxQYXRoID09IG51bGwgfHwgd3NkbEZpbGVSZWxQYXRoLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBHZXQgYSBoYW5kbGUgb24gdGhlIFdTREwgZmlsZS4KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvaik7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxGb2xkZXIgbW9kdWxlUm9vdCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCUlGaWxlIHdzZGxGaWxlID0gbW9kdWxlUm9vdC5nZXRGaWxlKHdzZGxGaWxlUmVsUGF0aCkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCWlmICghd3NkbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vR2V0IHRoZSBmaWxlVVJMIGZyb20gd3NkbEZpbGUKLQkJCVN0cmluZyB3c2RsVVJMOwotCQkJdHJ5IHsKLQkJCQl3c2RsVVJMID0gd3NkbEZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKHdzZGxVUkwgPT0gbnVsbCB8fCB3c2RsVVJMLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gd3NkbFVSTDsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSA8c2VydmljZS1xbmFtZT5zcGVjaWZpZWQgaW4gdGhlIGdpdmVuIDxzZXJ2aWNlLXJlZj4uIFJldHVybnMgYQotCSAqIGJsYW5rIFN0cmluZyBpZiA8c2VydmljZS1xbmFtZT5pcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCA8c2VydmljZS1yZWY+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmljZVFuYW1lKFNlcnZpY2VSZWYgc3IpIHsKLQkJUU5hbWUgc2VydmljZVFuYW1lID0gc3IuZ2V0U2VydmljZVFuYW1lKCk7Ci0JCWlmIChzZXJ2aWNlUW5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lID0gc2VydmljZVFuYW1lLmdldExvY2FsUGFydCgpOwotCQlpZiAoc2VydmljZUxvY2FsTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHNlcnZpY2VMb2NhbE5hbWU7Ci0JfQotCi0JLyogSWYgY29tcFNjb3BlZFJlZk5hbWUgaXMgZW1wdHkgb3IgbnVsbCwgd2UgbWF5IGhhdmUgdG8gY2hlY2sgYWxsIG9mIHRoZW0uICovCi0JcHVibGljIFNlcnZpY2VSZWYgZ2V0U2VydmljZVJlZihTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbXBTY29wZWRSZWZOYW1lLCBXZWJTZXJ2aWNlc0NsaWVudCB3c2MpIHsKLQkJSXRlcmF0b3Igc2VydmljZVJlZnM7Ci0JCWlmIChjb21wU2NvcGVkUmVmTmFtZSAhPSBudWxsICYmIGNvbXBTY29wZWRSZWZOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBjc3IgPSBnZXRDb21wU2NvcGVkUmVmKGNvbXBTY29wZWRSZWZOYW1lLCB3c2MpOwotCQkJc2VydmljZVJlZnMgPSBjc3IuZ2V0U2VydmljZVJlZnMoKS5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJc2VydmljZVJlZnMgPSB3c2MuZ2V0U2VydmljZVJlZnMoKS5pdGVyYXRvcigpOwotCQkJLy9JZiB0aGVyZSBhcmUgbm8gc2VydmljZSByZWZzIC4uLiBjaGVjayBhbGwgY29tcG9uZW50LXNjb3BlZC1yZWZzIGZvciB0aGUgc2VydmljZS1yZWYKLQkJCWlmICghc2VydmljZVJlZnMuaGFzTmV4dCgpKSB7Ci0JCQkJSXRlcmF0b3IgY3NSZWZzID0gd3NjLmdldENvbXBvbmVudFNjb3BlZFJlZnMoKS5pdGVyYXRvcigpOwotCi0JCQkJd2hpbGUgKGNzUmVmcy5oYXNOZXh0KCkpIHsKLQkJCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBjc3IgPSAoQ29tcG9uZW50U2NvcGVkUmVmcykgY3NSZWZzLm5leHQoKTsKLQkJCQkJSXRlcmF0b3Igc3JzID0gY3NyLmdldFNlcnZpY2VSZWZzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKHNycy5oYXNOZXh0KCkpIHsKLQkJCQkJCVNlcnZpY2VSZWYgc3IgPSAoU2VydmljZVJlZikgc3JzLm5leHQoKTsKLQkJCQkJCVN0cmluZyB0aGlzTmFtZSA9IHNyLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0JCQkJCQlpZiAodGhpc05hbWUuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQkJcmV0dXJuIHNyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7IC8vQ291bGQgbm90IGZpbmQgaXQgaW4gYW55IG9mIHRoZSBjb21wb25lbnQtc2NvcGVkLXJlZnMKLQkJCX0KLQotCQl9Ci0KLQkJd2hpbGUgKHNlcnZpY2VSZWZzLmhhc05leHQoKSkgewotCQkJU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHNlcnZpY2VSZWZzLm5leHQoKTsKLQkJCVN0cmluZyBzZXJ2aWNlUmVmTmFtZSA9IHNlcnZpY2VSZWYuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJCWlmIChzZXJ2aWNlUmVmTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIHNlcnZpY2VSZWY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIENvbXBvbmVudFNjb3BlZFJlZnMgZ2V0Q29tcFNjb3BlZFJlZihTdHJpbmcgbmFtZSwgV2ViU2VydmljZXNDbGllbnQgd3NjKSB7Ci0JCUl0ZXJhdG9yIGNvbXBTY29wZWRSZWZzID0gd3NjLmdldENvbXBvbmVudFNjb3BlZFJlZnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoY29tcFNjb3BlZFJlZnMuaGFzTmV4dCgpKSB7Ci0JCQlDb21wb25lbnRTY29wZWRSZWZzIGNvbXBTY29wZWRSZWYgPSAoQ29tcG9uZW50U2NvcGVkUmVmcykgY29tcFNjb3BlZFJlZnMubmV4dCgpOwotCQkJU3RyaW5nIGNvbXBTY29wZWRSZWZOYW1lID0gY29tcFNjb3BlZFJlZi5nZXRDb21wb25lbnROYW1lKCk7Ci0JCQlpZiAoY29tcFNjb3BlZFJlZk5hbWUuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBjb21wU2NvcGVkUmVmOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0KLQlwcml2YXRlIFN0cmluZ1tdIHRyaW0oU3RyaW5nW10gdmFsdWVzLCBTdHJpbmdbXSBleGNsdWRlKSB7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMubGVuZ3RoID09IDAgfHwgZXhjbHVkZSA9PSBudWxsIHx8IGV4Y2x1ZGUubGVuZ3RoID09IDApIC8vbm8KLQkJCS8vIGNoYW5nZQotCQkJLy8gcmVxdWlyZWQuCi0JCQkvLyByZXR1cm4KLQkJCS8vIGFzCi0JCQkvLyBpcy4KLQkJCXJldHVybiB2YWx1ZXM7Ci0KLQkJU3RyaW5nW10gZmluYWxWYWx1ZXM7Ci0JCUFycmF5TGlzdCBmaW5hbExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWNvbnRhaW5zKGV4Y2x1ZGUsIHZhbHVlc1tpXSkpIHsKLQkJCQlmaW5hbExpc3QuYWRkKHZhbHVlc1tpXSk7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgZmluYWxTaXplID0gZmluYWxMaXN0LnNpemUoKTsKLQkJZmluYWxWYWx1ZXMgPSBuZXcgU3RyaW5nW2ZpbmFsU2l6ZV07Ci0JCU9iamVjdFtdIGZpbmFsQXJyYXkgPSBmaW5hbExpc3QudG9BcnJheSgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbmFsU2l6ZTsgaisrKSB7Ci0JCQlmaW5hbFZhbHVlc1tqXSA9IChTdHJpbmcpIChmaW5hbEFycmF5W2pdKTsKLQkJfQotCi0JCXJldHVybiBmaW5hbFZhbHVlczsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJyYXkgb2YgU3RyaW5nJ3MgY29udGFpbnMgdGhlIHNwZWNpZmllZCBTdHJpbmcuIEZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nW10gdmFsdWVzLCBTdHJpbmcgcykgewotCQlpZiAodmFsdWVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh2YWx1ZXNbaV0uZXF1YWxzKHMpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExTZXJ2aWNlSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETFNlcnZpY2VIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjI0YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETFNlcnZpY2VIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VIZWxwZXJJbXBsIGltcGxlbWVudHMgV1NETFNlcnZpY2VIZWxwZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdTRExTZXJ2aWNlSGVscGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9IAotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRQb3J0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoT2JqZWN0IHBvcnQpIHsKLQkJUG9ydCBhUG9ydCA9IChQb3J0KXBvcnQ7Ci0JCXJldHVybiBhUG9ydC5nZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVBvcnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXRTZXJ2aWNlUG9ydHMoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZU5hbWVzcGFjZVVSSShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWVzcGFjZVVSSShPYmplY3QgYVNlcnZpY2UpIHsKLQkJU2VydmljZSBzZXJ2aWNlID0oU2VydmljZSlhU2VydmljZTsKLQkJcmV0dXJuIHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlRGVmaW5pdGlvbkxvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZURlZmluaXRpb25Mb2NhdGlvbihFT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0QmluZGluZ05hbWVzcGFjZVVSSShPYmplY3QgYVBvcnQpIHsKLQkJUG9ydCBwb3J0ID0gKFBvcnQpYVBvcnQ7Ci0JCXJldHVybiBwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFNlcnZpY2VMb2NhbFBhcnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhbFBhcnQoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVFOYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlUU5hbWUoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCVNlcnZpY2Ugc2VydmljZSA9KFNlcnZpY2UpYVNlcnZpY2U7Ci0JCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE1hcCBnZXREZWZpbml0aW9uU2VydmljZXMoT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCURlZmluaXRpb24gZGVmaW5pdGlvbiA9KERlZmluaXRpb24pYURlZmluaXRpb247Ci0JCXJldHVybiBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V1NETERlZmluaXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJMKSB7Ci0JCXRyeSB7Ci0JCQlXU0RMUmVzb3VyY2VJbXBsIHJlcyA9IChXU0RMUmVzb3VyY2VJbXBsKSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh3c2RsVVJMKSwgdHJ1ZSk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcmVzLmdldERlZmluaXRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHdzZGxlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFdTRExEZWZpbml0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdTRExEZWZpbml0aW9uKFJlc291cmNlIHdzZGxSZXNvdXJjZSkgewotCQlyZXR1cm4gKChXU0RMUmVzb3VyY2VJbXBsKXdzZGxSZXNvdXJjZSkuZ2V0RGVmaW5pdGlvbigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJV2ViU2VydmljZUVudGl0eSBlbnRpdHkgPSBwYXJzZVdzaWxGaWxlKHdzaWwpOwotCQlpZiAoZW50aXR5ICE9IG51bGwgJiYgZW50aXR5LmdldFR5cGUoKSA9PSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCkgewotCQkJLy8gZ2V0IGFsbCB0aGUgV1NETCByZWZlcmVuY2VzIGZyb20gdGhlIFdTSUwgZW50aXR5Ci0JCQlMaXN0IHdzZGxMaXN0ID0gZW50aXR5LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd3NkbExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFbnRpdHkpIHsKLQkJCQkJaWYgKCgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKSAhPSBudWxsICYmICgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLQkJCQkJCURlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pICgoV2ViU2VydmljZUVudGl0eSkgaXRlbSkuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChkZWYgIT0gbnVsbCAmJiAhZGVmLmdldFNlcnZpY2VzKCkuaXNFbXB0eSgpKQotCQkJCQkJCXJlc3VsdC5hZGRBbGwoZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlRW50aXR5IHBhcnNlV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCVdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JU3RyaW5nIHVybCA9IG51bGw7Ci0JLy8gdmVyaWZ5IHByb3BlciBpbnB1dAotCWlmICh3c2lsID09IG51bGwgfHwgIXdzaWwuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0lMX0VYVCkpCi0JCXJldHVybiBudWxsOwotCS8vIFBhcnNlIHdzaWwgZmlsZSB0byBnZXQgd3NkbCBzZXJ2aWNlcwotCXRyeSB7Ci0JCXVybCA9IHdzaWwuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JCXBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlcih1cmwpOwotCQlwYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfV1NJTCB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX1dTREwpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCS8vSWdub3JlCi0JfQotCWlmIChwYXJzZXIgPT0gbnVsbCkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIHBhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkodXJsKTsKLX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZShPYmplY3QgYVNlcnZpY2UpIHsKLQkJCi0JCXJldHVybiBhU2VydmljZSBpbnN0YW5jZW9mIFNlcnZpY2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzV1NETFJlc291cmNlKE9iamVjdCBhUmVzb3VyY2UpIHsKLQkJCi0JCXJldHVybiBhUmVzb3VyY2UgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCQotCQlyZXR1cm4gYURlZmluaXRpb24gaW5zdGFuY2VvZiBEZWZpbml0aW9uOwotCX0KLQotCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhFT2JqZWN0IGoyZWVPYmplY3QpIHsKLQkJaWYgKGoyZWVPYmplY3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkNsaWVudCkKLQkJCXJldHVybiBXZWJTZXJ2aWNlc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXQxM1NlcnZpY2VSZWZzKChBcHBsaWNhdGlvbkNsaWVudClqMmVlT2JqZWN0KTsKLQkJZWxzZSBpZiAoajJlZU9iamVjdCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKEVudGVycHJpc2VCZWFuKWoyZWVPYmplY3QpOwotCQllbHNlIGlmIChqMmVlT2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKFdlYkFwcClqMmVlT2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZUV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzZTBmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRXZlbnQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSCA9IDE7Ci0JCi0JcHJpdmF0ZSBpbnQgZXZlbnRUeXBlID0gMDsKLQkKLQlwdWJsaWMgV2ViU2VydmljZUV2ZW50KGludCBhbkV2ZW50VHlwZSkgewotCQlzdXBlcigpOwotCQlldmVudFR5cGUgPSBhbkV2ZW50VHlwZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0JCXJldHVybiBldmVudFR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZDcxZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgd2ViU2VydmljZU1hbmFnZXJDaGFuZ2VkKFdlYlNlcnZpY2VFdmVudCBhbkV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VzTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjU0NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLQotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbXBvbmVudGNvcmUudXRpbC5XU0NEREFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbXBvbmVudGNvcmUudXRpbC5XU0REQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNNYW5hZ2VyIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0JcHJpdmF0ZSBIYXNoTWFwIHdzQXJ0aWZhY3RFZGl0czsKLQlwcml2YXRlIEhhc2hNYXAgd3NDbGllbnRBcnRpZmFjdEVkaXRzOwotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VzTWFuYWdlciBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGxpc3RlbmVyczsKLQlwcml2YXRlIExpc3QgcmVtb3ZlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gaXNOb3RpZmluZyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lMX0VYVCA9ICJ3c2lsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlc01hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKQotCQkJSU5TVEFOQ0UgPSBuZXcgV2ViU2VydmljZXNNYW5hZ2VyKCk7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQljb2xsZWN0QXJ0aWZhY3RFZGl0cygpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RBcnRpZmFjdEVkaXRzKCkgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IHdzZGRBcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJV1NDRERBcnRpZmFjdEVkaXQgd3NjZGRBcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpIHx8IElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUuZXF1YWxzKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlSWQoKSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8vVE9ETyBpbXBsZW1lbnQgYSBzbWFydGVyIHNvbHV0aW9uIHRoYW4gdHJ5IGNhdGNocwotCQkJCXRyeSB7Ci0JCQkJd3NkZEFydGlmYWN0RWRpdCA9IFdTRERBcnRpZmFjdEVkaXQuZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCQlpZiAod3NkZEFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJCXdzZGRBcnRpZmFjdEVkaXQuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCWdldFdTQXJ0aWZhY3RFZGl0cygpLnB1dChjb21wb25lbnQuZ2V0UHJvamVjdCgpLHdzZGRBcnRpZmFjdEVkaXQpOwotCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAod3NkZEFydGlmYWN0RWRpdCAhPSBudWxsKSB3c2RkQXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQl3c2NkZEFydGlmYWN0RWRpdCA9IFdTQ0REQXJ0aWZhY3RFZGl0LmdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJCWlmICh3c2NkZEFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJCXdzY2RkQXJ0aWZhY3RFZGl0LmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCQlnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS5wdXQoY29tcG9uZW50LmdldFByb2plY3QoKSx3c2NkZEFydGlmYWN0RWRpdCk7Ci0JCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmICh3c2NkZEFydGlmYWN0RWRpdCAhPSBudWxsKSB3c2NkZEFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWRpdE1vZGVscy4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0V1NBcnRpZmFjdEVkaXRzKCkgewotCQlpZiAod3NBcnRpZmFjdEVkaXRzID09IG51bGwpCi0JCQl3c0FydGlmYWN0RWRpdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd3NBcnRpZmFjdEVkaXRzOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVkaXRNb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpIHsKLQkJaWYgKHdzQ2xpZW50QXJ0aWZhY3RFZGl0cyA9PSBudWxsKQotCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIHdzQ2xpZW50QXJ0aWZhY3RFZGl0czsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFMaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsICYmICFnZXRMaXN0ZW5lcnMoKS5jb250YWlucyhhTGlzdGVuZXIpKQotCQkJZ2V0TGlzdGVuZXJzKCkuYWRkKGFMaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lciNlZGl0TW9kZWxDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQlpZiAoYW5FdmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoYW5FdmVudC5nZXRFdmVudENvZGUoKT09RWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UpIHsKLQkJCUxpc3QgcmVzb3VyY2VzID0gYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBXc2RkUmVzb3VyY2UgfHwgcmVzIGluc3RhbmNlb2YgV2ViU2VydmljZXNSZXNvdXJjZSkgewotCQkJCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudC5nZXRFdmVudENvZGUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkgPT0gRWRpdE1vZGVsRXZlbnQuUFJFX0RJU1BPU0UpIHsKLQkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgYW5FdmVudC5nZXRFZGl0TW9kZWwoKTsKLQkJCWlmIChlZGl0TW9kZWwgPT0gbnVsbCB8fCBlZGl0TW9kZWwuZ2V0UHJvamVjdCgpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJV1NEREFydGlmYWN0RWRpdCB3c0FydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBnZXRXU0FydGlmYWN0RWRpdHMoKS5nZXQoZWRpdE1vZGVsLmdldFByb2plY3QoKSk7Ci0JCQlpZiAod3NBcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWdldFdTQXJ0aWZhY3RFZGl0cygpLnJlbW92ZShlZGl0TW9kZWwuZ2V0UHJvamVjdCgpKTsKLQkJCQkJd3NBcnRpZmFjdEVkaXQucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJd3NBcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCVdTQ0REQXJ0aWZhY3RFZGl0IHdzQ2xpZW50QXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS5nZXQoZWRpdE1vZGVsLmdldFByb2plY3QoKSk7Ci0JCQlpZiAod3NDbGllbnRBcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLnJlbW92ZShlZGl0TW9kZWwuZ2V0UHJvamVjdCgpKTsKLQkJCQkJd3NDbGllbnRBcnRpZmFjdEVkaXQucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQl3c0NsaWVudEFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgV1NEREFydGlmYWN0RWRpdCBnZXRXU0FydGlmYWN0RWRpdChJUHJvamVjdCBoYW5kbGUpIHsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgZ2V0V1NBcnRpZmFjdEVkaXRzKCkuZ2V0KGhhbmRsZSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgPT0gbnVsbCkgewotCQkJYXJ0aWZhY3RFZGl0ID0gV1NEREFydGlmYWN0RWRpdC5nZXRXU0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChoYW5kbGUpOwotCQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0LmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCWdldFdTQXJ0aWZhY3RFZGl0cygpLnB1dChoYW5kbGUsYXJ0aWZhY3RFZGl0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLQlwcml2YXRlIFdTQ0REQXJ0aWZhY3RFZGl0IGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0KElQcm9qZWN0IGhhbmRsZSkgewotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLmdldChoYW5kbGUpOwotCQlpZiAoYXJ0aWZhY3RFZGl0ID09IG51bGwpIHsKLQkJCWFydGlmYWN0RWRpdCA9IFdTQ0REQXJ0aWZhY3RFZGl0LmdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChoYW5kbGUpOwotCQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0LmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCWdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLnB1dChoYW5kbGUsYXJ0aWZhY3RFZGl0KTsKLQkJCX0KLQkJfQotCQotCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZgotCSAqIAotCSAqIEBhbkV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhpbnQgYW5FdmVudFR5cGUpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlzTm90aWZpbmcgPSB0cnVlOwotCQl9Ci0JCXRyeSB7Ci0JCQlMaXN0IGxpc3QgPSBnZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCVdlYlNlcnZpY2VFdmVudCB3ZWJTZXJ2aWNlRXZlbnQgPSBuZXcgV2ViU2VydmljZUV2ZW50KFdlYlNlcnZpY2VFdmVudC5SRUZSRVNIKTsKLQkJCQkoKFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIpIGxpc3QuZ2V0KGkpKS53ZWJTZXJ2aWNlTWFuYWdlckNoYW5nZWQod2ViU2VydmljZUV2ZW50KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlzTm90aWZpbmcgPSBmYWxzZTsKLQkJCQlpZiAocmVtb3ZlZExpc3RlbmVycyAhPSBudWxsICYmICFyZW1vdmVkTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZWRMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspCi0JCQkJCQlsaXN0ZW5lcnMucmVtb3ZlKHJlbW92ZWRMaXN0ZW5lcnMuZ2V0KGkpKTsKLQkJCQkJcmVtb3ZlZExpc3RlbmVycy5jbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhTGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZUxpc3RlbmVyKFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCWlmIChhTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJaWYgKGlzTm90aWZpbmcpCi0JCQkJcmV0dXJuIHJlbW92ZWRMaXN0ZW5lcnMuYWRkKGFMaXN0ZW5lcik7Ci0JCQlyZXR1cm4gZ2V0TGlzdGVuZXJzKCkucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWxlYXNlQXJ0aWZhY3RFZGl0cygpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQXJ0aWZhY3RFZGl0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0JCQlhcnRpZmFjdEVkaXQucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCWdldFdTQXJ0aWZhY3RFZGl0cygpLmNsZWFyKCk7Ci0JCQotCQlpdGVyID0gZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJYXJ0aWZhY3RFZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJYXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS5jbGVhcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlhY2NlcHREZWx0YShldmVudCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHREZWx0YShJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCS8vIHNlYXJjaCBmb3IgY2hhbmdlcyB0byBhbnkgcHJvamVjdHMgdXNpbmcgYSB2aXNpdG9yCi0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdCh0aGlzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgaW50ZXJuYWwgd2ViIHNlcnZpY2VzIGRlc2NyaXB0aW9ucyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlc0Rlc2NyaXB0aW9ucygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd2ViU2VydmljZXMgPSBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2ViU2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVdlYlNlcnZpY2VzIHdlYlNlcnZpY2UgPSAoV2ViU2VydmljZXMpIHdlYlNlcnZpY2VzLmdldChpKTsKLQkJCWlmICh3ZWJTZXJ2aWNlICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZEFsbCh3ZWJTZXJ2aWNlLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGFsbCBpbnRlcm5hbCB3ZWIgc2VydmljZXMgaW5zdGFuY2VzIGluIHdvcmtzcGFjZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVybmFsV2ViU2VydmljZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCVdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzID0gYXJ0aWZhY3RFZGl0LmdldFdlYlNlcnZpY2VzKCk7Ci0JCQlpZiAod2ViU2VydmljZXMgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkKHdlYlNlcnZpY2VzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgaW50ZXJuYWwgd3NkbCBzZXJ2aWNlcyBpbiB3c2RsJ3MgcG9pbnRlZCB0byBieSB3c2RkJ3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpIHsKLQkJcmV0dXJuIGdldFdTRExTZXJ2aWNlc0Zyb21XU0RMUmVzb3VyY2VzKGdldEludGVybmFsV1NETFJlc291cmNlcygpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcm5hbFdTRExSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdzZGRXZWJTZXJ2aWNlcyA9IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RkV2ViU2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlcyA9IChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIHdzZGRXZWJTZXJ2aWNlcy5nZXQoaSk7Ci0JCQlSZXNvdXJjZSB3c2RsID0gZ2V0V1NETFJlc291cmNlKHdlYlNlcnZpY2VzKTsKLQkJCWlmICh3c2RsICE9IG51bGwgJiYgIXJlc3VsdC5jb250YWlucyh3c2RsKSkKLQkJCQlyZXN1bHQuYWRkKHdzZGwpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JCXB1YmxpYyBMaXN0IGdldEV4dGVybmFsV1NETFJlc291cmNlcygpIHsKLQkJCS8vVE9ETyBmaXggdXAgZm9yIGJhc2lzIG9mZiAud3NpbAotCQkJTGlzdCByZXN1bHQgPSBnZXRXb3Jrc3BhY2VXU0RMUmVzb3VyY2VzKCk7Ci0JCQlyZXN1bHQucmVtb3ZlQWxsKGdldEludGVybmFsV1NETFJlc291cmNlcygpKTsKLQkJCUxpc3Qgc2VydmljZVJlZnMgPSBnZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlcnZpY2VSZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU2VydmljZVJlZiByZWYgPSAoU2VydmljZVJlZikgc2VydmljZVJlZnMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHJlZi5nZXRXc2RsRmlsZSgpKSwgdHJ1ZSk7Ci0JCQkJCWlmIChyZXMgIT1udWxsICYmIHJlc3VsdC5jb250YWlucyhyZXMpKQotCQkJCQkJcmVzdWx0LnJlbW92ZShyZXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VJbnRlcm5hbChFT2JqZWN0IHNlcnZpY2UpIHsKLQkJcmV0dXJuIGdldEludGVybmFsV1NETFJlc291cmNlcygpLmNvbnRhaW5zKGdldFdTRExSZXNvdXJjZShzZXJ2aWNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFdTRExTZXJ2aWNlc0Zyb21XU0RMUmVzb3VyY2VzKExpc3Qgd3NkbFJlc291cmNlcykgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSB3c2RsID0gKFJlc291cmNlKSB3c2RsUmVzb3VyY2VzLmdldChpKTsKLQkJCUxpc3Qgc2VydmljZXMgPSBnZXRXU0RMU2VydmljZXMod3NkbCk7Ci0JCQlpZiAod3NkbCAhPSBudWxsICYmIHNlcnZpY2VzICE9IG51bGwgJiYgIXNlcnZpY2VzLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHNlcnZpY2VzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEV4dGVybmFsV1NETFNlcnZpY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IGdldFdzZGxTZXJ2aWNlc0Zyb21Xb3Jrc3BhY2VXU0lMcygpOwotCQlyZXN1bHQucmVtb3ZlQWxsKGdldEludGVybmFsV1NETFNlcnZpY2VzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdzZGxTZXJ2aWNlc0Zyb21Xb3Jrc3BhY2VXU0lMcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd3NpbEZpbGVzID0gZ2V0V29ya3NwYWNlV1NJTEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3NpbEZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmlsZSB3c2lsID0gKElGaWxlKSB3c2lsRmlsZXMuZ2V0KGkpOwotCQkJTGlzdCBzZXJ2aWNlcyA9IGdldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZSh3c2lsKTsKLQkJCWlmICghc2VydmljZXMuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwoc2VydmljZXMpOwotCQl9Ci0JcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJcmV0dXJuIHNlcnZpY2VIZWxwZXIuZ2V0V3NkbFNlcnZpY2VzRnJvbVdzaWxGaWxlKHdzaWwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIFdTREwgU2VydmljZXMsIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWxsV1NETFNlcnZpY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRFeHRlcm5hbFdTRExTZXJ2aWNlcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJcmVsZWFzZUFydGlmYWN0RWRpdHMoKTsKLQkJSU5TVEFOQ0UgPSBudWxsOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRXU0RMUmVzb3VyY2UoV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2UpIHsKLQkJaWYgKHdlYlNlcnZpY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgd3NkbEZpbGVOYW1lID0gd2ViU2VydmljZS5nZXRXc2RsRmlsZSgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh3ZWJTZXJ2aWNlKSk7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkgcmV0dXJuIHJlczsKLQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgZ2V0V1NBcnRpZmFjdEVkaXRzKCkuZ2V0KHJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOwotCQlpZiAoYXJ0aWZhY3RFZGl0IT1udWxsKSAKLQkJCXJlcyA9IGFydGlmYWN0RWRpdC5nZXRXc2RsUmVzb3VyY2Uod3NkbEZpbGVOYW1lKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXU0RMU2VydmljZXMoUmVzb3VyY2Ugd3NkbCkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdCBkZWYgPSBzZXJ2aWNlSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGwpOwotCQlpZiAoZGVmID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KHNlcnZpY2VIZWxwZXIuZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGRlZikudmFsdWVzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldFdTRExTZXJ2aWNlRm9yV2ViU2VydmljZShXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZSkgewotCQlFT2JqZWN0IHNlcnZpY2UgPSBudWxsOwotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJUmVzb3VyY2Ugd3NkbCA9IGdldFdTRExSZXNvdXJjZSh3ZWJTZXJ2aWNlKTsKLQkJaWYgKHdzZGwgPT0gbnVsbCkgcmV0dXJuIHNlcnZpY2U7Ci0JCU9iamVjdCBkZWZpbml0aW9uID0gc2VydmljZUhlbHBlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsKTsKLQkJaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgcmV0dXJuIHNlcnZpY2U7Ci0JCU1hcCBzZXJ2aWNlcyA9IHNlcnZpY2VIZWxwZXIuZ2V0RGVmaW5pdGlvblNlcnZpY2VzKGRlZmluaXRpb24pOwotCQlpZiAoc2VydmljZXMuaXNFbXB0eSgpKSByZXR1cm4gc2VydmljZTsKLQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcCA9IG51bGw7Ci0JCWlmICh3ZWJTZXJ2aWNlLmdldFBvcnRDb21wb25lbnRzKCkhPW51bGwgJiYgd2ViU2VydmljZS5nZXRQb3J0Q29tcG9uZW50cygpLnNpemUoKT4wKSB7Ci0JCQlwb3J0Q29tcCA9IChQb3J0Q29tcG9uZW50KSB3ZWJTZXJ2aWNlLmdldFBvcnRDb21wb25lbnRzKCkuZ2V0KDApOwotCQkJcmV0dXJuIGdldFNlcnZpY2UocG9ydENvbXApOwotCQl9Ci0JCXJldHVybiBzZXJ2aWNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRXU0RMUmVzb3VyY2UoRU9iamVjdCB3c2RsU2VydmljZSkgewotCQlyZXR1cm4gd3NkbFNlcnZpY2UuZVJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0U2VydmljZShQb3J0Q29tcG9uZW50IHBvcnQpIHsKLQkJTGlzdCBzZXJ2aWNlcyA9IGdldEludGVybmFsV1NETFNlcnZpY2VzKCk7Ci0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlFT2JqZWN0IHNlcnZpY2UgPSAoRU9iamVjdClzZXJ2aWNlcy5nZXQoaSk7Ci0JCQlpZiAoc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMoc2VydmljZSkuc2l6ZSgpID09IDEpIHsKLQkJCQlPYmplY3Qgd3NkbFBvcnQgPSBzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyhzZXJ2aWNlKS52YWx1ZXMoKS50b0FycmF5KClbMF07Ci0JCQkJU3RyaW5nIHFOYW1lID0gc2VydmljZUhlbHBlci5nZXRQb3J0QmluZGluZ05hbWVzcGFjZVVSSSh3c2RsUG9ydCk7Ci0JCQkJaWYgKHBvcnQuZ2V0V3NkbFBvcnQoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMocU5hbWUpKQotCQkJCQlyZXR1cm4gc2VydmljZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUG9ydENvbXBvbmVudCBnZXRQb3J0Q29tcG9uZW50KFN0cmluZyBxTmFtZSkgewotCQlMaXN0IHdzRGVzY3MgPSBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzRGVzY3JpcHRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3NEZXNjcy5zaXplKCk7IGkrKykgewotCQkJV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzYyA9IChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIHdzRGVzY3MuZ2V0KGkpOwotCQkJTGlzdCBwb3J0cyA9IHdzRGVzYy5nZXRQb3J0Q29tcG9uZW50cygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwb3J0cy5zaXplKCk7IGorKykgewotCQkJCVBvcnRDb21wb25lbnQgcG9ydENvbXAgPSAoUG9ydENvbXBvbmVudCkgcG9ydHMuZ2V0KGopOwotCQkJCWlmIChwb3J0Q29tcC5nZXRXc2RsUG9ydCgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhxTmFtZSkpCi0JCQkJCXJldHVybiBwb3J0Q29tcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUG9ydENvbXBvbmVudCBnZXRQb3J0Q29tcG9uZW50KFN0cmluZyBxTmFtZSwgSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHdzRGVzY3MgPSBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzRGVzY3JpcHRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3NEZXNjcy5zaXplKCk7IGkrKykgewotCQkJV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzYyA9IChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIHdzRGVzY3MuZ2V0KGkpOwotCQkJTGlzdCBwb3J0cyA9IHdzRGVzYy5nZXRQb3J0Q29tcG9uZW50cygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwb3J0cy5zaXplKCk7IGorKykgewotCQkJCVBvcnRDb21wb25lbnQgcG9ydENvbXAgPSAoUG9ydENvbXBvbmVudCkgcG9ydHMuZ2V0KGopOwotCQkJCWlmIChwb3J0Q29tcC5nZXRXc2RsUG9ydCgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhxTmFtZSkgJiYgcHJvamVjdCA9PSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocG9ydENvbXApKQotCQkJCQlyZXR1cm4gcG9ydENvbXA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFBvcnRDb21wb25lbnQgZ2V0UG9ydENvbXBvbmVudChFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCS8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBvcnQgaW4gdGhlIHdzZGwgc2VydmljZSwgZmluZCB0aGUgbWF0Y2hpbmcgcG9ydCBjb21wb25lbnQKLQkJLy8gb3RoZXJ3aXNlIGlmIG11bHRpcGxlIHBvcnRzIHJldHVybiBudWxsIGJlY2F1c2Ugd2UgbmVlZCBtb3JlIGluZm9ybWF0aW9uCi0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAod3NkbFNlcnZpY2UgPT0gbnVsbCB8fCBzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyh3c2RsU2VydmljZSkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyh3c2RsU2VydmljZSkuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBwb3J0ID0gc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMod3NkbFNlcnZpY2UpLnZhbHVlcygpLnRvQXJyYXkoKVswXTsKLQkJCVN0cmluZyBxTmFtZSA9IHNlcnZpY2VIZWxwZXIuZ2V0UG9ydEJpbmRpbmdOYW1lc3BhY2VVUkkocG9ydCk7Ci0JCQlyZXR1cm4gZ2V0UG9ydENvbXBvbmVudChxTmFtZSwgUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdzZGxTZXJ2aWNlKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFNlcnZpY2VJbXBsQmVhbiBnZXRTZXJ2aWNlSW1wbEJlYW4oRU9iamVjdCB3c2RsU2VydmljZSkgewotCQlQb3J0Q29tcG9uZW50IHBvcnQgPSBnZXRQb3J0Q29tcG9uZW50KHdzZGxTZXJ2aWNlKTsKLQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcG9ydC5nZXRTZXJ2aWNlSW1wbEJlYW4oKTsKLQl9Ci0KLQlwdWJsaWMgV3NkZFJlc291cmNlIGdldFdzZGRSZXNvdXJjZShFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCVBvcnRDb21wb25lbnQgcG9ydCA9IGdldFBvcnRDb21wb25lbnQod3NkbFNlcnZpY2UpOwotCQlpZiAocG9ydCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoV3NkZFJlc291cmNlKSBwb3J0LmVSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKEVPYmplY3Qgd3NkbFNlcnZpY2UpIHsKLQkJUG9ydENvbXBvbmVudCBwb3J0ID0gZ2V0UG9ydENvbXBvbmVudCh3c2RsU2VydmljZSk7Ci0JCWlmIChwb3J0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBvcnQuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWxsV29ya3NwYWNlU2VydmljZVJlZnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKGdldFdvcmtzcGFjZTEzU2VydmljZVJlZnMoKSk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0V29ya3NwYWNlMTRTZXJ2aWNlUmVmcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2UxM1NlcnZpY2VSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NDRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gYXJ0aWZhY3RFZGl0LmdldFdzY2RkWG1pUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNMb2FkZWQoKSAmJiByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKSAhPSBudWxsKQotCQkJCXJlc3VsdC5hZGRBbGwocmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKElQcm9qZWN0IGhhbmRsZSkgewotCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlXU0NEREFydGlmYWN0RWRpdCB3c0NsaWVudEFydGlmYWN0RWRpdCA9IChXU0NEREFydGlmYWN0RWRpdCkgZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkuZ2V0KGhhbmRsZSk7Ci0JCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gd3NDbGllbnRBcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmlzTG9hZGVkKCkgJiYgcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hZGRBbGwocmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJV1NDRERBcnRpZmFjdEVkaXQgd3NjQXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCh3c2NBcnRpZmFjdEVkaXQuZ2V0UHJvamVjdCgpKTsKLQkJCXRyeSB7Ci0JCQkJRU9iamVjdCByb290T2JqZWN0ID0gYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJCQkvLyBoYW5kbGUgRUpCIHByb2plY3QgY2FzZQotCQkJCWlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgRUpCSmFyKSB7Ci0JCQkJCUxpc3QgY21wcyA9ICgoRUpCSmFyKSByb290T2JqZWN0KS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbXBzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKSBjbXBzLmdldChqKTsKLQkJCQkJCWlmIChiZWFuLmdldFNlcnZpY2VSZWZzKCkgIT0gbnVsbCAmJiAhYmVhbi5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXN1bHQuYWRkQWxsKGJlYW4uZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gaGFuZGxlIFdlYiBQcm9qZWN0Ci0JCQkJZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIFdlYkFwcCkgewotCQkJCQlpZiAoKChXZWJBcHApIHJvb3RPYmplY3QpLmdldFNlcnZpY2VSZWZzKCkgIT0gbnVsbCAmJiAhKChXZWJBcHApIHJvb3RPYmplY3QpLmdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpKQotCQkJCQkJcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQkJfQotCQkJCS8vIGhhbmRsZSBBcHAgY2xpZW50cwotCQkJCWVsc2UgaWYgKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkNsaWVudCkgewotCQkJCQlpZiAoKChBcHBsaWNhdGlvbkNsaWVudCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICEoKEFwcGxpY2F0aW9uQ2xpZW50KSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSkKLQkJCQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpCi0JCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0oyRUUxNChTZXJ2aWNlUmVmIHJlZikgewotCQlyZXR1cm4gIShyZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZVdTSUxGaWxlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBnZXRXU0FydGlmYWN0RWRpdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBmaWxlcyA9IGFydGlmYWN0RWRpdC5nZXRXU0lMUmVzb3VyY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzLnNpemUoKTsgaisrKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGopOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgV1NJTF9FWFQuZXF1YWxzKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSkKLQkJCQkJcmVzdWx0LmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZVdTRExSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhcnRpZmFjdEVkaXQuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUxpc3Qgd3NkbFJlc291cmNlcyA9IGFydGlmYWN0RWRpdC5nZXRXU0RMUmVzb3VyY2VzKCk7Ci0JCQkJaWYgKHdzZGxSZXNvdXJjZXMgIT0gbnVsbCAmJiAhd3NkbFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3c2RsUmVzb3VyY2VzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlSZXNvdXJjZSB3c2RsID0gKFJlc291cmNlKSB3c2RsUmVzb3VyY2VzLmdldChqKTsKLQkJCQkJCWlmICghcmVzdWx0LmNvbnRhaW5zKHdzZGwpKQotCQkJCQkJCXJlc3VsdC5hZGQod3NkbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXU0RMU2VydmljZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGludGVybmFsV3NkbHMgPSBnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpOwotCQlpZiAoaW50ZXJuYWxXc2RscyAhPSBudWxsICYmICFpbnRlcm5hbFdzZGxzLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwoaW50ZXJuYWxXc2Rscyk7Ci0JCS8vVE9ETyBhZGQgZXh0ZXJuYWxzCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0NEREFydGlmYWN0RWRpdCkgZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkuZ2V0KFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoYmVhbikuZ2V0UHJvamVjdCgpKTsKLQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGVqYk5hbWUgPSBiZWFuLmdldE5hbWUoKTsKLQkJCUxpc3Qgc2NvcGVzID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2NvcGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUNvbXBvbmVudFNjb3BlZFJlZnMgc2NvcGUgPSAoQ29tcG9uZW50U2NvcGVkUmVmcykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHNjb3BlLmdldENvbXBvbmVudE5hbWUoKS5lcXVhbHMoZWpiTmFtZSkpCi0JCQkJCXJldHVybiBzY29wZS5nZXRTZXJ2aWNlUmVmcygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGllbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQpIHsKLQkJSVByb2plY3QgaGFuZGxlID0gZ2V0Q29tcG9uZW50UHJvamVjdChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGNsaWVudCkpOwotCQlpZiAoaGFuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJV1NDRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS5nZXQoaGFuZGxlKTsKLQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCVdlYlNlcnZpY2VzQ2xpZW50IHdlYkNsaWVudCA9IHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpOwotCQkJaWYgKHdlYkNsaWVudCAhPSBudWxsKQotCQkJCXJldHVybiB3ZWJDbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2ViYXBwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldDEzU2VydmljZVJlZnMoV2ViQXBwIHdlYmFwcCkgewotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUod2ViYXBwKSk7Ci0JCWlmIChoYW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLmdldChoYW5kbGUpOwotCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IGFydGlmYWN0RWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJV2ViU2VydmljZXNDbGllbnQgd2ViQ2xpZW50ID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQlpZiAod2ViQ2xpZW50ICE9IG51bGwpCi0JCQkJcmV0dXJuIHdlYkNsaWVudC5nZXRTZXJ2aWNlUmVmcygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJLy8gSGFuZGxlIHByb2plY3QgYWRkcyBhbmQgcHJvamVjdCBvcGVucwotCQkJaWYgKChkZWx0YS5nZXRLaW5kKCk9PUlSZXNvdXJjZURlbHRhLkFEREVEIHx8ICgoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKSAmJiBwLmlzQWNjZXNzaWJsZSgpKSkpIHsKLQkJCQlib29sZWFuIHN0YXRlID0gdHJ1ZTsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwKTsKLQkJCQkKLQkJCQkJaWYgKGNvbXBvbmVudCE9bnVsbCAmJiAhSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRS5lcXVhbHMoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGVJZCgpKSkgewotCi0JCQkJCVdTRERBcnRpZmFjdEVkaXQgd3NBcnRpZmFjdEVkaXQgPSBnZXRXU0FydGlmYWN0RWRpdChwKTsKLQkJCQkJaWYgKHdzQXJ0aWZhY3RFZGl0ICE9bnVsbCkKLQkJCQkJCXN0YXRlID0gZmFsc2U7Ci0JCQkJCVdTQ0REQXJ0aWZhY3RFZGl0IHdzY0FydGlmYWN0RWRpdCA9IGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0KHApOwotCQkJCQlpZiAod3NjQXJ0aWZhY3RFZGl0ICE9bnVsbCkgewotCQkJCQkJc3RhdGUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCXJldHVybiBzdGF0ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBIYW5kbGUgcHJvamVjdCBjbG9zZSBldmVudHMgYW5kIHJlbW92YWxzIAotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICAmJiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKSkKLQkJCQkJfHwgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSl7Ci0JCQkJYm9vbGVhbiBzdGF0ZSA9IHRydWU7Ci0JCQkJTGlzdCB3c2RkQXJ0aWZhY3RFZGl0c1RvUmVtb3ZlID0gZ2V0QXNzb2NpYXRlZEFydGlmYWN0RWRpdEtleXMocCxnZXRXU0FydGlmYWN0RWRpdHMoKSk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHdzZGRBcnRpZmFjdEVkaXRzVG9SZW1vdmUuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVByb2plY3QgaGFuZGxlID0gKElQcm9qZWN0KSB3c2RkQXJ0aWZhY3RFZGl0c1RvUmVtb3ZlLmdldChpKTsKLQkJCQkJaWYgKGhhbmRsZSAhPSBudWxsICYmIGdldFdTQXJ0aWZhY3RFZGl0cygpLmNvbnRhaW5zS2V5KGhhbmRsZSkpIHsKLQkJCQkJCVdTRERBcnRpZmFjdEVkaXQgd3NBcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgZ2V0V1NBcnRpZmFjdEVkaXRzKCkuZ2V0KGhhbmRsZSk7Ci0JCQkJCQlnZXRXU0FydGlmYWN0RWRpdHMoKS5yZW1vdmUoaGFuZGxlKTsKLQkJCQkJCXdzQXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCQkJCXN0YXRlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJTGlzdCB3c2NkZEFydGlmYWN0RWRpdHNUb1JlbW92ZSA9IGdldEFzc29jaWF0ZWRBcnRpZmFjdEVkaXRLZXlzKHAsZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkpOwotCQkJCWZvciAoaW50IGk9MDsgaTx3c2NkZEFydGlmYWN0RWRpdHNUb1JlbW92ZS5zaXplKCk7IGkrKykgewotCQkJCQlJUHJvamVjdCBoYW5kbGUgPSAoSVByb2plY3QpIHdzY2RkQXJ0aWZhY3RFZGl0c1RvUmVtb3ZlLmdldChpKTsKLQkJCQkJaWYgKGhhbmRsZSAhPSBudWxsICYmIGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpLmNvbnRhaW5zS2V5KGhhbmRsZSkpIHsKLQkJCQkJCVdTQ0REQXJ0aWZhY3RFZGl0IHdzY0FydGlmYWN0RWRpdCA9IChXU0NEREFydGlmYWN0RWRpdCkgZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkuZ2V0KGhhbmRsZSk7Ci0JCQkJCQlnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKS5yZW1vdmUoaGFuZGxlKTsKLQkJCQkJCXdzY0FydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJCQlzdGF0ZSA9IGZhbHNlOwotCQkJCQl9CQotCQkJCX0KLQkJCQlyZXR1cm4gc3RhdGU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBpc0ludGVycmVzdGVkSW5GaWxlKChJRmlsZSkgcmVzb3VyY2UpKSB7Ci0JCQkvLyBIYW5kbGUgV1NJTCBhbmQgV1NETCBGaWxlIGFkZGl0aW9ucwotCQkJaWYgKChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQpIHx8ICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSkgewotCQkJCWlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTRExfRVhUKSkKLQkJCQkgICAgYWRkZWRXc2RsKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCWVsc2UgaWYgKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoV1NJTF9FWFQpKQotCQkJCSAgICBhZGRlZFdzaWwoKElGaWxlKXJlc291cmNlKTsKLQkJCX0KLQkJCS8vIEhhbmRsZSBXU0lMIG9yIFdTREwgZmlsZSByZW1vdmFscwotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB8fCAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSkgewotCQkJCWlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTRExfRVhUKSB8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTSUxfRVhUKSkKLQkJCQlub3RpZnlMaXN0ZW5lcnMoRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QXNzb2NpYXRlZEFydGlmYWN0RWRpdEtleXMoSVByb2plY3QgcHJvamVjdCwgSGFzaE1hcCBhcnRpZmFjdEVkaXRzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RFZGl0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlJUHJvamVjdCBoYW5kbGUgPSAoSVByb2plY3QpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGhhbmRsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCXJlc3VsdC5hZGQoaGFuZGxlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZGVkV3NkbChJRmlsZSB3c2RsKSB7Ci0JCWlmICghd3NkbC5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJSVByb2plY3QgaGFuZGxlID0gZ2V0Q29tcG9uZW50UHJvamVjdCh3c2RsKTsKLQkJaWYgKGhhbmRsZSAhPSBudWxsKSB7Ci0JCQlnZXRXU0FydGlmYWN0RWRpdChoYW5kbGUpOwotCQkJbm90aWZ5TGlzdGVuZXJzKEVkaXRNb2RlbEV2ZW50LkxPQURFRF9SRVNPVVJDRSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRlZFdzaWwoSUZpbGUgd3NpbCkgewotCQlpZiAoIXdzaWwuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCUlQcm9qZWN0IGhhbmRsZSA9IGdldENvbXBvbmVudFByb2plY3Qod3NpbCk7Ci0JCWlmIChoYW5kbGUgIT0gbnVsbCkgewotCQkJZ2V0V1NBcnRpZmFjdEVkaXQoaGFuZGxlKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhFZGl0TW9kZWxFdmVudC5MT0FERURfUkVTT1VSQ0UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVByb2plY3QgZ2V0Q29tcG9uZW50UHJvamVjdChJRmlsZSByZXMpIHsKLQkJcmV0dXJuIHJlcy5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluRmlsZShJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCAmJiBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IGFGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCXJldHVybiBleHRlbnNpb24uZXF1YWxzKFdTRExfRVhUKSB8fCBleHRlbnNpb24uZXF1YWxzKFdTSUxfRVhUKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZXJ2aWNlUmVmcyhFSkJKYXIgamFyKSB7Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGJlYW5zID0gamFyLmdldEVudGVycHJpc2VCZWFucygpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiZWFucy5zaXplKCk7IGkrKykgewotCQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGJlYW5zLmdldChpKTsKLQkJCQlsaXN0LmFkZEFsbChnZXRTZXJ2aWNlUmVmcyhiZWFuKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlcnZpY2VSZWZzKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYmVhbi5nZXRFamJKYXIoKS5nZXRKMkVFVmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0JCQlsaXN0LmFkZEFsbChiZWFuLmdldFNlcnZpY2VSZWZzKCkpOwotCQllbHNlCi0JCQlsaXN0LmFkZEFsbChnZXQxM1NlcnZpY2VSZWZzKGJlYW4pKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U2VydmljZVJlZnMoV2ViQXBwIHdlYmFwcCkgewotCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWlmICh3ZWJhcHAuZ2V0VmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCkKLQkJCQlsaXN0LmFkZEFsbCh3ZWJhcHAuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQllbHNlCi0JCQkJbGlzdC5hZGRBbGwoZ2V0MTNTZXJ2aWNlUmVmcyh3ZWJhcHApKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U2VydmljZVJlZnMoQXBwbGljYXRpb25DbGllbnQgY2xpZW50KSB7Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYgKGNsaWVudC5nZXRKMkVFVmVyc2lvbklEKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0JCQkJbGlzdC5hZGRBbGwoY2xpZW50LmdldFNlcnZpY2VSZWZzKCkpOwotCQkJZWxzZQotCQkJCWxpc3QuYWRkQWxsKGdldDEzU2VydmljZVJlZnMoY2xpZW50KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3BsdWdpbi9XZWJTZXJ2aWNlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YjQxZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDI4LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVBsdWdpbiBleHRlbmRzIFdUUFBsdWdpbiBpbXBsZW1lbnRzIFJlc291cmNlTG9jYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlUGx1Z2luIHNpbmdsZXRvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IHRoaXM7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgcmVzb3VyY2UgYXMgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsCi0JICogbG9jYXRpb24uCi0JICogCi0JICogQHJldHVybiBBbiBpbWFnZSBkZXNjcmlwdG9yLCBwb3NzaWJseSBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJVVJMIGluc3RhbGxVUkwgPSBnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgbmFtZSk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotCSAqIChBVEtVSVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oImNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuYXRrLnVpIik7Ci0JICogCi0JICogQHJldHVybiBUaGUgQVRLVUlQbHVnaW4gc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgV2ViU2VydmljZVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IKLQkgKiB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbgotCSAqICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIgd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotCSAqICAgICAgICAgICAgZm9ybTogIktFWSA9IHZhbHVlIi4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCksIGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yCi0JICogdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4gU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcgYXJlIHJlcGxhY2VkIGJ5IHRoZQotCSAqIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaCBhcmUgbW9zdCBmcmVxdWVudGx5IHN0cmluZ3MpLiBTZWUKLQkgKiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4gVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4KLQkgKiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZSBhcyByZXF1aXJlZCBieSB0aGUgbWVzc2FnZSBpbgotCSAqICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMgYW5kIGJ5IHRoZSBydWxlcyBvZiBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSwgYXJncyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgZnJvbSB3aGljaCBhbGwgcmVzb3VyY2VzIGFyZSBiYXNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBVUkwgZnJvbSB3aGljaCBhbGwgcmVzb3VyY2VzIGFyZSBiYXNlZC4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEJhc2VVUkwoKSB7Ci0JCVN0cmluZyBpbnN0YWxsVVJMID0gZ2V0UGx1Z2luSW5zdGFsbExvY2F0aW9uKCk7Ci0JCWlmIChpbnN0YWxsVVJMICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihpbnN0YWxsVVJMKTsKLQkJCQlzYi5hcHBlbmQoInBsdWdpbi5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IFVSTChzYi50b1N0cmluZygpKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGtleS4gVGhlIGRlc2NyaXB0aW9uIHdpbGwgdHlwaWNhbGx5IGJlIGluIHRoZSBmb3JtIG9mIGEgVVJMIHRvIHRoZSBpbWFnZSBkYXRhLiBDcmVhdGlvbiBvZiBhbgotCSAqIGFjdHVhbCBpbWFnZSBkZXBlbmRzIG9uIHRoZSBHVUkgZW52aXJvbm1lbnQ7IHdpdGhpbiBFY2xpcHNlLAotCSAqIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeSBjYW4gYmUgdXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBpbWFnZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvbiB0aGUgaW1hZ2UgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3Ioa2V5KTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKQotCQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKHRoaXMpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkudG9PU1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSW5zdGFsbExvY2F0aW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpKS5nZXRGaWxlKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIHN0cmluZyByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0TWVzc2FnZShrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIGFuZCBwZWZvcm1zIHN1YnN0aXR1dGlvbnMuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgc3RyaW5nLgotCSAqIEBwYXJhbSBzdWJzdGl0dXRpb25zCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSBzdWJzdGl0dXRpb25zLgotCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCi0JICogQHNlZSAjZ2V0U3RyaW5nKFN0cmluZykKLQkgKiBAc2VlIE1lc3NhZ2VGb3JtYXQjZm9ybWF0KFN0cmluZywgT2JqZWN0W10pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gc3Vic3RpdHV0aW9ucykgewotCQlyZXR1cm4gZ2V0TWVzc2FnZShrZXksIHN1YnN0aXR1dGlvbnMpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBvbmNlIGJ5IHRoZSBwbGF0Zm9ybSB3aGVuIHRoaXMgcGx1Z2luIGlzIGZpcnN0IGxvYWRlZC4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGlzIHBsdWdpbiBmYWlscyB0byBzdGFydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJV3NkZFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcihXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRSk7Ci0JCVdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgb25jZSBieSB0aGUgcGxhdGZvcm0gd2hlbiB0aGlzIHBsdWdpbiBpcyB1bmxvYWRlZC4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGlzIHBsdWdpbiBmYWlscyB0byBzaHV0ZG93bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCS8vIFRPRE8gRm9yIG5vdy4uLiAgdHJhbnNsYXRlIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMsIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCS8vIFRPRE8gRm9yIG5vdy4uLiAgdHJhbnNsYXRlIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGdldFN0cmluZyhrZXksc3Vic3RpdHV0aW9ucyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODNmOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXNfOwotCi0JcHVibGljIEFUS1VJQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWFkYXB0ZXJGYWN0b3JpZXNfID0gbmV3IEFkYXB0ZXJGYWN0b3J5WzRdOwotCQlhZGFwdGVyRmFjdG9yaWVzX1swXSA9IG5ldyBXc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJYWRhcHRlckZhY3Rvcmllc19bMV0gPSBuZXcgQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWFkYXB0ZXJGYWN0b3JpZXNfWzJdID0gbmV3IEFUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeSgpOwotCQlhZGFwdGVyRmFjdG9yaWVzX1szXSA9IG5ldyBBVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vdGlmaWVyKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGFkYXB0ZXJGYWN0b3JpZXNfW2ldLmFkYXB0KHRhcmdldCwgdHlwZSk7Ci0JCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBvYmplY3Q7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmUodGFyZ2V0LCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBhZGFwdCgoT2JqZWN0KSB0YXJnZXQsIHR5cGUpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikgewotCQkJcmV0dXJuIChBZGFwdGVyKSBvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgYnkge0BsaW5rICNhZGFwdChPYmplY3QsT2JqZWN0KSBhZGFwdChPYmplY3QsIE9iamVjdCl9Zm9yIG9iamVjdHMgdGhhdCBhcmVuJ3QKLQkgKiBub3RpZmllcnMuCi0JICogCi0JICogQHBhcmFtIGFuCi0JICogICAgICAgICAgICBhcmJpdHJhcnkgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUga2V5IGluZGljYXRpbmcgdGhlIHR5cGUgb2YgYWRhcHRlciByZXF1aXJlZC4KLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgaXRzZWxmLgotCSAqIEBzZWUgI2FkYXB0KE9iamVjdCxPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiByZXNvbHZlRUxpc3QoKEVMaXN0KSBvYmplY3QsIHR5cGUpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiByZXNvbHZlQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QsIHR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCByZXNvbHZlRUxpc3QoRUxpc3QgZUxpc3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChlTGlzdC5zaXplKCkgPiAwKQotCQkJcmV0dXJuIGFkYXB0KGVMaXN0LmdldCgwKSwgdHlwZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IHJlc29sdmVBZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHJlc29sdmVFTGlzdChhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCSgoV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yaWVzX1swXSkuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkoKEFUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc19bMV0pLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJKChBVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNfWzJdKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCSgoQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc19bM10pLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhZDFhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBBVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhcmFtVmFsdWVBZGFwdGVyKCkgewotCQlpZiAocGFyYW1WYWx1ZUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJcGFyYW1WYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVBhcmFtVmFsdWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0KLQkJcmV0dXJuIHBhcmFtVmFsdWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUU5hbWVBZGFwdGVyKCkgewotCQlpZiAocU5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcU5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlRTmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBxTmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQotCS8qCi0JICogcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKSB7IGlmIChzb2FwSGVhZGVySXRlbVByb3ZpZGVyID09IG51bGwpCi0JICogc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIodGhpcyk7IHJldHVybgotCSAqIHNvYXBIZWFkZXJJdGVtUHJvdmlkZXI7IH0KLQkgKiAKLQkgKiBwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQUm9sZUFkYXB0ZXIoKSB7IGlmIChzb2FwUm9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCSAqIHNvYXBSb2xlSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7IHJldHVybiBzb2FwUm9sZUl0ZW1Qcm92aWRlcjsgfQotCSAqIAotCSAqIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnROYW1lQWRhcHRlcigpIHsgaWYgKHBvcnROYW1lSXRlbVByb3ZpZGVyID09IG51bGwpCi0JICogcG9ydE5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlQb3J0TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsgcmV0dXJuIHBvcnROYW1lSXRlbVByb3ZpZGVyOyB9Ci0JICogIAotCSAqLwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWVjNDczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZygoKENvbXBvbmVudFNjb3BlZFJlZnMpIG9iamVjdCkuZ2V0Q29tcG9uZW50TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlIYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5N2IzZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJSGFuZGxlckl0ZW1Qcm92aWRlciBleHRlbmRzIEhhbmRsZXJJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJSGFuZGxlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZygoKEhhbmRsZXIpIG9iamVjdCkuZ2V0SGFuZGxlck5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIChzICE9IG51bGwpID8gcyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gamF2YUNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCXJldHVybiAoY2xhc3NOYW1lICE9IG51bGwpID8gY2xhc3NOYW1lIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiMGM1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXRQYXJhbU5hbWUoKSk7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoaW5pdFBhcmFtLmdldFBhcmFtVmFsdWUoKSk7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoaW5pdFBhcmFtLmdldERlc2NyaXB0aW9uKCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXRQYXJhbVZhbHVlKCkpOwotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWM0NTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEFUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVBhcmFtVmFsdWUgaW5pdFBhcmFtID0gKFBhcmFtVmFsdWUpIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXROYW1lKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXRWYWx1ZSgpKTsKLQkJCWNhc2UgMiA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZWYxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJUG9ydENvbXBvbmVudFJlZiBwb3J0Q29tcFJlZiA9IChQb3J0Q29tcG9uZW50UmVmKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhwb3J0Q29tcFJlZi5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocG9ydENvbXBSZWYuZ2V0UG9ydENvbXBvbmVudExpbmsoKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHBvcnRDb21wUmVmLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gKGNsYXNzTmFtZSAhPSBudWxsKSA/IGNsYXNzTmFtZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlYWIzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWU7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQb3J0TmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlQb3J0TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVBvcnROYW1lIHBvcnROYW1lID0gKFBvcnROYW1lKSBvYmplY3Q7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocG9ydE5hbWUuZ2V0UG9ydE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlRTmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVFOYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzgzOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVFOYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVFOYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUU5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlRTmFtZSBxbmFtZSA9IChRTmFtZSkgb2JqZWN0OwotCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlzYi5hcHBlbmQocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJCXNiLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTc1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgU09BUEhlYWRlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHNvYXBIZWFkZXIuZ2V0TG9jYWxQYXJ0KCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCQlzYi5hcHBlbmQoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChzb2FwSGVhZGVyLmdldExvY2FsUGFydCgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIzZDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFNPQVBSb2xlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU09BUFJvbGUgc29hcFJvbGUgPSAoU09BUFJvbGUpIG9iamVjdDsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhzb2FwUm9sZS5nZXRTb2FwUm9sZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODdiODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJU2VydmljZVJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJU2VydmljZVJlZkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZygoKFNlcnZpY2VSZWYpIG9iamVjdCkuZ2V0U2VydmljZVJlZk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIChzICE9IG51bGwpID8gcyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gamF2YUNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCXJldHVybiAoY2xhc3NOYW1lICE9IG51bGwpID8gY2xhc3NOYW1lIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTViYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlmZWF0dXJlID0gV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5nZXRXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UoKS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCk7Ci0JCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpKSkKLQkJCXJlc3VsdC5hZGQoU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5nZXRXc0NsaWVudCgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2ViU2VydmljZXNDbGllbnQuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVU5RVUFMSUZJRURfQ09NUE9ORU5UIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4N2Q5ZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBBVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViU2VydmljZXNDbGllbnRBZGFwdGVyKCkgewotCQlpZiAod2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzQWRhcHRlcigpIHsKLQkJaWYgKGNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0Q29tcG9uZW50UmVmQWRhcHRlcigpIHsKLQkJaWYgKHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQudXRpbC5XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gc2VydmljZVJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQudXRpbC5XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUhhbmRsZXJBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIYW5kbGVyQWRhcHRlcigpIHsKLQkJaWYgKGhhbmRsZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWhhbmRsZXJJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlIYW5kbGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2Zjk0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEFUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBBVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5pdFBhcmFtQWRhcHRlcigpIHsKLQkJaWYgKGluaXRQYXJhbUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJaW5pdFBhcmFtSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gaW5pdFBhcmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgewotCQlpZiAoc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBSb2xlQWRhcHRlcigpIHsKLQkJaWYgKHNvYXBSb2xlSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlzb2FwUm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gc29hcFJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydE5hbWVBZGFwdGVyKCkgewotCQlpZiAocG9ydE5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXBvcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBwb3J0TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Fic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyYTMxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Fic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi0KLS8vIE5vbi1nZW5lcmF0ZWQgcHJvdmlkZXIgY29kZQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgewotCXB1YmxpYyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgYWRhcHRlcidzIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0JlYW5MaW5rSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0JlYW5MaW5rSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzA0ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9CZWFuTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkJlYW5MaW5rfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmVhbkxpbmtJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBCZWFuTGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0JlYW5MaW5rIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IHJldHVybiBnZXRTdHJpbmcoIl9VSV9CZWFuTGlua190eXBlIik7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCIlX1VJX0JlYW5MaW5rX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIyMjNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnN9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZENvbXBvbmVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbXBvbmVudCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfY29tcG9uZW50TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db21wb25lbnRTY29wZWRSZWZzX2NvbXBvbmVudE5hbWVfZmVhdHVyZSIsICJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFNjb3BlZFJlZnNfU2VydmljZVJlZnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb21wb25lbnRTY29wZWRSZWZzLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvQ29tcG9uZW50U2NvcGVkUmVmcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKENvbXBvbmVudFNjb3BlZFJlZnMpb2JqZWN0KS5nZXRDb21wb25lbnROYW1lKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCSAqIGdldFN0cmluZygiX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlIikgKyAiICIgKwotCSAqIGxhYmVsOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29tcG9uZW50U2NvcGVkUmVmcykgb2JqZWN0KS5nZXRDb21wb25lbnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbXBvbmVudFNjb3BlZFJlZnMuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fU0VSVklDRV9SRUZTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VSZWYoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjY2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX2lkX2ZlYXR1cmUiLCAiX1VJX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVsZW1lbnROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjM0ZTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZX1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVzY3JpcHRpb25UeXBlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVzY3JpcHRpb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0aW9uVHlwZSkgb2JqZWN0KS5nZXRMYW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdGlvblR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdGlvblR5cGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzZhZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5EaXNwbGF5TmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaXNwbGF5TmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaXNwbGF5TmFtZVR5cGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNwbGF5TmFtZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlzcGxheU5hbWVUeXBlKSBvYmplY3QpLmdldExhbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rpc3BsYXlOYW1lVHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0Rpc3BsYXlOYW1lVHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VKQkxpbmtJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRUpCTGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWJjY2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRUpCTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuRUpCTGlua31vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCTGlua0l0ZW1Qcm92aWRlciBleHRlbmRzIEJlYW5MaW5rSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQkxpbmtJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRWpiTGlua1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfRUpCTGlua19pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9FSkJMaW5rX2lkX2ZlYXR1cmUiLCAiX1VJX0VKQkxpbmtfdHlwZSIpLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTGlua19JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWpiIExpbmsgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWpiTGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRUpCTGlua19lamJMaW5rX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VKQkxpbmtfZWpiTGlua19mZWF0dXJlIiwgIl9VSV9FSkJMaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkxpbmtfRWpiTGluaygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFSkJMaW5rLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9zZXNzaW9uQmVhbl9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoRUpCTGluaylvYmplY3QpLmdldElkKCk7IHJldHVybiBsYWJlbCA9PQotCSAqIG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0VKQkxpbmtfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfRUpCTGlua190eXBlIikgKyAiICIgKwotCSAqIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFSkJMaW5rKSBvYmplY3QpLmdldEVqYkxpbmsoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9FSkJMaW5rX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVKQkxpbmsuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VsZW1lbnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VsZW1lbnROYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjQ4NTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FbGVtZW50TmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRleHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FbGVtZW50TmFtZV9pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGVtZW50TmFtZV9pZF9mZWF0dXJlIiwgIl9VSV9FbGVtZW50TmFtZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEVsZW1lbnROYW1lX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZXh0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VsZW1lbnROYW1lX3RleHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxlbWVudE5hbWVfdGV4dF9mZWF0dXJlIiwgIl9VSV9FbGVtZW50TmFtZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEVsZW1lbnROYW1lX1RleHQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRWxlbWVudE5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FbGVtZW50TmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFbGVtZW50TmFtZSkgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRWxlbWVudE5hbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGVtZW50TmFtZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVsZW1lbnROYW1lLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fVEVYVCA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDllMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4Y2VwdGlvblR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4Y2VwdGlvbiBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2VwdGlvblR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfZXhjZXB0aW9uVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FeGNlcHRpb25NYXBwaW5nX2V4Y2VwdGlvblR5cGVfZmVhdHVyZSIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBNZXNzYWdlIFBhcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEV4Y2VwdGlvbk1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FeGNlcHRpb25NYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEV4Y2VwdGlvbk1hcHBpbmcpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFeGNlcHRpb25NYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0VYQ0VQVElPTl9UWVBFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdiNTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5IYW5kbGVyfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSGFuZGxlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRIYW5kbGVyTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU29hcFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQb3J0TmFtZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEhhbmRsZXJDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGFuZGxlciBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhhbmRsZXJOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIFJvbGVzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfc29hcFJvbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9zb2FwUm9sZXNfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBSb2xlcygpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgTmFtZXMgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydE5hbWVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9wb3J0TmFtZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9IYW5kbGVyX3BvcnROYW1lc19mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfUG9ydE5hbWVzKCksIGZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGFuZGxlciBDbGFzcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIYW5kbGVyQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfaGFuZGxlckNsYXNzX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSwgZmFsc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0luaXRQYXJhbXMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSGFuZGxlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L2hhbmRsZXIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoSGFuZGxlcilvYmplY3QpLmdldEhhbmRsZXJOYW1lKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0hhbmRsZXJfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChIYW5kbGVyKSBvYmplY3QpLmdldEhhbmRsZXJOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl90eXBlIikgOiBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl90eXBlIikgKyAiOiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSGFuZGxlci5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRSA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1BPUlRfTkFNRVMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRTmFtZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0luaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDIzM2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbX0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRQYXJhbUl0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdFBhcmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCS8vcGdtIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhcmFtVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9Jbml0UGFyYW1faWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfSW5pdFBhcmFtX2lkX2ZlYXR1cmUiLCAiX1VJX0luaXRQYXJhbV90eXBlIiksCi0JICogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0UGFyYW1fSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1OYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3BhcmFtTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0UGFyYW1fUGFyYW1OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBWYWx1ZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3BhcmFtVmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9kZXNjcmlwdGlvbl9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uVHlwZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBJbml0UGFyYW0uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9pbml0aWFsaXpfcGFyYW1ldGVyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKEluaXRQYXJhbSlvYmplY3QpLmdldFBhcmFtTmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Jbml0UGFyYW1fdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9Jbml0UGFyYW1fdHlwZSIpICsgIiAiICsgbGFiZWw7IH0gLyoKLQkgKiAKLQkgKiAvKiogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4gQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlJbml0UGFyYW0gaW5pdFBhcmFtID0gKEluaXRQYXJhbSkgb2JqZWN0OwotCQlTdHJpbmcgbmFtZSA9IGluaXRQYXJhbS5nZXRQYXJhbU5hbWUoKTsKLQkJU3RyaW5nIHZhbHVlID0gaW5pdFBhcmFtLmdldFBhcmFtVmFsdWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDAgfHwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbGFiZWwuYXBwZW5kKG5hbWUpOwotCQlsYWJlbC5hcHBlbmQoIj0iKTsgLy8kTk9OLU5MUy0xJAotCQlsYWJlbC5hcHBlbmQodmFsdWUpOwotCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSW5pdFBhcmFtLmNsYXNzKSkgewotCQkJLy9wZ20gY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fSUQ6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FIDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX1BBUkFNX1ZBTFVFIDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0RFU0NSSVBUSU9OX1RZUEVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uVHlwZXMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeyByZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOyB9Ci0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJSW5pdFBhcmFtIHBhcmFtID0gKEluaXRQYXJhbSkgb2JqZWN0OwotCQlpZiAocGFyYW0uZ2V0UGFyYW1OYW1lKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChwYXJhbS5nZXRQYXJhbU5hbWUoKSk7Ci0JCWlmIChwYXJhbS5nZXRQYXJhbVZhbHVlKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChwYXJhbS5nZXRQYXJhbVZhbHVlKCkpOwotCQlpZiAocGFyYW0uZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKQotCQkJY2hpbGRyZW4uYWRkKHBhcmFtLmdldERlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9JbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0ludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxMmNhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0ludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEludGVyZmFjZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JbnRlcmZhY2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfSW50ZXJmYWNlTWFwcGluZ190eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGM3YmRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFXU0RMTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhV1NETE1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfSmF2YVdTRExNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0V4Y2VwdGlvbk1hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBKYXZhV1NETE1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9KYXZhV1NETE1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSmF2YVdTRExNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9KYXZhV1NETE1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9KYXZhV1NETE1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChKYXZhV1NETE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fUEFDS0FHRV9NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0pBVkFfWE1MX1RZUEVfTUFQUElOR1MgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19FWENFUFRJT05fTUFQUElOR1MgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JTlRFUkZBQ0VfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWNrYWdlTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0phdmFYTUxUeXBlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhjZXB0aW9uTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUludGVyZmFjZU1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTUxMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDbGFzc1R5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFFuYW1lU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFub255bW91c1R5cGVRbmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDbGFzcyBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENsYXNzVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2NsYXNzVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfY2xhc3NUeXBlX2ZlYXR1cmUiLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19DbGFzc1R5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFFuYW1lIFNjb3BlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFFuYW1lU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19xbmFtZVNjb3BlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19xbmFtZVNjb3BlX2ZlYXR1cmUiLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbm9ueW1vdXMgVHlwZSBRbmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm9ueW1vdXNUeXBlUW5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19hbm9ueW1vdXNUeXBlUW5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2Fub255bW91c1R5cGVRbmFtZV9mZWF0dXJlIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBKYXZhWE1MVHlwZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9KYXZhWE1MVHlwZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSmF2YVhNTFR5cGVNYXBwaW5nKSBvYmplY3QpLmdldEFub255bW91c1R5cGVRbmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9vdFR5cGVRbmFtZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVmFyaWFibGVNYXBwaW5nKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkZDI4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0pheHJwY21hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuaW50ZXJuYWwudXRpbC5KYXhycGNtYXBBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4gVGhlCi0gKiBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvCi0gKiB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXhycGNtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEpheHJwY21hcEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXhycGNtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyIGphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhV1NETE1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoamF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBKYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gamF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciBwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyIGphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhWE1MVHlwZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoamF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBKYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gamF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIgZXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjZXB0aW9uTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChleGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBleGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBzZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyIHJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUm9vdFR5cGVRbmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvb3RUeXBlUW5hbWVBZGFwdGVyKCkgewotCQlpZiAocm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyID0gbmV3IFJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlciB2YXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFyaWFibGVNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl2YXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2V9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIgd3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2V9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMTWVzc2FnZUFkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsTWVzc2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsTWVzc2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBXU0RMTWVzc2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsTWVzc2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcn1pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyIGNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyfS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckFkYXB0ZXIoKSB7Ci0JCWlmIChjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIgPSBuZXcgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50TmFtZUl0ZW1Qcm92aWRlciBlbGVtZW50TmFtZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVsZW1lbnROYW1lQWRhcHRlcigpIHsKLQkJaWYgKGVsZW1lbnROYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVsZW1lbnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IEVsZW1lbnROYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnROYW1lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyIHdzZGxTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMU2VydmljZU5hbWVBZGFwdGVyKCkgewotCQlpZiAod3NkbFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBXU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciBwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZ30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyIHdzZGxQb3J0VHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMUG9ydFR5cGVBZGFwdGVyKCkgewotCQlpZiAod3NkbFBvcnRUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxQb3J0VHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBXU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbFBvcnRUeXBlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMQmluZGluZ0l0ZW1Qcm92aWRlciB3c2RsQmluZGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZ30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExCaW5kaW5nQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxCaW5kaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxCaW5kaW5nSXRlbVByb3ZpZGVyID0gbmV3IFdTRExCaW5kaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxCaW5kaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIgc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb259aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlciB3c2RsT3BlcmF0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExPcGVyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMT3BlcmF0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxPcGVyYXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbE9wZXJhdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBXU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxPcGVyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyIG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmd9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyIHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyIHdzZGxNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMTWVzc2FnZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAod3NkbE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBXU0RMTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIgd3NkbE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VQYXJ0TmFtZUFkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgaW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChpbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBpbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4ODBhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbVBvc2l0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBQb3NpdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbVBvc2l0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19wYXJhbVBvc2l0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3BhcmFtUG9zaXRpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVBvc2l0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfcGFyYW1UeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3BhcmFtVHlwZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYXJhbVBhcnRzTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RQYXJhbVBhcnRzTWFwcGluZykgb2JqZWN0KS5nZXRJZCgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1BBUkFNX1BPU0lUSU9OIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMTWVzc2FnZU1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9QYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9QYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMwNmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYWNrYWdlVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTmFtZXNwYWNlVVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGFja2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFja2FnZSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2VUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9QYWNrYWdlTWFwcGluZ19wYWNrYWdlVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYWNrYWdlTWFwcGluZ19wYWNrYWdlVHlwZV9mZWF0dXJlIiwgIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lc3BhY2UgVVJJIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZVVSSVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfbmFtZXNwYWNlVVJJX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhY2thZ2VNYXBwaW5nX25hbWVzcGFjZVVSSV9mZWF0dXJlIiwgIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQYWNrYWdlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BhY2thZ2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBhY2thZ2VNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1BhY2thZ2VNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUGFja2FnZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTc0YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnR9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFBvcnRDb21wb25lbnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNtYWxsSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlzcGxheU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfUG9ydENvbXBvbmVudF9pZF9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwKLQkgKiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9ydCBDb21wb25lbnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0Q29tcG9uZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9wb3J0Q29tcG9uZW50TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3BvcnRDb21wb25lbnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTbWFsbCBJY29uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNtYWxsSWNvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9zbWFsbEljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9zbWFsbEljb25fZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1NtYWxsSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGFyZ2UgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMYXJnZUljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfbGFyZ2VJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfbGFyZ2VJY29uX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9MYXJnZUljb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEaXNwbGF5IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGlzcGxheU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfZGlzcGxheU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9kaXNwbGF5TmFtZV9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlSW1wbEJlYW4oKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lVHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSWNvblR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0Q29tcG9uZW50LmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7IHJldHVybgotCSAqIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BvcnRDb21wb25lbnQiKTsgfQotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFBvcnRDb21wb25lbnQpb2JqZWN0KS5nZXRQb3J0Q29tcG9uZW50TmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkgKiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSA6IGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0Q29tcG9uZW50LmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9vYmoxNi9wb3J0Y29tcG9uZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydENvbXBvbmVudCkgb2JqZWN0KS5nZXRQb3J0Q29tcG9uZW50TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9ydENvbXBvbmVudC5jbGFzcykpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1BPUlRfQ09NUE9ORU5UX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU01BTExfSUNPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19MQVJHRV9JQ09OIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RJU1BMQVlfTkFNRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19XU0RMX1BPUlQgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fU0VSVklDRV9JTVBMX0JFQU4gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSEFORExFUlMgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fREVTQ1JJUFRJT05fVFlQRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUVfVFlQRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19JQ09OX1RZUEUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExQb3J0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlSW1wbEJlYW4oKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VJbXBsQmVhbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhhbmRsZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWVUeXBlKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWVUeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0NTgwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Qb3J0Q29tcG9uZW50UmVmfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFBvcnRDb21wb25lbnRMaW5rUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgQ29tcG9uZW50IExpbmsgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydENvbXBvbmVudExpbmtQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3BvcnRDb21wb25lbnRMaW5rX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfUG9ydENvbXBvbmVudFJlZl9wb3J0Q29tcG9uZW50TGlua19mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkIAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIGZhbHNlKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydENvbXBvbmVudFJlZi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L3BvcnRjb21wb25lbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChQb3J0Q29tcG9uZW50UmVmKW9iamVjdCkuZ2V0UG9ydENvbXBvbmVudExpbmsoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0KLQkgKiAwID8gZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudFJlZl90eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSArICIgIiArCi0JICogbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvcnRDb21wb25lbnRSZWYpIG9iamVjdCkuZ2V0UG9ydENvbXBvbmVudExpbmsoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnRDb21wb25lbnRSZWYuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTksgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzOTkzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZ30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEphdmFQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydE1hcHBpbmdfcG9ydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydE1hcHBpbmdfcG9ydE5hbWVfZmVhdHVyZSIsICJfVUlfUG9ydE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSmF2YSBQb3J0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0TWFwcGluZ19qYXZhUG9ydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydE1hcHBpbmdfamF2YVBvcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvcnRNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUG9ydE1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydE1hcHBpbmcpIG9iamVjdCkuZ2V0UG9ydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUG9ydE1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3J0TWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX1BPUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19KQVZBX1BPUlRfTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyYTc2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0TmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydE5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJLy9wZ20gYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9Qb3J0TmFtZV9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9Qb3J0TmFtZV9pZF9mZWF0dXJlIiwgIl9VSV9Qb3J0TmFtZV90eXBlIiksIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE5hbWVfSWQoKSwKLQkgKiB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydE5hbWVfcG9ydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydE5hbWVfcG9ydE5hbWVfZmVhdHVyZSIsICJfVUlfUG9ydE5hbWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnROYW1lX1BvcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvcnROYW1lLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUG9ydE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChQb3J0TmFtZSlvYmplY3QpLmdldFBvcnROYW1lKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BvcnROYW1lX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfUG9ydE5hbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQb3J0TmFtZSkgb2JqZWN0KS5nZXRQb3J0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1BvcnROYW1lX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9ydE5hbWUuY2xhc3MpKSB7Ci0JCQkvL3BnbSBjYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX0lEOgotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19QT1JUX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7IHJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7IH0KLQkgKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1Jvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWEwNmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvb3RUeXBlUW5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb290VHlwZVFuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvb3RUeXBlUW5hbWUpIG9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9vdFR5cGVRbmFtZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Jvb3RUeXBlUW5hbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxMzAzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXJ9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU09BUEhlYWRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNPQVBIZWFkZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TT0FQSGVhZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFNPQVBIZWFkZXIpb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCSAqIGdldFN0cmluZygiX1VJX1NPQVBIZWFkZXJfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfU09BUEhlYWRlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKSBvYmplY3Q7Ci0JCVN0cmluZyBuc1VSSSA9IHNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVN0cmluZyBsb2NhbHBhcnQgPSBzb2FwSGVhZGVyLmdldExvY2FsUGFydCgpOwotCQlpZiAobnNVUkkgPT0gbnVsbCB8fCBuc1VSSS5sZW5ndGgoKSA9PSAwIHx8IGxvY2FscGFydCA9PSBudWxsIHx8IGxvY2FscGFydC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9TT0FQSGVhZGVyX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxhYmVsLmFwcGVuZChuc1VSSSk7Ci0JCWxhYmVsLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLmFwcGVuZChsb2NhbHBhcnQpOwotCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiYTM4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU09BUFJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJLy9wZ20gYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvYXBSb2xlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9TT0FQUm9sZV9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9TT0FQUm9sZV9pZF9mZWF0dXJlIiwgIl9VSV9TT0FQUm9sZV90eXBlIiksIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUFJvbGVfSWQoKSwKLQkgKiB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvYXAgUm9sZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwUm9sZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU09BUFJvbGVfc29hcFJvbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU09BUFJvbGVfc29hcFJvbGVfZmVhdHVyZSIsICJfVUlfU09BUFJvbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBSb2xlX1NvYXBSb2xlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNPQVBSb2xlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU09BUFJvbGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChTT0FQUm9sZSlvYmplY3QpLmdldElkKCk7IHJldHVybgotCSAqIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NPQVBSb2xlX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfU09BUFJvbGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNPQVBSb2xlKSBvYmplY3QpLmdldFNvYXBSb2xlKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfU09BUFJvbGVfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTT0FQUm9sZS5jbGFzcykpIHsKLQkJCS8vcGdtIGNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fSUQ6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX1JPTEVfX1NPQVBfUk9MRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsgcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsgfQotCSAqLwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZWN0aW9uQ29tcG9uZW50U2NvcGVkUmVmSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDJjOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZWN0aW9uQ29tcG9uZW50U2NvcGVkUmVmSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlc0NsaWVudCB3c0NsaWVudDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXc0NsaWVudChXZWJTZXJ2aWNlc0NsaWVudCBjbGllbnQpIHsKLQkJd3NDbGllbnQgPSBjbGllbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlc0NsaWVudCBnZXRXc0NsaWVudCgpIHsKLQkJcmV0dXJuIHdzQ2xpZW50OwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjMTcyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmd9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydFR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETEJpbmRpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZjMTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRKYXZhTWV0aG9kTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE9wZXJhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3JhcHBlZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEphdmEgTWV0aG9kIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YU1ldGhvZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfamF2YU1ldGhvZE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19qYXZhTWV0aG9kTmFtZV9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19KYXZhTWV0aG9kTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBPcGVyYXRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE9wZXJhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ193c2RsT3BlcmF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfd3NkbE9wZXJhdGlvbl9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsT3BlcmF0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXcmFwcGVkIEVsZW1lbnQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3JhcHBlZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfd3JhcHBlZEVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ193cmFwcGVkRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19XcmFwcGVkRWxlbWVudCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbFJldHVyblZhbHVlTWFwcGluZygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcpIG9iamVjdCkuZ2V0SmF2YU1ldGhvZE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSkFWQV9NRVRIT0RfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9PUEVSQVRJT04gOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dSQVBQRURfRUxFTUVOVCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdTIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFJldHVyblZhbHVlTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxODFlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW59Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW1wbEJlYW5faWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfU2VydmljZUltcGxCZWFuX2lkX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlIiksCi0JICogV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlSW1wbEJlYW4uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9zcnZjZV9lbGVtX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlSW1wbEJlYW4pb2JqZWN0KS5nZXRJZCgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW1wbEJlYW5fdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW1wbEJlYW5fdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTZXJ2aWNlSW1wbEJlYW4gc2VydmljZUltcGxCZWFuID0gKFNlcnZpY2VJbXBsQmVhbikgb2JqZWN0OwotCQlTdHJpbmcgZWpiTGluayA9IHNlcnZpY2VJbXBsQmVhbi5nZXRFRUpCTGluaygpLmdldEVqYkxpbmsoKTsKLQkJaWYgKGVqYkxpbmsgIT0gbnVsbCAmJiBlamJMaW5rLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBlamJMaW5rOwotCQlTdHJpbmcgYmVhbkxpbmsgPSBzZXJ2aWNlSW1wbEJlYW4uZ2V0QmVhbkxpbmsoKS50b1N0cmluZygpOwotCQlpZiAoYmVhbkxpbmsgIT0gbnVsbCAmJiBiZWFuTGluay5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gYmVhbkxpbms7Ci0JCVN0cmluZyBzZXJ2bGV0TGluayA9IHNlcnZpY2VJbXBsQmVhbi5nZXRFU2VydmxldExpbmsoKS5nZXRTZXJ2bGV0TGluaygpOwotCQlpZiAoc2VydmxldExpbmsgIT0gbnVsbCAmJiBzZXJ2bGV0TGluay5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc2VydmxldExpbms7Ci0JCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfU2VydmljZUltcGxCZWFuX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlSW1wbEJlYW4uY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTksgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRVNFUlZMRVRfTElOSyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19CRUFOX0xJTksgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FRUpCTGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRMaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCZWFuTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldExpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVKQkxpbmsoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHF1YWxpZnkgPSBmZWF0dXJlID09IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRVNlcnZsZXRMaW5rKCkgfHwgZmVhdHVyZSA9PSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCkgfHwgZmVhdHVyZSA9PSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCk7Ci0JCXJldHVybiBnZXRTdHJpbmcocXVhbGlmeSA/ICJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiIDogIl9VSV9DcmVhdGVDaGlsZF90ZXh0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCW5ldyBPYmplY3RbXXtnZXRUeXBlVGV4dChjaGlsZCksIGdldEZlYXR1cmVUZXh0KGZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcil9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMjI0YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUludGVyZmFjZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VydmljZUludGVyZmFjZU1hcHBpbmcpIG9iamVjdCkuZ2V0SWQoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMU2VydmljZU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0TWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODlhZGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgU2VydmljZVJlZkl0ZW1Qcm92aWRlciB7Ci0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFNlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGFyZzApIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFmOWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5TZXJ2aWNlUmVmfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZVJlZkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZXJ2aWNlUmVmTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEpheHJwY01hcHBpbmdGaWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIFJlZiBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VSZWZOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9zZXJ2aWNlUmVmTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfc2VydmljZVJlZk5hbWVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3dzZGxGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl93c2RsRmlsZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXhycGMgTWFwcGluZyBGaWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEpheHJwY01hcHBpbmdGaWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9qYXhycGNNYXBwaW5nRmlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfamF4cnBjTWFwcGluZ0ZpbGVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCksIGZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfc2VydmljZUludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfc2VydmljZUludGVyZmFjZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpLCBmYWxzZSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJLy9jaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0hhbmRsZXJzKCkpOwotCQkJLy9jaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlUmVmLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvc2VydmljZXJlZi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFNlcnZpY2VSZWYpb2JqZWN0KS5nZXRTZXJ2aWNlUmVmTmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkgKiBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlUmVmX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX1NlcnZpY2VSZWZfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlcnZpY2VSZWYpIG9iamVjdCkuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJcmV0dXJuICJTZXJ2aWNlUmVmICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VSZWYuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRSA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fV1NETF9GSUxFIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19KQVhSUENfTUFQUElOR19GSUxFIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUyA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9RTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0Q29tcG9uZW50UmVmKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIYW5kbGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVFOYW1lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETFBvcnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZsZXRMaW5rSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZsZXRMaW5rSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YWM2YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2bGV0TGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldExpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTZXJ2bGV0TGlua1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmxldExpbmtfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfU2VydmxldExpbmtfaWRfZmVhdHVyZSIsICJfVUlfU2VydmxldExpbmtfdHlwZSIpLAotCSAqIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0TGlua19JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmxldCBMaW5rIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZsZXRMaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2bGV0TGlua19zZXJ2bGV0TGlua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2bGV0TGlua19zZXJ2bGV0TGlua19mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0TGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2bGV0TGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChTZXJ2bGV0TGluaylvYmplY3QpLmdldElkKCk7IHJldHVybgotCSAqIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmxldExpbmtfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlcnZsZXRMaW5rKSBvYmplY3QpLmdldFNlcnZsZXRMaW5rKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfU2VydmxldExpbmtfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldExpbmsuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1ZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9WYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczNjJlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1ZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5WYXJpYWJsZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRKYXZhVmFyaWFibGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRYbWxFbGVtZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGF0YU1lbWJlclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkWG1sQXR0cmlidXRlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkWG1sV2lsZGNhcmRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFibGVNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSmF2YSBWYXJpYWJsZSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFWYXJpYWJsZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ19qYXZhVmFyaWFibGVOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ19qYXZhVmFyaWFibGVOYW1lX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19KYXZhVmFyaWFibGVOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBYbWwgRWxlbWVudCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfeG1sRWxlbWVudE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEVsZW1lbnROYW1lX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19YbWxFbGVtZW50TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGF0YSBNZW1iZXIgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGF0YU1lbWJlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX2RhdGFNZW1iZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFibGVNYXBwaW5nX2RhdGFNZW1iZXJfZmVhdHVyZSIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX0RhdGFNZW1iZXIoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFhtbCBBdHRyaWJ1dGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxBdHRyaWJ1dGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfeG1sQXR0cmlidXRlTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfeG1sQXR0cmlidXRlTmFtZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sQXR0cmlidXRlTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWG1sIFdpbGRjYXJkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFhtbFdpbGRjYXJkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfeG1sV2lsZGNhcmRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3htbFdpbGRjYXJkX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19YbWxXaWxkY2FyZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBWYXJpYWJsZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9WYXJpYWJsZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVmFyaWFibGVNYXBwaW5nKSBvYmplY3QpLmdldEphdmFWYXJpYWJsZU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFZhcmlhYmxlTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSkFWQV9WQVJJQUJMRV9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfRUxFTUVOVF9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19EQVRBX01FTUJFUiA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0FUVFJJQlVURV9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19YTUxfV0lMRENBUkQgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExCaW5kaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExCaW5kaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWYxOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMQmluZGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZ30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExCaW5kaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMQmluZGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExCaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExCaW5kaW5nKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExCaW5kaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETEJpbmRpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU0MGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2V9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExNZXNzYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE1lc3NhZ2UuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMTWVzc2FnZSkgb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODU1ZDFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFyYW1ldGVyTW9kZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU29hcEhlYWRlclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIE1lc3NhZ2UgUGFydCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbWV0ZXIgTW9kZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbWV0ZXJNb2RlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfcGFyYW1ldGVyTW9kZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfcGFyYW1ldGVyTW9kZV9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfUGFyYW1ldGVyTW9kZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBIZWFkZXIgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEhlYWRlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3NvYXBIZWFkZXJfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3NvYXBIZWFkZXJfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1NvYXBIZWFkZXIoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExNZXNzYWdlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExNZXNzYWdlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMTWVzc2FnZU1hcHBpbmcpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19QQVJBTUVURVJfTU9ERSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1NPQVBfSEVBREVSIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMTWVzc2FnZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2I4YjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV9pZF9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBNZXNzYWdlIFBhcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV93c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE1lc3NhZ2VQYXJ0TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExNZXNzYWdlUGFydE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETE1lc3NhZ2VQYXJ0TmFtZSkgb2JqZWN0KS5nZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExNZXNzYWdlUGFydE5hbWUuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmYyZTg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9uOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9ufQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE9wZXJhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExPcGVyYXRpb25faWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE9wZXJhdGlvbl9pZF9mZWF0dXJlIiwgIl9VSV9XU0RMT3BlcmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE9wZXJhdGlvbl9JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBPcGVyYXRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE9wZXJhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE9wZXJhdGlvbl93c2RsT3BlcmF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExPcGVyYXRpb25fd3NkbE9wZXJhdGlvbl9mZWF0dXJlIiwgIl9VSV9XU0RMT3BlcmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE9wZXJhdGlvbl9Xc2RsT3BlcmF0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExPcGVyYXRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMT3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExPcGVyYXRpb24pIG9iamVjdCkuZ2V0SWQoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExPcGVyYXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMT3BlcmF0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV1NETE9wZXJhdGlvbi5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfT1BFUkFUSU9OX19XU0RMX09QRVJBVElPTiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlOTQzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydH1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFBvcnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMUG9ydEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExQb3J0LmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi93c2RsLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFdTRExQb3J0KW9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydF90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1dTRExQb3J0X3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJV1NETFBvcnQgd3NkbHBvcnQgPSAoV1NETFBvcnQpIG9iamVjdDsKLQkJU3RyaW5nIG5zVVJJID0gd3NkbHBvcnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVN0cmluZyBsb2NhbHBhcnQgPSB3c2RscG9ydC5nZXRMb2NhbFBhcnQoKTsKLQkJaWYgKG5zVVJJID09IG51bGwgfHwgbnNVUkkubGVuZ3RoKCkgPT0gMCB8fCBsb2NhbHBhcnQgPT0gbnVsbCB8fCBsb2NhbHBhcnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfV1NETFBvcnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbGFiZWwuYXBwZW5kKG5zVVJJKTsKLQkJbGFiZWwuYXBwZW5kKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuYXBwZW5kKGxvY2FscGFydCk7Ci0JCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTcxN2I2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMUG9ydFR5cGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMUG9ydFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETFBvcnRUeXBlKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExQb3J0VHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExQb3J0VHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2QzNjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUmV0dXJuVmFsdWVNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNZXRob2RSZXR1cm5WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFJldHVybiBWYWx1ZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2RSZXR1cm5WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ19tZXRob2RSZXR1cm5WYWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX21ldGhvZFJldHVyblZhbHVlX2ZlYXR1cmUiLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX01ldGhvZFJldHVyblZhbHVlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIE1lc3NhZ2UgUGFydCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2VQYXJ0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19NRVRIT0RfUkVUVVJOX1ZBTFVFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0VfUEFSVF9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19XU0RMX01FU1NBR0UgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMTWVzc2FnZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmNTAwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExTZXJ2aWNlTmFtZX1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETFNlcnZpY2VOYW1lLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETFNlcnZpY2VOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExTZXJ2aWNlTmFtZSkgb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMU2VydmljZU5hbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMU2VydmljZU5hbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzhiYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9ufW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRKYXhycGNNYXBwaW5nRmlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNtYWxsSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlzcGxheU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9pZF9mZWF0dXJlIiksCi0JICogZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25faWRfZmVhdHVyZSIsCi0JICogIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXhycGMgTWFwcGluZyBGaWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEpheHJwY01hcHBpbmdGaWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25famF4cnBjTWFwcGluZ0ZpbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWUgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl93c2RsRmlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fd3NkbEZpbGVfZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU21hbGwgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9zbWFsbEljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3NtYWxsSWNvbl9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGFyZ2UgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMYXJnZUljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9sYXJnZUljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2xhcmdlSWNvbl9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0xhcmdlSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzcGxheSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2Rpc3BsYXlOYW1lX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4KLQkgKiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XZWJTZXJ2aWNlRGVzY3JpcHRpb24iKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoV2ViU2VydmljZURlc2NyaXB0aW9uKW9iamVjdCkuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fAotCSAqIGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvd2Vic2VydmljZWRlc2MuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRDb21wb25lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTFiOWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudH1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9TZXJ2aWNlUmVmcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdlYlNlcnZpY2VzQ2xpZW50LmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV2ViU2VydmljZXNDbGllbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vcmV0dXJuIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VzQ2xpZW50X3R5cGUiKTsKLQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9XZWJTZXJ2aWNlc0NsaWVudF90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViU2VydmljZXNDbGllbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fU0VSVklDRV9SRUZTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnMoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlUmVmKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGRiMjRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXN9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VzX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1dlYlNlcnZpY2VzX2lkX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VzX3R5cGUiKSwKLQkgKiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2ViU2VydmljZXMuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XZWJTZXJ2aWNlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFdlYlNlcnZpY2VzKW9iamVjdCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZXNfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlc190eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV2ViU2VydmljZXMpIG9iamVjdCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9XZWJTZXJ2aWNlc190eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJTZXJ2aWNlcy5jbGFzcykpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VTX19XRUJfU0VSVklDRV9ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI2NzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBXZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY2xpZW50LnV0aWwuV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVTZXJ2aWNlUmVmQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWVjNTEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwudXRpbC5XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLiBUaGUKLSAqIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8KLSAqIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5TZXJ2aWNlUmVmfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIHNlcnZpY2VSZWZJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuU2VydmljZVJlZn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZVJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyIHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCkgewotCQlpZiAocG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyID0gbmV3IFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LkhhbmRsZXJ9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhhbmRsZXJJdGVtUHJvdmlkZXIgaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5IYW5kbGVyfS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCWlmIChoYW5kbGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWhhbmRsZXJJdGVtUHJvdmlkZXIgPSBuZXcgSGFuZGxlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBoYW5kbGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudH1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciB3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50QWRhcHRlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID0gbmV3IFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc0FkYXB0ZXIoKSB7Ci0JCWlmIChjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFhYjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgV2Vic2VydmljZS1qMmVlIGVkaXQgcGx1Z2luLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiB7Ci0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbigpIHsKLQkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltde30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW4gPC9iPi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4gewotCQkvKioKLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIAotCQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCQkgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGx1Z2luLgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0KLQkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0JCQkvLwotCQkJcGx1Z2luID0gdGhpczsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWU1YzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwudXRpbC5Xc2NvbW1vbkFkYXB0ZXJGYWN0b3J5OwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuIFRoZQotICogYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0bwotICoge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdzY29tbW9uQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIgewotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieQotCSAqIHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW19aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGluaXRQYXJhbUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluaXRQYXJhbUFkYXB0ZXIoKSB7Ci0JCWlmIChpbml0UGFyYW1JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtSXRlbVByb3ZpZGVyID0gbmV3IEluaXRQYXJhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBpbml0UGFyYW1JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTT0FQSGVhZGVySXRlbVByb3ZpZGVyIHNvYXBIZWFkZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKSB7Ci0JCWlmIChzb2FwSGVhZGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNvYXBIZWFkZXJJdGVtUHJvdmlkZXIgPSBuZXcgU09BUEhlYWRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNPQVBSb2xlSXRlbVByb3ZpZGVyIHNvYXBSb2xlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChzb2FwUm9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzb2FwUm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBTT0FQUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzb2FwUm9sZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb3J0TmFtZUl0ZW1Qcm92aWRlciBwb3J0TmFtZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydE5hbWVBZGFwdGVyKCkgewotCQlpZiAocG9ydE5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9ydE5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgUG9ydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydE5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlciBkZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdGlvblR5cGVBZGFwdGVyKCkgewotCQlpZiAoZGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBEZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIgZGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzcGxheU5hbWVUeXBlQWRhcHRlcigpIHsKLQkJaWYgKGRpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxNzExNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndzZGQucHJvdmlkZXIuSGFuZGxlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwudXRpbC5Xc2RkQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuIFRoZQotICogYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0bwotICoge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV3NkZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyIHdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlc30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQWRhcHRlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyID0gbmV3IFdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9ufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50fWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIgcG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRBZGFwdGVyKCkgewotCQlpZiAocG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyID0gbmV3IFBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldTRExQb3J0fWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExQb3J0SXRlbVByb3ZpZGVyIHdzZGxQb3J0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExQb3J0QWRhcHRlcigpIHsKLQkJaWYgKHdzZGxQb3J0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxQb3J0SXRlbVByb3ZpZGVyID0gbmV3IFdTRExQb3J0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxQb3J0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlciBzZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbXBsQmVhbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGlua31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2bGV0TGlua0l0ZW1Qcm92aWRlciBzZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbmt9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0TGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2bGV0TGlua0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2bGV0TGlua0l0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkVKQkxpbmt9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUpCTGlua0l0ZW1Qcm92aWRlciBlamJMaW5rSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChlamJMaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVqYkxpbmtJdGVtUHJvdmlkZXIgPSBuZXcgRUpCTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlamJMaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYW5kbGVySXRlbVByb3ZpZGVyIGhhbmRsZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkhhbmRsZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIYW5kbGVyQWRhcHRlcigpIHsKLQkJaWYgKGhhbmRsZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaGFuZGxlckl0ZW1Qcm92aWRlciA9IG5ldyBIYW5kbGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGhhbmRsZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5CZWFuTGlua31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCZWFuTGlua0l0ZW1Qcm92aWRlciBiZWFuTGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbmt9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCZWFuTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChiZWFuTGlua0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQliZWFuTGlua0l0ZW1Qcm92aWRlciA9IG5ldyBCZWFuTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBiZWFuTGlua0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93c2RkL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dzZGQvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNmNDJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dzZGQvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53c2RkLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLS8qCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBIYW5kbGVySXRlbVByb3ZpZGVyIGluIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIKLSAqIHBhY2thZ2UgYW5kIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgY2xhc3MgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIEhhbmRsZXJJdGVtUHJvdmlkZXIgaW4gCi0gKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyIHBhY2thZ2UuCi0gKi8KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSGFuZGxlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRIYW5kbGVyTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX0hhbmRsZXJfaWRfZmVhdHVyZSIsICJfVUlfSGFuZGxlcl90eXBlIiksIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYW5kbGVyIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlIiwgIl9VSV9IYW5kbGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlIiwgIl9VSV9IYW5kbGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcFJvbGVzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBIYW5kbGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7IHJldHVybgotCSAqIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0hhbmRsZXIiKTsgfQotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChIYW5kbGVyKW9iamVjdCkuZ2V0RGlzcGxheU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX0hhbmRsZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSGFuZGxlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvaGFuZGxlci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEhhbmRsZXIpIG9iamVjdCkuZ2V0SGFuZGxlck5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9IYW5kbGVyX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEhhbmRsZXIuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRSA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfQ0xBU1MgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfSEVBREVSUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX1NPQVBfUk9MRVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSW5pdFBhcmFtcygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRQYXJhbSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQUm9sZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0NTZkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3RhdGljX3dlYl91aSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTIxZTUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXVpLmphcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODU4ZjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODFmODY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFNpbXBsZSBXZWIgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndlYi51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC43LjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHVpLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC5XU1RXZWJVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLAotIG9yZy5lY2xpcHNlLndzdC53ZWIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2N2U5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLnVpLmphciA9IHN0YXRpY193ZWJfdWkvCi1vdXRwdXQudWkuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB1aS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3ZWJwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1NmIzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjYwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9pY29ucy9mdWxsL292cjE2L3dlYl9tb2R1bGVfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlOTYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjNjhiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDdjOGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuCi0jIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLQotU3RhdGljV2ViUHJvamVjdC5uYW1lPVN0YXRpYyBXZWIgUHJvamVjdAotU3RhdGljV2ViUHJvamVjdC5kZXNjcmlwdGlvbj1DcmVhdGUgYSBXZWIgcHJvamVjdCBmb3Igc3RhdGljIGNvbnRlbnQgKEhUTUwgZmlsZXMpIG9ubHkKLQotU3RhdGljV2ViU2V0dGluZ3M9U2ltcGxlIFdlYgotV2ViUHJvamVjdEZlYXR1cmVzLm5hbWU9V2ViIFByb2plY3QgRmVhdHVyZXMKLXdlYi5jYXRlZ29yeV91aV89V2ViCi1TdGF0aWNXZWJNb2R1bGUubmFtZT1TaW1wbGUgV2ViIE1vZHVsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTZhNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8IS0tIHN0YXRpYyB3ZWIgcHJvamVjdCB3aXphcmQgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIld2ViLmNhdGVnb3J5X3VpXyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlU3RhdGljV2ViUHJvamVjdC5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dlYnByal93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLlNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uV2l6YXJkIgotICAgICAgICAgICAgcHJvamVjdD0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb24iPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVN0YXRpY1dlYlByb2plY3QuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4gLS0+Ci0gICA8IS0tIGFkZCBpbiB0aGUgZmVhdHVyZXMgcGFnZSAKLSAgIAk8ZXh0ZW5zaW9uCi0gICAJCWlkPSJjb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLldlYlByb2plY3RGZWF0dXJlc1dpemFyZFBhZ2UiCi0gICAgICAgIG5hbWU9IiVXZWJQcm9qZWN0RmVhdHVyZXMubmFtZSIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53aXphcmRQYWdlR3JvdXAiPgotICAgICAgCTx3aXphcmRQYWdlR3JvdXAKLSAgICAgICAgCXBhZ2VHcm91cElEPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuV2ViUHJvamVjdEZlYXR1cmVzV2l6YXJkUGFnZSIKLSAgICAgICAgICAgIHdpemFyZElEPSJjb20uaWJtLmV0b29scy53ZWJ0b29scy5TdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb24iPgotICAgICAgICAJPGZhY3RvcnkKLSAgICAgICAgICAgIAljbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5XZWJQcm9qZWN0RmVhdHVyZXNXaXphcmRQYWdlRmFjdG9yeSI+Ci0gICAgICAgICAJPC9mYWN0b3J5PgotICAgICAgCTwvd2l6YXJkUGFnZUdyb3VwPgotICAgCTwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gPCEtLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVN0YXRpY1dlYlNldHRpbmdzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5TaW1wbGVXZWJTZXR0aW5nc1Byb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IlN0YXRpY1dlYlNldHRpbmdzUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53ZWIuU3RhdGljV2ViTmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVXZWJQcm9qZWN0RmVhdHVyZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJjb20uaWJtLml0cC53dC51aS5XZWJGZWF0dXJlc1Byb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IldlYkZlYXR1cmVzUHJvcGVydGllc1BhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53ZWIuU3RhdGljV2ViTmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPiAKLSAgIDwvZXh0ZW5zaW9uPiAKLSAgIC0tPgotICAgCi0gICA8IS0tIHRoZSBmb2xsb3dpbmcgMiBhcmUgbmVlZGVkIHRvIGFkZCBhbiBpbWFnZSBmb3IgU1dQcyBpbnRvIHRoZSAiQWRkL1JlbW92ZSBQcm9qZWN0IiBkaWFsb2cgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZVR5cGVzIj4KLQkJPG1vZHVsZVR5cGUKLQkJCWlkPSJ3ZWIuc3RhdGljIgotCQkJbmFtZT0iJVN0YXRpY1dlYk1vZHVsZS5uYW1lIi8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotCQk8aW1hZ2UKLQkJCWlkPSJjb20uaWJtLnd0cC53ZWIuc3RhdGljIgotCQkJdHlwZUlkcz0id2ViLnN0YXRpYyIKLQkJCWljb249Imljb25zL2Z1bGwvb2JqMTYvd2ViX2FwcGxpY2F0aW9uLmdpZiIvPgotCTwvZXh0ZW5zaW9uPgotCQotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLnVpLnByb2plY3ROYXR1cmVJbWFnZXMgICAgLS0+Ci08IS0tIFB1cnBvc2U6IEF0dGFjaCBpY29uIG92ZXJsYXlzIGZvciBKMkVFIHByb2plY3QgbmF0dXJlcyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5wcm9qZWN0TmF0dXJlSW1hZ2VzIj4KLSAgICAgIDxpbWFnZQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYiCi0gICAgICAgICAgICBuYXR1cmVJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi5TdGF0aWNXZWJOYXR1cmUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuc2ltcGxlV2ViUHJvamVjdE5hdHVyZUltYWdlIj4KLSAgICAgIDwvaW1hZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI1NTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvV1NUV2ViUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBXU1RXZWJQcmVmZXJlbmNlcyB7Ci0JcHVibGljIGludGVyZmFjZSBLZXlzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5zdGF0aWNXZWJDb250ZW50TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIGludGVyZmFjZSBWYWx1ZXMgewotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRJQ19XRUJfQ09OVEVOVCA9ICJXZWJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSBWYWx1ZXMuU1RBVElDX1dFQl9DT05URU5UOwotCX0KLQlwcml2YXRlIFBsdWdpbiBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHBlcnNpc3RPbkNoYW5nZSA9IGZhbHNlOwotCi0JcHVibGljIFdTVFdlYlByZWZlcmVuY2VzKFBsdWdpbiBvd25lcikgewotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCwgRGVmYXVsdHMuU1RBVElDX1dFQl9DT05URU5UKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRpY1dlYkNvbnRlbnRGb2xkZXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXRpY1dlYkNvbnRlbnRGb2xkZXJOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEtleXMuU1RBVElDX1dFQl9DT05URU5ULCB2YWx1ZSk7Ci0JCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpIHsKLQkJaWYgKGlzUGVyc2lzdE9uQ2hhbmdlKCkpCi0JCQlwZXJzaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyc2lzdCgpIHsKLQkJZ2V0T3duZXIoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBlcnNpc3RPbkNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RPbkNoYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdE9uQ2hhbmdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwZXJzaXN0T25DaGFuZ2UKLQkgKiAgICAgICAgICAgIFRoZSBwZXJzaXN0T25DaGFuZ2UgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3RPbkNoYW5nZShib29sZWFuIHBlcnNpc3RPbkNoYW5nZSkgewotCQl0aGlzLnBlcnNpc3RPbkNoYW5nZSA9IHBlcnNpc3RPbkNoYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5wcmVmZXJlbmNlcyA9IGdldE93bmVyKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvd25lci4KLQkgKi8KLQlwcml2YXRlIFBsdWdpbiBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC9XU1RXZWJVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODAxMTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvV1NUV2ViVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdTVFdlYlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXU1RXZWJVSVBsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJQ09OX0RJUlMgPSBuZXcgU3RyaW5nW117Imljb25zL2Z1bGwvb2JqMTYiLCAvLyROT04tTkxTLTEkCi0JCSJpY29ucy9mdWxsL2N0b29sMTYiLCAvLyROT04tTkxTLTEkCi0JCSJpY29ucy9mdWxsL3dpemJhbiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zIiwgLy8kTk9OLU5MUy0xJAotCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1NUV2ViVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCVVSTCBnaWZJbWFnZVVSTCA9IGdldEltYWdlVVJMKGtleSwgZ2V0QnVuZGxlKCkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0SW1hZ2VVUkwoU3RyaW5nIGtleSwgQnVuZGxlIGJ1bmRsZSkgewotCQlTdHJpbmcgZ2lmID0gIi8iICsga2V5ICsgIi5naWYiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgSUNPTl9ESVJTLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoSUNPTl9ESVJTW2ldKS5hcHBlbmQoZ2lmKTsKLQkJCWlmIChidW5kbGUuZ2V0RW50cnkocGF0aC50b1N0cmluZygpKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKCJMb2FkX0ltYWdlX0Vycm9yXyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTVFdlYlVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvU2ltcGxlQ29udGV4dFJvb3RDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVDb250ZXh0Um9vdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjJmY2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVDb250ZXh0Um9vdENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLldlYlByb3BlcnRpZXNVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29udGV4dFJvb3RDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXByb3RlY3RlZCBUZXh0IGNvbnRleHRSb290RmllbGQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQotCS8vIGxpc3RlbmVycyBpbnRlcmVzdGVkIGluIHRoZSBldmVudCB3aGVuIHRoZSBjb250ZXh0IHJvb3QKLQkvLyB2YWx1ZSBpcyBtb2RpZmllZC4KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IG1vZGlmeUxpc3RlbmVyczsKLQotCXByb3RlY3RlZCBMaXN0ZW5lciBjb250ZXh0Um9vdE1vZGlmeUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoY29udGV4dFJvb3RGaWVsZCAhPSBudWxsKQotCQkJCWNvbnRleHRSb290TW9kaWZpZWQoKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgU2ltcGxlQ29udGV4dFJvb3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJY3JlYXRlQ29udHJvbHMoKTsKLQkJbW9kaWZ5TGlzdGVuZXJzID0gbmV3IFZlY3RvcigxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9scygpIHsKLQkJLy8gY29udGFpbmVyIHNwZWNpZmljYXRpb24gZ3JvdXAKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBOZXcgQ29udGV4dCBSb290IExhYmVsCi0JCUxhYmVsIGNvbnRleHRSb290TGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkNIRUNLKTsKLQkJY29udGV4dFJvb3RMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YXRpY0NvbnRleHRSb290Q29tcG9zaXRlLkNvbnRleHRfUm9vdF9MYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIE5ldyBDb250ZXh0IFJvb3QgRW50cnlmaWVsZAotCQljb250ZXh0Um9vdEZpZWxkID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29udGV4dFJvb3RGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbnRleHRSb290RmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgY29udGV4dFJvb3RNb2RpZnlMaXN0ZW5lcik7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KCkgewotCQlyZXR1cm4gY29udGV4dFJvb3RGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKGNvbnRleHRSb290RmllbGQgIT0gbnVsbCkKLQkJCWNvbnRleHRSb290RmllbGQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250ZXh0Um9vdE1vZGlmaWVkKCkgewotCQllcnJvck1lc3NhZ2UgPSBXZWJQcm9wZXJ0aWVzVXRpbC52YWxpZGF0ZUNvbnRleHRSb290KGdldENvbnRleHRSb290KCkpOwotCQkvLyBub3RpZnkgbGlzdGVuZXJzCi0JCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQkJZS50eXBlID0gU1dULk1vZGlmeTsKLQkJZS53aWRnZXQgPSBjb250ZXh0Um9vdEZpZWxkOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGlmeUxpc3RlbmVycy5zaXplKCk7IGkrKykgewotCQkJKChMaXN0ZW5lcikgbW9kaWZ5TGlzdGVuZXJzLmdldChpKSkuaGFuZGxlRXZlbnQoZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0Um9vdChTdHJpbmcgY3IpIHsKLQkJY29udGV4dFJvb3RGaWVsZC5zZXRUZXh0KGNyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBhIGRlZmF1bHQgY29udGV4dCByb290IHZhbGlkYXRpb24gbGlzdGVuZXIgcHJvdmlkZWQgYnkgdGhlCi0JICogY29tcG9zaXRlLCBhZGRpbmcgZXh0ZXJuYWwgbGlzdGVuZXJzIHdpbGwgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihMaXN0ZW5lciBsKSB7Ci0JCW1vZGlmeUxpc3RlbmVycy5hZGQobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTGlzdGVuZXIgbCkgewotCQltb2RpZnlMaXN0ZW5lcnMucmVtb3ZlKGwpOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb250ZXh0IHJvb3QgdmFsdWUgYW5kIHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotCQlyZXR1cm4gY29udGV4dFJvb3RGaWVsZC5zZXRGb2N1cygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIudWkvc3RhdGljX3dlYl91aS9vcmcvZWNsaXBzZS93c3Qvd2ViL3VpL2ludGVybmFsL3dpemFyZHMvU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ3ZWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbi5TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwuV1NUV2ViVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbldpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCBpbXBsZW1lbnRzIElFeGVjdXRhYmxlRXh0ZW5zaW9uLCBJTmV3V2l6YXJkIHsKLQotCXB1YmxpYyBTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIFNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uV2l6YXJkKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7Ci0gICAgfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBTaW1wbGVXZWJNb2R1bGVXaXphcmRCYXNlUGFnZShnZXREYXRhTW9kZWwoKSwgInBhZ2UxIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7ICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YXRpY1dlYlByb2plY3RDcmVhdGlvbldpemFyZC5XaXphcmRfVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoV1NUV2ViVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigibmV3d3Byal93aXoiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLS8vCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotLy8JCUlXaXphcmRSZWdpc3RyeSBuZXdXaXphcmRSZWdpc3RyeSA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TmV3V2l6YXJkUmVnaXN0cnkoKTsJCQotLy8JCQotLy8JCUlXaXphcmREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXdXaXphcmRSZWdpc3RyeS5maW5kV2l6YXJkKGdldFdpemFyZElEKCkpOwotLy8KLS8vCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya2JlbmNoV2l6YXJkRWxlbWVudCkKLS8vCQkJQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQudXBkYXRlUGVyc3BlY3RpdmUoKChXb3JrYmVuY2hXaXphcmRFbGVtZW50KWRlc2NyaXB0b3IpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkpOwotLy8JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gV1NUV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gKChTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCkgbW9kZWwpLmdldFRhcmdldFByb2plY3QoKTsKLS8vCQlCYXNpY05ld1Jlc291cmNlV2l6YXJkLnNlbGVjdEFuZFJldmVhbChwcm9qZWN0LCB3aW5kb3cpOwotLy8JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi51aS9zdGF0aWNfd2ViX3VpL29yZy9lY2xpcHNlL3dzdC93ZWIvdWkvaW50ZXJuYWwvd2l6YXJkcy9TaW1wbGVXZWJNb2R1bGVXaXphcmRCYXNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYk1vZHVsZVdpemFyZEJhc2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Yjk4YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpL3N0YXRpY193ZWJfdWkvb3JnL2VjbGlwc2Uvd3N0L3dlYi91aS9pbnRlcm5hbC93aXphcmRzL1NpbXBsZVdlYk1vZHVsZVdpemFyZEJhc2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLk5ld1Byb2plY3RHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5XU1RXZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5vcGVyYXRpb24uSVNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLQotY2xhc3MgU2ltcGxlV2ViTW9kdWxlV2l6YXJkQmFzZVBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIGltcGxlbWVudHMgSVNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllc3sKLQlwcm90ZWN0ZWQgTmV3UHJvamVjdEdyb3VwIHByb2plY3ROYW1lR3JvdXA7Ci0JcHVibGljIFRleHQgcHJvamVjdE5hbWVGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbG9jYXRpb25QYXRoRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsKLQkvLwljb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JLy8JZGVmYXVsdCB2YWx1ZXMKLQlwcml2YXRlIFN0cmluZyBkZWZQcm9qZWN0TmFtZUxhYmVsID0gV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJOYW1lXyIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkJyb3dzZV8iKTsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZkRpckRpYWxvZ0xhYmVsID0gIkRpcmVjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTaW1wbGVXZWJNb2R1bGVXaXphcmRCYXNlUGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2UuUGFnZV9EZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2UuUGFnZV9UaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihXU1RXZWJQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0IGhhcwotCQkJLy8gc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde1BST0pFQ1RfTkFNRX07Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgdG9wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJdG9wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdG9wLnNldERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnVpbGRDb21wb3NpdGVzKGNvbXBvc2l0ZSk7Ci0JCUNvbXBvc2l0ZSBkZXRhaWwgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotCQlkZXRhaWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkZXRhaWwuc2V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0b3AsICJjb20uaWJtLmV0b29scy53ZWJ0b29scy53aXphcmRzLmJhc2ljLndlYncxNDUwIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRvcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHdpdGhpbiB0aGlzIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAocGFyZW50KTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLwkJc2V0IHVwIGxvY2F0aW9uIHBhdGggbGFiZWwKLQkJTGFiZWwgbG9jYXRpb25QYXRoTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uUGF0aExhYmVsLnNldFRleHQoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9qZWN0X2xvY2F0aW9uXyIpKTsvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbG9jYXRpb25QYXRoTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy8gc2V0IHVwIGxvY2F0aW9uIHBhdGggZW50cnkgZmllbGQKLQkJbG9jYXRpb25QYXRoRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgYnJvd3NlIGJ1dHRvbgotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGxvY2F0aW9uUGF0aEZpZWxkLCBMT0NBVElPTiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgYnJvd3NlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxvY2F0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cobG9jYXRpb25QYXRoRmllbGQuZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKGRlZkRpckRpYWxvZ0xhYmVsKTsKLQkJU3RyaW5nIGRpck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShMT0NBVElPTik7Ci0JCWlmICgoZGlyTmFtZSAhPSBudWxsKSAmJiAoZGlyTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkgewotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShMT0NBVElPTiwgc2VsZWN0ZWREaXJlY3RvcnkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gc2V0IHVwIHByb2plY3QgbmFtZSBsYWJlbAotCQlMYWJlbCBwcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoZGVmUHJvamVjdE5hbWVMYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1RFWFRfRklFTERfV0lEVEg7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvLyBwYWQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3ROYW1lRmllbGQsIFBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtwcm9qZWN0TmFtZUxhYmVsfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTVlMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InN0YXRpY193ZWJfcHJvamVjdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzA3MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotcnVudGltZQotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg2NTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzczNDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFNpbXBsZSBXZWIgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndlYjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC43LjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHJ1bnRpbWUvc3RhdGljd2ViLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5XU1RXZWJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcywKLSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmJmN2UwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBydW50aW1lL3N0YXRpY3dlYi5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBydW50aW1lL3N0YXRpY3dlYi5qYXIKLXNvdXJjZS5ydW50aW1lL3N0YXRpY3dlYi5qYXIgPSBzdGF0aWNfd2ViX3Byb2plY3QvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC5ydW50aW1lL3N0YXRpY3dlYi5qYXIgPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTIwN2NiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud2ViIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWJfYXBwbGljYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWY2MDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYl9hcHBsaWNhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvaWNvbnMvZnVsbC9vYmoxNi93ZWJzdGF0aWNfZGVwbG95LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzMWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL29iajE2L3dlYnN0YXRpY19kZXBsb3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9pY29ucy9mdWxsL3dpemJhbi9uZXd3cHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzY4YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNDk1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuCi0jIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5Mjc2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVGYWN0b3JpZXMiPgotICAgICAgPG1vZHVsZUZhY3RvcnkKLSAgICAgICAgICAgIHByb2plY3RzPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5zdGF0aWMiPgotICAgICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgIHZlcnNpb25zPSIxLjAsIDEuMiwgMS4zLCAxLjQiCi0gICAgICAgICAgICAgICB0eXBlcz0id2ViLnN0YXRpYyI+Ci0gICAgICAgICA8L21vZHVsZVR5cGU+Ci0gICAgICA8L21vZHVsZUZhY3Rvcnk+Ci0gICAgIDwvZXh0ZW5zaW9uPgotICAgICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiPgotICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViLnNlcnZlci53ZWJzdGF0aWMxIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+ICAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlciIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLklTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdCIvPgotICAgICAgICA8L2ZhY3Rvcnk+ICAgIAotICAgPC9leHRlbnNpb24+IAotICAgCi0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDwhLS0gQnVpbGRlciBQcm92aWRlciByZWdpc3RyYXRpb25zLS0+Ci0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iPgotICAgICAJPFByb3ZpZGVyRGVmaW5lc1R5cGUKLSAgICAgIAkJcHJvdmlkZXJUeXBlPSJ3c3Qud2ViLmJ1aWxkZXIiCi0gICAgICAJCXByb3ZpZGVySUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLldvcmtiZW5jaENvbXBvbmVudEJ1aWxkZXJEYXRhTW9kZWxQcm92aWRlciIvPgotCQk8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbi5TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwub3BlcmF0aW9uLlNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIiLz4KLQk8L2V4dGVuc2lvbj4KLSA8IS0tICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkV4dGVuZGFibGVPcGVyYXRpb24iPgotICAgICAgPGV4dGVuZGFibGVPcGVyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSJjb20uaWJtLnd0cC53ZWIub3BlcmF0aW9ucy5SZW1vdmVTZXJ2bGV0T3BlcmF0aW9uIgotICAgICAgICAgICAgaWQ9ImNvbS5pYm0ud3RwLndlYi5vcGVyYXRpb25zLlJlbW92ZVNlcnZsZXRPcGVyYXRpb24iPgotICAgICAgPC9leHRlbmRhYmxlT3BlcmF0aW9uPgotICAgICAgPGV4dGVuZGFibGVPcGVyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSJjb20uaWJtLnd0cC53ZWIub3BlcmF0aW9ucy5SZW1vdmVXZWJTZWN1cml0eVJvbGVPcGVyYXRpb24iCi0gICAgICAgICAgICBpZD0iY29tLmlibS53dHAud2ViLm9wZXJhdGlvbnMuUmVtb3ZlV2ViU2VjdXJpdHlSb2xlT3BlcmF0aW9uIj4KLSAgICAgIDwvZXh0ZW5kYWJsZU9wZXJhdGlvbj4KLSAgICAgIDxleHRlbmRhYmxlT3BlcmF0aW9uCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuQWRkU2VydmxldE9wZXJhdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5BZGRTZXJ2bGV0T3BlcmF0aW9uIj4KLSAgICAgIDwvZXh0ZW5kYWJsZU9wZXJhdGlvbj4gCi0gICAgIAotICAgPC9leHRlbnNpb24+IC0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcHJvcGVydHlfZmlsZXMvc3RhdGljd2VicHJvamVjdC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3Byb3BlcnR5X2ZpbGVzL3N0YXRpY3dlYnByb2plY3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlMjM5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcHJvcGVydHlfZmlsZXMvc3RhdGljd2VicHJvamVjdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb25XaXphcmQuV2l6YXJkX1RpdGxlPU5ldyBTdGF0aWMgV2ViIFByb2plY3QKLVN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZS5QYWdlX0Rlc2NyaXB0aW9uPUNyZWF0ZSBhIFdlYiBwcm9qZWN0IGZvciBzaW1wbGUgY29udGVudCAoSFRNTCBmaWxlcykgb25seS4KLVN0YXRpY1dlYlNldHRpbmdzUHJvcGVydGllc1BhZ2UuV2ViX0NvbnRlbnRfTGFiZWw9V2ViIGNvbnRlbnQgZm9sZGVyIG5hbWU6Ci1TdGF0aWNDb250ZXh0Um9vdENvbXBvc2l0ZS5Db250ZXh0X1Jvb3RfTGFiZWw9Q29udGV4dCByb290Ci1TdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2UuUGFnZV9UaXRsZT1TdGF0aWMgV2ViIFByb2plY3QKLVN0YXRpY1dlYlNldHRpbmdzUHJvcGVydGllc1BhZ2UuTm90X2F2YWlsYWJsZV9mb3JfY2xvc2VkX3Byb2plY3RzPVdlYiBzZXR0aW5ncyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgYSBjbG9zZWQgcHJvamVjdC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9JU2ltcGxlV2ViTW9kdWxlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvSVNpbXBsZVdlYk1vZHVsZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODZiMDdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9JU2ltcGxlV2ViTW9kdWxlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElTaW1wbGVXZWJNb2R1bGVDb25zdGFudHMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHX0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1BST0pFQ1RfVFlQRSA9ICJTVEFUSUMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RJUkVDVE9SWSA9ICJ0aGVtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0RJUkVDVE9SWSA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfRElSRUNUT1JZID0gImxpYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0VTX0RJUkVDVE9SWSA9ICJjbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9JV1NUV2ViUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9JV1NUV2ViUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0ZTdhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvSVdTVFdlYlByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdTVFdlYlByZWZlcmVuY2VzIHsKLQlTdHJpbmcgUFJFRl9TVEFUSUNXRUJDT05URU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2Uuc3RhdGljV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTA5ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFJlc291cmNlSGFuZGxlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJzdGF0aWN3ZWJwcm9qZWN0IjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIFJlc291cmNlSGFuZGxlcigpIHsKLQkJLy9EZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpCi0JewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRyeQotCQl7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoKCBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSApCi0JCXsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTM5NGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XU1RXZWJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdTVFdlYlBsdWdpbiBleHRlbmRzIFBsdWdpbgotewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXU1RXZWJQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBXU1RXZWJQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAiY29tLmlibS5ldG9vbHMud2VidG9vbHMuc3RhdGljd2VicHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0JVSUxERVJfSUQgPSBWYWxpZGF0aW9uUGx1Z2luLlZBTElEQVRJT05fQlVJTERFUl9JRDsgLy8gcGx1Z2luCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJQ09OX0RJUlMgPSBuZXcgU3RyaW5nW117Imljb25zL2Z1bGwvb2JqMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvY3Rvb2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC93aXpiYW4iLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zIiwgLy8kTk9OLU5MUy0xJAotCQkJCSIifTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1NUV2ViUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTVFdlYlBsdWdpbiBnZXREZWZhdWx0KCkKLQl7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJZ2V0V1NUV2ViUHJlZmVyZW5jZXMoKS5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFdTVFdlYlByZWZlcmVuY2VzIGdldFdTVFdlYlByZWZlcmVuY2VzKCkgewotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5wcmVmZXJlbmNlcyA9IG5ldyBXU1RXZWJQcmVmZXJlbmNlcyh0aGlzKTsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XU1RXZWJQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTI1NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgV1NUV2ViUHJlZmVyZW5jZXMgewotCXB1YmxpYyBpbnRlcmZhY2UgS2V5cyB7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVElDX1dFQl9DT05URU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2Uuc3RhdGljV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVzIHsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSAiV2ViQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIGludGVyZmFjZSBEZWZhdWx0cyB7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVElDX1dFQl9DT05URU5UID0gVmFsdWVzLlNUQVRJQ19XRUJfQ09OVEVOVDsKLQl9Ci0JcHJpdmF0ZSBQbHVnaW4gb3duZXIgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwZXJzaXN0T25DaGFuZ2UgPSBmYWxzZTsKLQkKLQlwdWJsaWMgV1NUV2ViUHJlZmVyZW5jZXMoUGx1Z2luIG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuU1RBVElDX1dFQl9DT05URU5ULCBEZWZhdWx0cy5TVEFUSUNfV0VCX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRpY1dlYkNvbnRlbnRGb2xkZXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdGF0aWNXZWJDb250ZW50Rm9sZGVyTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCwgdmFsdWUpOwotCQlmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCkgewotCQlpZiAoaXNQZXJzaXN0T25DaGFuZ2UoKSkKLQkJCXBlcnNpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJzaXN0KCkgewotCQlnZXRPd25lcigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGVyc2lzdE9uQ2hhbmdlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdE9uQ2hhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0T25DaGFuZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBlcnNpc3RPbkNoYW5nZQotCSAqICAgICAgICAgICAgVGhlIHBlcnNpc3RPbkNoYW5nZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdE9uQ2hhbmdlKGJvb2xlYW4gcGVyc2lzdE9uQ2hhbmdlKSB7Ci0JCXRoaXMucGVyc2lzdE9uQ2hhbmdlID0gcGVyc2lzdE9uQ2hhbmdlOwotCX0KLQotCXByaXZhdGUgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmICh0aGlzLnByZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLnByZWZlcmVuY2VzID0gZ2V0T3duZXIoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdGhpcy5wcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG93bmVyLgotCSAqLwotCXByaXZhdGUgUGx1Z2luIGdldE93bmVyKCkgewotCQlyZXR1cm4gdGhpcy5vd25lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvV2ViUHJvcGVydGllc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNjYzQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJQcm9wZXJ0aWVzVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJBRF9DSEFSUyA9IHsnLycsICdcXCcsICc6J307Ci0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ci0JICovCi0JLyoqCi0JICogUmV0dXJucyBhIGVycm9yIG1lc3NhZ2UgdGhhdCBzdGF0ZXMgd2hldGhlciBhIGNvbnRleHQgcm9vdCBpcyB2YWxpZCBvciBub3QgcmV0dXJucyBudWxsIGlmCi0JICogY29udGV4dCByb290IGlzIGZpbmUKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29udGV4dFJvb3QKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUNvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgewotCi0JCWlmIChjb250ZXh0Um9vdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBjb250ZXh0Um9vdDsKLQkJaWYgKG5hbWUuZXF1YWxzKCIiKSB8fCBuYW1lID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gIHRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkbnQgYmUgc2hvd24gaW5pdGlhbGx5LiBJdCBzaG91bGQgYmUKLQkJCS8vIHNob3duIG9ubHkgaWYgY29udGV4dCByb290IGZpZWxkIGlzIGVkaXRlZCB0bwotCQkJZXJyb3JNZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlLlBhZ2VfVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvL2Vycm9yTWVzc2FnZSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiAvLyBKWiAtIGZpeCB0byBkZWZlY3QgMjA0MjY0LCAiLyIgaXMgdmFsaWQgaW4gY29udGV4dCByb290IGlmIChuYW1lLmluZGV4T2YoIi8vIikgIT0gLTEpIHsKLQkJICogLy8kTk9OLU5MUy0xJCBlcnJvck1lc3NhZ2UgPSAiLy8gYXJlIGludmFsaWQgY2hhcmFjdGVycyBpbiBhIHJlc291cmNlIG5hbWUiOyByZXR1cm4KLQkJICogZXJyb3JNZXNzYWdlOwotCQkgKiAgfQotCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JCWlmIChuYW1lLnRyaW0oKS5lcXVhbHMobmFtZSkpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXRlciA6IHdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmICghKHRva2VuLmNoYXJBdChpKSA9PSAnXycpICYmICEodG9rZW4uY2hhckF0KGkpID09ICctJykgJiYgISh0b2tlbi5jaGFyQXQoaSkgPT0gJy8nKSAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KHRva2VuLmNoYXJBdChpKSkgPT0gZmFsc2UpIHsKLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRva2VuLmNoYXJBdChpKSkpIHsKLQkJCQkJCQkvL1JlbW92ZWQgYmVjYXVzZSBjb250ZXh0IHJvb3RzIGNhbiBjb250YWluIHdoaXRlIHNwYWNlCi0JCQkJCQkJLy9lcnJvck1lc3NhZ2UgPQotCQkJCQkJCS8vCVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9Db250ZXh0X3Jvb3RfY2Fubm90X2NvbnRhX1VJXyIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyA9ICIgQ29udGV4dCByb290IGNhbm5vdCBjb250YWluIHdoaXRlc3BhY2VzLiIKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZXJyb3JNZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlLlBhZ2VfVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQotCQkJCQkJCS8vZXJyb3JNZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QiLCBuZXcgT2JqZWN0W117KG5ldyBDaGFyYWN0ZXIodG9rZW4uY2hhckF0KGkpKSkudG9TdHJpbmcoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW4vIGVuZCBvZiBpZihuYW1lLnRyaW0KLQkJZWxzZQotCQkJZXJyb3JNZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU3RhdGljV2ViUHJvamVjdFdpemFyZEJhc2VQYWdlLlBhZ2VfVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy9lcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk5hbWVzX2Nhbm5vdF9iZWdpbl9vcl9lbmRfd2l0aF93aGl0ZXNwYWNlXzUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGFueSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgYXJyYXkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgc3RyLCBjaGFyW10gY2hhcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHN0ci5pbmRleE9mKGNoYXJzW2ldKSAhPSAtMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUZvbGRlck5hbWUoU3RyaW5nIGZvbGRlck5hbWUpIHsKLQkJaWYgKGZvbGRlck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2UuUGFnZV9UaXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRm9sZGVyX25hbWVfY2Fubm90X2JlX2VtcHR5XzIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb250YWlucyhmb2xkZXJOYW1lLCBCQURfQ0hBUlMpKQotCQkJcmV0dXJuIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZS5QYWdlX1RpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy9yZXR1cm4gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGb2xkZXJfbmFtZV9pc19ub3RfdmFsaWQiLCBuZXcgT2JqZWN0W117Zm9sZGVyTmFtZX0pOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0lTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0lTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWVlNDUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9JU3RhdGljV2ViTW9kdWxlQXJ0aWZhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXRpY1dlYk1vZHVsZUFydGlmYWN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNGZhYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSVN0YXRpY1dlYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljV2ViRGVwbG95YWJsZSBleHRlbmRzIFByb2plY3RNb2R1bGUgaW1wbGVtZW50cyBJU3RhdGljV2ViIHsKLQotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCSAKLQlwdWJsaWMgU3RhdGljV2ViRGVwbG95YWJsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJc3VwZXIocHJvamVjdCk7Ci0JCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLndlYi5kZXBsb3lhYmxlcy5zdGF0aWMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGVwbG95YWJsZSBjdXJyZW50bHkgZXhpc3RzLCBhbmQgZmFsc2UgaWYgaXQgaGFzIGJlZW4gZGVsZXRlZCBvciBtb3ZlZAotCSAqIGFuZCBpcyBubyBsb25nZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZXBsb3lhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsIHx8ICFnZXRQcm9qZWN0KCkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBjb21wb25lbnQuZ2V0TWV0YVByb3BlcnRpZXMoKTsKLQkJaWYocHJvcHMuY29udGFpbnNLZXkoImNvbnRleHQtcm9vdCIpKQotCQkJcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KCJjb250ZXh0LXJvb3QiKTsKLQkJcmV0dXJuIGNvbXBvbmVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlI2dldFJvb3RGb2xkZXIoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSb290Rm9sZGVyKCkgewkJICAgCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCSAgICAgICBpZiAoIE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsICkgeyAgCi0gICAgIAlpZiggY29tcG9uZW50ICE9IG51bGwgKXsKLSAgICAgCQlJRm9sZGVyIG91dHB1dENvbnRhaW5lciA9IFN0cnVjdHVyZUVkaXQuZ2V0T3V0cHV0Q29udGFpbmVyUm9vdChjb21wb25lbnQpOwotICAgICAJCXBhdGggPSBvdXRwdXRDb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotICAgICAJfQotICAgICB9ICAgIAotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAid2ViLnN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiAiMS4wIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlI2dldE1vZHVsZVR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBJTW9kdWxlVHlwZSBnZXRNb2R1bGVUeXBlKCkgewotCQlyZXR1cm4gbmV3IElNb2R1bGVUeXBlKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlVHlwZU5hbWUoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQkJCXJldHVybiBnZXRNb2R1bGVUeXBlVmVyc2lvbigpOwotCQkJfQotCQl9OwotCi0JfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlVHlwZU5hbWUoKXsKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRNb2R1bGVUeXBlVmVyc2lvbigpewotICAgICAgICByZXR1cm4gZ2V0VmVyc2lvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkIG1vZHVsZXMgb2YgdGhpcyBtb2R1bGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVtdCi0gICAgICovCi0gICAgcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCi0vLyAgICAgICAgaWYgKHRoaXMuYXJjaGl2ZXMgIT0gbnVsbCkgewotLy8gICAgICAgICAgICBpbnQgc2l6ZSA9IHRoaXMuYXJjaGl2ZXMubGVuZ3RoOwotLy8gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLS8vICAgICAgICAgICAgICAgIGxpc3QuYWRkKHRoaXMuYXJjaGl2ZXNbaV0pOwotLy8gICAgICAgIH0KLS8vCi0gICAgICAgIElNb2R1bGVbXSBjaGlsZHJlbiA9IG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgbGlzdC50b0FycmF5KGNoaWxkcmVuKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTY4NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFN0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5IGV4dGVuZHMgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuc3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBBcnJheUxpc3QgbW9kdWxlRGVsZWdhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoKLQkgKiBAc2VlIERlcGxveWFibGVQcm9qZWN0RmFjdG9yeURlbGVnYXRlI2dldEZhY3RvcnlJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2plY3QgcmVwcmVzZW50cyBhIGRlcGxveWFibGUgcHJvamVjdCBvZiB0aGlzIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVGYWN0b3J5RGVsZWdhdGUjZ2V0TW9kdWxlRGVsZWdhdGUob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUpCi0JICovCi0JcHVibGljIE1vZHVsZURlbGVnYXRlIGdldE1vZHVsZURlbGVnYXRlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZHVsZURlbGVnYXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1vZHVsZURlbGVnYXRlIGVsZW1lbnQgPSAoTW9kdWxlRGVsZWdhdGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG1vZHVsZSA9PSBlbGVtZW50LmdldE1vZHVsZSgpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldE1vZHVsZXMoKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpIHsKLQkJaWYgKHByb2plY3RzID09IG51bGwgfHwgcHJvamVjdHMuaXNFbXB0eSgpKQotCQkJY2FjaGVNb2R1bGVzKCk7Ci0JCWludCBpID0gMDsKLQkJSXRlcmF0b3IgbW9kdWxlcyA9IHByb2plY3RzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzQXJyYXkgPSBuZXcgSU1vZHVsZVtwcm9qZWN0cy5zaXplKCldOwotCQl3aGlsZSAobW9kdWxlcy5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGUgPSBudWxsOwotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbW9kdWxlcy5uZXh0KCk7Ci0JCQltb2R1bGUgPSAoSU1vZHVsZVtdKXByb2plY3RzLmdldChwcm9qZWN0KTsKLQkJCW1vZHVsZXNBcnJheVtpKytdID0gbW9kdWxlWzBdOwotCQl9Ci0JCXJldHVybiBtb2R1bGVzQXJyYXk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVNb2R1bGVzKE1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBuYXR1cmUuZ2V0UHJvamVjdCgpOwotCQlMaXN0IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KDEpOyAKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJbW9kdWxlcyA9IGNyZWF0ZU1vZHVsZURlbGVnYXRlcyhjb21wb25lbnQpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYobW9kdWxlQ29yZSAhPSBudWxsKSAKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlczsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlTW9kdWxlRGVsZWdhdGVzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdGF0aWNXZWJEZXBsb3lhYmxlIG1vZHVsZURlbGVnYXRlID0gbnVsbDsKLQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOwotCQlMaXN0IG1vZHVsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlpZihJTW9kdWxlQ29uc3RhbnRzLldTVF9XRUJfTU9EVUxFLmVxdWFscyhjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZUlkKCkpKSB7Ci0JCQkJbW9kdWxlRGVsZWdhdGUgPSBuZXcgU3RhdGljV2ViRGVwbG95YWJsZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLGNvbXBvbmVudCk7Ci0JCQkJbW9kdWxlID0gY3JlYXRlTW9kdWxlKGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXROYW1lKCksIG1vZHVsZURlbGVnYXRlLmdldFR5cGUoKSwgbW9kdWxlRGVsZWdhdGUuZ2V0VmVyc2lvbigpLCBtb2R1bGVEZWxlZ2F0ZS5nZXRQcm9qZWN0KCkpOwotCQkJCW1vZHVsZUxpc3QuYWRkKG1vZHVsZSk7Ci0JCQkJbW9kdWxlRGVsZWdhdGUuaW5pdGlhbGl6ZShtb2R1bGUpOwotCQkJfQotCQkJLy8gYWRhcHQobW9kdWxlRGVsZWdhdGUsIChXb3JrYmVuY2hDb21wb25lbnQpIHdvcmtCZW5jaE1vZHVsZXMuZ2V0KGkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS53cml0ZShlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJCWlmIChnZXRNb2R1bGVEZWxlZ2F0ZShtb2R1bGUpID09IG51bGwpCi0JCQkJCW1vZHVsZURlbGVnYXRlcy5hZGQobW9kdWxlRGVsZWdhdGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVMaXN0OwotCi0JfQotCQotCXByb3RlY3RlZCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLQkJLy8gTGlzdCBtb2R1bGVzID0gY3JlYXRlTW9kdWxlcyhuYXR1cmUpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluYXR1cmUgPSAoTW9kdWxlQ29yZU5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUoSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7Ci0JCX0KLQkJaWYobmF0dXJlID09IG51bGwpIHJldHVybiBuZXcgSU1vZHVsZVswXTsKLQkJTGlzdCBtb2R1bGVzID0gY3JlYXRlTW9kdWxlcyhuYXR1cmUpOwotCQlpZiAobW9kdWxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCQlJTW9kdWxlW10gbW9kdWxlQXJyYXkgPSBuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV07Ci0JCW1vZHVsZXMudG9BcnJheShtb2R1bGVBcnJheSk7Ci0JCXJldHVybiBtb2R1bGVBcnJheTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxNGY4MGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotCi17Ci0KLQlwdWJsaWMgU3RhdGljV2ViRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SVN0YXRpY1dlYk1vZHVsZUFydGlmYWN0LmNsYXNzfTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFN0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyVXRpbC5nZXRNb2R1bGVPYmplY3Qob2JqKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTEzZjQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjEsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5XZWJSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFN0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyVXRpbCB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBleHRlbnNpb25zVG9FeGNsdWRlID0gbmV3IFN0cmluZ1tdeyJzcWwiLCAieG1pIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBTdHJpbmcgSjJFRV9OQVRVUkVfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgU3RyaW5nIElORk9fRElSRUNUT1JZID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoT2JqZWN0IG9iaikgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBvYmo7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKChJUHJvamVjdClyZXNvdXJjZSksIG5ldyBQYXRoKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlc291cmNlKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QscHJvamVjdC5nZXROYW1lKCkpOwotCQkvLyBkZXRlcm1pbmUgcGF0aAotCQlJUGF0aCByb290UGF0aCA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCi0JCS8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmVzb3VyY2UgaXMgdW5kZXIgdGhlIHdlYkFwcGxpY2F0aW9uIGRpcmVjdG9yeQotCQlpZiAocmVzb3VyY2VQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhyb290UGF0aCkgIT0gcm9vdFBhdGguc2VnbWVudENvdW50KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBEbyBub3QgYWxsb3cgcmVzb3VyY2UgdW5kZXIgdGhlIHdlYi1pbmYgZGlyZWN0b3J5Ci0JCXJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHJvb3RQYXRoLnNlZ21lbnRDb3VudCgpKTsKLQkJaWYgKHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEgJiYgcmVzb3VyY2VQYXRoLnNlZ21lbnQoMCkuZXF1YWxzKElORk9fRElSRUNUT1JZKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChzaG91bGRFeGNsdWRlKHJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIHJldHVybiBXZWIgcmVzb3VyY2UgdHlwZQotCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShwcm9qZWN0KSwgcmVzb3VyY2VQYXRoKTsKLQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzaG91bGRFeGNsdWRlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkRXhjbHVkZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIGZpbGVFeHQgPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0KLQkJLy8gRXhjbHVkZSBmaWxlcyBvZiBjZXJ0YWluIGV4dGVuc2lvbnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zVG9FeGNsdWRlLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1RvRXhjbHVkZVtpXTsKLQkJCWlmIChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmaWxlRXh0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgcHJvamVjdC5nZXROYW1lKCkpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSU1vZHVsZVtdIG1vZHVsZXMgID0gZ2V0TW9kdWxlcyhjb21wb25lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzW2ldOwotCQkJaWYgKG1vZHVsZS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBtb2R1bGU7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGVJZCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMocHJvamVjdCk7Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL0lMaWJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vSUxpYk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGRmNzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vSUxpYk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0vL1RPRE8gREVMRVRFIGpzaG9sbAotLyoqCi0gKiBAZGVwcmVjYXRlZAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGliTW9kdWxlIHsKLQlTdHJpbmcgZ2V0SmFyTmFtZSgpOwotCi0JU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9JU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL0lTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3ODBjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL0lTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQkvKioKLSAgICAgKiBPcHRpb25hbCwgdHlwZSBTdHJpbmcsIHRoZSB1c2VyIGRlZmluZWQgbmFtZSBvZiB3ZWIgY29udGVudHMgZm9sZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQ09OVEVOVF9GT0xERVIgPSAiSVdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5XRUJDT05URU5UX0ZPTERFUiI7IC8vJE5PTi1OTFMtMSQgIAotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vTGliTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL0xpYk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI3Mzk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vTGliTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuSVNpbXBsZVdlYk1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLldTVFdlYlBsdWdpbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICoKLSAqLwotcHVibGljIGNsYXNzIExpYk1vZHVsZSBpbXBsZW1lbnRzIElMaWJNb2R1bGUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggTElCX1BBVEggPSBuZXcgUGF0aChJU2ltcGxlV2ViTW9kdWxlQ29uc3RhbnRzLklORk9fRElSRUNUT1JZKS5hcHBlbmQoSVNpbXBsZVdlYk1vZHVsZUNvbnN0YW50cy5MSUJSQVJZX0RJUkVDVE9SWSk7Ci0KLQlwcml2YXRlIFN0cmluZyBqYXJOYW1lOwotCXByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotCi0JcHVibGljIExpYk1vZHVsZShTdHJpbmcgamFyTmFtZSwgU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCXRoaXMuamFyTmFtZSA9IGphck5hbWU7Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUxpYk1vZHVsZSNnZXRKYXJOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphck5hbWUoKSB7Ci0JCXJldHVybiBqYXJOYW1lOwotCX0KLQotCS8qCi0JICogQHNlZSBJTGliTW9kdWxlI2dldFByb2plY3ROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElMaWJNb2R1bGUjZ2V0UHJvamVjdCgpCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiAoSVByb2plY3QpIFdTVFdlYlBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwcm9qZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTGliTW9kdWxlI2dldFVSSSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiBJUGF0aC5TRVBBUkFUT1IgKyBMSUJfUEFUSC5hcHBlbmQoZ2V0SmFyTmFtZSgpKS50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBJTGliTW9kdWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlMaWJNb2R1bGUgbW9kdWxlID0gKElMaWJNb2R1bGUpIG9iajsKLQkJcmV0dXJuIGdldEphck5hbWUoKS5lcXVhbHMobW9kdWxlLmdldEphck5hbWUoKSkgJiYgZ2V0UHJvamVjdE5hbWUoKS5lcXVhbHMobW9kdWxlLmdldFByb2plY3ROYW1lKCkpICYmIGdldFVSSSgpLmVxdWFscyhtb2R1bGUuZ2V0VVJJKCkpICYmIGdldFByb2plY3QoKS5lcXVhbHMobW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1NpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhNmIyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1NpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSVNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLSAgICBwdWJsaWMgU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVXZWJNb2R1bGVDcmVhdGlvbk9wZXJhdGlvbihnZXREYXRhTW9kZWwoKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBFQ2xhc3MgZ2V0Q29tcG9uZW50VHlwZSgpIHsKLSAgICAJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRJRCgpIHsKLSAgICAJcmV0dXJuIElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJbnRlZ2VyIGdldERlZmF1bHRDb21wb25lbnRWZXJzaW9uKCkgewotICAgIAkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBvbmVudEV4dGVuc2lvbigpIHsKLSAgICAJcmV0dXJuICIud2FyIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvamVjdENyZWF0aW9uTW9kZWwoKSB7Ci0gICAgCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuYWRkTmVzdGVkTW9kZWwoTkVTVEVEX1BST0pFQ1RfQ1JFQVRJT05fRE0sIGRtKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoTE9DQVRJT04sIGRtLmdldFByb3BlcnR5KElGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9MT0NBVElPTikpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRQcm9wZXJ0aWVzKCkgewotICAgIAkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChXRUJDT05URU5UX0ZPTERFUik7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFdFQkNPTlRFTlRfRk9MREVSKSkKLQkJCXJldHVybiAiV2ViQ29udGVudCI7Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLSAgICAJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgIAlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKQotICAgIAkJc2V0UHJvcGVydHkoQ09NUE9ORU5UX05BTUUscHJvcGVydHlWYWx1ZSk7Ci0gICAgCXJldHVybiByZXN1bHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1NpbXBsZVdlYk1vZHVsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1NpbXBsZVdlYk1vZHVsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWE3NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9TaW1wbGVXZWJNb2R1bGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5Db21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5JU2ltcGxlV2ViTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuV1NUV2ViUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiB7Ci0KLSAgICBwdWJsaWMgU2ltcGxlV2ViTW9kdWxlQ3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLSAgICAgICAgc3VwZXIoZGF0YU1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAJcmV0dXJuIHN1cGVyLmV4ZWN1dGUoSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSxtb25pdG9yLCBpbmZvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRXZWJDb250ZW50Rm9sZGVyUHJlZmVyZW5jZSgpIHsKLSAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQKLSAgICAgICAgU3RyaW5nIHdlYkNvbnRlbnRGb2xkZXIgPSBXU1RXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTVFdlYlByZWZlcmVuY2VzKCkuZ2V0U3RhdGljV2ViQ29udGVudEZvbGRlck5hbWUoKTsKLSAgICAgICAgcmV0dXJuIHdlYkNvbnRlbnRGb2xkZXI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFuZExpbmtKMkVFQ29tcG9uZW50c0Zvck11bHRpcGxlQ29tcG9uZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJY3JlYXRlV2ViU3RydWN0dXJlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFuZExpbmtKMkVFQ29tcG9uZW50c0ZvclNpbmdsZUNvbXBvbmVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJY3JlYXRlV2ViU3RydWN0dXJlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVdlYlN0cnVjdHVyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpLCBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJY29tcG9uZW50LmNyZWF0ZSgwLCBudWxsKTsKLQkJLy8gY3JlYXRlIGFuZCBsaW5rIHdlYkNvbnRlbnQgYW5kIGNzcyBmb2xkZXIKLQkJSVZpcnR1YWxGb2xkZXIgd2ViQ29udGVudCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkICAgICAgIAotCQl3ZWJDb250ZW50LmNyZWF0ZUxpbmsobmV3IFBhdGgoIi8iICsgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSVNpbXBsZVdlYk1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5XRUJDT05URU5UX0ZPTERFUikpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVZpcnR1YWxGb2xkZXIgd2ViQ1NTRm9sZGVyID0gd2ViQ29udGVudC5nZXRGb2xkZXIoSVNpbXBsZVdlYk1vZHVsZUNvbnN0YW50cy5DU1NfRElSRUNUT1JZKTsKLQkJd2ViQ1NTRm9sZGVyLmNyZWF0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCX0KLSAgICAKLSAgICAvLyAgU2hvdWxkIHJldHVybiBudWxsIGlmIG5vIGFkZGl0aW9uYWwgcHJvcGVydGllcyBuZWVkZWQKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgIAkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotfQo=